From 969c63c752ae3560f4ca01bc02cef78ce82cc3fe Mon Sep 17 00:00:00 2001 From: Nikolai R Kristiansen Date: Wed, 5 Jul 2017 01:03:17 +0200 Subject: [PATCH] New style wordpress This enables automagic updates of WP - Delete wordpress install - Move theme(s) to top - Move local plugins to ./plugins - Simplify i18n --- .gitignore | 9 +- .htaccess-sample | 45 - README.md | 56 +- .../themes/dns2015 => dns2015}/404.php | 0 .../app/images/dns-logo-web.png | Bin .../app/images/dns-logo-web_flipped.png | Bin .../app/images/dns_logo_emblem_sort.png | Bin .../app/images/dns_logo_white.png | Bin .../app/images/dns_logo_white_newsletter.png | Bin .../app/images/icons/contact_card.png | Bin .../app/images/icons/crowd.png | Bin .../app/images/icons/facebook.png | Bin .../app/images/icons/facebook.svg | 0 .../app/images/icons/flickr.svg | 0 .../app/images/icons/instagram.svg | 0 .../app/images/icons/location.svg | 0 .../app/images/icons/microphone.png | Bin .../app/images/icons/twitter.svg | 0 .../app/images/piggies.jpg | Bin .../dns2015 => dns2015}/app/scripts/app.js | 0 .../app/styles/_accessibility.scss | 0 .../app/styles/_buttons.scss | 0 .../app/styles/_footer.scss | 0 .../app/styles/_forms.scss | 0 .../app/styles/_frontpage.scss | 0 .../app/styles/_general.scss | 0 .../app/styles/_header.scss | 0 .../dns2015 => dns2015}/app/styles/_menu.scss | 0 .../app/styles/_mixins.scss | 0 .../app/styles/_pages_and_posts.scss | 0 .../dns2015 => dns2015}/app/styles/app.scss | 0 .../dns2015 => dns2015}/audioplayer.php | 0 .../themes/dns2015 => dns2015}/bower.json | 0 .../themes/dns2015 => dns2015}/cal/not_empty | 0 .../dist/images/dns-logo-web.png | Bin .../dist/images/dns-logo-web_flipped.png | Bin .../dist/images/dns_logo_emblem_sort.png | Bin .../dist/images/dns_logo_white.png | Bin .../dist/images/dns_logo_white_newsletter.png | Bin .../dist/images/icons/contact_card.png | Bin .../dist/images/icons/crowd.png | Bin .../dist/images/icons/facebook.png | Bin .../dist/images/icons/facebook.svg | 0 .../dist/images/icons/flickr.svg | 0 .../dist/images/icons/instagram.svg | 0 .../dist/images/icons/location.svg | 0 .../dist/images/icons/microphone.png | Bin .../dist/images/icons/twitter.svg | 0 .../dist/images/piggies.jpg | Bin .../dns2015 => dns2015}/dist/scripts/app.js | 0 .../dist/scripts/vendor.js | 0 .../dns2015 => dns2015}/dist/styles/app.css | 0 .../themes/dns2015 => dns2015}/event-meta.php | 0 favicon.ico => dns2015/favicon.ico | Bin .../themes/dns2015 => dns2015}/favicons.php | 0 .../favicons/browserconfig.xml | 0 .../favicons/favicon-114.png | Bin .../favicons/favicon-120.png | Bin .../favicons/favicon-144.png | Bin .../favicons/favicon-150.png | Bin .../favicons/favicon-152.png | Bin .../favicons/favicon-16.png | Bin .../favicons/favicon-160.png | Bin .../favicons/favicon-180.png | Bin .../favicons/favicon-192.png | Bin .../favicons/favicon-310.png | Bin .../favicons/favicon-32.png | Bin .../favicons/favicon-57.png | Bin .../favicons/favicon-60.png | Bin .../favicons/favicon-64.png | Bin .../favicons/favicon-70.png | Bin .../favicons/favicon-72.png | Bin .../favicons/favicon-76.png | Bin .../favicons/favicon-96.png | Bin .../dns2015 => dns2015}/favicons/favicon.png | Bin .../dns2015 => dns2015}/flickr-facebook.php | 0 .../themes/dns2015 => dns2015}/footer.php | 0 .../dns2015 => dns2015}/fp-articles.php | 0 .../fp-call-to-actions.php | 0 .../themes/dns2015 => dns2015}/fp-events.php | 0 .../dns2015 => dns2015}/fp-featured.php | 0 .../dns2015 => dns2015}/fp-studentmedia.php | 0 .../themes/dns2015 => dns2015}/front-page.php | 0 .../themes/dns2015 => dns2015}/functions.php | 9 +- .../themes/dns2015 => dns2015}/gulpfile.js | 9 + .../dns2015 => dns2015}/header-infoscreen.php | 0 .../themes/dns2015 => dns2015}/header.php | 0 .../inc/iCalcreator.class.php | 0 .../themes/dns2015 => dns2015}/index.php | 0 .../dns2015 => dns2015}/languages/dns2015.pot | 0 .../dns2015 => dns2015}/languages/nb_NO.mo | Bin .../dns2015 => dns2015}/languages/nb_NO.po | 0 .../loop-page-full-width.php | 0 .../themes/dns2015 => dns2015}/loop-page.php | 0 .../loop-post-full-width.php | 0 .../dns2015 => dns2015}/loop-single.php | 0 .../loop-taxonomy-event_type.php | 0 .../themes/dns2015 => dns2015}/loop.php | 0 .../themes/dns2015 => dns2015}/menu.php | 0 .../newsletter-signup-form.php | 0 .../themes/dns2015 => dns2015}/package.json | 0 .../page-templates/page-associations.php | 0 .../page-templates/page-event-next.php | 0 .../page-templates/page-feed-articles.php | 0 .../page-feed-events-upcoming.php | 0 .../page-templates/page-full-width.php | 0 .../page-templates/page-ical.php | 0 .../page-templates/page-image-galleries.php | 0 .../page-info-daily-program.php | 0 .../page-templates/page-live.php | 0 .../page-newsletter-mailchimp.php | 0 .../page-templates/page-program.php | 0 .../themes/dns2015 => dns2015}/page.php | 0 .../dns2015 => dns2015}/program-6days.php | 0 .../themes/dns2015 => dns2015}/screenshot.png | Bin .../scripts/program-ical-regen.php | 0 .../themes/dns2015 => dns2015}/sidebar.php | 0 .../single-association.php | 0 .../dns2015 => dns2015}/single-event.php | 0 .../themes/dns2015 => dns2015}/single.php | 0 .../themes/dns2015 => dns2015}/style.css | 0 .../taxonomy-event_type.php | 0 fabfile.py | 38 + index.php | 18 - .../neuf-old-style => neuf-old-style}/404.php | 0 .../audioplayer.php | 0 .../cal/.gitignore | 0 .../css/grid.css | 0 .../css/lightbox.css | 0 .../css/rebuild.css | 0 .../css/reset.css | 0 .../css/wp.css | 0 .../digest.php | 0 .../eventmeta-single.php | 0 .../eventmeta.php | 0 .../eventslider.php | 0 .../flickr-facebook.php | 0 .../flowplayer-3.2.6.min.js | 0 .../flowplayer-3.2.7.swf | Bin .../flowplayer.controls-3.2.5.swf | Bin .../footer.php | 0 .../front-page.php | 0 .../functions.php | 0 .../header-infoscreen.php | 0 .../header.php | 0 .../home.php | 0 .../iCalcreator.class.php | 0 .../img/ajax-loader.gif | Bin .../img/arrow-down.png | Bin .../img/bannerindex-400.png | Bin .../img/bannerindex-800.png | Bin .../img/bird_twitter.png | Bin .../img/blank.gif | Bin .../img/bullet.gif | Bin .../img/close.gif | Bin .../img/closelabel.gif | Bin .../img/dns-logo-web.png | Bin .../img/dns-logo-web_flipped.png | Bin .../img/dns_logo_emblem_sort.png | Bin .../img/donate-button.gif | Bin .../img/download-icon.gif | Bin .../img/facebook-icon.png | Bin .../img/gradient.png | Bin .../img/ikon_debatt-50x50.png | Bin .../img/ikon_fest-50x50.png | Bin .../img/ikon_film-50x50.png | Bin .../img/ikon_foredrag-50x50.png | Bin .../img/ikon_konsert-50x50.png | Bin .../img/ikon_nyheter-35x35.png | Bin .../img/ikon_nyheter-50x50.png | Bin .../img/ikon_quiz-50x50.png | Bin .../img/ikon_teater-50x50.png | Bin .../img/ikon_tiles-35x35.png | Bin .../img/ikon_tiles-50x50.png | Bin .../img/intern1.jpeg | Bin .../img/listevisning.png | Bin .../img/loading.gif | Bin .../img/logo-rn-x86.png | Bin .../img/logo-rn.png | Bin .../img/logo-svart-hvit.png | Bin .../img/logo-web.png | Bin .../img/logo-web.png.bak | Bin .../img/next.gif | Bin .../img/nextlabel.gif | Bin .../img/oktoberfest-small.png | Bin .../img/orange-fade.png | Bin .../img/pig.png | Bin .../img/piggies.jpg | Bin .../img/prev.gif | Bin .../img/prevlabel.gif | Bin .../img/sirkel.png | Bin .../img/sponsors/akademika.png | Bin .../img/sponsors/logo_black_akademika.png | Bin .../img/sponsors/logo_black_nrf.png | Bin .../img/sponsors/logo_black_uio.png | Bin .../img/sponsors/logo_red_akademika.png | Bin .../img/sponsors/logo_sh86.png | Bin .../img/sponsors/logo_uio86.png | Bin .../img/sponsors/nrf-86x86.png | Bin .../img/svart-200x.gif | Bin .../img/testingtile.png | Bin .../img/tilesvisning.png | Bin .../img/uk.png | Bin .../index.php | 0 .../js/application.js | 0 .../js/front-page.js | 0 .../js/html5shiv.js | 0 .../js/jquery-1.7.1.min.js | 0 .../js/jquery.cycle.all.js | 0 .../js/knockout-2.0.0.js | 0 .../js/knockout-2.3.0.js | 0 .../js/lang/nb.js | 0 .../js/moment.min.js | 0 .../js/neuf/eventProgram.js | 0 .../js/neuf/util/date-nb-NO.js | 0 .../js/neuf/util/util.js | 0 .../js/program.js | 0 .../js/underscore-min.js | 0 .../js/underscore.js | 0 .../kampanje/afm_2011.php | 0 .../kampanje/kroplingen.php | 0 .../kampanje/semesterstart2010.php | 0 .../kampanje/studio_nedtelling.php | 0 .../kampanje/studio_rocky.php | 0 .../kampanje/studio_rocky.png | Bin .../loop-event.php | 0 .../loop-page-full-width.php | 0 .../loop-page.php | 0 .../loop-post-full-width.php | 0 .../loop-single.php | 0 .../loop-taxonomy-event_type.php | 0 .../loop.php | 0 .../menu.php | 0 .../news-feed.php | 0 .../newsletter-signup-form.php | 0 .../page-foreningene.php | 0 .../page-full-width.php | 0 .../page-ical.php | 0 .../page-image-galleries.php | 0 .../page-info-daily-program.php | 0 .../page-info-tweet.php | 0 .../page-live.php | 0 .../page-mailchimp-newsletter.php | 0 .../page-neste-arrangement.php | 0 .../page-newsletter.php | 0 .../page-ninjanewsletter.php | 0 .../page-program.php | 0 .../page-syndikering-kommende-program.php | 0 .../page.php | 0 .../program-3days.php | 0 .../program-6days.php | 0 .../program-ical-regen.php | 0 .../sidebar.php | 0 .../single-event.php | 0 .../single.php | 0 .../studentmedia.php | 0 .../style.css | 0 .../taxonomy-event_type.php | 0 .../languages/neuf_assoc-nb_NO.mo | Bin 0 -> 1265 bytes .../languages/neuf_assoc-nb_NO.po | 78 + .../languages/neuf_assoc.pot | 70 + .../neuf-associations-admin.php | 85 + .../neuf-associations-post-type.php | 76 + .../neuf-associations/neuf-associations.php | 29 + .../neuf-events/LICENSE | 0 .../neuf-events/languages/neuf_event-nb_NO.mo | Bin 0 -> 2653 bytes .../neuf-events/languages/neuf_event-nb_NO.po | 202 + plugins/neuf-events/languages/neuf_event.pot | 158 + plugins/neuf-events/neuf-events-admin.php | 258 + .../neuf-events-json-controller.php | 137 + .../neuf-events/neuf-events-post-types.php | 167 + .../neuf-events/neuf-events-taxonomies.php | 83 + plugins/neuf-events/neuf-events.php | 50 + .../script/jquery-ui-timepicker-addon.js | 2223 ++ .../neuf-events/script/jquery.validate.min.js | 51 + plugins/neuf-events/script/neuf_events.js | 27 + .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 251 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 247 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 374 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 246 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 301 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 301 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 371 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 319 bytes .../style/images/ui-icons_222222_256x240.png | Bin 0 -> 7006 bytes .../style/images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4599 bytes .../style/images/ui-icons_454545_256x240.png | Bin 0 -> 7071 bytes .../style/images/ui-icons_888888_256x240.png | Bin 0 -> 7092 bytes .../style/images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4599 bytes .../style/jquery-ui-timepicker-addon.css | 12 + plugins/neuf-events/style/jquery-ui.min.css | 7 + wp/index.php | 17 - wp/license.txt | 385 - wp/readme.html | 99 - wp/wp-activate.php | 162 - wp/wp-admin/about.php | 288 - wp/wp-admin/admin-ajax.php | 104 - wp/wp-admin/admin-footer.php | 119 - wp/wp-admin/admin-functions.php | 15 - wp/wp-admin/admin-header.php | 266 - wp/wp-admin/admin-post.php | 71 - wp/wp-admin/admin.php | 360 - wp/wp-admin/async-upload.php | 118 - wp/wp-admin/comment.php | 333 - wp/wp-admin/credits.php | 125 - wp/wp-admin/css/about-rtl.css | 498 - wp/wp-admin/css/about-rtl.min.css | 1 - wp/wp-admin/css/about.css | 498 - wp/wp-admin/css/about.min.css | 1 - wp/wp-admin/css/admin-menu-rtl.css | 943 - wp/wp-admin/css/admin-menu-rtl.min.css | 1 - wp/wp-admin/css/admin-menu.css | 943 - wp/wp-admin/css/admin-menu.min.css | 1 - wp/wp-admin/css/color-picker-rtl.css | 136 - wp/wp-admin/css/color-picker-rtl.min.css | 1 - wp/wp-admin/css/color-picker.css | 136 - wp/wp-admin/css/color-picker.min.css | 1 - wp/wp-admin/css/colors/_admin.scss | 498 - wp/wp-admin/css/colors/_mixins.scss | 51 - wp/wp-admin/css/colors/_variables.scss | 58 - wp/wp-admin/css/colors/blue/colors-rtl.css | 510 - .../css/colors/blue/colors-rtl.min.css | 1 - wp/wp-admin/css/colors/blue/colors.css | 510 - wp/wp-admin/css/colors/blue/colors.min.css | 1 - wp/wp-admin/css/colors/blue/colors.scss | 11 - wp/wp-admin/css/colors/coffee/colors-rtl.css | 510 - .../css/colors/coffee/colors-rtl.min.css | 1 - wp/wp-admin/css/colors/coffee/colors.css | 510 - wp/wp-admin/css/colors/coffee/colors.min.css | 1 - wp/wp-admin/css/colors/coffee/colors.scss | 7 - .../css/colors/ectoplasm/colors-rtl.css | 510 - .../css/colors/ectoplasm/colors-rtl.min.css | 1 - wp/wp-admin/css/colors/ectoplasm/colors.css | 510 - .../css/colors/ectoplasm/colors.min.css | 1 - wp/wp-admin/css/colors/ectoplasm/colors.scss | 8 - wp/wp-admin/css/colors/light/colors-rtl.css | 528 - .../css/colors/light/colors-rtl.min.css | 1 - wp/wp-admin/css/colors/light/colors.css | 528 - wp/wp-admin/css/colors/light/colors.min.css | 1 - wp/wp-admin/css/colors/light/colors.scss | 38 - .../css/colors/midnight/colors-rtl.css | 510 - .../css/colors/midnight/colors-rtl.min.css | 1 - wp/wp-admin/css/colors/midnight/colors.css | 510 - .../css/colors/midnight/colors.min.css | 1 - wp/wp-admin/css/colors/midnight/colors.scss | 5 - wp/wp-admin/css/colors/ocean/colors-rtl.css | 510 - .../css/colors/ocean/colors-rtl.min.css | 1 - wp/wp-admin/css/colors/ocean/colors.css | 510 - wp/wp-admin/css/colors/ocean/colors.min.css | 1 - wp/wp-admin/css/colors/ocean/colors.scss | 8 - wp/wp-admin/css/colors/sunrise/colors-rtl.css | 510 - .../css/colors/sunrise/colors-rtl.min.css | 1 - wp/wp-admin/css/colors/sunrise/colors.css | 510 - wp/wp-admin/css/colors/sunrise/colors.min.css | 1 - wp/wp-admin/css/colors/sunrise/colors.scss | 6 - wp/wp-admin/css/common-rtl.css | 3850 ---- wp/wp-admin/css/common-rtl.min.css | 8 - wp/wp-admin/css/common.css | 3850 ---- wp/wp-admin/css/common.min.css | 8 - wp/wp-admin/css/customize-controls-rtl.css | 1979 -- .../css/customize-controls-rtl.min.css | 1 - wp/wp-admin/css/customize-controls.css | 1979 -- wp/wp-admin/css/customize-controls.min.css | 1 - wp/wp-admin/css/customize-nav-menus-rtl.css | 881 - .../css/customize-nav-menus-rtl.min.css | 1 - wp/wp-admin/css/customize-nav-menus.css | 881 - wp/wp-admin/css/customize-nav-menus.min.css | 1 - wp/wp-admin/css/customize-widgets-rtl.css | 456 - wp/wp-admin/css/customize-widgets-rtl.min.css | 1 - wp/wp-admin/css/customize-widgets.css | 456 - wp/wp-admin/css/customize-widgets.min.css | 1 - wp/wp-admin/css/dashboard-rtl.css | 1109 - wp/wp-admin/css/dashboard-rtl.min.css | 1 - wp/wp-admin/css/dashboard.css | 1109 - wp/wp-admin/css/dashboard.min.css | 1 - wp/wp-admin/css/deprecated-media-rtl.css | 418 - wp/wp-admin/css/deprecated-media-rtl.min.css | 1 - wp/wp-admin/css/deprecated-media.css | 418 - wp/wp-admin/css/deprecated-media.min.css | 1 - wp/wp-admin/css/edit-rtl.css | 1592 -- wp/wp-admin/css/edit-rtl.min.css | 1 - wp/wp-admin/css/edit.css | 1592 -- wp/wp-admin/css/edit.min.css | 1 - wp/wp-admin/css/farbtastic-rtl.css | 41 - wp/wp-admin/css/farbtastic-rtl.min.css | 1 - wp/wp-admin/css/farbtastic.css | 41 - wp/wp-admin/css/farbtastic.min.css | 1 - wp/wp-admin/css/forms-rtl.css | 1420 -- wp/wp-admin/css/forms-rtl.min.css | 1 - wp/wp-admin/css/forms.css | 1420 -- wp/wp-admin/css/forms.min.css | 1 - wp/wp-admin/css/ie-rtl.css | 770 - wp/wp-admin/css/ie-rtl.min.css | 1 - wp/wp-admin/css/ie.css | 770 - wp/wp-admin/css/ie.min.css | 1 - wp/wp-admin/css/install-rtl.css | 462 - wp/wp-admin/css/install-rtl.min.css | 1 - wp/wp-admin/css/install.css | 462 - wp/wp-admin/css/install.min.css | 1 - wp/wp-admin/css/l10n-rtl.css | 120 - wp/wp-admin/css/l10n-rtl.min.css | 1 - wp/wp-admin/css/l10n.css | 120 - wp/wp-admin/css/l10n.min.css | 1 - wp/wp-admin/css/list-tables-rtl.css | 2166 -- wp/wp-admin/css/list-tables-rtl.min.css | 1 - wp/wp-admin/css/list-tables.css | 2166 -- wp/wp-admin/css/list-tables.min.css | 1 - wp/wp-admin/css/login-rtl.css | 262 - wp/wp-admin/css/login-rtl.min.css | 1 - wp/wp-admin/css/login.css | 262 - wp/wp-admin/css/login.min.css | 1 - wp/wp-admin/css/media-rtl.css | 1297 -- wp/wp-admin/css/media-rtl.min.css | 1 - wp/wp-admin/css/media.css | 1297 -- wp/wp-admin/css/media.min.css | 1 - wp/wp-admin/css/nav-menus-rtl.css | 919 - wp/wp-admin/css/nav-menus-rtl.min.css | 1 - wp/wp-admin/css/nav-menus.css | 919 - wp/wp-admin/css/nav-menus.min.css | 1 - wp/wp-admin/css/press-this-editor-rtl.css | 122 - wp/wp-admin/css/press-this-editor-rtl.min.css | 1 - wp/wp-admin/css/press-this-editor.css | 122 - wp/wp-admin/css/press-this-editor.min.css | 1 - wp/wp-admin/css/press-this-rtl.css | 2199 -- wp/wp-admin/css/press-this-rtl.min.css | 1 - wp/wp-admin/css/press-this.css | 2199 -- wp/wp-admin/css/press-this.min.css | 1 - wp/wp-admin/css/revisions-rtl.css | 598 - wp/wp-admin/css/revisions-rtl.min.css | 1 - wp/wp-admin/css/revisions.css | 598 - wp/wp-admin/css/revisions.min.css | 1 - wp/wp-admin/css/site-icon-rtl.css | 55 - wp/wp-admin/css/site-icon-rtl.min.css | 1 - wp/wp-admin/css/site-icon.css | 55 - wp/wp-admin/css/site-icon.min.css | 1 - wp/wp-admin/css/themes-rtl.css | 1938 -- wp/wp-admin/css/themes-rtl.min.css | 1 - wp/wp-admin/css/themes.css | 1938 -- wp/wp-admin/css/themes.min.css | 1 - wp/wp-admin/css/widgets-rtl.css | 590 - wp/wp-admin/css/widgets-rtl.min.css | 1 - wp/wp-admin/css/widgets.css | 590 - wp/wp-admin/css/widgets.min.css | 1 - wp/wp-admin/css/wp-admin-rtl.css | 14 - wp/wp-admin/css/wp-admin-rtl.min.css | 14 - wp/wp-admin/css/wp-admin.css | 14 - wp/wp-admin/css/wp-admin.min.css | 14 - wp/wp-admin/custom-background.php | 562 - wp/wp-admin/custom-header.php | 1379 -- wp/wp-admin/customize.php | 212 - wp/wp-admin/edit-comments.php | 326 - wp/wp-admin/edit-form-advanced.php | 757 - wp/wp-admin/edit-form-comment.php | 209 - wp/wp-admin/edit-link-form.php | 150 - wp/wp-admin/edit-tag-form.php | 265 - wp/wp-admin/edit-tags.php | 581 - wp/wp-admin/edit.php | 371 - wp/wp-admin/export.php | 294 - wp/wp-admin/freedoms.php | 53 - wp/wp-admin/images/align-center-2x.png | Bin 147 -> 0 bytes wp/wp-admin/images/align-center.png | Bin 546 -> 0 bytes wp/wp-admin/images/align-left-2x.png | Bin 143 -> 0 bytes wp/wp-admin/images/align-left.png | Bin 554 -> 0 bytes wp/wp-admin/images/align-none-2x.png | Bin 121 -> 0 bytes wp/wp-admin/images/align-none.png | Bin 417 -> 0 bytes wp/wp-admin/images/align-right-2x.png | Bin 142 -> 0 bytes wp/wp-admin/images/align-right.png | Bin 509 -> 0 bytes wp/wp-admin/images/arrows-2x.png | Bin 863 -> 0 bytes wp/wp-admin/images/arrows.png | Bin 243 -> 0 bytes wp/wp-admin/images/browser-rtl.png | Bin 40170 -> 0 bytes wp/wp-admin/images/browser.png | Bin 40626 -> 0 bytes wp/wp-admin/images/bubble_bg-2x.gif | Bin 507 -> 0 bytes wp/wp-admin/images/bubble_bg.gif | Bin 398 -> 0 bytes wp/wp-admin/images/comment-grey-bubble-2x.png | Bin 258 -> 0 bytes wp/wp-admin/images/comment-grey-bubble.png | Bin 114 -> 0 bytes wp/wp-admin/images/date-button-2x.gif | Bin 996 -> 0 bytes wp/wp-admin/images/date-button.gif | Bin 400 -> 0 bytes wp/wp-admin/images/generic.png | Bin 719 -> 0 bytes wp/wp-admin/images/icons32-2x.png | Bin 21770 -> 0 bytes wp/wp-admin/images/icons32-vs-2x.png | Bin 21396 -> 0 bytes wp/wp-admin/images/icons32-vs.png | Bin 8007 -> 0 bytes wp/wp-admin/images/icons32.png | Bin 8023 -> 0 bytes wp/wp-admin/images/imgedit-icons-2x.png | Bin 7664 -> 0 bytes wp/wp-admin/images/imgedit-icons.png | Bin 4055 -> 0 bytes wp/wp-admin/images/list-2x.png | Bin 1523 -> 0 bytes wp/wp-admin/images/list.png | Bin 1003 -> 0 bytes wp/wp-admin/images/loading.gif | Bin 2254 -> 0 bytes wp/wp-admin/images/marker.png | Bin 360 -> 0 bytes wp/wp-admin/images/mask.png | Bin 2001 -> 0 bytes wp/wp-admin/images/media-button-2x.png | Bin 850 -> 0 bytes wp/wp-admin/images/media-button-image.gif | Bin 200 -> 0 bytes wp/wp-admin/images/media-button-music.gif | Bin 206 -> 0 bytes wp/wp-admin/images/media-button-other.gif | Bin 248 -> 0 bytes wp/wp-admin/images/media-button-video.gif | Bin 133 -> 0 bytes wp/wp-admin/images/media-button.png | Bin 323 -> 0 bytes wp/wp-admin/images/menu-2x.png | Bin 12672 -> 0 bytes wp/wp-admin/images/menu-vs-2x.png | Bin 12453 -> 0 bytes wp/wp-admin/images/menu-vs.png | Bin 5086 -> 0 bytes wp/wp-admin/images/menu.png | Bin 5039 -> 0 bytes wp/wp-admin/images/no.png | Bin 755 -> 0 bytes wp/wp-admin/images/post-formats-vs.png | Bin 2450 -> 0 bytes wp/wp-admin/images/post-formats.png | Bin 2157 -> 0 bytes wp/wp-admin/images/post-formats32-vs.png | Bin 5111 -> 0 bytes wp/wp-admin/images/post-formats32.png | Bin 5142 -> 0 bytes wp/wp-admin/images/resize-2x.gif | Bin 234 -> 0 bytes wp/wp-admin/images/resize-rtl-2x.gif | Bin 233 -> 0 bytes wp/wp-admin/images/resize-rtl.gif | Bin 149 -> 0 bytes wp/wp-admin/images/resize.gif | Bin 70 -> 0 bytes wp/wp-admin/images/se.png | Bin 120 -> 0 bytes wp/wp-admin/images/sort-2x.gif | Bin 97 -> 0 bytes wp/wp-admin/images/sort.gif | Bin 55 -> 0 bytes wp/wp-admin/images/spinner-2x.gif | Bin 8536 -> 0 bytes wp/wp-admin/images/spinner.gif | Bin 4162 -> 0 bytes wp/wp-admin/images/stars-2x.png | Bin 1257 -> 0 bytes wp/wp-admin/images/stars.png | Bin 924 -> 0 bytes wp/wp-admin/images/w-logo-blue.png | Bin 3113 -> 0 bytes wp/wp-admin/images/w-logo-white.png | Bin 5395 -> 0 bytes wp/wp-admin/images/wheel.png | Bin 6047 -> 0 bytes wp/wp-admin/images/wordpress-logo-white.svg | 1 - wp/wp-admin/images/wordpress-logo.png | Bin 2480 -> 0 bytes wp/wp-admin/images/wordpress-logo.svg | 1 - wp/wp-admin/images/wpspin_light-2x.gif | Bin 9133 -> 0 bytes wp/wp-admin/images/wpspin_light.gif | Bin 2209 -> 0 bytes wp/wp-admin/images/xit-2x.gif | Bin 825 -> 0 bytes wp/wp-admin/images/xit.gif | Bin 181 -> 0 bytes wp/wp-admin/images/yes.png | Bin 539 -> 0 bytes wp/wp-admin/import.php | 206 - wp/wp-admin/includes/admin-filters.php | 121 - wp/wp-admin/includes/admin.php | 87 - wp/wp-admin/includes/ajax-actions.php | 3903 ---- wp/wp-admin/includes/bookmark.php | 316 - .../class-automatic-upgrader-skin.php | 115 - .../class-bulk-plugin-upgrader-skin.php | 68 - .../class-bulk-theme-upgrader-skin.php | 68 - .../includes/class-bulk-upgrader-skin.php | 175 - wp/wp-admin/includes/class-core-upgrader.php | 365 - .../includes/class-file-upload-upgrader.php | 129 - wp/wp-admin/includes/class-ftp-pure.php | 186 - wp/wp-admin/includes/class-ftp-sockets.php | 246 - wp/wp-admin/includes/class-ftp.php | 912 - .../class-language-pack-upgrader-skin.php | 87 - .../includes/class-language-pack-upgrader.php | 377 - wp/wp-admin/includes/class-pclzip.php | 5692 ----- .../includes/class-plugin-installer-skin.php | 97 - .../includes/class-plugin-upgrader-skin.php | 71 - .../includes/class-plugin-upgrader.php | 468 - .../includes/class-theme-installer-skin.php | 98 - .../includes/class-theme-upgrader-skin.php | 83 - wp/wp-admin/includes/class-theme-upgrader.php | 604 - .../class-walker-category-checklist.php | 125 - .../class-walker-nav-menu-checklist.php | 117 - .../includes/class-walker-nav-menu-edit.php | 241 - .../includes/class-wp-ajax-upgrader-skin.php | 132 - .../includes/class-wp-automatic-updater.php | 923 - .../includes/class-wp-comments-list-table.php | 793 - .../includes/class-wp-filesystem-base.php | 845 - .../includes/class-wp-filesystem-direct.php | 517 - .../includes/class-wp-filesystem-ftpext.php | 610 - .../class-wp-filesystem-ftpsockets.php | 544 - .../includes/class-wp-filesystem-ssh2.php | 631 - wp/wp-admin/includes/class-wp-importer.php | 321 - .../includes/class-wp-internal-pointers.php | 166 - .../includes/class-wp-links-list-table.php | 333 - .../includes/class-wp-list-table-compat.php | 53 - wp/wp-admin/includes/class-wp-list-table.php | 1377 -- .../includes/class-wp-media-list-table.php | 782 - .../includes/class-wp-ms-sites-list-table.php | 565 - .../class-wp-ms-themes-list-table.php | 732 - .../includes/class-wp-ms-users-list-table.php | 460 - .../class-wp-plugin-install-list-table.php | 596 - .../includes/class-wp-plugins-list-table.php | 879 - .../class-wp-post-comments-list-table.php | 77 - .../includes/class-wp-posts-list-table.php | 1757 -- wp/wp-admin/includes/class-wp-press-this.php | 1560 -- wp/wp-admin/includes/class-wp-screen.php | 1255 -- wp/wp-admin/includes/class-wp-site-icon.php | 242 - .../includes/class-wp-terms-list-table.php | 635 - .../class-wp-theme-install-list-table.php | 475 - .../includes/class-wp-themes-list-table.php | 309 - .../includes/class-wp-upgrader-skin.php | 211 - .../includes/class-wp-upgrader-skins.php | 43 - wp/wp-admin/includes/class-wp-upgrader.php | 907 - .../includes/class-wp-users-list-table.php | 562 - wp/wp-admin/includes/comment.php | 196 - wp/wp-admin/includes/continents-cities.php | 549 - wp/wp-admin/includes/credits.php | 67 - wp/wp-admin/includes/dashboard.php | 1507 -- wp/wp-admin/includes/deprecated.php | 1398 -- wp/wp-admin/includes/edit-tag-messages.php | 58 - wp/wp-admin/includes/export.php | 621 - wp/wp-admin/includes/file.php | 1296 -- wp/wp-admin/includes/image-edit.php | 910 - wp/wp-admin/includes/image.php | 698 - wp/wp-admin/includes/import.php | 212 - wp/wp-admin/includes/list-table.php | 84 - wp/wp-admin/includes/media.php | 3181 --- wp/wp-admin/includes/menu.php | 345 - wp/wp-admin/includes/meta-boxes.php | 1236 -- wp/wp-admin/includes/misc.php | 938 - wp/wp-admin/includes/ms-admin-filters.php | 43 - wp/wp-admin/includes/ms-deprecated.php | 105 - wp/wp-admin/includes/ms.php | 1130 - wp/wp-admin/includes/nav-menu.php | 1134 - wp/wp-admin/includes/network.php | 597 - wp/wp-admin/includes/noop.php | 106 - wp/wp-admin/includes/options.php | 141 - wp/wp-admin/includes/plugin-install.php | 713 - wp/wp-admin/includes/plugin.php | 1883 -- wp/wp-admin/includes/post.php | 1856 -- wp/wp-admin/includes/revision.php | 403 - wp/wp-admin/includes/schema.php | 1108 - wp/wp-admin/includes/screen.php | 233 - wp/wp-admin/includes/taxonomy.php | 290 - wp/wp-admin/includes/template.php | 2127 -- wp/wp-admin/includes/theme-install.php | 212 - wp/wp-admin/includes/theme.php | 686 - wp/wp-admin/includes/translation-install.php | 264 - wp/wp-admin/includes/update-core.php | 1319 -- wp/wp-admin/includes/update.php | 764 - wp/wp-admin/includes/upgrade.php | 2934 --- wp/wp-admin/includes/user.php | 539 - wp/wp-admin/includes/widgets.php | 281 - wp/wp-admin/index.php | 141 - wp/wp-admin/install-helper.php | 200 - wp/wp-admin/install.php | 415 - wp/wp-admin/js/accordion.js | 93 - wp/wp-admin/js/accordion.min.js | 1 - wp/wp-admin/js/bookmarklet.js | 156 - wp/wp-admin/js/bookmarklet.min.js | 1 - wp/wp-admin/js/color-picker.js | 189 - wp/wp-admin/js/color-picker.min.js | 1 - wp/wp-admin/js/comment.js | 63 - wp/wp-admin/js/comment.min.js | 1 - wp/wp-admin/js/common.js | 1010 - wp/wp-admin/js/common.min.js | 1 - wp/wp-admin/js/custom-background.js | 83 - wp/wp-admin/js/custom-background.min.js | 1 - wp/wp-admin/js/custom-header.js | 61 - wp/wp-admin/js/customize-controls.js | 5502 ----- wp/wp-admin/js/customize-controls.min.js | 3 - wp/wp-admin/js/customize-nav-menus.js | 3127 --- wp/wp-admin/js/customize-nav-menus.min.js | 2 - wp/wp-admin/js/customize-widgets.js | 2281 -- wp/wp-admin/js/customize-widgets.min.js | 1 - wp/wp-admin/js/dashboard.js | 189 - wp/wp-admin/js/dashboard.min.js | 1 - wp/wp-admin/js/edit-comments.js | 963 - wp/wp-admin/js/edit-comments.min.js | 1 - wp/wp-admin/js/editor-expand.js | 1207 -- wp/wp-admin/js/editor-expand.min.js | 1 - wp/wp-admin/js/editor.js | 391 - wp/wp-admin/js/editor.min.js | 1 - wp/wp-admin/js/farbtastic.js | 276 - wp/wp-admin/js/gallery.js | 237 - wp/wp-admin/js/gallery.min.js | 1 - wp/wp-admin/js/image-edit.js | 701 - wp/wp-admin/js/image-edit.min.js | 1 - wp/wp-admin/js/inline-edit-post.js | 383 - wp/wp-admin/js/inline-edit-post.min.js | 1 - wp/wp-admin/js/inline-edit-tax.js | 287 - wp/wp-admin/js/inline-edit-tax.min.js | 1 - wp/wp-admin/js/iris.min.js | 4 - wp/wp-admin/js/language-chooser.js | 26 - wp/wp-admin/js/language-chooser.min.js | 1 - wp/wp-admin/js/link.js | 69 - wp/wp-admin/js/link.min.js | 1 - wp/wp-admin/js/media-gallery.js | 39 - wp/wp-admin/js/media-gallery.min.js | 1 - wp/wp-admin/js/media-upload.js | 69 - wp/wp-admin/js/media-upload.min.js | 1 - wp/wp-admin/js/media.js | 120 - wp/wp-admin/js/media.min.js | 1 - wp/wp-admin/js/nav-menu.js | 1276 -- wp/wp-admin/js/nav-menu.min.js | 1 - wp/wp-admin/js/password-strength-meter.js | 80 - wp/wp-admin/js/password-strength-meter.min.js | 1 - wp/wp-admin/js/plugin-install.js | 203 - wp/wp-admin/js/plugin-install.min.js | 1 - wp/wp-admin/js/post.js | 1267 -- wp/wp-admin/js/post.min.js | 1 - wp/wp-admin/js/postbox.js | 443 - wp/wp-admin/js/postbox.min.js | 1 - wp/wp-admin/js/press-this.js | 932 - wp/wp-admin/js/press-this.min.js | 1 - wp/wp-admin/js/revisions.js | 1166 -- wp/wp-admin/js/revisions.min.js | 1 - wp/wp-admin/js/set-post-thumbnail.js | 24 - wp/wp-admin/js/set-post-thumbnail.min.js | 1 - wp/wp-admin/js/svg-painter.js | 240 - wp/wp-admin/js/svg-painter.min.js | 1 - wp/wp-admin/js/tags-box.js | 263 - wp/wp-admin/js/tags-box.min.js | 1 - wp/wp-admin/js/tags-suggest.js | 185 - wp/wp-admin/js/tags-suggest.min.js | 1 - wp/wp-admin/js/tags.js | 72 - wp/wp-admin/js/tags.min.js | 1 - wp/wp-admin/js/theme.js | 1980 -- wp/wp-admin/js/theme.min.js | 1 - wp/wp-admin/js/updates.js | 2417 --- wp/wp-admin/js/updates.min.js | 2 - wp/wp-admin/js/user-profile.js | 455 - wp/wp-admin/js/user-profile.min.js | 1 - wp/wp-admin/js/user-suggest.js | 30 - wp/wp-admin/js/user-suggest.min.js | 1 - wp/wp-admin/js/widgets.js | 595 - wp/wp-admin/js/widgets.min.js | 1 - wp/wp-admin/js/word-count.js | 220 - wp/wp-admin/js/word-count.min.js | 1 - wp/wp-admin/js/wp-fullscreen-stub.js | 39 - wp/wp-admin/js/wp-fullscreen-stub.min.js | 1 - wp/wp-admin/js/xfn.js | 17 - wp/wp-admin/js/xfn.min.js | 1 - wp/wp-admin/link-add.php | 29 - wp/wp-admin/link-manager.php | 112 - wp/wp-admin/link-parse-opml.php | 95 - wp/wp-admin/link.php | 117 - wp/wp-admin/load-scripts.php | 73 - wp/wp-admin/load-styles.php | 95 - wp/wp-admin/maint/repair.php | 171 - wp/wp-admin/media-new.php | 84 - wp/wp-admin/media-upload.php | 112 - wp/wp-admin/media.php | 146 - wp/wp-admin/menu-header.php | 266 - wp/wp-admin/menu.php | 282 - wp/wp-admin/moderation.php | 12 - wp/wp-admin/ms-admin.php | 13 - wp/wp-admin/ms-delete-site.php | 107 - wp/wp-admin/ms-edit.php | 13 - wp/wp-admin/ms-options.php | 12 - wp/wp-admin/ms-sites.php | 13 - wp/wp-admin/ms-themes.php | 13 - wp/wp-admin/ms-upgrade-network.php | 13 - wp/wp-admin/ms-users.php | 13 - wp/wp-admin/my-sites.php | 135 - wp/wp-admin/nav-menus.php | 853 - wp/wp-admin/network.php | 118 - wp/wp-admin/network/about.php | 13 - wp/wp-admin/network/admin.php | 34 - wp/wp-admin/network/credits.php | 13 - wp/wp-admin/network/edit.php | 39 - wp/wp-admin/network/freedoms.php | 13 - wp/wp-admin/network/index.php | 76 - wp/wp-admin/network/menu.php | 62 - wp/wp-admin/network/plugin-editor.php | 13 - wp/wp-admin/network/plugin-install.php | 16 - wp/wp-admin/network/plugins.php | 13 - wp/wp-admin/network/profile.php | 13 - wp/wp-admin/network/settings.php | 403 - wp/wp-admin/network/setup.php | 13 - wp/wp-admin/network/site-info.php | 211 - wp/wp-admin/network/site-new.php | 264 - wp/wp-admin/network/site-settings.php | 171 - wp/wp-admin/network/site-themes.php | 217 - wp/wp-admin/network/site-users.php | 341 - wp/wp-admin/network/sites.php | 316 - wp/wp-admin/network/theme-editor.php | 13 - wp/wp-admin/network/theme-install.php | 16 - wp/wp-admin/network/themes.php | 316 - wp/wp-admin/network/update-core.php | 13 - wp/wp-admin/network/update.php | 16 - wp/wp-admin/network/upgrade.php | 143 - wp/wp-admin/network/user-edit.php | 13 - wp/wp-admin/network/user-new.php | 134 - wp/wp-admin/network/users.php | 241 - wp/wp-admin/options-discussion.php | 280 - wp/wp-admin/options-general.php | 373 - wp/wp-admin/options-head.php | 18 - wp/wp-admin/options-media.php | 143 - wp/wp-admin/options-permalink.php | 268 - wp/wp-admin/options-reading.php | 151 - wp/wp-admin/options-writing.php | 188 - wp/wp-admin/options.php | 306 - wp/wp-admin/plugin-editor.php | 306 - wp/wp-admin/plugin-install.php | 167 - wp/wp-admin/plugins.php | 553 - wp/wp-admin/post-new.php | 86 - wp/wp-admin/post.php | 292 - wp/wp-admin/press-this.php | 24 - wp/wp-admin/profile.php | 18 - wp/wp-admin/revision.php | 136 - wp/wp-admin/setup-config.php | 412 - wp/wp-admin/term.php | 68 - wp/wp-admin/theme-editor.php | 298 - wp/wp-admin/theme-install.php | 347 - wp/wp-admin/themes.php | 501 - wp/wp-admin/tools.php | 119 - wp/wp-admin/update-core.php | 765 - wp/wp-admin/update.php | 289 - wp/wp-admin/upgrade-functions.php | 12 - wp/wp-admin/upgrade.php | 127 - wp/wp-admin/upload.php | 327 - wp/wp-admin/user-edit.php | 693 - wp/wp-admin/user-new.php | 507 - wp/wp-admin/user/about.php | 13 - wp/wp-admin/user/admin.php | 32 - wp/wp-admin/user/credits.php | 13 - wp/wp-admin/user/freedoms.php | 13 - wp/wp-admin/user/index.php | 13 - wp/wp-admin/user/menu.php | 22 - wp/wp-admin/user/profile.php | 13 - wp/wp-admin/user/user-edit.php | 13 - wp/wp-admin/users.php | 526 - wp/wp-admin/widgets.php | 518 - wp/wp-blog-header.php | 21 - wp/wp-comments-post.php | 60 - wp/wp-config-sample.php | 89 - wp/wp-content/index.php | 2 - wp/wp-content/languages/admin-nb_NO.mo | Bin 343397 -> 0 bytes wp/wp-content/languages/admin-nb_NO.po | 10933 ---------- .../languages/admin-network-nb_NO.mo | Bin 48042 -> 0 bytes .../languages/admin-network-nb_NO.po | 1389 -- .../languages/continents-cities-nb_NO.mo | Bin 20353 -> 0 bytes .../languages/continents-cities-nb_NO.po | 2097 -- wp/wp-content/languages/ms-nb_NO.mo | Bin 81928 -> 0 bytes wp/wp-content/languages/ms-nb_NO.po | 2208 -- wp/wp-content/languages/nb_NO.mo | Bin 208231 -> 0 bytes wp/wp-content/languages/nb_NO.php | 3 - wp/wp-content/languages/nb_NO.po | 10618 ---------- .../languages/plugins/akismet-nb_NO.mo | Bin 18152 -> 0 bytes .../languages/plugins/akismet-nb_NO.po | 616 - .../languages/plugins/wordpress-seo-nb_NO.mo | Bin 107945 -> 0 bytes .../languages/plugins/wordpress-seo-nb_NO.po | 3393 --- .../languages/themes/twentyeleven-nb_NO.mo | Bin 15692 -> 0 bytes .../languages/themes/twentyeleven-nb_NO.po | 569 - .../languages/themes/twentyfifteen-nb_NO.mo | Bin 5975 -> 0 bytes .../languages/themes/twentyfifteen-nb_NO.po | 305 - .../languages/themes/twentyfourteen-nb_NO.mo | Bin 10025 -> 0 bytes .../languages/themes/twentyfourteen-nb_NO.po | 446 - .../languages/themes/twentyseventeen-nb_NO.mo | Bin 6887 -> 0 bytes .../languages/themes/twentyseventeen-nb_NO.po | 328 - .../languages/themes/twentysixteen-nb_NO.mo | Bin 6408 -> 0 bytes .../languages/themes/twentysixteen-nb_NO.po | 330 - .../languages/themes/twentyten-nb_NO.mo | Bin 8821 -> 0 bytes .../languages/themes/twentyten-nb_NO.po | 365 - .../languages/themes/twentythirteen-nb_NO.mo | Bin 6708 -> 0 bytes .../languages/themes/twentythirteen-nb_NO.po | 319 - .../languages/themes/twentytwelve-nb_NO.mo | Bin 7231 -> 0 bytes .../languages/themes/twentytwelve-nb_NO.po | 326 - wp/wp-content/object-cache.php | 1160 -- .../plugins/debug-bar/css/debug-bar.css | 1 - .../plugins/debug-bar/css/debug-bar.dev.css | 492 - wp/wp-content/plugins/debug-bar/debug-bar.php | 326 - .../plugins/debug-bar/js/debug-bar-js.dev.js | 67 - .../plugins/debug-bar/js/debug-bar-js.js | 1 - .../plugins/debug-bar/js/debug-bar.dev.js | 123 - .../plugins/debug-bar/js/debug-bar.js | 1 - .../plugins/debug-bar/js/ui-dockable.dev.js | 56 - .../plugins/debug-bar/js/ui-dockable.js | 1 - .../panels/class-debug-bar-deprecated.php | 139 - .../debug-bar/panels/class-debug-bar-js.php | 23 - .../panels/class-debug-bar-object-cache.php | 25 - .../panels/class-debug-bar-panel.php | 61 - .../debug-bar/panels/class-debug-bar-php.php | 111 - .../panels/class-debug-bar-queries.php | 93 - .../panels/class-debug-bar-request.php | 55 - .../panels/class-debug-bar-wp-query.php | 113 - wp/wp-content/plugins/debug-bar/readme.txt | 162 - .../disable-comments/disable-comments.php | 456 - .../includes/comments-template.php | 4 - .../includes/settings-page.php | 114 - .../disable-comments/includes/tools-page.php | 122 - .../languages/disable-comments-de_DE.mo | Bin 5471 -> 0 bytes .../languages/disable-comments-de_DE.po | 103 - .../languages/disable-comments-es_ES.mo | Bin 5986 -> 0 bytes .../languages/disable-comments-es_ES.po | 110 - .../languages/disable-comments-fa_ir.mo | Bin 7949 -> 0 bytes .../languages/disable-comments-fa_ir.po | 200 - .../languages/disable-comments-fr_FR.mo | Bin 6764 -> 0 bytes .../languages/disable-comments-fr_FR.po | 210 - .../languages/disable-comments-id_ID.mo | Bin 5589 -> 0 bytes .../languages/disable-comments-id_ID.po | 171 - .../languages/disable-comments-pl_PL.mo | Bin 6702 -> 0 bytes .../languages/disable-comments-pl_PL.po | 203 - .../languages/disable-comments-pt_BR.mo | Bin 6692 -> 0 bytes .../languages/disable-comments-pt_BR.po | 208 - .../languages/disable-comments-ru_RU.mo | Bin 7148 -> 0 bytes .../languages/disable-comments-ru_RU.po | 178 - .../languages/disable-comments-vi.mo | Bin 6241 -> 0 bytes .../languages/disable-comments-vi.po | 172 - .../languages/disable-comments-vi_VI.mo | Bin 6241 -> 0 bytes .../languages/disable-comments-vi_VI.po | 172 - .../languages/disable-comments-zh_TW.mo | Bin 5950 -> 0 bytes .../languages/disable-comments-zh_TW.po | 188 - .../languages/disable-comments.pot | 171 - .../plugins/disable-comments/readme.txt | 193 - .../plugins/disable-comments/uninstall.php | 5 - .../compat/duplicate-post-jetpack.php | 30 - .../compat/duplicate-post-wpml.php | 31 - .../plugins/duplicate-post/donate.png | Bin 3207 -> 0 bytes .../duplicate-post/duplicate-post-admin.php | 722 - .../duplicate-post/duplicate-post-common.php | 152 - .../duplicate-post/duplicate-post-options.php | 395 - .../plugins/duplicate-post/duplicate-post.css | 32 - .../plugins/duplicate-post/duplicate-post.php | 57 - .../plugins/duplicate-post/readme.txt | 294 - wp/wp-content/plugins/index.php | 3 - .../plugins/json-api/controllers/core.php | 339 - .../plugins/json-api/controllers/posts.php | 85 - .../plugins/json-api/controllers/respond.php | 27 - .../plugins/json-api/controllers/widgets.php | 108 - wp/wp-content/plugins/json-api/json-api.php | 83 - .../plugins/json-api/library/JSON.php | 933 - .../plugins/json-api/models/attachment.php | 52 - .../plugins/json-api/models/author.php | 62 - .../plugins/json-api/models/category.php | 29 - .../plugins/json-api/models/comment.php | 80 - .../plugins/json-api/models/post.php | 319 - wp/wp-content/plugins/json-api/models/tag.php | 26 - wp/wp-content/plugins/json-api/readme.txt | 1235 -- .../plugins/json-api/screenshot-1.png | Bin 23452 -> 0 bytes .../plugins/json-api/singletons/api.php | 394 - .../json-api/singletons/introspector.php | 345 - .../plugins/json-api/singletons/query.php | 194 - .../plugins/json-api/singletons/response.php | 206 - .../tests/core.get_author_index-01.phpt | 21 - .../tests/core.get_author_posts-01.phpt | 22 - .../tests/core.get_author_posts-02.phpt | 22 - .../tests/core.get_author_posts-03.phpt | 22 - .../tests/core.get_category_index-01.phpt | 21 - .../tests/core.get_category_posts-01.phpt | 21 - .../tests/core.get_date_index-01.phpt | 80 - .../tests/core.get_date_posts-01.phpt | 21 - .../tests/core.get_date_posts-02.phpt | 21 - .../tests/core.get_date_posts-03.phpt | 21 - .../json-api/tests/core.get_page-01.phpt | 19 - .../json-api/tests/core.get_page-02.phpt | 25 - .../json-api/tests/core.get_post-01.phpt | 18 - .../json-api/tests/core.get_posts-01.phpt | 21 - .../json-api/tests/core.get_posts-02.phpt | 24 - .../json-api/tests/core.get_posts-03.phpt | 23 - .../tests/core.get_recent_posts-01.phpt | 21 - .../tests/core.get_recent_posts-02.phpt | 21 - .../tests/core.get_recent_posts-03.phpt | 21 - .../tests/core.get_search_posts-01.phpt | 21 - .../json-api/tests/core.get_tag_index-01.phpt | 803 - .../json-api/tests/core.get_tag_posts-01.phpt | 21 - .../plugins/json-api/tests/core.info-01.phpt | 29 - .../plugins/json-api/tests/core.info-02.phpt | 57 - .../plugins/json-api/tests/query-01.phpt | 21 - wp/wp-content/plugins/neuf-associations | 1 - wp/wp-content/plugins/neuf-events | 1 - .../neuf-lightbox/css/black/colorbox.css | 36 - .../neuf-lightbox/css/black/images/close.png | Bin 602 -> 0 bytes .../css/black/images/loading.gif | Bin 2767 -> 0 bytes .../css/black/images/nextblack.png | Bin 1030 -> 0 bytes .../css/black/images/prevblack.png | Bin 1080 -> 0 bytes .../neuf-lightbox/css/blue/colorbox.css | 36 - .../neuf-lightbox/css/blue/images/close.png | Bin 602 -> 0 bytes .../neuf-lightbox/css/blue/images/loading.gif | Bin 2767 -> 0 bytes .../css/blue/images/nextblue.png | Bin 1133 -> 0 bytes .../css/blue/images/prevblue.png | Bin 1167 -> 0 bytes .../neuf-lightbox/css/dark/colorbox.css | 36 - .../css/dark/images/controls.png | Bin 1633 -> 0 bytes .../neuf-lightbox/css/dark/images/loading.gif | Bin 9427 -> 0 bytes .../neuf-lightbox/css/elegant/colorbox-ie.php | 23 - .../neuf-lightbox/css/elegant/colorbox.css | 82 - .../css/elegant/images/border.png | Bin 112 -> 0 bytes .../css/elegant/images/controls.png | Bin 1249 -> 0 bytes .../elegant/images/ie6/borderBottomCenter.png | Bin 111 -> 0 bytes .../elegant/images/ie6/borderBottomLeft.png | Bin 215 -> 0 bytes .../elegant/images/ie6/borderBottomRight.png | Bin 217 -> 0 bytes .../elegant/images/ie6/borderMiddleLeft.png | Bin 108 -> 0 bytes .../elegant/images/ie6/borderMiddleRight.png | Bin 108 -> 0 bytes .../elegant/images/ie6/borderTopCenter.png | Bin 111 -> 0 bytes .../css/elegant/images/ie6/borderTopLeft.png | Bin 216 -> 0 bytes .../css/elegant/images/ie6/borderTopRight.png | Bin 214 -> 0 bytes .../internet_explorer/borderBottomCenter.png | Bin 111 -> 0 bytes .../internet_explorer/borderBottomLeft.png | Bin 215 -> 0 bytes .../internet_explorer/borderBottomRight.png | Bin 217 -> 0 bytes .../internet_explorer/borderMiddleLeft.png | Bin 108 -> 0 bytes .../internet_explorer/borderMiddleRight.png | Bin 108 -> 0 bytes .../internet_explorer/borderTopCenter.png | Bin 111 -> 0 bytes .../internet_explorer/borderTopLeft.png | Bin 216 -> 0 bytes .../internet_explorer/borderTopRight.png | Bin 214 -> 0 bytes .../css/elegant/images/loading.gif | Bin 9427 -> 0 bytes .../css/elegant/images/loading_background.png | Bin 157 -> 0 bytes .../css/elegant/images/overlay.png | Bin 182 -> 0 bytes .../neuf-lightbox/css/framed/colorbox.css | 49 - .../css/framed/images/border.png | Bin 163 -> 0 bytes .../css/framed/images/controls.png | Bin 2033 -> 0 bytes .../css/framed/images/loading.gif | Bin 9427 -> 0 bytes .../css/framed/images/loading_background.png | Bin 166 -> 0 bytes .../neuf-lightbox/css/green/colorbox.css | 36 - .../neuf-lightbox/css/green/images/close.png | Bin 602 -> 0 bytes .../css/green/images/loading.gif | Bin 2767 -> 0 bytes .../css/green/images/nextgreen.png | Bin 1139 -> 0 bytes .../css/green/images/prevgreen.png | Bin 1182 -> 0 bytes .../neuf-lightbox/css/grey/colorbox.css | 36 - .../neuf-lightbox/css/grey/images/close.png | Bin 602 -> 0 bytes .../neuf-lightbox/css/grey/images/loading.gif | Bin 2767 -> 0 bytes .../css/grey/images/nextgrey.png | Bin 985 -> 0 bytes .../css/grey/images/prevgrey.png | Bin 1003 -> 0 bytes .../css/lightweight/colorbox.css | 41 - .../css/lightweight/images/controls.png | Bin 570 -> 0 bytes .../css/lightweight/images/loading.gif | Bin 9427 -> 0 bytes .../neuf-lightbox/css/purple/colorbox.css | 36 - .../neuf-lightbox/css/purple/images/close.png | Bin 602 -> 0 bytes .../css/purple/images/loading.gif | Bin 2767 -> 0 bytes .../css/purple/images/nextpurple.png | Bin 1132 -> 0 bytes .../css/purple/images/prevpurple.png | Bin 1183 -> 0 bytes .../neuf-lightbox/css/red/colorbox.css | 36 - .../neuf-lightbox/css/red/images/close.png | Bin 602 -> 0 bytes .../neuf-lightbox/css/red/images/loading.gif | Bin 2767 -> 0 bytes .../neuf-lightbox/css/red/images/nextred.png | Bin 1087 -> 0 bytes .../neuf-lightbox/css/red/images/prevred.png | Bin 1134 -> 0 bytes .../css/shadowed/colorbox-ie.php | 25 - .../neuf-lightbox/css/shadowed/colorbox.css | 78 - .../css/shadowed/images/border1.png | Bin 1057 -> 0 bytes .../css/shadowed/images/border2.png | Bin 170 -> 0 bytes .../images/ie6/borderBottomCenter.png | Bin 153 -> 0 bytes .../shadowed/images/ie6/borderBottomLeft.png | Bin 473 -> 0 bytes .../shadowed/images/ie6/borderBottomRight.png | Bin 470 -> 0 bytes .../shadowed/images/ie6/borderMiddleLeft.png | Bin 148 -> 0 bytes .../shadowed/images/ie6/borderMiddleRight.png | Bin 139 -> 0 bytes .../shadowed/images/ie6/borderTopCenter.png | Bin 153 -> 0 bytes .../css/shadowed/images/ie6/borderTopLeft.png | Bin 359 -> 0 bytes .../shadowed/images/ie6/borderTopRight.png | Bin 465 -> 0 bytes .../internet_explorer/borderBottomCenter.png | Bin 153 -> 0 bytes .../internet_explorer/borderBottomLeft.png | Bin 473 -> 0 bytes .../internet_explorer/borderBottomRight.png | Bin 470 -> 0 bytes .../internet_explorer/borderMiddleLeft.png | Bin 154 -> 0 bytes .../internet_explorer/borderMiddleRight.png | Bin 148 -> 0 bytes .../internet_explorer/borderTopCenter.png | Bin 143 -> 0 bytes .../internet_explorer/borderTopLeft.png | Bin 405 -> 0 bytes .../internet_explorer/borderTopRight.png | Bin 465 -> 0 bytes .../css/shadowed/images/loading.gif | Bin 9427 -> 0 bytes .../neuf-lightbox/css/teal/colorbox.css | 36 - .../neuf-lightbox/css/teal/images/close.png | Bin 602 -> 0 bytes .../neuf-lightbox/css/teal/images/loading.gif | Bin 2767 -> 0 bytes .../css/teal/images/nextteal.png | Bin 1145 -> 0 bytes .../css/teal/images/prevteal.png | Bin 1181 -> 0 bytes .../neuf-lightbox/css/white/colorbox.css | 36 - .../neuf-lightbox/css/white/images/close.png | Bin 602 -> 0 bytes .../css/white/images/loading.gif | Bin 2767 -> 0 bytes .../css/white/images/nextwhite.png | Bin 1030 -> 0 bytes .../css/white/images/prevwhite.png | Bin 1079 -> 0 bytes .../neuf-lightbox/css/yellow/colorbox.css | 36 - .../neuf-lightbox/css/yellow/images/close.png | Bin 602 -> 0 bytes .../css/yellow/images/loading.gif | Bin 2767 -> 0 bytes .../css/yellow/images/nextyellow.png | Bin 1082 -> 0 bytes .../css/yellow/images/prevyellow.png | Bin 1141 -> 0 bytes .../neuf-lightbox/js/gallery-colorbox.js | 8 - .../neuf-lightbox/js/jquery.colorbox-min.js | 4 - .../plugins/neuf-lightbox/neuf-lightbox.php | 141 - .../neuf-lostpassword/neuf-lostpassword.php | 21 - .../redis-cache/includes/admin-page.css | 36 - .../redis-cache/includes/admin-page.php | 70 - .../redis-cache/includes/diagnostics.php | 59 - .../redis-cache/includes/object-cache.php | 1160 -- .../plugins/redis-cache/includes/predis.php | 17359 ---------------- .../redis-cache/includes/servers-list.php | 123 - .../redis-cache/includes/wp-cli-commands.php | 149 - .../redis-cache/languages/redis-cache.pot | 227 - wp/wp-content/plugins/redis-cache/readme.txt | 316 - .../plugins/redis-cache/redis-cache.php | 393 - .../plugins/redis-cache/uninstall.php | 19 - .../jquery.ui.progressbar.min.1.7.2.js | 13 - .../jquery-ui/jquery.ui.progressbar.min.js | 16 - .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 180 -> 0 bytes .../images/ui-bg_flat_55_fbec88_40x100.png | Bin 213 -> 0 bytes .../images/ui-bg_glass_75_d0e5f5_1x400.png | Bin 124 -> 0 bytes .../images/ui-bg_glass_85_dfeffc_1x400.png | Bin 123 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 119 -> 0 bytes .../ui-bg_gloss-wave_55_5c9ccc_500x100.png | Bin 3457 -> 0 bytes .../ui-bg_inset-hard_100_f5f8f9_1x100.png | Bin 130 -> 0 bytes .../ui-bg_inset-hard_100_fcfdfd_1x100.png | Bin 112 -> 0 bytes .../redmond/jquery-ui-1.7.2.custom.css | 406 - .../plugins/regenerate-thumbnails/readme.txt | 126 - .../regenerate-thumbnails.php | 405 - .../regenerate-thumbnails/screenshot-1.png | Bin 83994 -> 0 bytes .../regenerate-thumbnails/screenshot-2.png | Bin 26775 -> 0 bytes .../regenerate-thumbnails/screenshot-3.png | Bin 50192 -> 0 bytes .../css/images/animated-overlay.gif | Bin 1738 -> 0 bytes .../css/images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 212 -> 0 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 208 -> 0 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 335 -> 0 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 207 -> 0 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 332 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 280 -> 0 bytes .../css/images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../css/images/ui-icons_2e83ff_256x240.png | Bin 4549 -> 0 bytes .../css/images/ui-icons_454545_256x240.png | Bin 6992 -> 0 bytes .../css/images/ui-icons_888888_256x240.png | Bin 6999 -> 0 bytes .../css/images/ui-icons_cd0a0a_256x240.png | Bin 4549 -> 0 bytes .../plugins/user-role-editor/css/index.php | 2 - .../css/jquery-ui-1.10.4.custom.css | 1178 -- .../css/jquery-ui-1.10.4.custom.min.css | 7 - .../user-role-editor/css/multiple-select.css | 163 - .../user-role-editor/css/multiple-select.png | Bin 3342 -> 0 bytes .../user-role-editor/css/ure-admin.css | 285 - .../images/admin-menu-editor-pro.jpg | Bin 89948 -> 0 bytes .../user-role-editor/images/ajax-loader.gif | Bin 673 -> 0 bytes .../images/changelog-icon.png | Bin 494 -> 0 bytes .../user-role-editor/images/donate-icon.png | Bin 3190 -> 0 bytes .../user-role-editor/images/faq-icon.png | Bin 847 -> 0 bytes .../plugins/user-role-editor/images/help.png | Bin 786 -> 0 bytes .../plugins/user-role-editor/images/index.php | 3 - .../user-role-editor/images/remove-16.png | Bin 483 -> 0 bytes .../images/user-role-editor-icon.png | Bin 867 -> 0 bytes .../images/user-role-editor-page-icon.png | Bin 2503 -> 0 bytes .../images/user-role-editor-pro-728x90.jpg | Bin 59700 -> 0 bytes .../user-role-editor/images/vladimir.png | Bin 767 -> 0 bytes .../includes/classes/advertisement.php | 78 - .../includes/classes/ajax-processor.php | 145 - .../includes/classes/assign-role.php | 93 - .../includes/classes/base-lib.php | 301 - .../includes/classes/bbpress.php | 77 - .../classes/capabilities-groups-manager.php | 368 - .../includes/classes/capability.php | 194 - .../includes/classes/grant-roles.php | 167 - .../known-js-css-compatibility-issues.php | 89 - .../includes/classes/own-capabilities.php | 163 - .../includes/classes/protect-admin.php | 188 - .../classes/role-additional-options.php | 152 - .../includes/classes/role-view.php | 435 - .../includes/classes/screen-help.php | 122 - .../includes/classes/task-queue.php | 150 - .../includes/classes/ure-lib.php | 2212 -- .../includes/classes/user-other-roles.php | 318 - .../includes/classes/user-role-editor.php | 936 - .../includes/classes/user-view.php | 207 - .../includes/classes/view.php | 301 - .../classes/woocommerce-capabilities.php | 124 - .../includes/define-constants.php | 14 - .../user-role-editor/includes/index.php | 2 - .../user-role-editor/includes/loader.php | 31 - .../includes/misc-support-stuff.php | 54 - .../includes/settings-template.php | 223 - .../plugins/user-role-editor/index.php | 2 - .../plugins/user-role-editor/js/index.php | 2 - .../js/jquery.multiple.select.js | 332 - .../plugins/user-role-editor/js/ure-js.js | 724 - .../js/ure-user-profile-other-roles.js | 49 - .../plugins/user-role-editor/js/ure-users.js | 104 - .../user-role-editor/js/users-grant-roles.js | 100 - .../plugins/user-role-editor/lang/index.php | 2 - .../lang/user-role-editor.pot | 984 - .../plugins/user-role-editor/license.txt | 375 - .../plugins/user-role-editor/readme.txt | 181 - .../plugins/user-role-editor/screenshot-1.png | Bin 49845 -> 0 bytes .../plugins/user-role-editor/screenshot-2.png | Bin 31691 -> 0 bytes .../plugins/user-role-editor/screenshot-3.png | Bin 35982 -> 0 bytes .../plugins/user-role-editor/screenshot-4.png | Bin 36915 -> 0 bytes .../plugins/user-role-editor/screenshot-5.png | Bin 16994 -> 0 bytes .../plugins/user-role-editor/screenshot-6.png | Bin 24970 -> 0 bytes .../plugins/user-role-editor/uninstall.php | 41 - .../user-role-editor/user-role-editor.php | 50 - .../plugins/wordpress-seo/admin/ajax.php | 454 - .../ajax/class-recalculate-scores-ajax.php | 119 - .../admin/ajax/class-shortcode-filter.php | 39 - .../ajax/class-yoast-dismissable-notice.php | 69 - .../admin/ajax/class-yoast-onpage-ajax.php | 38 - .../ajax/class-yoast-plugin-conflict-ajax.php | 105 - .../banner/class-admin-banner-renderer.php | 48 - .../class-admin-banner-sidebar-renderer.php | 60 - .../banner/class-admin-banner-sidebar.php | 389 - .../class-admin-banner-spot-renderer.php | 37 - .../admin/banner/class-admin-banner-spot.php | 118 - .../admin/banner/class-admin-banner.php | 87 - .../admin/class-admin-asset-manager.php | 372 - .../admin/class-admin-help-panel.php | 91 - .../wordpress-seo/admin/class-admin-init.php | 550 - .../admin/class-admin-user-profile.php | 90 - .../wordpress-seo/admin/class-admin.php | 888 - .../wordpress-seo/admin/class-asset.php | 223 - ...ass-bulk-description-editor-list-table.php | 76 - .../admin/class-bulk-editor-list-table.php | 981 - .../class-bulk-title-editor-list-table.php | 86 - .../wordpress-seo/admin/class-config.php | 439 - .../admin/class-cornerstone-field.php | 49 - .../admin/class-cornerstone-filter.php | 130 - .../wordpress-seo/admin/class-cornerstone.php | 30 - .../wordpress-seo/admin/class-customizer.php | 255 - .../wordpress-seo/admin/class-export.php | 277 - .../admin/class-help-center-item.php | 94 - .../wordpress-seo/admin/class-help-center.php | 231 - .../admin/class-import-aioseo.php | 103 - .../admin/class-import-external.php | 108 - .../admin/class-import-woothemes-seo.php | 146 - .../admin/class-import-wpseo.php | 183 - .../wordpress-seo/admin/class-import.php | 196 - .../admin/class-meta-columns.php | 500 - .../wordpress-seo/admin/class-option-tab.php | 80 - .../admin/class-option-tabs-formatter.php | 53 - .../wordpress-seo/admin/class-option-tabs.php | 106 - .../admin/class-plugin-availability.php | 241 - .../admin/class-plugin-compatibility.php | 101 - .../admin/class-plugin-conflict.php | 164 - .../admin/class-premium-popup.php | 89 - .../admin/class-primary-term-admin.php | 226 - .../admin/class-product-upsell-notice.php | 201 - .../admin/class-recalculate-scores.php | 52 - .../admin/class-social-admin.php | 243 - .../admin/class-social-facebook.php | 480 - .../wordpress-seo/admin/class-stop-words.php | 52 - .../admin/class-yoast-alerts.php | 258 - .../admin/class-yoast-dashboard-widget.php | 204 - .../wordpress-seo/admin/class-yoast-form.php | 546 - .../admin/class-yoast-notification-center.php | 570 - .../admin/class-yoast-notification.php | 303 - .../admin/class-yoast-plugin-conflict.php | 333 - .../class-configuration-components.php | 71 - .../class-configuration-endpoint.php | 78 - .../class-configuration-options-adapter.php | 194 - .../config-ui/class-configuration-page.php | 271 - .../config-ui/class-configuration-service.php | 143 - .../config-ui/class-configuration-storage.php | 196 - .../class-configuration-structure.php | 93 - .../class-component-configuration-choices.php | 96 - ...omponent-connect-google-search-console.php | 149 - .../class-component-mailchimp-signup.php | 79 - .../class-component-suggestions.php | 106 - .../components/interface-component.php | 33 - .../factories/class-factory-post-type.php | 66 - .../fields/class-field-choice-post-type.php | 92 - .../config-ui/fields/class-field-choice.php | 40 - .../fields/class-field-company-logo.php | 28 - .../fields/class-field-company-name.php | 28 - .../fields/class-field-company-or-person.php | 29 - .../class-field-configuration-choices.php | 41 - ...ss-field-connect-google-search-console.php | 28 - .../fields/class-field-environment.php | 95 - .../fields/class-field-mailchimp-signup.php | 58 - .../fields/class-field-multiple-authors.php | 81 - .../fields/class-field-person-name.php | 28 - .../class-field-post-type-visibility.php | 23 - .../class-field-profile-url-facebook.php | 29 - .../class-field-profile-url-googleplus.php | 29 - .../class-field-profile-url-instagram.php | 29 - .../class-field-profile-url-linkedin.php | 29 - .../class-field-profile-url-myspace.php | 29 - .../class-field-profile-url-pinterest.php | 29 - .../class-field-profile-url-twitter.php | 28 - .../class-field-profile-url-youtube.php | 29 - .../fields/class-field-separator.php | 43 - .../fields/class-field-site-name.php | 67 - .../fields/class-field-site-type.php | 36 - .../class-field-social-profiles-intro.php | 23 - .../fields/class-field-success-message.php | 35 - .../fields/class-field-suggestions.php | 42 - ...ass-field-upsell-configuration-service.php | 43 - .../fields/class-field-upsell-site-review.php | 36 - .../admin/config-ui/fields/class-field.php | 134 - .../formatter/class-metabox-formatter.php | 117 - .../class-post-metabox-formatter.php | 181 - .../class-term-metabox-formatter.php | 143 - .../formatter/interface-metabox-formatter.php | 18 - .../google_search_console/class-gsc-ajax.php | 108 - .../class-gsc-bulk-action.php | 92 - .../class-gsc-category-filters.php | 192 - .../class-gsc-config.php | 22 - .../google_search_console/class-gsc-count.php | 221 - .../google_search_console/class-gsc-issue.php | 89 - .../class-gsc-issues.php | 175 - .../class-gsc-mapper.php | 112 - .../class-gsc-marker.php | 143 - .../google_search_console/class-gsc-modal.php | 56 - .../class-gsc-platform-tabs.php | 94 - .../class-gsc-service.php | 192 - .../class-gsc-settings.php | 102 - .../google_search_console/class-gsc-table.php | 364 - .../admin/google_search_console/class-gsc.php | 311 - .../views/gsc-display.php | 135 - .../views/gsc-redirect-nopremium.php | 18 - .../import/class-import-aioseo-hooks.php | 40 - .../admin/import/class-import-hooks.php | 89 - .../admin/import/class-import-wpseo-hooks.php | 40 - .../plugins/wordpress-seo/admin/index.php | 4 - .../metabox/class-metabox-add-keyword-tab.php | 64 - .../metabox/class-metabox-addon-section.php | 37 - .../class-metabox-analysis-readability.php | 39 - .../metabox/class-metabox-analysis-seo.php | 39 - .../admin/metabox/class-metabox-editor.php | 64 - .../admin/metabox/class-metabox-form-tab.php | 115 - .../metabox/class-metabox-tab-section.php | 140 - .../admin/metabox/class-metabox.php | 1689 -- .../metabox/interface-metabox-analysis.php | 31 - .../metabox/interface-metabox-section.php | 20 - .../admin/metabox/interface-metabox-tab.php | 24 - .../admin/onpage/class-onpage-option.php | 128 - .../admin/onpage/class-onpage-request.php | 78 - .../admin/onpage/class-onpage.php | 230 - .../wordpress-seo/admin/pages/advanced.php | 61 - .../wordpress-seo/admin/pages/dashboard.php | 72 - .../wordpress-seo/admin/pages/licenses.php | 241 - .../wordpress-seo/admin/pages/metas.php | 68 - .../wordpress-seo/admin/pages/network.php | 150 - .../wordpress-seo/admin/pages/social.php | 23 - .../wordpress-seo/admin/pages/tools.php | 88 - .../admin/pages/xml-sitemaps.php | 52 - .../recalculate/class-recalculate-posts.php | 149 - .../recalculate/class-recalculate-terms.php | 149 - .../admin/recalculate/class-recalculate.php | 107 - .../admin/taxonomy/class-taxonomy-columns.php | 249 - .../class-taxonomy-content-fields.php | 76 - .../class-taxonomy-fields-presenter.php | 228 - .../admin/taxonomy/class-taxonomy-fields.php | 91 - .../admin/taxonomy/class-taxonomy-metabox.php | 410 - .../class-taxonomy-settings-fields.php | 121 - .../taxonomy/class-taxonomy-social-fields.php | 140 - .../admin/taxonomy/class-taxonomy.php | 392 - .../wordpress-seo/admin/views/about.php | 231 - .../admin/views/class-yoast-form-fieldset.php | 168 - .../admin/views/class-yoast-input-select.php | 128 - .../admin/views/dashboard-widget.php | 105 - .../admin/views/form/fieldset.php | 24 - .../wordpress-seo/admin/views/form/select.php | 24 - .../views/interface-yoast-form-element.php | 17 - .../admin/views/js-templates-primary-term.php | 47 - .../admin/views/partial-alerts-errors.php | 19 - .../admin/views/partial-alerts-template.php | 60 - .../admin/views/partial-alerts-warnings.php | 19 - .../admin/views/partial-help-center-video.php | 52 - .../views/partial-settings-tab-video.php | 28 - .../admin/views/tabs/advanced/breadcrumbs.php | 92 - .../admin/views/tabs/advanced/permalinks.php | 59 - .../admin/views/tabs/advanced/rss.php | 55 - .../admin/views/tabs/dashboard/dashboard.php | 24 - .../admin/views/tabs/dashboard/features.php | 87 - .../admin/views/tabs/dashboard/general.php | 63 - .../views/tabs/dashboard/knowledge-graph.php | 50 - .../admin/views/tabs/dashboard/security.php | 22 - .../views/tabs/dashboard/site-analysis.php | 17 - .../views/tabs/dashboard/webmaster-tools.php | 17 - .../admin/views/tabs/metas/archives.php | 69 - .../admin/views/tabs/metas/general.php | 22 - .../admin/views/tabs/metas/home.php | 32 - .../admin/views/tabs/metas/other.php | 23 - .../admin/views/tabs/metas/post-types.php | 80 - .../admin/views/tabs/metas/taxonomies.php | 57 - .../views/tabs/sitemaps/exclude-post.php | 16 - .../admin/views/tabs/sitemaps/general.php | 38 - .../admin/views/tabs/sitemaps/post-types.php | 40 - .../admin/views/tabs/sitemaps/taxonomies.php | 41 - .../views/tabs/sitemaps/user-sitemap.php | 41 - .../admin/views/tabs/social/accounts.php | 27 - .../admin/views/tabs/social/facebook.php | 54 - .../admin/views/tabs/social/google.php | 18 - .../admin/views/tabs/social/pinterest.php | 23 - .../admin/views/tabs/social/twitterbox.php | 24 - .../admin/views/tabs/tool/import-seo.php | 39 - .../admin/views/tabs/tool/wpseo-export.php | 26 - .../admin/views/tabs/tool/wpseo-import.php | 26 - .../admin/views/tool-bulk-editor.php | 81 - .../admin/views/tool-file-editor.php | 150 - .../admin/views/tool-import-export.php | 135 - .../admin/views/user-profile.php | 53 - .../css/admin-global-471.min.css | 1 - .../wordpress-seo/css/adminbar-471.min.css | 1 - .../wordpress-seo/css/alerts-471.min.css | 1 - .../wordpress-seo/css/dashboard-471.min.css | 1 - .../css/dist/admin-global-471-rtl.min.css | 1 - .../css/dist/adminbar-471-rtl.min.css | 1 - .../css/dist/alerts-471-rtl.min.css | 1 - .../css/dist/dashboard-471-rtl.min.css | 1 - .../css/dist/edit-page-471-rtl.min.css | 1 - .../css/dist/featured-image-471-rtl.min.css | 1 - .../css/dist/help-center-471-rtl.min.css | 1 - .../css/dist/inside-editor-471-rtl.min.css | 1 - .../css/dist/kb-search-471-rtl.min.css | 1 - .../css/dist/metabox-471-rtl.min.css | 1 - .../metabox-primary-category-471-rtl.min.css | 1 - .../css/dist/select2/select2.min.css | 1 - .../css/dist/snippet-471-rtl.min.css | 1 - .../css/dist/toggle-switch-471-rtl.min.css | 1 - .../dist/wpseo-dismissible-471-rtl.min.css | 1 - .../css/dist/yoast-components-471-rtl.min.css | 1 - .../css/dist/yoast-extensions-471-rtl.min.css | 1 - .../css/dist/yst_plugin_tools-471-rtl.min.css | 1 - .../css/dist/yst_seo_score-471-rtl.min.css | 1 - .../wordpress-seo/css/edit-page-471.min.css | 1 - .../css/featured-image-471.min.css | 1 - .../wordpress-seo/css/help-center-471.min.css | 1 - .../css/inside-editor-471.min.css | 1 - .../wordpress-seo/css/kb-search-471.min.css | 1 - .../wordpress-seo/css/metabox-471.min.css | 1 - .../css/metabox-primary-category-471.min.css | 1 - .../wordpress-seo/css/snippet-471.min.css | 1 - .../css/toggle-switch-471.min.css | 1 - .../css/wpseo-dismissible-471.min.css | 1 - .../wordpress-seo/css/xml-sitemap-xsl.php | 173 - .../css/yoast-components-471.min.css | 1 - .../css/yoast-extensions-471.min.css | 1 - .../css/yst_plugin_tools-471.min.css | 1 - .../css/yst_seo_score-471.min.css | 1 - .../deprecated/class-googleplus.php | 75 - .../class-onpage-email-presenter.php | 43 - .../deprecated/class-onpage-notifier.php | 45 - .../deprecated/class-snippet-preview.php | 163 - .../deprecated/class-yoast-textstatistics.php | 198 - .../frontend/class-breadcrumbs.php | 893 - .../wordpress-seo/frontend/class-frontend.php | 1955 -- .../wordpress-seo/frontend/class-json-ld.php | 270 - .../frontend/class-opengraph.php | 1086 - .../frontend/class-primary-category.php | 69 - .../wordpress-seo/frontend/class-twitter.php | 645 - .../plugins/wordpress-seo/frontend/index.php | 4 - .../wordpress-seo/images/Yoast_SEO_Icon.svg | 1 - .../images/banner/basic-seo-training.png | Bin 83980 -> 0 bytes .../images/banner/configuration-service.png | Bin 79768 -> 0 bytes .../banner/keyword-research-training.png | Bin 80318 -> 0 bytes .../banner/local-seo-for-woocommerce.png | Bin 82027 -> 0 bytes .../wordpress-seo/images/banner/local-seo.png | Bin 76899 -> 0 bytes .../wordpress-seo/images/banner/news-seo.png | Bin 67961 -> 0 bytes .../images/banner/premium-seo.png | Bin 90228 -> 0 bytes .../wordpress-seo/images/banner/seo-care.png | Bin 77201 -> 0 bytes .../banner/seo-copywriting-training.png | Bin 86293 -> 0 bytes .../images/banner/site-structure-training.png | Bin 84877 -> 0 bytes .../images/banner/technical-seo-training.png | Bin 88366 -> 0 bytes .../wordpress-seo/images/banner/video-seo.png | Bin 73543 -> 0 bytes .../images/banner/website-review.png | Bin 70525 -> 0 bytes .../images/banner/woocommerce-seo.png | Bin 94032 -> 0 bytes .../yoast-seo-for-wordpress-training.png | Bin 82117 -> 0 bytes .../plugins/wordpress-seo/images/editicon.png | Bin 509 -> 0 bytes .../wordpress-seo/images/extensions-local.png | Bin 3543 -> 0 bytes .../wordpress-seo/images/extensions-news.png | Bin 3353 -> 0 bytes .../images/extensions-premium-ribbon.png | Bin 12733 -> 0 bytes .../wordpress-seo/images/extensions-video.png | Bin 3541 -> 0 bytes .../wordpress-seo/images/extensions-woo.png | Bin 5573 -> 0 bytes .../plugins/wordpress-seo/images/index.php | 4 - .../images/newsletter-collage.png | Bin 98967 -> 0 bytes .../wordpress-seo/images/pinterest-23x30.png | Bin 1020 -> 0 bytes .../wordpress-seo/images/question-mark.png | Bin 299 -> 0 bytes .../plugins/wordpress-seo/images/waiting.gif | Bin 3197 -> 0 bytes .../images/yoast-configuration-icon.svg | 1 - .../wordpress-seo/inc/class-rewrite.php | 162 - .../wordpress-seo/inc/class-upgrade.php | 282 - .../inc/class-wpseo-advanced-settings.php | 64 - .../inc/class-wpseo-features.php | 29 - .../inc/class-wpseo-installation.php | 45 - .../wordpress-seo/inc/class-wpseo-meta.php | 1083 - .../inc/class-wpseo-primary-term.php | 74 - .../wordpress-seo/inc/class-wpseo-rank.php | 192 - .../inc/class-wpseo-replace-vars.php | 1226 -- .../inc/class-wpseo-shortlinker.php | 59 - .../inc/class-wpseo-statistics.php | 142 - .../wordpress-seo/inc/class-wpseo-utils.php | 1070 - .../plugins/wordpress-seo/inc/index.php | 4 - .../class-wpseo-option-internallinks.php | 363 - .../inc/options/class-wpseo-option-ms.php | 220 - .../options/class-wpseo-option-permalinks.php | 131 - .../inc/options/class-wpseo-option-rss.php | 70 - .../inc/options/class-wpseo-option-social.php | 319 - .../inc/options/class-wpseo-option-titles.php | 612 - .../inc/options/class-wpseo-option-wpseo.php | 247 - .../inc/options/class-wpseo-option-xml.php | 260 - .../inc/options/class-wpseo-option.php | 853 - .../inc/options/class-wpseo-options.php | 478 - .../inc/options/class-wpseo-taxonomy-meta.php | 600 - .../class-author-sitemap-provider.php | 305 - .../class-post-type-sitemap-provider.php | 632 - .../inc/sitemaps/class-sitemap-cache-data.php | 129 - .../sitemaps/class-sitemap-image-parser.php | 428 - .../inc/sitemaps/class-sitemap-timezone.php | 116 - .../inc/sitemaps/class-sitemaps-admin.php | 191 - .../class-sitemaps-cache-validator.php | 304 - .../inc/sitemaps/class-sitemaps-cache.php | 320 - .../inc/sitemaps/class-sitemaps-renderer.php | 322 - .../inc/sitemaps/class-sitemaps-router.php | 98 - .../inc/sitemaps/class-sitemaps.php | 569 - .../class-taxonomy-sitemap-provider.php | 289 - .../sitemaps/interface-sitemap-cache-data.php | 56 - .../sitemaps/interface-sitemap-provider.php | 39 - .../inc/wpseo-functions-deprecated.php | 414 - .../wordpress-seo/inc/wpseo-functions.php | 294 - .../inc/wpseo-non-ajax-functions.php | 546 - wp/wp-content/plugins/wordpress-seo/index.php | 4 - .../js/dist/configuration-wizard-471.min.js | 50 - .../js/dist/jquery.tablesorter.min.js | 3 - .../wordpress-seo/js/dist/select2/i18n/ar.js | 3 - .../wordpress-seo/js/dist/select2/i18n/az.js | 3 - .../wordpress-seo/js/dist/select2/i18n/bg.js | 3 - .../wordpress-seo/js/dist/select2/i18n/ca.js | 3 - .../wordpress-seo/js/dist/select2/i18n/cs.js | 3 - .../wordpress-seo/js/dist/select2/i18n/da.js | 3 - .../wordpress-seo/js/dist/select2/i18n/de.js | 3 - .../wordpress-seo/js/dist/select2/i18n/el.js | 3 - .../wordpress-seo/js/dist/select2/i18n/en.js | 3 - .../wordpress-seo/js/dist/select2/i18n/es.js | 3 - .../wordpress-seo/js/dist/select2/i18n/et.js | 3 - .../wordpress-seo/js/dist/select2/i18n/eu.js | 3 - .../wordpress-seo/js/dist/select2/i18n/fa.js | 3 - .../wordpress-seo/js/dist/select2/i18n/fi.js | 3 - .../wordpress-seo/js/dist/select2/i18n/fr.js | 3 - .../wordpress-seo/js/dist/select2/i18n/gl.js | 3 - .../wordpress-seo/js/dist/select2/i18n/he.js | 3 - .../wordpress-seo/js/dist/select2/i18n/hi.js | 3 - .../wordpress-seo/js/dist/select2/i18n/hr.js | 3 - .../wordpress-seo/js/dist/select2/i18n/hu.js | 3 - .../wordpress-seo/js/dist/select2/i18n/id.js | 3 - .../wordpress-seo/js/dist/select2/i18n/is.js | 3 - .../wordpress-seo/js/dist/select2/i18n/it.js | 3 - .../wordpress-seo/js/dist/select2/i18n/ja.js | 3 - .../wordpress-seo/js/dist/select2/i18n/km.js | 3 - .../wordpress-seo/js/dist/select2/i18n/ko.js | 3 - .../wordpress-seo/js/dist/select2/i18n/lt.js | 3 - .../wordpress-seo/js/dist/select2/i18n/lv.js | 3 - .../wordpress-seo/js/dist/select2/i18n/mk.js | 3 - .../wordpress-seo/js/dist/select2/i18n/ms.js | 3 - .../wordpress-seo/js/dist/select2/i18n/nb.js | 3 - .../wordpress-seo/js/dist/select2/i18n/nl.js | 3 - .../wordpress-seo/js/dist/select2/i18n/pl.js | 3 - .../js/dist/select2/i18n/pt-BR.js | 3 - .../wordpress-seo/js/dist/select2/i18n/pt.js | 3 - .../wordpress-seo/js/dist/select2/i18n/ro.js | 3 - .../wordpress-seo/js/dist/select2/i18n/ru.js | 3 - .../wordpress-seo/js/dist/select2/i18n/sk.js | 3 - .../js/dist/select2/i18n/sr-Cyrl.js | 3 - .../wordpress-seo/js/dist/select2/i18n/sr.js | 3 - .../wordpress-seo/js/dist/select2/i18n/sv.js | 3 - .../wordpress-seo/js/dist/select2/i18n/th.js | 3 - .../wordpress-seo/js/dist/select2/i18n/tr.js | 3 - .../wordpress-seo/js/dist/select2/i18n/uk.js | 3 - .../wordpress-seo/js/dist/select2/i18n/vi.js | 3 - .../js/dist/select2/i18n/zh-CN.js | 3 - .../js/dist/select2/i18n/zh-TW.js | 3 - .../js/dist/select2/select2.full.min.js | 3 - .../js/dist/select2/select2.min.js | 3 - .../js/dist/wp-seo-admin-471.min.js | 32 - .../js/dist/wp-seo-admin-global-471.min.js | 1 - .../js/dist/wp-seo-admin-gsc-471.min.js | 1 - .../js/dist/wp-seo-admin-media-471.min.js | 1 - .../js/dist/wp-seo-bulk-editor-471.min.js | 1 - .../js/dist/wp-seo-dismissible-471.min.js | 1 - .../js/dist/wp-seo-featured-image-471.min.js | 1 - .../js/dist/wp-seo-metabox-471.min.js | 32 - .../dist/wp-seo-metabox-category-471.min.js | 1 - .../js/dist/wp-seo-post-scraper-471.min.js | 38 - .../js/dist/wp-seo-recalculate-471.min.js | 21 - .../dist/wp-seo-replacevar-plugin-471.min.js | 2 - .../dist/wp-seo-shortcode-plugin-471.min.js | 1 - .../js/dist/wp-seo-term-scraper-471.min.js | 38 - .../plugins/wordpress-seo/languages/index.php | 4 - .../languages/wordpress-seo-bg_BG.json | 1 - .../languages/wordpress-seo-ca.json | 1 - .../languages/wordpress-seo-cs_CZ.json | 1 - .../languages/wordpress-seo-cy.json | 1 - .../languages/wordpress-seo-da_DK.json | 1 - .../languages/wordpress-seo-de_DE.json | 1 - .../languages/wordpress-seo-en_AU.json | 1 - .../languages/wordpress-seo-en_CA.json | 1 - .../languages/wordpress-seo-en_GB.json | 1 - .../languages/wordpress-seo-en_NZ.json | 1 - .../languages/wordpress-seo-es_CL.json | 1 - .../languages/wordpress-seo-es_ES.json | 1 - .../languages/wordpress-seo-es_MX.json | 1 - .../languages/wordpress-seo-es_VE.json | 1 - .../languages/wordpress-seo-eu.json | 1 - .../languages/wordpress-seo-fa_IR.json | 1 - .../languages/wordpress-seo-fi.json | 1 - .../languages/wordpress-seo-fr_FR.json | 1 - .../languages/wordpress-seo-he_IL.json | 1 - .../languages/wordpress-seo-hr.json | 1 - .../languages/wordpress-seo-hu_HU.json | 1 - .../languages/wordpress-seo-id_ID.json | 1 - .../languages/wordpress-seo-it_IT.json | 1 - .../languages/wordpress-seo-ja.json | 1 - .../languages/wordpress-seo-nb_NO.json | 1 - .../languages/wordpress-seo-nl_NL.json | 1 - .../languages/wordpress-seo-pl_PL.json | 1 - .../languages/wordpress-seo-pt_BR.json | 1 - .../languages/wordpress-seo-pt_PT.json | 1 - .../languages/wordpress-seo-ro_RO.json | 1 - .../languages/wordpress-seo-ru_RU.json | 1 - .../languages/wordpress-seo-sk_SK.json | 1 - .../languages/wordpress-seo-sq.json | 1 - .../languages/wordpress-seo-sv_SE.json | 1 - .../languages/wordpress-seo-tr_TR.json | 1 - .../languages/wordpress-seo-zh_CN.json | 1 - .../languages/wordpress-seo-zh_HK.json | 1 - .../languages/wordpress-seo-zh_TW.json | 1 - .../languages/yoast-components-bg_BG.json | 1 - .../languages/yoast-components-ca.json | 1 - .../languages/yoast-components-cs_CZ.json | 1 - .../languages/yoast-components-da_DK.json | 1 - .../languages/yoast-components-de_DE.json | 1 - .../languages/yoast-components-en_AU.json | 1 - .../languages/yoast-components-en_CA.json | 1 - .../languages/yoast-components-en_GB.json | 1 - .../languages/yoast-components-en_NZ.json | 1 - .../languages/yoast-components-es_CL.json | 1 - .../languages/yoast-components-es_ES.json | 1 - .../languages/yoast-components-es_MX.json | 1 - .../languages/yoast-components-es_VE.json | 1 - .../languages/yoast-components-eu.json | 1 - .../languages/yoast-components-fa_IR.json | 1 - .../languages/yoast-components-fi.json | 1 - .../languages/yoast-components-fr_FR.json | 1 - .../languages/yoast-components-he_IL.json | 1 - .../languages/yoast-components-hr.json | 1 - .../languages/yoast-components-hu_HU.json | 1 - .../languages/yoast-components-id_ID.json | 1 - .../languages/yoast-components-it_IT.json | 1 - .../languages/yoast-components-ja.json | 1 - .../languages/yoast-components-nb_NO.json | 1 - .../languages/yoast-components-nl_NL.json | 1 - .../languages/yoast-components-pl_PL.json | 1 - .../languages/yoast-components-pt_BR.json | 1 - .../languages/yoast-components-pt_PT.json | 1 - .../languages/yoast-components-ro_RO.json | 1 - .../languages/yoast-components-ru_RU.json | 1 - .../languages/yoast-components-sk_SK.json | 1 - .../languages/yoast-components-sq.json | 1 - .../languages/yoast-components-sv_SE.json | 1 - .../languages/yoast-components-tr_TR.json | 1 - .../languages/yoast-components-zh_HK.json | 1 - .../languages/yoast-components-zh_TW.json | 1 - .../languages/yoast-components.php | 123 - .../wordpress-seo/languages/yoast-seo-js.json | 1 - .../wordpress-seo/languages/yoast-seo-js.php | 399 - .../plugins/wordpress-seo/license.txt | 621 - .../plugins/wordpress-seo/readme.txt | 161 - .../plugins/wordpress-seo/vendor/autoload.php | 7 - .../wordpress-seo/vendor/autoload_52.php | 7 - .../vendor/composer/ClassLoader.php | 445 - .../vendor/composer/ClassLoader52.php | 271 - .../wordpress-seo/vendor/composer/LICENSE | 21 - .../vendor/composer/autoload_classmap.php | 295 - .../vendor/composer/autoload_files.php | 10 - .../vendor/composer/autoload_namespaces.php | 11 - .../vendor/composer/autoload_psr4.php | 9 - .../vendor/composer/autoload_real.php | 70 - .../vendor/composer/autoload_real_52.php | 46 - .../vendor/composer/autoload_static.php | 327 - .../vendor/xrstf/composer-php52/LICENSE | 19 - .../xrstf/Composer52/AutoloadGenerator.php | 346 - .../lib/xrstf/Composer52/ClassLoader.php | 271 - .../lib/xrstf/Composer52/Generator.php | 39 - .../api-libs/class-api-google-client.php | 269 - .../yoast/api-libs/class-api-google.php | 64 - .../vendor/yoast/api-libs/class-api-libs.php | 49 - .../yoast/api-libs/google/Google_Client.php | 457 - .../auth/Google_AssertionCredentials.php | 103 - .../api-libs/google/auth/Google_Auth.php | 33 - .../api-libs/google/auth/Google_AuthNone.php | 48 - .../google/auth/Google_LoginTicket.php | 63 - .../api-libs/google/auth/Google_OAuth2.php | 451 - .../api-libs/google/auth/Google_P12Signer.php | 70 - .../google/auth/Google_PemVerifier.php | 66 - .../api-libs/google/auth/Google_Signer.php | 28 - .../api-libs/google/auth/Google_Verifier.php | 29 - .../api-libs/google/cache/Google_Cache.php | 52 - .../api-libs/google/cache/Google_WPCache.php | 53 - .../vendor/yoast/api-libs/google/config.php | 83 - .../google/external/URITemplateParser.php | 209 - .../api-libs/google/io/Google_CacheParser.php | 173 - .../api-libs/google/io/Google_CurlIO.php | 196 - .../api-libs/google/io/Google_HttpRequest.php | 304 - .../yoast/api-libs/google/io/Google_IO.php | 156 - .../yoast/api-libs/google/io/Google_REST.php | 128 - .../yoast/api-libs/google/io/Google_WPIO.php | 170 - .../yoast/api-libs/google/io/cacerts.pem | 738 - .../google/service/Google_BatchRequest.php | 110 - .../google/service/Google_MediaFileUpload.php | 262 - .../api-libs/google/service/Google_Model.php | 115 - .../google/service/Google_Service.php | 22 - .../google/service/Google_ServiceResource.php | 205 - .../api-libs/google/service/Google_Utils.php | 117 - .../vendor/yoast/i18n-module/CHANGELOG.md | 39 - .../src/i18n-module-wordpressorg.php | 63 - .../yoast/i18n-module/src/i18n-module.php | 339 - .../vendor/yoast/license-manager/CHANGELOG.md | 27 - .../license-manager/class-api-request.php | 138 - .../license-manager/class-license-manager.php | 703 - .../class-plugin-license-manager.php | 90 - .../class-plugin-update-manager.php | 93 - .../yoast/license-manager/class-product.php | 323 - .../license-manager/class-update-manager.php | 216 - .../vendor/yoast/license-manager/index.php | 2 - .../yoast/license-manager/views/form.php | 102 - .../yoast/license-manager/views/index.php | 2 - .../yoast/license-manager/views/script.php | 67 - .../vendor/yoast/whip/CHANGELOG.md | 30 - .../wordpress-seo/vendor/yoast/whip/LICENSE | 21 - .../vendor/yoast/whip/images/wp-message.png | Bin 276951 -> 0 bytes .../yoast/whip/src/Whip_Configuration.php | 54 - .../vendor/yoast/whip/src/Whip_Host.php | 88 - .../yoast/whip/src/Whip_MessageFormatter.php | 37 - .../yoast/whip/src/Whip_MessagesManager.php | 83 - .../whip/src/Whip_RequirementsChecker.php | 148 - .../whip/src/Whip_VersionRequirement.php | 133 - .../vendor/yoast/whip/src/configs/default.php | 5 - .../vendor/yoast/whip/src/configs/version.php | 3 - .../src/exceptions/Whip_EmptyProperty.php | 10 - .../exceptions/Whip_InvalidOperatorType.php | 22 - .../whip/src/exceptions/Whip_InvalidType.php | 18 - .../Whip_InvalidVersionComparisonString.php | 19 - .../yoast/whip/src/facades/wordpress.php | 31 - .../whip/src/interfaces/Whip_Message.php | 8 - .../src/interfaces/Whip_MessagePresenter.php | 10 - .../whip/src/interfaces/Whip_Requirement.php | 8 - .../src/interfaces/Whip_VersionDetector.php | 21 - .../whip/src/messages/Whip_BasicMessage.php | 42 - .../whip/src/messages/Whip_HostMessage.php | 56 - .../Whip_InvalidVersionRequirementMessage.php | 37 - .../whip/src/messages/Whip_NullMessage.php | 13 - .../src/messages/Whip_UpgradePhpMessage.php | 55 - .../presenters/Whip_WPMessagePresenter.php | 53 - .../yoast/whip/tests/ConfigurationTest.php | 62 - .../vendor/yoast/whip/tests/MessageTest.php | 23 - .../yoast/whip/tests/MessagesManagerTest.php | 14 - .../whip/tests/RequirementsCheckerTest.php | 144 - .../whip/tests/VersionRequirementTest.php | 99 - .../vendor/yoast/whip/tests/bootstrap.php | 5 - .../plugins/wordpress-seo/wp-seo-main.php | 493 - .../plugins/wordpress-seo/wp-seo.php | 47 - .../plugins/wordpress-seo/wpml-config.xml | 57 - wp/wp-content/plugins/wpdirauth | 1 - wp/wp-content/themes/index.php | 3 - wp/wp-content/themes/twentyfifteen/404.php | 30 - .../themes/twentyfifteen/archive.php | 64 - .../themes/twentyfifteen/author-bio.php | 39 - .../themes/twentyfifteen/comments.php | 58 - .../themes/twentyfifteen/content-link.php | 60 - .../themes/twentyfifteen/content-none.php | 37 - .../themes/twentyfifteen/content-page.php | 37 - .../themes/twentyfifteen/content-search.php | 37 - .../themes/twentyfifteen/content.php | 60 - .../themes/twentyfifteen/css/editor-style.css | 482 - wp/wp-content/themes/twentyfifteen/css/ie.css | 948 - .../themes/twentyfifteen/css/ie7.css | 89 - wp/wp-content/themes/twentyfifteen/footer.php | 34 - .../themes/twentyfifteen/functions.php | 407 - .../twentyfifteen/genericons/COPYING.txt | 9 - .../twentyfifteen/genericons/Genericons.eot | Bin 22760 -> 0 bytes .../twentyfifteen/genericons/Genericons.svg | 543 - .../twentyfifteen/genericons/Genericons.ttf | Bin 22576 -> 0 bytes .../twentyfifteen/genericons/Genericons.woff | Bin 14360 -> 0 bytes .../twentyfifteen/genericons/LICENSE.txt | 339 - .../themes/twentyfifteen/genericons/README.md | 152 - .../twentyfifteen/genericons/genericons.css | 209 - wp/wp-content/themes/twentyfifteen/header.php | 52 - wp/wp-content/themes/twentyfifteen/image.php | 94 - .../themes/twentyfifteen/inc/back-compat.php | 63 - .../twentyfifteen/inc/custom-header.php | 370 - .../themes/twentyfifteen/inc/customizer.php | 773 - .../twentyfifteen/inc/template-tags.php | 258 - wp/wp-content/themes/twentyfifteen/index.php | 61 - .../twentyfifteen/js/color-scheme-control.js | 78 - .../twentyfifteen/js/customize-preview.js | 35 - .../themes/twentyfifteen/js/functions.js | 178 - .../themes/twentyfifteen/js/html5.js | 9 - .../js/keyboard-image-navigation.js | 22 - .../twentyfifteen/js/skip-link-focus-fix.js | 26 - wp/wp-content/themes/twentyfifteen/page.php | 38 - wp/wp-content/themes/twentyfifteen/readme.txt | 96 - wp/wp-content/themes/twentyfifteen/rtl.css | 840 - .../themes/twentyfifteen/screenshot.png | Bin 576231 -> 0 bytes wp/wp-content/themes/twentyfifteen/search.php | 53 - .../themes/twentyfifteen/sidebar.php | 47 - wp/wp-content/themes/twentyfifteen/single.php | 48 - wp/wp-content/themes/twentyfifteen/style.css | 6051 ------ wp/wp-content/themes/twentyfourteen/404.php | 32 - .../themes/twentyfourteen/archive.php | 74 - .../themes/twentyfourteen/author.php | 74 - .../themes/twentyfourteen/category.php | 58 - .../themes/twentyfourteen/comments.php | 66 - .../themes/twentyfourteen/content-aside.php | 62 - .../themes/twentyfourteen/content-audio.php | 62 - .../twentyfourteen/content-featured-post.php | 34 - .../themes/twentyfourteen/content-gallery.php | 62 - .../themes/twentyfourteen/content-image.php | 62 - .../themes/twentyfourteen/content-link.php | 62 - .../themes/twentyfourteen/content-none.php | 31 - .../themes/twentyfourteen/content-page.php | 31 - .../themes/twentyfourteen/content-quote.php | 62 - .../themes/twentyfourteen/content-video.php | 62 - .../themes/twentyfourteen/content.php | 71 - .../twentyfourteen/css/editor-style.css | 721 - .../themes/twentyfourteen/css/ie.css | 1335 -- .../twentyfourteen/featured-content.php | 39 - .../themes/twentyfourteen/footer.php | 28 - .../themes/twentyfourteen/functions.php | 547 - .../twentyfourteen/genericons/COPYING.txt | 9 - .../genericons/Genericons-Regular.otf | Bin 18212 -> 0 bytes .../twentyfourteen/genericons/LICENSE.txt | 339 - .../twentyfourteen/genericons/README.txt | 123 - .../font/genericons-regular-webfont.eot | Bin 14935 -> 0 bytes .../font/genericons-regular-webfont.svg | 135 - .../font/genericons-regular-webfont.ttf | Bin 27348 -> 0 bytes .../font/genericons-regular-webfont.woff | Bin 17224 -> 0 bytes .../twentyfourteen/genericons/genericons.css | 197 - .../themes/twentyfourteen/header.php | 65 - wp/wp-content/themes/twentyfourteen/image.php | 79 - .../twentyfourteen/images/pattern-dark.svg | 16 - .../twentyfourteen/images/pattern-light.svg | 6 - .../themes/twentyfourteen/inc/back-compat.php | 63 - .../twentyfourteen/inc/custom-header.php | 147 - .../themes/twentyfourteen/inc/customizer.php | 152 - .../twentyfourteen/inc/featured-content.php | 531 - .../twentyfourteen/inc/template-tags.php | 227 - .../themes/twentyfourteen/inc/widgets.php | 290 - wp/wp-content/themes/twentyfourteen/index.php | 61 - .../themes/twentyfourteen/js/customizer.js | 38 - .../js/featured-content-admin.js | 9 - .../themes/twentyfourteen/js/functions.js | 209 - .../themes/twentyfourteen/js/html5.js | 8 - .../js/keyboard-image-navigation.js | 21 - .../themes/twentyfourteen/js/slider.js | 598 - .../page-templates/contributors.php | 52 - .../page-templates/full-width.php | 42 - wp/wp-content/themes/twentyfourteen/page.php | 48 - .../themes/twentyfourteen/readme.txt | 101 - wp/wp-content/themes/twentyfourteen/rtl.css | 854 - .../themes/twentyfourteen/screenshot.png | Bin 933301 -> 0 bytes .../themes/twentyfourteen/search.php | 49 - .../themes/twentyfourteen/sidebar-content.php | 16 - .../themes/twentyfourteen/sidebar-footer.php | 19 - .../themes/twentyfourteen/sidebar.php | 29 - .../themes/twentyfourteen/single.php | 40 - wp/wp-content/themes/twentyfourteen/style.css | 4349 ---- wp/wp-content/themes/twentyfourteen/tag.php | 60 - .../twentyfourteen/taxonomy-post_format.php | 85 - wp/wp-content/themes/twentythirteen/404.php | 31 - .../themes/twentythirteen/archive.php | 55 - .../themes/twentythirteen/author-bio.php | 34 - .../themes/twentythirteen/author.php | 62 - .../themes/twentythirteen/category.php | 41 - .../themes/twentythirteen/comments.php | 59 - .../themes/twentythirteen/content-aside.php | 38 - .../themes/twentythirteen/content-audio.php | 44 - .../themes/twentythirteen/content-chat.php | 38 - .../themes/twentythirteen/content-gallery.php | 52 - .../themes/twentythirteen/content-image.php | 48 - .../themes/twentythirteen/content-link.php | 43 - .../themes/twentythirteen/content-none.php | 31 - .../themes/twentythirteen/content-quote.php | 34 - .../themes/twentythirteen/content-status.php | 32 - .../themes/twentythirteen/content-video.php | 48 - .../themes/twentythirteen/content.php | 64 - .../twentythirteen/css/editor-style.css | 771 - .../themes/twentythirteen/css/ie.css | 288 - .../themes/twentythirteen/footer.php | 26 - .../themes/twentythirteen/functions.php | 617 - .../twentythirteen/genericons/COPYING.txt | 9 - .../genericons/Genericons-Regular.otf | Bin 18212 -> 0 bytes .../twentythirteen/genericons/LICENSE.txt | 339 - .../twentythirteen/genericons/README.txt | 123 - .../font/genericons-regular-webfont.eot | Bin 14935 -> 0 bytes .../font/genericons-regular-webfont.svg | 135 - .../font/genericons-regular-webfont.ttf | Bin 27348 -> 0 bytes .../font/genericons-regular-webfont.woff | Bin 17224 -> 0 bytes .../twentythirteen/genericons/genericons.css | 197 - .../themes/twentythirteen/header.php | 51 - wp/wp-content/themes/twentythirteen/image.php | 90 - .../twentythirteen/images/dotted-line-2x.png | Bin 86 -> 0 bytes .../images/dotted-line-light-2x.png | Bin 85 -> 0 bytes .../images/dotted-line-light.png | Bin 80 -> 0 bytes .../twentythirteen/images/dotted-line.png | Bin 80 -> 0 bytes .../images/headers/circle-thumbnail.png | Bin 8001 -> 0 bytes .../twentythirteen/images/headers/circle.png | Bin 33848 -> 0 bytes .../images/headers/diamond-thumbnail.png | Bin 1847 -> 0 bytes .../twentythirteen/images/headers/diamond.png | Bin 14266 -> 0 bytes .../images/headers/star-thumbnail.png | Bin 4039 -> 0 bytes .../twentythirteen/images/headers/star.png | Bin 22620 -> 0 bytes .../twentythirteen/images/search-icon-2x.png | Bin 829 -> 0 bytes .../twentythirteen/images/search-icon.png | Bin 422 -> 0 bytes .../themes/twentythirteen/inc/back-compat.php | 63 - .../twentythirteen/inc/custom-header.php | 230 - wp/wp-content/themes/twentythirteen/index.php | 38 - .../themes/twentythirteen/js/functions.js | 165 - .../themes/twentythirteen/js/html5.js | 8 - .../twentythirteen/js/theme-customizer.js | 41 - wp/wp-content/themes/twentythirteen/page.php | 50 - .../themes/twentythirteen/readme.txt | 108 - wp/wp-content/themes/twentythirteen/rtl.css | 766 - .../themes/twentythirteen/screenshot.png | Bin 175485 -> 0 bytes .../themes/twentythirteen/search.php | 36 - .../themes/twentythirteen/sidebar-main.php | 18 - .../themes/twentythirteen/sidebar.php | 22 - .../themes/twentythirteen/single.php | 28 - wp/wp-content/themes/twentythirteen/style.css | 3228 --- wp/wp-content/themes/twentythirteen/tag.php | 43 - .../twentythirteen/taxonomy-post_format.php | 41 - wp/wp-content/themes/twentytwelve/404.php | 29 - wp/wp-content/themes/twentytwelve/archive.php | 63 - wp/wp-content/themes/twentytwelve/author.php | 84 - .../themes/twentytwelve/category.php | 51 - .../themes/twentytwelve/comments.php | 60 - .../themes/twentytwelve/content-aside.php | 28 - .../themes/twentytwelve/content-image.php | 28 - .../themes/twentytwelve/content-link.php | 26 - .../themes/twentytwelve/content-none.php | 20 - .../themes/twentytwelve/content-page.php | 26 - .../themes/twentytwelve/content-quote.php | 25 - .../themes/twentytwelve/content-status.php | 42 - wp/wp-content/themes/twentytwelve/content.php | 73 - wp/wp-content/themes/twentytwelve/css/ie.css | 273 - .../themes/twentytwelve/editor-style-rtl.css | 28 - .../themes/twentytwelve/editor-style.css | 342 - wp/wp-content/themes/twentytwelve/footer.php | 23 - .../themes/twentytwelve/functions.php | 561 - wp/wp-content/themes/twentytwelve/header.php | 53 - wp/wp-content/themes/twentytwelve/image.php | 116 - .../themes/twentytwelve/inc/custom-header.php | 163 - wp/wp-content/themes/twentytwelve/index.php | 66 - wp/wp-content/themes/twentytwelve/js/html5.js | 8 - .../themes/twentytwelve/js/navigation.js | 55 - .../twentytwelve/js/theme-customizer.js | 65 - .../page-templates/front-page.php | 35 - .../page-templates/full-width.php | 30 - wp/wp-content/themes/twentytwelve/page.php | 29 - wp/wp-content/themes/twentytwelve/readme.txt | 104 - wp/wp-content/themes/twentytwelve/rtl.css | 237 - .../themes/twentytwelve/screenshot.png | Bin 323498 -> 0 bytes wp/wp-content/themes/twentytwelve/search.php | 49 - .../themes/twentytwelve/sidebar-front.php | 35 - wp/wp-content/themes/twentytwelve/sidebar.php | 17 - wp/wp-content/themes/twentytwelve/single.php | 33 - wp/wp-content/themes/twentytwelve/style.css | 1778 -- wp/wp-content/themes/twentytwelve/tag.php | 52 - wp/wp-cron.php | 129 - wp/wp-includes/ID3/getid3.lib.php | 1380 -- wp/wp-includes/ID3/getid3.php | 1796 -- wp/wp-includes/ID3/license.commercial.txt | 27 - wp/wp-includes/ID3/license.txt | 29 - wp/wp-includes/ID3/module.audio-video.asf.php | 2013 -- wp/wp-includes/ID3/module.audio-video.flv.php | 745 - .../ID3/module.audio-video.matroska.php | 1751 -- .../ID3/module.audio-video.quicktime.php | 2246 -- .../ID3/module.audio-video.riff.php | 2586 --- wp/wp-includes/ID3/module.audio.ac3.php | 474 - wp/wp-includes/ID3/module.audio.dts.php | 291 - wp/wp-includes/ID3/module.audio.flac.php | 453 - wp/wp-includes/ID3/module.audio.mp3.php | 2012 -- wp/wp-includes/ID3/module.audio.ogg.php | 839 - wp/wp-includes/ID3/module.tag.apetag.php | 412 - wp/wp-includes/ID3/module.tag.id3v1.php | 360 - wp/wp-includes/ID3/module.tag.id3v2.php | 3627 ---- wp/wp-includes/ID3/module.tag.lyrics3.php | 298 - wp/wp-includes/ID3/readme.txt | 604 - wp/wp-includes/IXR/class-IXR-base64.php | 32 - wp/wp-includes/IXR/class-IXR-client.php | 166 - .../IXR/class-IXR-clientmulticall.php | 44 - wp/wp-includes/IXR/class-IXR-date.php | 74 - wp/wp-includes/IXR/class-IXR-error.php | 53 - .../IXR/class-IXR-introspectionserver.php | 174 - wp/wp-includes/IXR/class-IXR-message.php | 234 - wp/wp-includes/IXR/class-IXR-request.php | 54 - wp/wp-includes/IXR/class-IXR-server.php | 225 - wp/wp-includes/IXR/class-IXR-value.php | 138 - wp/wp-includes/Requests/Auth.php | 33 - wp/wp-includes/Requests/Auth/Basic.php | 88 - wp/wp-includes/Requests/Cookie.php | 500 - wp/wp-includes/Requests/Cookie/Jar.php | 175 - wp/wp-includes/Requests/Exception.php | 62 - wp/wp-includes/Requests/Exception/HTTP.php | 71 - .../Requests/Exception/HTTP/304.php | 27 - .../Requests/Exception/HTTP/305.php | 27 - .../Requests/Exception/HTTP/306.php | 27 - .../Requests/Exception/HTTP/400.php | 27 - .../Requests/Exception/HTTP/401.php | 27 - .../Requests/Exception/HTTP/402.php | 27 - .../Requests/Exception/HTTP/403.php | 27 - .../Requests/Exception/HTTP/404.php | 27 - .../Requests/Exception/HTTP/405.php | 27 - .../Requests/Exception/HTTP/406.php | 27 - .../Requests/Exception/HTTP/407.php | 27 - .../Requests/Exception/HTTP/408.php | 27 - .../Requests/Exception/HTTP/409.php | 27 - .../Requests/Exception/HTTP/410.php | 27 - .../Requests/Exception/HTTP/411.php | 27 - .../Requests/Exception/HTTP/412.php | 27 - .../Requests/Exception/HTTP/413.php | 27 - .../Requests/Exception/HTTP/414.php | 27 - .../Requests/Exception/HTTP/415.php | 27 - .../Requests/Exception/HTTP/416.php | 27 - .../Requests/Exception/HTTP/417.php | 27 - .../Requests/Exception/HTTP/418.php | 29 - .../Requests/Exception/HTTP/428.php | 29 - .../Requests/Exception/HTTP/429.php | 29 - .../Requests/Exception/HTTP/431.php | 29 - .../Requests/Exception/HTTP/500.php | 27 - .../Requests/Exception/HTTP/501.php | 27 - .../Requests/Exception/HTTP/502.php | 27 - .../Requests/Exception/HTTP/503.php | 27 - .../Requests/Exception/HTTP/504.php | 27 - .../Requests/Exception/HTTP/505.php | 27 - .../Requests/Exception/HTTP/511.php | 29 - .../Requests/Exception/HTTP/Unknown.php | 44 - .../Requests/Exception/Transport.php | 5 - .../Requests/Exception/Transport/cURL.php | 56 - wp/wp-includes/Requests/Hooker.php | 33 - wp/wp-includes/Requests/Hooks.php | 68 - wp/wp-includes/Requests/IDNAEncoder.php | 388 - wp/wp-includes/Requests/IPv6.php | 190 - wp/wp-includes/Requests/IRI.php | 1084 - wp/wp-includes/Requests/Proxy.php | 35 - wp/wp-includes/Requests/Proxy/HTTP.php | 151 - wp/wp-includes/Requests/Response.php | 121 - wp/wp-includes/Requests/Response/Headers.php | 98 - wp/wp-includes/Requests/SSL.php | 152 - wp/wp-includes/Requests/Session.php | 266 - wp/wp-includes/Requests/Transport.php | 41 - wp/wp-includes/Requests/Transport/cURL.php | 542 - .../Requests/Transport/fsockopen.php | 444 - .../Utility/CaseInsensitiveDictionary.php | 103 - .../Requests/Utility/FilteredIterator.php | 45 - wp/wp-includes/SimplePie/Author.php | 157 - wp/wp-includes/SimplePie/Cache.php | 133 - wp/wp-includes/SimplePie/Cache/Base.php | 114 - wp/wp-includes/SimplePie/Cache/DB.php | 137 - wp/wp-includes/SimplePie/Cache/File.php | 173 - wp/wp-includes/SimplePie/Cache/Memcache.php | 183 - wp/wp-includes/SimplePie/Cache/MySQL.php | 438 - wp/wp-includes/SimplePie/Caption.php | 210 - wp/wp-includes/SimplePie/Category.php | 157 - .../SimplePie/Content/Type/Sniffer.php | 332 - wp/wp-includes/SimplePie/Copyright.php | 130 - wp/wp-includes/SimplePie/Core.php | 57 - wp/wp-includes/SimplePie/Credit.php | 156 - .../SimplePie/Decode/HTML/Entities.php | 617 - wp/wp-includes/SimplePie/Enclosure.php | 1380 -- wp/wp-includes/SimplePie/Exception.php | 52 - wp/wp-includes/SimplePie/File.php | 292 - wp/wp-includes/SimplePie/HTTP/Parser.php | 500 - wp/wp-includes/SimplePie/IRI.php | 1238 -- wp/wp-includes/SimplePie/Item.php | 2964 --- wp/wp-includes/SimplePie/Locator.php | 372 - wp/wp-includes/SimplePie/Misc.php | 2247 -- wp/wp-includes/SimplePie/Net/IPv6.php | 276 - wp/wp-includes/SimplePie/Parse/Date.php | 984 - wp/wp-includes/SimplePie/Parser.php | 407 - wp/wp-includes/SimplePie/Rating.php | 129 - wp/wp-includes/SimplePie/Registry.php | 225 - wp/wp-includes/SimplePie/Restriction.php | 155 - wp/wp-includes/SimplePie/Sanitize.php | 554 - wp/wp-includes/SimplePie/Source.php | 611 - .../SimplePie/XML/Declaration/Parser.php | 362 - wp/wp-includes/SimplePie/gzdecode.php | 371 - wp/wp-includes/Text/Diff.php | 506 - wp/wp-includes/Text/Diff/Engine/native.php | 436 - wp/wp-includes/Text/Diff/Engine/shell.php | 162 - wp/wp-includes/Text/Diff/Engine/string.php | 248 - wp/wp-includes/Text/Diff/Engine/xdiff.php | 64 - wp/wp-includes/Text/Diff/Renderer.php | 242 - wp/wp-includes/Text/Diff/Renderer/inline.php | 206 - wp/wp-includes/admin-bar.php | 1005 - wp/wp-includes/atomlib.php | 368 - wp/wp-includes/author-template.php | 509 - wp/wp-includes/bookmark-template.php | 304 - wp/wp-includes/bookmark.php | 421 - wp/wp-includes/cache.php | 757 - wp/wp-includes/canonical.php | 657 - wp/wp-includes/capabilities.php | 811 - wp/wp-includes/category-template.php | 1326 -- wp/wp-includes/category.php | 360 - wp/wp-includes/certificates/ca-bundle.crt | 4327 ---- wp/wp-includes/class-IXR.php | 60 - wp/wp-includes/class-feed.php | 18 - wp/wp-includes/class-http.php | 1018 - wp/wp-includes/class-json.php | 960 - wp/wp-includes/class-oembed.php | 693 - wp/wp-includes/class-phpass.php | 276 - wp/wp-includes/class-phpmailer.php | 4040 ---- wp/wp-includes/class-pop3.php | 662 - wp/wp-includes/class-requests.php | 980 - wp/wp-includes/class-simplepie.php | 3094 --- wp/wp-includes/class-smtp.php | 1186 -- wp/wp-includes/class-snoopy.php | 1259 -- .../class-walker-category-dropdown.php | 80 - wp/wp-includes/class-walker-category.php | 235 - wp/wp-includes/class-walker-comment.php | 374 - wp/wp-includes/class-walker-nav-menu.php | 250 - wp/wp-includes/class-walker-page-dropdown.php | 90 - wp/wp-includes/class-walker-page.php | 209 - wp/wp-includes/class-wp-admin-bar.php | 600 - wp/wp-includes/class-wp-ajax-response.php | 157 - wp/wp-includes/class-wp-comment-query.php | 1176 -- wp/wp-includes/class-wp-comment.php | 395 - wp/wp-includes/class-wp-customize-control.php | 703 - wp/wp-includes/class-wp-customize-manager.php | 4368 ---- .../class-wp-customize-nav-menus.php | 1396 -- wp/wp-includes/class-wp-customize-panel.php | 399 - wp/wp-includes/class-wp-customize-section.php | 406 - wp/wp-includes/class-wp-customize-setting.php | 921 - wp/wp-includes/class-wp-customize-widgets.php | 2052 -- wp/wp-includes/class-wp-dependency.php | 104 - wp/wp-includes/class-wp-editor.php | 1501 -- wp/wp-includes/class-wp-embed.php | 386 - wp/wp-includes/class-wp-error.php | 204 - .../class-wp-feed-cache-transient.php | 141 - wp/wp-includes/class-wp-feed-cache.php | 33 - wp/wp-includes/class-wp-hook.php | 535 - wp/wp-includes/class-wp-http-cookie.php | 241 - wp/wp-includes/class-wp-http-curl.php | 385 - wp/wp-includes/class-wp-http-encoding.php | 228 - wp/wp-includes/class-wp-http-ixr-client.php | 124 - wp/wp-includes/class-wp-http-proxy.php | 219 - .../class-wp-http-requests-hooks.php | 76 - .../class-wp-http-requests-response.php | 209 - wp/wp-includes/class-wp-http-response.php | 165 - wp/wp-includes/class-wp-http-streams.php | 428 - wp/wp-includes/class-wp-image-editor-gd.php | 481 - .../class-wp-image-editor-imagick.php | 769 - wp/wp-includes/class-wp-image-editor.php | 490 - wp/wp-includes/class-wp-list-util.php | 267 - wp/wp-includes/class-wp-locale-switcher.php | 240 - wp/wp-includes/class-wp-locale.php | 404 - wp/wp-includes/class-wp-matchesmapregex.php | 97 - wp/wp-includes/class-wp-meta-query.php | 752 - .../class-wp-metadata-lazyloader.php | 176 - wp/wp-includes/class-wp-network-query.php | 559 - wp/wp-includes/class-wp-network.php | 410 - wp/wp-includes/class-wp-oembed-controller.php | 89 - wp/wp-includes/class-wp-post-type.php | 721 - wp/wp-includes/class-wp-post.php | 341 - wp/wp-includes/class-wp-query.php | 4107 ---- wp/wp-includes/class-wp-rewrite.php | 1954 -- wp/wp-includes/class-wp-role.php | 115 - wp/wp-includes/class-wp-roles.php | 288 - wp/wp-includes/class-wp-session-tokens.php | 317 - wp/wp-includes/class-wp-simplepie-file.php | 72 - .../class-wp-simplepie-sanitize-kses.php | 59 - wp/wp-includes/class-wp-site-query.php | 689 - wp/wp-includes/class-wp-site.php | 363 - wp/wp-includes/class-wp-tax-query.php | 665 - wp/wp-includes/class-wp-taxonomy.php | 453 - wp/wp-includes/class-wp-term-query.php | 968 - wp/wp-includes/class-wp-term.php | 255 - .../class-wp-text-diff-renderer-inline.php | 33 - .../class-wp-text-diff-renderer-table.php | 509 - wp/wp-includes/class-wp-theme.php | 1499 -- .../class-wp-user-meta-session-tokens.php | 139 - wp/wp-includes/class-wp-user-query.php | 878 - wp/wp-includes/class-wp-user.php | 789 - wp/wp-includes/class-wp-walker.php | 425 - wp/wp-includes/class-wp-widget-factory.php | 152 - wp/wp-includes/class-wp-widget.php | 616 - wp/wp-includes/class-wp-xmlrpc-server.php | 6489 ------ wp/wp-includes/class-wp.php | 748 - wp/wp-includes/class.wp-dependencies.php | 414 - wp/wp-includes/class.wp-scripts.php | 587 - wp/wp-includes/class.wp-styles.php | 407 - wp/wp-includes/comment-template.php | 2464 --- wp/wp-includes/comment.php | 3101 --- wp/wp-includes/compat.php | 580 - wp/wp-includes/cron.php | 507 - wp/wp-includes/css/admin-bar-rtl.css | 1159 -- wp/wp-includes/css/admin-bar-rtl.min.css | 1 - wp/wp-includes/css/admin-bar.css | 1159 -- wp/wp-includes/css/admin-bar.min.css | 1 - wp/wp-includes/css/buttons-rtl.css | 394 - wp/wp-includes/css/buttons-rtl.min.css | 1 - wp/wp-includes/css/buttons.css | 394 - wp/wp-includes/css/buttons.min.css | 1 - wp/wp-includes/css/customize-preview-rtl.css | 259 - .../css/customize-preview-rtl.min.css | 1 - wp/wp-includes/css/customize-preview.css | 259 - wp/wp-includes/css/customize-preview.min.css | 1 - wp/wp-includes/css/dashicons.css | 1027 - wp/wp-includes/css/dashicons.min.css | 1 - wp/wp-includes/css/editor-rtl.css | 1905 -- wp/wp-includes/css/editor-rtl.min.css | 1 - wp/wp-includes/css/editor.css | 1905 -- wp/wp-includes/css/editor.min.css | 1 - wp/wp-includes/css/jquery-ui-dialog-rtl.css | 363 - .../css/jquery-ui-dialog-rtl.min.css | 17 - wp/wp-includes/css/jquery-ui-dialog.css | 363 - wp/wp-includes/css/jquery-ui-dialog.min.css | 17 - wp/wp-includes/css/media-views-rtl.css | 2687 --- wp/wp-includes/css/media-views-rtl.min.css | 8 - wp/wp-includes/css/media-views.css | 2687 --- wp/wp-includes/css/media-views.min.css | 8 - wp/wp-includes/css/wp-auth-check-rtl.css | 125 - wp/wp-includes/css/wp-auth-check-rtl.min.css | 1 - wp/wp-includes/css/wp-auth-check.css | 125 - wp/wp-includes/css/wp-auth-check.min.css | 1 - wp/wp-includes/css/wp-embed-template-ie.css | 19 - .../css/wp-embed-template-ie.min.css | 1 - wp/wp-includes/css/wp-embed-template.css | 366 - wp/wp-includes/css/wp-embed-template.min.css | 1 - wp/wp-includes/css/wp-pointer-rtl.css | 212 - wp/wp-includes/css/wp-pointer-rtl.min.css | 1 - wp/wp-includes/css/wp-pointer.css | 212 - wp/wp-includes/css/wp-pointer.min.css | 1 - ...-wp-customize-background-image-control.php | 51 - ...-wp-customize-background-image-setting.php | 28 - ...-customize-background-position-control.php | 87 - .../class-wp-customize-color-control.php | 123 - ...ass-wp-customize-cropped-image-control.php | 93 - .../class-wp-customize-custom-css-setting.php | 367 - .../class-wp-customize-filter-setting.php | 30 - ...lass-wp-customize-header-image-control.php | 230 - ...lass-wp-customize-header-image-setting.php | 51 - .../class-wp-customize-image-control.php | 77 - .../class-wp-customize-media-control.php | 217 - ...wp-customize-nav-menu-auto-add-control.php | 51 - .../class-wp-customize-nav-menu-control.php | 102 - ...ass-wp-customize-nav-menu-item-control.php | 168 - ...ass-wp-customize-nav-menu-item-setting.php | 901 - ...wp-customize-nav-menu-location-control.php | 83 - ...ass-wp-customize-nav-menu-name-control.php | 52 - .../class-wp-customize-nav-menu-section.php | 43 - .../class-wp-customize-nav-menu-setting.php | 661 - .../class-wp-customize-nav-menus-panel.php | 100 - .../class-wp-customize-new-menu-control.php | 40 - .../class-wp-customize-new-menu-section.php | 46 - .../customize/class-wp-customize-partial.php | 328 - .../class-wp-customize-selective-refresh.php | 452 - .../class-wp-customize-sidebar-section.php | 61 - .../class-wp-customize-site-icon-control.php | 103 - .../class-wp-customize-theme-control.php | 111 - .../class-wp-customize-themes-section.php | 86 - .../class-wp-customize-upload-control.php | 44 - ...class-wp-widget-area-customize-control.php | 70 - ...class-wp-widget-form-customize-control.php | 77 - wp/wp-includes/date.php | 1017 - wp/wp-includes/default-constants.php | 362 - wp/wp-includes/default-filters.php | 507 - wp/wp-includes/default-widgets.php | 47 - wp/wp-includes/deprecated.php | 3880 ---- wp/wp-includes/embed-template.php | 13 - wp/wp-includes/embed.php | 1087 - wp/wp-includes/feed-atom-comments.php | 124 - wp/wp-includes/feed-atom.php | 93 - wp/wp-includes/feed-rdf.php | 88 - wp/wp-includes/feed-rss.php | 49 - wp/wp-includes/feed-rss2-comments.php | 110 - wp/wp-includes/feed-rss2.php | 124 - wp/wp-includes/feed.php | 710 - wp/wp-includes/fonts/dashicons.eot | Bin 22449 -> 0 bytes wp/wp-includes/fonts/dashicons.svg | 269 - wp/wp-includes/fonts/dashicons.ttf | Bin 41728 -> 0 bytes wp/wp-includes/fonts/dashicons.woff | Bin 26124 -> 0 bytes wp/wp-includes/formatting.php | 5364 ----- wp/wp-includes/functions.php | 5641 ----- wp/wp-includes/functions.wp-scripts.php | 336 - wp/wp-includes/functions.wp-styles.php | 231 - wp/wp-includes/general-template.php | 3787 ---- wp/wp-includes/http.php | 743 - wp/wp-includes/images/admin-bar-sprite-2x.png | Bin 3999 -> 0 bytes wp/wp-includes/images/admin-bar-sprite.png | Bin 2467 -> 0 bytes .../images/arrow-pointer-blue-2x.png | Bin 1666 -> 0 bytes wp/wp-includes/images/arrow-pointer-blue.png | Bin 793 -> 0 bytes wp/wp-includes/images/blank.gif | Bin 43 -> 0 bytes wp/wp-includes/images/crystal/archive.png | Bin 2454 -> 0 bytes wp/wp-includes/images/crystal/audio.png | Bin 2184 -> 0 bytes wp/wp-includes/images/crystal/code.png | Bin 1604 -> 0 bytes wp/wp-includes/images/crystal/default.png | Bin 453 -> 0 bytes wp/wp-includes/images/crystal/document.png | Bin 2063 -> 0 bytes wp/wp-includes/images/crystal/interactive.png | Bin 2217 -> 0 bytes wp/wp-includes/images/crystal/license.txt | 9 - wp/wp-includes/images/crystal/spreadsheet.png | Bin 2408 -> 0 bytes wp/wp-includes/images/crystal/text.png | Bin 670 -> 0 bytes wp/wp-includes/images/crystal/video.png | Bin 1339 -> 0 bytes wp/wp-includes/images/down_arrow-2x.gif | Bin 84 -> 0 bytes wp/wp-includes/images/down_arrow.gif | Bin 59 -> 0 bytes .../images/icon-pointer-flag-2x.png | Bin 1369 -> 0 bytes wp/wp-includes/images/icon-pointer-flag.png | Bin 783 -> 0 bytes wp/wp-includes/images/media/archive.png | Bin 417 -> 0 bytes wp/wp-includes/images/media/audio.png | Bin 382 -> 0 bytes wp/wp-includes/images/media/code.png | Bin 274 -> 0 bytes wp/wp-includes/images/media/default.png | Bin 168 -> 0 bytes wp/wp-includes/images/media/document.png | Bin 200 -> 0 bytes wp/wp-includes/images/media/interactive.png | Bin 319 -> 0 bytes wp/wp-includes/images/media/spreadsheet.png | Bin 188 -> 0 bytes wp/wp-includes/images/media/text.png | Bin 188 -> 0 bytes wp/wp-includes/images/media/video.png | Bin 283 -> 0 bytes wp/wp-includes/images/rss-2x.png | Bin 1306 -> 0 bytes wp/wp-includes/images/rss.png | Bin 608 -> 0 bytes wp/wp-includes/images/smilies/frownie.png | Bin 1007 -> 0 bytes wp/wp-includes/images/smilies/icon_arrow.gif | Bin 169 -> 0 bytes .../images/smilies/icon_biggrin.gif | Bin 173 -> 0 bytes .../images/smilies/icon_confused.gif | Bin 170 -> 0 bytes wp/wp-includes/images/smilies/icon_cool.gif | Bin 172 -> 0 bytes wp/wp-includes/images/smilies/icon_cry.gif | Bin 490 -> 0 bytes wp/wp-includes/images/smilies/icon_eek.gif | Bin 170 -> 0 bytes wp/wp-includes/images/smilies/icon_evil.gif | Bin 241 -> 0 bytes .../images/smilies/icon_exclaim.gif | Bin 236 -> 0 bytes wp/wp-includes/images/smilies/icon_idea.gif | Bin 174 -> 0 bytes wp/wp-includes/images/smilies/icon_lol.gif | Bin 333 -> 0 bytes wp/wp-includes/images/smilies/icon_mad.gif | Bin 172 -> 0 bytes .../images/smilies/icon_mrgreen.gif | Bin 348 -> 0 bytes .../images/smilies/icon_neutral.gif | Bin 167 -> 0 bytes .../images/smilies/icon_question.gif | Bin 247 -> 0 bytes wp/wp-includes/images/smilies/icon_razz.gif | Bin 175 -> 0 bytes .../images/smilies/icon_redface.gif | Bin 650 -> 0 bytes .../images/smilies/icon_rolleyes.gif | Bin 489 -> 0 bytes wp/wp-includes/images/smilies/icon_sad.gif | Bin 167 -> 0 bytes wp/wp-includes/images/smilies/icon_smile.gif | Bin 173 -> 0 bytes .../images/smilies/icon_surprised.gif | Bin 174 -> 0 bytes .../images/smilies/icon_twisted.gif | Bin 241 -> 0 bytes wp/wp-includes/images/smilies/icon_wink.gif | Bin 168 -> 0 bytes wp/wp-includes/images/smilies/mrgreen.png | Bin 1486 -> 0 bytes wp/wp-includes/images/smilies/rolleyes.png | Bin 1233 -> 0 bytes .../images/smilies/simple-smile.png | Bin 1008 -> 0 bytes wp/wp-includes/images/spinner-2x.gif | Bin 8536 -> 0 bytes wp/wp-includes/images/spinner.gif | Bin 4162 -> 0 bytes wp/wp-includes/images/toggle-arrow-2x.png | Bin 354 -> 0 bytes wp/wp-includes/images/toggle-arrow.png | Bin 289 -> 0 bytes wp/wp-includes/images/uploader-icons-2x.png | Bin 3542 -> 0 bytes wp/wp-includes/images/uploader-icons.png | Bin 1556 -> 0 bytes wp/wp-includes/images/w-logo-blue.png | Bin 3113 -> 0 bytes wp/wp-includes/images/wlw/wp-comments.png | Bin 1373 -> 0 bytes wp/wp-includes/images/wlw/wp-icon.png | Bin 664 -> 0 bytes wp/wp-includes/images/wlw/wp-watermark.png | Bin 2376 -> 0 bytes wp/wp-includes/images/wpicons-2x.png | Bin 14931 -> 0 bytes wp/wp-includes/images/wpicons.png | Bin 7086 -> 0 bytes wp/wp-includes/images/wpspin-2x.gif | Bin 9133 -> 0 bytes wp/wp-includes/images/wpspin.gif | Bin 2209 -> 0 bytes wp/wp-includes/images/xit-2x.gif | Bin 825 -> 0 bytes wp/wp-includes/images/xit.gif | Bin 181 -> 0 bytes wp/wp-includes/js/admin-bar.js | 387 - wp/wp-includes/js/admin-bar.min.js | 1 - wp/wp-includes/js/autosave.js | 603 - wp/wp-includes/js/autosave.min.js | 1 - wp/wp-includes/js/backbone.min.js | 1 - wp/wp-includes/js/colorpicker.js | 707 - wp/wp-includes/js/colorpicker.min.js | 1 - wp/wp-includes/js/comment-reply.js | 96 - wp/wp-includes/js/comment-reply.min.js | 1 - wp/wp-includes/js/crop/cropper.css | 165 - wp/wp-includes/js/crop/cropper.js | 516 - wp/wp-includes/js/crop/marqueeHoriz.gif | Bin 277 -> 0 bytes wp/wp-includes/js/crop/marqueeVert.gif | Bin 293 -> 0 bytes wp/wp-includes/js/customize-base.js | 849 - wp/wp-includes/js/customize-base.min.js | 1 - wp/wp-includes/js/customize-loader.js | 276 - wp/wp-includes/js/customize-loader.min.js | 1 - wp/wp-includes/js/customize-models.js | 247 - wp/wp-includes/js/customize-models.min.js | 1 - .../js/customize-preview-nav-menus.js | 437 - .../js/customize-preview-nav-menus.min.js | 1 - .../js/customize-preview-widgets.js | 673 - .../js/customize-preview-widgets.min.js | 1 - wp/wp-includes/js/customize-preview.js | 844 - wp/wp-includes/js/customize-preview.min.js | 1 - .../js/customize-selective-refresh.js | 1034 - .../js/customize-selective-refresh.min.js | 1 - wp/wp-includes/js/customize-views.js | 186 - wp/wp-includes/js/customize-views.min.js | 1 - wp/wp-includes/js/heartbeat.js | 749 - wp/wp-includes/js/heartbeat.min.js | 1 - wp/wp-includes/js/hoverIntent.js | 115 - wp/wp-includes/js/hoverIntent.min.js | 1 - wp/wp-includes/js/imagesloaded.min.js | 1 - .../js/imgareaselect/border-anim-h.gif | Bin 178 -> 0 bytes .../js/imgareaselect/border-anim-v.gif | Bin 178 -> 0 bytes .../js/imgareaselect/imgareaselect.css | 41 - .../js/imgareaselect/jquery.imgareaselect.js | 1232 -- .../imgareaselect/jquery.imgareaselect.min.js | 1 - wp/wp-includes/js/jcrop/Jcrop.gif | Bin 323 -> 0 bytes wp/wp-includes/js/jcrop/jquery.Jcrop.min.css | 29 - wp/wp-includes/js/jcrop/jquery.Jcrop.min.js | 22 - wp/wp-includes/js/jquery/jquery-migrate.js | 752 - .../js/jquery/jquery-migrate.min.js | 2 - wp/wp-includes/js/jquery/jquery.color.min.js | 2 - wp/wp-includes/js/jquery/jquery.form.js | 1193 -- wp/wp-includes/js/jquery/jquery.form.min.js | 11 - wp/wp-includes/js/jquery/jquery.hotkeys.js | 134 - .../js/jquery/jquery.hotkeys.min.js | 1 - wp/wp-includes/js/jquery/jquery.js | 6 - .../js/jquery/jquery.masonry.min.js | 11 - wp/wp-includes/js/jquery/jquery.query.js | 11 - wp/wp-includes/js/jquery/jquery.schedule.js | 36 - .../js/jquery/jquery.serialize-object.js | 31 - .../js/jquery/jquery.table-hotkeys.js | 99 - .../js/jquery/jquery.table-hotkeys.min.js | 1 - .../js/jquery/jquery.ui.touch-punch.js | 11 - wp/wp-includes/js/jquery/suggest.js | 316 - wp/wp-includes/js/jquery/suggest.min.js | 1 - wp/wp-includes/js/jquery/ui/accordion.min.js | 11 - .../js/jquery/ui/autocomplete.min.js | 11 - wp/wp-includes/js/jquery/ui/button.min.js | 11 - wp/wp-includes/js/jquery/ui/core.min.js | 11 - wp/wp-includes/js/jquery/ui/datepicker.min.js | 12 - wp/wp-includes/js/jquery/ui/dialog.min.js | 11 - wp/wp-includes/js/jquery/ui/draggable.min.js | 11 - wp/wp-includes/js/jquery/ui/droppable.min.js | 11 - .../js/jquery/ui/effect-blind.min.js | 11 - .../js/jquery/ui/effect-bounce.min.js | 11 - .../js/jquery/ui/effect-clip.min.js | 11 - .../js/jquery/ui/effect-drop.min.js | 11 - .../js/jquery/ui/effect-explode.min.js | 11 - .../js/jquery/ui/effect-fade.min.js | 11 - .../js/jquery/ui/effect-fold.min.js | 11 - .../js/jquery/ui/effect-highlight.min.js | 11 - .../js/jquery/ui/effect-puff.min.js | 11 - .../js/jquery/ui/effect-pulsate.min.js | 11 - .../js/jquery/ui/effect-scale.min.js | 11 - .../js/jquery/ui/effect-shake.min.js | 11 - .../js/jquery/ui/effect-size.min.js | 11 - .../js/jquery/ui/effect-slide.min.js | 11 - .../js/jquery/ui/effect-transfer.min.js | 11 - wp/wp-includes/js/jquery/ui/effect.min.js | 21 - wp/wp-includes/js/jquery/ui/menu.min.js | 11 - wp/wp-includes/js/jquery/ui/mouse.min.js | 11 - wp/wp-includes/js/jquery/ui/position.min.js | 11 - .../js/jquery/ui/progressbar.min.js | 11 - wp/wp-includes/js/jquery/ui/resizable.min.js | 11 - wp/wp-includes/js/jquery/ui/selectable.min.js | 11 - wp/wp-includes/js/jquery/ui/selectmenu.min.js | 11 - wp/wp-includes/js/jquery/ui/slider.min.js | 11 - wp/wp-includes/js/jquery/ui/sortable.min.js | 11 - wp/wp-includes/js/jquery/ui/spinner.min.js | 11 - wp/wp-includes/js/jquery/ui/tabs.min.js | 11 - wp/wp-includes/js/jquery/ui/tooltip.min.js | 11 - wp/wp-includes/js/jquery/ui/widget.min.js | 11 - wp/wp-includes/js/json2.js | 519 - wp/wp-includes/js/json2.min.js | 1 - wp/wp-includes/js/masonry.min.js | 9 - wp/wp-includes/js/mce-view.js | 939 - wp/wp-includes/js/mce-view.min.js | 1 - wp/wp-includes/js/media-audiovideo.js | 921 - wp/wp-includes/js/media-audiovideo.min.js | 1 - wp/wp-includes/js/media-editor.js | 1110 - wp/wp-includes/js/media-editor.min.js | 1 - wp/wp-includes/js/media-grid.js | 857 - wp/wp-includes/js/media-grid.min.js | 1 - wp/wp-includes/js/media-models.js | 1506 -- wp/wp-includes/js/media-models.min.js | 1 - wp/wp-includes/js/media-views.js | 8542 -------- wp/wp-includes/js/media-views.min.js | 4 - wp/wp-includes/js/mediaelement/background.png | Bin 166 -> 0 bytes wp/wp-includes/js/mediaelement/bigplay.png | Bin 3001 -> 0 bytes wp/wp-includes/js/mediaelement/bigplay.svg | 14 - wp/wp-includes/js/mediaelement/controls.png | Bin 1892 -> 0 bytes wp/wp-includes/js/mediaelement/controls.svg | 1 - .../js/mediaelement/flashmediaelement.swf | Bin 130054 -> 0 bytes .../js/mediaelement/froogaloop.min.js | 4 - .../js/mediaelement/jumpforward.png | Bin 1563 -> 0 bytes wp/wp-includes/js/mediaelement/loading.gif | Bin 6224 -> 0 bytes .../mediaelement-and-player.min.js | 28 - .../mediaelement/mediaelementplayer.min.css | 1 - .../mediaelement/silverlightmediaelement.xap | Bin 12459 -> 0 bytes wp/wp-includes/js/mediaelement/skipback.png | Bin 4245 -> 0 bytes .../js/mediaelement/wp-mediaelement.css | 312 - .../js/mediaelement/wp-mediaelement.js | 61 - .../js/mediaelement/wp-mediaelement.min.css | 1 - .../js/mediaelement/wp-mediaelement.min.js | 1 - wp/wp-includes/js/mediaelement/wp-playlist.js | 175 - .../js/mediaelement/wp-playlist.min.js | 1 - wp/wp-includes/js/plupload/handlers.js | 497 - wp/wp-includes/js/plupload/handlers.min.js | 1 - wp/wp-includes/js/plupload/license.txt | 339 - wp/wp-includes/js/plupload/plupload.flash.swf | Bin 29570 -> 0 bytes .../js/plupload/plupload.full.min.js | 29 - .../js/plupload/plupload.silverlight.xap | Bin 63118 -> 0 bytes wp/wp-includes/js/plupload/wp-plupload.js | 426 - wp/wp-includes/js/plupload/wp-plupload.min.js | 1 - wp/wp-includes/js/quicktags.js | 712 - wp/wp-includes/js/quicktags.min.js | 1 - wp/wp-includes/js/shortcode.js | 351 - wp/wp-includes/js/shortcode.min.js | 1 - wp/wp-includes/js/swfobject.js | 4 - wp/wp-includes/js/swfupload/handlers.js | 376 - wp/wp-includes/js/swfupload/handlers.min.js | 1 - wp/wp-includes/js/swfupload/license.txt | 32 - .../js/swfupload/plugins/swfupload.cookies.js | 53 - .../js/swfupload/plugins/swfupload.queue.js | 98 - .../js/swfupload/plugins/swfupload.speed.js | 342 - .../swfupload/plugins/swfupload.swfobject.js | 105 - wp/wp-includes/js/swfupload/swfupload.js | 980 - wp/wp-includes/js/swfupload/swfupload.swf | Bin 13133 -> 0 bytes .../js/thickbox/loadingAnimation.gif | Bin 15238 -> 0 bytes wp/wp-includes/js/thickbox/macFFBgHack.png | Bin 94 -> 0 bytes wp/wp-includes/js/thickbox/thickbox.css | 156 - wp/wp-includes/js/thickbox/thickbox.js | 338 - .../js/tinymce/langs/wp-langs-en.js | 519 - wp/wp-includes/js/tinymce/license.txt | 504 - .../js/tinymce/plugins/charmap/plugin.js | 466 - .../js/tinymce/plugins/charmap/plugin.min.js | 1 - .../js/tinymce/plugins/colorpicker/plugin.js | 112 - .../tinymce/plugins/colorpicker/plugin.min.js | 1 - .../tinymce/plugins/compat3x/css/dialog.css | 210 - .../js/tinymce/plugins/compat3x/plugin.js | 306 - .../js/tinymce/plugins/compat3x/plugin.min.js | 1 - .../tinymce/plugins/directionality/plugin.js | 64 - .../plugins/directionality/plugin.min.js | 1 - .../js/tinymce/plugins/fullscreen/plugin.js | 154 - .../tinymce/plugins/fullscreen/plugin.min.js | 1 - .../js/tinymce/plugins/hr/plugin.js | 30 - .../js/tinymce/plugins/hr/plugin.min.js | 1 - .../js/tinymce/plugins/image/plugin.js | 655 - .../js/tinymce/plugins/image/plugin.min.js | 1 - .../js/tinymce/plugins/lists/plugin.js | 1447 -- .../js/tinymce/plugins/lists/plugin.min.js | 1 - .../js/tinymce/plugins/media/moxieplayer.swf | Bin 20017 -> 0 bytes .../js/tinymce/plugins/media/plugin.js | 1421 -- .../js/tinymce/plugins/media/plugin.min.js | 1 - .../js/tinymce/plugins/paste/plugin.js | 1869 -- .../js/tinymce/plugins/paste/plugin.min.js | 1 - .../js/tinymce/plugins/tabfocus/plugin.js | 120 - .../js/tinymce/plugins/tabfocus/plugin.min.js | 1 - .../js/tinymce/plugins/textcolor/plugin.js | 297 - .../tinymce/plugins/textcolor/plugin.min.js | 1 - .../js/tinymce/plugins/wordpress/plugin.js | 1036 - .../tinymce/plugins/wordpress/plugin.min.js | 1 - .../js/tinymce/plugins/wpautoresize/plugin.js | 207 - .../plugins/wpautoresize/plugin.min.js | 1 - .../js/tinymce/plugins/wpdialogs/plugin.js | 92 - .../tinymce/plugins/wpdialogs/plugin.min.js | 1 - .../js/tinymce/plugins/wpeditimage/plugin.js | 1094 - .../tinymce/plugins/wpeditimage/plugin.min.js | 1 - .../js/tinymce/plugins/wpembed/plugin.js | 17 - .../js/tinymce/plugins/wpembed/plugin.min.js | 1 - .../js/tinymce/plugins/wpemoji/plugin.js | 128 - .../js/tinymce/plugins/wpemoji/plugin.min.js | 1 - .../js/tinymce/plugins/wpgallery/plugin.js | 112 - .../tinymce/plugins/wpgallery/plugin.min.js | 1 - .../js/tinymce/plugins/wplink/plugin.js | 613 - .../js/tinymce/plugins/wplink/plugin.min.js | 1 - .../tinymce/plugins/wptextpattern/plugin.js | 348 - .../plugins/wptextpattern/plugin.min.js | 1 - .../js/tinymce/plugins/wpview/plugin.js | 208 - .../js/tinymce/plugins/wpview/plugin.min.js | 1 - .../skins/lightgray/content.inline.min.css | 1 - .../tinymce/skins/lightgray/content.min.css | 1 - .../tinymce/skins/lightgray/fonts/readme.md | 1 - .../skins/lightgray/fonts/tinymce-small.eot | Bin 9492 -> 0 bytes .../skins/lightgray/fonts/tinymce-small.json | 1277 -- .../skins/lightgray/fonts/tinymce-small.svg | 63 - .../skins/lightgray/fonts/tinymce-small.ttf | Bin 9304 -> 0 bytes .../skins/lightgray/fonts/tinymce-small.woff | Bin 9380 -> 0 bytes .../tinymce/skins/lightgray/fonts/tinymce.eot | Bin 17572 -> 0 bytes .../skins/lightgray/fonts/tinymce.json | 3469 --- .../tinymce/skins/lightgray/fonts/tinymce.svg | 131 - .../tinymce/skins/lightgray/fonts/tinymce.ttf | Bin 17408 -> 0 bytes .../skins/lightgray/fonts/tinymce.woff | Bin 17484 -> 0 bytes .../js/tinymce/skins/lightgray/img/anchor.gif | Bin 53 -> 0 bytes .../js/tinymce/skins/lightgray/img/loader.gif | Bin 2608 -> 0 bytes .../js/tinymce/skins/lightgray/img/object.gif | Bin 152 -> 0 bytes .../js/tinymce/skins/lightgray/img/trans.gif | Bin 43 -> 0 bytes .../tinymce/skins/lightgray/skin.ie7.min.css | 1 - .../js/tinymce/skins/lightgray/skin.min.css | 1 - .../tinymce/skins/wordpress/images/audio.png | Bin 412 -> 0 bytes .../skins/wordpress/images/dashicon-edit.png | Bin 368 -> 0 bytes .../skins/wordpress/images/dashicon-no.png | Bin 339 -> 0 bytes .../skins/wordpress/images/embedded.png | Bin 8177 -> 0 bytes .../skins/wordpress/images/gallery-2x.png | Bin 447 -> 0 bytes .../skins/wordpress/images/gallery.png | Bin 379 -> 0 bytes .../skins/wordpress/images/more-2x.png | Bin 603 -> 0 bytes .../tinymce/skins/wordpress/images/more.png | Bin 414 -> 0 bytes .../skins/wordpress/images/pagebreak-2x.png | Bin 835 -> 0 bytes .../skins/wordpress/images/pagebreak.png | Bin 1140 -> 0 bytes .../skins/wordpress/images/playlist-audio.png | Bin 440 -> 0 bytes .../skins/wordpress/images/playlist-video.png | Bin 290 -> 0 bytes .../tinymce/skins/wordpress/images/video.png | Bin 363 -> 0 bytes .../js/tinymce/skins/wordpress/wp-content.css | 465 - .../js/tinymce/themes/inlite/theme.js | 1858 -- .../js/tinymce/themes/inlite/theme.min.js | 1 - .../js/tinymce/themes/modern/theme.js | 1342 -- .../js/tinymce/themes/modern/theme.min.js | 1 - wp/wp-includes/js/tinymce/tiny_mce_popup.js | 542 - wp/wp-includes/js/tinymce/tinymce.min.js | 14 - .../js/tinymce/utils/editable_selects.js | 70 - wp/wp-includes/js/tinymce/utils/form_utils.js | 210 - wp/wp-includes/js/tinymce/utils/mctabs.js | 164 - wp/wp-includes/js/tinymce/utils/validate.js | 252 - wp/wp-includes/js/tinymce/wp-tinymce.js.gz | Bin 182840 -> 0 bytes wp/wp-includes/js/tinymce/wp-tinymce.php | 39 - wp/wp-includes/js/tw-sack.js | 193 - wp/wp-includes/js/tw-sack.min.js | 1 - wp/wp-includes/js/twemoji.js | 566 - wp/wp-includes/js/twemoji.min.js | 1 - wp/wp-includes/js/underscore.min.js | 5 - wp/wp-includes/js/utils.js | 197 - wp/wp-includes/js/utils.min.js | 1 - wp/wp-includes/js/wp-a11y.js | 88 - wp/wp-includes/js/wp-a11y.min.js | 1 - wp/wp-includes/js/wp-ajax-response.js | 64 - wp/wp-includes/js/wp-ajax-response.min.js | 1 - wp/wp-includes/js/wp-api.js | 1395 -- wp/wp-includes/js/wp-api.min.js | 1 - wp/wp-includes/js/wp-auth-check.js | 117 - wp/wp-includes/js/wp-auth-check.min.js | 1 - wp/wp-includes/js/wp-backbone.js | 386 - wp/wp-includes/js/wp-backbone.min.js | 1 - wp/wp-includes/js/wp-custom-header.js | 450 - wp/wp-includes/js/wp-custom-header.min.js | 1 - wp/wp-includes/js/wp-embed-template.js | 212 - wp/wp-includes/js/wp-embed-template.min.js | 1 - wp/wp-includes/js/wp-embed.js | 121 - wp/wp-includes/js/wp-embed.min.js | 1 - wp/wp-includes/js/wp-emoji-loader.js | 155 - wp/wp-includes/js/wp-emoji-loader.min.js | 1 - wp/wp-includes/js/wp-emoji-release.min.js | 4 - wp/wp-includes/js/wp-emoji.js | 229 - wp/wp-includes/js/wp-emoji.min.js | 1 - wp/wp-includes/js/wp-list-revisions.js | 24 - wp/wp-includes/js/wp-list-revisions.min.js | 1 - wp/wp-includes/js/wp-lists.js | 854 - wp/wp-includes/js/wp-lists.min.js | 1 - wp/wp-includes/js/wp-pointer.js | 282 - wp/wp-includes/js/wp-pointer.min.js | 1 - wp/wp-includes/js/wp-util.js | 124 - wp/wp-includes/js/wp-util.min.js | 1 - wp/wp-includes/js/wpdialog.js | 19 - wp/wp-includes/js/wpdialog.min.js | 1 - wp/wp-includes/js/wplink.js | 779 - wp/wp-includes/js/wplink.min.js | 1 - wp/wp-includes/js/zxcvbn-async.js | 18 - wp/wp-includes/js/zxcvbn-async.min.js | 1 - wp/wp-includes/js/zxcvbn.min.js | 47 - wp/wp-includes/kses.php | 1824 -- wp/wp-includes/l10n.php | 1326 -- wp/wp-includes/link-template.php | 4146 ---- wp/wp-includes/load.php | 1074 - wp/wp-includes/locale.php | 10 - wp/wp-includes/media-template.php | 1269 -- wp/wp-includes/media.php | 3919 ---- wp/wp-includes/meta.php | 1211 -- wp/wp-includes/ms-blogs.php | 1287 -- wp/wp-includes/ms-default-constants.php | 164 - wp/wp-includes/ms-default-filters.php | 97 - wp/wp-includes/ms-deprecated.php | 515 - wp/wp-includes/ms-files.php | 83 - wp/wp-includes/ms-functions.php | 2488 --- wp/wp-includes/ms-load.php | 558 - wp/wp-includes/ms-settings.php | 114 - wp/wp-includes/nav-menu-template.php | 536 - wp/wp-includes/nav-menu.php | 979 - wp/wp-includes/option.php | 2012 -- wp/wp-includes/pluggable-deprecated.php | 208 - wp/wp-includes/pluggable.php | 2513 --- wp/wp-includes/plugin.php | 910 - wp/wp-includes/pomo/entry.php | 93 - wp/wp-includes/pomo/mo.php | 323 - wp/wp-includes/pomo/po.php | 446 - wp/wp-includes/pomo/streams.php | 315 - wp/wp-includes/pomo/translations.php | 358 - wp/wp-includes/post-formats.php | 254 - wp/wp-includes/post-template.php | 1817 -- wp/wp-includes/post-thumbnail-template.php | 253 - wp/wp-includes/post.php | 6219 ------ wp/wp-includes/query.php | 941 - .../random_compat/byte_safe_strings.php | 173 - wp/wp-includes/random_compat/cast_to_int.php | 71 - .../random_compat/error_polyfill.php | 42 - wp/wp-includes/random_compat/random.php | 217 - .../random_compat/random_bytes_com_dotnet.php | 81 - .../random_bytes_dev_urandom.php | 148 - .../random_compat/random_bytes_libsodium.php | 86 - .../random_bytes_libsodium_legacy.php | 86 - .../random_compat/random_bytes_mcrypt.php | 76 - .../random_compat/random_bytes_openssl.php | 83 - wp/wp-includes/random_compat/random_int.php | 191 - wp/wp-includes/registration-functions.php | 7 - wp/wp-includes/registration.php | 7 - wp/wp-includes/rest-api.php | 1195 -- .../rest-api/class-wp-rest-request.php | 1035 - .../rest-api/class-wp-rest-response.php | 305 - .../rest-api/class-wp-rest-server.php | 1312 -- .../class-wp-rest-attachments-controller.php | 754 - .../class-wp-rest-comments-controller.php | 1635 -- .../endpoints/class-wp-rest-controller.php | 603 - ...class-wp-rest-post-statuses-controller.php | 318 - .../class-wp-rest-post-types-controller.php | 282 - .../class-wp-rest-posts-controller.php | 2267 -- .../class-wp-rest-revisions-controller.php | 578 - .../class-wp-rest-settings-controller.php | 319 - .../class-wp-rest-taxonomies-controller.php | 323 - .../class-wp-rest-terms-controller.php | 1022 - .../class-wp-rest-users-controller.php | 1386 -- .../class-wp-rest-comment-meta-fields.php | 42 - .../fields/class-wp-rest-meta-fields.php | 470 - .../fields/class-wp-rest-post-meta-fields.php | 65 - .../fields/class-wp-rest-term-meta-fields.php | 63 - .../fields/class-wp-rest-user-meta-fields.php | 42 - wp/wp-includes/revision.php | 727 - wp/wp-includes/rewrite.php | 599 - wp/wp-includes/rss-functions.php | 9 - wp/wp-includes/rss.php | 954 - wp/wp-includes/script-loader.php | 1362 -- wp/wp-includes/session.php | 11 - wp/wp-includes/shortcodes.php | 654 - wp/wp-includes/taxonomy.php | 4225 ---- wp/wp-includes/template-loader.php | 82 - wp/wp-includes/template.php | 688 - wp/wp-includes/theme-compat/comments.php | 71 - wp/wp-includes/theme-compat/embed-404.php | 36 - wp/wp-includes/theme-compat/embed-content.php | 117 - wp/wp-includes/theme-compat/embed.php | 23 - wp/wp-includes/theme-compat/footer-embed.php | 21 - wp/wp-includes/theme-compat/footer.php | 40 - wp/wp-includes/theme-compat/header-embed.php | 32 - wp/wp-includes/theme-compat/header.php | 57 - wp/wp-includes/theme-compat/sidebar.php | 114 - wp/wp-includes/theme.php | 3060 --- wp/wp-includes/update.php | 732 - wp/wp-includes/user.php | 2533 --- wp/wp-includes/vars.php | 141 - wp/wp-includes/version.php | 35 - wp/wp-includes/widgets.php | 1475 -- .../widgets/class-wp-nav-menu-widget.php | 159 - .../widgets/class-wp-widget-archives.php | 165 - .../widgets/class-wp-widget-calendar.php | 108 - .../widgets/class-wp-widget-categories.php | 174 - .../widgets/class-wp-widget-links.php | 166 - .../widgets/class-wp-widget-meta.php | 114 - .../widgets/class-wp-widget-pages.php | 151 - .../class-wp-widget-recent-comments.php | 178 - .../widgets/class-wp-widget-recent-posts.php | 142 - .../widgets/class-wp-widget-rss.php | 128 - .../widgets/class-wp-widget-search.php | 93 - .../widgets/class-wp-widget-tag-cloud.php | 184 - .../widgets/class-wp-widget-text.php | 118 - wp/wp-includes/wlwmanifest.xml | 43 - wp/wp-includes/wp-db.php | 3340 --- wp/wp-includes/wp-diff.php | 21 - wp/wp-links-opml.php | 83 - wp/wp-load.php | 93 - wp/wp-login.php | 984 - wp/wp-mail.php | 253 - wp/wp-settings.php | 470 - wp/wp-signup.php | 903 - wp/wp-trackback.php | 141 - wp/xmlrpc.php | 101 - 2711 files changed, 3815 insertions(+), 667632 deletions(-) delete mode 100755 .htaccess-sample rename {wp/wp-content/themes/dns2015 => dns2015}/404.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/dns-logo-web.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/dns-logo-web_flipped.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/dns_logo_emblem_sort.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/dns_logo_white.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/dns_logo_white_newsletter.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/icons/contact_card.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/icons/crowd.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/icons/facebook.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/icons/facebook.svg (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/icons/flickr.svg (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/icons/instagram.svg (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/icons/location.svg (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/icons/microphone.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/icons/twitter.svg (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/images/piggies.jpg (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/scripts/app.js (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/styles/_accessibility.scss (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/styles/_buttons.scss (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/styles/_footer.scss (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/styles/_forms.scss (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/styles/_frontpage.scss (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/styles/_general.scss (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/styles/_header.scss (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/styles/_menu.scss (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/styles/_mixins.scss (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/styles/_pages_and_posts.scss (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/app/styles/app.scss (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/audioplayer.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/bower.json (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/cal/not_empty (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/dns-logo-web.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/dns-logo-web_flipped.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/dns_logo_emblem_sort.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/dns_logo_white.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/dns_logo_white_newsletter.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/icons/contact_card.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/icons/crowd.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/icons/facebook.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/icons/facebook.svg (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/icons/flickr.svg (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/icons/instagram.svg (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/icons/location.svg (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/icons/microphone.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/icons/twitter.svg (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/images/piggies.jpg (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/scripts/app.js (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/scripts/vendor.js (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/dist/styles/app.css (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/event-meta.php (100%) rename favicon.ico => dns2015/favicon.ico (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/browserconfig.xml (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-114.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-120.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-144.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-150.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-152.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-16.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-160.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-180.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-192.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-310.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-32.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-57.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-60.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-64.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-70.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-72.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-76.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon-96.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/favicons/favicon.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/flickr-facebook.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/footer.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/fp-articles.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/fp-call-to-actions.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/fp-events.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/fp-featured.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/fp-studentmedia.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/front-page.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/functions.php (99%) rename {wp/wp-content/themes/dns2015 => dns2015}/gulpfile.js (93%) rename {wp/wp-content/themes/dns2015 => dns2015}/header-infoscreen.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/header.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/inc/iCalcreator.class.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/index.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/languages/dns2015.pot (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/languages/nb_NO.mo (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/languages/nb_NO.po (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/loop-page-full-width.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/loop-page.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/loop-post-full-width.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/loop-single.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/loop-taxonomy-event_type.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/loop.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/menu.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/newsletter-signup-form.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/package.json (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/page-templates/page-associations.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/page-templates/page-event-next.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/page-templates/page-feed-articles.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/page-templates/page-feed-events-upcoming.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/page-templates/page-full-width.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/page-templates/page-ical.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/page-templates/page-image-galleries.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/page-templates/page-info-daily-program.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/page-templates/page-live.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/page-templates/page-newsletter-mailchimp.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/page-templates/page-program.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/page.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/program-6days.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/screenshot.png (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/scripts/program-ical-regen.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/sidebar.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/single-association.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/single-event.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/single.php (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/style.css (100%) rename {wp/wp-content/themes/dns2015 => dns2015}/taxonomy-event_type.php (100%) create mode 100644 fabfile.py delete mode 100755 index.php rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/404.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/audioplayer.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/cal/.gitignore (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/css/grid.css (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/css/lightbox.css (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/css/rebuild.css (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/css/reset.css (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/css/wp.css (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/digest.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/eventmeta-single.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/eventmeta.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/eventslider.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/flickr-facebook.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/flowplayer-3.2.6.min.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/flowplayer-3.2.7.swf (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/flowplayer.controls-3.2.5.swf (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/footer.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/front-page.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/functions.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/header-infoscreen.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/header.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/home.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/iCalcreator.class.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/ajax-loader.gif (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/arrow-down.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/bannerindex-400.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/bannerindex-800.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/bird_twitter.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/blank.gif (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/bullet.gif (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/close.gif (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/closelabel.gif (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/dns-logo-web.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/dns-logo-web_flipped.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/dns_logo_emblem_sort.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/donate-button.gif (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/download-icon.gif (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/facebook-icon.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/gradient.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/ikon_debatt-50x50.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/ikon_fest-50x50.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/ikon_film-50x50.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/ikon_foredrag-50x50.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/ikon_konsert-50x50.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/ikon_nyheter-35x35.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/ikon_nyheter-50x50.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/ikon_quiz-50x50.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/ikon_teater-50x50.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/ikon_tiles-35x35.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/ikon_tiles-50x50.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/intern1.jpeg (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/listevisning.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/loading.gif (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/logo-rn-x86.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/logo-rn.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/logo-svart-hvit.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/logo-web.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/logo-web.png.bak (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/next.gif (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/nextlabel.gif (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/oktoberfest-small.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/orange-fade.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/pig.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/piggies.jpg (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/prev.gif (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/prevlabel.gif (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/sirkel.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/sponsors/akademika.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/sponsors/logo_black_akademika.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/sponsors/logo_black_nrf.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/sponsors/logo_black_uio.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/sponsors/logo_red_akademika.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/sponsors/logo_sh86.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/sponsors/logo_uio86.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/sponsors/nrf-86x86.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/svart-200x.gif (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/testingtile.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/tilesvisning.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/img/uk.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/index.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/application.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/front-page.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/html5shiv.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/jquery-1.7.1.min.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/jquery.cycle.all.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/knockout-2.0.0.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/knockout-2.3.0.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/lang/nb.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/moment.min.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/neuf/eventProgram.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/neuf/util/date-nb-NO.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/neuf/util/util.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/program.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/underscore-min.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/js/underscore.js (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/kampanje/afm_2011.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/kampanje/kroplingen.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/kampanje/semesterstart2010.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/kampanje/studio_nedtelling.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/kampanje/studio_rocky.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/kampanje/studio_rocky.png (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/loop-event.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/loop-page-full-width.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/loop-page.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/loop-post-full-width.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/loop-single.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/loop-taxonomy-event_type.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/loop.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/menu.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/news-feed.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/newsletter-signup-form.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/page-foreningene.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/page-full-width.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/page-ical.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/page-image-galleries.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/page-info-daily-program.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/page-info-tweet.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/page-live.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/page-mailchimp-newsletter.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/page-neste-arrangement.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/page-newsletter.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/page-ninjanewsletter.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/page-program.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/page-syndikering-kommende-program.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/page.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/program-3days.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/program-6days.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/program-ical-regen.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/sidebar.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/single-event.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/single.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/studentmedia.php (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/style.css (100%) rename {wp/wp-content/themes/neuf-old-style => neuf-old-style}/taxonomy-event_type.php (100%) create mode 100644 plugins/neuf-associations/languages/neuf_assoc-nb_NO.mo create mode 100644 plugins/neuf-associations/languages/neuf_assoc-nb_NO.po create mode 100644 plugins/neuf-associations/languages/neuf_assoc.pot create mode 100644 plugins/neuf-associations/neuf-associations-admin.php create mode 100644 plugins/neuf-associations/neuf-associations-post-type.php create mode 100644 plugins/neuf-associations/neuf-associations.php rename wp/wp-content/plugins/duplicate-post/gpl-2.0.txt => plugins/neuf-events/LICENSE (100%) create mode 100644 plugins/neuf-events/languages/neuf_event-nb_NO.mo create mode 100644 plugins/neuf-events/languages/neuf_event-nb_NO.po create mode 100644 plugins/neuf-events/languages/neuf_event.pot create mode 100644 plugins/neuf-events/neuf-events-admin.php create mode 100644 plugins/neuf-events/neuf-events-json-controller.php create mode 100644 plugins/neuf-events/neuf-events-post-types.php create mode 100644 plugins/neuf-events/neuf-events-taxonomies.php create mode 100644 plugins/neuf-events/neuf-events.php create mode 100644 plugins/neuf-events/script/jquery-ui-timepicker-addon.js create mode 100644 plugins/neuf-events/script/jquery.validate.min.js create mode 100644 plugins/neuf-events/script/neuf_events.js create mode 100644 plugins/neuf-events/style/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 plugins/neuf-events/style/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 plugins/neuf-events/style/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 plugins/neuf-events/style/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 plugins/neuf-events/style/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 plugins/neuf-events/style/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 plugins/neuf-events/style/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 plugins/neuf-events/style/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 plugins/neuf-events/style/images/ui-icons_222222_256x240.png create mode 100644 plugins/neuf-events/style/images/ui-icons_2e83ff_256x240.png create mode 100644 plugins/neuf-events/style/images/ui-icons_454545_256x240.png create mode 100644 plugins/neuf-events/style/images/ui-icons_888888_256x240.png create mode 100644 plugins/neuf-events/style/images/ui-icons_cd0a0a_256x240.png create mode 100644 plugins/neuf-events/style/jquery-ui-timepicker-addon.css create mode 100644 plugins/neuf-events/style/jquery-ui.min.css delete mode 100644 wp/index.php delete mode 100644 wp/license.txt delete mode 100644 wp/readme.html delete mode 100644 wp/wp-activate.php delete mode 100644 wp/wp-admin/about.php delete mode 100644 wp/wp-admin/admin-ajax.php delete mode 100644 wp/wp-admin/admin-footer.php delete mode 100644 wp/wp-admin/admin-functions.php delete mode 100644 wp/wp-admin/admin-header.php delete mode 100644 wp/wp-admin/admin-post.php delete mode 100644 wp/wp-admin/admin.php delete mode 100644 wp/wp-admin/async-upload.php delete mode 100644 wp/wp-admin/comment.php delete mode 100644 wp/wp-admin/credits.php delete mode 100644 wp/wp-admin/css/about-rtl.css delete mode 100644 wp/wp-admin/css/about-rtl.min.css delete mode 100644 wp/wp-admin/css/about.css delete mode 100644 wp/wp-admin/css/about.min.css delete mode 100644 wp/wp-admin/css/admin-menu-rtl.css delete mode 100644 wp/wp-admin/css/admin-menu-rtl.min.css delete mode 100644 wp/wp-admin/css/admin-menu.css delete mode 100644 wp/wp-admin/css/admin-menu.min.css delete mode 100644 wp/wp-admin/css/color-picker-rtl.css delete mode 100644 wp/wp-admin/css/color-picker-rtl.min.css delete mode 100644 wp/wp-admin/css/color-picker.css delete mode 100644 wp/wp-admin/css/color-picker.min.css delete mode 100644 wp/wp-admin/css/colors/_admin.scss delete mode 100644 wp/wp-admin/css/colors/_mixins.scss delete mode 100644 wp/wp-admin/css/colors/_variables.scss delete mode 100644 wp/wp-admin/css/colors/blue/colors-rtl.css delete mode 100644 wp/wp-admin/css/colors/blue/colors-rtl.min.css delete mode 100644 wp/wp-admin/css/colors/blue/colors.css delete mode 100644 wp/wp-admin/css/colors/blue/colors.min.css delete mode 100644 wp/wp-admin/css/colors/blue/colors.scss delete mode 100644 wp/wp-admin/css/colors/coffee/colors-rtl.css delete mode 100644 wp/wp-admin/css/colors/coffee/colors-rtl.min.css delete mode 100644 wp/wp-admin/css/colors/coffee/colors.css delete mode 100644 wp/wp-admin/css/colors/coffee/colors.min.css delete mode 100644 wp/wp-admin/css/colors/coffee/colors.scss delete mode 100644 wp/wp-admin/css/colors/ectoplasm/colors-rtl.css delete mode 100644 wp/wp-admin/css/colors/ectoplasm/colors-rtl.min.css delete mode 100644 wp/wp-admin/css/colors/ectoplasm/colors.css delete mode 100644 wp/wp-admin/css/colors/ectoplasm/colors.min.css delete mode 100644 wp/wp-admin/css/colors/ectoplasm/colors.scss delete mode 100644 wp/wp-admin/css/colors/light/colors-rtl.css delete mode 100644 wp/wp-admin/css/colors/light/colors-rtl.min.css delete mode 100644 wp/wp-admin/css/colors/light/colors.css delete mode 100644 wp/wp-admin/css/colors/light/colors.min.css delete mode 100644 wp/wp-admin/css/colors/light/colors.scss delete mode 100644 wp/wp-admin/css/colors/midnight/colors-rtl.css delete mode 100644 wp/wp-admin/css/colors/midnight/colors-rtl.min.css delete mode 100644 wp/wp-admin/css/colors/midnight/colors.css delete mode 100644 wp/wp-admin/css/colors/midnight/colors.min.css delete mode 100644 wp/wp-admin/css/colors/midnight/colors.scss delete mode 100644 wp/wp-admin/css/colors/ocean/colors-rtl.css delete mode 100644 wp/wp-admin/css/colors/ocean/colors-rtl.min.css delete mode 100644 wp/wp-admin/css/colors/ocean/colors.css delete mode 100644 wp/wp-admin/css/colors/ocean/colors.min.css delete mode 100644 wp/wp-admin/css/colors/ocean/colors.scss delete mode 100644 wp/wp-admin/css/colors/sunrise/colors-rtl.css delete mode 100644 wp/wp-admin/css/colors/sunrise/colors-rtl.min.css delete mode 100644 wp/wp-admin/css/colors/sunrise/colors.css delete mode 100644 wp/wp-admin/css/colors/sunrise/colors.min.css delete mode 100644 wp/wp-admin/css/colors/sunrise/colors.scss delete mode 100644 wp/wp-admin/css/common-rtl.css delete mode 100644 wp/wp-admin/css/common-rtl.min.css delete mode 100644 wp/wp-admin/css/common.css delete mode 100644 wp/wp-admin/css/common.min.css delete mode 100644 wp/wp-admin/css/customize-controls-rtl.css delete mode 100644 wp/wp-admin/css/customize-controls-rtl.min.css delete mode 100644 wp/wp-admin/css/customize-controls.css delete mode 100644 wp/wp-admin/css/customize-controls.min.css delete mode 100644 wp/wp-admin/css/customize-nav-menus-rtl.css delete mode 100644 wp/wp-admin/css/customize-nav-menus-rtl.min.css delete mode 100644 wp/wp-admin/css/customize-nav-menus.css delete mode 100644 wp/wp-admin/css/customize-nav-menus.min.css delete mode 100644 wp/wp-admin/css/customize-widgets-rtl.css delete mode 100644 wp/wp-admin/css/customize-widgets-rtl.min.css delete mode 100644 wp/wp-admin/css/customize-widgets.css delete mode 100644 wp/wp-admin/css/customize-widgets.min.css delete mode 100644 wp/wp-admin/css/dashboard-rtl.css delete mode 100644 wp/wp-admin/css/dashboard-rtl.min.css delete mode 100644 wp/wp-admin/css/dashboard.css delete mode 100644 wp/wp-admin/css/dashboard.min.css delete mode 100644 wp/wp-admin/css/deprecated-media-rtl.css delete mode 100644 wp/wp-admin/css/deprecated-media-rtl.min.css delete mode 100644 wp/wp-admin/css/deprecated-media.css delete mode 100644 wp/wp-admin/css/deprecated-media.min.css delete mode 100644 wp/wp-admin/css/edit-rtl.css delete mode 100644 wp/wp-admin/css/edit-rtl.min.css delete mode 100644 wp/wp-admin/css/edit.css delete mode 100644 wp/wp-admin/css/edit.min.css delete mode 100644 wp/wp-admin/css/farbtastic-rtl.css delete mode 100644 wp/wp-admin/css/farbtastic-rtl.min.css delete mode 100644 wp/wp-admin/css/farbtastic.css delete mode 100644 wp/wp-admin/css/farbtastic.min.css delete mode 100644 wp/wp-admin/css/forms-rtl.css delete mode 100644 wp/wp-admin/css/forms-rtl.min.css delete mode 100644 wp/wp-admin/css/forms.css delete mode 100644 wp/wp-admin/css/forms.min.css delete mode 100644 wp/wp-admin/css/ie-rtl.css delete mode 100644 wp/wp-admin/css/ie-rtl.min.css delete mode 100644 wp/wp-admin/css/ie.css delete mode 100644 wp/wp-admin/css/ie.min.css delete mode 100644 wp/wp-admin/css/install-rtl.css delete mode 100644 wp/wp-admin/css/install-rtl.min.css delete mode 100644 wp/wp-admin/css/install.css delete mode 100644 wp/wp-admin/css/install.min.css delete mode 100644 wp/wp-admin/css/l10n-rtl.css delete mode 100644 wp/wp-admin/css/l10n-rtl.min.css delete mode 100644 wp/wp-admin/css/l10n.css delete mode 100644 wp/wp-admin/css/l10n.min.css delete mode 100644 wp/wp-admin/css/list-tables-rtl.css delete mode 100644 wp/wp-admin/css/list-tables-rtl.min.css delete mode 100644 wp/wp-admin/css/list-tables.css delete mode 100644 wp/wp-admin/css/list-tables.min.css delete mode 100644 wp/wp-admin/css/login-rtl.css delete mode 100644 wp/wp-admin/css/login-rtl.min.css delete mode 100644 wp/wp-admin/css/login.css delete mode 100644 wp/wp-admin/css/login.min.css delete mode 100644 wp/wp-admin/css/media-rtl.css delete mode 100644 wp/wp-admin/css/media-rtl.min.css delete mode 100644 wp/wp-admin/css/media.css delete mode 100644 wp/wp-admin/css/media.min.css delete mode 100644 wp/wp-admin/css/nav-menus-rtl.css delete mode 100644 wp/wp-admin/css/nav-menus-rtl.min.css delete mode 100644 wp/wp-admin/css/nav-menus.css delete mode 100644 wp/wp-admin/css/nav-menus.min.css delete mode 100644 wp/wp-admin/css/press-this-editor-rtl.css delete mode 100644 wp/wp-admin/css/press-this-editor-rtl.min.css delete mode 100644 wp/wp-admin/css/press-this-editor.css delete mode 100644 wp/wp-admin/css/press-this-editor.min.css delete mode 100644 wp/wp-admin/css/press-this-rtl.css delete mode 100644 wp/wp-admin/css/press-this-rtl.min.css delete mode 100644 wp/wp-admin/css/press-this.css delete mode 100644 wp/wp-admin/css/press-this.min.css delete mode 100644 wp/wp-admin/css/revisions-rtl.css delete mode 100644 wp/wp-admin/css/revisions-rtl.min.css delete mode 100644 wp/wp-admin/css/revisions.css delete mode 100644 wp/wp-admin/css/revisions.min.css delete mode 100644 wp/wp-admin/css/site-icon-rtl.css delete mode 100644 wp/wp-admin/css/site-icon-rtl.min.css delete mode 100644 wp/wp-admin/css/site-icon.css delete mode 100644 wp/wp-admin/css/site-icon.min.css delete mode 100644 wp/wp-admin/css/themes-rtl.css delete mode 100644 wp/wp-admin/css/themes-rtl.min.css delete mode 100644 wp/wp-admin/css/themes.css delete mode 100644 wp/wp-admin/css/themes.min.css delete mode 100644 wp/wp-admin/css/widgets-rtl.css delete mode 100644 wp/wp-admin/css/widgets-rtl.min.css delete mode 100644 wp/wp-admin/css/widgets.css delete mode 100644 wp/wp-admin/css/widgets.min.css delete mode 100644 wp/wp-admin/css/wp-admin-rtl.css delete mode 100644 wp/wp-admin/css/wp-admin-rtl.min.css delete mode 100644 wp/wp-admin/css/wp-admin.css delete mode 100644 wp/wp-admin/css/wp-admin.min.css delete mode 100644 wp/wp-admin/custom-background.php delete mode 100644 wp/wp-admin/custom-header.php delete mode 100644 wp/wp-admin/customize.php delete mode 100644 wp/wp-admin/edit-comments.php delete mode 100644 wp/wp-admin/edit-form-advanced.php delete mode 100644 wp/wp-admin/edit-form-comment.php delete mode 100644 wp/wp-admin/edit-link-form.php delete mode 100644 wp/wp-admin/edit-tag-form.php delete mode 100644 wp/wp-admin/edit-tags.php delete mode 100644 wp/wp-admin/edit.php delete mode 100644 wp/wp-admin/export.php delete mode 100644 wp/wp-admin/freedoms.php delete mode 100644 wp/wp-admin/images/align-center-2x.png delete mode 100644 wp/wp-admin/images/align-center.png delete mode 100644 wp/wp-admin/images/align-left-2x.png delete mode 100644 wp/wp-admin/images/align-left.png delete mode 100644 wp/wp-admin/images/align-none-2x.png delete mode 100644 wp/wp-admin/images/align-none.png delete mode 100644 wp/wp-admin/images/align-right-2x.png delete mode 100644 wp/wp-admin/images/align-right.png delete mode 100644 wp/wp-admin/images/arrows-2x.png delete mode 100644 wp/wp-admin/images/arrows.png delete mode 100644 wp/wp-admin/images/browser-rtl.png delete mode 100644 wp/wp-admin/images/browser.png delete mode 100644 wp/wp-admin/images/bubble_bg-2x.gif delete mode 100644 wp/wp-admin/images/bubble_bg.gif delete mode 100644 wp/wp-admin/images/comment-grey-bubble-2x.png delete mode 100644 wp/wp-admin/images/comment-grey-bubble.png delete mode 100644 wp/wp-admin/images/date-button-2x.gif delete mode 100644 wp/wp-admin/images/date-button.gif delete mode 100644 wp/wp-admin/images/generic.png delete mode 100644 wp/wp-admin/images/icons32-2x.png delete mode 100644 wp/wp-admin/images/icons32-vs-2x.png delete mode 100644 wp/wp-admin/images/icons32-vs.png delete mode 100644 wp/wp-admin/images/icons32.png delete mode 100644 wp/wp-admin/images/imgedit-icons-2x.png delete mode 100644 wp/wp-admin/images/imgedit-icons.png delete mode 100644 wp/wp-admin/images/list-2x.png delete mode 100644 wp/wp-admin/images/list.png delete mode 100644 wp/wp-admin/images/loading.gif delete mode 100644 wp/wp-admin/images/marker.png delete mode 100644 wp/wp-admin/images/mask.png delete mode 100644 wp/wp-admin/images/media-button-2x.png delete mode 100644 wp/wp-admin/images/media-button-image.gif delete mode 100644 wp/wp-admin/images/media-button-music.gif delete mode 100644 wp/wp-admin/images/media-button-other.gif delete mode 100644 wp/wp-admin/images/media-button-video.gif delete mode 100644 wp/wp-admin/images/media-button.png delete mode 100644 wp/wp-admin/images/menu-2x.png delete mode 100644 wp/wp-admin/images/menu-vs-2x.png delete mode 100644 wp/wp-admin/images/menu-vs.png delete mode 100644 wp/wp-admin/images/menu.png delete mode 100644 wp/wp-admin/images/no.png delete mode 100644 wp/wp-admin/images/post-formats-vs.png delete mode 100644 wp/wp-admin/images/post-formats.png delete mode 100644 wp/wp-admin/images/post-formats32-vs.png delete mode 100644 wp/wp-admin/images/post-formats32.png delete mode 100644 wp/wp-admin/images/resize-2x.gif delete mode 100644 wp/wp-admin/images/resize-rtl-2x.gif delete mode 100644 wp/wp-admin/images/resize-rtl.gif delete mode 100644 wp/wp-admin/images/resize.gif delete mode 100644 wp/wp-admin/images/se.png delete mode 100644 wp/wp-admin/images/sort-2x.gif delete mode 100644 wp/wp-admin/images/sort.gif delete mode 100644 wp/wp-admin/images/spinner-2x.gif delete mode 100644 wp/wp-admin/images/spinner.gif delete mode 100644 wp/wp-admin/images/stars-2x.png delete mode 100644 wp/wp-admin/images/stars.png delete mode 100644 wp/wp-admin/images/w-logo-blue.png delete mode 100644 wp/wp-admin/images/w-logo-white.png delete mode 100644 wp/wp-admin/images/wheel.png delete mode 100644 wp/wp-admin/images/wordpress-logo-white.svg delete mode 100644 wp/wp-admin/images/wordpress-logo.png delete mode 100644 wp/wp-admin/images/wordpress-logo.svg delete mode 100644 wp/wp-admin/images/wpspin_light-2x.gif delete mode 100644 wp/wp-admin/images/wpspin_light.gif delete mode 100644 wp/wp-admin/images/xit-2x.gif delete mode 100644 wp/wp-admin/images/xit.gif delete mode 100644 wp/wp-admin/images/yes.png delete mode 100644 wp/wp-admin/import.php delete mode 100644 wp/wp-admin/includes/admin-filters.php delete mode 100644 wp/wp-admin/includes/admin.php delete mode 100644 wp/wp-admin/includes/ajax-actions.php delete mode 100644 wp/wp-admin/includes/bookmark.php delete mode 100644 wp/wp-admin/includes/class-automatic-upgrader-skin.php delete mode 100644 wp/wp-admin/includes/class-bulk-plugin-upgrader-skin.php delete mode 100644 wp/wp-admin/includes/class-bulk-theme-upgrader-skin.php delete mode 100644 wp/wp-admin/includes/class-bulk-upgrader-skin.php delete mode 100644 wp/wp-admin/includes/class-core-upgrader.php delete mode 100644 wp/wp-admin/includes/class-file-upload-upgrader.php delete mode 100644 wp/wp-admin/includes/class-ftp-pure.php delete mode 100644 wp/wp-admin/includes/class-ftp-sockets.php delete mode 100644 wp/wp-admin/includes/class-ftp.php delete mode 100644 wp/wp-admin/includes/class-language-pack-upgrader-skin.php delete mode 100644 wp/wp-admin/includes/class-language-pack-upgrader.php delete mode 100644 wp/wp-admin/includes/class-pclzip.php delete mode 100644 wp/wp-admin/includes/class-plugin-installer-skin.php delete mode 100644 wp/wp-admin/includes/class-plugin-upgrader-skin.php delete mode 100644 wp/wp-admin/includes/class-plugin-upgrader.php delete mode 100644 wp/wp-admin/includes/class-theme-installer-skin.php delete mode 100644 wp/wp-admin/includes/class-theme-upgrader-skin.php delete mode 100644 wp/wp-admin/includes/class-theme-upgrader.php delete mode 100644 wp/wp-admin/includes/class-walker-category-checklist.php delete mode 100644 wp/wp-admin/includes/class-walker-nav-menu-checklist.php delete mode 100644 wp/wp-admin/includes/class-walker-nav-menu-edit.php delete mode 100644 wp/wp-admin/includes/class-wp-ajax-upgrader-skin.php delete mode 100644 wp/wp-admin/includes/class-wp-automatic-updater.php delete mode 100644 wp/wp-admin/includes/class-wp-comments-list-table.php delete mode 100644 wp/wp-admin/includes/class-wp-filesystem-base.php delete mode 100644 wp/wp-admin/includes/class-wp-filesystem-direct.php delete mode 100644 wp/wp-admin/includes/class-wp-filesystem-ftpext.php delete mode 100644 wp/wp-admin/includes/class-wp-filesystem-ftpsockets.php delete mode 100644 wp/wp-admin/includes/class-wp-filesystem-ssh2.php delete mode 100644 wp/wp-admin/includes/class-wp-importer.php delete mode 100644 wp/wp-admin/includes/class-wp-internal-pointers.php delete mode 100644 wp/wp-admin/includes/class-wp-links-list-table.php delete mode 100644 wp/wp-admin/includes/class-wp-list-table-compat.php delete mode 100644 wp/wp-admin/includes/class-wp-list-table.php delete mode 100644 wp/wp-admin/includes/class-wp-media-list-table.php delete mode 100644 wp/wp-admin/includes/class-wp-ms-sites-list-table.php delete mode 100644 wp/wp-admin/includes/class-wp-ms-themes-list-table.php delete mode 100644 wp/wp-admin/includes/class-wp-ms-users-list-table.php delete mode 100644 wp/wp-admin/includes/class-wp-plugin-install-list-table.php delete mode 100644 wp/wp-admin/includes/class-wp-plugins-list-table.php delete mode 100644 wp/wp-admin/includes/class-wp-post-comments-list-table.php delete mode 100644 wp/wp-admin/includes/class-wp-posts-list-table.php delete mode 100644 wp/wp-admin/includes/class-wp-press-this.php delete mode 100644 wp/wp-admin/includes/class-wp-screen.php delete mode 100644 wp/wp-admin/includes/class-wp-site-icon.php delete mode 100644 wp/wp-admin/includes/class-wp-terms-list-table.php delete mode 100644 wp/wp-admin/includes/class-wp-theme-install-list-table.php delete mode 100644 wp/wp-admin/includes/class-wp-themes-list-table.php delete mode 100644 wp/wp-admin/includes/class-wp-upgrader-skin.php delete mode 100644 wp/wp-admin/includes/class-wp-upgrader-skins.php delete mode 100644 wp/wp-admin/includes/class-wp-upgrader.php delete mode 100644 wp/wp-admin/includes/class-wp-users-list-table.php delete mode 100644 wp/wp-admin/includes/comment.php delete mode 100644 wp/wp-admin/includes/continents-cities.php delete mode 100644 wp/wp-admin/includes/credits.php delete mode 100644 wp/wp-admin/includes/dashboard.php delete mode 100644 wp/wp-admin/includes/deprecated.php delete mode 100644 wp/wp-admin/includes/edit-tag-messages.php delete mode 100644 wp/wp-admin/includes/export.php delete mode 100644 wp/wp-admin/includes/file.php delete mode 100644 wp/wp-admin/includes/image-edit.php delete mode 100644 wp/wp-admin/includes/image.php delete mode 100644 wp/wp-admin/includes/import.php delete mode 100644 wp/wp-admin/includes/list-table.php delete mode 100644 wp/wp-admin/includes/media.php delete mode 100644 wp/wp-admin/includes/menu.php delete mode 100644 wp/wp-admin/includes/meta-boxes.php delete mode 100644 wp/wp-admin/includes/misc.php delete mode 100644 wp/wp-admin/includes/ms-admin-filters.php delete mode 100644 wp/wp-admin/includes/ms-deprecated.php delete mode 100644 wp/wp-admin/includes/ms.php delete mode 100644 wp/wp-admin/includes/nav-menu.php delete mode 100644 wp/wp-admin/includes/network.php delete mode 100644 wp/wp-admin/includes/noop.php delete mode 100644 wp/wp-admin/includes/options.php delete mode 100644 wp/wp-admin/includes/plugin-install.php delete mode 100644 wp/wp-admin/includes/plugin.php delete mode 100644 wp/wp-admin/includes/post.php delete mode 100644 wp/wp-admin/includes/revision.php delete mode 100644 wp/wp-admin/includes/schema.php delete mode 100644 wp/wp-admin/includes/screen.php delete mode 100644 wp/wp-admin/includes/taxonomy.php delete mode 100644 wp/wp-admin/includes/template.php delete mode 100644 wp/wp-admin/includes/theme-install.php delete mode 100644 wp/wp-admin/includes/theme.php delete mode 100644 wp/wp-admin/includes/translation-install.php delete mode 100644 wp/wp-admin/includes/update-core.php delete mode 100644 wp/wp-admin/includes/update.php delete mode 100644 wp/wp-admin/includes/upgrade.php delete mode 100644 wp/wp-admin/includes/user.php delete mode 100644 wp/wp-admin/includes/widgets.php delete mode 100644 wp/wp-admin/index.php delete mode 100644 wp/wp-admin/install-helper.php delete mode 100644 wp/wp-admin/install.php delete mode 100644 wp/wp-admin/js/accordion.js delete mode 100644 wp/wp-admin/js/accordion.min.js delete mode 100644 wp/wp-admin/js/bookmarklet.js delete mode 100644 wp/wp-admin/js/bookmarklet.min.js delete mode 100644 wp/wp-admin/js/color-picker.js delete mode 100644 wp/wp-admin/js/color-picker.min.js delete mode 100644 wp/wp-admin/js/comment.js delete mode 100644 wp/wp-admin/js/comment.min.js delete mode 100644 wp/wp-admin/js/common.js delete mode 100644 wp/wp-admin/js/common.min.js delete mode 100644 wp/wp-admin/js/custom-background.js delete mode 100644 wp/wp-admin/js/custom-background.min.js delete mode 100644 wp/wp-admin/js/custom-header.js delete mode 100644 wp/wp-admin/js/customize-controls.js delete mode 100644 wp/wp-admin/js/customize-controls.min.js delete mode 100644 wp/wp-admin/js/customize-nav-menus.js delete mode 100644 wp/wp-admin/js/customize-nav-menus.min.js delete mode 100644 wp/wp-admin/js/customize-widgets.js delete mode 100644 wp/wp-admin/js/customize-widgets.min.js delete mode 100644 wp/wp-admin/js/dashboard.js delete mode 100644 wp/wp-admin/js/dashboard.min.js delete mode 100644 wp/wp-admin/js/edit-comments.js delete mode 100644 wp/wp-admin/js/edit-comments.min.js delete mode 100644 wp/wp-admin/js/editor-expand.js delete mode 100644 wp/wp-admin/js/editor-expand.min.js delete mode 100644 wp/wp-admin/js/editor.js delete mode 100644 wp/wp-admin/js/editor.min.js delete mode 100644 wp/wp-admin/js/farbtastic.js delete mode 100644 wp/wp-admin/js/gallery.js delete mode 100644 wp/wp-admin/js/gallery.min.js delete mode 100644 wp/wp-admin/js/image-edit.js delete mode 100644 wp/wp-admin/js/image-edit.min.js delete mode 100644 wp/wp-admin/js/inline-edit-post.js delete mode 100644 wp/wp-admin/js/inline-edit-post.min.js delete mode 100644 wp/wp-admin/js/inline-edit-tax.js delete mode 100644 wp/wp-admin/js/inline-edit-tax.min.js delete mode 100644 wp/wp-admin/js/iris.min.js delete mode 100644 wp/wp-admin/js/language-chooser.js delete mode 100644 wp/wp-admin/js/language-chooser.min.js delete mode 100644 wp/wp-admin/js/link.js delete mode 100644 wp/wp-admin/js/link.min.js delete mode 100644 wp/wp-admin/js/media-gallery.js delete mode 100644 wp/wp-admin/js/media-gallery.min.js delete mode 100644 wp/wp-admin/js/media-upload.js delete mode 100644 wp/wp-admin/js/media-upload.min.js delete mode 100644 wp/wp-admin/js/media.js delete mode 100644 wp/wp-admin/js/media.min.js delete mode 100644 wp/wp-admin/js/nav-menu.js delete mode 100644 wp/wp-admin/js/nav-menu.min.js delete mode 100644 wp/wp-admin/js/password-strength-meter.js delete mode 100644 wp/wp-admin/js/password-strength-meter.min.js delete mode 100644 wp/wp-admin/js/plugin-install.js delete mode 100644 wp/wp-admin/js/plugin-install.min.js delete mode 100644 wp/wp-admin/js/post.js delete mode 100644 wp/wp-admin/js/post.min.js delete mode 100644 wp/wp-admin/js/postbox.js delete mode 100644 wp/wp-admin/js/postbox.min.js delete mode 100644 wp/wp-admin/js/press-this.js delete mode 100644 wp/wp-admin/js/press-this.min.js delete mode 100644 wp/wp-admin/js/revisions.js delete mode 100644 wp/wp-admin/js/revisions.min.js delete mode 100644 wp/wp-admin/js/set-post-thumbnail.js delete mode 100644 wp/wp-admin/js/set-post-thumbnail.min.js delete mode 100644 wp/wp-admin/js/svg-painter.js delete mode 100644 wp/wp-admin/js/svg-painter.min.js delete mode 100644 wp/wp-admin/js/tags-box.js delete mode 100644 wp/wp-admin/js/tags-box.min.js delete mode 100644 wp/wp-admin/js/tags-suggest.js delete mode 100644 wp/wp-admin/js/tags-suggest.min.js delete mode 100644 wp/wp-admin/js/tags.js delete mode 100644 wp/wp-admin/js/tags.min.js delete mode 100644 wp/wp-admin/js/theme.js delete mode 100644 wp/wp-admin/js/theme.min.js delete mode 100644 wp/wp-admin/js/updates.js delete mode 100644 wp/wp-admin/js/updates.min.js delete mode 100644 wp/wp-admin/js/user-profile.js delete mode 100644 wp/wp-admin/js/user-profile.min.js delete mode 100644 wp/wp-admin/js/user-suggest.js delete mode 100644 wp/wp-admin/js/user-suggest.min.js delete mode 100644 wp/wp-admin/js/widgets.js delete mode 100644 wp/wp-admin/js/widgets.min.js delete mode 100644 wp/wp-admin/js/word-count.js delete mode 100644 wp/wp-admin/js/word-count.min.js delete mode 100644 wp/wp-admin/js/wp-fullscreen-stub.js delete mode 100644 wp/wp-admin/js/wp-fullscreen-stub.min.js delete mode 100644 wp/wp-admin/js/xfn.js delete mode 100644 wp/wp-admin/js/xfn.min.js delete mode 100644 wp/wp-admin/link-add.php delete mode 100644 wp/wp-admin/link-manager.php delete mode 100644 wp/wp-admin/link-parse-opml.php delete mode 100644 wp/wp-admin/link.php delete mode 100644 wp/wp-admin/load-scripts.php delete mode 100644 wp/wp-admin/load-styles.php delete mode 100644 wp/wp-admin/maint/repair.php delete mode 100644 wp/wp-admin/media-new.php delete mode 100644 wp/wp-admin/media-upload.php delete mode 100644 wp/wp-admin/media.php delete mode 100644 wp/wp-admin/menu-header.php delete mode 100644 wp/wp-admin/menu.php delete mode 100644 wp/wp-admin/moderation.php delete mode 100644 wp/wp-admin/ms-admin.php delete mode 100644 wp/wp-admin/ms-delete-site.php delete mode 100644 wp/wp-admin/ms-edit.php delete mode 100644 wp/wp-admin/ms-options.php delete mode 100644 wp/wp-admin/ms-sites.php delete mode 100644 wp/wp-admin/ms-themes.php delete mode 100644 wp/wp-admin/ms-upgrade-network.php delete mode 100644 wp/wp-admin/ms-users.php delete mode 100644 wp/wp-admin/my-sites.php delete mode 100644 wp/wp-admin/nav-menus.php delete mode 100644 wp/wp-admin/network.php delete mode 100644 wp/wp-admin/network/about.php delete mode 100644 wp/wp-admin/network/admin.php delete mode 100644 wp/wp-admin/network/credits.php delete mode 100644 wp/wp-admin/network/edit.php delete mode 100644 wp/wp-admin/network/freedoms.php delete mode 100644 wp/wp-admin/network/index.php delete mode 100644 wp/wp-admin/network/menu.php delete mode 100644 wp/wp-admin/network/plugin-editor.php delete mode 100644 wp/wp-admin/network/plugin-install.php delete mode 100644 wp/wp-admin/network/plugins.php delete mode 100644 wp/wp-admin/network/profile.php delete mode 100644 wp/wp-admin/network/settings.php delete mode 100644 wp/wp-admin/network/setup.php delete mode 100644 wp/wp-admin/network/site-info.php delete mode 100644 wp/wp-admin/network/site-new.php delete mode 100644 wp/wp-admin/network/site-settings.php delete mode 100644 wp/wp-admin/network/site-themes.php delete mode 100644 wp/wp-admin/network/site-users.php delete mode 100644 wp/wp-admin/network/sites.php delete mode 100644 wp/wp-admin/network/theme-editor.php delete mode 100644 wp/wp-admin/network/theme-install.php delete mode 100644 wp/wp-admin/network/themes.php delete mode 100644 wp/wp-admin/network/update-core.php delete mode 100644 wp/wp-admin/network/update.php delete mode 100644 wp/wp-admin/network/upgrade.php delete mode 100644 wp/wp-admin/network/user-edit.php delete mode 100644 wp/wp-admin/network/user-new.php delete mode 100644 wp/wp-admin/network/users.php delete mode 100644 wp/wp-admin/options-discussion.php delete mode 100644 wp/wp-admin/options-general.php delete mode 100644 wp/wp-admin/options-head.php delete mode 100644 wp/wp-admin/options-media.php delete mode 100644 wp/wp-admin/options-permalink.php delete mode 100644 wp/wp-admin/options-reading.php delete mode 100644 wp/wp-admin/options-writing.php delete mode 100644 wp/wp-admin/options.php delete mode 100644 wp/wp-admin/plugin-editor.php delete mode 100644 wp/wp-admin/plugin-install.php delete mode 100644 wp/wp-admin/plugins.php delete mode 100644 wp/wp-admin/post-new.php delete mode 100644 wp/wp-admin/post.php delete mode 100644 wp/wp-admin/press-this.php delete mode 100644 wp/wp-admin/profile.php delete mode 100644 wp/wp-admin/revision.php delete mode 100644 wp/wp-admin/setup-config.php delete mode 100644 wp/wp-admin/term.php delete mode 100644 wp/wp-admin/theme-editor.php delete mode 100644 wp/wp-admin/theme-install.php delete mode 100644 wp/wp-admin/themes.php delete mode 100644 wp/wp-admin/tools.php delete mode 100644 wp/wp-admin/update-core.php delete mode 100644 wp/wp-admin/update.php delete mode 100644 wp/wp-admin/upgrade-functions.php delete mode 100644 wp/wp-admin/upgrade.php delete mode 100644 wp/wp-admin/upload.php delete mode 100644 wp/wp-admin/user-edit.php delete mode 100644 wp/wp-admin/user-new.php delete mode 100644 wp/wp-admin/user/about.php delete mode 100644 wp/wp-admin/user/admin.php delete mode 100644 wp/wp-admin/user/credits.php delete mode 100644 wp/wp-admin/user/freedoms.php delete mode 100644 wp/wp-admin/user/index.php delete mode 100644 wp/wp-admin/user/menu.php delete mode 100644 wp/wp-admin/user/profile.php delete mode 100644 wp/wp-admin/user/user-edit.php delete mode 100644 wp/wp-admin/users.php delete mode 100644 wp/wp-admin/widgets.php delete mode 100644 wp/wp-blog-header.php delete mode 100644 wp/wp-comments-post.php delete mode 100644 wp/wp-config-sample.php delete mode 100644 wp/wp-content/index.php delete mode 100644 wp/wp-content/languages/admin-nb_NO.mo delete mode 100644 wp/wp-content/languages/admin-nb_NO.po delete mode 100644 wp/wp-content/languages/admin-network-nb_NO.mo delete mode 100644 wp/wp-content/languages/admin-network-nb_NO.po delete mode 100644 wp/wp-content/languages/continents-cities-nb_NO.mo delete mode 100644 wp/wp-content/languages/continents-cities-nb_NO.po delete mode 100644 wp/wp-content/languages/ms-nb_NO.mo delete mode 100644 wp/wp-content/languages/ms-nb_NO.po delete mode 100644 wp/wp-content/languages/nb_NO.mo delete mode 100644 wp/wp-content/languages/nb_NO.php delete mode 100644 wp/wp-content/languages/nb_NO.po delete mode 100644 wp/wp-content/languages/plugins/akismet-nb_NO.mo delete mode 100644 wp/wp-content/languages/plugins/akismet-nb_NO.po delete mode 100644 wp/wp-content/languages/plugins/wordpress-seo-nb_NO.mo delete mode 100644 wp/wp-content/languages/plugins/wordpress-seo-nb_NO.po delete mode 100644 wp/wp-content/languages/themes/twentyeleven-nb_NO.mo delete mode 100644 wp/wp-content/languages/themes/twentyeleven-nb_NO.po delete mode 100644 wp/wp-content/languages/themes/twentyfifteen-nb_NO.mo delete mode 100644 wp/wp-content/languages/themes/twentyfifteen-nb_NO.po delete mode 100644 wp/wp-content/languages/themes/twentyfourteen-nb_NO.mo delete mode 100644 wp/wp-content/languages/themes/twentyfourteen-nb_NO.po delete mode 100644 wp/wp-content/languages/themes/twentyseventeen-nb_NO.mo delete mode 100644 wp/wp-content/languages/themes/twentyseventeen-nb_NO.po delete mode 100644 wp/wp-content/languages/themes/twentysixteen-nb_NO.mo delete mode 100644 wp/wp-content/languages/themes/twentysixteen-nb_NO.po delete mode 100644 wp/wp-content/languages/themes/twentyten-nb_NO.mo delete mode 100644 wp/wp-content/languages/themes/twentyten-nb_NO.po delete mode 100644 wp/wp-content/languages/themes/twentythirteen-nb_NO.mo delete mode 100644 wp/wp-content/languages/themes/twentythirteen-nb_NO.po delete mode 100644 wp/wp-content/languages/themes/twentytwelve-nb_NO.mo delete mode 100644 wp/wp-content/languages/themes/twentytwelve-nb_NO.po delete mode 100644 wp/wp-content/object-cache.php delete mode 100644 wp/wp-content/plugins/debug-bar/css/debug-bar.css delete mode 100644 wp/wp-content/plugins/debug-bar/css/debug-bar.dev.css delete mode 100644 wp/wp-content/plugins/debug-bar/debug-bar.php delete mode 100644 wp/wp-content/plugins/debug-bar/js/debug-bar-js.dev.js delete mode 100644 wp/wp-content/plugins/debug-bar/js/debug-bar-js.js delete mode 100644 wp/wp-content/plugins/debug-bar/js/debug-bar.dev.js delete mode 100644 wp/wp-content/plugins/debug-bar/js/debug-bar.js delete mode 100644 wp/wp-content/plugins/debug-bar/js/ui-dockable.dev.js delete mode 100644 wp/wp-content/plugins/debug-bar/js/ui-dockable.js delete mode 100644 wp/wp-content/plugins/debug-bar/panels/class-debug-bar-deprecated.php delete mode 100644 wp/wp-content/plugins/debug-bar/panels/class-debug-bar-js.php delete mode 100644 wp/wp-content/plugins/debug-bar/panels/class-debug-bar-object-cache.php delete mode 100644 wp/wp-content/plugins/debug-bar/panels/class-debug-bar-panel.php delete mode 100644 wp/wp-content/plugins/debug-bar/panels/class-debug-bar-php.php delete mode 100644 wp/wp-content/plugins/debug-bar/panels/class-debug-bar-queries.php delete mode 100644 wp/wp-content/plugins/debug-bar/panels/class-debug-bar-request.php delete mode 100644 wp/wp-content/plugins/debug-bar/panels/class-debug-bar-wp-query.php delete mode 100644 wp/wp-content/plugins/debug-bar/readme.txt delete mode 100644 wp/wp-content/plugins/disable-comments/disable-comments.php delete mode 100644 wp/wp-content/plugins/disable-comments/includes/comments-template.php delete mode 100644 wp/wp-content/plugins/disable-comments/includes/settings-page.php delete mode 100644 wp/wp-content/plugins/disable-comments/includes/tools-page.php delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-de_DE.mo delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-de_DE.po delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-es_ES.mo delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-es_ES.po delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-fa_ir.mo delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-fa_ir.po delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-fr_FR.mo delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-fr_FR.po delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-id_ID.mo delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-id_ID.po delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-pl_PL.mo delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-pl_PL.po delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-pt_BR.mo delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-pt_BR.po delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-ru_RU.mo delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-ru_RU.po delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-vi.mo delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-vi.po delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-vi_VI.mo delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-vi_VI.po delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-zh_TW.mo delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments-zh_TW.po delete mode 100644 wp/wp-content/plugins/disable-comments/languages/disable-comments.pot delete mode 100644 wp/wp-content/plugins/disable-comments/readme.txt delete mode 100644 wp/wp-content/plugins/disable-comments/uninstall.php delete mode 100644 wp/wp-content/plugins/duplicate-post/compat/duplicate-post-jetpack.php delete mode 100644 wp/wp-content/plugins/duplicate-post/compat/duplicate-post-wpml.php delete mode 100644 wp/wp-content/plugins/duplicate-post/donate.png delete mode 100644 wp/wp-content/plugins/duplicate-post/duplicate-post-admin.php delete mode 100644 wp/wp-content/plugins/duplicate-post/duplicate-post-common.php delete mode 100644 wp/wp-content/plugins/duplicate-post/duplicate-post-options.php delete mode 100644 wp/wp-content/plugins/duplicate-post/duplicate-post.css delete mode 100644 wp/wp-content/plugins/duplicate-post/duplicate-post.php delete mode 100644 wp/wp-content/plugins/duplicate-post/readme.txt delete mode 100644 wp/wp-content/plugins/index.php delete mode 100644 wp/wp-content/plugins/json-api/controllers/core.php delete mode 100644 wp/wp-content/plugins/json-api/controllers/posts.php delete mode 100644 wp/wp-content/plugins/json-api/controllers/respond.php delete mode 100644 wp/wp-content/plugins/json-api/controllers/widgets.php delete mode 100644 wp/wp-content/plugins/json-api/json-api.php delete mode 100644 wp/wp-content/plugins/json-api/library/JSON.php delete mode 100644 wp/wp-content/plugins/json-api/models/attachment.php delete mode 100644 wp/wp-content/plugins/json-api/models/author.php delete mode 100644 wp/wp-content/plugins/json-api/models/category.php delete mode 100644 wp/wp-content/plugins/json-api/models/comment.php delete mode 100644 wp/wp-content/plugins/json-api/models/post.php delete mode 100644 wp/wp-content/plugins/json-api/models/tag.php delete mode 100644 wp/wp-content/plugins/json-api/readme.txt delete mode 100644 wp/wp-content/plugins/json-api/screenshot-1.png delete mode 100644 wp/wp-content/plugins/json-api/singletons/api.php delete mode 100644 wp/wp-content/plugins/json-api/singletons/introspector.php delete mode 100644 wp/wp-content/plugins/json-api/singletons/query.php delete mode 100644 wp/wp-content/plugins/json-api/singletons/response.php delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_author_index-01.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_author_posts-01.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_author_posts-02.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_author_posts-03.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_category_index-01.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_category_posts-01.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_date_index-01.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_date_posts-01.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_date_posts-02.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_date_posts-03.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_page-01.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_page-02.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_post-01.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_posts-01.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_posts-02.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_posts-03.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_recent_posts-01.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_recent_posts-02.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_recent_posts-03.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_search_posts-01.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_tag_index-01.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.get_tag_posts-01.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.info-01.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/core.info-02.phpt delete mode 100644 wp/wp-content/plugins/json-api/tests/query-01.phpt delete mode 160000 wp/wp-content/plugins/neuf-associations delete mode 160000 wp/wp-content/plugins/neuf-events delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/black/colorbox.css delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/black/images/close.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/black/images/loading.gif delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/black/images/nextblack.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/black/images/prevblack.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/blue/colorbox.css delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/blue/images/close.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/blue/images/loading.gif delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/blue/images/nextblue.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/blue/images/prevblue.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/dark/colorbox.css delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/dark/images/controls.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/dark/images/loading.gif delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/colorbox-ie.php delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/colorbox.css delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/border.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/controls.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderBottomCenter.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderBottomLeft.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderBottomRight.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderMiddleLeft.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderMiddleRight.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderTopCenter.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderTopLeft.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderTopRight.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderBottomCenter.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderBottomLeft.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderBottomRight.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderMiddleLeft.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderMiddleRight.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderTopCenter.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderTopLeft.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderTopRight.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/loading.gif delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/loading_background.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/elegant/images/overlay.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/framed/colorbox.css delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/framed/images/border.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/framed/images/controls.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/framed/images/loading.gif delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/framed/images/loading_background.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/green/colorbox.css delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/green/images/close.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/green/images/loading.gif delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/green/images/nextgreen.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/green/images/prevgreen.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/grey/colorbox.css delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/grey/images/close.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/grey/images/loading.gif delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/grey/images/nextgrey.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/grey/images/prevgrey.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/lightweight/colorbox.css delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/lightweight/images/controls.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/lightweight/images/loading.gif delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/purple/colorbox.css delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/purple/images/close.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/purple/images/loading.gif delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/purple/images/nextpurple.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/purple/images/prevpurple.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/red/colorbox.css delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/red/images/close.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/red/images/loading.gif delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/red/images/nextred.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/red/images/prevred.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/colorbox-ie.php delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/colorbox.css delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/border1.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/border2.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderBottomCenter.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderBottomLeft.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderBottomRight.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderMiddleLeft.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderMiddleRight.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderTopCenter.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderTopLeft.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderTopRight.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderBottomCenter.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderBottomLeft.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderBottomRight.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderMiddleLeft.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderMiddleRight.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderTopCenter.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderTopLeft.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderTopRight.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/loading.gif delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/teal/colorbox.css delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/teal/images/close.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/teal/images/loading.gif delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/teal/images/nextteal.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/teal/images/prevteal.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/white/colorbox.css delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/white/images/close.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/white/images/loading.gif delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/white/images/nextwhite.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/white/images/prevwhite.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/yellow/colorbox.css delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/yellow/images/close.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/yellow/images/loading.gif delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/yellow/images/nextyellow.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/css/yellow/images/prevyellow.png delete mode 100644 wp/wp-content/plugins/neuf-lightbox/js/gallery-colorbox.js delete mode 100644 wp/wp-content/plugins/neuf-lightbox/js/jquery.colorbox-min.js delete mode 100644 wp/wp-content/plugins/neuf-lightbox/neuf-lightbox.php delete mode 100644 wp/wp-content/plugins/neuf-lostpassword/neuf-lostpassword.php delete mode 100644 wp/wp-content/plugins/redis-cache/includes/admin-page.css delete mode 100644 wp/wp-content/plugins/redis-cache/includes/admin-page.php delete mode 100644 wp/wp-content/plugins/redis-cache/includes/diagnostics.php delete mode 100644 wp/wp-content/plugins/redis-cache/includes/object-cache.php delete mode 100644 wp/wp-content/plugins/redis-cache/includes/predis.php delete mode 100644 wp/wp-content/plugins/redis-cache/includes/servers-list.php delete mode 100644 wp/wp-content/plugins/redis-cache/includes/wp-cli-commands.php delete mode 100644 wp/wp-content/plugins/redis-cache/languages/redis-cache.pot delete mode 100644 wp/wp-content/plugins/redis-cache/readme.txt delete mode 100644 wp/wp-content/plugins/redis-cache/redis-cache.php delete mode 100644 wp/wp-content/plugins/redis-cache/uninstall.php delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/jquery-ui/jquery.ui.progressbar.min.1.7.2.js delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/jquery-ui/jquery.ui.progressbar.min.js delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/jquery-ui/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/jquery-ui/redmond/images/ui-bg_flat_55_fbec88_40x100.png delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/jquery-ui/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/jquery-ui/redmond/images/ui-bg_glass_85_dfeffc_1x400.png delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/jquery-ui/redmond/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/jquery-ui/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/jquery-ui/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/jquery-ui/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/jquery-ui/redmond/jquery-ui-1.7.2.custom.css delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/readme.txt delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/regenerate-thumbnails.php delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/screenshot-1.png delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/screenshot-2.png delete mode 100644 wp/wp-content/plugins/regenerate-thumbnails/screenshot-3.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/images/animated-overlay.gif delete mode 100644 wp/wp-content/plugins/user-role-editor/css/images/ui-bg_flat_0_aaaaaa_40x100.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/images/ui-bg_flat_75_ffffff_40x100.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/images/ui-bg_glass_65_ffffff_1x400.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/images/ui-bg_glass_75_dadada_1x400.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/images/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/images/ui-icons_222222_256x240.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/images/ui-icons_2e83ff_256x240.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/images/ui-icons_454545_256x240.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/images/ui-icons_888888_256x240.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/images/ui-icons_cd0a0a_256x240.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/index.php delete mode 100644 wp/wp-content/plugins/user-role-editor/css/jquery-ui-1.10.4.custom.css delete mode 100644 wp/wp-content/plugins/user-role-editor/css/jquery-ui-1.10.4.custom.min.css delete mode 100644 wp/wp-content/plugins/user-role-editor/css/multiple-select.css delete mode 100644 wp/wp-content/plugins/user-role-editor/css/multiple-select.png delete mode 100644 wp/wp-content/plugins/user-role-editor/css/ure-admin.css delete mode 100644 wp/wp-content/plugins/user-role-editor/images/admin-menu-editor-pro.jpg delete mode 100644 wp/wp-content/plugins/user-role-editor/images/ajax-loader.gif delete mode 100644 wp/wp-content/plugins/user-role-editor/images/changelog-icon.png delete mode 100644 wp/wp-content/plugins/user-role-editor/images/donate-icon.png delete mode 100644 wp/wp-content/plugins/user-role-editor/images/faq-icon.png delete mode 100644 wp/wp-content/plugins/user-role-editor/images/help.png delete mode 100644 wp/wp-content/plugins/user-role-editor/images/index.php delete mode 100644 wp/wp-content/plugins/user-role-editor/images/remove-16.png delete mode 100644 wp/wp-content/plugins/user-role-editor/images/user-role-editor-icon.png delete mode 100644 wp/wp-content/plugins/user-role-editor/images/user-role-editor-page-icon.png delete mode 100644 wp/wp-content/plugins/user-role-editor/images/user-role-editor-pro-728x90.jpg delete mode 100644 wp/wp-content/plugins/user-role-editor/images/vladimir.png delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/advertisement.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/ajax-processor.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/assign-role.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/base-lib.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/bbpress.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/capabilities-groups-manager.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/capability.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/grant-roles.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/known-js-css-compatibility-issues.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/own-capabilities.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/protect-admin.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/role-additional-options.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/role-view.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/screen-help.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/task-queue.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/ure-lib.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/user-other-roles.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/user-role-editor.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/user-view.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/view.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/classes/woocommerce-capabilities.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/define-constants.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/index.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/loader.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/misc-support-stuff.php delete mode 100644 wp/wp-content/plugins/user-role-editor/includes/settings-template.php delete mode 100644 wp/wp-content/plugins/user-role-editor/index.php delete mode 100644 wp/wp-content/plugins/user-role-editor/js/index.php delete mode 100644 wp/wp-content/plugins/user-role-editor/js/jquery.multiple.select.js delete mode 100644 wp/wp-content/plugins/user-role-editor/js/ure-js.js delete mode 100644 wp/wp-content/plugins/user-role-editor/js/ure-user-profile-other-roles.js delete mode 100644 wp/wp-content/plugins/user-role-editor/js/ure-users.js delete mode 100644 wp/wp-content/plugins/user-role-editor/js/users-grant-roles.js delete mode 100644 wp/wp-content/plugins/user-role-editor/lang/index.php delete mode 100644 wp/wp-content/plugins/user-role-editor/lang/user-role-editor.pot delete mode 100644 wp/wp-content/plugins/user-role-editor/license.txt delete mode 100644 wp/wp-content/plugins/user-role-editor/readme.txt delete mode 100644 wp/wp-content/plugins/user-role-editor/screenshot-1.png delete mode 100644 wp/wp-content/plugins/user-role-editor/screenshot-2.png delete mode 100644 wp/wp-content/plugins/user-role-editor/screenshot-3.png delete mode 100644 wp/wp-content/plugins/user-role-editor/screenshot-4.png delete mode 100644 wp/wp-content/plugins/user-role-editor/screenshot-5.png delete mode 100644 wp/wp-content/plugins/user-role-editor/screenshot-6.png delete mode 100644 wp/wp-content/plugins/user-role-editor/uninstall.php delete mode 100644 wp/wp-content/plugins/user-role-editor/user-role-editor.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/ajax.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/ajax/class-recalculate-scores-ajax.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/ajax/class-shortcode-filter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-dismissable-notice.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-onpage-ajax.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-plugin-conflict-ajax.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-renderer.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-sidebar-renderer.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-sidebar.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-spot-renderer.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-spot.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-manager.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-admin-help-panel.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-admin-init.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-admin-user-profile.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-admin.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-asset.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-bulk-description-editor-list-table.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-bulk-editor-list-table.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-bulk-title-editor-list-table.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-config.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-cornerstone-field.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-cornerstone-filter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-cornerstone.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-customizer.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-export.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-help-center-item.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-help-center.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-import-aioseo.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-import-external.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-import-woothemes-seo.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-import-wpseo.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-import.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-meta-columns.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-option-tab.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-option-tabs-formatter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-option-tabs.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-plugin-availability.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-plugin-compatibility.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-plugin-conflict.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-premium-popup.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-primary-term-admin.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-product-upsell-notice.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-recalculate-scores.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-social-admin.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-social-facebook.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-stop-words.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-yoast-alerts.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-yoast-dashboard-widget.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-yoast-form.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notification-center.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notification.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/class-yoast-plugin-conflict.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-components.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-endpoint.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-options-adapter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-page.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-service.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-storage.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-structure.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-configuration-choices.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-connect-google-search-console.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-mailchimp-signup.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-suggestions.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/interface-component.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/factories/class-factory-post-type.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-choice-post-type.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-choice.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-company-logo.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-company-name.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-company-or-person.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-configuration-choices.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-connect-google-search-console.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-environment.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-mailchimp-signup.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-multiple-authors.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-person-name.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-post-type-visibility.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-facebook.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-googleplus.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-instagram.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-linkedin.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-myspace.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-pinterest.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-twitter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-youtube.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-separator.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-site-name.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-site-type.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-social-profiles-intro.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-success-message.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-suggestions.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-upsell-configuration-service.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-upsell-site-review.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/formatter/class-metabox-formatter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/formatter/class-post-metabox-formatter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/formatter/class-term-metabox-formatter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/formatter/interface-metabox-formatter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-ajax.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-bulk-action.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-category-filters.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-config.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-count.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-issue.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-issues.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-mapper.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-marker.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-modal.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-platform-tabs.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-service.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-settings.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-table.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/views/gsc-display.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/google_search_console/views/gsc-redirect-nopremium.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/import/class-import-aioseo-hooks.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/import/class-import-hooks.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/import/class-import-wpseo-hooks.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/index.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-add-keyword-tab.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-addon-section.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-readability.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-seo.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-editor.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-form-tab.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-tab-section.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-analysis.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-section.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-tab.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/onpage/class-onpage-option.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/onpage/class-onpage-request.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/onpage/class-onpage.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/pages/advanced.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/pages/dashboard.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/pages/licenses.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/pages/metas.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/pages/network.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/pages/social.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/pages/tools.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/pages/xml-sitemaps.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/recalculate/class-recalculate-posts.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/recalculate/class-recalculate-terms.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/recalculate/class-recalculate.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-columns.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-content-fields.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields-presenter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-metabox.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-settings-fields.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-social-fields.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/about.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-form-fieldset.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-input-select.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/dashboard-widget.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/form/fieldset.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/form/select.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/interface-yoast-form-element.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/js-templates-primary-term.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/partial-alerts-errors.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/partial-alerts-template.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/partial-alerts-warnings.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/partial-help-center-video.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/partial-settings-tab-video.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/advanced/breadcrumbs.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/advanced/permalinks.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/advanced/rss.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/dashboard.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/features.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/general.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/knowledge-graph.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/security.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/site-analysis.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/webmaster-tools.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/archives.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/general.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/home.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/other.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/post-types.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/taxonomies.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/exclude-post.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/general.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/post-types.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/taxonomies.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/user-sitemap.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/accounts.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/facebook.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/google.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/pinterest.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/twitterbox.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/import-seo.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-export.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-import.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tool-bulk-editor.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tool-file-editor.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/tool-import-export.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/admin/views/user-profile.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/admin-global-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/adminbar-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/alerts-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dashboard-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/admin-global-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/adminbar-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/alerts-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/dashboard-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/edit-page-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/featured-image-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/help-center-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/inside-editor-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/kb-search-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/metabox-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/select2/select2.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/snippet-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/yoast-components-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-471-rtl.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/edit-page-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/featured-image-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/help-center-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/inside-editor-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/kb-search-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/metabox-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/metabox-primary-category-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/snippet-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/toggle-switch-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/wpseo-dismissible-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/xml-sitemap-xsl.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/yoast-components-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/yoast-extensions-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/yst_plugin_tools-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/css/yst_seo_score-471.min.css delete mode 100644 wp/wp-content/plugins/wordpress-seo/deprecated/class-googleplus.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/deprecated/class-onpage-email-presenter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/deprecated/class-onpage-notifier.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/deprecated/class-snippet-preview.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/deprecated/class-yoast-textstatistics.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/frontend/class-breadcrumbs.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/frontend/class-frontend.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/frontend/class-json-ld.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/frontend/class-opengraph.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/frontend/class-primary-category.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/frontend/class-twitter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/frontend/index.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/Yoast_SEO_Icon.svg delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/basic-seo-training.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/configuration-service.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/keyword-research-training.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/local-seo-for-woocommerce.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/local-seo.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/news-seo.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/premium-seo.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/seo-care.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/seo-copywriting-training.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/site-structure-training.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/technical-seo-training.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/video-seo.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/website-review.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/woocommerce-seo.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/banner/yoast-seo-for-wordpress-training.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/editicon.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/extensions-local.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/extensions-news.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/extensions-premium-ribbon.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/extensions-video.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/extensions-woo.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/index.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/newsletter-collage.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/pinterest-23x30.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/question-mark.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/waiting.gif delete mode 100644 wp/wp-content/plugins/wordpress-seo/images/yoast-configuration-icon.svg delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/class-rewrite.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/class-upgrade.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-advanced-settings.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-features.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-installation.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-meta.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-primary-term.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-rank.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-replace-vars.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-shortlinker.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-statistics.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-utils.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/index.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-internallinks.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-ms.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-permalinks.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-rss.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-social.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-titles.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-wpseo.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-xml.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-options.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-taxonomy-meta.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-author-sitemap-provider.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-post-type-sitemap-provider.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-cache-data.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-image-parser.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-timezone.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-admin.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache-validator.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-renderer.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-router.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-taxonomy-sitemap-provider.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/sitemaps/interface-sitemap-cache-data.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/sitemaps/interface-sitemap-provider.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/wpseo-functions-deprecated.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/wpseo-functions.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/inc/wpseo-non-ajax-functions.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/index.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/configuration-wizard-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/jquery.tablesorter.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/ar.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/az.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/bg.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/ca.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/cs.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/da.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/de.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/el.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/en.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/es.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/et.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/eu.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/fa.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/fi.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/fr.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/gl.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/he.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/hi.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/hr.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/hu.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/id.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/is.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/it.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/ja.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/km.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/ko.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/lt.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/lv.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/mk.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/ms.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/nb.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/nl.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/pl.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/pt-BR.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/pt.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/ro.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/ru.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/sk.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/sr-Cyrl.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/sr.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/sv.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/th.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/tr.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/uk.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/vi.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/zh-CN.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/i18n/zh-TW.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/select2.full.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/select2/select2.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/wp-seo-admin-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/wp-seo-admin-global-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/wp-seo-admin-gsc-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/wp-seo-admin-media-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/wp-seo-bulk-editor-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/wp-seo-dismissible-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/wp-seo-featured-image-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/wp-seo-metabox-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/wp-seo-metabox-category-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/wp-seo-post-scraper-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/wp-seo-recalculate-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/wp-seo-replacevar-plugin-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/wp-seo-shortcode-plugin-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/js/dist/wp-seo-term-scraper-471.min.js delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/index.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-bg_BG.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-ca.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-cs_CZ.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-cy.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-da_DK.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-de_DE.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-en_AU.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-en_CA.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-en_GB.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-en_NZ.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-es_CL.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-es_ES.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-es_MX.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-es_VE.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-eu.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-fa_IR.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-fi.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-fr_FR.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-he_IL.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-hr.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-hu_HU.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-id_ID.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-it_IT.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-ja.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-nb_NO.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-nl_NL.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-pl_PL.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-pt_BR.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-pt_PT.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-ro_RO.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-ru_RU.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-sk_SK.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-sq.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-sv_SE.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-tr_TR.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-zh_CN.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-zh_HK.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/wordpress-seo-zh_TW.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-bg_BG.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-ca.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-cs_CZ.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-da_DK.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-de_DE.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-en_AU.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-en_CA.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-en_GB.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-en_NZ.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-es_CL.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-es_ES.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-es_MX.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-es_VE.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-eu.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-fa_IR.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-fi.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-fr_FR.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-he_IL.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-hr.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-hu_HU.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-id_ID.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-it_IT.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-ja.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-nb_NO.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-nl_NL.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-pl_PL.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-pt_BR.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-pt_PT.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-ro_RO.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-ru_RU.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-sk_SK.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-sq.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-sv_SE.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-tr_TR.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-zh_HK.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components-zh_TW.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-components.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-seo-js.json delete mode 100644 wp/wp-content/plugins/wordpress-seo/languages/yoast-seo-js.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/license.txt delete mode 100644 wp/wp-content/plugins/wordpress-seo/readme.txt delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/autoload.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/autoload_52.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/composer/ClassLoader.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/composer/ClassLoader52.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/composer/LICENSE delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/composer/autoload_classmap.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/composer/autoload_files.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/composer/autoload_namespaces.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/composer/autoload_psr4.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/composer/autoload_real.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/composer/autoload_real_52.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/composer/autoload_static.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/xrstf/composer-php52/LICENSE delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/xrstf/composer-php52/lib/xrstf/Composer52/AutoloadGenerator.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/xrstf/composer-php52/lib/xrstf/Composer52/ClassLoader.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/xrstf/composer-php52/lib/xrstf/Composer52/Generator.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/class-api-google-client.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/class-api-google.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/class-api-libs.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/Google_Client.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/auth/Google_AssertionCredentials.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/auth/Google_Auth.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/auth/Google_AuthNone.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/auth/Google_LoginTicket.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/auth/Google_OAuth2.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/auth/Google_P12Signer.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/auth/Google_PemVerifier.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/auth/Google_Signer.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/auth/Google_Verifier.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/cache/Google_Cache.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/cache/Google_WPCache.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/config.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/external/URITemplateParser.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/io/Google_CacheParser.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/io/Google_CurlIO.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/io/Google_HttpRequest.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/io/Google_IO.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/io/Google_REST.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/io/Google_WPIO.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/io/cacerts.pem delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/service/Google_BatchRequest.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/service/Google_MediaFileUpload.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/service/Google_Model.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/service/Google_Service.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/service/Google_ServiceResource.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/api-libs/google/service/Google_Utils.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/i18n-module/CHANGELOG.md delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/i18n-module/src/i18n-module-wordpressorg.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/i18n-module/src/i18n-module.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/license-manager/CHANGELOG.md delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/license-manager/class-api-request.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/license-manager/class-license-manager.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/license-manager/class-plugin-license-manager.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/license-manager/class-plugin-update-manager.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/license-manager/class-product.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/license-manager/class-update-manager.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/license-manager/index.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/license-manager/views/form.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/license-manager/views/index.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/license-manager/views/script.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/CHANGELOG.md delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/LICENSE delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/images/wp-message.png delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_Configuration.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_Host.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_MessageFormatter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_MessagesManager.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_RequirementsChecker.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_VersionRequirement.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/configs/default.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/configs/version.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/exceptions/Whip_EmptyProperty.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/exceptions/Whip_InvalidOperatorType.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/exceptions/Whip_InvalidType.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/exceptions/Whip_InvalidVersionComparisonString.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/facades/wordpress.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/interfaces/Whip_Message.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/interfaces/Whip_MessagePresenter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/interfaces/Whip_Requirement.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/interfaces/Whip_VersionDetector.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/messages/Whip_BasicMessage.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/messages/Whip_HostMessage.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/messages/Whip_InvalidVersionRequirementMessage.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/messages/Whip_NullMessage.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/messages/Whip_UpgradePhpMessage.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/presenters/Whip_WPMessagePresenter.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/ConfigurationTest.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/MessageTest.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/MessagesManagerTest.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/RequirementsCheckerTest.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/VersionRequirementTest.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/bootstrap.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/wp-seo-main.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/wp-seo.php delete mode 100644 wp/wp-content/plugins/wordpress-seo/wpml-config.xml delete mode 160000 wp/wp-content/plugins/wpdirauth delete mode 100644 wp/wp-content/themes/index.php delete mode 100644 wp/wp-content/themes/twentyfifteen/404.php delete mode 100644 wp/wp-content/themes/twentyfifteen/archive.php delete mode 100644 wp/wp-content/themes/twentyfifteen/author-bio.php delete mode 100644 wp/wp-content/themes/twentyfifteen/comments.php delete mode 100644 wp/wp-content/themes/twentyfifteen/content-link.php delete mode 100644 wp/wp-content/themes/twentyfifteen/content-none.php delete mode 100644 wp/wp-content/themes/twentyfifteen/content-page.php delete mode 100644 wp/wp-content/themes/twentyfifteen/content-search.php delete mode 100644 wp/wp-content/themes/twentyfifteen/content.php delete mode 100644 wp/wp-content/themes/twentyfifteen/css/editor-style.css delete mode 100644 wp/wp-content/themes/twentyfifteen/css/ie.css delete mode 100644 wp/wp-content/themes/twentyfifteen/css/ie7.css delete mode 100644 wp/wp-content/themes/twentyfifteen/footer.php delete mode 100644 wp/wp-content/themes/twentyfifteen/functions.php delete mode 100644 wp/wp-content/themes/twentyfifteen/genericons/COPYING.txt delete mode 100644 wp/wp-content/themes/twentyfifteen/genericons/Genericons.eot delete mode 100644 wp/wp-content/themes/twentyfifteen/genericons/Genericons.svg delete mode 100644 wp/wp-content/themes/twentyfifteen/genericons/Genericons.ttf delete mode 100644 wp/wp-content/themes/twentyfifteen/genericons/Genericons.woff delete mode 100644 wp/wp-content/themes/twentyfifteen/genericons/LICENSE.txt delete mode 100644 wp/wp-content/themes/twentyfifteen/genericons/README.md delete mode 100644 wp/wp-content/themes/twentyfifteen/genericons/genericons.css delete mode 100644 wp/wp-content/themes/twentyfifteen/header.php delete mode 100644 wp/wp-content/themes/twentyfifteen/image.php delete mode 100644 wp/wp-content/themes/twentyfifteen/inc/back-compat.php delete mode 100644 wp/wp-content/themes/twentyfifteen/inc/custom-header.php delete mode 100644 wp/wp-content/themes/twentyfifteen/inc/customizer.php delete mode 100644 wp/wp-content/themes/twentyfifteen/inc/template-tags.php delete mode 100644 wp/wp-content/themes/twentyfifteen/index.php delete mode 100644 wp/wp-content/themes/twentyfifteen/js/color-scheme-control.js delete mode 100644 wp/wp-content/themes/twentyfifteen/js/customize-preview.js delete mode 100644 wp/wp-content/themes/twentyfifteen/js/functions.js delete mode 100644 wp/wp-content/themes/twentyfifteen/js/html5.js delete mode 100644 wp/wp-content/themes/twentyfifteen/js/keyboard-image-navigation.js delete mode 100644 wp/wp-content/themes/twentyfifteen/js/skip-link-focus-fix.js delete mode 100644 wp/wp-content/themes/twentyfifteen/page.php delete mode 100644 wp/wp-content/themes/twentyfifteen/readme.txt delete mode 100644 wp/wp-content/themes/twentyfifteen/rtl.css delete mode 100644 wp/wp-content/themes/twentyfifteen/screenshot.png delete mode 100644 wp/wp-content/themes/twentyfifteen/search.php delete mode 100644 wp/wp-content/themes/twentyfifteen/sidebar.php delete mode 100644 wp/wp-content/themes/twentyfifteen/single.php delete mode 100644 wp/wp-content/themes/twentyfifteen/style.css delete mode 100644 wp/wp-content/themes/twentyfourteen/404.php delete mode 100644 wp/wp-content/themes/twentyfourteen/archive.php delete mode 100644 wp/wp-content/themes/twentyfourteen/author.php delete mode 100644 wp/wp-content/themes/twentyfourteen/category.php delete mode 100644 wp/wp-content/themes/twentyfourteen/comments.php delete mode 100644 wp/wp-content/themes/twentyfourteen/content-aside.php delete mode 100644 wp/wp-content/themes/twentyfourteen/content-audio.php delete mode 100644 wp/wp-content/themes/twentyfourteen/content-featured-post.php delete mode 100644 wp/wp-content/themes/twentyfourteen/content-gallery.php delete mode 100644 wp/wp-content/themes/twentyfourteen/content-image.php delete mode 100644 wp/wp-content/themes/twentyfourteen/content-link.php delete mode 100644 wp/wp-content/themes/twentyfourteen/content-none.php delete mode 100644 wp/wp-content/themes/twentyfourteen/content-page.php delete mode 100644 wp/wp-content/themes/twentyfourteen/content-quote.php delete mode 100644 wp/wp-content/themes/twentyfourteen/content-video.php delete mode 100644 wp/wp-content/themes/twentyfourteen/content.php delete mode 100644 wp/wp-content/themes/twentyfourteen/css/editor-style.css delete mode 100644 wp/wp-content/themes/twentyfourteen/css/ie.css delete mode 100644 wp/wp-content/themes/twentyfourteen/featured-content.php delete mode 100644 wp/wp-content/themes/twentyfourteen/footer.php delete mode 100644 wp/wp-content/themes/twentyfourteen/functions.php delete mode 100644 wp/wp-content/themes/twentyfourteen/genericons/COPYING.txt delete mode 100644 wp/wp-content/themes/twentyfourteen/genericons/Genericons-Regular.otf delete mode 100644 wp/wp-content/themes/twentyfourteen/genericons/LICENSE.txt delete mode 100644 wp/wp-content/themes/twentyfourteen/genericons/README.txt delete mode 100644 wp/wp-content/themes/twentyfourteen/genericons/font/genericons-regular-webfont.eot delete mode 100644 wp/wp-content/themes/twentyfourteen/genericons/font/genericons-regular-webfont.svg delete mode 100644 wp/wp-content/themes/twentyfourteen/genericons/font/genericons-regular-webfont.ttf delete mode 100644 wp/wp-content/themes/twentyfourteen/genericons/font/genericons-regular-webfont.woff delete mode 100644 wp/wp-content/themes/twentyfourteen/genericons/genericons.css delete mode 100644 wp/wp-content/themes/twentyfourteen/header.php delete mode 100644 wp/wp-content/themes/twentyfourteen/image.php delete mode 100644 wp/wp-content/themes/twentyfourteen/images/pattern-dark.svg delete mode 100644 wp/wp-content/themes/twentyfourteen/images/pattern-light.svg delete mode 100644 wp/wp-content/themes/twentyfourteen/inc/back-compat.php delete mode 100644 wp/wp-content/themes/twentyfourteen/inc/custom-header.php delete mode 100644 wp/wp-content/themes/twentyfourteen/inc/customizer.php delete mode 100644 wp/wp-content/themes/twentyfourteen/inc/featured-content.php delete mode 100644 wp/wp-content/themes/twentyfourteen/inc/template-tags.php delete mode 100644 wp/wp-content/themes/twentyfourteen/inc/widgets.php delete mode 100644 wp/wp-content/themes/twentyfourteen/index.php delete mode 100644 wp/wp-content/themes/twentyfourteen/js/customizer.js delete mode 100644 wp/wp-content/themes/twentyfourteen/js/featured-content-admin.js delete mode 100644 wp/wp-content/themes/twentyfourteen/js/functions.js delete mode 100644 wp/wp-content/themes/twentyfourteen/js/html5.js delete mode 100644 wp/wp-content/themes/twentyfourteen/js/keyboard-image-navigation.js delete mode 100644 wp/wp-content/themes/twentyfourteen/js/slider.js delete mode 100644 wp/wp-content/themes/twentyfourteen/page-templates/contributors.php delete mode 100644 wp/wp-content/themes/twentyfourteen/page-templates/full-width.php delete mode 100644 wp/wp-content/themes/twentyfourteen/page.php delete mode 100644 wp/wp-content/themes/twentyfourteen/readme.txt delete mode 100644 wp/wp-content/themes/twentyfourteen/rtl.css delete mode 100644 wp/wp-content/themes/twentyfourteen/screenshot.png delete mode 100644 wp/wp-content/themes/twentyfourteen/search.php delete mode 100644 wp/wp-content/themes/twentyfourteen/sidebar-content.php delete mode 100644 wp/wp-content/themes/twentyfourteen/sidebar-footer.php delete mode 100644 wp/wp-content/themes/twentyfourteen/sidebar.php delete mode 100644 wp/wp-content/themes/twentyfourteen/single.php delete mode 100644 wp/wp-content/themes/twentyfourteen/style.css delete mode 100644 wp/wp-content/themes/twentyfourteen/tag.php delete mode 100644 wp/wp-content/themes/twentyfourteen/taxonomy-post_format.php delete mode 100644 wp/wp-content/themes/twentythirteen/404.php delete mode 100644 wp/wp-content/themes/twentythirteen/archive.php delete mode 100644 wp/wp-content/themes/twentythirteen/author-bio.php delete mode 100644 wp/wp-content/themes/twentythirteen/author.php delete mode 100644 wp/wp-content/themes/twentythirteen/category.php delete mode 100644 wp/wp-content/themes/twentythirteen/comments.php delete mode 100644 wp/wp-content/themes/twentythirteen/content-aside.php delete mode 100644 wp/wp-content/themes/twentythirteen/content-audio.php delete mode 100644 wp/wp-content/themes/twentythirteen/content-chat.php delete mode 100644 wp/wp-content/themes/twentythirteen/content-gallery.php delete mode 100644 wp/wp-content/themes/twentythirteen/content-image.php delete mode 100644 wp/wp-content/themes/twentythirteen/content-link.php delete mode 100644 wp/wp-content/themes/twentythirteen/content-none.php delete mode 100644 wp/wp-content/themes/twentythirteen/content-quote.php delete mode 100644 wp/wp-content/themes/twentythirteen/content-status.php delete mode 100644 wp/wp-content/themes/twentythirteen/content-video.php delete mode 100644 wp/wp-content/themes/twentythirteen/content.php delete mode 100644 wp/wp-content/themes/twentythirteen/css/editor-style.css delete mode 100644 wp/wp-content/themes/twentythirteen/css/ie.css delete mode 100644 wp/wp-content/themes/twentythirteen/footer.php delete mode 100644 wp/wp-content/themes/twentythirteen/functions.php delete mode 100644 wp/wp-content/themes/twentythirteen/genericons/COPYING.txt delete mode 100644 wp/wp-content/themes/twentythirteen/genericons/Genericons-Regular.otf delete mode 100644 wp/wp-content/themes/twentythirteen/genericons/LICENSE.txt delete mode 100644 wp/wp-content/themes/twentythirteen/genericons/README.txt delete mode 100644 wp/wp-content/themes/twentythirteen/genericons/font/genericons-regular-webfont.eot delete mode 100644 wp/wp-content/themes/twentythirteen/genericons/font/genericons-regular-webfont.svg delete mode 100644 wp/wp-content/themes/twentythirteen/genericons/font/genericons-regular-webfont.ttf delete mode 100644 wp/wp-content/themes/twentythirteen/genericons/font/genericons-regular-webfont.woff delete mode 100644 wp/wp-content/themes/twentythirteen/genericons/genericons.css delete mode 100644 wp/wp-content/themes/twentythirteen/header.php delete mode 100644 wp/wp-content/themes/twentythirteen/image.php delete mode 100644 wp/wp-content/themes/twentythirteen/images/dotted-line-2x.png delete mode 100644 wp/wp-content/themes/twentythirteen/images/dotted-line-light-2x.png delete mode 100644 wp/wp-content/themes/twentythirteen/images/dotted-line-light.png delete mode 100644 wp/wp-content/themes/twentythirteen/images/dotted-line.png delete mode 100644 wp/wp-content/themes/twentythirteen/images/headers/circle-thumbnail.png delete mode 100644 wp/wp-content/themes/twentythirteen/images/headers/circle.png delete mode 100644 wp/wp-content/themes/twentythirteen/images/headers/diamond-thumbnail.png delete mode 100644 wp/wp-content/themes/twentythirteen/images/headers/diamond.png delete mode 100644 wp/wp-content/themes/twentythirteen/images/headers/star-thumbnail.png delete mode 100644 wp/wp-content/themes/twentythirteen/images/headers/star.png delete mode 100644 wp/wp-content/themes/twentythirteen/images/search-icon-2x.png delete mode 100644 wp/wp-content/themes/twentythirteen/images/search-icon.png delete mode 100644 wp/wp-content/themes/twentythirteen/inc/back-compat.php delete mode 100644 wp/wp-content/themes/twentythirteen/inc/custom-header.php delete mode 100644 wp/wp-content/themes/twentythirteen/index.php delete mode 100644 wp/wp-content/themes/twentythirteen/js/functions.js delete mode 100644 wp/wp-content/themes/twentythirteen/js/html5.js delete mode 100644 wp/wp-content/themes/twentythirteen/js/theme-customizer.js delete mode 100644 wp/wp-content/themes/twentythirteen/page.php delete mode 100644 wp/wp-content/themes/twentythirteen/readme.txt delete mode 100644 wp/wp-content/themes/twentythirteen/rtl.css delete mode 100644 wp/wp-content/themes/twentythirteen/screenshot.png delete mode 100644 wp/wp-content/themes/twentythirteen/search.php delete mode 100644 wp/wp-content/themes/twentythirteen/sidebar-main.php delete mode 100644 wp/wp-content/themes/twentythirteen/sidebar.php delete mode 100644 wp/wp-content/themes/twentythirteen/single.php delete mode 100644 wp/wp-content/themes/twentythirteen/style.css delete mode 100644 wp/wp-content/themes/twentythirteen/tag.php delete mode 100644 wp/wp-content/themes/twentythirteen/taxonomy-post_format.php delete mode 100644 wp/wp-content/themes/twentytwelve/404.php delete mode 100644 wp/wp-content/themes/twentytwelve/archive.php delete mode 100644 wp/wp-content/themes/twentytwelve/author.php delete mode 100644 wp/wp-content/themes/twentytwelve/category.php delete mode 100644 wp/wp-content/themes/twentytwelve/comments.php delete mode 100644 wp/wp-content/themes/twentytwelve/content-aside.php delete mode 100644 wp/wp-content/themes/twentytwelve/content-image.php delete mode 100644 wp/wp-content/themes/twentytwelve/content-link.php delete mode 100644 wp/wp-content/themes/twentytwelve/content-none.php delete mode 100644 wp/wp-content/themes/twentytwelve/content-page.php delete mode 100644 wp/wp-content/themes/twentytwelve/content-quote.php delete mode 100644 wp/wp-content/themes/twentytwelve/content-status.php delete mode 100644 wp/wp-content/themes/twentytwelve/content.php delete mode 100644 wp/wp-content/themes/twentytwelve/css/ie.css delete mode 100644 wp/wp-content/themes/twentytwelve/editor-style-rtl.css delete mode 100644 wp/wp-content/themes/twentytwelve/editor-style.css delete mode 100644 wp/wp-content/themes/twentytwelve/footer.php delete mode 100644 wp/wp-content/themes/twentytwelve/functions.php delete mode 100644 wp/wp-content/themes/twentytwelve/header.php delete mode 100644 wp/wp-content/themes/twentytwelve/image.php delete mode 100644 wp/wp-content/themes/twentytwelve/inc/custom-header.php delete mode 100644 wp/wp-content/themes/twentytwelve/index.php delete mode 100644 wp/wp-content/themes/twentytwelve/js/html5.js delete mode 100644 wp/wp-content/themes/twentytwelve/js/navigation.js delete mode 100644 wp/wp-content/themes/twentytwelve/js/theme-customizer.js delete mode 100644 wp/wp-content/themes/twentytwelve/page-templates/front-page.php delete mode 100644 wp/wp-content/themes/twentytwelve/page-templates/full-width.php delete mode 100644 wp/wp-content/themes/twentytwelve/page.php delete mode 100644 wp/wp-content/themes/twentytwelve/readme.txt delete mode 100644 wp/wp-content/themes/twentytwelve/rtl.css delete mode 100644 wp/wp-content/themes/twentytwelve/screenshot.png delete mode 100644 wp/wp-content/themes/twentytwelve/search.php delete mode 100644 wp/wp-content/themes/twentytwelve/sidebar-front.php delete mode 100644 wp/wp-content/themes/twentytwelve/sidebar.php delete mode 100644 wp/wp-content/themes/twentytwelve/single.php delete mode 100644 wp/wp-content/themes/twentytwelve/style.css delete mode 100644 wp/wp-content/themes/twentytwelve/tag.php delete mode 100644 wp/wp-cron.php delete mode 100644 wp/wp-includes/ID3/getid3.lib.php delete mode 100644 wp/wp-includes/ID3/getid3.php delete mode 100644 wp/wp-includes/ID3/license.commercial.txt delete mode 100644 wp/wp-includes/ID3/license.txt delete mode 100644 wp/wp-includes/ID3/module.audio-video.asf.php delete mode 100644 wp/wp-includes/ID3/module.audio-video.flv.php delete mode 100644 wp/wp-includes/ID3/module.audio-video.matroska.php delete mode 100644 wp/wp-includes/ID3/module.audio-video.quicktime.php delete mode 100644 wp/wp-includes/ID3/module.audio-video.riff.php delete mode 100644 wp/wp-includes/ID3/module.audio.ac3.php delete mode 100644 wp/wp-includes/ID3/module.audio.dts.php delete mode 100644 wp/wp-includes/ID3/module.audio.flac.php delete mode 100644 wp/wp-includes/ID3/module.audio.mp3.php delete mode 100644 wp/wp-includes/ID3/module.audio.ogg.php delete mode 100644 wp/wp-includes/ID3/module.tag.apetag.php delete mode 100644 wp/wp-includes/ID3/module.tag.id3v1.php delete mode 100644 wp/wp-includes/ID3/module.tag.id3v2.php delete mode 100644 wp/wp-includes/ID3/module.tag.lyrics3.php delete mode 100644 wp/wp-includes/ID3/readme.txt delete mode 100644 wp/wp-includes/IXR/class-IXR-base64.php delete mode 100644 wp/wp-includes/IXR/class-IXR-client.php delete mode 100644 wp/wp-includes/IXR/class-IXR-clientmulticall.php delete mode 100644 wp/wp-includes/IXR/class-IXR-date.php delete mode 100644 wp/wp-includes/IXR/class-IXR-error.php delete mode 100644 wp/wp-includes/IXR/class-IXR-introspectionserver.php delete mode 100644 wp/wp-includes/IXR/class-IXR-message.php delete mode 100644 wp/wp-includes/IXR/class-IXR-request.php delete mode 100644 wp/wp-includes/IXR/class-IXR-server.php delete mode 100644 wp/wp-includes/IXR/class-IXR-value.php delete mode 100644 wp/wp-includes/Requests/Auth.php delete mode 100644 wp/wp-includes/Requests/Auth/Basic.php delete mode 100644 wp/wp-includes/Requests/Cookie.php delete mode 100644 wp/wp-includes/Requests/Cookie/Jar.php delete mode 100644 wp/wp-includes/Requests/Exception.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/304.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/305.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/306.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/400.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/401.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/402.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/403.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/404.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/405.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/406.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/407.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/408.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/409.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/410.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/411.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/412.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/413.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/414.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/415.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/416.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/417.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/418.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/428.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/429.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/431.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/500.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/501.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/502.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/503.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/504.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/505.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/511.php delete mode 100644 wp/wp-includes/Requests/Exception/HTTP/Unknown.php delete mode 100644 wp/wp-includes/Requests/Exception/Transport.php delete mode 100644 wp/wp-includes/Requests/Exception/Transport/cURL.php delete mode 100644 wp/wp-includes/Requests/Hooker.php delete mode 100644 wp/wp-includes/Requests/Hooks.php delete mode 100644 wp/wp-includes/Requests/IDNAEncoder.php delete mode 100644 wp/wp-includes/Requests/IPv6.php delete mode 100644 wp/wp-includes/Requests/IRI.php delete mode 100644 wp/wp-includes/Requests/Proxy.php delete mode 100644 wp/wp-includes/Requests/Proxy/HTTP.php delete mode 100644 wp/wp-includes/Requests/Response.php delete mode 100644 wp/wp-includes/Requests/Response/Headers.php delete mode 100644 wp/wp-includes/Requests/SSL.php delete mode 100644 wp/wp-includes/Requests/Session.php delete mode 100644 wp/wp-includes/Requests/Transport.php delete mode 100644 wp/wp-includes/Requests/Transport/cURL.php delete mode 100644 wp/wp-includes/Requests/Transport/fsockopen.php delete mode 100644 wp/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php delete mode 100644 wp/wp-includes/Requests/Utility/FilteredIterator.php delete mode 100644 wp/wp-includes/SimplePie/Author.php delete mode 100644 wp/wp-includes/SimplePie/Cache.php delete mode 100644 wp/wp-includes/SimplePie/Cache/Base.php delete mode 100644 wp/wp-includes/SimplePie/Cache/DB.php delete mode 100644 wp/wp-includes/SimplePie/Cache/File.php delete mode 100644 wp/wp-includes/SimplePie/Cache/Memcache.php delete mode 100644 wp/wp-includes/SimplePie/Cache/MySQL.php delete mode 100644 wp/wp-includes/SimplePie/Caption.php delete mode 100644 wp/wp-includes/SimplePie/Category.php delete mode 100644 wp/wp-includes/SimplePie/Content/Type/Sniffer.php delete mode 100644 wp/wp-includes/SimplePie/Copyright.php delete mode 100644 wp/wp-includes/SimplePie/Core.php delete mode 100644 wp/wp-includes/SimplePie/Credit.php delete mode 100644 wp/wp-includes/SimplePie/Decode/HTML/Entities.php delete mode 100644 wp/wp-includes/SimplePie/Enclosure.php delete mode 100644 wp/wp-includes/SimplePie/Exception.php delete mode 100644 wp/wp-includes/SimplePie/File.php delete mode 100644 wp/wp-includes/SimplePie/HTTP/Parser.php delete mode 100644 wp/wp-includes/SimplePie/IRI.php delete mode 100644 wp/wp-includes/SimplePie/Item.php delete mode 100644 wp/wp-includes/SimplePie/Locator.php delete mode 100644 wp/wp-includes/SimplePie/Misc.php delete mode 100644 wp/wp-includes/SimplePie/Net/IPv6.php delete mode 100644 wp/wp-includes/SimplePie/Parse/Date.php delete mode 100644 wp/wp-includes/SimplePie/Parser.php delete mode 100644 wp/wp-includes/SimplePie/Rating.php delete mode 100644 wp/wp-includes/SimplePie/Registry.php delete mode 100644 wp/wp-includes/SimplePie/Restriction.php delete mode 100644 wp/wp-includes/SimplePie/Sanitize.php delete mode 100644 wp/wp-includes/SimplePie/Source.php delete mode 100644 wp/wp-includes/SimplePie/XML/Declaration/Parser.php delete mode 100644 wp/wp-includes/SimplePie/gzdecode.php delete mode 100644 wp/wp-includes/Text/Diff.php delete mode 100644 wp/wp-includes/Text/Diff/Engine/native.php delete mode 100644 wp/wp-includes/Text/Diff/Engine/shell.php delete mode 100644 wp/wp-includes/Text/Diff/Engine/string.php delete mode 100644 wp/wp-includes/Text/Diff/Engine/xdiff.php delete mode 100644 wp/wp-includes/Text/Diff/Renderer.php delete mode 100644 wp/wp-includes/Text/Diff/Renderer/inline.php delete mode 100644 wp/wp-includes/admin-bar.php delete mode 100644 wp/wp-includes/atomlib.php delete mode 100644 wp/wp-includes/author-template.php delete mode 100644 wp/wp-includes/bookmark-template.php delete mode 100644 wp/wp-includes/bookmark.php delete mode 100644 wp/wp-includes/cache.php delete mode 100644 wp/wp-includes/canonical.php delete mode 100644 wp/wp-includes/capabilities.php delete mode 100644 wp/wp-includes/category-template.php delete mode 100644 wp/wp-includes/category.php delete mode 100644 wp/wp-includes/certificates/ca-bundle.crt delete mode 100644 wp/wp-includes/class-IXR.php delete mode 100644 wp/wp-includes/class-feed.php delete mode 100644 wp/wp-includes/class-http.php delete mode 100644 wp/wp-includes/class-json.php delete mode 100644 wp/wp-includes/class-oembed.php delete mode 100644 wp/wp-includes/class-phpass.php delete mode 100644 wp/wp-includes/class-phpmailer.php delete mode 100644 wp/wp-includes/class-pop3.php delete mode 100644 wp/wp-includes/class-requests.php delete mode 100644 wp/wp-includes/class-simplepie.php delete mode 100644 wp/wp-includes/class-smtp.php delete mode 100644 wp/wp-includes/class-snoopy.php delete mode 100644 wp/wp-includes/class-walker-category-dropdown.php delete mode 100644 wp/wp-includes/class-walker-category.php delete mode 100644 wp/wp-includes/class-walker-comment.php delete mode 100644 wp/wp-includes/class-walker-nav-menu.php delete mode 100644 wp/wp-includes/class-walker-page-dropdown.php delete mode 100644 wp/wp-includes/class-walker-page.php delete mode 100644 wp/wp-includes/class-wp-admin-bar.php delete mode 100644 wp/wp-includes/class-wp-ajax-response.php delete mode 100644 wp/wp-includes/class-wp-comment-query.php delete mode 100644 wp/wp-includes/class-wp-comment.php delete mode 100644 wp/wp-includes/class-wp-customize-control.php delete mode 100644 wp/wp-includes/class-wp-customize-manager.php delete mode 100644 wp/wp-includes/class-wp-customize-nav-menus.php delete mode 100644 wp/wp-includes/class-wp-customize-panel.php delete mode 100644 wp/wp-includes/class-wp-customize-section.php delete mode 100644 wp/wp-includes/class-wp-customize-setting.php delete mode 100644 wp/wp-includes/class-wp-customize-widgets.php delete mode 100644 wp/wp-includes/class-wp-dependency.php delete mode 100644 wp/wp-includes/class-wp-editor.php delete mode 100644 wp/wp-includes/class-wp-embed.php delete mode 100644 wp/wp-includes/class-wp-error.php delete mode 100644 wp/wp-includes/class-wp-feed-cache-transient.php delete mode 100644 wp/wp-includes/class-wp-feed-cache.php delete mode 100644 wp/wp-includes/class-wp-hook.php delete mode 100644 wp/wp-includes/class-wp-http-cookie.php delete mode 100644 wp/wp-includes/class-wp-http-curl.php delete mode 100644 wp/wp-includes/class-wp-http-encoding.php delete mode 100644 wp/wp-includes/class-wp-http-ixr-client.php delete mode 100644 wp/wp-includes/class-wp-http-proxy.php delete mode 100644 wp/wp-includes/class-wp-http-requests-hooks.php delete mode 100644 wp/wp-includes/class-wp-http-requests-response.php delete mode 100644 wp/wp-includes/class-wp-http-response.php delete mode 100644 wp/wp-includes/class-wp-http-streams.php delete mode 100644 wp/wp-includes/class-wp-image-editor-gd.php delete mode 100644 wp/wp-includes/class-wp-image-editor-imagick.php delete mode 100644 wp/wp-includes/class-wp-image-editor.php delete mode 100644 wp/wp-includes/class-wp-list-util.php delete mode 100644 wp/wp-includes/class-wp-locale-switcher.php delete mode 100644 wp/wp-includes/class-wp-locale.php delete mode 100644 wp/wp-includes/class-wp-matchesmapregex.php delete mode 100644 wp/wp-includes/class-wp-meta-query.php delete mode 100644 wp/wp-includes/class-wp-metadata-lazyloader.php delete mode 100644 wp/wp-includes/class-wp-network-query.php delete mode 100644 wp/wp-includes/class-wp-network.php delete mode 100644 wp/wp-includes/class-wp-oembed-controller.php delete mode 100644 wp/wp-includes/class-wp-post-type.php delete mode 100644 wp/wp-includes/class-wp-post.php delete mode 100644 wp/wp-includes/class-wp-query.php delete mode 100644 wp/wp-includes/class-wp-rewrite.php delete mode 100644 wp/wp-includes/class-wp-role.php delete mode 100644 wp/wp-includes/class-wp-roles.php delete mode 100644 wp/wp-includes/class-wp-session-tokens.php delete mode 100644 wp/wp-includes/class-wp-simplepie-file.php delete mode 100644 wp/wp-includes/class-wp-simplepie-sanitize-kses.php delete mode 100644 wp/wp-includes/class-wp-site-query.php delete mode 100644 wp/wp-includes/class-wp-site.php delete mode 100644 wp/wp-includes/class-wp-tax-query.php delete mode 100644 wp/wp-includes/class-wp-taxonomy.php delete mode 100644 wp/wp-includes/class-wp-term-query.php delete mode 100644 wp/wp-includes/class-wp-term.php delete mode 100644 wp/wp-includes/class-wp-text-diff-renderer-inline.php delete mode 100644 wp/wp-includes/class-wp-text-diff-renderer-table.php delete mode 100644 wp/wp-includes/class-wp-theme.php delete mode 100644 wp/wp-includes/class-wp-user-meta-session-tokens.php delete mode 100644 wp/wp-includes/class-wp-user-query.php delete mode 100644 wp/wp-includes/class-wp-user.php delete mode 100644 wp/wp-includes/class-wp-walker.php delete mode 100644 wp/wp-includes/class-wp-widget-factory.php delete mode 100644 wp/wp-includes/class-wp-widget.php delete mode 100644 wp/wp-includes/class-wp-xmlrpc-server.php delete mode 100644 wp/wp-includes/class-wp.php delete mode 100644 wp/wp-includes/class.wp-dependencies.php delete mode 100644 wp/wp-includes/class.wp-scripts.php delete mode 100644 wp/wp-includes/class.wp-styles.php delete mode 100644 wp/wp-includes/comment-template.php delete mode 100644 wp/wp-includes/comment.php delete mode 100644 wp/wp-includes/compat.php delete mode 100644 wp/wp-includes/cron.php delete mode 100644 wp/wp-includes/css/admin-bar-rtl.css delete mode 100644 wp/wp-includes/css/admin-bar-rtl.min.css delete mode 100644 wp/wp-includes/css/admin-bar.css delete mode 100644 wp/wp-includes/css/admin-bar.min.css delete mode 100644 wp/wp-includes/css/buttons-rtl.css delete mode 100644 wp/wp-includes/css/buttons-rtl.min.css delete mode 100644 wp/wp-includes/css/buttons.css delete mode 100644 wp/wp-includes/css/buttons.min.css delete mode 100644 wp/wp-includes/css/customize-preview-rtl.css delete mode 100644 wp/wp-includes/css/customize-preview-rtl.min.css delete mode 100644 wp/wp-includes/css/customize-preview.css delete mode 100644 wp/wp-includes/css/customize-preview.min.css delete mode 100644 wp/wp-includes/css/dashicons.css delete mode 100644 wp/wp-includes/css/dashicons.min.css delete mode 100644 wp/wp-includes/css/editor-rtl.css delete mode 100644 wp/wp-includes/css/editor-rtl.min.css delete mode 100644 wp/wp-includes/css/editor.css delete mode 100644 wp/wp-includes/css/editor.min.css delete mode 100644 wp/wp-includes/css/jquery-ui-dialog-rtl.css delete mode 100644 wp/wp-includes/css/jquery-ui-dialog-rtl.min.css delete mode 100644 wp/wp-includes/css/jquery-ui-dialog.css delete mode 100644 wp/wp-includes/css/jquery-ui-dialog.min.css delete mode 100644 wp/wp-includes/css/media-views-rtl.css delete mode 100644 wp/wp-includes/css/media-views-rtl.min.css delete mode 100644 wp/wp-includes/css/media-views.css delete mode 100644 wp/wp-includes/css/media-views.min.css delete mode 100644 wp/wp-includes/css/wp-auth-check-rtl.css delete mode 100644 wp/wp-includes/css/wp-auth-check-rtl.min.css delete mode 100644 wp/wp-includes/css/wp-auth-check.css delete mode 100644 wp/wp-includes/css/wp-auth-check.min.css delete mode 100644 wp/wp-includes/css/wp-embed-template-ie.css delete mode 100644 wp/wp-includes/css/wp-embed-template-ie.min.css delete mode 100644 wp/wp-includes/css/wp-embed-template.css delete mode 100644 wp/wp-includes/css/wp-embed-template.min.css delete mode 100644 wp/wp-includes/css/wp-pointer-rtl.css delete mode 100644 wp/wp-includes/css/wp-pointer-rtl.min.css delete mode 100644 wp/wp-includes/css/wp-pointer.css delete mode 100644 wp/wp-includes/css/wp-pointer.min.css delete mode 100644 wp/wp-includes/customize/class-wp-customize-background-image-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-background-image-setting.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-background-position-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-color-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-cropped-image-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-custom-css-setting.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-filter-setting.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-header-image-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-header-image-setting.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-image-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-media-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-nav-menu-auto-add-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-nav-menu-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-nav-menu-item-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-nav-menu-location-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-nav-menu-name-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-nav-menu-section.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-nav-menu-setting.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-nav-menus-panel.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-new-menu-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-new-menu-section.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-partial.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-selective-refresh.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-sidebar-section.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-site-icon-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-theme-control.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-themes-section.php delete mode 100644 wp/wp-includes/customize/class-wp-customize-upload-control.php delete mode 100644 wp/wp-includes/customize/class-wp-widget-area-customize-control.php delete mode 100644 wp/wp-includes/customize/class-wp-widget-form-customize-control.php delete mode 100644 wp/wp-includes/date.php delete mode 100644 wp/wp-includes/default-constants.php delete mode 100644 wp/wp-includes/default-filters.php delete mode 100644 wp/wp-includes/default-widgets.php delete mode 100644 wp/wp-includes/deprecated.php delete mode 100644 wp/wp-includes/embed-template.php delete mode 100644 wp/wp-includes/embed.php delete mode 100644 wp/wp-includes/feed-atom-comments.php delete mode 100644 wp/wp-includes/feed-atom.php delete mode 100644 wp/wp-includes/feed-rdf.php delete mode 100644 wp/wp-includes/feed-rss.php delete mode 100644 wp/wp-includes/feed-rss2-comments.php delete mode 100644 wp/wp-includes/feed-rss2.php delete mode 100644 wp/wp-includes/feed.php delete mode 100644 wp/wp-includes/fonts/dashicons.eot delete mode 100644 wp/wp-includes/fonts/dashicons.svg delete mode 100644 wp/wp-includes/fonts/dashicons.ttf delete mode 100644 wp/wp-includes/fonts/dashicons.woff delete mode 100644 wp/wp-includes/formatting.php delete mode 100644 wp/wp-includes/functions.php delete mode 100644 wp/wp-includes/functions.wp-scripts.php delete mode 100644 wp/wp-includes/functions.wp-styles.php delete mode 100644 wp/wp-includes/general-template.php delete mode 100644 wp/wp-includes/http.php delete mode 100644 wp/wp-includes/images/admin-bar-sprite-2x.png delete mode 100644 wp/wp-includes/images/admin-bar-sprite.png delete mode 100644 wp/wp-includes/images/arrow-pointer-blue-2x.png delete mode 100644 wp/wp-includes/images/arrow-pointer-blue.png delete mode 100644 wp/wp-includes/images/blank.gif delete mode 100644 wp/wp-includes/images/crystal/archive.png delete mode 100644 wp/wp-includes/images/crystal/audio.png delete mode 100644 wp/wp-includes/images/crystal/code.png delete mode 100644 wp/wp-includes/images/crystal/default.png delete mode 100644 wp/wp-includes/images/crystal/document.png delete mode 100644 wp/wp-includes/images/crystal/interactive.png delete mode 100644 wp/wp-includes/images/crystal/license.txt delete mode 100644 wp/wp-includes/images/crystal/spreadsheet.png delete mode 100644 wp/wp-includes/images/crystal/text.png delete mode 100644 wp/wp-includes/images/crystal/video.png delete mode 100644 wp/wp-includes/images/down_arrow-2x.gif delete mode 100644 wp/wp-includes/images/down_arrow.gif delete mode 100644 wp/wp-includes/images/icon-pointer-flag-2x.png delete mode 100644 wp/wp-includes/images/icon-pointer-flag.png delete mode 100644 wp/wp-includes/images/media/archive.png delete mode 100644 wp/wp-includes/images/media/audio.png delete mode 100644 wp/wp-includes/images/media/code.png delete mode 100644 wp/wp-includes/images/media/default.png delete mode 100644 wp/wp-includes/images/media/document.png delete mode 100644 wp/wp-includes/images/media/interactive.png delete mode 100644 wp/wp-includes/images/media/spreadsheet.png delete mode 100644 wp/wp-includes/images/media/text.png delete mode 100644 wp/wp-includes/images/media/video.png delete mode 100644 wp/wp-includes/images/rss-2x.png delete mode 100644 wp/wp-includes/images/rss.png delete mode 100644 wp/wp-includes/images/smilies/frownie.png delete mode 100644 wp/wp-includes/images/smilies/icon_arrow.gif delete mode 100644 wp/wp-includes/images/smilies/icon_biggrin.gif delete mode 100644 wp/wp-includes/images/smilies/icon_confused.gif delete mode 100644 wp/wp-includes/images/smilies/icon_cool.gif delete mode 100644 wp/wp-includes/images/smilies/icon_cry.gif delete mode 100644 wp/wp-includes/images/smilies/icon_eek.gif delete mode 100644 wp/wp-includes/images/smilies/icon_evil.gif delete mode 100644 wp/wp-includes/images/smilies/icon_exclaim.gif delete mode 100644 wp/wp-includes/images/smilies/icon_idea.gif delete mode 100644 wp/wp-includes/images/smilies/icon_lol.gif delete mode 100644 wp/wp-includes/images/smilies/icon_mad.gif delete mode 100644 wp/wp-includes/images/smilies/icon_mrgreen.gif delete mode 100644 wp/wp-includes/images/smilies/icon_neutral.gif delete mode 100644 wp/wp-includes/images/smilies/icon_question.gif delete mode 100644 wp/wp-includes/images/smilies/icon_razz.gif delete mode 100644 wp/wp-includes/images/smilies/icon_redface.gif delete mode 100644 wp/wp-includes/images/smilies/icon_rolleyes.gif delete mode 100644 wp/wp-includes/images/smilies/icon_sad.gif delete mode 100644 wp/wp-includes/images/smilies/icon_smile.gif delete mode 100644 wp/wp-includes/images/smilies/icon_surprised.gif delete mode 100644 wp/wp-includes/images/smilies/icon_twisted.gif delete mode 100644 wp/wp-includes/images/smilies/icon_wink.gif delete mode 100644 wp/wp-includes/images/smilies/mrgreen.png delete mode 100644 wp/wp-includes/images/smilies/rolleyes.png delete mode 100644 wp/wp-includes/images/smilies/simple-smile.png delete mode 100644 wp/wp-includes/images/spinner-2x.gif delete mode 100644 wp/wp-includes/images/spinner.gif delete mode 100644 wp/wp-includes/images/toggle-arrow-2x.png delete mode 100644 wp/wp-includes/images/toggle-arrow.png delete mode 100644 wp/wp-includes/images/uploader-icons-2x.png delete mode 100644 wp/wp-includes/images/uploader-icons.png delete mode 100644 wp/wp-includes/images/w-logo-blue.png delete mode 100644 wp/wp-includes/images/wlw/wp-comments.png delete mode 100644 wp/wp-includes/images/wlw/wp-icon.png delete mode 100644 wp/wp-includes/images/wlw/wp-watermark.png delete mode 100644 wp/wp-includes/images/wpicons-2x.png delete mode 100644 wp/wp-includes/images/wpicons.png delete mode 100644 wp/wp-includes/images/wpspin-2x.gif delete mode 100644 wp/wp-includes/images/wpspin.gif delete mode 100644 wp/wp-includes/images/xit-2x.gif delete mode 100644 wp/wp-includes/images/xit.gif delete mode 100644 wp/wp-includes/js/admin-bar.js delete mode 100644 wp/wp-includes/js/admin-bar.min.js delete mode 100644 wp/wp-includes/js/autosave.js delete mode 100644 wp/wp-includes/js/autosave.min.js delete mode 100644 wp/wp-includes/js/backbone.min.js delete mode 100644 wp/wp-includes/js/colorpicker.js delete mode 100644 wp/wp-includes/js/colorpicker.min.js delete mode 100644 wp/wp-includes/js/comment-reply.js delete mode 100644 wp/wp-includes/js/comment-reply.min.js delete mode 100644 wp/wp-includes/js/crop/cropper.css delete mode 100644 wp/wp-includes/js/crop/cropper.js delete mode 100644 wp/wp-includes/js/crop/marqueeHoriz.gif delete mode 100644 wp/wp-includes/js/crop/marqueeVert.gif delete mode 100644 wp/wp-includes/js/customize-base.js delete mode 100644 wp/wp-includes/js/customize-base.min.js delete mode 100644 wp/wp-includes/js/customize-loader.js delete mode 100644 wp/wp-includes/js/customize-loader.min.js delete mode 100644 wp/wp-includes/js/customize-models.js delete mode 100644 wp/wp-includes/js/customize-models.min.js delete mode 100644 wp/wp-includes/js/customize-preview-nav-menus.js delete mode 100644 wp/wp-includes/js/customize-preview-nav-menus.min.js delete mode 100644 wp/wp-includes/js/customize-preview-widgets.js delete mode 100644 wp/wp-includes/js/customize-preview-widgets.min.js delete mode 100644 wp/wp-includes/js/customize-preview.js delete mode 100644 wp/wp-includes/js/customize-preview.min.js delete mode 100644 wp/wp-includes/js/customize-selective-refresh.js delete mode 100644 wp/wp-includes/js/customize-selective-refresh.min.js delete mode 100644 wp/wp-includes/js/customize-views.js delete mode 100644 wp/wp-includes/js/customize-views.min.js delete mode 100644 wp/wp-includes/js/heartbeat.js delete mode 100644 wp/wp-includes/js/heartbeat.min.js delete mode 100644 wp/wp-includes/js/hoverIntent.js delete mode 100644 wp/wp-includes/js/hoverIntent.min.js delete mode 100644 wp/wp-includes/js/imagesloaded.min.js delete mode 100644 wp/wp-includes/js/imgareaselect/border-anim-h.gif delete mode 100644 wp/wp-includes/js/imgareaselect/border-anim-v.gif delete mode 100644 wp/wp-includes/js/imgareaselect/imgareaselect.css delete mode 100644 wp/wp-includes/js/imgareaselect/jquery.imgareaselect.js delete mode 100644 wp/wp-includes/js/imgareaselect/jquery.imgareaselect.min.js delete mode 100644 wp/wp-includes/js/jcrop/Jcrop.gif delete mode 100644 wp/wp-includes/js/jcrop/jquery.Jcrop.min.css delete mode 100644 wp/wp-includes/js/jcrop/jquery.Jcrop.min.js delete mode 100644 wp/wp-includes/js/jquery/jquery-migrate.js delete mode 100644 wp/wp-includes/js/jquery/jquery-migrate.min.js delete mode 100644 wp/wp-includes/js/jquery/jquery.color.min.js delete mode 100644 wp/wp-includes/js/jquery/jquery.form.js delete mode 100644 wp/wp-includes/js/jquery/jquery.form.min.js delete mode 100644 wp/wp-includes/js/jquery/jquery.hotkeys.js delete mode 100644 wp/wp-includes/js/jquery/jquery.hotkeys.min.js delete mode 100644 wp/wp-includes/js/jquery/jquery.js delete mode 100644 wp/wp-includes/js/jquery/jquery.masonry.min.js delete mode 100644 wp/wp-includes/js/jquery/jquery.query.js delete mode 100644 wp/wp-includes/js/jquery/jquery.schedule.js delete mode 100644 wp/wp-includes/js/jquery/jquery.serialize-object.js delete mode 100644 wp/wp-includes/js/jquery/jquery.table-hotkeys.js delete mode 100644 wp/wp-includes/js/jquery/jquery.table-hotkeys.min.js delete mode 100644 wp/wp-includes/js/jquery/jquery.ui.touch-punch.js delete mode 100644 wp/wp-includes/js/jquery/suggest.js delete mode 100644 wp/wp-includes/js/jquery/suggest.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/accordion.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/autocomplete.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/button.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/core.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/datepicker.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/dialog.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/draggable.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/droppable.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-blind.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-bounce.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-clip.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-drop.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-explode.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-fade.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-fold.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-highlight.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-puff.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-pulsate.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-scale.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-shake.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-size.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-slide.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect-transfer.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/effect.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/menu.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/mouse.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/position.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/progressbar.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/resizable.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/selectable.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/selectmenu.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/slider.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/sortable.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/spinner.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/tabs.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/tooltip.min.js delete mode 100644 wp/wp-includes/js/jquery/ui/widget.min.js delete mode 100644 wp/wp-includes/js/json2.js delete mode 100644 wp/wp-includes/js/json2.min.js delete mode 100644 wp/wp-includes/js/masonry.min.js delete mode 100644 wp/wp-includes/js/mce-view.js delete mode 100644 wp/wp-includes/js/mce-view.min.js delete mode 100644 wp/wp-includes/js/media-audiovideo.js delete mode 100644 wp/wp-includes/js/media-audiovideo.min.js delete mode 100644 wp/wp-includes/js/media-editor.js delete mode 100644 wp/wp-includes/js/media-editor.min.js delete mode 100644 wp/wp-includes/js/media-grid.js delete mode 100644 wp/wp-includes/js/media-grid.min.js delete mode 100644 wp/wp-includes/js/media-models.js delete mode 100644 wp/wp-includes/js/media-models.min.js delete mode 100644 wp/wp-includes/js/media-views.js delete mode 100644 wp/wp-includes/js/media-views.min.js delete mode 100644 wp/wp-includes/js/mediaelement/background.png delete mode 100644 wp/wp-includes/js/mediaelement/bigplay.png delete mode 100644 wp/wp-includes/js/mediaelement/bigplay.svg delete mode 100644 wp/wp-includes/js/mediaelement/controls.png delete mode 100644 wp/wp-includes/js/mediaelement/controls.svg delete mode 100644 wp/wp-includes/js/mediaelement/flashmediaelement.swf delete mode 100644 wp/wp-includes/js/mediaelement/froogaloop.min.js delete mode 100644 wp/wp-includes/js/mediaelement/jumpforward.png delete mode 100644 wp/wp-includes/js/mediaelement/loading.gif delete mode 100644 wp/wp-includes/js/mediaelement/mediaelement-and-player.min.js delete mode 100644 wp/wp-includes/js/mediaelement/mediaelementplayer.min.css delete mode 100644 wp/wp-includes/js/mediaelement/silverlightmediaelement.xap delete mode 100644 wp/wp-includes/js/mediaelement/skipback.png delete mode 100644 wp/wp-includes/js/mediaelement/wp-mediaelement.css delete mode 100644 wp/wp-includes/js/mediaelement/wp-mediaelement.js delete mode 100644 wp/wp-includes/js/mediaelement/wp-mediaelement.min.css delete mode 100644 wp/wp-includes/js/mediaelement/wp-mediaelement.min.js delete mode 100644 wp/wp-includes/js/mediaelement/wp-playlist.js delete mode 100644 wp/wp-includes/js/mediaelement/wp-playlist.min.js delete mode 100644 wp/wp-includes/js/plupload/handlers.js delete mode 100644 wp/wp-includes/js/plupload/handlers.min.js delete mode 100644 wp/wp-includes/js/plupload/license.txt delete mode 100644 wp/wp-includes/js/plupload/plupload.flash.swf delete mode 100644 wp/wp-includes/js/plupload/plupload.full.min.js delete mode 100644 wp/wp-includes/js/plupload/plupload.silverlight.xap delete mode 100644 wp/wp-includes/js/plupload/wp-plupload.js delete mode 100644 wp/wp-includes/js/plupload/wp-plupload.min.js delete mode 100644 wp/wp-includes/js/quicktags.js delete mode 100644 wp/wp-includes/js/quicktags.min.js delete mode 100644 wp/wp-includes/js/shortcode.js delete mode 100644 wp/wp-includes/js/shortcode.min.js delete mode 100644 wp/wp-includes/js/swfobject.js delete mode 100644 wp/wp-includes/js/swfupload/handlers.js delete mode 100644 wp/wp-includes/js/swfupload/handlers.min.js delete mode 100644 wp/wp-includes/js/swfupload/license.txt delete mode 100644 wp/wp-includes/js/swfupload/plugins/swfupload.cookies.js delete mode 100644 wp/wp-includes/js/swfupload/plugins/swfupload.queue.js delete mode 100644 wp/wp-includes/js/swfupload/plugins/swfupload.speed.js delete mode 100644 wp/wp-includes/js/swfupload/plugins/swfupload.swfobject.js delete mode 100644 wp/wp-includes/js/swfupload/swfupload.js delete mode 100644 wp/wp-includes/js/swfupload/swfupload.swf delete mode 100644 wp/wp-includes/js/thickbox/loadingAnimation.gif delete mode 100644 wp/wp-includes/js/thickbox/macFFBgHack.png delete mode 100644 wp/wp-includes/js/thickbox/thickbox.css delete mode 100644 wp/wp-includes/js/thickbox/thickbox.js delete mode 100644 wp/wp-includes/js/tinymce/langs/wp-langs-en.js delete mode 100644 wp/wp-includes/js/tinymce/license.txt delete mode 100644 wp/wp-includes/js/tinymce/plugins/charmap/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/charmap/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/colorpicker/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/colorpicker/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/compat3x/css/dialog.css delete mode 100644 wp/wp-includes/js/tinymce/plugins/compat3x/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/compat3x/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/directionality/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/directionality/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/fullscreen/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/fullscreen/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/hr/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/hr/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/image/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/image/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/lists/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/lists/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/media/moxieplayer.swf delete mode 100644 wp/wp-includes/js/tinymce/plugins/media/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/media/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/paste/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/paste/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/tabfocus/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/tabfocus/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/textcolor/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/textcolor/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wordpress/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wordpress/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wpautoresize/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wpautoresize/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wpdialogs/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wpdialogs/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wpeditimage/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wpeditimage/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wpembed/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wpembed/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wpemoji/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wpemoji/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wpgallery/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wpgallery/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wplink/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wplink/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wptextpattern/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wptextpattern/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wpview/plugin.js delete mode 100644 wp/wp-includes/js/tinymce/plugins/wpview/plugin.min.js delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/content.inline.min.css delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/content.min.css delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/fonts/readme.md delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/fonts/tinymce-small.eot delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/fonts/tinymce-small.json delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/fonts/tinymce-small.svg delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/fonts/tinymce-small.ttf delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/fonts/tinymce-small.woff delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/fonts/tinymce.eot delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/fonts/tinymce.json delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/fonts/tinymce.svg delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/fonts/tinymce.ttf delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/fonts/tinymce.woff delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/img/anchor.gif delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/img/loader.gif delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/img/object.gif delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/img/trans.gif delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/skin.ie7.min.css delete mode 100644 wp/wp-includes/js/tinymce/skins/lightgray/skin.min.css delete mode 100644 wp/wp-includes/js/tinymce/skins/wordpress/images/audio.png delete mode 100644 wp/wp-includes/js/tinymce/skins/wordpress/images/dashicon-edit.png delete mode 100644 wp/wp-includes/js/tinymce/skins/wordpress/images/dashicon-no.png delete mode 100644 wp/wp-includes/js/tinymce/skins/wordpress/images/embedded.png delete mode 100644 wp/wp-includes/js/tinymce/skins/wordpress/images/gallery-2x.png delete mode 100644 wp/wp-includes/js/tinymce/skins/wordpress/images/gallery.png delete mode 100644 wp/wp-includes/js/tinymce/skins/wordpress/images/more-2x.png delete mode 100644 wp/wp-includes/js/tinymce/skins/wordpress/images/more.png delete mode 100644 wp/wp-includes/js/tinymce/skins/wordpress/images/pagebreak-2x.png delete mode 100644 wp/wp-includes/js/tinymce/skins/wordpress/images/pagebreak.png delete mode 100644 wp/wp-includes/js/tinymce/skins/wordpress/images/playlist-audio.png delete mode 100644 wp/wp-includes/js/tinymce/skins/wordpress/images/playlist-video.png delete mode 100644 wp/wp-includes/js/tinymce/skins/wordpress/images/video.png delete mode 100644 wp/wp-includes/js/tinymce/skins/wordpress/wp-content.css delete mode 100644 wp/wp-includes/js/tinymce/themes/inlite/theme.js delete mode 100644 wp/wp-includes/js/tinymce/themes/inlite/theme.min.js delete mode 100644 wp/wp-includes/js/tinymce/themes/modern/theme.js delete mode 100644 wp/wp-includes/js/tinymce/themes/modern/theme.min.js delete mode 100644 wp/wp-includes/js/tinymce/tiny_mce_popup.js delete mode 100644 wp/wp-includes/js/tinymce/tinymce.min.js delete mode 100644 wp/wp-includes/js/tinymce/utils/editable_selects.js delete mode 100644 wp/wp-includes/js/tinymce/utils/form_utils.js delete mode 100644 wp/wp-includes/js/tinymce/utils/mctabs.js delete mode 100644 wp/wp-includes/js/tinymce/utils/validate.js delete mode 100644 wp/wp-includes/js/tinymce/wp-tinymce.js.gz delete mode 100644 wp/wp-includes/js/tinymce/wp-tinymce.php delete mode 100644 wp/wp-includes/js/tw-sack.js delete mode 100644 wp/wp-includes/js/tw-sack.min.js delete mode 100644 wp/wp-includes/js/twemoji.js delete mode 100644 wp/wp-includes/js/twemoji.min.js delete mode 100644 wp/wp-includes/js/underscore.min.js delete mode 100644 wp/wp-includes/js/utils.js delete mode 100644 wp/wp-includes/js/utils.min.js delete mode 100644 wp/wp-includes/js/wp-a11y.js delete mode 100644 wp/wp-includes/js/wp-a11y.min.js delete mode 100644 wp/wp-includes/js/wp-ajax-response.js delete mode 100644 wp/wp-includes/js/wp-ajax-response.min.js delete mode 100644 wp/wp-includes/js/wp-api.js delete mode 100644 wp/wp-includes/js/wp-api.min.js delete mode 100644 wp/wp-includes/js/wp-auth-check.js delete mode 100644 wp/wp-includes/js/wp-auth-check.min.js delete mode 100644 wp/wp-includes/js/wp-backbone.js delete mode 100644 wp/wp-includes/js/wp-backbone.min.js delete mode 100644 wp/wp-includes/js/wp-custom-header.js delete mode 100644 wp/wp-includes/js/wp-custom-header.min.js delete mode 100644 wp/wp-includes/js/wp-embed-template.js delete mode 100644 wp/wp-includes/js/wp-embed-template.min.js delete mode 100644 wp/wp-includes/js/wp-embed.js delete mode 100644 wp/wp-includes/js/wp-embed.min.js delete mode 100644 wp/wp-includes/js/wp-emoji-loader.js delete mode 100644 wp/wp-includes/js/wp-emoji-loader.min.js delete mode 100644 wp/wp-includes/js/wp-emoji-release.min.js delete mode 100644 wp/wp-includes/js/wp-emoji.js delete mode 100644 wp/wp-includes/js/wp-emoji.min.js delete mode 100644 wp/wp-includes/js/wp-list-revisions.js delete mode 100644 wp/wp-includes/js/wp-list-revisions.min.js delete mode 100644 wp/wp-includes/js/wp-lists.js delete mode 100644 wp/wp-includes/js/wp-lists.min.js delete mode 100644 wp/wp-includes/js/wp-pointer.js delete mode 100644 wp/wp-includes/js/wp-pointer.min.js delete mode 100644 wp/wp-includes/js/wp-util.js delete mode 100644 wp/wp-includes/js/wp-util.min.js delete mode 100644 wp/wp-includes/js/wpdialog.js delete mode 100644 wp/wp-includes/js/wpdialog.min.js delete mode 100644 wp/wp-includes/js/wplink.js delete mode 100644 wp/wp-includes/js/wplink.min.js delete mode 100644 wp/wp-includes/js/zxcvbn-async.js delete mode 100644 wp/wp-includes/js/zxcvbn-async.min.js delete mode 100644 wp/wp-includes/js/zxcvbn.min.js delete mode 100644 wp/wp-includes/kses.php delete mode 100644 wp/wp-includes/l10n.php delete mode 100644 wp/wp-includes/link-template.php delete mode 100644 wp/wp-includes/load.php delete mode 100644 wp/wp-includes/locale.php delete mode 100644 wp/wp-includes/media-template.php delete mode 100644 wp/wp-includes/media.php delete mode 100644 wp/wp-includes/meta.php delete mode 100644 wp/wp-includes/ms-blogs.php delete mode 100644 wp/wp-includes/ms-default-constants.php delete mode 100644 wp/wp-includes/ms-default-filters.php delete mode 100644 wp/wp-includes/ms-deprecated.php delete mode 100644 wp/wp-includes/ms-files.php delete mode 100644 wp/wp-includes/ms-functions.php delete mode 100644 wp/wp-includes/ms-load.php delete mode 100644 wp/wp-includes/ms-settings.php delete mode 100644 wp/wp-includes/nav-menu-template.php delete mode 100644 wp/wp-includes/nav-menu.php delete mode 100644 wp/wp-includes/option.php delete mode 100644 wp/wp-includes/pluggable-deprecated.php delete mode 100644 wp/wp-includes/pluggable.php delete mode 100644 wp/wp-includes/plugin.php delete mode 100644 wp/wp-includes/pomo/entry.php delete mode 100644 wp/wp-includes/pomo/mo.php delete mode 100644 wp/wp-includes/pomo/po.php delete mode 100644 wp/wp-includes/pomo/streams.php delete mode 100644 wp/wp-includes/pomo/translations.php delete mode 100644 wp/wp-includes/post-formats.php delete mode 100644 wp/wp-includes/post-template.php delete mode 100644 wp/wp-includes/post-thumbnail-template.php delete mode 100644 wp/wp-includes/post.php delete mode 100644 wp/wp-includes/query.php delete mode 100644 wp/wp-includes/random_compat/byte_safe_strings.php delete mode 100644 wp/wp-includes/random_compat/cast_to_int.php delete mode 100644 wp/wp-includes/random_compat/error_polyfill.php delete mode 100644 wp/wp-includes/random_compat/random.php delete mode 100644 wp/wp-includes/random_compat/random_bytes_com_dotnet.php delete mode 100644 wp/wp-includes/random_compat/random_bytes_dev_urandom.php delete mode 100644 wp/wp-includes/random_compat/random_bytes_libsodium.php delete mode 100644 wp/wp-includes/random_compat/random_bytes_libsodium_legacy.php delete mode 100644 wp/wp-includes/random_compat/random_bytes_mcrypt.php delete mode 100644 wp/wp-includes/random_compat/random_bytes_openssl.php delete mode 100644 wp/wp-includes/random_compat/random_int.php delete mode 100644 wp/wp-includes/registration-functions.php delete mode 100644 wp/wp-includes/registration.php delete mode 100644 wp/wp-includes/rest-api.php delete mode 100644 wp/wp-includes/rest-api/class-wp-rest-request.php delete mode 100644 wp/wp-includes/rest-api/class-wp-rest-response.php delete mode 100644 wp/wp-includes/rest-api/class-wp-rest-server.php delete mode 100644 wp/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php delete mode 100644 wp/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php delete mode 100644 wp/wp-includes/rest-api/endpoints/class-wp-rest-controller.php delete mode 100644 wp/wp-includes/rest-api/endpoints/class-wp-rest-post-statuses-controller.php delete mode 100644 wp/wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php delete mode 100644 wp/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php delete mode 100644 wp/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php delete mode 100644 wp/wp-includes/rest-api/endpoints/class-wp-rest-settings-controller.php delete mode 100644 wp/wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php delete mode 100644 wp/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php delete mode 100644 wp/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php delete mode 100644 wp/wp-includes/rest-api/fields/class-wp-rest-comment-meta-fields.php delete mode 100644 wp/wp-includes/rest-api/fields/class-wp-rest-meta-fields.php delete mode 100644 wp/wp-includes/rest-api/fields/class-wp-rest-post-meta-fields.php delete mode 100644 wp/wp-includes/rest-api/fields/class-wp-rest-term-meta-fields.php delete mode 100644 wp/wp-includes/rest-api/fields/class-wp-rest-user-meta-fields.php delete mode 100644 wp/wp-includes/revision.php delete mode 100644 wp/wp-includes/rewrite.php delete mode 100644 wp/wp-includes/rss-functions.php delete mode 100644 wp/wp-includes/rss.php delete mode 100644 wp/wp-includes/script-loader.php delete mode 100644 wp/wp-includes/session.php delete mode 100644 wp/wp-includes/shortcodes.php delete mode 100644 wp/wp-includes/taxonomy.php delete mode 100644 wp/wp-includes/template-loader.php delete mode 100644 wp/wp-includes/template.php delete mode 100644 wp/wp-includes/theme-compat/comments.php delete mode 100644 wp/wp-includes/theme-compat/embed-404.php delete mode 100644 wp/wp-includes/theme-compat/embed-content.php delete mode 100644 wp/wp-includes/theme-compat/embed.php delete mode 100644 wp/wp-includes/theme-compat/footer-embed.php delete mode 100644 wp/wp-includes/theme-compat/footer.php delete mode 100644 wp/wp-includes/theme-compat/header-embed.php delete mode 100644 wp/wp-includes/theme-compat/header.php delete mode 100644 wp/wp-includes/theme-compat/sidebar.php delete mode 100644 wp/wp-includes/theme.php delete mode 100644 wp/wp-includes/update.php delete mode 100644 wp/wp-includes/user.php delete mode 100644 wp/wp-includes/vars.php delete mode 100644 wp/wp-includes/version.php delete mode 100644 wp/wp-includes/widgets.php delete mode 100644 wp/wp-includes/widgets/class-wp-nav-menu-widget.php delete mode 100644 wp/wp-includes/widgets/class-wp-widget-archives.php delete mode 100644 wp/wp-includes/widgets/class-wp-widget-calendar.php delete mode 100644 wp/wp-includes/widgets/class-wp-widget-categories.php delete mode 100644 wp/wp-includes/widgets/class-wp-widget-links.php delete mode 100644 wp/wp-includes/widgets/class-wp-widget-meta.php delete mode 100644 wp/wp-includes/widgets/class-wp-widget-pages.php delete mode 100644 wp/wp-includes/widgets/class-wp-widget-recent-comments.php delete mode 100644 wp/wp-includes/widgets/class-wp-widget-recent-posts.php delete mode 100644 wp/wp-includes/widgets/class-wp-widget-rss.php delete mode 100644 wp/wp-includes/widgets/class-wp-widget-search.php delete mode 100644 wp/wp-includes/widgets/class-wp-widget-tag-cloud.php delete mode 100644 wp/wp-includes/widgets/class-wp-widget-text.php delete mode 100644 wp/wp-includes/wlwmanifest.xml delete mode 100644 wp/wp-includes/wp-db.php delete mode 100644 wp/wp-includes/wp-diff.php delete mode 100644 wp/wp-links-opml.php delete mode 100644 wp/wp-load.php delete mode 100644 wp/wp-login.php delete mode 100644 wp/wp-mail.php delete mode 100644 wp/wp-settings.php delete mode 100644 wp/wp-signup.php delete mode 100644 wp/wp-trackback.php delete mode 100644 wp/xmlrpc.php diff --git a/.gitignore b/.gitignore index 722fe578..1fa2f8d3 100755 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,10 @@ -wp/wp-content/uploads +wp/ wp-config.php *~ *.swp .sass-cache .htaccess stuff/ -.idea -*.iml -wp/wp-content/themes/dns2015/bower_components -wp/wp-content/themes/dns2015/node_modules +.idea/ +dns2015/bower_components +dns2015/node_modules diff --git a/.htaccess-sample b/.htaccess-sample deleted file mode 100755 index c726d870..00000000 --- a/.htaccess-sample +++ /dev/null @@ -1,45 +0,0 @@ -# -# Rewriting permalinks from 2003-2012. -# -# By prefixing the old news ID, we can separate them from event IDs -# which overlapped in the old DB. -# -# Ref: http://stackoverflow.com/questions/3063548/can-mod-rewrite-do-math -# - - RewriteEngine On - RewriteBase / - - # News articles - RewriteCond %{QUERY_STRING} ID=(\d{1})$ - RewriteRule ^nyhet\.php$ /?p=1000%1 [R=301,L] - RewriteCond %{QUERY_STRING} ID=(\d{2})$ - RewriteRule ^nyhet\.php$ /?p=100%1 [R=301,L] - RewriteCond %{QUERY_STRING} ID=(\d{3})$ - RewriteRule ^nyhet\.php$ /?p=10%1 [R=301,L] - RewriteCond %{QUERY_STRING} ID=(\d{4})$ - RewriteRule ^nyhet\.php$ /?p=1%1 [R=301,L] - RewriteRule ^nyheter\.php /aktuelt/ [R=301,L] - - # Now events - RewriteCond %{QUERY_STRING} ID=(\d{1,4})$ - RewriteRule ^vis\.php$ /?p=%1 [R=301,L] - RewriteRule ^prog\.php$ /program/ [R=301,L] - - # Previously static pages - RewriteRule ^lokaler\.php$ http://viteboka.studentersamfundet.no/Lokaler [R=301,L] - RewriteRule ^historie\.php$ http://viteboka.studentersamfundet.no/Historie [R=301,L] - RewriteRule ^blimed\.php$ http://studentersamfundet.no/bli-med/ [R=301,L] - - -# Wordpress stuff - -RewriteEngine On -RewriteBase / -RewriteRule ^index\.php$ - [L] -RewriteCond %{REQUEST_FILENAME} !-f -RewriteCond %{REQUEST_FILENAME} !-d -RewriteRule . /index.php [L] - - - diff --git a/README.md b/README.md index 81cb5f07..13bbe385 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,47 @@ -# Installation +## Install + # Get WP-CLI from http://wp-cli.org/ + wp core download --path=wp cd wp - cp wp-config-sample.php wp-config.php - vim wp-config.php # Update database settings - git submodule update --init + wp core config # create db first + wp core install # needs initial credentials + cd wp-content/themes + ln -s ../../../dns2015 + + # (in project root) + cd dns2015 + npm install + bower install + gulp watch + + # Install public plugins listed below + # (in project root) + cd wp + wp plugin install ... -# Translations - # Download wordpress i18n tools, see https://codex.wordpress.org/I18n_for_WordPress_Developers#Using_the_i18n_tools - # Create a symlink from wp-content to TOOLS_DIR/src - ln -s $REPO_ROOT/wp/ src - # Create .pot-file - php tools/i18n/makepot.php wp-theme src/wp-content/themes/differ2015/ src/wp-content/themes/differ2015/languages/differ2015.pot - # Open .pot-file with POEdit and start translating + # symlink in own plugins -## See also + wp core language install nb_NO + wp core language activate nb_NO + wp core language update -https://edb.neuf.no/wiki/Studentersamfundet.no-web#Quick_start \ No newline at end of file +## Plugins + debug-bar + disable-comments + duplicate-post + json-api + redis-cache # needs to install object-cache.php + user-role-editor + wordpress-seo + wpdirauth + + # own + neuf-associations + neuf-events + +## Development tasks + fab build + fab watch + fab i18n + +## Deployment + fab deploy \ No newline at end of file diff --git a/wp/wp-content/themes/dns2015/404.php b/dns2015/404.php similarity index 100% rename from wp/wp-content/themes/dns2015/404.php rename to dns2015/404.php diff --git a/wp/wp-content/themes/dns2015/app/images/dns-logo-web.png b/dns2015/app/images/dns-logo-web.png similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/dns-logo-web.png rename to dns2015/app/images/dns-logo-web.png diff --git a/wp/wp-content/themes/dns2015/app/images/dns-logo-web_flipped.png b/dns2015/app/images/dns-logo-web_flipped.png similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/dns-logo-web_flipped.png rename to dns2015/app/images/dns-logo-web_flipped.png diff --git a/wp/wp-content/themes/dns2015/app/images/dns_logo_emblem_sort.png b/dns2015/app/images/dns_logo_emblem_sort.png similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/dns_logo_emblem_sort.png rename to dns2015/app/images/dns_logo_emblem_sort.png diff --git a/wp/wp-content/themes/dns2015/app/images/dns_logo_white.png b/dns2015/app/images/dns_logo_white.png similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/dns_logo_white.png rename to dns2015/app/images/dns_logo_white.png diff --git a/wp/wp-content/themes/dns2015/app/images/dns_logo_white_newsletter.png b/dns2015/app/images/dns_logo_white_newsletter.png similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/dns_logo_white_newsletter.png rename to dns2015/app/images/dns_logo_white_newsletter.png diff --git a/wp/wp-content/themes/dns2015/app/images/icons/contact_card.png b/dns2015/app/images/icons/contact_card.png similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/icons/contact_card.png rename to dns2015/app/images/icons/contact_card.png diff --git a/wp/wp-content/themes/dns2015/app/images/icons/crowd.png b/dns2015/app/images/icons/crowd.png similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/icons/crowd.png rename to dns2015/app/images/icons/crowd.png diff --git a/wp/wp-content/themes/dns2015/app/images/icons/facebook.png b/dns2015/app/images/icons/facebook.png similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/icons/facebook.png rename to dns2015/app/images/icons/facebook.png diff --git a/wp/wp-content/themes/dns2015/app/images/icons/facebook.svg b/dns2015/app/images/icons/facebook.svg similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/icons/facebook.svg rename to dns2015/app/images/icons/facebook.svg diff --git a/wp/wp-content/themes/dns2015/app/images/icons/flickr.svg b/dns2015/app/images/icons/flickr.svg similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/icons/flickr.svg rename to dns2015/app/images/icons/flickr.svg diff --git a/wp/wp-content/themes/dns2015/app/images/icons/instagram.svg b/dns2015/app/images/icons/instagram.svg similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/icons/instagram.svg rename to dns2015/app/images/icons/instagram.svg diff --git a/wp/wp-content/themes/dns2015/app/images/icons/location.svg b/dns2015/app/images/icons/location.svg similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/icons/location.svg rename to dns2015/app/images/icons/location.svg diff --git a/wp/wp-content/themes/dns2015/app/images/icons/microphone.png b/dns2015/app/images/icons/microphone.png similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/icons/microphone.png rename to dns2015/app/images/icons/microphone.png diff --git a/wp/wp-content/themes/dns2015/app/images/icons/twitter.svg b/dns2015/app/images/icons/twitter.svg similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/icons/twitter.svg rename to dns2015/app/images/icons/twitter.svg diff --git a/wp/wp-content/themes/dns2015/app/images/piggies.jpg b/dns2015/app/images/piggies.jpg similarity index 100% rename from wp/wp-content/themes/dns2015/app/images/piggies.jpg rename to dns2015/app/images/piggies.jpg diff --git a/wp/wp-content/themes/dns2015/app/scripts/app.js b/dns2015/app/scripts/app.js similarity index 100% rename from wp/wp-content/themes/dns2015/app/scripts/app.js rename to dns2015/app/scripts/app.js diff --git a/wp/wp-content/themes/dns2015/app/styles/_accessibility.scss b/dns2015/app/styles/_accessibility.scss similarity index 100% rename from wp/wp-content/themes/dns2015/app/styles/_accessibility.scss rename to dns2015/app/styles/_accessibility.scss diff --git a/wp/wp-content/themes/dns2015/app/styles/_buttons.scss b/dns2015/app/styles/_buttons.scss similarity index 100% rename from wp/wp-content/themes/dns2015/app/styles/_buttons.scss rename to dns2015/app/styles/_buttons.scss diff --git a/wp/wp-content/themes/dns2015/app/styles/_footer.scss b/dns2015/app/styles/_footer.scss similarity index 100% rename from wp/wp-content/themes/dns2015/app/styles/_footer.scss rename to dns2015/app/styles/_footer.scss diff --git a/wp/wp-content/themes/dns2015/app/styles/_forms.scss b/dns2015/app/styles/_forms.scss similarity index 100% rename from wp/wp-content/themes/dns2015/app/styles/_forms.scss rename to dns2015/app/styles/_forms.scss diff --git a/wp/wp-content/themes/dns2015/app/styles/_frontpage.scss b/dns2015/app/styles/_frontpage.scss similarity index 100% rename from wp/wp-content/themes/dns2015/app/styles/_frontpage.scss rename to dns2015/app/styles/_frontpage.scss diff --git a/wp/wp-content/themes/dns2015/app/styles/_general.scss b/dns2015/app/styles/_general.scss similarity index 100% rename from wp/wp-content/themes/dns2015/app/styles/_general.scss rename to dns2015/app/styles/_general.scss diff --git a/wp/wp-content/themes/dns2015/app/styles/_header.scss b/dns2015/app/styles/_header.scss similarity index 100% rename from wp/wp-content/themes/dns2015/app/styles/_header.scss rename to dns2015/app/styles/_header.scss diff --git a/wp/wp-content/themes/dns2015/app/styles/_menu.scss b/dns2015/app/styles/_menu.scss similarity index 100% rename from wp/wp-content/themes/dns2015/app/styles/_menu.scss rename to dns2015/app/styles/_menu.scss diff --git a/wp/wp-content/themes/dns2015/app/styles/_mixins.scss b/dns2015/app/styles/_mixins.scss similarity index 100% rename from wp/wp-content/themes/dns2015/app/styles/_mixins.scss rename to dns2015/app/styles/_mixins.scss diff --git a/wp/wp-content/themes/dns2015/app/styles/_pages_and_posts.scss b/dns2015/app/styles/_pages_and_posts.scss similarity index 100% rename from wp/wp-content/themes/dns2015/app/styles/_pages_and_posts.scss rename to dns2015/app/styles/_pages_and_posts.scss diff --git a/wp/wp-content/themes/dns2015/app/styles/app.scss b/dns2015/app/styles/app.scss similarity index 100% rename from wp/wp-content/themes/dns2015/app/styles/app.scss rename to dns2015/app/styles/app.scss diff --git a/wp/wp-content/themes/dns2015/audioplayer.php b/dns2015/audioplayer.php similarity index 100% rename from wp/wp-content/themes/dns2015/audioplayer.php rename to dns2015/audioplayer.php diff --git a/wp/wp-content/themes/dns2015/bower.json b/dns2015/bower.json similarity index 100% rename from wp/wp-content/themes/dns2015/bower.json rename to dns2015/bower.json diff --git a/wp/wp-content/themes/dns2015/cal/not_empty b/dns2015/cal/not_empty similarity index 100% rename from wp/wp-content/themes/dns2015/cal/not_empty rename to dns2015/cal/not_empty diff --git a/wp/wp-content/themes/dns2015/dist/images/dns-logo-web.png b/dns2015/dist/images/dns-logo-web.png similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/dns-logo-web.png rename to dns2015/dist/images/dns-logo-web.png diff --git a/wp/wp-content/themes/dns2015/dist/images/dns-logo-web_flipped.png b/dns2015/dist/images/dns-logo-web_flipped.png similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/dns-logo-web_flipped.png rename to dns2015/dist/images/dns-logo-web_flipped.png diff --git a/wp/wp-content/themes/dns2015/dist/images/dns_logo_emblem_sort.png b/dns2015/dist/images/dns_logo_emblem_sort.png similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/dns_logo_emblem_sort.png rename to dns2015/dist/images/dns_logo_emblem_sort.png diff --git a/wp/wp-content/themes/dns2015/dist/images/dns_logo_white.png b/dns2015/dist/images/dns_logo_white.png similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/dns_logo_white.png rename to dns2015/dist/images/dns_logo_white.png diff --git a/wp/wp-content/themes/dns2015/dist/images/dns_logo_white_newsletter.png b/dns2015/dist/images/dns_logo_white_newsletter.png similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/dns_logo_white_newsletter.png rename to dns2015/dist/images/dns_logo_white_newsletter.png diff --git a/wp/wp-content/themes/dns2015/dist/images/icons/contact_card.png b/dns2015/dist/images/icons/contact_card.png similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/icons/contact_card.png rename to dns2015/dist/images/icons/contact_card.png diff --git a/wp/wp-content/themes/dns2015/dist/images/icons/crowd.png b/dns2015/dist/images/icons/crowd.png similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/icons/crowd.png rename to dns2015/dist/images/icons/crowd.png diff --git a/wp/wp-content/themes/dns2015/dist/images/icons/facebook.png b/dns2015/dist/images/icons/facebook.png similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/icons/facebook.png rename to dns2015/dist/images/icons/facebook.png diff --git a/wp/wp-content/themes/dns2015/dist/images/icons/facebook.svg b/dns2015/dist/images/icons/facebook.svg similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/icons/facebook.svg rename to dns2015/dist/images/icons/facebook.svg diff --git a/wp/wp-content/themes/dns2015/dist/images/icons/flickr.svg b/dns2015/dist/images/icons/flickr.svg similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/icons/flickr.svg rename to dns2015/dist/images/icons/flickr.svg diff --git a/wp/wp-content/themes/dns2015/dist/images/icons/instagram.svg b/dns2015/dist/images/icons/instagram.svg similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/icons/instagram.svg rename to dns2015/dist/images/icons/instagram.svg diff --git a/wp/wp-content/themes/dns2015/dist/images/icons/location.svg b/dns2015/dist/images/icons/location.svg similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/icons/location.svg rename to dns2015/dist/images/icons/location.svg diff --git a/wp/wp-content/themes/dns2015/dist/images/icons/microphone.png b/dns2015/dist/images/icons/microphone.png similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/icons/microphone.png rename to dns2015/dist/images/icons/microphone.png diff --git a/wp/wp-content/themes/dns2015/dist/images/icons/twitter.svg b/dns2015/dist/images/icons/twitter.svg similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/icons/twitter.svg rename to dns2015/dist/images/icons/twitter.svg diff --git a/wp/wp-content/themes/dns2015/dist/images/piggies.jpg b/dns2015/dist/images/piggies.jpg similarity index 100% rename from wp/wp-content/themes/dns2015/dist/images/piggies.jpg rename to dns2015/dist/images/piggies.jpg diff --git a/wp/wp-content/themes/dns2015/dist/scripts/app.js b/dns2015/dist/scripts/app.js similarity index 100% rename from wp/wp-content/themes/dns2015/dist/scripts/app.js rename to dns2015/dist/scripts/app.js diff --git a/wp/wp-content/themes/dns2015/dist/scripts/vendor.js b/dns2015/dist/scripts/vendor.js similarity index 100% rename from wp/wp-content/themes/dns2015/dist/scripts/vendor.js rename to dns2015/dist/scripts/vendor.js diff --git a/wp/wp-content/themes/dns2015/dist/styles/app.css b/dns2015/dist/styles/app.css similarity index 100% rename from wp/wp-content/themes/dns2015/dist/styles/app.css rename to dns2015/dist/styles/app.css diff --git a/wp/wp-content/themes/dns2015/event-meta.php b/dns2015/event-meta.php similarity index 100% rename from wp/wp-content/themes/dns2015/event-meta.php rename to dns2015/event-meta.php diff --git a/favicon.ico b/dns2015/favicon.ico similarity index 100% rename from favicon.ico rename to dns2015/favicon.ico diff --git a/wp/wp-content/themes/dns2015/favicons.php b/dns2015/favicons.php similarity index 100% rename from wp/wp-content/themes/dns2015/favicons.php rename to dns2015/favicons.php diff --git a/wp/wp-content/themes/dns2015/favicons/browserconfig.xml b/dns2015/favicons/browserconfig.xml similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/browserconfig.xml rename to dns2015/favicons/browserconfig.xml diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-114.png b/dns2015/favicons/favicon-114.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-114.png rename to dns2015/favicons/favicon-114.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-120.png b/dns2015/favicons/favicon-120.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-120.png rename to dns2015/favicons/favicon-120.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-144.png b/dns2015/favicons/favicon-144.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-144.png rename to dns2015/favicons/favicon-144.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-150.png b/dns2015/favicons/favicon-150.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-150.png rename to dns2015/favicons/favicon-150.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-152.png b/dns2015/favicons/favicon-152.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-152.png rename to dns2015/favicons/favicon-152.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-16.png b/dns2015/favicons/favicon-16.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-16.png rename to dns2015/favicons/favicon-16.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-160.png b/dns2015/favicons/favicon-160.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-160.png rename to dns2015/favicons/favicon-160.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-180.png b/dns2015/favicons/favicon-180.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-180.png rename to dns2015/favicons/favicon-180.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-192.png b/dns2015/favicons/favicon-192.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-192.png rename to dns2015/favicons/favicon-192.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-310.png b/dns2015/favicons/favicon-310.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-310.png rename to dns2015/favicons/favicon-310.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-32.png b/dns2015/favicons/favicon-32.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-32.png rename to dns2015/favicons/favicon-32.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-57.png b/dns2015/favicons/favicon-57.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-57.png rename to dns2015/favicons/favicon-57.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-60.png b/dns2015/favicons/favicon-60.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-60.png rename to dns2015/favicons/favicon-60.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-64.png b/dns2015/favicons/favicon-64.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-64.png rename to dns2015/favicons/favicon-64.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-70.png b/dns2015/favicons/favicon-70.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-70.png rename to dns2015/favicons/favicon-70.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-72.png b/dns2015/favicons/favicon-72.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-72.png rename to dns2015/favicons/favicon-72.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-76.png b/dns2015/favicons/favicon-76.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-76.png rename to dns2015/favicons/favicon-76.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon-96.png b/dns2015/favicons/favicon-96.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon-96.png rename to dns2015/favicons/favicon-96.png diff --git a/wp/wp-content/themes/dns2015/favicons/favicon.png b/dns2015/favicons/favicon.png similarity index 100% rename from wp/wp-content/themes/dns2015/favicons/favicon.png rename to dns2015/favicons/favicon.png diff --git a/wp/wp-content/themes/dns2015/flickr-facebook.php b/dns2015/flickr-facebook.php similarity index 100% rename from wp/wp-content/themes/dns2015/flickr-facebook.php rename to dns2015/flickr-facebook.php diff --git a/wp/wp-content/themes/dns2015/footer.php b/dns2015/footer.php similarity index 100% rename from wp/wp-content/themes/dns2015/footer.php rename to dns2015/footer.php diff --git a/wp/wp-content/themes/dns2015/fp-articles.php b/dns2015/fp-articles.php similarity index 100% rename from wp/wp-content/themes/dns2015/fp-articles.php rename to dns2015/fp-articles.php diff --git a/wp/wp-content/themes/dns2015/fp-call-to-actions.php b/dns2015/fp-call-to-actions.php similarity index 100% rename from wp/wp-content/themes/dns2015/fp-call-to-actions.php rename to dns2015/fp-call-to-actions.php diff --git a/wp/wp-content/themes/dns2015/fp-events.php b/dns2015/fp-events.php similarity index 100% rename from wp/wp-content/themes/dns2015/fp-events.php rename to dns2015/fp-events.php diff --git a/wp/wp-content/themes/dns2015/fp-featured.php b/dns2015/fp-featured.php similarity index 100% rename from wp/wp-content/themes/dns2015/fp-featured.php rename to dns2015/fp-featured.php diff --git a/wp/wp-content/themes/dns2015/fp-studentmedia.php b/dns2015/fp-studentmedia.php similarity index 100% rename from wp/wp-content/themes/dns2015/fp-studentmedia.php rename to dns2015/fp-studentmedia.php diff --git a/wp/wp-content/themes/dns2015/front-page.php b/dns2015/front-page.php similarity index 100% rename from wp/wp-content/themes/dns2015/front-page.php rename to dns2015/front-page.php diff --git a/wp/wp-content/themes/dns2015/functions.php b/dns2015/functions.php similarity index 99% rename from wp/wp-content/themes/dns2015/functions.php rename to dns2015/functions.php index 8b352d0e..b093e85e 100644 --- a/wp/wp-content/themes/dns2015/functions.php +++ b/dns2015/functions.php @@ -724,6 +724,8 @@ function neuf_event_format_starttime_year($post) { } return ''; } + +/* FIXME: Move to neuf-events as function returning WP_Query */ function get_top_events_query() { global $wpdb; @@ -779,4 +781,9 @@ function wrap_iframes($content) { return $content; } add_filter('the_content', 'wrap_iframes'); -?> \ No newline at end of file + +/* Custom password reset URL */ +function neuf_lostpassword_url( $pwd ) { + return 'https://brukerinfo.neuf.no/accounts/password/reset'; +} +add_filter( 'lostpassword_url' , 'neuf_lostpassword_url'); diff --git a/wp/wp-content/themes/dns2015/gulpfile.js b/dns2015/gulpfile.js similarity index 93% rename from wp/wp-content/themes/dns2015/gulpfile.js rename to dns2015/gulpfile.js index 1b40c1d0..67c09513 100644 --- a/wp/wp-content/themes/dns2015/gulpfile.js +++ b/dns2015/gulpfile.js @@ -80,6 +80,15 @@ gulp.task('extras', function () { .pipe(gulp.dest('dist')); }); +gulp.task('i18n', function() { + return gulp.src('**/*.php') + .pipe($.wpPot({ + domain: 'neuf', + package: 'EDB-gjengen' + } )) + .pipe(gulp.dest('languages/dns2015.pot')); +}); + gulp.task('clean', function (cb) { return del(['.tmp', 'dist'], cb); }); diff --git a/wp/wp-content/themes/dns2015/header-infoscreen.php b/dns2015/header-infoscreen.php similarity index 100% rename from wp/wp-content/themes/dns2015/header-infoscreen.php rename to dns2015/header-infoscreen.php diff --git a/wp/wp-content/themes/dns2015/header.php b/dns2015/header.php similarity index 100% rename from wp/wp-content/themes/dns2015/header.php rename to dns2015/header.php diff --git a/wp/wp-content/themes/dns2015/inc/iCalcreator.class.php b/dns2015/inc/iCalcreator.class.php similarity index 100% rename from wp/wp-content/themes/dns2015/inc/iCalcreator.class.php rename to dns2015/inc/iCalcreator.class.php diff --git a/wp/wp-content/themes/dns2015/index.php b/dns2015/index.php similarity index 100% rename from wp/wp-content/themes/dns2015/index.php rename to dns2015/index.php diff --git a/wp/wp-content/themes/dns2015/languages/dns2015.pot b/dns2015/languages/dns2015.pot similarity index 100% rename from wp/wp-content/themes/dns2015/languages/dns2015.pot rename to dns2015/languages/dns2015.pot diff --git a/wp/wp-content/themes/dns2015/languages/nb_NO.mo b/dns2015/languages/nb_NO.mo similarity index 100% rename from wp/wp-content/themes/dns2015/languages/nb_NO.mo rename to dns2015/languages/nb_NO.mo diff --git a/wp/wp-content/themes/dns2015/languages/nb_NO.po b/dns2015/languages/nb_NO.po similarity index 100% rename from wp/wp-content/themes/dns2015/languages/nb_NO.po rename to dns2015/languages/nb_NO.po diff --git a/wp/wp-content/themes/dns2015/loop-page-full-width.php b/dns2015/loop-page-full-width.php similarity index 100% rename from wp/wp-content/themes/dns2015/loop-page-full-width.php rename to dns2015/loop-page-full-width.php diff --git a/wp/wp-content/themes/dns2015/loop-page.php b/dns2015/loop-page.php similarity index 100% rename from wp/wp-content/themes/dns2015/loop-page.php rename to dns2015/loop-page.php diff --git a/wp/wp-content/themes/dns2015/loop-post-full-width.php b/dns2015/loop-post-full-width.php similarity index 100% rename from wp/wp-content/themes/dns2015/loop-post-full-width.php rename to dns2015/loop-post-full-width.php diff --git a/wp/wp-content/themes/dns2015/loop-single.php b/dns2015/loop-single.php similarity index 100% rename from wp/wp-content/themes/dns2015/loop-single.php rename to dns2015/loop-single.php diff --git a/wp/wp-content/themes/dns2015/loop-taxonomy-event_type.php b/dns2015/loop-taxonomy-event_type.php similarity index 100% rename from wp/wp-content/themes/dns2015/loop-taxonomy-event_type.php rename to dns2015/loop-taxonomy-event_type.php diff --git a/wp/wp-content/themes/dns2015/loop.php b/dns2015/loop.php similarity index 100% rename from wp/wp-content/themes/dns2015/loop.php rename to dns2015/loop.php diff --git a/wp/wp-content/themes/dns2015/menu.php b/dns2015/menu.php similarity index 100% rename from wp/wp-content/themes/dns2015/menu.php rename to dns2015/menu.php diff --git a/wp/wp-content/themes/dns2015/newsletter-signup-form.php b/dns2015/newsletter-signup-form.php similarity index 100% rename from wp/wp-content/themes/dns2015/newsletter-signup-form.php rename to dns2015/newsletter-signup-form.php diff --git a/wp/wp-content/themes/dns2015/package.json b/dns2015/package.json similarity index 100% rename from wp/wp-content/themes/dns2015/package.json rename to dns2015/package.json diff --git a/wp/wp-content/themes/dns2015/page-templates/page-associations.php b/dns2015/page-templates/page-associations.php similarity index 100% rename from wp/wp-content/themes/dns2015/page-templates/page-associations.php rename to dns2015/page-templates/page-associations.php diff --git a/wp/wp-content/themes/dns2015/page-templates/page-event-next.php b/dns2015/page-templates/page-event-next.php similarity index 100% rename from wp/wp-content/themes/dns2015/page-templates/page-event-next.php rename to dns2015/page-templates/page-event-next.php diff --git a/wp/wp-content/themes/dns2015/page-templates/page-feed-articles.php b/dns2015/page-templates/page-feed-articles.php similarity index 100% rename from wp/wp-content/themes/dns2015/page-templates/page-feed-articles.php rename to dns2015/page-templates/page-feed-articles.php diff --git a/wp/wp-content/themes/dns2015/page-templates/page-feed-events-upcoming.php b/dns2015/page-templates/page-feed-events-upcoming.php similarity index 100% rename from wp/wp-content/themes/dns2015/page-templates/page-feed-events-upcoming.php rename to dns2015/page-templates/page-feed-events-upcoming.php diff --git a/wp/wp-content/themes/dns2015/page-templates/page-full-width.php b/dns2015/page-templates/page-full-width.php similarity index 100% rename from wp/wp-content/themes/dns2015/page-templates/page-full-width.php rename to dns2015/page-templates/page-full-width.php diff --git a/wp/wp-content/themes/dns2015/page-templates/page-ical.php b/dns2015/page-templates/page-ical.php similarity index 100% rename from wp/wp-content/themes/dns2015/page-templates/page-ical.php rename to dns2015/page-templates/page-ical.php diff --git a/wp/wp-content/themes/dns2015/page-templates/page-image-galleries.php b/dns2015/page-templates/page-image-galleries.php similarity index 100% rename from wp/wp-content/themes/dns2015/page-templates/page-image-galleries.php rename to dns2015/page-templates/page-image-galleries.php diff --git a/wp/wp-content/themes/dns2015/page-templates/page-info-daily-program.php b/dns2015/page-templates/page-info-daily-program.php similarity index 100% rename from wp/wp-content/themes/dns2015/page-templates/page-info-daily-program.php rename to dns2015/page-templates/page-info-daily-program.php diff --git a/wp/wp-content/themes/dns2015/page-templates/page-live.php b/dns2015/page-templates/page-live.php similarity index 100% rename from wp/wp-content/themes/dns2015/page-templates/page-live.php rename to dns2015/page-templates/page-live.php diff --git a/wp/wp-content/themes/dns2015/page-templates/page-newsletter-mailchimp.php b/dns2015/page-templates/page-newsletter-mailchimp.php similarity index 100% rename from wp/wp-content/themes/dns2015/page-templates/page-newsletter-mailchimp.php rename to dns2015/page-templates/page-newsletter-mailchimp.php diff --git a/wp/wp-content/themes/dns2015/page-templates/page-program.php b/dns2015/page-templates/page-program.php similarity index 100% rename from wp/wp-content/themes/dns2015/page-templates/page-program.php rename to dns2015/page-templates/page-program.php diff --git a/wp/wp-content/themes/dns2015/page.php b/dns2015/page.php similarity index 100% rename from wp/wp-content/themes/dns2015/page.php rename to dns2015/page.php diff --git a/wp/wp-content/themes/dns2015/program-6days.php b/dns2015/program-6days.php similarity index 100% rename from wp/wp-content/themes/dns2015/program-6days.php rename to dns2015/program-6days.php diff --git a/wp/wp-content/themes/dns2015/screenshot.png b/dns2015/screenshot.png similarity index 100% rename from wp/wp-content/themes/dns2015/screenshot.png rename to dns2015/screenshot.png diff --git a/wp/wp-content/themes/dns2015/scripts/program-ical-regen.php b/dns2015/scripts/program-ical-regen.php similarity index 100% rename from wp/wp-content/themes/dns2015/scripts/program-ical-regen.php rename to dns2015/scripts/program-ical-regen.php diff --git a/wp/wp-content/themes/dns2015/sidebar.php b/dns2015/sidebar.php similarity index 100% rename from wp/wp-content/themes/dns2015/sidebar.php rename to dns2015/sidebar.php diff --git a/wp/wp-content/themes/dns2015/single-association.php b/dns2015/single-association.php similarity index 100% rename from wp/wp-content/themes/dns2015/single-association.php rename to dns2015/single-association.php diff --git a/wp/wp-content/themes/dns2015/single-event.php b/dns2015/single-event.php similarity index 100% rename from wp/wp-content/themes/dns2015/single-event.php rename to dns2015/single-event.php diff --git a/wp/wp-content/themes/dns2015/single.php b/dns2015/single.php similarity index 100% rename from wp/wp-content/themes/dns2015/single.php rename to dns2015/single.php diff --git a/wp/wp-content/themes/dns2015/style.css b/dns2015/style.css similarity index 100% rename from wp/wp-content/themes/dns2015/style.css rename to dns2015/style.css diff --git a/wp/wp-content/themes/dns2015/taxonomy-event_type.php b/dns2015/taxonomy-event_type.php similarity index 100% rename from wp/wp-content/themes/dns2015/taxonomy-event_type.php rename to dns2015/taxonomy-event_type.php diff --git a/fabfile.py b/fabfile.py new file mode 100644 index 00000000..9e90759b --- /dev/null +++ b/fabfile.py @@ -0,0 +1,38 @@ +from fabric.operations import local as lrun +from fabric.api import cd, env, lcd, run + +env.use_ssh_config = True +env.forward_agent = True +env.hosts = ['dreamcast.neuf.no'] +env.user = 'gitdeploy' + +project_path = '/var/www/studentersamfundet.no/www' +theme_path = 'dns2015/' +gulp_file = '{}gulpfile.js'.format(theme_path) + +def install(): + with lcd(theme_path): + lrun('npm install && bower install') + +def _gulp_cmd(cmd): + lrun('gulp --gulpfile={} {}'.format(gulp_file, cmd)) + +def build(): + _gulp_cmd('build') + +def i18n(): + _gulp_cmd('i18n') + +def watch(): + _gulp_cmd('watch') + +def deploy(): + with cd(project_path): + run('git pull') + +def upgrade_wp(): + with cd(project_path): + run('wp core update') + run('wp plugin update --all') + run('wp theme update --all') + run('wp core language update') diff --git a/index.php b/index.php deleted file mode 100755 index c80ea1a9..00000000 --- a/index.php +++ /dev/null @@ -1,18 +0,0 @@ - diff --git a/wp/wp-content/themes/neuf-old-style/404.php b/neuf-old-style/404.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/404.php rename to neuf-old-style/404.php diff --git a/wp/wp-content/themes/neuf-old-style/audioplayer.php b/neuf-old-style/audioplayer.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/audioplayer.php rename to neuf-old-style/audioplayer.php diff --git a/wp/wp-content/themes/neuf-old-style/cal/.gitignore b/neuf-old-style/cal/.gitignore similarity index 100% rename from wp/wp-content/themes/neuf-old-style/cal/.gitignore rename to neuf-old-style/cal/.gitignore diff --git a/wp/wp-content/themes/neuf-old-style/css/grid.css b/neuf-old-style/css/grid.css similarity index 100% rename from wp/wp-content/themes/neuf-old-style/css/grid.css rename to neuf-old-style/css/grid.css diff --git a/wp/wp-content/themes/neuf-old-style/css/lightbox.css b/neuf-old-style/css/lightbox.css similarity index 100% rename from wp/wp-content/themes/neuf-old-style/css/lightbox.css rename to neuf-old-style/css/lightbox.css diff --git a/wp/wp-content/themes/neuf-old-style/css/rebuild.css b/neuf-old-style/css/rebuild.css similarity index 100% rename from wp/wp-content/themes/neuf-old-style/css/rebuild.css rename to neuf-old-style/css/rebuild.css diff --git a/wp/wp-content/themes/neuf-old-style/css/reset.css b/neuf-old-style/css/reset.css similarity index 100% rename from wp/wp-content/themes/neuf-old-style/css/reset.css rename to neuf-old-style/css/reset.css diff --git a/wp/wp-content/themes/neuf-old-style/css/wp.css b/neuf-old-style/css/wp.css similarity index 100% rename from wp/wp-content/themes/neuf-old-style/css/wp.css rename to neuf-old-style/css/wp.css diff --git a/wp/wp-content/themes/neuf-old-style/digest.php b/neuf-old-style/digest.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/digest.php rename to neuf-old-style/digest.php diff --git a/wp/wp-content/themes/neuf-old-style/eventmeta-single.php b/neuf-old-style/eventmeta-single.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/eventmeta-single.php rename to neuf-old-style/eventmeta-single.php diff --git a/wp/wp-content/themes/neuf-old-style/eventmeta.php b/neuf-old-style/eventmeta.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/eventmeta.php rename to neuf-old-style/eventmeta.php diff --git a/wp/wp-content/themes/neuf-old-style/eventslider.php b/neuf-old-style/eventslider.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/eventslider.php rename to neuf-old-style/eventslider.php diff --git a/wp/wp-content/themes/neuf-old-style/flickr-facebook.php b/neuf-old-style/flickr-facebook.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/flickr-facebook.php rename to neuf-old-style/flickr-facebook.php diff --git a/wp/wp-content/themes/neuf-old-style/flowplayer-3.2.6.min.js b/neuf-old-style/flowplayer-3.2.6.min.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/flowplayer-3.2.6.min.js rename to neuf-old-style/flowplayer-3.2.6.min.js diff --git a/wp/wp-content/themes/neuf-old-style/flowplayer-3.2.7.swf b/neuf-old-style/flowplayer-3.2.7.swf similarity index 100% rename from wp/wp-content/themes/neuf-old-style/flowplayer-3.2.7.swf rename to neuf-old-style/flowplayer-3.2.7.swf diff --git a/wp/wp-content/themes/neuf-old-style/flowplayer.controls-3.2.5.swf b/neuf-old-style/flowplayer.controls-3.2.5.swf similarity index 100% rename from wp/wp-content/themes/neuf-old-style/flowplayer.controls-3.2.5.swf rename to neuf-old-style/flowplayer.controls-3.2.5.swf diff --git a/wp/wp-content/themes/neuf-old-style/footer.php b/neuf-old-style/footer.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/footer.php rename to neuf-old-style/footer.php diff --git a/wp/wp-content/themes/neuf-old-style/front-page.php b/neuf-old-style/front-page.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/front-page.php rename to neuf-old-style/front-page.php diff --git a/wp/wp-content/themes/neuf-old-style/functions.php b/neuf-old-style/functions.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/functions.php rename to neuf-old-style/functions.php diff --git a/wp/wp-content/themes/neuf-old-style/header-infoscreen.php b/neuf-old-style/header-infoscreen.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/header-infoscreen.php rename to neuf-old-style/header-infoscreen.php diff --git a/wp/wp-content/themes/neuf-old-style/header.php b/neuf-old-style/header.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/header.php rename to neuf-old-style/header.php diff --git a/wp/wp-content/themes/neuf-old-style/home.php b/neuf-old-style/home.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/home.php rename to neuf-old-style/home.php diff --git a/wp/wp-content/themes/neuf-old-style/iCalcreator.class.php b/neuf-old-style/iCalcreator.class.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/iCalcreator.class.php rename to neuf-old-style/iCalcreator.class.php diff --git a/wp/wp-content/themes/neuf-old-style/img/ajax-loader.gif b/neuf-old-style/img/ajax-loader.gif similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/ajax-loader.gif rename to neuf-old-style/img/ajax-loader.gif diff --git a/wp/wp-content/themes/neuf-old-style/img/arrow-down.png b/neuf-old-style/img/arrow-down.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/arrow-down.png rename to neuf-old-style/img/arrow-down.png diff --git a/wp/wp-content/themes/neuf-old-style/img/bannerindex-400.png b/neuf-old-style/img/bannerindex-400.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/bannerindex-400.png rename to neuf-old-style/img/bannerindex-400.png diff --git a/wp/wp-content/themes/neuf-old-style/img/bannerindex-800.png b/neuf-old-style/img/bannerindex-800.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/bannerindex-800.png rename to neuf-old-style/img/bannerindex-800.png diff --git a/wp/wp-content/themes/neuf-old-style/img/bird_twitter.png b/neuf-old-style/img/bird_twitter.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/bird_twitter.png rename to neuf-old-style/img/bird_twitter.png diff --git a/wp/wp-content/themes/neuf-old-style/img/blank.gif b/neuf-old-style/img/blank.gif similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/blank.gif rename to neuf-old-style/img/blank.gif diff --git a/wp/wp-content/themes/neuf-old-style/img/bullet.gif b/neuf-old-style/img/bullet.gif similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/bullet.gif rename to neuf-old-style/img/bullet.gif diff --git a/wp/wp-content/themes/neuf-old-style/img/close.gif b/neuf-old-style/img/close.gif similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/close.gif rename to neuf-old-style/img/close.gif diff --git a/wp/wp-content/themes/neuf-old-style/img/closelabel.gif b/neuf-old-style/img/closelabel.gif similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/closelabel.gif rename to neuf-old-style/img/closelabel.gif diff --git a/wp/wp-content/themes/neuf-old-style/img/dns-logo-web.png b/neuf-old-style/img/dns-logo-web.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/dns-logo-web.png rename to neuf-old-style/img/dns-logo-web.png diff --git a/wp/wp-content/themes/neuf-old-style/img/dns-logo-web_flipped.png b/neuf-old-style/img/dns-logo-web_flipped.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/dns-logo-web_flipped.png rename to neuf-old-style/img/dns-logo-web_flipped.png diff --git a/wp/wp-content/themes/neuf-old-style/img/dns_logo_emblem_sort.png b/neuf-old-style/img/dns_logo_emblem_sort.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/dns_logo_emblem_sort.png rename to neuf-old-style/img/dns_logo_emblem_sort.png diff --git a/wp/wp-content/themes/neuf-old-style/img/donate-button.gif b/neuf-old-style/img/donate-button.gif similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/donate-button.gif rename to neuf-old-style/img/donate-button.gif diff --git a/wp/wp-content/themes/neuf-old-style/img/download-icon.gif b/neuf-old-style/img/download-icon.gif similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/download-icon.gif rename to neuf-old-style/img/download-icon.gif diff --git a/wp/wp-content/themes/neuf-old-style/img/facebook-icon.png b/neuf-old-style/img/facebook-icon.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/facebook-icon.png rename to neuf-old-style/img/facebook-icon.png diff --git a/wp/wp-content/themes/neuf-old-style/img/gradient.png b/neuf-old-style/img/gradient.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/gradient.png rename to neuf-old-style/img/gradient.png diff --git a/wp/wp-content/themes/neuf-old-style/img/ikon_debatt-50x50.png b/neuf-old-style/img/ikon_debatt-50x50.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/ikon_debatt-50x50.png rename to neuf-old-style/img/ikon_debatt-50x50.png diff --git a/wp/wp-content/themes/neuf-old-style/img/ikon_fest-50x50.png b/neuf-old-style/img/ikon_fest-50x50.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/ikon_fest-50x50.png rename to neuf-old-style/img/ikon_fest-50x50.png diff --git a/wp/wp-content/themes/neuf-old-style/img/ikon_film-50x50.png b/neuf-old-style/img/ikon_film-50x50.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/ikon_film-50x50.png rename to neuf-old-style/img/ikon_film-50x50.png diff --git a/wp/wp-content/themes/neuf-old-style/img/ikon_foredrag-50x50.png b/neuf-old-style/img/ikon_foredrag-50x50.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/ikon_foredrag-50x50.png rename to neuf-old-style/img/ikon_foredrag-50x50.png diff --git a/wp/wp-content/themes/neuf-old-style/img/ikon_konsert-50x50.png b/neuf-old-style/img/ikon_konsert-50x50.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/ikon_konsert-50x50.png rename to neuf-old-style/img/ikon_konsert-50x50.png diff --git a/wp/wp-content/themes/neuf-old-style/img/ikon_nyheter-35x35.png b/neuf-old-style/img/ikon_nyheter-35x35.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/ikon_nyheter-35x35.png rename to neuf-old-style/img/ikon_nyheter-35x35.png diff --git a/wp/wp-content/themes/neuf-old-style/img/ikon_nyheter-50x50.png b/neuf-old-style/img/ikon_nyheter-50x50.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/ikon_nyheter-50x50.png rename to neuf-old-style/img/ikon_nyheter-50x50.png diff --git a/wp/wp-content/themes/neuf-old-style/img/ikon_quiz-50x50.png b/neuf-old-style/img/ikon_quiz-50x50.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/ikon_quiz-50x50.png rename to neuf-old-style/img/ikon_quiz-50x50.png diff --git a/wp/wp-content/themes/neuf-old-style/img/ikon_teater-50x50.png b/neuf-old-style/img/ikon_teater-50x50.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/ikon_teater-50x50.png rename to neuf-old-style/img/ikon_teater-50x50.png diff --git a/wp/wp-content/themes/neuf-old-style/img/ikon_tiles-35x35.png b/neuf-old-style/img/ikon_tiles-35x35.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/ikon_tiles-35x35.png rename to neuf-old-style/img/ikon_tiles-35x35.png diff --git a/wp/wp-content/themes/neuf-old-style/img/ikon_tiles-50x50.png b/neuf-old-style/img/ikon_tiles-50x50.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/ikon_tiles-50x50.png rename to neuf-old-style/img/ikon_tiles-50x50.png diff --git a/wp/wp-content/themes/neuf-old-style/img/intern1.jpeg b/neuf-old-style/img/intern1.jpeg similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/intern1.jpeg rename to neuf-old-style/img/intern1.jpeg diff --git a/wp/wp-content/themes/neuf-old-style/img/listevisning.png b/neuf-old-style/img/listevisning.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/listevisning.png rename to neuf-old-style/img/listevisning.png diff --git a/wp/wp-content/themes/neuf-old-style/img/loading.gif b/neuf-old-style/img/loading.gif similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/loading.gif rename to neuf-old-style/img/loading.gif diff --git a/wp/wp-content/themes/neuf-old-style/img/logo-rn-x86.png b/neuf-old-style/img/logo-rn-x86.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/logo-rn-x86.png rename to neuf-old-style/img/logo-rn-x86.png diff --git a/wp/wp-content/themes/neuf-old-style/img/logo-rn.png b/neuf-old-style/img/logo-rn.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/logo-rn.png rename to neuf-old-style/img/logo-rn.png diff --git a/wp/wp-content/themes/neuf-old-style/img/logo-svart-hvit.png b/neuf-old-style/img/logo-svart-hvit.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/logo-svart-hvit.png rename to neuf-old-style/img/logo-svart-hvit.png diff --git a/wp/wp-content/themes/neuf-old-style/img/logo-web.png b/neuf-old-style/img/logo-web.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/logo-web.png rename to neuf-old-style/img/logo-web.png diff --git a/wp/wp-content/themes/neuf-old-style/img/logo-web.png.bak b/neuf-old-style/img/logo-web.png.bak similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/logo-web.png.bak rename to neuf-old-style/img/logo-web.png.bak diff --git a/wp/wp-content/themes/neuf-old-style/img/next.gif b/neuf-old-style/img/next.gif similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/next.gif rename to neuf-old-style/img/next.gif diff --git a/wp/wp-content/themes/neuf-old-style/img/nextlabel.gif b/neuf-old-style/img/nextlabel.gif similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/nextlabel.gif rename to neuf-old-style/img/nextlabel.gif diff --git a/wp/wp-content/themes/neuf-old-style/img/oktoberfest-small.png b/neuf-old-style/img/oktoberfest-small.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/oktoberfest-small.png rename to neuf-old-style/img/oktoberfest-small.png diff --git a/wp/wp-content/themes/neuf-old-style/img/orange-fade.png b/neuf-old-style/img/orange-fade.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/orange-fade.png rename to neuf-old-style/img/orange-fade.png diff --git a/wp/wp-content/themes/neuf-old-style/img/pig.png b/neuf-old-style/img/pig.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/pig.png rename to neuf-old-style/img/pig.png diff --git a/wp/wp-content/themes/neuf-old-style/img/piggies.jpg b/neuf-old-style/img/piggies.jpg similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/piggies.jpg rename to neuf-old-style/img/piggies.jpg diff --git a/wp/wp-content/themes/neuf-old-style/img/prev.gif b/neuf-old-style/img/prev.gif similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/prev.gif rename to neuf-old-style/img/prev.gif diff --git a/wp/wp-content/themes/neuf-old-style/img/prevlabel.gif b/neuf-old-style/img/prevlabel.gif similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/prevlabel.gif rename to neuf-old-style/img/prevlabel.gif diff --git a/wp/wp-content/themes/neuf-old-style/img/sirkel.png b/neuf-old-style/img/sirkel.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/sirkel.png rename to neuf-old-style/img/sirkel.png diff --git a/wp/wp-content/themes/neuf-old-style/img/sponsors/akademika.png b/neuf-old-style/img/sponsors/akademika.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/sponsors/akademika.png rename to neuf-old-style/img/sponsors/akademika.png diff --git a/wp/wp-content/themes/neuf-old-style/img/sponsors/logo_black_akademika.png b/neuf-old-style/img/sponsors/logo_black_akademika.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/sponsors/logo_black_akademika.png rename to neuf-old-style/img/sponsors/logo_black_akademika.png diff --git a/wp/wp-content/themes/neuf-old-style/img/sponsors/logo_black_nrf.png b/neuf-old-style/img/sponsors/logo_black_nrf.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/sponsors/logo_black_nrf.png rename to neuf-old-style/img/sponsors/logo_black_nrf.png diff --git a/wp/wp-content/themes/neuf-old-style/img/sponsors/logo_black_uio.png b/neuf-old-style/img/sponsors/logo_black_uio.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/sponsors/logo_black_uio.png rename to neuf-old-style/img/sponsors/logo_black_uio.png diff --git a/wp/wp-content/themes/neuf-old-style/img/sponsors/logo_red_akademika.png b/neuf-old-style/img/sponsors/logo_red_akademika.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/sponsors/logo_red_akademika.png rename to neuf-old-style/img/sponsors/logo_red_akademika.png diff --git a/wp/wp-content/themes/neuf-old-style/img/sponsors/logo_sh86.png b/neuf-old-style/img/sponsors/logo_sh86.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/sponsors/logo_sh86.png rename to neuf-old-style/img/sponsors/logo_sh86.png diff --git a/wp/wp-content/themes/neuf-old-style/img/sponsors/logo_uio86.png b/neuf-old-style/img/sponsors/logo_uio86.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/sponsors/logo_uio86.png rename to neuf-old-style/img/sponsors/logo_uio86.png diff --git a/wp/wp-content/themes/neuf-old-style/img/sponsors/nrf-86x86.png b/neuf-old-style/img/sponsors/nrf-86x86.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/sponsors/nrf-86x86.png rename to neuf-old-style/img/sponsors/nrf-86x86.png diff --git a/wp/wp-content/themes/neuf-old-style/img/svart-200x.gif b/neuf-old-style/img/svart-200x.gif similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/svart-200x.gif rename to neuf-old-style/img/svart-200x.gif diff --git a/wp/wp-content/themes/neuf-old-style/img/testingtile.png b/neuf-old-style/img/testingtile.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/testingtile.png rename to neuf-old-style/img/testingtile.png diff --git a/wp/wp-content/themes/neuf-old-style/img/tilesvisning.png b/neuf-old-style/img/tilesvisning.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/tilesvisning.png rename to neuf-old-style/img/tilesvisning.png diff --git a/wp/wp-content/themes/neuf-old-style/img/uk.png b/neuf-old-style/img/uk.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/img/uk.png rename to neuf-old-style/img/uk.png diff --git a/wp/wp-content/themes/neuf-old-style/index.php b/neuf-old-style/index.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/index.php rename to neuf-old-style/index.php diff --git a/wp/wp-content/themes/neuf-old-style/js/application.js b/neuf-old-style/js/application.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/application.js rename to neuf-old-style/js/application.js diff --git a/wp/wp-content/themes/neuf-old-style/js/front-page.js b/neuf-old-style/js/front-page.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/front-page.js rename to neuf-old-style/js/front-page.js diff --git a/wp/wp-content/themes/neuf-old-style/js/html5shiv.js b/neuf-old-style/js/html5shiv.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/html5shiv.js rename to neuf-old-style/js/html5shiv.js diff --git a/wp/wp-content/themes/neuf-old-style/js/jquery-1.7.1.min.js b/neuf-old-style/js/jquery-1.7.1.min.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/jquery-1.7.1.min.js rename to neuf-old-style/js/jquery-1.7.1.min.js diff --git a/wp/wp-content/themes/neuf-old-style/js/jquery.cycle.all.js b/neuf-old-style/js/jquery.cycle.all.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/jquery.cycle.all.js rename to neuf-old-style/js/jquery.cycle.all.js diff --git a/wp/wp-content/themes/neuf-old-style/js/knockout-2.0.0.js b/neuf-old-style/js/knockout-2.0.0.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/knockout-2.0.0.js rename to neuf-old-style/js/knockout-2.0.0.js diff --git a/wp/wp-content/themes/neuf-old-style/js/knockout-2.3.0.js b/neuf-old-style/js/knockout-2.3.0.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/knockout-2.3.0.js rename to neuf-old-style/js/knockout-2.3.0.js diff --git a/wp/wp-content/themes/neuf-old-style/js/lang/nb.js b/neuf-old-style/js/lang/nb.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/lang/nb.js rename to neuf-old-style/js/lang/nb.js diff --git a/wp/wp-content/themes/neuf-old-style/js/moment.min.js b/neuf-old-style/js/moment.min.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/moment.min.js rename to neuf-old-style/js/moment.min.js diff --git a/wp/wp-content/themes/neuf-old-style/js/neuf/eventProgram.js b/neuf-old-style/js/neuf/eventProgram.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/neuf/eventProgram.js rename to neuf-old-style/js/neuf/eventProgram.js diff --git a/wp/wp-content/themes/neuf-old-style/js/neuf/util/date-nb-NO.js b/neuf-old-style/js/neuf/util/date-nb-NO.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/neuf/util/date-nb-NO.js rename to neuf-old-style/js/neuf/util/date-nb-NO.js diff --git a/wp/wp-content/themes/neuf-old-style/js/neuf/util/util.js b/neuf-old-style/js/neuf/util/util.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/neuf/util/util.js rename to neuf-old-style/js/neuf/util/util.js diff --git a/wp/wp-content/themes/neuf-old-style/js/program.js b/neuf-old-style/js/program.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/program.js rename to neuf-old-style/js/program.js diff --git a/wp/wp-content/themes/neuf-old-style/js/underscore-min.js b/neuf-old-style/js/underscore-min.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/underscore-min.js rename to neuf-old-style/js/underscore-min.js diff --git a/wp/wp-content/themes/neuf-old-style/js/underscore.js b/neuf-old-style/js/underscore.js similarity index 100% rename from wp/wp-content/themes/neuf-old-style/js/underscore.js rename to neuf-old-style/js/underscore.js diff --git a/wp/wp-content/themes/neuf-old-style/kampanje/afm_2011.php b/neuf-old-style/kampanje/afm_2011.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/kampanje/afm_2011.php rename to neuf-old-style/kampanje/afm_2011.php diff --git a/wp/wp-content/themes/neuf-old-style/kampanje/kroplingen.php b/neuf-old-style/kampanje/kroplingen.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/kampanje/kroplingen.php rename to neuf-old-style/kampanje/kroplingen.php diff --git a/wp/wp-content/themes/neuf-old-style/kampanje/semesterstart2010.php b/neuf-old-style/kampanje/semesterstart2010.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/kampanje/semesterstart2010.php rename to neuf-old-style/kampanje/semesterstart2010.php diff --git a/wp/wp-content/themes/neuf-old-style/kampanje/studio_nedtelling.php b/neuf-old-style/kampanje/studio_nedtelling.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/kampanje/studio_nedtelling.php rename to neuf-old-style/kampanje/studio_nedtelling.php diff --git a/wp/wp-content/themes/neuf-old-style/kampanje/studio_rocky.php b/neuf-old-style/kampanje/studio_rocky.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/kampanje/studio_rocky.php rename to neuf-old-style/kampanje/studio_rocky.php diff --git a/wp/wp-content/themes/neuf-old-style/kampanje/studio_rocky.png b/neuf-old-style/kampanje/studio_rocky.png similarity index 100% rename from wp/wp-content/themes/neuf-old-style/kampanje/studio_rocky.png rename to neuf-old-style/kampanje/studio_rocky.png diff --git a/wp/wp-content/themes/neuf-old-style/loop-event.php b/neuf-old-style/loop-event.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/loop-event.php rename to neuf-old-style/loop-event.php diff --git a/wp/wp-content/themes/neuf-old-style/loop-page-full-width.php b/neuf-old-style/loop-page-full-width.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/loop-page-full-width.php rename to neuf-old-style/loop-page-full-width.php diff --git a/wp/wp-content/themes/neuf-old-style/loop-page.php b/neuf-old-style/loop-page.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/loop-page.php rename to neuf-old-style/loop-page.php diff --git a/wp/wp-content/themes/neuf-old-style/loop-post-full-width.php b/neuf-old-style/loop-post-full-width.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/loop-post-full-width.php rename to neuf-old-style/loop-post-full-width.php diff --git a/wp/wp-content/themes/neuf-old-style/loop-single.php b/neuf-old-style/loop-single.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/loop-single.php rename to neuf-old-style/loop-single.php diff --git a/wp/wp-content/themes/neuf-old-style/loop-taxonomy-event_type.php b/neuf-old-style/loop-taxonomy-event_type.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/loop-taxonomy-event_type.php rename to neuf-old-style/loop-taxonomy-event_type.php diff --git a/wp/wp-content/themes/neuf-old-style/loop.php b/neuf-old-style/loop.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/loop.php rename to neuf-old-style/loop.php diff --git a/wp/wp-content/themes/neuf-old-style/menu.php b/neuf-old-style/menu.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/menu.php rename to neuf-old-style/menu.php diff --git a/wp/wp-content/themes/neuf-old-style/news-feed.php b/neuf-old-style/news-feed.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/news-feed.php rename to neuf-old-style/news-feed.php diff --git a/wp/wp-content/themes/neuf-old-style/newsletter-signup-form.php b/neuf-old-style/newsletter-signup-form.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/newsletter-signup-form.php rename to neuf-old-style/newsletter-signup-form.php diff --git a/wp/wp-content/themes/neuf-old-style/page-foreningene.php b/neuf-old-style/page-foreningene.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/page-foreningene.php rename to neuf-old-style/page-foreningene.php diff --git a/wp/wp-content/themes/neuf-old-style/page-full-width.php b/neuf-old-style/page-full-width.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/page-full-width.php rename to neuf-old-style/page-full-width.php diff --git a/wp/wp-content/themes/neuf-old-style/page-ical.php b/neuf-old-style/page-ical.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/page-ical.php rename to neuf-old-style/page-ical.php diff --git a/wp/wp-content/themes/neuf-old-style/page-image-galleries.php b/neuf-old-style/page-image-galleries.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/page-image-galleries.php rename to neuf-old-style/page-image-galleries.php diff --git a/wp/wp-content/themes/neuf-old-style/page-info-daily-program.php b/neuf-old-style/page-info-daily-program.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/page-info-daily-program.php rename to neuf-old-style/page-info-daily-program.php diff --git a/wp/wp-content/themes/neuf-old-style/page-info-tweet.php b/neuf-old-style/page-info-tweet.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/page-info-tweet.php rename to neuf-old-style/page-info-tweet.php diff --git a/wp/wp-content/themes/neuf-old-style/page-live.php b/neuf-old-style/page-live.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/page-live.php rename to neuf-old-style/page-live.php diff --git a/wp/wp-content/themes/neuf-old-style/page-mailchimp-newsletter.php b/neuf-old-style/page-mailchimp-newsletter.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/page-mailchimp-newsletter.php rename to neuf-old-style/page-mailchimp-newsletter.php diff --git a/wp/wp-content/themes/neuf-old-style/page-neste-arrangement.php b/neuf-old-style/page-neste-arrangement.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/page-neste-arrangement.php rename to neuf-old-style/page-neste-arrangement.php diff --git a/wp/wp-content/themes/neuf-old-style/page-newsletter.php b/neuf-old-style/page-newsletter.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/page-newsletter.php rename to neuf-old-style/page-newsletter.php diff --git a/wp/wp-content/themes/neuf-old-style/page-ninjanewsletter.php b/neuf-old-style/page-ninjanewsletter.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/page-ninjanewsletter.php rename to neuf-old-style/page-ninjanewsletter.php diff --git a/wp/wp-content/themes/neuf-old-style/page-program.php b/neuf-old-style/page-program.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/page-program.php rename to neuf-old-style/page-program.php diff --git a/wp/wp-content/themes/neuf-old-style/page-syndikering-kommende-program.php b/neuf-old-style/page-syndikering-kommende-program.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/page-syndikering-kommende-program.php rename to neuf-old-style/page-syndikering-kommende-program.php diff --git a/wp/wp-content/themes/neuf-old-style/page.php b/neuf-old-style/page.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/page.php rename to neuf-old-style/page.php diff --git a/wp/wp-content/themes/neuf-old-style/program-3days.php b/neuf-old-style/program-3days.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/program-3days.php rename to neuf-old-style/program-3days.php diff --git a/wp/wp-content/themes/neuf-old-style/program-6days.php b/neuf-old-style/program-6days.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/program-6days.php rename to neuf-old-style/program-6days.php diff --git a/wp/wp-content/themes/neuf-old-style/program-ical-regen.php b/neuf-old-style/program-ical-regen.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/program-ical-regen.php rename to neuf-old-style/program-ical-regen.php diff --git a/wp/wp-content/themes/neuf-old-style/sidebar.php b/neuf-old-style/sidebar.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/sidebar.php rename to neuf-old-style/sidebar.php diff --git a/wp/wp-content/themes/neuf-old-style/single-event.php b/neuf-old-style/single-event.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/single-event.php rename to neuf-old-style/single-event.php diff --git a/wp/wp-content/themes/neuf-old-style/single.php b/neuf-old-style/single.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/single.php rename to neuf-old-style/single.php diff --git a/wp/wp-content/themes/neuf-old-style/studentmedia.php b/neuf-old-style/studentmedia.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/studentmedia.php rename to neuf-old-style/studentmedia.php diff --git a/wp/wp-content/themes/neuf-old-style/style.css b/neuf-old-style/style.css similarity index 100% rename from wp/wp-content/themes/neuf-old-style/style.css rename to neuf-old-style/style.css diff --git a/wp/wp-content/themes/neuf-old-style/taxonomy-event_type.php b/neuf-old-style/taxonomy-event_type.php similarity index 100% rename from wp/wp-content/themes/neuf-old-style/taxonomy-event_type.php rename to neuf-old-style/taxonomy-event_type.php diff --git a/plugins/neuf-associations/languages/neuf_assoc-nb_NO.mo b/plugins/neuf-associations/languages/neuf_assoc-nb_NO.mo new file mode 100644 index 0000000000000000000000000000000000000000..2c12141d3721813780893b672bcc773b5869f2fa GIT binary patch literal 1265 zcmaKrOHWfl6vszJ#rg=o;>MVXTQl^w!~`xrpa`*{V104rUY z_z76~4cNKB&)~*{wQDzST=*YKZHbRbPk(dIocG*&cx~(h!@2^w4S5H-4*3ZQ>**=R z&VxlT=%0fZK{|eZ4PL_YE;s?c2hW0g;7#x&cnACh2LD5F4EzoT`yXJ4KYp6AyO0S; zh(86Rz{lV?xD4I^D_{mxVDR@~$hQmL0^foh+yk$IpF#ZC7yN}fzk(s&HxQ|hVg-Ms zJ+eCohVzj70wk<3n^0r$KLZ)8%Y#kee3I~0>J7-}oijBhy)v5pW6u-vQnlRZxnqlo z@+Z8DZJ82VHCzruI$k$jo%~(PmFC_`*I?@;ZLKjH&9TZ(huDUq-l&?rq^eV%SlOB_ zs(DdN#0FW1>SL~{TNk6rGi%f_){7OFszemJsS_0w^Gx|!MJ!l4YFa#zo?@Pla(NNu zL_XrVnfU(Hy(kw&FcfRFtwQ)e?ebAPHPg2%N#{kyO6^+G8yoXg)if=s__9^bE9gn{ z2fD9p&ZTXPbFyaIk1{2x(=O&FDkR(g_nULRn~?TsSGMbzD)~umh9S_{N^xazIFH<9 zlvyxv&?pYmjJc;bKHEWIdY0E3(mL`FUsRUF^w2IeQ70=Fb` zVo)$@HMU17n&So2Y|GZrW|?++#wM2!-90wk-ic0Y{RrE+nJ+y*P=@oa*5v=C=Zd?7eGHwgAM7{r UH1r(2t<8 literal 0 HcmV?d00001 diff --git a/plugins/neuf-associations/languages/neuf_assoc-nb_NO.po b/plugins/neuf-associations/languages/neuf_assoc-nb_NO.po new file mode 100644 index 00000000..794d8d96 --- /dev/null +++ b/plugins/neuf-associations/languages/neuf_assoc-nb_NO.po @@ -0,0 +1,78 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: neuf-associations\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-01-20 19:53+0100\n" +"PO-Revision-Date: 2012-01-20 20:39+0100\n" +"Last-Translator: Nikolai Kristiansen \n" +"Language-Team: Nikolai Kristiansen \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: Norwegian Bokmal\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-Basepath: /home/nikolark/dev/edb/neuf-web/wp-content/plugins/neuf-associations\n" +"X-Poedit-SearchPath-0: .\n" + +#: neuf-associations-post-type.php:5 +msgid "Associations" +msgstr "Foreninger" + +#: neuf-associations-post-type.php:6 +#: neuf-associations-admin.php:6 +msgid "Association" +msgstr "Forening" + +#: neuf-associations-post-type.php:7 +#: neuf-associations-post-type.php:8 +msgid "Add New" +msgstr "Legg til ny" + +#: neuf-associations-post-type.php:9 +msgid "Edit Association" +msgstr "Rediger forening" + +#: neuf-associations-post-type.php:10 +msgid "Add New Association" +msgstr "Legg til ny" + +#: neuf-associations-post-type.php:11 +msgid "View Association" +msgstr "Vis forening" + +#: neuf-associations-post-type.php:12 +msgid "Search Associations" +msgstr "Søk i foreninger" + +#: neuf-associations-post-type.php:13 +msgid "No associations found" +msgstr "Ingen foreninger funnet" + +#: neuf-associations-post-type.php:14 +msgid "No associations found in trash" +msgstr "Ingen foreninger funnet i søpla" + +#: neuf-associations-admin.php:7 +msgid "Image" +msgstr "Bilde" + +#: neuf-associations-admin.php:8 +#: neuf-associations-admin.php:68 +msgid "Website" +msgstr "Nettside" + +#: neuf-associations-admin.php:9 +#: neuf-associations-admin.php:70 +msgid "Type" +msgstr "Type" + +#: neuf-associations-admin.php:49 +msgid "Association details" +msgstr "Foreningsinformasjon" + diff --git a/plugins/neuf-associations/languages/neuf_assoc.pot b/plugins/neuf-associations/languages/neuf_assoc.pot new file mode 100644 index 00000000..d88dc4a1 --- /dev/null +++ b/plugins/neuf-associations/languages/neuf_assoc.pot @@ -0,0 +1,70 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-01-20 20:37+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: neuf-associations-admin.php:6 neuf-associations-post-type.php:6 +msgid "Association" +msgstr "" + +#: neuf-associations-admin.php:7 +msgid "Image" +msgstr "" + +#: neuf-associations-admin.php:8 neuf-associations-admin.php:68 +msgid "Website" +msgstr "" + +#: neuf-associations-admin.php:9 neuf-associations-admin.php:70 +msgid "Type" +msgstr "" + +#: neuf-associations-admin.php:49 +msgid "Association details" +msgstr "" + +#: neuf-associations-post-type.php:5 +msgid "Associations" +msgstr "" + +#: neuf-associations-post-type.php:7 neuf-associations-post-type.php:8 +msgid "Add New" +msgstr "" + +#: neuf-associations-post-type.php:9 +msgid "Edit Association" +msgstr "" + +#: neuf-associations-post-type.php:10 +msgid "Add New Association" +msgstr "" + +#: neuf-associations-post-type.php:11 +msgid "View Association" +msgstr "" + +#: neuf-associations-post-type.php:12 +msgid "Search Associations" +msgstr "" + +#: neuf-associations-post-type.php:13 +msgid "No associations found" +msgstr "" + +#: neuf-associations-post-type.php:14 +msgid "No associations found in trash" +msgstr "" diff --git a/plugins/neuf-associations/neuf-associations-admin.php b/plugins/neuf-associations/neuf-associations-admin.php new file mode 100644 index 00000000..4ef80716 --- /dev/null +++ b/plugins/neuf-associations/neuf-associations-admin.php @@ -0,0 +1,85 @@ + '', + 'title' => __( 'Association', 'neuf_assoc' ), + 'image' => __( 'Image', 'neuf_assoc' ), + 'homepage' => __( 'Website', 'neuf_assoc' ), + 'type' => __( 'Type', 'neuf_assoc' ), + ); + return $custom_cols; +} +add_filter( "manage_association_posts_columns", "neuf_associations_change_columns" ); + +// Add values to the custom columns +function neuf_associations_custom_columns( $column, $post_id ) { + switch ( $column ) { + case "homepage": + $homepage = get_post_meta( $post_id, '_neuf_associations_homepage', true ); + // default to permalink if not set + $homepage = $homepage ? $homepage : get_permalink( $post_id ); + echo ''.$homepage.''; + break; + case "image": + $thumb = get_the_post_thumbnail( $post_id, array(100, 50) ); + $large_image_url = wp_get_attachment_image_src( get_post_thumbnail_id( $post_id ), 'large' ); + echo ''.$thumb.''; + break; + case "type": + echo get_post_meta( $post_id, '_neuf_associations_type', true ); + break; + } +} +add_action( "manage_posts_custom_column" , "neuf_associations_custom_columns", 10, 2 ); + +// Make these columns sortable +function neuf_associations_sortable_columns( $cols ) { + $custom_cols = array( + 'type' => 'type', + ); + return array_merge($custom_cols, $cols); +} +add_filter( "manage_edit-association_sortable_columns", "neuf_associations_sortable_columns" ); + +/* Add metaboxes (with styles) */ +function add_associations_metaboxes() { + add_meta_box( + 'neuf_associations_div', + __('Association details', 'neuf_assoc'), + 'neuf_associations_div', + 'association', + 'side' + ); +} + + +/* Metabox with additional info. */ +function neuf_associations_div(){ + global $post; + + /* Static types */ + $association_types = array('Forening', 'Utvalg'); + + $association_type = get_post_meta( $post->ID, '_neuf_associations_type', true ); + $association_homepage = get_post_meta( $post->ID, '_neuf_associations_homepage', true ); + ?> +
+ + " /> + +
+ +
+ diff --git a/plugins/neuf-associations/neuf-associations-post-type.php b/plugins/neuf-associations/neuf-associations-post-type.php new file mode 100644 index 00000000..026aff02 --- /dev/null +++ b/plugins/neuf-associations/neuf-associations-post-type.php @@ -0,0 +1,76 @@ + __( 'Associations', 'neuf_assoc'), + 'singular_name' => __( 'Association', 'neuf_assoc'), + 'add_new' => __( 'Add New', 'neuf_assoc'), + 'add_new_item' => __( 'Add New', 'neuf_assoc'), + 'edit_item' => __( 'Edit Association', 'neuf_assoc'), + 'new_item' => __( 'Add New Association', 'neuf_assoc'), + 'view_item' => __( 'View Association', 'neuf_assoc'), + 'search_items' => __( 'Search Associations', 'neuf_assoc'), + 'not_found' => __( 'No associations found', 'neuf_assoc'), + 'not_found_in_trash' => __( 'No associations found in trash', 'neuf_assoc') + ); + register_post_type( + 'association', + array( + 'labels' => $labels, + 'menu_position' => 5, + 'public' => true, + 'publicly_queryable' => true, + 'query_var' => 'association', + 'show_ui' => true, + 'capability_type' => 'post', + 'supports' => array( + 'title', + 'editor', + 'author', + 'thumbnail', + 'excerpt', + 'comments', + 'revisions', + 'administrator', + 'custom-fields' + ), + 'register_meta_box_cb' => 'add_associations_metaboxes', + ) + ); + +} +/* When the post is saved, saves our custom data */ +function neuf_associations_save_postdata( $post_id ) { + // verify if this is an auto save routine. + // If it is our form has not been submitted, so we dont want to do anything + if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) + return; + + // verify this came from the our screen and with proper authorization, + // because save_post can be triggered at other times + + if ( !array_key_exists('neuf_associations_nonce', $_POST) || !wp_verify_nonce( $_POST['neuf_associations_nonce'], 'neuf_associations_nonce' ) ) + return; + // Check permissions + if ( 'page' == $_POST['post_type'] ) + { + if ( !current_user_can( 'edit_page', $post_id ) ) + return; + } + else + { + if ( !current_user_can( 'edit_post', $post_id ) ) + return; + } + // OK, we're authenticated. + + // Note esc_url prefixes url with protocol if not present + $meta_data['_neuf_associations_homepage'] = esc_url( $_POST['_neuf_associations_homepage'] ); + $meta_data['_neuf_associations_type'] = $_POST['_neuf_associations_type']; + + // Update database with meta data + foreach($meta_data as $key => $value) { + update_post_meta($post_id, $key, $value); + } +} +?> diff --git a/plugins/neuf-associations/neuf-associations.php b/plugins/neuf-associations/neuf-associations.php new file mode 100644 index 00000000..0fc3e7d9 --- /dev/null +++ b/plugins/neuf-associations/neuf-associations.php @@ -0,0 +1,29 @@ + diff --git a/wp/wp-content/plugins/duplicate-post/gpl-2.0.txt b/plugins/neuf-events/LICENSE similarity index 100% rename from wp/wp-content/plugins/duplicate-post/gpl-2.0.txt rename to plugins/neuf-events/LICENSE diff --git a/plugins/neuf-events/languages/neuf_event-nb_NO.mo b/plugins/neuf-events/languages/neuf_event-nb_NO.mo new file mode 100644 index 0000000000000000000000000000000000000000..930c23a817575d3230374c6e6d0c9bfc82f3b278 GIT binary patch literal 2653 zcmZ{kO>7)B6vs^oA5Hlvg|1o|WBmu?Ya2K;Fo2DEQ(72*!?I(RquJ-7?}8N3(#4ZI!PHYUU#a67mIl;Az! z1jy%Sz;W;-$mbg1cJK|5<#j;ZXwKgj+Z z1=)`iAjfqUd;)wO#3L?YV7ZqIz7MjTk3rsl1!R3+gHR=Y1lgWnK)#1xLEird$oj@$ zJnP#5vi&=Y`9YA+RY1PyqaadH)Iioh4|2Y(fJo)6u^hJHNpzOQjeUIzeK-1Z=m*jF zqCbqz@nso&56__QN9R`j650FH7&*UL=K=I*(X+ULZ2zO^>@VBO_Q5S7(b@NX=#Qgw zdo0JM@epPl6K;G5oSzdsDH{6?_ii@62QeFlvO&Wel(jX|e)CK=FAPY`CQ1G=n>sO@ z`mV8JE>05i-jQ94+ay&OT5?XDQl8`i*^K*?zb~e(Bz9d2#VP8jH1VPq#=cNDdd+p! z5=X->SrRoJ#yXN^aaeL9H!~aMDe@{#inT%jdr=sgZF1tYYE#RY-c1whM*FU4C|KAq zlK6y^9h2(t-*Xvj>8*0uZ8V8R%bwP$-y&N~mMBUS#WT}4a*=FoLa|KBw!52xR$g-0 z&?o01WZ5h0F;80_p_Zmodaa6P>=P2%C9DiW4s7mswz5h(C6SF)u^Q8`2>f~muk<0p{~&=qh{tJ2e3zA}JRJtNy)WgYn!SDL4T#Jn6=L}sK8XLL=I8l}7&dr>o z(Z@OEXrO$zDl3Q)RdVlauM*N)g~C=PyTl>2D#Jn0&OL$oX%uUhf6FhpG7_0*;v$3w zlT~?mTr5x&NgpRtUnswOFO`L_5porUp|q>K?y~eki9iJy?ao%MIBjf4dCv1K#e!=^ zRv?Ttk?bX=*CWUEMCA1XKa!3da^CPiqC;gvv4ogLWLeS3E))g3RkxVcnmm3nRE*^$ z^`0fMrl71U`yysb(n{|RS*McoFuuH)yE{5jcv{+m1Eq?S`&nQAOrroc)S4Fah^Q_H zOCrNz?Eij{v2^R#kdtB_L6Qy;6?F;|>bn6lU#u#f#F5P2voaJ6vNA+sdHq@sr_~m7 zw|?MSw5ceG75sLV-IZ!>(, YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: neuf-events\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-09-18 23:23+0100\n" +"PO-Revision-Date: 2012-09-18 23:36+0100\n" +"Last-Translator: Just Thomas Misund \n" +"Language-Team: Nikolai Kristiansen \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: \n" +"X-Poedit-Language: Norwegian Bokmal\n" +"X-Poedit-KeywordsList: __;_e\n" +"X-Poedit-Basepath: /home/nikolark/dev/edb/neuf-web/wp-content/plugins/neuf-events/\n" +"X-Poedit-SearchPath-0: .\n" + +#: neuf-events-post-types.php:11 +msgid "Events" +msgstr "Arrangementer" + +#: neuf-events-post-types.php:12 +msgid "Event" +msgstr "Arrangement" + +#: neuf-events-post-types.php:13 +#: neuf-events-post-types.php:14 +msgid "Add New" +msgstr "Legg til ny" + +#: neuf-events-post-types.php:15 +msgid "Edit Event" +msgstr "Rediger arrrangement" + +#: neuf-events-post-types.php:16 +msgid "Add New Event" +msgstr "Legg til nytt arrangement" + +#: neuf-events-post-types.php:17 +msgid "View Event" +msgstr "Vis arrangement" + +#: neuf-events-post-types.php:18 +msgid "Search Events" +msgstr "Søk i arrangementer" + +#: neuf-events-post-types.php:19 +msgid "No events found" +msgstr "Ingen arrangement funnet" + +#: neuf-events-post-types.php:20 +msgid "No events found in trash" +msgstr "Ingen arrangement funnet i søpla" + +#: neuf-events-post-types.php:45 +msgid "event" +msgstr "arrangement" + +#: neuf-events-admin.php:7 +msgid "Title" +msgstr "Tittel" + +#: neuf-events-admin.php:8 +msgid "Date & Time" +msgstr "Dato og klokkeslett" + +#: neuf-events-admin.php:9 +msgid "Ending Date & Time" +msgstr "Sluttdato og -klokkeslett" + +#: neuf-events-admin.php:10 +msgid "Venue" +msgstr "Sted" + +#: neuf-events-admin.php:11 +msgid "Type" +msgstr "Type" + +#: neuf-events-admin.php:12 +#: neuf-events-admin.php:167 +msgid "Promo Period" +msgstr "Promo-periode" + +#: neuf-events-admin.php:13 +msgid "Date Published" +msgstr "Publiseringsdato" + +#: neuf-events-admin.php:14 +msgid "Author" +msgstr "Forfatter" + +#: neuf-events-admin.php:29 +msgid "None" +msgstr "Ikke satt" + +#: neuf-events-admin.php:85 +msgid "Event Details" +msgstr "Arrangementsdetaljer" + +#: neuf-events-admin.php:126 +msgid "Starts" +msgstr "Start" + +#: neuf-events-admin.php:127 +msgid "Ends" +msgstr "Slutt" + +#: neuf-events-admin.php:140 +msgid "Venue:" +msgstr "Sted:" + +#: neuf-events-admin.php:152 +msgid "Elsewhere" +msgstr "Annetsteds" + +#: neuf-events-admin.php:164 +msgid "Default" +msgstr "Standard" + +#: neuf-events-admin.php:164 +msgid "Week" +msgstr "Uke" + +#: neuf-events-admin.php:164 +msgid "Month" +msgstr "Måned" + +#: neuf-events-admin.php:164 +msgid "Semester" +msgstr "Semester" + +#: neuf-events-admin.php:190 +msgid "Price Regular" +msgstr "Vanlig pris" + +#: neuf-events-admin.php:192 +msgid "Price Member" +msgstr "Medlemspris" + +#: neuf-events-admin.php:194 +msgid "Billettservice address" +msgstr "Billettservice adresse" + +#: neuf-events-admin.php:196 +msgid "Facebook address" +msgstr "Facebook adresse" + +#: neuf-events-taxonomies.php:9 +#: neuf-events-taxonomies.php:10 +msgid "Event Type" +msgstr "Arrangementstype" + +#: neuf-events-taxonomies.php:11 +msgid "Search Event Types" +msgstr "Søk i arrangementstyper" + +#: neuf-events-taxonomies.php:12 +msgid "All Event Types" +msgstr "Alle arrangementstyper" + +#: neuf-events-taxonomies.php:13 +msgid "Subtype of" +msgstr "Undertype av" + +#: neuf-events-taxonomies.php:14 +msgid "Subtype of:" +msgstr "Undertype av:" + +#: neuf-events-taxonomies.php:15 +msgid "Edit Event Type" +msgstr "Endre arrangementstype" + +#: neuf-events-taxonomies.php:16 +msgid "Update Event Type" +msgstr "Oppdater arrangementstype" + +#: neuf-events-taxonomies.php:17 +msgid "Add New Event Type" +msgstr "Legg til ny arrangementstype" + +#: neuf-events-taxonomies.php:18 +msgid "Name" +msgstr "Navn" + +#: neuf-events-taxonomies.php:19 +msgid "Event Types" +msgstr "Arrangementstyper" + +#: neuf-events-taxonomies.php:33 +msgid "eventtype" +msgstr "konsept" + +#~ msgid "" +#~ msgstr "" +#~ msgid "Price" +#~ msgstr "Pris:" + diff --git a/plugins/neuf-events/languages/neuf_event.pot b/plugins/neuf-events/languages/neuf_event.pot new file mode 100644 index 00000000..51e2cfd9 --- /dev/null +++ b/plugins/neuf-events/languages/neuf_event.pot @@ -0,0 +1,158 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2012-01-20 21:46+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: neuf-events-admin.php:7 +msgid "Title" +msgstr "" + +#: neuf-events-admin.php:8 +msgid "Date & Time" +msgstr "" + +#: neuf-events-admin.php:9 +msgid "Ending Date & Time" +msgstr "" + +#: neuf-events-admin.php:10 +msgid "Venue" +msgstr "" + +#: neuf-events-admin.php:11 +msgid "Type" +msgstr "" + +#: neuf-events-admin.php:12 +msgid "Date Published" +msgstr "" + +#: neuf-events-admin.php:13 +msgid "Author" +msgstr "" + +#: neuf-events-admin.php:28 +msgid "Ikke satt" +msgstr "" + +#: neuf-events-admin.php:80 +msgid "Event Details" +msgstr "" + +#: neuf-events-admin.php:113 +msgid "Starts" +msgstr "" + +#: neuf-events-admin.php:114 +msgid "Ends" +msgstr "" + +#: neuf-events-admin.php:127 +msgid "Venue:" +msgstr "" + +#: neuf-events-admin.php:137 +msgid "" +msgstr "" + +#: neuf-events-admin.php:150 +msgid "Price" +msgstr "" + +#: neuf-events-admin.php:152 +msgid "Billettservice address" +msgstr "" + +#: neuf-events-admin.php:154 +msgid "Facebook address" +msgstr "" + +#: neuf-events-post-types.php:11 +msgid "Events" +msgstr "" + +#: neuf-events-post-types.php:12 +msgid "Event" +msgstr "" + +#: neuf-events-post-types.php:13 neuf-events-post-types.php:14 +msgid "Add New" +msgstr "" + +#: neuf-events-post-types.php:15 +msgid "Edit Event" +msgstr "" + +#: neuf-events-post-types.php:16 +msgid "Add New Event" +msgstr "" + +#: neuf-events-post-types.php:17 +msgid "View Event" +msgstr "" + +#: neuf-events-post-types.php:18 +msgid "Search Events" +msgstr "" + +#: neuf-events-post-types.php:19 +msgid "No events found" +msgstr "" + +#: neuf-events-post-types.php:20 +msgid "No events found in trash" +msgstr "" + +#: neuf-events-taxonomies.php:9 neuf-events-taxonomies.php:10 +msgid "Event Type" +msgstr "" + +#: neuf-events-taxonomies.php:11 +msgid "Search Event Types" +msgstr "" + +#: neuf-events-taxonomies.php:12 +msgid "All Event Types" +msgstr "" + +#: neuf-events-taxonomies.php:13 +msgid "Subtype of" +msgstr "" + +#: neuf-events-taxonomies.php:14 +msgid "Subtype of:" +msgstr "" + +#: neuf-events-taxonomies.php:15 +msgid "Edit Event Type" +msgstr "" + +#: neuf-events-taxonomies.php:16 +msgid "Update Event Type" +msgstr "" + +#: neuf-events-taxonomies.php:17 +msgid "Add New Event Type" +msgstr "" + +#: neuf-events-taxonomies.php:18 +msgid "Name" +msgstr "" + +#: neuf-events-taxonomies.php:19 +msgid "Event Types" +msgstr "" diff --git a/plugins/neuf-events/neuf-events-admin.php b/plugins/neuf-events/neuf-events-admin.php new file mode 100644 index 00000000..5db4af93 --- /dev/null +++ b/plugins/neuf-events/neuf-events-admin.php @@ -0,0 +1,258 @@ + '', + 'title' => __( 'Title', 'neuf_event' ), + 'starttime' => __( 'Date & Time', 'neuf_event' ), + 'endtime' => __( 'Ending Date & Time', 'neuf_event'), + 'venue' => __( 'Venue', 'neuf_event' ), + 'type' => __( 'Type', 'neuf_event' ), + 'promoperiod' => __( 'Promo Period', 'neuf_event' ), + 'date' => __( 'Date Published', 'neuf_event' ), + 'author' => __( 'Author', 'neuf_event' ), + ); + return $custom_cols; +} +add_filter( "manage_event_posts_columns", "change_columns" ); + +// Add values to the custom columns +function custom_columns( $column, $post_id ) { + switch ( $column ) { + case "starttime": + $starttime = intval(get_post_meta( $post_id, '_neuf_events_starttime', true)); + echo format_datetime($starttime); + break; + case "endtime": + $endtime = intval(get_post_meta( $post_id, '_neuf_events_endtime', true)); + echo $endtime ? format_datetime($endtime) : __("None", 'neuf_event'); + break; + case "type": + echo the_terms( $post_id , 'event_type', '', ', ', '' ); + break; + case "venue": + echo get_post_meta( $post_id , '_neuf_events_venue', true); + break; + case "promoperiod": + echo get_post_meta( $post_id, '_neuf_events_promo_period', true); + break; + } +} +add_action( "manage_posts_custom_column" , "custom_columns", 10, 2 ); + +// Make these columns sortable +function sortable_columns( $cols ) { + $custom_cols = array( + 'starttime' => 'starttime', + 'endtime' => 'endtime', + 'type' => 'type', + 'venue' => 'venue', + 'promoperiod' => 'promoperiod', + ); + return array_merge($cols, $custom_cols); +} +add_filter( "manage_edit-event_sortable_columns", "sortable_columns" ); +/* + * http://scribu.net/wordpress/custom-sortable-columns.html#comment-4732 + */ +function starttime_column_orderby( $vars ) { + if ( isset( $vars['orderby']) ) { + if('starttime' == $vars['orderby'] ) { + $vars = array_merge( $vars, array( + 'meta_key' => '_neuf_events_starttime', + 'orderby' => 'meta_value' + ) ); + } + if ( 'endtime' == $vars['orderby'] ) { + $vars = array_merge( $vars, array( + 'meta_key' => '_neuf_events_endtime', + 'orderby' => 'meta_value' + ) ); + } + } + return $vars; +} +add_filter( 'request', 'starttime_column_orderby' ); + + +function add_admin_script_and_styles() { + // Datetime selection and form validation + // Ref: http://trentrichardson.com/examples/timepicker/ + // Ref: http://docs.jquery.com/Plugins/Validation#API_Documentation + wp_register_style('jquery-ui-css', plugins_url("neuf-events/style/jquery-ui.min.css")); + wp_register_style('jquery-ui-timepicker-css', plugins_url("neuf-events/style/jquery-ui-timepicker-addon.css"), array('jquery-ui-css')); + + wp_register_script('jquery-ui-timepicker-addon', plugins_url("neuf-events/script/jquery-ui-timepicker-addon.js"), array('jquery-ui-slider', 'jquery-ui-datepicker') ); + wp_register_script('jquery-validate', plugins_url("neuf-events/script/jquery.validate.min.js"), array('jquery')); + wp_register_script('neuf-events', plugins_url("neuf-events/script/neuf_events.js"), array('jquery-ui-timepicker-addon', 'jquery-validate')); + + wp_enqueue_style('jquery-ui-timepicker-css'); + wp_enqueue_script('neuf-events'); +} +add_action('admin_enqueue_scripts', 'add_admin_script_and_styles'); + +/* Add metaboxes (with styles) */ +function add_events_metaboxes() { + + add_meta_box( + 'neuf_events_details', + __('Event Details', 'neuf_event'), + 'neuf_event_details', + 'event', + 'side', + 'high' + ); +} + +function neuf_event_details() { +?> +
+ +
+
+ +
+
+ +
+
+ +
+ID, '_neuf_events_starttime', true); + $end = get_post_meta($post->ID, '_neuf_events_endtime', true); + + wp_nonce_field( 'neuf_events_nonce','neuf_events_nonce' ); +?> + " />
+ " />
+ID, '_neuf_events_venue', true); + _e('Venue:', 'neuf_event'); + echo '
'; +} +/* Promo period */ +function neuf_event_promoperiod(){ + global $post; + + $promoperiod = array( + __('Default', 'neuf_event'), __('Week', 'neuf_event'), __('Month', 'neuf_event'), __('Semester', 'neuf_event'), + ); + $neuf_event_promoperiod = get_post_meta($post->ID, '_neuf_events_promo_period', true); + _e('Promo Period', 'neuf_event'); + echo '
'; +} + +/* Price and additional info. */ +function neuf_event_div() { + global $post; + + $event_price_regular = get_post_meta($post->ID, '_neuf_events_price_regular') ? get_post_meta($post->ID, '_neuf_events_price_regular', true) : ""; + $event_price_member = get_post_meta($post->ID, '_neuf_events_price_member') ? get_post_meta($post->ID, '_neuf_events_price_member', true) : ""; + $event_bs = get_post_meta($post->ID, '_neuf_events_bs_url') ? get_post_meta($post->ID, '_neuf_events_bs_url', true) : ""; + $event_fb = get_post_meta($post->ID, '_neuf_events_fb_url', true); + + ?> + +
+ +
+ +
+ + + General. */ +if( !function_exists('format_datetime') ) { + function format_datetime($timestamp) { + return date_i18n(get_option('date_format')." ".get_option('time_format'), intval($timestamp)); + } +} + +/** + * Add our stuff to the 'right now' dashboard widget. + */ +function neuf_events_right_now_dashboard() { + // First, let's add a line about our events + $post_type = get_post_type_object( 'event' ); + + $num_posts = wp_count_posts( $post_type->name ); + $num = number_format_i18n( $num_posts->publish ); + $text = _n( $post_type->labels->singular_name, $post_type->labels->name , intval( $num_posts->publish ) ); + if ( current_user_can( 'edit_posts' ) ) { + + $num = "$num"; + $text = "$text"; + } + echo '' . $num . ''; + echo '' . $text . ''; + + // Now, let's add a line about our event types + $taxonomy = get_taxonomy( 'event_type' ); + + $num_terms = wp_count_terms( $taxonomy->name ); + $num = number_format_i18n( $num_terms ); + $text = _n( $taxonomy->labels->singular_name, $taxonomy->labels->name , intval( $num_terms )); + if ( current_user_can( 'manage_categories' ) ) { + + $num = "$num"; + $text = "$text"; + } + echo '' . $num . ''; + echo '' . $text . ''; +} +add_action( 'right_now_content_table_end' , 'neuf_events_right_now_dashboard' ); + +?> diff --git a/plugins/neuf-events/neuf-events-json-controller.php b/plugins/neuf-events/neuf-events-json-controller.php new file mode 100644 index 00000000..8d7a63b0 --- /dev/null +++ b/plugins/neuf-events/neuf-events-json-controller.php @@ -0,0 +1,137 @@ + '_neuf_events_starttime', + 'value' => array(date( 'U' , strtotime( '-8 hours' ) ), date( 'U' , strtotime( 'tomorrow' ) )), + 'compare' => 'BETWEEN', + 'type' => 'NUMERIC' + ); + + $defaults = array( + 'post_type' => 'event', + 'meta_query' => array( $meta_query ), + 'posts_per_page' => 300, + 'orderby' => 'meta_value_num', + 'meta_key' => '_neuf_events_starttime', + 'order' => 'ASC', + 'ignore_sticky_posts' => true + ); + + // Defaults can easily be overwritten + $query = array_merge($defaults, $query); + + $custom_fields = array( + '_neuf_events_price_regular', + '_neuf_events_price_member', + '_neuf_events_starttime', + '_neuf_events_endtime', + '_neuf_events_venue', + '_neuf_events_bs_url', + '_neuf_events_fb_url', + ); + $json_api->query->custom_fields = implode(',', $custom_fields); + $events = $json_api->introspector->get_posts($query); + $events = $this->add_parent_root_event_types($events); + return $this->events_result($events); + } + + /* /?json=events.get_upcoming */ + public function get_upcoming() { + global $json_api; + + /* Get query params */ + $url = parse_url($_SERVER['REQUEST_URI']); + $query = wp_parse_args($url['query']); + + $meta_query = array( + 'key' => '_neuf_events_starttime', + 'value' => date( 'U' , strtotime( '-8 hours' ) ), + 'compare' => '>', + 'type' => 'numeric' + ); + + $defaults = array( + 'post_type' => 'event', + 'meta_query' => array( $meta_query ), + 'posts_per_page' => 300, + 'orderby' => 'meta_value_num', + 'meta_key' => '_neuf_events_starttime', + 'order' => 'ASC', + 'ignore_sticky_posts' => true + ); + + // Defaults can easily be overwritten + $query = array_merge($defaults, $query); + + $custom_fields = array( + '_neuf_events_price_regular', + '_neuf_events_price_member', + '_neuf_events_starttime', + '_neuf_events_endtime', + '_neuf_events_venue', + '_neuf_events_bs_url', + '_neuf_events_fb_url', + ); + $json_api->query->custom_fields = implode(',', $custom_fields); + $events = $json_api->introspector->get_posts($query); + $events = $this->add_parent_root_event_types($events); + return $this->events_result($events); + } + protected function events_result($events) { + global $wp_query; + return array( + 'count' => count($events), + 'count_total' => (int) $wp_query->found_posts, + 'pages' => $wp_query->max_num_pages, + 'events' => $events + ); + } + protected function is_root_event_type($term) { + return $term->parent == 0; + + } + protected function get_parent_root($term) { + if( $this->is_root_event_type($term) ) { + return $term; + } + $parent_term = null; + foreach($this->event_types as $type) { + if($type->term_id == $term->parent) { + $parent_term = $type; + break; + } + } + return $this->get_parent_root($parent_term); + } + protected function add_parent_root_event_types($events) { + // taxonomy tree + $this->event_types = get_terms(array('event_type')); + foreach ($events as $event) { + $event_types = array(); + foreach ( $event->taxonomy_event_type as $event_type ) { + $event_type = $this->get_parent_root($event_type); + /* Can be either JSON_API_Category or stdClass */ + $name = get_class($event_type) === 'stdClass' ? $event_type->name : $event_type->title; + $event_types[] = $name; + } + $event->event_type_parents = $event_types; + } + + return $events; + } + +} +?> diff --git a/plugins/neuf-events/neuf-events-post-types.php b/plugins/neuf-events/neuf-events-post-types.php new file mode 100644 index 00000000..208a321b --- /dev/null +++ b/plugins/neuf-events/neuf-events-post-types.php @@ -0,0 +1,167 @@ + __( 'Events', 'neuf_event'), + 'singular_name' => __( 'Event', 'neuf_event'), + 'add_new' => __( 'Add New', 'neuf_event'), + 'add_new_item' => __( 'Add New', 'neuf_event'), + 'edit_item' => __( 'Edit Event', 'neuf_event'), + 'new_item' => __( 'Add New Event', 'neuf_event'), + 'view_item' => __( 'View Event', 'neuf_event'), + 'search_items' => __( 'Search Events', 'neuf_event'), + 'not_found' => __( 'No events found', 'neuf_event'), + 'not_found_in_trash' => __( 'No events found in trash', 'neuf_event') + ); + register_post_type( + 'event', + array( + 'labels' => $labels, + 'menu_position' => 5, + 'public' => true, + 'publicly_queryable' => true, + 'query_var' => 'event', + 'show_ui' => true, + 'capability_type' => 'post', + 'supports' => array( + 'title', + 'editor', + 'author', + 'thumbnail', + 'excerpt', + 'comments', + 'revisions', + 'administrator', + 'custom-fields' + ), + 'register_meta_box_cb' => 'add_events_metaboxes', + 'rewrite' => array( + 'slug' => __( 'event', 'neuf_event' ), + ), + ) + ); +} + + +/* When the post is saved, save our custom data */ +function neuf_events_save_post( $post_id, $post ) { + // verify this came from the our screen and with proper authorization, + // because save_post can be triggered at other times + if ( !array_key_exists('neuf_events_nonce', $_POST) || !wp_verify_nonce( $_POST['neuf_events_nonce'], 'neuf_events_nonce' )) { + return $post_id; + } + + // If this is an auto save routine, our form has not been submitted, + // and we do nothing. + if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id; + + // Check permissions + if ( !current_user_can( 'edit_post', $post_id ) ) return $post_id; + + // Date strings are converted to unix time + $tosave['_neuf_events_starttime'] = strtotime( $_POST['_neuf_events_starttime'] ); + $tosave['_neuf_events_endtime'] = strtotime( $_POST['_neuf_events_endtime'] ); + $tosave['_neuf_events_price_regular'] = $_POST['_neuf_events_price_regular']; + $tosave['_neuf_events_price_member'] = $_POST['_neuf_events_price_member']; + $tosave['_neuf_events_bs_url'] = $_POST['_neuf_events_bs_url']; + $tosave['_neuf_events_fb_url'] = $_POST['_neuf_events_fb_url']; + $tosave['_neuf_events_venue'] = $_POST['_neuf_events_venue']; + $tosave['_neuf_events_promo_period'] = $_POST['_neuf_events_promo_period']; + + // Update or add post meta + foreach($tosave as $key=>$value) + if(!update_post_meta($post_id, $key, $value)) { + add_post_meta($post_id, $key, $value, true); + } + + return $post_id; +} + +/** + * Set post variables. + * + * Add some handy variables to the global $post. Added to the 'the_post' action hook. + */ +function neuf_events_the_post( &$post ) { + // Only apply to events + if ( 'event' != get_post_type() ) + return; + + $post->neuf_events_venue = get_post_meta( get_the_ID() , '_neuf_events_venue' , true ); + $post->neuf_events_fb_url = get_post_meta( get_the_ID() , '_neuf_events_fb_url' , true ); + $post->neuf_events_ticket_url = get_post_meta( get_the_ID() , '_neuf_events_bs_url' , true ); + $post->neuf_events_price_regular = get_post_meta( get_the_ID() , '_neuf_events_price_regular' , true ); + $post->neuf_events_price_member = get_post_meta( get_the_ID() , '_neuf_events_price_member' , true ); + $post->neuf_events_starttime = get_post_meta( get_the_ID() , '_neuf_events_starttime' , true ); + $post->neuf_events_endtime = get_post_meta( get_the_ID() , '_neuf_events_endtime' , true ); + + $post->neuf_events_endtime = $post->neuf_events_endtime ? $post->neuf_events_endtime : $post->neuf_events_starttime + 7200; // No endtime? Assume 2 hours + + $post->neuf_events_gcal_url = "http://www.google.com/calendar/event?action=TEMPLATE"; + $post->neuf_events_gcal_url .= "&text=" . rawurlencode(get_the_title()); + $post->neuf_events_gcal_url .= "&details=" . rawurlencode(get_the_excerpt()); + $post->neuf_events_gcal_url .= "&location=Det%20Norske%20Studentersamfund,%20Slemdalsveien%2015,%20Oslo"; + $post->neuf_events_gcal_url .= "&trp=true"; + $post->neuf_events_gcal_url .= "&sprop=website:" . rawurlencode(get_permalink()); + $post->neuf_events_gcal_url .= "&sprop=name:Det%20Norske%20Studentersamfund"; + $post->neuf_events_gcal_url .= "&dates=" . date( 'Ymd\THis\Z' , $post->neuf_events_starttime - ( get_option('gmt_offset') * 3600 ) ); + $post->neuf_events_gcal_url .= "/" . date( 'Ymd\THis\Z' , $post->neuf_events_starttime - ( get_option('gmt_offset') * 3600 ) ); + +} + +/** Sample table view of events */ +function neuf_events_program() { + global $post, $wp_locale; + + $events = new WP_Query( array( + 'post_type' => 'event', + 'posts_per_page' => -1, + 'meta_key' => '_neuf_events_starttime', + 'orderby' => 'meta_value', + 'order' => 'ASC' + ) ); + + if ( $events->have_posts() ) : + $date = ""; + ob_start(); + + echo ''; + + while ( $events->have_posts() ) : $events->the_post(); + $venue = get_post_meta( $post->ID, '_neuf_events_venue', true); + $price_regular = get_post_meta( $post->ID, '_neuf_events_price_regular', true); + $price_member = get_post_meta( $post->ID, '_neuf_events_price_member', true); + $time = get_post_meta( $post->ID, '_neuf_events_starttime', true); + ?> + + + + + + + '; + endif; + + $html = ob_get_contents(); + ob_end_clean(); + return $html; +} + +?> diff --git a/plugins/neuf-events/neuf-events-taxonomies.php b/plugins/neuf-events/neuf-events-taxonomies.php new file mode 100644 index 00000000..52bb5f1a --- /dev/null +++ b/plugins/neuf-events/neuf-events-taxonomies.php @@ -0,0 +1,83 @@ + __('Event Types', 'neuf_event'), //Arrangementstype + 'singular_name' => __('Event Type', 'neuf_event'), + 'search_items' => __('Search Event Types', 'neuf_event'),//'Søk etter arrangementstype', + 'all_items' => __('All Event Types', 'neuf_event'), + 'parent_item' => __('Subtype of', 'neuf_event'),//'Undertype av', + 'parent_item_colon' => __('Subtype of:', 'neuf_event'),//'Undertype av:', + 'edit_item' => __('Edit Event Type', 'neuf_event'), + 'update_item' => __('Update Event Type', 'neuf_event'), + 'add_new_item' => __('Add New Event Type', 'neuf_event'), + 'new_item_name' => __('Name', 'neuf_event'),//'Navn på ny arrangementstype', + 'menu_name' => __('Event Types', 'neuf_event'), + ); + + register_taxonomy( + 'event_type', + array( + 'event' + ), array( + 'hierarchical' => true, + 'labels' => $labels, + 'show_ui' => true, + 'query_var' => true, + 'rewrite' => array( + 'slug' => __( 'eventtype', 'neuf_event' ), + 'hierarchical' => true + ) + ) ); +} + +/** + * Extend post_class() to include event type classes. + * + * post_class() is called to output semantic classes to post elements. In this function, we add a class for each event type associated with the post. + * + * In the neuf-old-style theme, consider using neuf_post_class() instead. (Defined in the theme's functions.php.) + * + * This function was originally written to be able to display different icons on different types of events. + */ +function neuf_post_class_event_type( $classes ) { + global $post; + + if ( is_object_in_taxonomy( $post->post_type, 'event_type' ) ) { + foreach ( (array) get_the_terms ( $post->ID , 'event_type' ) as $event_type ) { + if ( empty( $event_type->slug ) ) + continue; + $classes[] = 'event-type-' . sanitize_html_class( $event_type->slug, $event_type->term_id); + } + } + + return $classes; +} +add_filter( 'post_class', 'neuf_post_class_event_type' ); + +/* Default terms for custom taxonomies */ +function neuf_events_set_default_object_terms( $post_id, $post ) { + /* Make sure it's an event */ + if ( !isset($_POST['post_type']) || $_POST['post_type'] !== 'event' ) { + return; + } + /* Taxonomy => array of default terms */ + $defaults = array( + 'event_type' => array( 'annet' ), + ); + $taxonomies = get_object_taxonomies( $_POST['post_type'] ); + foreach ( (array) $taxonomies as $taxonomy ) { + $terms = wp_get_post_terms( $post_id, $taxonomy ); + /* No tax terms assoc with post? */ + if ( empty( $terms ) && array_key_exists( $taxonomy, $defaults ) ) { + /* ... then add defaults */ + wp_set_object_terms( $post_id, $defaults[$taxonomy], $taxonomy ); + } + } +} +add_action( 'save_post', 'neuf_events_set_default_object_terms', 100, 2 ); +?> diff --git a/plugins/neuf-events/neuf-events.php b/plugins/neuf-events/neuf-events.php new file mode 100644 index 00000000..72200cdf --- /dev/null +++ b/plugins/neuf-events/neuf-events.php @@ -0,0 +1,50 @@ + diff --git a/plugins/neuf-events/script/jquery-ui-timepicker-addon.js b/plugins/neuf-events/script/jquery-ui-timepicker-addon.js new file mode 100644 index 00000000..0baae3e7 --- /dev/null +++ b/plugins/neuf-events/script/jquery-ui-timepicker-addon.js @@ -0,0 +1,2223 @@ +/*! jQuery Timepicker Addon - v1.5.0 - 2014-09-01 +* http://trentrichardson.com/examples/timepicker +* Copyright (c) 2014 Trent Richardson; Licensed MIT */ +(function ($) { + + /* + * Lets not redefine timepicker, Prevent "Uncaught RangeError: Maximum call stack size exceeded" + */ + $.ui.timepicker = $.ui.timepicker || {}; + if ($.ui.timepicker.version) { + return; + } + + /* + * Extend jQueryUI, get it started with our version number + */ + $.extend($.ui, { + timepicker: { + version: "1.5.0" + } + }); + + /* + * Timepicker manager. + * Use the singleton instance of this class, $.timepicker, to interact with the time picker. + * Settings for (groups of) time pickers are maintained in an instance object, + * allowing multiple different settings on the same page. + */ + var Timepicker = function () { + this.regional = []; // Available regional settings, indexed by language code + this.regional[''] = { // Default regional settings + currentText: 'Now', + closeText: 'Done', + amNames: ['AM', 'A'], + pmNames: ['PM', 'P'], + timeFormat: 'HH:mm', + timeSuffix: '', + timeOnlyTitle: 'Choose Time', + timeText: 'Time', + hourText: 'Hour', + minuteText: 'Minute', + secondText: 'Second', + millisecText: 'Millisecond', + microsecText: 'Microsecond', + timezoneText: 'Time Zone', + isRTL: false + }; + this._defaults = { // Global defaults for all the datetime picker instances + showButtonPanel: true, + timeOnly: false, + timeOnlyShowDate: false, + showHour: null, + showMinute: null, + showSecond: null, + showMillisec: null, + showMicrosec: null, + showTimezone: null, + showTime: true, + stepHour: 1, + stepMinute: 1, + stepSecond: 1, + stepMillisec: 1, + stepMicrosec: 1, + hour: 0, + minute: 0, + second: 0, + millisec: 0, + microsec: 0, + timezone: null, + hourMin: 0, + minuteMin: 0, + secondMin: 0, + millisecMin: 0, + microsecMin: 0, + hourMax: 23, + minuteMax: 59, + secondMax: 59, + millisecMax: 999, + microsecMax: 999, + minDateTime: null, + maxDateTime: null, + maxTime: null, + minTime: null, + onSelect: null, + hourGrid: 0, + minuteGrid: 0, + secondGrid: 0, + millisecGrid: 0, + microsecGrid: 0, + alwaysSetTime: true, + separator: ' ', + altFieldTimeOnly: true, + altTimeFormat: null, + altSeparator: null, + altTimeSuffix: null, + altRedirectFocus: true, + pickerTimeFormat: null, + pickerTimeSuffix: null, + showTimepicker: true, + timezoneList: null, + addSliderAccess: false, + sliderAccessArgs: null, + controlType: 'slider', + defaultValue: null, + parse: 'strict' + }; + $.extend(this._defaults, this.regional['']); + }; + + $.extend(Timepicker.prototype, { + $input: null, + $altInput: null, + $timeObj: null, + inst: null, + hour_slider: null, + minute_slider: null, + second_slider: null, + millisec_slider: null, + microsec_slider: null, + timezone_select: null, + maxTime: null, + minTime: null, + hour: 0, + minute: 0, + second: 0, + millisec: 0, + microsec: 0, + timezone: null, + hourMinOriginal: null, + minuteMinOriginal: null, + secondMinOriginal: null, + millisecMinOriginal: null, + microsecMinOriginal: null, + hourMaxOriginal: null, + minuteMaxOriginal: null, + secondMaxOriginal: null, + millisecMaxOriginal: null, + microsecMaxOriginal: null, + ampm: '', + formattedDate: '', + formattedTime: '', + formattedDateTime: '', + timezoneList: null, + units: ['hour', 'minute', 'second', 'millisec', 'microsec'], + support: {}, + control: null, + + /* + * Override the default settings for all instances of the time picker. + * @param {Object} settings object - the new settings to use as defaults (anonymous object) + * @return {Object} the manager object + */ + setDefaults: function (settings) { + extendRemove(this._defaults, settings || {}); + return this; + }, + + /* + * Create a new Timepicker instance + */ + _newInst: function ($input, opts) { + var tp_inst = new Timepicker(), + inlineSettings = {}, + fns = {}, + overrides, i; + + for (var attrName in this._defaults) { + if (this._defaults.hasOwnProperty(attrName)) { + var attrValue = $input.attr('time:' + attrName); + if (attrValue) { + try { + inlineSettings[attrName] = eval(attrValue); + } catch (err) { + inlineSettings[attrName] = attrValue; + } + } + } + } + + overrides = { + beforeShow: function (input, dp_inst) { + if ($.isFunction(tp_inst._defaults.evnts.beforeShow)) { + return tp_inst._defaults.evnts.beforeShow.call($input[0], input, dp_inst, tp_inst); + } + }, + onChangeMonthYear: function (year, month, dp_inst) { + // Update the time as well : this prevents the time from disappearing from the $input field. + tp_inst._updateDateTime(dp_inst); + if ($.isFunction(tp_inst._defaults.evnts.onChangeMonthYear)) { + tp_inst._defaults.evnts.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst); + } + }, + onClose: function (dateText, dp_inst) { + if (tp_inst.timeDefined === true && $input.val() !== '') { + tp_inst._updateDateTime(dp_inst); + } + if ($.isFunction(tp_inst._defaults.evnts.onClose)) { + tp_inst._defaults.evnts.onClose.call($input[0], dateText, dp_inst, tp_inst); + } + } + }; + for (i in overrides) { + if (overrides.hasOwnProperty(i)) { + fns[i] = opts[i] || null; + } + } + + tp_inst._defaults = $.extend({}, this._defaults, inlineSettings, opts, overrides, { + evnts: fns, + timepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker'); + }); + tp_inst.amNames = $.map(tp_inst._defaults.amNames, function (val) { + return val.toUpperCase(); + }); + tp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function (val) { + return val.toUpperCase(); + }); + + // detect which units are supported + tp_inst.support = detectSupport( + tp_inst._defaults.timeFormat + + (tp_inst._defaults.pickerTimeFormat ? tp_inst._defaults.pickerTimeFormat : '') + + (tp_inst._defaults.altTimeFormat ? tp_inst._defaults.altTimeFormat : '')); + + // controlType is string - key to our this._controls + if (typeof(tp_inst._defaults.controlType) === 'string') { + if (tp_inst._defaults.controlType === 'slider' && typeof($.ui.slider) === 'undefined') { + tp_inst._defaults.controlType = 'select'; + } + tp_inst.control = tp_inst._controls[tp_inst._defaults.controlType]; + } + // controlType is an object and must implement create, options, value methods + else { + tp_inst.control = tp_inst._defaults.controlType; + } + + // prep the timezone options + var timezoneList = [-720, -660, -600, -570, -540, -480, -420, -360, -300, -270, -240, -210, -180, -120, -60, + 0, 60, 120, 180, 210, 240, 270, 300, 330, 345, 360, 390, 420, 480, 525, 540, 570, 600, 630, 660, 690, 720, 765, 780, 840]; + if (tp_inst._defaults.timezoneList !== null) { + timezoneList = tp_inst._defaults.timezoneList; + } + var tzl = timezoneList.length, tzi = 0, tzv = null; + if (tzl > 0 && typeof timezoneList[0] !== 'object') { + for (; tzi < tzl; tzi++) { + tzv = timezoneList[tzi]; + timezoneList[tzi] = { value: tzv, label: $.timepicker.timezoneOffsetString(tzv, tp_inst.support.iso8601) }; + } + } + tp_inst._defaults.timezoneList = timezoneList; + + // set the default units + tp_inst.timezone = tp_inst._defaults.timezone !== null ? $.timepicker.timezoneOffsetNumber(tp_inst._defaults.timezone) : + ((new Date()).getTimezoneOffset() * -1); + tp_inst.hour = tp_inst._defaults.hour < tp_inst._defaults.hourMin ? tp_inst._defaults.hourMin : + tp_inst._defaults.hour > tp_inst._defaults.hourMax ? tp_inst._defaults.hourMax : tp_inst._defaults.hour; + tp_inst.minute = tp_inst._defaults.minute < tp_inst._defaults.minuteMin ? tp_inst._defaults.minuteMin : + tp_inst._defaults.minute > tp_inst._defaults.minuteMax ? tp_inst._defaults.minuteMax : tp_inst._defaults.minute; + tp_inst.second = tp_inst._defaults.second < tp_inst._defaults.secondMin ? tp_inst._defaults.secondMin : + tp_inst._defaults.second > tp_inst._defaults.secondMax ? tp_inst._defaults.secondMax : tp_inst._defaults.second; + tp_inst.millisec = tp_inst._defaults.millisec < tp_inst._defaults.millisecMin ? tp_inst._defaults.millisecMin : + tp_inst._defaults.millisec > tp_inst._defaults.millisecMax ? tp_inst._defaults.millisecMax : tp_inst._defaults.millisec; + tp_inst.microsec = tp_inst._defaults.microsec < tp_inst._defaults.microsecMin ? tp_inst._defaults.microsecMin : + tp_inst._defaults.microsec > tp_inst._defaults.microsecMax ? tp_inst._defaults.microsecMax : tp_inst._defaults.microsec; + tp_inst.ampm = ''; + tp_inst.$input = $input; + + if (tp_inst._defaults.altField) { + tp_inst.$altInput = $(tp_inst._defaults.altField); + if (tp_inst._defaults.altRedirectFocus === true) { + tp_inst.$altInput.css({ + cursor: 'pointer' + }).focus(function () { + $input.trigger("focus"); + }); + } + } + + if (tp_inst._defaults.minDate === 0 || tp_inst._defaults.minDateTime === 0) { + tp_inst._defaults.minDate = new Date(); + } + if (tp_inst._defaults.maxDate === 0 || tp_inst._defaults.maxDateTime === 0) { + tp_inst._defaults.maxDate = new Date(); + } + + // datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime.. + if (tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date) { + tp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime()); + } + if (tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date) { + tp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime()); + } + if (tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date) { + tp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime()); + } + if (tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date) { + tp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime()); + } + tp_inst.$input.bind('focus', function () { + tp_inst._onFocus(); + }); + + return tp_inst; + }, + + /* + * add our sliders to the calendar + */ + _addTimePicker: function (dp_inst) { + var currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ? this.$input.val() + ' ' + this.$altInput.val() : this.$input.val(); + + this.timeDefined = this._parseTime(currDT); + this._limitMinMaxDateTime(dp_inst, false); + this._injectTimePicker(); + }, + + /* + * parse the time string from input value or _setTime + */ + _parseTime: function (timeString, withDate) { + if (!this.inst) { + this.inst = $.datepicker._getInst(this.$input[0]); + } + + if (withDate || !this._defaults.timeOnly) { + var dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat'); + try { + var parseRes = parseDateTimeInternal(dp_dateFormat, this._defaults.timeFormat, timeString, $.datepicker._getFormatConfig(this.inst), this._defaults); + if (!parseRes.timeObj) { + return false; + } + $.extend(this, parseRes.timeObj); + } catch (err) { + $.timepicker.log("Error parsing the date/time string: " + err + + "\ndate/time string = " + timeString + + "\ntimeFormat = " + this._defaults.timeFormat + + "\ndateFormat = " + dp_dateFormat); + return false; + } + return true; + } else { + var timeObj = $.datepicker.parseTime(this._defaults.timeFormat, timeString, this._defaults); + if (!timeObj) { + return false; + } + $.extend(this, timeObj); + return true; + } + }, + + /* + * generate and inject html for timepicker into ui datepicker + */ + _injectTimePicker: function () { + var $dp = this.inst.dpDiv, + o = this.inst.settings, + tp_inst = this, + litem = '', + uitem = '', + show = null, + max = {}, + gridSize = {}, + size = null, + i = 0, + l = 0; + + // Prevent displaying twice + if ($dp.find("div.ui-timepicker-div").length === 0 && o.showTimepicker) { + var noDisplay = ' style="display:none;"', + html = '
' + '
' + o.timeText + '
' + + '
'; + + // Create the markup + for (i = 0, l = this.units.length; i < l; i++) { + litem = this.units[i]; + uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1); + show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem]; + + // Added by Peter Medeiros: + // - Figure out what the hour/minute/second max should be based on the step values. + // - Example: if stepMinute is 15, then minMax is 45. + max[litem] = parseInt((o[litem + 'Max'] - ((o[litem + 'Max'] - o[litem + 'Min']) % o['step' + uitem])), 10); + gridSize[litem] = 0; + + html += '
' + o[litem + 'Text'] + '
' + + '
'; + + if (show && o[litem + 'Grid'] > 0) { + html += '
+ + + kl + + + + +
'; + + if (litem === 'hour') { + for (var h = o[litem + 'Min']; h <= max[litem]; h += parseInt(o[litem + 'Grid'], 10)) { + gridSize[litem]++; + var tmph = $.datepicker.formatTime(this.support.ampm ? 'hht' : 'HH', {hour: h}, o); + html += ''; + } + } + else { + for (var m = o[litem + 'Min']; m <= max[litem]; m += parseInt(o[litem + 'Grid'], 10)) { + gridSize[litem]++; + html += ''; + } + } + + html += '
' + tmph + '' + ((m < 10) ? '0' : '') + m + '
'; + } + html += ''; + } + + // Timezone + var showTz = o.showTimezone !== null ? o.showTimezone : this.support.timezone; + html += '
' + o.timezoneText + '
'; + html += '
'; + + // Create the elements from string + html += ''; + var $tp = $(html); + + // if we only want time picker... + if (o.timeOnly === true) { + $tp.prepend('
' + '
' + o.timeOnlyTitle + '
' + '
'); + $dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide(); + } + + // add sliders, adjust grids, add events + for (i = 0, l = tp_inst.units.length; i < l; i++) { + litem = tp_inst.units[i]; + uitem = litem.substr(0, 1).toUpperCase() + litem.substr(1); + show = o['show' + uitem] !== null ? o['show' + uitem] : this.support[litem]; + + // add the slider + tp_inst[litem + '_slider'] = tp_inst.control.create(tp_inst, $tp.find('.ui_tpicker_' + litem + '_slider'), litem, tp_inst[litem], o[litem + 'Min'], max[litem], o['step' + uitem]); + + // adjust the grid and add click event + if (show && o[litem + 'Grid'] > 0) { + size = 100 * gridSize[litem] * o[litem + 'Grid'] / (max[litem] - o[litem + 'Min']); + $tp.find('.ui_tpicker_' + litem + ' table').css({ + width: size + "%", + marginLeft: o.isRTL ? '0' : ((size / (-2 * gridSize[litem])) + "%"), + marginRight: o.isRTL ? ((size / (-2 * gridSize[litem])) + "%") : '0', + borderCollapse: 'collapse' + }).find("td").click(function (e) { + var $t = $(this), + h = $t.html(), + n = parseInt(h.replace(/[^0-9]/g), 10), + ap = h.replace(/[^apm]/ig), + f = $t.data('for'); // loses scope, so we use data-for + + if (f === 'hour') { + if (ap.indexOf('p') !== -1 && n < 12) { + n += 12; + } + else { + if (ap.indexOf('a') !== -1 && n === 12) { + n = 0; + } + } + } + + tp_inst.control.value(tp_inst, tp_inst[f + '_slider'], litem, n); + + tp_inst._onTimeChange(); + tp_inst._onSelectHandler(); + }).css({ + cursor: 'pointer', + width: (100 / gridSize[litem]) + '%', + textAlign: 'center', + overflow: 'hidden' + }); + } // end if grid > 0 + } // end for loop + + // Add timezone options + this.timezone_select = $tp.find('.ui_tpicker_timezone').append('').find("select"); + $.fn.append.apply(this.timezone_select, + $.map(o.timezoneList, function (val, idx) { + return $(""; - } -} - -/** - * Print out option HTML elements for the page parents drop-down. - * - * @since 1.5.0 - * @since 4.4.0 `$post` argument was added. - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $default Optional. The default page ID to be pre-selected. Default 0. - * @param int $parent Optional. The parent page ID. Default 0. - * @param int $level Optional. Page depth level. Default 0. - * @param int|WP_Post $post Post ID or WP_Post object. - * - * @return null|false Boolean False if page has no children, otherwise print out html elements - */ -function parent_dropdown( $default = 0, $parent = 0, $level = 0, $post = null ) { - global $wpdb; - $post = get_post( $post ); - $items = $wpdb->get_results( $wpdb->prepare("SELECT ID, post_parent, post_title FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'page' ORDER BY menu_order", $parent) ); - - if ( $items ) { - foreach ( $items as $item ) { - // A page cannot be its own parent. - if ( $post && $post->ID && $item->ID == $post->ID ) - continue; - - $pad = str_repeat( ' ', $level * 3 ); - $selected = selected( $default, $item->ID, false ); - - echo "\n\t"; - parent_dropdown( $default, $item->ID, $level +1 ); - } - } else { - return false; - } -} - -/** - * Print out option html elements for role selectors. - * - * @since 2.1.0 - * - * @param string $selected Slug for the role that should be already selected. - */ -function wp_dropdown_roles( $selected = '' ) { - $p = ''; - $r = ''; - - $editable_roles = array_reverse( get_editable_roles() ); - - foreach ( $editable_roles as $role => $details ) { - $name = translate_user_role($details['name'] ); - if ( $selected == $role ) // preselect specified role - $p = "\n\t"; - else - $r .= "\n\t"; - } - echo $p . $r; -} - -/** - * Outputs the form used by the importers to accept the data to be imported - * - * @since 2.0.0 - * - * @param string $action The action attribute for the form. - */ -function wp_import_upload_form( $action ) { - - /** - * Filters the maximum allowed upload size for import files. - * - * @since 2.3.0 - * - * @see wp_max_upload_size() - * - * @param int $max_upload_size Allowed upload size. Default 1 MB. - */ - $bytes = apply_filters( 'import_upload_size_limit', wp_max_upload_size() ); - $size = size_format( $bytes ); - $upload_dir = wp_upload_dir(); - if ( ! empty( $upload_dir['error'] ) ) : - ?>

-

-
-

- () - - - -

- -
-id ) ) { - return; - } - - $page = $screen->id; - - if ( !isset($wp_meta_boxes) ) - $wp_meta_boxes = array(); - if ( !isset($wp_meta_boxes[$page]) ) - $wp_meta_boxes[$page] = array(); - if ( !isset($wp_meta_boxes[$page][$context]) ) - $wp_meta_boxes[$page][$context] = array(); - - foreach ( array_keys($wp_meta_boxes[$page]) as $a_context ) { - foreach ( array('high', 'core', 'default', 'low') as $a_priority ) { - if ( !isset($wp_meta_boxes[$page][$a_context][$a_priority][$id]) ) - continue; - - // If a core box was previously added or removed by a plugin, don't add. - if ( 'core' == $priority ) { - // If core box previously deleted, don't add - if ( false === $wp_meta_boxes[$page][$a_context][$a_priority][$id] ) - return; - - /* - * If box was added with default priority, give it core priority to - * maintain sort order. - */ - if ( 'default' == $a_priority ) { - $wp_meta_boxes[$page][$a_context]['core'][$id] = $wp_meta_boxes[$page][$a_context]['default'][$id]; - unset($wp_meta_boxes[$page][$a_context]['default'][$id]); - } - return; - } - // If no priority given and id already present, use existing priority. - if ( empty($priority) ) { - $priority = $a_priority; - /* - * Else, if we're adding to the sorted priority, we don't know the title - * or callback. Grab them from the previously added context/priority. - */ - } elseif ( 'sorted' == $priority ) { - $title = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['title']; - $callback = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['callback']; - $callback_args = $wp_meta_boxes[$page][$a_context][$a_priority][$id]['args']; - } - // An id can be in only one priority and one context. - if ( $priority != $a_priority || $context != $a_context ) - unset($wp_meta_boxes[$page][$a_context][$a_priority][$id]); - } - } - - if ( empty($priority) ) - $priority = 'low'; - - if ( !isset($wp_meta_boxes[$page][$context][$priority]) ) - $wp_meta_boxes[$page][$context][$priority] = array(); - - $wp_meta_boxes[$page][$context][$priority][$id] = array('id' => $id, 'title' => $title, 'callback' => $callback, 'args' => $callback_args); -} - -/** - * Meta-Box template function - * - * @since 2.5.0 - * - * @global array $wp_meta_boxes - * - * @staticvar bool $already_sorted - * @param string|WP_Screen $screen Screen identifier - * @param string $context box context - * @param mixed $object gets passed to the box callback function as first parameter - * @return int number of meta_boxes - */ -function do_meta_boxes( $screen, $context, $object ) { - global $wp_meta_boxes; - static $already_sorted = false; - - if ( empty( $screen ) ) - $screen = get_current_screen(); - elseif ( is_string( $screen ) ) - $screen = convert_to_screen( $screen ); - - $page = $screen->id; - - $hidden = get_hidden_meta_boxes( $screen ); - - printf('
', htmlspecialchars($context)); - - // Grab the ones the user has manually sorted. Pull them out of their previous context/priority and into the one the user chose - if ( ! $already_sorted && $sorted = get_user_option( "meta-box-order_$page" ) ) { - foreach ( $sorted as $box_context => $ids ) { - foreach ( explode( ',', $ids ) as $id ) { - if ( $id && 'dashboard_browser_nag' !== $id ) { - add_meta_box( $id, null, null, $screen, $box_context, 'sorted' ); - } - } - } - } - - $already_sorted = true; - - $i = 0; - - if ( isset( $wp_meta_boxes[ $page ][ $context ] ) ) { - foreach ( array( 'high', 'sorted', 'core', 'default', 'low' ) as $priority ) { - if ( isset( $wp_meta_boxes[ $page ][ $context ][ $priority ]) ) { - foreach ( (array) $wp_meta_boxes[ $page ][ $context ][ $priority ] as $box ) { - if ( false == $box || ! $box['title'] ) - continue; - $i++; - $hidden_class = in_array($box['id'], $hidden) ? ' hide-if-js' : ''; - echo '
' . "\n"; - if ( 'dashboard_browser_nag' != $box['id'] ) { - $widget_title = $box[ 'title' ]; - - if ( is_array( $box[ 'args' ] ) && isset( $box[ 'args' ][ '__widget_basename' ] ) ) { - $widget_title = $box[ 'args' ][ '__widget_basename' ]; - // Do not pass this parameter to the user callback function. - unset( $box[ 'args' ][ '__widget_basename' ] ); - } - - echo ''; - } - echo "

{$box['title']}

\n"; - echo '
' . "\n"; - call_user_func($box['callback'], $object, $box); - echo "
\n"; - echo "
\n"; - } - } - } - } - - echo "
"; - - return $i; - -} - -/** - * Removes a meta box from one or more screens. - * - * @since 2.6.0 - * @since 4.4.0 The `$screen` parameter now accepts an array of screen IDs. - * - * @global array $wp_meta_boxes - * - * @param string $id Meta box ID (used in the 'id' attribute for the meta box). - * @param string|array|WP_Screen $screen The screen or screens on which the meta box is shown (such as a - * post type, 'link', or 'comment'). Accepts a single screen ID, - * WP_Screen object, or array of screen IDs. - * @param string $context The context within the screen where the box is set to display. - * Contexts vary from screen to screen. Post edit screen contexts - * include 'normal', 'side', and 'advanced'. Comments screen contexts - * include 'normal' and 'side'. Menus meta boxes (accordion sections) - * all use the 'side' context. - */ -function remove_meta_box( $id, $screen, $context ) { - global $wp_meta_boxes; - - if ( empty( $screen ) ) { - $screen = get_current_screen(); - } elseif ( is_string( $screen ) ) { - $screen = convert_to_screen( $screen ); - } elseif ( is_array( $screen ) ) { - foreach ( $screen as $single_screen ) { - remove_meta_box( $id, $single_screen, $context ); - } - } - - if ( ! isset( $screen->id ) ) { - return; - } - - $page = $screen->id; - - if ( !isset($wp_meta_boxes) ) - $wp_meta_boxes = array(); - if ( !isset($wp_meta_boxes[$page]) ) - $wp_meta_boxes[$page] = array(); - if ( !isset($wp_meta_boxes[$page][$context]) ) - $wp_meta_boxes[$page][$context] = array(); - - foreach ( array('high', 'core', 'default', 'low') as $priority ) - $wp_meta_boxes[$page][$context][$priority][$id] = false; -} - -/** - * Meta Box Accordion Template Function - * - * Largely made up of abstracted code from do_meta_boxes(), this - * function serves to build meta boxes as list items for display as - * a collapsible accordion. - * - * @since 3.6.0 - * - * @uses global $wp_meta_boxes Used to retrieve registered meta boxes. - * - * @param string|object $screen The screen identifier. - * @param string $context The meta box context. - * @param mixed $object gets passed to the section callback function as first parameter. - * @return int number of meta boxes as accordion sections. - */ -function do_accordion_sections( $screen, $context, $object ) { - global $wp_meta_boxes; - - wp_enqueue_script( 'accordion' ); - - if ( empty( $screen ) ) - $screen = get_current_screen(); - elseif ( is_string( $screen ) ) - $screen = convert_to_screen( $screen ); - - $page = $screen->id; - - $hidden = get_hidden_meta_boxes( $screen ); - ?> -
-
    - -
  • -

    - - -

    -
    -
    - -
    -
    -
  • - -
-
- $id, 'title' => $title, 'callback' => $callback); -} - -/** - * Add a new field to a section of a settings page - * - * Part of the Settings API. Use this to define a settings field that will show - * as part of a settings section inside a settings page. The fields are shown using - * do_settings_fields() in do_settings-sections() - * - * The $callback argument should be the name of a function that echoes out the - * html input tags for this setting field. Use get_option() to retrieve existing - * values to show. - * - * @since 2.7.0 - * @since 4.2.0 The `$class` argument was added. - * - * @global $wp_settings_fields Storage array of settings fields and info about their pages/sections - * - * @param string $id Slug-name to identify the field. Used in the 'id' attribute of tags. - * @param string $title Formatted title of the field. Shown as the label for the field - * during output. - * @param callable $callback Function that fills the field with the desired form inputs. The - * function should echo its output. - * @param string $page The slug-name of the settings page on which to show the section - * (general, reading, writing, ...). - * @param string $section Optional. The slug-name of the section of the settings page - * in which to show the box. Default 'default'. - * @param array $args { - * Optional. Extra arguments used when outputting the field. - * - * @type string $label_for When supplied, the setting title will be wrapped - * in a `
-

-networkactive ) - echo '

' . __( 'Disable Comments is Network Activated. The settings below will affect all sites in this network.', 'disable-comments') . '

'; -if( WP_CACHE ) - echo '

' . __( "It seems that a caching/performance plugin is active on this site. Please manually invalidate that plugin's cache after making any changes to the settings below.", 'disable-comments') . '

'; -?> -
-
    -
  • -

    everywhere. A complete description of what this option does is available here.', 'disable-comments' ), '' . __('Warning', 'disable-comments') . '', 'https://wordpress.org/plugins/disable-comments/other_notes/' ); ?>

    -
  • -
  • -

    -
      - $v ) echo "
    • ";?> -
    - networkactive ) :?> -

    -

    - -

    -
  • -
- -options['permanent'] ): ?> -

-
    -
  • - options['permanent'], true, false ) . '> ' . __( 'Use persistent mode', 'disable-comments') . ''; - echo '

    ' . sprintf( __( '%s: This will make persistent changes to your database — comments will remain closed even if you later disable the plugin! You should not use it if you only want to disable comments temporarily. Please read the FAQ before selecting this option.', 'disable-comments'), '' . __('Warning', 'disable-comments') . '', 'https://wordpress.org/plugins/disable-comments/faq/' ) . '

    '; - if( $this->networkactive ) - echo '

    ' . sprintf( __( '%s: Entering persistent mode on large multi-site networks requires a large number of database queries and can take a while. Use with caution!', 'disable-comments'), '' . __('Warning', 'disable-comments') . '' ) . '

    '; - ?> -
  • -
- - - -

-
-
- diff --git a/wp/wp-content/plugins/disable-comments/includes/tools-page.php b/wp/wp-content/plugins/disable-comments/includes/tools-page.php deleted file mode 100644 index 8ae4f65c..00000000 --- a/wp/wp-content/plugins/disable-comments/includes/tools-page.php +++ /dev/null @@ -1,122 +0,0 @@ - -
-

-get_var("SELECT count(comment_id) from $wpdb->comments"); -if ( $comments_count <= 0 ) { ?> -

-
- true ); -if( $this->networkactive ) { - $typeargs['_builtin'] = true; // stick to known types for network -} -$types = get_post_types( $typeargs, 'objects' ); -foreach( array_keys( $types ) as $type ) { - if( ! in_array( $type, $this->modified_types ) && ! post_type_supports( $type, 'comments' ) ) // the type doesn't support comments anyway - unset( $types[$type] ); -} - -if ( isset( $_POST['delete'] ) && isset( $_POST['delete_mode'] ) ) { - check_admin_referer( 'delete-comments-admin' ); - - if( $_POST['delete_mode'] == 'delete_everywhere' ) { - if ( $wpdb->query( "TRUNCATE $wpdb->commentmeta" ) != FALSE ){ - if ( $wpdb->query( "TRUNCATE $wpdb->comments" ) != FALSE ){ - $wpdb->query( "UPDATE $wpdb->posts SET comment_count = 0 WHERE post_author != 0" ); - $wpdb->query( "OPTIMIZE TABLE $wpdb->commentmeta" ); - $wpdb->query( "OPTIMIZE TABLE $wpdb->comments" ); - echo "

" . __( 'All comments have been deleted.', 'disable-comments' ) . "

"; - } else { - echo "

" . __( 'Internal error occured. Please try again later.', 'disable-comments' ) . "

"; - } - } else { - echo "

" . __( 'Internal error occured. Please try again later.', 'disable-comments' ) . "

"; - } - } else { - $delete_post_types = empty( $_POST['delete_types'] ) ? array() : (array) $_POST['delete_types']; - $delete_post_types = array_intersect( $delete_post_types, array_keys( $types ) ); - - // Extra custom post types - if( $this->networkactive && !empty( $_POST['delete_extra_post_types'] ) ) { - $delete_extra_post_types = array_filter( array_map( 'sanitize_key', explode( ',', $_POST['delete_extra_post_types'] ) ) ); - $delete_extra_post_types = array_diff( $delete_extra_post_types, array_keys( $types ) ); // Make sure we don't double up builtins - $delete_post_types = array_merge($delete_post_types, $delete_extra_post_types); - } - - if ( ! empty( $delete_post_types ) ) { - // Loop through post_types and remove comments/meta and set posts comment_count to 0 - foreach ( $delete_post_types as $delete_post_type ) { - $wpdb->query( "DELETE cmeta FROM $wpdb->commentmeta cmeta INNER JOIN $wpdb->comments comments ON cmeta.comment_id=comments.comment_ID INNER JOIN $wpdb->posts posts ON comments.comment_post_ID=posts.ID WHERE posts.post_type = '$delete_post_type'" ); - $wpdb->query( "DELETE comments FROM $wpdb->comments comments INNER JOIN $wpdb->posts posts ON comments.comment_post_ID=posts.ID WHERE posts.post_type = '$delete_post_type'" ); - $wpdb->query( "UPDATE $wpdb->posts SET comment_count = 0 WHERE post_author != 0 AND post_type = '$delete_post_type'" ); - echo "

" . sprintf( __( 'All comments have been deleted for %ss.', 'disable-comments' ), $delete_post_type ) . "

"; - } - - $wpdb->query( "OPTIMIZE TABLE $wpdb->commentmeta" ); - $wpdb->query( "OPTIMIZE TABLE $wpdb->comments" ); - - echo "

" . __( 'Comment Deletion Complete', 'disable-comments') . "

"; - } - - } - - $comments_count = $wpdb->get_var("SELECT count(comment_id) from $wpdb->comments"); - if ( $comments_count <= 0 ) { ?> -

- - -
-
    -
  • -

    everywhere.', 'disable-comments' ), '' . __('Warning', 'disable-comments') . '' ); ?>

    -
  • -
  • -

    -
      - $v ) echo "
    • ";?> -
    - networkactive ) :?> -

    -

    - -

    ' . __('Warning', 'disable-comments') . '' ); ?>

    -
  • -
- - -

-

-
- - diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-de_DE.mo b/wp/wp-content/plugins/disable-comments/languages/disable-comments-de_DE.mo deleted file mode 100644 index e855829db845f417e69597203cb3558c7f884d41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5471 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 will make persistent changes to your database — comments will remain closed even if you later disable the plugin! You should not use it if you only want to disable comments temporarily. Please read the FAQ before selecting this option." -msgstr "%s: Dies wird bleibende Änderungen an Datenbank — Kommentaren vornehmen, die auch nach der Deaktivierung des Plugins bestehen bleiben! Nutze diese Option nicht, wenn du die Kommentare nur temporär deaktivieren willst. Bitte lies die FAQs bevor du diese Option nutzt." - -msgid "http://wordpress.org/extend/plugins/disable-comments/" -msgstr "http://wordpress.org/extend/plugins/disable-comments/" - -msgid "Samir Shah" -msgstr "Samir Shah" - -msgid "http://rayofsolaris.net/" -msgstr "http://rayofsolaris.net/" - -#: disable-comments.php:352 -msgid "Other options" -msgstr "Weitere Optionen" - -#: disable-comments.php:38 -msgid "Disable Comments requires WordPress version %s or greater." -msgstr "Kommentare deaktivieren benötigt WordPress Version %s oder höher." - -#: disable-comments.php:200 -msgid "Note: The Disable Comments plugin is currently active, and comments are completely disabled on: %s. Many of the settings below will not be applicable for those post types." -msgstr "Anmerkung: Das Kommentar deaktivieren-Plugin ist aktiv und Kommentare sind für %s deaktiviert. Viele der Einstellungen unten lassen sich dadurch auf diesen Inhaltstyp nicht anwenden." - -#: disable-comments.php:342 -msgid "%s: This option is global and will affect your entire site. Use it only if you want to disable comments everywhere. A complete description of what this option does is available here." -msgstr "%s: Diese Option ist global und beeinflusst die gesamte Seite. Nutze diese nur, wenn du Kommentare überall deaktivieren willst. Eine ausführliche Beschreibung dieser Option ist hier verfügbar (EN)." - -msgid "Allows administrators to globally disable comments on their site. Comments can be disabled according to post type." -msgstr "Ermöglicht es Administratoren Kommentare global auf der Seite zu deaktivieren. Kommentare können auch für bestimmte Inhaltstyp deaktiviert werden." - -#: disable-comments.php:341 -msgid "Disable all comment-related controls and settings in WordPress." -msgstr "Deaktiviere alle Kommentar-bezogenen Kontrollen und Einstellungen in WordPress." - -#: disable-comments.php:342 -#: disable-comments.php:358 -#: disable-comments.php:360 -#: disable-comments.php:385 -msgid "Warning" -msgstr "Achtung" - -#: disable-comments.php:344 -msgid "On certain post types" -msgstr "Für bestimmte Inhaltstypen" - -#: disable-comments.php:349 -msgid "Disabling comments will also disable trackbacks and pingbacks. All comment-related fields will also be hidden from the edit/quick-edit screens of the affected posts. These settings cannot be overridden for individual posts." -msgstr "Das Deaktivieren von Kommentaren deaktiviert auch Trackbacks und Pingbacks. Alle Kommentar-bezogenen Felder werden außerdem auf den Bearbeiten/QuickEdit-Seiten der Beiträge ausgeblendet. Diese Einstellungen können nicht für einzelne Beiträge überschrieben werden." - -#: disable-comments.php:357 -msgid "Use persistent mode" -msgstr "Persistent-Mode nutzen" - -#: disable-comments.php:360 -msgid "%s: Entering persistent mode on large multi-site networks requires a large number of database queries and can take a while. Use with caution!" -msgstr "%s: Persistent-Mode auf großen Multi-Site Netzwerken zu aktivieren hat eine große Anzahl von Datenbankzugriffen zur Folge und kann einige Zeit in Anspruch nehmen. Bitte mit Vorsicht nutzen!" - -#: disable-comments.php:385 -msgid "%s: Selecting this option will make persistent changes to your database. Are you sure you want to enable it?" -msgstr "%s: Die Wahl dieser Option hat permanente Änderungen in der Datenbank zur Folge. Bist du sicher, dass du sie aktivieren willst?" - -#: disable-comments.php:220 -msgid "The Disable Comments plugin is active, but isn't configured to do anything yet. Visit the configuration page to choose which post types to disable comments on." -msgstr "Das Kommentare deaktivieren-Plugin ist aktiv aber noch nicht konfiguriert. Rufe die Einstellungsseite um auszuwählen für welche Inhaltstypen Kommentare deaktiviert werden sollen." - -#: disable-comments.php:288 -#: disable-comments.php:332 -msgid "Disable Comments" -msgstr "Kommentare deaktivieren" - -#: disable-comments.php:326 -msgid "Options updated. Changes to the Admin Menu and Admin Bar will not appear until you leave or reload this page." -msgstr "Änderungen übernommen. Veränderungen an Admin Menü und Admin Bar werden nicht sichtbar bevor du die Seite verlässt oder neu lädst." - -#: disable-comments.php:335 -msgid "Disable Comments is Network Activated. The settings below will affect all sites in this network." -msgstr "Kommentare deaktivieren ist für alle Seiten aktiviert. Die Einstellungen unten betreffen alle Seiten des Netzwerks." - -#: disable-comments.php:337 -msgid "It seems that a caching/performance plugin is active on this site. Please manually invalidate that plugin's cache after making any changes to the settings below." -msgstr "Es scheint ein Caching/Performance-Plugin aktiv zu sein. Bitte leere den Cache des Plugins nach der Änderung der Optionen auf dieser Seite." - -#: disable-comments.php:341 -msgid "Everywhere" -msgstr "Überall" - diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-es_ES.mo b/wp/wp-content/plugins/disable-comments/languages/disable-comments-es_ES.mo deleted file mode 100644 index 0d34b1ddc20efdb3a39c3bee991574f3f38eee9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5986 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\n" -"Language-Team: Dimensión multimedia \n" -"Plural-Forms: s\n" -"X-Poedit-Language: Spanish\n" -"X-Poedit-Country: SPAIN\n" -"X-Poedit-SourceCharset: utf-8\n" - -#: disable-comments.php:38 -msgid "Disable Comments requires WordPress version %s or greater." -msgstr "Es necesario una versión de WordPress %s o superior para Desactivar Comentarios." - -#: disable-comments.php:169 -msgid "Note: The Disable Comments plugin is currently active, and comments are completely disabled on: %s. Many of the settings below will not be applicable for those post types." -msgstr "Nota: El plugin Desactivar Comentarios está activo actualmente, y los comentarios están completamente desactivados en: %s. Muchos de los parámetros de abajo no serán aplicables para estos tipos de entradas." - -#: disable-comments.php:169 -msgid ", " -msgstr "," - -#: disable-comments.php:183 -msgid "The Disable Comments plugin is active, but isn't configured to do anything yet. Visit the configuration page to choose which post types to disable comments on." -msgstr "El plugin Desactivar Comentarios está activo, pero no está configurado para hacer nada aún. Visita la página de configuración para elegir en qué tipo de entradas quieres deshabilitar los comentarios." - -#: disable-comments.php:225 -#: disable-comments.php:269 -msgid "Disable Comments" -msgstr "Desactivar Comentarios" - -#: disable-comments.php:262 -msgid "If a caching/performance plugin is active, please invalidate its cache to ensure that changes are reflected immediately." -msgstr "Si hay activo un plugin de cacheo/rendimiento, por faror, invalida su caché para asegurarte de que los cambios se reflejan inmediatamente." - -#: disable-comments.php:263 -msgid "Options updated. Changes to the Admin Menu and Admin Bar will not appear until you leave or reload this page." -msgstr "Opciones actualizadas. Los cambios del Menú de Administración o de la Barra de Administración no aparecerán hasta que abandones o recargues esta página." - -#: disable-comments.php:272 -msgid "Disable Comments is Network Activated. The settings below will affect all sites in this network." -msgstr "Desactivar Comentarios está Activado en Red. Los parámetros de abajo afectarán a todos los sitios de esta red." - -#: disable-comments.php:274 -msgid "It seems that a caching/performance plugin is active on this site. Please manually invalidate that plugin's cache after making any changes to the settings below." -msgstr "Parece que hay un plugin de caché/rendimiento activo en este sitio. Por favor, invalida manualmente la caché de ese plugin tras hacer cualquier cambio en los parámetros de abajo." - -#: disable-comments.php:278 -msgid "Everywhere" -msgstr "En todos los sitios" - -#: disable-comments.php:278 -msgid "Disable all comment-related controls and settings in WordPress." -msgstr "Deshabilitar todos los controles y configuraciones relacionadas con comentarios de WordPress." - -#: disable-comments.php:279 -msgid "%s: This option is global and will affect your entire site. Use it only if you want to disable comments everywhere. A complete description of what this option does is available here." -msgstr "%s: Esta opción es global y afectará a todo tu sitio. Utilízala sólo si quieres deshabilitar los comentarios en todos los sitios. Puedes encontrar una descripción completa sobre lo que hace esta opción aquí." - -#: disable-comments.php:279 -#: disable-comments.php:295 -#: disable-comments.php:297 -#: disable-comments.php:325 -msgid "Warning" -msgstr "Aviso" - -#: disable-comments.php:281 -msgid "On certain post types" -msgstr "En determinados tipos de entradas" - -#: disable-comments.php:286 -msgid "Disabling comments will also disable trackbacks and pingbacks. All comment-related fields will also be hidden from the edit/quick-edit screens of the affected posts. These settings cannot be overridden for individual posts." -msgstr "Deshabilitando los comentarios tambien deshabilitará los trackbacks y pingbacks. Todos los campos relacionados con comentarios también serán ocultados desde las pantallas de edición y edición rápida de las entradas afectadas. Estos parámetros no pueden ser sobreescritos para entradas individuales." - -#: disable-comments.php:289 -msgid "Other options" -msgstr "Otras opciones" - -#: disable-comments.php:294 -msgid "Use persistent mode" -msgstr "Usar modo persistente" - -#: disable-comments.php:295 -msgid "%s: This will make persistent changes to your database — comments will remain closed even if you later disable the plugin! You should not use it if you only want to disable comments temporarily. Please read the FAQ before selecting this option." -msgstr "%s: Esto hará cambios permanentes a tu base de datos — ¡los comentarios permanecerán cerrados incluso si después desactivas el plugin! No deberías utilizar esta opción si sólo quieres deshabilitar los comentarios temporalmente. Por favor, consulta las FAQ antes de seleccionar esta opción. " - -#: disable-comments.php:297 -msgid "%s: Entering persistent mode on large multi-site networks requires a large number of database queries and can take a while. Use with caution!" -msgstr "%s: Activar el modo permanente en redes multisitio grandes requiere un gran número de peticiones a la base de datos y puede tardar un buen rato. ¡Utilízalo con precaución!" - -#: disable-comments.php:300 -msgid "Persistent mode has been manually disabled. See the FAQ for more information." -msgstr "El modo permanente ha sido manualmente deshabilitado. Por favor, consulta las FAQ para más información." - -#: disable-comments.php:305 -msgid "Save Changes" -msgstr "Guardar Cambios" - -#: disable-comments.php:325 -msgid "%s: Selecting this option will make persistent changes to your database. Are you sure you want to enable it?" -msgstr "%s: Selecionando esta opción hará cambios permanentes en tu base de datos. ¿Estás seguro de querer habilitarlo?" - diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-fa_ir.mo b/wp/wp-content/plugins/disable-comments/languages/disable-comments-fa_ir.mo deleted file mode 100644 index 9f72b9f8fe3648ce1013b10a9842a8827960f16c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7949 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 diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-fa_ir.po b/wp/wp-content/plugins/disable-comments/languages/disable-comments-fa_ir.po deleted file mode 100644 index 6356f7b2..00000000 --- a/wp/wp-content/plugins/disable-comments/languages/disable-comments-fa_ir.po +++ /dev/null @@ -1,200 +0,0 @@ -# Copyright (C) 2013 Disable Comments -# This file is distributed under the same license as the Disable Comments package. -msgid "" -msgstr "" -"Project-Id-Version: Disable Comments 1.2\n" -"Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/disable-comments\n" -"POT-Creation-Date: 2015-02-03 08:04:31+00:00\n" -"PO-Revision-Date: 2015-09-02 13:00+0430\n" -"Last-Translator: fxbenard | FxB \n" -"Language-Team: faraed.com \n" -"Language: fa_IR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.2\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Poedit-SourceCharset: UTF-8\n" - -#: disable-comments.php:38 -msgid "Disable Comments requires WordPress version %s or greater." -msgstr "غیر فعال کردن نظرات مورد نیاز وردپرس نسخه %s یا بیشتر." - -#: disable-comments.php:210 -msgid "" -"Note: The Disable Comments plugin is currently active, and comments " -"are completely disabled on: %s. Many of the settings below will not be " -"applicable for those post types." -msgstr "" -"توجه: غیر فعال کردن نظرات پلاگین در حال حاضر فعال است و نظرات و " -"کاملا بقیه موارد غیر فعال است در: %s. بسیاری از تنظیمات برای انواع پست ها قابل " -"ارائه است." - -#: disable-comments.php:210 -msgid ", " -msgstr "," - -#: disable-comments.php:230 -msgid "" -"The Disable Comments plugin is active, but isn't configured to do " -"anything yet. Visit the configuration page to choose which " -"post types to disable comments on." -msgstr "" -"افزونه غیر فعال کردن نظرات فعال است، اما هنوز پیکربندی انجام نشده " -"است. بازدید صفحه پیکربندی انواع موارد برای غیر فعال شدن " -"نظرات را لطفا انتخاب نمایید." - -#: disable-comments.php:237 -msgid "Comments are closed." -msgstr "نظرات بسته شده است" - -#: disable-comments.php:290 -msgid "Settings" -msgstr "تنظیمات" - -#. Plugin Name of the plugin/theme -#: disable-comments.php:298 disable-comments.php:350 -msgid "Disable Comments" -msgstr "غیر فعال کردن نظرات" - -#: disable-comments.php:343 -msgid "" -"If a caching/performance plugin is active, please invalidate its cache to " -"ensure that changes are reflected immediately." -msgstr "" -"اگر پلاگین کش (ذخیره/عملکرد) فعال باشد. لطفا افزونه کش خود را غیر فعال نمایید. " -"چون در کار افزونه تداخل ایجاد می کند." - -#: disable-comments.php:344 -msgid "" -"Options updated. Changes to the Admin Menu and Admin Bar will not appear until " -"you leave or reload this page." -msgstr "" -"قابلیت بروز رسانی . منوی مدیریت و یا نوار مدیریت آن را تغییر دهید تا این پیغام " -"در این صفحه ظاهر نشود." - -#: disable-comments.php:353 -msgid "" -"Disable Comments is Network Activated. The settings below will affect " -"all sites in this network." -msgstr "" -"غیر فعال کردن نظرات فعال شبکه است. تنظیمات زیر همه سایت ها در شبکه تاثیر می گذارد." - -#: disable-comments.php:355 -msgid "" -"It seems that a caching/performance plugin is active on this site. Please " -"manually invalidate that plugin's cache after making any changes to the " -"settings below." -msgstr "" -"به نظر می رسد که پلاگین کش (ذخیره/عملکرد) در این سایت فعال است. لطفا تا ذخیره " -"تنظمیات افزونه کش را غیر فعال نمایید." - -#: disable-comments.php:359 -msgid "Everywhere" -msgstr "همه جا" - -#: disable-comments.php:359 -msgid "Disable all comment-related controls and settings in WordPress." -msgstr "غیر فعال کردن تمام کنترل های مربوط به نظر و تنظیمات وردپرس." - -#: disable-comments.php:360 -msgid "" -"%s: This option is global and will affect your entire site. Use it only if you " -"want to disable comments everywhere. A complete description of what " -"this option does is available here." -msgstr "" -"% s: گزینه این همگانی است و تمام سایت خود تاثیر می گذارد. فقط به نظر همه " -"جا غیر فعال کردن آن استفاده کنید. شرح کامل این گزینه چه در اینجا در دسترس است." - -#: disable-comments.php:360 disable-comments.php:380 disable-comments.php:382 -#: disable-comments.php:409 -msgid "Warning" -msgstr "اخطار" - -#: disable-comments.php:362 -msgid "On certain post types" -msgstr "در برخی انواع پست ها" - -#: disable-comments.php:368 -msgid "" -"Only the built-in post types appear above. If you want to disable comments on " -"other custom post types on the entire network, you can supply a comma-separated " -"list of post types below (use the slug that identifies the post type)." -msgstr "" -"تنها نوع پست ساخته شده است به نظر بالا می رسد . اگر می خواهید برای غیر فعال " -"کردن نظر در مورد سایر انواع پست سفارشی در کل شبکه شما می توانید با کاما از هم " -"جدا کنید لیست از پست انواع زیر (استفاده از مثل حلزون حرکت است که برای شناسایی " -"نوع پست) عرضه می شود." - -#: disable-comments.php:371 -msgid "" -"Disabling comments will also disable trackbacks and pingbacks. All comment-" -"related fields will also be hidden from the edit/quick-edit screens of the " -"affected posts. These settings cannot be overridden for individual posts." -msgstr "" -"با غیر فعال کردن نظرات نیز بازتاب ها و شکلک ها غیر فعال می شود. همه زمینه های " -"مربوط به نظر نیز از نمایشگرهای ویرایش/سریع ویرایش پست آسیب دیده پنهان خواهد شد. " -"این تنظیمات را نمی توان برای فرد خاصی باطل کرد." - -#: disable-comments.php:374 -msgid "Other options" -msgstr "تنظیمات دیگر" - -#: disable-comments.php:379 -msgid "Use persistent mode" -msgstr "استفاده حالت مداوم " - -#: disable-comments.php:380 -msgid "" -"%s: This will make persistent changes to your database — comments " -"will remain closed even if you later disable the plugin! You should " -"not use it if you only want to disable comments temporarily. Please read the FAQ before selecting this option." -msgstr "" -"% s: این تغییرات مداوم به پایگاه داده خود را — نظرات باقی خواهد " -"ماند بسته می شود حتی اگر شما بعد از غیر فعال کردن این افزونه! اگر " -"شما فقط می خواهید به نظرات به طور موقت غیر فعال کنید از این نباید استفاده " -"کرد پرسش و پاسخ را بخوانید لطفا قبل از " -"انتخاب این گزینه." - -#: disable-comments.php:382 -msgid "" -"%s: Entering persistent mode on large multi-site networks requires a large " -"number of database queries and can take a while. Use with caution!" -msgstr "" -"% s: ورود حالت مداوم در شبکه های چند سایت بزرگ نیاز به تعداد زیادی از پایگاه " -"داده نمایش داده شد و مدتی طول می کشد. با احتیاط استفاده کنید!" - -#: disable-comments.php:388 -msgid "Save Changes" -msgstr "ذخیره تغییرات" - -#: disable-comments.php:409 -msgid "" -"%s: Selecting this option will make persistent changes to your database. Are " -"you sure you want to enable it?" -msgstr "" -"% s: با انتخاب این گزینه قادر به ایجاد تغییرات مداوم در بانک اطلاعاتی شما خواهد " -"شد. آیا مطمئن هستید که می خواهید آن را فعال کنید؟" - -#. Plugin URI of the plugin/theme -msgid "http://wordpress.org/extend/plugins/disable-comments/" -msgstr "http://wordpress.org/extend/plugins/disable-comments/" - -#. Description of the plugin/theme -msgid "" -"Allows administrators to globally disable comments on their site. Comments can " -"be disabled according to post type." -msgstr "" -"اجازه می دهد تا مدیران به نظرات در سایت خود همگانی را غیر فعال کنند. نظرات را " -"می توان با توجه به نوع پست خاصی غیر فعال کرد." - -#. Author of the plugin/theme -msgid "Samir Shah" -msgstr "Samir Shah" - -#. Author URI of the plugin/theme -msgid "http://rayofsolaris.net/" -msgstr "http://rayofsolaris.net/" diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-fr_FR.mo b/wp/wp-content/plugins/disable-comments/languages/disable-comments-fr_FR.mo deleted file mode 100644 index 80087ff845669d39e93626269658854057a9d771..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6764 zcmb`L--{$y700i-{+dLiNi^|Cir_;)@N@31>hAfmF`@;{ z>F%m~@A>gP-*Zm=?)GCZDXx3?e3s9#_b7D|`4&>H7vHPYDZc*@`F(!>>U~P3$V=klKw|DU%h^&RAkDE~I{u8%9lZFT$YO8o$NC-NuA zSCOAXKFT3t=X1!Xkz?c&$TyL{Mc#rl3+lciwbUtIHv$q}9M> z_bxBgO6afhm>=dPqb;T*JY}V&lx~sPhDxpfV&E)XXj>dUm3YYG-^?GVW!)2p~ zh3%g^exEB*XtQyYqW@hC+jwAR@@et>24-HV5#z-eQ9z?l!47=GfE)Ax|L(EEBozhCq ze!Pa}S`Fx+fo%9>45eNL7h9k>Y3ohk>uo7G@gOJ7x1;B4M>J_=NGNfHpJJTk2uj!Z zXsgwf)r3A7xs04EOqmxU-J+8L{UJ|*H}c07wUZl#19ZALDjJe#)9d9$60n@>aqjWg z?%1}~WPu@2F;&~@p!tXXm?HUEc3lV3UK1`4BK3V_N}&fN6)7^^OYA3p!Vj&&3Il-e zJcD!62=<8&am!@aX1yq0uddm}q<)(FxT<%p%O`F%=JD_g&>V4W-`O;o-3CVuU6Mdh z{URTUL$ys@xj?q|uC?T=25;78nAQ)sV{kD+TmqnpE(EAmMnO%q0jK`_#1p*;bs7;-lrj~E3rzn25D5VHaGS2fa zXNry8%B5v%-%ZV)))d-w!A)BO2w~)#(j+0s*{Q%_Ujp3eDKR?0I5Kd}FsH(HQdN9~ z^0+4?m1%i9Hn0u2NZ}o^eP*l3X(yxvhtN=}`2tWJ8B;p4Nq{qB`bkU=-0XEV7I4Cn zYt!CAo?R7+)0b^lg~}0sK8EF?hKPe}PgIGwUg$3_0XYn>rZXA)}(OY zr`F>Dr=w3VE&#m?d)54Wz^Ej)hIvr9a<_`u>4&s{RU zY;6`M^Aw%D=;;1VmzJhT^f&c|oyYWYf9KKWuQv9tup%2&0IRiW&8VZFusdduXJCdW zhxL!P%cl>rXYt&HD|44GUOqqd)>3pPb+tDRn$9M>VUU_H=$mQJC%?quE zrq79-YwT3@!A4Glp@ujip8Ew#VYJ~OwTR)tAh7pN69@fiW- zr$2Z4tn}1;J$EA0D|+eVS@wtvTN^a*Jxf}M0v#PSptsZ0Az;n+oJJ2LtyWFWv9$+& zkUTbdz4waV%1g>h7y@X1lRV4zZdfSvlB|k+YeL8CEyG2rlf4^0q!m(+_Ff-JcgQZ4 zpWd?9bvhsL8TyHtpG&vOyBbo^f=5@Wk zx=|MiSQLVQVPc!FpUGj7)Vy;K$;6;f*z9CTXc|f}kv?jegUbUOMhCBk0xrtxFfYtx zGbLMBnJ#dRHI?iW`bCXPd!(&Q68x9tqi$g#<2X*x4dXgMBdQ*b!&TVRdF-6EO~Z;k zJuWKvo9;qp2tr>E5rj|*%8V=i7aW{Ny;cZsT?tRvlVSybrNO`Rkz@<~h>mKk&7NGh zS%Qbm+mTF*VX=TNIK;^u2Fo#C)RwmJLj$RIi4&;>)W0&X%6ineD)`8Il|VkSHeep7 zd#}aWqs9o1xBH-KshzXTe`wN#X2*Hv#12P-HOOJ^xcS&2o7O3#fkj6DC+Mgepu}VY zOjP1tP?pqlE%Fxg=@`R27PGIJMX(gS0Gt4@=|D2Gsahw`Ehkqyv-60p7)Y>slE+{r z4kuQ8bvOqF)G4dNQAhB?*jBt4DD~d!64S}HLJy4Jq^`UmfIQ_;85ign+UhX72)962 zBi1z|1BJhC_zsURGbsgJW+oR-nam!V)~f;t&26gJ-VJ7R%D;M?gBs*cyh-K`QtF0e zCbh=(@jmX`$AckNCr6;`%tnU@4964{3mep!_$C5UczI^*AyhK;$SBeTmkKi)zmqOC zCr5;c=k%KBKCyy>$CQdd++zdZhZse2n@ln`O=IXI39$j0BacNUS3 z#II9|m)J7)2svAt;uOAONCH{}KimMtw2Kh}o{Z!c?@1!sLSq?glNT7EKcw2LN-UBw zXYWRsbL0s$y2unBhy=%$Y%+heCfeuRjuDnOB6XpYe4)+TuOt*&D>*LqUXyvf5>nou zkrVGs-8)TE^t!^!vO;X?>|>Ohx2ZKPR1^Q#9D!etN<;C?gu_CrPVgjt5))jUNz3 z2nYBpoWp$Lyceo4RUo$tbsJnAP4xQ`Pb^IC|NNPU&+_I>-oe$!O=u-F)>Jct`S6B`>cqc-xlo{a8fLp5 z9^=JFiSva43oD)KfFH3Zh!fXp^x=^s7d{!#UWfEOkOt~XLoVvlOpEs)QSP?Hm%L8) zI-3{di!C%S@|L!lu6UxYuQ1fu>#^eqrDuQtMw#c;Y~+zJ$OSG9&0CG%x^tVs;|xFq s;oQMxKsGq-XyD1}S@4nHb$b#hZMN|v1ZtHEQwq2xFPm}g|24<`8+fVnJpcdz diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-fr_FR.po b/wp/wp-content/plugins/disable-comments/languages/disable-comments-fr_FR.po deleted file mode 100644 index 66301993..00000000 --- a/wp/wp-content/plugins/disable-comments/languages/disable-comments-fr_FR.po +++ /dev/null @@ -1,210 +0,0 @@ -# Copyright (C) 2013 Disable Comments -# This file is distributed under the same license as the Disable Comments package. -msgid "" -msgstr "" -"Project-Id-Version: Disable Comments 1.2\n" -"Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/disable-comments\n" -"POT-Creation-Date: 2015-02-03 08:04:31+00:00\n" -"PO-Revision-Date: 2015-02-03 14:30+0100\n" -"Last-Translator: fxbenard | FxB \n" -"Language-Team: Hexagone \n" -"Language: fr_FR\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.7.3\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Poedit-SourceCharset: UTF-8\n" - -#: disable-comments.php:38 -msgid "Disable Comments requires WordPress version %s or greater." -msgstr "" -"Disable Comments nécessite la version %s de WordPress ou une version supérieure" - -#: disable-comments.php:210 -msgid "" -"Note: The Disable Comments plugin is currently active, and comments " -"are completely disabled on: %s. Many of the settings below will not be " -"applicable for those post types." -msgstr "" -"Remarque : l'extension Disable Comments est actuellement activée et " -"les commentaires sont complètement désactivés sur %s. Un grand nombre de ces " -"réglages ne seront pas applicables pour ces types de contenu. " - -#: disable-comments.php:210 -msgid ", " -msgstr "," - -#: disable-comments.php:230 -msgid "" -"The Disable Comments plugin is active, but isn't configured to do " -"anything yet. Visit the configuration page to choose which " -"post types to disable comments on." -msgstr "" -"L'extension Disable Comments est activée mais n'est pas encore " -"configurée. Rendez-vous sur la page de configuration pour " -"choisir les types de contenu pour lesquels vous souhaitez désactiver les " -"commentaires. " - -#: disable-comments.php:237 -msgid "Comments are closed." -msgstr "Les commentaires sont fermés." - -#: disable-comments.php:290 -msgid "Settings" -msgstr "Réglages" - -#. Plugin Name of the plugin/theme -#: disable-comments.php:298 disable-comments.php:350 -msgid "Disable Comments" -msgstr "Disable Comments" - -#: disable-comments.php:343 -msgid "" -"If a caching/performance plugin is active, please invalidate its cache to " -"ensure that changes are reflected immediately." -msgstr "" -"Si vous utilisez une extension de cache, veuillez vider le cache afin de " -"constater que les changements sont répercutés immédiatement. " - -#: disable-comments.php:344 -msgid "" -"Options updated. Changes to the Admin Menu and Admin Bar will not appear until " -"you leave or reload this page." -msgstr "" -"Options mises à jour. Les modifications n'apparaitront pas dans l'admin tant " -"que vous n'aurez pas quitté ou rechargé cette page." - -#: disable-comments.php:353 -msgid "" -"Disable Comments is Network Activated. The settings below will affect " -"all sites in this network." -msgstr "" -"Disable Commentsest activé au niveau du réseau. Les modifications ci-" -"dessous affecteront tous les sites du réseau." - -#: disable-comments.php:355 -msgid "" -"It seems that a caching/performance plugin is active on this site. Please " -"manually invalidate that plugin's cache after making any changes to the " -"settings below." -msgstr "" -"Il semblerait qu'une extension de cache soit active sur votre site. Veuillez " -"vider ce cache après toutes modifications dans les réglages ci-dessous. " - -#: disable-comments.php:359 -msgid "Everywhere" -msgstr "Partout" - -#: disable-comments.php:359 -msgid "Disable all comment-related controls and settings in WordPress." -msgstr "Désactiver tous les réglages relatifs aux commentaires dans WordPress." - -#: disable-comments.php:360 -msgid "" -"%s: This option is global and will affect your entire site. Use it only if you " -"want to disable comments everywhere. A complete description of what " -"this option does is available here." -msgstr "" -"%s : Cette option affecte l'ensemble de votre site internet. Utilisez-la si " -"vous souhaitez désactiver les commentaires partout. Une documentation " -"complète des options de l'extension est disponible ici (en)." - -#: disable-comments.php:360 disable-comments.php:380 disable-comments.php:382 -#: disable-comments.php:409 -msgid "Warning" -msgstr "Avertissement" - -#: disable-comments.php:362 -msgid "On certain post types" -msgstr "Certains types de contenu " - -#: disable-comments.php:368 -msgid "" -"Only the built-in post types appear above. If you want to disable comments on " -"other custom post types on the entire network, you can supply a comma-separated " -"list of post types below (use the slug that identifies the post type)." -msgstr "" -"Seuls les types d'article intégrés apparaissent au-dessus. Si vous souhaitez " -"désactiver commentaires sur d'autres types de contenu personnalisé sur " -"l'ensemble du réseau, vous pouvez fournir une liste séparée par des " -"virgules de ces types de contenu ci-dessous (utiliser leurs identifiants)." - -#: disable-comments.php:371 -msgid "" -"Disabling comments will also disable trackbacks and pingbacks. All comment-" -"related fields will also be hidden from the edit/quick-edit screens of the " -"affected posts. These settings cannot be overridden for individual posts." -msgstr "" -"Désactiver les commentaires entraine une désactivation des trackbacks et pings. " -"Tous les champs relatifs aux commentaires seront affectés. Ces réglages ne " -"pourront pas être choisi individuellement dans les articles. " - -#: disable-comments.php:374 -msgid "Other options" -msgstr "Autres options" - -#: disable-comments.php:379 -msgid "Use persistent mode" -msgstr "Utiliser le mode persistant" - -#: disable-comments.php:380 -msgid "" -"%s: This will make persistent changes to your database — comments " -"will remain closed even if you later disable the plugin! You should " -"not use it if you only want to disable comments temporarily. Please read the FAQ before selecting this option." -msgstr "" -"%s : Ceci fera des changements permanents à votre base de données. Les " -"commentaires seront désactivés même si vous désactivez l'extension ! " -"Si vous souhaitez désactiver les commentaires de façon temporaire, vous ne " -"devez PAS activer cette option. Voir la FAQ " -"(en) avant de choisir cette option." - -#: disable-comments.php:382 -msgid "" -"%s: Entering persistent mode on large multi-site networks requires a large " -"number of database queries and can take a while. Use with caution!" -msgstr "" -"%s : Activer le mode persistent sur un réseau de sites nécessite de nombreuses " -"requetes dans la base de données. Utilisez cette option avec prudence !" - -#: disable-comments.php:388 -msgid "Save Changes" -msgstr "Sauvegarder les modifications" - -#: disable-comments.php:409 -msgid "" -"%s: Selecting this option will make persistent changes to your database. Are " -"you sure you want to enable it?" -msgstr "" -"%s : Selectionner cette option fera des changements permanents à votre base de " -"données. Etes-vous certain(e) de vouloir l'activer ? " - -#. Plugin URI of the plugin/theme -msgid "http://wordpress.org/extend/plugins/disable-comments/" -msgstr "http://wordpress.org/extend/plugins/disable-comments/" - -#. Description of the plugin/theme -msgid "" -"Allows administrators to globally disable comments on their site. Comments can " -"be disabled according to post type." -msgstr "" -"Permet aux administrateurs de désactiver globalement les commentaires sur leur " -"site. Les commentaires peuvent être désactivés selon le type de contenu." - -#. Author of the plugin/theme -msgid "Samir Shah" -msgstr "Samir Shah" - -#. Author URI of the plugin/theme -msgid "http://rayofsolaris.net/" -msgstr "http://rayofsolaris.net/" - -#~ msgid "" -#~ "Persistent mode has been manually disabled. See the FAQ for more information." -#~ msgstr "" -#~ "Le mode persistant a été désactivé de façon manuelle. Voir la FAQpour plus d'information." diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-id_ID.mo b/wp/wp-content/plugins/disable-comments/languages/disable-comments-id_ID.mo deleted file mode 100644 index 6870385d1d97bc0d530a3876fab90877f253cd3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5589 zcmb7|J&Ytr6~_xO*j~Pj`ARHNcam|yPS5TkoAY?R_I=r$?L9AdYaa+Ct7f{Ur*^ul z$6ejKUPnYkAV`qN5F$X3A&|gw3W*~EB#=Nr;tUc<3HZJ0?wQ%!^T~`f`=)!kUcGw% z|NFl;`?rVh`=R3XdESrk{v+=%@c!-x_`~ag4=T0E=LfOh+Q9x7`v&&@`*{ZYZS1eH=O4fa_D|RX z`!DRrvEO`9DUWs7k756eeGB_8_S4uO;}jR_SJ+NgygP}MtFiAP>?Ub#nz@%2&u%HE_R`jmXj zOV)obero?n-sDB96=_jy5nqI=NO#PS!~kURMTjwGpj7J7Fw#4ru1cTn9?V?O$1cxx zVdhpZY!zInt*`ZDW_)IYu1kGVHkD3IZN?^8{ly|RVfK`sltsaV-SWy7#(6!-%V1M& zkF3{jDl2tvYRhsL%s98Yp0P{bWX_-48FoSFZ}3={l}(;%U)H)|7gzV|OP`GO|<^SU-wX6vWVzc$W|pP%2YtVv@O&t3Z3 z&d}`Yv7MHc)xqX=QahjVB{?YR~ZGEq)fxqQ9Bu{`2aJu#kO0m10wnagdWU*RmruAcE#Bhj3T z(cHRQp#L9+iN3^%1)R`yANmAaA7OI!GjX%Xk2V*YtYmpPHhBy;lEzG@B&{U~T;RA` zlF)_@gb}-r2mKCbAl$LVE`+I0j%T*AJ3}rBQ24dTEg4O1m{cy}A;~+Q8K|(rNT($k zB)EIRZjOx0PztA2o|S_K7hW#*20qjbMo@I z&3u=LzN`!dC5Z?tj#C^l=#C$Wx^vqzH&zU~T~_HnR0^6j1(={8g`t(sAT!il`I3FR z(il`$Di2X}PZgkf5hMJz#^x_U^JOy&dmsKMD<&(Wsw>o%zzVNr%U#N<;E%Og-Qq89iq zNlVrFCN0jV?#QJLOl?=HYfE~m>r)DBVkR@fA5zd1e_{NjS0%yS2;O!Ror-ee{E^8W z`X{Os;#zd9)I=)PQwtw^wKUv7dPGWy+o6!DVJtnDaL{JqPf-9oZ7X{w5v zCyYK{QN{YMAerb(m}k1GPdU*D_9l8y0_uQ19Y|YI9kgb#$lW9sE=UnJ{UxHR>yw2I ziF%o)W2;)4kAU6YRxd}n2)bDaZWQj7RXdZTUrGxW>{;JLF>5a`n`*T;8(Xd$R4s4& zm^DXGtpeY?j6H-TEKFvJ0hb7SyQkV;HPP55W=5m}-Y;?Mlac6Kwrz>`)ULi$NdgM# zRnAA&wjJu0gw-8Si9Wp_@OsF`4ShEF$6#>jr!IrgbVq8w6v99~m~&$5M8E2wU}VjD zsJs0tBeBG6#GZX8#gWEKt0$CnM((kn=A|t%8{Pc^u|<|k#!Sx5Tf*wutFxM`2b z`ROROFATOW>I)Y}+k|kD2wpOQ&BO^}UsfZ1!-T5IXXbUi*SI(Jj_{6vH2`(SjLh= zH)n*T0F2yT^R)~m*fu6+H8yGz{Z&(OkoDR)GkMZ1jqYnXSVXre#6O2?VxTT}Y}(G8 zd(6|JnalksB5R2{WZLzad?8b(%o$D4CjhE*J9aa)CXlR{>$;hVhhPtzA~*e4bD28V z^PP$_!KQnDOmG}$dAR4hywJR5-(cs#6y}_cFcYZ+j{F6OGQB6%F~YTDtl=#+1q6;#fIA!ddM|>fHtIRVuPO&M@tgC60?yo6wei#Z{adxW0+8E~T%sN=s8+n-<8jye; zL%wWhlpR*V{i&B0jU+G6gqKeN7Yg3%p%PkX4g(MlVOK& zWpcuat3$XIvo`04upx>_m`z}Zr(B8-08cKTWvT79 zw#fcI>u58Qx;ZZRF4GiFENQNm1=0ZQCH}F8Hi`ybsI%Q+()qZaYh5AN<@A+SGReoTAj*wUV E4>u%3xc~qF diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-id_ID.po b/wp/wp-content/plugins/disable-comments/languages/disable-comments-id_ID.po deleted file mode 100644 index 12b6ec5e..00000000 --- a/wp/wp-content/plugins/disable-comments/languages/disable-comments-id_ID.po +++ /dev/null @@ -1,171 +0,0 @@ -# This file is distributed under the same license as the Disable Comments package. -msgid "" -msgstr "" -"Project-Id-Version: Disable Comments 0.9.1\n" -"Report-Msgid-Bugs-To: http://wordpress.org/tag/disable-comments\n" -"POT-Creation-Date: 2013-06-19 05:01:50+00:00\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2013-12-08 22:10+0800\n" -"Last-Translator: Nasrulhaq Muiz \n" -"Language-Team: Nasrulhaq Muiz \n" -"Language: id_ID\n" -"X-Generator: Poedit 1.5.7\n" - -#: disable-comments.php:38 -msgid "Disable Comments requires WordPress version %s or greater." -msgstr "Matikan Komentar membutuhkan versi WordPress %s atau lebih." - -#: disable-comments.php:169 -msgid "" -"Note: The Disable Comments plugin is currently active, and comments " -"are completely disabled on: %s. Many of the settings below will not be " -"applicable for those post types." -msgstr "" -"Catatan: Plugin Matikan Komentar saat ini aktif, dan semua komentar " -"dimatikan pada: %s. Ragam pengaturan dibawah tidak dapat diterapkan tipe " -"posting tersebut. " - -#: disable-comments.php:169 -msgid ", " -msgstr "," - -#: disable-comments.php:183 -msgid "" -"The Disable Comments plugin is active, but isn't configured to do " -"anything yet. Visit the configuration page to choose " -"which post types to disable comments on." -msgstr "" -"Plugin Matikan Komentar aktif, tapi belum diatur untuk melakukan " -"apapun. Kunjungi halaman konfigurasi untuk memilih tipe " -"posting yang mana agar komentar yang dimatikan menyala." - -#: disable-comments.php:225 disable-comments.php:269 -msgid "Disable Comments" -msgstr "Matikan Komentar" - -#: disable-comments.php:262 -msgid "" -"If a caching/performance plugin is active, please invalidate its cache to " -"ensure that changes are reflected immediately." -msgstr "" -"Jika sebuah plugin caching / kinerja dalam keadaan aktif, silakan " -"membatalkan cache untuk memastikan bahwa perubahan tercermin segera." - -#: disable-comments.php:263 -msgid "" -"Options updated. Changes to the Admin Menu and Admin Bar will not appear " -"until you leave or reload this page." -msgstr "" -"Pilihan diperbarui. Perubahan pada Menu Admin dan Bilah Admin tidak akan " -"nampak hingga anda meninggalkan atau memuat ulang halaman ini" - -#: disable-comments.php:272 -msgid "" -"Disable Comments is Network Activated. The settings below will " -"affect all sites in this network." -msgstr "" -"Disable Comments adalah Jaringan Diaktifkan. Pengaturan di bawah " -"ini akan mempengaruhisemua situs dalam jaringan ini." - -#: disable-comments.php:274 -msgid "" -"It seems that a caching/performance plugin is active on this site. Please " -"manually invalidate that plugin's cache after making any changes to the " -"settings below." -msgstr "" -"Tampaknya plugin caching / kinerja aktif di situs ini. Harap membatalkan " -"cache plugin secara manual setelah membuat perubahan apapun untuk pengaturan " -"di bawah ini." - -#: disable-comments.php:278 -msgid "Everywhere" -msgstr "Di mana-mana" - -#: disable-comments.php:278 -msgid "Disable all comment-related controls and settings in WordPress." -msgstr "" -"Menonaktifkan semua kontrol-komentar terkait dan pengaturan dalam WordPress." - -#: disable-comments.php:279 -msgid "" -"%s: This option is global and will affect your entire site. Use it only if " -"you want to disable comments everywhere. A complete description of " -"what this option does is available here." -msgstr "" -"Pilihan ini global dan akan mempengaruhi seluruh situs Anda. Gunakan hanya " -"jika Anda ingin menonaktifkan komentar mana-mana. Penjelasan " -"lengkap tentang apa pilihan yang dilakukan adalah tersedia disini" - -#: disable-comments.php:279 disable-comments.php:295 disable-comments.php:297 -#: disable-comments.php:325 -msgid "Warning" -msgstr "Peringatan" - -#: disable-comments.php:281 -msgid "On certain post types" -msgstr "Pada jenis pos tertentu" - -#: disable-comments.php:286 -msgid "" -"Disabling comments will also disable trackbacks and pingbacks. All comment-" -"related fields will also be hidden from the edit/quick-edit screens of the " -"affected posts. These settings cannot be overridden for individual posts." -msgstr "" -"Menonaktifkan komentar juga akan menonaktifkan trackbacks dan pingbacks. " -"Semua bidang-komentar terkait juga akan disembunyikan dari edit / cepat-" -"mengedit layar dari tulisan terpengaruh. Pengaturan ini tidak dapat diganti " -"untuk setiap posting." - -#: disable-comments.php:289 -msgid "Other options" -msgstr "Pilihan lainnya" - -#: disable-comments.php:294 -msgid "Use persistent mode" -msgstr "Gunakan mode Tetap" - -#: disable-comments.php:295 -msgid "" -"%s: This will make persistent changes to your database — " -"comments will remain closed even if you later disable the plugin! " -"You should not use it if you only want to disable comments temporarily. " -"Please read the FAQ before selecting " -"this option." -msgstr "" -"%s: Ini akan membuat perubahan tetap pada basis data — anda, " -"komentar akan dikeluarkan walaupun kemudian akan menonaktifkan plugin! Anda seharusnya tidak menggunakan jika hanya menonaktifkan komentar " -"sementara waktu. Harap baca FAQ sebelum " -"menentukan pilihan." - -#: disable-comments.php:297 -msgid "" -"%s: Entering persistent mode on large multi-site networks requires a large " -"number of database queries and can take a while. Use with caution!" -msgstr "" -"%s: Memasukkan mode tetap pada jaringan multi situs yang lebih besar " -"membutuhkan sejumlah besar kueri basis data dan membutuhkan beberapa waktu. " -"Gunakan dengan seksama! " - -#: disable-comments.php:300 -msgid "" -"Persistent mode has been manually disabled. See the FAQ for more information." -msgstr "" -"Mode Tetap telah diaktifkan secara manual, Lihat FAQ untuk informasi lebih lanjut." - -#: disable-comments.php:305 -msgid "Save Changes" -msgstr "Simpan Perubahan" - -#: disable-comments.php:325 -msgid "" -"%s: Selecting this option will make persistent changes to your database. Are " -"you sure you want to enable it?" -msgstr "" -"%s: Memilih opsi ini akan membuat perubahan yang tetap pada basis data anda. " -"Apakah anda yakin mengaktifkannnya?" diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-pl_PL.mo b/wp/wp-content/plugins/disable-comments/languages/disable-comments-pl_PL.mo deleted file mode 100644 index 8ca4126b40d9069000eafb56bf62817262a06a5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6702 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 SWH&(D5&fr0=*na^UtQkB2 diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-pl_PL.po b/wp/wp-content/plugins/disable-comments/languages/disable-comments-pl_PL.po deleted file mode 100644 index d53b5498..00000000 --- a/wp/wp-content/plugins/disable-comments/languages/disable-comments-pl_PL.po +++ /dev/null @@ -1,203 +0,0 @@ -# Copyright (C) 2015 Disable Comments -# This file is distributed under the same license as the Disable Comments package. -msgid "" -msgstr "" -"Project-Id-Version: Disable Comments 1.2\n" -"Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/disable-comments\n" -"POT-Creation-Date: 2015-02-03 08:04:31+00:00\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2015-04-30 22:12+0100\n" -"Last-Translator: Maciej Gryniuk \n" -"Language-Team: Maciej Gryniuk \n" -"X-Generator: Poedit 1.8beta1\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || " -"n%100>=20) ? 1 : 2);\n" -"Language: pl_PL\n" -"X-Poedit-SourceCharset: UTF-8\n" - -#: disable-comments.php:38 -msgid "Disable Comments requires WordPress version %s or greater." -msgstr "Wyłączenie Komentarzy wymaga WordPress'a w wersji %s lub nowszej." - -#: disable-comments.php:210 -msgid "" -"Note: The Disable Comments plugin is currently active, and comments " -"are completely disabled on: %s. Many of the settings below will not be " -"applicable for those post types." -msgstr "" -"Informacja: Wtyczka Wyłączenie Komentarzy jest aktywna, a komentarze " -"są całkowicie wyłączone na: %s. Większość poniższych ustawień nie będzie miała " -"wpływu na te rodzaje wpisów." - -#: disable-comments.php:210 -msgid ", " -msgstr ", " - -#: disable-comments.php:230 -msgid "" -"The Disable Comments plugin is active, but isn't configured to do " -"anything yet. Visit the configuration page to choose which " -"post types to disable comments on." -msgstr "" -"Wtyczka Wyłączenie Komentarzy jest aktywna, ale nie została jeszcze " -"skonfigurowana. Odwiedź stronę konfiguracji i wybierz " -"rodzaje wpisów do wyłączenia na nich komentarzy." - -#: disable-comments.php:237 -msgid "Comments are closed." -msgstr "Komentarze są wyłączone." - -#: disable-comments.php:290 -msgid "Settings" -msgstr "Ustawienia" - -#. Plugin Name of the plugin/theme -#: disable-comments.php:298 disable-comments.php:350 -msgid "Disable Comments" -msgstr "Wyłączenie komentarzy" - -#: disable-comments.php:343 -msgid "" -"If a caching/performance plugin is active, please invalidate its cache to " -"ensure that changes are reflected immediately." -msgstr "" -"Jeżeli jest aktywna wtyczka pamięci podręcznej/wydajnościowa, proszę unieważnić " -"jej podręczną, aby zmiany weszły w życie natychmiatowo." - -#: disable-comments.php:344 -msgid "" -"Options updated. Changes to the Admin Menu and Admin Bar will not appear until " -"you leave or reload this page." -msgstr "" -"Opcje zaktualizowane. Zmiany w menu panelu administracyjnego i na pasku " -"administracyjnym będą widoczne po opuszczeniu lub przeładowaniu tej strony." - -#: disable-comments.php:353 -msgid "" -"Disable Comments is Network Activated. The settings below will affect " -"all sites in this network." -msgstr "" -"Wyłączenie Komentarzy jest aktywne w sieci. Poniższe ustawienia " -"zostaną zastosowane na wszystkich stronach w tej sieci." - -#: disable-comments.php:355 -msgid "" -"It seems that a caching/performance plugin is active on this site. Please " -"manually invalidate that plugin's cache after making any changes to the " -"settings below." -msgstr "" -"Wygląda na to, że na stronie jest aktywna wtyczka pamięci podręcznej/" -"wydajnościowa. Proszę ręcznie unieważnić jej podręczną po dokonaniu " -"jakichkolwiek zmian poniżej." - -#: disable-comments.php:359 -msgid "Everywhere" -msgstr "Wszędzie" - -#: disable-comments.php:359 -msgid "Disable all comment-related controls and settings in WordPress." -msgstr "" -"Wyłącz wszystkie opcje i ustawienia powiązane z komentarzami w WordPress'ie." - -#: disable-comments.php:360 -msgid "" -"%s: This option is global and will affect your entire site. Use it only if you " -"want to disable comments everywhere. A complete description of what " -"this option does is available here." -msgstr "" -"%s: Ta opcja jest globalna i zostanie zastosowana na całej stronie. Użyj jej, " -"tylko gdy chcesz wyłączyć komentarze wszędzie. Pełny opis działania " -"tej opcji jest dostępny tutaj." - -#: disable-comments.php:360 disable-comments.php:380 disable-comments.php:382 -#: disable-comments.php:409 -msgid "Warning" -msgstr "Ostrzeżenie" - -#: disable-comments.php:362 -msgid "On certain post types" -msgstr "Na wybranych rodzajach wpisów" - -#: disable-comments.php:368 -msgid "" -"Only the built-in post types appear above. If you want to disable comments on " -"other custom post types on the entire network, you can supply a comma-separated " -"list of post types below (use the slug that identifies the post type)." -msgstr "" -"Powyżej są wyświetlone tylko wbudowane rodzaje wpisów. Jeżeli chcesz wyłączyć " -"komentarze na własnym rodzaju wpisów w całej sieci, możesz poniżej podać ich " -"nazwy (slug identyfikujący), oddzielone przecinkami." - -#: disable-comments.php:371 -msgid "" -"Disabling comments will also disable trackbacks and pingbacks. All comment-" -"related fields will also be hidden from the edit/quick-edit screens of the " -"affected posts. These settings cannot be overridden for individual posts." -msgstr "" -"Wyłączenie komentarzy wyłączy również pingbacki i trackbacki. Wszystkie pola " -"powiązane z komentarzami zostaną ukryte z ekranów edycji i szybkiej edycji " -"odpowiednich wpisów. Te ustawienia nie mogą zostać nadpisane dla pojedynczych " -"wpisów." - -#: disable-comments.php:374 -msgid "Other options" -msgstr "Pozostałe opcje" - -#: disable-comments.php:379 -msgid "Use persistent mode" -msgstr "Użyj trybu trwałego" - -#: disable-comments.php:380 -msgid "" -"%s: This will make persistent changes to your database — comments " -"will remain closed even if you later disable the plugin! You should " -"not use it if you only want to disable comments temporarily. Please read the FAQ before selecting this option." -msgstr "" -"%s: Ta opcja dokona trwałych zmian w w Twojej bazie danych — " -"komentarze pozostaną wyłączone, nawet gdy wyłączysz wtyczkę! Nie " -"powinno być wybierane do tymczasowego wyłączania komentarzy. Proszę przeczytać FAQ przed wyborem tej opcji." - -#: disable-comments.php:382 -msgid "" -"%s: Entering persistent mode on large multi-site networks requires a large " -"number of database queries and can take a while. Use with caution!" -msgstr "" -"%s: Wejście z tryb trwały na dużych sieciach multi-witryn wymaga dużej ilości " -"zapytań do bazy danych, a więc może to trochę potrwać. Używać z ostrożnością!" - -#: disable-comments.php:388 -msgid "Save Changes" -msgstr "Zapisz zmiany" - -#: disable-comments.php:409 -msgid "" -"%s: Selecting this option will make persistent changes to your database. Are " -"you sure you want to enable it?" -msgstr "" -"%s: Ta opcja dokona stałych zmian w Twojej bazie danych. Na pewno chcesz ją " -"aktywować?" - -#. Plugin URI of the plugin/theme -msgid "http://wordpress.org/extend/plugins/disable-comments/" -msgstr "http://wordpress.org/extend/plugins/disable-comments/" - -#. Description of the plugin/theme -msgid "" -"Allows administrators to globally disable comments on their site. Comments can " -"be disabled according to post type." -msgstr "" -"Umożliwia administratorom możliwość globalnego wyłączenia komentarzy na stronie " -"internetowej. Komentarze mogą zostać wyłączone odpowiednio dla różnych rodzajów " -"wpisów." - -#. Author of the plugin/theme -msgid "Samir Shah" -msgstr "Samir Shah" - -#. Author URI of the plugin/theme -msgid "http://rayofsolaris.net/" -msgstr "http://rayofsolaris.net/" diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-pt_BR.mo b/wp/wp-content/plugins/disable-comments/languages/disable-comments-pt_BR.mo deleted file mode 100644 index 2803f7e421b63ca8d02634a74feebda8be10ddc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6692 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 bO(rblmCRrGW4V7+Tg(c6I%fU9=CA(&7M}n@ diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-pt_BR.po b/wp/wp-content/plugins/disable-comments/languages/disable-comments-pt_BR.po deleted file mode 100644 index 132d8259..00000000 --- a/wp/wp-content/plugins/disable-comments/languages/disable-comments-pt_BR.po +++ /dev/null @@ -1,208 +0,0 @@ -# Copyright (C) 2015 Disable Comments -# This file is distributed under the same license as the Disable Comments package. -msgid "" -msgstr "" -"Project-Id-Version: Disable Comments 1.2\n" -"Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/disable-comments\n" -"POT-Creation-Date: 2015-02-03 08:04:31+00:00\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2015-05-22 18:39+0100\n" -"Last-Translator: freemp\n" -"Language-Team: \n" -"X-Generator: Poedit 1.5.7\n" - -#: disable-comments.php:38 -msgid "Disable Comments requires WordPress version %s or greater." -msgstr "Disable Comments necessita do WordPress versão %s ou superior." - -#: disable-comments.php:210 -msgid "" -"Note: The Disable Comments plugin is currently active, and comments " -"are completely disabled on: %s. Many of the settings below will not be " -"applicable for those post types." -msgstr "" -"Nota: No momento, o plugin Disable Comments está ativado e os " -"comentários estão completamente desativados no: %s. Algumas das opções de " -"configuração abaixo não serão aplicáveis para estes tipos de notícias." - -#: disable-comments.php:210 -msgid ", " -msgstr "," - -#: disable-comments.php:230 -msgid "" -"The Disable Comments plugin is active, but isn't configured to do " -"anything yet. Visit the configuration page to choose " -"which post types to disable comments on." -msgstr "" -"O plugin Disable Comments está ativado, mais até o momento nenhuma " -"função foi configurada. Visite a pagina de configuração " -"para escolher os tipos de notícias, nas quais os comentários serão " -"desativados." - -#: disable-comments.php:237 -msgid "Comments are closed." -msgstr "Comentários estão fechados." - -#: disable-comments.php:290 -msgid "Settings" -msgstr "Configurações" - -#. #-#-#-#-# disable-comments.pot (Disable Comments 1.2) #-#-#-#-# -#. Plugin Name of the plugin/theme -#: disable-comments.php:298 disable-comments.php:350 -msgid "Disable Comments" -msgstr "Desativar Comentários" - -#: disable-comments.php:343 -msgid "" -"If a caching/performance plugin is active, please invalidate its cache to " -"ensure that changes are reflected immediately." -msgstr "" -"Se um plugin de cacheamento/performance estiver ativado, por favor " -"desconsiderar seu cache para certificar que futuros alterações sejam " -"consideradas." - -#: disable-comments.php:344 -msgid "" -"Options updated. Changes to the Admin Menu and Admin Bar will not appear " -"until you leave or reload this page." -msgstr "" -"Opções atualizadas. Alterações no Menu Admin e na Barra Admin não aparecerão " -"até você deixar ou recarregar esta página." - -#: disable-comments.php:353 -msgid "" -"Disable Comments is Network Activated. The settings below will " -"affect all sites in this network." -msgstr "" -"Disable Comments está Ativada Na Rede. As configurações abaixo " -"afetarão todos os sites nesta rede." - -#: disable-comments.php:355 -msgid "" -"It seems that a caching/performance plugin is active on this site. Please " -"manually invalidate that plugin's cache after making any changes to the " -"settings below." -msgstr "" -"Aparentemente um plugin de cacheamento/performance está ativado neste site. " -"Por favor desconsiderar o cache desse plugin depois de alterar qualquer " -"configuração abaixo." - -#: disable-comments.php:359 -msgid "Everywhere" -msgstr "Em todo lugar" - -#: disable-comments.php:359 -msgid "Disable all comment-related controls and settings in WordPress." -msgstr "" -"Desativar todos os controles e configurações dos comentários relacionados no " -"WordPress." - -#: disable-comments.php:360 -msgid "" -"%s: This option is global and will affect your entire site. Use it only if " -"you want to disable comments everywhere. A complete description of " -"what this option does is available here." -msgstr "" -"%s: Esta opção é global e vai afetar o site inteiro. Utilize-o somente caso " -"você queira desativar os comentários em todo site. Uma descrição " -"completa do que esta opção faz está disponível aqui." - -#: disable-comments.php:360 disable-comments.php:380 disable-comments.php:382 -#: disable-comments.php:409 -msgid "Warning" -msgstr "Aviso" - -#: disable-comments.php:362 -msgid "On certain post types" -msgstr "Para tipos de notícias específicas" - -#: disable-comments.php:368 -msgid "" -"Only the built-in post types appear above. If you want to disable comments " -"on other custom post types on the entire network, you can supply a comma-" -"separated list of post types below (use the slug that identifies the post " -"type)." -msgstr "" -"Apenas os tipos de notícias instaladas aparecem acima. Se você desejar " -"desativar os comentários de outros tipos de notícias em toda rede, você " -"deverá fornecer uma lista abaixo com os tipos de notícias separadas por " -"vírgulas (use o slug que identifique o tipo de notícia)." - -#: disable-comments.php:371 -msgid "" -"Disabling comments will also disable trackbacks and pingbacks. All comment-" -"related fields will also be hidden from the edit/quick-edit screens of the " -"affected posts. These settings cannot be overridden for individual posts." -msgstr "" -"Desabilitando os comentários, você desabilitará também os trackbacks e " -"pingbacks. Todos os campos relacionados com comentários serão ocultados das " -"telas de edição e edição rápida das notícias afetadas. Estes parâmetros não " -"podem ser sobrescritos para notícias individuais." - -#: disable-comments.php:374 -msgid "Other options" -msgstr "Outras opções" - -#: disable-comments.php:379 -msgid "Use persistent mode" -msgstr "Usar modo persistente" - -#: disable-comments.php:380 -msgid "" -"%s: This will make persistent changes to your database — " -"comments will remain closed even if you later disable the plugin! " -"You should not use it if you only want to disable comments temporarily. " -"Please read the FAQ before selecting " -"this option." -msgstr "" -"%s: Este fará alterações permanentes em seu banco de dados — " -"os comentários permanecerão fechados mesmo que você desative este plugin " -"depois! Nao utilize esta opção, caso deseje desabilitar os comentários " -"temporariamente. Por favor, consulta as " -"perguntas frequentes antes de selecionar esta opção." - -#: disable-comments.php:382 -msgid "" -"%s: Entering persistent mode on large multi-site networks requires a large " -"number of database queries and can take a while. Use with caution!" -msgstr "" -"%s: Entrando no modo persistente de uma vasta rede de sites múltiplos exige " -"uma ampla quantidade de consultas no banco de dados e pode levar algum " -"tempo. Use com cuidado!" - -#: disable-comments.php:388 -msgid "Save Changes" -msgstr "Salvar Alterações" - -#: disable-comments.php:409 -msgid "" -"%s: Selecting this option will make persistent changes to your database. Are " -"you sure you want to enable it?" -msgstr "" -"%s: Ao selecionar esta opção ocorrerão alterações persistentes no seu banco " -"de dados. Você tem certeza que deseja ativar esta opção?" - -#. Plugin URI of the plugin/theme -msgid "http://wordpress.org/extend/plugins/disable-comments/" -msgstr "http://wordpress.org/extend/plugins/disable-comments/" - -#. Description of the plugin/theme -msgid "" -"Allows administrators to globally disable comments on their site. Comments " -"can be disabled according to post type." -msgstr "" -"Permite administradores desativar comentários nos seus sites. Comentários " -"poderão ser desativados de acordo com o tipo de notícia." - -#. Author of the plugin/theme -msgid "Samir Shah" -msgstr "Samir Shah" - -#. Author URI of the plugin/theme -msgid "http://rayofsolaris.net/" -msgstr "http://rayofsolaris.net/" diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-ru_RU.mo b/wp/wp-content/plugins/disable-comments/languages/disable-comments-ru_RU.mo deleted file mode 100644 index d5667dc4a8ff418799c850b29236fa42bc17090e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7148 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\n" -"Language-Team: Elvis WT \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 1.6.3\n" - -#: disable-comments.php:38 -msgid "Disable Comments requires WordPress version %s or greater." -msgstr "Для работы плагина требуется WordPress версии %s или выше." - -#: disable-comments.php:169 -msgid "" -"Note: The Disable Comments plugin is currently active, and comments " -"are completely disabled on: %s. Many of the settings below will not be " -"applicable for those post types." -msgstr "" -"Заметка: Плагин успешно активирован и комментарии на блоге полностью " -"отключены: %s. Настройки ниже неприменимы к указанным ранее типам записей." - -#: disable-comments.php:169 -msgid ", " -msgstr "," - -#: disable-comments.php:183 -msgid "" -"The Disable Comments plugin is active, but isn't configured to do " -"anything yet. Visit the configuration page to choose " -"which post types to disable comments on." -msgstr "" -"Плагин активирован, но еще не настроен. Чтобы сделать это, перейдите на страницу настроек. Там можно задать типы записей, для " -"которых будут отключены комментарии." - -#: disable-comments.php:225 disable-comments.php:269 -msgid "Disable Comments" -msgstr "Откл. комментарии" - -#: disable-comments.php:262 -msgid "" -"If a caching/performance plugin is active, please invalidate its cache to " -"ensure that changes are reflected immediately." -msgstr "" -"Если плагин для кэширования или ускорения блога включен, не забудьте " -"очистить кэш сразу после изменения настроек, чтобы они вступили в силу." - -#: disable-comments.php:263 -msgid "" -"Options updated. Changes to the Admin Menu and Admin Bar will not appear " -"until you leave or reload this page." -msgstr "" -"Настройки обновлены. Изменения панели и меню администратора вступят в силу " -"только после обновления страницы." - -#: disable-comments.php:272 -msgid "" -"Disable Comments is Network Activated. The settings below will " -"affect all sites in this network." -msgstr "" -"Плагин работает в режиме сети. Измененные ниже настройки повлияют на " -"все блоги данной сети." - -#: disable-comments.php:274 -msgid "" -"It seems that a caching/performance plugin is active on this site. Please " -"manually invalidate that plugin's cache after making any changes to the " -"settings below." -msgstr "" -"Похоже, Вы используете плагин для кэширования или ускорения блога. Не " -"забудьте после изменения любых настроек очистить кэш вручную!" - -#: disable-comments.php:278 -msgid "Everywhere" -msgstr "Везде" - -#: disable-comments.php:278 -msgid "Disable all comment-related controls and settings in WordPress." -msgstr "" -"Отключить все параметры и настройки WordPress, связанные с управлением " -"комментариями." - -#: disable-comments.php:279 -msgid "" -"%s: This option is global and will affect your entire site. Use it only if " -"you want to disable comments everywhere. A complete description of " -"what this option does is available here." -msgstr "" -"%s: Эта опция имеет глобальное значение и будет применена даже к Вашему " -"сайту. Используйте только если хотите отключить комментарии везде. " -"Полное описание опции можно найти здесь." - -#: disable-comments.php:279 disable-comments.php:295 disable-comments.php:297 -#: disable-comments.php:325 -msgid "Warning" -msgstr "Внимание" - -#: disable-comments.php:281 -msgid "On certain post types" -msgstr "Для типов записей" - -#: disable-comments.php:286 -msgid "" -"Disabling comments will also disable trackbacks and pingbacks. All comment-" -"related fields will also be hidden from the edit/quick-edit screens of the " -"affected posts. These settings cannot be overridden for individual posts." -msgstr "" -"При использовании плагина будут также отключены трекбэки и пингбэки. Все " -"относящиеся к комментированию поля будут скрыты (для выбранных типов " -"записей). Эти настройки вступают в силу для ВСЕХ записей указанного типа, " -"без исключений." - -#: disable-comments.php:289 -msgid "Other options" -msgstr "Другие настройки" - -#: disable-comments.php:294 -msgid "Use persistent mode" -msgstr "Использовать \"живое\" сохранение" - -#: disable-comments.php:295 -msgid "" -"%s: This will make persistent changes to your database — " -"comments will remain closed even if you later disable the plugin! " -"You should not use it if you only want to disable comments temporarily. " -"Please read the FAQ before selecting " -"this option." -msgstr "" -"%s: Включение опции позволит записывать изменения в \"живом\" режиме " -"в базу данных — а комментарии будут отключены даже после деактивации " -"плагина! Не стоит использовать опцию, если не хотите надолго " -"отключить все комментарии. Прежде всего, прочитайте внимательно FAQ." - -#: disable-comments.php:297 -msgid "" -"%s: Entering persistent mode on large multi-site networks requires a large " -"number of database queries and can take a while. Use with caution!" -msgstr "" -"%s: Включение \"живого\" режима на больших мультиблоговых сайтах сильно " -"нагружает базу данных запросами. Использовать осторожно!" - -#: disable-comments.php:300 -msgid "" -"Persistent mode has been manually disabled. See the FAQ for more information." -msgstr "" -"Режим \"живого\" сохранения был отключен вручную. Подробнее читайте FAQ." - -#: disable-comments.php:305 -msgid "Save Changes" -msgstr "Сохранить изменения" - -#: disable-comments.php:325 -msgid "" -"%s: Selecting this option will make persistent changes to your database. Are " -"you sure you want to enable it?" -msgstr "" -"%s: При включении этой опции все изменения будут заноситься в базу данных. " -"Вы уверены, что хотите включить опцию?" - -#~ msgid "" -#~ "Allows administrators to globally disable comments on their site. " -#~ "Comments can be disabled according to post type." -#~ msgstr "" -#~ "Позволяет администраторам сайтов вручную отключать комментарии на своих " -#~ "блогах. Комментарии отключаются для указанных типов записей." diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-vi.mo b/wp/wp-content/plugins/disable-comments/languages/disable-comments-vi.mo deleted file mode 100644 index 831602d88e03d28d5e4c9c07172e4b972f5925d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6241 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\n" -"Language-Team: Vietnamese WPress-based blog | http://rongsay.info " -"\n" -"X-Generator: Poedit 1.5.7\n" - -#: disable-comments.php:38 -msgid "Disable Comments requires WordPress version %s or greater." -msgstr "Vô hiệu hóa ý kiến yêu cầu phiên bản WordPress %s hoặc cao hơn." - -#: disable-comments.php:169 -msgid "" -"Note: The Disable Comments plugin is currently active, and comments " -"are completely disabled on: %s. Many of the settings below will not be " -"applicable for those post types." -msgstr "" -"Lưu ý: Vô hiệu hóa ý kiến hiện đang hoạt động, và ý kiến bị vô hiệu " -"hoá hoàn toàn ở các: %s. Nhiều trong số các cài đặt dưới đây sẽ không được " -"áp dụng cho những loại post type đó." - -#: disable-comments.php:169 -msgid ", " -msgstr ", " - -#: disable-comments.php:183 -msgid "" -"The Disable Comments plugin is active, but isn't configured to do " -"anything yet. Visit the configuration page to choose " -"which post types to disable comments on." -msgstr "" -" vô hiệu hóa ý kiến hoạt động, nhưng không cấu hình để làm bất cứ " -"điều gì được nêu ra. Truy cập vào các Trang cấu hình " -"chọn các post type cần vô hiệu hóa ý kiến." - -#: disable-comments.php:225 disable-comments.php:269 -msgid "Disable Comments" -msgstr "Vô hiệu hóa ý kiến" - -#: disable-comments.php:262 -msgid "" -"If a caching/performance plugin is active, please invalidate its cache to " -"ensure that changes are reflected immediately." -msgstr "" -"Nếu một plugin bộ nhớ đệm (cache) hoạt động, xin vui lòng tắt bộ nhớ cache " -"của nó để đảm bảo rằng những thay đổi được thi hành ngay lập tức." - -#: disable-comments.php:263 -msgid "" -"Options updated. Changes to the Admin Menu and Admin Bar will not appear " -"until you leave or reload this page." -msgstr "" -"Tùy chọn Cập Nhật. Thay đổi trình đơn Admin và Admin Bar sẽ không xuất hiện " -"cho đến khi bạn nạp lại trang này." - -#: disable-comments.php:272 -msgid "" -"Disable Comments is Network Activated. The settings below will " -"affect all sites in this network." -msgstr "" -" vô hiệu hóa ý kiến kích hoạt trong toàn Network. Thiết đặt dưới " -"đây sẽ ảnh hưởng đến Tất cả trang web trong mạng này." - -#: disable-comments.php:274 -msgid "" -"It seems that a caching/performance plugin is active on this site. Please " -"manually invalidate that plugin's cache after making any changes to the " -"settings below." -msgstr "" -"Có vẻ như một plugin bộ nhớ đệm/hiệu suất đang hoạt động trên trang web này. " -"Tắt bộ nhớ cache plugin đó sau khi thực hiện bất kỳ thay đổi các thiết đặt " -"dưới đây." - -#: disable-comments.php:278 -msgid "Everywhere" -msgstr "Ở mọi nơi" - -#: disable-comments.php:278 -msgid "Disable all comment-related controls and settings in WordPress." -msgstr "" -"Vô hiệu hoá tất cả các liên quan đến bình luận điều khiển và thiết lập trong " -"WordPress." - -#: disable-comments.php:279 -msgid "" -"%s: This option is global and will affect your entire site. Use it only if " -"you want to disable comments everywhere. A complete description of " -"what this option does is available here." -msgstr "" -"%s: Tùy chọn này là toàn cầu và sẽ ảnh hưởng đến toàn bộ trang web của bạn. " -"Sử dụng nó chỉ nếu bạn muốn vô hiệu hóa ý kiến ở khắp mọi nơi . " -"Một mô tả đầy đủ về những gì tùy chọn này hiện có sẵn ở đây ." - -#: disable-comments.php:279 disable-comments.php:295 disable-comments.php:297 -#: disable-comments.php:325 -msgid "Warning" -msgstr "Cảnh báo" - -#: disable-comments.php:281 -msgid "On certain post types" -msgstr "Trên một số loại post type" - -#: disable-comments.php:286 -msgid "" -"Disabling comments will also disable trackbacks and pingbacks. All comment-" -"related fields will also be hidden from the edit/quick-edit screens of the " -"affected posts. These settings cannot be overridden for individual posts." -msgstr "" -"Vô hiệu hóa ý kiến cũng vô hiệu hóa trackbacks và pingbacks. Tất cả các lĩnh " -"vực liên quan đến bình luận cũng sẽ được ẩn từ màn hình chỉnh sửa/nhanh " -"chóng-chỉnh sửa các bài viết bị ảnh hưởng. Các thiết đặt này không thể được " -"ghi đè cho bài đăng riêng lẻ." - -#: disable-comments.php:289 -msgid "Other options" -msgstr "Lựa chọn khác" - -#: disable-comments.php:294 -msgid "Use persistent mode" -msgstr "Sử dụng chế độ liên tục" - -#: disable-comments.php:295 -msgid "" -"%s: This will make persistent changes to your database — " -"comments will remain closed even if you later disable the plugin! " -"You should not use it if you only want to disable comments temporarily. " -"Please read the FAQ before selecting " -"this option." -msgstr "" -"%s: Điều này sẽ làm thay đổi liên tục cơ sở dữ liệu của bạn & mdash; ý kiến " -"sẽ vẫn đóng ngay cả khi bạn vô hiệu hóa plugin! Bạn không nên sử dụng nếu " -"bạn chỉ muốn vô hiệu hóa ý kiến tạm thời. Xin vui lòng đọc FAQ trước khi chọn tùy chọn này." - -#: disable-comments.php:297 -msgid "" -"%s: Entering persistent mode on large multi-site networks requires a large " -"number of database queries and can take a while. Use with caution!" -msgstr "" -"%s: Nhập chế độ liên tục trên nhiều trang web lớn đòi hỏi một số lượng truy " -"vấn cơ sở dữ liệu lớn và có thể mất một lúc. Sử dụng thận trọng!" - -#: disable-comments.php:300 -msgid "" -"Persistent mode has been manually disabled. See the FAQ for more information." -msgstr "" -"Chế độ liên tục đã bị vô hiệu theo cách thủ công. Xem các FAQ cho biết thêm thông tin." - -#: disable-comments.php:305 -msgid "Save Changes" -msgstr "Lưu thay đổi" - -#: disable-comments.php:325 -msgid "" -"%s: Selecting this option will make persistent changes to your database. Are " -"you sure you want to enable it?" -msgstr "" -"%s: Chọn tùy chọn này sẽ thực hiện liên tục thay đổi cơ sở dữ liệu của bạn. " -"Bạn có chắc bạn muốn bật nó?" diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-vi_VI.mo b/wp/wp-content/plugins/disable-comments/languages/disable-comments-vi_VI.mo deleted file mode 100644 index 831602d88e03d28d5e4c9c07172e4b972f5925d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6241 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\n" -"Language-Team: Vietnamese WPress-based blog | http://rongsay.info " -"\n" -"X-Generator: Poedit 1.5.7\n" - -#: disable-comments.php:38 -msgid "Disable Comments requires WordPress version %s or greater." -msgstr "Vô hiệu hóa ý kiến yêu cầu phiên bản WordPress %s hoặc cao hơn." - -#: disable-comments.php:169 -msgid "" -"Note: The Disable Comments plugin is currently active, and comments " -"are completely disabled on: %s. Many of the settings below will not be " -"applicable for those post types." -msgstr "" -"Lưu ý: Vô hiệu hóa ý kiến hiện đang hoạt động, và ý kiến bị vô hiệu " -"hoá hoàn toàn ở các: %s. Nhiều trong số các cài đặt dưới đây sẽ không được " -"áp dụng cho những loại post type đó." - -#: disable-comments.php:169 -msgid ", " -msgstr ", " - -#: disable-comments.php:183 -msgid "" -"The Disable Comments plugin is active, but isn't configured to do " -"anything yet. Visit the configuration page to choose " -"which post types to disable comments on." -msgstr "" -" vô hiệu hóa ý kiến hoạt động, nhưng không cấu hình để làm bất cứ " -"điều gì được nêu ra. Truy cập vào các Trang cấu hình " -"chọn các post type cần vô hiệu hóa ý kiến." - -#: disable-comments.php:225 disable-comments.php:269 -msgid "Disable Comments" -msgstr "Vô hiệu hóa ý kiến" - -#: disable-comments.php:262 -msgid "" -"If a caching/performance plugin is active, please invalidate its cache to " -"ensure that changes are reflected immediately." -msgstr "" -"Nếu một plugin bộ nhớ đệm (cache) hoạt động, xin vui lòng tắt bộ nhớ cache " -"của nó để đảm bảo rằng những thay đổi được thi hành ngay lập tức." - -#: disable-comments.php:263 -msgid "" -"Options updated. Changes to the Admin Menu and Admin Bar will not appear " -"until you leave or reload this page." -msgstr "" -"Tùy chọn Cập Nhật. Thay đổi trình đơn Admin và Admin Bar sẽ không xuất hiện " -"cho đến khi bạn nạp lại trang này." - -#: disable-comments.php:272 -msgid "" -"Disable Comments is Network Activated. The settings below will " -"affect all sites in this network." -msgstr "" -" vô hiệu hóa ý kiến kích hoạt trong toàn Network. Thiết đặt dưới " -"đây sẽ ảnh hưởng đến Tất cả trang web trong mạng này." - -#: disable-comments.php:274 -msgid "" -"It seems that a caching/performance plugin is active on this site. Please " -"manually invalidate that plugin's cache after making any changes to the " -"settings below." -msgstr "" -"Có vẻ như một plugin bộ nhớ đệm/hiệu suất đang hoạt động trên trang web này. " -"Tắt bộ nhớ cache plugin đó sau khi thực hiện bất kỳ thay đổi các thiết đặt " -"dưới đây." - -#: disable-comments.php:278 -msgid "Everywhere" -msgstr "Ở mọi nơi" - -#: disable-comments.php:278 -msgid "Disable all comment-related controls and settings in WordPress." -msgstr "" -"Vô hiệu hoá tất cả các liên quan đến bình luận điều khiển và thiết lập trong " -"WordPress." - -#: disable-comments.php:279 -msgid "" -"%s: This option is global and will affect your entire site. Use it only if " -"you want to disable comments everywhere. A complete description of " -"what this option does is available here." -msgstr "" -"%s: Tùy chọn này là toàn cầu và sẽ ảnh hưởng đến toàn bộ trang web của bạn. " -"Sử dụng nó chỉ nếu bạn muốn vô hiệu hóa ý kiến ở khắp mọi nơi . " -"Một mô tả đầy đủ về những gì tùy chọn này hiện có sẵn ở đây ." - -#: disable-comments.php:279 disable-comments.php:295 disable-comments.php:297 -#: disable-comments.php:325 -msgid "Warning" -msgstr "Cảnh báo" - -#: disable-comments.php:281 -msgid "On certain post types" -msgstr "Trên một số loại post type" - -#: disable-comments.php:286 -msgid "" -"Disabling comments will also disable trackbacks and pingbacks. All comment-" -"related fields will also be hidden from the edit/quick-edit screens of the " -"affected posts. These settings cannot be overridden for individual posts." -msgstr "" -"Vô hiệu hóa ý kiến cũng vô hiệu hóa trackbacks và pingbacks. Tất cả các lĩnh " -"vực liên quan đến bình luận cũng sẽ được ẩn từ màn hình chỉnh sửa/nhanh " -"chóng-chỉnh sửa các bài viết bị ảnh hưởng. Các thiết đặt này không thể được " -"ghi đè cho bài đăng riêng lẻ." - -#: disable-comments.php:289 -msgid "Other options" -msgstr "Lựa chọn khác" - -#: disable-comments.php:294 -msgid "Use persistent mode" -msgstr "Sử dụng chế độ liên tục" - -#: disable-comments.php:295 -msgid "" -"%s: This will make persistent changes to your database — " -"comments will remain closed even if you later disable the plugin! " -"You should not use it if you only want to disable comments temporarily. " -"Please read the FAQ before selecting " -"this option." -msgstr "" -"%s: Điều này sẽ làm thay đổi liên tục cơ sở dữ liệu của bạn & mdash; ý kiến " -"sẽ vẫn đóng ngay cả khi bạn vô hiệu hóa plugin! Bạn không nên sử dụng nếu " -"bạn chỉ muốn vô hiệu hóa ý kiến tạm thời. Xin vui lòng đọc FAQ trước khi chọn tùy chọn này." - -#: disable-comments.php:297 -msgid "" -"%s: Entering persistent mode on large multi-site networks requires a large " -"number of database queries and can take a while. Use with caution!" -msgstr "" -"%s: Nhập chế độ liên tục trên nhiều trang web lớn đòi hỏi một số lượng truy " -"vấn cơ sở dữ liệu lớn và có thể mất một lúc. Sử dụng thận trọng!" - -#: disable-comments.php:300 -msgid "" -"Persistent mode has been manually disabled. See the FAQ for more information." -msgstr "" -"Chế độ liên tục đã bị vô hiệu theo cách thủ công. Xem các FAQ cho biết thêm thông tin." - -#: disable-comments.php:305 -msgid "Save Changes" -msgstr "Lưu thay đổi" - -#: disable-comments.php:325 -msgid "" -"%s: Selecting this option will make persistent changes to your database. Are " -"you sure you want to enable it?" -msgstr "" -"%s: Chọn tùy chọn này sẽ thực hiện liên tục thay đổi cơ sở dữ liệu của bạn. " -"Bạn có chắc bạn muốn bật nó?" diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments-zh_TW.mo b/wp/wp-content/plugins/disable-comments/languages/disable-comments-zh_TW.mo deleted file mode 100644 index f3c94e88277c534ad49433ab6ea04096d9bd23e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5950 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\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"Language: zh_TW\n" - -#: disable-comments.php:38 -msgid "Disable Comments requires WordPress version %s or greater." -msgstr "Disable Comments 只能在 WordPress %s 版或更新版本使用。" - -#: disable-comments.php:210 -msgid "" -"Note: The Disable Comments plugin is currently active, and comments " -"are completely disabled on: %s. Many of the settings below will not be " -"applicable for those post types." -msgstr "" -"注意:Disable Comments 外掛目前啟用,迴響會在 %s 完全停用。下方的諸" -"多設定將不適用於那些文章類型。" - -#: disable-comments.php:210 -msgid ", " -msgstr ", " - -#: disable-comments.php:230 -msgid "" -"The Disable Comments plugin is active, but isn't configured to do " -"anything yet. Visit the configuration page to choose " -"which post types to disable comments on." -msgstr "" -"Disable Comments 外掛目前啟用,但還沒做任何的設定。前往設定頁面來選擇要在那些文章類型停用迴響。" - -#: disable-comments.php:237 -msgid "Comments are closed." -msgstr "迴響目前關閉。" - -#: disable-comments.php:290 -msgid "Settings" -msgstr "設定" - -#. Plugin Name of the plugin/theme -#: disable-comments.php:298 disable-comments.php:350 -msgid "Disable Comments" -msgstr "Disable Comments" - -#: disable-comments.php:343 -msgid "" -"If a caching/performance plugin is active, please invalidate its cache to " -"ensure that changes are reflected immediately." -msgstr "如果外取或效能外掛啟用,請讓快取失效,以確保變更會立即反映。" - -#: disable-comments.php:344 -msgid "" -"Options updated. Changes to the Admin Menu and Admin Bar will not appear " -"until you leave or reload this page." -msgstr "" -"選項已更新。管理員選單和管理員工具列的變更不會出現,直到你離開或重新整理此頁" -"面。" - -#: disable-comments.php:353 -msgid "" -"Disable Comments is Network Activated. The settings below will " -"affect all sites in this network." -msgstr "" -"Disable Comments 已在網誌網路啟用。以下的設定將會影響此網誌網路內的" -"所有網站。" - -#: disable-comments.php:355 -msgid "" -"It seems that a caching/performance plugin is active on this site. Please " -"manually invalidate that plugin's cache after making any changes to the " -"settings below." -msgstr "" -"看來有快取或效能外掛正在此網站上啟用。在變更以下的任何設定後,請手動清除外掛" -"快取。" - -#: disable-comments.php:359 -msgid "Everywhere" -msgstr "全部" - -#: disable-comments.php:359 -msgid "Disable all comment-related controls and settings in WordPress." -msgstr "在 WordPress 裡停用所有迴響相關控制及設定。" - -#: disable-comments.php:360 -msgid "" -"%s: This option is global and will affect your entire site. Use it only if " -"you want to disable comments everywhere. A complete description of " -"what this option does is available here." -msgstr "" -"%s: 這個選像是全域的,會影響你的整個網站。只有當你想完整停用迴響功能" -"時才使用它。一個關於此功能的完整介紹可以在這" -"裡找到。" - -#: disable-comments.php:360 disable-comments.php:380 disable-comments.php:382 -#: disable-comments.php:409 -msgid "Warning" -msgstr "警告" - -#: disable-comments.php:362 -msgid "On certain post types" -msgstr "在某些文章類型" - -#: disable-comments.php:368 -msgid "" -"Only the built-in post types appear above. If you want to disable comments " -"on other custom post types on the entire network, you can supply a comma-" -"separated list of post types below (use the slug that identifies the post " -"type)." -msgstr "" -"只有內建的文章類型會顯示於上方。如果你想在其他自訂文章類型停用迴響,你可以在" -"下方提供類型列表,並以逗號分隔(使用文章類型的名稱)。" - -#: disable-comments.php:371 -msgid "" -"Disabling comments will also disable trackbacks and pingbacks. All comment-" -"related fields will also be hidden from the edit/quick-edit screens of the " -"affected posts. These settings cannot be overridden for individual posts." -msgstr "" -"停用迴響也將停用通告和引用通知。所有迴響相關欄位也將從編輯/快速編輯畫面隱" -"藏。這些設定無法被個別文章設定覆寫。" - -#: disable-comments.php:374 -msgid "Other options" -msgstr "其他選項" - -#: disable-comments.php:379 -msgid "Use persistent mode" -msgstr "使用永久模式" - -#: disable-comments.php:380 -msgid "" -"%s: This will make persistent changes to your database — " -"comments will remain closed even if you later disable the plugin! " -"You should not use it if you only want to disable comments temporarily. " -"Please read the FAQ before selecting " -"this option." -msgstr "" -"%s: 這會永久變更你的資料庫 — 迴響並保持關閉,即便你之後停用外" -"掛! 如果你只想暫時停用迴響,你不應該使用這個功能。在選擇此選項前," -"請先閱讀問與答。" - -#: disable-comments.php:382 -msgid "" -"%s: Entering persistent mode on large multi-site networks requires a large " -"number of database queries and can take a while. Use with caution!" -msgstr "" -"%s: 在大型網站上進入永久模式會需要大量的資料庫查詢,且可能需要一段時間。請謹" -"慎使用!" - -#: disable-comments.php:388 -msgid "Save Changes" -msgstr "儲存變更" - -#: disable-comments.php:409 -msgid "" -"%s: Selecting this option will make persistent changes to your database. Are " -"you sure you want to enable it?" -msgstr "%s: 選擇這個選項將會永久變更你的資料庫。你確定要啟用它嗎?" - -#. Plugin URI of the plugin/theme -msgid "http://wordpress.org/extend/plugins/disable-comments/" -msgstr "http://wordpress.org/extend/plugins/disable-comments/" - -#. Description of the plugin/theme -msgid "" -"Allows administrators to globally disable comments on their site. Comments " -"can be disabled according to post type." -msgstr "允許管理員在他們網站停用迴響功能。迴響可以依據特定文章類型停用。" - -#. Author of the plugin/theme -msgid "Samir Shah" -msgstr "Samir Shah" - -#. Author URI of the plugin/theme -msgid "http://rayofsolaris.net/" -msgstr "http://rayofsolaris.net/" diff --git a/wp/wp-content/plugins/disable-comments/languages/disable-comments.pot b/wp/wp-content/plugins/disable-comments/languages/disable-comments.pot deleted file mode 100644 index d83615e8..00000000 --- a/wp/wp-content/plugins/disable-comments/languages/disable-comments.pot +++ /dev/null @@ -1,171 +0,0 @@ -# Copyright (C) 2016 Disable Comments -# This file is distributed under the same license as the Disable Comments package. -msgid "" -msgstr "" -"Project-Id-Version: Disable Comments 1.6\n" -"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/disable-comments\n" -"POT-Creation-Date: 2016-12-02 07:47:59+00:00\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2016-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" - -#: disable-comments.php:59 -msgid "Disable Comments requires WordPress version %s or greater." -msgstr "" - -#: disable-comments.php:240 disable-comments.php:325 -msgid "Comments are closed." -msgstr "" - -#: disable-comments.php:289 -msgid "Note: The Disable Comments plugin is currently active, and comments are completely disabled on: %s. Many of the settings below will not be applicable for those post types." -msgstr "" - -#: disable-comments.php:289 -msgid ", " -msgstr "" - -#: disable-comments.php:317 -msgid "The Disable Comments plugin is active, but isn't configured to do anything yet. Visit the configuration page to choose which post types to disable comments on." -msgstr "" - -#: disable-comments.php:382 -msgid "Settings" -msgstr "" - -#: disable-comments.php:383 -msgid "Tools" -msgstr "" - -#: disable-comments.php:391 includes/settings-page.php:49 -msgid "Disable Comments" -msgstr "" - -#: disable-comments.php:403 includes/tools-page.php:7 -#: includes/tools-page.php:103 -msgid "Delete Comments" -msgstr "" - -#: includes/settings-page.php:43 -msgid "If a caching/performance plugin is active, please invalidate its cache to ensure that changes are reflected immediately." -msgstr "" - -#: includes/settings-page.php:44 -msgid "Options updated. Changes to the Admin Menu and Admin Bar will not appear until you leave or reload this page." -msgstr "" - -#: includes/settings-page.php:52 -msgid "Disable Comments is Network Activated. The settings below will affect all sites in this network." -msgstr "" - -#: includes/settings-page.php:54 -msgid "It seems that a caching/performance plugin is active on this site. Please manually invalidate that plugin's cache after making any changes to the settings below." -msgstr "" - -#: includes/settings-page.php:58 includes/tools-page.php:85 -msgid "Everywhere" -msgstr "" - -#: includes/settings-page.php:58 -msgid "Disable all comment-related controls and settings in WordPress." -msgstr "" - -#: includes/settings-page.php:59 -msgid "%s: This option is global and will affect your entire site. Use it only if you want to disable comments everywhere. A complete description of what this option does is available here." -msgstr "" - -#: includes/settings-page.php:59 includes/settings-page.php:80 -#: includes/settings-page.php:82 includes/settings-page.php:110 -#: includes/tools-page.php:86 includes/tools-page.php:97 -msgid "Warning" -msgstr "" - -#: includes/settings-page.php:61 -msgid "On certain post types" -msgstr "" - -#: includes/settings-page.php:67 includes/tools-page.php:94 -msgid "Only the built-in post types appear above. If you want to disable comments on other custom post types on the entire network, you can supply a comma-separated list of post types below (use the slug that identifies the post type)." -msgstr "" - -#: includes/settings-page.php:68 includes/tools-page.php:95 -msgid "Custom post types:" -msgstr "" - -#: includes/settings-page.php:70 -msgid "Disabling comments will also disable trackbacks and pingbacks. All comment-related fields will also be hidden from the edit/quick-edit screens of the affected posts. These settings cannot be overridden for individual posts." -msgstr "" - -#: includes/settings-page.php:75 -msgid "Other options" -msgstr "" - -#: includes/settings-page.php:79 -msgid "Use persistent mode" -msgstr "" - -#: includes/settings-page.php:80 -msgid "%s: This will make persistent changes to your database — comments will remain closed even if you later disable the plugin! You should not use it if you only want to disable comments temporarily. Please read the FAQ before selecting this option." -msgstr "" - -#: includes/settings-page.php:82 -msgid "%s: Entering persistent mode on large multi-site networks requires a large number of database queries and can take a while. Use with caution!" -msgstr "" - -#: includes/settings-page.php:89 -msgid "Save Changes" -msgstr "" - -#: includes/settings-page.php:110 -msgid "%s: Selecting this option will make persistent changes to your database. Are you sure you want to enable it?" -msgstr "" - -#: includes/tools-page.php:13 includes/tools-page.php:75 -msgid "No comments available for deletion." -msgstr "" - -#: includes/tools-page.php:38 -msgid "All comments have been deleted." -msgstr "" - -#: includes/tools-page.php:40 includes/tools-page.php:43 -msgid "Internal error occured. Please try again later." -msgstr "" - -#: includes/tools-page.php:62 -msgid "All comments have been deleted for %ss." -msgstr "" - -#: includes/tools-page.php:68 -msgid "Comment Deletion Complete" -msgstr "" - -#: includes/tools-page.php:85 -msgid "Delete all comments in WordPress." -msgstr "" - -#: includes/tools-page.php:86 -msgid "%s: This function and will affect your entire site. Use it only if you want to delete comments everywhere." -msgstr "" - -#: includes/tools-page.php:88 -msgid "For certain post types" -msgstr "" - -#: includes/tools-page.php:97 -msgid "%s: Deleting comments will remove existing comment entries in the database and cannot be reverted without a database backup." -msgstr "" - -#: includes/tools-page.php:102 -msgid "Total Comments:" -msgstr "" -#. Plugin Name of the plugin/theme -msgid "Disable Comments" -msgstr "" - -#. Description of the plugin/theme -msgid "Allows administrators to globally disable comments on their site. Comments can be disabled according to post type." -msgstr "" diff --git a/wp/wp-content/plugins/disable-comments/readme.txt b/wp/wp-content/plugins/disable-comments/readme.txt deleted file mode 100644 index 47d24e9b..00000000 --- a/wp/wp-content/plugins/disable-comments/readme.txt +++ /dev/null @@ -1,193 +0,0 @@ -=== Disable Comments === -Contributors: solarissmoke -Donate link: http://www.rayofsolaris.net/donate/ -Tags: comments, disable, global -Requires at least: 4.0 -Tested up to: 4.7 -Stable tag: trunk - -Allows administrators to globally disable comments on their site. Comments can be disabled according to post type. Multisite friendly. Provides tool to delete all comments or according to post type. - -== Description == - -This plugin allows administrators to globally disable comments on any post type (posts, pages, attachments, etc.) so that these settings cannot be overridden for individual posts. It also removes all comment-related fields from edit and quick-edit screens. On multisite installations, it can be used to disable comments on the entire network. - -Additionally, comment-related items can be removed from the Dashboard, Widgets, the Admin Menu and the Admin Bar. - -**Important note**: Use this plugin if you don't want comments at all on your site (or on certain post types). Don't use it if you want to selectively disable comments on individual posts - WordPress lets you do that anyway. If you don't know how to disable comments on individual posts, there are instructions in [the FAQ](https://wordpress.org/plugins/disable-comments/faq/). - -If you come across any bugs or have suggestions, please use the plugin support forum. I can't fix it if I don't know it's broken! Please check the [FAQ](https://wordpress.org/plugins/disable-comments/faq/) for common issues. - -Want to contribute? Here's the [GitHub development repository](https://github.com/solarissmoke/disable-comments). - -A [must-use version](https://github.com/solarissmoke/disable-comments-mu) of the plugin is also available. - -== Frequently Asked Questions == - -= Nothing happens after I disable comments on all posts - comment forms still appear when I view my posts. = - -This is because your theme is not checking the comment status of posts in the correct way. - -You may like to point your theme's author to [this explanation](http://www.rayofsolaris.net/blog/2012/how-to-check-if-comments-are-allowed-in-wordpress/) of what they are doing wrong, and how to fix it. - -= How can I remove the text that says "comments are closed" at the bottom of articles where comments are disabled? = - -The plugin tries its very best to hide this (and any other comment-related) messages. - -If you still see the message, then it means your theme is overriding this behaviour, and you will have to edit its files manually to remove it. Two common approaches are to either delete or comment out the relevant lines in `wp-content/your-theme/comments.php`, or to add a declaration to `wp-content/your-theme/style.css` that hides the message from your visitors. In either case, make you you know what you are doing! - -= I only want to disable comments on certain posts, not globally. What do I do? = - -Don't install this plugin! - -Go to the edit page for the post you want to disable comments on. Scroll down to the "Discussion" box, where you will find the comment options for that post. If you don't see a "Discussion" box, then click on "Screen Options" at the top of your screen, and make sure the "Discussion" checkbox is checked. - -You can also bulk-edit the comment status of multiple posts from the [posts screen](https://codex.wordpress.org/Posts_Screen). - -= I want to delete comments from my database. What do I do? = - -Go to the settings page for the disable comments plugin and utlize the Delete Comments tool to delete all comments or according to the specified post types from your database. - -== Details == - -The plugin provides the option to **completely disable the commenting feature in WordPress**. When this option is selected, the following changes are made: - -* All "Comments" links are hidden from the Admin Menu and Admin Bar; -* All comment-related sections ("Recent Comments", "Discussion" etc.) are hidden from the WordPress Dashboard; -* All comment-related widgets are disabled (so your theme cannot use them); -* The "Discussion" settings page is hidden; -* All comment RSS/Atom feeds are disabled (and requests for these will be redirected to the parent post); -* The X-Pingback HTTP header is removed from all pages; -* Outgoing pingbacks are disabled. - -**Please delete any existing comments on your site before applying this setting, otherwise (depending on your theme) those comments may still be displayed to visitors. You can use the Delete Comments tool to delete any existing comments on your site.** - -== Advanced Configuration == - -Some of the plugin's behaviour can be modified by site administrators and plugin/theme developers through code: - -* Define `DISABLE_COMMENTS_REMOVE_COMMENTS_TEMPLATE` and set it to `false` to prevent the plugin from replacing the theme's comment template with an empty one. - -These definitions can be made either in your main `wp-config.php` or in your theme's `functions.php` file. - -== Changelog == - -= 1.6 = -* Added a tool for deleting comments in bulk. - -= 1.5.2 = -* Fix Javascript errors when the Meta widget is enabled. -* Hide comments link from the Welcome panel. - -= 1.5.1 = -* Hide existing comments if there are any. -* Filter the comments link in the Meta widget if it is enabled. - -= 1.5 = -* Remove the comments feed link from the head in WP 4.4 and higher. - -= 1.4.2 = -* Delay loading of translation text domain until all plugins are loaded. This allows plugins to modify translations. - -= 1.4 = -* Hide the troublesome "persistent mode" option for all sites where it is not in use. This option will be removed in a future release. - -= 1.3.2 = -* Compatibility updates and code refactoring for WordPress 4.3 -* Adding a few new translations - -= 1.3.1 = -* Change the behaviour for comment feed requests. This removes a potential security issue. - -= 1.3 = -* Move persistent mode filter into a define. -* Add an advanced option to show the theme's comment template even when comments are disabled. - -= 1.2 = -* Allow network administrators to disable comments on custom post types across the whole network. - -= 1.1.1 = -* Fix PHP warning when active_sitewide_plugins option doesn't contain expected data type. - -= 1.1 = -* Attempt to hide the comments template ("Comments are closed") whenever comments are disabled. - -= 1.0.4 = -* Fix CSRF vulnerability in the admin. Thanks to dxw for responsible disclosure. - -= 1.0.3 = -* Compatibility fix for WordPress 3.8 - -= 1.0.2 = -* Disable comment-reply script for themes that don't check comment status properly. -* Add French translation - -= 1.0.1 = -* Fix issue with settings persistence in single-site installations. - -= 1.0 = -* Prevent theme comments template from being displayed when comments are disabled everywhere. -* Prevent direct access to comment admin pages when comments are disabled everywhere. - -= 0.9.2 = -* Make persistent mode option filter available all the time. -* Fix redirection for feed requests -* Fix admin bar filtering in WP 3.6 - -= 0.9.1 = -* Short life in the wild. - -= 0.9 = -* Added gettext support and German translation. -* Added links to GitHub development repo. -* Allow network administrators to prevent the use of persistent mode. - -= 0.8 = -* Remove X-Pingback header when comments are completely disabled. -* Disable comment feeds when comment are completely disabled. -* Simplified settings page. - -= 0.7 = -* Now supports Network Activation - disable comments on your entire multi-site network. -* Simplified settings page. - -= 0.6 = -* Add "persistent mode" to deal with themes that don't use filterable comment status checking. - -= 0.5 = -* Allow temporary disabling of comments site-wide by ensuring that original comment statuses are not overwritten when a post is edited. - -= 0.4 = -* Added the option to disable the Recent Comments template widget. -* Bugfix: don't show admin messages to users who don't can't do anything about them. - -= 0.3.5 = -* Bugfix: Other admin menu items could inadvertently be hidden when 'Remove the "Comments" link from the Admin Menu' was selected. - -= 0.3.4 = -* Bugfix: A typo on the settings page meant that the submit button went missing on some browsers. Thanks to Wojtek for reporting this. - -= 0.3.3 = -* Bugfix: Custom post types which don't support comments shouldn't appear on the settings page -* Add warning notice to Discussion settings when comments are disabled - -= 0.3.2 = -* Bugfix: Some dashboard items were incorrectly hidden in multisite - -= 0.3.1 = -* Compatibility fix for WordPress 3.3 - -= 0.3 = -* Added the ability to remove links to comment admin pages from the Dashboard, Admin Bar and Admin Menu - -= 0.2.1 = -* Usability improvements to help first-time users configure the plugin. - -= 0.2 = -* Bugfix: Make sure pingbacks are also prevented when comments are disabled. - -== Installation == - -1. Upload the plugin folder to the `/wp-content/plugins/` directory -2. Activate the plugin through the 'Plugins' menu in WordPress -3. The plugin settings can be accessed via the 'Settings' menu in the administration area (either your site administration for single-site installs, or your network administration for network installs). diff --git a/wp/wp-content/plugins/disable-comments/uninstall.php b/wp/wp-content/plugins/disable-comments/uninstall.php deleted file mode 100644 index 8eb0024a..00000000 --- a/wp/wp-content/plugins/disable-comments/uninstall.php +++ /dev/null @@ -1,5 +0,0 @@ -unload_markdown_for_posts(); -} - -function duplicate_post_jetpack_enable_markdown(){ - WPCom_Markdown::get_instance()->load_markdown_for_posts(); -} \ No newline at end of file diff --git a/wp/wp-content/plugins/duplicate-post/compat/duplicate-post-wpml.php b/wp/wp-content/plugins/duplicate-post/compat/duplicate-post-wpml.php deleted file mode 100644 index d02a728c..00000000 --- a/wp/wp-content/plugins/duplicate-post/compat/duplicate-post-wpml.php +++ /dev/null @@ -1,31 +0,0 @@ -get_current_language(); - $trid = $sitepress->get_element_trid($post->ID); - if (!empty($trid)) { - $translations = $sitepress->get_element_translations($trid); - $new_trid = $sitepress->get_element_trid($post_id); - foreach ($translations as $code => $details) { - if ($code != $current_language) { - $translation = get_post($details->element_id); - $new_post_id = duplicate_post_create_duplicate($translation, $status); - $sitepress->set_element_language_details($new_post_id, 'post_' . $translation->post_type, $new_trid, $code, $current_language); - } - } - } -} -?> \ No newline at end of file diff --git a/wp/wp-content/plugins/duplicate-post/donate.png b/wp/wp-content/plugins/duplicate-post/donate.png deleted file mode 100644 index 5d0f15dda8dc6026157a1622f9bde8766dc66752..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3207 zcmaJ^dpwhEA0Nt4@i>IS%u@Xs2l9XdA zhbXC>lAOt566V-DJ=OF6@%G-I`@XO1`h9-i@9*^e=Spy}-?L3*rw9N5*k)^k!SPmW z-UkvAvZEU+ipheAU`W-6;8V2T$SLeR&;unbGGFU2N2 zkn9w0k0*uukqo^crY2zHP!x}VN@fwkp;Uhw6BUYv{NP3L_8Vp>1pLE=<%fp+laveA z0c=SRB!l&}b+t$^I2?>XXv6jN5eWEhunr8a1BLNkgce*6rH?@AAi+N$2rpWomp2NB zvHls0cS1vaSu6$$3JnPf(GJnorU&{!;f98W8yq@1T09ReW*Ch{4Ar7Bm47i{$V^fo zg~6iGY2Xb;q9;9wg@*7l{ig&f<2Nmh`Lj*DhCxG#3@BV1wo%eAM=bXLyHcsYy_qZ= z`QLp1CovNr#vns+WF|c*ki;9DxAI0P2Ffy!Ok~jm@pQWXuP!?H(phw-FP#ClbV7jD zu|yJuwqeltfxu!>wlpS-NF$MLF=z;nLz_bJLg|=W!Qe=1i~$m61&3Q946HG5D;-?~ z(!d<1Yk)EQg~iZGK~yr0^$Y9uFV^ah*bOmI8NA3Cav&v`>}4HDr-FYJjiUTH7mGjg z{lt3xITy=6Vxhcbpc|w8uTlRp@$|E?{ViPH;kWe3G@jlAdBUb5tY!fKp(R_4IX<*| z($&vj>ce&u-7oXS*D52bsq*sv(J{$#{DP-D zs+;|2xY+u1^!Q>gv#p{&K9{?xNXn8(0K4#cyQWmS=plV)K5?`_Ue zX0t-C^Pz?!-VSBpo_SH|_Ak{E0c*Rn1eC}NK$im}Duy0O$bYvO$1OMF? zXcK?h_o8jGQEyTS1Z+fB{)6+U99ClQJyA{OBj=|jT0A!jk+7oH|(ogYN*Tc)RE;^1f;3yLp77X%dX{|l67_qKwmIdveat! z#U}BAtxpGWXW3z8!HyaG`Q3Z|PHNG0IkVfyuaq(>Mj`>=E_3f?rYo(Y7;gt-OeYJY z@4u^vTe4lzYExNV>ECiQ*!=m-m|XPzXydmg^VqD<^_m~QI%Ck<3n>SbDqWLFpevkL zHEM@rVDV)SzWS=ZNxPX}!Ct+7xJSvfPq=P?e^TQJ@Gja38)dN*vHWP1J66c519}YI{NQ|Oog@3F`U`9lbdXd z4H9IM!8a=hw??NebZe<*s(u9ROxvCNnC&o_ZLqR^vbftWyLJ8*l`{%;`#e6sSXY(* z(2qK^Rw}%dMI_Ns{%%Luv-?j52}gWlfc%4vN`ir%5Mirb>*yzSHWZS91NU^u_wFBh#_jBHuxwX-$_)1l#8uy%VtW2`-&jLYX`=yn(Ex>m#*tKB)EZZURz4kvNzW^?&6 z`}x4C|Gpd6Y6g!G{ZSgM0YggT&g!z;!1N%IZ=xv|&j#G{0W^usyt&%*vR9g~x9~xZ z;<(&=q))KYZjX*=(PLxWCcOlyaYZXb3jW1@)G?1^?x>E;tO+yD4!hUeB~@20UJ^+> zdFL3Q=}e5tAU|kP;1;H$6=l4&d1xRm583^KMO~sz?xY)k{=(0DH?hGH37Yb$V+I$JyDz~N{@dC zQT&#BvOTLRK(shFMs)KC3bj<&Ubc@`-l?9?#@mWc?RmWCZ_N`V zr)L?O5DEM8L)W?RH?81XVLprS6jZOYF^ERVDraa=zccvTGU zj-t#cDhpp5shJN!91Y&q5`_eE3?CIdB<*yE*hcS8S zm{Lp{=UvsrF^FQi$NkTrN_P^1WZTUlHo$}j(?>;P*HybIz;b1gfm{Wl5(UrKAD(@F zNOHXUQmE%yWA`4v1CQKNueP5eo)Z=Vq;td{+jhaC6HvpLY|o^IWC7A~naSF%eR={P zQVRCl?HJS-+>x=p!(41b@Oo1D zd@JEhRw_s}EZAW98FE2;=hlIm%Z|c}*e9Uf4PD;JR`R0M}XBEg39M-MAXqTG?ZYEj*(C1G4d#o&W#< diff --git a/wp/wp-content/plugins/duplicate-post/duplicate-post-admin.php b/wp/wp-content/plugins/duplicate-post/duplicate-post-admin.php deleted file mode 100644 index e5d6cb80..00000000 --- a/wp/wp-content/plugins/duplicate-post/duplicate-post-admin.php +++ /dev/null @@ -1,722 +0,0 @@ - 'editor', - 8 => 'administrator', - ); - - // Cycle all roles and assign capability if its level >= duplicate_post_copy_user_level - foreach ($default_roles as $level => $name){ - $role = get_role($name); - if(!empty($role)) $role->add_cap( 'copy_posts' ); - } - } else { - $min_user_level = get_option('duplicate_post_copy_user_level'); - - if (!empty($min_user_level)){ - // Get default roles - $default_roles = array( - 1 => 'contributor', - 2 => 'author', - 3 => 'editor', - 8 => 'administrator', - ); - - // Cycle all roles and assign capability if its level >= duplicate_post_copy_user_level - foreach ($default_roles as $level => $name){ - $role = get_role($name); - if ($role && $min_user_level <= $level) - $role->add_cap( 'copy_posts' ); - } - delete_option('duplicate_post_copy_user_level'); - } - } - - - add_option('duplicate_post_copytitle','1'); - add_option('duplicate_post_copydate','0'); - add_option('duplicate_post_copystatus','0'); - add_option('duplicate_post_copyslug','1'); - add_option('duplicate_post_copyexcerpt','1'); - add_option('duplicate_post_copycontent','1'); - add_option('duplicate_post_copythumbnail','1'); - add_option('duplicate_post_copytemplate','1'); - add_option('duplicate_post_copyformat','1'); - add_option('duplicate_post_copyauthor','0'); - add_option('duplicate_post_copypassword','0'); - add_option('duplicate_post_copyattachments','0'); - add_option('duplicate_post_copychildren','0'); - add_option('duplicate_post_copycomments','0'); - add_option('duplicate_post_copymenuorder','1'); - add_option('duplicate_post_taxonomies_blacklist',array()); - add_option('duplicate_post_blacklist',''); - add_option('duplicate_post_types_enabled',array('post', 'page')); - add_option('duplicate_post_show_row','1'); - add_option('duplicate_post_show_adminbar','1'); - add_option('duplicate_post_show_submitbox','1'); - add_option('duplicate_post_show_bulkactions','1'); - - $taxonomies_blacklist = get_option('duplicate_post_taxonomies_blacklist'); - if ($taxonomies_blacklist == "") $taxonomies_blacklist = array(); - if(in_array('post_format',$taxonomies_blacklist)){ - update_option('duplicate_post_copyformat', 0); - $taxonomies_blacklist = array_diff($taxonomies_blacklist, array('post_format')); - update_option('duplicate_post_taxonomies_blacklist', $taxonomies_blacklist); - } - - $meta_blacklist = explode(",",get_option('duplicate_post_blacklist')); - if ($meta_blacklist == "") $meta_blacklist = array(); - $meta_blacklist = array_map('trim', $meta_blacklist); - if(in_array('_wp_page_template', $meta_blacklist)){ - update_option('duplicate_post_copytemplate', 0); - $meta_blacklist = array_diff($meta_blacklist, array('_wp_page_template')); - } - if(in_array('_thumbnail_id', $meta_blacklist)){ - update_option('duplicate_post_copythumbnail', 0); - $meta_blacklist = array_diff($meta_blacklist, array('_thumbnail_id')); - } - update_option('duplicate_post_blacklist', implode(',',$meta_blacklist)); - - delete_option('duplicate_post_admin_user_level'); - delete_option('duplicate_post_create_user_level'); - delete_option('duplicate_post_view_user_level'); - delete_option('dp_notice'); - - delete_option('duplicate_post_version'); - update_site_option( 'duplicate_post_version', duplicate_post_get_current_version() ); - - delete_option('duplicate_post_show_notice', 0); - update_site_option('duplicate_post_show_notice', 1); - -} - -/** - * Shows the update notice - */ -function duplicate_post_show_update_notice() { - if(!current_user_can( 'manage_options')) return; - $class = 'notice is-dismissible'; - $message = ''.esc_html__('Check out the new documentation for Duplicate Post!', 'duplicate-post').'
'; - $message .= ''.esc_html__('Duplicate Post is now also compatible with WPML!', 'duplicate-post').'
'; - $message .= ''.sprintf(wp_kses(__('Help me develop the plugin and provide support by donating even a small sum.', 'duplicate-post'), array( 'a' => array( 'href' => array() ) ) ), "https://duplicate-post.lopo.it/donate").''; - global $wp_version; - if( version_compare($wp_version, '4.2') < 0 ){ - $message .= ' | '.__('Dismiss this notice.').''; - } - echo '

'.$message.'

'; - echo ""; -} - -function duplicate_post_dismiss_notice() { - $result = update_site_option('duplicate_post_show_notice', 0); - return $result; - wp_die(); -} - -/** - * Add the link to action list for post_row_actions - */ -function duplicate_post_make_duplicate_link_row($actions, $post) { - if (duplicate_post_is_current_user_allowed_to_copy() && duplicate_post_is_post_type_enabled($post->post_type)) { - $actions['clone'] = '' . esc_html__('Clone', 'duplicate-post') . ''; - $actions['edit_as_new_draft'] = '' . esc_html__('New Draft', 'duplicate-post') . ''; - } - return $actions; -} - -/** - * Add a button in the post/page edit screen to create a clone - */ -function duplicate_post_add_duplicate_post_button() { - if ( isset( $_GET['post'] )){ - $id = $_GET['post']; - $post = get_post($id); - if(duplicate_post_is_current_user_allowed_to_copy() && duplicate_post_is_post_type_enabled($post->post_type)) { - ?> -
- - -
- 1, 'ids' => $post->ID), $sendback ) ); - } else { - // Redirect to the edit screen for the new draft post - wp_redirect( add_query_arg( array( 'cloned' => 1, 'ids' => $post->ID), admin_url( 'post.php?action=edit&post=' . $new_id ) ) ); - } - exit; - - } else { - wp_die(esc_html__('Copy creation failed, could not find original:', 'duplicate-post') . ' ' . htmlspecialchars($id)); - } -} - -/** - * Copy the taxonomies of a post to another post - */ -function duplicate_post_copy_post_taxonomies($new_id, $post) { - global $wpdb; - if (isset($wpdb->terms)) { - // Clear default category (added by wp_insert_post) - wp_set_object_terms( $new_id, NULL, 'category' ); - - $post_taxonomies = get_object_taxonomies($post->post_type); - // several plugins just add support to post-formats but don't register post_format taxonomy - if(post_type_supports($post->post_type, 'post-formats') && !in_array('post_format', $post_taxonomies)){ - $post_taxonomies[] = 'post_format'; - } - - $taxonomies_blacklist = get_option('duplicate_post_taxonomies_blacklist'); - if ($taxonomies_blacklist == "") $taxonomies_blacklist = array(); - if(get_option('duplicate_post_copyformat') == 0){ - $taxonomies_blacklist[] = 'post_format'; - } - $taxonomies = array_diff($post_taxonomies, $taxonomies_blacklist); - foreach ($taxonomies as $taxonomy) { - $post_terms = wp_get_object_terms($post->ID, $taxonomy, array( 'orderby' => 'term_order' )); - $terms = array(); - for ($i=0; $islug; - } - wp_set_object_terms($new_id, $terms, $taxonomy); - } - } -} - -/** - * Copy the meta information of a post to another post -*/ -function duplicate_post_copy_post_meta_info($new_id, $post) { - $post_meta_keys = get_post_custom_keys($post->ID); - if (empty($post_meta_keys)) return; - $meta_blacklist = get_option('duplicate_post_blacklist'); - if ($meta_blacklist == ""){ - $meta_blacklist = array(); - } else { - $meta_blacklist = explode(',', $meta_blacklist); - $meta_blacklist = array_filter($meta_blacklist); - $meta_blacklist = array_map('trim', $meta_blacklist); - } - $meta_blacklist[] = '_edit_lock'; // edit lock - $meta_blacklist[] = '_edit_last'; // edit lock - if(get_option('duplicate_post_copytemplate') == 0){ - $meta_blacklist[] = '_wp_page_template'; - } - if(get_option('duplicate_post_copythumbnail') == 0){ - $meta_blacklist[] = '_thumbnail_id'; - } - - $meta_blacklist = apply_filters( 'duplicate_post_blacklist_filter' , $meta_blacklist ); - - $meta_blacklist_string = '('.implode(')|(',$meta_blacklist).')'; - if(strpos($meta_blacklist_string, '*') !== false){ - $meta_blacklist_string = str_replace(array('*'), array('[a-zA-Z0-9_]*'), $meta_blacklist_string); - - $meta_keys = array(); - foreach($post_meta_keys as $meta_key){ - if(!preg_match('#^'.$meta_blacklist_string.'$#', $meta_key)) - $meta_keys[] = $meta_key; - } - } else { - $meta_keys = array_diff($post_meta_keys, $meta_blacklist); - } - - $meta_keys = apply_filters( 'duplicate_post_meta_keys_filter', $meta_keys ); - - foreach ($meta_keys as $meta_key) { - $meta_values = get_post_custom_values($meta_key, $post->ID); - foreach ($meta_values as $meta_value) { - $meta_value = maybe_unserialize($meta_value); - add_post_meta($new_id, $meta_key, duplicate_post_wp_slash($meta_value)); - } - } -} - -/* - * Workaround for inconsistent wp_slash. - * Works only with WP 4.4+ (map_deep) - */ -function duplicate_post_addslashes_deep( $value ) { - if (function_exists('map_deep')){ - return map_deep( $value, 'duplicate_post_addslashes_to_strings_only' ); - } else { - return wp_slash( $value ); - } -} - -function duplicate_post_addslashes_to_strings_only( $value ) { - return is_string( $value ) ? addslashes( $value ) : $value; -} - -function duplicate_post_wp_slash( $value ) { - return duplicate_post_addslashes_deep( $value ); -} - - - -/** - * Copy the attachments -*/ -function duplicate_post_copy_attachments($new_id, $post){ - // get thumbnail ID - $old_thumbnail_id = get_post_thumbnail_id($post->ID); - // get children - $children = get_posts(array( 'post_type' => 'any', 'numberposts' => -1, 'post_status' => 'any', 'post_parent' => $post->ID )); - // clone old attachments - foreach($children as $child){ - if ($child->post_type != 'attachment') continue; - $url = wp_get_attachment_url($child->ID); - // Let's copy the actual file - $tmp = download_url( $url ); - if( is_wp_error( $tmp ) ) { - @unlink($tmp); - continue; - } - - $desc = wp_slash($child->post_content); - - $file_array = array(); - $file_array['name'] = basename($url); - $file_array['tmp_name'] = $tmp; - // "Upload" to the media collection - $new_attachment_id = media_handle_sideload( $file_array, $new_id, $desc ); - - if ( is_wp_error($new_attachment_id) ) { - @unlink($file_array['tmp_name']); - continue; - } - $new_post_author = wp_get_current_user(); - $cloned_child = array( - 'ID' => $new_attachment_id, - 'post_title' => $child->post_title, - 'post_exceprt' => $child->post_title, - 'post_author' => $new_post_author->ID - ); - wp_update_post( wp_slash($cloned_child) ); - - $alt_title = get_post_meta($child->ID, '_wp_attachment_image_alt', true); - if($alt_title) update_post_meta($new_attachment_id, '_wp_attachment_image_alt', wp_slash($alt_title)); - - // if we have cloned the post thumbnail, set the copy as the thumbnail for the new post - if(get_option('duplicate_post_copythumbnail') == 1 && $old_thumbnail_id == $child->ID){ - set_post_thumbnail($new_id, $new_attachment_id); - } - - } -} - -/** - * Copy children posts - */ -function duplicate_post_copy_children($new_id, $post, $status = ''){ - // get children - $children = get_posts(array( 'post_type' => 'any', 'numberposts' => -1, 'post_status' => 'any', 'post_parent' => $post->ID )); - // clone old attachments - foreach($children as $child){ - if ($child->post_type == 'attachment') continue; - duplicate_post_create_duplicate($child, $status, $new_id); - } -} - -/** - * Copy comments - */ -function duplicate_post_copy_comments($new_id, $post){ - $comments = get_comments(array( - 'post_id' => $post->ID, - 'order' => 'ASC', - 'orderby' => 'comment_date_gmt' - )); - - $old_id_to_new = array(); - foreach ($comments as $comment){ - //do not copy pingbacks or trackbacks - if(!empty($comment->comment_type)) continue; - $parent = ($comment->comment_parent && $old_id_to_new[$comment->comment_parent])?$old_id_to_new[$comment->comment_parent]:0; - $commentdata = array( - 'comment_post_ID' => $new_id, - 'comment_author' => $comment->comment_author, - 'comment_author_email' => $comment->comment_author_email, - 'comment_author_url' => $comment->comment_author_url, - 'comment_content' => $comment->comment_content, - 'comment_type' => '', - 'comment_parent' => $parent, - 'user_id' => $comment->user_id, - 'comment_author_IP' => $comment->comment_author_IP, - 'comment_agent' => $comment->comment_agent, - 'comment_karma' => $comment->comment_karma, - 'comment_approved' => $comment->comment_approved, - ); - if(get_option('duplicate_post_copydate') == 1){ - $commentdata['comment_date'] = $comment->comment_date ; - $commentdata['comment_date_gmt'] = get_gmt_from_date($comment->comment_date); - } - $new_comment_id = wp_insert_comment($commentdata); - $old_id_to_new[$comment->comment_ID] = $new_comment_id; - } -} - -/** - * Create a duplicate from a post - */ -function duplicate_post_create_duplicate($post, $status = '', $parent_id = '') { - - do_action('duplicate_post_pre_copy'); - - if (!duplicate_post_is_post_type_enabled($post->post_type) && $post->post_type != 'attachment') - wp_die(esc_html__('Copy features for this post type are not enabled in options page', 'duplicate-post')); - - $new_post_status = (empty($status))? $post->post_status: $status; - - if ($post->post_type != 'attachment'){ - $prefix = sanitize_text_field(get_option('duplicate_post_title_prefix')); - $suffix = sanitize_text_field(get_option('duplicate_post_title_suffix')); - $title = ' '; - if (get_option('duplicate_post_copytitle') == 1) { - $title = $post->post_title; - if (!empty($prefix)) $prefix.= " "; - if (!empty($suffix)) $suffix = " ".$suffix; - } else { - $title = ' '; - } - $title = trim($prefix.$title.$suffix); - - if ($title == ''){ - // empty title - $title = __('Untitled'); - } - if (get_option('duplicate_post_copystatus') == 0){ - $new_post_status = 'draft'; - } else { - if ( 'publish' == $new_post_status || 'future' == $new_post_status ){ - // check if the user has the right capability - if(is_post_type_hierarchical( $post->post_type )){ - if(!current_user_can('publish_pages')){ - $new_post_status = 'pending'; - } - } else { - if(!current_user_can('publish_posts')){ - $new_post_status = 'pending'; - } - } - } - } - } - - $new_post_author = wp_get_current_user(); - $new_post_author_id = $new_post_author->ID; - if ( get_option('duplicate_post_copyauthor') == '1' ){ - // check if the user has the right capability - if(is_post_type_hierarchical( $post->post_type )){ - if(current_user_can('edit_others_pages')){ - $new_post_author_id = $post->post_author; - } - } else { - if(current_user_can('edit_others_posts')){ - $new_post_author_id = $post->post_author; - } - } - } - - $menu_order = (get_option('duplicate_post_copymenuorder') == '1') ? $post->menu_order : 0; - $increase_menu_order_by = get_option('duplicate_post_increase_menu_order_by'); - if(!empty($increase_menu_order_by) && is_numeric($increase_menu_order_by)){ - $menu_order += intval($increase_menu_order_by); - } - - $new_post = array( - 'menu_order' => $menu_order, - 'comment_status' => $post->comment_status, - 'ping_status' => $post->ping_status, - 'post_author' => $new_post_author_id, - 'post_content' => (get_option('duplicate_post_copycontent') == '1') ? $post->post_content : "" , - 'post_content_filtered' => (get_option('duplicate_post_copycontent') == '1') ? $post->post_content_filtered : "" , - 'post_excerpt' => (get_option('duplicate_post_copyexcerpt') == '1') ? $post->post_excerpt : "", - 'post_mime_type' => $post->post_mime_type, - 'post_parent' => $new_post_parent = empty($parent_id)? $post->post_parent : $parent_id, - 'post_password' => (get_option('duplicate_post_copypassword') == '1') ? $post->post_password: "", - 'post_status' => $new_post_status, - 'post_title' => $title, - 'post_type' => $post->post_type, - ); - - if(get_option('duplicate_post_copydate') == 1){ - $new_post['post_date'] = $new_post_date = $post->post_date ; - $new_post['post_date_gmt'] = get_gmt_from_date($new_post_date); - } - - $new_post_id = wp_insert_post(wp_slash($new_post)); - - // If the copy is published or scheduled, we have to set a proper slug. - if ($new_post_status == 'publish' || $new_post_status == 'future'){ - $post_name = $post->post_name; - if(get_option('duplicate_post_copyslug') != 1){ - $post_name = ''; - } - $post_name = wp_unique_post_slug($post_name, $new_post_id, $new_post_status, $post->post_type, $new_post_parent); - - $new_post = array(); - $new_post['ID'] = $new_post_id; - $new_post['post_name'] = $post_name; - - // Update the post into the database - wp_update_post( wp_slash($new_post) ); - } - - // If you have written a plugin which uses non-WP database tables to save - // information about a post you can hook this action to dupe that data. - if ($post->post_type == 'page' || is_post_type_hierarchical( $post->post_type )) - do_action( 'dp_duplicate_page', $new_post_id, $post, $status ); - else - do_action( 'dp_duplicate_post', $new_post_id, $post, $status ); - - delete_post_meta($new_post_id, '_dp_original'); - add_post_meta($new_post_id, '_dp_original', $post->ID); - - do_action('duplicate_post_post_copy'); - - return $new_post_id; -} - -//Add some links on the plugin page -function duplicate_post_add_plugin_links($links, $file) { - if ( $file == plugin_basename(dirname(__FILE__).'/duplicate-post.php') ) { - $links[] = '' . esc_html__('Documentation', 'duplicate-post') . ''; - $links[] = '' . esc_html__('Donate', 'duplicate-post') . ''; - } - return $links; -} - -/*** NOTICES ***/ -function duplicate_post_action_admin_notice() { - if ( ! empty( $_REQUEST['cloned'] ) ) { - $copied_posts = intval( $_REQUEST['cloned'] ); - printf( '

' . - _n( '%s item copied.', - '%s items copied.', - $copied_posts, - 'duplicate-post' - ) . '

', $copied_posts ); - remove_query_arg( 'cloned' ); - } -} - - -/*** BULK ACTIONS ***/ -add_action('admin_init', 'duplicate_post_add_bulk_filters_for_enabled_post_types'); - -function duplicate_post_add_bulk_filters_for_enabled_post_types(){ - if(get_option('duplicate_post_show_bulkactions') != 1) return; - $duplicate_post_types_enabled = get_option('duplicate_post_types_enabled', array ('post', 'page')); - if(!is_array($duplicate_post_types_enabled)) $duplicate_post_types_enabled = array($duplicate_post_types_enabled); - foreach($duplicate_post_types_enabled as $duplicate_post_type_enabled){ - add_filter( "bulk_actions-edit-{$duplicate_post_type_enabled}", 'duplicate_post_register_bulk_action' ); - add_filter( "handle_bulk_actions-edit-{$duplicate_post_type_enabled}", 'duplicate_post_action_handler', 10, 3 ); - } -} - -function duplicate_post_register_bulk_action($bulk_actions) { - $bulk_actions['duplicate_post_clone'] = esc_html__( 'Clone', 'duplicate-post'); - return $bulk_actions; -} - -function duplicate_post_action_handler( $redirect_to, $doaction, $post_ids ) { - if ( $doaction !== 'duplicate_post_clone' ) { - return $redirect_to; - } - $counter = 0; - foreach ( $post_ids as $post_id ) { - $post = get_post($post_id); - if(!empty($post)){ - if( get_option('duplicate_post_copychildren') != 1 - || !is_post_type_hierarchical( $post->post_type ) - || (is_post_type_hierarchical( $post->post_type ) && !duplicate_post_has_ancestors_marked($post, $post_ids))){ - if(duplicate_post_create_duplicate($post)){ - $counter++; - } - } - } - } - $redirect_to = add_query_arg( 'cloned', $counter, $redirect_to ); - return $redirect_to; -} - -function duplicate_post_has_ancestors_marked($post, $post_ids){ - $ancestors_in_array = 0; - $parent = $post->ID; - while ($parent = wp_get_post_parent_id($parent)){ - if(in_array($parent, $post_ids)){ - $ancestors_in_array++; - } - } - return ($ancestors_in_array !== 0); -} diff --git a/wp/wp-content/plugins/duplicate-post/duplicate-post-common.php b/wp/wp-content/plugins/duplicate-post/duplicate-post-common.php deleted file mode 100644 index 7f2dc40e..00000000 --- a/wp/wp-content/plugins/duplicate-post/duplicate-post-common.php +++ /dev/null @@ -1,152 +0,0 @@ -post_type)) - return; - - if ($draft) - $action_name = "duplicate_post_save_as_new_post_draft"; - else - $action_name = "duplicate_post_save_as_new_post"; - - if ( 'display' == $context ) - $action = '?action='.$action_name.'&post='.$post->ID; - else - $action = '?action='.$action_name.'&post='.$post->ID; - - $post_type_object = get_post_type_object( $post->post_type ); - if ( !$post_type_object ) - return; - - return wp_nonce_url(apply_filters( 'duplicate_post_get_clone_post_link', admin_url( "admin.php". $action ), $post->ID, $context ), 'duplicate-post_' . $post->ID); -} -/** - * Display duplicate post link for post. - * - * @param string $link Optional. Anchor text. - * @param string $before Optional. Display before edit link. - * @param string $after Optional. Display after edit link. - * @param int $id Optional. Post ID. - */ -function duplicate_post_clone_post_link( $link = null, $before = '', $after = '', $id = 0 ) { - if ( !$post = get_post( $id ) ) - return; - - if ( !$url = duplicate_post_get_clone_post_link( $post->ID ) ) - return; - - if ( null === $link ) - $link = esc_html__('Copy to a new draft', 'duplicate-post'); - - $link = '' . $link . ''; - echo $before . apply_filters( 'duplicate_post_clone_post_link', $link, $post->ID ) . $after; -} -/** - * Get original post . - * - * @param int $post Optional. Post ID or Post object. - * @param string $output Optional, default is Object. Either OBJECT, ARRAY_A, or ARRAY_N. - * @return mixed Post data - */ -function duplicate_post_get_original($post = null , $output = OBJECT){ - if ( !$post = get_post( $post ) ) - return; - $original_ID = get_post_meta( $post->ID, '_dp_original'); - if (empty($original_ID)) return null; - $original_post = get_post($original_ID[0], $output); - return $original_post; -} - -// Admin bar -function duplicate_post_admin_bar_render() { - if(!is_admin_bar_showing()) return; - global $wp_admin_bar; - $current_object = get_queried_object(); - if ( empty($current_object) ) - return; - if ( ! empty( $current_object->post_type ) - && ( $post_type_object = get_post_type_object( $current_object->post_type ) ) - && duplicate_post_is_current_user_allowed_to_copy() - && ( $post_type_object->show_ui || 'attachment' == $current_object->post_type ) - && (duplicate_post_is_post_type_enabled($current_object->post_type) ) ) - { - $wp_admin_bar->add_menu( array( - 'id' => 'new_draft', - 'title' => esc_attr__("Copy to a new draft", 'duplicate-post'), - 'href' => duplicate_post_get_clone_post_link( $current_object->ID ) - ) ); - } -} - -function duplicate_post_add_css() { - if(!is_admin_bar_showing()) return; - $current_object = get_queried_object(); - if ( empty($current_object) ) - return; - if ( ! empty( $current_object->post_type ) - && ( $post_type_object = get_post_type_object( $current_object->post_type ) ) - && duplicate_post_is_current_user_allowed_to_copy() - && ( $post_type_object->show_ui || 'attachment' == $current_object->post_type ) - && (duplicate_post_is_post_type_enabled($current_object->post_type) ) ) - { - wp_enqueue_style ( 'duplicate-post', plugins_url('/duplicate-post.css', __FILE__)); - } -} - - -add_action('init', 'duplicate_post_init'); - -function duplicate_post_init(){ - if (get_option ( 'duplicate_post_show_adminbar' ) == 1) { - add_action ( 'wp_before_admin_bar_render', 'duplicate_post_admin_bar_render' ); - add_action ( 'wp_enqueue_scripts', 'duplicate_post_add_css' ); - } -} - -/** - * Sort taxonomy objects: first public, then private - */ -function duplicate_post_tax_obj_cmp($a, $b) { - return ($a->public < $b->public); -} \ No newline at end of file diff --git a/wp/wp-content/plugins/duplicate-post/duplicate-post-options.php b/wp/wp-content/plugins/duplicate-post/duplicate-post-options.php deleted file mode 100644 index e060278a..00000000 --- a/wp/wp-content/plugins/duplicate-post/duplicate-post-options.php +++ /dev/null @@ -1,395 +0,0 @@ -get_names(); - - $dp_roles = get_option('duplicate_post_roles'); - if ( $dp_roles == "" ) $dp_roles = array(); - - foreach ($roles as $name => $display_name){ - $role = get_role($name); - - // role should have at least edit_posts capability - if ( !$role->has_cap('edit_posts') ) continue; - - /* If the role doesn't have the capability and it was selected, add it. */ - if ( !$role->has_cap( 'copy_posts' ) && in_array($name, $dp_roles) ) - $role->add_cap( 'copy_posts' ); - - /* If the role has the capability and it wasn't selected, remove it. */ - elseif ( $role->has_cap( 'copy_posts' ) && !in_array($name, $dp_roles) ) - $role->remove_cap( 'copy_posts' ); - } - } - ?> -
-
-
-
-

- -

- -
-

- -
- -
- -
- - - - - -

-
- - - - - - - -
- - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
- - - -
- - - -
- - - -
-
- -
-

- - -
name == 'post_format'){ - continue; - } - ?> - -
-
-
- - - - - - - - - - - -
- get_names(); - foreach ($roles as $name => $display_name): $role = get_role($name); - if ( !$role->has_cap('edit_posts') ) continue; ?>
- -
-
- true),'objects'); - foreach ($post_types as $post_type_object ) : - if ($post_type_object->name == 'attachment') continue; ?> -
-
-
-
-
- - - - - - - - - - - - -
- - - - = 0 ){ ?> - - -
-
here', 'duplicate-post'), 'https://wordpress.org/plugins/duplicate-post/other_notes/'); ?> -
-
- "/> -
-
-

- -

- -
-
- \ No newline at end of file diff --git a/wp/wp-content/plugins/duplicate-post/duplicate-post.css b/wp/wp-content/plugins/duplicate-post/duplicate-post.css deleted file mode 100644 index 38ea422a..00000000 --- a/wp/wp-content/plugins/duplicate-post/duplicate-post.css +++ /dev/null @@ -1,32 +0,0 @@ -#wpadminbar #wp-admin-bar-new_draft > .ab-item::before { - content: url("data:image/svg+xml;utf8,"); - top: 2px; -} - -@media screen and (max-width: 782px){ - #wpadminbar li#wp-admin-bar-new_draft{ - display: block; - } - - #wpadminbar #wp-admin-bar-new_draft > .ab-item { - text-indent: 100%; - white-space: nowrap; - overflow: hidden; - width: 95px; - padding: 0; - color: #999; - position: relative; - } - - #wpadminbar #wp-admin-bar-new_draft > .ab-item::before { - display: block; - text-indent: 0; - font: 400 32px/1 dashicons; - speak: none; - top: 7px; - width: 95px; - text-align: center; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - } -} \ No newline at end of file diff --git a/wp/wp-content/plugins/duplicate-post/duplicate-post.php b/wp/wp-content/plugins/duplicate-post/duplicate-post.php deleted file mode 100644 index a8c9cdea..00000000 --- a/wp/wp-content/plugins/duplicate-post/duplicate-post.php +++ /dev/null @@ -1,57 +0,0 @@ -".esc_html__("Settings").""); - return $actions; -} - -require_once (dirname(__FILE__).'/duplicate-post-common.php'); - -if (is_admin()){ - require_once (dirname(__FILE__).'/duplicate-post-admin.php'); -} \ No newline at end of file diff --git a/wp/wp-content/plugins/duplicate-post/readme.txt b/wp/wp-content/plugins/duplicate-post/readme.txt deleted file mode 100644 index e12347a4..00000000 --- a/wp/wp-content/plugins/duplicate-post/readme.txt +++ /dev/null @@ -1,294 +0,0 @@ -=== Duplicate Post === -Contributors: lopo -Donate link: https://duplicate-post.lopo.it/ -Tags: duplicate post, copy, clone -Requires at least: 3.6 -Tested up to: 4.7 -Stable tag: 3.2 -License: GPLv2 or later -License URI: http://www.gnu.org/licenses/gpl-2.0.html - -Copy posts of any type with a click! - -== Description == - -This plugin allows users to clone posts of any type, or copy them to new drafts for further editing. -If you find this useful, [**please consider donating**](https://duplicate-post.lopo.it/) whatever sum you choose, **even just 10 cents**. Just a few cents from every user would help me develop the plugin and improve support. - -How it works: - -1. In 'Edit Posts'/'Edit Pages', you can click on 'Clone' link below the post/page title: this will immediately create a copy and return to the list. - -2. NEW! In 'Edit Posts'/'Edit Pages', you can select one or more items, then choose 'Clone' in the 'Bulk Actions' dropdown to copy them all at once. - -3. In 'Edit Posts'/'Edit Pages', you can click on 'New Draft' link below the post/page title. - -4. On the post edit screen, you can click on 'Copy to a new draft' above "Cancel"/"Move to trash". - -5. While viewing a post as a logged in user, you can click on 'Copy to a new draft' as a dropdown link under "Edit Post" in the admin bar. - -3, 4 and 5 will lead to the edit page for the new draft: change what you want, click on 'Publish' and you're done. - -There is also a **template tag**, so you can put it in your templates and clone your posts/pages from the front-end. Clicking on the link will lead you to the edit page for the new draft, just like the admin bar link. - -Duplicate Post has many useful settings to customize its behavior and restrict its use to certain roles or post types. Check out the extensive documentation on [the plugin's site](https://duplicate-post.lopo.it). - -**If you're a plugin developer**, I suggest you to read the [Developer's Guide](https://duplicate-post.lopo.it/docs/developers-guide/) to ensure compatibility between your plugin(s) and mine. Feel free to [contact me](https://duplicate-post.lopo.it/contact) so we can keep in touch and collaborate. - -Thanks for all the suggestions, bug reports, translations and donations, they're frankly too many to be listed here! - -== Installation == - -Use WordPress' Add New Plugin feature, searching "Duplicate Post", or download the archive and: - -1. Unzip the archive on your computer -2. Upload `duplicate-post` directory to the `/wp-content/plugins/` directory -3. Activate the plugin through the 'Plugins' menu in WordPress -4. Go to Settings -> Duplicate Post and customize behaviour as needed - -== Frequently Asked Questions == - -= The plugin doesn't work, why? = - -First, check your version of WordPress: the plugin is not supposed to work on old versions anymore. Make sure also to upgrade to the last version of the plugin! - -Then try to deactivate and re-activate it, some user have reported that this fixes some problems. - -Pay also attention to the "Permissions" tab in the Settings: make sure the plugin is enabled for the desired roles and post types. - -If it still doesn't work, maybe there is some kind of conflict with other plugins: feel free [to write in the forum](https://wordpress.org/support/plugin/duplicate-post) and we'll try to discover a solution (it will be *really* helpful if you try to deactivate all your other plugins one by one to see which one conflicts with mine... But do it only if you know what you're doing, I will not be responsible of any problem you may experience). - -= The plugin is not translated in my language! = - -From version 3.0 the plugin's translations are managed by the WordPress.org platform and the plugin is shipped without language files, so first of all update translations under Dashboard->Updates. - -If Duplicate Post is still in English, or if there are some untraslated strings, you can help traslating to your language [here](https://translate.wordpress.org/projects/wp-plugins/duplicate-post): you only need a WordPress.org account. -[Contact me](https://duplicate-post.lopo.it/contact) if you wish to become an editor for your language. - -== Screenshots == - -1. Here you can copy the post you're editing to a new draft. -2. By clicking on "Clone" the post is cloned immediately. "New draft" leads to the edit screen. -3. The options page. -4. The template tag manually added to Twenty Ten theme. Click on the "Copy to a new draft" link and you're redirected to the edit screen for a new draft copy of your post. -5. The admin bar link. -6. Bulk clone action. - -== Upgrade Notice == - -= 3.2 = -new website + WPML compatibility + various fixes - -= 3.1.2 = -Fixes the problem with custom fields - -= 3.1.1 = -Bulk clone + custom field wildcards + other features + bugfixes + fix for nasty nag - -= 3.1 = -Bulk clone + custom field wildcards + other features + bugfixes - -= 3.0.3 = -Notices + small fixes and improvements - -= 3.0.2 = -Small bugfixes: check the changelog for more info - -= 3.0.1 = -Recommended if you have 3.0: fixes the upgrade bug - -= 3.0 = -Major redesign of the settings page + fine-tune options (what to copy, custom post types, etc.) + bugfixes and XSS prevention - -= 2.6 = -PHP 5.4 (Strict Standards) compatible + Fixed possible XSS and SQL injections + other bugs - -= 2.4.1 = -Fixes a couple of bug. Recommended if you have problems with v2.4 - -= 2.4 = -Copy child pages + a couple of bugfixes + licence switch to GPLv2 - -= 2.3 = -Fixes a bunch of bugs + copy attachments + choose where to show the links. - -= 2.2 = -VERY IMPORTANT UPGRADE to get rid of problems with complex custom fields, afflicting both 2.1.* releases. - -= 2.1.1 = -Fix for upgrade problem - -= 2.1 = -Copy from admin bar + user levels out, roles and capabilities in. - -= 2.0.2 = -Fixed permalink bug + double choice on posts list - -= 2.0.1 = -Bug fix + new option - -= 2.0 = -Several improvements and new features, see changelog. Requires WP 3.0+. - -= 1.1.1 = -Some users have experienced a fatal error when upgrading to v1.1: this may fix it, if it's caused by a plugin conflict. - -= 1.1 = -New features and customization, WP 3.0 compatibility: you should upgrade if you want to copy Custom Posts with Custom Taxonomies. - -== Changelog == - -= 3.2 (2017-04-04) = -* new website with extensive documentation -* WPML compatibility, thanks to WPML team -* improved Jetpack compatibility (Subscriptions, Markdown) -* small changes to hooks -* improved security with nonces -* various small fixes - -= 3.1.2 (2016-12-13) = -* Fix for custom fields not copied - -= 3.1.1 (2016-12-13) = -* Fix for nasty update nag (plus a failsafe checkbox) - -= 3.1 (2016-12-13) = -* Bulk clone action added (WP 4.7+) -* Wildcards enabled for custom fields to skip -* Options to copy post author, post format (moved from taxonomies), menu order, post template -* Check publish_posts/publish_pages capability to prevent Contributors from publishing by cloning -* Using wp_slash (WP 3.6+) or a better workaround (WP 4.4+) on the post and its meta, should also fix some compatibility issues -* Check if admin bar is showing before enqueueing CSS -* Probable fix for repeated clone bug -* Other minor bugs fixed - -= 3.0.3 (2016-10-29) = -* Notices in admin after copying -* Fixes warning in custom post type archives -* Uses site options for version and notice -* Minor fixes - -= 3.0.2 (2016-10-18) = -* Can now be enabled for every custom post type with visible UI (not just public ones) -* Admin bar CSS only enqueued when needed -* New "Donate" button -* Fixes for minor bugs and typos - -= 3.0.1 (2016-10-09) = -* Fixes the issues for people upgrading from an older version - -= 3.0 (2016-10-09) = -* Settings page redesigned -* More options to enable/disable copy of every part of a post -* Enable/disable cloning for every custom post type -* Jetpack Publicize compatibility -* Fixed a possible XSS -* Fixed other little bugs -* Translations removed to use WP.org's official translation project -* Checked PHP 7 compatibility - -= 2.6 (2014-04-27) = -* PHP 5.4 (Strict Standards) compatible -* Fixed possible XSS and SQL injections -* other bugs -* Updated and added translations -* Tested up to WP 3.8.1 - -= 2.4.1 (2014-02-22) = -* Fixed regression about draft permalinks -* Fixed bug with guid -* Don't clone to_ping and pinged (maybe there will be an option about those later) - -= 2.4 (2012-04-29) = -* New option to clone the children of the original page -* Licence changed to GPLv2 or later -* Fixed publishing dates for drafts -* Fixed bug with prefix/suffix -* Translation project moved to GlotPress - -= 2.3 (2012-04-06) = -* Added options to choose where to show the "Clone" links -* Clone attachments (i.e. references in the DB, not physical files) -* Fix for untranslated user roles -* Some other fixes (missing checks, PHP warnings and errors, etc.) - -= 2.2 (2012-02-01) = -* Fix for problems when copying serialized meta fields -* Fix for multiple _dp_original field -* Removed deprecated parameter when adding options - -= 2.1.1 (2012-01-04) = -* Can't rely on activation hook for upgrade, this caused problems with new options - -= 2.1 (2012-01-03) = -* Even more code cleaning (no more custom queries, using WP API) -* Term order preserved when copying -* Stopped using deprecated User levels, now it uses Roles and Capabilities -* 'Copy to a new draft' link in admin bar -* duplicate_post_get_original template tag -* Settings link in plugin list, 'Donate' and 'Translate' link in option page - -= 2.0.2 (2011-12-12) = -* Fixed bug for permalinks -* Two links on posts list: clone immediately or copy to a new draft to edit. -* Tested on multisite mode. - -= 2.0.1 (2011-12-08) = -* Fixed bug for action filters -* New option so you can choose if cloning from the posts list must copy the post status (draft, published, pending) too. - -= 2.0 (2011-12-08) = -* WP 3.3 compatibility (still not tested against multiblog feature, so beware) -* Minimum WP version: 3.0 -* Code cleanup -* Immediate cloning from post list -* Added options for taxonomies and post excerpt -* Added suffix option -* Added template tag - -= 1.1.2 (2011-04-08) = -* WP 3.1.1 compatibility (still not tested against multiblog feature, so beware) -* Added complete Polish language files - -= 1.1.1 (2010-06-30) = -* Plugin split in two files for faster opening in Plugins list page -* fix conflicts with a few other plugins -* Added Dutch language files - -= 1.1 (2010-06-24) = -* WP 3.0 compatibility (not tested against multiblog feature, so beware) -* Option page: minimum user level, title prefix, fields not to be copied, copy post/page date also -* Added German, Swedish, Romanian, Hebrew, Catalan (incomplete) and Polish (incomplete) language files - -= 1.0 (2010-06-15) = -* Better integration with WP 2.7+ interface -* Added actions for plugins which store post metadata in self-managed tables -* Added French and Spanish language files -* Dropped WP 2.6.5 compatibility - -= 0.6.1 (2009-12-03) = -* Tested WP 2.9 compatibility - -= 0.6 (2007-07-21) = -* Fix for WP 2.8.1 -* WPMU compatibility -* Internationalization (Italian and Japanese language files shipped) - -= 0.5 (2009-01-09) = -* Fix for post-meta -* WP2.7 compatibility - -= 0.4 (2008-11-23) = -* Support for new WP post revision feature - -= 0.3 (2008-03-01) = -* Initial version on WP repository - -== Contribute == - -If you find this useful and if you want to contribute, there are three ways: - - 1. You can [write me](https://duplicate-post.lopo.it/contact) and submit your bug reports, suggestions and requests for features; - 2. If you want to translate it to your language (there are just a few lines of text), you can use the [translation project](https://translate.wordpress.org/projects/wp-plugins/duplicate-post); - 3. Using the plugin is free, but if you want you can support my efforts by donating with PayPal [here](https://duplicate-post.lopo.it/donate) - diff --git a/wp/wp-content/plugins/index.php b/wp/wp-content/plugins/index.php deleted file mode 100644 index 4e6c07c7..00000000 --- a/wp/wp-content/plugins/index.php +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/json-api/controllers/core.php b/wp/wp-content/plugins/json-api/controllers/core.php deleted file mode 100644 index 360222cf..00000000 --- a/wp/wp-content/plugins/json-api/controllers/core.php +++ /dev/null @@ -1,339 +0,0 @@ -query->controller)) { - return $json_api->controller_info($json_api->query->controller); - } else { - $dir = json_api_dir(); - if (file_exists("$dir/json-api.php")) { - $php = file_get_contents("$dir/json-api.php"); - } else { - // Check one directory up, in case json-api.php was moved - $dir = dirname($dir); - if (file_exists("$dir/json-api.php")) { - $php = file_get_contents("$dir/json-api.php"); - } - } - if (preg_match('/^\s*Version:\s*(.+)$/m', $php, $matches)) { - $version = $matches[1]; - } else { - $version = '(Unknown)'; - } - $active_controllers = explode(',', get_option('json_api_controllers', 'core')); - $controllers = array_intersect($json_api->get_controllers(), $active_controllers); - return array( - 'json_api_version' => $version, - 'controllers' => array_values($controllers) - ); - } - } - - public function get_recent_posts() { - global $json_api; - $posts = $json_api->introspector->get_posts(); - return $this->posts_result($posts); - } - - public function get_posts() { - global $json_api; - $url = parse_url($_SERVER['REQUEST_URI']); - $defaults = array( - 'ignore_sticky_posts' => true - ); - $query = wp_parse_args($url['query']); - unset($query['json']); - unset($query['post_status']); - $query = array_merge($defaults, $query); - $posts = $json_api->introspector->get_posts($query); - $result = $this->posts_result($posts); - $result['query'] = $query; - return $result; - } - - public function get_post() { - global $json_api, $post; - $post = $json_api->introspector->get_current_post(); - if ($post) { - $previous = get_adjacent_post(false, '', true); - $next = get_adjacent_post(false, '', false); - $response = array( - 'post' => new JSON_API_Post($post) - ); - if ($previous) { - $response['previous_url'] = get_permalink($previous->ID); - } - if ($next) { - $response['next_url'] = get_permalink($next->ID); - } - return $response; - } else { - $json_api->error("Not found."); - } - } - - public function get_page() { - global $json_api; - extract($json_api->query->get(array('id', 'slug', 'page_id', 'page_slug', 'children'))); - if ($id || $page_id) { - if (!$id) { - $id = $page_id; - } - $posts = $json_api->introspector->get_posts(array( - 'page_id' => $id - )); - } else if ($slug || $page_slug) { - if (!$slug) { - $slug = $page_slug; - } - $posts = $json_api->introspector->get_posts(array( - 'pagename' => $slug - )); - } else { - $json_api->error("Include 'id' or 'slug' var in your request."); - } - - // Workaround for https://core.trac.wordpress.org/ticket/12647 - if (empty($posts)) { - $url = $_SERVER['REQUEST_URI']; - $parsed_url = parse_url($url); - $path = $parsed_url['path']; - if (preg_match('#^http://[^/]+(/.+)$#', get_bloginfo('url'), $matches)) { - $blog_root = $matches[1]; - $path = preg_replace("#^$blog_root#", '', $path); - } - if (substr($path, 0, 1) == '/') { - $path = substr($path, 1); - } - $posts = $json_api->introspector->get_posts(array('pagename' => $path)); - } - - if (count($posts) == 1) { - if (!empty($children)) { - $json_api->introspector->attach_child_posts($posts[0]); - } - return array( - 'page' => $posts[0] - ); - } else { - $json_api->error("Not found."); - } - } - - public function get_date_posts() { - global $json_api; - if ($json_api->query->date) { - $date = preg_replace('/\D/', '', $json_api->query->date); - if (!preg_match('/^\d{4}(\d{2})?(\d{2})?$/', $date)) { - $json_api->error("Specify a date var in one of 'YYYY' or 'YYYY-MM' or 'YYYY-MM-DD' formats."); - } - $request = array('year' => substr($date, 0, 4)); - if (strlen($date) > 4) { - $request['monthnum'] = (int) substr($date, 4, 2); - } - if (strlen($date) > 6) { - $request['day'] = (int) substr($date, 6, 2); - } - $posts = $json_api->introspector->get_posts($request); - } else { - $json_api->error("Include 'date' var in your request."); - } - return $this->posts_result($posts); - } - - public function get_category_posts() { - global $json_api; - $category = $json_api->introspector->get_current_category(); - if (!$category) { - $json_api->error("Not found."); - } - $posts = $json_api->introspector->get_posts(array( - 'cat' => $category->id - )); - return $this->posts_object_result($posts, $category); - } - - public function get_tag_posts() { - global $json_api; - $tag = $json_api->introspector->get_current_tag(); - if (!$tag) { - $json_api->error("Not found."); - } - $posts = $json_api->introspector->get_posts(array( - 'tag' => $tag->slug - )); - return $this->posts_object_result($posts, $tag); - } - - public function get_author_posts() { - global $json_api; - $author = $json_api->introspector->get_current_author(); - if (!$author) { - $json_api->error("Not found."); - } - $posts = $json_api->introspector->get_posts(array( - 'author' => $author->id - )); - return $this->posts_object_result($posts, $author); - } - - public function get_search_results() { - global $json_api; - if ($json_api->query->search) { - $posts = $json_api->introspector->get_posts(array( - 's' => $json_api->query->search - )); - } else { - $json_api->error("Include 'search' var in your request."); - } - return $this->posts_result($posts); - } - - public function get_date_index() { - global $json_api; - $permalinks = $json_api->introspector->get_date_archive_permalinks(); - $tree = $json_api->introspector->get_date_archive_tree($permalinks); - return array( - 'permalinks' => $permalinks, - 'tree' => $tree - ); - } - - public function get_category_index() { - global $json_api; - $args = null; - if (!empty($json_api->query->parent)) { - $args = array( - 'parent' => $json_api->query->parent - ); - } - $categories = $json_api->introspector->get_categories($args); - return array( - 'count' => count($categories), - 'categories' => $categories - ); - } - - public function get_tag_index() { - global $json_api; - $tags = $json_api->introspector->get_tags(); - return array( - 'count' => count($tags), - 'tags' => $tags - ); - } - - public function get_author_index() { - global $json_api; - $authors = $json_api->introspector->get_authors(); - return array( - 'count' => count($authors), - 'authors' => array_values($authors) - ); - } - - public function get_page_index() { - global $json_api; - $pages = array(); - $post_type = $json_api->query->post_type ? $json_api->query->post_type : 'page'; - - // Thanks to blinder for the fix! - $numberposts = empty($json_api->query->count) ? -1 : $json_api->query->count; - $wp_posts = get_posts(array( - 'post_type' => $post_type, - 'post_parent' => 0, - 'order' => 'ASC', - 'orderby' => 'menu_order', - 'numberposts' => $numberposts - )); - foreach ($wp_posts as $wp_post) { - $pages[] = new JSON_API_Post($wp_post); - } - foreach ($pages as $page) { - $json_api->introspector->attach_child_posts($page); - } - return array( - 'pages' => $pages - ); - } - - public function get_nonce() { - global $json_api; - extract($json_api->query->get(array('controller', 'method'))); - if ($controller && $method) { - $controller = strtolower($controller); - if (!in_array($controller, $json_api->get_controllers())) { - $json_api->error("Unknown controller '$controller'."); - } - require_once $json_api->controller_path($controller); - if (!method_exists($json_api->controller_class($controller), $method)) { - $json_api->error("Unknown method '$method'."); - } - $nonce_id = $json_api->get_nonce_id($controller, $method); - return array( - 'controller' => $controller, - 'method' => $method, - 'nonce' => wp_create_nonce($nonce_id) - ); - } else { - $json_api->error("Include 'controller' and 'method' vars in your request."); - } - } - - protected function get_object_posts($object, $id_var, $slug_var) { - global $json_api; - $object_id = "{$type}_id"; - $object_slug = "{$type}_slug"; - extract($json_api->query->get(array('id', 'slug', $object_id, $object_slug))); - if ($id || $$object_id) { - if (!$id) { - $id = $$object_id; - } - $posts = $json_api->introspector->get_posts(array( - $id_var => $id - )); - } else if ($slug || $$object_slug) { - if (!$slug) { - $slug = $$object_slug; - } - $posts = $json_api->introspector->get_posts(array( - $slug_var => $slug - )); - } else { - $json_api->error("No $type specified. Include 'id' or 'slug' var in your request."); - } - return $posts; - } - - protected function posts_result($posts) { - global $wp_query; - return array( - 'count' => count($posts), - 'count_total' => (int) $wp_query->found_posts, - 'pages' => $wp_query->max_num_pages, - 'posts' => $posts - ); - } - - protected function posts_object_result($posts, $object) { - global $wp_query; - // Convert something like "JSON_API_Category" into "category" - $object_key = strtolower(substr(get_class($object), 9)); - return array( - 'count' => count($posts), - 'pages' => (int) $wp_query->max_num_pages, - $object_key => $object, - 'posts' => $posts - ); - } - -} - -?> diff --git a/wp/wp-content/plugins/json-api/controllers/posts.php b/wp/wp-content/plugins/json-api/controllers/posts.php deleted file mode 100644 index e4f8dd79..00000000 --- a/wp/wp-content/plugins/json-api/controllers/posts.php +++ /dev/null @@ -1,85 +0,0 @@ -error("You need to login with a user that has 'edit_posts' capacity."); - } - if (!$json_api->query->nonce) { - $json_api->error("You must include a 'nonce' value to create posts. Use the `get_nonce` Core API method."); - } - $nonce_id = $json_api->get_nonce_id('posts', 'create_post'); - if (!wp_verify_nonce($json_api->query->nonce, $nonce_id)) { - $json_api->error("Your 'nonce' value was incorrect. Use the 'get_nonce' API method."); - } - nocache_headers(); - $post = new JSON_API_Post(); - $id = $post->create($_REQUEST); - if (empty($id)) { - $json_api->error("Could not create post."); - } - return array( - 'post' => $post - ); - } - - public function update_post() { - global $json_api; - $post = $json_api->introspector->get_current_post(); - if (empty($post)) { - $json_api->error("Post not found."); - } - if (!current_user_can('edit_post', $post->ID)) { - $json_api->error("You need to login with a user that has the 'edit_post' capacity for that post."); - } - if (!$json_api->query->nonce) { - $json_api->error("You must include a 'nonce' value to update posts. Use the `get_nonce` Core API method."); - } - $nonce_id = $json_api->get_nonce_id('posts', 'update_post'); - if (!wp_verify_nonce($json_api->query->nonce, $nonce_id)) { - $json_api->error("Your 'nonce' value was incorrect. Use the 'get_nonce' API method."); - } - nocache_headers(); - $post = new JSON_API_Post($post); - $post->update($_REQUEST); - return array( - 'post' => $post - ); - } - - public function delete_post() { - global $json_api; - $post = $json_api->introspector->get_current_post(); - if (empty($post)) { - $json_api->error("Post not found."); - } - if (!current_user_can('edit_post', $post->ID)) { - $json_api->error("You need to login with a user that has the 'edit_post' capacity for that post."); - } - if (!current_user_can('delete_posts')) { - $json_api->error("You need to login with a user that has the 'delete_posts' capacity."); - } - if ($post->post_author != get_current_user_id() && !current_user_can('delete_other_posts')) { - $json_api->error("You need to login with a user that has the 'delete_other_posts' capacity."); - } - if (!$json_api->query->nonce) { - $json_api->error("You must include a 'nonce' value to update posts. Use the `get_nonce` Core API method."); - } - $nonce_id = $json_api->get_nonce_id('posts', 'delete_post'); - if (!wp_verify_nonce($json_api->query->nonce, $nonce_id)) { - $json_api->error("Your 'nonce' value was incorrect. Use the 'get_nonce' API method."); - } - nocache_headers(); - wp_delete_post($post->ID); - return array(); - } - -} - -?> diff --git a/wp/wp-content/plugins/json-api/controllers/respond.php b/wp/wp-content/plugins/json-api/controllers/respond.php deleted file mode 100644 index 20ac91e0..00000000 --- a/wp/wp-content/plugins/json-api/controllers/respond.php +++ /dev/null @@ -1,27 +0,0 @@ -error("No post specified. Include 'post_id' var in your request."); - } else if (empty($_REQUEST['name']) || - empty($_REQUEST['email']) || - empty($_REQUEST['content'])) { - $json_api->error("Please include all required arguments (name, email, content)."); - } else if (!is_email($_REQUEST['email'])) { - $json_api->error("Please enter a valid email address."); - } - $pending = new JSON_API_Comment(); - return $pending->handle_submission(); - } - -} - -?> diff --git a/wp/wp-content/plugins/json-api/controllers/widgets.php b/wp/wp-content/plugins/json-api/controllers/widgets.php deleted file mode 100644 index 372c5bf8..00000000 --- a/wp/wp-content/plugins/json-api/controllers/widgets.php +++ /dev/null @@ -1,108 +0,0 @@ -error("No sidebar specified. Include 'sidebar_id' var in your request."); - } else if (!is_active_sidebar($index)) { - $json_api->error("Sidebar '$index' is not active."); - } - - $widget_params = array( - 'before_widget', - 'after_widget', - 'before_title', - 'after_title' - ); - $json_api_params = array(); - foreach ($widget_params as $param) { - if (isset($_REQUEST[$param])) { - $json_api_params[$param] = $_REQUEST[$param]; - } - } - - $widgets = array(); - - global $wp_registered_sidebars, $wp_registered_widgets; - - if ( is_int($index) ) { - $index = "sidebar-$index"; - } else { - $index = sanitize_title($index); - foreach ( (array) $wp_registered_sidebars as $key => $value ) { - if ( sanitize_title($value['name']) == $index ) { - $index = $key; - break; - } - } - } - - $sidebars_widgets = wp_get_sidebars_widgets(); - - if ( empty($wp_registered_sidebars[$index]) || !array_key_exists($index, $sidebars_widgets) || !is_array($sidebars_widgets[$index]) || empty($sidebars_widgets[$index]) ) - return false; - - $sidebar = $wp_registered_sidebars[$index]; - - $did_one = false; - foreach ( (array) $sidebars_widgets[$index] as $id ) { - - if ( !isset($wp_registered_widgets[$id]) ) continue; - - $params = array_merge( - array( array_merge( $sidebar, array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']), $json_api_params ) ), - (array) $wp_registered_widgets[$id]['params'] - ); - - - // Substitute HTML id and class attributes into before_widget - $classname_ = ''; - foreach ( (array) $wp_registered_widgets[$id]['classname'] as $cn ) { - if ( is_string($cn) ) - $classname_ .= '_' . $cn; - elseif ( is_object($cn) ) - $classname_ .= '_' . get_class($cn); - } - $classname_ = ltrim($classname_, '_'); - $params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $classname_); - - $params = apply_filters( 'dynamic_sidebar_params', $params ); - - $callback = $wp_registered_widgets[$id]['callback']; - - do_action( 'dynamic_sidebar', $wp_registered_widgets[$id] ); - - if ( is_callable($callback) ) { - ob_start(); - $object = $callback[0]; - $settings = $object->get_settings(); - $widget_params = $wp_registered_widgets[$id]['params']; - $number = $widget_params[0]['number']; - $instance = $settings[$number]; - call_user_func_array($callback, $params); - $widgets[] = array( - 'id' => $id, - 'widget' => trim(ob_get_contents()), - 'params' => $params[0], - 'instance' => $instance - ); - ob_end_clean(); - } - } - - return array( - 'sidebar_id' => $index, - 'widgets' => $widgets - ); - } - -} - -?> diff --git a/wp/wp-content/plugins/json-api/json-api.php b/wp/wp-content/plugins/json-api/json-api.php deleted file mode 100644 index 7667708c..00000000 --- a/wp/wp-content/plugins/json-api/json-api.php +++ /dev/null @@ -1,83 +0,0 @@ -

Sorry, JSON API requires PHP version 5.0 or greater.

"; -} - -function json_api_class_warning() { - echo "

Oops, JSON_API class not found. If you've defined a JSON_API_DIR constant, double check that the path is correct.

"; -} - -function json_api_activation() { - // Add the rewrite rule on activation - global $wp_rewrite; - add_filter('rewrite_rules_array', 'json_api_rewrites'); - $wp_rewrite->flush_rules(); -} - -function json_api_deactivation() { - // Remove the rewrite rule on deactivation - global $wp_rewrite; - $wp_rewrite->flush_rules(); -} - -function json_api_rewrites($wp_rules) { - $base = get_option('json_api_base', 'api'); - if (empty($base)) { - return $wp_rules; - } - $json_api_rules = array( - "$base\$" => 'index.php?json=info', - "$base/(.+)\$" => 'index.php?json=$matches[1]' - ); - return array_merge($json_api_rules, $wp_rules); -} - -function json_api_dir() { - if (defined('JSON_API_DIR') && file_exists(JSON_API_DIR)) { - return JSON_API_DIR; - } else { - return dirname(__FILE__); - } -} - -// Add initialization and activation hooks -add_action('init', 'json_api_init'); -register_activation_hook("$dir/json-api.php", 'json_api_activation'); -register_deactivation_hook("$dir/json-api.php", 'json_api_deactivation'); - -?> diff --git a/wp/wp-content/plugins/json-api/library/JSON.php b/wp/wp-content/plugins/json-api/library/JSON.php deleted file mode 100644 index 8dc8a6f0..00000000 --- a/wp/wp-content/plugins/json-api/library/JSON.php +++ /dev/null @@ -1,933 +0,0 @@ - - * @author Matt Knapp - * @author Brett Stimmerman - * @copyright 2005 Michal Migurski - * @version CVS: $Id: JSON.php 305040 2010-11-02 23:19:03Z alan_k $ - * @license http://www.opensource.org/licenses/bsd-license.php - * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 - */ - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_SLICE', 1); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_STR', 2); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_ARR', 3); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_OBJ', 4); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_CMT', 5); - -/** - * Behavior switch for Services_JSON::decode() - */ -define('SERVICES_JSON_LOOSE_TYPE', 16); - -/** - * Behavior switch for Services_JSON::decode() - */ -define('SERVICES_JSON_SUPPRESS_ERRORS', 32); - -/** - * Behavior switch for Services_JSON::decode() - */ -define('SERVICES_JSON_USE_TO_JSON', 64); - -/** - * Converts to and from JSON format. - * - * Brief example of use: - * - * - * // create a new instance of Services_JSON - * $json = new Services_JSON(); - * - * // convert a complexe value to JSON notation, and send it to the browser - * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); - * $output = $json->encode($value); - * - * print($output); - * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] - * - * // accept incoming POST data, assumed to be in JSON notation - * $input = file_get_contents('php://input', 1000000); - * $value = $json->decode($input); - * - */ -class Services_JSON -{ - /** - * constructs a new JSON instance - * - * @param int $use object behavior flags; combine with boolean-OR - * - * possible values: - * - SERVICES_JSON_LOOSE_TYPE: loose typing. - * "{...}" syntax creates associative arrays - * instead of objects in decode(). - * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. - * Values which can't be encoded (e.g. resources) - * appear as NULL instead of throwing errors. - * By default, a deeply-nested resource will - * bubble up with an error, so all return values - * from encode() should be checked with isError() - * - SERVICES_JSON_USE_TO_JSON: call toJSON when serializing objects - * It serializes the return value from the toJSON call rather - * than the object it'self, toJSON can return associative arrays, - * strings or numbers, if you return an object, make sure it does - * not have a toJSON method, otherwise an error will occur. - */ - function Services_JSON($use = 0) - { - $this->use = $use; - $this->_mb_strlen = function_exists('mb_strlen'); - $this->_mb_convert_encoding = function_exists('mb_convert_encoding'); - $this->_mb_substr = function_exists('mb_substr'); - } - // private - cache the mbstring lookup results.. - var $_mb_strlen = false; - var $_mb_substr = false; - var $_mb_convert_encoding = false; - - /** - * convert a string from one UTF-16 char to one UTF-8 char - * - * Normally should be handled by mb_convert_encoding, but - * provides a slower PHP-only method for installations - * that lack the multibye string extension. - * - * @param string $utf16 UTF-16 character - * @return string UTF-8 character - * @access private - */ - function utf162utf8($utf16) - { - // oh please oh please oh please oh please oh please - if($this->_mb_convert_encoding) { - return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); - } - - $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); - - switch(true) { - case ((0x7F & $bytes) == $bytes): - // this case should never be reached, because we are in ASCII range - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0x7F & $bytes); - - case (0x07FF & $bytes) == $bytes: - // return a 2-byte UTF-8 character - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0xC0 | (($bytes >> 6) & 0x1F)) - . chr(0x80 | ($bytes & 0x3F)); - - case (0xFFFF & $bytes) == $bytes: - // return a 3-byte UTF-8 character - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0xE0 | (($bytes >> 12) & 0x0F)) - . chr(0x80 | (($bytes >> 6) & 0x3F)) - . chr(0x80 | ($bytes & 0x3F)); - } - - // ignoring UTF-32 for now, sorry - return ''; - } - - /** - * convert a string from one UTF-8 char to one UTF-16 char - * - * Normally should be handled by mb_convert_encoding, but - * provides a slower PHP-only method for installations - * that lack the multibye string extension. - * - * @param string $utf8 UTF-8 character - * @return string UTF-16 character - * @access private - */ - function utf82utf16($utf8) - { - // oh please oh please oh please oh please oh please - if($this->_mb_convert_encoding) { - return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); - } - - switch($this->strlen8($utf8)) { - case 1: - // this case should never be reached, because we are in ASCII range - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return $utf8; - - case 2: - // return a UTF-16 character from a 2-byte UTF-8 char - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0x07 & (ord($utf8{0}) >> 2)) - . chr((0xC0 & (ord($utf8{0}) << 6)) - | (0x3F & ord($utf8{1}))); - - case 3: - // return a UTF-16 character from a 3-byte UTF-8 char - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr((0xF0 & (ord($utf8{0}) << 4)) - | (0x0F & (ord($utf8{1}) >> 2))) - . chr((0xC0 & (ord($utf8{1}) << 6)) - | (0x7F & ord($utf8{2}))); - } - - // ignoring UTF-32 for now, sorry - return ''; - } - - /** - * encodes an arbitrary variable into JSON format (and sends JSON Header) - * - * @param mixed $var any number, boolean, string, array, or object to be encoded. - * see argument 1 to Services_JSON() above for array-parsing behavior. - * if var is a strng, note that encode() always expects it - * to be in ASCII or UTF-8 format! - * - * @return mixed JSON string representation of input var or an error if a problem occurs - * @access public - */ - function encode($var) - { - header('Content-type: application/json'); - return $this->encodeUnsafe($var); - } - /** - * encodes an arbitrary variable into JSON format without JSON Header - warning - may allow XSS!!!!) - * - * @param mixed $var any number, boolean, string, array, or object to be encoded. - * see argument 1 to Services_JSON() above for array-parsing behavior. - * if var is a strng, note that encode() always expects it - * to be in ASCII or UTF-8 format! - * - * @return mixed JSON string representation of input var or an error if a problem occurs - * @access public - */ - function encodeUnsafe($var) - { - // see bug #16908 - regarding numeric locale printing - $lc = setlocale(LC_NUMERIC, 0); - setlocale(LC_NUMERIC, 'C'); - $ret = $this->_encode($var); - setlocale(LC_NUMERIC, $lc); - return $ret; - - } - /** - * PRIVATE CODE that does the work of encodes an arbitrary variable into JSON format - * - * @param mixed $var any number, boolean, string, array, or object to be encoded. - * see argument 1 to Services_JSON() above for array-parsing behavior. - * if var is a strng, note that encode() always expects it - * to be in ASCII or UTF-8 format! - * - * @return mixed JSON string representation of input var or an error if a problem occurs - * @access public - */ - function _encode($var) - { - - switch (gettype($var)) { - case 'boolean': - return $var ? 'true' : 'false'; - - case 'NULL': - return 'null'; - - case 'integer': - return (int) $var; - - case 'double': - case 'float': - return (float) $var; - - case 'string': - // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT - $ascii = ''; - $strlen_var = $this->strlen8($var); - - /* - * Iterate over every character in the string, - * escaping with a slash or encoding to UTF-8 where necessary - */ - for ($c = 0; $c < $strlen_var; ++$c) { - - $ord_var_c = ord($var{$c}); - - switch (true) { - case $ord_var_c == 0x08: - $ascii .= '\b'; - break; - case $ord_var_c == 0x09: - $ascii .= '\t'; - break; - case $ord_var_c == 0x0A: - $ascii .= '\n'; - break; - case $ord_var_c == 0x0C: - $ascii .= '\f'; - break; - case $ord_var_c == 0x0D: - $ascii .= '\r'; - break; - - case $ord_var_c == 0x22: - case $ord_var_c == 0x2F: - case $ord_var_c == 0x5C: - // double quote, slash, slosh - $ascii .= '\\'.$var{$c}; - break; - - case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): - // characters U-00000000 - U-0000007F (same as ASCII) - $ascii .= $var{$c}; - break; - - case (($ord_var_c & 0xE0) == 0xC0): - // characters U-00000080 - U-000007FF, mask 110XXXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - if ($c+1 >= $strlen_var) { - $c += 1; - $ascii .= '?'; - break; - } - - $char = pack('C*', $ord_var_c, ord($var{$c + 1})); - $c += 1; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xF0) == 0xE0): - if ($c+2 >= $strlen_var) { - $c += 2; - $ascii .= '?'; - break; - } - // characters U-00000800 - U-0000FFFF, mask 1110XXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - @ord($var{$c + 1}), - @ord($var{$c + 2})); - $c += 2; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xF8) == 0xF0): - if ($c+3 >= $strlen_var) { - $c += 3; - $ascii .= '?'; - break; - } - // characters U-00010000 - U-001FFFFF, mask 11110XXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3})); - $c += 3; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xFC) == 0xF8): - // characters U-00200000 - U-03FFFFFF, mask 111110XX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - if ($c+4 >= $strlen_var) { - $c += 4; - $ascii .= '?'; - break; - } - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3}), - ord($var{$c + 4})); - $c += 4; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xFE) == 0xFC): - if ($c+5 >= $strlen_var) { - $c += 5; - $ascii .= '?'; - break; - } - // characters U-04000000 - U-7FFFFFFF, mask 1111110X - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3}), - ord($var{$c + 4}), - ord($var{$c + 5})); - $c += 5; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - } - } - return '"'.$ascii.'"'; - - case 'array': - /* - * As per JSON spec if any array key is not an integer - * we must treat the the whole array as an object. We - * also try to catch a sparsely populated associative - * array with numeric keys here because some JS engines - * will create an array with empty indexes up to - * max_index which can cause memory issues and because - * the keys, which may be relevant, will be remapped - * otherwise. - * - * As per the ECMA and JSON specification an object may - * have any string as a property. Unfortunately due to - * a hole in the ECMA specification if the key is a - * ECMA reserved word or starts with a digit the - * parameter is only accessible using ECMAScript's - * bracket notation. - */ - - // treat as a JSON object - if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { - $properties = array_map(array($this, 'name_value'), - array_keys($var), - array_values($var)); - - foreach($properties as $property) { - if(Services_JSON::isError($property)) { - return $property; - } - } - - return '{' . join(',', $properties) . '}'; - } - - // treat it like a regular array - $elements = array_map(array($this, '_encode'), $var); - - foreach($elements as $element) { - if(Services_JSON::isError($element)) { - return $element; - } - } - - return '[' . join(',', $elements) . ']'; - - case 'object': - - // support toJSON methods. - if (($this->use & SERVICES_JSON_USE_TO_JSON) && method_exists($var, 'toJSON')) { - // this may end up allowing unlimited recursion - // so we check the return value to make sure it's not got the same method. - $recode = $var->toJSON(); - - if (method_exists($recode, 'toJSON')) { - - return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) - ? 'null' - : new Services_JSON_Error(class_name($var). - " toJSON returned an object with a toJSON method."); - - } - - return $this->_encode( $recode ); - } - - $vars = get_object_vars($var); - - $properties = array_map(array($this, 'name_value'), - array_keys($vars), - array_values($vars)); - - foreach($properties as $property) { - if(Services_JSON::isError($property)) { - return $property; - } - } - - return '{' . join(',', $properties) . '}'; - - default: - return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) - ? 'null' - : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); - } - } - - /** - * array-walking function for use in generating JSON-formatted name-value pairs - * - * @param string $name name of key to use - * @param mixed $value reference to an array element to be encoded - * - * @return string JSON-formatted name-value pair, like '"name":value' - * @access private - */ - function name_value($name, $value) - { - $encoded_value = $this->_encode($value); - - if(Services_JSON::isError($encoded_value)) { - return $encoded_value; - } - - return $this->_encode(strval($name)) . ':' . $encoded_value; - } - - /** - * reduce a string by removing leading and trailing comments and whitespace - * - * @param $str string string value to strip of comments and whitespace - * - * @return string string value stripped of comments and whitespace - * @access private - */ - function reduce_string($str) - { - $str = preg_replace(array( - - // eliminate single line comments in '// ...' form - '#^\s*//(.+)$#m', - - // eliminate multi-line comments in '/* ... */' form, at start of string - '#^\s*/\*(.+)\*/#Us', - - // eliminate multi-line comments in '/* ... */' form, at end of string - '#/\*(.+)\*/\s*$#Us' - - ), '', $str); - - // eliminate extraneous space - return trim($str); - } - - /** - * decodes a JSON string into appropriate variable - * - * @param string $str JSON-formatted string - * - * @return mixed number, boolean, string, array, or object - * corresponding to given JSON input string. - * See argument 1 to Services_JSON() above for object-output behavior. - * Note that decode() always returns strings - * in ASCII or UTF-8 format! - * @access public - */ - function decode($str) - { - $str = $this->reduce_string($str); - - switch (strtolower($str)) { - case 'true': - return true; - - case 'false': - return false; - - case 'null': - return null; - - default: - $m = array(); - - if (is_numeric($str)) { - // Lookie-loo, it's a number - - // This would work on its own, but I'm trying to be - // good about returning integers where appropriate: - // return (float)$str; - - // Return float or int, as appropriate - return ((float)$str == (integer)$str) - ? (integer)$str - : (float)$str; - - } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { - // STRINGS RETURNED IN UTF-8 FORMAT - $delim = $this->substr8($str, 0, 1); - $chrs = $this->substr8($str, 1, -1); - $utf8 = ''; - $strlen_chrs = $this->strlen8($chrs); - - for ($c = 0; $c < $strlen_chrs; ++$c) { - - $substr_chrs_c_2 = $this->substr8($chrs, $c, 2); - $ord_chrs_c = ord($chrs{$c}); - - switch (true) { - case $substr_chrs_c_2 == '\b': - $utf8 .= chr(0x08); - ++$c; - break; - case $substr_chrs_c_2 == '\t': - $utf8 .= chr(0x09); - ++$c; - break; - case $substr_chrs_c_2 == '\n': - $utf8 .= chr(0x0A); - ++$c; - break; - case $substr_chrs_c_2 == '\f': - $utf8 .= chr(0x0C); - ++$c; - break; - case $substr_chrs_c_2 == '\r': - $utf8 .= chr(0x0D); - ++$c; - break; - - case $substr_chrs_c_2 == '\\"': - case $substr_chrs_c_2 == '\\\'': - case $substr_chrs_c_2 == '\\\\': - case $substr_chrs_c_2 == '\\/': - if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || - ($delim == "'" && $substr_chrs_c_2 != '\\"')) { - $utf8 .= $chrs{++$c}; - } - break; - - case preg_match('/\\\u[0-9A-F]{4}/i', $this->substr8($chrs, $c, 6)): - // single, escaped unicode character - $utf16 = chr(hexdec($this->substr8($chrs, ($c + 2), 2))) - . chr(hexdec($this->substr8($chrs, ($c + 4), 2))); - $utf8 .= $this->utf162utf8($utf16); - $c += 5; - break; - - case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): - $utf8 .= $chrs{$c}; - break; - - case ($ord_chrs_c & 0xE0) == 0xC0: - // characters U-00000080 - U-000007FF, mask 110XXXXX - //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= $this->substr8($chrs, $c, 2); - ++$c; - break; - - case ($ord_chrs_c & 0xF0) == 0xE0: - // characters U-00000800 - U-0000FFFF, mask 1110XXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= $this->substr8($chrs, $c, 3); - $c += 2; - break; - - case ($ord_chrs_c & 0xF8) == 0xF0: - // characters U-00010000 - U-001FFFFF, mask 11110XXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= $this->substr8($chrs, $c, 4); - $c += 3; - break; - - case ($ord_chrs_c & 0xFC) == 0xF8: - // characters U-00200000 - U-03FFFFFF, mask 111110XX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= $this->substr8($chrs, $c, 5); - $c += 4; - break; - - case ($ord_chrs_c & 0xFE) == 0xFC: - // characters U-04000000 - U-7FFFFFFF, mask 1111110X - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= $this->substr8($chrs, $c, 6); - $c += 5; - break; - - } - - } - - return $utf8; - - } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { - // array, or object notation - - if ($str{0} == '[') { - $stk = array(SERVICES_JSON_IN_ARR); - $arr = array(); - } else { - if ($this->use & SERVICES_JSON_LOOSE_TYPE) { - $stk = array(SERVICES_JSON_IN_OBJ); - $obj = array(); - } else { - $stk = array(SERVICES_JSON_IN_OBJ); - $obj = new stdClass(); - } - } - - array_push($stk, array('what' => SERVICES_JSON_SLICE, - 'where' => 0, - 'delim' => false)); - - $chrs = $this->substr8($str, 1, -1); - $chrs = $this->reduce_string($chrs); - - if ($chrs == '') { - if (reset($stk) == SERVICES_JSON_IN_ARR) { - return $arr; - - } else { - return $obj; - - } - } - - //print("\nparsing {$chrs}\n"); - - $strlen_chrs = $this->strlen8($chrs); - - for ($c = 0; $c <= $strlen_chrs; ++$c) { - - $top = end($stk); - $substr_chrs_c_2 = $this->substr8($chrs, $c, 2); - - if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { - // found a comma that is not inside a string, array, etc., - // OR we've reached the end of the character list - $slice = $this->substr8($chrs, $top['where'], ($c - $top['where'])); - array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); - //print("Found split at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - if (reset($stk) == SERVICES_JSON_IN_ARR) { - // we are in an array, so just push an element onto the stack - array_push($arr, $this->decode($slice)); - - } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { - // we are in an object, so figure - // out the property name and set an - // element in an associative array, - // for now - $parts = array(); - - if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:/Uis', $slice, $parts)) { - // "name":value pair - $key = $this->decode($parts[1]); - $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B")); - if ($this->use & SERVICES_JSON_LOOSE_TYPE) { - $obj[$key] = $val; - } else { - $obj->$key = $val; - } - } elseif (preg_match('/^\s*(\w+)\s*:/Uis', $slice, $parts)) { - // name:value pair, where name is unquoted - $key = $parts[1]; - $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B")); - - if ($this->use & SERVICES_JSON_LOOSE_TYPE) { - $obj[$key] = $val; - } else { - $obj->$key = $val; - } - } - - } - - } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { - // found a quote, and we are not inside a string - array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); - //print("Found start of string at {$c}\n"); - - } elseif (($chrs{$c} == $top['delim']) && - ($top['what'] == SERVICES_JSON_IN_STR) && - (($this->strlen8($this->substr8($chrs, 0, $c)) - $this->strlen8(rtrim($this->substr8($chrs, 0, $c), '\\'))) % 2 != 1)) { - // found a quote, we're in a string, and it's not escaped - // we know that it's not escaped becase there is _not_ an - // odd number of backslashes at the end of the string so far - array_pop($stk); - //print("Found end of string at {$c}: ".$this->substr8($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); - - } elseif (($chrs{$c} == '[') && - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { - // found a left-bracket, and we are in an array, object, or slice - array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); - //print("Found start of array at {$c}\n"); - - } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { - // found a right-bracket, and we're in an array - array_pop($stk); - //print("Found end of array at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } elseif (($chrs{$c} == '{') && - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { - // found a left-brace, and we are in an array, object, or slice - array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); - //print("Found start of object at {$c}\n"); - - } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { - // found a right-brace, and we're in an object - array_pop($stk); - //print("Found end of object at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } elseif (($substr_chrs_c_2 == '/*') && - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { - // found a comment start, and we are in an array, object, or slice - array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); - $c++; - //print("Found start of comment at {$c}\n"); - - } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { - // found a comment end, and we're in one now - array_pop($stk); - $c++; - - for ($i = $top['where']; $i <= $c; ++$i) - $chrs = substr_replace($chrs, ' ', $i, 1); - - //print("Found end of comment at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } - - } - - if (reset($stk) == SERVICES_JSON_IN_ARR) { - return $arr; - - } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { - return $obj; - - } - - } - } - } - - /** - * @todo Ultimately, this should just call PEAR::isError() - */ - function isError($data, $code = null) - { - if (class_exists('pear')) { - return PEAR::isError($data, $code); - } elseif (is_object($data) && (get_class($data) == 'services_json_error' || - is_subclass_of($data, 'services_json_error'))) { - return true; - } - - return false; - } - - /** - * Calculates length of string in bytes - * @param string - * @return integer length - */ - function strlen8( $str ) - { - if ( $this->_mb_strlen ) { - return mb_strlen( $str, "8bit" ); - } - return strlen( $str ); - } - - /** - * Returns part of a string, interpreting $start and $length as number of bytes. - * @param string - * @param integer start - * @param integer length - * @return integer length - */ - function substr8( $string, $start, $length=false ) - { - if ( $length === false ) { - $length = $this->strlen8( $string ) - $start; - } - if ( $this->_mb_substr ) { - return mb_substr( $string, $start, $length, "8bit" ); - } - return substr( $string, $start, $length ); - } - -} - -if (class_exists('PEAR_Error')) { - - class Services_JSON_Error extends PEAR_Error - { - function Services_JSON_Error($message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null) - { - parent::PEAR_Error($message, $code, $mode, $options, $userinfo); - } - } - -} else { - - /** - * @todo Ultimately, this class shall be descended from PEAR_Error - */ - class Services_JSON_Error - { - function Services_JSON_Error($message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null) - { - - } - } - -} diff --git a/wp/wp-content/plugins/json-api/models/attachment.php b/wp/wp-content/plugins/json-api/models/attachment.php deleted file mode 100644 index 824fa45c..00000000 --- a/wp/wp-content/plugins/json-api/models/attachment.php +++ /dev/null @@ -1,52 +0,0 @@ -import_wp_object($wp_attachment); - if ($this->is_image()) { - $this->query_images(); - } - } - } - - function import_wp_object($wp_attachment) { - $this->id = (int) $wp_attachment->ID; - $this->url = $wp_attachment->guid; - $this->slug = $wp_attachment->post_name; - $this->title = $wp_attachment->post_title; - $this->description = $wp_attachment->post_content; - $this->caption = $wp_attachment->post_excerpt; - $this->parent = (int) $wp_attachment->post_parent; - $this->mime_type = $wp_attachment->post_mime_type; - } - - function is_image() { - return (substr($this->mime_type, 0, 5) == 'image'); - } - - function query_images() { - $metadata = wp_get_attachment_metadata($this->id); - $img_base_url = str_replace(wp_basename($this->url), "", $this->url); - foreach($metadata['sizes'] as $key => $value) { - $this->images[$key] = (object) array( - 'url' => $img_base_url.$value['file'], - 'width' => $value['width'], - 'height' => $value['height'] - ); - } - } - -} - -?> diff --git a/wp/wp-content/plugins/json-api/models/author.php b/wp/wp-content/plugins/json-api/models/author.php deleted file mode 100644 index ae399c13..00000000 --- a/wp/wp-content/plugins/json-api/models/author.php +++ /dev/null @@ -1,62 +0,0 @@ -id = (int) $id; - } else { - $this->id = (int) get_the_author_meta('ID'); - } - $this->set_value('slug', 'user_nicename'); - $this->set_value('name', 'display_name'); - $this->set_value('first_name', 'first_name'); - $this->set_value('last_name', 'last_name'); - $this->set_value('nickname', 'nickname'); - $this->set_value('url', 'user_url'); - $this->set_value('description', 'description'); - $this->set_author_meta(); - //$this->raw = get_userdata($this->id); - } - - function set_value($key, $wp_key = false) { - if (!$wp_key) { - $wp_key = $key; - } - $this->$key = get_the_author_meta($wp_key, $this->id); - } - - function set_author_meta() { - global $json_api; - if (!$json_api->query->author_meta) { - return; - } - $protected_vars = array( - 'user_login', - 'user_pass', - 'user_email', - 'user_activation_key' - ); - $vars = explode(',', $json_api->query->author_meta); - $vars = array_diff($vars, $protected_vars); - foreach ($vars as $var) { - $this->set_value($var); - } - } - -} - -?> diff --git a/wp/wp-content/plugins/json-api/models/category.php b/wp/wp-content/plugins/json-api/models/category.php deleted file mode 100644 index 499373ed..00000000 --- a/wp/wp-content/plugins/json-api/models/category.php +++ /dev/null @@ -1,29 +0,0 @@ -import_wp_object($wp_category); - } - } - - function import_wp_object($wp_category) { - $this->id = (int) $wp_category->term_id; - $this->slug = $wp_category->slug; - $this->title = $wp_category->name; - $this->description = $wp_category->description; - $this->parent = (int) $wp_category->parent; - $this->post_count = (int) $wp_category->count; - } - -} - -?> diff --git a/wp/wp-content/plugins/json-api/models/comment.php b/wp/wp-content/plugins/json-api/models/comment.php deleted file mode 100644 index 690dbba2..00000000 --- a/wp/wp-content/plugins/json-api/models/comment.php +++ /dev/null @@ -1,80 +0,0 @@ -import_wp_object($wp_comment); - } - } - - function import_wp_object($wp_comment) { - global $json_api; - - $date_format = $json_api->query->date_format; - $content = apply_filters('comment_text', $wp_comment->comment_content); - - $this->id = (int) $wp_comment->comment_ID; - $this->name = $wp_comment->comment_author; - $this->url = $wp_comment->comment_author_url; - $this->date = date($date_format, strtotime($wp_comment->comment_date)); - $this->content = $content; - $this->parent = (int) $wp_comment->comment_parent; - //$this->raw = $wp_comment; - - if (!empty($wp_comment->user_id)) { - $this->author = new JSON_API_Author($wp_comment->user_id); - } else { - unset($this->author); - } - } - - function handle_submission() { - global $comment, $wpdb; - add_action('comment_id_not_found', array(&$this, 'comment_id_not_found')); - add_action('comment_closed', array(&$this, 'comment_closed')); - add_action('comment_on_draft', array(&$this, 'comment_on_draft')); - add_filter('comment_post_redirect', array(&$this, 'comment_post_redirect')); - $_SERVER['REQUEST_METHOD'] = 'POST'; - $_POST['comment_post_ID'] = $_REQUEST['post_id']; - $_POST['author'] = $_REQUEST['name']; - $_POST['email'] = $_REQUEST['email']; - $_POST['url'] = empty($_REQUEST['url']) ? '' : $_REQUEST['url']; - $_POST['comment'] = $_REQUEST['content']; - $_POST['parent'] = $_REQUEST['parent']; - include ABSPATH . 'wp-comments-post.php'; - } - - function comment_id_not_found() { - global $json_api; - $json_api->error("Post ID '{$_REQUEST['post_id']}' not found."); - } - - function comment_closed() { - global $json_api; - $json_api->error("Post is closed for comments."); - } - - function comment_on_draft() { - global $json_api; - $json_api->error("You cannot comment on unpublished posts."); - } - - function comment_post_redirect() { - global $comment, $json_api; - $status = ($comment->comment_approved) ? 'ok' : 'pending'; - $new_comment = new JSON_API_Comment($comment); - $json_api->response->respond($new_comment, $status); - } - -} - -?> diff --git a/wp/wp-content/plugins/json-api/models/post.php b/wp/wp-content/plugins/json-api/models/post.php deleted file mode 100644 index aa427624..00000000 --- a/wp/wp-content/plugins/json-api/models/post.php +++ /dev/null @@ -1,319 +0,0 @@ -import_wp_object($wp_post); - } - do_action("json_api_{$this->type}_constructor", $this); - } - - function create($values = null) { - unset($values['id']); - if (empty($values) || empty($values['title'])) { - $values = array( - 'title' => 'Untitled', - 'content' => '' - ); - } - return $this->save($values); - } - - function update($values) { - $values['id'] = $this->id; - return $this->save($values); - } - - function save($values = null) { - global $json_api, $user_ID; - - $wp_values = array(); - - if (!empty($values['id'])) { - $wp_values['ID'] = $values['id']; - } - - if (!empty($values['type'])) { - $wp_values['post_type'] = $values['type']; - } - - if (!empty($values['status'])) { - $wp_values['post_status'] = $values['status']; - } - - if (!empty($values['title'])) { - $wp_values['post_title'] = $values['title']; - } - - if (!empty($values['content'])) { - $wp_values['post_content'] = $values['content']; - } - - if (!empty($values['author'])) { - $author = $json_api->introspector->get_author_by_login($values['author']); - $wp_values['post_author'] = $author->id; - } - - if (isset($values['categories'])) { - $categories = explode(',', $values['categories']); - foreach ($categories as $category_slug) { - $category_slug = trim($category_slug); - $category = $json_api->introspector->get_category_by_slug($category_slug); - if (empty($wp_values['post_category'])) { - $wp_values['post_category'] = array($category->id); - } else { - array_push($wp_values['post_category'], $category->id); - } - } - } - - if (isset($values['tags'])) { - $tags = explode(',', $values['tags']); - foreach ($tags as $tag_slug) { - $tag_slug = trim($tag_slug); - if (empty($wp_values['tags_input'])) { - $wp_values['tags_input'] = array($tag_slug); - } else { - array_push($wp_values['tags_input'], $tag_slug); - } - } - } - - if (isset($wp_values['ID'])) { - $this->id = wp_update_post($wp_values); - } else { - $this->id = wp_insert_post($wp_values); - } - - if (!empty($_FILES['attachment'])) { - include_once ABSPATH . '/wp-admin/includes/file.php'; - include_once ABSPATH . '/wp-admin/includes/media.php'; - include_once ABSPATH . '/wp-admin/includes/image.php'; - $attachment_id = media_handle_upload('attachment', $this->id); - $this->attachments[] = new JSON_API_Attachment($attachment_id); - unset($_FILES['attachment']); - } - - $wp_post = get_post($this->id); - $this->import_wp_object($wp_post); - - return $this->id; - } - - function import_wp_object($wp_post) { - global $json_api, $post; - $date_format = $json_api->query->date_format; - $this->id = (int) $wp_post->ID; - setup_postdata($wp_post); - $this->set_value('type', $wp_post->post_type); - $this->set_value('slug', $wp_post->post_name); - $this->set_value('url', get_permalink($this->id)); - $this->set_value('status', $wp_post->post_status); - $this->set_value('title', get_the_title($this->id)); - $this->set_value('title_plain', strip_tags(@$this->title)); - $this->set_content_value(); - $this->set_value('excerpt', apply_filters('the_excerpt', get_the_excerpt())); - $this->set_value('date', get_the_time($date_format)); - $this->set_value('modified', date($date_format, strtotime($wp_post->post_modified))); - $this->set_categories_value(); - $this->set_tags_value(); - $this->set_author_value($wp_post->post_author); - $this->set_comments_value(); - $this->set_attachments_value(); - $this->set_value('comment_count', (int) $wp_post->comment_count); - $this->set_value('comment_status', $wp_post->comment_status); - $this->set_thumbnail_value(); - $this->set_custom_fields_value(); - $this->set_custom_taxonomies($wp_post->post_type); - do_action("json_api_import_wp_post", $this, $wp_post); - } - - function set_value($key, $value) { - global $json_api; - if ($json_api->include_value($key)) { - $this->$key = $value; - } else { - unset($this->$key); - } - } - - function set_content_value() { - global $json_api; - if ($json_api->include_value('content')) { - $content = get_the_content($json_api->query->read_more); - $content = apply_filters('the_content', $content); - $content = str_replace(']]>', ']]>', $content); - $this->content = $content; - } else { - unset($this->content); - } - } - - function set_categories_value() { - global $json_api; - if ($json_api->include_value('categories')) { - $this->categories = array(); - if ($wp_categories = get_the_category($this->id)) { - foreach ($wp_categories as $wp_category) { - $category = new JSON_API_Category($wp_category); - if ($category->id == 1 && $category->slug == 'uncategorized') { - // Skip the 'uncategorized' category - continue; - } - $this->categories[] = $category; - } - } - } else { - unset($this->categories); - } - } - - function set_tags_value() { - global $json_api; - if ($json_api->include_value('tags')) { - $this->tags = array(); - if ($wp_tags = get_the_tags($this->id)) { - foreach ($wp_tags as $wp_tag) { - $this->tags[] = new JSON_API_Tag($wp_tag); - } - } - } else { - unset($this->tags); - } - } - - function set_author_value($author_id) { - global $json_api; - if ($json_api->include_value('author')) { - $this->author = new JSON_API_Author($author_id); - } else { - unset($this->author); - } - } - - function set_comments_value() { - global $json_api; - if ($json_api->include_value('comments')) { - $this->comments = $json_api->introspector->get_comments($this->id); - } else { - unset($this->comments); - } - } - - function set_attachments_value() { - global $json_api; - if ($json_api->include_value('attachments')) { - $this->attachments = $json_api->introspector->get_attachments($this->id); - } else { - unset($this->attachments); - } - } - - function set_thumbnail_value() { - global $json_api; - if (!$json_api->include_value('thumbnail') || - !function_exists('get_post_thumbnail_id')) { - unset($this->thumbnail); - return; - } - $attachment_id = get_post_thumbnail_id($this->id); - if (!$attachment_id) { - unset($this->thumbnail); - return; - } - $thumbnail_size = $this->get_thumbnail_size(); - $this->thumbnail_size = $thumbnail_size; - $attachment = $json_api->introspector->get_attachment($attachment_id); - $image = $attachment->images[$thumbnail_size]; - $this->thumbnail = $image->url; - $this->thumbnail_images = $attachment->images; - } - - function set_custom_fields_value() { - global $json_api; - if ($json_api->include_value('custom_fields')) { - $wp_custom_fields = get_post_custom($this->id); - $this->custom_fields = new stdClass(); - if ($json_api->query->custom_fields) { - $keys = explode(',', $json_api->query->custom_fields); - } - foreach ($wp_custom_fields as $key => $value) { - if ($json_api->query->custom_fields) { - if (in_array($key, $keys)) { - $this->custom_fields->$key = $wp_custom_fields[$key]; - } - } else if (substr($key, 0, 1) != '_') { - $this->custom_fields->$key = $wp_custom_fields[$key]; - } - } - } else { - unset($this->custom_fields); - } - } - - function set_custom_taxonomies($type) { - global $json_api; - $taxonomies = get_taxonomies(array( - 'object_type' => array($type), - 'public' => true, - '_builtin' => false - ), 'objects'); - foreach ($taxonomies as $taxonomy_id => $taxonomy) { - $taxonomy_key = "taxonomy_$taxonomy_id"; - if (!$json_api->include_value($taxonomy_key)) { - continue; - } - $taxonomy_class = $taxonomy->hierarchical ? 'JSON_API_Category' : 'JSON_API_Tag'; - $terms = get_the_terms($this->id, $taxonomy_id); - $this->$taxonomy_key = array(); - if (!empty($terms)) { - $taxonomy_terms = array(); - foreach ($terms as $term) { - $taxonomy_terms[] = new $taxonomy_class($term); - } - $this->$taxonomy_key = $taxonomy_terms; - } - } - } - - function get_thumbnail_size() { - global $json_api; - if ($json_api->query->thumbnail_size) { - return $json_api->query->thumbnail_size; - } else if (function_exists('get_intermediate_image_sizes')) { - $sizes = get_intermediate_image_sizes(); - if (in_array('post-thumbnail', $sizes)) { - return 'post-thumbnail'; - } - } - return 'thumbnail'; - } - -} - -?> diff --git a/wp/wp-content/plugins/json-api/models/tag.php b/wp/wp-content/plugins/json-api/models/tag.php deleted file mode 100644 index 48c3592c..00000000 --- a/wp/wp-content/plugins/json-api/models/tag.php +++ /dev/null @@ -1,26 +0,0 @@ -import_wp_object($wp_tag); - } - } - - function import_wp_object($wp_tag) { - $this->id = (int) $wp_tag->term_id; - $this->slug = $wp_tag->slug; - $this->title = $wp_tag->name; - $this->description = $wp_tag->description; - $this->post_count = (int) $wp_tag->count; - } - -} - -?> diff --git a/wp/wp-content/plugins/json-api/readme.txt b/wp/wp-content/plugins/json-api/readme.txt deleted file mode 100644 index a1760f4d..00000000 --- a/wp/wp-content/plugins/json-api/readme.txt +++ /dev/null @@ -1,1235 +0,0 @@ -=== JSON API === -Contributors: dphiffer -Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=DH4MEG99JR2WE -Tags: json, api, ajax, cms, admin, integration, moma -Requires at least: 2.8 -Tested up to: 3.5.2 -Stable tag: 1.1.1 - -A RESTful API for WordPress - -== Description == - -JSON API allows you to retrieve and manipulate WordPress content using HTTP requests. There are three main goals: - -1. Provide a simple, consistent external interface -2. Create a stable, understandable internal implementation -3. Enable new types of extensions for WordPress - -This plugin was created at [The Museum of Modern Art](http://moma.org/) for the weblog [Inside/Out](http://moma.org/explore/inside_out), which is served from Ruby on Rails. Instead of reimplementing the site templates as a WordPress theme, we opted for a Rails front-end that displays content served from a WordPress back-end. JSON API provides the necessary interface for retrieving content and accepting comment submissions. - -See the [Other Notes](http://wordpress.org/extend/plugins/json-api/other_notes/) section for the complete documentation. - -== Installation == - -1. Upload the `json-api` folder to the `/wp-content/plugins/` directory or install directly through the plugin installer. -2. Activate the plugin through the 'Plugins' menu in WordPress or by using the link provided by the plugin installer. - -== Screenshots == - -1. Our old friend, in JSON format - -== Documentation == - -1. [General concepts](#1.-General-Concepts) - 1.1. [Requests](#1.1.-Requests) - 1.2. [Controllers](#1.2.-Controllers) - 1.3. [Responses](#1.3.-Responses) -2. [Request methods](#2.-Request-methods) - 2.1. [Core controller methods](#2.1.-Core-controller-methods) - 2.2. [Posts controller methods](#2.2.-Pages-controller-methods) - 2.3. [Respond controller methods](#2.3.-Respond-controller-methods) - 2.4. [Widgets controller methods](#2.4.-Widgets-controller-methods) -3. [Request arguments](#3.-Request-arguments) - 3.1. [Output-modifying arguments](#3.1.-Output-modifying-arguments) - 3.2. [Content-modifying arguments](#3.2.-Content-modifying-arguments) - 3.3. [Using include/exclude and redirects](#3.3.-Using-include/exclude-and-redirects) -4. [Response objects](#4.-Response-objects) - 4.1. [Post response object](#4.1.-Post-response-object) - 4.2. [Category response object](#4.2.-Category-response-object) - 4.3. [Tag response object](#4.3.-Tag-response-object) - 4.4. [Author response object](#4.4.-Author-response-object) - 4.5. [Comment response object](#4.5.-Comment-response-object) - 4.6. [Attachment response object](#4.6.-Attachment-response-object) -5. [Extending JSON API](#5.-Extending-JSON-API) - 5.1. [Plugin hooks](#5.1.-Plugin-hooks) - 5.2. [Developing JSON API controllers](#5.2.-Developing-JSON-API-controllers) - 5.3. [Configuration options](#5.3.-Configuration-options) -6. [Unit tests](#6.-Unit-tests) - 6.1. [Preparing a WordPress test site](#6.1.-Preparing-a-WordPress-test-site) - 6.2. [Running the tests](#6.2.-Running-the-tests) - -== 1. General Concepts == - -== 1.1. Requests == - -Requests use a simple REST-style HTTP GET or POST. To invoke the API, include a non-empty query value for `json` in the URL. - -JSON API operates in two modes: - -1. *Implicit mode* is triggered by setting the `json` query var to a non-empty value on any WordPress page. The content that would normally appear on that page is returned in JSON format. -2. *Explicit mode* is triggered by setting `json` to a known method string. See *Section 2: Request methods* for a complete method listing. - -= Implicit mode examples: = - - * `http://www.example.org/?json=1` - * `http://www.example.org/?p=47&json=1` - * `http://www.example.org/tag/banana/?json=1` - -= Explicit mode examples: = - -* `http://www.example.org/?json=get_recent_posts` -* `http://www.example.org/?json=get_post&post_id=47` -* `http://www.example.org/?json=get_tag_posts&tag_slug=banana` - -= With user-friendly permalinks configured: = - -* `http://www.example.org/api/get_recent_posts/` -* `http://www.example.org/api/get_post/?post_id=47` -* `http://www.example.org/api/get_tag_posts/?tag_slug=banana` - -__Further reading__ -See *Section 3: Request arguments* for more information about request arguments to modify the response. - -== 1.2. Controllers == - -The 1.0 release of JSON API introduced a modular controller system. This allows developers to flexibly add features to the API and give users more control over which methods they have enabled. - -= The Core controller = - -Most of the methods available prior to version 1.0 have been moved to the Core controller. The two exceptions are `submit_comment` and `create_post` which are now available from the Respond and Posts controllers, respectively. The Core controller is the only one enabled by default. All other functionality must be enabled from the JSON API Settings page (under Settings in the WordPress admin menu). - -= Specifying a controller = - -There are a few ways of specifying a controller, depending on how you are calling the API: - -* `http://www.example.org/?json=get_recent_posts` (`core` controller is implied, method is `get_recent_posts`) -* `http://www.example.org/api/info/` (`core` controller is implied) -* `http://www.example.org/api/core/get_category_posts/` (`core` controller can also be explicitly specified) -* `http://www.example.org/?json=respond.submit_comment` (`respond` controller, `submit_comment` method) - -__Legacy compatibility__ -JSON API retains support for its pre-1.0 methods. For example, if you invoke the method `create_post` without a controller specified, the Posts controller is chosen instead of Core. - -= Available controllers = - -The current release includes three controllers: Core, Posts, and Respond. Developers are encouraged to suggest or submit additional controllers. - -__Further reading__ -See *Section 2: Request methods* for a complete reference of available controllers and methods. For documentation on extending JSON API with new controllers see *Section 5.2: Developing JSON API controllers*. - -== 1.3. Responses == - -The standard response format for JSON API is (as you may have guessed) [JSON](http://json.org/). - -Here is an example response from `http://localhost/wordpress/?json=1` called on a default WordPress installation (formatted for readability): - - { - "status": "ok", - "count": 1, - "count_total": 1, - "pages": 1, - "posts": [ - { - "id": 1, - "type": "post", - "slug": "hello-world", - "url": "http:\/\/localhost\/wordpress\/?p=1", - "title": "Hello world!", - "title_plain": "Hello world!", - "content": "

Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!<\/p>\n", - "excerpt": "Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!\n", - "date": "2009-11-11 12:50:19", - "modified": "2009-11-11 12:50:19", - "categories": [], - "tags": [], - "author": { - "id": 1, - "slug": "admin", - "name": "admin", - "first_name": "", - "last_name": "", - "nickname": "", - "url": "", - "description": "" - }, - "comments": [ - { - "id": 1, - "name": "Mr WordPress", - "url": "http:\/\/wordpress.org\/", - "date": "2009-11-11 12:50:19", - "content": "

Hi, this is a comment.
To delete a comment, just log in and view the post's comments. There you will have the option to edit or delete them.<\/p>\n", - "parent": 0 - } - ], - "comment_count": 1, - "comment_status": "open" - } - ] - } - -== 2. Request methods == - -Request methods are available from the following controllers: - -* Core controller - basic introspection methods -* Posts controller - data manipulation methods for posts -* Respond controller - comment/trackback submission methods -* Widgets controller - retrieve sidebar widgets - -== 2.1. Core controller methods == - -The Core controller offers a mostly-complete set of introspection methods for retrieving content from WordPress. - - -== Method: info == - -Returns information about JSON API. - -= Optional arguments = - -* `controller` - returns detailed information about a specific controller - -= Response = - - { - "status": "ok", - "json_api_version": "1.0", - "controllers": [ - "core" - ] - } - - -= Response with “controller=core” = - - { - "status": "ok", - "name": "Core", - "description": "Basic introspection methods", - "methods": [ - ... - ] - } - - -== Method: get_recent_posts == - -Returns an array of recent posts. You can invoke this from the WordPress home page either by setting `json` to a non-empty value (i.e., `json=1`) or from any page by setting `json=get_recent_posts`. - -= Optional arguments = - -* `count` - determines how many posts per page are returned (default value is 10) -* `page` - return a specific page number from the results -* `post_type` - used to retrieve custom post types - -= Response = - - { - "status": "ok", - "count": 10, - "count_total": 79, - "pages": 7, - "posts": [ - { ... }, - { ... }, - ... - ] - } - - -== Method: get_posts == - -Returns posts according to WordPress's [`WP_Query` parameters](http://codex.wordpress.org/Class_Reference/WP_Query#Parameters). The one default parameter is `ignore_sticky_posts=1` (this can be overridden). - -= Optional arguments = - -* `count` - determines how many posts per page are returned (default value is 10) -* `page` - return a specific page number from the results -* `post_type` - used to retrieve custom post types - -__Further reading__ -See the [`WP_Query` documentation](http://codex.wordpress.org/Class_Reference/WP_Query#Parameters) for a full list of supported parameters. The `post_status` parameter is currently ignored. - -= Response = - - { - "status": "ok", - "count": 1, - "posts": [ - { ... } - ] - } - - -== Method: get_post == - -Returns a single post object. - -= One of the following is required = - -* Invoking the JSON API implicitly (i.e., `?json=1`) on a post URL -* `id` or `post_id` - set to the post's ID -* `slug` or `post_slug` - set to the post's URL slug - -= Optional arguments = - -* `post_type` - used to retrieve custom post types - -= Response = - - { - "status": "ok", - "post": { ... } - } - - -== Method: get_page == - -Returns a single page object. - -= One of the following is required = - -* Invoking the JSON API implicitly (i.e., `?json=1`) on a page URL -* `id` or `page_id` - set to the page's ID -* `slug` or `page_slug` - set to the page's URL slug - -= Optional arguments = - -* `children` - set to a non-empty value to include a recursive hierarchy of child pages -* `post_type` - used to retrieve custom post types - -= Response = - - { - "status": "ok", - "page": { ... } - } - -== Method: get_date_posts == - -Returns an array of posts/pages in a specific date archive (by day, month, or year). - -= One of the following is required = - -* Invoking the JSON API implicitly (i.e., `?json=1`) on a date archive page -* `date` - set to a date in the format `YYYY` or `YYYY-MM` or `YYYY-MM-DD` (non-numeric characters are stripped from the var, so `YYYYMMDD` or `YYYY/MM/DD` are also valid) - -= Optional arguments = - -* `count` - determines how many posts per page are returned (default value is 10) -* `page` - return a specific page number from the results -* `post_type` - used to retrieve custom post types - -= Response = - - { - "status": "ok", - "count": 10, - "count_total": 79, - "pages": 7, - "posts": [ - { ... }, - { ... }, - ... - ] - } - -== Method: get_category_posts == - -Returns an array of posts/pages in a specific category. - -= One of the following is required = - -* Invoking the JSON API implicitly (i.e., `?json=1`) on a category archive page -* `id` or `category_id` - set to the category's ID -* `slug` or `category_slug` - set to the category's URL slug - -= Optional arguments = - -* `count` - determines how many posts per page are returned (default value is 10) -* `page` - return a specific page number from the results -* `post_type` - used to retrieve custom post types - -= Response = - - { - "status": "ok", - "count": 10, - "count_total": 79, - "pages": 7, - "category": { ... } - "posts": [ - { ... }, - { ... }, - ... - ] - } - - -== Method: get_tag_posts == - -Returns an array of posts/pages with a specific tag. - -= One of the following is required = - -* Invoking the JSON API implicitly (i.e., `?json=1`) on a tag archive page -* `id` or `tag_id` - set to the tag's ID -* `slug` or `tag_slug` - set to the tag's URL slug - -= Optional arguments = - -* `count` - determines how many posts per page are returned (default value is 10) -* `page` - return a specific page number from the results -* `post_type` - used to retrieve custom post types - -= Response = - - { - "status": "ok", - "count": 10, - "count_total": 79, - "pages": 7, - "tag": { ... } - "posts": [ - { ... }, - { ... }, - ... - ] - } - - -== Method: get_author_posts == - -Returns an array of posts/pages written by a specific author. - -= One of the following is required = - -* Invoking the JSON API implicitly (i.e., `?json=1`) on an author archive page -* `id` or `author_id` - set to the author's ID -* `slug` or `author_slug` - set to the author's URL slug - -= Optional arguments = - -* `count` - determines how many posts per page are returned (default value is 10) -* `page` - return a specific page number from the results -* `post_type` - used to retrieve custom post types - -= Response = - - { - "status": "ok", - "count": 10, - "count_total": 79, - "pages": 7, - "author": { ... } - "posts": [ - { ... }, - { ... }, - ... - ] - } - - -== Method: get_search_results == - -Returns an array of posts/pages in response to a search query. - -= One of the following is required = - -* Invoking the JSON API implicitly (i.e., `?json=1`) on a search results page -* `search` - set to the desired search query - -= Optional arguments = - -* `count` - determines how many posts per page are returned (default value is 10) -* `page` - return a specific page number from the results -* `post_type` - used to retrieve custom post types - -= Response = - - { - "status": "ok", - "count": 10, - "count_total": 79, - "pages": 7, - "posts": [ - { ... }, - { ... }, - ... - ] - } - - -== Method: get_date_index == - -Returns both an array of date page permalinks and a tree structure representation of the archive. - -= Response = - - { - "status": "ok", - "permalinks": [ - "...", - "...", - "..." - ], - "tree": { - "2009": { - "09": 17, - "10": 20, - "11": 7 - } - } - -Note: the tree is arranged by `response.tree.[year].[month].[number of posts]`. - - -== Method: get_category_index == - -Returns an array of active categories. - -= Optional argument = - -* `parent` - returns categories that are direct children of the parent ID - -= Response = - - { - "status": "ok", - "count": 3, - "categories": [ - { ... }, - { ... }, - { ... } - ] - } - - -== Method: get_tag_index == - -Returns an array of active tags. - -= Response = - - { - "status": "ok", - "count": 3 - "tags": [ - { ... }, - { ... }, - { ... } - ] - } - - -== Method: get_author_index == - -Returns an array of active blog authors. - -= Response = - - { - "status": "ok", - "count": 3, - "authors": [ - { ... }, - { ... }, - { ... } - ] - } - - -== Method: get_page_index == - -Returns a hierarchical tree of `page` posts. - -= Response = - - { - "status": "ok", - "pages": [ - { ... }, - { ... }, - { ... } - ] - } - -== Method: get_nonce == - -Returns a WordPress nonce value, required to call some data manipulation methods. - -= Required arguments = - -* `controller` - the JSON API controller for the method you will use the nonce for -* `method` - the method you wish to call (currently `create_post` is the only method that requires a nonce) - -= Response = - - { - "status": "ok", - "controller": "posts", - "method": "create_post", - "nonce": "cefe01efd4" - } - -__Further reading__ -To learn more about how nonces are used in WordPress, see [Mark Jaquith's article on the subject](http://markjaquith.wordpress.com/2006/06/02/wordpress-203-nonces/). - -== 2.2. Pages controller methods == - -== Method: create_post == - -Creates a new post. - -= Required argument = - -* `nonce` - available from the `get_nonce` method (call with vars `controller=posts` and `method=create_post`) - -= Optional arguments = - -* `status` - sets the post status ("draft" or "publish"), default is "draft" -* `title` - the post title -* `content` - the post content -* `author` - the post's author (login name), default is the current logged in user -* `categories` - a comma-separated list of categories (URL slugs) -* `tags` - a comma-separated list of tags (URL slugs) - -Note: including a file upload field called `attachment` will cause an attachment to be stored with your new post. - -== Method: update_post == - -Updates a post. - -= Required argument = - -* `nonce` - available from the `get_nonce` method (call with vars `controller=posts` and `method=update_post`) - -= One of the following is required = - -* `id` or `post_id` - set to the post's ID -* `slug` or `post_slug` - set to the post's URL slug - -= Optional arguments = - -* `status` - sets the post status ("draft" or "publish"), default is "draft" -* `title` - the post title -* `content` - the post content -* `author` - the post's author (login name), default is the current logged in user -* `categories` - a comma-separated list of categories (URL slugs) -* `tags` - a comma-separated list of tags (URL slugs) - -Note: including a file upload field called `attachment` will cause an attachment to be stored with your post. - -== Method: delete_post == - -Deletes a post. - -= Required argument = - -* `nonce` - available from the `get_nonce` method (call with vars `controller=posts` and `method=delete_post`) - -= One of the following is required = - -* `id` or `post_id` - set to the post's ID -* `slug` or `post_slug` - set to the post's URL slug - - -== 2.3. Respond controller methods == - -== Method: submit_comment == - -Submits a comment to a WordPress post. - -= Required arguments = - -* `post_id` - which post to comment on -* `name` - the commenter's name -* `email` - the commenter's email address -* `content` - the comment content - -= Optional arguments = - -* `redirect` - redirect instead of returning a JSON object -* `redirect_ok` - redirect to a specific URL when the status value is `ok` -* `redirect_error` - redirect to a specific URL when the status value is `error` -* `redirect_pending` - redirect to a specific URL when the status value is `pending` - -= Custom status values = - -* `pending` - assigned if the comment submission is pending moderation - -== 2.4. Widgets controller methods == - -== Method: get_sidebar == - -Retrieves widgets assigned to a sidebar. - -= Required arguments = - -* `sidebar_id` - the name or number of the sidebar to retrieve - - -== 3. Request arguments == - -API requests can be controlled by specifying one of the following arguments as URL query vars. - -= Examples = - -* Debug the response: `http://www.example.org/api/get_page_index/?dev=1` -* Widget-style JSONP output: `http://www.example.org/api/get_recent_posts/?callback=show_posts_widget&read_more=More&count=3` -* Redirect on error: `http://www.example.org/api/posts/create_post/?callback_error=http%3A%2F%2Fwww.example.org%2Fhelp.html` - -== 3.1. Output-modifying arguments == - -The following arguments modify how you get results back from the API. The redirect response styles are intended for use with the data manipulation methods. - -* Setting `callback` to a JavaScript function name will trigger a JSONP-style callback. -* Setting `redirect` to a URL will cause the user's browser to redirect to the specified URL with a `status` value appended to the query vars (see the *Response objects* section below for an explanation of status values). -* Setting `redirect_[status]` allows you to control the resulting browser redirection depending on the `status` value. -* Setting `dev` to a non-empty value adds whitespace for readability and responds with `text/plain` -* Errors are suppressed unless `dev` is set to a non-empty value -* Setting `json_encode_options` will let you specify an integer bitmask to modify the behavior of [PHP's `json_encode`](http://php.net/manual/en/function.json-encode.php) (Note: this option is only recognized in PHP version 5.3+) -* Setting `json_unescaped_unicode` will replace unicode-escaped characters with their unescaped equivalents (e.g., `\u00e1` becomes á) -* Omitting all of the above arguments will result in a standard JSON response. - -== 3.2. Content-modifying arguments == - -These arguments are available to modify all introspection methods: - -* `date_format` - Changes the format of date values. Uses the same syntax as PHP's date() function. Default value is `Y-m-d H:i:s`. -* `read_more` - Changes the 'read more' link text in post content. -* `include` - Specifies which post data fields to include. Expects a comma-separated list of post fields. Leaving this empty includes *all* fields. -* `exclude` - Specifies which post data fields to exclude. Expects a comma-separated list of post fields. -* `custom_fields` - Includes values from posts' Custom Fields. Expects a comma-separated list of custom field keys. -* `author_meta` - Includes additional author metadata. Should be a comma-separated list of metadata fields. -* `count` - Controls the number of posts to include (defaults to the number specified by WordPress) -* `order` - Controls the order of post results ('DESC' or 'ASC'). Default value is 'DESC'. -* `order_by` - Controls which field to order results by. Expects one of the following values: - * `author` - * `date` (default value) - * `title` - * `modified` - * `menu_order` (only works with Pages) - * `parent` - * `ID` - * `rand` - * `meta_value` (`meta_key` must also be set) - * `none` - * `comment_count` -* `meta_key`, `meta_value`, `meta_compare` - Retrieve posts (or Pages) based on a custom field key or value. - -== 3.3. Using include/exclude and redirects == - -__About `include`/`exclude` arguments__ -By default you get all values included with each post object. Specify a list of `include` values will cause the post object to filter out the values absent from the list. Specifying `exclude` causes post objects to include all values except the fields you list. For example, the query `exclude=comments` includes everything *except* the comments. - -__About the `redirect` argument__ -The `redirect` response style is useful for when you need the user's browser to make a request directly rather than making proxy requests using a tool like cURL. Setting a `redirect` argument causes the user's browser to redirect back to the specified URL instead of returning a JSON object. The resulting `status` value is included as an extra query variable. - -For example calling an API method with `redirect` set to `http://www.example.com/foo` will result in a redirection to one of the following: - -* `http://www.example.com/foo?status=ok` -* `http://www.example.com/foo?status=error` - -You can also set separate URLs to handle status values differently. You could set `redirect_ok` to `http://www.example.com/handle_ok` and `redirect_error` to `http://www.example.com/handle_error` in order to have more fine-tuned control over the method result. - - -== 4. Response objects == - -This section describes data objects you can retrieve from WordPress and the optional URL redirects. - -__Status values__ -All JSON API requests result in a status value. The two basic status values are `ok` and `error`. Additional status values are available for certain methods (such as `pending` in the case of the `submit_comment` method). API methods that result in custom status values include a *custom status values* section in their documentation. - -__Naming compatibility__ -Developers familiar with WordPress may notice that many names for properties and arguments have been changed. This was a stylistic choice that intends to provide more clarity and consistency in the interface. - -== 4.1. Post response object == - -* `id` - Integer -* `type` - String (e.g., `post` or `page`) -* `slug` - String -* `url` - String -* `title` - String -* `title_plain` - String -* `content` - String (modified by the `read_more` argument) -* `excerpt` - String -* `date` - String (modified by the `date_format` argument) -* `modified` - String (modified by the `date_format` argument) -* `categories` - Array of category objects -* `tags` - Array of tag objects -* `author` Author object -* `comments` - Array of comment objects -* `attachments` - Array of attachment objects -* `comment_count` - Integer -* `comment_status` - String (`"open"` or `"closed"`) -* `thumbnail` - String (only included if a post thumbnail has been specified) -* `custom_fields` - Object (included by setting the `custom_fields` argument to a comma-separated list of custom field names) -* `taxonomy_(taxonomy)` - Array of custom taxonomy objects (these resemble Category or Tag response objects, depending on whether the taxonomy is hierarchical) - -__Note__ -The `thumbnail` attribute returns a URL to the image size specified by the optional `thumbnail_size` request argument. By default this will use the `thumbnail` or `post-thumbnail` sizes, depending on your version of WordPress. See [Mark Jaquith's post on the topic](http://markjaquith.wordpress.com/2009/12/23/new-in-wordpress-2-9-post-thumbnail-images/) for more information. - -== 4.2. Category response object == - -* `id` - Integer -* `slug` - String -* `title` - String -* `description` - String -* `parent` - Integer -* `post_count` - Integer - -== 4.3. Tag response object == - -* `id` - Integer -* `slug` - String -* `title` - String -* `description` - String -* `post_count` - Integer - -== 4.4. Author response object == - -* `id` - Integer -* `slug` - String -* `name` - String -* `first_name` - String -* `last_name` - String -* `nickname` - String -* `url` - String -* `description` - String - -Note: You can include additional values by setting the `author_meta` argument to a comma-separated list of metadata fields. - -== 4.5. Comment response object == - -* `id` - Integer -* `name` - String -* `url` - String -* `date` - String -* `content` - String -* `parent` - Integer -* `author` - Object (only set if the comment author was registered & logged in) - -== 4.6. Attachment response object == - -* `id` - Integer -* `url` - String -* `slug` - String -* `title` - String -* `description` - String -* `caption` - String -* `parent` - Integer -* `mime_type` - String -* `images` - Object with values including `thumbnail`, `medium`, `large`, `full`, each of which are objects with values `url`, `width` and `height` (only set if the attachment is an image) - - -== 5. Extending JSON API == - -JSON API exposes several WordPress action and filter hooks as well as a modular controller system for adding new API methods. - -== 5.1. Plugin hooks == - -JSON API exposes several [action and filter hooks](http://codex.wordpress.org/Plugin_API#Hooks.2C_Actions_and_Filters) to augment its behavior. - -== Filter: json_api_controllers == - -This filter controls the array of controllers available to JSON API. The callback function is passed a single argument, an array of strings. - -= Example = - - // Add a custom controller - add_filter('json_api_controllers', 'add_my_controller'); - - function add_my_controller($controllers) { - // Corresponds to the class JSON_API_MyController_Controller - $controllers[] = 'MyController'; - return $controllers; - } - - -== Filter: json_api_[controller]_controller_path == - -Specifies the PHP source file for a given controller, overriding the default location `wp-content/plugins/json_api/controllers`. - -__Note__ -If you your controller file in the `json-api/controllers` folder JSON API will find it automatically. - -= Example = - - // Register the source file for JSON_API_Widgets_Controller - add_filter('json_api_widgets_controller_path', 'widgets_controller_path'); - - function widgets_controller_path($default_path) { - return '/path/to/widgets.php'; - } - -__Capitalization__ -Your filter hook must be all-lowercase to work correctly. The above example would fail with the filter `json_api_Widgets_Controller_path`, even if that's how the class is capitalized in the PHP source. - -== Filter: json_api_encode == - -This is called just before the output is encoded into JSON format. The value passed will always be an associative array, according to the format described in each method's documentation. Those items described in the *Response objects* section are passed as PHP objects, not associative arrays. - -= Example = - - add_filter('json_api_encode', 'my_encode_kittens'); - - function my_encode_kittens($response) { - if (isset($response['posts'])) { - foreach ($response['posts'] as $post) { - my_add_kittens($post); // Add kittens to each post - } - } else if (isset($response['post'])) { - my_add_kittens($response['post']); // Add a kittens property - } - return $response; - } - - function my_add_kittens(&$post) { - $post->kittens = 'Kittens!'; - } - -== Action: json_api-[controller]-[method] == - -Each JSON API method invokes an action when called. - -= Example = - - // Disable get_author_index method (e.g., for security reasons) - add_action('json_api-core-get_author_index', 'my_disable_author_index'); - - function my_disable_author_index() { - // Stop execution - exit; - } - -== 5.2. Developing JSON API controllers == - -= Creating a controller = - -To start a new JSON API controller, create a file called `hello.php` inside `wp-content/plugins/json-api/controllers`. Add the following class definition: - - "Hello, world" - ); - } - - } - - ?> - -Your controller is now available as `hello`, and exposes one `hello_world` method. - -Next, activate your controller from the WordPress admin interface, available from the menu under Settings > JSON API. You can either click on the link to your `hello_world` method from the admin interface or enter it manually. It should have the form: `http://www.example.org/api/hello/hello_world/?dev=1` or `http://www.example.org/?json=hello.hello_world&dev=1` (note the use of the `dev` argument to enable human-readable output). You should get the following output: - - { - "status": "ok", - "message": "Hello, world" - } - -= Using query vars = - -To customize the behavior of your controller, you will want to make use of the global `$json_api->query` object. Add the following method to your controller: - - public function hello_person() { - global $json_api; - $name = $json_api->query->name; - return array( - "message" => "Hello, $name." - ); - } - -Now append the `name` query var to the method call: `http://www.example.org/api/hello/hello_world/?dev=1&name=Alice` or `http://www.example.org/?json=hello.hello_world&dev=1&name=Alice`. - - { - "status": "ok", - "message": "Hello, Alice" - } - -= Introspector and data models = - -Your controller can use any of the [existing WordPress functions](http://codex.wordpress.org/Function_Reference) to collect data, but JSON API also includes an introspector that wraps data in objects defined in the `json-api/models` directory. These are the same data models described in *Section 4: Response objects*. - -Here is an example of how you might use the introspector: - - // Retrieve posts based on custom field key/value pair - public function get_custom_posts() { - global $json_api; - - // Make sure we have key/value query vars - if (!$json_api->query->key || !$json_api->query->value) { - $json_api->error("Include a 'key' and 'value' query var."); - } - - // See also: http://codex.wordpress.org/Template_Tags/query_posts - $posts = $json_api->introspector->get_posts(array( - 'meta_key' => $json_api->query->key, - 'meta_value' => $json_api->query->value - )); - - return array( - 'key' => $key, - 'value' => $value, - 'posts' => $posts - ); - } - -= External controllers = - -It is recommended that custom controllers are kept outside of `json-api/controllers` in order to avoid accidental deletion during upgrades or site migrations. To make your controller visible from an external plugin or theme directory you will need to use two filters: `json_api_controllers` and `json_api_[controller]_controller_path`. Move the `hello.php` file from the steps above into your theme's directory. Then add the following to your theme's `functions.php` file (if your theme doesn't have a file called `functions.php` you can create one). - - function add_hello_controller($controllers) { - $controllers[] = 'hello'; - return $controllers; - } - add_filter('json_api_controllers', 'add_hello_controller'); - - function set_hello_controller_path() { - return "/path/to/theme/hello.php"; - } - add_filter('json_api_hello_controller_path', 'set_hello_controller_path'); - -== 5.3. Configuration options == - -The following are constants you can define in your `wp-config.php` folder: - -* `JSON_API_DIR` - set to the directory where JSON API plugin lives (in some cases this can be useful for `mu-plugins` with WordPress MU) -* `JSON_API_CONTROLLERS` - a comma-separated list of default controllers to enable (this is overridden by the JSON API settings page) - -== 6. Unit tests == - -JSON API comes with a set of tests that should make it easier to maintain and reveal incompatibilities when they might occur. This is an ongoing process, I hope to improve the test coverage going forward. - -== 6.1. Preparing a WordPress test site == - -There are a few necessary steps that need to be carried out before the test suite will run properly. - -1. WordPress should generate a new set of tables before you start, so if you're testing with a `wp_` table prefix make sure the database has no existing tables of this kind -2. Configure and install a new copy of WordPress -3. Delete the Hello World post and Sample Page (titled "About" in some versions of WordPress) -4. Enable user-friendly URLs from Settings > Permalinks, use the "Day and name" format -5. Install + Activate the JSON API plugin and enable all bundled controllers from Settings > JSON API -6. Import the [Theme Unit Test](http://codex.wordpress.org/Theme_Unit_Test) test data XML file from Settings > Import > WordPress (you will need to install the WordPress Importer plugin) - -== 6.2. Running the tests == - -From the command line, make sure you have the HTTP_Client PEAR package installed: - -`pear install HTTP_Client` - -Change directory to `tests` and run the following: - -`pear run-tests` - -You should see the test results print out culminating in a summary: - - TOTAL TIME: 00:04 - 23 PASSED TESTS - 0 SKIPPED TESTS - -== Changelog == - -= 1.1.1 (2013-06-23): = -* Added support for custom taxonomies -* Errors are now suppressed unless you include a non-empty `dev` argument - -= 1.1.0 (2013-06-22): = -* Bugfix for `json_encode` compatibility with PHP < 5.3 -* Bugfix for `get_author_index` warnings in WordPress > 3.5 - -= 1.0.9 (2013-06-21): = -* Added `update_post` and `delete_post` methods to Post controller -* Added two JSON encoding arguments: `json_encode_options` and `json_unescaped_unicode` -* Added a `parent` argument to `get_category_index` -* Fixed a couple places where the code was generating PHP notifications -* Updated bundled Services_JSON library (only used if `json_encode` is unavailable) - -= 1.0.8 (2013-06-12): = -* Added `widgets` controller -* Added a generic `get_posts` method to the core controller -* Added a `thumbnail_images` object property to complement `thumbnail` URL -* Attachment image files are now checked to exist and match the expected width/height -* Fixed a bug where `the_excerpt` filter wasn't being applied to the `excerpt` property -* Fixed a bug where the number of child pages was being limited to 5 -* Fixed a bug where custom controller class names couldn't include numerics -* Theme directory check for custom controllers - -= 1.0.7 (2011-01-27): = -* Created some basic unit tests -* Fixed a bug where `get_author_posts` was unable to find users by `slug` -* Added missing `post_type` argument to documentation for `get_post` and `get_page` (props Koshirosan) -* Added `previous_url` and `next_url` properties to the `get_post` response object (props mlcy44) - -= 1.0.6 (2011-01-13): = -* Fixed a bug in `exclude` query parameter (big props to ikesyo and archon810) -* Fix for `get_page_index` that where it only returned 5 pages -- it now responds to `count` query param (props to npavkovic and blinder) -* Removed `Content-Disposition` header from response (props mimecine, kjwierenga) -* Fixed an incompatibility issue with Disqus plugin (props joshcanhelp) -* Fixed a bug where `submit_comment` was resulting in a HTTP 404 status (props @tdweston) -* Fixed an error in the documentation, external controller example (props jli) - -= 1.0.5 (2010-07-08): = -* Added an check so that `json-api.php` can be moved one level above the `json-api` directory -* Added more documentation about using nonces - -= 1.0.4 (2010-07-07): = -* Fixed a bug where the order of attachments didn't match the gallery -* Added a section to the developer documentation for externalizing custom controllers -* Moved JSON_API class to its own file: `singletons/api.php` -* Created a new top-level function: `json_api_dir()` -* Improvements for WordPress MU: `JSON_API_DIR` and `JSON_API_CONTROLLERS` constants (props Jim McQuillan) - -= 1.0.3 (2010-07-07): = -* Added request argument `thumbnail_size` to support different sizes of featured images (see also: `add_image_size` WordPress function) -* Added request argument `post_type` to support custom post types (props Mark Harris) - -= 1.0.2 (2010-07-02): = -* Removed an inaccurate section from readme.txt about supporting `query_posts` arguments -* Changed controller info block format to use "Controller name" and "Controller description" -* Made admin page more robust about handling errors loading controllers -* Changed `JSON_API::get_controllers` method to lowercase all entries -* Added introspector section to developer documentation -* Fixed incorrect example for `json_api_[controller]_controller_path` -* Thanks to Tim Nash for early feedback on writing external controllers - -= 1.0.1 (2010-07-01): = -* Fixed some typos in readme.txt -* Switched `get_tag_posts` to query on tag instead of tag_id (maybe a WordPress issue?) - -= 1.0 (2010-06-29): = -* JSON API officially drops support for PHP 4 (it was already broken) -* Added JSON API Settings page to WP admin -* Broke apart `JSON_API_Controller` into a modular controller system -* Refactored `JSON_API_Query` to depend less on WordPress's `get_query_var` mechanism -* Developer mode now shows response in JSON format -* The `create_post` method now requires a nonce -* Improved support for complex post queries (props zibitt) -* Fixed a bug with `get_author_by_login` (props Krzysztof Sobolewski) -* Made image attachments more robust with `get_intermediate_image_sizes` (props mimecine) -* Improved post thumbnail support (props nyamsprod) - -= 0.9.6 (2010-05-27): = -* Fixed a bug introduced in 0.9.5 - -= 0.9.5 (2010-05-27): = -* Added a `thumbnail` property to Post response objects - -= 0.9.4 (2010-04-28): = -* Fixed a bug where any non-authenticated user could create a draft blog post through `create_post`. Thanks to user futtta for posting about this. - -= 0.9.3 (2010-03-19): = -* Fixed a bug where child pages were being ignored by the API. See also: https://core.trac.wordpress.org/ticket/12647 - -= 0.9.2 (2010-03-18): = -* Fixed a bug where the /api/ rewrite rules would be lost - -= 0.9 (2010-02-04): = -* Added a `create_post` method - -= 0.8.3 (2010-01-27): = -* Fixed the stable tag version - -= 0.8.2 (2010-01-27): = -* Fixed a typo in the changelog - -= 0.8.1 (2010-01-27): = -* Fixed a bug that was making JSONP support non-functional - -= 0.8 (2010-01-18): = -* Added an attachment model and instance variable for post objects - -= 0.7.3 (2010-01-15): = -* Added a `count` request parameter to control the number of posts returned - -= 0.7.2 (2010-01-14): = -* Removed the version number from the description text - -= 0.7.1 (2010-01-14): = -* Fixed another subtle bug with `get_author_index` - -= 0.7 (2010-01-08): = -* Added a `post_count` response to tag objects -* Fixed a bug with `get_author_index` - -= 0.6 (2009-11-30): = -* Added `count_total` response -* Added `json_api_encode` filter -* Fixed bugs in the introspector's `get_current_category` and `get_current_tag` - -= 0.5 (2009-11-17): = -* Initial Public Release - -== Upgrade Notice == - -= 1.1.1 = -Added support for custom taxonomies - -= 1.1.0 = -Minor bugfixes - -= 1.0.9 = -Update/delete post methods and some other bugfixes and improvements - -= 1.0.8 = -Long overdue bugfix/improvement release - -= 1.0.7 = -Minor bugfix/improvement release - -= 1.0.6 = -Minor bugfix/improvement release - -= 1.0.5 = -Minor improvement release - -= 1.0.4 = -Minor bugfix/refactor release - -= 1.0.3 = -Two new request arguments added: `thumbnail_size` and `post_type` - -= 1.0.2 = -Minor bugfix release - -= 1.0.1 = -Bugfix release, possibly stemming from a bug in WordPress 3.0 - -= 1.0 = -Major release, see changelog for details. - -= 0.9.6 = -Bugfix release for something added in 0.9.5. - -= 0.9.5 = -Feature addition: post thumbnails now included in response objects. - -= 0.9.4 = -Security fix: all users are strongly encouraged to upgrade. (See Changelog.) - -= 0.9.3 = -Fixed a bug where child pages could not be introspected by the API. - -= 0.9.2 = -Fixed a bug where the /api/ path would stop working upon publishing new pages. - -= 0.9 = -Added a new data manipulation method: `create_post`. - -= 0.8.3 = -Oh dear, I didn't tag 0.8.2 in the stable tags thing. - -= 0.8.2 = -Just fixing a mislabeled 0.8.1 release in the changelog. - -= 0.8.1 = -This is a bug fix release for JSONP support. Thanks to Ben Wilson for reporting it! - -= 0.8 = -Added what may be the last introspection feature: post attachments. You can now see images and other media that have been added to posts. diff --git a/wp/wp-content/plugins/json-api/screenshot-1.png b/wp/wp-content/plugins/json-api/screenshot-1.png deleted file mode 100644 index b5bba9d5d2d806e8567e5aff9190fa5e2ea86c42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23452 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 diff --git a/wp/wp-content/plugins/json-api/singletons/api.php b/wp/wp-content/plugins/json-api/singletons/api.php deleted file mode 100644 index af1c1c59..00000000 --- a/wp/wp-content/plugins/json-api/singletons/api.php +++ /dev/null @@ -1,394 +0,0 @@ -query = new JSON_API_Query(); - $this->introspector = new JSON_API_Introspector(); - $this->response = new JSON_API_Response(); - add_action('template_redirect', array(&$this, 'template_redirect')); - add_action('admin_menu', array(&$this, 'admin_menu')); - add_action('update_option_json_api_base', array(&$this, 'flush_rewrite_rules')); - add_action('pre_update_option_json_api_controllers', array(&$this, 'update_controllers')); - } - - function template_redirect() { - // Check to see if there's an appropriate API controller + method - $controller = strtolower($this->query->get_controller()); - $available_controllers = $this->get_controllers(); - $enabled_controllers = explode(',', get_option('json_api_controllers', 'core')); - $active_controllers = array_intersect($available_controllers, $enabled_controllers); - - if ($controller) { - - if (empty($this->query->dev)) { - error_reporting(0); - } - - if (!in_array($controller, $active_controllers)) { - $this->error("Unknown controller '$controller'."); - } - - $controller_path = $this->controller_path($controller); - if (file_exists($controller_path)) { - require_once $controller_path; - } - $controller_class = $this->controller_class($controller); - - if (!class_exists($controller_class)) { - $this->error("Unknown controller '$controller_class'."); - } - - $this->controller = new $controller_class(); - $method = $this->query->get_method($controller); - - if ($method) { - - $this->response->setup(); - - // Run action hooks for method - do_action("json_api", $controller, $method); - do_action("json_api-{$controller}-$method"); - - // Error out if nothing is found - if ($method == '404') { - $this->error('Not found'); - } - - // Run the method - $result = $this->controller->$method(); - - // Handle the result - $this->response->respond($result); - - // Done! - exit; - } - } - } - - function admin_menu() { - add_options_page('JSON API Settings', 'JSON API', 'manage_options', 'json-api', array(&$this, 'admin_options')); - } - - function admin_options() { - if (!current_user_can('manage_options')) { - wp_die( __('You do not have sufficient permissions to access this page.') ); - } - - $available_controllers = $this->get_controllers(); - $active_controllers = explode(',', get_option('json_api_controllers', 'core')); - - if (count($active_controllers) == 1 && empty($active_controllers[0])) { - $active_controllers = array(); - } - - if (!empty($_REQUEST['_wpnonce']) && wp_verify_nonce($_REQUEST['_wpnonce'], "update-options")) { - if ((!empty($_REQUEST['action']) || !empty($_REQUEST['action2'])) && - (!empty($_REQUEST['controller']) || !empty($_REQUEST['controllers']))) { - if (!empty($_REQUEST['action'])) { - $action = $_REQUEST['action']; - } else { - $action = $_REQUEST['action2']; - } - - if (!empty($_REQUEST['controllers'])) { - $controllers = $_REQUEST['controllers']; - } else { - $controllers = array($_REQUEST['controller']); - } - - foreach ($controllers as $controller) { - if (in_array($controller, $available_controllers)) { - if ($action == 'activate' && !in_array($controller, $active_controllers)) { - $active_controllers[] = $controller; - } else if ($action == 'deactivate') { - $index = array_search($controller, $active_controllers); - if ($index !== false) { - unset($active_controllers[$index]); - } - } - } - } - $this->save_option('json_api_controllers', implode(',', $active_controllers)); - } - if (isset($_REQUEST['json_api_base'])) { - $this->save_option('json_api_base', $_REQUEST['json_api_base']); - } - } - - ?> -

-

-

JSON API Settings

-
- -

Controllers

- print_controller_actions(); ?> - - - - - - - - - - - - - - - - - controller_info($controller); - - if (is_string($info)) { - $active = false; - $error = true; - $info = array( - 'name' => $controller, - 'description' => "

Error: $info

", - 'methods' => array(), - 'url' => null - ); - } - - ?> - - - - - - - -
ControllerDescription
ControllerDescription
- - - -
- ' . __('Deactivate') . ''; - } else if (!$error) { - echo '' . __('Activate') . ''; - } - - if (!empty($info['url'])) { - echo ' | '; - echo 'Docs
'; - } - - ?> -
-

-

- get_method_url($controller, $method); - if ($active) { - echo "$method "; - } else { - echo "$method "; - } - } - - ?> -

-
- print_controller_actions('action2'); ?> -

Address

-

Specify a base URL for JSON API. For example, using api as your API base URL would enable the following /api/get_recent_posts/. If you assign a blank value the API will only be available by setting a json query variable.

- - - - - -
API base/
- -
-

Note: User-friendly permalinks are not currently enabled. Change Permalinks - -

- -

-
-
- -
-
- - -
-
-
-
- $value) { - $args[] = urlencode($key) . '=' . urlencode($value); - } - $args = implode('&', $args); - } else { - $args = $options; - } - if ($controller != 'core') { - $method = "$controller/$method"; - } - if (!empty($base) && !empty($permalink_structure)) { - if (!empty($args)) { - $args = "?$args"; - } - return "$url/$base/$method/$args"; - } else { - return "$url?json=$method&$args"; - } - } - - function save_option($id, $value) { - $option_exists = (get_option($id, null) !== null); - if ($option_exists) { - update_option($id, $value); - } else { - add_option($id, $value); - } - } - - function get_controllers() { - $controllers = array(); - $dir = json_api_dir(); - $this->check_directory_for_controllers("$dir/controllers", $controllers); - $this->check_directory_for_controllers(get_stylesheet_directory(), $controllers); - $controllers = apply_filters('json_api_controllers', $controllers); - return array_map('strtolower', $controllers); - } - - function check_directory_for_controllers($dir, &$controllers) { - $dh = opendir($dir); - while ($file = readdir($dh)) { - if (preg_match('/(.+)\.php$/i', $file, $matches)) { - $src = file_get_contents("$dir/$file"); - if (preg_match("/class\s+JSON_API_{$matches[1]}_Controller/i", $src)) { - $controllers[] = $matches[1]; - } - } - } - } - - function controller_is_active($controller) { - if (defined('JSON_API_CONTROLLERS')) { - $default = JSON_API_CONTROLLERS; - } else { - $default = 'core'; - } - $active_controllers = explode(',', get_option('json_api_controllers', $default)); - return (in_array($controller, $active_controllers)); - } - - function update_controllers($controllers) { - if (is_array($controllers)) { - return implode(',', $controllers); - } else { - return $controllers; - } - } - - function controller_info($controller) { - $path = $this->controller_path($controller); - $class = $this->controller_class($controller); - $response = array( - 'name' => $controller, - 'description' => '(No description available)', - 'methods' => array() - ); - if (file_exists($path)) { - $source = file_get_contents($path); - if (preg_match('/^\s*Controller name:(.+)$/im', $source, $matches)) { - $response['name'] = trim($matches[1]); - } - if (preg_match('/^\s*Controller description:(.+)$/im', $source, $matches)) { - $response['description'] = trim($matches[1]); - } - if (preg_match('/^\s*Controller URI:(.+)$/im', $source, $matches)) { - $response['docs'] = trim($matches[1]); - } - if (!class_exists($class)) { - require_once($path); - } - $response['methods'] = get_class_methods($class); - return $response; - } else if (is_admin()) { - return "Cannot find controller class '$class' (filtered path: $path)."; - } else { - $this->error("Unknown controller '$controller'."); - } - return $response; - } - - function controller_class($controller) { - return "json_api_{$controller}_controller"; - } - - function controller_path($controller) { - $json_api_dir = json_api_dir(); - $json_api_path = "$json_api_dir/controllers/$controller.php"; - $theme_dir = get_stylesheet_directory(); - $theme_path = "$theme_dir/$controller.php"; - if (file_exists($theme_path)) { - $path = $theme_path; - } else if (file_exists($json_api_path)) { - $path = $json_api_path; - } else { - $path = null; - } - $controller_class = $this->controller_class($controller); - return apply_filters("{$controller_class}_path", $path); - } - - function get_nonce_id($controller, $method) { - $controller = strtolower($controller); - $method = strtolower($method); - return "json_api-$controller-$method"; - } - - function flush_rewrite_rules() { - global $wp_rewrite; - $wp_rewrite->flush_rules(); - } - - function error($message = 'Unknown error', $status = 'error') { - $this->response->respond(array( - 'error' => $message - ), $status); - } - - function include_value($key) { - return $this->response->is_value_included($key); - } - -} - -?> diff --git a/wp/wp-content/plugins/json-api/singletons/introspector.php b/wp/wp-content/plugins/json-api/singletons/introspector.php deleted file mode 100644 index d66aaa32..00000000 --- a/wp/wp-content/plugins/json-api/singletons/introspector.php +++ /dev/null @@ -1,345 +0,0 @@ -set_posts_query($query); - $output = array(); - while (have_posts()) { - the_post(); - if ($wp_posts) { - $new_post = $post; - } else { - $new_post = new JSON_API_Post($post); - } - $output[] = $new_post; - } - return $output; - } - - public function get_date_archive_permalinks() { - $archives = wp_get_archives('echo=0'); - preg_match_all("/href='([^']+)'/", $archives, $matches); - return $matches[1]; - } - - public function get_date_archive_tree($permalinks) { - $tree = array(); - foreach ($permalinks as $url) { - if (preg_match('#(\d{4})/(\d{2})#', $url, $date)) { - $year = $date[1]; - $month = $date[2]; - } else if (preg_match('/(\d{4})(\d{2})/', $url, $date)) { - $year = $date[1]; - $month = $date[2]; - } else { - continue; - } - $count = $this->get_date_archive_count($year, $month); - if (empty($tree[$year])) { - $tree[$year] = array( - $month => $count - ); - } else { - $tree[$year][$month] = $count; - } - } - return $tree; - } - - public function get_date_archive_count($year, $month) { - if (!isset($this->month_archives)) { - global $wpdb; - $post_counts = $wpdb->get_results(" - SELECT DATE_FORMAT(post_date, '%Y%m') AS month, - COUNT(ID) AS post_count - FROM $wpdb->posts - WHERE post_status = 'publish' - AND post_type = 'post' - GROUP BY month - "); - $this->month_archives = array(); - foreach ($post_counts as $post_count) { - $this->month_archives[$post_count->month] = $post_count->post_count; - } - } - return $this->month_archives["$year$month"]; - } - - public function get_categories($args = null) { - $wp_categories = get_categories($args); - $categories = array(); - foreach ($wp_categories as $wp_category) { - if ($wp_category->term_id == 1 && $wp_category->slug == 'uncategorized') { - continue; - } - $categories[] = $this->get_category_object($wp_category); - } - return $categories; - } - - public function get_current_post() { - global $json_api; - extract($json_api->query->get(array('id', 'slug', 'post_id', 'post_slug'))); - if ($id || $post_id) { - if (!$id) { - $id = $post_id; - } - $posts = $this->get_posts(array( - 'p' => $id - ), true); - } else if ($slug || $post_slug) { - if (!$slug) { - $slug = $post_slug; - } - $posts = $this->get_posts(array( - 'name' => $slug - ), true); - } else { - $json_api->error("Include 'id' or 'slug' var in your request."); - } - if (!empty($posts)) { - return $posts[0]; - } else { - return null; - } - } - - public function get_current_category() { - global $json_api; - extract($json_api->query->get(array('id', 'slug', 'category_id', 'category_slug'))); - if ($id || $category_id) { - if (!$id) { - $id = $category_id; - } - return $this->get_category_by_id($id); - } else if ($slug || $category_slug) { - if (!$slug) { - $slug = $category_slug; - } - return $this->get_category_by_slug($slug); - } else { - $json_api->error("Include 'id' or 'slug' var in your request."); - } - return null; - } - - public function get_category_by_id($category_id) { - $wp_category = get_term_by('id', $category_id, 'category'); - return $this->get_category_object($wp_category); - } - - public function get_category_by_slug($category_slug) { - $wp_category = get_term_by('slug', $category_slug, 'category'); - return $this->get_category_object($wp_category); - } - - public function get_tags() { - $wp_tags = get_tags(); - return array_map(array(&$this, 'get_tag_object'), $wp_tags); - } - - public function get_current_tag() { - global $json_api; - extract($json_api->query->get(array('id', 'slug', 'tag_id', 'tag_slug'))); - if ($id || $tag_id) { - if (!$id) { - $id = $tag_id; - } - return $this->get_tag_by_id($id); - } else if ($slug || $tag_slug) { - if (!$slug) { - $slug = $tag_slug; - } - return $this->get_tag_by_slug($slug); - } else { - $json_api->error("Include 'id' or 'slug' var in your request."); - } - return null; - } - - public function get_tag_by_id($tag_id) { - $wp_tag = get_term_by('id', $tag_id, 'post_tag'); - return $this->get_tag_object($wp_tag); - } - - public function get_tag_by_slug($tag_slug) { - $wp_tag = get_term_by('slug', $tag_slug, 'post_tag'); - return $this->get_tag_object($wp_tag); - } - - public function get_authors() { - global $wpdb; - $author_ids = $wpdb->get_col(" - SELECT u.ID, m.meta_value AS last_name - FROM $wpdb->users AS u, - $wpdb->usermeta AS m - WHERE m.user_id = u.ID - AND m.meta_key = 'last_name' - ORDER BY last_name - "); - $all_authors = array_map(array(&$this, 'get_author_by_id'), $author_ids); - $active_authors = array_filter($all_authors, array(&$this, 'is_active_author')); - return $active_authors; - } - - public function get_current_author() { - global $json_api; - extract($json_api->query->get(array('id', 'slug', 'author_id', 'author_slug'))); - if ($id || $author_id) { - if (!$id) { - $id = $author_id; - } - return $this->get_author_by_id($id); - } else if ($slug || $author_slug) { - if (!$slug) { - $slug = $author_slug; - } - return $this->get_author_by_login($slug); - } else { - $json_api->error("Include 'id' or 'slug' var in your request."); - } - return null; - } - - public function get_author_by_id($id) { - $id = get_the_author_meta('ID', $id); - if (!$id) { - return null; - } - return new JSON_API_Author($id); - } - - public function get_author_by_login($login) { - global $wpdb; - $id = $wpdb->get_var($wpdb->prepare(" - SELECT ID - FROM $wpdb->users - WHERE user_nicename = %s - ", $login)); - return $this->get_author_by_id($id); - } - - public function get_comments($post_id) { - global $wpdb; - $wp_comments = $wpdb->get_results($wpdb->prepare(" - SELECT * - FROM $wpdb->comments - WHERE comment_post_ID = %d - AND comment_approved = 1 - AND comment_type = '' - ORDER BY comment_date - ", $post_id)); - $comments = array(); - foreach ($wp_comments as $wp_comment) { - $comments[] = new JSON_API_Comment($wp_comment); - } - return $comments; - } - - public function get_attachments($post_id) { - $wp_attachments = get_children(array( - 'post_type' => 'attachment', - 'post_parent' => $post_id, - 'orderby' => 'menu_order', - 'order' => 'ASC', - 'suppress_filters' => false - )); - $attachments = array(); - if (!empty($wp_attachments)) { - foreach ($wp_attachments as $wp_attachment) { - $attachments[] = new JSON_API_Attachment($wp_attachment); - } - } - return $attachments; - } - - public function get_attachment($attachment_id) { - global $wpdb; - $wp_attachment = $wpdb->get_row( - $wpdb->prepare(" - SELECT * - FROM $wpdb->posts - WHERE ID = %d - ", $attachment_id) - ); - return new JSON_API_Attachment($wp_attachment); - } - - public function attach_child_posts(&$post) { - $post->children = array(); - $wp_children = get_posts(array( - 'post_type' => $post->type, - 'post_parent' => $post->id, - 'order' => 'ASC', - 'orderby' => 'menu_order', - 'numberposts' => -1, - 'suppress_filters' => false - )); - foreach ($wp_children as $wp_post) { - $new_post = new JSON_API_Post($wp_post); - $new_post->parent = $post->id; - $post->children[] = $new_post; - } - foreach ($post->children as $child) { - $this->attach_child_posts($child); - } - } - - protected function get_category_object($wp_category) { - if (!$wp_category) { - return null; - } - return new JSON_API_Category($wp_category); - } - - protected function get_tag_object($wp_tag) { - if (!$wp_tag) { - return null; - } - return new JSON_API_Tag($wp_tag); - } - - protected function is_active_author($author) { - if (!isset($this->active_authors)) { - $this->active_authors = explode(',', wp_list_authors(array( - 'html' => false, - 'echo' => false, - 'exclude_admin' => false - ))); - $this->active_authors = array_map('trim', $this->active_authors); - } - return in_array($author->name, $this->active_authors); - } - - protected function set_posts_query($query = false) { - global $json_api, $wp_query; - - if (!$query) { - $query = array(); - } - - $query = array_merge($query, $wp_query->query); - - if ($json_api->query->page) { - $query['paged'] = $json_api->query->page; - } - - if ($json_api->query->count) { - $query['posts_per_page'] = $json_api->query->count; - } - - if ($json_api->query->post_type) { - $query['post_type'] = $json_api->query->post_type; - } - - if (!empty($query)) { - query_posts($query); - do_action('json_api_query', $wp_query); - } - } - -} - -?> diff --git a/wp/wp-content/plugins/json-api/singletons/query.php b/wp/wp-content/plugins/json-api/singletons/query.php deleted file mode 100644 index a45059c9..00000000 --- a/wp/wp-content/plugins/json-api/singletons/query.php +++ /dev/null @@ -1,194 +0,0 @@ - 'Y-m-d H:i:s', - 'read_more' => 'Read more' - ); - - function __construct() { - // Register JSON API query vars - add_filter('query_vars', array(&$this, 'query_vars')); - } - - function get($key) { - if (is_array($key)) { - $result = array(); - foreach ($key as $k) { - $result[$k] = $this->get($k); - } - return $result; - } - $query_var = (isset($_REQUEST[$key])) ? $_REQUEST[$key] : null; - $wp_query_var = $this->wp_query_var($key); - if ($wp_query_var) { - return $wp_query_var; - } else if ($query_var) { - return $this->strip_magic_quotes($query_var); - } else if (isset($this->defaults[$key])) { - return $this->defaults[$key]; - } else { - return null; - } - } - - function __get($key) { - return $this->get($key); - } - - function __isset($key) { - return ($this->get($key) !== null); - } - - function wp_query_var($key) { - $wp_translation = array( - 'json' => 'json', - 'post_id' => 'p', - 'post_slug' => 'name', - 'page_id' => 'page_id', - 'page_slug' => 'name', - 'category_id' => 'cat', - 'category_slug' => 'category_name', - 'tag_id' => 'tag_id', - 'tag_slug' => 'tag', - 'author_id' => 'author', - 'author_slug' => 'author_name', - 'search' => 's', - 'order' => 'order', - 'order_by' => 'orderby' - ); - if ($key == 'date') { - $date = null; - if (get_query_var('year')) { - $date = get_query_var('year'); - } - if (get_query_var('monthnum')) { - $month = get_query_var('monthnum'); - if ($month < 10) { - $month = "0$month"; - } - $date .= $month; - } - if (get_query_var('day')) { - $day = get_query_var('day'); - if ($day < 10) { - $day = "0$day"; - } - $date .= $day; - } - return $date; - } else if (isset($wp_translation[$key])) { - return get_query_var($wp_translation[$key]); - } else { - return null; - } - } - - function strip_magic_quotes($value) { - if (get_magic_quotes_gpc()) { - return stripslashes($value); - } else { - return $value; - } - } - - function query_vars($wp_vars) { - $wp_vars[] = 'json'; - return $wp_vars; - } - - function get_controller() { - $json = $this->get('json'); - if (empty($json)) { - return false; - } - if (preg_match('/^[a-zA-Z_]+$/', $json)) { - return $this->get_legacy_controller($json); - } else if (preg_match('/^([a-zA-Z0-9_]+)(\/|\.)[a-zA-Z0-9_]+$/', $json, $matches)) { - return $matches[1]; - } else { - return 'core'; - } - } - - function get_legacy_controller($json) { - global $json_api; - if ($json == 'submit_comment') { - if ($json_api->controller_is_active('respond')) { - return 'respond'; - } else { - $json_api->error("The 'submit_comment' method has been removed from the Core controller. To use this method you must enable the Respond controller from WP Admin > Settings > JSON API."); - } - } else if ($json == 'create_post') { - if ($json_api->controller_is_active('posts')) { - return 'posts'; - } else { - $json_api->error("The 'create_post' method has been removed from the Core controller. To use this method you must enable the Posts controller from WP Admin > Settings > JSON API."); - } - } else { - return 'core'; - } - } - - function get_method($controller) { - - global $json_api; - - // Returns an appropriate API method name or false. Four possible outcomes: - // 1. API isn't being invoked at all (return false) - // 2. A specific API method was requested (return method name) - // 3. A method is chosen implicitly on a given WordPress page - // 4. API invoked incorrectly (return "error" method) - // - // Note: - // The implicit outcome (3) is invoked by setting the json query var to a - // non-empty value on any WordPress page: - // * http://example.org/2009/11/10/hello-world/?json=1 (get_post) - // * http://example.org/2009/11/?json=1 (get_date_posts) - // * http://example.org/category/foo?json=1 (get_category_posts) - - $method = $this->get('json'); - if (strpos($method, '/') !== false) { - $method = substr($method, strpos($method, '/') + 1); - } else if (strpos($method, '.') !== false) { - $method = substr($method, strpos($method, '.') + 1); - } - - if (empty($method)) { - // Case 1: we're not being invoked (done!) - return false; - } else if (method_exists("JSON_API_{$controller}_Controller", $method)) { - // Case 2: an explicit method was specified - return $method; - } else if ($controller == 'core') { - // Case 3: choose the method implicitly based on which page we're on... - if (is_search()) { - return 'get_search_results'; - } else if (is_home()) { - if (empty($_GET['json'])) { - $json_api->error("Uknown method '$method'."); - } - return 'get_recent_posts'; - } else if (is_page()) { - return 'get_page'; - } else if (is_single()) { - return 'get_post'; - } else if (is_category()) { - return 'get_category_posts'; - } else if (is_tag()) { - return 'get_tag_posts'; - } else if (is_author()) { - return 'get_author_posts'; - } else if (is_date()) { - return 'get_date_posts'; - } else if (is_404()) { - return '404'; - } - } - // Case 4: either the method doesn't exist or we don't support the page implicitly - return 'error'; - } - -} diff --git a/wp/wp-content/plugins/json-api/singletons/response.php b/wp/wp-content/plugins/json-api/singletons/response.php deleted file mode 100644 index 6c161f93..00000000 --- a/wp/wp-content/plugins/json-api/singletons/response.php +++ /dev/null @@ -1,206 +0,0 @@ -include_values = array(); - $this->exclude_values = array(); - if ($json_api->query->include) { - $this->include_values = explode(',', $json_api->query->include); - } - // Props to ikesyo for submitting a fix! - if ($json_api->query->exclude) { - $this->exclude_values = explode(',', $json_api->query->exclude); - $this->include_values = array_diff($this->include_values, $this->exclude_values); - } - - // Compatibility with Disqus plugin - remove_action('loop_end', 'dsq_loop_end'); - } - - function get_json($data, $status = 'ok') { - global $json_api; - // Include a status value with the response - if (is_array($data)) { - $data = array_merge(array('status' => $status), $data); - } else if (is_object($data)) { - $data = get_object_vars($data); - $data = array_merge(array('status' => $status), $data); - } - - $data = apply_filters('json_api_encode', $data); - - if (function_exists('json_encode')) { - // Use the built-in json_encode function if it's available - if (version_compare(PHP_VERSION, '5.3') < 0) { - $json = json_encode($data); - } else { - $json_encode_options = 0; - if ($json_api->query->json_encode_options) { - $json_encode_options = $json_api->query->json_encode_options; - } - $json = json_encode($data, $json_encode_options); - } - } else { - // Use PEAR's Services_JSON encoder otherwise - if (!class_exists('Services_JSON')) { - $dir = json_api_dir(); - require_once "$dir/library/JSON.php"; - } - $json_service = new Services_JSON(); - $json = $json_service->encode($data); - } - - // Thanks to Stack Overflow user Gumbo stackoverflow.com/questions/2934563 - if ($json_api->query->json_unescaped_unicode) { - $callback = array($this, 'replace_unicode_escape_sequence'); - $json = preg_replace_callback('/\\\\u([0-9a-f]{4})/i', $callback, $json); - } - - return $json; - } - - function is_value_included($key) { - // Props to ikesyo for submitting a fix! - if (empty($this->include_values) && empty($this->exclude_values)) { - return true; - } else { - if (empty($this->exclude_values)) { - return in_array($key, $this->include_values); - } else { - return !in_array($key, $this->exclude_values); - } - } - } - - function respond($result, $status = 'ok') { - global $json_api; - $json = $this->get_json($result, $status); - $status_redirect = "redirect_$status"; - if ($json_api->query->dev || !empty($_REQUEST['dev'])) { - // Output the result in a human-redable format - if (!headers_sent()) { - header('HTTP/1.1 200 OK'); - header('Content-Type: text/plain; charset: UTF-8', true); - } else { - echo '
';
-      }
-      echo $json;
-      //echo $this->prettify($json);
-    } else if (!empty($_REQUEST[$status_redirect])) {
-      wp_redirect($_REQUEST[$status_redirect]);
-    } else if ($json_api->query->redirect) {
-      $url = $this->add_status_query_var($json_api->query->redirect, $status);
-      wp_redirect($url);
-    } else if ($json_api->query->callback) {
-      // Run a JSONP-style callback with the result
-      $this->callback($json_api->query->callback, $json);
-    } else {
-      // Output the result
-      $this->output($json);
-    }
-    exit;
-  }
-  
-  function output($result) {
-    $charset = get_option('blog_charset');
-    if (!headers_sent()) {
-      header('HTTP/1.1 200 OK', true);
-      header("Content-Type: application/json; charset=$charset", true);
-    }
-    echo $result;
-  }
-  
-  function callback($callback, $result) {
-    $charset = get_option('blog_charset');
-    if (!headers_sent()) {
-      header('HTTP/1.1 200 OK', true);
-      header("Content-Type: application/javascript; charset=$charset", true);
-    }
-    echo "$callback($result)";
-  }
-  
-  function add_status_query_var($url, $status) {
-    if (strpos($url, '#')) {
-      // Remove the anchor hash for now
-      $pos = strpos($url, '#');
-      $anchor = substr($url, $pos);
-      $url = substr($url, 0, $pos);
-    }
-    if (strpos($url, '?')) {
-      $url .= "&status=$status";
-    } else {
-      $url .= "?status=$status";
-    }
-    if (!empty($anchor)) {
-      // Add the anchor hash back in
-      $url .= $anchor;
-    }
-    return $url;
-  }
-  
-  function prettify($ugly) {
-    $pretty = "";
-    $indent = "";
-    $last = '';
-    $pos = 0;
-    $level = 0;
-    $string = false;
-    while ($pos < strlen($ugly)) {
-      $char = substr($ugly, $pos++, 1);
-      if (!$string) {
-        if ($char == '{' || $char == '[') {
-          if ($char == '[' && substr($ugly, $pos, 1) == ']') {
-            $pretty .= "[]";
-            $pos++;
-          } else if ($char == '{' && substr($ugly, $pos, 1) == '}') {
-            $pretty .= "{}";
-            $pos++;
-          } else {
-            $pretty .= "$char\n";
-            $indent = str_repeat('  ', ++$level);
-            $pretty .= "$indent";
-          }
-        } else if ($char == '}' || $char == ']') {
-          $indent = str_repeat('  ', --$level);
-          if ($last != '}' && $last != ']') {
-            $pretty .= "\n$indent";
-          } else if (substr($pretty, -2, 2) == '  ') {
-            $pretty = substr($pretty, 0, -2);
-          }
-          $pretty .= $char;
-          if (substr($ugly, $pos, 1) == ',') {
-            $pretty .= ",";
-            $last = ',';
-            $pos++;
-          }
-          $pretty .= "\n$indent";
-        } else if ($char == ':') {
-          $pretty .= ": ";
-        } else if ($char == ',') {
-          $pretty .= ",\n$indent";
-        } else if ($char == '"') {
-          $pretty .= '"';
-          $string = true;
-        } else {
-          $pretty .= $char;
-        }
-      } else {
-        if ($last != '\\' && $char == '"') {
-          $string = false;
-        }
-        $pretty .= $char;
-      }
-      $last = $char;
-    }
-    return $pretty;
-  }
-  
-  function replace_unicode_escape_sequence($match) {
-    return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
-  }
-  
-}
-
-?>
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_author_index-01.phpt b/wp/wp-content/plugins/json-api/tests/core.get_author_index-01.phpt
deleted file mode 100644
index d7f8430a..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_author_index-01.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-core.get_author_index
---FILE--
-get('http://wordpress.test/?json=core.get_author_index&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$author = $response->authors[0];
-
-echo "Response status: $response->status\n";
-echo "Author count: $response->count\n";
-echo "Author name: $author->name\n";
-
-?>
---EXPECT--
-Response status: ok
-Author count: 1
-Author name: themedemos
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_author_posts-01.phpt b/wp/wp-content/plugins/json-api/tests/core.get_author_posts-01.phpt
deleted file mode 100644
index 5c545bf2..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_author_posts-01.phpt
+++ /dev/null
@@ -1,22 +0,0 @@
---TEST--
-core.get_author_posts by slug
---FILE--
-get('http://wordpress.test/?json=core.get_author_posts&slug=themedemos&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$author = $response->author;
-$post = $response->posts[0];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "First post title: $post->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 10
-First post title: Markup: HTML Tags and Formatting
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_author_posts-02.phpt b/wp/wp-content/plugins/json-api/tests/core.get_author_posts-02.phpt
deleted file mode 100644
index 578be1ed..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_author_posts-02.phpt
+++ /dev/null
@@ -1,22 +0,0 @@
---TEST--
-core.get_author_posts by author_slug
---FILE--
-get('http://wordpress.test/?json=core.get_author_posts&author_slug=themedemos&page=2&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$author = $response->author;
-$post = $response->posts[0];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "First post title: $post->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 10
-First post title: Template: Paginated
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_author_posts-03.phpt b/wp/wp-content/plugins/json-api/tests/core.get_author_posts-03.phpt
deleted file mode 100644
index 67bff74a..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_author_posts-03.phpt
+++ /dev/null
@@ -1,22 +0,0 @@
---TEST--
-core.get_author_posts by id
---FILE--
-get('http://wordpress.test/?json=core.get_author_posts&id=2&count=20&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$author = $response->author;
-$post = $response->posts[0];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "First post title: $post->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 20
-First post title: Markup: HTML Tags and Formatting
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_category_index-01.phpt b/wp/wp-content/plugins/json-api/tests/core.get_category_index-01.phpt
deleted file mode 100644
index 6bf23fda..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_category_index-01.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-core.get_category_index 
---FILE--
-get('http://wordpress.test/?json=core.get_category_index&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$category = $response->categories[0];
-
-echo "Response status: $response->status\n";
-echo "Category count: $response->count\n";
-echo "Category name: $category->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Category count: 63
-Category name: aciform
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_category_posts-01.phpt b/wp/wp-content/plugins/json-api/tests/core.get_category_posts-01.phpt
deleted file mode 100644
index d580cde1..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_category_posts-01.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-core.get_category_posts default
---FILE--
-get('http://wordpress.test/?json=core.get_category_posts&slug=markup&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$post = $response->posts[0];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "Post title: $post->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 6
-Post title: Markup: HTML Tags and Formatting
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_date_index-01.phpt b/wp/wp-content/plugins/json-api/tests/core.get_date_index-01.phpt
deleted file mode 100644
index b8e4ca1c..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_date_index-01.phpt
+++ /dev/null
@@ -1,80 +0,0 @@
---TEST--
-core.get_search_posts default
---FILE--
-get('http://wordpress.test/?json=core.get_date_index&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$count = count($response->permalinks);
-
-echo "Response status: $response->status\n";
-echo "Permalink count: $count\n";
-echo "Tree:\n";
-var_dump($response->tree);
-
-
-?>
---EXPECT--
-Response status: ok
-Permalink count: 20
-Tree:
-object(stdClass)#5 (5) {
-  ["2013"]=>
-  object(stdClass)#6 (1) {
-    ["01"]=>
-    string(1) "5"
-  }
-  ["2012"]=>
-  object(stdClass)#4 (2) {
-    ["03"]=>
-    string(1) "5"
-    ["01"]=>
-    string(1) "6"
-  }
-  ["2011"]=>
-  object(stdClass)#7 (1) {
-    ["03"]=>
-    string(1) "1"
-  }
-  ["2010"]=>
-  object(stdClass)#8 (10) {
-    ["10"]=>
-    string(1) "1"
-    ["09"]=>
-    string(1) "2"
-    ["08"]=>
-    string(1) "3"
-    ["07"]=>
-    string(1) "1"
-    ["06"]=>
-    string(1) "3"
-    ["05"]=>
-    string(1) "1"
-    ["04"]=>
-    string(1) "1"
-    ["03"]=>
-    string(1) "1"
-    ["02"]=>
-    string(1) "1"
-    ["01"]=>
-    string(1) "1"
-  }
-  ["2009"]=>
-  object(stdClass)#9 (6) {
-    ["10"]=>
-    string(1) "1"
-    ["09"]=>
-    string(1) "1"
-    ["08"]=>
-    string(1) "1"
-    ["07"]=>
-    string(1) "1"
-    ["06"]=>
-    string(1) "1"
-    ["05"]=>
-    string(1) "1"
-  }
-}
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_date_posts-01.phpt b/wp/wp-content/plugins/json-api/tests/core.get_date_posts-01.phpt
deleted file mode 100644
index 6f8ac7a6..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_date_posts-01.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-core.get_date_posts by day
---FILE--
-get('http://wordpress.test/?json=core.get_date_posts&date=2013-01&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$post = $response->posts[0];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "Post title: $post->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 5
-Post title: Markup: HTML Tags and Formatting
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_date_posts-02.phpt b/wp/wp-content/plugins/json-api/tests/core.get_date_posts-02.phpt
deleted file mode 100644
index 71c989ce..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_date_posts-02.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-core.get_date_posts by month
---FILE--
-get('http://wordpress.test/?json=core.get_date_posts&date=2013-01&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$post = $response->posts[0];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "Post title: $post->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 5
-Post title: Markup: HTML Tags and Formatting
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_date_posts-03.phpt b/wp/wp-content/plugins/json-api/tests/core.get_date_posts-03.phpt
deleted file mode 100644
index 045fb2de..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_date_posts-03.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-core.get_date_posts by year
---FILE--
-get('http://wordpress.test/?json=core.get_date_posts&date=2012&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$post = $response->posts[0];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "Post title: $post->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 10
-Post title: Template: Featured Image (Vertical)
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_page-01.phpt b/wp/wp-content/plugins/json-api/tests/core.get_page-01.phpt
deleted file mode 100644
index b5c41c46..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_page-01.phpt
+++ /dev/null
@@ -1,19 +0,0 @@
---TEST--
-core.get_page default
---FILE--
-get('http://wordpress.test/?json=core.get_page&slug=about&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-
-echo "Response status: $response->status\n";
-echo "Page title: {$response->page->title}\n";
-
-
-?>
---EXPECT--
-Response status: ok
-Page title: About The Tests
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_page-02.phpt b/wp/wp-content/plugins/json-api/tests/core.get_page-02.phpt
deleted file mode 100644
index 6fbb6275..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_page-02.phpt
+++ /dev/null
@@ -1,25 +0,0 @@
---TEST--
-core.get_page children argument
---FILE--
-get('http://wordpress.test/?json=core.get_page&slug=level-1&children=1&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$page = $response->page;
-$child = $page->children[0];
-$grandchild = $child->children[0];
-
-echo "Response status: $response->status\n";
-echo "Page title: $page->title\n";
-echo "Child title: $child->title\n";
-echo "Grandchild title: $grandchild->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Page title: Level 1
-Child title: Level 2
-Grandchild title: Level 3
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_post-01.phpt b/wp/wp-content/plugins/json-api/tests/core.get_post-01.phpt
deleted file mode 100644
index 3b7c359a..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_post-01.phpt
+++ /dev/null
@@ -1,18 +0,0 @@
---TEST--
-core.get_post default
---FILE--
-get('http://wordpress.test/?json=core.get_post&slug=markup-html-tags-and-formatting&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-
-echo "Response status: $response->status\n";
-echo "post title: {$response->post->title}\n";
-
-?>
---EXPECT--
-Response status: ok
-post title: Markup: HTML Tags and Formatting
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_posts-01.phpt b/wp/wp-content/plugins/json-api/tests/core.get_posts-01.phpt
deleted file mode 100644
index c5b8ce3b..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_posts-01.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-core.get_posts default
---FILE--
-get('http://wordpress.test/?json=core.get_posts&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$post = $response->posts[0];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "Post title: $post->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 10
-Post title: Markup: HTML Tags and Formatting
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_posts-02.phpt b/wp/wp-content/plugins/json-api/tests/core.get_posts-02.phpt
deleted file mode 100644
index 107b1c99..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_posts-02.phpt
+++ /dev/null
@@ -1,24 +0,0 @@
---TEST--
-core.get_posts by meta key
---FILE--
-get('http://wordpress.test/?json=core.get_posts&meta_key=enclosure&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$post = $response->posts[0];
-$attachment = $post->attachments[0];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "Post title: $post->title\n";
-echo "Attachment title: $attachment->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 1
-Post title: Post Format: Audio
-Attachment title: St. Louis Blues
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_posts-03.phpt b/wp/wp-content/plugins/json-api/tests/core.get_posts-03.phpt
deleted file mode 100644
index 15d5381c..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_posts-03.phpt
+++ /dev/null
@@ -1,23 +0,0 @@
---TEST--
-core.get_posts by meta value
---FILE--
-get('http://wordpress.test/?json=core.get_posts&meta_key=_wp_old_slug&meta_value=excerpt&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$post = $response->posts[0];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "Post title: $post->title\n";
-echo "Post slug: $post->slug\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 1
-Post title: Template: Excerpt (Defined)
-Post slug: template-excerpt-defined
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_recent_posts-01.phpt b/wp/wp-content/plugins/json-api/tests/core.get_recent_posts-01.phpt
deleted file mode 100644
index 8fb66d63..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_recent_posts-01.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-core.get_recent_posts default
---FILE--
-get('http://wordpress.test/?json=core.get_recent_posts&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$post = $response->posts[0];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "Post title: $post->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 11
-Post title: Template: Sticky
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_recent_posts-02.phpt b/wp/wp-content/plugins/json-api/tests/core.get_recent_posts-02.phpt
deleted file mode 100644
index b4b8c9d0..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_recent_posts-02.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-core.get_recent_posts count argument
---FILE--
-get('http://wordpress.test/?json=core.get_recent_posts&count=3&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$post = $response->posts[3];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "Post title: $post->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 4
-Post title: Markup: Text Alignment
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_recent_posts-03.phpt b/wp/wp-content/plugins/json-api/tests/core.get_recent_posts-03.phpt
deleted file mode 100644
index cfff64ce..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_recent_posts-03.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-core.get_recent_posts page argument
---FILE--
-get('http://wordpress.test/?json=core.get_recent_posts&page=2&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$post = $response->posts[0];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "Post title: $post->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 10
-Post title: Template: Paginated
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_search_posts-01.phpt b/wp/wp-content/plugins/json-api/tests/core.get_search_posts-01.phpt
deleted file mode 100644
index 47f1f642..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_search_posts-01.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-core.get_search_posts default
---FILE--
-get('http://wordpress.test/?json=core.get_search_results&search=foolish&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$post = $response->posts[0];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "Post title: $post->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 2
-Post title: Page Markup And Formatting
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_tag_index-01.phpt b/wp/wp-content/plugins/json-api/tests/core.get_tag_index-01.phpt
deleted file mode 100644
index c6a3f9be..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_tag_index-01.phpt
+++ /dev/null
@@ -1,803 +0,0 @@
---TEST--
-core.get_tag_index
---FILE--
-get('http://wordpress.test/?json=core.get_tag_index&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-
-echo "Response status: $response->status\n";
-echo "Tag count: $response->count\n";
-echo "Tags:\n";
-var_dump($response->tags);
-
-?>
---EXPECT--
-Response status: ok
-Tag count: 60
-Tags:
-array(60) {
-  [0]=>
-  object(stdClass)#5 (5) {
-    ["id"]=>
-    int(66)
-    ["slug"]=>
-    string(4) "8bit"
-    ["title"]=>
-    string(4) "8BIT"
-    ["description"]=>
-    string(22) "Tags posts about 8BIT."
-    ["post_count"]=>
-    int(1)
-  }
-  [1]=>
-  object(stdClass)#6 (5) {
-    ["id"]=>
-    int(67)
-    ["slug"]=>
-    string(11) "alignment-2"
-    ["title"]=>
-    string(9) "alignment"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(3)
-  }
-  [2]=>
-  object(stdClass)#4 (5) {
-    ["id"]=>
-    int(68)
-    ["slug"]=>
-    string(8) "articles"
-    ["title"]=>
-    string(8) "Articles"
-    ["description"]=>
-    string(26) "Tags posts about Articles."
-    ["post_count"]=>
-    int(1)
-  }
-  [3]=>
-  object(stdClass)#7 (5) {
-    ["id"]=>
-    int(69)
-    ["slug"]=>
-    string(5) "aside"
-    ["title"]=>
-    string(5) "aside"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [4]=>
-  object(stdClass)#8 (5) {
-    ["id"]=>
-    int(70)
-    ["slug"]=>
-    string(5) "audio"
-    ["title"]=>
-    string(5) "audio"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [5]=>
-  object(stdClass)#9 (5) {
-    ["id"]=>
-    int(71)
-    ["slug"]=>
-    string(10) "captions-2"
-    ["title"]=>
-    string(8) "captions"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(2)
-  }
-  [6]=>
-  object(stdClass)#10 (5) {
-    ["id"]=>
-    int(72)
-    ["slug"]=>
-    string(10) "categories"
-    ["title"]=>
-    string(10) "categories"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(2)
-  }
-  [7]=>
-  object(stdClass)#11 (5) {
-    ["id"]=>
-    int(73)
-    ["slug"]=>
-    string(4) "chat"
-    ["title"]=>
-    string(4) "chat"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(2)
-  }
-  [8]=>
-  object(stdClass)#12 (5) {
-    ["id"]=>
-    int(77)
-    ["slug"]=>
-    string(5) "codex"
-    ["title"]=>
-    string(5) "Codex"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(3)
-  }
-  [9]=>
-  object(stdClass)#13 (5) {
-    ["id"]=>
-    int(78)
-    ["slug"]=>
-    string(10) "comments-2"
-    ["title"]=>
-    string(8) "comments"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(4)
-  }
-  [10]=>
-  object(stdClass)#14 (5) {
-    ["id"]=>
-    int(79)
-    ["slug"]=>
-    string(9) "content-2"
-    ["title"]=>
-    string(7) "content"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(12)
-  }
-  [11]=>
-  object(stdClass)#15 (5) {
-    ["id"]=>
-    int(81)
-    ["slug"]=>
-    string(3) "css"
-    ["title"]=>
-    string(3) "css"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(7)
-  }
-  [12]=>
-  object(stdClass)#16 (5) {
-    ["id"]=>
-    int(85)
-    ["slug"]=>
-    string(6) "dowork"
-    ["title"]=>
-    string(6) "dowork"
-    ["description"]=>
-    string(25) "Tags posts about #dowork."
-    ["post_count"]=>
-    int(1)
-  }
-  [13]=>
-  object(stdClass)#17 (5) {
-    ["id"]=>
-    int(86)
-    ["slug"]=>
-    string(9) "edge-case"
-    ["title"]=>
-    string(9) "edge case"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(8)
-  }
-  [14]=>
-  object(stdClass)#18 (5) {
-    ["id"]=>
-    int(87)
-    ["slug"]=>
-    string(8) "embeds-2"
-    ["title"]=>
-    string(6) "embeds"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(4)
-  }
-  [15]=>
-  object(stdClass)#19 (5) {
-    ["id"]=>
-    int(91)
-    ["slug"]=>
-    string(9) "excerpt-2"
-    ["title"]=>
-    string(7) "excerpt"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(3)
-  }
-  [16]=>
-  object(stdClass)#20 (5) {
-    ["id"]=>
-    int(92)
-    ["slug"]=>
-    string(4) "fail"
-    ["title"]=>
-    string(4) "Fail"
-    ["description"]=>
-    string(22) "Tags posts about fail."
-    ["post_count"]=>
-    int(1)
-  }
-  [17]=>
-  object(stdClass)#21 (5) {
-    ["id"]=>
-    int(93)
-    ["slug"]=>
-    string(14) "featured-image"
-    ["title"]=>
-    string(14) "featured image"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(3)
-  }
-  [18]=>
-  object(stdClass)#22 (5) {
-    ["id"]=>
-    int(96)
-    ["slug"]=>
-    string(12) "formatting-2"
-    ["title"]=>
-    string(10) "formatting"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [19]=>
-  object(stdClass)#23 (5) {
-    ["id"]=>
-    int(97)
-    ["slug"]=>
-    string(3) "ftw"
-    ["title"]=>
-    string(3) "FTW"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [20]=>
-  object(stdClass)#24 (5) {
-    ["id"]=>
-    int(98)
-    ["slug"]=>
-    string(3) "fun"
-    ["title"]=>
-    string(3) "Fun"
-    ["description"]=>
-    string(21) "Tags posts about fun."
-    ["post_count"]=>
-    int(1)
-  }
-  [21]=>
-  object(stdClass)#25 (5) {
-    ["id"]=>
-    int(99)
-    ["slug"]=>
-    string(7) "gallery"
-    ["title"]=>
-    string(7) "gallery"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(3)
-  }
-  [22]=>
-  object(stdClass)#26 (5) {
-    ["id"]=>
-    int(105)
-    ["slug"]=>
-    string(4) "html"
-    ["title"]=>
-    string(4) "html"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(5)
-  }
-  [23]=>
-  object(stdClass)#27 (5) {
-    ["id"]=>
-    int(106)
-    ["slug"]=>
-    string(5) "image"
-    ["title"]=>
-    string(5) "image"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(7)
-  }
-  [24]=>
-  object(stdClass)#28 (5) {
-    ["id"]=>
-    int(109)
-    ["slug"]=>
-    string(9) "jetpack-2"
-    ["title"]=>
-    string(7) "jetpack"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(3)
-  }
-  [25]=>
-  object(stdClass)#29 (5) {
-    ["id"]=>
-    int(111)
-    ["slug"]=>
-    string(6) "layout"
-    ["title"]=>
-    string(6) "layout"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(4)
-  }
-  [26]=>
-  object(stdClass)#30 (5) {
-    ["id"]=>
-    int(112)
-    ["slug"]=>
-    string(4) "link"
-    ["title"]=>
-    string(4) "link"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(2)
-  }
-  [27]=>
-  object(stdClass)#31 (5) {
-    ["id"]=>
-    int(113)
-    ["slug"]=>
-    string(7) "lists-2"
-    ["title"]=>
-    string(5) "lists"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [28]=>
-  object(stdClass)#32 (5) {
-    ["id"]=>
-    int(115)
-    ["slug"]=>
-    string(4) "love"
-    ["title"]=>
-    string(4) "Love"
-    ["description"]=>
-    string(22) "Tags posts about love."
-    ["post_count"]=>
-    int(1)
-  }
-  [29]=>
-  object(stdClass)#33 (5) {
-    ["id"]=>
-    int(116)
-    ["slug"]=>
-    string(8) "markup-2"
-    ["title"]=>
-    string(6) "markup"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(6)
-  }
-  [30]=>
-  object(stdClass)#34 (5) {
-    ["id"]=>
-    int(117)
-    ["slug"]=>
-    string(5) "media"
-    ["title"]=>
-    string(5) "media"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [31]=>
-  object(stdClass)#35 (5) {
-    ["id"]=>
-    int(122)
-    ["slug"]=>
-    string(10) "mothership"
-    ["title"]=>
-    string(10) "Mothership"
-    ["description"]=>
-    string(29) "Tags posts about motherships."
-    ["post_count"]=>
-    int(1)
-  }
-  [32]=>
-  object(stdClass)#36 (5) {
-    ["id"]=>
-    int(123)
-    ["slug"]=>
-    string(8) "mustread"
-    ["title"]=>
-    string(9) "Must Read"
-    ["description"]=>
-    string(40) "Tags posts about articles you must read."
-    ["post_count"]=>
-    int(1)
-  }
-  [33]=>
-  object(stdClass)#37 (5) {
-    ["id"]=>
-    int(124)
-    ["slug"]=>
-    string(8) "nailedit"
-    ["title"]=>
-    string(9) "Nailed It"
-    ["description"]=>
-    string(32) "Tags posts about that nailed it."
-    ["post_count"]=>
-    int(1)
-  }
-  [34]=>
-  object(stdClass)#38 (5) {
-    ["id"]=>
-    int(126)
-    ["slug"]=>
-    string(10) "pagination"
-    ["title"]=>
-    string(10) "pagination"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [35]=>
-  object(stdClass)#39 (5) {
-    ["id"]=>
-    int(128)
-    ["slug"]=>
-    string(10) "password-2"
-    ["title"]=>
-    string(8) "password"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [36]=>
-  object(stdClass)#40 (5) {
-    ["id"]=>
-    int(129)
-    ["slug"]=>
-    string(8) "pictures"
-    ["title"]=>
-    string(8) "Pictures"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [37]=>
-  object(stdClass)#41 (5) {
-    ["id"]=>
-    int(130)
-    ["slug"]=>
-    string(11) "pingbacks-2"
-    ["title"]=>
-    string(9) "pingbacks"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [38]=>
-  object(stdClass)#42 (5) {
-    ["id"]=>
-    int(133)
-    ["slug"]=>
-    string(4) "post"
-    ["title"]=>
-    string(4) "post"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [39]=>
-  object(stdClass)#43 (5) {
-    ["id"]=>
-    int(38)
-    ["slug"]=>
-    string(12) "post-formats"
-    ["title"]=>
-    string(12) "Post Formats"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(16)
-  }
-  [40]=>
-  object(stdClass)#44 (5) {
-    ["id"]=>
-    int(139)
-    ["slug"]=>
-    string(5) "quote"
-    ["title"]=>
-    string(5) "quote"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(2)
-  }
-  [41]=>
-  object(stdClass)#45 (5) {
-    ["id"]=>
-    int(141)
-    ["slug"]=>
-    string(9) "read-more"
-    ["title"]=>
-    string(9) "read more"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [42]=>
-  object(stdClass)#46 (5) {
-    ["id"]=>
-    int(142)
-    ["slug"]=>
-    string(11) "readability"
-    ["title"]=>
-    string(11) "readability"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [43]=>
-  object(stdClass)#47 (5) {
-    ["id"]=>
-    int(145)
-    ["slug"]=>
-    string(9) "shortcode"
-    ["title"]=>
-    string(9) "shortcode"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(6)
-  }
-  [44]=>
-  object(stdClass)#48 (5) {
-    ["id"]=>
-    int(147)
-    ["slug"]=>
-    string(10) "standard-2"
-    ["title"]=>
-    string(8) "standard"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(2)
-  }
-  [45]=>
-  object(stdClass)#49 (5) {
-    ["id"]=>
-    int(148)
-    ["slug"]=>
-    string(6) "status"
-    ["title"]=>
-    string(6) "status"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [46]=>
-  object(stdClass)#50 (5) {
-    ["id"]=>
-    int(149)
-    ["slug"]=>
-    string(8) "sticky-2"
-    ["title"]=>
-    string(6) "sticky"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [47]=>
-  object(stdClass)#51 (5) {
-    ["id"]=>
-    int(150)
-    ["slug"]=>
-    string(7) "success"
-    ["title"]=>
-    string(7) "Success"
-    ["description"]=>
-    string(25) "Tags posts about success."
-    ["post_count"]=>
-    int(1)
-  }
-  [48]=>
-  object(stdClass)#52 (5) {
-    ["id"]=>
-    int(151)
-    ["slug"]=>
-    string(7) "swagger"
-    ["title"]=>
-    string(7) "Swagger"
-    ["description"]=>
-    string(25) "Tags posts about swagger."
-    ["post_count"]=>
-    int(1)
-  }
-  [49]=>
-  object(stdClass)#53 (5) {
-    ["id"]=>
-    int(158)
-    ["slug"]=>
-    string(4) "tags"
-    ["title"]=>
-    string(4) "Tags"
-    ["description"]=>
-    string(33) "Tags posts about tags. #inception"
-    ["post_count"]=>
-    int(1)
-  }
-  [50]=>
-  object(stdClass)#54 (5) {
-    ["id"]=>
-    int(159)
-    ["slug"]=>
-    string(8) "template"
-    ["title"]=>
-    string(8) "template"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(12)
-  }
-  [51]=>
-  object(stdClass)#55 (5) {
-    ["id"]=>
-    int(163)
-    ["slug"]=>
-    string(5) "tiled"
-    ["title"]=>
-    string(5) "tiled"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [52]=>
-  object(stdClass)#56 (5) {
-    ["id"]=>
-    int(164)
-    ["slug"]=>
-    string(5) "title"
-    ["title"]=>
-    string(5) "title"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(5)
-  }
-  [53]=>
-  object(stdClass)#57 (5) {
-    ["id"]=>
-    int(165)
-    ["slug"]=>
-    string(12) "trackbacks-2"
-    ["title"]=>
-    string(10) "trackbacks"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(1)
-  }
-  [54]=>
-  object(stdClass)#58 (5) {
-    ["id"]=>
-    int(166)
-    ["slug"]=>
-    string(9) "twitter-2"
-    ["title"]=>
-    string(7) "twitter"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(2)
-  }
-  [55]=>
-  object(stdClass)#59 (5) {
-    ["id"]=>
-    int(168)
-    ["slug"]=>
-    string(6) "unseen"
-    ["title"]=>
-    string(6) "Unseen"
-    ["description"]=>
-    string(46) "Tags posts about things that cannot be unseen."
-    ["post_count"]=>
-    int(1)
-  }
-  [56]=>
-  object(stdClass)#60 (5) {
-    ["id"]=>
-    int(169)
-    ["slug"]=>
-    string(5) "video"
-    ["title"]=>
-    string(5) "video"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(3)
-  }
-  [57]=>
-  object(stdClass)#61 (5) {
-    ["id"]=>
-    int(170)
-    ["slug"]=>
-    string(10) "videopress"
-    ["title"]=>
-    string(10) "videopress"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(2)
-  }
-  [58]=>
-  object(stdClass)#62 (5) {
-    ["id"]=>
-    int(172)
-    ["slug"]=>
-    string(9) "wordpress"
-    ["title"]=>
-    string(9) "WordPress"
-    ["description"]=>
-    string(27) "Tags posts about WordPress."
-    ["post_count"]=>
-    int(1)
-  }
-  [59]=>
-  object(stdClass)#63 (5) {
-    ["id"]=>
-    int(173)
-    ["slug"]=>
-    string(12) "wordpress-tv"
-    ["title"]=>
-    string(12) "wordpress.tv"
-    ["description"]=>
-    string(0) ""
-    ["post_count"]=>
-    int(2)
-  }
-}
diff --git a/wp/wp-content/plugins/json-api/tests/core.get_tag_posts-01.phpt b/wp/wp-content/plugins/json-api/tests/core.get_tag_posts-01.phpt
deleted file mode 100644
index 3d01fb63..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.get_tag_posts-01.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-core.get_tag_posts default
---FILE--
-get('http://wordpress.test/?json=core.get_tag_posts&slug=css&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$post = $response->posts[0];
-
-echo "Response status: $response->status\n";
-echo "Post count: $response->count\n";
-echo "Post title: $post->title\n";
-
-?>
---EXPECT--
-Response status: ok
-Post count: 7
-Post title: Markup: HTML Tags and Formatting
diff --git a/wp/wp-content/plugins/json-api/tests/core.info-01.phpt b/wp/wp-content/plugins/json-api/tests/core.info-01.phpt
deleted file mode 100644
index 89a14443..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.info-01.phpt
+++ /dev/null
@@ -1,29 +0,0 @@
---TEST--
-core.info default
---FILE--
-get('http://wordpress.test/?json=core.info&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-
-echo "Response status: $response->status\n";
-echo "Controllers:\n";
-var_dump($response->controllers);
-
-?>
---EXPECT--
-Response status: ok
-Controllers:
-array(4) {
-  [0]=>
-  string(4) "core"
-  [1]=>
-  string(5) "posts"
-  [2]=>
-  string(7) "respond"
-  [3]=>
-  string(7) "widgets"
-}
diff --git a/wp/wp-content/plugins/json-api/tests/core.info-02.phpt b/wp/wp-content/plugins/json-api/tests/core.info-02.phpt
deleted file mode 100644
index 162512dc..00000000
--- a/wp/wp-content/plugins/json-api/tests/core.info-02.phpt
+++ /dev/null
@@ -1,57 +0,0 @@
---TEST--
-core.info controller detail
---FILE--
-get('http://wordpress.test/?json=core.info&controller=core&dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-
-echo "Response status: $response->status\n";
-echo "Name: $response->name\n";
-echo "Description: $response->description\n";
-echo "Methods:\n";
-var_dump($response->methods);
-
-?>
---EXPECT--
-Response status: ok
-Name: Core
-Description: Basic introspection methods
-Methods:
-array(16) {
-  [0]=>
-  string(4) "info"
-  [1]=>
-  string(16) "get_recent_posts"
-  [2]=>
-  string(9) "get_posts"
-  [3]=>
-  string(8) "get_post"
-  [4]=>
-  string(8) "get_page"
-  [5]=>
-  string(14) "get_date_posts"
-  [6]=>
-  string(18) "get_category_posts"
-  [7]=>
-  string(13) "get_tag_posts"
-  [8]=>
-  string(16) "get_author_posts"
-  [9]=>
-  string(18) "get_search_results"
-  [10]=>
-  string(14) "get_date_index"
-  [11]=>
-  string(18) "get_category_index"
-  [12]=>
-  string(13) "get_tag_index"
-  [13]=>
-  string(16) "get_author_index"
-  [14]=>
-  string(14) "get_page_index"
-  [15]=>
-  string(9) "get_nonce"
-}
diff --git a/wp/wp-content/plugins/json-api/tests/query-01.phpt b/wp/wp-content/plugins/json-api/tests/query-01.phpt
deleted file mode 100644
index b981664e..00000000
--- a/wp/wp-content/plugins/json-api/tests/query-01.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-core.get_author_index with user-friendly URLs
---FILE--
-get('http://wordpress.test/api/core/get_author_index?dev=1');
-$response = $http->currentResponse();
-$response = json_decode($response['body']);
-$author = $response->authors[0];
-
-echo "Response status: $response->status\n";
-echo "Author count: $response->count\n";
-echo "Author name: $author->name\n";
-
-?>
---EXPECT--
-Response status: ok
-Author count: 1
-Author name: themedemos
diff --git a/wp/wp-content/plugins/neuf-associations b/wp/wp-content/plugins/neuf-associations
deleted file mode 160000
index d7abc31c..00000000
--- a/wp/wp-content/plugins/neuf-associations
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit d7abc31c4c167fbdf6f5c749feb2f37080c77cc7
diff --git a/wp/wp-content/plugins/neuf-events b/wp/wp-content/plugins/neuf-events
deleted file mode 160000
index 635b9abf..00000000
--- a/wp/wp-content/plugins/neuf-events
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 635b9abf5c2a5a1ad48f847abf251dff2e3137ee
diff --git a/wp/wp-content/plugins/neuf-lightbox/css/black/colorbox.css b/wp/wp-content/plugins/neuf-lightbox/css/black/colorbox.css
deleted file mode 100644
index 74b7b59d..00000000
--- a/wp/wp-content/plugins/neuf-lightbox/css/black/colorbox.css
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-    ColorBox Core Style
-    The following rules are the styles that are consistant between all ColorBox themes
-*/
-#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
-#cboxOverlay{position:fixed; width:100%; height:100%;}
-#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
-#cboxContent{position:relative; overflow:visible;}
-#cboxLoadedContent{overflow:auto;}
-#cboxLoadedContent iframe{display:block; width:100%; height:100%; border:0;}
-#cboxTitle{margin:0;}
-#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%;}
-#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
-
-/* 
-    ColorBox example user style
-    These rules are ordered and tabbed in a way that represents the order/nesting of the generated HTML, 
-    in hope that this will make the relationship easier to understand. Thanks, jack@colorpowered.com
-*/
-#cboxOverlay{background:#000;}
-
-#colorbox{}
-    #cboxContent{background:#000; margin-top:20px;}
-        #cboxBottomCenter{height:30px; background:#000;}
-        #cboxLoadedContent{background:#000; padding:5px;}
-                #cboxTitle{position:absolute; bottom:-25px; left:5px; color:#ccc;}
-                #cboxCurrent{position:absolute; bottom:-25px; right:35px; color:#ccc;}
-                #cboxSlideshow{position:absolute; top:-20px; right:90px; color:#fff;}
-                #cboxPrevious{position:absolute; top:50%; left:5px; margin-top:-41px; background-image: url(data:image/gif;base64,AAAA); width:49%; height:100%; text-indent:-9999px;}
-                #cboxPrevious.hover{background-position:bottom left; background:url(images/prevblack.png) top left no-repeat;}
-                #cboxNext{position:absolute; top:50%; right:5px; margin-top:-41px; background-image: url(data:image/gif;base64,AAAA); width:49%; height:100%; text-indent:-9999px;}
-                #cboxNext.hover{background-position:bottom right; background:url(images/nextblack.png) top right no-repeat;}
-                #cboxLoadingOverlay{background:#000;}
-        #cboxLoadingGraphic{background:url(images/loading.gif) center center no-repeat;}
-        #cboxClose{position:absolute; bottom:-25px; right:5px; display:block; background:url(images/close.png) top center no-repeat; width:22px; height:22px; text-indent:-9999px;}
-        #cboxClose.hover{background-position:bottom center;}
\ No newline at end of file
diff --git a/wp/wp-content/plugins/neuf-lightbox/css/black/images/close.png b/wp/wp-content/plugins/neuf-lightbox/css/black/images/close.png
deleted file mode 100644
index e02eb3c216adddfabe8b44764d6cdda2000cbe37..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 602
zcmV-g0;T`6pHRCwC7
zm9a}gK^(`=htSfR(2yWR=uo!2$&dyIhaB82s5bF`aQ1%?Hw(UFTezhzz}@cg2R?~
z5s(3=VAs;WN77&h9zYk&gT#j*4_vSWJ@5?1ln8$80331LIoJm+@M057=_N>j0r0Zf
z?2~22@8lk7OyQa32e!ejk~`Y+^OQbCidpi(N8#xlnHK3)mBdJd12+>pMpd?~#GZHu(czOs>)
zK3z$N=Tva_^(JT90cVE1&37HkYLp`$=HVASQfA9(A|+SSoMpUn#KPK*n)&2Xmx}KGpDwk>rFWp4hxFlH4T#HNRV7PCJw8V;N3URscoZldEJOnj*-LC
zCzI~-?yFV-H$EGcV_!wRV602mFvNO%!74RiotSR2QEVnbwWhI
oO$nHqS?K-=JNZ+yGvz=Iegxp{+qWGZ9j{-%9vvN>n3$NJp6==CAqYaF(LfM1Z{EEA{{Gt9
z+Ba|B7z_sR+xabl|E~mm-*OXmhLq??y)HONjX>1ze1D?RIn=G1`RR-%fb}zgSh6^a
z(}Zw20U1L^Cs9UcyJfc+al#}J2xVlYUoR{`gd&QDxAb1w4>I~5gc?ccq(G+T!I;H};U_uyHR0@hr>Qk1P1=6fvUBhR
zb|&^^cEQtu&W}=-=YR7o5UI)AD*~%J7bkVd5`xrdw{bHm;|Bf^_|FG$9l}`ruhnVF
zO%=6X*I#yro*pmfB;-A0cVjz73Qy)`oa=df_3Bx6!M3TNALf9BwI*di`jhdovR(I=
zFT31zui1Xw??+Ym-lWNq=V6~8tt012$@*hy3So0QNJ#eIJ4Yh{qJ+aTY>ng8W1p4BrwB_>i7AY-xmGrA}hAeq`aX(yx~=c&|=$w&*&PpKd;G@@0oXK@D0x=;tyY&Eb|HKPsM
z71v`PO)na3pfO*xUD8Z|CQju)c+RSAH=5V^4vb9Q2JwHwt|-INt|!nD?AlRxF5ZT8
zaA9~hGb$~rMhQh_0+31$tkzyLi>X3c7>F!|Jyn`+5{LG=E`sIQbHA8!=`uday6D6Y
zNtVL?j^`6A%UuwO!`}j#s~H?w=P<5}Z2)*PPx|5q$MM+1K6_d_cie9JVArbrB2sRy
zOl**1Mc+|zLM>munG#O|##RApuODr^1+pL-?SHX+D6Dz_@%-Oo(fM&hHYZ-jWU5jf
z&nBYG;>F6&Y`veoLdZ@0WyrDsuXOP)9g*C`A(+R`Ryc2+9w_DJNaf@Dzg?~N{uI_}
zjV(!yygvrGv#KF*Mt{6H^v1Ve=hQyF2^E~bd#&iZg;(%dS^nM;oGSF1Y^&rY}Ian
zFrp%SBGPyN{Z?t%Mo#!qgLQ2)k{>KAv?=zezKN*qPRf>^4QjcWgyxiC}7Vb6vGrBLR(1J&B%*gb{`!Jljb^2%jB$
zFBNUHANC6Q?0~M}cVtgk_;_DAB-BE?2dP
z(C9OIXza3Ao-@UyqX%`5cjg#cHl!uHq;&?~JO{eE+A2KSSD)s8v&CiV$kV$A=DG@i
z;6JY7z*8oPdj@bbJQoTAENW#ls(ucbGA#yhN>zbWqBTbLl>rGqOAY+`
z=psSt8VQE=9+X8^$l@oeDzRvja79ry3nvLcOR7+)bIFyJVoz4}URM-47_u>V
zY*^e(o`?|l++*Y0uQ#&dKapW1o?J{jx+*_gKV^cW+W87KI7hZ5viXv$$=1IR^Z~yA
XWBrHU7iSEP8X8hQyAJO{V6g1pwSv80

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/black/images/nextblack.png b/wp/wp-content/plugins/neuf-lightbox/css/black/images/nextblack.png
deleted file mode 100644
index e68cdcd46f15366d8ed8af95da1bd43d22aa85ed..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1030
zcmV+h1o``kP)QP*u^_TwW!lI}R=U@)AX6wA
zGG?BK=l%OmM{a-p|Kj|9_q_FWIp@3I`JVTA-sk=9vAn&#fnl*&e*NJ_;o+{p1^35r
zOW+#wCU_IP3El*6f;YjN;D2OT|0q))9!O75M^sc4Ha0fkbUL+ro}Qk_$jCrQNC?Kp
z#^CSokF2aL`TRIRep+L0ZVrKgfk;V7!RqSjr**=@!jO}bgM)(uY;SKPJ3AYXkB@kL
zeZ|Ym3#?YFJnQP}3Nte^xWB(Q20Vk{3knKwczB4;&Q95&0+pMai`dv$0Ur<$fb#Nk
z1O)}*{QO+*GrYaMvA({J{r!E|Y&H}Y7NWVi8N0i?lBBx2I$5WqqXXgL;V3RH#`X0z
ze0+T1>+6fl%S&13=;#Quv$Mv6Cj&P(H^NYLbv3%XyYcYwpxxtO@COrtE-fvgr>6&A
zUS8@46fQ0~=fS($a)!CePt;$ak8Wn(+MmjFOTPnb+RlE{SI_
zDTc{jF?@1zBC^lS%tT&Z9wsLz1*{tSxlGjA*_q3==I7@zF)<-ZBEyvX&dv@-Mn+^E
z%AN9Oka4a@#*dGWjjwq<`@_S-h=_oe!_?H2
zd@=?G1`r(`jr#g}xz^RyCCYG>bmcAo)a|(evPs#}fLN!jNj>Wf8dPX#sQ5%`YO2UO
zDJe-S0S4K7csd+M|Twhb36YVJ(z?{h&(D{00_WG()`}Vi2M1+7
z`}V@Zg0#r^`1tQ9du~>lkBY^`MNCgmqpYm#(>@jWnK#o4i?j*%(+n>a8!BdlSj2M
z31pw;pkIf<@6j)Kk3F72L-h0WlePH_^Bta%vL{=KiHToYnyWTQ6Z}!&DOpPLci<_1
zb%6QqVZORH!JFVs@a_Zt!?`VP&AhuN;9YA
AzW@LL

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/black/images/prevblack.png b/wp/wp-content/plugins/neuf-lightbox/css/black/images/prevblack.png
deleted file mode 100644
index ad56100d1cb35c201bae046da3046125cacadacc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1080
zcmV-81jqY{P)r2{`dOU`quZanK1ycL1SjK*$liIp+Pek43cnz7BjDy
z5gIlfybfLmuY=dY>)`)$GkwJ-&d$zAOiYB?Y-a0-*Vk8^oSa}|V*?Kl53iIp;bC-lcf-}y)xQ7g>Z-6R
zFE0<-+1U=@)6&x5@9!_qsaEp@$1FWQKH}=?3VnTjxVX4LP*4!u-QA@Wm~94tYgiIf
zQ&VtrbCaxdjsavDY;A2}Wo5-axc9=sf&?u+Jsln%9`a6JQ&UrA4KuGw%`4{Qon>bAt(Al1z9?3eLBLgZb
zD&)$H6LeQsmuNzCbhLnvjg1vyWS}_60@gD39~l`DZ6VbOJ}WB=M@L6eHma$;qTqC-
zqoYHBo}QkHCj&CN~B&CMYrBLkI{m2z}ZBgC1XfEhrZ67N}W
zZ?A}IRaKR&XYj}h)tek+5UZV|jU5
z%7m)FzrQa`P_@aS@n~Wlf7A;QIO$KLh*9u(6tZRy4h|$Jg@uJEE-rQmXj4;@Xa|kL
zN9AWwNO|hXU$gZqe#WAMibzq!ey6-V&U}1)gwjga7Z4C2M

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/blue/colorbox.css b/wp/wp-content/plugins/neuf-lightbox/css/blue/colorbox.css
deleted file mode 100644
index ad136e4d..00000000
--- a/wp/wp-content/plugins/neuf-lightbox/css/blue/colorbox.css
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-    ColorBox Core Style
-    The following rules are the styles that are consistant between all ColorBox themes
-*/
-#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
-#cboxOverlay{position:fixed; width:100%; height:100%;}
-#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
-#cboxContent{position:relative; overflow:visible;}
-#cboxLoadedContent{overflow:auto;}
-#cboxLoadedContent iframe{display:block; width:100%; height:100%; border:0;}
-#cboxTitle{margin:0;}
-#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%;}
-#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
-
-/* 
-    ColorBox example user style
-    These rules are ordered and tabbed in a way that represents the order/nesting of the generated HTML, 
-    in hope that this will make the relationship easier to understand. Thanks, jack@colorpowered.com
-*/
-#cboxOverlay{background:#003;}
-
-#colorbox{}
-    #cboxContent{background:#003; margin-top:20px;}
-        #cboxBottomCenter{height:30px; background:#003;}
-        #cboxLoadedContent{background:#003; padding:5px;}
-                #cboxTitle{position:absolute; bottom:-25px; left:5px; color:#ccc;}
-                #cboxCurrent{position:absolute; bottom:-25px; right:35px; color:#ccc;}
-                #cboxSlideshow{position:absolute; top:-20px; right:90px; color:#fff;}
-                #cboxPrevious{position:absolute; top:50%; left:5px; margin-top:-41px; background-image: url(data:image/gif;base64,AAAA); width:49%; height:100%; text-indent:-9999px;}
-                #cboxPrevious.hover{background-position:bottom left; background:url(images/prevblue.png) top left no-repeat;}
-                #cboxNext{position:absolute; top:50%; right:5px; margin-top:-41px; background-image: url(data:image/gif;base64,AAAA); width:49%; height:100%; text-indent:-9999px;}
-                #cboxNext.hover{background-position:bottom right; background:url(images/nextblue.png) top right no-repeat;}
-                #cboxLoadingOverlay{background:#003;}
-        #cboxLoadingGraphic{background:url(images/loading.gif) center center no-repeat;}
-        #cboxClose{position:absolute; bottom:-25px; right:5px; display:block; background:url(images/close.png) top center no-repeat; width:22px; height:22px; text-indent:-9999px;}
-        #cboxClose.hover{background-position:bottom center;}
\ No newline at end of file
diff --git a/wp/wp-content/plugins/neuf-lightbox/css/blue/images/close.png b/wp/wp-content/plugins/neuf-lightbox/css/blue/images/close.png
deleted file mode 100644
index e02eb3c216adddfabe8b44764d6cdda2000cbe37..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 602
zcmV-g0;T`6pHRCwC7
zm9a}gK^(`=htSfR(2yWR=uo!2$&dyIhaB82s5bF`aQ1%?Hw(UFTezhzz}@cg2R?~
z5s(3=VAs;WN77&h9zYk&gT#j*4_vSWJ@5?1ln8$80331LIoJm+@M057=_N>j0r0Zf
z?2~22@8lk7OyQa32e!ejk~`Y+^OQbCidpi(N8#xlnHK3)mBdJd12+>pMpd?~#GZHu(czOs>)
zK3z$N=Tva_^(JT90cVE1&37HkYLp`$=HVASQfA9(A|+SSoMpUn#KPK*n)&2Xmx}KGpDwk>rFWp4hxFlH4T#HNRV7PCJw8V;N3URscoZldEJOnj*-LC
zCzI~-?yFV-H$EGcV_!wRV602mFvNO%!74RiotSR2QEVnbwWhI
oO$nHqS?K-=JNZ+yGvz=Iegxp{+qWGZ9j{-%9vvN>n3$NJp6==CAqYaF(LfM1Z{EEA{{Gt9
z+Ba|B7z_sR+xabl|E~mm-*OXmhLq??y)HONjX>1ze1D?RIn=G1`RR-%fb}zgSh6^a
z(}Zw20U1L^Cs9UcyJfc+al#}J2xVlYUoR{`gd&QDxAb1w4>I~5gc?ccq(G+T!I;H};U_uyHR0@hr>Qk1P1=6fvUBhR
zb|&^^cEQtu&W}=-=YR7o5UI)AD*~%J7bkVd5`xrdw{bHm;|Bf^_|FG$9l}`ruhnVF
zO%=6X*I#yro*pmfB;-A0cVjz73Qy)`oa=df_3Bx6!M3TNALf9BwI*di`jhdovR(I=
zFT31zui1Xw??+Ym-lWNq=V6~8tt012$@*hy3So0QNJ#eIJ4Yh{qJ+aTY>ng8W1p4BrwB_>i7AY-xmGrA}hAeq`aX(yx~=c&|=$w&*&PpKd;G@@0oXK@D0x=;tyY&Eb|HKPsM
z71v`PO)na3pfO*xUD8Z|CQju)c+RSAH=5V^4vb9Q2JwHwt|-INt|!nD?AlRxF5ZT8
zaA9~hGb$~rMhQh_0+31$tkzyLi>X3c7>F!|Jyn`+5{LG=E`sIQbHA8!=`uday6D6Y
zNtVL?j^`6A%UuwO!`}j#s~H?w=P<5}Z2)*PPx|5q$MM+1K6_d_cie9JVArbrB2sRy
zOl**1Mc+|zLM>munG#O|##RApuODr^1+pL-?SHX+D6Dz_@%-Oo(fM&hHYZ-jWU5jf
z&nBYG;>F6&Y`veoLdZ@0WyrDsuXOP)9g*C`A(+R`Ryc2+9w_DJNaf@Dzg?~N{uI_}
zjV(!yygvrGv#KF*Mt{6H^v1Ve=hQyF2^E~bd#&iZg;(%dS^nM;oGSF1Y^&rY}Ian
zFrp%SBGPyN{Z?t%Mo#!qgLQ2)k{>KAv?=zezKN*qPRf>^4QjcWgyxiC}7Vb6vGrBLR(1J&B%*gb{`!Jljb^2%jB$
zFBNUHANC6Q?0~M}cVtgk_;_DAB-BE?2dP
z(C9OIXza3Ao-@UyqX%`5cjg#cHl!uHq;&?~JO{eE+A2KSSD)s8v&CiV$kV$A=DG@i
z;6JY7z*8oPdj@bbJQoTAENW#ls(ucbGA#yhN>zbWqBTbLl>rGqOAY+`
z=psSt8VQE=9+X8^$l@oeDzRvja79ry3nvLcOR7+)bIFyJVoz4}URM-47_u>V
zY*^e(o`?|l++*Y0uQ#&dKapW1o?J{jx+*_gKV^cW+W87KI7hZ5viXv$$=1IR^Z~yA
XWBrHU7iSEP8X8hQyAJO{V6g1pwSv80

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/blue/images/nextblue.png b/wp/wp-content/plugins/neuf-lightbox/css/blue/images/nextblue.png
deleted file mode 100644
index 7a8113825489d2171d7fb05d6260cecab59bd4d7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1133
zcmV-z1d{uSP)k?){weJ?A{VGW)SMQ0wXG$)LzgUaa8MWIx`y
zUzFft<|TLuUV@k4C3p#5g5Q^>{3n}*bQ<@94-nbdLY1i$j#~4MwVC-<#1lyzZ>Ymo
zEP>hILg16B9X`^T4C<{_h{ky=ha<357_~3=j50
zqc?(&N0EqaLRXr-Us>fVI9z8bEIiGCMpufBKf)NA{1qRzw}=lw*JSeTN=oqw)HSri
zeWD2|Aq!6d4Z0Hcn=@@rT>bJ3j7|s9N&NVNA>0|h3D+4nQ$sQ(p!>7SP!OM!fn^Nz
zeuJ*AE|^Mn%$K%AT{zk29^P1CL5=MY?v4y#s-_aHM{ER~!pqquN<1wUO7;z9tvJjrZ0TWi`gfca2<$iql|qWeLN-7+6mraU(zqv^cELaM`S#e8Z04Lu=^$_BuF?4i`Gl
zvwGhx=(*nVpLYASAg~8~*VzOimBhg90OEX-Wh>tl3MHOJ9%42y51)SyGroJ6TMCOM
zzyhRH5NIv<*cRkuzlKxo&2FD>v>t6QSK!2{4*bx29agi6Wi>wlv`N)En(>~ik!3FZ
zSN8I2b=Q|2&58f4Yl{XPq!;OZF~2g`uEtHP&I)=fJRc5NaY@rJ8%L
z=691ZwUxC9`bpW?j~u&3(}$ShWDM^?ol
zytc+Vb?%z*FCp~k37h|(@%t=@?Qb4t`;XeKIMn<$25!RgWM@s~`%{n01vfD;(^pu^qCN+wtTr&=5E)nWjBo>5#re_E9P
zZuc$tYpiF{I6KhjwH%wjA{1$Y8(VSq9hEul%A3)I*roH0Q!821quHlpFyBw^9tobV
zX~^j=tE5}iJ&u0DD}BLr!3YVp{+Z{Vqfsq|j7hmO2`mw9^J
zY_6}7{?AMB61)We|Ag=E?v@pG=8H7|e+n=FeQ&M9%bS0U00000NkvXXu0mjf6C5e*

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/blue/images/prevblue.png b/wp/wp-content/plugins/neuf-lightbox/css/blue/images/prevblue.png
deleted file mode 100644
index 1107511fde83e80227f8cfa629c47fda7ecceaab..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1167
zcmV;A1aSL_P)Pfs)9
zvT|g;U~-hPRlrxkSHM@mSHM@mA9GVa4JYZ0g!N57Vu=)FGVUCqZm31;i6+!mSMg`}
z)-FQPIA7;-IUYZuZG@po#bc3J0`ARSWOI-9TxQ{CcRz}Zl!c?awfGFOR62vZ_aCrN
zN4L2&;1`zGv9|Or8q~VtxWU|sbK|GbX4EpUx!D=isWkbNQz)TOR$**(6yv9Qupf!x
z@|77#nKX~*a#>zS*OPC&4wriyKP_B`=HlD1G(UXCrhgxoF3-T`I9(d>LQs31{3M$7YU~8V_+s`O+_?Ic$Pf+cYpW5DhHz$l
z0?!Rt*+;=TTJ(q~)3_}H^P6Yq5O|L-h;YD%p&oN-Yo1uDu2Q10z8239cA!C{LogU9
zmV;cO5c3LN({9pXu-}GMB8Komg6FeY2|7&!&vmvMiU-YgnGG)
z+U>)zSxlt`pOrE=h$s1_Zn-uP2|j>cuV+^C^AfiFA^g4_zz-`P+*(|Os>#50pUvh_
zT~o(%KdyTCema)!dLd=ALPP3c@9Rg<=ixPETO#G%%irOJGtNUg@J!R5Sr@GOHdgTN
zdp@cG&VuffFJfe%0}6RQ#>sdT*Kf`v6+d9cjh0@FkDO#pp!BU0;Jx>j5%AsTKvJ+w
zmLBwXwg?}EqZt#gyv(0f^)-jop46CX{HHpRq`d{d*DKo2eUnobnQ*vAd}{!BV`aVIGm__FQoeSr{nU;mbVW@FQT
zO40u%_`Pt9)9{~wQ5jGRd+eC+>u7%LH?c>WAi4bbfhSfKPtaOce$1$VuYj+Bf0jo7
h)XK{hIGz6xU;u)Azzy)w<3<1g002ovPDHLkV1k#`NDTl0

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/dark/colorbox.css b/wp/wp-content/plugins/neuf-lightbox/css/dark/colorbox.css
deleted file mode 100644
index a0332b6e..00000000
--- a/wp/wp-content/plugins/neuf-lightbox/css/dark/colorbox.css
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-    ColorBox Core Style:
-    The following CSS is consistent between example themes and should not be altered.
-*/
-#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
-#cboxOverlay{position:fixed; width:100%; height:100%;}
-#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
-#cboxContent{position:relative;}
-#cboxLoadedContent{overflow:auto;}
-#cboxTitle{margin:0;}
-#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%;}
-#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
-.cboxPhoto{float:left; margin:auto; border:0; display:block;}
-.cboxIframe{width:100%; height:100%; display:block; border:0;}
-
-/* 
-    User Style:
-    Change the following styles to modify the appearance of ColorBox.  They are
-    ordered & tabbed in a way that represents the nesting of the generated HTML.
-*/
-#cboxOverlay{background:#000;}
-#colorbox{}
-    #cboxContent{margin-top:20px;}
-        #cboxError{padding:50px; border:1px solid #ccc;}
-        #cboxLoadedContent{border:5px solid #000; background:#fff;}
-        #cboxTitle{position:absolute; top:-20px; left:0; color:#ccc;}
-        #cboxCurrent{position:absolute; top:-20px; right:0px; color:#ccc;}
-        #cboxSlideshow{position:absolute; top:-20px; right:90px; color:#fff;}
-        #cboxPrevious{position:absolute; top:50%; left:5px; margin-top:-32px; background:url(images/controls.png) no-repeat top left; width:28px; height:65px; text-indent:-9999px;}
-        #cboxPrevious.hover{background-position:bottom left;}
-        #cboxNext{position:absolute; top:50%; right:5px; margin-top:-32px; background:url(images/controls.png) no-repeat top right; width:28px; height:65px; text-indent:-9999px;}
-        #cboxNext.hover{background-position:bottom right;}
-        #cboxLoadingOverlay{background:#000;}
-        #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
-        #cboxClose{position:absolute; top:5px; right:5px; display:block; background:url(images/controls.png) no-repeat top center; width:38px; height:19px; text-indent:-9999px;}
-        #cboxClose.hover{background-position:bottom center;}
\ No newline at end of file
diff --git a/wp/wp-content/plugins/neuf-lightbox/css/dark/images/controls.png b/wp/wp-content/plugins/neuf-lightbox/css/dark/images/controls.png
deleted file mode 100644
index e1e97982a6b4038f0aae1f9e2e7fa4d89df68841..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1633
zcmV-n2A=teP)gwz2>+9y`=TcHq
z-rnCuMn^(ILOMD+EiEn~AtAlJz0c6nGcz;A#m3Up)UB_vr>Lo=rKXvgnU9c?i;Iim
z;R<0n*sHVxX1Wu=dDmb5@
zoduu*GO7Y3gN)R3LlCkA83ANu{udpGM*u$>gP0`<1_F8BNfnW-jvET2ri(~grcgs6
zfuNc}C`52O?KU>*_xBwlz$`(9h!7a5Xz`@Dfk^XqtL=`O&7MbyN*s{1cohspL^?w`
zCJbt{9v>V2SM#J8C>P7Se={P=10MX=2jpbh>VWAOZ`4loT=P^~`R!
z;id=$u@Od+m^K=9-@%NRBn(CZNpZq6&5@6g(`ZoI9)5wt!^aKD^z=@#Am195`0Y`!+$%p9c^CoEQgtOp5
zEEcDUb#KOlSex@S5iLQS2y^-+;ZIF|1UAxyZ{Y_TYaYbh#94ll@a=j?n6ogKmGGQ7
zu5N~n{5auRbxdHR(d%}*Gge|&-)9oTqXZGC!A?v^)WCU^aP1K#u)#ixQOY2MYgwb1
zQGiGo4k29I#st9$vMx?gBP7Mh{wQkmjt!+NK5(D1jEohRaI0HZk_dBDoB@dwAf&fhv$fjCdZNhQ<5A@t3*Uq1SKU_
z388}$(?g;PO09|sv0Oq#KnEqK1Ep+20b1FF28^-^1E7+Jp&@{vRHh(7OdzO~Cn)f+
zMpa5ed{x3CKtw
zIjm=9~S
z64&923<&Y#NBx+n|9Tn!B*WlGV1p8mZ+|0G)5x3`z^_<4m%OOPtq+R
zx=*X^VHnsL6e7Z@h#Ade;$UE8&}ApcOhraO2-I4UVPIpA^otN=7>BSx2vohCaMdIv@Ur#r=q^%~zIp~i|2G5+~_YKx?`GWihq
zr|&?z77t?7{=eO->2l8W0;7=B8p=plgrXCrz;i%N;_+EX@Qfhv`MBi>a0xK~6byma
z5miB?_OlZTfAvRngQFlJ$A8OE=PEDPSfI@teg&4n|@EB5r09gnqfi%%sK5sU5ng9~KoTyQO6214=+ud?G
zp#(K*ml1}pP=FHVpWU6m`1Afgr36jUjnjmoig`A?7XREdef;NUcb{vwNmPwbLd&~Y
z&szSTYWsQj{WLKWiHb4C6Z00000NkvXXu0mjf#Rc%Z

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/dark/images/loading.gif b/wp/wp-content/plugins/neuf-lightbox/css/dark/images/loading.gif
deleted file mode 100644
index 19c67bbd0403f3f00d71bfb21a59cb6c55d482ab..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9427
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
-.cboxIE #cboxTopLeft{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderTopLeft.png', sizingMethod='scale');}
-.cboxIE #cboxTopCenter{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderTopCenter.png', sizingMethod='scale');}
-.cboxIE #cboxTopRight{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderTopRight.png', sizingMethod='scale');}
-.cboxIE #cboxBottomLeft{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderBottomLeft.png', sizingMethod='scale');}
-.cboxIE #cboxBottomCenter{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderBottomCenter.png', sizingMethod='scale');}
-.cboxIE #cboxBottomRight{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderBottomRight.png', sizingMethod='scale');}
-.cboxIE #cboxMiddleLeft{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderMiddleLeft.png', sizingMethod='scale');}
-.cboxIE #cboxMiddleRight{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderMiddleRight.png', sizingMethod='scale');}
\ No newline at end of file
diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/colorbox.css b/wp/wp-content/plugins/neuf-lightbox/css/elegant/colorbox.css
deleted file mode 100644
index e49aa7cc..00000000
--- a/wp/wp-content/plugins/neuf-lightbox/css/elegant/colorbox.css
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
-    ColorBox Core Style:
-    The following CSS is consistent between example themes and should not be altered.
-*/
-#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
-#cboxOverlay{position:fixed; width:100%; height:100%;}
-#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
-#cboxContent{position:relative;}
-#cboxLoadedContent{overflow:auto;}
-#cboxTitle{margin:0;}
-#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%;}
-#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
-.cboxPhoto{float:left; margin:auto; border:0; display:block;}
-.cboxIframe{width:100%; height:100%; display:block; border:0;}
-
-/* 
-    User Style:
-    Change the following styles to modify the appearance of ColorBox.  They are
-    ordered & tabbed in a way that represents the nesting of the generated HTML.
-*/
-#cboxOverlay{background:url(images/overlay.png) repeat 0 0;}
-#colorbox{}
-    #cboxTopLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -100px 0;}
-    #cboxTopRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -129px 0;}
-    #cboxBottomLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -100px -29px;}
-    #cboxBottomRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -129px -29px;}
-    #cboxMiddleLeft{width:21px; background:url(images/controls.png) left top repeat-y;}
-    #cboxMiddleRight{width:21px; background:url(images/controls.png) right top repeat-y;}
-    #cboxTopCenter{height:21px; background:url(images/border.png) 0 0 repeat-x;}
-    #cboxBottomCenter{height:21px; background:url(images/border.png) 0 -29px repeat-x;}
-    #cboxContent{background:#fff; overflow:hidden;}
-        #cboxError{padding:50px; border:1px solid #ccc;}
-        #cboxLoadedContent{margin-bottom:28px;}
-        #cboxTitle{position:absolute; bottom:4px; left:0; text-align:center; width:100%; color:#949494;}
-        #cboxCurrent{position:absolute; bottom:4px; left:58px; color:#949494;}
-        #cboxSlideshow{position:absolute; bottom:4px; right:30px; color:#0092ef;}
-        #cboxPrevious{position:absolute; bottom:0; left:0; background:url(images/controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;}
-        #cboxPrevious.hover{background-position:-75px -25px;}
-        #cboxNext{position:absolute; bottom:0; left:27px; background:url(images/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;}
-        #cboxNext.hover{background-position:-50px -25px;}
-        #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
-        #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
-        #cboxClose{position:absolute; bottom:0; right:0; background:url(images/controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;}
-        #cboxClose.hover{background-position:-25px -25px;}
-
-/*
-  The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
-  when an alpha filter (opacity change) is set on the element or ancestor element.  This style is not applied to IE9.
-*/
-.cboxIE #cboxTopLeft,
-.cboxIE #cboxTopCenter,
-.cboxIE #cboxTopRight,
-.cboxIE #cboxBottomLeft,
-.cboxIE #cboxBottomCenter,
-.cboxIE #cboxBottomRight,
-.cboxIE #cboxMiddleLeft,
-.cboxIE #cboxMiddleRight {
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
-}
-
-/*
-  The following provides PNG transparency support for IE6
-*/
-.cboxIE6 #cboxTopLeft{background:url(images/ie6/borderTopLeft.png);}
-.cboxIE6 #cboxTopCenter{background:url(images/ie6/borderTopCenter.png);}
-.cboxIE6 #cboxTopRight{background:url(images/ie6/borderTopRight.png);}
-.cboxIE6 #cboxBottomLeft{background:url(images/ie6/borderBottomLeft.png);}
-.cboxIE6 #cboxBottomCenter{background:url(images/ie6/borderBottomCenter.png);}
-.cboxIE6 #cboxBottomRight{background:url(images/ie6/borderBottomRight.png);}
-.cboxIE6 #cboxMiddleLeft{background:url(images/ie6/borderMiddleLeft.png);}
-.cboxIE6 #cboxMiddleRight{background:url(images/ie6/borderMiddleRight.png);}
-
-.cboxIE6 #cboxTopLeft,
-.cboxIE6 #cboxTopCenter,
-.cboxIE6 #cboxTopRight,
-.cboxIE6 #cboxBottomLeft,
-.cboxIE6 #cboxBottomCenter,
-.cboxIE6 #cboxBottomRight,
-.cboxIE6 #cboxMiddleLeft,
-.cboxIE6 #cboxMiddleRight {
-    _behavior: expression(this.src = this.src ? this.src : this.currentStyle.backgroundImage.split('"')[1], this.style.background = "none", this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + this.src + ", sizingMethod='scale')");
-}
diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/border.png b/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/border.png
deleted file mode 100644
index f463a10d838aeba263ff44e5c3578dfe7ba07648..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 112
zcmeAS@N?(olHy`uVBq!ia0vp^j6iI}$P6Txn<}3KQfvV}A+A9B|Ns9>Z_d99WHFWm
z`2{zujf-{zawI%m978JNrXFPE1@f8<7E8}%%lTu>&#KnM&G`7uteHSj22WQ%mvv4F
FO#q`M9f1G<

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/controls.png b/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/controls.png
deleted file mode 100644
index 9257176616c3e0a5c145e381a12ee15fa556dc8e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1249
zcmV<71Rnc|P)V!Y*4EZ4OogST
zri6rqYJsRyQd08t_V@SqUU#9bt*zwf?~tLsnVFe+kFwX@=UG`+oh~W<+9?
z#KpzEy}gQxinG4bHdTvkgR8Z*wRDQE#?IZ~l^To_n@2O}IT3~G6)PQMiWkECPLz3lbBk=|vuW1?-!1MPfMnI7-k<+5D4+u9dB
zmBqs*!1`WX^^eNcMJr!PLIM#5ImikCM2QFtu!&5!*FQ47ix$41yk(NoRGKV31w{bT
z00~7PN)uuam~M@5V_#6h?wu403Ltp{i3MyzMz?=r
zx{Z9j{bnVTaFT4o&?6v~XF->~u+!yjSAg8%Bz7`BuBukl8fm*EyoWnQWFSLX6e6vze7N{Ty7V&(`
z013w{f)568-|HJ)$j$ZN`bGpC*d|nVVfcw7FmAqrV&F{aP
zAfRO!1jYNWFghE|S5dkD%AoieT(?fR;rE-8)x%mH;NNd-i>~#7T(|MH8c;e7fRb;Z
z=p`-S6U_JKknc@PUwdjST0t|wU3eP$GGPzp{xmDGa{g7q0HG}46K;LARAd7PK&#{c
z7+@1EeBD34Iq+@#7|bUe`nJ!1)AxU02`UT7WBL+4;r@Q+0V0A|Q;Qs)aP5nw_5!?)*?^0x3>g-<$cLB
zU7pQm9~?h#Dm0rIMbY~a>mTSc<)`naIj|E?j~RHs_RrLpETh4iq_}Tp>-+wF8GOiX
z37n}fnck7qjP)fy|G56er~EN0gXD+b*EB&nPhaxM_t*57RBMrsgTa8j?itWiave|{
z^nJW9nfd0t1p6WXoOf!pl;OSW(@yK~uB*MGk$
z1Cqb$OGamSAE1%7A6QeQ@CkJIzC}aPD>IDKD8L8Uwp
zD8N$+>xvXU;oyBNH_mf>Un0zeaPz*KM@m^&i|`2-zbE+j|6b!y_Ir_OkE~-m00000
LNkvXXu0mjfA+dCQ

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderBottomCenter.png b/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderBottomCenter.png
deleted file mode 100644
index 0d4475edf4e1ebb18d41db83915a21a9a6bc5977..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 111
zcmeAS@N?(olHy`uVBq!ia0vp^j6f{P$P6U+&JlA5QfvV}A+A9B|Ns9>Z_d99WHFWm
z`2{zujf-{za>PAd978JNY7Z)cbT)5ruP-ra%e~G}wTijXxbw&apdf>%tDnm{r-UW|
DknJ7#

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderBottomLeft.png b/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderBottomLeft.png
deleted file mode 100644
index 2775eba899d10d3dc6f8c4044ad69cb89a5f8499..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 215
zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw|3?!p1cPs@`>H$6>u0R?BQd3j6Z{H4KpFe*d
zCJdtg|NlSbL?0`V#ZwaG7u>*5G5>gk!F7ua0ST$+oA`j@!JaOTAr*10r#A97C`hm-
z3dKH%oOr{aLpj2LsW&>nlF|6W##ZJ(&Vq|N!)H`n4WCnOwE6XE$$JkZ%dBmlKK#!l
q^N>YH$6>u0R?BQd3j6Z{H4KpFe*d
zCJdtg|NlSbL?0`V#ZwaG7u>*5G5>gk!F7ua0ST$+oA`j@p`I>|Ar*0Rk8R{_P!M3f
za60r>rSy%6n-)#V7EE~whgkX^aO5~8RysR6J&4z+ys8}98}g<84F4bXKSykNqt5CV
sw|{E#ePx#

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderMiddleLeft.png b/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderMiddleLeft.png
deleted file mode 100644
index a2d63d156e008a01fde9d2d68c531c34926a924a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 108
zcmeAS@N?(olHy`uVBq!ia0vp^qCm{Z$P6U8=aokQDYgKg5LY1m|NsA`H|O64NtXoq
z1vjjXi*^HYL_A#_Ln`7}8#ZzRc@9(l|2O5zVPsZ_d99WHFWm
z`2{zujf-{za>PAd978JNY7Z)cbT)5ruP@Q*%6-Zwv5L7-WU|;#pdf>%tDnm{r-UW|
Dg{~b`

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderTopLeft.png b/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderTopLeft.png
deleted file mode 100644
index f9d458b5bba4a8cb84b9ee39a3844e258c1dcc20..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 216
zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw|3?!p1cPs@`>H$6>u0R?qNKH*WfByXT?c0H}
z|NsBDZcF_MWbu>)`2{yHR2W1EWLV67bmi?
zvo+on5)g6V?RfL6QIf

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderTopRight.png b/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/ie6/borderTopRight.png
deleted file mode 100644
index 74b8583cfbb2e62a84ef04ba01064ecb4d70e72a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 214
zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw|3?!p1cPs@`>H$6>u0R?Sq^70<1<#*9zkU05
zAmji4|I_}5*Z^5PB|(0{4Ga|#78wHb4Xz)Tc+|OiK2SW!)5S5QBChw?MqY;mf#VnJ
z^}ggWcLpW1DoZ@PeSjlp!DT5|UGpg|kLp?vt)3@$_tm@JIJ0M=)Av-}@ro0Ud)StJ
qkbTcp`HhbYABf8t?|bZq*G4@Nf;!!};89ZJ6T-G@yGywoYi%4?-

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderBottomCenter.png b/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderBottomCenter.png
deleted file mode 100644
index 0d4475edf4e1ebb18d41db83915a21a9a6bc5977..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 111
zcmeAS@N?(olHy`uVBq!ia0vp^j6f{P$P6U+&JlA5QfvV}A+A9B|Ns9>Z_d99WHFWm
z`2{zujf-{za>PAd978JNY7Z)cbT)5ruP-ra%e~G}wTijXxbw&apdf>%tDnm{r-UW|
DknJ7#

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderBottomLeft.png b/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderBottomLeft.png
deleted file mode 100644
index 2775eba899d10d3dc6f8c4044ad69cb89a5f8499..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 215
zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw|3?!p1cPs@`>H$6>u0R?BQd3j6Z{H4KpFe*d
zCJdtg|NlSbL?0`V#ZwaG7u>*5G5>gk!F7ua0ST$+oA`j@!JaOTAr*10r#A97C`hm-
z3dKH%oOr{aLpj2LsW&>nlF|6W##ZJ(&Vq|N!)H`n4WCnOwE6XE$$JkZ%dBmlKK#!l
q^N>YH$6>u0R?BQd3j6Z{H4KpFe*d
zCJdtg|NlSbL?0`V#ZwaG7u>*5G5>gk!F7ua0ST$+oA`j@p`I>|Ar*0Rk8R{_P!M3f
za60r>rSy%6n-)#V7EE~whgkX^aO5~8RysR6J&4z+ys8}98}g<84F4bXKSykNqt5CV
sw|{E#ePx#

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderMiddleLeft.png b/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderMiddleLeft.png
deleted file mode 100644
index a2d63d156e008a01fde9d2d68c531c34926a924a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 108
zcmeAS@N?(olHy`uVBq!ia0vp^qCm{Z$P6U8=aokQDYgKg5LY1m|NsA`H|O64NtXoq
z1vjjXi*^HYL_A#_Ln`7}8#ZzRc@9(l|2O5zVPsZ_d99WHFWm
z`2{zujf-{za>PAd978JNY7Z)cbT)5ruP@Q*%6-Zwv5L7-WU|;#pdf>%tDnm{r-UW|
Dg{~b`

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderTopLeft.png b/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderTopLeft.png
deleted file mode 100644
index f9d458b5bba4a8cb84b9ee39a3844e258c1dcc20..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 216
zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw|3?!p1cPs@`>H$6>u0R?qNKH*WfByXT?c0H}
z|NsBDZcF_MWbu>)`2{yHR2W1EWLV67bmi?
zvo+on5)g6V?RfL6QIf

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderTopRight.png b/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/internet_explorer/borderTopRight.png
deleted file mode 100644
index 74b8583cfbb2e62a84ef04ba01064ecb4d70e72a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 214
zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw|3?!p1cPs@`>H$6>u0R?Sq^70<1<#*9zkU05
zAmji4|I_}5*Z^5PB|(0{4Ga|#78wHb4Xz)Tc+|OiK2SW!)5S5QBChw?MqY;mf#VnJ
z^}ggWcLpW1DoZ@PeSjlp!DT5|UGpg|kLp?vt)3@$_tm@JIJ0M=)Av-}@ro0Ud)StJ
qkbTcp`HhbYABf8t?|bZq*G4@Nf;!!};89ZJ6T-G@yGywoYi%4?-

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/loading.gif b/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/loading.gif
deleted file mode 100644
index b4695d811d4f84ed693eff7b5e6b4d61a3e8c48d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9427
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

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/overlay.png b/wp/wp-content/plugins/neuf-lightbox/css/elegant/images/overlay.png
deleted file mode 100644
index 53ea98f7003cf014cda2f764a7d982e405bd1b5f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 182
zcmeAS@N?(olHy`uVBq!ia0vp^av;pY3?xs=ZJr3E3<7*YT>t<7&(6-y!NDOSA|fs>
z4iv@@^0LaF09818x;TbZ%z1NeAuof1z|jlq0?ZV)A8h5lQLnD@Q>uGq<+3e(rH8NF
wGFLG_IXT618W25kEc*C=-akH|?*IRp8MKNmPAJ`FsRUW)>FVdQ&MBb@0FX~HaR2}S

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/framed/colorbox.css b/wp/wp-content/plugins/neuf-lightbox/css/framed/colorbox.css
deleted file mode 100644
index cddcdc4d..00000000
--- a/wp/wp-content/plugins/neuf-lightbox/css/framed/colorbox.css
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-    ColorBox Core Style:
-    The following CSS is consistent between example themes and should not be altered.
-*/
-#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
-#cboxOverlay{position:fixed; width:100%; height:100%;}
-#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
-#cboxContent{position:relative;}
-#cboxLoadedContent{overflow:auto;}
-#cboxTitle{margin:0;}
-#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%;}
-#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
-.cboxPhoto{float:left; margin:auto; border:0; display:block;}
-.cboxIframe{width:100%; height:100%; display:block; border:0;}
-
-/* 
-    User Style:
-    Change the following styles to modify the appearance of ColorBox.  They are
-    ordered & tabbed in a way that represents the nesting of the generated HTML.
-*/
-#cboxOverlay{background:#000;}
-#colorbox{}
-    #cboxTopLeft{width:14px; height:14px; background:url(images/controls.png) no-repeat 0 0;}
-    #cboxTopCenter{height:14px; background:url(images/border.png) repeat-x top left;}
-    #cboxTopRight{width:14px; height:14px; background:url(images/controls.png) no-repeat -36px 0;}
-    #cboxBottomLeft{width:14px; height:43px; background:url(images/controls.png) no-repeat 0 -32px;}
-    #cboxBottomCenter{height:43px; background:url(images/border.png) repeat-x bottom left;}
-    #cboxBottomRight{width:14px; height:43px; background:url(images/controls.png) no-repeat -36px -32px;}
-    #cboxMiddleLeft{width:14px; background:url(images/controls.png) repeat-y -175px 0;}
-    #cboxMiddleRight{width:14px; background:url(images/controls.png) repeat-y -211px 0;}
-    #cboxContent{background:#fff; overflow:visible;}
-        #cboxLoadedContent{margin-bottom:5px;}
-        #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
-        #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
-        #cboxTitle{position:absolute; bottom:-25px; left:0; text-align:center; width:100%; font-weight:bold; color:#7C7C7C;}
-        #cboxCurrent{position:absolute; bottom:-25px; left:58px; font-weight:bold; color:#7C7C7C;}
-        
-        #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{position:absolute; bottom:-29px; background:url(images/controls.png) no-repeat 0px 0px; width:23px; height:23px; text-indent:-9999px;}
-        #cboxPrevious{left:0px; background-position: -51px -25px;}
-        #cboxPrevious.hover{background-position:-51px 0px;}
-        #cboxNext{left:27px; background-position:-75px -25px;}
-        #cboxNext.hover{background-position:-75px 0px;}
-        #cboxClose{right:0; background-position:-100px -25px;}
-        #cboxClose.hover{background-position:-100px 0px;}
-        
-        .cboxSlideshow_on #cboxSlideshow{background-position:-125px 0px; right:27px;}
-        .cboxSlideshow_on #cboxSlideshow.hover{background-position:-150px 0px;}
-        .cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px; right:27px;}
-        .cboxSlideshow_off #cboxSlideshow.hover{background-position:-125px 0px;}
\ No newline at end of file
diff --git a/wp/wp-content/plugins/neuf-lightbox/css/framed/images/border.png b/wp/wp-content/plugins/neuf-lightbox/css/framed/images/border.png
deleted file mode 100644
index df13bb6daf79307915e7dd1cf29d48730a50c29d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 163
zcmeAS@N?(olHy`uVBq!ia0vp^j6m$o!3-qZIAk{hDdPa25Z9ofAa{3ne}8{RM@MgO
z?|^^+D=VvngoLiHE@NZkOP4N1MMVV$27dbVsk5{5|NsBbo<1!vSziv+uI=gK7*Y|p
z^k6G*gM$FWhIux5zx_}1v|LF#mgu27<@e;v&wgfZpEc#erGmW@9n6=)zqo$~YGd$p
L^>bP0l+XkK8G}75

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/framed/images/controls.png b/wp/wp-content/plugins/neuf-lightbox/css/framed/images/controls.png
deleted file mode 100644
index 65cfd1dc95c5ee4c6c3d0848b1dcfc0ec69f6aea..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2033
zcmVY16Dl9G~IT3Xc9)Z^ph#l^+1udkq>pj%s8x3{-FJw3a-
zyTZc4tgNhJVPUGOs=2wjTUuIPU0s)#m&C-xo0^)sxw(yvjeLB3^78U4D=RH6Ei5c7
zO-)TME-o-IFwM=)IXOA(>+9v^gnk!Dk@A&OhZFMI5;>mGBP$cHrd(PIyySo
z*x1a>%u7p4z`(#lLPF^0=SN3JF)=YpN=iXNLGSMFH#av(NJvFRMNv^v@$vCHJ3Bl)
zJTo&hNl8iR>FGvBMo>^t>+0%WUS93(?OFDTAPEK`obwEHsK0ZFDr>E}i?Y_RgTwGjIQc{VDiO$Z>?Ck7QQ&aZ#_VDoVc6N4O
zUti|s<#>2_pP!#*wE#@J%|ZXjkIv8d15RfRBQxe$bh
z9TUw{N+{bY1z&)8>k2t;d{xYxg76&eJ5GSmab7cm2*kJn
zLPONkBzslPWkA+%7~Rthzj+ZdH;HAk-Pq6JDgZ%}1qZgnS8`
z|A!BGUTY0vuJ8~Q8k9-cggFrxrb5iS-G06qcV|ScTS@l&{bZ%90njJ((hDH>go-Ov
zZbB$mN3X(#_fF&Gsyr1MX$KPpfH2>rC?r$(w4Y$dt3?|Rbk9;C`p(jcaF$k70KON_
zQXS~iuoPW9OL=;PXDK^qs;!en!tGwM8Dm32zK3Hnob~aBRzMgVd)VIwFSb@T|pRnFQtL^
zQVJ_)!)j6(b&PC(dhopzE0a4<>r<@qU
z`!EtA#BilIes-lde&oVm?AXss0zni9@U)s;c2)_BE*-ve3qd+Xkx|kwB9dCkgI$6`
z2)acBb&UMSYiGCKj*SBn@)q-Z5n&E~kT-AMBO%kChC#@X|0tXb=fe3-(?1oCZXuoB
zLi}_KX?F|Z?iRyJn&Er?*=Fkav37KPz4^Q2i%?hdj$hRY5$X6y8bhS1yyTxuueKWC
z5CSWPU;%-YXn=qr((#(QE2FU06#>QwQ5V+BI|UkI(*RRqvv@oZ-B#&@=C_U&BCHmt
zC#jJURR)BX9qafF9iN(TLwU10A{?j~CXS78W{8Uu@HZ?#PAyEpFp1S*%EGlpZ`N&L
zTO`O5246{p*$9hz`Xxjbs;;d1D5fGugh*6-y27O=ZrgP)q5m%J
z%*b8(_kO793Uc&AR^jAtn*OA38fGEGyOcr5Fk7$*{qtd@niJ25{6h8_pFvpWJ0e#STIxNJ)pDn{H0&eE#G130bNngTwLQ
z{r-aw>G;0=r|=|0AtWIQNk~Exl8}TXBq0e&sC~j#A{E;EQlD^{NCv_KN?|hzt4p`=
zmiMYgEZpwcxm$P_8++%CQ5bCMy}oe)uer?ORv)df%L>+~SMRSwxVo4v42N~krH0-D
zsqp7BEemF3oQ#jZH?};MT1`)gSQr3NRVET5olgiEnaToD3Vmr;&eR^luC95&D|F|1
zySmIE&VwgJDV!&k+duls&IXn^h1S?O8(9D%7J?Dx?3|Gb?cRJt`cH*#(!#mIWIQCf
P00000NkvXXu0mjf=5OWV

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/framed/images/loading.gif b/wp/wp-content/plugins/neuf-lightbox/css/framed/images/loading.gif
deleted file mode 100644
index b4695d811d4f84ed693eff7b5e6b4d61a3e8c48d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9427
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
XWBrHU7iSEP8X8hQyAJO{V6g1pwSv80

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/green/images/nextgreen.png b/wp/wp-content/plugins/neuf-lightbox/css/green/images/nextgreen.png
deleted file mode 100644
index 517c46e97ba2f6775c3b426aabe66985e79d6710..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1139
zcmV-(1dRKMP)v>#Q}74;Fylb2*--?-0l1eY
z5Q#;yd?bpH9@FC~rR|ebbQf0yvHX&++Uz)Q3v0
zLbd5I``r6W8}vn7%YX*w0r@x!IXw_&bi>5TtfZjqu3-t=pX1ua3u)sel3!T
zt%GDV6ov7e5rrB9?z`_}=-D8?y3h_&!2u+bN%YS+aJTCYzWk;gtDCEE*asl$L_~rS
zgf~La7_`if{y+h$N-B32o@PMIS7Xh$ih&1%_^kGP`UU73$8+huv2YA!b>(QOK8qO1
z7&Qu*r_!=}K596HE8l*H;n_QAt^I^#d=kI@GK$6)8>@zBJc^F?%MeKBo%1gAT(zUE
ztqleeIBIHzdgsbM_42wBJM99+GiT=$I^WValF}vTi3f`A;PB+6j=eFB6YB)3?Cmk%`%sG
zk-f}by*oDs@6a^PTs(`>kx|@q*>SO%l9;bmk=Abd}J
zOsP}X*rR(`dcMr&fA4fZ3*yPDCbs__OEt>hx1#SxA09rN+kKg*^E?sH79A@YOZ6v@
zq4(OYtThThKQ@QiVQ<#>Yx(*-Ip93TRIdlkt*1%LnA81#;;;?hPyK)!!#B}>>QcJ=
zx1O7Ly`QnxL+k8Cv`Q_TziFs=3~OXf;CWW&RFyZv8)=o!G^I?*L@yGHk};^u@{@W-
zm{f+I_>l=)`PqzYvV#*9+Q06XzTy4XWlt4;_K$~uFNEaM5aCK4d-n`HEn!-E|Fnl5
zWcFO<>2b5hd_?*`FTqRj68!%YzN4dq%jwMLY5@KeU;q>^tY{)4ssjK3002ovPDHLk
FV1k!lCiVaT

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/green/images/prevgreen.png b/wp/wp-content/plugins/neuf-lightbox/css/green/images/prevgreen.png
deleted file mode 100644
index 127cb3a0722121f79c0fc565ef6febafdd971eae..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1182
zcmV;P1Y!G$P)zehb|BhO=&=F6O}k5ts!AG
ziybf6#(QUuYbzw7m0DD%vCq}j+&eQm_kQ!8^Ud+KX!g#05jAFGV`C!Ticy0$K0Z!_
zi)xYivWZc{RtH}PUk6_YUk6_Y|BRdDG@NAfS*-4_A(=@*B%;a@szxQuEhaQJG}8Ur
z!97G%F}f}mi`0Kcse?|@N`3L8IGb}Hg<|0`|CSar4h}=e6>{h|yDQJ&mdR!C+g^Zt
z_FLT50l%=ih`uVHc$Pi0fGySA=N$o{(cPndUyk|U=+_;`l_4roF%D53MC8qp^ia{f^aCz
z(jiHqDi*|$3R0TWrnREa;YKEzMvR3#A1~w!&^BvmtW(!fIr&%@YxQ;`{I~t&j~j1S
z?%hG#SsNUNp6cX$*$TM=66pjaf&|N3e#G};=pAwqt2EBQZAW*I&ZQAbgt4@^1cgpX
zdCzlQDwpAYXam2j->fh%lgQ9#c0naq!Rd11`gcFl9GA(7?Z^(+t_SeOJEO;R;6Dd1
z2m*pD+xRH>F;lcs6m*~Ofv4jf1hGJK(uYTwnV&%>kztHypzkr@!VBj~6L|PG$Q!V^
zypGVu0b9sCEtbJ_jkS7ePpmTLS}Yp)UiQ(wLe_jt
z?YSEBoWJzSC4?F4S3aABw|@xFTl*_Mj^ZhJd|pZ!E~4~;EQ%!J(remU+tD@LgFqmF
zP3so?H*di;;HFfmDtIn7=R*>eliv(s>l+DRk0ai!NZwZN!0
zocJ8C!-G#hxr{l}_cY(ha=jc`RTVrQre(%XTA)lmLoe&;9mIppFl~|L9fL0p-_Ha4
ztH;hrGE(u;&cx8@G~?HAZa{0(!LIMFZjr++m(EfipJe$$9_d6HxqL~;IAfjOZcKmv
zEi50HiE%+9!NSBf%%|rbTCf5}$KJ$n*U+EE6B9nC6KjhB^x0hhnDtZpjKzWN#}7!M
zc{TPV<>id>t%-+ySqDOgVMJ09sO4&^2!pX*^7W{-Hfu@k%f_og?$4moS9X%Bfv?%x
zJ{a9))mQ3o!;eSAzX{Q&68r-uMm!Av3K&lVUcx?e%=a1{Py8kJSP}G;v3@GxIje$5
w_+RFH{Yy?Ae0{5{9pnGhifa`(Z~qWr05?LnjQ??h(*OVf07*qoM6N<$f_BzDKL7v#

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/grey/colorbox.css b/wp/wp-content/plugins/neuf-lightbox/css/grey/colorbox.css
deleted file mode 100644
index 2374ba83..00000000
--- a/wp/wp-content/plugins/neuf-lightbox/css/grey/colorbox.css
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-    ColorBox Core Style
-    The following rules are the styles that are consistant between all ColorBox themes
-*/
-#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
-#cboxOverlay{position:fixed; width:100%; height:100%;}
-#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
-#cboxContent{position:relative; overflow:visible;}
-#cboxLoadedContent{overflow:auto;}
-#cboxLoadedContent iframe{display:block; width:100%; height:100%; border:0;}
-#cboxTitle{margin:0;}
-#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%;}
-#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
-
-/* 
-    ColorBox example user style
-    These rules are ordered and tabbed in a way that represents the order/nesting of the generated HTML, 
-    in hope that this will make the relationship easier to understand. Thanks, jack@colorpowered.com
-*/
-#cboxOverlay{background:#666;}
-
-#colorbox{}
-    #cboxContent{background:#666; margin-top:20px;}
-        #cboxBottomCenter{height:30px; background:#666;}
-        #cboxLoadedContent{background:#666; padding:5px;}
-                #cboxTitle{position:absolute; bottom:-25px; left:5px; color:#ccc;}
-                #cboxCurrent{position:absolute; bottom:-25px; right:35px; color:#ccc;}
-                #cboxSlideshow{position:absolute; top:-20px; right:90px; color:#fff;}
-                #cboxPrevious{position:absolute; top:50%; left:5px; margin-top:-41px; background-image: url(data:image/gif;base64,AAAA); width:49%; height:100%; text-indent:-9999px;}
-                #cboxPrevious.hover{background-position:bottom left; background:url(images/prevgrey.png) top left no-repeat;}
-                #cboxNext{position:absolute; top:50%; right:5px; margin-top:-41px; background-image: url(data:image/gif;base64,AAAA); width:49%; height:100%; text-indent:-9999px;}
-                #cboxNext.hover{background-position:bottom right; background:url(images/nextgrey.png) top right no-repeat;}
-                #cboxLoadingOverlay{background:#666;}
-        #cboxLoadingGraphic{background:url(images/loading.gif) center center no-repeat;}
-        #cboxClose{position:absolute; bottom:-25px; right:5px; display:block; background:url(images/close.png) top center no-repeat; width:22px; height:22px; text-indent:-9999px;}
-        #cboxClose.hover{background-position:bottom center;}
\ No newline at end of file
diff --git a/wp/wp-content/plugins/neuf-lightbox/css/grey/images/close.png b/wp/wp-content/plugins/neuf-lightbox/css/grey/images/close.png
deleted file mode 100644
index e02eb3c216adddfabe8b44764d6cdda2000cbe37..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 602
zcmV-g0;T`6pHRCwC7
zm9a}gK^(`=htSfR(2yWR=uo!2$&dyIhaB82s5bF`aQ1%?Hw(UFTezhzz}@cg2R?~
z5s(3=VAs;WN77&h9zYk&gT#j*4_vSWJ@5?1ln8$80331LIoJm+@M057=_N>j0r0Zf
z?2~22@8lk7OyQa32e!ejk~`Y+^OQbCidpi(N8#xlnHK3)mBdJd12+>pMpd?~#GZHu(czOs>)
zK3z$N=Tva_^(JT90cVE1&37HkYLp`$=HVASQfA9(A|+SSoMpUn#KPK*n)&2Xmx}KGpDwk>rFWp4hxFlH4T#HNRV7PCJw8V;N3URscoZldEJOnj*-LC
zCzI~-?yFV-H$EGcV_!wRV602mFvNO%!74RiotSR2QEVnbwWhI
oO$nHqS?K-=JNZ+yGvz=Iegxp{+qWGZ9j{-%9vvN>n3$NJp6==CAqYaF(LfM1Z{EEA{{Gt9
z+Ba|B7z_sR+xabl|E~mm-*OXmhLq??y)HONjX>1ze1D?RIn=G1`RR-%fb}zgSh6^a
z(}Zw20U1L^Cs9UcyJfc+al#}J2xVlYUoR{`gd&QDxAb1w4>I~5gc?ccq(G+T!I;H};U_uyHR0@hr>Qk1P1=6fvUBhR
zb|&^^cEQtu&W}=-=YR7o5UI)AD*~%J7bkVd5`xrdw{bHm;|Bf^_|FG$9l}`ruhnVF
zO%=6X*I#yro*pmfB;-A0cVjz73Qy)`oa=df_3Bx6!M3TNALf9BwI*di`jhdovR(I=
zFT31zui1Xw??+Ym-lWNq=V6~8tt012$@*hy3So0QNJ#eIJ4Yh{qJ+aTY>ng8W1p4BrwB_>i7AY-xmGrA}hAeq`aX(yx~=c&|=$w&*&PpKd;G@@0oXK@D0x=;tyY&Eb|HKPsM
z71v`PO)na3pfO*xUD8Z|CQju)c+RSAH=5V^4vb9Q2JwHwt|-INt|!nD?AlRxF5ZT8
zaA9~hGb$~rMhQh_0+31$tkzyLi>X3c7>F!|Jyn`+5{LG=E`sIQbHA8!=`uday6D6Y
zNtVL?j^`6A%UuwO!`}j#s~H?w=P<5}Z2)*PPx|5q$MM+1K6_d_cie9JVArbrB2sRy
zOl**1Mc+|zLM>munG#O|##RApuODr^1+pL-?SHX+D6Dz_@%-Oo(fM&hHYZ-jWU5jf
z&nBYG;>F6&Y`veoLdZ@0WyrDsuXOP)9g*C`A(+R`Ryc2+9w_DJNaf@Dzg?~N{uI_}
zjV(!yygvrGv#KF*Mt{6H^v1Ve=hQyF2^E~bd#&iZg;(%dS^nM;oGSF1Y^&rY}Ian
zFrp%SBGPyN{Z?t%Mo#!qgLQ2)k{>KAv?=zezKN*qPRf>^4QjcWgyxiC}7Vb6vGrBLR(1J&B%*gb{`!Jljb^2%jB$
zFBNUHANC6Q?0~M}cVtgk_;_DAB-BE?2dP
z(C9OIXza3Ao-@UyqX%`5cjg#cHl!uHq;&?~JO{eE+A2KSSD)s8v&CiV$kV$A=DG@i
z;6JY7z*8oPdj@bbJQoTAENW#ls(ucbGA#yhN>zbWqBTbLl>rGqOAY+`
z=psSt8VQE=9+X8^$l@oeDzRvja79ry3nvLcOR7+)bIFyJVoz4}URM-47_u>V
zY*^e(o`?|l++*Y0uQ#&dKapW1o?J{jx+*_gKV^cW+W87KI7hZ5viXv$$=1IR^Z~yA
XWBrHU7iSEP8X8hQyAJO{V6g1pwSv80

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/grey/images/nextgrey.png b/wp/wp-content/plugins/neuf-lightbox/css/grey/images/nextgrey.png
deleted file mode 100644
index 3e27d009064a699cdb43994d5cf238fe2596bb32..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 985
zcmV;~119{5P)DGVHB*yeTh3R0gZZ44=Qd%5EK_8c!?;22L%rv{7qgxc@`A(ptvAtqGCkMA&H78
ziVGsfT{BY;zNVuAnZsl~P3FqhMC@3fhtHav7FEcY!o^g11h=ha$m`o;^&1Ss6ze|ne
zONBk4sIj*NfTNS&WX3Y6PUFrbbWpYV(w8MMVYH*Vj>6T8i4*S^=&u{V1fR
zrNLscM6AUc4u?ZJO$F`l?h5Go`g*C8l$0dWS3p^hz;kkPqCfMROaAUeV`C$3Zf-C?
zKaY}<66ELSf5}TpNs%$x+1ZhelQ;sZsi~1QMoUWz&d$y-GczMZag-?YNTe%5|Eb$k
z!rWk6TboF8b8}N9uJ1a7Mn!@sS^B~L{yvV6kF^mH_7f8YH0PQ5ijc6F`$5NI05&!@u(q~_zP>)Br>Dm*cmg3%&L;tI
zZrMS-`>L6bBxANQ&a38awyZTt}c=N)zwv)+fxYyNZG54
z^1r;il=r{O6DRC^WWOqild_=IZF%<4r=m`^xUX_#(H>okWFw?`YzMNg2ABtk1}Tt
zbJd*dgQPH@MDR7JucMwpC2@@=$l#%g7i)jcH@@NhZQ0Y|Pft(39SfSAI`;k;@B~Kb
zeV0R{`*EEoDE^W%e$N}=4e$o|{}TMf#DpoXJ0GtE{1RXQq13QXPOG;q00000NkvXX
Hu0mjfp2^+I

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/grey/images/prevgrey.png b/wp/wp-content/plugins/neuf-lightbox/css/grey/images/prevgrey.png
deleted file mode 100644
index 7885e7a3a7abb311076d7cdc5a1fbf2bed8e00fa..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1003
zcmV>Z@f_PJ_ZpJ4Ky${Gc_>qZxT$61QQhl1u+st6E74`JVr&l?{k)4
zEw6E0b-@*Tak}8qJzf3Yysy5ms-B}~dU`q_A!gm(-5#!%grN2G^eEw;P-NbiB_V7s
zco)12-UaW1cftQ~^M1u5kB^VCySpp5x3}W)=*dxHV`C*PElnaKBJ{K0@0ZKVOT7;S
z0{T2TIa!jDlJwd2^|h{n@3pbc>FKFFJv~WLQIY)}*u%qvY;SMtJbaFTpPil6k&uvJ
zKhMd@k*205Nl#B#V56g>5*HVzzOb+`@p`?|*w`p_b#-!aaUnxPL%J5vO%S+mZ*P~4
zjSZQcoRqGvF3HTyw7=u<@K6Q^2c@d2${Fx5!DjRF@}#4qLm66MUzh&=eho%zYpcE&
z9UZOy)YMctK0el9jE#*cvr$n|stkfvQBk357|Y7alDoS*4b0ZoRuK68{e3w)I+Ehz
zVrO$6mcqlsB_<|DDl01`F)>j=nsk6|{EUo@3@I-!SKrmumHMBbpLGtt?CflN;6p{Z
zxw*2qxTte5uB)r7Qd(N7fp-)U02JV1l6wNh;GM$4LS2I^sY3DOo)lm%N^z{(W3aaRB;qM;3#e{!MygPhLn^P$pg)oT_Zj|UQ^{g18iSkpUlk6==;n!
z%5pU4Vc#(JUI6IJY!(m)2M5|7O~)WO^z)saouEM*G)AQdFl`SdPy`)4%A_P)P)t-szrVkq
zpP%pV@Bjb*hlhs`4-Y>-KYxFJ-{0SWfPer10MF0QmzS5fx3_O^Z?CVf=jZ45_xCR^
zFQ=!ckB^VX$H!k^U)R^yPft$(vqlU600F8=L_t(|UhUP{YV0r!08lO7oqd+}|G)Hl
z!i3VX%tTOnA8I`$U=bY@A_e$=M%TN3lY!f+1HvLxga~{?BuQU~CFD&cP&}kihULVfuoZsnL`Q~xuv-(kN1b~-H0OM{*xPj(Z
zH!CNOhW5k_q@1|SN}boap^M|QnCG?;dN+Z!dVAB#n~UhURSK~f1n|Kh0M!3+UH|Rq
zde^(&^{WhANm(+>RB+Do)wv+)v?Uoxo50g%A4s-!(kB#kNXfBF2?Rac)Y4OdYNDL(
z4|yRqDRnG(a?X8zNABgQB&u$9*W%-n1wDO|M)&E6m%fjfBtF&nQELn5^(nRVcYJ19
zPd1#^{m<*$d7bf{j>wU@?OCGtb_Kzxa>qde^)D4;WrrV64tv9smFU07*qo
IM6N<$f+}YfD*ylh

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/lightweight/images/loading.gif b/wp/wp-content/plugins/neuf-lightbox/css/lightweight/images/loading.gif
deleted file mode 100644
index 19c67bbd0403f3f00d71bfb21a59cb6c55d482ab..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9427
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
XWBrHU7iSEP8X8hQyAJO{V6g1pwSv80

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/purple/images/nextpurple.png b/wp/wp-content/plugins/neuf-lightbox/css/purple/images/nextpurple.png
deleted file mode 100644
index 0ad162c27624f243beef218a11e1a6c7464bee49..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1132
zcmV-y1e5!TP)
z?;tO-4aFD`WkYadM(q+sW-?@3vW&lpZ;K}TuuQ+03CP>Ptsn?t((>9MmQjkD0s^J&
z?aR(Nq=h;Xvk&Xg-Y2&l|w9(}PU2J}wT8J#TkGr`O;}rVfs2H{^029LIsN1w5it4Gh7Id0-1?>&rmS@06T#zwIs7r&f!15!VRK^#1CP2P
zX!P&}yzu$Apc8iYGo~HG@e}66f~OVGYErTG+KrLHd3OZf+?K?kWd}slenkrevtxvj8Uu$9A5EMiBzO5B98BY@HL}%|W
zXlZFdnn7T()LLcY+CF-CgWin1>>`Xz^dk4qOq{IBC&(#yo;`al9)ea-AvH~VV637t
zGXZ)PzYlkl4ob(wm>t=sQk?hnByR+e3?EkJK&{!W+Sv;waQ(H4`@i0US|#8{
z^EJlzgOVQAmj6}lL!_egfVCG%JBLJAduN!?(Q3tIRwl>#<_k>O9GJGx!8SRCXLIft
z1(=UQMnG!`r?(;FPJ!>RWBjq))&--xGK~Jt34D38hUvng1y8|Hpp|C}V7HYLRqlscDL^4t#c^Ik
zIDb$ZQ(IZ`;9++MO7p8wU01?*{qx;BC>+m1)u+XW|B^$w+t648k&H0U#tL{|7F(l<
zSaq*5rH($6W6!bbT4(d$+BeIRc&_0D^DjS@gYu&D=;?oerDv}WU*+jMrxo3A1tlh&
zt8PG7-`%)13Vz->hN*?2xbfFy`4%p6!I_xp!{x>%Mwux8&)0v1rJrWd^I!z3F2I(Wa=_{EcZqFodnwKK72bIaOuvmOrM_aZ^AgXQCG%)u&@{f1KzZ
z0e=v>G!41k?RJuHCqN#N#eUOY`iA#kw>?#O=fcak2qDPDMj5;IzBk}$3)9wnn-3j%
y?}AC6t|jmicnN&+fNyJSze(Ky0000+_u2&bpzAF00a>rg<;VljnVY=bYc~oW7NOHS<#eHD+UDV-kLpq6Teze4GL<
zsl~{bOo|$|I`}&HI`}&HI`}&H6K=A{u}ChP$NFjr$)gM;66ze$tZ9VF(gH0Tn9qB)}YaL;A7wji>1h;Xn@Z*go~HEa1cAf
z&6|_R=d%#l{X#)3Zjhb7H2NZb_Wz27@1}8G`vxqhA3P(t6~m2*Nt|&FR0li{1mCR9
z%GWfccv}mDhlH(}3
z58s7h^j&lymlMnD+uHR=C9}Bmbrx&)b}GPcuSXC)2*Q2VT3ycbh&9M%P^lYn?ovBt
zK_n7J>UTN_Qh|*NG^fqp3U7}K>C6!h4^lLq7xQRoRneHe!%+V6vC~citi~?*{XY`D
zxbfr4@_lsL`_bVtRfqE>6U7{oi8KV6fO|_@h{bnt)^iDsEUMf%xSj2NWYRfA!wD=d
zER#O)Ng#dJ)X~XnvlJtY$TV)h5=xngqb=6b*V$=)Jw^(sy
z_!+uxYF1RJJy&DS`H>f%LoAZO#K-UB!cZ?feYWx%$y6Lq4Gt4!cm*M+vMds0Mdw)^
zdU%~a1OfqgH*L7<{~o>G0caUjstTS99_RQU!BmWk#ca?U)x^)`r9n(j&A{opN*X~W
zlPSGc*Te)-d+c)thFo~(y|*#{WgE?Rx=rQGs;c1eG%ZE!I0t1jdD`sxK@aw#n^Yo8
z6@xp6*Yov2sN&1ZV9B`B+s$q){_rV`tqwT4jMZ&&sMhDw#N*>EpBEYD6HLg8&fyXB
zbPVCv)Ca7Ixeg7BxFEc0Li{dh+Fn-u*|g5QrGQ5s7B0vM+OZ(&bdfr0(YsdIMwbEJz&X2zdFaXSvw|X|&7%~6=002ovPDHLkV1gppLNovX

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/red/colorbox.css b/wp/wp-content/plugins/neuf-lightbox/css/red/colorbox.css
deleted file mode 100644
index cb3e1026..00000000
--- a/wp/wp-content/plugins/neuf-lightbox/css/red/colorbox.css
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-    ColorBox Core Style
-    The following rules are the styles that are consistant between all ColorBox themes
-*/
-#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
-#cboxOverlay{position:fixed; width:100%; height:100%;}
-#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
-#cboxContent{position:relative; overflow:visible;}
-#cboxLoadedContent{overflow:auto;}
-#cboxLoadedContent iframe{display:block; width:100%; height:100%; border:0;}
-#cboxTitle{margin:0;}
-#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%;}
-#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
-
-/* 
-    ColorBox example user style
-    These rules are ordered and tabbed in a way that represents the order/nesting of the generated HTML, 
-    in hope that this will make the relationship easier to understand. Thanks, jack@colorpowered.com
-*/
-#cboxOverlay{background:#300;}
-
-#colorbox{}
-    #cboxContent{background:#300; margin-top:20px;}
-        #cboxBottomCenter{height:30px; background:#300;}
-        #cboxLoadedContent{background:#300; padding:5px;}
-                #cboxTitle{position:absolute; bottom:-25px; left:5px; color:#ccc;}
-                #cboxCurrent{position:absolute; bottom:-25px; right:35px; color:#ccc;}
-                #cboxSlideshow{position:absolute; top:-20px; right:90px; color:#fff;}
-                #cboxPrevious{position:absolute; top:50%; left:5px; margin-top:-41px; background-image: url(data:image/gif;base64,AAAA); width:49%; height:100%; text-indent:-9999px;}
-                #cboxPrevious.hover{background-position:bottom left; background:url(images/prevred.png) top left no-repeat;}
-                #cboxNext{position:absolute; top:50%; right:5px; margin-top:-41px; background-image: url(data:image/gif;base64,AAAA); width:49%; height:100%; text-indent:-9999px;}
-                #cboxNext.hover{background-position:bottom right; background:url(images/nextred.png) top right no-repeat;}
-                #cboxLoadingOverlay{background:#300;}
-        #cboxLoadingGraphic{background:url(images/loading.gif) center center no-repeat;}
-        #cboxClose{position:absolute; bottom:-25px; right:5px; display:block; background:url(images/close.png) top center no-repeat; width:22px; height:22px; text-indent:-9999px;}
-        #cboxClose.hover{background-position:bottom center;}
\ No newline at end of file
diff --git a/wp/wp-content/plugins/neuf-lightbox/css/red/images/close.png b/wp/wp-content/plugins/neuf-lightbox/css/red/images/close.png
deleted file mode 100644
index e02eb3c216adddfabe8b44764d6cdda2000cbe37..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 602
zcmV-g0;T`6pHRCwC7
zm9a}gK^(`=htSfR(2yWR=uo!2$&dyIhaB82s5bF`aQ1%?Hw(UFTezhzz}@cg2R?~
z5s(3=VAs;WN77&h9zYk&gT#j*4_vSWJ@5?1ln8$80331LIoJm+@M057=_N>j0r0Zf
z?2~22@8lk7OyQa32e!ejk~`Y+^OQbCidpi(N8#xlnHK3)mBdJd12+>pMpd?~#GZHu(czOs>)
zK3z$N=Tva_^(JT90cVE1&37HkYLp`$=HVASQfA9(A|+SSoMpUn#KPK*n)&2Xmx}KGpDwk>rFWp4hxFlH4T#HNRV7PCJw8V;N3URscoZldEJOnj*-LC
zCzI~-?yFV-H$EGcV_!wRV602mFvNO%!74RiotSR2QEVnbwWhI
oO$nHqS?K-=JNZ+yGvz=Iegxp{+qWGZ9j{-%9vvN>n3$NJp6==CAqYaF(LfM1Z{EEA{{Gt9
z+Ba|B7z_sR+xabl|E~mm-*OXmhLq??y)HONjX>1ze1D?RIn=G1`RR-%fb}zgSh6^a
z(}Zw20U1L^Cs9UcyJfc+al#}J2xVlYUoR{`gd&QDxAb1w4>I~5gc?ccq(G+T!I;H};U_uyHR0@hr>Qk1P1=6fvUBhR
zb|&^^cEQtu&W}=-=YR7o5UI)AD*~%J7bkVd5`xrdw{bHm;|Bf^_|FG$9l}`ruhnVF
zO%=6X*I#yro*pmfB;-A0cVjz73Qy)`oa=df_3Bx6!M3TNALf9BwI*di`jhdovR(I=
zFT31zui1Xw??+Ym-lWNq=V6~8tt012$@*hy3So0QNJ#eIJ4Yh{qJ+aTY>ng8W1p4BrwB_>i7AY-xmGrA}hAeq`aX(yx~=c&|=$w&*&PpKd;G@@0oXK@D0x=;tyY&Eb|HKPsM
z71v`PO)na3pfO*xUD8Z|CQju)c+RSAH=5V^4vb9Q2JwHwt|-INt|!nD?AlRxF5ZT8
zaA9~hGb$~rMhQh_0+31$tkzyLi>X3c7>F!|Jyn`+5{LG=E`sIQbHA8!=`uday6D6Y
zNtVL?j^`6A%UuwO!`}j#s~H?w=P<5}Z2)*PPx|5q$MM+1K6_d_cie9JVArbrB2sRy
zOl**1Mc+|zLM>munG#O|##RApuODr^1+pL-?SHX+D6Dz_@%-Oo(fM&hHYZ-jWU5jf
z&nBYG;>F6&Y`veoLdZ@0WyrDsuXOP)9g*C`A(+R`Ryc2+9w_DJNaf@Dzg?~N{uI_}
zjV(!yygvrGv#KF*Mt{6H^v1Ve=hQyF2^E~bd#&iZg;(%dS^nM;oGSF1Y^&rY}Ian
zFrp%SBGPyN{Z?t%Mo#!qgLQ2)k{>KAv?=zezKN*qPRf>^4QjcWgyxiC}7Vb6vGrBLR(1J&B%*gb{`!Jljb^2%jB$
zFBNUHANC6Q?0~M}cVtgk_;_DAB-BE?2dP
z(C9OIXza3Ao-@UyqX%`5cjg#cHl!uHq;&?~JO{eE+A2KSSD)s8v&CiV$kV$A=DG@i
z;6JY7z*8oPdj@bbJQoTAENW#ls(ucbGA#yhN>zbWqBTbLl>rGqOAY+`
z=psSt8VQE=9+X8^$l@oeDzRvja79ry3nvLcOR7+)bIFyJVoz4}URM-47_u>V
zY*^e(o`?|l++*Y0uQ#&dKapW1o?J{jx+*_gKV^cW+W87KI7hZ5viXv$$=1IR^Z~yA
XWBrHU7iSEP8X8hQyAJO{V6g1pwSv80

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/red/images/nextred.png b/wp/wp-content/plugins/neuf-lightbox/css/red/images/nextred.png
deleted file mode 100644
index f3e54f4608985d7d2b869e07ba35ffd2f43a3757..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1087
zcmV-F1i<@=P)4a@;4BJ~N|IEFe3vyv}T6xX?gJi_io?D=I767>+OY3qrnD|xbAjCPtW8y
za^L_A`T3Cr&lyOj!`Q!k!JD2Q6jW9Q4#3ys^zny#dmDw>*)UgBz(>CYNdz!HDM{R8
zxpoZ?8X7Ry-;aW-Dv|MLFJGeK!UdrQFA-H|wL-2?V3CM@)X{<3+FEFdcn(!ULgZxc
zKfHk?nL`=x7#>FI$Oy6u3mLfp9t_?~YEVV`XUxkDHpHRjYBcx?0qGIMV&z@=x8KGs*`vmzKgqhnXTd
zveC(cvM!h71HE6%ofJ9-MgZz3ZiScz;{=?C>9gB>W2}geqw4-8bM_
z!YsYtt>KpUKZNw^S^_VDm%zskc&pVai|NeADgoaF7y$Fnv97rH{q_I=002ovPDHLk
FV1kIZ1%3bk

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/red/images/prevred.png b/wp/wp-content/plugins/neuf-lightbox/css/red/images/prevred.png
deleted file mode 100644
index cbf0e79ff9be088b737e1a6033d71904775b4278..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1134
zcmV-!1d;oRP)sZ6bw
zp_W0MWk@tGOh`y{#X=S?Ow@!w#D=X4jfo3USZEY$h#E9TjYLrcDuRLxQlKrRlzP64
zuc-r?DDe^dzNC4t@4nu5&v(9a?$_4(G7v~0&7!lj(L!@3!h#A7i`kB(v`9EQoHI!9#N?IU#dRZOC)E)V1ZsMRiYNZS9Bo3*2rj&CFnJbrt0e4asLntgfu!)9cr2PB+JN0Y7^G
zKJJZ-z?qwyyk1FQ``X%2=gy-kcckLQt@wmFa
zmRN5*<@`i@J3c;tj{YZ4aK_<)bH|S4Gv+5I(AU$01Af0g;7NsAtiPlLZD-FahGel9
zu3UkgN!icEOXOu`q5ae;*h@>XFg1m{SFhsw?b~p$LNar55R637dhj5;hYqPZv?!{m
zK#XItM~^V|>eV;k=f=h`xv&8D?%n!oURbhbW+FR39~DhastRW3=8|%-kZlXcd)=~QE`%F5(R##~iZ@D&&11(PcCNyzc-@G$oC{t_~;i{_L1
zgy31
z7*PHp*F*xI!a@|1dEMMzIXD;UE-1j!)>idCi;Skay|}Sx{@C&32vG``dVA5(+zij2
zJ;^y1mzUAXWQkzGK;)kw6Od~XsjM4=_w^}fJqRk=n7s8Pc)ti=KJJG
zHRO|R(PtxN5x8{=9XuD0kPxTOA(IXo;zr?T!p>j3h_X9()cqxtf>v3&8lIG?#@I#)
zinH8hv9)A){PSnEMQS^SBuDo1X)>Gol5J26arzo2=f<;V@RIRjpHJT=M{
zoGgW?`S@2O6ULh9DS{weF5
z_A{0MTb!O&4lUi-&zx5nm90t2Uh{z^8e4>{+Ss@Vs0A9P%=LZb78NPC*Fw5Mna@r$
z)OHfxz^83*A0%7Sef_Tdq$2*NM7JdPFilI!@K?Y@2GYX*cg&ZvgZtSxu^+aTEynt$
zfEQLxTM(G>V}=3V0B?X#4f&_moUXv-_(gyL0LJsU4bGl
-.cboxIE #cboxTopLeft{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderTopLeft.png', sizingMethod='scale');}
-.cboxIE #cboxTopCenter{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderTopCenter.png', sizingMethod='scale');}
-.cboxIE #cboxTopRight{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderTopRight.png', sizingMethod='scale');}
-.cboxIE #cboxBottomLeft{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderBottomLeft.png', sizingMethod='scale');}
-.cboxIE #cboxBottomCenter{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderBottomCenter.png', sizingMethod='scale');}
-.cboxIE #cboxBottomRight{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderBottomRight.png', sizingMethod='scale');}
-.cboxIE #cboxMiddleLeft{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderMiddleLeft.png', sizingMethod='scale');}
-.cboxIE #cboxMiddleRight{background:transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/internet_explorer/borderMiddleRight.png', sizingMethod='scale');}
-
-
diff --git a/wp/wp-content/plugins/neuf-lightbox/css/shadowed/colorbox.css b/wp/wp-content/plugins/neuf-lightbox/css/shadowed/colorbox.css
deleted file mode 100644
index 2ea67b92..00000000
--- a/wp/wp-content/plugins/neuf-lightbox/css/shadowed/colorbox.css
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
-    ColorBox Core Style:
-    The following CSS is consistent between example themes and should not be altered.
-*/
-#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
-#cboxOverlay{position:fixed; width:100%; height:100%;}
-#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
-#cboxContent{position:relative;}
-#cboxLoadedContent{overflow:auto;}
-#cboxTitle{margin:0;}
-#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%;}
-#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
-.cboxPhoto{float:left; margin:auto; border:0; display:block;}
-.cboxIframe{width:100%; height:100%; display:block; border:0;}
-
-/* 
-    User Style:
-    Change the following styles to modify the appearance of ColorBox.  They are
-    ordered & tabbed in a way that represents the nesting of the generated HTML.
-*/
-#cboxOverlay{background:#fff;}
-#colorbox{}
-    #cboxTopLeft{width:25px; height:25px; background:url(images/border1.png) no-repeat 0 0;}
-    #cboxTopCenter{height:25px; background:url(images/border1.png) repeat-x 0 -50px;}
-    #cboxTopRight{width:25px; height:25px; background:url(images/border1.png) no-repeat -25px 0;}
-    #cboxBottomLeft{width:25px; height:25px; background:url(images/border1.png) no-repeat 0 -25px;}
-    #cboxBottomCenter{height:25px; background:url(images/border1.png) repeat-x 0 -75px;}
-    #cboxBottomRight{width:25px; height:25px; background:url(images/border1.png) no-repeat -25px -25px;}
-    #cboxMiddleLeft{width:25px; background:url(images/border2.png) repeat-y 0 0;}
-    #cboxMiddleRight{width:25px; background:url(images/border2.png) repeat-y -25px 0;}
-    #cboxContent{background:#fff; overflow:hidden;}
-        #cboxError{padding:50px; border:1px solid #ccc;}
-        #cboxLoadedContent{margin-bottom:20px;}
-        #cboxTitle{position:absolute; bottom:0px; left:0; text-align:center; width:100%; color:#999;}
-        #cboxCurrent{position:absolute; bottom:0px; left:100px; color:#999;}
-        #cboxSlideshow{position:absolute; bottom:0px; right:42px; color:#444;}
-        #cboxPrevious{position:absolute; bottom:0px; left:0; color:#444;}
-        #cboxNext{position:absolute; bottom:0px; left:63px; color:#444;}
-        #cboxLoadingOverlay{background:#fff url(images/loading.gif) no-repeat 5px 5px;}
-        #cboxClose{position:absolute; bottom:0; right:0; display:block; color:#444;}
-
-/*
-  The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
-  when an alpha filter (opacity change) is set on the element or ancestor element.  This style is not applied to IE9.
-*/
-.cboxIE #cboxTopLeft,
-.cboxIE #cboxTopCenter,
-.cboxIE #cboxTopRight,
-.cboxIE #cboxBottomLeft,
-.cboxIE #cboxBottomCenter,
-.cboxIE #cboxBottomRight,
-.cboxIE #cboxMiddleLeft,
-.cboxIE #cboxMiddleRight {
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
-}
-
-/*
-  The following provides PNG transparency support for IE6
-*/
-.cboxIE6 #cboxTopLeft{background:url(images/ie6/borderTopLeft.png);}
-.cboxIE6 #cboxTopCenter{background:url(images/ie6/borderTopCenter.png);}
-.cboxIE6 #cboxTopRight{background:url(images/ie6/borderTopRight.png);}
-.cboxIE6 #cboxBottomLeft{background:url(images/ie6/borderBottomLeft.png);}
-.cboxIE6 #cboxBottomCenter{background:url(images/ie6/borderBottomCenter.png);}
-.cboxIE6 #cboxBottomRight{background:url(images/ie6/borderBottomRight.png);}
-.cboxIE6 #cboxMiddleLeft{background:url(images/ie6/borderMiddleLeft.png);}
-.cboxIE6 #cboxMiddleRight{background:url(images/ie6/borderMiddleRight.png);}
-
-.cboxIE6 #cboxTopLeft,
-.cboxIE6 #cboxTopCenter,
-.cboxIE6 #cboxTopRight,
-.cboxIE6 #cboxBottomLeft,
-.cboxIE6 #cboxBottomCenter,
-.cboxIE6 #cboxBottomRight,
-.cboxIE6 #cboxMiddleLeft,
-.cboxIE6 #cboxMiddleRight {
-    _behavior: expression(this.src = this.src ? this.src : this.currentStyle.backgroundImage.split('"')[1], this.style.background = "none", this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + this.src + ", sizingMethod='scale')");
-}
diff --git a/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/border1.png b/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/border1.png
deleted file mode 100644
index 0ddc704051b651f43cffb1326dee3ba563727acc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1057
zcmV++1m63JP)r
zAF%JpeZBR%PujJ&?cU$mzF@zQ4A^OFY-v$p7aBuKlp}eWDguO+1d;SiQl=<_wN?Ru
z$}F)CZO*|QgDyN_U;rRDpw2LP$OLZD@3s^O2w|jPHUa@DKspfu0^h+*kZIDEfdC1N
zo&f>EwiE)lfoMlz^h}7DN&?yjR1p>l!e}9cKf%uX+@UK4M1f#6=sL9_;DREMkOewV
zfoO+dLI7s`|J0@eorTef?let$#kA*uOgea0n8ZlkOee&KKj{^r91I77A-eH8ps|f4
zR&?ZffL&>V(CCVRrvEA8dEmR#;6Zc*yd|vTX9rg5T7axEP5v+4Zntml@9#g&NiFW~
z?mj*|Jp4E|`@kX*eYOBf8o9vM2x2{|-tBguH=E5{t@UOONZ2e{4&
z;l%aj`Xu76lRR)cL2`%#edS`pxl`^D?M4w&McV@gar&!0#ef2FI8(b
z#DWlmm{Y_y#PX{mPj?a|R4~TXasN0V$FYKyxRUf(A#@Ibt8K`1v19a7GHVLjpv*rykJg@YO(c90K=lUwwq8p*)1_eipDm!ER2ms;1lNLjj`TTFBVX&~i5Rt@CB
zKy)o2>smmrY5{rGKrRgAbrreRZnyhd1&FOAkAKnU>`_;KpIE`X&?=xfi#c?
z(m)zW11T>$=X;6&QrscWyDBVl)L*rL{B9r@2J%=7$e|XHz7~+7fn1QRR3&ddR0UFn
b{1IRPnb~f(1W%SC00000NkvXXu0mjf?Cjqi

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/border2.png b/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/border2.png
deleted file mode 100644
index aa62a0b724371d1f0a8e183c5f3707d2f7aecd63..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 170
zcmeAS@N?(olHy`uVBq!ia0vp^MnKHS!3HGfT>QHUNJ*BsMwA5SrjnPU>t&Bgig1lwFnk>0^Moe(#2j_SDR=qm2cFWSad{!^LK345wm0*~eFZqAj
Sx%>#AxeT7JelF{r5}E+(L_S*p

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderBottomCenter.png b/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderBottomCenter.png
deleted file mode 100644
index 12e0e9ac022d0d48ea77f547c51b60b240487b77..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 153
zcmeAS@N?(olHy`uVBq!ia0vp^j6f{O!3HEhOmL|OaY|exN`mv#O3D+9QW+dm@{>{(
zJaZG%Q-e|yQz{EjrrH1%S$n!ThE&{2`p3`W!{gu}_3_=^-Ng!Rb{)T&UH-HP?{_$o
ypQdn-M`?xwi?Rn#&c%9x>5Y;Zy37s@j0`{Q1aDn?T4)6{hQZU-&t;ucLK6VDcrWMx

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderBottomLeft.png b/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderBottomLeft.png
deleted file mode 100644
index b7a474ae056f3c500e460f6d88bc1621053ff219..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 473
zcmV;~0Ve*5P)P000>X1^@s6#OZ}&0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzdr3q=RCwC7mQPB=Fcik~V*QUuMWmvL
z3tf5)cRi1ruFH4^FW~{aMSBGo-4$GS@_dn|Jj2T*Z8h*CFfiZO?`vLW6e22GKZrdG
P00000NkvXXu0mjfah1x1

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderBottomRight.png b/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderBottomRight.png
deleted file mode 100644
index 6b6cb159b92b51b1bb735c359f2db599559bcf2a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 470
zcmV;{0V)28P)P000>X1^@s6#OZ}&0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzcu7P-RCwC7mCH)RFcgN9SjQWKC?XX>
zTXXid{RGsZUH
z9^8NuoP#wu0xM7eVc-}xb#j_AWVKw0D^rng@+CqDJy1H5=<2d0oO2ZrDBo&+x)K=>
zsb8(6@B24AMoT19LY6EUhT*-cs#iynmYdWXsq6X?pWm7KxB?g86r6xVsz%KGX_Bt%
zUQ7Yrf@^RI&P)*=g9ES+_AJ375wQ@V%Ad-ze9*5JqZKac3Dxpmv~9axwi2ag2OBVg2uwB(bJP$H`D
zhKUT9mV5;yZiPp~Ly2q&^As1gi=^i?_9lK!#8M>^4V6wjH#Zs!h+=&fI=5!YDsbV1
zCW{JeNfEl$LY16y70(ipc-^v`$$b))Daw-YznCm2na=xvZr=h709CMu`cYr}PXGV_
M07*qoM6N<$g158F@Bjb+

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderMiddleLeft.png b/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderMiddleLeft.png
deleted file mode 100644
index 8d0eb739dec9626b405d385cec01cfe5c7b3e34c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 148
zcmeAS@N?(olHy`uVBq!ia0vp^l0eMD!3HF&7fw+F36!`-lmzFem6RtIr7}3C}1{rUgjp4lj&CCMT|(Z6Bl0tW6~4BERGq<1k`
yJ2LW#?B7%S`rw

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderTopLeft.png b/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/ie6/borderTopLeft.png
deleted file mode 100644
index ae9bda04097b6f3be5584faf7409f8fe4d13eb32..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 359
zcmV-t0hs=YP)P000>X1^@s6#OZ}&0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz2}wjjRCwC7mQfDEAPk22q54ST&fp0=
z#}4T0-t=%g!xSS4E0h&Pk`5NO|D!Es!?tba-;Kfrz-V1$kWpgNJPiP000>X1^@s6#OZ}&0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzb4f%&RCwC7mQ7B>Fc5`1=C}MRfS`y9
zfdosI+#)ApA8`jR!6rKnkbQCm7THCtLu1C#xN--N6PGg5t1UO3ukXom0$S_Ie;1J4
z+9=hSFaR~Ox!wdM2B2dh+XGE?#CIZOHvo}FX-$Mo1AsB}Ajm?F1Ark7f-K~WLAW|L
z+W8~^`~{f_0Jk}xcO#swKyCvNtA#N4Ia>i)$fF0s0bCM{Z;U16$ysz`;f=r9xCq3z
zbkjqss(P~vN+}Hh+Kf%pd}dkpk>`0sjk&lp--hTR=0mKuZNJL0e5FY5QFGK4>Kt{7
zIzsK!4Q)=2Ejp&ajVlPTRoC@9f$mT@s7q8r_t*hy54FP}5Ct(sjvi{(
zJaZG%Q-e|yQz{EjrrH1%S$n!ThE&{2`p3`W!{gu}_3_=^-Ng!Rb{)T&UH-HP?{_$o
ypQdn-M`?xwi?Rn#&c%9x>5Y;Zy37s@j0`{Q1aDn?T4)6{hQZU-&t;ucLK6VDcrWMx

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderBottomLeft.png b/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderBottomLeft.png
deleted file mode 100644
index b7a474ae056f3c500e460f6d88bc1621053ff219..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 473
zcmV;~0Ve*5P)P000>X1^@s6#OZ}&0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzdr3q=RCwC7mQPB=Fcik~V*QUuMWmvL
z3tf5)cRi1ruFH4^FW~{aMSBGo-4$GS@_dn|Jj2T*Z8h*CFfiZO?`vLW6e22GKZrdG
P00000NkvXXu0mjfah1x1

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderBottomRight.png b/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderBottomRight.png
deleted file mode 100644
index 6b6cb159b92b51b1bb735c359f2db599559bcf2a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 470
zcmV;{0V)28P)P000>X1^@s6#OZ}&0000PbVXQnQ*UN;
zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUzcu7P-RCwC7mCH)RFcgN9SjQWKC?XX>
zTXXid{RGsZUH
z9^8NuoP#wu0xM7eVc-}xb#j_AWVKw0D^rng@+CqDJy1H5=<2d0oO2ZrDBo&+x)K=>
zsb8(6@B24AMoT19LY6EUhT*-cs#iynmYdWXsq6X?pWm7KxB?g86r6xVsz%KGX_Bt%
zUQ7Yrf@^RI&P)*=g9ES+_AJ375wQ@V%Ad-ze9*5JqZKac3Dxpmv~9axwi2ag2OBVg2uwB(bJP$H`D
zhKUT9mV5;yZiPp~Ly2q&^As1gi=^i?_9lK!#8M>^4V6wjH#Zs!h+=&fI=5!YDsbV1
zCW{JeNfEl$LY16y70(ipc-^v`$$b))Daw-YznCm2na=xvZr=h709CMu`cYr}PXGV_
M07*qoM6N<$g158F@Bjb+

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderMiddleLeft.png b/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderMiddleLeft.png
deleted file mode 100644
index 8f248ac12f7032bbd5a4d286eaa423c391935358..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 154
zcmeAS@N?(olHy`uVBq!ia0vp^l0eMD!3HF&7fw+F36!`-lmzFem6RtIr7}3C!be$JWM`3B@Bm;3pFq>GaR@h&Z=h^><2V~!PC{xWt~$(698{IEJ6SP

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderTopCenter.png b/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderTopCenter.png
deleted file mode 100644
index 7cb1da43ea70d16cd9e8a5e04db63615353ca7dc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 143
zcmeAS@N?(olHy`uVBq!ia0vp^j6f{O!3HEhOmL|OaY|exN`mv#O3D+9QW+dm@{>{(
zJaZG%Q-e|yQz{EjrrH1%8G5=nhE&{2`uG38Ju`=aQKHb9f+kj%4NV+o0tfljEoSJ)
o?YVJ?!{n)b$7u&4Mu7wdwi{f5KmC@612r>vy85}Sb4q9e0J!ce7ytkO

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderTopLeft.png b/wp/wp-content/plugins/neuf-lightbox/css/shadowed/images/internet_explorer/borderTopLeft.png
deleted file mode 100644
index d733b6c866fa5567eac759c40bb656e32d6a2e6a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 405
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
XWBrHU7iSEP8X8hQyAJO{V6g1pwSv80

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/teal/images/nextteal.png b/wp/wp-content/plugins/neuf-lightbox/css/teal/images/nextteal.png
deleted file mode 100644
index 16da2f53f9bb9a6da4f35444875d12503fdf5559..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1145
zcmV-<1cv*GP)^PYR|dEWCp=RNl-YLB#lSx-+-40&eCdziBgjR_HEX*wY%;`Y(^qzuHKHd
zU9eYYkvI|~8muNC!ZDAfmQ#0t;YyUF=s*F;lO8PROmHQ9j
zL;GupNL%39EL|vy{GPT0O}KRNB8F$?(7v|;V+&r~8~6?fPM$^sv4K_jv-2NAMOAk^
zna9oE%joRrKyiVN$I^?M?9o1vys^xNin^U}4PC<>YcUQH%^58fL{GK>NnZkN)M!u?
zPd3wDr^@X=aSD#>0~jF&-5&oP*4=izT~i4q#SsM+%1B-bps{F_11~Y?v#d&W8`-
zoS49b=UGw$e1m8+M7ru(0R?JxZg%@r3lRl(6kBkxwGB7E>LuEmArd1v_2U-a
z@T205x9|aJo^|L%%~G}c^Xya1jtrxhNGM=0D&sZ-4K|al~q*N&ljy17WT4PdRG-p1{mnEHP
zT54>}KS*HMF{sLDlh+HHUX!&aF=OlF7}O#l-UzmQ0V@vrgYzIu%Yqfu#4vgiO|fRO;gMCg{4u~kOf
zt@nHV{m#}pm8rpnF7*8+C-1wS_i~=|T+V4HJ9B5cj5@2)(NP&6<*36N8ygdZ%j%K&
zO36{jC4rZ~OW-B&5_k#xQ(nrAcu1~L#N9{~$y^??)z6HY1~`lcXjCh&2!x}ErZeK4
zcU2mt0&Pt?v{K`WWwN+S*ObbC-*Y)k20Tb4Q7D$Mv!e}inXKBErFY+642%1AQQs2>
zpD&egb|#46`3Y#vmg?u`u5P@tqZdvZ{GEppob!JTjnT9sIi-@C3WI}t@xnHjn3%6l
zokB5}gF>xFd36#LDisbNdKo{57I9RLXJUx?+k;AbLBNG#0bnJu>3dY+kVAekFT@;;Xxjn)=K
z!eJz{Imk$=%yxrl3b>k$=-<8_xl|I%BzZA`#UiYYTG7{KX|6VwdAHRJbGI8er>2Cx
zxcGQ$Hi-7!&!VTrQd{t)VgU&P%7dB=-bW&|0E@)}U4we1zfce|ohG&}-Q
zX%)U_&nmTAOh=b+Wo`i%>3(iM-4CHieVid~j|WS$GjxAcJntSoYi{xfJlEIzryO{q
zvKQV|D6lwn6YmmWwgCIqHM}1~qyWY0z;ek1#?PG>$2>94HhI3kPh#NT>idu`ft
zfU)Nf9oUa>Dh>a~A7Rkz!N3}?X5%poymSygryY5+fEb`$4y9s6pxemn4&N{WfdGOX
zHr%>;6+OH6z^ZGkEqG>|lYU^G;Nk3+Q*zt%P4E(v*Z2A`J~09B(ZeDm!~{~HHET2!
zh)wIh$Jf<~Pu_nIXKd}Hjy$}r)~d2<>iKf1DAxS-FDQ$C9_*mI8_OhbULwUnI1p)a
z7LzIbO3UKf79pinYAdmC?eXIFH-4C0op3)!&}}&Lg-nLLoLs-3l#xp$s!N!M7;_Bm
z!^Fu?;e6{jnzb6S8vOYANlfOlf6N!j|H#|#V0f#ex_NTD-I%*{0Xtld$7X%Qe#YW7
z{wLO7P)S3US)l{1bTY<1Z(8+Q9eHvh`nlv)NeR5b*L%
v2uk`fLjo^>m%#tE_&>GsdIiqM-vt-|#6-FA%(Eud00000NkvXXu0mjfmwHAi

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/white/colorbox.css b/wp/wp-content/plugins/neuf-lightbox/css/white/colorbox.css
deleted file mode 100644
index 6d6666db..00000000
--- a/wp/wp-content/plugins/neuf-lightbox/css/white/colorbox.css
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-    ColorBox Core Style
-    The following rules are the styles that are consistant between all ColorBox themes
-*/
-#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
-#cboxOverlay{position:fixed; width:100%; height:100%;}
-#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
-#cboxContent{position:relative; overflow:visible;}
-#cboxLoadedContent{overflow:auto;}
-#cboxLoadedContent iframe{display:block; width:100%; height:100%; border:0;}
-#cboxTitle{margin:0;}
-#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%;}
-#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
-
-/* 
-    ColorBox example user style
-    These rules are ordered and tabbed in a way that represents the order/nesting of the generated HTML, 
-    in hope that this will make the relationship easier to understand. Thanks, jack@colorpowered.com
-*/
-#cboxOverlay{background:#fff;}
-
-#colorbox{}
-    #cboxContent{background:#fff; margin-top:20px;}
-        #cboxBottomCenter{height:30px; background:#fff;}
-        #cboxLoadedContent{background:#fff; padding:5px;}
-                #cboxTitle{position:absolute; bottom:-25px; left:5px; color:#ccc;}
-                #cboxCurrent{position:absolute; bottom:-25px; right:35px; color:#ccc;}
-                #cboxSlideshow{position:absolute; top:-20px; right:90px; color:#fff;}
-                #cboxPrevious{position:absolute; top:50%; left:5px; margin-top:-41px; background-image: url(data:image/gif;base64,AAAA); width:49%; height:100%; text-indent:-9999px;}
-                #cboxPrevious.hover{background-position:bottom left; background:url(images/prevwhite.png) top left no-repeat;}
-                #cboxNext{position:absolute; top:50%; right:5px; margin-top:-41px; background-image: url(data:image/gif;base64,AAAA); width:49%; height:100%; text-indent:-9999px;}
-                #cboxNext.hover{background-position:bottom right; background:url(images/nextwhite.png) top right no-repeat;}
-                #cboxLoadingOverlay{background:#fff;}
-        #cboxLoadingGraphic{background:url(images/loading.gif) center center no-repeat;}
-        #cboxClose{position:absolute; bottom:-25px; right:5px; display:block; background:url(images/close.png) top center no-repeat; width:22px; height:22px; text-indent:-9999px;}
-        #cboxClose.hover{background-position:bottom center;}
\ No newline at end of file
diff --git a/wp/wp-content/plugins/neuf-lightbox/css/white/images/close.png b/wp/wp-content/plugins/neuf-lightbox/css/white/images/close.png
deleted file mode 100644
index e02eb3c216adddfabe8b44764d6cdda2000cbe37..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 602
zcmV-g0;T`6pHRCwC7
zm9a}gK^(`=htSfR(2yWR=uo!2$&dyIhaB82s5bF`aQ1%?Hw(UFTezhzz}@cg2R?~
z5s(3=VAs;WN77&h9zYk&gT#j*4_vSWJ@5?1ln8$80331LIoJm+@M057=_N>j0r0Zf
z?2~22@8lk7OyQa32e!ejk~`Y+^OQbCidpi(N8#xlnHK3)mBdJd12+>pMpd?~#GZHu(czOs>)
zK3z$N=Tva_^(JT90cVE1&37HkYLp`$=HVASQfA9(A|+SSoMpUn#KPK*n)&2Xmx}KGpDwk>rFWp4hxFlH4T#HNRV7PCJw8V;N3URscoZldEJOnj*-LC
zCzI~-?yFV-H$EGcV_!wRV602mFvNO%!74RiotSR2QEVnbwWhI
oO$nHqS?K-=JNZ+yGvz=Iegxp{+qWGZ9j{-%9vvN>n3$NJp6==CAqYaF(LfM1Z{EEA{{Gt9
z+Ba|B7z_sR+xabl|E~mm-*OXmhLq??y)HONjX>1ze1D?RIn=G1`RR-%fb}zgSh6^a
z(}Zw20U1L^Cs9UcyJfc+al#}J2xVlYUoR{`gd&QDxAb1w4>I~5gc?ccq(G+T!I;H};U_uyHR0@hr>Qk1P1=6fvUBhR
zb|&^^cEQtu&W}=-=YR7o5UI)AD*~%J7bkVd5`xrdw{bHm;|Bf^_|FG$9l}`ruhnVF
zO%=6X*I#yro*pmfB;-A0cVjz73Qy)`oa=df_3Bx6!M3TNALf9BwI*di`jhdovR(I=
zFT31zui1Xw??+Ym-lWNq=V6~8tt012$@*hy3So0QNJ#eIJ4Yh{qJ+aTY>ng8W1p4BrwB_>i7AY-xmGrA}hAeq`aX(yx~=c&|=$w&*&PpKd;G@@0oXK@D0x=;tyY&Eb|HKPsM
z71v`PO)na3pfO*xUD8Z|CQju)c+RSAH=5V^4vb9Q2JwHwt|-INt|!nD?AlRxF5ZT8
zaA9~hGb$~rMhQh_0+31$tkzyLi>X3c7>F!|Jyn`+5{LG=E`sIQbHA8!=`uday6D6Y
zNtVL?j^`6A%UuwO!`}j#s~H?w=P<5}Z2)*PPx|5q$MM+1K6_d_cie9JVArbrB2sRy
zOl**1Mc+|zLM>munG#O|##RApuODr^1+pL-?SHX+D6Dz_@%-Oo(fM&hHYZ-jWU5jf
z&nBYG;>F6&Y`veoLdZ@0WyrDsuXOP)9g*C`A(+R`Ryc2+9w_DJNaf@Dzg?~N{uI_}
zjV(!yygvrGv#KF*Mt{6H^v1Ve=hQyF2^E~bd#&iZg;(%dS^nM;oGSF1Y^&rY}Ian
zFrp%SBGPyN{Z?t%Mo#!qgLQ2)k{>KAv?=zezKN*qPRf>^4QjcWgyxiC}7Vb6vGrBLR(1J&B%*gb{`!Jljb^2%jB$
zFBNUHANC6Q?0~M}cVtgk_;_DAB-BE?2dP
z(C9OIXza3Ao-@UyqX%`5cjg#cHl!uHq;&?~JO{eE+A2KSSD)s8v&CiV$kV$A=DG@i
z;6JY7z*8oPdj@bbJQoTAENW#ls(ucbGA#yhN>zbWqBTbLl>rGqOAY+`
z=psSt8VQE=9+X8^$l@oeDzRvja79ry3nvLcOR7+)bIFyJVoz4}URM-47_u>V
zY*^e(o`?|l++*Y0uQ#&dKapW1o?J{jx+*_gKV^cW+W87KI7hZ5viXv$$=1IR^Z~yA
XWBrHU7iSEP8X8hQyAJO{V6g1pwSv80

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/white/images/nextwhite.png b/wp/wp-content/plugins/neuf-lightbox/css/white/images/nextwhite.png
deleted file mode 100644
index 0467ef7d46b72f4161942faa60b9cc8f0eb1f5ae..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1030
zcmV+h1o``kP)OHkDGAHV%kc5>f!S<^
zmzNh_US8x`!NI{OE-r?jpPx4536h_in?p=Y4BFb-WP=K+#l=M&92^Mw+uK`AOibYV
z`Wj(jVKPoUJv|{UEe&yTaadnp$L#DZdU|@0kdPoj8XO#yb=uq8adviwnVA^`1qI>p
z@evOX4+sefk#(Y@qft~;q%C*(l^z!MCL
zX0}%pj*N^H+pn&!VqswcWo2bTR=L!38L05^aF1(Qtyb7loV9UVnVN{SFs2Y>;|%*>RWr*cZwSLZ72
z&ZTel%mL#VA0IV
z%91o9(jxcv_P(F(xml(7D9FjlK}ksoCMPF9jnM_WySv!h+H&7xzBe{DN*7=)sHv$z
za&odeSp44I-HpD!K6G|=y8F7P=W6~Mi-#8$Ic`d=GVfhoT}jcR&ACw?aFp~=2aj%H
z5U4)WLA?&a-?3hBj6I%ULA<}em$mr};~k!swx?P(RCwC#
zSz9P(EaDx^z
zub2@UHXXbUUI(v(*TL)H|8p~a#wL%Ck62t>#QFI-3VQH5{
z!;;9z$iUs*on)PJ3?R!ODk=)`@$vS-y_1uZC1|f-N^o;?Bk$yOc6L_QF!QR^ykgJK
z&yqc7XJ?F#j^gz66lrN`@bK^u8gqVSWkuF7^TWf#@b&c-#*i)4hxPS!$uLWa&v<%z
zB0D=<0!e^FLqk|vT0(kyIyN^qv9Pd!+S*zN9r)+qnYpd4EmT)mi_>HQoh>UXldRJ@
zGN7xgORmf~L042%h$d`oYzX+()m0Hj28x3$U@de1yu3Wo7E+zyCnhEk6ci+7qng?)
z3Qk9CHk$zT_xBga-Q3*ltRUqnfIB-oXm4*vad9zna&qi@kj4cC1yb{5f)YdyrS_AO
zlCZqIEJDW;uv)DM3=C8kJRPOd=jP_VIZqJL(a}gvO~usI6goRQrFBswXavjvvP-;W
zrKP1JsvR92vYx>sD^x$^F#D|4_X0%9)7iqpLL3|%pu4-qW>y)j@3XTr`yL4i
z2~s9h{m{@*VS=iM92#2_>-fF10D+VKG>RAnkFAh38xj&CK^YtzM1Oz3LqO~6>qR?g
z6h10HgF?zvPyV_?ea6pNbWjl~irBA|m+kE0;zB5`ocfNBkEIn-AN>6ML<@dC;n7$M
z1g#kN+27xn*2hkwDtOJF?V0iG>+9drk3#nmihfD(q#voPw4=99e-x>&2L8je=i`5}
x#a9Ea`I^^%$`6pHRCwC7
zm9a}gK^(`=htSfR(2yWR=uo!2$&dyIhaB82s5bF`aQ1%?Hw(UFTezhzz}@cg2R?~
z5s(3=VAs;WN77&h9zYk&gT#j*4_vSWJ@5?1ln8$80331LIoJm+@M057=_N>j0r0Zf
z?2~22@8lk7OyQa32e!ejk~`Y+^OQbCidpi(N8#xlnHK3)mBdJd12+>pMpd?~#GZHu(czOs>)
zK3z$N=Tva_^(JT90cVE1&37HkYLp`$=HVASQfA9(A|+SSoMpUn#KPK*n)&2Xmx}KGpDwk>rFWp4hxFlH4T#HNRV7PCJw8V;N3URscoZldEJOnj*-LC
zCzI~-?yFV-H$EGcV_!wRV602mFvNO%!74RiotSR2QEVnbwWhI
oO$nHqS?K-=JNZ+yGvz=Iegxp{+qWGZ9j{-%9vvN>n3$NJp6==CAqYaF(LfM1Z{EEA{{Gt9
z+Ba|B7z_sR+xabl|E~mm-*OXmhLq??y)HONjX>1ze1D?RIn=G1`RR-%fb}zgSh6^a
z(}Zw20U1L^Cs9UcyJfc+al#}J2xVlYUoR{`gd&QDxAb1w4>I~5gc?ccq(G+T!I;H};U_uyHR0@hr>Qk1P1=6fvUBhR
zb|&^^cEQtu&W}=-=YR7o5UI)AD*~%J7bkVd5`xrdw{bHm;|Bf^_|FG$9l}`ruhnVF
zO%=6X*I#yro*pmfB;-A0cVjz73Qy)`oa=df_3Bx6!M3TNALf9BwI*di`jhdovR(I=
zFT31zui1Xw??+Ym-lWNq=V6~8tt012$@*hy3So0QNJ#eIJ4Yh{qJ+aTY>ng8W1p4BrwB_>i7AY-xmGrA}hAeq`aX(yx~=c&|=$w&*&PpKd;G@@0oXK@D0x=;tyY&Eb|HKPsM
z71v`PO)na3pfO*xUD8Z|CQju)c+RSAH=5V^4vb9Q2JwHwt|-INt|!nD?AlRxF5ZT8
zaA9~hGb$~rMhQh_0+31$tkzyLi>X3c7>F!|Jyn`+5{LG=E`sIQbHA8!=`uday6D6Y
zNtVL?j^`6A%UuwO!`}j#s~H?w=P<5}Z2)*PPx|5q$MM+1K6_d_cie9JVArbrB2sRy
zOl**1Mc+|zLM>munG#O|##RApuODr^1+pL-?SHX+D6Dz_@%-Oo(fM&hHYZ-jWU5jf
z&nBYG;>F6&Y`veoLdZ@0WyrDsuXOP)9g*C`A(+R`Ryc2+9w_DJNaf@Dzg?~N{uI_}
zjV(!yygvrGv#KF*Mt{6H^v1Ve=hQyF2^E~bd#&iZg;(%dS^nM;oGSF1Y^&rY}Ian
zFrp%SBGPyN{Z?t%Mo#!qgLQ2)k{>KAv?=zezKN*qPRf>^4QjcWgyxiC}7Vb6vGrBLR(1J&B%*gb{`!Jljb^2%jB$
zFBNUHANC6Q?0~M}cVtgk_;_DAB-BE?2dP
z(C9OIXza3Ao-@UyqX%`5cjg#cHl!uHq;&?~JO{eE+A2KSSD)s8v&CiV$kV$A=DG@i
z;6JY7z*8oPdj@bbJQoTAENW#ls(ucbGA#yhN>zbWqBTbLl>rGqOAY+`
z=psSt8VQE=9+X8^$l@oeDzRvja79ry3nvLcOR7+)bIFyJVoz4}URM-47_u>V
zY*^e(o`?|l++*Y0uQ#&dKapW1o?J{jx+*_gKV^cW+W87KI7hZ5viXv$$=1IR^Z~yA
XWBrHU7iSEP8X8hQyAJO{V6g1pwSv80

diff --git a/wp/wp-content/plugins/neuf-lightbox/css/yellow/images/nextyellow.png b/wp/wp-content/plugins/neuf-lightbox/css/yellow/images/nextyellow.png
deleted file mode 100644
index e0d5aeb87442925ccdb851cf5769fd488dd80818..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1082
zcmV-A1jYM_P)Wifq3}VzGJRk{167azoO$;G{geU)mf5JE8D}e_ST+sMH0*WlbrD|DaDVqYZVxdSk
z#&hqqO>0evF;=8=lAE@fGiUC1zVDoSIznx237Flvb6Y}|nV7A>nF$`x-K+$jU|s>Q
zfLFjP;1%!+cm@1{H1+Q|@9sw7^Nk@G^dTq53X8>=a_!5P_lQKk!)B{OI2_==qtVb$
zQ6v-;oFKn#`2AiO47QXwJ3BtQ?*nwY0{#s4JW*6b5JXxkdQOQ`O?R8^gBS@Rfp(MzIWH1;-Q?z;B;Cj{soF9@C4=N
zTDh-AW8msxz?o_?Uh{Ed?Aqf(+b0|A;wIB^G&Yu@v(rsYZI}|G
z;&P1}Yf_b!g(T%mF~+2{T3uZo!N9;Ls_nDr@1LXuJ;%9oP1F~R`}v%gI8d9d8V-jU
z&z^lChQIOzB-cD+m8pc)J*!u?L{awH++3uxdBvMzNl7j0>MHQ!#R{DOum6uBht+OP
z%>~}sS5^Wk-JT_4X=#h3|2nZ&S4Xk6wam+8a`Gilki+5P{_NbYsX2n~Za2*U^ZQTs
zbQJRqC!5*qKtsbkKZ@e#c^v%c=o*)G+(Mx!+S^^k`U1@XOVljSQ288P?G$ml-U2|HC8CJ$?I36$xFyrmUx7&`S}#aWX>kOaCqyN-I+Bt*7O+r
zI-NNsPW&12wE{lfF^fcY_*AIX=BN29@9_S%>{*BR`{(v33t1KMvG>4$XLZMB_Pu=m
zWZurCDX*>-@CtYZeD;99b?df})y!vW0)7ZE0HN`s0zXLM*Wcxh#Y$
z^~iiVRMc^p;7#x*coVz{-UR=dhjl*|(e(n7$yd;{44<21uA#w&mX^b?SQ_PXGWi<$
z{Kn1`hRioLwbN*onL;5YYZyl9z4dvWY<2~ul8!@%zJa1ByWXA0#>R|1*V=mW(}ORS
zG|bLE!PwX$ZO&eq@9J{l)T!@j^PSk-oW-qMf5Yu=kb4%3N(oXCi}fHF{7w>c`}Qa$
zL8o~Of!RKI+H5M$o%;bRE6;KF?i?;&biw5cRo;bMXaw+;p){f_oNflsC8u(XsxdwZm|HP4Kxs*SErbaV`e3KEG-r5vnQ
zMdZ%I>HGpGPJ}248nK;}1nRm$iSfxjm+MGnu*}`=uOzuopT;Q(8F?RHU%p&GUtb$M
zp6=R$*R&Fiv}`JocqG6B0f(@6rvc{7<@0
z$XH$dOKP1xBpMB1VIf6qzuuAj8$5iNKyPog4}4PDZ`ZJb>FKv5!RxeHLsSrp1qpl~
zsll?d*&-f1c#N&BA{m&5uAhmI#Pf43XL7;cx`1BpnW)B=GB)nfXoB!Kx@LtEM&2hQ&R9
zFLf}ZyxB-3f_Quji;Lrxj=^m$onDi+xO=ct-Z}r5lmIX8-J3@!IK1941_q{av|C!ov0
zrIO37NeS6(&9wzzw`Y51OV@LiGyTVc+u8q-=z#>E&##LN6~(gW@t51)XUDwP+w;M1
zV(+z;1IGHkfM;{ti*@tI3=_Nw-UNRTg8x&i)+=zn{v*Hu>TA8DE=`gN00000NkvXX
Hu0mjfe>^jT

diff --git a/wp/wp-content/plugins/neuf-lightbox/js/gallery-colorbox.js b/wp/wp-content/plugins/neuf-lightbox/js/gallery-colorbox.js
deleted file mode 100644
index a1105cda..00000000
--- a/wp/wp-content/plugins/neuf-lightbox/js/gallery-colorbox.js
+++ /dev/null
@@ -1,8 +0,0 @@
-$(document).ready(function() {
-	$('.gallery-icon a').colorbox({
-		rel:'follow',
-		maxWidth:'90%',
-		maxHeight:'90%',
-		current:'Bilde {current} av {total}'
-	});
-});
diff --git a/wp/wp-content/plugins/neuf-lightbox/js/jquery.colorbox-min.js b/wp/wp-content/plugins/neuf-lightbox/js/jquery.colorbox-min.js
deleted file mode 100644
index aa475468..00000000
--- a/wp/wp-content/plugins/neuf-lightbox/js/jquery.colorbox-min.js
+++ /dev/null
@@ -1,4 +0,0 @@
-// ColorBox v1.3.19 - jQuery lightbox plugin
-// (c) 2011 Jack Moore - jacklmoore.com
-// License: http://www.opensource.org/licenses/mit-license.php
-(function(a,b,c){function Z(c,d,e){var g=b.createElement(c);return d&&(g.id=f+d),e&&(g.style.cssText=e),a(g)}function $(a){var b=y.length,c=(Q+a)%b;return c<0?b+c:c}function _(a,b){return Math.round((/%/.test(a)?(b==="x"?z.width():z.height())/100:1)*parseInt(a,10))}function ba(a){return K.photo||/\.(gif|png|jpe?g|bmp|ico)((#|\?).*)?$/i.test(a)}function bb(){var b;K=a.extend({},a.data(P,e));for(b in K)a.isFunction(K[b])&&b.slice(0,2)!=="on"&&(K[b]=K[b].call(P));K.rel=K.rel||P.rel||"nofollow",K.href=K.href||a(P).attr("href"),K.title=K.title||P.title,typeof K.href=="string"&&(K.href=a.trim(K.href))}function bc(b,c){a.event.trigger(b),c&&c.call(P)}function bd(){var a,b=f+"Slideshow_",c="click."+f,d,e,g;K.slideshow&&y[1]?(d=function(){F.text(K.slideshowStop).unbind(c).bind(j,function(){if(K.loop||y[Q+1])a=setTimeout(W.next,K.slideshowSpeed)}).bind(i,function(){clearTimeout(a)}).one(c+" "+k,e),r.removeClass(b+"off").addClass(b+"on"),a=setTimeout(W.next,K.slideshowSpeed)},e=function(){clearTimeout(a),F.text(K.slideshowStart).unbind([j,i,k,c].join(" ")).one(c,function(){W.next(),d()}),r.removeClass(b+"on").addClass(b+"off")},K.slideshowAuto?d():e()):r.removeClass(b+"off "+b+"on")}function be(b){U||(P=b,bb(),y=a(P),Q=0,K.rel!=="nofollow"&&(y=a("."+g).filter(function(){var b=a.data(this,e).rel||this.rel;return b===K.rel}),Q=y.index(P),Q===-1&&(y=y.add(P),Q=y.length-1)),S||(S=T=!0,r.show(),K.returnFocus&&a(P).blur().one(l,function(){a(this).focus()}),q.css({opacity:+K.opacity,cursor:K.overlayClose?"pointer":"auto"}).show(),K.w=_(K.initialWidth,"x"),K.h=_(K.initialHeight,"y"),W.position(),o&&z.bind("resize."+p+" scroll."+p,function(){q.css({width:z.width(),height:z.height(),top:z.scrollTop(),left:z.scrollLeft()})}).trigger("resize."+p),bc(h,K.onOpen),J.add(D).hide(),I.html(K.close).show()),W.load(!0))}function bf(){!r&&b.body&&(Y=!1,z=a(c),r=Z(X).attr({id:e,"class":n?f+(o?"IE6":"IE"):""}),q=Z(X,"Overlay",o?"position:absolute":"").hide(),s=Z(X,"Wrapper"),t=Z(X,"Content").append(A=Z(X,"LoadedContent","width:0; height:0; overflow:hidden"),C=Z(X,"LoadingOverlay").add(Z(X,"LoadingGraphic")),D=Z(X,"Title"),E=Z(X,"Current"),G=Z(X,"Next"),H=Z(X,"Previous"),F=Z(X,"Slideshow").bind(h,bd),I=Z(X,"Close")),s.append(Z(X).append(Z(X,"TopLeft"),u=Z(X,"TopCenter"),Z(X,"TopRight")),Z(X,!1,"clear:left").append(v=Z(X,"MiddleLeft"),t,w=Z(X,"MiddleRight")),Z(X,!1,"clear:left").append(Z(X,"BottomLeft"),x=Z(X,"BottomCenter"),Z(X,"BottomRight"))).find("div div").css({"float":"left"}),B=Z(X,!1,"position:absolute; width:9999px; visibility:hidden; display:none"),J=G.add(H).add(E).add(F),a(b.body).append(q,r.append(s,B)))}function bg(){return r?(Y||(Y=!0,L=u.height()+x.height()+t.outerHeight(!0)-t.height(),M=v.width()+w.width()+t.outerWidth(!0)-t.width(),N=A.outerHeight(!0),O=A.outerWidth(!0),r.css({"padding-bottom":L,"padding-right":M}).hide(),G.click(function(){W.next()}),H.click(function(){W.prev()}),I.click(function(){W.close()}),q.click(function(){K.overlayClose&&W.close()}),a(b).bind("keydown."+f,function(a){var b=a.keyCode;S&&K.escKey&&b===27&&(a.preventDefault(),W.close()),S&&K.arrowKey&&y[1]&&(b===37?(a.preventDefault(),H.click()):b===39&&(a.preventDefault(),G.click()))}),a("."+g,b).live("click",function(a){a.which>1||a.shiftKey||a.altKey||a.metaKey||(a.preventDefault(),be(this))})),!0):!1}var d={transition:"elastic",speed:300,width:!1,initialWidth:"600",innerWidth:!1,maxWidth:!1,height:!1,initialHeight:"450",innerHeight:!1,maxHeight:!1,scalePhotos:!0,scrolling:!0,inline:!1,html:!1,iframe:!1,fastIframe:!0,photo:!1,href:!1,title:!1,rel:!1,opacity:.9,preloading:!0,current:"image {current} of {total}",previous:"previous",next:"next",close:"close",open:!1,returnFocus:!0,reposition:!0,loop:!0,slideshow:!1,slideshowAuto:!0,slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",onOpen:!1,onLoad:!1,onComplete:!1,onCleanup:!1,onClosed:!1,overlayClose:!0,escKey:!0,arrowKey:!0,top:!1,bottom:!1,left:!1,right:!1,fixed:!1,data:undefined},e="colorbox",f="cbox",g=f+"Element",h=f+"_open",i=f+"_load",j=f+"_complete",k=f+"_cleanup",l=f+"_closed",m=f+"_purge",n=!a.support.opacity&&!a.support.style,o=n&&!c.XMLHttpRequest,p=f+"_IE6",q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X="div",Y;if(a.colorbox)return;a(bf),W=a.fn[e]=a[e]=function(b,c){var f=this;b=b||{},bf();if(bg()){if(!f[0]){if(f.selector)return f;f=a(""),b.open=!0}c&&(b.onComplete=c),f.each(function(){a.data(this,e,a.extend({},a.data(this,e)||d,b))}).addClass(g),(a.isFunction(b.open)&&b.open.call(f)||b.open)&&be(f[0])}return f},W.position=function(a,b){function i(a){u[0].style.width=x[0].style.width=t[0].style.width=a.style.width,t[0].style.height=v[0].style.height=w[0].style.height=a.style.height}var c=0,d=0,e=r.offset(),g=z.scrollTop(),h=z.scrollLeft();z.unbind("resize."+f),r.css({top:-9e4,left:-9e4}),K.fixed&&!o?(e.top-=g,e.left-=h,r.css({position:"fixed"})):(c=g,d=h,r.css({position:"absolute"})),K.right!==!1?d+=Math.max(z.width()-K.w-O-M-_(K.right,"x"),0):K.left!==!1?d+=_(K.left,"x"):d+=Math.round(Math.max(z.width()-K.w-O-M,0)/2),K.bottom!==!1?c+=Math.max(z.height()-K.h-N-L-_(K.bottom,"y"),0):K.top!==!1?c+=_(K.top,"y"):c+=Math.round(Math.max(z.height()-K.h-N-L,0)/2),r.css({top:e.top,left:e.left}),a=r.width()===K.w+O&&r.height()===K.h+N?0:a||0,s[0].style.width=s[0].style.height="9999px",r.dequeue().animate({width:K.w+O,height:K.h+N,top:c,left:d},{duration:a,complete:function(){i(this),T=!1,s[0].style.width=K.w+O+M+"px",s[0].style.height=K.h+N+L+"px",K.reposition&&setTimeout(function(){z.bind("resize."+f,W.position)},1),b&&b()},step:function(){i(this)}})},W.resize=function(a){S&&(a=a||{},a.width&&(K.w=_(a.width,"x")-O-M),a.innerWidth&&(K.w=_(a.innerWidth,"x")),A.css({width:K.w}),a.height&&(K.h=_(a.height,"y")-N-L),a.innerHeight&&(K.h=_(a.innerHeight,"y")),!a.innerHeight&&!a.height&&(A.css({height:"auto"}),K.h=A.height()),A.css({height:K.h}),W.position(K.transition==="none"?0:K.speed))},W.prep=function(b){function g(){return K.w=K.w||A.width(),K.w=K.mw&&K.mw1){typeof K.current=="string"&&E.html(K.current.replace("{current}",Q+1).replace("{total}",g)).show(),G[K.loop||QK.mw&&(a=(R.width-K.mw)/R.width,d()),K.mh&&R.height>K.mh&&(a=(R.height-K.mh)/R.height,d())),K.h&&(R.style.marginTop=Math.max(K.h-R.height,0)/2+"px"),y[1]&&(K.loop||y[Q+1])&&(R.style.cursor="pointer",R.onclick=function(){W.next()}),n&&(R.style.msInterpolationMode="bicubic"),setTimeout(function(){e(R)},1)}),setTimeout(function(){R.src=c},1)):c&&B.load(c,K.data,function(b,c,d){e(c==="error"?Z(X,"Error").text("Request unsuccessful: "+d.statusText):a(this).contents())})},W.next=function(){!T&&y[1]&&(K.loop||y[Q+1])&&(Q=$(1),W.load())},W.prev=function(){!T&&y[1]&&(K.loop||Q)&&(Q=$(-1),W.load())},W.close=function(){S&&!U&&(U=!0,S=!1,bc(k,K.onCleanup),z.unbind("."+f+" ."+p),q.fadeTo(200,0),r.stop().fadeTo(300,0,function(){r.add(q).css({opacity:1,cursor:"auto"}).hide(),bc(m),A.remove(),setTimeout(function(){U=!1,bc(l,K.onClosed)},1)}))},W.remove=function(){a([]).add(r).add(q).remove(),r=null,a("."+g).removeData(e).removeClass(g).die()},W.element=function(){return a(P)},W.settings=d})(jQuery,document,this);
\ No newline at end of file
diff --git a/wp/wp-content/plugins/neuf-lightbox/neuf-lightbox.php b/wp/wp-content/plugins/neuf-lightbox/neuf-lightbox.php
deleted file mode 100644
index ca62d520..00000000
--- a/wp/wp-content/plugins/neuf-lightbox/neuf-lightbox.php
+++ /dev/null
@@ -1,141 +0,0 @@
- 'ASC',
-		'orderby'    => 'menu_order ID',
-		'id'         => $post->ID,
-		'itemtag'    => 'div',
-		'icontag'    => 'div',
-		'captiontag' => 'p',
-		'columns'    => 3,
-		'size'       => 'thumbnail',
-		'include'    => '',
-		'exclude'    => ''
-	), $attr));
-
-	$id = intval($id);
-	if ( 'RAND' == $order )
-		$orderby = 'none';
-
-	if ( !empty($include) ) {
-		$include = preg_replace( '/[^0-9,]+/', '', $include );
-		$_attachments = get_posts( array('include' => $include, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
-
-		$attachments = array();
-		foreach ( $_attachments as $key => $val ) {
-			$attachments[$val->ID] = $_attachments[$key];
-		}
-	} elseif ( !empty($exclude) ) {
-		$exclude = preg_replace( '/[^0-9,]+/', '', $exclude );
-		$attachments = get_children( array('post_parent' => $id, 'exclude' => $exclude, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
-	} else {
-		$attachments = get_children( array('post_parent' => $id, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => $order, 'orderby' => $orderby) );
-	}
-
-	if ( empty($attachments) )
-		return '';
-
-	if ( is_feed() ) {
-		$output = "\n";
-		foreach ( $attachments as $att_id => $attachment )
-			$output .= wp_get_attachment_link($att_id, $size, true) . "\n";
-		return $output;
-	}
-
-	$itemtag = tag_escape($itemtag);
-	$captiontag = tag_escape($captiontag);
-	$columns = intval($columns);
-	$float = is_rtl() ? 'right' : 'left';
-
-	$selector = "gallery-{$instance}";
-
-	$gallery_style = $gallery_div = '';
-	if ( apply_filters( 'use_default_gallery_style', true ) )
-		$gallery_style = "
-		
-		";
-	$size_class = sanitize_html_class( $size );
-	$gallery_div = is_single() ? "
-
-post_type || 'image/' != substr( $image->post_mime_type, 0, 6 ) )
-			die( json_encode( array( 'error' => sprintf( __( 'Failed resize: %s is an invalid image ID.', 'regenerate-thumbnails' ), esc_html( $_REQUEST['id'] ) ) ) ) );
-
-		if ( ! current_user_can( $this->capability ) )
-			$this->die_json_error_msg( $image->ID, __( "Your user account doesn't have permission to resize images", 'regenerate-thumbnails' ) );
-
-		$fullsizepath = get_attached_file( $image->ID );
-
-		if ( false === $fullsizepath || ! file_exists( $fullsizepath ) )
-			$this->die_json_error_msg( $image->ID, sprintf( __( 'The originally uploaded image file cannot be found at %s', 'regenerate-thumbnails' ), '' . esc_html( $fullsizepath ) . '' ) );
-
-		@set_time_limit( 900 ); // 5 minutes per image should be PLENTY
-
-		$metadata = wp_generate_attachment_metadata( $image->ID, $fullsizepath );
-
-		if ( is_wp_error( $metadata ) )
-			$this->die_json_error_msg( $image->ID, $metadata->get_error_message() );
-		if ( empty( $metadata ) )
-			$this->die_json_error_msg( $image->ID, __( 'Unknown failure reason.', 'regenerate-thumbnails' ) );
-
-		// If this fails, then it just means that nothing was changed (old value == new value)
-		wp_update_attachment_metadata( $image->ID, $metadata );
-
-		die( json_encode( array( 'success' => sprintf( __( '"%1$s" (ID %2$s) was successfully resized in %3$s seconds.', 'regenerate-thumbnails' ), esc_html( get_the_title( $image->ID ) ), $image->ID, timer_stop() ) ) ) );
-	}
-
-
-	// Helper to make a JSON error message
-	public function die_json_error_msg( $id, $message ) {
-		die( json_encode( array( 'error' => sprintf( __( '"%1$s" (ID %2$s) failed to resize. The error message was: %3$s', 'regenerate-thumbnails' ), esc_html( get_the_title( $id ) ), $id, $message ) ) ) );
-	}
-
-
-	// Helper function to escape quotes in strings for use in Javascript
-	public function esc_quotes( $string ) {
-		return str_replace( '"', '\"', $string );
-	}
-}
-
-// Start up this plugin
-add_action( 'init', 'RegenerateThumbnails' );
-function RegenerateThumbnails() {
-	global $RegenerateThumbnails;
-	$RegenerateThumbnails = new RegenerateThumbnails();
-}
-
-?>
\ No newline at end of file
diff --git a/wp/wp-content/plugins/regenerate-thumbnails/screenshot-1.png b/wp/wp-content/plugins/regenerate-thumbnails/screenshot-1.png
deleted file mode 100644
index 7a8a04be0e94adc8ade379a7d231ed0e367d43b3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 83994
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
    AI__h_1bUEmsBpQ@p07R{&l-35TYELCQg~ry*4O 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
  1. U~{YWt-=lSeveO zR2)uwBPAj!aO7Q%`jB?T(nFIr>ZpVZjTjz&VLJ3gi zU_-eAi&ZAUs{mSeEm^28?FPQ}u9GSOS4$W2TgO=2L#^~=9qoK_%lL*m_u>=kSvjFs z+P1I~HD$0y*x7L$JzAD?7i}lBIYOEwf!+qJz03h71_pi4%a4zb{jrqtruq4K*_HWq zYS_V%5wV1kf|hotQ)NnE%@F5zoN zs8p&vKR-IWvAp(`ntbGyr4y|;+jxi`B2^i3(?CEdErnh`jyRhW29l9#Zg-1^haq?AXhsx>eE+Rp$2;RpA z^{9}Mk+oRnjrsBEy1J&)PAhS*FfHG<8x6~oXQVKEsHe}p+q2CK{G)tAl=jSY)Fg&} zIthlu)}+PI2_?*sua}=4Ii-^FHW8!Mb0#u^a_-i0IX%slQ_|tC5 zi8R@B?Edv{`3t>HXh4HlYKkBTn+_25DALa?0CRC>7Q(`yv%ncT$wiA#Otg}kcC-P@ ztJ@u~%jqi@l;t!})9+rKBcu0hi^ihJWxqEX#uVg!51Fqh)FfZXin{X}g@=n0Qa4pG z726yQY-J<9EQK*k*l@-1aMCaDx-@kZ41MGf^9#ubJQBFTdw)T}_*+<0M971uQmabM z1Bik2<#oO4&g=dxv=66+l|vgTil^Z!JC@u%ccOL=E6aQt%GW^^t*7?+O`7$ssRrrElc-0dSg3AVzFk=pVF3Mw!#c^q4Rcn9Wn@>{v?}>fM`+u>}Xg0@6T%rD-rSUr}C3m_51Cu`MP1>!N!&!G)Z)gxa%ygw%pXzx`{ch+8HvT&x`B4AhXYf4ni5nsiomB%j*03aqj$+n;cQ*u+oeE~G+`78_ zB$-wGprjj%3Qw%*4tuE)*x@FtPok|`8>Vlp*oH2Tc+r`ogVwEQB^FhaI=vy2IJcYC zbYpZiJa50nKghL%nKu+_qhndy_G#q(!>VBa_Sv}kpIbY$fRIm5Je9QgYXED^f^IxuKB}<|iNB2D@C!D(72pL1;rKc8rcsF#EvYzCwg$ zY+&i|dUdw6j3i~?;28DUVuW(ol%qzMke5gPWX_m~z@U>Jc7m@nqaUb{y*0F#Q2lE* z?Cbgym=3700&dJ0``472uRW)ZqVbsao)ihB9x-7g@a1p+{1LT`QL105_>4lOZ~Kmi z7sGS;PnDZKAWLWUr!oQy8$YVx(2r~kH1Y|sL*>EmTDB|ey=*Tp$9;Jz1WLCEr diff --git a/wp/wp-content/plugins/regenerate-thumbnails/screenshot-2.png b/wp/wp-content/plugins/regenerate-thumbnails/screenshot-2.png deleted file mode 100644 index a9047247d31fd2e3ab5ed3af1982b4d6093eeea2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26775 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 diff --git a/wp/wp-content/plugins/regenerate-thumbnails/screenshot-3.png b/wp/wp-content/plugins/regenerate-thumbnails/screenshot-3.png deleted file mode 100644 index 037e4949e5463291549023bb966f4b645c5ed708..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50192 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 ORn*B%u*Wk|4g3!*Rv{Mv diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-bg_flat_0_aaaaaa_40x100.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100644 index 6f671f5f055db8e94002ab500b4a1de5aeb7232f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F1SA+{?>A)!QcOwS?k)_>#w|r1Kptm-M`SUO z_5fqIli7AahM1>|V~EA+ zRdP`(kYX@0Ff`FMFw`|P4>7Q`GBvU?GSfA%ure_4_WIC_q9HdwB{QuOw+1V54||{n N22WQ%mvv4FO#p!RGJF64 diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-bg_flat_75_ffffff_40x100.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-bg_flat_75_ffffff_40x100.png deleted file mode 100644 index 43eaad26163ae0fc8af6c1c95b5c491743448666..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F2qYNp$opRhQcOwS?k)_Bce{j_0C}7R9+AaB z+5?Q;PG;Ky8A6^ejv*T7lYj6t@hpC#;TbB#aBAWwna#KLs)4eqC9V-ADTyViR>?)F zK#IZ0z|ch3z);uFJjB4#%GAip#8}tB!pgwlzU;NdC>nC}Q!>*kacfxTkS7n+z~JfX K=d#Wzp$P!_AvA6P diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-bg_glass_55_fbf9ee_1x400.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-bg_glass_55_fbf9ee_1x400.png deleted file mode 100644 index b98b72da3181c7b49e4f56238319c1afc6470d27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12TF&T^vI^j=w#x$i?I+((tf;UXnmgbH|3oY>pC!)f}(GR!16S-u+#{ ze6YEqRkW=8vGl=5qArKM<9}TC-}iEvB{zdaTcX5$wyRTK&ALjHSx-ff^V*UHx3vIVCg!0505gO#lD@ diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-bg_glass_65_ffffff_1x400.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-bg_glass_65_ffffff_1x400.png deleted file mode 100644 index 4be07cc4e99263d8a6f0e4bfc587cfdb8b4c77c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI2NH8$CE1Q=ADW)WEcNYf6yIsOdfIQ9ukH}&m z?E%JaC$sH<3_(v9#}JM4$r%X}t&0mp9yKsb%{ak$*<@oTP*SzTHKHUXu_VKdAd7+6}F8d(_`=^9vA85rzmy)pqsLvDUbW?Cg~4d)_qbbuNdJYD@< J);T3K0RRRsGa3K@ diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-bg_glass_75_dadada_1x400.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-bg_glass_75_dadada_1x400.png deleted file mode 100644 index 6eb483509c12fc7b93522827e3225b408161eeca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!T=8puqDZgOs>RXUCGx5b?-VBQkUm|IuXOmYJrBRJgj{Vx zMbNnqUkncy+qa2-mWYc>swkcIuvGK#>(0d)B7)5f`@$Ei28nH~0h*~=;u=wsl30>z zm0Xkxq!^403{7+m40R37LkujfOpUCJjdTqxtPBi_*I(g7(U6;;l9^VCTLaUloJ~Lt N44$rjF6*2UngChePLlut diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-bg_glass_75_e6e6e6_1x400.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-bg_glass_75_e6e6e6_1x400.png deleted file mode 100644 index 7dcbd6b035ed73faacf5cf81568accddb80d5952..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!TrvH)L6@80)r*_cdCvDr%)6ghVL16=s@mbz7H!uRdGeDa z?kzLg)16i!f8fKx84s0>4nc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12VciT^vI^j=w#>k(V)1qW$CZ|6)SVV-&*#dav<$DMuV&n0Dbpw@aKdAd7+6}F8d({c=^9vA85nqb geP~9}kei>9nO2EggO#|4Jx~LKr>mdKI;Vst0H%_1SO5S3 diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png deleted file mode 100644 index 4dadbc48bbba97f45d31c46910102ab69d612cec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^j6j?s03;ZUuHXC*q?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z$cXZEaSV~ToLo`U+vu0Ue0cG9p8hWqa?gxxGLm=1A1u)Cewe3oSeCaf zI$k30UHXoTXA5lSJe(zTcE%W-S*bfB&J`pw9sa4-R?IGW?p~6`>jMSP&M+u3 zY@9al)zrvpHlQu4C9V-ADTyViR>?)FK#IZ0z|ch3z);uFJjB4#%GAip#8lV7!pgv4 i&)LT_Q8eV{r(~v8;?{6>LbNJS1B0ilpUXO@geCxQSzAs3 diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_222222_256x240.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_222222_256x240.png deleted file mode 100644 index c1cb1170c8b3795835b8831ab81fa9ae63b606b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6922 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 QJ~;stWz}Trq%1=J3#jBGg8%>k diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_2e83ff_256x240.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_2e83ff_256x240.png deleted file mode 100644 index 84b601bf0f726bf95801da487deaf2344a32e4b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4549 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 F{{S81aohj^ diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_454545_256x240.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_454545_256x240.png deleted file mode 100644 index b6db1acdd433be80a472b045018f25c7f2cf7e08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6992 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 diff --git a/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_cd0a0a_256x240.png b/wp/wp-content/plugins/user-role-editor/css/images/ui-icons_cd0a0a_256x240.png deleted file mode 100644 index ed5b6b0930f672fa08e9b9bdbe5e55370fd1dc30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4549 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 DTfr$v diff --git a/wp/wp-content/plugins/user-role-editor/css/index.php b/wp/wp-content/plugins/user-role-editor/css/index.php deleted file mode 100644 index 62200328..00000000 --- a/wp/wp-content/plugins/user-role-editor/css/index.php +++ /dev/null @@ -1,2 +0,0 @@ - - */ - -.ms-parent { - display: inline-block; - position: relative; - vertical-align: middle; -} - -.ms-choice { - display: block; - height: 26px; - padding: 0; - overflow: hidden; - position: relative; - cursor: pointer; - border: 1px solid #aaa; - white-space: nowrap; - line-height: 26px; - color: #444; - text-decoration: none; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - background-color: #fff; -} - -.ms-choice.disabled { - background-color: #f4f4f4; - background-image: none; - border: 1px solid #ddd; - cursor: default; -} - -.ms-choice > span { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - display: block; - float: left; - padding-left: 8px; -} - -.ms-choice > span.placeholder { - color: #999; -} - -.ms-choice > div { - float: right; - width: 20px; - height: 25px; - background: url('multiple-select.png') right top no-repeat; -} - -.ms-choice > div.open { - background: url('multiple-select.png') left top no-repeat; -} - -.ms-drop { - overflow: hidden; - display: none; - margin-top: -1px; - padding: 0; - position: absolute; - z-index: 1000; - top: 100%; - background: #fff; - color: #000; - border: 1px solid #aaa; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); - -moz-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); - box-shadow: 0 4px 5px rgba(0, 0, 0, .15); -} - - -.ms-search { - display: inline-block; - margin: 0; - min-height: 26px; - padding: 4px; - position: relative; - white-space: nowrap; - width: 100%; - z-index: 10000; -} - -.ms-search input { - width: 100%; - height: auto !important; - min-height: 24px; - padding: 0 20px 0 5px; - margin: 0; - outline: 0; - font-family: sans-serif; - font-size: 1em; - border: 1px solid #aaa; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - background: #fff url('multiple-select.png') no-repeat 100% -22px; - background: url('multiple-select.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee)); - background: url('multiple-select.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('multiple-select.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%); - background: url('multiple-select.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%); - background: url('multiple-select.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%, #eeeeee 99%); - background: url('multiple-select.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%, #eeeeee 99%); -} - -.ms-search, .ms-search input { - -webkit-box-sizing: border-box; - -khtml-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} - -.ms-drop ul { - overflow: auto; - margin: 0; - padding: 5px 8px; -} - -.ms-drop ul > li { - list-style: none; - display: list-item; - background-image: none; - position: static; -} - -.ms-drop ul > li .disabled { - opacity: .35; - filter: Alpha(Opacity=35); -} - -.ms-drop ul > li.multiple { - display: block; - float: left; -} - -.ms-drop ul > li.group { - clear: both; -} - -.ms-drop ul > li.multiple label { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.ms-drop ul > li label.optgroup { - font-weight: bold; -} - -.ms-drop input[type="checkbox"] { - vertical-align: middle; -} diff --git a/wp/wp-content/plugins/user-role-editor/css/multiple-select.png b/wp/wp-content/plugins/user-role-editor/css/multiple-select.png deleted file mode 100644 index 2a7ba608ea846d4873f84e00455ee2d1bbe4d13a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3342 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


    PIF0Aw%86)zsYUfW=rwtoJ#Sb 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 diff --git a/wp/wp-content/plugins/user-role-editor/images/ajax-loader.gif b/wp/wp-content/plugins/user-role-editor/images/ajax-loader.gif deleted file mode 100644 index fe62f3de9e178f75c2173acd0ed383944d46ac6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmZ?wbhEHb6krfw_{6~Q|NsBpyLZ2P_wLM@GeE|bD_8E`z5DRtL&g8xey$X^fL3(@);C=vT$+%Rp|gR&}ab$ z24-W9U3dN&obt>TPUf)UketKrHzSSHb)(^-T_Q6NZqrLRa;WfvZnT8u-DT{S5iKCaPHD{5r6mfnAxD8b&Ka9!e2 zo3rF5RTV8EYzCQe>@rf;KIM2~!kH;y`fRPqGJIbo{XTj+CC*q~AoGFi%;vo^$5v=F zMZOjP!`OV7-)Lou)cpM{*o*@DElE}Tlu_HnH*><`Tf3KWwkq8 z(ma34L4aBArH%YyHLy8Bldu{CbdJKI36|oIOP=q!HP1luxXc4ZJ*RDRPlc~pWXQwD zEmEAgdxPossf>*V8#p_6&(GEL!fFoCId}ej;1s+$Cp2~z#$b^L1+ZcIS4mk+SHf%U_?c7A%#sFh}b*j^qIhxnyI5-X~^c^qcV=**Xd1}MD e0Et7u=nA{Flu4m9Nup_9wBQ5=25V5l0RsToJKNg; diff --git a/wp/wp-content/plugins/user-role-editor/images/changelog-icon.png b/wp/wp-content/plugins/user-role-editor/images/changelog-icon.png deleted file mode 100644 index 6026d65b1c9e2c54394789c4372a7de994ace121..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 494 zcmV+K@i91*`tF9Q3(+w zU8QXQ4xg;5{S=>hh2Wfd`|jW{0RtK}D1ua(^_l zyNHi?K{@dF?(Ey0{mkx+m5~`3#zHWpS!dpj?7WS@T7@DPHtRjtyY70JPvC|qu?IQsC%;Y%>g75 z38g2kwr|s*WwTjuHXr)FU>Ja+kTn_&LogXgFt}L--~v++njo1>Dm}doCLnAd0i_@e zf#-RKU^@~07*qoM6N<$g8m8DR{#J2 diff --git a/wp/wp-content/plugins/user-role-editor/images/donate-icon.png b/wp/wp-content/plugins/user-role-editor/images/donate-icon.png deleted file mode 100644 index ae4f2e7e2bc9ac8876f67c053fb9f0537bbf027d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3190 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 \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/images/remove-16.png b/wp/wp-content/plugins/user-role-editor/images/remove-16.png deleted file mode 100644 index c9219f8d79f00cbdff112672a3c27e3adb9f751a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 483 zcmV<90UZ8`P)-0dPq~ zK~yNuZPHC@ltB>2@!!lFCm{hb7{6LjR1icErNM|^!fPl*H!k!BE&_`20G`4Nh)5Qt z!H|V}LlXscqbBIgxT(l%u%MwS>ZyA8R}G-n3QIVI77_b75g}`iVuYQDm<(#I1DwYr z%waVmHuR#_dJ^|>0}t?Sh*>0Q2 z`-1KO@=rPGMcTcc_IL4Xe~()U;9DPgu4-IL+01FPc#Q2noLO`c@uPS6{Uaac#Jz}^ Z{sE(#itTNS_6h(1002ovPDHLkV1oLT(*6Jd diff --git a/wp/wp-content/plugins/user-role-editor/images/user-role-editor-icon.png b/wp/wp-content/plugins/user-role-editor/images/user-role-editor-icon.png deleted file mode 100644 index 1b67d84338e70be9a70877f394ef7df92afde5d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 867 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 diff --git a/wp/wp-content/plugins/user-role-editor/images/vladimir.png b/wp/wp-content/plugins/user-role-editor/images/vladimir.png deleted file mode 100644 index 0ebfdf2dba84dac71ed782f28aa380c5a22881f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 767 zcmVYx-5XOK1^?L0%yK4vAu}fs9*(6{?3RJDY5`w;{L@IoMN=4$+hL+`9x=1JBe7kuB4E4Bx>X91B(=0bY3dtpUHyV{lV=#sO|ZQ1 zm}}R+#tbWb`pFfhXD_4pck`_|J$so#BniNfsgOH3PKTh+f4afL2fs3!$zUXgz>09{ z!;gF;&7+aWW8Ur%IuPCSd06bC_N#n+sZ7RxgfLVlKR8KdApF;q9%9>*(yKUoMOxax x@&0};L*rlk<$SU2{qr0DD@3RJ{~NTs@FzE07yoMf^Opbs002ovPDHLkV1gT6Wd{HN diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/advertisement.php b/wp/wp-content/plugins/user-role-editor/includes/classes/advertisement.php deleted file mode 100644 index 83b42568..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/advertisement.php +++ /dev/null @@ -1,78 +0,0 @@ -''); - - function __construct() { - - $used = array(-1); - //$index = $this->rand_unique( $used ); - $index = 0; - $this->slots[$index] = $this->admin_menu_editor(); - $used[] = $index; - - } - // end of __construct - - - /** - * Returns random number not included into input array - * - * @param array $used - array of numbers used already - * - * @return int - */ - private function rand_unique( $used = array(-1) ) { - $index = rand(0, 2); - while (in_array($index, $used)) { - $index = rand(0, 2); - } - - return $index; - } - // return rand_unique() - - - // content of Admin Menu Editor advertisement slot - private function admin_menu_editor() { - - $output = ' - - '; - - return $output; - } - // end of admin_menu_editor() - - - /** - * Output all existed ads slots - */ - public function display() { -?> -
    -slots as $slot) { - echo $slot . "\n"; - } -?> -
    - lib = $lib; - - } - // end of __construct() - - - protected function get_action() { - $action = filter_input(INPUT_POST, 'sub_action', FILTER_SANITIZE_STRING); - if (empty($action)) { - $action = filter_input(INPUT_GET, 'sub_action', FILTER_SANITIZE_STRING); - } - - $this->action = $action; - - return $action; - } - - - protected function ajax_check_permissions() { - - if (!wp_verify_nonce($_REQUEST['wp_nonce'], 'user-role-editor')) { - echo json_encode(array('result'=>'error', 'message'=>'URE: Wrong or expired request')); - die; - } - - $key_capability = URE_Own_Capabilities::get_key_capability(); - if (!current_user_can($key_capability)) { - echo json_encode(array('result'=>'error', 'message'=>'URE: Insufficient permissions')); - die; - } - - } - // end of ajax_check_permissions() - - - protected function get_caps_to_remove() { - - $html = URE_Role_View::caps_to_remove_html(); - $answer = array('result'=>'success', 'html'=>$html, 'message'=>'success'); - - return $answer; - } - // end of get_caps_to_remove() - - - protected function get_users_without_role() { - global $wp_roles; - - $new_role = filter_input(INPUT_POST, 'new_role', FILTER_SANITIZE_STRING); - if (empty($new_role)) { - $answer = array('result'=>'failure', 'message'=>'Provide new role'); - return $answer; - } - - $assign_role = $this->lib->get_assign_role(); - if ($new_role==='no_rights') { - $assign_role->create_no_rights_role(); - } - - if (!isset($wp_roles)) { - $wp_roles = new WP_Roles(); - } - if (!isset($wp_roles->roles[$new_role])) { - $answer = array('result'=>'failure', 'message'=>'Selected new role does not exist'); - return $answer; - } - - $users = $assign_role->get_users_without_role($new_role); - - $answer = array('result'=>'success', 'users'=>$users, 'new_role'=>$new_role, 'message'=>'success'); - - return $answer; - } - // end of get_users_without_role() - - - protected function grant_roles() { - - $answer = URE_Grant_Roles::process_user_request(); - - return $answer; - - } - // end of grant_roles() - - - protected function _dispatch() { - switch ($this->action) { - case 'get_caps_to_remove': - $answer = $this->get_caps_to_remove(); - break; - case 'get_users_without_role': - $answer = $this->get_users_without_role(); - break; - case 'grant_roles': - $answer = $this->grant_roles(); - break; - default: - $answer = array('result' => 'error', 'message' => 'unknown action "' . $this->action . '"'); - } - - return $answer; - } - // end of _dispatch() - - - /** - * AJAX requests dispatcher - */ - public function dispatch() { - - $this->get_action(); - $this->ajax_check_permissions(); - $answer = $this->_dispatch(); - - $json_answer = json_encode($answer); - echo $json_answer; - die; - } - -} -// end of URE_Ajax_Processor diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/assign-role.php b/wp/wp-content/plugins/user-role-editor/includes/classes/assign-role.php deleted file mode 100644 index cce21c28..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/assign-role.php +++ /dev/null @@ -1,93 +0,0 @@ -lib = $lib; - } - // end of __construct() - - - public function create_no_rights_role() { - global $wp_roles; - - $role_id = 'no_rights'; - $role_name = 'No rights'; - - if (!isset($wp_roles)) { - $wp_roles = new WP_Roles(); - } - if (isset($wp_roles->roles[$role_id])) { - return; - } - add_role($role_id, $role_name, array()); - - } - // end of create_no_rights_role() - - - private function get_where_condition() { - global $wpdb; - - $usermeta = $this->lib->get_usermeta_table_name(); - $id = get_current_blog_id(); - $blog_prefix = $wpdb->get_blog_prefix($id); - $where = "where not exists (select user_id from {$usermeta} - where user_id=users.ID and meta_key='{$blog_prefix}capabilities') or - exists (select user_id from {$usermeta} - where user_id=users.ID and meta_key='{$blog_prefix}capabilities' and meta_value='a:0:{}')"; - - return $where; - } - // end of get_where_condition() - - - public function count_users_without_role() { - - global $wpdb; - - $users_quant = get_transient('ure_users_without_role'); - if (empty($users_quant)) { - $where = $this->get_where_condition(); - $query = "select count(ID) from {$wpdb->users} users {$where}"; - $users_quant = $wpdb->get_var($query); - set_transient('ure_users_without_role', $users_quant, 15); - } - - return $users_quant; - } - // end of count_users_without_role() - - - public function get_users_without_role($new_role='') { - - global $wpdb; - - $top_limit = self::MAX_USERS_TO_PROCESS; - $where = $this->get_where_condition(); - $query = "select ID from {$wpdb->users} users - {$where} - limit 0, {$top_limit}"; - $users0 = $wpdb->get_col($query); - - return $users0; - } - // end of get_users_without_role() - -} -// end of URE_Assign_Role class \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/base-lib.php b/wp/wp-content/plugins/user-role-editor/includes/classes/base-lib.php deleted file mode 100644 index a106d24d..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/base-lib.php +++ /dev/null @@ -1,301 +0,0 @@ -multisite = function_exists('is_multisite') && is_multisite(); - if ($this->multisite) { - $this->blog_ids = $this->get_blog_ids(); - // get Id of 1st (main) blog - $this->main_blog_id = $this->get_main_site(); - } - - $this->init_options($options_id); - - } - // end of __construct() - - - public function get($property_name) { - - if (!property_exists($this, $property_name)) { - syslog(LOG_ERR, 'Lib class does not have such property '. $property_name); - } - - return $this->$property_name; - } - // end of get_property() - - - public function set($property_name, $property_value) { - - if (!property_exists($this, $property_name)) { - syslog(LOG_ERR, 'Lib class does not have such property '. $property_name); - } - - $this->$property_name = $property_value; - } - // end of get_property() - - - public function get_main_site() { - global $current_site; - - return $current_site->blog_id; - } - // end of get_main_site() - - - - /** - * Returns the array of multisite WP blogs IDs - * @global wpdb $wpdb - * @return array - */ - protected function get_blog_ids() { - global $wpdb; - - $blog_ids = $wpdb->get_col("select blog_id from $wpdb->blogs order by blog_id asc"); - - return $blog_ids; - } - // end of get_blog_ids() - - - /** - * get current options for this plugin - */ - protected function init_options($options_id) { - $this->options_id = $options_id; - $this->options = get_option($options_id); - } - // end of init_options() - - /** - * Return HTML formatted message - * - * @param string $message message text - * @param string $error_style message div CSS style - */ - public function show_message($message, $error_style = false) { - - if ($message) { - if ($error_style) { - echo '
    '; - } else { - echo '
    '; - } - echo $message . '
    '; - } - } - // end of show_message() - - /** - * Returns value by name from GET/POST/REQUEST. Minimal type checking is provided - * - * @param string $var_name Variable name to return - * @param string $request_type type of request to process get/post/request (default) - * @param string $var_type variable type to provide value checking - * @return mix variable value from request - */ - public function get_request_var($var_name, $request_type = 'request', $var_type = 'string') { - - $result = 0; - if ($request_type == 'get') { - if (isset($_GET[$var_name])) { - $result = filter_var($_GET[$var_name], FILTER_SANITIZE_STRING); - } - } else if ($request_type == 'post') { - if (isset($_POST[$var_name])) { - if ($var_type != 'checkbox') { - $result = filter_var($_POST[$var_name], FILTER_SANITIZE_STRING);; - } else { - $result = 1; - } - } - } else { - if (isset($_REQUEST[$var_name])) { - $result = filter_var($_REQUEST[$var_name], FILTER_SANITIZE_STRING); - } - } - - if ($result) { - if ($var_type == 'int' && !is_numeric($result)) { - $result = 0; - } - if ($var_type != 'int') { - $result = esc_attr($result); - } - } - - return $result; - } - // end of get_request_var() - - /** - * returns option value for option with name in $option_name - */ - public function get_option($option_name, $default = false) { - - if (isset($this->options[$option_name])) { - return $this->options[$option_name]; - } else { - return $default; - } - } - // end of get_option() - - /** - * puts option value according to $option_name option name into options array property - */ - public function put_option($option_name, $option_value, $flush_options = false) { - - $this->options[$option_name] = $option_value; - if ($flush_options) { - $this->flush_options(); - } - } - // end of put_option() - - /** - * Delete URE option with name option_name - * @param string $option_name - * @param bool $flush_options - */ - public function delete_option($option_name, $flush_options = false) { - if (array_key_exists($option_name, $this->options)) { - unset($this->options[$option_name]); - if ($flush_options) { - $this->flush_options(); - } - } - } - // end of delete_option() - - /** - * saves options array into WordPress database wp_options table - */ - public function flush_options() { - - update_option($this->options_id, $this->options); - } - // end of flush_options() - - /** - * Check product versrion and stop execution if product version is not compatible - * @param type $must_have_version - * @param type $version_to_check - * @param type $error_message - * @return type - */ - public static function check_version($must_have_version, $version_to_check, $error_message, $plugin_file_name) { - - if (version_compare($must_have_version, $version_to_check, '<')) { - if (is_admin() && (!defined('DOING_AJAX') || !DOING_AJAX )) { - require_once ABSPATH . '/wp-admin/includes/plugin.php'; - deactivate_plugins($plugin_file_name); - wp_die($error_message); - } else { - return; - } - } - } - // end of check_version() - - - public function get_current_url() { - global $wp; - $current_url = esc_url_raw(add_query_arg($wp->query_string, '', home_url($wp->request))); - - return $current_url; - } - // end of get_current_url() - - - /** - * Returns comma separated list from the first $items_count element of $full_list array - * - * @param array $full_list - * @param int $items_count - * @return string - */ - public function get_short_list_str($full_list, $items_count=3) { - - $short_list = array(); $i = 0; - foreach($full_list as $key=>$item) { - if ($i>=$items_count) { - break; - } - $short_list[] = $item; - $i++; - } - - $str = implode(', ', $short_list); - if ($items_countlib = $lib; - - } - // end of __construct() - - - static public function get_instance(Ure_Lib $lib) { - if (!function_exists('bbp_filter_blog_editable_roles')) { // bbPress plugin is not active - return null; - } - - if (self::$instance!==null) { - return self::$instance; - } - - if ($lib->is_pro()) { - self::$instance = new URE_bbPress_Pro($lib); - } else { - self::$instance = new URE_bbPress($lib); - } - - return self::$instance; - } - // end of get_instance() - - - /** - * Exclude roles created by bbPress - * - * @global array $wp_roles - * @return array - */ - public function get_roles() { - - global $wp_roles; - - $roles = bbp_filter_blog_editable_roles($wp_roles->roles); // exclude bbPress roles - - return $roles; - } - // end of get_roles() - - - /** - * Get full list user capabilities created by bbPress - * - * @return array - */ - public function get_caps() { - $caps = array_keys(bbp_get_caps_for_role(bbp_get_keymaster_role())); - - return $caps; - } - // end of get_caps() - -} -// end of URE_bbPress class \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/capabilities-groups-manager.php b/wp/wp-content/plugins/user-role-editor/includes/classes/capabilities-groups-manager.php deleted file mode 100644 index 7bc361e1..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/capabilities-groups-manager.php +++ /dev/null @@ -1,368 +0,0 @@ - - * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya - **/ - -class URE_Capabilities_Groups_Manager { - - private static $instance = null; - private $lib = null; - private $groups = null; - private $built_in_wp_caps = null; - private $cpt_caps = null; - - - public static function get_instance() { - - if (self::$instance === null) { - // new static() will work too - self::$instance = new URE_Capabilities_Groups_Manager(); - } - - return self::$instance; - } - // end of get_instance() - - - private function __construct() { - - $this->lib = URE_Lib::get_instance(); - $this->_get_built_in_wp_caps(); - $this->_get_all_custom_post_types_capabilities(); - - } - // end of __construct() - - - public function add_custom_post_types() { - - $this->groups['custom_post_types'] = array('caption'=>esc_html__('Custom Post Types', 'user-role-editor'), 'parent'=>'all', 'level'=>1); - - $post_types = get_post_types(array(), 'objects'); - $_post_types = $this->lib->_get_post_types(); - $built_in_pt = array('post', 'page'); - if ($post_types['attachment']->cap->edit_posts=='edit_posts') { - $built_in_pt[] = 'attachment'; - } - - $show_wc_post_types_under_wc_only = apply_filters('ure_show_wc_post_types_under_wc_only', false); - foreach($post_types as $post_type) { - if (!isset($_post_types[$post_type->name]) || in_array($post_type->name, $built_in_pt)) { - continue; - } - if ($show_wc_post_types_under_wc_only && in_array($post_type->name, URE_Woocommerce_Capabilities::$post_types)) { - continue; - } - /* - if (!$post_type->public) { - continue; - } - * - */ - $this->groups[$post_type->name] = array('caption'=>$post_type->labels->name, 'parent'=>'custom_post_types', 'level'=>2); - } - } - // end of add_custom_post_types() - - - private function add_ure_group() { - - $this->groups['user_role_editor'] = array('caption'=>esc_html__('User Role Editor', 'user-role-editor'), 'parent'=>'custom', 'level'=>3); - - } - // end of get_ure_group() - - - private function add_woocommerce_groups() { - - $full_caps = $this->lib->get('full_capabilities'); - if (!isset($full_caps['manage_woocommerce'])) { - return; - } - - $post_types = get_post_types(array(), 'objects'); - - $this->groups['woocommerce'] = array('caption'=>esc_html__('WooCommerce', 'user-role-editor'), 'parent'=>'custom', 'level'=>3); - $this->groups['woocommerce_core'] = array('caption'=>esc_html__('Core', 'user-role-editor'), 'parent'=>'woocommerce', 'level'=>4); - foreach(URE_Woocommerce_Capabilities::$post_types as $post_type) { - if (!isset($post_types[$post_type])) { - continue; - } - $this->groups['woocommerce_'. $post_type] = array('caption'=>$post_types[$post_type]->labels->name, 'parent'=>'woocommerce', 'level'=>4); - } - - } - // end of add_woocommerce_group() - - - public function get_groups_tree() { - - if ($this->groups!==null) { - return $this->groups; - } - - $this->groups = array( - 'all'=>array('caption'=>esc_html__('All', 'user-role-editor'), 'parent'=>null, 'level'=>0), - 'core'=>array('caption'=>esc_html__('Core', 'user-role-editor'), 'parent'=>'all', 'level'=>1), - 'general'=>array('caption'=>esc_html__('General', 'user-role-editor'), 'parent'=>'core', 'level'=>2), - 'themes'=>array('caption'=>esc_html__('Themes', 'user-role-editor'), 'parent'=>'core', 'level'=>2), - 'posts'=>array('caption'=>esc_html__('Posts', 'user-role-editor'), 'parent'=>'core', 'level'=>2), - 'pages'=>array('caption'=>esc_html__('Pages', 'user-role-editor'), 'parent'=>'core', 'level'=>2), - 'plugins'=>array('caption'=>esc_html__('Plugins', 'user-role-editor'), 'parent'=>'core', 'level'=>2), - 'users'=>array('caption'=>esc_html__('Users', 'user-role-editor'), 'parent'=>'core', 'level'=>2) - ); - $multisite = $this->lib->get('multisite'); - if ($multisite) { - $this->groups['multisite'] = array('caption'=>esc_html__('Multisite', 'user-role-editor'), 'parent'=>'core', 'level'=>2); - } - $this->groups['deprecated'] = array('caption'=>esc_html__('Deprecated', 'user-role-editor'), 'parent'=>'core', 'level'=>2); - - $this->add_custom_post_types(); - $this->groups['custom'] = array('caption'=>esc_html__('Custom capabilities', 'user-role-editor'), 'parent'=>'all', 'level'=>1); - $this->add_ure_group(); - $this->add_woocommerce_groups(); - - $this->groups = apply_filters('ure_capabilities_groups_tree', $this->groups); - - return $this->groups; - } - // end of get_groups_tree() - - - /** - * return array of built-in WP capabilities (WP 3.1 wp-admin/includes/schema.php) - * - * @return array - */ - private function _get_built_in_wp_caps() { - - $wp_version = get_bloginfo('version'); - $multisite = $this->lib->get('multisite'); - - $caps = array(); - $caps['switch_themes'] = array('core', 'themes'); - $caps['edit_themes'] = array('core', 'themes'); - $caps['activate_plugins'] = array('core', 'plugins'); - $caps['edit_plugins'] = array('core', 'plugins'); - $caps['edit_users'] = array('core', 'users'); - $caps['edit_files'] = array('core', 'deprecated'); - $caps['manage_options'] = array('core', 'general'); - $caps['moderate_comments'] = array('core', 'posts', 'general'); - $caps['manage_categories'] = array('core', 'posts', 'general'); - $caps['manage_links'] = array('core', 'others'); - $caps['upload_files'] = array('core', 'general'); - $caps['import'] = array('core', 'general'); - $caps['unfiltered_html'] = array('core','general'); - if ($multisite) { - $caps['unfiltered_html'] = array('deprecated'); - } - $caps['edit_posts'] = array('core', 'posts'); - $caps['edit_others_posts'] = array('core', 'posts'); - $caps['edit_published_posts'] = array('core', 'posts'); - $caps['publish_posts'] = array('core', 'posts'); - $caps['edit_pages'] = array('core', 'pages'); - $caps['read'] = array('core', 'general'); - $caps['level_10'] = array('core', 'deprecated'); - $caps['level_9'] = array('core', 'deprecated'); - $caps['level_8'] = array('core', 'deprecated'); - $caps['level_7'] = array('core', 'deprecated'); - $caps['level_6'] = array('core', 'deprecated'); - $caps['level_5'] = array('core', 'deprecated'); - $caps['level_4'] = array('core', 'deprecated'); - $caps['level_3'] = array('core', 'deprecated'); - $caps['level_2'] = array('core', 'deprecated'); - $caps['level_1'] = array('core', 'deprecated'); - $caps['level_0'] = array('core', 'deprecated'); - $caps['edit_others_pages'] = array('core', 'pages'); - $caps['edit_published_pages'] = array('core', 'pages'); - $caps['publish_pages'] = array('core', 'pages'); - $caps['delete_pages'] = array('core', 'pages'); - $caps['delete_others_pages'] = array('core', 'pages'); - $caps['delete_published_pages'] = array('core', 'pages'); - $caps['delete_posts'] = array('core', 'posts'); - $caps['delete_others_posts'] = array('core', 'posts'); - $caps['delete_published_posts'] = array('core', 'posts'); - $caps['delete_private_posts'] = array('core', 'posts'); - $caps['edit_private_posts'] = array('core', 'posts'); - $caps['read_private_posts'] = array('core', 'posts'); - $caps['delete_private_pages'] = array('core', 'pages'); - $caps['edit_private_pages'] = array('core', 'pages'); - $caps['read_private_pages'] = array('core', 'pages'); - $caps['unfiltered_upload'] = array('core', 'general'); - $caps['edit_dashboard'] = array('core', 'general'); - $caps['update_plugins'] = array('core', 'plugins'); - $caps['delete_plugins'] = array('core', 'plugins'); - $caps['install_plugins'] = array('core', 'plugins'); - $caps['update_themes'] = array('core', 'themes'); - $caps['install_themes'] = array('core', 'themes'); - $caps['update_core'] = array('core', 'general'); - $caps['list_users'] = array('core', 'users'); - $caps['remove_users'] = array('core', 'users'); - - if (version_compare($wp_version, '4.4', '<')) { - $caps['add_users'] = array('core', 'users'); // removed from WP v. 4.4. - } - - $caps['promote_users'] = array('core', 'users'); - $caps['edit_theme_options'] = array('core', 'themes'); - $caps['delete_themes'] = array('core', 'themes'); - $caps['export'] = array('core', 'general'); - $caps['delete_users'] = array('core', 'users'); - $caps['create_users'] = array('core', 'users'); - if ($multisite) { - $caps['manage_network'] = array('core', 'multisite', 'general'); - $caps['manage_sites'] = array('core', 'multisite', 'general'); - $caps['create_sites'] = array('core', 'multisite', 'general'); - $caps['manage_network_users'] = array('core', 'multisite', 'users'); - $caps['manage_network_themes'] = array('core', 'multisite', 'themes'); - $caps['manage_network_plugins'] = array('core', 'multisite', 'plugins'); - $caps['manage_network_options'] = array('core', 'multisite', 'general'); - } - - $caps['create_posts'] = array('core', 'posts'); - $caps['create_pages'] = array('core', 'pages'); - - $caps = apply_filters('ure_built_in_wp_caps', $caps); - - $this->built_in_wp_caps = $caps; - - return $this->built_in_wp_caps; - } - // end of _get_built_in_wp_caps() - - - public function get_built_in_wp_caps() { - - return $this->built_in_wp_caps; - } - // end of get_built_in_wp_caps() - - - private function get_post_types_without_caps() { - $pt_without_caps = array(); - $wc_pts = URE_Woocommerce_Capabilities::get_post_types_without_caps(); - - $pt_without_caps = array_merge($pt_without_caps, $wc_pts); - - return $pt_without_caps; - } - // end of get_post_types_without_caps() - - - /** - * Get capabilities registered with custom post type - * - * @param object $post_type - * @param array $post_edit_caps - */ - private function get_registered_cpt_caps($post_type, $post_edit_caps) { - foreach ($post_edit_caps as $capability) { - if (isset($post_type->cap->$capability)) { - $cap = $post_type->cap->$capability; - } else { - continue; - } - - if (!isset($this->cpt_caps[$cap])) { - $this->cpt_caps[$cap] = array('custom', 'custom_post_types'); - } - $this->cpt_caps[$cap][] = $post_type->name; - } - } - // end of get_registered_cpt_caps() - - - private function get_custom_post_type_capabilities($post_type, $post_edit_caps) { - $pt_without_caps = $this->get_post_types_without_caps(); - if (!in_array($post_type->name, $pt_without_caps)) { - $this->get_registered_cpt_caps($post_type, $post_edit_caps); - } - } - // end of get_custom_post_type_capabilities() - - - private function _get_all_custom_post_types_capabilities() { - - $post_edit_caps = $this->lib->get_edit_post_capabilities(); - $post_types = get_post_types(array(), 'objects'); - $_post_types = $this->lib->_get_post_types(); - $built_in_pt = array('post', 'page'); - if ($post_types['attachment']->cap->edit_posts=='edit_posts') { - $built_in_pt[] = 'attachment'; - } - $this->cpt_caps = array(); - foreach($post_types as $post_type) { - if (!isset($_post_types[$post_type->name])) { - continue; - } - if (in_array($post_type->name, $built_in_pt)) { - continue; - } - if (!isset($post_type->cap)) { - continue; - } - $this->get_custom_post_type_capabilities($post_type, $post_edit_caps); - } - - return $this->cpt_caps; - } - // end of _get_all_custom_post_types_capabilities() - - - private function get_groups_for_custom_cap($cap_id) { - - $ure_caps = URE_Own_Capabilities::get_caps_groups(); - if (isset($ure_caps[$cap_id])) { - $groups1 = $ure_caps[$cap_id]; - } - - if (empty($groups1)) { - $wc_caps = URE_Woocommerce_Capabilities::get_caps_groups(); - if (isset($wc_caps[$cap_id])) { - $groups1 = $wc_caps[$cap_id]; - } - } - - if (isset($this->cpt_caps[$cap_id])) { - $groups2 = $this->cpt_caps[$cap_id]; - } - - $groups = array('custom'); - if (!empty($groups1)) { - $groups = array_merge($groups, $groups1); - } - if (!empty($groups2)) { - $groups = array_merge($groups, $groups2); - } - - return $groups; - } - // end of get_groups_for_custom_cap() - - - public function get_cap_groups($cap_id, $built_in_wp_caps=null) { - - if (isset($this->built_in_wp_caps[$cap_id])) { - $groups = $built_in_wp_caps[$cap_id]; - } else { - $groups = $this->get_groups_for_custom_cap($cap_id); - } - $groups = apply_filters('ure_custom_capability_groups', $groups, $cap_id); - $groups[] = 'all'; // Every capability belongs to the 'all' group - $groups = array_unique($groups); - - foreach($groups as $key=>$value) { - $groups[$key] = 'ure-'. $value; - } - - return $groups; - } - // end of get_cap_groups() - -} -// end of class URE_Capabilities_Groups_Manager \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/capability.php b/wp/wp-content/plugins/user-role-editor/includes/classes/capability.php deleted file mode 100644 index 3f3d4d76..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/capability.php +++ /dev/null @@ -1,194 +0,0 @@ - - * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya - **/ - -class URE_Capability { - - const SPACE_REPLACER = '_URE-SR_'; - const SLASH_REPLACER = '_URE-SLR_'; - const VERT_LINE_REPLACER = '_URE-VLR_'; - - - public static function escape($cap_id) { - - $search = array(' ', '/', '|'); - $replace = array(self::SPACE_REPLACER, self::SLASH_REPLACER, self::VERT_LINE_REPLACER); - - $cap_id_esc = str_replace($search, $replace, $cap_id); - - return $cap_id_esc; - } - // end escape() - - - // sanitize user input for security - public static function validate($cap_id_raw) { - $match = array(); - $found = preg_match('/[A-Za-z0-9_\-]*/', $cap_id_raw, $match); - if ( !$found || ($found && ($match[0]!=$cap_id_raw)) ) { // some non-alphanumeric charactes found! - $result = false; - } else { - $result = true; - } - $data = array('result'=>$result, 'cap_id'=>strtolower($match[0])); - - return $data; - } - // end of validate() - - - /** - * Add new user capability - * - * @global WP_Roles $wp_roles - * @return string - */ - public static function add() { - global $wp_roles; - - if (!current_user_can('ure_create_capabilities')) { - return esc_html__('Insufficient permissions to work with User Role Editor','user-role-editor'); - } - - $mess = ''; - if (!isset($_POST['capability_id']) || empty($_POST['capability_id'])) { - return 'Wrong Request'; - } - - $data = self::validate($_POST['capability_id']); - if (!$data['result']) { - return esc_html__('Error: Capability name must contain latin characters and digits only!', 'user-role-editor'); - } - - $cap_id = $data['cap_id']; - $lib = URE_Lib::get_instance(); - $lib->get_user_roles(); - $lib->init_full_capabilities(); - $full_capabilities = $lib->get('full_capabilities'); - if (!isset($full_capabilities[$cap_id])) { - $admin_role = $lib->get_admin_role(); - $wp_roles->use_db = true; - $wp_roles->add_cap($admin_role, $cap_id); - $mess = sprintf(esc_html__('Capability %s is added successfully', 'user-role-editor'), $cap_id); - } else { - $mess = sprintf(esc_html__('Capability %s exists already', 'user-role-editor'), $cap_id); - } - - return $mess; - } - // end of add() - - - /** - * Extract capabilities selected from deletion from the $_POST global - * - * @return array - */ - private static function get_caps_for_deletion_from_post($caps_allowed_to_remove) { - - $caps = array(); - foreach($_POST as $key=>$value) { - if (substr($key, 0, 3)!=='rm_') { - continue; - } - if (!isset($caps_allowed_to_remove[$value])) { - continue; - } - $caps[] = $value; - } - - return $caps; - } - // end of get_caps_for_deletion_from_post() - - - - private static function revoke_caps_from_user($user_id, $caps) { - $user = get_user_to_edit($user_id); - foreach($caps as $cap_id) { - if (isset($user->caps[$cap_id])) { - $user->remove_cap($cap_id); - } - } - } - // end of revoke_caps_from_user() - - - private static function revoke_caps_from_role($wp_role, $caps) { - foreach($caps as $cap_id) { - if ($wp_role->has_cap($cap_id)) { - $wp_role->remove_cap($cap_id); - } - } - } - // end of revoke_caps_from_role() - - - private static function revoke_caps($caps) { - global $wpdb, $wp_roles; - - // remove caps from users - $users_ids = $wpdb->get_col("SELECT $wpdb->users.ID FROM $wpdb->users"); - foreach ($users_ids as $user_id) { - self::revoke_caps_from_user($user_id, $caps); - } - - // remove caps from roles - foreach ($wp_roles->role_objects as $wp_role) { - self::revoke_caps_from_role($wp_role, $caps); - } - } - // end of revoke_caps() - - - /** - * Delete capability - * - * @global wpdb $wpdb - * @global WP_Roles $wp_roles - * @return string - information message - */ - public static function delete() { - - if (!isset($_POST['action']) || $_POST['action']!='delete-user-capability') { - return 'Wrong Request'; - } - - if (!current_user_can('ure_delete_capabilities')) { - return esc_html__('Insufficient permissions to work with User Role Editor','user-role-editor'); - } - - $lib = URE_Lib::get_instance(); - $mess = ''; - $caps_allowed_to_remove = $lib->get_caps_to_remove(); - if (!is_array($caps_allowed_to_remove) || count($caps_allowed_to_remove) == 0) { - return esc_html__('There are no capabilities available for deletion!', 'user-role-editor'); - } - - $capabilities = self::get_caps_for_deletion_from_post($caps_allowed_to_remove); - if (empty($capabilities)) { - return esc_html__('There are no capabilities available for deletion!', 'user-role-editor'); - } - - self::revoke_caps($capabilities); - - if (count($capabilities)==1) { - $mess = sprintf(esc_html__('Capability %s was removed successfully', 'user-role-editor'), $capabilities[0]); - } else { - $short_list_str = $lib->get_short_list_str($capabilities); - $mess = count($capabilities) .' '. esc_html__('capabilities were removed successfully', 'user-role-editor') .': '. - $short_list_str; - } - - return $mess; - } - // end of delete() - -} -// end of class URE_Capability diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/grant-roles.php b/wp/wp-content/plugins/user-role-editor/includes/classes/grant-roles.php deleted file mode 100644 index 1915948a..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/grant-roles.php +++ /dev/null @@ -1,167 +0,0 @@ -lib = URE_Lib::get_instance(); - - add_action('restrict_manage_users', array($this, 'show_grant_roles_html')); - add_action('admin_head', array(User_Role_Editor::get_instance(), 'add_css_to_users_page')); - add_action('admin_enqueue_scripts', array($this, 'load_js')); - } - // end of __construct() - - - private static function validate_users($users) { - if (!is_array($users)) { - return false; - } - - foreach ($users as $user_id) { - if (!is_numeric($user_id)) { - return false; - } - if (!current_user_can('edit_user', $user_id)) { - return false; - } - } - - return true; - } - // end of validate_users() - - - private static function validate_roles($roles) { - - $editable_roles = get_editable_roles(); - $valid_roles = array_keys($editable_roles); - foreach($roles as $role) { - if (!in_array($role, $valid_roles)) { - return false; - } - } - - return true; - } - // end of validate_roles() - - - private static function grant_roles_to_user($user_id, $roles) { - - $user = get_user_by('id', $user_id); - if (empty($user)) { - return; - } - - $user->remove_all_caps(); - foreach($roles as $role) { - $user->add_role($role); - } - - } - // end of grant_roles_to_user() - - - public static function process_user_request() { - - $users = $_POST['users']; - if (!self::validate_users($users)) { - $answer = array('result'=>'error', 'message'=>esc_html__('Invalid data at the users list', 'user-role-editor')); - return $answer; - } - - $roles = $_POST['roles']; - if (!self::validate_roles($roles)) { - $answer = array('result'=>'error', 'message'=>esc_html__('Invalid data at the roles list', 'user-role-editor')); - return; - } - - if (!current_user_can('edit_users')) { - $answer = array('result'=>'error', 'message'=>esc_html__('Not enough permissions', 'user-role-editor')); - return $answer; - } - - foreach($users as $user_id) { - self::grant_roles_to_user($user_id, $roles); - } - - $answer = array(); - - return $answer; - } - // end of process_user_request() - - - private function select_roles_html() { - $show_admin_role = $this->lib->show_admin_role_allowed(); - $roles = get_editable_roles(); - foreach ($roles as $role_id => $role) { - if (!$show_admin_role && $role_id=='administrator') { - continue; - } - echo '
    '. PHP_EOL; - } - } - // end of show_secondary_roles() - - - public function show_grant_roles_html() { - if (!$this->lib->is_right_admin_path('users.php')) { - return; - } -?> -    -
    -
    -select_roles_html(); -?> -
    -
    - -lib->is_right_admin_path('users.php')) { - return; - } - - wp_enqueue_script('jquery-ui-dialog', '', array('jquery-ui-core','jquery-ui-button', 'jquery') ); - wp_register_script('ure-users-grant-roles', plugins_url('/js/users-grant-roles.js', URE_PLUGIN_FULL_PATH)); - wp_enqueue_script('ure-users-grant-roles', '', array(), false, true); - wp_localize_script('ure-users-grant-roles', 'ure_users_grant_roles_data', array( - 'wp_nonce' => wp_create_nonce('user-role-editor'), - 'dialog_title'=> esc_html__('Grant roles to selected users', 'user-role-editor'), - 'select_users_first'=> esc_html__('Select users to which you wish to grant multiple roles!', 'user-role-editor'), - 'select_roles_first'=> esc_html__('Select role(s) which you wish to grant!', 'user-role-editor') - )); - } - // end of load_js() - -} -// end of URE_Grant_Roles class diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/known-js-css-compatibility-issues.php b/wp/wp-content/plugins/user-role-editor/includes/classes/known-js-css-compatibility-issues.php deleted file mode 100644 index cd81fa3d..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/known-js-css-compatibility-issues.php +++ /dev/null @@ -1,89 +0,0 @@ -registered['admin-page-css'])) { - wp_deregister_style('admin-page-css'); - } - } - // end of unload_conflict_plugins_css() - - - -} -// end of URE_Fix_Known_JS_CSS_Compatibility_Issues \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/own-capabilities.php b/wp/wp-content/plugins/user-role-editor/includes/classes/own-capabilities.php deleted file mode 100644 index 4235ff63..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/own-capabilities.php +++ /dev/null @@ -1,163 +0,0 @@ - - * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya - **/ -class URE_Own_Capabilities { - const URE_SETTINGS_CAP_TR = 'ure_settings_cap'; - - - public static function get_caps() { - - $lib = URE_Lib::get_instance(); - - $ure_caps = array( - 'ure_edit_roles' => 1, - 'ure_create_roles' => 1, - 'ure_delete_roles' => 1, - 'ure_create_capabilities' => 1, - 'ure_delete_capabilities' => 1, - 'ure_manage_options' => 1, - 'ure_reset_roles' => 1 - ); - - if ($lib->is_pro()) { - $ure_caps['ure_export_roles'] = 1; - $ure_caps['ure_import_roles'] = 1; - $ure_caps['ure_admin_menu_access'] = 1; - $ure_caps['ure_widgets_access'] = 1; - $ure_caps['ure_widgets_show_access'] = 1; - $ure_caps['ure_meta_boxes_access'] = 1; - $ure_caps['ure_other_roles_access'] = 1; - $ure_caps['ure_edit_posts_access'] = 1; - $ure_caps['ure_plugins_activation_access'] = 1; - $ure_caps['ure_view_posts_access'] = 1; - $ure_caps['ure_front_end_menu_access'] = 1; - $multisite = $lib->get('multisite'); - if ($multisite) { - $ure_caps['ure_themes_access'] = 1; - } - } - - return $ure_caps; - } - // end of get_caps() - - - /** - * return key capability to have access to User Role Editor Plugin - */ - public static function get_key_capability() { - - $lib = URE_Lib::get_instance(); - $key_cap = $lib->get('key_capability'); - - if (!empty($key_cap)) { - return $key_cap; - } - - $multisite = $lib->get('multisite'); - if (!$multisite) { - $key_cap = URE_KEY_CAPABILITY; - } else { - $enable_simple_admin_for_multisite = $lib->get_option('enable_simple_admin_for_multisite', 0); - if ( (defined('URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE') && URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE == 1) || - $enable_simple_admin_for_multisite) { - $key_cap = URE_KEY_CAPABILITY; - } else { - $key_cap = 'manage_network_plugins'; - } - } - $lib->set('key_capability', $key_cap); - - return $key_cap; - } - // end of get_key_capability() - - - /** - * Return user capability for the User Role Editor Settings page - * - * @return string - */ - public static function get_settings_capability() { - - $lib = URE_Lib::get_instance(); - $settings_cap = $lib->get('settings_capability'); - if (!empty($settings_cap)) { - return $settings_cap; - } - - $multisite = $lib->get('multisite'); - if (!$multisite) { - $settings_cap = 'ure_manage_options'; - } else { - $enable_simple_admin_for_multisite = $lib->get_option('enable_simple_admin_for_multisite', 0); - if ((defined('URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE') && URE_ENABLE_SIMPLE_ADMIN_FOR_MULTISITE == 1) || - $enable_simple_admin_for_multisite) { - $settings_cap = 'ure_manage_options'; - } else { - $settings_cap = self::get_key_capability(); - } - } - $lib->set('settings_capability', $settings_cap); - - return $settings_cap; - } - // end of get_settings_capability() - - - public static function init_caps() { - global $wp_roles; - - if (!isset($wp_roles)) { - $wp_roles = new WP_Roles(); - } - - if (!isset($wp_roles->roles['administrator'])) { - return; - } - - $lib = URE_Lib::get_instance(); - $multisite = $lib->get('multisite'); - // Do not turn on URE caps for local administrator by default under multisite, as there is a superadmin. - $turn_on = !$multisite; - - $old_use_db = $wp_roles->use_db; - $wp_roles->use_db = true; - $administrator = $wp_roles->role_objects['administrator']; - $ure_caps = self::get_caps(); - foreach(array_keys($ure_caps) as $cap) { - if (!$administrator->has_cap($cap)) { - $administrator->add_cap($cap, $turn_on); - } - } - $wp_roles->use_db = $old_use_db; - } - // end of init_caps() - - - /** - * Return list of URE capabilities with data about groups they were included - * - * @return array - */ - public static function get_caps_groups() { - - $ure_caps = self::get_caps(); - - $caps = array(); - foreach($ure_caps as $ure_cap=>$value) { - $caps[$ure_cap] = array('custom', 'user_role_editor'); - } - - return $caps; - } - // end of get_caps_groups() - -} -// end of URE_Capabilities class \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/protect-admin.php b/wp/wp-content/plugins/user-role-editor/includes/classes/protect-admin.php deleted file mode 100644 index 43dea726..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/protect-admin.php +++ /dev/null @@ -1,188 +0,0 @@ -lib = $lib; - $this->user_to_check = array(); - - // Exclude administrator role from edit list. - add_filter('editable_roles', array($this, 'exclude_admin_role')); - // prohibit any actions with user who has Administrator role - add_filter('user_has_cap', array($this, 'not_edit_admin'), 10, 3); - // exclude users with 'Administrator' role from users list - add_action('pre_user_query', array($this, 'exclude_administrators')); - // do not show 'Administrator (s)' view above users list - add_filter('views_users', array($this, 'exclude_admins_view')); - } - // end of __construct() - - - // apply protection to the user edit pages only - protected function is_protection_applicable() { - $result = false; - $links_to_block = array('profile.php', 'users.php', 'user-new.php'); - foreach ($links_to_block as $key => $value) { - $result = stripos($_SERVER['REQUEST_URI'], $value); - if ($result !== false) { - break; - } - } - - return $result; - } - // end of is_protection_applicable() - - - /** - * exclude administrator role from the roles list - * - * @param string $roles - * @return array - */ - public function exclude_admin_role($roles) { - - if ($this->is_protection_applicable() && isset($roles['administrator'])) { - unset($roles['administrator']); - } - - return $roles; - } - // end of exclude_admin_role() - - - /** - * Check if user has "Administrator" role assigned - * - * @global wpdb $wpdb - * @param int $user_id - * @return boolean returns true is user has Role "Administrator" - */ - private function has_administrator_role($user_id) { - global $wpdb; - - if (empty($user_id) || !is_numeric($user_id)) { - return false; - } - - $table_name = $this->lib->get_usermeta_table_name(); - $meta_key = $wpdb->prefix . 'capabilities'; - $query = "SELECT count(*) - FROM $table_name - WHERE user_id=$user_id AND meta_key='$meta_key' AND meta_value like '%administrator%'"; - $has_admin_role = $wpdb->get_var($query); - if ($has_admin_role > 0) { - $result = true; - } else { - $result = false; - } - // cache checking result for the future use - $this->user_to_check[$user_id] = $result; - - return $result; - } - - // end of has_administrator_role() - - - /** - * We have two vulnerable queries with user id at admin interface, which should be processed - * 1st: http://blogdomain.com/wp-admin/user-edit.php?user_id=ID&wp_http_referer=%2Fwp-admin%2Fusers.php - * 2nd: http://blogdomain.com/wp-admin/users.php?action=delete&user=ID&_wpnonce=ab34225a78 - * If put Administrator user ID into such request, user with lower capabilities (if he has 'edit_users') - * can edit, delete admin record - * This function removes 'edit_users' capability from current user capabilities - * if request has admin user ID in it - * - * @param array $allcaps - * @param type $caps - * @param string $name - * @return array - */ - public function not_edit_admin($allcaps, $caps, $name) { - - $user_keys = array('user_id', 'user'); - foreach ($user_keys as $user_key) { - $access_deny = false; - $user_id = $this->lib->get_request_var($user_key, 'get'); - if (empty($user_id)) { - break; - } - if ($user_id == 1) { // built-in WordPress Admin - $access_deny = true; - } else { - if (!isset($this->user_to_check[$user_id])) { - // check if user_id has Administrator role - $access_deny = $this->has_administrator_role($user_id); - } else { - // user_id was checked already, get result from cash - $access_deny = $this->user_to_check[$user_id]; - } - } - if ($access_deny) { - unset($allcaps['edit_users']); - } - break; - } - - return $allcaps; - } - // end of not_edit_admin() - - - /** - * add where criteria to exclude users with 'Administrator' role from users list - * - * @global wpdb $wpdb - * @param type $user_query - */ - public function exclude_administrators($user_query) { - - global $wpdb; - - if (!$this->is_protection_applicable()) { // block the user edit stuff only - return; - } - - // get user_id of users with 'Administrator' role - $tableName = $this->lib->get_usermeta_table_name(); - $meta_key = $wpdb->prefix . 'capabilities'; - $admin_role_key = '%"administrator"%'; - $query = "select user_id - from $tableName - where meta_key='$meta_key' and meta_value like '$admin_role_key'"; - $ids_arr = $wpdb->get_col($query); - if (is_array($ids_arr) && count($ids_arr) > 0) { - $ids = implode(',', $ids_arr); - $user_query->query_where .= " AND ( $wpdb->users.ID NOT IN ( $ids ) )"; - } - } - // end of exclude_administrators() - - - /* - * Exclude view of users with Administrator role - * - */ - public function exclude_admins_view($views) { - - unset($views['administrator']); - - return $views; - } - // end of exclude_admins_view() - -} -// end of URE_Protect_Admin class diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/role-additional-options.php b/wp/wp-content/plugins/user-role-editor/includes/classes/role-additional-options.php deleted file mode 100644 index 8a1c6e58..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/role-additional-options.php +++ /dev/null @@ -1,152 +0,0 @@ -lib = $lib; - $this->init(); - } - // end of __construct() - - - public static function get_instance($lib) { - - if (self::$instance===null) { - self::$instance = new URE_Role_Additional_Options($lib); - } - - return self::$instance; - } - // end of get_instance() - - - public static function create_item($id, $label, $hook, $routine) { - $item = new stdClass(); - $item->id = $id; - $item->label = $label; - $item->hook = $hook; - $item->routine = $routine; - - return $item; - } - // end of create_item() - - - public static function get_active_items() { - - $data = get_option(self::STORAGE_ID, array()); - -/* - // It's enough to update the role via URE to achieve this, that why this code is commented: - // remove deactivated options - $modified = false; - foreach($data as $role=>$items) { - foreach($items as $item_id) { - if (!isset($this->items[$item_id])) { - $modified = true; - unset($data[$role][$item_id]); - } - } - } - if ($modified) { - put_option(self::STORAGE_ID, $data); - } -*/ - return $data; - } - - - private function init() { - - $this->items = array(); - $item = self::create_item('hide_admin_bar', esc_html__('Hide admin bar', 'user-role-editor'), 'init', 'ure_hide_admin_bar'); - $this->items[$item->id] = $item; - - // Allow other developers to modify the list of role's additonal options - $this->items = apply_filters('ure_role_additional_options', $this->items); - - $this->active_items = self::get_active_items(); - } - // end of init() - - - public function set_active_items_hooks() { - global $current_user; - - if (current_user_can('ure_edit_roles')) { - return; - } - - foreach($current_user->roles as $role) { - if (!isset($this->active_items[$role])) { - continue; - } - foreach(array_keys($this->active_items[$role]) as $item_id) { - if (isset($this->items[$item_id])) { - add_action($this->items[$item_id]->hook, $this->items[$item_id]->routine, 99); - } - } - } - - } - // end of set_active_items_hooks() - - - public function save($current_role) { - $this->active_items = self::get_active_items(); - $this->active_items[$current_role] = array(); - foreach($this->items as $item) { - if (isset($_POST[$item->id])) { - $this->active_items[$current_role][$item->id] = 1; - } - } - update_option(self::STORAGE_ID, $this->active_items); - - } - // end of save() - - - public function show($current_role) { - -?> - -
    - : - - - - - -
    - -items as $item) { - $checked = (isset($this->active_items[$current_role]) && - isset($this->active_items[$current_role][$item->id])) ? 'checked="checked"' : ''; - if (!$first_time) { -?> -
    - - > - - -
    - - * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya - **/ -class URE_Role_View extends URE_View { - - private $lib = null; - public $role_default_html = ''; - private $role_to_copy_html = ''; - private $role_select_html = ''; - private $role_delete_html = ''; - - - public function __construct() { - - parent::__construct(); - $this->lib = URE_Lib::get_instance(); - $this->caps_to_remove = $this->lib->get_caps_to_remove(); - - } - // end of __construct() - - - public function role_default_prepare_html($select_width=200) { - - $roles = $this->lib->get('roles'); - if (!isset($roles) || !$roles) { - // get roles data from database - $roles = $this->lib->get_user_roles(); - } - - $caps_access_restrict_for_simple_admin = $this->lib->get_option('caps_access_restrict_for_simple_admin', 0); - $show_admin_role = $this->lib->show_admin_role_allowed(); - if ($select_width>0) { - $select_style = 'style="width: '. $select_width .'px"'; - } else { - $select_style = ''; - } - $wp_default_role = $this->lib->get('wp_default_role'); - $this->role_default_html = ''; - - } - // end of role_default_prepare_html() - - - private function role_select_copy_prepare_html($select_width=200) { - - global $current_user; - - $key_capability = URE_Own_Capabilities::get_key_capability(); - $user_is_ure_admin = current_user_can($key_capability); - $role_to_skip = ($user_is_ure_admin) ? '':$current_user->roles[0]; - - $caps_access_restrict_for_simple_admin = $this->lib->get_option('caps_access_restrict_for_simple_admin', 0); - $show_admin_role = $this->lib->show_admin_role_allowed(); - $this->role_to_copy_html = ''; - $current_role = $this->lib->get('current_role'); - $roles = $this->lib->get_editable_user_roles(); - foreach ($roles as $key => $value) { - if ($key===$role_to_skip) { // skip role of current user if he does not have full access to URE - continue; - } - $selected1 = selected($key, $current_role, false); - $disabled = ($key==='administrator' && $caps_access_restrict_for_simple_admin && !$this->lib->is_super_admin()) ? 'disabled' : ''; - if ($show_admin_role || $key != 'administrator') { - $translated_name = esc_html__($value['name'], 'user-role-editor'); // get translation from URE language file, if exists - if ($translated_name === $value['name']) { // get WordPress internal translation - $translated_name = translate_user_role($translated_name); - } - $translated_name .= ' (' . $key . ')'; - $this->role_select_html .= ''; - $this->role_to_copy_html .= ''; - } - } - $this->role_select_html .= ''; - $this->role_to_copy_html .= ''; - } - // end of role_select_copy_prepare_html() - - - private function role_delete_prepare_html() { - $roles_can_delete = $this->lib->get_roles_can_delete(); - if ($roles_can_delete && count($roles_can_delete) > 0) { - $this->role_delete_html = ''; - } else { - $this->role_delete_html = ''; - } - } - // end of role_delete_prepare_html() - - - /** - * Build HTML for select drop-down list from capabilities we can remove - * - * @return string - **/ - public static function caps_to_remove_html() { - global $wp_roles; - - $lib = URE_Lib::get_instance(); - $caps_to_remove = $lib->get_caps_to_remove(); - - if (empty($caps_to_remove) || !is_array($caps_to_remove) && count($caps_to_remove)==0) { - return ''; - } - - $caps = array_keys($caps_to_remove); - asort($caps); - $network_admin = filter_input(INPUT_POST, 'network_admin', FILTER_SANITIZE_NUMBER_INT); - $current_role = filter_input(INPUT_POST, 'current_role', FILTER_SANITIZE_STRING); - if (!isset($wp_roles->roles[$current_role])) { - $current_role = ''; - } - ob_start(); -?> -
    - - - - - - - - - - - -
    - -
    - - - -
    - - - -
    -role_select_copy_prepare_html($select_width); - $multisite = $this->lib->get('multisite'); - if ($multisite && !is_network_admin()) { - $this->role_default_prepare_html($select_width); - } - $this->role_delete_prepare_html(); - - } - // end of role_edit_prepare_html() - - - public function display_edit_dialogs() { - $multisite = $this->lib->get('multisite'); - $current_role = $this->lib->get('current_role'); - $current_role_name = $this->lib->get('current_role_name'); -?> - - - -
    -
    -
    -
    -
    -
    -
    -
    role_to_copy_html; ?>
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    role_delete_html; ?>
    -
    -
    - - -
    -
    - role_default_html; ?> -
    -
    - - -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    - -current_role - * @param boolean $role_delete - * @param boolean $capability_remove - */ - public function toolbar() { - $caps_access_restrict_for_simple_admin = $this->lib->get_option('caps_access_restrict_for_simple_admin', 0); - if ($caps_access_restrict_for_simple_admin) { - $add_del_role_for_simple_admin = $this->lib->get_option('add_del_role_for_simple_admin', 1); - } else { - $add_del_role_for_simple_admin = 1; - } - $super_admin = $this->lib->is_super_admin(); - $multisite = $this->lib->get('multisite'); - -?> -
    -
    - - -
    - -
    - - - - - - -role_delete_html) && current_user_can('ure_delete_roles')) { -?> - -caps_to_remove) && is_array($this->caps_to_remove) && count($this->caps_to_remove)>0 && - current_user_can('ure_delete_capabilities')) { -?> - - -
    - -
    - -
    -lib->is_super_admin()))) { - if (current_user_can('ure_reset_roles')) { -?> - - -
    - -
    -lib->get('multisite'); - $active_for_network = $this->lib->get('active_for_network'); -?> -
    -lib->get('caps_readable'); - if ($caps_readable) { - $checked = 'checked="checked"'; - } else { - $checked = ''; - } - $caps_access_restrict_for_simple_admin = $this->lib->get_option('caps_access_restrict_for_simple_admin', 0); - if ($this->lib->is_super_admin() || !$multisite || !$this->lib->is_pro() || !$caps_access_restrict_for_simple_admin) { -?> - onclick="ure_turn_caps_readable(0);"/> -    -lib->get('show_deprecated_caps'); - if ($show_deprecated_caps) { - $checked = 'checked="checked"'; - } else { - $checked = ''; - } -?> - onclick="ure_turn_deprecated_caps(0);"/> - -lib->is_super_admin()) { - $hint = esc_html__('If checked, then apply action to ALL sites of this Network'); - $apply_to_all = $this->lib->get('apply_to_all'); - if ($apply_to_all) { - $checked = 'checked="checked"'; - $fontColor = 'color:#FF0000;'; - } else { - $checked = ''; - $fontColor = ''; - } -?> -
    - title="" onclick="ure_apply_to_all_on_click(this)"/> - -
    - -
    -
    - -
    -
    - role_select_html; ?> -
    -
    -display_options(); - $this->display_caps(); - $ao = $this->lib->get('role_additional_options'); - $current_role = $this->lib->get('current_role'); - $ao->show($current_role); -?> - -
    -
    -'. esc_html__('User Role Editor Options page help', 'user-role-editor') .' -

    -

      -
    • ' . esc_html__('Show Administrator role at User Role Editor', 'user-role-editor').' - ' . - esc_html__('turn this option on in order to make the "Administrator" role available at the User Role Editor ' - . 'roles selection drop-down list. It is hidden by default for security reasons.','user-role-editor') . '
    • -
    • ' . esc_html__('Show capabilities in the human readable form','user-role-editor').' - ' . - esc_html__('automatically converts capability names from the technical form for internal use like ' - . '"edit_others_posts" to more user friendly form, e.g. "Edit others posts".','user-role-editor') . '
    • -
    • ' . esc_html__('Show deprecated capabilities','user-role-editor').' - '. - esc_html__('Capabilities like "level_0", "level_1" are deprecated and are not used by WordPress. ' - . 'They are left at the user roles for the compatibility purpose with the old themes and plugins code. ' - . 'Turning on this option will show those deprecated capabilities.', 'user-role-editor') . '
    • -
    • ' . esc_html__('Edit user capabilities','user-role-editor').' - '. - esc_html__('If turned off - capabilities section of selected user is shown in readonly mode. ' - . 'Administrator can not assign capabilities to the user directly. ' - . 'He should make it using roles only.', 'user-role-editor') . '
    • '; - - $text = apply_filters('ure_get_settings_general_tab_help', $text); - $text .=' -
    -

    '; - - return $text; - } - // end of get_general_tab() - - - protected function get_additional_modules_tab() { - $text = '

    '. esc_html__('User Role Editor Options page help', 'user-role-editor') .'

    -

    -

      '; - if (!is_multisite()) { - $text .= '
    • ' . esc_html__('Count users without role', 'user-role-editor').' - ' . - esc_html__('Show at the "Users" page a quant of users without role. Module allows to assign all of them '. - 'an empty role "No rights", in order to look on the users list with role "No rights" at the separate tab then.','user-role-editor') . '
    • '; - } - $text = apply_filters('ure_get_settings_additional_modules_tab_help', $text); - $text .=' -
    -

    '; - - return $text; - } - // end of get_additional_modules_tab() - - - protected function get_default_roles_tab() { - $text = '

    '. esc_html__('User Role Editor Options page help', 'user-role-editor') .'

    -

    -

      -
    • ' . esc_html__('Other default roles for new registered user', 'user-role-editor').' - ' . - esc_html__('select roles below to assign them to the new user automatically as an addition to the primary role. '. - 'Note for multisite environment: take into account that other default roles should exist at the site, '. - 'in order to be assigned to the new registered users.','user-role-editor') . '
    • '; - - $text = apply_filters('ure_get_settings_default_roles_tab_help', $text); - $text .=' -
    -

    '; - - return $text; - } - // end of get_default_roles_tab() - - - protected function get_multisite_tab() { - $text = '

    '. esc_html__('User Role Editor Options page help', 'user-role-editor') .'

    -

    -

      -
    • ' . esc_html__('Allow non super-admininstrators to create, edit and delete users', 'user-role-editor').' - ' . - esc_html__('Super administrator only may create, edit and delete users under WordPress multi-site by default. ' - . 'Turn this option on in order to remove this limitation.','user-role-editor') . '
    • '; - - $text = apply_filters('ure_get_settings_multisite_tab_help', $text); - $text .=' -
    -

    '; - - return $text; - } - // end of get_multisite_tab() - - - public function get_settings_help($tab_name) { - switch ($tab_name) { - case 'general':{ - $text = $this->get_general_tab(); - break; - } - case 'additional_modules':{ - $text = $this->get_additional_modules_tab(); - break; - } - case 'default_roles':{ - $text = $this->get_default_roles_tab(); - break; - } - case 'multisite':{ - $text = $this->get_multisite_tab(); - break; - } - default: - } - - return $text; - } - // end of get_settings_help() - -} -// end of URE_Screen_Help diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/task-queue.php b/wp/wp-content/plugins/user-role-editor/includes/classes/task-queue.php deleted file mode 100644 index 67b912a6..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/task-queue.php +++ /dev/null @@ -1,150 +0,0 @@ -init(); - - } - // end of __construct() - - - private function init() { - - $this->queue = get_option(self::OPTION_NAME, array()); - - } - // end of init() - - - public function reinit() { - - $this->init(); - - } - // end of reinit() - - - /** - * - * @param string $task_id - * @param array $args=array('action'=>'action_name', 'routine'=>'routine_name', 'priority'=>99) - */ - public function add($task_id, $args=array()) { - - $this->queue[$task_id] = $args; - update_option(self::OPTION_NAME, $this->queue); - - } - // end of add_task() - - - public function remove($task_id) { - - if (isset($this->queue[$task_id])) { - unset($this->queue[$task_id]); - update_option(self::OPTION_NAME, $this->queue); - } - } - // end of remove_task() - - - /** - * Returns true in case a queue is empty - * - * @return boolean - */ - public function is_empty() { - - return count($this->queue)==0; - } - // end of is_empty() - - - /** - * Consumers should add there tasks with add_method and add 'ure_fulfil_task' action routine to work on it. - * Do not forget remove task after it was fulfilled. - * - * @return void - */ - - public function process() { - - if ($this->is_empty()) { - return; - } - - foreach($this->queue as $task_id=>$task) { - if ($task_id=='on_activation') { - do_action('ure_on_activation'); - $this->remove('on_activation'); // remove this task after execution if it was defined - } elseif (!empty($task['action'])) { - $priority = empty($task['priority']) ? 10: $task['priority']; - add_action($task['action'], $task['routine'], $priority); - } else { - add_action('init', $task['routine']); - } - } - } - // end of process(); - - /** - * Private clone method to prevent cloning of the instance of the - * *Singleton* instance. - * - * @return void - */ - private function __clone() { - - } - // end of __clone() - - /** - * Private unserialize method to prevent unserializing of the *Singleton* - * instance. - * - * @return void - */ - private function __wakeup() { - - } - // end of __wakeup() - -} -// end of class URE_On_Activation \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/ure-lib.php b/wp/wp-content/plugins/user-role-editor/includes/classes/ure-lib.php deleted file mode 100644 index 306a57ef..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/ure-lib.php +++ /dev/null @@ -1,2212 +0,0 @@ -debug = defined('URE_DEBUG') && (URE_DEBUG==1 || URE_DEBUG==true); - - $this->bbpress = URE_bbPress::get_instance($this); - - $this->upgrade(); - } - // end of __construct() - - - public static function get_instance($options_id = '') { - - if (self::$instance === null) { - if (empty($options_id)) { - throw new Exception('URE_Lib::get_inctance() - Error: plugin options ID string is required'); - } - // new static() will work too - self::$instance = new URE_Lib($options_id); - } - - return self::$instance; - } - // end of get_instance() - - - protected function upgrade() { - - $ure_version = $this->get_option('ure_version', '0'); - if (version_compare( $ure_version, URE_VERSION, '<' ) ) { - // put version upgrade stuff here - - $this->put_option('ure_version', URE_VERSION, true); - } - - } - // end of upgrade() - - - /** - * Is this the Pro version? - * @return boolean - */ - public function is_pro() { - return false; - } - // end of is_pro() - - - public function get_ure_object() { - - return $this->ure_object; - } - // end of get_ure_object(); - - - - public function set_notification($value) { - - $this->notification = $value; - - } - // end of esc_html() - - - public function set_apply_to_all($value) { - - - $this->apply_to_all = !empty($value) ? 1 : 0; - - } - // end of set_apply_to_all() - - - public function set_raised_permissions($value) { - - $this->raised_permissions = !empty($value) ? true : false; - - } - // end of set_raised_permissions() - - - /** - * get options for User Role Editor plugin - * User Role Editor stores its options at the main blog/site only and applies them to the all network - * - */ - protected function init_options($options_id) { - - global $wpdb; - - if ($this->multisite) { - if ( ! function_exists( 'is_plugin_active_for_network' ) ) { // Be sure the function is defined before trying to use it - require_once( ABSPATH . '/wp-admin/includes/plugin.php' ); - } - $this->active_for_network = is_plugin_active_for_network(URE_PLUGIN_BASE_NAME); - } - $current_blog = $wpdb->blogid; - if ($this->multisite && $current_blog!=$this->main_blog_id) { - if ($this->active_for_network) { // plugin is active for whole network, so get URE options from the main blog - switch_to_blog($this->main_blog_id); - } - } - - $this->options_id = $options_id; - $this->options = get_option($options_id); - - if ($this->multisite && $current_blog!=$this->main_blog_id) { - if ($this->active_for_network) { // plugin is active for whole network, so return back to the current blog - restore_current_blog(); - } - } - - } - // end of init_options() - - - /** - * saves options array into WordPress database wp_options table - */ - public function flush_options() { - - global $wpdb; - - $current_blog = $wpdb->blogid; - if ($this->multisite && $current_blog!==$this->main_blog_id) { - if ($this->active_for_network) { // plugin is active for whole network, so get URE options from the main blog - switch_to_blog($this->main_blog_id); // in order to save URE options to the main blog - } - } - - update_option($this->options_id, $this->options); - - if ($this->multisite && $current_blog!==$this->main_blog_id) { - if ($this->active_for_network) { // plugin is active for whole network, so return back to the current blog - restore_current_blog(); - } - } - - } - // end of flush_options() - - - public function get_main_blog_id() { - - return $this->main_blog_id; - - } - - - /** - * return front-end according to the context - role or user editor - */ - public function editor() { - - if (!$this->editor_init0()) { - $this->show_message(esc_html__('Error: wrong request', 'user-role-editor')); - return false; - } - $this->process_user_request(); - $this->editor_init1(); - $this->show_editor(); - - } - // end of editor() - - - protected function show_editor() { - - $this->show_message($this->notification); - if ($this->ure_object == 'user') { - $view = new URE_User_View(); - } else { - $this->set_current_role(); - $view = new URE_Role_View(); - $view->role_edit_prepare_html(); - } - ?> -
    -

    -
    -
    -
    -
    - display(); - wp_nonce_field('user-role-editor', 'ure_nonce'); - ?> - -
    -
    -is_pro()) { - $view->advertise_pro(); - } -?> -
    -is_pro()) { - $view->advertise_commercials(); - } - $view->display_edit_dialogs(); - do_action('ure_dialogs_html'); - $view->output_confirmation_dialog(); -?> -
    -
    - ure_object == 'user') { - if (!isset($_REQUEST['user_id'])) { - return false; // user_id value is missed - } - $user_id = $_REQUEST['user_id']; - if (!is_numeric($user_id)) { - return false; - } - if (!$user_id) { - return false; - } - $this->user_to_edit = get_user_to_edit($user_id); - if (empty($this->user_to_edit)) { - return false; - } - } - - return true; - } - // end of check_user_to_edit() - - - protected function init_current_role_name() { - - if (!isset($this->roles[$_POST['user_role']])) { - $mess = esc_html__('Error: ', 'user-role-editor') . esc_html__('Role', 'user-role-editor') . ' ' . esc_html($_POST['user_role']) . ' ' . - esc_html__('does not exist', 'user-role-editor'); - $this->current_role = ''; - $this->current_role_name = ''; - } else { - $this->current_role = $_POST['user_role']; - $this->current_role_name = $this->roles[$this->current_role]['name']; - $mess = ''; - } - - return $mess; - - } - // end of init_current_role_name() - - - /** - * prepare capabilities from user input to save at the database - */ - protected function prepare_capabilities_to_save() { - $this->capabilities_to_save = array(); - foreach ($this->full_capabilities as $available_capability) { - $cap_id_esc = URE_Capability::escape($available_capability['inner']); - if (isset($_POST[$cap_id_esc])) { - $this->capabilities_to_save[$available_capability['inner']] = true; - } - } - } - // end of prepare_capabilities_to_save() - - - /** - * save changes to the roles or user - * @param string $mess - notification message to the user - * @return string - notification message to the user - */ - protected function permissions_object_update($mess) { - - if ($this->ure_object == 'role') { // save role changes to database - if ($this->update_roles()) { - if ($mess) { - $mess .= '
    '; - } - if (!$this->apply_to_all) { - $mess = esc_html__('Role is updated successfully', 'user-role-editor'); - } else { - $mess = esc_html__('Roles are updated for all network', 'user-role-editor'); - } - } else { - if ($mess) { - $mess .= '
    '; - } - $mess = esc_html__('Error occured during role(s) update', 'user-role-editor'); - } - } else { - if ($this->update_user($this->user_to_edit)) { - if ($mess) { - $mess .= '
    '; - } - $mess = esc_html__('User capabilities are updated successfully', 'user-role-editor'); - } else { - if ($mess) { - $mess .= '
    '; - } - $mess = esc_html__('Error occured during user update', 'user-role-editor'); - } - } - return $mess; - } - // end of permissions_object_update() - - - /** - * Process user request - */ - protected function process_user_request() { - - $this->notification = ''; - if (isset($_POST['action'])) { - if (empty($_POST['ure_nonce']) || !wp_verify_nonce($_POST['ure_nonce'], 'user-role-editor')) { - echo '

    Wrong nonce. Action prohibitied.

    '; - exit; - } - - $action = $_POST['action']; - - if ($action == 'reset') { - $this->reset_user_roles(); - exit; - } else if ($action == 'add-new-role') { - // process new role create request - $this->notification = $this->add_new_role(); - } else if ($action == 'rename-role') { - // process rename role request - $this->notification = $this->rename_role(); - } else if ($action == 'delete-role') { - $this->notification = $this->delete_role(); - } else if ($action == 'change-default-role') { - $this->notification = $this->change_default_role(); - } else if ($action == 'caps-readable') { - if ($this->caps_readable) { - $this->caps_readable = 0; - } else { - $this->caps_readable = 1; - } - set_site_transient( 'ure_caps_readable', $this->caps_readable, 600 ); - } else if ($action == 'show-deprecated-caps') { - if ($this->show_deprecated_caps) { - $this->show_deprecated_caps = 0; - } else { - $this->show_deprecated_caps = 1; - } - set_site_transient( 'ure_show_deprecated_caps', $this->show_deprecated_caps, 600 ); - } else if ($action == 'hide-pro-banner') { - $this->hide_pro_banner = 1; - $this->put_option('ure_hide_pro_banner', 1); - $this->flush_options(); - } else if ($action == 'add-new-capability') { - $this->notification = URE_Capability::add(); - } else if ($action == 'delete-user-capability') { - $this->notification = URE_Capability::delete(); - } else if ($action == 'roles_restore_note') { - $this->notification = esc_html__('User Roles are restored to WordPress default values. ', 'user-role-editor'); - } else if ($action == 'update') { - $this->roles = $this->get_user_roles(); - $this->init_full_capabilities(); - if (isset($_POST['user_role'])) { - $this->notification = $this->init_current_role_name(); - } - $this->prepare_capabilities_to_save(); - $this->notification = $this->permissions_object_update($this->notification); - } else { - do_action('ure_process_user_request'); - } // if ($action - } - - } - // end of process_user_request() - - - protected function get_apply_to_all_from_post() { - if (isset($_POST['ure_apply_to_all'])) { - $this->apply_to_all = 1; - } else { - $this->apply_to_all = 0; - } - } - // end of get_apply_to_all_from_post() - - - protected function get_caps_columns_quant() { - if (isset($_POST['caps_columns_quant']) && in_array($_POST['caps_columns_quant'], array(1,2,3))) { - $value = (int) $_POST['caps_columns_quant']; - set_site_transient('ure_caps_columns_quant', $value, self::TRANSIENT_EXPIRATION); - } else { - $value = get_site_transient('ure_caps_columns_quant'); - if ($value===false) { - $value = 1; - } - } - - $this->caps_columns_quant = $value; - } - // end of get_apply_to_all_from_post() - - - public function get_default_role() { - $this->wp_default_role = get_option('default_role'); - } - // end of get_default_role() - - - protected function editor_init0() { - $this->caps_readable = get_site_transient('ure_caps_readable'); - if (false === $this->caps_readable) { - $this->caps_readable = $this->get_option('ure_caps_readable'); - set_site_transient('ure_caps_readable', $this->caps_readable, self::TRANSIENT_EXPIRATION); - } - $this->show_deprecated_caps = get_site_transient('ure_show_deprecated_caps'); - if (false === $this->show_deprecated_caps) { - $this->show_deprecated_caps = $this->get_option('ure_show_deprecated_caps'); - set_site_transient('ure_caps_readable', $this->caps_readable, self::TRANSIENT_EXPIRATION); - } - - $this->hide_pro_banner = $this->get_option('ure_hide_pro_banner', 0); - $this->get_default_role(); - - // could be sent as by POST, as by GET - if (isset($_REQUEST['object'])) { - $this->ure_object = $_REQUEST['object']; - if (!$this->check_user_to_edit()) { - return false; - } - } else { - $this->ure_object = 'role'; - } - - $this->get_apply_to_all_from_post(); - $this->get_caps_columns_quant(); - - return true; - } - // end of editor_init0() - - - public function editor_init1() { - - $this->roles = $this->get_user_roles(); - $this->init_full_capabilities(); - if (empty($this->role_additional_options)) { - $this->role_additional_options = URE_Role_Additional_Options::get_instance($this); - } - - if (!$this->is_pro()) { - require_once(URE_PLUGIN_DIR . 'includes/classes/advertisement.php'); - } - - } - // end of editor_init1() - - - /** - * return id of role last in the list of sorted roles - * - */ - protected function get_last_role_id() { - - // get the key of the last element in roles array - $keys = array_keys($this->roles); - $last_role_id = array_pop($keys); - - return $last_role_id; - } - // end of get_last_role_id() - - - public function get_usermeta_table_name() { - global $wpdb; - - $table_name = (!$this->multisite && defined('CUSTOM_USER_META_TABLE')) ? CUSTOM_USER_META_TABLE : $wpdb->usermeta; - - return $table_name; - } - // end of get_usermeta_table_name() - - - /** - * Check if user has "Administrator" role assigned - * - * @global wpdb $wpdb - * @param int $user_id - * @return boolean returns true is user has Role "Administrator" - */ - public function has_administrator_role($user_id) { - global $wpdb; - - if (empty($user_id) || !is_numeric($user_id)) { - return false; - } - - $table_name = $this->get_usermeta_table_name(); - $meta_key = $wpdb->prefix . 'capabilities'; - $query = "SELECT count(*) - FROM $table_name - WHERE user_id=$user_id AND meta_key='$meta_key' AND meta_value like '%administrator%'"; - $has_admin_role = $wpdb->get_var($query); - if ($has_admin_role > 0) { - $result = true; - } else { - $result = false; - } - // cache checking result for the future use - $this->lib->user_to_check[$user_id] = $result; - - return $result; - } - - // end of has_administrator_role() - - - /** - * Checks if user is allowed to use User Role Editor - * - * @global int $current_user - * @param int $user_id - * @return boolean true - */ - public function user_is_admin($user_id = false) { - global $current_user; - - $ure_key_capability = URE_Own_Capabilities::get_key_capability(); - if (empty($user_id)) { - $user_id = $current_user->ID; - } - $result = user_can($user_id, $ure_key_capability); - - return $result; - } - // end of user_is_admin() - - - - /** - * return array with WordPress user roles - * - * @global WP_Roles $wp_roles - * @global type $wp_user_roles - * @return array - */ - public function get_user_roles() { - - global $wp_roles; - - if (!isset($wp_roles)) { - $wp_roles = new WP_Roles(); - } - - if (!empty($this->bbpress)) { // bbPress plugin is active - $this->roles = $this->bbpress->get_roles(); - } else { - $this->roles = $wp_roles->roles; - } - - if (is_array($this->roles) && count($this->roles) > 0) { - asort($this->roles); - } - - return $this->roles; - } - // end of get_user_roles() - - - /** - * Respect 'editable_roles' filter, when needed - * @return array - */ - public function get_editable_user_roles() { - - if (empty($this->roles)) { - $this->get_user_roles(); - } - if ($this->bbpress!==null) { - remove_filter('editable_roles', 'bbp_filter_blog_editable_roles'); - } - $roles = apply_filters('editable_roles', $this->roles); - if ($this->bbpress!==null) { - add_filter('editable_roles', 'bbp_filter_blog_editable_roles'); - } - - return $roles; - - } - // end of get_editable_user_roles() - - -/* - // restores User Roles from the backup record - protected function restore_user_roles() - { - global $wpdb, $wp_roles; - - $error_message = 'Error! ' . __('Database operation error. Check log file.', 'user-role-editor'); - $option_name = $wpdb->prefix . 'user_roles'; - $backup_option_name = $wpdb->prefix . 'backup_user_roles'; - $query = "select option_value - from $wpdb->options - where option_name='$backup_option_name' - limit 0, 1"; - $option_value = $wpdb->get_var($query); - if ($wpdb->last_error) { - $this->log_event($wpdb->last_error, true); - return $error_message; - } - if ($option_value) { - $query = "update $wpdb->options - set option_value='$option_value' - where option_name='$option_name' - limit 1"; - $record = $wpdb->query($query); - if ($wpdb->last_error) { - $this->log_event($wpdb->last_error, true); - return $error_message; - } - $wp_roles = new WP_Roles(); - $reload_link = wp_get_referer(); - $reload_link = remove_query_arg('action', $reload_link); - $reload_link = esc_url_raw(add_query_arg('action', 'roles_restore_note', $reload_link)); -?> - - prefix . 'backup_user_roles'; - $query = "select option_id - from $wpdb->options - where option_name='$backup_option_name' - limit 0, 1"; - $option_id = $wpdb->get_var($query); - if ($wpdb->last_error) { - $this->log_event($wpdb->last_error, true); - return false; - } - if (!$option_id) { - $roles_option_name = $wpdb->prefix.'user_roles'; - $query = "select option_value - from $wpdb->options - where option_name like '$roles_option_name' limit 0,1"; - $serialized_roles = $wpdb->get_var($query); - // create user roles record backup - $query = "insert into $wpdb->options - (option_name, option_value, autoload) - values ('$backup_option_name', '$serialized_roles', 'no')"; - $record = $wpdb->query($query); - if ($wpdb->last_error) { - $this->log_event($wpdb->last_error, true); - return false; - } - } - - return true; - } - // end of ure_make_roles_backup() - - - protected function role_contains_caps_not_allowed_for_simple_admin($role_id) { - - $result = false; - $role = $this->roles[$role_id]; - if (!is_array($role['capabilities'])) { - return false; - } - foreach (array_keys($role['capabilities']) as $cap) { - if ($this->block_cap_for_single_admin($cap)) { - $result = true; - break; - } - } - - return $result; - } - // end of role_contains_caps_not_allowed_for_simple_admin() - - /** - * return array with roles which we could delete, e.g self-created and not used with any blog user - * - * @global wpdb $wpdb - WP database object - * @return array - */ - public function get_roles_can_delete() { - - $default_role = get_option('default_role'); - $standard_roles = array('administrator', 'editor', 'author', 'contributor', 'subscriber'); - $roles_can_delete = array(); - $users = count_users(); - foreach ($this->roles as $key => $role) { - $can_delete = true; - // check if it is default role for new users - if ($key == $default_role) { - $can_delete = false; - continue; - } - // check if it is standard role - if (in_array($key, $standard_roles)) { - continue; - } - // check if role has capabilities prohibited for the single site administrator - if ($this->role_contains_caps_not_allowed_for_simple_admin($key)) { - continue; - } - - if (!isset($users['avail_roles'][$key])) { - $roles_can_delete[$key] = $role['name'] . ' (' . $key . ')'; - } - } - - return $roles_can_delete; - } - // end of get_roles_can_delete() - - - /** - * return array of built-in WP capabilities (WP 3.1 wp-admin/includes/schema.php) - * - * @return array - */ - public function get_built_in_wp_caps() { - - $caps_groups = URE_Capabilities_Groups_Manager::get_instance(); - $caps = $caps_groups->get_built_in_wp_caps(); - - return $caps; - } - // end of get_built_in_wp_caps() - - - /** - * return the array of unused user capabilities - * - * @global WP_Roles $wp_roles - * @global wpdb $wpdb - * @return array - */ - public function get_caps_to_remove() { - global $wp_roles; - - // build full capabilities list from all roles except Administrator - $full_caps_list = array(); - foreach ($wp_roles->roles as $role) { - // validate if capabilities is an array - if (isset($role['capabilities']) && is_array($role['capabilities'])) { - foreach ($role['capabilities'] as $capability => $value) { - if (!isset($full_caps_list[$capability])) { - $full_caps_list[$capability] = 1; - } - } - } - } - - $caps_to_exclude = $this->get_built_in_wp_caps(); - $ure_caps = URE_Own_Capabilities::get_caps(); - $caps_to_exclude = array_merge($caps_to_exclude, $ure_caps); - - $caps_to_remove = array(); - foreach ($full_caps_list as $capability => $value) { - if (!isset($caps_to_exclude[$capability])) { // do not touch built-in WP caps - // check roles - $cap_in_use = false; - foreach ($wp_roles->role_objects as $wp_role) { - if ($wp_role->name != 'administrator') { - if ($wp_role->has_cap($capability)) { - $cap_in_use = true; - break; - } - } - } - if (!$cap_in_use) { - $caps_to_remove[$capability] = 1; - } - } - } - - return $caps_to_remove; - } - // end of get_caps_to_remove() - - - /** - * Return true if $capability is included to the list of capabilities allowed for the single site administrator - * @param string $capability - capability ID - * @param boolean $ignore_super_admin - if - * @return boolean - */ - public function block_cap_for_single_admin($capability, $ignore_super_admin=false) { - - if (!$this->is_pro()) { // this functionality is for the Pro version only. - return false; - } - - if (!$this->multisite) { // work for multisite only - return false; - } - if (!$ignore_super_admin && $this->is_super_admin()) { // Do not block superadmin - return false; - } - $caps_access_restrict_for_simple_admin = $this->get_option('caps_access_restrict_for_simple_admin', 0); - if (!$caps_access_restrict_for_simple_admin) { - return false; - } - $allowed_caps = $this->get_option('caps_allowed_for_single_admin', array()); - if (in_array($capability, $allowed_caps)) { - $block_this_cap = false; - } else { - $block_this_cap = true; - } - - return $block_this_cap; - } - // end of block_cap_for_single_admin() - - - /** - * Go through all users and if user has non-existing role lower him to Subscriber role - * - */ - protected function validate_user_roles() { - - global $wp_roles; - - $default_role = get_option('default_role'); - if (empty($default_role)) { - $default_role = 'subscriber'; - } - $users_query = new WP_User_Query(array('fields' => 'ID')); - $users = $users_query->get_results(); - foreach ($users as $user_id) { - $user = get_user_by('id', $user_id); - if (is_array($user->roles) && count($user->roles) > 0) { - foreach ($user->roles as $role) { - $user_role = $role; - break; - } - } else { - $user_role = is_array($user->roles) ? '' : $user->roles; - } - if (!empty($user_role) && !isset($wp_roles->roles[$user_role])) { // role doesn't exists - $user->set_role($default_role); // set the lowest level role for this user - $user_role = ''; - } - - if (empty($user_role)) { - // Cleanup users level capabilities from non-existed roles - $cap_removed = true; - while (count($user->caps) > 0 && $cap_removed) { - foreach ($user->caps as $capability => $value) { - if (!isset($this->full_capabilities[$capability])) { - $user->remove_cap($capability); - $cap_removed = true; - break; - } - $cap_removed = false; - } - } // while () - } - } // foreach() - } - // end of validate_user_roles() - - - protected function add_capability_to_full_caps_list($cap_id) { - if (!isset($this->full_capabilities[$cap_id])) { // if capability was not added yet - $cap = array(); - $cap['inner'] = $cap_id; - $cap['human'] = esc_html__($this->convert_caps_to_readable($cap_id), 'user-role-editor'); - if (isset($this->built_in_wp_caps[$cap_id])) { - $cap['wp_core'] = true; - } else { - $cap['wp_core'] = false; - } - - $this->full_capabilities[$cap_id] = $cap; - } - } - // end of add_capability_to_full_caps_list() - - - /** - * Add capabilities from user roles save at WordPress database - * - */ - protected function add_roles_caps() { - foreach ($this->roles as $role) { - // validate if capabilities is an array - if (isset($role['capabilities']) && is_array($role['capabilities'])) { - foreach (array_keys($role['capabilities']) as $cap) { - $this->add_capability_to_full_caps_list($cap); - } - } - } - } - // end of add_roles_caps() - - - /** - * Add Gravity Forms plugin capabilities, if available - * - */ - protected function add_gravity_forms_caps() { - - if (class_exists('GFCommon')) { - $gf_caps = GFCommon::all_caps(); - foreach ($gf_caps as $gf_cap) { - $this->add_capability_to_full_caps_list($gf_cap); - } - } - - } - // end of add_gravity_forms_caps() - - - /** - * Add bbPress plugin user capabilities (if available) - */ - protected function add_bbpress_caps() { - - if (empty($this->bbpress)) { - return; - } - - $caps = $this->bbpress->get_caps(); - foreach ($caps as $cap) { - $this->add_capability_to_full_caps_list($cap); - } - } - // end of add_bbpress_caps() - - - /** - * Provide compatibility with plugins and themes which define their custom user capabilities using - * 'members_get_capabilities' filter from Members plugin - * - */ - protected function add_members_caps() { - - $custom_caps = array(); - $custom_caps = apply_filters( 'members_get_capabilities', $custom_caps ); - foreach ($custom_caps as $cap) { - $this->add_capability_to_full_caps_list($cap); - } - - } - // end of add_members_caps() - - - /** - * Add capabilities assigned directly to user, and not included into any role - * - */ - protected function add_user_caps() { - - if ($this->ure_object=='user') { - foreach(array_keys($this->user_to_edit->caps) as $cap) { - if (!isset($this->roles[$cap])) { // it is the user capability, not role - $this->add_capability_to_full_caps_list($cap); - } - } - } - - } - // end of add_user_caps() - - - /** - * Add built-in WordPress caps in case some were not included to the roles for some reason - * - */ - protected function add_wordpress_caps() { - - foreach (array_keys($this->built_in_wp_caps) as $cap) { - $this->add_capability_to_full_caps_list($cap); - } - - } - // end of add_wordpress_caps() - - - /** - * Return all available post types except non-public WordPress built-in post types - * - * @return array - */ - public function _get_post_types() { - $post_types = get_transient('ure_public_post_types'); - if (empty($post_types)) { - $all_post_types = get_post_types(); - $internal_post_types = get_post_types(array('public'=>false, '_builtin'=>true)); - $post_types = array_diff($all_post_types, $internal_post_types); - set_transient('ure_public_post_types', $post_types, 30); - } - - return $post_types; - } - // end of _get_post_types() - - - public function get_edit_post_capabilities() { - $capabilities = array( - 'create_posts', - 'edit_posts', - 'edit_published_posts', - 'edit_others_posts', - 'edit_private_posts', - 'publish_posts', - 'read_private_posts', - 'delete_posts', - 'delete_private_posts', - 'delete_published_posts', - 'delete_others_posts' - ); - - return $capabilities; - } - // end of get_edit_post_capabilities(); - - - protected function add_custom_post_type_caps() { - - global $wp_roles; - - $capabilities = $this->get_edit_post_capabilities(); - $post_types = get_post_types(array(), 'objects'); - $_post_types = $this->_get_post_types(); - // do not forget attachment post type as it may use the own capabilities set - $attachment_post_type = get_post_type_object('attachment'); - if ($attachment_post_type->cap->edit_posts!=='edit_posts') { - $post_types['attachment'] = $attachment_post_type; - } - - foreach($post_types as $post_type) { - if (!isset($_post_types[$post_type->name])) { - continue; - } - if (!isset($post_type->cap)) { - continue; - } - foreach($capabilities as $capability) { - if (!isset($post_type->cap->$capability)) { - continue; - } - $cap_to_check = $post_type->cap->$capability; - $this->add_capability_to_full_caps_list($cap_to_check); - if (!$this->multisite && - isset($wp_roles->role_objects['administrator']) && - !isset($wp_roles->role_objects['administrator']->capabilities[$cap_to_check])) { - // admin should be capable to edit any posts - $wp_roles->role_objects['administrator']->add_cap($cap_to_check, true); - } - } - } - - if (!$this->multisite && isset($wp_roles->role_objects['administrator'])) { - foreach(array('post', 'page') as $post_type_name) { - $post_type = get_post_type_object($post_type_name); - if ($post_type->cap->create_posts!=='edit_'. $post_type->name .'s') { // 'create' capability is active - if (!isset($wp_roles->role_objects['administrator']->capabilities[$post_type->cap->create_posts])) { - // admin should be capable to create posts and pages - $wp_roles->role_objects['administrator']->add_cap($post_type->cap->create_posts, true); - } - } - } // foreach() - } // if () - - } - // end of add_custom_post_type_caps() - - - /** - * Add capabilities for URE permissions system in case some were excluded from Administrator role - * - */ - protected function add_ure_caps() { - - $key_cap = URE_Own_Capabilities::get_key_capability(); - if (!current_user_can($key_cap)) { - return; - } - $ure_caps = URE_Own_Capabilities::get_caps(); - foreach(array_keys($ure_caps) as $cap) { - $this->add_capability_to_full_caps_list($cap); - } - - } - // end of add_ure_caps() - - - public function init_full_capabilities() { - - $this->built_in_wp_caps = $this->get_built_in_wp_caps(); - $this->full_capabilities = array(); - $this->add_roles_caps(); - $this->add_gravity_forms_caps(); - $this->add_bbpress_caps(); - $this->add_members_caps(); - $this->add_user_caps(); - $this->add_wordpress_caps(); - $this->add_custom_post_type_caps(); - $this->add_ure_caps(); - - unset($this->built_in_wp_caps); - asort($this->full_capabilities); - - $this->full_capabilities = apply_filters('ure_full_capabilites', $this->full_capabilities); - - } - // end of init_full_capabilities() - - - /** - * return WordPress user roles to its initial state, just like after installation - * @global WP_Roles $wp_roles - */ - protected function wp_roles_reinit() { - global $wp_roles; - - $wp_roles->roles = array(); - $wp_roles->role_objects = array(); - $wp_roles->role_names = array(); - $wp_roles->use_db = true; - - require_once(ABSPATH . '/wp-admin/includes/schema.php'); - populate_roles(); - $wp_roles->reinit(); - - $this->roles = $this->get_user_roles(); - - } - // end of wp_roles_reinit() - - /** - * reset user roles to WordPress default roles - */ - protected function reset_user_roles() { - - if (!current_user_can('ure_reset_roles')) { - return esc_html__('Insufficient permissions to work with User Role Editor','user-role-editor'); - } - - $this->wp_roles_reinit(); - URE_Own_Capabilities::init_caps(); - if ($this->is_full_network_synch() || $this->apply_to_all) { - $this->current_role = ''; - $this->direct_network_roles_update(); - } - //$this->validate_user_roles(); // if user has non-existing role lower him to Subscriber role - - $reload_link = wp_get_referer(); - $reload_link = esc_url_raw(remove_query_arg('action', $reload_link)); - ?> - - roles) || !is_array($this->roles) || count($this->roles)==0) { // Nothing to save - something goes wrong - stop ... - return false; - } - - $key_capability = URE_Own_Capabilities::get_key_capability(); - $user_is_ure_admin = current_user_can($key_capability); - if (!$user_is_ure_admin) { - if (in_array($this->current_role, $current_user->roles)) { - // do not allow to a user update his own role if he does not have full access to the User Role Editor - return false; - } - } - - return true; - } - // end of last_check_before_update() - - - // Save Roles to database - protected function save_roles() { - global $wpdb; - - if (!$this->last_check_before_update()) { - return false; - } - if (!isset($this->roles[$this->current_role])) { - return false; - } - - $this->capabilities_to_save = $this->remove_caps_not_allowed_for_single_admin($this->capabilities_to_save); - $this->roles[$this->current_role]['name'] = $this->current_role_name; - $this->roles[$this->current_role]['capabilities'] = $this->capabilities_to_save; - $option_name = $wpdb->prefix . 'user_roles'; - - update_option($option_name, $this->roles); - - // save additional options for the current role - if (empty($this->role_additional_options)) { - $this->role_additional_options = URE_Role_Additional_Options::get_instance($this); - } - $this->role_additional_options->save($this->current_role); - - return true; - } - // end of save_roles() - - - /** - * Update roles for all network using direct database access - quicker in several times - * - * @global wpdb $wpdb - * @return boolean - */ - public function direct_network_roles_update() { - global $wpdb; - - if (!$this->last_check_before_update()) { - return false; - } - if (!empty($this->current_role)) { - $this->roles[$this->current_role]['name'] = $this->current_role_name; - $this->roles[$this->current_role]['capabilities'] = $this->capabilities_to_save; - } - - $serialized_roles = serialize($this->roles); - foreach ($this->blog_ids as $blog_id) { - $prefix = $wpdb->get_blog_prefix($blog_id); - $options_table_name = $prefix . 'options'; - $option_name = $prefix . 'user_roles'; - $query = "update $options_table_name - set option_value='$serialized_roles' - where option_name='$option_name' - limit 1"; - $wpdb->query($query); - if ($wpdb->last_error) { - $this->log_event($wpdb->last_error, true); - return false; - } - // save role additional options - - } - - return true; - } - // end of direct_network_roles_update() - - - public function restore_after_blog_switching($blog_id = 0) { - - if (!empty($blog_id)) { - switch_to_blog($blog_id); - } - // cleanup blog switching data - $GLOBALS['_wp_switched_stack'] = array(); - $GLOBALS['switched'] = ! empty( $GLOBALS['_wp_switched_stack'] ); - } - // end of restore_after_blog_switching() - - - protected function wp_api_network_roles_update() { - global $wpdb; - - $result = true; - $old_blog = $wpdb->blogid; - foreach ($this->blog_ids as $blog_id) { - switch_to_blog($blog_id); - $this->roles = $this->get_user_roles(); - if (!isset($this->roles[$this->current_role])) { // add new role to this blog - $this->roles[$this->current_role] = array('name' => $this->current_role_name, 'capabilities' => array('read' => true)); - } - if (!$this->save_roles()) { - $result = false; - break; - } - } - $this->restore_after_blog_switching($old_blog); - $this->roles = $this->get_user_roles(); - - return $result; - } - // end of wp_api_network_roles_update() - - - /** - * Update role for all network using WordPress API - * - * @return boolean - */ - protected function multisite_update_roles() { - - if ($this->debug) { - $time_shot = microtime(); - } - - if ($this->is_full_network_synch()) { - $result = $this->direct_network_roles_update(); - } else { - $result = $this->wp_api_network_roles_update(); - } - - if ($this->debug) { - echo '
    Roles updated for ' . ( microtime() - $time_shot ) . ' milliseconds
    '; - } - - return $result; - } - // end of multisite_update_roles() - - - /** - * Process user request on update roles - * - * @global wpdb $wpdb - * @return boolean - */ - protected function update_roles() { - global $wp_roles; - - if ($this->multisite && $this->is_super_admin() && $this->apply_to_all) { // update Role for the all blogs/sites in the network (permitted to superadmin only) - if (!$this->multisite_update_roles()) { - return false; - } - } else { - if (!$this->save_roles()) { - return false; - } - } - - // refresh global $wp_roles - $wp_roles = new WP_Roles(); - - return true; - } - // end of update_roles() - - - /** - * Write message to the log file - * - * @global type $wp_version - * @param string $message - * @param boolean $show_message - */ - protected function log_event($message, $show_message = false) { - global $wp_version, $wpdb; - - $file_name = URE_PLUGIN_DIR . 'user-role-editor.log'; - $fh = fopen($file_name, 'a'); - $cr = "\n"; - $s = $cr . date("d-m-Y H:i:s") . $cr . - 'WordPress version: ' . $wp_version . ', PHP version: ' . phpversion() . ', MySQL version: ' . $wpdb->db_version() . $cr; - fwrite($fh, $s); - fwrite($fh, $message . $cr); - fclose($fh); - - if ($show_message) { - $this->show_message('Error! ' . esc_html__('Error is occur. Please check the log file.', 'user-role-editor')); - } - } - // end of log_event() - - - /** - * returns array without capabilities blocked for single site administrators - * @param array $capabilities - * @return array - */ - protected function remove_caps_not_allowed_for_single_admin($capabilities) { - - foreach(array_keys($capabilities) as $cap) { - if ($this->block_cap_for_single_admin($cap)) { - unset($capabilities[$cap]); - } - } - - return $capabilities; - } - // end of remove_caps_not_allowed_for_single_admin() - - - /** - * process new role create request - * - * @global WP_Roles $wp_roles - * - * @return string - message about operation result - * - */ - protected function add_new_role() { - - global $wp_roles; - - if (!current_user_can('ure_create_roles')) { - return esc_html__('Insufficient permissions to work with User Role Editor','user-role-editor'); - } - $mess = ''; - $this->current_role = ''; - if (isset($_POST['user_role_id']) && $_POST['user_role_id']) { - $user_role_id = utf8_decode($_POST['user_role_id']); - // sanitize user input for security - $valid_name = preg_match('/[A-Za-z0-9_\-]*/', $user_role_id, $match); - if (!$valid_name || ($valid_name && ($match[0] != $user_role_id))) { // some non-alphanumeric charactes found! - return esc_html__('Error: Role ID must contain latin characters, digits, hyphens or underscore only!', 'user-role-editor'); - } - $numeric_name = preg_match('/[0-9]*/', $user_role_id, $match); - if ($numeric_name && ($match[0] == $user_role_id)) { // numeric name discovered - return esc_html__('Error: WordPress does not support numeric Role name (ID). Add latin characters to it.', 'user-role-editor'); - } - - if ($user_role_id) { - $user_role_name = isset($_POST['user_role_name']) ? $_POST['user_role_name'] : false; - if (!empty($user_role_name)) { - $user_role_name = sanitize_text_field($user_role_name); - } else { - $user_role_name = $user_role_id; // as user role name is empty, use user role ID instead - } - - if (!isset($wp_roles)) { - $wp_roles = new WP_Roles(); - } - if (isset($wp_roles->roles[$user_role_id])) { - return sprintf('Error! ' . esc_html__('Role %s exists already', 'user-role-editor'), $user_role_id); - } - $user_role_id = strtolower($user_role_id); - $this->current_role = $user_role_id; - - $user_role_copy_from = isset($_POST['user_role_copy_from']) ? $_POST['user_role_copy_from'] : false; - if (!empty($user_role_copy_from) && $user_role_copy_from != 'none' && $wp_roles->is_role($user_role_copy_from)) { - $role = $wp_roles->get_role($user_role_copy_from); - $capabilities = $this->remove_caps_not_allowed_for_single_admin($role->capabilities); - } else { - $capabilities = array('read' => true, 'level_0' => true); - } - // add new role to the roles array - $result = add_role($user_role_id, $user_role_name, $capabilities); - if (!isset($result) || empty($result)) { - $mess = 'Error! ' . esc_html__('Error is encountered during new role create operation', 'user-role-editor'); - } else { - $mess = sprintf(esc_html__('Role %s is created successfully', 'user-role-editor'), $user_role_name); - } - } - } - return $mess; - } - // end of new_role_create() - - - /** - * process rename role request - * - * @global WP_Roles $wp_roles - * - * @return string - message about operation result - * - */ - protected function rename_role() { - - global $wp_roles; - - $mess = ''; - $user_role_id = filter_input(INPUT_POST, 'user_role_id', FILTER_SANITIZE_STRING); - if (empty($user_role_id)) { - return esc_html__('Error: Role ID is empty!', 'user-role-editor'); - } - $user_role_id = utf8_decode($user_role_id); - // sanitize user input for security - $match = array(); - $valid_name = preg_match('/[A-Za-z0-9_\-]*/', $user_role_id, $match); - if (!$valid_name || ($valid_name && ($match[0] != $user_role_id))) { // some non-alphanumeric charactes found! - return esc_html__('Error: Role ID must contain latin characters, digits, hyphens or underscore only!', 'user-role-editor'); - } - $numeric_name = preg_match('/[0-9]*/', $user_role_id, $match); - if ($numeric_name && ($match[0] == $user_role_id)) { // numeric name discovered - return esc_html__('Error: WordPress does not support numeric Role name (ID). Add latin characters to it.', 'user-role-editor'); - } - - $new_role_name = filter_input(INPUT_POST, 'user_role_name', FILTER_SANITIZE_STRING); - if (!empty($new_role_name)) { - $new_role_name = sanitize_text_field($new_role_name); - } else { - return esc_html__('Error: Empty role display name is not allowed.', 'user-role-editor'); - } - - if (!isset($wp_roles)) { - $wp_roles = new WP_Roles(); - } - if (!isset($wp_roles->roles[$user_role_id])) { - return sprintf('Error! ' . esc_html__('Role %s does not exists', 'user-role-editor'), $user_role_id); - } - $this->current_role = $user_role_id; - $this->current_role_name = $new_role_name; - - $old_role_name = $wp_roles->roles[$user_role_id]['name']; - $wp_roles->roles[$user_role_id]['name'] = $new_role_name; - update_option( $wp_roles->role_key, $wp_roles->roles ); - $mess = sprintf(esc_html__('Role %s is renamed to %s successfully', 'user-role-editor'), $old_role_name, $new_role_name); - - return $mess; - } - // end of rename_role() - - - /** - * Deletes user role from the WP database - */ - protected function delete_wp_roles($roles_to_del) { - global $wp_roles; - - if (!current_user_can('ure_delete_roles')) { - return esc_html__('Insufficient permissions to work with User Role Editor','user-role-editor'); - } - if (!isset($wp_roles)) { - $wp_roles = new WP_Roles(); - } - $result = false; - foreach($roles_to_del as $role_id) { - if (!isset($wp_roles->roles[$role_id])) { - $result = false; - break; - } - if ($this->role_contains_caps_not_allowed_for_simple_admin($role_id)) { // do not delete - continue; - } - unset($wp_roles->role_objects[$role_id]); - unset($wp_roles->role_names[$role_id]); - unset($wp_roles->roles[$role_id]); - $result = true; - } // foreach() - if ($result) { - update_option($wp_roles->role_key, $wp_roles->roles); - } - - return $result; - } - // end of delete_wp_roles() - - - protected function delete_all_unused_roles() { - - $this->roles = $this->get_user_roles(); - $roles_to_del = array_keys($this->get_roles_can_delete()); - $result = $this->delete_wp_roles($roles_to_del); - $this->roles = null; // to force roles refresh - - return $result; - } - // end of delete_all_unused_roles() - - - /** - * process user request for user role deletion - * @global WP_Roles $wp_roles - * @return type - */ - protected function delete_role() { - - if (!current_user_can('ure_delete_roles')) { - return esc_html__('Insufficient permissions to work with User Role Editor','user-role-editor'); - } - $mess = ''; - if (isset($_POST['user_role_id']) && $_POST['user_role_id']) { - $role = $_POST['user_role_id']; - if ($role==-1) { // delete all unused roles - $result = $this->delete_all_unused_roles(); - } else { - $result = $this->delete_wp_roles(array($role)); - } - if (empty($result)) { - $mess = 'Error! ' . esc_html__('Error encountered during role delete operation', 'user-role-editor'); - } elseif ($role==-1) { - $mess = sprintf(esc_html__('Unused roles are deleted successfully', 'user-role-editor'), $role); - } else { - $mess = sprintf(esc_html__('Role %s is deleted successfully', 'user-role-editor'), $role); - } - unset($_POST['user_role']); - } - - return $mess; - } - // end of ure_delete_role() - - - /** - * Change default WordPress role - * @global WP_Roles $wp_roles - * @return string - */ - protected function change_default_role() { - global $wp_roles; - - if (!$this->multisite || is_network_admin()) { - return 'Try to misuse the plugin functionality'; - } - $mess = ''; - if (!isset($wp_roles)) { - $wp_roles = new WP_Roles(); - } - if (!empty($_POST['user_role_id'])) { - $user_role_id = $_POST['user_role_id']; - unset($_POST['user_role_id']); - if (isset($wp_roles->role_objects[$user_role_id]) && $user_role_id !== 'administrator') { - $result = update_option('default_role', $user_role_id); - if (empty($result)) { - $mess = 'Error! ' . esc_html__('Error encountered during default role change operation', 'user-role-editor'); - } else { - $this->get_default_role(); - $mess = sprintf(esc_html__('Default role for new users is set to %s successfully', 'user-role-editor'), $wp_roles->role_names[$user_role_id]); - } - } elseif ($user_role_id === 'administrator') { - $mess = 'Error! ' . esc_html__('Can not set Administrator role as a default one', 'user-role-editor'); - } else { - $mess = 'Error! ' . esc_html__('This role does not exist - ', 'user-role-editor') . esc_html($user_role_id); - } - } - - return $mess; - } - // end of change_default_role() - - - /** - * Not really used in the plugin - just storage for the translation strings - */ - protected function translation_data() { -// for the translation purpose - if (false) { -// Standard WordPress roles - __('Editor', 'user-role-editor'); - __('Author', 'user-role-editor'); - __('Contributor', 'user-role-editor'); - __('Subscriber', 'user-role-editor'); -// Standard WordPress capabilities - __('Switch themes', 'user-role-editor'); - __('Edit themes', 'user-role-editor'); - __('Activate plugins', 'user-role-editor'); - __('Edit plugins', 'user-role-editor'); - __('Edit users', 'user-role-editor'); - __('Edit files', 'user-role-editor'); - __('Manage options', 'user-role-editor'); - __('Moderate comments', 'user-role-editor'); - __('Manage categories', 'user-role-editor'); - __('Manage links', 'user-role-editor'); - __('Upload files', 'user-role-editor'); - __('Import', 'user-role-editor'); - __('Unfiltered html', 'user-role-editor'); - __('Edit posts', 'user-role-editor'); - __('Edit others posts', 'user-role-editor'); - __('Edit published posts', 'user-role-editor'); - __('Publish posts', 'user-role-editor'); - __('Edit pages', 'user-role-editor'); - __('Read', 'user-role-editor'); - __('Level 10', 'user-role-editor'); - __('Level 9', 'user-role-editor'); - __('Level 8', 'user-role-editor'); - __('Level 7', 'user-role-editor'); - __('Level 6', 'user-role-editor'); - __('Level 5', 'user-role-editor'); - __('Level 4', 'user-role-editor'); - __('Level 3', 'user-role-editor'); - __('Level 2', 'user-role-editor'); - __('Level 1', 'user-role-editor'); - __('Level 0', 'user-role-editor'); - __('Edit others pages', 'user-role-editor'); - __('Edit published pages', 'user-role-editor'); - __('Publish pages', 'user-role-editor'); - __('Delete pages', 'user-role-editor'); - __('Delete others pages', 'user-role-editor'); - __('Delete published pages', 'user-role-editor'); - __('Delete posts', 'user-role-editor'); - __('Delete others posts', 'user-role-editor'); - __('Delete published posts', 'user-role-editor'); - __('Delete private posts', 'user-role-editor'); - __('Edit private posts', 'user-role-editor'); - __('Read private posts', 'user-role-editor'); - __('Delete private pages', 'user-role-editor'); - __('Edit private pages', 'user-role-editor'); - __('Read private pages', 'user-role-editor'); - __('Delete users', 'user-role-editor'); - __('Create users', 'user-role-editor'); - __('Unfiltered upload', 'user-role-editor'); - __('Edit dashboard', 'user-role-editor'); - __('Update plugins', 'user-role-editor'); - __('Delete plugins', 'user-role-editor'); - __('Install plugins', 'user-role-editor'); - __('Update themes', 'user-role-editor'); - __('Install themes', 'user-role-editor'); - __('Update core', 'user-role-editor'); - __('List users', 'user-role-editor'); - __('Remove users', 'user-role-editor'); - __('Add users', 'user-role-editor'); - __('Promote users', 'user-role-editor'); - __('Edit theme options', 'user-role-editor'); - __('Delete themes', 'user-role-editor'); - __('Export', 'user-role-editor'); - } - } - // end of translation_data() - - - /** - * placeholder - realized at the Pro version - */ - protected function check_blog_user($user) { - - return true; - } - // end of check_blog_user() - - /** - * placeholder - realized at the Pro version - */ - protected function network_update_user($user) { - - return true; - } - // end of network_update_user() - - - /** - * Update user roles and capabilities - * - * @global WP_Roles $wp_roles - * @param WP_User $user - * @return boolean - */ - protected function update_user($user) { - global $wp_roles; - - if ($this->multisite) { - if (!$this->check_blog_user($user)) { - return false; - } - } - - $primary_role = $_POST['primary_role']; - if (empty($primary_role) || !isset($wp_roles->roles[$primary_role])) { - $primary_role = ''; - } - if (function_exists('bbp_filter_blog_editable_roles')) { // bbPress plugin is active - $bbp_user_role = bbp_get_user_role($user->ID); - } else { - $bbp_user_role = ''; - } - - $edit_user_caps_mode = $this->get_edit_user_caps_mode(); - if (!$edit_user_caps_mode) { // readonly mode - $this->capabilities_to_save = $user->caps; - } - - // revoke all roles and capabilities from this user - $user->roles = array(); - $user->remove_all_caps(); - - // restore primary role - if (!empty($primary_role)) { - $user->add_role($primary_role); - } - - // restore bbPress user role if she had one - if (!empty($bbp_user_role)) { - $user->add_role($bbp_user_role); - } - - // add other roles to user - foreach ($_POST as $key => $value) { - $result = preg_match('/^wp_role_(.+)/', $key, $match); - if ($result === 1) { - $role = $match[1]; - if (isset($wp_roles->roles[$role])) { - $user->add_role($role); - if (!$edit_user_caps_mode && isset($this->capabilities_to_save[$role])) { - unset($this->capabilities_to_save[$role]); - } - } - } - } - - - - // add individual capabilities to user - if (count($this->capabilities_to_save) > 0) { - foreach ($this->capabilities_to_save as $key => $value) { - $user->add_cap($key); - } - } - $user->update_user_level_from_caps(); - do_action('profile_update', $user->ID, $user); // in order other plugins may hook to the user permissions update - - if ($this->apply_to_all) { // apply update to the all network - if (!$this->network_update_user($user)) { - return false; - } - } - - return true; - } - // end of update_user() - - - /** - * Returns administrator role ID - * - * @return string - */ - public function get_admin_role() { - - if (isset($this->roles['administrator'])) { - $admin_role_id = 'administrator'; - } else { - // go through all roles and select one with max quant of capabilities included - $max_caps = -1; - $admin_role_id = ''; - foreach(array_keys($this->roles) as $role_id) { - $caps = count($this->roles[$role_id]['capabilities']); - if ($caps>$max_caps) { - $max_caps = $caps; - $admin_role_id = $role_id; - } - } - } - - return $admin_role_id; - } - // end get_admin_role() - - - /** - * Returns text presentation of user roles - * - * @param type $roles user roles list - * @return string - */ - public function roles_text($roles) { - global $wp_roles; - - if (is_array($roles) && count($roles) > 0) { - $role_names = array(); - foreach ($roles as $role) { - $role_names[] = $wp_roles->roles[$role]['name']; - } - $output = implode(', ', $role_names); - } else { - $output = ''; - } - - return $output; - } - // end of roles_text() - - - public function about() { - if ($this->is_pro()) { - return; - } - -?> -

    User Role Editor

    - -

    -
    -
    -
    -
    -
    -
    -
    -
    - - - - -
    -
    -current_role) || !$this->current_role) { - if (isset($_REQUEST['user_role']) && $_REQUEST['user_role'] && isset($this->roles[$_REQUEST['user_role']])) { - $this->current_role = $_REQUEST['user_role']; - } else { - $this->current_role = $this->get_last_role_id(); - } - $this->current_role_name = $this->roles[$this->current_role]['name']; - } - } - // end of set_current_role() - - - public function show_admin_role_allowed() { - $show_admin_role = $this->get_option('show_admin_role', 0); - $show_admin_role = ((defined('URE_SHOW_ADMIN_ROLE') && URE_SHOW_ADMIN_ROLE==1) || $show_admin_role==1) && $this->user_is_admin(); - - return $show_admin_role; - } - // end of show_admin_role() - - - // returns true if $user has $capability assigned through the roles or directly - // returns true if user has role with name equal $capability - public function user_can($capability) { - - if (isset($this->user_to_edit->caps[$capability])) { - return true; - } - foreach ($this->user_to_edit->roles as $role) { - if ($role===$capability) { - return true; - } - if (!empty($this->roles[$role]['capabilities'][$capability])) { - return true; - } - } - - return false; - } - // end of user_can() - - - /** - * Returns true if user has a real super administrator permissions - * It takes into account $this->raised_permissions value, in order do not count a user with temporally raised permissions - * of a real superadmin under WP Multisite - * For WP Singlesite superadmin is a user with 'administrator' role only in opposite the WordPress's is_super_admin(), - * which counts any user with 'delete_users' capability as a superadmin. - * - * @param int $user_id - * @global WP_User $current_user - * @return boolean - */ - public function is_super_admin($user_id = false) { - - if (empty($user_id)) { - $user = wp_get_current_user(); - $user_id = $user->ID; - } else { - $user = get_userdata($user_id); - } - if (!$user || !$user->exists()) { - return false; - } - - if ($this->multisite && !$this->raised_permissions && is_super_admin($user_id)) { - return true; - } - - if (!$this->multisite && $this->user_has_capability($user, 'administrator')) { - return true; - } - - return false; - } - // end of is_super_admin() - - - // Returns true if user is a real superadmin - // Returns true if user has $capability assigned through the roles or directly - // Returns true if user has role with name equal $cap - public function user_has_capability($user, $cap) { - - global $wp_roles; - - if (!is_object($user) || empty($user->ID)) { - return false; - } - if ($this->multisite && !$this->raised_permissions && is_super_admin($user->ID)) { // do not replace with $this->is_super_admin() to exclude recursion - return true; - } - - if (isset($user->caps[$cap])) { - return true; - } - foreach ($user->roles as $role) { - if ($role === $cap) { - return true; - } - if (!empty($wp_roles->roles[$role]['capabilities'][$cap])) { - return true; - } - } - - return false; - } - // end of user_has_capability() - - - public function show_other_default_roles() { - $other_default_roles = $this->get_option('other_default_roles', array()); - foreach ($this->roles as $role_id => $role) { - if ( $role_id=='administrator' || $role_id==$this->wp_default_role ) { - continue; - } - if ( in_array($role_id, $other_default_roles) ) { - $checked = 'checked="checked"'; - } else { - $checked = ''; - } - echo '
    '; - } - - } - // end of show_other_default_roles() - - - public function get_current_role() { - - return $this->current_role; - - } - // end of get_current_role() - - - public function get_edit_user_caps_mode() { - if ($this->multisite && $this->is_super_admin()) { - return 1; - } - - $edit_user_caps = $this->get_option('edit_user_caps', 1); - - return $edit_user_caps; - } - // end of get_edit_user_caps_mode() - - - /** - * Returns comma separated string of capabilities directly (not through the roles) assigned to the user - * - * @global WP_Roles $wp_roles - * @param object $user - * @return string - */ - public function get_edited_user_caps($user) { - global $wp_roles; - - $output = ''; - foreach ($user->caps as $cap => $value) { - if (!$wp_roles->is_role($cap)) { - if ('' != $output) { - $output .= ', '; - } - $output .= $value ? $cap : sprintf(__('Denied: %s'), $cap); - } - } - - return $output; - } - // end of get_edited_user_caps() - - - public function is_user_profile_extention_allowed() { - // Check if we are not at the network admin center - $result = stripos($_SERVER['REQUEST_URI'], 'network/user-edit.php') == false; - - return $result; - } - // end of is_user_profile_extention_allowed() - - - // create assign_role object - public function get_assign_role() { - $assign_role = new URE_Assign_Role($this); - - return $assign_role; - } - // end of get_assign_role() - - - public function get_ure_page_url() { - $page_url = URE_WP_ADMIN_URL . URE_PARENT . '?page=users-' . URE_PLUGIN_FILE; - $object = $this->get_request_var('object', 'get'); - $user_id = $this->get_request_var('user_id', 'get', 'int'); - if ($object=='user' && $user_id>0) { - $page_url .= '&object=user&user_id='. $user_id; - } - - return $page_url; - } - // end of get_ure_page_url() - - - /** - * Compare if current URL path is equal to the required one - * if $path is empty, then just check if URL leads to wp-admin - * @param string $path - * @return boolean - */ - public function is_right_admin_path($path='') { - $result = true; - $admin_url = admin_url($path); - $parsed = parse_url($admin_url); - $full_path = $parsed['path']; - if ( stripos($_SERVER['REQUEST_URI'], $full_path)===false ) { - $result = false; - } - - return $result; - } - // end of is_right_admin_path() - -} -// end of URE_Lib class \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/user-other-roles.php b/wp/wp-content/plugins/user-role-editor/includes/classes/user-other-roles.php deleted file mode 100644 index c126ff82..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/user-other-roles.php +++ /dev/null @@ -1,318 +0,0 @@ -lib = URE_Lib::get_instance(); - $this->set_hooks(); - } - // end of $lib - - - public function set_hooks() { - - if (is_admin()) { - add_filter( 'additional_capabilities_display', array($this, 'additional_capabilities_display'), 10, 1); - add_action( 'admin_print_styles-user-edit.php', array($this, 'load_css') ); - add_action( 'admin_print_styles-user-new.php', array($this, 'load_css') ); - add_action( 'admin_enqueue_scripts', array($this, 'load_js' ) ); - add_action( 'edit_user_profile', array($this, 'edit_user_profile_html'), 10, 1 ); - add_action( 'user_new_form', array($this, 'user_new_form'), 10, 1 ); - add_action( 'profile_update', array($this, 'update'), 10 ); - } - $multisite = $this->lib->get('multisite'); - if ($multisite) { - add_action( 'wpmu_activate_user', array($this, 'add_other_roles'), 10, 1 ); - } - add_action( 'user_register', array($this, 'add_other_roles'), 10, 1 ); - - } - // end of set_hooks() - - - public function additional_capabilities_display($display) { - - $display = false; - - return $display; - - } - // end of additional_capabilities_display() - - - /* - * Load CSS for the user profile edit page - */ - public function load_css() { - - wp_enqueue_style('wp-jquery-ui-dialog'); - wp_enqueue_style('ure-jquery-multiple-select', plugins_url('/css/multiple-select.css', URE_PLUGIN_FULL_PATH), array(), false, 'screen'); - - } - // end of load_css() - - - public function load_js($hook_suffix) { - - if (!in_array($hook_suffix, array('user-edit.php', 'user-new.php'))) { - return; - } - - wp_enqueue_script('jquery-ui-dialog', '', array('jquery-ui-core', 'jquery-ui-button', 'jquery')); - wp_register_script('ure-jquery-multiple-select', plugins_url('/js/jquery.multiple.select.js', URE_PLUGIN_FULL_PATH)); - wp_enqueue_script('ure-jquery-multiple-select'); - wp_register_script('ure-user-profile-other-roles', plugins_url('/js/ure-user-profile-other-roles.js', URE_PLUGIN_FULL_PATH)); - wp_enqueue_script('ure-user-profile-other-roles'); - wp_localize_script('ure-user-profile-other-roles', 'ure_data_user_profile_other_roles', array( - 'wp_nonce' => wp_create_nonce('user-role-editor'), - 'other_roles' => esc_html__('Other Roles', 'user-role-editor'), - 'select_roles' => esc_html__('Select additional roles for this user', 'user-role-editor') - )); - } - // end of load_js() - - - /** - * Returns list of user roles, except 1st one, and bbPress assigned as they are shown by WordPress and bbPress theirselves. - * - * @param type $user WP_User from wp-includes/capabilities.php - * @return array - */ - public function get_roles_array($user) { - - if (!is_array($user->roles) || count($user->roles) <= 1) { - return array(); - } - - // get bbPress assigned user role - if (function_exists('bbp_filter_blog_editable_roles')) { - $bb_press_role = bbp_get_user_role($user->ID); - } else { - $bb_press_role = ''; - } - - $roles = array(); - foreach ($user->roles as $key => $value) { - if (!empty($bb_press_role) && $bb_press_role === $value) { - // exclude bbPress assigned role - continue; - } - $roles[] = $value; - } - array_shift($roles); // exclude primary role which is shown by WordPress itself - - return $roles; - } - // end of get_roles_array() - - - private function roles_select_html($user) { - - global $wp_roles; - - $user_roles = $user->roles; - $primary_role = array_shift($user_roles); - $roles = apply_filters('editable_roles', $wp_roles->roles); // exclude restricted roles if any - if (isset($roles[$primary_role])) { // exclude role assigned to the user as a primary role - unset($roles[$primary_role]); - } - $other_roles = $this->get_roles_array($user); - - echo '
    '."\n"; - - if (is_array($other_roles) && count($other_roles) > 0) { - $other_roles_str = implode(',', $other_roles); - } else { - $other_roles_str = ''; - } - echo ''; - - - $output = $this->lib->roles_text($other_roles); - echo ''. $output .''; - } - // end of roles_select() - - - private function user_profile_capabilities($user) { - global $current_user; - - $user_caps = $this->lib->get_edited_user_caps($user); -?> - - - - - -'; - if ($this->lib->user_is_admin($current_user->ID)) { - echo 'ID}", "ure_user_{$user->ID}") . '">' . - esc_html__('Edit', 'user-role-editor') . ''; - } -?> - - - - - - - - -user_profile_capabilities($user); - } -?> -
    -roles_select_html($user); -?> -
    - lib->is_user_profile_extention_allowed()) { - return; - } - $show = apply_filters('ure_show_additional_capabilities_section', true); - if (empty($show)) { - return; - } -?> -

    -display($user, 'user-edit'); - } - // end of edit_user_profile() - - - public function user_new_form($context) { - $show = apply_filters('ure_show_additional_capabilities_section', true); - if (empty($show)) { - return; - } - - $user = new WP_User(); -?> - -display($user, $context); -?> -
    -roles[$role_id])) { // skip unexisted roles - continue; - } - if (is_array($user->roles) && !in_array($role_id, $user->roles)) { - $ure_other_roles[] = $role_id; - } - } - foreach ($ure_other_roles as $role) { - $user->add_role($role); - } - - return true; - } - // end of update() - - - private function add_default_other_roles($user_id) { - $user = get_user_by('id', $user_id); - if (empty($user->ID)) { - return; - } - - // Get default roles if any - $other_default_roles = $this->lib->get_option('other_default_roles', array()); - if (count($other_default_roles) == 0) { - return; - } - foreach ($other_default_roles as $role) { - if (!isset($user->caps[$role])) { - $user->add_role($role); - } - } - } - - // end of add_default_other_roles() - - - public function add_other_roles($user_id) { - - if (empty($user_id)) { - return; - } - - $result = $this->update($user_id); - if ($result) { // roles were assigned manually - return; - } - - $this->add_default_other_roles($user_id); - } - // end of add_other_roles() - - - -} -// end of URE_User_Other_Roles class diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/user-role-editor.php b/wp/wp-content/plugins/user-role-editor/includes/classes/user-role-editor.php deleted file mode 100644 index e724b109..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/user-role-editor.php +++ /dev/null @@ -1,936 +0,0 @@ -lib)) { - $this->lib = URE_Lib::get_instance('user_role_editor'); - } - - $this->user_other_roles = new URE_User_Other_Roles(); - - if ($this->lib->is_pro()) { - $this->main_page_hook_suffix = 'users_page_users-user-role-editor-pro'; - $this->settings_hook_suffix = 'settings_page_settings-user-role-editor-pro'; - } else { - $this->main_page_hook_suffix = 'users_page_users-user-role-editor'; - $this->settings_hook_suffix = 'settings_page_settings-user-role-editor'; - } - $this->ure_hook_suffixes = array($this->settings_hook_suffix, $this->main_page_hook_suffix); - - // activation action - register_activation_hook(URE_PLUGIN_FULL_PATH, array($this, 'setup')); - - // deactivation action - register_deactivation_hook(URE_PLUGIN_FULL_PATH, array($this, 'cleanup')); - - // Who can use this plugin - $this->key_capability = URE_Own_Capabilities::get_key_capability(); - - // Process URE's internal tasks queue - $task_queue = URE_Task_Queue::get_instance(); - $task_queue->process(); - - $this->set_hooks(); - - } - // end of __construct() - - - private function set_hooks() { - $multisite = $this->lib->get('multisite'); - if ($multisite) { - // new blog may be registered not at admin back-end only but automatically after new user registration, e.g. - // Gravity Forms User Registration Addon does - add_action( 'wpmu_new_blog', array($this, 'duplicate_roles_for_new_blog'), 10, 2); - } - - // setup additional options hooks for the roles - add_action('init', array($this, 'set_role_additional_options_hooks'), 9); - - if (!is_admin()) { - return; - } - - add_action('admin_init', array($this, 'plugin_init'), 1); - - // Add the translation function after the plugins loaded hook. - add_action('plugins_loaded', array($this, 'load_translation')); - - // add own submenu - add_action('admin_menu', array($this, 'plugin_menu')); - - if ($multisite) { - // add own submenu - add_action('network_admin_menu', array($this, 'network_plugin_menu')); - } - - - // add a Settings link in the installed plugins page - add_filter('plugin_action_links_'. URE_PLUGIN_BASE_NAME, array($this, 'plugin_action_links'), 10, 1); - add_filter('plugin_row_meta', array($this, 'plugin_row_meta'), 10, 2); - } - // end of set_hooks() - - - /** - * True - if it's an instance of Pro version, false - for free version - * @return boolean - */ - public function is_pro() { - - return $this->lib->is_pro(); - } - // end of is_pro() - - - /** - * Plugin initialization - * - */ - public function plugin_init() { - - global $current_user, $pagenow; - - if (!empty($current_user->ID)) { - $user_id = $current_user->ID; - } else { - $user_id = 0; - } - - $supress_protection = apply_filters('ure_supress_administrators_protection', false); - // these filters and actions should prevent editing users with administrator role - // by other users with 'edit_users' capability - if (!$supress_protection && !$this->lib->user_is_admin($user_id)) { - new URE_Protect_Admin($this->lib); - } - - add_action('admin_enqueue_scripts', array($this, 'admin_load_js')); - add_action('user_row_actions', array($this, 'user_row'), 10, 2); - add_filter('all_plugins', array($this, 'exclude_from_plugins_list')); - - $multisite = $this->lib->get('multisite'); - if ($multisite) { - $allow_edit_users_to_not_super_admin = $this->lib->get_option('allow_edit_users_to_not_super_admin', 0); - if ($allow_edit_users_to_not_super_admin) { - add_filter('map_meta_cap', array($this, 'restore_users_edit_caps'), 1, 4); - remove_all_filters('enable_edit_any_user_configuration'); - add_filter('enable_edit_any_user_configuration', '__return_true'); - add_action('admin_head', array($this, 'edit_user_permission_check'), 1); - if ($pagenow == 'user-new.php') { - add_filter('site_option_site_admins', array($this, 'allow_add_user_as_superadmin')); - } - } - } else { - $count_users_without_role = $this->lib->get_option('count_users_without_role', 0); - if ($count_users_without_role) { - add_action('restrict_manage_users', array($this, 'move_users_from_no_role_button')); - add_action('admin_head', array($this, 'add_css_to_users_page')); - add_action('admin_footer', array($this, 'add_js_to_users_page')); - } - } - - new URE_Grant_Roles(); - - add_action('wp_ajax_ure_ajax', array($this, 'ure_ajax')); - } - // end of plugin_init() - - - /** - * Allow non-superadmin user to add/create users to the site as superadmin does. - * Include current user to the list of superadmins - for the user-new.php page only, and - * if user really can create_users and promote_users - * @global string $page - * @param array $site_admins - * @return array - */ - public function allow_add_user_as_superadmin($site_admins) { - - global $pagenow, $current_user; - - $this->lib->set_raised_permissions(false); - - if ($pagenow!=='user-new.php') { - return $site_admins; - } - - // Check if current user really can create and promote users - remove_filter('site_option_site_admins', array($this, 'allow_add_user_as_superadmin')); - $can_add_user = current_user_can('create_users') && current_user_can('promote_users'); - add_filter('site_option_site_admins', array($this, 'allow_add_user_as_superadmin')); - - if (!$can_add_user) { - return $site_admins; // no help in this case - } - - if (!in_array($current_user->user_login, $site_admins)) { - $this->lib->set_raised_permissions(true); - $site_admins[] = $current_user->user_login; - } - - return $site_admins; - - } - // end of allow_add_user_as_superadmin() - - - public function move_users_from_no_role_button() { - - if (!$this->lib->is_right_admin_path('users.php')) { - return; - } - - $assign_role = $this->lib->get_assign_role(); - $users_quant = $assign_role->count_users_without_role(); - if ($users_quant>0) { -?> -    -
    -
    -
    -lib->is_right_admin_path('users.php')) { - return; - } - - wp_enqueue_style('wp-jquery-ui-dialog'); - wp_enqueue_style('ure-admin-css', URE_PLUGIN_URL . 'css/ure-admin.css', array(), false, 'screen'); - - } - // end of add_css_to_users_page() - - - public function add_js_to_users_page() { - - if (isset($_GET['page'])) { - return; - } - if (!$this->lib->is_right_admin_path('users.php')) { - return; - } - - wp_enqueue_script('jquery-ui-dialog', '', array('jquery-ui-core','jquery-ui-button', 'jquery') ); - wp_register_script( 'ure-users-js', plugins_url( '/js/ure-users.js', URE_PLUGIN_FULL_PATH ) ); - wp_enqueue_script ( 'ure-users-js' ); - wp_localize_script( 'ure-users-js', 'ure_users_data', array( - 'wp_nonce' => wp_create_nonce('user-role-editor'), - 'move_from_no_role_title' => esc_html__('Change role for users without role', 'user-role-editor'), - 'to' => esc_html__('To:', 'user-role-editor'), - 'no_rights_caption' => esc_html__('No rights', 'user-role-editor'), - 'provide_new_role_caption' => esc_html__('Provide new role', 'user-role-editor') - )); - - } - // end of add_js_to_users_page() - - - /** - * restore edit_users, delete_users, create_users capabilities for non-superadmin users under multisite - * (code is provided by http://wordpress.org/support/profile/sjobidoo) - * - * @param type $caps - * @param type $cap - * @param type $user_id - * @param type $args - * @return type - */ - public function restore_users_edit_caps($caps, $cap, $user_id, $args) { - - foreach ($caps as $key => $capability) { - - if ($capability != 'do_not_allow') - continue; - - switch ($cap) { - case 'edit_user': - case 'edit_users': - $caps[$key] = 'edit_users'; - break; - case 'delete_user': - case 'delete_users': - $caps[$key] = 'delete_users'; - break; - case 'create_users': - $caps[$key] = $cap; - break; - } - } - - return $caps; - } - // end of restore_user_edit_caps() - - - /** - * Checks that both the editing user and the user being edited are - * members of the blog and prevents the super admin being edited. - * (code is provided by http://wordpress.org/support/profile/sjobidoo) - * - */ - public function edit_user_permission_check() { - global $current_user, $profileuser; - - wp_get_current_user(); - if ($current_user->ID===0) { - return; - } - if ($this->lib->is_super_admin()) { // Superadmin may do all - return; - } - - $screen = get_current_screen(); - if (empty($screen)) { - return; - } - - if ($screen->base !== 'user-edit' && $screen->base !== 'user-edit-network') { - return; - } - - // editing a user profile: it's correct to call is_super_admin() directly here, as permissions are raised for the $current_user only - if (!$this->lib->is_super_admin($current_user->ID) && is_super_admin($profileuser->ID)) { // trying to edit a superadmin while himself is less than a superadmin - wp_die(esc_html__('You do not have permission to edit this user.', 'user-role-editor')); - } elseif (!( is_user_member_of_blog($profileuser->ID, get_current_blog_id()) && is_user_member_of_blog($current_user->ID, get_current_blog_id()) )) { // editing user and edited user aren't members of the same blog - wp_die(esc_html__('You do not have permission to edit this user.', 'user-role-editor')); - } - - } - // end of edit_user_permission_check() - - - /** - * Add/hide edit actions for every user row at the users list - * - * @global type $pagenow - * @global type $current_user - * @param string $actions - * @param type $user - * @return string - */ - public function user_row($actions, $user) { - - global $pagenow, $current_user; - - if ($pagenow == 'users.php') { - if ($current_user->has_cap($this->key_capability)) { - $actions['capabilities'] = 'ID}", "ure_user_{$user->ID}") . - '">' . esc_html__('Capabilities', 'user-role-editor') . ''; - } - } - - return $actions; - } - - // end of user_row() - - - /** - * every time when new blog created - duplicate to it roles from the main blog (1) - * @global wpdb $wpdb - * @global WP_Roles $wp_roles - * @param int $blog_id - * @param int $user_id - * - */ - public function duplicate_roles_for_new_blog($blog_id) - { - - global $wpdb, $wp_roles; - - // get Id of 1st (main) blog - $main_blog_id = $this->lib->get_main_blog_id(); - if ( empty($main_blog_id) ) { - return; - } - $current_blog = $wpdb->blogid; - switch_to_blog( $main_blog_id ); - $main_roles = new WP_Roles(); // get roles from primary blog - $default_role = get_option('default_role'); // get default role from primary blog - switch_to_blog($blog_id); // switch to the new created blog - $main_roles->use_db = false; // do not touch DB - $main_roles->add_cap('administrator', 'dummy_123456'); // just to save current roles into new blog - $main_roles->role_key = $wp_roles->role_key; - $main_roles->use_db = true; // save roles into new blog DB - $main_roles->remove_cap('administrator', 'dummy_123456'); // remove unneeded dummy capability - update_option('default_role', $default_role); // set default role for new blog as it set for primary one - switch_to_blog($current_blog); // return to blog where we were at the begin - } - // end of duplicate_roles_for_new_blog() - - - /** - * Filter out URE plugin from not admin users to prevent its not authorized deactivation - * @param type array $plugins plugins list - * @return type array $plugins updated plugins list - */ - public function exclude_from_plugins_list($plugins) { - $multisite = $this->lib->get('multisite'); - // if multi-site, then allow plugin activation for network superadmins and, if that's specially defined, - for single site administrators too - if ($multisite) { - if ($this->lib->is_super_admin() || $this->lib->user_is_admin()) { - return $plugins; - } - } else { -// is_super_admin() defines superadmin for not multisite as user who can 'delete_users' which I don't like. -// So let's check if user has 'administrator' role better. - if (current_user_can('administrator') || $this->lib->user_is_admin()) { - return $plugins; - } - } - - // exclude URE from plugins list - $key = basename(URE_PLUGIN_DIR) . '/' . URE_PLUGIN_FILE; - unset($plugins[$key]); - - return $plugins; - } - // end of exclude_from_plugins_list() - - - /** - * Load plugin translation files - linked to the 'plugins_loaded' action - * - */ - function load_translation() { - - load_plugin_textdomain('user-role-editor', '', dirname( plugin_basename( URE_PLUGIN_FULL_PATH ) ) .'/lang'); - - } - // end of ure_load_translation() - - - /** - * Modify plugin action links - * - * @param array $links - * @return array - */ - public function plugin_action_links($links) { - $single_site_settings_link = '' . esc_html__('Settings', 'user-role-editor') .''; - $multisite = $this->lib->get('multisite'); - if (!$multisite ) { - $settings_link = $single_site_settings_link; - } else { - $ure = basename(URE_PLUGIN_DIR) . '/' . URE_PLUGIN_FILE; - $active_for_network = is_plugin_active_for_network($ure); - if (!$active_for_network) { - $settings_link = $single_site_settings_link; - } else { - if (!current_user_can('manage_network_plugins')) { - return $links; - } - $settings_link = ''. esc_html__('Settings', 'user-role-editor') .''; - } - } - array_unshift($links, $settings_link); - - return $links; - } - // end of plugin_action_links() - - - public function plugin_row_meta($links, $file) { - - if ($file == plugin_basename(dirname(URE_PLUGIN_FULL_PATH) .'/'.URE_PLUGIN_FILE)) { - $links[] = '' . esc_html__('Changelog', 'user-role-editor') . ''; - } - - return $links; - } - - // end of plugin_row_meta - - - public function settings_screen_configure() { - $multisite = $this->lib->get('multisite'); - $settings_page_hook = $this->settings_page_hook; - if ($multisite) { - $settings_page_hook .= '-network'; - } - $screen = get_current_screen(); - // Check if current screen is URE's settings page - if ($screen->id != $settings_page_hook) { - return; - } - $screen_help = new Ure_Screen_Help(); - $screen->add_help_tab( array( - 'id' => 'general', - 'title' => esc_html__('General', 'user-role-editor'), - 'content' => $screen_help->get_settings_help('general') - )); - if ($this->lib->is_pro() || !$multisite) { - $screen->add_help_tab( array( - 'id' => 'additional_modules', - 'title' => esc_html__('Additional Modules', 'user-role-editor'), - 'content' => $screen_help->get_settings_help('additional_modules') - )); - } - $screen->add_help_tab( array( - 'id' => 'default_roles', - 'title' => esc_html__('Default Roles', 'user-role-editor'), - 'content' => $screen_help->get_settings_help('default_roles') - )); - if ($multisite) { - $screen->add_help_tab( array( - 'id' => 'multisite', - 'title' => esc_html__('Multisite', 'user-role-editor'), - 'content' => $screen_help->get_settings_help('multisite') - )); - } - } - // end of settings_screen_configure() - - - public function plugin_menu() { - - $translated_title = esc_html__('User Role Editor', 'user-role-editor'); - if (function_exists('add_submenu_page')) { - $ure_page = add_submenu_page( - 'users.php', - $translated_title, - $translated_title, - 'ure_edit_roles', - 'users-' . URE_PLUGIN_FILE, - array($this, 'edit_roles')); - add_action("admin_print_styles-$ure_page", array($this, 'admin_css_action')); - } - - $multisite = $this->lib->get('multisite'); - $active_for_network = $this->lib->get('active_for_network'); - if ( !$multisite || ($multisite && !$active_for_network) ) { - $settings_capability = URE_Own_Capabilities::get_settings_capability(); - $this->settings_page_hook = add_options_page( - $translated_title, - $translated_title, - $settings_capability, - 'settings-' . URE_PLUGIN_FILE, - array($this, 'settings')); - add_action( 'load-'.$this->settings_page_hook, array($this,'settings_screen_configure') ); - add_action("admin_print_styles-{$this->settings_page_hook}", array($this, 'admin_css_action')); - } - } - // end of plugin_menu() - - - public function network_plugin_menu() { - if (is_multisite()) { - $translated_title = esc_html__('User Role Editor', 'user-role-editor'); - $this->settings_page_hook = add_submenu_page( - 'settings.php', - $translated_title, - $translated_title, - $this->key_capability, - 'settings-' . URE_PLUGIN_FILE, - array(&$this, 'settings')); - add_action( 'load-'.$this->settings_page_hook, array($this,'settings_screen_configure') ); - add_action("admin_print_styles-{$this->settings_page_hook}", array($this, 'admin_css_action')); - } - - } - - // end of network_plugin_menu() - - - protected function get_settings_action() { - - $action = 'show'; - $update_buttons = array('ure_settings_update', 'ure_addons_settings_update', 'ure_settings_ms_update', 'ure_default_roles_update'); - foreach($update_buttons as $update_button) { - if (!isset($_POST[$update_button])) { - continue; - } - if (!wp_verify_nonce($_POST['_wpnonce'], 'user-role-editor')) { - wp_die('Security check failed'); - } - $action = $update_button; - break; - } - - return $action; - - } - // end of get_settings_action() - - /** - * Update General Options tab - */ - protected function update_general_options() { - if (defined('URE_SHOW_ADMIN_ROLE') && (URE_SHOW_ADMIN_ROLE == 1)) { - $show_admin_role = 1; - } else { - $show_admin_role = $this->lib->get_request_var('show_admin_role', 'checkbox'); - } - $this->lib->put_option('show_admin_role', $show_admin_role); - - $caps_readable = $this->lib->get_request_var('caps_readable', 'checkbox'); - $this->lib->put_option('ure_caps_readable', $caps_readable); - - $show_deprecated_caps = $this->lib->get_request_var('show_deprecated_caps', 'checkbox'); - $this->lib->put_option('ure_show_deprecated_caps', $show_deprecated_caps); - - $confirm_role_update = $this->lib->get_request_var('confirm_role_update', 'checkbox'); - $this->lib->put_option('ure_confirm_role_update', $confirm_role_update); - - $edit_user_caps = $this->lib->get_request_var('edit_user_caps', 'checkbox'); - $this->lib->put_option('edit_user_caps', $edit_user_caps); - - do_action('ure_settings_update1'); - - $this->lib->flush_options(); - $this->lib->show_message(esc_html__('User Role Editor options are updated', 'user-role-editor')); - - } - // end of update_general_options() - - - /** - * Update Additional Modules Options tab - */ - protected function update_addons_options() { - $multisite = $this->lib->get('multisite'); - if (!$multisite) { - $count_users_without_role = $this->lib->get_request_var('count_users_without_role', 'checkbox'); - $this->lib->put_option('count_users_without_role', $count_users_without_role); - } - do_action('ure_settings_update2'); - - $this->lib->flush_options(); - $this->lib->show_message(esc_html__('User Role Editor options are updated', 'user-role-editor')); - } - // end of update_addons_options() - - - protected function update_default_roles() { - global $wp_roles; - - // Primary default role - $primary_default_role = $this->lib->get_request_var('default_user_role', 'post'); - if (!empty($primary_default_role) && isset($wp_roles->role_objects[$primary_default_role]) && $primary_default_role !== 'administrator') { - update_option('default_role', $primary_default_role); - } - - // Other default roles - $other_default_roles = array(); - foreach($_POST as $key=>$value) { - $prefix = substr($key, 0, 8); - if ($prefix!=='wp_role_') { - continue; - } - $role_id = substr($key, 8); - if ($role_id!=='administrator' && isset($wp_roles->role_objects[$role_id])) { - $other_default_roles[] = $role_id; - } - } // foreach() - $this->lib->put_option('other_default_roles', $other_default_roles, true); - - $this->lib->show_message(esc_html__('Default Roles are updated', 'user-role-editor')); - } - // end of update_default_roles() - - - protected function update_multisite_options() { - $multisite = $this->lib->get('multisite'); - if (!$multisite) { - return; - } - - $allow_edit_users_to_not_super_admin = $this->lib->get_request_var('allow_edit_users_to_not_super_admin', 'checkbox'); - $this->lib->put_option('allow_edit_users_to_not_super_admin', $allow_edit_users_to_not_super_admin); - - do_action('ure_settings_ms_update'); - - $this->lib->flush_options(); - $this->lib->show_message(esc_html__('User Role Editor options are updated', 'user-role-editor')); - - } - // end of update_multisite_options() - - - public function settings() { - $settings_capability = URE_Own_Capabilities::get_settings_capability(); - if (!current_user_can($settings_capability)) { - wp_die(esc_html__( 'You do not have sufficient permissions to manage options for User Role Editor.', 'user-role-editor' )); - } - $action = $this->get_settings_action(); - switch ($action) { - case 'ure_settings_update': - $this->update_general_options(); - break; - case 'ure_addons_settings_update': - $this->update_addons_options(); - break; - case 'ure_settings_ms_update': - $this->update_multisite_options(); - break; - case 'ure_default_roles_update': - $this->update_default_roles(); - case 'show': - default: - ; - } // switch() - - if (defined('URE_SHOW_ADMIN_ROLE') && (URE_SHOW_ADMIN_ROLE == 1)) { - $show_admin_role = 1; - } else { - $show_admin_role = $this->lib->get_option('show_admin_role', 0); - } - $caps_readable = $this->lib->get_option('ure_caps_readable', 0); - $show_deprecated_caps = $this->lib->get_option('ure_show_deprecated_caps', 0); - $confirm_role_update = $this->lib->get_option('ure_confirm_role_update', 1); - $edit_user_caps = $this->lib->get_option('edit_user_caps', 1); - $multisite = $this->lib->get('multisite'); - if ($multisite) { - $allow_edit_users_to_not_super_admin = $this->lib->get_option('allow_edit_users_to_not_super_admin', 0); - } else { - $count_users_without_role = $this->lib->get_option('count_users_without_role', 0); - } - - $this->lib->get_default_role(); - $view = new URE_Role_View(); - $view->role_default_prepare_html(0); - - $ure_tab_idx = $this->lib->get_request_var('ure_tab_idx', 'int'); - - do_action('ure_settings_load'); - - if ($multisite && is_network_admin()) { - $link = 'settings.php'; - } else { - $link = 'options-general.php'; - } - - $active_for_network = $this->lib->get('active_for_network'); - $license_key_only = $multisite && is_network_admin() && !$active_for_network; - - - require_once(URE_PLUGIN_DIR . 'includes/settings-template.php'); - } - // end of settings() - - - public function admin_css_action() { - - wp_enqueue_style('wp-jquery-ui-dialog'); - wp_enqueue_style('wp-jquery-ui-selectable'); - if (stripos($_SERVER['REQUEST_URI'], 'settings-user-role-editor')!==false) { - wp_enqueue_style('ure-jquery-ui-tabs', URE_PLUGIN_URL . 'css/jquery-ui-1.10.4.custom.min.css', array(), false, 'screen'); - } - wp_enqueue_style('ure-admin-css', URE_PLUGIN_URL . 'css/ure-admin.css', array(), false, 'screen'); - } - // end of admin_css_action() - - - // call roles editor page - public function edit_roles() { - - if (!current_user_can('ure_edit_roles')) { - wp_die(esc_html__('Insufficient permissions to work with User Role Editor', 'user-role-editor')); - } - - $this->lib->editor(); - } - // end of edit_roles() - - - /** - * execute on plugin activation - */ - function setup() { - - $this->lib->make_roles_backup(); - URE_Own_Capabilities::init_caps(); - - $task_queue = URE_Task_Queue::get_instance(); - $task_queue->add('on_activation'); - - } - // end of setup() - - - protected function load_main_page_js() { - - $confirm_role_update = $this->lib->get_option('ure_confirm_role_update', 1); - $page_url = $this->lib->get_ure_page_url(); - - wp_enqueue_script('jquery-ui-dialog', '', array('jquery-ui-core', 'jquery-ui-button', 'jquery')); - wp_enqueue_script('jquery-ui-selectable', '', array('jquery-ui-core', 'jquery')); - wp_register_script('ure-js', plugins_url('/js/ure-js.js', URE_PLUGIN_FULL_PATH)); - wp_enqueue_script('ure-js'); - wp_localize_script('ure-js', 'ure_data', array( - 'wp_nonce' => wp_create_nonce('user-role-editor'), - 'network_admin' => is_network_admin() ? 1 : 0, - 'page_url' => $page_url, - 'is_multisite' => is_multisite() ? 1 : 0, - 'confirm_role_update' => $confirm_role_update ? 1 : 0, - 'confirm_title' => esc_html__('Confirm', 'user-role-editor'), - 'yes_label' => esc_html__('Yes', 'user-role-editor'), - 'no_label' => esc_html__('No', 'user-role-editor'), - 'select_all' => esc_html__('Select All', 'user-role-editor'), - 'unselect_all' => esc_html__('Unselect All', 'user-role-editor'), - 'reverse' => esc_html__('Reverse', 'user-role-editor'), - 'update' => esc_html__('Update', 'user-role-editor'), - 'confirm_submit' => esc_html__('Please confirm permissions update', 'user-role-editor'), - 'add_new_role_title' => esc_html__('Add New Role', 'user-role-editor'), - 'rename_role_title' => esc_html__('Rename Role', 'user-role-editor'), - 'role_name_required' => esc_html__(' Role name (ID) can not be empty!', 'user-role-editor'), - 'role_name_valid_chars' => esc_html__(' Role name (ID) must contain latin characters, digits, hyphens or underscore only!', 'user-role-editor'), - 'numeric_role_name_prohibited' => esc_html__(' WordPress does not support numeric Role name (ID). Add latin characters to it.', 'user-role-editor'), - 'add_role' => esc_html__('Add Role', 'user-role-editor'), - 'rename_role' => esc_html__('Rename Role', 'user-role-editor'), - 'delete_role' => esc_html__('Delete Role', 'user-role-editor'), - 'cancel' => esc_html__('Cancel', 'user-role-editor'), - 'add_capability' => esc_html__('Add Capability', 'user-role-editor'), - 'delete_capability' => esc_html__('Delete Capability', 'user-role-editor'), - 'reset' => esc_html__('Reset', 'user-role-editor'), - 'reset_warning' => esc_html__('DANGER! Resetting will restore default settings from WordPress Core.', 'user-role-editor') . "\n\n" . - esc_html__('If any plugins have changed capabilities in any way upon installation (such as S2Member, WooCommerce, and many more), those capabilities will be DELETED!', 'user-role-editor') . "\n\n" . - esc_html__('For more information on how to undo changes and restore plugin capabilities go to', 'user-role-editor') . "\n" . - 'http://role-editor.com/how-to-restore-deleted-wordpress-user-roles/' . "\n\n" . - esc_html__('Continue?', 'user-role-editor'), - 'default_role' => esc_html__('Default Role', 'user-role-editor'), - 'set_new_default_role' => esc_html__('Set New Default Role', 'user-role-editor'), - 'delete_capability' => esc_html__('Delete Capability', 'user-role-editor'), - 'delete_capability_warning' => esc_html__('Warning! Be careful - removing critical capability could crash some plugin or other custom code', 'user-role-editor'), - 'capability_name_required' => esc_html__(' Capability name (ID) can not be empty!', 'user-role-editor'), - 'capability_name_valid_chars' => esc_html__(' Capability name (ID) must contain latin characters, digits, hyphens or underscore only!', 'user-role-editor'), - )); - - // load additional JS stuff for Pro version, if exists - do_action('ure_load_js'); - - } - // end of load_main_page_js() - - - protected function load_settings_js() { - - wp_enqueue_script('jquery-ui-tabs', '', array('jquery-ui-core', 'jquery')); - do_action('ure_load_js_settings'); - - } - // end of load_settings_js() - - - /** - * Load plugin javascript stuff - * - * @param string $hook_suffix - */ - public function admin_load_js($hook_suffix) { - - URE_Known_JS_CSS_Compatibility_Issues::fix($hook_suffix, $this->ure_hook_suffixes); - - if ($hook_suffix==$this->main_page_hook_suffix) { - $this->load_main_page_js(); - } elseif($hook_suffix==$this->settings_hook_suffix) { - $this->load_settings_js(); - } - - } - // end of admin_load_js() - - - public function ure_ajax() { - - $ajax_processor = new URE_Ajax_Processor($this->lib); - $ajax_processor->dispatch(); - - } - // end of ure_ajax() - - - public function set_role_additional_options_hooks() { - - $role_additional_options = URE_Role_Additional_Options::get_instance($this->lib); - $role_additional_options->set_active_items_hooks(); - - } - // end of set_role_additional_options_hooks() - - - // execute on plugin deactivation - function cleanup() { - - } - // end of setup() - - -} -// end of User_Role_Editor diff --git a/wp/wp-content/plugins/user-role-editor/includes/classes/user-view.php b/wp/wp-content/plugins/user-role-editor/includes/classes/user-view.php deleted file mode 100644 index 806acbb4..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/classes/user-view.php +++ /dev/null @@ -1,207 +0,0 @@ - - * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya - **/ -class URE_User_View extends URE_View { - - private $lib = null; - private $user_to_edit = null; - - - public function __construct() { - - parent::__construct(); - $this->lib = URE_Lib::get_instance(); - $this->user_to_edit = $this->lib->get('user_to_edit'); - - } - // end of __construct() - - - public function display_edit_dialogs() { - - } - // end of display_edit_dialogs() - - - /** - * output HTML code to create URE toolbar - * - * @param boolean $role_delete - * @param boolean $capability_remove - */ - public function toolbar() { -?> -
    -
    - - -
    - -
    - user_to_edit->ID}", "ure_user_{$this->user_to_edit->ID}") . '" >'; - $anchor_end = ''; - if (class_exists('user_switching') && current_user_can('switch_to_user', $this->user_to_edit->ID)) { - $switch_to_user_link = user_switching::switch_to_url($this->user_to_edit); - $switch_to_user = '' . esc_html__('Switch To', 'user-switching') . ''; - } - } else { - $anchor_start = ''; - $anchor_end = ''; - } - $user_info = ' ' . $anchor_start . $this->user_to_edit->user_login; - if ($this->user_to_edit->display_name !== $this->user_to_edit->user_login) { - $user_info .= ' (' . $this->user_to_edit->display_name . ')'; - } - $user_info .= $anchor_end . ''; - if (is_multisite() && $this->lib->is_super_admin($this->user_to_edit->ID)) { - $user_info .= ' ' . esc_html__('Network Super Admin', 'user-role-editor') . ''; - } - - if (!empty($switch_to_user)) { - $user_info .= '    ' . $switch_to_user; - } - - return $user_info; - } - // end of get_user_info() - - - private function show_primary_role_dropdown_list($user_roles) { -?> - -lib->show_admin_role_allowed(); - $values = array_values($this->user_to_edit->roles); - $primary_role = array_shift($values); // get 1st element from roles array - $roles = $this->lib->get('roles'); - foreach ($roles as $role_id => $role) { - if (($show_admin_role || $role_id != 'administrator') && ($role_id !== $primary_role)) { - if ($this->lib->user_can($role_id)) { - $checked = 'checked="checked"'; - } else { - $checked = ''; - } - echo '
    '; - } - } - } - // end of show_secondary_roles() - - - public function display() { - $caps_readable = $this->lib->get('caps_readable'); - $show_deprecated_caps = $this->lib->get('show_deprecated_caps'); - $edit_user_caps_mode = $this->lib->get_edit_user_caps_mode(); - $caps_access_restrict_for_simple_admin = $this->lib->get_option('caps_access_restrict_for_simple_admin', 0); - $user_info = $this->get_user_info(); -?> - -
    -
    - -
    -
    - - - - - - - - - -
      - lib->is_super_admin() || !$this->multisite || !class_exists('User_Role_Editor_Pro') || !$caps_access_restrict_for_simple_admin) { - if ($caps_readable) { - $checked = 'checked="checked"'; - } else { - $checked = ''; - } -?> - onclick="ure_turn_caps_readable(user_to_edit->ID; ?>);" /> -     - - onclick="ure_turn_deprecated_caps(user_to_edit->ID; ?>);"/> - - -
    -
    -show_primary_role_dropdown_list($this->user_to_edit->roles); - - if (function_exists('bbp_filter_blog_editable_roles') ) { // bbPress plugin is active -?> -
    -user_to_edit->ID); - if (!empty($bbp_user_role)) { - echo $dynamic_roles[$bbp_user_role]['name']; - } - } -?> -
    -show_secondary_roles(); -?> -
    - display_caps(false, $edit_user_caps_mode ); ?> -
    - - -
    -
    - - * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya - **/ -class URE_View { - - private $lib = null; - - - public function __construct() { - - $this->lib = URE_Lib::get_instance(); - - } - // end of __construct() - - public function display() {} - - public function toolbar() {} - - /** - * display opening part of the HTML box with title and CSS style - * - * @param string $title - * @param string $style - */ - public function display_box_start($title, $style = '') { - ?> -
    -

    -
    - -
    -
    - get_groups_tree(); - $output = '
      '. PHP_EOL; - foreach($groups_list as $group_id=>$group) { - if ($group_id=='all') { - $spacer = ''; - $subgroup = ''; - } else { - $spacer = 'style="padding-left: '. 15*$group['level'] .'px"'; - $subgroup = '- '; - } - $output .= '
    • ' . - $subgroup . $group['caption'] .'
    • '. PHP_EOL; - } - $output .= '
    '. PHP_EOL; - - echo $output; - } - // end of show_caps_groups() - - - private function deprecated_show_and_color($cap_id, $builtin_wp_caps, &$label_style, &$hidden_class) { - - if (isset($builtin_wp_caps[$cap_id])) { - if (in_array('deprecated', $builtin_wp_caps[$cap_id])) { - $show_deprecated_caps = $this->lib->get('show_deprecated_caps'); - if (!$show_deprecated_caps) { - $hidden_class = 'hidden'; - } - $label_style = 'style="color:#BBBBBB;"'; - } - } - - } - // end of deprecated_show_and_color() - - - private function blocked_for_single_admin_style($cap_id, &$label_style) { - - $blocked = false; - $multisite = $this->lib->get('multisite'); - if ($multisite && $this->lib->block_cap_for_single_admin($cap_id, true)) { - if ($this->lib->is_super_admin()) { - if (!is_network_admin()) { - $label_style = 'style="color: red;"'; - } - } else { - $blocked = true; - } - } - - return $blocked; - } - // end of blocked_for_single_admin_style() - - - /** - * output HTML-code for capabilities list - * @param boolean $for_role - if true, it is role capabilities list, else - user specific capabilities list - * @param boolean $edit_mode - if false, capabilities checkboxes are shown as disable - readonly mode - */ - public function show_capabilities($for_role = true, $edit_mode=true) { - - $onclick_for_admin = ''; - $multisite = $this->lib->get('multisite'); - $current_role = $this->lib->get('current_role'); - if (!($multisite && $this->lib->is_super_admin())) { // do not limit SuperAdmin for multi-site - if ('administrator'==$current_role) { - $onclick_for_admin = 'onclick="ure_turn_it_back(this)"'; - } - } - $user_to_edit = $this->lib->get('user_to_edit'); - $roles = $this->lib->get('roles'); - $full_capabilities = $this->lib->get('full_capabilities'); - $built_in_wp_caps = $this->lib->get_built_in_wp_caps(); - $caps_readable = $this->lib->get('caps_readable'); - $caps_groups_manager = URE_Capabilities_Groups_Manager::get_instance(); - - $key_capability = URE_Own_Capabilities::get_key_capability(); - $user_is_ure_admin = current_user_can($key_capability); - $ure_caps = URE_Own_Capabilities::get_caps(); - - $output = '
    ' - . '
    '; - foreach ($full_capabilities as $capability) { - $cap_id = $capability['inner']; - if (!$user_is_ure_admin) { - if (isset($ure_caps[$cap_id]) || - ($multisite && $cap_id=='manage_network_plugins')) { - // exclude URE caps if user does not have full access to URE - continue; - } - } - $label_style = ''; - $hidden_class = ''; - - $this->deprecated_show_and_color($cap_id, $built_in_wp_caps, $label_style, $hidden_class); - $blocked = $this->blocked_for_single_admin_style($cap_id, $label_style); - $classes = array('ure-cap-div'); - if ($blocked) { - $classes[] = 'blocked'; - $hidden_class = 'hidden'; - } - if ($hidden_class) { - $classes[] = $hidden_class; - } - - $cap_groups = $caps_groups_manager->get_cap_groups($cap_id, $built_in_wp_caps); - $classes = array_merge($classes, $cap_groups); - - $checked = ''; - $disabled = ''; - if ($for_role) { - if (isset($roles[$current_role]['capabilities'][$cap_id]) && - !empty($roles[$current_role]['capabilities'][$cap_id])) { - $checked = 'checked="checked"'; - } - } else { - if (empty($edit_mode)) { - $disabled = 'disabled="disabled"'; - } else { - $disabled = ''; - } - if ($this->lib->user_can($cap_id)) { - $checked = 'checked="checked"'; - if (!isset($user_to_edit->caps[$cap_id])) { - $disabled = 'disabled="disabled"'; - } - } - } - $class = 'class="' . implode(' ', $classes) .'"'; - - $cap_id_esc = URE_Capability::escape($cap_id); - $cap_html = '
    '; - - if ($caps_readable) { - $cap_ind = 'human'; - $cap_ind_alt = 'inner'; - } else { - $cap_ind = 'inner'; - $cap_ind_alt = 'human'; - } - $cap_html .= '
    '; - - $output .= $cap_html; - } - $output .= '
    ' ; - - echo $output; - } - // end of show_capabilities() - - - // content of User Role Editor Pro advertisement slot - for direct call - public function advertise_pro() { - ?> - - advert = new URE_Advertisement(); - $this->advert->display(); - } - // end of advertisement() - - - public function output_confirmation_dialog() { - ?> -
    -
    -
    - lib->get('caps_columns_quant'); -?> - - - - - - - - - - - -
    (/) -
    -
    - -
    -
    -   -     - -   -
    -
    - - -
    -
    -
     
    - show_caps_groups(); ?> - - show_capabilities($for_role, $edit_mode); ?> - - toolbar(); ?> -
    - - * @copyright Copyright (c) 2010 - 2016, Vladimir Garagulya - **/ -class URE_Woocommerce_Capabilities { - - public static $post_types = array('product', 'shop_order', 'shop_coupon', 'shop_webhook', 'product_variation', 'shop_order_refund'); - private static $capability_types = array('product', 'shop_order', 'shop_coupon', 'shop_webhook'); - - - public static function add_group_to_caps(&$caps, $post_type, $group) { - - $post_types = $post_type .'s'; - $caps['edit_'. $post_types][] = $group; - $caps['edit_others_'. $post_types][] = $group; - $caps['publish_'. $post_types][] = $group; - $caps['read_private_'. $post_types][] = $group; - $caps['delete_'. $post_types][] = $group; - $caps['delete_private_'. $post_types][] = $group; - $caps['delete_published_'. $post_types][] = $group; - $caps['delete_others_'. $post_types][] = $group; - $caps['edit_private_'. $post_types][] = $group; - $caps['edit_published_'. $post_types][] = $group; - - } - // end of add_group_to_caps() - - - private static function add_base_caps(&$caps, $group, $subgroup, $cap_type) { - - $cap_types = $cap_type .'s'; - $caps['edit_'. $cap_type] = array('custom', $group, $subgroup, $cap_type); - $caps['read_'. $cap_type] = array('custom', $group, $subgroup, $cap_type); - $caps['delete_'. $cap_type] = array('custom', $group, $subgroup, $cap_type); - $caps['edit_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['edit_others_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['publish_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['read_private_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['delete_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['delete_private_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['delete_published_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['delete_others_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['edit_private_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - $caps['edit_published_'. $cap_types] = array('custom', $group, $subgroup, $cap_type); - - } - // end of add_caps() - - /** - * Returns full list of WooCommerce plugin user capabilities - */ - public static function get_caps_groups() { - - $caps = array( - 'manage_woocommerce'=>array('custom', 'woocommerce', 'woocommerce_core'), - 'view_woocommerce_reports'=>array('custom', 'woocommerce', 'woocommerce_core'), - 'view_admin_dashboard'=>array('custom', 'woocommerce', 'woocommerce_core') - ); - - // code was built on the base of woocommerce/includes/class-wc-install.php method WC_Install::get_core_capabilities() - $group = 'woocommerce'; - foreach (self::$capability_types as $cap_type) { - $subgroup = $group .'_'. $cap_type; - self::add_base_caps($caps, $group, $subgroup, $cap_type); - $caps['manage_'. $cap_type .'_terms'] = array('custom', $group, $subgroup, $cap_type); - $caps['edit_'. $cap_type .'_terms'] = array('custom', $group, $subgroup, $cap_type); - $caps['delete_'. $cap_type .'_terms'] = array('custom', $group, $subgroup, $cap_type); - $caps['assign_'. $cap_type .'_terms'] = array('custom', $group, $subgroup, $cap_type); - } - - $pto1 = get_post_type_object('product_variation'); - if (empty($pto1) || $pto1->capability_type === 'product') { // default, not redefined by some plugin - // add capabilities group for the product_variation custom post type - self::add_group_to_caps($caps, 'product', 'woocommerce_product_variation'); - self::add_group_to_caps($caps, 'product', 'product_variation'); - } else { - $cap_type = 'product_variation'; - $subgroup = $group .'_'. $cap_type; - self::add_base_caps($caps, $group, $subgroup, $cap_type); - } - $pto2 = get_post_type_object('shop_order_refund'); - if (empty($pto2) || $pto2->capability_type === 'shop_order') { // default, not redefined by some plugin - // add capabilities group for the shop_order_refund custom post type - self::add_group_to_caps($caps, 'shop_order', 'woocommerce_shop_order_refund'); - self::add_group_to_caps($caps, 'shop_order', 'shop_order_refund'); - } else { - $cap_type = 'shop_order_variant'; - $subgroup = $group .'_'. $cap_type; - self::add_base_caps($caps, $group, $subgroup, $cap_type); - } - - return $caps; - } - // end of get() - - - /** - * This custom post types use capabilities from the other custom post types - * So we should define capabilities set for theme manually - * @return array() - */ - public static function get_post_types_without_caps() { - - $pt_without_caps = array(); - $pto1 = get_post_type_object('product_variation'); - if (!empty($pto1) && $pto1->capability_type === 'product') { - $pt_without_caps[] = $pto1->name; - } - $pto2 = get_post_type_object('shop_order_refund'); - if (!empty($pto2) && $pto2->capability_type === 'shop_order') { - $pt_without_caps[] = $pto2->name; - } - - return $pt_without_caps; - } - // end of get_post_types_without_caps() - -} -// end of URE_Woocommerce_Capabilities class \ No newline at end of file diff --git a/wp/wp-content/plugins/user-role-editor/includes/define-constants.php b/wp/wp-content/plugins/user-role-editor/includes/define-constants.php deleted file mode 100644 index e659261b..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/define-constants.php +++ /dev/null @@ -1,14 +0,0 @@ -is_pro()) { - return false; - } - - $result = $GLOBALS['user_role_editor']->get_post_view_access_users($post_id); - - return $result; - } - // end of ure_get_post_view_users() - -} - - -if (!function_exists('ure_hide_admin_bar')) { - function ure_hide_admin_bar() { - - show_admin_bar(false); - - } - // end of hide_admin_bar() -} diff --git a/wp/wp-content/plugins/user-role-editor/includes/settings-template.php b/wp/wp-content/plugins/user-role-editor/includes/settings-template.php deleted file mode 100644 index 49e54445..00000000 --- a/wp/wp-content/plugins/user-role-editor/includes/settings-template.php +++ /dev/null @@ -1,223 +0,0 @@ - -
    - -

    -
    -

    - -
    -
      -
    • -lib->is_pro() || !$multisite) { -?> -
    • - -
    • -lib->is_pro() || $this->lib->is_super_admin())) { -?> -
    • - -
    • -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    - - /> - -
    - /> - -
    - /> - -
    - /> - -
    - /> - -
    - - -

    - -

    - -
    -
    -
    -lib->is_pro() || !$multisite) { -?> - -
    -
    - - - - - - - - - -
    - /> - -
    - - -

    - - -

    -
    - - -
    -
    -role_default_html; -?> -
    - - -
    - lib->show_other_default_roles(); ?> -
    -'. esc_html__('Note for multisite environment: take into account that other default roles should exist at the site, in order to be assigned to the new registered users.', 'user-role-editor') .'

    '; - } -?> -
    - - -

    - -

    -
    -
    - -lib->is_pro() || $this->lib->is_super_admin())) { -?> -
    -
    -
    - -lib->is_super_admin()) { -?> - - - - - -
    - /> - - -
    - - -

    - -

    -
    -
    -
    - -
    - lib->about(); ?> -
    -
    -
    - diff --git a/wp/wp-content/plugins/user-role-editor/index.php b/wp/wp-content/plugins/user-role-editor/index.php deleted file mode 100644 index 62200328..00000000 --- a/wp/wp-content/plugins/user-role-editor/index.php +++ /dev/null @@ -1,2 +0,0 @@ - - * @version 1.0.4 - * - * http://wenzhixin.net.cn/p/multiple-select/ - */ - -(function($) { - - 'use strict'; - - function MultipleSelect($el, options) { - var that = this, - elWidth = $el.width(); - - this.$el = $el.hide(); - this.options = options; - - this.$parent = $('
    '); - this.$choice = $('
    ' + - options.placeholder + '
    '); - this.$drop = $('
    '); - this.$el.after(this.$parent); - this.$parent.append(this.$choice); - this.$parent.append(this.$drop); - - if (this.$el.prop('disabled')) { - this.$choice.addClass('disabled'); - } - this.$choice.css('width', elWidth + 'px') - .find('span').css('width', (elWidth - 28) + 'px'); - this.$drop.css({ - width: (options.width || elWidth) + 'px' - }); - - $('body').click(function(e) { - if ($(e.target)[0] === that.$choice[0] || - $(e.target).parents('.ms-choice')[0] === that.$choice[0]) { - return; - } - if (($(e.target)[0] === that.$drop[0] || - $(e.target).parents('.ms-drop')[0] !== that.$drop[0]) && - that.options.isopen) { - that.close(); - } - }); - - if (this.options.isopen) { - this.open(); - } - } - - MultipleSelect.prototype = { - constructor : MultipleSelect, - - init: function() { - var that = this, - html = []; - if (this.options.filter) { - html.push( - '' - ); - } - html.push('
      '); - if (this.options.selectAll) { - html.push( - '
    • ', - '', - '
    • ' - ); - } - $.each(this.$el.children(), function(i, elm) { - html.push(that.optionToHtml(i, elm)); - }); - html.push('
    '); - this.$drop.html(html.join('')); - this.$drop.find('ul').css('max-height', this.options.maxHeight + 'px'); - this.$drop.find('.multiple').css('width', this.options.multipleWidth + 'px'); - - this.$searchInput = this.$drop.find('.ms-search input'); - this.$selectAll = this.$drop.find('input[name="selectAll"]'); - this.$selectGroups = this.$drop.find('label.optgroup'); - this.$selectItems = this.$drop.find('input[name="selectItem"]:enabled'); - this.$disableItems = this.$drop.find('input[name="selectItem"]:disabled'); - this.events(); - this.update(); - }, - - optionToHtml: function(i, elm, group, groupDisabled) { - var that = this, - $elm = $(elm), - html = [], - multiple = this.options.multiple; - if ($elm.is('option')) { - var value = $elm.val(), - text = $elm.text(), - selected = $elm.prop('selected'), - disabled = groupDisabled || $elm.prop('disabled'); - html.push( - '', - '', - ' ', - text, - '', - '
  2. ' - ); - } else if (!group && $elm.is('optgroup')) { - var _group = 'group_' + i, - label = $elm.attr('label'), - disabled = $elm.prop('disabled'); - html.push( - '
  3. ', - '', - '
  4. '); - $.each($elm.children(), function(i, elm) { - html.push(that.optionToHtml(i, elm, _group, disabled)); - }); - } - return html.join(''); - }, - - events: function() { - var that = this; - this.$choice.off('click').on('click', function() { - that[that.options.isopen ? 'close' : 'open'](); - }); - this.$searchInput.off('keyup').on('keyup', function() { - that.filter(); - }); - this.$selectAll.off('click').on('click', function() { - var checked = $(this).prop('checked'), - $items = that.$selectItems.filter(':visible'); - if ($items.length === that.$selectItems.length) { - that[checked ? 'checkAll' : 'uncheckAll'](); - } else { // when the filter option is true - $items.prop('checked', checked); - that.update(); - } - }); - this.$selectGroups.off('click').on('click', function() { - var group = $(this).attr('data-group'), - $items = that.$selectItems.filter(':visible'), - $children = $items.filter('[data-group="' + group + '"]'), - checked = $children.length !== $children.filter(':checked').length; - $children.prop('checked', checked); - that.updateSelectAll(); - that.update(); - that.options.onOptgroupClick({ - label: $(this).text(), - checked: checked, - children: $children.get() - }); - }); - this.$selectItems.off('click').on('click', function() { - that.updateSelectAll(); - that.update(); - that.options.onClick({ - label: $(this).parent().text(), - value: $(this).val(), - checked: $(this).prop('checked') - }); - }); - }, - - open: function() { - if (this.$choice.hasClass('disabled')) { - return; - } - this.options.isopen = true; - this.$choice.find('>div').addClass('open'); - this.$drop.show(); - if (this.options.filter) { - this.$searchInput.val(''); - this.filter(); - } - this.options.onOpen(); - }, - - close: function() { - this.options.isopen = false; - this.$choice.find('>div').removeClass('open'); - this.$drop.hide(); - this.options.onClose(); - }, - - update: function() { - var selects = this.getSelects('text'), - $span = this.$choice.find('>span'); - if (selects.length) { - $span.removeClass('placeholder').html(selects.join(',')); - } else { - $span.addClass('placeholder').html(this.options.placeholder); - } - // set selects to select - this.$el.val(this.getSelects()); - }, - - updateSelectAll: function() { - var $items = this.$selectItems.filter(':visible'); - this.$selectAll.prop('checked', $items.length && - $items.length === $items.filter(':checked').length); - }, - - //value or text, default: 'value' - getSelects: function(type) { - var values = []; - this.$drop.find('input[name="selectItem"]:checked').each(function() { - values.push(type === 'text' ? $(this).parent().text() : $(this).val()); - }); - return values; - }, - - setSelects: function(values) { - var that = this; - this.$selectItems.prop('checked', false); - $.each(values, function(i, value) { - that.$selectItems.filter('[value="' + value + '"]').prop('checked', true); - }); - this.$selectAll.prop('checked', this.$selectItems.length === - this.$selectItems.filter(':checked').length); - this.update(); - }, - - enable: function() { - this.$choice.removeClass('disabled'); - }, - - disable: function() { - this.$choice.addClass('disabled'); - }, - - checkAll: function() { - this.$selectItems.prop('checked', true); - this.$selectAll.prop('checked', true); - this.update(); - this.options.onCheckAll(); - }, - - uncheckAll: function() { - this.$selectItems.prop('checked', false); - this.$selectAll.prop('checked', false); - this.update(); - this.options.onUncheckAll(); - }, - - refresh: function() { - this.init(); - }, - - filter: function() { - var that = this, - text = $.trim(this.$searchInput.val()).toLowerCase(); - if (text.length === 0) { - this.$selectItems.parent().show(); - this.$disableItems.parent().show(); - this.$selectGroups.show(); - } else { - this.$selectItems.each(function() { - var $parent = $(this).parent(); - $parent[$parent.text().toLowerCase().indexOf(text) < 0 ? 'hide' : 'show'](); - }); - this.$disableItems.parent().hide(); - this.$selectGroups.each(function() { - var group = $(this).attr('data-group'), - $items = that.$selectItems.filter(':visible'); - $(this)[$items.filter('[data-group="' + group + '"]').length === 0 ? 'hide' : 'show'](); - }); - } - this.updateSelectAll(); - } - }; - - $.fn.multipleSelect = function() { - var option = arguments[0], - args = arguments, - - value, - allowedMethods = ['getSelects', 'setSelects', 'enable', 'disable', 'checkAll', 'uncheckAll', 'refresh']; - - this.each(function() { - var $this = $(this), - data = $this.data('multipleSelect'), - options = $.extend({}, $.fn.multipleSelect.defaults, typeof option === 'object' && option); - - if (!data) { - data = new MultipleSelect($this, options); - $this.data('multipleSelect', data); - } - - if (typeof option === 'string') { - if ($.inArray(option, allowedMethods) < 0) { - throw "Unknown method: " + option; - } - value = data[option](args[1]); - } else { - data.init(); - } - }); - - return value ? value : this; - }; - - $.fn.multipleSelect.defaults = { - isopen: false, - placeholder: '', - selectAll: true, - selectAllText: 'Select all', - multiple: false, - multipleWidth: 80, - filter: false, - width: undefined, - maxHeight: 250, - - onOpen: function() {return false;}, - onClose: function() {return false;}, - onCheckAll: function() {return false;}, - onUncheckAll: function() {return false;}, - onOptgroupClick: function() {return false;}, - onClick: function() {return false;} - }; -})(jQuery); diff --git a/wp/wp-content/plugins/user-role-editor/js/ure-js.js b/wp/wp-content/plugins/user-role-editor/js/ure-js.js deleted file mode 100644 index 12ffcf76..00000000 --- a/wp/wp-content/plugins/user-role-editor/js/ure-js.js +++ /dev/null @@ -1,724 +0,0 @@ -// get/post via jQuery -(function ($) { - $.extend({ - ure_getGo: function (url, params) { - document.location = url + '?' + $.param(params); - }, - ure_postGo: function (url, params) { - var $form = $('
    ') - .attr('method', 'post') - .attr('action', url); - $.each(params, function (name, value) { - $("") - .attr('name', name) - .attr('value', value) - .appendTo($form); - }); - $form.appendTo('body'); - $form.submit(); - } - }); -})(jQuery); - -var ure_ajax_get_caps_to_remove = null; - -jQuery(document).ready(function() { - -// Get from the server a list of capabilities we can delete and show dialog to select what to delete - ure_ajax_get_caps_to_remove = { - url: ajaxurl, - type: 'POST', - dataType: 'html', - data: { - action: 'ure_ajax', - sub_action: 'get_caps_to_remove', - current_role: jQuery('#user_role').val(), - network_admin: ure_data.network_admin, - wp_nonce: ure_data.wp_nonce - }, - success: function (response) { - var data = jQuery.parseJSON(response); - if (typeof data.result !== 'undefined') { - if (data.result === 'success') { - jQuery('#ure_delete_capability_dialog .ure-input').html(data.html); - ure_main.show_delete_capability_dialog(); - } else if (data.result === 'failure') { - alert(data.message); - } else { - alert('Wrong response: ' + response) - } - } else { - alert('Wrong response: ' + response) - } - }, - error: function (XMLHttpRequest, textStatus, exception) { - alert("Ajax failure\n" + XMLHttpRequest.statusText); - }, - async: true - }; - -}); - -// Main User Role Editor object -var ure_main = { - selected_group: 'all', - caps_counter: null, - class_prefix: 'ure-', - - show_delete_capability_dialog: function () { - jQuery('#ure_delete_capability_dialog').dialog({ - dialogClass: 'wp-dialog', - modal: true, - autoOpen: true, - closeOnEscape: true, - width: 350, - height: 400, - resizable: false, - title: ure_data.delete_capability, - buttons: { - 'Delete Capability': function () { - if (!confirm(ure_data.delete_capability + ' - ' + ure_data.delete_capability_warning)) { - return; - } - jQuery('#ure_remove_caps_form').submit(); - jQuery(this).dialog('close'); - }, - Cancel: function () { - jQuery(this).dialog('close'); - } - } - }); - // translate buttons caption - jQuery('.ui-dialog-buttonpane button:contains("Delete Capability")').attr('id', 'dialog-delete-capability-button'); - jQuery('#dialog-delete-capability-button').html(ure_ui_button_text(ure_data.delete_capability)); - jQuery('.ui-dialog-buttonpane button:contains("Cancel")').attr('id', 'delete-capability-dialog-cancel-button'); - jQuery('#delete-capability-dialog-cancel-button').html(ure_ui_button_text(ure_data.cancel)); - jQuery('#ure_remove_caps_select_all').click(this.remove_caps_auto_select); - }, - - remove_caps_auto_select: function (event) { - if (event.shiftKey) { - jQuery('.ure-cb-column').each(function () { // reverse selection - jQuery(this).prop('checked', !jQuery(this).prop('checked')); - }); - } else { // switch On/Off all checkboxes - jQuery('.ure-cb-column').prop('checked', jQuery('#ure_remove_caps_select_all').prop('checked')); - - } - } - -}; // end of ure_main declaration -//------------------------------- - - - -function ure_ui_button_text(caption) { - var wrapper = '' + caption + ''; - - return wrapper; -} - - -function ure_select_selectable_element(selectable_container, elements_to_select) { - // add unselecting class to all elements in the styleboard canvas except the ones to select - jQuery(".ui-selected", selectable_container).not(elements_to_select).removeClass("ui-selected").addClass("ui-unselecting"); - // add ui-selecting class to the elements to select - jQuery(elements_to_select).not(".ui-selected").addClass("ui-selecting"); - // trigger the mouse stop event (this will select all .ui-selecting elements, and deselect all .ui-unselecting elements) - selectable_container.data("ui-selectable")._mouseStop(null); -} - - -jQuery(function ($) { - - ure_count_caps_in_groups(); - ure_sizes_update(); - $('#ure_select_all_caps').click(ure_auto_select_caps); - $('#granted_only').click(ure_show_granted_caps_only); - $('#ure_caps_groups_list').selectable({ - selected: function( event, ui ) { - // do not allow multiple selection - $(ui.selected).siblings().removeClass("ui-selected"); - ure_caps_refresh(ui.selected.id); - } - }); - ure_select_selectable_element($('#ure_caps_groups_list'), $('#ure_caps_group_all')); - - $('#ure_update_role').button({ - label: ure_data.update - }).click(function () { - if (ure_data.confirm_role_update == 1) { - event.preventDefault(); - ure_confirm(ure_data.confirm_submit, ure_form_submit); - } - }); - - - function ure_form_submit() { - $('#ure_form').submit(); - } - - - function ure_show_add_role_dialog() { - - $('#ure_add_role_dialog').dialog({ - dialogClass: 'wp-dialog', - modal: true, - autoOpen: true, - closeOnEscape: true, - width: 450, - height: 230, - resizable: false, - title: ure_data.add_new_role_title, - 'buttons': { - 'Add Role': function () { - var role_id = $('#user_role_id').val(); - if (role_id == '') { - alert(ure_data.role_name_required); - return false; - } - if (!(/^[\w-]*$/.test(role_id))) { - alert(ure_data.role_name_valid_chars); - return false; - } - if ((/^[0-9]*$/.test(role_id))) { - alert(ure_data.numeric_role_name_prohibited); - return false; - } - var role_name = $('#user_role_name').val(); - var role_copy_from = $('#user_role_copy_from').val(); - - $(this).dialog('close'); - $.ure_postGo(ure_data.page_url, - {action: 'add-new-role', user_role_id: role_id, user_role_name: role_name, user_role_copy_from: role_copy_from, - ure_nonce: ure_data.wp_nonce}); - }, - Cancel: function () { - $(this).dialog('close'); - return false; - } - } - }); - $('.ui-dialog-buttonpane button:contains("Add Role")').attr('id', 'dialog-add-role-button'); - $('#dialog-add-role-button').html(ure_ui_button_text(ure_data.add_role)); - $('.ui-dialog-buttonpane button:contains("Cancel")').attr('id', 'add-role-dialog-cancel-button'); - $('#add-role-dialog-cancel-button').html(ure_ui_button_text(ure_data.cancel)); - - } - - - $('#ure_add_role').button({ - label: ure_data.add_role - }).click(function (event) { - event.preventDefault(); - ure_show_add_role_dialog(); - }); - - - function ure_show_rename_role_dialog() { - - $('#ure_rename_role_dialog').dialog({ - dialogClass: 'wp-dialog', - modal: true, - autoOpen: true, - closeOnEscape: true, - width: 450, - height: 230, - resizable: false, - title: ure_data.rename_role_title, - 'buttons': { - 'Rename Role': function () { - var role_id = $('#ren_user_role_id').val(); - var role_name = $('#ren_user_role_name').val(); - $(this).dialog('close'); - $.ure_postGo(ure_data.page_url, - {action: 'rename-role', user_role_id: role_id, user_role_name: role_name, ure_nonce: ure_data.wp_nonce} - ); - }, - Cancel: function () { - $(this).dialog('close'); - return false; - } - } - }); - $('.ui-dialog-buttonpane button:contains("Rename Role")').attr('id', 'dialog-rename-role-button'); - $('#dialog-rename-role-button').html(ure_ui_button_text(ure_data.rename_role)); - $('.ui-dialog-buttonpane button:contains("Cancel")').attr('id', 'rename-role-dialog-cancel-button'); - $('#rename-role-dialog-cancel-button').html(ure_ui_button_text(ure_data.cancel)); - $('#ren_user_role_id').val(ure_current_role); - $('#ren_user_role_name').val(ure_current_role_name); - - } - - - $('#ure_rename_role').button({ - label: ure_data.rename_role - }).click(function (event) { - event.preventDefault(); - ure_show_rename_role_dialog(); - }); - - - function ure_show_delete_role_dialog() { - $('#ure_delete_role_dialog').dialog({ - dialogClass: 'wp-dialog', - modal: true, - autoOpen: true, - closeOnEscape: true, - width: 320, - height: 190, - resizable: false, - title: ure_data.delete_role, - buttons: { - 'Delete Role': function () { - var user_role_id = $('#del_user_role').val(); - if (!confirm(ure_data.delete_role)) { - return false; - } - $(this).dialog('close'); - $.ure_postGo(ure_data.page_url, - {action: 'delete-role', user_role_id: user_role_id, ure_nonce: ure_data.wp_nonce}); - }, - Cancel: function () { - $(this).dialog('close'); - } - } - }); - // translate buttons caption - $('.ui-dialog-buttonpane button:contains("Delete Role")').attr('id', 'dialog-delete-button'); - $('#dialog-delete-button').html(ure_ui_button_text(ure_data.delete_role)); - $('.ui-dialog-buttonpane button:contains("Cancel")').attr('id', 'delete-role-dialog-cancel-button'); - $('#delete-role-dialog-cancel-button').html(ure_ui_button_text(ure_data.cancel)); - } - - - $('#ure_delete_role').button({ - label: ure_data.delete_role - }).click(function (event) { - event.preventDefault(); - ure_show_delete_role_dialog(); - }); - - - function ure_show_add_capability_dialog() { - $('#ure_add_capability_dialog').dialog({ - dialogClass: 'wp-dialog', - modal: true, - autoOpen: true, - closeOnEscape: true, - width: 350, - height: 190, - resizable: false, - title: ure_data.add_capability, - 'buttons': { - 'Add Capability': function () { - var capability_id = $('#capability_id').val(); - if (capability_id == '') { - alert(ure_data.capability_name_required); - return false; - } - if (!(/^[\w-]*$/.test(capability_id))) { - alert(ure_data.capability_name_valid_chars); - return false; - } - - $(this).dialog('close'); - $.ure_postGo(ure_data.page_url, - {action: 'add-new-capability', capability_id: capability_id, ure_nonce: ure_data.wp_nonce}); - }, - Cancel: function () { - $(this).dialog('close'); - } - } - }); - $('.ui-dialog-buttonpane button:contains("Add Capability")').attr('id', 'dialog-add-capability-button'); - $('#dialog-add-capability-button').html(ure_ui_button_text(ure_data.add_capability)); - $('.ui-dialog-buttonpane button:contains("Cancel")').attr('id', 'add-capability-dialog-cancel-button'); - $('#add-capability-dialog-cancel-button').html(ure_ui_button_text(ure_data.cancel)); - - } - - - $('#ure_add_capability').button({ - label: ure_data.add_capability - }).click(function (event) { - event.preventDefault(); - ure_show_add_capability_dialog(); - }); - - - if ($('#ure_delete_capability').length > 0) { - $('#ure_delete_capability').button({ - label: ure_data.delete_capability - }).click(function (event) { - event.preventDefault(); - $.ajax(ure_ajax_get_caps_to_remove); - }); - } - - - function ure_show_default_role_dialog() { - $('#ure_default_role_dialog').dialog({ - dialogClass: 'wp-dialog', - modal: true, - autoOpen: true, - closeOnEscape: true, - width: 320, - height: 190, - resizable: false, - title: ure_data.default_role, - buttons: { - 'Set New Default Role': function () { - $(this).dialog('close'); - var user_role_id = $('#default_user_role').val(); - $.ure_postGo(ure_data.page_url, - {action: 'change-default-role', user_role_id: user_role_id, ure_nonce: ure_data.wp_nonce}); - }, - Cancel: function () { - $(this).dialog('close'); - } - } - }); - // translate buttons caption - $('.ui-dialog-buttonpane button:contains("Set New Default Role")').attr('id', 'dialog-default-role-button'); - $('#dialog-default-role-button').html(ure_ui_button_text(ure_data.set_new_default_role)); - $('.ui-dialog-buttonpane button:contains("Cancel")').attr('id', 'default-role-dialog-cancel-button'); - $('#default-role-dialog-cancel-button').html(ure_ui_button_text(ure_data.cancel)); - } - - - if ($('#ure_default_role').length > 0) { - $('#ure_default_role').button({ - label: ure_data.default_role - }).click(function (event) { - event.preventDefault(); - ure_show_default_role_dialog(); - }); - } - - - $('#ure_reset_roles_button').button({ - label: ure_data.reset - }).click(function (event) { - event.preventDefault(); - if (!confirm(ure_data.reset_warning)) { - return false; - } - jQuery.ure_postGo(ure_data.page_url, {action: 'reset', ure_nonce: ure_data.wp_nonce}); - }); - - - function ure_confirm(message, routine) { - - $('#ure_confirmation_dialog').dialog({ - dialogClass: 'wp-dialog', - modal: true, - autoOpen: true, - closeOnEscape: true, - width: 400, - height: 180, - resizable: false, - title: ure_data.confirm_title, - 'buttons': { - 'No': function () { - $(this).dialog('close'); - return false; - }, - 'Yes': function () { - $(this).dialog('close'); - routine(); - return true; - } - } - }); - $('#ure_cd_html').html(message); - - $('.ui-dialog-buttonpane button:contains("No")').attr('id', 'dialog-no-button'); - $('#dialog-no-button').html(ure_ui_button_text(ure_data.no_label)); - $('.ui-dialog-buttonpane button:contains("Yes")').attr('id', 'dialog-yes-button'); - $('#dialog-yes-button').html(ure_ui_button_text(ure_data.yes_label)); - - } - // end of ure_confirm() - - -}); -// end of jQuery(function() ... - - -// change color of apply to all check box - for multi-site setup only -function ure_apply_to_all_on_click(cb) { - el = document.getElementById('ure_apply_to_all_div'); - if (cb.checked) { - el.style.color = '#FF0000'; - } else { - el.style.color = '#000000'; - } -} -// end of ure_apply_to_all_on_click() - - -// turn on checkbox back if clicked to turn off -function ure_turn_it_back(control) { - - control.checked = true; - -} -// end of ure_turn_it_back() - - -function ure_apply_selection(cb_id) { - var qfilter = jQuery('#quick_filter').val(); - var parent_div = jQuery('#ure_cap_div_'+ cb_id); - var disabled = jQuery('#'+ cb_id).attr('disabled'); - var result = false; - if (parent_div.hasClass(ure_main.class_prefix + ure_main.selected_group) && // make selection inside currently selected group of capabilities only - !parent_div.hasClass('hidden') && disabled!=='disabled') { // select not hidden and not disabled checkboxes (capabilities) only - // if quick filter is not empty, then apply selection to the tagged element only - if (qfilter==='' || parent_div.hasClass('ure_tag')) { - result = true; - } - } - - return result; -} - - -function ure_auto_select_caps(event) { - - if (event.shiftKey) { - jQuery('.ure-cap-cb').each(function () { // reverse selection - if (ure_apply_selection(this.id)) { - jQuery(this).prop('checked', !jQuery(this).prop('checked')); - } - }); - } else { - jQuery('.ure-cap-cb').each(function () { // switch On/Off all checkboxes - if (ure_apply_selection(this.id)) { - jQuery(this).prop('checked', jQuery('#ure_select_all_caps').prop('checked')); - } - }); - } - -} - - -function ure_turn_caps_readable(user_id) { - var ure_obj = 'user'; - if (user_id === 0) { - ure_obj = 'role'; - } - - jQuery.ure_postGo(ure_data.page_url, {action: 'caps-readable', object: ure_obj, user_id: user_id, ure_nonce: ure_data.wp_nonce}); - -} -// end of ure_turn_caps_readable() - - -function ure_turn_deprecated_caps(user_id) { - - var ure_obj = 'user'; - if (user_id === 0) { - ure_obj = 'role'; - } - jQuery.ure_postGo(ure_data.page_url, {action: 'show-deprecated-caps', object: ure_obj, user_id: user_id, ure_nonce: ure_data.wp_nonce}); - -} -// ure_turn_deprecated_caps() - - -function ure_role_change(role_name) { - - jQuery.ure_postGo(ure_data.page_url, {action: 'role-change', object: 'role', user_role: role_name, ure_nonce: ure_data.wp_nonce}); - -} -// end of ure_role_change() - - -function ure_filter_capabilities(cap_id) { - var div_list = jQuery('.ure-cap-div'); - for (i = 0; i < div_list.length; i++) { - if (cap_id !== '' && div_list[i].id.substr(11).indexOf(cap_id) !== -1) { - jQuery('#'+ div_list[i].id).addClass('ure_tag'); - div_list[i].style.color = '#27CF27'; - } else { - div_list[i].style.color = '#000000'; - jQuery('#'+ div_list[i].id).removeClass('ure_tag'); - } - } - ; - -} -// end of ure_filter_capabilities() - - -function ure_hide_pro_banner() { - - jQuery.ure_postGo(ure_data.page_url, {action: 'hide-pro-banner', ure_nonce: ure_data.wp_nonce}); - -} -// end of ure_hide_this_banner() - - -function ure_caps_refresh_all() { - jQuery('.ure-cap-div').each(function () { - if (jQuery(this).hasClass('hidden')) { - if (!jQuery(this).hasClass(ure_main.class_prefix + 'deprecated')) { - jQuery(this).removeClass('hidden'); - } - } - }); -} - - -function ure_caps_refresh_for_group(group_id) { - var show_deprecated = jQuery('#ure_show_deprecated_caps').attr('checked'); - jQuery('.ure-cap-div').each(function () { - var el = jQuery(this); - if (el.hasClass(ure_main.class_prefix + group_id)) { - if (el.hasClass('hidden')) { - if (el.hasClass('blocked')) { - return; - } - if (el.hasClass(ure_main.class_prefix + 'deprecated')) { - if (group_id==='deprecated' || show_deprecated) { - el.removeClass('hidden'); - } - } else { - el.removeClass('hidden'); - } - } else { - if (el.hasClass(ure_main.class_prefix + 'deprecated')) { - if (!show_deprecated) { - el.addClass('hidden'); - } - } - } - } else { - if (!el.hasClass('hidden')) { - el.addClass('hidden'); - } - } - }); -} - - -function ure_caps_refresh(group) { - - var group_id = group.substr(15); - ure_main.selected_group = group_id; - if (group_id === 'all') { - ure_caps_refresh_all(); - } else { - ure_caps_refresh_for_group(group_id); - } - ure_change_caps_columns_quant(); - jQuery('#granted_only').attr('checked', false); -} - - -function ure_validate_columns(columns) { - if (columns==1 || ure_main.selected_group=='all') { - return columns; - } - - // Do not split list on columns in case it contains less then < 25 capabilities - for (i=0; i'); - var ure_new_role = jQuery('#ure_new_role'); - var options = jQuery("#new_role > option").clone(); - jQuery('#ure_new_role').empty().append(options); - if (jQuery('#ure_new_role option[value="no_rights"]').length === 0) { - jQuery('#ure_new_role').append(''); - } - - // Exclude change role to - jQuery('#ure_new_role option[value=""]').remove(); - var new_role = jQuery('#new_role').find(":selected").val(); - if (new_role.length > 0) { - ure_new_role.val(new_role); - } - ure_new_role.trigger('updated'); -}); - - - -function ure_move_users_from_no_role_dialog() { - - jQuery('#move_from_no_role_dialog').dialog({ - dialogClass: 'wp-dialog', - modal: true, - autoOpen: true, - closeOnEscape: true, - width: 400, - height: 200, - resizable: false, - title: ure_users_data.move_from_no_role_title, - 'buttons': { - 'OK': function () { - ure_move_users_from_no_role(); - jQuery(this).dialog('close'); - }, - Cancel: function () { - jQuery(this).dialog('close'); - return false; - } - } - }); - -} - - -function ure_move_users_from_no_role() { - var new_role = jQuery('#ure_new_role').find(":selected").val(); - if (new_role.length==0) { - alert(ure_users_data.provide_new_role_caption); - return; - } - jQuery.ajax({ - url: ajaxurl, - type: 'POST', - dataType: 'html', - data: { - action: 'ure_ajax', - sub_action: 'get_users_without_role', - wp_nonce: ure_users_data.wp_nonce, - new_role: new_role - }, - success: function(response) { - var data = jQuery.parseJSON(response); - if (typeof data.result !== 'undefined') { - if (data.result === 'success') { - ure_post_move_users_command(data); - } else if (data.result === 'failure') { - alert(data.message); - } else { - alert('Wrong response: ' + response) - } - } else { - alert('Wrong response: ' + response) - } - }, - error: function(XMLHttpRequest, textStatus, exception) { - alert("Ajax failure\n" + XMLHttpRequest.statusText); - }, - async: true - }); - -} - - -function ure_post_move_users_command(data) { - var options = jQuery("#ure_new_role > option").clone(); - jQuery('#new_role').empty().append(options); - jQuery("#new_role").val(data.new_role); - var el = jQuery('.bulkactions').append(); - for(var i=0; i0) { - jQuery('#user_'+ data.users[i]).prop('checked', true); - } else { - var html = ''; - el.append(html); - } - } - - // submit form - jQuery('#changeit').click(); -} diff --git a/wp/wp-content/plugins/user-role-editor/js/users-grant-roles.js b/wp/wp-content/plugins/user-role-editor/js/users-grant-roles.js deleted file mode 100644 index 0ce34a8b..00000000 --- a/wp/wp-content/plugins/user-role-editor/js/users-grant-roles.js +++ /dev/null @@ -1,100 +0,0 @@ - -/* - * User Role Editor: support of 'Grant Roles' button for Users page (wp-admin/users.php) - */ - - -function ure_get_selected_checkboxes(item_name) { - var items = jQuery('input[type="checkbox"][name="'+ item_name +'\\[\\]"]:checked').map(function() { return this.value; }).get(); - - return items; -} - - -function ure_show_grant_roles_dialog() { - var users = ure_get_selected_checkboxes('users'); - if (users.length==0) { - alert(ure_users_grant_roles_data.select_users_first); - return; - } - jQuery('#ure_grant_roles_dialog').dialog({ - dialogClass: 'wp-dialog', - modal: true, - autoOpen: true, - closeOnEscape: true, - width: 400, - height: 400, - resizable: false, - title: ure_users_grant_roles_data.dialog_title, - 'buttons': { - 'OK': function () { - if (!ure_grant_roles()) { - return false; - } - jQuery(this).dialog('close'); - return true; - }, - Cancel: function () { - jQuery(this).dialog('close'); - return false; - } - } - }); -} - - -function ure_grant_roles() { - - var roles = ure_get_selected_checkboxes('ure_roles'); - if (roles.length==0) { - alert(ure_users_grant_roles_data.select_roles_first); - return false; - } - jQuery('#ure_task_status').show(); - var users = ure_get_selected_checkboxes('users'); - var data = { - 'action': 'ure_ajax', - 'sub_action':'grant_roles', - 'users': users, - 'roles': roles, - 'wp_nonce': ure_users_grant_roles_data.wp_nonce}; - jQuery.post(ajaxurl, data, ure_page_reload, 'json'); - - return true; -} - - -function ure_set_url_arg(arg_name, arg_value) { - var url = window.location.href; - var hash = location.hash; - url = url.replace(hash, ''); - if (url.indexOf(arg_name + "=")>=0) { - var prefix = url.substring(0, url.indexOf(arg_name)); - var suffix = url.substring(url.indexOf(arg_name)); - suffix = suffix.substring(suffix.indexOf("=") + 1); - suffix = (suffix.indexOf("&") >= 0) ? suffix.substring(suffix.indexOf("&")) : ""; - url = prefix + arg_name + "=" + arg_value + suffix; - } else { - if (url.indexOf("?") < 0) { - url += "?" + arg_name + "=" + arg_value; - } else { - url += "&" + arg_name + "=" + arg_value; - } - } - url = url + hash; - - return url; -} - - -function ure_page_reload(response) { - - if (response.result=='error') { - jQuery('#ure_task_status').hide(); - alert(response.message); - return; - } - - var url = ure_set_url_arg('update', 'promote'); - document.location = url; -} diff --git a/wp/wp-content/plugins/user-role-editor/lang/index.php b/wp/wp-content/plugins/user-role-editor/lang/index.php deleted file mode 100644 index 62200328..00000000 --- a/wp/wp-content/plugins/user-role-editor/lang/index.php +++ /dev/null @@ -1,2 +0,0 @@ -\n" -"Language-Team: https://www.role-editor.com \n" -"Language: en_EN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Poedit-SourceCharset: UTF-8\n" -"X-Poedit-KeywordsList: __;_e;esc_html__;esc_html_e\n" -"X-Poedit-Basepath: .\n" -"X-Generator: Poedit 1.8.7.1\n" -"X-Poedit-SearchPath-0: ..\n" - -#: ../includes/classes/capabilities-groups-manager.php:44 -msgid "Custom Post Types" -msgstr "" - -#: ../includes/classes/capabilities-groups-manager.php:75 -#: ../includes/classes/ure-lib.php:232 -#: ../includes/classes/user-role-editor.php:563 -#: ../includes/classes/user-role-editor.php:594 -msgid "User Role Editor" -msgstr "" - -#: ../includes/classes/capabilities-groups-manager.php:90 -msgid "WooCommerce" -msgstr "" - -#: ../includes/classes/capabilities-groups-manager.php:91 -#: ../includes/classes/capabilities-groups-manager.php:111 -msgid "Core" -msgstr "" - -#: ../includes/classes/capabilities-groups-manager.php:110 -msgid "All" -msgstr "" - -#: ../includes/classes/capabilities-groups-manager.php:112 -#: ../includes/classes/user-role-editor.php:535 -#: ../includes/settings-template.php:21 -msgid "General" -msgstr "" - -#: ../includes/classes/capabilities-groups-manager.php:113 -msgid "Themes" -msgstr "" - -#: ../includes/classes/capabilities-groups-manager.php:114 -msgid "Posts" -msgstr "" - -#: ../includes/classes/capabilities-groups-manager.php:115 -msgid "Pages" -msgstr "" - -#: ../includes/classes/capabilities-groups-manager.php:116 -msgid "Plugins" -msgstr "" - -#: ../includes/classes/capabilities-groups-manager.php:117 -msgid "Users" -msgstr "" - -#: ../includes/classes/capabilities-groups-manager.php:121 -#: ../includes/classes/user-role-editor.php:553 -#: ../includes/settings-template.php:34 -msgid "Multisite" -msgstr "" - -#: ../includes/classes/capabilities-groups-manager.php:123 -msgid "Deprecated" -msgstr "" - -#: ../includes/classes/capabilities-groups-manager.php:126 -msgid "Custom capabilities" -msgstr "" - -#: ../includes/classes/capability.php:56 ../includes/classes/capability.php:164 -#: ../includes/classes/ure-lib.php:1225 ../includes/classes/ure-lib.php:1500 -#: ../includes/classes/ure-lib.php:1616 ../includes/classes/ure-lib.php:1664 -#: ../includes/classes/user-role-editor.php:804 -msgid "Insufficient permissions to work with User Role Editor" -msgstr "" - -#: ../includes/classes/capability.php:66 -msgid "Error: Capability name must contain latin characters and digits only!" -msgstr "" - -#: ../includes/classes/capability.php:78 -#, php-format -msgid "Capability %s is added successfully" -msgstr "" - -#: ../includes/classes/capability.php:80 -#, php-format -msgid "Capability %s exists already" -msgstr "" - -#: ../includes/classes/capability.php:171 -#: ../includes/classes/capability.php:176 -msgid "There are no capabilities available for deletion!" -msgstr "" - -#: ../includes/classes/capability.php:182 -#, php-format -msgid "Capability %s was removed successfully" -msgstr "" - -#: ../includes/classes/capability.php:185 -msgid "capabilities were removed successfully" -msgstr "" - -#: ../includes/classes/grant-roles.php:81 -msgid "Invalid data at the users list" -msgstr "" - -#: ../includes/classes/grant-roles.php:87 -msgid "Invalid data at the roles list" -msgstr "" - -#: ../includes/classes/grant-roles.php:92 -msgid "Not enough permissions" -msgstr "" - -#: ../includes/classes/grant-roles.php:137 -msgid "Working..." -msgstr "" - -#: ../includes/classes/grant-roles.php:151 -msgid "Grant roles to selected users" -msgstr "" - -#: ../includes/classes/grant-roles.php:152 -msgid "Select users to which you wish to grant multiple roles!" -msgstr "" - -#: ../includes/classes/grant-roles.php:153 -msgid "Select role(s) which you wish to grant!" -msgstr "" - -#: ../includes/classes/role-additional-options.php:69 -msgid "Hide admin bar" -msgstr "" - -#: ../includes/classes/role-additional-options.php:121 -msgid "Additional Options" -msgstr "" - -#: ../includes/classes/role-view.php:75 -msgid "None" -msgstr "" - -#: ../includes/classes/role-view.php:108 -msgid "Delete All Unused Roles" -msgstr "" - -#: ../includes/classes/role-view.php:208 ../includes/classes/role-view.php:219 -msgid "Role name (ID): " -msgstr "" - -#: ../includes/classes/role-view.php:210 ../includes/classes/role-view.php:221 -msgid "Display Role Name: " -msgstr "" - -#: ../includes/classes/role-view.php:212 -msgid "Make copy of: " -msgstr "" - -#: ../includes/classes/role-view.php:228 -msgid "Select Role:" -msgstr "" - -#: ../includes/classes/role-view.php:253 -msgid "Capability name (ID): " -msgstr "" - -#: ../includes/classes/role-view.php:372 ../includes/classes/user-view.php:154 -msgid "Show capabilities in human readable form" -msgstr "" - -#: ../includes/classes/role-view.php:382 ../includes/classes/screen-help.php:21 -#: ../includes/classes/user-view.php:164 ../includes/settings-template.php:69 -msgid "Show deprecated capabilities" -msgstr "" - -#: ../includes/classes/role-view.php:386 -msgid "If checked, then apply action to ALL sites of this Network" -msgstr "" - -#: ../includes/classes/role-view.php:399 -msgid "Apply to All Sites" -msgstr "" - -#: ../includes/classes/role-view.php:416 -msgid "Select Role and change its capabilities:" -msgstr "" - -#: ../includes/classes/screen-help.php:12 -#: ../includes/classes/screen-help.php:41 -#: ../includes/classes/screen-help.php:60 -#: ../includes/classes/screen-help.php:79 -msgid "User Role Editor Options page help" -msgstr "" - -#: ../includes/classes/screen-help.php:15 ../includes/settings-template.php:53 -msgid "Show Administrator role at User Role Editor" -msgstr "" - -#: ../includes/classes/screen-help.php:16 -msgid "" -"turn this option on in order to make the \"Administrator\" role available at " -"the User Role Editor roles selection drop-down list. It is hidden by default " -"for security reasons." -msgstr "" - -#: ../includes/classes/screen-help.php:18 ../includes/settings-template.php:61 -msgid "Show capabilities in the human readable form" -msgstr "" - -#: ../includes/classes/screen-help.php:19 -msgid "" -"automatically converts capability names from the technical form for internal " -"use like \"edit_others_posts\" to more user friendly form, e.g. \"Edit " -"others posts\"." -msgstr "" - -#: ../includes/classes/screen-help.php:22 -msgid "" -"Capabilities like \"level_0\", \"level_1\" are deprecated and are not used " -"by WordPress. They are left at the user roles for the compatibility purpose " -"with the old themes and plugins code. Turning on this option will show those " -"deprecated capabilities." -msgstr "" - -#: ../includes/classes/screen-help.php:25 ../includes/settings-template.php:85 -msgid "Edit user capabilities" -msgstr "" - -#: ../includes/classes/screen-help.php:26 -msgid "" -"If turned off - capabilities section of selected user is shown in readonly " -"mode. Administrator can not assign capabilities to the user directly. He " -"should make it using roles only." -msgstr "" - -#: ../includes/classes/screen-help.php:45 ../includes/settings-template.php:119 -msgid "Count users without role" -msgstr "" - -#: ../includes/classes/screen-help.php:46 -msgid "" -"Show at the \"Users\" page a quant of users without role. Module allows to " -"assign all of them an empty role \"No rights\", in order to look on the " -"users list with role \"No rights\" at the separate tab then." -msgstr "" - -#: ../includes/classes/screen-help.php:63 -msgid "Other default roles for new registered user" -msgstr "" - -#: ../includes/classes/screen-help.php:64 -msgid "" -"select roles below to assign them to the new user automatically as an " -"addition to the primary role. Note for multisite environment: take into " -"account that other default roles should exist at the site, in order to be " -"assigned to the new registered users." -msgstr "" - -#: ../includes/classes/screen-help.php:82 -msgid "Allow non super-admininstrators to create, edit and delete users" -msgstr "" - -#: ../includes/classes/screen-help.php:83 -msgid "" -"Super administrator only may create, edit and delete users under WordPress " -"multi-site by default. Turn this option on in order to remove this " -"limitation." -msgstr "" - -#: ../includes/classes/ure-lib.php:209 -msgid "Error: wrong request" -msgstr "" - -#: ../includes/classes/ure-lib.php:293 -msgid "Error: " -msgstr "" - -#: ../includes/classes/ure-lib.php:293 -msgid "Role" -msgstr "" - -#: ../includes/classes/ure-lib.php:294 -msgid "does not exist" -msgstr "" - -#: ../includes/classes/ure-lib.php:337 -msgid "Role is updated successfully" -msgstr "" - -#: ../includes/classes/ure-lib.php:339 -msgid "Roles are updated for all network" -msgstr "" - -#: ../includes/classes/ure-lib.php:345 -msgid "Error occured during role(s) update" -msgstr "" - -#: ../includes/classes/ure-lib.php:352 -msgid "User capabilities are updated successfully" -msgstr "" - -#: ../includes/classes/ure-lib.php:357 -msgid "Error occured during user update" -msgstr "" - -#: ../includes/classes/ure-lib.php:415 -msgid "User Roles are restored to WordPress default values. " -msgstr "" - -#: ../includes/classes/ure-lib.php:1463 -msgid "Error is occur. Please check the log file." -msgstr "" - -#: ../includes/classes/ure-lib.php:1509 ../includes/classes/ure-lib.php:1576 -msgid "" -"Error: Role ID must contain latin characters, digits, hyphens or underscore " -"only!" -msgstr "" - -#: ../includes/classes/ure-lib.php:1513 ../includes/classes/ure-lib.php:1580 -msgid "" -"Error: WordPress does not support numeric Role name (ID). Add latin " -"characters to it." -msgstr "" - -#: ../includes/classes/ure-lib.php:1528 -#, php-format -msgid "Role %s exists already" -msgstr "" - -#: ../includes/classes/ure-lib.php:1543 -msgid "Error is encountered during new role create operation" -msgstr "" - -#: ../includes/classes/ure-lib.php:1545 -#, php-format -msgid "Role %s is created successfully" -msgstr "" - -#: ../includes/classes/ure-lib.php:1569 -msgid "Error: Role ID is empty!" -msgstr "" - -#: ../includes/classes/ure-lib.php:1587 -msgid "Error: Empty role display name is not allowed." -msgstr "" - -#: ../includes/classes/ure-lib.php:1594 -#, php-format -msgid "Role %s does not exists" -msgstr "" - -#: ../includes/classes/ure-lib.php:1602 -#, php-format -msgid "Role %s is renamed to %s successfully" -msgstr "" - -#: ../includes/classes/ure-lib.php:1675 -msgid "Error encountered during role delete operation" -msgstr "" - -#: ../includes/classes/ure-lib.php:1677 -msgid "Unused roles are deleted successfully" -msgstr "" - -#: ../includes/classes/ure-lib.php:1679 -#, php-format -msgid "Role %s is deleted successfully" -msgstr "" - -#: ../includes/classes/ure-lib.php:1710 -msgid "Error encountered during default role change operation" -msgstr "" - -#: ../includes/classes/ure-lib.php:1713 -#, php-format -msgid "Default role for new users is set to %s successfully" -msgstr "" - -#: ../includes/classes/ure-lib.php:1716 -msgid "Can not set Administrator role as a default one" -msgstr "" - -#: ../includes/classes/ure-lib.php:1718 -msgid "This role does not exist - " -msgstr "" - -#: ../includes/classes/ure-lib.php:1734 -msgid "Editor" -msgstr "" - -#: ../includes/classes/ure-lib.php:1735 -msgid "Author" -msgstr "" - -#: ../includes/classes/ure-lib.php:1736 -msgid "Contributor" -msgstr "" - -#: ../includes/classes/ure-lib.php:1737 -msgid "Subscriber" -msgstr "" - -#: ../includes/classes/ure-lib.php:1739 -msgid "Switch themes" -msgstr "" - -#: ../includes/classes/ure-lib.php:1740 -msgid "Edit themes" -msgstr "" - -#: ../includes/classes/ure-lib.php:1741 -msgid "Activate plugins" -msgstr "" - -#: ../includes/classes/ure-lib.php:1742 -msgid "Edit plugins" -msgstr "" - -#: ../includes/classes/ure-lib.php:1743 -msgid "Edit users" -msgstr "" - -#: ../includes/classes/ure-lib.php:1744 -msgid "Edit files" -msgstr "" - -#: ../includes/classes/ure-lib.php:1745 -msgid "Manage options" -msgstr "" - -#: ../includes/classes/ure-lib.php:1746 -msgid "Moderate comments" -msgstr "" - -#: ../includes/classes/ure-lib.php:1747 -msgid "Manage categories" -msgstr "" - -#: ../includes/classes/ure-lib.php:1748 -msgid "Manage links" -msgstr "" - -#: ../includes/classes/ure-lib.php:1749 -msgid "Upload files" -msgstr "" - -#: ../includes/classes/ure-lib.php:1750 -msgid "Import" -msgstr "" - -#: ../includes/classes/ure-lib.php:1751 -msgid "Unfiltered html" -msgstr "" - -#: ../includes/classes/ure-lib.php:1752 -msgid "Edit posts" -msgstr "" - -#: ../includes/classes/ure-lib.php:1753 -msgid "Edit others posts" -msgstr "" - -#: ../includes/classes/ure-lib.php:1754 -msgid "Edit published posts" -msgstr "" - -#: ../includes/classes/ure-lib.php:1755 -msgid "Publish posts" -msgstr "" - -#: ../includes/classes/ure-lib.php:1756 -msgid "Edit pages" -msgstr "" - -#: ../includes/classes/ure-lib.php:1757 -msgid "Read" -msgstr "" - -#: ../includes/classes/ure-lib.php:1758 -msgid "Level 10" -msgstr "" - -#: ../includes/classes/ure-lib.php:1759 -msgid "Level 9" -msgstr "" - -#: ../includes/classes/ure-lib.php:1760 -msgid "Level 8" -msgstr "" - -#: ../includes/classes/ure-lib.php:1761 -msgid "Level 7" -msgstr "" - -#: ../includes/classes/ure-lib.php:1762 -msgid "Level 6" -msgstr "" - -#: ../includes/classes/ure-lib.php:1763 -msgid "Level 5" -msgstr "" - -#: ../includes/classes/ure-lib.php:1764 -msgid "Level 4" -msgstr "" - -#: ../includes/classes/ure-lib.php:1765 -msgid "Level 3" -msgstr "" - -#: ../includes/classes/ure-lib.php:1766 -msgid "Level 2" -msgstr "" - -#: ../includes/classes/ure-lib.php:1767 -msgid "Level 1" -msgstr "" - -#: ../includes/classes/ure-lib.php:1768 -msgid "Level 0" -msgstr "" - -#: ../includes/classes/ure-lib.php:1769 -msgid "Edit others pages" -msgstr "" - -#: ../includes/classes/ure-lib.php:1770 -msgid "Edit published pages" -msgstr "" - -#: ../includes/classes/ure-lib.php:1771 -msgid "Publish pages" -msgstr "" - -#: ../includes/classes/ure-lib.php:1772 -msgid "Delete pages" -msgstr "" - -#: ../includes/classes/ure-lib.php:1773 -msgid "Delete others pages" -msgstr "" - -#: ../includes/classes/ure-lib.php:1774 -msgid "Delete published pages" -msgstr "" - -#: ../includes/classes/ure-lib.php:1775 -msgid "Delete posts" -msgstr "" - -#: ../includes/classes/ure-lib.php:1776 -msgid "Delete others posts" -msgstr "" - -#: ../includes/classes/ure-lib.php:1777 -msgid "Delete published posts" -msgstr "" - -#: ../includes/classes/ure-lib.php:1778 -msgid "Delete private posts" -msgstr "" - -#: ../includes/classes/ure-lib.php:1779 -msgid "Edit private posts" -msgstr "" - -#: ../includes/classes/ure-lib.php:1780 -msgid "Read private posts" -msgstr "" - -#: ../includes/classes/ure-lib.php:1781 -msgid "Delete private pages" -msgstr "" - -#: ../includes/classes/ure-lib.php:1782 -msgid "Edit private pages" -msgstr "" - -#: ../includes/classes/ure-lib.php:1783 -msgid "Read private pages" -msgstr "" - -#: ../includes/classes/ure-lib.php:1784 -msgid "Delete users" -msgstr "" - -#: ../includes/classes/ure-lib.php:1785 -msgid "Create users" -msgstr "" - -#: ../includes/classes/ure-lib.php:1786 -msgid "Unfiltered upload" -msgstr "" - -#: ../includes/classes/ure-lib.php:1787 -msgid "Edit dashboard" -msgstr "" - -#: ../includes/classes/ure-lib.php:1788 -msgid "Update plugins" -msgstr "" - -#: ../includes/classes/ure-lib.php:1789 -msgid "Delete plugins" -msgstr "" - -#: ../includes/classes/ure-lib.php:1790 -msgid "Install plugins" -msgstr "" - -#: ../includes/classes/ure-lib.php:1791 -msgid "Update themes" -msgstr "" - -#: ../includes/classes/ure-lib.php:1792 -msgid "Install themes" -msgstr "" - -#: ../includes/classes/ure-lib.php:1793 -msgid "Update core" -msgstr "" - -#: ../includes/classes/ure-lib.php:1794 -msgid "List users" -msgstr "" - -#: ../includes/classes/ure-lib.php:1795 -msgid "Remove users" -msgstr "" - -#: ../includes/classes/ure-lib.php:1796 -msgid "Add users" -msgstr "" - -#: ../includes/classes/ure-lib.php:1797 -msgid "Promote users" -msgstr "" - -#: ../includes/classes/ure-lib.php:1798 -msgid "Edit theme options" -msgstr "" - -#: ../includes/classes/ure-lib.php:1799 -msgid "Delete themes" -msgstr "" - -#: ../includes/classes/ure-lib.php:1800 -msgid "Export" -msgstr "" - -#: ../includes/classes/ure-lib.php:1965 -msgid "Version:" -msgstr "" - -#: ../includes/classes/ure-lib.php:1966 -msgid "Author's website" -msgstr "" - -#: ../includes/classes/ure-lib.php:1967 -msgid "Plugin webpage" -msgstr "" - -#: ../includes/classes/ure-lib.php:1968 -msgid "Plugin download" -msgstr "" - -#: ../includes/classes/ure-lib.php:1969 -#: ../includes/classes/user-role-editor.php:512 -msgid "Changelog" -msgstr "" - -#: ../includes/classes/ure-lib.php:1970 -msgid "FAQ" -msgstr "" - -#: ../includes/classes/ure-lib.php:2152 -#, php-format -msgid "Denied: %s" -msgstr "" - -#: ../includes/classes/user-other-roles.php:81 -#: ../includes/classes/user-other-roles.php:182 -msgid "Other Roles" -msgstr "" - -#: ../includes/classes/user-other-roles.php:82 -msgid "Select additional roles for this user" -msgstr "" - -#: ../includes/classes/user-other-roles.php:161 -#: ../includes/classes/user-role-editor.php:394 -msgid "Capabilities" -msgstr "" - -#: ../includes/classes/user-other-roles.php:168 -msgid "Edit" -msgstr "" - -#: ../includes/classes/user-other-roles.php:218 -msgid "Additional Capabilities" -msgstr "" - -#: ../includes/classes/user-role-editor.php:293 -msgid "Change role for users without role" -msgstr "" - -#: ../includes/classes/user-role-editor.php:294 -msgid "To:" -msgstr "" - -#: ../includes/classes/user-role-editor.php:295 -msgid "No rights" -msgstr "" - -#: ../includes/classes/user-role-editor.php:296 -msgid "Provide new role" -msgstr "" - -#: ../includes/classes/user-role-editor.php:368 -#: ../includes/classes/user-role-editor.php:370 -msgid "You do not have permission to edit this user." -msgstr "" - -#: ../includes/classes/user-role-editor.php:486 -#: ../includes/classes/user-role-editor.php:499 -msgid "Settings" -msgstr "" - -#: ../includes/classes/user-role-editor.php:541 -#: ../includes/settings-template.php:26 -msgid "Additional Modules" -msgstr "" - -#: ../includes/classes/user-role-editor.php:547 -#: ../includes/settings-template.php:30 -msgid "Default Roles" -msgstr "" - -#: ../includes/classes/user-role-editor.php:657 -#: ../includes/classes/user-role-editor.php:675 -#: ../includes/classes/user-role-editor.php:720 -msgid "User Role Editor options are updated" -msgstr "" - -#: ../includes/classes/user-role-editor.php:703 -msgid "Default Roles are updated" -msgstr "" - -#: ../includes/classes/user-role-editor.php:729 -msgid "" -"You do not have sufficient permissions to manage options for User Role " -"Editor." -msgstr "" - -#: ../includes/classes/user-role-editor.php:842 -msgid "Confirm" -msgstr "" - -#: ../includes/classes/user-role-editor.php:843 -msgid "Yes" -msgstr "" - -#: ../includes/classes/user-role-editor.php:844 -msgid "No" -msgstr "" - -#: ../includes/classes/user-role-editor.php:845 -msgid "Select All" -msgstr "" - -#: ../includes/classes/user-role-editor.php:846 -msgid "Unselect All" -msgstr "" - -#: ../includes/classes/user-role-editor.php:847 -msgid "Reverse" -msgstr "" - -#: ../includes/classes/user-role-editor.php:848 -msgid "Update" -msgstr "" - -#: ../includes/classes/user-role-editor.php:849 -msgid "Please confirm permissions update" -msgstr "" - -#: ../includes/classes/user-role-editor.php:850 -msgid "Add New Role" -msgstr "" - -#: ../includes/classes/user-role-editor.php:851 -#: ../includes/classes/user-role-editor.php:856 -msgid "Rename Role" -msgstr "" - -#: ../includes/classes/user-role-editor.php:852 -msgid " Role name (ID) can not be empty!" -msgstr "" - -#: ../includes/classes/user-role-editor.php:853 -msgid "" -" Role name (ID) must contain latin characters, digits, hyphens or underscore " -"only!" -msgstr "" - -#: ../includes/classes/user-role-editor.php:854 -msgid "" -" WordPress does not support numeric Role name (ID). Add latin characters to " -"it." -msgstr "" - -#: ../includes/classes/user-role-editor.php:855 -msgid "Add Role" -msgstr "" - -#: ../includes/classes/user-role-editor.php:857 -msgid "Delete Role" -msgstr "" - -#: ../includes/classes/user-role-editor.php:858 -msgid "Cancel" -msgstr "" - -#: ../includes/classes/user-role-editor.php:859 -msgid "Add Capability" -msgstr "" - -#: ../includes/classes/user-role-editor.php:860 -#: ../includes/classes/user-role-editor.php:869 -msgid "Delete Capability" -msgstr "" - -#: ../includes/classes/user-role-editor.php:861 -msgid "Reset" -msgstr "" - -#: ../includes/classes/user-role-editor.php:862 -msgid "DANGER! Resetting will restore default settings from WordPress Core." -msgstr "" - -#: ../includes/classes/user-role-editor.php:863 -msgid "" -"If any plugins have changed capabilities in any way upon installation (such " -"as S2Member, WooCommerce, and many more), those capabilities will be DELETED!" -msgstr "" - -#: ../includes/classes/user-role-editor.php:864 -msgid "" -"For more information on how to undo changes and restore plugin capabilities " -"go to" -msgstr "" - -#: ../includes/classes/user-role-editor.php:866 -msgid "Continue?" -msgstr "" - -#: ../includes/classes/user-role-editor.php:867 -msgid "Default Role" -msgstr "" - -#: ../includes/classes/user-role-editor.php:868 -msgid "Set New Default Role" -msgstr "" - -#: ../includes/classes/user-role-editor.php:870 -msgid "" -"Warning! Be careful - removing critical capability could crash some plugin " -"or other custom code" -msgstr "" - -#: ../includes/classes/user-role-editor.php:871 -msgid " Capability name (ID) can not be empty!" -msgstr "" - -#: ../includes/classes/user-role-editor.php:872 -msgid "" -" Capability name (ID) must contain latin characters, digits, hyphens or " -"underscore only!" -msgstr "" - -#: ../includes/classes/user-view.php:61 -msgid "Switch To" -msgstr "" - -#: ../includes/classes/user-view.php:73 -msgid "Network Super Admin" -msgstr "" - -#: ../includes/classes/user-view.php:98 -msgid "— No role for this site —" -msgstr "" - -#: ../includes/classes/user-view.php:137 -msgid "Change capabilities for user" -msgstr "" - -#: ../includes/classes/user-view.php:172 -msgid "Primary Role:" -msgstr "" - -#: ../includes/classes/user-view.php:178 -msgid "bbPress Role:" -msgstr "" - -#: ../includes/classes/user-view.php:187 -msgid "Other Roles:" -msgstr "" - -#: ../includes/classes/view.php:260 -msgid "Group" -msgstr "" - -#: ../includes/classes/view.php:260 -msgid "Total" -msgstr "" - -#: ../includes/classes/view.php:260 -msgid "Granted" -msgstr "" - -#: ../includes/classes/view.php:267 -msgid "Quick filter:" -msgstr "" - -#: ../includes/classes/view.php:270 -msgid "Granted Only" -msgstr "" - -#: ../includes/classes/view.php:273 -msgid "Columns:" -msgstr "" - -#: ../includes/settings-template.php:17 -msgid "User Role Editor - Options" -msgstr "" - -#: ../includes/settings-template.php:39 -msgid "About" -msgstr "" - -#: ../includes/settings-template.php:77 -msgid "Confirm role update" -msgstr "" - -#: ../includes/settings-template.php:98 ../includes/settings-template.php:134 -#: ../includes/settings-template.php:166 ../includes/settings-template.php:198 -msgid "Save" -msgstr "" - -#: ../includes/settings-template.php:146 -msgid "Primary default role: " -msgstr "" - -#: ../includes/settings-template.php:153 -msgid "Other default roles for new registered user: " -msgstr "" - -#: ../includes/settings-template.php:159 -msgid "" -"Note for multisite environment: take into account that other default roles " -"should exist at the site, in order to be assigned to the new registered " -"users." -msgstr "" - -#: ../includes/settings-template.php:185 -msgid "Allow non super administrators to create, edit, and delete users" -msgstr "" diff --git a/wp/wp-content/plugins/user-role-editor/license.txt b/wp/wp-content/plugins/user-role-editor/license.txt deleted file mode 100644 index f75c095f..00000000 --- a/wp/wp-content/plugins/user-role-editor/license.txt +++ /dev/null @@ -1,375 +0,0 @@ -User Role Editor WordPress plugin - -Copyright 2009-2016 by Vladimir Garagulya - vladimir@shinephp.com - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -This program is based on the work covered by the following copyright and -permission notices: - - WordPress - Web publishing software - - Copyright 2003-2010 by the contributors - - WordPress is released under the GPL - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - 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 Lesser 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 - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. - -WRITTEN OFFER - -The source code for any program binaries or compressed scripts that are -included with WordPress can be freely obtained at the following URL: - - http://wordpress.org/download/source/ diff --git a/wp/wp-content/plugins/user-role-editor/readme.txt b/wp/wp-content/plugins/user-role-editor/readme.txt deleted file mode 100644 index db926959..00000000 --- a/wp/wp-content/plugins/user-role-editor/readme.txt +++ /dev/null @@ -1,181 +0,0 @@ -=== User Role Editor === -Contributors: shinephp -Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=vladimir%40shinephp%2ecom&lc=RU&item_name=ShinePHP%2ecom&item_number=User%20Role%20Editor%20WordPress%20plugin¤cy_code=USD&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted -Tags: user, role, editor, security, access, permission, capability -Requires at least: 4.0 -Tested up to: 4.7.3 -Stable tag: 4.32.3 -License: GPLv2 or later -License URI: http://www.gnu.org/licenses/gpl-2.0.html - -User Role Editor WordPress plugin makes user roles and capabilities changing easy. Edit/add/delete WordPress user roles and capabilities. - -== Description == - -With User Role Editor WordPress plugin you can change user role (except Administrator) capabilities easy, with a few clicks. -Just turn on check boxes of capabilities you wish to add to the selected role and click "Update" button to save your changes. That's done. -Add new roles and customize its capabilities according to your needs, from scratch of as a copy of other existing role. -Unnecessary self-made role can be deleted if there are no users whom such role is assigned. -Role assigned every new created user by default may be changed too. -Capabilities could be assigned on per user basis. Multiple roles could be assigned to user simultaneously. -You can add new capabilities and remove unnecessary capabilities which could be left from uninstalled plugins. -Multi-site support is provided. - -To read more about 'User Role Editor' visit [this page](http://www.shinephp.com/user-role-editor-wordpress-plugin/) at [shinephp.com](http://shinephp.com) - - -Do you need more functionality with quality support in a real time? Do you wish to remove advertisements from User Role Editor pages? -[Buy Pro version](https://www.role-editor.com). -[User Role Editor Pro](https://www.role-editor.com) includes extra modules: -
      -
    • Block selected admin menu items for role.
    • -
    • Hide selected front-end menu items for no logged-in visitors, logged-in users, roles.
    • -
    • Block selected widgets under "Appearance" menu for role.
    • -
    • Show widgets at front-end for selected roles.
    • -
    • Block selected meta boxes (dashboard, posts, pages, custom post types) for role.
    • -
    • "Export/Import" module. You can export user roles to the local file and import them then to any WordPress site or other sites of the multi-site WordPress network.
    • -
    • Roles and Users permissions management via Network Admin for multisite configuration. One click Synchronization to the whole network.
    • -
    • "Other roles access" module allows to define which other roles user with current role may see at WordPress: dropdown menus, e.g assign role to user editing user profile, etc.
    • -
    • Manage user access to editing posts/pages/custom post type using posts/pages, authors, taxonomies ID list.
    • -
    • Per plugin users access management for plugins activate/deactivate operations.
    • -
    • Per form users access management for Gravity Forms plugin.
    • -
    • Shortcode to show enclosed content to the users with selected roles only.
    • -
    • Posts and pages view restrictions for selected roles.
    • -
    -Pro version is advertisement free. Premium support is included. - -== Installation == - -Installation procedure: - -1. Deactivate plugin if you have the previous version installed. -2. Extract "user-role-editor.zip" archive content to the "/wp-content/plugins/user-role-editor" directory. -3. Activate "User Role Editor" plugin via 'Plugins' menu in WordPress admin menu. -4. Go to the "Users"-"User Role Editor" menu item and change your WordPress standard roles capabilities according to your needs. - -== Frequently Asked Questions == -- Does it work with WordPress in multi-site environment? -Yes, it works with WordPress multi-site. By default plugin works for every blog from your multi-site network as for locally installed blog. -To update selected role globally for the Network you should turn on the "Apply to All Sites" checkbox. You should have superadmin privileges to use User Role Editor under WordPress multi-site. -Pro version allows to manage roles of the whole network from the Netwok Admin. - -To read full FAQ section visit [this page](http://www.shinephp.com/user-role-editor-wordpress-plugin/#faq) at [shinephp.com](shinephp.com). - -== Screenshots == -1. screenshot-1.png User Role Editor main form -2. screenshot-2.png Add/Remove roles or capabilities -3. screenshot-3.png User Capabilities link -4. screenshot-4.png User Capabilities Editor -5. screenshot-5.png Bulk change role for users without roles -6. screenshot-6.png Assign multiple roles to the selected users - -To read more about 'User Role Editor' visit [this page](http://www.shinephp.com/user-role-editor-wordpress-plugin/) at [shinephp.com](shinephp.com). - -= Translations = - -If you wish to check available translations or help with plugin translation to your language visit this link -https://translate.wordpress.org/projects/wp-plugins/user-role-editor/ - - -== Changelog == -= [4.32.3] 03.04.2017 = -* Fix: Boolean false was sent to WordPress core wp_enqueue_script() function as the 2nd parameter instead of an empty string. We should respect the type of parameter which code author supposed to use initially. -* Fix: Bulk grant to users multiple roles JavaScript code is loaded now for users.php page only, not globally. - -= [4.32.2] 17.03.2017 = -* Fix: "Users->Grant Roles" button did not work with switched off option "Count Users without role" at "Settings->User Role Editor->Additional Modules" tab. "JQuery UI" library was not loaded. -* Update: minimal PHP version was raised to 5.3. - -= [4.32.1] 09.03.2017 = -* Fix: URL to users.php page was built incorrectly after bulk roles assignment to the users selected at the 1st page of a users list. - -= [4.32] 09.03.2017 = -* New: Button "Grant Roles" allows to "Assign multiple roles to the selected users" directly from the "Users" page. -* Update: singleton template was applied to the main User_Role_Editor class. While GLOBALS['user-role-editor'] reference to the instance of User_Role_Editor class is still available for the compatibility purpose, call to User_Role_Editor::get_instance() is the best way now to get a reference to the instance of User_Role_Editor class. -* Fix: Missed 'unfiltered_html' capability is shown now at the 'General' capabilities group too. - -= [4.31.1] 06.01.2017 = -* Fix: WP transients get/set were removed from URE_Own_Capabilities class. It leaded to the MySQL deadlock in some cases. -* Update: Base_Lib::get_request_var() sanitizes user input by PHP's filter_var() in addition to WordPress core's esc_attr(). - -= [4.31] 14.12.2016 = -* New: It's possible to remove unused user capabilities by list. -* Fix: There was no support for installations with the hidden/changed URL to wp-admin. URE uses 'admin_url()' now to get and check admin URL, instead of direct comparing URL with 'wp-admin' string. -* Fix: Deprecated capabilities were shown in some cases at the 'Core' group even with "Show deprecated capabilities" mode switched off. -* Update: Capability groups CSS classes are prefixed with 'ure-' in order to minimize possible CSS conflicts with other plugins/themes which may load styles with the same classes globally and break URE's markup. - -= [4.30] 01.12.2016 = -* Update: compatible with WordPress 4.7 -* New: "Granted Only" checkbox to the right from the "Quick Filter" input control allows to show only granted capabilities for the selected role or user. - -= [4.29] 10.11.2016 = -* New: User Role Editor own user capabilities are grouped separately under Custom capabilities. -* Update: URE_Lib::is_super_admin() uses WordPress core is_super_admin() for multisite setup only. Superadmin is a user with 'administrator' role in the case of single site WordPress installation. - This is the difference with the WordPress core which counts as a superadmin (for single site WP installation) any user with a 'delete_users' capability. -* Update: BaseLib::option_selected() calls were replaced with the calls of a similar selected() function from WordPress core. - -= [4.28] 20.10.2016 = -* New: WooCommerce plugin user capabilities (if exist) are grouped separately under Custom capabilities. -* Update: Temporally raised permissions flag is taken into account when checking, if user has a superadmin privileges. WordPress is_super_admin() function was replaced with custom wrapper to define if current user is a real superadmin or just a local admin with the temporally raised (add/edit users pages) permissions. - -= [4.27.2] 15.09.2016 = -* Update: There was a conflict with plugins which use a '|' character at the custom user capabilities: e.g. 'Nginx Helper | Config' from "Nginx Helper' plugin. -* Fix: PHP notice was removed: Undefined property: URE_Role_View::$multisite in wp-content/plugins/user-role-editor/includes/classes/view.php on line 143 -* Fix: WordPress multisite: Settings link under the URE plugin at the plugins list leads to the network admin now, not to the the single site settings page, which does not exist. -* Fix: WordPress multisite: conflict with "Visual Composer" plugin was resolved: single site administrators could now use Visual Composer editor. -* Fix: WordPress multisite: changed role name was not replicated to other sites when user clicked "Update" with "Apply to All Sites" option turned ON. - -= [4.27.1] 22.08.2016 = -* Update: There was a conflict with plugins which use a '/' character at the custom user capabilities: e.g. vc_access_rules_backend_editor/disabled_ce_editor from Visual Composer. -* Update: add/delete, escape, validate user capability code extracted from URE_Lib to the separate URE_Capability class - -= [4.27] 18.08.2016 = -* New: Total/Granted counters were added to the capabilities groups titles. -* New: "Columns" drop-down menu allows to change capabilities section layout to 1, 2 or 3 columns. -* New: Capabilities section is limited in height and has independent scrollbar. -* Update: User Role Editor page markup was updated to use more available space on page. -* Update: URE_Ajax_Processor class allows to differentiate required user permissions according to action submitted by user. -* Fix: CSS updated to exclude text overlapping at capabilities groups section when custom post type name is not fitted into 1 line. -* Fix: required JavaScript files were not loaded at "Network Admin->Settings->User Role Editor" page. - -= [4.26.3] 25.07.2016 = -* Fix: Selecting a sub-group/list of caps does make the ure_select_all_caps checkbox select all within that group, but checking that box when at the "All" top-level group did not work. -* Fix: Notice: Undefined property: URE_Role_View::$apply_to_all - -= [4.26.1] 14.07.2016 = -* Fix: some bugs, like 'undefined property' notices, etc. - -= [4.26] 14.07.2016 = -* New: User capabilities were groupd by functionality for more convenience. -* Update: URE_KEY_CAPABILITY constant was changed from 'ure_edit_roles' to 'ure_manage_options'. To make possible for non-admin users access to the User Role Editor without access to the 'administrator' role and users with 'administrator' role. -* Update: User receives full access to User Role Editor under WordPress multisite if he has 'manage_network_plugins' capability instead of 'manager_network_users' as earlier. This allows to give user ability to edit network users without giving him access to the User Role Editor. -* Update: Multisite: use WordPress's global $current_site->blog_id to define main blog ID instead of selecting the 1st one from the sorted list of blogs. -* Update: use WP transients at URE_Lib::_get_post_types() to reduce response time. -* Update: various internal optimizations. - -= [4.25.2] 03.05.2016 = -* Update: Enhanced inner processing of available custom post types list. -* Update: Uses 15 seconds transient cache in order to not count users without role twice when 'restrict_manage_users' action fires. -* Update: URE fires action 'profile_update' after direct update of user permissions in order other plugins may catch such change. -* Update: All URE's PHP classes files renamed and moved to the includes/classes subdirectory - -= [4.25.1] 15.04.2016 = -* Fix: Selected role's capabilities list was returned back to old after click "Update" button. It was showed correctly according to the recent updates just after additional page refresh. -* Update: deprecated function get_current_user_info() call was replaced with wp_get_current_user(). - -= [4.25] 02.04.2016 = -* Important security update: Any registered user could get an administrator access. Thanks to [John Muncaster](http://johnmuncaster.com/) for discovering and wisely reporting it. -* URE pages title tag was replaced from h2 to h1, for compatibility with other WordPress pages. -* Fix: "Assign role to the users without role" feature ignored role selected by user. -* Fix: PHP fatal error (line 34) was raised at uninstall.php for WordPress multisite. -* Update: action priority 99 was added for role additional options hook action setup. - - -Click [here](https://www.role-editor.com/changelog) to look at [the full list of changes](https://www.role-editor.com/changelog) of User Role Editor plugin. - - -== Additional Documentation == - -You can find more information about "User Role Editor" plugin at [this page](http://www.shinephp.com/user-role-editor-wordpress-plugin/) - -I am ready to answer on your questions about plugin usage. Use [plugin page comments](http://www.shinephp.com/user-role-editor-wordpress-plugin/) for that. diff --git a/wp/wp-content/plugins/user-role-editor/screenshot-1.png b/wp/wp-content/plugins/user-role-editor/screenshot-1.png deleted file mode 100644 index 050feb0a4f4d6d29e7935442da285bb569c4e67f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49845 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 O|8A+@Rx49MhW~#+KO(~b diff --git a/wp/wp-content/plugins/user-role-editor/screenshot-2.png b/wp/wp-content/plugins/user-role-editor/screenshot-2.png deleted file mode 100644 index 6e978db3cae10b96ada9299e8257625e2ca51607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31691 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 eOCzusq}4wl7CboDbMSe?1RAP3$TDS{Xa5I?0t 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%0DL@_fK(9QeUvjfi}x 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 diff --git a/wp/wp-content/plugins/user-role-editor/screenshot-5.png b/wp/wp-content/plugins/user-role-editor/screenshot-5.png deleted file mode 100644 index 8caa2e55ae4c6ce3640f16fee223e5bdf0108f99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16994 zcma*Oby(D0*EWn|Q%Zw`N(o5!(A_h@0LoBOB3(nnpeP`XgrLj_NDMz1F$Hb%3fQ59l8d5D<{4t10Ob5Zpu(5Zt)D zM~E+JOKamGARr{r(b89bNO0pG(cOpl?~)QdBqpIIeMn46MnX?YO!SC}n4FrKjF{>X zBPqpmdRl5~+UL)y$)3_MkUSQB$nczmL4e{hmmn1h3mr8NEeRX_BU%OyTE-`WwD$;D z_!t?UaM95}XCS@JBKU;iIWyDan;a4nk00_dJ-Npr{E$st^vNR{HYpC4XSD1hf=?M` znMwIr7?{{aX*dO$IRyDxIEC2hxY-4ySswvd>7}0v+~ZS}f5s*JoQj9@2?v+JBYr7v zE}kbZe_33CYu3yAZ9xWvQ&LPAFb z4`hYe_(kRDrPQ8F$nV~|BQNswiL}x%3Hj1}QdMC=WicjsF@AA?ST7X~i=w866qA&U z6^JT-$_ zsa#z0igK!od{WBtlFBOjauU(}{7TA-4ggs}4Q(wYX@HuxjGCg9nmSZMLQ6$BNK8~s z6`-W5p{t~Q?XHn!J;@Dl>fJsb>=@Y~SH$39`0*b0Q~~VxkmoW~1qVEHx5! zwSV1YA+7`KsdZJTasvjz{33$vZ9f(Ty-U#jH0Ti;@hZF}C&ab7i5eF8WMiBdUc&5+qSkE zJ?8(UVwz&nZ5>s;E8V?ai4$iR&COX8`-PLUn8CWUv8dLS_SyOA%lXWi#ocbq#l`Gg z-41STeFeK#I=XY-b#!sIGl<)3ojAj;onB&((Wj>y$EQbIINZhM=E>#N6?X9gdyc~% zUSI8AU1N_q-W}kN#0^VLRV9K?w;9#&ANO6=j64Vkh$#O4-5~e|r^OfEg{o^S-<>C7 zx=nk>Rm2=$^n^fNNnYP)a(jlz1bjNf@0uX@OTSJ~j>w6Xs+IpEARv(YIqAdqs?T2K z#_Ay7duz#MSR!l{IGZ%kE$>EjJ}V?QxJ*@TI(r(Ad2bdSV^%OV(wn2wPGiXJ>3}KE zK12UOzpwqf*RsiQ3Uc?S$qCD+m(SJva6x@y*T(VJUo-Amr10}gMbfQP5+Z(piJ<@+ zTDr!MkD}Aja(9-HaxCkV2+MRZGy+J7fr<+>B>2}DNQ?yo1qL_)%E*5^LAivG+jbfu zTz1BdEe0$T$g6{zHfY2b-I<$1TBEox>l$)9; zL-ODNgn5oWE9+?lP0ChzK7ajeH8=&lNy%lDu|q}JXFkJrVlUqc_hMN*Yx3yzgV99++p8+tkE9;=^g~A2x-16o0geakt{p?{ z&A2(@$u@*x%m^;X>r(U`ZE0)N(^{dYwlNmxxs_odAIIsWebv&BXbg-?hEnxdyB(^*sQ2$Y@ zz$IiIlG)1_3<=I*!f&@2FiZxSxAOf9XK6^MaZ-AzoUr^xqVel^FjxGqtYbX{?z6{( z<1uI@Y!XsJCuo|>rk~}II*6b1G!P|tdn#A#m?Lkab>w~EYu({;Z&wW(SLg$R)4>Lm z-cZ(k==K*G@sYMt(Urp%ocy93dC%=&Lqq48d83W}YH9c-Mm2SzT z7w>?Bb^{F@(kc0dT$Dr(FHEeM%vfKnm-p+jQIdW-0C(P87bZvKbw#UKwLf5kr7ayB}R&{>}W#ewOCFk)`QhA zanYU{%3Alg?a8VE#szx5~d9W~h+-K?(x1YF+it~$5z06Vqk2mX>?#4rS% zNv!Prs(K<8cGU+=-DJEvald5o0 zJ1i4jNmt_0tA`|+Huat_$r!*_>x)*aLB4>e8!adt1JTr%?-b+fuhH-9e*OTL zV_cyS{<4^9d(blU=eNhe8cVq&_C%BQn8ghP{>%^4)bY!XY`#X5(Y{9C{M>8qcpmQ! z$$h8i7RF3oJkT~Y#LXW>`+i%^DR`khXbKGue~&GBn--4vvt4PIjxga_t6hN~_?ymd zEqR?SF%OG?_ow%hmb066{p+iD*yl|a=UQHwIXN#n1|oMCW760|r>b!f@+_t|xkBrFr%`RBX|SJZ()A00 zrc4GwmR>=N1CYstCIeS5Z;1avmrZgi6aU@(qi{WwPA2jqPhe=#0Ouijm&O z?kBYTl%z4$EH%2!nGuiPb?n#YGg<4trK3_rM?_}MrZYqx6aT5D7M1w9jgfqIkr z^JQ99Gjrnyu$S?yOW&(Z&O90kw#R6?@vMX@!ep{7NbF#^ zs0O)WpQtx>OCm$E%H>>*QT;EGkR2J<`6t*UsnJ#aKa>D)hC|VdFN^S~@tC9Z^_c zhW;f)cnC;$?0YtH1LS=J`1JbrKO#>S3f;S0L6l0;RN6VFn@H!U_kG&snO9ADtEr2* zux+QkAUBw31BlRBLk@zOEdgxok$Gz~-@N6b=a$GMM{d>juWxN@ z^WB%25w0dVp%lR-6Ubiqvc}5kSX`H z{Ito_jVUjscCs+lyvPbKq?t<$raYwvTA?`IcINji`3U=rXc%-G8Nf)JBX}t#YdIN; zjE3#3w*ZMYZyz0U zsFwO&6VP0FDuJAq0*kRKJM3XUq0r8ZPP^z#3dzDJNhxm@&eSb`A<9x$FPeD1SDr3S zWSmR8cae;7djg_wAnPxbeq^+Dg85{b_Mc)ajAfZ&5Bu86y>v|{iIgw6B56{+#$xQP zrgWhMc6vLt&@M6o9`~*o#Kz`3^lV_;D}mpqko*0?^TXz~$A=4d7aX-5Xw08@rbX!e z?TY3TX{?e~M#Q1mw{vd|#kgY-g7T z{s%+*nEr3?xN0y%)m_5ognvz}%4@cC8-M=HY)x0db&S4|1d02I zE&Ws6Wx?8-;OSsX3V{#P{O;*moZQGiz05ftSG6??0Y^8qQV*@2$u4vP zrzG$v<4hq4uJEW#pu+m~9(6YEe$bq$vU~pL*&uJLzBg81bu8$%>OK z@`qw8re&fNXlpXb-cG{Vg{<+4>R;?&rm)>s|G`SJp3ZfdjMaEZb*?S)wcX^*?bFquX z&USHHo4a{0MK?woy0mJ7(02S`VULe%(Yh1jjM1#fWmvz^AKH5Vuh0C8AwErW-Y-Rp zbMhVD5wHt=e2Jau`<1G4pqUAV(i0%_+?%>zwQ;fn&pEKBnzpkQdg>lJ4_+N;Yz<%f z!!4_0R~nGOrPD$!4UNeGnzgLywVhhYD!v$mJVL{)WJSg_%A6kY15F^_yTej75OSgu zWg%{mL_GeH0~_eQ_7{qg+yk~2|Ek^3VSS;0sF{g=>jfwupFcO0Hcs)JG?BALbyb;- znatQ{;q%IfEwvjkba4Lapmfp4SXDkFeCilQEo`kyWltZS#qmV+U?q1*psQNWkMB2xK zw6xlxwAkoq?UXTzBs5}-PN}%EsbGKDUDl-gcw*H~lCjUAJ&&3my8(4LFGr6y066Uy zLjPbSE1Ylt2;?O4D;Q0BT%i5sbJCqLAf^WeTK9Wc!)YagW$ff6<3>)5hR0-k^n%4r z=~H=N%5OxM0I;DSP+JoMcD;j8$CikRk&i!-?sd=SFkWA~mBd+~a z7Okv>5WSke4RY!h6taII96sHhm9_FlzF!|0=1x4CwBnjGNqu~?`ZGg(+A43AoXBsf z__9BOrIv*u9`-pxoq%d0Kp|GEX6TOQHHo#^RDqey%ZihPil#11$IzC5DsoA4&BNDm zV*06IzhT_8y*>ToMijg|_zSx?WV2|K4ivpxUcol1aGZ`Fo#E<*TAC(DyXsv&EvD@n zH0m%m_AznH{qQ5knq>z;%HeLr%<%C~B@OA#nBRg@wd3pzBWGLg##0QrzbJc{X(521 zC{uvE*y~5+a^x)EHT63B;m;I35tR+f2sq7XLPhP!WM!_$b6cK3^>@QOVpGRj6EP5T zV&Y5cvQXp?(X@6Gr{`0~*-W|1oL3)5NG}*QWqyotp*S; zG)?OfV56ydy^~VNH~7Rvxs*6i8V26?u@}$^MYW);a?tCOc5}~!tSPr9p4re}{~G6) zYXALRy$X1#e`l7Hq2=s&1uNOj&R{U*d3Rml^ijT~k&g;)7pshjo2V?1_=#;g5Co2IybUv-+Gx#O( z>({U4U+#8EM=cMBC7>NcF=~iiogHLRq`jg#44LhHHAAx_cJ zh#!R|GWVZNX!UcN$nP(8S=#mXRe&2pY-K;4Xc@%&?WFK$kdY=Z90Emr6-!Z;wv!Y( z+=#y`3^i3mJacjifOYwnioW=8bMAK|!<$2J?RQSZ2@iy%dg-E00+9gM!vw${@Uj8V zzY5E4Qw;k=eP*xq+BmtS;Agx2m{2zQGsBSRWa_PvyNi?%T$7ioyC|CLxfDdzkTn&f1#84= z6~XLn?i84?cT2Ff8m0i)Xp-{N4h$L_T6&3_6MKcxKL(AeUA*lROmbyQE0?FI}c&iN50uvyI0+VIrjbfbs(?U3;lHJ?c(>4vU#&VX%G zFDqY-x|k8NepL%m89v8hF;A%n?Ji(?T%PUdY47i!wka~B!7F7_={GfWJ`f|Az+M^R zv;@Lgz0NWe%OD`3=h6JZ8xXeG74W_k=d6p?;%$BVWXelkDtE@7i|Z2#A%j)+LLBp_qpH zSvHdMN^EVMI7>>1>;rH;Dtau1#?Jdc(;5*+ha9OPA85^s4S9+wB-xIs4fbiJr&Cre zk&CxJtqxHh2xXw|c*v4%t6`9g=<{i)^m69t@eu2s%|o1M26MLdbmp@lWX2Wo^j9=2 z>}nqq(9r04^)7llCBAp<@+fnF%0cl^I+4BM$I~LWbTBiVbmh(PE9^?*HgVt+T_Et% zLukT28{5DU4OBc1MBRLA7hT|O=G3-(oB^&DXY70bz!Am)yQV}eo`P^Y!<1Xhy+6R6 z6~gB*a+}@ZWg2c_2qc&&Y3m_kvN#*GmL?hQ?hP~ zL~LC~SjC1ZC)PBf3yeVS?+RlFN@XH2PyJfEVi5Ln4NG?;veIDlzzp35*#j_0T zd_LePsj;ZvDoNEA`$ACkOhi%{S!!6roH$#V<|L&(uCNQuhx8t6mH;~wRs~lA8m4L5 zV)a|_4kxQ>W@QaBV8@Ej_yy-~;`AwN1BFRnm9Xb@E)=?fo?k_~Pp&___gqb*szU?y z0c_xe(5q-s`<{rhN_v1o|Lb<*{RNDUmqQMshX3H5M);F3P7K8KvTY=iBZZ8k+fIh( zM?sG}X#&nA3@HG|{5b;a8@fM^PHJtwJVB=I=KseXrHHGx%Utf>A5{lV%u!Ey-Pu!3 z!4*Nn|^)oBBnD10?tlm7U&bp_LsxNT;9aJ*-HQqjr3RM4WKl6tqD4G#Ct;% ztiRfahZ>sS*Dg$qQEaq$p$5$M_t+_~0~UUo7@(m60;`{9Ru3jmxP9GL6pL(gH*9yD zP0V6nx)I*yb^>s|ur!fa8{VDrTGCGp=;S?LdaW9M4C@Y?S}#$4z(KZ#w$fTTz`*^F=q7}oLD`N+o0YCxwjhQE3F*2^!+O}5o3}sv(lbfsB3r{Z<;)mpEyfL~TuT|#OoMEn=Ax4D z6yWlggU6IgM$#gu;|8(o-CMtU`r6&!klb(@RO^)y4~eRQ|CM9LL^jmoMP*@@0NX@1 zPQ1=bBWXuw`8|VLS-0*4ZnvDL2tH*rF3CeZsSE9RdzDy1({=u;FE|?mH!EE#J*)kV zx~|$*ua^D8Pbk{S+uFX6gtn?ZzA*M?K6uU%J2CI4e?m~6DS9YLjG$%$>Joam<3>9tTeRL0P}B%}A$=9o~urPtA%aJtdg(^2SA}L{cE}gN$R`Vv|aD z<8Jy0{i08jezM!%@%(hcKZK{CPfhozNi57fsD z@=Hw8VV)9W&CJ&mhnN!?NK%)Qs=-n3TK@2ZBY>GNF-or(g#gi|4{_pT`1f5k7uEGY z|Il$ui$4ktiveb;VZOK;L;!XFhFwbU`(BCjX~Dmwqn~gdFSh%x4-4h2QzmtFp@?$k zDVx&>H^JHFM5oq01C9<)>S?^&gf8&%bKntk?X6D zz+tpAR^>#r*4Tfb_rQLv@$szUj6?E<5EthmIYSMB5@2=stDUgVdKVw!Sw1J_(qSsL zl`QPUD(85=*akSf&GtLs`Eq(KI0H!@O| zE{eNYh6YwnRHGMKLpwo|5Jtl^;Xh0K8EAgejl^p=rVP6(E3OwCA&t?Hwfjzjmy1xJ zeZdd-Ku)J12GgMt=6#)Ye-KmNDsEpEO>b->?$o6T;tNig`kY*Z`?2~vu88ToBkyol z^0zQ(e!)>ij^UN~)3o74NWqLR#)u8#A*SnhITPnST3T%_Ep?l8BzrWX;Kla)7|U** ztG2oq+bT8psw$;rw|U=Fyhc3l(cmbWQJR^osd)EOT1+U@{fn=U+eoPm(c@&E?%bze z*Y_4Rd?wYu#}st*^sG-Omh(6B2OKh1(;@zO`Dj6dD`dqyEE-z7`aY$&&so$paKazR z6268@ZjaX$KVl%olp~_)7xlsY%gE#tL*!T)aKSSq$LIw3mC4~Wel-IN$+wICf|~%} zrX*vWG|O{IqWj(?N%k?mQBm{B+O5&)XHAoEFxUb$VJ|?{)W&6KG`;1^+CI>j+YU$s zJ2OJ=13g9|Du%r4<&`{w6v(|HNV4|#N*m(>3hGx3rSsFbb;iA`niLSwCbhmhuN(?P z5RU?Z%8iB=CP|lyHF^$`okIEH;9tBW^QFe%Za~P`_BW>mo!Jj1cpv&`rvDSZnSGo5 ziW{VXZ#!?8G52ipioR_2cUR{-SIu#Y9Op(Bpq&BXj#2&qgDq3*%AyxYvaD$&)nMsL zoCxnm25^B*v(l;W4Ur8A@P>%FQ#Qp#$7JBoJF+Y_@XAlg4sNUE&mse)9JkfNHqr8k z;Fq}#69`Ci6Q>=sU1fy>&(U2r@3MP^F~FBbd73#EZJck5mK`!r>Wpz+el}VlCPhVVm0B{?E+@b( z;>Sn+fjgJkO|mhng?bZ`o;0(^hhbGijE_#2>fS;(PCU?iFX`Q6`yw?A00UJ71WeO^ zxd6ziYW8H#n~fZd8M1xN?y^7NDqFFKKL$|c=1=0`vy7dx{t=?cp&jtl+ZJ)@PZ}&8 zs1dg_3kM}}#HT&xHRV(=2TQil!tQVw^I8U2Lej}iG~Hh_MUo1)b)Q8LPLGff39SI@ z)4vBI=AN=dAr4Mi6~BL8F7K{J7rAz?mM%wmm4`?EfOOQGtUK zJdioA(7#PgYh39YeS1dh&7_Obq7CYdE@nnn-1F?6bC_HYWah#eWm1jDHz(t-x+&Ci z=;YFA6VYy|!3Opa1nVJIIDV1ez>h&2xB%UG<^K)fRaE%I&}O~1Z%t5NXq>9f)BkePTE0#PPmCJwHoM?0wC|7< zmoskDWu|0J9HNYLkCeW^JuCNj9#eFjC}F#V!{hNtt1I*Ij0*L%wfg=R+9Y9Zcf3Mg9_mcr~L?Fk5-KlZlU|hVrsk zuFoWHg`Mm^F~m>D@vXLC!0zqRuPae9ens?#;poN~J3jPEqFg-e+)pj#=dJHen2sK3 zBdw>A<)f;(@uS!-1gJ=_>N2xvBk$}2VU)uAj_rQ>WqY0dq#i4OHbX$6yR2`ZM@REG zHN93j8u)>s7P*o1t<=ubWc|*kh#acTa?22UMCdbTG$>QI#hXw`5gp;_=P}|qYNudf zWl)r7&89V#6{B6GpNW=hdkXT)mU4h>f7$}QGD4ziy2Kat4N4Ul8{I^uB8&4h?)#8F zJ_erpPjasm*-`D!5WvAVDfQW3vbV8Y&%~S1CD(Df+}3J$m;GI@cNbTlt#wOn4d{*>W&hEEemBU8;D~-YuEVra@)kZFkY1R^cj4MG8V1g4qf z@aX=g06q#J9V2}q{bzPX@dxM?UImVyJCDuLM9eTz1UBI}3N_{as*%mQm);-EWm0ov zz%F+&9j2;g?A9Ivdexlqm;e#V<+XVlR@c7p3rArHrB_2v&3ugN$5Pk7_%^eM9}-mz ze9ZXF9nLg1$DV5C`^f?Fek5~!m;p;s+e}pbP?jj><_OI>x@$*NsZtS=h~b3o`2FEiaw6 zsn{De=71Ln)UWsPWyfm!8W|a_;E_%Z)ZXLlr5!zuF#y*n< z6tgMt+B|YrFHZc~R{lfXSOFemNJ%(2sIq-yP4g?#U1O2|6gA>h>oT@^sx^*yLmk$I z@wp}8BoNcIB2X#r4aoZ7FkUnv3c2yz!RbQ?=G(KwU(UwLeuafUDkp7`OWcA&Ld2B| z(@|0MQysnD%e?Ct(c)x)lku0YB^F!nB@m)hv&wI3+L&-mwhlf&tr+(ZDj9A zg{YhcBDmv@j(GX9RaFB_v@7Me=M>pvvhiUF zYFD7Kwx_uMv5v}qM8Q*B-02a>>1z|Jkd4oDYWh1+!9UqK$>|%=X(k`*GfpIoJ#SDRA%VDAIukoIxy%9cq7=CA5M zM6__8KMEoa#Ip~^e?bbl3f>mfyzd2J-pSaX14JT_^ay~dGQHOF1Ck9x5_@}|hf58T z*|(U}yF%R~>|zu=v^juN)W`SE?WSIo&JU2{V0b~-6GcRIUul#n`hzHXLCGl`56ZfX zOC$UoEs>0Jo+cc9Apf&Q-UGC{dZ=Qd@lW-{G+ycz42rCAF64 z79A=>-V+bw3gd9)HneRXT~15f@tyP(#z$o0rp<&rIvK2Cl7pHMEuGGfg(7-dn{OSBm|( z!Uw?W8-c^6o*OXtyNRdAHBK}1&v(fN+KMW@=z&fooa#h}8SfM0KYs>w9b{#N;9cPC z@`+@hNBM^zPJZDrF}z(3(rDAZm_igUsB_qv84k9wt?tx8FU5yJ zo$q8yx7WOJ9IbZ#y}T9% zlV~j(2ufl`gl=47on^$5bhR7@Wj`ML7{PcIb=t(^PC+Y21~6#EO2eiZYUUoF214WV z_VPAV_3fP$Ib?=6*S1VWbk_uD^-I>KNDZW6JI0Vsl4PHNVqMr8h$#5eF@|y8N{Rp? zdHPn%J4P{17mDk=^ay%HuRzxb<|)2P4{6r_z;3JE47CoOTnR8t)&wNi>pKIZ z`)uh}Fp1OL>;SV_1gp6bC z2Xyu#R=+~0clJIb!f%e7s?J|oB?XN6DP6MlNxCFH!w(q zW1qK#<8+$GPy#)?OKHU>=M7i=kG6(C0XZZ?TAO%;aL2dnuM}=c+C;HKH|B@wLxIPQ zp&OXAYlco>;W{)P|0v)-J@&($Rt3nqdkphJ>F)!tfiBK8e{g#1!(YMd({QsVK$dF8 zk=AtdJy*ZmDJt$&lz`}m$hp{cGZ=K^13JIa0_NKZLe8C6_N8F~hb^4Da6bbHT=SUu z$xC~zujl}34cIBB1DBLOo#LQd{bOG5$uR&XBJ&(wIzSo|0}YjMV>vo`^12ppua-Exc;j2%Rg0cFo`9L`jAP{Cy9SFR=$PvQ3!l6JQQ`r)PBw>vSZpfrMvmq9^`E#b+$ z8Q@(+!=GsnjbDQOS33f$vos4NLFZK+GXDdId`c(USYkL`|qZt`R!8j@})Wb zPV!BZxFKWFRNc;u?L(`kn45hJ@2PLRpp&YH9&_|ixLoh-{Vp~OBZr^&ftWu`U?Z-* zQs{i5wP1TKiaj{nU->VLwl-XX+K90mG{`K?5^jKaJ(lp*uAQaY_|3-LKW-}PiQmd8NbvOf2w5BnW|_}_hdPRIfaQE_&!zM{6_v!iYr_<+M_NV8P=!gRx8p(gwuLbfmNNAinq7y0qKvXS{FbC-Q9%+dkh ze8WX=GQtl~k9G&M!LfS$y{5&zXNy)zScu zCKL%9FTBZ%HH#0PhULF7jq>(;tAX5QyrJ;24|gK)W}a=3dMnbs?96aJcJ8%V1GY!{ z`uekf-!G_N#~|lSxDe7=Z{9yZA*Dg>s?PmB;$mPnjC{9;73s>@|FftCI45~>Sap3; zqQd~%XmT^N2b^e1@UnUNg`da{knZp^)QMW`683oJ@HTO3^Yot4iWtnSO??Ne7 z_wTlZgS|QTq+y^kJ;+I#0umovcrfR!9r24YCV#q z+SVhF#rr_gm>zB(`F*O&L>qNo`+9c6HS0&m6ysbm1qAW5h0c zPF~cUwxH+c=}m5m0gQ(8Sxlo`G9>U(3V+pfos&I(sD|s~ z6zG(d?j)AlPhQJ9$Lx|0ir(g=x0BRd|5G)_s9yX_k*~Tw6~3$PY7)^uJo_I_DAELcrng<1E)FzC=Q_X z_4CBNGhy*LmWVHM$SW_ubGo4g(65Gfbpt5)A({hrynB7c>T!M9L4@cU#U%B^PFeMV zjfabObGfGxc&e3B5jg6n$E0Ici9t9}z_lf+(IZzQf$DvAOPR-8DwOs^fUK8qv%iw%F^Mjy0x9G5(r+`GtRge)tWZjVbs zSL4F>%6+)6)w*%dtP}~#{$`cn7Af5)0=oUGzg+HGc5nsj@65G+ImNQf%_5y`Fh}&E z1<{lqu;4NkPt<1wP?q0$nZq1KwrNk2j^+=(9d;_4`CFl<+)JLfsRP8N^zm{z;k~ zau$H_y(`vcrxo5h9+%4{MjyS|$qXQeXdNz&@&dA;?%aeFL|8xz^e3Y0%{>+9Mj))l zh0_4ZRs2uNf&NHBK_WH-NP@GAI13z8WJ{NmIPBBECKX_`M!vN6P%lmg7jGgDB_-WQ z9wpE_Q6n^-dE+T7QTxqmz6T~o#lxn)sJzs)_0Z9!Q!WTQT8QteGW zMDHL(0k;6rlV197;_WT85fFn}Ql2cW?7TW{M$KzAc%FUtaEY}KG>BAS`#m_5Rm$U{ zlZ=-9G)*4)Xqa!rPFOINe8MeDJr*30@0K5r{S06;HE6>}+`>{$ext%Y)cfCcE@6+b zWOHt*X=YcA#TNnEIc3h2;*4gF_j=cI^4OdPVl26H|2Xc7L0ZkfmH1(fu$|XJCx>K3 zfd?J=yf+&4&eC+<}qI;{{8WU1cCPROa4B)+1!a)VXlMjA9ys@`J69vmY@%> zFT<;@_Qzyl^C09kHryY{!`jKC84ZmF7{Vu+f6`M+4777iy zU#Im4Ub6H}HcFdSEVM?B71f_xd$xj^GH>SQ<@p>>uB=^GETV*_hk|?? zE^em`=^VFkj-mp0R?>bi%Hmlu&_^x_tc{G-zyv{PGoJ4j??%%J8na>NajbygNfd(i z1^g0XnH~V(r4+6~KcJVOSvc$VyC|=4#D@ENBnIyd$9q z*I2z;w>cnvZ43OIQK{rwJvS-B53fv5`f@4J%`;kKwE7uN^5yC=adS1lFQf##I=7kn z9jx$14|Xy8a&`efEjdwCi%Wy|eRcxT6xS1O+x4h2bD37BkQX?s_(53oFbC}DrW@B+ zP0{ARtg=AK(oJNu#EK(MxLxisI55($a5Sk^QDVgq3Q)!!+2p2Ojc35P+#k?w%3d@7 zyg(dAMH8CYx8^J4el6II^b0E}HCg>2_LBK1Hg) zIhZ5_K7CszFUY8^%zkshY0lC3+!U~Sp3HZTKqBqN*zEZKg3Ih~K!t0hfrkHcD!+s5R`Tq6`SIbjYDXF_Jx_e<7S zyVE)Cdatpw@f@jo+fxGSy-utZ4O+cr$zPel8fq3%vY!xFceuWb^qYN@FfW|kE9l@v z9JFi(G$!(&PENGvsWnm}?o)-2y_TG-_1QjZgg5nTXD)aL+;H0vz1kbT94mUT&4UeK zM%>9u3xWVA8uAWf@wtIqYrDs$fjg+!BGaqpX6B54O4Nf60u-%!DR#{j@f7FA{@8!- z(|;~oJZBlPDE{_ust`VR?_VnO-)kHH74;TMf7q&Y76uepUKNIE8yF<c;8y!!Kkye@-7;9B8RU&kIAq0vGkM6M1`L0+y_X5>HyXaeIgT40=< zGoMqMFhnV^N#GlhO^%=78nB`w%~P$5>N3w*hAZ58Y<|Dr@Hy3?A-An_@Qat~)Zs>A zsepQAR9Ai!%advpbZ~h@11}@tQX*qGM?*Yupc$Pl-zi2&=l;Q>o#+D(ss|+1@5vA{ zWZ(a=I&&eEMpcpP!ta2#MeJ93o)F{9S$n9T-0e$4$BL^;2btIIIoIR zPXC6#tW&%2p13To^o_qx;xt5jP9T-=aO-xUk8XXzt?xDksNfSBjHM~b;REhGE(%7t zJJ=WbbF0QvtXKspeGV zGOr}{666~)qX5BMT?i`|3MR>^fADG z+#V&q_R7ug7$lqOb0k@8QnNQ9R7?)p>k&c*v2E5v@8j9uuf+ooQ;W^(F2*>_tCis2 zB{?kt6=<=>^R9N9s|&Fn(4ZYZ{JTGv>cI8Fm^m2CiRMI@!LT-cn`n-P^R8A8S!`^Y z3{LyC@6K{d3sG`k+Q;x@{E8eWqs!*}(xd_on!RQGS7kvB&_VPCX2J!rkbb@0${&N>`y-enpTVE+avYRDfXX%Cj+0!%0 zmL1hC>x0vcLq7cJ-Dt!f5o?khpp*Nq_eA;+!QaTt&yGN{Y`10D?gK$Vr&fBADdKL6 zEt&m)6K(N;*umsPZBo|-wwV|P?3cdUxLs*^Dbov*KnB1r9#v)zpwgx;T|S>&X_nUq z9iM^%m$m(`nS=b7P_e}gcKslHm!a1DAeM?@qBPh$ARExh*%AsJwzsT_Lq=YqIXIYb ztD7d*n3XkUgW;-~g46ZPIp3A(PE}BykDjaF0=82%qn-@RjO#<85MBc8+$QwKcu2Om zrVG26{$DrB|4n^`Hx^A}f7j!RTsD1w{f)fLwA_wuoAW&l{##J;)(cN%TOYnX9OUzm zCcvb>Ia;{_4^akCQ7n0gZ@+dC11{nz_)SSdg7eQ_7yhF$#1jBURU|DeLLv!IjK8^D z4mvpo?+;qy^!q-SrVG73#{lt+K|W-vHoke6j5Gd{6YfG(W`LvkT>&vbfu`Rm9tK3P zK9mc61x_XTdmQP3IP5U$5u&RXB@lrCT$(ZC6>wos+HRB+T^i`W1bCXam6E>&ek>47 zF;$gd;Xi;{61%V{;eA)rM>p)bF5IE=6jJjW^BmymYM-rRoTpS$AJXQvUrrtMM46@+ zIEZ0I{(ORF)0<@bsAf;2;u`$)1D<%frW37_v1P%!U@55bE*Q)HJYB1Kg!8=yEVjvC z7~uFJ&AI8G;VZ&UVMjzf8R$J%zuS;b!!$9sN}MHBI8Lj1j57q#m9&$Y5X^m{DiBN~ r3f7E{_LmIoVj?UI5-j9&oPy~5QZ!uR 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.'backup_user_roles'; - delete_option($backup_option_name); - delete_option('ure_caps_readable'); - delete_option('ure_show_deprecated_caps'); - delete_option('ure_hide_pro_banner'); - delete_option('user_role_editor'); - delete_option('ure_role_additional_options_values'); - delete_option('ure_task_queue'); - -} - - -if (!is_multisite()) { - ure_delete_options(); -} else { - $old_blog = $wpdb->blogid; - // Get all blog ids - $blogIds = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs"); - foreach ($blogIds as $blog_id) { - switch_to_blog($blog_id); - ure_delete_options(); - } - switch_to_blog($old_blog); -} diff --git a/wp/wp-content/plugins/user-role-editor/user-role-editor.php b/wp/wp-content/plugins/user-role-editor/user-role-editor.php deleted file mode 100644 index 470edda2..00000000 --- a/wp/wp-content/plugins/user-role-editor/user-role-editor.php +++ /dev/null @@ -1,50 +0,0 @@ - ' . 'Please update!' . ''; -Ure_Lib::check_version( PHP_VERSION, $ure_required_php_version, $exit_msg, __FILE__ ); - -// check WP version -$ure_required_wp_version = '4.0'; -$exit_msg = sprintf( 'User Role Editor requires WordPress %s or newer.', $ure_required_wp_version ) . - ' ' . 'Please update!' . ''; -Ure_Lib::check_version(get_bloginfo('version'), $ure_required_wp_version, $exit_msg, __FILE__ ); - -require_once(URE_PLUGIN_DIR .'includes/loader.php'); - -$GLOBALS['user_role_editor'] = User_Role_Editor::get_instance(); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/ajax.php b/wp/wp-content/plugins/wordpress-seo/admin/ajax.php deleted file mode 100644 index f24bf237..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/ajax.php +++ /dev/null @@ -1,454 +0,0 @@ -' . $file . '' - ); - } - } - - if ( is_dir( $file ) ) { - if ( ! @ rmdir( $file ) ) { - $errors[] = sprintf( - /* translators: %s expands to the directory path and name. */ - __( 'The directory %s could not be removed. Please remove it via FTP.', 'wordpress-seo' ), - '' . $file . '' - ); - } - } - } - } - - if ( $errors ) { - $message = implode( '
    ', $errors ); - wp_send_json_error( array( 'message' => $message ) ); - } - else { - $message = __( 'Files successfully removed.', 'wordpress-seo' ); - wp_send_json_success( array( 'message' => $message ) ); - } -} - -add_action( 'wp_ajax_wpseo_kill_blocking_files', 'wpseo_kill_blocking_files' ); - -/** - * Used in the editor to replace vars for the snippet preview - */ -function wpseo_ajax_replace_vars() { - global $post; - check_ajax_referer( 'wpseo-replace-vars' ); - - $post = get_post( intval( filter_input( INPUT_POST, 'post_id' ) ) ); - global $wp_query; - $wp_query->queried_object = $post; - $wp_query->queried_object_id = $post->ID; - $omit = array( 'excerpt', 'excerpt_only', 'title' ); - echo wpseo_replace_vars( stripslashes( filter_input( INPUT_POST, 'string' ) ), $post, $omit ); - die; -} - -add_action( 'wp_ajax_wpseo_replace_vars', 'wpseo_ajax_replace_vars' ); - -/** - * Save an individual SEO title from the Bulk Editor. - */ -function wpseo_save_title() { - wpseo_save_what( 'title' ); -} - -add_action( 'wp_ajax_wpseo_save_title', 'wpseo_save_title' ); - -/** - * Save an individual meta description from the Bulk Editor. - */ -function wpseo_save_description() { - wpseo_save_what( 'metadesc' ); -} - -add_action( 'wp_ajax_wpseo_save_metadesc', 'wpseo_save_description' ); - -/** - * Save titles & descriptions - * - * @param string $what Type of item to save (title, description). - */ -function wpseo_save_what( $what ) { - check_ajax_referer( 'wpseo-bulk-editor' ); - - $new = filter_input( INPUT_POST, 'new_value' ); - $post_id = intval( filter_input( INPUT_POST, 'wpseo_post_id' ) ); - $original = filter_input( INPUT_POST, 'existing_value' ); - - $results = wpseo_upsert_new( $what, $post_id, $new, $original ); - - wpseo_ajax_json_echo_die( $results ); -} - -/** - * Helper function to update a post's meta data, returning relevant information - * about the information updated and the results or the meta update. - * - * @param int $post_id Post ID. - * @param string $new_meta_value New meta value to record. - * @param string $orig_meta_value Original meta value. - * @param string $meta_key Meta key string. - * @param string $return_key Return key string to use in results. - * - * @return string - */ -function wpseo_upsert_meta( $post_id, $new_meta_value, $orig_meta_value, $meta_key, $return_key ) { - - $post_id = intval( $post_id ); - $sanitized_new_meta_value = wp_strip_all_tags( $new_meta_value ); - $orig_meta_value = wp_strip_all_tags( $orig_meta_value ); - - $upsert_results = array( - 'status' => 'success', - 'post_id' => $post_id, - "new_{$return_key}" => $sanitized_new_meta_value, - "original_{$return_key}" => $orig_meta_value, - ); - - $the_post = get_post( $post_id ); - if ( empty( $the_post ) ) { - - $upsert_results['status'] = 'failure'; - $upsert_results['results'] = __( 'Post doesn\'t exist.', 'wordpress-seo' ); - - return $upsert_results; - } - - $post_type_object = get_post_type_object( $the_post->post_type ); - if ( ! $post_type_object ) { - - $upsert_results['status'] = 'failure'; - $upsert_results['results'] = sprintf( __( 'Post has an invalid Post Type: %s.', 'wordpress-seo' ), $the_post->post_type ); - - return $upsert_results; - } - - if ( ! current_user_can( $post_type_object->cap->edit_posts ) ) { - - $upsert_results['status'] = 'failure'; - $upsert_results['results'] = sprintf( __( 'You can\'t edit %s.', 'wordpress-seo' ), $post_type_object->label ); - - return $upsert_results; - } - - if ( ! current_user_can( $post_type_object->cap->edit_others_posts ) && $the_post->post_author != get_current_user_id() ) { - - $upsert_results['status'] = 'failure'; - $upsert_results['results'] = sprintf( __( 'You can\'t edit %s that aren\'t yours.', 'wordpress-seo' ), $post_type_object->label ); - - return $upsert_results; - - } - - if ( $sanitized_new_meta_value === $orig_meta_value && $sanitized_new_meta_value !== $new_meta_value ) { - $upsert_results['status'] = 'failure'; - $upsert_results['results'] = __( 'You have used HTML in your value which is not allowed.', 'wordpress-seo' ); - - return $upsert_results; - } - - $res = update_post_meta( $post_id, $meta_key, $sanitized_new_meta_value ); - - $upsert_results['status'] = ( $res !== false ) ? 'success' : 'failure'; - $upsert_results['results'] = $res; - - return $upsert_results; -} - -/** - * Save all titles sent from the Bulk Editor. - */ -function wpseo_save_all_titles() { - wpseo_save_all( 'title' ); -} - -add_action( 'wp_ajax_wpseo_save_all_titles', 'wpseo_save_all_titles' ); - -/** - * Save all description sent from the Bulk Editor. - */ -function wpseo_save_all_descriptions() { - wpseo_save_all( 'metadesc' ); -} - -add_action( 'wp_ajax_wpseo_save_all_descriptions', 'wpseo_save_all_descriptions' ); - -/** - * Utility function to save values - * - * @param string $what Type of item so save. - */ -function wpseo_save_all( $what ) { - check_ajax_referer( 'wpseo-bulk-editor' ); - - // @todo the WPSEO Utils class can't filter arrays in POST yet. - $new_values = $_POST['items']; - $original_values = $_POST['existing_items']; - - $results = array(); - - if ( is_array( $new_values ) && $new_values !== array() ) { - foreach ( $new_values as $post_id => $new_value ) { - $original_value = $original_values[ $post_id ]; - $results[] = wpseo_upsert_new( $what, $post_id, $new_value, $original_value ); - } - } - wpseo_ajax_json_echo_die( $results ); -} - -/** - * Insert a new value - * - * @param string $what Item type (such as title). - * @param int $post_id Post ID. - * @param string $new New value to record. - * @param string $original Original value. - * - * @return string - */ -function wpseo_upsert_new( $what, $post_id, $new, $original ) { - $meta_key = WPSEO_Meta::$meta_prefix . $what; - - return wpseo_upsert_meta( $post_id, $new, $original, $meta_key, $what ); -} - -/** - * Handles the posting of a new FB admin. - */ -function wpseo_add_fb_admin() { - check_ajax_referer( 'wpseo_fb_admin_nonce' ); - - if ( ! current_user_can( 'manage_options' ) ) { - die( '-1' ); - } - - $facebook_social = new Yoast_Social_Facebook(); - - wp_die( $facebook_social->add_admin( filter_input( INPUT_POST, 'admin_name' ), filter_input( INPUT_POST, 'admin_id' ) ) ); -} - -add_action( 'wp_ajax_wpseo_add_fb_admin', 'wpseo_add_fb_admin' ); - -/** - * Retrieves the keyword for the keyword doubles. - */ -function ajax_get_keyword_usage() { - $post_id = filter_input( INPUT_POST, 'post_id' ); - $keyword = filter_input( INPUT_POST, 'keyword' ); - - if ( ! current_user_can( 'edit_post', $post_id ) ) { - die( '-1' ); - } - - wp_die( - wp_json_encode( WPSEO_Meta::keyword_usage( $keyword, $post_id ) ) - ); -} - -add_action( 'wp_ajax_get_focus_keyword_usage', 'ajax_get_keyword_usage' ); - -/** - * Retrieves the keyword for the keyword doubles of the termpages. - */ -function ajax_get_term_keyword_usage() { - $post_id = filter_input( INPUT_POST, 'post_id' ); - $keyword = filter_input( INPUT_POST, 'keyword' ); - $taxonomy_name = filter_input( INPUT_POST, 'taxonomy' ); - - $taxonomy = get_taxonomy( $taxonomy_name ); - - if ( ! $taxonomy ) { - wp_die( 0 ); - } - - if ( ! current_user_can( $taxonomy->cap->edit_terms ) ) { - wp_die( -1 ); - } - - $usage = WPSEO_Taxonomy_Meta::get_keyword_usage( $keyword, $post_id, $taxonomy_name ); - - // Normalize the result so it it the same as the post keyword usage AJAX request. - $usage = $usage[ $keyword ]; - - wp_die( - wp_json_encode( $usage ) - ); -} - -add_action( 'wp_ajax_get_term_keyword_usage', 'ajax_get_term_keyword_usage' ); - -/** - * Removes stopword from the sample permalink that is generated in an AJAX request - * - * @param array $permalink The permalink generated for this post by WordPress. - * @param int $post_id The ID of the post. - * @param string $title The title for the post that the user used. - * @param string $name The name for the post that the user used. - * - * @return array - */ -function wpseo_remove_stopwords_sample_permalink( $permalink, $post_id, $title, $name ) { - WPSEO_Options::get_instance(); - $options = WPSEO_Options::get_options( array( 'wpseo_permalinks' ) ); - if ( $options['cleanslugs'] !== true ) { - return $permalink; - } - - /* - * If the name is empty and the title is not, WordPress will generate a slug. In that case we want to remove stop - * words from the slug. - */ - if ( empty( $name ) && ! empty( $title ) ) { - $stop_words = new WPSEO_Admin_Stop_Words(); - - // The second element is the slug. - $permalink[1] = $stop_words->remove_in( $permalink[1] ); - } - - return $permalink; -} - -add_action( 'get_sample_permalink', 'wpseo_remove_stopwords_sample_permalink', 10, 4 ); - -// Crawl Issue Manager AJAX hooks. -new WPSEO_GSC_Ajax; - -// SEO Score Recalculations. -new WPSEO_Recalculate_Scores_Ajax; - -new Yoast_Dashboard_Widget(); - -new Yoast_OnPage_Ajax(); - -new WPSEO_Shortcode_Filter(); - -new WPSEO_Taxonomy_Columns(); - - -// Setting the notice for the recalculate the posts. -new Yoast_Dismissable_Notice_Ajax( 'recalculate', Yoast_Dismissable_Notice_Ajax::FOR_SITE ); - -/********************** DEPRECATED METHODS **********************/ - -/** - * Create an export and return the URL - * - * @deprecated 3.3.2 - * @codeCoverageIgnore - */ -function wpseo_get_export() { - _deprecated_function( __FUNCTION__, 'WPSEO 3.3.2', 'This method is deprecated.' ); - - wpseo_ajax_json_echo_die( '' ); -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-recalculate-scores-ajax.php b/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-recalculate-scores-ajax.php deleted file mode 100644 index 66f31b4a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-recalculate-scores-ajax.php +++ /dev/null @@ -1,119 +0,0 @@ - $this->calculate_posts(), - 'terms' => $this->calculate_terms(), - ) - ) - ); - } - - /** - * Start recalculation - */ - public function recalculate_scores() { - check_ajax_referer( 'wpseo_recalculate', 'nonce' ); - - $fetch_object = $this->get_fetch_object(); - if ( ! empty( $fetch_object ) ) { - $paged = filter_input( INPUT_POST, 'paged', FILTER_VALIDATE_INT ); - $response = $fetch_object->get_items_to_recalculate( $paged ); - - if ( ! empty( $response ) ) { - wp_die( wp_json_encode( $response ) ); - } - } - - wp_die( '' ); - } - - /** - * Saves the new linkdex score for given post - */ - public function save_score() { - check_ajax_referer( 'wpseo_recalculate', 'nonce' ); - - $fetch_object = $this->get_fetch_object(); - if ( ! empty( $fetch_object ) ) { - $scores = filter_input( INPUT_POST, 'scores', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY ); - $fetch_object->save_scores( $scores ); - } - - wp_die(); - } - - /** - * Returns the needed object for recalculating scores. - * - * @return WPSEO_Recalculate_Posts|WPSEO_Recalculate_Terms - */ - private function get_fetch_object() { - switch ( filter_input( INPUT_POST, 'type' ) ) { - case 'post': - return new WPSEO_Recalculate_Posts(); - case 'term': - return new WPSEO_Recalculate_Terms(); - } - - return null; - } - - /** - * Gets the total number of posts - * - * @return int - */ - private function calculate_posts() { - $count_posts_query = new WP_Query( - array( - 'post_type' => 'any', - 'meta_key' => '_yoast_wpseo_focuskw', - 'posts_per_page' => 1, - 'fields' => 'ids', - ) - ); - - return $count_posts_query->found_posts; - } - - /** - * Get the total number of terms - * - * @return int - */ - private function calculate_terms() { - $total = 0; - foreach ( get_taxonomies( array(), 'objects' ) as $taxonomy ) { - $total += wp_count_terms( $taxonomy->name, array( 'hide_empty' => false ) ); - } - - return $total; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-shortcode-filter.php b/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-shortcode-filter.php deleted file mode 100644 index 834001fa..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-shortcode-filter.php +++ /dev/null @@ -1,39 +0,0 @@ - $shortcode, - 'output' => do_shortcode( $shortcode ), - ); - } - - wp_die( wp_json_encode( $parsed_shortcodes ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-dismissable-notice.php b/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-dismissable-notice.php deleted file mode 100644 index 48fd916c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-dismissable-notice.php +++ /dev/null @@ -1,69 +0,0 @@ -notice_name = $notice_name; - $this->notice_type = $notice_type; - - add_action( 'wp_ajax_wpseo_dismiss_' . $notice_name, array( $this, 'dismiss_notice' ) ); - } - - /** - * Handles the dismiss notice request - */ - public function dismiss_notice() { - check_ajax_referer( 'wpseo-dismiss-' . $this->notice_name ); - - $this->save_dismissed(); - - wp_die( 'true' ); - } - - /** - * Storing the dismissed value in the database. The target location is based on the set notification type. - */ - private function save_dismissed() { - if ( $this->notice_type === self::FOR_SITE ) { - update_option( 'wpseo_dismiss_' . $this->notice_name, 1 ); - - return; - } - - if ( $this->notice_type === self::FOR_NETWORK ) { - update_site_option( 'wpseo_dismiss_' . $this->notice_name, 1 ); - - return; - } - - update_user_meta( get_current_user_id(), 'wpseo_dismiss_' . $this->notice_name, 1 ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-onpage-ajax.php b/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-onpage-ajax.php deleted file mode 100644 index 35f791f7..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-onpage-ajax.php +++ /dev/null @@ -1,38 +0,0 @@ -save_dismissed(); - - wp_die( 'true' ); - } - - /** - * Storing the dismissed value as an user option in the database - */ - private function save_dismissed() { - update_user_meta( get_current_user_id(), WPSEO_OnPage::USER_META_KEY, 1 ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-plugin-conflict-ajax.php b/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-plugin-conflict-ajax.php deleted file mode 100644 index 398beb23..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/ajax/class-yoast-plugin-conflict-ajax.php +++ /dev/null @@ -1,105 +0,0 @@ -dismissed_conflicts = $this->get_dismissed_conflicts( $conflict_data['section'] ); - - $this->compare_plugins( $conflict_data['plugins'] ); - - $this->save_dismissed_conflicts( $conflict_data['section'] ); - - wp_die( 'true' ); - } - - /** - * Getting the user option from the database - * - * @return bool|array - */ - private function get_dismissed_option() { - return get_user_meta( get_current_user_id(), $this->option_name, true ); - } - - /** - * Getting the dismissed conflicts from the database - * - * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap). - * - * @return array - */ - private function get_dismissed_conflicts( $plugin_section ) { - $dismissed_conflicts = $this->get_dismissed_option(); - - if ( is_array( $dismissed_conflicts ) && array_key_exists( $plugin_section, $dismissed_conflicts ) ) { - return $dismissed_conflicts[ $plugin_section ]; - } - - return array(); - } - - /** - * Storing the conflicting plugins as an user option in the database - * - * @param string $plugin_section Plugin conflict type (such as Open Graph or sitemap). - */ - private function save_dismissed_conflicts( $plugin_section ) { - $dismissed_conflicts = $this->get_dismissed_option(); - - $dismissed_conflicts[ $plugin_section ] = $this->dismissed_conflicts; - - update_user_meta( get_current_user_id(), $this->option_name, $dismissed_conflicts ); - } - - /** - * Loop through the plugins to compare them with the already stored dismissed plugin conflicts - * - * @param array $posted_plugins Plugin set to check. - */ - public function compare_plugins( array $posted_plugins ) { - foreach ( $posted_plugins as $posted_plugin ) { - $this->compare_plugin( $posted_plugin ); - } - } - - /** - * Check if plugin is already dismissed, if not store it in the array that will be saved later - * - * @param string $posted_plugin Plugin to check against dismissed conflicts. - */ - private function compare_plugin( $posted_plugin ) { - if ( ! in_array( $posted_plugin, $this->dismissed_conflicts ) ) { - $this->dismissed_conflicts[] = $posted_plugin; - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-renderer.php b/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-renderer.php deleted file mode 100644 index 347b8f15..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-renderer.php +++ /dev/null @@ -1,48 +0,0 @@ -get_url() ) . '">'; - $output .= '' . esc_attr( $banner->get_alt() ) . ''; - $output .= ''; - - return $output; - } - - /** - * Sets the base path, where the images are located. - * - * @param string $base_path The image location. - */ - public function set_base_path( $base_path ) { - $this->base_path = $base_path; - } - - /** - * Returns the full path for the image. - * - * @param string $image The image path. - * - * @return string - */ - protected function get_image_path( $image ) { - return rtrim( $this->base_path, '/' ) . '/' . ltrim( $image, '/' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-sidebar-renderer.php b/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-sidebar-renderer.php deleted file mode 100644 index 93fef4ae..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-sidebar-renderer.php +++ /dev/null @@ -1,60 +0,0 @@ -spot_renderer = $spot_renderer; - } - - /** - * Renders the admin banner sidebar. - * - * @param WPSEO_Admin_Banner_Sidebar $banner_sidebar The sidebar to render. - * - * @return string - */ - public function render( WPSEO_Admin_Banner_Sidebar $banner_sidebar ) { - return sprintf( ' - ', - $banner_sidebar->get_title(), - $this->render_banner_spots( $banner_sidebar->get_banner_spots() ) - ); - } - - /** - * Renders the admin banner spots. - * - * @param WPSEO_Admin_Banner_Spot[] $banner_spots The banner spots to render. - * - * @return string - */ - protected function render_banner_spots( array $banner_spots ) { - $return = ''; - foreach ( $banner_spots as $banner_spot ) { - $return .= $this->spot_renderer->render( $banner_spot ); - } - - return $return; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-sidebar.php b/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-sidebar.php deleted file mode 100644 index 4741bcb9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-sidebar.php +++ /dev/null @@ -1,389 +0,0 @@ -title = $title; - $this->banner_renderer = $banner_renderer; - } - - /** - * Returns the set title. - * - * @return string - */ - public function get_title() { - return $this->title; - } - - /** - * Initializes the banner sidebar by setting its banner spots. - * - * @param WPSEO_Features $features Class regarding WPSEO Features. - */ - public function initialize( WPSEO_Features $features ) { - if ( $features->is_free() ) { - $this->add_banner_spot( $this->get_premium_spot() ); - } - - $this->add_banner_spot( $this->get_services_spot() ); - - $extensions_spot = $this->get_extensions_spot( $this->get_active_extensions() ); - if ( $extensions_spot->has_banners() ) { - $this->add_banner_spot( $extensions_spot ); - } - - $this->add_banner_spot( $this->get_courses_spot() ); - $this->add_banner_spot( $this->get_remove_banner_spot() ); - } - - /** - * Returns array with bannerspots. - * - * @return WPSEO_Admin_Banner_Spot[] - */ - public function get_banner_spots() { - return $this->banner_spots; - } - - /** - * Adds a banner spot. - * - * @param WPSEO_Admin_Banner_Spot $spot The spot to add. - */ - protected function add_banner_spot( WPSEO_Admin_Banner_Spot $spot ) { - $this->banner_spots[] = $spot; - } - - /** - * Returns the premium banner spot. - * - * @return WPSEO_Admin_Banner_Spot - */ - protected function get_premium_spot() { - $premium_spot = new WPSEO_Admin_Banner_Spot( '', $this->banner_renderer ); - - $premium_uri = WPSEO_Shortlinker::get( 'https://yoa.st/jj' ); - - $premium_spot->set_extra( - /* translators: %1$s expands to the plugin name */ - '

    ' . sprintf( __( 'Get %1$s', 'wordpress-seo' ), 'Yoast SEO Premium' ) . '

    ' . - '
      ' . - '
    • ' . __( 'Multiple keywords', 'wordpress-seo' ) . '
      ' . __( 'Increase your SEO reach', 'wordpress-seo' ) . '
    • ' . - '
    • ' . __( 'No more dead links', 'wordpress-seo' ) . '
      ' . __( 'Easy redirect manager', 'wordpress-seo' ) . '
    • ' . - '
    • ' . __( 'Internal linking suggestions', 'wordpress-seo' ) . '
      ' . __( 'Find related posts superfast', 'wordpress-seo' ) . '
    • ' . - '
    • ' . __( 'Social media preview', 'wordpress-seo' ) . '
      ' . esc_html__( 'Facebook & Twitter', 'wordpress-seo' ) . '
    • ' . - '
    • ' . __( '24/7 support', 'wordpress-seo' ) . '
    • ' . - '
    • ' . __( 'No ads!', 'wordpress-seo' ) . '
    • ' . - '
    ' . - /* translators: %s expands to Yoast SEO Premium */ - '' . sprintf( __( 'Get %s now!', 'wordpress-seo' ), 'Yoast SEO Premium' ) . '
    ' . - '' . __( 'Prices start as low as 69,- for one site', 'wordpress-seo' ) . '

    ' - ); - - /* - $premium_spot->set_description( - sprintf( - /* translators: %1$s expands to a link start tag to the Yoast plugin page, %2$s is the link closing tag * / - __( 'Want to get the most out of your SEO-strategy? %1$sGo premium!%2$s.', 'wordpress-seo' ), - '', - '' - ) - ); - /* - - $premium_spot->add_banner( - new WPSEO_Admin_Banner( - WPSEO_Shortlinker::get( 'https://yoa.st/jj' ), - 'premium-seo.png', - 261, - 152, - sprintf( - /* translators: %1$s expands to Yoast SEO Premium. * / - __( 'Buy the %1$s plugin now and get access to extra features and 24/7 support!', 'wordpress-seo' ), - 'Yoast SEO Premium' - ) - ) - ); - */ - - return $premium_spot; - } - - /** - * Returns the services banner spot. - * - * @return WPSEO_Admin_Banner_Spot - */ - protected function get_services_spot() { - $service_spot = new WPSEO_Admin_Banner_Spot( __( 'Services', 'wordpress-seo' ), $this->banner_renderer ); - - $service_spot->set_description( - sprintf( - /* translators: %1$s expands to a link start tag to the Yoast Services page, %2$s to Yoast, %3$s is the link closing tag. */ - __( 'Do you want to know how to improve your rankings? %1$sLet team %2$s help you!%3$s', 'wordpress-seo' ), - '', - 'Yoast', - '' - ) - ); - - $service_spot->add_banner( - new WPSEO_Admin_Banner( - WPSEO_Shortlinker::get( 'https://yoa.st/jm' ), - 'configuration-service.png', - 261, - 152, - sprintf( - /* translators: %1$s expands to Yoast SEO Premium. */ - __( 'Let our experts set up your %1$s plugin!', 'wordpress-seo' ), - 'Yoast SEO Premium' - ) - ) - ); - - /* - $service_spot->add_banner( - new WPSEO_Admin_Banner( - WPSEO_Shortlinker::get( 'https://yoa.st/seo-care-banner' ), - 'seo-care.png', - 261, - 152, - sprintf( - /* translators: %1$s expands to Yoast SEO Care. * / - __( 'Let us help you take care of the SEO of your website. Order %1$s now!', 'wordpress-seo' ), - 'Yoast SEO Care' - ) - ) - ); - */ - - return $service_spot; - } - - /** - * Returns an array with the Yoast SEO extensions with the value true when they are active. - * - * @return array - */ - protected function get_active_extensions() { - return array( - 'video' => class_exists( 'wpseo_Video_Sitemap' ), - 'woocommerce' => class_exists( 'Woocommerce' ) && class_exists( 'Yoast_WooCommerce_SEO' ), - 'news' => class_exists( 'WPSEO_News' ), - 'local' => defined( 'WPSEO_LOCAL_VERSION' ), - ); - } - - /** - * Returns the extensions banner spot. - * - * @param array $active_extensions The active extensions. - * - * @return WPSEO_Admin_Banner_Spot - */ - protected function get_extensions_spot( array $active_extensions ) { - $extension_spot = new WPSEO_Admin_Banner_Spot( __( 'Extensions', 'wordpress-seo' ), $this->banner_renderer ); - - $extension_spot->set_description( - sprintf( - /* translators: %1$s expands to a link start tag to the Yoast plugin page, %2$s is the link closing tag. */ - __( 'Take your SEO to the next level and outrank your competition with our %1$sSEO plugins%2$s.', 'wordpress-seo' ), - '', - '' - ) - ); - - if ( empty( $active_extensions['video'] ) ) { - $extension_spot->add_banner( - new WPSEO_Admin_Banner( - WPSEO_Shortlinker::get( 'https://yoa.st/jo' ), - 'video-seo.png', - 261, - 152, - sprintf( - /* translators: %1$s expands to Yoast Video SEO. */ - __( 'Buy the %1$s plugin now and optimize your videos for video search results and social media!', 'wordpress-seo' ), - 'Yoast Video SEO' - ) - ) - ); - } - - if ( empty( $active_extensions['woocommerce'] ) ) { - $extension_spot->add_banner( - new WPSEO_Admin_Banner( - WPSEO_Shortlinker::get( 'https://yoa.st/jp' ), - 'woocommerce-seo.png', - 261, - 152, - sprintf( - /* translators: %1$s expands to Yoast WooCommerce SEO. */ - __( 'Buy the %1$s plugin now and optimize your shop today to improve your product promotion!', 'wordpress-seo' ), - 'Yoast WooCommerce SEO' - ) - ) - ); - } - - if ( empty( $active_extensions['local'] ) ) { - $extension_spot->add_banner( - new WPSEO_Admin_Banner( - WPSEO_Shortlinker::get( 'https://yoa.st/jq' ), - 'local-seo.png', 261, - 152, - sprintf( - /* translators: %1$s expands to Yoast Local SEO. */ - __( 'Buy the %1$s plugin now to improve your site’s Local SEO and ranking in Google Maps!', 'wordpress-seo' ), - 'Yoast Local SEO' - ) - ) - ); - } - - if ( empty( $active_extensions['news'] ) ) { - $extension_spot->add_banner( - new WPSEO_Admin_Banner( - WPSEO_Shortlinker::get( 'https://yoa.st/jr' ), - 'news-seo.png', - 261, - 152, - sprintf( - /* translators: %1$s expands to Yoast News SEO. */ - __( 'Buy the %1$s plugin now and start optimizing to get your site featured in Google News!', 'wordpress-seo' ), - 'Yoast News SEO' - ) - ) - ); - } - - return $extension_spot; - } - - /** - * Returns the courses banner spot. - * - * @return WPSEO_Admin_Banner_Spot - */ - protected function get_courses_spot() { - $courses_spot = new WPSEO_Admin_Banner_Spot( __( 'Courses', 'wordpress-seo' ), $this->banner_renderer ); - - $courses_spot->set_description( - sprintf( - /* translators: %1$s expands to a link start tag to the Yoast Services page, %2$s is the link closing tag. */ - __( 'Do you want to get a grip on your own SEO-strategy? Learn all about it in one of %1$sour courses%2$s.', 'wordpress-seo' ), - '', - '' - ) - ); - - $courses_spot->add_banner( - new WPSEO_Admin_Banner( - WPSEO_Shortlinker::get( 'https://yoa.st/ju' ), - 'basic-seo-training.png', - 261, - 152, - __( 'Take the online Basic SEO Training course and learn the fundamentals of SEO!', 'wordpress-seo' ) - ) - ); - - $courses_spot->add_banner( - new WPSEO_Admin_Banner( - WPSEO_Shortlinker::get( 'https://yoa.st/jv' ), - 'yoast-seo-for-wordpress-training.png', - 261, - 152, - sprintf( - /* translators: %1$s expands to Yoast SEO for WordPress Training, %2$s to Yoast SEO for WordPress. */ - __( 'Take the %1$s course and become a certified %2$s expert!', 'wordpress-seo' ), - 'Yoast SEO for WordPress Training', - 'Yoast SEO for WordPress' - ) - ) - ); - - $courses_spot->add_banner( - new WPSEO_Admin_Banner( - WPSEO_Shortlinker::get( 'https://yoa.st/jw' ), - 'seo-copywriting-training.png', - 261, - 152, - __( 'Take the online SEO Copywriting Training course and learn how to write awesome copy that ranks!', 'wordpress-seo' ) - ) - ); - - $courses_spot->add_banner( - new WPSEO_Admin_Banner( - WPSEO_Shortlinker::get( 'https://yoa.st/jx' ), - 'keyword-research-training.png', - 261, - 152, - __( 'Take the online Keyword Research Training course and learn how to rank with your keywords!', 'wordpress-seo' ) - ) - ); - - $courses_spot->add_banner( - new WPSEO_Admin_Banner( - WPSEO_Shortlinker::get( 'https://yoa.st/qy' ), - 'site-structure-training.png', - 261, - 152, - __( 'Take the online Site Structure Training course and learn how to structure your website!', 'wordpress-seo' ) - ) - ); - - $courses_spot->add_banner( - new WPSEO_Admin_Banner( - WPSEO_Shortlinker::get( 'https://yoa.st/jaa' ), - 'technical-seo-training.png', - 261, - 152, - __( 'Take the online Technical SEO Training course and learn essential technical SEO-concepts!', 'wordpress-seo' ) - ) - ); - - return $courses_spot; - } - - /** - * Returns the remove banner spot. - * - * @return WPSEO_Admin_Banner_Spot - */ - protected function get_remove_banner_spot() { - - $remove_banner_spot = new WPSEO_Admin_Banner_Spot( - __( 'Remove these ads?', 'wordpress-seo' ) - ); - - $remove_banner_spot->set_description( - '' . - /* translators: %1$s expands to Yoast SEO Premium */ - sprintf( __( 'Upgrade to %1$s »', 'wordpress-seo' ), 'Yoast SEO Premium' ) . - '' - ); - - return $remove_banner_spot; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-spot-renderer.php b/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-spot-renderer.php deleted file mode 100644 index dd807aa1..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-spot-renderer.php +++ /dev/null @@ -1,37 +0,0 @@ -'; - if ( $banner_spot->get_title() !== '' ) { - $output .= '' . $banner_spot->get_title() . ''; - } - - if ( $banner_spot->get_extra() !== '' ) { - $output .= $banner_spot->get_extra(); - } - - if ( $banner_spot->get_description() !== '' ) { - $output .= '

    ' . $banner_spot->get_description() . '

    '; - } - - $output .= $banner_spot->render_banner(); - $output .= ''; - - return $output; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-spot.php b/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-spot.php deleted file mode 100644 index 22d4c83d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner-spot.php +++ /dev/null @@ -1,118 +0,0 @@ -title = $title; - $this->banner_renderer = ( is_null( $banner_renderer ) ? new WPSEO_Admin_Banner_Renderer() : $banner_renderer ); - } - - /** - * Returns the title. - * - * @return string - */ - public function get_title() { - return $this->title; - } - - /** - * Returns the description. - * - * @return string - */ - public function get_description() { - return $this->description; - } - - /** - * Returns the extra content. - * - * @return string - */ - public function get_extra() { - return $this->extra; - } - - /** - * Sets the description - * - * @param string $description The description. - */ - public function set_description( $description ) { - $this->description = $description; - } - - /** - * Sets the "extra" - * - * @param string $extra The "extra". - */ - public function set_extra( $extra ) { - $this->extra = $extra; - } - - /** - * Adds an admin banner. - * - * @param WPSEO_Admin_Banner $banner The banner to add. - */ - public function add_banner( WPSEO_Admin_Banner $banner ) { - $this->banners[] = $banner; - } - - /** - * Renders the banner. - * - * @return string - */ - public function render_banner() { - if ( ! $this->has_banners() ) { - return ''; - } - - return $this->banner_renderer->render( $this->get_random_banner() ); - } - - /** - * Checks if there are any banners set. - * - * @return bool - */ - public function has_banners() { - return ! empty( $this->banners ); - } - - /** - * Returns a random banner. - * - * @return null|WPSEO_Admin_Banner - */ - protected function get_random_banner() { - return $this->banners[ array_rand( $this->banners, 1 ) ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner.php b/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner.php deleted file mode 100644 index d179c426..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/banner/class-admin-banner.php +++ /dev/null @@ -1,87 +0,0 @@ -url = $url; - $this->image = $image; - $this->alt = $alt; - $this->width = $width; - $this->height = $height; - } - - /** - * Returns the set url. - * - * @return string - */ - public function get_url() { - return $this->url; - } - - /** - * Returns the image. - * - * @return string - */ - public function get_image() { - return $this->image; - } - - /** - * Returns the alt-text. - * - * @return string - */ - public function get_alt() { - return $this->alt; - } - - /** - * Returns the width. - * - * @return string - */ - public function get_width() { - return $this->width; - } - - /** - * Returns the height. - * - * @return string - */ - public function get_height() { - return $this->height; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-manager.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-manager.php deleted file mode 100644 index 14e45500..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-asset-manager.php +++ /dev/null @@ -1,372 +0,0 @@ -get_name(), - $script->get_url( WPSEO_Admin_Asset::TYPE_JS, WPSEO_FILE ), - $script->get_deps(), - $script->get_version(), - $script->is_in_footer() - ); - } - - /** - * Registers styles based on it's parameters. - * - * @param WPSEO_Admin_Asset $style The style to register. - */ - public function register_style( WPSEO_Admin_Asset $style ) { - wp_register_style( - self::PREFIX . $style->get_name(), - $style->get_url( WPSEO_Admin_Asset::TYPE_CSS, WPSEO_FILE ), - $style->get_deps(), - $style->get_version(), - $style->get_media() - ); - } - - /** - * Calls the functions that register scripts and styles with the scripts and styles to be registered as arguments. - */ - public function register_assets() { - $this->register_scripts( $this->scripts_to_be_registered() ); - $this->register_styles( $this->styles_to_be_registered() ); - } - - /** - * Registers all the scripts passed to it. - * - * @param array $scripts The scripts passed to it. - */ - public function register_scripts( $scripts ) { - foreach ( $scripts as $script ) { - $script = new WPSEO_Admin_Asset( $script ); - $this->register_script( $script ); - } - } - - /** - * Registers all the styles it recieves. - * - * @param array $styles Styles that need to be registerd. - */ - public function register_styles( $styles ) { - foreach ( $styles as $style ) { - $style = new WPSEO_Admin_Asset( $style ); - $this->register_style( $style ); - } - } - - /** - * A list of styles that shouldn't be registered but are needed in other locations in the plugin. - * - * @return array - */ - public function special_styles() { - $flat_version = $this->flatten_version( WPSEO_VERSION ); - - return array( - 'inside-editor' => new WPSEO_Admin_Asset( array( - 'name' => 'inside-editor', - 'src' => 'inside-editor-' . $flat_version, - ) ), - ); - } - - /** - * Flattens a version number for use in a filename - * - * @param string $version The original version number. - * @return string The flattened version number. - */ - public function flatten_version( $version ) { - $parts = explode( '.', $version ); - - if ( count( $parts ) === 2 ) { - $parts[] = '0'; - } - - return implode( '', $parts ); - } - - /** - * Returns the scripts that need to be registered. - * - * @TODO data format is not self-documenting. Needs explanation inline. R. - * - * @return array scripts that need to be registered. - */ - private function scripts_to_be_registered() { - - $select2_language = 'en'; - $user_locale = WPSEO_Utils::get_user_locale(); - $language = WPSEO_Utils::get_language( $user_locale ); - - if ( file_exists( WPSEO_PATH . "js/dist/select2/i18n/{$user_locale}.js" ) ) { - $select2_language = $user_locale; // Chinese and some others use full locale. - } - elseif ( file_exists( WPSEO_PATH . "js/dist/select2/i18n/{$language}.js" ) ) { - $select2_language = $language; - } - - $flat_version = $this->flatten_version( WPSEO_VERSION ); - - return array( - array( - 'name' => 'admin-script', - 'src' => 'wp-seo-admin-' . $flat_version, - 'deps' => array( - 'jquery', - 'jquery-ui-core', - 'jquery-ui-progressbar', - self::PREFIX . 'select2', - self::PREFIX . 'select2-translations', - ), - ), - array( - 'name' => 'admin-media', - 'src' => 'wp-seo-admin-media-' . $flat_version, - 'deps' => array( - 'jquery', - 'jquery-ui-core', - ), - ), - array( - 'name' => 'bulk-editor', - 'src' => 'wp-seo-bulk-editor-' . $flat_version, - 'deps' => array( 'jquery' ), - ), - array( - 'name' => 'dismissible', - 'src' => 'wp-seo-dismissible-' . $flat_version, - 'deps' => array( 'jquery' ), - ), - array( - 'name' => 'admin-global-script', - 'src' => 'wp-seo-admin-global-' . $flat_version, - 'deps' => array( 'jquery' ), - ), - array( - 'name' => 'metabox', - 'src' => 'wp-seo-metabox-' . $flat_version, - 'deps' => array( - 'jquery', - 'jquery-ui-core', - 'jquery-ui-autocomplete', - self::PREFIX . 'select2', - self::PREFIX . 'select2-translations', - ), - 'in_footer' => false, - ), - array( - 'name' => 'featured-image', - 'src' => 'wp-seo-featured-image-' . $flat_version, - 'deps' => array( - 'jquery' - ), - ), - array( - 'name' => 'admin-gsc', - 'src' => 'wp-seo-admin-gsc-' . $flat_version, - 'deps' => array(), - 'in_footer' => false, - ), - array( - 'name' => 'post-scraper', - 'src' => 'wp-seo-post-scraper-' . $flat_version, - 'deps' => array( - self::PREFIX . 'replacevar-plugin', - self::PREFIX . 'shortcode-plugin', - 'wp-util', - ), - ), - array( - 'name' => 'term-scraper', - 'src' => 'wp-seo-term-scraper-' . $flat_version, - 'deps' => array( - self::PREFIX . 'replacevar-plugin', - ), - ), - array( - 'name' => 'replacevar-plugin', - 'src' => 'wp-seo-replacevar-plugin-' . $flat_version, - ), - array( - 'name' => 'shortcode-plugin', - 'src' => 'wp-seo-shortcode-plugin-' . $flat_version, - ), - array( - 'name' => 'recalculate', - 'src' => 'wp-seo-recalculate-' . $flat_version, - 'deps' => array( - 'jquery', - 'jquery-ui-core', - 'jquery-ui-progressbar', - ), - ), - array( - 'name' => 'primary-category', - 'src' => 'wp-seo-metabox-category-' . $flat_version, - 'deps' => array( - 'jquery', - 'wp-util', - ), - ), - array( - 'name' => 'select2', - 'src' => 'select2/select2.full', - 'suffix' => '.min', - 'deps' => array( - 'jquery', - ), - 'version' => '4.0.3', - ), - array( - 'name' => 'select2-translations', - 'src' => 'select2/i18n/' . $select2_language, - 'deps' => array( - 'jquery', - self::PREFIX . 'select2', - ), - 'version' => '4.0.3', - 'suffix' => '', - ), - array( - 'name' => 'configuration-wizard', - 'src' => 'configuration-wizard-' . $flat_version, - 'deps' => array( - 'jquery', - ), - ), - ); - } - - /** - * Returns the styles that need to be registered. - * - * @TODO data format is not self-documenting. Needs explanation inline. R. - * - * @return array styles that need to be registered. - */ - private function styles_to_be_registered() { - $flat_version = $this->flatten_version( WPSEO_VERSION ); - - return array( - array( - 'name' => 'admin-css', - 'src' => 'yst_plugin_tools-' . $flat_version, - 'deps' => array( self::PREFIX . 'toggle-switch' ), - ), - array( - 'name' => 'toggle-switch', - 'src' => 'toggle-switch-' . $flat_version, - ), - array( - 'name' => 'dismissible', - 'src' => 'wpseo-dismissible-' . $flat_version, - ), - array( - 'name' => 'alerts', - 'src' => 'alerts-' . $flat_version, - ), - array( - 'name' => 'edit-page', - 'src' => 'edit-page-' . $flat_version, - ), - array( - 'name' => 'featured-image', - 'src' => 'featured-image-' . $flat_version, - ), - array( - 'name' => 'metabox-css', - 'src' => 'metabox-' . $flat_version, - 'deps' => array( - self::PREFIX . 'select2', - ), - ), - array( - 'name' => 'wp-dashboard', - 'src' => 'dashboard-' . $flat_version, - ), - array( - 'name' => 'scoring', - 'src' => 'yst_seo_score-' . $flat_version, - ), - array( - 'name' => 'snippet', - 'src' => 'snippet-' . $flat_version, - ), - array( - 'name' => 'adminbar', - 'src' => 'adminbar-' . $flat_version, - ), - array( - 'name' => 'primary-category', - 'src' => 'metabox-primary-category-' . $flat_version, - ), - array( - 'name' => 'select2', - 'src' => 'dist/select2/select2', - 'suffix' => '.min', - 'version' => '4.0.1', - 'rtl' => false, - ), - array( - 'name' => 'kb-search', - 'src' => 'kb-search-' . $flat_version, - ), - array( - 'name' => 'help-center', - 'src' => 'help-center-' . $flat_version, - ), - array( - 'name' => 'admin-global', - 'src' => 'admin-global-' . $flat_version, - ), - array( - 'name' => 'yoast-components', - 'src' => 'yoast-components-' . $flat_version, - ), - array( - 'name' => 'extensions', - 'src' => 'yoast-extensions-' . $flat_version, - ), - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-help-panel.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin-help-panel.php deleted file mode 100644 index 74550e47..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-help-panel.php +++ /dev/null @@ -1,91 +0,0 @@ -id = $id; - $this->help_button_text = $help_button_text; - $this->help_content = $help_content; - $this->wrapper = $wrapper; - } - - /** - * Returns the html for the Help Button. - * - * @return string - */ - public function get_button_html() { - - if ( ! $this->id || ! $this->help_button_text || ! $this->help_content ) { - return ''; - } - - return sprintf( - ' ', - esc_attr( $this->id ), - $this->help_button_text - ); - } - - /** - * Returns the html for the Help Panel. - * - * @return string - */ - public function get_panel_html() { - - if ( ! $this->id || ! $this->help_button_text || ! $this->help_content ) { - return ''; - } - - $wrapper_start = $wrapper_end = ''; - - if ( 'has-wrapper' === $this->wrapper ) { - $wrapper_start = '
    '; - $wrapper_end = '
    '; - } - - return sprintf( - '%1$s

    %3$s

    %4$s', - $wrapper_start, - esc_attr( $this->id ), - $this->help_content, - $wrapper_end - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-init.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin-init.php deleted file mode 100644 index 82e0f8a9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-init.php +++ /dev/null @@ -1,550 +0,0 @@ -options = WPSEO_Options::get_option( 'wpseo_xml' ); - - $GLOBALS['wpseo_admin'] = new WPSEO_Admin; - - $this->pagenow = $GLOBALS['pagenow']; - - $this->asset_manager = new WPSEO_Admin_Asset_Manager(); - - add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_dismissible' ) ); - add_action( 'admin_init', array( $this, 'tagline_notice' ), 15 ); - add_action( 'admin_init', array( $this, 'blog_public_notice' ), 15 ); - add_action( 'admin_init', array( $this, 'permalink_notice' ), 15 ); - add_action( 'admin_init', array( $this, 'page_comments_notice' ), 15 ); - add_action( 'admin_init', array( $this, 'ga_compatibility_notice' ), 15 ); - add_action( 'admin_init', array( $this, 'yoast_plugin_compatibility_notification' ), 15 ); - add_action( 'admin_init', array( $this, 'recalculate_notice' ), 15 ); - add_action( 'admin_init', array( $this->asset_manager, 'register_assets' ) ); - add_action( 'admin_init', array( $this, 'show_hook_deprecation_warnings' ) ); - add_action( 'admin_init', array( 'WPSEO_Plugin_Conflict', 'hook_check_for_plugin_conflicts' ) ); - - $this->load_meta_boxes(); - $this->load_taxonomy_class(); - $this->load_admin_page_class(); - $this->load_admin_user_class(); - $this->load_xml_sitemaps_admin(); - } - - /** - * Enqueue our styling for dismissible yoast notifications. - */ - public function enqueue_dismissible() { - $this->asset_manager->enqueue_style( 'dismissible' ); - } - - /** - * Helper to verify if the current user has already seen the about page for the current version - * - * @return bool - */ - private function seen_about() { - $seen_about_version = substr( get_user_meta( get_current_user_id(), 'wpseo_seen_about_version', true ), 0, 3 ); - $last_minor_version = substr( WPSEO_VERSION, 0, 3 ); - - return version_compare( $seen_about_version, $last_minor_version, '>=' ); - } - - /** - * Notify about the default tagline if the user hasn't changed it - */ - public function tagline_notice() { - - $current_url = ( is_ssl() ? 'https://' : 'http://' ); - $current_url .= sanitize_text_field( $_SERVER['SERVER_NAME'] ) . sanitize_text_field( $_SERVER['REQUEST_URI'] ); - $customize_url = add_query_arg( array( - 'url' => urlencode( $current_url ), - ), wp_customize_url() ); - - $info_message = sprintf( - /* translators: 1: link open tag; 2: link close tag. */ - __( 'You still have the default WordPress tagline, even an empty one is probably better. %1$sYou can fix this in the customizer%2$s.', 'wordpress-seo' ), - '', - '' - ); - - $notification_options = array( - 'type' => Yoast_Notification::ERROR, - 'id' => 'wpseo-dismiss-tagline-notice', - 'capabilities' => 'manage_options', - ); - - $tagline_notification = new Yoast_Notification( $info_message, $notification_options ); - - $notification_center = Yoast_Notification_Center::get(); - if ( $this->has_default_tagline() ) { - $notification_center->add_notification( $tagline_notification ); - } - else { - $notification_center->remove_notification( $tagline_notification ); - } - } - - /** - * Add an alert if the blog is not publicly visible - */ - public function blog_public_notice() { - - $info_message = '' . __( 'Huge SEO Issue: You\'re blocking access to robots.', 'wordpress-seo' ) . ' '; - $info_message .= sprintf( - /* translators: %1$s resolves to the opening tag of the link to the reading settings, %1$s resolves to the closing tag for the link */ - __( 'You must %1$sgo to your Reading Settings%2$s and uncheck the box for Search Engine Visibility.', 'wordpress-seo' ), - '', - '' - ); - - $notification_options = array( - 'type' => Yoast_Notification::ERROR, - 'id' => 'wpseo-dismiss-blog-public-notice', - 'priority' => 1.0, - 'capabilities' => 'manage_options', - ); - - $notification = new Yoast_Notification( $info_message, $notification_options ); - - $notification_center = Yoast_Notification_Center::get(); - if ( ! $this->is_blog_public() ) { - $notification_center->add_notification( $notification ); - } - else { - $notification_center->remove_notification( $notification ); - } - } - - /** - * Display notice to disable comment pagination - */ - public function page_comments_notice() { - - $info_message = __( 'Paging comments is enabled, this is not needed in 999 out of 1000 cases, we recommend to disable it.', 'wordpress-seo' ); - $info_message .= '
    '; - - $info_message .= sprintf( - /* translators: %1$s resolves to the opening tag of the link to the comment setting page, %2$s resolves to the closing tag of the link */ - __( 'Simply uncheck the box before "Break comments into pages..." on the %1$sComment settings page%2$s.', 'wordpress-seo' ), - '', - '' - ); - - $notification_options = array( - 'type' => Yoast_Notification::WARNING, - 'id' => 'wpseo-dismiss-page_comments-notice', - 'capabilities' => 'manage_options', - ); - - $tagline_notification = new Yoast_Notification( $info_message, $notification_options ); - - $notification_center = Yoast_Notification_Center::get(); - if ( $this->has_page_comments() ) { - $notification_center->add_notification( $tagline_notification ); - } - else { - $notification_center->remove_notification( $tagline_notification ); - } - } - - /** - * Returns whether or not the site has the default tagline - * - * @return bool - */ - public function has_default_tagline() { - $blog_description = get_bloginfo( 'description' ); - $default_blog_description = 'Just another WordPress site'; - $translated_blog_description = __( 'Just another WordPress site' ); - return $translated_blog_description === $blog_description || $default_blog_description === $blog_description; - } - - /** - * Show alert when the permalink doesn't contain %postname% - */ - public function permalink_notice() { - - $info_message = __( 'You do not have your postname in the URL of your posts and pages, it is highly recommended that you do. Consider setting your permalink structure to /%postname%/.', 'wordpress-seo' ); - $info_message .= '
    '; - $info_message .= sprintf( - /* translators: %1$s resolves to the starting tag of the link to the permalink settings page, %2$s resolves to the closing tag of the link */ - __( 'You can fix this on the %1$sPermalink settings page%2$s.', 'wordpress-seo' ), - '', - '' - ); - - $notification_options = array( - 'type' => Yoast_Notification::WARNING, - 'id' => 'wpseo-dismiss-permalink-notice', - 'capabilities' => 'manage_options', - 'priority' => 0.8, - ); - - $notification = new Yoast_Notification( $info_message, $notification_options ); - - $notification_center = Yoast_Notification_Center::get(); - if ( ! $this->has_postname_in_permalink() ) { - $notification_center->add_notification( $notification ); - } - else { - $notification_center->remove_notification( $notification ); - } - } - - /** - * Are page comments enabled - * - * @return bool - */ - public function has_page_comments() { - return '1' === get_option( 'page_comments' ); - } - - /** - * Shows a notice to the user if they have Google Analytics for WordPress 5.4.3 installed because it causes an error - * on the google search console page. - */ - public function ga_compatibility_notice() { - - $notification = $this->get_compatibility_notification(); - $notification_center = Yoast_Notification_Center::get(); - - if ( defined( 'GAWP_VERSION' ) && '5.4.3' === GAWP_VERSION ) { - $notification_center->add_notification( $notification ); - } - else { - $notification_center->remove_notification( $notification ); - } - } - - /** - * Build compatibility problem notification - * - * @return Yoast_Notification - */ - private function get_compatibility_notification() { - $info_message = sprintf( - /* translators: %1$s expands to Yoast SEO, %2$s expands to 5.4.3, %3$s expands to Google Analytics by Yoast */ - __( '%1$s detected you are using version %2$s of %3$s, please update to the latest version to prevent compatibility issues.', 'wordpress-seo' ), - 'Yoast SEO', - '5.4.3', - 'Google Analytics by Yoast' - ); - - return new Yoast_Notification( - $info_message, - array( - 'id' => 'gawp-compatibility-notice', - 'type' => Yoast_Notification::ERROR, - ) - ); - } - - /** - * Add an alert if outdated versions of Yoast SEO plugins are running. - */ - public function yoast_plugin_compatibility_notification() { - $compatibility_checker = new WPSEO_Plugin_Compatibility( WPSEO_VERSION ); - $plugins = $compatibility_checker->get_installed_plugins_compatibility(); - - $notification_center = Yoast_Notification_Center::get(); - - foreach ( $plugins as $name => $plugin ) { - $type = ( $plugin['active'] ) ? Yoast_Notification::ERROR : Yoast_Notification::WARNING; - $notification = $this->get_yoast_seo_compatibility_notification( $name, $plugin, $type ); - - if ( $plugin['compatible'] === false ) { - $notification_center->add_notification( $notification ); - } - else { - $notification_center->remove_notification( $notification ); - } - } - } - - /** - * Build Yoast SEO compatibility problem notification - * - * @param string $name The plugin name to use for the unique ID. - * @param array $plugin The plugin to retrieve the data from. - * @param string $level The severity level to use for the notification. - * - * @return Yoast_Notification - */ - private function get_yoast_seo_compatibility_notification( $name, $plugin, $level = Yoast_Notification::WARNING ) { - $info_message = sprintf( - /* translators: %1$s expands to Yoast SEO, %2$s expands to the plugin version, %3$s expands to the plugin name */ - __( '%1$s detected you are using version %2$s of %3$s, please update to the latest version to prevent compatibility issues.', 'wordpress-seo' ), - 'Yoast SEO', - $plugin['version'], - $plugin['title'] - ); - - return new Yoast_Notification( - $info_message, - array( - 'id' => 'wpseo-outdated-yoast-seo-plugin-' . $name, - 'type' => $level, - ) - ); - } - - /** - * Shows the notice for recalculating the post. the Notice will only be shown if the user hasn't dismissed it before. - */ - public function recalculate_notice() { - // Just a return, because we want to temporary disable this notice (#3998 and #4532). - return; - - if ( filter_input( INPUT_GET, 'recalculate' ) === '1' ) { - update_option( 'wpseo_dismiss_recalculate', '1' ); - return; - } - - $can_access = is_multisite() ? WPSEO_Utils::grant_access() : current_user_can( 'manage_options' ); - if ( $can_access && ! $this->is_site_notice_dismissed( 'wpseo_dismiss_recalculate' ) ) { - Yoast_Notification_Center::get()->add_notification( - new Yoast_Notification( - sprintf( - /* translators: 1: is a link to 'admin_url / admin.php?page=wpseo_tools&recalculate=1' 2: closing link tag */ - __( 'We\'ve updated our SEO score algorithm. %1$sRecalculate the SEO scores%2$s for all posts and pages.', 'wordpress-seo' ), - '', - '' - ), - array( - 'type' => 'updated yoast-dismissible', - 'id' => 'wpseo-dismiss-recalculate', - 'nonce' => wp_create_nonce( 'wpseo-dismiss-recalculate' ), - ) - ) - ); - } - } - - /** - * Check if the user has dismissed the given notice (by $notice_name) - * - * @param string $notice_name The name of the notice that might be dismissed. - * - * @return bool - */ - private function is_site_notice_dismissed( $notice_name ) { - return '1' === get_option( $notice_name, true ); - } - - /** - * Helper to verify if the user is currently visiting one of our admin pages. - * - * @return bool - */ - private function on_wpseo_admin_page() { - return 'admin.php' === $this->pagenow && strpos( filter_input( INPUT_GET, 'page' ), 'wpseo' ) === 0; - } - - /** - * Determine whether we should load the meta box class and if so, load it. - */ - private function load_meta_boxes() { - - $is_editor = WPSEO_Metabox::is_post_overview( $this->pagenow ) || WPSEO_Metabox::is_post_edit( $this->pagenow ); - $is_inline_save = filter_input( INPUT_POST, 'action' ) === 'inline-save'; - - /** - * Filter: 'wpseo_always_register_metaboxes_on_admin' - Allow developers to change whether - * the WPSEO metaboxes are only registered on the typical pages (lean loading) or always - * registered when in admin. - * - * @api bool Whether to always register the metaboxes or not. Defaults to false. - */ - if ( $is_editor || $is_inline_save || apply_filters( 'wpseo_always_register_metaboxes_on_admin', false ) - ) { - $GLOBALS['wpseo_metabox'] = new WPSEO_Metabox; - $GLOBALS['wpseo_meta_columns'] = new WPSEO_Meta_Columns(); - } - } - - /** - * Determine if we should load our taxonomy edit class and if so, load it. - */ - private function load_taxonomy_class() { - if ( - WPSEO_Taxonomy::is_term_edit( $this->pagenow ) - || WPSEO_Taxonomy::is_term_overview( $this->pagenow ) - ) { - new WPSEO_Taxonomy; - } - } - - /** - * Determine if we should load our admin pages class and if so, load it. - * - * Loads admin page class for all admin pages starting with `wpseo_`. - */ - private function load_admin_user_class() { - if ( in_array( $this->pagenow, array( 'user-edit.php', 'profile.php' ) ) && current_user_can( 'edit_users' ) ) { - new WPSEO_Admin_User_Profile; - } - } - - /** - * Determine if we should load our admin pages class and if so, load it. - * - * Loads admin page class for all admin pages starting with `wpseo_`. - */ - private function load_admin_page_class() { - - if ( $this->on_wpseo_admin_page() ) { - // For backwards compatabilty, this still needs a global, for now... - $GLOBALS['wpseo_admin_pages'] = new WPSEO_Admin_Pages; - - // Only register the yoast i18n when the page is a Yoast SEO page. - if ( WPSEO_Utils::is_yoast_seo_free_page( filter_input( INPUT_GET, 'page' ) ) ) { - $this->register_i18n_promo_class(); - } - } - } - - /** - * Register the promotion class for our GlotPress instance - * - * @link https://github.com/Yoast/i18n-module - */ - private function register_i18n_promo_class() { - // BC, because an older version of the i18n-module didn't have this class. - new Yoast_I18n_WordPressOrg_v2( - array( - 'textdomain' => 'wordpress-seo', - 'plugin_name' => 'Yoast SEO', - 'hook' => 'wpseo_admin_promo_footer', - ) - ); - } - - /** - * See if we should start our XML Sitemaps Admin class - */ - private function load_xml_sitemaps_admin() { - if ( $this->options['enablexmlsitemap'] === true ) { - new WPSEO_Sitemaps_Admin; - } - } - - /** - * Check if the site is set to be publicly visible - * - * @return bool - */ - private function is_blog_public() { - return '1' == get_option( 'blog_public' ); - } - - /** - * Shows deprecation warnings to the user if a plugin has registered a filter we have deprecated. - */ - public function show_hook_deprecation_warnings() { - global $wp_filter; - - if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { - return false; - } - - // WordPress hooks that have been deprecated in Yoast SEO 3.0. - $deprecated_30 = array( - 'wpseo_pre_analysis_post_content', - 'wpseo_metadesc_length', - 'wpseo_metadesc_length_reason', - 'wpseo_body_length_score', - 'wpseo_linkdex_results', - 'wpseo_snippet', - ); - - $deprecated_notices = array_intersect( - $deprecated_30, - array_keys( $wp_filter ) - ); - - foreach ( $deprecated_notices as $deprecated_filter ) { - _deprecated_function( - /* translators: %s expands to the actual filter/action that has been used. */ - sprintf( __( '%s filter/action', 'wordpress-seo' ), $deprecated_filter ), - 'WPSEO 3.0', - 'javascript' - ); - } - } - - /** - * Check if there is a dismiss notice action. - * - * @param string $notice_name The name of the notice to dismiss. - * - * @return bool - */ - private function dismiss_notice( $notice_name ) { - return filter_input( INPUT_GET, $notice_name ) === '1' && wp_verify_nonce( filter_input( INPUT_GET, 'nonce' ), $notice_name ); - } - - /** - * Check if the permalink uses %postname% - * - * @return bool - */ - private function has_postname_in_permalink() { - return ( false !== strpos( get_option( 'permalink_structure' ), '%postname%' ) ); - } - - /********************** DEPRECATED METHODS **********************/ - - /** - * Returns whether or not the user has seen the tagline notice - * - * @deprecated 3.3 - * @codeCoverageIgnore - * - * @return bool - */ - public function seen_tagline_notice() { - _deprecated_function( __METHOD__, 'WPSEO 3.3.0' ); - return false; - } - - /** - * Redirect first time or just upgraded users to the about screen. - * - * @deprecated 3.5 - * @codeCoverageIgnore - */ - public function after_update_notice() { - _deprecated_function( __METHOD__, 'WPSEO 3.5' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-user-profile.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin-user-profile.php deleted file mode 100644 index 8de2d37d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin-user-profile.php +++ /dev/null @@ -1,90 +0,0 @@ -filter_input_post( 'wpseo_nonce' ); - - if ( empty( $nonce_value ) ) { // Submit from alternate forms. - return; - } - - check_admin_referer( 'wpseo_user_profile_update', 'wpseo_nonce' ); - - update_user_meta( $user_id, 'wpseo_title', $this->filter_input_post( 'wpseo_author_title' ) ); - update_user_meta( $user_id, 'wpseo_metadesc', $this->filter_input_post( 'wpseo_author_metadesc' ) ); - update_user_meta( $user_id, 'wpseo_metakey', $this->filter_input_post( 'wpseo_author_metakey' ) ); - update_user_meta( $user_id, 'wpseo_excludeauthorsitemap', $this->filter_input_post( 'wpseo_author_exclude' ) ); - update_user_meta( $user_id, 'wpseo_content_analysis_disable', $this->filter_input_post( 'wpseo_content_analysis_disable' ) ); - update_user_meta( $user_id, 'wpseo_keyword_analysis_disable', $this->filter_input_post( 'wpseo_keyword_analysis_disable' ) ); - } - - /** - * Add the inputs needed for SEO values to the User Profile page - * - * @param WP_User $user User instance to output for. - */ - public function user_profile( $user ) { - $options = WPSEO_Options::get_option( 'wpseo' ); - $options_titles = WPSEO_Options::get_option( 'wpseo_titles' ); - - wp_nonce_field( 'wpseo_user_profile_update', 'wpseo_nonce' ); - - require_once( 'views/user-profile.php' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-admin.php b/wp/wp-content/plugins/wordpress-seo/admin/class-admin.php deleted file mode 100644 index 8f505e1d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-admin.php +++ /dev/null @@ -1,888 +0,0 @@ -options = WPSEO_Options::get_options( array( 'wpseo', 'wpseo_permalinks' ) ); - - if ( is_multisite() ) { - WPSEO_Options::maybe_set_multisite_defaults( false ); - } - - if ( $this->options['stripcategorybase'] === true ) { - add_action( 'created_category', array( $this, 'schedule_rewrite_flush' ) ); - add_action( 'edited_category', array( $this, 'schedule_rewrite_flush' ) ); - add_action( 'delete_category', array( $this, 'schedule_rewrite_flush' ) ); - } - - $this->admin_features = array( - // Google Search Console. - 'google_search_console' => new WPSEO_GSC(), - 'dashboard_widget' => new Yoast_Dashboard_Widget(), - ); - - if ( WPSEO_Metabox::is_post_overview( $pagenow ) || WPSEO_Metabox::is_post_edit( $pagenow ) ) { - $this->admin_features['primary_category'] = new WPSEO_Primary_Term_Admin(); - } - - if ( filter_input( INPUT_GET, 'page' ) === 'wpseo_tools' && filter_input( INPUT_GET, 'tool' ) === null ) { - new WPSEO_Recalculate_Scores(); - } - - // Needs the lower than default priority so other plugins can hook underneath it without issue. - add_action( 'admin_menu', array( $this, 'register_settings_page' ), 5 ); - add_action( 'network_admin_menu', array( $this, 'register_network_settings_page' ) ); - - add_filter( 'plugin_action_links_' . WPSEO_BASENAME, array( $this, 'add_action_link' ), 10, 2 ); - - add_action( 'admin_enqueue_scripts', array( $this, 'config_page_scripts' ) ); - add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_global_style' ) ); - - if ( $this->options['cleanslugs'] === true ) { - add_filter( 'name_save_pre', array( $this, 'remove_stopwords_from_slug' ), 0 ); - } - - add_filter( 'user_contactmethods', array( $this, 'update_contactmethods' ), 10, 1 ); - - add_action( 'after_switch_theme', array( $this, 'switch_theme' ) ); - add_action( 'switch_theme', array( $this, 'switch_theme' ) ); - - add_filter( 'set-screen-option', array( $this, 'save_bulk_edit_options' ), 10, 3 ); - - add_action( 'admin_init', array( 'WPSEO_Plugin_Conflict', 'hook_check_for_plugin_conflicts' ), 10, 1 ); - add_action( 'admin_init', array( $this, 'import_plugin_hooks' ) ); - - add_filter( 'wpseo_submenu_pages', array( $this, 'filter_settings_pages' ) ); - - WPSEO_Sitemaps_Cache::register_clear_on_option_update( 'wpseo' ); - - if ( WPSEO_Utils::is_yoast_seo_page() ) { - add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) ); - } - - if ( WPSEO_Utils::is_api_available() ) { - $configuration = new WPSEO_Configuration_Page; - $configuration->catch_configuration_request(); - } - - $this->set_upsell_notice(); - - $this->check_php_version(); - $this->initialize_cornerstone_content(); - } - - /** - * Setting the hooks for importing data from other plugins - */ - public function import_plugin_hooks() { - if ( current_user_can( $this->get_manage_options_cap() ) ) { - $plugin_imports = array( - 'wpSEO' => new WPSEO_Import_WPSEO_Hooks(), - 'aioseo' => new WPSEO_Import_AIOSEO_Hooks(), - ); - } - } - - /** - * Schedules a rewrite flush to happen at shutdown - */ - function schedule_rewrite_flush() { - add_action( 'shutdown', 'flush_rewrite_rules' ); - } - - /** - * Returns all the classes for the admin features - * - * @return array - */ - public function get_admin_features() { - return $this->admin_features; - } - - /** - * Register the menu item and its sub menu's. - * - * @global array $submenu used to change the label on the first item. - */ - function register_settings_page() { - if ( WPSEO_Utils::grant_access() !== true ) { - return; - } - - global $admin_page_hooks; - - // Base 64 encoded SVG image. - $icon_svg = WPSEO_Utils::get_icon_svg(); - - $manage_options_cap = $this->get_manage_options_cap(); - - $notification_center = Yoast_Notification_Center::get(); - $notification_count = $notification_center->get_notification_count(); - - // Add main page. - /* translators: %s: number of notifications */ - $counter_screen_reader_text = sprintf( _n( '%s notification', '%s notifications', $notification_count, 'wordpress-seo' ), number_format_i18n( $notification_count ) ); - $counter = sprintf( '%2$s', $notification_count, $counter_screen_reader_text ); - - $admin_page = add_menu_page( 'Yoast SEO: ' . __( 'Dashboard', 'wordpress-seo' ), __( 'SEO', 'wordpress-seo' ) . ' ' . $counter, $manage_options_cap, self::PAGE_IDENTIFIER, array( - $this, - 'load_page', - ), $icon_svg, '99.31337' ); - - $admin_page_hooks[ self::PAGE_IDENTIFIER ] = 'seo'; // Wipe notification bits from hooks. R. - - $license_page_title = defined( 'WPSEO_PREMIUM_PLUGIN_FILE' ) ? __( 'Premium', 'wordpress-seo' ) : __( 'Go Premium', 'wordpress-seo' ) . ' ' . $this->get_premium_indicator(); - - // Sub menu pages. - $submenu_pages = array( - array( - self::PAGE_IDENTIFIER, - '', - __( 'General', 'wordpress-seo' ), - $manage_options_cap, - self::PAGE_IDENTIFIER, - array( $this, 'load_page' ), - null, - ), - array( - self::PAGE_IDENTIFIER, - '', - __( 'Titles & Metas', 'wordpress-seo' ), - $manage_options_cap, - 'wpseo_titles', - array( $this, 'load_page' ), - ), - array( - self::PAGE_IDENTIFIER, - '', - __( 'Social', 'wordpress-seo' ), - $manage_options_cap, - 'wpseo_social', - array( $this, 'load_page' ), - null, - ), - array( - self::PAGE_IDENTIFIER, - '', - __( 'XML Sitemaps', 'wordpress-seo' ), - $manage_options_cap, - 'wpseo_xml', - array( $this, 'load_page' ), - null, - ), - array( - self::PAGE_IDENTIFIER, - '', - __( 'Advanced', 'wordpress-seo' ), - $manage_options_cap, - 'wpseo_advanced', - array( $this, 'load_page' ), - null, - ), - array( - self::PAGE_IDENTIFIER, - '', - __( 'Tools', 'wordpress-seo' ), - $manage_options_cap, - 'wpseo_tools', - array( $this, 'load_page' ), - null, - ), - array( - self::PAGE_IDENTIFIER, - '', - __( 'Search Console', 'wordpress-seo' ), - $manage_options_cap, - 'wpseo_search_console', - array( $this->admin_features['google_search_console'], 'display' ), - array( array( $this->admin_features['google_search_console'], 'set_help' ) ), - ), - array( - self::PAGE_IDENTIFIER, - '', - $license_page_title, - $manage_options_cap, - 'wpseo_licenses', - array( $this, 'load_page' ), - null, - ), - ); - - // Allow submenu pages manipulation. - $submenu_pages = apply_filters( 'wpseo_submenu_pages', $submenu_pages ); - - // Loop through submenu pages and add them. - if ( count( $submenu_pages ) ) { - foreach ( $submenu_pages as $submenu_page ) { - - $page_title = $submenu_page[2] . ' - Yoast SEO'; - - // We cannot use $submenu_page[1] because add-ons define that, so hard-code this value. - if ( 'wpseo_licenses' === $submenu_page[4] ) { - $page_title = __( 'Premium', 'wordpress-seo' ) . ' - Yoast SEO'; - } - - // Add submenu page. - $admin_page = add_submenu_page( $submenu_page[0], $page_title, $submenu_page[2], $submenu_page[3], $submenu_page[4], $submenu_page[5] ); - - // Check if we need to hook. - if ( isset( $submenu_page[6] ) && ( is_array( $submenu_page[6] ) && $submenu_page[6] !== array() ) ) { - foreach ( $submenu_page[6] as $submenu_page_action ) { - add_action( 'load-' . $admin_page, $submenu_page_action ); - } - } - } - } - - global $submenu; - if ( isset( $submenu[ self::PAGE_IDENTIFIER ] ) && current_user_can( $manage_options_cap ) ) { - $submenu[ self::PAGE_IDENTIFIER ][0][0] = __( 'Dashboard', 'wordpress-seo' ); - } - } - - /** - * Register assets needed on admin pages - */ - public function enqueue_assets() { - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_style( 'help-center' ); - - if ( 'wpseo_licenses' === filter_input( INPUT_GET, 'page' ) ) { - $asset_manager->enqueue_style( 'extensions' ); - } - } - - /** - * Returns the manage_options cap - * - * @return mixed|void - */ - private function get_manage_options_cap() { - /** - * Filter: 'wpseo_manage_options_capability' - Allow changing the capability users need to view the settings pages - * - * @api string unsigned The capability - */ - $manage_options_cap = apply_filters( 'wpseo_manage_options_capability', 'manage_options' ); - - return $manage_options_cap; - } - - /** - * Adds contextual help to the titles & metas page. - */ - function title_metas_help_tab() { - $screen = get_current_screen(); - - $screen->set_help_sidebar( ' -

    ' . __( 'For more information:', 'wordpress-seo' ) . '

    -

    ' . __( 'Title optimization', 'wordpress-seo' ) . '

    -

    ' . __( 'Why Google won\'t display the right page title', 'wordpress-seo' ) . '

    ' - ); - - $screen->add_help_tab( - array( - 'id' => 'basic-help', - 'title' => __( 'Template explanation', 'wordpress-seo' ), - 'content' => "\n\t\t

    " . __( 'Template explanation', 'wordpress-seo' ) . "

    \n\t\t" . '

    ' . - sprintf( - /* translators: %1$s expands to Yoast SEO. */ - __( 'The title & metas settings for %1$s are made up of variables that are replaced by specific values from the page when the page is displayed. The tabs on the left explain the available variables.', 'wordpress-seo' ), - 'Yoast SEO' ) . - '

    ' . __( 'Note that not all variables can be used in every template.', 'wordpress-seo' ) . '

    ', - ) - ); - - $screen->add_help_tab( - array( - 'id' => 'title-vars', - 'title' => __( 'Basic Variables', 'wordpress-seo' ), - 'content' => "\n\t\t

    " . __( 'Basic Variables', 'wordpress-seo' ) . "

    \n\t\t" . WPSEO_Replace_Vars::get_basic_help_texts(), - ) - ); - - $screen->add_help_tab( - array( - 'id' => 'title-vars-advanced', - 'title' => __( 'Advanced Variables', 'wordpress-seo' ), - 'content' => "\n\t\t

    " . __( 'Advanced Variables', 'wordpress-seo' ) . "

    \n\t\t" . WPSEO_Replace_Vars::get_advanced_help_texts(), - ) - ); - } - - /** - * Register the settings page for the Network settings. - */ - function register_network_settings_page() { - if ( WPSEO_Utils::grant_access() ) { - // Base 64 encoded SVG image. - $icon_svg = WPSEO_Utils::get_icon_svg(); - - add_menu_page( 'Yoast SEO: ' . __( 'MultiSite Settings', 'wordpress-seo' ), __( 'SEO', 'wordpress-seo' ), 'delete_users', self::PAGE_IDENTIFIER, array( - $this, - 'network_config_page', - ), $icon_svg ); - - if ( WPSEO_Utils::allow_system_file_edit() === true ) { - add_submenu_page( self::PAGE_IDENTIFIER, 'Yoast SEO: ' . __( 'Edit Files', 'wordpress-seo' ), __( 'Edit Files', 'wordpress-seo' ), 'delete_users', 'wpseo_files', array( - $this, - 'load_page', - ) ); - } - - // Add Extension submenu page. - add_submenu_page( self::PAGE_IDENTIFIER, 'Yoast SEO: ' . __( 'Extensions', 'wordpress-seo' ), __( 'Extensions', 'wordpress-seo' ), 'delete_users', 'wpseo_licenses', array( - $this, - 'load_page', - ) ); - } - } - - - /** - * Load the form for a WPSEO admin page - */ - function load_page() { - $page = filter_input( INPUT_GET, 'page' ); - - switch ( $page ) { - case 'wpseo_advanced': - require_once( WPSEO_PATH . 'admin/pages/advanced.php' ); - break; - - case 'wpseo_tools': - require_once( WPSEO_PATH . 'admin/pages/tools.php' ); - break; - - case 'wpseo_titles': - require_once( WPSEO_PATH . 'admin/pages/metas.php' ); - break; - - case 'wpseo_social': - require_once( WPSEO_PATH . 'admin/pages/social.php' ); - break; - - case 'wpseo_xml': - require_once( WPSEO_PATH . 'admin/pages/xml-sitemaps.php' ); - break; - - case 'wpseo_licenses': - require_once( WPSEO_PATH . 'admin/pages/licenses.php' ); - break; - - case 'wpseo_files': - require_once( WPSEO_PATH . 'admin/views/tool-file-editor.php' ); - break; - - case 'wpseo_tutorial_videos': - require_once( WPSEO_PATH . 'admin/pages/tutorial-videos.php' ); - break; - - case 'wpseo_configurator': - require_once( WPSEO_PATH . 'admin/config-ui/class-configuration-page.php' ); - break; - - case self::PAGE_IDENTIFIER: - default: - require_once( WPSEO_PATH . 'admin/pages/dashboard.php' ); - break; - } - } - - /** - * Loads the form for the network configuration page. - */ - function network_config_page() { - require_once( WPSEO_PATH . 'admin/pages/network.php' ); - } - - - /** - * Adds the ability to choose how many posts are displayed per page - * on the bulk edit pages. - */ - function bulk_edit_options() { - $option = 'per_page'; - $args = array( - 'label' => __( 'Posts', 'wordpress-seo' ), - 'default' => 10, - 'option' => 'wpseo_posts_per_page', - ); - add_screen_option( $option, $args ); - } - - /** - * Saves the posts per page limit for bulk edit pages. - * - * @param int $status Status value to pass through. - * @param string $option Option name. - * @param int $value Count value to check. - * - * @return int - */ - function save_bulk_edit_options( $status, $option, $value ) { - if ( 'wpseo_posts_per_page' === $option && ( $value > 0 && $value < 1000 ) ) { - return $value; - } - - return $status; - } - - /** - * Add a link to the settings page to the plugins list - * - * @staticvar string $this_plugin holds the directory & filename for the plugin - * - * @param array $links array of links for the plugins, adapted when the current plugin is found. - * @param string $file the filename for the current plugin, which the filter loops through. - * - * @return array $links - */ - function add_action_link( $links, $file ) { - if ( WPSEO_BASENAME === $file && WPSEO_Utils::grant_access() ) { - $settings_link = '' . __( 'Settings', 'wordpress-seo' ) . ''; - array_unshift( $links, $settings_link ); - } - - if ( class_exists( 'WPSEO_Product_Premium' ) ) { - $license_manager = new Yoast_Plugin_License_Manager( new WPSEO_Product_Premium() ); - if ( $license_manager->license_is_valid() ) { - return $links; - } - } - - // Add link to premium support landing page. - $premium_link = '' . __( 'Premium Support', 'wordpress-seo' ) . ''; - array_unshift( $links, $premium_link ); - - // Add link to docs. - $faq_link = '' . __( 'FAQ', 'wordpress-seo' ) . ''; - array_unshift( $links, $faq_link ); - - return $links; - } - - /** - * Enqueues the (tiny) global JS needed for the plugin. - */ - function config_page_scripts() { - if ( WPSEO_Utils::grant_access() ) { - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_script( 'admin-global-script' ); - - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'admin-global-script', 'wpseoAdminGlobalL10n', $this->localize_admin_global_script() ); - } - } - - /** - * Enqueues the (tiny) global stylesheet needed for the plugin. - */ - public function enqueue_global_style() { - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_style( 'admin-global' ); - } - - /** - * Filter the $contactmethods array and add Facebook, Google+ and Twitter. - * - * These are used with the Facebook author, rel="author" and Twitter cards implementation. - * - * @param array $contactmethods currently set contactmethods. - * - * @return array $contactmethods with added contactmethods. - */ - public function update_contactmethods( $contactmethods ) { - // Add Google+. - $contactmethods['googleplus'] = __( 'Google+', 'wordpress-seo' ); - // Add Twitter. - $contactmethods['twitter'] = __( 'Twitter username (without @)', 'wordpress-seo' ); - // Add Facebook. - $contactmethods['facebook'] = __( 'Facebook profile URL', 'wordpress-seo' ); - - return $contactmethods; - } - - /** - * Cleans stopwords out of the slug, if the slug hasn't been set yet. - * - * @since 1.1.7 - * - * @param string $slug if this isn't empty, the function will return an unaltered slug. - * - * @return string $clean_slug cleaned slug - */ - function remove_stopwords_from_slug( $slug ) { - return $this->filter_stopwords_from_slug( $slug, filter_input( INPUT_POST, 'post_title' ) ); - } - - /** - * Filter the stopwords from the slug - * - * @param string $slug The current slug, if not empty there will be done nothing. - * @param string $post_title The title which will be used in case of an empty slug. - * - * @return string - */ - public function filter_stopwords_from_slug( $slug, $post_title ) { - // Don't change an existing slug. - if ( isset( $slug ) && $slug !== '' ) { - return $slug; - } - - // When the post title is empty, just return the slug. - if ( empty( $post_title ) ) { - return $slug; - } - - // Don't change the slug if this is a multisite installation and the site has been switched. - if ( is_multisite() && ms_is_switched() ) { - return $slug; - } - - // Don't change slug if the post is a draft, this conflicts with polylang. - // Doesn't work with filter_input() since need current value, not originally submitted one. - if ( 'draft' === $_POST['post_status'] ) { - return $slug; - } - - // Lowercase the slug and strip slashes. - $new_slug = sanitize_title( stripslashes( $post_title ) ); - - $stop_words = new WPSEO_Admin_Stop_Words(); - return $stop_words->remove_in( $new_slug ); - } - - /** - * Filters all advanced settings pages from the given pages. - * - * @param array $pages The pages to filter. - * - * @return array - */ - public function filter_settings_pages( array $pages ) { - if ( wpseo_advanced_settings_enabled( $this->options ) ) { - return $pages; - } - - $pages_to_hide = WPSEO_Advanced_Settings::get_advanced_pages(); - $page = filter_input( INPUT_GET, 'page' ); - - if ( WPSEO_Advanced_Settings::is_advanced_settings_page( $page ) ) { - $pages_to_hide = $this->temporarily_enable_page( $pages_to_hide, $page ); - } - - foreach ( $pages as $page_key => $page ) { - $page_name = $page[4]; - - if ( in_array( $page_name, $pages_to_hide ) ) { - unset( $pages[ $page_key ] ); - } - } - - return $pages; - } - - /** - * Given a list of passed pages that will be disabled, removes the given page from the list so that it will no longer be disabled. - * - * @param array $pages The pages to search through. - * @param string $page The page to temporarily enable. - * - * @return array The remaining pages that need to be disabled. - */ - private function temporarily_enable_page( $pages, $page ) { - $enable_page = array_search( $page, $pages ); - - if ( $enable_page !== false ) { - unset( $pages[ $enable_page ] ); - } - - return $pages; - } - - /** - * Log the updated timestamp for user profiles when theme is changed - */ - function switch_theme() { - $users = get_users( array( 'who' => 'authors' ) ); - if ( is_array( $users ) && $users !== array() ) { - foreach ( $users as $user ) { - update_user_meta( $user->ID, '_yoast_wpseo_profile_updated', time() ); - } - } - } - - /** - * Localization for the dismiss urls. - * - * @return array - */ - private function localize_admin_global_script() { - return array( - 'dismiss_about_url' => $this->get_dismiss_url( 'wpseo-dismiss-about' ), - 'dismiss_tagline_url' => $this->get_dismiss_url( 'wpseo-dismiss-tagline-notice' ), - 'help_video_iframe_title' => __( 'Yoast SEO video tutorial', 'wordpress-seo' ), - 'scrollable_table_hint' => __( 'Scroll to see the table content.', 'wordpress-seo' ), - ); - } - - /** - * Extending the current page URL with two params to be able to ignore the notice. - * - * @param string $dismiss_param The param used to dismiss the notification. - * - * @return string - */ - private function get_dismiss_url( $dismiss_param ) { - $arr_params = array( - $dismiss_param => '1', - 'nonce' => wp_create_nonce( $dismiss_param ), - ); - - return esc_url( add_query_arg( $arr_params ) ); - } - - /** - * @return string - */ - private function get_premium_indicator() { - /** - * The class that will be applied to the premium indicator. - * - * @type array Classes that will be applied tot the premium indicator. - */ - $classes = apply_filters( 'wpseo_premium_indicator_classes', array( - 'wpseo-premium-indicator', - 'wpseo-premium-indicator--no', - 'wpseo-js-premium-indicator', - 'update-plugins', - ) ); - - /** - * The text to put inside the premium indicator. - * - * @type string The text to read to screen readers. - */ - $text = apply_filters( 'wpseo_premium_indicator_text', __( 'Disabled', 'wordpress-seo' ) ); - - $premium_indicator = sprintf( - "%s", - esc_attr( implode( ' ', $classes ) ), - esc_html( $text ) - ); - - return $premium_indicator; - } - - /** - * Sets the upsell notice. - */ - protected function set_upsell_notice() { - $upsell = new WPSEO_Product_Upsell_Notice(); - $upsell->dismiss_notice_listener(); - $upsell->initialize(); - } - - /** - * Initializes Whip to show a notice for outdated PHP versions. - */ - protected function check_php_version() { - if ( ! current_user_can( 'manage_options' ) ) { - return; - } - - if ( ! $this->on_dashboard_page() ) { - return; - } - - whip_wp_check_versions( array( - 'php' => '>=5.3', - ) ); - } - - /** - * Whether we are on the admin dashboard page. - * - * @returns bool - */ - protected function on_dashboard_page() { - return 'index.php' === $GLOBALS['pagenow']; - } - - /** - * Loads the cornerstone filter - */ - protected function initialize_cornerstone_content() { - if ( ! $this->options['enable_cornerstone_content'] ) { - return false; - } - - $cornerstone = new WPSEO_Cornerstone(); - $cornerstone->register_hooks(); - - $cornerstone_filter = new WPSEO_Cornerstone_Filter(); - $cornerstone_filter->register_hooks(); - } - - /********************** DEPRECATED METHODS **********************/ - - // @codeCoverageIgnoreStart - /** - * Check whether the current user is allowed to access the configuration. - * - * @deprecated 1.5.0 - * @deprecated use WPSEO_Utils::grant_access() - * @see WPSEO_Utils::grant_access() - * - * @return boolean - */ - function grant_access() { - _deprecated_function( __METHOD__, 'WPSEO 1.5.0', 'WPSEO_Utils::grant_access()' ); - - return WPSEO_Utils::grant_access(); - } - - /** - * Check whether the current user is allowed to access the configuration. - * - * @deprecated 1.5.0 - * @deprecated use wpseo_do_upgrade() - * @see WPSEO_Upgrade - */ - function maybe_upgrade() { - _deprecated_function( __METHOD__, 'WPSEO 1.5.0', 'wpseo_do_upgrade' ); - new WPSEO_Upgrade(); - } - - /** - * Clears the cache - * - * @deprecated 1.5.0 - * @deprecated use WPSEO_Utils::clear_cache() - * @see WPSEO_Utils::clear_cache() - */ - function clear_cache() { - _deprecated_function( __METHOD__, 'WPSEO 1.5.0', 'WPSEO_Utils::clear_cache()' ); - WPSEO_Utils::clear_cache(); - } - - /** - * Clear rewrites - * - * @deprecated 1.5.0 - * @deprecated use WPSEO_Utils::clear_rewrites() - * @see WPSEO_Utils::clear_rewrites() - */ - function clear_rewrites() { - _deprecated_function( __METHOD__, 'WPSEO 1.5.0', 'WPSEO_Utils::clear_rewrites()' ); - WPSEO_Utils::clear_rewrites(); - } - - /** - * Register all the options needed for the configuration pages. - * - * @deprecated 1.5.0 - * @deprecated use WPSEO_Option::register_setting() on each individual option - * @see WPSEO_Option::register_setting() - */ - function options_init() { - _deprecated_function( __METHOD__, 'WPSEO 1.5.0', 'WPSEO_Option::register_setting()' ); - } - - /** - * Display an error message when the blog is set to private. - * - * @deprecated 3.3 - */ - function blog_public_warning() { - _deprecated_function( __METHOD__, 'WPSEO 3.3.0' ); - } - - /** - * Display an error message when the theme contains a meta description tag. - * - * @since 1.4.14 - * - * @deprecated 3.3 - */ - function meta_description_warning() { - _deprecated_function( __FUNCTION__, 'WPSEO 3.3.0' ); - } - - /** - * Returns the stopwords for the current language - * - * @since 1.1.7 - * @deprecated 3.1 Use WPSEO_Admin_Stop_Words::list_stop_words() instead. - * - * @return array $stopwords array of stop words to check and / or remove from slug - */ - function stopwords() { - _deprecated_function( __METHOD__, 'WPSEO 3.1', 'WPSEO_Admin_Stop_Words::list_stop_words' ); - - $stop_words = new WPSEO_Admin_Stop_Words(); - return $stop_words->list_stop_words(); - } - - /** - * Check whether the stopword appears in the string - * - * @deprecated 3.1 - * - * @param string $haystack The string to be checked for the stopword. - * @param bool $checking_url Whether or not we're checking a URL. - * - * @return bool|mixed - */ - function stopwords_check( $haystack, $checking_url = false ) { - _deprecated_function( __METHOD__, 'WPSEO 3.1' ); - - $stop_words = $this->stopwords(); - - if ( is_array( $stop_words ) && $stop_words !== array() ) { - foreach ( $stop_words as $stop_word ) { - // If checking a URL remove the single quotes. - if ( $checking_url ) { - $stop_word = str_replace( "'", '', $stop_word ); - } - - // Check whether the stopword appears as a whole word. - // @todo [JRF => whomever] check whether the use of \b (=word boundary) would be more efficient ;-). - $res = preg_match( "`(^|[ \n\r\t\.,'\(\)\"\+;!?:])" . preg_quote( $stop_word, '`' ) . "($|[ \n\r\t\.,'\(\)\"\+;!?:])`iu", $haystack ); - if ( $res > 0 ) { - return $stop_word; - } - } - } - - return false; - } - - // @codeCoverageIgnoreEnd -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-asset.php b/wp/wp-content/plugins/wordpress-seo/admin/class-asset.php deleted file mode 100644 index 3721a05d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-asset.php +++ /dev/null @@ -1,223 +0,0 @@ - array(), - 'version' => WPSEO_VERSION, - 'in_footer' => true, - 'rtl' => true, - 'media' => 'all', - 'suffix' => WPSEO_CSSJS_SUFFIX, - ), $args ); - - $this->name = $args['name']; - $this->src = $args['src']; - $this->deps = $args['deps']; - $this->version = $args['version']; - $this->media = $args['media']; - $this->in_footer = $args['in_footer']; - $this->rtl = $args['rtl']; - $this->suffix = $args['suffix']; - } - - /** - * @return string - */ - public function get_name() { - return $this->name; - } - - /** - * @return string - */ - public function get_src() { - return $this->src; - } - - /** - * @return array|string - */ - public function get_deps() { - return $this->deps; - } - - /** - * @return string - */ - public function get_version() { - return $this->version; - } - - /** - * @return string - */ - public function get_media() { - return $this->media; - } - - /** - * @return boolean - */ - public function is_in_footer() { - return $this->in_footer; - } - - /** - * @return boolean - */ - public function has_rtl() { - return $this->rtl; - } - - /** - * @return string - */ - public function get_suffix() { - return $this->suffix; - } - - /** - * Returns the full URL for this asset based on the path to the plugin file. - * - * @param string $type Type of asset. - * @param string $plugin_file Absolute path to the plugin file. - * - * @return string The full URL to the asset. - */ - public function get_url( $type, $plugin_file ) { - - $relative_path = $this->get_relative_path( $type ); - if ( empty( $relative_path ) ) { - return ''; - } - - if ( 'development' !== YOAST_ENVIRONMENT && ! $this->get_suffix() ) { - $plugin_path = plugin_dir_path( $plugin_file ); - if ( ! file_exists( $plugin_path . $relative_path ) ) { - - // Give a notice to the user in the console (only once). - WPSEO_Utils::javascript_console_notification( - 'Development Files', - sprintf( - /* translators: %1$s resolves to https://github.com/Yoast/wordpress-seo */ - __( 'You are trying to load non-minified files, these are only available in our development package. Check out %1$s to see all the source files.', 'wordpress-seo' ), - 'https://github.com/Yoast/wordpress-seo' - ), - true - ); - - // Just load the .min file. - $relative_path = $this->get_relative_path( $type, '.min' ); - } - } - - return plugins_url( $relative_path, $plugin_file ); - } - - /** - * Get the relative file for this asset - * - * @param string $type Type of this asset. - * @param null $force_suffix Force use suffix. - * - * @return string - */ - protected function get_relative_path( $type, $force_suffix = null ) { - $relative_path = $rtl_path = $rtl_suffix = ''; - - $suffix = ( is_null( $force_suffix ) ) ? $this->get_suffix() : $force_suffix; - - switch ( $type ) { - case self::TYPE_JS: - $relative_path = 'js/dist/' . $this->get_src() . $suffix . '.js'; - break; - - case self::TYPE_CSS: - // Path and suffix for RTL stylesheets. - if ( function_exists( 'is_rtl' ) && is_rtl() && $this->has_rtl() ) { - $rtl_path = 'dist/'; - $rtl_suffix = '-rtl'; - } - $relative_path = 'css/' . $rtl_path . $this->get_src() . $rtl_suffix . $suffix . '.css'; - break; - } - - return $relative_path; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-description-editor-list-table.php b/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-description-editor-list-table.php deleted file mode 100644 index 2b2c6470..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-description-editor-list-table.php +++ /dev/null @@ -1,76 +0,0 @@ - 'wpseo_bulk_description', - 'plural' => 'wpseo_bulk_descriptions', - 'ajax' => true, - ); - - /** - * The field in the database where meta field is saved. - * - * @var string - */ - protected $target_db_field = 'metadesc'; - - /** - * The columns shown on the table - * - * @return array - */ - public function get_columns() { - $columns = array( - 'col_existing_yoast_seo_metadesc' => __( 'Existing Yoast Meta Description', 'wordpress-seo' ), - 'col_new_yoast_seo_metadesc' => __( 'New Yoast Meta Description', 'wordpress-seo' ), - ); - - return $this->merge_columns( $columns ); - } - - /** - * Parse the metadescription - * - * @param string $column_name Column name. - * @param object $record Data object. - * @param string $attributes HTML attributes. - * - * @return string - */ - protected function parse_page_specific_column( $column_name, $record, $attributes ) { - switch ( $column_name ) { - case 'col_new_yoast_seo_metadesc': - return sprintf( - '', - 'wpseo-new-metadesc-' . $record->ID, - $record->ID - ); - break; - - case 'col_existing_yoast_seo_metadesc': - // TODO inconsistent return/echo behavior R. - echo $this->parse_meta_data_field( $record->ID, $attributes ); - break; - } - } -} /* End of class */ diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-editor-list-table.php b/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-editor-list-table.php deleted file mode 100644 index 183ded96..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-editor-list-table.php +++ /dev/null @@ -1,981 +0,0 @@ -page_type) there will be constructed an url part, for subpages and - * navigation - * - * @var string - */ - protected $page_url; - - /** - * The settings which will be used in the __construct. - * - * @var array - */ - protected $settings; - - /** - * @var array - */ - protected $pagination = array(); - - /** - * Class constructor - */ - function __construct() { - parent::__construct( $this->settings ); - - $this->request_url = $_SERVER['REQUEST_URI']; - $this->current_page = ( ! empty( $_GET['paged'] ) ) ? $_GET['paged'] : 1; - $this->current_filter = ( ! empty( $_GET['post_type_filter'] ) ) ? $_GET['post_type_filter'] : 1; - $this->current_status = ( ! empty( $_GET['post_status'] ) ) ? $_GET['post_status'] : 1; - $this->current_order = array( - 'order' => ( ! empty( $_GET['order'] ) ) ? $_GET['order'] : 'asc', - 'orderby' => ( ! empty( $_GET['orderby'] ) ) ? $_GET['orderby'] : 'post_title', - ); - - $this->verify_nonce(); - - $this->nonce = wp_create_nonce( 'bulk-editor-table' ); - $this->page_url = "&nonce={$this->nonce}&type={$this->page_type}#top#{$this->page_type}"; - - $this->populate_editable_post_types(); - - } - - /** - * Verifies nonce if additional parameters have been sent. - * - * Shows an error notification if the nonce check fails. - */ - private function verify_nonce() { - if ( $this->should_verify_nonce() && ! wp_verify_nonce( filter_input( INPUT_GET, 'nonce' ), 'bulk-editor-table' ) ) { - Yoast_Notification_Center::get()->add_notification( - new Yoast_Notification( - __( 'You are not allowed to access this page.', 'wordpress-seo' ), - array( 'type' => Yoast_Notification::ERROR ) - ) - ); - Yoast_Notification_Center::get()->display_notifications(); - die; - } - } - - /** - * Checks if additional parameters have been sent to determine if nonce should be checked or not. - * - * @return bool - */ - private function should_verify_nonce() { - $possible_params = array( - 'type', - 'paged', - 'post_type_filter', - 'post_status', - 'order', - 'orderby', - ); - - foreach ( $possible_params as $param_name ) { - if ( filter_input( INPUT_GET, $param_name ) ) { - return true; - } - } - } - - /** - * Prepares the data and renders the page. - */ - public function show_page() { - $this->prepare_page_navigation(); - $this->prepare_items(); - - $this->views(); - $this->display(); - } - - /** - * Used in the constructor to build a reference list of post types the current user can edit. - */ - protected function populate_editable_post_types() { - $post_types = get_post_types( array( 'public' => true, 'exclude_from_search' => false ), 'object' ); - - $this->all_posts = array(); - $this->own_posts = array(); - - if ( is_array( $post_types ) && $post_types !== array() ) { - foreach ( $post_types as $post_type ) { - if ( ! current_user_can( $post_type->cap->edit_posts ) ) { - continue; - } - - if ( current_user_can( $post_type->cap->edit_others_posts ) ) { - $this->all_posts[] = esc_sql( $post_type->name ); - } - else { - $this->own_posts[] = esc_sql( $post_type->name ); - } - } - } - } - - - /** - * Will shown the navigation for the table like pagenavigation and pagefilter; - * - * @param string $which Table nav location (such as top). - */ - function display_tablenav( $which ) { - $post_status = sanitize_text_field( filter_input( INPUT_GET, 'post_status' ) ); - ?> -
    - - - - - - - - - - - - - - - - extra_tablenav( $which ); - $this->pagination( $which ); - ?> - -
    - - - -
    - - prepare(), passing the current user_id in as the first parameter. - */ - function get_base_subquery() { - global $wpdb; - - $all_posts_string = "'" . implode( "', '", $this->all_posts ) . "'"; - $own_posts_string = "'" . implode( "', '", $this->own_posts ) . "'"; - - $post_author = esc_sql( (int) get_current_user_id() ); - - $subquery = "( - SELECT * - FROM {$wpdb->posts} - WHERE post_type IN ({$all_posts_string}) - UNION ALL - SELECT * - FROM {$wpdb->posts} - WHERE post_type IN ({$own_posts_string}) AND post_author = {$post_author} - ) sub_base"; - - return $subquery; - } - - - /** - * @return array - */ - function get_views() { - global $wpdb; - - $status_links = array(); - - $states = get_post_stati( array( 'show_in_admin_all_list' => true ) ); - $states['trash'] = 'trash'; - $states = esc_sql( $states ); - $all_states = "'" . implode( "', '", $states ) . "'"; - - $subquery = $this->get_base_subquery(); - - $total_posts = $wpdb->get_var( - " - SELECT COUNT(ID) FROM {$subquery} - WHERE post_status IN ({$all_states}) - " - ); - - - $post_status = filter_input( INPUT_GET, 'post_status' ); - $class = empty( $post_status ) ? ' class="current"' : ''; - $status_links['all'] = '' . sprintf( _nx( 'All (%s)', 'All (%s)', $total_posts, 'posts', 'wordpress-seo' ), number_format_i18n( $total_posts ) ) . ''; - - $post_stati = get_post_stati( array( 'show_in_admin_all_list' => true ), 'objects' ); - if ( is_array( $post_stati ) && $post_stati !== array() ) { - foreach ( $post_stati as $status ) { - - $status_name = esc_sql( $status->name ); - - $total = (int) $wpdb->get_var( - $wpdb->prepare( - " - SELECT COUNT(ID) FROM {$subquery} - WHERE post_status = %s - ", - $status_name - ) - ); - - if ( $total === 0 ) { - continue; - } - - $class = ''; - if ( $status_name === $post_status ) { - $class = ' class="current"'; - } - - $status_links[ $status_name ] = '' . sprintf( translate_nooped_plural( $status->label_count, $total ), number_format_i18n( $total ) ) . ''; - } - } - unset( $post_stati, $status, $status_name, $total, $class ); - - $trashed_posts = $wpdb->get_var( - " - SELECT COUNT(ID) FROM {$subquery} - WHERE post_status IN ('trash') - " - ); - - $class = ''; - if ( 'trash' === $post_status ) { - $class = 'class="current"'; - } - $status_links['trash'] = '' . sprintf( _nx( 'Trash (%s)', 'Trash (%s)', $trashed_posts, 'posts', 'wordpress-seo' ), number_format_i18n( $trashed_posts ) ) . ''; - - return $status_links; - } - - - /** - * @param string $which Table nav location (such as top). - */ - function extra_tablenav( $which ) { - - if ( 'top' === $which ) { - $post_types = get_post_types( array( 'public' => true, 'exclude_from_search' => false ) ); - - $instance_type = esc_attr( $this->page_type ); - - if ( is_array( $post_types ) && $post_types !== array() ) { - global $wpdb; - - echo '
    '; - - $post_types = esc_sql( $post_types ); - $post_types = "'" . implode( "', '", $post_types ) . "'"; - - $states = get_post_stati( array( 'show_in_admin_all_list' => true ) ); - $states['trash'] = 'trash'; - $states = esc_sql( $states ); - $all_states = "'" . implode( "', '", $states ) . "'"; - - $subquery = $this->get_base_subquery(); - - $post_types = $wpdb->get_results( - " - SELECT DISTINCT post_type FROM {$subquery} - WHERE post_status IN ({$all_states}) - ORDER BY 'post_type' ASC - " - ); - - $post_type_filter = filter_input( INPUT_GET, 'post_type_filter' ); - $selected = ( ! empty( $post_type_filter ) ) ? sanitize_text_field( $post_type_filter ) : '-1'; - - $options = ''; - - if ( is_array( $post_types ) && $post_types !== array() ) { - foreach ( $post_types as $post_type ) { - $obj = get_post_type_object( $post_type->post_type ); - $options .= sprintf( '', $obj->labels->name, $post_type->post_type, selected( $selected, $post_type->post_type, false ) ); - } - } - - printf( - '', - 'post-type-filter-' . $instance_type, - __( 'Filter by post type', 'wordpress-seo' ) - ); - echo sprintf( '', $options, $instance_type ); - submit_button( __( 'Filter', 'wordpress-seo' ), 'button', false, false, array( 'id' => 'post-query-submit' ) ); - echo '
    '; - } - } - } - - /** - * - * @return array - */ - function get_sortable_columns() { - return array( - 'col_page_title' => array( 'post_title', true ), - 'col_post_type' => array( 'post_type', false ), - 'col_post_date' => array( 'post_date', false ), - ); - } - - /** - * Sets the correct pagenumber and pageurl for the navigation - */ - function prepare_page_navigation() { - - $request_url = $this->request_url . $this->page_url; - - $current_page = $this->current_page; - $current_filter = $this->current_filter; - $current_status = $this->current_status; - $current_order = $this->current_order; - - // If current type doesn't compare with objects page_type, than we have to unset some vars in the requested url (which will be use for internal table urls). - if ( $_GET['type'] != $this->page_type ) { - $request_url = remove_query_arg( 'paged', $request_url ); // Page will be set with value 1 below. - $request_url = remove_query_arg( 'post_type_filter', $request_url ); - $request_url = remove_query_arg( 'post_status', $request_url ); - $request_url = remove_query_arg( 'orderby', $request_url ); - $request_url = remove_query_arg( 'order', $request_url ); - $request_url = add_query_arg( 'pages', 1, $request_url ); - - $current_page = 1; - $current_filter = '-1'; - $current_status = ''; - $current_order = array( 'orderby' => 'post_title', 'order' => 'asc' ); - - } - - $_SERVER['REQUEST_URI'] = $request_url; - - $_GET['paged'] = $current_page; - $_REQUEST['paged'] = $current_page; - $_REQUEST['post_type_filter'] = $current_filter; - $_GET['post_type_filter'] = $current_filter; - $_GET['post_status'] = $current_status; - $_GET['orderby'] = $current_order['orderby']; - $_GET['order'] = $current_order['order']; - - } - - /** - * Preparing the requested pagerows and setting the needed variables - */ - function prepare_items() { - - $post_type_clause = $this->get_post_type_clause(); - $all_states = $this->get_all_states(); - $subquery = $this->get_base_subquery(); - - // Setting the column headers. - $this->set_column_headers(); - - // Count the total number of needed items and setting pagination given $total_items. - $total_items = $this->count_items( $subquery, $all_states, $post_type_clause ); - $this->set_pagination( $total_items ); - - // Getting items given $query. - $query = $this->parse_item_query( $subquery, $all_states, $post_type_clause ); - $this->get_items( $query ); - - // Get the metadata for the current items ($this->items). - $this->get_meta_data(); - - } - - /** - * Getting the columns for first row - * - * @return array - */ - public function get_columns() { - return $this->merge_columns(); - } - - /** - * Setting the column headers - */ - protected function set_column_headers() { - $columns = $this->get_columns(); - $hidden = array(); - $sortable = $this->get_sortable_columns(); - $this->_column_headers = array( $columns, $hidden, $sortable ); - } - - /** - * Counting total items - * - * @param string $subquery SQL FROM part. - * @param string $all_states SQL IN part. - * @param string $post_type_clause SQL post type part. - * - * @return mixed - */ - protected function count_items( $subquery, $all_states, $post_type_clause ) { - global $wpdb; - $total_items = $wpdb->get_var( - " - SELECT COUNT(ID) - FROM {$subquery} - WHERE post_status IN ({$all_states}) $post_type_clause - " - ); - - return $total_items; - } - - /** - * Getting the post_type_clause filter - * - * @return string - */ - protected function get_post_type_clause() { - // Filter Block. - $post_types = null; - $post_type_clause = ''; - $post_type_filter = filter_input( INPUT_GET, 'post_type_filter' ); - - if ( ! empty( $post_type_filter ) && get_post_type_object( sanitize_text_field( $post_type_filter ) ) ) { - $post_types = esc_sql( sanitize_text_field( $post_type_filter ) ); - $post_type_clause = "AND post_type IN ('{$post_types}')"; - } - - return $post_type_clause; - } - - /** - * Setting the pagination. - * - * Total items is the number of all visible items. - * - * @param int $total_items Total items counts. - */ - protected function set_pagination( $total_items ) { - - // Calculate items per page. - $per_page = $this->get_items_per_page( 'wpseo_posts_per_page', 10 ); - $paged = esc_sql( sanitize_text_field( filter_input( INPUT_GET, 'paged' ) ) ); - - if ( empty( $paged ) || ! is_numeric( $paged ) || $paged <= 0 ) { - $paged = 1; - } - - $this->set_pagination_args( - array( - 'total_items' => $total_items, - 'total_pages' => ceil( $total_items / $per_page ), - 'per_page' => $per_page, - ) - ); - - $this->pagination = array( - 'per_page' => $per_page, - 'offset' => ( $paged - 1 ) * $per_page, - ); - - } - - /** - * Parse the query to get items from database. - * - * Based on given parameters there will be parse a query which will get all the pages/posts and other post_types - * from the database. - * - * @param string $subquery SQL FROM part. - * @param string $all_states SQL IN part. - * @param string $post_type_clause SQL post type part. - * - * @return string - */ - protected function parse_item_query( $subquery, $all_states, $post_type_clause ) { - // Order By block. - $orderby = filter_input( INPUT_GET, 'orderby' ); - - $orderby = ! empty( $orderby ) ? esc_sql( sanitize_text_field( $orderby ) ) : 'post_title'; - $orderby = $this->sanitize_orderby( $orderby ); - - // Order clause. - $order = filter_input( INPUT_GET, 'order' ); - $order = ! empty( $order ) ? esc_sql( strtoupper( sanitize_text_field( $order ) ) ) : 'ASC'; - $order = $this->sanitize_order( $order ); - - // Get all needed results. - $query = " - SELECT ID, post_title, post_type, post_status, post_modified, post_date - FROM {$subquery} - WHERE post_status IN ({$all_states}) $post_type_clause - ORDER BY {$orderby} {$order} - LIMIT %d,%d - "; - - return $query; - } - - /** - * Heavily restricts the possible columns by which a user can order the table in the bulk editor, thereby preventing a possible CSRF vulnerability. - * - * @param string $orderby The column by which we want to order. - * - * @return string $orderby - */ - protected function sanitize_orderby( $orderby ) { - $valid_column_names = array( - 'post_title', - 'post_type', - 'post_date', - ); - - if ( in_array( $orderby, $valid_column_names ) ) { - return $orderby; - } - - return 'post_title'; - } - - /** - * Makes sure the order clause is always ASC or DESC for the bulk editor table, thereby preventing a possible CSRF vulnerability. - * - * @param string $order Whether we want to sort ascending or descending. - * - * @return string $order SQL order string (ASC, DESC). - */ - protected function sanitize_order( $order ) { - if ( in_array( strtoupper( $order ), array( 'ASC', 'DESC' ) ) ) { - return $order; - } - - return 'ASC'; - } - - /** - * Getting all the items. - * - * @param string $query SQL query to use. - */ - protected function get_items( $query ) { - global $wpdb; - - $this->items = $wpdb->get_results( - $wpdb->prepare( - $query, - $this->pagination['offset'], - $this->pagination['per_page'] - ) - ); - } - - /** - * Getting all the states. - * - * @return string - */ - protected function get_all_states() { - $states = get_post_stati( array( 'show_in_admin_all_list' => true ) ); - $states['trash'] = 'trash'; - - if ( ! empty( $_GET['post_status'] ) ) { - $requested_state = sanitize_text_field( $_GET['post_status'] ); - if ( in_array( $requested_state, $states ) ) { - $states = array( $requested_state ); - } - } - - $states = esc_sql( $states ); - $all_states = "'" . implode( "', '", $states ) . "'"; - - return $all_states; - } - - - /** - * Based on $this->items and the defined columns, the table rows will be displayed. - */ - function display_rows() { - - $records = $this->items; - - list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info(); - - if ( ( is_array( $records ) && $records !== array() ) && ( is_array( $columns ) && $columns !== array() ) ) { - - foreach ( $records as $rec ) { - - echo ''; - - foreach ( $columns as $column_name => $column_display_name ) { - - $classes = ''; - if ( $primary === $column_name ) { - $classes .= ' has-row-actions column-primary'; - } - - $attributes = $this->column_attributes( $column_name, $hidden, $classes, $column_display_name ); - - $column_value = $this->parse_column( $column_name, $rec ); - - if ( method_exists( $this, 'parse_page_specific_column' ) && empty( $column_value ) ) { - $column_value = $this->parse_page_specific_column( $column_name, $rec, $attributes ); - } - - if ( ! empty( $column_value ) ) { - echo sprintf( '%1$s', $column_value, $attributes ); - } - } - - echo ''; - } - } - } - - /** - * Getting the attributes for each table cell. - * - * @param string $column_name Column name string. - * @param array $hidden Set of hidden columns. - * @param string $classes Additional CSS classes. - * @param string $column_display_name Column display name string. - * - * @return string - */ - protected function column_attributes( $column_name, $hidden, $classes, $column_display_name ) { - - $attributes = ''; - $class = array( $column_name, "column-$column_name$classes" ); - - if ( in_array( $column_name, $hidden ) ) { - $class[] = 'hidden'; - } - - if ( ! empty( $class ) ) { - $attributes = 'class="' . implode( ' ', $class ) . '"'; - } - - $attributes .= ' data-colname="' . esc_attr( $column_display_name ) . '"'; - - return $attributes; - } - - /** - * Parsing the title. - * - * @param WP_Post $rec Post object. - * - * @return string - */ - protected function parse_page_title_column( $rec ) { - - $title = empty( $rec->post_title ) ? __( '(no title)', 'wordpress-seo' ) : $rec->post_title; - - $return = sprintf( '%1$s', stripslashes( wp_strip_all_tags( $title ) ) ); - - $post_type_object = get_post_type_object( $rec->post_type ); - $can_edit_post = current_user_can( $post_type_object->cap->edit_post, $rec->ID ); - - $actions = array(); - - if ( $can_edit_post && 'trash' !== $rec->post_status ) { - $actions['edit'] = sprintf( - '%s', - esc_url( get_edit_post_link( $rec->ID, true ) ), - /* translators: %s: post title */ - esc_attr( sprintf( __( 'Edit “%s”', 'wordpress-seo' ), $title ) ), - __( 'Edit', 'wordpress-seo' ) - ); - } - - if ( $post_type_object->public ) { - if ( in_array( $rec->post_status, array( 'pending', 'draft', 'future' ) ) ) { - if ( $can_edit_post ) { - $actions['view'] = sprintf( - '%s', - esc_url( add_query_arg( 'preview', 'true', get_permalink( $rec->ID ) ) ), - /* translators: %s: post title */ - esc_attr( sprintf( __( 'Preview “%s”', 'wordpress-seo' ), $title ) ), - __( 'Preview', 'wordpress-seo' ) - ); - } - } - elseif ( 'trash' !== $rec->post_status ) { - $actions['view'] = sprintf( - '%s', - esc_url( get_permalink( $rec->ID ) ), - /* translators: %s: post title */ - esc_attr( sprintf( __( 'View “%s”', 'wordpress-seo' ), $title ) ), - __( 'View', 'wordpress-seo' ) - ); - } - } - - $return .= $this->row_actions( $actions ); - - return $return; - - } - - /** - * Parsing the column based on the $column_name. - * - * @param string $column_name Column name. - * @param WP_Post $rec Post object. - * - * @return string - */ - protected function parse_column( $column_name, $rec ) { - - static $date_format; - - if ( $date_format == null ) { - $date_format = get_option( 'date_format' ); - } - - switch ( $column_name ) { - case 'col_page_title': - $column_value = $this->parse_page_title_column( $rec ); - break; - - case 'col_page_slug': - $permalink = get_permalink( $rec->ID ); - $display_slug = str_replace( get_bloginfo( 'url' ), '', $permalink ); - $column_value = sprintf( '%1$s', stripslashes( $display_slug ), esc_url( $permalink ) ); - break; - - case 'col_post_type': - $post_type = get_post_type_object( $rec->post_type ); - $column_value = $post_type->labels->singular_name; - break; - - case 'col_post_status': - $post_status = get_post_status_object( $rec->post_status ); - $column_value = $post_status->label; - break; - - case 'col_post_date': - $column_value = date_i18n( $date_format, strtotime( $rec->post_date ) ); - break; - - case 'col_row_action': - $column_value = sprintf( - '%2$s %3$s', - $rec->ID, - esc_html__( 'Save', 'wordpress-seo' ), - esc_html__( 'Save all', 'wordpress-seo' ) - ); - break; - } - - if ( ! empty( $column_value ) ) { - return $column_value; - } - } - - /** - * Parse the field where the existing meta-data value is displayed. - * - * @param integer $record_id Record ID. - * @param string $attributes HTML attributes. - * @param bool|array $values Optional values data array. - * - * @return string - */ - protected function parse_meta_data_field( $record_id, $attributes, $values = false ) { - - // Fill meta data if exists in $this->meta_data. - $meta_data = ( ! empty( $this->meta_data[ $record_id ] ) ) ? $this->meta_data[ $record_id ] : array(); - $meta_key = WPSEO_Meta::$meta_prefix . $this->target_db_field; - $meta_value = ( ! empty( $meta_data[ $meta_key ] ) ) ? $meta_data[ $meta_key ] : ''; - - if ( ! empty( $values ) ) { - $meta_value = $values[ $meta_value ]; - } - - return sprintf( '%1$s', $meta_value, $attributes, $record_id, $this->target_db_field ); - } - - /** - * Method for setting the meta data, which belongs to the records that will be shown on the current page. - * - * This method will loop through the current items ($this->items) for getting the post_id. With this data - * ($needed_ids) the method will query the meta-data table for getting the title. - */ - protected function get_meta_data() { - - $post_ids = $this->get_post_ids(); - $meta_data = $this->get_meta_data_result( $post_ids ); - - $this->parse_meta_data( $meta_data ); - - // Little housekeeping. - unset( $post_ids, $meta_data ); - - } - - /** - * Getting all post_ids from to $this->items. - * - * @return string - */ - protected function get_post_ids() { - $needed_ids = array(); - foreach ( $this->items as $item ) { - $needed_ids[] = $item->ID; - } - - $post_ids = "'" . implode( "', '", $needed_ids ) . "'"; - - return $post_ids; - } - - /** - * Getting the meta_data from database. - * - * @param string $post_ids Post IDs string for SQL IN part. - * - * @return mixed - */ - protected function get_meta_data_result( $post_ids ) { - global $wpdb; - - $meta_data = $wpdb->get_results( - " - SELECT * - FROM {$wpdb->postmeta} - WHERE post_id IN({$post_ids}) && meta_key = '" . WPSEO_Meta::$meta_prefix . $this->target_db_field . "' - " - ); - - return $meta_data; - } - - /** - * Setting $this->meta_data. - * - * @param array $meta_data Meta data set. - */ - protected function parse_meta_data( $meta_data ) { - - foreach ( $meta_data as $row ) { - $this->meta_data[ $row->post_id ][ $row->meta_key ] = $row->meta_value; - } - - } - - /** - * This method will merge general array with given parameter $columns. - * - * @param array $columns Optional columns set. - * - * @return array - */ - protected function merge_columns( $columns = array() ) { - $columns = array_merge( - array( - 'col_page_title' => __( 'WP Page Title', 'wordpress-seo' ), - 'col_post_type' => __( 'Post Type', 'wordpress-seo' ), - 'col_post_status' => __( 'Post Status', 'wordpress-seo' ), - 'col_post_date' => __( 'Publication date', 'wordpress-seo' ), - 'col_page_slug' => __( 'Page URL/Slug', 'wordpress-seo' ), - ), - $columns - ); - - $columns['col_row_action'] = __( 'Action', 'wordpress-seo' ); - - return $columns; - } -} /* End of class */ diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-title-editor-list-table.php b/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-title-editor-list-table.php deleted file mode 100644 index 2c122273..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-bulk-title-editor-list-table.php +++ /dev/null @@ -1,86 +0,0 @@ - 'wpseo_bulk_title', - 'plural' => 'wpseo_bulk_titles', - 'ajax' => true, - ); - - /** - * The field in the database where meta field is saved. - * - * @var string - */ - protected $target_db_field = 'title'; - - /** - * The columns shown on the table - * - * @return array - */ - public function get_columns() { - - $columns = array( - /* translators: %1$s expands to Yoast SEO */ - 'col_existing_yoast_seo_title' => sprintf( __( 'Existing %1$s Title', 'wordpress-seo' ), 'Yoast SEO' ), - /* translators: %1$s expands to Yoast SEO */ - 'col_new_yoast_seo_title' => sprintf( __( 'New %1$s Title', 'wordpress-seo' ), 'Yoast SEO' ), - ); - - return $this->merge_columns( $columns ); - } - - /** - * Parse the title columns - * - * @param string $column_name Column name. - * @param object $record Data object. - * @param string $attributes HTML attributes. - * - * @return string - */ - protected function parse_page_specific_column( $column_name, $record, $attributes ) { - - // Fill meta data if exists in $this->meta_data. - $meta_data = ( ! empty( $this->meta_data[ $record->ID ] ) ) ? $this->meta_data[ $record->ID ] : array(); - - switch ( $column_name ) { - case 'col_existing_yoast_seo_title': - // TODO inconsistent echo/return behavior R. - echo $this->parse_meta_data_field( $record->ID, $attributes ); - break; - - case 'col_new_yoast_seo_title': - return sprintf( - '', - 'wpseo-new-title-' . $record->ID, - $record->ID - ); - break; - } - - unset( $meta_data ); - } -} /* End of class */ diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-config.php b/wp/wp-content/plugins/wordpress-seo/admin/class-config.php deleted file mode 100644 index 54ffacb1..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-config.php +++ /dev/null @@ -1,439 +0,0 @@ -asset_manager = new WPSEO_Admin_Asset_Manager(); - } - - /** - * Make sure the needed scripts are loaded for admin pages - */ - function init() { - if ( filter_input( INPUT_GET, 'wpseo_reset_defaults' ) && wp_verify_nonce( filter_input( INPUT_GET, 'nonce' ), 'wpseo_reset_defaults' ) && current_user_can( 'manage_options' ) ) { - WPSEO_Options::reset(); - wp_redirect( admin_url( 'admin.php?page=' . WPSEO_Admin::PAGE_IDENTIFIER ) ); - } - - if ( WPSEO_Utils::grant_access() ) { - add_action( 'admin_init', array( $this, 'admin_init' ) ); - add_action( 'admin_enqueue_scripts', array( $this, 'config_page_scripts' ) ); - add_action( 'admin_enqueue_scripts', array( $this, 'config_page_styles' ) ); - } - } - - /** - * Run admin-specific actions. - */ - public function admin_init() { - - $page = filter_input( INPUT_GET, 'page' ); - $tool = filter_input( INPUT_GET, 'tool' ); - $export_nonce = filter_input( INPUT_POST, WPSEO_Export::NONCE_NAME ); - - if ( 'wpseo_tools' === $page && 'import-export' === $tool && $export_nonce !== null ) { - $this->do_yoast_export(); - } - } - - /** - * Loads the required styles for the config page. - */ - function config_page_styles() { - wp_enqueue_style( 'dashboard' ); - wp_enqueue_style( 'thickbox' ); - wp_enqueue_style( 'global' ); - wp_enqueue_style( 'wp-admin' ); - $this->asset_manager->enqueue_style( 'select2' ); - - $this->asset_manager->enqueue_style( 'admin-css' ); - - $this->asset_manager->enqueue_style( 'kb-search' ); - } - - /** - * Loads the required scripts for the config page. - */ - function config_page_scripts() { - $this->asset_manager->enqueue_script( 'admin-script' ); - - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'admin-script', 'wpseoAdminL10n', WPSEO_Help_Center::get_translated_texts() ); - - wp_enqueue_script( 'dashboard' ); - wp_enqueue_script( 'thickbox' ); - - $page = filter_input( INPUT_GET, 'page' ); - - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'admin-script', 'wpseoSelect2Locale', WPSEO_Utils::get_language( WPSEO_Utils::get_user_locale() ) ); - - if ( in_array( $page, array( 'wpseo_social', WPSEO_Admin::PAGE_IDENTIFIER ) ) ) { - wp_enqueue_media(); - - $this->asset_manager->enqueue_script( 'admin-media' ); - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'admin-media', 'wpseoMediaL10n', $this->localize_media_script() ); - } - - if ( 'wpseo_tools' === $page ) { - $this->enqueue_tools_scripts(); - } - } - - /** - * Pass some variables to js for upload module. - * - * @return array - */ - public function localize_media_script() { - return array( - 'choose_image' => __( 'Use Image', 'wordpress-seo' ), - ); - } - - /** - * Enqueues and handles all the tool dependencies. - */ - private function enqueue_tools_scripts() { - $tool = filter_input( INPUT_GET, 'tool' ); - - if ( empty( $tool ) ) { - $this->asset_manager->enqueue_script( 'yoast-seo' ); - } - - if ( 'bulk-editor' === $tool ) { - $this->asset_manager->enqueue_script( 'bulk-editor' ); - } - } - - /** - * Runs the yoast exporter class to possibly init the file download. - */ - private function do_yoast_export() { - check_admin_referer( WPSEO_Export::NONCE_ACTION, WPSEO_Export::NONCE_NAME ); - - if ( ! current_user_can( 'manage_options' ) ) { - return; - } - - $wpseo_post = filter_input( INPUT_POST, 'wpseo' ); - $include_taxonomy = ! empty( $wpseo_post['include_taxonomy'] ); - $export = new WPSEO_Export( $include_taxonomy ); - - if ( $export->has_error() ) { - add_action( 'admin_notices', array( $export, 'set_error_hook' ) ); - - } - } - - /********************** DEPRECATED METHODS **********************/ - - // @codeCoverageIgnoreStart - /** - * Exports the current site's Yoast SEO settings. - * - * @deprecated 2.0 - * - * @param bool $include_taxonomy Whether to include the taxonomy metadata the plugin creates. - * - * @return bool|string $return False when failed, the URL to the export file when succeeded. - */ - public function export_settings( $include_taxonomy ) { - _deprecated_function( __METHOD__, 'WPSEO 2.0', 'This method is deprecated, please use the WPSEO_Export class.' ); - - $export = new WPSEO_Export( $include_taxonomy ); - if ( $export->success ) { - return $export->export_zip_url; - } - - return false; - } - - /** - * Generates the header for admin pages - * - * @deprecated 2.0 - * - * @param bool $form Whether or not the form start tag should be included. - * @param mixed $option_long_name The long name of the option to use for the current page. - * @param string $option The short name of the option to use for the current page. - * @param bool $contains_files Whether the form should allow for file uploads. - */ - public function admin_header( $form = true, $option_long_name = false, $option = 'wpseo', $contains_files = false ) { - _deprecated_function( __METHOD__, 'WPSEO 2.0', 'This method is deprecated, please use the Yoast_Form class.' ); - - Yoast_Form::get_instance()->admin_header( $form, $option, $contains_files, $option_long_name ); - } - - /** - * Generates the footer for admin pages - * - * @deprecated 2.0 - * - * @param bool $submit Whether or not a submit button and form end tag should be shown. - * @param bool $show_sidebar Whether or not to show the banner sidebar - used by premium plugins to disable it. - */ - public function admin_footer( $submit = true, $show_sidebar = true ) { - _deprecated_function( __METHOD__, 'WPSEO 2.0', 'This method is deprecated, please use the Yoast_Form class.' ); - - Yoast_Form::get_instance()->admin_footer( $submit, $show_sidebar ); - } - - /** - * Generates the sidebar for admin pages. - * - * @deprecated 2.0 - */ - public function admin_sidebar() { - _deprecated_function( __METHOD__, 'WPSEO 2.0', 'This method is deprecated, please use the Yoast_Form class.' ); - - Yoast_Form::get_instance()->admin_sidebar(); - } - - /** - * Create a Checkbox input field. - * - * @deprecated 2.0 - * - * @param string $var The variable within the option to create the checkbox for. - * @param string $label The label to show for the variable. - * @param bool $label_left Whether the label should be left (true) or right (false). - * @param string $option The option the variable belongs to. - */ - public function checkbox( $var, $label, $label_left = false, $option = '' ) { - _deprecated_function( __METHOD__, 'WPSEO 2.0', 'This method is deprecated, please use the Yoast_Form class.' ); - - if ( $option !== '' ) { - Yoast_Form::get_instance()->set_option( $option ); - } - - Yoast_Form::get_instance()->checkbox( $var, $label, $label_left ); - } - - /** - * Create a Text input field. - * - * @deprecated 2.0 - * - * @param string $var The variable within the option to create the text input field for. - * @param string $label The label to show for the variable. - * @param string $option The option the variable belongs to. - */ - function textinput( $var, $label, $option = '' ) { - _deprecated_function( __METHOD__, 'WPSEO 2.0', 'This method is deprecated, please use the Yoast_Form class.' ); - - if ( $option !== '' ) { - Yoast_Form::get_instance()->set_option( $option ); - } - Yoast_Form::get_instance()->textinput( $var, $label ); - } - - /** - * Create a textarea. - * - * @deprecated 2.0 - * - * @param string $var The variable within the option to create the textarea for. - * @param string $label The label to show for the variable. - * @param string $option The option the variable belongs to. - * @param array $attr The CSS class to assign to the textarea. - */ - function textarea( $var, $label, $option = '', $attr = array() ) { - _deprecated_function( __METHOD__, 'WPSEO 2.0', 'This method is deprecated, please use the Yoast_Form class.' ); - - if ( $option !== '' ) { - Yoast_Form::get_instance()->set_option( $option ); - } - - Yoast_Form::get_instance()->textarea( $var, $label, $attr ); - } - - /** - * Create a hidden input field. - * - * @deprecated 2.0 - * - * @param string $var The variable within the option to create the hidden input for. - * @param string $option The option the variable belongs to. - */ - function hidden( $var, $option = '' ) { - _deprecated_function( __METHOD__, 'WPSEO 2.0', 'This method is deprecated, please use the Yoast_Form class.' ); - - if ( $option !== '' ) { - Yoast_Form::get_instance()->set_option( $option ); - } - - Yoast_Form::get_instance()->hidden( $var ); - } - - /** - * Create a Select Box. - * - * @deprecated 2.0 - * - * @param string $var The variable within the option to create the select for. - * @param string $label The label to show for the variable. - * @param array $values The select options to choose from. - * @param string $option The option the variable belongs to. - */ - function select( $var, $label, $values, $option = '' ) { - _deprecated_function( __METHOD__, 'WPSEO 2.0', 'This method is deprecated, please use the Yoast_Form class.' ); - - if ( $option !== '' ) { - Yoast_Form::get_instance()->set_option( $option ); - } - - Yoast_Form::get_instance()->select( $var, $label, $values ); - } - - /** - * Create a File upload field. - * - * @deprecated 2.0 - * - * @param string $var The variable within the option to create the file upload field for. - * @param string $label The label to show for the variable. - * @param string $option The option the variable belongs to. - */ - function file_upload( $var, $label, $option = '' ) { - _deprecated_function( __METHOD__, 'WPSEO 2.0', 'This method is deprecated, please use the Yoast_Form class.' ); - - if ( $option !== '' ) { - Yoast_Form::get_instance()->set_option( $option ); - } - - Yoast_Form::get_instance()->file_upload( $var, $label ); - } - - /** - * Media input - * - * @deprecated 2.0 - * - * @param string $var Option name. - * @param string $label Label message. - * @param string $option Optional option key. - */ - function media_input( $var, $label, $option = '' ) { - _deprecated_function( __METHOD__, 'WPSEO 2.0', 'This method is deprecated, please use the Yoast_Form class.' ); - - if ( $option !== '' ) { - Yoast_Form::get_instance()->set_option( $option ); - } - - Yoast_Form::get_instance()->media_input( $var, $label ); - } - - /** - * Create a Radio input field. - * - * @deprecated 2.0 - * - * @param string $var The variable within the option to create the file upload field for. - * @param array $values The radio options to choose from. - * @param string $label The label to show for the variable. - * @param string $option The option the variable belongs to. - */ - function radio( $var, $values, $label, $option = '' ) { - _deprecated_function( __METHOD__, 'WPSEO 2.0', 'This method is deprecated, please use the Yoast_Form class.' ); - - if ( $option !== '' ) { - Yoast_Form::get_instance()->set_option( $option ); - } - - Yoast_Form::get_instance()->radio( $var, $values, $label ); - } - - /** - * Create a postbox widget. - * - * @deprecated 2.0 - * - * @param string $id ID of the postbox. - * @param string $title Title of the postbox. - * @param string $content Content of the postbox. - */ - function postbox( $id, $title, $content ) { - _deprecated_function( __METHOD__, 'WPSEO 2.0', 'This method is deprecated, please re-implement the admin pages.' ); - - ?> -
    -

    - -
    - '; - foreach ( $rows as $row ) { - $content .= ''; - if ( isset( $row['id'] ) && $row['id'] != '' ) { - $content .= ''; - } - else { - $content .= esc_html( $row['label'] ); - } - if ( isset( $row['desc'] ) && $row['desc'] != '' ) { - $content .= '
    ' . esc_html( $row['desc'] ) . ''; - } - $content .= ''; - $content .= $row['content']; - $content .= ''; - } - $content .= ''; - - return $content; - } - - /** - * Resets the site to the default Yoast SEO settings and runs a title test to check - * whether force rewrite needs to be on. - * - * @deprecated 1.5.0 - * @deprecated use WPSEO_Options::reset() - * @see WPSEO_Options::reset() - */ - function reset_defaults() { - _deprecated_function( __METHOD__, 'WPSEO 1.5.0', 'WPSEO_Options::reset()' ); - WPSEO_Options::reset(); - } - // @codeCoverageIgnoreEnd -} /* End of class */ diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-cornerstone-field.php b/wp/wp-content/plugins/wordpress-seo/admin/class-cornerstone-field.php deleted file mode 100644 index 68f0294c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-cornerstone-field.php +++ /dev/null @@ -1,49 +0,0 @@ -', - WPSEO_Cornerstone::META_NAME, - checked( $this->get_meta_value( $post->ID ), '1', false ) - ); - - $return .= sprintf( ''; - - return $return; - } - - /** - * Gets the meta value from the database. - * - * @param int $post_id The post id to get the meta value for. - * - * @return null|string The meta value from the database. - */ - protected function get_meta_value( $post_id ) { - return get_post_meta( $post_id, WPSEO_Cornerstone::META_NAME, true ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-cornerstone-filter.php b/wp/wp-content/plugins/wordpress-seo/admin/class-cornerstone-filter.php deleted file mode 100644 index bc0038b0..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-cornerstone-filter.php +++ /dev/null @@ -1,130 +0,0 @@ -get_post_types() as $post_type ) { - add_filter( 'views_edit-' . $post_type, array( $this, 'add_filter_link' ) ); - } - - add_filter( 'posts_where', array( $this, 'filter_posts' ) ); - } - - /** - * Adds a filter link to the views. - * - * @param array $views Array with the views. - * - * @return array - */ - public function add_filter_link( array $views ) { - - $cornerstone_url = $this->get_cornerstone_url(); - - $views['yoast_cornerstone'] = sprintf( - '%3$s (%4$s)', - esc_url( $cornerstone_url ), - ( $this->is_cornerstone_filter_active() ) ? 'current' : '', - __( 'Cornerstone articles', 'wordpress-seo' ), - $this->get_cornerstone_total() - ); - - return $views; - } - - /** - * Modify the query based on the seo_filter variable in $_GET - * - * @param array $where Query variables. - * - * @return array - */ - public function filter_posts( $where ) { - if ( $this->is_cornerstone_filter_active() ) { - global $wpdb; - - $where .= sprintf( - ' AND ID IN( SELECT post_id FROM ' . $wpdb->postmeta . ' WHERE meta_key = "%s" AND meta_value = "1" ) ', - WPSEO_Cornerstone::META_NAME - ); - } - - return $where; - } - - /** - * Removes the post_type from the REQUEST URL because of the cornerstone filter is in the same line. - * After removing the post_type it will add a query arg for filtering the cornerstone content. - * - * @return string - */ - protected function get_cornerstone_url() { - $cornerstone_url = remove_query_arg( array( 'post_status' ) ); - $cornerstone_url = add_query_arg( self::FILTER_QUERY_ARG, '1', $cornerstone_url ); - - return $cornerstone_url; - } - - /** - * Returns the total amount of articles marked as cornerstone content. - * - * @return integer - */ - protected function get_cornerstone_total() { - global $wpdb; - - return (int) $wpdb->get_var( - $wpdb->prepare( ' - SELECT COUNT( 1 ) - FROM ' . $wpdb->postmeta . ' - WHERE post_id IN( SELECT ID FROM ' . $wpdb->posts . ' WHERE post_type = "%s" ) && - meta_value = "1" AND meta_key = "%s" - ', - $this->get_current_post_type(), - WPSEO_Cornerstone::META_NAME - ) - ); - } - - /** - * Returns true when the cornerstone filter is active. - * - * @return bool - */ - protected function is_cornerstone_filter_active() { - return ( filter_input( INPUT_GET, self::FILTER_QUERY_ARG ) === '1' ); - } - - /** - * Returns the current post type. - * - * @return string - */ - protected function get_current_post_type() { - return filter_input( - INPUT_GET, 'post_type', FILTER_DEFAULT, array( - 'options' => array( 'default' => 'post' ), - ) - ); - } - - /** - * Returns the post types which can be used to set as cornerstone content. - * - * @return array - */ - protected function get_post_types() { - return array( 'post', 'page' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-cornerstone.php b/wp/wp-content/plugins/wordpress-seo/admin/class-cornerstone.php deleted file mode 100644 index b9d0a3c8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-cornerstone.php +++ /dev/null @@ -1,30 +0,0 @@ -wp_customize = $wp_customize; - - $this->breadcrumbs_section(); - $this->breadcrumbs_blog_remove_setting(); - $this->breadcrumbs_separator_setting(); - $this->breadcrumbs_home_setting(); - $this->breadcrumbs_prefix_setting(); - $this->breadcrumbs_archiveprefix_setting(); - $this->breadcrumbs_searchprefix_setting(); - $this->breadcrumbs_404_setting(); - } - - /** - * Add the breadcrumbs section to the customizer - */ - private function breadcrumbs_section() { - $this->wp_customize->add_section( - 'wpseo_breadcrumbs_customizer_section', array( - /* translators: %s is the name of the plugin */ - 'title' => sprintf( __( '%s Breadcrumbs', 'wordpress-seo' ), 'Yoast SEO' ), - 'priority' => 999, - 'active_callback' => array( $this, 'breadcrumbs_active_callback' ), - ) - ); - - } - - /** - * Returns whether or not the breadcrumbs are active - * - * @return bool - */ - public function breadcrumbs_active_callback() { - $options = WPSEO_Options::get_option( 'wpseo_internallinks' ); - - return true === ( current_theme_supports( 'yoast-seo-breadcrumbs' ) || $options['breadcrumbs-enable'] ); - } - - /** - * Adds the breadcrumbs remove blog checkbox - */ - private function breadcrumbs_blog_remove_setting() { - $this->wp_customize->add_setting( - 'wpseo_internallinks[breadcrumbs-blog-remove]', array( - 'default' => '', - 'type' => 'option', - 'transport' => 'refresh', - ) - ); - - $this->wp_customize->add_control( - new WP_Customize_Control( - $this->wp_customize, 'wpseo-breadcrumbs-blog-remove', array( - 'label' => __( 'Remove blog page from breadcrumbs', 'wordpress-seo' ), - 'type' => 'checkbox', - 'section' => 'wpseo_breadcrumbs_customizer_section', - 'settings' => 'wpseo_internallinks[breadcrumbs-blog-remove]', - 'context' => '', - 'active_callback' => array( $this, 'breadcrumbs_blog_remove_active_cb' ), - ) - ) - ); - } - - /** - * Returns whether or not to show the breadcrumbs blog remove option - * - * @return bool - */ - public function breadcrumbs_blog_remove_active_cb() { - return 'page' === get_option( 'show_on_front' ); - } - - /** - * Adds the breadcrumbs separator text field - */ - private function breadcrumbs_separator_setting() { - $this->wp_customize->add_setting( - 'wpseo_internallinks[breadcrumbs-sep]', array( - 'default' => '', - 'type' => 'option', - 'transport' => 'refresh', - ) - ); - - $this->wp_customize->add_control( - new WP_Customize_Control( - $this->wp_customize, 'wpseo-breadcrumbs-separator', array( - 'label' => __( 'Breadcrumbs separator:', 'wordpress-seo' ), - 'type' => 'text', - 'section' => 'wpseo_breadcrumbs_customizer_section', - 'settings' => 'wpseo_internallinks[breadcrumbs-sep]', - 'context' => '', - ) - ) - ); - } - - /** - * Adds the breadcrumbs home anchor text field - */ - private function breadcrumbs_home_setting() { - $this->wp_customize->add_setting( - 'wpseo_internallinks[breadcrumbs-home]', array( - 'default' => '', - 'type' => 'option', - 'transport' => 'refresh', - ) - ); - - $this->wp_customize->add_control( - new WP_Customize_Control( - $this->wp_customize, 'wpseo-breadcrumbs-home', array( - 'label' => __( 'Anchor text for the homepage:', 'wordpress-seo' ), - 'type' => 'text', - 'section' => 'wpseo_breadcrumbs_customizer_section', - 'settings' => 'wpseo_internallinks[breadcrumbs-home]', - 'context' => '', - ) - ) - ); - } - - /** - * Adds the breadcrumbs prefix text field - */ - private function breadcrumbs_prefix_setting() { - $this->wp_customize->add_setting( - 'wpseo_internallinks[breadcrumbs-prefix]', array( - 'default' => '', - 'type' => 'option', - 'transport' => 'refresh', - ) - ); - - $this->wp_customize->add_control( - new WP_Customize_Control( - $this->wp_customize, 'wpseo-breadcrumbs-prefix', array( - 'label' => __( 'Prefix for breadcrumbs:', 'wordpress-seo' ), - 'type' => 'text', - 'section' => 'wpseo_breadcrumbs_customizer_section', - 'settings' => 'wpseo_internallinks[breadcrumbs-prefix]', - 'context' => '', - ) - ) - ); - } - - /** - * Adds the breadcrumbs archive prefix text field - */ - private function breadcrumbs_archiveprefix_setting() { - $this->wp_customize->add_setting( - 'wpseo_internallinks[breadcrumbs-archiveprefix]', array( - 'default' => '', - 'type' => 'option', - 'transport' => 'refresh', - ) - ); - - $this->wp_customize->add_control( - new WP_Customize_Control( - $this->wp_customize, 'wpseo-breadcrumbs-archiveprefix', array( - 'label' => __( 'Prefix for archive pages:', 'wordpress-seo' ), - 'type' => 'text', - 'section' => 'wpseo_breadcrumbs_customizer_section', - 'settings' => 'wpseo_internallinks[breadcrumbs-archiveprefix]', - 'context' => '', - ) - ) - ); - } - - /** - * Adds the breadcrumbs search prefix text field - */ - private function breadcrumbs_searchprefix_setting() { - $this->wp_customize->add_setting( - 'wpseo_internallinks[breadcrumbs-searchprefix]', array( - 'default' => '', - 'type' => 'option', - 'transport' => 'refresh', - ) - ); - - $this->wp_customize->add_control( - new WP_Customize_Control( - $this->wp_customize, 'wpseo-breadcrumbs-searchprefix', array( - 'label' => __( 'Prefix for search result pages:', 'wordpress-seo' ), - 'type' => 'text', - 'section' => 'wpseo_breadcrumbs_customizer_section', - 'settings' => 'wpseo_internallinks[breadcrumbs-searchprefix]', - 'context' => '', - ) - ) - ); - } - - /** - * Adds the breadcrumb 404 prefix text field - */ - private function breadcrumbs_404_setting() { - $this->wp_customize->add_setting( - 'wpseo_internallinks[breadcrumbs-404crumb]', array( - 'default' => '', - 'type' => 'option', - 'transport' => 'refresh', - ) - ); - - $this->wp_customize->add_control( - new WP_Customize_Control( - $this->wp_customize, 'wpseo-breadcrumbs-404crumb', array( - 'label' => __( 'Breadcrumb for 404 pages:', 'wordpress-seo' ), - 'type' => 'text', - 'section' => 'wpseo_breadcrumbs_customizer_section', - 'settings' => 'wpseo_internallinks[breadcrumbs-404crumb]', - 'context' => '', - ) - ) - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-export.php b/wp/wp-content/plugins/wordpress-seo/admin/class-export.php deleted file mode 100644 index 3acb229c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-export.php +++ /dev/null @@ -1,277 +0,0 @@ -include_taxonomy = $include_taxonomy; - $this->dir = wp_upload_dir(); - - $this->export_settings(); - } - - /** - * Returns true when the property error has a value. - * - * @return bool - */ - public function has_error() { - return ( $this->error !== '' ); - } - - /** - * Sets the error hook, to display the error to the user. - */ - public function set_error_hook() { - $class = 'notice notice-error'; - $message = sprintf( __( 'Error creating %1$s export: ', 'wordpress-seo' ), 'Yoast SEO' ) . $this->error; - - printf( '

    %2$s

    ', $class, $message ); - } - - /** - * Exports the current site's WP SEO settings. - */ - private function export_settings() { - - $this->export_header(); - - foreach ( WPSEO_Options::get_option_names() as $opt_group ) { - $this->write_opt_group( $opt_group ); - } - - $this->taxonomy_metadata(); - - if ( ! $this->write_settings_file() ) { - $this->error = __( 'Could not write settings to file.', 'wordpress-seo' ); - - return; - } - - if ( $this->zip_file() ) { - // Just exit, because there is a download being served. - exit; - } - } - - /** - * Writes the header of the export file. - */ - private function export_header() { - /* translators: %1$s expands to Yoast SEO */ - $this->write_line( '; ' . sprintf( __( 'This is a settings export file for the %1$s plugin by Yoast.com', 'wordpress-seo' ), 'Yoast SEO' ) . ' - https://yoast.com/wordpress/plugins/seo/' ); - if ( $this->include_taxonomy ) { - $this->write_line( '; ' . __( 'This export includes taxonomy metadata', 'wordpress-seo' ) ); - } - } - - /** - * Writes a line to the export - * - * @param string $line Line string. - * @param boolean $newline_first Boolean flag whether to prepend with new line. - */ - private function write_line( $line, $newline_first = false ) { - if ( $newline_first ) { - $this->export .= PHP_EOL; - } - $this->export .= $line . PHP_EOL; - } - - /** - * Writes an entire option group to the export - * - * @param string $opt_group Option group name. - */ - private function write_opt_group( $opt_group ) { - - $this->write_line( '[' . $opt_group . ']', true ); - - $options = get_option( $opt_group ); - - if ( ! is_array( $options ) ) { - return; - } - - foreach ( $options as $key => $elem ) { - if ( is_array( $elem ) ) { - $count = count( $elem ); - for ( $i = 0; $i < $count; $i ++ ) { - $this->write_setting( $key . '[]', $elem[ $i ] ); - } - } - else { - $this->write_setting( $key, $elem ); - } - } - } - - /** - * Writes a settings line to the export - * - * @param string $key Key string. - * @param string $val Value string. - */ - private function write_setting( $key, $val ) { - if ( is_string( $val ) ) { - $val = '"' . $val . '"'; - } - $this->write_line( $key . ' = ' . $val ); - } - - /** - * Adds the taxonomy meta data if there is any - */ - private function taxonomy_metadata() { - if ( $this->include_taxonomy ) { - $taxonomy_meta = get_option( 'wpseo_taxonomy_meta' ); - if ( is_array( $taxonomy_meta ) ) { - $this->write_line( '[wpseo_taxonomy_meta]', true ); - $this->write_setting( 'wpseo_taxonomy_meta', urlencode( wp_json_encode( $taxonomy_meta ) ) ); - } - else { - $this->write_line( '; ' . __( 'No taxonomy metadata found', 'wordpress-seo' ), true ); - } - } - } - - /** - * Writes the settings to our temporary settings.ini file - * - * @return boolean unsigned - */ - private function write_settings_file() { - $handle = fopen( $this->dir['path'] . '/' . self::INI_FILENAME, 'w' ); - if ( ! $handle ) { - return false; - } - - $res = fwrite( $handle, $this->export ); - if ( ! $res ) { - return false; - } - - fclose( $handle ); - - return true; - } - - /** - * Zips the settings ini file - * - * @return bool|null - */ - private function zip_file() { - $is_zip_created = $this->create_zip(); - - // The settings.ini isn't needed, because it's in the zipfile. - $this->remove_settings_ini(); - - if ( ! $is_zip_created ) { - $this->error = __( 'Could not zip settings-file.', 'wordpress-seo' ); - - return false; - } - - $this->serve_settings_export(); - $this->remove_zip(); - - return true; - } - - /** - * Creates the zipfile and returns true if it created successful. - * - * @return bool - */ - private function create_zip() { - chdir( $this->dir['path'] ); - $zip = new PclZip( './' . self::ZIP_FILENAME ); - if ( 0 === $zip->create( './' . self::INI_FILENAME ) ) { - return false; - } - - return file_exists( self::ZIP_FILENAME ); - } - - /** - * Downloads the zip file. - */ - private function serve_settings_export() { - // Clean any content that has been already output. For example by other plugins or faulty PHP files. - if ( ob_get_contents() ) { - ob_clean(); - } - header( 'Content-Type: application/octet-stream; charset=utf-8' ); - header( 'Content-Transfer-Encoding: Binary' ); - header( 'Content-Disposition: attachment; filename=' . self::ZIP_FILENAME ); - header( 'Content-Length: ' . filesize( self::ZIP_FILENAME ) ); - - readfile( self::ZIP_FILENAME ); - } - - /** - * Removes the settings ini file. - */ - private function remove_settings_ini() { - unlink( './' . self::INI_FILENAME ); - } - - /** - * Removes the files because they are already downloaded. - */ - private function remove_zip() { - unlink( './' . self::ZIP_FILENAME ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-help-center-item.php b/wp/wp-content/plugins/wordpress-seo/admin/class-help-center-item.php deleted file mode 100644 index cc3449c5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-help-center-item.php +++ /dev/null @@ -1,94 +0,0 @@ -identifier = $identifier; - $this->label = $label; - $this->dashicon = $dashicon; - $this->args = $args; - } - - /** - * Get the label. - * - * @return string - */ - public function get_label() { - return $this->label; - } - - /** - * Get the identifier. - * - * @return string - */ - public function get_identifier() { - return $this->identifier; - } - - /** - * Get the dashicon. - * - * @return string - */ - public function get_dashicon() { - return $this->dashicon; - } - - /** - * Get the content of this tab. - * - * @return mixed|string - */ - public function get_content() { - if ( ! empty( $this->args['content'] ) ) { - return $this->args['content']; - } - - if ( ! empty( $this->args['callback'] ) ) { - return call_user_func_array( $this->args['callback'], array( $this ) ); - } - - if ( ! empty( $this->args['view'] ) ) { - $view = $this->args['view']; - if ( substr( $view, - 4 ) === '.php' ) { - $view = substr( $view, 0, - 4 ); - } - - if ( ! empty( $this->args['view_arguments'] ) ) { - extract( $this->args['view_arguments'] ); - } - - include WPSEO_PATH . 'admin/views/' . $view . '.php'; - } - - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-help-center.php b/wp/wp-content/plugins/wordpress-seo/admin/class-help-center.php deleted file mode 100644 index d4df4aba..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-help-center.php +++ /dev/null @@ -1,231 +0,0 @@ -group_name = $group_name; - $this->tab = $tab; - - $this->add_video_tutorial_item(); - $this->add_kb_search_item(); - $this->add_contact_support_item(); - } - - /** - * Add the knowledge base search help center item to the help center. - */ - private function add_kb_search_item() { - $kb_help_center_item = new WPSEO_Help_Center_Item( - 'knowledge-base', - __( 'Knowledge base', 'wordpress-seo' ), - array( - 'content' => '', - 'view_arguments' => array( 'identifier' => $this->tab->get_name() ), - ), - 'dashicons-search' - ); - array_push( $this->help_center_items, $kb_help_center_item ); - } - - /** - * Add the contact support help center item to the help center. - */ - private function add_contact_support_item() { - /* translators: %s: expands to 'Yoast SEO Premium'. */ - $popup_title = sprintf( __( 'Email support is a %s feature', 'wordpress-seo' ), 'Yoast SEO Premium' ); - - $popup_content = '

    ' . __( 'Go Premium and our experts will be there for you to answer any questions you might have about the set-up and use of the plug-in!', 'wordpress-seo' ) . '

    '; - /* translators: %1$s: expands to 'Yoast SEO Premium'. */ - $popup_content .= '

    ' . sprintf( __( 'Other benefits of %1$s for you:', 'wordpress-seo' ), 'Yoast SEO Premium' ) . '

    '; - $popup_content .= '
      '; - $popup_content .= '
    • ' . sprintf( - // We don't use strong text here, but we do use it in the "Add keyword" popup, this is just to have the same translatable strings. - /* translators: %1$s expands to a 'strong' start tag, %2$s to a 'strong' end tag. */ - __( '%1$sNo more dead links%2$s: easy redirect manager', 'wordpress-seo' ), '', '' - ) . '
    • '; - $popup_content .= '
    • ' . __( 'Superfast internal links suggestions', 'wordpress-seo' ) . '
    • '; - $popup_content .= '
    • ' . sprintf( - // We don't use strong text here, but we do use it in the "Add keyword" popup, this is just to have the same translatable strings. - /* translators: %1$s expands to a 'strong' start tag, %2$s to a 'strong' end tag. */ - __( '%1$sSocial media preview%2$s: Facebook & Twitter', 'wordpress-seo' ), '', '' - ) . '
    • '; - $popup_content .= '
    • ' . __( '24/7 support', 'wordpress-seo' ) . '
    • '; - $popup_content .= '
    • ' . __( 'No ads!', 'wordpress-seo' ) . '
    • '; - $popup_content .= '
    '; - - $premium_popup = new WPSEO_Premium_Popup( 'contact-support', 'h2', $popup_title, $popup_content ); - $contact_support_help_center_item = new WPSEO_Help_Center_Item( - 'contact-support', - __( 'Email support', 'wordpress-seo' ), - array( 'content' => $premium_popup->get_premium_message( false ) ), - 'dashicons-email-alt' - ); - - array_push( $this->help_center_items, $contact_support_help_center_item ); - } - - /** - * Add the video tutorial help center item to the help center. - */ - private function add_video_tutorial_item() { - array_push( $this->help_center_items, $this->get_video_help_center_item() ); - } - - /** - * @return mixed (WPSEO_Help_Center_Item | null) Returns a help center item containing a video. - */ - private function get_video_help_center_item() { - $url = $this->tab->get_video_url(); - if ( empty( $url ) ) { - return null; - } - - return new WPSEO_Help_Center_Item( - 'video', - __( 'Video tutorial', 'wordpress-seo' ), - array( - 'view' => 'partial-help-center-video', - 'view_arguments' => array( - 'tab_video_url' => $url, - ), - ), - 'dashicons-video-alt3' - ); - } - - /** - * Outputs the help center. - */ - public function output_help_center() { - $help_center_items = apply_filters( 'wpseo_help_center_items', $this->help_center_items ); - $help_center_items = array_filter( $help_center_items, array( $this, 'is_a_help_center_item' ) ); - if ( empty( $help_center_items ) ) { - return; - } - - $id = sprintf( 'tab-help-center-%s-%s', $this->group_name, $this->tab->get_name() ); - ?> -
    - - -
    - %s and replaced again in the javascript with the actual variable. - * - * @return array Translated text strings for the help center. - */ - public static function get_translated_texts() { - return array( - /* translators: %s: '%%term_title%%' variable used in titles and meta's template that's not compatible with the given template */ - 'variable_warning' => sprintf( __( 'Warning: the variable %s cannot be used in this template. See the help center for more info.', 'wordpress-seo' ), '%s' ), - 'contentLocale' => get_locale(), - 'userLocale' => WPSEO_Utils::get_user_locale(), - /* translators: %d: number of knowledge base search results found. */ - 'kb_found_results' => __( 'Number of search results: %d', 'wordpress-seo' ), - 'kb_no_results' => __( 'No results found.', 'wordpress-seo' ), - 'kb_heading' => __( 'Search the Yoast knowledge base', 'wordpress-seo' ), - 'kb_search_button_text' => __( 'Search', 'wordpress-seo' ), - 'kb_search_results_heading' => __( 'Search results', 'wordpress-seo' ), - 'kb_error_message' => __( 'Something went wrong. Please try again later.', 'wordpress-seo' ), - 'kb_loading_placeholder' => __( 'Loading...', 'wordpress-seo' ), - 'kb_search' => __( 'search', 'wordpress-seo' ), - 'kb_back' => __( 'Back', 'wordpress-seo' ), - 'kb_back_label' => __( 'Back to search results' , 'wordpress-seo' ), - 'kb_open' => __( 'Open', 'wordpress-seo' ), - 'kb_open_label' => __( 'Open the knowledge base article in a new window or read it in the iframe below' , 'wordpress-seo' ), - 'kb_iframe_title' => __( 'Knowledge base article', 'wordpress-seo' ), - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-import-aioseo.php b/wp/wp-content/plugins/wordpress-seo/admin/class-import-aioseo.php deleted file mode 100644 index 189068ac..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-import-aioseo.php +++ /dev/null @@ -1,103 +0,0 @@ -aioseo_options = get_option( 'aioseop_options' ); - - $this->import_metas(); - $this->import_ga(); - } - - /** - * Import All In One SEO meta values - */ - private function import_metas() { - WPSEO_Meta::replace_meta( '_aioseop_description', WPSEO_Meta::$meta_prefix . 'metadesc', $this->replace ); - WPSEO_Meta::replace_meta( '_aioseop_keywords', WPSEO_Meta::$meta_prefix . 'metakeywords', $this->replace ); - WPSEO_Meta::replace_meta( '_aioseop_title', WPSEO_Meta::$meta_prefix . 'title', $this->replace ); - } - - /** - * Import the Google Analytics settings - */ - private function import_ga() { - if ( isset( $this->aioseo_options['aiosp_google_analytics_id'] ) ) { - - if ( get_option( 'yst_ga' ) === false ) { - update_option( 'yst_ga', $this->determine_ga_settings() ); - } - - $plugin_install_nonce = wp_create_nonce( 'install-plugin_google-analytics-for-wordpress' ); // Use the old name because that's the WordPress.org repo. - - $this->set_msg( sprintf( - /* translators: 1,2: link open tag; 3: link close tag. */ - __( 'All in One SEO data successfully imported. Would you like to %1$sdisable the All in One SEO plugin%3$s? You\'ve had Google Analytics enabled in All in One SEO, would you like to install our %2$sGoogle Analytics plugin%3$s?', 'wordpress-seo' ), - '', - '', - '' - ) ); - } - else { - $this->set_msg( sprintf( - /* translators: 1: link open tag; 2: link close tag. */ - __( 'All in One SEO data successfully imported. Would you like to %1$sdisable the All in One SEO plugin%2$s?', 'wordpress-seo' ), - '', - '' - ) ); - } - } - - /** - * Determine the appropriate GA settings for this site - * - * @return array $ga_settings - */ - private function determine_ga_settings() { - $ga_universal = 0; - if ( $this->aioseo_options['aiosp_ga_use_universal_analytics'] == 'on' ) { - $ga_universal = 1; - } - - $ga_track_outbound = 0; - if ( $this->aioseo_options['aiosp_ga_track_outbound_links'] == 'on' ) { - $ga_track_outbound = 1; - } - - $ga_anonymize_ip = 0; - if ( $this->aioseo_options['aiosp_ga_anonymize_ip'] == 'on' ) { - $ga_anonymize_ip = 1; - } - - return array( - 'ga_general' => array( - 'manual_ua_code' => (int) 1, - 'manual_ua_code_field' => $this->aioseo_options['aiosp_google_analytics_id'], - 'enable_universal' => $ga_universal, - 'track_outbound' => $ga_track_outbound, - 'ignore_users' => (array) $this->aioseo_options['aiosp_ga_exclude_users'], - 'anonymize_ips' => (int) $ga_anonymize_ip, - ), - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-import-external.php b/wp/wp-content/plugins/wordpress-seo/admin/class-import-external.php deleted file mode 100644 index cb40a337..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-import-external.php +++ /dev/null @@ -1,108 +0,0 @@ -replace = $replace; - - WPSEO_Options::initialize(); - } - - /** - * Convenience function to set import message - * - * @param string $msg Message string. - */ - protected function set_msg( $msg ) { - if ( ! empty( $this->msg ) ) { - $this->msg .= PHP_EOL; - } - $this->msg .= $msg; - } - - /** - * Deletes an option depending on the class replace state - * - * @param string $option Option key. - */ - protected function perhaps_delete( $option ) { - if ( $this->replace ) { - delete_option( $option ); - } - } - - /** - * Import HeadSpace SEO settings - */ - public function import_headspace() { - global $wpdb; - - WPSEO_Meta::replace_meta( '_headspace_description', WPSEO_Meta::$meta_prefix . 'metadesc', $this->replace ); - WPSEO_Meta::replace_meta( '_headspace_keywords', WPSEO_Meta::$meta_prefix . 'metakeywords', $this->replace ); - WPSEO_Meta::replace_meta( '_headspace_page_title', WPSEO_Meta::$meta_prefix . 'title', $this->replace ); - - /** - * @todo [JRF => whomever] verify how headspace sets these metas ( 'noindex', 'nofollow', 'noarchive', 'noodp', 'noydir' ) - * and if the values saved are concurrent with the ones we use (i.e. 0/1/2) - */ - WPSEO_Meta::replace_meta( '_headspace_noindex', WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', $this->replace ); - WPSEO_Meta::replace_meta( '_headspace_nofollow', WPSEO_Meta::$meta_prefix . 'meta-robots-nofollow', $this->replace ); - - /* - * @todo - [JRF => whomever] check if this can be done more efficiently by querying only the meta table - * possibly directly changing it using concat on the existing values - */ - $posts = $wpdb->get_results( "SELECT ID FROM $wpdb->posts" ); - if ( is_array( $posts ) && $posts !== array() ) { - foreach ( $posts as $post ) { - $custom = get_post_custom( $post->ID ); - $robotsmeta_adv = ''; - if ( isset( $custom['_headspace_noarchive'] ) ) { - $robotsmeta_adv .= 'noarchive,'; - } - if ( isset( $custom['_headspace_noodp'] ) ) { - $robotsmeta_adv .= 'noodp,'; - } - $robotsmeta_adv = preg_replace( '`,$`', '', $robotsmeta_adv ); - WPSEO_Meta::set_value( 'meta-robots-adv', $robotsmeta_adv, $post->ID ); - } - } - - if ( $this->replace ) { - // We no longer use noydir, but we remove the meta key as it's unneeded. - $hs_meta = array( 'noarchive', 'noodp', 'noydir' ); - foreach ( $hs_meta as $meta ) { - delete_post_meta_by_key( '_headspace_' . $meta ); - } - unset( $hs_meta, $meta ); - } - $this->set_msg( __( 'HeadSpace2 data successfully imported', 'wordpress-seo' ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-import-woothemes-seo.php b/wp/wp-content/plugins/wordpress-seo/admin/class-import-woothemes-seo.php deleted file mode 100644 index f06fcd30..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-import-woothemes-seo.php +++ /dev/null @@ -1,146 +0,0 @@ -import_home(); - $this->import_option( 'seo_woo_single_layout', 'post' ); - $this->import_option( 'seo_woo_page_layout', 'page' ); - $this->import_archive_option(); - $this->import_custom_values( 'seo_woo_meta_home_desc', 'metadesc-home-wpseo' ); - $this->import_custom_values( 'seo_woo_meta_home_key', 'metakey-home-wpseo' ); - $this->import_metas(); - - update_option( 'wpseo_titles', $this->options ); - - $this->set_msg( __( 'WooThemes SEO framework settings & data successfully imported.', 'wordpress-seo' ) ); - } - - /** - * Holds the WPSEO Title Options - * - * @var array - */ - private $options; - - /** - * Import options. - * - * @param string $option Option key. - * @param string $post_type Post type name to import for. - */ - private function import_option( $option, $post_type ) { - switch ( get_option( $option ) ) { - case 'a': - $this->options[ 'title-' . $post_type ] = '%%title%% %%sep%% %%sitename%%'; - break; - case 'b': - $this->options[ 'title-' . $post_type ] = '%%title%%'; - break; - case 'c': - $this->options[ 'title-' . $post_type ] = '%%sitename%% %%sep%% %%title%%'; - break; - case 'd': - $this->options[ 'title-' . $post_type ] = '%%title%% %%sep%% %%sitedesc%%'; - break; - case 'e': - $this->options[ 'title-' . $post_type ] = '%%sitename%% %%sep%% %%title%% %%sep%% %%sitedesc%%'; - break; - } - $this->perhaps_delete( $option ); - } - - /** - * Import the archive layout for all taxonomies - */ - private function import_archive_option() { - $reinstate_replace = false; - if ( $this->replace ) { - $this->replace = false; - $reinstate_replace = true; - } - $taxonomies = get_taxonomies( array( 'public' => true ), 'names' ); - if ( is_array( $taxonomies ) && $taxonomies !== array() ) { - foreach ( $taxonomies as $tax ) { - $this->import_option( 'seo_woo_archive_layout', 'tax-' . $tax ); - } - } - if ( $reinstate_replace ) { - $this->replace = true; - $this->perhaps_delete( 'seo_woo_archive_layout' ); - } - } - - /** - * Import custom descriptions and meta keys - * - * @param string $option Option key. - * @param string $key Internal key to import over. - */ - private function import_custom_values( $option, $key ) { - // Import the custom homepage description. - if ( 'c' == get_option( $option ) ) { - $this->options[ $key ] = get_option( $option . '_custom' ); - } - $this->perhaps_delete( $option ); - $this->perhaps_delete( $option . '_custom' ); - } - - /** - * Imports the WooThemes SEO homepage settings - */ - private function import_home() { - switch ( get_option( 'seo_woo_home_layout' ) ) { - case 'a': - $this->options['title-home-wpseo'] = '%%sitename%% %%sep%% %%sitedesc%%'; - break; - case 'b': - $this->options['title-home-wpseo'] = '%%sitename%% ' . get_option( 'seo_woo_paged_var' ) . ' %%pagenum%%'; - break; - case 'c': - $this->options['title-home-wpseo'] = '%%sitedesc%%'; - break; - } - $this->perhaps_delete( 'seo_woo_home_layout' ); - } - - /** - * Import meta values if they're applicable - */ - private function import_metas() { - WPSEO_Meta::replace_meta( 'seo_follow', WPSEO_Meta::$meta_prefix . 'meta-robots-nofollow', $this->replace ); - WPSEO_Meta::replace_meta( 'seo_noindex', WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', $this->replace ); - - // If WooSEO is set to use the Woo titles, import those. - if ( 'true' == get_option( 'seo_woo_wp_title' ) ) { - WPSEO_Meta::replace_meta( 'seo_title', WPSEO_Meta::$meta_prefix . 'title', $this->replace ); - } - - // If WooSEO is set to use the Woo meta descriptions, import those. - if ( 'b' == get_option( 'seo_woo_meta_single_desc' ) ) { - WPSEO_Meta::replace_meta( 'seo_description', WPSEO_Meta::$meta_prefix . 'metadesc', $this->replace ); - } - - // If WooSEO is set to use the Woo meta keywords, import those. - if ( 'b' == get_option( 'seo_woo_meta_single_key' ) ) { - WPSEO_Meta::replace_meta( 'seo_keywords', WPSEO_Meta::$meta_prefix . 'metakeywords', $this->replace ); - } - - foreach ( array( 'seo_woo_wp_title', 'seo_woo_meta_single_desc', 'seo_woo_meta_single_key' ) as $option ) { - $this->perhaps_delete( $option ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-import-wpseo.php b/wp/wp-content/plugins/wordpress-seo/admin/class-import-wpseo.php deleted file mode 100644 index b028abd8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-import-wpseo.php +++ /dev/null @@ -1,183 +0,0 @@ -import_post_metas(); - $this->import_taxonomy_metas(); - - $this->set_msg( - sprintf( - /* translators: 1: link open tag; 2: link close tag. */ - __( 'wpSEO data successfully imported. Would you like to %1$sdisable the wpSEO plugin%2$s?', 'wordpress-seo' ), - '', - '' - ) - ); - - } - - /** - * Import the post meta values to Yoast SEO by replacing the wpSEO fields by Yoast SEO fields - */ - private function import_post_metas() { - WPSEO_Meta::replace_meta( '_wpseo_edit_title', WPSEO_Meta::$meta_prefix . 'title', $this->replace ); - WPSEO_Meta::replace_meta( '_wpseo_edit_description', WPSEO_Meta::$meta_prefix . 'metadesc', $this->replace ); - WPSEO_Meta::replace_meta( '_wpseo_edit_keywords', WPSEO_Meta::$meta_prefix . 'keywords', $this->replace ); - WPSEO_Meta::replace_meta( '_wpseo_edit_canonical', WPSEO_Meta::$meta_prefix . 'canonical', $this->replace ); - - $this->import_post_robots(); - } - - /** - * Importing the robot values from WPSEO plugin. These have to be converted to the Yoast format. - */ - private function import_post_robots() { - $query_posts = new WP_Query( 'post_type=any&meta_key=_wpseo_edit_robots&order=ASC' ); - - if ( ! empty( $query_posts->posts ) ) { - foreach ( $query_posts->posts as $post ) { - $this->import_post_robot( $post->ID ); - } - } - } - - /** - * Getting the wpSEO robot value and map this to Yoast SEO values. - * - * @param integer $post_id The post id of the current post. - */ - private function import_post_robot( $post_id ) { - $wpseo_robots = get_post_meta( $post_id, '_wpseo_edit_robots', true ); - - // Does the value exists in our mapping. - if ( $robot_value = $this->get_robot_value( $wpseo_robots ) ) { - // Saving the new meta values for Yoast SEO. - WPSEO_Meta::set_value( $robot_value['index'], 'meta-robots-noindex', $post_id ); - WPSEO_Meta::set_value( $robot_value['follow'], 'meta-robots-nofollow', $post_id ); - } - - $this->delete_post_robot( $post_id ); - } - - /** - * Delete the wpSEO robot values, because they aren't needed anymore. - * - * @param integer $post_id The post id of the current post. - */ - private function delete_post_robot( $post_id ) { - if ( $this->replace ) { - delete_post_meta( $post_id, '_wpseo_edit_robots' ); - } - } - - /** - * Import the taxonomy metas from wpSEO - */ - private function import_taxonomy_metas() { - $terms = get_terms( get_taxonomies(), array( 'hide_empty' => false ) ); - $tax_meta = get_option( 'wpseo_taxonomy_meta' ); - - foreach ( $terms as $term ) { - $this->import_taxonomy_description( $tax_meta, $term->taxonomy, $term->term_id ); - $this->import_taxonomy_robots( $tax_meta, $term->taxonomy, $term->term_id ); - $this->delete_taxonomy_metas( $term->taxonomy, $term->term_id ); - } - - update_option( 'wpseo_taxonomy_meta', $tax_meta ); - } - - /** - * Import the meta description to Yoast SEO - * - * @param array $tax_meta The array with the current metadata. - * @param string $taxonomy String with the name of the taxonomy. - * @param string $term_id The ID of the current term. - */ - private function import_taxonomy_description( & $tax_meta, $taxonomy, $term_id ) { - $description = get_option( 'wpseo_' . $taxonomy . '_' . $term_id, false ); - if ( $description !== false ) { - // Import description. - $tax_meta[ $taxonomy ][ $term_id ]['wpseo_desc'] = $description; - } - } - - /** - * Import the robot value to Yoast SEO - * - * @param array $tax_meta The array with the current metadata. - * @param string $taxonomy String with the name of the taxonomy. - * @param string $term_id The ID of the current term. - */ - private function import_taxonomy_robots( & $tax_meta, $taxonomy, $term_id ) { - $wpseo_robots = get_option( 'wpseo_' . $taxonomy . '_' . $term_id . '_robots', false ); - if ( $wpseo_robots !== false ) { - // The value 1, 2 and 6 are the index values in wpSEO. - $new_robot_value = ( in_array( $wpseo_robots, array( 1, 2, 6 ) ) ) ? 'index' : 'noindex'; - - $tax_meta[ $taxonomy ][ $term_id ]['wpseo_noindex'] = $new_robot_value; - } - } - - /** - * Delete the wpSEO taxonomy meta data. - * - * @param string $taxonomy String with the name of the taxonomy. - * @param string $term_id The ID of the current term. - */ - private function delete_taxonomy_metas( $taxonomy, $term_id ) { - if ( $this->replace ) { - delete_option( 'wpseo_' . $taxonomy . '_' . $term_id ); - delete_option( 'wpseo_' . $taxonomy . '_' . $term_id . '_robots' ); - } - } - - /** - * Getting the robot config by given wpSEO robots value. - * - * @param string $wpseo_robots The value in wpSEO that needs to be converted to the Yoast format. - * - * @return array - */ - private function get_robot_value( $wpseo_robots ) { - static $robot_values; - - if ( $robot_values === null ) { - /** - * The values 1 - 6 are the configured values from wpSEO. This array will map the values of wpSEO to our values. - * - * There are some double array like 1-6 and 3-4. The reason is they only set the index value. The follow value is - * the default we use in the cases there isn't a follow value present. - * - * @var array - */ - $robot_values = array( - 1 => array( 'index' => 2, 'follow' => 0 ), // In wpSEO: index, follow. - 2 => array( 'index' => 2, 'follow' => 1 ), // In wpSEO: index, nofollow. - 3 => array( 'index' => 1, 'follow' => 0 ), // In wpSEO: noindex. - 4 => array( 'index' => 1, 'follow' => 0 ), // In wpSEO: noindex, follow. - 5 => array( 'index' => 1, 'follow' => 1 ), // In wpSEO: noindex, nofollow. - 6 => array( 'index' => 2, 'follow' => 0 ), // In wpSEO: index. - ); - } - - if ( array_key_exists( $wpseo_robots, $robot_values ) ) { - return $robot_values[ $wpseo_robots ]; - } - - return array( 'index' => 2, 'follow' => 0 ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-import.php b/wp/wp-content/plugins/wordpress-seo/admin/class-import.php deleted file mode 100644 index 0affee8b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-import.php +++ /dev/null @@ -1,196 +0,0 @@ -handle_upload() ) { - return; - } - - $this->determine_path(); - - if ( ! $this->unzip_file() ) { - $this->clean_up(); - - return; - } - - $this->parse_options(); - - $this->clean_up(); - } - - /** - * Handle the file upload - * - * @return boolean - */ - private function handle_upload() { - $overrides = array( 'mimes' => array( 'zip' => 'application/zip' ) ); // Explicitly allow zip in multisite. - $this->file = wp_handle_upload( $_FILES['settings_import_file'], $overrides ); - - if ( is_wp_error( $this->file ) ) { - $this->msg = __( 'Settings could not be imported:', 'wordpress-seo' ) . ' ' . $this->file->get_error_message(); - - return false; - } - - if ( is_array( $this->file ) && isset( $this->file['error'] ) ) { - $this->msg = __( 'Settings could not be imported:', 'wordpress-seo' ) . ' ' . $this->file['error']; - - return false; - } - - if ( ! isset( $this->file['file'] ) ) { - $this->msg = __( 'Settings could not be imported:', 'wordpress-seo' ) . ' ' . __( 'Upload failed.', 'wordpress-seo' ); - - return false; - } - - return true; - } - - /** - * Determine the path to the import file - */ - private function determine_path() { - $this->upload_dir = wp_upload_dir(); - - if ( ! defined( 'DIRECTORY_SEPARATOR' ) ) { - define( 'DIRECTORY_SEPARATOR', '/' ); - } - $this->path = $this->upload_dir['basedir'] . DIRECTORY_SEPARATOR . 'wpseo-import' . DIRECTORY_SEPARATOR; - - if ( ! isset( $GLOBALS['wp_filesystem'] ) || ! is_object( $GLOBALS['wp_filesystem'] ) ) { - WP_Filesystem(); - } - } - - /** - * Unzip the file - * - * @return boolean - */ - private function unzip_file() { - $unzipped = unzip_file( $this->file['file'], $this->path ); - if ( is_wp_error( $unzipped ) ) { - $this->msg = __( 'Settings could not be imported:', 'wordpress-seo' ) . ' ' . sprintf( __( 'Unzipping failed with error "%s".', 'wordpress-seo' ), $unzipped->get_error_message() ); - - return false; - } - - $this->filename = $this->path . 'settings.ini'; - if ( ! is_file( $this->filename ) || ! is_readable( $this->filename ) ) { - $this->msg = __( 'Settings could not be imported:', 'wordpress-seo' ) . ' ' . __( 'Unzipping failed - file settings.ini not found.', 'wordpress-seo' ); - - return false; - } - - return true; - } - - /** - * Parse the option file - */ - private function parse_options() { - $options = parse_ini_file( $this->filename, true ); - - if ( is_array( $options ) && $options !== array() ) { - if ( isset( $options['wpseo']['version'] ) && $options['wpseo']['version'] !== '' ) { - $this->old_wpseo_version = $options['wpseo']['version']; - } - foreach ( $options as $name => $opt_group ) { - $this->parse_option_group( $name, $opt_group, $options ); - } - $this->msg = __( 'Settings successfully imported.', 'wordpress-seo' ); - $this->success = true; - } - else { - $this->msg = __( 'Settings could not be imported:', 'wordpress-seo' ) . ' ' . __( 'No settings found in file.', 'wordpress-seo' ); - } - } - - /** - * Parse the option group and import it - * - * @param string $name Name string. - * @param array $opt_group Option group data. - * @param array $options Options data. - */ - private function parse_option_group( $name, $opt_group, $options ) { - if ( $name === 'wpseo_taxonomy_meta' ) { - $opt_group = json_decode( urldecode( $opt_group['wpseo_taxonomy_meta'] ), true ); - } - - // Make sure that the imported options are cleaned/converted on import. - $option_instance = WPSEO_Options::get_option_instance( $name ); - if ( is_object( $option_instance ) && method_exists( $option_instance, 'import' ) ) { - $option_instance->import( $opt_group, $this->old_wpseo_version, $options ); - } - elseif ( WP_DEBUG === true || ( defined( 'WPSEO_DEBUG' ) && WPSEO_DEBUG === true ) ) { - $this->msg = sprintf( __( 'Setting "%s" is no longer used and has been discarded.', 'wordpress-seo' ), $name ); - } - } - - /** - * Remove the files - */ - private function clean_up() { - if ( file_exists( $this->filename ) && is_writable( $this->filename ) ) { - unlink( $this->filename ); - } - if ( ! empty( $this->file['file'] ) && file_exists( $this->file['file'] ) && is_writable( $this->file['file'] ) ) { - unlink( $this->file['file'] ); - } - if ( file_exists( $this->path ) && is_writable( $this->path ) ) { - $wp_file = new WP_Filesystem_Direct( $this->path ); - $wp_file->rmdir( $this->path, true ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-meta-columns.php b/wp/wp-content/plugins/wordpress-seo/admin/class-meta-columns.php deleted file mode 100644 index aff1cb2e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-meta-columns.php +++ /dev/null @@ -1,500 +0,0 @@ -analysis_seo = new WPSEO_Metabox_Analysis_SEO(); - $this->analysis_readability = new WPSEO_Metabox_Analysis_Readability(); - } - - /** - * Setting up the hooks - */ - public function setup_hooks() { - $this->set_post_type_hooks(); - - if ( $this->analysis_seo->is_enabled() ) { - add_action( 'restrict_manage_posts', array( $this, 'posts_filter_dropdown' ) ); - } - - add_filter( 'request', array( $this, 'column_sort_orderby' ) ); - } - - /** - * Adds the column headings for the SEO plugin for edit posts / pages overview - * - * @param array $columns Already existing columns. - * - * @return array - */ - public function column_heading( $columns ) { - if ( $this->is_metabox_hidden() === true ) { - return $columns; - } - - $added_columns = array(); - - if ( $this->analysis_seo->is_enabled() ) { - $added_columns['wpseo-score'] = __( 'SEO', 'wordpress-seo' ); - } - if ( $this->analysis_readability->is_enabled() ) { - $added_columns['wpseo-score-readability'] = __( 'Readability', 'wordpress-seo' ); - } - $added_columns['wpseo-title'] = __( 'SEO Title', 'wordpress-seo' ); - $added_columns['wpseo-metadesc'] = __( 'Meta Desc.', 'wordpress-seo' ); - - if ( $this->analysis_seo->is_enabled() ) { - $added_columns['wpseo-focuskw'] = __( 'Focus KW', 'wordpress-seo' ); - } - - return array_merge( $columns, $added_columns ); - } - - /** - * Display the column content for the given column - * - * @param string $column_name Column to display the content for. - * @param int $post_id Post to display the column content for. - */ - public function column_content( $column_name, $post_id ) { - if ( $this->is_metabox_hidden() === true ) { - return; - } - - switch ( $column_name ) { - case 'wpseo-score' : - echo $this->parse_column_score( $post_id ); - break; - case 'wpseo-score-readability': - echo $this->parse_column_score_readability( $post_id ); - break; - case 'wpseo-title' : - echo esc_html( apply_filters( 'wpseo_title', wpseo_replace_vars( $this->page_title( $post_id ), get_post( $post_id, ARRAY_A ) ) ) ); - break; - case 'wpseo-metadesc' : - $metadesc_val = apply_filters( 'wpseo_metadesc', wpseo_replace_vars( WPSEO_Meta::get_value( 'metadesc', $post_id ), get_post( $post_id, ARRAY_A ) ) ); - $metadesc = ( '' === $metadesc_val ) ? '' . __( 'Meta description not set.', 'wordpress-seo' ) . '' : esc_html( $metadesc_val ); - echo $metadesc; - break; - case 'wpseo-focuskw' : - $focuskw_val = WPSEO_Meta::get_value( 'focuskw', $post_id ); - $focuskw = ( '' === $focuskw_val ) ? '' . __( 'Focus keyword not set.', 'wordpress-seo' ) . '' : esc_html( $focuskw_val ); - echo $focuskw; - break; - } - } - - /** - * Indicate which of the SEO columns are sortable. - * - * @param array $columns appended with their orderby variable. - * - * @return array - */ - public function column_sort( $columns ) { - if ( $this->is_metabox_hidden() === true ) { - return $columns; - } - - $columns['wpseo-metadesc'] = 'wpseo-metadesc'; - - if ( $this->analysis_seo->is_enabled() ) { - $columns['wpseo-focuskw'] = 'wpseo-focuskw'; - } - - return $columns; - } - - /** - * Hide the SEO Title, Meta Desc and Focus KW columns if the user hasn't chosen which columns to hide - * - * @param array|false $result The hidden columns. - * @param string $option The option name used to set which columns should be hidden. - * @param WP_User $user The User. - * - * @return array|false $result - */ - public function column_hidden( $result, $option, $user ) { - global $wpdb; - - $prefix = $wpdb->get_blog_prefix(); - if ( ! $user->has_prop( $prefix . $option ) && ! $user->has_prop( $option ) ) { - - if ( ! is_array( $result ) ) { - $result = array(); - } - - array_push( $result, 'wpseo-title', 'wpseo-metadesc' ); - - if ( $this->analysis_seo->is_enabled() ) { - array_push( $result, 'wpseo-focuskw' ); - } - } - - return $result; - } - - /** - * Adds a dropdown that allows filtering on the posts SEO Quality. - * - * @return void - */ - public function posts_filter_dropdown() { - if ( $GLOBALS['pagenow'] === 'upload.php' || $this->is_metabox_hidden() === true ) { - return; - } - - $ranks = WPSEO_Rank::get_all_ranks(); - $current_seo_filter = filter_input( INPUT_GET, 'seo_filter' ); - - echo ' - - '; - } - - /** - * Modify the query based on the seo_filter variable in $_GET - * - * @param array $vars Query variables. - * - * @return array - */ - public function column_sort_orderby( $vars ) { - if ( $seo_filter = filter_input( INPUT_GET, 'seo_filter' ) ) { - $rank = new WPSEO_Rank( $seo_filter ); - - if ( WPSEO_Rank::NO_FOCUS === $seo_filter || WPSEO_Rank::NO_INDEX === $seo_filter ) { - $vars = $this->filter_other( $vars, $seo_filter ); - } - else { - $vars = array_merge( $vars, $this->filter_scored( $rank->get_starting_score(), $rank->get_end_score() ) ); - } - } - - if ( $seo_kw_filter = filter_input( INPUT_GET, 'seo_kw_filter' ) ) { - $vars = array_merge( - $vars, array( - 'post_type' => get_query_var( 'post_type', 'post' ), - 'meta_key' => WPSEO_Meta::$meta_prefix . 'focuskw', - 'meta_value' => sanitize_text_field( $seo_kw_filter ), - ) - ); - } - - if ( isset( $vars['orderby'] ) ) { - $vars = array_merge( $vars, $this->filter_order_by( $vars['orderby'] ) ); - } - - return $vars; - } - - /** - * When there is a score just return this meta query array - * - * @param string $low The lowest number in the score range. - * @param string $high The highest number in the score range. - * - * @return array - */ - private function filter_scored( $low, $high ) { - /** - * @internal DON'T touch the order of these without double-checking/adjusting the seo_score_posts_where() method below! - */ - return array( - 'meta_query' => array( - 'relation' => 'AND', - array( - 'key' => WPSEO_Meta::$meta_prefix . 'linkdex', - 'value' => array( $low, $high ), - 'type' => 'numeric', - 'compare' => 'BETWEEN', - ), - array( - 'relation' => 'OR', - array( - 'key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', - 'compare' => 'NOT EXISTS', - ), - array( - 'key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', - 'value' => '1', - 'compare' => '!=', - ), - ), - ), - ); - } - - /** - * Get vars for noindex or na filters - * - * @param array $vars The unmerged vars. - * @param string $seo_filter The SEO filter. - * - * @return array - */ - private function filter_other( $vars, $seo_filter ) { - switch ( $seo_filter ) { - case 'noindex': - $vars = array_merge( - $vars, - array( - 'meta_query' => array( - array( - 'key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', - 'value' => '1', - 'compare' => '=', - ), - ), - ) - ); - break; - case 'na': - $vars = array_merge( - $vars, - array( - 'meta_query' => array( - 'relation' => 'AND', - array( - 'key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', - 'value' => 'needs-a-value-anyway', - 'compare' => 'NOT EXISTS', - ), - array( - 'key' => WPSEO_Meta::$meta_prefix . 'linkdex', - 'value' => 'needs-a-value-anyway', - 'compare' => 'NOT EXISTS', - ) - ), - ) - ); - break; - } - - return $vars; - } - - /** - * Returning filters when $order_by is matched in the if-statement - * - * @param string $order_by The ID of the column by which to order the posts. - * - * @return array - */ - private function filter_order_by( $order_by ) { - switch ( $order_by ) { - case 'wpseo-metadesc' : - return array( - 'meta_key' => WPSEO_Meta::$meta_prefix . 'metadesc', - 'orderby' => 'meta_value', - ); - break; - case 'wpseo-focuskw' : - return array( - 'meta_key' => WPSEO_Meta::$meta_prefix . 'focuskw', - 'orderby' => 'meta_value', - ); - break; - } - - return array(); - } - - /** - * Parsing the score column - * - * @param integer $post_id The ID of the post for which to show the score. - * - * @return string The HTML for the SEO score indicator. - */ - private function parse_column_score( $post_id ) { - if ( '1' === WPSEO_Meta::get_value( 'meta-robots-noindex', $post_id ) ) { - $rank = new WPSEO_Rank( WPSEO_Rank::NO_INDEX ); - $title = __( 'Post is set to noindex.', 'wordpress-seo' ); - WPSEO_Meta::set_value( 'linkdex', 0, $post_id ); - } - elseif ( '' === WPSEO_Meta::get_value( 'focuskw', $post_id ) ) { - $rank = new WPSEO_Rank( WPSEO_Rank::NO_FOCUS ); - $title = __( 'Focus keyword not set.', 'wordpress-seo' ); - } - else { - $score = (int) WPSEO_Meta::get_value( 'linkdex', $post_id ); - $rank = WPSEO_Rank::from_numeric_score( $score ); - $title = $rank->get_label(); - } - - return $this->render_score_indicator( $rank, $title ); - } - - /** - * Parsing the readability score column. - * - * @param int $post_id The ID of the post for which to show the readability score. - * - * @return string The HTML for the readability score indicator. - */ - private function parse_column_score_readability( $post_id ) { - $score = (int) WPSEO_Meta::get_value( 'content_score', $post_id ); - $rank = WPSEO_Rank::from_numeric_score( $score ); - - return $this->render_score_indicator( $rank ); - } - - /** - * Setting the hooks for the post_types - */ - private function set_post_type_hooks() { - $post_types = get_post_types( array( 'public' => true ), 'names' ); - - if ( is_array( $post_types ) && $post_types !== array() ) { - foreach ( $post_types as $pt ) { - if ( $this->is_metabox_hidden( $pt ) === false ) { - add_filter( 'manage_' . $pt . '_posts_columns', array( $this, 'column_heading' ), 10, 1 ); - add_action( 'manage_' . $pt . '_posts_custom_column', array( - $this, - 'column_content', - ), 10, 2 ); - add_action( 'manage_edit-' . $pt . '_sortable_columns', array( - $this, - 'column_sort', - ), 10, 2 ); - - /* - * Use the `get_user_option_{$option}` filter to change the output of the get_user_option - * function for the `manage{$screen}columnshidden` option, which is based on the current - * admin screen. The admin screen we want to target is the `edit-{$post_type}` screen. - */ - $filter = sprintf( 'get_user_option_%s', sprintf( 'manage%scolumnshidden', 'edit-' . $pt ) ); - add_filter( $filter, array( $this, 'column_hidden' ), 10, 3 ); - } - } - unset( $pt ); - } - } - - /** - * Test whether the metabox should be hidden either by choice of the admin or because - * the post type is not a public post type - * - * @since 1.5.0 - * - * @param string $post_type (optional) The post type to test, defaults to the current post post_type. - * - * @return bool Whether or not the meta box (and associated columns etc) should be hidden - */ - private function is_metabox_hidden( $post_type = null ) { - if ( ! isset( $post_type ) && $get_post_type = filter_input( INPUT_GET, 'post_type' ) ) { - $post_type = sanitize_text_field( $get_post_type ); - } - - if ( isset( $post_type ) ) { - // Don't make static as post_types may still be added during the run. - $cpts = get_post_types( array( 'public' => true ), 'names' ); - $options = get_option( 'wpseo_titles' ); - - return ( ( isset( $options[ 'hideeditbox-' . $post_type ] ) && $options[ 'hideeditbox-' . $post_type ] === true ) || in_array( $post_type, $cpts ) === false ); - } - - return false; - } - - /** - * Retrieve the page title. - * - * @param int $post_id Post to retrieve the title for. - * - * @return string - */ - private function page_title( $post_id ) { - $fixed_title = WPSEO_Meta::get_value( 'title', $post_id ); - if ( $fixed_title !== '' ) { - return $fixed_title; - } - - $post = get_post( $post_id ); - $options = WPSEO_Options::get_option( 'wpseo_titles' ); - if ( is_object( $post ) && ( isset( $options[ 'title-' . $post->post_type ] ) && $options[ 'title-' . $post->post_type ] !== '' ) ) { - $title_template = $options[ 'title-' . $post->post_type ]; - $title_template = str_replace( ' %%page%% ', ' ', $title_template ); - - return wpseo_replace_vars( $title_template, $post ); - } - - return wpseo_replace_vars( '%%title%%', $post ); - } - - /** - * @param WPSEO_Rank $rank The rank this indicator should have. - * @param string $title Optional. The title for this rank, defaults to the title of the rank. - * - * @return string The HTML for a score indicator. - */ - private function render_score_indicator( $rank, $title = '' ) { - if ( empty( $title ) ) { - $title = $rank->get_label(); - } - - return '' . $title . ''; - } - - /** - * Hacky way to get round the limitation that you can only have AND *or* OR relationship between - * meta key clauses and not a combination - which is what we need. - * - * @deprecated 3.5 Unnecessary with nested meta queries in core. - * @codeCoverageIgnore - * - * @param string $where Where clause. - * - * @return string - */ - public function seo_score_posts_where( $where ) { - - _deprecated_function( __METHOD__, '3.5' ); - - global $wpdb; - - /* Find the two mutually exclusive noindex clauses which should be changed from AND to OR relation */ - $find = '`([\s]+AND[\s]+)((?:' . $wpdb->prefix . 'postmeta|mt[0-9]|mt1)\.post_id IS NULL[\s]+)AND([\s]+\([\s]*(?:' . $wpdb->prefix . 'postmeta|mt[0-9])\.meta_key = \'' . WPSEO_Meta::$meta_prefix . 'meta-robots-noindex\' AND CAST\([^\)]+\)[^\)]+\))`'; - - $replace = '$1( $2OR$3 )'; - - $new_where = preg_replace( $find, $replace, $where ); - - if ( $new_where ) { - return $new_where; - } - return $where; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-option-tab.php b/wp/wp-content/plugins/wordpress-seo/admin/class-option-tab.php deleted file mode 100644 index 10fe2d2b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-option-tab.php +++ /dev/null @@ -1,80 +0,0 @@ -name = sanitize_title( $name ); - $this->label = $label; - $this->arguments = (array) $arguments; - } - - /** - * Get the name - * - * @return string - */ - public function get_name() { - return $this->name; - } - - /** - * Get the label - * - * @return string - */ - public function get_label() { - return $this->label; - } - - /** - * Get the video URL - * - * @return string - */ - public function get_video_url() { - return $this->get_argument( 'video_url' ); - } - - /** - * Get the option group - * - * @return string - */ - public function get_opt_group() { - return $this->get_argument( 'opt_group' ); - } - - /** - * Get the variable from the supplied arguments - * - * @param string $variable Variable to retrieve. - * @param string $default Default to use when variable not found. - * - * @return mixed|string - */ - protected function get_argument( $variable, $default = '' ) { - return ! empty( $this->arguments[ $variable ] ) ? $this->arguments[ $variable ] : $default; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-option-tabs-formatter.php b/wp/wp-content/plugins/wordpress-seo/admin/class-option-tabs-formatter.php deleted file mode 100644 index 7377b80b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-option-tabs-formatter.php +++ /dev/null @@ -1,53 +0,0 @@ -get_base() . '/' . $tab->get_name() . '.php'; - } - - /** - * @param WPSEO_Option_Tabs $option_tabs Option Tabs to get tabs from. - * @param Yoast_Form $yform Yoast Form which is being used in the views. - * @param array $options Options which are being used in the views. - */ - public function run( WPSEO_Option_Tabs $option_tabs, Yoast_Form $yform, $options = array() ) { - - echo ''; - - foreach ( $option_tabs->get_tabs() as $tab ) { - // Prepare the help center for each tab. - $help_center = new WPSEO_Help_Center( $option_tabs->get_base(), $tab ); - - $identifier = $tab->get_name(); - printf( '
    ', $identifier ); - - // Output the help center. - $help_center->output_help_center(); - - // Output the settings view for all tabs. - $tab_view = $this->get_tab_view( $option_tabs, $tab ); - if ( is_file( $tab_view ) ) { - require_once $tab_view; - } - - echo '
    '; - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-option-tabs.php b/wp/wp-content/plugins/wordpress-seo/admin/class-option-tabs.php deleted file mode 100644 index 2d5bd54c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-option-tabs.php +++ /dev/null @@ -1,106 +0,0 @@ -base = sanitize_title( $base ); - - $tab = filter_input( INPUT_GET, 'tab' ); - $this->active_tab = empty( $tab ) ? $active_tab : $tab; - } - - /** - * Get the base - * - * @return string - */ - public function get_base() { - return $this->base; - } - - /** - * Add a tab - * - * @param WPSEO_Option_Tab $tab Tab to add. - * - * @return $this - */ - public function add_tab( WPSEO_Option_Tab $tab ) { - $this->tabs[] = $tab; - - return $this; - } - - /** - * Get active tab - * - * @return null|WPSEO_Option_Tab Get the active tab. - */ - public function get_active_tab() { - if ( empty( $this->active_tab ) ) { - return null; - } - - $active_tabs = array_filter( $this->tabs, array( $this, 'is_active_tab' ) ); - if ( ! empty( $active_tabs ) ) { - $active_tabs = array_values( $active_tabs ); - if ( count( $active_tabs ) === 1 ) { - return $active_tabs[0]; - } - } - - return null; - } - - /** - * Is the tab the active tab - * - * @param WPSEO_Option_Tab $tab Tab to check for active tab. - * - * @return bool - */ - public function is_active_tab( WPSEO_Option_Tab $tab ) { - return ( $tab->get_name() === $this->active_tab ); - } - - /** - * Get all tabs - * - * @return WPSEO_Option_Tab[] - */ - public function get_tabs() { - return $this->tabs; - } - - /** - * Display the tabs - * - * @param Yoast_Form $yform Yoast Form needed in the views. - * @param array $options Options needed in the views. - */ - public function display( Yoast_Form $yform, $options = array() ) { - $formatter = new WPSEO_Option_Tabs_Formatter(); - $formatter->run( $this, $yform, $options ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-availability.php b/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-availability.php deleted file mode 100644 index 98b23e44..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-availability.php +++ /dev/null @@ -1,241 +0,0 @@ -register_yoast_plugins(); - $this->register_yoast_plugins_status(); - } - - /** - * Registers all the available Yoast SEO plugins. - */ - protected function register_yoast_plugins() { - $this->plugins = array( - 'yoast-seo-premium' => array( - 'url' => 'https://yoast.com/wordpress/plugins/seo-premium/', - 'title' => 'Yoast SEO Premium', - /* translators: %1$s expands to Yoast SEO */ - 'description' => sprintf( __( 'The premium version of %1$s with more features & support.', 'wordpress-seo' ), 'Yoast SEO' ), - 'installed' => false, - 'slug' => 'wordpress-seo-premium/wp-seo-premium.php', - ), - - 'video-seo-for-wordpress-seo-by-yoast' => array( - 'url' => 'https://yoast.com/wordpress/plugins/video-seo/', - 'title' => 'Video SEO', - 'description' => __( 'Optimize your videos to show them off in search results and get more clicks!', 'wordpress-seo' ), - 'installed' => false, - 'slug' => 'wpseo-video/video-seo.php', - ), - - 'yoast-news-seo' => array( - 'url' => 'https://yoast.com/wordpress/plugins/news-seo/', - 'title' => 'News SEO', - 'description' => __( 'Are you in Google News? Increase your traffic from Google News by optimizing for it!', 'wordpress-seo' ), - 'installed' => false, - 'slug' => 'wpseo-news/wpseo-news.php', - ), - - 'local-seo-for-yoast-seo' => array( - 'url' => 'https://yoast.com/wordpress/plugins/local-seo/', - 'title' => 'Local SEO', - 'description' => __( 'Rank better locally and in Google Maps, without breaking a sweat!', 'wordpress-seo' ), - 'installed' => false, - 'slug' => 'wordpress-seo-local/local-seo.php', - ), - - 'yoast-woocommerce-seo' => array( - 'url' => 'https://yoast.com/wordpress/plugins/yoast-woocommerce-seo/', - 'title' => 'Yoast WooCommerce SEO', - /* translators: %1$s expands to Yoast SEO */ - 'description' => sprintf( __( 'Seamlessly integrate WooCommerce with %1$s and get extra features!', 'wordpress-seo' ), 'Yoast SEO' ), - 'installed' => false, - 'slug' => 'wpseo-woocommerce/wpseo-woocommerce.php', - ), - ); - } - - /** - * Sets certain plugin properties based on WordPress' status. - */ - protected function register_yoast_plugins_status() { - - foreach ( $this->plugins as $name => $plugin ) { - - $plugin_slug = $plugin['slug']; - $plugin_path = WP_PLUGIN_DIR . '/' . $plugin_slug; - - if ( file_exists( $plugin_path ) ) { - $plugin_data = get_plugin_data( $plugin_path, false, false ); - $this->plugins[ $name ]['installed'] = true; - $this->plugins[ $name ]['version'] = $plugin_data['Version']; - $this->plugins[ $name ]['active'] = is_plugin_active( $plugin_slug ); - } - } - } - - /** - * Checks whether or not a plugin is known within the Yoast SEO collection. - * - * @param {string} $plugin The plugin to search for. - * - * @return bool Whether or not the plugin is exists. - */ - protected function plugin_exists( $plugin ) { - return isset( $this->plugins[ $plugin ] ); - } - - /** - * Gets all the possibly available plugins. - * - * @return array Array containing the information about the plugins. - */ - public function get_plugins() { - return $this->plugins; - } - - /** - * Gets a specific plugin. Returns an empty array if it cannot be found. - * - * @param {string} $plugin The plugin to search for. - * - * @return array The plugin properties. - */ - public function get_plugin( $plugin ) { - if ( ! $this->plugin_exists( $plugin ) ) { - return array(); - } - - return $this->plugins[ $plugin ]; - } - - /** - * Gets the version of the plugin. - * - * @param {string} $plugin The plugin to search for. - * - * @return string The version associated with the plugin. - */ - public function get_version( $plugin ) { - if ( ! isset( $plugin['version'] ) ) { - return ''; - } - - return $plugin['version']; - } - - /** - * Checks if there are dependencies available for the plugin. - * - * @param {string} $plugin The plugin to search for. - * - * @return bool Whether or not there is a dependency present. - */ - public function has_dependencies( $plugin ) { - return ( isset( $plugin['_dependencies'] ) && ! empty( $plugin['_dependencies'] ) ); - } - - /** - * Gets the dependencies for the plugin. - * - * @param {string} $plugin The plugin to search for. - * - * @return array Array containing all the dependencies associated with the plugin. - */ - public function get_dependencies( $plugin ) { - if ( ! $this->has_dependencies( $plugin ) ) { - return array(); - } - - return $plugin['_dependencies']; - } - - /** - * Checks if all dependencies are satisfied. - * - * @param {string} $plugin The plugin to search for. - * - * @return bool Whether or not the dependencies are satisfied. - */ - public function dependencies_are_satisfied( $plugin ) { - if ( ! $this->has_dependencies( $plugin ) ) { - return true; - } - - $dependencies = $this->get_dependencies( $plugin ); - $installed_dependencies = array_filter( $dependencies, array( $this, 'is_dependency_available' ) ); - - return count( $installed_dependencies ) === count( $dependencies ); - } - - /** - * Checks whether or not one of the plugins is properly installed and usable. - * - * @param {string} $plugin The plugin to search for. - * - * @return bool Whether or not the plugin is properly installed. - */ - public function is_installed( $plugin ) { - if ( empty( $plugin ) ) { - return false; - } - - $dependencies_are_satisfied = $this->dependencies_are_satisfied( $plugin ); - - return $dependencies_are_satisfied && $this->is_available( $plugin ); - } - - /** - * Gets all installed plugins. - * - * @return array - */ - public function get_installed_plugins() { - $installed = array(); - - foreach ( $this->plugins as $plugin_key => $plugin ) { - if ( $this->is_installed( $plugin ) ) { - $installed[ $plugin_key ] = $plugin; - } - } - - return $installed; - } - - /** - * Checks for the availability of the plugin. - * - * @param {string} $plugin The plugin to search for. - * - * @return bool Whether or not the plugin is available. - */ - public function is_available( $plugin ) { - return isset( $plugin['installed'] ) && $plugin['installed'] === true; - } - - /** - * Checks whether a dependency is available. - * - * @param {string} $dependency The dependency to look for. - * - * @return bool Whether or not the dependency is available. - */ - public function is_dependency_available( $dependency ) { - return class_exists( $dependency ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-compatibility.php b/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-compatibility.php deleted file mode 100644 index 9b0ee882..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-compatibility.php +++ /dev/null @@ -1,101 +0,0 @@ -current_wpseo_version = $this->get_major_minor_version( $version ); - $this->availability_checker = $this->retrieve_availability_checker( $availability_checker ); - $this->installed_plugins = $this->availability_checker->get_installed_plugins(); - } - - /** - * Retrieves the availability checker. - * - * @param null|object $checker The checker to set. - * - * @return WPSEO_Plugin_Availability The checker to use. - */ - private function retrieve_availability_checker( $checker ) { - if ( is_null( $checker ) || ! is_object( $checker ) ) { - return new WPSEO_Plugin_Availability(); - } - - return $checker; - } - - /** - * Wraps the availability checker's get_installed_plugins method. - * - * @return array Array containing all the installed plugins. - */ - public function get_installed_plugins() { - return $this->installed_plugins; - } - - /** - * Creates a list of installed plugins and whether or not they are compatible. - * - * @return array Array containing the installed plugins and compatibility. - */ - public function get_installed_plugins_compatibility() { - foreach ( $this->installed_plugins as $key => $plugin ) { - - $this->installed_plugins[ $key ]['compatible'] = $this->is_compatible( $key ); - } - - return $this->installed_plugins; - } - - /** - * Checks whether or not a plugin is compatible. - * - * @param string $plugin The plugin to look for and match. - * - * @return bool Whether or not the plugin is compatible. - */ - public function is_compatible( $plugin ) { - $plugin = $this->availability_checker->get_plugin( $plugin ); - $plugin_version = $this->availability_checker->get_version( $plugin ); - - return $this->get_major_minor_version( $plugin_version ) === $this->current_wpseo_version; - } - - /** - * Gets the major/minor version of the plugin for easier comparing. - * - * @param string $version The version to trim. - * - * @return string The major/minor version of the plugin. - */ - protected function get_major_minor_version( $version ) { - return substr( $version, 0, 3 ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-conflict.php b/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-conflict.php deleted file mode 100644 index 5c6f1579..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-plugin-conflict.php +++ /dev/null @@ -1,164 +0,0 @@ - array( - '2-click-socialmedia-buttons/2-click-socialmedia-buttons.php', - // 2 Click Social Media Buttons. - 'add-link-to-facebook/add-link-to-facebook.php', // Add Link to Facebook. - 'add-meta-tags/add-meta-tags.php', // Add Meta Tags. - 'easy-facebook-share-thumbnails/esft.php', // Easy Facebook Share Thumbnail. - 'facebook/facebook.php', // Facebook (official plugin). - 'facebook-awd/AWD_facebook.php', // Facebook AWD All in one. - 'facebook-featured-image-and-open-graph-meta-tags/fb-featured-image.php', - // Facebook Featured Image & OG Meta Tags. - 'facebook-meta-tags/facebook-metatags.php', // Facebook Meta Tags. - 'wonderm00ns-simple-facebook-open-graph-tags/wonderm00n-open-graph.php', - // Facebook Open Graph Meta Tags for WordPress. - 'facebook-revised-open-graph-meta-tag/index.php', // Facebook Revised Open Graph Meta Tag. - 'facebook-thumb-fixer/_facebook-thumb-fixer.php', // Facebook Thumb Fixer. - 'facebook-and-digg-thumbnail-generator/facebook-and-digg-thumbnail-generator.php', - // Fedmich's Facebook Open Graph Meta. - 'header-footer/plugin.php', // Header and Footer. - 'network-publisher/networkpub.php', // Network Publisher. - 'nextgen-facebook/nextgen-facebook.php', // NextGEN Facebook OG. - 'opengraph/opengraph.php', // Open Graph. - 'open-graph-protocol-framework/open-graph-protocol-framework.php', - // Open Graph Protocol Framework. - 'seo-facebook-comments/seofacebook.php', // SEO Facebook Comments. - 'seo-ultimate/seo-ultimate.php', // SEO Ultimate. - 'sexybookmarks/sexy-bookmarks.php', // Shareaholic. - 'shareaholic/sexy-bookmarks.php', // Shareaholic. - 'sharepress/sharepress.php', // SharePress. - 'simple-facebook-connect/sfc.php', // Simple Facebook Connect. - 'social-discussions/social-discussions.php', // Social Discussions. - 'social-sharing-toolkit/social_sharing_toolkit.php', // Social Sharing Toolkit. - 'socialize/socialize.php', // Socialize. - 'only-tweet-like-share-and-google-1/tweet-like-plusone.php', - // Tweet, Like, Google +1 and Share. - 'wordbooker/wordbooker.php', // Wordbooker. - 'wpsso/wpsso.php', // WordPress Social Sharing Optimization. - 'wp-caregiver/wp-caregiver.php', // WP Caregiver. - 'wp-facebook-like-send-open-graph-meta/wp-facebook-like-send-open-graph-meta.php', - // WP Facebook Like Send & Open Graph Meta. - 'wp-facebook-open-graph-protocol/wp-facebook-ogp.php', // WP Facebook Open Graph protocol. - 'wp-ogp/wp-ogp.php', // WP-OGP. - 'zoltonorg-social-plugin/zosp.php', // Zolton.org Social Plugin. - ), - 'xml_sitemaps' => array( - 'google-sitemap-plugin/google-sitemap-plugin.php', - // Google Sitemap (BestWebSoft). - 'xml-sitemaps/xml-sitemaps.php', - // XML Sitemaps (Denis de Bernardy and Mike Koepke). - 'bwp-google-xml-sitemaps/bwp-simple-gxs.php', - // Better WordPress Google XML Sitemaps (Khang Minh). - 'google-sitemap-generator/sitemap.php', - // Google XML Sitemaps (Arne Brachhold). - 'xml-sitemap-feed/xml-sitemap.php', - // XML Sitemap & Google News feeds (RavanH). - 'google-monthly-xml-sitemap/monthly-xml-sitemap.php', - // Google Monthly XML Sitemap (Andrea Pernici). - 'simple-google-sitemap-xml/simple-google-sitemap-xml.php', - // Simple Google Sitemap XML (iTx Technologies). - 'another-simple-xml-sitemap/another-simple-xml-sitemap.php', - // Another Simple XML Sitemap. - 'xml-maps/google-sitemap.php', - // Xml Sitemap (Jason Martens). - 'google-xml-sitemap-generator-by-anton-dachauer/adachauer-google-xml-sitemap.php', - // Google XML Sitemap Generator by Anton Dachauer (Anton Dachauer). - 'wp-xml-sitemap/wp-xml-sitemap.php', - // WP XML Sitemap (Team Vivacity). - 'sitemap-generator-for-webmasters/sitemap.php', - // Sitemap Generator for Webmasters (iwebslogtech). - 'xml-sitemap-xml-sitemapcouk/xmls.php', - // XML Sitemap - XML-Sitemap.co.uk (Simon Hancox). - 'sewn-in-xml-sitemap/sewn-xml-sitemap.php', - // Sewn In XML Sitemap (jcow). - 'rps-sitemap-generator/rps-sitemap-generator.php', - // RPS Sitemap Generator (redpixelstudios). - ), - 'cloaking' => array( - 'rs-head-cleaner/rs-head-cleaner.php', - // RS Head Cleaner Plus https://wordpress.org/plugins/rs-head-cleaner/. - 'rs-head-cleaner-lite/rs-head-cleaner-lite.php', - // RS Head Cleaner Lite https://wordpress.org/plugins/rs-head-cleaner-lite/. - ), - ); - - /** - * Overrides instance to set with this class as class - * - * @param string $class_name Optional class name. - * - * @return Yoast_Plugin_Conflict - */ - public static function get_instance( $class_name = __CLASS__ ) { - return parent::get_instance( $class_name ); - } - - /** - * After activating any plugin, this method will be executed by a hook. - * - * If the activated plugin is conflicting with ours a notice will be shown. - * - * @param string|bool $plugin Optional plugin basename to check. - */ - public static function hook_check_for_plugin_conflicts( $plugin = false ) { - - // The instance of itself. - $instance = self::get_instance(); - - // Only add plugin as active plugin if $plugin isn't false. - if ( $plugin && is_string( $plugin ) ) { - // Because it's just activated. - $instance->add_active_plugin( $instance->find_plugin_category( $plugin ), $plugin ); - } - - $plugin_sections = array(); - - // Only check for open graph problems when they are enabled. - $social_options = WPSEO_Options::get_option( 'wpseo_social' ); - if ( $social_options['opengraph'] ) { - /* translators: %1$s expands to Yoast SEO, %2%s: 'Facebook' plugin name of possibly conflicting plugin with regard to creating OpenGraph output. */ - $plugin_sections['open_graph'] = __( 'Both %1$s and %2$s create OpenGraph output, which might make Facebook, Twitter, LinkedIn and other social networks use the wrong texts and images when your pages are being shared.', 'wordpress-seo' ) - . '

    ' - . '' - /* translators: %1$s expands to Yoast SEO. */ - . sprintf( __( 'Configure %1$s\'s OpenGraph settings', 'wordpress-seo' ), 'Yoast SEO' ) - . ''; - } - - // Only check for XML conflicts if sitemaps are enabled. - $xml_sitemap_options = WPSEO_Options::get_option( 'wpseo_xml' ); - if ( $xml_sitemap_options['enablexmlsitemap'] ) { - /* translators: %1$s expands to Yoast SEO, %2$s: 'Google XML Sitemaps' plugin name of possibly conflicting plugin with regard to the creation of sitemaps. */ - $plugin_sections['xml_sitemaps'] = __( 'Both %1$s and %2$s can create XML sitemaps. Having two XML sitemaps is not beneficial for search engines, yet might slow down your site.', 'wordpress-seo' ) - . '

    ' - . '' - /* translators: %1$s expands to Yoast SEO. */ - . sprintf( __( 'Configure %1$s\'s XML Sitemap settings', 'wordpress-seo' ), 'Yoast SEO' ) - . ''; - } - - /* translators: %2$s expands to 'RS Head Cleaner' plugin name of possibly conflicting plugin with regard to differentiating output between search engines and normal users. */ - $plugin_sections['cloaking'] = __( 'The plugin %2$s changes your site\'s output and in doing that differentiates between search engines and normal users, a process that\'s called cloaking. We highly recommend that you disable it.', 'wordpress-seo' ); - - $instance->check_plugin_conflicts( $plugin_sections ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-premium-popup.php b/wp/wp-content/plugins/wordpress-seo/admin/class-premium-popup.php deleted file mode 100644 index 173c13f7..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-premium-popup.php +++ /dev/null @@ -1,89 +0,0 @@ -identifier = $identifier; - $this->heading_level = $heading_level; - $this->title = $title; - $this->content = $content; - } - - /** - * Returns the premium popup as an HTML string. - * - * @param bool $popup Show this message as a popup show it straight away. - * - * @return string - */ - public function get_premium_message( $popup = true ) { - // Don't show in Premium. - if ( defined( 'WPSEO_PREMIUM_FILE' ) ) { - return ''; - } - - $assets_uri = trailingslashit( plugin_dir_url( WPSEO_FILE ) ); - $premium_uri = WPSEO_Shortlinker::get( 'https://yoa.st/contact-support' ); - - /* translators: %s expands to Yoast SEO Premium */ - $cta_text = sprintf( __( 'Get %s now!', 'wordpress-seo' ), 'Yoast SEO Premium' ); - $classes = ''; - if ( $popup ) { - $classes = ' hidden'; - } - $micro_copy = __( '1 year free updates and upgrades included!', 'wordpress-seo' ); - - $popup = << - Yoast SEO - <{$this->heading_level} id="wpseo-contact-support-popup-title" class="wpseo-premium-popup-title">{$this->title}heading_level}> - {$this->content} - {$cta_text}
    - {$micro_copy} - -EO_POPUP; - - return $popup; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-primary-term-admin.php b/wp/wp-content/plugins/wordpress-seo/admin/class-primary-term-admin.php deleted file mode 100644 index b3d988dd..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-primary-term-admin.php +++ /dev/null @@ -1,226 +0,0 @@ -register_hooks(); - } - - /** - * Get the current post ID. - * - * @return integer The post ID. - */ - protected function get_current_id() { - return filter_input( INPUT_GET, 'post', FILTER_SANITIZE_NUMBER_INT ); - } - - /** - * Add primary term templates - */ - public function wp_footer() { - $taxonomies = $this->get_primary_term_taxonomies(); - - if ( ! empty( $taxonomies ) ) { - $this->include_js_templates(); - } - } - - /** - * Enqueues all the assets needed for the primary term interface - * - * @return void - */ - public function enqueue_assets() { - global $pagenow; - - if ( ! WPSEO_Metabox::is_post_edit( $pagenow ) ) { - return; - } - - $taxonomies = $this->get_primary_term_taxonomies(); - - // Only enqueue if there are taxonomies that need a primary term. - if ( empty( $taxonomies ) ) { - return; - } - - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_style( 'primary-category' ); - $asset_manager->enqueue_script( 'primary-category' ); - - $taxonomies = array_map( array( $this, 'map_taxonomies_for_js' ), $taxonomies ); - - $data = array( - 'taxonomies' => $taxonomies, - ); - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'primary-category', 'wpseoPrimaryCategoryL10n', $data ); - } - - /** - * Saves all selected primary terms - * - * @param int $post_id Post ID to save primary terms for. - */ - public function save_primary_terms( $post_id ) { - // Bail if this is a multisite installation and the site has been switched. - if ( is_multisite() && ms_is_switched() ) { - return; - } - - $taxonomies = $this->get_primary_term_taxonomies( $post_id ); - - foreach ( $taxonomies as $taxonomy ) { - $this->save_primary_term( $post_id, $taxonomy ); - } - } - - /** - * /** - * Get the id of the primary term - * - * @param string $taxonomy_name Taxonomy name for the term. - * - * @return int primary term id - */ - protected function get_primary_term( $taxonomy_name ) { - $primary_term = new WPSEO_Primary_Term( $taxonomy_name, $this->get_current_id() ); - - return $primary_term->get_primary_term(); - } - - /** - * Returns all the taxonomies for which the primary term selection is enabled - * - * @param int $post_id Default current post ID. - * @return array - */ - protected function get_primary_term_taxonomies( $post_id = null ) { - - if ( null === $post_id ) { - $post_id = $this->get_current_id(); - } - - if ( false !== ( $taxonomies = wp_cache_get( 'primary_term_taxonomies_' . $post_id, 'wpseo' ) ) ) { - return $taxonomies; - } - - $taxonomies = $this->generate_primary_term_taxonomies( $post_id ); - - wp_cache_set( 'primary_term_taxonomies_' . $post_id, $taxonomies, 'wpseo' ); - - return $taxonomies; - } - - /** - * Include templates file - */ - protected function include_js_templates() { - include_once WPSEO_PATH . '/admin/views/js-templates-primary-term.php'; - } - - /** - * Save the primary term for a specific taxonomy - * - * @param int $post_id Post ID to save primary term for. - * @param WP_Term $taxonomy Taxonomy to save primary term for. - */ - protected function save_primary_term( $post_id, $taxonomy ) { - $primary_term = filter_input( INPUT_POST, WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy->name . '_term', FILTER_SANITIZE_NUMBER_INT ); - - // We accept an empty string here because we need to save that if no terms are selected. - if ( null !== $primary_term && check_admin_referer( 'save-primary-term', WPSEO_Meta::$form_prefix . 'primary_' . $taxonomy->name . '_nonce' ) ) { - $primary_term_object = new WPSEO_Primary_Term( $taxonomy->name, $post_id ); - $primary_term_object->set_primary_term( $primary_term ); - } - } - - /** - * Generate the primary term taxonomies. - * - * @param int $post_id ID of the post. - * - * @return array - */ - protected function generate_primary_term_taxonomies( $post_id ) { - $post_type = get_post_type( $post_id ); - $all_taxonomies = get_object_taxonomies( $post_type, 'objects' ); - $all_taxonomies = array_filter( $all_taxonomies, array( $this, 'filter_hierarchical_taxonomies' ) ); - - /** - * Filters which taxonomies for which the user can choose the primary term. - * - * @api array $taxonomies An array of taxonomy objects that are primary_term enabled. - * - * @param string $post_type The post type for which to filter the taxonomies. - * @param array $all_taxonomies All taxonomies for this post types, even ones that don't have primary term - * enabled. - */ - $taxonomies = (array) apply_filters( 'wpseo_primary_term_taxonomies', $all_taxonomies, $post_type, $all_taxonomies ); - - return $taxonomies; - } - - /** - * Returns an array suitable for use in the javascript - * - * @param stdClass $taxonomy The taxonomy to map. - * - * @return array - */ - private function map_taxonomies_for_js( $taxonomy ) { - $primary_term = $this->get_primary_term( $taxonomy->name ); - - if ( empty( $primary_term ) ) { - $primary_term = ''; - } - - return array( - 'title' => $taxonomy->labels->singular_name, - 'name' => $taxonomy->name, - 'primary' => $primary_term, - 'terms' => array_map( array( $this, 'map_terms_for_js' ), get_terms( $taxonomy->name ) ), - ); - } - - /** - * Returns an array suitable for use in the javascript - * - * @param stdClass $term The term to map. - * - * @return array - */ - private function map_terms_for_js( $term ) { - return array( - 'id' => $term->term_id, - 'name' => $term->name, - ); - } - - /** - * Returns whether or not a taxonomy is hierarchical - * - * @param stdClass $taxonomy Taxonomy object. - * - * @return bool - */ - private function filter_hierarchical_taxonomies( $taxonomy ) { - return (bool) $taxonomy->hierarchical; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-product-upsell-notice.php b/wp/wp-content/plugins/wordpress-seo/admin/class-product-upsell-notice.php deleted file mode 100644 index bed4eefd..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-product-upsell-notice.php +++ /dev/null @@ -1,201 +0,0 @@ -options = $this->get_options(); - } - - /** - * Checks if the notice should be added or removed. - */ - public function initialize() { - if ( $this->is_notice_dismissed() ) { - $this->remove_notification(); - - return; - } - - if ( $this->should_add_notification() ) { - $this->add_notification(); - } - } - - /** - * Sets the upgrade notice. - */ - public function set_upgrade_notice() { - - if ( $this->has_first_activated_on() ) { - return; - } - - $this->set_first_activated_on(); - $this->add_notification(); - } - - /** - * Listener for the upsell notice. - */ - public function dismiss_notice_listener() { - if ( filter_input( INPUT_GET, 'yoast_dismiss' ) !== 'upsell' ) { - return; - } - - $this->dismiss_notice(); - - wp_redirect( admin_url( 'admin.php?page=wpseo_dashboard' ) ); - exit; - } - - /** - * When the notice should be shown. - * - * @return bool - */ - protected function should_add_notification() { - return ( $this->options['first_activated_on'] < strtotime( '-2weeks' ) ); - } - - /** - * Checks if the options has a first activated on date value. - */ - protected function has_first_activated_on() { - return $this->options['first_activated_on'] !== false; - } - - /** - * Sets the first activated on. - */ - protected function set_first_activated_on() { - $this->options['first_activated_on'] = strtotime( '-2weeks' ); - - $this->save_options(); - } - - /** - * Adds a notification to the notification center. - */ - protected function add_notification() { - $notification_center = Yoast_Notification_Center::get(); - $notification_center->add_notification( $this->get_notification() ); - } - - /** - * Adds a notification to the notification center. - */ - protected function remove_notification() { - $notification_center = Yoast_Notification_Center::get(); - $notification_center->remove_notification( $this->get_notification() ); - } - - /** - * Returns a premium upsell section if using the free plugin. - * - * @return string - */ - protected function get_premium_upsell_section() { - $features = new WPSEO_Features(); - if ( $features->is_free() ) { - return sprintf( - /* translators: %1$s expands anchor to premium plugin page, %2$s expands to */ - __( 'By the way, did you know we also have a %1$sPremium plugin%2$s? It offers advanced features, like a redirect manager and support for multiple keywords. It also comes with 24/7 personal support.' , 'wordpress-seo' ), - "", - '' - ); - } - - return ''; - } - - /** - * Gets the notification value. - * - * @return Yoast_Notification - */ - protected function get_notification() { - $message = sprintf( - /* translators: %1$s expands to Yoast SEO, %2$s is a link start tag to the plugin page on WordPress.org, %3$s is the link closing tag. */ - __( 'We\'ve noticed you\'ve been using %1$s for some time now; we hope you love it! We\'d be thrilled if you could %2$sgive us a 5 stars rating on WordPress.org%3$s!', 'wordpress-seo' ), - 'Yoast SEO', - '', - '' - ) . "\n\n"; - - $message .= sprintf( - /* translators: %1$s is a link start tag to the bugreport guidelines on the Yoast knowledge base, %2$s is the link closing tag. */ - __( 'If you are experiencing issues, %1$splease file a bug report%2$s and we\'ll do our best to help you out.', 'wordpress-seo' ), - '', - '' - ) . "\n\n"; - - $message .= $this->get_premium_upsell_section() . "\n\n"; - - $message .= sprintf( - /* translators: %1$s is the notification dismissal link start tag, %2$s is the link closing tag. */ - __( '%1$sPlease don\'t show me this notification anymore%2$s', 'wordpress-seo' ), - '', - '' - ); - - $notification = new Yoast_Notification( - $message, - array( - 'type' => Yoast_Notification::WARNING, - 'id' => 'wpseo-upsell-notice', - 'capabilities' => 'manage_options', - 'priority' => 0.8, - ) - ); - - return $notification; - } - - /** - * Dismisses the notice. - * - * @return string - */ - protected function is_notice_dismissed() { - return get_user_meta( get_current_user_id(), self::USER_META_DISMISSED, true ) === '1'; - } - - /** - * Dismisses the notice. - */ - protected function dismiss_notice() { - update_user_meta( get_current_user_id(), self::USER_META_DISMISSED, true ); - } - - /** - * Returns the set options - * - * @return mixed|void - */ - protected function get_options() { - return get_option( self::OPTION_NAME ); - } - - /** - * Saves the options to the database. - */ - protected function save_options() { - update_option( self::OPTION_NAME, $this->options ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-recalculate-scores.php b/wp/wp-content/plugins/wordpress-seo/admin/class-recalculate-scores.php deleted file mode 100644 index 4e1a72fb..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-recalculate-scores.php +++ /dev/null @@ -1,52 +0,0 @@ -enqueue_script( 'recalculate' ); - } - - /** - * Initialize the modal box to be displayed when needed. - */ - public function modal_box() { - // Adding the thickbox. - add_thickbox(); - - $progress = sprintf( - /* translators: 1: expands to a containing the number of posts recalculated. 2: expands to a containing the total number of posts. */ - __( '%1$s of %2$s done.', 'wordpress-seo' ), - '0', - '0' - ); - - ?> - - options = WPSEO_Options::get_option( 'wpseo_social' ); - self::translate_meta_boxes(); - add_filter( 'wpseo_save_metaboxes', array( $this, 'save_meta_boxes' ), 10, 1 ); - add_action( 'wpseo_save_compare_data', array( $this, 'og_data_compare' ), 10, 1 ); - } - - /** - * Translate text strings for use in the meta box - * - * IMPORTANT: if you want to add a new string (option) somewhere, make sure you add that array key to - * the main meta box definition array in the class WPSEO_Meta() as well!!!! - */ - public static function translate_meta_boxes() { - /* translators: %s expands to the social network's name */ - $title_text = __( 'If you don\'t want to use the post title for sharing the post on %s but instead want another title there, write it here.', 'wordpress-seo' ); - /* translators: %s expands to the social network's name */ - $description_text = __( 'If you don\'t want to use the meta description for sharing the post on %s but want another description there, write it here.', 'wordpress-seo' ); - /* translators: %s expands to the social network's name */ - $image_text = __( 'If you want to override the image used on %s for this post, upload / choose an image or add the URL here.', 'wordpress-seo' ); - /* translators: %1$s expands to the social network, %2$s to the recommended image size */ - $image_size_text = __( 'The recommended image size for %1$s is %2$s pixels.', 'wordpress-seo' ); - - $options = WPSEO_Options::get_option( 'wpseo_social' ); - - $social_networks = array( - 'opengraph' => __( 'Facebook', 'wordpress-seo' ), - 'twitter' => __( 'Twitter', 'wordpress-seo' ), - ); - - // Source: https://blog.bufferapp.com/ideal-image-sizes-social-media-posts. - $recommended_image_sizes = array( - /* translators: %1$s expands to the image recommended width, %2$s to its height. */ - 'opengraph' => sprintf( __( '%1$s by %2$s', 'wordpress-seo' ), '1200', '630' ), // Source: https://developers.facebook.com/docs/sharing/best-practices#images. - /* translators: %1$s expands to the image recommended width, %2$s to its height. */ - 'twitter' => sprintf( __( '%1$s by %2$s', 'wordpress-seo' ), '1024', '512' ), - ); - - foreach ( $social_networks as $network => $label ) { - if ( true === $options[ $network ] ) { - - self::$meta_fields['social'][ $network . '-title' ]['title'] = sprintf( __( '%s Title', 'wordpress-seo' ), $label ); - self::$meta_fields['social'][ $network . '-title' ]['description'] = sprintf( $title_text, $label ); - - self::$meta_fields['social'][ $network . '-description' ]['title'] = sprintf( __( '%s Description', 'wordpress-seo' ), $label ); - self::$meta_fields['social'][ $network . '-description' ]['description'] = sprintf( $description_text, $label ); - - self::$meta_fields['social'][ $network . '-image' ]['title'] = sprintf( __( '%s Image', 'wordpress-seo' ), $label ); - self::$meta_fields['social'][ $network . '-image' ]['description'] = sprintf( $image_text, $label ) . ' ' . sprintf( $image_size_text, $label, $recommended_image_sizes[ $network ] ); - } - } - } - - /** - * Returns the metabox section for the social settings. - * - * @return WPSEO_Metabox_Tab_Section - */ - public function get_meta_section() { - $tabs = array(); - $social_meta_fields = $this->get_meta_field_defs( 'social' ); - $single = true; - - if ( $this->options['opengraph'] === true && $this->options['twitter'] === true ) { - $single = null; - } - - if ( $this->options['opengraph'] === true ) { - $tabs[] = new WPSEO_Metabox_Form_Tab( - 'facebook', - $this->get_social_tab_content( 'opengraph', $social_meta_fields ), - '' . __( 'Facebook / Open Graph metadata', 'wordpress-seo' ) . '', - array( - 'link_aria_label' => __( 'Facebook / Open Graph metadata', 'wordpress-seo' ), - 'link_class' => 'yoast-tooltip yoast-tooltip-se', - 'single' => $single, - ) - ); - } - - if ( $this->options['twitter'] === true ) { - $tabs[] = new WPSEO_Metabox_Form_Tab( - 'twitter', - $this->get_social_tab_content( 'twitter', $social_meta_fields ), - '' . __( 'Twitter metadata', 'wordpress-seo' ) . '', - array( - 'link_aria_label' => __( 'Twitter metadata', 'wordpress-seo' ), - 'link_class' => 'yoast-tooltip yoast-tooltip-se', - 'single' => $single, - ) - ); - } - - return new WPSEO_Metabox_Tab_Section( - 'social', - '' . __( 'Social', 'wordpress-seo' ) . '', - $tabs, - array( - 'link_aria_label' => __( 'Social', 'wordpress-seo' ), - 'link_class' => 'yoast-tooltip yoast-tooltip-e', - ) - ); - } - - /** - * Generates the html for a social settings tab for one of the supported social media. - * - * @param string $medium can be 'opengraph' or 'twitter'. - * @param array $meta_field_defs The social meta field definitions. - * - * @return string - */ - private function get_social_tab_content( $medium, $meta_field_defs ) { - $field_names = array( - $medium . '-title', - $medium . '-description', - $medium . '-image', - ); - - $tab_content = ''; - - foreach ( $field_names as $field_name ) { - $tab_content .= $this->do_meta_box( $meta_field_defs[ $field_name ], $field_name ); - } - - return $tab_content; - } - - /** - * Filter over the meta boxes to save, this function adds the Social meta boxes. - * - * @param array $field_defs Array of metaboxes to save. - * - * @return array - */ - public function save_meta_boxes( $field_defs ) { - return array_merge( $field_defs, $this->get_meta_field_defs( 'social' ) ); - } - - /** - * This method will compare opengraph fields with the posted values. - * - * When fields are changed, the facebook cache will be purge. - * - * @param WP_Post $post Post instance. - */ - public function og_data_compare( $post ) { - - // Check if post data is available, if post_id is set and if original post_status is publish. - if ( - ! empty( $_POST ) && ! empty( $post->ID ) && $post->post_status == 'publish' && - isset( $_POST['original_post_status'] ) && $_POST['original_post_status'] === 'publish' - ) { - - $fields_to_compare = array( - 'opengraph-title', - 'opengraph-description', - 'opengraph-image', - ); - - $reset_facebook_cache = false; - - foreach ( $fields_to_compare as $field_to_compare ) { - $old_value = self::get_value( $field_to_compare, $post->ID ); - $new_value = self::get_post_value( self::$form_prefix . $field_to_compare ); - - if ( $old_value !== $new_value ) { - $reset_facebook_cache = true; - break; - } - } - unset( $field_to_compare, $old_value, $new_value ); - - if ( $reset_facebook_cache ) { - wp_remote_get( - 'https://graph.facebook.com/?id=' . get_permalink( $post->ID ) . '&scrape=true&method=post' - ); - } - } - } - - - /********************** DEPRECATED METHODS **********************/ - - // @codeCoverageIgnoreStart - /** - * Define the meta boxes for the Social tab - * - * @deprecated 1.5.0 - * @deprecated use WPSEO_Meta::get_meta_field_defs() - * @see WPSEO_Meta::get_meta_field_defs() - * - * @param string $post_type Optional post type string. - * - * @return array Array containing the meta boxes - */ - public function get_meta_boxes( $post_type = 'post' ) { - _deprecated_function( __METHOD__, 'WPSEO 1.5.0', 'WPSEO_Meta::get_meta_field_defs()' ); - - return $this->get_meta_field_defs( 'social' ); - } - - /** - * @deprecated 3.0 Removed. - * - * @return string - */ - public function tab_header() { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - return ''; - } - - /** - * @deprecated 3.0 Removed. - * - * @return string - */ - public function tab_content() { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - return ''; - } - // @codeCoverageIgnoreEnd -} /* End of class */ diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-social-facebook.php b/wp/wp-content/plugins/wordpress-seo/admin/class-social-facebook.php deleted file mode 100644 index 4d7f7fdd..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-social-facebook.php +++ /dev/null @@ -1,480 +0,0 @@ -options = get_option( 'wpseo_social' ); - - $this->get_listener(); - - $this->form = new Yoast_Social_Facebook_Form(); - } - - /** - * Returns the output from the form class - */ - public function show_form() { - $this->form->show_form(); - } - - /** - * Adding a new admin - * - * @param string $admin_name Name string. - * @param string $admin_id ID string. - * - * @return string - */ - public function add_admin( $admin_name, $admin_id ) { - $success = 0; - - // If one of the fields is empty. - if ( empty( $admin_name ) || empty( $admin_id ) ) { - $response_body = $this->get_response_body( 'not_present' ); - } - else { - $admin_id = $this->parse_admin_id( $admin_id ); - - if ( ! isset( $this->options['fb_admins'][ $admin_id ] ) ) { - $name = sanitize_text_field( urldecode( $admin_name ) ); - $admin_id = sanitize_text_field( $admin_id ); - - if ( preg_match( '/[0-9]+?/', $admin_id ) && preg_match( '/[\w\s]+?/', $name ) ) { - $this->options['fb_admins'][ $admin_id ]['name'] = $name; - $this->options['fb_admins'][ $admin_id ]['link'] = urldecode( 'http://www.facebook.com/' . $admin_id ); - - $this->save_options(); - - $success = 1; - $response_body = $this->form->get_admin_link( $admin_id, $this->options['fb_admins'][ $admin_id ] ); - } - else { - $response_body = $this->get_response_body( 'invalid_format' ); - } - } - else { - $response_body = $this->get_response_body( 'already_exists' ); - } - } - - return wp_json_encode( - array( - 'success' => $success, - 'html' => $response_body, - ) - ); - } - - /** - * Fetches the id if the full meta tag or a full url was given - * - * @param string $admin_id Admin ID input string to process. - * - * @return string - */ - private function parse_admin_id( $admin_id ) { - if ( preg_match( '/^\

    '; - break; - case 'invalid_format': - $return = "

    " . __( 'Your input contains invalid characters. Please make sure both fields are filled in correctly.', 'wordpress-seo' ) . '

    '; - break; - case 'already_exists': - $return = "

    " . __( 'This Facebook user has already been added as an admin.', 'wordpress-seo' ) . '

    '; - break; - default: - $return = ''; - break; - } - - return $return; - } - - /** - * This method will hook into the defined get params - */ - private function get_listener() { - if ( $delfbadmin = filter_input( INPUT_GET, 'delfbadmin' ) ) { - $this->delete_admin( $delfbadmin ); - } - elseif ( filter_input( INPUT_GET, 'fbclearall' ) ) { - $this->clear_all(); - } - } - - /** - * Deletes the admin from the options - * - * @param string $delfbadmin Facebook admin ID. - */ - private function delete_admin( $delfbadmin ) { - $this->verify_nonce( 'delfbadmin' ); - - $admin_id = sanitize_text_field( $delfbadmin ); - if ( isset( $this->options['fb_admins'][ $admin_id ] ) ) { - $fbadmin = $this->options['fb_admins'][ $admin_id ]['name']; - unset( $this->options['fb_admins'][ $admin_id ] ); - - $this->save_options(); - $this->success_notice( sprintf( __( 'Successfully removed admin %s', 'wordpress-seo' ), $fbadmin ) ); - - unset( $fbadmin ); - } - - unset( $admin_id ); - - // Clean up the referrer url for later use. - if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { - $this->cleanup_referrer_url( 'nonce', 'delfbadmin' ); - } - } - - /** - * Clear all the facebook that has been set already - */ - private function clear_all() { - $this->verify_nonce( 'fbclearall' ); - - // Reset to defaults, don't unset as otherwise the old values will be retained. - $this->options['fb_admins'] = WPSEO_Options::get_default( 'wpseo_social', 'fb_admins' ); - - $this->save_options(); - $this->success_notice( __( 'Successfully cleared all Facebook Data', 'wordpress-seo' ) ); - - // Clean up the referrer url for later use. - if ( ! empty( $_SERVER['REQUEST_URI'] ) ) { - $this->cleanup_referrer_url( 'nonce', 'fbclearall' ); - } - } - - /** - * Clean up the request_uri. The given params are the params that will be removed from the URL - */ - private function cleanup_referrer_url() { - $_SERVER['REQUEST_URI'] = remove_query_arg( - func_get_args(), - sanitize_text_field( $_SERVER['REQUEST_URI'] ) - ); - } - - /** - * When something is going well, show a success notice - * - * @param string $notice_text Message string. - */ - private function success_notice( $notice_text ) { - add_settings_error( 'yoast_wpseo_social_options', 'success', $notice_text, 'updated' ); - } - - /** - * Verify the nonce from the URL with the saved nonce - * - * @param string $nonce_name Nonce name string. - */ - private function verify_nonce( $nonce_name ) { - if ( wp_verify_nonce( filter_input( INPUT_GET, 'nonce' ), $nonce_name ) != 1 ) { - die( "I don't think that's really nice of you!." ); - } - } - - /** - * Saving the options - */ - private function save_options() { - update_option( 'wpseo_social', $this->options ); - } -} - -/** - * This will display the HTML for the facebook insights part - */ -class Yoast_Social_Facebook_Form { - - /** - * @var array - The options for social - */ - private $options; - - /** - * @var array - The repository for the buttons that will be shown - */ - private $buttons = array(); - - /** - * @var string - The URL to link to - */ - private $admin_url = 'admin.php?page=wpseo_social'; - - /** - * Setting the options and call the methods to display everything - */ - public function __construct() { - $this->options = get_option( 'wpseo_social' ); - } - - /** - * Returns the output-property - */ - public function show_form() { - $this - ->form_head() - ->manage_user_admin() - ->form_thickbox() - ->show_buttons() - ->manage_app_as_admin(); - } - - /** - * Parses the admin_link - * - * @param string $admin_id Facebook admin ID string. - * @param array $admin Admin data array. - * @param string|bool $nonce Optional nonce string. - * - * @return string - */ - public function get_admin_link( $admin_id, $admin, $nonce = false ) { - if ( $nonce === false ) { - $nonce = $this->get_delete_nonce(); - } - - $return = '
  5. ' . esc_html( $admin['name'] ) . ''; - $return .= ' - X
  6. '; - - return $return; - } - - /** - * SHow the top of the social insights part of the page - * - * @return $this - */ - private function form_head() { - echo '

    ' . esc_html__( 'Facebook Insights and Admins', 'wordpress-seo' ) . '

    '; - echo '

    ', sprintf( - /* translators: %1$s and %2$s expand to a link to Facebook Insights */ - esc_html__( 'To be able to access %1$sFacebook Insights%2$s for your site, you need to specify a Facebook Admin. This can be a user. If you have an app for your site, you could use that as well.', 'wordpress-seo' ), - '', - '' - ); - echo ' '; - /* translators: %1$s and %2$s expand to a link to the Yoast Knowledge Base */ - printf( __( 'More info can be found %1$son our knowledge base%2$s.', 'wordpress-seo' ), '', '' ); - echo '

    '; - - return $this; - } - - /** - * Show the form inside the thickbox - */ - private function form_thickbox() { - // Adding the thickbox. - add_thickbox(); - - echo ''; - - return $this; - } - - /** - * Display the buttons to add an admin or add another admin from Facebook and display the admin that has been added already. - * - * @return $this - */ - private function manage_user_admin() { - $button_text = __( 'Add Facebook admin', 'wordpress-seo' ); - $nonce = false; - $class_attr = ' class="hidden"'; - - if ( is_array( $this->options['fb_admins'] ) && $this->options['fb_admins'] !== array() ) { - $nonce = $this->get_delete_nonce(); - $button_text = __( 'Add Another Facebook Admin', 'wordpress-seo' ); - $class_attr = ''; - } - - echo "
    "; - echo '

    ' . __( 'Currently connected Facebook admins:', 'wordpress-seo' ) . '

    '; - echo '
      '; - $this->show_user_admins( $nonce ); - echo '
    '; - echo '
    '; - - unset( $nonce ); - - $this->add_button( - array( - 'url' => '#TB_inline?width=600&height=350&inlineId=add_facebook_admin', - 'value' => $button_text, - 'class' => 'thickbox', - 'title' => $button_text, - ) - ); - - return $this; - } - - /** - * Show input field to set a facebook apps as an admin - * - * @return $this - */ - private function manage_app_as_admin() { - echo '

    '; - Yoast_Form::get_instance()->textinput( 'fbadminapp', __( 'Facebook App ID', 'wordpress-seo' ) ); - - return $this; - } - - /** - * Loop through the fb-admins to parse the output for them - * - * @param string $nonce Nonce string. - */ - private function show_user_admins( $nonce ) { - foreach ( $this->options['fb_admins'] as $admin_id => $admin ) { - echo $this->get_admin_link( $admin_id, $admin, $nonce ); - } - } - - /** - * Parsing the link that directs to the admin removal - * - * @param string $admin_id Facebook admin ID. - * @param string $nonce Nonce string. - * - * @return string - */ - private function admin_delete_link( $admin_id, $nonce ) { - return esc_url( - add_query_arg( - array( - 'delfbadmin' => esc_attr( $admin_id ), - 'nonce' => $nonce, - ), - admin_url( $this->admin_url . '#top#facebook' ) - ) - ); - } - - /** - * Adding a button to the button property - * - * @param array $args Arguments data array. - */ - private function add_button( $args ) { - $args = wp_parse_args( - $args, - array( - 'url' => '', - 'value' => '', - 'class' => '', - 'id' => '', - 'title' => '', - - ) - ); - - $this->buttons[] = '' . esc_html( $args['value'] ) . ''; - } - - /** - * Showing the buttons - */ - private function show_buttons() { - if ( $this->get_clearall() ) { - $this->add_button( - array( - 'url' => add_query_arg( array( - 'nonce' => wp_create_nonce( 'fbclearall' ), - 'fbclearall' => 'true', - ), admin_url( $this->admin_url . '#top#facebook' ) ), - 'value' => __( 'Clear all Facebook Data', 'wordpress-seo' ), - ) - ); - } - - if ( is_array( $this->buttons ) && $this->buttons !== array() ) { - echo '

    ' . implode( '', $this->buttons ) . '

    '; - } - - return $this; - } - - /** - * Check if the clear button should be displayed. This is based on the set options. - * - * @return bool - */ - private function get_clearall() { - return is_array( $this->options['fb_admins'] ) && $this->options['fb_admins'] !== array(); - } - - /** - * Creates nonce for removal link - * - * @return mixed - */ - private function get_delete_nonce() { - return wp_create_nonce( 'delfbadmin' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-stop-words.php b/wp/wp-content/plugins/wordpress-seo/admin/class-stop-words.php deleted file mode 100644 index ca0ef009..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-stop-words.php +++ /dev/null @@ -1,52 +0,0 @@ -list_stop_words() ); - - // Don't change the slug if there are less than 3 words left. - if ( count( $new_slug_parts ) < 3 ) { - return $original_slug; - } - - // Turn the sanitized array into a string. - $new_slug = join( '-', $new_slug_parts ); - - return $new_slug; - } - - /** - * Returns a translated, filtered list of stop words - * - * @return array An array of stop words. - */ - public function list_stop_words() { - /* translators: this should be an array of stop words for your language, separated by comma's. */ - $stopwords = explode( ',', __( "a,about,above,after,again,against,all,am,an,and,any,are,as,at,be,because,been,before,being,below,between,both,but,by,could,did,do,does,doing,down,during,each,few,for,from,further,had,has,have,having,he,he'd,he'll,he's,her,here,here's,hers,herself,him,himself,his,how,how's,i,i'd,i'll,i'm,i've,if,in,into,is,it,it's,its,itself,let's,me,more,most,my,myself,nor,of,on,once,only,or,other,ought,our,ours,ourselves,out,over,own,same,she,she'd,she'll,she's,should,so,some,such,than,that,that's,the,their,theirs,them,themselves,then,there,there's,these,they,they'd,they'll,they're,they've,this,those,through,to,too,under,until,up,very,was,we,we'd,we'll,we're,we've,were,what,what's,when,when's,where,where's,which,while,who,who's,whom,why,why's,with,would,you,you'd,you'll,you're,you've,your,yours,yourself,yourselves", 'wordpress-seo' ) ); - - /** - * Allows filtering of the stop words list - * Especially useful for users on a language in which WPSEO is not available yet - * and/or users who want to turn off stop word filtering - * - * @api array $stopwords Array of all lowercase stop words to check and/or remove from slug - */ - $stopwords = apply_filters( 'wpseo_stopwords', $stopwords ); - - return $stopwords; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-alerts.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-alerts.php deleted file mode 100644 index 317d4666..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-alerts.php +++ /dev/null @@ -1,258 +0,0 @@ -add_hooks(); - } - - /** - * Add hooks - */ - private function add_hooks() { - - $page = filter_input( INPUT_GET, 'page' ); - if ( self::ADMIN_PAGE === $page ) { - add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) ); - } - - // Needed for adminbar and Alerts page. - add_action( 'admin_init', array( __CLASS__, 'collect_alerts' ), 99 ); - - // Add AJAX hooks. - add_action( 'wp_ajax_yoast_dismiss_alert', array( $this, 'ajax_dismiss_alert' ) ); - add_action( 'wp_ajax_yoast_restore_alert', array( $this, 'ajax_restore_alert' ) ); - } - - /** - * Enqueue assets - */ - public function enqueue_assets() { - - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_style( 'alerts' ); - } - - /** - * Handle ajax request to dismiss an alert - */ - public function ajax_dismiss_alert() { - - $notification = $this->get_notification_from_ajax_request(); - if ( $notification ) { - $notification_center = Yoast_Notification_Center::get(); - $notification_center->maybe_dismiss_notification( $notification ); - - $this->output_ajax_response( $notification->get_type() ); - } - - wp_die(); - } - - /** - * Handle ajax request to restore an alert - */ - public function ajax_restore_alert() { - - $notification = $this->get_notification_from_ajax_request(); - if ( $notification ) { - delete_user_meta( get_current_user_id(), $notification->get_dismissal_key() ); - - $this->output_ajax_response( $notification->get_type() ); - } - - wp_die(); - } - - /** - * Create AJAX response data - * - * @param string $type Alert type. - */ - private function output_ajax_response( $type ) { - - $html = $this->get_view_html( $type ); - echo wp_json_encode( - array( - 'html' => $html, - 'total' => self::get_active_alert_count(), - ) - ); - } - - /** - * Get the HTML to return in the AJAX request - * - * @param string $type Alert type. - * - * @return bool|string - */ - private function get_view_html( $type ) { - - switch ( $type ) { - case 'error': - $view = 'errors'; - break; - - case 'warning': - default: - $view = 'warnings'; - break; - } - - // Re-collect alerts. - self::collect_alerts(); - - /** @noinspection PhpUnusedLocalVariableInspection */ - $alerts_data = self::get_template_variables(); - - ob_start(); - include WPSEO_PATH . 'admin/views/partial-alerts-' . $view . '.php'; - $html = ob_get_clean(); - - return $html; - } - - /** - * Extract the Yoast Notification from the AJAX request - * - * @return null|Yoast_Notification - */ - private function get_notification_from_ajax_request() { - - $notification_center = Yoast_Notification_Center::get(); - $notification_id = filter_input( INPUT_POST, 'notification' ); - - return $notification_center->get_notification_by_id( $notification_id ); - } - - /** - * Show the alerts overview page - */ - public static function show_overview_page() { - - /** @noinspection PhpUnusedLocalVariableInspection */ - $alerts_data = self::get_template_variables(); - - include WPSEO_PATH . 'admin/views/alerts-dashboard.php'; - } - - /** - * Collect the alerts and group them together - */ - public static function collect_alerts() { - - $notification_center = Yoast_Notification_Center::get(); - - $notifications = $notification_center->get_sorted_notifications(); - self::$notification_count = count( $notifications ); - - self::$errors = array_filter( $notifications, array( __CLASS__, 'filter_error_alerts' ) ); - self::$dismissed_errors = array_filter( self::$errors, array( __CLASS__, 'filter_dismissed_alerts' ) ); - self::$active_errors = array_diff( self::$errors, self::$dismissed_errors ); - - self::$warnings = array_filter( $notifications, array( __CLASS__, 'filter_warning_alerts' ) ); - self::$dismissed_warnings = array_filter( self::$warnings, array( __CLASS__, 'filter_dismissed_alerts' ) ); - self::$active_warnings = array_diff( self::$warnings, self::$dismissed_warnings ); - } - - /** - * Get the variables needed in the views - * - * @return array - */ - public static function get_template_variables() { - - return array( - 'metrics' => array( - 'total' => self::$notification_count, - 'active' => self::get_active_alert_count(), - 'errors' => count( self::$errors ), - 'warnings' => count( self::$warnings ), - ), - 'errors' => array( - 'dismissed' => self::$dismissed_errors, - 'active' => self::$active_errors, - ), - 'warnings' => array( - 'dismissed' => self::$dismissed_warnings, - 'active' => self::$active_warnings, - ), - ); - } - - /** - * Get the number of active alerts - * - * @return int - */ - public static function get_active_alert_count() { - - return ( count( self::$active_errors ) + count( self::$active_warnings ) ); - } - - /** - * Filter out any non-errors - * - * @param Yoast_Notification $notification Notification to test. - * - * @return bool - */ - private static function filter_error_alerts( Yoast_Notification $notification ) { - - return $notification->get_type() === 'error'; - } - - /** - * Filter out any non-warnings - * - * @param Yoast_Notification $notification Notification to test. - * - * @return bool - */ - private static function filter_warning_alerts( Yoast_Notification $notification ) { - - return $notification->get_type() !== 'error'; - } - - /** - * Filter out any dismissed notifications - * - * @param Yoast_Notification $notification Notification to test. - * - * @return bool - */ - private static function filter_dismissed_alerts( Yoast_Notification $notification ) { - - return Yoast_Notification_Center::is_notification_dismissed( $notification ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-dashboard-widget.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-dashboard-widget.php deleted file mode 100644 index a65eaf21..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-dashboard-widget.php +++ /dev/null @@ -1,204 +0,0 @@ -statistics = $statistics; - - add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_dashboard_stylesheet' ) ); - add_action( 'wp_insert_post', array( $this, 'clear_cache' ) ); - add_action( 'delete_post', array( $this, 'clear_cache' ) ); - - if ( $this->show_widget() ) { - add_action( 'wp_dashboard_setup', array( $this, 'add_dashboard_widget' ) ); - } - } - - /** - * Adds dashboard widget to WordPress - */ - public function add_dashboard_widget() { - add_filter( 'postbox_classes_dashboard_wpseo-dashboard-overview', array( $this, 'wpseo_dashboard_overview_class' ) ); - wp_add_dashboard_widget( - 'wpseo-dashboard-overview', - /* translators: %s is the plugin name */ - sprintf( __( '%s Posts Overview', 'wordpress-seo' ), 'Yoast SEO' ), - array( $this, 'display_dashboard_widget' ) - ); - } - - /** - * Adds CSS classes to the dashboard widget. - * - * @param array $classes An array of postbox CSS classes. - * - * @return array - */ - public function wpseo_dashboard_overview_class( $classes ) { - $classes[] = 'yoast wpseo-dashboard-overview'; - return $classes; - } - - /** - * Display the dashboard widget - */ - public function display_dashboard_widget() { - $statistics = $this->statistic_items(); - - $onpage_option = new WPSEO_OnPage_Option(); - $onpage = false; - if ( $onpage_option->is_enabled() ) { - $onpage = array( - 'indexable' => $onpage_option->get_status(), - 'can_fetch' => $onpage_option->should_be_fetched(), - ); - } - - include WPSEO_PATH . '/admin/views/dashboard-widget.php'; - } - - /** - * Enqueue's stylesheet for the dashboard if the current page is the dashboard - */ - public function enqueue_dashboard_stylesheet() { - $current_screen = get_current_screen(); - - if ( $current_screen instanceof WP_Screen && 'dashboard' === $current_screen->id ) { - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_style( 'wp-dashboard' ); - } - } - - /** - * Clears the dashboard widget items cache - */ - public function clear_cache() { - delete_transient( self::CACHE_TRANSIENT_KEY ); - } - - /** - * An array representing items to be added to the At a Glance dashboard widget - * - * @return array - */ - private function statistic_items() { - $transient = get_transient( self::CACHE_TRANSIENT_KEY ); - $user_id = get_current_user_id(); - - if ( isset( $transient[ $user_id ] ) ) { - return $transient[ $user_id ]; - } - - return $this->set_statistic_items_for_this_user( $transient ); - } - - /** - * Set the cache for a specific user - * - * @param array|boolean $transient The current stored transient with the cached data. - * - * @return mixed - */ - private function set_statistic_items_for_this_user( $transient ) { - if ( $transient === false ) { - $transient = array(); - } - - $user_id = get_current_user_id(); - $transient[ $user_id ] = array_filter( $this->get_seo_scores_with_post_count(), array( $this, 'filter_items' ) ); - - set_transient( self::CACHE_TRANSIENT_KEY, $transient, DAY_IN_SECONDS ); - - return $transient[ $user_id ]; - } - - /** - * Set the SEO scores belonging to their SEO score result - * - * @return array - */ - private function get_seo_scores_with_post_count() { - $ranks = WPSEO_Rank::get_all_ranks(); - - return array_map( array( $this, 'map_rank_to_widget' ), $ranks ); - } - - /** - * Converts a rank to data usable in the dashboard widget - * - * @param WPSEO_Rank $rank The rank to map. - * - * @return array - */ - private function map_rank_to_widget( WPSEO_Rank $rank ) { - return array( - 'seo_rank' => $rank->get_rank(), - 'title' => $this->get_title_for_rank( $rank ), - 'class' => 'wpseo-glance-' . $rank->get_css_class(), - 'icon_class' => $rank->get_css_class(), - 'count' => $this->statistics->get_post_count( $rank ), - ); - } - - /** - * Returns a dashboard widget label to use for a certain rank - * - * @param WPSEO_Rank $rank The rank to return a label for. - * - * @return string - */ - private function get_title_for_rank( WPSEO_Rank $rank ) { - $labels = array( - WPSEO_Rank::NO_FOCUS => __( 'Posts without focus keyword', 'wordpress-seo' ), - WPSEO_Rank::BAD => __( 'Posts with bad SEO score', 'wordpress-seo' ), - WPSEO_Rank::OK => __( 'Posts with OK SEO score', 'wordpress-seo' ), - WPSEO_Rank::GOOD => __( 'Posts with good SEO score', 'wordpress-seo' ), - /* translators: %s expands to noindex */ - WPSEO_Rank::NO_INDEX => sprintf( __( 'Posts that are set to “%s”', 'wordpress-seo' ), 'noindex' ), - ); - - return $labels[ $rank->get_rank() ]; - } - - /** - * Filter items if they have a count of zero - * - * @param array $item Data array. - * - * @return bool - */ - private function filter_items( $item ) { - return 0 !== $item['count']; - } - - /** - * Returns true when the dashboard widget should be shown. - * - * @return bool - */ - private function show_widget() { - $analysis_seo = new WPSEO_Metabox_Analysis_SEO(); - - return $analysis_seo->is_enabled() && current_user_can( 'edit_posts' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-form.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-form.php deleted file mode 100644 index e6c66dce..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-form.php +++ /dev/null @@ -1,546 +0,0 @@ - -
    - -

    -
    -
    - '; - settings_fields( $option_long_name ); - } - $this->set_option( $option ); - } - - /** - * Set the option used in output for form elements - * - * @since 2.0 - * - * @param string $option_name Option key. - */ - public function set_option( $option_name ) { - $this->option_name = $option_name; - $this->options = $this->get_option(); - } - - /** - * Retrieve options based on whether we're on multisite or not. - * - * @since 1.2.4 - * @since 2.0 Moved to this class. - * - * @return array - */ - private function get_option() { - if ( is_network_admin() ) { - return get_site_option( $this->option_name ); - } - - return get_option( $this->option_name ); - } - - /** - * Generates the footer for admin pages - * - * @since 2.0 - * - * @param bool $submit Whether or not a submit button and form end tag should be shown. - * @param bool $show_sidebar Whether or not to show the banner sidebar - used by premium plugins to disable it. - */ - public function admin_footer( $submit = true, $show_sidebar = true ) { - if ( $submit ) { - submit_button( __( 'Save changes', 'wordpress-seo' ) ); - - echo ' - '; - } - - /** - * Apply general admin_footer hooks - */ - do_action( 'wpseo_admin_footer' ); - - /** - * Run possibly set actions to add for example an i18n box - */ - do_action( 'wpseo_admin_promo_footer' ); - - echo ' -
    '; - - if ( $show_sidebar ) { - $this->admin_sidebar(); - } - - echo '
    '; - - - if ( ( defined( 'WP_DEBUG' ) && WP_DEBUG === true ) ) { - $xdebug = ( extension_loaded( 'xdebug' ) ? true : false ); - echo ' -
    -
    - -

    ' . __( 'Debug Information', 'wordpress-seo' ) . '

    -
    -

    ' . esc_html( __( 'Current option:', 'wordpress-seo' ) ) . ' ' . esc_html( $this->option_name ) . '

    - ' . ( ( $xdebug ) ? '' : '
    ' );
    -			var_dump( $this->get_option() );
    -			echo '
    -					' . ( ( $xdebug ) ? '' : '
    ' ) . ' -
    -
    -
    '; - } - - echo ' -
    '; - } - - /** - * Generates the sidebar for admin pages. - * - * @since 2.0 - */ - public function admin_sidebar() { - - // No banners in Premium. - if ( class_exists( 'WPSEO_Product_Premium' ) ) { - $license_manager = new Yoast_Plugin_License_Manager( new WPSEO_Product_Premium() ); - if ( $license_manager->license_is_valid() ) { - return; - } - } - - $sidebar_renderer = new WPSEO_Admin_Banner_Sidebar_Renderer( new WPSEO_Admin_Banner_Spot_Renderer() ); - - $banner_renderer = new WPSEO_Admin_Banner_Renderer; - $banner_renderer->set_base_path( plugins_url( 'images/banner/', WPSEO_FILE ) ); - - $sidebar = new WPSEO_Admin_Banner_Sidebar( sprintf( '%1s recommendations for you', 'Yoast' ), $banner_renderer ); - $sidebar->initialize( new WPSEO_Features() ); - - echo $sidebar_renderer->render( $sidebar ); - - } - - /** - * Output a label element - * - * @since 2.0 - * - * @param string $text Label text string. - * @param array $attr HTML attributes set. - */ - public function label( $text, $attr ) { - $attr = wp_parse_args( $attr, array( - 'class' => 'checkbox', - 'close' => true, - 'for' => '', - ) - ); - echo "'; - } - } - - /** - * Output a legend element. - * - * @since 3.4 - * - * @param string $text Legend text string. - * @param array $attr HTML attributes set. - */ - public function legend( $text, $attr ) { - $attr = wp_parse_args( $attr, array( - 'id' => '', - 'class' => '', - ) - ); - $id = ( '' === $attr['id'] ) ? '' : ' id="' . esc_attr( $attr['id'] ) . '"'; - echo '' . $text . ''; - } - - /** - * Create a Checkbox input field. - * - * @since 2.0 - * - * @param string $var The variable within the option to create the checkbox for. - * @param string $label The label to show for the variable. - * @param bool $label_left Whether the label should be left (true) or right (false). - */ - public function checkbox( $var, $label, $label_left = false ) { - if ( ! isset( $this->options[ $var ] ) ) { - $this->options[ $var ] = false; - } - - if ( $this->options[ $var ] === true ) { - $this->options[ $var ] = 'on'; - } - - $class = ''; - if ( $label_left !== false ) { - if ( ! empty( $label_left ) ) { - $label_left .= ':'; - } - $this->label( $label_left, array( 'for' => $var ) ); - } - else { - $class = 'double'; - } - - echo 'options[ $var ], 'on', false ), '/>'; - - if ( ! empty( $label ) ) { - $this->label( $label, array( 'for' => $var ) ); - } - - echo '
    '; - } - - /** - * Create a light switch input field. - * - * @since 3.1 - * - * @param string $var The variable within the option to create the checkbox for. - * @param string $label The label to show for the variable. - * @param array $buttons Array of two labels for the buttons (defaults Off/On). - * @param boolean $reverse Reverse order of buttons (default true). - */ - public function light_switch( $var, $label, $buttons = array(), $reverse = true ) { - - if ( ! isset( $this->options[ $var ] ) ) { - $this->options[ $var ] = false; - } - - if ( $this->options[ $var ] === true ) { - $this->options[ $var ] = 'on'; - } - - $class = 'switch-light switch-candy switch-yoast-seo'; - $aria_labelledby = esc_attr( $var ) . '-label'; - - if ( $reverse ) { - $class .= ' switch-yoast-seo-reverse'; - } - - if ( empty( $buttons ) ) { - $buttons = array( __( 'Disabled', 'wordpress-seo' ), __( 'Enabled', 'wordpress-seo' ) ); - } - - list( $off_button, $on_button ) = $buttons; - - echo '
    ', - '
    '; - } - - /** - * Create a Text input field. - * - * @since 2.0 - * @since 2.1 Introduced the `$attr` parameter. - * - * @param string $var The variable within the option to create the text input field for. - * @param string $label The label to show for the variable. - * @param array|string $attr Extra class to add to the input field. - */ - public function textinput( $var, $label, $attr = array() ) { - if ( ! is_array( $attr ) ) { - $attr = array( - 'class' => $attr, - ); - } - $attr = wp_parse_args( $attr, array( - 'placeholder' => '', - 'class' => '', - ) ); - $val = ( isset( $this->options[ $var ] ) ) ? $this->options[ $var ] : ''; - - $this->label( $label . ':', array( 'for' => $var, 'class' => 'textinput' ) ); - echo '', '
    '; - } - - /** - * Create a textarea. - * - * @since 2.0 - * - * @param string $var The variable within the option to create the textarea for. - * @param string $label The label to show for the variable. - * @param array $attr The CSS class to assign to the textarea. - */ - public function textarea( $var, $label, $attr = array() ) { - if ( ! is_array( $attr ) ) { - $attr = array( - 'class' => $attr, - ); - } - $attr = wp_parse_args( $attr, array( - 'cols' => '', - 'rows' => '', - 'class' => '', - ) ); - $val = ( isset( $this->options[ $var ] ) ) ? $this->options[ $var ] : ''; - - $this->label( $label . ':', array( 'for' => $var, 'class' => 'textinput' ) ); - echo '
    '; - } - - /** - * Create a hidden input field. - * - * @since 2.0 - * - * @param string $var The variable within the option to create the hidden input for. - * @param string $id The ID of the element. - */ - public function hidden( $var, $id = '' ) { - $val = ( isset( $this->options[ $var ] ) ) ? $this->options[ $var ] : ''; - if ( is_bool( $val ) ) { - $val = ( $val === true ) ? 'true' : 'false'; - } - - if ( '' === $id ) { - $id = 'hidden_' . $var; - } - - echo ''; - } - - /** - * Create a Select Box. - * - * @since 2.0 - * - * @param string $field_name The variable within the option to create the select for. - * @param string $label The label to show for the variable. - * @param array $select_options The select options to choose from. - */ - public function select( $field_name, $label, array $select_options ) { - - if ( empty( $select_options ) ) { - return; - } - - $this->label( $label . ':', array( 'for' => $field_name, 'class' => 'select' ) ); - - $select_name = esc_attr( $this->option_name ) . '[' . esc_attr( $field_name ) . ']'; - $active_option = ( isset( $this->options[ $field_name ] ) ) ? $this->options[ $field_name ] : ''; - - $select = new Yoast_Input_Select( $field_name, $select_name, $select_options, $active_option ); - $select->add_attribute( 'class', 'select' ); - $select->output_html(); - - echo '
    '; - } - - /** - * Create a File upload field. - * - * @since 2.0 - * - * @param string $var The variable within the option to create the file upload field for. - * @param string $label The label to show for the variable. - */ - public function file_upload( $var, $label ) { - $val = ''; - if ( isset( $this->options[ $var ] ) && is_array( $this->options[ $var ] ) ) { - $val = $this->options[ $var ]['url']; - } - - $var_esc = esc_attr( $var ); - $this->label( $label . ':', array( 'for' => $var, 'class' => 'select' ) ); - echo ''; - - // Need to save separate array items in hidden inputs, because empty file inputs type will be deleted by settings API. - if ( ! empty( $this->options[ $var ] ) ) { - $this->hidden( 'file', $this->option_name . '_file' ); - $this->hidden( 'url', $this->option_name . '_url' ); - $this->hidden( 'type', $this->option_name . '_type' ); - } - echo '
    '; - } - - /** - * Media input - * - * @since 2.0 - * - * @param string $var Option name. - * @param string $label Label message. - */ - public function media_input( $var, $label ) { - $val = ''; - if ( isset( $this->options[ $var ] ) ) { - $val = $this->options[ $var ]; - } - - $var_esc = esc_attr( $var ); - - $this->label( $label . ':', array( 'for' => 'wpseo_' . $var, 'class' => 'select' ) ); - echo ''; - echo ''; - echo '
    '; - } - - /** - * Create a Radio input field. - * - * @since 2.0 - * - * @param string $var The variable within the option to create the radio button for. - * @param array $values The radio options to choose from. - * @param string $legend Optional. The legend to show for the field set, if any. - * @param array $legend_attr Optional. The attributes for the legend, if any. - */ - public function radio( $var, $values, $legend = '', $legend_attr = array() ) { - if ( ! is_array( $values ) || $values === array() ) { - return; - } - if ( ! isset( $this->options[ $var ] ) ) { - $this->options[ $var ] = false; - } - - $var_esc = esc_attr( $var ); - - echo '
    '; - - if ( is_string( $legend ) && '' !== $legend ) { - - $legend_attr = wp_parse_args( $legend_attr, array( - 'id' => '', - 'class' => 'radiogroup', - ) ); - - $this->legend( $legend, $legend_attr ); - } - - foreach ( $values as $key => $value ) { - $key_esc = esc_attr( $key ); - echo 'options[ $var ], $key_esc, false ) . ' />'; - $this->label( $value, array( 'for' => $var_esc . '-' . $key_esc, 'class' => 'radio' ) ); - } - echo '
    '; - } - - - /** - * Create a toggle switch input field. - * - * @since 3.1 - * - * @param string $var The variable within the option to create the file upload field for. - * @param array $values The radio options to choose from. - * @param string $label The label to show for the variable. - */ - public function toggle_switch( $var, $values, $label ) { - if ( ! is_array( $values ) || $values === array() ) { - return; - } - if ( ! isset( $this->options[ $var ] ) ) { - $this->options[ $var ] = false; - } - if ( $this->options[ $var ] === true ) { - $this->options[ $var ] = 'on'; - } - if ( $this->options[ $var ] === false ) { - $this->options[ $var ] = 'off'; - } - - $var_esc = esc_attr( $var ); - - echo '
    '; - echo '
    ', $label, ' -
    '; - - foreach ( $values as $key => $value ) { - $key_esc = esc_attr( $key ); - $for = $var_esc . '-' . $key_esc; - echo 'options[ $var ], $key_esc, false ) . ' />', - ''; - } - - echo '
    ' . "\n\n"; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notification-center.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notification-center.php deleted file mode 100644 index 23b590d0..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notification-center.php +++ /dev/null @@ -1,570 +0,0 @@ -retrieve_notifications_from_storage(); - - add_action( 'all_admin_notices', array( $this, 'display_notifications' ) ); - - add_action( 'wp_ajax_yoast_get_notifications', array( $this, 'ajax_get_notifications' ) ); - - add_action( 'wpseo_deactivate', array( $this, 'deactivate_hook' ) ); - add_action( 'shutdown', array( $this, 'update_storage' ) ); - } - - /** - * Singleton getter - * - * @return Yoast_Notification_Center - */ - public static function get() { - - if ( null === self::$instance ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Dismiss a notification - */ - public static function ajax_dismiss_notification() { - - $notification_center = self::get(); - - $notification_id = filter_input( INPUT_POST, 'notification' ); - if ( empty( $notification_id ) ) { - die( '-1' ); - } - - $notification = $notification_center->get_notification_by_id( $notification_id ); - if ( false === ( $notification instanceof Yoast_Notification ) ) { - - // Permit legacy. - $notification = new Yoast_Notification( '', array( - 'id' => $notification_id, - 'dismissal_key' => $notification_id, - ) ); - } - - if ( $notification_center->maybe_dismiss_notification( $notification ) ) { - die( '1' ); - } - - die( '-1' ); - } - - /** - * Check if the user has dismissed a notification - * - * @param Yoast_Notification $notification The notification to check for dismissal. - * @param null|int $user_id User ID to check on. - * - * @return bool - */ - public static function is_notification_dismissed( Yoast_Notification $notification, $user_id = null ) { - - $user_id = ( ! is_null( $user_id ) ? $user_id : get_current_user_id() ); - $dismissal_key = $notification->get_dismissal_key(); - - $current_value = get_user_meta( $user_id, $dismissal_key, $single = true ); - - return ! empty( $current_value ); - } - - /** - * Check if the nofitication is being dismissed - * - * @param string|Yoast_Notification $notification Notification to check dismissal of. - * @param string $meta_value Value to set the meta value to if dismissed. - * - * @return bool True if dismissed. - */ - public static function maybe_dismiss_notification( Yoast_Notification $notification, $meta_value = 'seen' ) { - - // Only persistent notifications are dismissible. - if ( ! $notification->is_persistent() ) { - return false; - } - - // If notification is already dismissed, we're done. - if ( self::is_notification_dismissed( $notification ) ) { - return true; - } - - $dismissal_key = $notification->get_dismissal_key(); - $notification_id = $notification->get_id(); - - $is_dismissing = ( $dismissal_key === self::get_user_input( 'notification' ) ); - if ( ! $is_dismissing ) { - $is_dismissing = ( $notification_id === self::get_user_input( 'notification' ) ); - } - - // Fallback to ?dismissal_key=1&nonce=bla when JavaScript fails. - if ( ! $is_dismissing ) { - $is_dismissing = ( '1' === self::get_user_input( $dismissal_key ) ); - } - - if ( ! $is_dismissing ) { - return false; - } - - $user_nonce = self::get_user_input( 'nonce' ); - if ( false === wp_verify_nonce( $user_nonce, $notification_id ) ) { - return false; - } - - return self::dismiss_notification( $notification, $meta_value ); - } - - /** - * Clear dismissal information for the specified Notification - * - * When a cause is resolved, the next time it is present we want to show - * the message again. - * - * @param string|Yoast_Notification $notification Notification to clear the dismissal of. - * - * @return bool - */ - public function clear_dismissal( $notification ) { - - if ( $notification instanceof Yoast_Notification ) { - $dismissal_key = $notification->get_dismissal_key(); - } - - if ( is_string( $notification ) ) { - $dismissal_key = $notification; - } - - if ( empty( $dismissal_key ) ) { - return false; - } - - // Remove notification dismissal for all users. - $deleted = delete_metadata( 'user', $user_id = 0, $dismissal_key, $meta_value = '', $delete_all = true ); - - return $deleted; - } - - /** - * Add notification to the cookie - * - * @param Yoast_Notification $notification Notification object instance. - */ - public function add_notification( Yoast_Notification $notification ) { - - // Don't add if the user can't see it. - if ( ! $notification->display_for_current_user() ) { - return; - } - - $notification_id = $notification->get_id(); - - // Empty notifications are always added. - if ( $notification_id !== '' ) { - - // If notification ID exists in notifications, don't add again. - $present_notification = $this->get_notification_by_id( $notification_id ); - if ( ! is_null( $present_notification ) ) { - $this->remove_notification( $present_notification, false ); - } - - if ( is_null( $present_notification ) ) { - $this->new[] = $notification_id; - } - } - - // Add to list. - $this->notifications[] = $notification; - } - - /** - * Get the notification by ID - * - * @param string $notification_id The ID of the notification to search for. - * - * @return null|Yoast_Notification - */ - public function get_notification_by_id( $notification_id ) { - - foreach ( $this->notifications as & $notification ) { - if ( $notification_id === $notification->get_id() ) { - return $notification; - } - } - - return null; - } - - /** - * Display the notifications - */ - public function display_notifications() { - - // Never display notifications for network admin. - if ( function_exists( 'is_network_admin' ) && is_network_admin() ) { - return; - } - - $sorted_notifications = $this->get_sorted_notifications(); - foreach ( $sorted_notifications as $notification ) { - if ( ! $notification->is_persistent() ) { - echo $notification; - $this->remove_notification( $notification ); - } - } - } - - /** - * Remove notification after it has been displayed - * - * @param Yoast_Notification $notification Notification to remove. - * @param bool $resolve Resolve as fixed. - */ - public function remove_notification( Yoast_Notification $notification, $resolve = true ) { - - $index = false; - - // Match persistent Notifications by ID, non persistent by item in the array. - if ( $notification->is_persistent() ) { - foreach ( $this->notifications as $current_index => $present_notification ) { - if ( $present_notification->get_id() === $notification->get_id() ) { - $index = $current_index; - break; - } - } - } - else { - $index = array_search( $notification, $this->notifications, true ); - } - - if ( false === $index ) { - return; - } - - if ( $notification->is_persistent() && $resolve ) { - $this->resolved++; - $this->clear_dismissal( $notification ); - } - - unset( $this->notifications[ $index ] ); - $this->notifications = array_values( $this->notifications ); - } - - /** - * Get the notification count - * - * @param bool $dismissed Count dismissed notifications. - * - * @return int Number of notifications - */ - public function get_notification_count( $dismissed = false ) { - - $notifications = $this->get_notifications(); - $notifications = array_filter( $notifications, array( $this, 'filter_persistent_notifications' ) ); - - if ( ! $dismissed ) { - $notifications = array_filter( $notifications, array( $this, 'filter_dismissed_notifications' ) ); - } - - return count( $notifications ); - } - - /** - * Get the number of notifications resolved this execution - * - * These notifications have been resolved and should be counted when active again. - * - * @return int - */ - public function get_resolved_notification_count() { - - return $this->resolved; - } - - /** - * Return the notifications sorted on type and priority - * - * @return array|Yoast_Notification[] Sorted Notifications - */ - public function get_sorted_notifications() { - - $notifications = $this->get_notifications(); - if ( empty( $notifications ) ) { - return array(); - } - - // Sort by severity, error first. - usort( $notifications, array( $this, 'sort_notifications' ) ); - - return $notifications; - } - - /** - * AJAX display notifications - */ - public function ajax_get_notifications() { - - // Display the notices. - $this->display_notifications(); - - // AJAX die. - exit; - } - - /** - * Remove storage when the plugin is deactivated - */ - public function deactivate_hook() { - - $this->clear_notifications(); - } - - /** - * Save persistent notifications to storage - * - * We need to be able to retrieve these so they can be dismissed at any time during the execution. - * - * @since 3.2 - * - * @return void - */ - public function update_storage() { - - $notifications = $this->get_notifications(); - - // No notifications to store, clear storage. - if ( empty( $notifications ) ) { - $this->remove_storage(); - - return; - } - - $notifications = array_map( array( $this, 'notification_to_array' ), $notifications ); - - // Save the notifications to the storage. - update_user_option( get_current_user_id(), self::STORAGE_KEY, $notifications ); - } - - /** - * Provide a way to verify present notifications - * - * @return array|Yoast_Notification[] Registered notifications. - */ - public function get_notifications() { - - return $this->notifications; - } - - /** - * Get newly added notifications - * - * @return array - */ - public function get_new_notifications() { - - return array_map( array( $this, 'get_notification_by_id' ), $this->new ); - } - - /** - * Get information from the User input - * - * @param string $key Key to retrieve. - * - * @return mixed value of key if set. - */ - private static function get_user_input( $key ) { - - $filter_input_type = INPUT_GET; - if ( 'POST' === strtoupper( $_SERVER['REQUEST_METHOD'] ) ) { - $filter_input_type = INPUT_POST; - } - - return filter_input( $filter_input_type, $key ); - } - - /** - * Retrieve the notifications from storage - * - * @return array Yoast_Notification[] Notifications - */ - private function retrieve_notifications_from_storage() { - - $stored_notifications = get_user_option( self::STORAGE_KEY, get_current_user_id() ); - - // Check if notifications are stored. - if ( empty( $stored_notifications ) ) { - return; - } - - if ( is_array( $stored_notifications ) ) { - $notifications = array_map( array( $this, 'array_to_notification' ), $stored_notifications ); - $notifications = array_filter( $notifications, array( $this, 'filter_notification_current_user' ) ); - - $this->notifications = $notifications; - } - } - - /** - * Sort on type then priority - * - * @param Yoast_Notification $a Compare with B. - * @param Yoast_Notification $b Compare with A. - * - * @return int 1, 0 or -1 for sorting offset. - */ - private function sort_notifications( Yoast_Notification $a, Yoast_Notification $b ) { - - $a_type = $a->get_type(); - $b_type = $b->get_type(); - - if ( $a_type === $b_type ) { - return WPSEO_Utils::calc( $b->get_priority(), 'compare', $a->get_priority() ); - } - - if ( 'error' === $a_type ) { - return -1; - } - - if ( 'error' === $b_type ) { - return 1; - } - - return 0; - } - - /** - * Dismiss the notification - * - * @param Yoast_Notification $notification Notification to dismiss. - * @param string $meta_value Value to save in the dismissal. - * - * @return bool - */ - private static function dismiss_notification( Yoast_Notification $notification, $meta_value = 'seen' ) { - // Dismiss notification. - return ( false !== update_user_meta( get_current_user_id(), $notification->get_dismissal_key(), $meta_value ) ); - } - - /** - * Remove all notifications from storage - */ - private function remove_storage() { - - delete_user_option( get_current_user_id(), self::STORAGE_KEY ); - } - - /** - * Clear local stored notifications - */ - private function clear_notifications() { - - $this->notifications = array(); - } - - /** - * Filter out non-persistent notifications. - * - * @param Yoast_Notification $notification Notification to test for persistent. - * - * @since 3.2 - * - * @return bool - */ - private function filter_persistent_notifications( Yoast_Notification $notification ) { - - return $notification->is_persistent(); - } - - /** - * Filter out dismissed notifications - * - * @param Yoast_Notification $notification Notification to check. - * - * @return bool - */ - private function filter_dismissed_notifications( Yoast_Notification $notification ) { - - return ! $this->maybe_dismiss_notification( $notification ); - } - - /** - * Convert Notification to array representation - * - * @param Yoast_Notification $notification Notification to convert. - * - * @since 3.2 - * - * @return array - */ - private function notification_to_array( Yoast_Notification $notification ) { - - return $notification->to_array(); - } - - /** - * Convert stored array to Notification. - * - * @param array $notification_data Array to convert to Notification. - * - * @return Yoast_Notification - */ - private function array_to_notification( $notification_data ) { - - return new Yoast_Notification( - $notification_data['message'], - $notification_data['options'] - ); - } - - /** - * Filter notifications that should not be displayed for the current user - * - * @param Yoast_Notification $notification Notification to test. - * - * @return bool - */ - private function filter_notification_current_user( Yoast_Notification $notification ) { - return $notification->display_for_current_user(); - } - - /** - * Write the notifications to a cookie (hooked on shutdown) - * - * Function renamed to 'update_storage'. - * - * @deprecated 3.2 remove in 3.5 - * @codeCoverageIgnore - */ - public function set_transient() { - _deprecated_function( __METHOD__, 'WPSEO 3.2' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notification.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notification.php deleted file mode 100644 index ef1f7a89..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-notification.php +++ /dev/null @@ -1,303 +0,0 @@ - self::UPDATED, - 'id' => '', - 'nonce' => null, - 'priority' => 0.5, - 'data_json' => array(), - 'dismissal_key' => null, - 'capabilities' => array(), - 'capability_check' => self::MATCH_ALL, - ); - - /** - * Notification class constructor. - * - * @param string $message Message string. - * @param array $options Set of options. - */ - public function __construct( $message, $options = array() ) { - $this->message = $message; - $this->options = $this->normalize_options( $options ); - } - - /** - * Retrieve notification ID string. - * - * @return string - */ - public function get_id() { - return $this->options['id']; - } - - /** - * Retrieve nonce identifier. - * - * @return null|string Nonce for this Notification. - */ - public function get_nonce() { - if ( $this->options['id'] && empty( $this->options['nonce'] ) ) { - $this->options['nonce'] = wp_create_nonce( $this->options['id'] ); - } - - return $this->options['nonce']; - } - - /** - * Make sure the nonce is up to date - */ - public function refresh_nonce() { - if ( $this->options['id'] ) { - $this->options['nonce'] = wp_create_nonce( $this->options['id'] ); - } - } - - /** - * Get the type of the notification - * - * @return string - */ - public function get_type() { - return $this->options['type']; - } - - /** - * Priority of the notification - * - * Relative to the type. - * - * @return float Returns the priority between 0 and 1. - */ - public function get_priority() { - return $this->options['priority']; - } - - /** - * Get the User Meta key to check for dismissal of notification - * - * @return string User Meta Option key that registers dismissal. - */ - public function get_dismissal_key() { - if ( empty( $this->options['dismissal_key'] ) ) { - return $this->options['id']; - } - - return $this->options['dismissal_key']; - } - - /** - * Is this Notification persistent - * - * @return bool True if persistent, False if fire and forget. - */ - public function is_persistent() { - $id = $this->get_id(); - - return ! empty( $id ); - } - - /** - * Check if the notification is relevant for the current user - * - * @return bool True if a user needs to see this Notification, False if not. - */ - public function display_for_current_user() { - // If the notification is for the current page only, always show. - if ( ! $this->is_persistent() ) { - return true; - } - - // If the current user doesn't match capabilities. - return $this->match_capabilities(); - } - - /** - * Does the current user match required capabilities - * - * @return bool - */ - public function match_capabilities() { - // Super Admin can do anything. - if ( is_multisite() && is_super_admin() ) { - return true; - } - - /** - * Filter capabilities that enable the displaying of this notification. - * - * @since 3.2 - * - * @param array $capabilities The capabilities that must be present for this Notification. - * @param Yoast_Notification $notification The notification object. - * - * @return array of capabilities or empty for no restrictions. - */ - $capabilities = apply_filters( 'wpseo_notification_capabilities', $this->options['capabilities'], $this ); - - // Should be an array. - if ( ! is_array( $capabilities ) ) { - $capabilities = (array) $capabilities; - } - - /** - * Filter capability check to enable all or any capabilities. - * - * @since 3.2 - * - * @param string $capability_check The type of check that will be used to determine if an capability is present. - * @param Yoast_Notification $notification The notification object. - * - * @return string self::MATCH_ALL or self::MATCH_ANY. - */ - $capability_check = apply_filters( 'wpseo_notification_capability_check', $this->options['capability_check'], $this ); - - if ( ! in_array( $capability_check, array( self::MATCH_ALL, self::MATCH_ANY ), true ) ) { - $capability_check = self::MATCH_ALL; - } - - if ( ! empty( $capabilities ) ) { - - $has_capabilities = array_filter( $capabilities, array( $this, 'has_capability' ) ); - - switch ( $capability_check ) { - case self::MATCH_ALL: - return $has_capabilities === $capabilities; - case self::MATCH_ANY: - return ! empty( $has_capabilities ); - } - } - - return true; - } - - /** - * Array filter function to find matched capabilities - * - * @param string $capability Capability to test. - * - * @return bool - */ - private function has_capability( $capability ) { - return current_user_can( $capability ); - } - - /** - * Return the object properties as an array - * - * @return array - */ - public function to_array() { - return array( - 'message' => $this->message, - 'options' => $this->options, - ); - } - - /** - * Adds string (view) behaviour to the Notification - * - * @return string - */ - public function __toString() { - $attributes = array(); - - // Default notification classes. - $classes = array( - 'yoast-alert', - ); - - // Maintain WordPress visualisation of alerts when they are not persistent. - if ( ! $this->is_persistent() ) { - $classes[] = 'notice'; - $classes[] = $this->get_type(); - } - - if ( ! empty( $classes ) ) { - $attributes['class'] = implode( ' ', $classes ); - } - - // Combined attribute key and value into a string. - array_walk( $attributes, array( $this, 'parse_attributes' ) ); - - // Build the output DIV. - return '
    ' . wpautop( $this->message ) . '
    ' . PHP_EOL; - } - - /** - * Get the JSON if provided - * - * @return false|string - */ - public function get_json() { - if ( empty( $this->options['data_json'] ) ) { - return ''; - } - - return wp_json_encode( $this->options['data_json'] ); - } - - /** - * Make sure we only have values that we can work with - * - * @param array $options Options to normalize. - * - * @return array - */ - private function normalize_options( $options ) { - $options = wp_parse_args( $options, $this->defaults ); - - // Should not exceed 0 or 1. - $options['priority'] = min( 1, max( 0, $options['priority'] ) ); - - // Set default capabilities when not supplied. - if ( empty( $options['capabilities'] ) || array() === $options['capabilities'] ) { - $options['capabilities'] = array( 'manage_options' ); - } - - return $options; - } - - /** - * Format HTML element attributes - * - * @param string $value Attribute value. - * @param string $key Attribute name. - */ - private function parse_attributes( & $value, $key ) { - $value = sprintf( '%s="%s"', $key, esc_attr( $value ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-plugin-conflict.php b/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-plugin-conflict.php deleted file mode 100644 index 5dde1d24..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/class-yoast-plugin-conflict.php +++ /dev/null @@ -1,333 +0,0 @@ -plugins the active plugins will be stored in this - * property - * - * @var array - */ - protected $active_plugins = array(); - - /** - * Property for holding instance of itself - * - * @var Yoast_Plugin_Conflict - */ - protected static $instance; - - /** - * For the use of singleton pattern. Create instance of itself and return his instance - * - * @param string $class_name Give the classname to initialize. If classname is false (empty) it will use it's own __CLASS__. - * - * @return Yoast_Plugin_Conflict - */ - public static function get_instance( $class_name = '' ) { - - if ( is_null( self::$instance ) ) { - if ( ! is_string( $class_name ) || $class_name === '' ) { - $class_name = __CLASS__; - } - - self::$instance = new $class_name(); - } - - return self::$instance; - } - - /** - * Setting instance, all active plugins and search for active plugins - * - * Protected constructor to prevent creating a new instance of the - * *Singleton* via the `new` operator from outside of this class. - */ - protected function __construct() { - // Set active plugins. - $this->all_active_plugins = get_option( 'active_plugins' ); - - if ( filter_input( INPUT_GET, 'action' ) === 'deactivate' ) { - $this->remove_deactivated_plugin(); - } - - // Search for active plugins. - $this->search_active_plugins(); - } - - /** - * Check if there are conflicting plugins for given $plugin_section - * - * @param string $plugin_section Type of plugin conflict (such as Open Graph or sitemap). - * - * @return bool - */ - public function check_for_conflicts( $plugin_section ) { - - static $sections_checked; - - if ( $sections_checked === null ) { - $sections_checked = array(); - } - - if ( ! in_array( $plugin_section, $sections_checked ) ) { - $sections_checked[] = $plugin_section; - $has_conflicts = ( ! empty( $this->active_plugins[ $plugin_section ] ) ); - - return $has_conflicts; - } - - return false; - } - - /** - * Getting all the conflicting plugins and return them as a string. - * - * This method will loop through all conflicting plugins to get the details of each plugin. The plugin name - * will be taken from the details to parse a comma separated string, which can be use for by example a notice - * - * @param string $plugin_section Plugin conflict type (such as Open Graph or sitemap). - * - * @return string - */ - public function get_conflicting_plugins_as_string( $plugin_section ) { - if ( ! function_exists( 'get_plugin_data' ) ) { - require_once( ABSPATH . '/wp-admin/includes/plugin.php' ); - } - - // Getting the active plugins by given section. - $plugins = $this->active_plugins[ $plugin_section ]; - - $plugin_names = array(); - foreach ( $plugins as $plugin ) { - if ( $name = WPSEO_Utils::get_plugin_name( $plugin ) ) { - $plugin_names[] = '' . $name . ''; - } - } - unset( $plugins, $plugin ); - - if ( ! empty( $plugin_names ) ) { - return implode( ' & ', $plugin_names ); - } - } - - /** - * Checks for given $plugin_sections for conflicts - * - * @param array $plugin_sections Set of sections. - */ - public function check_plugin_conflicts( $plugin_sections ) { - foreach ( $plugin_sections as $plugin_section => $readable_plugin_section ) { - // Check for conflicting plugins and show error if there are conflicts. - if ( $this->check_for_conflicts( $plugin_section ) ) { - $this->set_error( $plugin_section, $readable_plugin_section ); - } - } - - // List of all active sections. - $sections = array_keys( $plugin_sections ); - // List of all sections. - $all_plugin_sections = array_keys( $this->plugins ); - - /* - * Get all sections that are inactive. - * These plugins need to be cleared. - * - * This happens when Sitemaps or OpenGraph implementations toggle active/disabled. - */ - $inactive_sections = array_diff( $all_plugin_sections, $sections ); - if ( ! empty( $inactive_sections ) ) { - foreach ( $inactive_sections as $section ) { - array_walk( $this->plugins[ $section ], array( $this, 'clear_error' ) ); - } - } - - // For active sections clear errors for inactive plugins. - foreach ( $sections as $section ) { - // By default clear errors for all plugins of the section. - $inactive_plugins = $this->plugins[ $section ]; - - // If there are active plugins, filter them from being cleared. - if ( isset( $this->active_plugins[ $section ] ) ) { - $inactive_plugins = array_diff( $this->plugins[ $section ], $this->active_plugins[ $section ] ); - } - - array_walk( $inactive_plugins, array( $this, 'clear_error' ) ); - } - } - - /** - * Setting an error on the screen - * - * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap). - * @param string $readable_plugin_section This is the value for the translation. - */ - protected function set_error( $plugin_section, $readable_plugin_section ) { - - $notification_center = Yoast_Notification_Center::get(); - - foreach ( $this->active_plugins[ $plugin_section ] as $plugin_file ) { - - $plugin_name = WPSEO_Utils::get_plugin_name( $plugin_file ); - - $error_message = ''; - /* translators: %1$s: 'Facebook & Open Graph' plugin name(s) of possibly conflicting plugin(s), %2$s to Yoast SEO */ - $error_message .= '

    ' . sprintf( __( 'The %1$s plugin might cause issues when used in conjunction with %2$s.', 'wordpress-seo' ), '' . $plugin_name . '', 'Yoast SEO' ) . '

    '; - $error_message .= '

    ' . sprintf( $readable_plugin_section, 'Yoast SEO', $plugin_name ) . '

    '; - - /* translators: %s: 'Facebook' plugin name of possibly conflicting plugin */ - $error_message .= '' . sprintf( __( 'Deactivate %s', 'wordpress-seo' ), WPSEO_Utils::get_plugin_name( $plugin_file ) ) . ' '; - - $identifier = $this->get_notification_identifier( $plugin_file ); - - // Add the message to the notifications center. - $notification_center->add_notification( - new Yoast_Notification( - $error_message, - array( - 'type' => Yoast_Notification::ERROR, - 'id' => 'wpseo-conflict-' . $identifier, - ) - ) - ); - } - } - - /** - * Clear the notification for a plugin - * - * @param string $plugin_file Clear the optional notification for this plugin. - */ - protected function clear_error( $plugin_file ) { - $identifier = $this->get_notification_identifier( $plugin_file ); - - $notification_center = Yoast_Notification_Center::get(); - $notification = $notification_center->get_notification_by_id( 'wpseo-conflict-' . $identifier ); - - if ( $notification ) { - $notification_center->remove_notification( $notification ); - } - } - - /** - * Loop through the $this->plugins to check if one of the plugins is active. - * - * This method will store the active plugins in $this->active_plugins. - */ - protected function search_active_plugins() { - foreach ( $this->plugins as $plugin_section => $plugins ) { - $this->check_plugins_active( $plugins, $plugin_section ); - } - } - - /** - * Loop through plugins and check if each plugin is active - * - * @param array $plugins Set of plugins. - * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap). - */ - protected function check_plugins_active( $plugins, $plugin_section ) { - foreach ( $plugins as $plugin ) { - if ( $this->check_plugin_is_active( $plugin ) ) { - $this->add_active_plugin( $plugin_section, $plugin ); - } - } - } - - - /** - * Check if given plugin exists in array with all_active_plugins - * - * @param string $plugin Plugin basename string. - * - * @return bool - */ - protected function check_plugin_is_active( $plugin ) { - return in_array( $plugin, $this->all_active_plugins ); - } - - /** - * Add plugin to the list of active plugins. - * - * This method will check first if key $plugin_section exists, if not it will create an empty array - * If $plugin itself doesn't exist it will be added. - * - * @param string $plugin_section Type of conflict group (such as Open Graph or sitemap). - * @param string $plugin Plugin basename string. - */ - protected function add_active_plugin( $plugin_section, $plugin ) { - - if ( ! array_key_exists( $plugin_section, $this->active_plugins ) ) { - $this->active_plugins[ $plugin_section ] = array(); - } - - if ( ! in_array( $plugin, $this->active_plugins[ $plugin_section ] ) ) { - $this->active_plugins[ $plugin_section ][] = $plugin; - } - } - - /** - * Search in $this->plugins for the given $plugin - * - * If there is a result it will return the plugin category - * - * @param string $plugin Plugin basename string. - * - * @return int|string - */ - protected function find_plugin_category( $plugin ) { - - foreach ( $this->plugins as $plugin_section => $plugins ) { - if ( in_array( $plugin, $plugins ) ) { - return $plugin_section; - } - } - - } - - /** - * When being in the deactivation process the currently deactivated plugin has to be removed. - */ - private function remove_deactivated_plugin() { - $deactivated_plugin = filter_input( INPUT_GET, 'plugin' ); - $key_to_remove = array_search( $deactivated_plugin, $this->all_active_plugins ); - - if ( $key_to_remove !== false ) { - unset( $this->all_active_plugins[ $key_to_remove ] ); - } - } - - /** - * Get the identifier from the plugin file - * - * @param string $plugin_file Plugin file to get Identifier from. - * - * @return string - */ - private function get_notification_identifier( $plugin_file ) { - return md5( $plugin_file ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-components.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-components.php deleted file mode 100644 index cab3aeb0..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-components.php +++ /dev/null @@ -1,71 +0,0 @@ -add_component( new WPSEO_Config_Component_Connect_Google_Search_Console() ); - $this->add_component( new WPSEO_Config_Component_Mailchimp_Signup() ); - $this->add_component( new WPSEO_Config_Component_Configuration_Choices() ); - $this->add_component( new WPSEO_Config_Component_Suggestions() ); - } - - /** - * Add a component - * - * @param WPSEO_Config_Component $component Component to add. - */ - public function add_component( WPSEO_Config_Component $component ) { - $this->components[] = $component; - } - - /** - * Sets the storage to use. - * - * @param WPSEO_Configuration_Storage $storage Storage to use. - */ - public function set_storage( WPSEO_Configuration_Storage $storage ) { - $this->set_adapter( $storage->get_adapter() ); - - foreach ( $this->components as $component ) { - $storage->add_field( $component->get_field() ); - } - } - - /** - * Sets the adapter to use. - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to use. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $this->adapter = $adapter; - - foreach ( $this->components as $component ) { - $adapter->add_custom_lookup( - $component->get_field()->get_identifier(), - array( - $component, - 'get_data', - ), - array( - $component, - 'set_data', - ) - ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-endpoint.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-endpoint.php deleted file mode 100644 index 203dfe16..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-endpoint.php +++ /dev/null @@ -1,78 +0,0 @@ -service = $service; - } - - /** - * Register REST routes. - */ - public function register() { - // Register fetch config. - register_rest_route( self::REST_NAMESPACE, self::ENDPOINT_RETRIEVE, array( - 'methods' => 'GET', - 'callback' => array( - $this->service, - 'get_configuration', - ), - 'permission_callback' => array( - $this, - 'can_retrieve_data', - ), - ) ); - - // Register save changes. - register_rest_route( self::REST_NAMESPACE, self::ENDPOINT_STORE, array( - 'methods' => 'POST', - 'callback' => array( - $this->service, - 'set_configuration', - ), - 'permission_callback' => array( - $this, - 'can_save_data', - ), - ) ); - } - - /** - * Permission callback implementation - * - * @return bool - */ - public function can_retrieve_data() { - return current_user_can( self::CAPABILITY_RETRIEVE ); - } - - /** - * Permission callback implementation - * - * @return bool - */ - public function can_save_data() { - return current_user_can( self::CAPABILITY_STORE ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-options-adapter.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-options-adapter.php deleted file mode 100644 index 8e0242b2..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-options-adapter.php +++ /dev/null @@ -1,194 +0,0 @@ -add_lookup( $class_name, self::OPTION_TYPE_WORDPRESS, $option ); - } - - /** - * Add a lookup for a Yoast option - * - * @param string $class_name Class to bind to the lookup. - * @param string $option Option group to use. - * @param string $key Key in the option group to bind to. - * - * @throws InvalidArgumentException Thrown when invalid input is provided. - */ - public function add_yoast_lookup( $class_name, $option, $key ) { - - $test = WPSEO_Options::get_option( $option ); - if ( is_null( $test ) ) { - /* translators: %1$s resolves to the option name passed to the lookup registration */ - throw new InvalidArgumentException( sprintf( __( 'Yoast option %1$s not found.', 'wordpress-seo' ), $option ) ); - } - - $this->add_lookup( $class_name, self::OPTION_TYPE_YOAST, array( - $option, - $key, - ) ); - } - - /** - * Add a lookup for a custom implementation - * - * @param string $class_name Class to bind to the lookup. - * @param callable $callback_get Callback to retrieve data. - * @param callable $callback_set Callback to save data. - * - * @throws InvalidArgumentException Thrown when invalid input is provided. - */ - public function add_custom_lookup( $class_name, $callback_get, $callback_set ) { - - if ( ! is_callable( $callback_get ) || ! is_callable( $callback_set ) ) { - throw new InvalidArgumentException( 'Custom option must be callable.' ); - } - - $this->add_lookup( $class_name, self::OPTION_TYPE_CUSTOM, array( - $callback_get, - $callback_set, - ) ); - } - - /** - * Add a field lookup. - * - * @param string $class_name Class to add lookup for. - * @param string $type Type of lookup. - * @param string|array $option Implementation of the lookup. - * - * @throws Exception Thrown when invalid input is provided. - */ - protected function add_lookup( $class_name, $type, $option ) { - $this->lookup[ $class_name ] = array( - 'type' => $type, - 'option' => $option, - ); - } - - /** - * Get the data for the provided field - * - * @param WPSEO_Config_Field $field Field to get data for. - * - * @return mixed - */ - public function get( WPSEO_Config_Field $field ) { - $identifier = $field->get_identifier(); - - // Lookup option and retrieve value. - $type = $this->get_option_type( $identifier ); - $option = $this->get_option( $identifier ); - - switch ( $type ) { - case self::OPTION_TYPE_WORDPRESS: - return get_option( $option ); - - case self::OPTION_TYPE_YOAST: - $group = WPSEO_Options::get_option( $option[0] ); - - return $group[ $option[1] ]; - - case self::OPTION_TYPE_CUSTOM: - return call_user_func( $option[0] ); - } - - return null; - } - - /** - * Save data from a field - * - * @param WPSEO_Config_Field $field Field to use for lookup. - * @param mixed $value Value to save to the lookup of the field. - * - * @return bool - */ - public function set( WPSEO_Config_Field $field, $value ) { - $identifier = $field->get_identifier(); - - // Lookup option and retrieve value. - $type = $this->get_option_type( $identifier ); - $option = $this->get_option( $identifier ); - - switch ( $type ) { - case self::OPTION_TYPE_WORDPRESS: - return update_option( $option, $value ); - - case self::OPTION_TYPE_YOAST: - $group = WPSEO_Options::get_option( $option[0] ); - - $group[ $option[1] ] = $value; - update_option( $option[0], $group ); - - $saved = WPSEO_Options::get_option( $option[0] ); - - return $saved[ $option[1] ] === $value; - - case self::OPTION_TYPE_CUSTOM: - return call_user_func( $option[1], $value ); - } - - return false; - } - - /** - * Get the lookup type for a specific class - * - * @param string $class_name Class to get the type of. - * - * @return null|string - */ - protected function get_option_type( $class_name ) { - if ( ! isset( $this->lookup[ $class_name ] ) ) { - return null; - } - - return $this->lookup[ $class_name ]['type']; - } - - /** - * Get the option for a specific class - * - * @param string $class_name Class to get the option of. - * - * @return null|string|array - */ - protected function get_option( $class_name ) { - if ( ! isset( $this->lookup[ $class_name ] ) ) { - return null; - } - - return $this->lookup[ $class_name ]['option']; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-page.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-page.php deleted file mode 100644 index 5e427b31..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-page.php +++ /dev/null @@ -1,271 +0,0 @@ -should_add_notification() ) { - $this->add_notification(); - } - - if ( filter_input( INPUT_GET, 'page' ) !== self::PAGE_IDENTIFIER ) { - return; - } - - // Register the page for the wizard. - add_action( 'admin_menu', array( $this, 'add_wizard_page' ) ); - add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_assets' ) ); - add_action( 'admin_init', array( $this, 'render_wizard_page' ) ); - } - - /** - * Check if the configuration is finished. If so, just remove the notification. - */ - public function catch_configuration_request() { - $configuration_page = filter_input( INPUT_GET, 'configuration' ); - $page = filter_input( INPUT_GET, 'page' ); - - if ( ! ( $configuration_page === 'finished' && ( $page === WPSEO_Admin::PAGE_IDENTIFIER ) ) ) { - return; - } - - $this->remove_notification(); - $this->remove_notification_option(); - - wp_redirect( admin_url( 'admin.php?page=' . WPSEO_Admin::PAGE_IDENTIFIER ) ); - exit; - } - - - /** - * Registers the page for the wizard. - */ - public function add_wizard_page() { - add_dashboard_page( '', '', 'manage_options', self::PAGE_IDENTIFIER, '' ); - } - - /** - * Renders the wizard page and exits to prevent the wordpress UI from loading. - */ - public function render_wizard_page() { - $this->show_wizard(); - exit; - } - - /** - * Enqueues the assets needed for the wizard. - */ - public function enqueue_assets() { - wp_enqueue_media(); - - /* - * Print the `forms.css` WP stylesheet before any Yoast style, this way - * it's easier to override selectors with the same specificity later. - */ - wp_enqueue_style( 'forms' ); - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->register_assets(); - $asset_manager->enqueue_script( 'configuration-wizard' ); - $asset_manager->enqueue_style( 'yoast-components' ); - - $config = $this->get_config(); - - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'configuration-wizard', 'yoastWizardConfig', $config ); - } - - /** - * Setup Wizard Header. - */ - public function show_wizard() { - $this->enqueue_assets(); - $dashboard_url = admin_url( '/admin.php?page=wpseo_dashboard' ); - ?> - - - - > - - - - - <?php - printf( - /* translators: %s expands to Yoast SEO. */ - __( '%s › Configuration Wizard', 'wordpress-seo' ), - 'Yoast SEO' - ); - ?> - tag in the Yoast Configuration wizard. - * - * Allows users to add their own scripts or styles. - * - * @since 4.0 - */ - do_action( 'wpseo_configuration_wizard_head' ); - ?> - - -
    - - - - tag in the Yoast Configuration wizard. - * - * Allows users to add their own scripts or content. - * - * @since 4.0 - */ - do_action( 'wpseo_configuration_wizard_footer' ); - - wp_print_scripts( 'yoast-seo-configuration-wizard' ); - ?> - - - get_translations(); - $service = new WPSEO_GSC_Service(); - $config = array( - 'namespace' => WPSEO_Configuration_Endpoint::REST_NAMESPACE, - 'endpoint_retrieve' => WPSEO_Configuration_Endpoint::ENDPOINT_RETRIEVE, - 'endpoint_store' => WPSEO_Configuration_Endpoint::ENDPOINT_STORE, - 'nonce' => wp_create_nonce( 'wp_rest' ), - 'root' => esc_url_raw( rest_url() ), - 'ajaxurl' => admin_url( 'admin-ajax.php' ), - 'finishUrl' => admin_url( 'admin.php?page=wpseo_dashboard&configuration=finished' ), - 'gscAuthURL' => $service->get_client()->createAuthUrl(), - 'gscProfiles' => $service->get_sites(), - 'gscNonce' => wp_create_nonce( 'wpseo-gsc-ajax-security' ), - 'translations' => $translations, - ); - - return $config; - } - - /** - * Returns the translations necessary for the configuration wizard. - * - * @returns array The translations for the configuration wizard. - */ - public function get_translations() { - $file = plugin_dir_path( WPSEO_FILE ) . 'languages/yoast-components-' . WPSEO_Utils::get_user_locale() . '.json'; - if ( file_exists( $file ) && $file = file_get_contents( $file ) ) { - return json_decode( $file, true ); - } - - return array(); - } - - /** - * Adds a notification to the notification center. - */ - private function add_notification() { - $notification_center = Yoast_Notification_Center::get(); - $notification_center->add_notification( self::get_notification() ); - } - - /** - * Removes the notification from the notification center. - */ - private function remove_notification() { - $notification_center = Yoast_Notification_Center::get(); - $notification_center->remove_notification( self::get_notification() ); - } - - /** - * Gets the notification. - * - * @return Yoast_Notification - */ - private static function get_notification() { - $message = __( 'The configuration wizard helps you to easily configure your site to have the optimal SEO settings.', 'wordpress-seo' ); - $message .= '
    '; - $message .= sprintf( - /* translators: %1$s resolves to Yoast SEO, %2$s resolves to the starting tag of the link to the wizard, %3$s resolves to the closing link tag */ - __( 'We have detected that you have not finished this wizard yet, so we recommend you to %2$sstart the configuration wizard to configure %1$s%3$s.', 'wordpress-seo' ), - 'Yoast SEO', - '', - '' - ); - - $notification = new Yoast_Notification( - $message, - array( - 'type' => Yoast_Notification::WARNING, - 'id' => 'wpseo-dismiss-onboarding-notice', - 'capabilities' => 'manage_options', - 'priority' => 0.8, - ) - ); - - return $notification; - } - - /** - * When the notice should be shown. - * - * @return bool - */ - private function should_add_notification() { - $options = $this->get_options(); - - return $options['show_onboarding_notice'] === true; - } - - /** - * Remove the options that triggers the notice for the configuration wizard. - */ - private function remove_notification_option() { - $options = $this->get_options(); - - $options['show_onboarding_notice'] = false; - - update_option( 'wpseo', $options ); - } - - /** - * Returns the set options - * - * @return mixed|void - */ - private function get_options() { - return get_option( 'wpseo' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-service.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-service.php deleted file mode 100644 index 09d135a5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-service.php +++ /dev/null @@ -1,143 +0,0 @@ -set_default_providers(); - $this->populate_configuration(); - $this->endpoint->register(); - - // @todo: check if this is really needed, since the switch happens only in the API. - if ( function_exists( 'restore_current_locale' ) ) { - restore_current_locale(); - } - } - - /** - * Set default handlers - */ - public function set_default_providers() { - $this->set_storage( new WPSEO_Configuration_Storage() ); - $this->set_options_adapter( new WPSEO_Configuration_Options_Adapter() ); - $this->set_components( new WPSEO_Configuration_Components() ); - $this->set_endpoint( new WPSEO_Configuration_Endpoint() ); - $this->set_structure( new WPSEO_Configuration_Structure() ); - } - - /** - * Set storage handler - * - * @param WPSEO_Configuration_Storage $storage Storage handler to use. - */ - public function set_storage( WPSEO_Configuration_Storage $storage ) { - $this->storage = $storage; - } - - /** - * Set endpoint handler - * - * @param WPSEO_Configuration_Endpoint $endpoint Endpoint implementation to use. - */ - public function set_endpoint( WPSEO_Configuration_Endpoint $endpoint ) { - $this->endpoint = $endpoint; - $this->endpoint->set_service( $this ); - } - - /** - * Set the options adapter - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to use. - */ - public function set_options_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $this->adapter = $adapter; - } - - /** - * Set components provider - * - * @param WPSEO_Configuration_Components $components Component provider to use. - */ - public function set_components( WPSEO_Configuration_Components $components ) { - $this->components = $components; - } - - /** - * Set structure provider - * - * @param WPSEO_Configuration_Structure $structure Structure provider to use. - */ - public function set_structure( WPSEO_Configuration_Structure $structure ) { - $this->structure = $structure; - } - - /** - * Populate the configuration - */ - protected function populate_configuration() { - $this->storage->set_adapter( $this->adapter ); - $this->storage->add_default_fields(); - - $this->components->initialize(); - $this->components->set_storage( $this->storage ); - } - - /** - * Used by endpoint to retrieve configuration - * - * @return array List of settings. - */ - public function get_configuration() { - $fields = $this->storage->retrieve(); - $steps = $this->structure->retrieve(); - - return array( - 'fields' => $fields, - 'steps' => $steps, - ); - } - - /** - * Used by endpoint to store changes - * - * @param WP_REST_Request $request Request from the REST API. - * - * @return array List of feedback per option if saving succeeded. - */ - public function set_configuration( WP_REST_Request $request ) { - $this->populate_configuration(); - - return $this->storage->store( $request->get_json_params() ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-storage.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-storage.php deleted file mode 100644 index 43435445..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-storage.php +++ /dev/null @@ -1,196 +0,0 @@ -get_fields() ); - - foreach ( $fields as $field ) { - $this->add_field( $field ); - } - } - - /** - * Allow for field injections - * - * @param WPSEO_Config_Field $field Field to add to the stack. - */ - public function add_field( WPSEO_Config_Field $field ) { - $this->fields[] = $field; - - if ( isset( $this->adapter ) ) { - $field->set_adapter( $this->adapter ); - } - } - - /** - * Set the adapter to use - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to use. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $this->adapter = $adapter; - - foreach ( $this->fields as $field ) { - $field->set_adapter( $this->adapter ); - } - } - - /** - * Retrieve the current adapter - * - * @return WPSEO_Configuration_Options_Adapter - */ - public function get_adapter() { - return $this->adapter; - } - - /** - * Retrieve the registered fields - * - * @returns array List of settings. - */ - public function retrieve() { - $output = array(); - - /** @var WPSEO_Config_Field $field */ - foreach ( $this->fields as $field ) { - - $build = $field->to_array(); - - $data = $this->get_field_data( $field ); - if ( ! is_null( $data ) ) { - $build['data'] = $data; - } - - $output[ $field->get_identifier() ] = $build; - } - - return $output; - } - - /** - * Save the data - * - * @param array $data_to_store Data provided by the API which needs to be processed for saving. - * - * @return string Results - */ - public function store( $data_to_store ) { - $output = array(); - - /** @var WPSEO_Config_Field $field */ - foreach ( $this->fields as $field ) { - - $field_identifier = $field->get_identifier(); - - if ( ! array_key_exists( $field_identifier, $data_to_store ) ) { - continue; - } - - $field_data = array(); - if ( isset( $data_to_store[ $field_identifier ] ) ) { - $field_data = $data_to_store[ $field_identifier ]; - } - - $result = $this->adapter->set( $field, $field_data ); - - $build = array( - 'result' => $result, - ); - - // Set current data to object to be displayed. - $data = $this->get_field_data( $field ); - if ( ! is_null( $data ) ) { - $build['data'] = $data; - } - - $output[ $field_identifier ] = $build; - } - - return $output; - } - - /** - * Filter out null input values - * - * @param mixed $input Input to test against. - * - * @return bool - */ - protected function is_not_null( $input ) { - return ! is_null( $input ); - } - - /** - * Get data from a specific field - * - * @param WPSEO_Config_Field $field Field to get data for. - * - * @return array|mixed - */ - protected function get_field_data( WPSEO_Config_Field $field ) { - $data = $this->adapter->get( $field ); - - if ( is_array( $data ) ) { - $defaults = $field->get_data(); - - // Remove 'null' values from input. - $data = array_filter( $data, array( $this, 'is_not_null' ) ); - - // Merge defaults with data. - $data = array_merge( $defaults, $data ); - } - - if ( is_null( $data ) ) { - // Get default if no data was set. - $data = $field->get_data(); - - return $data; - } - - return $data; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-structure.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-structure.php deleted file mode 100644 index f3092b63..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/class-configuration-structure.php +++ /dev/null @@ -1,93 +0,0 @@ -add_step( 'intro', __( 'Welcome!', 'wordpress-seo' ), array( - 'configurationChoices', - ), false ); - - $this->add_step( 'environment_type', __( 'Environment', 'wordpress-seo' ), array( 'environment_type' ) ); - $this->add_step( 'siteType', __( 'Site type', 'wordpress-seo' ), array( 'siteType' ) ); - $this->add_step( 'publishingEntity', __( 'Company or person', 'wordpress-seo' ), array( - 'publishingEntity', - 'publishingEntityType', - 'publishingEntityCompanyName', - 'publishingEntityCompanyLogo', - 'publishingEntityPersonName', - ) ); - $this->add_step( 'profileUrls', __( 'Social profiles', 'wordpress-seo' ), array( - 'socialProfilesIntro', - 'profileUrlFacebook', - 'profileUrlTwitter', - 'profileUrlInstagram', - 'profileUrlLinkedIn', - 'profileUrlMySpace', - 'profileUrlPinterest', - 'profileUrlYouTube', - 'profileUrlGooglePlus', - ) ); - - $fields = array( 'postTypeVisibility' ); - - $post_type_factory = new WPSEO_Config_Factory_Post_Type(); - foreach ( $post_type_factory->get_fields() as $post_type_field ) { - $fields[] = $post_type_field->get_identifier(); - } - $this->add_step( 'postTypeVisibility', __( 'Post type visibility', 'wordpress-seo' ), $fields ); - - $this->add_step( 'multipleAuthors', __( 'Multiple authors', 'wordpress-seo' ), array( 'multipleAuthors' ) ); - $this->add_step( 'connectGoogleSearchConsole', __( 'Google Search Console', 'wordpress-seo' ), array( 'connectGoogleSearchConsole' ) ); - $this->add_step( 'titleTemplate', __( 'Title settings', 'wordpress-seo' ), array( - 'siteName', - 'separator', - ) ); - $this->add_step( 'newsletter', __( 'Newsletter' ), array( - 'mailchimpSignup', - ) ); - $this->add_step( 'suggestions', __( 'You might like', 'wordpress-seo' ), array( - 'suggestions' - ) ); - $this->add_step( 'success', __( 'Success!', 'wordpress-seo' ), array( - 'successMessage', - ) ); - } - - /** - * Add a step to the structure - * - * @param string $identifier Identifier for this step. - * @param string $title Title to display for this step. - * @param array $fields Fields to use on the step. - * @param bool $navigation Show navigation buttons. - */ - protected function add_step( $identifier, $title, $fields, $navigation = true ) { - $this->steps[ $identifier ] = array( - 'title' => $title, - 'fields' => $fields, - 'hideNavigation' => ! (bool) $navigation, - ); - } - - /** - * Retrieve the registered steps - * - * @return array - */ - public function retrieve() { - return $this->steps; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-configuration-choices.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-configuration-choices.php deleted file mode 100644 index d67731c9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-configuration-choices.php +++ /dev/null @@ -1,96 +0,0 @@ -set_property( 'label', sprintf( - /* translators: %s expands to 'Yoast SEO'. */ - __( 'Please choose the %s configuration of your liking:', 'wordpress-seo' ), 'Yoast SEO' ) - ); - - $field->add_choice( - sprintf( - /* translators: %s expands to 'Yoast SEO'. */ - __( 'Configure %s in a few steps', 'wordpress-seo' ), - 'Yoast SEO' - ), - sprintf( - /* translators: %1$s expands to 'Yoast SEO'. */ - __( 'Welcome to the %1$s configuration wizard. In a few simple steps we\'ll help you configure your SEO settings to match your website\'s needs! %1$s will take care of all the technical optimizations your site needs.', 'wordpress-seo' ), - 'Yoast SEO' - ), - array( - 'type' => 'primary', - 'label' => sprintf( - /* translators: %s expands to 'Yoast SEO'. */ - __( 'Configure %s', 'wordpress-seo' ), 'Yoast SEO' - ), - 'action' => 'nextStep', - ), - plugin_dir_url( WPSEO_FILE ) . '/images/Yoast_SEO_Icon.svg' - ); - $field->add_choice( - sprintf( - /* translators: %s expands to 'Yoast SEO'. */ - __( 'Let us set up %s for you', 'wordpress-seo' ), 'Yoast SEO' - ), - sprintf( - /* translators: %1$s expands to 'Yoast SEO', %2$s expands to 'Yoast SEO Premium'. */ - __( 'While we strive to make setting up %1$s as easy as possible, we understand it can still be daunting. If you would rather have us set up %1$s for you (and get a copy of %2$s in the process), order a %1$s configuration service and sit back while we configure your site.', 'wordpress-seo' ), - 'Yoast SEO', - 'Yoast SEO Premium' - ), - array( - 'type' => 'secondary', - 'label' => __( 'Configuration service', 'wordpress-seo' ), - 'action' => 'followURL', - 'url' => 'https://yoa.st/wizard-configuration-upsell', - ), - plugin_dir_url( WPSEO_FILE ) . 'images/yoast-configuration-icon.svg' - ); - - return $field; - } - - /** - * Get the data for the field. - * - * @return array - */ - public function get_data() { - return array(); - } - - /** - * Save data - * - * @param array $data Data containing changes. - * - * @return bool - */ - public function set_data( $data ) { - return true; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-connect-google-search-console.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-connect-google-search-console.php deleted file mode 100644 index b5fa7b04..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-connect-google-search-console.php +++ /dev/null @@ -1,149 +0,0 @@ -gsc_service = new WPSEO_GSC_Service( $this->get_profile() ); - } - - /** - * Set the Google Search Console service. - * - * @param WPSEO_GSC_Service $service Set service to use. - */ - public function set_gsc_service( WPSEO_GSC_Service $service ) { - $this->gsc_service = $service; - } - - /** - * Gets the component identifier. - * - * @return string - */ - public function get_identifier() { - return 'ConnectGoogleSearchConsole'; - } - - /** - * Gets the field. - * - * @return WPSEO_Config_Field - */ - public function get_field() { - return new WPSEO_Config_Field_Connect_Google_Search_Console(); - } - - /** - * Get the data for the field. - * - * @return mixed - */ - public function get_data() { - - $data = array( - 'profileList' => $this->get_profilelist(), - 'profile' => $this->get_profile(), - 'hasAccessToken' => $this->hasAccessToken(), - ); - - return $data; - } - - /** - * Save data - * - * @param array $data Data containing changes. - * - * @return mixed - */ - public function set_data( $data ) { - - $current_data = $this->get_data(); - - $this->handle_profile_change( $current_data, $data ); - - // Save profile. - $has_saved = update_option( - WPSEO_GSC::OPTION_WPSEO_GSC, - array( 'profile' => $data['profile'] ) - ); - - // Collect results to return to the configurator. - $results = array( - 'profile' => $has_saved, - ); - - return $results; - } - - /** - * Remove issues when the profile has changed - * - * @param array $current_data Saved data before changes. - * @param array $data Data after changes. - */ - protected function handle_profile_change( $current_data, $data ) { - // If the profile has been changed, remove issues. - if ( $current_data['profile'] === $data['profile'] ) { - return; - } - - $this->reload_issues(); - } - - /** - * Get the current GSC profile - * - * @return string - */ - protected function get_profile() { - return WPSEO_GSC_Settings::get_profile(); - } - - /** - * Reload GSC issues - */ - protected function reload_issues() { - WPSEO_GSC_Settings::reload_issues(); - } - - /** - * Gets a list with the profiles. - * - * @return array - */ - protected function get_profilelist() { - $profiles = array(); - $sites = $this->gsc_service->get_sites(); - foreach ( $sites as $site_key => $site_value ) { - $profiles[ untrailingslashit( $site_key ) ] = untrailingslashit( $site_value ); - } - - return $profiles; - } - - /** - * Checks if there is an access token. If so, there is a connection. - * - * @return bool - */ - private function hasAccessToken() { - return ( null !== $this->gsc_service->get_client()->getAccessToken() ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-mailchimp-signup.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-mailchimp-signup.php deleted file mode 100644 index a6ab920f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-mailchimp-signup.php +++ /dev/null @@ -1,79 +0,0 @@ - $this->has_mailchimp_signup(), - ); - - return $data; - } - - /** - * Save data - * - * @param array $data Data containing changes. - * - * @return mixed - */ - public function set_data( $data ) { - - $has_saved = false; - if ( ! empty( $data['hasSignup'] ) ) { - // Saves the user meta. - update_user_meta( get_current_user_id(), self::META_NAME, true ); - - $has_saved = ( $data['hasSignup'] === $this->has_mailchimp_signup() ); - } - - // Collect results to return to the configurator. - $results = array( - 'hasSignup' => $has_saved, - ); - - return $results; - } - - /** - * Checks if the user has entered his email for mailchimp already. - * - * @return bool - */ - protected function has_mailchimp_signup() { - $user_meta = get_user_meta( get_current_user_id(), self::META_NAME, true ); - - return ( ! empty( $user_meta ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-suggestions.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-suggestions.php deleted file mode 100644 index 5f439bb0..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/class-component-suggestions.php +++ /dev/null @@ -1,106 +0,0 @@ -add_suggestion( - /* translators: %s resolves to Yoast SEO Premium */ - sprintf( __( 'Outrank the competition with %s', 'wordpress-seo' ), 'Yoast SEO Premium' ), - /* translators: %1$s resolves to Yoast SEO Premium */ - sprintf( __( 'Do you want to outrank your competition? %1$s gives you awesome additional features that\'ll help you to set up your SEO strategy like a professional. Use the multiple focus keywords functionality, the redirect manager and our internal linking tool. %1$s will also give you access to premium support.', 'wordpress-seo' ), 'Yoast SEO Premium' ), - array( - 'label' => __( 'Upgrade to Premium', 'wordpress-seo' ), - 'type' => 'primary', - 'url' => 'https://yoa.st/wizard-suggestion-premium', - ), - 'https://yoa.st/video-yoast-seo-premium' - ); - } - - $field->add_suggestion( - __( 'Learn how to write copy that ranks', 'wordpress-seo' ), - /* translators: %1$s resolves to SEO copywriting training */ - sprintf( __( 'Do you want to learn how to write content that generates traffic? Check out our %1$s. We will help you to write awesome copy that will rank in the search engines. The %1$s covers all the main steps in SEO copywriting: from keyword research to publishing.', 'wordpress-seo' ), 'SEO copywriting training' ), - array( - 'label' => 'SEO copywriting training', - 'type' => 'link', - 'url' => 'https://yoa.st/configuration-wizard-copywrite-course-link', - ), - 'https://yoa.st/video-course-copywriting' - ); - - $field->add_suggestion( - /* translators: %1$s resolves to Yoast SEO, %2$s resolves to Yoast SEO plugin training */ - sprintf( __( 'Get the most out of %1$s with the %2$s', 'wordpress-seo' ), 'Yoast SEO', 'Yoast SEO plugin training' ), - /* translators: %1$s resolves to Yoast SEO */ - sprintf( __( 'Do you want to know all the ins and outs of the %1$s plugin? Do you want to learn all about our advanced settings? Want to be able to really get the most out of the %1$s plugin? Check out our %1$s plugin training and start outranking the competition!', 'wordpress-seo' ), 'Yoast SEO' ), - array( - 'label' => 'Yoast SEO plugin training', - 'type' => 'link', - 'url' => 'https://yoa.st/wizard-suggestion-plugin-course', - ), - 'https://yoa.st/video-plugin-course' - ); - - // When we are running in Yoast SEO Premium and don't have Local SEO installed, show Local SEO as suggestion. - if ( defined( 'WPSEO_PREMIUM_PLUGIN_FILE' ) && ! defined( 'WPSEO_LOCAL_FILE' ) ) { - $field->add_suggestion( - sprintf( __( 'Attract more customers near you', 'wordpress-seo' ), 'Yoast SEO', 'Yoast SEO plugin training' ), - /* translators: %1$s resolves to Local SEO */ - sprintf( __( 'If you want to outrank the competition in a specific town or region, check out our %1$s plugin! You’ll be able to easily insert Google maps, opening hours, contact information and a store locator. Besides that %1$s helps you to improve the usability of your contact page.', 'wordpress-seo' ), 'Local SEO' ), - array( - 'label' => 'Local SEO', - 'type' => 'link', - 'url' => 'https://yoa.st/wizard-suggestion-localseo', - ), - 'https://yoa.st/video-localseo' - ); - } - - return $field; - } - - /** - * Get the data for the field. - * - * @return array - */ - public function get_data() { - return array(); - } - - /** - * Save data - * - * @param array $data Data containing changes. - * - * @return bool - */ - public function set_data( $data ) { - return true; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/interface-component.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/interface-component.php deleted file mode 100644 index 265c24e9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/components/interface-component.php +++ /dev/null @@ -1,33 +0,0 @@ - true ), 'objects' ); - if ( ! empty( $post_types ) ) { - foreach ( $post_types as $post_type => $post_type_object ) { - $label = $this->decode_html_entities( $post_type_object->label ); - $field = new WPSEO_Config_Field_Choice_Post_Type( $post_type, $label ); - - $this->add_custom_properties( $post_type, $field ); - - $fields[] = $field; - } - } - - self::$fields = $fields; - } - - return self::$fields; - } - - /** - * Add custom properties for specific post types - * - * @param string $post_type Post type of field that is being added. - * @param WPSEO_Config_Field $field Field that corresponds to the post type. - */ - private function add_custom_properties( $post_type, $field ) { - if ( 'attachment' === $post_type ) { - $field->set_property( 'explanation', __( 'WordPress automatically generates an URL for each media item in the library. Enabling this will allow for google to index the generated URL.', 'wordpress-seo' ) ); - } - } - - /** - * Replaces the HTML entity with it's actual symbol. - * - * Because we do not not know what consequences it will have if we convert every HTML entity, - * we will only replace the characters that we have known problems with in text's. - * - * @param string $text The text to decode. - * - * @return string String with decoded HTML entities. - */ - private function decode_html_entities( $text ) { - return str_replace( ''', '’', $text ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-choice-post-type.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-choice-post-type.php deleted file mode 100644 index 52171132..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-choice-post-type.php +++ /dev/null @@ -1,92 +0,0 @@ -post_type = $post_type; - - /* Translators: %1$s expands to the name of the post type. The options given to the user are "visible" and "hidden" */ - $this->set_property( 'label', sprintf( __( 'The post type "%1$s" should be', 'wordpress-seo' ), $label ) ); - - $this->add_choice( 'true', __( 'Visible', 'wordpress-seo' ) ); - $this->add_choice( 'false', __( 'Hidden', 'wordpress-seo' ) ); - } - - /** - * Set adapter - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_custom_lookup( - $this->get_identifier(), - array( $this, 'get_data' ), - array( $this, 'set_data' ) - ); - } - - /** - * Get the post type of this field. - * - * @return string Post type. - */ - public function get_post_type() { - return $this->post_type; - } - - /** - * @return bool - */ - public function get_data() { - $option = WPSEO_Options::get_option( 'wpseo_xml' ); - - $key = 'post_types-' . $this->get_post_type() . '-not_in_sitemap'; - - $stored_data = ! isset( $option[ $key ] ) || false === $option[ $key ]; - - if ( $stored_data ) { - return 'true'; - } - - return 'false'; - } - - /** - * Set new data - * - * @param string $visible Visible (true) or hidden (false). - * - * @return bool - */ - public function set_data( $visible ) { - $post_type = $this->get_post_type(); - - $option = WPSEO_Options::get_option( 'wpseo_xml' ); - - $option[ 'post_types-' . $post_type . '-not_in_sitemap' ] = ( $visible === 'false' ); - - update_option( 'wpseo_xml', $option ); - - // Check if everything got saved properly. - $saved_option = WPSEO_Options::get_option( 'wpseo_xml' ); - - return ( ( $visible === 'false' ) && $saved_option[ 'post_types-' . $post_type . '-not_in_sitemap' ] === true ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-choice.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-choice.php deleted file mode 100644 index e9fe970c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-choice.php +++ /dev/null @@ -1,40 +0,0 @@ -properties['choices'] = array(); - } - - /** - * Add a choice to the properties - * - * @param string $value Value op the option. - * @param string $label Label to display for the value. - * @param string $screen_reader_text Optional. Screenreader text to use. - */ - public function add_choice( $value, $label, $screen_reader_text = '' ) { - $choice = array( - 'label' => $label, - ); - - if ( $screen_reader_text ) { - $choice['screenReaderText'] = $screen_reader_text; - } - - $this->properties['choices'][ $value ] = $choice; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-company-logo.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-company-logo.php deleted file mode 100644 index 8092d61f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-company-logo.php +++ /dev/null @@ -1,28 +0,0 @@ -set_property( 'label', __( 'Provide an image of the company logo', 'wordpress-seo' ) ); - - $this->set_requires( 'publishingEntityType', 'company' ); - } - - /** - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_yoast_lookup( $this->get_identifier(), 'wpseo', 'company_logo' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-company-name.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-company-name.php deleted file mode 100644 index 1247dabb..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-company-name.php +++ /dev/null @@ -1,28 +0,0 @@ -set_property( 'label', __( 'The name of the company', 'wordpress-seo' ) ); - - $this->set_requires( 'publishingEntityType', 'company' ); - } - - /** - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_yoast_lookup( $this->get_identifier(), 'wpseo', 'company_name' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-company-or-person.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-company-or-person.php deleted file mode 100644 index 857bdbb6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-company-or-person.php +++ /dev/null @@ -1,29 +0,0 @@ -set_property( 'label', __( 'This data is shown as metadata in your site. It is intended to appear in Google\'s Knowledge Graph. You can be either a company, or a person, choose either:', 'wordpress-seo' ) ); - - $this->add_choice( 'company', __( 'Company', 'wordpress-seo' ) ); - $this->add_choice( 'person', __( 'Person', 'wordpress-seo' ) ); - } - - /** - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_yoast_lookup( $this->get_identifier(), 'wpseo', 'company_or_person' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-configuration-choices.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-configuration-choices.php deleted file mode 100644 index 2a37de39..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-configuration-choices.php +++ /dev/null @@ -1,41 +0,0 @@ -properties['choices'] = array(); - } - - /** - * Adds a choice to the properties - * - * @param string $title The title of the choice. - * @param string $copy The text explaining the choice. - * @param array $button The button details. - * @param null|string $image The image accompanying the choice. - */ - public function add_choice( $title, $copy, $button, $image = null ) { - $choice = array( - 'title' => $title, - 'copy' => $copy, - 'button' => $button, - ); - - if ( ! empty( $image ) ) { - $choice['image'] = $image; - } - - $this->properties['choices'][] = $choice; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-connect-google-search-console.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-connect-google-search-console.php deleted file mode 100644 index f22910c5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-connect-google-search-console.php +++ /dev/null @@ -1,28 +0,0 @@ - '', - 'profileList' => '', - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-environment.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-environment.php deleted file mode 100644 index 92df2f02..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-environment.php +++ /dev/null @@ -1,95 +0,0 @@ -set_property( 'label', sprintf( __( 'Please specify the environment in which this site - %1$s - is running.', 'wordpress-seo' ), get_home_url() ) ); - - $this->add_choice( 'production', __( 'Production (this is a live site with real traffic)', 'wordpress-seo' ) ); - $this->add_choice( 'staging', __( 'Staging (this is a copy of a live site used for testing purposes only)', 'wordpress-seo' ) ); - $this->add_choice( 'development', __( 'Development (this site is running locally for development purposes)', 'wordpress-seo' ) ); - } - - /** - * Set adapter - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_custom_lookup( - $this->get_identifier(), - array( $this, 'get_data' ), - array( $this, 'set_data' ) - ); - } - - /** - * Gets the option that is set for this field. - * - * @return string The value for the environment_type wpseo option. - */ - public function get_data() { - $option = WPSEO_Options::get_option( 'wpseo' ); - - return $option['environment_type']; - } - - /** - * Set new data. - * - * @param string $environment_type The site's environment type. - * - * @return bool Returns whether the value is successfully set. - */ - public function set_data( $environment_type ) { - $option = WPSEO_Options::get_option( 'wpseo' ); - - if ( $option['environment_type'] !== $environment_type ) { - $option['environment_type'] = $environment_type; - update_option( 'wpseo', $option ); - if ( ! $this->set_indexation( $environment_type ) ) { - return false; - } - } - - $saved_environment_option = WPSEO_Options::get_option( 'wpseo' ); - - return ( $saved_environment_option['environment_type'] === $option['environment_type'] ); - } - - /** - * Set the WordPress Search Engine Visibility option based on the environment type. - * - * @param string $environment_type The environment the site is running in. - * - * @return bool Returns if the options is set successfully. - */ - protected function set_indexation( $environment_type ) { - $new_blog_public_value = 0; - $current_blog_public_value = get_option( 'blog_public' ); - - if ( $environment_type === 'production' ) { - $new_blog_public_value = 1; - } - - if ( $current_blog_public_value !== $new_blog_public_value ) { - update_option( 'blog_public', $new_blog_public_value ); - - return true; - } - $saved_blog_public_value = get_option( 'blog_public' ); - - return ( $saved_blog_public_value === $new_blog_public_value ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-mailchimp-signup.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-mailchimp-signup.php deleted file mode 100644 index 17c1e66b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-mailchimp-signup.php +++ /dev/null @@ -1,58 +0,0 @@ -ID > 0 ) ? $current_user->user_email : ''; - - $this->set_property( 'title' , __( 'Stay up-to-date', 'wordpress-seo' ) ); - $this->set_property( - 'label', - sprintf( - /* translators: %s expands to Yoast SEO. */ - __( 'Your %1$s plugin is now set up. SEO, however, is subject to constant change. Sign up for our newsletter if you would like to keep up-to-date regarding %1$s, other plugins by Yoast and important news in the world of SEO.', 'wordpress-seo' ), - 'Yoast SEO' - ) - ); - - $this->set_property( 'decoration', plugin_dir_url( WPSEO_FILE ) . 'images/newsletter-collage.png' ); - - $this->set_property( 'mailchimpActionUrl', 'https://yoast.us1.list-manage.com/subscribe/post-json?u=ffa93edfe21752c921f860358&id=972f1c9122' ); - $this->set_property( 'currentUserEmail', $user_email ); - $this->set_property( 'userName', trim( $current_user->user_firstname . ' ' . $current_user->user_lastname ) ); - } - - /** - * Get the data - * - * @return array - */ - public function get_data() { - return array( - 'hasSignup' => $this->has_mailchimp_signup(), - ); - - } - - /** - * Checks if the user has entered his email for mailchimp already. - * - * @return bool - */ - protected function has_mailchimp_signup() { - $user_meta = get_user_meta( get_current_user_id(), WPSEO_Config_Component_Mailchimp_Signup::META_NAME, true ); - return ( ! empty( $user_meta ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-multiple-authors.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-multiple-authors.php deleted file mode 100644 index 297e33ad..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-multiple-authors.php +++ /dev/null @@ -1,81 +0,0 @@ -set_property( 'label', __( 'Does, or will, your site have multiple authors?', 'wordpress-seo' ) ); - - $this->add_choice( 'yes', __( 'Yes', 'wordpress-seo' ) ); - $this->add_choice( 'no', __( 'No', 'wordpress-seo' ) ); - } - - /** - * Set adapter. - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_custom_lookup( - $this->get_identifier(), - array( $this, 'get_data' ), - array( $this, 'set_data' ) - ); - } - - /** - * Get the data from the stored options. - * - * @return null|string - */ - public function get_data() { - - $option = WPSEO_Options::get_option( 'wpseo' ); - if ( isset( $option['has_multiple_authors'] ) ) { - $value = $option['has_multiple_authors']; - } - - if ( ! isset( $value ) || is_null( $value ) ) { - // If there are more than one users with level > 1 default to multiple authors. - $users = get_users( array( - 'fields' => 'IDs', - 'who' => 'authors', - ) ); - - $value = count( $users ) > 1; - } - - return ( $value ) ? 'yes' : 'no'; - } - - /** - * Set the data in the options. - * - * @param {string} $data The data to set for the field. - * - * @return bool Returns true or false for successful storing the data. - */ - public function set_data( $data ) { - $value = ( $data === 'yes' ); - - // Set multiple authors option. - $result_multiple_authors = WPSEO_Options::save_option( 'wpseo', 'has_multiple_authors', $value ); - - /* - * Set disable author archives option. When multiple authors is set to true, - * the disable author option has to be false. Because of this the $value is inversed. - */ - $result_author_archives = WPSEO_Options::save_option( 'wpseo_titles', 'disable-author', ! $value ); - - return ( $result_multiple_authors === true && $result_author_archives === true ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-person-name.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-person-name.php deleted file mode 100644 index 5f0cc4f3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-person-name.php +++ /dev/null @@ -1,28 +0,0 @@ -set_property( 'label', __( 'The name of the person', 'wordpress-seo' ) ); - - $this->set_requires( 'publishingEntityType', 'person' ); - } - - /** - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_yoast_lookup( $this->get_identifier(), 'wpseo', 'person_name' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-post-type-visibility.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-post-type-visibility.php deleted file mode 100644 index 506bd884..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-post-type-visibility.php +++ /dev/null @@ -1,23 +0,0 @@ -' . esc_html( $copy ) . '


    '; - - $this->set_property( 'html', $html ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-facebook.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-facebook.php deleted file mode 100644 index ed84a88c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-facebook.php +++ /dev/null @@ -1,29 +0,0 @@ -set_property( 'label', __( 'Facebook Page URL', 'wordpress-seo' ) ); - $this->set_property( 'pattern', '^https:\/\/www\.facebook\.com\/([^/]+)\/$' ); - } - - /** - * Set adapter - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_yoast_lookup( $this->get_identifier(), 'wpseo_social', 'facebook_site' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-googleplus.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-googleplus.php deleted file mode 100644 index 65a1a3c6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-googleplus.php +++ /dev/null @@ -1,29 +0,0 @@ -set_property( 'label', __( 'Google+ URL', 'wordpress-seo' ) ); - $this->set_property( 'pattern', '^https:\/\/plus\.google\.com\/([^/]+)$' ); - } - - /** - * Set adapter - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_yoast_lookup( $this->get_identifier(), 'wpseo_social', 'google_plus_url' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-instagram.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-instagram.php deleted file mode 100644 index 6a33b51b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-instagram.php +++ /dev/null @@ -1,29 +0,0 @@ -set_property( 'label', __( 'Instagram URL', 'wordpress-seo' ) ); - $this->set_property( 'pattern', '^https:\/\/www\.instagram\.com\/([^/]+)\/$' ); - } - - /** - * Set adapter - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_yoast_lookup( $this->get_identifier(), 'wpseo_social', 'instagram_url' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-linkedin.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-linkedin.php deleted file mode 100644 index b58c96f4..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-linkedin.php +++ /dev/null @@ -1,29 +0,0 @@ -set_property( 'label', __( 'LinkedIn URL', 'wordpress-seo' ) ); - $this->set_property( 'pattern', '^https:\/\/www\.linkedin\.com\/in\/([^/]+)$' ); - } - - /** - * Set adapter - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_yoast_lookup( $this->get_identifier(), 'wpseo_social', 'linkedin_url' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-myspace.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-myspace.php deleted file mode 100644 index 42168ed3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-myspace.php +++ /dev/null @@ -1,29 +0,0 @@ -set_property( 'label', __( 'MySpace URL', 'wordpress-seo' ) ); - $this->set_property( 'pattern', '^https:\/\/myspace\.com\/([^/]+)\/$' ); - } - - /** - * Set adapter - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_yoast_lookup( $this->get_identifier(), 'wpseo_social', 'myspace_url' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-pinterest.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-pinterest.php deleted file mode 100644 index 544bb646..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-pinterest.php +++ /dev/null @@ -1,29 +0,0 @@ -set_property( 'label', __( 'Pinterest URL', 'wordpress-seo' ) ); - $this->set_property( 'pattern', '^https:\/\/www\.pinterest\.com\/([^/]+)\/$' ); - } - - /** - * Set adapter - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_yoast_lookup( $this->get_identifier(), 'wpseo_social', 'pinterest_url' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-twitter.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-twitter.php deleted file mode 100644 index 223be1b5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-twitter.php +++ /dev/null @@ -1,28 +0,0 @@ -set_property( 'label', __( 'Twitter Username', 'wordpress-seo' ) ); - } - - /** - * Set adapter - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_yoast_lookup( $this->get_identifier(), 'wpseo_social', 'twitter_site' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-youtube.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-youtube.php deleted file mode 100644 index 5a53b815..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-profile-url-youtube.php +++ /dev/null @@ -1,29 +0,0 @@ -set_property( 'label', __( 'YouTube URL', 'wordpress-seo' ) ); - $this->set_property( 'pattern', '^https:\/\/www\.youtube\.com\/([^/]+)$' ); - } - - /** - * Set adapter - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_yoast_lookup( $this->get_identifier(), 'wpseo_social', 'youtube_url' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-separator.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-separator.php deleted file mode 100644 index 297a6c34..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-separator.php +++ /dev/null @@ -1,43 +0,0 @@ -set_property( 'label', __( 'Title Separator', 'wordpress-seo' ) ); - $this->set_property( 'explanation', __( 'Choose the symbol to use as your title separator. This will display, for instance, between your post title and site name. Symbols are shown in the size they\'ll appear in the search results.', 'wordpress-seo' ) ); - - $this->add_choice( 'sc-dash', '-', __( 'Dash', 'wordpress-seo' ) ); - $this->add_choice( 'sc-ndash', '–', __( 'En dash', 'wordpress-seo' ) ); - $this->add_choice( 'sc-mdash', '—', __( 'Em dash', 'wordpress-seo' ) ); - $this->add_choice( 'sc-middot', '·', __( 'Middle dot', 'wordpress-seo' ) ); - $this->add_choice( 'sc-bull', '•', __( 'Bullet', 'wordpress-seo' ) ); - $this->add_choice( 'sc-star', '*', __( 'Asterisk', 'wordpress-seo' ) ); - $this->add_choice( 'sc-smstar', '⋆', __( 'Low asterisk', 'wordpress-seo' ) ); - $this->add_choice( 'sc-pipe', '|', __( 'Vertical bar', 'wordpress-seo' ) ); - $this->add_choice( 'sc-tilde', '~', __( 'Small tilde', 'wordpress-seo' ) ); - $this->add_choice( 'sc-laquo', '«', __( 'Left angle quotation mark', 'wordpress-seo' ) ); - $this->add_choice( 'sc-raquo', '»', __( 'Right angle quotation mark', 'wordpress-seo' ) ); - $this->add_choice( 'sc-lt', '<', __( 'Less than sign', 'wordpress-seo' ) ); - $this->add_choice( 'sc-gt', '>', __( 'Greater than sign', 'wordpress-seo' ) ); - } - - /** - * Set adapter - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_yoast_lookup( $this->get_identifier(), 'wpseo_titles', 'separator' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-site-name.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-site-name.php deleted file mode 100644 index 318d9c8f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-site-name.php +++ /dev/null @@ -1,67 +0,0 @@ -set_property( 'label', __( 'Website name', 'wordpress-seo' ) ); - $this->set_property( 'explanation', __( 'Google shows your website\'s name in the search results, if you want to change it, you can do that here.', 'wordpress-seo' ) ); - } - - /** - * Set adapter - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_custom_lookup( - $this->get_identifier(), - array( $this, 'get_data' ), - array( $this, 'set_data' ) - ); } - - /** - * Get the data from the stored options. - * - * @return null|string - */ - public function get_data() { - $option = WPSEO_Options::get_option( 'wpseo' ); - if ( ! empty( $option['website_name'] ) ) { - return $option['website_name']; - } - - return get_bloginfo( 'name' ); - } - - /** - * Set the data in the options. - * - * @param {string} $data The data to set for the field. - * - * @return bool Returns true or false for successful storing the data. - */ - public function set_data( $data ) { - $value = $data; - - $option = WPSEO_Options::get_option( 'wpseo' ); - $option['website_name'] = $value; - - update_option( 'wpseo', $option ); - - // Check if everything got saved properly. - $saved_option = WPSEO_Options::get_option( 'wpseo' ); - - return ( $saved_option['website_name'] === $option['website_name'] ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-site-type.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-site-type.php deleted file mode 100644 index 08f1a4e8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-site-type.php +++ /dev/null @@ -1,36 +0,0 @@ -set_property( 'label', sprintf( __( 'What kind of site is %1$s?', 'wordpress-seo' ), get_home_url() ) ); - - $this->add_choice( 'blog', __( 'Blog', 'wordpress-seo' ) ); - $this->add_choice( 'shop', __( 'Webshop', 'wordpress-seo' ) ); - $this->add_choice( 'news', __( 'News site', 'wordpress-seo' ) ); - $this->add_choice( 'smallBusiness', __( 'Small business site', 'wordpress-seo' ) ); - $this->add_choice( 'corporateOther', __( 'Other corporate site', 'wordpress-seo' ) ); - $this->add_choice( 'personalOther', __( 'Other personal site', 'wordpress-seo' ) ); - } - - /** - * Set adapter - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - $adapter->add_yoast_lookup( $this->get_identifier(), 'wpseo', 'site_type' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-social-profiles-intro.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-social-profiles-intro.php deleted file mode 100644 index 986a1798..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-social-profiles-intro.php +++ /dev/null @@ -1,23 +0,0 @@ -' . esc_html( $intro_text ) . '

    '; - - $this->set_property( 'html', $html ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-success-message.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-success-message.php deleted file mode 100644 index c2c56830..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-success-message.php +++ /dev/null @@ -1,35 +0,0 @@ -set_property( 'title', 'You\'ve done it!' ); - $this->set_property( 'message', $success_message ); - $this->set_property( 'video', array( - 'url' => 'https://yoa.st/metabox-screencast', - 'title' => sprintf( - /* translators: %1$s expands to Yoast SEO. */ - __( '%1$s video tutorial', 'wordpress-seo' ), - 'Yoast SEO' - ), - ) - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-suggestions.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-suggestions.php deleted file mode 100644 index b23897a8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-suggestions.php +++ /dev/null @@ -1,42 +0,0 @@ -properties['suggestions'] = array(); - } - - /** - * Adds a suggestion to the properties - * - * @param string $title The title of the choice. - * @param string $copy The text explaining the choice. - * @param array $button The button details. - * @param null|string $video The video accompanying the choice. - */ - public function add_suggestion( $title, $copy, $button, $video = null ) { - $suggestion = array( - 'title' => $title, - 'copy' => $copy, - 'button' => $button, - ); - - if ( ! empty( $video ) ) { - $suggestion['video'] = $video; - } - - $this->properties['suggestions'][] = $suggestion; - } -} - diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-upsell-configuration-service.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-upsell-configuration-service.php deleted file mode 100644 index bf2dea4a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-upsell-configuration-service.php +++ /dev/null @@ -1,43 +0,0 @@ -', - '' - ); - - $html = '

    ' . esc_html( $intro_text ) . '

    '; - $html .= '

    ' . wp_kses( $upsell_text, array( - 'a' => array( - 'target' => array( '_blank' ), - 'href' => array(), - ), - ) ) . '

    '; - - - $this->set_property( 'html', $html ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-upsell-site-review.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-upsell-site-review.php deleted file mode 100644 index e243fe69..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field-upsell-site-review.php +++ /dev/null @@ -1,36 +0,0 @@ -Yoast SEO for WordPress training', - '', - '' - ); - - $html = '

    ' . - wp_kses( $upsell_text, array( - 'a' => array( - 'href' => array(), - 'target' => array( '_blank' ), - ), - ) ) . - '

    '; - - $this->set_property( 'html', $html ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field.php b/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field.php deleted file mode 100644 index eacf7dd2..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/config-ui/fields/class-field.php +++ /dev/null @@ -1,134 +0,0 @@ -field = $field; - $this->component = $component; - } - - /** - * Get the identifier - * - * @return string - */ - public function get_identifier() { - return $this->field; - } - - /** - * Get the component - * - * @return string - */ - public function get_component() { - return $this->component; - } - - /** - * Set a property value - * - * @param string $name Property to set. - * @param mixed $value Value to apply. - */ - public function set_property( $name, $value ) { - $this->properties[ $name ] = $value; - } - - /** - * Get all the properties - * - * @return array - */ - public function get_properties() { - return $this->properties; - } - - /** - * Get the data - * - * @return mixed - */ - public function get_data() { - return $this->data; - } - - /** - * Array representation of this object. - * - * @return array - */ - public function to_array() { - $output = array( - 'componentName' => $this->get_component(), - ); - - $properties = $this->get_properties(); - if ( $properties ) { - $output['properties'] = $properties; - } - - $requires = $this->get_requires(); - if ( ! empty( $requires ) ) { - $output['requires'] = $requires; - } - - return $output; - } - - /** - * Set the adapter to use - * - * @param WPSEO_Configuration_Options_Adapter $adapter Adapter to register lookup on. - */ - public function set_adapter( WPSEO_Configuration_Options_Adapter $adapter ) { - } - - /** - * Requires another field to have a certain value. - * - * @param string $field Field to check for a certain value. - * @param mixed $value Value of the field. - */ - public function set_requires( $field, $value ) { - $this->requires = array( - 'field' => $field, - 'value' => $value, - ); - } - - /** - * Get the required field settings (if present) - * - * @return array - */ - public function get_requires() { - return $this->requires; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-metabox-formatter.php b/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-metabox-formatter.php deleted file mode 100644 index 77361e04..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-metabox-formatter.php +++ /dev/null @@ -1,117 +0,0 @@ -formatter = $formatter; - } - - /** - * Returns the values - * - * @return array - */ - public function get_values() { - $defaults = $this->get_defaults(); - $values = $this->formatter->get_values(); - - return ( $values + $defaults ); - } - - /** - * Returns array with all the values always needed by a scraper object - * - * @return array - */ - private function get_defaults() { - $analysis_seo = new WPSEO_Metabox_Analysis_SEO(); - $analysis_readability = new WPSEO_Metabox_Analysis_Readability(); - - return array( - 'search_url' => '', - 'post_edit_url' => '', - 'base_url' => '', - 'contentTab' => __( 'Readability', 'wordpress-seo' ), - 'keywordTab' => __( 'Keyword:', 'wordpress-seo' ), - 'enterFocusKeyword' => __( 'Enter your focus keyword', 'wordpress-seo' ), - 'removeKeyword' => __( 'Remove keyword', 'wordpress-seo' ), - 'contentLocale' => get_locale(), - 'userLocale' => WPSEO_Utils::get_user_locale(), - 'translations' => $this->get_translations(), - 'keyword_usage' => array(), - 'title_template' => '', - 'metadesc_template' => '', - 'contentAnalysisActive' => $analysis_readability->is_enabled() ? 1 : 0, - 'keywordAnalysisActive' => $analysis_seo->is_enabled() ? 1 : 0, - - /** - * Filter to determine if the markers should be enabled or not. - * - * @param bool $showMarkers Should the markers being enabled. Default = true. - */ - 'show_markers' => apply_filters( 'wpseo_enable_assessment_markers', true ), - 'publish_box' => array( - 'labels' => array( - 'content' => __( 'Readability', 'wordpress-seo' ), - 'keyword' => __( 'SEO', 'wordpress-seo' ), - ), - 'statuses' => array( - 'na' => __( 'Not available', 'wordpress-seo' ), - 'bad' => __( 'Needs improvement', 'wordpress-seo' ), - 'ok' => __( 'OK', 'wordpress-seo' ), - 'good' => __( 'Good', 'wordpress-seo' ), - ), - ), - 'markdownEnabled' => $this->is_markdown_enabled(), - ); - - } - - /** - * Returns Jed compatible YoastSEO.js translations. - * - * @return array - */ - private function get_translations() { - $locale = WPSEO_Utils::get_user_locale(); - - $file = plugin_dir_path( WPSEO_FILE ) . 'languages/wordpress-seo-' . $locale . '.json'; - if ( file_exists( $file ) && $file = file_get_contents( $file ) ) { - return json_decode( $file, true ); - } - - return array(); - } - - /** - * Checks if Jetpack's markdown module is enabled. - * Can be extended to work with other plugins that parse markdown in the content. - * - * @return boolean - */ - private function is_markdown_enabled() { - if ( class_exists( 'Jetpack' ) && method_exists( 'Jetpack', 'get_active_modules' ) ) { - $active_modules = Jetpack::get_active_modules(); - - return in_array( 'markdown', $active_modules ); - } - - return false; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-post-metabox-formatter.php b/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-post-metabox-formatter.php deleted file mode 100644 index 697d09c4..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-post-metabox-formatter.php +++ /dev/null @@ -1,181 +0,0 @@ -post = $post; - $this->options = $options; - $this->permalink = $structure; - } - - /** - * Returns the translated values. - * - * @return array - */ - public function get_values() { - $values = array( - 'search_url' => $this->search_url(), - 'post_edit_url' => $this->edit_url(), - 'base_url' => $this->base_url_for_js(), - 'metaDescriptionDate' => '', - ); - - if ( $this->post instanceof WP_Post ) { - $values_to_set = array( - 'keyword_usage' => $this->get_focus_keyword_usage(), - 'title_template' => $this->get_title_template(), - 'metadesc_template' => $this->get_metadesc_template(), - 'metaDescriptionDate' => $this->get_metadesc_date(), - ); - - $values = ( $values_to_set + $values ); - } - - return $values; - } - - /** - * Returns the url to search for keyword for the post - * - * @return string - */ - private function search_url() { - return admin_url( 'edit.php?seo_kw_filter={keyword}' ); - } - - /** - * Returns the url to edit the taxonomy - * - * @return string - */ - private function edit_url() { - return admin_url( 'post.php?post={id}&action=edit' ); - } - - /** - * Returns a base URL for use in the JS, takes permalink structure into account - * - * @return string - */ - private function base_url_for_js() { - global $pagenow; - - // The default base is the home_url. - $base_url = home_url( '/', null ); - - if ( 'post-new.php' === $pagenow ) { - return $base_url; - } - - // If %postname% is the last tag, just strip it and use that as a base. - if ( 1 === preg_match( '#%postname%/?$#', $this->permalink ) ) { - $base_url = preg_replace( '#%postname%/?$#', '', $this->permalink ); - } - - return $base_url; - } - - /** - * Counting the number of given keyword used for other posts than given post_id - * - * @return array - */ - private function get_focus_keyword_usage() { - $keyword = WPSEO_Meta::get_value( 'focuskw', $this->post->ID ); - - return array( - $keyword => WPSEO_Meta::keyword_usage( $keyword, $this->post->ID ), - ); - } - - /** - * Retrieves the title template. - * - * @return string - */ - private function get_title_template() { - return $this->get_template( 'title' ); - } - - /** - * Retrieves the metadesc template. - * - * @return string - */ - private function get_metadesc_template() { - return $this->get_template( 'metadesc' ); - } - - /** - * Retrieves a template. - * - * @param String $template_option_name The name of the option in which the template you want to get is saved. - * - * @return string - */ - private function get_template( $template_option_name ) { - $needed_option = $template_option_name . '-' . $this->post->post_type; - - if ( isset( $this->options[ $needed_option ] ) && $this->options[ $needed_option ] !== '' ) { - return $this->options[ $needed_option ]; - } - - return ''; - } - - /** - * Determines the date to be displayed in the snippet preview - * - * @return string - */ - private function get_metadesc_date() { - $date = ''; - - if ( $this->is_show_date_enabled() ) { - $date = date_i18n( 'M j, Y', mysql2date( 'U', $this->post->post_date ) ); - } - - return $date; - } - - /** - * Returns whether or not showing the date in the snippet preview is enabled. - * - * @return bool - */ - private function is_show_date_enabled() { - $post_type = $this->post->post_type; - $key = sprintf( 'showdate-%s', $post_type ); - - return isset( $this->options[ $key ] ) && true === $this->options[ $key ]; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-term-metabox-formatter.php b/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-term-metabox-formatter.php deleted file mode 100644 index a99839f6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/formatter/class-term-metabox-formatter.php +++ /dev/null @@ -1,143 +0,0 @@ -term = $term; - $this->taxonomy = $taxonomy; - $this->options = $options; - } - - /** - * Returns the translated values. - * - * @return array - */ - public function get_values() { - $values = array(); - - // Todo: a column needs to be added on the termpages to add a filter for the keyword, so this can be used in the focus kw doubles. - if ( is_object( $this->term ) && property_exists( $this->term, 'taxonomy' ) ) { - $values = array( - 'search_url' => $this->search_url(), - 'post_edit_url' => $this->edit_url(), - 'base_url' => $this->base_url_for_js(), - 'taxonomy' => $this->term->taxonomy, - 'keyword_usage' => $this->get_focus_keyword_usage(), - 'title_template' => $this->get_title_template(), - 'metadesc_template' => $this->get_metadesc_template(), - ); - } - - return $values; - } - - /** - * Returns the url to search for keyword for the taxonomy - * - * @return string - */ - private function search_url() { - return admin_url( 'edit-tags.php?taxonomy=' . $this->term->taxonomy . '&seo_kw_filter={keyword}' ); - } - - /** - * Returns the url to edit the taxonomy - * - * @return string - */ - private function edit_url() { - global $wp_version; - $script_filename = version_compare( $wp_version, '4.5', '<' ) ? 'edit-tags' : 'term'; - return admin_url( $script_filename . '.php?action=edit&taxonomy=' . $this->term->taxonomy . '&tag_ID={id}' ); - } - - /** - * Returns a base URL for use in the JS, takes permalink structure into account - * - * @return string - */ - private function base_url_for_js() { - - $base_url = home_url( '/', null ); - $options = WPSEO_Options::get_option( 'wpseo_permalinks' ); - if ( ! $options['stripcategorybase'] ) { - $base_url = trailingslashit( $base_url . $this->taxonomy->rewrite['slug'] ); - } - - return $base_url; - } - - /** - * Counting the number of given keyword used for other term than given term_id - * - * @return array - */ - private function get_focus_keyword_usage() { - $focuskw = WPSEO_Taxonomy_Meta::get_term_meta( $this->term, $this->term->taxonomy, 'focuskw' ); - - return WPSEO_Taxonomy_Meta::get_keyword_usage( $focuskw, $this->term->term_id, $this->term->taxonomy ); - } - - /** - * Retrieves the title template. - * - * @return string - */ - private function get_title_template() { - return $this->get_template( 'title' ); - } - - /** - * Retrieves the metadesc template. - * - * @return string - */ - private function get_metadesc_template() { - return $this->get_template( 'metadesc' ); - } - - /** - * Retrieves a template. - * - * @param String $template_option_name The name of the option in which the template you want to get is saved. - * - * @return string - */ - private function get_template( $template_option_name ) { - $needed_option = $template_option_name . '-tax-' . $this->term->taxonomy; - if ( isset( $this->options[ $needed_option ] ) && $this->options[ $needed_option ] !== '' ) { - return $this->options[ $needed_option ]; - } - - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/formatter/interface-metabox-formatter.php b/wp/wp-content/plugins/wordpress-seo/admin/formatter/interface-metabox-formatter.php deleted file mode 100644 index f3be1547..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/formatter/interface-metabox-formatter.php +++ /dev/null @@ -1,18 +0,0 @@ -valid_nonce() ) { - $marker = new WPSEO_GSC_Marker( filter_input( INPUT_POST, 'url' ) ); - - wp_die( $marker->get_response() ); - } - - wp_die( 'false' ); - } - - /** - * Handle the AJAX request and dismiss the GSC notice - */ - public function dismiss_notice() { - check_ajax_referer( 'dismiss-gsc-notice' ); - - update_user_meta( get_current_user_id(), 'wpseo_dismissed_gsc_notice', true ); - - wp_die( 'true' ); - } - - /** - * Saves the authorization code. - */ - public function save_auth_code() { - if ( ! $this->valid_nonce() ) { - wp_die( '0' ); - } - - // Validate the authorization. - $service = $this->get_service(); - $authorization_code = filter_input( INPUT_POST, 'authorization' ); - $is_authorization_valid = WPSEO_GSC_Settings::validate_authorization( $authorization_code, $service->get_client() ); - if ( ! $is_authorization_valid ) { - wp_die( '0' ); - } - - $this->get_profiles(); - } - - /** - * Clears all authorization data. - */ - public function clear_auth_code() { - if ( ! $this->valid_nonce() ) { - wp_die( '0' ); - } - - $service = $this->get_service(); - - WPSEO_GSC_Settings::clear_data( $service ); - - $this->get_profiles(); - } - - /** - * Check if posted nonce is valid and return true if it is - * - * @return mixed - */ - private function valid_nonce() { - return wp_verify_nonce( filter_input( INPUT_POST, 'ajax_nonce' ), 'wpseo-gsc-ajax-security' ); - } - - /** - * Returns an instance of the Google Search Console service. - * - * @return WPSEO_GSC_Service - */ - private function get_service() { - return new WPSEO_GSC_Service(); - } - - /** - * Prints a JSON encoded string with the current profile config. - */ - private function get_profiles() { - $component = new WPSEO_Config_Component_Connect_Google_Search_Console(); - - wp_die( wp_json_encode( $component->get_data() ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-bulk-action.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-bulk-action.php deleted file mode 100644 index 02a5c163..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-bulk-action.php +++ /dev/null @@ -1,92 +0,0 @@ -handle_bulk_action(); - } - } - - /** - * Handles the bulk action when there is an action posted - */ - private function handle_bulk_action() { - if ( $bulk_action = $this->determine_bulk_action() ) { - $this->run_bulk_action( $bulk_action, $this->posted_issues() ); - - wp_redirect( filter_input( INPUT_POST, '_wp_http_referer' ) ); - exit; - } - } - - /** - * Determine which bulk action is selected and return that value - * - * @return string|bool - */ - private function determine_bulk_action() { - // If posted action is the selected one above the table, return that value. - if ( ( $action = filter_input( INPUT_POST, 'action' ) ) && $action !== '-1' ) { - return $action; - } - - // If posted action is the selected one below the table, return that value. - if ( ( $action = filter_input( INPUT_POST, 'action2' ) ) && $action !== '-1' ) { - return $action; - } - - return false; - } - - /** - * Get the posted issues and return them - * - * @return array - */ - private function posted_issues() { - if ( $issues = filter_input( INPUT_POST, 'wpseo_crawl_issues', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY ) ) { - return $issues; - } - - // Fallback if issues are empty. - return array(); - } - - /** - * Runs the bulk action - * - * @param string $bulk_action Action type. - * @param array $issues Set of issues to apply to. - */ - private function run_bulk_action( $bulk_action, $issues ) { - switch ( $bulk_action ) { - case 'mark_as_fixed' : - array_map( array( $this, 'action_mark_as_fixed' ), $issues ); - - break; - } - } - - /** - * Marks the issue as fixed - * - * @param string $issue Issue URL. - * - * @return string - */ - private function action_mark_as_fixed( $issue ) { - new WPSEO_GSC_Marker( $issue ); - - return $issue; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-category-filters.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-category-filters.php deleted file mode 100644 index f172a818..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-category-filters.php +++ /dev/null @@ -1,192 +0,0 @@ -set_counts( $platform_counts ); - } - - // Setting the filter values. - $this->set_filter_values(); - - $this->category = $this->get_current_category(); - } - - /** - * Returns the value of the current category - * - * @return mixed|string - */ - public function get_category() { - return $this->category; - } - - /** - * Returns the current filters as an array - * - * Only return categories with more than 0 issues - * - * @return array - */ - public function as_array() { - $new_views = array(); - - foreach ( $this->category_counts as $category_name => $category ) { - $new_views[] = $this->create_view_link( $category_name, $category['count'] ); - } - - return $new_views; - } - - /** - * Getting the current view - */ - private function get_current_category() { - if ( $current_category = filter_input( INPUT_GET, 'category' ) ) { - return $current_category; - } - - // Just prevent redirect loops. - if ( ! empty( $this->category_counts ) ) { - $current_category = 'not_found'; - if ( empty( $this->category_counts[ $current_category ] ) ) { - $current_category = key( $this->category_counts ); - } - - // Just redirect to set the category. - wp_redirect( add_query_arg( 'category', $current_category ) ); - exit; - } - } - - /** - * Setting the view counts based on the saved data. The info will be used to display the category filters - * - * @param array $platform_counts Set of counts by platform. - */ - private function set_counts( array $platform_counts ) { - $this->category_counts = $this->parse_counts( $platform_counts ); - } - - /** - * Setting the values for the filter - */ - private function set_filter_values() { - $this->set_filter_value( 'access_denied', __( 'Access denied', 'wordpress-seo' ), __( 'Server requires authentication or is blocking Googlebot from accessing the site.', 'wordpress-seo' ), __( 'Show information about errors in category \'Access Denied\'', 'wordpress-seo' ) ); - $this->set_filter_value( 'faulty_redirects', __( 'Faulty redirects', 'wordpress-seo' ) ); - $this->set_filter_value( 'not_followed',__( 'Not followed', 'wordpress-seo' ) ); - $this->set_filter_value( 'not_found', __( 'Not found', 'wordpress-seo' ), __( 'URL points to a non-existent page.', 'wordpress-seo' ), __( 'Show information about errors in category \'Not Found\'', 'wordpress-seo' ) ); - $this->set_filter_value( 'other', __( 'Other', 'wordpress-seo' ), __( 'Google was unable to crawl this URL due to an undetermined issue.', 'wordpress-seo' ), __( 'Show information about errors in category \'Other\'', 'wordpress-seo' ) ); - /* Translators: %1$s: expands to 'robots.txt'. */ - $this->set_filter_value( 'roboted', __( 'Blocked', 'wordpress-seo' ), sprintf( __( 'Googlebot could access your site, but certain URLs are blocked for Googlebot in your %1$s file. This block could either be for all Googlebots or even specifically for Googlebot-mobile.', 'wordpress-seo' ), 'robots.txt' ), __( 'Show information about errors in category \'Blocked\'', 'wordpress-seo' ) ); - $this->set_filter_value( 'server_error', __( 'Server Error', 'wordpress-seo' ), __( 'Request timed out or site is blocking Google.', 'wordpress-seo' ), __( 'Show information about errors in category \'Server\'', 'wordpress-seo' ) ); - $this->set_filter_value( 'soft_404', __( 'Soft 404', 'wordpress-seo' ), __( "The target URL doesn't exist, but your server is not returning a 404 (file not found) error.", 'wordpress-seo' ), __( 'Show information about errors in category \'Soft 404\'', 'wordpress-seo' ) ); - } - - /** - * Add new filter value to the filter_values - * - * @param string $key Filter key. - * @param string $value Filter value. - * @param string $description Optional description string. - * @param string $help_button_text Optional help button text. - */ - private function set_filter_value( $key, $value, $description = '', $help_button_text = '' ) { - $this->filter_values[ $key ] = array( - 'value' => $value, - 'description' => $description, - 'help-button' => $help_button_text, - ); - } - - /** - * Creates a filter link - * - * @param string $category Issue type. - * @param integer $count Count for the type. - * - * @return string - */ - private function create_view_link( $category, $count ) { - $href = add_query_arg( array( 'category' => $category, 'paged' => 1 ) ); - - $class = 'gsc_category'; - - if ( $this->category === $category ) { - $class .= ' current'; - } - - $help_button = $help_panel = ''; - if ( $this->filter_values[ $category ]['description'] !== '' ) { - $help = new WPSEO_Admin_Help_Panel( $category, $this->filter_values[ $category ]['help-button'], $this->filter_values[ $category ]['description'], 'has-wrapper' ); - $help_button = $help->get_button_html(); - $help_panel = $help->get_panel_html(); - } - - return sprintf( - '%3$s (%5$s) %6$s %7$s', - esc_attr( $href ), - $class, - $this->filter_values[ $category ]['value'], - $category, - $count, - $help_button, - $help_panel - ); - } - - /** - * Parsing the category counts. When there are 0 issues for a specific category, just remove that one from the array - * - * @param array $category_counts Set of counts for categories. - * - * @return mixed - */ - private function parse_counts( $category_counts ) { - foreach ( $category_counts as $category_name => $category ) { - if ( $category['count'] === '0' ) { - unset( $category_counts[ $category_name ] ); - } - } - - return $category_counts; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-config.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-config.php deleted file mode 100644 index 9b39644a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-config.php +++ /dev/null @@ -1,22 +0,0 @@ - 'Yoast SEO', - 'client_id' => '395430892738-ushj8aced0cji2j4bkq6bda6felaigb9.apps.googleusercontent.com', - 'client_secret' => 'c2kYgOwMhk1emWxQ3NaA8wOi', - 'redirect_uri' => 'urn:ietf:wg:oauth:2.0:oob', - 'scopes' => array( 'https://www.googleapis.com/auth/webmasters' ), - ); - -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-count.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-count.php deleted file mode 100644 index 653433d6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-count.php +++ /dev/null @@ -1,221 +0,0 @@ -service = $service; - } - - /** - * Getting the counts for given platform and return them as an array - * - * @param string $platform Platform (desktop, mobile, feature phone). - * - * @return array - */ - public function get_platform_counts( $platform ) { - $counts = $this->get_counts(); - if ( array_key_exists( $platform, $counts ) ) { - return $counts[ $platform ]; - } - - return array(); - } - - /** - * Return the fetched issues - * - * @return array - */ - public function get_issues() { - return $this->issues; - } - - /** - * Listing the issues an gives them back as fetched issues - * - * @param string $platform Platform (desktop, mobile, feature phone). - * @param string $category Issue category. - */ - public function list_issues( $platform, $category ) { - $counts = $this->get_counts(); - - if ( array_key_exists( $platform, $counts ) ) { - $counts[ $platform ] = $this->list_category_issues( $counts[ $platform ], $platform, $category ); - - // Write the new counts value. - $this->set_counts( $counts ); - } - } - - /** - * Getting the counts for given platform and category. - * - * @param string $platform Platform (desktop, mobile, feature phone). - * @param string $category Issue type. - * - * @return integer - */ - public function get_issue_count( $platform, $category ) { - $counts = $this->get_counts(); - - if ( ! empty( $counts[ $platform ][ $category ]['count'] ) ) { - return $counts[ $platform ][ $category ]['count']; - } - - return 0; - } - - /** - * Update the count of the issues - * - * @param string $platform Platform (desktop, mobile, feature phone). - * @param string $category Issue type. - * @param integer $new_count Updated count. - */ - public function update_issue_count( $platform, $category, $new_count ) { - $counts = $this->get_counts(); - - if ( ! empty( $counts[ $platform ][ $category ] ) && is_array( $counts[ $platform ][ $category ] ) ) { - $counts[ $platform ][ $category ]['count'] = $new_count; - } - - $this->set_counts( $counts ); - } - - /** - * Fetching the counts from the GSC API - */ - public function fetch_counts() { - if ( WPSEO_GSC_Settings::get_profile() && $this->get_last_fetch() <= strtotime( '-12 hours' ) ) { - // Remove the timestamp. - $this->remove_last_fetch(); - - // Getting the counts and parse them. - $counts = $this->parse_counts( $this->service->get_crawl_issue_counts() ); - - // Fetching the counts by setting an option. - $this->set_counts( $counts ); - - // Saving the current timestamp. - $this->save_last_fetch(); - } - } - - /** - * Parsing the received counts from the API and map the keys to plugin friendly values - * - * @param array $fetched_counts Set of retrieved counts. - * - * @return array - */ - private function parse_counts( array $fetched_counts ) { - $counts = array(); - foreach ( $fetched_counts as $platform_name => $categories ) { - $new_platform = WPSEO_GSC_Mapper::platform_from_api( $platform_name ); - - foreach ( $categories as $category_name => $category ) { - $new_category = WPSEO_GSC_Mapper::category_from_api( $category_name ); - $counts[ $new_platform ][ $new_category ] = $category; - } - } - - return $counts; - } - - /** - * Listing the issues for current category. - * - * @param array $counts Set of counts. - * @param string $platform Platform (desktop, mobile, feature phone). - * @param string $category Issue type. - * - * @return array - */ - private function list_category_issues( array $counts, $platform, $category ) { - // When the issues have to be fetched. - if ( array_key_exists( $category, $counts ) && $counts[ $category ]['count'] > 0 && $counts[ $category ]['last_fetch'] <= strtotime( '-12 hours' ) ) { - if ( $issues = $this->service->fetch_category_issues( WPSEO_GSC_Mapper::platform_to_api( $platform ), WPSEO_GSC_Mapper::category_to_api( $category ) ) ) { - $this->issues = $issues; - } - - // Be sure the total count is correct. - $counts[ $category ]['count'] = count( $this->issues ); - - // Set last fetch. - $counts[ $category ]['last_fetch'] = time(); - } - - return $counts; - } - - /** - * Getting the counts from the options - * - * @return array - */ - private function get_counts() { - return get_option( self::OPTION_CI_COUNTS, array() ); - } - - /** - * Fetching the counts from the service and store them in an option - * - * @param array $counts Set of counts. - */ - private function set_counts( array $counts ) { - update_option( self::OPTION_CI_COUNTS, $counts ); - } - - /** - * Store the timestamp of when crawl errors were saved the last time. - */ - private function save_last_fetch() { - add_option( self::OPTION_CI_LAST_FETCH, time(), '', 'no' ); - } - - /** - * Remove the last checked option - */ - private function remove_last_fetch() { - delete_option( self::OPTION_CI_LAST_FETCH ); - } - - /** - * Get the timestamp of when the crawl errors were last saved - * - * @return int - */ - private function get_last_fetch() { - return get_option( self::OPTION_CI_LAST_FETCH, 0 ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-issue.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-issue.php deleted file mode 100644 index b6ea06d4..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-issue.php +++ /dev/null @@ -1,89 +0,0 @@ -url = $url; - $this->first_detected = $first_detected; - $this->last_crawled = $last_crawled; - $this->response_code = $response_code; - } - - /** - * Put the class properties in array - * - * @return array - */ - public function to_array() { - return array( - 'url' => $this->url, - 'first_detected' => $this->to_date_format( $this->first_detected ), - 'first_detected_raw' => $this->to_timestamp( $this->first_detected ), - 'last_crawled' => $this->to_date_format( $this->last_crawled ), - 'last_crawled_raw' => $this->to_timestamp( $this->last_crawled ), - 'response_code' => $this->response_code, - ); - } - - /** - * Converting the date to a date format - * - * @param DateTime $date_to_convert Date instance. - * @param string $format Format string. - * - * @return string - */ - private function to_date_format( DateTime $date_to_convert, $format = '' ) { - - if ( empty( $format ) ) { - $format = get_option( 'date_format' ); - } - - return date_i18n( $format, $date_to_convert->format( 'U' ) ); - } - - /** - * Converting the date to a timestamp - * - * @param DateTime $date_to_convert Date object instance. - * - * @return string - */ - private function to_timestamp( DateTime $date_to_convert ) { - return $date_to_convert->format( 'U' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-issues.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-issues.php deleted file mode 100644 index 40a3d4e8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-issues.php +++ /dev/null @@ -1,175 +0,0 @@ -option_name = strtolower( 'wpseo-gsc-issues-' . $platform . '-' . $category ); - $this->issues = $this->get_issues(); - - if ( ! empty( $fetched_issues ) && is_array( $fetched_issues ) ) { - $this->save_fetched_issues( $fetched_issues ); - } - } - /** - * Getting the issues from the options. - * - * @return array - */ - public function get_issues() { - return get_option( $this->option_name, array() ); - } - - /** - * Deleting the issue from the issues - * - * @param string $url URL to delete issues for. - * - * @return bool - */ - public function delete_issue( $url ) { - $target_issue = $this->get_issue_by_url( $url ); - if ( $target_issue !== false ) { - unset( $this->issues[ $target_issue ] ); - - $this->save_issues( $this->issues ); - - return true; - } - - return false; - } - - /** - * Fetching the issues for current category and compare them with the already existing issues. - * - * @param array $fetched_issues Set of retrieved issues. - */ - private function save_fetched_issues( array $fetched_issues ) { - $this->set_current_issues(); - - $crawl_issues = $this->get_issues(); - - // Walk through the issues to do the comparison. - foreach ( $fetched_issues as $issue ) { - $this->issue_compare( $crawl_issues, $issue ); - } - - $this->save_issues( $crawl_issues ); - - // Refresh the value of $this->issues. - $this->issues = $this->get_issues(); - } - - /** - * Comparing the issue with the list of current existing issues - * - * @param array $crawl_issues Set of issues by reference. - * @param stdClass $issue Issue object to check against the list. - */ - private function issue_compare( &$crawl_issues, $issue ) { - $issue->pageUrl = WPSEO_Utils::format_url( (string) $issue->pageUrl ); - - if ( ! in_array( $issue->pageUrl, $this->current_issues ) ) { - array_push( - $crawl_issues, - $this->get_issue( $this->create_issue( $issue ) ) - ); - } - } - - /** - * The fetched issue from the API will be parsed as an WPSEO_Crawl_Issue object. After initializing the issue as an - * object, the object will be returned - * - * @param stdClass $issue Issue data object. - * - * @return WPSEO_GSC_Issue - */ - private function create_issue( $issue ) { - return new WPSEO_GSC_Issue( - $issue->pageUrl, - new DateTime( (string) $issue->first_detected ), - new DateTime( (string) $issue->last_crawled ), - (string) ( ! empty( $issue->responseCode ) ) ? $issue->responseCode : null - ); - } - - /** - * Returns the crawl issue as an array. - * - * @param WPSEO_GSC_Issue $crawl_issue Issue object instance. - * - * @return array() - */ - private function get_issue( WPSEO_GSC_Issue $crawl_issue ) { - return $crawl_issue->to_array(); - } - - /** - * Saving the issues to the options. The target option is base on current platform and category. - * - * @param array $issues Set of issues. - */ - private function save_issues( array $issues ) { - update_option( $this->option_name, $issues, false ); - } - - /** - * Getting the issues from the options and get only the URL out of it. This is because there will be a comparison - * with the issues from the API. - */ - private function set_current_issues() { - if ( ! empty( $this->issues ) ) { - $this->current_issues = wp_list_pluck( $this->issues, 'url' ); - } - } - - /** - * Search in the issues for the given $url - * - * @param string $url Issue URL to search for. - * - * @return int|string - */ - private function get_issue_by_url( $url ) { - foreach ( $this->issues as $key => $issue ) { - if ( $url === $issue['url'] ) { - return $key; - } - } - - return false; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-mapper.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-mapper.php deleted file mode 100644 index afaa1045..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-mapper.php +++ /dev/null @@ -1,112 +0,0 @@ - 'web', - 'mobile' => 'mobile', - 'smartphone_only' => 'smartphoneOnly', - 'settings' => 'settings', // This one is basicly not a platform, but a tab. - ); - - /** - * The categories which can be mapped - * - * @var array - */ - private static $categories = array( - 'access_denied' => 'authPermissions', - 'faulty_redirects' => 'manyToOneRedirect', - 'not_followed' => 'notFollowed', - 'not_found' => 'notFound', - 'other' => 'other', - 'roboted' => 'roboted', - 'server_error' => 'serverError', - 'soft_404' => 'soft404', - ); - - /** - * If there is no platform, just get the first key out of the array and redirect to it. - * - * @param string $platform Platform (desktop, mobile, feature phone). - * - * @return mixed - */ - public static function get_current_platform( $platform ) { - if ( $current_platform = filter_input( INPUT_GET, $platform ) ) { - return $current_platform; - } - - wp_redirect( add_query_arg( $platform, key( self::$platforms ) ) ); - exit; - } - - /** - * Mapping the platform - * - * @param string $platform Platform (desktop, mobile, feature phone). - * - * @return mixed - */ - public static function platform_to_api( $platform ) { - if ( ! empty( $platform ) && array_key_exists( $platform, self::$platforms ) ) { - return self::$platforms[ $platform ]; - } - } - - /** - * Mapping the given platform by value and return its key - * - * @param string $platform Platform (desktop, mobile, feature phone). - * - * @return string - */ - public static function platform_from_api( $platform ) { - if ( ! empty( $platform ) && $platform = array_search( $platform, self::$platforms ) ) { - return $platform; - } - - return $platform; - } - - /** - * Mapping the given category by searching for its key. - * - * @param string $category Issue type. - * - * @return mixed - */ - public static function category_to_api( $category ) { - if ( ! empty( $category ) && array_key_exists( $category, self::$categories ) ) { - return self::$categories[ $category ]; - } - - return $category; - } - - /** - * Mapping the given category by value and return its key - * - * @param string $category Issue type. - * - * @return string - */ - public static function category_from_api( $category ) { - if ( ! empty( $category ) && $category = array_search( $category, self::$categories ) ) { - return $category; - } - - return $category; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-marker.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-marker.php deleted file mode 100644 index f8ae147c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-marker.php +++ /dev/null @@ -1,143 +0,0 @@ -url = $url; - $this->result = $this->get_result(); - } - - /** - * Getting the response for the AJAX request - * - * @return string - */ - public function get_response() { - return $this->result; - } - - /** - * Setting the result, this method will check if current - * - * @return string - */ - private function get_result() { - if ( $this->can_be_marked_as_fixed() ) { - $service = new WPSEO_GSC_Service( WPSEO_GSC_Settings::get_profile() ); - - if ( $this->set_crawl_issues() && $this->send_mark_as_fixed( $service ) && $this->delete_crawl_issue() ) { - $this->update_issue_count( $service ); - - return 'true'; - } - } - - return 'false'; - } - - /** - * Check if request is valid by verifying the posted nonce and return the URL if this one is set - * - * @return bool|string - */ - private function can_be_marked_as_fixed() { - if ( $this->url !== '' ) { - return $this->url; - } - - return false; - } - - /** - * Storing the data belonging to the current issue, this data is needed in the 'mark as fixed' flow - * - * @return bool - */ - private function set_crawl_issues() { - $this->platform = filter_input( INPUT_POST, 'platform' ); - $this->category = filter_input( INPUT_POST, 'category' ); - if ( $this->platform && $this->category ) { - $this->crawl_issues = new WPSEO_GSC_Issues( $this->platform, $this->category ); - - return true; - } - - return false; - } - - /** - * Sending a request to the Google Search Console API to let them know we marked an issue as fixed. - * - * @param WPSEO_GSC_Service $service Service object instance. - * - * @return bool - */ - private function send_mark_as_fixed( WPSEO_GSC_Service $service ) { - return $service->mark_as_fixed( $this->url, $this->platform, $this->category ); - } - - /** - * Delete the crawl issue from the database - * - * @return bool - */ - private function delete_crawl_issue() { - return $this->crawl_issues->delete_issue( $this->url ); - } - - /** - * Getting the counts for current platform - category combination and update the score of it. - * - * @param WPSEO_GSC_Service $service Service object instance. - */ - private function update_issue_count( WPSEO_GSC_Service $service ) { - $counts = new WPSEO_GSC_Count( $service ); - - // Get the issues. - $total_issues = $counts->get_issue_count( $this->platform, $this->category ); - - // Lower the current count with 1. - $total_issues = ( $total_issues - 1 ); - - // And update the count. - $counts->update_issue_count( $this->platform, $this->category, $total_issues ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-modal.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-modal.php deleted file mode 100644 index 1705fdaf..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-modal.php +++ /dev/null @@ -1,56 +0,0 @@ -view = $view; - $this->height = $height; - $this->view_vars = $view_vars; - } - - /** - * Returns the height of the modal. - * - * @return int The set height. - */ - public function get_height() { - return $this->height; - } - - /** - * Loads the view of the modal. - * - * @param string $unique_id An unique identifier for the modal. - */ - public function load_view( $unique_id ) { - extract( $this->view_vars ); - - echo ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-platform-tabs.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-platform-tabs.php deleted file mode 100644 index 30a988e8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-platform-tabs.php +++ /dev/null @@ -1,94 +0,0 @@ -platform_tabs(); - } - - /** - * Getting the current_tab - * - * @return string - */ - public function current_tab() { - return $this->current_tab; - } - - /** - * Loops through the array with all the platforms and convert it into an array - * - * @return string - */ - private function platform_tabs() { - $tabs = array( 'settings' => __( 'Settings', 'wordpress-seo' ) ); - - $platforms = array( - 'web' => __( 'Desktop', 'wordpress-seo' ), - 'smartphone_only' => __( 'Smartphone', 'wordpress-seo' ), - 'mobile' => __( 'Feature phone', 'wordpress-seo' ), - ); - - if ( WPSEO_GSC_Settings::get_profile() !== '' ) { - $tabs = array_merge( $platforms, $tabs ); - } - - $admin_link = admin_url( 'admin.php?page=wpseo_search_console&tab=' ); - - $this->set_current_tab( $tabs ); - - $return = ''; - - foreach ( $tabs as $platform_target => $platform_value ) { - $return .= $this->platform_tab( $platform_target, $platform_value, $admin_link ); - } - - return $return; - } - - /** - * Setting the current tab - * - * @param array $platforms Set of platforms (desktop, mobile, feature phone). - */ - private function set_current_tab( array $platforms ) { - $this->current_tab = key( $platforms ); - if ( $current_platform = filter_input( INPUT_GET, 'tab' ) ) { - $this->current_tab = $current_platform; - } - } - - /** - * Parses the tab - * - * @param string $platform_target Platform (desktop, mobile, feature phone). - * @param string $platform_value Link anchor. - * @param string $admin_link Link URL admin base. - * - * @return string - */ - private function platform_tab( $platform_target, $platform_value, $admin_link ) { - $active = ''; - if ( $this->current_tab === $platform_target ) { - $active = ' nav-tab-active'; - } - - return '' . $platform_value . ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-service.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-service.php deleted file mode 100644 index 32adf14a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-service.php +++ /dev/null @@ -1,192 +0,0 @@ -profile = $profile; - - $this->set_client(); - } - - /** - * Returns the client - * - * @return Yoast_Api_Google_Client - */ - public function get_client() { - return $this->client; - } - - /** - * Removes the option and calls the clients clear_data method to clear that one as well - */ - public function clear_data() { - // Clear client data. - $this->client->clear_data(); - } - - /** - * Get all sites that are registered in the GSC panel - * - * @return array - */ - public function get_sites() { - $sites = array(); - - $response_json = $this->client->do_request( 'sites', true ); - - // Do list sites request. - if ( ! empty( $response_json->siteEntry ) ) { - foreach ( $response_json->siteEntry as $entry ) { - $sites[ str_ireplace( 'sites/', '', (string) $entry->siteUrl ) ] = (string) $entry->siteUrl; - } - - // Sorting the retrieved sites. - asort( $sites ); - } - - return $sites; - } - - /** - * Get crawl issues - * - * @return array - */ - public function get_crawl_issue_counts() { - // Setup crawl error list. - $crawl_error_counts = $this->get_crawl_error_counts( $this->profile ); - - $return = array(); - if ( ! empty( $crawl_error_counts->countPerTypes ) ) { - foreach ( $crawl_error_counts->countPerTypes as $category ) { - $return[ $category->platform ][ $category->category ] = array( - 'count' => $category->entries[0]->count, - 'last_fetch' => null, - ); - } - } - - return $return; - } - - /** - * Sending request to mark issue as fixed - * - * @param string $url Issue URL. - * @param string $platform Platform (desktop, mobile, feature phone). - * @param string $category Issue type. - * - * @return bool - */ - public function mark_as_fixed( $url, $platform, $category ) { - $response = $this->client->do_request( 'sites/' . urlencode( $this->profile ) . '/urlCrawlErrorsSamples/' . urlencode( ltrim( $url, '/' ) ) . '?category=' . WPSEO_GSC_Mapper::category_to_api( $category ) . '&platform=' . WPSEO_GSC_Mapper::platform_to_api( $platform ) . '', false, 'DELETE' ); - return ( $response->getResponseHttpCode() === 204 ); - } - - /** - * Fetching the issues from the GSC API - * - * @param string $platform Platform (desktop, mobile, feature phone). - * @param string $category Issue type. - * - * @return mixed - */ - public function fetch_category_issues( $platform, $category ) { - $issues = $this->client->do_request( - 'sites/' . urlencode( $this->profile ) . '/urlCrawlErrorsSamples?category=' . $category . '&platform=' . $platform, - true - ); - - if ( ! empty( $issues->urlCrawlErrorSample ) ) { - return $issues->urlCrawlErrorSample; - } - } - - /** - * Setting the GSC client - */ - private function set_client() { - try { - new Yoast_Api_Libs( '2.0' ); - } - catch ( Exception $exception ) { - if ( $exception->getMessage() === 'required_version' ) { - $this->incompatible_api_libs( - __( 'Yoast plugins share some code between them to make your site faster. As a result of that, we need all Yoast plugins to be up to date. We\'ve detected this isn\'t the case, so please update the Yoast plugins that aren\'t up to date yet.', 'wordpress-seo' ) - ); - } - } - - if ( class_exists( 'Yoast_Api_Google_Client' ) === false ) { - $this->incompatible_api_libs( - sprintf( - /* translators: %1$s expands to Yoast SEO, %2$s expands to Google Analytics by Yoast */ - __( - '%1$s detected you’re using a version of %2$s which is not compatible with %1$s. Please update %2$s to the latest version to use this feature.', - 'wordpress-seo' - ), - 'Yoast SEO', - 'Google Analytics by Yoast' - ) - ); - - wp_redirect( admin_url( 'admin.php?page=' . WPSEO_Admin::PAGE_IDENTIFIER ) ); - exit; - } - - $this->client = new Yoast_Api_Google_Client( WPSEO_GSC_Config::$gsc, 'wpseo-gsc', 'https://www.googleapis.com/webmasters/v3/' ); - } - - /** - * Adding notice that the api libs has the wrong version - * - * @param string $notice Message string. - */ - private function incompatible_api_libs( $notice ) { - Yoast_Notification_Center::get()->add_notification( - new Yoast_Notification( $notice, array( 'type' => Yoast_Notification::ERROR ) ) - ); - } - - /** - * Getting the crawl error counts - * - * @param string $profile Profile name string. - * - * @return object|bool - */ - private function get_crawl_error_counts( $profile ) { - $crawl_error_counts = $this->client->do_request( - 'sites/' . urlencode( $profile ) . '/urlCrawlErrorsCounts/query', - true - ); - - if ( ! empty( $crawl_error_counts ) ) { - return $crawl_error_counts; - } - - return false; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-settings.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-settings.php deleted file mode 100644 index 1a3f343a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-settings.php +++ /dev/null @@ -1,102 +0,0 @@ -clear_data(); - } - - /** - * Reloading all the issues - */ - public static function reload_issues() { - // Remove issue and issue counts. - self::remove(); - } - - /** - * When authorization is successful return true, otherwise false - * - * @param string $authorization_code Code to validate. - * @param Yoast_Api_Google_Client $client Client object instance. - * - * @return bool - */ - public static function validate_authorization( $authorization_code, Yoast_Api_Google_Client $client ) { - return ( $authorization_code !== '' && $client->authenticate_client( $authorization_code ) ); - } - - /** - * Get the GSC profile - * - * @return string - */ - public static function get_profile() { - // Get option. - $option = get_option( WPSEO_GSC::OPTION_WPSEO_GSC, array( 'profile' => '' ) ); - - // Set the profile. - $profile = ''; - if ( ! empty( $option['profile'] ) ) { - $profile = $option['profile']; - } - - // Return the profile. - return trim( $profile, '/' ); - } - - /** - * Removes the issue counts and all the issues from the options - */ - private static function remove() { - // Remove the issue counts from the options. - self::remove_issue_counts(); - - // Removing all issues from the database. - self::remove_issues(); - } - - /** - * Remove the issue counts - */ - private static function remove_issue_counts() { - // Remove the options which are holding the counts. - delete_option( WPSEO_GSC_Count::OPTION_CI_COUNTS ); - delete_option( WPSEO_GSC_Count::OPTION_CI_LAST_FETCH ); - } - - /** - * Delete the issues and their meta data from the database - */ - private static function remove_issues() { - global $wpdb; - - // Remove local crawl issues by running a delete query. - $wpdb->query( "DELETE FROM {$wpdb->options} WHERE option_name LIKE 'wpseo-gsc-issues-%'" ); - } - - /** - * Removes the options for GSC - */ - private static function remove_gsc_option() { - delete_option( WPSEO_GSC::OPTION_WPSEO_GSC ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-table.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-table.php deleted file mode 100644 index ace178d7..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc-table.php +++ /dev/null @@ -1,364 +0,0 @@ -search_string = $search_string; - } - - $this->current_view = $category; - - // Set the crawl issue source. - $this->show_fields( $platform ); - - $this->items = $items; - } - - /** - * Getting the screen id from this table - * - * @return string - */ - public function get_screen_id() { - return $this->screen->id; - } - - /** - * Setup the table variables, fetch the items from the database, search, sort and format the items. - */ - public function prepare_items() { - // Get variables needed for pagination. - $this->per_page = $this->get_items_per_page( 'errors_per_page', $this->per_page ); - $this->current_page = intval( ( $paged = filter_input( INPUT_GET, 'paged' ) ) ? $paged : 1 ); - - $this->setup_columns(); - $this->views(); - $this->parse_items(); - } - - /** - * Set the table columns - * - * @return array - */ - public function get_columns() { - $columns = array( - 'cb' => '', - 'url' => __( 'URL', 'wordpress-seo' ), - 'last_crawled' => __( 'Last crawled', 'wordpress-seo' ), - 'first_detected' => __( 'First detected', 'wordpress-seo' ), - 'response_code' => __( 'Response code', 'wordpress-seo' ), - ); - - return $columns; - } - - /** - * Return the columns that are sortable - * - * @return array - */ - protected function get_sortable_columns() { - $sortable_columns = array( - 'url' => array( 'url', false ), - 'last_crawled' => array( 'last_crawled', false ), - 'first_detected' => array( 'first_detected', false ), - 'response_code' => array( 'response_code', false ), - ); - - return $sortable_columns; - } - - /** - * Return available bulk actions - * - * @return array - */ - protected function get_bulk_actions() { - return array( - 'mark_as_fixed' => __( 'Mark as fixed', 'wordpress-seo' ), - ); - } - - /** - * Default method to display a column - * - * @param array $item Data array. - * @param string $column_name Column name key. - * - * @return mixed - */ - protected function column_default( $item, $column_name ) { - return $item[ $column_name ]; - } - - /** - * Checkbox column - * - * @param array $item Item data array. - * - * @return string - */ - protected function column_cb( $item ) { - return sprintf( - '', - md5( $item['url'] ), - $item['url'], - __( 'Select redirect', 'wordpress-seo' ) - ); - } - - /** - * Formatting the output of the column last crawled into a dateformat - * - * @param array $item Item data array. - * - * @return string - */ - protected function column_last_crawled( $item ) { - return date_i18n( get_option( 'date_format' ), strtotime( $item['last_crawled'] ) ); - } - - /** - * Formatting the output of the column first detected into a dateformat - * - * @param array $item Item data array. - * - * @return string - */ - protected function column_first_detected( $item ) { - return date_i18n( get_option( 'date_format' ), strtotime( $item['first_detected'] ) ); - } - - /** - * URL column - * - * @param array $item Item data array. - * - * @return string - */ - protected function column_url( $item ) { - $actions = array(); - - if ( $this->can_create_redirect() ) { - /** Gets the modal box */ - $modal = $this->get_modal_box( $item['url'] ); - $modal->load_view( md5( $item['url'] ) ); - - $actions['create_redirect'] = '' . __( 'Create redirect', 'wordpress-seo' ) . ''; - } - - $actions['view'] = '' . __( 'View', 'wordpress-seo' ) . ''; - $actions['markasfixed'] = '' . __( 'Mark as fixed', 'wordpress-seo' ) . ''; - - return sprintf( - '%1$s %2$s', - $item['url'], - $this->row_actions( $actions ) - ); - } - - /** - * Running the setup of the columns - */ - private function setup_columns() { - $this->_column_headers = array( $this->get_columns(), array(), $this->get_sortable_columns() ); - } - - /** - * Check if the current category allow creating redirects - * - * @return bool - */ - private function can_create_redirect() { - return in_array( $this->current_view, array( 'soft_404', 'not_found', 'access_denied' ) ); - } - - /** - * Setting the table navigation - * - * @param int $total_items Total number of items. - * @param int $posts_per_page Number of items per page. - */ - private function set_pagination( $total_items, $posts_per_page ) { - $this->set_pagination_args( array( - 'total_items' => $total_items, - 'total_pages' => ceil( ( $total_items / $posts_per_page ) ), - 'per_page' => $posts_per_page, - ) ); - } - - /** - * Setting the items - */ - private function parse_items() { - if ( is_array( $this->items ) && count( $this->items ) > 0 ) { - if ( ! empty( $this->search_string ) ) { - $this->do_search(); - } - - $this->set_pagination( count( $this->items ), $this->per_page ); - - $this->sort_items(); - $this->paginate_items(); - } - } - - /** - * Search through the items - */ - private function do_search() { - $results = array(); - - foreach ( $this->items as $item ) { - foreach ( $item as $value ) { - if ( stristr( $value, $this->search_string ) !== false ) { - $results[] = $item; - continue; - } - } - } - - $this->items = $results; - } - - /** - * Running the pagination - */ - private function paginate_items() { - // Setting the starting point. If starting point is below 1, overwrite it with value 0, otherwise it will be sliced of at the back. - $slice_start = ( $this->current_page - 1 ); - if ( $slice_start < 0 ) { - $slice_start = 0; - } - - // Apply 'pagination'. - $this->items = array_slice( $this->items, ( $slice_start * $this->per_page ), $this->per_page ); - } - - /** - * Sort the items by callback - */ - private function sort_items() { - // Sort the results. - usort( $this->items, array( $this, 'do_reorder' ) ); - } - - /** - * Doing the sorting of the issues - * - * @param array $a First data set for comparison. - * @param array $b Second data set for comparison. - * - * @return int - */ - private function do_reorder( $a, $b ) { - // If no sort, default to title. - $orderby = ( $orderby = filter_input( INPUT_GET, 'orderby' ) ) ? $orderby : 'url'; - - // If no order, default to asc. - $order = ( $order = filter_input( INPUT_GET, 'order' ) ) ? $order : 'asc'; - - // When there is a raw field of it, sort by this field. - if ( array_key_exists( $orderby . '_raw', $a ) && array_key_exists( $orderby . '_raw', $b ) ) { - $orderby = $orderby . '_raw'; - } - - // Determine sort order. - $result = strcmp( $a[ $orderby ], $b[ $orderby ] ); - - // Send final sort direction to usort. - return ( $order === 'asc' ) ? $result : ( - $result ); - } - - /** - * Checks if premium is loaded, if not the nopremium modal will be shown. Otherwise it will load the premium one. - * - * @param string $url URL string. - * - * @return WPSEO_GSC_Modal Instance of the GSC modal. - */ - private function get_modal_box( $url ) { - if ( defined( 'WPSEO_PREMIUM_FILE' ) && class_exists( 'WPSEO_Premium_GSC_Modal' ) ) { - static $premium_modal; - - if ( ! $premium_modal ) { - $premium_modal = new WPSEO_Premium_GSC_Modal(); - } - - return $premium_modal->show( $url ); - } - - return new WPSEO_GSC_Modal( - dirname( __FILE__ ) . '/views/gsc-redirect-nopremium.php', - self::FREE_MODAL_HEIGHT, - array( 'url' => $url ) - ); - } - - /** - * Showing the hidden fields used by the AJAX requests - * - * @param string $platform Platform (desktop, mobile, feature phone). - */ - private function show_fields( $platform ) { - echo ""; - echo ""; - echo ""; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc.php deleted file mode 100644 index 298102e9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/class-gsc.php +++ /dev/null @@ -1,311 +0,0 @@ -set_hooks(); - $this->set_dependencies(); - $this->request_handler(); - } - - add_action( 'admin_init', array( $this, 'register_gsc_notification' ) ); - add_action( 'admin_init', array( $this, 'register_settings' ) ); - } - - /** - * If the Google Search Console has no credentials, add a notification for the user to give him a heads up. This message is dismissable. - */ - public function register_gsc_notification() { - - $notification = $this->get_profile_notification(); - $notification_center = Yoast_Notification_Center::get(); - - if ( WPSEO_GSC_Settings::get_profile() === '' ) { - $notification_center->add_notification( $notification ); - } - else { - $notification_center->remove_notification( $notification ); - } - } - - /** - * Builds the notification used when GSC is not connected to a profile - * - * @return Yoast_Notification - */ - private function get_profile_notification() { - return new Yoast_Notification( - sprintf( - /* translators: 1: link open tag; 2: link close tag. */ - __( 'Don\'t miss your crawl errors: %1$sconnect with Google Search Console here%2$s.', 'wordpress-seo' ), - '', - '' - ), - array( - 'type' => Yoast_Notification::WARNING, - 'id' => 'wpseo-dismiss-gsc', - 'capabilities' => 'manage_options', - ) - ); - } - - /** - * Be sure the settings will be registered, so data can be stored - */ - public function register_settings() { - register_setting( 'yoast_wpseo_gsc_options', self::OPTION_WPSEO_GSC ); - } - - /** - * Function that outputs the redirect page - */ - public function display() { - require_once WPSEO_PATH . '/admin/google_search_console/views/gsc-display.php'; - } - - /** - * Display the table - */ - public function display_table() { - // The list table. - $list_table = new WPSEO_GSC_Table( $this->platform, $this->category, $this->issue_fetch->get_issues() ); - - // Adding filter to display the category filters. - add_filter( 'views_' . $list_table->get_screen_id(), array( $this->category_filter, 'as_array' ) ); - - // Preparing and displaying the table. - $list_table->prepare_items(); - $list_table->search_box( __( 'Search', 'wordpress-seo' ), 'wpseo-crawl-issues-search' ); - $list_table->display(); - } - - /** - * Load the admin redirects scripts - */ - public function page_scripts() { - - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_script( 'admin-gsc' ); - $asset_manager->enqueue_style( 'metabox-css' ); - add_screen_option( 'per_page', array( - 'label' => __( 'Crawl errors per page', 'wordpress-seo' ), - 'default' => 50, - 'option' => 'errors_per_page', - ) ); - } - - /** - * Set the screen options - * - * @param string $status Status string. - * @param string $option Option key. - * @param string $value Value to return. - * - * @return mixed - */ - public function set_screen_option( $status, $option, $value ) { - if ( 'errors_per_page' == $option ) { - return $value; - } - } - - /** - * Setting the hooks to be load on page request - */ - private function set_hooks() { - add_action( 'admin_enqueue_scripts', array( $this, 'page_scripts' ) ); - add_filter( 'set-screen-option', array( $this, 'set_screen_option' ), 11, 3 ); - } - - /** - * Handles the POST and GET requests - */ - private function request_handler() { - - // List the table search post to a get. - $this->list_table_search_post_to_get(); - - // Catch the authorization code POST. - $this->catch_authentication_post(); - - // Is there a reset post than we will remove the posts and data. - if ( filter_input( INPUT_GET, 'gsc_reset' ) ) { - // Clear the google data. - WPSEO_GSC_Settings::clear_data( $this->service ); - - // Adding notification to the notification center. - /* Translators: %1$s: expands to Google Search Console. */ - $this->add_notification( sprintf( __( 'The %1$s data has been removed. You will have to reauthenticate if you want to retrieve the data again.', 'wordpress-seo' ), 'Google Search Console' ), Yoast_Notification::UPDATED ); - - // Directly output the notifications. - wp_redirect( remove_query_arg( 'gsc_reset' ) ); - exit; - } - - // Reloads al the issues. - if ( wp_verify_nonce( filter_input( INPUT_POST, 'reload-crawl-issues-nonce' ), 'reload-crawl-issues' ) && filter_input( INPUT_POST, 'reload-crawl-issues' ) ) { - // Reloading all the issues. - WPSEO_GSC_Settings::reload_issues(); - - // Adding the notification. - $this->add_notification( __( 'The issues have been successfully reloaded!', 'wordpress-seo' ), Yoast_Notification::UPDATED ); - - // Directly output the notifications. - Yoast_Notification_Center::get()->display_notifications(); - } - - // Catch bulk action request. - new WPSEO_GSC_Bulk_Action(); - } - - /** - * Catch the redirects search post and redirect it to a search get - */ - private function list_table_search_post_to_get() { - $search_string = filter_input( INPUT_POST, 's' ); - - if ( $search_string === null ) { - return; - } - - // When there is nothing being search and there is no search param in the url, break this method. - if ( $search_string === '' && filter_input( INPUT_GET, 's' ) === null ) { - return; - } - - $url = ( $search_string !== '' ) ? add_query_arg( 's', $search_string ) : remove_query_arg( 's' ); - - // Do the redirect. - wp_redirect( $url ); - exit; - - } - - /** - * Catch the authentication post - */ - private function catch_authentication_post() { - $gsc_values = filter_input( INPUT_POST, 'gsc', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY ); - // Catch the authorization code POST. - if ( ! empty( $gsc_values['authorization_code'] ) && wp_verify_nonce( $gsc_values['gsc_nonce'], 'wpseo-gsc_nonce' ) ) { - if ( ! WPSEO_GSC_Settings::validate_authorization( trim( $gsc_values['authorization_code'] ), $this->service->get_client() ) ) { - $this->add_notification( __( 'Incorrect Google Authorization Code.', 'wordpress-seo' ), Yoast_Notification::ERROR ); - } - - // Redirect user to prevent a post resubmission which causes an oauth error. - wp_redirect( admin_url( 'admin.php' ) . '?page=' . esc_attr( filter_input( INPUT_GET, 'page' ) ) . '&tab=settings' ); - exit; - } - } - - /** - * Adding notification to the yoast notification center - * - * @param string $message Message string. - * @param string $type Message type. - */ - private function add_notification( $message, $type ) { - Yoast_Notification_Center::get()->add_notification( - new Yoast_Notification( $message, array( 'type' => $type ) ) - ); - } - - /** - * Setting dependencies which will be used one this page - */ - private function set_dependencies() { - // Setting the service object. - $this->service = new WPSEO_GSC_Service( WPSEO_GSC_Settings::get_profile() ); - - // Setting the platform. - $this->platform = WPSEO_GSC_Mapper::get_current_platform( 'tab' ); - - // Loading the issue counter. - $issue_count = new WPSEO_GSC_Count( $this->service ); - $issue_count->fetch_counts(); - - // Loading the category filters. - $this->category_filter = new WPSEO_GSC_Category_Filters( $issue_count->get_platform_counts( $this->platform ) ); - - // Setting the current category. - $this->category = $this->category_filter->get_category(); - - // Listing the issues. - $issue_count->list_issues( $this->platform, $this->category ); - - // Fetching the issues. - $this->issue_fetch = new WPSEO_GSC_Issues( $this->platform, $this->category, $issue_count->get_issues() ); - } - - /** - * Setting the tab help on top of the screen - */ - public function set_help() { - $screen = get_current_screen(); - - $screen->add_help_tab( - array( - 'id' => 'basic-help', - 'title' => __( 'Issue categories', 'wordpress-seo' ), - 'content' => '

    ' . __( 'Desktop', 'wordpress-seo' ) . '
    ' . __( 'Errors that occurred when your site was crawled by Googlebot.', 'wordpress-seo' ) . '

    ' - . '

    ' . __( 'Smartphone', 'wordpress-seo' ) . '
    ' . __( 'Errors that occurred only when your site was crawled by Googlebot-Mobile (errors didn\'t appear for desktop).', 'wordpress-seo' ) . '

    ' - . '

    ' . __( 'Feature phone', 'wordpress-seo' ) . '
    ' . __( 'Errors that only occurred when your site was crawled by Googlebot for feature phones (errors didn\'t appear for desktop).', 'wordpress-seo' ) . '

    ', - ) - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/views/gsc-display.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/views/gsc-display.php deleted file mode 100644 index 8ed93cda..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/views/gsc-display.php +++ /dev/null @@ -1,135 +0,0 @@ -admin_header( false, 'wpseo-gsc', false, 'yoast_wpseo_gsc_options' ); - -if ( defined( 'WP_DEBUG' ) && WP_DEBUG && WPSEO_GSC_Settings::get_profile() !== '' ) { ?> -
    - ' /> - -
    - - - - -service->get_client()->getAccessToken() ) { - $video_url = 'https://yoa.st/screencast-search-console'; -} -else { - $video_url = 'https://yoa.st/screencast-connect-search-console'; -} - -$tab = new WPSEO_Option_Tab( 'GSC', __( 'Google Search Console', 'wordpress-seo' ), array( 'video_url' => $video_url ) ); -$gsc_help_center = new WPSEO_Help_Center( 'google-search-console', $tab ); -$gsc_help_center->output_help_center(); - -switch ( $platform_tabs->current_tab() ) { - case 'settings' : - // Check if there is an access token. - if ( null === $this->service->get_client()->getAccessToken() ) { - // Print auth screen. - echo '

    '; - /* Translators: %1$s: expands to Yoast SEO, %2$s expands to Google Search Console. */ - echo sprintf( __( 'To allow %1$s to fetch your %2$s information, please enter your Google Authorization Code. Clicking the button below will open a new window.', 'wordpress-seo' ), 'Yoast SEO', 'Google Search Console' ); - echo "

    \n"; - echo ''; - echo "\n"; - - echo '

    ' . __( 'Enter your Google Authorization Code and press the Authenticate button.', 'wordpress-seo' ) . "

    \n"; - echo "
    \n"; - echo ""; - echo ""; - echo ""; - echo "
    \n"; - } - else { - $reset_button = '' . __( 'Reauthenticate with Google ', 'wordpress-seo' ) . ''; - echo '

    ', __( 'Current profile', 'wordpress-seo' ), '

    '; - if ( ($profile = WPSEO_GSC_Settings::get_profile() ) !== '' ) { - echo '

    '; - echo $profile; - echo '

    '; - - echo '

    '; - echo $reset_button; - echo '

    '; - - } - else { - echo "
    "; - - settings_fields( 'yoast_wpseo_gsc_options' ); - Yoast_Form::get_instance()->set_option( 'wpseo-gsc' ); - - echo '

    '; - if ( $profiles = $this->service->get_sites() ) { - $show_save = true; - echo Yoast_Form::get_instance()->select( 'profile', __( 'Profile', 'wordpress-seo' ), $profiles ); - } - else { - $show_save = false; - echo __( 'There were no profiles found', 'wordpress-seo' ); - } - echo '

    '; - - echo '

    '; - - if ( $show_save ) { - echo ' ' . __( 'or', 'wordpress-seo' ) , ' '; - } - echo $reset_button; - echo '

    '; - echo '
    '; - } - } - break; - - default : - $form_action_url = add_query_arg( 'page', esc_attr( filter_input( INPUT_GET, 'page' ) ) ); - - get_current_screen()->set_screen_reader_content( array( - // There are no views links in this screen, so no need for the views heading. - 'heading_views' => null, - 'heading_pagination' => __( 'Crawl issues list navigation', 'wordpress-seo' ), - 'heading_list' => __( 'Crawl issues list', 'wordpress-seo' ), - ) ); - - // Open
    . - echo "\n"; - - // AJAX nonce. - echo "\n"; - - $this->display_table(); - - // Close . - echo "
    \n"; - - break; -} -?> -'; - - printf( - /* translators: %1$s expands anchor to knowledge base article, %2$s expands to */ - __( 'Please refer to %1$sour article about how to connect your website to Google Search Console%2$s if you need assistance.', 'wordpress-seo' ), '', '' ); - - echo '

    '; -?> - -
    -admin_footer( false ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/views/gsc-redirect-nopremium.php b/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/views/gsc-redirect-nopremium.php deleted file mode 100644 index 1165125a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/google_search_console/views/gsc-redirect-nopremium.php +++ /dev/null @@ -1,18 +0,0 @@ -', sprintf( __( 'Creating redirects is a %s feature', 'wordpress-seo' ), 'Yoast SEO Premium' ), ''; -echo '

    '; -echo sprintf( - /* Translators: %1$s: expands to 'Yoast SEO Premium', %2$s: links to Yoast SEO Premium plugin page. */ - __( 'To be able to create a redirect and fix this issue, you need %1$s. You can buy the plugin, including one year of support and updates, on %2$s.', 'wordpress-seo' ), - 'Yoast SEO Premium', - 'yoast.com' -); -echo '

    '; -echo ''; diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-aioseo-hooks.php b/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-aioseo-hooks.php deleted file mode 100644 index 3f58cf03..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-aioseo-hooks.php +++ /dev/null @@ -1,40 +0,0 @@ - wp_create_nonce( 'wpseo-import' ) ), admin_url( 'admin.php?page=wpseo_tools&tool=import-export&import=1&importaioseo=1#top#import-seo' ) ); - /* translators: 1: link open tag; 2: link close tag. */ - echo '

    ', sprintf( esc_html__( 'The plugin All-In-One-SEO has been detected. Do you want to %1$simport its settings%2$s?', 'wordpress-seo' ), sprintf( '', esc_url( $url ) ), '' ), '

    '; - } - - /** - * Throw a notice to inform the user that the plugin has been deactivated - * - * @since 3.0 - */ - public function show_deactivate_notice() { - echo '

    ', esc_html__( 'All-In-One-SEO has been deactivated', 'wordpress-seo' ), '

    '; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-hooks.php b/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-hooks.php deleted file mode 100644 index 7c59f32a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-hooks.php +++ /dev/null @@ -1,89 +0,0 @@ -is_active() ) { - $this->show_import_message(); - $this->show_deactivate_message(); - } - } - - /** - * Handle deactivation & import of the data data - * - * @since 3.0 - */ - public function show_import_message() { - if ( filter_input( INPUT_GET, 'tool' ) !== 'import-export' ) { - add_action( 'admin_notices', array( $this, 'show_import_settings_notice' ) ); - } - } - - /** - * Handle deactivation of the plugin - * - * @since 3.0 - */ - public function show_deactivate_message() { - if ( filter_input( INPUT_GET, $this->deactivation_listener ) === '1' ) { - // Deactivate AIO. - deactivate_plugins( $this->plugin_file ); - - // Show notice that aioseo has been deactivated. - add_action( 'admin_notices', array( $this, 'show_deactivate_notice' ) ); - - // Clean up the referrer url for later use. - if ( isset( $_SERVER['REQUEST_URI'] ) ) { - $_SERVER['REQUEST_URI'] = remove_query_arg( array( $this->deactivation_listener ), sanitize_text_field( $_SERVER['REQUEST_URI'] ) ); - } - } - } - - /** - * Check if the plugin is active. - * - * @return bool - */ - protected function is_active() { - return is_plugin_active( $this->plugin_file ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-wpseo-hooks.php b/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-wpseo-hooks.php deleted file mode 100644 index d1c1fe2c..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/import/class-import-wpseo-hooks.php +++ /dev/null @@ -1,40 +0,0 @@ - wp_create_nonce( 'wpseo-import' ) ), admin_url( 'admin.php?page=wpseo_tools&tool=import-export&import=1&importwpseo=1#top#import-seo' ) ); - /* translators: 1: link open tag; 2: link close tag. */ - echo '

    ', sprintf( esc_html__( 'The plugin wpSEO has been detected. Do you want to %1$simport its settings%2$s?', 'wordpress-seo' ), sprintf( '', esc_url( $url ) ), '' ), '

    '; - } - - /** - * Throw a notice to inform the user wpSEO has been deactivated - * - * @since 3.0 - */ - public function show_deactivate_notice() { - echo '

    ', esc_html__( 'wpSEO has been deactivated', 'wordpress-seo' ), '

    '; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/index.php b/wp/wp-content/plugins/wordpress-seo/admin/index.php deleted file mode 100644 index e94d9a42..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/index.php +++ /dev/null @@ -1,4 +0,0 @@ - -
  7. - -
  8. - - ' . sprintf( __( 'Great news: you can, with %1$s!', 'wordpress-seo' ), - 'Yoast SEO Premium' - ) . '

    '; - $popup_content .= '

    ' . sprintf( - /* translators: %s expands to 'Yoast SEO Premium'. */ - __( 'Other benefits of %s for you:', 'wordpress-seo' ), 'Yoast SEO Premium' - ) . '

    '; - $popup_content .= '
      '; - $popup_content .= '
    • ' . sprintf( - /* translators: %1$s expands to a 'strong' start tag, %2$s to a 'strong' end tag. */ - __( '%1$sNo more dead links%2$s: easy redirect manager', 'wordpress-seo' ), '', '' - ) . '
    • '; - $popup_content .= '
    • ' . __( 'Superfast internal links suggestions', 'wordpress-seo' ) . '
    • '; - $popup_content .= '
    • ' . sprintf( - /* translators: %1$s expands to a 'strong' start tag, %2$s to a 'strong' end tag. */ - __( '%1$sSocial media preview%2$s: Facebook & Twitter', 'wordpress-seo' ), '', '' - ) . '
    • '; - $popup_content .= '
    • ' . __( '24/7 support', 'wordpress-seo' ) . '
    • '; - $popup_content .= '
    • ' . __( 'No ads!', 'wordpress-seo' ) . '
    • '; - $popup_content .= '
    '; - $premium_popup = new WPSEO_Premium_Popup( 'add-keyword', 'h1', $popup_title, $popup_content ); - echo $premium_popup->get_premium_message(); - - return ob_get_clean(); - } - - /** - * Returns an empty string because this tab has no content - * - * @return string - */ - public function content() { - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-addon-section.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-addon-section.php deleted file mode 100644 index 3f783c98..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-addon-section.php +++ /dev/null @@ -1,37 +0,0 @@ - -
    -
    -
      - -
    -
    - -
    - is_globally_enabled() && $this->is_user_enabled(); - } - - /** - * Whether or not this analysis is enabled by the user. - * - * @return bool Whether or not this analysis is enabled by the user. - */ - public function is_user_enabled() { - return ! get_the_author_meta( 'wpseo_content_analysis_disable', get_current_user_id() ); - } - - /** - * Whether or not this analysis is enabled globally. - * - * @return bool Whether or not this analysis is enabled globally. - */ - public function is_globally_enabled() { - $options = WPSEO_Options::get_option( 'wpseo' ); - - return (bool) $options['content_analysis_active']; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-seo.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-seo.php deleted file mode 100644 index 828f6d38..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-analysis-seo.php +++ /dev/null @@ -1,39 +0,0 @@ -is_globally_enabled() && $this->is_user_enabled(); - } - - /** - * Whether or not this analysis is enabled by the user. - * - * @return bool Whether or not this analysis is enabled by the user. - */ - public function is_user_enabled() { - return ! get_the_author_meta( 'wpseo_keyword_analysis_disable', get_current_user_id() ); - } - - /** - * Whether or not this analysis is enabled globally. - * - * @return bool Whether or not this analysis is enabled globally. - */ - public function is_globally_enabled() { - $options = WPSEO_Options::get_option( 'wpseo' ); - - return (bool) $options['keyword_analysis_active']; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-editor.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-editor.php deleted file mode 100644 index d3dd10b9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-editor.php +++ /dev/null @@ -1,64 +0,0 @@ -special_styles(); - /** @var WPSEO_Admin_Asset $inside_editor */ - $inside_editor = $styles['inside-editor']; - - $url = $inside_editor->get_url( WPSEO_Admin_Asset::TYPE_CSS, WPSEO_FILE ); - - if ( '' === $css_files ) { - $css_files = $url; - } - else { - $css_files .= ',' . $url; - } - - return $css_files; - } - - /** - * Adds a custom element to the tinyMCE editor that we need for marking the content. - * - * @param array $tinymce_config The tinyMCE config as configured by WordPress. - * - * @return array The new tinyMCE config with our added custom elements. - */ - public function add_custom_element( $tinymce_config ) { - if ( ! empty( $tinymce_config['custom_elements'] ) ) { - $custom_elements = $tinymce_config['custom_elements']; - - $custom_elements .= ',~yoastmark'; - } - else { - $custom_elements = '~yoastmark'; - } - - $tinymce_config['custom_elements'] = $custom_elements; - - return $tinymce_config; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-form-tab.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-form-tab.php deleted file mode 100644 index 2107e002..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-form-tab.php +++ /dev/null @@ -1,115 +0,0 @@ - '', - 'link_class' => '', - 'link_title' => '', - 'link_aria_label' => '', - 'single' => false, - ); - $options = array_merge( $default_options, $options ); - - $this->name = $name; - $this->content = $content; - $this->link_content = $link_content; - $this->tab_class = $options['tab_class']; - $this->link_class = $options['link_class']; - $this->link_title = $options['link_title']; - $this->link_aria_label = $options['link_aria_label']; - $this->single = $options['single']; - } - - /** - * Returns the html for the tab link. - * - * @return string - */ - public function link() { - - $html = '
  9. %6$s
  10. '; - - if ( $this->single ) { - $html = '
  11. %6$s
  12. '; - } - - return sprintf( - $html, - esc_attr( $this->name ), - ( '' !== $this->tab_class ) ? ' ' . esc_attr( $this->tab_class ) : '', - ( '' !== $this->link_class ) ? ' ' . esc_attr( $this->link_class ) : '', - ( '' !== $this->link_title ) ? ' title="' . esc_attr( $this->link_title ) . '"' : '', - ( '' !== $this->link_aria_label ) ? ' aria-label="' . esc_attr( $this->link_aria_label ) . '"' : '', - $this->link_content - ); - } - - /** - * Returns the html for the tab content. - * - * @return string - */ - public function content() { - return sprintf( - '
    %2$s
    ', - esc_attr( $this->name ), - $this->content - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-tab-section.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-tab-section.php deleted file mode 100644 index e49e97a0..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox-tab-section.php +++ /dev/null @@ -1,140 +0,0 @@ - '', - 'link_class' => '', - 'link_aria_label' => '', - ); - $options = array_merge( $default_options, $options ); - - $this->name = $name; - foreach ( $tabs as $tab ) { - $this->add_tab( $tab ); - } - $this->link_content = $link_content; - $this->link_title = $options['link_title']; - $this->link_class = $options['link_class']; - $this->link_aria_label = $options['link_aria_label']; - } - - /** - * Outputs the section link if any tab has been added. - */ - public function display_link() { - if ( $this->has_tabs() ) { - printf( - '
  13. %5$s
  14. ', - esc_attr( $this->name ), - esc_attr( $this->link_class ), - ( '' !== $this->link_title ) ? ' title="' . esc_attr( $this->link_title ) . '"' : '', - ( '' !== $this->link_aria_label ) ? ' aria-label="' . esc_attr( $this->link_aria_label ) . '"' : '', - $this->link_content - ); - } - } - - /** - * Outputs the section content if any tab has been added. - */ - public function display_content() { - if ( $this->has_tabs() ) { - $html = '
    '; - $html .= '
    '; - $html .= '
      %2$s
    %3$s'; - $html .= '
    '; - - printf( $html, esc_attr( $this->name ), $this->tab_links(), $this->tab_content() ); - } - } - - /** - * Add a `WPSEO_Metabox_Tab` object to the tabs. - * - * @param WPSEO_Metabox_Tab $tab Tab to add. - */ - public function add_tab( WPSEO_Metabox_Tab $tab ) { - $this->tabs[] = $tab; - } - - /** - * Checks if any tabs have been added to the section. - * - * @return bool - */ - protected function has_tabs() { - return ! empty( $this->tabs ); - } - - /** - * Concatenates all tabs' links into one html string. - * - * @return string - */ - private function tab_links() { - $links = ''; - foreach ( $this->tabs as $tab ) { - $links .= $tab->link(); - } - return $links; - } - - /** - * Concatenates all tabs' content into one html string. - * - * @return string - */ - private function tab_content() { - $content = ''; - foreach ( $this->tabs as $tab ) { - $content .= $tab->content(); - } - return $content; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox.php deleted file mode 100644 index 8e45de01..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/class-metabox.php +++ /dev/null @@ -1,1689 +0,0 @@ -options = WPSEO_Options::get_options( array( 'wpseo', 'wpseo_social' ) ); - - // Check if one of the social settings is checked in the options, if so, initialize the social_admin object. - if ( $this->options['opengraph'] === true || $this->options['twitter'] === true ) { - $this->social_admin = new WPSEO_Social_Admin( $this->options ); - } - - $this->editor = new WPSEO_Metabox_Editor(); - $this->editor->register_hooks(); - - $this->analysis_seo = new WPSEO_Metabox_Analysis_SEO(); - $this->analysis_readability = new WPSEO_Metabox_Analysis_Readability(); - } - - /** - * Translate text strings for use in the meta box - * - * IMPORTANT: if you want to add a new string (option) somewhere, make sure you add that array key to - * the main meta box definition array in the class WPSEO_Meta() as well!!!! - */ - public static function translate_meta_boxes() { - self::$meta_fields['general']['snippetpreview']['title'] = __( 'Snippet editor', 'wordpress-seo' ); - /* translators: 1: link open tag; 2: link close tag. */ - self::$meta_fields['general']['snippetpreview']['help'] = sprintf( __( 'This is a rendering of what this post might look like in Google\'s search results. %1$sLearn more about the Snippet Preview%2$s.', 'wordpress-seo' ), '', '' ); - self::$meta_fields['general']['snippetpreview']['help-button'] = __( 'Show information about the snippet editor', 'wordpress-seo' ); - - self::$meta_fields['general']['pageanalysis']['title'] = __( 'Analysis', 'wordpress-seo' ); - /* translators: 1: link open tag; 2: link close tag. */ - self::$meta_fields['general']['pageanalysis']['help'] = sprintf( __( 'This is the content analysis, a collection of content checks that analyze the content of your page. %1$sLearn more about the Content Analysis Tool%2$s.', 'wordpress-seo' ), '', '' ); - self::$meta_fields['general']['pageanalysis']['help-button'] = __( 'Show information about the content analysis', 'wordpress-seo' ); - - self::$meta_fields['general']['focuskw_text_input']['title'] = __( 'Focus keyword', 'wordpress-seo' ); - self::$meta_fields['general']['focuskw_text_input']['label'] = __( 'Enter a focus keyword', 'wordpress-seo' ); - /* translators: 1: link open tag; 2: link close tag. */ - self::$meta_fields['general']['focuskw_text_input']['help'] = sprintf( __( 'Pick the main keyword or keyphrase that this post/page is about. %1$sLearn more about the Focus Keyword%2$s.', 'wordpress-seo' ), '', '' ); - self::$meta_fields['general']['focuskw_text_input']['help-button'] = __( 'Show information about the focus keyword', 'wordpress-seo' ); - - self::$meta_fields['general']['title']['title'] = __( 'SEO title', 'wordpress-seo' ); - - self::$meta_fields['general']['metadesc']['title'] = __( 'Meta description', 'wordpress-seo' ); - - self::$meta_fields['general']['metakeywords']['title'] = __( 'Meta keywords', 'wordpress-seo' ); - self::$meta_fields['general']['metakeywords']['label'] = __( 'Enter the meta keywords', 'wordpress-seo' ); - /* translators: 1: link open tag; 2: link close tag. */ - self::$meta_fields['general']['metakeywords']['description'] = __( 'If you type something above it will override your %1$smeta keywords template%2$s.', 'wordpress-seo' ); - - - self::$meta_fields['advanced']['meta-robots-noindex']['title'] = __( 'Meta robots index', 'wordpress-seo' ); - if ( '0' == get_option( 'blog_public' ) ) { - self::$meta_fields['advanced']['meta-robots-noindex']['description'] = '

    ' . __( 'Warning: even though you can set the meta robots setting here, the entire site is set to noindex in the sitewide privacy settings, so these settings won\'t have an effect.', 'wordpress-seo' ) . '

    '; - } - self::$meta_fields['advanced']['meta-robots-noindex']['options']['0'] = __( 'Default for this post type, currently: %s', 'wordpress-seo' ); - self::$meta_fields['advanced']['meta-robots-noindex']['options']['2'] = 'index'; - self::$meta_fields['advanced']['meta-robots-noindex']['options']['1'] = 'noindex'; - - self::$meta_fields['advanced']['meta-robots-nofollow']['title'] = __( 'Meta robots follow', 'wordpress-seo' ); - self::$meta_fields['advanced']['meta-robots-nofollow']['options']['0'] = 'follow'; - self::$meta_fields['advanced']['meta-robots-nofollow']['options']['1'] = 'nofollow'; - - self::$meta_fields['advanced']['meta-robots-adv']['title'] = __( 'Meta robots advanced', 'wordpress-seo' ); - self::$meta_fields['advanced']['meta-robots-adv']['description'] = __( 'Advanced meta robots settings for this page.', 'wordpress-seo' ); - self::$meta_fields['advanced']['meta-robots-adv']['options']['-'] = __( 'Site-wide default: %s', 'wordpress-seo' ); - self::$meta_fields['advanced']['meta-robots-adv']['options']['none'] = __( 'None', 'wordpress-seo' ); - self::$meta_fields['advanced']['meta-robots-adv']['options']['noodp'] = __( 'NO ODP', 'wordpress-seo' ); - self::$meta_fields['advanced']['meta-robots-adv']['options']['noimageindex'] = __( 'No Image Index', 'wordpress-seo' ); - self::$meta_fields['advanced']['meta-robots-adv']['options']['noarchive'] = __( 'No Archive', 'wordpress-seo' ); - self::$meta_fields['advanced']['meta-robots-adv']['options']['nosnippet'] = __( 'No Snippet', 'wordpress-seo' ); - - self::$meta_fields['advanced']['bctitle']['title'] = __( 'Breadcrumbs Title', 'wordpress-seo' ); - self::$meta_fields['advanced']['bctitle']['description'] = __( 'Title to use for this page in breadcrumb paths', 'wordpress-seo' ); - - self::$meta_fields['advanced']['canonical']['title'] = __( 'Canonical URL', 'wordpress-seo' ); - /* translators: 1: link open tag; 2: link close tag. */ - self::$meta_fields['advanced']['canonical']['description'] = sprintf( __( 'The canonical URL that this page should point to, leave empty to default to permalink. %1$sCross domain canonical%2$s supported too.', 'wordpress-seo' ), '', '' ); - - self::$meta_fields['advanced']['redirect']['title'] = __( '301 Redirect', 'wordpress-seo' ); - self::$meta_fields['advanced']['redirect']['description'] = __( 'The URL that this page should redirect to.', 'wordpress-seo' ); - - do_action( 'wpseo_tab_translate' ); - } - - /** - * Test whether the metabox should be hidden either by choice of the admin or because - * the post type is not a public post type - * - * @since 1.5.0 - * - * @param string $post_type (optional) The post type to test, defaults to the current post post_type. - * - * @return bool Whether or not the meta box (and associated columns etc) should be hidden - */ - function is_metabox_hidden( $post_type = null ) { - if ( ! isset( $post_type ) && ( isset( $GLOBALS['post'] ) && ( is_object( $GLOBALS['post'] ) && isset( $GLOBALS['post']->post_type ) ) ) ) { - $post_type = $GLOBALS['post']->post_type; - } - - if ( isset( $post_type ) ) { - // Don't make static as post_types may still be added during the run. - $cpts = get_post_types( array( 'public' => true ), 'names' ); - $options = get_option( 'wpseo_titles' ); - - return ( ( isset( $options[ 'hideeditbox-' . $post_type ] ) && $options[ 'hideeditbox-' . $post_type ] === true ) || in_array( $post_type, $cpts ) === false ); - } - return false; - } - - /** - * Sets up all the functionality related to the prominence of the page analysis functionality. - */ - public function setup_page_analysis() { - if ( apply_filters( 'wpseo_use_page_analysis', true ) === true ) { - add_action( 'post_submitbox_start', array( $this, 'publish_box' ) ); - } - } - - /** - * Outputs the page analysis score in the Publish Box. - */ - public function publish_box() { - if ( $this->is_metabox_hidden() === true ) { - return; - } - - $post = $this->get_metabox_post(); - if ( self::get_value( 'meta-robots-noindex', $post->ID ) === '1' ) { - $score_label = 'noindex'; - $title = __( 'Post is set to noindex.', 'wordpress-seo' ); - $score_title = $title; - } - else { - $score = self::get_value( 'linkdex', $post->ID ); - if ( $score === '' ) { - $score_label = 'na'; - $title = __( 'No focus keyword set.', 'wordpress-seo' ); - } - else { - $score_label = WPSEO_Utils::translate_score( $score ); - } - - $score_title = WPSEO_Utils::translate_score( $score, false ); - if ( ! isset( $title ) ) { - $title = $score_title; - } - } - } - - /** - * Adds the Yoast SEO meta box to the edit boxes in the edit post, page, - * attachment, and custom post types pages. - */ - public function add_meta_box() { - $post_types = get_post_types( array( 'public' => true ) ); - - if ( is_array( $post_types ) && $post_types !== array() ) { - foreach ( $post_types as $post_type ) { - if ( $this->is_metabox_hidden( $post_type ) === false ) { - $product_title = 'Yoast SEO'; - if ( file_exists( WPSEO_PATH . 'premium/' ) ) { - $product_title .= ' Premium'; - } - - if ( null !== get_current_screen() ) { - $screen_id = get_current_screen()->id; - add_filter( "postbox_classes_{$screen_id}_wpseo_meta", array( $this, 'wpseo_metabox_class' ) ); - } - - add_meta_box( 'wpseo_meta', $product_title, array( - $this, - 'meta_box', - ), $post_type, 'normal', apply_filters( 'wpseo_metabox_prio', 'high' ) ); - } - } - } - } - - /** - * Adds CSS classes to the meta box. - * - * @param array $classes An array of postbox CSS classes. - * - * @return array - */ - public function wpseo_metabox_class( $classes ) { - $classes[] = 'yoast wpseo-metabox'; - return $classes; - } - - /** - * Pass variables to js for use with the post-scraper - * - * @return array - */ - public function localize_post_scraper_script() { - $post = $this->get_metabox_post(); - $permalink = ''; - - if ( is_object( $post ) ) { - $permalink = get_sample_permalink( $post->ID ); - $permalink = $permalink[0]; - } - - $post_formatter = new WPSEO_Metabox_Formatter( - new WPSEO_Post_Metabox_Formatter( $post, WPSEO_Options::get_option( 'wpseo_titles' ), $permalink ) - ); - - return $post_formatter->get_values(); - } - - /** - * Pass some variables to js for replacing variables. - */ - public function localize_replace_vars_script() { - return array( - 'no_parent_text' => __( '(no parent)', 'wordpress-seo' ), - 'replace_vars' => $this->get_replace_vars(), - 'scope' => $this->determine_scope(), - ); - } - - /** - * Determines the scope based on the post type. - * This can be used by the replacevar plugin to determine if a replacement needs to be executed. - * - * @return string String decribing the current scope. - */ - private function determine_scope() { - $post_type = get_post_type( $this->get_metabox_post() ); - - if ( $post_type === 'page' ) { - return 'page'; - } - - return 'post'; - } - - /** - * Pass some variables to js for the edit / post page overview, snippet preview, etc. - * - * @return array - */ - public function localize_shortcode_plugin_script() { - return array( - 'wpseo_filter_shortcodes_nonce' => wp_create_nonce( 'wpseo-filter-shortcodes' ), - 'wpseo_shortcode_tags' => $this->get_valid_shortcode_tags(), - ); - } - - /** - * Output a tab in the Yoast SEO Metabox - * - * @param string $id CSS ID of the tab. - * @param string $heading Heading for the tab. - * @param string $content Content of the tab. This content should be escaped. - */ - public function do_tab( $id, $heading, $content ) { - ?> -
    - -
    - get_content_sections(); - - $helpcenter_tab = new WPSEO_Option_Tab( 'metabox', 'Meta box', - array( 'video_url' => 'https://yoa.st/metabox-screencast' ) ); - - $helpcenter = new WPSEO_Help_Center( 'metabox', $helpcenter_tab ); - $helpcenter->output_help_center(); - - if ( ! defined( 'WPSEO_PREMIUM_FILE' ) ) { - echo $this->get_buy_premium_link(); - } - - echo '
      '; - - foreach ( $content_sections as $content_section ) { - if ( $content_section->name === 'premium' ) { - continue; - } - - $content_section->display_link(); - } - - echo '
    '; - - foreach ( $content_sections as $content_section ) { - $content_section->display_content(); - } - } - - /** - * Returns the relevant metabox sections for the current view. - * - * @return WPSEO_Metabox_Section[] - */ - private function get_content_sections() { - $content_sections = array( $this->get_content_meta_section() ); - - // Check if social_admin is an instance of WPSEO_Social_Admin. - if ( $this->social_admin instanceof WPSEO_Social_Admin ) { - $content_sections[] = $this->social_admin->get_meta_section(); - } - - if ( current_user_can( 'manage_options' ) || $this->options['disableadvanced_meta'] === false ) { - $content_sections[] = $this->get_advanced_meta_section(); - } - - if ( ! defined( 'WPSEO_PREMIUM_FILE' ) ) { - $content_sections[] = $this->get_buy_premium_section(); - } - - if ( has_action( 'wpseo_tab_header' ) || has_action( 'wpseo_tab_content' ) ) { - $content_sections[] = $this->get_addons_meta_section(); - } - - return $content_sections; - } - - /** - * Returns the metabox section for the content analysis. - * - * @return WPSEO_Metabox_Section - */ - private function get_content_meta_section() { - $content = $this->get_tab_content( 'general' ); - - $tabs = array(); - - $tabs[] = new WPSEO_Metabox_Form_Tab( - 'content', - $content, - '', - array( - 'tab_class' => 'yoast-seo__remove-tab', - ) - ); - - $tabs[] = new Metabox_Add_Keyword_Tab(); - - return new WPSEO_Metabox_Tab_Section( - 'content', - '' . __( 'Content optimization', 'wordpress-seo' ) . '' . $this->traffic_light_svg() . '', - $tabs, - array( - 'link_aria_label' => __( 'Content optimization', 'wordpress-seo' ), - 'link_class' => 'yoast-tooltip yoast-tooltip-e', - ) - ); - } - - /** - * Returns the metabox section for the advanced settings. - * - * @return WPSEO_Metabox_Section - */ - private function get_advanced_meta_section() { - $content = $this->get_tab_content( 'advanced' ); - - $tab = new WPSEO_Metabox_Form_Tab( - 'advanced', - $content, - __( 'Advanced', 'wordpress-seo' ), - array( - 'single' => true, - ) - ); - - return new WPSEO_Metabox_Tab_Section( - 'advanced', - '' . __( 'Advanced', 'wordpress-seo' ) . '', - array( $tab ), - array( - 'link_aria_label' => __( 'Advanced', 'wordpress-seo' ), - 'link_class' => 'yoast-tooltip yoast-tooltip-e', - ) - ); - } - - /** - * Returns a link to activate the Buy Premium tab. - * - * @return string - */ - private function get_buy_premium_link() { - return sprintf( "", - 'wpseo-metabox-buy-premium', - __( 'Go Premium', 'wordpress-seo' ) - ); - } - - /** - * Returns the metabox section for the Premium section. - * - * @return WPSEO_Metabox_Section - */ - private function get_buy_premium_section() { - $content = sprintf( "
    - %s -
      -
    • - %s - %s -
    • -
    • - %s - %s -
    • -
    • - %s - %s -
    • -
    • - %s - %s -
    • -
    - - - %s - - -

    %s

    -
    ", - /* translators: %1$s expands to Yoast SEO Premium. */ - sprintf( __( 'You\'re not getting the benefits of %1$s yet. If you had %1$s, you could use its awesome features:', 'wordpress-seo' ), 'Yoast SEO Premium' ), - __( 'Redirect manager', 'wordpress-seo' ), - __( 'Create and manage redirects within your WordPress install.', 'wordpress-seo' ), - __( 'Multiple focus keywords', 'wordpress-seo' ), - __( 'Optimize a single post for up to 5 keywords.', 'wordpress-seo' ), - __( 'Social Previews', 'wordpress-seo' ), - __( 'Check what your Facebook or Twitter post will look like.', 'wordpress-seo' ), - __( 'Premium support', 'wordpress-seo' ), - __( 'Gain access to our 24/7 support team.', 'wordpress-seo' ), - WPSEO_Shortlinker::get( 'https://yoa.st/pe-buy-premium' ), - /* translators: %s expands to Yoast SEO Premium. */ - sprintf( __( 'Get %s now!', 'wordpress-seo' ), 'Yoast SEO Premium' ), - WPSEO_Shortlinker::get( 'https://yoa.st/pe-premium-page' ), - __( 'More info', 'wordpress-seo' ) - ); - - $tab = new WPSEO_Metabox_Form_Tab( - 'premium', - $content, - 'Yoast SEO Premium', - array( - 'single' => true, - ) - ); - - return new WPSEO_Metabox_Tab_Section( - 'premium', - '', - array( $tab ), - array( - 'link_aria_label' => 'Yoast SEO Premium', - 'link_class' => 'yoast-tooltip yoast-tooltip-e', - ) - ); - } - - /** - * Returns a metabox section dedicated to hosting metabox tabs that have been added by other plugins through the - * `wpseo_tab_header` and `wpseo_tab_content` actions. - * - * @return WPSEO_Metabox_Section - */ - private function get_addons_meta_section() { - return new WPSEO_Metabox_Addon_Tab_Section( - 'addons', - '' . __( 'Add-ons', 'wordpress-seo' ) . '', - array(), - array( - 'link_aria_label' => __( 'Add-ons', 'wordpress-seo' ), - 'link_class' => 'yoast-tooltip yoast-tooltip-e', - ) - ); - } - - /** - * Gets the contents for the metabox tab. - * - * @param string $tab_name Tab for which to retrieve the field definitions. - * - * @return string - */ - private function get_tab_content( $tab_name ) { - $content = ''; - foreach ( $this->get_meta_field_defs( $tab_name ) as $key => $meta_field ) { - $content .= $this->do_meta_box( $meta_field, $key ); - } - unset( $key, $meta_field ); - - return $content; - } - - /** - * Adds a line in the meta box - * - * @todo [JRF] check if $class is added appropriately everywhere - * - * @param array $meta_field_def Contains the vars based on which output is generated. - * @param string $key Internal key (without prefix). - * - * @return string - */ - function do_meta_box( $meta_field_def, $key = '' ) { - $content = ''; - $esc_form_key = esc_attr( self::$form_prefix . $key ); - $meta_value = self::get_value( $key, $this->get_metabox_post()->ID ); - - $class = ''; - if ( isset( $meta_field_def['class'] ) && $meta_field_def['class'] !== '' ) { - $class = ' ' . $meta_field_def['class']; - } - - $placeholder = ''; - if ( isset( $meta_field_def['placeholder'] ) && $meta_field_def['placeholder'] !== '' ) { - $placeholder = $meta_field_def['placeholder']; - } - - $aria_describedby = $description = ''; - if ( isset( $meta_field_def['description'] ) ) { - $aria_describedby = ' aria-describedby="' . $esc_form_key . '-desc"'; - $description = '

    ' . $meta_field_def['description'] . '

    '; - } - - switch ( $meta_field_def['type'] ) { - case 'pageanalysis': - $content .= '
    '; - $content .= '
    '; - $content .= '

    ' . __( 'Analysis', 'wordpress-seo' ) . '

    '; - $content .= '
    '; - $content .= '
    '; - $content .= '
    '; - $content .= '
    '; - break; - case 'snippetpreview': - $content .= '
    '; - break; - case 'focuskeyword': - if ( $placeholder !== '' ) { - $placeholder = ' placeholder="' . esc_attr( $placeholder ) . '"'; - } - - $content .= '
    '; - $content .= '
    '; - $content .= '

    ' . esc_html( $meta_field_def['title'] ) . '

    '; - $content .= ''; - $content .= ''; - - if ( $this->options['enable_cornerstone_content'] ) { - $cornerstone_field = new WPSEO_Cornerstone_Field(); - - $content .= $cornerstone_field->get_html( $this->get_metabox_post() ); - } - $content .= '
    '; - $content .= '
    '; - break; - case 'metakeywords': - $content .= '
    '; - $content .= '
    '; - $content .= '

    ' . esc_html( $meta_field_def['title'] ) . '

    '; - $content .= ''; - $content .= ''; - $content .= $description; - $content .= '
    '; - $content .= '
    '; - break; - case 'text': - $ac = ''; - if ( isset( $meta_field_def['autocomplete'] ) && $meta_field_def['autocomplete'] === false ) { - $ac = 'autocomplete="off" '; - } - if ( $placeholder !== '' ) { - $placeholder = ' placeholder="' . esc_attr( $placeholder ) . '"'; - } - $content .= ''; - break; - - case 'textarea': - $rows = 3; - if ( isset( $meta_field_def['rows'] ) && $meta_field_def['rows'] > 0 ) { - $rows = $meta_field_def['rows']; - } - $content .= ''; - break; - - case 'hidden': - $content .= '' . "\n"; - break; - case 'select': - if ( isset( $meta_field_def['options'] ) && is_array( $meta_field_def['options'] ) && $meta_field_def['options'] !== array() ) { - $content .= ''; - } - break; - - case 'multiselect': - if ( isset( $meta_field_def['options'] ) && is_array( $meta_field_def['options'] ) && $meta_field_def['options'] !== array() ) { - - // Set $meta_value as $selected_arr. - $selected_arr = $meta_value; - - // If the multiselect field is 'meta-robots-adv' we should explode on ,. - if ( 'meta-robots-adv' === $key ) { - $selected_arr = explode( ',', $meta_value ); - } - - if ( ! is_array( $selected_arr ) ) { - $selected_arr = (array) $selected_arr; - } - - $options_count = count( $meta_field_def['options'] ); - - // This select now uses Select2. - $content .= ''; - unset( $val, $option, $selected, $selected_arr, $options_count ); - } - break; - - case 'checkbox': - $checked = checked( $meta_value, 'on', false ); - $expl = ( isset( $meta_field_def['expl'] ) ) ? esc_html( $meta_field_def['expl'] ) : ''; - $content .= ' '; - unset( $checked, $expl ); - break; - - case 'radio': - if ( isset( $meta_field_def['options'] ) && is_array( $meta_field_def['options'] ) && $meta_field_def['options'] !== array() ) { - foreach ( $meta_field_def['options'] as $val => $option ) { - $checked = checked( $meta_value, $val, false ); - $content .= ' '; - } - unset( $val, $option, $checked ); - } - break; - - case 'upload': - $content .= ''; - $content .= ''; - break; - } - - $html = ''; - if ( $content === '' ) { - $content = apply_filters( 'wpseo_do_meta_box_field_' . $key, $content, $meta_value, $esc_form_key, $meta_field_def, $key ); - } - - if ( $content !== '' ) { - - $title = esc_html( $meta_field_def['title'] ); - - // By default, use the field title as a label element. - $label = ''; - - // Set the inline help and help panel, if any. - $help_button = $help_panel = ''; - if ( isset( $meta_field_def['help'] ) && $meta_field_def['help'] !== '' ) { - $help = new WPSEO_Admin_Help_Panel( $key, $meta_field_def['help-button'], $meta_field_def['help'] ); - $help_button = $help->get_button_html(); - $help_panel = $help->get_panel_html(); - } - - // If it's a set of radio buttons, output proper fieldset and legend. - if ( 'radio' === $meta_field_def['type'] ) { - return '
    ' . $title . '' . $help_button . $help_panel . $content . $description . '
    '; - } - - // If it's a single checkbox, ignore the title. - if ( 'checkbox' === $meta_field_def['type'] ) { - $label = ''; - } - - // Special meta box sections such as the Snippet Preview, the Analysis, etc. - if ( in_array( $meta_field_def['type'], array( - 'snippetpreview', - 'pageanalysis', - 'focuskeyword', - 'metakeywords', - ), true ) - ) { - return $this->create_content_box( $content, $meta_field_def['type'], $help_button, $help_panel ); - } - - // Other meta box content or form fields. - if ( $meta_field_def['type'] === 'hidden' ) { - $html = $content; - } - else { - $html = $label . $help_button . $help_panel . $content . $description; - } - } - - return $html; - } - - /** - * Creates a sections specific row. - * - * @param string $content The content to show. - * @param string $hidden_help_name Escaped form key name. - * @param string $help_button The help button. - * @param string $help_panel The help text. - * - * @return string - */ - private function create_content_box( $content, $hidden_help_name, $help_button, $help_panel ) { - $html = $content; - $html .= '
    ' . $help_button . $help_panel . '
    '; - return $html; - } - - /** - * Save the WP SEO metadata for posts. - * - * @internal $_POST parameters are validated via sanitize_post_meta() - * - * @param int $post_id Post ID. - * - * @return bool|void Boolean false if invalid save post request - */ - function save_postdata( $post_id ) { - // Bail if this is a multisite installation and the site has been switched. - if ( is_multisite() && ms_is_switched() ) { - return false; - } - - if ( $post_id === null ) { - return false; - } - - if ( wp_is_post_revision( $post_id ) ) { - $post_id = wp_is_post_revision( $post_id ); - } - - /** - * Determine we're not accidentally updating a different post. - * We can't use filter_input here as the ID isn't available at this point, other than in the $_POST data. - */ - if ( ! isset( $_POST['ID'] ) || $post_id !== (int) $_POST['ID'] ) { - return false; - } - - clean_post_cache( $post_id ); - $post = get_post( $post_id ); - - if ( ! is_object( $post ) ) { - // Non-existent post. - return false; - } - - do_action( 'wpseo_save_compare_data', $post ); - - $meta_boxes = apply_filters( 'wpseo_save_metaboxes', array() ); - $meta_boxes = array_merge( $meta_boxes, $this->get_meta_field_defs( 'general', $post->post_type ), $this->get_meta_field_defs( 'advanced' ) ); - - foreach ( $meta_boxes as $key => $meta_box ) { - - // If analysis is disabled remove that analysis score value from the DB. - if ( $this->is_meta_value_disabled( $key ) ) { - self::delete( $key, $post_id ); - continue; - } - - $data = null; - if ( 'checkbox' === $meta_box['type'] ) { - $data = isset( $_POST[ self::$form_prefix . $key ] ) ? 'on' : 'off'; - } - else { - if ( isset( $_POST[ self::$form_prefix . $key ] ) ) { - $data = $_POST[ self::$form_prefix . $key ]; - } - } - if ( isset( $data ) ) { - self::set_value( $key, $data, $post_id ); - } - } - - do_action( 'wpseo_saved_postdata' ); - } - - /** - * Determines if the given meta value key is disabled - * - * @param string $key The key of the meta value. - * @return bool Whether the given meta value key is disabled. - */ - public function is_meta_value_disabled( $key ) { - if ( 'linkdex' === $key && ! $this->analysis_seo->is_enabled() ) { - return true; - } - - if ( 'content_score' === $key && ! $this->analysis_readability->is_enabled() ) { - return true; - } - - return false; - } - - /** - * Enqueues all the needed JS and CSS. - * - * @todo [JRF => whomever] create css/metabox-mp6.css file and add it to the below allowed colors array when done - */ - public function enqueue() { - global $pagenow; - - $asset_manager = new WPSEO_Admin_Asset_Manager(); - - $is_editor = self::is_post_overview( $pagenow ) || self::is_post_edit( $pagenow ); - - /* Filter 'wpseo_always_register_metaboxes_on_admin' documented in wpseo-main.php */ - if ( ( ! $is_editor && apply_filters( 'wpseo_always_register_metaboxes_on_admin', false ) === false ) || $this->is_metabox_hidden() === true - ) { - return; - } - - if ( self::is_post_overview( $pagenow ) ) { - $asset_manager->enqueue_style( 'edit-page' ); - } - else { - - if ( 0 != get_queried_object_id() ) { - wp_enqueue_media( array( 'post' => get_queried_object_id() ) ); // Enqueue files needed for upload functionality. - } - - $asset_manager->enqueue_style( 'metabox-css' ); - $asset_manager->enqueue_style( 'scoring' ); - $asset_manager->enqueue_style( 'snippet' ); - $asset_manager->enqueue_style( 'select2' ); - $asset_manager->enqueue_style( 'kb-search' ); - - $asset_manager->enqueue_script( 'metabox' ); - $asset_manager->enqueue_script( 'admin-media' ); - - $asset_manager->enqueue_script( 'post-scraper' ); - $asset_manager->enqueue_script( 'replacevar-plugin' ); - $asset_manager->enqueue_script( 'shortcode-plugin' ); - - wp_enqueue_script( 'jquery-ui-autocomplete' ); - - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'admin-media', 'wpseoMediaL10n', $this->localize_media_script() ); - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'post-scraper', 'wpseoPostScraperL10n', $this->localize_post_scraper_script() ); - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'replacevar-plugin', 'wpseoReplaceVarsL10n', $this->localize_replace_vars_script() ); - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'shortcode-plugin', 'wpseoShortcodePluginL10n', $this->localize_shortcode_plugin_script() ); - - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'metabox', 'wpseoAdminL10n', WPSEO_Help_Center::get_translated_texts() ); - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'metabox', 'wpseoSelect2Locale', WPSEO_Utils::get_language( WPSEO_Utils::get_user_locale() ) ); - - if ( post_type_supports( get_post_type(), 'thumbnail' ) ) { - $asset_manager->enqueue_style( 'featured-image' ); - - $asset_manager->enqueue_script( 'featured-image' ); - - $featured_image_l10 = array( 'featured_image_notice' => __( 'SEO issue: The featured image should be at least 200 by 200 pixels to be picked up by Facebook and other social media sites.', 'wordpress-seo' ) ); - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'metabox', 'wpseoFeaturedImageL10n', $featured_image_l10 ); - } - } - } - - /** - * Pass some variables to js for upload module. - * - * @return array - */ - public function localize_media_script() { - return array( - 'choose_image' => __( 'Use Image', 'wordpress-seo' ), - ); - } - - /** - * Returns post in metabox context - * - * @returns WP_Post|array - */ - protected function get_metabox_post() { - if ( $post = filter_input( INPUT_GET, 'post' ) ) { - $post_id = (int) WPSEO_Utils::validate_int( $post ); - - return get_post( $post_id ); - } - - - if ( isset( $GLOBALS['post'] ) ) { - return $GLOBALS['post']; - } - - return array(); - } - - - - /** - * Returns an array with shortcode tags for all registered shortcodes. - * - * @return array - */ - private function get_valid_shortcode_tags() { - $shortcode_tags = array(); - - foreach ( $GLOBALS['shortcode_tags'] as $tag => $description ) { - array_push( $shortcode_tags, $tag ); - } - - return $shortcode_tags; - } - - /** - * Prepares the replace vars for localization. - * - * @return array replace vars - */ - private function get_replace_vars() { - $post = $this->get_metabox_post(); - - $cached_replacement_vars = array(); - - $vars_to_cache = array( - 'date', - 'id', - 'sitename', - 'sitedesc', - 'sep', - 'page', - 'currenttime', - 'currentdate', - 'currentday', - 'currentmonth', - 'currentyear', - ); - - foreach ( $vars_to_cache as $var ) { - $cached_replacement_vars[ $var ] = wpseo_replace_vars( '%%' . $var . '%%', $post ); - } - - // Merge custom replace variables with the WordPress ones. - return array_merge( $cached_replacement_vars, $this->get_custom_replace_vars( $post ) ); - } - - /** - * Gets the custom replace variables for custom taxonomies and fields. - * - * @param WP_Post $post The post to check for custom taxonomies and fields. - * - * @return array Array containing all the replacement variables. - */ - private function get_custom_replace_vars( $post ) { - return array( - 'custom_fields' => $this->get_custom_fields_replace_vars( $post ), - 'custom_taxonomies' => $this->get_custom_taxonomies_replace_vars( $post ), - ); - } - - /** - * Gets the custom replace variables for custom taxonomies. - * - * @param WP_Post $post The post to check for custom taxonomies. - * - * @return array Array containing all the replacement variables. - */ - private function get_custom_taxonomies_replace_vars( $post ) { - $taxonomies = get_object_taxonomies( $post, 'objects' ); - $custom_replace_vars = array(); - - foreach ( $taxonomies as $taxonomy_name => $taxonomy ) { - - if ( is_string( $taxonomy ) ) { // If attachment, see https://core.trac.wordpress.org/ticket/37368 . - $taxonomy_name = $taxonomy; - $taxonomy = get_taxonomy( $taxonomy_name ); - } - - if ( $taxonomy->_builtin && $taxonomy->public ) { - continue; - } - - $custom_replace_vars[ $taxonomy_name ] = array( - 'name' => $taxonomy->name, - 'description' => $taxonomy->description, - ); - } - - return $custom_replace_vars; - } - - /** - * Gets the custom replace variables for custom fields. - * - * @param WP_Post $post The post to check for custom fields. - * - * @return array Array containing all the replacement variables. - */ - private function get_custom_fields_replace_vars( $post ) { - $custom_replace_vars = array(); - - // If no post object is passed, return the empty custom_replace_vars array. - if ( ! is_object( $post ) ) { - return $custom_replace_vars; - } - - $custom_fields = get_post_custom( $post->ID ); - - foreach ( $custom_fields as $custom_field_name => $custom_field ) { - if ( substr( $custom_field_name, 0, 1 ) === '_' ) { - continue; - } - - $custom_replace_vars[ $custom_field_name ] = $custom_field[0]; - } - - return $custom_replace_vars; - } - - - /** - * Return the SVG for the traffic light in the metabox. - */ - public function traffic_light_svg() { - return << - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -SVG; - - } - - /** - * Generic tab. - */ - public function template_generic_tab() { - // This template belongs to the post scraper so don't echo it if it isn't enqueued. - if ( ! wp_script_is( WPSEO_Admin_Asset_Manager::PREFIX . 'post-scraper' ) ) { - return; - } - - echo ''; - } - - /** - * Keyword tab for enabling analysis of multiple keywords. - */ - public function template_keyword_tab() { - // This template belongs to the post scraper so don't echo it if it isn't enqueued. - if ( ! wp_script_is( WPSEO_Admin_Asset_Manager::PREFIX . 'post-scraper' ) ) { - return; - } - - echo ''; - } - - /** - * @param string $page The page to check for the post overview page. - * - * @return bool Whether or not the given page is the post overview page. - */ - public static function is_post_overview( $page ) { - return 'edit.php' === $page; - } - - /** - * @param string $page The page to check for the post edit page. - * - * @return bool Whether or not the given page is the post edit page. - */ - public static function is_post_edit( $page ) { - return 'post.php' === $page - || 'post-new.php' === $page; - } - - /********************** DEPRECATED METHODS **********************/ - - // @codeCoverageIgnoreStart - /** - * Adds the Yoast SEO box - * - * @deprecated 1.4.24 - * @deprecated use WPSEO_Metabox::add_meta_box() - * @see WPSEO_Meta::add_meta_box() - */ - public function add_custom_box() { - _deprecated_function( __METHOD__, 'WPSEO 1.4.24', 'WPSEO_Metabox::add_meta_box()' ); - $this->add_meta_box(); - } - - /** - * Retrieve the meta boxes for the given post type. - * - * @deprecated 1.5.0 - * @deprecated use WPSEO_Meta::get_meta_field_defs() - * @see WPSEO_Meta::get_meta_field_defs() - * - * @param string $post_type The post type for which to get the meta fields. - * - * @return array - */ - public function get_meta_boxes( $post_type = 'post' ) { - _deprecated_function( __METHOD__, 'WPSEO 1.5.0', 'WPSEO_Meta::get_meta_field_defs()' ); - - return $this->get_meta_field_defs( 'general', $post_type ); - } - - /** - * Pass some variables to js - * - * @deprecated 1.5.0 - * @deprecated use WPSEO_Meta::localize_script() - * @see WPSEO_Meta::localize_script() - */ - public function script() { - _deprecated_function( __METHOD__, 'WPSEO 1.5.0', 'WPSEO_Meta::localize_script()' ); - - return $this->localize_script(); - } - - /** - * @deprecated 3.0 Removed, use javascript functions instead - * - * @param string $string Deprecated. - * - * @return string - */ - public function strtolower_utf8( $string ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0', __( 'Use javascript instead.', 'wordpress-seo' ) ); - - return $string; - } - - /** - * @deprecated 3.0 Removed. - * - * @return array - */ - public function localize_script() { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - return array(); - } - - /** - * @deprecated 3.0 Removed, use javascript functions instead. - * - * @return string - */ - public function snippet() { - _deprecated_function( __METHOD__, 'WPSEO 3.0', __( 'Use javascript instead.', 'wordpress-seo' ) ); - - return ''; - } - - /** - * @deprecated 3.0 Use WPSEO_Meta_Columns::posts_filter_dropdown instead. - */ - public function posts_filter_dropdown() { - _deprecated_function( __METHOD__, 'WPSEO 3.0', 'WPSEO_Metabox_Columns::posts_filter_dropdown' ); - - /** @var WPSEO_Meta_Columns $meta_columns */ - $meta_columns = $GLOBALS['wpseo_meta_columns']; - $meta_columns->posts_filter_dropdown(); - } - - /** - * @deprecated 3.0 Use WPSEO_Meta_Columns::column_heading instead. - * - * @param array $columns Already existing columns. - * - * @return array - */ - public function column_heading( $columns ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0', 'WPSEO_Metabox_Columns::column_heading' ); - - /** @var WPSEO_Meta_Columns $meta_columns */ - $meta_columns = $GLOBALS['wpseo_meta_columns']; - return $meta_columns->column_heading( $columns ); - } - - /** - * @deprecated 3.0 Use WPSEO_Meta_Columns::column_content instead. - * - * @param string $column_name Column to display the content for. - * @param int $post_id Post to display the column content for. - */ - public function column_content( $column_name, $post_id ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0', 'WPSEO_Metabox_Columns::column_content' ); - - /** @var WPSEO_Meta_Columns $meta_columns */ - $meta_columns = $GLOBALS['wpseo_meta_columns']; - $meta_columns->column_content( $column_name, $post_id ); - } - - /** - * @deprecated 3.0 Use WPSEO_Meta_Columns::column_sort instead. - * - * @param array $columns appended with their orderby variable. - * - * @return array - */ - public function column_sort( $columns ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0', 'WPSEO_Metabox_Columns::column_sort' ); - - /** @var WPSEO_Meta_Columns $meta_columns */ - $meta_columns = $GLOBALS['wpseo_meta_columns']; - return $meta_columns->column_sort( $columns ); - } - - /** - * @deprecated 3.0 Use WPSEO_Meta_Columns::column_sort_orderby instead. - * - * @param array $vars Query variables. - * - * @return array - */ - public function column_sort_orderby( $vars ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0', 'WPSEO_Metabox_Columns::column_sort_orderby' ); - - /** @var WPSEO_Meta_Columns $meta_columns */ - $meta_columns = $GLOBALS['wpseo_meta_columns']; - return $meta_columns->column_sort_orderby( $vars ); - } - - /** - * @deprecated 3.0 Use WPSEO_Meta_Columns::column_hidden instead. - * - * @param array|false $result The hidden columns. - * @param string $option The option name used to set which columns should be hidden. - * @param WP_User $user The User. - * - * @return array|false $result - */ - public function column_hidden( $result, $option, $user ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0', 'WPSEO_Metabox_Columns::column_hidden' ); - - /** @var WPSEO_Meta_Columns $meta_columns */ - $meta_columns = $GLOBALS['wpseo_meta_columns']; - return $meta_columns->column_hidden( $result, $option, $user ); - } - - /** - * @deprecated 3.0 Use WPSEO_Meta_Columns::seo_score_posts_where instead. - * - * @param string $where Where clause. - * - * @return string - */ - public function seo_score_posts_where( $where ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0', 'WPSEO_Metabox_Columns::seo_score_posts_where' ); - - /** @var WPSEO_Meta_Columns $meta_columns */ - $meta_columns = $GLOBALS['wpseo_meta_columns']; - return $meta_columns->seo_score_posts_where( $where ); - } - - /** - * @deprecated 3.0 Removed. - * - * @param int $post_id Post to retrieve the title for. - * - * @return string - */ - public function page_title( $post_id ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - return ''; - } - - /** - * @deprecated 3.0 - * - * @param array $array Array to sort, array is returned sorted. - * @param string $key Key to sort array by. - */ - public function aasort( &$array, $key ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - } - - /** - * @deprecated 3.0 - * - * @param object $post Post to output the page analysis results for. - * - * @return string - */ - public function linkdex_output( $post ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - return ''; - - } - - /** - * @deprecated 3.0 - * - * @param object $post Post to calculate the results for. - * - * @return array|WP_Error - */ - public function calculate_results( $post ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - return array(); - - } - - /** - * @deprecated 3.0 - * - * @param WP_Post $post Post object instance. - * - * @return array - */ - public function get_sample_permalink( $post ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - return array(); - } - - /** - * @deprecated 3.0 - * - * @param array $results The results array used to store results. - * @param int $score_value The score value. - * @param string $score_message The score message. - * @param string $score_label The label of the score to use in the results array. - * @param string $raw_score The raw score, to be used by other filters. - */ - public function save_score_result( &$results, $score_value, $score_message, $score_label, $raw_score = null ) { - - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - } - - /** - * @deprecated 3.0 - * - * @param string $input_string String to clean up. - * @param bool $remove_optional_characters Whether or not to do a cleanup of optional chars too. - * - * @return string - */ - public function strip_separators_and_fold( $input_string, $remove_optional_characters ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - return ''; - } - - /** - * @deprecated 3.0 - * - * @param array $job Job data array. - * @param array $results Results set by reference. - */ - public function check_double_focus_keyword( $job, &$results ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - } - - /** - * @deprecated 3.0 - * - * @param string $keyword The keyword to check for stopwords. - * @param array $results The results array. - */ - public function score_keyword( $keyword, &$results ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - } - - /** - * @deprecated 3.0 - * - * @param array $job The job array holding both the keyword and the URLs. - * @param array $results The results array. - */ - public function score_url( $job, &$results ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - } - - /** - * @deprecated 3.0 - * - * @param array $job The job array holding both the keyword versions. - * @param array $results The results array. - */ - public function score_title( $job, &$results ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - } - - /** - * @deprecated 3.0 - * - * @param array $job The job array holding both the keyword versions. - * @param array $results The results array. - * @param array $anchor_texts The array holding all anchors in the document. - * @param array $count The number of anchors in the document, grouped by type. - */ - public function score_anchor_texts( $job, &$results, $anchor_texts, $count ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - } - - /** - * @deprecated 3.0 - * - * @param object $xpath An XPATH object of the current document. - * - * @return array - */ - public function get_anchor_texts( &$xpath ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - return array(); - } - - /** - * @deprecated 3.0 - * - * @param object $xpath An XPATH object of the current document. - * - * @return array - */ - public function get_anchor_count( &$xpath ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - return array(); - } - - /** - * @deprecated 3.0 - * - * @param array $job The job array holding both the keyword versions. - * @param array $results The results array. - * @param array $imgs The array with images alt texts. - */ - public function score_images_alt_text( $job, &$results, $imgs ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - } - - /** - * @deprecated 3.0 - * - * @param int $post_id The post to find images in. - * @param string $body The post content to find images in. - * @param array $imgs The array holding the image information. - * - * @return array The updated images array. - */ - public function get_images_alt_text( $post_id, $body, $imgs ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - return array(); - } - - /** - * @deprecated 3.0 - * - * @param array $job The array holding the keywords. - * @param array $results The results array. - * @param array $headings The headings found in the document. - */ - public function score_headings( $job, &$results, $headings ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - } - - /** - * @deprecated 3.0 - * - * @param string $postcontent Post content to find headings in. - * - * @return array Array of heading texts. - */ - public function get_headings( $postcontent ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - return array(); - } - - /** - * @deprecated 3.0 - * - * @param array $job The array holding the keywords. - * @param array $results The results array. - * @param string $description The meta description. - * @param int $maxlength The maximum length of the meta description. - */ - public function score_description( $job, &$results, $description, $maxlength = 155 ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - } - - /** - * @deprecated 3.0 - * - * @param array $job The array holding the keywords. - * @param array $results The results array. - * @param string $body The body. - * @param string $firstp The first paragraph. - */ - public function score_body( $job, &$results, $body, $firstp ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - } - - /** - * @deprecated 3.0 - * - * @param object $post The post object. - * - * @return string The post content. - */ - public function get_body( $post ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - return ''; - } - - /** - * @deprecated 3.0 - * - * @param string $body The post content to retrieve the first paragraph from. - * - * @return string - */ - public function get_first_paragraph( $body ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - return ''; - } - - /** - * @deprecated 3.2 - * - * Retrieves the title template. - * - * @param object $post metabox post. - * - * @return string - */ - public static function get_title_template( $post ) { - _deprecated_function( __METHOD__, 'WPSEO 3.2', 'WPSEO_Post_Scraper::get_title_template' ); - - return ''; - } - - /** - * @deprecated 3.2 - * - * Retrieves the metadesc template. - * - * @param object $post metabox post. - * - * @return string - */ - public static function get_metadesc_template( $post ) { - _deprecated_function( __METHOD__, 'WPSEO 3.2', 'WPSEO_Post_Scraper::get_metadesc_template' ); - return ''; - } - - /** - * @deprecated 3.2 - * Retrieve a post date when post is published, or return current date when it's not. - * - * @param WP_Post $post The post for which to retrieve the post date. - * - * @return string - */ - public function get_post_date( $post ) { - _deprecated_function( __METHOD__, 'WPSEO 3.2', 'WPSEO_Post_Scraper::get_post_date' ); - - return ''; - } - // @codeCoverageIgnoreEnd -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-analysis.php b/wp/wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-analysis.php deleted file mode 100644 index 10060787..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/metabox/interface-metabox-analysis.php +++ /dev/null @@ -1,31 +0,0 @@ -onpage_option = $this->get_option(); - } - - /** - * Getting the status from the option. - * - * @return string - */ - public function get_status() { - if ( array_key_exists( self::STATUS, $this->onpage_option ) ) { - return $this->onpage_option[ self::STATUS ]; - } - - return self::CANNOT_FETCH; - } - - /** - * Saving the status to the options. - * - * @param string $status The status to save. - */ - public function set_status( $status ) { - $this->onpage_option[ self::STATUS ] = $status; - } - - /** - * Saving the last fetch timestamp to the options. - * - * @param integer $timestamp Timestamp with the new value. - */ - public function set_last_fetch( $timestamp ) { - $this->onpage_option[ self::LAST_FETCH ] = $timestamp; - } - - /** - * Check if the last fetch is within the time of 60 minutes - * - * @return bool - */ - public function should_be_fetched() { - return ( ( time() - $this->onpage_option[ self::LAST_FETCH ] ) > self::FETCH_LIMIT ); - } - - /** - * Saving the option with the current data - */ - public function save_option() { - update_option( self::OPTION_NAME, $this->onpage_option ); - } - - /** - * Returns the value of the onpage_enabled status - * - * @return bool - */ - public function is_enabled() { - $options = get_option( 'wpseo' ); - - return ! empty( $options['onpage_indexability'] ); - } - - /** - * Getting the option with the OnPage.org data - * - * @return array - */ - private function get_option() { - return get_option( self::OPTION_NAME, array( self::STATUS => self::NOT_FETCHED, self::LAST_FETCH => 0 ) ); - } - - /** - * @deprecated 3.0.2 - * @codeCoverageIgnore - * - * Returns the indexable status of the website. - * - * @return bool - */ - public function is_indexable() { - _deprecated_function( __METHOD__, 'WPSEO 3.0.2' ); - - return self::IS_INDEXABLE === $this->get_status(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/onpage/class-onpage-request.php b/wp/wp-content/plugins/wordpress-seo/admin/onpage/class-onpage-request.php deleted file mode 100644 index 3e5c9919..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/onpage/class-onpage-request.php +++ /dev/null @@ -1,78 +0,0 @@ - $target_url, - 'wp_version' => $GLOBALS['wp_version'], - 'yseo_version' => WPSEO_VERSION, - ), $parameters ); - - $url = add_query_arg( $parameters, $this->onpage_endpoint ); - - $response = wp_remote_get( $url ); - $response_code = wp_remote_retrieve_response_code( $response ); - - // When the request is successful, the response code will be 200. - if ( $response_code === 200 ) { - $response_body = wp_remote_retrieve_body( $response ); - - return json_decode( $response_body, true ); - } - } - - /** - * Sending a request to OnPage to check if the $home_url is indexable - * - * @param string $target_url The URL that will be send to the API. - * @param array $parameters Array of extra parameters to send to OnPage. - * - * @return array - */ - public function do_request( $target_url, $parameters = array() ) { - $json_body = $this->get_remote( $target_url, $parameters ); - - // OnPage.org recognized a redirect, fetch the data of that URL by calling this method with the value from OnPage.org. - if ( ! empty( $json_body['passes_juice_to'] ) ) { - return $this->do_request( $json_body['passes_juice_to'], $parameters ); - } - - return $json_body; - } - - /** - * Returns the fetched response - * - * @deprecated 3.1.2 - * @codeCoverageIgnore - * - * @return array - */ - public function get_response() { - _deprecated_function( __METHOD__, 'WPSEO 3.1.2', 'WPSEO_OnPage_Request::do_request' ); - - return array(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/onpage/class-onpage.php b/wp/wp-content/plugins/wordpress-seo/admin/onpage/class-onpage.php deleted file mode 100644 index 964e9379..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/onpage/class-onpage.php +++ /dev/null @@ -1,230 +0,0 @@ -onpage_option = new WPSEO_OnPage_Option(); - - if ( $this->onpage_option->is_enabled() ) { - $this->set_hooks(); - $this->catch_redo_listener(); - } - } - } - - /** - * The hooks to run on plugin activation - */ - public function activate_hooks() { - $this->set_cron(); - } - - /** - * Adding a weekly schedule to the schedules array - * - * @param array $schedules Array with schedules. - * - * @return array - */ - public function add_weekly_schedule( array $schedules ) { - $schedules['weekly'] = array( 'interval' => WEEK_IN_SECONDS, 'display' => __( 'Once Weekly', 'wordpress-seo' ) ); - - return $schedules; - } - - /** - * Fetching the data from onpage. - * - * @return bool - */ - public function fetch_from_onpage() { - if ( $this->onpage_option->should_be_fetched() && false !== ( $new_status = $this->request_indexability() ) ) { - - // Updates the timestamp in the option. - $this->onpage_option->set_last_fetch( time() ); - - // The currently indexability status. - $old_status = $this->onpage_option->get_status(); - - // Saving the new status. - $this->onpage_option->set_status( $new_status ); - - // Saving the option. - $this->onpage_option->save_option(); - - // Check if the status has been changed. - if ( $old_status !== $new_status && $new_status !== WPSEO_OnPage_Option::CANNOT_FETCH ) { - $this->notify_admins(); - } - - return true; - } - - return false; - } - - /** - * Show a notice when the website is not indexable - */ - public function show_notice() { - - $notification = $this->get_indexability_notification(); - $notification_center = Yoast_Notification_Center::get(); - - if ( $this->should_show_notice() ) { - $notification_center->add_notification( $notification ); - } - else { - $notification_center->remove_notification( $notification ); - } - } - - /** - * Builds the indexability notification - * - * @return Yoast_Notification - */ - private function get_indexability_notification() { - $notice = sprintf( - /* translators: 1: opens a link to a related knowledge base article. 2: closes the link */ - __( '%1$sYour homepage cannot be indexed by search engines%2$s. This is very bad for SEO and should be fixed.', 'wordpress-seo' ), - '', - '' - ); - - return new Yoast_Notification( - $notice, - array( - 'type' => Yoast_Notification::ERROR, - 'id' => 'wpseo-dismiss-onpageorg', - 'capabilities' => 'manage_options', - ) - ); - } - - /** - * Send a request to OnPage.org to get the indexability - * - * @return int(0)|int(1)|false - */ - protected function request_indexability() { - $parameters = array(); - if ( $this->wordfence_protection_enabled() ) { - $parameters['wf_strict'] = 1; - } - - $request = new WPSEO_OnPage_Request(); - $response = $request->do_request( get_option( 'home' ), $parameters ); - - if ( isset( $response['is_indexable'] ) ) { - return (int) $response['is_indexable']; - } - - return WPSEO_OnPage_Option::CANNOT_FETCH; - } - - /** - * Should the notice being given? - * - * @return bool - */ - protected function should_show_notice() { - // If development mode is on or the blog is not public, just don't show this notice. - if ( WPSEO_Utils::is_development_mode() || ( '0' === get_option( 'blog_public' ) ) ) { - return false; - } - - return $this->onpage_option->get_status() === WPSEO_OnPage_Option::IS_NOT_INDEXABLE; - } - - /** - * Notify the admins - */ - protected function notify_admins() { - /* - * Let's start showing the notices to all admins by removing the hide-notice meta data for each admin resulting - * in popping up the notice again. - */ - delete_metadata( 'user', 0, WPSEO_OnPage::USER_META_KEY, '', true ); - } - - /** - * Setting up the hooks. - */ - private function set_hooks() { - // Schedule cronjob when it doesn't exists on activation. - register_activation_hook( WPSEO_FILE, array( $this, 'activate_hooks' ) ); - - // Add weekly schedule to the cron job schedules. - add_filter( 'cron_schedules', array( $this, 'add_weekly_schedule' ) ); - - // Adding admin notice if necessary. - add_filter( 'admin_init', array( $this, 'show_notice' ) ); - - // Setting the action for the OnPage fetch. - add_action( 'wpseo_onpage_fetch', array( $this, 'fetch_from_onpage' ) ); - } - - /** - * Setting the cronjob to get the new indexibility status. - */ - private function set_cron() { - if ( ! wp_next_scheduled( 'wpseo_onpage_fetch' ) ) { - wp_schedule_event( time(), 'weekly', 'wpseo_onpage_fetch' ); - } - } - - /** - * Redo the fetch request for onpage - */ - private function catch_redo_listener() { - if ( filter_input( INPUT_GET, 'wpseo-redo-onpage' ) === '1' ) { - $this->is_manual_request = true; - - add_action( 'admin_init', array( $this, 'fetch_from_onpage' ) ); - } - } - - /** - * Checks if WordFence protects the site against 'fake' Google crawlers. - * - * @return boolean - */ - private function wordfence_protection_enabled() { - if ( ! class_exists( 'wfConfig' ) ) { - return false; - } - - if ( ! method_exists( 'wfConfig', 'get' ) ) { - return false; - } - - return (bool) wfConfig::get( 'blockFakeBots' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/pages/advanced.php b/wp/wp-content/plugins/wordpress-seo/admin/pages/advanced.php deleted file mode 100644 index 26898e08..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/pages/advanced.php +++ /dev/null @@ -1,61 +0,0 @@ -add_tab( - new WPSEO_Option_Tab( - 'breadcrumbs', - __( 'Breadcrumbs', 'wordpress-seo' ), - array( - 'video_url' => 'https://yoa.st/screencast-breadcrumbs', - 'opt_group' => 'wpseo_internallinks', - ) - ) -); -$tabs->add_tab( - new WPSEO_Option_Tab( - 'permalinks', - __( 'Permalinks', 'wordpress-seo' ), - array( - 'video_url' => 'https://yoa.st/screencast-permalinks', - 'opt_group' => 'wpseo_permalinks', - ) - ) -); -$tabs->add_tab( - new WPSEO_Option_Tab( - 'rss', - __( 'RSS', 'wordpress-seo' ), - array( - 'video_url' => 'https://yoa.st/screencast-rss', - 'opt_group' => 'wpseo_rss', - ) - ) -); - -$active_tab = $tabs->get_active_tab(); -Yoast_Form::get_instance()->admin_header( true, $active_tab->get_opt_group() ); - -echo ''; - -$help_center = new WPSEO_Help_Center( 'advanced', $active_tab ); -$help_center->output_help_center(); - -require_once WPSEO_PATH . 'admin/views/tabs/advanced/' . $active_tab->get_name() . '.php'; - -Yoast_Form::get_instance()->admin_footer(); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/pages/dashboard.php b/wp/wp-content/plugins/wordpress-seo/admin/pages/dashboard.php deleted file mode 100644 index 89213c3f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/pages/dashboard.php +++ /dev/null @@ -1,72 +0,0 @@ -admin_header( true, 'wpseo' ); - -do_action( 'wpseo_all_admin_notices' ); - -if ( is_array( $options['blocking_files'] ) && count( $options['blocking_files'] ) > 0 ) { - - $xml_sitemap_options = WPSEO_Options::get_option( 'wpseo_xml' ); - if ( $xml_sitemap_options['enablexmlsitemap'] ) { - - echo '

    '; - printf( - /* translators: %1$s expands to Yoast SEO */ - _n( 'The following file is blocking your XML sitemaps from working properly. Either delete it (this can be done with the "Fix it" button) or disable %1$s XML sitemaps.', 'The following files are blocking your XML sitemaps from working properly. Either delete them (this can be done with the "Fix it" button) or disable %1$s XML sitemaps.', count( $options['blocking_files'] ), 'wordpress-seo' ), - 'Yoast SEO' - ); - foreach ( $options['blocking_files'] as $file ) { - echo '
    ', '', esc_html( $file ), ''; - } - unset( $file ); - echo '
    '; - echo '

    '; - } -} - -$tabs = new WPSEO_Option_Tabs( 'dashboard' ); -$tabs->add_tab( new WPSEO_Option_Tab( 'dashboard', __( 'Dashboard', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-notification-center' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'general', __( 'General', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-general' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'features', __( 'Features', 'wordpress-seo' ) ) ); -$knowledge_graph_label = ( 'company' === $options['company_or_person'] ) ? __( 'Company info', 'wordpress-seo' ) : __( 'Your info', 'wordpress-seo' ); -$tabs->add_tab( new WPSEO_Option_Tab( 'knowledge-graph', $knowledge_graph_label, array( 'video_url' => 'https://yoa.st/screencast-knowledge-graph' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'webmaster-tools', __( 'Webmaster tools', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-general-search-console' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'security', __( 'Security', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-security' ) ) ); - -do_action( 'wpseo_settings_tabs_dashboard', $tabs ); - -$tabs->display( $yform, $options ); - -do_action( 'wpseo_dashboard' ); - -$yform->admin_footer(); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/pages/licenses.php b/wp/wp-content/plugins/wordpress-seo/admin/pages/licenses.php deleted file mode 100644 index cece9306..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/pages/licenses.php +++ /dev/null @@ -1,241 +0,0 @@ - (object) array( - 'url' => WPSEO_Shortlinker::get( 'https://yoa.st/pe-premium-page' ), - 'title' => 'Yoast SEO Premium', - /* translators: %1$s expands to Yoast SEO */ - 'desc' => sprintf( __( 'The premium version of %1$s with more features & support.', 'wordpress-seo' ), 'Yoast SEO' ), - 'installed' => false, - 'image' => plugins_url( 'images/extensions-premium-ribbon.png', WPSEO_FILE ), - 'benefits' => array(), - ), - 'video-seo' => (object) array( - 'buyUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zx/' ), - 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zw/' ), - 'title' => 'Video SEO', - 'desc' => __( 'Optimize your videos to show them off in search results and get more clicks!', 'wordpress-seo' ), - 'installed' => false, - 'image' => plugins_url( 'images/extensions-video.png', WPSEO_FILE ), - 'benefits' => array( - __( 'Show your videos in Google Videos', 'wordpress-seo' ), - __( 'Enhance the experience of sharing posts with videos', 'wordpress-seo' ), - __( 'Make videos responsive through enabling fitvids.js', 'wordpress-seo' ), - ), - ), - 'news-seo' => (object) array( - 'buyUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zv/' ), - 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zu/' ), - 'title' => 'News SEO', - 'desc' => __( 'Are you in Google News? Increase your traffic from Google News by optimizing for it!', 'wordpress-seo' ), - 'installed' => false, - 'image' => plugins_url( 'images/extensions-news.png', WPSEO_FILE ), - 'benefits' => array( - __( 'Optimize your site for Google News', 'wordpress-seo' ), - __( 'Immediately pings Google on the publication of a new post', 'wordpress-seo' ), - __( 'Creates XML News Sitemaps', 'wordpress-seo' ), - ), - ), - 'local-seo' => (object) array( - 'buyUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zt' ), - 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zs' ), - 'title' => 'Local SEO', - 'desc' => __( 'Rank better locally and in Google Maps, without breaking a sweat!', 'wordpress-seo' ), - 'installed' => false, - 'image' => plugins_url( 'images/extensions-local.png', WPSEO_FILE ), - 'benefits' => array( - __( 'Get found by potential clients', 'wordpress-seo' ), - __( 'Easily insert Google Maps, a store locator, opening hours and more', 'wordpress-seo' ), - __( 'Improve the usability of your contact page', 'wordpress-seo' ), - ), - ), - 'woocommerce-seo' => (object) array( - 'buyUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zr' ), - 'infoUrl' => WPSEO_Shortlinker::get( 'https://yoa.st/zq' ), - 'title' => 'Yoast WooCommerce SEO', - /* translators: %1$s expands to Yoast SEO */ - 'desc' => sprintf( __( 'Seamlessly integrate WooCommerce with %1$s and get extra features!', 'wordpress-seo' ), 'Yoast SEO' ), - 'installed' => false, - 'image' => plugins_url( 'images/extensions-woo.png', WPSEO_FILE ), - 'benefits' => array( - sprintf( __( 'Improve sharing on Pinterest', 'wordpress-seo' ) ), - - /* translators: %1$s expands to Yoast, %2$s expands to WooCommerce */ - sprintf( __( 'Use %1$s breadcrumbs instead of %2$s ones', 'wordpress-seo' ), 'Yoast', 'WooCommerce' ), - - /* translators: %1$s expands to Yoast SEO, %2$s expands to WooCommerce */ - sprintf( __( 'A seamless integration between %1$s and %2$s', 'wordpress-seo' ), 'Yoast SEO', 'WooCommerce' ), - ), - 'buy_button' => 'WooCommerce SEO', - ), -); - -if ( class_exists( 'WPSEO_Premium' ) ) { - $extensions['seo-premium']->installed = true; -} -if ( class_exists( 'wpseo_Video_Sitemap' ) ) { - $extensions['video-seo']->installed = true; -} -if ( class_exists( 'WPSEO_News' ) ) { - $extensions['news-seo']->installed = true; -} -if ( defined( 'WPSEO_LOCAL_VERSION' ) ) { - $extensions['local-seo']->installed = true; -} -if ( ! class_exists( 'Woocommerce' ) ) { - unset( $extensions['woocommerce-seo'] ); -} -elseif ( class_exists( 'Yoast_WooCommerce_SEO' ) ) { - $extensions['woocommerce-seo']->installed = true; -} - -?> - -
    - -

    - - - -
    -
    -
    - url; - ?> -

    ' . $extension->title . '' ); - ?>

    - -
      -
    • - - -
    • -
    • - - -
    • -
    • - - -
    • -
    • - - -
    • -
    - - installed ) : ?> -
    - - title ); - ?> - - - ', - '', - $extension->title - ); - ?> - -

    -
    - - - -
    -

    ' . $yoast_seo_extensions . ''; - - /* translators: %1$s expands to Yoast SEO extensions */ - printf( __( '%1$s to optimize your site even further', 'wordpress-seo' ), $yoast_seo_extensions ); - ?>

    - - - - $extension ) : ?> - buyUrl; - $info_url = $extension->infoUrl; ?> - - -
    - -

    title ); ?>

    - -
      - benefits as $benefit ) : ?> -
    • - -
    - - - installed ) : ?> -
    - - - buy_button ) ? $extension->buy_button : $extension->title; ?> - - - - - - ', - '', - $extension->title - ); - ?> -
    - -
    -
    - -
    -

    ', __( 'This is where you would enter the license keys for one of our premium plugins, should you activate one.', 'wordpress-seo' ), '

    '; - } - else { - do_action( 'wpseo_licenses_forms' ); - } - ?> -
    -
    - - diff --git a/wp/wp-content/plugins/wordpress-seo/admin/pages/metas.php b/wp/wp-content/plugins/wordpress-seo/admin/pages/metas.php deleted file mode 100644 index 09d73cd5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/pages/metas.php +++ /dev/null @@ -1,68 +0,0 @@ -admin_header( true, 'wpseo_titles' ); - -$tabs = new WPSEO_Option_Tabs( 'metas' ); -$tabs->add_tab( new WPSEO_Option_Tab( 'general', __( 'General', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-metas' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'home', __( 'Homepage', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-metas-homepage' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'post-types', __( 'Post Types', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-metas-post-types' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'taxonomies', __( 'Taxonomies', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-metas-taxonomies' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'archives', __( 'Archives', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-metas-archives' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'other', __( 'Other', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-metas-other' ) ) ); -$tabs->display( $yform, $options ); - -$yform->admin_footer(); - -/** - * Add help tabs - * - * @param array $tabs Current help center tabs. - * - * @return array - */ -function yoast_add_meta_options_help_center_tabs( $tabs ) { - $tabs[] = new WPSEO_Help_Center_Item( - 'basic-help', - __( 'Template explanation', 'wordpress-seo' ), - array( - 'content' => "\n\t\t

    " . __( 'Template explanation', 'wordpress-seo' ) . "

    \n\t\t" . '

    ' . - sprintf( - /* translators: %1$s expands to Yoast SEO. */ - __( 'The title & metas settings for %1$s are made up of variables that are replaced by specific values from the page when the page is displayed. The tabs on the left explain the available variables.', 'wordpress-seo' ), - 'Yoast SEO' ) . - '

    ' . __( 'Note that not all variables can be used in every template.', 'wordpress-seo' ) . '

    ', - ) - ); - - $tabs[] = new WPSEO_Help_Center_Item( - 'title-vars', - __( 'Basic Variables', 'wordpress-seo' ), - array( - 'content' => '

    ' . __( 'Basic Variables', 'wordpress-seo' ) . '

    ' . WPSEO_Replace_Vars::get_basic_help_texts(), - ) - ); - - $tabs[] = new WPSEO_Help_Center_Item( - 'title-vars-advanced', - __( 'Advanced Variables', 'wordpress-seo' ), - array( - 'content' => '

    ' . __( 'Advanced Variables', 'wordpress-seo' ) . '

    ' . WPSEO_Replace_Vars::get_advanced_help_texts(), - ) - ); - - return $tabs; -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/pages/network.php b/wp/wp-content/plugins/wordpress-seo/admin/pages/network.php deleted file mode 100644 index bee1acc0..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/pages/network.php +++ /dev/null @@ -1,150 +0,0 @@ -blogname ) ), 'updated' ); - } - else { - add_settings_error( 'wpseo_ms', 'settings_updated', sprintf( __( 'Blog %s not found.', 'wordpress-seo' ), esc_html( $restoreblog ) ), 'error' ); - } - unset( $restoreblog, $blog ); - } -} - -/* Set up selectbox dropdowns for smaller networks (usability) */ -$use_dropdown = true; -if ( get_blog_count() > 100 ) { - $use_dropdown = false; -} -else { - - if ( function_exists( 'get_sites' ) ) { // WP 4.6+. - $sites = array_map( 'get_object_vars', get_sites( array( 'deleted' => 0 ) ) ); - } - else { - $sites = wp_get_sites( array( 'deleted' => 0 ) ); - } - - if ( is_array( $sites ) && $sites !== array() ) { - $dropdown_input = array( - '-' => __( 'None', 'wordpress-seo' ), - ); - - foreach ( $sites as $site ) { - $dropdown_input[ $site['blog_id'] ] = $site['blog_id'] . ': ' . $site['domain']; - - $blog_states = array(); - if ( $site['public'] === '1' ) { - $blog_states[] = __( 'public', 'wordpress-seo' ); - } - if ( $site['archived'] === '1' ) { - $blog_states[] = __( 'archived', 'wordpress-seo' ); - } - if ( $site['mature'] === '1' ) { - $blog_states[] = __( 'mature', 'wordpress-seo' ); - } - if ( $site['spam'] === '1' ) { - $blog_states[] = __( 'spam', 'wordpress-seo' ); - } - if ( $blog_states !== array() ) { - $dropdown_input[ $site['blog_id'] ] .= ' [' . implode( ', ', $blog_states ) . ']'; - } - } - unset( $site, $blog_states ); - } - else { - $use_dropdown = false; - } - unset( $sites ); -} - -$yform->admin_header( false, 'wpseo_ms' ); - -echo '

    ', __( 'MultiSite Settings', 'wordpress-seo' ), '

    '; -echo '
    '; -wp_nonce_field( 'wpseo-network-settings', '_wpnonce', true, true ); - -/* @internal Important: Make sure the options added to the array here are in line with the options set in the WPSEO_Option_MS::$allowed_access_options property */ -$yform->select( - 'access', - /* translators: %1$s expands to Yoast SEO */ - sprintf( __( 'Who should have access to the %1$s settings', 'wordpress-seo' ), 'Yoast SEO' ), - array( - 'admin' => __( 'Site Admins (default)', 'wordpress-seo' ), - 'superadmin' => __( 'Super Admins only', 'wordpress-seo' ), - ), - 'wpseo_ms' -); - -if ( $use_dropdown === true ) { - $yform->select( - 'defaultblog', - __( 'New sites in the network inherit their SEO settings from this site', 'wordpress-seo' ), - $dropdown_input, - 'wpseo_ms' - ); - echo '

    ' . __( 'Choose the site whose settings you want to use as default for all sites that are added to your network. If you choose \'None\', the normal plugin defaults will be used.', 'wordpress-seo' ) . '

    '; -} -else { - $yform->textinput( 'defaultblog', __( 'New sites in the network inherit their SEO settings from this site', 'wordpress-seo' ), 'wpseo_ms' ); - /* translators: 1: link open tag; 2: link close tag. */ - echo '

    ' . sprintf( __( 'Enter the %1$sSite ID%2$s for the site whose settings you want to use as default for all sites that are added to your network. Leave empty for none (i.e. the normal plugin defaults will be used).', 'wordpress-seo' ), '', '' ) . '

    '; -} - echo '

    ' . __( 'Take note:', 'wordpress-seo' ) . ' ' . __( 'Privacy sensitive (FB admins and such), theme specific (title rewrite) and a few very site specific settings will not be imported to new blogs.', 'wordpress-seo' ) . '

    '; - - -echo ''; -echo '
    '; - -echo '

    ' . __( 'Restore site to default settings', 'wordpress-seo' ) . '

    '; -echo '
    '; -wp_nonce_field( 'wpseo-network-restore', '_wpnonce', true, true ); -echo '

    ' . __( 'Using this form you can reset a site to the default SEO settings.', 'wordpress-seo' ) . '

    '; - -if ( $use_dropdown === true ) { - unset( $dropdown_input['-'] ); - $yform->select( - 'restoreblog', - __( 'Site ID', 'wordpress-seo' ), - $dropdown_input, - 'wpseo_ms' - ); -} -else { - $yform->textinput( 'restoreblog', __( 'Blog ID', 'wordpress-seo' ), 'wpseo_ms' ); -} - -echo ''; -echo '
    '; - -$yform->admin_footer( false ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/pages/social.php b/wp/wp-content/plugins/wordpress-seo/admin/pages/social.php deleted file mode 100644 index 0890d459..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/pages/social.php +++ /dev/null @@ -1,23 +0,0 @@ -admin_header( true, 'wpseo_social' ); - -$tabs = new WPSEO_Option_Tabs( 'social' ); -$tabs->add_tab( new WPSEO_Option_Tab( 'accounts', __( 'Accounts', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-social-accounts' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'facebook', __( 'Facebook', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-social-facebook' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'twitterbox', __( 'Twitter', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-social-twitter' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'pinterest', __( 'Pinterest', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-social-pinterest' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'google', __( 'Google+', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-social-google' ) ) ); -$tabs->display( $yform ); - -$yform->admin_footer(); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/pages/tools.php b/wp/wp-content/plugins/wordpress-seo/admin/pages/tools.php deleted file mode 100644 index dd71799f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/pages/tools.php +++ /dev/null @@ -1,88 +0,0 @@ -admin_header( false ); - -if ( '' === $tool_page ) { - - $tools = array( - 'bulk-editor' => array( - 'title' => __( 'Bulk editor', 'wordpress-seo' ), - 'desc' => __( 'This tool allows you to quickly change titles and descriptions of your posts and pages without having to go into the editor for each page.', 'wordpress-seo' ), - ), - 'import-export' => array( - 'title' => __( 'Import and Export', 'wordpress-seo' ), - 'desc' => __( 'Import settings from other SEO plugins and export your settings for re-use on (another) blog.', 'wordpress-seo' ), - ), - ); - if ( WPSEO_Utils::allow_system_file_edit() === true && ! is_multisite() ) { - $tools['file-editor'] = array( - 'title' => __( 'File editor', 'wordpress-seo' ), - 'desc' => __( 'This tool allows you to quickly change important files for your SEO, like your robots.txt and, if you have one, your .htaccess file.', 'wordpress-seo' ), - ); - } - - /* - Temporary disabled. See: https://github.com/Yoast/wordpress-seo/issues/4532 - - $tools['recalculate'] = array( - 'href' => '#TB_inline?width=300&height=150&inlineId=wpseo_recalculate', - 'attr' => "id='wpseo_recalculate_link' class='thickbox'", - 'title' => __( 'Recalculate SEO scores', 'wordpress-seo' ), - 'desc' => __( 'Recalculate SEO scores for all pieces of content with a focus keyword.', 'wordpress-seo' ), - ); - - if ( filter_input( INPUT_GET, 'recalculate' ) === '1' ) { - $tools['recalculate']['attr'] .= "data-open='open'"; - } - */ - - /* translators: %1$s expands to Yoast SEO */ - echo '

    ', sprintf( __( '%1$s comes with some very powerful built-in tools:', 'wordpress-seo' ), 'Yoast SEO' ), '

    '; - - asort( $tools ); - - echo '
      '; - - $admin_url = admin_url( 'admin.php?page=wpseo_tools' ); - - foreach ( $tools as $slug => $tool ) { - $href = ( ! empty( $tool['href'] ) ) ? $admin_url . $tool['href'] : add_query_arg( array( 'tool' => $slug ) , $admin_url ); - $attr = ( ! empty( $tool['attr'] ) ) ? $tool['attr'] : ''; - - echo '
    • '; - echo '', esc_html( $tool['title'] ), '
      '; - echo $tool['desc']; - echo '
    • '; - } - echo '
    '; - - echo ''; - -} -else { - echo '', __( '« Back to Tools page', 'wordpress-seo' ), ''; - - $tool_pages = array( 'bulk-editor', 'import-export' ); - - if ( WPSEO_Utils::allow_system_file_edit() === true && ! is_multisite() ) { - $tool_pages[] = 'file-editor'; - } - - if ( in_array( $tool_page, $tool_pages ) ) { - require_once WPSEO_PATH . 'admin/views/tool-' . $tool_page . '.php'; - } -} - -$yform->admin_footer( false ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/pages/xml-sitemaps.php b/wp/wp-content/plugins/wordpress-seo/admin/pages/xml-sitemaps.php deleted file mode 100644 index 192f8e50..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/pages/xml-sitemaps.php +++ /dev/null @@ -1,52 +0,0 @@ - whomever] check for other sitemap plugins which may conflict ? - * @todo - [JRF => whomever] check for existance of .xls rewrite rule in .htaccess from - * google-sitemaps-plugin/generator and remove as it will cause errors for our sitemaps - * (or inform the user and disallow enabling of sitemaps ) - * @todo - [JRF => whomever] check if anything along these lines is already being done - */ - - -if ( ! defined( 'WPSEO_VERSION' ) ) { - header( 'Status: 403 Forbidden' ); - header( 'HTTP/1.1 403 Forbidden' ); - exit(); -} - -$yform = Yoast_Form::get_instance(); -$yform->admin_header( true, 'wpseo_xml' ); - -$options = get_option( 'wpseo_xml' ); - -echo '
    '; -$yform->light_switch( 'enablexmlsitemap', __( 'XML sitemap functionality', 'wordpress-seo' ) ); - -$tabs = new WPSEO_Option_Tabs( 'sitemaps' ); -$tabs->add_tab( new WPSEO_Option_Tab( 'general', __( 'General', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-sitemaps' ) ) ); - -$title_options = WPSEO_Options::get_option( 'wpseo_titles' ); - -if ( empty( $title_options['disable-author'] ) ) { - $tabs->add_tab( new WPSEO_Option_Tab( 'user-sitemap', __( 'User sitemap', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-sitemaps-user-sitemap' ) ) ); -} - -$tabs->add_tab( new WPSEO_Option_Tab( 'post-types', __( 'Post Types', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-sitemaps-post-types' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'exclude-post', __( 'Excluded Posts', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-sitemaps-exclude-post' ) ) ); -$tabs->add_tab( new WPSEO_Option_Tab( 'taxonomies', __( 'Taxonomies', 'wordpress-seo' ), array( 'video_url' => 'https://yoa.st/screencast-sitemaps-taxonomies' ) ) ); - -echo '
    '; -$tabs->display( $yform, $options ); -echo '
    '; - - -/** - * Fires at the end of XML Sitemaps configuration form. - */ -do_action( 'wpseo_xmlsitemaps_config' ); - -$yform->admin_footer(); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/recalculate/class-recalculate-posts.php b/wp/wp-content/plugins/wordpress-seo/admin/recalculate/class-recalculate-posts.php deleted file mode 100644 index bf7b0727..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/recalculate/class-recalculate-posts.php +++ /dev/null @@ -1,149 +0,0 @@ -save_score( $score ); - } - } - - /** - * Save the score. - * - * @param array $score The score to save. - */ - protected function save_score( array $score ) { - WPSEO_Meta::set_value( 'linkdex', $score['score'], $score['item_id'] ); - } - - /** - * Get the posts from the database by doing a WP_Query. - * - * @param integer $paged The page. - * - * @return string - */ - protected function get_items( $paged ) { - $items_per_page = max( 1, $this->items_per_page ); - $post_query = new WP_Query( - array( - 'post_type' => 'any', - 'meta_key' => '_yoast_wpseo_focuskw', - 'posts_per_page' => $items_per_page, - 'paged' => $paged, - ) - ); - - return $post_query->get_posts(); - } - - /** - * Map the posts to a response array - * - * @param WP_Post $item The post for which to build the analyzer data. - * - * @return array - */ - protected function item_to_response( $item ) { - $focus_keyword = WPSEO_Meta::get_value( 'focuskw', $item->ID ); - - $content = $item->post_content; - - // Check if there's a featured image. - $content .= $this->add_featured_image( $item ); - - /** - * Filter the post content for use in the SEO score recalculation. - * - * @param string $content Content of the post. Modify to reflect front-end content. - * @param WP_Post $item The Post object the content comes from. - */ - $content = apply_filters( 'wpseo_post_content_for_recalculation', $content, $item ); - - // Apply shortcodes. - $content = do_shortcode( $content ); - - return array( - 'post_id' => $item->ID, - 'text' => $content, - 'keyword' => $focus_keyword, - 'url' => urldecode( $item->post_name ), - 'pageTitle' => apply_filters( 'wpseo_title', wpseo_replace_vars( $this->get_title( $item->ID, $item->post_type ), $item ) ), - 'meta' => apply_filters( 'wpseo_metadesc', wpseo_replace_vars( $this->get_meta_description( $item->ID, $item->post_type ), $item ) ), - 'keyword_usage' => array( - $focus_keyword => WPSEO_Meta::keyword_usage( $focus_keyword, $item->ID ), - ), - ); - } - - /** - * Get the title for given post - * - * @param integer $post_id The ID of the post for which to get the title. - * @param string $post_type The post type. - * - * @return mixed|string - */ - private function get_title( $post_id, $post_type ) { - $title = WPSEO_Meta::get_value( 'title', $post_id ); - if ( '' !== $title ) { - return $title; - } - - $default_from_options = $this->default_from_options( 'title-tax', $post_type ); - if ( false !== $default_from_options ) { - return str_replace( ' %%page%% ', ' ', $default_from_options ); - } - - return '%%title%%'; - } - - /** - * Get the meta description for given post - * - * @param integer $post_id The ID of the post for which to get the meta description. - * @param string $post_type The post type. - * - * @return bool|string - */ - private function get_meta_description( $post_id, $post_type ) { - $meta_description = WPSEO_Meta::get_value( 'metadesc', $post_id ); - if ( '' !== $meta_description ) { - return $meta_description; - } - - $default_from_options = $this->default_from_options( 'metadesc', $post_type ); - if ( false !== $default_from_options ) { - return $default_from_options; - } - - return ''; - } - - /** - * Retrieves the associated featured image if there is one present. - * - * @param WP_Post $item The post item to check for a featured image. - * - * @return string The image string. - */ - private function add_featured_image( $item ) { - if ( ! has_post_thumbnail( $item->ID ) ) { - return ''; - } - - return ' ' . get_the_post_thumbnail( $item->ID ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/recalculate/class-recalculate-terms.php b/wp/wp-content/plugins/wordpress-seo/admin/recalculate/class-recalculate-terms.php deleted file mode 100644 index 6f3111ef..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/recalculate/class-recalculate-terms.php +++ /dev/null @@ -1,149 +0,0 @@ -items_per_page ); - - return get_terms( - get_taxonomies(), - array( - 'hide_empty' => false, - 'number' => $items_per_page, - 'offset' => $items_per_page * abs( $paged - 1 ), - ) - ); - } - - /** - * Convert the given term into a analyzable object. - * - * @param mixed $item The term for which to build the analyzer data. - * - * @return array - */ - protected function item_to_response( $item ) { - $focus_keyword = $this->get_focus_keyword( $item ); - $title = str_replace( ' %%page%% ', ' ', $this->get_title( $item ) ); - $meta = $this->get_meta_description( $item ); - - $description = $item->description; - - /** - * Filter the term description for recalculation. - * - * @param string $description Content of the term. Modify to reflect front-end content. - * @oaram WP_Term $item The term the description comes from. - */ - $description = apply_filters( 'wpseo_term_description_for_recalculation', $description, $item ); - - return array( - 'term_id' => $item->term_id, - 'taxonomy' => $item->taxonomy, - 'text' => $description, - 'keyword' => $focus_keyword, - 'url' => urldecode( $item->slug ), - 'pageTitle' => apply_filters( 'wpseo_title', wpseo_replace_vars( $title, $item, array( 'page' ) ) ), - 'meta' => apply_filters( 'wpseo_metadesc', wpseo_replace_vars( $meta, $item ) ), - 'keyword_usage' => array( - $focus_keyword => WPSEO_Taxonomy_Meta::get_keyword_usage( $focus_keyword, $item->term_id, $item->taxonomy ), - ), - ); - } - - /** - * Gets the focus keyword for the term - * - * @param stdClass|WP_Term $term Term to determine the keyword for. - * - * @return bool|string - */ - private function get_focus_keyword( $term ) { - $focus_keyword = WPSEO_Taxonomy_Meta::get_term_meta( 'focuskw', $term->term_id, $term->taxonomy ); - if ( ! empty( $focus_keyword ) ) { - return $focus_keyword; - } - - return $term->name; - } - - /** - * Get the title for given term - * - * @param stdClass|WP_Term $term The term object. - * - * @return mixed|string - */ - private function get_title( $term ) { - $title = WPSEO_Taxonomy_Meta::get_term_meta( $term->term_id, $term->taxonomy, 'title' ); - if ( '' !== $title ) { - return $title; - } - - $default_from_options = $this->default_from_options( 'title-tax', $term->taxonomy ); - if ( false !== $default_from_options ) { - return $default_from_options; - } - - return '%%title%%'; - } - - /** - * Get the meta description for given post - * - * @param stdClass|WP_Term $term The term object. - * - * @return bool|string - */ - private function get_meta_description( $term ) { - $meta_description = WPSEO_Taxonomy_Meta::get_term_meta( $term->term_id, $term->taxonomy, 'desc' ); - if ( '' !== $meta_description ) { - return $meta_description; - } - - $default_from_options = $this->default_from_options( 'metadesc-tax', $term->taxonomy ); - if ( false !== $default_from_options ) { - return $default_from_options; - } - - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/recalculate/class-recalculate.php b/wp/wp-content/plugins/wordpress-seo/admin/recalculate/class-recalculate.php deleted file mode 100644 index 372d2c09..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/recalculate/class-recalculate.php +++ /dev/null @@ -1,107 +0,0 @@ -options = WPSEO_Options::get_all(); - - $items = $this->get_items( $paged ); - - $return['items'] = $this->parse_items( $items ); - $return['total_items'] = count( $items ); - - if ( $return['total_items'] >= $this->items_per_page ) { - $return['next_page'] = ( $paged + 1 ); - } - - return $return; - } - - /** - * Parse the posts|terms with the value we need - * - * @param array $items The items to parse. - * - * @return array - */ - protected function parse_items( array $items ) { - $return = array(); - foreach ( $items as $item ) { - $response = $this->item_to_response( $item ); - if ( ! empty( $response ) ) { - $return[] = $response; - } - } - - return $return; - } - - /** - * Get default from the options for given field - * - * @param string $field The field for which to get the default options. - * @param string $suffix The post type. - * - * @return bool|string - */ - protected function default_from_options( $field, $suffix ) { - $target_option_field = $field . '-' . $suffix; - if ( ! empty( $this->options[ $target_option_field ] ) ) { - return $this->options[ $target_option_field ]; - } - - return false; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-columns.php b/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-columns.php deleted file mode 100644 index 60540f6b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-columns.php +++ /dev/null @@ -1,249 +0,0 @@ -taxonomy = $this->get_taxonomy(); - - if ( ! empty( $this->taxonomy ) ) { - add_filter( 'manage_edit-' . $this->taxonomy . '_columns', array( $this, 'add_columns' ) ); - add_filter( 'manage_' . $this->taxonomy . '_custom_column', array( $this, 'parse_column' ), 10, 3 ); - } - - $this->analysis_seo = new WPSEO_Metabox_Analysis_SEO(); - $this->analysis_readability = new WPSEO_Metabox_Analysis_Readability(); - } - - /** - * Adds an SEO score column to the terms table, right after the description column. - * - * @param array $columns Current set columns. - * - * @return array - */ - public function add_columns( array $columns ) { - - if ( $this->is_metabox_hidden() === true ) { - return $columns; - } - - $new_columns = array(); - - foreach ( $columns as $column_name => $column_value ) { - $new_columns[ $column_name ] = $column_value; - - if ( $column_name === 'description' && $this->analysis_seo->is_enabled() ) { - $new_columns['wpseo_score'] = __( 'SEO', 'wordpress-seo' ); - } - - if ( $column_name === 'description' && $this->analysis_readability->is_enabled() ) { - $new_columns['wpseo_score_readability'] = __( 'Readability', 'wordpress-seo' ); - } - } - - return $new_columns; - } - - /** - * Parses the column. - * - * @param string $content The current content of the column. - * @param string $column_name The name of the column. - * @param integer $term_id ID of requested taxonomy. - * - * @return string - */ - public function parse_column( $content, $column_name, $term_id ) { - - switch ( $column_name ) { - case 'wpseo_score': - return $this->get_score_value( $term_id ); - - break; - - case 'wpseo_score_readability': - return $this->get_score_readability_value( $term_id ); - break; - } - - return $content; - } - - - /** - * Returns the posted/get taxonomy value if it is set. - * - * @return string|null - */ - private function get_taxonomy() { - if ( defined( 'DOING_AJAX' ) && DOING_AJAX === true ) { - return FILTER_INPUT( INPUT_POST, 'taxonomy' ); - } - - return FILTER_INPUT( INPUT_GET, 'taxonomy' ); - } - - /** - * Parses the value for the score column. - * - * @param integer $term_id ID of requested term. - * - * @return string - */ - private function get_score_value( $term_id ) { - $term = get_term( $term_id, $this->taxonomy ); - - // When the term isn't indexable. - if ( ! $this->is_indexable( $term ) ) { - return $this->create_score_icon( - new WPSEO_Rank( WPSEO_Rank::NO_INDEX ), - __( 'Term is set to noindex.', 'wordpress-seo' ) - ); - } - - // When there is a focus key word. - if ( $focus_keyword = $this->get_focus_keyword( $term ) ) { - $score = (int) WPSEO_Taxonomy_Meta::get_term_meta( $term_id, $this->taxonomy, 'linkdex' ); - $rank = WPSEO_Rank::from_numeric_score( $score ); - - return $this->create_score_icon( $rank, $rank->get_label() ); - } - - // Default icon. - return $this->create_score_icon( - new WPSEO_Rank( WPSEO_Rank::NO_FOCUS ), - __( 'Focus keyword not set.', 'wordpress-seo' ) - ); - } - - /** - * Parses the value for the readability score column. - * - * @param int $term_id ID of the requested term. - * - * @return string The HTML for the readability score indicator. - */ - private function get_score_readability_value( $term_id ) { - $score = (int) WPSEO_Taxonomy_Meta::get_term_meta( $term_id, $this->taxonomy, 'content_score' ); - $rank = WPSEO_Rank::from_numeric_score( $score ); - - return $this->create_score_icon( $rank ); - } - - /** - * Creates an icon by the given values. - * - * @param WPSEO_Rank $rank The ranking object. - * @param string $title Optional. The title to show. Defaults to the rank label. - * - * @return string The HTML for a score icon. - */ - private function create_score_icon( WPSEO_Rank $rank, $title = '' ) { - if ( empty( $title ) ) { - $title = $rank->get_label(); - } - - return '' . $title . ''; - } - - /** - * Check if the taxonomy is indexable. - * - * @param mixed $term The current term. - * - * @return bool - */ - private function is_indexable( $term ) { - static $options; - - // Saving the options once, because it's static. - if ( $options === null ) { - $options = WPSEO_Options::get_all(); - } - - // When the no_index value is not empty and not default, check if its value is index. - $no_index = WPSEO_Taxonomy_Meta::get_term_meta( $term->term_id, $this->taxonomy, 'noindex' ); - if ( ! empty( $no_index ) && $no_index !== 'default' ) { - return ( $no_index === 'index' ); - } - - // Check if the default for taxonomy is empty (this will be index). - $no_index_key = 'noindex-tax-' . $term->taxonomy; - if ( is_object( $term ) && ( isset( $options[ $no_index_key ] ) ) ) { - return ( empty( $options[ $no_index_key ] ) ); - } - - return true; - } - - /** - * Returns the focus keyword if this is set, otherwise it will give the term name. - * - * @param stdClass|WP_Term $term The current term. - * - * @return string - */ - private function get_focus_keyword( $term ) { - if ( $focus_keyword = WPSEO_Taxonomy_Meta::get_term_meta( 'focuskw', $term->term_id, $term->taxonomy ) ) { - return $focus_keyword; - } - - return $term->name; - } - - /** - * Checks if a taxonomy is being added via a POST method. If not, it defaults to a GET request. - * - * @return int - */ - private function get_taxonomy_input_type() { - - if ( ! empty( $_SERVER['REQUEST_METHOD'] ) && $_SERVER['REQUEST_METHOD'] === 'POST' ) { - return INPUT_POST; - } - - return INPUT_GET; - } - - /** - * Test whether the metabox should be hidden either by choice of the admin - * - * @since 3.1 - * - * @param string $taxonomy (optional) The post type to test, defaults to the current post post_type. - * - * @return bool Whether or not the meta box (and associated columns etc) should be hidden - */ - private function is_metabox_hidden( $taxonomy = null ) { - $get_taxonomy_type = filter_input( $this->get_taxonomy_input_type(), 'taxonomy' ); - - if ( ! isset( $taxonomy ) && $get_taxonomy_type ) { - $taxonomy = sanitize_text_field( $get_taxonomy_type ); - } - - if ( isset( $taxonomy ) ) { - // Don't make static as taxonomies may still be added during the run. - $custom_taxonomies = get_taxonomies( array( 'public' => true ), 'names' ); - $options = get_option( 'wpseo_titles' ); - - return ( ( isset( $options[ 'hideeditbox-tax-' . $taxonomy ] ) && $options[ 'hideeditbox-tax-' . $taxonomy ] === true ) || in_array( $taxonomy, $custom_taxonomies ) === false ); - } - - return false; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-content-fields.php b/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-content-fields.php deleted file mode 100644 index 267f4484..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-content-fields.php +++ /dev/null @@ -1,76 +0,0 @@ - $this->get_field_config( - __( 'Snippet editor', 'wordpress-seo' ), - '', - 'snippetpreview', - array( - 'help-button' => __( 'Show information about the snippet editor', 'wordpress-seo' ), - /* translators: 1: link open tag; 2: link close tag. */ - 'help' => sprintf( __( 'This is a rendering of what this post might look like in Google\'s search results. %1$sLearn more about the Snippet Preview%2$s.', 'wordpress-seo' ), '', '' ), - ) - ), - 'focuskw' => $this->get_field_config( - __( 'Focus keyword', 'wordpress-seo' ), - '', - 'focuskeyword', - array( - 'help-button' => __( 'Show information about the focus keyword', 'wordpress-seo' ), - /* translators: 1: link open tag; 2: link close tag. */ - 'help' => sprintf( __( 'Pick the main keyword or keyphrase that this post/page is about. %1$sLearn more about the Focus Keyword%2$s.', 'wordpress-seo' ), '', '' ), - ) - ), - 'analysis' => $this->get_field_config( - __( 'Analysis', 'wordpress-seo' ), - '', - 'pageanalysis', - array( - 'help-button' => __( 'Show information about the content analysis', 'wordpress-seo' ), - /* translators: 1: link open tag; 2: link close tag. */ - 'help' => sprintf( __( 'This is the content analysis, a collection of content checks that analyze the content of your page. %1$sLearn more about the Content Analysis Tool%2$s.', 'wordpress-seo' ), '', '' ), - ) - ), - 'title' => $this->get_field_config( - '', - '', - 'hidden', - '' - ), - 'desc' => $this->get_field_config( - '', - '', - 'hidden', - '' - ), - 'linkdex' => $this->get_field_config( - '', - '', - 'hidden', - '' - ), - 'content_score' => $this->get_field_config( - '', - '', - 'hidden', - '' - ), - ); - - return $this->filter_hidden_fields( $fields ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields-presenter.php b/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields-presenter.php deleted file mode 100644 index 0bff2413..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields-presenter.php +++ /dev/null @@ -1,228 +0,0 @@ -tax_meta = WPSEO_Taxonomy_Meta::get_term_meta( (int) $term->term_id, $term->taxonomy ); - } - - /** - * Displaying the form fields - * - * @param array $fields Array with the fields that will be displayed. - */ - public function html( array $fields ) { - $content = ''; - foreach ( $fields as $field_name => $field_configuration ) { - $content .= $this->form_row( 'wpseo_' . $field_name, $field_configuration ); - } - return $content; - } - - /** - * Create a row in the form table. - * - * @param string $field_name Variable the row controls. - * @param array $field_configuration Array with the field configuration. - */ - private function form_row( $field_name, array $field_configuration ) { - $esc_field_name = esc_attr( $field_name ); - - $options = (array) $field_configuration['options']; - - if ( ! empty( $field_configuration['description'] ) ) { - $options['description'] = $field_configuration['description']; - } - - $label = $this->get_label( $field_configuration['label'], $esc_field_name ); - $field = $this->get_field( $field_configuration['type'], $esc_field_name, $this->get_field_value( $field_name ), $options ); - $help_content = isset( $field_configuration['options']['help'] ) ? $field_configuration['options']['help'] : ''; - $help_button_text = isset( $field_configuration['options']['help-button'] ) ? $field_configuration['options']['help-button'] : ''; - $help = new WPSEO_Admin_Help_Panel( $field_name, $help_button_text, $help_content ); - - if ( in_array( $field_configuration['type'], array( 'focuskeyword', 'pageanalysis', 'snippetpreview' ) ) ) { - return $this->parse_section_row( $field, $field_configuration['type'], $help ); - } - - return $this->parse_row( $label, $help, $field ); - } - - /** - * Generates the html for the given field config. - * - * @param string $field_type The fieldtype, e.g: text, checkbox, etc. - * @param string $field_name The name of the field. - * @param string $field_value The value of the field. - * @param array $options Array with additional options. - * - * @return string - */ - private function get_field( $field_type, $field_name, $field_value, array $options ) { - - $class = $this->get_class( $options ); - $field = $description = $aria_describedby = ''; - - if ( ! empty( $options['description'] ) ) { - $aria_describedby = ' aria-describedby="' . $field_name . '-desc"'; - $description = '

    ' . $options['description'] . '

    '; - } - - switch ( $field_type ) { - case 'div' : - $field .= '
    '; - break; - - case 'snippetpreview': - $field .= '
    '; - break; - case 'pageanalysis' : - $field .= '
    '; - $field .= '
    '; - $field .= '

    ' . __( 'Analysis', 'wordpress-seo' ) . '

    '; - $field .= '
    '; - $field .= '
    '; - $field .= '
    '; - break; - case 'focuskeyword': - $field .= '
    '; - $field .= '
    '; - $field .= '

    ' . __( 'Focus keyword', 'wordpress-seo' ) . '

    '; - $field .= ''; - $field .= '
    '; - $field .= '
    '; - $field .= '
    '; - break; - case 'text' : - $field .= ''; - break; - case 'checkbox' : - $field .= ''; - break; - case 'textarea' : - $rows = 3; - if ( ! empty( $options['rows'] ) ) { - $rows = $options['rows']; - } - $field .= ''; - break; - case 'upload' : - $field .= ''; - $field .= ''; - break; - case 'select' : - if ( is_array( $options ) && $options !== array() ) { - $field .= ''; - } - break; - case 'hidden' : - $field .= ''; - break; - } - - return $field . $description; - } - - /** - * Getting the value for given field_name - * - * @param string $field_name The fieldname to get the value for. - * - * @return string - */ - private function get_field_value( $field_name ) { - if ( isset( $this->tax_meta[ $field_name ] ) && $this->tax_meta[ $field_name ] !== '' ) { - return $this->tax_meta[ $field_name ]; - } - - return ''; - } - - /** - * Getting the class attributes if $options contains a class key - * - * @param array $options The array with field options. - * - * @return string - */ - private function get_class( array $options ) { - if ( ! empty( $options['class'] ) ) { - return ' class="' . esc_attr( $options['class'] ) . '"'; - } - - return ''; - } - - /** - * Getting the label HTML - * - * @param string $label The label value. - * @param string $field_name The target field. - * - * @return string - */ - private function get_label( $label, $field_name ) { - if ( $label !== '' ) { - return ''; - } - - return ''; - } - - /** - * Returns the HTML for the row which contains label, help and the field. - * - * @param string $label The html for the label if there was a label set. - * @param WPSEO_Admin_Help_Panel $help The help panel to render in this row. - * @param string $field The html for the field. - * - * @return string - */ - private function parse_row( $label, WPSEO_Admin_Help_Panel $help, $field ) { - if ( $label !== '' || $help !== '' ) { - return $label . $help->get_button_html() . $help->get_panel_html() . $field; - } - - return $field; - } - - /** - * Creates a sections specific row. - * - * @param string $content The content to show. - * @param string $esc_form_key Escaped form key name. - * @param WPSEO_Admin_Help_Panel $help The help button. - * - * @return string - */ - private function parse_section_row( $content, $esc_form_key, WPSEO_Admin_Help_Panel $help ) { - $html = $content; - $html .= '
    ' . $help->get_button_html() . $help->get_panel_html() . '
    '; - return $html; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields.php b/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields.php deleted file mode 100644 index 2fdafbd4..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-fields.php +++ /dev/null @@ -1,91 +0,0 @@ -term = $term; - if ( $options !== null ) { - $this->options = $options; - } - else { - $this->options = WPSEO_Options::get_options( array( - 'wpseo_titles', - 'wpseo_internallinks', - 'wpseo_social', - ) ); - } - } - - /** - * This method should return the fields - * - * @return array - */ - abstract public function get(); - - /** - * Returns array with the field data - * - * @param string $label The label displayed before the field. - * @param string $description Description which will explain the field. - * @param string $type The field type, for example: input, select. - * @param string|array $options Optional. Array with additional options. - * @param bool $hide Should the field be hidden. - * - * @return array - */ - protected function get_field_config( $label, $description, $type = 'text', $options = '', $hide = false ) { - return array( - 'label' => $label, - 'description' => $description, - 'type' => $type, - 'options' => $options, - 'hide' => $hide, - ); - } - - /** - * Filter the hidden fields. - * - * @param array $fields Array with the form fields that has will be filtered. - * - * @return array - */ - protected function filter_hidden_fields( array $fields ) { - foreach ( $fields as $field_name => $field_options ) { - if ( ! empty( $field_options['hide'] ) ) { - unset( $fields[ $field_name ] ); - } - } - - return $fields; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-metabox.php b/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-metabox.php deleted file mode 100644 index 58497937..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-metabox.php +++ /dev/null @@ -1,410 +0,0 @@ -term = $term; - $this->taxonomy = $taxonomy; - $this->taxonomy_tab_content = new WPSEO_Taxonomy_Fields_Presenter( $this->term ); - - add_action( 'admin_footer', array( $this, 'template_generic_tab' ) ); - add_action( 'admin_footer', array( $this, 'template_keyword_tab' ) ); - } - - /** - * Shows the Yoast SEO metabox for the term. - */ - public function display() { - - $content_sections = $this->get_content_sections(); - - $product_title = 'Yoast SEO'; - if ( file_exists( WPSEO_PATH . 'premium/' ) ) { - $product_title .= ' Premium'; - } - - printf( '

    %1$s

    ', $product_title ); - - echo '
    '; - - $helpcenter_tab = new WPSEO_Option_Tab( 'tax-metabox', 'Meta box', - array( 'video_url' => 'https://yoa.st/metabox-taxonomy-screencast' ) ); - - $helpcenter = new WPSEO_Help_Center( 'tax-metabox', $helpcenter_tab ); - $helpcenter->output_help_center(); - - echo '
    '; - - if ( ! defined( 'WPSEO_PREMIUM_FILE' ) ) { - echo $this->get_buy_premium_link(); - } - - echo '
      '; - - foreach ( $content_sections as $content_section ) { - if ( $content_section->name === 'premium' ) { - continue; - } - - $content_section->display_link(); - } - - echo '
    '; - - foreach ( $content_sections as $content_section ) { - $content_section->display_content(); - } - echo '
    '; - } - - /** - * Returns the relevant metabox sections for the current view. - * - * @return WPSEO_Metabox_Section[] - */ - private function get_content_sections() { - $content_sections = array( - $this->get_content_meta_section(), - $this->get_social_meta_section(), - $this->get_settings_meta_section(), - ); - - if ( ! defined( 'WPSEO_PREMIUM_FILE' ) ) { - $content_sections[] = $this->get_buy_premium_section(); - } - - return $content_sections; - } - - /** - * Returns the metabox section for the content analysis. - * - * @return WPSEO_Metabox_Section - */ - private function get_content_meta_section() { - $taxonomy_content_fields = new WPSEO_Taxonomy_Content_Fields( $this->term ); - $content = $this->taxonomy_tab_content->html( $taxonomy_content_fields->get() ); - - $tab = new WPSEO_Metabox_Form_Tab( - 'content', - $content, - '', - array( - 'tab_class' => 'yoast-seo__remove-tab', - ) - ); - - return new WPSEO_Metabox_Tab_Section( - 'content', - '' . __( 'Content optimization', 'wordpress-seo' ) . '' . $this->traffic_light_svg() . '', - array( $tab ), - array( - 'link_aria_label' => __( 'Content optimization', 'wordpress-seo' ), - 'link_class' => 'yoast-tooltip yoast-tooltip-e', - ) - ); - } - - /** - * Returns the metabox section for the settings. - * - * @return WPSEO_Metabox_Section - */ - private function get_settings_meta_section() { - $taxonomy_settings_fields = new WPSEO_Taxonomy_Settings_Fields( $this->term ); - $content = $this->taxonomy_tab_content->html( $taxonomy_settings_fields->get() ); - - $tab = new WPSEO_Metabox_Form_Tab( - 'settings', - $content, - __( 'Settings', 'wordpress-seo' ), - array( - 'single' => true, - ) - ); - - return new WPSEO_Metabox_Tab_Section( - 'settings', - '' . __( 'Settings', 'wordpress-seo' ) . '', - array( $tab ), - array( - 'link_aria_label' => __( 'Settings', 'wordpress-seo' ), - 'link_class' => 'yoast-tooltip yoast-tooltip-e', - ) - ); - } - - /** - * Returns the metabox section for the social settings. - * - * @return WPSEO_Metabox_Section - */ - private function get_social_meta_section() { - $options = WPSEO_Options::get_option( 'wpseo_social' ); - $taxonomy_social_fields = new WPSEO_Taxonomy_Social_Fields( $this->term ); - - $tabs = array(); - $single = true; - - if ( $options['opengraph'] === true && $options['twitter'] === true ) { - $single = null; - } - - if ( $options['opengraph'] === true ) { - $facebook_meta_fields = $taxonomy_social_fields->get_by_network( 'opengraph' ); - - $tabs[] = new WPSEO_Metabox_Form_Tab( - 'facebook', - $this->taxonomy_tab_content->html( $facebook_meta_fields ), - '' . __( 'Facebook / Open Graph metadata', 'wordpress-seo' ) . '', - array( - 'link_aria_label' => __( 'Facebook / Open Graph metadata', 'wordpress-seo' ), - 'link_class' => 'yoast-tooltip yoast-tooltip-se', - 'single' => $single, - ) - ); - } - - if ( $options['twitter'] === true ) { - $twitter_meta_fields = $taxonomy_social_fields->get_by_network( 'twitter' ); - - $tabs[] = new WPSEO_Metabox_Form_Tab( - 'twitter', - $this->taxonomy_tab_content->html( $twitter_meta_fields ), - '' . __( 'Twitter metadata', 'wordpress-seo' ) . '', - array( - 'link_aria_label' => __( 'Twitter metadata', 'wordpress-seo' ), - 'link_class' => 'yoast-tooltip yoast-tooltip-se', - 'single' => $single, - ) - ); - } - - return new WPSEO_Metabox_Tab_Section( - 'social', - '' . __( 'Social', 'wordpress-seo' ) . '', - $tabs, - array( - 'link_aria_label' => __( 'Social', 'wordpress-seo' ), - 'link_class' => 'yoast-tooltip yoast-tooltip-e', - ) - ); - } - - /** - * Returns a link to activate the Buy Premium tab. - * - * @return string - */ - private function get_buy_premium_link() { - return sprintf( "", - 'wpseo-metabox-buy-premium', - __( 'Go Premium', 'wordpress-seo' ) - ); - } - - /** - * Returns the metabox section for the Premium section.. - * - * @return WPSEO_Metabox_Section - */ - private function get_buy_premium_section() { - $content = sprintf( "
    - %s -
      -
    • - %s - %s -
    • -
    • - %s - %s -
    • -
    • - %s - %s -
    • -
    • - %s - %s -
    • -
    - - - %s - - -

    %s

    -
    ", - /* translators: %1$s expands to Yoast SEO Premium. */ - sprintf( __( 'You\'re not getting the benefits of %1$s yet. If you had %1$s, you could use its awesome features:', 'wordpress-seo' ), 'Yoast SEO Premium' ), - __( 'Redirect manager', 'wordpress-seo' ), - __( 'Create and manage redirects within your WordPress install.', 'wordpress-seo' ), - __( 'Multiple focus keywords', 'wordpress-seo' ), - __( 'Optimize a single post for up to 5 keywords.', 'wordpress-seo' ), - __( 'Social Previews', 'wordpress-seo' ), - __( 'Check what your Facebook or Twitter post will look like.', 'wordpress-seo' ), - __( 'Premium support', 'wordpress-seo' ), - __( 'Gain access to our 24/7 support team.', 'wordpress-seo' ), - WPSEO_Shortlinker::get( 'https://yoa.st/pe-buy-premium' ), - /* translators: %s expands to Yoast SEO Premium. */ - sprintf( __( 'Get %s now!', 'wordpress-seo' ), 'Yoast SEO Premium' ), - WPSEO_Shortlinker::get( 'https://yoa.st/pe-premium-page' ), - __( 'More info', 'wordpress-seo' ) - ); - - $tab = new WPSEO_Metabox_Form_Tab( - 'premium', - $content, - 'Yoast SEO Premium', - array( - 'single' => true, - ) - ); - - return new WPSEO_Metabox_Tab_Section( - 'premium', - '', - array( $tab ), - array( - 'link_aria_label' => 'Yoast SEO Premium', - 'link_class' => 'yoast-tooltip yoast-tooltip-e', - ) - ); - } - - /** - * Test whether we are on a public taxonomy - no metabox actions needed if we are not - * Unfortunately we have to hook most everything in before the point where all taxonomies are registered and - * we know which taxonomy is being requested, so we need to use this check in nearly every hooked in function. - * - * @since 1.5.0 - */ - private function tax_is_public() { - // Don't make static as taxonomies may still be added during the run. - $taxonomy = get_taxonomy( $this->taxonomy ); - - return $taxonomy->public; - } - - /** - * Return the SVG for the traffic light in the metabox. - */ - public function traffic_light_svg() { - return << - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -SVG; - } - - /** - * Generic tab. - */ - public function template_generic_tab() { - // This template belongs to the post scraper so don't echo it if it isn't enqueued. - if ( ! wp_script_is( WPSEO_Admin_Asset_Manager::PREFIX . 'term-scraper' ) ) { - return; - } - - echo ''; - } - - /** - * Keyword tab for enabling analysis of multiple keywords. - */ - public function template_keyword_tab() { - // This template belongs to the term scraper so don't echo it if it isn't enqueued. - if ( ! wp_script_is( WPSEO_Admin_Asset_Manager::PREFIX . 'term-scraper' ) ) { - return; - } - - echo ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-settings-fields.php b/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-settings-fields.php deleted file mode 100644 index 4635ace9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-settings-fields.php +++ /dev/null @@ -1,121 +0,0 @@ -translate_meta_options(); - } - - /** - * Returns array with the fields for the general tab - * - * @return array - */ - public function get() { - $fields = array( - 'metakey' => $this->get_field_config( - __( 'Meta keywords', 'wordpress-seo' ), - esc_html__( 'Meta keywords used on the archive page for this term.', 'wordpress-seo' ), - 'text', - '', - $this->options['usemetakeywords'] !== true - ), - 'noindex' => $this->get_field_config( - esc_html__( 'Meta robots index', 'wordpress-seo' ), - esc_html__( 'This taxonomy follows the indexation rules set under Metas and Titles, you can override it here.', 'wordpress-seo' ), - 'select', - $this->get_noindex_options() - ), - 'sitemap_include' => $this->get_field_config( - esc_html__( 'Include in Sitemap?', 'wordpress-seo' ), - '', - 'select', - $this->sitemap_include_options - ), - 'bctitle' => $this->get_field_config( - __( 'Breadcrumbs Title', 'wordpress-seo' ), - esc_html__( 'The Breadcrumbs Title is used in the breadcrumbs where this taxonomy appears.', 'wordpress-seo' ), - 'text', - '', - $this->options['breadcrumbs-enable'] !== true - ), - 'canonical' => $this->get_field_config( - __( 'Canonical URL', 'wordpress-seo' ), - esc_html__( 'The canonical link is shown on the archive page for this term.', 'wordpress-seo' ) - ), - ); - - return $this->filter_hidden_fields( $fields ); - } - - /** - * Translate options text strings for use in the select fields - * - * @internal IMPORTANT: if you want to add a new string (option) somewhere, make sure you add - * that array key to the main options definition array in the class WPSEO_Taxonomy_Meta() as well!!!! - */ - private function translate_meta_options() { - $this->no_index_options = WPSEO_Taxonomy_Meta::$no_index_options; - $this->sitemap_include_options = WPSEO_Taxonomy_Meta::$sitemap_include_options; - - /* translators: %s expands to the current taxonomy index value */ - $this->no_index_options['default'] = __( 'Default for this taxonomy type, currently: %s', 'wordpress-seo' ); - $this->no_index_options['index'] = __( 'Index', 'wordpress-seo' ); - $this->no_index_options['noindex'] = __( 'Noindex', 'wordpress-seo' ); - - $this->sitemap_include_options['-'] = __( 'Auto detect', 'wordpress-seo' ); - $this->sitemap_include_options['always'] = __( 'Always include', 'wordpress-seo' ); - $this->sitemap_include_options['never'] = __( 'Never include', 'wordpress-seo' ); - } - - /** - * Getting the data for the noindex fields - * - * @return array - */ - private function get_noindex_options() { - $noindex_options['options'] = $this->no_index_options; - $noindex_options['options']['default'] = sprintf( $noindex_options['options']['default'], $this->get_robot_index() ); - - if ( get_option( 'blog_public' ) === 0 ) { - $noindex_options['description'] = '
    ' . esc_html__( 'Warning: even though you can set the meta robots setting here, the entire site is set to noindex in the sitewide privacy settings, so these settings won\'t have an effect.', 'wordpress-seo' ) . ''; - } - - return $noindex_options; - } - - /** - * Returns the current robot index value for the taxonomy - * - * @return string - */ - private function get_robot_index() { - $robot_index = 'index'; - $index_option = 'noindex-tax-' . $this->term->taxonomy; - if ( isset( $this->options[ $index_option ] ) && $this->options[ $index_option ] === true ) { - $robot_index = 'noindex'; - } - - return $robot_index; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-social-fields.php b/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-social-fields.php deleted file mode 100644 index 4b1eeba1..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy-social-fields.php +++ /dev/null @@ -1,140 +0,0 @@ -networks = $this->get_social_networks(); - } - - /** - * When this method returns false, the social tab in the meta box will be hidden - * - * @return bool - */ - public function show_social() { - return ( $this->options['opengraph'] === true || $this->options['twitter'] === true ); - } - - /** - * Gets the social meta fields by social network for the taxonomy. - * - * @param string $network The social network for which to fetch the fields. - * - * @return array - */ - public function get_by_network( $network ) { - $settings = $this->networks[ $network ]; - - return array( - $settings['network'] . '-title' => $this->get_field_config( - /* translators: %s expands to the social network name */ - sprintf( __( '%s Title', 'wordpress-seo' ), $settings['label'] ), - /* translators: %1$s expands to the social network name */ - sprintf( esc_html__( 'If you don\'t want to use the title for sharing on %1$s but instead want another title there, write it here.', 'wordpress-seo' ), $settings['label'] ), - 'text', - array( 'class' => 'large-text' ) - ), - $settings['network'] . '-description' => $this->get_field_config( - /* translators: %s expands to the social network name */ - sprintf( __( '%s Description', 'wordpress-seo' ), $settings['label'] ), - /* translators: %1$s expands to the social network name */ - sprintf( esc_html__( 'If you don\'t want to use the meta description for sharing on %1$s but want another description there, write it here.', 'wordpress-seo' ), $settings['label'] ), - 'textarea' - ), - $settings['network'] . '-image' => $this->get_field_config( - /* translators: %s expands to the social network name */ - sprintf( __( '%s Image', 'wordpress-seo' ), $settings['label'] ), - /* translators: %1$s expands to the social network name */ - sprintf( esc_html__( 'If you want to use an image for sharing on %1$s, you can upload / choose an image or add the image URL here.', 'wordpress-seo' ), $settings['label'] ) . '
    ' . - /* translators: %1$s expands to the social network name, %2$s expands to the image size */ - sprintf( __( 'The recommended image size for %1$s is %2$s pixels.', 'wordpress-seo' ), $settings['label'], $settings['size'] ), - 'upload' - ), - ); - } - - /** - * Returning the fields for the social media tab - * - * @return array - */ - public function get() { - $fields = array(); - foreach ( $this->networks as $option => $settings ) { - $fields_to_push = $this->get_by_network( $option ); - - $fields = array_merge( $fields, $fields_to_push ); - } - - return $this->filter_hidden_fields( $fields ); - } - - /** - * Getting array with the social networks - * - * @return array - */ - private function get_social_networks() { - $social_networks = array( - // Source: https://developers.facebook.com/docs/sharing/best-practices#images. - 'opengraph' => $this->social_network( 'opengraph', __( 'Facebook', 'wordpress-seo' ), sprintf( - /* translators: %1$s expands to the image recommended width, %2$s to its height. */ - __( '%1$s by %2$s', 'wordpress-seo' ), '1200', '630' - ) ), - 'twitter' => $this->social_network( 'twitter', __( 'Twitter', 'wordpress-seo' ), sprintf( - /* translators: %1$s expands to the image recommended width, %2$s to its height. */ - __( '%1$s by %2$s', 'wordpress-seo' ), '1024', '512' - ) ), - ); - $social_networks = $this->filter_social_networks( $social_networks ); - - return $social_networks; - } - - /** - * Returns array with the config fields for the social network - * - * @param string $network The name of the social network. - * @param string $label The label for the social network. - * @param string $image_size The image dimensions. - * - * @return array - */ - private function social_network( $network, $label, $image_size ) { - return array( - 'network' => $network, - 'label' => $label, - 'size' => $image_size, - ); - } - - /** - * Filter the social networks which are disabled in the configuration - * - * @param array $social_networks Array with the social networks that have to be filtered. - * - * @return array - */ - private function filter_social_networks( array $social_networks ) { - foreach ( $social_networks as $social_network => $settings ) { - if ( empty( $this->options[ $social_network ] ) ) { - unset( $social_networks[ $social_network ] ); - } - } - - return $social_networks; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy.php b/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy.php deleted file mode 100644 index b480e5d6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/taxonomy/class-taxonomy.php +++ /dev/null @@ -1,392 +0,0 @@ -taxonomy = $this->get_taxonomy(); - - add_action( 'edit_term', array( $this, 'update_term' ), 99, 3 ); - add_action( 'init', array( $this, 'custom_category_descriptions_allow_html' ) ); - add_action( 'admin_init', array( $this, 'admin_init' ) ); - - $this->insert_description_field_editor(); - - add_filter( 'category_description', array( $this, 'custom_category_descriptions_add_shortcode_support' ) ); - - if ( self::is_term_overview( $GLOBALS['pagenow'] ) ) { - new WPSEO_Taxonomy_Columns(); - } - $this->analysis_seo = new WPSEO_Metabox_Analysis_SEO(); - $this->analysis_readability = new WPSEO_Metabox_Analysis_Readability(); - } - - /** - * Add hooks late enough for taxonomy object to be available for checks. - */ - public function admin_init() { - - $taxonomy = get_taxonomy( $this->taxonomy ); - - if ( empty( $taxonomy ) || empty( $taxonomy->public ) || ! $this->show_metabox() ) { - return; - } - - add_action( sanitize_text_field( $this->taxonomy ) . '_edit_form', array( $this, 'term_metabox' ), 90, 1 ); - add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) ); - } - - /** - * Show the SEO inputs for term. - * - * @param stdClass|WP_Term $term Term to show the edit boxes for. - */ - public function term_metabox( $term ) { - $metabox = new WPSEO_Taxonomy_Metabox( $this->taxonomy, $term ); - $metabox->display(); - } - - /** - * Queue assets for taxonomy screens. - * - * @since 1.5.0 - */ - public function admin_enqueue_scripts() { - $pagenow = $GLOBALS['pagenow']; - - if ( ! ( self::is_term_edit( $pagenow ) || self::is_term_overview( $pagenow ) ) ) { - return; - } - - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->enqueue_style( 'scoring' ); - - - $tag_id = filter_input( INPUT_GET, 'tag_ID' ); - if ( - self::is_term_edit( $pagenow ) && - ! empty( $tag_id ) // After we drop support for <4.5 this can be removed. - ) { - wp_enqueue_media(); // Enqueue files needed for upload functionality. - - $asset_manager->enqueue_style( 'metabox-css' ); - $asset_manager->enqueue_style( 'snippet' ); - $asset_manager->enqueue_style( 'scoring' ); - $asset_manager->enqueue_script( 'metabox' ); - $asset_manager->enqueue_script( 'term-scraper' ); - $asset_manager->enqueue_style( 'kb-search' ); - - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'term-scraper', 'wpseoTermScraperL10n', $this->localize_term_scraper_script() ); - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'replacevar-plugin', 'wpseoReplaceVarsL10n', $this->localize_replace_vars_script() ); - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'metabox', 'wpseoSelect2Locale', WPSEO_Utils::get_language( WPSEO_Utils::get_user_locale() ) ); - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'metabox', 'wpseoAdminL10n', WPSEO_Help_Center::get_translated_texts() ); - - $asset_manager->enqueue_script( 'admin-media' ); - - wp_localize_script( WPSEO_Admin_Asset_Manager::PREFIX . 'admin-media', 'wpseoMediaL10n', array( - 'choose_image' => __( 'Use Image', 'wordpress-seo' ), - ) ); - } - } - - /** - * Update the taxonomy meta data on save. - * - * @param int $term_id ID of the term to save data for. - * @param int $tt_id The taxonomy_term_id for the term. - * @param string $taxonomy The taxonomy the term belongs to. - */ - public function update_term( $term_id, $tt_id, $taxonomy ) { - /* Create post array with only our values */ - $new_meta_data = array(); - foreach ( WPSEO_Taxonomy_Meta::$defaults_per_term as $key => $default ) { - if ( $posted_value = filter_input( INPUT_POST, $key ) ) { - $new_meta_data[ $key ] = $posted_value; - } - - // If analysis is disabled remove that analysis score value from the DB. - if ( $this->is_meta_value_disabled( $key ) ) { - $new_meta_data[ $key ] = ''; - } - } - unset( $key, $default ); - - // Saving the values. - WPSEO_Taxonomy_Meta::set_values( $term_id, $taxonomy, $new_meta_data ); - } - - /** - * Determines if the given meta value key is disabled - * - * @param string $key The key of the meta value. - * @return bool Whether the given meta value key is disabled. - */ - public function is_meta_value_disabled( $key ) { - if ( 'wpseo_linkdex' === $key && ! $this->analysis_seo->is_enabled() ) { - return true; - } - - if ( 'wpseo_content_score' === $key && ! $this->analysis_readability->is_enabled() ) { - return true; - } - - return false; - } - - /** - * Allows HTML in descriptions - */ - public function custom_category_descriptions_allow_html() { - $filters = array( - 'pre_term_description', - 'pre_link_description', - 'pre_link_notes', - 'pre_user_description', - ); - - foreach ( $filters as $filter ) { - remove_filter( $filter, 'wp_filter_kses' ); - } - remove_filter( 'term_description', 'wp_kses_data' ); - } - - /** - * Output the WordPress editor. - */ - public function custom_category_description_editor() { - - if ( ! $this->show_metabox() ) { - return; - } - - wp_editor( '', 'description' ); - } - - /** - * Adds shortcode support to category descriptions. - * - * @param string $desc String to add shortcodes in. - * - * @return string - */ - public function custom_category_descriptions_add_shortcode_support( $desc ) { - // Wrap in output buffering to prevent shortcodes that echo stuff instead of return from breaking things. - ob_start(); - $desc = do_shortcode( $desc ); - ob_end_clean(); - - return $desc; - } - - /** - * Pass variables to js for use with the term-scraper - * - * @return array - */ - public function localize_term_scraper_script() { - $term_id = filter_input( INPUT_GET, 'tag_ID' ); - $term = get_term_by( 'id', $term_id, $this->get_taxonomy() ); - $taxonomy = get_taxonomy( $term->taxonomy ); - - $term_formatter = new WPSEO_Metabox_Formatter( - new WPSEO_Term_Metabox_Formatter( $taxonomy, $term, WPSEO_Options::get_option( 'wpseo_titles' ) ) - ); - - return $term_formatter->get_values(); - } - - /** - * Pass some variables to js for replacing variables. - */ - public function localize_replace_vars_script() { - return array( - 'no_parent_text' => __( '(no parent)', 'wordpress-seo' ), - 'replace_vars' => $this->get_replace_vars(), - 'scope' => $this->determine_scope(), - ); - } - - /** - * Determines the scope based on the current taxonomy. - * This can be used by the replacevar plugin to determine if a replacement needs to be executed. - * - * @return string String decribing the current scope. - */ - private function determine_scope() { - $taxonomy = $this->get_taxonomy(); - - if ( $taxonomy === 'category' ) { - return 'category'; - } - - if ( $taxonomy === 'post_tag' ) { - return 'tag'; - } - - return 'term'; - } - - /** - * @param string $page The string to check for the term overview page. - * - * @return bool - */ - public static function is_term_overview( $page ) { - return 'edit-tags.php' === $page; - } - - /** - * @param string $page The string to check for the term edit page. - * - * @return bool - */ - public static function is_term_edit( $page ) { - return 'term.php' === $page - || 'edit-tags.php' === $page; // After we drop support for <4.5 this can be removed. - } - - /** - * Retrieves a template. - * Check if metabox for current taxonomy should be displayed. - * - * @return bool - */ - private function show_metabox() { - $options = WPSEO_Options::get_option( 'wpseo_titles' ); - $option_key = 'hideeditbox-tax-' . $this->taxonomy; - - return ( empty( $options[ $option_key ] ) ); - } - - /** - * Getting the taxonomy from the URL - * - * @return string - */ - private function get_taxonomy() { - return filter_input( INPUT_GET, 'taxonomy', FILTER_DEFAULT, array( 'options' => array( 'default' => '' ) ) ); - } - - /** - * Prepares the replace vars for localization. - * - * @return array replace vars. - */ - private function get_replace_vars() { - $term_id = filter_input( INPUT_GET, 'tag_ID' ); - $term = get_term_by( 'id', $term_id, $this->get_taxonomy() ); - $cached_replacement_vars = array(); - - $vars_to_cache = array( - 'date', - 'id', - 'sitename', - 'sitedesc', - 'sep', - 'page', - 'currenttime', - 'currentdate', - 'currentday', - 'currentmonth', - 'currentyear', - 'term_title', - 'term_description', - 'category_description', - 'tag_description', - 'searchphrase', - ); - - foreach ( $vars_to_cache as $var ) { - $cached_replacement_vars[ $var ] = wpseo_replace_vars( '%%' . $var . '%%', $term ); - } - - return $cached_replacement_vars; - } - - /** - * Adds custom category description editor. - * Needs a hook that runs before the description field. Prior to WP version 4.5 we need to use edit_form as - * term_edit_form_top was introduced in WP 4.5. This can be removed after <4.5 is no longer supported. - * - * @return {void} - */ - private function insert_description_field_editor() { - if ( version_compare( $GLOBALS['wp_version'], '4.5', '<' ) ) { - add_action( "{$this->taxonomy}_edit_form", array( $this, 'custom_category_description_editor' ) ); - return; - } - - add_action( "{$this->taxonomy}_term_edit_form_top", array( $this, 'custom_category_description_editor' ) ); - } - - /********************** DEPRECATED METHODS **********************/ - - // @codeCoverageIgnoreStart - /** - * @deprecated 3.2 - * - * Retrieves the title template. - * - * @param object $term taxonomy term. - * - * @return string - */ - public static function get_title_template( $term ) { - _deprecated_function( __METHOD__, 'WPSEO 3.2', 'WPSEO_Term_Scraper::get_title_template' ); - - return ''; - } - - /** - * @deprecated 3.2 - * - * Retrieves the metadesc template. - * - * @param object $term taxonomy term. - * - * @return string - */ - public static function get_metadesc_template( $term ) { - _deprecated_function( __METHOD__, 'WPSEO 3.2', 'WPSEO_Term_Scraper::get_metadesc_template' ); - - return ''; - } - - /** - * @deprecated 3.2 - * - * Translate options text strings for use in the select fields - * - * @internal IMPORTANT: if you want to add a new string (option) somewhere, make sure you add - * that array key to the main options definition array in the class WPSEO_Taxonomy_Meta() as well!!!! - */ - public function translate_meta_options() { - _deprecated_function( __METHOD__, 'WPSEO 3.2', 'WPSEO_Taxonomy_Settings_Fields::translate_meta_options' ); - } - // @codeCoverageIgnoreEnd -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/about.php b/wp/wp-content/plugins/wordpress-seo/admin/views/about.php deleted file mode 100644 index 01f9f006..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/about.php +++ /dev/null @@ -1,231 +0,0 @@ - $dev ) { - echo '
  15. '; - echo '', $dev->name, ''; - echo '', $dev->role, "
  16. \n"; - } -} - -?> - -
    - -

    - -

    - ', '', 'Yoast SEO' ); - echo ' '; - /* translators: 1: link open tag; 2: link close tag. */ - printf( __( 'Want to help us develop? Read our %1$scontribution guidelines%2$s!', 'wordpress-seo' ), '', '' ); - ?> -

    - -
    - - - -
    -

    - -

    -
      - (object) array( - 'name' => 'Joost de Valk', - 'role' => __( 'Project Lead', 'wordpress-seo' ), - 'gravatar' => 'f08c3c3253bf14b5616b4db53cea6b78', - ), - 'mariekerakt' => (object) array( - 'name' => 'Marieke van de Rakt', - 'role' => __( 'Head R&D', 'wordpress-seo' ), - 'gravatar' => '1d83533e299c379140f9fcc2cb0015cb', - ), - 'irenestr' => (object) array( - 'name' => 'Irene Strikkers', - 'role' => __( 'Linguist', 'wordpress-seo' ), - 'gravatar' => '074d67179d52561e36e57e8e9ea8f8cf', - ), - ); - - wpseo_display_contributors( $people ); - ?> -
    -

    -
      - (object) array( - 'name' => 'Omar Reiss', - 'role' => __( 'CTO', 'wordpress-seo' ), - 'gravatar' => '86aaa606a1904e7e0cf9857a663c376e', - ), - 'atimmer' => (object) array( - 'name' => 'Anton Timmermans', - 'role' => __( 'Architect', 'wordpress-seo' ), - 'gravatar' => 'b3acbabfdd208ecbf950d864b86fe968', - ), - 'moorscode' => (object) array( - 'name' => 'Jip Moors', - 'role' => __( 'Architect', 'wordpress-seo' ), - 'gravatar' => '1751c5afc377ef4ec07a50791db1bc52', - ), - ); - - wpseo_display_contributors( $people ); - ?> -
    -

    -
      - (object) array( - 'name' => 'Andrea Fercia', - 'role' => __( 'Developer', 'wordpress-seo' ), - 'gravatar' => '074af62ea5ff218b6a6eeab89104f616', - ), - 'rarst' => (object) array( - 'name' => 'Andrey Savchenko', - 'role' => __( 'Developer', 'wordpress-seo' ), - 'gravatar' => 'c445c2491f9f55409b2e4dccee357961', - ), - 'andizer' => (object) array( - 'name' => 'Andy Meerwaldt', - 'role' => __( 'Developer', 'wordpress-seo' ), - 'gravatar' => 'a9b43e766915b48031eab78f9916ca8e', - ), - 'boblinthorst' => (object) array( - 'name' => 'Bob Linthorst', - 'role' => __( 'Developer', 'wordpress-seo' ), - 'gravatar' => '8063b1955f54681ef3a2deb21972faa1', - ), - 'CarolineGeven' => (object) array( - 'name' => 'Caroline Geven', - 'role' => __( 'Developer', 'wordpress-seo' ), - 'gravatar' => 'f2596a568c3974e35f051266a63d791f', - ), - 'terw-dan' => (object) array( - 'name' => 'Danny Terwindt', - 'role' => __( 'Developer', 'wordpress-seo' ), - 'gravatar' => '20a04b0736e630e80ce2dbefe3f1d62f', - ), - 'diedexx' => (object) array( - 'name' => 'Diede Exterkate', - 'role' => __( 'Developer', 'wordpress-seo' ), - 'gravatar' => '59908788f406037240ee011388db29f8', - ), - 'irenestr2' => (object) array( - 'name' => 'Irene Strikkers', - 'role' => __( 'Developer', 'wordpress-seo' ), - 'gravatar' => '074d67179d52561e36e57e8e9ea8f8cf', - ), - 'jcomack' => (object) array( - 'name' => 'Jimmy Comack', - 'role' => __( 'Developer', 'wordpress-seo' ), - 'gravatar' => '41073ef9e1f3e01b03cbee75cee33bd4', - ), - ); - - wpseo_display_contributors( $people ); - ?> -
    -

    -
      - (object) array( - 'name' => 'Taco Verdonschot', - 'role' => __( 'QA & Translations Manager', 'wordpress-seo' ), - 'gravatar' => 'd2d3ecb38cacd521926979b5c678297b', - ), - 'monbauza' => (object) array( - 'name' => 'Ramon Bauza', - 'role' => __( 'Tester', 'wordpress-seo' ), - 'gravatar' => 'de09b8491ab1d927e770f7519219cfc9', - ), - 'boblinthorst2' => (object) array( - 'name' => 'Bob Linthorst', - 'role' => __( 'Tester', 'wordpress-seo' ), - 'gravatar' => '8063b1955f54681ef3a2deb21972faa1', - ), - ); - - wpseo_display_contributors( $people ); - ?> -
    - -

    -

    - - -
    - -
    -

    Yoast SEO Integrations

    -

    - Yoast SEO 3.0 brought a way for theme builders and custom field plugins to integrate with Yoast SEO. These - integrations make sure that all the data on your page is used for the content analysis. On this - page, we highlight the frameworks that have nicely working integrations. -

    - -
      -
    1. Yoast ACF - Integration - an integration built by Marcus Forsberg and Team - Yoast -
    2. -
    3. Divi Builder
    4. -
    5. Visual Composer
    6. -
    - -

    Other integrations

    -

    - We've got another integration we'd like to tell you about: -

    - -
      -
    1. Glue for Yoast SEO & - AMP - an integration between the WordPress AMP - plugin and Yoast SEO. -
    2. -
    3. - Instant Articles for WP - - Enable Instant Articles for Facebook on your WordPress site and integrates with Yoast SEO. -
    4. -
    -
    -
    diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-form-fieldset.php b/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-form-fieldset.php deleted file mode 100644 index ba77b938..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-form-fieldset.php +++ /dev/null @@ -1,168 +0,0 @@ - 'yoast-form-fieldset', - ); - - /** - * @var string The grouped form elements for the fieldset. - */ - private $content; - - /** - * @var array The fieldset legend HTML default attributes. - */ - private $legend_attributes = array( - 'class' => 'yoast-form-legend', - ); - - /** - * @var string A translatable string for the fieldset legend content. - */ - private $legend_content; - - /** - * Constructor. - * - * @param string $id ID for the fieldset. - * @param string $legend_content The translatable legend text. - * @param string $content The grouped form elements for the fieldset. - */ - public function __construct( $id, $legend_content, $content ) { - $this->id = $id; - $this->legend_content = $legend_content; - $this->content = $content; - } - - /** - * Render the view. - */ - public function render_view() { - /* - * Extract because we want values accessible via variables for later use - * in the view instead of accessing them as an array. - */ - extract( $this->get_parts() ); - - require( dirname( WPSEO_FILE ) . '/admin/views/form/fieldset.php' ); - } - - /** - * Start output buffering to catch the form elements to wrap in the fieldset. - */ - public function start() { - ob_start(); - } - - /** - * Return output buffering with the form elements to wrap in the fieldset. - */ - public function end() { - $this->content = ob_get_clean(); - } - - /** - * Return the rendered view. - * - * @return string - */ - public function get_html() { - ob_start(); - $this->render_view(); - return ob_get_clean(); - } - - /** - * Output the rendered view. - */ - public function html() { - echo $this->get_html(); - } - - /** - * Add attributes to the fieldset default attributes. - * - * @param array $attributes Array of attributes names and values to merge with the defaults. - */ - public function add_attributes( $attributes ) { - $this->attributes = wp_parse_args( $attributes, $this->attributes ); - } - - /** - * Add attributes to the fieldset legend default attributes. - * - * @param array $attributes Array of attributes names and values to merge with the defaults. - */ - public function legend_add_attributes( $attributes ) { - $this->legend_attributes = wp_parse_args( $attributes, $this->legend_attributes ); - } - - /** - * Visually hide the fieldset legend but keep it available to assistive technologies. - */ - public function legend_hide() { - $this->legend_attributes = wp_parse_args( - array( 'class' => 'screen-reader-text' ), - $this->legend_attributes - ); - } - - /** - * Return the set of attributes and content for the fieldset. - * - * @return array - */ - private function get_parts() { - return array( - 'id' => $this->id, - 'attributes' => $this->get_attributes_html( $this->attributes ), - 'legend_content' => $this->legend_content, - 'legend_attributes' => $this->get_attributes_html( $this->legend_attributes ), - 'content' => $this->content, - ); - } - - /** - * Return HTML formatted attributes as a string, when there are attributes set. - * - * @param array $attributes Fieldset or legend attributes. - * - * @return string A space separated list of HTML formatted attributes or empty string. - */ - private function get_attributes_html( $attributes ) { - if ( ! empty( $attributes ) ) { - array_walk( $attributes, array( $this, 'parse_attribute' ) ); - - // Use an initial space as `implode()` adds a space only between array elements. - return ' ' . implode( ' ', $attributes ); - } - - return ''; - } - - /** - * Escape and format an attribute as an HTML attribute. - * - * @param string $value The value of the attribute. - * @param string $attribute The attribute to look for. - */ - private function parse_attribute( & $value, $attribute ) { - $value = sprintf( '%s="%s"', esc_html( $attribute ), esc_attr( $value ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-input-select.php b/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-input-select.php deleted file mode 100644 index f0fdd67a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/class-yoast-input-select.php +++ /dev/null @@ -1,128 +0,0 @@ -select_id = $select_id; - $this->select_name = $select_name; - $this->select_options = $select_options; - $this->selected_option = $selected_option; - } - - /** - * Print the rendered view. - */ - public function output_html() { - // Extract it, because we want each value accessible via a variable instead of accessing it as an array. - extract( $this->get_select_values() ); - - require( dirname( WPSEO_FILE ) . '/admin/views/form/select.php' ); - } - - /** - * Return the rendered view - * - * @return string - */ - public function get_html() { - ob_start(); - - $this->output_html(); - - $rendered_output = ob_get_contents(); - ob_end_clean(); - - return $rendered_output; - } - - /** - * Add an attribute to the attributes property - * - * @param string $attribute The name of the attribute to add. - * @param string $value The value of the attribute. - */ - public function add_attribute( $attribute, $value ) { - $this->select_attributes[ $attribute ] = $value; - } - - /** - * Return the set fields for the select - * - * @return array - */ - private function get_select_values() { - return array( - 'id' => $this->select_id, - 'name' => $this->select_name, - 'attributes' => $this->get_attributes(), - 'options' => $this->select_options, - 'selected' => $this->selected_option, - ); - } - - /** - * Return the attribute string, when there are attributes set. - * - * @return string - */ - private function get_attributes() { - $attributes = $this->select_attributes; - - if ( ! empty( $attributes ) ) { - array_walk( $attributes, array( $this, 'parse_attribute' ) ); - - return implode( ' ', $attributes ) . ' '; - } - - return ''; - } - - /** - * Get an attribute from the attributes. - * - * @param string $value The value of the attribute. - * @param string $attribute The attribute to look for. - */ - private function parse_attribute( & $value, $attribute ) { - $value = sprintf( '%s="%s"', esc_html( $attribute ), esc_attr( $value ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/dashboard-widget.php b/wp/wp-content/plugins/wordpress-seo/admin/views/dashboard-widget.php deleted file mode 100644 index 9a54ce00..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/dashboard-widget.php +++ /dev/null @@ -1,105 +0,0 @@ - -

    - - -
    -

    - -

    - '; - _e( 'Your homepage can be indexed by search engines.', 'wordpress-seo' ); - - break; - case WPSEO_OnPage_Option::IS_NOT_INDEXABLE : - echo ''; - printf( - /* translators: 1: opens a link to a related knowledge base article. 2: closes the link */ - __( '%1$sYour homepage cannot be indexed by search engines%2$s. This is very bad for SEO and should be fixed.', 'wordpress-seo' ), - '', - '' - ); - break; - case WPSEO_OnPage_Option::CANNOT_FETCH : - echo ''; - printf( - /* translators: %1$s opens a link to a related knowledge base article, %2$s expands to Yoast SEO, %3$s closes the link. */ - __( '%1$s%2$s has not been able to fetch your site\'s indexability status%3$s from OnPage.org', 'wordpress-seo' ), - '', - 'Yoast SEO', - '' - ); - break; - case WPSEO_OnPage_Option::NOT_FETCHED : - echo ''; - echo esc_html( sprintf( - /* translators: %s expands to Yoast SEO. */ - __( '%s has not fetched your site\'s indexability status yet from OnPage.org', 'wordpress-seo' ), - 'Yoast SEO' - ) ); - break; - endswitch; - ?> -

    - -

    - ' . __( 'Fetch the current status', 'wordpress-seo' ) . ' '; - endif; - - echo '' . __( 'Analyze entire site', 'wordpress-seo' ) . ' '; - ?> -

    -
    - - -
    > - > - -
    diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/form/select.php b/wp/wp-content/plugins/wordpress-seo/admin/views/form/select.php deleted file mode 100644 index 4b42f73f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/form/select.php +++ /dev/null @@ -1,24 +0,0 @@ - - diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/interface-yoast-form-element.php b/wp/wp-content/plugins/wordpress-seo/admin/views/interface-yoast-form-element.php deleted file mode 100644 index aeec5f00..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/interface-yoast-form-element.php +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/partial-alerts-errors.php b/wp/wp-content/plugins/wordpress-seo/admin/views/partial-alerts-errors.php deleted file mode 100644 index 77b8fab6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/partial-alerts-errors.php +++ /dev/null @@ -1,19 +0,0 @@ -%1$s', __( 'Dismiss this item.', 'wordpress-seo' ) ); - break; - - case 'dismissed': - $button = sprintf( '', __( 'Restore this item.', 'wordpress-seo' ) ); - break; - } - - printf( '
    %4$s%5$s
    ', $notification->get_id(), $notification->get_nonce(), $notification->get_json(), $notification, $button ); - } - } -} - -if ( ! $active ) { - $dashicon = 'yes'; -} - -?> -

    ()

    - -
    - - -

    - -
    - -
    - - -
    - - -
    - -
    - - - -

    - - -
    diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/partial-alerts-warnings.php b/wp/wp-content/plugins/wordpress-seo/admin/views/partial-alerts-warnings.php deleted file mode 100644 index 48861d16..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/partial-alerts-warnings.php +++ /dev/null @@ -1,19 +0,0 @@ - -

    -
    -
    -
    -
    - -
    -

    -

    -

    -

    -
    - -
    - -

    - -

    -

    -

    -
    -
    - -
    - - -
    - currentoption = 'wpseo_internallinks'; - -echo '

    ' . __( 'Breadcrumbs settings', 'wordpress-seo' ) . '

    '; - -if ( ! current_theme_supports( 'yoast-seo-breadcrumbs' ) ) { - $yform->light_switch( 'breadcrumbs-enable', __( 'Enable Breadcrumbs', 'wordpress-seo' ) ); - echo '
    '; -} -echo ' -

    -

    - ', '' ); - ?> -

    diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/advanced/permalinks.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/advanced/permalinks.php deleted file mode 100644 index ce99cef9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/advanced/permalinks.php +++ /dev/null @@ -1,59 +0,0 @@ -currentoption = 'wpseo_permalinks'; - -echo '

    ', __( 'Change URLs', 'wordpress-seo' ), '

    '; - -$remove_buttons = array( __( 'Keep', 'wordpress-seo' ), __( 'Remove', 'wordpress-seo' ) ); -$yform->light_switch( - 'stripcategorybase', - /* translators: %s expands to /category/ */ - sprintf( __( 'Strip the category base (usually %s) from the category URL.', 'wordpress-seo' ), '/category/' ), - $remove_buttons, - false -); - -$redirect_buttons = array( __( 'No redirect', 'wordpress-seo' ), __( 'Redirect', 'wordpress-seo' ) ); -$yform->light_switch( 'redirectattachment', __( 'Redirect attachment URLs to parent post URL.', 'wordpress-seo' ), $redirect_buttons ); -echo '

    ' . __( 'Attachments to posts are stored in the database as posts, this means they\'re accessible under their own URLs if you do not redirect them, enabling this will redirect them to the post they were attached to.', 'wordpress-seo' ) . '

    '; - -echo '

    ', __( 'Clean up permalinks', 'wordpress-seo' ), '

    '; -$yform->light_switch( 'cleanslugs', __( 'Stop words in slugs.', 'wordpress-seo' ), $remove_buttons, false ); -echo '

    ' . __( 'This helps you to create cleaner URLs by automatically removing the stopwords from them.', 'wordpress-seo' ) . '

    '; - -/* translators: %s expands to ?replytocom */ -$yform->light_switch( 'cleanreplytocom', sprintf( __( 'Remove the %s variables.', 'wordpress-seo' ), '?replytocom' ), $remove_buttons, false ); -echo '

    ' . __( 'This prevents threaded replies from working when the user has JavaScript disabled, but on a large site can mean a huge improvement in crawl efficiency for search engines when you have a lot of comments.', 'wordpress-seo' ) . '

    '; - -$options = WPSEO_Options::get_all(); -if ( substr( get_option( 'permalink_structure' ), -1 ) !== '/' && $options['trailingslash'] ) { - $yform->light_switch( 'trailingslash', __( 'Enforce a trailing slash on all category and tag URLs', 'wordpress-seo' ) ); - echo '

    ' . __( 'Note: this feature has been deprecated, as the SEO value is close to 0 these days. If you disable it you will not be able to put it back on.', 'wordpress-seo' ) . '

    '; - /* translators: %1$s expands to .html, %2$s expands to / */ - echo '

    ' . sprintf( __( 'If you choose a permalink for your posts with %1$s, or anything else but a %2$s at the end, this will force WordPress to add a trailing slash to non-post pages nonetheless.', 'wordpress-seo' ), '.html', '/' ) . '

    '; -} - -$yform->light_switch( 'cleanpermalinks', __( 'Redirect ugly URLs to clean permalinks. (Not recommended in many cases!)', 'wordpress-seo' ), $redirect_buttons ); -echo '

    ' . __( 'People make mistakes in their links towards you sometimes, or unwanted parameters are added to the end of your URLs, this allows you to redirect them all away. Please note that while this is a feature that is actively maintained, it is known to break several plugins, and should for that reason be the first feature you disable when you encounter issues after installing this plugin.', 'wordpress-seo' ) . '

    '; - -echo '
    '; -$yform->light_switch( 'cleanpermalink-googlesitesearch', __( 'Prevent cleaning out Google Site Search URLs.', 'wordpress-seo' ) ); -echo '

    ' . __( 'Google Site Search URLs look weird, and ugly, but if you\'re using Google Site Search, you probably do not want them cleaned out.', 'wordpress-seo' ) . '

    '; - -$yform->light_switch( 'cleanpermalink-googlecampaign', __( 'Prevent cleaning out Google Analytics Campaign & Google AdWords Parameters.', 'wordpress-seo' ) ); -/* translators: %s expands to ?utm_ */ -echo '

    ' . sprintf( __( 'If you use Google Analytics campaign parameters starting with %s, check this box. However, you\'re advised not to use these. Instead, use the version with a hash.', 'wordpress-seo' ), '?utm_' ) . '

    '; - -$yform->textinput( 'cleanpermalink-extravars', __( 'Other variables not to clean', 'wordpress-seo' ) ); -echo '

    ' . __( 'You might have extra variables you want to prevent from cleaning out, add them here, comma separated.', 'wordpress-seo' ) . '

    '; -echo '
    '; diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/advanced/rss.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/advanced/rss.php deleted file mode 100644 index a7083d38..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/advanced/rss.php +++ /dev/null @@ -1,55 +0,0 @@ -set_option( 'wpseo_rss' ); - -echo '

    ' . __( 'RSS feed settings', 'wordpress-seo' ) . '

    '; - -echo '

    ' . __( "This feature is used to automatically add content to your RSS, more specifically, it's meant to add links back to your blog and your blog posts, so dumb scrapers will automatically add these links too, helping search engines identify you as the original source of the content.", 'wordpress-seo' ) . '

    '; - -$textarea_atts = array( - 'cols' => '50', - 'rows' => '5', -); -$yform->textarea( 'rssbefore', __( 'Content to put before each post in the feed', 'wordpress-seo' ), '', $textarea_atts ); -$yform->textarea( 'rssafter', __( 'Content to put after each post in the feed', 'wordpress-seo' ), '', $textarea_atts ); - -echo '

    ' . __( 'Available variables', 'wordpress-seo' ) . '

    '; -?> - -

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    %%AUTHORLINK%%
    %%POSTLINK%%
    %%BLOGLINK%%
    %%BLOGDESCLINK%%
    diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/dashboard.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/dashboard.php deleted file mode 100644 index 6a2a05b1..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/dashboard.php +++ /dev/null @@ -1,24 +0,0 @@ - -
    - -

    -
    - -
    - -
    - -
    - -
    diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/features.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/features.php deleted file mode 100644 index 6be17fc9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/features.php +++ /dev/null @@ -1,87 +0,0 @@ - __( 'Readability analysis', 'wordpress-seo' ), - 'setting' => 'content_analysis_active', - 'label' => __( 'Removes the readability tab from the metabox and disables all readability-related suggestions.', 'wordpress-seo' ), - ), - (object) array( - 'name' => __( 'Keyword analysis', 'wordpress-seo' ), - 'setting' => 'keyword_analysis_active', - 'label' => __( 'Removes the keyword tab from the metabox and disables all keyword-related suggestions.', 'wordpress-seo' ), - ), - (object) array( - 'name' => __( 'Advanced settings pages', 'wordpress-seo' ), - 'setting' => 'enable_setting_pages', - 'label' => __( 'The advanced settings include site-wide settings for your titles and meta descriptions, social metadata, sitemaps and much more.', 'wordpress-seo' ), - ), - (object) array( - 'name' => __( 'OnPage.org', 'wordpress-seo' ), - 'setting' => 'onpage_indexability', - /* translators: %1$s expands to OnPage.org */ - 'label' => sprintf( __( 'The %1$s integration checks daily if your site is still indexable by search engines and notifies you when this is not the case.', 'wordpress-seo' ), 'OnPage.org' ), - ), - (object) array( - 'name' => __( 'Admin bar menu', 'wordpress-seo' ), - 'setting' => 'enable_admin_bar_menu', - /* translators: %1$s expands to Yoast SEO*/ - 'label' => sprintf( __( 'The %1$s admin bar menu contains useful links to third-party tools for analyzing pages and makes it easy to see if you have new notifications.', 'wordpress-seo' ), 'Yoast SEO' ), - ), - (object) array( - 'name' => __( 'Cornerstone content', 'wordpress-seo' ), - 'setting' => 'enable_cornerstone_content', - /* translators: 1: open link tag 2: close link tag */ - 'label' => sprintf( - __( 'The Cornerstone content functionality enables you to mark and filter cornerstone content on your website. %1$sRead more about how cornerstone content can help you improve your site structure.%2$s', 'wordpress-seo' ), - '', - '' - ), - ), -); - -/** - * Filter to add feature toggles from add-ons. - * - * @param array $feature_toggles Array with feature toggle objects where each object should have a `name`, `setting` and `label` property. - */ -$feature_toggles = apply_filters( 'wpseo_feature_toggles', $feature_toggles ); - -?> -

    - - - -

    name ); ?>

    -

    - toggle_switch( - $feature->setting, - array( - 'on' => __( 'Enabled', 'wordpress-seo' ), - 'off' => __( 'Disabled', 'wordpress-seo' ), - ), - $feature->label - ); - ?> -

    -
    - - - -hidden( 'show_onboarding_notice', 'wpseo_show_onboarding_notice' ); -?> diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/general.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/general.php deleted file mode 100644 index a534c27f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/general.php +++ /dev/null @@ -1,63 +0,0 @@ -' . esc_html__( 'Configuration wizard', 'wordpress-seo' ) . ''; - ?> -

    - -

    -

    - -

    - -
    -' . esc_html__( 'Credits', 'wordpress-seo' ) . ''; -?> -

    - -

    - -

    - -

    -
    -' . esc_html__( 'Restore default settings', 'wordpress-seo' ) . ''; -?> -

    - -

    - -

    - -

    diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/knowledge-graph.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/knowledge-graph.php deleted file mode 100644 index 35ee01c8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/knowledge-graph.php +++ /dev/null @@ -1,50 +0,0 @@ -' . esc_html__( 'Website name', 'wordpress-seo' ) . ''; -?> -

    - -

    -textinput( 'website_name', __( 'Website name', 'wordpress-seo' ), array( 'placeholder' => get_bloginfo( 'name' ) ) ); -$yform->textinput( 'alternate_website_name', __( 'Alternate name', 'wordpress-seo' ) ); - -echo '

    ' . esc_html__( 'Company or person', 'wordpress-seo' ) . '

    '; -?> -

    - -

    -select( 'company_or_person', __( 'Company or person', 'wordpress-seo' ), array( - '' => __( 'Choose whether you\'re a company or person', 'wordpress-seo' ), - 'company' => __( 'Company', 'wordpress-seo' ), - 'person' => __( 'Person', 'wordpress-seo' ), -) ); -?> - -
    -

    - textinput( 'company_name', __( 'Company name', 'wordpress-seo' ) ); - $yform->media_input( 'company_logo', __( 'Company logo', 'wordpress-seo' ) ); - ?> -
    - -
    -

    - textinput( 'person_name', __( 'Your name', 'wordpress-seo' ) ); ?> -
    diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/security.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/security.php deleted file mode 100644 index c5dde679..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/security.php +++ /dev/null @@ -1,22 +0,0 @@ -' . esc_html__( 'Security setting', 'wordpress-seo' ) . ''; - -$yform->toggle_switch( - 'disableadvanced_meta', - array( 'off' => __( 'Enabled', 'wordpress-seo' ), 'on' => __( 'Disabled', 'wordpress-seo' ) ), - /* translators: %1$s expands to Yoast SEO */ - sprintf( __( 'Advanced part of the %1$s meta box', 'wordpress-seo' ), 'Yoast SEO' ) -); - -/* translators: %1$s expands to Yoast SEO */ -echo '

    ', sprintf( __( 'The advanced section of the %1$s meta box allows a user to noindex posts or change the canonical. These are things you might not want if you don\'t trust your authors, so by default, only administrators can do this. Enabling the advanced box allows all users to change these settings.', 'wordpress-seo' ), 'Yoast SEO' ), '

    '; diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/site-analysis.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/site-analysis.php deleted file mode 100644 index 38d7929d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/dashboard/site-analysis.php +++ /dev/null @@ -1,17 +0,0 @@ -' . esc_html__( 'Webmaster Tools verification', 'wordpress-seo' ) . ''; -printf( '

    %s

    ', __( 'You can use the boxes below to verify with the different Webmaster Tools, if your site is already verified, you can just forget about these. Enter the verify meta values for:', 'wordpress-seo' ) ); - -$yform->textinput( 'msverify', '' . __( 'Bing Webmaster Tools', 'wordpress-seo' ) . '' ); -$yform->textinput( 'googleverify', 'Google Search Console' ); -$yform->textinput( 'yandexverify', '' . __( 'Yandex Webmaster Tools', 'wordpress-seo' ) . '' ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/archives.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/archives.php deleted file mode 100644 index 9fc2498f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/archives.php +++ /dev/null @@ -1,69 +0,0 @@ -'; -/* translators: %1$s / %2$s: links to an article about duplicate content on yoast.com */ -printf( __( 'If you\'re running a one author blog, the author archive will be exactly the same as your homepage. This is what\'s called a %1$sduplicate content problem%2$s.', 'wordpress-seo' ), '', '' ); -echo ' '; -/* translators: %s expands to noindex, follow */ -printf( __( 'If this is the case on your site, you can choose to either disable it (which makes it redirect to the homepage), or to add %s to it so it doesn\'t show up in the search results.', 'wordpress-seo' ), 'noindex,follow' ); -echo ' '; -echo __( 'Note that links to archives might be still output by your theme and you would need to remove them separately.', 'wordpress-seo' ); -echo ' '; -_e( 'Date-based archives could in some cases also be seen as duplicate content.', 'wordpress-seo' ); -echo '

    '; - -echo "
    "; -echo '

    ' . esc_html__( 'Author archives settings', 'wordpress-seo' ) . '

    '; -$yform->toggle_switch( 'disable-author', array( - 'off' => __( 'Enabled', 'wordpress-seo' ), - 'on' => __( 'Disabled', 'wordpress-seo' ), -), __( 'Author archives', 'wordpress-seo' ) ); - -echo "
    "; -$yform->textinput( 'title-author-wpseo', __( 'Title template', 'wordpress-seo' ), 'template author-template' ); -$yform->textarea( 'metadesc-author-wpseo', __( 'Meta description template', 'wordpress-seo' ), array( 'class' => 'template author-template' ) ); -if ( $options['usemetakeywords'] === true ) { - $yform->textinput( 'metakey-author-wpseo', __( 'Meta keywords template', 'wordpress-seo' ) ); -} -$yform->toggle_switch( 'noindex-author-wpseo', $index_switch_values, __( 'Meta Robots', 'wordpress-seo' ) ); -echo '
    '; -echo '
    '; - -echo '
    '; - -echo "
    "; -echo '

    ' . esc_html__( 'Date archives settings', 'wordpress-seo' ) . '

    '; -$yform->toggle_switch( 'disable-date', array( - 'off' => __( 'Enabled', 'wordpress-seo' ), - 'on' => __( 'Disabled', 'wordpress-seo' ), -), __( 'Date archives', 'wordpress-seo' ) ); - -echo "
    "; -$yform->textinput( 'title-archive-wpseo', __( 'Title template', 'wordpress-seo' ), 'template date-template' ); -$yform->textarea( 'metadesc-archive-wpseo', __( 'Meta description template', 'wordpress-seo' ), array( 'class' => 'template date-template' ) ); -$yform->toggle_switch( 'noindex-archive-wpseo', $index_switch_values, __( 'Meta Robots', 'wordpress-seo' ) ); -echo '
    '; -echo '
    '; - -echo '
    '; - -echo '
    '; -echo '

    ' . esc_html__( 'Special Pages', 'wordpress-seo' ) . '

    '; -/* translators: %s expands to noindex, follow */ -echo '

    ' . sprintf( __( 'These pages will be %s by default, so they will never show up in search results.', 'wordpress-seo' ), 'noindex, follow' ) . '

    '; -echo '

    ' . __( 'Search pages', 'wordpress-seo' ) . '
    '; -$yform->textinput( 'title-search-wpseo', __( 'Title template', 'wordpress-seo' ), 'template search-template' ); -echo '

    '; -echo '

    ' . __( '404 pages', 'wordpress-seo' ) . '
    '; -$yform->textinput( 'title-404-wpseo', __( 'Title template', 'wordpress-seo' ), 'template error404-template' ); -echo '

    '; -echo '
    '; diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/general.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/general.php deleted file mode 100644 index 4614b0b2..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/general.php +++ /dev/null @@ -1,22 +0,0 @@ -light_switch( 'forcerewritetitle', __( 'Force rewrite titles', 'wordpress-seo' ) ); - echo '

    ', sprintf( __( '%1$s has auto-detected whether it needs to force rewrite the titles for your pages, if you think it\'s wrong and you know what you\'re doing, you can change the setting here.', 'wordpress-seo' ), 'Yoast SEO' ) . '

    '; -} - -echo '

    ' . esc_html__( 'Title Separator', 'wordpress-seo' ) . '

    '; - -$legend = __( 'Title separator symbol', 'wordpress-seo' ); -$legend_attr = array( 'class' => 'radiogroup screen-reader-text' ); -$yform->radio( 'separator', WPSEO_Option_Titles::get_instance()->get_separator_options(), $legend, $legend_attr ); -echo '

    ', __( 'Choose the symbol to use as your title separator. This will display, for instance, between your post title and site name.', 'wordpress-seo' ), ' ', __( 'Symbols are shown in the size they\'ll appear in the search results.', 'wordpress-seo' ), '

    '; diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/home.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/home.php deleted file mode 100644 index 3543e28a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/home.php +++ /dev/null @@ -1,32 +0,0 @@ -'; - echo '

    ', esc_html__( 'Homepage', 'wordpress-seo' ), '

    '; - $yform->textinput( 'title-home-wpseo', __( 'Title template', 'wordpress-seo' ), 'template homepage-template' ); - $yform->textarea( 'metadesc-home-wpseo', __( 'Meta description template', 'wordpress-seo' ), array( 'class' => 'template homepage-template' ) ); - if ( $options['usemetakeywords'] === true ) { - $yform->textinput( 'metakey-home-wpseo', __( 'Meta keywords template', 'wordpress-seo' ) ); - } - echo ''; -} -else { - echo '

    ', esc_html__( 'Homepage & Front page', 'wordpress-seo' ), '

    '; - echo '

    '; - /* translators: 1: link open tag; 2: link close tag. */ - printf( __( 'You can determine the title and description for the front page by %1$sediting the front page itself »%2$s', 'wordpress-seo' ), '', '' ); - echo '

    '; - if ( get_option( 'page_for_posts' ) > 0 ) { - /* translators: 1: link open tag; 2: link close tag. */ - echo '

    ', sprintf( __( 'You can determine the title and description for the blog page by %1$sediting the blog page itself »%2$s', 'wordpress-seo' ), '', '' ), '

    '; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/other.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/other.php deleted file mode 100644 index 76abe5c8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/other.php +++ /dev/null @@ -1,23 +0,0 @@ -', esc_html__( 'Sitewide meta settings', 'wordpress-seo' ), ''; - -$yform->toggle_switch( 'noindex-subpages-wpseo', $index_switch_values, __( 'Subpages of archives', 'wordpress-seo' ) ); -echo '

    ', __( 'If you want to prevent /page/2/ and further of any archive to show up in the search results, set this to "noindex".', 'wordpress-seo' ), '

    '; - -$yform->light_switch( 'usemetakeywords', __( 'Use meta keywords tag?', 'wordpress-seo' ) ); -echo '

    ', __( 'I don\'t know why you\'d want to use meta keywords, but if you want to, enable this.', 'wordpress-seo' ), '

    '; - -/* translators: %s expands to noodp */ -$yform->light_switch( 'noodp', sprintf( __( 'Force %s meta robots tag sitewide', 'wordpress-seo' ), 'noodp' ) ); -/* translators: %s expands to noodp */ -echo '

    ', sprintf( __( 'Prevents search engines from using the DMOZ description in the search results for all pages on this site. Note: If you set a custom description for a page or post, it will have the %s tag regardless of this setting.', 'wordpress-seo' ), 'noodp' ), '

    '; diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/post-types.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/post-types.php deleted file mode 100644 index 76aa46f0..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/post-types.php +++ /dev/null @@ -1,80 +0,0 @@ - true ), 'objects' ); -$index_switch_values = array( - 'off' => 'index', - 'on' => 'noindex', -); - -if ( is_array( $post_types ) && $post_types !== array() ) { - foreach ( $post_types as $post_type ) { - $name = $post_type->name; - echo "
    "; - echo '

    ' . esc_html( ucfirst( $post_type->labels->name ) ) . '

    '; - if ( $options['redirectattachment'] === true && $name === 'attachment' ) { - // The `inline` CSS class prevents the notice from being moved to the top via JavaScript. - echo '

    '; - /* translators: %1$s and %2$s expand to a link to the SEO Permalinks settings page. */ - echo sprintf( __( 'As you are redirecting attachment URLs to parent post URLs, these settings will currently only have an effect on unattached media items! So remember: If you change the %1$sattachment redirection setting%2$s in the future, the below settings will take effect for *all* media items.', 'wordpress-seo' ), '', '' ); - echo '

    '; - } - $yform->textinput( 'title-' . $name, __( 'Title template', 'wordpress-seo' ), 'template posttype-template' ); - $yform->textarea( 'metadesc-' . $name, __( 'Meta description template', 'wordpress-seo' ), array( 'class' => 'template posttype-template' ) ); - if ( $options['usemetakeywords'] === true ) { - $yform->textinput( 'metakey-' . $name, __( 'Meta keywords template', 'wordpress-seo' ) ); - } - $yform->toggle_switch( 'noindex-' . $name, $index_switch_values, __( 'Meta Robots', 'wordpress-seo' ) ); - $yform->toggle_switch( 'showdate-' . $name, array( - 'on' => __( 'Show', 'wordpress-seo' ), - 'off' => __( 'Hide', 'wordpress-seo' ), - ), __( 'Date in Snippet Preview', 'wordpress-seo' ) ); - $yform->toggle_switch( 'hideeditbox-' . $name, array( - 'off' => __( 'Show', 'wordpress-seo' ), - 'on' => __( 'Hide', 'wordpress-seo' ), - /* translators: %1$s expands to Yoast SEO */ - ), sprintf( __( '%1$s Meta Box', 'wordpress-seo' ), 'Yoast SEO' ) ); - echo '
    '; - /** - * Allow adding a custom checkboxes to the admin meta page - Post Types tab - * - * @api WPSEO_Admin_Pages $yform The WPSEO_Admin_Pages object - * @api String $name The post type name - */ - do_action( 'wpseo_admin_page_meta_post_types', $yform, $name ); - echo '

    '; - } - unset( $post_type ); -} -unset( $post_types ); - -$post_types = get_post_types( array( '_builtin' => false, 'has_archive' => true ), 'objects' ); -if ( is_array( $post_types ) && $post_types !== array() ) { - echo '

    ' . esc_html__( 'Custom Post Type Archives', 'wordpress-seo' ) . '

    '; - echo '

    ' . __( 'Note: instead of templates these are the actual titles and meta descriptions for these custom post type archive pages.', 'wordpress-seo' ) . '

    '; - foreach ( $post_types as $post_type ) { - $name = $post_type->name; - echo '

    ' . esc_html( ucfirst( $post_type->labels->name ) ) . '

    '; - $yform->textinput( 'title-ptarchive-' . $name, __( 'Title', 'wordpress-seo' ), 'template posttype-template' ); - $yform->textarea( 'metadesc-ptarchive-' . $name, __( 'Meta description', 'wordpress-seo' ), array( 'class' => 'template posttype-template' ) ); - if ( $options['usemetakeywords'] === true ) { - $yform->textinput( 'metakey-ptarchive-' . $name, __( 'Meta keywords', 'wordpress-seo' ) ); - } - if ( $options['breadcrumbs-enable'] === true ) { - $yform->textinput( 'bctitle-ptarchive-' . $name, __( 'Breadcrumbs title', 'wordpress-seo' ) ); - } - $yform->toggle_switch( 'noindex-ptarchive-' . $name, $index_switch_values, __( 'Meta Robots', 'wordpress-seo' ) ); - - echo '

    '; - } - unset( $post_type ); -} -unset( $post_types ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/taxonomies.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/taxonomies.php deleted file mode 100644 index 2c4f3c30..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/metas/taxonomies.php +++ /dev/null @@ -1,57 +0,0 @@ - true ), 'objects' ); -if ( is_array( $taxonomies ) && $taxonomies !== array() ) { - foreach ( $taxonomies as $tax ) { - // Explicitly hide all the core taxonomies we never want to do stuff for. - if ( in_array( $tax->name, array( 'link_category', 'nav_menu' ) ) ) { - continue; - } - - echo '

    ' . esc_html( ucfirst( $tax->labels->name ) ) . '

    '; - if ( $tax->name === 'post_format' ) { - $yform->light_switch( - 'disable-post_format', - __( 'Format-based archives', 'wordpress-seo' ), - array( __( 'Enabled', 'wordpress-seo' ), __( 'Disabled', 'wordpress-seo' ) ), - false - ); - } - echo "
    "; - $yform->textinput( 'title-tax-' . $tax->name, __( 'Title template', 'wordpress-seo' ), 'template taxonomy-template' ); - $yform->textarea( 'metadesc-tax-' . $tax->name, __( 'Meta description template', 'wordpress-seo' ), array( 'class' => 'template taxonomy-template' ) ); - if ( $options['usemetakeywords'] === true ) { - $yform->textinput( 'metakey-tax-' . $tax->name, __( 'Meta keywords template', 'wordpress-seo' ) ); - } - $yform->toggle_switch( 'noindex-tax-' . $tax->name, $index_switch_values, __( 'Meta Robots', 'wordpress-seo' ) ); - if ( $tax->name !== 'post_format' ) { - /* translators: %1$s expands to Yoast SEO */ - $yform->toggle_switch( 'hideeditbox-tax-' . $tax->name, - array( - 'off' => __( 'Show', 'wordpress-seo' ), - 'on' => __( 'Hide', 'wordpress-seo' ), - /* translators: %1$s expands to Yoast SEO */ - ), sprintf( __( '%1$s Meta Box', 'wordpress-seo' ), 'Yoast SEO' ) ); - } - /** - * Allow adding custom checkboxes to the admin meta page - Taxonomies tab - * - * @api WPSEO_Admin_Pages $yform The WPSEO_Admin_Pages object - * @api Object $tax The taxonomy - */ - do_action( 'wpseo_admin_page_meta_taxonomies', $yform, $tax ); - echo '

    '; - echo '
    '; - } - unset( $tax ); -} -unset( $taxonomies ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/exclude-post.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/exclude-post.php deleted file mode 100644 index 857c6261..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/exclude-post.php +++ /dev/null @@ -1,16 +0,0 @@ -' . esc_html__( 'Excluded posts settings', 'wordpress-seo' ) . ''; - -/* Translators: %1$s: expands to '1,2,99,100' */ -echo '

    ', sprintf( __( 'You can exclude posts from the sitemap by entering a comma separated string with the Post ID\'s. The format will become something like: %1$s.', 'wordpress-seo' ), '1,2,99,100' ), '

    '; -$yform->textinput( 'excluded-posts', __( 'Posts to exclude', 'wordpress-seo' ) ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/general.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/general.php deleted file mode 100644 index 0ca84c8a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/general.php +++ /dev/null @@ -1,38 +0,0 @@ -' . esc_html__( 'Your XML Sitemap', 'wordpress-seo' ) . ''; - -if ( $options['enablexmlsitemap'] === true ) { - echo '

    '; - printf( - /* translators: %1$s opening tag of the link to the Sitemap, %2$s closing tag for the link. */ - esc_html__( 'You can find your XML Sitemap here: %1$sXML Sitemap%2$s', 'wordpress-seo' ), - '', - '' - ); - echo '
    '; - echo '
    '; - _e( 'You do not need to generate the XML sitemap, nor will it take up time to generate after publishing a post.', 'wordpress-seo' ); - echo '

    '; -} -else { - echo '

    ', __( 'Save your settings to activate your XML Sitemap.', 'wordpress-seo' ), '

    '; -} - -echo '

    ' . esc_html__( 'Entries per sitemap page', 'wordpress-seo' ) . '

    '; -?> -

    - -

    - -textinput( 'entries-per-page', __( 'Max entries per sitemap', 'wordpress-seo' ) ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/post-types.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/post-types.php deleted file mode 100644 index bfc611aa..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/post-types.php +++ /dev/null @@ -1,40 +0,0 @@ -' . esc_html__( 'Post types sitemap settings', 'wordpress-seo' ) . ''; - -$switch_values = array( - 'off' => __( 'In sitemap', 'wordpress-seo' ), - 'on' => __( 'Not in sitemap', 'wordpress-seo' ), -); - -/** - * Filter the post types to present in interface for exclusion. - * - * @param array $post_types Array of post type objects. - */ -$post_types = apply_filters( 'wpseo_sitemaps_supported_post_types', get_post_types( array( 'public' => true ), 'objects' ) ); -if ( is_array( $post_types ) && $post_types !== array() ) { - foreach ( $post_types as $pt ) { - $yform->toggle_switch( - 'post_types-' . $pt->name . '-not_in_sitemap', - $switch_values, - $pt->labels->name . ' (' . $pt->name . ')' - ); - /** - * Allow adding custom checkboxes to the admin sitemap page - Post Types tab - * - * @api Yoast_Form $yform The Yoast_Form object - * @api Object $pt The post type - */ - do_action( 'wpseo_admin_page_sitemap_post_types', $yform, $pt ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/taxonomies.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/taxonomies.php deleted file mode 100644 index 8068c7b5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/taxonomies.php +++ /dev/null @@ -1,41 +0,0 @@ -' . esc_html__( 'Taxonomies sitemap settings', 'wordpress-seo' ) . ''; - -/** - * Filter the taxonomies to present in interface for exclusion. - * - * @param array $taxonomies Array of taxonomy objects. - */ -$taxonomies = apply_filters( 'wpseo_sitemaps_supported_taxonomies', get_taxonomies( array( 'public' => true ), 'objects' ) ); -if ( is_array( $taxonomies ) && $taxonomies !== array() ) { - foreach ( $taxonomies as $tax ) { - // Explicitly hide all the core taxonomies we never want in our sitemap. - if ( in_array( $tax->name, array( 'link_category', 'nav_menu' ) ) ) { - continue; - } - - $title_options = WPSEO_Options::get_option( 'wpseo_titles' ); - - if ( 'post_format' === $tax->name && ! empty( $title_options['disable-post_format'] ) ) { - continue; - } - - if ( isset( $tax->labels->name ) && trim( $tax->labels->name ) != '' ) { - $yform->toggle_switch( - 'taxonomies-' . $tax->name . '-not_in_sitemap', - $switch_values, - $tax->labels->name . ' (' . $tax->name . ')' - ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/user-sitemap.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/user-sitemap.php deleted file mode 100644 index cf718a4d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/sitemaps/user-sitemap.php +++ /dev/null @@ -1,41 +0,0 @@ -' . esc_html__( 'User sitemap settings', 'wordpress-seo' ) . ''; - -$yform->toggle_switch( - 'disable_author_sitemap', - array( 'off' => __( 'Enabled', 'wordpress-seo' ), 'on' => __( 'Disabled', 'wordpress-seo' ) ), - __( 'Author / user sitemap', 'wordpress-seo' ) -); - -printf( '

    %s

    ', __( 'The user sitemap contains the author archive URLs for every user on your site.', 'wordpress-seo' ) ); - -echo '
    '; - -$switch_values = array( - 'off' => __( 'In sitemap', 'wordpress-seo' ), - 'on' => __( 'Not in sitemap', 'wordpress-seo' ), -); -$yform->toggle_switch( 'disable_author_noposts', $switch_values, __( 'Users without posts', 'wordpress-seo' ) ); - -printf( '

    %s

    ', __( 'You can choose to not include users without posts.', 'wordpress-seo' ) ); - -$roles = WPSEO_Utils::get_roles(); -unset( $roles['subscriber'] ); -if ( is_array( $roles ) && $roles !== array() ) { - echo '

    ' . esc_html__( 'Filter specific user roles', 'wordpress-seo' ) . '

    '; - foreach ( $roles as $role_key => $role_name ) { - $yform->toggle_switch( 'user_role-' . $role_key . '-not_in_sitemap', $switch_values, $role_name ); - } -} - -echo '
    '; diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/accounts.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/accounts.php deleted file mode 100644 index 728dfc5b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/accounts.php +++ /dev/null @@ -1,27 +0,0 @@ -' . esc_html__( 'Your social profiles', 'wordpress-seo' ) . ''; - -echo '

    '; -_e( 'To let search engines know which social profiles are associated to this site, enter them below:', 'wordpress-seo' ); -echo '

    '; - -$yform->textinput( 'facebook_site', __( 'Facebook Page URL', 'wordpress-seo' ) ); -$yform->textinput( 'twitter_site', __( 'Twitter Username', 'wordpress-seo' ) ); -$yform->textinput( 'instagram_url', __( 'Instagram URL', 'wordpress-seo' ) ); -$yform->textinput( 'linkedin_url', __( 'LinkedIn URL', 'wordpress-seo' ) ); -$yform->textinput( 'myspace_url', __( 'MySpace URL', 'wordpress-seo' ) ); -$yform->textinput( 'pinterest_url', __( 'Pinterest URL', 'wordpress-seo' ) ); -$yform->textinput( 'youtube_url', __( 'YouTube URL', 'wordpress-seo' ) ); -$yform->textinput( 'google_plus_url', __( 'Google+ URL', 'wordpress-seo' ) ); - -do_action( 'wpseo_admin_other_section' ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/facebook.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/facebook.php deleted file mode 100644 index 7fbbe61d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/facebook.php +++ /dev/null @@ -1,54 +0,0 @@ -' . esc_html__( 'Facebook settings', 'wordpress-seo' ) . ''; - -$yform->light_switch( 'opengraph', __( 'Add Open Graph meta data', 'wordpress-seo' ) ); - -?> -

    - <head> */ - printf( __( 'Add Open Graph meta data to your site\'s %s section, Facebook and other social networks use this data when your pages are shared.', 'wordpress-seo' ), '<head>' ); - ?> -

    - -' . esc_html__( 'Frontpage settings', 'wordpress-seo' ) . ''; - echo '

    ' . esc_html__( 'These are the title, description and image used in the Open Graph meta tags on the front page of your site.', 'wordpress-seo' ) . '

    '; - - $yform->media_input( 'og_frontpage_image', __( 'Image URL', 'wordpress-seo' ) ); - $yform->textinput( 'og_frontpage_title', __( 'Title', 'wordpress-seo' ) ); - $yform->textinput( 'og_frontpage_desc', __( 'Description', 'wordpress-seo' ) ); - - // Offer copying of meta description. - $meta_options = get_option( 'wpseo_titles' ); - echo ''; - echo '

    ', esc_html__( 'Copy home meta description', 'wordpress-seo' ), '

    '; - -} - -echo '

    ' . esc_html__( 'Default settings', 'wordpress-seo' ) . '

    '; - -$yform->media_input( 'og_default_image', __( 'Image URL', 'wordpress-seo' ) ); - -?> -

    - -

    - -show_form(); - -do_action( 'wpseo_admin_opengraph_section' ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/google.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/google.php deleted file mode 100644 index 9008b874..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/google.php +++ /dev/null @@ -1,18 +0,0 @@ -' . esc_html__( 'Google+ settings', 'wordpress-seo' ) . ''; - -printf( '

    %s

    ', __( 'If you have a Google+ page for your business, add that URL here and link it on your Google+ page\'s about page.', 'wordpress-seo' ) ); - -$yform->textinput( 'plus-publisher', __( 'Google Publisher Page', 'wordpress-seo' ) ); - -do_action( 'wpseo_admin_googleplus_section' ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/pinterest.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/pinterest.php deleted file mode 100644 index b9cace38..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/pinterest.php +++ /dev/null @@ -1,23 +0,0 @@ -' . esc_html__( 'Pinterest settings', 'wordpress-seo' ) . ''; - -printf( '

    %s

    ', __( 'Pinterest uses Open Graph metadata just like Facebook, so be sure to keep the Open Graph checkbox on the Facebook tab checked if you want to optimize your site for Pinterest.', 'wordpress-seo' ) ); -printf( '

    %s

    ', __( 'If you have already confirmed your website with Pinterest, you can skip the step below.', 'wordpress-seo' ) ); - -/* translators: %1$s / %2$s expands to a link to pinterest.com's help page. */ -$p = sprintf( __( 'To %1$sconfirm your site with Pinterest%2$s, add the meta tag here:', 'wordpress-seo' ), '', '' ); -printf( '

    %s

    ', $p ); - -$yform->textinput( 'pinterestverify', __( 'Pinterest confirmation', 'wordpress-seo' ) ); - -do_action( 'wpseo_admin_pinterest_section' ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/twitterbox.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/twitterbox.php deleted file mode 100644 index 9bc06bb4..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/social/twitterbox.php +++ /dev/null @@ -1,24 +0,0 @@ -' . esc_html__( 'Twitter settings', 'wordpress-seo' ) . ''; - -$yform->light_switch( 'twitter', __( 'Add Twitter card meta data', 'wordpress-seo' ) ); - -/* translators: %s expands to <head> */ -$p = sprintf( __( 'Add Twitter card meta data to your site\'s %s section.', 'wordpress-seo' ), '<head>' ); -printf( '

    %s

    ', $p ); - -echo '
    '; - -$yform->select( 'twitter_card_type', __( 'The default card type to use', 'wordpress-seo' ), WPSEO_Option_Social::$twitter_card_types ); - -do_action( 'wpseo_admin_twitter_section' ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/import-seo.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/import-seo.php deleted file mode 100644 index 6f26731d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/import-seo.php +++ /dev/null @@ -1,39 +0,0 @@ - -

    - -

    ', '' ); -?>

    - -
    - checkbox( 'importheadspace', __( 'Import from HeadSpace2?', 'wordpress-seo' ) ); - $yform->checkbox( 'importaioseo', __( 'Import from All-in-One SEO?', 'wordpress-seo' ) ); - $yform->checkbox( 'importwoo', __( 'Import from WooThemes SEO framework?', 'wordpress-seo' ) ); - $yform->checkbox( 'importwpseo', __( 'Import from wpSEO', 'wordpress-seo' ) ); - - do_action( 'wpseo_import_other_plugins' ); - ?> -
    - checkbox( 'deleteolddata', __( 'Delete the old data after import? (recommended)', 'wordpress-seo' ) ); - ?> -
    - -
    diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-export.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-export.php deleted file mode 100644 index a9e15c3a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-export.php +++ /dev/null @@ -1,26 +0,0 @@ -

    -
    - checkbox( 'include_taxonomy_meta', __( 'Include Taxonomy Metadata', 'wordpress-seo' ) ); ?>
    - - -
    diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-import.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-import.php deleted file mode 100644 index d4bff8db..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tabs/tool/wpseo-import.php +++ /dev/null @@ -1,26 +0,0 @@ - -
  17. ;2Z-H`e+G##@M0dHj_?NMiY#X8y|0b4f^_QIs6> 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�}zid*$upGGzUzXz6o|iD=K_DlC2*zKlH(Yb|G4Kab04e3?Qaf_Z_U z4kIU-Da@e?I1w3n^UV(vGXUR}^X)sAL%G=0h02R>x!Rs=)5o_}U_9>lD=IoDSQ=-I z0ny0Bq%uMt84#L#1kn$2!;qFZpgTC4&Ves@L3?u0L|+;c_oD!Fe8fZBg^kQM)tSM! z?x)~0t)spVuGW1N&~Jgj5&HHbC(Z##V1dK+L>)p;=5xXkx^lY$pCI%D-f&;wLGYr# zP+k^b^gH7t6GW{5f~a(XFgT8Kd?Fdgq3t%6I{s3iT zfc(Z-0MF>h7(km^QBfe)K@W(7qzeEJ_)q5Eus3oDZR`0FdPJ=CT;V`p5|HQILpb>Y zJ?aBzSZiMxhYFpNftEX~63t5CSk9U7x|F7Rf#H;;ZGnRbfEb=D6+4 z_dfWzY;!#J*em7M+Z+|VL~w>9S_MUgh-XV!7$8g*?ljO-oWs$WFoR~$MPK4&k|A$! zY8C`+52MnFlR?glBTwG6;bV`dcYu5CwGZm)Di%eBC+j})8T`6`!G}=D@LryScgjVd z1FeAI$MxWWiceZ*8y`4GxGX%~_Vh)wrzaiCyv3G>`_m`a3+P>Ty-&b`Rq)?)&%?`4 z{Ocb)scyDef4xypS64szsc0P0{Ls*gZ&te$zLwpkP*2$^Or8Twn|6LZrL7r-HR>4! z=-QG_LBEHO?6KF0r610}wnJWaxm~NN{C@ZeaB&><(GM*);U4{nlONQtUIEkvO4k(g z>~Y}U!~FR6-i`;usTBf-V5Q!g0-*%ltxHJI?^dUN2tEckn;#inGNhYY+RF4v<^Wk3|uZ ze+QZ_dmr(co|1(a>=?EN9iHKX;1e?nZZu1%Kx~Aq&0+f;j!o}Re#c$qJp0U5!@`pm zEHAw2s#dcIdKxodvKglY~%)m|Ihv$Wc=UtZ9rRPcqGtC zm>efeoY{F+;o$QV`1v;=spA$hWNhS#$p^9D$3dJ2*Sqta3?^T*v(>ii&2^Y>cO4LbI};O9bTap4i+|$H z%LP1aZz;3!M%_D&L@Y7-EDo$+CRXHhM*xo*zDC_{{G0vQjzXbm5lGReE$n~5xn=4& z@%%IEB4LZ8w=Um#@58dq@$}Pgl-q81OrAgRsNmA8b069Og;s9k+-tbh9{70ne*U-N zPs4ETy7R@h_}}i`V`bb4u3%pr9;2Q0fx#oWtd0G72TK2zdfA=BS z&UA9q%@1`7_OU8nPuNQEOq!2B{$l6f>e%%FZRs1E_s};~JSZWKl{j_37WWCqsuk$G z`s!24uI>TxF>bx-XPVm_S6_2`x%S#qL{~hw8ZQLu+1F-xF{YW4rI+1R3l!Vi7QW~< z_16x**sxwax!@Km{Inip9C3DdtU@6cG-_sM{C+)#os03`o8<}d{O<~FaeCafoX}p6 z!>!|cdp(ZBW<^_m?S2#r5q#n73Ivfbdnr_GrCRq7C8{l8cKfNPrQb(RIpx6e+#4^; z&mv$e;c3&a1%2@b9@E7DlYLyLoGx290-Yk-9M>N@h&J5=y^Ij2^KHgpAL=t<)aXN8 zpa-3JAdCA1A)_F461tc$q4TW5F~?pW@(K#-54r&j=$$r%{M1k2WLp${u#EtA!T-UN z_e?je3WPV`+j=|zQBT;YvUbl zgKYW)-Av+KW*H_<+RWvF&lc4E2z;RewBK~ogJqjTKLWMie$%UhW#1@Jgr_+RXam?E zz9GmZ)l*J6clM{CGwV-54?FDK^6ay3sJ4o}qrB|0IYF;;G@GK&L}R=PtT0U3#&=>| zWYMiPJ0v`=&(Nd!I&9dcP^fmATxREr=c%wCaYZ~3xDL(UHpV$F1eAf-pc@;Xb`D*- z4(NX#ufcyhDKe%Y7Q#OnuLZ#6JmMagm%c!Loge7gbnY>nvXhR-A#WE@SKyZqnkjkU zYXK+}BI&{CkqCf@gVY8-l!QJv-;8hbZ82lJRn~8oJMMJ6IWvt4+TjG|q#-!vgADo` zd`JHXZtTNCDGV06Vj)GH6-I->lnFfOL^8KQ5l(H%kOPTM$fO;-KyIBGED(eqdMN$0 z`eF4G-D|D0A03wd0>_1oyZ{RxjhC<&_>O^18`IZnFnfU(Z44cS9*sW~P4IaueBA!9 zr-1&&;u8G>$ETlunVC&kU&*9Sl0C&xV<+%5Xiu%alE2xKxS38DE&Ao*hj%U%cG`I~ zrmefW2dPVrBP%=uD69TP@Pj=odES2e!?Nx1$Rp2`Yp>g{#Hy)!j%}x{vlpeFRL6T% z`rKvqE0O-Nb?5^=$XTNFnurawDUu36BpAd4;6fpcV!1`3P`^&mjKWmJw*V#wi-Yj* zI9nXzm`9vK9Ht!*cjABRW3jqmPO@=Myl6u)Vf2hH&rHt18M3D1KVzR2uNFT-7gjhk zsk6=f06IY70sd$|#$4uYj=xkP#5ip^-wFi|Ixvp^of%$(BJh6|tlligbNu}CFZFCh z9|NpCnHYUL<2u2e&~SzxAiF14!;AhYK=L=oz%}RD=o+t}mEafWJctiZu)MbW9w&F4 z@tHB>I?zF)wSmdP$Yo3G%mWg@6GB?1lplLCGksy8W%ZS9bAGH)BricH`_#F?2K$ur z%omBC_!)@C{6ub1t>mwgtMjRin>ro;{Xgr}pDC`m;+{&%3^b{Dkn$@_1nDuf`4)$^ zDi*kQVRXM~+DJ%=TCXF5rrXo`9QR?f8=7g+CQGZVI>}^ba?Hf zyUB*L(_#TVbHo@kCIp8tn` z5!`V{de!z|Ma9FQ#(4n1tf_-MdC1_x)=uY278w%Fn@U9SqgL-ZP^vH`FEKm6|k6be0h_gO)G zE`|in|HV*r?h(}eq7B!Y{`y;I_1$>mL&`sM=rhW*&c0QP<#d1G0==Li{(6E|^qb8; z!TDu>_Nj43-yYmY9XL2oK|{P4ed3R^>k)VYFLd0%Fzh1${jeX}DKB{`ARpxgY_r`l z9e)Gj(#!6#AWa(KOVQr+C9MWrceG>Jm^#kO1$~h=`_WJ7Pqa1cm)5t=w1wLb{e~!e z(B5N@<8x1g@gqY@NFk5F==2d6XUOHw7l{By0{#lvC(h^tK21+^ z>K4vGgNN+G1t*QZ9;j=8{DH>?M_dnlNMf*Y&?c_xeAQL=cP#9-+4h(ics(&FT=(gL z3TGwFxJG?jG3WkAISJ4qaDWF48pw|8sR0BVh3pu_&?)Q^@&wPhssBUqjlG_lJ-GIS zJ=-LtP4!M)Plk|l$O;ADd`N2}lnkpPCFMUHYXM;c_>zD+MgTTn)syMYJ0Dp-|HA8K z+vB|RuBmmjO2ucxU-F?vzf+Md%9Q+7Q0Xg=r7C=jFS$egDX3oCEV}r%Dh#w%MB7WN zfYMWXV;7GP@Xt1dLi76${T3S#12ER1+vuA+R$Osg(Wq=M8Usu+v{A@Fo!xtH%p|H% zs_x&jTv0Py-Tj(P;A}}4!<^fVm9x1f=CfkjoOfpzfHOC-(Ie@)+m&Ob0QIgS1T3*pa{y~2BEWrav(eCg~J$r z@CPTd0t7)621UY}lOGSXbYjyn5*6eky>MPQvh(kOd`{hIX6V~*(@%PL-~9~whDn32Bcy$oC+ilC%z?f?yS^%%0d&q&!UiPo9u_0fte?Jd0`aS<0{7U=rgk=t&6K*f?i zm8}=IZnpU$)vQ9;r@ZRw+v?&X^8d*Cp+@HfvaW`W;r37+*g z?je4(0X(NT4Hhnm^ zTPt63*&Qfno=@-V1F8i-;639P<~Qx>IHaeIxtK6!0%B)bZIg(Z>(} z9JBeVBnrVSBod8&$#cxlFYE20SDnx*9(miQn;l$!XT^YuM->B_p%@sL$zraYKK(-Z zj0!BRX)rq3klRSnNEo$-Lv zu<8Fr&t~wszsE4nz*7G7`v~A5BOvb0L4V7~bXo?Zv3y;)^M9b6d=vEKYldI{`uCO< ze0e%0eXG649?H4K<8NKQLL07$FWXQcebR<>kZ0T6Sns~>@k|?Z8X$kG6MQx@W;STu zc>KW=0>E=2WIs$YN}PL5JN*lCUBm8|+6Z;qc+JfH&2N7H%3|TflP;dV({Ot2SJ;$o z;5JKt^(IOC>bqOg9@)V$vXw!M(VvSkY&6{4^-0)l7raX1LZp3@ucdE*V(RHE!B4DTX%j41AJh z;b{0MoBWRe3;udVLE*u98%yK$oi=UneCMZHop@aG6$g?C_@hmEeA*B68h{fNja~UV z$>4X`Ds6%?HhPk#N1cU za(Oxa1oyhvxKL*R7ru z1J8Tj>$h2)p10@jc^hQAUgO4o7*FAolM0id+va-SGd%^m zA1y5sPCohWObBp5C+l_&+(@ogoCKCWNTiJq{0}9;;j2&e=lB881Ysf|GASAllQU#U zdYmX3G;NU7m6N0m7k%qovvVg!1^43Pz3=_>lG*F8wokk1y;1B;AV)#rBss`Qk!(me z`*R%2f&G9J_5htWT(U{XRx&A>70@4W4!@`%i2nUV%>+L!8y|7A+!LpLQ{FhPK}=?l2MR6a%%PGn)XZKvuso-}2TE^7^EMJ^6HY_IpqlC<>IkNnhz* zx}g6uM)cZJcAj)N9usHr?)bqm6`RNxVw5HpDkNkt$67x~_U;>SeDn$kb0laF!1tto zugI57v7$f$Qy~&K6;c49-}k=HU24F0yyH`Zk4as)g#Q>aMsVO_wdA1P0R&->Y2}Gl zws+#H^8y*Q5;zMjc%wdogJo(AX_sP6ydR_H@{O3uvuY$VB#ykG?9|cWO zc9DEKVA^$*EC80V$E^*cc^OvW9M}=Y%j=~_Ps{{&p4P~I0`)g^CN&+KO|g+ZHT>vU zR;sc|Hv2ku?|G04p?9>8l1(<$R;7BABA&Al@5cc48~7QMA=`Ko1+eVt=ltD%jLEJF z1GVetHPa|Q$Y-zcF+J#0Abug+uHBL^6iF%+4D%eWd z+G87@^{nLq@Q!zS%E8&u=9)Ba4u1Owh0!0A*9eD~pIL0w%D^@EBv{inM(;t}xHENKIxM+?=KKaZMmJ+REkDy& zcBJ0`&@pVp?Pxcoug0J*V86YwAP4X~`r~qV;neZ8)5eK2iRkbnZ=Pa9J)wP>a!MrgIpt)3C_Swz6zaVbl+}~_vv2lmyZMj4)H=r4 zUfuXpoW~w}VZJ_@4V8InBmCsWM1vKdJGI*b*SSD;XxT*;^}h=r?=Pv*ItZHmC}1v#(8QJ`X?F21>?-%Za7Q6?p9scKpH*AU@F5k%XLLxMm(r#J2eq$Z$IeS^V`V!GjI<5Pg?@bAd4IZj^LDp;NM7pHlF4if zeM)`-#)p-+S!&1qF-1eZ_&7?e_05G{kyH6v6|@D#BbMPglh1O0l4G7!XI0pu9R5adGns`F}&EEI}pbfh8S|4sY`hg|yj z+(RG!;$o(bPHGg8$7bSe42VH0Q^6_#JQi#v87FTV7mFv*hVh9LM#4hHa?>oEc#)V$ z7wID~DMQIBx@Z_>)HsLHVhk5}bgVbM`NPW|f6aR|NKb)m1~{!_7gywgjw4c~?AU$a_uSlw_YaoK+_I<^FM=p|`BjcRa&B`ZCJiMV|4F{6n*Pf87u~c7l5c zhYO>6xlod{a12*&T7hv&+o3<(C%Q2{cr-q*#O$1sH2Xg9`EMA03i`0aZ#J!}w69^- z%&~7TOx#{ki40PxeVTlI9E;SBlR^8I^MZZMD>Ezen%W&B zKF6R!K``@g^MHSA?H=@?7jzByBOm!f!^M7w48*sUWxgB(rVZy?rrCV1hWQxpY}`+6 zh%Y$Sq+xuGw3U1~HtAlA7q!3t1C~GK@`4wmO~h z8E)AOamUUxYIaC`3E~XW_~K-nRsP3`>6g6;3Dz1jg~C%0=BtKzeKTm@T4{d+8^>n1 z&IZIqL37E#rd?Ed^W_af^EAsnr-~bbZxiT+RQ3La-2NEyCD}=C2R2hyaW;d#_&Q|M zuzUAi7yWkZf(+&>iv+D8-7tJiD%}r$I|frJt4NrYFKmtDr+sdHpC0pf==n!{Xl%z6#i`Zp32VifwP5Cc{c{|{FAIfv zODKVv5Z3uz0RzeTm9Khl*N7kggjbaknV>1C{&>BDpc!7f-e^?SjxsZD$_qwbboY3kNoED?JMZ9df6`(5>;?lD6CS^(VEO|v3xc%R1pdraiO|2 zQRa({#~gEhHf?4W-0U0va_XsfH@%(0=!87Akky3TW+|B;z%hD6@q`mDTI`j$>s=qe zeUE!SW&2?dd){IN;Casrygrbp8m5Boi-D!@a!A3!+bE82yLaE8Z#Z;w&@q zS*-?4{NJs|fA!nD?|!x1pF*itGXN+S>$o)5EogmE6<6Q=?hhuMXEnPzGIn+TB&VlV z(ekA)vxvA=Hc)0fkJ0mE_>pq}+Vvp(z@`J;q&s(PaV$n`bZ%1|&QWo`BWD~jev^mC z5P#rNV*$!Zaal3ea;*8`=<8>AaWTJ>u zRaNaQyq_*f6gRr@U6`x_G+cm$q+ zlZEAiv1OnP!cJDCiGbuTIci)M9?*5aJ(EG;0S|bdRga~~55ZtD9_f`XNiP9?%rgwV zOJ|(}w+f4;K>`H>9bU3B4g^WcwZ?-FJ@JVzTRP($6cJgz&$4sw^-r_vTV)Bog1P7^ zTk~xIFXOj2`dxrP92na{fGbtxHM8O*?nC+`&rkg$&qpOeHJ(eyf91dIC#j8$*WOVx zY9_bR$4RH$W&7nXf9qQKy#ey!ZL{iPsXqxit3Ub7_QuTi4A8`*bjrk?BW(KU*=38T zZmv4r&bY=T<6TGZg|F_*ZJrbdSw)%JU4SCNzPJF5ftcvTZX0txurDzN_LH!R{a*Ye zew;7M2l6TOrHo0haw+-11Oz~uElb5^`KoXXa!k=HS(qjk3S+R)0C}#y_xHW;{n*KA zCCpck>vm>(y>TRb2gEh-b$MNz|883=u%A2+9mX_zEbHN&@A~9m7yq-|=g{ed!;I~Q z!G^FVJ)4IpKRT@NW;UD+VsCoWdy@=TCW{mZ*S^l_S@KO{&pqxumX}R|EBWZ|i_lvN zb1T68#`0a==7baPxc%72K7YDZ^^x$f_N+bk;;+49%=6aPqyO4p1jj{8<3*+83H zoqoTrfq(Y1Uk~2Gx6w7ktyR|m`vz@reb&3Kb~9aH$#1{?hVT}zvs_z^en zktaE3X+KXkWLJGw5x_I_Frf=l$#db6TK&i@g6kNA&-1Ky;CrcQ$2O z_Myo!Cy95*j;8DLFSzgY>iZ{7GI;4974P{Kp#*nsQ*nb`?+lojA!h>6!Sp%D4S6#@>tJ=ik-o-x zi@Mu4#$$Z50ne7J3WYY<1TDdZh&q;`S0HM~GSG8(KcpLYKJ=l_gAplgWI!go38;-9 zKoV90$595Jb0x##p{^mhG7(ZKJ)>Y!wIeop6>J2oC?w|MZw5mpFQCaX-4OqUBT#)i z#UOR=qGYBvIR;?3bl^MO;mOk%-6n7lEuZ-m~BQ$ z|K(Udj%UVs4*!h2Y)Qpz$py9t*~`u-GwUfY;mMN$*V%c|VrlytQ?g8w4R2QppI2&d zrOV;U#q+JR(lOC?>4byh)6Z+xzL;%iQ|GlNIWCUZZpUlpc&){;U7H}+@>^@OIIsU( zy9o+cT`SyKdXFx`+l)RolTG9Z-`TaXH~oSqFJ8)q#H^GQ|M@>(n9PRO(3!7*?wokr z*r2ZvuVUVONxV_)A}%H%#vaGlvW>3a!WSzRX@X(Z<_Z&Z+G)@p*9y|#v=@Cm zpSeE@h5%?4|M-0?p!Owa^aUP_14CocAsGS>_*d3 zA2d@o@KtBr50JO>MI*C1F?pW}8@q*VK6NK*_ z;d#0id6XV$<7JmT+P*wVV4;DSM1Gx+XzS$9zDpXAtl;Z8N)}BHkwJ>I#&F>tE5Q__dbJTY)_hvW>qF8kHw2L%E3Bfq5X>nM9w3=A-Dbc=G*g}C33zsh&C zn*~T;0mniXAC#l$W85U)fwDcdg+2qcFT^3>2Hyb{8Km0x0Y!@XMN6Mu_Xy{DfQWldL4Zra8q32vP z^1|e7e&wuA?lbD5pL9txK(^p2A8m4e-0`=Y?kO+daekM(J`MB+gcmZGY|JbAQg7C; z0|(EI+r2mO<@49_m*Ey3gY|i~Hcj{a^lAQ-!WX~;MjqmY@%dvxFTfZ*K9ly+5z(r+0HduDP zrgP&0C>C|-#c>Q?p_QIYgNrW9moj#-OZwyk)`wRrWP7HkuN&Jj5~#*j930E4s|(?v zZit^b*!EA{^xqEtc>(z8#7PtiVv}aPkwp*pg#up_4%0IxyN0NTfu$M ze$duNxRPH5J0ipis!NXPxiO`O-m7Jn3#rU*o%y$lwiNtQ`N3yR+bNB;C&NugMi9 zqHsjXxV_BG%nZ}pv&_uQ%*?!dX_lFpnVG55RgNC{S-n2FmhbchOGkE9ec!?NfZgu0 zWaoYLd7l$c@vZq4GR&hdIWx7aLYF>N=x3jqrzraoImEW5ETaz&puzg6zt)!jGWq)J z?>Eb@u$N^H+1{7DF)(2p{0tBH8}Fm}D!!(O0q0E-gN!L3<8O|$JjYG4S^vl*`Q}*N zjeELV5O3K0_q?6N53;THjpbB!dtJ;8bT@xur*mWFExye0EUt}FkMNb_#`CzfCF(qU zZan{Tt%{?u>ubhCv{SM~;#=3REI--rW3Mau`aF~|S>rm|EFFq9uE#lk=m80D!JZ;l z%tN}Cg8~ZMX)dlfiDJ%2d+FWd&p-d%EVcCR4UNb~0M4!%8GO;eK73~E&>=q9ArPZG zud%`4uq->(=iz}KKCg2eOGgp>DfFDPZJf9N*bCW5de-{Tu!s#{=$rYsAZXvzK%7@r*Fj9n)~(2M=McJBE+=4%XU_#8$a5WB-F0 z<)LJtC$Rvd?6+MDM&A1QAAYk!`+xb}H|l%+Y3WZ~g?a0Xd@vQ72|jRfG@fm%WoSR= z^011}<==kD4e<+2Sp^?Gt#{q8OO!wIsp|~H(0?|ihMr~%Glzky(n z_!(bda%fN(fENKATLA-w#G2{8(H4CxNU2ZU z2YN_fA1m2iI0OvVYR^!i$JYzI4*Ss)JqBw4mAt7gDQ z7#YT>_`3EZAKuOxC=LdGb3<&wrFA#63C5IWHFhRca&PSW{IQH1927JsH zV^G$lcPcnY4w2)O#9B`fOgJ(Y0gmkx6-fu7@8_hC3!}hcU?}+oDu8HEVGH~#zXo{* zTF1lw_8QsY!7{DiV1vV(ufP6oE(b>|}+%V`;ve z4?f`>r2RpLhg%2s;iKKX`fs}V?%Djiq}l&~vzxQezCPX#_?l~O=XVO)PZQ?# z=4&X2Z>|UOx9rh5=e`=0d}99yXD+Jtn{eY{Qq9=B0yZRHIiA?cHRrDUi~i1A^M;6-2Nhj+6UQdi z0`t~+=Z*&wt#!5@#;FHM%Z^yGkG-Bj!HI9mfbjJbPr9y2k3TMaQVMxr zEklmXRP!;#rdIA#)AZV`b4}%%1g^0uG#V&_Jlp3r=Am=e-}{tgd+&Rmf#EMVcAq?% zpMBtWJta{@>SS`F7q-;Nr6DruSn%??+K)bOyPRA8wZ!_?!|jhi@vDIC?T4rO_DA(8 zfPLrKRk*7fSxuAVR*YLATY431^7Y&#O*Jm<_wj3-Z8zUcG&Jj9%XY(_D0V#8# z+P-uw^|Rc}a|~YA%lyr+@AKwe@oy>WW&RV=)OhhI{AwPRzt21W_GZ-Mz4tzuy~XeT ztgZQ0Hsu&ib+n7tP3A}9+{)v5Tuh-`#!>Kd&3D0qQ=0nWPZHW8;a~n`qwY@*Q}SD; zF=9dvOo3^r!1x$Cm~Xw#z8qt{d%#QO_qx71PxG3wZL4LLxlq^8 z{^YpC&;2oU8ngb?_RFW0j`>)+i|<4=tgh=G6jUTy!8y5G@XZoJNSto{hacv5GKU^| zX)NaEW23Ey9p!5_&d!5B>+NXon{skk57x~R0Jfty-01M`Hw`Yj=+5qkkRE>ch34_c zU+(Ds`=9G>M0Daw*S0sPYQF#)K_owwpa`Igw#f%RW(~ZNTQ%6aXpedx+)eJTyPj%B zJ)V8`jb`a(c2}&?m21I}bRcPw!!{U%<_Qh`t4qUZ2OIT4Kk4LdIToe>l)^L8B^|!-YXfzAnOzI!q|7e^P1R$ zJt%aHTCy^L69rIpPLuoU=#gu}{44 zN%7`QGF0O=T$wjH=vr)9#L)g!T|!QXx$(nVo;BoXC`<8n58|2!Rr?4&u2=Sf!9E5BlE;q50T2U1M>^hgGu?PekKJ}Vvthpy7$8k$FDDxX1$pqNA?cjf4E~O@`|f8ofB3`W&G+B`*!(#jci;W=?57b&s9_*eL3J|( z=$eFw{p)qaknS+TRRlKQ(A+_Vp(1 zZwIt@UYxzYL-%_UQ&Yqg`O;GbCl50|r$H56Lm?B6#ScELyA!G2oBf{od%yH|EEB0Xt5~MNq&GF)4g&43Kz2W*G@zYkkLP#4 z9RbgzgPW_b)fg+*6*$p(4WC79ZND3G6@xGgm$ibmdGHO*BHQJ2)?xGz;hc0V{0R!U zEgD*t8~)h6j$PoZLA#1`*2VkGL&LQ9X<)4F3-#2#QoLa6c5{8?!4y+{9g;2CG$#Jax~T6>*?n=7we*nIo#_sv{9o_gxl*^h|# zNB-Y4?SH@pr7sRU{4%XCLB2@HynXJkh2}<|y7|{lW$yKxeC^!pJGrmSYJR-8#P<{8xaayrPDUxdjVH!vDdx+?xjpTa-A0^?A`i1)}Z(!sv+e#IC4d4>;u;W@`T?`17KlAkh`y^i>m^$lI= zC&X7e${y!9=dw>TnTLJMxq5GrljHGlobWmNo3952EgUqHj#|fcjJsz$kK`V{w$n~0 zH=`cye@3jf+I}b}=c!O34?PAta4i)7PCnqGfGOd;uA?D9Z?WYu%^&{wMAxLoeSGo7 z*WH)#&N}Os?vs_RwmGiZbn~N|O*cETnVC7QIq9V9nuT{gsgK+%KdrU)K@PHY#~%P) z_G6zxLM+*%g5)@xhrx(0F;V4vH4#7wcG@p>j(W7W2A@BDDmYZ}9OmOhkG4}phV+B9 zcSv_13u`W*ZYCrkIQM>D(`;gMc5aBLbn^b3BgE5dJCbg)$-25gq9Zog_l}u;EqTV6 zed9u^nBxQaE!e_-__=mjF1U6qT|8A2r^BG-qMRBcwp)gA4%V<&7$Ao|92?Koz?3j8 z{M17$G6G)Xu;wOiAHqYJlP#*}(!(;D z9*$DJtA0VDcB@BXp9h7GsgzT((m;UmBn$#D_@@ZZ@sU)@;-nB{uEn+!x4-=xkDDyTQu3BtZja{F({6}g z=#!sbd#_n$b}jx}Z3pB;whz#gxTvs!Vfjbog!En&ch+e50*mP4B*riDBYD8Sp(c(U_-4pf z@qma^OByoCFV?ZgIy(Q*RX*kzUBw?hoMW$xwysf=jAhjYWP(31i)>>&UH^5%0MoV) zzoCmTDt+uD)*~Byh^P2~FJTUTmaTWJ%0p~328|QdS@d-u;2i!=wLk-lFsvL>a~C#Q zR}C}hqj-U^q(E<9b= z85C6P38a!wLAFseLiR4V!d~IN3T}dHuYC~wRP-c^U^$U257K$|OMd}=haFF99(?fm ztYq<#_81zJHxy1MyzF+I1Pb}u4ao0M zl3gbIS-yuiNvOu-HSL!;pLpVxk$(94>u;N_w>jSXhMTS9n~I%>9Anw~*)~7p7smow z8e}W%DGn)iDw64%c>5D44+56&JaY3Bf5lk!APj8EQz%?dIJK|gjbHJn?N$RV{3CxN z2U47{Ar8jMbvHn;Xzb~onb&e&awDE(lXKnJM~3&Z&at)6S%+RG;-NU;htY$f*1A5} z7O=}RgpH1mhi~&&OzdM1%-(N1@ttKOU$$b42UOcPT3_j|H!a%3KH{L)!kc~Vz6y`T zTbM|L0vAn*ksVA@;Lz>1Ke78Z|ER|oUw+ffEI31aL{0{Q-pMl#4ZhvE=bmSeYE0$F z;MZJxcl!m$074g+oaEAj=cA9gviwuW^vr2>JW4tB9<7&dvZeMtuiXeG%S9zM>GmEA z=?A2A?}<$}Ju>>0q!@$Lz=}16pM5UJH}ESOb8c|npQ+rNb@OYJZS--r)8`!*H{#lc z8c*3KudVIMaVX?l=X$^Ot>a}mb>30feXg#}$Ow%+*f>Tmq-&B<#6iusURTTa9@{+* zDb67W?Ykns*gFw-u)Q|R#h3(CY z3O+Syt&aVAsik*ojyd+K=FK-hXvTSb{`uF<+2`Eathn+%r7xmCv{rhG4n6FW@=rBP z=`~r8ze=j(y3(wV-+1GLa#+|z!@}fx*l+VI+)o|@cuc^*w}@hId}bf{+T{9PwFYH#`WZJh|KH=2Prhu9Ip)gtqkI>I>_A_a%=s$zEp4#j;qCVbx-T0RkEm0t z`!dV!-pOmJlVkg^9qP_=&IP!qh9o~;a>?&T>eBwg;yidszRoFb_z8K|Vb~6+)7k!X z{C%wlpQ8B+NAer8hy1d}n)^5Jyz_DSrP1~_*geHVe!!N53G0K6I&Mk6&|Y|;GZ?@Q zH#W%rlYC;*gI`N^K?ynvW8RnbGbtX%DEKh$J!n}kj**?u^}N=vW6ov06%S!k@+DW# z@TrTpb-`xuwSUaZm@s7@*dNq_Tnoud$E(T#UlV@CH|uSA_%rh}Zf$Q7;~XE(OBegj zxW*9ZfV{?92Xy~s@XRx>H{(7&`snlSHyM^% zde_zt>;`;1JIFrAdUWml;ikg6R?cEeENEVP?Y*c|`@0bXyDhVa-vNVSsRUs!YchC; zZSWfV0Z@`~vfDP#4@DLK4AFqsdg~qH@3`deEV$X?Q{#l!Dj4#Qix~O})9h;rSt=l* zAS>3yi1qlW=LUig@sSGHXtJMkBe0Ivw+BDW7XH{vyc~NCyTd-Uk0He#QXO|q@lYta z!lHQDkJ3L5%%QnE?pz0-&Znx`vM;|0B@fl_$W3IhU;c(a*IY}DQ|V<~J4ei0wj#S6 z23bptpgeecP$1cG7LF$|5_sH1u-R|_3!2NX_`~c+^)%bD9_?KhyH7Qin4vg00q_HQI7uB$1C|8wS`vQ1bGJRt z9Qg&xl~&%DJ?Jn5C^x@h8ERy#1Mut%14nA`$WtTMpa5n=N;P_7(7IxV2 zWPA)>LyRa~$l%!p*h2=f#81*09!^r_3~N-h@QVvSuOavmPu3!rJcNfEsG5ccw=mFv zDSUt&W6N@e`~$hzx$(jSeK;?SNiVKzA8XMM9;!hB!yYEdb>UcpC2NdT$DH%{kKu-R zp|kwTKIsNokD>jx9l6*nf67;?Z^#DY9zfVH-8>KlEX!{2B0oD`!}<$@Zp6+jW6485 zHBkAgxO>=eE#O#dttavoFArdieJ#u)%l?qhki$B!mtG#Yy~ld$lLumo4jL2$QZ*5Q zS`-`SuanDx-)!@v$Ni1~gG2jn`?1Gg?*8N8-g}>E9)IHH=JnU#pZGTy+P{e(cGxBD zzv-d3K@I>7T7lP%&dKJ4hbO@YAnliBM*8QVgD+yeo+aDK4mqxFU|x@o94o1LW}Qe$ zWgiJEdWWjymrvH!u#mrCy8G^Ds*%74+3@yYXZh%6AIo<84I4C>3;)8C^s9U(d0ba9 zkssw-4eA^Vo6b|m#MrVvtQBU&lQn6$vJLRWM#sSR7{~TM!?ygvI>o?wjPHyWUH4!h zLbe8UcnJ$oj<;|jpC%ivr(~j!)(m`TTVvgZpM6Q~a@@ThJuL(L%E#WL^CrKcU~N1v zd+gJMYsfWSe4USVeGPb(EDsloC4A`z~ zg3q}i`g}eXkDAc0uwQa&KgxDt)aPo-Lv@{FV`7oDwLg8XmO0K^VS#2)`?r^Etnug9 zab4nDVGTY;iR{2wF$BrKZrPg{- zFh%;GiLRU4Uz>d3!RMN}dGHRjy%|({i)QrrYond#pAvO%KTVlCJ$B|bG;i*GQ4b4# z9Dn@PtpB^A34H&*?VVL{WId9F{T}nQFT>3AJUlJc?)=<1%*G`TZDmAPeK^S zg6*bF?+n-Qz3=^G8T;AmBI34KU(2!VxG;uuHUwE5;Co)r*ykwL@V&ktMe}2Az_K(8 z-}%mun{htk$n*WUG3H|<29A4nJe#=nzxR0Jpx5vF<#UIB(K*FbI^cQ1Ih=E>Jid4_ z;{Z6KHF|uJ~Sa09n^t;XCK3MZNBocP+{z^JVw9yfQbUvoHzG@t8;?{%ZFJU}Hw z#^4!1G2!JD0<>JL$~blc1TF?*y!a&_DSskZ{#)b~`Pk+gZus)B`yM9`&wAGTX8vj| zBLHQB25ZXnd*t!ZNR5_Fg5(0u`A3T^N}Kz$KobOhVO-(t>nZGcww@e{t?pee;N*(@ zC`Qh3eH5A;iFMFS)+CvY@yutw*ZJ77}r{iX-Qt zz%Dvxz$FwuVh#*B4(DM!E7r^0<2n>Gig*rV>9q!;i}}2PK$8=26Z#StH5VBdjyNXP zA)f?W3R zwGKAsWs_tb%*Fq0+*J5Fz!)rONBDAO=U|f)aKi?`J&a}s#Cl8lT ze{u1<-~Dm(e=hvH}5m-vdf$4Q=KnY-`M@488Bco%O+^` zUk!l-S`C7lf{Leo-AtqKTayUMGczWZiyleL#8GntAxDgmU;&08m3UH37!r5#4je%e zasG|dCoW(8>UW#X!VNckWmvoJ?H1J`Tg+WB*a-4C*AG8=j@ac|SgN=JU*Q#sbFf2O z9$)!Y@uC>3fYUdKnu>r5k{bvWcsFvHMG*7wJR7p?h8yDNrz&dfssU%<9S8J_*z_YW_9`NxLWzy7mJ zjl@e{`qAO(&v@_BFC%6O8=4UK2tuNPQJ^IXAS6X(QDoG46&;H@@vC^j&vonHwz(fY z%mNAjIET7VtgD>UG5Tu(3H-ERQQX+slOw_`TX;CO8UpxJuc5zd*S>AI@y4%g@vm8) z|AG%P$*Uh8lj5u02(WPS2RwF1u6SrY7C`a=cp}E+BA@cO@VTL7P9R_5gBlv;JpJJ@ zHYmaaKFCz0C|F!4i0BQ#g;wg!h zaJVk=OGypj<#XH>vUv)L>2WMF#!@>I603YtV)S*>&0hruBnQZ9-z*AxqT{i6e&jCS z$#3)e99PfDSNUY2iFj827tf0>x@qv2pTbNQcPGwnmL$MzAnAv(aPh!(!bi=7#{_(*4SB8R);NU?l;$_);)bvHxE4iU=e0Wr#DTCG0=BW=n%~VC z`Ru}L-|eUIj`F}h`d&9Q;+Vg8p>v$In^p6sO$s+*Fk=#*YiJ4zwvQvG))w+ue3PGu zH5ym(IqC|-{*O*pWwLf)p_6BVM$}IsO342ciLCJ694@D!yi5Z>z}Nk-}8($ z=~`pz9n0h7dGSrqRg|Rj#8UUzM_fl;B(5IA zmby3@TbwV}8taWWsg3!4+!!my=78&iE%7}0*YZO;>{s(7Nl#PX2F6bmCMteRd;>WN zla@}I6c|^DtwjT{lsSF{PXwmW%7+jDjx$SSCKv@0?_t1)^N|n`K8kIS++2J4nbe(k zek-bPg{i&e89NzGT&zUcH4@`xvxQuHdlvs>u*qdN6DnT7+DRW=BOWGl)j5vq zfIEanoUsqYZpoDQSbwV6;XTg76q^aLbun@?rSa)=P_W^va!S`2H^yBYptf0C9An{% z`-H#N0zYBUImV{WkF}61T&v93;kf;#{v`V5*eS-C<>bw7Zj+lsQ`f`N{I~#MH8D;YzUKd1&zI=Snb3PFNUkm!Zh4Lw- zBkvB$YsZ_rLvkxCu^1!AO5DJEaY^5goL4aL0!<5Yg8nGx5+3JacK*;O?@rvfTl86| zg-!Llu0t_q6OUphO+qYZMqIVCqAyDZe6SAjnXypgM<2P~tmazp=^KpKX+6d!C@9er zALU#!Cc(x@yHM?5nfq*bm`l*1ieJD{`#o|qXwCL}@}GHV|0d3N_$F+HziNewy){yJ z$QLvg-~_lV%~Kqe1KOZErx`mo1wo8)KgQ#a9xxCeS0)Renuz*6odq!n8o|PQ5fgw@ zEV;0e$pt?ogb)dUDIo?CAV9#vU2DCL0?73-c~vZQ41#d{373RL?c3k}QTe|mSSVEZ zF*lQnBIo9Z@piGR>(Y597|Bfx)W88hTuZDa`Y1&7%lA1BE)u)$_SU5j4%^b##h2VX ztX=D{uQv!Y19wI7~HFkfgYruyUVTYL~+5+|KU{Po^r zy7+RNI!I&?V$wV47Qwz_u?XwCqN=%_%=g ziLg~%b&VTT&(|#W{=RJ%6PaQXSgRm)HJX}RTsAJk1J~JnT=DQRn&&Ww!(0W27gbc_ zF>UcV``b5`aMXL53wDI74LjTjOI@e6bYswHCVbwp?&g$UT|33kjvC7AbKqA~2S(#s2dv z9@E9Y-H0MG{5TIw<=WXj z@il$x>M^Z_eAHmx_(+YaAoTw3#o#7-OI7;}g~#m~*0EZ&GJW(k#EM`NBij -K*9pu1>lFva zxSuyM|ILBs`oO5_0u&q;@p1kIb!`<(Z|GIGR`|R+C$3E`WNSbIdD9k2A zV!@8Uhy}&Mu!e!7A0f~@?n@_s%8esnq@o=9TQds3k9!<)Jjp;+i;;%EOKla&e zx3_vOnCI}^#=^&Zz4+!_(RuTo$8}wQgOXaWW5jF>zD$kh+r_T%RNOOkVLKKtmNl=MwNCG4 z&}d z15)u`73`_;UR;NQZSu)ClMg~GOhHfw80(4>*mD7E#F_WTV(f;=<5Eb;nK8w!o@XL} zPrlYgCMd)zRA|nYxyt6%O=9_f6n^xhpKq~Q`0BMnm1Qu!_J zIe(ldT91nY;;9^`Xe(zOAL}6V+)W&C)%wj_`tM>14my6dpvUs-Yt91$n6OFEwV=p4=JegVr@lOrUAz&VvH~6WQ@6Eb}^a=dpG@Tv?QWx@F-r47h+D4Rx?N5 zn6GYVixC$$-4=M^>AZFmMDFl@U=hR>8l(L4SV19V0aY_3O||YJRxG~OYs8Bul8y`RyizO*(OT(v#mfl-{892&GY2c;JK9-8_A=z>W{bV3?xGBy$;F&2QcZaYbUGX(8uOu*`D_0^8@SV?!1vEYt2_D6ieJerHz7w96-Yc4$n!hO&} z-0#?O4e=%poYk)0Mb%G`UCdl8rG3H~ISDP6wv!tv;s*Vs-!^ZA7%Q$pTEX*bF4U|E zFE<_1L;58R#r@hOX``vy#QgAj%sV{cQRAjY8u?Lrg3=pIZDFDO^Tn``b|1Li% zC!VzCjQ|^iBj75^F8Uy)ixaOgIo)Y9DO3P84$Wf6x#fe3Bwk@mLhlSsg22?RsvD&L z-a#946?c(JNhMOsM+unBjhcOk@pNNHpFmQII=G{P<%BRF9UF7eYqFrK<9^x8KQ?^* z>)#)GzRo@G`eEaycQVNt+ZfL*Zfd8Zomj9#U^DK9Nktm(8RM82E>OIV{BpjupExFS zKsy~3UGqwsphD?2sv(YY*H4$!h-xfg&-3)p`5?h3&n(hjpZP$pnm1}paIZ8q*)*Rq zqV{-G<4urtO|eBGS3z}ys4-lWy(4yW?)aDw9y1FE$J0*~a7>t+M>OPTw0UBVS&yvE z)<@2#jT>{4xo_QM>@dIaeDaz%Oq+xa!+r0!^G{1}Ftvr!BrMxqrcJ|5_qgZ35085E zvxmn$?p4zp-h=_LNR!O(Ghf|J8CZ*g1M4w3wgL3~nj5d^kaav3eLtR$1w%mpZb9*!G}H49%HPbX*WpK*!B&;G??#YXQbJN(yh%rO^s zH4DG~_3ws{fBYyEMLp6~3}o@nS&f1GRdX0~&ug`{ieqdNM2nY?t6_^9gccskLE>ZF ztV!ll+%O7biE`6a7`+}fFl-ErWl~&&wK;~$OJ6T->(2l7x{YmYUW2(HiyOoCxQdzY z_4?x45k6HAPUc4t->i9M&^a0MMln>;mLHx!EdIh=zC|3AUOzd#snq;w?SIa2&uI_v zfCsLqlC=@F{ida8w7_Pt9y?6LS`P0erHxNSM%kLyiZGrZG#`*j*v%%u;00000NkvXXu0mjfL09i` diff --git a/wp/wp-content/plugins/wordpress-seo/images/banner/configuration-service.png b/wp/wp-content/plugins/wordpress-seo/images/banner/configuration-service.png deleted file mode 100644 index 5a43c21925e669c75794883aa1f80021e557a2cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79768 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�Mo{M?V=n}h|8z>b>57P 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

    v}h;q~Nwc|^fFxpnG= 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 ?C{i&%#VI)qx}pYHU^QOkVTGX%FkK0)YF1k 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

    1XSAH&paS^v@1H}BCu$c{JH~&tF9e~s%swT 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�)2iXCFy|0UQwMQS1%DnfMN)t8}2?%Am{W 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 Bk6r)( diff --git a/wp/wp-content/plugins/wordpress-seo/images/banner/video-seo.png b/wp/wp-content/plugins/wordpress-seo/images/banner/video-seo.png deleted file mode 100644 index 2e0c28c92c6768e140875618e58c3bdc92d0a67b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73543 zcmV(-K-|BHP)>MenBc0&)vmz|J(Db{kP>-8J>6)kK$20ibwG%9>w6g9#rT1Yn%M{anbo1;B7J~ zB_%}?hy{U|6Np(DfCNK=o;y#Fg5@=5L9PEu2A==RT;u*X`e*!a4$LAB2jG@#g0nO6 z>LrXbvGW5^#4zp0DMr}cO#$d?5d0=`!Uds^(y$;|O%pCTg7HJxZG^*vOn*@vR+$vL zwJ88@7H&HU+d+Z9@Yo+fY&yuqCr`5bn&A2f`-5^!IFC~v4}{7P%FS;gCVT=wn3S?2 zlYspcgd17<$?KnmAGtq+Ik5SPL{)_N{Feq9 zV$}G$=iCao*WlqX*I?`tU(C146P`JV0K^RQ=%4+)7?00!*<8C`M4A&<65TqU-@af} zoO$m0BEUT8v8#$Bhp{;4^;(FCmn;9x*nEHWzC4gmV)8sJ_`pT|N=)OAD+DZ@uqsY@ z?sAO_pSo_ZeE>tx8sOc}wZI$S@)M`ue&@IS??*rUp4XlWh3|a!yp!;6@A~#%F!6QZ zVuN!I!>Gyxcbp=abN_;j2T&%Ru*&=-k=aKZWHm^md>lPE_>iAVo zl|RYDUBA8SJAU!>jvxA&)9<|VJOA^!Q26C%=T^f%zxf%ATx_xv?}6X!Xq`#b$07hz z<_)Oqij@F@8#y}Ac?ceC%ClW#1POn$K8^{jD&2xg!7Blf=Vi~9-4|_=$uW>vK_f63D7=+CI`xIGk_Z zYe|B2#-2$qUFInm`b-2Vf|&If#~lh2#d+ta>b;|=h#d$L^4y|z87g`@ zkjY2MY*D2{j^qt{C0RcDEHMI^bX}4&0xq#aeuFa=8ODV1aObnd5X2vxGzuoUK@#qK z@`mx-yby;vCpoywaXc3u;F;_381s-T(3I zuYT(z5CC8c=@`(x*T6LpZS|=F9~v+PumCTL43*eG282i;H*_tKdY|B^7_o{JtWby$ zW#)_D2XOZ9g6~Yg2AO+mTQ%1J%Iqn@44Fx^iYwK&!nAX9-ikWO4vBXEjbqm3I!fXu zCW0Wb+awM#a-HCZ=&4vJPzl(AI=NO6B6#ikP(f8u)VP|DDeeSk?N?}Z-yoK8?W`?e ztfD8&MC8L^w|@wv}KFd(vMb%TS%aBL5@~;UyOtBNeE`-ynJ@3a5P{&k~pV#he&B&J6rjtVx`U74=iU z|MhQw^z_Qt{pjg8-uum`XUFZ3joxj`qEeDrT{P-7)mZ@Z9)%g@E5M|6o@d~61Vcwb zSM_R=HbEgrKpK@C;HG7s4Wy!{k^`)%nsS|_&|uyRMr?fHxr&PtQ>$!~u>R&Als!tF zDz^jzF<#CmX|Vy(@nVwjY=w&;GF9b*;CL#ual2{0b*3R^px4d2}IY;Uk9bq^4V z_ylsda|TJ;SptY_I>hrRV?uE)Fg*h_3Rp6Ya6>Nfn>Kp)6Eq9+uYScI4v0~`H=Ok7D?LIzh@|B>UhH=Ea=bUVpXm}PMgnNHMZ(s%2$o!*`*RF13;0@9BjT;lE2wNI3&eJ- ztj>MaVeWK4O2!K6f+DzL6;IA1a*b6oz+|^^bAjZ*3Hn?gyQe#0R<3n1k3AcqQWb^+(o4r)rL4I;h3B z<|MvB81k%QgGD?eemVa?3y(sfi%pBhDz6U~WN~z_7wl~LT3L^CG`RuVI9EV3FiKhm zHSZrs0JPd@>#HIpzOsGX03mQtxk)yY2arb1COHUPD)j7)`%v;Fuw%QexvrbU2^eSI z#7Yy3B+auR;MksFHIZ(W;81%4E_SHwbmg3&RPfNB0w@H~XCu%dn?b}&+;r;ba8Mah z_2yh`hU9Ez_8va94xWRr75~BRoHw7%QSSA1qibmX zIFI5}k!x3yj@lkRUj}|9$0%a$&ieZvu2VewIxa$?ZH>Mzs&usA9by1OLJxxXeL;x_ra~&WK zm=xeRCy=;LCb+&z@MfP7sEHqimR&BZ8~2NN(U!(*W0)KnhysEpFADmIQiKhySK~q= zQn<6{Rvg2+W+4Q~1aua!9kc)L9by!cO&n=+^BJ*4tDUX`pl-D+w&gl1IK{F8e2&Xu zUW%(}-w@v9sfASIm3^vMia)GeiCJ=ryr-ov4!nR>;Jp|@R}sQyuOV@ZG54id9>E3< z;ctANy+ib4pPgvB1;kf42cJbSE57Gf_?##2z~bDKTuDbEi|PXeQh|&1sYKy>W(Wp@ zd51^k?Pm5~D|^*s$$e~j;~>_{wb>-v*zpN~fa(PBMsZ{nT9U_S5TZa)f9e!)R+shINZGG~ReW&AL_j158#neFRIVaI0 z&gjH--H;UdOF#h$A4*DyAp|q_YX1xt9#`CBALKX0jcX@< zXuGcR4Ph4_K!z(Da@=8l8LyI#`$s3x{P2g)oQF)cDFeYU#f&!4jt2X{7l-~=xH_l% zfe?oSh%5ZC*jI~F;@zsAnBX`?EuC!#oJLMzM|?lOuJQH5jkoaGl1C z-v!ROQq~`idA;tR1ftKqejO{u;tnv6pbz;8w8pQt%_39*;+*@hyK=ua>$`c+6qm-M zm39Wj(=r#d1wlq!^6YiDz}EM^zh@ksJ9c)o_z|l-V#nL>`$evPF}92iMaCMJXPg$F zv|X|6{;%_p&MeR1)q|VuqILkuDs4>)2BG(?kEzsmRPW%Bg%cT^TMd9tdu^ZYuha7a zhhy!3uUAZ|ECmtQxkze>Py2kn#~HL6Uw%G;*(5e*j8VtfdC|@c?c=(vn}N?3zzP^T z5Wg!G%B5F~IPS1DG=6RYU<@K}IiM=9*1tELhv0u4g;rI1$jy2dikK}*7U|a8l^SBpRK7S3c zi}hRqY=Gl>o@@7VUHz|faX+uG$A~2mULVWrH5t#|w-Td^^(;gH!?my1wGtUGi5=_C z$h^Kq*LCUpWlVhG2OXX(e7`CVUEezQwdE?lTwJG6_-Y$C_$z4;FkkWG_rB)iHxI@wF2V$L(Lo}c>peW7sN{o8TKxz#u%Fc*P)ZP0I5Jg4_`s`xQ z@tPdm7IPvB{_d4eJPLxd5ctH8zH<7|_y30DHg4llD4ai^Ed%{Lw!?UgpgsrS8c6vx zL5~-JIc}UEY?y)Ar12S765iP!Mb1j>XvcKlru`njUMM;5?5q0eaP>ULYk=(>Ljvap z5a$?v$+6h)z53I8*W~E_uZUo2gU5`Owa_@Mh~m1qcOSLaJRjHXKJ7h28(&T!8!zS* zLWTPr#>QdKt_*AnX05Sq=@;)eFF615`}xmre)jZdzxIL0?!ZTW@V9OxxE!~EP&gQb z0uBM2#OU`u<*g79)Fd2}VOv+HN9?ESnj`bb|Wc(?iYy(j*I}gKi6^d)oqOe?vGC&{y;X7gl5vh&j$(DN< zvv0EBUgNr^cqUKxeKb7RxOe_3rxs#HJNNgM*p@6;xL`~=H#l^hg{0rHA0dJ77vg~H z*>mP&EDNN6dFykhKmWB4o?FOolQ3@MCKNW3(4cElN?fT3kCMTdTs&VQkVv+}W!OnL zU^7WA`E{-tAV^+Xr=4>NQU?GhbMZ;F7auJEPe6$u*pJKl7|alDwKbE!vno zvz6}J+%M*6?jA>B)^mvGg=h&LrGu%UH4lij;)VI_-Z?k8P|Ujw<3+;9FZfkVVSc*^ zU>xyu=vp6tYw&wN_l{fV;PW?bLIEWVNm@0U=p`@6o`gqOJSE!^lA0@kT*t8<&ufv) zX=QZ?c|uOxlP%{VsR33~SK&Y#(`OHU1Y8kVA@TyRWSWXQ_T`!NPuIY{#YZ84>~W3< zY!x4Z8++nA?4#sZzt(RNj#Pk)_)%<}2cpARQGiK|)BOU!T_A{<+=#yxex=h8ff3(T zT(CAeOvW+(XfB8Bc_#i%Y?Xb|($b@6-2T@i_&5(8jU>|mV= zcF)?kROFlfMFd(IHtrEaQ(PN+2&IUQ z#1wIO89B~8onMg}A0v9>i?Iusy@+3YC1*!!>t3_J5?pxI|9kc4p?H=z)+M<_hp39|W| zfU2$2fOK$tRG8d)Rf?pA!6b;8Stf`wPedao3o+(y6F8l&p_ieQZVDPF3e_*FxLx ziT|#>@k&P~v5{vCB$>Ui(lz#SZ+wyanjbWz&_+Zik2Z2&LM{&2{ZVvOBpc^; z7wk079YcKUtH^_K)_67k5Fb|dFLWl!IsDEmmBc~*j*k%<_<%x;ZW=|{KfL~_^S@g7 z!V|`A+=PNHxrfb!pmm(%{GNdKf>xicP^cc#Ey%o7$W;9R7lI?eb?E%wS3sI=q+=3b z4asSXE$@Rq04Q_bRybrpC*d**UaT>D7a!a0ko+Oc?p28!8v^E3>;ZIy62GV5-EBd+ zq7Ff!{Z@dAj|kP+(pb0KvHveJ^nLf7{27E#$SeC%!5}G@%<3C`p|DSk$JgY_EIhYX z^Z2xL)R*KYBG^}biT{!^WX;}(gvoR4-4xCh8m_%LWOo#MvsdnCyE=AR`7v^H37o}- z%jdsrpF92WFTeNn;UD~leEmt%*+sGW@dU>X2!$)R!Z#m&F_`n z8e7UZbWR<6B6U}FRd;<~m1gXnpMTKn&qsF&Xr#oX|Dh+jD^Ba=8(REi+R z(5tafz_WoA)id|BrIUn^k5R;S5)7-rShPlc2-Q_k+dC7gV zWuE)#oyA=yw@vBchQI!+!sV?+LkqKU+s0>$w-K^(%{{x#=P6N0Uw^?vE3Ds2r~oWV zebC{vO0!+8cG#qZwyI48d$!35f=1iZNY)rv6-i=PZ(Ra{`>+nH!$P01YDNVEdk6rq zgZJ_mQK{FqQANkAAFIM~1a6xs`AG!kumA$WJq)`E&?H9mH)3NE8IViN2hbORF2ukC zz5Tha6i`R6^$EX$-+a09X;9%B5dU!=tX=}fqqXOGWOcI zo_%-AUo-Uj>rw93O8=}w@bSuN1dT42Im@pp1$b|qbZB8VzOvxbQc1$)5_BpQBF z(wZN5A8l_z0MxL(@c8B+-RT!JmG+@Y{SGC6R=Ldxdi#zOW0|Z9gV{+i(wK8#TL5_#664A}C3{*h38eq~GdTI6)ZN<8(Lo zsfPdrd!GFG&LVfiq(e#p;*YmZXxgr?cg%L9-~4^4L}BK#E4q*w4E2`;ELfBFj+M)zW)=ZL^4-s2VTB2HESd)gWmg0r?3m z!7RxO=$7w5K5=GYpG^ozNa;KCZ1~9n&#IT$B_LH?6XPjslGtLeGiD)tsrKnTB>j4x zd2T|xIIw+&vlQ<9%Z4HeLiDemZsOgyql2(#%haV~+YX2quDq#Kk}&d(-@4DXPw7&k zpqpL5fuI^y50D(*Drtzc(#0HdIGHdMXepr_#87mR9E41U(5*ln>U>CuzKVf~D2zPS zrrN3Y@g62Ef8xwpRSBp@1QUbAz#b;z(C%a;nmkD~xn2+p84Hk(0GzOcV9Sn^fJ0K7 zhh#%_iR~JpKFpcm@+VyQ&ok(sAMXBRwr5cbTuNWp|QicJ8hP{&%f;F_+-085e-f|U{~wKoxvkP2QvoRtjbC9vxK zAObt>Q;-zfmEehg60SL9(&oAeI$9A$><;O8(Wyz5F~OSbxC7)FL)ZrLL2}H*&V7-H z?FNAoFqQc{#6&R*)zL;&Ygd<;^Cu9ePZlcEIsf<**l zg0q468KhMRJh}-0Y?4oqL)}jT*}aP( zKpvfSX5nBw;`Lv<&$mzQv@M@(o0N_%l_;!Ob9WaL1qBeP@RaE$lC+Xg-m~?F>Rt|< zBs;d~wTq!(Vpg8j_aG4RUaCmw1&~`+76^i@RmN+FLlOlmF|{9SQc!303q4B05)dO0 zAOMp37nKu8n7jwbNP?HSxMx(CkVktDVO@wj>;dT!(3Y5rZ&(E)xf`7dbi?#<1ngI$ z3?d=qSl3BlN(As^Eg-c3FY&EZ;~+;Jh%dS$VqeWBf|!!5>it{?&V2{6qhy$bGcw48 z+9T&fW2YonNw3pT6b`Jp31W}z6 zt#1JkfW915xmQUFff^NjDj*^%3gX6N6BDR3fv~DWf@L>EL4f`?6D5**hqVwm^*#ks z_)YWzC{QVr$g#qbma_<}Wd#!jAg!ci4GLrm%D6|?gnfu=SmFe-rJXE3PSO3sY82xV zo|6#c(21bV1YI)gY~VcL5egnJm_V6|kWRH-+ukIEYA<{#z-)CLBql+(u$1z%6?ZWLf>pvx<%^?jZ@(vo!XY-tOGrcWap-T=1tJZu-Ob z?zO~#^26H;-BlC*T{tK|IOF6_+j7g4BTFR;>4!K`XP0yow5kz?EI+fgYPHt^e5iu$ zicrSMK|@s`_v%sVG1JKoooc z^i}&omQYpVJ-aTckO-0tkpK%3A-My2VfRf52Of)IPuU%mh+P_X9c2#eDUwfiC=f?H z-bC)9e@SH7$&~xV7d#gvg*+SVZs^{uijob+H4ZAS_g{}`nIxp&zp!NnKQL(Tm+^~+ z6%NXy-uP|$!A`ktczg3ph1)>czVW&CAPV*&(+Zo(n}C_VLYOEyhRmFRP`#fW1_kD- zSnY1Mnc0dBL2j5Fm{55y6AahSXPycyBryt7sHSlbY!(|tjCLn}hJZ+*1uXtxd@!Hd zhqkc=ek6mg0y{{CRGz4!R6pMH8bB3of7otc==T?$l{5CRlQ0DuJ*A3zY`$XJpT0hj<FDUdG&lC3q*3VyvCXqDfWFCTjMz@G-AvvW@^e1h<9Au6; zfcs$hk>|8b60Sf0V)xBfd{NUrCihK0p>S}1Y}Q%1Khxprf**fSrZ0`#gD4=W0F((b zo`b`xjY*V1Rv(}#Owj&nlSzm3(AHcD598|soeFJ2;vx{%_e~ve0BPY^0Hnu0j}TzF zelK8qbaK5Oz3fWRkA4zKQq1ePhjH@x0QcBHq+J33nXrM?CPw}kup;)X*%vqeIp>__ zn(OaX{2qXRz1RaH9E;y6YP2uu6Hmdx;wSx*r}O^My(N-xTQtCZza3u=v=7RXRksxm z&gu6_e7j?=SNDeXkCyz|3BO7I6ttZ>3OSQhet0H=Q*+}jo6(G3vH zA3MLl{lu(9zvb7(>bw;n14#Tru*$E?zc*X=E$1ssNSa!jtL0dhzeb8l9&B4K{`Uzj zk%T)h8RUL^dl8cQzA4|mJ>Mm7{k8Z%N6hh6&d<*6Qz}t-c;;!MuMLR8|CdVZhbm}d z4D`pP1Mu!&W8BIAr=GY-yMkuoZr>B%d%FP)~uZg-#k`dj{Yl$S>c)=y;B|NM~O@)j(&~aTxd3pGzeQ%U0jn zRz$&0z(KwP8T0>w93YP|F@KhMcyBH+4H_qIO76rN;FXfce*xE)pIkJyt-0hHgM`GG z9{`2*VQf%wF|W~Xdk@*bNk0W@V}tnavLg;!Cvcn}pikdHXNCJ4!ZkD|i1dFZ4gFEU z{q!g9X)HVgSfjbVe0w-RtV|zPsJ97nL_6r)M*gOsY@0cTx_bZR=%z_Ra&j;C-F}j= zTmJGOe(NvU*GAXVxpeg%MeC>XtAPL?O`4jRX>CLQ>h46p;uTfF=%3qoh`;Ni0dZ zA&>+-$Pj`W^k#wt7;BO;lA`Ss1z`0Lk|uR2!3uVXHO@*%K~6$I5=Gk>=b&PP2*(G8 zuYyLPYR5gM9gH18f}jkEMbyu+#9Ji>_?oXILbX__RC1CL0%Zk1%l>ZY%WSNIV9s;U zVDC!&NfenU8m$+FfSe6^)!Y!&-?zNRJxnl}J0@(am~gf}8d71b5rTW8Ijed%3Ya`!Fdg zIY4sA^za&V(I;YmAg@8qx6qxZ`lL^g$O8D(1O~>w;W`XJQ^3mZBaqX6?jgjB_MlV6 zgkAHSmFNK;5;N&K;2wY*<6{$7A$r_%Bv3pPT(kNVKn?ISt7IYZTw|>Bko>`qu@nR# zwTxFyNVd!~A$Ef_Ll1I@-DTwYGQpgC5p&hfU?vUY01~8oq(KohE@=K282kL~X!rJl z@eLCCewnx8`oh8b#d#N+x<21N4c|3UylmU}Y z?7G?xvZcNwkqTJRRBApE@`fat{S4o+`qU&}Q9w|=^8Xcr5P(Vny`u4Fl~4O*|DlQ{ z3E{pAB))2sN}&5l{Kh?7TZ`Bh%B$$cUZ776!VQ2XaI<>Fz3480oXUOzpjyO8*Hl}B z0%R>N6#_a5I=VozcAmLR7YH^xZall}K7hbreFljl@s_nPZy@LJ+zIjEUK9Q32qFg! zJmj>dzualzbC2#P13A9tIsI#eBEkB~@&C;J1d_UDFTc7}l5o@H!>F?jhyq)yBnHwF zXZ1|LGFg9s?gT+f6Nduu&vJMF%d_f#@#NVVxWBz=TTM2tSmS2AG~Ug8dAxh-+PmE7 zv?FkAZx{FMt4Tv&Yx>>=QMh&Z6+g56ZrNA7jybls0L(67;@0^EjMa9M3!PKj&9NqA zO;$C%VgnK}yEN=h!~_Ud{#yNln8l2j#EE1@Nk$xiBp}%;2!U(~5mI1Pz|_hQpxog; z0wvZO2#FxbNK9h|ELN{I-5?nfXCXyc7uU}Y2SFYCD&W~e=S}xLiU8TSN;1T5C9_J# zM6bk~I!T0-taD$19BT~4KKfg1QQO%))9bo#I}luUeh@pxRLMHm75twrlJ9XrrRi?M z6Jz6?NqxUOH@9!$puK6s6XieVfJ|FDuKkFDBu7nXnmjc510<}3AfSqBEY@TI;FYdI zMh-rC??cy_e?R^3qua1-m3#A%=iG?y=ejY+^m1{~x29WxpG4uNp@}>5SBJWO2b`RJ z_PTaX*h;SXM*M&TE4m0ye1?vSSM3B@tLYS?f_NdZf$RhTBUH~dfTS)Nn~C~D!A`pb zI!@Q1pspZFe%6-l{8{hd#~%U_d0w;Jp$mI$LJaa+6-$BRwTV5|*2fo2F`!>q9BMJlv zBu6AIyS;5CRfr@zjFY);IBy6Z3pDp{_M4Nlk4GKe{X94B*ggu5nXY#XqHxBq56d1u zWF3XtS_$}U+sZY*DhVJFLv<}l6LZQu1W(+9mbuu97%71B5s!$HI8CSo)_PSHy9m6W z_7G^|ns7a6lS5A?wlCzm=)~Tz?<+g|#OIgjzQ3IXN<{C*MFuB4&YpF97T4(I)` zyW2kJjm{Ay9VSuuxubBIbQEAG)+6g883-W& z6I38*6QdGBB}-tSjkJ~PCV0?BTql5MB1u+$ZUA`L7b0l&l2r2X3-q!o?UAb;kbnh((9eMae{LDx1z8_8g@^9j> zrw^PSwb$n)zkZ@H`@cj1;Y%8SHPiyaB2w;>MzI9Im&{LDBVm$KW$?#eIxUT(jP#@~ z)Yz6tv((7EG$5C%&+ZzZAnO~)LY56qeP?IB5CM%B?8@OUutto>&{z0 zrQ`LrN3Z8k$WaL|Q;HtDa|+|4Q8Q{&4p~HYB&@9Pjs(1=GMU=ArsvO2c=zF|APONv z;xRTM10FUESd*aFBX{2)1OAL}4gx8NJKTc7GovNL=f=AeAo#v$=xi)PjHep5cdU;# zx2=g+3g>^;fG{%0AND8|%mX1JZs7`ng}=VFuEKR1%9j$ra?=Zj4S+!aSW-u!fqacG zmzY#kG`+AcAQh?e49{iIM~|gn4e6zOWhy0jrvp5jnTf)aH|(x~{^yXL56rFbE`(u- z7iSyDy&l<)Sp`G^(ok&V-o~E~{}=e*;%9l|*_YIl5Ka2hucH~?7zDtN$-v4n&F~I* zpU3~$^{`@eQ?z*491sUQga0^O2BMHpuY>IMQgP8b=;%(m4T1bNWGh2Q_sgIXXpi}x zuG7lvvZ2BN6o^~$oT2{m<;T;Ix9@tt^7SG8v7_R8=#GB#+BQ`%kjYFE);6A41N+Y> zI4G&oAdb@?EB;Oi5iG{+yF{VG)0s@NcgQ>>9e7ee?LYtecf{BBRTo85zuF(31OPsW zKq_(J4vX(#@dzJFgXRS+KTH(VsAxGd8(ic=|I>Q%>p<_Le179BWyODf-6D>lahEs% z3V9!a==|UR$=@lDlFtTeAC^`_Ea`a@gDw9{-n2b)Sgp4}IJ&QTk!LAiS`OB)ekvGA z8&};}IZL)zi$lwz`BG7G5bVoRJ^}eKLDe`Y-w@8P#I5zC`OtJ#rzV=;RDu$|cjB)m zW4*)tDdHLQUVYt(B2e*3= zH3E7qnA8-nNjUj8lbu(fxf84`ZHcEtK}|b6ODUqzZ)(&Aq96tUBEaJXd;wO7fIEnc z0EpE6I=86vy7k+mD+(9jTnG>zJa5mYf`G?hNt%`y12&F_|3_T%ER|96PWqNQZ%{+8 zb*Lg`;X0E~DT@jNgb*ArIq-;<%i@8sj?RyDRDhlua*}r54~`0WTvlz{CaNpewbqS< z(YE6MPy4sOJ~p3rR&=c^_nNs2QD(FiC23kt-ylMs;k@g!G-|gpNj`0GAOjqTrY-H; zTTc0|VU^fwxhMp5c#d? zFo5`o!fdx)@w5TcvA9qPhNY(?3K?aZQE(!}r4&(EGj{=wcTU}=`RNBAMbAF?c(ilX zCO6eFALlgyBs}>uA#fr9u~8t5FAkLA9Upo=#H&v~AKiY{-e}o~d6-T~wtTALq%vN& zejD=dBsrYwv4i(U%SJZ3>6@mgfchkTD)>S+xjf-{KI97J#hdR|B7FliA`;d{%)mcz z8(izwpS>E^+MNbS1XD7V99-MjM}M(CL1XzoSPUNXn&o z0vSb~m;e`_L3uWvdKR87Q%5eoF({(}n1P+dE#3;PZ>+CD`vM^Q$yY2&%qO5sm{2M zTU(>LWMVF!6lw!q2!@Z$FzE<-7!r~;B;XD1x& z+eE<(nlkhbHsTC=c3(QDg_90t;URL*I;u`R0JzVLi2`;l6fmNuQ4d5qu^1B>WmpH6 zsRvCDMB&KZTPQE#>+M%wk5;!Vij8_(em*WbWAMy)dWMZL>)v$p*FXL# z;%iG`ZTvhApJ}UWL7L*g(v^jd#P zTXg&{#zzZWp75>@0g%tBBU@L~2_79XjllVp3vU_30$va!Yr~#VbzY}yy0*`kUypJ> zt&gYFR=W10Q$^YraQ;aC=MC{1pVf0t50?F;Vbfeb>uh>ZfR>3m)d7U_0AbIg_E{sK z7AMEegqKOUrDyjzAKdO6bYOvW`M#1H%@gHc^ocf_g(R$+eOwLTD=avZpc;t6rT0!j ze*65?19doI{$$8Iw8KG&MGJUSr<4%@fw}#sBNps9D8Pg9*gX$M-MRkdfMNZqZO*t(hcUL%GDO|)R;QR&5JHmedg9)PFfD`8D_q}J z-(*npZuI+c#Mh;(FOC|&KQdYfqu!7c7c4)Ym-?}C{?jck9SpDscnLr!Y1$_MR-eV1 z6U@P$KEQ!INENp+ZWH94ST}D`q}Sr9tx<~urzOMZ=_s4MBzDi@)15WgMvFXQRk}0k zGjM)}weO1RXsH{aBW~nD+bic$uc=?@AM0!Ju-ViP)sv>4g}f{ZeiaLXK^B~+U>=iL z`(#}sd_3j1xPE^0*#{p7%Q(?3I0ndJHxk;twFTB~hfI|asLPa`_HV8y(~C||$!MPH zw-eA!WNOs%n0$&oQR2Xaz(3svVec3SXcnSy^uVqfxK~)7etvUR5QU@9T~Y-^K^Qq1 zZ|dYq6c~VYbd)!-c!afc*yR2p&-TcRmYp3NxFsXzVo{=u%*7z-h(XGsBUS~%yKcHY z;_LY*o{nzWwKuwG>DlpnATC*cZY;O$*=Of9DCl55G8yS6puly2yaoa2xyPT3&y3JC z@44kpZ<>!gVsqRt#yKFFo6Hx>LN&O`wT$qZU>hl1_m)S~ozV(@cgzsDZ z5TOvEG`Mcb)=Ar>dSly5EkI%G0YB__b2Yxk@L-vlWUU=g%AeycF=#a zm{DBYA4KP!uq2xHwE@u_H}!#|S5Nrm1UE9A0)TZc+$r%W@xj}VM0#Dj8z_Umt+*m_HRAbs9>LHujdl8^E3(BO5Enw4~Pk3lBdTDJV~K0Mz=EdIwmI z|Lgfta!Moy>n+4P;Q(r248SX>99@jJ020<1=+)eR97fxyYd4M4Yu1|?yy%KU?yde+_7BYDg_ODq}1NNQ~ysM#46NSAG%al{!B?{W173h`mD+%yF zuZCMi)46fW&d7JY=|(wwF5J#%Dfse6AQLK!5CsB*)&Ucu84iSC5Mlgb+_4q_^WhkU z7n~pu0NQt7eN#u935YttKp0vtP8EM|V@3u&v zUp6ftgBFan)~jA9AIgR_td3N-JPm}pN4YpXkSMGZKz__Ps$o^qcgDo|T|rsflo)jd z0|oADHea52Cx*Z~AtVFOvY_7KUD3n5+=w014hx3Znv0S;a^;S7#O(s@0RlZi=RqCe zzIs1Q^qTm^PNKl;KNP4G(3B{E+<@4CDCp=OQi?R6Fk}k!jdDA(It3&cWxy00%8$>~ zKB@gs+ls$`3eiyFsB!xUX1dt)hj=mV3H<>b{$ZcI_A>hZ9<)i$4H+i zqCtySjqqTVKbJqKqp{u8(f3V9)^4*91sVaD9`y=Qu&IZ!)+SX_Ni&X3hvx=UGiWbu z+%{ETetjxI(C{W+g0B)zS4GH3W;xDJO2W1>(?Z6!35_*C?_t@jXCU+uS$Aj<&U~mY zqR@`dN=SXS@M>faY`O|7$Ah~KZn@$*Fn0x4zjV2uQ{!l02Jk74dYek;GsU>uJUm8T zHWgr>*h!#M0Z4P!H-}(4BbcVebM3mVURS(LDOh+*Q%BNvJ_YJc^@V8%1xYL()HMS3 zrcDqNJf~@Dc+?9#8K{@+?Z-bgwP;EU0MNW6e&Hz?(KWBvuyj*(^eyOU61FRr(O00O zZDAc{APV8WnJbGZw3kT~wy(O-$Pq|_>N%({$yY|nWo{qsfjo#E5FJ)rGQHp7<_j;V zfq4(hqtBk-CyB!0qbrfWDj^E>)M7EjJMx|fkOrRmZ~9vR#WB>(*TKXM!bdU#gKDWHQilkkm}mb5X;2ZYON_i0fh z)gKHkc2Qt!Y7(!uVgGYezMRxMK)8Us)Q5GnXjl?9y=`;a0UhChrZ7>kwiM_)If(rZ zdK3&)tsi?y^A{7+eA2HbVLPqAjN$*ZjI7_#fWZ@YE|5l!zU#eG@#UmFYI&4gc*C-w zt(Q#{YOj*+dHL(R4`R_^pF2C@(>L#^9-?54A0iChfR>EA2h7Mw340fEf#*!@Kk2ZL zB3Zx)8wB9cbvI$!A-F{m;T8;@VT6IwF#yRaQD8v8v_WwjS)&*jKX@UJ8c#>=40L`6 z1~aiGu2_~B2)$=T0C2I5YB@j~@md|F8LD*fqY<+6uuz>UU@e@~ggIxB69U#8M(wiZ z;wd+e@5s~lMn=y(_?S*V#BnSF!Kt(MA?p(e@BlhkyI}_#wX+ddQdUnw<-WY_{0Ns4 zmJ@zCJ|Q3m_|%Tp&0FYOFG0`E=eD1sBaosvY)K-`>4tUGLO_Pkz|;fRjRBkFCG1g{ ztL-YaFHHW*Z=hd0AHl+FpQ3gq-*HdU;`=@#sQKddVeLV}K`cG$08>Llwjm2 z9w~#A(ZW+a2!r}AizJ*nXi^QxkCE(q`1n3W6t>?p5&5bfqQD)4j1dE@bwufe2I@Ro z;CmKcSie1IpCybgMv5@d*r$Eb=^facZmaOU*9%9ViIy}px$RnWVT`Rz2ELZQ_rRqY z-vD?_fP2{tn1Z&I$^P@kGy7XZZM}e{Z6K^bkN^h`!$Drf7`6LBNnPXy2np%Hs2!vO zIwQc6wHVGw4K0quTg-U6X@>(EE+$VnPzNU>>U6?vOg{{m2JrW~+--s9q>$&b>sT`Nw16Q6M0+`u4Zsq%Dodc^O8E zg$Uu(Kaeny0Ri>#fZt22kFVEg^ZcT2S6}TUm9=2>#R$iqsKH$yaVCa$qoe5i@M#L`z6~4 zPjYKER=RL9cTZr_X!R7`4{%gZjRUGyY|q1pR!3i^cWVnaDzyK(edwY_+G!H&EiQ|J zfJ~(b`N4KUS}%dLQgt-v+r!|gLLMx?q!&v|N4TYRw8Vk7)w=Tk>P^cd1Onf={!Jv`SzaxDc>CrWh#y0_=K@!?;`w^x?s*NacXQmD%;I77s zIvc{OJK63LXsPj6&jY1xot5tu2?IvoIFS%uhMO+iqw5%K?>gLnaE;>`%exsXKfr&p z=oTJh;0e(YFp;Cwcm~@PKoZV~g1F7GPkvqu1h#v?Usw2_44@DNbuo_tQ6K& z(4K4k#3W_vVOX@t5e4=fFmbfH zTwnCbAZ%eFmZsPYu~$Ok$zIVtd` zVmk$enEJ(XiK^LQxC&HBpDzHGzC}@CT;2=PII1uKH^FBC|F;x_-Q&w%FiA`yU$^?53}A$ zWRO7LX-$TBbs!4d5dF>smA!KiwSV@%k{#`%TrX0u<&cD?AB{T3r!m&#Pw(6tt-SSn zy-pNfeR*f~5d~`aG}>n)C;-m)*_BC#ox=;UptNMPAuec3SHVSr6G!9jTD>XK>%ygH zMe~#6hRv&Bc`Hp6%%fnVByoK*IQXX?23tIS(2%W^@rYbVi4YX=*l2tV2mtoEY{U?U z&X)sR0pP{C_hwngKnwn`RWu=5;&q_uhhL6I7@6XrZIQMpPTNn~$dbWEbsl>P&QwBT z`M^R{dsdHZ#zIrx@j-1hAJ);ZISeY=SF{a7O6mwFY3j4-L}3=CEo7U?x~{WOF9zC$ z63>7~0cS=S2a612)K9Wumyz4*~y3s20 z{;|Oe0z5`h2Jl)|CPQV7#)K$r5^%$1Zf%=`R-4*L=sG0E;Vi`T_I(dZHn=MKUlO0EBhw0SN&|ygpk=Av`3gOOQe>FP91A z2)a=~*yz;}re8)NUd>;izoC=dwzt0tAq}^SFlp{23ZfeW*mND4 z$TVZRZID5Nw0(b_tM@T%dz6@lC4+4fqEXgD##4J^A!AKme(B0yB?i* z?g6)WZ;8((&GX|NHVp9TAe}uP0Rq`diM1By@d!)0TRmQ+XLHdKUg!2PHDlrTZ@e;i zzJm#N5olN=6gs_u#gMirZbh;vu51a^yLvC=9Td$*TJ+RSJ3GN&-whSeQA3$JGSChY z1@kC`Np^OkkgW|%9x9;AhQOepuSte7mqQe;KW|kHxO+h`nqPZxK(7&nPu{$}N{K=p zHF7nEbr`MNfA}mH&@^0n8U>$+AZwid758>d0k(Nrc}f{adryNm%|e~#A%l^vqp$>C z05?0~FkEk)`S-jDkw@=Vhg^^94Zur|usU1LNU&)K)SI18z@zRCuV(^VQuX!5$u`7c zc>T73EVU^SYh$Ya0_o1~;d}^v2SqMkpg9lsl(ZOW#5o(9Zbltx+t56gr=#pdAv=Lo zqEN_A6u3Fcu zp9%uP;>AOu;r+zG(v+}k=PrP2UERho^7hs~GdQ796wVfqyh3#Jf$|69aYh#D8Tf7R zfXAZAE%s_^EfeRL{v&{-7bMwBmrffv4J*}+w6SqV`U--0k3;ClVj(cCN_gV;LEL-G zL9P2vZw>%f34$7Lt0&wi0;*xH9TXUh74P^_bvVIHglZ zK7DALS5l}tvctF}ec!2&AZ*y4ii4pjEcH3chY`r&)Pv|Do$O9V8@4u}ZJ+ef%Aa;$ z|6?-2go8;j6Nf~Sw!rt*GsVP7(hwa9iLvxq3POsJKIfC;*WXz^3a{OLV=n?gO)fq% z@|co@!fii@{_^evRZbM@1lY+tkbH0D(H@fmy4NZr00LUS$H5E<{iokKi~uLXCE!J? z_GxP#4m3*K#uyn?|3EepWFh~|$f}kKgc@!8l zA(wS7(i0%;M_^|86Jsgf0MrrQ45_1Do~|(i&H5C=0dj#ut~_<$xo}WHK-*bdZtaM>vKW^+H6<`il{{_2uh` z+IG8mYV5jb>Df5RF(DUY)$3yIM4$B&1srRxz*#6g4QE6_rl0It88Gkw!-PlatVo&+U*r)GolyIiK7sE_PAonOtAiKZdFF+!$CN0% z^72*HO%w`bG^CRd;M;vN5Mn6lJB=>5^L83}9`Uk~!zqieJoQ|3_rBYrtIyjQ?Owep zHmo?j2<}%i#y4)+89n##Q8mgo5;Mb$X$QEzksceZ(nMjj0s$El87Y;D$L660@Lk@o zj`YIF_rQ)_QQM^BFp{UW0ZDn44A}@8i}a>_b%2dj9T4iY1L@4kjazp{X&1Z;co~qL zw#a&q%V6Sht;@DZTUcm^H8~-mC$P476)Yh7jHPY)vAoH`MURJMKy+L@1=7gvT#0cU zx5*6w9bu6tbYyu8>1e9x$l4JD=32bKN(c(B+xF~>&S^Z|Ua4+%60MoL!0B^Wmp1sx z`yZAh3Rcfd!h%OQYa6iNJo1-*qMkAQ=K7{~MWC(vKwLt0rCr2g|BIJJ$N`alu~Qbe zwhbmotS?Ga%Wrj3BMQ~9PT|(t*$LT*f{bAKQ;h@78&Vi?8LBa0LoD&z0f zKmZ2Un@b|YK=|upj$v@tEG+J@%ca8~BxbumnntpZedMJprL&PAfw5##=-Sc@PGsDQ`epU}xGY*W=e3u9C`V5GWmOmp=U?U6ivUAm@m=t8ZVEjRb@V*8B5a!Nt zlr`m5^dKX0o7dNQc+BPVfka9a)#w{o=?GRA?TP*gcqC2}aW5+|5Fo%IL)&^KdJwfMHFga-TQLx9ltylL;>E5>L&_?^o|{r z_6*@5X&wE*=BuKo?te7;)9?Ne1up?6tVd`aFae`jY>&f;I6hRTjlfRQ4NN^WdFw;K zH*-8%R{&A0!oTVAYod?e`yfahxTs-8TEc-?=5_u z1?xlg7$(hFuaf~FkAbecZ!>laj!qIC1@(kH3PHh? z$+q@&(cW!Wb6-Gu*xDMWH|N_!LGaN2;YEWN0CkV_pJhaD&!XwYD`~O80tdZkW z8@_fV29h@YUjSL-hiDkY1LFuI2f_e@hyCNH^q=ZLXJT}`GlDQ=EC49%^+q@tMEW`r{V7ppUR+kp)3Hh`q+PXzz*x#DVU@T^IO%t)FVT%Zo#1bZ%a;!F zm`>zGq+Y6pDEuFLXW`t+v8?fbzkpUDqNj>4?$m?+p zlTid=wf%CPb&$OFT`b8hR!9Zdij?=~?0sTMWbOTP2}ssM@4cES68Bj*^kd?Xf26M^ z5?ujQkSgdJegSY4yTj%JxUI~c1mGz^Pk>{4mG`gjE1;kG(QpTzPHOWEf z$$Ib=-vf+UH)1B{K_Qc8Z;k)9-_hJq#Ev8cb~+wxH^FhMcnn3f(Fcf>0r*_n){5iN zgiz#7~(la!Mf71TFb;O2!jW%fu{2XOLtUyu#JZvxOaLnL)^bfxh6jhES%XLDJ zbO%j#2zVnN^>KhnCtZ zJ0^769KvMF@?l^25q*&Wgm7nsM9<|!n0~R}kG}Se*>elxFSN_Hedq@OF5dQYMLfXYBy{uv$*733z!mzNz(l*^5aexp^aDRoFOp?~yvc#bC~SeQ=u2dpU@sy{olL3??6A2r z4xvjPd)kd+46!}WJM?QEdC&f({r>2s2y7$qm=T4^mkY0dYp+CM<26g{Z;FV5Rzopa zIKi~d*pVo;T1CQ0CSV5kd>>+f&Pk3|*Ifx${j)zM0k$W7l?eIXy1P6?fDTFQm5!|6 zMWjMxfA-NpPN+`xr$8gL5b+^d{5%Xv;uMeQ1xad$+1%p+ZuU5^^6iQb1A) zF;TVOM3$(#$ZwRJe4;RuFJF9YZzQ2S$mt*M-!z3p0piKx^So?FLKXq2k_#my^(*kT zj@F&}Iib4mxZjz`nOtQb?k51_B$(SxK_a3qc|xy>KNc8Y=&KHLGls6Jml8UaDIYg% z;~5U|chcpjeWSt9x=UZ2*T*4mt4M{2N3*L^(>Y4Jl-Zm zxtL5OWmDqSWnX|lM7usINt|?|Fq8jy=(6UGKmU{7h{9JdIRX7mD^Yk+N*yd`f@Ic% zZ{N^^t{4AsL-WYp_csr($U}GE*F5#;p3RJBOX1(ML#-E ze{Ps`qA-&iZuvyde*pEB=_d-yI!~_;R?ioC&E@lR*P{$@e^4vq_N0^V;r=pp8su%d zzTTt0e4w^b7k;BXi=i9K*=N?Nu5;c7@6}~71ol+=&h1O?am*Y`K@>V)APMCGT;*Y1 z?W4OLJGl?)*AOqugAUz2etIvvd{lhqVzEAM&pLU2RqBp0_t?Jr9LMJa`Z6m!-gu^S z{kaR;Tl84Zh{B6RK7Zj6y^)0XZ{8hWVw@(T5EC?+2m=5i5_;T=dH{m~fQ}&SEyWb`jpiJVqE_VZ);Q zWm`QTP{trG-Cf^f<7+N&fz7U8A)B<7*DLeg?K{?ap67~AQnAcAT_JVyVMg9Xa8=)B zVfSPcg_%5l?@xQ(O}ONScc8y%+fguJG6}{tCaxUdSF6p}Cmks@G+4LAxAJVv-~f8;U0sQ4tgS`iT|>H#uW#J)p2s?WHAjvc!|EEA+q zesQctIUEsFA{J^Jeu*(*tkNd;9c6Q}>v2ot7CsfB4!?;oW3D)Fuz&j$I!-Q8n927q ze^qZJ;VtX_qWSlSE}2%Mz=@+t8sGt7UY*oi@1qPR9ufnRr*=eBA?+$IhfAI3ZI$%W(Y~Po^1uyr`+WUm^ z<;94(Ws*FPCH>8Qqi+$J0q*e{?Zy}gSaC0W&#{MY><1)xkgl9fRzx;qo{Cs|r;s+I zyh$AOQ!KSd&LbQ}3hkR@j^)Ik{YF0~sUe6zulyCO9v>1~+6iC7Z^$dsV@4DvQ=YtU zU98~MJ$p!@@FgFl|Wq+Ft&xnO<%;(i84)m03r54-#7^pm;kgn zpwZumA?b|xv0ZT#F)be_l*bpBpFE!3KEC*b@+jlg$9T*49uI>V?MCb|)?vHGUqsr( zN`z`()j@kAf%Zq7i!6ie+FtJ22#e>d#|p%N z#EbJ+K8Br`tI(DHL_Z<)72+Lr86WiFj3`W`lt(J}MiS2b`5!g^^uYO3OcV&@Apl_| zK!S9>dw@wUfG6;w4*S48=pf<&5Jlqls>XW2F82{hk!>;&WS}0&P2j6`0rW_Ix)$fq zGwBz43ye(`LZU6+SAxSzO!|rtznmo`EK*pqhH&uYDe=) zviCN%cUq)dNa`OYeB13LnhWf)-6n@QkkJOO)<}4qa0#+$Z0WrcvLpd_^_AP0iS+bm z=qe}Rt!%klx@DkcRa8yigyFka(OPO zv>o<`m`LS5Gl`xNg-Mftd+3tpJsWrK^#Myy-23zCCJLOm&rP!AG;ZCBbP$Mo!l>Kn zw#&Ef|L=ePx8du5|NDQMAASBC?L&RqzwezNKEF2F7Sw&`@uxK3c+V%BAAaI1&4oW$ z*Ic#n!sg+-?`zh5`Md33ZJ*N;m|^<4ZEbv9UV2pOni%Ew)NM2gb@@c+v85gZA0`0bF?KWp16b*qaXwPAAT{!FrGL}8Mo{8X`@r!Ydkclj&X z=k$K`FrEyv_qojH*GDch=tG9qWvudL7oqF*vC%ur9}g9PF5ukVcjexwi1hs2=snHN zmtE67Z0O(q>0g@K>r-!dPxI=(J!D0n5FI$J>+c6^w6DL2q@^!tEgyo<8Ve|BT8>XKqjOJG-;1CIFSdN-F z0yDe^(2Y$9MsXY#9dK>Px<#B+Lr>N*fV3c9g#B0ac*k)kdnX}%(9dzdw@35Z9S&>G z+2^FrgcA0#KiCyS19n}#>EdRb*Xf5XHYfc4Ud`)wIs#wvqrXZ&E5d8Jz^C>n>_`EP zapQY#C%axDdPVF<>7`gied%xiq;W1?I^$gPhyDoN)t={=ZEEZC9{rAfQNBK|);skn z{M4a?re-t=kYxmL}9j*&>u;F{P@a~+3)o4C@{$d zd58%jfSHFV5$9!aY}-eoY(;FDf73o!;B`A5-i+qjq$<0I@-u)n2ah0- zMdIAL+P`euU}vC@_Dw(tdM?k3*^<&pD&W5VM)Pn{fBB$OhtmidSc+2ojwI7niOaVkk{!dx+V zz+5Pj-V1wYMB#;%e|_+x=8G2{-8)Hm!_WV?`G@;AuMMIw0z*%e6+w-Ro`8q4oH(Ay zp0FklSj8rZWC#+2#LIdlH1i@Pp>tdhal7Su?N7bty7r$FPyC~On$vbY8oJ0|{HSIC9lVN% zzX1vYdiZ-j#)kH4rN?_1TO@eIo`};>pd?a3PzgOr9vpilYm5&OPQ(P_QUr;_6C{=~ z7Iobp^fv*gek8cM2SC>xfNq{oUU72_2cE}{WfM!=KtEH*@Tm!cbYR?R-op;s=p%?a zZvy4ES{je_T0eo;C_qDQuenr?m$wb%I{}tzL{Uf4de|PuhHRU@B zd!Lj6jeyy!T>BbFk(#$1^ZHKG^5d_5yZz6Dvb)j#-$B^TqzJuezdx>F@?(NTJ&y5nHk#i9O_@3=?98nkg zz;@)5?fuci>}QWx-SmOxljk2OAn#vpy7g1kW%`Li33Q2e0}O6VjQMH>%wO*{iCxDs z;3Q7KL-h$}1U@l;BsuAe#ParIPi`K%>%R0Ohe8sL`mJ4?m;U*FE5LkQ`A&dIjDbnM z6@X{SA9cR|?oV_Qh4SY}+}&VeqaG$B)L9@2{p=?tVAr9Tj3xf?J(39%RqL*VZT<2% z@->J+AS0C^dpH`{yyKATXOhrqgWJfj8$4asgskJfeNxvmL^>oSl(FM$AZ~Fkokc(t zqxl?zD1IDE=rNVE!V!G`Rs*<;c?8{S3Y;);m~W%5d{H- zCXpvyUe@K)q?$7KdZO~G$U4@=eP#OdetEFc$If_bv*BAmY(BE|_U0A49@_q$ahd2Z z|H}iKQ+GYO{NlmjY5N60b-(#M`*Ni}208LKcWz$sR|l2^){MV8At9{x35CaW`zDf1Ueb))lTA_~x)+X;YfCNDuqc4$sm#vJ8uIJ;- zd!G9~ACE-&-0h@(cWhM1XKzGdCLh|oH^KS^lQ;hSPs)ErtW~105Ub*GCF=K3ZxW;s zfzx(7ru`XY`6Ht8tb&twKC=A+!C`Y$~@9jafh9PV&HAuvU^LTTtNZWq& zzl6TfKkGQDmm}J$C0(~SEPp~2e@b-D+=A;+SM+BR=6b&G_S$24=u-8kk;nW_`_srE zFGZJUmb@4GP4;tYM}DOq+l;3<-mlw{-VeV}7whFZ6_PN=ws{ZZs`#k;9=6(d?o;zo z^9Fj==IMgQ2;#ET(f*{ZW5!0SZ-{O2HT$?Wr(1EkO1wNnVmRmXDI*FqqQH+F%JUi4 zCQ-m7QQ|{#jmbjLHULIlw8zPbHlq%b9VWaIMv#MYtR!}<@}YC9FYC)bCk+ErTh}&H zFV`<(fDo9#b^{oFUi$JEEB!o&_NS4*w`X(8&PPStvK9V?eeF>?$OqdZTdjR_0Z8-@ z`{5CNZ`L*RQhoXs z=N)7Rw%NvVZvEj)oU84KclF1yppPvPPZ%59#IfYj@r?eUTSi_r&T%j7*Z3;eaW2e= z!t@b^x2*e%=IQ%4Qm3^=6p&;D+5`(F$@W+TtG)J|tM&y2H#&s3%)gR)C293|Lyhhpk1hA{MAGA#T(Md`jS5P#m^(V6Om}00dnD296(r z6#54F6gft$vrPkh#6j5H9yt%-Bl=o|RpUtinV4H|kTv$pn58WwjIfFGC9acTz)tjE z&P8IOi(&%pYwX}Z`Brn&iy+Qz5r87KUCRZ>5tIU z03$L6GKl01-w`z6SB?|Gfw2>QN8BM6K&AxD_76c=gjsEpWU~#%7h;!lNQ6K!B_F~r z*0Dd~Q`so6C15iKI1ct5=Y?ZsiDSv}@NNng1SHg+&&(Yp0ElxDE6@w52m!MpBl zwtV+z%^MDTRddFk$NxWjXW?YW&2;@gyWqRR&~uCkXq`IbdFjunj2t^2^xHBWFENUX2sQf?eSZm z`$~1rz7y54bN5g@1V84p$)A=Z-nROR@`c7PKmAf!Ci$1&|FOtDmt0>@Zrr2ywZ{45 zX!J>*tOr8^1OPs(UV{1LE%#03{TJ1L{`s#a|Nr^Nzlsfh{LSxG{eIV+bzyI5WW5UG z*sVvGTob~GIZ^6 z=ah+>KmFGCeJN_myWZPlH{D&Gvgn{{MQ!inwi$PTVtHUWLxb<{xGa5jySwg2{|om$ zR^5E&CDlZo?-fI1^*eW>3g93qBDp}>u%QDZlkOqIJ@1*L&Kh_baWN9W`UhZa;)J~b zkk<2tyg#ASh{{R0&zLVdte*ClQ;-gNjhdGu>p9388?fM&e z>X!TSFJjv78!vyUTDAAF4cUVm-^!(d3T!VzsxNX*=l8kCpREqrZ1?JzdIii%5fhe0)fp4h!F{RFJ7tJ>$07<6AVuSq>{ zo`0oCn)J$}W4e)7Yv5l>mY8P0>sDW^uZ8N<;vh&Zpp)8y&!P9<$8L-hVGYzg3_;UL zB1ws-I|FV9a2Mz$(dn1JOx(sUZdbP_&$IW^o@bDv+%6qa*zk$M`OnU+{`spHJRKcT zc%8+2)aishfuZ&>STQuxH(m!~2O5p%@AFBG=kHN^)czav8xJ4~ka3<<)N>!`i<16}W`Pbk7(O0+bA2M&T_HH0>u5nQW57p@};8#Ylm_n9rKzxfJ> zjwpDg@QN}nY0lX&d)Sq6EYkK|iA&GR<=?on1r8a265tsp(kGp1k6qg@kA8Sa-iapN zch~a{zV^}=3Q%UhllMJR9)$uJ69NqBojy=0@7jV{D;ESr1@z_h*z;rCRF|KyDz%I9 zv%GG2N`8usVQalFG~SvMK$pL7O}*Fboof;_yGes=l6hA~>*o%ivqy_=iPy<9^@eF@T;2To|XMdiUjWE|-j*F1#2@yPajmweAD`jz*y z4q8#Y_~=u*-@GFcGTlFP*6xkxW+m+1l>bI|8_?Nxe?A9ZTw}RMT0A}TJ)Uvdh3B<+ zI=pWAbG*-^i*#AKQ8r*Rlf-_^Q}ev1h5Fmci`p{R=Vdo1C>Hnpjwo!%MB&0`hpK=4 z>bcf5bVOl(Bc20$-><0irPULMY_^~fj}sRh zm=P6`n>yXayFzekNa1%Z|806jy!QIoHpM$}_OzyN-_1VXsslNBMZz-QOc^azkEdc;QkZ+0G zfk5X(y3{X*(K9)DFc2Jfzyv7cx)FWp^|ISW2uMuOAwc>;Safc>c+Yh~5Vr$=3xLn> zM`&~(=}U;0=|LVOiS4aJ)e(galPFyC;%?P{e*JQr{*EZ9paaCg`o|?!K|v525W@fY z7Khz0f`(IHT~v=y4YOvMXWJC3K|j2H)_P1${5rpF_2sDxdFlJNEMT}2BtvPDOW9`M zd+)z-_1A#XG)9fRNTS+7lFJ$!kQ6uzm?p}Kg2v_qx@2kOc3O$yjbCGKFD{z z@{J}P`+j-{fwX$eO@pmTp8deK5S5RKs4TNy?6?m%_;6COWzqYo9Yst;*i^g4z1ivO8?`<1tXh;a^UqjeSUO_C33^*Y7@=oGV;<5COTiy^4@=7~3 zd2Zrs^cX1X$UG#TkhV1WGmVXzKiGunV4G3w=lL4%h{6U)6dw4}A=Ur+?U&c4zat6_ z_&1GQbB>B4L1k(xh~GyKik=9N3jztr!&jbuIhh-9O0}#8c=h@O>P;iuq+z_NynQ_a zZ#3{{i*3om9p$v?Bk5L4&CKAgFNtl>7 z3XcKHFzNz_-&l7Dta#rJO6BPFXFkINqDF(NkK37HS2u(Q+=g$;=)obtpctFM3e zl0nkY5d{Z-3C_LI(DP){R-yR}#{xZmfY~-VDBOPeb?SWz6y$1#4%25u!6wYnBcO1| zrzZLxUir_53U+_ztkQ!PxUu&`_wj`XpHTf*15z0{s|VjSfNT)8kHf(8B?M*-D1r1n zaQV$?uex#J4;8yoL=-Z6D!lB8_lt0eUJ<{^qSt!b^T%sDo|sPNT=1@0#iMeJz#bs1 z6($++EVkQdXDye7SIq#7WlSCif*!~ruEP#31j6HFJ@7i%FAgWCjef)n4;Ru2!p^Yh zaeLmk0eK+MQyP#)TG=i*A=rktVxByIMwHm2hd$c7xsLc~TZ^+65;WJ{q!~oT(~LMe zkHQ8+6!h(ezy9K>LG*V-!Fmm-*tqU2oR!2q3`Q&fd~BfnS?hteg9}z0pm7^_{c8vM zhn|qDTod&K&>l7!ws2SfGBirekAq|a&cmZlcIXL6ydxVoUyXE-?+rN|Zu1gs7-rY; zlAnD)wSBXKz@&ZhqYYb(ez@3kVA8ketR3|(HRRCfHFtQUKU>0i%6>%0jdMguD?Am;!_Vlve&*%N_I^akjc-@7v;p4Xn5C#G;kRTW`F%-tJ{E!oVK= z+UqQP{M6}o@p$}M*Fmu5k$Pw&kI#vl$B%RGwAgdr;qg3pT1eR5>_nj>3THn(r~2mi zE?X!49Z~Q~U<`cS?_1^aaAf^<&wma|Jy6>Lpk`i-1njRq>%zv}+yK2KarMJp-MIRj zH01i-o1i#6AFbl^3Vgli;0jm^>H{k=t`=-lk_1JI*xe-i|bq^&_2Wd?Y&`xBLr-&S4WG(0j1|A zpI03=XQ9^p*Mf8mj}7eVKSaG(*eK%2hEL?t2(lxPWLR&gEp)?OcSz(*R9 zejT&?4`=O~#E6h|F+B9f@r@-49Z@*(@sC#5zO7L^=nbx=wtLRtfu zZ|<{eO*FL9;lPcGM+5dU8xJ~P;+-*HVyS`Kn1iIJWy%|1^Babf_W+U-TSu!WuN48b zf98egk*(dSH^P%>4o(!}y_%;fvmw*9`jC|x3URLl$)tm_jt0z0&vaNahB7aZV;Bci z)}yG8R%UPv+gZId{kl%Q5svpW03EY5LnqSmO8by}g^WoeoINXX5`=5atC1T^Bl4*G zNH^OwiPcFzS6ILA&vZoL^&<)=J^r!klIOOm?)?1T)w5qevHHo6ZmItFZ@&1d>+d`Y z1WWe{=(;KuD-9a0UM179r4i5(y(kGASyoDk;<;_r<;fg@Q#GcpF?o%tD;#x2_;i;2 zgu)Ix!AV{H*wt}y*a?l|n7jHt{1nldJC%NgSz}Kp9uC&|d} zER?OGH`!G~TS|ig{+O5N00{^|X^en}ItHM2VgWFUa6Nqnz98`tZxI7z`w!qY&?MNk zJ|iKZgTU}v?}3vT@tpPqabX%kBn+SQw^-Hgp{*Ea0fZpA9 zA*eh?8pz0d_gFFQ*$9tHNTR`tn7F&wERh@2JK)hR$n_RDKz+SWyCdq&vg@x~)9UcX|mtK5VuUwsf6%@a(y!bio zG^yb&ecC$WVw{q=W*`nQi!db5K}sR^-q(;NfGmjvfso~wpsypmgQgFj0D9FNfLTXb z)~)VDSau#Fe53{KM2O{6;`KrI;>h%Y2uffh3a|0~z`JQA31K2#9zWlMkv@_KBM5bQ zAF9sWedp@Ylb2U7o;xP#K&X=qjVJ)@*=UdeNZ25`>yRWtVinvQHh%^Usb=~o6W8Vx zcelp3*)W}11HF3DsW+iC{@x=STlb}r(u>C9$y@GCNshwr+uPs=jSs*F*8q_De2L;A z$%hW;6}WcQ#nsF8_QZer-5&?~Se16P)clG)KCrdC7y?pxW{?kUn)Omn=Aw!uKOV+OiR<7w0oK#! zJ#2r5!wNgh8<5M~BZ=%gbG5^u06X+w~NNh+@cezHU|-1m|*mL5i6B{0Pj!rpR3coQrw(wlA) z6rUNMFmFZ%k`bOuE4=}-UgtV3jbuLZwB)M*)Js3Qe9>{X=7fkKDBaS9v^!W04C*9H zsboLC7bjqhM_!kEF1dc4h9Mrk?Ov5NG3v$*Vo@>>mS~2iuj&eJql7VbBIDG9Z|?-NXOS+Ze7)X!y*A>St2Qb95RqMFpYKo z0w(rgDelQgUHzMdtKY%-7kPNh_8-&+`5p)&3IN0eu-)S#J1M?vS6x)?yZNpHU6BLX zSUWaqRfOhb6cC5bn1G3xyzEZ;?x$y--lmMzl^ z&x+;~pbQfXVCSLwSj*8{E~`HO#Pb7@h36lBLhn76PNE*T4xZ~7FY^X;7RJL%TA#IR zb`HI;DaD_mjS>>z@p;-w3V6@rbA7O-u8n#e5ii>(Cxy_*@S}{w<6=4zg2}W*8W}FG zbwpu?N=Fn>!K|XIQH=&C?s>(=JvN2`##U+BkSiSZvcmf^LkF8>@7qd42?hMW^ZBo? zWddUl*bmxdx4QQ_0)10y*E!OVjn&7}NC9Z%pN+?$MB&gvG|ZmXAijA2z)K_1(;W@T zyc-IyxgMIBDFDO=pTsao zGT%Xft6pv|9bw0eC}7)T4#~KuKtj-Y1(*?-GEWBd_U0(aqp+r|^n~R=qWH35hgdGF z4XgshkX8dM15OdmM{m3!WK#E*a<=`|051f;}C1NB-*hNRWo8xjoU1vXb0Cr-Eq zG91?;Jc(9Z>xjY(l#VE~N>V=JP-q={hhD=&~x~3j={uRlctKa;D zfXE?-GJdbEnl*tDjVJPkw1ta1b@hLuCLXcD5aSwbGNZ=QE=lCgv{Loz%B`WJ^iOIIW&DI z#miFzxQ26#ycj4H@v^P^Dj!jfGIFZ<8X{(_4-%C9_)i_w$>&KRtPa7}=zUA9etEuJ z595KY&5J`&j5K%}8JC3R7Gw`)#mNhY4h+nZN5+L`BYd1&{o^yZ=EMp_sV7Vu!&+MW zKFJE=)wRx}FaW|pJ-<_>BMRnnWMex9U|u5TPD>+;i`&vYnA?3x?<ZWB%^2vZ4(D+0!KWfdoXl5T0egi2}k(oUjuty;tmYkHCy;{%##4 zC2lL^0r%U%8fmlo4$wzjOrt-Kyuc>j<2SuL`hVE8^`2j|_vP&v%UMShW}I|H0hQSr z2Lmt{KJVgT+Zq-Z^hU0pT-_IJ^m$+{bMszuta1>bYx!h*x+QERk~slbf)^V-wKW(? z97`Pk| zx!}O#Q-V^y9QpBWw35Qh8|}(@D%rAE_3{~)9aGUNlawg%-L(U)0VK}dt`rA;t20I< zEv%;@0mcvqRucpHRIlgFIsn;wFp|on|7To&-tO7V!?oL(=aig$bVCm_RXUGCB34<~ zUncWs`u3=Q{=*;pwdi4L(pjwcA2=^RNj{(yOB?BWc99n(Tgt~hAUwR2gluV~=1UN4 zUHKammv<&GZkif0|!!`@LSaAA~6U_>l|V?9xdmA__Xz zL}8u^cdxP6G5+hijuYhw(Yb`r42{&H|9(E=&+3Thc#V=z$n)J71;S(Xyo3O+3FwIb z?K0A?i<2YYI<+)%_5$^qd+`b|U^|Jt92v;RR?^2Rjj(0nk?{EvB19q_&=0!~7~dUN zT(7wtwO3)G@`Lv~LJ%!p1pfY5dj=NQz==5y1o_kk8iLWsm*|lo(EG$tdL;C&m46W~ zEs5m2mfSLx-kZ+6MD~#f0M9^RH(xp9gi6F@S#N$x#HAzc&G>R*xK#S5o&UX_dKj;> z{_OfoUe|c;B-7iS!Q)4sQk`x0O!8;^StkmebTT7EL_x0&v0-)OM zzqo7(O&u@X|M+0L{na2JAQ$fZ^k?5oIA!FpG70b0MF$J4dw@v5U3_TjRfw&M&pYe{ zkp(S{)O*#?h0>+?TWx;IzDHt?!x9IzcCP}$pSJ(evVlAzB%UG(Hj&dvLJ-1_4E4ws z-nH~99ulNq{^+OGZ5Ldn;T3&bLiSb~2}UWQI(eTX*LZO1cjlzGm5fRc@ z=N^W7DDxa(L0EK;b&AhfI&cl~*z>42)DOL|X$bB);lWYqi)Yye;aS923vFX*2;F^2 z1I`g%;gDXW%gc(ljSOSy>HucONkgb@e*ClQ3r{>>$lmk!Jyw&TpCgS) z`H}}jc@6KxJb*la*@y@{4^}4>2fc1An*cAJhh0JBtq!gY+>Pv$DC^jqyAI2jlkEuK zMjCL`Jxjll6|^n%05a~7NDFoKY;Nrbbl|*aOOiU%9d>Wi1AQbm%sZc*=!n8hl#VEn zk+ac?%7scB72e2!&ZA-QxZ=75Ox+r(I1hc2Tk>7`rpAspmkYc%d!LmW4ZtfJ1Zy1D z<#*3jH)&#5Ov-sdv}_4XepFKVn_AMIJx>rK0NMBDosYQOCf-)jj!Y+o zcAo%&=m2J>N=Fn>DJb59VTJGp@RgnjYv54%t&zYp(BWh3?uHJ46j(<(d6cy34~aZn zRgcO4=O3oaX4-3aKIzmjhe(3Pt9#@mbfM9$udm)`qWb#FUrY&tJR^I}+DUQCGf)H5 z4%G>}?pyu3c8%x2J*P}YJb1GJZnGmiD@WEn;s>w0y(SF5AGjwUdbFG3@(<2azO{*! zc2#UIC)UH3eKfQny?-2Bua-Y*UO>-tQx7%l|LGkC)^PnpmjT>)2du2V@Z|GZK6AYv z8q%tYnhf$iJLz?RCTJK)G2N|z<3yqzSUtZHj-cKS&Q1g@{j9fcU&e_c2?zQ1w!_lH z=Lpc$=Rn=wKDZ6N{<{wMjy`p3NukUqTueozAV}R$X#+S?p0Vv(YUq7 zl%Kfc{_4&vZm2GtJiY9pu=u^DXRDnF0Ui|Bm*+`t``a(Py6AfJ_IowyP&)NRMFDbr zZdn^S3H%5i?J@g1>FXELbFY*QyP!d7V#6Y>#6-LD8*g9W#UUY5k zU3j2`Rha8mUmRiN{ugj-m4|H5o-fO@$b^WMCPLnL&SeoV1nG*eNPcu!b08Eh_D(Qe zZ8Eyvdi8$y@99-|*<`Kn(E(MPIcX`YR)$=5{8`oYXJ10wOXB^OiIuK*Kj>9{9o#}! zQr;3^8}(}*XKv#>tk=z4vOEo?`G&nRN%HHY%b(A~B?KUeZ+dy?0A>bDH}tUef3tTt zIg%tr6vyXAoB*dlHK)iaj=^EL1{Yw@DcCYjVdAI1yvDn_RGLvvEKE@u;clO9 z?^y)uVO>8+J|BL2FNCnjY5ni->l5&jMULw~d^12E9kc&?Wc|MiF14bt(kr6y54jpZuXpItzY|= z-Zk{-Q~g?>`q#f0Sb3hW2+yPEXzT0Q?(bf=yK*)}ebTL%yOq;rZ|PflH?eZ2{Dl~mVQ5n(C+`W_vb}4%jW;=ePz$jgKXnl zxm+fQeb zHP1Q6`Zqc8xAkbQ#+TUM*KZ`}-F&zgKa`%INbczyg6|U}{YuQ_UBBYL!&m+6xmJ4K zb6%dWLE&NL8We`40Jlve1$+z&RG|5D3D^K_qWYIdcP6_c5QNP zCKt0e_aXL)abnS@4gvb6u7ZxbTodw{To>R3K6QMSV9*!eoIu=80^9bY8jg5BsGKk?OA0-S&`vEVy?0UF~^$d>1$k6}c@ zAVy>WThb8t3gSNNfD+OP(2jj|LzEq?Lei-vwNA~fOZ+UE)z;K|_MlHcJfl5J{l12vvK*kDNQaImW-_ea0yPQ8uGT99+k-9<2$Jlvo#4K~dNkO&eqy-h8t z3!bc*s|4-7v4MUCvJCJD_6#Jx0c1d+xs7f7C6@TaI*7T1oSXnAG|H(!40FGGxecc^%c z(YM=TN}k&F{kw3YT18 z6e?|i5@E@=jk(w3+N{aF>Qr1`VCj8M|9Be>L zk=DODn)?7LIXe1GEfUMgw|rg5ns2UShrhEg{`SjA*PQEC0&VWmbCTUa>Hc1uqjSzj zTCdil@m5E3S3T{ggMSWnwOifjIMkzc>=&r!;Ubtz9(_>wcsV!cJ9NB(NZ+}>WKghr ze?C51`Ud_>%3nTQ$6tSu^IYk$^j>}4`%y7Nh#z;3AK(mLgTf`hr9t7-%XR%HfuEP~ z?8i?&ci+?cJV4(YJa0Z~x03zpaJ@P!Z(MiImpOSl z>ptH%$1l=n-Pf8Qb9VHj&kuPz`&YlLS>ofq{h=Uvo>~yIx(_<*Q}mqsr8fQhrI$wb z`ksvcocFFVf9cWbyV|VnU7f0@eO})@cgM5PSkZqG%q0&uC;)zQrEzSglJ4uIYQv>D zqsKMcLeMp0bKB$&Hw$=QbUelO)A$bvMK^y7m`gf@;AcQBy2)F7Mt}4MkTS##h_5U8 z)24N(t>$~|xNk_pwbre1Th|eYgy;C-Go%CRfzZ`yo;pBMztp`1G&!DJB<`LGYer7% z`@WV_$DZX)pENdeOkHE&p|Eu#huF4`qf=YvQytOS-fwNyHMyW~qq}$!(a)Y6^_+03 z`DoqA&D4xOxCrKw2OJb677zb4#1Jn{H@}CV1m9T)Fa@Z6`(&?Ee{5|Cssx#@1{24U zfI7b?K8J}Vf&e73A7a!OFdaY_v;{$8%P@s6T&W3p#x`K<+m!VZ^d>*lYS!)EjM+!N zM@Qa_&3EG%8`M67AN3=yd;!TIgKpN5BYdMyl8Pit4M)a*{IVZPoa7KcQ%CetqtV^7 zh~M02&=@~PQU`M1-ouyl7Nk4t=->EQEFm9~Ip;1zu6>aF_gs1gSTi~@q<~e{aN@St zpW5@SS$oKSxCrKwha40Hp#c|~uz%0GejNa81XGD;8W7;-nFEB+0hjS31P}1h()*0mu^nC2#cRjT>@f$RHNt!#{x-y&(iia`fo4_d0leO3WpD^9A`P zcf4g1TY;W66EpY70r}Fd`|yKjBao>2CJxCceSv-mQQfI`$d!CzH@^7=z~}762M2?E z*$Fw)7acay(S9b+{aw7UhshItkQWd7BK9R;V<#65$Q`;SZm|PDOYF~LMEfew9a_{k zIYsrZ>oe&UL*Ez}Ca1!eLE;!<&pe&)z{thRSus{@_*xNVn z$qP9VEDBye7hoj14iF`1{fnIvWpxN<=3l*ilkae+-VzjkQhNZ^7zFz0%wXgYSKB2k z2gBSW{tg)($Q1OWch>vd;f`EtJA^!XmHOQnIw)Bm$go5np^tlhyh5(sPtW%S!eN8o z@ripS;KuAA(fB&ZB;KB_4lJqf=)%_wb<`I-#WVF@1arv)4hl2@;2g3-O6I!>f4i^1 z5Gf$(i-2E(_HWDcS^xXvVDDL< z{v({HH|H(a)auYnU4NGMoTYo81q-A9w>KzUat#V?h=4|Zr&JQ~VJ{sMM`Kk_pCPW%m-%fBB?J794gATy+X1BT9Xm+lt&aur-mmTMH5a2h zbtpMlxb0xA>ks z^&DrArGM-xb#-6QsOLmKyk`vRL+8}(w#OfBj-U6Ofz z73&xR$p!WVcx$*F3lSe*4`Z8L z__y&qxdt8jqF!SF2RN&q(Qh3T{`vR6U2@5NE7z2m3t3uRioGJ;QQ+OuikC+N-Ta^ZeTSzRcL`^dzx;%b@V@fBoZ< zOMdmT28DI~VGF`->VlBh5>q9BRzmRJSVBHZso zBn$Vd`jHxp+w$Vw+1EI|FCZsOmZ7f6#pP*W@h`WKL*Tf znVC^xW@ct)W@ct)W@b)`JL@iYWq#_LXlru{YO7w!JENKD>FMtGq&;7E=0$SbrPs=> zmt3PbaLIPEp=pL}96i&>F+X>qfAVLW7hT19l8=*od!9s#-kRkQAlze!{Mfu5`3H*d zDLp?nFSLvIUg)p94Y|C}+gdc=?7zQIs89)oY!h;A#i(~oDjdVULze9*XYO~jWJxL; zn`Y`YI!98!ZGJ3lDIZA#_cXeH-h7d`<>IRqr|olu>^f2HYumNWpTTA;4ejgcPD=iej^jV=mV5}J;LgDZo_Lj6uBFhGi*E7Oi z>YTrR(xWX|7_0Da+>aT*$MOhQkJRP2T?=E3_eIXv$41;&^a`6dy`kjS8OFY?WUofAJ*Q<#Jd{^W@*PM5W%p#*ZYb3=>)v_G&t@CSUDA`h(H;LjrE zxtpyJzdDxvesAy{bAm#WcJQn+!~%sT=L_stSe(!f)+QTgHH`6?L3A^3Dxpx}Z}>)m z1=o_p;7P=a4hcZ}I2Q_o-lx!ZM*{iJRp(r!MRsw&tz~`F43e))dL+4i2Qe$OjpM>S z8^Spg?o0Q;b_yr6&E`ar)bCjP;AK0=6ZbqME%~|h1jL&3qg%Rp+}yX^%;M}ZPt^&b2i1X4p? zLP5uSk^yP^xZ*iEF+~!$tNG66g~%|wL58!0#2*p+HV?%C;T|URYQWwoV(3o_3ak&` zWEA|7hXC|@(sv?K??XNWVhVWH{p?ro{qct%WXY%rGP~QqW%=OoN>0BB z9*7~^6VBPL+RuVYvJd@>@rHoV?8^HU>{IxE8`%VY#@i%_RmLks0QO_+P*~7MZXE?g z2!wT9C@kq;6ADc;nL{>~aR}iQ#EbJe?B(9=tlYklLpX25xqHiivw#SvC^Q@BV?Pf> zxn6lTJ~k;(IH&bnJMBfCV!yWq@f!*-ic!wt#aJa2Dj2SMaD(i0O}A2U(jAk^f1`jR zgkm2Os&5O%;YpJPBe<7D?3?1ZHHLFo(hD*48$L8GdS|Xy&%RwSh#y3Zg7@1 z*5x7hLIFgPM!~Cq7z@^PbH{R!wlk0LRsnNi{}f0d^k6Os2gaHL!kW3u?`XrmDxpw8 zp-=hy-7vItq43aChyM;jfrXYrfQjZol4UU^BJ(iOHq->c(gEXSZjBIUb^Vtt?6al* zL8JcW9-otB9Z6n?Siy^s4DRs-p8Y6FB(<1GxbmEfWWn&UGNs*c6$bNq{ZAJ68zajH zjhB@}Cd%qzlQ(0EtQtD0);39&4IHOG%^bL9Cwb_Odt|$5OH^1a=)Hxk9Wj+Yi;5uw z$O^@h-xcwBC^QV-77~~jY+jU-oH+;W;ans{3gXB3}FGZ*H`e8CNCbdI@$_LZJfiGka&<9Y?Zc@vrfincu)#w(K{ICP^cC2hA|%VPVPkxS5reea(Z@TMiVi ze`uETZ81<7R|cNAPBewrOqoyD%**?YugCfQ#$~OX%aSi2sq&2T;F>8jZVGueQGbox zs7sGlav(vg2wh(rr4Cr8MtU?kw6l)SA>=3b5L)LT|J{u_0jw;8iH zyGHrCzM%Y#>tlKE>l*#m=%pSgjP3^to$8ak4G)p>wmYt-9k8*b-jDhEMET#SSId*F z+uQHg?03)OeM+K!-PY>tc3cy>Wtj|+Zv%xkX_l|qeyf4PtFK(KZh%45|lT1TQmj^Po z2ftVJn-4x-V?V;;NxP+$gq^;(sU9&X$g{1XcXyDGbBgtkr$H`Hro9%>4=#0fS<=~2 z(wE2r%V0oIlyUrCUUG=k)m=k0-f^0qv%R!Cw-=X}x8IWv7m5RhPTS+Ka(3Na z1y4Aceja81)seSYe(^QM{En_-@tEG^=nv_hmzMeUd+wvR4PJigxnkKx*Jz2qD#xHq z$K=k4ztb5jAA%p+xbo8L6JLL;LmLmLd}mzRm$7I}FZ6?YOi$opIu?KCK|cLvdEK!d zKYJhb0Rc^3XQi$e=&?{|(zVJC=nl5zPBgV;Ku6%YdhK|2h-djIYHS2@*ev@f{kcf0RR#xc;12%Qz0GZbapiwry>)HT~DDE?mlMm9U8=%|Dm|h@{ zfi1Hs3-WFsv<(OP@jKfe0L#mfU&a>OK%q?+-Md4}fx_)i?6>aDQDA@zTFRiDzDHV7 z$S*irs#^WqRJe7|uA#GXINDJd+M*nzg}row1MC4(mT3 zzyD!z!omZ~XZ({Ch{EwIr9*(Tf*f#6ET@zp<2?f`e=OfrnDC_ywQ(_R*jzZKC+cJ{ zq4THXSL*piAv061%%Gm2DP^$Uw>$yzg`%0yzf1jIand>J8_8YYgW^5!k;4k*OHwpl0~ zJ)Df^#XzCsL!ffPV24A`%*IaM=kRg||JY)t4y(~@%mTLZ^I5-w?&J47$SRt0y2tLm zZwWNg9svRc1ZA`jGk6AOI4lI>eHyMNXkUU}V_Y(>5A~Q6^!{)#LY*sxPMsJymFKK| zjs~b|{-ZZ7X8e2`tuUlO7=6k>;mg@)?>%&$(|@+DR*(cxsQI1~df|&pW!tg6bU;P)y>$^_AwZPth#;Ycr)X_? zTHr8yd-%519_agl+Lt#{AL!9f0&F{ff3sr$zB$DUPdxp9^Z)Z-#d*h^QXD#Ksq*VB z2ECo4GI}*tD=NW{Hc1;U^QA`*2Ii`M*c<%-8D-BW?Q>YMN7uAs=GaN8A68y&Dylfsnq4ONlJbk87N^s zC)O3Rw1L8ir!(%}y5&IO(dSNH$3UUstdoNT_l8P7=xUa2<&5QI>+;9v<1*kMF?&yK z64aRjI;cpm9I75UY^90rU3o|0pKH#(So!1i!g`=Y2bCv3H$k&kJ$6vA(K!g>lh;Wt zxN?AyryLN}EZd)fD*)*=O|5h&80v5*0h!R3NHf=4ul?`BKLTGm_hCN30%(Xlw`s_8 zH~kk#@XY8?LD&Ou@Jp|v{&XvCB2^uF9am}U`}=RXtKjFZWw+?f6v?N@4SM{cys<|C zV7K0e*>7C!AYc`cjMrtgYM~Vg*~*-fRM+G8K2-QeHb1SjbFFYVpFHJ(Rr6yv7ijam z>g)5ee$Vfd-)Bt#MGlN=s0|cGE`9jMvX+B{LvHzL@z;0nA3mV4B&DRmf+g~djq-hi z{jSvN>ZUBUJSTqzJo9~}je~>pWN<`(IZv%HP5kmk3cz|~Qk_+?re4+F zKMT}gRY50ZDrnD-$1KoivtV~gMLbu7AVKykz&h&}+e=32Ks-f~E#1>5PY0lVB`_9{ zQU1g$XRl*99z73i+;o|@u}0$^KEdnp`trUZ&nsk%{4VcU%kTH=34YAW`MtbuM>bGs z(=Cth-EyFC?SnJc{hvZH$aBznAV!QFG*He$7-1i8OTD;)v_A)|xP<7Vzt_-E_^NCBXvSI2aK~v0I@*Zf6%=jm;|z)pB?4tOKz32asB3JL z#dkO~*QrtfHuN9lgYKh_RX46ViJ7`dz z(<+|OBij%%)bi9yhdXcoh-VzBoM!0&U!ms!W_R0cUjQ%Z=;zy_EP`nbP|)kIwELBp zUgxV>rR_<+&MJShU-m_nhK>N1A)_9*%`SnLz#70k12gN;wTW0dlSEU;4_Q_Ksy zhJI0B=pNU8pJ17wH@`~awu*A1_zi8h_V|hd@1-(9sK}=UXVNGhs)Wef_$3wRfiWzRu6hi zHNf@U+=EH)x5w%^Gy@fbn9Z_5&`t2xC)=){ZKI8FY!d?($#qlvQTylVbx#E}17vzF z(Su98fuS}p?!>Ii9lJS1>W;H+&4!nBhFyr~^No3GKS(D7NjPi-8Q4>nXY~2lUfNz3 zC@7FBZv+ExQ?z^4O)FjI65x$0flb;65cvV@>TGxi+DFofuZB%7b+YsKH`QYw$mBF& z%XgcM0viHOu~&iZ0jS}a=J=@c*|h^4a<4}YT_gL^`3uh$|U)6x8zZ9(OU!y5diDk zhUIzmf%RD(PXt}3DNXPkleLpZKw-{C6WvB#_d1Wm`IItuK<1&?Fm!^)B6_PL{?Lm$ z$bcE8zAB-83Ik)HqpPML5#*e5s{*zDfI+x9@^S883gKy*6*w6ZxVV77P%+KI6 z6|*VhY1HdM*#F2!oA>hNI(s3Hk@5A9UbXA4g2zI%OFHuF&{I=DfdSFLj*bD&t@g)L)jk9DZ4cWMb{gQO>NmWhF>1SbBSvK_IYURHye+Xzj3c$7 zMW1-}R;wn_f07UFL}1r_1jlF(?2)$4VCcb~;F)}am{0YgF4}yM0|WOvl#@1!e8}VV zxzBH-QXk2-4e1GoTW;JVJar&(YC0R%5N2s&R9fCcO4JNZ+8yp=Znp$zIV z=OhyNnfZ(DHKWyxowR1K_~Hfu6j-MRC~W{OgZ2hxU`fmI=o1kFHFcnN*97gI(sTAn zDx2r|#WI-1UV*R;@(3M>7q185xns#w`!X0fj+?o6_N)v6nRy$R?N$FGcgxTQ$&^Mb$|M~A6 zBT>HtERIR?iuyP)0RYkOIh)mewB08xB7#!#g#RKR>HvC#FN42p1BH=Be}4Dg;-H&< z)KZXe@GUVMFLV4AB*9|LD zK0medvJ=lL_8C7_Iu&3LsL;v{HcQ&s24An<=+LS~rk|A#^7t%lvZUH~J#+|^uuIHsZT&6jiM(^zl0 z=g3n#wy$>lPi#U*joad%@mNt{zRXOPLAzNwvOycq$Oq;5pN)9t?XfAIPEXzcNYV7i zPDxb#(x=;mf=aWt#5Sqd#D|;}M0(l$?MIMxs*Ndb(({0?(0)=lT zpn!VQtU15>P%Wu1%JthAm(4+t1??|K&`uy=aGnG*-~(I1_r^T=2V2oEET?u|eaiX8 zpMU?ywf^I$IK@%>Nwh+uzFHtV4B5uGKI(x&^D>%_pE?6#<2f1c7rd#dZf5#wqiCHG8tc% zbNgo^ijbjzE zl6ioV00--#tWjsw5weNGiA2hPY6k_KTI^W<$H81JXS2LJbvRtK1AH3*1qJ^N75tGm zqvxy6x^Q5_o!Uz|L;#A>{vf@6=yhrNJe}d7rElq}hNl8(IQg(I=oZ0YZFo*XkQ%Vp z6_;Fx)q;N)htJ+as|7lLp<1>dSjyk&2b<~-t~9gPDvM_4(RQW)YI)rf>_3J9HjL^1^^BQSq99ggTWKLC{M`GJ`y2+v$0U=U@k9Go5U46>r2fQ?`hbvFhU(~?u}30b^N?hFRyt4AIVh(xR_>&(s395{Ja zn$7wKwwaw1_4mLLj2iZVkvq@EKtVHhbA%3Bo_p-c{=<)w99^mtZ8X3D*^Zszk5qJM z(5_`&>Cm89DN)|WJb%1Zw4DJ&1W*K?GxI#V<9vfrU2JPsPW@eT{IjU~SU^q7^>a&7 zDzG7$w2HNm0o!eudaAP}fXImnx zY)@{lK>U}2+M^%~o_l9`?$`pJHD#24ARv#Lybf)+yS5+n*hBxM8Ji}DFb0u#{inr4 z{JnMU?`@u68z_tz`t>7=S`HK*dgl1`1t^pb2~J7h7m9Q}S`_yOt{37SN#&xBR1be= z`DUH$sN`fJXRT9~jL5H4a;vRqSA9K@yT{w1G}{*5<2C;pm|)?kdHWPIez9#i3!hB= zfp4C7LvB;?Gl}_=MfG54RRv{{~p+ccs`otsbzWb zjQVL?Y-1yy{GST)3;o@F!%7y>!AYfVM(gBFtyJavGjHF_D?WC=rx~CiKKM6GTV>LU zOj_N6y^T6ua`_z0-jZXpJY?+>#aX1Jc_f`IV zGvN&UukPa7zV0Q%?qj}}MWwoyw#!a+CxSZ6e>A3(u_ehQ`m7AhyD6ayQM)g80S zaS-A6R2TB0+``&`-6grIdL$Q}Y#vyI{6P+2lI%6kUFQ_QDWaW`vYnx?imwHH(f$)> z7N5TVQIY#Rw)%nM;GO0x;3=pC57kS@9p8C>5TGz#@`$3ZQhMOznf@pw{blpKO?tEn zp}h*q%OJ>rt+GC|*C9&P-VQx>Kz~)T9x!>4jV(z4_&~PL${`5<>x&c=a8dH#S`Bl zL-5u;<12!Hf_!o9wi-M`Ci*qgiTSwT>!6drkq_J5UQrks^ukLQwtO|=st1POPHaVi zPA>wR(in&~$QkIQ@vZKgNpsG52}21df-VbWXAN_PbTDJ9dXHNiU@?FDf3obyd7klk8w-2`*;-ayzX? z7*I9)rCmmF41$bG*-ny=skjC}34$C397O0Vr2qp6)=?jU1OdMVa}nFh-y9&g&0sPD zz=(P{?jaxUwSmItpRRszTFZgLi!WWY{s09TxCIghM;jm@Iuizc|ILxS@e}#XJ|Fm% zw>S`XNIt*<)Xc$^-eXhR_bi|Il12_Ev@&X{6 zZAF^zcck_^bP@sAe;;K0(#}{%zJ1JR?J>DC6BRzjSbpbo_EodVDXU4Y$q`J>Lj_(!me;WB;YV6@|fM&@A_Y!%kZ3 zgNSVDU$go+GFYz@#z8;p6;G|cXir8Scr<@fWJe_@tJn5aK6t2%=Rcv!Kecko3s65&-6!un->+4C<=hj$ ze7o{`6PYd$5SUNj^{&32m*2DEb}hpvhuK?LuW44tAA;e;LhLQQ~`s1 zCB7owOESzY9~azo{uRZ?Wgx8i=+#E)C{8WZMne6UfdV$#rqoFHoaY5Y;HhW$8&8ft zN&04AiTtsJRwEu+b$`;;@)~;X@uzbAq4EmG)k%%8=d2AMG5{20!yGFau%P`Z(#Z=? zJYA=f*!-xz*I!@@Jn3*JohPAsV3TI2Fg6!-vsB4Bif3x1=^!<-2u07|H^cT_| zz)s%h@I;4|hX!?(K}dl}GEXU&{`I_G?NB|cPe6x#Dt;k*kiKhKTr$im|DE!n9p{O^ zcn5#|YF@1s~#=!%Wk4QAxmY$l}&zQ zz=r2bM;)-outN(_(u+=K)a#pP9B_1T?YaGSu;R)aXamL4uBmE^HjwH#Y@JN0wXQiGlAAV#AQbf^ z5LK3ujH+kqPo_mwn~4it~_(9|9B9esK@kTD@lGG`FvF&>Z9GWewNMMqi>*J zK)q2W0FXd$zpg1~Q1FLLJ^>&f1bWzEZtN2nam+-DI-)JmFUNJd{#*lvHm!c@@RqM8 zJn+mh>myL;Zs2s?dH8)NI6@9II)yARBRV1ua?a#Ah{@mU#6Sl>cP<1z=De7nsi;x= zo$@;4_k|A7su{Otp#n+@TqFe^1qIRnuy+VPNe6}u(PvTHM+1cXX;!zDT`~qIqMZWIJ?B|7f1GKZ&V9os`fp>UVubc%o z58&@H>rH-+tL4a6=+5!*YGhwHA7_oi2Bv+le9-9cPWbbWuUV^&!XBhayQ&xiST+=` z+{VR~$s3gx*J=FxM}GWe#sKSZN~6HPhk5gK$L`lgqgm_42W|^XCL#~{$-8n=l8~J z6lPT4L>RqMs24e{%|;;yuxOHlmcw7ff|7Zx;UN{6G=7aoyT{=TPsynDMOYKP!Z*)t z4E#Hd4i7Q)Mgf41DyU5ciy8_o=D`bot1ES;JjQ zAqNZ!v_FJ7g7k!dz^Uznp`YcG8dy$$vm=Q`TuJ-gQ#gw@3Jya-Giaj%=u@KF;*emn!z)ix5C z$s@W_9%4)oCP32%kjs14ED*-QhqkGyR}%uB&UN_#HVN;% zWNW<|dTlle023TQfFMD}|7s@Klk_hr+yf}XfSwBJy_6jg`c8p z)`6e%39$x0`kGB7Wcm|;bB{l@eJiGYjT3rN1{=lbQB6YLzd&B?6N;POGw)MClfzu& zd9tr!2O28a4xZ2veAvuVCYr#d=Y-8N=8zAFv*S%2^l2iV86WU(YGVr?>MoeQ`1H`!;r(yl(S$XX9QyEyjkAh^&^ zUhf!MkA8l+8G&5e;06Ty$p7Sz96t4bSDt(Ebm9JwyY3q;lX?4XNh7u2t_Fc$ujKDU zJmUZFQeThE`wFm6xoz7eLw14O7!hQ-mv#$4b+6_P{Cw|57o@m&o=q+NU;yV{P=DNf zypA-W2070xyVI;nck`sYjo2v6=(JBhZ}di?{sv-AHwqh#W;CNOeiT5D|LRScAHDGM z>7}QhJH70*rQ}yft4YYWC-QEDeCuFFGXib2Mqx((_~|F7Z@uVFqc#cqU-=NqT)U0J zLL(>re4}=s>s;2?{d`fITi|-~n)5aM!l&_oZ0+@!d2(Ol9iE&skCF$yG0y8kcrND$ zllerK(gXS~6w!9s1^yuDI;YrxpJRl$z(>}z@!=Tsto?N*AFj6?>(PjNz|VUWL;YPseUea3LVbIpzP4%oI%hyJah!ZEIL>)c&rjxWl72kL zwnOp681lL&Z!SD}RqQ5yc3$SZWDTBU19(cl?DM$J2zV_}e&$f?z{7mv%T3oPT>GVW zOy73#T}GpyeD93CYTp;Xe&FbzCVcEm?^@f9LJnTL0vH!~SlfJCLvV2+%t1jD!SSVl z!-MZa6+Hr~F2n(`-18tWxDgRJfk(zEF9iZkhYODUMOo3oyb1R4r-Dm zz4n63hQA&g-Mu58Z56)2@&zna9vUdxPtd}Z_QGb^h~iA$=y%4IavVQ^;*!RJJ_b+}NmuZP?eH~aFVTT#l~29(1E$Zq!$a#^ z6V-gcX3CKtsEh5wby?trO*)eTVap&7`j6+0F|e#1lB@HlcrcCtclv{kE#e097~&jx z(35iEe>LjxJ@TGS0dj|PGB*>Ya>Y=hkcVgd?J^KvJNuIkNXWW(0gZi(r1lq8}zR+@}<7;Y1UJ>$iOowG6{^0 z2la|Cv8U5G;ToT+S%8gh{LuUr8JrXc#8eGR=3!6xF}~y-;gkz zOqstupSu}G+;Wfe0KXt6(tBs*fpFI7kI29t%5$6;FZv5HQC=&5p$E^k`9?qbh4mpk zn4iu~<>XexjOPOUBOm7(cCrRChR|ozHVWed>+gPe>8jdu>E~ZJdZX~u@13?E;ip-$LG(5KA=Bl50!*+72~Odv1o2+RUx`agbx95xrs8~Xt9&OCKg!wUJB z5*3Y^f`3*2Bc@-cGptUSvY z8~1(R}C_lgHm=9+I51abnBTyf8$UxYR8yfLml*Sm(Y0rDz5SYITt zG*1Gg^&xLwse=KKat$)r-(TlOz&^EnHbeqeg8F@VmF+q|2r&VI#* z{5bA7z#cUW1aQRL&8NX6JUe=k5A5SQ+&i9FL+~@WSvGBQ9+{t;^y`ZoDa|yl{0D<| z>HFUKW*?BJn^oK6SfE)5b!vw0p}(69$nL~Cq`D%1;JUdRh0lF;-_d~ekgK1V5iC}&?{FTTA8yy4v2%WS3_0(@xJTno zkQzXv`^D?>kC{wu@0OzaD{_q2Si2T+J=f%l z^&IDzW#aw?kVzX%FTft!jH~s-IOUbSSktxBA9#C=_FAs}Y?&M% zln=B+`?o+3?So%1pJ&9jV@ro;pQsyih_NDn+C)7D`7`7>$CNpZamTX5$K%6eXt~>{ zv*q}iu^%1-#@xKL&$X$$hVmIN`fNBUmpeX(?9{={+bE0=vY-0O`&Z=~9B;q)uA?>z z$A0ull)3gB1tfWZUk9y?5r};N+kNI!U;_&MMghPX-nB2+@TPv5C)gUqLj?2amUZFN zbfg{~;Ddj#k9rpm$^ekWC)i7%fvp(_P{Frurl>b{U^9~|?dS70#iQ+2G3FYABXx*u z#i9?ixTlWo3Ua)~i^Tk3OyY0GjUb3C{7Rowuj0q%MYrBPYE#V7)L^j5JZX1QilKrkxtOwaw#R}W!C>+Wh){U54*N8RPQ1pk7KNu< zsN6hgFN?Eeu;An>-N=`6SS(yvwU07O9(hYP#sQjdfBH+Omz{RrE;_gUaM9UEoLE19 z>=*uk51t`c^8jA@i+i9Wi9Q1#6m;6HEB5xmm;l5afd1gwv(d4oy#gf_dila@3B2&5 zbyMRe`PAPzpqMz{-TWdq4e-{P`z2es13sEJKa>4yndHq_3t)N17!%G3oICY`_BapO z0JuJIp7p}{==$J%knK7b(_B5`<|T9%dAtid#>v8j4U;%C4HYg9@|LBzPGGi zDN(ro@oj0dmk|Y-Y~`W^pd9S;g?4EpUvhm=Krzrh>wsenpiO8W`&@naj&c>Vr>{P? zM+kSUF~tZ&cAst8GyS6FSm1?}X?tmtQIEh;HU^Zu{XGa~j$H-w{QeRB8f%ZviHta? zv(ensRyIM%nG>bHCP;RM4v3D0e1GyKH`X)>%_9mwy>V}!BnSlD{cc^e5}>{4p|;BW ze*A@_VXGQ>|IMp8R9XMR($TRKX|@Shu5z&0naSJ(g5?!{f`c3 z6tYWGN2m>Iwio!A9!i-G2lg(rCv|sg>L~Od-L2o`s4y32>?U?r|JU~UN1uf4CU0WT z_qQ{9=&Kh?dCXn1SE9f-71}F|H(p_^y^ElZPK#S@AXj=!Ww7Yg`ubVxsc&l62$$AV z-8#0?Wx1k0Ygu_eTDgvG6^w7pg^aO|^15|JpW3U_pOB1sgZyOpCVivhD06%?F32Nv zXT*W|o*wgBp3ZrcdVM=MpD29$;;ns>AW$xUWOgM$YXrppT~US4XWqX~r6l3_yC>0J zFCq#AdL;w4s9@m-Kx48haHWZbPNvtMeKBx*>i$RK%Xnt@n^EX%nZKZ!Efe?8e1dIV z7(fEJ{qW6qp>36kp=0%_kqDSB-R!M`2G;h{pqj@mahfC+A+M8IM7snC&f5QIAquaD zmPH4J4VN2T5QXWgli-v9bL$T!4G`9$kIb>{#h%BffUaXj`l*X$AeCl^<+A7t5rTfn zv-F4Q#J&&^$XJH4BYIG7LjU3(@t_Yiwj?OEV*G;4ntk`1WJT@ySWf|P!Y2VUpEI!S zHdAAXePDa~=k1}NdR%xM{o5+OBexXj(>%MR$v6B<*Fpc(ArncGhP<0lzvd*LD17dhbrWF1s4J|Jeh3DN%5+AUJeSTI_k;zuTUR4i|9;^j6nT zV7>mFO9Qt*e*Znb+IQ2H#)momo8S}t07>a`|KJP2>xXZ@3*7Fx;kJ2a?JIVlwI_(e z^%q?c)>&d$*nH)QVeWt?^%=luBBaUtsMY;-;6p#z-mY|%5`})#-6ny{#p5TSJBSek zL9hUn4qV0yZeJ972 z>=Jy_B*%3K5pmJ6jPKt6D1$Gsft;klQhnq+WzK{Q%4g)*?U76%e;lKzk3M(56XVEz z^LnrieLnXzHiA21EJO$s>~ie6Ku2<%#XZXNiNePZUEF600-tVp%w6Lv0bILU(bN9k z`^^58k_00m-@bQG?<5NI7vNSC0Edf!mQG?5=wMq+D%%qg&IWgy53 z7Dz86;1cANNSO%HI&1%9%7}vf^x<|$xY&;-TwL7;?qy*HAPaB<6g3v;j6!1Mdj)v{ z2Z5gbp~Na#-vnb)%C#Q#Ya1n*CIUo~Cy)n}GY9Ac{j3C5$%4j!GMy_fAdHAh=Na;% zfQ-3ATgaD;Ul2$7&S;ldLxeQy35&K%tYwm$wN!KrQ9xkCADje` zSmzLhcWyhS?~(+9@3WPFuRYYM$KSem+})EZB?{*~xDoC3Hlm=Df{S`u(#Mrx@NzTC zuz%*k#{#z(o_r>(y~I$vvCnSm^LnyS(MHn#!?)fYxPAJ;N1ymQMr$?PrZ&1#Pq)%N4-1eJVcHgE=8UM$pTMS%?)xfiBO#Y`dv^<>x$W z%w_l|<3zz16w2EUswNM${9`@P2Q78m*D~9rr2#$6d3Ajb-MO|})c1z{ ztW_Ob^?jr9{EL3Il-O&@CJIlVyKCPj36KjP+N=`bz4o!Kdd$b0p4bt(tGNQgXD9SZ zqQHq*v%xM4R1M`Se#~T0*(8U4`EFxe=PWB?0+O%@X@j1EK&OxD)xDp(GZ$=6*ke#SzX_?f^# zeRh8XZMUnWg%i~!^>aq^!UH1t=qP@6m^HeSx}?SNBWjq4+3sjb#{zY-4-QJ&B71 zL2N4dL>`5NDmW`~N{$i6$T?;HlLYB^5}6hSe#DD#UJ;pF2>iD;r9@%FWsN9IhixHi?k7MO3+%Dm?;CaRGNV1z z1{Ssp@!U#00IwwZK)(YZe2jRU#}qaTTZN!M9grkhSk`c1~MpQD**x?r}=FC#azkX zTmJ~JJpFvQ=B$g1kXav^Jpo4@H?0XG8Eqx|RP9;LZZG0HYTLbIeDR+ujETBIG-03l zC75cv@;tc6RXCk9>X-Jh*AW6tztpz)F0n|g5;y%!TnRH#vVxe{P5~8jlzxe@J>yq> zi5O)5D``?Yh!rtNEcHb5Wm2|A+`RwhSw!L0YYtyvh{6}|-df2s3XZ&UbVGjq{NW>E z|6BW2NfhjFmwkmO=%BABI!VjxbV*sNj)4NV@4oq#e`T~fS@QlH{|zj6-*8I=;PsXn z5js|nk4OI7`p55ausv`Ib;Vy1dq;!aIGMZMchl{mZPiKfhD9X`Es-dU##N7Uy9T7{ zyKef7igS-V$>MUtpt(^np{>`Rc`?rr?45Vy$!bq+s2J(epQ5t2@4xvjoPX3Qp>vI? zZnG4iGRiW>f4&e@XiN1pC<>Blzj|p+&;9(qR(~7PlcBrudWl?Kz56CvMB%Yhx9;-< zfpXUU>s0~7_O{A@?9($ZomBa=6TW`$uD(JPnoUY40guf^`CNV6kgVzkXAj;h&zWHQReL5$D-&A~L$CyQ(s?C|_kkm(vb1{xZ(4 zj~m;Q51Z5QWb}PDc^{~c=Z{A6qxrr0>g&ax-=9|HQ3#+A8#ucCg4*C8cH__cd0YW@zIx|?>62%vyphVLfI)x&xCArBwV?Mh-i@GNDl zYHQwRniJ#Z^)T{wYw`^>4G;M?XB^kr<%{s-SzlMiXT0X+k`M3s?ay8As<@)__up~k z>lB{o^mPjDH_EH-J95-AowarcrP2P+V!zXY!jN~G(RpV(1idHeIRQaDQ+$hS>Fdf4 z>d6Nl+0Yws&GN>Sflf&rkkM8+$rXHc1?9XFG3}sp5p>$4l&>w5g#pZEp;pNpyaje_#Zd)5a^;@y=l>^rmR%H z!3+8&13ctFCGtS`c)m1!A0$1GxFChmS`@9*XoTsKUJUPbJ>t1B6Y<{Pqu$dvr?O(Y zBBa4KNdp&Q9bh0Yj8DWx8o`_GKLDtM2gvVysDtjQ1Ldc@OxxP1%NzG1-n%}$ryR(m zxR0yCP?wNz@!)nN1`03Vylkuh1#J)1Cze}ojCD}bsLptJS!X4}ZO3h<7g2&@_W+mlCKP zx7XptTQF>uKtUdqkQ1Hjp}jL~eSq=(&@kUmmwZ2)_)3p^Zd+gYZ_eO>tTW@R~KSzvNUNNmfk_l{|jX;3E?68!o!C3Y?U>b!!~~41g#ZTQ7U^l9xcc zUM}rY)K6SdCjlT*83%}5yZolc zZkhf7R>NfyYf}WKMEg(JF-^5}^_ZcCp)ms;{FSD)L0lQ1;p08xhkoWwLEF_8?GNE; z=-t>SS&dip3usp&>OmfmA@l*CxA|J!Fy5#$kxrx?VF5G<3L>vuPWDv>R1l7UjQm)> zdQM<<@($Ao2LAs%1<=mVm|~HhFh0r~Y*~fj?)zE- zBq|T(k9MReeesiV)V=i7V$78nU%gTM1E=m8iCJS&%0gcPYVuydTm- zdc}?h@e2KvX90|M{lbJYOb?8&h@ce4334#6eG25_MQ4?=e_tT3QJxBa!D)*(no=72 z?o`PUAk#+MXhSgk0Me8x55B_y;)?bL9Z{a(g>+%;@tnpM=@_`T{DKallYx;SlNSaV zo=5{k=A{sM9|Ao@Y&Q%`@Wi+PR*Z+VkUsiKgtGzD?4Bu20RrhSPv1IbfWm9fU;RI` zVDRU+_Oul!TzS`C;?o&GfsL!0Fv4Zn+`a#|hD>r$@xYo5-OqR4x~7~8NZ($NQSdl% zPs2txbTWoNl7X>Ks}d;4#hp9~;1^&@Tl4huI5KK7pfgG%AvwKMCeN#uUCYQPK2@JSgF< zfZUu?dO%=NUXKK9op&DSQWmx~096_%CkH#On;S(Cc{c9{s^!hg<2qM91E@e4@}QxP zFwOJB`yJPn>3CZ7(s;dbpyV>{_pPmJ0fiS=FB(%`gyeY&VwivX;_4C0uoCAww1f23O!4U)pwQK%p>`#b%hfxK>aY=p_q~Y{KfXu&-rSMS zGH9B2SI2AN=>n#kyjzCN42|j7wF#gg4~EWDFd1L6@LUHmqp{Ln@-@$^2WVUf6h2x4 zg)dBsIFVOa=;=V{TM1aWLF)2+g)s)$kTH%OA(1!aMIAL#mX6{TdO9!H*~?N>N%AUa z#I5Oyh%12TWvE>*0T7j+tY2~O&+^7CCtuQm?>!w&ah!kZ#&v6;94!i*^_SpGX&gLx zdbxJw4F)S0u%1~0qVJStqbW1bFVsU^jnGzl8PC$GL98Q8GygtUrpzsvwk7; zv3IyyyWth#qaR53Uano$W$I~rel&k(a-l!->v{V%-}ylL^}Sb)8KCgjSJxMFR(z@D z#(CXC$Bp#!*E)Zptw7;eK0hNW1ca$^oO~iJ<@OjxN*C770FC#;M;})#ntfuic=k!9tG}f3x@b;G z@n4kg9h~S_^6Vzhhsogm(&i2*m^R;g-ZEcAQ3fQ`XAYcn5B*T@(XW|)!*tjW>#b7|{ps=5V+JTZ z|IEd0G0=Z}x%tA-EAQI7tw7<7HQS0$X8{Fo>_KM4F_MdC?C{VaBQ8A#-oYRZ8kvYA zSFVpl<2;1um=(@P$=ZRC4BOXA!}h~u*g`Jx1y9jSd7z-Jjq)fE^l;9dMpSZXbcxQ} zJ5|e<&6$=@JtUyOcmfse`bqw&A4*^9l+4X_WarCr45GncdH@R82CBNiIwoWL)~hIc z`{|s973KEJV|Ln0UJw~^cJPr7K|?&pGbhT8dX8x>@$ovTwFuHf(%^04K&X`FLd*-h&tOZ{>pNwSdB7mo6AnUWL8Fq2ofx_3dTSH|_xd^;mM~;rOx;EGI+euF| zIJyb|T)yO79Nv`wJ$Bzi#m`GG!>*;531wxYYpbL5epMU8?CATT?!MyB+S+Ps5w_3a6tsu=k8*78zOP9x{B%{nbdD;C^I$*p}%@s!luq++}iV`X2lt1FoJQ zJ^*qVov(w4InD@%LBn z>_DKPJ@8i1{XeOGI1k$--ng_tOh4Zas4a+Lu(;)qbN5_X&orG+J)n^F0t6_LOe4>O zarv|e6c9eUdqClzZvlxX<#%3hlt!+uj-;%f? zwm5Q!-L=cW%FJk7?!L)0Bdu5PvWP{qs&7g|fWoIxu08)!l`Xvw&BA$Yu z)D`d2HJ&M)o~7fJ(}{xQZR5z zglvhA$!QdFm`;cbnFm8JU8#@P%OEc|=Uok|n5Q0I`Rie+EBk_wGbqA&x|QXW&AVv( z5zh0Q@>#lZpHDxNZZ@6x0&Q=x`nc(}!NPCuyK2mUg$vftXtlA{Hzl&X{`|@s0g1K( zh3B8Ss8fML4?Aq#M`z-V#TuEyWExG1Zyi9y$2%I(=;Y8)u{Dj;4_c%sW03tcb#FTO zNXC|Y(D?)p=~?Yj&;m381$Lm?S8qSMO~tQ+{M0F6e{ zCI5+WmG0@PXN~8&PDm8t^sGS>bWQ6q#<`cqrza+$vkjn!{3R$$^@(7PUYPJGcwXU@ zM;ehHm4(7LzWZ@$>17~b;OPF~SPzhlw$h4g$Y*l%|L}VlnyBjsclTw^>Nq2vW$}Tp z$)ivLh3;bA@|*qiOl{Rwy%m_yS`aOI70<+56!`|e(Kgt=ygpMt2kbQDY^RFLHcA5= zG65(tkBn#J8~O_5A^HmF68(&qOAqqf`xB;Xz|?sW_)%BJ3)vx8@B~;08H2C!059aZ z0q4-Q)^{I*?pb;>XE@b4f*V0$ONckt3lusbY1>*`retKEb zAh{RB^AXPpLQ*&b6z1)7K8cru3G^Sm4jx<<0+#q6aTT8WFbn|}L5QVe??W%@LiyPi zke3k_X{9(GFEg#hHg;&8-4CD_R{e5J00kM=6L0)>OAYqi6`N((2`s*C>$U=go9;hG zd^!^-z{p#NEsD;Ah@TA-VIv*HH-m=;AH>ed!}sWeJlW|7t$a84?%UH2pVia^j00pvn0T&Hxm^9{ocs$n z&XK-$kFZYp$d+l-6XJ#=d-9^{+Eyi?+`a?}^3-UzhEIhE)b^$|Ao`|;>J#$EjHAl~ zIpCoYQC`I*A-G zv%Wb$cooQ#bqPS3vf%!TBX+6{6xN>BKW08bedGN{x7=ty`oz)=c>LzYRc${zK|DGa zD6pe(BW{K}H?r}@?Ek&9_KwNJfaLD?bqF#9TEON88>a_OVEUB9s0mQeTsJ#D7!4fm z6sH?1yyZ)NL@44sHeK=o6gWx}tuw%+@UaU-1~b=zTE}M{yb)wI5F-#4XCG)ZAL%xw zxqbU)Juu8K8itMJF+R>WJPZz^aM%{>fg3NYdp_c|ys)VRebqF!M$Xw~-`vN{VqJm& zmg(w%#mmLz^Jgs2JUO7qhOy^n?7_?0sLN%ea!=dqa)xs6o9O5FoW3s!> zRsCDO%oa|WGAggaePl0^OAdcVX(`;UbJon*8|4lu`R06*eIypW7)&L?0cJGq$_M8#Z z5&}d5a^lziHdMcTbp-Xl17sBVT0XCDRAAxR8-6k-yb5Qn*}kQQd%?;t7yo?iZIE@^ zO+RcaP`K~WACEDh(CEM?s{x9Yg3E7P-!xynyqFRz+BcKj)WABIY2JcMqzhi=f*%f|B|@c;YFfpQG%}4l(iOiZKtYCp9hc%sRvoD0 zzYEJzr1+=v|GP^<=Yvk#N7-4R@Hqhm?|9Ql-$9B-x$}k&8a7;$z%!LazjexbrgSt~ zmYf1ZY3@A97rb~D0O#iQjRP&9WI4NWIc2|OWckyX4RI9oP9?C>(b_C~$#Z2%%5!}i zp+CuDhC{TWQCXFlCW&1dl9L@i>mQ9($iZ~wCGbVGF_o}Wno5w&o<9ns`Xi8#z);Ft zfSg2VKP)pCDa5gB;~nAv1OSjgKfH58>Y%0HL9Wt?G%AfV;y^DNy5hL+yxYMq9SPEy!-7UANVcNPR8Odn}j z$3cUhKeD;8Q$eF$fE1*O4kYAg0u*G-0FvG&8WR2H>sav8d-Hwm zaELVZosDv<<{!(o3$JSmDs6*II+kDp^_m7Q__B>b1{hSf4aGB{YhWsSPov9rn!*1U?M4f_nr!8GHF0f~d(6yNgDK!t-!f-nFfJcFDL zo-=@O;ndN474BJbVDXO^*LO5nxc;7lT57&OgR|Hb_8Na=bXjZvs;b@vlFc7Nktb6@nTZNHVNryfqa1&u*1YykJ zg|oJT`>fmq!UW=O&^VRD{Puckfj9c* zK*4n<7&>6m&J810=ciTkvr3Sl5$fHyu7hjdfP(44Jd!*6#C?v0SEA03{D!w<20!x* z=_;fCi&-ZK6x3xQ@DrW{x$KdrDtqQ@cogdW07lYbTkiJv{Btntb)Mx6{k6?f9s<=b z{g1fFE9s>$;wylG^74Fj1MKpdTp(+wX28kE!d0i~X_3G4HABCt_HV}2`wZ6yak4r% z|NQgnJZ1WE#d8qkWP2wNvOIT?!RO?Sv=1M@C5?Y=di3IXC0Mw(V-3@y+qP<{AwOpM z=h_Msw6#-mcRWz=2JJLZ{og6y$VK^dLxCVt5x!12EE%eQS|jO+%a1Sq^IB()V()qM zG#TJ`4E_4Wm16@aXoQ+*vKffccXFPdKbzSsKEg4qjGBzW)DL~FbTNNT#zDqT^ZE#1 zN3QPSG{2)!uZ~65$&aOB6Y!v6(_DF8FRf+J$&80@H&~p0#QfsA3oa|J6_vnX$#JI_ z2TYlv6C)c&bJ~Z#A^GK=mf;j{ff7xfXy=69>Dfr-R~kC;Pp46qycaa)(}Q==DTmFa z49YthZ|#=QfeTs~vU^)aI6j}r zcor7aN}bqV5YF>ZR2`q?!t^Tj1h}2)`g$Hz=Nri7?>3o`hCO#(7=Mqi^b{-R*I(F3 zdi=75o#wfS&SGZhL|GcVCMgXWK`rhp(@sX*^1^t;f2EU1aU_=v zmW;4Y?UMl$$&l;0w(KQimeLQ;fa3LiM!YAacg(|#k)<(A?(yXMR(|aGsqYm#fVW8h zC6i?6YvkE@eF#c2M;ZiLkyln2x+;B@hsswx zc5;10)JMENA9)Hs1b87oWI!E5UQf0(D4T;<>V)@hD3Q1EpK+WwDaq+T!SvA;d`w0+ zQr_0xz%d=>BkGCiV8+zyjirrn88GT?Gy@c%JN03khRn=I^a;AJl#}fNX)~QlKto-u z-b8+do<~ipf3&mHBNxpr{`Jb;9cP@bylby_0#K0mW9$G0Z-}V@h7qLE=*}7bFqGDb zu>nO|=rqxAF=`V5AmBd2g>0aRy8-HlaW|ufG~<1wNe~n1Mmhu-6yGAkv}w&9C@O=+^BYwzqVtF zm-Gyho&mBPARrAN`BinY0l+4v{EWOzS9v%jLyG5lO2ZUoW_1~5s^?ZG0mv+Wk*4Jx z%a7q%W_spzvpaM}-4o?NPnB`^@{2sT>t@Cyg||F(pyWU%;)Jfy$Mp@qq6kX>#l(bOv&8C%xA`znVFfH znVFfHnVFfH@7LbVy1aSnNolrxlI&z|@O){pU`Mw7e2s#DSU=l)Km#t0RQ41n}|S%^QdX#zE5HR12!i%X!y>iYBFO| z(-eRaLCNHZ1b{J?W4tB=4xN(WE8ch@F3g8Ka4xJH=i^xC8}XCyLASMz&_fK&18p*A zyb55EbIz-iFMQToVNcP2)*V2dz~r@XT>|7#_w*aJ%K4FN5@_a{B&EH+**mrxX_D*eTqADPp6X8Z&UgqkQT{MSxx#na<%!-l83#pn85jNWJ??Ae1Zxuz zTK(}75Z;2TJsA2(I%dK|~Ze#OGIivcU1hhm>2fHZ-l zKE-+_#Zi2m$3)4ZlQ8c=La;Zes)jtT*BGZ|lWyxnqUW)%UN?~klj1m6QLYh#*U9;b z_9`UqCDGbTykC7U-s{`^ZDzW8|1kppD$COs?VG-R?Vc$QP@lhkd)oQxtS?DI^JlU7 ze#KO^7j45XZ8ritVIIo0 zz%%;Gd;Dxc{En|F$eZJ^ZHsGyIq}>c!}?;~ah>g_@9`SNocp`=qJ05B{`XuS&wH`H zZQEDt_*z+%|6INXYlgkRePo|vANQTlpQG+vp1tIN^vx?%_s5EwKkC$vMB&|+uNp+6 z&_L0vIo4WDSj|Cz1~4VS)c_&_49!)J$0pNe!+bgI8XU^`i}A&k&0Rj`0F@kh$k`}x zrEhH5%o)Ke1XTD3JMtSg7%vD401RMKJja@7{a{~B4)GX(%N)VyfG8rK0O*ll6HDY( zcYT|bdc1upMC*>ZBeIL$p`OQQ$O&?a+BVVfL5TbP zfW>pWN*3-qa=rA%ZKtL0r{I6k)O@{v;0=H3E0S>Bt+VLk;1Gqp#)hZ{Loh9_kbuz> zTxbLLd5X=O;u9c=hMHEZ5vu{T&(jWwH9jXnARx2(@y&sV1Di4D1HiTANV$cdY+$Xi z$c^9V_rk9!5gY}z#^DAry?%& ztq|5P))@AXBa#5dO@C+$WRpNEQraG4B%H4hleu`D0TMM&kkno;p9j9;Gh!0C&M7|@ zQCD3d{~$FW(pWnY3iKk>h1P?lhx;Ej4L$TE<)RRbLmVbR%ms5|GPwW3&fhFp9yno( z^zOaqO*x>t>EWIGiYVOo_(6k76u@W!f&^=vGz~s%%*AFwqu^&SdjhCWY_wC()w-&w z(N_YjPvdG1unCYw^HFpAF>Qjhph3V^Qw*H&pUnZ!5r;xRukBKJ;73$XZ89(FXe9R9C63L{= z4D()oH}Pc+3s^7*o(aHO^~>D)vUj0Kl0KNw&@aFJ5V=51YTRtj)bmM(pwANw^+)X&8*jXp%$f9c;)2i0jmeYAB>^_7 zC6W#iMmBlGK^w}k=iyqI=!#e}N3?5Da=m&kJOe3!zWg#_v91Xa$3YLkFL0tiCIujd z-rKkre&+m+i@v&MU6b^iHlSl0p2sBIFbyKANWqYV`*Oyg>&y-v+2)}DC7`Ga2iwdg$*^PK-5UQ zk+H#p@v^V`7;77`L>rqzu=2cN&ZNij$R8voXNn8C;yBOe@d03HoaPJ2q~?g4p>6rI z^axxLC`Wz=AcIpWbb}MO$C=D9e~z8C46@36nn;8-C!(tS`n&g2Oh}z;=aT+f$3z&! zvVA>3a^pW9YWIipgrJTbv?6ap0Fj0s%m&JuW=@OHh7{I%&AB#bSb~~Ma zw8FDVSlb`>KEJWAqg{*Dei|^ViwSk-bsm$u$r9#t3QItuP2_taCKc=ba`kl9=1TzuRqBd|->VDb8qX$<(>ZFtkFma&MY-mf>hXKL^|+Q{-13*><8g6b zJbpZ|XB~~l`UbvKt@&8!XNP%@a~bQ$^M-4faX-2CVqfC6_}Kr>C5v)guRcfC z!C21g&snwc?u`d8otthsfPWOxTe<)E&C@fN9FX3;{q*$7<5y4W4^UnGz}AyW6s~=6 zTlh18M1deTo)w}EgKNELz}QFxvzQ2=K@kW6+J$(d*gnK$q^V24_>9e*dJ^9srw`U; z6L(|JT1}?(OLpKt{exa6Lg0I7KFvAua!$sLbpwz>F8~7A=6(8#yvrun)i#}P>iB!y zWO8_(TPM7StMLKP}9n!gb?wzhY?9g=UDaWTf&NwMOaN!v}lUpx3A{}}8tVxqwFFG9l z430F3Li4&>3vASQbvi>M2S}D+icRF^2^}}67&z(xKZeik#P}34Qj}peRMO19%5szs6(Pt z=wdFcB?L9e#*IAHUC;KnDblU$v`zn8B2oyjDC5LLFjag5Z|A z*h`E9x#T`$PN66NB+h3UkI4kd%jdaMedHipmdoI`Sy)qrTd~RC%XT{Ir4~7h-Nfesb)v)md z2G{^7YUv8}+;r>O2-bsSb=*^9!X_F=13_~Gsi5z501m;s1u`HzrA-1I{K0s}=O)hP zh+Gt+91v7^pZO^Cg1GUSYr(e|%CAUR3*bNk(P%Lre1Y%GHS+6*s(ewu6s!@}jq!_6 zXf4{;bKFF!6xS&HvM6NHV;1oWLXjaDQD zc`rpa5VPZjo`FNeP^7>O9cu`%M6(l_1h6Uw&Bqu3VvJW!Trt8n09!h+1%CxrTzC4T zIUR4txdHg7dw~Jh(S9O#vzXh>ve6f8y>1i1~JCAbC$c9kGpzVq_5 z=bTw-JR1^(Qieo<8=9v`HyP@(nUq&IuFNMcJ|iHw*$^xZ!qivO)$8`yZxJIlP7(!z z7h@5b;;GvW*#7f$<~)+H5ct~d8E~M7{OJVmW`p_JcmR}c#+=_`f*@V{!#F`6?4LwH zUWyvM*FN`WHhqJR*GuHo^=fb@8K9nR<_2NdGiZa@5v&MM_7`*NYQGet=ipU@10>OU z_LudAeDb?vrY|7e%D4K9d}klA|H^wT^qcyKpX=z_v9IghECC;-!$>0eI@=0GcUL+5~I77QZ42oG2+psvs5a{Bu2LCuut{3OU zARf#a`W6FR;9rMnb({{(rXak60hq zt_$XKjz^-Hq3chMbf3E35_fVJvZ7cU}WgPb>30Mtk0C)oasN=74>sdMvULK8LLL%h9yY zygBKNO%|u?_gR@vSa)IC__w3~V%M&+T|2HWj-Lj6%nV^&!%LVGT{AO7s0ry@+7awU zo`WZrq4FQUu{6qx86L_<(%x0IaL!qE{V^H7$?>sJSj8$RS@<@vjTR7_n&C!3_l8Z< z@2B-34@pb#JdKT=*@JmE@x6B1y!|dvPO&KH8;=ucECJNd?8iQkQ)0%x624${`pdc# z;m20}>2rkxYs~SwL4A#6VvP9Bb>r*V-063P@XP`1)>w^OAYJpj z&&iKPDy!LJQvvsl?>4widm{qijUmY~PjXX4IY+{JK~b~7KY&i`0TF}=wy*UBF!wYk z`i)>|-K@3q`|=gwCN2Omwyv55AQNNqY&-^12qD&H2wdB!kIYHTvZnS{IAaT>4H41@ zkh3HuaT$~J*6N{U`>KWhZEO%lr%}7IZg2MxY~xe} zHe{U7bF7$8(*^}P&wyE`jI9~B_FZRiyhr@w=du~1J zQT(-TJwS*-)FV8=ty+Y~)Cc&e=xOf3y!f4cj6F30-egXCr1%!hUiqRY(zoPvStu_Mh9I{~+>QIcv>I=^eSY4UtEM(u8rjAM&~{ZhQExdwX!Y}uFM zRP;s6#Kz=aa=u}{`<{hfP-($s9YxD6ovXbCx#Y(NPxB%;5OVTVAtALVCX&eMSPOMFM8yDq`&}feIN5PdmO++Y(rMTl`NHy=$Y|RCNE+eFj zFO7plBS0W-@?0@SgDUu}MTqq@+H3j?*(GOF{n}p$?8Kj#CU(}FaVr5iPckZyWA98P zh+XDD7}if}gZ&ZH%{zw{VnTfFb$`Eux!6wKVtWZQJ%S)Z_@zd`V zmmNDh{chatwQZmH4mS#y4vhK$jQ7xHlldVXa}j<(VtLCuR6h{=J6_9gJwAKkFcbTG zTW258JryHwSG}6UcYb&?`$5ac9Upuy+KQFSZF`GCfpK^z19?1+vwJ*$)}}n`yN5SE zAOAvMkFiVtwTs^_eCP79+2^3$JSTp}ZI`DDa>{4yJzTc#^B3&*{C17wTkwmx`TJX6 z*EQJZEyO7G@z&zN{0sc@^K7$Na9N(Wc8Cx2KHL8H{r4VYUBlmw{=EQi`uQ|m+t|AP zih1W>MG80~xhE!lhQ8W(b3gaU~Jw2v0l1qsXC!+BDe0d)^z z*gYghd$dj82n2cCZHP3vnFkWQbFIi4T3Y)?0qP?qhy87JctrpBc+llM?OJ1IHC> z-m%`u{j@LnTx%ZfA>Z2*otU9L(|6a<<_&huWH`iji(d?gu|1hS$MHxx)svx z>%GXp-Zig6;jjYPBCU~bK=K1}7LUMa5l>Bjppi0n040Eq;*=bjo8+8Vau&=RaZ1t< zG>uz?z_Me-IzAE`<8N$FYb+Zip}DXRE0(9fJHTV#S=bm`W4;kz6#^@+iDQ~6;6Sr@ zV`9VFc;?i`dwvuF_?X{Zvo$#OPI3aVLLNtZ#2k1EOnnXeT9>Dx&vV|jkvYk2-j9E+ z89}=5;qN4773Ss`AZ6_kQ1S&%gnZ&(Y@p^hqw6_GV0Vu}Wba7|yk)<}j=kt<#S-LC zZ6Kmr&&;3sMiR#_@T>Tp_32IGM-AdX^Wm4)U2JbJSYO88{+am#9B4em1#((Ht!;W| z4R0FA*>i{QUVrb8v-a^_1q8}) zT*LKB;wAN{t_1>u{XsCbS!tr3NHdnP!S@SJ0x$Cuk7J&n{?agwapqaPiV#8dJkhKE zwHq;z_@+q%gvT^l{e%SCRFEnlp`a^paf(k39E@H3UZlQ2fs@o}*n_R}*nl8?-Wprr zCYjU23g83w65rHJ381x5@sj!oStysO-c5q8ZUn;u9uJp2a zSG(;APv+EjgjwxZTpFi*PJPm!2zE#@`>iz)<5@qo#r`u^t=uM;Gx=uU#yELwjTQS9 ziu4MHQ+gj=EiP@hXORuD75>s%Eo(+#=&BU-VZVtS?&bv>2>YLZce>hwp zpZf3Xs|Wt$3n_voZ#k9*Tp$)gfiN2=6%w}!sLTL)l@D_zX;kg3n47qOQcqv?ZzVHH zNer@H8!U5Cod*DFy>E=Or)rkdYwSjO(v&SeW0Sp-%hM33t9%s}1DSR0#K&th8_|=5 z0?Nj(^6ux31I?JG48S1p3OMc?|0GLu*Zg4Kd6ER0^7Ql;bfH@eVU|xQDqu89) zN5l?(c%o(wVwbuOwoc@lxImKFkn8dp4~QFi12Ylyh);08cm`*k6RAgYi;WO)>v~)p zj4r3lcq6elm-1u#CtTUSn{H6qpLi`hg69wZ=NGQ;{^YIKcRu#1-(G#^Z$5kd+-JX& zrY4D~$>%NP0#6$kbyeqRaIRsRI2xf2WzX6|GC0-K7y+PwM+#7TVmHlKKay;~9?}Rn zLSXm=D4{^x5GyAT5V@d`u@le?u+emBYRO>)veXP>F7|O!(7zH?Ypyv!?F;Z3*xPty z9c#conQmLGuQx{5v$3u9=EYk-bKR3%{Gw(uT001EeEhQw)IK%>EG1y6c~A``O+9eEZrE090MCk)%M{ak@o8 zvXe9lfh5fUZPMJ+)4!)go_n2DqJxY9`13(;JSF)MB*hiKV;>3~Wtf-~BZj0Mn>fJ^ zV8uvd&;S7#L01y+#EcLFghT4_rC??35FC(a3719=2wUUr2gw8gHa_;1weHEGHKK^GOrj^?$cq-}(3_fA^yw{pg2R z5B=|#|N7=X-1znB!Ly(H?m$!&xTlzrv@K!-Fct`bw<#s=I_PQG@1FbwOcEgo&@gSJ zNxgSi6#AN^8TSCU$>m+1QGBe8g7x3owU_-HUm8Im)jrfaVq(P<8_3I61Z8gq^8hfK z2|s8^nwUA*Py8Wb>q$cMFSW~cIsGGe5O4R|#kXsp?*ZZgY2b@JFyjaNX1+p(z3@#D z=P4N<>3fAed1Wt8EN{y3=j`NmDm-_-;2#c$Vf&~I}*pZn7^oc@Qa*n;bRP#eHiUhBV`zw+t>=T-Sr@d{;%S t|L*qczXSZOwgTG&5kTw>#Fjv;3;;z~9m||+-!=dM002ovPDHLkV1iF$lB56t diff --git a/wp/wp-content/plugins/wordpress-seo/images/banner/website-review.png b/wp/wp-content/plugins/wordpress-seo/images/banner/website-review.png deleted file mode 100644 index 0b47c81e6c16a2237b807c7c79aad050b4714317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70525 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 diff --git a/wp/wp-content/plugins/wordpress-seo/images/banner/woocommerce-seo.png b/wp/wp-content/plugins/wordpress-seo/images/banner/woocommerce-seo.png deleted file mode 100644 index 0a9ba8014c463d113f01ad51afe36ee02b42c327..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94032 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

    UrabKFK4MMl)Sq)J5AfV;9dSF2{>`5DM*0 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

    2gePYTVghszuUncE}Fi>5>gkED%uI0}}3OMkq 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 diff --git a/wp/wp-content/plugins/wordpress-seo/images/extensions-news.png b/wp/wp-content/plugins/wordpress-seo/images/extensions-news.png deleted file mode 100644 index f05ea47b22ab862b2ac2c68fa59e6c352a149b51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3353 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 VGWXyZ@Y6;jIorG075#!H{s-;bTKfP1 diff --git a/wp/wp-content/plugins/wordpress-seo/images/extensions-woo.png b/wp/wp-content/plugins/wordpress-seo/images/extensions-woo.png deleted file mode 100644 index 45c615653fc1fcc01950d1baefb54366344af9d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5573 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 P&vKcavpidDbQAM`JL;K8 diff --git a/wp/wp-content/plugins/wordpress-seo/images/index.php b/wp/wp-content/plugins/wordpress-seo/images/index.php deleted file mode 100644 index e94d9a42..00000000 --- a/wp/wp-content/plugins/wordpress-seo/images/index.php +++ /dev/null @@ -1,4 +0,0 @@ -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 M07*qoM6N<$g8Ns~6951J diff --git a/wp/wp-content/plugins/wordpress-seo/images/pinterest-23x30.png b/wp/wp-content/plugins/wordpress-seo/images/pinterest-23x30.png deleted file mode 100644 index 174438aba721c2c1c1006d20bb877f9fb869942b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1020 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 \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-rewrite.php b/wp/wp-content/plugins/wordpress-seo/inc/class-rewrite.php deleted file mode 100644 index 2ccb6010..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-rewrite.php +++ /dev/null @@ -1,162 +0,0 @@ - false ) ); - if ( is_array( $categories ) && $categories !== array() ) { - foreach ( $categories as $category ) { - $category_nicename = $category->slug; - if ( $category->parent == $category->cat_ID ) { - // Recursive recursion. - $category->parent = 0; - } - elseif ( $taxonomy->rewrite['hierarchical'] != 0 && $category->parent != 0 ) { - $parents = get_category_parents( $category->parent, false, '/', true ); - if ( ! is_wp_error( $parents ) ) { - $category_nicename = $parents . $category_nicename; - } - unset( $parents ); - } - - $category_rewrite[ $blog_prefix . '(' . $category_nicename . ')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$' ] = 'index.php?category_name=$matches[1]&feed=$matches[2]'; - $category_rewrite[ $blog_prefix . '(' . $category_nicename . ')/' . $wp_rewrite->pagination_base . '/?([0-9]{1,})/?$' ] = 'index.php?category_name=$matches[1]&paged=$matches[2]'; - $category_rewrite[ $blog_prefix . '(' . $category_nicename . ')/?$' ] = 'index.php?category_name=$matches[1]'; - } - unset( $categories, $category, $category_nicename ); - } - - // Redirect support from Old Category Base. - $old_base = $wp_rewrite->get_category_permastruct(); - $old_base = str_replace( '%category%', '(.+)', $old_base ); - $old_base = trim( $old_base, '/' ); - $category_rewrite[ $old_base . '$' ] = 'index.php?wpseo_category_redirect=$matches[1]'; - - return $category_rewrite; - } -} /* End of class */ diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-upgrade.php b/wp/wp-content/plugins/wordpress-seo/inc/class-upgrade.php deleted file mode 100644 index 458fe0f1..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-upgrade.php +++ /dev/null @@ -1,282 +0,0 @@ -options = WPSEO_Options::get_option( 'wpseo' ); - - WPSEO_Options::maybe_set_multisite_defaults( false ); - - if ( version_compare( $this->options['version'], '1.5.0', '<' ) ) { - $this->upgrade_15( $this->options['version'] ); - } - - if ( version_compare( $this->options['version'], '2.0', '<' ) ) { - $this->upgrade_20(); - } - - if ( version_compare( $this->options['version'], '2.1', '<' ) ) { - $this->upgrade_21(); - } - - if ( version_compare( $this->options['version'], '2.2', '<' ) ) { - $this->upgrade_22(); - } - - if ( version_compare( $this->options['version'], '2.3', '<' ) ) { - $this->upgrade_23(); - } - - if ( version_compare( $this->options['version'], '3.0', '<' ) ) { - $this->upgrade_30(); - } - - if ( version_compare( $this->options['version'], '3.3', '<' ) ) { - $this->upgrade_33(); - } - - if ( version_compare( $this->options['version'], '3.6', '<' ) ) { - $this->upgrade_36(); - } - - if ( version_compare( $this->options['version'], '4.0', '<' ) ) { - $this->upgrade_40(); - } - - if ( version_compare( $this->options['version'], '4.4', '<' ) ) { - $this->upgrade_44(); - } - - if ( version_compare( $this->options['version'], '4.7', '<' ) ) { - $this->upgrade_47(); - } - - // Since 3.7. - $upsell_notice = new WPSEO_Product_Upsell_Notice(); - $upsell_notice->set_upgrade_notice(); - - /** - * Filter: 'wpseo_run_upgrade' - Runs the upgrade hook which are dependent on Yoast SEO - * - * @api string - The current version of Yoast SEO - */ - do_action( 'wpseo_run_upgrade', $this->options['version'] ); - - $this->finish_up(); - } - - /** - * Run the Yoast SEO 1.5 upgrade routine - * - * @param string $version Current plugin version. - */ - private function upgrade_15( $version ) { - // Clean up options and meta. - WPSEO_Options::clean_up( null, $version ); - WPSEO_Meta::clean_up(); - - // Add new capabilities on upgrade. - wpseo_add_capabilities(); - } - - /** - * Moves options that moved position in WPSEO 2.0 - */ - private function upgrade_20() { - /** - * Clean up stray wpseo_ms options from the options table, option should only exist in the sitemeta table. - * This could have been caused in many version of Yoast SEO, so deleting it for everything below 2.0 - */ - delete_option( 'wpseo_ms' ); - - $this->move_pinterest_option(); - } - - /** - * Detects if taxonomy terms were split and updates the corresponding taxonomy meta's accordingly. - */ - private function upgrade_21() { - $taxonomies = get_option( 'wpseo_taxonomy_meta', array() ); - - if ( ! empty( $taxonomies ) ) { - foreach ( $taxonomies as $taxonomy => $tax_metas ) { - foreach ( $tax_metas as $term_id => $tax_meta ) { - if ( function_exists( 'wp_get_split_term' ) && $new_term_id = wp_get_split_term( $term_id, $taxonomy ) ) { - $taxonomies[ $taxonomy ][ $new_term_id ] = $taxonomies[ $taxonomy ][ $term_id ]; - unset( $taxonomies[ $taxonomy ][ $term_id ] ); - } - } - } - - update_option( 'wpseo_taxonomy_meta', $taxonomies ); - } - } - - /** - * Performs upgrade functions to Yoast SEO 2.2 - */ - private function upgrade_22() { - // Unschedule our tracking. - wp_clear_scheduled_hook( 'yoast_tracking' ); - - // Clear the tracking settings, the seen about setting and the ignore tour setting. - $options = get_option( 'wpseo' ); - unset( $options['tracking_popup_done'], $options['yoast_tracking'], $options['seen_about'], $options['ignore_tour'] ); - update_option( 'wpseo', $options ); - } - - /** - * Schedules upgrade function to Yoast SEO 2.3 - */ - private function upgrade_23() { - add_action( 'wp', array( $this, 'upgrade_23_query' ), 90 ); - add_action( 'admin_head', array( $this, 'upgrade_23_query' ), 90 ); - } - - /** - * Performs upgrade query to Yoast SEO 2.3 - */ - public function upgrade_23_query() { - $wp_query = new WP_Query( 'post_type=any&meta_key=_yoast_wpseo_sitemap-include&meta_value=never&order=ASC' ); - - if ( ! empty( $wp_query->posts ) ) { - $options = get_option( 'wpseo_xml' ); - - $excluded_posts = array(); - if ( $options['excluded-posts'] !== '' ) { - $excluded_posts = explode( ',', $options['excluded-posts'] ); - } - - foreach ( $wp_query->posts as $post ) { - if ( ! in_array( $post->ID, $excluded_posts ) ) { - $excluded_posts[] = $post->ID; - } - } - - // Updates the meta value. - $options['excluded-posts'] = implode( ',', $excluded_posts ); - - // Update the option. - update_option( 'wpseo_xml', $options ); - } - - // Remove the meta fields. - delete_post_meta_by_key( '_yoast_wpseo_sitemap-include' ); - } - - /** - * Performs upgrade functions to Yoast SEO 3.0 - */ - private function upgrade_30() { - // Remove the meta fields for sitemap prio. - delete_post_meta_by_key( '_yoast_wpseo_sitemap-prio' ); - } - - /** - * Performs upgrade functions to Yoast SEO 3.3 - */ - private function upgrade_33() { - // Notification dismissals have been moved to User Meta instead of global option. - delete_option( Yoast_Notification_Center::STORAGE_KEY ); - } - - /** - * Performs upgrade functions to Yoast SEO 3.6 - */ - private function upgrade_36() { - global $wpdb; - - // Between 3.2 and 3.4 the sitemap options were saved with autoloading enabled. - $wpdb->query( 'DELETE FROM ' . $wpdb->options . ' WHERE option_name LIKE "wpseo_sitemap_%" AND autoload = "yes"' ); - } - - /** - * Move the pinterest verification option from the wpseo option to the wpseo_social option - */ - private function move_pinterest_option() { - $options_social = get_option( 'wpseo_social' ); - - if ( isset( $option_wpseo['pinterestverify'] ) ) { - $options_social['pinterestverify'] = $option_wpseo['pinterestverify']; - unset( $option_wpseo['pinterestverify'] ); - update_option( 'wpseo_social', $options_social ); - update_option( 'wpseo', $option_wpseo ); - } - } - - /** - * Runs the needed cleanup after an update, setting the DB version to latest version, flushing caches etc. - */ - private function finish_up() { - $this->options = WPSEO_Options::get_option( 'wpseo' ); // Re-get to make sure we have the latest version. - update_option( 'wpseo', $this->options ); // This also ensures the DB version is equal to WPSEO_VERSION. - - add_action( 'shutdown', 'flush_rewrite_rules' ); // Just flush rewrites, always, to at least make them work after an upgrade. - WPSEO_Sitemaps_Cache::clear(); // Flush the sitemap cache. - - WPSEO_Options::ensure_options_exist(); // Make sure all our options always exist - issue #1245. - } - - /** - * Removes the about notice when its still in the database. - */ - private function upgrade_40() { - $center = Yoast_Notification_Center::get(); - $notification = $center->get_notification_by_id( 'wpseo-dismiss-about' ); - - if ( $notification ) { - $center->remove_notification( $notification ); - } - } - - /** - * Moves the content-analysis-active and keyword-analysis-acive options from wpseo-titles to wpseo. - */ - private function upgrade_44() { - $option_titles = WPSEO_Options::get_option( 'wpseo_titles' ); - $option_wpseo = WPSEO_Options::get_option( 'wpseo' ); - - if ( isset( $option_titles['content-analysis-active'] ) && isset( $option_titles['keyword-analysis-active'] ) ) { - $option_wpseo['content_analysis_active'] = $option_titles['content-analysis-active']; - unset( $option_titles['content-analysis-active'] ); - - $option_wpseo['keyword_analysis_active'] = $option_titles['keyword-analysis-active']; - unset( $option_titles['keyword-analysis-active'] ); - - update_option( 'wpseo_titles', $option_titles ); - update_option( 'wpseo', $option_wpseo ); - } - } - - /** - * Renames the meta name for the cornerstone content. It was a public meta field and it has to be private. - */ - private function upgrade_47() { - global $wpdb; - - // The meta key has to be private, so prefix it. - $wpdb->query( - $wpdb->prepare( - 'UPDATE ' . $wpdb->postmeta . ' SET meta_key = "%s" WHERE meta_key = "yst_is_cornerstone"', - WPSEO_Cornerstone::META_NAME - ) - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-advanced-settings.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-advanced-settings.php deleted file mode 100644 index a501304d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-advanced-settings.php +++ /dev/null @@ -1,64 +0,0 @@ -is_premium(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-installation.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-installation.php deleted file mode 100644 index 4fda27d7..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-installation.php +++ /dev/null @@ -1,45 +0,0 @@ -is_first_install(); - - if ( $is_first_install && WPSEO_Utils::is_api_available() ) { - add_action( 'wpseo_activate', array( $this, 'set_first_install_options' ) ); - } - } - - /** - * When the option doesn't exist, it should be a new install. - * - * @return bool - */ - private function is_first_install() { - return ( get_option( 'wpseo' ) === false ); - } - - /** - * Sets the options on first install for showing the installation notice and disabling of the settings pages. - */ - public function set_first_install_options() { - $options = get_option( 'wpseo' ); - - $options['enable_setting_pages'] = false; - $options['show_onboarding_notice'] = true; - $options['first_activated_on'] = time(); - - update_option( 'wpseo', $options ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-meta.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-meta.php deleted file mode 100644 index ddfaf0e2..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-meta.php +++ /dev/null @@ -1,1083 +0,0 @@ - (string) field type. i.e. text / textarea / checkbox / - * radio / select / multiselect / upload / snippetpreview etc - * (required) 'title' => (string) table row title - * (recommended) 'default_value' => (string|array) default value for the field - * IMPORTANT: - * - if the field has options, the default has to be the - * key of one of the options - * - if the field is a text field, the default **has** to be - * an empty string as otherwise the user can't save - * an empty value/delete the meta value - * - if the field is a checkbox, the only valid values - * are 'on' or 'off' - * (semi-required) 'options' => (array) options for used with (multi-)select and radio - * fields, required if that's the field type - * key = (string) value which will be saved to db - * value = (string) text label for the option - * (optional) 'autocomplete' => (bool) whether autocomplete is on for text fields, - * defaults to true - * (optional) 'class' => (string) classname(s) to add to the actual tag - * (optional) 'description' => (string) description to show underneath the field - * (optional) 'expl' => (string) label for a checkbox - * (optional) 'help' => (string) help text to show on mouse over ? image - * (optional) 'rows' => (int) number of rows for a textarea, defaults to 3 - * - * (optional) 'placeholder' => (string) Currently only used by add-on plugins - * (optional) 'serialized' => (bool) whether the value is expected to be serialized, - * i.e. an array or object, defaults to false - * Currently only used by add-on plugins - * - * @static - * - * @internal - * - Titles, help texts, description text and option labels are added via a translate_meta_boxes() method - * in the relevant child classes (WPSEO_Metabox and WPSEO_Social_admin) as they are only needed there. - * - Beware: even though the meta keys are divided into subsets, they still have to be uniquely named! - */ - public static $meta_fields = array( - 'general' => array( - 'snippetpreview' => array( - 'type' => 'snippetpreview', - 'title' => '', // Translation added later. - 'help' => '', // Translation added later. - 'help-button' => '', // Translation added later. - ), - 'focuskw_text_input' => array( - 'type' => 'focuskeyword', - 'title' => '', // Translation added later. - 'default_value' => '', - 'autocomplete' => false, - 'help' => '', // Translation added later. - 'description' => '

    ', - 'help-button' => '', // Translation added later. - ), - 'focuskw' => array( - 'type' => 'hidden', - 'title' => '', - ), - 'title' => array( - 'type' => 'hidden', - 'title' => '', // Translation added later. - 'default_value' => '', - 'description' => '', // Translation added later. - 'help' => '', // Translation added later. - ), - 'metadesc' => array( - 'type' => 'hidden', - 'title' => '', // Translation added later. - 'default_value' => '', - 'class' => 'metadesc', - 'rows' => 2, - 'description' => '', // Translation added later. - 'help' => '', // Translation added later. - ), - 'linkdex' => array( - 'type' => 'hidden', - 'title' => 'linkdex', - 'default_value' => '0', - 'description' => '', - ), - 'content_score' => array( - 'type' => 'hidden', - 'title' => 'content_score', - 'default_value' => '0', - 'description' => '', - ), - 'metakeywords' => array( - 'type' => 'metakeywords', - 'title' => '', // Translation added later. - 'default_value' => '', - 'class' => 'metakeywords', - 'description' => '', // Translation added later. - ), - 'pageanalysis' => array( - 'type' => 'pageanalysis', - 'title' => '', // Translation added later. - 'help' => '', // Translation added later. - 'help-button' => '', // Translation added later. - ), - ), - 'advanced' => array( - 'meta-robots-noindex' => array( - 'type' => 'select', - 'title' => '', // Translation added later. - 'default_value' => '0', // = post-type default. - 'options' => array( - '0' => '', // Post type default - translation added later. - '2' => '', // Index - translation added later. - '1' => '', // No-index - translation added later. - ), - ), - 'meta-robots-nofollow' => array( - 'type' => 'radio', - 'title' => '', // Translation added later. - 'default_value' => '0', // = follow. - 'options' => array( - '0' => '', // Follow - translation added later. - '1' => '', // No-follow - translation added later. - ), - ), - 'meta-robots-adv' => array( - 'type' => 'multiselect', - 'title' => '', // Translation added later. - 'default_value' => '-', // = site-wide default. - 'description' => '', // Translation added later. - 'options' => array( - '-' => '', // Site-wide default - translation added later. - 'none' => '', // Translation added later. - 'noodp' => '', // Translation added later. - 'noimageindex' => '', // Translation added later. - 'noarchive' => '', // Translation added later. - 'nosnippet' => '', // Translation added later. - ), - ), - 'bctitle' => array( - 'type' => 'text', - 'title' => '', // Translation added later. - 'default_value' => '', - 'description' => '', // Translation added later. - ), - 'canonical' => array( - 'type' => 'text', - 'title' => '', // Translation added later. - 'default_value' => '', - 'description' => '', // Translation added later. - ), - 'redirect' => array( - 'type' => 'text', - 'title' => '', // Translation added later. - 'default_value' => '', - 'description' => '', // Translation added later. - ), - ), - 'social' => array(), - /* Fields we should validate & save, but not show on any form */ - 'non_form' => array( - 'linkdex' => array( - 'type' => null, - 'default_value' => '0', - ), - ), - ); - - - /** - * @var array Helper property - reverse index of the definition array - * Format: [full meta key including prefix] => array - * ['subset'] => (string) primary index - * ['key'] => (string) internal key - * @static - */ - public static $fields_index = array(); - - - /** - * @var array Helper property - array containing only the defaults in the format: - * [full meta key including prefix] => (string) default value - * @static - */ - public static $defaults = array(); - - /** - * @var array Helper property to define the social network meta field definitions - networks - * @static - */ - private static $social_networks = array( - 'opengraph' => 'opengraph', - 'twitter' => 'twitter', - ); - - /** - * @var array Helper property to define the social network meta field definitions - fields and their type - * @static - */ - private static $social_fields = array( - 'title' => 'text', - 'description' => 'textarea', - 'image' => 'upload', - ); - - - /** - * Register our actions and filters - * - * @static - * @return void - */ - public static function init() { - - $options = WPSEO_Options::get_option( 'wpseo_social' ); - foreach ( self::$social_networks as $option => $network ) { - if ( true === $options[ $option ] ) { - foreach ( self::$social_fields as $box => $type ) { - self::$meta_fields['social'][ $network . '-' . $box ] = array( - 'type' => $type, - 'title' => '', // Translation added later. - 'default_value' => '', - 'description' => '', // Translation added later. - ); - } - } - } - unset( $options, $option, $network, $box, $type ); - - /** - * Allow add-on plugins to register their meta fields for management by this class - * add_filter() calls must be made before plugins_loaded prio 14 - */ - $extra_fields = apply_filters( 'add_extra_wpseo_meta_fields', array() ); - if ( is_array( $extra_fields ) ) { - self::$meta_fields = self::array_merge_recursive_distinct( $extra_fields, self::$meta_fields ); - } - unset( $extra_fields ); - - $register = function_exists( 'register_meta' ); - - foreach ( self::$meta_fields as $subset => $field_group ) { - foreach ( $field_group as $key => $field_def ) { - if ( $field_def['type'] !== 'snippetpreview' ) { - /** - * Function register_meta() is undocumented and not used by WP internally, wrapped in - * function_exists as a precaution in case they remove it. - */ - if ( $register === true ) { - register_meta( 'post', self::$meta_prefix . $key, array( __CLASS__, 'sanitize_post_meta' ) ); - } - else { - add_filter( 'sanitize_post_meta_' . self::$meta_prefix . $key, array( __CLASS__, 'sanitize_post_meta' ), 10, 2 ); - } - - // Set the $fields_index property for efficiency. - self::$fields_index[ self::$meta_prefix . $key ] = array( - 'subset' => $subset, - 'key' => $key, - ); - - // Set the $defaults property for efficiency. - if ( isset( $field_def['default_value'] ) ) { - self::$defaults[ self::$meta_prefix . $key ] = $field_def['default_value']; - } - else { - // Meta will always be a string, so let's make the meta meta default also a string. - self::$defaults[ self::$meta_prefix . $key ] = ''; - } - } - } - } - unset( $subset, $field_group, $key, $field_def, $register ); - - add_filter( 'update_post_metadata', array( __CLASS__, 'remove_meta_if_default' ), 10, 5 ); - add_filter( 'add_post_metadata', array( __CLASS__, 'dont_save_meta_if_default' ), 10, 4 ); - } - - - /** - * Retrieve the meta box form field definitions for the given tab and post type. - * - * @static - * - * @param string $tab Tab for which to retrieve the field definitions. - * @param string $post_type Post type of the current post. - * - * @return array Array containing the meta box field definitions - */ - public static function get_meta_field_defs( $tab, $post_type = 'post' ) { - if ( ! isset( self::$meta_fields[ $tab ] ) ) { - return array(); - } - - $field_defs = self::$meta_fields[ $tab ]; - - switch ( $tab ) { - case 'non-form': - // Prevent non-form fields from being passed to forms. - $field_defs = array(); - break; - - - case 'general': - $options = WPSEO_Options::get_option( 'wpseo_titles' ); - if ( $options['usemetakeywords'] === true ) { - /* Adjust the link in the keywords description text string based on the post type */ - $field_defs['metakeywords']['description'] = sprintf( $field_defs['metakeywords']['description'], '', '' ); - } - else { - /* Don't show the keywords field if keywords aren't enabled */ - unset( $field_defs['metakeywords'] ); - } - /** - * Filter the WPSEO metabox form field definitions for the general tab, backward compatibility - * - * @deprecated 1.5.0 - * @deprecated use the 'wpseo_metabox_entries_general' filter instead - * @see WPSEO_Meta::get_meta_field_defs() - * - * @param array $field_defs Metabox orm definitions. - * - * @return array - */ - $field_defs = apply_filters( 'wpseo_metabox_entries', $field_defs ); - break; - - - case 'advanced': - global $post; - - $options = WPSEO_Options::get_options( array( 'wpseo', 'wpseo_titles', 'wpseo_internallinks' ) ); - - if ( ! current_user_can( 'manage_options' ) && $options['disableadvanced_meta'] ) { - return array(); - } - - $post_type = ''; - if ( isset( $post->post_type ) ) { - $post_type = $post->post_type; - } - elseif ( ! isset( $post->post_type ) && isset( $_GET['post_type'] ) ) { - $post_type = sanitize_text_field( $_GET['post_type'] ); - } - - /* Adjust the no-index 'default for post type' text string based on the post type */ - $field_defs['meta-robots-noindex']['options']['0'] = sprintf( $field_defs['meta-robots-noindex']['options']['0'], ( ( isset( $options[ 'noindex-' . $post_type ] ) && $options[ 'noindex-' . $post_type ] === true ) ? 'noindex' : 'index' ) ); - - /* Adjust the robots advanced 'site-wide default' text string based on those settings */ - if ( $options['noodp'] !== false ) { - $robots_adv = array(); - if ( $options['noodp'] === true ) { - // Use translation from field def options - mind that $options and $field_def['options'] keys should be the same! - $robots_adv[] = $field_defs['meta-robots-adv']['options']['noodp']; - } - $robots_adv = implode( ', ', $robots_adv ); - } - else { - $robots_adv = __( 'None', 'wordpress-seo' ); - } - $field_defs['meta-robots-adv']['options']['-'] = sprintf( $field_defs['meta-robots-adv']['options']['-'], $robots_adv ); - unset( $robots_adv ); - - - /* Don't show the breadcrumb title field if breadcrumbs aren't enabled */ - if ( $options['breadcrumbs-enable'] !== true && ! current_theme_supports( 'yoast-seo-breadcrumbs' ) ) { - unset( $field_defs['bctitle'] ); - } - - global $post; - - if ( empty( $post->ID ) || ( ! empty( $post->ID ) && self::get_value( 'redirect', $post->ID ) === '' ) ) { - unset( $field_defs['redirect'] ); - } - break; - } - - /** - * Filter the WPSEO metabox form field definitions for a tab - * {tab} can be 'general', 'advanced' or 'social' - * - * @param array $field_defs Metabox form definitions. - * @param string $post_type Post type of the post the metabox is for, defaults to 'post'. - * - * @return array - */ - - return apply_filters( 'wpseo_metabox_entries_' . $tab, $field_defs, $post_type ); - } - - - /** - * Validate the post meta values - * - * @static - * - * @param mixed $meta_value The new value. - * @param string $meta_key The full meta key (including prefix). - * - * @return string Validated meta value - */ - public static function sanitize_post_meta( $meta_value, $meta_key ) { - $field_def = self::$meta_fields[ self::$fields_index[ $meta_key ]['subset'] ][ self::$fields_index[ $meta_key ]['key'] ]; - $clean = self::$defaults[ $meta_key ]; - - switch ( true ) { - case ( $meta_key === self::$meta_prefix . 'linkdex' ): - $int = WPSEO_Utils::validate_int( $meta_value ); - if ( $int !== false && $int >= 0 ) { - $clean = strval( $int ); // Convert to string to make sure default check works. - } - break; - - case ( $field_def['type'] === 'checkbox' ): - // Only allow value if it's one of the predefined options. - if ( in_array( $meta_value, array( 'on', 'off' ), true ) ) { - $clean = $meta_value; - } - break; - - - case ( $field_def['type'] === 'select' || $field_def['type'] === 'radio' ): - // Only allow value if it's one of the predefined options. - if ( isset( $field_def['options'][ $meta_value ] ) ) { - $clean = $meta_value; - } - break; - - - case ( $field_def['type'] === 'multiselect' && $meta_key === self::$meta_prefix . 'meta-robots-adv' ): - $clean = self::validate_meta_robots_adv( $meta_value ); - break; - - - case ( $field_def['type'] === 'text' && $meta_key === self::$meta_prefix . 'canonical' ): - case ( $field_def['type'] === 'text' && $meta_key === self::$meta_prefix . 'redirect' ): - // Validate as url(-part). - $url = WPSEO_Utils::sanitize_url( $meta_value ); - if ( $url !== '' ) { - $clean = $url; - } - break; - - - case ( $field_def['type'] === 'upload' && $meta_key === self::$meta_prefix . 'opengraph-image' ): - // Validate as url. - $url = WPSEO_Utils::sanitize_url( $meta_value, array( 'http', 'https', 'ftp', 'ftps' ) ); - if ( $url !== '' ) { - $clean = $url; - } - break; - - - case ( $field_def['type'] === 'textarea' ): - if ( is_string( $meta_value ) ) { - // Remove line breaks and tabs. - // @todo [JRF => Yoast] verify that line breaks and the likes aren't allowed/recommended in meta header fields. - $meta_value = str_replace( array( "\n", "\r", "\t", ' ' ), ' ', $meta_value ); - $clean = WPSEO_Utils::sanitize_text_field( trim( $meta_value ) ); - } - break; - - case ( 'multiselect' === $field_def['type'] ): - $clean = $meta_value; - break; - - - case ( $field_def['type'] === 'text' ): - default: - if ( is_string( $meta_value ) ) { - $clean = WPSEO_Utils::sanitize_text_field( trim( $meta_value ) ); - } - - if ( $meta_key === self::$meta_prefix . 'focuskw' ) { - $clean = str_replace( array( - '<', - '>', - '"', - '`', - '<', - '>', - '"', - '`', - ), '', $clean ); - } - break; - } - - $clean = apply_filters( 'wpseo_sanitize_post_meta_' . $meta_key, $clean, $meta_value, $field_def, $meta_key ); - - return $clean; - } - - - /** - * Validate a meta-robots-adv meta value - * - * @todo [JRF => Yoast] Verify that this logic for the prioritisation is correct - * - * @static - * - * @param array|string $meta_value The value to validate. - * - * @return string Clean value - */ - public static function validate_meta_robots_adv( $meta_value ) { - $clean = self::$meta_fields['advanced']['meta-robots-adv']['default_value']; - $options = self::$meta_fields['advanced']['meta-robots-adv']['options']; - - if ( is_string( $meta_value ) ) { - $meta_value = explode( ',', $meta_value ); - } - - if ( is_array( $meta_value ) && $meta_value !== array() ) { - $meta_value = array_map( 'trim', $meta_value ); - - if ( in_array( 'none', $meta_value, true ) ) { - // None is one of the selected values, takes priority over everything else. - $clean = 'none'; - } - elseif ( in_array( '-', $meta_value, true ) ) { - // Site-wide defaults is one of the selected values, takes priority over individual selected entries. - $clean = '-'; - } - else { - // Individual selected entries. - $cleaning = array(); - foreach ( $meta_value as $value ) { - if ( isset( $options[ $value ] ) ) { - $cleaning[] = $value; - } - } - - if ( $cleaning !== array() ) { - $clean = implode( ',', $cleaning ); - } - unset( $cleaning, $value ); - } - } - - return $clean; - } - - - /** - * Prevent saving of default values and remove potential old value from the database if replaced by a default - * - * @static - * - * @param null $null Old, disregard. - * @param int $object_id ID of the current object for which the meta is being updated. - * @param string $meta_key The full meta key (including prefix). - * @param string $meta_value New meta value. - * @param string $prev_value The old meta value. - * - * @return null|bool true = stop saving, null = continue saving - */ - public static function remove_meta_if_default( $null, $object_id, $meta_key, $meta_value, $prev_value = '' ) { - /* If it's one of our meta fields, check against default */ - if ( isset( self::$fields_index[ $meta_key ] ) && self::meta_value_is_default( $meta_key, $meta_value ) === true ) { - if ( $prev_value !== '' ) { - delete_post_meta( $object_id, $meta_key, $prev_value ); - } - else { - delete_post_meta( $object_id, $meta_key ); - } - - return true; // Stop saving the value. - } - - return null; // Go on with the normal execution (update) in meta.php. - } - - - /** - * Prevent adding of default values to the database - * - * @static - * - * @param null $null Old, disregard. - * @param int $object_id ID of the current object for which the meta is being added. - * @param string $meta_key The full meta key (including prefix). - * @param string $meta_value New meta value. - * - * @return null|bool true = stop saving, null = continue saving - */ - public static function dont_save_meta_if_default( $null, $object_id, $meta_key, $meta_value ) { - /* If it's one of our meta fields, check against default */ - if ( isset( self::$fields_index[ $meta_key ] ) && self::meta_value_is_default( $meta_key, $meta_value ) === true ) { - return true; // Stop saving the value. - } - - return null; // Go on with the normal execution (add) in meta.php. - } - - - /** - * Is the given meta value the same as the default value ? - * - * @static - * - * @param string $meta_key The full meta key (including prefix). - * @param mixed $meta_value The value to check. - * - * @return bool - */ - public static function meta_value_is_default( $meta_key, $meta_value ) { - return ( isset( self::$defaults[ $meta_key ] ) && $meta_value === self::$defaults[ $meta_key ] ); - } - - - /** - * Get a custom post meta value - * Returns the default value if the meta value has not been set - * - * @internal Unfortunately there isn't a filter available to hook into before returning the results - * for get_post_meta(), get_post_custom() and the likes. That would have been the preferred solution. - * - * @static - * - * @param string $key Internal key of the value to get (without prefix). - * @param int $postid Post ID of the post to get the value for. - * - * @return string All 'normal' values returned from get_post_meta() are strings. - * Objects and arrays are possible, but not used by this plugin - * and therefore discarted (except when the special 'serialized' field def - * value is set to true - only used by add-on plugins for now). - * Will return the default value if no value was found.. - * Will return empty string if no default was found (not one of our keys) or - * if the post does not exist. - */ - public static function get_value( $key, $postid = 0 ) { - global $post; - - $postid = absint( $postid ); - if ( $postid === 0 ) { - if ( ( isset( $post ) && is_object( $post ) ) && ( isset( $post->post_status ) && $post->post_status !== 'auto-draft' ) ) { - $postid = $post->ID; - } - else { - return ''; - } - } - - $custom = get_post_custom( $postid ); // Array of strings or empty array. - - if ( isset( $custom[ self::$meta_prefix . $key ][0] ) ) { - $unserialized = maybe_unserialize( $custom[ self::$meta_prefix . $key ][0] ); - if ( $custom[ self::$meta_prefix . $key ][0] === $unserialized ) { - return $custom[ self::$meta_prefix . $key ][0]; - } - else { - $field_def = self::$meta_fields[ self::$fields_index[ self::$meta_prefix . $key ]['subset'] ][ self::$fields_index[ self::$meta_prefix . $key ]['key'] ]; - if ( isset( $field_def['serialized'] ) && $field_def['serialized'] === true ) { - // Ok, serialize value expected/allowed. - return $unserialized; - } - } - } - - // Meta was either not found or found, but object/array while not allowed to be. - if ( isset( self::$defaults[ self::$meta_prefix . $key ] ) ) { - return self::$defaults[ self::$meta_prefix . $key ]; - } - else { - /* - Shouldn't ever happen, means not one of our keys as there will always be a default available - for all our keys - */ - return ''; - } - } - - - /** - * Update a meta value for a post - * - * @static - * - * @param string $key The internal key of the meta value to change (without prefix). - * @param mixed $meta_value The value to set the meta to. - * @param int $post_id The ID of the post to change the meta for. - * - * @return bool whether the value was changed - */ - public static function set_value( $key, $meta_value, $post_id ) { - return update_post_meta( $post_id, self::$meta_prefix . $key, $meta_value ); - } - - /** - * Deletes a meta value for a post - * - * @static - * - * @param string $key The internal key of the meta value to change (without prefix). - * @param int $post_id The ID of the post to change the meta for. - * - * @return bool Whether the value was changed - */ - public static function delete( $key, $post_id ) { - return delete_post_meta( $post_id, self::$meta_prefix . $key ); - } - - /** - * Used for imports, this functions imports the value of $old_metakey into $new_metakey for those post - * where no WPSEO meta data has been set. - * Optionally deletes the $old_metakey values. - * - * @static - * - * @param string $old_metakey The old key of the meta value. - * @param string $new_metakey The new key, usually the WPSEO meta key (including prefix). - * @param bool $delete_old Whether to delete the old meta key/value-sets. - * - * @return void - */ - public static function replace_meta( $old_metakey, $new_metakey, $delete_old = false ) { - global $wpdb; - - /* - Get only those rows where no wpseo meta values exist for the same post - (with the exception of linkdex as that will be set independently of whether the post has been edited) - @internal Query is pretty well optimized this way - */ - $query = $wpdb->prepare( - " - SELECT `a`.* - FROM {$wpdb->postmeta} AS a - WHERE `a`.`meta_key` = %s - AND NOT EXISTS ( - SELECT DISTINCT `post_id` , count( `meta_id` ) AS count - FROM {$wpdb->postmeta} AS b - WHERE `a`.`post_id` = `b`.`post_id` - AND `meta_key` LIKE %s - AND `meta_key` <> %s - GROUP BY `post_id` - ) - ;", - $old_metakey, - $wpdb->esc_like( self::$meta_prefix . '%' ), - self::$meta_prefix . 'linkdex' - ); - $oldies = $wpdb->get_results( $query ); - - if ( is_array( $oldies ) && $oldies !== array() ) { - foreach ( $oldies as $old ) { - update_post_meta( $old->post_id, $new_metakey, $old->meta_value ); - } - } - - // Delete old keys. - if ( $delete_old === true ) { - delete_post_meta_by_key( $old_metakey ); - } - } - - - /** - * General clean-up of the saved meta values - * - Remove potentially lingering old meta keys - * - Remove all default and invalid values - * - * @static - * @return void - */ - public static function clean_up() { - global $wpdb; - - /** - * Clean up '_yoast_wpseo_meta-robots' - * - * Retrieve all '_yoast_wpseo_meta-robots' meta values and convert if no new values found - * - * @internal Query is pretty well optimized this way - * - * @todo [JRF => Yoast] find out all possible values which the old '_yoast_wpseo_meta-robots' could contain - * to convert the data correctly - */ - $query = $wpdb->prepare( - " - SELECT `a`.* - FROM {$wpdb->postmeta} AS a - WHERE `a`.`meta_key` = %s - AND NOT EXISTS ( - SELECT DISTINCT `post_id` , count( `meta_id` ) AS count - FROM {$wpdb->postmeta} AS b - WHERE `a`.`post_id` = `b`.`post_id` - AND ( `meta_key` = %s - OR `meta_key` = %s ) - GROUP BY `post_id` - ) - ;", - self::$meta_prefix . 'meta-robots', - self::$meta_prefix . 'meta-robots-noindex', - self::$meta_prefix . 'meta-robots-nofollow' - ); - $oldies = $wpdb->get_results( $query ); - - if ( is_array( $oldies ) && $oldies !== array() ) { - foreach ( $oldies as $old ) { - $old_values = explode( ',', $old->meta_value ); - foreach ( $old_values as $value ) { - if ( $value === 'noindex' ) { - update_post_meta( $old->post_id, self::$meta_prefix . 'meta-robots-noindex', 1 ); - } - elseif ( $value === 'nofollow' ) { - update_post_meta( $old->post_id, self::$meta_prefix . 'meta-robots-nofollow', 1 ); - } - } - } - } - unset( $query, $oldies, $old, $old_values, $value ); - - // Delete old keys. - delete_post_meta_by_key( self::$meta_prefix . 'meta-robots' ); - - - /** - * Remove all default values and (most) invalid option values - * Invalid option values for the multiselect (meta-robots-adv) field will be dealt with seperately - * - * @internal some of the defaults have changed in v1.5, but as the defaults will be removed and - * new defaults will now automatically be passed when no data found, this update is automatic - * (as long as we remove the old values which we do in the below routine) - * - * @internal unfortunately we can't use the normal delete_meta() with key/value combination as '' - * (empty string) values will be ignored and would result in all metas with that key being deleted, - * not just the empty fields. - * Still, the below implementation is largely based on the delete_meta() function - */ - $query = array(); - - foreach ( self::$meta_fields as $subset => $field_group ) { - foreach ( $field_group as $key => $field_def ) { - if ( $field_def['type'] === 'snippetpreview' || ! isset( $field_def['default_value'] ) ) { - continue; - } - - if ( $key === 'meta-robots-adv' ) { - $query[] = $wpdb->prepare( - "( meta_key = %s AND ( meta_value = 'none' OR meta_value = '-' ) )", - self::$meta_prefix . $key - ); - } - elseif ( isset( $field_def['options'] ) && is_array( $field_def['options'] ) && $field_def['options'] !== array() ) { - $valid = $field_def['options']; - // Remove the default value from the valid options. - unset( $valid[ $field_def['default_value'] ] ); - $valid = array_keys( $valid ); - - $query[] = $wpdb->prepare( - "( meta_key = %s AND meta_value NOT IN ( '" . implode( "','", esc_sql( $valid ) ) . "' ) )", - self::$meta_prefix . $key - ); - unset( $valid ); - } - elseif ( is_string( $field_def['default_value'] ) && $field_def['default_value'] !== '' ) { - $query[] = $wpdb->prepare( - '( meta_key = %s AND meta_value = %s )', - self::$meta_prefix . $key, - $field_def['default_value'] - ); - } - else { - $query[] = $wpdb->prepare( - "( meta_key = %s AND meta_value = '' )", - self::$meta_prefix . $key - ); - } - } - } - unset( $subset, $field_group, $key, $field_def ); - - $query = "SELECT meta_id FROM {$wpdb->postmeta} WHERE " . implode( ' OR ', $query ) . ';'; - $meta_ids = $wpdb->get_col( $query ); - - if ( is_array( $meta_ids ) && $meta_ids !== array() ) { - // WP native action. - do_action( 'delete_post_meta', $meta_ids, null, null, null ); - - $query = "DELETE FROM {$wpdb->postmeta} WHERE meta_id IN( " . implode( ',', $meta_ids ) . ' )'; - $count = $wpdb->query( $query ); - - if ( $count ) { - foreach ( $meta_ids as $object_id ) { - wp_cache_delete( $object_id, 'post_meta' ); - } - - // WP native action. - do_action( 'deleted_post_meta', $meta_ids, null, null, null ); - } - } - unset( $query, $meta_ids, $count, $object_id ); - - - /** - * Deal with the multiselect (meta-robots-adv) field - * - * Removes invalid option combinations, such as 'none,noarchive' - * - * Default values have already been removed, so we should have a small result set and - * (hopefully) even smaller set of invalid results. - */ - $query = $wpdb->prepare( - "SELECT meta_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key = %s", - self::$meta_prefix . 'meta-robots-adv' - ); - $oldies = $wpdb->get_results( $query ); - - if ( is_array( $oldies ) && $oldies !== array() ) { - foreach ( $oldies as $old ) { - $clean = self::validate_meta_robots_adv( $old->meta_value ); - - if ( $clean !== $old->meta_value ) { - if ( $clean !== self::$meta_fields['advanced']['meta-robots-adv']['default_value'] ) { - update_metadata_by_mid( 'post', $old->meta_id, $clean ); - } - else { - delete_metadata_by_mid( 'post', $old->meta_id ); - } - } - } - } - unset( $query, $oldies, $old, $clean ); - - do_action( 'wpseo_meta_clean_up' ); - } - - - /** - * Recursively merge a variable number of arrays, using the left array as base, - * giving priority to the right array. - * - * Difference with native array_merge_recursive(): - * array_merge_recursive converts values with duplicate keys to arrays rather than - * overwriting the value in the first array with the duplicate value in the second array. - * - * array_merge_recursive_distinct does not change the data types of the values in the arrays. - * Matching keys' values in the second array overwrite those in the first array, as is the - * case with array_merge. - * - * Freely based on information found on http://www.php.net/manual/en/function.array-merge-recursive.php - * - * @internal Should be moved to a general utility class - * - * @return array - */ - public static function array_merge_recursive_distinct() { - - $arrays = func_get_args(); - if ( count( $arrays ) < 2 ) { - if ( $arrays === array() ) { - return array(); - } - else { - return $arrays[0]; - } - } - - $merged = array_shift( $arrays ); - - foreach ( $arrays as $array ) { - foreach ( $array as $key => $value ) { - if ( is_array( $value ) && ( isset( $merged[ $key ] ) && is_array( $merged[ $key ] ) ) ) { - $merged[ $key ] = self::array_merge_recursive_distinct( $merged[ $key ], $value ); - } - else { - $merged[ $key ] = $value; - } - } - unset( $key, $value ); - } - - return $merged; - } - - /** - * Get a value from $_POST for a given key - * Returns the $_POST value if exists, returns an empty string if key does not exist - * - * @static - * - * @param string $key Key of the value to get from $_POST. - * - * @return string Returns $_POST value, which will be a string the majority of the time - * Will return empty string if key does not exists in $_POST - */ - public static function get_post_value( $key ) { - return ( array_key_exists( $key, $_POST ) ) ? $_POST[ $key ] : ''; - } - - /** - * Counts the total of all the keywords being used for posts except the given one - * - * @param string $keyword The keyword to be counted. - * @param integer $post_id The is of the post to which the keyword belongs. - * - * @return array - */ - public static function keyword_usage( $keyword, $post_id ) { - - if ( empty( $keyword ) ) { - return array(); - } - - $get_posts = new WP_Query( - array( - 'meta_key' => '_yoast_wpseo_focuskw', - 'meta_value' => $keyword, - 'post__not_in' => array( $post_id ), - 'fields' => 'ids', - 'post_type' => 'any', - - /* - * We only need to return zero, one or two results: - * - Zero: keyword hasn't been used before - * - One: Keyword has been used once before - * - Two or more: Keyword has been used twice before - */ - 'posts_per_page' => 2, - ) - ); - - return $get_posts->posts; - } -} /* End of class */ diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-primary-term.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-primary-term.php deleted file mode 100644 index 24b46c2a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-primary-term.php +++ /dev/null @@ -1,74 +0,0 @@ -taxonomy_name = $taxonomy_name; - $this->post_ID = $post_id; - } - - /** - * Returns the primary term ID - * - * @return int|bool - */ - public function get_primary_term() { - $primary_term = get_post_meta( $this->post_ID, WPSEO_Meta::$meta_prefix . 'primary_' . $this->taxonomy_name, true ); - - $terms = $this->get_terms(); - - if ( ! in_array( $primary_term, wp_list_pluck( $terms, 'term_id' ) ) ) { - $primary_term = false; - } - - $primary_term = (int) $primary_term; - return ( $primary_term ) ? ( $primary_term ) : false; - } - - /** - * Sets the new primary term ID - * - * @param int $new_primary_term New primary term ID. - */ - public function set_primary_term( $new_primary_term ) { - update_post_meta( $this->post_ID, WPSEO_Meta::$meta_prefix . 'primary_' . $this->taxonomy_name, $new_primary_term ); - } - - /** - * Get the terms for the current post ID. - * When $terms is not an array, set $terms to an array. - * - * @return array - */ - protected function get_terms() { - $terms = get_the_terms( $this->post_ID, $this->taxonomy_name ); - - if ( ! is_array( $terms ) ) { - $terms = array(); - } - - return $terms; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-rank.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-rank.php deleted file mode 100644 index 99adb5ef..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-rank.php +++ /dev/null @@ -1,192 +0,0 @@ - array( - 'start' => 0, - 'end' => 0, - ), - self::BAD => array( - 'start' => 1, - 'end' => 40, - ), - self::OK => array( - 'start' => 41, - 'end' => 70, - ), - self::GOOD => array( - 'start' => 71, - 'end' => 100, - ), - ); - - /** - * @var int - */ - protected $rank; - - /** - * @param int $rank The actual rank. - */ - public function __construct( $rank ) { - if ( ! in_array( $rank, self::$ranks ) ) { - $rank = self::BAD; - } - - $this->rank = $rank; - } - - /** - * Returns the saved rank for this rank. - * - * @return string - */ - public function get_rank() { - return $this->rank; - } - - /** - * Returns a CSS class for this rank - * - * @return string - */ - public function get_css_class() { - $labels = array( - self::NO_FOCUS => 'na', - self::NO_INDEX => 'noindex', - self::BAD => 'bad', - self::OK => 'ok', - self::GOOD => 'good', - ); - - return $labels[ $this->rank ]; - } - - /** - * Returns a label for this rank - * - * @return string - */ - public function get_label() { - $labels = array( - self::NO_FOCUS => __( 'Not available', 'wordpress-seo' ), - self::NO_INDEX => __( 'No index', 'wordpress-seo' ), - self::BAD => __( 'Bad', 'wordpress-seo' ), - self::OK => __( 'OK', 'wordpress-seo' ), - self::GOOD => __( 'Good', 'wordpress-seo' ), - ); - - return $labels[ $this->rank ]; - } - - /** - * Returns a label for use in a drop down - * - * @return mixed - */ - public function get_drop_down_label() { - $labels = array( - self::NO_FOCUS => __( 'SEO: No Focus Keyword', 'wordpress-seo' ), - self::BAD => __( 'SEO: Bad', 'wordpress-seo' ), - self::OK => __( 'SEO: OK', 'wordpress-seo' ), - self::GOOD => __( 'SEO: Good', 'wordpress-seo' ), - self::NO_INDEX => __( 'SEO: Post Noindexed', 'wordpress-seo' ), - ); - - return $labels[ $this->rank ]; - } - - /** - * @return int The starting score for this rank. - */ - public function get_starting_score() { - // No index does not have a starting score. - if ( self::NO_INDEX === $this->rank ) { - return -1; - } - - return self::$ranges[ $this->rank ]['start']; - } - - /** - * @return int The end score for this rank. - */ - public function get_end_score() { - // No index does not have an end score. - if ( self::NO_INDEX === $this->rank ) { - return -1; - } - - return self::$ranges[ $this->rank ]['end']; - } - - /** - * Returns a rank for a specific numeric score - * - * @param int $score The score to determine a rank for. - * - * @return self - */ - public static function from_numeric_score( $score ) { - // Set up the default value. - $rank = new self( self::BAD ); - - foreach ( self::$ranges as $rank_index => $range ) { - if ( $range['start'] <= $score && $score <= $range['end'] ) { - $rank = new self( $rank_index ); - break; - } - } - - return $rank; - } - - /** - * Returns a list of all possible SEO Ranks - * - * @return WPSEO_Rank[] - */ - public static function get_all_ranks() { - return array_map( array( 'WPSEO_Rank', 'create_rank' ), self::$ranks ); - } - - /** - * Converts a numeric rank into a WPSEO_Rank object, for use in functional array_* functions - * - * @param string $rank SEO Rank. - * - * @return WPSEO_Rank - */ - private static function create_rank( $rank ) { - return new self( $rank ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-replace-vars.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-replace-vars.php deleted file mode 100644 index d45d4a87..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-replace-vars.php +++ /dev/null @@ -1,1226 +0,0 @@ - '', - 'name' => '', - 'post_author' => '', - 'post_content' => '', - 'post_date' => '', - 'post_excerpt' => '', - 'post_modified' => '', - 'post_title' => '', - 'taxonomy' => '', - 'term_id' => '', - 'term404' => '', - ); - - /** - * @var object Current post/page/cpt information - */ - protected $args; - - /** - * @var array Help texts for use in WPSEO -> Titles and Meta's help tabs - */ - protected static $help_texts = array(); - - /** - * @var array Register of additional variable replacements registered by other plugins/themes - */ - protected static $external_replacements = array(); - - - /** - * Constructor - * - * @return \WPSEO_Replace_Vars - */ - public function __construct() { - } - - - /** - * Setup the help texts and external replacements as statics so they will be available to all instances - */ - public static function setup_statics_once() { - if ( self::$help_texts === array() ) { - self::set_basic_help_texts(); - self::set_advanced_help_texts(); - } - - if ( self::$external_replacements === array() ) { - /** - * Action: 'wpseo_register_extra_replacements' - Allows for registration of additional - * variables to replace - */ - do_action( 'wpseo_register_extra_replacements' ); - } - } - - - /** - * Register new replacement %%variables%% - * For use by other plugins/themes to register extra variables - * - * @see wpseo_register_var_replacement() for a usage example - * - * @param string $var The name of the variable to replace, i.e. '%%var%%' - * - the surrounding %% are optional. - * @param mixed $replace_function Function or method to call to retrieve the replacement value for the variable - * Uses the same format as add_filter/add_action function parameter and - * should *return* the replacement value. DON'T echo it. - * @param string $type Type of variable: 'basic' or 'advanced', defaults to 'advanced'. - * @param string $help_text Help text to be added to the help tab for this variable. - * - * @return bool Whether the replacement function was succesfully registered - */ - public static function register_replacement( $var, $replace_function, $type = 'advanced', $help_text = '' ) { - $success = false; - - if ( is_string( $var ) && $var !== '' ) { - $var = self::remove_var_delimiter( $var ); - - if ( preg_match( '`^[A-Z0-9_-]+$`i', $var ) === false ) { - trigger_error( __( 'A replacement variable can only contain alphanumeric characters, an underscore or a dash. Try renaming your variable.', 'wordpress-seo' ), E_USER_WARNING ); - } - elseif ( strpos( $var, 'cf_' ) === 0 || strpos( $var, 'ct_' ) === 0 ) { - trigger_error( __( 'A replacement variable can not start with "%%cf_" or "%%ct_" as these are reserved for the WPSEO standard variable variables for custom fields and custom taxonomies. Try making your variable name unique.', 'wordpress-seo' ), E_USER_WARNING ); - } - elseif ( ! method_exists( __CLASS__, 'retrieve_' . $var ) ) { - if ( ! isset( self::$external_replacements[ $var ] ) ) { - self::$external_replacements[ $var ] = $replace_function; - self::register_help_text( $type, $var, $help_text ); - $success = true; - } - else { - trigger_error( __( 'A replacement variable with the same name has already been registered. Try making your variable name unique.', 'wordpress-seo' ), E_USER_WARNING ); - } - } - else { - trigger_error( __( 'You cannot overrule a WPSEO standard variable replacement by registering a variable with the same name. Use the "wpseo_replacements" filter instead to adjust the replacement value.', 'wordpress-seo' ), E_USER_WARNING ); - } - } - - return $success; - } - - - /** - * Replace `%%variable_placeholders%%` with their real value based on the current requested page/post/cpt/etc - * - * @param string $string the string to replace the variables in. - * @param array $args the object some of the replacement values might come from, - * could be a post, taxonomy or term. - * @param array $omit variables that should not be replaced by this function. - * - * @return string - */ - public function replace( $string, $args, $omit = array() ) { - - $string = strip_tags( $string ); - - // Let's see if we can bail super early. - if ( strpos( $string, '%%' ) === false ) { - return WPSEO_Utils::standardize_whitespace( $string ); - } - - $args = (array) $args; - if ( isset( $args['post_content'] ) && ! empty( $args['post_content'] ) ) { - $args['post_content'] = WPSEO_Utils::strip_shortcode( $args['post_content'] ); - } - if ( isset( $args['post_excerpt'] ) && ! empty( $args['post_excerpt'] ) ) { - $args['post_excerpt'] = WPSEO_Utils::strip_shortcode( $args['post_excerpt'] ); - } - $this->args = (object) wp_parse_args( $args, $this->defaults ); - - // Clean $omit array. - if ( is_array( $omit ) && $omit !== array() ) { - $omit = array_map( array( __CLASS__, 'remove_var_delimiter' ), $omit ); - } - - $replacements = array(); - if ( preg_match_all( '`%%([^%]+(%%single)?)%%?`iu', $string, $matches ) ) { - $replacements = $this->set_up_replacements( $matches, $omit ); - } - - /** - * Filter: 'wpseo_replacements' - Allow customization of the replacements before they are applied - * - * @api array $replacements The replacements - */ - $replacements = apply_filters( 'wpseo_replacements', $replacements ); - - // Do the actual replacements. - if ( is_array( $replacements ) && $replacements !== array() ) { - $string = str_replace( array_keys( $replacements ), array_values( $replacements ), $string ); - } - - /** - * Filter: 'wpseo_replacements_final' - Allow overruling of whether or not to remove placeholders - * which didn't yield a replacement - * - * @example add_filter( 'wpseo_replacements_final', '__return_false' ); - * - * @api bool $final - */ - if ( apply_filters( 'wpseo_replacements_final', true ) === true && ( isset( $matches[1] ) && is_array( $matches[1] ) ) ) { - // Remove non-replaced variables. - $remove = array_diff( $matches[1], $omit ); // Make sure the $omit variables do not get removed. - $remove = array_map( array( __CLASS__, 'add_var_delimiter' ), $remove ); - $string = str_replace( $remove, '', $string ); - } - - // Undouble separators which have nothing between them, i.e. where a non-replaced variable was removed. - if ( isset( $replacements['%%sep%%'] ) && ( is_string( $replacements['%%sep%%'] ) && $replacements['%%sep%%'] !== '' ) ) { - $q_sep = preg_quote( $replacements['%%sep%%'], '`' ); - $string = preg_replace( '`' . $q_sep . '(?:\s*' . $q_sep . ')*`u', $replacements['%%sep%%'], $string ); - } - - // Remove superfluous whitespace. - $string = WPSEO_Utils::standardize_whitespace( $string ); - - return trim( $string ); - } - - - /** - * Retrieve the replacements for the variables found. - * - * @param array $matches variables found in the original string - regex result. - * @param array $omit variables that should not be replaced by this function. - * - * @return array retrieved replacements - this might be a smaller array as some variables - * may not yield a replacement in certain contexts. - */ - private function set_up_replacements( $matches, $omit ) { - - $replacements = array(); - - // @todo -> figure out a way to deal with external functions starting with cf_/ct_. - foreach ( $matches[1] as $k => $var ) { - - // Don't set up replacements which should be omitted. - if ( in_array( $var, $omit, true ) ) { - continue; - } - - // Deal with variable variable names first. - if ( strpos( $var, 'cf_' ) === 0 ) { - $replacement = $this->retrieve_cf_custom_field_name( $var ); - } - elseif ( strpos( $var, 'ct_desc_' ) === 0 ) { - $replacement = $this->retrieve_ct_desc_custom_tax_name( $var ); - } - elseif ( strpos( $var, 'ct_' ) === 0 ) { - $single = ( isset( $matches[2][ $k ] ) && $matches[2][ $k ] !== '' ) ? true : false; - $replacement = $this->retrieve_ct_custom_tax_name( $var, $single ); - } // Deal with non-variable variable names. - elseif ( method_exists( $this, 'retrieve_' . $var ) ) { - $method_name = 'retrieve_' . $var; - $replacement = $this->$method_name(); - } // Deal with externally defined variable names. - elseif ( isset( self::$external_replacements[ $var ] ) && ! is_null( self::$external_replacements[ $var ] ) ) { - $replacement = call_user_func( self::$external_replacements[ $var ], $var, $this->args ); - } - - // Replacement retrievals can return null if no replacement can be determined, root those outs. - if ( isset( $replacement ) ) { - $var = self::add_var_delimiter( $var ); - $replacements[ $var ] = $replacement; - } - unset( $replacement, $single, $method_name ); - } - - return $replacements; - } - - - - /* *********************** BASIC VARIABLES ************************** */ - - /** - * Retrieve the post/cpt categories (comma separated) for use as replacement string. - * - * @return string|null - */ - private function retrieve_category() { - $replacement = null; - - if ( ! empty( $this->args->ID ) ) { - $cat = $this->get_terms( $this->args->ID, 'category' ); - if ( $cat !== '' ) { - $replacement = $cat; - } - } - - if ( ( ! isset( $replacement ) || $replacement === '' ) && ( isset( $this->args->cat_name ) && ! empty( $this->args->cat_name ) ) ) { - $replacement = $this->args->cat_name; - } - - return $replacement; - } - - /** - * Retrieve the category description for use as replacement string. - * - * @return string|null - */ - private function retrieve_category_description() { - return $this->retrieve_term_description(); - } - - /** - * Retrieve the date of the post/page/cpt for use as replacement string. - * - * @return string|null - */ - private function retrieve_date() { - $replacement = null; - - if ( $this->args->post_date !== '' ) { - $replacement = mysql2date( get_option( 'date_format' ), $this->args->post_date, true ); - } - else { - if ( get_query_var( 'day' ) && get_query_var( 'day' ) !== '' ) { - $replacement = get_the_date(); - } - else { - if ( single_month_title( ' ', false ) && single_month_title( ' ', false ) !== '' ) { - $replacement = single_month_title( ' ', false ); - } - elseif ( get_query_var( 'year' ) !== '' ) { - $replacement = get_query_var( 'year' ); - } - } - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt excerpt for use as replacement string. - * The excerpt will be auto-generated if it does not exist. - * - * @return string|null - */ - private function retrieve_excerpt() { - $replacement = null; - - if ( ! empty( $this->args->ID ) ) { - if ( $this->args->post_excerpt !== '' ) { - $replacement = strip_tags( $this->args->post_excerpt ); - } - elseif ( $this->args->post_content !== '' ) { - $replacement = wp_html_excerpt( strip_shortcodes( $this->args->post_content ), 155 ); - } - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt excerpt for use as replacement string (without auto-generation). - * - * @return string|null - */ - private function retrieve_excerpt_only() { - $replacement = null; - - if ( ! empty( $this->args->ID ) && $this->args->post_excerpt !== '' ) { - $replacement = strip_tags( $this->args->post_excerpt ); - } - - return $replacement; - } - - /** - * Retrieve the title of the parent page of the current page/cpt for use as replacement string. - * Only applicable for hierarchical post types. - * - * @todo - check: shouldn't this use $this->args as well ? - * - * @return string|null - */ - private function retrieve_parent_title() { - $replacement = null; - - if ( ! isset( $replacement ) && ( ( is_singular() || is_admin() ) && isset( $GLOBALS['post'] ) ) ) { - if ( isset( $GLOBALS['post']->post_parent ) && 0 !== $GLOBALS['post']->post_parent ) { - $replacement = get_the_title( $GLOBALS['post']->post_parent ); - } - } - - return $replacement; - } - - /** - * Retrieve the current search phrase for use as replacement string. - * - * @return string|null - */ - private function retrieve_searchphrase() { - $replacement = null; - - if ( ! isset( $replacement ) ) { - $search = get_query_var( 's' ); - if ( $search !== '' ) { - $replacement = esc_html( $search ); - } - } - - return $replacement; - } - - /** - * Retrieve the separator for use as replacement string. - * - * @return string - */ - private function retrieve_sep() { - return WPSEO_Utils::get_title_separator(); - } - - /** - * Retrieve the site's tag line / description for use as replacement string. - * - * @return string|null - */ - private function retrieve_sitedesc() { - static $replacement; - - if ( ! isset( $replacement ) ) { - $description = trim( strip_tags( get_bloginfo( 'description' ) ) ); - if ( $description !== '' ) { - $replacement = $description; - } - } - - return $replacement; - } - - - /** - * Retrieve the site's name for use as replacement string. - * - * @return string|null - */ - private function retrieve_sitename() { - static $replacement; - - if ( ! isset( $replacement ) ) { - $sitename = WPSEO_Utils::get_site_name(); - if ( $sitename !== '' ) { - $replacement = $sitename; - } - } - - return $replacement; - } - - /** - * Retrieve the current tag/tags for use as replacement string. - * - * @return string|null - */ - private function retrieve_tag() { - $replacement = null; - - if ( isset( $this->args->ID ) ) { - $tags = $this->get_terms( $this->args->ID, 'post_tag' ); - if ( $tags !== '' ) { - $replacement = $tags; - } - } - - return $replacement; - } - - /** - * Retrieve the tag description for use as replacement string. - * - * @return string|null - */ - private function retrieve_tag_description() { - return $this->retrieve_term_description(); - } - - /** - * Retrieve the term description for use as replacement string. - * - * @return string|null - */ - private function retrieve_term_description() { - $replacement = null; - - if ( isset( $this->args->term_id ) && ! empty( $this->args->taxonomy ) ) { - $term_desc = get_term_field( 'description', $this->args->term_id, $this->args->taxonomy ); - if ( $term_desc !== '' ) { - $replacement = trim( strip_tags( $term_desc ) ); - } - } - - return $replacement; - } - - /** - * Retrieve the term name for use as replacement string. - * - * @return string|null - */ - private function retrieve_term_title() { - $replacement = null; - - if ( ! empty( $this->args->taxonomy ) && ! empty( $this->args->name ) ) { - $replacement = $this->args->name; - } - - return $replacement; - } - - /** - * Retrieve the title of the post/page/cpt for use as replacement string. - * - * @return string|null - */ - private function retrieve_title() { - $replacement = null; - - if ( is_string( $this->args->post_title ) && $this->args->post_title !== '' ) { - $replacement = stripslashes( $this->args->post_title ); - } - - return $replacement; - } - - /** - * Retrieve primary category for use as replacement string. - * - * @return bool|int|null - */ - private function retrieve_primary_category() { - $primary_category = null; - - if ( ! empty( $this->args->ID ) ) { - $wpseo_primary_category = new WPSEO_Primary_Term( 'category', $this->args->ID ); - - $term_id = $wpseo_primary_category->get_primary_term(); - $term = get_term( $term_id ); - - if ( ! is_wp_error( $term ) && ! empty( $term ) ) { - $primary_category = $term->name; - } - } - - return $primary_category; - } - - - /* *********************** ADVANCED VARIABLES ************************** */ - - /** - * Determine the page numbering of the current post/page/cpt - * - * @param string $request 'nr'|'max' - whether to return the page number or the max number of pages. - * - * @return int|null - */ - private function determine_pagenumbering( $request = 'nr' ) { - global $wp_query, $post; - $max_num_pages = null; - $page_number = null; - - $max_num_pages = 1; - - if ( ! is_singular() ) { - $page_number = get_query_var( 'paged' ); - if ( $page_number === 0 || $page_number === '' ) { - $page_number = 1; - } - - if ( isset( $wp_query->max_num_pages ) && ( $wp_query->max_num_pages != '' && $wp_query->max_num_pages != 0 ) ) { - $max_num_pages = $wp_query->max_num_pages; - } - } - else { - $page_number = get_query_var( 'page' ); - if ( $page_number === 0 || $page_number === '' ) { - $page_number = 1; - } - - if ( isset( $post->post_content ) ) { - $max_num_pages = ( substr_count( $post->post_content, '' ) + 1 ); - } - } - - $return = null; - - switch ( $request ) { - case 'nr': - $return = $page_number; - break; - case 'max': - $return = $max_num_pages; - break; - } - - return $return; - } - - - /** - * Determine the post type names for the current post/page/cpt - * - * @param string $request 'single'|'plural' - whether to return the single or plural form. - * - * @return string|null - */ - private function determine_pt_names( $request = 'single' ) { - global $wp_query; - $pt_single = null; - $pt_plural = null; - - if ( isset( $wp_query->query_vars['post_type'] ) && ( ( is_string( $wp_query->query_vars['post_type'] ) && $wp_query->query_vars['post_type'] !== '' ) || ( is_array( $wp_query->query_vars['post_type'] ) && $wp_query->query_vars['post_type'] !== array() ) ) ) { - $post_type = $wp_query->query_vars['post_type']; - } - elseif ( isset( $this->args->post_type ) && ( is_string( $this->args->post_type ) && $this->args->post_type !== '' ) ) { - $post_type = $this->args->post_type; - } - else { - // Make it work in preview mode. - $post_type = $wp_query->get_queried_object()->post_type; - } - - if ( is_array( $post_type ) ) { - $post_type = reset( $post_type ); - } - - if ( $post_type !== '' ) { - $pt = get_post_type_object( $post_type ); - $pt_plural = $pt_single = $pt->name; - if ( isset( $pt->labels->singular_name ) ) { - $pt_single = $pt->labels->singular_name; - } - if ( isset( $pt->labels->name ) ) { - $pt_plural = $pt->labels->name; - } - } - - $return = null; - - switch ( $request ) { - case 'single': - $return = $pt_single; - break; - case 'plural': - $return = $pt_plural; - break; - } - - return $return; - } - - /** - * Retrieve the attachment caption for use as replacement string. - * - * @return string|null - */ - private function retrieve_caption() { - return $this->retrieve_excerpt_only(); - } - - - /** - * Retrieve a post/page/cpt's custom field value for use as replacement string - * - * @param string $var The complete variable to replace which includes the name of - * the custom field which value is to be retrieved. - * - * @return string|null - */ - private function retrieve_cf_custom_field_name( $var ) { - global $post; - $replacement = null; - - if ( is_string( $var ) && $var !== '' ) { - $field = substr( $var, 3 ); - if ( ( is_singular() || is_admin() ) && ( is_object( $post ) && isset( $post->ID ) ) ) { - $name = get_post_meta( $post->ID, $field, true ); - if ( $name !== '' ) { - $replacement = $name; - } - } - } - - return $replacement; - } - - - /** - * Retrieve a post/page/cpt's custom taxonomies for use as replacement string - * - * @param string $var The complete variable to replace which includes the name of - * the custom taxonomy which value(s) is to be retrieved. - * @param bool $single Whether to retrieve only the first or all values for the taxonomy. - * - * @return string|null - */ - private function retrieve_ct_custom_tax_name( $var, $single = false ) { - $replacement = null; - - if ( ( is_string( $var ) && $var !== '' ) && ! empty( $this->args->ID ) ) { - $tax = substr( $var, 3 ); - $name = $this->get_terms( $this->args->ID, $tax, $single ); - if ( $name !== '' ) { - $replacement = $name; - } - } - - return $replacement; - } - - - /** - * Retrieve a post/page/cpt's custom taxonomies description for use as replacement string - * - * @param string $var The complete variable to replace which includes the name of - * the custom taxonomy which description is to be retrieved. - * - * @return string|null - */ - private function retrieve_ct_desc_custom_tax_name( $var ) { - global $post; - $replacement = null; - - if ( is_string( $var ) && $var !== '' ) { - $tax = substr( $var, 8 ); - if ( is_object( $post ) && isset( $post->ID ) ) { - $terms = get_the_terms( $post->ID, $tax ); - if ( is_array( $terms ) && $terms !== array() ) { - $term = current( $terms ); - $term_desc = get_term_field( 'description', $term->term_id, $tax ); - if ( $term_desc !== '' ) { - $replacement = trim( strip_tags( $term_desc ) ); - } - } - } - } - - return $replacement; - } - - /** - * Retrieve the current date for use as replacement string. - * - * @return string - */ - private function retrieve_currentdate() { - static $replacement; - - if ( ! isset( $replacement ) ) { - $replacement = date_i18n( get_option( 'date_format' ) ); - } - - return $replacement; - } - - /** - * Retrieve the current day for use as replacement string. - * - * @return string - */ - private function retrieve_currentday() { - static $replacement; - - if ( ! isset( $replacement ) ) { - $replacement = date_i18n( 'j' ); - } - - return $replacement; - } - - /** - * Retrieve the current month for use as replacement string. - * - * @return string - */ - private function retrieve_currentmonth() { - static $replacement; - - if ( ! isset( $replacement ) ) { - $replacement = date_i18n( 'F' ); - } - - return $replacement; - } - - /** - * Retrieve the current time for use as replacement string. - * - * @return string - */ - private function retrieve_currenttime() { - static $replacement; - - if ( ! isset( $replacement ) ) { - $replacement = date_i18n( get_option( 'time_format' ) ); - } - - return $replacement; - } - - /** - * Retrieve the current year for use as replacement string. - * - * @return string - */ - private function retrieve_currentyear() { - static $replacement; - - if ( ! isset( $replacement ) ) { - $replacement = date_i18n( 'Y' ); - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt's focus keyword for use as replacement string. - * - * @return string|null - */ - private function retrieve_focuskw() { - $replacement = null; - - if ( ! empty( $this->args->ID ) ) { - $focus_kw = WPSEO_Meta::get_value( 'focuskw', $this->args->ID ); - if ( $focus_kw !== '' ) { - $replacement = $focus_kw; - } - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt ID for use as replacement string. - * - * @return string|null - */ - private function retrieve_id() { - $replacement = null; - - if ( ! empty( $this->args->ID ) ) { - $replacement = $this->args->ID; - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt modified time for use as replacement string. - * - * @return string|null - */ - private function retrieve_modified() { - $replacement = null; - - if ( ! empty( $this->args->post_modified ) ) { - $replacement = mysql2date( get_option( 'date_format' ), $this->args->post_modified, true ); - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt author's "nice name" for use as replacement string. - * - * @return string|null - */ - private function retrieve_name() { - $replacement = null; - - $user_id = $this->retrieve_userid(); - $name = get_the_author_meta( 'display_name', $user_id ); - if ( $name !== '' ) { - $replacement = $name; - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt author's users description for use as a replacement string. - * - * @return null|string - */ - private function retrieve_user_description() { - $replacement = null; - - $user_id = $this->retrieve_userid(); - $description = get_the_author_meta( 'description', $user_id ); - if ( $description != '' ) { - $replacement = $description; - } - - return $replacement; - } - - /** - * Retrieve the current page number with context (i.e. 'page 2 of 4') for use as replacement string. - * - * @return string - */ - private function retrieve_page() { - $replacement = null; - - $max = $this->determine_pagenumbering( 'max' ); - $nr = $this->determine_pagenumbering( 'nr' ); - $sep = $this->retrieve_sep(); - - if ( $max > 1 && $nr > 1 ) { - $replacement = sprintf( $sep . ' ' . __( 'Page %1$d of %2$d', 'wordpress-seo' ), $nr, $max ); - } - - return $replacement; - } - - /** - * Retrieve the current page number for use as replacement string. - * - * @return string|null - */ - private function retrieve_pagenumber() { - $replacement = null; - - $nr = $this->determine_pagenumbering( 'nr' ); - if ( isset( $nr ) && $nr > 0 ) { - $replacement = (string) $nr; - } - - return $replacement; - } - - /** - * Retrieve the current page total for use as replacement string. - * - * @return string|null - */ - private function retrieve_pagetotal() { - $replacement = null; - - $max = $this->determine_pagenumbering( 'max' ); - if ( isset( $max ) && $max > 0 ) { - $replacement = (string) $max; - } - - return $replacement; - } - - /** - * Retrieve the post type plural label for use as replacement string. - * - * @return string|null - */ - private function retrieve_pt_plural() { - $replacement = null; - - $name = $this->determine_pt_names( 'plural' ); - if ( isset( $name ) && $name !== '' ) { - $replacement = $name; - } - - return $replacement; - } - - /** - * Retrieve the post type single label for use as replacement string. - * - * @return string|null - */ - private function retrieve_pt_single() { - $replacement = null; - - $name = $this->determine_pt_names( 'single' ); - if ( isset( $name ) && $name !== '' ) { - $replacement = $name; - } - - return $replacement; - } - - /** - * Retrieve the slug which caused the 404 for use as replacement string. - * - * @return string|null - */ - private function retrieve_term404() { - $replacement = null; - - if ( $this->args->term404 !== '' ) { - $replacement = sanitize_text_field( str_replace( '-', ' ', $this->args->term404 ) ); - } - else { - $error_request = get_query_var( 'pagename' ); - if ( $error_request !== '' ) { - $replacement = sanitize_text_field( str_replace( '-', ' ', $error_request ) ); - } - else { - $error_request = get_query_var( 'name' ); - if ( $error_request !== '' ) { - $replacement = sanitize_text_field( str_replace( '-', ' ', $error_request ) ); - } - } - } - - return $replacement; - } - - /** - * Retrieve the post/page/cpt author's user id for use as replacement string. - * - * @return string - */ - private function retrieve_userid() { - $replacement = ! empty( $this->args->post_author ) ? $this->args->post_author : get_query_var( 'author' ); - - return $replacement; - } - - - - /* *********************** HELP TEXT RELATED ************************** */ - - /** - * Create a variable help text table - * - * @param string $type Either 'basic' or 'advanced'. - * - * @return string Help text table - */ - private static function create_variable_help_table( $type ) { - if ( ! in_array( $type, array( 'basic', 'advanced' ), true ) ) { - return ''; - } - - $table = ' - - - - - - - - '; - - foreach ( self::$help_texts[ $type ] as $replace => $help_text ) { - $table .= ' - - - - '; - } - - $table .= ' - -
    ' . esc_html__( 'Variable', 'wordpress-seo' ) . '' . esc_html__( 'Description', 'wordpress-seo' ) . '
    %%' . esc_html( $replace ) . '%%' . $help_text . '
    '; - - return $table; - } - - /** - * Create the help text table for the basic variables for use in a help tab - * - * @return string - */ - public static function get_basic_help_texts() { - return self::create_variable_help_table( 'basic' ); - } - - - /** - * Create the help text table for the advanced variables for use in a help tab - * - * @return string - */ - public static function get_advanced_help_texts() { - return self::create_variable_help_table( 'advanced' ); - } - - - /** - * Set the help text for a user/plugin/theme defined extra variable. - * - * @param string $type Type of variable: 'basic' or 'advanced'. - * @param string $replace Variable to replace, i.e. '%%var%%'. - * @param string $help_text The actual help text string. - */ - private static function register_help_text( $type, $replace, $help_text = '' ) { - if ( is_string( $replace ) && $replace !== '' ) { - $replace = self::remove_var_delimiter( $replace ); - - if ( ( is_string( $type ) && in_array( $type, array( - 'basic', - 'advanced', - ), true ) ) && ( $replace !== '' && ! isset( self::$help_texts[ $type ][ $replace ] ) ) - ) { - self::$help_texts[ $type ][ $replace ] = $help_text; - } - } - } - - - /** - * Set/translate the help texts for the WPSEO standard basic variables. - */ - private static function set_basic_help_texts() { - self::$help_texts['basic'] = array( - 'date' => __( 'Replaced with the date of the post/page', 'wordpress-seo' ), - 'title' => __( 'Replaced with the title of the post/page', 'wordpress-seo' ), - 'parent_title' => __( 'Replaced with the title of the parent page of the current page', 'wordpress-seo' ), - 'sitename' => __( 'The site\'s name', 'wordpress-seo' ), - 'sitedesc' => __( 'The site\'s tag line / description', 'wordpress-seo' ), - 'excerpt' => __( 'Replaced with the post/page excerpt (or auto-generated if it does not exist)', 'wordpress-seo' ), - 'excerpt_only' => __( 'Replaced with the post/page excerpt (without auto-generation)', 'wordpress-seo' ), - 'tag' => __( 'Replaced with the current tag/tags', 'wordpress-seo' ), - 'category' => __( 'Replaced with the post categories (comma separated)', 'wordpress-seo' ), - 'primary_category' => __( 'Replaced with the primary category of the post/page', 'wordpress-seo' ), - 'category_description' => __( 'Replaced with the category description', 'wordpress-seo' ), - 'tag_description' => __( 'Replaced with the tag description', 'wordpress-seo' ), - 'term_description' => __( 'Replaced with the term description', 'wordpress-seo' ), - 'term_title' => __( 'Replaced with the term name', 'wordpress-seo' ), - 'searchphrase' => __( 'Replaced with the current search phrase', 'wordpress-seo' ), - 'sep' => sprintf( - /* translators: %s: wp_title() function */ - __( 'The separator defined in your theme\'s %s tag.', 'wordpress-seo' ), - 'wp_title()' - ), - ); - } - - /** - * Set/translate the help texts for the WPSEO standard advanced variables. - */ - private static function set_advanced_help_texts() { - self::$help_texts['advanced'] = array( - 'pt_single' => __( 'Replaced with the post type single label', 'wordpress-seo' ), - 'pt_plural' => __( 'Replaced with the post type plural label', 'wordpress-seo' ), - 'modified' => __( 'Replaced with the post/page modified time', 'wordpress-seo' ), - 'id' => __( 'Replaced with the post/page ID', 'wordpress-seo' ), - 'name' => __( 'Replaced with the post/page author\'s \'nicename\'', 'wordpress-seo' ), - 'user_description' => __( 'Replaced with the post/page author\'s \'Biographical Info\'', 'wordpress-seo' ), - 'userid' => __( 'Replaced with the post/page author\'s userid', 'wordpress-seo' ), - 'currenttime' => __( 'Replaced with the current time', 'wordpress-seo' ), - 'currentdate' => __( 'Replaced with the current date', 'wordpress-seo' ), - 'currentday' => __( 'Replaced with the current day', 'wordpress-seo' ), - 'currentmonth' => __( 'Replaced with the current month', 'wordpress-seo' ), - 'currentyear' => __( 'Replaced with the current year', 'wordpress-seo' ), - 'page' => __( 'Replaced with the current page number with context (i.e. page 2 of 4)', 'wordpress-seo' ), - 'pagetotal' => __( 'Replaced with the current page total', 'wordpress-seo' ), - 'pagenumber' => __( 'Replaced with the current page number', 'wordpress-seo' ), - 'caption' => __( 'Attachment caption', 'wordpress-seo' ), - 'focuskw' => __( 'Replaced with the posts focus keyword', 'wordpress-seo' ), - 'term404' => __( 'Replaced with the slug which caused the 404', 'wordpress-seo' ), - 'cf_' => __( 'Replaced with a posts custom field value', 'wordpress-seo' ), - 'ct_' => __( 'Replaced with a posts custom taxonomies, comma separated.', 'wordpress-seo' ), - 'ct_desc_' => __( 'Replaced with a custom taxonomies description', 'wordpress-seo' ), - ); - } - - - - - /* *********************** GENERAL HELPER METHODS ************************** */ - - /** - * Remove the '%%' delimiters from a variable string - * - * @param string $string Variable string to be cleaned. - * - * @return string - */ - private static function remove_var_delimiter( $string ) { - return trim( $string, '%' ); - } - - /** - * Add the '%%' delimiters to a variable string - * - * @param string $string Variable string to be delimited. - * - * @return string - */ - private static function add_var_delimiter( $string ) { - return '%%' . $string . '%%'; - } - - /** - * Retrieve a post's terms, comma delimited. - * - * @param int $id ID of the post to get the terms for. - * @param string $taxonomy The taxonomy to get the terms for this post from. - * @param bool $return_single If true, return the first term. - * - * @return string either a single term or a comma delimited string of terms. - */ - public function get_terms( $id, $taxonomy, $return_single = false ) { - - $output = ''; - - // If we're on a specific tag, category or taxonomy page, use that. - if ( is_category() || is_tag() || is_tax() ) { - $term = $GLOBALS['wp_query']->get_queried_object(); - $output = $term->name; - } - elseif ( ! empty( $id ) && ! empty( $taxonomy ) ) { - $terms = get_the_terms( $id, $taxonomy ); - if ( is_array( $terms ) && $terms !== array() ) { - foreach ( $terms as $term ) { - if ( $return_single ) { - $output = $term->name; - break; - } - else { - $output .= $term->name . ', '; - } - } - $output = rtrim( trim( $output ), ',' ); - } - } - unset( $terms, $term ); - - /** - * Allows filtering of the terms list used to replace %%category%%, %%tag%% and %%ct_%% variables - * - * @api string $output Comma-delimited string containing the terms - */ - return apply_filters( 'wpseo_terms', $output ); - } -} /* End of class WPSEO_Replace_Vars */ - - -/** - * Setup the class statics when the file is first loaded - */ -WPSEO_Replace_Vars::setup_statics_once(); diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-shortlinker.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-shortlinker.php deleted file mode 100644 index 74a016df..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-shortlinker.php +++ /dev/null @@ -1,59 +0,0 @@ -version = $version; - } - - /** - * Builds a URL to use in the plugin as shortlink. - * - * @param string $url The URL to build upon. - * - * @return string The final URL. - */ - public function build_shortlink( $url ) { - return $url . '?utm_content=' . $this->version; - } - - /** - * Returns a version of the URL with a utm_content with the current version. - * - * @param string $url The URL to build upon. - * - * @return string The final URL. - */ - public static function get( $url ) { - $version = WPSEO_VERSION; - - $version = apply_filters( 'wpseo_shortlink_version', $version ); - - $shortlinker = new WPSEO_Shortlinker( $version ); - - return $shortlinker->build_shortlink( $url ); - } - - /** - * Echoes a version of the URL with a utm_content with the current version. - * - * @param string $url The URL to build upon. - */ - public static function show( $url ) { - echo esc_url( self::get( $url ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-statistics.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-statistics.php deleted file mode 100644 index ab4050ca..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-statistics.php +++ /dev/null @@ -1,142 +0,0 @@ -get_rank() ) { - $posts = array( - 'meta_query' => array( - 'relation' => 'OR', - array( - 'key' => WPSEO_Meta::$meta_prefix . 'focuskw', - 'value' => 'needs-a-value-anyway', - 'compare' => 'NOT EXISTS', - ) - ), - ); - } - elseif ( WPSEO_Rank::NO_INDEX === $rank->get_rank() ) { - $posts = array( - 'meta_key' => WPSEO_Meta::$meta_prefix . 'meta-robots-noindex', - 'meta_value' => '1', - 'compare' => '=', - ); - } - else { - $posts = array( - 'meta_key' => WPSEO_Meta::$meta_prefix . 'linkdex', - 'meta_value' => array( $rank->get_starting_score(), $rank->get_end_score() ), - 'meta_compare' => 'BETWEEN', - 'meta_type' => 'NUMERIC', - ); - } - - $posts['fields'] = 'ids'; - $posts['post_status'] = 'publish'; - - if ( current_user_can( 'edit_others_posts' ) === false ) { - $posts['author'] = get_current_user_id(); - } - - $posts = new WP_Query( $posts ); - - return $posts->found_posts; - } - - /********************** DEPRECATED METHODS **********************/ - - // @codeCoverageIgnoreStart - /** - * Returns the amount of posts that have no focus keyword - * - * @deprecated 3.0 - * - * @return int - */ - public function get_no_focus_post_count() { - _deprecated_function( __METHOD__, 'WPSEO 3.0', 'WPSEO_Statistics::get_post_count' ); - - return $this->get_post_count( new WPSEO_Rank( WPSEO_Rank::NO_FOCUS ) ); - } - - /** - * Returns the amount of posts that have a bad SEO ranking - * - * @deprecated 3.0 - * - * @return int - */ - public function get_bad_seo_post_count() { - _deprecated_function( __METHOD__, 'WPSEO 3.0', 'WPSEO_Statistics::get_post_count' ); - - return $this->get_post_count( new WPSEO_Rank( WPSEO_Rank::BAD ) ); - } - - /** - * Returns the amount of posts that have a poor SEO ranking - * - * @deprecated 3.0 - * - * @return int - */ - public function get_poor_seo_post_count() { - _deprecated_function( __METHOD__, 'WPSEO 3.0', 'WPSEO_Statistics::get_post_count' ); - - return $this->get_post_count( new WPSEO_Rank( 'poor' ) ); - } - - /** - * Returns the amount of posts that have an ok SEO ranking - * - * @deprecated 3.0 - * - * @return int - */ - public function get_ok_seo_post_count() { - _deprecated_function( __METHOD__, 'WPSEO 3.0', 'WPSEO_Statistics::get_post_count' ); - - return $this->get_post_count( new WPSEO_Rank( WPSEO_Rank::OK ) ); - } - - /** - * Returns the amount of posts that have a good SEO ranking - * - * @deprecated 3.0 - * - * @return int - */ - public function get_good_seo_post_count() { - _deprecated_function( __METHOD__, 'WPSEO 3.0', 'WPSEO_Statistics::get_post_count' ); - - return $this->get_post_count( new WPSEO_Rank( WPSEO_Rank::GOOD ) ); - } - - /** - * Returns the amount of posts that have no SEO ranking - * - * @deprecated 3.0 - * - * @return int - */ - public function get_no_index_post_count() { - _deprecated_function( __METHOD__, 'WPSEO 3.0', 'WPSEO_Statistics::get_post_count' ); - - return $this->get_post_count( new WPSEO_Rank( WPSEO_Rank::NO_INDEX ) ); - } - // @codeCoverageIgnoreEnd -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-utils.php b/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-utils.php deleted file mode 100644 index e1e64d5b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/class-wpseo-utils.php +++ /dev/null @@ -1,1070 +0,0 @@ -get_names(); - - return $roles; - } - - /** - * Standardize whitespace in a string - * - * Replace line breaks, carriage returns, tabs with a space, then remove double spaces. - * - * @since 1.8.0 - * - * @param string $string String input to standardize. - * - * @return string - */ - public static function standardize_whitespace( $string ) { - return trim( str_replace( ' ', ' ', str_replace( array( "\t", "\n", "\r", "\f" ), ' ', $string ) ) ); - } - - /** - * First strip out registered and enclosing shortcodes using native WordPress strip_shortcodes function. - * Then strip out the shortcodes with a filthy regex, because people don't properly register their shortcodes. - * - * @static - * - * @since 1.8.0 - * - * @param string $text Input string that might contain shortcodes. - * - * @return string $text string without shortcodes - */ - public static function strip_shortcode( $text ) { - return preg_replace( '`\[[^\]]+\]`s', '', strip_shortcodes( $text ) ); - } - - /** - * Recursively trim whitespace round a string value or of string values within an array - * Only trims strings to avoid typecasting a variable (to string) - * - * @static - * - * @since 1.8.0 - * - * @param mixed $value Value to trim or array of values to trim. - * - * @return mixed Trimmed value or array of trimmed values - */ - public static function trim_recursive( $value ) { - if ( is_string( $value ) ) { - $value = trim( $value ); - } - elseif ( is_array( $value ) ) { - $value = array_map( array( __CLASS__, 'trim_recursive' ), $value ); - } - - return $value; - } - - /** - * Translates a decimal analysis score into a textual one. - * - * @static - * - * @since 1.8.0 - * - * @param int $val The decimal score to translate. - * @param bool $css_value Whether to return the i18n translated score or the CSS class value. - * - * @return string - */ - public static function translate_score( $val, $css_value = true ) { - $seo_rank = WPSEO_Rank::from_numeric_score( $val ); - - if ( $css_value ) { - return $seo_rank->get_css_class(); - } - - return $seo_rank->get_label(); - } - - /** - * Emulate the WP native sanitize_text_field function in a %%variable%% safe way - * - * @see https://core.trac.wordpress.org/browser/trunk/src/wp-includes/formatting.php for the original - * - * Sanitize a string from user input or from the db - * - * check for invalid UTF-8, - * Convert single < characters to entity, - * strip all tags, - * remove line breaks, tabs and extra white space, - * strip octets - BUT DO NOT REMOVE (part of) VARIABLES WHICH WILL BE REPLACED. - * - * @static - * - * @since 1.8.0 - * - * @param string $value String value to sanitize. - * - * @return string - */ - public static function sanitize_text_field( $value ) { - $filtered = wp_check_invalid_utf8( $value ); - - if ( strpos( $filtered, '<' ) !== false ) { - $filtered = wp_pre_kses_less_than( $filtered ); - // This will strip extra whitespace for us. - $filtered = wp_strip_all_tags( $filtered, true ); - } - else { - $filtered = trim( preg_replace( '`[\r\n\t ]+`', ' ', $filtered ) ); - } - - $found = false; - while ( preg_match( '`[^%](%[a-f0-9]{2})`i', $filtered, $match ) ) { - $filtered = str_replace( $match[1], '', $filtered ); - $found = true; - } - unset( $match ); - - if ( $found ) { - // Strip out the whitespace that may now exist after removing the octets. - $filtered = trim( preg_replace( '` +`', ' ', $filtered ) ); - } - - /** - * Filter a sanitized text field string. - * - * @since WP 2.9.0 - * - * @param string $filtered The sanitized string. - * @param string $str The string prior to being sanitized. - */ - - return apply_filters( 'sanitize_text_field', $filtered, $value ); - } - - /** - * Sanitize a url for saving to the database - * Not to be confused with the old native WP function - * - * @todo [JRF => whomever] check/improve url verification - * - * @since 1.8.0 - * - * @param string $value String URL value to sanitize. - * @param array $allowed_protocols Optional set of allowed protocols. - * - * @return string - */ - public static function sanitize_url( $value, $allowed_protocols = array( 'http', 'https' ) ) { - return esc_url_raw( sanitize_text_field( rawurldecode( $value ) ), $allowed_protocols ); - } - - /** - * Validate a value as boolean - * - * @static - * - * @since 1.8.0 - * - * @param mixed $value Value to validate. - * - * @return bool - */ - public static function validate_bool( $value ) { - if ( ! isset( self::$has_filters ) ) { - self::$has_filters = extension_loaded( 'filter' ); - } - - if ( self::$has_filters ) { - return filter_var( $value, FILTER_VALIDATE_BOOLEAN ); - } - else { - return self::emulate_filter_bool( $value ); - } - } - - /** - * Cast a value to bool - * - * @static - * - * @since 1.8.0 - * - * @param mixed $value Value to cast. - * - * @return bool - */ - public static function emulate_filter_bool( $value ) { - $true = array( - '1', - 'true', - 'True', - 'TRUE', - 'y', - 'Y', - 'yes', - 'Yes', - 'YES', - 'on', - 'On', - 'ON', - - ); - $false = array( - '0', - 'false', - 'False', - 'FALSE', - 'n', - 'N', - 'no', - 'No', - 'NO', - 'off', - 'Off', - 'OFF', - ); - - if ( is_bool( $value ) ) { - return $value; - } - else if ( is_int( $value ) && ( $value === 0 || $value === 1 ) ) { - return (bool) $value; - } - else if ( ( is_float( $value ) && ! is_nan( $value ) ) && ( $value === (float) 0 || $value === (float) 1 ) ) { - return (bool) $value; - } - else if ( is_string( $value ) ) { - $value = trim( $value ); - if ( in_array( $value, $true, true ) ) { - return true; - } - else if ( in_array( $value, $false, true ) ) { - return false; - } - else { - return false; - } - } - - return false; - } - - /** - * Validate a value as integer - * - * @static - * - * @since 1.8.0 - * - * @param mixed $value Value to validate. - * - * @return int|bool int or false in case of failure to convert to int - */ - public static function validate_int( $value ) { - if ( ! isset( self::$has_filters ) ) { - self::$has_filters = extension_loaded( 'filter' ); - } - - if ( self::$has_filters ) { - return filter_var( $value, FILTER_VALIDATE_INT ); - } - else { - return self::emulate_filter_int( $value ); - } - } - - /** - * Cast a value to integer - * - * @static - * - * @since 1.8.0 - * - * @param mixed $value Value to cast. - * - * @return int|bool - */ - public static function emulate_filter_int( $value ) { - if ( is_int( $value ) ) { - return $value; - } - else if ( is_float( $value ) ) { - if ( (int) $value == $value && ! is_nan( $value ) ) { - return (int) $value; - } - else { - return false; - } - } - else if ( is_string( $value ) ) { - $value = trim( $value ); - if ( $value === '' ) { - return false; - } - else if ( ctype_digit( $value ) ) { - return (int) $value; - } - else if ( strpos( $value, '-' ) === 0 && ctype_digit( substr( $value, 1 ) ) ) { - return (int) $value; - } - else { - return false; - } - } - - return false; - } - - /** - * Clears the WP or W3TC cache depending on which is used - * - * @static - * - * @since 1.8.0 - */ - public static function clear_cache() { - if ( function_exists( 'w3tc_pgcache_flush' ) ) { - w3tc_pgcache_flush(); - } - elseif ( function_exists( 'wp_cache_clear_cache' ) ) { - wp_cache_clear_cache(); - } - } - - /** - * Flush W3TC cache after succesfull update/add of taxonomy meta option - * - * @static - * - * @since 1.8.0 - */ - public static function flush_w3tc_cache() { - if ( defined( 'W3TC_DIR' ) && function_exists( 'w3tc_objectcache_flush' ) ) { - w3tc_objectcache_flush(); - } - } - - /** - * Clear rewrite rules - * - * @static - * - * @since 1.8.0 - */ - public static function clear_rewrites() { - delete_option( 'rewrite_rules' ); - } - - /** - * Do simple reliable math calculations without the risk of wrong results - * - * @see http://floating-point-gui.de/ - * @see the big red warning on http://php.net/language.types.float.php - * - * In the rare case that the bcmath extension would not be loaded, it will return the normal calculation results - * - * @static - * - * @since 1.5.0 - * @since 1.8.0 Moved from stand-alone function to this class. - * - * @param mixed $number1 Scalar (string/int/float/bool). - * @param string $action Calculation action to execute. Valid input: - * '+' or 'add' or 'addition', - * '-' or 'sub' or 'subtract', - * '*' or 'mul' or 'multiply', - * '/' or 'div' or 'divide', - * '%' or 'mod' or 'modulus' - * '=' or 'comp' or 'compare'. - * @param mixed $number2 Scalar (string/int/float/bool). - * @param bool $round Whether or not to round the result. Defaults to false. - * Will be disregarded for a compare operation. - * @param int $decimals Decimals for rounding operation. Defaults to 0. - * @param int $precision Calculation precision. Defaults to 10. - * - * @return mixed Calculation Result or false if either or the numbers isn't scalar or - * an invalid operation was passed - * - for compare the result will always be an integer - * - for all other operations, the result will either be an integer (preferred) - * or a float - */ - public static function calc( $number1, $action, $number2, $round = false, $decimals = 0, $precision = 10 ) { - static $bc; - - if ( ! is_scalar( $number1 ) || ! is_scalar( $number2 ) ) { - return false; - } - - if ( ! isset( $bc ) ) { - $bc = extension_loaded( 'bcmath' ); - } - - if ( $bc ) { - $number1 = number_format( $number1, 10, '.', '' ); - $number2 = number_format( $number2, 10, '.', '' ); - } - - $result = null; - $compare = false; - - switch ( $action ) { - case '+': - case 'add': - case 'addition': - $result = ( $bc ) ? bcadd( $number1, $number2, $precision ) /* string */ : ( $number1 + $number2 ); - break; - - case '-': - case 'sub': - case 'subtract': - $result = ( $bc ) ? bcsub( $number1, $number2, $precision ) /* string */ : ( $number1 - $number2 ); - break; - - case '*': - case 'mul': - case 'multiply': - $result = ( $bc ) ? bcmul( $number1, $number2, $precision ) /* string */ : ( $number1 * $number2 ); - break; - - case '/': - case 'div': - case 'divide': - if ( $bc ) { - $result = bcdiv( $number1, $number2, $precision ); // String, or NULL if right_operand is 0. - } - elseif ( $number2 != 0 ) { - $result = ( $number1 / $number2 ); - } - - if ( ! isset( $result ) ) { - $result = 0; - } - break; - - case '%': - case 'mod': - case 'modulus': - if ( $bc ) { - $result = bcmod( $number1, $number2 ); // String, or NULL if modulus is 0. - } - elseif ( $number2 != 0 ) { - $result = ( $number1 % $number2 ); - } - - if ( ! isset( $result ) ) { - $result = 0; - } - break; - - case '=': - case 'comp': - case 'compare': - $compare = true; - if ( $bc ) { - $result = bccomp( $number1, $number2, $precision ); // Returns int 0, 1 or -1. - } - else { - $result = ( $number1 == $number2 ) ? 0 : ( ( $number1 > $number2 ) ? 1 : - 1 ); - } - break; - } - - if ( isset( $result ) ) { - if ( $compare === false ) { - if ( $round === true ) { - $result = round( floatval( $result ), $decimals ); - if ( $decimals === 0 ) { - $result = (int) $result; - } - } - else { - $result = ( intval( $result ) == $result ) ? intval( $result ) : floatval( $result ); - } - } - - return $result; - } - - return false; - } - - /** - * Trim whitespace and NBSP (Non-breaking space) from string - * - * @since 2.0.0 - * - * @param string $string String input to trim. - * - * @return string - */ - public static function trim_nbsp_from_string( $string ) { - $find = array( ' ', chr( 0xC2 ) . chr( 0xA0 ) ); - $string = str_replace( $find, ' ', $string ); - $string = trim( $string ); - - return $string; - } - - /** - * Check if a string is a valid datetime - * - * @since 2.0.0 - * - * @param string $datetime String input to check as valid input for DateTime class. - * - * @return bool - */ - public static function is_valid_datetime( $datetime ) { - - if ( substr( $datetime, 0, 1 ) === '-' ) { - return false; - } - - try { - return new DateTime( $datetime ) !== false; - } catch ( Exception $exc ) { - return false; - } - } - - /** - * Format the URL to be sure it is okay for using as a redirect url. - * - * This method will parse the URL and combine them in one string. - * - * @since 2.3.0 - * - * @param string $url URL string. - * - * @return mixed - */ - public static function format_url( $url ) { - $parsed_url = wp_parse_url( $url ); - - $formatted_url = ''; - if ( ! empty( $parsed_url['path'] ) ) { - $formatted_url = $parsed_url['path']; - } - - // Prepend a slash if first char != slash. - if ( stripos( $formatted_url, '/' ) !== 0 ) { - $formatted_url = '/' . $formatted_url; - } - - // Append 'query' string if it exists. - if ( isset( $parsed_url['query'] ) && '' != $parsed_url['query'] ) { - $formatted_url .= '?' . $parsed_url['query']; - } - - return apply_filters( 'wpseo_format_admin_url', $formatted_url ); - } - - - /** - * Get plugin name from file - * - * @since 2.3.3 - * - * @param string $plugin Plugin path relative to plugins directory. - * - * @return string|bool - */ - public static function get_plugin_name( $plugin ) { - $plugin_details = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); - - if ( $plugin_details['Name'] != '' ) { - return $plugin_details['Name']; - } - - return false; - } - - /** - * Retrieves the sitename. - * - * @since 3.0.0 - * - * @return string - */ - public static function get_site_name() { - return trim( strip_tags( get_bloginfo( 'name' ) ) ); - } - - /** - * Retrieves the title separator. - * - * @since 3.0.0 - * - * @return string - */ - public static function get_title_separator() { - $replacement = WPSEO_Options::get_default( 'wpseo_titles', 'separator' ); - - // Get the titles option and the separator options. - $titles_options = WPSEO_Options::get_option( 'wpseo_titles' ); - $seperator_options = WPSEO_Option_Titles::get_instance()->get_separator_options(); - - // This should always be set, but just to be sure. - if ( isset( $seperator_options[ $titles_options['separator'] ] ) ) { - // Set the new replacement. - $replacement = $seperator_options[ $titles_options['separator'] ]; - } - - /** - * Filter: 'wpseo_replacements_filter_sep' - Allow customization of the separator character(s) - * - * @api string $replacement The current separator - */ - return apply_filters( 'wpseo_replacements_filter_sep', $replacement ); - } - - /** - * Check if the current opened page is a Yoast SEO page. - * - * @since 3.0.0 - * - * @return bool - */ - public static function is_yoast_seo_page() { - static $is_yoast_seo; - - if ( $is_yoast_seo === null ) { - $current_page = filter_input( INPUT_GET, 'page' ); - $is_yoast_seo = ( substr( $current_page, 0, 6 ) === 'wpseo_' ); - } - - return $is_yoast_seo; - } - - /** - * Check if the current opened page belongs to Yoast SEO Free. - * - * @since 3.3.0 - * - * @param string $current_page the current page the user is on. - * - * @return bool - */ - public static function is_yoast_seo_free_page( $current_page ) { - $yoast_seo_free_pages = array( - 'wpseo_dashboard', - 'wpseo_titles', - 'wpseo_social', - 'wpseo_xml', - 'wpseo_advanced', - 'wpseo_tools', - 'wpseo_search_console', - 'wpseo_licenses', - ); - - return in_array( $current_page, $yoast_seo_free_pages ); - } - - /** - * Determine if Yoast SEO is in development mode? - * - * Inspired by JetPack (https://github.com/Automattic/jetpack/blob/master/class.jetpack.php#L1383-L1406). - * - * @since 3.0.0 - * - * @return bool - */ - public static function is_development_mode() { - $development_mode = false; - - if ( defined( 'WPSEO_DEBUG' ) ) { - $development_mode = WPSEO_DEBUG; - } - elseif ( site_url() && false === strpos( site_url(), '.' ) ) { - $development_mode = true; - } - - /** - * Filter the Yoast SEO development mode. - * - * @since 3.0 - * - * @param bool $development_mode Is Yoast SEOs development mode active. - */ - - return apply_filters( 'yoast_seo_development_mode', $development_mode ); - } - - /** - * Retrieve home URL with proper trailing slash. - * - * @since 3.3.0 - * - * @param string $path Path relative to home URL. - * @param string|null $scheme Scheme to apply. - * - * @return string Home URL with optional path, appropriately slashed if not. - */ - public static function home_url( $path = '', $scheme = null ) { - - $home_url = home_url( $path, $scheme ); - - if ( ! empty( $path ) ) { - return $home_url; - } - - $home_path = parse_url( $home_url, PHP_URL_PATH ); - - if ( '/' === $home_path ) { // Home at site root, already slashed. - return $home_url; - } - - if ( is_null( $home_path ) ) { // Home at site root, always slash. - return trailingslashit( $home_url ); - } - - if ( is_string( $home_path ) ) { // Home in subdirectory, slash if permalink structure has slash. - return user_trailingslashit( $home_url ); - } - - return $home_url; - } - - /** - * Returns a base64 URL for the svg for use in the menu - * - * @since 3.3.0 - * - * @param bool $base64 Whether or not to return base64'd output. - * - * @return string - */ - public static function get_icon_svg( $base64 = true ) { - $svg = ''; - - if ( $base64 ) { - return 'data:image/svg+xml;base64,' . base64_encode( $svg ); - } - - return $svg; - } - - /** - * Returns the language part of a given locale, defaults to english when the $locale is empty - * - * @since 3.4 - * - * @param string $locale The locale to get the language of. - * - * @returns string The language part of the locale. - */ - public static function get_language( $locale ) { - $language = 'en'; - - if ( ! empty( $locale ) && strlen( $locale ) >= 2 ) { - $language = substr( $locale, 0, 2 ); - } - - return $language; - } - - /** - * Returns the user locale for the language to be used in the admin. - * - * WordPress 4.7 introduced the ability for users to specify an Admin language - * different from the language used on the front end. This checks if the feature - * is available and returns the user's language, with a fallback to the site's language. - * Can be removed when support for WordPress 4.6 will be dropped, in favor - * of WordPress get_user_locale() that already fallbacks to the site’s locale. - * - * @since 4.1 - * - * @returns string The locale. - */ - public static function get_user_locale() { - if ( function_exists( 'get_user_locale' ) ) { - return get_user_locale(); - } - - return get_locale(); - } - - /** - * Checks if the WP-REST-API is available. - * - * @since 3.6 - * @since 3.7 Introduced the $minimum_version parameter. - * - * @param string $minimum_version The minimum version the API should be. - * - * @return bool Returns true if the API is available. - */ - public static function is_api_available( $minimum_version = '2.0' ) { - return ( defined( 'REST_API_VERSION' ) - && version_compare( REST_API_VERSION, $minimum_version, '>=' ) ); - } - - /********************** DEPRECATED METHODS **********************/ - - // @codeCoverageIgnoreStart - /** - * Wrapper for the PHP filter input function. - * - * This is used because stupidly enough, the `filter_input` function is not available on all hosts... - * - * @since 1.8.0 - * - * @deprecated 3.0 - * @deprecated Passes through to PHP call, no longer used in code. - * - * @param int $type Input type constant. - * @param string $variable_name Variable name to get. - * @param int $filter Filter to apply. - * - * @return mixed - */ - public static function filter_input( $type, $variable_name, $filter = FILTER_DEFAULT ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0', 'PHP native filter_input()' ); - - return filter_input( $type, $variable_name, $filter ); - } - - /** - * Adds a hook that when given option is updated, the XML sitemap transient cache is cleared - * - * @since 2.2.0 - * - * @deprecated 3.2 - * @see WPSEO_Sitemaps_Cache::register_clear_on_option_update() - * - * @param string $option Option name. - * @param string $type Sitemap type. - */ - public static function register_cache_clear_option( $option, $type = '' ) { - _deprecated_function( __METHOD__, 'WPSEO 3.2', 'WPSEO_Sitemaps_Cache::register_clear_on_option_update()' ); - WPSEO_Sitemaps_Cache::register_clear_on_option_update( $option, $type ); - } - - /** - * Clears the transient cache when a given option is updated, if that option has been registered before - * - * @since 2.2.0 - * - * @deprecated 3.2 - * @see WPSEO_Sitemaps_Cache::clear_on_option_update() - * - * @param string $option The option that's being updated. - */ - public static function clear_transient_cache( $option ) { - _deprecated_function( __METHOD__, 'WPSEO 3.2', 'WPSEO_Sitemaps_Cache::clear_on_option_update()' ); - WPSEO_Sitemaps_Cache::clear_on_option_update( $option ); - } - - /** - * Clear entire XML sitemap cache - * - * @since 1.8.0 - * - * @deprecated 3.2 - * @see WPSEO_Sitemaps_Cache::clear() - * - * @param array $types Set of sitemap types to invalidate cache for. - */ - public static function clear_sitemap_cache( $types = array() ) { - _deprecated_function( __METHOD__, 'WPSEO 3.2', 'WPSEO_Sitemaps_Cache::clear()' ); - WPSEO_Sitemaps_Cache::clear( $types ); - } - - /** - * Wrapper for encoding the array as a json string. Includes a fallback if wp_json_encode doesn't exist. - * - * @since 3.0.0 - * - * @deprecated 3.3 Core versions without wp_json_encode() no longer supported, fallback unnecessary. - * - * @param array $array_to_encode The array which will be encoded. - * @param int $options Optional. Array with options which will be passed in to the encoding methods. - * @param int $depth Optional. Maximum depth to walk through $data. Must be greater than 0. Default 512. - * - * @return false|string - */ - public static function json_encode( array $array_to_encode, $options = 0, $depth = 512 ) { - _deprecated_function( __METHOD__, 'WPSEO 3.3', 'wp_json_encode()' ); - - return wp_json_encode( $array_to_encode, $options, $depth ); - } - // @codeCoverageIgnoreEnd -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/index.php b/wp/wp-content/plugins/wordpress-seo/inc/index.php deleted file mode 100644 index e94d9a42..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/index.php +++ /dev/null @@ -1,4 +0,0 @@ -get_defaults(); - * @internal Note: Some of the default values are added via the translate_defaults() method - */ - protected $defaults = array( - 'breadcrumbs-404crumb' => '', // Text field. - 'breadcrumbs-blog-remove' => false, - 'breadcrumbs-boldlast' => false, - 'breadcrumbs-archiveprefix' => '', // Text field. - 'breadcrumbs-enable' => false, - 'breadcrumbs-home' => '', // Text field. - 'breadcrumbs-prefix' => '', // Text field. - 'breadcrumbs-searchprefix' => '', // Text field. - 'breadcrumbs-sep' => '»', // Text field. - - /** - * Uses enrich_defaults() to add more along the lines of: - * - 'post_types-' . $pt->name . '-maintax' => 0 / string - * - 'taxonomy-' . $tax->name . '-ptparent' => 0 / string - */ - ); - - /** - * @var array Array of variable option name patterns for the option - */ - protected $variable_array_key_patterns = array( - 'post_types-', - 'taxonomy-', - ); - - - /** - * Get the singleton instance of this class - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - - /** - * Translate strings used in the option defaults - * - * @return void - */ - public function translate_defaults() { - $this->defaults['breadcrumbs-404crumb'] = __( 'Error 404: Page not found', 'wordpress-seo' ); - $this->defaults['breadcrumbs-archiveprefix'] = __( 'Archives for', 'wordpress-seo' ); - $this->defaults['breadcrumbs-home'] = __( 'Home', 'wordpress-seo' ); - $this->defaults['breadcrumbs-searchprefix'] = __( 'You searched for', 'wordpress-seo' ); - } - - - /** - * Add dynamically created default options based on available post types and taxonomies - * - * @return void - */ - public function enrich_defaults() { - - // Retrieve all the relevant post type and taxonomy arrays. - $post_type_names = get_post_types( array( 'public' => true ), 'names' ); - $taxonomy_names_custom = get_taxonomies( array( 'public' => true, '_builtin' => false ), 'names' ); - - if ( $post_type_names !== array() ) { - foreach ( $post_type_names as $pt ) { - $pto_taxonomies = get_object_taxonomies( $pt, 'names' ); - if ( $pto_taxonomies !== array() ) { - $this->defaults[ 'post_types-' . $pt . '-maintax' ] = 0; // Select box. - } - unset( $pto_taxonomies ); - } - unset( $pt ); - } - - if ( $taxonomy_names_custom !== array() ) { - foreach ( $taxonomy_names_custom as $tax ) { - $this->defaults[ 'taxonomy-' . $tax . '-ptparent' ] = 0; // Select box;. - } - unset( $tax ); - } - } - - - /** - * Validate the option - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - * - * @return array Validated clean value for the option to be saved to the database - */ - protected function validate_option( $dirty, $clean, $old ) { - - $allowed_post_types = $this->get_allowed_post_types(); - - foreach ( $clean as $key => $value ) { - - $switch_key = $this->get_switch_key( $key ); - - switch ( $switch_key ) { - /* text fields */ - case 'breadcrumbs-404crumb': - case 'breadcrumbs-archiveprefix': - case 'breadcrumbs-home': - case 'breadcrumbs-prefix': - case 'breadcrumbs-searchprefix': - case 'breadcrumbs-sep': - if ( isset( $dirty[ $key ] ) ) { - $clean[ $key ] = wp_kses_post( $dirty[ $key ] ); - } - break; - - - /* 'post_types-' . $pt->name . '-maintax' fields */ - case 'post_types-': - $post_type = str_replace( array( 'post_types-', '-maintax' ), '', $key ); - $taxonomies = get_object_taxonomies( $post_type, 'names' ); - - if ( isset( $dirty[ $key ] ) ) { - if ( $taxonomies !== array() && in_array( $dirty[ $key ], $taxonomies, true ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - elseif ( (string) $dirty[ $key ] === '0' || (string) $dirty[ $key ] === '' ) { - $clean[ $key ] = 0; - } - elseif ( sanitize_title_with_dashes( $dirty[ $key ] ) === $dirty[ $key ] ) { - // Allow taxonomies which may not be registered yet. - $clean[ $key ] = $dirty[ $key ]; - } - else { - if ( isset( $old[ $key ] ) ) { - $clean[ $key ] = sanitize_title_with_dashes( $old[ $key ] ); - } - if ( function_exists( 'add_settings_error' ) ) { - /** - * @todo [JRF => whomever] maybe change the untranslated $pt name in the - * error message to the nicely translated label ? - */ - add_settings_error( - $this->group_name, // Slug title of the setting. - '_' . $key, // Suffix-id for the error message box. - sprintf( __( 'Please select a valid taxonomy for post type "%s"', 'wordpress-seo' ), $post_type ), // The error message. - 'error' // Error type, either 'error' or 'updated'. - ); - } - } - } - elseif ( isset( $old[ $key ] ) ) { - $clean[ $key ] = sanitize_title_with_dashes( $old[ $key ] ); - } - unset( $taxonomies, $post_type ); - break; - - - /* 'taxonomy-' . $tax->name . '-ptparent' fields */ - case 'taxonomy-': - if ( isset( $dirty[ $key ] ) ) { - if ( $allowed_post_types !== array() && in_array( $dirty[ $key ], $allowed_post_types, true ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - elseif ( (string) $dirty[ $key ] === '0' || (string) $dirty[ $key ] === '' ) { - $clean[ $key ] = 0; - } - elseif ( sanitize_key( $dirty[ $key ] ) === $dirty[ $key ] ) { - // Allow taxonomies which may not be registered yet. - $clean[ $key ] = $dirty[ $key ]; - } - else { - if ( isset( $old[ $key ] ) ) { - $clean[ $key ] = sanitize_key( $old[ $key ] ); - } - if ( function_exists( 'add_settings_error' ) ) { - /** - * @todo [JRF =? whomever] maybe change the untranslated $tax name in the - * error message to the nicely translated label ? - */ - $tax = str_replace( array( 'taxonomy-', '-ptparent' ), '', $key ); - add_settings_error( - $this->group_name, // Slug title of the setting. - '_' . $tax, // Suffix-id for the error message box. - sprintf( __( 'Please select a valid post type for taxonomy "%s"', 'wordpress-seo' ), $tax ), // The error message. - 'error' // Error type, either 'error' or 'updated'. - ); - unset( $tax ); - } - } - } - elseif ( isset( $old[ $key ] ) ) { - $clean[ $key ] = sanitize_key( $old[ $key ] ); - } - break; - - - /* - Boolean fields - */ - - /* - Covers: - * 'breadcrumbs-blog-remove' - * 'breadcrumbs-boldlast' - * 'breadcrumbs-enable' - */ - default: - $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); - break; - } - } - - return $clean; - } - - - /** - * Retrieve a list of the allowed post types as breadcrumb parent for a taxonomy - * Helper method for validation - * - * @internal don't make static as new types may still be registered - * - * @return array - */ - protected function get_allowed_post_types() { - $allowed_post_types = array(); - - $post_types = get_post_types( array( 'public' => true ), 'objects' ); - - if ( get_option( 'show_on_front' ) == 'page' && get_option( 'page_for_posts' ) > 0 ) { - $allowed_post_types[] = 'post'; - } - - if ( is_array( $post_types ) && $post_types !== array() ) { - foreach ( $post_types as $type ) { - if ( $type->has_archive ) { - $allowed_post_types[] = $type->name; - } - } - } - - return $allowed_post_types; - } - - - /** - * Clean a given option value - * - * @param array $option_value Old (not merged with defaults or filtered) option value to - * clean according to the rules for this option. - * @param string $current_version (optional) Version from which to upgrade, if not set, - * version specific upgrades will be disregarded. - * @param array $all_old_option_values (optional) Only used when importing old options to have - * access to the real old values, in contrast to the saved ones. - * - * @return array Cleaned option - */ - protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { - - /* Make sure the old fall-back defaults for empty option keys are now added to the option */ - if ( isset( $current_version ) && version_compare( $current_version, '1.5.2.3', '<' ) ) { - if ( has_action( 'init', array( 'WPSEO_Options', 'bring_back_breadcrumb_defaults' ) ) === false ) { - add_action( 'init', array( 'WPSEO_Options', 'bring_back_breadcrumb_defaults' ), 3 ); - } - } - - /* - Make sure the values of the variable option key options are cleaned as they - may be retained and would not be cleaned/validated then - */ - if ( is_array( $option_value ) && $option_value !== array() ) { - - $allowed_post_types = $this->get_allowed_post_types(); - - foreach ( $option_value as $key => $value ) { - $switch_key = $this->get_switch_key( $key ); - - // Similar to validation routine - any changes made there should be made here too. - switch ( $switch_key ) { - /* 'post_types-' . $pt->name . '-maintax' fields */ - case 'post_types-': - $post_type = str_replace( array( 'post_types-', '-maintax' ), '', $key ); - $taxonomies = get_object_taxonomies( $post_type, 'names' ); - - if ( $taxonomies !== array() && in_array( $value, $taxonomies, true ) ) { - $option_value[ $key ] = $value; - } - elseif ( (string) $value === '0' || (string) $value === '' ) { - $option_value[ $key ] = 0; - } - elseif ( sanitize_title_with_dashes( $value ) === $value ) { - // Allow taxonomies which may not be registered yet. - $option_value[ $key ] = $value; - } - unset( $taxonomies, $post_type ); - break; - - - /* 'taxonomy-' . $tax->name . '-ptparent' fields */ - case 'taxonomy-': - if ( $allowed_post_types !== array() && in_array( $value, $allowed_post_types, true ) ) { - $option_value[ $key ] = $value; - } - elseif ( (string) $value === '0' || (string) $value === '' ) { - $option_value[ $key ] = 0; - } - elseif ( sanitize_key( $option_value[ $key ] ) === $option_value[ $key ] ) { - // Allow post types which may not be registered yet. - $option_value[ $key ] = $value; - } - break; - } - } - } - - return $option_value; - } - - /** - * With the changes to v1.5, the defaults for some of the textual breadcrumb settings are added - * dynamically, but empty strings are allowed. - * This caused issues for people who left the fields empty on purpose relying on the defaults. - * This little routine fixes that. - * Needs to be run on 'init' hook at prio 3 to make sure the defaults are translated. - */ - public function bring_back_defaults() { - $option = get_option( $this->option_name ); - - $values_to_bring_back = array( - 'breadcrumbs-404crumb', - 'breadcrumbs-archiveprefix', - 'breadcrumbs-home', - 'breadcrumbs-searchprefix', - 'breadcrumbs-sep', - ); - foreach ( $values_to_bring_back as $key ) { - if ( $option[ $key ] === '' && $this->defaults[ $key ] !== '' ) { - $option[ $key ] = $this->defaults[ $key ]; - } - } - update_option( $this->option_name, $option ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-ms.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-ms.php deleted file mode 100644 index f259e611..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-ms.php +++ /dev/null @@ -1,220 +0,0 @@ -get_defaults(); - */ - protected $defaults = array( - 'access' => 'admin', - 'defaultblog' => '', // Numeric blog ID or empty. - ); - - /** - * @var array $allowed_access_options Available options for the 'access' setting - * Used for input validation - * - * @static - * - * @internal Important: Make sure the options added to the array here are in line with the keys - * for the options set for the select box in the admin/pages/network.php file - */ - public static $allowed_access_options = array( - 'admin', - 'superadmin', - ); - - - /** - * Get the singleton instance of this class - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Only run parent constructor in multisite context. - */ - public function __construct() { - if ( is_multisite() ) { - parent::__construct(); - } - } - - /** - * Add filters to make sure that the option default is returned if the option is not set - * - * @return void - */ - public function add_default_filters() { - // Don't change, needs to check for false as could return prio 0 which would evaluate to false. - if ( has_filter( 'default_site_option_' . $this->option_name, array( $this, 'get_defaults' ) ) === false ) { - add_filter( 'default_site_option_' . $this->option_name, array( $this, 'get_defaults' ) ); - } - } - - - /** - * Remove the default filters. - * Called from the validate() method to prevent failure to add new options - * - * @return void - */ - public function remove_default_filters() { - remove_filter( 'default_site_option_' . $this->option_name, array( $this, 'get_defaults' ) ); - } - - - /** - * Add filters to make sure that the option is merged with its defaults before being returned - * - * @return void - */ - public function add_option_filters() { - // Don't change, needs to check for false as could return prio 0 which would evaluate to false. - if ( has_filter( 'site_option_' . $this->option_name, array( $this, 'get_option' ) ) === false ) { - add_filter( 'site_option_' . $this->option_name, array( $this, 'get_option' ) ); - } - } - - - /** - * Remove the option filters. - * Called from the clean_up methods to make sure we retrieve the original old option - * - * @return void - */ - public function remove_option_filters() { - remove_filter( 'site_option_' . $this->option_name, array( $this, 'get_option' ) ); - } - - - /* *********** METHODS influencing add_uption(), update_option() and saving from admin pages *********** */ - - - /** - * Validate the option - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - * - * @return array Validated clean value for the option to be saved to the database - */ - protected function validate_option( $dirty, $clean, $old ) { - - foreach ( $clean as $key => $value ) { - switch ( $key ) { - case 'access': - if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], self::$allowed_access_options, true ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - elseif ( function_exists( 'add_settings_error' ) ) { - add_settings_error( - $this->group_name, // Slug title of the setting. - '_' . $key, // Suffix-id for the error message box. - /* translators: %1$s expands to the option name and %2$sexpands to Yoast SEO */ - sprintf( __( '%1$s is not a valid choice for who should be allowed access to the %2$s settings. Value reset to the default.', 'wordpress-seo' ), esc_html( sanitize_text_field( $dirty[ $key ] ) ), 'Yoast SEO' ), // The error message. - 'error' // Error type, either 'error' or 'updated'. - ); - } - break; - - - case 'defaultblog': - if ( isset( $dirty[ $key ] ) && ( $dirty[ $key ] !== '' && $dirty[ $key ] !== '-' ) ) { - $int = WPSEO_Utils::validate_int( $dirty[ $key ] ); - if ( $int !== false && $int > 0 ) { - // Check if a valid blog number has been received. - $exists = get_blog_details( $int, false ); - if ( $exists && $exists->deleted == 0 ) { - $clean[ $key ] = $int; - } - elseif ( function_exists( 'add_settings_error' ) ) { - add_settings_error( - $this->group_name, // Slug title of the setting. - '_' . $key, // Suffix-id for the error message box. - esc_html__( 'The default blog setting must be the numeric blog id of the blog you want to use as default.', 'wordpress-seo' ) . '
    ' . sprintf( esc_html__( 'This must be an existing blog. Blog %s does not exist or has been marked as deleted.', 'wordpress-seo' ), '' . esc_html( sanitize_text_field( $dirty[ $key ] ) ) . '' ), // The error message. - 'error' // Error type, either 'error' or 'updated'. - ); - } - unset( $exists ); - } - elseif ( function_exists( 'add_settings_error' ) ) { - add_settings_error( - $this->group_name, // Slug title of the setting. - '_' . $key, // Suffix-id for the error message box. - esc_html__( 'The default blog setting must be the numeric blog id of the blog you want to use as default.', 'wordpress-seo' ) . '
    ' . esc_html__( 'No numeric value was received.', 'wordpress-seo' ), // The error message. - 'error' // Error type, either 'error' or 'updated'. - ); - } - unset( $int ); - } - break; - - default: - $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); - break; - } - } - - return $clean; - } - - - /** - * Clean a given option value - * - * @param array $option_value Old (not merged with defaults or filtered) option value to - * clean according to the rules for this option. - * @param string $current_version (optional) Version from which to upgrade, if not set, - * version specific upgrades will be disregarded. - * @param array $all_old_option_values (optional) Only used when importing old options to have - * access to the real old values, in contrast to the saved ones. - * - * @return array Cleaned option - */ - - /* - Protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { - - return $option_value; - } - */ -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-permalinks.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-permalinks.php deleted file mode 100644 index e2ae8597..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-permalinks.php +++ /dev/null @@ -1,131 +0,0 @@ -get_defaults(); - */ - protected $defaults = array( - 'cleanpermalinks' => false, - 'cleanpermalink-extravars' => '', // Text field. - 'cleanpermalink-googlecampaign' => false, - 'cleanpermalink-googlesitesearch' => false, - 'cleanreplytocom' => false, - 'cleanslugs' => true, - 'redirectattachment' => false, - 'stripcategorybase' => false, - 'trailingslash' => false, - ); - - - /** - * Add the actions and filters for the option - * - * @todo [JRF => testers] Check if the extra actions below would run into problems if an option - * is updated early on and if so, change the call to schedule these for a later action on add/update - * instead of running them straight away - * - * @return \WPSEO_Option_Permalinks - */ - protected function __construct() { - parent::__construct(); - add_action( 'update_option_' . $this->option_name, array( 'WPSEO_Utils', 'clear_rewrites' ) ); - } - - - /** - * Get the singleton instance of this class - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - - /** - * Validate the option - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option (not used here as all fields will always be in the form). - * - * @return array Validated clean value for the option to be saved to the database - */ - protected function validate_option( $dirty, $clean, $old ) { - - foreach ( $clean as $key => $value ) { - switch ( $key ) { - /* text fields */ - case 'cleanpermalink-extravars': - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - $clean[ $key ] = sanitize_text_field( $dirty[ $key ] ); - } - break; - - /* - Boolean (checkbox) fields - */ - - /* - Covers: - * 'cleanpermalinks' - * 'cleanpermalink-googlesitesearch' - * 'cleanpermalink-googlecampaign' - * 'cleanreplytocom' - * 'cleanslugs' - * 'hide-rsdlink' - * 'hide-wlwmanifest' - * 'hide-shortlink' - * 'hide-feedlinks' - * 'redirectattachment' - * 'stripcategorybase' - * 'trailingslash' - */ - default: - $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); - break; - } - } - - return $clean; - } - - - /** - * Clean a given option value - * - * @param array $option_value Old (not merged with defaults or filtered) option value to - * clean according to the rules for this option. - * @param string $current_version (optional) Version from which to upgrade, if not set, - * version specific upgrades will be disregarded. - * @param array $all_old_option_values (optional) Only used when importing old options to have - * access to the real old values, in contrast to the saved ones. - * - * @return array Cleaned option - */ - - /* - Protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { - - return $option_value; - } - */ -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-rss.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-rss.php deleted file mode 100644 index 1c496872..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-rss.php +++ /dev/null @@ -1,70 +0,0 @@ -get_defaults(); - * @internal Note: Some of the default values are added via the translate_defaults() method - */ - protected $defaults = array( - 'rssbefore' => '', // Text area. - 'rssafter' => '', // Text area. - ); - - - /** - * Get the singleton instance of this class - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - - /** - * Translate strings used in the option defaults - * - * @return void - */ - public function translate_defaults() { - /* translators: 1: link to post; 2: link to blog. */ - $this->defaults['rssafter'] = sprintf( __( 'The post %1$s appeared first on %2$s.', 'wordpress-seo' ), '%%POSTLINK%%', '%%BLOGLINK%%' ); - } - - - /** - * Validate the option - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - * - * @return array Validated clean value for the option to be saved to the database - */ - protected function validate_option( $dirty, $clean, $old ) { - foreach ( $clean as $key => $value ) { - if ( isset( $dirty[ $key ] ) ) { - $clean[ $key ] = wp_kses_post( $dirty[ $key ] ); - } - } - - return $clean; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-social.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-social.php deleted file mode 100644 index 414bea60..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-social.php +++ /dev/null @@ -1,319 +0,0 @@ -get_defaults(); - */ - protected $defaults = array( - // Non-form fields, set via procedural code in admin/pages/social.php. - 'fb_admins' => array(), // Array of user id's => array( name => '', link => '' ). - - // Non-form field, set via translate_defaults() and validate_option() methods. - 'fbconnectkey' => '', - // Form fields: - 'facebook_site' => '', // Text field. - 'instagram_url' => '', - 'linkedin_url' => '', - 'myspace_url' => '', - 'og_default_image' => '', // Text field. - 'og_frontpage_title' => '', // Text field. - 'og_frontpage_desc' => '', // Text field. - 'og_frontpage_image' => '', // Text field. - 'opengraph' => true, - 'pinterest_url' => '', - 'pinterestverify' => '', - 'plus-publisher' => '', // Text field. - 'twitter' => true, - 'twitter_site' => '', // Text field. - 'twitter_card_type' => 'summary', - 'youtube_url' => '', - 'google_plus_url' => '', - // Form field, but not always available: - 'fbadminapp' => '', // Facebook app ID. - ); - - /** - * @var array Array of sub-options which should not be overloaded with multi-site defaults - */ - public $ms_exclude = array( - /* privacy */ - 'fb_admins', - 'fbconnectkey', - 'fbadminapp', - 'pinterestverify', - ); - - - /** - * @var array Array of allowed twitter card types - * While we only have the options summary and summary_large_image in the - * interface now, we might change that at some point. - * - * @internal Uncomment any of these to allow them in validation *and* automatically add them as a choice - * in the options page - */ - public static $twitter_card_types = array( - 'summary' => '', - 'summary_large_image' => '', - // 'photo' => '', - // 'gallery' => '', - // 'app' => '', - // 'player' => '', - // 'product' => '', - ); - - - /** - * Get the singleton instance of this class - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - - /** - * Translate/set strings used in the option defaults - * - * @return void - */ - public function translate_defaults() { - /* Auto-magically set the fb connect key */ - $this->defaults['fbconnectkey'] = self::get_fbconnectkey(); - - self::$twitter_card_types['summary'] = __( 'Summary', 'wordpress-seo' ); - self::$twitter_card_types['summary_large_image'] = __( 'Summary with large image', 'wordpress-seo' ); - } - - - /** - * Get a Facebook connect key for the blog - * - * @static - * @return string - */ - public static function get_fbconnectkey() { - return md5( get_bloginfo( 'url' ) . rand() ); - } - - - /** - * Validate the option - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - * - * @return array Validated clean value for the option to be saved to the database - */ - protected function validate_option( $dirty, $clean, $old ) { - - foreach ( $clean as $key => $value ) { - switch ( $key ) { - /* Automagic Facebook connect key */ - case 'fbconnectkey': - if ( ( isset( $old[ $key ] ) && $old[ $key ] !== '' ) && preg_match( '`^[a-f0-9]{32}$`', $old[ $key ] ) > 0 ) { - $clean[ $key ] = $old[ $key ]; - } - else { - $clean[ $key ] = self::get_fbconnectkey(); - } - break; - - - /* Will not always exist in form */ - case 'fb_admins': - if ( isset( $dirty[ $key ] ) && is_array( $dirty[ $key ] ) ) { - if ( $dirty[ $key ] === array() ) { - $clean[ $key ] = array(); - } - else { - foreach ( $dirty[ $key ] as $user_id => $fb_array ) { - /* - * @todo [JRF/JRF => Yoast/whomever] add user_id validation - - * are these WP user-ids or FB user-ids ? Probably FB user-ids, - * if so, find out the rules for FB user-ids - */ - if ( is_array( $fb_array ) && $fb_array !== array() ) { - foreach ( $fb_array as $fb_key => $fb_value ) { - switch ( $fb_key ) { - case 'name': - /** - * @todo [JRF => whomever] add validation for name based - * on rules if there are any - * Input comes from: $_GET['userrealname'] - */ - $clean[ $key ][ $user_id ][ $fb_key ] = sanitize_text_field( $fb_value ); - break; - - case 'link': - $clean[ $key ][ $user_id ][ $fb_key ] = WPSEO_Utils::sanitize_url( $fb_value ); - break; - } - } - } - } - unset( $user_id, $fb_array, $fb_key, $fb_value ); - } - } - elseif ( isset( $old[ $key ] ) && is_array( $old[ $key ] ) ) { - $clean[ $key ] = $old[ $key ]; - } - break; - - /* text fields */ - case 'og_frontpage_desc': - case 'og_frontpage_title': - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - $clean[ $key ] = WPSEO_Utils::sanitize_text_field( $dirty[ $key ] ); - } - break; - - - /* url text fields - no ftp allowed */ - case 'facebook_site': - case 'instagram_url': - case 'linkedin_url': - case 'myspace_url': - case 'pinterest_url': - case 'plus-publisher': - case 'og_default_image': - case 'og_frontpage_image': - case 'youtube_url': - case 'google_plus_url': - $this->validate_url( $key, $dirty, $old, $clean ); - break; - - case 'pinterestverify': - $this->validate_verification_string( $key, $dirty, $old, $clean ); - break; - - /* twitter user name */ - case 'twitter_site': - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - $twitter_id = sanitize_text_field( ltrim( $dirty[ $key ], '@' ) ); - /** - * From the Twitter documentation about twitter screen names: - * Typically a maximum of 15 characters long, but some historical accounts - * may exist with longer names. - * A username can only contain alphanumeric characters (letters A-Z, numbers 0-9) - * with the exception of underscores - * - * @link https://support.twitter.com/articles/101299-why-can-t-i-register-certain-usernames - * @link https://dev.twitter.com/docs/platform-objects/users - */ - if ( preg_match( '`^[A-Za-z0-9_]{1,25}$`', $twitter_id ) ) { - $clean[ $key ] = $twitter_id; - } - elseif ( preg_match( '`^http(?:s)?://(?:www\.)?twitter\.com/(?P[A-Za-z0-9_]{1,25})/?$`', $twitter_id, $matches ) ) { - $clean[ $key ] = $matches['handle']; - } - else { - if ( isset( $old[ $key ] ) && $old[ $key ] !== '' ) { - $twitter_id = sanitize_text_field( ltrim( $old[ $key ], '@' ) ); - if ( preg_match( '`^[A-Za-z0-9_]{1,25}$`', $twitter_id ) ) { - $clean[ $key ] = $twitter_id; - } - } - if ( function_exists( 'add_settings_error' ) ) { - add_settings_error( - $this->group_name, // Slug title of the setting. - '_' . $key, // Suffix-id for the error message box. - sprintf( __( '%s does not seem to be a valid Twitter user-id. Please correct.', 'wordpress-seo' ), '' . esc_html( sanitize_text_field( $dirty[ $key ] ) ) . '' ), // The error message. - 'error' // Error type, either 'error' or 'updated'. - ); - } - } - unset( $twitter_id ); - } - break; - - case 'twitter_card_type': - if ( isset( $dirty[ $key ], self::$twitter_card_types[ $dirty[ $key ] ] ) && $dirty[ $key ] !== '' ) { - $clean[ $key ] = $dirty[ $key ]; - } - break; - - /* boolean fields */ - case 'opengraph': - case 'twitter': - $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); - break; - } - } - - /** - * Only validate 'fbadminapp', so leave the clean default. - */ - if ( isset( $dirty['fbadminapp'] ) && ! empty( $dirty['fbadminapp'] ) ) { - $clean['fbadminapp'] = $dirty['fbadminapp']; - } - - - return $clean; - } - - - /** - * Clean a given option value - * - * @param array $option_value Old (not merged with defaults or filtered) option value to - * clean according to the rules for this option. - * @param string $current_version (optional) Version from which to upgrade, if not set, - * version specific upgrades will be disregarded. - * @param array $all_old_option_values (optional) Only used when importing old options to have - * access to the real old values, in contrast to the saved ones. - * - * @return array Cleaned option - */ - protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { - - /* Move options from very old option to this one */ - $old_option = null; - if ( isset( $all_old_option_values ) ) { - // Ok, we have an import. - if ( isset( $all_old_option_values['wpseo_indexation'] ) && is_array( $all_old_option_values['wpseo_indexation'] ) && $all_old_option_values['wpseo_indexation'] !== array() ) { - $old_option = $all_old_option_values['wpseo_indexation']; - } - } - else { - $old_option = get_option( 'wpseo_indexation' ); - } - - if ( is_array( $old_option ) && $old_option !== array() ) { - $move = array( - 'opengraph', - 'fb_adminid', - 'fb_appid', - ); - foreach ( $move as $key ) { - if ( isset( $old_option[ $key ] ) && ! isset( $option_value[ $key ] ) ) { - $option_value[ $key ] = $old_option[ $key ]; - } - } - unset( $move, $key ); - } - unset( $old_option ); - - - return $option_value; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-titles.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-titles.php deleted file mode 100644 index 91297579..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-titles.php +++ /dev/null @@ -1,612 +0,0 @@ -get_defaults(); - * @internal Note: Some of the default values are added via the translate_defaults() method - */ - protected $defaults = array( - // Non-form fields, set via (ajax) function. - 'title_test' => 0, - // Form fields. - 'forcerewritetitle' => false, - 'separator' => 'sc-dash', - 'noodp' => false, - 'usemetakeywords' => false, - 'title-home-wpseo' => '%%sitename%% %%page%% %%sep%% %%sitedesc%%', // Text field. - 'title-author-wpseo' => '', // Text field. - 'title-archive-wpseo' => '%%date%% %%page%% %%sep%% %%sitename%%', // Text field. - 'title-search-wpseo' => '', // Text field. - 'title-404-wpseo' => '', // Text field. - - 'metadesc-home-wpseo' => '', // Text area. - 'metadesc-author-wpseo' => '', // Text area. - 'metadesc-archive-wpseo' => '', // Text area. - 'metakey-home-wpseo' => '', // Text field. - 'metakey-author-wpseo' => '', // Text field. - - 'noindex-subpages-wpseo' => false, - 'noindex-author-wpseo' => false, - 'noindex-archive-wpseo' => true, - - 'disable-author' => false, - 'disable-date' => false, - 'disable-post_format' => false, - - /** - * Uses enrich_defaults to add more along the lines of: - * - 'title-' . $pt->name => ''; // Text field. - * - 'metadesc-' . $pt->name => ''; // Text field. - * - 'metakey-' . $pt->name => ''; // Text field. - * - 'noindex-' . $pt->name => false; - * - 'showdate-' . $pt->name => false; - * - 'hideeditbox-' . $pt->name => false; - * - * - 'title-ptarchive-' . $pt->name => ''; // Text field. - * - 'metadesc-ptarchive-' . $pt->name => ''; // Text field. - * - 'metakey-ptarchive-' . $pt->name => ''; // Text field. - * - 'bctitle-ptarchive-' . $pt->name => ''; // Text field. - * - 'noindex-ptarchive-' . $pt->name => false; - * - * - 'title-tax-' . $tax->name => '''; // Text field. - * - 'metadesc-tax-' . $tax->name => ''; // Text field. - * - 'metakey-tax-' . $tax->name => ''; // Text field. - * - 'noindex-tax-' . $tax->name => false; - * - 'hideeditbox-tax-' . $tax->name => false; - */ - ); - - /** - * @var array Array of variable option name patterns for the option - */ - protected $variable_array_key_patterns = array( - 'title-', - 'metadesc-', - 'metakey-', - 'noindex-', - 'showdate-', - 'hideeditbox-', - 'bctitle-ptarchive-', - ); - - /** - * @var array Array of sub-options which should not be overloaded with multi-site defaults - */ - public $ms_exclude = array( - /* theme dependent */ - 'title_test', - 'forcerewritetitle', - ); - - /** - * @var array Array of the separator options. To get these options use WPSEO_Option_Titles::get_instance()->get_separator_options() - */ - private $separator_options = array( - 'sc-dash' => '-', - 'sc-ndash' => '–', - 'sc-mdash' => '—', - 'sc-middot' => '·', - 'sc-bull' => '•', - 'sc-star' => '*', - 'sc-smstar' => '⋆', - 'sc-pipe' => '|', - 'sc-tilde' => '~', - 'sc-laquo' => '«', - 'sc-raquo' => '»', - 'sc-lt' => '<', - 'sc-gt' => '>', - ); - - /** - * Add the actions and filters for the option - * - * @todo [JRF => testers] Check if the extra actions below would run into problems if an option - * is updated early on and if so, change the call to schedule these for a later action on add/update - * instead of running them straight away - * - * @return \WPSEO_Option_Titles - */ - protected function __construct() { - parent::__construct(); - add_action( 'update_option_' . $this->option_name, array( 'WPSEO_Utils', 'clear_cache' ) ); - add_action( 'init', array( $this, 'end_of_init' ), 999 ); - } - - - /** - * Make sure we can recognize the right action for the double cleaning - */ - public function end_of_init() { - do_action( 'wpseo_double_clean_titles' ); - } - - /** - * Get the singleton instance of this class - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Get the available separator options - * - * @return array - */ - public function get_separator_options() { - $separators = $this->separator_options; - - /** - * Allow altering the array with separator options - * - * @api array $separator_options Array with the separator options - */ - $filtered_separators = apply_filters( 'wpseo_separator_options', $separators ); - - if ( is_array( $filtered_separators ) && $filtered_separators !== array() ) { - $separators = array_merge( $separators, $filtered_separators ); - } - - return $separators; - } - - /** - * Translate strings used in the option defaults - * - * @return void - */ - public function translate_defaults() { - /* translators: 1: Author name; 2: Site name. */ - $this->defaults['title-author-wpseo'] = sprintf( __( '%1$s, Author at %2$s', 'wordpress-seo' ), '%%name%%', '%%sitename%%' ) . ' %%page%% '; - $this->defaults['title-search-wpseo'] = sprintf( __( 'You searched for %s', 'wordpress-seo' ), '%%searchphrase%%' ) . ' %%page%% %%sep%% %%sitename%%'; - $this->defaults['title-404-wpseo'] = __( 'Page not found', 'wordpress-seo' ) . ' %%sep%% %%sitename%%'; - } - - - /** - * Add dynamically created default options based on available post types and taxonomies - * - * @return void - */ - public function enrich_defaults() { - - // Retrieve all the relevant post type and taxonomy arrays. - $post_type_names = get_post_types( array( 'public' => true ), 'names' ); - - $post_type_objects_custom = get_post_types( array( 'public' => true, '_builtin' => false ), 'objects' ); - - $taxonomy_names = get_taxonomies( array( 'public' => true ), 'names' ); - - - if ( $post_type_names !== array() ) { - foreach ( $post_type_names as $pt ) { - $this->defaults[ 'title-' . $pt ] = '%%title%% %%page%% %%sep%% %%sitename%%'; // Text field. - $this->defaults[ 'metadesc-' . $pt ] = ''; // Text area. - $this->defaults[ 'metakey-' . $pt ] = ''; // Text field. - $this->defaults[ 'noindex-' . $pt ] = false; - $this->defaults[ 'showdate-' . $pt ] = false; - $this->defaults[ 'hideeditbox-' . $pt ] = false; - } - unset( $pt ); - } - - if ( $post_type_objects_custom !== array() ) { - $archive = sprintf( __( '%s Archive', 'wordpress-seo' ), '%%pt_plural%%' ); - foreach ( $post_type_objects_custom as $pt ) { - if ( ! $pt->has_archive ) { - continue; - } - - $this->defaults[ 'title-ptarchive-' . $pt->name ] = $archive . ' %%page%% %%sep%% %%sitename%%'; // Text field. - $this->defaults[ 'metadesc-ptarchive-' . $pt->name ] = ''; // Text area. - $this->defaults[ 'metakey-ptarchive-' . $pt->name ] = ''; // Text field. - $this->defaults[ 'bctitle-ptarchive-' . $pt->name ] = ''; // Text field. - $this->defaults[ 'noindex-ptarchive-' . $pt->name ] = false; - } - unset( $pt ); - } - - if ( $taxonomy_names !== array() ) { - $archives = sprintf( __( '%s Archives', 'wordpress-seo' ), '%%term_title%%' ); - foreach ( $taxonomy_names as $tax ) { - $this->defaults[ 'title-tax-' . $tax ] = $archives . ' %%page%% %%sep%% %%sitename%%'; // Text field. - $this->defaults[ 'metadesc-tax-' . $tax ] = ''; // Text area. - $this->defaults[ 'metakey-tax-' . $tax ] = ''; // Text field. - $this->defaults[ 'hideeditbox-tax-' . $tax ] = false; - - if ( $tax !== 'post_format' ) { - $this->defaults[ 'noindex-tax-' . $tax ] = false; - } - else { - $this->defaults[ 'noindex-tax-' . $tax ] = true; - } - } - unset( $tax ); - } - } - - - /** - * Validate the option - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - * - * @return array Validated clean value for the option to be saved to the database - */ - protected function validate_option( $dirty, $clean, $old ) { - foreach ( $clean as $key => $value ) { - $switch_key = $this->get_switch_key( $key ); - - switch ( $switch_key ) { - /* - Text fields - */ - - /* - Covers: - 'title-home-wpseo', 'title-author-wpseo', 'title-archive-wpseo', - 'title-search-wpseo', 'title-404-wpseo' - 'title-' . $pt->name - 'title-ptarchive-' . $pt->name - 'title-tax-' . $tax->name - */ - case 'title-': - if ( isset( $dirty[ $key ] ) ) { - $clean[ $key ] = WPSEO_Utils::sanitize_text_field( $dirty[ $key ] ); - } - break; - - /* - Covers: - 'metadesc-home-wpseo', 'metadesc-author-wpseo', 'metadesc-archive-wpseo' - 'metadesc-' . $pt->name - 'metadesc-ptarchive-' . $pt->name - 'metadesc-tax-' . $tax->name - */ - case 'metadesc-': - /* - Covers: - 'metakey-home-wpseo', 'metakey-author-wpseo' - 'metakey-' . $pt->name - 'metakey-ptarchive-' . $pt->name - 'metakey-tax-' . $tax->name - */ - case 'metakey-': - /* - Covers: - ''bctitle-ptarchive-' . $pt->name - */ - case 'bctitle-ptarchive-': - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - $clean[ $key ] = WPSEO_Utils::sanitize_text_field( $dirty[ $key ] ); - } - break; - - - /* integer field - not in form*/ - case 'title_test': - if ( isset( $dirty[ $key ] ) ) { - $int = WPSEO_Utils::validate_int( $dirty[ $key ] ); - if ( $int !== false && $int >= 0 ) { - $clean[ $key ] = $int; - } - } - elseif ( isset( $old[ $key ] ) ) { - $int = WPSEO_Utils::validate_int( $old[ $key ] ); - if ( $int !== false && $int >= 0 ) { - $clean[ $key ] = $int; - } - } - break; - - /* Separator field - Radio */ - case 'separator': - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - - // Get separator fields. - $separator_fields = $this->get_separator_options(); - - // Check if the given separator is exists. - if ( isset( $separator_fields[ $dirty[ $key ] ] ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - } - break; - - /* - Boolean fields - */ - - /* - Covers: - * 'noindex-subpages-wpseo', 'noindex-author-wpseo', 'noindex-archive-wpseo' - * 'noindex-' . $pt->name - * 'noindex-ptarchive-' . $pt->name - * 'noindex-tax-' . $tax->name - * 'forcerewritetitle': - * 'usemetakeywords': - * 'noodp': - * 'noydir': - * 'disable-author': - * 'disable-date': - * 'disable-post_format'; - * 'noindex-' - * 'showdate-' - * 'showdate-'. $pt->name - * 'hideeditbox-' - * 'hideeditbox-'. $pt->name - * 'hideeditbox-tax-' . $tax->name - */ - default: - $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); - break; - } - } - - return $clean; - } - - - /** - * Clean a given option value - * - * @param array $option_value Old (not merged with defaults or filtered) option value to - * clean according to the rules for this option. - * @param string $current_version (optional) Version from which to upgrade, if not set, - * version specific upgrades will be disregarded. - * @param array $all_old_option_values (optional) Only used when importing old options to have - * access to the real old values, in contrast to the saved ones. - * - * @return array Cleaned option - */ - protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { - static $original = null; - - // Double-run this function to ensure renaming of the taxonomy options will work. - if ( ! isset( $original ) && has_action( 'wpseo_double_clean_titles', array( - $this, - 'clean', - ) ) === false - ) { - add_action( 'wpseo_double_clean_titles', array( $this, 'clean' ) ); - $original = $option_value; - } - - /* - Move options from very old option to this one - @internal Don't rename to the 'current' names straight away as that would prevent - the rename/unset combi below from working - @todo [JRF] maybe figure out a smarter way to deal with this - */ - $old_option = null; - if ( isset( $all_old_option_values ) ) { - // Ok, we have an import. - if ( isset( $all_old_option_values['wpseo_indexation'] ) && is_array( $all_old_option_values['wpseo_indexation'] ) && $all_old_option_values['wpseo_indexation'] !== array() ) { - $old_option = $all_old_option_values['wpseo_indexation']; - } - } - else { - $old_option = get_option( 'wpseo_indexation' ); - } - if ( is_array( $old_option ) && $old_option !== array() ) { - $move = array( - 'noindexauthor' => 'noindex-author', - 'disableauthor' => 'disable-author', - 'noindexdate' => 'noindex-archive', - 'noindexcat' => 'noindex-category', - 'noindextag' => 'noindex-post_tag', - 'noindexpostformat' => 'noindex-post_format', - 'noindexsubpages' => 'noindex-subpages', - ); - foreach ( $move as $old => $new ) { - if ( isset( $old_option[ $old ] ) && ! isset( $option_value[ $new ] ) ) { - $option_value[ $new ] = $old_option[ $old ]; - } - } - unset( $move, $old, $new ); - } - unset( $old_option ); - - - // Fix wrongness created by buggy version 1.2.2. - if ( isset( $option_value['title-home'] ) && $option_value['title-home'] === '%%sitename%% - %%sitedesc%% - 12345' ) { - $option_value['title-home-wpseo'] = '%%sitename%% - %%sitedesc%%'; - } - - - /* - Renaming these options to avoid ever overwritting these if a (bloody stupid) user / - programmer would use any of the following as a custom post type or custom taxonomy: - 'home', 'author', 'archive', 'search', '404', 'subpages' - - Similarly, renaming the tax options to avoid a custom post type and a taxonomy - with the same name occupying the same option - */ - $rename = array( - 'title-home' => 'title-home-wpseo', - 'title-author' => 'title-author-wpseo', - 'title-archive' => 'title-archive-wpseo', - 'title-search' => 'title-search-wpseo', - 'title-404' => 'title-404-wpseo', - 'metadesc-home' => 'metadesc-home-wpseo', - 'metadesc-author' => 'metadesc-author-wpseo', - 'metadesc-archive' => 'metadesc-archive-wpseo', - 'metakey-home' => 'metakey-home-wpseo', - 'metakey-author' => 'metakey-author-wpseo', - 'noindex-subpages' => 'noindex-subpages-wpseo', - 'noindex-author' => 'noindex-author-wpseo', - 'noindex-archive' => 'noindex-archive-wpseo', - ); - foreach ( $rename as $old => $new ) { - if ( isset( $option_value[ $old ] ) && ! isset( $option_value[ $new ] ) ) { - $option_value[ $new ] = $option_value[ $old ]; - unset( $option_value[ $old ] ); - } - } - unset( $rename, $old, $new ); - - - /** - * @internal This clean-up action can only be done effectively once the taxonomies and post_types - * have been registered, i.e. at the end of the init action. - */ - if ( isset( $original ) && current_filter() === 'wpseo_double_clean_titles' || did_action( 'wpseo_double_clean_titles' ) > 0 ) { - $rename = array( - 'title-' => 'title-tax-', - 'metadesc-' => 'metadesc-tax-', - 'metakey-' => 'metakey-tax-', - 'noindex-' => 'noindex-tax-', - 'tax-hideeditbox-' => 'hideeditbox-tax-', - - ); - $taxonomy_names = get_taxonomies( array( 'public' => true ), 'names' ); - $post_type_names = get_post_types( array( 'public' => true ), 'names' ); - $defaults = $this->get_defaults(); - if ( $taxonomy_names !== array() ) { - foreach ( $taxonomy_names as $tax ) { - foreach ( $rename as $old_prefix => $new_prefix ) { - if ( - ( isset( $original[ $old_prefix . $tax ] ) && ! isset( $original[ $new_prefix . $tax ] ) ) - && ( ! isset( $option_value[ $new_prefix . $tax ] ) - || ( isset( $option_value[ $new_prefix . $tax ] ) - && $option_value[ $new_prefix . $tax ] === $defaults[ $new_prefix . $tax ] ) ) - ) { - $option_value[ $new_prefix . $tax ] = $original[ $old_prefix . $tax ]; - - /* - Check if there is a cpt with the same name as the tax, - if so, we should make sure that the old setting hasn't been removed - */ - if ( ! isset( $post_type_names[ $tax ] ) && isset( $option_value[ $old_prefix . $tax ] ) ) { - unset( $option_value[ $old_prefix . $tax ] ); - } - else { - if ( isset( $post_type_names[ $tax ] ) && ! isset( $option_value[ $old_prefix . $tax ] ) ) { - $option_value[ $old_prefix . $tax ] = $original[ $old_prefix . $tax ]; - } - } - - if ( $old_prefix === 'tax-hideeditbox-' ) { - unset( $option_value[ $old_prefix . $tax ] ); - } - } - } - } - } - unset( $rename, $taxonomy_names, $post_type_names, $defaults, $tax, $old_prefix, $new_prefix ); - } - - - /* - Make sure the values of the variable option key options are cleaned as they - may be retained and would not be cleaned/validated then - */ - if ( is_array( $option_value ) && $option_value !== array() ) { - foreach ( $option_value as $key => $value ) { - $switch_key = $this->get_switch_key( $key ); - - // Similar to validation routine - any changes made there should be made here too. - switch ( $switch_key ) { - /* text fields */ - case 'title-': - case 'metadesc-': - case 'metakey-': - case 'bctitle-ptarchive-': - $option_value[ $key ] = WPSEO_Utils::sanitize_text_field( $value ); - break; - - case 'separator': - if ( ! array_key_exists( $value, $this->get_separator_options() ) ) { - $option_value[ $key ] = false; - } - break; - - /* - Boolean fields - */ - - /* - Covers: - * 'noindex-' - * 'showdate-' - * 'hideeditbox-' - */ - default: - $option_value[ $key ] = WPSEO_Utils::validate_bool( $value ); - break; - } - } - unset( $key, $value, $switch_key ); - } - - return $option_value; - } - - - /** - * Make sure that any set option values relating to post_types and/or taxonomies are retained, - * even when that post_type or taxonomy may not yet have been registered. - * - * @internal Overrule the abstract class version of this to make sure one extra renamed variable key - * does not get removed. IMPORTANT: keep this method in line with the parent on which it is based! - * - * @param array $dirty Original option as retrieved from the database. - * @param array $clean Filtered option where any options which shouldn't be in our option - * have already been removed and any options which weren't set - * have been set to their defaults. - * - * @return array - */ - protected function retain_variable_keys( $dirty, $clean ) { - if ( ( is_array( $this->variable_array_key_patterns ) && $this->variable_array_key_patterns !== array() ) && ( is_array( $dirty ) && $dirty !== array() ) ) { - - // Add the extra pattern. - $patterns = $this->variable_array_key_patterns; - $patterns[] = 'tax-hideeditbox-'; - - /** - * Allow altering the array with variable array key patterns - * - * @api array $patterns Array with the variable array key patterns - */ - $patterns = apply_filters( 'wpseo_option_titles_variable_array_key_patterns', $patterns ); - - foreach ( $dirty as $key => $value ) { - - // Do nothing if already in filtered option array. - if ( isset( $clean[ $key ] ) ) { - continue; - } - - foreach ( $patterns as $pattern ) { - if ( strpos( $key, $pattern ) === 0 ) { - $clean[ $key ] = $value; - break; - } - } - } - } - - return $clean; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-wpseo.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-wpseo.php deleted file mode 100644 index 37bafcff..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-wpseo.php +++ /dev/null @@ -1,247 +0,0 @@ -get_defaults(); - */ - protected $defaults = array( - // Non-form fields, set via (ajax) function. - 'blocking_files' => array(), - 'ms_defaults_set' => false, - // Non-form field, should only be set via validation routine. - 'version' => '', // Leave default as empty to ensure activation/upgrade works. - - // Form fields. - 'company_logo' => '', - 'company_name' => '', - 'company_or_person' => '', - 'disableadvanced_meta' => true, - 'onpage_indexability' => true, - 'googleverify' => '', // Text field. - 'msverify' => '', // Text field. - 'person_name' => '', - 'website_name' => '', - 'alternate_website_name' => '', - 'yandexverify' => '', - 'site_type' => '', // List of options. - 'has_multiple_authors' => '', - 'environment_type' => '', - 'content_analysis_active' => true, - 'keyword_analysis_active' => true, - 'enable_setting_pages' => true, - 'enable_admin_bar_menu' => true, - 'enable_cornerstone_content' => true, - 'show_onboarding_notice' => false, - 'first_activated_on' => false, - ); - - /** - * @var array Sub-options which should not be overloaded with multi-site defaults - */ - public $ms_exclude = array( - /* privacy */ - 'alexaverify', - 'googleverify', - 'msverify', - 'yandexverify', - ); - - /** @var array Possible values for the site_type option */ - protected $site_types = array( - '', - 'blog', - 'news', - 'smallBusiness', - 'corporateOther', - 'personalOther', - ); - - /** @var array Possible environment types. */ - protected $environment_types = array( - '', - 'production', - 'staging', - 'development', - ); - - /** - * Add the actions and filters for the option - * - * @todo [JRF => testers] Check if the extra actions below would run into problems if an option - * is updated early on and if so, change the call to schedule these for a later action on add/update - * instead of running them straight away - * - * @return \WPSEO_Option_Wpseo - */ - protected function __construct() { - parent::__construct(); - - /* Clear the cache on update/add */ - add_action( 'add_option_' . $this->option_name, array( 'WPSEO_Utils', 'clear_cache' ) ); - add_action( 'update_option_' . $this->option_name, array( 'WPSEO_Utils', 'clear_cache' ) ); - - /** - * Filter the `wpseo` option defaults. - * - * @param array $defaults Array the defaults for the `wpseo` option attributes. - */ - $this->defaults = apply_filters( 'wpseo_option_wpseo_defaults', $this->defaults ); - } - - - /** - * Get the singleton instance of this class - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Validate the option - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - * - * @return array Validated clean value for the option to be saved to the database - */ - protected function validate_option( $dirty, $clean, $old ) { - - foreach ( $clean as $key => $value ) { - switch ( $key ) { - case 'version': - $clean[ $key ] = WPSEO_VERSION; - break; - - - case 'blocking_files': - /** - * @internal [JRF] to really validate this we should also do a file_exists() - * on each array entry and remove files which no longer exist, but that might be overkill - */ - if ( isset( $dirty[ $key ] ) && is_array( $dirty[ $key ] ) ) { - $clean[ $key ] = array_unique( $dirty[ $key ] ); - } - elseif ( isset( $old[ $key ] ) && is_array( $old[ $key ] ) ) { - $clean[ $key ] = array_unique( $old[ $key ] ); - } - break; - - case 'company_or_person': - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - if ( in_array( $dirty[ $key ], array( 'company', 'person' ) ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - } - break; - - /* text fields */ - case 'company_name': - case 'person_name': - case 'website_name': - case 'alternate_website_name': - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - $clean[ $key ] = sanitize_text_field( $dirty[ $key ] ); - } - break; - - case 'company_logo': - $this->validate_url( $key, $dirty, $old, $clean ); - break; - - /* verification strings */ - case 'googleverify': - case 'msverify': - case 'yandexverify': - $this->validate_verification_string( $key, $dirty, $old, $clean ); - break; - - /* - Boolean dismiss warnings - not fields - may not be in form - (and don't need to be either as long as the default is false) - */ - case 'ms_defaults_set': - if ( isset( $dirty[ $key ] ) ) { - $clean[ $key ] = WPSEO_Utils::validate_bool( $dirty[ $key ] ); - } - elseif ( isset( $old[ $key ] ) ) { - $clean[ $key ] = WPSEO_Utils::validate_bool( $old[ $key ] ); - } - break; - - case 'site_type': - $clean[ $key ] = ''; - if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], $this->site_types, true ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - break; - case 'environment_type': - $clean[ $key ] = ''; - if ( isset( $dirty[ $key ] ) && in_array( $dirty[ $key ], $this->environment_types, true ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - break; - - case 'first_activated_on' : - $clean[ $key ] = false; - if ( isset( $dirty[ $key ] ) ) { - if ( $dirty[ $key ] === false || WPSEO_Utils::validate_int( $dirty[ $key ] ) ) { - $clean[ $key ] = $dirty[ $key ]; - } - } - break; - - /* - Boolean (checkbox) fields - */ - - /* - Covers - * 'disableadvanced_meta' - * 'yoast_tracking' - */ - default: - $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); - break; - } - } - - return $clean; - } - - - /** - * Clean a given option value - * - * @param array $option_value Old (not merged with defaults or filtered) option value to - * clean according to the rules for this option. - * @param string $current_version (optional) Version from which to upgrade, if not set, - * version specific upgrades will be disregarded. - * @param array $all_old_option_values (optional) Only used when importing old options to have - * access to the real old values, in contrast to the saved ones. - * - * @return array Cleaned option - */ - protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { - return $option_value; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-xml.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-xml.php deleted file mode 100644 index df580bc7..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option-xml.php +++ /dev/null @@ -1,260 +0,0 @@ -get_defaults(); - */ - protected $defaults = array( - 'disable_author_sitemap' => true, - 'disable_author_noposts' => true, - 'enablexmlsitemap' => true, - 'entries-per-page' => 1000, - 'excluded-posts' => '', - - /** - * Uses enrich_defaults to add more along the lines of: - * - 'user_role-' . $role_name . '-not_in_sitemap' => bool - * - 'post_types-' . $pt->name . '-not_in_sitemap' => bool - * - 'taxonomies-' . $tax->name . '-not_in_sitemap' => bool - */ - ); - - /** - * @var array Array of variable option name patterns for the option - */ - protected $variable_array_key_patterns = array( - 'user_role-', - 'post_types-', - 'taxonomies-', - ); - - - /** - * Add the actions and filters for the option - * - * @todo [JRF => testers] Check if the extra actions below would run into problems if an option - * is updated early on and if so, change the call to schedule these for a later action on add/update - * instead of running them straight away - * - * @return \WPSEO_Option_XML - */ - protected function __construct() { - parent::__construct(); - add_action( 'update_option_' . $this->option_name, array( 'WPSEO_Utils', 'clear_rewrites' ) ); - add_action( 'update_option_' . $this->option_name, array( 'WPSEO_Sitemaps_Cache', 'clear' ) ); - } - - - /** - * Get the singleton instance of this class - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Add dynamically created default options based on available post types and taxonomies - * - * @return void - */ - public function enrich_defaults() { - - $user_roles = WPSEO_Utils::get_roles(); - $filtered_user_roles = apply_filters( 'wpseo_sitemaps_supported_user_roles', $user_roles ); - if ( is_array( $filtered_user_roles ) && $filtered_user_roles !== array() ) { - foreach ( $filtered_user_roles as $role_name => $role_value ) { - $this->defaults[ 'user_role-' . $role_name . '-not_in_sitemap' ] = false; - - unset( $user_role ); - } - unset( $role_name, $role_value ); - } - unset( $user_roles, $filtered_user_roles ); - - $post_type_names = get_post_types( array( 'public' => true ), 'names' ); - $filtered_post_types = apply_filters( 'wpseo_sitemaps_supported_post_types', $post_type_names ); - - if ( is_array( $filtered_post_types ) && $filtered_post_types !== array() ) { - foreach ( $filtered_post_types as $pt ) { - if ( $pt !== 'attachment' ) { - $this->defaults[ 'post_types-' . $pt . '-not_in_sitemap' ] = false; - } - else { - $this->defaults[ 'post_types-' . $pt . '-not_in_sitemap' ] = true; - } - } - unset( $pt ); - } - unset( $post_type_names, $filtered_post_types ); - - $taxonomy_objects = get_taxonomies( array( 'public' => true ), 'objects' ); - $filtered_taxonomies = apply_filters( 'wpseo_sitemaps_supported_taxonomies', $taxonomy_objects ); - if ( is_array( $filtered_taxonomies ) && $filtered_taxonomies !== array() ) { - foreach ( $filtered_taxonomies as $tax ) { - if ( isset( $tax->labels->name ) && trim( $tax->labels->name ) != '' ) { - $this->defaults[ 'taxonomies-' . $tax->name . '-not_in_sitemap' ] = false; - } - } - unset( $tax ); - } - unset( $taxonomy_objects, $filtered_taxonomies ); - - } - - - /** - * Validate the option - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - * - * @return array Validated clean value for the option to be saved to the database - */ - protected function validate_option( $dirty, $clean, $old ) { - - foreach ( $clean as $key => $value ) { - $switch_key = $this->get_switch_key( $key ); - - switch ( $switch_key ) { - /* integer fields */ - case 'entries-per-page': - - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - - $int = WPSEO_Utils::validate_int( $dirty[ $key ] ); - - if ( $int !== false && $int > 0 ) { - - if ( $int > 50000 ) { - - $error_message = sprintf( - /* translators: 1: number; 2: number received from user. */ - __( '"Max entries per sitemap page" should be below %1$s to meet Google\'s requirements, which %2$s is not.', 'wordpress-seo' ), - number_format_i18n( 50000 ), '' . esc_html( sanitize_text_field( $dirty[ $key ] ) ) . '' - ); - add_settings_error( $this->group_name, '_' . $key, $error_message, 'error' ); - - $int = 50000; - } - - $clean[ $key ] = $int; - } - else { - - if ( isset( $old[ $key ] ) && $old[ $key ] !== '' ) { - - $int = WPSEO_Utils::validate_int( $old[ $key ] ); - - if ( $int !== false && $int > 0 ) { - $clean[ $key ] = $int; - } - } - - $error_message = sprintf( - __( '"Max entries per sitemap page" should be a positive number, which %s is not. Please correct.', 'wordpress-seo' ), - '' . esc_html( sanitize_text_field( $dirty[ $key ] ) ) . '' - ); - add_settings_error( $this->group_name, '_' . $key, $error_message, 'error' ); - } - unset( $int ); - } - break; - - case 'excluded-posts' : - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - if ( $filtered_array = filter_var_array( explode( ',', $dirty[ $key ] ), FILTER_VALIDATE_INT ) ) { - $clean[ $key ] = implode( ',', array_filter( $filtered_array, 'is_integer' ) ); - - unset( $filtered_array ); - } - } - - break; - - /* - Boolean fields - */ - - /* - Covers: - * 'disable_author_sitemap': - * 'disable_author_noposts': - * 'enablexmlsitemap': - * 'user_role-': - * 'user_role' . $role_name . '-not_in_sitemap' fields - * 'post_types-': - * 'post_types-' . $pt->name . '-not_in_sitemap' fields - * 'taxonomies-': - * 'taxonomies-' . $tax->name . '-not_in_sitemap' fields - */ - default: - $clean[ $key ] = ( isset( $dirty[ $key ] ) ? WPSEO_Utils::validate_bool( $dirty[ $key ] ) : false ); - break; - } - } - - return $clean; - } - - - /** - * Clean a given option value - * - * @param array $option_value Old (not merged with defaults or filtered) option value to - * clean according to the rules for this option. - * @param string $current_version (optional) Version from which to upgrade, if not set, - * version specific upgrades will be disregarded. - * @param array $all_old_option_values (optional) Only used when importing old options to have - * access to the real old values, in contrast to the saved ones. - * - * @return array Cleaned option - */ - protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { - /* - Make sure the values of the variable option key options are cleaned as they - may be retained and would not be cleaned/validated then - */ - if ( is_array( $option_value ) && $option_value !== array() ) { - - foreach ( $option_value as $key => $value ) { - $switch_key = $this->get_switch_key( $key ); - - // Similar to validation routine - any changes made there should be made here too. - switch ( $switch_key ) { - case 'user_role-': /* 'user_role-' . $role_name. '-not_in_sitemap' fields */ - case 'post_types-': /* 'post_types-' . $pt->name . '-not_in_sitemap' fields */ - case 'taxonomies-': /* 'taxonomies-' . $tax->name . '-not_in_sitemap' fields */ - $option_value[ $key ] = WPSEO_Utils::validate_bool( $value ); - break; - } - } - } - - return $option_value; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option.php deleted file mode 100644 index 0b662f60..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-option.php +++ /dev/null @@ -1,853 +0,0 @@ - testers] double check that validation will not cause errors when called - * from upgrade routine (some of the WP functions may not yet be available) - */ -abstract class WPSEO_Option { - - /** - * @var string Option name - MUST be set in concrete class and set to public. - */ - protected $option_name; - - /** - * @var string Option group name for use in settings forms - * - will be set automagically if not set in concrete class - * (i.e. if it confirm to the normal pattern 'yoast' . $option_name . 'options', - * only set in conrete class if it doesn't) - */ - public $group_name; - - /** - * @var bool Whether to include the option in the return for WPSEO_Options::get_all(). - * Also determines which options are copied over for ms_(re)set_blog(). - */ - public $include_in_all = true; - - /** - * @var bool Whether this option is only for when the install is multisite. - */ - public $multisite_only = false; - - /** - * @var array Array of defaults for the option - MUST be set in concrete class. - * Shouldn't be requested directly, use $this->get_defaults(); - */ - protected $defaults; - - /** - * @var array Array of variable option name patterns for the option - if any - - * Set this when the option contains array keys which vary based on post_type - * or taxonomy - */ - protected $variable_array_key_patterns; - - /** - * @var array Array of sub-options which should not be overloaded with multi-site defaults - */ - public $ms_exclude = array(); - - /** - * @var object Instance of this class - */ - protected static $instance; - - - /* *********** INSTANTIATION METHODS *********** */ - - /** - * Add all the actions and filters for the option - * - * @return \WPSEO_Option - */ - protected function __construct() { - - /* Add filters which get applied to the get_options() results */ - $this->add_default_filters(); // Return defaults if option not set. - $this->add_option_filters(); // Merge with defaults if option *is* set. - - - if ( $this->multisite_only !== true ) { - /** - * The option validation routines remove the default filters to prevent failing - * to insert an option if it's new. Let's add them back afterwards. - */ - add_action( 'add_option', array( $this, 'add_default_filters' ) ); // Adding back after INSERT. - - add_action( 'update_option', array( $this, 'add_default_filters' ) ); - } - else if ( is_multisite() ) { - /* - The option validation routines remove the default filters to prevent failing - to insert an option if it's new. Let's add them back afterwards. - - For site_options, this method is not foolproof as these actions are not fired - on an insert/update failure. Please use the WPSEO_Options::update_site_option() method - for updating site options to make sure the filters are in place. - */ - add_action( 'add_site_option_' . $this->option_name, array( $this, 'add_default_filters' ) ); - add_action( 'update_site_option_' . $this->option_name, array( $this, 'add_default_filters' ) ); - - } - - - /* - Make sure the option will always get validated, independently of register_setting() - (only available on back-end) - */ - add_filter( 'sanitize_option_' . $this->option_name, array( $this, 'validate' ) ); - - /* Register our option for the admin pages */ - add_action( 'admin_init', array( $this, 'register_setting' ) ); - - - /* Set option group name if not given */ - if ( ! isset( $this->group_name ) || $this->group_name === '' ) { - $this->group_name = 'yoast_' . $this->option_name . '_options'; - } - - /* Translate some defaults as early as possible - textdomain is loaded in init on priority 1 */ - if ( method_exists( $this, 'translate_defaults' ) ) { - add_action( 'init', array( $this, 'translate_defaults' ), 2 ); - } - - /** - * Enrich defaults once custom post types and taxonomies have been registered - * which is normally done on the init action. - * - * @todo - [JRF/testers] verify that none of the options which are only available after - * enrichment are used before the enriching - */ - if ( method_exists( $this, 'enrich_defaults' ) ) { - add_action( 'init', array( $this, 'enrich_defaults' ), 99 ); - } - } - -// @codingStandardsIgnoreStart - - /** - * All concrete classes *must* contain the get_instance method - * @internal Unfortunately I can't define it as an abstract as it also *has* to be static.... - */ - // abstract protected static function get_instance(); - - - /** - * Concrete classes *may* contain a translate_defaults method - */ - // abstract public function translate_defaults(); - - - /** - * Concrete classes *may* contain a enrich_defaults method to add additional defaults once - * all post_types and taxonomies have been registered - */ - // abstract public function enrich_defaults(); - - /* *********** METHODS INFLUENCING get_option() *********** */ - - /** - * Add filters to make sure that the option default is returned if the option is not set - * - * @return void - */ - public function add_default_filters() { - // Don't change, needs to check for false as could return prio 0 which would evaluate to false. - if ( has_filter( 'default_option_' . $this->option_name, array( $this, 'get_defaults' ) ) === false ) { - add_filter( 'default_option_' . $this->option_name, array( $this, 'get_defaults' ) ); - } - } - - // @codingStandardsIgnoreStart - /** - * Abusing a filter to re-add our default filters - * WP 3.7 specific as update_option action hook was in the wrong place temporarily - * - * @see http://core.trac.wordpress.org/ticket/25705 - * - * @param mixed $new_value Pass through value in filter. - * - * @deprecated 3.0 WP 3.7 is no longer supported. - * - * @todo Drop this and logic adding it. R. - * - * @return mixed unchanged value - */ - public function wp37_add_default_filters( $new_value ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - - $this->add_default_filters(); - - return $new_value; - } - - /** - * Validate webmaster tools & Pinterest verification strings - * - * @param string $key Key to check, by type of service. - * @param array $dirty Dirty data. - * @param array $old Old data. - * @param array $clean Clean data by reference. - */ - public function validate_verification_string( $key, $dirty, $old, &$clean ) { - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - $meta = $dirty[ $key ]; - if ( strpos( $meta, 'content=' ) ) { - // Make sure we only have the real key, not a complete meta tag. - preg_match( '`content=([\'"])?([^\'"> ]+)(?:\1|[ />])`', $meta, $match ); - if ( isset( $match[2] ) ) { - $meta = $match[2]; - } - unset( $match ); - } - - $meta = sanitize_text_field( $meta ); - if ( $meta !== '' ) { - $regex = '`^[A-Fa-f0-9_-]+$`'; - $service = ''; - - switch ( $key ) { - case 'googleverify': - $regex = '`^[A-Za-z0-9_-]+$`'; - $service = 'Google Webmaster tools'; - break; - - case 'msverify': - $service = 'Bing Webmaster tools'; - break; - - case 'pinterestverify': - $service = 'Pinterest'; - break; - - case 'yandexverify': - $service = 'Yandex Webmaster tools'; - break; - } - - if ( preg_match( $regex, $meta ) ) { - $clean[ $key ] = $meta; - } - else { - if ( isset( $old[ $key ] ) && preg_match( $regex, $old[ $key ] ) ) { - $clean[ $key ] = $old[ $key ]; - } - if ( function_exists( 'add_settings_error' ) ) { - add_settings_error( - $this->group_name, // Slug title of the setting. - '_' . $key, // Suffix-id for the error message box. - /* translators: 1: Verification string from user input; 2: Service name. */ - sprintf( __( '%1$s does not seem to be a valid %2$s verification string. Please correct.', 'wordpress-seo' ), '' . esc_html( $meta ) . '', $service ), // The error message. - 'error' // Error type, either 'error' or 'updated'. - ); - } - } - } - } - } - - /** - * @param string $key Key to check, by type of service. - * @param array $dirty Dirty data. - * @param array $old Old data. - * @param array $clean Clean data by reference. - */ - public function validate_url( $key, $dirty, $old, &$clean ) { - if ( isset( $dirty[ $key ] ) && $dirty[ $key ] !== '' ) { - $url = WPSEO_Utils::sanitize_url( $dirty[ $key ] ); - if ( $url !== '' ) { - $clean[ $key ] = $url; - } - else { - if ( isset( $old[ $key ] ) && $old[ $key ] !== '' ) { - $url = WPSEO_Utils::sanitize_url( $old[ $key ] ); - if ( $url !== '' ) { - $clean[ $key ] = $url; - } - } - if ( function_exists( 'add_settings_error' ) ) { - $url = WPSEO_Utils::sanitize_url( $dirty[ $key ] ); - add_settings_error( - $this->group_name, // Slug title of the setting. - '_' . $key, // Suffix-id for the error message box. - sprintf( __( '%s does not seem to be a valid url. Please correct.', 'wordpress-seo' ), '' . esc_html( $url ) . '' ), // The error message. - 'error' // Error type, either 'error' or 'updated'. - ); - } - } - } - } - - /** - * Remove the default filters. - * Called from the validate() method to prevent failure to add new options - * - * @return void - */ - public function remove_default_filters() { - remove_filter( 'default_option_' . $this->option_name, array( $this, 'get_defaults' ) ); - } - - - /** - * Get the enriched default value for an option - * - * Checks if the concrete class contains an enrich_defaults() method and if so, runs it. - * - * @internal the enrich_defaults method is used to set defaults for variable array keys in an option, - * such as array keys depending on post_types and/or taxonomies - * - * @return array - */ - public function get_defaults() { - if ( method_exists( $this, 'translate_defaults' ) ) { - $this->translate_defaults(); - } - - if ( method_exists( $this, 'enrich_defaults' ) ) { - $this->enrich_defaults(); - } - - return apply_filters( 'wpseo_defaults', $this->defaults, $this->option_name ); - } - - - /** - * Add filters to make sure that the option is merged with its defaults before being returned - * - * @return void - */ - public function add_option_filters() { - // Don't change, needs to check for false as could return prio 0 which would evaluate to false. - if ( has_filter( 'option_' . $this->option_name, array( $this, 'get_option' ) ) === false ) { - add_filter( 'option_' . $this->option_name, array( $this, 'get_option' ) ); - } - } - - - /** - * Remove the option filters. - * Called from the clean_up methods to make sure we retrieve the original old option - * - * @return void - */ - public function remove_option_filters() { - remove_filter( 'option_' . $this->option_name, array( $this, 'get_option' ) ); - } - - - /** - * Merge an option with its default values - * - * This method should *not* be called directly!!! It is only meant to filter the get_option() results - * - * @param mixed $options Option value. - * - * @return mixed Option merged with the defaults for that option - */ - public function get_option( $options = null ) { - $filtered = $this->array_filter_merge( $options ); - - /* - If the option contains variable option keys, make sure we don't remove those settings - - even if the defaults are not complete yet. - Unfortunately this means we also won't be removing the settings for post types or taxonomies - which are no longer in the WP install, but rather that than the other way around - */ - if ( isset( $this->variable_array_key_patterns ) ) { - $filtered = $this->retain_variable_keys( $options, $filtered ); - } - - return $filtered; - } - - - /* *********** METHODS influencing add_uption(), update_option() and saving from admin pages *********** */ - - /** - * Register (whitelist) the option for the configuration pages. - * The validation callback is already registered separately on the sanitize_option hook, - * so no need to double register. - * - * @return void - */ - public function register_setting() { - if ( WPSEO_Utils::grant_access() ) { - register_setting( $this->group_name, $this->option_name ); - } - } - - - /** - * Validate the option - * - * @param mixed $option_value The unvalidated new value for the option. - * - * @return array Validated new value for the option - */ - public function validate( $option_value ) { - $clean = $this->get_defaults(); - - /* Return the defaults if the new value is empty */ - if ( ! is_array( $option_value ) || $option_value === array() ) { - return $clean; - } - - - $option_value = array_map( array( 'WPSEO_Utils', 'trim_recursive' ), $option_value ); - if ( $this->multisite_only !== true ) { - $old = get_option( $this->option_name ); - } - else { - $old = get_site_option( $this->option_name ); - } - $clean = $this->validate_option( $option_value, $clean, $old ); - - /* Retain the values for variable array keys even when the post type/taxonomy is not yet registered */ - if ( isset( $this->variable_array_key_patterns ) ) { - $clean = $this->retain_variable_keys( $option_value, $clean ); - } - - $this->remove_default_filters(); - - return $clean; - } - - - /** - * All concrete classes must contain a validate_option() method which validates all - * values within the option - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - */ - abstract protected function validate_option( $dirty, $clean, $old ); - - - /* *********** METHODS for ADDING/UPDATING/UPGRADING the option *********** */ - - /** - * Retrieve the real old value (unmerged with defaults) - * - * @return array|bool the original option value (which can be false if the option doesn't exist) - */ - protected function get_original_option() { - $this->remove_default_filters(); - $this->remove_option_filters(); - - // Get (unvalidated) array, NOT merged with defaults. - if ( $this->multisite_only !== true ) { - $option_value = get_option( $this->option_name ); - } - else { - $option_value = get_site_option( $this->option_name ); - } - - $this->add_option_filters(); - $this->add_default_filters(); - - return $option_value; - } - - /** - * Add the option if it doesn't exist for some strange reason - * - * @uses WPSEO_Option::get_original_option() - * - * @return void - */ - public function maybe_add_option() { - if ( $this->get_original_option() === false ) { - if ( $this->multisite_only !== true ) { - update_option( $this->option_name, $this->get_defaults() ); - } - else { - $this->update_site_option( $this->get_defaults() ); - } - } - } - - - /** - * Update a site_option - * - * @internal This special method is only needed for multisite options, but very needed indeed there. - * The order in which certain functions and hooks are run is different between get_option() and - * get_site_option() which means in practice that the removing of the default filters would be - * done too late and the re-adding of the default filters might not be done at all. - * Aka: use the WPSEO_Options::update_site_option() method (which calls this method) for - * safely adding/updating multisite options. - * - * @param mixed $value The new value for the option. - * - * @return bool whether the update was succesfull - */ - public function update_site_option( $value ) { - if ( $this->multisite_only === true && is_multisite() ) { - $this->remove_default_filters(); - $result = update_site_option( $this->option_name, $value ); - $this->add_default_filters(); - - return $result; - } - else { - return false; - } - } - - - /** - * Retrieve the real old value (unmerged with defaults), clean and re-save the option - * - * @uses WPSEO_Option::get_original_option() - * @uses WPSEO_Option::import() - * - * @param string $current_version (optional) Version from which to upgrade, if not set, version specific upgrades will be disregarded. - * - * @return void - */ - public function clean( $current_version = null ) { - $option_value = $this->get_original_option(); - $this->import( $option_value, $current_version ); - } - - - /** - * Clean and re-save the option - * - * @uses clean_option() method from concrete class if it exists - * - * @todo [JRF/whomever] Figure out a way to show settings error during/after the upgrade - maybe - * something along the lines of: - * -> add them to a property in this class - * -> if that property isset at the end of the routine and add_settings_error function does not exist, - * save as transient (or update the transient if one already exists) - * -> next time an admin is in the WP back-end, show the errors and delete the transient or only delete it - * once the admin has dismissed the message (add ajax function) - * Important: all validation routines which add_settings_errors would need to be changed for this to work - * - * @param array $option_value Option value to be imported. - * @param string $current_version (optional) Version from which to upgrade, if not set, version specific upgrades will be disregarded. - * @param array $all_old_option_values (optional) Only used when importing old options to have access to the real old values, in contrast to the saved ones. - * - * @return void - */ - public function import( $option_value, $current_version = null, $all_old_option_values = null ) { - if ( $option_value === false ) { - $option_value = $this->get_defaults(); - } - elseif ( is_array( $option_value ) && method_exists( $this, 'clean_option' ) ) { - $option_value = $this->clean_option( $option_value, $current_version, $all_old_option_values ); - } - - /* - Save the cleaned value - validation will take care of cleaning out array keys which - should no longer be there - */ - if ( $this->multisite_only !== true ) { - update_option( $this->option_name, $option_value ); - } - else { - $this->update_site_option( $this->option_name, $option_value ); - } - } - - - /** - * Concrete classes *may* contain a clean_option method which will clean out old/renamed - * values within the option - */ - // abstract public function clean_option( $option_value, $current_version = null, $all_old_option_values = null ); - /* *********** HELPER METHODS for internal use *********** */ - - /** - * Helper method - Combines a fixed array of default values with an options array - * while filtering out any keys which are not in the defaults array. - * - * @todo [JRF] - shouldn't this be a straight array merge ? at the end of the day, the validation - * removes any invalid keys on save - * - * @param array $options (Optional) Current options. If not set, the option defaults for the $option_key will be returned. - * - * @return array Combined and filtered options array. - */ - protected function array_filter_merge( $options = null ) { - - $defaults = $this->get_defaults(); - - if ( ! isset( $options ) || $options === false || $options === array() ) { - return $defaults; - } - - $options = (array) $options; - - /* - $filtered = array(); - - if ( $defaults !== array() ) { - foreach ( $defaults as $key => $default_value ) { - // @todo should this walk through array subkeys ? - $filtered[ $key ] = ( isset( $options[ $key ] ) ? $options[ $key ] : $default_value ); - } - } - */ - $filtered = array_merge( $defaults, $options ); - - return $filtered; - } - - - /** - * Make sure that any set option values relating to post_types and/or taxonomies are retained, - * even when that post_type or taxonomy may not yet have been registered. - * - * @internal The wpseo_titles concrete class overrules this method. Make sure that any changes - * applied here, also get ported to that version. - * - * @param array $dirty Original option as retrieved from the database. - * @param array $clean Filtered option where any options which shouldn't be in our option - * have already been removed and any options which weren't set - * have been set to their defaults. - * - * @return array - */ - protected function retain_variable_keys( $dirty, $clean ) { - if ( ( is_array( $this->variable_array_key_patterns ) && $this->variable_array_key_patterns !== array() ) && ( is_array( $dirty ) && $dirty !== array() ) ) { - foreach ( $dirty as $key => $value ) { - - // Do nothing if already in filtered options. - if ( isset( $clean[ $key ] ) ) { - continue; - } - - foreach ( $this->variable_array_key_patterns as $pattern ) { - - if ( strpos( $key, $pattern ) === 0 ) { - $clean[ $key ] = $value; - break; - } - } - } - } - - return $clean; - } - - - /** - * Check whether a given array key conforms to one of the variable array key patterns for this option - * - * @usedby validate_option() methods for options with variable array keys - * - * @param string $key Array key to check. - * - * @return string Pattern if it conforms, original array key if it doesn't or if the option - * does not have variable array keys - */ - protected function get_switch_key( $key ) { - if ( ! isset( $this->variable_array_key_patterns ) || ( ! is_array( $this->variable_array_key_patterns ) || $this->variable_array_key_patterns === array() ) ) { - return $key; - } - - foreach ( $this->variable_array_key_patterns as $pattern ) { - if ( strpos( $key, $pattern ) === 0 ) { - return $pattern; - } - } - - return $key; - } - - - /* *********** DEPRECATED METHODS *********** */ - - // @codeCoverageIgnoreStart - - /** - * Emulate the WP native sanitize_text_field function in a %%variable%% safe way - * - * @see https://core.trac.wordpress.org/browser/trunk/src/wp-includes/formatting.php for the original - * - * @deprecated 1.5.6.1 - * @deprecated use WPSEO_Utils::sanitize_text_field() - * @see WPSEO_Utils::sanitize_text_field() - * - * @param string $value String value to sanitize. - * - * @return string - */ - public static function sanitize_text_field( $value ) { - _deprecated_function( __METHOD__, 'WPSEO 1.5.6.1', 'WPSEO_Utils::sanitize_text_field()' ); - - return WPSEO_Utils::sanitize_text_field( $value ); - } - - - /** - * Sanitize a url for saving to the database - * Not to be confused with the old native WP function - * - * @deprecated 1.5.6.1 - * @deprecated use WPSEO_Utils::sanitize_url() - * @see WPSEO_Utils::sanitize_url() - * - * @param string $value URL string to sanitize. - * @param array $allowed_protocols Set of allowed protocols. - * - * @return string - */ - public static function sanitize_url( $value, $allowed_protocols = array( 'http', 'https' ) ) { - _deprecated_function( __METHOD__, 'WPSEO 1.5.6.1', 'WPSEO_Utils::sanitize_url()' ); - - return WPSEO_Utils::sanitize_url( $value, $allowed_protocols ); - } - - /** - * Validate a value as boolean - * - * @deprecated 1.5.6.1 - * @deprecated use WPSEO_Utils::validate_bool() - * @see WPSEO_Utils::validate_bool() - * - * @static - * - * @param mixed $value Value to validate. - * - * @return bool - */ - public static function validate_bool( $value ) { - _deprecated_function( __METHOD__, 'WPSEO 1.5.6.1', 'WPSEO_Utils::validate_bool()' ); - - return WPSEO_Utils::validate_bool( $value ); - } - - /** - * Cast a value to bool - * - * @deprecated 1.5.6.1 - * @deprecated use WPSEO_Utils::emulate_filter_bool() - * @see WPSEO_Utils::emulate_filter_bool() - * - * @static - * - * @param mixed $value Value to cast. - * - * @return bool - */ - public static function emulate_filter_bool( $value ) { - _deprecated_function( __METHOD__, 'WPSEO 1.5.6.1', 'WPSEO_Utils::emulate_filter_bool()' ); - - return WPSEO_Utils::emulate_filter_bool( $value ); - } - - - /** - * Validate a value as integer - * - * @deprecated 1.5.6.1 - * @deprecated use WPSEO_Utils::validate_int() - * @see WPSEO_Utils::validate_int() - * - * @param mixed $value Value to validate. - * - * @return mixed int or false in case of failure to convert to int - */ - public static function validate_int( $value ) { - _deprecated_function( __METHOD__, 'WPSEO 1.5.6.1', 'WPSEO_Utils::validate_int()' ); - - return WPSEO_Utils::validate_int( $value ); - } - - /** - * Cast a value to integer - * - * @deprecated 1.5.6.1 - * @deprecated use WPSEO_Utils::emulate_filter_int() - * @see WPSEO_Utils::emulate_filter_int() - * - * @static - * - * @param mixed $value Value to cast. - * - * @return int|bool - */ - public static function emulate_filter_int( $value ) { - _deprecated_function( __METHOD__, 'WPSEO 1.5.6.1', 'WPSEO_Utils::emulate_filter_int()' ); - - return WPSEO_Utils::emulate_filter_int( $value ); - } - - - /** - * Recursively trim whitespace round a string value or of string values within an array - * Only trims strings to avoid typecasting a variable (to string) - * - * @deprecated 1.5.6.1 - * @deprecated use WPSEO_Utils::trim_recursive() - * @see WPSEO_Utils::trim_recursive() - * - * @static - * - * @param mixed $value Value to trim or array of values to trim. - * - * @return mixed Trimmed value or array of trimmed values - */ - public static function trim_recursive( $value ) { - _deprecated_function( __METHOD__, 'WPSEO 1.5.6.1', 'WPSEO_Utils::trim_recursive()' ); - - return WPSEO_Utils::trim_recursive( $value ); - } - // @codeCoverageIgnoreEnd -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-options.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-options.php deleted file mode 100644 index d92be221..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-options.php +++ /dev/null @@ -1,478 +0,0 @@ - (string) name of concrete class for the option - * @static - */ - public static $options = array( - 'wpseo' => 'WPSEO_Option_Wpseo', - 'wpseo_permalinks' => 'WPSEO_Option_Permalinks', - 'wpseo_titles' => 'WPSEO_Option_Titles', - 'wpseo_social' => 'WPSEO_Option_Social', - 'wpseo_rss' => 'WPSEO_Option_RSS', - 'wpseo_internallinks' => 'WPSEO_Option_InternalLinks', - 'wpseo_xml' => 'WPSEO_Option_XML', - 'wpseo_ms' => 'WPSEO_Option_MS', - 'wpseo_taxonomy_meta' => 'WPSEO_Taxonomy_Meta', - ); - - /** - * @var array Array of instantiated option objects - */ - protected static $option_instances = array(); - - /** - * @var object Instance of this class - */ - protected static $instance; - - - /** - * Instantiate all the WPSEO option management classes - */ - protected function __construct() { - $is_multisite = is_multisite(); - - foreach ( self::$options as $option_name => $option_class ) { - $instance = call_user_func( array( $option_class, 'get_instance' ) ); - - if ( ! $instance->multisite_only || $is_multisite ) { - self::$option_instances[ $option_name ] = $instance; - } - else { - unset( self::$options[ $option_name ] ); - } - } - } - - /** - * Get the singleton instance of this class - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Get the group name of an option for use in the settings form - * - * @param string $option_name the option for which you want to retrieve the option group name. - * - * @return string|bool - */ - public static function get_group_name( $option_name ) { - if ( isset( self::$option_instances[ $option_name ] ) ) { - return self::$option_instances[ $option_name ]->group_name; - } - - return false; - } - - /** - * Get a specific default value for an option - * - * @param string $option_name The option for which you want to retrieve a default. - * @param string $key The key within the option who's default you want. - * - * @return mixed - */ - public static function get_default( $option_name, $key ) { - if ( isset( self::$option_instances[ $option_name ] ) ) { - $defaults = self::$option_instances[ $option_name ]->get_defaults(); - if ( isset( $defaults[ $key ] ) ) { - return $defaults[ $key ]; - } - } - - return null; - } - - /** - * Update a site_option - * - * @param string $option_name The option name of the option to save. - * @param mixed $value The new value for the option. - * - * @return bool - */ - public static function update_site_option( $option_name, $value ) { - if ( is_network_admin() && isset( self::$option_instances[ $option_name ] ) ) { - return self::$option_instances[ $option_name ]->update_site_option( $value ); - } - else { - return false; - } - } - - /** - * Get the instantiated option instance - * - * @param string $option_name The option for which you want to retrieve the instance. - * - * @return object|bool - */ - public static function get_option_instance( $option_name ) { - if ( isset( self::$option_instances[ $option_name ] ) ) { - return self::$option_instances[ $option_name ]; - } - - return false; - } - - /** - * Retrieve an array of the options which should be included in get_all() and reset(). - * - * @static - * @return array Array of option names - */ - public static function get_option_names() { - static $option_names = array(); - - if ( $option_names === array() ) { - foreach ( self::$option_instances as $option_name => $option_object ) { - if ( $option_object->include_in_all === true ) { - $option_names[] = $option_name; - } - } - $option_names = apply_filters( 'wpseo_options', $option_names ); - } - - return $option_names; - } - - /** - * Retrieve all the options for the SEO plugin in one go. - * - * @todo [JRF] see if we can get some extra efficiency for this one, though probably not as options may - * well change between calls (enriched defaults and such) - * - * @static - * @return array Array combining the values of all the options - */ - public static function get_all() { - return self::get_options( self::get_option_names() ); - } - - /** - * Retrieve one or more options for the SEO plugin. - * - * @static - * - * @param array $option_names An array of option names of the options you want to get. - * - * @return array Array combining the values of the requested options - */ - public static function get_options( array $option_names ) { - $options = array(); - $option_names = array_filter( $option_names, 'is_string' ); - foreach ( $option_names as $option_name ) { - if ( isset( self::$option_instances[ $option_name ] ) ) { - $option = self::get_option( $option_name ); - $options = array_merge( $options, $option ); - } - } - - return $options; - } - - /** - * Retrieve a single option for the SEO plugin. - * - * @static - * - * @param string $option_name the name of the option you want to get. - * - * @return array Array containing the requested option - */ - public static function get_option( $option_name ) { - $option = null; - if ( is_string( $option_name ) && ! empty( $option_name ) ) { - if ( isset( self::$option_instances[ $option_name ] ) ) { - if ( self::$option_instances[ $option_name ]->multisite_only !== true ) { - $option = get_option( $option_name ); - } - else { - $option = get_site_option( $option_name ); - } - } - } - - return $option; - } - - /** - * Get an option only if it's been auto-loaded. - * - * @static - * - * @param string $option The option to retrieve. - * @param bool|mixed $default A default value to return. - * - * @return bool|mixed - */ - public static function get_autoloaded_option( $option, $default = false ) { - $value = wp_cache_get( $option, 'options' ); - if ( false === $value ) { - $passed_default = func_num_args() > 1; - - return apply_filters( "default_option_{$option}", $default, $option, $passed_default ); - } - - return apply_filters( "option_{$option}", maybe_unserialize( $value ), $option ); - } - - /** - * Run the clean up routine for one or all options - * - * @param array|string $option_name (optional) the option you want to clean or an array of - * option names for the options you want to clean. - * If not set, all options will be cleaned. - * @param string $current_version (optional) Version from which to upgrade, if not set, - * version specific upgrades will be disregarded. - * - * @return void - */ - public static function clean_up( $option_name = null, $current_version = null ) { - if ( isset( $option_name ) && is_string( $option_name ) && $option_name !== '' ) { - if ( isset( self::$option_instances[ $option_name ] ) ) { - self::$option_instances[ $option_name ]->clean( $current_version ); - } - } - elseif ( isset( $option_name ) && is_array( $option_name ) && $option_name !== array() ) { - foreach ( $option_name as $option ) { - if ( isset( self::$option_instances[ $option ] ) ) { - self::$option_instances[ $option ]->clean( $current_version ); - } - } - unset( $option ); - } - else { - foreach ( self::$option_instances as $instance ) { - $instance->clean( $current_version ); - } - unset( $instance ); - - // If we've done a full clean-up, we can safely remove this really old option. - delete_option( 'wpseo_indexation' ); - } - } - - - /** - * Check that all options exist in the database and add any which don't - * - * @return void - */ - public static function ensure_options_exist() { - foreach ( self::$option_instances as $instance ) { - $instance->maybe_add_option(); - } - } - - /** - * Correct the inadvertent removal of the fallback to default values from the breadcrumbs - * - * @since 1.5.2.3 - */ - public static function bring_back_breadcrumb_defaults() { - if ( isset( self::$option_instances['wpseo_internallinks'] ) ) { - self::$option_instances['wpseo_internallinks']->bring_back_defaults(); - } - } - - /** - * Initialize some options on first install/activate/reset - * - * @static - * @return void - */ - public static function initialize() { - /* Force WooThemes to use Yoast SEO data. */ - if ( function_exists( 'woo_version_init' ) ) { - update_option( 'seo_woo_use_third_party_data', 'true' ); - } - } - - /** - * Reset all options to their default values and rerun some tests - * - * @static - * @return void - */ - public static function reset() { - if ( ! is_multisite() ) { - $option_names = self::get_option_names(); - if ( is_array( $option_names ) && $option_names !== array() ) { - foreach ( $option_names as $option_name ) { - delete_option( $option_name ); - update_option( $option_name, get_option( $option_name ) ); - } - } - unset( $option_names ); - } - else { - // Reset MS blog based on network default blog setting. - self::reset_ms_blog( get_current_blog_id() ); - } - - self::initialize(); - } - - /** - * Initialize default values for a new multisite blog - * - * @static - * - * @param bool $force_init Whether to always do the initialization routine (title/desc test). - * - * @return void - */ - public static function maybe_set_multisite_defaults( $force_init = false ) { - $option = get_option( 'wpseo' ); - - if ( is_multisite() ) { - if ( $option['ms_defaults_set'] === false ) { - self::reset_ms_blog( get_current_blog_id() ); - self::initialize(); - } - else if ( $force_init === true ) { - self::initialize(); - } - } - } - - /** - * Reset all options for a specific multisite blog to their default values based upon a - * specified default blog if one was chosen on the network page or the plugin defaults if it was not - * - * @static - * - * @param int|string $blog_id Blog id of the blog for which to reset the options. - * - * @return void - */ - public static function reset_ms_blog( $blog_id ) { - if ( is_multisite() ) { - $options = get_site_option( 'wpseo_ms' ); - $option_names = self::get_option_names(); - - if ( is_array( $option_names ) && $option_names !== array() ) { - $base_blog_id = $blog_id; - if ( $options['defaultblog'] !== '' && $options['defaultblog'] != 0 ) { - $base_blog_id = $options['defaultblog']; - } - - foreach ( $option_names as $option_name ) { - delete_blog_option( $blog_id, $option_name ); - - $new_option = get_blog_option( $base_blog_id, $option_name ); - - /* Remove sensitive, theme dependent and site dependent info */ - if ( isset( self::$option_instances[ $option_name ] ) && self::$option_instances[ $option_name ]->ms_exclude !== array() ) { - foreach ( self::$option_instances[ $option_name ]->ms_exclude as $key ) { - unset( $new_option[ $key ] ); - } - } - - if ( $option_name === 'wpseo' ) { - $new_option['ms_defaults_set'] = true; - } - - update_blog_option( $blog_id, $option_name, $new_option ); - } - } - } - } - - /** - * Saves the option to the database. - * - * @param string $wpseo_options_group_name The name for the wpseo option group in the database. - * @param string $option_name The name for the option to set. - * @param * $option_value The value for the option. - * - * @return boolean Returns true if the option is successfully saved in the database. - */ - public static function save_option( $wpseo_options_group_name, $option_name, $option_value ) { - $options = WPSEO_Options::get_option( $wpseo_options_group_name ); - $options[ $option_name ] = $option_value; - update_option( $wpseo_options_group_name, $options ); - - // Check if everything got saved properly. - $saved_option = self::get_option( $wpseo_options_group_name ); - return $saved_option[ $option_name ] === $options[ $option_name ]; - } - - /********************** DEPRECATED FUNCTIONS **********************/ - - // @codeCoverageIgnoreStart - /** - * Check whether the current user is allowed to access the configuration. - * - * @deprecated 1.5.6.1 - * @deprecated use WPSEO_Utils::grant_access() - * @see WPSEO_Utils::grant_access() - * - * @return boolean - */ - public static function grant_access() { - _deprecated_function( __METHOD__, 'WPSEO 1.5.6.1', 'WPSEO_Utils::grant_access()' ); - - return WPSEO_Utils::grant_access(); - } - - /** - * Clears the WP or W3TC cache depending on which is used - * - * @deprecated 1.5.6.1 - * @deprecated use WPSEO_Utils::clear_cache() - * @see WPSEO_Utils::clear_cache() - */ - public static function clear_cache() { - _deprecated_function( __METHOD__, 'WPSEO 1.5.6.1', 'WPSEO_Utils::clear_cache()' ); - WPSEO_Utils::clear_cache(); - } - - - /** - * Flush W3TC cache after succesfull update/add of taxonomy meta option - * - * @deprecated 1.5.6.1 - * @deprecated use WPSEO_Utils::flush_w3tc_cache() - * @see WPSEO_Utils::flush_w3tc_cache() - */ - public static function flush_w3tc_cache() { - _deprecated_function( __METHOD__, 'WPSEO 1.5.6.1', 'WPSEO_Utils::flush_w3tc_cache()' ); - WPSEO_Utils::flush_w3tc_cache(); - } - - - /** - * Clear rewrite rules - * - * @deprecated 1.5.6.1 - * @deprecated use WPSEO_Utils::clear_rewrites() - * @see WPSEO_Utils::clear_rewrites() - */ - public static function clear_rewrites() { - _deprecated_function( __METHOD__, 'WPSEO 1.5.6.1', 'WPSEO_Utils::clear_rewrites()' ); - WPSEO_Utils::clear_rewrites(); - } - // @codeCoverageIgnoreEnd -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-taxonomy-meta.php b/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-taxonomy-meta.php deleted file mode 100644 index c8c0d15e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/options/class-wpseo-taxonomy-meta.php +++ /dev/null @@ -1,600 +0,0 @@ -get_defaults(); - * @internal Important: in contrast to most defaults, the below array format is - * very bare. The real option is in the format [taxonomy_name][term_id][...] - * where [...] is any of the $defaults_per_term options shown below. - * This is of course taken into account in the below methods. - */ - protected $defaults = array(); - - - /** - * @var string Option name - same as $option_name property, but now also available to static methods - * @static - */ - public static $name; - - /** - * @var array Array of defaults for individual taxonomy meta entries - * @static - */ - public static $defaults_per_term = array( - 'wpseo_title' => '', - 'wpseo_desc' => '', - 'wpseo_metakey' => '', - 'wpseo_canonical' => '', - 'wpseo_bctitle' => '', - 'wpseo_noindex' => 'default', - 'wpseo_sitemap_include' => '-', - 'wpseo_focuskw' => '', - 'wpseo_linkdex' => '', - 'wpseo_content_score' => '', - - // Social fields. - 'wpseo_opengraph-title' => '', - 'wpseo_opengraph-description' => '', - 'wpseo_opengraph-image' => '', - 'wpseo_twitter-title' => '', - 'wpseo_twitter-description' => '', - 'wpseo_twitter-image' => '', - ); - - /** - * @var array Available index options - * Used for form generation and input validation - * - * @static - * - * @internal Labels (translation) added on admin_init via WPSEO_Taxonomy::translate_meta_options() - */ - public static $no_index_options = array( - 'default' => '', - 'index' => '', - 'noindex' => '', - ); - - /** - * @var array Available sitemap include options - * Used for form generation and input validation - * - * @static - * - * @internal Labels (translation) added on admin_init via WPSEO_Taxonomy::translate_meta_options() - */ - public static $sitemap_include_options = array( - '-' => '', - 'always' => '', - 'never' => '', - ); - - - /** - * Add the actions and filters for the option - * - * @todo [JRF => testers] Check if the extra actions below would run into problems if an option - * is updated early on and if so, change the call to schedule these for a later action on add/update - * instead of running them straight away - * - * @return \WPSEO_Taxonomy_Meta - */ - protected function __construct() { - parent::__construct(); - - self::$name = $this->option_name; - - /* On succesfull update/add of the option, flush the W3TC cache */ - add_action( 'add_option_' . $this->option_name, array( 'WPSEO_Utils', 'flush_w3tc_cache' ) ); - add_action( 'update_option_' . $this->option_name, array( 'WPSEO_Utils', 'flush_w3tc_cache' ) ); - } - - - /** - * Get the singleton instance of this class - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - self::$name = self::$instance->option_name; - } - - return self::$instance; - } - - - /** - * Add extra default options received from a filter - */ - public function enrich_defaults() { - $extra_defaults_per_term = apply_filters( 'wpseo_add_extra_taxmeta_term_defaults', array() ); - if ( is_array( $extra_defaults_per_term ) ) { - self::$defaults_per_term = array_merge( $extra_defaults_per_term, self::$defaults_per_term ); - } - } - - - /** - * Helper method - Combines a fixed array of default values with an options array - * while filtering out any keys which are not in the defaults array. - * - * @static - * - * @param string $option_key Option name of the option we're doing the merge for. - * @param array $options (Optional) Current options. If not set, the option defaults for the $option_key will be returned. - * - * @return array Combined and filtered options array. - */ - - /* - Public function array_filter_merge( $option_key, $options = null ) { - - $defaults = $this->get_defaults( $option_key ); - - if ( ! isset( $options ) || $options === false ) { - return $defaults; - } - - / * - @internal Adding the defaults to all taxonomy terms each time the option is retrieved - will be quite inefficient if there are a lot of taxonomy terms - As long as taxonomy_meta is only retrieved via methods in this class, we shouldn't need this - - $options = (array) $options; - $filtered = array(); - - if ( $options !== array() ) { - foreach ( $options as $taxonomy => $terms ) { - if ( is_array( $terms ) && $terms !== array() ) { - foreach ( $terms as $id => $term_meta ) { - foreach ( self::$defaults_per_term as $name => $default ) { - if ( isset( $options[ $taxonomy ][ $id ][ $name ] ) ) { - $filtered[ $taxonomy ][ $id ][ $name ] = $options[ $taxonomy ][ $id ][ $name ]; - } - else { - $filtered[ $name ] = $default; - } - } - } - } - } - unset( $taxonomy, $terms, $id, $term_meta, $name, $default ); - } - // end of may be remove. - - return $filtered; - * / - - return (array) $options; - } - */ - - - /** - * Validate the option - * - * @param array $dirty New value for the option. - * @param array $clean Clean value for the option, normally the defaults. - * @param array $old Old value of the option. - * - * @return array Validated clean value for the option to be saved to the database - */ - protected function validate_option( $dirty, $clean, $old ) { - /* - Prevent complete validation (which can be expensive when there are lots of terms) - if only one item has changed and has already been validated - */ - if ( isset( $dirty['wpseo_already_validated'] ) && $dirty['wpseo_already_validated'] === true ) { - unset( $dirty['wpseo_already_validated'] ); - - return $dirty; - } - - - foreach ( $dirty as $taxonomy => $terms ) { - /* Don't validate taxonomy - may not be registered yet and we don't want to remove valid ones */ - if ( is_array( $terms ) && $terms !== array() ) { - foreach ( $terms as $term_id => $meta_data ) { - /* Only validate term if the taxonomy exists */ - if ( taxonomy_exists( $taxonomy ) && get_term_by( 'id', $term_id, $taxonomy ) === false ) { - /* Is this term id a special case ? */ - if ( has_filter( 'wpseo_tax_meta_special_term_id_validation_' . $term_id ) !== false ) { - $clean[ $taxonomy ][ $term_id ] = apply_filters( 'wpseo_tax_meta_special_term_id_validation_' . $term_id, $meta_data, $taxonomy, $term_id ); - } - continue; - } - - if ( is_array( $meta_data ) && $meta_data !== array() ) { - /* Validate meta data */ - $old_meta = self::get_term_meta( $term_id, $taxonomy ); - $meta_data = self::validate_term_meta_data( $meta_data, $old_meta ); - if ( $meta_data !== array() ) { - $clean[ $taxonomy ][ $term_id ] = $meta_data; - } - } - - // Deal with special cases (for when taxonomy doesn't exist yet). - if ( ! isset( $clean[ $taxonomy ][ $term_id ] ) && has_filter( 'wpseo_tax_meta_special_term_id_validation_' . $term_id ) !== false ) { - $clean[ $taxonomy ][ $term_id ] = apply_filters( 'wpseo_tax_meta_special_term_id_validation_' . $term_id, $meta_data, $taxonomy, $term_id ); - } - } - } - } - - return $clean; - } - - - /** - * Validate the meta data for one individual term and removes default values (no need to save those) - * - * @static - * - * @param array $meta_data New values. - * @param array $old_meta The original values. - * - * @return array Validated and filtered value - */ - public static function validate_term_meta_data( $meta_data, $old_meta ) { - - $clean = self::$defaults_per_term; - $meta_data = array_map( array( 'WPSEO_Utils', 'trim_recursive' ), $meta_data ); - - if ( ! is_array( $meta_data ) || $meta_data === array() ) { - return $clean; - } - - foreach ( $clean as $key => $value ) { - switch ( $key ) { - - case 'wpseo_noindex': - if ( isset( $meta_data[ $key ] ) ) { - if ( isset( self::$no_index_options[ $meta_data[ $key ] ] ) ) { - $clean[ $key ] = $meta_data[ $key ]; - } - } - elseif ( isset( $old_meta[ $key ] ) ) { - // Retain old value if field currently not in use. - $clean[ $key ] = $old_meta[ $key ]; - } - break; - - case 'wpseo_sitemap_include': - if ( isset( $meta_data[ $key ], self::$sitemap_include_options[ $meta_data[ $key ] ] ) ) { - $clean[ $key ] = $meta_data[ $key ]; - } - break; - - case 'wpseo_canonical': - if ( isset( $meta_data[ $key ] ) && $meta_data[ $key ] !== '' ) { - $url = WPSEO_Utils::sanitize_url( $meta_data[ $key ] ); - if ( $url !== '' ) { - $clean[ $key ] = $url; - } - unset( $url ); - } - break; - - case 'wpseo_metakey': - case 'wpseo_bctitle': - if ( isset( $meta_data[ $key ] ) ) { - $clean[ $key ] = WPSEO_Utils::sanitize_text_field( stripslashes( $meta_data[ $key ] ) ); - } - elseif ( isset( $old_meta[ $key ] ) ) { - // Retain old value if field currently not in use. - $clean[ $key ] = $old_meta[ $key ]; - } - break; - case 'wpseo_focuskw': - case 'wpseo_title': - case 'wpseo_desc': - case 'wpseo_linkdex': - default: - if ( isset( $meta_data[ $key ] ) && is_string( $meta_data[ $key ] ) ) { - $clean[ $key ] = WPSEO_Utils::sanitize_text_field( stripslashes( $meta_data[ $key ] ) ); - } - - if ( 'wpseo_focuskw' === $key ) { - $clean[ $key ] = str_replace( array( - '<', - '>', - '"', - '`', - '<', - '>', - '"', - '`', - ), '', $clean[ $key ] ); - } - break; - } - - $clean[ $key ] = apply_filters( 'wpseo_sanitize_tax_meta_' . $key, $clean[ $key ], ( isset( $meta_data[ $key ] ) ? $meta_data[ $key ] : null ), ( isset( $old_meta[ $key ] ) ? $old_meta[ $key ] : null ) ); - } - - // Only save the non-default values. - return array_diff_assoc( $clean, self::$defaults_per_term ); - } - - - /** - * Clean a given option value - * - Convert old option values to new - * - Fixes strings which were escaped (should have been sanitized - escaping is for output) - * - * @param array $option_value Old (not merged with defaults or filtered) option value to - * clean according to the rules for this option. - * @param string $current_version (optional) Version from which to upgrade, if not set, - * version specific upgrades will be disregarded. - * @param array $all_old_option_values (optional) Only used when importing old options to have - * access to the real old values, in contrast to the saved ones. - * - * @return array Cleaned option - */ - protected function clean_option( $option_value, $current_version = null, $all_old_option_values = null ) { - - /* Clean up old values and remove empty arrays */ - if ( is_array( $option_value ) && $option_value !== array() ) { - - foreach ( $option_value as $taxonomy => $terms ) { - - if ( is_array( $terms ) && $terms !== array() ) { - - foreach ( $terms as $term_id => $meta_data ) { - if ( ! is_array( $meta_data ) || $meta_data === array() ) { - // Remove empty term arrays. - unset( $option_value[ $taxonomy ][ $term_id ] ); - } - else { - foreach ( $meta_data as $key => $value ) { - - switch ( $key ) { - case 'noindex': - if ( $value === 'on' ) { - // Convert 'on' to 'noindex'. - $option_value[ $taxonomy ][ $term_id ][ $key ] = 'noindex'; - } - break; - - case 'canonical': - case 'wpseo_metakey': - case 'wpseo_bctitle': - case 'wpseo_title': - case 'wpseo_desc': - case 'wpseo_linkdex': - // @todo [JRF => whomever] needs checking, I don't have example data [JRF]. - if ( $value !== '' ) { - // Fix incorrectly saved (encoded) canonical urls and texts. - $option_value[ $taxonomy ][ $term_id ][ $key ] = wp_specialchars_decode( stripslashes( $value ), ENT_QUOTES ); - } - break; - - default: - // @todo [JRF => whomever] needs checking, I don't have example data [JRF]. - if ( $value !== '' ) { - // Fix incorrectly saved (escaped) text strings. - $option_value[ $taxonomy ][ $term_id ][ $key ] = wp_specialchars_decode( $value, ENT_QUOTES ); - } - break; - } - } - } - } - } - else { - // Remove empty taxonomy arrays. - unset( $option_value[ $taxonomy ] ); - } - } - } - - return $option_value; - } - - - /** - * Retrieve a taxonomy term's meta value(s). - * - * @static - * - * @param mixed $term Term to get the meta value for - * either (string) term name, (int) term id or (object) term. - * @param string $taxonomy Name of the taxonomy to which the term is attached. - * @param string $meta (optional) Meta value to get (without prefix). - * - * @return mixed|bool Value for the $meta if one is given, might be the default. - * If no meta is given, an array of all the meta data for the term. - * False if the term does not exist or the $meta provided is invalid. - */ - public static function get_term_meta( $term, $taxonomy, $meta = null ) { - /* Figure out the term id */ - if ( is_int( $term ) ) { - $term = get_term_by( 'id', $term, $taxonomy ); - } - elseif ( is_string( $term ) ) { - $term = get_term_by( 'slug', $term, $taxonomy ); - } - - if ( is_object( $term ) && isset( $term->term_id ) ) { - $term_id = $term->term_id; - } - else { - return false; - } - - $tax_meta = self::get_term_tax_meta( $term_id, $taxonomy ); - - /* - Either return the complete array or a single value from it or false if the value does not exist - (shouldn't happen after merge with defaults, indicates typo in request) - */ - if ( ! isset( $meta ) ) { - return $tax_meta; - } - - - if ( isset( $tax_meta[ 'wpseo_' . $meta ] ) ) { - return $tax_meta[ 'wpseo_' . $meta ]; - } - - return false; - } - - /** - * Get the current queried object and return the meta value - * - * @param string $meta The meta field that is needed. - * - * @return bool|mixed - */ - public static function get_meta_without_term( $meta ) { - $term = $GLOBALS['wp_query']->get_queried_object(); - - return self::get_term_meta( $term, $term->taxonomy, $meta ); - - } - - /** - * Saving the values for the given term_id - * - * @param int $term_id ID of the term to save data for. - * @param string $taxonomy The taxonomy the term belongs to. - * @param array $meta_values The values that will be saved. - */ - public static function set_values( $term_id, $taxonomy, array $meta_values ) { - /* Validate the post values */ - $old = self::get_term_meta( $term_id, $taxonomy ); - $clean = self::validate_term_meta_data( $meta_values, $old ); - - self::save_clean_values( $term_id, $taxonomy, $clean ); - } - - /** - * Setting a single value to the term meta - * - * @param int $term_id ID of the term to save data for. - * @param string $taxonomy The taxonomy the term belongs to. - * @param string $meta_key The target meta key to store the value in. - * @param string $meta_value The value of the target meta key. - */ - public static function set_value( $term_id, $taxonomy, $meta_key, $meta_value ) { - - if ( substr( strtolower( $meta_key ), 0, 6 ) !== 'wpseo_' ) { - $meta_key = 'wpseo_' . $meta_key; - } - - self::set_values( $term_id, $taxonomy, array( $meta_key => $meta_value ) ); - } - - /** - * Find the keyword usages in the metas for the taxonomies/terms - * - * @param string $keyword The keyword to look for. - * @param string $current_term_id The current term id. - * @param string $current_taxonomy The current taxonomy name. - * - * @return array - */ - public static function get_keyword_usage( $keyword, $current_term_id, $current_taxonomy ) { - $tax_meta = self::get_tax_meta(); - - - $found = array(); - // Todo check for terms of all taxonomies, not only the current taxonomy. - foreach ( $tax_meta as $taxonomy_name => $terms ) { - foreach ( $terms as $term_id => $meta_values ) { - $is_current = ( $current_taxonomy === $taxonomy_name && (string) $current_term_id === (string) $term_id ); - if ( ! $is_current && ! empty( $meta_values['wpseo_focuskw'] ) && $meta_values['wpseo_focuskw'] === $keyword ) { - $found[] = $term_id; - } - } - } - - return array( $keyword => $found ); - } - - /** - * Saving the values for the given term_id - * - * @param int $term_id ID of the term to save data for. - * @param string $taxonomy The taxonomy the term belongs to. - * @param array $clean Array with clean values. - */ - private static function save_clean_values( $term_id, $taxonomy, array $clean ) { - $tax_meta = self::get_tax_meta(); - - /* Add/remove the result to/from the original option value */ - if ( $clean !== array() ) { - $tax_meta[ $taxonomy ][ $term_id ] = $clean; - } - else { - unset( $tax_meta[ $taxonomy ][ $term_id ] ); - if ( isset( $tax_meta[ $taxonomy ] ) && $tax_meta[ $taxonomy ] === array() ) { - unset( $tax_meta[ $taxonomy ] ); - } - } - - // Prevent complete array validation. - $tax_meta['wpseo_already_validated'] = true; - - self::save_tax_meta( $tax_meta ); - } - - /** - * Getting the meta from the options - * - * @return void|array - */ - private static function get_tax_meta() { - return get_option( self::$name ); - } - - /** - * Saving the tax meta values to the database - * - * @param array $tax_meta Array with the meta values for taxonomy. - */ - private static function save_tax_meta( $tax_meta ) { - update_option( self::$name, $tax_meta ); - } - - /** - * Getting the taxonomy meta for the given term_id and taxonomy - * - * @param int $term_id The id of the term. - * @param string $taxonomy Name of the taxonomy to which the term is attached. - * - * @return array - */ - private static function get_term_tax_meta( $term_id, $taxonomy ) { - $tax_meta = self::get_tax_meta(); - - /* If we have data for the term, merge with defaults for complete array, otherwise set defaults */ - if ( isset( $tax_meta[ $taxonomy ][ $term_id ] ) ) { - return array_merge( self::$defaults_per_term, $tax_meta[ $taxonomy ][ $term_id ] ); - } - - return self::$defaults_per_term; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-author-sitemap-provider.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-author-sitemap-provider.php deleted file mode 100644 index 1a5b0acc..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-author-sitemap-provider.php +++ /dev/null @@ -1,305 +0,0 @@ -update_user_meta(); - - $has_exclude_filter = has_filter( 'wpseo_sitemap_exclude_author' ); - - $query_arguments = array(); - - if ( ! $has_exclude_filter ) { // We only need full users if legacy filter(s) hooked to exclusion logic. R. - $query_arguments['fields'] = 'ID'; - } - - $users = $this->get_users( $query_arguments ); - - if ( $has_exclude_filter ) { - $users = $this->exclude_users( $users ); - $users = wp_list_pluck( $users, 'ID' ); - } - - if ( empty( $users ) ) { - return array(); - } - - $index = array(); - $page = 1; - $user_pages = array_chunk( $users, $max_entries ); - - if ( count( $user_pages ) === 1 ) { - $page = ''; - } - - foreach ( $user_pages as $users_page ) { - - $user_id = array_shift( $users_page ); // Time descending, first user on page is most recently updated. - $user = get_user_by( 'id', $user_id ); - $index[] = array( - 'loc' => WPSEO_Sitemaps_Router::get_base_url( 'author-sitemap' . $page . '.xml' ), - 'lastmod' => '@' . $user->_yoast_wpseo_profile_updated, // @ for explicit timestamp format - ); - - $page++; - } - - return $index; - } - - /** - * Retrieve users, taking account of all necessary exclusions. - * - * @param array $arguments Arguments to add. - * - * @return array - */ - protected function get_users( $arguments = array() ) { - - global $wpdb; - - $options = WPSEO_Options::get_all(); - - $defaults = array( - // TODO re-enable after plugin requirements raised to WP 4.6 with the fix. - // 'who' => 'authors', Breaks meta keys, see https://core.trac.wordpress.org/ticket/36724#ticket R. - 'meta_key' => '_yoast_wpseo_profile_updated', - 'orderby' => 'meta_value_num', - 'order' => 'DESC', - 'meta_query' => array( - 'relation' => 'AND', - array( - 'key' => $wpdb->get_blog_prefix() . 'user_level', - 'value' => '0', - 'compare' => '!=', - ), - array( - 'relation' => 'OR', - array( - 'key' => 'wpseo_excludeauthorsitemap', - 'value' => 'on', - 'compare' => '!=', - ), - array( - 'key' => 'wpseo_excludeauthorsitemap', - 'compare' => 'NOT EXISTS', - ), - ), - ), - ); - - if ( $options['disable_author_noposts'] === true ) { - // $defaults['who'] = ''; // Otherwise it cancels out next argument. - $defaults['has_published_posts'] = true; - } - - $excluded_roles = $this->get_excluded_roles(); - - if ( ! empty( $excluded_roles ) ) { - // $defaults['who'] = ''; // Otherwise it cancels out next argument. - $defaults['role__not_in'] = $excluded_roles; - } - - return get_users( array_merge( $defaults, $arguments ) ); - } - - /** - * Retrieve array of roles, excluded in settings. - * - * @return array - */ - protected function get_excluded_roles() { - - static $excluded_roles; - - if ( isset( $excluded_roles ) ) { - return $excluded_roles; - } - - $options = WPSEO_Options::get_all(); - $roles = WPSEO_Utils::get_roles(); - - foreach ( $roles as $role_slug => $role_name ) { - - if ( ! empty( $options[ "user_role-{$role_slug}-not_in_sitemap" ] ) ) { - $excluded_roles[] = $role_name; - } - } - - if ( ! empty( $excluded_roles ) ) { // Otherwise it's handled by who=>authors query. - $excluded_roles[] = 'Subscriber'; - } - - return $excluded_roles; - } - - /** - * Get set of sitemap link data. - * - * @param string $type Sitemap type. - * @param int $max_entries Entries per sitemap. - * @param int $current_page Current page of the sitemap. - * - * @return array - */ - public function get_sitemap_links( $type, $max_entries, $current_page ) { - - $options = WPSEO_Options::get_all(); - - $links = array(); - - if ( $options['disable-author'] === true || $options['disable_author_sitemap'] === true ) { - return $links; - } - - $users = $this->get_users( array( - 'offset' => ( $current_page - 1 ) * $max_entries, - 'number' => $max_entries, - ) ); - - $users = $this->exclude_users( $users ); - - if ( empty( $users ) ) { - $users = array(); - } - - $time = time(); - - foreach ( $users as $user ) { - - $author_link = get_author_posts_url( $user->ID ); - - if ( empty( $author_link ) ) { - continue; - } - - $mod = $time; - - if ( isset( $user->_yoast_wpseo_profile_updated ) ) { - $mod = $user->_yoast_wpseo_profile_updated; - } - - $url = array( - 'loc' => $author_link, - 'mod' => date( DATE_W3C, $mod ), - - // Deprecated, kept for backwards data compat. R. - 'chf' => 'daily', - 'pri' => 1, - ); - - /** This filter is documented at inc/sitemaps/class-post-type-sitemap-provider.php */ - $url = apply_filters( 'wpseo_sitemap_entry', $url, 'user', $user ); - - if ( ! empty( $url ) ) { - $links[] = $url; - } - } - - return $links; - } - - /** - * Update any users that don't have last profile update timestamp. - * - * @return int Count of users updated. - */ - protected function update_user_meta() { - - $users = get_users( array( - 'who' => 'authors', - 'meta_query' => array( - array( - 'key' => '_yoast_wpseo_profile_updated', - 'compare' => 'NOT EXISTS', - ), - ), - ) ); - - $time = time(); - - foreach ( $users as $user ) { - update_user_meta( $user->ID, '_yoast_wpseo_profile_updated', $time ); - } - - return count( $users ); - } - - /** - * Wrap legacy filter to deduplicate calls. - * - * @param array $users Array of user objects to filter. - * - * @return array - */ - protected function exclude_users( $users ) { - - /** - * Filter the authors, included in XML sitemap. - * - * @param array $users Array of user objects to filter. - */ - return apply_filters( 'wpseo_sitemap_exclude_author', $users ); - } - - /** - * Sorts an array of WP_User by the _yoast_wpseo_profile_updated meta field. - * - * @since 1.6 - * - * @deprecated 3.3 User meta sort can now be done by queries. - * - * @param WP_User $first The first WP user. - * @param WP_User $second The second WP user. - * - * @return int 0 if equal, 1 if $a is larger else or -1; - */ - public function user_map_sorter( $first, $second ) { - _deprecated_function( __METHOD__, 'WPSEO 3.3', __( 'Use queries instead', 'wordpress-seo' ) ); - - if ( ! isset( $first->_yoast_wpseo_profile_updated ) ) { - $first->_yoast_wpseo_profile_updated = time(); - } - - if ( ! isset( $second->_yoast_wpseo_profile_updated ) ) { - $second->_yoast_wpseo_profile_updated = time(); - } - - if ( $first->_yoast_wpseo_profile_updated === $second->_yoast_wpseo_profile_updated ) { - return 0; - } - - return ( ( $first->_yoast_wpseo_profile_updated > $second->_yoast_wpseo_profile_updated ) ? 1 : -1 ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-post-type-sitemap-provider.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-post-type-sitemap-provider.php deleted file mode 100644 index c9b3d801..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-post-type-sitemap-provider.php +++ /dev/null @@ -1,632 +0,0 @@ - true ) ); - $post_types = array_filter( $post_types, array( $this, 'is_valid_post_type' ) ); - $last_modified_times = WPSEO_Sitemaps::get_last_modified_gmt( $post_types, true ); - $index = array(); - - foreach ( $post_types as $post_type ) { - - $total_count = $this->get_post_type_count( $post_type ); - - if ( $total_count === 0 ) { - continue; - } - - $max_pages = 1; - - if ( $total_count > $max_entries ) { - $max_pages = (int) ceil( $total_count / $max_entries ); - } - - $all_dates = array(); - - if ( $max_pages > 1 ) { - - $sql = " - SELECT post_modified_gmt - FROM ( SELECT @rownum:=0 ) init - JOIN {$wpdb->posts} USE INDEX( type_status_date ) - WHERE post_status IN ( 'publish', 'inherit' ) - AND post_type = %s - AND ( @rownum:=@rownum+1 ) %% %d = 0 - ORDER BY post_modified_gmt ASC - "; - - $all_dates = $wpdb->get_col( $wpdb->prepare( $sql, $post_type, $max_entries ) ); - } - - for ( $page_counter = 0; $page_counter < $max_pages; $page_counter++ ) { - - $current_page = ( $max_pages > 1 ) ? ( $page_counter + 1 ) : ''; - $date = false; - - if ( empty( $current_page ) || $current_page === $max_pages ) { - - if ( ! empty( $last_modified_times[ $post_type ] ) ) { - $date = $last_modified_times[ $post_type ]; - } - } - else { - $date = $all_dates[ $page_counter ]; - } - - $index[] = array( - 'loc' => WPSEO_Sitemaps_Router::get_base_url( $post_type . '-sitemap' . $current_page . '.xml' ), - 'lastmod' => $date, - ); - } - } - - return $index; - } - - /** - * Get set of sitemap link data. - * - * @param string $type Sitemap type. - * @param int $max_entries Entries per sitemap. - * @param int $current_page Current page of the sitemap. - * - * @return array - */ - public function get_sitemap_links( $type, $max_entries, $current_page ) { - - $links = array(); - $post_type = $type; - - if ( ! $this->is_valid_post_type( $post_type ) ) { - return $links; - } - - $steps = min( 100, $max_entries ); - $offset = ( $current_page > 1 ) ? ( ( $current_page - 1 ) * $max_entries ) : 0; - $total = ( $offset + $max_entries ); - - $typecount = $this->get_post_type_count( $post_type ); - - if ( $total > $typecount ) { - $total = $typecount; - } - - if ( $current_page === 1 ) { - $links = array_merge( $links, $this->get_first_links( $post_type ) ); - } - - if ( $typecount === 0 ) { - - return $links; - } - - $options = $this->get_options(); - - $stacked_urls = array(); - - while ( $total > $offset ) { - - $posts = $this->get_posts( $post_type, $steps, $offset ); - - $offset += $steps; - - if ( empty( $posts ) ) { - continue; - } - - $posts_to_exclude = explode( ',', $options['excluded-posts'] ); - - foreach ( $posts as $post ) { - - if ( WPSEO_Meta::get_value( 'meta-robots-noindex', $post->ID ) === '1' ) { - continue; - } - - if ( in_array( $post->ID, $posts_to_exclude ) ) { - continue; - } - - $url = $this->get_url( $post ); - - if ( ! isset( $url['loc'] ) ) { - continue; - } - - /** - * Filter URL entry before it gets added to the sitemap. - * - * @param array $url Array of URL parts. - * @param string $type URL type. - * @param object $user Data object for the URL. - */ - $url = apply_filters( 'wpseo_sitemap_entry', $url, 'post', $post ); - - if ( empty( $url ) ) { - continue; - } - - $stacked_urls[] = $url['loc']; - - if ( (int) $post->ID === $this->get_page_for_posts_id() || (int) $post->ID === $this->get_page_on_front_id() ) { - - array_unshift( $links, $url ); - continue; - } - $links[] = $url; - } - - unset( $post, $url ); - } - - return $links; - } - - /** - * Check for relevant post type before invalidation. - * - * @param int $post_id Post ID to possibly invalidate for. - */ - public function save_post( $post_id ) { - - if ( $this->is_valid_post_type( get_post_type( $post_id ) ) ) { - WPSEO_Sitemaps_Cache::invalidate_post( $post_id ); - } - } - - /** - * Check if post type should be present in sitemaps. - * - * @param string $post_type Post type string to check for. - * - * @return bool - */ - public function is_valid_post_type( $post_type ) { - - $options = $this->get_options(); - - if ( ! empty( $options[ "post_types-{$post_type}-not_in_sitemap" ] ) ) { - return false; - } - - if ( ! in_array( $post_type, get_post_types( array( 'public' => true ) ) ) ) { - return false; - } - - /** - * Filter decision if post type is excluded from the XML sitemap. - * - * @param bool $exclude Default false. - * @param string $post_type Post type name. - */ - if ( apply_filters( 'wpseo_sitemap_exclude_post_type', false, $post_type ) ) { - return false; - } - - return true; - } - - /** - * Get count of posts for post type. - * - * @param string $post_type Post type to retrieve count for. - * - * @return int - */ - protected function get_post_type_count( $post_type ) { - - global $wpdb; - - /** - * Filter JOIN query part for type count of post type. - * - * @param string $join SQL part, defaults to empty string. - * @param string $post_type Post type name. - */ - $join_filter = apply_filters( 'wpseo_typecount_join', '', $post_type ); - - /** - * Filter WHERE query part for type count of post type. - * - * @param string $where SQL part, defaults to empty string. - * @param string $post_type Post type name. - */ - $where_filter = apply_filters( 'wpseo_typecount_where', '', $post_type ); - - $where = $this->get_sql_where_clause( $post_type ); - - $sql = " - SELECT COUNT({$wpdb->posts}.ID) - FROM {$wpdb->posts} - {$join_filter} - {$where} - {$where_filter} - "; - - return (int) $wpdb->get_var( $sql ); - } - - /** - * Produces set of links to prepend at start of first sitemap page. - * - * @param string $post_type Post type to produce links for. - * - * @return array - */ - protected function get_first_links( $post_type ) { - - $links = array(); - - $needs_archive = true; - - if ( ! $this->get_page_on_front_id() && ( $post_type == 'post' || $post_type == 'page' ) ) { - - $links[] = array( - 'loc' => $this->get_home_url(), - - // Deprecated, kept for backwards data compat. R. - 'chf' => 'daily', - 'pri' => 1, - ); - - $needs_archive = false; - } - elseif ( $this->get_page_on_front_id() && $post_type === 'post' && $this->get_page_for_posts_id() ) { - - $page_for_posts_url = get_permalink( $this->get_page_for_posts_id() ); - - $links[] = array( - 'loc' => $page_for_posts_url, - - // Deprecated, kept for backwards data compat. R. - 'chf' => 'daily', - 'pri' => 1, - ); - - $needs_archive = false; - } - - if ( ! $needs_archive ) { - return $links; - } - - $archive_url = get_post_type_archive_link( $post_type ); - - /** - * Filter the URL Yoast SEO uses in the XML sitemap for this post type archive. - * - * @param string $archive_url The URL of this archive - * @param string $post_type The post type this archive is for. - */ - $archive_url = apply_filters( 'wpseo_sitemap_post_type_archive_link', $archive_url, $post_type ); - - if ( $archive_url ) { - /** - * Filter the priority of the URL Yoast SEO uses in the XML sitemap. - * - * @param float $priority The priority for this URL, ranging from 0 to 1 - * @param string $post_type The post type this archive is for. - */ - $links[] = array( - 'loc' => $archive_url, - 'mod' => WPSEO_Sitemaps::get_last_modified_gmt( $post_type ), - - // Deprecated, kept for backwards data compat. R. - 'chf' => 'daily', - 'pri' => 1, - ); - } - - return $links; - } - - /** - * Retrieve set of posts with optimized query routine. - * - * @param string $post_type Post type to retrieve. - * @param int $count Count of posts to retrieve. - * @param int $offset Starting offset. - * - * @return object[] - */ - protected function get_posts( $post_type, $count, $offset ) { - - global $wpdb; - - static $filters = array(); - - if ( ! isset( $filters[ $post_type ] ) ) { - // Make sure you're wpdb->preparing everything you throw into this!! - $filters[ $post_type ] = array( - /** - * Filter JOIN query part for the post type. - * - * @param string $join SQL part, defaults to false. - * @param string $post_type Post type name. - */ - 'join' => apply_filters( 'wpseo_posts_join', false, $post_type ), - - /** - * Filter Where query part for the post type. - * - * @param string $where SQL part, defaults to false. - * @param string $post_type Post type name. - */ - 'where' => apply_filters( 'wpseo_posts_where', false, $post_type ), - ); - } - - $join_filter = $filters[ $post_type ]['join']; - $where_filter = $filters[ $post_type ]['where']; - $where = $this->get_sql_where_clause( $post_type ); - - // Optimized query per this thread: http://wordpress.org/support/topic/plugin-wordpress-seo-by-yoast-performance-suggestion. - // Also see http://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/. - $sql = " - SELECT l.ID, post_title, post_content, post_name, post_parent, post_author, post_modified_gmt, post_date, post_date_gmt - FROM ( - SELECT {$wpdb->posts}.ID - FROM {$wpdb->posts} - {$join_filter} - {$where} - {$where_filter} - ORDER BY {$wpdb->posts}.post_modified ASC LIMIT %d OFFSET %d - ) - o JOIN {$wpdb->posts} l ON l.ID = o.ID - "; - - $posts = $wpdb->get_results( $wpdb->prepare( $sql, $count, $offset ) ); - - $post_ids = array(); - - foreach ( $posts as $post ) { - $post->post_type = $post_type; - $post->post_status = 'publish'; - $post->filter = 'sample'; - $post_ids[] = $post->ID; - } - - update_meta_cache( 'post', $post_ids ); - - return $posts; - } - - /** - * @param string $post_type Post type slug. - * - * @return string - */ - protected function get_sql_where_clause( $post_type ) { - - global $wpdb; - - $join = ''; - $status = "{$wpdb->posts}.post_status = 'publish'"; - - // Based on WP_Query->get_posts(). R. - if ( 'attachment' === $post_type ) { - $join = " LEFT JOIN {$wpdb->posts} AS p2 ON ({$wpdb->posts}.post_parent = p2.ID) "; - $status = "p2.post_status = 'publish'"; - } - - $where_clause = " - {$join} - WHERE {$status} - AND {$wpdb->posts}.post_type = '%s' - AND {$wpdb->posts}.post_password = '' - AND {$wpdb->posts}.post_date != '0000-00-00 00:00:00' - "; - - return $wpdb->prepare( $where_clause, $post_type ); - } - - /** - * Produce array of URL parts for given post object. - * - * @param object $post Post object to get URL parts for. - * - * @return array|bool - */ - protected function get_url( $post ) { - - $url = array(); - - /** - * Filter the URL Yoast SEO uses in the XML sitemap. - * - * Note that only absolute local URLs are allowed as the check after this removes external URLs. - * - * @param string $url URL to use in the XML sitemap - * @param object $post Post object for the URL. - */ - $url['loc'] = apply_filters( 'wpseo_xml_sitemap_post_url', get_permalink( $post ), $post ); - - /** - * Do not include external URLs. - * - * @see https://wordpress.org/plugins/page-links-to/ can rewrite permalinks to external URLs. - */ - if ( false === strpos( $url['loc'], $this->get_home_url() ) ) { - return false; - } - - $modified = max( $post->post_modified_gmt, $post->post_date_gmt ); - - if ( $modified !== '0000-00-00 00:00:00' ) { - $url['mod'] = $modified; - } - - $url['chf'] = 'daily'; // Deprecated, kept for backwards data compat. R. - - $canonical = WPSEO_Meta::get_value( 'canonical', $post->ID ); - - if ( $canonical !== '' && $canonical !== $url['loc'] ) { - /* - Let's assume that if a canonical is set for this page and it's different from - the URL of this post, that page is either already in the XML sitemap OR is on - an external site, either way, we shouldn't include it here. - */ - return false; - } - unset( $canonical ); - - $options = $this->get_options(); - if ( $options['trailingslash'] === true && $post->post_type !== 'post' ) { - $url['loc'] = trailingslashit( $url['loc'] ); - } - - $url['pri'] = 1; // Deprecated, kept for backwards data compat. R. - $url['images'] = $this->get_image_parser()->get_images( $post ); - - return $url; - } - - /** - * Calculate the priority of the post. - * - * @deprecated 3.5 Priority data dropped from sitemaps. - * - * @param WP_Post $post Post object. - * - * @return float|mixed - */ - private function calculate_priority( $post ) { - _deprecated_function( __METHOD__, 'WPSEO 3.5' ); - - $return = 0.6; - if ( $post->post_parent == 0 && $post->post_type == 'page' ) { - $return = 0.8; - } - - if ( $post->ID === $this->get_page_on_front_id() || $post->ID === $this->get_page_for_posts_id() ) { - $return = 1.0; - } - - /** - * Filter the priority of the URL Yoast SEO uses in the XML sitemap. - * - * @param float $priority The priority for this URL, ranging from 0 to 1 - * @param string $post_type The post type this archive is for. - * @param object $post The post object. - */ - $return = apply_filters( 'wpseo_xml_sitemap_post_priority', $return, $post->post_type, $post ); - - return $return; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-cache-data.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-cache-data.php deleted file mode 100644 index d53779b4..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-cache-data.php +++ /dev/null @@ -1,129 +0,0 @@ -sitemap = $sitemap; - - /** - * Empty sitemap is not usable. - */ - if ( ! empty( $sitemap ) ) { - $this->set_status( self::OK ); - } - else { - $this->set_status( self::ERROR ); - } - } - - /** - * Set the status of the sitemap, is it usable. - * - * @param bool|string $valid Is the sitemap valid or not. - * - * @return void - */ - public function set_status( $valid ) { - - if ( self::OK === $valid ) { - $this->status = self::OK; - - return; - } - - if ( self::ERROR === $valid ) { - $this->status = self::ERROR; - $this->sitemap = ''; - - return; - } - - $this->status = self::UNKNOWN; - } - - /** - * Is the sitemap usable. - * - * @return bool True if usable, False if bad or unknown. - */ - public function is_usable() { - - return self::OK === $this->status; - } - - /** - * Get the XML content of the sitemap. - * - * @return string The content of the sitemap. - */ - public function get_sitemap() { - - return $this->sitemap; - } - - /** - * Get the status of the sitemap. - * - * @return string Status of the sitemap, 'ok'/'error'/'unknown' - */ - public function get_status() { - - return $this->status; - } - - /** - * String representation of object - * - * @link http://php.net/manual/en/serializable.serialize.php - * @return string the string representation of the object or null - * @since 5.1.0 - */ - public function serialize() { - - $data = array( - 'status' => $this->status, - 'xml' => $this->sitemap, - ); - - return serialize( $data ); - } - - /** - * Constructs the object - * - * @link http://php.net/manual/en/serializable.unserialize.php - * - * @param string $serialized The string representation of the object. - * - * @return void - * @since 5.1.0 - */ - public function unserialize( $serialized ) { - - $data = unserialize( $serialized ); - $this->set_sitemap( $data['xml'] ); - $this->set_status( $data['status'] ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-image-parser.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-image-parser.php deleted file mode 100644 index 726f67a8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-image-parser.php +++ /dev/null @@ -1,428 +0,0 @@ -home_url = home_url(); - $parsed_home = wp_parse_url( $this->home_url ); - - if ( ! empty( $parsed_home['host'] ) ) { - $this->host = str_replace( 'www.', '', $parsed_home['host'] ); - } - - if ( ! empty( $parsed_home['scheme'] ) ) { - $this->scheme = $parsed_home['scheme']; - } - - $this->charset = esc_attr( get_bloginfo( 'charset' ) ); - } - - /** - * Get set of image data sets for the given post. - * - * @param object $post Post object to get images for. - * - * @return array - */ - public function get_images( $post ) { - - $images = array(); - - if ( ! is_object( $post ) ) { - return $images; - } - - $thumbnail_id = get_post_thumbnail_id( $post->ID ); - - if ( $thumbnail_id ) { - - $src = $this->get_absolute_url( $this->image_url( $thumbnail_id ) ); - $alt = get_post_meta( $thumbnail_id, '_wp_attachment_image_alt', true ); - $title = get_post_field( 'post_title', $thumbnail_id ); - $images[] = $this->get_image_item( $post, $src, $title, $alt ); - } - - $unfiltered_images = $this->parse_html_images( $post->post_content ); - - foreach ( $unfiltered_images as $image ) { - $images[] = $this->get_image_item( $post, $image['src'], $image['title'], $image['alt'] ); - } - - foreach ( $this->parse_galleries( $post->post_content, $post->ID ) as $attachment ) { - - $src = $this->get_absolute_url( $this->image_url( $attachment->ID ) ); - $alt = get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true ); - - $images[] = $this->get_image_item( $post, $src, $attachment->post_title, $alt ); - } - - if ( 'attachment' === $post->post_type && wp_attachment_is_image( $post ) ) { - - $src = $this->get_absolute_url( $this->image_url( $post->ID ) ); - $alt = get_post_meta( $post->ID, '_wp_attachment_image_alt', true ); - - $images[] = $this->get_image_item( $post, $src, $post->post_title, $alt ); - } - - foreach ( $images as $key => $image ) { - - if ( empty( $image['src'] ) ) { - unset( $images[ $key ] ); - } - } - - /** - * Filter images to be included for the post in XML sitemap. - * - * @param array $images Array of image items. - * @param int $post_id ID of the post. - */ - $images = apply_filters( 'wpseo_sitemap_urlimages', $images, $post->ID ); - - return $images; - } - - /** - * @param object $term Term to get images from description for. - * - * @return array - */ - public function get_term_images( $term ) { - - $images = $this->parse_html_images( $term->description ); - - foreach ( $this->parse_galleries( $term->description ) as $attachment ) { - - $images[] = array( - 'src' => $this->get_absolute_url( $this->image_url( $attachment->ID ) ), - 'title' => $attachment->post_title, - 'alt' => get_post_meta( $attachment->ID, '_wp_attachment_image_alt', true ), - ); - } - - return $images; - } - - /** - * Parse `` tags in content. - * - * @param string $content Content string to parse. - * - * @return array - */ - private function parse_html_images( $content ) { - - $images = array(); - - if ( ! class_exists( 'DOMDocument' ) ) { - return $images; - } - - if ( empty( $content ) ) { - return $images; - } - - // Prevent DOMDocument from bubbling warnings about invalid HTML. - libxml_use_internal_errors( true ); - - $post_dom = new DOMDocument(); - $post_dom->loadHTML( 'charset . '">' . $content ); - - // Clear the errors, so they don't get kept in memory. - libxml_clear_errors(); - - /** @var DOMElement $img */ - foreach ( $post_dom->getElementsByTagName( 'img' ) as $img ) { - - $src = $img->getAttribute( 'src' ); - - if ( empty( $src ) ) { - continue; - } - - $class = $img->getAttribute( 'class' ); - - if ( // This detects WP-inserted images, which we need to upsize. R. - ! empty( $class ) - && false === strpos( $class, 'size-full' ) - && preg_match( '|wp-image-(?P\d+)|', $class, $matches ) - && get_post_status( $matches['id'] ) - ) { - $src = $this->image_url( $matches['id'] ); - } - - $src = $this->get_absolute_url( $src ); - - if ( strpos( $src, $this->host ) === false ) { - continue; - } - - if ( $src !== esc_url( $src ) ) { - continue; - } - - $images[] = array( - 'src' => $src, - 'title' => $img->getAttribute( 'title' ), - 'alt' => $img->getAttribute( 'alt' ), - ); - } - - return $images; - } - - /** - * Parse gallery shortcodes in a given content. - * - * @param string $content Content string. - * @param int $post_id Optional ID of post being parsed. - * - * @return array Set of attachment objects. - */ - private function parse_galleries( $content, $post_id = 0 ) { - - $attachments = array(); - $galleries = $this->get_content_galleries( $content ); - - foreach ( $galleries as $gallery ) { - - $id = $post_id; - - if ( ! empty( $gallery['id'] ) ) { - $id = intval( $gallery['id'] ); - } - - // Forked from core gallery_shortcode() to have exact same logic. R. - if ( ! empty( $gallery['ids'] ) ) { - $gallery['include'] = $gallery['ids']; - } - - $gallery_attachments = array(); - - if ( ! empty( $gallery['include'] ) ) { - - $_attachments = get_posts( array( - 'include' => $gallery['include'], - 'post_status' => 'inherit', - 'post_type' => 'attachment', - 'post_mime_type' => 'image', - ) ); - - foreach ( $_attachments as $key => $val ) { - $gallery_attachments[ $val->ID ] = $_attachments[ $key ]; - } - } - elseif ( ! empty( $gallery['exclude'] ) && ! empty( $id ) ) { - - $gallery_attachments = get_children( array( - 'post_parent' => $id, - 'exclude' => $gallery['exclude'], - 'post_status' => 'inherit', - 'post_type' => 'attachment', - 'post_mime_type' => 'image', - ) ); - } - elseif ( ! empty( $id ) ) { - - $gallery_attachments = get_children( array( - 'post_parent' => $id, - 'post_status' => 'inherit', - 'post_type' => 'attachment', - 'post_mime_type' => 'image', - ) ); - } - - $attachments = array_merge( $attachments, $gallery_attachments ); - } - - return array_unique( $attachments, SORT_REGULAR ); - } - - /** - * Retrieves galleries from the passed content. - * - * Forked from core to skip executing shortcodes for performance. - * - * @param string $content Content to parse for shortcodes. - * - * @return array A list of arrays, each containing gallery data. - */ - protected function get_content_galleries( $content ) { - - if ( ! has_shortcode( $content, 'gallery' ) ) { - return array(); - } - - $galleries = array(); - - if ( ! preg_match_all( '/' . get_shortcode_regex() . '/s', $content, $matches, PREG_SET_ORDER ) ) { - return $galleries; - } - - foreach ( $matches as $shortcode ) { - if ( 'gallery' === $shortcode[2] ) { - - $attributes = shortcode_parse_atts( $shortcode[3] ); - - if ( '' === $attributes ) { // Valid shortcode without any attributes. R. - $attributes = array(); - } - - $galleries[] = $attributes; - } - } - - return $galleries; - } - - /** - * Get image item array with filters applied. - * - * @param WP_Post $post Post object for the context. - * @param string $src Image URL. - * @param string $title Optional image title. - * @param string $alt Optional image alt text. - * - * @return array - */ - protected function get_image_item( $post, $src, $title = '', $alt = '' ) { - - $image = array(); - - /** - * Filter image URL to be included in XML sitemap for the post. - * - * @param string $src Image URL. - * @param object $post Post object. - */ - $image['src'] = apply_filters( 'wpseo_xml_sitemap_img_src', $src, $post ); - - if ( ! empty( $title ) ) { - $image['title'] = $title; - } - - if ( ! empty( $alt ) ) { - $image['alt'] = $alt; - } - - /** - * Filter image data to be included in XML sitemap for the post. - * - * @param array $image { - * Array of image data. - * - * @type string $src Image URL. - * @type string $title Image title attribute (optional). - * @type string $alt Image alt attribute (optional). - * } - * - * @param object $post Post object. - */ - return apply_filters( 'wpseo_xml_sitemap_img', $image, $post ); - } - - /** - * Get attached image URL. Adapted from core for speed. - * - * @param int $post_id ID of the post. - * - * @return string - */ - private function image_url( $post_id ) { - - static $uploads; - - if ( empty( $uploads ) ) { - $uploads = wp_upload_dir(); - } - - if ( false !== $uploads['error'] ) { - return ''; - } - - $file = get_post_meta( $post_id, '_wp_attached_file', true ); - - if ( empty( $file ) ) { - return ''; - } - - // Check that the upload base exists in the file location. - if ( 0 === strpos( $file, $uploads['basedir'] ) ) { - return str_replace( $uploads['basedir'], $uploads['baseurl'], $file ); - } - - // Replace file location with url location. - if ( false !== strpos( $file, 'wp-content/uploads' ) ) { - return $uploads['baseurl'] . substr( $file, ( strpos( $file, 'wp-content/uploads' ) + 18 ) ); - } - - // It's a newly uploaded file, therefore $file is relative to the baseurl. - return $uploads['baseurl'] . "/$file"; - } - - /** - * Make absolute URL for domain or protocol-relative one. - * - * @param string $src URL to process. - * - * @return string - */ - protected function get_absolute_url( $src ) { - - if ( empty( $src ) || ! is_string( $src ) ) { - return $src; - } - - if ( WPSEO_Utils::is_url_relative( $src ) === true ) { - - if ( $src[0] !== '/' ) { - return $src; - } - - // The URL is relative, we'll have to make it absolute. - return $this->home_url . $src; - } - - if ( strpos( $src, 'http' ) !== 0 ) { - // Protocol relative url, we add the scheme as the standard requires a protocol. - return $this->scheme . ':' . $src; - } - - return $src; - } - - /** - * Cache attached images and thumbnails for a set of posts. - * - * @deprecated 3.3 Blanket caching no longer makes sense with modern galleries. R. - */ - public function cache_attachments() { - - _deprecated_function( __METHOD__, '3.3' ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-timezone.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-timezone.php deleted file mode 100644 index 15f8cc1a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemap-timezone.php +++ /dev/null @@ -1,116 +0,0 @@ -get_datetime_with_timezone( $datetime_string ); - - if ( is_null( $date_time ) ) { - return ''; - } - - return $date_time->format( $format ); - } - /** - * Get the datetime object, in site's time zone, if the datetime string was valid - * - * @param string $datetime_string The datetime string in UTC time zone, that needs to be converted to a DateTime object. - * - * @return DateTime|null in site's time zone - */ - public function get_datetime_with_timezone( $datetime_string ) { - - static $utc_timezone, $local_timezone; - - if ( ! isset( $utc_timezone ) ) { - $utc_timezone = new DateTimeZone( 'UTC' ); - $local_timezone = new DateTimeZone( $this->get_timezone_string() ); - } - - if ( ! empty( $datetime_string ) && WPSEO_Utils::is_valid_datetime( $datetime_string ) ) { - $datetime = new DateTime( $datetime_string, $utc_timezone ); - $datetime->setTimezone( $local_timezone ); - - return $datetime; - } - - return null; - } - - /** - * Returns the timezone string for a site, even if it's set to a UTC offset - * - * Adapted from http://www.php.net/manual/en/function.timezone-name-from-abbr.php#89155 - * - * @return string valid PHP timezone string - */ - private function determine_timezone_string() { - - // If site timezone string exists, return it. - if ( $timezone = get_option( 'timezone_string' ) ) { - return $timezone; - } - - // Get UTC offset, if it isn't set then return UTC. - if ( 0 === ( $utc_offset = (int) get_option( 'gmt_offset', 0 ) ) ) { - return 'UTC'; - } - - // Adjust UTC offset from hours to seconds. - $utc_offset *= HOUR_IN_SECONDS; - - // Attempt to guess the timezone string from the UTC offset. - $timezone = timezone_name_from_abbr( '', $utc_offset ); - - if ( false !== $timezone ) { - return $timezone; - } - - // Last try, guess timezone string manually. - foreach ( timezone_abbreviations_list() as $abbr ) { - foreach ( $abbr as $city ) { - if ( $city['offset'] == $utc_offset ) { - return $city['timezone_id']; - } - } - } - - // Fallback to UTC. - return 'UTC'; - } - - /** - * Returns the correct timezone string - * - * @return string - */ - private function get_timezone_string() { - if ( '' == $this->timezone_string ) { - $this->timezone_string = $this->determine_timezone_string(); - } - - return $this->timezone_string; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-admin.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-admin.php deleted file mode 100644 index 760b811a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-admin.php +++ /dev/null @@ -1,191 +0,0 @@ -detect_blocking_filesystem_sitemaps(); - } - - /** - * Find sitemaps residing on disk as they will block our rewrite. - * - * @since 3.1 - */ - public function detect_blocking_filesystem_sitemaps() { - $wpseo_xml_options = WPSEO_Options::get_option( 'wpseo_xml' ); - if ( $wpseo_xml_options['enablexmlsitemap'] !== true ) { - return; - } - unset( $wpseo_xml_options ); - - // Find all files and directories containing 'sitemap' and are post-fixed .xml. - $blocking_files = glob( ABSPATH . '*sitemap*.xml', ( GLOB_NOSORT | GLOB_MARK ) ); - - if ( false === $blocking_files ) { // Some systems might return error on no matches. - $blocking_files = array(); - } - - // Save if we have changes. - $wpseo_options = WPSEO_Options::get_option( 'wpseo' ); - - if ( $wpseo_options['blocking_files'] !== $blocking_files ) { - $wpseo_options['blocking_files'] = $blocking_files; - - update_option( 'wpseo', $wpseo_options ); - } - } - - /** - * Hooked into transition_post_status. Will initiate search engine pings - * if the post is being published, is a post type that a sitemap is built for - * and is a post that is included in sitemaps. - * - * @param string $new_status New post status. - * @param string $old_status Old post status. - * @param \WP_Post $post Post object. - */ - public function status_transition( $new_status, $old_status, $post ) { - if ( $new_status !== 'publish' ) { - return; - } - - if ( defined( 'WP_IMPORTING' ) ) { - $this->status_transition_bulk( $new_status, $old_status, $post ); - - return; - } - - $post_type = get_post_type( $post ); - - wp_cache_delete( 'lastpostmodified:gmt:' . $post_type, 'timeinfo' ); // #17455. - - // None of our interest.. - if ( 'nav_menu_item' === $post_type ) { - return; - } - - $options = WPSEO_Options::get_options( array( 'wpseo_xml', 'wpseo_titles' ) ); - - // If the post type is excluded in options, we can stop. - $option = sprintf( 'post_types-%s-not_in_sitemap', $post_type ); - if ( isset( $options[ $option ] ) && $options[ $option ] === true ) { - return; - } - - if ( WP_CACHE ) { - wp_schedule_single_event( ( time() + 300 ), 'wpseo_hit_sitemap_index' ); - } - - /** - * Filter: 'wpseo_allow_xml_sitemap_ping' - Check if pinging is not allowed (allowed by default) - * - * @api boolean $allow_ping The boolean that is set to true by default. - */ - if ( apply_filters( 'wpseo_allow_xml_sitemap_ping', true ) === false ) { - return; - } - - // Allow the pinging to happen slightly after the hit sitemap index so the sitemap is fully regenerated when the ping happens. - $excluded_posts = explode( ',', $options['excluded-posts'] ); - - if ( ! in_array( $post->ID, $excluded_posts ) ) { - - if ( defined( 'YOAST_SEO_PING_IMMEDIATELY' ) && YOAST_SEO_PING_IMMEDIATELY ) { - WPSEO_Sitemaps::ping_search_engines(); - } - elseif ( ! wp_next_scheduled( 'wpseo_ping_search_engines' ) ) { - wp_schedule_single_event( ( time() + 300 ), 'wpseo_ping_search_engines' ); - } - } - } - - /** - * While bulk importing, just save unique post_types - * - * When importing is done, if we have a post_type that is saved in the sitemap - * try to ping the search engines - * - * @param string $new_status New post status. - * @param string $old_status Old post status. - * @param \WP_Post $post Post object. - */ - private function status_transition_bulk( $new_status, $old_status, $post ) { - $this->importing_post_types[] = get_post_type( $post ); - $this->importing_post_types = array_unique( $this->importing_post_types ); - } - - /** - * After import finished, walk through imported post_types and update info. - */ - public function status_transition_bulk_finished() { - if ( ! defined( 'WP_IMPORTING' ) ) { - return; - } - - if ( empty( $this->importing_post_types ) ) { - return; - } - - $options = WPSEO_Options::get_option( 'wpseo_xml' ); - - $ping_search_engines = false; - - foreach ( $this->importing_post_types as $post_type ) { - wp_cache_delete( 'lastpostmodified:gmt:' . $post_type, 'timeinfo' ); // #17455. - - // Just have the cache deleted for nav_menu_item. - if ( 'nav_menu_item' === $post_type ) { - continue; - } - - $option = sprintf( 'post_types-%s-not_in_sitemap', $post_type ); - if ( ! isset( $options[ $option ] ) || $options[ $option ] === false ) { - $ping_search_engines = true; - } - } - - // Nothing to do. - if ( false === $ping_search_engines ) { - return; - } - - if ( WP_CACHE ) { - do_action( 'wpseo_hit_sitemap_index' ); - } - - WPSEO_Sitemaps::ping_search_engines(); - } -} /* End of class */ diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache-validator.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache-validator.php deleted file mode 100644 index 5967110d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache-validator.php +++ /dev/null @@ -1,304 +0,0 @@ - $max_length ) { - - if ( $max_length < 15 ) { - /** - * If this happens the most likely cause is a page number that is too high. - * - * So this would not happen unintentionally.. - * Either by trying to cause a high server load, finding backdoors or misconfiguration. - */ - throw new OutOfRangeException( - __( - 'Trying to build the sitemap cache key, but the postfix and prefix combination leaves too little room to do this. You are probably requesting a page that is way out of the expected range.', - 'wordpress-seo' - ) - ); - } - - $half = ( $max_length / 2 ); - - $first_part = substr( $type, 0, ( ceil( $half ) - 1 ) ); - $last_part = substr( $type, ( 1 - floor( $half ) ) ); - - $type = $first_part . '..' . $last_part; - } - - return $type; - } - - /** - * Invalidate sitemap cache - * - * @since 3.2 - * - * @param null|string $type The type to get the key for. Null for all caches. - * - * @return void - */ - public static function invalidate_storage( $type = null ) { - - // Global validator gets cleared when no type is provided. - $old_validator = null; - - // Get the current type validator. - if ( ! is_null( $type ) ) { - $old_validator = self::get_validator( $type ); - } - - // Refresh validator. - self::create_validator( $type ); - - if ( ! wp_using_ext_object_cache() ) { - // Clean up current cache from the database. - self::cleanup_database( $type, $old_validator ); - } - - // External object cache pushes old and unretrieved items out by itself so we don't have to do anything for that. - } - - /** - * Cleanup invalidated database cache - * - * @since 3.2 - * - * @param null|string $type The type of sitemap to clear cache for. - * @param null|string $validator The validator to clear cache of. - * - * @return void - */ - public static function cleanup_database( $type = null, $validator = null ) { - - global $wpdb; - - if ( is_null( $type ) ) { - // Clear all cache if no type is provided. - $like = sprintf( '%s%%', self::STORAGE_KEY_PREFIX ); - } - else { - // Clear type cache for all type keys. - $like = sprintf( '%1$s%2$s_%%', self::STORAGE_KEY_PREFIX, $type ); - } - - /** - * Add slashes to the LIKE "_" single character wildcard. - * - * We can't use `esc_like` here because we need the % in the query. - */ - $where = array(); - $where[] = sprintf( "option_name LIKE '%s'", addcslashes( '_transient_' . $like, '_' ) ); - $where[] = sprintf( "option_name LIKE '%s'", addcslashes( '_transient_timeout_' . $like, '_' ) ); - - // Delete transients. - $query = sprintf( 'DELETE FROM %1$s WHERE %2$s', $wpdb->options, implode( ' OR ', $where ) ); - $wpdb->query( $query ); - } - - /** - * Get the current cache validator - * - * Without the type the global validator is returned. - * This can invalidate -all- keys in cache at once - * - * With the type parameter the validator for that specific - * type can be invalidated - * - * @since 3.2 - * - * @param string $type Provide a type for a specific type validator, empty for global validator. - * - * @return null|string The validator for the supplied type. - */ - public static function get_validator( $type = '' ) { - - $key = self::get_validator_key( $type ); - - $current = get_option( $key, null ); - if ( ! is_null( $current ) ) { - return $current; - } - - if ( self::create_validator( $type ) ) { - return self::get_validator( $type ); - } - - return null; - } - - /** - * Get the cache validator option key for the specified type - * - * @since 3.2 - * - * @param string $type Provide a type for a specific type validator, empty for global validator. - * - * @return string Validator to be used to generate the cache key. - */ - public static function get_validator_key( $type = '' ) { - - if ( empty( $type ) ) { - return self::VALIDATION_GLOBAL_KEY; - } - - return sprintf( self::VALIDATION_TYPE_KEY_FORMAT, $type ); - } - - /** - * Refresh the cache validator value - * - * @since 3.2 - * - * @param string $type Provide a type for a specific type validator, empty for global validator. - * - * @return bool True if validator key has been saved as option. - */ - public static function create_validator( $type = '' ) { - - $key = self::get_validator_key( $type ); - - // Generate new validator. - $microtime = microtime(); - - // Remove space. - list( $milliseconds, $seconds ) = explode( ' ', $microtime ); - - // Transients are purged every 24h. - $seconds = ( $seconds % DAY_IN_SECONDS ); - $milliseconds = intval( substr( $milliseconds, 2, 3 ), 10 ); - - // Combine seconds and milliseconds and convert to integer. - $validator = intval( $seconds . '' . $milliseconds, 10 ); - - // Apply base 61 encoding. - $compressed = self::convert_base10_to_base61( $validator ); - - return update_option( $key, $compressed, false ); - } - - /** - * Encode to base61 format. - * - * @since 3.2 - * - * This is base64 (numeric + alpha + alpha upper case) without the 0. - * - * @param int $base10 The number that has to be converted to base 61. - * - * @return string Base 61 converted string. - * - * @throws InvalidArgumentException When the input is not an integer. - */ - public static function convert_base10_to_base61( $base10 ) { - - if ( ! is_int( $base10 ) ) { - throw new InvalidArgumentException( __( 'Expected an integer as input.', 'wordpress-seo' ) ); - } - - // Characters that will be used in the conversion. - $characters = '123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; - $length = strlen( $characters ); - - $remainder = $base10; - $output = ''; - - do { - // Building from right to left in the result. - $index = ( $remainder % $length ); - - // Prepend the character to the output. - $output = $characters[ $index ] . $output; - - // Determine the remainder after removing the applied number. - $remainder = floor( $remainder / $length ); - - // Keep doing it until we have no remainder left. - } while ( $remainder ); - - return $output; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache.php deleted file mode 100644 index 8c7f970d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-cache.php +++ /dev/null @@ -1,320 +0,0 @@ -is_enabled(); - } - - /** - * If cache is enabled. - * - * @since 3.2 - * - * @return boolean - */ - public function is_enabled() { - - /** - * Filter if XML sitemap transient cache is enabled. - * - * @param bool $unsigned Enable cache or not, defaults to true - */ - return apply_filters( 'wpseo_enable_xml_sitemap_transient_caching', true ); - } - - - /** - * Retrieve the sitemap page from cache. - * - * @since 3.2 - * - * @param string $type Sitemap type. - * @param int $page Page number to retrieve. - * - * @return string|boolean - */ - public function get_sitemap( $type, $page ) { - - $transient_key = WPSEO_Sitemaps_Cache_Validator::get_storage_key( $type, $page ); - if ( false === $transient_key ) { - return false; - } - - return get_transient( $transient_key ); - } - - /** - * Get the sitemap that is cached - * - * @param string $type Sitemap type. - * @param int $page Page number to retrieve. - * - * @return null|WPSEO_Sitemap_Cache_Data Null on no cache found otherwise object containing sitemap and meta data. - */ - public function get_sitemap_data( $type, $page ) { - - $sitemap = $this->get_sitemap( $type, $page ); - - if ( empty( $sitemap ) ) { - return null; - } - - // Unserialize Cache Data object (is_serialized doesn't recognize classes). - if ( is_string( $sitemap ) && 0 === strpos( $sitemap, 'C:24:"WPSEO_Sitemap_Cache_Data"' ) ) { - - $sitemap = unserialize( $sitemap ); - } - - // What we expect it to be if it is set. - if ( $sitemap instanceof WPSEO_Sitemap_Cache_Data_Interface ) { - return $sitemap; - } - - return null; - } - - /** - * Store the sitemap page from cache. - * - * @since 3.2 - * - * @param string $type Sitemap type. - * @param int $page Page number to store. - * @param string $sitemap Sitemap body to store. - * @param bool $usable Is this a valid sitemap or a cache of an invalid sitemap. - * - * @return bool - */ - public function store_sitemap( $type, $page, $sitemap, $usable = true ) { - - $transient_key = WPSEO_Sitemaps_Cache_Validator::get_storage_key( $type, $page ); - - if ( false === $transient_key ) { - return false; - } - - $status = ( $usable ) ? WPSEO_Sitemap_Cache_Data::OK : WPSEO_Sitemap_Cache_Data::ERROR; - - $sitemap_data = new WPSEO_Sitemap_Cache_Data(); - $sitemap_data->set_sitemap( $sitemap ); - $sitemap_data->set_status( $status ); - - return set_transient( $transient_key, $sitemap_data, DAY_IN_SECONDS ); - } - - /** - * Delete cache transients for index and specific type. - * - * Always deletes the main index sitemaps cache, as that's always invalidated by any other change. - * - * @since 1.5.4 - * @since 3.2 Changed from function wpseo_invalidate_sitemap_cache() to method in this class. - * - * @param string $type Sitemap type to invalidate. - * - * @return void - */ - public static function invalidate( $type ) { - - self::clear( array( $type ) ); - } - - /** - * Helper to invalidate in hooks where type is passed as second argument. - * - * @since 3.2 - * - * @param int $unused Unused term ID value. - * @param string $type Taxonomy to invalidate. - * - * @return void - */ - public static function invalidate_helper( $unused, $type ) { - - $sitemap_options = WPSEO_Options::get_option( 'wpseo_xml' ); - - $taxonomy_not_in_sitemap = 'taxonomies-' . $type . '-not_in_sitemap'; - if ( isset( $sitemap_options[ $taxonomy_not_in_sitemap ] ) && $sitemap_options[ $taxonomy_not_in_sitemap ] === false ) { - self::invalidate( $type ); - } - } - - /** - * Invalidate sitemap cache for authors. - * - * @param int $user_id User ID. - */ - public static function invalidate_author( $user_id ) { - - $user = get_user_by( 'id', $user_id ); - - if ( 'user_register' === current_action() ) { - update_user_meta( $user_id, '_yoast_wpseo_profile_updated', time() ); - } - - if ( ! in_array( 'subscriber', $user->roles ) ) { - self::invalidate( 'author' ); - } - } - - /** - * Invalidate sitemap cache for the post type of a post. - * - * Don't invalidate for revisions. - * - * @since 1.5.4 - * @since 3.2 Changed from function wpseo_invalidate_sitemap_cache_on_save_post() to method in this class. - * - * @param int $post_id Post ID to invalidate type for. - * - * @return void - */ - public static function invalidate_post( $post_id ) { - - if ( wp_is_post_revision( $post_id ) ) { - return; - } - - self::invalidate( get_post_type( $post_id ) ); - } - - /** - * Delete cache transients for given sitemaps types or all by default. - * - * @since 1.8.0 - * @since 3.2 Moved from WPSEO_Utils to this class. - * - * @param array $types Set of sitemap types to delete cache transients for. - * - * @return void - */ - public static function clear( $types = array() ) { - - if ( ! self::$is_enabled ) { - return; - } - - // No types provided, clear all. - if ( empty( $types ) ) { - self::$clear_all = true; - - return; - } - - // Always invalidate the index sitemap as well. - if ( ! in_array( WPSEO_Sitemaps::SITEMAP_INDEX_TYPE, $types ) ) { - array_unshift( $types, WPSEO_Sitemaps::SITEMAP_INDEX_TYPE ); - } - - foreach ( $types as $type ) { - if ( ! in_array( $type, self::$clear_types ) ) { - self::$clear_types[] = $type; - } - } - } - - /** - * Invalidate storage for cache types queued to clear. - */ - public static function clear_queued() { - - if ( self::$clear_all ) { - - WPSEO_Sitemaps_Cache_Validator::invalidate_storage(); - self::$clear_all = false; - self::$clear_types = array(); - - return; - } - - foreach ( self::$clear_types as $type ) { - WPSEO_Sitemaps_Cache_Validator::invalidate_storage( $type ); - } - - self::$clear_types = array(); - } - - /** - * Adds a hook that when given option is updated, the cache is cleared - * - * @since 3.2 - * - * @param string $option Option name. - * @param string $type Sitemap type. - */ - public static function register_clear_on_option_update( $option, $type = '' ) { - - self::$cache_clear[ $option ] = $type; - } - - /** - * Clears the transient cache when a given option is updated, if that option has been registered before - * - * @since 3.2 - * - * @param string $option The option name that's being updated. - * - * @return void - */ - public static function clear_on_option_update( $option ) { - - if ( array_key_exists( $option, self::$cache_clear ) ) { - - if ( empty( self::$cache_clear[ $option ] ) ) { - // Clear all caches. - self::clear(); - } - else { - // Clear specific provided type(s). - $types = (array) self::$cache_clear[ $option ]; - self::clear( $types ); - } - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-renderer.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-renderer.php deleted file mode 100644 index d5b1c291..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-renderer.php +++ /dev/null @@ -1,322 +0,0 @@ -stylesheet = ''; - $this->charset = get_bloginfo( 'charset' ); - $this->output_charset = $this->charset; - $this->timezone = new WPSEO_Sitemap_Timezone(); - - if ( - 'UTF-8' !== $this->charset - && function_exists( 'mb_list_encodings' ) - && in_array( $this->charset, mb_list_encodings(), true ) - ) { - $this->output_charset = 'UTF-8'; - } - - $this->needs_conversion = $this->output_charset !== $this->charset; - } - - /** - * @param array $links Set of sitemaps index links. - * - * @return string - */ - public function get_index( $links ) { - - $xml = '' . "\n"; - - foreach ( $links as $link ) { - $xml .= $this->sitemap_index_url( $link ); - } - - /** - * Filter to append sitemaps to the index. - * - * @param string $index String to append to sitemaps index, defaults to empty. - */ - $xml .= apply_filters( 'wpseo_sitemap_index', '' ); - $xml .= ''; - - return $xml; - } - - /** - * @param array $links Set of sitemap links. - * @param string $type Sitemap type. - * @param int $current_page Current sitemap page number. - * - * @return string - */ - public function get_sitemap( $links, $type, $current_page ) { - - $urlset = '' . "\n"; - - /** - * Filters the `urlset` for a sitemap by type. - * - * @api string $urlset The output for the sitemap's `urlset`. - */ - $xml = apply_filters( "wpseo_sitemap_{$type}_urlset", $urlset ); - - foreach ( $links as $url ) { - $xml .= $this->sitemap_url( $url ); - } - - /** - * Filter to add extra URLs to the XML sitemap by type. - * - * Only runs for the first page, not on all. - * - * @param string $content String content to add, defaults to empty. - */ - if ( $current_page === 1 ) { - $xml .= apply_filters( "wpseo_sitemap_{$type}_content", '' ); - } - - $xml .= ''; - - return $xml; - } - - /** - * Produce final XML output with debug information. - * - * @param string $sitemap Sitemap XML. - * @param boolean $transient Transient cache flag. - * - * @return string - */ - public function get_output( $sitemap, $transient ) { - - $output = 'output_charset ) . '"?>'; - - if ( $this->stylesheet ) { - /** - * Filter the stylesheet URL for the XML sitemap. - * - * @param string $stylesheet Stylesheet URL. - */ - $output .= apply_filters( 'wpseo_stylesheet_url', $this->stylesheet ) . "\n"; - } - - $output .= $sitemap; - $output .= "\n"; - - $debug = WP_DEBUG || ( defined( 'WPSEO_DEBUG' ) && true === WPSEO_DEBUG ); - - if ( ! WP_DEBUG_DISPLAY || ! $debug ) { - return $output; - } - - $memory_used = number_format( ( memory_get_peak_usage() / 1048576 ), 2 ); - $queries_run = ( $transient ) ? 'Served from transient cache' : 'Queries executed ' . absint( $GLOBALS['wpdb']->num_queries ); - - $output .= "\n"; - - if ( defined( 'SAVEQUERIES' ) && SAVEQUERIES ) { - - $queries = print_r( $GLOBALS['wpdb']->queries, true ); - $output .= "\n"; - } - - return $output; - } - - /** - * Get charset for the output. - * - * @return string - */ - public function get_output_charset() { - return $this->output_charset; - } - - /** - * Set a custom stylesheet for this sitemap. Set to empty to just remove the default stylesheet. - * - * @param string $stylesheet Full xml-stylesheet declaration. - */ - public function set_stylesheet( $stylesheet ) { - $this->stylesheet = $stylesheet; - } - - /** - * Build the `` tag for a given URL. - * - * @param array $url Array of parts that make up this entry. - * - * @return string - */ - protected function sitemap_index_url( $url ) { - - $date = null; - - if ( ! empty( $url['lastmod'] ) ) { - $date = $this->timezone->format_date( $url['lastmod'] ); - } - - $url['loc'] = htmlspecialchars( $url['loc'] ); - - $output = "\t\n"; - $output .= "\t\t" . $url['loc'] . "\n"; - $output .= empty( $date ) ? '' : "\t\t" . htmlspecialchars( $date ) . "\n"; - $output .= "\t\n"; - - return $output; - } - - /** - * Build the `` tag for a given URL. - * - * Public access for backwards compatibility reasons. - * - * @param array $url Array of parts that make up this entry. - * - * @return string - */ - public function sitemap_url( $url ) { - - $date = null; - - - if ( ! empty( $url['mod'] ) ) { - // Create a DateTime object date in the correct timezone. - $date = $this->timezone->format_date( $url['mod'] ); - } - - $url['loc'] = htmlspecialchars( $url['loc'] ); - - $output = "\t\n"; - $output .= "\t\t" . $this->encode_url_rfc3986( $url['loc'] ) . "\n"; - $output .= empty( $date ) ? '' : "\t\t" . htmlspecialchars( $date ) . "\n"; - - if ( empty( $url['images'] ) ) { - $url['images'] = array(); - } - - foreach ( $url['images'] as $img ) { - - if ( empty( $img['src'] ) ) { - continue; - } - - $output .= "\t\t\n"; - $output .= "\t\t\t" . esc_html( $this->encode_url_rfc3986( $img['src'] ) ) . "\n"; - - if ( ! empty( $img['title'] ) ) { - - $title = $img['title']; - - if ( $this->needs_conversion ) { - $title = mb_convert_encoding( $title, $this->output_charset, $this->charset ); - } - - $title = _wp_specialchars( html_entity_decode( $title, ENT_QUOTES, $this->output_charset ) ); - $output .= "\t\t\t\n"; - } - - if ( ! empty( $img['alt'] ) ) { - - $alt = $img['alt']; - - if ( $this->needs_conversion ) { - $alt = mb_convert_encoding( $alt, $this->output_charset, $this->charset ); - } - - $alt = _wp_specialchars( html_entity_decode( $alt, ENT_QUOTES, $this->output_charset ) ); - $output .= "\t\t\t\n"; - } - - $output .= "\t\t\n"; - } - unset( $img, $title, $alt ); - - $output .= "\t\n"; - - /** - * Filters the output for the sitemap url tag. - * - * @api string $output The output for the sitemap url tag. - * - * @param array $url The sitemap url array on which the output is based. - */ - return apply_filters( 'wpseo_sitemap_url', $output, $url ); - } - - /** - * Apply some best effort conversion to comply with RFC3986. - * - * @param string $url URL to encode. - * - * @return string - */ - protected function encode_url_rfc3986( $url ) { - - if ( filter_var( $url, FILTER_VALIDATE_URL ) ) { - return $url; - } - - $path = parse_url( $url, PHP_URL_PATH ); - - if ( ! empty( $path ) && '/' !== $path ) { - - $encoded_path = explode( '/', $path ); - $encoded_path = array_map( 'rawurlencode', $encoded_path ); - $encoded_path = implode( '/', $encoded_path ); - $encoded_path = str_replace( '%7E', '~', $encoded_path ); // PHP <5.3. - - $url = str_replace( $path, $encoded_path, $url ); - } - - $query = parse_url( $url, PHP_URL_QUERY ); - - if ( ! empty( $query ) ) { - - parse_str( $query, $parsed_query ); - - if ( defined( 'PHP_QUERY_RFC3986' ) ) { // PHP 5.4+. - $parsed_query = http_build_query( $parsed_query, null, '&', PHP_QUERY_RFC3986 ); - } - else { - $parsed_query = http_build_query( $parsed_query, null, '&' ); - $parsed_query = str_replace( '+', '%20', $parsed_query ); - $parsed_query = str_replace( '%7E', '~', $parsed_query ); - } - - $url = str_replace( $query, $parsed_query, $url ); - } - - return $url; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-router.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-router.php deleted file mode 100644 index 1c1d0de5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps-router.php +++ /dev/null @@ -1,98 +0,0 @@ -add_query_var( 'sitemap' ); - $wp->add_query_var( 'sitemap_n' ); - $wp->add_query_var( 'xsl' ); - - add_rewrite_rule( 'sitemap_index\.xml$', 'index.php?sitemap=1', 'top' ); - add_rewrite_rule( '([^/]+?)-sitemap([0-9]+)?\.xml$', 'index.php?sitemap=$matches[1]&sitemap_n=$matches[2]', 'top' ); - add_rewrite_rule( '([a-z]+)?-?sitemap\.xsl$', 'index.php?xsl=$matches[1]', 'top' ); - } - - /** - * Stop trailing slashes on sitemap.xml URLs. - * - * @param string $redirect The redirect URL currently determined. - * - * @return bool|string $redirect - */ - public function redirect_canonical( $redirect ) { - - if ( get_query_var( 'sitemap' ) || get_query_var( 'xsl' ) ) { - return false; - } - - return $redirect; - } - - /** - * Redirects sitemap.xml to sitemap_index.xml. - */ - public function template_redirect() { - - global $wp_query; - - $current_url = 'http://'; - - if ( ! empty( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] === 'on' ) { - $current_url = 'https://'; - } - - $current_url .= sanitize_text_field( $_SERVER['SERVER_NAME'] ); - $current_url .= sanitize_text_field( $_SERVER['REQUEST_URI'] ); - - if ( home_url( '/sitemap.xml' ) === $current_url && $wp_query->is_404 ) { - wp_redirect( home_url( '/sitemap_index.xml' ), 301 ); - exit; - } - } - - /** - * Create base URL for the sitemap. - * - * @param string $page Page to append to the base URL. - * - * @return string base URL (incl page) - */ - public static function get_base_url( $page ) { - - global $wp_rewrite; - - $base = $wp_rewrite->using_index_permalinks() ? 'index.php/' : '/'; - - /** - * Filter the base URL of the sitemaps - * - * @param string $base The string that should be added to home_url() to make the full base URL. - */ - $base = apply_filters( 'wpseo_sitemaps_base_url', $base ); - - // Get the scheme from the configured home url instead of letting WordPress determine the scheme based on the requested URI. - return home_url( $base . $page, parse_url( get_option( 'home' ), PHP_URL_SCHEME ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps.php deleted file mode 100644 index 5fcd10c6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-sitemaps.php +++ /dev/null @@ -1,569 +0,0 @@ -max_entries = $options['entries-per-page']; - $this->timezone = new WPSEO_Sitemap_Timezone(); - $this->router = new WPSEO_Sitemaps_Router(); - $this->renderer = new WPSEO_Sitemaps_Renderer(); - $this->cache = new WPSEO_Sitemaps_Cache(); - $this->providers = array( // TODO API for add/remove. R. - new WPSEO_Post_Type_Sitemap_Provider(), - new WPSEO_Taxonomy_Sitemap_Provider(), - new WPSEO_Author_Sitemap_Provider(), - ); - - if ( ! empty( $_SERVER['SERVER_PROTOCOL'] ) ) { - $this->http_protocol = sanitize_text_field( $_SERVER['SERVER_PROTOCOL'] ); - } - } - - /** - * Check the current request URI, if we can determine it's probably an XML sitemap, kill loading the widgets - */ - public function reduce_query_load() { - - if ( ! isset( $_SERVER['REQUEST_URI'] ) ) { - return; - } - - $request_uri = $_SERVER['REQUEST_URI']; - $extension = substr( $request_uri, -4 ); - - if ( false !== stripos( $request_uri, 'sitemap' ) && in_array( $extension, array( '.xml', '.xsl' ) ) ) { - remove_all_actions( 'widgets_init' ); - } - } - - /** - * Register your own sitemap. Call this during 'init'. - * - * @param string $name The name of the sitemap. - * @param callback $function Function to build your sitemap. - * @param string $rewrite Optional. Regular expression to match your sitemap with. - */ - public function register_sitemap( $name, $function, $rewrite = '' ) { - add_action( 'wpseo_do_sitemap_' . $name, $function ); - if ( ! empty( $rewrite ) ) { - add_rewrite_rule( $rewrite, 'index.php?sitemap=' . $name, 'top' ); - } - } - - /** - * Register your own XSL file. Call this during 'init'. - * - * @since 1.4.23 - * - * @param string $name The name of the XSL file. - * @param callback $function Function to build your XSL file. - * @param string $rewrite Optional. Regular expression to match your sitemap with. - */ - public function register_xsl( $name, $function, $rewrite = '' ) { - add_action( 'wpseo_xsl_' . $name, $function ); - if ( ! empty( $rewrite ) ) { - add_rewrite_rule( $rewrite, 'index.php?xsl=' . $name, 'top' ); - } - } - - /** - * Set the sitemap current page to allow creating partial sitemaps with wp-cli - * in a one-off process. - * - * @param integer $current_page The part that should be generated. - */ - public function set_n( $current_page ) { - if ( is_scalar( $current_page ) && intval( $current_page ) > 0 ) { - $this->current_page = intval( $current_page ); - } - } - - /** - * Set the sitemap content to display after you have generated it. - * - * @param string $sitemap The generated sitemap to output. - */ - public function set_sitemap( $sitemap ) { - $this->sitemap = $sitemap; - } - - /** - * Set as true to make the request 404. Used stop the display of empty sitemaps or invalid requests. - * - * @param bool $bool Is this a bad request. True or false. - */ - public function set_bad_sitemap( $bool ) { - $this->bad_sitemap = (bool) $bool; - } - - /** - * Prevent stupid plugins from running shutdown scripts when we're obviously not outputting HTML. - * - * @since 1.4.16 - */ - public function sitemap_close() { - remove_all_actions( 'wp_footer' ); - die(); - } - - /** - * Hijack requests for potential sitemaps and XSL files. - * - * @param \WP_Query $query Main query instance. - */ - public function redirect( $query ) { - - if ( ! $query->is_main_query() ) { - return; - } - - $xsl = get_query_var( 'xsl' ); - - if ( ! empty( $xsl ) ) { - $this->xsl_output( $xsl ); - $this->sitemap_close(); - - return; - } - - $type = get_query_var( 'sitemap' ); - - if ( empty( $type ) ) { - return; - } - - $this->set_n( get_query_var( 'sitemap_n' ) ); - - if ( ! $this->get_sitemap_from_cache( $type, $this->current_page ) ) { - $this->build_sitemap( $type ); - } - - if ( $this->bad_sitemap ) { - $query->set_404(); - status_header( 404 ); - - return; - } - - $this->output(); - $this->sitemap_close(); - } - - /** - * Try to get the sitemap from cache - * - * @param string $type Sitemap type. - * @param int $page_number The page number to retrieve. - * - * @return bool If the sitemap has been retrieved from cache. - */ - private function get_sitemap_from_cache( $type, $page_number ) { - - $this->transient = false; - - if ( true !== $this->cache->is_enabled() ) { - return false; - } - - /** - * Fires before the attempt to retrieve XML sitemap from the transient cache. - * - * @param WPSEO_Sitemaps $sitemaps Sitemaps object. - */ - do_action( 'wpseo_sitemap_stylesheet_cache_' . $type, $this ); - - $sitemap_cache_data = $this->cache->get_sitemap_data( $type, $page_number ); - - // No cache was found, refresh it because cache is enabled. - if ( empty( $sitemap_cache_data ) ) { - return $this->refresh_sitemap_cache( $type, $page_number ); - } - - // Cache object was found, parse information. - $this->transient = true; - - $this->sitemap = $sitemap_cache_data->get_sitemap(); - $this->bad_sitemap = ! $sitemap_cache_data->is_usable(); - - return true; - } - - /** - * Build and save sitemap to cache. - * - * @param string $type Sitemap type. - * @param int $page_number The page number to save to. - * - * @return bool - */ - private function refresh_sitemap_cache( $type, $page_number ) { - $this->set_n( $page_number ); - $this->build_sitemap( $type ); - - return $this->cache->store_sitemap( $type, $page_number, $this->sitemap, ! $this->bad_sitemap ); - } - - /** - * Attempts to build the requested sitemap. - * - * Sets $bad_sitemap if this isn't for the root sitemap, a post type or taxonomy. - * - * @param string $type The requested sitemap's identifier. - */ - public function build_sitemap( $type ) { - - /** - * Filter the type of sitemap to build. - * - * @param string $type Sitemap type, determined by the request. - */ - $type = apply_filters( 'wpseo_build_sitemap_post_type', $type ); - - if ( $type === '1' ) { - $this->build_root_map(); - - return; - } - - foreach ( $this->providers as $provider ) { - if ( ! $provider->handles_type( $type ) ) { - continue; - } - - $links = $provider->get_sitemap_links( $type, $this->max_entries, $this->current_page ); - - if ( empty( $links ) ) { - $this->bad_sitemap = true; - - return; - } - - $this->sitemap = $this->renderer->get_sitemap( $links, $type, $this->current_page ); - - return; - } - - if ( has_action( 'wpseo_do_sitemap_' . $type ) ) { - /** - * Fires custom handler, if hooked to generate sitemap for the type. - */ - do_action( 'wpseo_do_sitemap_' . $type ); - - return; - } - - $this->bad_sitemap = true; - } - - /** - * Build the root sitemap (example.com/sitemap_index.xml) which lists sub-sitemaps for other content types. - */ - public function build_root_map() { - - $links = array(); - - foreach ( $this->providers as $provider ) { - $links = array_merge( $links, $provider->get_index_links( $this->max_entries ) ); - } - - if ( empty( $links ) ) { - $this->bad_sitemap = true; - $this->sitemap = ''; - - return; - } - - $this->sitemap = $this->renderer->get_index( $links ); - } - - /** - * Spits out the XSL for the XML sitemap. - * - * @param string $type Type to output. - * - * @since 1.4.13 - */ - public function xsl_output( $type ) { - - if ( $type !== 'main' ) { - - /** - * Fires for the output of XSL for XML sitemaps, other than type "main". - */ - do_action( 'wpseo_xsl_' . $type ); - - return; - } - - header( $this->http_protocol . ' 200 OK', true, 200 ); - // Prevent the search engines from indexing the XML Sitemap. - header( 'X-Robots-Tag: noindex, follow', true ); - header( 'Content-Type: text/xml' ); - - // Make the browser cache this file properly. - $expires = YEAR_IN_SECONDS; - header( 'Pragma: public' ); - header( 'Cache-Control: maxage=' . $expires ); - header( 'Expires: ' . gmdate( 'D, d M Y H:i:s', ( time() + $expires ) ) . ' GMT' ); - - require_once( WPSEO_PATH . 'css/xml-sitemap-xsl.php' ); - } - - /** - * Spit out the generated sitemap and relevant headers and encoding information. - */ - public function output() { - - if ( ! headers_sent() ) { - header( $this->http_protocol . ' 200 OK', true, 200 ); - // Prevent the search engines from indexing the XML Sitemap. - header( 'X-Robots-Tag: noindex, follow', true ); - header( 'Content-Type: text/xml; charset=' . esc_attr( $this->renderer->get_output_charset() ) ); - } - - echo $this->renderer->get_output( $this->sitemap, $this->transient ); - } - - /** - * Make a request for the sitemap index so as to cache it before the arrival of the search engines. - */ - public function hit_sitemap_index() { - wp_remote_get( WPSEO_Sitemaps_Router::get_base_url( 'sitemap_index.xml' ) ); - } - - /** - * Get the GMT modification date for the last modified post in the post type. - * - * @since 3.2 - * - * @param string|array $post_types Post type or array of types. - * @param bool $return_all Flag to return array of values. - * - * @return string|array|false - */ - static public function get_last_modified_gmt( $post_types, $return_all = false ) { - - global $wpdb; - - static $post_type_dates = null; - - if ( ! is_array( $post_types ) ) { - $post_types = array( $post_types ); - } - - foreach ( $post_types as $post_type ) { - if ( ! isset( $post_type_dates[ $post_type ] ) ) { // If we hadn't seen post type before. R. - $post_type_dates = null; - break; - } - } - - if ( is_null( $post_type_dates ) ) { - - $sql = " - SELECT post_type, MAX(post_modified_gmt) AS date - FROM $wpdb->posts - WHERE post_status IN ('publish','inherit') - AND post_type IN ('" . implode( "','", get_post_types( array( 'public' => true ) ) ) . "') - GROUP BY post_type - ORDER BY post_modified_gmt DESC - "; - - $post_type_dates = array(); - - foreach ( $wpdb->get_results( $sql ) as $obj ) { - $post_type_dates[ $obj->post_type ] = $obj->date; - } - } - - $dates = array_intersect_key( $post_type_dates, array_flip( $post_types ) ); - - if ( count( $dates ) > 0 ) { - - if ( $return_all ) { - return $dates; - } - - return max( $dates ); - } - - return false; - } - - /** - * Get the modification date for the last modified post in the post type. - * - * @param array $post_types Post types to get the last modification date for. - * - * @return string - */ - public function get_last_modified( $post_types ) { - - return $this->timezone->format_date( self::get_last_modified_gmt( $post_types ) ); - } - - /** - * Notify search engines of the updated sitemap. - * - * @param string|null $url Optional URL to make the ping for. - */ - public static function ping_search_engines( $url = null ) { - - /** - * Filter: 'wpseo_allow_xml_sitemap_ping' - Check if pinging is not allowed (allowed by default) - * - * @api boolean $allow_ping The boolean that is set to true by default. - */ - if ( apply_filters( 'wpseo_allow_xml_sitemap_ping', true ) === false ) { - return; - } - - if ( '0' === get_option( 'blog_public' ) ) { // Don't ping if blog is not public. - return; - } - - if ( empty( $url ) ) { - $url = urlencode( WPSEO_Sitemaps_Router::get_base_url( 'sitemap_index.xml' ) ); - } - - // Ping Google and Bing. - wp_remote_get( 'http://www.google.com/webmasters/tools/ping?sitemap=' . $url, array( 'blocking' => false ) ); - wp_remote_get( 'http://www.bing.com/ping?sitemap=' . $url, array( 'blocking' => false ) ); - } - - /** - * Build the `` tag for a given URL. - * - * @deprecated 3.2 - * @see WPSEO_Sitemaps_Renderer::sitemap_url() - * - * @param array $url Array of parts that make up this entry. - * - * @return string - */ - public function sitemap_url( $url ) { - _deprecated_function( __METHOD__, 'WPSEO 3.2', 'WPSEO_Sitemaps_Renderer::sitemap_url()' ); - return $this->renderer->sitemap_url( $url ); - } - - /** - * Set a custom stylesheet for this sitemap. Set to empty to just remove the default stylesheet. - * - * @deprecated 3.2 - * @see WPSEO_Sitemaps_Renderer::set_stylesheet() - * - * @param string $stylesheet Full xml-stylesheet declaration. - */ - public function set_stylesheet( $stylesheet ) { - _deprecated_function( __METHOD__, 'WPSEO 3.2', 'WPSEO_Sitemaps_Renderer::set_stylesheet()' ); - $this->renderer->set_stylesheet( $stylesheet ); - } - - /** - * Function to dynamically filter the change frequency. - * - * @deprecated 3.5 Change frequency data dropped from sitemaps. - * - * @param string $filter Expands to wpseo_sitemap_$filter_change_freq, allowing for a change of the frequency for - * numerous specific URLs. - * @param string $default The default value for the frequency. - * @param string $url The URL of the current entry. - * - * @return mixed|void - */ - static public function filter_frequency( $filter, $default, $url ) { - _deprecated_function( __METHOD__, 'WPSEO 3.5' ); - - /** - * Filter the specific change frequency - * - * @param string $default The default change frequency. - * @param string $url URL to filter frequency for. - */ - $change_freq = apply_filters( 'wpseo_sitemap_' . $filter . '_change_freq', $default, $url ); - - if ( ! in_array( $change_freq, array( - 'always', - 'hourly', - 'daily', - 'weekly', - 'monthly', - 'yearly', - 'never', - ) ) - ) { - $change_freq = $default; - } - - return $change_freq; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-taxonomy-sitemap-provider.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-taxonomy-sitemap-provider.php deleted file mode 100644 index 4d67f4ac..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/class-taxonomy-sitemap-provider.php +++ /dev/null @@ -1,289 +0,0 @@ - true ), 'objects' ); - - if ( empty( $taxonomies ) ) { - return array(); - } - - $taxonomy_names = array_filter( array_keys( $taxonomies ), array( $this, 'is_valid_taxonomy' ) ); - $taxonomies = array_intersect_key( $taxonomies, array_flip( $taxonomy_names ) ); - - // Retrieve all the taxonomies and their terms so we can do a proper count on them. - /** - * Filter the setting of excluding empty terms from the XML sitemap. - * - * @param boolean $exclude Defaults to true. - * @param array $taxonomy_names Array of names for the taxonomies being processed. - */ - $hide_empty = apply_filters( 'wpseo_sitemap_exclude_empty_terms', true, $taxonomy_names ); - - $all_taxonomies = array(); - - foreach ( $taxonomy_names as $taxonomy_name ) { - - $taxonomy_terms = get_terms( $taxonomy_name, array( - 'hide_empty' => $hide_empty, - 'fields' => 'ids', - ) ); - - if ( count( $taxonomy_terms ) > 0 ) { - $all_taxonomies[ $taxonomy_name ] = $taxonomy_terms; - } - } - - $index = array(); - - foreach ( $taxonomies as $tax_name => $tax ) { - - if ( ! isset( $all_taxonomies[ $tax_name ] ) ) { // No eligible terms found. - continue; - } - - $total_count = ( isset( $all_taxonomies[ $tax_name ] ) ) ? count( $all_taxonomies[ $tax_name ] ) : 1; - $max_pages = 1; - - if ( $total_count > $max_entries ) { - $max_pages = (int) ceil( $total_count / $max_entries ); - } - - $last_modified_gmt = WPSEO_Sitemaps::get_last_modified_gmt( $tax->object_type ); - - for ( $page_counter = 0; $page_counter < $max_pages; $page_counter++ ) { - - $current_page = ( $max_pages > 1 ) ? ( $page_counter + 1 ) : ''; - - if ( ! is_array( $tax->object_type ) || count( $tax->object_type ) == 0 ) { - continue; - } - - $terms = array_splice( $all_taxonomies[ $tax_name ], 0, $max_entries ); - - if ( ! $terms ) { - continue; - } - - $args = array( - 'post_type' => $tax->object_type, - 'tax_query' => array( - array( - 'taxonomy' => $tax_name, - 'terms' => $terms, - ), - ), - 'orderby' => 'modified', - 'order' => 'DESC', - 'posts_per_page' => 1, - ); - $query = new WP_Query( $args ); - - if ( $query->have_posts() ) { - $date = $query->posts[0]->post_modified_gmt; - } - else { - $date = $last_modified_gmt; - } - - $index[] = array( - 'loc' => WPSEO_Sitemaps_Router::get_base_url( $tax_name . '-sitemap' . $current_page . '.xml' ), - 'lastmod' => $date, - ); - } - } - - return $index; - } - - /** - * Get set of sitemap link data. - * - * @param string $type Sitemap type. - * @param int $max_entries Entries per sitemap. - * @param int $current_page Current page of the sitemap. - * - * @return array - */ - public function get_sitemap_links( $type, $max_entries, $current_page ) { - - global $wpdb; - - $links = array(); - $taxonomy = get_taxonomy( $type ); - - if ( $taxonomy === false || ! $this->is_valid_taxonomy( $taxonomy->name ) || ! $taxonomy->public ) { - return $links; - } - - $options = $this->get_options(); - - $steps = $max_entries; - $offset = ( $current_page > 1 ) ? ( ( $current_page - 1 ) * $max_entries ) : 0; - - /** This filter is documented in inc/sitemaps/class-taxonomy-sitemap-provider.php */ - $hide_empty = apply_filters( 'wpseo_sitemap_exclude_empty_terms', true, $taxonomy ); - $terms = get_terms( $taxonomy->name, array( 'hide_empty' => $hide_empty ) ); - $terms = array_splice( $terms, $offset, $steps ); - - if ( empty( $terms ) ) { - $terms = array(); - } - - // Grab last modified date. - $sql = " - SELECT MAX(p.post_modified_gmt) AS lastmod - FROM $wpdb->posts AS p - INNER JOIN $wpdb->term_relationships AS term_rel - ON term_rel.object_id = p.ID - INNER JOIN $wpdb->term_taxonomy AS term_tax - ON term_tax.term_taxonomy_id = term_rel.term_taxonomy_id - AND term_tax.taxonomy = %s - AND term_tax.term_id = %d - WHERE p.post_status IN ('publish','inherit') - AND p.post_password = '' - "; - - foreach ( $terms as $term ) { - - $url = array(); - - $tax_noindex = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'noindex' ); - $tax_sitemap_inc = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'sitemap_include' ); - - if ( $tax_noindex === 'noindex' && $tax_sitemap_inc !== 'always' ) { - continue; - } - - if ( $tax_sitemap_inc === 'never' ) { - continue; - } - - $url['loc'] = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'canonical' ); - - if ( ! is_string( $url['loc'] ) || $url['loc'] === '' ) { - - $url['loc'] = get_term_link( $term, $term->taxonomy ); - - if ( $options['trailingslash'] === true ) { - - $url['loc'] = trailingslashit( $url['loc'] ); - } - } - - $url['mod'] = $wpdb->get_var( $wpdb->prepare( $sql, $term->taxonomy, $term->term_id ) ); - $url['images'] = $this->get_image_parser()->get_term_images( $term ); - - // Deprecated, kept for backwards data compat. R. - $url['chf'] = 'daily'; - $url['pri'] = 1; - - /** This filter is documented at inc/sitemaps/class-post-type-sitemap-provider.php */ - $url = apply_filters( 'wpseo_sitemap_entry', $url, 'term', $term ); - - if ( ! empty( $url ) ) { - $links[] = $url; - } - } - - return $links; - } - - /** - * Check if taxonomy by name is valid to appear in sitemaps. - * - * @param string $taxonomy_name Taxonomy name to check. - * - * @return bool - */ - public function is_valid_taxonomy( $taxonomy_name ) { - - $options = $this->get_options(); - if ( ! empty( $options[ "taxonomies-{$taxonomy_name}-not_in_sitemap" ] ) ) { - return false; - } - - if ( in_array( $taxonomy_name, array( 'link_category', 'nav_menu' ) ) ) { - return false; - } - - if ( 'post_format' === $taxonomy_name && ! empty( $options['disable-post_format'] ) ) { - return false; - } - - /** - * Filter to exclude the taxonomy from the XML sitemap. - * - * @param boolean $exclude Defaults to false. - * @param string $taxonomy_name Name of the taxonomy to exclude.. - */ - if ( apply_filters( 'wpseo_sitemap_exclude_taxonomy', false, $taxonomy_name ) ) { - return false; - } - - return true; - } - - /** - * Get the Image Parser - * - * @return WPSEO_Sitemap_Image_Parser - */ - protected function get_image_parser() { - if ( ! isset( self::$image_parser ) ) { - self::$image_parser = new WPSEO_Sitemap_Image_Parser(); - } - - return self::$image_parser; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/interface-sitemap-cache-data.php b/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/interface-sitemap-cache-data.php deleted file mode 100644 index a2b929bc..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/sitemaps/interface-sitemap-cache-data.php +++ /dev/null @@ -1,56 +0,0 @@ -get_terms( $id, $taxonomy, $return_single ); -} - -/** - * Generate an HTML sitemap - * - * @deprecated 1.5.5.4 - * @deprecated use plugin Yoast SEO Premium - * @see Yoast SEO Premium - * - * @param array $atts The attributes passed to the shortcode. - * - * @return string - */ -function wpseo_sitemap_handler( $atts ) { - _deprecated_function( __FUNCTION__, 'WPSEO 1.5.5.4', 'Functionality has been discontinued after being in beta, it\'ll be available in the Yoast SEO Premium plugin soon.' ); - - return ''; -} - -add_shortcode( 'wpseo_sitemap', 'wpseo_sitemap_handler' ); - -/** - * Strip out the shortcodes with a filthy regex, because people don't properly register their shortcodes. - * - * @deprecated 1.6.1 - * @deprecated use WPSEO_Utils::strip_shortcode() - * @see WPSEO_Utils::strip_shortcode() - * - * @param string $text Input string that might contain shortcodes. - * - * @return string $text string without shortcodes - */ -function wpseo_strip_shortcode( $text ) { - _deprecated_function( __FUNCTION__, 'WPSEO 1.6.1', 'WPSEO_Utils::strip_shortcode()' ); - - return WPSEO_Utils::strip_shortcode( $text ); -} - -/** - * Do simple reliable math calculations without the risk of wrong results - * - * @see http://floating-point-gui.de/ - * @see the big red warning on http://php.net/language.types.float.php - * - * @deprecated 1.6.1 - * @deprecated use WPSEO_Utils::calc() - * @see WPSEO_Utils::calc() - * - * In the rare case that the bcmath extension would not be loaded, it will return the normal calculation results - * - * @since 1.5.0 - * - * @param mixed $number1 Scalar (string/int/float/bool). - * @param string $action Calculation action to execute. - * @param mixed $number2 Scalar (string/int/float/bool). - * @param bool $round Whether or not to round the result. Defaults to false. - * @param int $decimals Decimals for rounding operation. Defaults to 0. - * @param int $precision Calculation precision. Defaults to 10. - * - * @return mixed Calculation Result or false if either or the numbers isn't scalar or - * an invalid operation was passed - */ -function wpseo_calc( $number1, $action, $number2, $round = false, $decimals = 0, $precision = 10 ) { - _deprecated_function( __FUNCTION__, 'WPSEO 1.6.1', 'WPSEO_Utils::calc()' ); - - return WPSEO_Utils::calc( $number1, $action, $number2, $round, $decimals, $precision ); -} - -/** - * Check if the web server is running on Apache - * - * @deprecated 1.6.1 - * @deprecated use WPSEO_Utils::is_apache() - * @see WPSEO_Utils::is_apache() - * - * @return bool - */ -function wpseo_is_apache() { - _deprecated_function( __FUNCTION__, 'WPSEO 1.6.1', 'WPSEO_Utils::is_apache()' ); - - return WPSEO_Utils::is_apache(); -} - -/** - * Check if the web service is running on Nginx - * - * @deprecated 1.6.1 - * @deprecated use WPSEO_Utils::is_nginx() - * @see WPSEO_Utils::is_nginx() - * - * @return bool - */ -function wpseo_is_nginx() { - _deprecated_function( __FUNCTION__, 'WPSEO 1.6.1', 'WPSEO_Utils::is_nginx()' ); - - return WPSEO_Utils::is_nginx(); -} - -/** - * List all the available user roles - * - * @deprecated 1.6.1 - * @deprecated use WPSEO_Utils::get_roles() - * @see WPSEO_Utils::get_roles() - * - * @return array $roles - */ -function wpseo_get_roles() { - _deprecated_function( __FUNCTION__, 'WPSEO 1.6.1', 'WPSEO_Utils::get_roles()' ); - - return WPSEO_Utils::get_roles(); -} - -/** - * Check whether a url is relative - * - * @deprecated 1.6.1 - * @deprecated use WPSEO_Utils::is_url_relative() - * @see WPSEO_Utils::is_url_relative() - * - * @param string $url URL input to check. - * - * @return bool - */ -function wpseo_is_url_relative( $url ) { - _deprecated_function( __FUNCTION__, 'WPSEO 1.6.1', 'WPSEO_Utils::is_url_relative()' ); - - return WPSEO_Utils::is_url_relative( $url ); -} - -/** - * Standardize whitespace in a string - * - * @deprecated 1.6.1 - * @deprecated use WPSEO_Utils::standardize_whitespace() - * @see WPSEO_Utils::standardize_whitespace() - * - * @since 1.6.0 - * - * @param string $string String input to standardize. - * - * @return string - */ -function wpseo_standardize_whitespace( $string ) { - _deprecated_function( __FUNCTION__, 'WPSEO 1.6.1', 'WPSEO_Utils::standardize_whitespace()' ); - - return WPSEO_Utils::standardize_whitespace( $string ); -} - -/** - * Initialize sitemaps. Add sitemap & XSL rewrite rules and query vars - * - * @deprecated 2.4 - * @see WPSEO_Sitemaps_Router - */ -function wpseo_xml_sitemaps_init() { - _deprecated_function( __FUNCTION__, 'WPSEO 2.4', 'WPSEO_Sitemaps_Router' ); - - $options = get_option( 'wpseo_xml' ); - if ( $options['enablexmlsitemap'] !== true ) { - return; - } - - // Redirects sitemap.xml to sitemap_index.xml. - add_action( 'template_redirect', 'wpseo_xml_redirect_sitemap', 0 ); - - if ( ! is_object( $GLOBALS['wp'] ) ) { - return; - } - - $GLOBALS['wp']->add_query_var( 'sitemap' ); - $GLOBALS['wp']->add_query_var( 'sitemap_n' ); - $GLOBALS['wp']->add_query_var( 'xsl' ); - add_rewrite_rule( 'sitemap_index\.xml$', 'index.php?sitemap=1', 'top' ); - add_rewrite_rule( '([^/]+?)-sitemap([0-9]+)?\.xml$', 'index.php?sitemap=$matches[1]&sitemap_n=$matches[2]', 'top' ); - add_rewrite_rule( '([a-z]+)?-?sitemap\.xsl$', 'index.php?xsl=$matches[1]', 'top' ); -} - -/** - * Redirect /sitemap.xml to /sitemap_index.xml - * - * @deprecated 2.4 - * @see WPSEO_Sitemaps_Router - */ -function wpseo_xml_redirect_sitemap() { - _deprecated_function( __FUNCTION__, 'WPSEO 2.4', 'WPSEO_Sitemaps_Router' ); - - $current_url = ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' ) ? 'https://' : 'http://'; - $current_url .= sanitize_text_field( $_SERVER['SERVER_NAME'] ) . sanitize_text_field( $_SERVER['REQUEST_URI'] ); - - // Must be 'sitemap.xml' and must be 404. - if ( home_url( '/sitemap.xml' ) == $current_url && $GLOBALS['wp_query']->is_404 ) { - wp_redirect( home_url( '/sitemap_index.xml' ), 301 ); - exit; - } -} - -/** - * This invalidates our XML Sitemaps cache. - * - * @since 1.5.4 - * @deprecated 3.2 - * @deprecated use WPSEO_Sitemaps_Cache::invalidate() - * @see WPSEO_Sitemaps_Cache::invalidate() - * - * @param string $type Type of sitemap to invalidate. - */ -function wpseo_invalidate_sitemap_cache( $type ) { - _deprecated_function( __FUNCTION__, 'WPSEO 3.2.0', 'WPSEO_Sitemaps_Cache::invalidate()' ); - - WPSEO_Sitemaps_Cache::invalidate( $type ); -} - -/** - * Invalidate XML sitemap cache for taxonomy / term actions - * - * @since 1.5.4 - * @deprecated 3.2 - * @deprecated use WPSEO_Sitemaps_Cache::invalidate() - * @see WPSEO_Sitemaps_Cache::invalidate() - * - * @param int $unused Unused term ID value. - * @param string $type Taxonomy to invalidate. - */ -function wpseo_invalidate_sitemap_cache_terms( $unused, $type ) { - _deprecated_function( __FUNCTION__, 'WPSEO 3.2.0', 'WPSEO_Sitemaps_Cache::invalidate()' ); - - WPSEO_Sitemaps_Cache::invalidate( $type ); -} - -/** - * Invalidate the XML sitemap cache for a post type when publishing or updating a post - * - * @since 1.5.4 - * @deprecated 3.2 - * @deprecated use WPSEO_Sitemaps_Cache::invalidate_post() - * @see WPSEO_Sitemaps_Cache::invalidate_post() - * - * @param int $post_id Post ID to determine post type for invalidation. - */ -function wpseo_invalidate_sitemap_cache_on_save_post( $post_id ) { - _deprecated_function( __FUNCTION__, 'WPSEO 3.2.0', 'WPSEO_Sitemaps_Cache::invalidate_post()' ); - - WPSEO_Sitemaps_Cache::invalidate_post( $post_id ); -} - -/** - * Notify search engines of the updated sitemap. - * - * @deprecated 3.2 - * @deprecated use WPSEO_Sitemaps::ping_search_engines() - * @see WPSEO_Sitemaps::ping_search_engines() - * - * @param string|null $sitemapurl Optional URL to make the ping for. - */ -function wpseo_ping_search_engines( $sitemapurl = null ) { - _deprecated_function( __FUNCTION__, 'WPSEO 3.2.0', 'WPSEO_Sitemaps::ping_search_engines()' ); - - WPSEO_Sitemaps::ping_search_engines( $sitemapurl ); -} - -/** - * Create base URL for the sitemaps and applies filters - * - * @since 1.5.7 - * - * @deprecated 3.2 - * @deprecated use WPSEO_Sitemaps_Router::get_base_url() - * @see WPSEO_Sitemaps_Router::get_base_url() - * - * @param string $page page to append to the base URL. - * - * @return string base URL (incl page) for the sitemaps - */ -function wpseo_xml_sitemaps_base_url( $page ) { - _deprecated_function( __FUNCTION__, 'WPSEO 3.2.0', 'WPSEO_Sitemaps_Router::get_base_url()' ); - - return WPSEO_Sitemaps_Router::get_base_url( $page ); -} diff --git a/wp/wp-content/plugins/wordpress-seo/inc/wpseo-functions.php b/wp/wp-content/plugins/wordpress-seo/inc/wpseo-functions.php deleted file mode 100644 index 535928b1..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/wpseo-functions.php +++ /dev/null @@ -1,294 +0,0 @@ -ID ); - return $primary_term->get_primary_term(); - } -} - -if ( ! function_exists( 'yoast_get_primary_term' ) ) { - /** - * Get the primary term name - * - * @param string $taxonomy Optional. The taxonomy to get the primary term for. Defaults to category. - * @param null|int|WP_Post $post Optional. Post to get the primary term for. - * - * @return string Name of the primary term. - */ - function yoast_get_primary_term( $taxonomy = 'category', $post = null ) { - $primary_term_id = yoast_get_primary_term_id( $taxonomy, $post ); - - $term = get_term( $primary_term_id ); - if ( ! is_wp_error( $term ) && ! empty( $term ) ) { - return $term->name; - } - - return ''; - } -} - -/** - * Add the bulk edit capability to the proper default roles. - */ -function wpseo_add_capabilities() { - $roles = array( - 'administrator', - 'editor', - ); - - $roles = apply_filters( 'wpseo_bulk_edit_roles', $roles ); - - foreach ( $roles as $role ) { - $r = get_role( $role ); - if ( $r ) { - $r->add_cap( 'wpseo_bulk_edit' ); - } - } -} - - -/** - * Remove the bulk edit capability from the proper default roles. - * - * Contributor is still removed for legacy reasons. - */ -function wpseo_remove_capabilities() { - $roles = array( - 'administrator', - 'editor', - 'author', - 'contributor', - ); - - $roles = apply_filters( 'wpseo_bulk_edit_roles', $roles ); - - foreach ( $roles as $role ) { - $r = get_role( $role ); - if ( $r ) { - $r->remove_cap( 'wpseo_bulk_edit' ); - } - } -} - - -/** - * Replace `%%variable_placeholders%%` with their real value based on the current requested page/post/cpt - * - * @param string $string the string to replace the variables in. - * @param object $args the object some of the replacement values might come from, could be a post, taxonomy or term. - * @param array $omit variables that should not be replaced by this function. - * - * @return string - */ -function wpseo_replace_vars( $string, $args, $omit = array() ) { - $replacer = new WPSEO_Replace_Vars; - - return $replacer->replace( $string, $args, $omit ); -} - -/** - * Register a new variable replacement - * - * This function is for use by other plugins/themes to easily add their own additional variables to replace. - * This function should be called from a function on the 'wpseo_register_extra_replacements' action hook. - * The use of this function is preferred over the older 'wpseo_replacements' filter as a way to add new replacements. - * The 'wpseo_replacements' filter should still be used to adjust standard WPSEO replacement values. - * The function can not be used to replace standard WPSEO replacement value functions and will thrown a warning - * if you accidently try. - * To avoid conflicts with variables registered by WPSEO and other themes/plugins, try and make the - * name of your variable unique. Variable names also can not start with "%%cf_" or "%%ct_" as these are reserved - * for the standard WPSEO variable variables 'cf_', 'ct_' and - * 'ct_desc_'. - * The replacement function will be passed the undelimited name (i.e. stripped of the %%) of the variable - * to replace in case you need it. - * - * Example code: - * - * - * - * - * @since 1.5.4 - * - * @param string $var The name of the variable to replace, i.e. '%%var%%' - * - the surrounding %% are optional, name can only contain [A-Za-z0-9_-]. - * @param mixed $replace_function Function or method to call to retrieve the replacement value for the variable - * Uses the same format as add_filter/add_action function parameter and - * should *return* the replacement value. DON'T echo it. - * @param string $type Type of variable: 'basic' or 'advanced', defaults to 'advanced'. - * @param string $help_text Help text to be added to the help tab for this variable. - * - * @return bool Whether the replacement function was succesfully registered - */ -function wpseo_register_var_replacement( $var, $replace_function, $type = 'advanced', $help_text = '' ) { - return WPSEO_Replace_Vars::register_replacement( $var, $replace_function, $type, $help_text ); -} - -/** - * WPML plugin support: Set titles for custom types / taxonomies as translatable. - * It adds new keys to a wpml-config.xml file for a custom post type title, metadesc, title-ptarchive and metadesc-ptarchive fields translation. - * Documentation: http://wpml.org/documentation/support/language-configuration-files/ - * - * @global $sitepress - * - * @param array $config WPML configuration data to filter. - * - * @return array - */ -function wpseo_wpml_config( $config ) { - global $sitepress; - - if ( ( is_array( $config ) && isset( $config['wpml-config']['admin-texts']['key'] ) ) && ( is_array( $config['wpml-config']['admin-texts']['key'] ) && $config['wpml-config']['admin-texts']['key'] !== array() ) ) { - $admin_texts = $config['wpml-config']['admin-texts']['key']; - foreach ( $admin_texts as $k => $val ) { - if ( $val['attr']['name'] === 'wpseo_titles' ) { - $translate_cp = array_keys( $sitepress->get_translatable_documents() ); - if ( is_array( $translate_cp ) && $translate_cp !== array() ) { - foreach ( $translate_cp as $post_type ) { - $admin_texts[ $k ]['key'][]['attr']['name'] = 'title-' . $post_type; - $admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-' . $post_type; - $admin_texts[ $k ]['key'][]['attr']['name'] = 'metakey-' . $post_type; - $admin_texts[ $k ]['key'][]['attr']['name'] = 'title-ptarchive-' . $post_type; - $admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-ptarchive-' . $post_type; - $admin_texts[ $k ]['key'][]['attr']['name'] = 'metakey-ptarchive-' . $post_type; - - $translate_tax = $sitepress->get_translatable_taxonomies( false, $post_type ); - if ( is_array( $translate_tax ) && $translate_tax !== array() ) { - foreach ( $translate_tax as $taxonomy ) { - $admin_texts[ $k ]['key'][]['attr']['name'] = 'title-tax-' . $taxonomy; - $admin_texts[ $k ]['key'][]['attr']['name'] = 'metadesc-tax-' . $taxonomy; - $admin_texts[ $k ]['key'][]['attr']['name'] = 'metakey-tax-' . $taxonomy; - } - } - } - } - break; - } - } - $config['wpml-config']['admin-texts']['key'] = $admin_texts; - } - - return $config; -} - -add_filter( 'icl_wpml_config_array', 'wpseo_wpml_config' ); - -/** - * Yoast SEO breadcrumb shortcode - * [wpseo_breadcrumb] - * - * @return string - */ -function wpseo_shortcode_yoast_breadcrumb() { - return yoast_breadcrumb( '', '', false ); -} - -add_shortcode( 'wpseo_breadcrumb', 'wpseo_shortcode_yoast_breadcrumb' ); - -/** - * Emulate PHP native ctype_digit() function for when the ctype extension would be disabled *sigh* - * Only emulates the behaviour for when the input is a string, does not handle integer input as ascii value - * - * @param string $string - * - * @return bool - */ -if ( ! extension_loaded( 'ctype' ) || ! function_exists( 'ctype_digit' ) ) { - - /** - * @param string $string String input to validate. - * - * @return bool - */ - function ctype_digit( $string ) { - $return = false; - if ( ( is_string( $string ) && $string !== '' ) && preg_match( '`^\d+$`', $string ) === 1 ) { - $return = true; - } - - return $return; - } -} - -/** - * Makes sure the taxonomy meta is updated when a taxonomy term is split. - * - * @link https://make.wordpress.org/core/2015/02/16/taxonomy-term-splitting-in-4-2-a-developer-guide/ Article explaining the taxonomy term splitting in WP 4.2. - * - * @param string $old_term_id Old term id of the taxonomy term that was splitted. - * @param string $new_term_id New term id of the taxonomy term that was splitted. - * @param string $term_taxonomy_id Term taxonomy id for the taxonomy that was affected. - * @param string $taxonomy The taxonomy that the taxonomy term was splitted for. - */ -function wpseo_split_shared_term( $old_term_id, $new_term_id, $term_taxonomy_id, $taxonomy ) { - $tax_meta = get_option( 'wpseo_taxonomy_meta', array() ); - - if ( ! empty( $tax_meta[ $taxonomy ][ $old_term_id ] ) ) { - $tax_meta[ $taxonomy ][ $new_term_id ] = $tax_meta[ $taxonomy ][ $old_term_id ]; - unset( $tax_meta[ $taxonomy ][ $old_term_id ] ); - update_option( 'wpseo_taxonomy_meta', $tax_meta ); - } -} - -add_action( 'split_shared_term', 'wpseo_split_shared_term', 10, 4 ); diff --git a/wp/wp-content/plugins/wordpress-seo/inc/wpseo-non-ajax-functions.php b/wp/wp-content/plugins/wordpress-seo/inc/wpseo-non-ajax-functions.php deleted file mode 100644 index f93ad7ef..00000000 --- a/wp/wp-content/plugins/wordpress-seo/inc/wpseo-non-ajax-functions.php +++ /dev/null @@ -1,546 +0,0 @@ -ID ); - - if ( $analysis_seo->is_enabled() ) { - $score = wpseo_adminbar_seo_score(); - } - elseif ( $analysis_readability->is_enabled() ) { - $score = wpseo_adminbar_content_score(); - } - } - - if ( is_category() || is_tag() || (WPSEO_Taxonomy::is_term_edit( $GLOBALS['pagenow'] ) && ! WPSEO_Taxonomy::is_term_overview( $GLOBALS['pagenow'] ) ) || is_tax() ) { - if ( $analysis_seo->is_enabled() ) { - $score = wpseo_tax_adminbar_seo_score(); - } - elseif ( $analysis_readability->is_enabled() ) { - $score = wpseo_tax_adminbar_content_score(); - } - } - - // Never display notifications for network admin. - $counter = $alert_popup = ''; - - // Set the top level menu item content for admins and network admins. - if ( $user_is_admin_or_networkadmin ) { - - // Link the top level menu item to the Yoast Dashboard page. - $seo_url = get_admin_url( null, 'admin.php?page=' . WPSEO_Admin::PAGE_IDENTIFIER ); - // Since admins will get a real link, there's no need for a tabindex attribute. - $top_level_link_tabindex = false; - - if ( '' === $score ) { - - // Notification information. - $notification_center = Yoast_Notification_Center::get(); - $notification_count = $notification_center->get_notification_count(); - $new_notifications = $notification_center->get_new_notifications(); - $new_notifications_count = count( $new_notifications ); - - if ( $notification_count > 0 ) { - // Always show Alerts page when clicking on the main link. - /* translators: %s: number of notifications */ - $counter_screen_reader_text = sprintf( _n( '%s notification', '%s notifications', $notification_count, 'wordpress-seo' ), number_format_i18n( $notification_count ) ); - $counter = sprintf( '
    %s
    ', $notification_count, $counter_screen_reader_text ); - } - - if ( $new_notifications_count ) { - if ( $new_notifications_count === 1 ) { - $notification = sprintf( - __( 'You have a new issue concerning your SEO!', 'wordpress-seo' ), - $new_notifications_count - ); - } - else { - $notification = sprintf( - /* translators: %d resolves to the number of alerts being added. */ - _n( 'You have %d new issue concerning your SEO!', 'You have %d new issues concerning your SEO!', $new_notifications_count, 'wordpress-seo' ), - $new_notifications_count - ); - } - $alert_popup = '
    ' . $notification . '
    '; - } - } - } - - $title = ''; - - $wp_admin_bar->add_menu( array( - 'id' => 'wpseo-menu', - 'title' => $title . $score . $counter . $alert_popup, - 'href' => $seo_url, - 'meta' => array( 'tabindex' => $top_level_link_tabindex ), - ) ); - if ( ! empty( $notification_count ) ) { - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-menu', - 'id' => 'wpseo-notifications', - 'title' => __( 'Notifications', 'wordpress-seo' ) . $counter, - 'href' => $seo_url, - 'meta' => array( 'tabindex' => $top_level_link_tabindex ), - ) ); - } - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-menu', - 'id' => 'wpseo-kwresearch', - 'title' => __( 'Keyword Research', 'wordpress-seo' ), - 'meta' => array( 'tabindex' => '0' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-kwresearch', - 'id' => 'wpseo-adwordsexternal', - 'title' => __( 'AdWords External', 'wordpress-seo' ), - 'href' => 'http://adwords.google.com/keywordplanner', - 'meta' => array( 'target' => '_blank' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-kwresearch', - 'id' => 'wpseo-googleinsights', - 'title' => __( 'Google Trends', 'wordpress-seo' ), - 'href' => 'https://www.google.com/trends/explore#q=' . urlencode( $focuskw ), - 'meta' => array( 'target' => '_blank' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-kwresearch', - 'id' => 'wpseo-wordtracker', - 'title' => __( 'SEO Book', 'wordpress-seo' ), - 'href' => 'http://tools.seobook.com/keyword-tools/seobook/?keyword=' . urlencode( $focuskw ), - 'meta' => array( 'target' => '_blank' ), - ) ); - - if ( ! is_admin() ) { - $url = WPSEO_Frontend::get_instance()->canonical( false ); - - if ( is_string( $url ) ) { - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-menu', - 'id' => 'wpseo-analysis', - 'title' => __( 'Analyze this page', 'wordpress-seo' ), - 'meta' => array( 'tabindex' => '0' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-analysis', - 'id' => 'wpseo-inlinks-ose', - 'title' => __( 'Check Inlinks (OSE)', 'wordpress-seo' ), - 'href' => '//moz.com/researchtools/ose/links?site=' . urlencode( $url ), - 'meta' => array( 'target' => '_blank' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-analysis', - 'id' => 'wpseo-kwdensity', - 'title' => __( 'Check Keyword Density', 'wordpress-seo' ), - // HTTPS not available. - 'href' => 'http://www.zippy.co.uk/keyworddensity/index.php?url=' . urlencode( $url ) . '&keyword=' . urlencode( $focuskw ), - 'meta' => array( 'target' => '_blank' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-analysis', - 'id' => 'wpseo-cache', - 'title' => __( 'Check Google Cache', 'wordpress-seo' ), - 'href' => '//webcache.googleusercontent.com/search?strip=1&q=cache:' . urlencode( $url ), - 'meta' => array( 'target' => '_blank' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-analysis', - 'id' => 'wpseo-header', - 'title' => __( 'Check Headers', 'wordpress-seo' ), - 'href' => '//quixapp.com/headers/?r=' . urlencode( $url ), - 'meta' => array( 'target' => '_blank' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-analysis', - 'id' => 'wpseo-structureddata', - 'title' => __( 'Google Structured Data Test', 'wordpress-seo' ), - 'href' => 'https://search.google.com/structured-data/testing-tool#url=' . urlencode( $url ), - 'meta' => array( 'target' => '_blank' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-analysis', - 'id' => 'wpseo-facebookdebug', - 'title' => __( 'Facebook Debugger', 'wordpress-seo' ), - 'href' => '//developers.facebook.com/tools/debug/og/object?q=' . urlencode( $url ), - 'meta' => array( 'target' => '_blank' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-analysis', - 'id' => 'wpseo-pinterestvalidator', - 'title' => __( 'Pinterest Rich Pins Validator', 'wordpress-seo' ), - 'href' => 'https://developers.pinterest.com/tools/url-debugger/?link=' . urlencode( $url ), - 'meta' => array( 'target' => '_blank' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-analysis', - 'id' => 'wpseo-htmlvalidation', - 'title' => __( 'HTML Validator', 'wordpress-seo' ), - 'href' => '//validator.w3.org/check?uri=' . urlencode( $url ), - 'meta' => array( 'target' => '_blank' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-analysis', - 'id' => 'wpseo-cssvalidation', - 'title' => __( 'CSS Validator', 'wordpress-seo' ), - 'href' => '//jigsaw.w3.org/css-validator/validator?uri=' . urlencode( $url ), - 'meta' => array( 'target' => '_blank' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-analysis', - 'id' => 'wpseo-pagespeed', - 'title' => __( 'Google Page Speed Test', 'wordpress-seo' ), - 'href' => '//developers.google.com/speed/pagespeed/insights/?url=' . urlencode( $url ), - 'meta' => array( 'target' => '_blank' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-analysis', - 'id' => 'wpseo-microsoftedge', - 'title' => __( 'Microsoft Edge Site Scan', 'wordpress-seo' ), - 'href' => 'https://developer.microsoft.com/en-us/microsoft-edge/tools/staticscan/?url=' . urlencode( $url ), - 'meta' => array( 'target' => '_blank' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-analysis', - 'id' => 'wpseo-google-mobile-friendly', - 'title' => __( 'Mobile-Friendly Test', 'wordpress-seo' ), - 'href' => 'https://www.google.com/webmasters/tools/mobile-friendly/?url=' . urlencode( $url ), - 'meta' => array( 'target' => '_blank' ), - ) ); - } - } - - // @todo: add links to bulk title and bulk description edit pages. - if ( $user_is_admin_or_networkadmin ) { - - $advanced_settings = wpseo_advanced_settings_enabled( $options ); - - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-menu', - 'id' => 'wpseo-settings', - 'title' => __( 'SEO Settings', 'wordpress-seo' ), - 'meta' => array( 'tabindex' => '0' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-settings', - 'id' => 'wpseo-general', - 'title' => __( 'Dashboard', 'wordpress-seo' ), - 'href' => admin_url( 'admin.php?page=wpseo_dashboard' ), - ) ); - if ( $advanced_settings ) { - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-settings', - 'id' => 'wpseo-titles', - 'title' => __( 'Titles & Metas', 'wordpress-seo' ), - 'href' => admin_url( 'admin.php?page=wpseo_titles' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-settings', - 'id' => 'wpseo-social', - 'title' => __( 'Social', 'wordpress-seo' ), - 'href' => admin_url( 'admin.php?page=wpseo_social' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-settings', - 'id' => 'wpseo-xml', - 'title' => __( 'XML Sitemaps', 'wordpress-seo' ), - 'href' => admin_url( 'admin.php?page=wpseo_xml' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-settings', - 'id' => 'wpseo-wpseo-advanced', - 'title' => __( 'Advanced', 'wordpress-seo' ), - 'href' => admin_url( 'admin.php?page=wpseo_advanced' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-settings', - 'id' => 'wpseo-tools', - 'title' => __( 'Tools', 'wordpress-seo' ), - 'href' => admin_url( 'admin.php?page=wpseo_tools' ), - ) ); - } - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-settings', - 'id' => 'wpseo-search-console', - 'title' => __( 'Search Console', 'wordpress-seo' ), - 'href' => admin_url( 'admin.php?page=wpseo_search_console' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'wpseo-settings', - 'id' => 'wpseo-licenses', - 'title' => __( 'Go Premium', 'wordpress-seo' ), - 'href' => admin_url( 'admin.php?page=wpseo_licenses' ), - ) ); - } - -} - -/** - * Returns the SEO score element for the admin bar. - * - * @return string - */ -function wpseo_adminbar_seo_score() { - $rating = WPSEO_Meta::get_value( 'linkdex', get_the_ID() ); - - return wpseo_adminbar_score( $rating ); -} - -/** - * Returns the content score element for the adminbar. - * - * @return string - */ -function wpseo_adminbar_content_score() { - $rating = WPSEO_Meta::get_value( 'content_score', get_the_ID() ); - - return wpseo_adminbar_score( $rating ); -} - -/** - * Returns the SEO score element for the adminbar. - * - * @return string - */ -function wpseo_tax_adminbar_seo_score() { - $rating = 0; - - if ( is_tax() || is_category() || is_tag() ) { - $rating = WPSEO_Taxonomy_Meta::get_meta_without_term( 'linkdex' ); - } - - return wpseo_adminbar_score( $rating ); -} - -/** - * Returns the Content score element for the adminbar. - * - * @return string - */ -function wpseo_tax_adminbar_content_score() { - $rating = 0; - - if ( is_tax() || is_category() || is_tag() ) { - $rating = WPSEO_Taxonomy_Meta::get_meta_without_term( 'content_score' ); - } - - return wpseo_adminbar_score( $rating ); -} - -/** - * Takes The SEO score and makes the score icon for the adminbar with it. - * - * @param int $score The 0-100 rating of the score. Can be either SEO score or content score. - * - * @return string $score_adminbar_element - */ -function wpseo_adminbar_score( $score ) { - $score = WPSEO_Utils::translate_score( $score ); - - $score_adminbar_element = '
    '; - return $score_adminbar_element; -} - -add_action( 'admin_bar_menu', 'wpseo_admin_bar_menu', 95 ); - -/** - * Enqueue CSS to format the Yoast SEO adminbar item. - */ -function wpseo_admin_bar_style() { - - if ( ! is_admin_bar_showing() ) { - return; - } - - $asset_manager = new WPSEO_Admin_Asset_Manager(); - $asset_manager->register_assets(); - $asset_manager->enqueue_style( 'adminbar' ); -} - -add_action( 'wp_enqueue_scripts', 'wpseo_admin_bar_style' ); -add_action( 'admin_enqueue_scripts', 'wpseo_admin_bar_style' ); - -/** - * Allows editing of the meta fields through weblog editors like Marsedit. - * - * @param array $allcaps Capabilities that must all be true to allow action. - * @param array $cap Array of capabilities to be checked, unused here. - * @param array $args List of arguments for the specific cap to be checked. - * - * @return array $allcaps - */ -function allow_custom_field_edits( $allcaps, $cap, $args ) { - // $args[0] holds the capability. - // $args[2] holds the post ID. - // $args[3] holds the custom field. - // Make sure the request is to edit or add a post meta (this is usually also the second value in $cap, - // but this is safer to check). - if ( in_array( $args[0], array( 'edit_post_meta', 'add_post_meta' ) ) ) { - // Only allow editing rights for users who have the rights to edit this post and make sure - // the meta value starts with _yoast_wpseo (WPSEO_Meta::$meta_prefix). - if ( ( isset( $args[2] ) && current_user_can( 'edit_post', $args[2] ) ) && ( ( isset( $args[3] ) && $args[3] !== '' ) && strpos( $args[3], WPSEO_Meta::$meta_prefix ) === 0 ) ) { - $allcaps[ $args[0] ] = true; - } - } - - return $allcaps; -} - -add_filter( 'user_has_cap', 'allow_custom_field_edits', 0, 3 ); - -/** - * Detects if the advanced settings are enabled. - * - * @param array $wpseo_options The wpseo settings. - * - * @returns boolean True if the advanced settings are enabled, false if not. - */ -function wpseo_advanced_settings_enabled( $wpseo_options ) { - return ( $wpseo_options['enable_setting_pages'] === true ); -} - -/********************** DEPRECATED FUNCTIONS **********************/ - -/** - * Set the default settings. - * - * @deprecated 1.5.0 - * @deprecated use WPSEO_Options::initialize() - * @see WPSEO_Options::initialize() - */ -function wpseo_defaults() { - _deprecated_function( __FUNCTION__, 'WPSEO 1.5.0', 'WPSEO_Options::initialize()' ); - WPSEO_Options::initialize(); -} - -/** - * Translates a decimal analysis score into a textual one. - * - * @deprecated 1.5.6.1 - * @deprecated use WPSEO_Utils::translate_score() - * @see WPSEO_Utils::translate_score() - * - * @param int $val The decimal score to translate. - * @param bool $css_value Whether to return the i18n translated score or the CSS class value. - * - * @return string - */ -function wpseo_translate_score( $val, $css_value = true ) { - _deprecated_function( __FUNCTION__, 'WPSEO 1.5.6.1', 'WPSEO_Utils::translate_score()' ); - - return WPSEO_Utils::translate_score(); -} - -/** - * Check whether file editing is allowed for the .htaccess and robots.txt files - * - * @deprecated 1.5.6.1 - * @deprecated use WPSEO_Utils::allow_system_file_edit() - * @see WPSEO_Utils::allow_system_file_edit() - * - * @internal current_user_can() checks internally whether a user is on wp-ms and adjusts accordingly. - * - * @return bool - */ -function wpseo_allow_system_file_edit() { - _deprecated_function( __FUNCTION__, 'WPSEO 1.5.6.1', 'WPSEO_Utils::allow_system_file_edit()' ); - - return WPSEO_Utils::allow_system_file_edit(); -} - -/** - * Test whether force rewrite should be enabled or not. - * - * @deprecated 3.3 - * - * @return void - */ -function wpseo_title_test() { - _deprecated_function( __FUNCTION__, 'WPSEO 3.3.0' ); -} - -/** - * Test whether the active theme contains a description tag. - * - * @since 1.4.14 Moved from dashboard.php and adjusted - see changelog - * - * @deprecated 3.3 - * - * @return void - */ -function wpseo_description_test() { - _deprecated_function( __FUNCTION__, 'WPSEO 3.3.0' ); -} - -/** - * Check if the current theme was updated and if so, test the updated theme - * for the title and meta description tag - * - * @since 1.4.14 - * - * @deprecated 3.3 - * - * @param WP_Upgrader $upgrader_object Upgrader object instance. - * @param array $context_array Context data array. - * @param mixed $themes Optional themes set. - * - * @return void - */ -function wpseo_upgrader_process_complete( $upgrader_object, $context_array, $themes = null ) { - _deprecated_function( __FUNCTION__, 'WPSEO 3.3.0' ); -} - -/** - * Abuse a filter to check if the current theme was updated and if so, test the updated theme - * for the title and meta description tag - * - * @since 1.4.14 - * @deprecated 3.3 - * - * @param array $update_actions Updated actions set. - * @param WP_Theme|string $updated_theme Theme object instance or stylesheet name. - */ -function wpseo_update_theme_complete_actions( $update_actions, $updated_theme ) { - _deprecated_function( __FUNCTION__, 'WPSEO 3.3.0' ); -} diff --git a/wp/wp-content/plugins/wordpress-seo/index.php b/wp/wp-content/plugins/wordpress-seo/index.php deleted file mode 100644 index e94d9a42..00000000 --- a/wp/wp-content/plugins/wordpress-seo/index.php +++ /dev/null @@ -1,4 +0,0 @@ -/,"")}},{key:"stripMessage",value:function(a){return a.endsWith("0 - ",4)?a.slice(4):a}},{key:"sendChangeEvent",value:function(){var a={target:{name:"mailchimpSignup",value:{hasSignup:this.state.successfulSignup}}};this.onChange(a)}},{key:"getLoadingIndicator",value:function(){return this.state.isLoading?j.default.createElement("div",{className:"yoast-wizard-overlay"},j.default.createElement(s.default,null)):null}},{key:"render",value:function(){if(this.skipRendering())return null;this.onChange=this.props.onChange;var a=j.default.createElement("input",{id:"mailchimpEmail",className:"yoast-wizard-text-input-field",ref:"emailInput",type:"text",name:this.props.name,defaultValue:this.props.properties.currentUserEmail}),b=j.default.createElement(n.default,{primary:!0,label:this.props.translate("Sign Up!"),onClick:this.signup.bind(this),icon:j.default.createElement(q.default,{color:"#ffffff",viewBox:"0 0 28 28"})}),c=this.getSignupMessage(),d=this.getLoadingIndicator();return j.default.createElement("div",{className:"yoast-wizard--columns yoast-wizard-newsletter"},j.default.createElement("div",null,j.default.createElement("h2",{className:"yoast-wizard-newsletter--header"},j.default.createElement(q.default,{color:u.default.$palette_pink_dark}),this.props.properties.title),j.default.createElement("p",null,this.props.properties.label),j.default.createElement("div",{className:"yoast-wizard--columns yoast-wizard--columns__even"},j.default.createElement("div",{className:"yoast-wizard-text-input"},j.default.createElement("label",{htmlFor:"mailchimpName",className:"yoast-wizard-text-input-label"},this.props.translate("Name")),j.default.createElement("input",{id:"mailchimpName",className:"yoast-wizard-text-input-field",ref:"nameInput",type:"text",name:"name",defaultValue:this.props.properties.userName})),j.default.createElement("div",{className:"yoast-wizard-text-input"},j.default.createElement("label",{htmlFor:"mailchimpEmail",className:"yoast-wizard-text-input-label"},this.props.translate("Email")),a)),b,c,d),j.default.createElement("div",{className:"hide-on-tablet yoast-wizard-newsletter--decoration"},j.default.createElement("img",{src:this.props.properties.decoration})))}},{key:"skipRendering",value:function(){var a=this.props.stepState,b="success"===a.currentStep,c=!0===a.fieldValues.newsletter.mailchimpSignup.hasSignup;return b&&c}},{key:"getSignupMessage",value:function(){return this.state.successfulSignup?j.default.createElement("p",{className:"yoast-wizard-mailchimp-message-success","aria-live":"assertive"},this.state.message):j.default.createElement("p",{className:"yoast-wizard-mailchimp-message-error","aria-live":"assertive"},this.state.message)}}]),b}(j.default.Component);v.propTypes={translate:j.default.PropTypes.func.isRequired,title:j.default.PropTypes.string,component:j.default.PropTypes.string,name:j.default.PropTypes.string.isRequired,properties:j.default.PropTypes.object,data:j.default.PropTypes.string,onChange:j.default.PropTypes.func,value:j.default.PropTypes.shape({hasSignup:j.default.PropTypes.bool}),stepState:j.default.PropTypes.object},v.defaultProps={title:"Mailchimp signup",component:"",properties:{},data:"",value:{hasSignup:!1}},c.default=(0,o.localize)(v)},{"material-ui/RaisedButton":477,"material-ui/svg-icons/communication/mail-outline":508,react:689,"yoast-components/composites/OnboardingWizard/LoadingIndicator":705,"yoast-components/composites/OnboardingWizard/helpers/ajaxHelper":715,"yoast-components/style-guide/colors.json":726,"yoast-components/utils/i18n":727}],6:[function(a,b,c){"use strict";function d(a){return a&&a.__esModule?a:{default:a}}function e(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function f(a,b){if(!a)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!b||"object"!=typeof b&&"function"!=typeof b?a:b}function g(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function, not "+typeof b);a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}}),b&&(Object.setPrototypeOf?Object.setPrototypeOf(a,b):a.__proto__=b)}Object.defineProperty(c,"__esModule",{value:!0});var h=function(){function a(a,b){for(var c=0;c1&&c[1]||""}var c,d=b(/(ipod|iphone|ipad)/i).toLowerCase(),e=/like android/i.test(a),f=!e&&/android/i.test(a),h=/nexus\s*[0-6]\s*/i.test(a),i=!h&&/nexus\s*[0-9]+/i.test(a),j=/CrOS/.test(a),k=/silk/i.test(a),l=/sailfish/i.test(a),m=/tizen/i.test(a),n=/(web|hpw)os/i.test(a),o=/windows phone/i.test(a),p=(/SamsungBrowser/i.test(a),!o&&/windows/i.test(a)),q=!d&&!k&&/macintosh/i.test(a),r=!f&&!l&&!m&&!n&&/linux/i.test(a),s=b(/edge\/(\d+(\.\d+)?)/i),t=b(/version\/(\d+(\.\d+)?)/i),u=/tablet/i.test(a),v=!u&&/[^-]mobi/i.test(a),w=/xbox/i.test(a);/opera/i.test(a)?c={name:"Opera",opera:g,version:t||b(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i)}:/opr|opios/i.test(a)?c={name:"Opera",opera:g,version:b(/(?:opr|opios)[\s\/](\d+(\.\d+)?)/i)||t}:/SamsungBrowser/i.test(a)?c={name:"Samsung Internet for Android",samsungBrowser:g,version:t||b(/(?:SamsungBrowser)[\s\/](\d+(\.\d+)?)/i)}:/coast/i.test(a)?c={name:"Opera Coast",coast:g,version:t||b(/(?:coast)[\s\/](\d+(\.\d+)?)/i)}:/yabrowser/i.test(a)?c={name:"Yandex Browser",yandexbrowser:g,version:t||b(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)}:/ucbrowser/i.test(a)?c={name:"UC Browser",ucbrowser:g,version:b(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i)}:/mxios/i.test(a)?c={name:"Maxthon",maxthon:g,version:b(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i)}:/epiphany/i.test(a)?c={name:"Epiphany",epiphany:g,version:b(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i)}:/puffin/i.test(a)?c={name:"Puffin",puffin:g,version:b(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i)}:/sleipnir/i.test(a)?c={name:"Sleipnir",sleipnir:g,version:b(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i)}:/k-meleon/i.test(a)?c={name:"K-Meleon",kMeleon:g,version:b(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i)}:o?(c={name:"Windows Phone",windowsphone:g},s?(c.msedge=g,c.version=s):(c.msie=g,c.version=b(/iemobile\/(\d+(\.\d+)?)/i))):/msie|trident/i.test(a)?c={name:"Internet Explorer",msie:g,version:b(/(?:msie |rv:)(\d+(\.\d+)?)/i)}:j?c={name:"Chrome",chromeos:g,chromeBook:g,chrome:g,version:b(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:/chrome.+? edge/i.test(a)?c={name:"Microsoft Edge",msedge:g,version:s}:/vivaldi/i.test(a)?c={name:"Vivaldi",vivaldi:g,version:b(/vivaldi\/(\d+(\.\d+)?)/i)||t}:l?c={name:"Sailfish",sailfish:g,version:b(/sailfish\s?browser\/(\d+(\.\d+)?)/i)}:/seamonkey\//i.test(a)?c={name:"SeaMonkey",seamonkey:g,version:b(/seamonkey\/(\d+(\.\d+)?)/i)}:/firefox|iceweasel|fxios/i.test(a)?(c={name:"Firefox",firefox:g,version:b(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i)},/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(a)&&(c.firefoxos=g)):k?c={name:"Amazon Silk",silk:g,version:b(/silk\/(\d+(\.\d+)?)/i)}:/phantom/i.test(a)?c={name:"PhantomJS",phantom:g,version:b(/phantomjs\/(\d+(\.\d+)?)/i)}:/slimerjs/i.test(a)?c={name:"SlimerJS",slimer:g,version:b(/slimerjs\/(\d+(\.\d+)?)/i)}:/blackberry|\bbb\d+/i.test(a)||/rim\stablet/i.test(a)?c={name:"BlackBerry",blackberry:g,version:t||b(/blackberry[\d]+\/(\d+(\.\d+)?)/i)}:n?(c={name:"WebOS",webos:g,version:t||b(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)},/touchpad\//i.test(a)&&(c.touchpad=g)):/bada/i.test(a)?c={name:"Bada",bada:g,version:b(/dolfin\/(\d+(\.\d+)?)/i)}:m?c={name:"Tizen",tizen:g,version:b(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i)||t}:/qupzilla/i.test(a)?c={name:"QupZilla",qupzilla:g,version:b(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i)||t}:/chromium/i.test(a)?c={name:"Chromium",chromium:g,version:b(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i)||t}:/chrome|crios|crmo/i.test(a)?c={name:"Chrome",chrome:g,version:b(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:f?c={name:"Android",version:t}:/safari|applewebkit/i.test(a)?(c={name:"Safari",safari:g},t&&(c.version=t)):d?(c={name:"iphone"==d?"iPhone":"ipad"==d?"iPad":"iPod"},t&&(c.version=t)):c=/googlebot/i.test(a)?{name:"Googlebot",googlebot:g,version:b(/googlebot\/(\d+(\.\d+))/i)||t}:{name:b(/^(.*)\/(.*) /),version:function(b){var c=a.match(b);return c&&c.length>1&&c[2]||""}(/^(.*)\/(.*) /)},!c.msedge&&/(apple)?webkit/i.test(a)?(/(apple)?webkit\/537\.36/i.test(a)?(c.name=c.name||"Blink",c.blink=g):(c.name=c.name||"Webkit",c.webkit=g),!c.version&&t&&(c.version=t)):!c.opera&&/gecko\//i.test(a)&&(c.name=c.name||"Gecko",c.gecko=g,c.version=c.version||b(/gecko\/(\d+(\.\d+)?)/i)),c.windowsphone||c.msedge||!f&&!c.silk?c.windowsphone||c.msedge||!d?q?c.mac=g:w?c.xbox=g:p?c.windows=g:r&&(c.linux=g):(c[d]=g,c.ios=g):c.android=g;var x="";c.windowsphone?x=b(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i):d?(x=b(/os (\d+([_\s]\d+)*) like mac os x/i),x=x.replace(/[_\s]/g,".")):f?x=b(/android[ \/-](\d+(\.\d+)*)/i):c.webos?x=b(/(?:web|hpw)os\/(\d+(\.\d+)*)/i):c.blackberry?x=b(/rim\stablet\sos\s(\d+(\.\d+)*)/i):c.bada?x=b(/bada\/(\d+(\.\d+)*)/i):c.tizen&&(x=b(/tizen[\/\s](\d+(\.\d+)*)/i)),x&&(c.osversion=x);var y=x.split(".")[0];return u||i||"ipad"==d||f&&(3==y||y>=4&&!v)||c.silk?c.tablet=g:(v||"iphone"==d||"ipod"==d||f||h||c.blackberry||c.webos||c.bada)&&(c.mobile=g),c.msedge||c.msie&&c.version>=10||c.yandexbrowser&&c.version>=15||c.vivaldi&&c.version>=1||c.chrome&&c.version>=20||c.samsungBrowser&&c.version>=4||c.firefox&&c.version>=20||c.safari&&c.version>=6||c.opera&&c.version>=10||c.ios&&c.osversion&&c.osversion.split(".")[0]>=6||c.blackberry&&c.version>=10.1||c.chromium&&c.version>=20?c.a=g:c.msie&&c.version<10||c.chrome&&c.version<20||c.firefox&&c.version<20||c.safari&&c.version<6||c.opera&&c.version<10||c.ios&&c.osversion&&c.osversion.split(".")[0]<6||c.chromium&&c.version<20?c.c=g:c.x=g,c}function b(a){return a.split(".").length}function c(a,b){var c,d=[];if(Array.prototype.map)return Array.prototype.map.call(a,b);for(c=0;c=0;){if(e[0][d]>e[1][d])return 1;if(e[0][d]!==e[1][d])return-1;if(0===d)return 0}}function e(b,c,e){var f=h;"string"==typeof c&&(e=c,c=void 0),void 0===c&&(c=!1),e&&(f=a(e));var g=""+f.version;for(var i in b)if(b.hasOwnProperty(i)&&f[i]){if("string"!=typeof b[i])throw new Error("Browser version in the minVersion map should be a string: "+i+": "+String(b));return d([g,b[i]])<0}return c}function f(a,b,c){return!e(a,b,c)}var g=!0,h=a("undefined"!=typeof navigator?navigator.userAgent||"":"");return h.test=function(a){for(var b=0;b2?arguments[2]:void 0,k=Math.min((void 0===j?g:e(j,g))-i,g-h),l=1;for(i0;)i in c?c[h]=c[i]:delete c[h],h+=l,i+=l;return c}},{"./_to-index":118,"./_to-length":121,"./_to-object":122}],22:[function(a,b,c){"use strict";var d=a("./_to-object"),e=a("./_to-index"),f=a("./_to-length");b.exports=function(a){for(var b=d(this),c=f(b.length),g=arguments.length,h=e(g>1?arguments[1]:void 0,c),i=g>2?arguments[2]:void 0,j=void 0===i?c:e(i,c);j>h;)b[h++]=a;return b}},{"./_to-index":118,"./_to-length":121,"./_to-object":122}],23:[function(a,b,c){var d=a("./_for-of");b.exports=function(a,b){var c=[];return d(a,!1,c.push,c,b),c}},{"./_for-of":50}],24:[function(a,b,c){var d=a("./_to-iobject"),e=a("./_to-length"),f=a("./_to-index");b.exports=function(a){return function(b,c,g){var h,i=d(b),j=e(i.length),k=f(g,j);if(a&&c!=c){for(;j>k;)if((h=i[k++])!=h)return!0}else for(;j>k;k++)if((a||k in i)&&i[k]===c)return a||k||0;return!a&&-1}}},{"./_to-index":118,"./_to-iobject":120,"./_to-length":121}],25:[function(a,b,c){var d=a("./_ctx"),e=a("./_iobject"),f=a("./_to-object"),g=a("./_to-length"),h=a("./_array-species-create");b.exports=function(a,b){var c=1==a,i=2==a,j=3==a,k=4==a,l=6==a,m=5==a||l,n=b||h;return function(b,h,o){for(var p,q,r=f(b),s=e(r),t=d(h,o,3),u=g(s.length),v=0,w=c?n(b,u):i?n(b,0):void 0;u>v;v++)if((m||v in s)&&(p=s[v],q=t(p,v,r),a))if(c)w[v]=q;else if(q)switch(a){case 3:return!0;case 5:return p;case 6:return v;case 2:w.push(p)}else if(k)return!1;return l?-1:j||k?k:w}}},{"./_array-species-create":28,"./_ctx":38,"./_iobject":58,"./_to-length":121,"./_to-object":122}],26:[function(a,b,c){var d=a("./_a-function"),e=a("./_to-object"),f=a("./_iobject"),g=a("./_to-length");b.exports=function(a,b,c,h,i){d(b);var j=e(a),k=f(j),l=g(j.length),m=i?l-1:0,n=i?-1:1;if(c<2)for(;;){if(m in k){h=k[m],m+=n;break}if(m+=n,i?m<0:l<=m)throw TypeError("Reduce of empty array with no initial value")}for(;i?m>=0:l>m;m+=n)m in k&&(h=b(h,k[m],m,j));return h}},{"./_a-function":16,"./_iobject":58,"./_to-length":121,"./_to-object":122}],27:[function(a,b,c){var d=a("./_is-object"),e=a("./_is-array"),f=a("./_wks")("species");b.exports=function(a){var b;return e(a)&&(b=a.constructor,"function"!=typeof b||b!==Array&&!e(b.prototype)||(b=void 0),d(b)&&null===(b=b[f])&&(b=void 0)),void 0===b?Array:b}},{"./_is-array":60,"./_is-object":62,"./_wks":130}],28:[function(a,b,c){var d=a("./_array-species-constructor");b.exports=function(a,b){return new(d(a))(b)}},{"./_array-species-constructor":27}],29:[function(a,b,c){"use strict";var d=a("./_a-function"),e=a("./_is-object"),f=a("./_invoke"),g=[].slice,h={},i=function(a,b,c){if(!(b in h)){for(var d=[],e=0;e1?arguments[1]:void 0,3);b=b?b.n:this._f;)for(c(b.v,b.k,this);b&&b.r;)b=b.p},has:function(a){return!!q(this,a)}}),n&&d(l.prototype,"size",{get:function(){return i(this[p])}}),l},def:function(a,b,c){var d,e,f=q(a,b);return f?f.v=c:(a._l=f={i:e=o(b,!0),k:b,v:c,p:d=a._l,n:void 0,r:!1},a._f||(a._f=f),d&&(d.n=f),a[p]++,"F"!==e&&(a._i[e]=f)),a},getEntry:q,setStrong:function(a,b,c){k(a,b,function(a,b){this._t=a,this._k=b,this._l=void 0},function(){for(var a=this,b=a._k,c=a._l;c&&c.r;)c=c.p;return a._t&&(a._l=c=c?c.n:a._t._f)?"keys"==b?l(0,c.k):"values"==b?l(0,c.v):l(0,[c.k,c.v]):(a._t=void 0,l(1))},c?"entries":"values",!c,!0),m(b)}}},{"./_an-instance":19,"./_ctx":38,"./_defined":40,"./_descriptors":41,"./_for-of":50,"./_iter-define":66,"./_iter-step":68,"./_meta":75,"./_object-create":79,"./_object-dp":80,"./_redefine-all":99,"./_set-species":104}],33:[function(a,b,c){var d=a("./_classof"),e=a("./_array-from-iterable");b.exports=function(a){return function(){if(d(this)!=a)throw TypeError(a+"#toJSON isn't generic");return e(this)}}},{"./_array-from-iterable":23,"./_classof":30}],34:[function(a,b,c){"use strict";var d=a("./_redefine-all"),e=a("./_meta").getWeak,f=a("./_an-object"),g=a("./_is-object"),h=a("./_an-instance"),i=a("./_for-of"),j=a("./_array-methods"),k=a("./_has"),l=j(5),m=j(6),n=0,o=function(a){return a._l||(a._l=new p)},p=function(){this.a=[]},q=function(a,b){return l(a.a,function(a){return a[0]===b})};p.prototype={get:function(a){var b=q(this,a);if(b)return b[1]},has:function(a){return!!q(this,a)},set:function(a,b){var c=q(this,a);c?c[1]=b:this.a.push([a,b])},delete:function(a){var b=m(this.a,function(b){return b[0]===a});return~b&&this.a.splice(b,1),!!~b}},b.exports={getConstructor:function(a,b,c,f){var j=a(function(a,d){h(a,j,b,"_i"),a._i=n++,a._l=void 0,void 0!=d&&i(d,c,a[f],a)});return d(j.prototype,{delete:function(a){if(!g(a))return!1;var b=e(a);return!0===b?o(this).delete(a):b&&k(b,this._i)&&delete b[this._i]},has:function(a){if(!g(a))return!1;var b=e(a);return!0===b?o(this).has(a):b&&k(b,this._i)}}),j},def:function(a,b,c){var d=e(f(b),!0);return!0===d?o(a).set(b,c):d[a._i]=c,a},ufstore:o}},{"./_an-instance":19,"./_an-object":20,"./_array-methods":25,"./_for-of":50,"./_has":52,"./_is-object":62,"./_meta":75,"./_redefine-all":99}],35:[function(a,b,c){"use strict";var d=a("./_global"),e=a("./_export"),f=a("./_redefine"),g=a("./_redefine-all"),h=a("./_meta"),i=a("./_for-of"),j=a("./_an-instance"),k=a("./_is-object"),l=a("./_fails"),m=a("./_iter-detect"),n=a("./_set-to-string-tag"),o=a("./_inherit-if-required");b.exports=function(a,b,c,p,q,r){var s=d[a],t=s,u=q?"set":"add",v=t&&t.prototype,w={},x=function(a){var b=v[a];f(v,a,"delete"==a?function(a){return!(r&&!k(a))&&b.call(this,0===a?0:a)}:"has"==a?function(a){return!(r&&!k(a))&&b.call(this,0===a?0:a)}:"get"==a?function(a){return r&&!k(a)?void 0:b.call(this,0===a?0:a)}:"add"==a?function(a){return b.call(this,0===a?0:a),this}:function(a,c){return b.call(this,0===a?0:a,c),this})};if("function"==typeof t&&(r||v.forEach&&!l(function(){(new t).entries().next()}))){var y=new t,z=y[u](r?{}:-0,1)!=y,A=l(function(){y.has(1)}),B=m(function(a){new t(a)}),C=!r&&l(function(){for(var a=new t,b=5;b--;)a[u](b,b);return!a.has(-0)});B||(t=b(function(b,c){j(b,t,a);var d=o(new s,b,t);return void 0!=c&&i(c,q,d[u],d),d}),t.prototype=v,v.constructor=t),(A||C)&&(x("delete"),x("has"),q&&x("get")),(C||z)&&x(u),r&&v.clear&&delete v.clear}else t=p.getConstructor(b,a,q,u),g(t.prototype,c),h.NEED=!0;return n(t,a),w[a]=t,e(e.G+e.W+e.F*(t!=s),w),r||p.setStrong(t,a,q),t}},{"./_an-instance":19,"./_export":45,"./_fails":47,"./_for-of":50,"./_global":51,"./_inherit-if-required":56,"./_is-object":62,"./_iter-detect":67,"./_meta":75,"./_redefine":100,"./_redefine-all":99,"./_set-to-string-tag":105}],36:[function(a,b,c){var d=b.exports={version:"2.4.0"};"number"==typeof __e&&(__e=d)},{}],37:[function(a,b,c){"use strict";var d=a("./_object-dp"),e=a("./_property-desc");b.exports=function(a,b,c){b in a?d.f(a,b,e(0,c)):a[b]=c}},{"./_object-dp":80,"./_property-desc":98}],38:[function(a,b,c){var d=a("./_a-function");b.exports=function(a,b,c){if(d(a),void 0===b)return a;switch(c){case 1:return function(c){return a.call(b,c)};case 2:return function(c,d){return a.call(b,c,d)};case 3:return function(c,d,e){return a.call(b,c,d,e)}}return function(){return a.apply(b,arguments)}}},{"./_a-function":16}],39:[function(a,b,c){"use strict";var d=a("./_an-object"),e=a("./_to-primitive");b.exports=function(a){if("string"!==a&&"number"!==a&&"default"!==a)throw TypeError("Incorrect hint");return e(d(this),"number"!=a)}},{"./_an-object":20,"./_to-primitive":123}],40:[function(a,b,c){b.exports=function(a){if(void 0==a)throw TypeError("Can't call method on "+a);return a}},{}],41:[function(a,b,c){b.exports=!a("./_fails")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{"./_fails":47}],42:[function(a,b,c){var d=a("./_is-object"),e=a("./_global").document,f=d(e)&&d(e.createElement);b.exports=function(a){return f?e.createElement(a):{}}},{"./_global":51,"./_is-object":62}],43:[function(a,b,c){b.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],44:[function(a,b,c){var d=a("./_object-keys"),e=a("./_object-gops"),f=a("./_object-pie");b.exports=function(a){var b=d(a),c=e.f;if(c)for(var g,h=c(a),i=f.f,j=0;h.length>j;)i.call(a,g=h[j++])&&b.push(g);return b}},{"./_object-gops":86,"./_object-keys":89,"./_object-pie":90}],45:[function(a,b,c){var d=a("./_global"),e=a("./_core"),f=a("./_hide"),g=a("./_redefine"),h=a("./_ctx"),i=function(a,b,c){var j,k,l,m,n=a&i.F,o=a&i.G,p=a&i.S,q=a&i.P,r=a&i.B,s=o?d:p?d[b]||(d[b]={}):(d[b]||{}).prototype,t=o?e:e[b]||(e[b]={}),u=t.prototype||(t.prototype={});o&&(c=b);for(j in c)k=!n&&s&&void 0!==s[j],l=(k?s:c)[j],m=r&&k?h(l,d):q&&"function"==typeof l?h(Function.call,l):l,s&&g(s,j,l,a&i.U),t[j]!=l&&f(t,j,m),q&&u[j]!=l&&(u[j]=l)};d.core=e,i.F=1,i.G=2,i.S=4,i.P=8,i.B=16,i.W=32,i.U=64,i.R=128,b.exports=i},{"./_core":36,"./_ctx":38,"./_global":51,"./_hide":53,"./_redefine":100}],46:[function(a,b,c){var d=a("./_wks")("match");b.exports=function(a){var b=/./;try{"/./"[a](b)}catch(c){try{return b[d]=!1,!"/./"[a](b)}catch(a){}}return!0}},{"./_wks":130}],47:[function(a,b,c){b.exports=function(a){try{return!!a()}catch(a){return!0}}},{}],48:[function(a,b,c){"use strict";var d=a("./_hide"),e=a("./_redefine"),f=a("./_fails"),g=a("./_defined"),h=a("./_wks");b.exports=function(a,b,c){var i=h(a),j=c(g,i,""[a]),k=j[0],l=j[1];f(function(){var b={};return b[i]=function(){return 7},7!=""[a](b)})&&(e(String.prototype,a,k),d(RegExp.prototype,i,2==b?function(a,b){return l.call(a,this,b)}:function(a){return l.call(a,this)}))}},{"./_defined":40,"./_fails":47,"./_hide":53,"./_redefine":100,"./_wks":130}],49:[function(a,b,c){"use strict";var d=a("./_an-object");b.exports=function(){var a=d(this),b="";return a.global&&(b+="g"),a.ignoreCase&&(b+="i"),a.multiline&&(b+="m"),a.unicode&&(b+="u"),a.sticky&&(b+="y"),b}},{"./_an-object":20}],50:[function(a,b,c){var d=a("./_ctx"),e=a("./_iter-call"),f=a("./_is-array-iter"),g=a("./_an-object"),h=a("./_to-length"),i=a("./core.get-iterator-method"),j={},k={},c=b.exports=function(a,b,c,l,m){var n,o,p,q,r=m?function(){return a}:i(a),s=d(c,l,b?2:1),t=0;if("function"!=typeof r)throw TypeError(a+" is not iterable!");if(f(r)){for(n=h(a.length);n>t;t++)if((q=b?s(g(o=a[t])[0],o[1]):s(a[t]))===j||q===k)return q}else for(p=r.call(a);!(o=p.next()).done;)if((q=e(p,s,o.value,b))===j||q===k)return q};c.BREAK=j,c.RETURN=k},{"./_an-object":20,"./_ctx":38,"./_is-array-iter":59,"./_iter-call":64,"./_to-length":121,"./core.get-iterator-method":131}],51:[function(a,b,c){var d=b.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=d)},{}],52:[function(a,b,c){var d={}.hasOwnProperty;b.exports=function(a,b){return d.call(a,b)}},{}],53:[function(a,b,c){var d=a("./_object-dp"),e=a("./_property-desc");b.exports=a("./_descriptors")?function(a,b,c){return d.f(a,b,e(1,c))}:function(a,b,c){return a[b]=c,a}},{"./_descriptors":41,"./_object-dp":80,"./_property-desc":98}],54:[function(a,b,c){b.exports=a("./_global").document&&document.documentElement},{"./_global":51}],55:[function(a,b,c){b.exports=!a("./_descriptors")&&!a("./_fails")(function(){return 7!=Object.defineProperty(a("./_dom-create")("div"),"a",{get:function(){return 7}}).a})},{"./_descriptors":41,"./_dom-create":42,"./_fails":47}],56:[function(a,b,c){var d=a("./_is-object"),e=a("./_set-proto").set;b.exports=function(a,b,c){var f,g=b.constructor;return g!==c&&"function"==typeof g&&(f=g.prototype)!==c.prototype&&d(f)&&e&&e(a,f),a}},{"./_is-object":62,"./_set-proto":103}],57:[function(a,b,c){b.exports=function(a,b,c){var d=void 0===c;switch(b.length){case 0:return d?a():a.call(c);case 1:return d?a(b[0]):a.call(c,b[0]);case 2:return d?a(b[0],b[1]):a.call(c,b[0],b[1]);case 3:return d?a(b[0],b[1],b[2]):a.call(c,b[0],b[1],b[2]);case 4:return d?a(b[0],b[1],b[2],b[3]):a.call(c,b[0],b[1],b[2],b[3])}return a.apply(c,b)}},{}],58:[function(a,b,c){var d=a("./_cof");b.exports=Object("z").propertyIsEnumerable(0)?Object:function(a){return"String"==d(a)?a.split(""):Object(a)}},{"./_cof":31}],59:[function(a,b,c){var d=a("./_iterators"),e=a("./_wks")("iterator"),f=Array.prototype;b.exports=function(a){return void 0!==a&&(d.Array===a||f[e]===a)}},{"./_iterators":69,"./_wks":130}],60:[function(a,b,c){var d=a("./_cof");b.exports=Array.isArray||function(a){return"Array"==d(a)}},{"./_cof":31}],61:[function(a,b,c){var d=a("./_is-object"),e=Math.floor;b.exports=function(a){return!d(a)&&isFinite(a)&&e(a)===a}},{"./_is-object":62}],62:[function(a,b,c){b.exports=function(a){return"object"==typeof a?null!==a:"function"==typeof a}},{}],63:[function(a,b,c){var d=a("./_is-object"),e=a("./_cof"),f=a("./_wks")("match");b.exports=function(a){var b;return d(a)&&(void 0!==(b=a[f])?!!b:"RegExp"==e(a))}},{"./_cof":31,"./_is-object":62,"./_wks":130}],64:[function(a,b,c){var d=a("./_an-object");b.exports=function(a,b,c,e){try{return e?b(d(c)[0],c[1]):b(c)}catch(b){var f=a.return;throw void 0!==f&&d(f.call(a)),b}}},{"./_an-object":20}],65:[function(a,b,c){"use strict";var d=a("./_object-create"),e=a("./_property-desc"),f=a("./_set-to-string-tag"),g={};a("./_hide")(g,a("./_wks")("iterator"),function(){return this}),b.exports=function(a,b,c){a.prototype=d(g,{next:e(1,c)}),f(a,b+" Iterator")}},{"./_hide":53,"./_object-create":79,"./_property-desc":98,"./_set-to-string-tag":105,"./_wks":130}],66:[function(a,b,c){"use strict";var d=a("./_library"),e=a("./_export"),f=a("./_redefine"),g=a("./_hide"),h=a("./_has"),i=a("./_iterators"),j=a("./_iter-create"),k=a("./_set-to-string-tag"),l=a("./_object-gpo"),m=a("./_wks")("iterator"),n=!([].keys&&"next"in[].keys()),o=function(){return this};b.exports=function(a,b,c,p,q,r,s){j(c,b,p);var t,u,v,w=function(a){if(!n&&a in A)return A[a];switch(a){case"keys":case"values":return function(){return new c(this,a)}}return function(){return new c(this,a)}},x=b+" Iterator",y="values"==q,z=!1,A=a.prototype,B=A[m]||A["@@iterator"]||q&&A[q],C=B||w(q),D=q?y?w("entries"):C:void 0,E="Array"==b?A.entries||B:B;if(E&&(v=l(E.call(new a)))!==Object.prototype&&(k(v,x,!0),d||h(v,m)||g(v,m,o)),y&&B&&"values"!==B.name&&(z=!0,C=function(){return B.call(this)}),d&&!s||!n&&!z&&A[m]||g(A,m,C),i[b]=C,i[x]=o,q)if(t={values:y?C:w("values"),keys:r?C:w("keys"),entries:D},s)for(u in t)u in A||f(A,u,t[u]);else e(e.P+e.F*(n||z),b,t);return t}},{"./_export":45,"./_has":52,"./_hide":53,"./_iter-create":65,"./_iterators":69,"./_library":71,"./_object-gpo":87,"./_redefine":100,"./_set-to-string-tag":105,"./_wks":130}],67:[function(a,b,c){var d=a("./_wks")("iterator"),e=!1;try{var f=[7][d]();f.return=function(){e=!0},Array.from(f,function(){throw 2})}catch(a){}b.exports=function(a,b){if(!b&&!e)return!1;var c=!1;try{var f=[7],g=f[d]();g.next=function(){return{done:c=!0}},f[d]=function(){return g},a(f)}catch(a){}return c}},{"./_wks":130}],68:[function(a,b,c){b.exports=function(a,b){return{value:b,done:!!a}}},{}],69:[function(a,b,c){b.exports={}},{}],70:[function(a,b,c){var d=a("./_object-keys"),e=a("./_to-iobject");b.exports=function(a,b){for(var c,f=e(a),g=d(f),h=g.length,i=0;h>i;)if(f[c=g[i++]]===b)return c}},{"./_object-keys":89,"./_to-iobject":120}],71:[function(a,b,c){b.exports=!1},{}],72:[function(a,b,c){var d=Math.expm1;b.exports=!d||d(10)>22025.465794806718||d(10)<22025.465794806718||-2e-17!=d(-2e-17)?function(a){return 0==(a=+a)?a:a>-1e-6&&a<1e-6?a+a*a/2:Math.exp(a)-1}:d},{}],73:[function(a,b,c){b.exports=Math.log1p||function(a){return(a=+a)>-1e-8&&a<1e-8?a-a*a/2:Math.log(1+a)}},{}],74:[function(a,b,c){b.exports=Math.sign||function(a){return 0==(a=+a)||a!=a?a:a<0?-1:1}},{}],75:[function(a,b,c){var d=a("./_uid")("meta"),e=a("./_is-object"),f=a("./_has"),g=a("./_object-dp").f,h=0,i=Object.isExtensible||function(){return!0},j=!a("./_fails")(function(){return i(Object.preventExtensions({}))}),k=function(a){g(a,d,{value:{i:"O"+ ++h,w:{}}})},l=function(a,b){if(!e(a))return"symbol"==typeof a?a:("string"==typeof a?"S":"P")+a;if(!f(a,d)){if(!i(a))return"F";if(!b)return"E";k(a)}return a[d].i},m=function(a,b){if(!f(a,d)){if(!i(a))return!0;if(!b)return!1;k(a)}return a[d].w},n=function(a){return j&&o.NEED&&i(a)&&!f(a,d)&&k(a),a},o=b.exports={KEY:d,NEED:!1,fastKey:l,getWeak:m,onFreeze:n}},{"./_fails":47,"./_has":52,"./_is-object":62,"./_object-dp":80,"./_uid":127}],76:[function(a,b,c){var d=a("./es6.map"),e=a("./_export"),f=a("./_shared")("metadata"),g=f.store||(f.store=new(a("./es6.weak-map"))),h=function(a,b,c){var e=g.get(a);if(!e){if(!c)return;g.set(a,e=new d)}var f=e.get(b);if(!f){if(!c)return;e.set(b,f=new d)}return f},i=function(a,b,c){var d=h(b,c,!1);return void 0!==d&&d.has(a)},j=function(a,b,c){var d=h(b,c,!1);return void 0===d?void 0:d.get(a)},k=function(a,b,c,d){h(c,d,!0).set(a,b)},l=function(a,b){var c=h(a,b,!1),d=[];return c&&c.forEach(function(a,b){d.push(b)}),d},m=function(a){return void 0===a||"symbol"==typeof a?a:String(a)},n=function(a){e(e.S,"Reflect",a)};b.exports={store:g,map:h,has:i,get:j,set:k,keys:l,key:m,exp:n}},{"./_export":45,"./_shared":107,"./es6.map":162,"./es6.weak-map":268}],77:[function(a,b,c){var d=a("./_global"),e=a("./_task").set,f=d.MutationObserver||d.WebKitMutationObserver,g=d.process,h=d.Promise,i="process"==a("./_cof")(g);b.exports=function(){var a,b,c,j=function(){var d,e;for(i&&(d=g.domain)&&d.exit();a;){e=a.fn,a=a.next;try{e()}catch(d){throw a?c():b=void 0,d}}b=void 0,d&&d.enter()};if(i)c=function(){g.nextTick(j)};else if(f){var k=!0,l=document.createTextNode("");new f(j).observe(l,{characterData:!0}),c=function(){l.data=k=!k}}else if(h&&h.resolve){var m=h.resolve();c=function(){m.then(j)}}else c=function(){e.call(d,j)};return function(d){var e={fn:d,next:void 0};b&&(b.next=e),a||(a=e,c()),b=e}}},{"./_cof":31,"./_global":51,"./_task":117}],78:[function(a,b,c){"use strict";var d=a("./_object-keys"),e=a("./_object-gops"),f=a("./_object-pie"),g=a("./_to-object"),h=a("./_iobject"),i=Object.assign;b.exports=!i||a("./_fails")(function(){var a={},b={},c=Symbol(),d="abcdefghijklmnopqrst";return a[c]=7,d.split("").forEach(function(a){b[a]=a}),7!=i({},a)[c]||Object.keys(i({},b)).join("")!=d})?function(a,b){for(var c=g(a),i=arguments.length,j=1,k=e.f,l=f.f;i>j;)for(var m,n=h(arguments[j++]),o=k?d(n).concat(k(n)):d(n),p=o.length,q=0;p>q;)l.call(n,m=o[q++])&&(c[m]=n[m]);return c}:i},{"./_fails":47,"./_iobject":58,"./_object-gops":86,"./_object-keys":89,"./_object-pie":90,"./_to-object":122}],79:[function(a,b,c){var d=a("./_an-object"),e=a("./_object-dps"),f=a("./_enum-bug-keys"),g=a("./_shared-key")("IE_PROTO"),h=function(){},i=function(){var b,c=a("./_dom-create")("iframe"),d=f.length;for(c.style.display="none",a("./_html").appendChild(c),c.src="javascript:",b=c.contentWindow.document,b.open(),b.write(" \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/CHANGELOG.md b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/CHANGELOG.md deleted file mode 100644 index a578dc5e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/CHANGELOG.md +++ /dev/null @@ -1,30 +0,0 @@ -# Change Log -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](http://keepachangelog.com/) -and this project adheres to [Semantic Versioning](http://semver.org/). - -## [1.0.1] -### Fixed -* Fix a missing link when the PHP message is switched to the WordPress.org hosting page. - -## [1.0.0] -### Changed -* Updated screenshot in README - -## [1.0.0-beta.2] - 2017-03-11 -### Added -* Complete PHP version message - -### Changed -* Refactor code architecture. -* Use PHP version constant instead of function. - -### Fixed -* Fix broken version reconciliation. - -## 1.0.0-beta.1 - 2017-02-21 -* Initial pre-release of whip. A package to nudge users to upgrade their software versions. - -[Unreleased]: https://github.com/yoast/whip/compare/1.0.0-beta.2...HEAD -[1.0.0-beta.2]: https://github.com/yoast/whip/compare/1.0.0-beta.1...1.0.0-beta.2 diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/LICENSE b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/LICENSE deleted file mode 100644 index 95846861..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Yoast - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/images/wp-message.png b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/images/wp-message.png deleted file mode 100644 index bc168d9e6c9dbd34fb0957155b60404a883f9e36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276951 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±U=-Y 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�sPjW_8c?!x1*+eCN9JgmA9<3 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%0A&Yc3_w76WLNckRrZYNgQSA#yNIhpW?~hKV)-195 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 pO-)jG7$#EE{{_lg%_NgoUconfiguration = $configuration; - } - - /** - * Retrieves the configured version of a particular requirement. - * If the requirement does not exist, this returns -1. - * - * @param Whip_Requirement $requirement The requirement to check. - * - * @return int The version of the passed requirement that was detected. - */ - public function configuredVersion( Whip_Requirement $requirement ) { - if ( ! $this->hasRequirementConfigured( $requirement ) ) { - return -1; - } - - return $this->configuration[ $requirement->component() ]; - } - - /** - * Determines whether the passed requirement is present in the configuration. - * - * @param Whip_Requirement $requirement The requirement to check. - * - * @return bool Whether or not the requirement is present in the configuration. - */ - public function hasRequirementConfigured( Whip_Requirement $requirement ) { - return array_key_exists( $requirement->component(), $this->configuration ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_Host.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_Host.php deleted file mode 100644 index 2ae5ecb5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_Host.php +++ /dev/null @@ -1,88 +0,0 @@ -' . $toWrap . '

    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 diff --git a/wp/wp-content/plugins/wordpress-seo/images/banner/local-seo-for-woocommerce.png b/wp/wp-content/plugins/wordpress-seo/images/banner/local-seo-for-woocommerce.png deleted file mode 100644 index e43b35c01f341c11139a3c1f9bbfa5a6458e49c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82027 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 Gf=2(UTI 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 Bvt9rI diff --git a/wp/wp-content/plugins/wordpress-seo/images/banner/local-seo.png b/wp/wp-content/plugins/wordpress-seo/images/banner/local-seo.png deleted file mode 100644 index 476bb65e98f1a7bcb0f2ade8a682999a3645753d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76899 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

    '; - } - - /** - * Wraps a piece of text in HTML p tags - * - * @param string $toWrap The text to wrap. - * @return string The wrapped text. - */ - public static function paragraph( $toWrap ) { - return '

    ' . $toWrap . '

    '; - } - - /** - * Wraps a piece of text in HTML p and strong tags - * - * @param string $toWrap The text to wrap. - * @return string The wrapped text. - */ - public static function strongParagraph( $toWrap ) { - return self::paragraph( self::strong( $toWrap ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_MessagesManager.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_MessagesManager.php deleted file mode 100644 index 1d900bfd..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_MessagesManager.php +++ /dev/null @@ -1,83 +0,0 @@ - 0; - } - - /** - * Lists the messages that are currently available. - * - * @return array The messages that are currently set. - */ - public function listMessages() { - return $GLOBALS[ 'whip_messages' ]; - } - - /** - * Deletes all messages. - */ - public function deleteMessages() { - unset( $GLOBALS[ 'whip_messages' ] ); - } - - /** - * Gets the latest message. - * - * @return Whip_Message The message. Returns a NullMessage if none is found. - */ - public function getLatestMessage() { - if ( ! $this->hasMessages() ) { - return new Whip_NullMessage(); - } - - $messages = $this->sortByVersion( $this->listMessages() ); - - $this->deleteMessages(); - - return array_pop( $messages ); - } - - /** - * Sorts the list of messages based on the version number. - * - * @param array $messages The list of messages to sort. - * - * @return array The sorted list of messages. - */ - private function sortByVersion( array $messages ) { - uksort( $messages, 'version_compare' ); - - return $messages; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_RequirementsChecker.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_RequirementsChecker.php deleted file mode 100644 index 36bc56fc..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_RequirementsChecker.php +++ /dev/null @@ -1,148 +0,0 @@ -requirements = array(); - $this->configuration = new Whip_Configuration( $configuration ); - $this->messageMananger = new Whip_MessagesManager(); - $this->textdomain = $textdomain; - } - - /** - * Adds a requirement to the list of requirements if it doesn't already exist. - * - * @param Whip_Requirement $requirement The requirement to add. - */ - public function addRequirement( Whip_Requirement $requirement ) { - // Only allow unique entries to ensure we're not checking specific combinations multiple times - if ( $this->requirementExistsForComponent( $requirement->component() ) ) { - return; - } - - $this->requirements[] = $requirement; - } - - /** - * Determines whether or not there are requirements available. - * - * @return bool Whether or not there are requirements. - */ - public function hasRequirements() { - return $this->totalRequirements() > 0; - } - - /** - * Gets the total amount of requirements. - * - * @return int The total amount of requirements. - */ - public function totalRequirements() { - return count( $this->requirements ); - } - - /** - * Determines whether or not a requirement exists for a particular component. - * - * @param string $component The component to check for. - * - * @return bool Whether or not the component has a requirement defined. - */ - public function requirementExistsForComponent( $component ) { - foreach ( $this->requirements as $requirement ) { - if ( $requirement->component() === $component ) { - return true; - } - } - - return false; - } - - /** - * Determines whether a requirement has been fulfilled. - * - * @param Whip_Requirement $requirement The requirement to check. - * - * @return bool Whether or not the requirement is fulfilled. - */ - private function requirementIsFulfilled( Whip_Requirement $requirement ) { - $available_version = $this->configuration->configuredVersion( $requirement ); - $required_version = $requirement->version(); - - if ( in_array( $requirement->operator(), array( '=', '==', '===' ), true ) ) { - return -1 !== version_compare( $available_version, $required_version ); - } - - return version_compare( $available_version, $required_version, $requirement->operator() ); - } - - /** - * Checks if all requirements are fulfilled and adds a message to the message manager if necessary. - */ - public function check() { - foreach ( $this->requirements as $requirement ) { - // Match against config - $requirement_fulfilled = $this->requirementIsFulfilled( $requirement ); - - if ( $requirement_fulfilled ) { - continue; - } - - $this->addMissingRequirementMessage( $requirement ); - } - } - - /** - * Adds a message to the message manager for requirements that cannot be fulfilled. - * - * @param Whip_Requirement $requirement The requirement that cannot be fulfilled. - */ - private function addMissingRequirementMessage( Whip_Requirement $requirement ) { - switch ( $requirement->component() ) { - case 'php': - $this->messageMananger->addMessage( new Whip_UpgradePhpMessage( $this->textdomain ) ); - break; - default: - $this->messageMananger->addMessage( new Whip_InvalidVersionRequirementMessage( $requirement, $this->configuration->configuredVersion( $requirement ) ) ); - break; - } - } - - /** - * Determines whether or not there are messages available. - * - * @return bool Whether or not there are messages to display. - */ - public function hasMessages() { - return $this->messageMananger->hasMessages(); - } - - /** - * Gets the most recent message from the message manager. - * - * @return Whip_Message The latest message. - */ - public function getMostRecentMessage() { - return $this->messageMananger->getLatestMessage(); - } - -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_VersionRequirement.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_VersionRequirement.php deleted file mode 100644 index d12df827..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/Whip_VersionRequirement.php +++ /dev/null @@ -1,133 +0,0 @@ -validateParameters( $component, $version, $operator ); - - $this->component = $component; - $this->version = $version; - $this->operator = $operator; - } - - /** - * Gets the component name defined for the requirement. - * - * @return string The component name. - */ - public function component() { - return $this->component; - } - - /** - * Gets the components version defined for the requirement. - * - * @return string - */ - public function version() { - return $this->version; - } - - /** - * Returns the operator to use when comparing version numbers. - * - * @return string The comparison operator. - */ - public function operator() { - return $this->operator; - } - - /** - * Creates a new version requirement from a comparison string - * - * @throws Whip_InvalidVersionComparisonString When an invalid version comparison string is passed. - * -*@param string $component The component for this version requirement. - * @param string $comparisonString The comparison string for this version requirement. - * -*@returns Whip_VersionRequirement The parsed version requirement. - */ - public static function fromCompareString( $component, $comparisonString ) { - - $matcher = '(' . - '(>=?)' . // Matches >= and >. - '|' . - '(<=?)' . // Matches <= and <. - ')' . - '([^>=<\s]+)'; // Matches anything except >, <, =, and whitespace. - - if ( ! preg_match( '#' . $matcher . '#', $comparisonString, $match ) ) { - throw new Whip_InvalidVersionComparisonString( $comparisonString ); - } - - $version = $match[4]; - $operator = $match[1]; - - return new Whip_VersionRequirement( $component, $version, $operator ); - } - - /** - * Validates the parameters passed to the requirement. - * - * @param string $component The component name. - * @param string $version The component version. - * @param string $operator The operator to use when comparing version. - * - * @throws Whip_EmptyProperty - * @throws Whip_InvalidOperatorType - * @throws Whip_InvalidType - */ - private function validateParameters( $component, $version, $operator ) { - if ( empty( $component ) ) { - throw new Whip_EmptyProperty( 'Component' ); - } - - if ( !is_string( $component ) ) { - throw new Whip_InvalidType( 'Component', 'string', $component ); - } - - if ( empty( $version ) ) { - throw new Whip_EmptyProperty( 'Version' ); - } - - if ( !is_string( $version ) ) { - throw new Whip_InvalidType( 'Version', 'string', $version ); - } - - if ( empty( $operator ) ) { - throw new Whip_EmptyProperty( 'Operator' ); - } - - if ( !is_string( $operator ) ) { - throw new Whip_InvalidType( 'Operator', 'string', $operator ); - } - - if ( ! in_array( $operator, array( '=', '==', '===', '<', '>', '<=', '>=' ), true ) ) { - throw new Whip_InvalidOperatorType( $operator ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/configs/default.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/configs/default.php deleted file mode 100644 index b83c8b18..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/configs/default.php +++ /dev/null @@ -1,5 +0,0 @@ - PHP_VERSION, -); diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/configs/version.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/configs/version.php deleted file mode 100644 index 9890dce9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/configs/version.php +++ /dev/null @@ -1,3 +0,0 @@ -', '<=', '>=' ); - - /** - * InvalidOperatorType constructor. - * - * @param string $value - */ - public function __construct( $value ) { - parent::__construct( - sprintf( 'Invalid operator of %s used. Please use one of the following operators: %s', - $value, - implode( ', ', $this->validOperators ) - ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/exceptions/Whip_InvalidType.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/exceptions/Whip_InvalidType.php deleted file mode 100644 index 9801d91b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/exceptions/Whip_InvalidType.php +++ /dev/null @@ -1,18 +0,0 @@ -=5.3. Passed version comparison string: %s', - $value - ) - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/facades/wordpress.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/facades/wordpress.php deleted file mode 100644 index dc50dd8d..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/facades/wordpress.php +++ /dev/null @@ -1,31 +0,0 @@ - $versionComparison ) { - $checker->addRequirement( Whip_VersionRequirement::fromCompareString( $component, $versionComparison ) ); - } - - $checker->check(); - - if ( ! $checker->hasMessages() ) { - return; - } - - $presenter = new Whip_WPMessagePresenter( $checker->getMostRecentMessage() ); - $presenter->register_hooks(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/interfaces/Whip_Message.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/interfaces/Whip_Message.php deleted file mode 100644 index 6c3431f8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/interfaces/Whip_Message.php +++ /dev/null @@ -1,8 +0,0 @@ -validateParameters( $body ); - - $this->body = $body; - } - - /** - * @return string - */ - public function body() { - return $this->body; - } - - private function validateParameters( $body ) { - if ( empty( $body ) ) { - throw new Whip_EmptyProperty( 'Message body' ); - } - - if ( ! is_string( $body ) ) { - throw new Whip_InvalidType( 'Message body', "string", $body ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/messages/Whip_HostMessage.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/messages/Whip_HostMessage.php deleted file mode 100644 index a210058a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/messages/Whip_HostMessage.php +++ /dev/null @@ -1,56 +0,0 @@ -textdomain = $textdomain; - $this->messageKey = $messageKey; - } - - /** - * Renders the message body. - * - * @return string The message body. - */ - public function body() { - $message = array(); - - $message[] = Whip_MessageFormatter::strong( $this->title() ) . '
    '; - $message[] = Whip_MessageFormatter::paragraph( Whip_Host::message( $this->messageKey, $this->filterKey ) ); - - return implode( $message, "\n" ); - } - - /** - * Renders the message title. - * - * @return string The message title. - */ - public function title() { - return sprintf( __( 'A message from %1$s', $this->textdomain ), Whip_Host::name() ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/messages/Whip_InvalidVersionRequirementMessage.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/messages/Whip_InvalidVersionRequirementMessage.php deleted file mode 100644 index 2db06295..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/messages/Whip_InvalidVersionRequirementMessage.php +++ /dev/null @@ -1,37 +0,0 @@ -requirement = $requirement; - $this->detected = $detected; - } - - /** - * @return string - */ - public function body() { - return sprintf( - 'Invalid version detected for %s. Found %s but expected %s.', - $this->requirement->component(), - $this->detected, - $this->requirement->version() - ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/messages/Whip_NullMessage.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/messages/Whip_NullMessage.php deleted file mode 100644 index 1fea0924..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/messages/Whip_NullMessage.php +++ /dev/null @@ -1,13 +0,0 @@ -textdomain = $textdomain; - } - - /** - * Composes the body of the message to display. - * - * @return string The message to display. - */ - public function body() { - $textdomain = $this->textdomain; - - $message = array(); - - $message[] = Whip_MessageFormatter::strongParagraph( __( 'Your site could be faster and more secure with a newer PHP version.', $textdomain ) ) . '
    '; - $message[] = Whip_MessageFormatter::paragraph( __( 'Hey, we\'ve noticed that you\'re running an outdated version of PHP. PHP is the programming language that WordPress and Yoast SEO are built on. The version that is currently used for your site is no longer supported. Newer versions of PHP are both faster and more secure. In fact, your version of PHP no longer receives security updates, which is why we\'re sending you to this notice.', $textdomain ) ); - $message[] = Whip_MessageFormatter::paragraph( __( 'Hosts have the ability to update your PHP version, but sometimes they don\'t dare to do that because they\'re afraid they\'ll break your site.', $textdomain ) ); - $message[] = Whip_MessageFormatter::strongParagraph( __( 'To which version should I update?', $textdomain ) ) . '
    '; - $message[] = Whip_MessageFormatter::paragraph( sprintf( __( 'You should update your PHP version to either 5.6 or to 7.0 or 7.1. On a normal WordPress site, switching to PHP 5.6 should never cause issues. We would however actually recommend you switch to PHP7. There are some plugins that are not ready for PHP7 though, so do some testing first. We have an article on how to test whether that\'s an option for you %1$shere%2$s. PHP7 is much faster than PHP 5.6. It\'s also the only PHP version still in active development and therefore the better option for your site in the long run.', $textdomain ), '
    ', '' ) ); - - if ( Whip_Host::name() !== '' ) { - $hostMessage = new Whip_HostMessage( 'WHIP_MESSAGE_FROM_HOST_ABOUT_PHP', $textdomain ); - $message[] = $hostMessage->body(); - } - - $hostingPageUrl = Whip_Host::hostingPageUrl(); - - $message[] = Whip_MessageFormatter::strongParagraph( __( 'Can\'t update? Ask your host!', $textdomain ) ) . '
    '; - - if ( function_exists( 'apply_filters' ) && apply_filters( Whip_Host::HOSTING_PAGE_FILTER_KEY, false ) ) { - $message[] = Whip_MessageFormatter::paragraph( sprintf( __( 'If you cannot upgrade your PHP version yourself, you can send an email to your host. We have %1$sexamples here%2$s. If they don\'t want to upgrade your PHP version, we would suggest you switch hosts. Have a look at one of the recommended %3$sWordPress hosting partners%4$s.', $textdomain ), '', '', sprintf( '', esc_url( $hostingPageUrl ) ), '' ) ); - } else { - $message[] = Whip_MessageFormatter::paragraph( sprintf( __( 'If you cannot upgrade your PHP version yourself, you can send an email to your host. We have %1$sexamples here%2$s. If they don\'t want to upgrade your PHP version, we would suggest you switch hosts. Have a look at one of our recommended %3$sWordPress hosting partners%4$s, they\'ve all been vetted by our Yoast support team and provide all the features a modern host should provide.', $textdomain ), '', '', sprintf( '', esc_url( $hostingPageUrl ) ), '' ) ); - } - - return implode( $message, "\n" ); - } - -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/presenters/Whip_WPMessagePresenter.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/presenters/Whip_WPMessagePresenter.php deleted file mode 100644 index dff22816..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/src/presenters/Whip_WPMessagePresenter.php +++ /dev/null @@ -1,53 +0,0 @@ -message = $message; - } - - /** - * Registers hooks to WordPress. This is a separate function so you can - * control when the hooks are registered. - */ - public function register_hooks() { - add_action( 'admin_notices', array( $this, 'renderMessage' ) ); - } - - /** - * Renders the messages present in the global to notices. - */ - public function renderMessage() { - printf( '
    %s
    ', $this->kses( $this->message->body() ) ); - } - - /** - * Removes content from the message that we don't want to show. - * - * @param string $message The message to clean. - * - * @return string The cleaned message. - */ - public function kses( $message ) { - return wp_kses( $message, array( - 'a' => array( - 'href' => true, - 'target' => true, - ), - 'strong' => true, - 'p' => true, - 'ul' => true, - 'li' => true, - ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/ConfigurationTest.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/ConfigurationTest.php deleted file mode 100644 index 10f91e2a..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/ConfigurationTest.php +++ /dev/null @@ -1,62 +0,0 @@ - '5.6' ) ); - $requirement = $this->getMockBuilder( 'Whip_Requirement' ) - ->setMethods( array( 'component' ) ) - ->getMock(); - - $requirement - ->expects( $this->any() ) - ->method( 'component' ) - ->will( $this->returnValue( 'mysql' ) ); - - $this->assertEquals( -1, $configuration->configuredVersion( $requirement ) ); - } - - public function testItReturnsAnEntryIfRequirementIsFound() { - $configuration = new Whip_Configuration( array( 'php' => '5.6' ) ); - $requirement = $this->getMockBuilder( 'Whip_Requirement' ) - ->setMethods( array( 'component' ) ) - ->getMock(); - - $requirement - ->expects( $this->any() ) - ->method( 'component' ) - ->will( $this->returnValue( 'php' ) ); - - $this->assertEquals( '5.6', $configuration->configuredVersion( $requirement ) ); - } - - public function testIfRequirementIsConfigured() { - $configuration = new Whip_Configuration( array( 'php' => '5.6' ) ); - $requirement = $this->getMockBuilder( 'Whip_Requirement' ) - ->setMethods( array( 'component' ) ) - ->getMock(); - - $requirement - ->expects( $this->any() ) - ->method( 'component' ) - ->will( $this->returnValue( 'php' ) ); - - $falseRequirement = $this->getMockBuilder( 'Whip_Requirement' ) - ->setMethods( array( 'component' ) ) - ->getMock(); - - $falseRequirement - ->expects( $this->any() ) - ->method( 'component' ) - ->will( $this->returnValue( 'mysql' ) ); - - $this->assertTrue( $configuration->hasRequirementConfigured( $requirement ) ); - $this->assertFalse( $configuration->hasRequirementConfigured( $falseRequirement ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/MessageTest.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/MessageTest.php deleted file mode 100644 index 1775724f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/MessageTest.php +++ /dev/null @@ -1,23 +0,0 @@ -assertNotEmpty($message->body()); - } - - /** - * @expectedException Whip_EmptyProperty - */ - public function testMessageCannotBeEmpty() { - new Whip_BasicMessage( '' ); - } - - /** - * @expectedException Whip_InvalidType - */ - public function testMessageMustBeString() { - new Whip_BasicMessage( 123 ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/MessagesManagerTest.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/MessagesManagerTest.php deleted file mode 100644 index 0a9dae28..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/MessagesManagerTest.php +++ /dev/null @@ -1,14 +0,0 @@ -assertFalse( $manager->hasMessages() ); - - $GLOBALS['whip_messages'][] = 'I am a test message'; - - $this->assertTrue( $manager->hasMessages() ); - - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/RequirementsCheckerTest.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/RequirementsCheckerTest.php deleted file mode 100644 index 8be5e3f6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/RequirementsCheckerTest.php +++ /dev/null @@ -1,144 +0,0 @@ -addRequirement( new Whip_VersionRequirement( 'php', '5.2' ) ); - - $this->assertTrue( $checker->hasRequirements() ); - $this->assertEquals( 1, $checker->totalRequirements() ); - } - - /** - * @requires PHP 7 - */ - public function testItThrowsAnTypeErrorWhenInvalidRequirementIsPassed() { - if ( version_compare( phpversion(), 7.0, '<' ) ) { - $this->markTestSkipped( 'Skipped due to incompatible PHP version.' ); - } - - $exceptionCaught = false; - - $checker = new Whip_RequirementsChecker(); - - try { - $checker->addRequirement( new stdClass() ); - } catch( Error $e ) { - $exceptionCaught = true; - } - - $this->assertTrue( $exceptionCaught ); - } - - public function testItThrowsAnTypeErrorWhenInvalidRequirementIsPassedInPHP5() { - if ( version_compare( phpversion(), 7.0, '>=' ) ) { - $this->markTestSkipped(); - } - - $exceptionCaught = false; - - $checker = new Whip_RequirementsChecker(); - - try { - $checker->addRequirement( new stdClass() ); - } catch( Exception $e ) { - $exceptionCaught = true; - } - - $this->assertTrue( $exceptionCaught ); - } - - public function testItOnlyContainsUniqueComponents() { - $checker = new Whip_RequirementsChecker(); - - $checker->addRequirement( new Whip_VersionRequirement( 'php', '5.2' ) ); - $checker->addRequirement( new Whip_VersionRequirement( 'mysql', '5.6' ) ); - - $this->assertTrue( $checker->hasRequirements() ); - $this->assertEquals( 2, $checker->totalRequirements() ); - - $checker->addRequirement( new Whip_VersionRequirement( 'php', '6' ) ); - - $this->assertEquals( 2, $checker->totalRequirements() ); - } - - public function testIfRequirementExists() { - $checker = new Whip_RequirementsChecker(); - - $checker->addRequirement( new Whip_VersionRequirement( 'php', '5.2' ) ); - $checker->addRequirement( new Whip_VersionRequirement( 'mysql', '5.6' ) ); - - $this->assertTrue( $checker->requirementExistsForComponent( 'php' ) ); - $this->assertFalse( $checker->requirementExistsForComponent( 'mongodb' ) ); - } - - public function testCheckIfRequirementIsFulfilled() { - $checker = new Whip_RequirementsChecker( array( 'php' => phpversion() ) ); - - $checker->addRequirement( new Whip_VersionRequirement( 'php', '5.2' ) ); - $checker->check(); - - $this->assertEmpty( $checker->getMostRecentMessage()->body() ); - } - - public function testCheckIfPHPRequirementIsNotFulfilled() { - $checker = new Whip_RequirementsChecker( array( 'php' => 4 ) ); - - $checker->addRequirement( new Whip_VersionRequirement( 'php', '5.6' ) ); - $checker->check(); - - $this->assertTrue( $checker->hasMessages() ); - - // Get the message. This will unset the global. - $recentMessage = $checker->getMostRecentMessage(); - - $this->assertNotEmpty( $recentMessage ); - $this->assertInternalType( 'string', $recentMessage->body() ); - $this->assertFalse( $checker->hasMessages() ); - $this->assertInstanceOf( 'Whip_UpgradePhpMessage', $recentMessage ); - } - - public function testCheckIfRequirementIsNotFulfilled() { - $checker = new Whip_RequirementsChecker( array( 'mysql' => 4 ) ); - - $checker->addRequirement( new Whip_VersionRequirement( 'mysql', '5.6' ) ); - $checker->check(); - - $this->assertTrue( $checker->hasMessages() ); - - // Get the message. This will unset the global. - $recentMessage = $checker->getMostRecentMessage(); - - $this->assertNotEmpty( $recentMessage ); - $this->assertFalse( $checker->hasMessages() ); - $this->assertInstanceOf( 'Whip_InvalidVersionRequirementMessage', $recentMessage ); - $this->assertStringStartsWith( 'Invalid version detected', $recentMessage->body() ); - } - - public function testCheckIfRequirementIsFulfilledWithSpecificComparison() { - $checker = new Whip_RequirementsChecker( array( 'php' => 4 ) ); - - $checker->addRequirement( new Whip_VersionRequirement( 'php', '5.2', '<' ) ); - $checker->check(); - - $this->assertFalse( $checker->hasMessages() ); - } - - public function testCheckIfRequirementIsNotFulfilledWithSpecificComparison() { - $checker = new Whip_RequirementsChecker( array( 'php' => 4 ) ); - - $checker->addRequirement( new Whip_VersionRequirement( 'php', '5.2', '>=' ) ); - $checker->check(); - - $this->assertTrue( $checker->hasMessages() ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/VersionRequirementTest.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/VersionRequirementTest.php deleted file mode 100644 index f0b5966b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/VersionRequirementTest.php +++ /dev/null @@ -1,99 +0,0 @@ -assertNotEmpty($requirement->component()); - $this->assertNotEmpty($requirement->version()); - } - - /** - * @expectedException Whip_EmptyProperty - */ - public function testComponentCannotBeEmpty() { - new Whip_VersionRequirement( '', '5.2' ); - } - - /** - * @expectedException Whip_EmptyProperty - */ - public function testVersionCannotBeEmpty() { - new Whip_VersionRequirement( 'php', '' ); - } - - /** - * @expectedException Whip_InvalidType - */ - public function testComponentMustBeString() { - new Whip_VersionRequirement( 123, '5.2' ); - } - - /** - * @expectedException Whip_InvalidType - */ - public function testVersionMustBeString() { - new Whip_VersionRequirement( 'php', 123 ); - } - - /** - * @expectedException Whip_EmptyProperty - */ - public function testOperatorCannotBeEmpty() { - new Whip_VersionRequirement( 'php', '5.6', '' ); - } - - /** - * @expectedException Whip_InvalidType - */ - public function testOperatorMustBeString() { - new Whip_VersionRequirement( 'php', '5.2', 6 ); - } - - /** - * @expectedException Whip_InvalidOperatorType - */ - public function testOperatorMustBeValid() { - new Whip_VersionRequirement( 'php', '5.2', '->' ); - } - - public function testGettingComponentProperties() { - $requirement = new Whip_VersionRequirement( 'php', '5.6' ); - - $this->assertEquals( 'php', $requirement->component() ); - $this->assertEquals( '5.6', $requirement->version() ); - $this->assertEquals( '=', $requirement->operator() ); - } - - /** - * @dataProvider dataFromCompareString - */ - public function testFromCompareString( $expectation, $component, $compareString ) { - $requirement = Whip_VersionRequirement::fromCompareString( $component, $compareString ); - - $this->assertEquals( $expectation[0], $requirement->component() ); - $this->assertEquals( $expectation[1], $requirement->version() ); - $this->assertEquals( $expectation[2], $requirement->operator() ); - } - - public function dataFromCompareString() { - return array( - array( array( 'php', '5.5', '>' ), 'php', '>5.5' ), - array( array( 'php', '5.5', '>=' ), 'php', '>=5.5' ), - array( array( 'php', '5.5', '<' ), 'php', '<5.5' ), - array( array( 'php', '5.5', '<=' ), 'php', '<=5.5' ), - array( array( 'php', '7.3', '>' ), 'php', '>7.3' ), - array( array( 'php', '7.3', '>=' ), 'php', '>=7.3' ), - array( array( 'php', '7.3', '<' ), 'php', '<7.3' ), - array( array( 'php', '7.3', '<=' ), 'php', '<=7.3' ), - ); - } - - /** - * @expectedException Whip_InvalidVersionComparisonString - */ - public function testFromCompareStringException() { - Whip_VersionRequirement::fromCompareString( 'php', '> 2.3' ); - } -} - diff --git a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/bootstrap.php b/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/bootstrap.php deleted file mode 100644 index e9b85682..00000000 --- a/wp/wp-content/plugins/wordpress-seo/vendor/yoast/whip/tests/bootstrap.php +++ /dev/null @@ -1,5 +0,0 @@ - ABSPATH . 'wp-admin/includes/class-wp-list-table.php', - 'walker_category' => ABSPATH . 'wp-includes/category-template.php', - 'pclzip' => ABSPATH . 'wp-admin/includes/class-pclzip.php', - ); - } - - $cn = strtolower( $class ); - - if ( ! class_exists( $class ) && isset( $classes[ $cn ] ) ) { - require_once( $classes[ $cn ] ); - } -} - -if ( file_exists( WPSEO_PATH . '/vendor/autoload_52.php' ) ) { - require WPSEO_PATH . '/vendor/autoload_52.php'; -} -elseif ( ! class_exists( 'WPSEO_Options' ) ) { // Still checking since might be site-level autoload R. - add_action( 'admin_init', 'yoast_wpseo_missing_autoload', 1 ); - - return; -} - -if ( function_exists( 'spl_autoload_register' ) ) { - spl_autoload_register( 'wpseo_auto_load' ); -} - -/* ********************* DEFINES DEPENDING ON AUTOLOADED CODE ********************* */ - -/** - * Defaults to production, for safety - */ -if ( ! defined( 'YOAST_ENVIRONMENT' ) ) { - define( 'YOAST_ENVIRONMENT', 'production' ); -} - -/** - * Only use minified assets when we are in a production environment - */ -if ( ! defined( 'WPSEO_CSSJS_SUFFIX' ) ) { - define( 'WPSEO_CSSJS_SUFFIX', ( 'development' !== YOAST_ENVIRONMENT ) ? '.min' : '' ); -} - -/* ***************************** PLUGIN (DE-)ACTIVATION *************************** */ - -/** - * Run single site / network-wide activation of the plugin. - * - * @param bool $networkwide Whether the plugin is being activated network-wide. - */ -function wpseo_activate( $networkwide = false ) { - if ( ! is_multisite() || ! $networkwide ) { - _wpseo_activate(); - } - else { - /* Multi-site network activation - activate the plugin for all blogs */ - wpseo_network_activate_deactivate( true ); - } -} - -/** - * Run single site / network-wide de-activation of the plugin. - * - * @param bool $networkwide Whether the plugin is being de-activated network-wide. - */ -function wpseo_deactivate( $networkwide = false ) { - if ( ! is_multisite() || ! $networkwide ) { - _wpseo_deactivate(); - } - else { - /* Multi-site network activation - de-activate the plugin for all blogs */ - wpseo_network_activate_deactivate( false ); - } -} - -/** - * Run network-wide (de-)activation of the plugin - * - * @param bool $activate True for plugin activation, false for de-activation. - */ -function wpseo_network_activate_deactivate( $activate = true ) { - global $wpdb; - - $network_blogs = $wpdb->get_col( $wpdb->prepare( "SELECT blog_id FROM $wpdb->blogs WHERE site_id = %d", $wpdb->siteid ) ); - - if ( is_array( $network_blogs ) && $network_blogs !== array() ) { - foreach ( $network_blogs as $blog_id ) { - switch_to_blog( $blog_id ); - - if ( $activate === true ) { - _wpseo_activate(); - } - else { - _wpseo_deactivate(); - } - - restore_current_blog(); - } - } -} - -/** - * Runs on activation of the plugin. - */ -function _wpseo_activate() { - require_once( WPSEO_PATH . 'inc/wpseo-functions.php' ); - require_once( WPSEO_PATH . 'inc/class-wpseo-installation.php' ); - - wpseo_load_textdomain(); // Make sure we have our translations available for the defaults. - - new WPSEO_Installation(); - - WPSEO_Options::get_instance(); - if ( ! is_multisite() ) { - WPSEO_Options::initialize(); - } - else { - WPSEO_Options::maybe_set_multisite_defaults( true ); - } - WPSEO_Options::ensure_options_exist(); - - if ( is_multisite() && ms_is_switched() ) { - delete_option( 'rewrite_rules' ); - } - else { - $wpseo_rewrite = new WPSEO_Rewrite(); - $wpseo_rewrite->schedule_flush(); - } - - wpseo_add_capabilities(); - - // Clear cache so the changes are obvious. - WPSEO_Utils::clear_cache(); - - do_action( 'wpseo_activate' ); -} - -/** - * On deactivation, flush the rewrite rules so XML sitemaps stop working. - */ -function _wpseo_deactivate() { - require_once( WPSEO_PATH . 'inc/wpseo-functions.php' ); - - if ( is_multisite() && ms_is_switched() ) { - delete_option( 'rewrite_rules' ); - } - else { - add_action( 'shutdown', 'flush_rewrite_rules' ); - } - - wpseo_remove_capabilities(); - - // Clear cache so the changes are obvious. - WPSEO_Utils::clear_cache(); - - do_action( 'wpseo_deactivate' ); -} - -/** - * Run wpseo activation routine on creation / activation of a multisite blog if WPSEO is activated - * network-wide. - * - * Will only be called by multisite actions. - * - * @internal Unfortunately will fail if the plugin is in the must-use directory - * @see https://core.trac.wordpress.org/ticket/24205 - * - * @param int $blog_id Blog ID. - */ -function wpseo_on_activate_blog( $blog_id ) { - if ( ! function_exists( 'is_plugin_active_for_network' ) ) { - require_once( ABSPATH . '/wp-admin/includes/plugin.php' ); - } - - if ( is_plugin_active_for_network( plugin_basename( WPSEO_FILE ) ) ) { - switch_to_blog( $blog_id ); - wpseo_activate( false ); - restore_current_blog(); - } -} - - -/* ***************************** PLUGIN LOADING *************************** */ - -/** - * Load translations - */ -function wpseo_load_textdomain() { - $wpseo_path = str_replace( '\\', '/', WPSEO_PATH ); - $mu_path = str_replace( '\\', '/', WPMU_PLUGIN_DIR ); - - if ( false !== stripos( $wpseo_path, $mu_path ) ) { - load_muplugin_textdomain( 'wordpress-seo', dirname( WPSEO_BASENAME ) . '/languages/' ); - } - else { - load_plugin_textdomain( 'wordpress-seo', false, dirname( WPSEO_BASENAME ) . '/languages/' ); - } -} - -add_action( 'plugins_loaded', 'wpseo_load_textdomain' ); - - -/** - * On plugins_loaded: load the minimum amount of essential files for this plugin - */ -function wpseo_init() { - require_once( WPSEO_PATH . 'inc/wpseo-functions.php' ); - require_once( WPSEO_PATH . 'inc/wpseo-functions-deprecated.php' ); - - // Make sure our option and meta value validation routines and default values are always registered and available. - WPSEO_Options::get_instance(); - WPSEO_Meta::init(); - - $options = WPSEO_Options::get_options( array( 'wpseo', 'wpseo_permalinks', 'wpseo_xml' ) ); - if ( version_compare( $options['version'], WPSEO_VERSION, '<' ) ) { - new WPSEO_Upgrade(); - // Get a cleaned up version of the $options. - $options = WPSEO_Options::get_options( array( 'wpseo', 'wpseo_permalinks', 'wpseo_xml' ) ); - } - - if ( $options['stripcategorybase'] === true ) { - $GLOBALS['wpseo_rewrite'] = new WPSEO_Rewrite; - } - - if ( $options['enablexmlsitemap'] === true ) { - $GLOBALS['wpseo_sitemaps'] = new WPSEO_Sitemaps; - } - - if ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) { - require_once( WPSEO_PATH . 'inc/wpseo-non-ajax-functions.php' ); - } - - // Init it here because the filter must be present on the frontend as well or it won't work in the customizer. - new WPSEO_Customizer(); -} - -/** - * Loads the rest api endpoints. - */ -function wpseo_init_rest_api() { - // We can't do anything when requirements are not met. - if ( WPSEO_Utils::is_api_available() ) { - // Boot up REST API. - $configuration_service = new WPSEO_Configuration_Service(); - $configuration_service->initialize(); - } -} - -/** - * Used to load the required files on the plugins_loaded hook, instead of immediately. - */ -function wpseo_frontend_init() { - add_action( 'init', 'initialize_wpseo_front' ); - - $options = WPSEO_Options::get_option( 'wpseo_internallinks' ); - if ( $options['breadcrumbs-enable'] === true ) { - /** - * If breadcrumbs are active (which they supposedly are if the users has enabled this settings, - * there's no reason to have bbPress breadcrumbs as well. - * - * @internal The class itself is only loaded when the template tag is encountered via - * the template tag function in the wpseo-functions.php file - */ - add_filter( 'bbp_get_breadcrumb', '__return_false' ); - } - - add_action( 'template_redirect', 'wpseo_frontend_head_init', 999 ); -} - -/** - * Instantiate the different social classes on the frontend - */ -function wpseo_frontend_head_init() { - $options = WPSEO_Options::get_option( 'wpseo_social' ); - if ( $options['twitter'] === true ) { - add_action( 'wpseo_head', array( 'WPSEO_Twitter', 'get_instance' ), 40 ); - } - - if ( $options['opengraph'] === true ) { - $GLOBALS['wpseo_og'] = new WPSEO_OpenGraph; - } - -} - -/** - * Used to load the required files on the plugins_loaded hook, instead of immediately. - */ -function wpseo_admin_init() { - new WPSEO_Admin_Init(); -} - - -/* ***************************** BOOTSTRAP / HOOK INTO WP *************************** */ -$spl_autoload_exists = function_exists( 'spl_autoload_register' ); -$filter_exists = function_exists( 'filter_input' ); - -if ( ! $spl_autoload_exists ) { - add_action( 'admin_init', 'yoast_wpseo_missing_spl', 1 ); -} - -if ( ! $filter_exists ) { - add_action( 'admin_init', 'yoast_wpseo_missing_filter', 1 ); -} - -if ( ! function_exists( 'wp_installing' ) ) { - /** - * We need to define wp_installing in WordPress versions older than 4.4 - * - * @return bool - */ - function wp_installing() { - return defined( 'WP_INSTALLING' ); - } -} - -if ( ! wp_installing() && ( $spl_autoload_exists && $filter_exists ) ) { - add_action( 'plugins_loaded', 'wpseo_init', 14 ); - add_action( 'rest_api_init', 'wpseo_init_rest_api' ); - - if ( is_admin() ) { - - new Yoast_Alerts(); - - if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { - require_once( WPSEO_PATH . 'admin/ajax.php' ); - - // Plugin conflict ajax hooks. - new Yoast_Plugin_Conflict_Ajax(); - - if ( filter_input( INPUT_POST, 'action' ) === 'inline-save' ) { - add_action( 'plugins_loaded', 'wpseo_admin_init', 15 ); - } - } - else { - add_action( 'plugins_loaded', 'wpseo_admin_init', 15 ); - } - } - else { - add_action( 'plugins_loaded', 'wpseo_frontend_init', 15 ); - } - - add_action( 'plugins_loaded', 'load_yoast_notifications' ); -} - -// Activation and deactivation hook. -register_activation_hook( WPSEO_FILE, 'wpseo_activate' ); -register_deactivation_hook( WPSEO_FILE, 'wpseo_deactivate' ); -add_action( 'wpmu_new_blog', 'wpseo_on_activate_blog' ); -add_action( 'activate_blog', 'wpseo_on_activate_blog' ); - -// Loading OnPage integration. -new WPSEO_OnPage(); - - -/** - * Wraps for notifications center class. - */ -function load_yoast_notifications() { - // Init Yoast_Notification_Center class. - Yoast_Notification_Center::get(); -} - - -/** - * Throw an error if the PHP SPL extension is disabled (prevent white screens) and self-deactivate plugin - * - * @since 1.5.4 - * - * @return void - */ -function yoast_wpseo_missing_spl() { - if ( is_admin() ) { - add_action( 'admin_notices', 'yoast_wpseo_missing_spl_notice' ); - - yoast_wpseo_self_deactivate(); - } -} - -/** - * Returns the notice in case of missing spl extension - */ -function yoast_wpseo_missing_spl_notice() { - $message = esc_html__( 'The Standard PHP Library (SPL) extension seem to be unavailable. Please ask your web host to enable it.', 'wordpress-seo' ); - yoast_wpseo_activation_failed_notice( $message ); -} - -/** - * Throw an error if the Composer autoload is missing and self-deactivate plugin - * - * @return void - */ -function yoast_wpseo_missing_autoload() { - if ( is_admin() ) { - add_action( 'admin_notices', 'yoast_wpseo_missing_autoload_notice' ); - - yoast_wpseo_self_deactivate(); - } -} - -/** - * Returns the notice in case of missing Composer autoload - */ -function yoast_wpseo_missing_autoload_notice() { - /* translators: %1$s expands to Yoast SEO, %2$s / %3$s: links to the installation manual in the Readme for the Yoast SEO code repository on GitHub */ - $message = esc_html__( 'The %1$s plugin installation is incomplete. Please refer to %2$sinstallation instructions%3$s.', 'wordpress-seo' ); - $message = sprintf( $message, 'Yoast SEO', '', '' ); - yoast_wpseo_activation_failed_notice( $message ); -} - -/** - * Throw an error if the filter extension is disabled (prevent white screens) and self-deactivate plugin - * - * @since 2.0 - * - * @return void - */ -function yoast_wpseo_missing_filter() { - if ( is_admin() ) { - add_action( 'admin_notices', 'yoast_wpseo_missing_filter_notice' ); - - yoast_wpseo_self_deactivate(); - } -} - -/** - * Returns the notice in case of missing filter extension - */ -function yoast_wpseo_missing_filter_notice() { - $message = esc_html__( 'The filter extension seem to be unavailable. Please ask your web host to enable it.', 'wordpress-seo' ); - yoast_wpseo_activation_failed_notice( $message ); -} - -/** - * Echo's the Activation failed notice with any given message. - * - * @param string $message Message string. - */ -function yoast_wpseo_activation_failed_notice( $message ) { - echo '

    ' . __( 'Activation failed:', 'wordpress-seo' ) . ' ' . $message . '

    '; -} - -/** - * The method will deactivate the plugin, but only once, done by the static $is_deactivated - */ -function yoast_wpseo_self_deactivate() { - static $is_deactivated; - - if ( $is_deactivated === null ) { - $is_deactivated = true; - deactivate_plugins( plugin_basename( WPSEO_FILE ) ); - if ( isset( $_GET['activate'] ) ) { - unset( $_GET['activate'] ); - } - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/wp-seo.php b/wp/wp-content/plugins/wordpress-seo/wp-seo.php deleted file mode 100644 index b88df2b3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/wp-seo.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -if ( ! function_exists( 'add_filter' ) ) { - header( 'Status: 403 Forbidden' ); - header( 'HTTP/1.1 403 Forbidden' ); - exit(); -} - -if ( ! defined( 'WPSEO_FILE' ) ) { - define( 'WPSEO_FILE', __FILE__ ); -} - -// Load the Yoast SEO plugin. -require_once( dirname( WPSEO_FILE ) . '/wp-seo-main.php' ); diff --git a/wp/wp-content/plugins/wordpress-seo/wpml-config.xml b/wp/wp-content/plugins/wordpress-seo/wpml-config.xml deleted file mode 100644 index cc4c61bf..00000000 --- a/wp/wp-content/plugins/wordpress-seo/wpml-config.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - _yoast_wpseo_title - _yoast_wpseo_bctitle - _yoast_wpseo_metadesc - _yoast_wpseo_metakeywords - _yoast_wpseo_focuskw - _yoast_wpseo_meta-robots-noindex - _yoast_wpseo_meta-robots-nofollow - _yoast_wpseo_meta-robots-adv - _yoast_wpseo_canonical - _yoast_wpseo_redirect - _yoast_wpseo_opengraph-description - _yoast_wpseo_google-plus-description - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/wp/wp-content/plugins/wpdirauth b/wp/wp-content/plugins/wpdirauth deleted file mode 160000 index 3739d3e0..00000000 --- a/wp/wp-content/plugins/wpdirauth +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3739d3e0e63c2ab1121b090990f9977e16acf05e diff --git a/wp/wp-content/themes/index.php b/wp/wp-content/themes/index.php deleted file mode 100644 index 4e6c07c7..00000000 --- a/wp/wp-content/themes/index.php +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/themes/twentyfifteen/404.php b/wp/wp-content/themes/twentyfifteen/404.php deleted file mode 100644 index 43ff16d4..00000000 --- a/wp/wp-content/themes/twentyfifteen/404.php +++ /dev/null @@ -1,30 +0,0 @@ - - -
    -
    - -
    - - -
    -

    - - -
    -
    - -
    -
    - - diff --git a/wp/wp-content/themes/twentyfifteen/archive.php b/wp/wp-content/themes/twentyfifteen/archive.php deleted file mode 100644 index bb6021e3..00000000 --- a/wp/wp-content/themes/twentyfifteen/archive.php +++ /dev/null @@ -1,64 +0,0 @@ - - -
    -
    - - - - - - __( 'Previous page', 'twentyfifteen' ), - 'next_text' => __( 'Next page', 'twentyfifteen' ), - 'before_page_number' => '' . __( 'Page', 'twentyfifteen' ) . ' ', - ) ); - - // If no content, include the "No posts found" template. - else : - get_template_part( 'content', 'none' ); - - endif; - ?> - -
    -
    - - diff --git a/wp/wp-content/themes/twentyfifteen/author-bio.php b/wp/wp-content/themes/twentyfifteen/author-bio.php deleted file mode 100644 index 839df911..00000000 --- a/wp/wp-content/themes/twentyfifteen/author-bio.php +++ /dev/null @@ -1,39 +0,0 @@ - - -
    -

    -
    - -
    - -
    -

    - -

    - - -

    - -
    -
    diff --git a/wp/wp-content/themes/twentyfifteen/comments.php b/wp/wp-content/themes/twentyfifteen/comments.php deleted file mode 100644 index 12b892f6..00000000 --- a/wp/wp-content/themes/twentyfifteen/comments.php +++ /dev/null @@ -1,58 +0,0 @@ - - -
    - - -

    - -

    - - - -
      - 'ol', - 'short_ping' => true, - 'avatar_size' => 56, - ) ); - ?> -
    - - - - - - -

    - - - - -
    diff --git a/wp/wp-content/themes/twentyfifteen/content-link.php b/wp/wp-content/themes/twentyfifteen/content-link.php deleted file mode 100644 index 2beb1f78..00000000 --- a/wp/wp-content/themes/twentyfifteen/content-link.php +++ /dev/null @@ -1,60 +0,0 @@ - - - diff --git a/wp/wp-content/themes/twentyfifteen/content-none.php b/wp/wp-content/themes/twentyfifteen/content-none.php deleted file mode 100644 index f1d59be4..00000000 --- a/wp/wp-content/themes/twentyfifteen/content-none.php +++ /dev/null @@ -1,37 +0,0 @@ - - -
    - - -
    - - - -

    Get started here.', 'twentyfifteen' ), esc_url( admin_url( 'post-new.php' ) ) ); ?>

    - - - -

    - - - - -

    - - - - -
    -
    diff --git a/wp/wp-content/themes/twentyfifteen/content-page.php b/wp/wp-content/themes/twentyfifteen/content-page.php deleted file mode 100644 index 7d37daa7..00000000 --- a/wp/wp-content/themes/twentyfifteen/content-page.php +++ /dev/null @@ -1,37 +0,0 @@ - - -
    > - - -
    - ', '' ); ?> -
    - -
    - - '', - 'link_before' => '', - 'link_after' => '', - 'pagelink' => '' . __( 'Page', 'twentyfifteen' ) . ' %', - 'separator' => ', ', - ) ); - ?> -
    - - ', '' ); ?> - -
    diff --git a/wp/wp-content/themes/twentyfifteen/content-search.php b/wp/wp-content/themes/twentyfifteen/content-search.php deleted file mode 100644 index 33e2d993..00000000 --- a/wp/wp-content/themes/twentyfifteen/content-search.php +++ /dev/null @@ -1,37 +0,0 @@ - - - diff --git a/wp/wp-content/themes/twentyfifteen/content.php b/wp/wp-content/themes/twentyfifteen/content.php deleted file mode 100644 index 24756007..00000000 --- a/wp/wp-content/themes/twentyfifteen/content.php +++ /dev/null @@ -1,60 +0,0 @@ - - -
    > - - -
    - ', '' ); - else : - the_title( sprintf( '

    ', esc_url( get_permalink() ) ), '

    ' ); - endif; - ?> -
    - -
    - ', '', false ) - ) ); - - wp_link_pages( array( - 'before' => '', - 'link_before' => '', - 'link_after' => '', - 'pagelink' => '' . __( 'Page', 'twentyfifteen' ) . ' %', - 'separator' => ', ', - ) ); - ?> -
    - - - -
    - - ', '' ); ?> -
    - -
    diff --git a/wp/wp-content/themes/twentyfifteen/css/editor-style.css b/wp/wp-content/themes/twentyfifteen/css/editor-style.css deleted file mode 100644 index b3cdd0f1..00000000 --- a/wp/wp-content/themes/twentyfifteen/css/editor-style.css +++ /dev/null @@ -1,482 +0,0 @@ -/* -Theme Name: Twenty Fifteen -Description: Used to style the TinyMCE editor. -*/ - - -/** - * Table of Contents: - * - * 1.0 - Body - * 2.0 - Typography - * 3.0 - Elements - * 4.0 - Alignment - * 5.0 - Caption - * 6.0 - Galleries - * 7.0 - Audio / Video - * 8.0 - RTL - */ - - -/** - * 1.0 Body - */ - -body { - color: #333; - font-family: "Noto Serif", serif; - font-weight: 400; - font-size: 17px; - line-height: 1.6471; - margin: 20px 40px; - max-width: 660px; - vertical-align: baseline; -} - - -/** - * 2.0 Typography - */ - -h1, -h2, -h3, -h4, -h5, -h6 { - clear: both; - font-weight: 700; - margin: 56px 0 28px; -} - -h1 { - font-size: 35px; - line-height: 1.2308; -} - -h2 { - font-size: 29px; - line-height: 1.2069; -} - -h3 { - font-size: 24px; - line-height: 1.1667; -} - -h4 { - font-size: 20px; - line-height: 1.4; -} - -h5, -h6 { - font-size: 17px; - letter-spacing: 0.1em; - line-height: 1.2353; - text-transform: uppercase; -} - -h1:first-child, -h2:first-child, -h3:first-child, -h4:first-child, -h5:first-child, -h6:first-child { - margin-top: 0; -} - -p { - margin: 0 0 28px; -} - -b, -strong { - font-weight: 700; -} - -dfn, -cite, -em, -i { - font-style: italic; -} - -blockquote { - border-left: 4px solid #707070; - color: #707070; - font-size: 20px; - font-style: italic; - line-height: 1.8182; - margin: 0 0 35px -21px; - padding-left: 17px; -} - -blockquote > blockquote { - margin-left: 0; -} - -blockquote p { - margin-bottom: 35px; -} - -blockquote > p:last-child { - margin-bottom: 0; -} - -blockquote cite, -blockquote small { - color: #333; - font-family: "Noto Sans", sans-serif; - font-size: 17px; - line-height: 1.6471; -} - -blockquote em, -blockquote i, -blockquote cite { - font-style: normal; -} - -blockquote strong, -blockquote b { - font-weight: 400; -} - -address { - font-style: italic; - margin: 0 0 28px; -} - -code, -kbd, -tt, -var, -samp, -pre { - font-family: Inconsolata, monospace; -} - -pre { - background-color: #fcfcfc; - border: 1px solid #eaeaea; - font-size: 17px; - line-height: 1.2353; - margin-bottom: 28px; - max-width: 100%; - overflow: auto; - padding: 14px; - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -abbr[title] { - border-bottom: 1px dotted #eaeaea; - cursor: help; -} - -mark, -ins { - background-color: #fff9c0; - text-decoration: none; -} - -sup, -sub { - font-size: 75%; - height: 0; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - bottom: 1ex; -} - -sub { - top: .5ex; -} - -small { - font-size: 75%; -} - -big { - font-size: 125%; -} - - -/** - * 3.0 Elements - */ - -hr { - background-color: #eaeaea; - border: 0; - height: 1px; - margin-bottom: 28px; -} - -ul, -ol { - margin: 0 0 28px 0; - padding: 0; -} - -ul { - list-style: disc; -} - -ol { - list-style: decimal; -} - -li > ul, -li > ol { - margin: 0 0 0 23px; -} - -blockquote > ul, -blockquote > ol { - margin-left: 28px; -} - -dl { - margin: 0 0 28px; -} - -dt { - font-weight: bold; -} - -dd { - margin: 0 0 28px; -} - -table, -th, -td, -.mce-item-table, -.mce-item-table th, -.mce-item-table td { - border: 1px solid #eaeaea; -} - -table a { - color: #333; -} - -table, -.mce-item-table { - border-collapse: separate; - border-spacing: 0; - border-width: 1px 0 0 1px; - margin: 0 0 28px; - width: 100%; -} - -table th, -.mce-item-table th, -table caption { - border-width: 0 1px 1px 0; - font-family: "Noto Serif", serif; - font-size: 17px; - font-weight: 700; - padding: 7px; - text-align: left; - vertical-align: baseline; -} - -table td, -.mce-item-table td { - border-width: 0 1px 1px 0; - font-family: "Noto Serif", serif; - font-size: 17px; - padding: 7px; - vertical-align: baseline; -} - -img { - border: 0; - height: auto; - max-width: 100%; - vertical-align: middle; -} - -figure { - margin: 0; -} - -del { - opacity: 0.8; -} - -a { - border-bottom: 1px solid #333; - color: #333; - text-decoration: none; -} - - -/** - * 4.0 Alignment - */ - -.alignleft { - float: left; - margin: 7px 28px 28px 0; -} - -.alignright { - float: right; - margin: 7px 0 28px 28px; -} - -.aligncenter { - clear: both; - display: block; - margin: 7px auto; -} - - -/** - * 5.0 Caption - */ - -.wp-caption { - background: transparent; - border: none; - color: #707070; - font-family: "Noto Sans", sans-serif; - margin: 0 0 28px 0; - max-width: 100%; - padding: 0; - text-align: inherit; -} - -.wp-caption.alignleft { - margin: 7px 28px 21px 0; -} - -.wp-caption.alignright { - margin: 7px 0 21px 28px; -} - -.wp-caption.aligncenter { - margin: 7px auto; -} - -.wp-caption .wp-caption-text, -.wp-caption-dd { - font-size: 14px; - line-height: 1.5; - padding: 7px 0; -} - - -/** - * 6.0 Galleries - */ - -.gallery-item { - display: inline-block; - padding: 1.79104477%; - text-align: center; - vertical-align: top; - width: 100%; -} - -.gallery-columns-2 .gallery-item { - max-width: 50%; -} - -.gallery-columns-3 .gallery-item { - max-width: 33.33%; -} - -.gallery-columns-4 .gallery-item { - max-width: 25%; -} - -.gallery-columns-5 .gallery-item { - max-width: 20%; -} - -.gallery-columns-6 .gallery-item { - max-width: 16.66%; -} - -.gallery-columns-7 .gallery-item { - max-width: 14.28%; -} - -.gallery-columns-8 .gallery-item { - max-width: 12.5%; -} - -.gallery-columns-9 .gallery-item { - max-width: 11.11%; -} - -.gallery .gallery-caption { - color: #707070; - display: block; - font-family: "Noto Sans", sans-serif; - font-size: 14px; - line-height: 1.5; - padding: 7px 0; -} - -.gallery-columns-6 .gallery-caption, -.gallery-columns-7 .gallery-caption, -.gallery-columns-8 .gallery-caption, -.gallery-columns-9 .gallery-caption { - display: none; -} - - -/** - * 7.0 Audio / Video - */ - -.mce-content-body .wpview-wrap { - margin-bottom: 32px; -} - -.mce-content-body .wp-audio-playlist { - margin: 0; -} - - -/** - * 8.0 RTL - */ - -body.rtl { - font-family: Arial, Tahoma, sans-serif; -} - -.rtl blockquote { - border-left: none; - border-right: 4px solid #707070; - margin: 0 -21px 35px 0; - padding-left: 0; - padding-right: 17px; -} - -.rtl blockquote > blockquote { - margin-left: auto; - margin-right: 0; -} - -.rtl li > ul, -.rtl li > ol { - margin: 0 23px 0 0; -} - -.rtl table th, -.rtl table caption { - text-align: right; -} diff --git a/wp/wp-content/themes/twentyfifteen/css/ie.css b/wp/wp-content/themes/twentyfifteen/css/ie.css deleted file mode 100644 index 53de092d..00000000 --- a/wp/wp-content/themes/twentyfifteen/css/ie.css +++ /dev/null @@ -1,948 +0,0 @@ -/* -Theme Name: Twenty Fifteen -Description: Global Styles for older IE versions (previous to IE9). -*/ - -body, -button, -input, -select, -textarea { - font-size: 19px; - line-height: 1.6842; -} - -button, -input { - line-height: normal; -} - -p, -address, -pre, -hr, -ul, -ol, -dl, -dd, -table { - margin-bottom: 1.6842em; -} - -ul, -ol { - margin-left: 0; -} - -li > ul, -li > ol, -blockquote > ul, -blockquote > ol { - margin-left: 1.3333em; -} - -blockquote { - border-color: inherit; - border-style: solid; - border-width: 0 0 0 4px; - font-size: 22px; - line-height: 1.8182; - margin-bottom: 1.8182em; - margin-left: -1.0909em; - padding-left: 0.9091em; -} - -blockquote > blockquote { - margin-left: 0; -} - -blockquote p { - margin-bottom: 1.8182em; -} - -blockquote cite, -blockquote small { - font-size: 19px; - line-height: 1.6842; -} - -pre { - line-height: 1.2632; -} - -.entry-content img, -.entry-summary img, -.page-content img, -.comment-content img, -.widget img { - max-width: 660px; -} - -img.size-full, -img.size-large, -img.header-image, -img.wp-post-image, -img[class*="align"], -img[class*="wp-image-"], -img[class*="attachment-"] { - height: auto; - width: auto; /* Prevent stretching of full-size and large-size images with height and width attributes in IE8 */ -} - -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -.post-password-form input[type="submit"], -.widecolumn #submit, -.widecolumn .mu_register input[type="submit"] { - font-size: 16px; - padding: 0.8125em 1.625em; -} - -input[type="text"], -input[type="email"], -input[type="url"], -input[type="password"], -input[type="search"], -textarea { - padding: 0.5278em; -} - -.main-navigation { - font-size: 16px; - line-height: 1.5; - margin: 9.0909%; -} - -.main-navigation ul ul { - border-bottom: 0; - border-top: 0; - margin-left: 1em; -} - -.main-navigation a { - padding: 0.75em 0; -} - -.main-navigation .menu-item-has-children > a { - padding-right: 48px; -} - -.main-navigation .menu-item-description { - font-size: 13px; - line-height: 1.8462; - margin-top: 0; -} - -.social-navigation { - margin: 9.0909%; - max-width: 660px; - padding-top: 0; -} - -.social-navigation ul { - margin-bottom: -1.2632em; -} - -.social-navigation a { - width: 2.5263em; - height: 2.5263em; -} - -.secondary-toggle { - margin-top: -32px; - right: 7.6897%; - width: 64px; - height: 64px; -} - -.secondary-toggle:before { - line-height: 64px; -} - -.post-password-form label, -.post-navigation .meta-nav, -.comment-navigation, -.image-navigation, -.author-heading, -.author-bio, -.entry-footer, -.page-links a, -.page-links span, -.comment-metadata, -.pingback .edit-link, -.comment-list .reply, -.comment-notes, -.comment-awaiting-moderation, -.logged-in-as, -.comment-form label, -.form-allowed-tags, -.site-info, -.wp-caption-text, -.gallery-caption, -.entry-caption, -.widecolumn label, -.widecolumn .mu_register label { - font-size: 16px; -} - -.post-navigation .post-title { - font-size: 24px; - line-height: 1.1667; -} - -.pagination .nav-links { - min-height: 3.3684em; -} - -.pagination .page-numbers { - line-height: 3.3684em; - padding: 0 0.8421em; -} - -.pagination .prev, -.pagination .next { - padding: 0; - width: 64px; - height: 64px; -} - -.pagination .prev:before, -.pagination .next:before { - line-height: 64px; - width: 64px; - height: 64px; -} - -.image-navigation a { - display: block; - margin-bottom: 2em; -} - -.image-navigation .nav-previous, -.comment-navigation .nav-previous { - float: left; - width: 50%; -} -.image-navigation .nav-next, -.comment-navigation .nav-next { - float: right; - text-align: right; - width: 50%; -} - -.image-navigation .nav-previous a:before, -.image-navigation .nav-next a:after, -.comment-navigation .nav-previous a:before, -.comment-navigation .nav-next a:after { - font-size: 24px; - top: -1px; -} - -blockquote.alignleft, -.wp-caption.alignleft, -img.alignleft { - margin: 0.4211em 1.6842em 1.6842em 0; -} - -blockquote.alignright, -.wp-caption.alignright, -img.alignright { - margin: 0.4211em 0 1.6842em 1.6842em; -} - -blockquote.aligncenter, -.wp-caption.aligncenter, -img.aligncenter { - margin-top: 0.4211em; - margin-bottom: 1.6842em; -} - -.site-header { - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - padding: 0; -} - -.secondary { - background-color: #fff; - margin: 0 auto; - max-width: 807px; - padding: 0; -} - -.site-main { - padding: 7.6923% 0; -} - -.site-content { - margin: 0 auto; - max-width: 954px; -} - -.site-branding { - background-color: inherit; - margin: 0 auto; - max-width: 954px; - padding: 0; -} - -.site-title { - font-size: 32px; - line-height: 1.25; - margin: 7.6897% 7.6897% 0; -} - -.site-description { - background-color: inherit; - display: block; - filter: alpha(opacity=70); - font-size: 16px; - margin: 0.5em 7.6897% 7.6897%; -} - -.sidebar { - position: static !important; -} - -.widget-area { - clear: both; - margin: 9.0909% 9.0909% 0; - max-width: 660px; -} - -.widget { - font-size: 16px; - margin: 0 0 11.1111%; -} - -.widget p, -.widget address, -.widget hr, -.widget ul, -.widget ol, -.widget dl, -.widget dd, -.widget table, -.widget pre { - margin-bottom: 1.5em; -} - -.widget li > ul, -.widget li > ol { - margin-bottom: 0; -} - -.widget blockquote { - font-size: 19px; - line-height: 1.6842; - margin-bottom: 1.6842em; - margin-left: -1.2632em; - padding-left: 1.0526em; -} - -.widget blockquote > blockquote { - margin-left: 0; -} - -.widget blockquote p { - margin-bottom: 1.6842em; -} - -.widget blockquote cite, -.widget blockquote small { - font-size: 16px; - line-height: 1.5; -} - -.widget pre { - line-height: 1.5; - padding: 0.75em; -} - -.widget button, -.widget input, -.widget select, -.widget textarea { - line-height: 1.5; -} - -.widget button, -.widget input { - line-height: normal; -} - -.widget button, -.widget input[type="button"], -.widget input[type="reset"], -.widget input[type="submit"] { - font-size: 16px; - padding: 0.8125em 1.625em; -} - -.widget input[type="text"], -.widget input[type="email"], -.widget input[type="url"], -.widget input[type="password"], -.widget input[type="search"], -.widget textarea { - padding: 0.75em; -} - -.widget-title { - margin: 0 0 1.5em; -} - -.widget_calendar td, -.widget_calendar th { - line-height: 2.9375; -} - -.widget_calendar caption { - margin: 0 0 1.5em; -} - -.widget_archive li, -.widget_categories li, -.widget_links li, -.widget_meta li, -.widget_nav_menu li, -.widget_pages li, -.widget_recent_comments li, -.widget_recent_entries li { - padding: 0.7188em 0; -} - -.widget_categories .children, -.widget_nav_menu .sub-menu, -.widget_pages .children { - margin: 0.7188em 0 0 1em; - padding-top: 0.7188em; -} - -.widget_rss li { - margin-bottom: 1.5em; -} - -.widget_rss .rss-date, -.widget_rss cite { - font-size: 13px; - line-height: 1.8462; -} - -.widget .wp-caption-text, -.widget .gallery-caption { - line-height: 1.5; - padding: 0.5em 0; -} - -.hentry, -.page-header, -.page-content { - margin: 0 7.6923%; -} - -.hentry + .hentry, -.page-header + .hentry, -.page-header + .page-content { - margin-top: 7.6923%; -} - -.post-thumbnail { - margin-bottom: 2.9474em; -} - -.entry-header { - padding: 0 9.0909%; -} - -.entry-title, -.widecolumn h2 { - font-size: 39px; - line-height: 1.2308; - margin-bottom: 1.2308em; -} - -.entry-content, -.entry-summary { - padding: 0 9.0909% 9.0909%; -} - -.entry-content h1, -.entry-summary h1, -.page-content h1, -.comment-content h1 { - font-size: 39px; - line-height: 1.2308; - margin-top: 1.641em; - margin-bottom: 0.8205em; -} - -.entry-content h2, -.entry-summary h2, -.page-content h2, -.comment-content h2 { - font-size: 32px; - line-height: 1.25; - margin-top: 2em; - margin-bottom: 1em; -} - -.entry-content h3, -.entry-summary h3, -.page-content h3, -.comment-content h3 { - font-size: 27px; - line-height: 1.1852; - margin-top: 2.3704em; - margin-bottom: 1.1852em; -} - -.entry-content h4, -.entry-summary h4, -.page-content h4, -.comment-content h4 { - font-size: 22px; - line-height: 1.4545; - margin-top: 2.9091em; - margin-bottom: 1.4545em; -} - -.entry-content h5, -.entry-content h6, -.entry-summary h5, -.entry-summary h6, -.page-content h5, -.page-content h6, -.comment-content h5, -.comment-content h6 { - font-size: 19px; - line-height: 1.2632; - margin-top: 3.3684em; - margin-bottom: 1.6842em; -} - -.entry-content .more-link:after { - font-size: 24px; - top: 3px; -} - -.author-info { - margin: 0 9.0909%; - padding: 9.0909% 0; -} - -.author-info .avatar { - margin: 0 1.6842em 1.6842em 0; - width: 56px; - height: 56px; -} - -.author-link:after { - font-size: 24px; - top: 0; -} - -.entry-footer { - padding: 4.5454% 9.0909%; -} - -.posted-on:before, -.byline:before, -.cat-links:before, -.tags-links:before, -.comments-link:before, -.entry-format:before, -.edit-link:before, -.full-size-link:before { - top: 4px; -} - -.updated { - display: none; -} - -.updated.published { - display: inline; -} - -.page-header { - border-color: inherit; - border-style: solid; - border-width: 0 0 0 7px; - padding: 3.8461% 7.6923%; -} - -.page-title, -.taxonomy-description { - margin-left: -7px; -} - -.taxonomy-description { - padding-top: 0.4211em; -} - -.page-title, -.comments-title, -.comment-reply-title, -.post-navigation .post-title { - font-size: 27px; - line-height: 1.1852; -} - -.page-content { - padding: 7.6923%; -} - -.page-links { - margin-bottom: 1.4736em; -} - -.page-links a, -.page-links > span { - margin: 0 0.25em 0.25em 0; -} - -.format-aside .entry-title, -.format-image .entry-title, -.format-video .entry-title, -.format-quote .entry-title, -.format-gallery .entry-title, -.format-status .entry-title, -.format-link .entry-title, -.format-audio .entry-title, -.format-chat .entry-title { - font-size: 22px; - line-height: 1.4545; - margin-bottom: 32px; -} - -.format-link .entry-title a:after { - top: 0.125em; -} - -.comments-title { - margin-bottom: 1.4545em; -} - -.comment-list article, -.comment-list .pingback, -.comment-list .trackback { - padding: 1.6842em 0; -} - -.comment-list + .comment-respond, -.comment-navigation + .comment-respond { - padding-top: 1.6842em; -} - -.comment-list .children > li { - padding-left: 1.4737em; -} - -.comment-meta { - position: relative; -} - -.comment-author { - margin-bottom: 0; - padding-left: 4.6315em; -} - -.comment-author .avatar { - margin: 0; - position: absolute; - top: 3px; - left: 0; - width: 56px; - height: 56px; -} - -.comment-metadata { - line-height: 2; - padding-left: 5.5em; -} - -.comment-metadata .edit-link:before, -.pingback .edit-link:before { - top: 8px; -} - -.bypostauthor > article .fn:after { - top: 8px; - left: 6px; -} - -.comment-content ul, -.comment-content ol { - margin: 0 0 1.6842em 0; -} - -.comment-content li > ul, -.comment-content li > ol, -.comment-content blockquote > ul, -.comment-content blockquote > ol { - margin-left: 1.3333em; -} - -.comment-list .reply a { - padding: 0.4375em 0.875em; -} - -.comment-form, -.no-comments { - padding-top: 1.6842em; -} - -.comment-reply-title small a:before { - top: -1px; -} - -.comment-list .reply { - margin-top: 0; -} - -.site-footer { - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - margin: 0 auto; - max-width: 806px; - padding: 0; -} - -.site-info { - margin: 4.5454% 9.0909%; -} - -.post-navigation { - border-top: 0; - margin: 7.6923% 7.6923% 0; -} - -.post-navigation a { - padding: 4.5454% 9.0909%; -} - -.pagination { - border-top: 0; - margin: 7.6923% 7.6923% 0; - padding: 0; -} - -.pagination .page-numbers { - display: inline-block; -} - -.pagination .meta-nav { - display: none; -} - -.image-navigation { - padding: 0 9.0909%; -} - -.comments-area { - border-top: 0; - margin: 7.6923% 7.6923% 0; -} - -embed, -iframe, -object, -video { - margin-bottom: 1.6842em; -} - -.wp-audio-shortcode, -.wp-video, -.wp-playlist.wp-audio-playlist { - font-size: 19px; - margin-bottom: 1.6842em; -} - -.wp-caption, -.gallery { - margin-bottom: 1.6842em; -} - -.wp-caption-text, -.gallery-caption { - padding: 0.5em 0; -} - -.widecolumn { - margin: 7.6923%; -} - -.widecolumn .mu_alert { - margin-bottom: 1.6842em; -} - -.widecolumn p { - margin: 1.6842em 0; -} - -.widecolumn p + h2 { - margin-top: 1.641em; -} - -.widecolumn #key, -.widecolumn .mu_register #blog_title, -.widecolumn .mu_register #user_email, -.widecolumn .mu_register #blogname, -.widecolumn .mu_register #user_name { - font-size: 19px; -} - -.widecolumn .mu_register #blog_title, -.widecolumn .mu_register #user_email, -.widecolumn .mu_register #user_name { - margin: 0 0 0.421em; -} - - -/** - * RTL - */ - -.rtl ul, -.rtl ol { - margin-right: 0; - margin-left: auto; -} - -.rtl li > ul, -.rtl li > ol, -.rtl blockquote > ul, -.rtl blockquote > ol { - margin-right: 1.3333em; - margin-left: auto; -} - -.rtl blockquote { - border-width: 0 4px 0 0; - margin-right: -1.0909em; - margin-left: auto; - padding-right: 0.9091em; - padding-left: 0; -} - -.rtl blockquote > blockquote { - margin-right: 0; - margin-left: auto; -} - -.rtl .main-navigation ul ul { - margin-right: 1em; - margin-left: auto; -} - -.rtl .main-navigation .menu-item-has-children > a { - padding-right: 0; - padding-left: 48px; -} - -.rtl .secondary-toggle { - right: auto; - left: 7.6897%; -} - -.rtl .image-navigation .nav-previous, -.rtl .comment-navigation .nav-previous { - float: right; -} - -.rtl .image-navigation .nav-next, -.rtl .comment-navigation .nav-next { - float: left; - text-align: left; -} - -.rtl blockquote.alignright, -.rtl .wp-caption.alignright -.rtl img.alignright { - margin: 0.4211em 0 1.6842em 1.6842em; -} - -.rtl blockquote.alignleft, -.rtl .wp-caption.alignleft, -.rtl img.alignleft { - margin: 0.4211em 1.6842em 1.6842em 0; -} - -.rtl .widget blockquote { - margin-right: -1.2632em; - margin-left: auto; - padding-right: 1.0526em; - padding-left: 0; -} - -.rtl .widget blockquote > blockquote { - margin-right: 0; - margin-left: auto; -} - -.rtl .widget_categories .children, -.rtl .widget_nav_menu .sub-menu, -.rtl .widget_pages .children { - margin: 0.7188em 1em 0 0; -} - -.rtl .page-links a, -.rtl .page-links > span { - margin: 0 0 0.25em 0.25em; -} - -.rtl .author-info .avatar { - margin: 0 0 1.6842em 1.6842em; -} - -.rtl .page-header { - border-width: 0 7px 0 0; -} - -.rtl .page-title, -.rtl .taxonomy-description { - margin-right: -7px; - margin-left: auto; -} - -.rtl .comment-list .children > li { - padding-right: 1.4737em; - padding-left: 0; -} - -.rtl .comment-author { - padding-right: 4.6315em; - padding-left: 0; -} - -.rtl .comment-author .avatar { - right: 0; - left: auto; -} - -.rtl .comment-content ul, -.rtl .comment-content ol { - margin-right: 0; - margin-left: auto; -} - -.rtl .comment-content li > ul, -.rtl .comment-content li > ol, -.rtl .comment-content blockquote > ul, -.rtl .comment-content blockquote > ol { - margin-right: 1.3333em; - margin-left: auto; -} - -.rtl .comment-metadata { - padding-right: 5.5em; - padding-left: 0; -} - -.rtl .bypostauthor > article .fn:after { - right: 6px; - left: auto; -} diff --git a/wp/wp-content/themes/twentyfifteen/css/ie7.css b/wp/wp-content/themes/twentyfifteen/css/ie7.css deleted file mode 100644 index 6f8cd43b..00000000 --- a/wp/wp-content/themes/twentyfifteen/css/ie7.css +++ /dev/null @@ -1,89 +0,0 @@ -/* -Theme Name: Twenty Fifteen -Description: IE7 specific style. -*/ - -.screen-reader-text { - clip: rect(1px 1px 1px 1px); -} - -.secondary-toggle { - color: #333; - font-size: 16px; - line-height: 60px; - width: auto; -} - -.pagination .prev, -.pagination .next { - font-size: 16px; - font-weight: 700; - line-height: 64px; - padding: 0 19px; - width: auto; -} - -.image-navigation, -.comment-navigation { - width: 662px; -} - -.post-navigation { - text-align: left; -} - -.site-main { - text-align: center; -} - -.hentry { - margin-bottom: 7.6923%; - text-align: left; - width: 808px; -} - -.page-header { - margin-bottom: 7.6923%; - text-align: left; -} - -.comments-area { - text-align: left; -} - -.comment-list, -.comment-navigation { - margin-bottom: 1.6471em; -} - -.gallery-columns-2 .gallery-item { - max-width: 48%; -} - -.gallery-columns-3 .gallery-item { - max-width: 31%; -} - -.gallery-columns-4 .gallery-item { - max-width: 22%; -} - -.gallery-columns-5 .gallery-item { - max-width: 17%; -} - -.gallery-columns-6 .gallery-item { - max-width: 13.5%; -} - -.gallery-columns-7 .gallery-item { - max-width: 11%; -} - -.gallery-columns-8 .gallery-item { - max-width: 9.5%; -} - -.gallery-columns-9 .gallery-item { - max-width: 8%; -} diff --git a/wp/wp-content/themes/twentyfifteen/footer.php b/wp/wp-content/themes/twentyfifteen/footer.php deleted file mode 100644 index e57b5f58..00000000 --- a/wp/wp-content/themes/twentyfifteen/footer.php +++ /dev/null @@ -1,34 +0,0 @@ - - - - -
    -
    - - -
    -
    - - - - - - - diff --git a/wp/wp-content/themes/twentyfifteen/functions.php b/wp/wp-content/themes/twentyfifteen/functions.php deleted file mode 100644 index 8ae7e1da..00000000 --- a/wp/wp-content/themes/twentyfifteen/functions.php +++ /dev/null @@ -1,407 +0,0 @@ - tag in the document head, and expect WordPress to - * provide it for us. - */ - add_theme_support( 'title-tag' ); - - /* - * Enable support for Post Thumbnails on posts and pages. - * - * See: https://codex.wordpress.org/Function_Reference/add_theme_support#Post_Thumbnails - */ - add_theme_support( 'post-thumbnails' ); - set_post_thumbnail_size( 825, 510, true ); - - // This theme uses wp_nav_menu() in two locations. - register_nav_menus( array( - 'primary' => __( 'Primary Menu', 'twentyfifteen' ), - 'social' => __( 'Social Links Menu', 'twentyfifteen' ), - ) ); - - /* - * Switch default core markup for search form, comment form, and comments - * to output valid HTML5. - */ - add_theme_support( 'html5', array( - 'search-form', 'comment-form', 'comment-list', 'gallery', 'caption' - ) ); - - /* - * Enable support for Post Formats. - * - * See: https://codex.wordpress.org/Post_Formats - */ - add_theme_support( 'post-formats', array( - 'aside', 'image', 'video', 'quote', 'link', 'gallery', 'status', 'audio', 'chat' - ) ); - - /* - * Enable support for custom logo. - * - * @since Twenty Fifteen 1.5 - */ - add_theme_support( 'custom-logo', array( - 'height' => 248, - 'width' => 248, - 'flex-height' => true, - ) ); - - $color_scheme = twentyfifteen_get_color_scheme(); - $default_color = trim( $color_scheme[0], '#' ); - - // Setup the WordPress core custom background feature. - - /** - * Filter Twenty Fifteen custom-header support arguments. - * - * @since Twenty Fifteen 1.0 - * - * @param array $args { - * An array of custom-header support arguments. - * - * @type string $default-color Default color of the header. - * @type string $default-attachment Default attachment of the header. - * } - */ - add_theme_support( 'custom-background', apply_filters( 'twentyfifteen_custom_background_args', array( - 'default-color' => $default_color, - 'default-attachment' => 'fixed', - ) ) ); - - /* - * This theme styles the visual editor to resemble the theme style, - * specifically font, colors, icons, and column width. - */ - add_editor_style( array( 'css/editor-style.css', 'genericons/genericons.css', twentyfifteen_fonts_url() ) ); - - // Indicate widget sidebars can use selective refresh in the Customizer. - add_theme_support( 'customize-selective-refresh-widgets' ); -} -endif; // twentyfifteen_setup -add_action( 'after_setup_theme', 'twentyfifteen_setup' ); - -/** - * Register widget area. - * - * @since Twenty Fifteen 1.0 - * - * @link https://codex.wordpress.org/Function_Reference/register_sidebar - */ -function twentyfifteen_widgets_init() { - register_sidebar( array( - 'name' => __( 'Widget Area', 'twentyfifteen' ), - 'id' => 'sidebar-1', - 'description' => __( 'Add widgets here to appear in your sidebar.', 'twentyfifteen' ), - 'before_widget' => '', - 'before_title' => '

    ', - 'after_title' => '

    ', - ) ); -} -add_action( 'widgets_init', 'twentyfifteen_widgets_init' ); - -if ( ! function_exists( 'twentyfifteen_fonts_url' ) ) : -/** - * Register Google fonts for Twenty Fifteen. - * - * @since Twenty Fifteen 1.0 - * - * @return string Google fonts URL for the theme. - */ -function twentyfifteen_fonts_url() { - $fonts_url = ''; - $fonts = array(); - $subsets = 'latin,latin-ext'; - - /* - * Translators: If there are characters in your language that are not supported - * by Noto Sans, translate this to 'off'. Do not translate into your own language. - */ - if ( 'off' !== _x( 'on', 'Noto Sans font: on or off', 'twentyfifteen' ) ) { - $fonts[] = 'Noto Sans:400italic,700italic,400,700'; - } - - /* - * Translators: If there are characters in your language that are not supported - * by Noto Serif, translate this to 'off'. Do not translate into your own language. - */ - if ( 'off' !== _x( 'on', 'Noto Serif font: on or off', 'twentyfifteen' ) ) { - $fonts[] = 'Noto Serif:400italic,700italic,400,700'; - } - - /* - * Translators: If there are characters in your language that are not supported - * by Inconsolata, translate this to 'off'. Do not translate into your own language. - */ - if ( 'off' !== _x( 'on', 'Inconsolata font: on or off', 'twentyfifteen' ) ) { - $fonts[] = 'Inconsolata:400,700'; - } - - /* - * Translators: To add an additional character subset specific to your language, - * translate this to 'greek', 'cyrillic', 'devanagari' or 'vietnamese'. Do not translate into your own language. - */ - $subset = _x( 'no-subset', 'Add new subset (greek, cyrillic, devanagari, vietnamese)', 'twentyfifteen' ); - - if ( 'cyrillic' == $subset ) { - $subsets .= ',cyrillic,cyrillic-ext'; - } elseif ( 'greek' == $subset ) { - $subsets .= ',greek,greek-ext'; - } elseif ( 'devanagari' == $subset ) { - $subsets .= ',devanagari'; - } elseif ( 'vietnamese' == $subset ) { - $subsets .= ',vietnamese'; - } - - if ( $fonts ) { - $fonts_url = add_query_arg( array( - 'family' => urlencode( implode( '|', $fonts ) ), - 'subset' => urlencode( $subsets ), - ), 'https://fonts.googleapis.com/css' ); - } - - return $fonts_url; -} -endif; - -/** - * JavaScript Detection. - * - * Adds a `js` class to the root `` element when JavaScript is detected. - * - * @since Twenty Fifteen 1.1 - */ -function twentyfifteen_javascript_detection() { - echo "\n"; -} -add_action( 'wp_head', 'twentyfifteen_javascript_detection', 0 ); - -/** - * Enqueue scripts and styles. - * - * @since Twenty Fifteen 1.0 - */ -function twentyfifteen_scripts() { - // Add custom fonts, used in the main stylesheet. - wp_enqueue_style( 'twentyfifteen-fonts', twentyfifteen_fonts_url(), array(), null ); - - // Add Genericons, used in the main stylesheet. - wp_enqueue_style( 'genericons', get_template_directory_uri() . '/genericons/genericons.css', array(), '3.2' ); - - // Load our main stylesheet. - wp_enqueue_style( 'twentyfifteen-style', get_stylesheet_uri() ); - - // Load the Internet Explorer specific stylesheet. - wp_enqueue_style( 'twentyfifteen-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentyfifteen-style' ), '20141010' ); - wp_style_add_data( 'twentyfifteen-ie', 'conditional', 'lt IE 9' ); - - // Load the Internet Explorer 7 specific stylesheet. - wp_enqueue_style( 'twentyfifteen-ie7', get_template_directory_uri() . '/css/ie7.css', array( 'twentyfifteen-style' ), '20141010' ); - wp_style_add_data( 'twentyfifteen-ie7', 'conditional', 'lt IE 8' ); - - wp_enqueue_script( 'twentyfifteen-skip-link-focus-fix', get_template_directory_uri() . '/js/skip-link-focus-fix.js', array(), '20141010', true ); - - if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) { - wp_enqueue_script( 'comment-reply' ); - } - - if ( is_singular() && wp_attachment_is_image() ) { - wp_enqueue_script( 'twentyfifteen-keyboard-image-navigation', get_template_directory_uri() . '/js/keyboard-image-navigation.js', array( 'jquery' ), '20141010' ); - } - - wp_enqueue_script( 'twentyfifteen-script', get_template_directory_uri() . '/js/functions.js', array( 'jquery' ), '20150330', true ); - wp_localize_script( 'twentyfifteen-script', 'screenReaderText', array( - 'expand' => '' . __( 'expand child menu', 'twentyfifteen' ) . '', - 'collapse' => '' . __( 'collapse child menu', 'twentyfifteen' ) . '', - ) ); -} -add_action( 'wp_enqueue_scripts', 'twentyfifteen_scripts' ); - -/** - * Add preconnect for Google Fonts. - * - * @since Twenty Fifteen 1.7 - * - * @param array $urls URLs to print for resource hints. - * @param string $relation_type The relation type the URLs are printed. - * @return array URLs to print for resource hints. - */ -function twentyfifteen_resource_hints( $urls, $relation_type ) { - if ( wp_style_is( 'twentyfifteen-fonts', 'queue' ) && 'preconnect' === $relation_type ) { - if ( version_compare( $GLOBALS['wp_version'], '4.7-alpha', '>=' ) ) { - $urls[] = array( - 'href' => 'https://fonts.gstatic.com', - 'crossorigin', - ); - } else { - $urls[] = 'https://fonts.gstatic.com'; - } - } - - return $urls; -} -add_filter( 'wp_resource_hints', 'twentyfifteen_resource_hints', 10, 2 ); - -/** - * Add featured image as background image to post navigation elements. - * - * @since Twenty Fifteen 1.0 - * - * @see wp_add_inline_style() - */ -function twentyfifteen_post_nav_background() { - if ( ! is_single() ) { - return; - } - - $previous = ( is_attachment() ) ? get_post( get_post()->post_parent ) : get_adjacent_post( false, '', true ); - $next = get_adjacent_post( false, '', false ); - $css = ''; - - if ( is_attachment() && 'attachment' == $previous->post_type ) { - return; - } - - if ( $previous && has_post_thumbnail( $previous->ID ) ) { - $prevthumb = wp_get_attachment_image_src( get_post_thumbnail_id( $previous->ID ), 'post-thumbnail' ); - $css .= ' - .post-navigation .nav-previous { background-image: url(' . esc_url( $prevthumb[0] ) . '); } - .post-navigation .nav-previous .post-title, .post-navigation .nav-previous a:hover .post-title, .post-navigation .nav-previous .meta-nav { color: #fff; } - .post-navigation .nav-previous a:before { background-color: rgba(0, 0, 0, 0.4); } - '; - } - - if ( $next && has_post_thumbnail( $next->ID ) ) { - $nextthumb = wp_get_attachment_image_src( get_post_thumbnail_id( $next->ID ), 'post-thumbnail' ); - $css .= ' - .post-navigation .nav-next { background-image: url(' . esc_url( $nextthumb[0] ) . '); border-top: 0; } - .post-navigation .nav-next .post-title, .post-navigation .nav-next a:hover .post-title, .post-navigation .nav-next .meta-nav { color: #fff; } - .post-navigation .nav-next a:before { background-color: rgba(0, 0, 0, 0.4); } - '; - } - - wp_add_inline_style( 'twentyfifteen-style', $css ); -} -add_action( 'wp_enqueue_scripts', 'twentyfifteen_post_nav_background' ); - -/** - * Display descriptions in main navigation. - * - * @since Twenty Fifteen 1.0 - * - * @param string $item_output The menu item output. - * @param WP_Post $item Menu item object. - * @param int $depth Depth of the menu. - * @param array $args wp_nav_menu() arguments. - * @return string Menu item with possible description. - */ -function twentyfifteen_nav_description( $item_output, $item, $depth, $args ) { - if ( 'primary' == $args->theme_location && $item->description ) { - $item_output = str_replace( $args->link_after . '', '' . $args->link_after . '', $item_output ); - } - - return $item_output; -} -add_filter( 'walker_nav_menu_start_el', 'twentyfifteen_nav_description', 10, 4 ); - -/** - * Add a `screen-reader-text` class to the search form's submit button. - * - * @since Twenty Fifteen 1.0 - * - * @param string $html Search form HTML. - * @return string Modified search form HTML. - */ -function twentyfifteen_search_form_modify( $html ) { - return str_replace( 'class="search-submit"', 'class="search-submit screen-reader-text"', $html ); -} -add_filter( 'get_search_form', 'twentyfifteen_search_form_modify' ); - -/** - * Implement the Custom Header feature. - * - * @since Twenty Fifteen 1.0 - */ -require get_template_directory() . '/inc/custom-header.php'; - -/** - * Custom template tags for this theme. - * - * @since Twenty Fifteen 1.0 - */ -require get_template_directory() . '/inc/template-tags.php'; - -/** - * Customizer additions. - * - * @since Twenty Fifteen 1.0 - */ -require get_template_directory() . '/inc/customizer.php'; diff --git a/wp/wp-content/themes/twentyfifteen/genericons/COPYING.txt b/wp/wp-content/themes/twentyfifteen/genericons/COPYING.txt deleted file mode 100644 index aece214b..00000000 --- a/wp/wp-content/themes/twentyfifteen/genericons/COPYING.txt +++ /dev/null @@ -1,9 +0,0 @@ -Genericons is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - -The fonts are distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. - -This license does not convey any intellectual property rights to third party trademarks that may be included in the icon font; such marks remain subject to all rights and guidelines of use of their owner. \ No newline at end of file diff --git a/wp/wp-content/themes/twentyfifteen/genericons/Genericons.eot b/wp/wp-content/themes/twentyfifteen/genericons/Genericons.eot deleted file mode 100644 index b5f8647f7c2adecb0a111764ba6ef53d9a412a18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22760 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 - - - - -Created by FontForge 20120731 at Fri Oct 3 09:39:07 2014 - By Joen -Created by Joen with FontForge 2.0 (http://fontforge.sf.net) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/wp/wp-content/themes/twentyfifteen/genericons/Genericons.ttf b/wp/wp-content/themes/twentyfifteen/genericons/Genericons.ttf deleted file mode 100644 index 1f160ddbc064ae866a5eb1e1f4bbbd6cbd69335a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22576 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 diff --git a/wp/wp-content/themes/twentyfifteen/genericons/Genericons.woff b/wp/wp-content/themes/twentyfifteen/genericons/Genericons.woff deleted file mode 100644 index 973e0339384a3014b00aec3d4b107bbf3c5f9539..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14360 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 CL*wuO diff --git a/wp/wp-content/themes/twentyfifteen/genericons/LICENSE.txt b/wp/wp-content/themes/twentyfifteen/genericons/LICENSE.txt deleted file mode 100644 index d159169d..00000000 --- a/wp/wp-content/themes/twentyfifteen/genericons/LICENSE.txt +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - 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 Lesser 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 - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/wp/wp-content/themes/twentyfifteen/genericons/README.md b/wp/wp-content/themes/twentyfifteen/genericons/README.md deleted file mode 100644 index faf8f609..00000000 --- a/wp/wp-content/themes/twentyfifteen/genericons/README.md +++ /dev/null @@ -1,152 +0,0 @@ -## Genericons - -Genericons are vector icons embedded in a webfont designed to be clean and simple keeping with a generic aesthetic. - -Use genericons for instant HiDPI, to change icon colors on the fly, or even with CSS effects such as drop-shadows or gradients! - - -### Usage - -To use it, place the `font` folder in your stylesheet directory and enqueue the genericons.css file. Now you can create an icon like this: - -``` -.my-icon:before { - content: '\f101'; - font: normal 16px/1 'Genericons'; - display: inline-block; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -``` - -This will output a comment icon before every element with the class "my-icon". The `content: '\f101';` part of this CSS is easily copied from the helper tool at http://genericons.com/, or `example.html` in the `font` directory. - -You can also use the bundled example.css if you'd rather insert the icons using HTML tags. - - -### Notes - -**Photoshop mockups** - -The `Genericons.ttf` file found in the `font` directory can be placed in your system fonts folder and used Photoshop or other graphics apps if you like. - -If you're using Genericons in your Photoshop mockups, please remember to delete the old version of the font from Font Book, and grab the new one from the zip file. This also affects using it in your webdesigns: if you have an old version of the font installed locally, that's the font that'll be used in your website as well, so if you're missing icons, check for old versions of the font on your system. - -**Pixel grid** - -Genericons has been designed for a 16x16px grid. That means it'll look sharp at font-size: 16px exactly. It'll also be crisp at multiples thereof, such as 32px or 64px. It'll look reasonably crisp at in-between font sizes such as 24px or 48px, but not quite as crisp as 16 or 32. Please don't set the font-size to 17px, though, that'll just look terrible blurry. - -**Antialiasing** - -If you keep intact the `-webkit-font-smoothing: antialiased;` and `-moz-osx-font-smoothing: grayscale;` CSS properties. That'll make the icons look their best possible, in Firefox and WebKit based browsers. - -**optimizeLegibility** - -Note: On Android browsers with version 4.2, 4.3, and probably later, Genericons will simply not show up if you're using the CSS property "text-rendering" set to "optimizeLegibility. - -**Updates** - -We don't often update icons, but do very carefully when we get good feedback suggesting improvements. Please be mindful if you upgrade, and check that the updated icons behave as you intended. - - -### Changelog - -**3.2** - -A number of new icons and a couple of quick updates. - -* New: Activity -* New: HTML anchor -* New: Bug -* New: Download -* New: Handset -* New: Microphone -* New: Minus -* New: Plus -* New: Move -* New: Rating stars, empty, half, full -* New: Shuffle -* New: video camera -* New: Spotify -* New: Twitch -* Update: Fixed geometry in Edit icon -* Update: Updated Foursquare icon - -Twitch and Spotify mark the last social icons that will be added to Genericons. -Future social icons will have to happen in a separate font. - -**3.1** - -Genericons is now generated using a commandline tool called FontCustom. This makes it far easier to add new icons to the font, but the switch means the download zip now has a different layout, fonts have different filenames, there's now no .otf font included (but the .ttf should suffice), and the font now has slightly different metrics. I've taken great care to ensure this new version should work as a drop-in replacement, but please be mindful and test carefully if you choose to upgrade. - -* Per feedback, the baked-in 16px width and height has been removed from the helper CSS. It wasn't really necessary (the glyph itself has these dimensions naturally), and it caused some headaches. -* Base64 encoding is now included by default in the helper CSS. This makes it drop-in easy to get Genericons working in Firefox even when using a CDN. -* Title attribute on website tool. -* New: Website. -* New: Ellipsis. -* New: Foursquare. -* New: X-post. -* New: Sitemap. -* New: Hierarchy. -* New: Paintbrush. -* Updated: Show and Hide icons were updated for clarity. - -**3.0.3** - -Bunch of updates mostly. - -* Two new icons, Dropbox and Fullscreen. -* Updates to all icons containing an exclamation mark. -* Updates to Image and Quote. -* Nicer "Share" icon. -* Bigger default Linkedin icon. - -**3.0.2** - -A slew of new stuff and updates. - -* Social icons: Skype, Digg, Reddit, Stumbleupon, Pocket. -* New generic icons: heart, lock and print. -* New editing icons: code, bold, italic, image -* New interaction icons: subscribe, unsubscribe, subscribed, reply all, reply, flag. -* The hyperlink icon has been updated to be clearer, chunkier. -* The "home" icon has been updated for style, size and clarity. -* The email icon has been updated for style and clarity, and to fit with the new subscribe icons. -* The document icon has been updated for style. -* The "pin" icon has been updated for style and clarity. -* The Twitter icon has been scaled down to fit with the other social icons. - -**3.0.1** - -Mostly maintenance. - -* Fixed an issue with the example page that showed an old "top" icon instead of the actual NEW "refresh" icon. -* Added inverse Google+ and Path. -* Replaced tabs with spaces in the helper CSS. -* Changed the Genericons.com copy/paste tool to serve span's instead of div's for casual icon insertion. It's being converted to "inline-block" anyway. - -**3.0** - -Mainly maintenance and a few new icons. - -* Fast forward, rewind, PollDaddy, Notice, Info, Help, Portfolio -* Updated the feed icon. It's a bit smaller now for consistency, the previous one was rather big. -* So, the previous version numbering, 2.09, wasn't very PHP version compare friendly. So from now on it'll be 3.0, 3.1 etc. Props Ipstenu. -* Genericons.com now has a mini release blog. -* The CSS has prettier formatting, props Konstantin Obenland. - -**2.09** - -Updated Facebook icon to new version. Updated Instagram logo to use new one-color version. Updated Google+ icon to use same radius as Instagram and Facebook. Added a bunch of new icons, cog, unapprove, cart, media player buttons, tablet, send to tablet. - -**2.06** - -Included Base64 encoded version. This is necessary for Genericons to work with CDNs in Firefox. Firefox blocks fonts linked from a different domain. A CDN (typically s.example.com) usually puts the font on a subdomain, and is hence blocked in Firefox. - -**2.05** - -Added a bunch of new icons, including upload to cloud, download to cloud, many more. - -**2.0** - -Initial public release diff --git a/wp/wp-content/themes/twentyfifteen/genericons/genericons.css b/wp/wp-content/themes/twentyfifteen/genericons/genericons.css deleted file mode 100644 index 36f02a34..00000000 --- a/wp/wp-content/themes/twentyfifteen/genericons/genericons.css +++ /dev/null @@ -1,209 +0,0 @@ -/** - - Genericons - -*/ - - -/* IE8 and below use EOT and allow cross-site embedding. - IE9 uses WOFF which is base64 encoded to allow cross-site embedding. - So unfortunately, IE9 will throw a console error, but it'll still work. - When the font is base64 encoded, cross-site embedding works in Firefox */ - -@font-face { - font-family: 'Genericons'; - src: url('Genericons.eot'); -} - -@font-face { - font-family: 'Genericons'; - src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'), - url('Genericons.ttf') format('truetype'), - url('Genericons.svg#genericonsregular') format('svg'); - font-weight: normal; - font-style: normal; -} - -@media screen and (-webkit-min-device-pixel-ratio:0) { - @font-face { - font-family: "Genericons"; - src: url("./Genericons.svg#Genericons") format("svg"); - } -} - - -/** - * All Genericons - */ - -.genericon { - font-size: 16px; - vertical-align: top; - text-align: center; - -moz-transition: color .1s ease-in 0; - -webkit-transition: color .1s ease-in 0; - display: inline-block; - font-family: "Genericons"; - font-style: normal; - font-weight: normal; - font-variant: normal; - line-height: 1; - text-decoration: inherit; - text-transform: none; - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - speak: none; -} - - -/** - * Individual icons - */ - -.genericon-404:before { content: "\f423"; } -.genericon-activity:before { content: "\f508"; } -.genericon-anchor:before { content: "\f509"; } -.genericon-aside:before { content: "\f101"; } -.genericon-attachment:before { content: "\f416"; } -.genericon-audio:before { content: "\f109"; } -.genericon-bold:before { content: "\f471"; } -.genericon-book:before { content: "\f444"; } -.genericon-bug:before { content: "\f50a"; } -.genericon-cart:before { content: "\f447"; } -.genericon-category:before { content: "\f301"; } -.genericon-chat:before { content: "\f108"; } -.genericon-checkmark:before { content: "\f418"; } -.genericon-close:before { content: "\f405"; } -.genericon-close-alt:before { content: "\f406"; } -.genericon-cloud:before { content: "\f426"; } -.genericon-cloud-download:before { content: "\f440"; } -.genericon-cloud-upload:before { content: "\f441"; } -.genericon-code:before { content: "\f462"; } -.genericon-codepen:before { content: "\f216"; } -.genericon-cog:before { content: "\f445"; } -.genericon-collapse:before { content: "\f432"; } -.genericon-comment:before { content: "\f300"; } -.genericon-day:before { content: "\f305"; } -.genericon-digg:before { content: "\f221"; } -.genericon-document:before { content: "\f443"; } -.genericon-dot:before { content: "\f428"; } -.genericon-downarrow:before { content: "\f502"; } -.genericon-download:before { content: "\f50b"; } -.genericon-draggable:before { content: "\f436"; } -.genericon-dribbble:before { content: "\f201"; } -.genericon-dropbox:before { content: "\f225"; } -.genericon-dropdown:before { content: "\f433"; } -.genericon-dropdown-left:before { content: "\f434"; } -.genericon-edit:before { content: "\f411"; } -.genericon-ellipsis:before { content: "\f476"; } -.genericon-expand:before { content: "\f431"; } -.genericon-external:before { content: "\f442"; } -.genericon-facebook:before { content: "\f203"; } -.genericon-facebook-alt:before { content: "\f204"; } -.genericon-fastforward:before { content: "\f458"; } -.genericon-feed:before { content: "\f413"; } -.genericon-flag:before { content: "\f468"; } -.genericon-flickr:before { content: "\f211"; } -.genericon-foursquare:before { content: "\f226"; } -.genericon-fullscreen:before { content: "\f474"; } -.genericon-gallery:before { content: "\f103"; } -.genericon-github:before { content: "\f200"; } -.genericon-googleplus:before { content: "\f206"; } -.genericon-googleplus-alt:before { content: "\f218"; } -.genericon-handset:before { content: "\f50c"; } -.genericon-heart:before { content: "\f461"; } -.genericon-help:before { content: "\f457"; } -.genericon-hide:before { content: "\f404"; } -.genericon-hierarchy:before { content: "\f505"; } -.genericon-home:before { content: "\f409"; } -.genericon-image:before { content: "\f102"; } -.genericon-info:before { content: "\f455"; } -.genericon-instagram:before { content: "\f215"; } -.genericon-italic:before { content: "\f472"; } -.genericon-key:before { content: "\f427"; } -.genericon-leftarrow:before { content: "\f503"; } -.genericon-link:before { content: "\f107"; } -.genericon-linkedin:before { content: "\f207"; } -.genericon-linkedin-alt:before { content: "\f208"; } -.genericon-location:before { content: "\f417"; } -.genericon-lock:before { content: "\f470"; } -.genericon-mail:before { content: "\f410"; } -.genericon-maximize:before { content: "\f422"; } -.genericon-menu:before { content: "\f419"; } -.genericon-microphone:before { content: "\f50d"; } -.genericon-minimize:before { content: "\f421"; } -.genericon-minus:before { content: "\f50e"; } -.genericon-month:before { content: "\f307"; } -.genericon-move:before { content: "\f50f"; } -.genericon-next:before { content: "\f429"; } -.genericon-notice:before { content: "\f456"; } -.genericon-paintbrush:before { content: "\f506"; } -.genericon-path:before { content: "\f219"; } -.genericon-pause:before { content: "\f448"; } -.genericon-phone:before { content: "\f437"; } -.genericon-picture:before { content: "\f473"; } -.genericon-pinned:before { content: "\f308"; } -.genericon-pinterest:before { content: "\f209"; } -.genericon-pinterest-alt:before { content: "\f210"; } -.genericon-play:before { content: "\f452"; } -.genericon-plugin:before { content: "\f439"; } -.genericon-plus:before { content: "\f510"; } -.genericon-pocket:before { content: "\f224"; } -.genericon-polldaddy:before { content: "\f217"; } -.genericon-portfolio:before { content: "\f460"; } -.genericon-previous:before { content: "\f430"; } -.genericon-print:before { content: "\f469"; } -.genericon-quote:before { content: "\f106"; } -.genericon-rating-empty:before { content: "\f511"; } -.genericon-rating-full:before { content: "\f512"; } -.genericon-rating-half:before { content: "\f513"; } -.genericon-reddit:before { content: "\f222"; } -.genericon-refresh:before { content: "\f420"; } -.genericon-reply:before { content: "\f412"; } -.genericon-reply-alt:before { content: "\f466"; } -.genericon-reply-single:before { content: "\f467"; } -.genericon-rewind:before { content: "\f459"; } -.genericon-rightarrow:before { content: "\f501"; } -.genericon-search:before { content: "\f400"; } -.genericon-send-to-phone:before { content: "\f438"; } -.genericon-send-to-tablet:before { content: "\f454"; } -.genericon-share:before { content: "\f415"; } -.genericon-show:before { content: "\f403"; } -.genericon-shuffle:before { content: "\f514"; } -.genericon-sitemap:before { content: "\f507"; } -.genericon-skip-ahead:before { content: "\f451"; } -.genericon-skip-back:before { content: "\f450"; } -.genericon-skype:before { content: "\f220"; } -.genericon-spam:before { content: "\f424"; } -.genericon-spotify:before { content: "\f515"; } -.genericon-standard:before { content: "\f100"; } -.genericon-star:before { content: "\f408"; } -.genericon-status:before { content: "\f105"; } -.genericon-stop:before { content: "\f449"; } -.genericon-stumbleupon:before { content: "\f223"; } -.genericon-subscribe:before { content: "\f463"; } -.genericon-subscribed:before { content: "\f465"; } -.genericon-summary:before { content: "\f425"; } -.genericon-tablet:before { content: "\f453"; } -.genericon-tag:before { content: "\f302"; } -.genericon-time:before { content: "\f303"; } -.genericon-top:before { content: "\f435"; } -.genericon-trash:before { content: "\f407"; } -.genericon-tumblr:before { content: "\f214"; } -.genericon-twitch:before { content: "\f516"; } -.genericon-twitter:before { content: "\f202"; } -.genericon-unapprove:before { content: "\f446"; } -.genericon-unsubscribe:before { content: "\f464"; } -.genericon-unzoom:before { content: "\f401"; } -.genericon-uparrow:before { content: "\f500"; } -.genericon-user:before { content: "\f304"; } -.genericon-video:before { content: "\f104"; } -.genericon-videocamera:before { content: "\f517"; } -.genericon-vimeo:before { content: "\f212"; } -.genericon-warning:before { content: "\f414"; } -.genericon-website:before { content: "\f475"; } -.genericon-week:before { content: "\f306"; } -.genericon-wordpress:before { content: "\f205"; } -.genericon-xpost:before { content: "\f504"; } -.genericon-youtube:before { content: "\f213"; } -.genericon-zoom:before { content: "\f402"; } diff --git a/wp/wp-content/themes/twentyfifteen/header.php b/wp/wp-content/themes/twentyfifteen/header.php deleted file mode 100644 index 28de34ed..00000000 --- a/wp/wp-content/themes/twentyfifteen/header.php +++ /dev/null @@ -1,52 +0,0 @@ - - class="no-js"> - - - - - - - - - -> -
    - - - - -
    diff --git a/wp/wp-content/themes/twentyfifteen/image.php b/wp/wp-content/themes/twentyfifteen/image.php deleted file mode 100644 index 5a471d40..00000000 --- a/wp/wp-content/themes/twentyfifteen/image.php +++ /dev/null @@ -1,94 +0,0 @@ - - -
    -
    - - - -
    > - - - -
    - ', '' ); ?> -
    - -
    - -
    - - - -
    - -
    - - -
    - - '', - 'link_before' => '', - 'link_after' => '', - 'pagelink' => '' . __( 'Page', 'twentyfifteen' ) . ' %', - 'separator' => ', ', - ) ); - ?> -
    - -
    - - ', '' ); ?> -
    - -
    - - _x( 'Published in%title', 'Parent post link', 'twentyfifteen' ), - ) ); - - // End the loop. - endwhile; - ?> - -
    -
    - - diff --git a/wp/wp-content/themes/twentyfifteen/inc/back-compat.php b/wp/wp-content/themes/twentyfifteen/inc/back-compat.php deleted file mode 100644 index 73cd44d1..00000000 --- a/wp/wp-content/themes/twentyfifteen/inc/back-compat.php +++ /dev/null @@ -1,63 +0,0 @@ -

    %s

    ', $message ); -} - -/** - * Prevent the Customizer from being loaded on WordPress versions prior to 4.1. - * - * @since Twenty Fifteen 1.0 - */ -function twentyfifteen_customize() { - wp_die( sprintf( __( 'Twenty Fifteen requires at least WordPress version 4.1. You are running version %s. Please upgrade and try again.', 'twentyfifteen' ), $GLOBALS['wp_version'] ), '', array( - 'back_link' => true, - ) ); -} -add_action( 'load-customize.php', 'twentyfifteen_customize' ); - -/** - * Prevent the Theme Preview from being loaded on WordPress versions prior to 4.1. - * - * @since Twenty Fifteen 1.0 - */ -function twentyfifteen_preview() { - if ( isset( $_GET['preview'] ) ) { - wp_die( sprintf( __( 'Twenty Fifteen requires at least WordPress version 4.1. You are running version %s. Please upgrade and try again.', 'twentyfifteen' ), $GLOBALS['wp_version'] ) ); - } -} -add_action( 'template_redirect', 'twentyfifteen_preview' ); diff --git a/wp/wp-content/themes/twentyfifteen/inc/custom-header.php b/wp/wp-content/themes/twentyfifteen/inc/custom-header.php deleted file mode 100644 index 10d0ef1a..00000000 --- a/wp/wp-content/themes/twentyfifteen/inc/custom-header.php +++ /dev/null @@ -1,370 +0,0 @@ - $default_text_color, - 'width' => 954, - 'height' => 1300, - 'wp-head-callback' => 'twentyfifteen_header_style', - ) ) ); -} -add_action( 'after_setup_theme', 'twentyfifteen_custom_header_setup' ); - -/** - * Convert HEX to RGB. - * - * @since Twenty Fifteen 1.0 - * - * @param string $color The original color, in 3- or 6-digit hexadecimal form. - * @return array Array containing RGB (red, green, and blue) values for the given - * HEX code, empty array otherwise. - */ -function twentyfifteen_hex2rgb( $color ) { - $color = trim( $color, '#' ); - - if ( strlen( $color ) == 3 ) { - $r = hexdec( substr( $color, 0, 1 ).substr( $color, 0, 1 ) ); - $g = hexdec( substr( $color, 1, 1 ).substr( $color, 1, 1 ) ); - $b = hexdec( substr( $color, 2, 1 ).substr( $color, 2, 1 ) ); - } else if ( strlen( $color ) == 6 ) { - $r = hexdec( substr( $color, 0, 2 ) ); - $g = hexdec( substr( $color, 2, 2 ) ); - $b = hexdec( substr( $color, 4, 2 ) ); - } else { - return array(); - } - - return array( 'red' => $r, 'green' => $g, 'blue' => $b ); -} - -if ( ! function_exists( 'twentyfifteen_header_style' ) ) : -/** - * Styles the header image and text displayed on the blog. - * - * @since Twenty Fifteen 1.0 - * - * @see twentyfifteen_custom_header_setup() - */ -function twentyfifteen_header_style() { - $header_image = get_header_image(); - - // If no custom options for text are set, let's bail. - if ( empty( $header_image ) && display_header_text() ) { - return; - } - - // If we get this far, we have custom styles. Let's do this. - ?> - - get_setting( 'blogname' )->transport = 'postMessage'; - $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage'; - - if ( isset( $wp_customize->selective_refresh ) ) { - $wp_customize->selective_refresh->add_partial( 'blogname', array( - 'selector' => '.site-title a', - 'container_inclusive' => false, - 'render_callback' => 'twentyfifteen_customize_partial_blogname', - ) ); - $wp_customize->selective_refresh->add_partial( 'blogdescription', array( - 'selector' => '.site-description', - 'container_inclusive' => false, - 'render_callback' => 'twentyfifteen_customize_partial_blogdescription', - ) ); - } - - // Add color scheme setting and control. - $wp_customize->add_setting( 'color_scheme', array( - 'default' => 'default', - 'sanitize_callback' => 'twentyfifteen_sanitize_color_scheme', - 'transport' => 'postMessage', - ) ); - - $wp_customize->add_control( 'color_scheme', array( - 'label' => __( 'Base Color Scheme', 'twentyfifteen' ), - 'section' => 'colors', - 'type' => 'select', - 'choices' => twentyfifteen_get_color_scheme_choices(), - 'priority' => 1, - ) ); - - // Add custom header and sidebar text color setting and control. - $wp_customize->add_setting( 'sidebar_textcolor', array( - 'default' => $color_scheme[4], - 'sanitize_callback' => 'sanitize_hex_color', - 'transport' => 'postMessage', - ) ); - - $wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'sidebar_textcolor', array( - 'label' => __( 'Header and Sidebar Text Color', 'twentyfifteen' ), - 'description' => __( 'Applied to the header on small screens and the sidebar on wide screens.', 'twentyfifteen' ), - 'section' => 'colors', - ) ) ); - - // Remove the core header textcolor control, as it shares the sidebar text color. - $wp_customize->remove_control( 'header_textcolor' ); - - // Add custom header and sidebar background color setting and control. - $wp_customize->add_setting( 'header_background_color', array( - 'default' => $color_scheme[1], - 'sanitize_callback' => 'sanitize_hex_color', - 'transport' => 'postMessage', - ) ); - - $wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'header_background_color', array( - 'label' => __( 'Header and Sidebar Background Color', 'twentyfifteen' ), - 'description' => __( 'Applied to the header on small screens and the sidebar on wide screens.', 'twentyfifteen' ), - 'section' => 'colors', - ) ) ); - - // Add an additional description to the header image section. - $wp_customize->get_section( 'header_image' )->description = __( 'Applied to the header on small screens and the sidebar on wide screens.', 'twentyfifteen' ); -} -add_action( 'customize_register', 'twentyfifteen_customize_register', 11 ); - -/** - * Render the site title for the selective refresh partial. - * - * @since Twenty Fifteen 1.5 - * @see twentyfifteen_customize_register() - * - * @return void - */ -function twentyfifteen_customize_partial_blogname() { - bloginfo( 'name' ); -} - -/** - * Render the site tagline for the selective refresh partial. - * - * @since Twenty Fifteen 1.5 - * @see twentyfifteen_customize_register() - * - * @return void - */ -function twentyfifteen_customize_partial_blogdescription() { - bloginfo( 'description' ); -} - -/** - * Register color schemes for Twenty Fifteen. - * - * Can be filtered with {@see 'twentyfifteen_color_schemes'}. - * - * The order of colors in a colors array: - * 1. Main Background Color. - * 2. Sidebar Background Color. - * 3. Box Background Color. - * 4. Main Text and Link Color. - * 5. Sidebar Text and Link Color. - * 6. Meta Box Background Color. - * - * @since Twenty Fifteen 1.0 - * - * @return array An associative array of color scheme options. - */ -function twentyfifteen_get_color_schemes() { - /** - * Filter the color schemes registered for use with Twenty Fifteen. - * - * The default schemes include 'default', 'dark', 'yellow', 'pink', 'purple', and 'blue'. - * - * @since Twenty Fifteen 1.0 - * - * @param array $schemes { - * Associative array of color schemes data. - * - * @type array $slug { - * Associative array of information for setting up the color scheme. - * - * @type string $label Color scheme label. - * @type array $colors HEX codes for default colors prepended with a hash symbol ('#'). - * Colors are defined in the following order: Main background, sidebar - * background, box background, main text and link, sidebar text and link, - * meta box background. - * } - * } - */ - return apply_filters( 'twentyfifteen_color_schemes', array( - 'default' => array( - 'label' => __( 'Default', 'twentyfifteen' ), - 'colors' => array( - '#f1f1f1', - '#ffffff', - '#ffffff', - '#333333', - '#333333', - '#f7f7f7', - ), - ), - 'dark' => array( - 'label' => __( 'Dark', 'twentyfifteen' ), - 'colors' => array( - '#111111', - '#202020', - '#202020', - '#bebebe', - '#bebebe', - '#1b1b1b', - ), - ), - 'yellow' => array( - 'label' => __( 'Yellow', 'twentyfifteen' ), - 'colors' => array( - '#f4ca16', - '#ffdf00', - '#ffffff', - '#111111', - '#111111', - '#f1f1f1', - ), - ), - 'pink' => array( - 'label' => __( 'Pink', 'twentyfifteen' ), - 'colors' => array( - '#ffe5d1', - '#e53b51', - '#ffffff', - '#352712', - '#ffffff', - '#f1f1f1', - ), - ), - 'purple' => array( - 'label' => __( 'Purple', 'twentyfifteen' ), - 'colors' => array( - '#674970', - '#2e2256', - '#ffffff', - '#2e2256', - '#ffffff', - '#f1f1f1', - ), - ), - 'blue' => array( - 'label' => __( 'Blue', 'twentyfifteen' ), - 'colors' => array( - '#e9f2f9', - '#55c3dc', - '#ffffff', - '#22313f', - '#ffffff', - '#f1f1f1', - ), - ), - ) ); -} - -if ( ! function_exists( 'twentyfifteen_get_color_scheme' ) ) : -/** - * Get the current Twenty Fifteen color scheme. - * - * @since Twenty Fifteen 1.0 - * - * @return array An associative array of either the current or default color scheme hex values. - */ -function twentyfifteen_get_color_scheme() { - $color_scheme_option = get_theme_mod( 'color_scheme', 'default' ); - $color_schemes = twentyfifteen_get_color_schemes(); - - if ( array_key_exists( $color_scheme_option, $color_schemes ) ) { - return $color_schemes[ $color_scheme_option ]['colors']; - } - - return $color_schemes['default']['colors']; -} -endif; // twentyfifteen_get_color_scheme - -if ( ! function_exists( 'twentyfifteen_get_color_scheme_choices' ) ) : -/** - * Returns an array of color scheme choices registered for Twenty Fifteen. - * - * @since Twenty Fifteen 1.0 - * - * @return array Array of color schemes. - */ -function twentyfifteen_get_color_scheme_choices() { - $color_schemes = twentyfifteen_get_color_schemes(); - $color_scheme_control_options = array(); - - foreach ( $color_schemes as $color_scheme => $value ) { - $color_scheme_control_options[ $color_scheme ] = $value['label']; - } - - return $color_scheme_control_options; -} -endif; // twentyfifteen_get_color_scheme_choices - -if ( ! function_exists( 'twentyfifteen_sanitize_color_scheme' ) ) : -/** - * Sanitization callback for color schemes. - * - * @since Twenty Fifteen 1.0 - * - * @param string $value Color scheme name value. - * @return string Color scheme name. - */ -function twentyfifteen_sanitize_color_scheme( $value ) { - $color_schemes = twentyfifteen_get_color_scheme_choices(); - - if ( ! array_key_exists( $value, $color_schemes ) ) { - $value = 'default'; - } - - return $value; -} -endif; // twentyfifteen_sanitize_color_scheme - -/** - * Enqueues front-end CSS for color scheme. - * - * @since Twenty Fifteen 1.0 - * - * @see wp_add_inline_style() - */ -function twentyfifteen_color_scheme_css() { - $color_scheme_option = get_theme_mod( 'color_scheme', 'default' ); - - // Don't do anything if the default color scheme is selected. - if ( 'default' === $color_scheme_option ) { - return; - } - - $color_scheme = twentyfifteen_get_color_scheme(); - - // Convert main and sidebar text hex color to rgba. - $color_textcolor_rgb = twentyfifteen_hex2rgb( $color_scheme[3] ); - $color_sidebar_textcolor_rgb = twentyfifteen_hex2rgb( $color_scheme[4] ); - $colors = array( - 'background_color' => $color_scheme[0], - 'header_background_color' => $color_scheme[1], - 'box_background_color' => $color_scheme[2], - 'textcolor' => $color_scheme[3], - 'secondary_textcolor' => vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.7)', $color_textcolor_rgb ), - 'border_color' => vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.1)', $color_textcolor_rgb ), - 'border_focus_color' => vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.3)', $color_textcolor_rgb ), - 'sidebar_textcolor' => $color_scheme[4], - 'sidebar_border_color' => vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.1)', $color_sidebar_textcolor_rgb ), - 'sidebar_border_focus_color' => vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.3)', $color_sidebar_textcolor_rgb ), - 'secondary_sidebar_textcolor' => vsprintf( 'rgba( %1$s, %2$s, %3$s, 0.7)', $color_sidebar_textcolor_rgb ), - 'meta_box_background_color' => $color_scheme[5], - ); - - $color_scheme_css = twentyfifteen_get_color_scheme_css( $colors ); - - wp_add_inline_style( 'twentyfifteen-style', $color_scheme_css ); -} -add_action( 'wp_enqueue_scripts', 'twentyfifteen_color_scheme_css' ); - -/** - * Binds JS listener to make Customizer color_scheme control. - * - * Passes color scheme data as colorScheme global. - * - * @since Twenty Fifteen 1.0 - */ -function twentyfifteen_customize_control_js() { - wp_enqueue_script( 'color-scheme-control', get_template_directory_uri() . '/js/color-scheme-control.js', array( 'customize-controls', 'iris', 'underscore', 'wp-util' ), '20141216', true ); - wp_localize_script( 'color-scheme-control', 'colorScheme', twentyfifteen_get_color_schemes() ); -} -add_action( 'customize_controls_enqueue_scripts', 'twentyfifteen_customize_control_js' ); - -/** - * Binds JS handlers to make the Customizer preview reload changes asynchronously. - * - * @since Twenty Fifteen 1.0 - */ -function twentyfifteen_customize_preview_js() { - wp_enqueue_script( 'twentyfifteen-customize-preview', get_template_directory_uri() . '/js/customize-preview.js', array( 'customize-preview' ), '20141216', true ); -} -add_action( 'customize_preview_init', 'twentyfifteen_customize_preview_js' ); - -/** - * Returns CSS for the color schemes. - * - * @since Twenty Fifteen 1.0 - * - * @param array $colors Color scheme colors. - * @return string Color scheme CSS. - */ -function twentyfifteen_get_color_scheme_css( $colors ) { - $colors = wp_parse_args( $colors, array( - 'background_color' => '', - 'header_background_color' => '', - 'box_background_color' => '', - 'textcolor' => '', - 'secondary_textcolor' => '', - 'border_color' => '', - 'border_focus_color' => '', - 'sidebar_textcolor' => '', - 'sidebar_border_color' => '', - 'sidebar_border_focus_color' => '', - 'secondary_sidebar_textcolor' => '', - 'meta_box_background_color' => '', - ) ); - - $css = << a, - .author-description a, - .taxonomy-description a, - .textwidget a, - .entry-footer a:hover, - .comment-metadata a:hover, - .pingback .edit-link a:hover, - .comment-list .reply a:hover, - .site-info a:hover { - border-color: {$colors['textcolor']}; - } - - /* Secondary Text Color */ - button:hover, - button:focus, - input[type="button"]:hover, - input[type="button"]:focus, - input[type="reset"]:hover, - input[type="reset"]:focus, - input[type="submit"]:hover, - input[type="submit"]:focus, - .pagination .prev:hover, - .pagination .prev:focus, - .pagination .next:hover, - .pagination .next:focus, - .widget_calendar tbody a:hover, - .widget_calendar tbody a:focus, - .page-links a:hover, - .page-links a:focus { - background-color: {$colors['textcolor']}; /* Fallback for IE7 and IE8 */ - background-color: {$colors['secondary_textcolor']}; - } - - /* Secondary Text Color */ - blockquote, - a:hover, - a:focus, - .main-navigation .menu-item-description, - .post-navigation .meta-nav, - .post-navigation a:hover .post-title, - .post-navigation a:focus .post-title, - .image-navigation, - .image-navigation a, - .comment-navigation, - .comment-navigation a, - .widget, - .author-heading, - .entry-footer, - .entry-footer a, - .taxonomy-description, - .page-links > .page-links-title, - .entry-caption, - .comment-author, - .comment-metadata, - .comment-metadata a, - .pingback .edit-link, - .pingback .edit-link a, - .post-password-form label, - .comment-form label, - .comment-notes, - .comment-awaiting-moderation, - .logged-in-as, - .form-allowed-tags, - .no-comments, - .site-info, - .site-info a, - .wp-caption-text, - .gallery-caption, - .comment-list .reply a, - .widecolumn label, - .widecolumn .mu_register label { - color: {$colors['textcolor']}; /* Fallback for IE7 and IE8 */ - color: {$colors['secondary_textcolor']}; - } - - /* Secondary Text Color */ - blockquote, - .logged-in-as a:hover, - .comment-author a:hover { - border-color: {$colors['textcolor']}; /* Fallback for IE7 and IE8 */ - border-color: {$colors['secondary_textcolor']}; - } - - /* Border Color */ - hr, - .dropdown-toggle:hover, - .dropdown-toggle:focus { - background-color: {$colors['textcolor']}; /* Fallback for IE7 and IE8 */ - background-color: {$colors['border_color']}; - } - - /* Border Color */ - pre, - abbr[title], - table, - th, - td, - input, - textarea, - .main-navigation ul, - .main-navigation li, - .post-navigation, - .post-navigation div + div, - .pagination, - .comment-navigation, - .widget li, - .widget_categories .children, - .widget_nav_menu .sub-menu, - .widget_pages .children, - .site-header, - .site-footer, - .hentry + .hentry, - .author-info, - .entry-content .page-links a, - .page-links > span, - .page-header, - .comments-area, - .comment-list + .comment-respond, - .comment-list article, - .comment-list .pingback, - .comment-list .trackback, - .comment-list .reply a, - .no-comments { - border-color: {$colors['textcolor']}; /* Fallback for IE7 and IE8 */ - border-color: {$colors['border_color']}; - } - - /* Border Focus Color */ - a:focus, - button:focus, - input:focus { - outline-color: {$colors['textcolor']}; /* Fallback for IE7 and IE8 */ - outline-color: {$colors['border_focus_color']}; - } - - input:focus, - textarea:focus { - border-color: {$colors['textcolor']}; /* Fallback for IE7 and IE8 */ - border-color: {$colors['border_focus_color']}; - } - - /* Sidebar Link Color */ - .secondary-toggle:before { - color: {$colors['sidebar_textcolor']}; - } - - .site-title a, - .site-description { - color: {$colors['sidebar_textcolor']}; - } - - /* Sidebar Text Color */ - .site-title a:hover, - .site-title a:focus { - color: {$colors['secondary_sidebar_textcolor']}; - } - - /* Sidebar Border Color */ - .secondary-toggle { - border-color: {$colors['sidebar_textcolor']}; /* Fallback for IE7 and IE8 */ - border-color: {$colors['sidebar_border_color']}; - } - - /* Sidebar Border Focus Color */ - .secondary-toggle:hover, - .secondary-toggle:focus { - border-color: {$colors['sidebar_textcolor']}; /* Fallback for IE7 and IE8 */ - border-color: {$colors['sidebar_border_focus_color']}; - } - - .site-title a { - outline-color: {$colors['sidebar_textcolor']}; /* Fallback for IE7 and IE8 */ - outline-color: {$colors['sidebar_border_focus_color']}; - } - - /* Meta Background Color */ - .entry-footer { - background-color: {$colors['meta_box_background_color']}; - } - - @media screen and (min-width: 38.75em) { - /* Main Text Color */ - .page-header { - border-color: {$colors['textcolor']}; - } - } - - @media screen and (min-width: 59.6875em) { - /* Make sure its transparent on desktop */ - .site-header, - .secondary { - background-color: transparent; - } - - /* Sidebar Background Color */ - .widget button, - .widget input[type="button"], - .widget input[type="reset"], - .widget input[type="submit"], - .widget_calendar tbody a, - .widget_calendar tbody a:hover, - .widget_calendar tbody a:focus { - color: {$colors['header_background_color']}; - } - - /* Sidebar Link Color */ - .secondary a, - .dropdown-toggle:after, - .widget-title, - .widget blockquote cite, - .widget blockquote small { - color: {$colors['sidebar_textcolor']}; - } - - .widget button, - .widget input[type="button"], - .widget input[type="reset"], - .widget input[type="submit"], - .widget_calendar tbody a { - background-color: {$colors['sidebar_textcolor']}; - } - - .textwidget a { - border-color: {$colors['sidebar_textcolor']}; - } - - /* Sidebar Text Color */ - .secondary a:hover, - .secondary a:focus, - .main-navigation .menu-item-description, - .widget, - .widget blockquote, - .widget .wp-caption-text, - .widget .gallery-caption { - color: {$colors['secondary_sidebar_textcolor']}; - } - - .widget button:hover, - .widget button:focus, - .widget input[type="button"]:hover, - .widget input[type="button"]:focus, - .widget input[type="reset"]:hover, - .widget input[type="reset"]:focus, - .widget input[type="submit"]:hover, - .widget input[type="submit"]:focus, - .widget_calendar tbody a:hover, - .widget_calendar tbody a:focus { - background-color: {$colors['secondary_sidebar_textcolor']}; - } - - .widget blockquote { - border-color: {$colors['secondary_sidebar_textcolor']}; - } - - /* Sidebar Border Color */ - .main-navigation ul, - .main-navigation li, - .widget input, - .widget textarea, - .widget table, - .widget th, - .widget td, - .widget pre, - .widget li, - .widget_categories .children, - .widget_nav_menu .sub-menu, - .widget_pages .children, - .widget abbr[title] { - border-color: {$colors['sidebar_border_color']}; - } - - .dropdown-toggle:hover, - .dropdown-toggle:focus, - .widget hr { - background-color: {$colors['sidebar_border_color']}; - } - - .widget input:focus, - .widget textarea:focus { - border-color: {$colors['sidebar_border_focus_color']}; - } - - .sidebar a:focus, - .dropdown-toggle:focus { - outline-color: {$colors['sidebar_border_focus_color']}; - } - } -CSS; - - return $css; -} - -/** - * Output an Underscore template for generating CSS for the color scheme. - * - * The template generates the css dynamically for instant display in the Customizer - * preview. - * - * @since Twenty Fifteen 1.0 - */ -function twentyfifteen_color_scheme_css_template() { - $colors = array( - 'background_color' => '{{ data.background_color }}', - 'header_background_color' => '{{ data.header_background_color }}', - 'box_background_color' => '{{ data.box_background_color }}', - 'textcolor' => '{{ data.textcolor }}', - 'secondary_textcolor' => '{{ data.secondary_textcolor }}', - 'border_color' => '{{ data.border_color }}', - 'border_focus_color' => '{{ data.border_focus_color }}', - 'sidebar_textcolor' => '{{ data.sidebar_textcolor }}', - 'sidebar_border_color' => '{{ data.sidebar_border_color }}', - 'sidebar_border_focus_color' => '{{ data.sidebar_border_focus_color }}', - 'secondary_sidebar_textcolor' => '{{ data.secondary_sidebar_textcolor }}', - 'meta_box_background_color' => '{{ data.meta_box_background_color }}', - ); - ?> - - 1 && get_option( 'page_comments' ) ) : - ?> -
    - - %s', __( 'Featured', 'twentyfifteen' ) ); - } - - $format = get_post_format(); - if ( current_theme_supports( 'post-formats', $format ) ) { - printf( '%1$s%3$s', - sprintf( '%s ', _x( 'Format', 'Used before post format.', 'twentyfifteen' ) ), - esc_url( get_post_format_link( $format ) ), - get_post_format_string( $format ) - ); - } - - if ( in_array( get_post_type(), array( 'post', 'attachment' ) ) ) { - $time_string = ''; - - if ( get_the_time( 'U' ) !== get_the_modified_time( 'U' ) ) { - $time_string = ''; - } - - $time_string = sprintf( $time_string, - esc_attr( get_the_date( 'c' ) ), - get_the_date(), - esc_attr( get_the_modified_date( 'c' ) ), - get_the_modified_date() - ); - - printf( '%1$s %3$s', - _x( 'Posted on', 'Used before publish date.', 'twentyfifteen' ), - esc_url( get_permalink() ), - $time_string - ); - } - - if ( 'post' == get_post_type() ) { - if ( is_singular() || is_multi_author() ) { - printf( '', - _x( 'Author', 'Used before post author name.', 'twentyfifteen' ), - esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ), - get_the_author() - ); - } - - $categories_list = get_the_category_list( _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfifteen' ) ); - if ( $categories_list && twentyfifteen_categorized_blog() ) { - printf( '%1$s %2$s', - _x( 'Categories', 'Used before category names.', 'twentyfifteen' ), - $categories_list - ); - } - - $tags_list = get_the_tag_list( '', _x( ', ', 'Used between list items, there is a space after the comma.', 'twentyfifteen' ) ); - if ( $tags_list ) { - printf( '%1$s %2$s', - _x( 'Tags', 'Used before tag names.', 'twentyfifteen' ), - $tags_list - ); - } - } - - if ( is_attachment() && wp_attachment_is_image() ) { - // Retrieve attachment metadata. - $metadata = wp_get_attachment_metadata(); - - printf( '%1$s %3$s × %4$s', - _x( 'Full size', 'Used before full size attachment link.', 'twentyfifteen' ), - esc_url( wp_get_attachment_url() ), - $metadata['width'], - $metadata['height'] - ); - } - - if ( ! is_single() && ! post_password_required() && ( comments_open() || get_comments_number() ) ) { - echo ''; - /* translators: %s: post title */ - comments_popup_link( sprintf( __( 'Leave a comment on %s', 'twentyfifteen' ), get_the_title() ) ); - echo ''; - } -} -endif; - -/** - * Determine whether blog/site has more than one category. - * - * @since Twenty Fifteen 1.0 - * - * @return bool True of there is more than one category, false otherwise. - */ -function twentyfifteen_categorized_blog() { - if ( false === ( $all_the_cool_cats = get_transient( 'twentyfifteen_categories' ) ) ) { - // Create an array of all the categories that are attached to posts. - $all_the_cool_cats = get_categories( array( - 'fields' => 'ids', - 'hide_empty' => 1, - - // We only need to know if there is more than one category. - 'number' => 2, - ) ); - - // Count the number of categories that are attached to the posts. - $all_the_cool_cats = count( $all_the_cool_cats ); - - set_transient( 'twentyfifteen_categories', $all_the_cool_cats ); - } - - if ( $all_the_cool_cats > 1 ) { - // This blog has more than 1 category so twentyfifteen_categorized_blog should return true. - return true; - } else { - // This blog has only 1 category so twentyfifteen_categorized_blog should return false. - return false; - } -} - -/** - * Flush out the transients used in {@see twentyfifteen_categorized_blog()}. - * - * @since Twenty Fifteen 1.0 - */ -function twentyfifteen_category_transient_flusher() { - // Like, beat it. Dig? - delete_transient( 'twentyfifteen_categories' ); -} -add_action( 'edit_category', 'twentyfifteen_category_transient_flusher' ); -add_action( 'save_post', 'twentyfifteen_category_transient_flusher' ); - -if ( ! function_exists( 'twentyfifteen_post_thumbnail' ) ) : -/** - * Display an optional post thumbnail. - * - * Wraps the post thumbnail in an anchor element on index views, or a div - * element when on single views. - * - * @since Twenty Fifteen 1.0 - */ -function twentyfifteen_post_thumbnail() { - if ( post_password_required() || is_attachment() || ! has_post_thumbnail() ) { - return; - } - - if ( is_singular() ) : - ?> - -
    - -
    - - - - - - %2$s', - esc_url( get_permalink( get_the_ID() ) ), - /* translators: %s: Name of current post */ - sprintf( __( 'Continue reading %s', 'twentyfifteen' ), '' . get_the_title( get_the_ID() ) . '' ) - ); - return ' … ' . $link; -} -add_filter( 'excerpt_more', 'twentyfifteen_excerpt_more' ); -endif; - -if ( ! function_exists( 'twentyfifteen_the_custom_logo' ) ) : -/** - * Displays the optional custom logo. - * - * Does nothing if the custom logo is not available. - * - * @since Twenty Fifteen 1.5 - */ -function twentyfifteen_the_custom_logo() { - if ( function_exists( 'the_custom_logo' ) ) { - the_custom_logo(); - } -} -endif; diff --git a/wp/wp-content/themes/twentyfifteen/index.php b/wp/wp-content/themes/twentyfifteen/index.php deleted file mode 100644 index db77651e..00000000 --- a/wp/wp-content/themes/twentyfifteen/index.php +++ /dev/null @@ -1,61 +0,0 @@ - - -
    -
    - - - - -
    -

    -
    - - - __( 'Previous page', 'twentyfifteen' ), - 'next_text' => __( 'Next page', 'twentyfifteen' ), - 'before_page_number' => '' . __( 'Page', 'twentyfifteen' ) . ' ', - ) ); - - // If no content, include the "No posts found" template. - else : - get_template_part( 'content', 'none' ); - - endif; - ?> - -
    -
    - - diff --git a/wp/wp-content/themes/twentyfifteen/js/color-scheme-control.js b/wp/wp-content/themes/twentyfifteen/js/color-scheme-control.js deleted file mode 100644 index 35632396..00000000 --- a/wp/wp-content/themes/twentyfifteen/js/color-scheme-control.js +++ /dev/null @@ -1,78 +0,0 @@ -/* global colorScheme, Color */ -/** - * Add a listener to the Color Scheme control to update other color controls to new values/defaults. - * Also trigger an update of the Color Scheme CSS when a color is changed. - */ - -( function( api ) { - var cssTemplate = wp.template( 'twentyfifteen-color-scheme' ), - colorSchemeKeys = [ - 'background_color', - 'header_background_color', - 'box_background_color', - 'textcolor', - 'sidebar_textcolor', - 'meta_box_background_color' - ], - colorSettings = [ - 'background_color', - 'header_background_color', - 'sidebar_textcolor' - ]; - - api.controlConstructor.select = api.Control.extend( { - ready: function() { - if ( 'color_scheme' === this.id ) { - this.setting.bind( 'change', function( value ) { - // Update Background Color. - api( 'background_color' ).set( colorScheme[value].colors[0] ); - api.control( 'background_color' ).container.find( '.color-picker-hex' ) - .data( 'data-default-color', colorScheme[value].colors[0] ) - .wpColorPicker( 'defaultColor', colorScheme[value].colors[0] ); - - // Update Header/Sidebar Background Color. - api( 'header_background_color' ).set( colorScheme[value].colors[1] ); - api.control( 'header_background_color' ).container.find( '.color-picker-hex' ) - .data( 'data-default-color', colorScheme[value].colors[1] ) - .wpColorPicker( 'defaultColor', colorScheme[value].colors[1] ); - - // Update Header/Sidebar Text Color. - api( 'sidebar_textcolor' ).set( colorScheme[value].colors[4] ); - api.control( 'sidebar_textcolor' ).container.find( '.color-picker-hex' ) - .data( 'data-default-color', colorScheme[value].colors[4] ) - .wpColorPicker( 'defaultColor', colorScheme[value].colors[4] ); - } ); - } - } - } ); - - // Generate the CSS for the current Color Scheme. - function updateCSS() { - var scheme = api( 'color_scheme' )(), css, - colors = _.object( colorSchemeKeys, colorScheme[ scheme ].colors ); - - // Merge in color scheme overrides. - _.each( colorSettings, function( setting ) { - colors[ setting ] = api( setting )(); - }); - - // Add additional colors. - colors.secondary_textcolor = Color( colors.textcolor ).toCSS( 'rgba', 0.7 ); - colors.border_color = Color( colors.textcolor ).toCSS( 'rgba', 0.1 ); - colors.border_focus_color = Color( colors.textcolor ).toCSS( 'rgba', 0.3 ); - colors.secondary_sidebar_textcolor = Color( colors.sidebar_textcolor ).toCSS( 'rgba', 0.7 ); - colors.sidebar_border_color = Color( colors.sidebar_textcolor ).toCSS( 'rgba', 0.1 ); - colors.sidebar_border_focus_color = Color( colors.sidebar_textcolor ).toCSS( 'rgba', 0.3 ); - - css = cssTemplate( colors ); - - api.previewer.send( 'update-color-scheme-css', css ); - } - - // Update the CSS whenever a color setting is changed. - _.each( colorSettings, function( setting ) { - api( setting, function( setting ) { - setting.bind( updateCSS ); - } ); - } ); -} )( wp.customize ); diff --git a/wp/wp-content/themes/twentyfifteen/js/customize-preview.js b/wp/wp-content/themes/twentyfifteen/js/customize-preview.js deleted file mode 100644 index 58ca269a..00000000 --- a/wp/wp-content/themes/twentyfifteen/js/customize-preview.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Live-update changed settings in real time in the Customizer preview. - */ - -( function( $ ) { - var $style = $( '#twentyfifteen-color-scheme-css' ), - api = wp.customize; - - if ( ! $style.length ) { - $style = $( 'head' ).append( '"; -c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| -"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); -if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d -1 || ua.indexOf( 'opera' ) > -1 || ua.indexOf( 'msie' ) > -1 ) && - document.getElementById && window.addEventListener ) { - - window.addEventListener( 'hashchange', function() { - var element = document.getElementById( location.hash.substring( 1 ) ); - - if ( element ) { - if ( ! /^(?:a|select|input|button|textarea)$/i.test( element.nodeName ) ) { - element.tabIndex = -1; - } - - element.focus(); - } - }, false ); - } -} )(); diff --git a/wp/wp-content/themes/twentyfifteen/page.php b/wp/wp-content/themes/twentyfifteen/page.php deleted file mode 100644 index 5c7a0b07..00000000 --- a/wp/wp-content/themes/twentyfifteen/page.php +++ /dev/null @@ -1,38 +0,0 @@ - - -
    -
    - - - -
    -
    - - diff --git a/wp/wp-content/themes/twentyfifteen/readme.txt b/wp/wp-content/themes/twentyfifteen/readme.txt deleted file mode 100644 index 8ca82808..00000000 --- a/wp/wp-content/themes/twentyfifteen/readme.txt +++ /dev/null @@ -1,96 +0,0 @@ -=== Twenty Fifteen === -Contributors: the WordPress team -Requires at least: WordPress 4.1 -Tested up to: WordPress 4.8-trunk -Version: 1.7 -License: GPLv2 or later -License URI: http://www.gnu.org/licenses/gpl-2.0.html -Tags: blog, two-columns, left-sidebar, accessibility-ready, custom-background, custom-colors, custom-header, custom-logo, custom-menu, editor-style, featured-images, microformats, post-formats, rtl-language-support, sticky-post, threaded-comments, translation-ready - -== Description == -Our 2015 default theme is clean, blog-focused, and designed for clarity. Twenty Fifteen's simple, straightforward typography is readable on a wide variety of screen sizes, and suitable for multiple languages. We designed it using a mobile-first approach, meaning your content takes center-stage, regardless of whether your visitors arrive by smartphone, tablet, laptop, or desktop computer. - -* Mobile-first, Responsive Layout -* Custom Colors -* Custom Header -* Social Links -* Menu Description -* Post Formats -* The GPL v2.0 or later license. :) Use it to make something cool. - -For more information about Twenty Fifteen please go to https://codex.wordpress.org/Twenty_Fifteen. - -== Installation == - -1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. -2. Type in Twenty Fifteen in the search form and press the 'Enter' key on your keyboard. -3. Click on the 'Activate' button to use your new theme right away. -4. Go to https://codex.wordpress.org/Twenty_Fifteen for a guide on how to customize this theme. -5. Navigate to Appearance > Customize in your admin panel and customize to taste. - -== Copyright == - -Twenty Fifteen WordPress Theme, Copyright 2014-2016 WordPress.org & Automattic.com -Twenty Fifteen is distributed under the terms of the GNU GPL - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -Twenty Fifteen Theme bundles the following third-party resources: - -HTML5 Shiv v3.7.0, Copyright 2014 Alexander Farkas -Licenses: MIT/GPL2 -Source: https://github.com/aFarkas/html5shiv - -Genericons icon font, Copyright 2013-2016 Automattic.com -License: GNU GPL, Version 2 (or later) -Source: http://www.genericons.com - -== Changelog == - -= 1.7 = -* Released: December 6, 2016 - -https://codex.wordpress.org/Twenty_Fifteen_Theme_Changelog#Version_1.7 - -= 1.6 = -* Released: August 15, 2016 - -https://codex.wordpress.org/Twenty_Fifteen_Theme_Changelog#Version_1.6 - -= 1.5 = -* Released: April 12, 2016 - -https://codex.wordpress.org/Twenty_Fifteen_Theme_Changelog#Version_1.5 - -= 1.4 = -* Released: December 8, 2015 - -https://codex.wordpress.org/Twenty_Fifteen_Theme_Changelog#Version_1.4 - -= 1.3 = -* Released: August 18, 2015 - -https://codex.wordpress.org/Twenty_Fifteen_Theme_Changelog#Version_1.3 - -= 1.2 = -* Released: May 6, 2015 - -https://codex.wordpress.org/Twenty_Fifteen_Theme_Changelog#Version_1.2 - -= 1.1 = -* Released: April 23, 2015 - -https://codex.wordpress.org/Twenty_Fifteen_Theme_Changelog#Version_1.1 - -= 1.0 = -* Released: December 18, 2014 - -Initial release diff --git a/wp/wp-content/themes/twentyfifteen/rtl.css b/wp/wp-content/themes/twentyfifteen/rtl.css deleted file mode 100644 index 809504a5..00000000 --- a/wp/wp-content/themes/twentyfifteen/rtl.css +++ /dev/null @@ -1,840 +0,0 @@ -/* -Theme Name: Twenty Fifteen -Description: Adds support for languages written in a Right To Left (RTL) direction. -It's easy, just a matter of overwriting all the horizontal positioning attributes -of your CSS stylesheet in a separate stylesheet file named rtl.css. - -See: https://codex.wordpress.org/Right_to_Left_Language_Support -*/ - -/** - * Table of Contents: - * - * 1.0 - Reset - * 2.0 - Typography - * 3.0 - Elements - * 4.0 - Forms - * 5.0 - Navigations - * 6.0 - Accessibility - * 7.0 - Alignments - * 8.0 - Header - * 9.0 - Widgets - * 10.0 - Content - * 10.1 - Posts and pages - * 10.2 - Comments - * 11.0 - Media Queries - * 11.1 - Mobile Large - * 11.2 - Tablet Small - * 11.3 - Tablet Large - * 11.4 - Desktop Small - * 11.5 - Desktop Medium - * 11.6 - Desktop Large - * 11.7 - Desktop X-Large - */ - - -/** - * 1.0 Reset - */ - -body { - direction: rtl; - unicode-bidi: embed; -} - -caption, -th, -td { - text-align: right; -} - - -/** - * 2.0 Typography - */ - -body, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input, -select, -textarea, -blockquote cite, -blockquote small, -.post-password-form label, -.main-navigation .menu-item-description, -.post-navigation .meta-nav, -.post-navigation .post-title, -.pagination, -.image-navigation, -.comment-navigation, -.site-title, -.site-description, -.widget-title, -.widget_calendar caption, -.widget_rss .rss-date, -.widget_rss cite, -.author-heading, -.entry-footer, -.page-title, -.page-links, -.entry-caption, -.comments-title, -.comment-reply-title, -.comment-metadata, -.pingback .edit-link, -.comment-list .reply a, -.comment-form label, -.comment-notes, -.comment-awaiting-moderation, -.logged-in-as, -.form-allowed-tags, -.no-comments, -.wp-caption-text, -.gallery-caption { - font-family: Arial, Tahoma, sans-serif; -} - -::-webkit-input-placeholder { - font-family: Arial, Tahoma, sans-serif; -} - -:-moz-placeholder { - font-family: Arial, Tahoma, sans-serif; -} - -::-moz-placeholder { - font-family: Arial, Tahoma, sans-serif; -} - -:-ms-input-placeholder { - font-family: Arial, Tahoma, sans-serif; -} - -blockquote { - border-right: 4px solid rgba(51, 51, 51, 0.7); - border-left: 0; - padding-right: 0.7778em; - padding-left: 0; -} - - -/** - * 3.0 Elements - */ - -ul, -ol { - margin: 0 1.3333em 1.6em 0; -} - -caption, -th, -td { - text-align: right; -} - - -/** - * 4.0 Forms - */ - -.post-password-form input[type="submit"] { - right: auto; - left: 0; -} - - -/** - * 5.0 Navigations - */ - -.main-navigation ul ul { - margin-right: 0.8em; - margin-left: auto; -} - -.main-navigation .menu-item-has-children > a { - padding-right: 0; - padding-left: 48px; -} - -.dropdown-toggle { - right: auto; - left: 0; -} - -.dropdown-toggle:after { - right: -1px; - left: auto; -} - -.social-navigation li { - float: right; -} - -.social-navigation a:before { - right: 0; - left: auto; -} - -.secondary-toggle { - right: auto; - left: 0; -} - -.post-navigation .has-post-thumbnail a:before { - right: 0; - left: auto; -} - -.pagination .prev { - right: 0; - left: auto; -} - -.pagination .prev:before { - content: "\f429"; - right: -1px; - left: auto; -} - -.pagination .next { - right: auto; - left: 0; -} - -.pagination .next:before { - content: "\f430"; - right: auto; - left: -1px; -} - -.image-navigation .nav-previous a:before, -.comment-navigation .nav-previous a:before { - content: "\f429"; - margin-right: auto; - margin-left: 0.2em; -} - -.image-navigation .nav-next a:after, -.comment-navigation .nav-next a:after { - content: "\f430"; - margin-right: 0.2em; - margin-left: auto; -} - - -/** - * 6.0 Accessibility - */ - -.screen-reader-text:hover, -.screen-reader-text:focus { - right: 5px; - left: auto; -} - - -/** - * 7.0 Alignments - */ - -.alignright { - float: right; -} - -.alignleft { - float: left; -} - -.aligncenter { - margin-right: auto; - margin-left: auto; -} - -blockquote.alignright, -.wp-caption.alignright, -img.alignright { - margin: 0.4em 0 1.6em 1.6em; -} - -blockquote.alignleft, -.wp-caption.alignleft, -img.alignleft { - margin: 0.4em 1.6em 1.6em 0; -} - - -/** - * 8.0 Header - */ - -.site-branding { - padding-right: 0; - padding-left: 60px; -} - - -/** - * 9.0 Widgets - */ - -.widget_categories .children, -.widget_nav_menu .sub-menu, -.widget_pages .children { - margin: 0.7667em 0.8em 0 0; -} - - -/** - * 10.0 Content - */ - -/** - * 10.1 Posts and pages - */ - -.entry-content .more-link:after { - content: "\f430"; -} - -.author-link:after { - content: "\f430"; -} - -.author-info .avatar { - float: right; - margin: 0 0 1.6em 1.6em; -} - -.posted-on:before, -.byline:before, -.cat-links:before, -.tags-links:before, -.comments-link:before, -.entry-format:before, -.edit-link:before, -.full-size-link:before { - margin-right: auto; - margin-left: 2px; -} - -.posted-on, -.byline, -.cat-links, -.tags-links, -.comments-link, -.entry-format, -.full-size-link { - margin-right: auto; - margin-left: 1em; -} - -.page-links a, -.page-links > span { - margin: 0 0 0.3333em 0.3333em; -} - -.page-links > .page-links-title { - padding-right: 0; - padding-left: 0.5em; -} - -.type-attachment .entry-header { - clear: left; -} - -.format-link .entry-title a:after { - -webkit-transform: scaleX(-1); - -moz-transform: scaleX(-1); - -ms-transform: scaleX(-1); - -o-transform: scaleX(-1); - transform: scaleX(-1); -} - - -/** - * 10.2 Comments - */ - -.comment-list .children > li { - padding-right: 0.8em; - padding-left: 0; -} - -.comment-author .avatar { - float: right; - margin-right: 0; - margin-left: 0.4em; -} - -.bypostauthor > article .fn:after { - right: 3px; - left: auto; -} - -.comment-metadata .edit-link { - margin-right: 1em; - margin-left: auto; -} - -.pingback .edit-link { - margin-right: 1em; - margin-left: auto; -} - -.comment-content ul, -.comment-content ol { - margin: 0 1.3333em 1.6em 0; -} - -.comment-reply-title small a { - float: left; -} - - -/** - * 11.0 Media Queries - */ - - -/** - * 11.1 Mobile Large 620px - */ - -@media screen and (min-width: 38.75em) { - ul, - ol { - margin-right: 0; - margin-left: auto; - } - - li > ul, - li > ol, - blockquote > ul, - blockquote > ol { - margin-right: 1.3333em; - margin-left: auto; - } - - blockquote { - margin-right: -1em; - margin-left: auto; - } - - blockquote > blockquote { - margin-right: 0; - margin-left: auto; - } - - .page-header { - border-color: inherit; - border-left: none; - border-style: solid; - border-width: 0 7px 0 0; - } - - .page-title, - .taxonomy-description { - margin-right: -7px; - margin-left: auto; - } - - .comment-content ul, - .comment-content ol { - margin-right: 0; - margin-left: auto; - } - - .comment-content li > ul, - .comment-content li > ol, - .comment-content blockquote > ul, - .comment-content blockquote > ol { - margin-right: 1.3333em; - margin-left: auto; - } -} - - -/** - * 11.2 Tablet Small 740px - */ - -@media screen and (min-width: 46.25em) { - blockquote { - margin-right: -1.05em; - margin-left: auto; - padding-right: 0.85em; - padding-left: 0; - } - - .main-navigation ul ul { - margin-right: 1em; - margin-left: auto; - } - - blockquote.alignright, - .wp-caption.alignright, - img.alignright { - margin: 0.4118em 0 1.6471em 1.6471em; - } - - blockquote.alignleft, - .wp-caption.alignleft, - img.alignleft { - margin: 0.4118em 1.6471em 1.6471em 0; - } - - .site-branding { - padding-right: 0; - padding-left: 66px; - } - - .widget blockquote { - margin-right: -1.2353em; - margin-left: auto; - padding-right: 1em; - padding-left: 0; - } - - .widget blockquote > blockquote { - margin-right: 0; - margin-left: auto; - } - - .widget blockquote.alignright, - .widget .wp-caption.alignright, - .widget img.alignright { - margin: 0.5em 0 1.5em 1.5em; - } - - .widget blockquote.alignleft, - .widget .wp-caption.alignleft, - .widget img.alignleft { - margin: 0.5em 1.5em 1.5em 0; - } - - .widget_categories .children, - .widget_nav_menu .sub-menu, - .widget_pages .children { - margin: 0.9643em 1em 0 0; - } - - .page-links a, - .page-links > span { - margin: 0 0 0.2857em 0.2857em; - } - - .author-info .avatar { - margin: 0 0 1.6471em 1.6471em; - } - - .comment-list .children > li { - padding-right: 1.2353em; - padding-left: 0; - } - - .comment-author .avatar { - margin-left: 1.64705em; - } - - .bypostauthor > article .fn:after { - right: 6px; - left: auto; - } -} - - -/** - * 11.3 Tablet Large 880px - */ - -@media screen and (min-width: 55em) { - blockquote { - margin-right: -1.0909em; - margin-left: auto; - padding-right: 0.9091em; - padding-left: 0; - } - - blockquote.alignright, - .wp-caption.alignright, - img.alignright { - margin: 0.4211em 0 1.6842em 1.6842em; - } - - blockquote.alignleft, - .wp-caption.alignleft, - img.alignleft { - margin: 0.4211em 1.6842em 1.6842em 0; - } - - .site-branding { - padding-right: 0; - padding-left: 74px; - } - - .widget blockquote { - margin-right: -1.2632em; - margin-left: auto; - padding-right: 1.0526em; - padding-left: 0; - } - - .widget_categories .children, - .widget_nav_menu .sub-menu, - .widget_pages .children { - margin: 0.7188em 1em 0 0; - } - - .page-links a, - .page-links > span { - margin: 0 0 0.25em 0.25em; - } - - .author-info .avatar { - margin: 0 0 1.6842em 1.6842em; - } - - .comment-list .children > li { - padding-right: 1.4737em; - padding-left: 0; - } - - .comment-author .avatar { - margin-left: 1.6842em; - } -} - - -/** - * 11.4 Desktop Small 955px - */ - -@media screen and (min-width: 59.6875em) { - body:before { - right: 0; - left: auto; - } - - .sidebar { - float: right; - margin-right: auto; - margin-left: -100%; - } - - .site-content { - float: right; - margin-right: 29.4118%; - margin-left: auto; - } - - blockquote { - margin-right: -1.3333em; - margin-left: auto; - padding-right: 1.1111em; - padding-left: 0; - } - - .main-navigation .menu-item-has-children > a { - padding-right: 0; - padding-left: 30px; - } - - blockquote.alignright, - .wp-caption.alignright, - img.alignright { - margin: 0.4em 0 1.6em 1.6em; - } - - blockquote.alignleft, - .wp-caption.alignleft, - img.alignleft { - margin: 0.4em 1.6em 1.6em 0; - } - - .widget blockquote { - margin-right: -1.5em; - margin-left: auto; - padding-right: 1.1667em; - padding-left: 0; - } - - .widget_categories .children, - .widget_nav_menu .sub-menu, - .widget_pages .children { - margin: 0.4583em 1em 0 0; - } - - .page-links a, - .page-links > span { - margin: 0 0 0.3333em 0.3333em; - } - - .author-info .avatar { - margin: 0 0 1.5em 1.5em; - } - - .comment-list .children > li { - padding-right: 0.8em; - padding-left: 0; - } - - .comment-author .avatar { - margin-left: 0.8em; - } - - .bypostauthor > article .fn:after { - right: 3px; - left: auto; - } - - .site-branding { - padding: 0; - } - - .site-footer { - float: right; - margin: 0 35.2941% 0 0; - } -} - - -/** - * 11.5 Desktop Medium 1100px - */ - -@media screen and (min-width: 68.75em) { - blockquote { - margin-right: -1.05em; - margin-left: auto; - padding-right: 0.85em; - padding-left: 0; - } - - .main-navigation .menu-item-has-children > a { - padding-right: 0; - padding-left: 34px; - } - - blockquote.alignright, - .wp-caption.alignright, - img.alignright { - margin: 0.4118em 0 1.6471em 1.6471em; - } - - blockquote.alignleft, - .wp-caption.alignleft, - img.alignleft { - margin: 0.4118em 1.6471em 1.6471em 0; - } - - .widget blockquote { - padding-right: 1.2143em; - padding-left: 0; - } - - .widget_categories .children, - .widget_nav_menu .sub-menu, - .widget_pages .children { - margin: 0.4643em 1em 0 0; - } - - .page-links a, - .page-links > span { - margin: 0 0 0.2857em 0.2857em; - } - - .author-info .avatar { - margin: 0 0 1.6471em 1.6471em; - } - - .comment-list .children > li { - padding-right: 1.1667em; - padding-left: 0; - } - - .comment-author .avatar { - margin-left: 1.64705em; - } - - .bypostauthor > article .fn:after { - right: 6px; - left: auto; - } -} - - -/** - * 11.6 Desktop Large 1240px - */ - -@media screen and (min-width: 77.5em) { - blockquote { - margin-right: -1.0909em; - margin-left: auto; - padding-right: 0.9091em; - padding-left: 0; - } - - .main-navigation .menu-item-has-children > a { - padding-right: 0; - padding-left: 38px; - } - - blockquote.alignright, - .wp-caption.alignright, - img.alignright { - margin: 0.4211em 0 1.6842em 1.6842em; - } - - blockquote.alignleft, - .wp-caption.alignleft, - img.alignleft { - margin: 0.4211em 1.6842em 1.6842em 0; - } - - .widget blockquote { - padding-right: 1.25em; - padding-left: 0; - } - - .widget_categories .children, - .widget_nav_menu .sub-menu, - .widget_pages .children { - margin: 0.4688em 1em 0 0; - } - - .page-links a, - .page-links > span { - margin: 0 0 0.25em 0.25em; - } - - .author-info .avatar { - margin: 0 0 1.6842em 1.6842em; - } - - .comment-list .children > li { - padding-right: 1.4737em; - padding-left: 0; - } - - .comment-author .avatar { - margin-left: 1.64705em; - } -} - - -/** - * 11.7 Desktop X-Large 1403px - */ - -@media screen and (min-width: 87.6875em) { - body:before { - width: -webkit-calc(50% - 289px); - width: calc(50% - 289px); - } -} diff --git a/wp/wp-content/themes/twentyfifteen/screenshot.png b/wp/wp-content/themes/twentyfifteen/screenshot.png deleted file mode 100644 index d00b44386fa83197572fb76b606271386d51b69d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 576231 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 LfJ5t7Do%mb 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 z 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

    qmaBQj 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 ^r?Rj;H&6F!^AP9x?Fe<@1 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

    &8@@8bsxR<_ZZqE2~~QT#agj+sh)1ebvPE_f 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 diff --git a/wp/wp-content/themes/twentyfifteen/search.php b/wp/wp-content/themes/twentyfifteen/search.php deleted file mode 100644 index 33528415..00000000 --- a/wp/wp-content/themes/twentyfifteen/search.php +++ /dev/null @@ -1,53 +0,0 @@ - - -

    -
    - - - - - - - - __( 'Previous page', 'twentyfifteen' ), - 'next_text' => __( 'Next page', 'twentyfifteen' ), - 'before_page_number' => '' . __( 'Page', 'twentyfifteen' ) . ' ', - ) ); - - // If no content, include the "No posts found" template. - else : - get_template_part( 'content', 'none' ); - - endif; - ?> - -
    -
    - - diff --git a/wp/wp-content/themes/twentyfifteen/sidebar.php b/wp/wp-content/themes/twentyfifteen/sidebar.php deleted file mode 100644 index 02308efc..00000000 --- a/wp/wp-content/themes/twentyfifteen/sidebar.php +++ /dev/null @@ -1,47 +0,0 @@ - -
    - - - - - - - - - - - - - -
    - - diff --git a/wp/wp-content/themes/twentyfifteen/single.php b/wp/wp-content/themes/twentyfifteen/single.php deleted file mode 100644 index afbb7b5e..00000000 --- a/wp/wp-content/themes/twentyfifteen/single.php +++ /dev/null @@ -1,48 +0,0 @@ - - -
    -
    - - ' ' . - '' . __( 'Next post:', 'twentyfifteen' ) . ' ' . - '%title', - 'prev_text' => ' ' . - '' . __( 'Previous post:', 'twentyfifteen' ) . ' ' . - '%title', - ) ); - - // End the loop. - endwhile; - ?> - -
    -
    - - diff --git a/wp/wp-content/themes/twentyfifteen/style.css b/wp/wp-content/themes/twentyfifteen/style.css deleted file mode 100644 index 13048ba9..00000000 --- a/wp/wp-content/themes/twentyfifteen/style.css +++ /dev/null @@ -1,6051 +0,0 @@ -/* -Theme Name: Twenty Fifteen -Theme URI: https://wordpress.org/themes/twentyfifteen/ -Author: the WordPress team -Author URI: https://wordpress.org/ -Description: Our 2015 default theme is clean, blog-focused, and designed for clarity. Twenty Fifteen's simple, straightforward typography is readable on a wide variety of screen sizes, and suitable for multiple languages. We designed it using a mobile-first approach, meaning your content takes center-stage, regardless of whether your visitors arrive by smartphone, tablet, laptop, or desktop computer. -Version: 1.7 -License: GNU General Public License v2 or later -License URI: http://www.gnu.org/licenses/gpl-2.0.html -Tags: blog, two-columns, left-sidebar, accessibility-ready, custom-background, custom-colors, custom-header, custom-logo, custom-menu, editor-style, featured-images, microformats, post-formats, rtl-language-support, sticky-post, threaded-comments, translation-ready -Text Domain: twentyfifteen - -This theme, like WordPress, is licensed under the GPL. -Use it to make something cool, have fun, and share what you've learned with others. -*/ - - -/** - * Table of Contents - * - * 1.0 - Reset - * 2.0 - Genericons - * 3.0 - Typography - * 4.0 - Elements - * 5.0 - Forms - * 6.0 - Navigations - * 6.1 - Links - * 6.2 - Menus - * 7.0 - Accessibility - * 8.0 - Alignments - * 9.0 - Clearings - * 10.0 - Header - * 11.0 - Widgets - * 12.0 - Content - * 12.1 - Posts and pages - * 12.2 - Post Formats - * 12.3 - Comments - * 13.0 - Footer - * 14.0 - Media - * 14.1 - Captions - * 14.2 - Galleries - * 15.0 - Multisite - * 16.0 - Media Queries - * 16.1 - Mobile Large - * 16.2 - Tablet Small - * 16.3 - Tablet Large - * 16.4 - Desktop Small - * 16.5 - Desktop Medium - * 16.6 - Desktop Large - * 16.7 - Desktop X-Large - * 17.0 - Print - */ - - -/** - * 1.0 - Reset - * - * Resetting and rebuilding styles have been helped along thanks to the fine - * work of Eric Meyer, Nicolas Gallagher, Jonathan Neal, and Blueprint. - */ - -html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { - border: 0; - font-family: inherit; - font-size: 100%; - font-style: inherit; - font-weight: inherit; - margin: 0; - outline: 0; - padding: 0; - vertical-align: baseline; -} - -html { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - font-size: 62.5%; - overflow-y: scroll; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -*, -*:before, -*:after { - -webkit-box-sizing: inherit; - -moz-box-sizing: inherit; - box-sizing: inherit; -} - -body { - background: #f1f1f1; -} - -article, -aside, -details, -figcaption, -figure, -footer, -header, -main, -nav, -section { - display: block; -} - -ol, -ul { - list-style: none; -} - -table { - border-collapse: separate; - border-spacing: 0; -} - -caption, -th, -td { - font-weight: normal; - text-align: left; -} - -fieldset { - min-width: inherit; -} - -blockquote:before, -blockquote:after, -q:before, -q:after { - content: ""; -} - -blockquote, -q { - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; - quotes: none; -} - -a:focus { - outline: 2px solid #c1c1c1; - outline: 2px solid rgba(51, 51, 51, 0.3); -} - -a:hover, -a:active { - outline: 0; -} - -a img { - border: 0; -} - - -/** - * 2.0 - Genericons - */ - -.social-navigation a:before, -.secondary-toggle:before, -.dropdown-toggle:after, -.bypostauthor > article .fn:after, -.comment-reply-title small a:before, -.comment-navigation .nav-next a:after, -.comment-navigation .nav-previous a:before, -.posted-on:before, -.byline:before, -.cat-links:before, -.tags-links:before, -.comments-link:before, -.entry-format:before, -.edit-link:before, -.full-size-link:before, -.pagination .prev:before, -.pagination .next:before, -.image-navigation a:before, -.image-navigation a:after, -.format-link .entry-title a:after, -.entry-content .more-link:after, -.entry-summary .more-link:after, -.author-link:after { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-family: "Genericons"; - font-size: 16px; - font-style: normal; - font-weight: normal; - font-variant: normal; - line-height: 1; - speak: none; - text-align: center; - text-decoration: inherit; - text-transform: none; - vertical-align: top; -} - - -/** - * 3.0 Typography - */ - -body, -button, -input, -select, -textarea { - color: #333; - font-family: "Noto Serif", serif; - font-size: 15px; - font-size: 1.5rem; - line-height: 1.6; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - clear: both; - font-weight: 700; -} - -p { - margin-bottom: 1.6em; -} - -b, -strong { - font-weight: 700; -} - -dfn, -cite, -em, -i { - font-style: italic; -} - -blockquote { - border-left: 4px solid #707070; - border-left: 4px solid rgba(51, 51, 51, 0.7); - color: #707070; - color: rgba(51, 51, 51, 0.7); - font-size: 18px; - font-size: 1.8rem; - font-style: italic; - line-height: 1.6667; - margin-bottom: 1.6667em; - padding-left: 0.7778em; -} - -blockquote p { - margin-bottom: 1.6667em; -} - -blockquote > p:last-child { - margin-bottom: 0; -} - -blockquote cite, -blockquote small { - color: #333; - font-size: 15px; - font-size: 1.5rem; - font-family: "Noto Sans", sans-serif; - line-height: 1.6; -} - -blockquote em, -blockquote i, -blockquote cite { - font-style: normal; -} - -blockquote strong, -blockquote b { - font-weight: 400; -} - -address { - font-style: italic; - margin: 0 0 1.6em; -} - -code, -kbd, -tt, -var, -samp, -pre { - font-family: Inconsolata, monospace; - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -pre { - background-color: transparent; - background-color: rgba(0, 0, 0, 0.01); - border: 1px solid #eaeaea; - border: 1px solid rgba(51, 51, 51, 0.1); - line-height: 1.2; - margin-bottom: 1.6em; - max-width: 100%; - overflow: auto; - padding: 0.8em; - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -abbr[title] { - border-bottom: 1px dotted #eaeaea; - border-bottom: 1px dotted rgba(51, 51, 51, 0.1); - cursor: help; -} - -mark, -ins { - background-color: #fff9c0; - text-decoration: none; -} - -sup, -sub { - font-size: 75%; - height: 0; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - bottom: 1ex; -} - -sub { - top: .5ex; -} - -small { - font-size: 75%; -} - -big { - font-size: 125%; -} - - -/** - * 4.0 Elements - */ - -hr { - background-color: #eaeaea; - background-color: rgba(51, 51, 51, 0.1); - border: 0; - height: 1px; - margin-bottom: 1.6em; -} - -ul, -ol { - margin: 0 0 1.6em 1.3333em; -} - -ul { - list-style: disc; -} - -ol { - list-style: decimal; -} - -li > ul, -li > ol { - margin-bottom: 0; -} - -dl { - margin-bottom: 1.6em; -} - -dt { - font-weight: bold; -} - -dd { - margin-bottom: 1.6em; -} - -table, -th, -td { - border: 1px solid #eaeaea; - border: 1px solid rgba(51, 51, 51, 0.1); -} - -table { - border-collapse: separate; - border-spacing: 0; - border-width: 1px 0 0 1px; - margin: 0 0 1.6em; - table-layout: fixed; /* Prevents HTML tables from becoming too wide */ - width: 100%; -} - -caption, -th, -td { - font-weight: normal; - text-align: left; -} - -th { - border-width: 0 1px 1px 0; - font-weight: 700; -} - -td { - border-width: 0 1px 1px 0; -} - -th, td { - padding: 0.4em; -} - -img { - -ms-interpolation-mode: bicubic; - border: 0; - height: auto; - max-width: 100%; - vertical-align: middle; -} - -figure { - margin: 0; -} - -del { - opacity: 0.8; -} - -/* Placeholder text color -- selectors need to be separate to work. */ - -::-webkit-input-placeholder { - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; -} - -:-moz-placeholder { - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; -} - -::-moz-placeholder { - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; - opacity: 1; /* Since FF19 lowers the opacity of the placeholder by default */ -} - -:-ms-input-placeholder { - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; -} - - -/** - * 5.0 Forms - */ - -button, -input, -select, -textarea { - background-color: #f7f7f7; - border-radius: 0; - font-size: 16px; - font-size: 1.6rem; - line-height: 1.5; - margin: 0; - max-width: 100%; - vertical-align: baseline; -} - -button, -input { - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; - line-height: normal; -} - -input, -textarea { - background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 0)); /* Removing the inner shadow on iOS inputs */ - border: 1px solid #eaeaea; - border: 1px solid rgba(51, 51, 51, 0.1); - color: #707070; - color: rgba(51, 51, 51, 0.7); -} - -input:focus, -textarea:focus { - background-color: #fff; - border: 1px solid #c1c1c1; - border: 1px solid rgba(51, 51, 51, 0.3); - color: #333; -} - -input:focus, -select:focus { - outline: 2px solid #c1c1c1; - outline: 2px solid rgba(51, 51, 51, 0.3); -} - -button[disabled], -input[disabled], -select[disabled], -textarea[disabled] { - cursor: default; - opacity: .5; -} - -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - background-color: #333; - border: 0; - color: #fff; - cursor: pointer; - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - font-weight: 700; - padding: 0.7917em 1.5em; - text-transform: uppercase; -} - -button:hover, -input[type="button"]:hover, -input[type="reset"]:hover, -input[type="submit"]:hover, -button:focus, -input[type="button"]:focus, -input[type="reset"]:focus, -input[type="submit"]:focus { - background-color: #707070; - background-color: rgba(51, 51, 51, 0.7); - outline: 0; -} - -input[type="search"] { - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -input[type="text"], -input[type="email"], -input[type="url"], -input[type="password"], -input[type="search"], -textarea { - padding: 0.375em; - width: 100%; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -input[type="text"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="password"]:focus, -input[type="search"]:focus, -textarea:focus { - outline: 0; -} - -.post-password-form { - position: relative; -} - -.post-password-form label { - color: #707070; - color: rgba(51, 51, 51, 0.7); - display: block; - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - font-weight: 700; - letter-spacing: 0.04em; - line-height: 1.5; - text-transform: uppercase; -} - -.post-password-form input[type="submit"] { - padding: 0.7917em; - position: absolute; - right: 0; - bottom: 0; -} - -input[type="checkbox"], -input[type="radio"] { - padding: 0; -} - -.search-form input[type="submit"], -.widget .search-form input[type="submit"] { - padding: 0; -} - - -/** - * 6.0 Navigations - */ - - -/** - * 6.1 Links - */ - -a { - color: #333; - text-decoration: none; -} - -a:hover, -a:focus { - color: #707070; - color: rgba(51, 51, 51, 0.7); -} - - -/** - * 6.2 Menus - */ - -.main-navigation a { - display: block; - padding: 0.8em 0; - position: relative; - text-decoration: none; -} - -.main-navigation ul { - list-style: none; - margin: 0; -} - -.main-navigation ul ul { - display: none; - margin-left: 0.8em; -} - -.main-navigation ul .toggled-on { - display: block; -} - -.main-navigation li { - border-top: 1px solid #eaeaea; - border-top: 1px solid rgba(51, 51, 51, 0.1); - position: relative; -} - -.main-navigation .current-menu-item > a, -.main-navigation .current-menu-ancestor > a { - font-weight: 700; -} - -.main-navigation .nav-menu > ul > li:first-child, -.main-navigation .nav-menu > li:first-child { - border-top: 0; -} - -.main-navigation .menu-item-has-children > a { - padding-right: 48px; -} - -.main-navigation .menu-item-description { - color: #707070; - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - font-weight: 400; - line-height: 1.5; - margin-top: 0.5em; -} - -.no-js .main-navigation ul ul { - display: block; -} - -.dropdown-toggle { - background-color: transparent; - border: 0; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - content: ""; - height: 42px; - padding: 0; - position: absolute; - text-transform: lowercase; /* Stop screen readers to read the text as capital letters */ - top: 3px; - right: 0; - width: 42px; -} - -.dropdown-toggle:after { - color: #333; - content: "\f431"; - font-size: 24px; - line-height: 42px; - position: relative; - top: 0; - left: 1px; - width: 42px; -} - -.dropdown-toggle:hover, -.dropdown-toggle:focus { - background-color: #eaeaea; - background-color: rgba(51, 51, 51, 0.1); -} - -.dropdown-toggle:focus { - outline: 1px solid #c1c1c1; - outline: 1px solid rgba(51, 51, 51, 0.3); -} - -.dropdown-toggle.toggle-on:after { - content: "\f432"; -} - -.social-navigation { - margin: 9.0909% 0; -} - -.social-navigation ul { - list-style: none; - margin: 0 0 -1.6em 0; -} - -.social-navigation li { - float: left; -} - -.social-navigation a { - display: block; - height: 3.2em; - position: relative; - width: 3.2em; -} - -.social-navigation a:before { - content: "\f415"; - font-size: 24px; - position: absolute; - top: 0; - left: 0; -} - -.social-navigation a[href*="codepen.io"]:before { - content: "\f216"; -} - -.social-navigation a[href*="digg.com"]:before { - content: "\f221"; -} - -.social-navigation a[href*="dribbble.com"]:before { - content: "\f201"; -} - -.social-navigation a[href*="dropbox.com"]:before { - content: "\f225"; -} - -.social-navigation a[href*="facebook.com"]:before { - content: "\f203"; -} - -.social-navigation a[href*="flickr.com"]:before { - content: "\f211"; -} - -.social-navigation a[href*="foursquare.com"]:before { - content: "\f226"; -} - -.social-navigation a[href*="plus.google.com"]:before { - content: "\f206"; -} - -.social-navigation a[href*="github.com"]:before { - content: "\f200"; -} - -.social-navigation a[href*="instagram.com"]:before { - content: "\f215"; -} - -.social-navigation a[href*="linkedin.com"]:before { - content: "\f208"; -} - -.social-navigation a[href*="pinterest.com"]:before { - content: "\f210"; -} - -.social-navigation a[href*="getpocket.com"]:before { - content: "\f224"; -} - -.social-navigation a[href*="polldaddy.com"]:before { - content: "\f217"; -} - -.social-navigation a[href*="reddit.com"]:before { - content: "\f222"; -} - -.social-navigation a[href*="stumbleupon.com"]:before { - content: "\f223"; -} - -.social-navigation a[href*="tumblr.com"]:before { - content: "\f214"; -} - -.social-navigation a[href*="twitter.com"]:before { - content: "\f202"; -} - -.social-navigation a[href*="vimeo.com"]:before { - content: "\f212"; -} - -.social-navigation a[href*="wordpress.com"]:before, -.social-navigation a[href*="wordpress.org"]:before { - content: "\f205"; -} - -.social-navigation a[href*="youtube.com"]:before { - content: "\f213"; -} - -.social-navigation a[href*="mailto:"]:before { - content: "\f410"; -} - -.social-navigation a[href*="spotify.com"]:before { - content: "\f515"; -} - -.social-navigation a[href*="twitch.tv"]:before { - content: "\f516"; -} - -.social-navigation a[href$="/feed/"]:before { - content: "\f413"; -} - -.social-navigation a[href*="path.com"]:before { - content: "\f219"; -} - -.social-navigation a[href*="skype.com"]:before { - content: "\f220"; -} - -.secondary-toggle { - background-color: transparent; - border: 1px solid #eaeaea; - border: 1px solid rgba(51, 51, 51, 0.1); - height: 42px; - overflow: hidden; - padding: 0; - position: absolute; - top: 50%; - right: 0; - text-align: center; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); - width: 42px; -} - -.secondary-toggle:before { - color: #333; - content: "\f419"; - line-height: 40px; - width: 40px; -} - -.secondary-toggle:hover, -.secondary-toggle:focus { - background-color: transparent; - border: 1px solid #c1c1c1; - border: 1px solid rgba(51, 51, 51, 0.3); - outline: 0; -} - -.secondary-toggle.toggled-on:before { - content: "\f405"; - font-size: 32px; - position: relative; - top: 1px; - left: -1px; -} - -.post-navigation { - background-color: #fff; - border-top: 1px solid #eaeaea; - border-top: 1px solid rgba(51, 51, 51, 0.1); - font-weight: 700; -} - -.post-navigation a { - display: block; - padding: 3.8461% 7.6923%; -} - -.post-navigation span { - display: block; -} - -.post-navigation .meta-nav { - color: #707070; - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - letter-spacing: 0.04em; - line-height: 1.5; - position: relative; - text-transform: uppercase; - z-index: 2; -} - -.post-navigation .post-title { - font-family: "Noto Serif", serif; - font-size: 18px; - font-size: 1.8rem; - line-height: 1.3333; - position: relative; - z-index: 2; -} - -.post-navigation .nav-next, -.post-navigation .nav-previous { - background-position: center; - background-size: cover; - position: relative; -} - -.post-navigation a:before { - content: ""; - display: block; - height: 100%; - position: absolute; - top: 0; - left: 0; - width: 100%; - z-index: 1; -} - -.post-navigation a:hover:before, -.post-navigation a:focus:before { - opacity: 0.5; -} - -.post-navigation .meta-nav { - opacity: 0.8; -} - -.post-navigation div + div { - border-top: 1px solid #eaeaea; - border-top: 1px solid rgba(51, 51, 51, 0.1); -} - -.pagination { - background-color: #fff; - border-top: 1px solid rgba(51, 51, 51, 0.1); - font-family: "Noto Sans", sans-serif; -} - -.pagination .nav-links { - min-height: 3.2em; - position: relative; - text-align: center; -} - -/* reset screen-reader-text */ -.pagination .current .screen-reader-text { - position: static !important; -} - -.pagination .page-numbers { - display: none; - line-height: 3.2em; - padding: 0 0.6667em; -} - -.pagination .page-numbers.current { - text-transform: uppercase; -} - -.pagination .current { - display: inline-block; - font-weight: 700; -} - -.pagination .prev, -.pagination .next { - -webkit-tap-highlight-color: rgba(255, 255, 255, 0.3); - background-color: #333; - color: #fff; - display: inline-block; - height: 48px; - overflow: hidden; - padding: 0; - position: absolute; - width: 48px; -} - -.pagination .prev:before, -.pagination .next:before { - font-size: 32px; - height: 48px; - line-height: 48px; - position: relative; - width: 48px; -} - -.pagination .prev:hover, -.pagination .prev:focus, -.pagination .next:hover, -.pagination .next:focus { - background-color: #707070; - background-color: rgba(51, 51, 51, 0.7); -} - -.pagination .prev { - left: 0; -} - -.pagination .prev:before { - content: "\f430"; - left: -1px; -} - -.pagination .next { - right: 0; -} - -.pagination .next:before { - content: "\f429"; - right: -1px; -} - -.image-navigation, -.comment-navigation { - color: #707070; - color: rgba(51, 51, 51, 0.7); - font-size: 12px; - font-size: 1.2rem; - font-family: "Noto Sans", sans-serif; - font-weight: 700; - line-height: 1.5; - text-transform: uppercase; -} - -.image-navigation a, -.comment-navigation a { - color: #707070; - color: rgba(51, 51, 51, 0.7); -} - -.image-navigation a:hover, -.image-navigation a:focus, -.comment-navigation a:hover, -.comment-navigation a:focus { - color: #333; -} - -.image-navigation .nav-previous:not(:empty), -.image-navigation .nav-next:not(:empty), -.comment-navigation .nav-previous:not(:empty), -.comment-navigation .nav-next:not(:empty) { - display: inline-block; -} - -.image-navigation .nav-previous:not(:empty) + .nav-next:not(:empty):before, -.comment-navigation .nav-previous:not(:empty) + .nav-next:not(:empty):before { - content: "\2215"; - font-weight: 400; - margin: 0 0.7em; -} - -.image-navigation .nav-previous a:before, -.comment-navigation .nav-previous a:before { - content: "\f430"; - margin-right: 0.2em; - position: relative; -} - -.image-navigation .nav-next a:after, -.comment-navigation .nav-next a:after { - content: "\f429"; - margin-left: 0.2em; - position: relative; -} - -.comment-navigation { - border-top: 1px solid #eaeaea; - border-top: 1px solid rgba(51, 51, 51, 0.1); - border-bottom: 1px solid #eaeaea; - border-bottom: 1px solid rgba(51, 51, 51, 0.1); - padding: 2em 0; -} - -.comments-title + .comment-navigation { - border-bottom: 0; -} - -.image-navigation { - padding: 0 7.6923%; -} - -.image-navigation .nav-previous:not(:empty), -.image-navigation .nav-next:not(:empty) { - margin-bottom: 2em; -} - - -/** - * 7.0 Accessibility - */ - -/* Text meant only for screen readers */ -.says, -.screen-reader-text { - clip: rect(1px, 1px, 1px, 1px); - height: 1px; - overflow: hidden; - position: absolute !important; - width: 1px; -} - -/* must have higher specificity than alternative color schemes inline styles */ -.site .skip-link { - background-color: #f1f1f1; - box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.2); - color: #21759b; - display: block; - font: bold 14px/normal "Noto Sans", sans-serif; - left: -9999em; - outline: none; - padding: 15px 23px 14px; - text-decoration: none; - text-transform: none; - top: -9999em; -} - -.logged-in .site .skip-link { - box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); - font: bold 14px/normal "Open Sans", sans-serif; -} - -.site .skip-link:focus { - clip: auto; - height: auto; - left: 6px; - top: 7px; - width: auto; - z-index: 100000; -} - - -/** - * 8.0 Alignments - */ - -.alignleft { - display: inline; - float: left; -} - -.alignright { - display: inline; - float: right; -} - -.aligncenter { - display: block; - margin-right: auto; - margin-left: auto; -} - -blockquote.alignleft, -.wp-caption.alignleft, -img.alignleft { - margin: 0.4em 1.6em 1.6em 0; -} - -blockquote.alignright, -.wp-caption.alignright, -img.alignright { - margin: 0.4em 0 1.6em 1.6em; -} - -blockquote.aligncenter, -.wp-caption.aligncenter, -img.aligncenter { - clear: both; - margin-top: 0.4em; - margin-bottom: 1.6em; -} - -.wp-caption.alignleft, -.wp-caption.alignright, -.wp-caption.aligncenter { - margin-bottom: 1.2em; -} - - -/** - * 9.0 Clearings - */ - -.clear:before, -.clear:after, -.site:before, -.site:after, -.entry-content:before, -.entry-content:after, -.comment-content:before, -.comment-content:after, -.site-content:before, -.site-content:after, -.nav-links:before, -.nav-links:after, -.comment-navigation:before, -.comment-navigation:after, -.social-navigation ul:before, -.social-navigation ul:after, -.textwidget:before, -.textwidget:after { - content: ""; - display: table; -} - -.clear:after, -.site:after, -.entry-content:after, -.comment-content:after, -.site-content:after, -.nav-links:after, -.comment-navigation:after, -.social-navigation ul:after, -.textwidget:after { - clear: both; -} - - -/** - * 10.0 Header - */ - -.site-header { - background-color: #fff; - border-bottom: 1px solid rgba(51, 51, 51, 0.1); - padding: 7.6923%; -} - -.site-branding { - min-height: 2em; - padding-right: 60px; - position: relative; -} - -.site-title { - font-family: "Noto Sans", sans-serif; - font-size: 22px; - font-size: 2.2rem; - font-weight: 700; - line-height: 1.3636; - margin-bottom: 0; -} - -.custom-logo { - max-height: 84px; - width: auto; -} - -.wp-custom-logo .site-title { - margin-top: 0.545454545em; -} - -.site-description { - display: none; - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - font-weight: 400; - line-height: 1.5; - margin: 0.5em 0 0; - opacity: 0.7; -} - - -/** - * 11.0 Widgets - */ - -.widget { - color: #707070; - color: rgba(51, 51, 51, 0.7); - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; - margin: 0 auto 9.09090%; - width: 100%; - word-wrap: break-word; -} - -.widget pre { - line-height: 1.2; -} - -.widget button, -.widget input, -.widget select, -.widget textarea { - font-size: 16px; - font-size: 1.6rem; - line-height: 1.5; -} - -.widget button, -.widget input { - line-height: normal; -} - -.widget button, -.widget input[type="button"], -.widget input[type="reset"], -.widget input[type="submit"] { - font-size: 12px; - font-size: 1.2rem; - padding: 0.7917em 1.5833em; -} - -.widget input[type="text"], -.widget input[type="email"], -.widget input[type="url"], -.widget input[type="password"], -.widget input[type="search"], -.widget textarea { - padding: 0.375em; -} - -.widget-title { - color: #333; - font-family: "Noto Sans", sans-serif; - margin: 0 0 1.6em; - letter-spacing: 0.04em; - text-transform: uppercase; -} - -.widget > :last-child { - margin-bottom: 0; -} - -.widget_calendar table { - margin: 0; -} - -.widget_calendar td, -.widget_calendar th { - line-height: 2.3333; - text-align: center; - padding: 0; -} - -.widget_calendar caption { - font-family: "Noto Serif", serif; - font-weight: 700; - margin: 0 0 1.6em; - letter-spacing: 0.04em; - text-transform: uppercase; -} - -.widget_calendar tbody a { - -webkit-tap-highlight-color: rgba(255, 255, 255, 0.3); - background-color: #333; - color: #fff; - display: block; - font-weight: 700; -} - -.widget_calendar tbody a:hover, -.widget_calendar tbody a:focus { - background-color: #707070; - background-color: rgba(51, 51, 51, 0.7); - color: #fff; -} - -.widget_archive a, -.widget_categories a, -.widget_links a, -.widget_meta a, -.widget_nav_menu a, -.widget_pages a, -.widget_recent_comments a, -.widget_recent_entries a { - border: 0; -} - -.widget_archive ul, -.widget_categories ul, -.widget_links ul, -.widget_meta ul, -.widget_nav_menu ul, -.widget_pages ul, -.widget_recent_comments ul, -.widget_recent_entries ul { - list-style: none; - margin: 0; -} - -.widget_archive li, -.widget_categories li, -.widget_links li, -.widget_meta li, -.widget_nav_menu li, -.widget_pages li, -.widget_recent_comments li, -.widget_recent_entries li { - border-top: 1px solid #eaeaea; - border-top: 1px solid rgba(51, 51, 51, 0.1); - padding: 0.7667em 0; -} - -.widget_archive li:first-child, -.widget_categories li:first-child, -.widget_links li:first-child, -.widget_meta li:first-child, -.widget_nav_menu li:first-child, -.widget_pages li:first-child, -.widget_recent_comments li:first-child, -.widget_recent_entries li:first-child { - border-top: 0; - padding-top: 0; -} - -.widget_archive li:last-child, -.widget_categories li:last-child, -.widget_links li:last-child, -.widget_meta li:last-child, -.widget_nav_menu li:last-child, -.widget_pages li:last-child, -.widget_recent_comments li:last-child, -.widget_recent_entries li:last-child { - padding-bottom: 0; -} - -.widget_categories .children, -.widget_nav_menu .sub-menu, -.widget_pages .children { - border-top: 1px solid #eaeaea; - border-top: 1px solid rgba(51, 51, 51, 0.1); - margin: 0.7667em 0 0 0.8em; - padding-top: 0.7667em; -} - -.widget_recent_entries .post-date { - display: block; -} - -.widget_rss ul { - list-style: none; - margin: 0; -} - -.widget_rss li { - margin-bottom: 1.6em; -} - -.widget_rss ul:last-child, -.widget_rss li:last-child { - margin-bottom: 0; -} - -.widget_rss .rsswidget { - border: 0; - font-weight: 700; -} - -.widget_rss .rsswidget img { - margin-top: -4px; -} - -.widget_rss .rss-date, -.widget_rss cite { - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - font-style: normal; - display: block; - line-height: 2; - opacity: 0.8; -} - -.textwidget > :last-child { - margin-bottom: 0; -} - -.textwidget a { - border-bottom: 1px solid #333; -} - -.textwidget a:hover, -.textwidget a:focus { - border-bottom: 0; -} - - -/** - * 12.0 Content - */ - -.secondary { - background-color: #fff; - display: none; - padding: 0 7.6923%; -} - -.secondary.toggled-on { - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - display: block; -} - -.widget-area { - margin: 9.09090% auto 0; -} - -.site-footer { - background-color: #fff; - border-top: 1px solid rgba(51, 51, 51, 0.1); - padding: 3.84615% 7.6923%; -} - - -/** - * 12.1 Posts and pages - */ - -.hentry { - background-color: #fff; - padding-top: 7.6923%; - position: relative; -} - -.hentry.has-post-thumbnail { - padding-top: 0; -} - -.hentry.sticky:not(.has-post-thumbnail) { - padding-top: -webkit-calc(7.6923% + 24px); - padding-top: calc(7.6923% + 24px); -} - -.hentry + .hentry { - border-top: 1px solid rgba(51, 51, 51, 0.1); -} - -.post-thumbnail { - border: 0; - display: block; - margin-bottom: 2.4em; -} -.post-thumbnail img { - display: block; - margin: 0 auto; -} - -a.post-thumbnail:hover, -a.post-thumbnail:focus { - opacity: 0.85; -} - -.entry-header { - padding: 0 7.6923%; -} - -.entry-title { - font-size: 26px; - font-size: 2.6rem; - line-height: 1.1538; - margin-bottom: 0.9231em; -} - -.entry-content, -.entry-summary { - padding: 0 7.6923% 7.6923%; -} - -.entry-content > :last-child, -.entry-summary > :last-child { - margin-bottom: 0; -} - -.entry-content, -.entry-summary, -.page-content, -.comment-content { - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; - word-wrap: break-word; -} - -.entry-content h1, -.entry-summary h1, -.page-content h1, -.comment-content h1 { - font-size: 26px; - font-size: 2.6rem; - line-height: 1.1538; - margin-top: 1.8462em; - margin-bottom: 0.9231em; -} - -.entry-content h2, -.entry-summary h2, -.page-content h2, -.comment-content h2 { - font-size: 22px; - font-size: 2.2rem; - line-height: 1.3636; - margin-top: 2.1818em; - margin-bottom: 1.0909em; -} - -.entry-content h3, -.entry-summary h3, -.page-content h3, -.comment-content h3 { - font-size: 18px; - font-size: 1.8rem; - line-height: 1.3333; - margin-top: 2.6667em; - margin-bottom: 1.3333em; -} - -.entry-content h4, -.entry-content h5, -.entry-content h6, -.entry-summary h4, -.entry-summary h5, -.entry-summary h6, -.page-content h4, -.page-content h5, -.page-content h6, -.comment-content h4, -.comment-content h5, -.comment-content h6 { - font-size: 15px; - font-size: 1.5rem; - line-height: 1.2; - margin-top: 3.2em; - margin-bottom: 1.6em; -} - -.entry-content h5, -.entry-content h6, -.entry-summary h5, -.entry-summary h6, -.page-content h5, -.page-content h6, -.comment-content h5, -.comment-content h6 { - letter-spacing: 0.1em; - text-transform: uppercase; -} - -.entry-content > h1:first-child, -.entry-content > h2:first-child, -.entry-content > h3:first-child, -.entry-content > h4:first-child, -.entry-content > h5:first-child, -.entry-content > h6:first-child, -.entry-summary > h1:first-child, -.entry-summary > h2:first-child, -.entry-summary > h3:first-child, -.entry-summary > h4:first-child, -.entry-summary > h5:first-child, -.entry-summary > h6:first-child, -.page-content > h1:first-child, -.page-content > h2:first-child, -.page-content > h3:first-child, -.page-content > h4:first-child, -.page-content > h5:first-child, -.page-content > h6:first-child, -.comment-content > h1:first-child, -.comment-content > h2:first-child, -.comment-content > h3:first-child, -.comment-content > h4:first-child, -.comment-content > h5:first-child, -.comment-content > h6:first-child { - margin-top: 0; -} - -.entry-content a, -.entry-summary a, -.page-content a, -.comment-content a, -.pingback .comment-body > a { - border-bottom: 1px solid #333; -} - -.entry-content a:hover, -.entry-content a:focus, -.entry-summary a:hover, -.entry-summary a:focus, -.page-content a:hover, -.page-content a:focus, -.comment-content a:hover, -.comment-content a:focus, -.pingback .comment-body > a:hover, -.pingback .comment-body > a:focus { - border-bottom: 0; -} - -.entry-content a img, -.entry-summary a img, -.page-content a img, -.comment-content a img { - display: block; -} - -.entry-content .more-link, -.entry-summary .more-link:after { - white-space: nowrap; -} - -.entry-content .more-link:after, -.entry-summary .more-link:after { - content: "\f429"; - font-size: 16px; - position: relative; - top: 5px; -} - -.author-info { - border-top: 1px solid #eaeaea; - border-top: 1px solid rgba(51, 51, 51, 0.1); - margin: 0 7.6923%; - padding: 7.6923% 0; -} - -.author-info .avatar { - float: left; - height: 36px; - margin: 0 1.6em 1.6em 0; - width: 36px; -} - -.author-heading { - color: #707070; - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - letter-spacing: 0.04em; - margin-bottom: 1.5em; - text-transform: uppercase; -} - -.author-title { - clear: none; -} - -.author-bio { - font-size: 12px; - font-size: 1.2rem; - line-height: 1.5; - overflow: hidden; - padding-bottom: 1px; -} - -.author-description { - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; - word-wrap: break-word; -} - -.author-description a { - border-bottom: 1px solid #333; -} - -.author-description a:hover, -.author-description a:focus { - border-bottom: 0; -} - -.author-description > :last-child { - margin-bottom: 0; -} - -.author-link { - white-space: nowrap; -} - -.author-link:after { - content: "\f429"; - position: relative; - top: 1px; -} - -.entry-footer { - background-color: #f7f7f7; - color: #707070; - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - line-height: 1.5; - padding: 3.8461% 7.6923%; -} - -.entry-footer a { - border-bottom: 1px solid transparent; - color: #707070; - color: rgba(51, 51, 51, 0.7); -} - -.entry-footer a:hover { - border-bottom: 1px solid #333; -} - -.entry-footer a:hover, -.entry-footer a:focus { - color: #333; -} - -.sticky-post { - background-color: #333; - color: #fff; - font-weight: 700; - letter-spacing: 0.04em; - padding: 0.25em 0.5em; - position: absolute; - top: 0; - text-transform: uppercase; -} - -.updated:not(.published) { - display: none; -} - -.sticky .posted-on { - display: none; -} - -.posted-on:before, -.byline:before, -.cat-links:before, -.tags-links:before, -.comments-link:before, -.entry-format:before, -.edit-link:before, -.full-size-link:before { - margin-right: 2px; - position: relative; -} - -.posted-on, -.byline, -.cat-links, -.tags-links, -.comments-link, -.entry-format, -.full-size-link { - margin-right: 1em; -} - -.format-aside .entry-format:before { - content: "\f101"; -} - -.format-image .entry-format:before { - content: "\f473"; -} - -.format-gallery .entry-format:before { - content: "\f103"; -} - -.format-video .entry-format:before { - content: "\f104"; -} - -.format-status .entry-format:before { - content: "\f105"; -} - -.format-quote .entry-format:before { - content: "\f106"; -} - -.format-link .entry-format:before { - content: "\f107"; -} - -.format-chat .entry-format:before { - content: "\f108"; -} - -.format-audio .entry-format:before { - content: "\f109"; -} - -.posted-on:before { - content: "\f307"; -} - -.byline:before { - content: "\f304"; -} - -.cat-links:before { - content: "\f301"; -} - -.tags-links:before { - content: "\f302"; -} - -.comments-link:before { - content: "\f300"; -} - -.full-size-link:before { - content: "\f402"; -} - -.edit-link:before { - content: "\f411"; -} - -.comments-link, -.edit-link { - white-space: nowrap; -} - -.page-header { - background-color: #fff; - border-bottom: 1px solid rgba(51, 51, 51, 0.1); - padding: 7.6923%; -} - -.page-title { - font-family: "Noto Serif", serif; - font-size: 18px; - font-size: 1.8rem; - line-height: 1.3333; -} - -.taxonomy-description { - color: #707070; - color: rgba(51, 51, 51, 0.7); - padding-top: 0.4em; -} - -.taxonomy-description a { - border-bottom: 1px solid #333; -} - -.taxonomy-description a:hover, -.taxonomy-description a:focus { - border-bottom: 0; -} - -.taxonomy-description > :last-child { - margin-bottom: 0; -} - -.page-content { - background-color: #fff; - padding: 7.6923%; -} - -.page-content > :last-child { - margin-bottom: 0; -} - -.page-links { - clear: both; - font-family: "Noto Sans", sans-serif; - margin-bottom: 1.3333em; -} - -.page-links a, -.page-links > span { - border: 1px solid #eaeaea; - border: 1px solid rgba(51, 51, 51, 0.1); - display: inline-block; - font-size: 12px; - font-size: 1.2rem; - height: 2em; - line-height: 2; - margin: 0 0.3333em 0.3333em 0; - text-align: center; - width: 2em; -} - -.page-links a { - -webkit-tap-highlight-color: rgba(255, 255, 255, 0.3); - background-color: #333; - border-color: #333; - color: #fff; -} - -.page-links a:hover, -.page-links a:focus { - background-color: #707070; - background-color: rgba(51, 51, 51, 0.7); - border-color: transparent; - color: #fff; -} - -.page-links > .page-links-title { - border: 0; - color: #707070; - color: rgba(51, 51, 51, 0.7); - height: auto; - margin: 0; - padding-right: 0.5em; - width: auto; -} - -.entry-attachment { - margin-bottom: 1.6em; -} - -.type-attachment .entry-title { - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; - word-wrap: break-word; -} - -.entry-caption { - color: #707070; - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; - line-height: 1.5; - padding-top: 0.5em; - word-wrap: break-word; -} - -.entry-caption > :last-child { - margin-bottom: 0; -} - - -/** - * 12.2 Post Formats - */ - -.format-aside .entry-title, -.format-image .entry-title, -.format-video .entry-title, -.format-quote .entry-title, -.format-gallery .entry-title, -.format-status .entry-title, -.format-link .entry-title, -.format-audio .entry-title, -.format-chat .entry-title { - font-size: 18px; - font-size: 1.8rem; - line-height: 1.3333; - margin-bottom: 1.3333em; -} - -.format-link .entry-title a:after { - content: "\f442"; - font-size: 24px; - height: 24px; - position: relative; - top: 0; - width: 24px; -} - -.blog .format-status .entry-title, -.archive .format-status .entry-title { - display: none; -} - - -/** - * 12.3 Comments - */ - -.comments-area { - background-color: #fff; - border-top: 1px solid #eaeaea; - border-top: 1px solid rgba(51, 51, 51, 0.1); - padding: 7.6923%; -} - -.comments-area > :last-child { - margin-bottom: 0; -} - -.comment-list + .comment-respond { - border-top: 1px solid #eaeaea; - border-top: 1px solid rgba(51, 51, 51, 0.1); -} - -.comment-list + .comment-respond, -.comment-navigation + .comment-respond { - padding-top: 1.6em; -} - -.comments-title, -.comment-reply-title { - font-family: "Noto Serif", serif; - font-size: 18px; - font-size: 1.8rem; - line-height: 1.3333; -} - -.comments-title { - margin-bottom: 1.3333em; -} - -.comment-list { - list-style: none; - margin: 0; -} - -.comment-list article, -.comment-list .pingback, -.comment-list .trackback { - border-top: 1px solid #eaeaea; - border-top: 1px solid rgba(51, 51, 51, 0.1); - padding: 1.6em 0; -} - -.comment-list .children { - list-style: none; - margin: 0; -} - -.comment-list .children > li { - padding-left: 0.8em; -} - -.comment-author { - color: #707070; - color: rgba(51, 51, 51, 0.7); - margin-bottom: 0.4em; -} - -.comment-author a:hover { - border-bottom: 1px solid #707070; - border-bottom: 1px solid rgba(51, 51, 51, 0.7); -} - -.comment-author .avatar { - float: left; - height: 24px; - margin-right: 0.8em; - width: 24px; -} - -.bypostauthor > article .fn:after { - content: "\f304"; - position: relative; - top: 5px; - left: 3px; -} - -.comment-metadata, -.pingback .edit-link { - color: #707070; - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - line-height: 1.5; -} - -.comment-metadata a, -.pingback .edit-link a { - color: #707070; - color: rgba(51, 51, 51, 0.7); -} - -.comment-metadata a:hover, -.pingback .edit-link a:hover { - border-bottom: 1px solid #333; -} - -.comment-metadata a:hover, -.comment-metadata a:focus, -.pingback .edit-link a:hover, -.pingback .edit-link a:focus { - color: #333; -} - -.comment-metadata { - margin-bottom: 1.6em; -} - -.comment-metadata .edit-link { - margin-left: 1em; -} - -.pingback .edit-link { - margin-left: 1em; -} - -.pingback .edit-link:before { - top: 5px; -} - -.comment-content ul, -.comment-content ol { - margin: 0 0 1.6em 1.3333em; -} - -.comment-content li > ul, -.comment-content li > ol { - margin-bottom: 0; -} - -.comment-content > :last-child { - margin-bottom: 0; -} - -.comment-list .reply { - font-size: 12px; - font-size: 1.2rem; -} - -.comment-list .reply a { - border: 1px solid #eaeaea; - border: 1px solid rgba(51, 51, 51, 0.1); - color: #707070; - color: rgba(51, 51, 51, 0.7); - display: inline-block; - font-family: "Noto Sans", sans-serif; - font-weight: 700; - line-height: 1; - margin-top: 2em; - padding: 0.4167em 0.8333em; - text-transform: uppercase; -} - -.comment-list .reply a:hover, -.comment-list .reply a:focus { - border-color: #333; - color: #333; - outline: 0; -} - -.comment-form { - padding-top: 1.6em; -} - -.comment-form label { - color: #707070; - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - font-weight: 700; - display: block; - letter-spacing: 0.04em; - line-height: 1.5; - text-transform: uppercase; -} - -.comment-form input[type="text"], -.comment-form input[type="email"], -.comment-form input[type="url"], -.comment-form input[type="submit"] { - width: 100%; -} - -.comment-notes, -.comment-awaiting-moderation, -.logged-in-as, -.form-allowed-tags { - color: #707070; - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - line-height: 1.5; - margin-bottom: 2em; -} - -.logged-in-as a:hover { - border-bottom: 1px solid #333; -} - -.no-comments { - border-top: 1px solid #eaeaea; - border-top: 1px solid rgba(51, 51, 51, 0.1); - color: #707070; - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; - font-weight: 700; - padding-top: 1.6em; -} - -.comment-navigation + .no-comments { - border-top: 0; -} - -.form-allowed-tags code { - font-family: Inconsolata, monospace; -} - -.form-submit { - margin-bottom: 0; -} - -.required { - color: #c0392b; -} - -.comment-reply-title small { - font-size: 100%; -} - -.comment-reply-title small a { - border: 0; - float: right; - height: 32px; - overflow: hidden; - width: 26px; -} - -.comment-reply-title small a:before { - content: "\f405"; - font-size: 32px; - position: relative; - top: -3px; -} - - -/** - * 13.0 Footer - */ - -.site-info { - color: #707070; - color: rgba(51, 51, 51, 0.7); - font-size: 12px; - font-size: 1.2rem; - line-height: 1.5; -} - -.site-info a { - border-bottom: 1px solid transparent; - color: #707070; - color: rgba(51, 51, 51, 0.7); -} - -.site-info a:hover { - border-bottom: 1px solid #333; -} - -.site-info a:hover, -.site-info a:focus { - color: #333; -} - - -/** - * 14.0 Media - */ - -.site .avatar { - border-radius: 50%; -} - -.page-content img.wp-smiley, -.entry-content img.wp-smiley, -.comment-content img.wp-smiley { - border: none; - margin-top: 0; - margin-bottom: 0; - padding: 0; -} - -audio, -canvas { - display: inline-block; -} - -embed, -iframe, -object, -video { - margin-bottom: 1.6em; - max-width: 100%; - vertical-align: middle; -} - -p > embed, -p > iframe, -p > object, -p > video { - margin-bottom: 0; -} - -.wp-audio-shortcode, -.wp-video, -.wp-playlist.wp-audio-playlist { - font-size: 15px; - font-size: 1.5rem; - margin-top: 0; - margin-bottom: 1.6em; -} - -.wp-playlist.wp-playlist { - padding-bottom: 0; -} - -.wp-playlist .wp-playlist-tracks { - margin-top: 0; -} - -.wp-playlist-item .wp-playlist-caption { - border-bottom: 0; - padding: 10px 0; -} - -.wp-playlist-item .wp-playlist-item-length { - top: 10px; -} - - -/** - * 14.1 Captions - */ - -.wp-caption { - margin-bottom: 1.6em; - max-width: 100%; -} - -.wp-caption img[class*="wp-image-"] { - display: block; - margin: 0; -} - -.wp-caption-text { - color: #707070; - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - line-height: 1.5; - padding: 0.5em 0; -} - - -/** - * 14.2 Galleries - */ - -.gallery { - margin-bottom: 1.6em; -} - -.gallery-item { - display: inline-block; - padding: 1.79104477%; - text-align: center; - vertical-align: top; - width: 100%; -} - -.gallery-columns-2 .gallery-item { - max-width: 50%; -} - -.gallery-columns-3 .gallery-item { - max-width: 33.33%; -} - -.gallery-columns-4 .gallery-item { - max-width: 25%; -} - -.gallery-columns-5 .gallery-item { - max-width: 20%; -} - -.gallery-columns-6 .gallery-item { - max-width: 16.66%; -} - -.gallery-columns-7 .gallery-item { - max-width: 14.28%; -} - -.gallery-columns-8 .gallery-item { - max-width: 12.5%; -} - -.gallery-columns-9 .gallery-item { - max-width: 11.11%; -} - -.gallery-icon img { - margin: 0 auto; -} - -.gallery-caption { - color: #707070; - color: rgba(51, 51, 51, 0.7); - display: block; - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - line-height: 1.5; - padding: 0.5em 0; -} - -.gallery-columns-6 .gallery-caption, -.gallery-columns-7 .gallery-caption, -.gallery-columns-8 .gallery-caption, -.gallery-columns-9 .gallery-caption { - display: none; -} - - -/** - * 15.0 Multisite - */ - -.widecolumn { - background-color: #fff; - padding: 7.6923%; -} - -.widecolumn .mu_register { - width: auto; -} - -.widecolumn .mu_alert { - margin-bottom: 1.6em; -} - -.widecolumn form, -.widecolumn .mu_register form { - margin-top: 0; -} - -.widecolumn h2 { - font-size: 26px; - font-size: 2.6rem; - line-height: 1.1538; - margin-bottom: 0.9231em; -} - -.widecolumn p { - margin: 1.6em 0; -} - -.widecolumn p + h2 { - margin-top: 1.8462em; -} - -.widecolumn label, -.widecolumn .mu_register label { - color: #707070; - color: rgba(51, 51, 51, 0.7); - font-family: "Noto Sans", sans-serif; - font-size: 12px; - font-size: 1.2rem; - font-weight: 700; - letter-spacing: 0.04em; - line-height: 1.5; - text-transform: uppercase; -} - -.widecolumn .mu_register label { - margin: 2em 0 0; -} - -.widecolumn #key, -.widecolumn .mu_register #blog_title, -.widecolumn .mu_register #user_email, -.widecolumn .mu_register #blogname, -.widecolumn .mu_register #user_name { - font-size: 16px; - font-size: 1.6rem; - width: 100%; -} - -.widecolumn .mu_register #blogname { - margin: 0; -} - -.widecolumn .mu_register #blog_title, -.widecolumn .mu_register #user_email, -.widecolumn .mu_register #user_name { - margin: 0 0 0.375em; -} - -.widecolumn #submit, -.widecolumn .mu_register input[type="submit"] { - font-size: 12px; - font-size: 1.2rem; - margin: 0; - width: 100%; -} - -.widecolumn .mu_register .prefix_address, -.widecolumn .mu_register .suffix_address { - font-size: inherit; -} - -.widecolumn .mu_register > :last-child, -.widecolumn form > :last-child { - margin-bottom: 0; -} - - -/** - * 16.0 Media Queries - */ - -/* - * Does the same thing as , - * but in the future W3C standard way. -ms- prefix is required for IE10+ to - * render responsive styling in Windows 8 "snapped" views; IE10+ does not honor - * the meta tag. See https://core.trac.wordpress.org/ticket/25888. - */ -@-ms-viewport { - width: device-width; -} - -@viewport { - width: device-width; -} - -/** - * 16.1 Mobile Large 620px - */ - -@media screen and (min-width: 38.75em) { - ul, - ol { - margin-left: 0; - } - - li > ul, - li > ol, - blockquote > ul, - blockquote > ol { - margin-left: 1.3333em; - } - - blockquote { - margin-left: -1em; - } - - blockquote > blockquote { - margin-left: 0; - } - - .site-branding { - min-height: 3.2em; - } - - .site-title { - font-size: 22px; - font-size: 2.2rem; - line-height: 1.0909; - } - - .site-description { - display: block; - } - - .secondary { - box-shadow: 0 0 1px rgba(0, 0, 0, 0.15); - margin: 7.6923% 7.6923% 0; - padding: 7.6923% 7.6923% 0; - } - - .main-navigation { - margin-bottom: 11.1111%; - } - - .main-navigation ul { - border-top: 1px solid rgba(51, 51, 51, 0.1); - border-bottom: 1px solid rgba(51, 51, 51, 0.1); - } - - .main-navigation ul ul { - border-top: 0; - border-bottom: 0; - } - - .social-navigation { - margin-bottom: 11.1111%; - } - - .social-navigation { - margin-top: 0; - } - - .widget-area { - margin-top: 0; - } - - .widget { - margin-bottom: 11.1111%; - } - - .site-main { - padding: 7.6923% 0; - } - - .hentry.sticky:not(.has-post-thumbnail) { - padding-top: inherit; - } - - .hentry, - .page-header, - .page-content { - box-shadow: 0 0 1px rgba(0, 0, 0, 0.15); - margin: 0 7.6923%; - } - - .hentry + .hentry, - .page-header + .hentry, - .page-header + .page-content { - margin-top: 7.6923%; - } - - .hentry + .hentry { - border-top: 0; - } - - .post-thumbnail { - margin-bottom: 2.4em; - } - - .entry-header { - padding: 0 9.0909%; - } - - .entry-content, - .entry-summary { - padding: 0 9.0909% 9.0909%; - } - - .entry-footer { - padding: 4.5454% 9.0909%; - } - - .page-header { - border-bottom: 0; - border-left: 7px solid #333; - padding: 3.8461% 7.6923%; - } - - .page-title, - .taxonomy-description { - margin-left: -7px; - } - - .page-content { - padding: 9.0909%; - } - - .site-footer { - border-top: 0; - box-shadow: 0 0 1px rgba(0, 0, 0, 0.15); - margin: 0 7.6923%; - padding: 3.84615% 7.6923%; - } - - .post-navigation { - border-top: 0; - box-shadow: 0 0 1px rgba(0, 0, 0, 0.15); - margin: 7.6923% 7.6923% 0; - } - - .post-navigation a { - padding: 4.5454% 9.0909%; - } - - .pagination { - border-top: 0; - box-shadow: 0 0 1px rgba(0, 0, 0, 0.15); - margin: 7.6923% 7.6923% 0; - padding: 0; - } - - /* restore screen-reader-text */ - .pagination .current .screen-reader-text { - position: absolute !important; - } - - .pagination .page-numbers { - display: inline-block; - } - - .image-navigation { - padding: 0 9.0909%; - } - - .comments-area { - border-top: 0; - box-shadow: 0 0 1px rgba(0, 0, 0, 0.15); - margin: 7.6923% 7.6923% 0; - } - - .comment-content ul, - .comment-content ol { - margin-left: 0; - } - - .comment-content li > ul, - .comment-content li > ol, - .comment-content blockquote > ul, - .comment-content blockquote > ol { - margin-left: 1.3333em; - } - - .widecolumn { - box-shadow: 0 0 1px rgba(0, 0, 0, 0.15); - margin: 7.6923%; - } -} - - -/** - * 16.2 Tablet Small 740px - */ - -@media screen and (min-width: 46.25em) { - body, - button, - input, - select, - textarea { - font-size: 17px; - font-size: 1.7rem; - line-height: 1.6471; - } - - button, - input { - line-height: normal; - } - - p, - address, - pre, - hr, - ul, - ol, - dl, - dd, - table { - margin-bottom: 1.6471em; - } - - blockquote { - font-size: 20px; - font-size: 2rem; - line-height: 1.75; - margin-bottom: 1.75em; - margin-left: -1.05em; - padding-left: 0.85em; - } - - blockquote p { - margin-bottom: 1.75em; - } - - blockquote cite, - blockquote small { - font-size: 17px; - font-size: 1.7rem; - line-height: 1.6471; - } - - pre { - line-height: 1.2353; - } - - button, - input[type="button"], - input[type="reset"], - input[type="submit"], - .post-password-form input[type="submit"], - .widecolumn #submit, - .widecolumn .mu_register input[type="submit"] { - font-size: 14px; - font-size: 1.4rem; - padding: 0.8214em 1.6429em; - } - - input[type="text"], - input[type="email"], - input[type="url"], - input[type="password"], - input[type="search"], - textarea { - padding: 0.5em; - } - - .main-navigation { - font-size: 14px; - font-size: 1.4rem; - line-height: 1.5; - } - - .main-navigation a { - padding: 1em 0; - } - - .main-navigation ul ul { - margin-left: 1em; - } - - .main-navigation .menu-item-description { - font-size: 14px; - font-size: 1.4rem; - line-height: 1.5; - } - - .social-navigation ul { - margin-bottom: -1.4706em; - } - - .social-navigation a { - height: 2.8824em; - width: 2.8824em; - } - - .secondary-toggle { - height: 56px; - width: 56px; - } - - .secondary-toggle:before { - line-height: 54px; - width: 54px; - } - - .post-password-form label, - .post-navigation .meta-nav, - .image-navigation, - .comment-navigation, - .author-heading, - .author-bio, - .entry-footer, - .page-links a, - .page-links span, - .comment-metadata, - .pingback .edit-link, - .comment-list .reply, - .comment-notes, - .comment-awaiting-moderation, - .logged-in-as, - .comment-form label, - .form-allowed-tags, - .site-info, - .wp-caption-text, - .gallery-caption, - .entry-caption, - .widecolumn label, - .widecolumn .mu_register label { - font-size: 14px; - font-size: 1.4rem; - } - - .pagination .nav-links { - min-height: 3.2941em; - } - - .pagination .page-numbers { - line-height: 3.2941em; - padding: 0 0.8235em; - } - - .pagination .prev, - .pagination .next { - height: 56px; - padding: 0; - width: 56px; - } - - .pagination .prev:before, - .pagination .next:before { - height: 56px; - line-height: 56px; - width: 56px; - } - - .image-navigation .nav-previous a:before, - .image-navigation .nav-next a:after, - .comment-navigation .nav-previous a:before, - .comment-navigation .nav-next a:after { - top: 2px; - } - - blockquote.alignleft, - .wp-caption.alignleft, - img.alignleft { - margin: 0.4118em 1.6471em 1.6471em 0; - } - - blockquote.alignright, - .wp-caption.alignright, - img.alignright { - margin: 0.4118em 0 1.6471em 1.6471em; - } - - blockquote.aligncenter, - .wp-caption.aligncenter, - img.aligncenter { - margin-top: 0.4118em; - margin-bottom: 1.6471em; - } - - .wp-caption.alignleft, - .wp-caption.alignright, - .wp-caption.aligncenter { - margin-bottom: 1.2353em; - } - - .site-branding { - min-height: 3.7059em; - padding-right: 66px; - } - - .site-title { - font-size: 29px; - font-size: 2.9rem; - line-height: 1.2069; - } - - .custom-logo { - max-height: 105px; - } - - .wp-custom-logo .site-title { - margin-top: 0.482758621em; - } - - .site-description { - font-size: 14px; - font-size: 1.4rem; - } - - .widget { - font-size: 14px; - font-size: 1.4rem; - line-height: 1.5; - } - - .widget p, - .widget address, - .widget hr, - .widget ul, - .widget ol, - .widget dl, - .widget dd, - .widget table, - .widget pre { - margin-bottom: 1.5em; - } - - .widget li > ul, - .widget li > ol { - margin-bottom: 0; - } - - .widget blockquote { - font-size: 17px; - font-size: 1.7rem; - line-height: 1.6471; - margin-bottom: 1.6471em; - margin-left: -1.2353em; - padding-left: 1em; - } - - .widget blockquote p { - margin-bottom: 1.6471em; - } - - .widget blockquote cite, - .widget blockquote small { - font-size: 14px; - font-size: 1.4rem; - line-height: 1.5; - } - - .widget blockquote > blockquote { - margin-left: 0; - } - - .widget pre { - line-height: 1.5; - padding: 0.75em; - } - - .widget button, - .widget input, - .widget select, - .widget textarea { - line-height: 1.75; - } - - .widget button, - .widget input { - line-height: normal; - } - - .widget button, - .widget input[type="button"], - .widget input[type="reset"], - .widget input[type="submit"] { - font-size: 14px; - font-size: 1.4rem; - padding: 0.8214em 1.6429em; - } - - .widget input[type="text"], - .widget input[type="email"], - .widget input[type="url"], - .widget input[type="password"], - .widget input[type="search"], - .widget textarea { - padding: 0.5625em; - } - - .widget blockquote.alignleft, - .widget .wp-caption.alignleft, - .widget img.alignleft { - margin: 0.5em 1.5em 1.5em 0; - } - - .widget blockquote.alignright, - .widget .wp-caption.alignright, - .widget img.alignright { - margin: 0.5em 0 1.5em 1.5em; - } - - .widget blockquote.aligncenter, - .widget .wp-caption.aligncenter, - .widget img.aligncenter { - margin-top: 0.5em; - margin-bottom: 1.5em; - } - - .widget .wp-caption.alignleft, - .widget .wp-caption.alignright, - .widget .wp-caption.aligncenter { - margin-bottom: 1em; - } - - .widget-title { - margin: 0 0 1.5em; - } - - .widget_calendar td, - .widget_calendar th { - line-height: 2.9286; - } - - .widget_calendar caption { - margin: 0 0 1.5em; - } - - .widget_archive li, - .widget_categories li, - .widget_links li, - .widget_meta li, - .widget_nav_menu li, - .widget_pages li, - .widget_recent_comments li, - .widget_recent_entries li { - padding: 0.9643em 0; - } - - .widget_categories .children, - .widget_nav_menu .sub-menu, - .widget_pages .children { - margin: 0.9643em 0 0 1em; - padding-top: 0.9643em; - } - - .widget_rss li { - margin-bottom: 1.5em; - } - - .widget_rss .rss-date, - .widget_rss cite { - line-height: 1.75; - } - - .post-thumbnail { - margin-bottom: 3em; - } - - .entry-title, - .widecolumn h2 { - font-size: 35px; - font-size: 3.5rem; - line-height: 1.2; - margin-bottom: 1.2em; - } - - .entry-content h1, - .entry-summary h1, - .page-content h1, - .comment-content h1 { - font-size: 35px; - font-size: 3.5rem; - line-height: 1.2; - margin-top: 1.6em; - margin-bottom: 0.8em; - } - - .entry-content h2, - .entry-summary h2, - .page-content h2, - .comment-content h2 { - font-size: 29px; - font-size: 2.9rem; - line-height: 1.2069; - margin-top: 1.931em; - margin-bottom: 0.9655em; - } - - .entry-content h3, - .entry-summary h3, - .page-content h3, - .comment-content h3 { - font-size: 24px; - font-size: 2.4rem; - line-height: 1.1667; - margin-top: 2.3333em; - margin-bottom: 1.1667em; - } - - .entry-content h4, - .entry-summary h4, - .page-content h4, - .comment-content h4 { - font-size: 20px; - font-size: 2rem; - line-height: 1.4; - margin-top: 2.8em; - margin-bottom: 1.4em; - } - - .entry-content h5, - .entry-content h6, - .entry-summary h5, - .entry-summary h6, - .page-content h5, - .page-content h6, - .comment-content h5, - .comment-content h6 { - font-size: 17px; - font-size: 1.7rem; - line-height: 1.2353; - margin-top: 3.2941em; - margin-bottom: 1.6471em; - } - - .entry-content .more-link:after, - .entry-summary .more-link:after { - font-size: 24px; - top: 2px; - } - - .author-info { - margin: 0 9.0909%; - padding: 9.0909% 0; - } - - .author-info .avatar { - height: 42px; - margin: 0 1.6471em 1.6471em 0; - width: 42px; - } - - .author-link:after { - top: 3px; - } - - .posted-on:before, - .byline:before, - .cat-links:before, - .tags-links:before, - .comments-link:before, - .entry-format:before, - .edit-link:before, - .full-size-link:before { - top: 3px; - } - - .taxonomy-description { - padding-top: 0.4118em; - } - - .page-title, - .comments-title, - .comment-reply-title, - .post-navigation .post-title { - font-size: 24px; - font-size: 2.4rem; - line-height: 1.1667; - } - - .page-links { - margin-bottom: 1.4117em; - } - - .page-links a, - .page-links > span { - margin: 0 0.2857em 0.2857em 0; - } - - .entry-attachment { - margin-bottom: 1.6471em; - } - - .format-aside .entry-title, - .format-image .entry-title, - .format-video .entry-title, - .format-quote .entry-title, - .format-gallery .entry-title, - .format-status .entry-title, - .format-link .entry-title, - .format-audio .entry-title, - .format-chat .entry-title { - font-size: 20px; - font-size: 2rem; - line-height: 1.4; - margin-bottom: 1.4em; - } - - .format-link .entry-title a:after { - top: 0.0833em; - } - - .comments-title { - margin-bottom: 1.4em; - } - - .comment-list article, - .comment-list .pingback, - .comment-list .trackback { - padding: 1.6471em 0; - } - - .comment-list + .comment-respond, - .comment-navigation + .comment-respond { - padding-top: 1.6471em; - } - - .comment-list .children > li { - padding-left: 1.2353em; - } - - .comment-meta { - position: relative; - } - - .comment-author { - margin-bottom: 0; - } - - .comment-author .avatar { - height: 42px; - margin-right: 1.64705em; - position: relative; - top: 5px; - width: 42px; - } - - .comment-metadata .edit-link:before { - top: 2px; - } - - .pingback .edit-link:before { - top: 6px; - } - - .bypostauthor > article .fn:after { - top: 7px; - left: 6px; - } - - .comment-content ul, - .comment-content ol { - margin-bottom: 1.6471em; - } - - .comment-list .reply a { - padding: 0.4286em 0.8571em; - } - - .comment-form, - .no-comments { - padding-top: 1.6471em; - } - - .comment-reply-title small a:before { - top: -1px; - } - - embed, - iframe, - object, - video { - margin-bottom: 1.6471em; - } - - .wp-audio-shortcode, - .wp-video, - .wp-playlist.wp-audio-playlist { - font-size: 17px; - font-size: 1.7rem; - margin-bottom: 1.6471em; - } - - .wp-caption, - .gallery { - margin-bottom: 1.6471em; - } - - .widecolumn .mu_alert { - margin-bottom: 1.6471em; - } - - .widecolumn p { - margin: 1.6471em 0; - } - - .widecolumn p + h2 { - margin-top: 1.6em; - } - - .widecolumn #key, - .widecolumn .mu_register #blog_title, - .widecolumn .mu_register #user_email, - .widecolumn .mu_register #blogname, - .widecolumn .mu_register #user_name { - font-size: 17px; - font-size: 1.7rem; - line-height: normal; - } - - .widecolumn .mu_register #blog_title, - .widecolumn .mu_register #user_email, - .widecolumn .mu_register #user_name { - margin: 0 0 0.4117em; - } -} - - -/** - * 16.3 Tablet Large 880px - */ - -@media screen and (min-width: 55em) { - body, - button, - input, - select, - textarea { - font-size: 19px; - font-size: 1.9rem; - line-height: 1.6842; - } - - button, - input { - line-height: normal; - } - - p, - address, - pre, - hr, - ul, - ol, - dl, - dd, - table { - margin-bottom: 1.6842em; - } - - blockquote { - font-size: 22px; - font-size: 2.2rem; - line-height: 1.8182; - margin-bottom: 1.8182em; - margin-left: -1.0909em; - padding-left: 0.9091em; - } - - blockquote p { - margin-bottom: 1.8182em; - } - - blockquote cite, - blockquote small { - font-size: 19px; - font-size: 1.9rem; - line-height: 1.6842; - } - - pre { - line-height: 1.2632; - } - - button, - input[type="button"], - input[type="reset"], - input[type="submit"], - .post-password-form input[type="submit"], - .widecolumn #submit, - .widecolumn .mu_register input[type="submit"] { - font-size: 16px; - font-size: 1.6rem; - padding: 0.8125em 1.625em; - } - - input[type="text"], - input[type="email"], - input[type="url"], - input[type="password"], - input[type="search"], - textarea { - padding: 0.5278em; - } - - .main-navigation { - font-size: 16px; - font-size: 1.6rem; - line-height: 1.5; - } - - .main-navigation a { - padding: 0.75em 0; - } - - .main-navigation .menu-item-description { - font-size: 16px; - font-size: 1.6rem; - line-height: 1.5; - } - - .social-navigation ul { - margin-bottom: -1.2632em; - } - - .social-navigation a { - height: 2.5263em; - width: 2.5263em; - } - - .secondary-toggle { - height: 64px; - width: 64px; - } - - .secondary-toggle:before { - line-height: 62px; - width: 62px; - } - - .post-password-form label, - .post-navigation .meta-nav, - .comment-navigation, - .image-navigation, - .author-heading, - .author-bio, - .entry-footer, - .page-links a, - .page-links span, - .comment-metadata, - .pingback .edit-link, - .comment-list .reply, - .comment-notes, - .comment-awaiting-moderation, - .logged-in-as, - .comment-form label, - .form-allowed-tags, - .site-info, - .wp-caption-text, - .gallery-caption, - .entry-caption, - .widecolumn label, - .widecolumn .mu_register label { - font-size: 16px; - font-size: 1.6rem; - } - - .pagination .nav-links { - min-height: 3.3684em; - } - - .pagination .page-numbers { - line-height: 3.3684em; - padding: 0 0.8421em; - } - - .pagination .prev, - .pagination .next { - height: 64px; - padding: 0; - width: 64px; - } - - .pagination .prev:before, - .pagination .next:before { - height: 64px; - line-height: 64px; - width: 64px; - } - - .image-navigation .nav-previous a:before, - .image-navigation .nav-next a:after, - .comment-navigation .nav-previous a:before, - .comment-navigation .nav-next a:after { - font-size: 24px; - top: -1px; - } - - blockquote.alignleft, - .wp-caption.alignleft, - img.alignleft { - margin: 0.4211em 1.6842em 1.6842em 0; - } - - blockquote.alignright, - .wp-caption.alignright, - img.alignright { - margin: 0.4211em 0 1.6842em 1.6842em; - } - - blockquote.aligncenter, - .wp-caption.aligncenter, - img.aligncenter { - margin-top: 0.4211em; - margin-bottom: 1.6842em; - } - - .wp-caption.alignleft, - .wp-caption.alignright, - .wp-caption.aligncenter { - margin-bottom: 1.2632em; - } - - .site-branding { - min-height: 3.7895em; - padding-right: 74px; - } - - .site-title { - font-size: 32px; - font-size: 3.2rem; - line-height: 1.25; - } - - .custom-logo { - max-height: 104px; - } - - .wp-custom-logo .site-title { - margin-top: 0.5em; - } - - .site-description { - font-size: 16px; - font-size: 1.6rem; - } - - .widget { - font-size: 16px; - font-size: 1.6rem; - } - - .widget blockquote { - font-size: 19px; - font-size: 1.9rem; - line-height: 1.6842; - margin-bottom: 1.6842em; - margin-left: -1.2632em; - padding-left: 1.0526em; - } - - .widget blockquote p { - margin-bottom: 1.6842em; - } - - .widget blockquote cite, - .widget blockquote small { - font-size: 16px; - font-size: 1.6rem; - } - - .widget button, - .widget input, - .widget select, - .widget textarea { - line-height: 1.5; - } - - .widget button, - .widget input { - line-height: normal; - } - - .widget button, - .widget input[type="button"], - .widget input[type="reset"], - .widget input[type="submit"] { - font-size: 16px; - font-size: 1.6rem; - padding: 0.8125em 1.625em; - } - - .widget input[type="text"], - .widget input[type="email"], - .widget input[type="url"], - .widget input[type="password"], - .widget input[type="search"], - .widget textarea { - padding: 0.75em; - } - - .widget .wp-caption-text, - .widget .gallery-caption { - line-height: 1.5; - } - - .widget_calendar td, - .widget_calendar th { - line-height: 2.9375; - } - - .widget_archive li, - .widget_categories li, - .widget_links li, - .widget_meta li, - .widget_nav_menu li, - .widget_pages li, - .widget_recent_comments li, - .widget_recent_entries li { - padding: 0.7188em 0; - } - - .widget_categories .children, - .widget_nav_menu .sub-menu, - .widget_pages .children { - margin: 0.7188em 0 0 1em; - padding-top: 0.7188em; - } - - .widget_rss .rss-date, - .widget_rss cite { - font-size: 13px; - font-size: 1.3rem; - line-height: 1.8462; - } - - .post-thumbnail { - margin-bottom: 2.9474em; - } - - .entry-title, - .widecolumn h2 { - font-size: 39px; - font-size: 3.9rem; - line-height: 1.2308; - margin-bottom: 1.2308em; - } - - .entry-content h1, - .entry-summary h1, - .page-content h1, - .comment-content h1 { - font-size: 39px; - font-size: 3.9rem; - line-height: 1.2308; - margin-top: 1.641em; - margin-bottom: 0.8205em; - } - - .entry-content h2, - .entry-summary h2, - .page-content h2, - .comment-content h2 { - font-size: 32px; - font-size: 3.2rem; - line-height: 1.25; - margin-top: 2em; - margin-bottom: 1em; - } - - .entry-content h3, - .entry-summary h3, - .page-content h3, - .comment-content h3 { - font-size: 27px; - font-size: 2.7rem; - line-height: 1.1852; - margin-top: 2.3704em; - margin-bottom: 1.1852em; - } - - .entry-content h4, - .entry-summary h4, - .page-content h4, - .comment-content h4 { - font-size: 22px; - font-size: 2.2rem; - line-height: 1.4545; - margin-top: 2.9091em; - margin-bottom: 1.4545em; - } - - .entry-content h5, - .entry-content h6, - .entry-summary h5, - .entry-summary h6, - .page-content h5, - .page-content h6, - .comment-content h5, - .comment-content h6 { - font-size: 19px; - font-size: 1.9rem; - line-height: 1.2632; - margin-top: 3.3684em; - margin-bottom: 1.6842em; - } - - .entry-content .more-link:after, - .entry-summary .more-link:after { - top: 3px; - } - - .author-info .avatar { - height: 56px; - margin: 0 1.6842em 1.6842em 0; - width: 56px; - } - - .author-link:after { - font-size: 24px; - top: 0; - } - - .posted-on:before, - .byline:before, - .cat-links:before, - .tags-links:before, - .comments-link:before, - .entry-format:before, - .edit-link:before, - .full-size-link:before { - top: 4px; - } - - .taxonomy-description { - padding-top: 0.4211em; - } - - .page-title, - .comments-title, - .comment-reply-title, - .post-navigation .post-title { - font-size: 27px; - font-size: 2.7rem; - line-height: 1.1852; - } - - .page-links { - margin-bottom: 1.4736em; - } - - .page-links a, - .page-links > span { - margin: 0 0.25em 0.25em 0; - } - - .entry-attachment { - margin-bottom: 1.6842em - } - - .format-aside .entry-title, - .format-image .entry-title, - .format-video .entry-title, - .format-quote .entry-title, - .format-gallery .entry-title, - .format-status .entry-title, - .format-link .entry-title, - .format-audio .entry-title, - .format-chat .entry-title { - font-size: 22px; - font-size: 2.2rem; - line-height: 1.4545; - margin-bottom: 1.4545em; - } - - .format-link .entry-title a:after { - top: 0.125em; - } - - .comments-title { - margin-bottom: 1.4545em; - } - - .comment-list article, - .comment-list .pingback, - .comment-list .trackback { - padding: 1.6842em 0; - } - - .comment-list + .comment-respond, - .comment-navigation + .comment-respond { - padding-top: 1.6842em; - } - - .comment-list .children > li { - padding-left: 1.4737em; - } - - .comment-author .avatar { - height: 56px; - margin-right: 1.6842em; - top: 3px; - width: 56px; - } - - .comment-metadata { - line-height: 2; - } - - .comment-metadata .edit-link:before { - top: 8px; - } - - .pingback .edit-link:before { - top: 8px; - } - - .bypostauthor > article .fn:after { - top: 8px; - } - - .comment-content ul, - .comment-content ol { - margin-bottom: 1.6842em; - } - - .comment-list .reply a { - padding: 0.4375em 0.875em; - } - - .comment-form, - .no-comments { - padding-top: 1.6842em; - } - - embed, - iframe, - object, - video { - margin-bottom: 1.6842em; - } - - .wp-audio-shortcode, - .wp-video, - .wp-playlist.wp-audio-playlist { - font-size: 19px; - font-size: 1.9rem; - margin-bottom: 1.6842em; - } - - .wp-caption, - .gallery { - margin-bottom: 1.6842em; - } - - .widecolumn .mu_alert { - margin-bottom: 1.6842em; - } - - .widecolumn p { - margin: 1.6842em 0; - } - - .widecolumn p + h2 { - margin-top: 1.641em; - } - - .widecolumn #key, - .widecolumn .mu_register #blog_title, - .widecolumn .mu_register #user_email, - .widecolumn .mu_register #blogname, - .widecolumn .mu_register #user_name { - font-size: 19px; - font-size: 1.9rem; - } - - .widecolumn .mu_register #blog_title, - .widecolumn .mu_register #user_email, - .widecolumn .mu_register #user_name { - margin: 0 0 0.421em; - } -} - - -/** - * 16.4 Desktop Small 955px - */ - -@media screen and (min-width: 59.6875em) { - body:before { - background-color: #fff; - box-shadow: 0 0 1px rgba(0, 0, 0, 0.15); - content: ""; - display: block; - height: 100%; - min-height: 100%; - position: fixed; - top: 0; - left: 0; - width: 29.4118%; - z-index: 0; /* Fixes flashing bug with scrolling on Safari */ - } - - .site { - margin: 0 auto; - max-width: 1403px; - } - - .sidebar { - float: left; - margin-right: -100%; - max-width: 413px; - position: relative; - width: 29.4118%; - } - - .secondary { - background-color: transparent; - box-shadow: none; - display: block; - margin: 0; - padding: 0; - } - - .site-main { - padding: 8.3333% 0; - } - - .site-content { - display: block; - float: left; - margin-left: 29.4118%; - width: 70.5882%; - } - - body { - font-size: 15px; - font-size: 1.5rem; - line-height: 1.6; - } - - p, - address, - pre, - hr, - ul, - ol, - dl, - dd, - table { - margin-bottom: 1.6em; - } - - blockquote { - font-size: 18px; - font-size: 1.8rem; - line-height: 1.6667; - margin-bottom: 1.6667em; - margin-left: -1.3333em; - padding-left: 1.1111em; - } - - blockquote cite, - blockquote small { - font-size: 15px; - font-size: 1.5rem; - line-height: 1.6; - } - - pre { - line-height: 1.2; - } - - button, - input, - select, - textarea { - font-size: 16px; - font-size: 1.6rem; - line-height: 1.5; - } - - button, - input { - line-height: normal; - } - - button, - input[type="button"], - input[type="reset"], - input[type="submit"], - .post-password-form input[type="submit"], - .widecolumn #submit, - .widecolumn .mu_register input[type="submit"] { - font-size: 12px; - font-size: 1.2rem; - padding: 0.7917em 1.5833em; - } - - input[type="text"], - input[type="email"], - input[type="url"], - input[type="password"], - input[type="search"], - textarea { - padding: 0.375em; - } - - .main-navigation { - font-size: 12px; - font-size: 1.2rem; - margin: 0 20% 20%; - } - - .main-navigation a { - padding: 0.5em 0; - } - - .main-navigation .menu-item-has-children > a { - padding-right: 30px; - } - - .main-navigation .menu-item-description { - font-size: 12px; - font-size: 1.2rem; - line-height: 1.5; - } - - .dropdown-toggle { - height: 24px; - width: 24px; - } - - .dropdown-toggle:after { - font-size: 16px; - line-height: 24px; - width: 24px; - } - - .social-navigation { - margin: 0 20% 20%; - } - - .social-navigation ul { - margin-bottom: -1.6em; - } - - .social-navigation li { - width: 25%; - } - - .social-navigation a { - height: 3.2em; - } - - .secondary-toggle { - display: none; - } - - .post-password-form label, - .post-navigation .meta-nav, - .comment-navigation, - .image-navigation, - .author-heading, - .author-bio, - .entry-footer, - .page-links a, - .page-links span, - .comment-metadata, - .pingback .edit-link, - .comment-list .reply, - .comment-notes, - .comment-awaiting-moderation, - .logged-in-as, - .comment-form label, - .form-allowed-tags, - .site-info, - .wp-caption-text, - .gallery-caption, - .entry-caption, - .widecolumn label, - .widecolumn .mu_register label { - font-size: 12px; - font-size: 1.2rem; - } - - .post-navigation { - margin: 8.3333% 8.3333% 0; - } - - .post-navigation a { - padding: 5% 10%; - } - - .pagination { - margin: 8.333% 8.333% 0; - } - - .pagination .nav-links { - min-height: 3.2em; - } - - .pagination .page-numbers { - line-height: 3.2em; - padding: 0 0.8em; - } - - .pagination .prev, - .pagination .next { - height: 48px; - padding: 0; - width: 48px; - } - - .pagination .prev:before, - .pagination .next:before { - height: 48px; - line-height: 48px; - width: 48px; - } - - .image-navigation .nav-previous a:before, - .image-navigation .nav-next a:after, - .comment-navigation .nav-previous a:before, - .comment-navigation .nav-next a:after { - font-size: 16px; - top: 0; - } - - .image-navigation { - padding: 0 10%; - } - - blockquote.alignleft, - .wp-caption.alignleft, - img.alignleft { - margin: 0.4em 1.6em 1.6em 0; - } - - blockquote.alignright, - .wp-caption.alignright, - img.alignright { - margin: 0.4em 0 1.6em 1.6em; - } - - blockquote.aligncenter, - .wp-caption.aligncenter, - img.aligncenter { - clear: both; - margin-top: 0.4em; - margin-bottom: 1.6em; - } - - .wp-caption.alignleft, - .wp-caption.alignright, - .wp-caption.aligncenter { - margin-bottom: 1.2em; - } - - .site-header { - background-color: transparent; - border-bottom: 0; - margin: 20% 0; - padding: 0 20%; - } - - .site-branding { - min-height: 0; - padding: 0; - } - - .site-title { - font-size: 22px; - font-size: 2.2rem; - line-height: 1.3636; - } - - .custom-logo { - max-height: none; - } - - .wp-custom-logo .site-title { - margin-top: 0.545454545em; - } - - .site-description { - font-size: 12px; - font-size: 1.2rem; - } - - .widget { - font-size: 12px; - font-size: 1.2rem; - margin: 0 0 20%; - padding: 0 20%; - } - - .widget blockquote { - font-size: 12px; - font-size: 1.2rem; - line-height: 1.5; - margin-bottom: 1.5em; - margin-left: -1.5em; - padding-left: 1.1667em; - } - - .widget blockquote p { - margin-bottom: 1.5em; - } - - .widget blockquote cite, - .widget blockquote small { - font-size: 12px; - font-size: 1.2rem; - } - - .widget pre { - padding: 0.5em; - } - - .widget button, - .widget input, - .widget select, - .widget textarea { - font-size: 12px; - font-size: 1.2rem; - } - - .widget button, - .widget input[type="button"], - .widget input[type="reset"], - .widget input[type="submit"] { - font-size: 12px; - font-size: 1.2rem; - padding: 0.5417em 1.0833em; - } - - .widget input[type="text"], - .widget input[type="email"], - .widget input[type="url"], - .widget input[type="password"], - .widget input[type="search"], - .widget textarea { - padding: 0.4583em; - } - - .widget .wp-caption-text, - .widget .gallery-caption { - font-size: 12px; - font-size: 1.2rem; - } - - .widget_calendar td, - .widget_calendar th { - line-height: 1.9167; - } - - .widget_archive li, - .widget_categories li, - .widget_links li, - .widget_meta li, - .widget_nav_menu li, - .widget_pages li, - .widget_recent_comments li, - .widget_recent_entries li { - padding: 0.4583em 0; - } - - .widget_categories .children, - .widget_nav_menu .sub-menu, - .widget_pages .children { - margin: 0.4583em 0 0 1em; - padding-top: 0.4583em; - } - - .widget_rss .rss-date, - .widget_rss cite { - font-size: 12px; - font-size: 1.2rem; - line-height: 1.5; - } - - .hentry, - .page-header, - .page-content { - margin: 0 8.3333%; - } - - .hentry { - padding-top: 8.3333%; - } - - .hentry + .hentry, - .page-header + .hentry, - .page-header + .page-content { - margin-top: 8.3333%; - } - - .post-thumbnail { - margin-bottom: 2.4em; - } - - .entry-header { - padding: 0 10%; - } - - .entry-title, - .widecolumn h2 { - font-size: 31px; - font-size: 3.1rem; - line-height: 1.1613; - margin-bottom: 1.1613em; - } - - .entry-content, - .entry-summary { - padding: 0 10% 10%; - } - - .entry-content h1, - .entry-summary h1, - .page-content h1, - .comment-content h1 { - font-size: 31px; - font-size: 3.1rem; - line-height: 1.1613; - margin-top: 1.5484em; - margin-bottom: 0.7742em; - } - - .entry-content h2, - .entry-summary h2, - .page-content h2, - .comment-content h2 { - font-size: 26px; - font-size: 2.6rem; - line-height: 1.3846; - margin-top: 1.8462em; - margin-bottom: 0.9231em; - } - - .entry-content h3, - .entry-summary h3, - .page-content h3, - .comment-content h3 { - font-size: 22px; - font-size: 2.2rem; - line-height: 1.3636; - margin-top: 2.1818em; - margin-bottom: 1.0909em; - } - - .entry-content h4, - .entry-summary h4, - .page-content h4, - .comment-content h4 { - font-size: 18px; - font-size: 1.8rem; - line-height: 1.3333; - margin-top: 2.6667em; - margin-bottom: 1.3333em; - } - - .entry-content h5, - .entry-content h6, - .entry-summary h5, - .entry-summary h6, - .page-content h5, - .page-content h6, - .comment-content h5, - .comment-content h6 { - font-size: 15px; - font-size: 1.5rem; - line-height: 1.2; - margin-top: 3.2em; - margin-bottom: 1.6em; - } - - .entry-content .more-link:after, - .entry-summary .more-link:after { - font-size: 16px; - top: 5px; - } - - .author-info { - margin: 0 10%; - padding: 10% 0; - } - - .author-info .avatar { - height: 36px; - margin: 0 1.5em 1.5em 0; - width: 36px; - } - - .author-link:after { - font-size: 16px; - top: 1px; - } - - .entry-footer { - padding: 5% 10%; - } - - .posted-on:before, - .byline:before, - .cat-links:before, - .tags-links:before, - .comments-link:before, - .entry-format:before, - .edit-link:before, - .full-size-link:before { - top: 0; - } - - .page-header { - padding: 4.1666% 8.3333%; - } - - .page-content { - padding: 8.3333%; - } - - .taxonomy-description { - padding-top: 0.4em; - } - - .page-title, - .comments-title, - .comment-reply-title, - .post-navigation .post-title { - font-size: 18px; - font-size: 1.8rem; - line-height: 1.3333; - } - - .page-links { - margin-bottom: 1.3333em; - } - - .page-links a, - .page-links > span { - margin: 0 0.3333em 0.3333em 0; - } - - .entry-attachment { - margin-bottom: 1.6em; - } - - .format-aside .entry-title, - .format-image .entry-title, - .format-video .entry-title, - .format-quote .entry-title, - .format-gallery .entry-title, - .format-status .entry-title, - .format-link .entry-title, - .format-audio .entry-title, - .format-chat .entry-title { - font-size: 18px; - font-size: 1.8rem; - line-height: 1.3333; - margin-bottom: 1.3333em; - } - - .format-link .entry-title a:after { - top: 0; - } - - .comments-area { - margin: 8.3333% 8.3333% 0; - padding: 8.3333%; - } - - .comments-title { - margin-bottom: 1.3333em; - } - - .comment-list article, - .comment-list .pingback, - .comment-list .trackback { - padding: 1.6em 0; - } - - .comment-list + .comment-respond, - .comment-navigation + .comment-respond { - padding-top: 1.6em; - } - - .comment-list .children > li { - padding-left: 0.8em; - } - - .comment-author { - margin-bottom: 0.4em; - } - - .comment-author .avatar { - height: 24px; - margin-right: 0.8em; - top: 0; - width: 24px; - } - - .comment-metadata .edit-link:before { - top: 3px; - } - - .pingback .edit-link:before { - top: 5px; - } - - .bypostauthor > article .fn:after { - top: 5px; - left: 3px; - } - - .comment-content ul, - .comment-content ol { - margin-bottom: 2em; - } - - .comment-list .reply a { - padding: 0.4167em 0.8333em; - } - - .comment-form, - .no-comments { - padding-top: 1.6em; - } - - .comment-reply-title small a:before { - top: -3px; - } - - .site-footer { - float: left; - margin: 0 0 0 35.2941%; - padding: 0; - width: 58.8235%; - } - - .site-info { - padding: 5% 10%; - } - - embed, - iframe, - object, - video { - margin-bottom: 1.6em; - } - - .wp-audio-shortcode, - .wp-video, - .wp-playlist.wp-audio-playlist { - font-size: 15px; - font-size: 1.5rem; - margin-bottom: 1.6em; - } - - .wp-caption, - .gallery { - margin-bottom: 1.6em; - } - - .widecolumn { - margin: 8.3333%; - padding: 8.3333%; - } - - .widecolumn .mu_alert { - margin-bottom: 1.6em; - } - - .widecolumn p { - margin: 1.6em 0; - } - - .widecolumn p + h2 { - margin-top: 1.5484em; - } - - .widecolumn #key, - .widecolumn .mu_register #blog_title, - .widecolumn .mu_register #user_email, - .widecolumn .mu_register #blogname, - .widecolumn .mu_register #user_name { - font-size: 16px; - font-size: 1.6rem; - } - - .widecolumn .mu_register #blog_title, - .widecolumn .mu_register #user_email, - .widecolumn .mu_register #user_name { - margin: 0 0 0.375em; - } -} - - -/** - * 16.5 Desktop Medium 1100px - */ - -@media screen and (min-width: 68.75em) { - body, - button, - input, - select, - textarea { - font-size: 17px; - font-size: 1.7rem; - line-height: 1.6471; - } - - button, - input { - line-height: normal; - } - - p, - address, - pre, - hr, - ul, - ol, - dl, - dd, - table { - margin-bottom: 1.6471em; - } - - blockquote { - font-size: 20px; - font-size: 2rem; - line-height: 1.75; - margin-bottom: 1.75em; - margin-left: -1.05em; - padding-left: 0.85em; - } - - blockquote p { - margin-bottom: 1.75em; - } - - blockquote cite, - blockquote small { - font-size: 17px; - font-size: 1.7rem; - line-height: 1.6471; - } - - pre { - line-height: 1.2353; - } - - button, - input[type="button"], - input[type="reset"], - input[type="submit"], - .post-password-form input[type="submit"], - .widecolumn #submit, - .widecolumn .mu_register input[type="submit"] { - font-size: 14px; - font-size: 1.4rem; - padding: 0.8214em 1.5714em; - } - - input[type="text"], - input[type="email"], - input[type="url"], - input[type="password"], - input[type="search"], - textarea { - padding: 0.5em; - } - - .main-navigation { - font-size: 14px; - font-size: 1.4rem; - } - - .main-navigation a { - padding: 0.4643em 0; - } - - .main-navigation .menu-item-has-children > a { - padding-right: 34px; - } - - .main-navigation .menu-item-description { - line-height: 1.4583; - margin-top: 0.25em; - } - - .dropdown-toggle { - height: 28px; - width: 28px; - } - - .dropdown-toggle:after { - line-height: 28px; - width: 28px; - } - - .social-navigation ul { - margin-bottom: -1.4706em; - } - - .social-navigation li { - width: 20%; - } - - .social-navigation a { - height: 2.8824em; - } - - .post-password-form label, - .post-navigation .meta-nav, - .comment-navigation, - .image-navigation, - .author-heading, - .author-bio, - .entry-footer, - .page-links a, - .page-links span, - .comment-metadata, - .pingback .edit-link, - .comment-list .reply, - .comment-notes, - .comment-awaiting-moderation, - .logged-in-as, - .comment-form label, - .form-allowed-tags, - .site-info, - .wp-caption-text, - .gallery-caption, - .entry-caption, - .widecolumn label, - .widecolumn .mu_register label { - font-size: 14px; - font-size: 1.4rem; - } - - .pagination .nav-links { - min-height: 3.2941em; - } - - .pagination .page-numbers { - line-height: 3.2941em; - padding: 0 0.8235em; - } - - .pagination .prev, - .pagination .next { - height: 56px; - padding: 0; - width: 56px; - } - - .pagination .prev:before, - .pagination .next:before { - height: 56px; - line-height: 56px; - width: 56px; - } - - .image-navigation .nav-previous a:before, - .image-navigation .nav-next a:after, - .comment-navigation .nav-previous a:before, - .comment-navigation .nav-next a:after { - top: 2px; - } - - blockquote.alignleft, - .wp-caption.alignleft, - img.alignleft { - margin: 0.4118em 1.6471em 1.6471em 0; - } - - blockquote.alignright, - .wp-caption.alignright, - img.alignright { - margin: 0.4118em 0 1.6471em 1.6471em; - } - - blockquote.aligncenter, - .wp-caption.aligncenter, - img.aligncenter { - margin-top: 0.4118em; - margin-bottom: 1.6471em; - } - - .wp-caption.alignleft, - .wp-caption.alignright, - .wp-caption.aligncenter { - margin-bottom: 1.2353em; - } - - .site-title { - font-size: 24px; - font-size: 2.4rem; - line-height: 1.1667; - } - - .wp-custom-logo .site-title { - margin-top: 0.583333333em; - } - - .site-description { - font-size: 14px; - font-size: 1.4rem; - } - - .widget { - font-size: 14px; - font-size: 1.4rem; - } - - .widget blockquote { - font-size: 14px; - font-size: 1.4rem; - padding-left: 1.2143em; - } - - .widget button, - .widget input, - .widget select, - .widget textarea { - font-size: 14px; - font-size: 1.4rem; - } - - .widget button, - .widget input[type="button"], - .widget input[type="reset"], - .widget input[type="submit"] { - font-size: 12px; - font-size: 1.2rem; - padding: 0.75em 1.5em; - } - - .widget input[type="text"], - .widget input[type="email"], - .widget input[type="url"], - .widget input[type="password"], - .widget input[type="search"], - .widget textarea { - padding: 0.5em; - } - - .widget .wp-caption-text, - .widget .gallery-caption { - line-height: 1.4583; - padding: 0.5833em 0; - } - - .widget_calendar caption { - margin: 0 0 1.9286em; - } - - .widget_calendar td, - .widget_calendar th { - line-height: 1.9286; - } - - .widget_archive li, - .widget_categories li, - .widget_links li, - .widget_meta li, - .widget_nav_menu li, - .widget_pages li, - .widget_recent_comments li, - .widget_recent_entries li { - padding: 0.4643em 0; - } - - .widget_categories .children, - .widget_nav_menu .sub-menu, - .widget_pages .children { - margin: 0.4643em 0 0 1em; - padding-top: 0.4643em; - } - - .widget_rss .rss-date, - .widget_rss cite { - line-height: 1.75; - } - - .post-thumbnail { - margin-bottom: 2.4706em; - } - - .entry-title, - .widecolumn h2 { - font-size: 35px; - font-size: 3.5rem; - line-height: 1.2; - margin-bottom: 1.2em; - } - - .entry-content h1, - .entry-summary h1, - .page-content h1, - .comment-content h1 { - font-size: 35px; - font-size: 3.5rem; - line-height: 1.2; - margin-top: 1.6em; - margin-bottom: 0.8em; - } - - .entry-content h2, - .entry-summary h2, - .page-content h2, - .comment-content h2 { - font-size: 29px; - font-size: 2.9rem; - line-height: 1.2069; - margin-top: 1.931em; - margin-bottom: 0.9655em; - } - - .entry-content h3, - .entry-summary h3, - .page-content h3, - .comment-content h3 { - font-size: 24px; - font-size: 2.4rem; - line-height: 1.1667; - margin-top: 2.3333em; - margin-bottom: 1.1667em; - } - - .entry-content h4, - .entry-summary h4, - .page-content h4, - .comment-content h4 { - font-size: 20px; - font-size: 2rem; - line-height: 1.4; - margin-top: 2.8em; - margin-bottom: 1.4em; - } - - .entry-content h5, - .entry-content h6, - .entry-summary h5, - .entry-summary h6, - .page-content h5, - .page-content h6, - .comment-content h5, - .comment-content h6 { - font-size: 17px; - font-size: 1.7rem; - line-height: 1.2353; - margin-top: 3.2941em; - margin-bottom: 1.6471em; - } - - .entry-content .more-link:after, - .entry-summary .more-link:after { - font-size: 24px; - top: 2px; - } - - .author-info .avatar { - height: 42px; - margin: 0 1.6471em 1.6471em 0; - width: 42px; - } - - .author-link:after { - top: 3px; - } - - .posted-on:before, - .byline:before, - .cat-links:before, - .tags-links:before, - .comments-link:before, - .entry-format:before, - .edit-link:before, - .full-size-link:before { - top: 3px; - } - - .taxonomy-description { - padding-top: 0.4118em; - } - - .page-title, - .comments-title, - .comment-reply-title, - .post-navigation .post-title { - font-size: 24px; - font-size: 2.4rem; - line-height: 1.1667; - } - - .page-links { - margin-bottom: 1.4117em; - } - - .page-links a, - .page-links > span { - margin: 0 0.2857em 0.2857em 0; - } - - .entry-attachment { - margin-bottom: 1.6471em; - } - - .format-aside .entry-title, - .format-image .entry-title, - .format-video .entry-title, - .format-quote .entry-title, - .format-gallery .entry-title, - .format-status .entry-title, - .format-link .entry-title, - .format-audio .entry-title, - .format-chat .entry-title { - font-size: 20px; - font-size: 2rem; - line-height: 1.4; - margin-bottom: 1.4em; - } - - .format-link .entry-title a:after { - top: 0.0833em; - } - - .comments-title { - margin-bottom: 1.4em; - } - - .comment-list article, - .comment-list .pingback, - .comment-list .trackback { - padding: 1.6471em 0; - } - - .comment-list + .comment-respond, - .comment-navigation + .comment-respond { - padding-top: 1.6471em; - } - - .comment-list .children > li { - padding-left: 1.1667em; - } - - .comment-author { - margin-bottom: 0; - } - - .comment-author .avatar { - height: 42px; - margin-right: 1.64705em; - top: 5px; - width: 42px; - } - - .bypostauthor > article .fn:after { - top: 7px; - left: 6px; - } - - .comment-metadata .edit-link:before { - top: 6px; - } - - .pingback .edit-link:before { - top: 6px; - } - - .comment-content ul, - .comment-content ol { - margin-bottom: 1.6471em; - } - - .comment-list .reply a { - padding: 0.4286em 0.8571em; - } - - .comment-form, - .no-comments { - padding-top: 1.6471em; - } - - .comment-reply-title small a:before { - top: -1px; - } - - embed, - iframe, - object, - video { - margin-bottom: 1.6471em; - } - - .wp-audio-shortcode, - .wp-video, - .wp-playlist.wp-audio-playlist { - font-size: 17px; - font-size: 1.7rem; - margin-bottom: 1.6471em; - } - - .wp-caption, - .gallery { - margin-bottom: 1.6471em; - } - - .widecolumn .mu_alert { - margin-bottom: 1.6471em; - } - - .widecolumn p { - margin: 1.6471em 0; - } - - .widecolumn p + h2 { - margin-top: 1.6em; - } - - .widecolumn #key, - .widecolumn .mu_register #blog_title, - .widecolumn .mu_register #user_email, - .widecolumn .mu_register #blogname, - .widecolumn .mu_register #user_name { - font-size: 17px; - font-size: 1.7rem; - } - - .widecolumn .mu_register #blog_title, - .widecolumn .mu_register #user_email, - .widecolumn .mu_register #user_name { - margin: 0 0 0.4117em; - } -} - - -/** - * 16.6 Desktop Large 1240px - */ - -@media screen and (min-width: 77.5em) { - body, - button, - input, - select, - textarea { - font-size: 19px; - font-size: 1.9rem; - line-height: 1.6842; - } - - button, - input { - line-height: normal; - } - - p, - address, - pre, - hr, - ul, - ol, - dl, - dd, - table { - margin-bottom: 1.6842em; - } - - blockquote { - font-size: 22px; - font-size: 2.2rem; - line-height: 1.8182; - margin-bottom: 1.8182em; - margin-left: -1.0909em; - padding-left: 0.9091em; - } - - blockquote p { - margin-bottom: 1.8182em; - } - - blockquote cite, - blockquote small { - font-size: 19px; - font-size: 1.9rem; - line-height: 1.6842; - } - - pre { - line-height: 1.2632; - } - - button, - input[type="button"], - input[type="reset"], - input[type="submit"], - .post-password-form input[type="submit"], - .widecolumn #submit, - .widecolumn .mu_register input[type="submit"] { - font-size: 16px; - font-size: 1.6rem; - padding: 0.8125em 1.625em; - } - - input[type="text"], - input[type="email"], - input[type="url"], - input[type="password"], - input[type="search"], - textarea { - padding: 0.5278em; - } - - .main-navigation { - font-size: 16px; - font-size: 1.6rem; - } - - .main-navigation a { - padding: 0.5em 0; - } - - .main-navigation .menu-item-has-children > a { - padding-right: 38px; - } - - .main-navigation .menu-item-description { - font-size: 13px; - font-size: 1.3rem; - line-height: 1.5385; - margin-top: 0.3077em; - } - - .dropdown-toggle { - height: 32px; - top: 4px; - width: 32px; - } - - .dropdown-toggle:after { - line-height: 32px; - width: 32px; - } - - .social-navigation ul { - margin-bottom: -1.2632em; - } - - .social-navigation a { - height: 2.5263em; - } - - .post-password-form label, - .post-navigation .meta-nav, - .comment-navigation, - .image-navigation, - .author-heading, - .author-bio, - .entry-footer, - .page-links a, - .page-links span, - .comment-metadata, - .pingback .edit-link, - .comment-list .reply, - .comment-notes, - .comment-awaiting-moderation, - .logged-in-as, - .comment-form label, - .form-allowed-tags, - .site-info, - .wp-caption-text, - .gallery-caption, - .entry-caption, - .widecolumn label, - .widecolumn .mu_register label { - font-size: 16px; - font-size: 1.6rem; - } - - .pagination .nav-links { - min-height: 3.3684em; - } - - .pagination .page-numbers { - line-height: 3.3684em; - padding: 0 0.8421em; - } - - .pagination .prev, - .pagination .next { - height: 64px; - padding: 0; - width: 64px; - } - - .pagination .prev:before, - .pagination .next:before { - height: 64px; - line-height: 64px; - width: 64px; - } - - .image-navigation .nav-previous a:before, - .image-navigation .nav-next a:after, - .comment-navigation .nav-previous a:before, - .comment-navigation .nav-next a:after { - font-size: 24px; - top: -1px; - } - - blockquote.alignleft, - .wp-caption.alignleft, - img.alignleft { - margin: 0.4211em 1.6842em 1.6842em 0; - } - - blockquote.alignright, - .wp-caption.alignright, - img.alignright { - margin: 0.4211em 0 1.6842em 1.6842em; - } - - blockquote.aligncenter, - .wp-caption.aligncenter, - img.aligncenter { - margin-top: 0.4211em; - margin-bottom: 1.6842em; - } - - .wp-caption.alignleft, - .wp-caption.alignright, - .wp-caption.aligncenter { - margin-bottom: 1.2632em; - } - - .site-title { - font-size: 27px; - font-size: 2.7rem; - line-height: 1.1852; - } - - .wp-custom-logo .site-title { - margin-top: 0.592592593em; - } - - .site-description { - font-size: 16px; - font-size: 1.6rem; - } - - .widget { - font-size: 16px; - font-size: 1.6rem; - } - - .widget blockquote { - font-size: 16px; - font-size: 1.6rem; - padding-left: 1.25em; - } - - .widget blockquote cite, - .widget blockquote small { - font-size: 13px; - font-size: 1.3rem; - line-height: 1.8462; - } - - .widget button, - .widget input, - .widget select, - .widget textarea { - font-size: 16px; - font-size: 1.6rem; - } - - .widget button, - .widget input[type="button"], - .widget input[type="reset"], - .widget input[type="submit"] { - font-size: 13px; - font-size: 1.3rem; - padding: 0.8462em 1.6923em; - } - - .widget input[type="text"], - .widget input[type="email"], - .widget input[type="url"], - .widget input[type="password"], - .widget input[type="search"], - .widget textarea { - padding: 0.5em; - } - - .widget .wp-caption-text, - .widget .gallery-caption { - font-size: 13px; - font-size: 1.3rem; - line-height: 1.5385; - padding: 0.6154em 0; - } - - .widget_calendar td, - .widget_calendar th { - line-height: 1.9375; - } - - .widget_calendar caption { - margin: 0 0 1.5em; - } - - .widget_archive li, - .widget_categories li, - .widget_links li, - .widget_meta li, - .widget_nav_menu li, - .widget_pages li, - .widget_recent_comments li, - .widget_recent_entries li { - padding: 0.4688em 0; - } - - .widget_categories .children, - .widget_nav_menu .sub-menu, - .widget_pages .children { - margin: 0.4688em 0 0 1em; - padding-top: 0.4688em; - } - - .widget_rss .rss-date, - .widget_rss cite { - font-size: 13px; - font-size: 1.3rem; - line-height: 1.8462; - } - - .post-thumbnail { - margin-bottom: 2.9474em; - } - - .entry-title, - .widecolumn h2 { - font-size: 39px; - font-size: 3.9rem; - line-height: 1.2308; - margin-bottom: 1.2308em; - } - - .entry-content h1, - .entry-summary h1, - .page-content h1, - .comment-content h1 { - font-size: 39px; - font-size: 3.9rem; - line-height: 1.2308; - margin-top: 1.641em; - margin-bottom: 0.8205em; - } - - .entry-content h2, - .entry-summary h2, - .page-content h2, - .comment-content h2 { - font-size: 32px; - font-size: 3.2rem; - line-height: 1.25; - margin-top: 2em; - margin-bottom: 1em; - } - - .entry-content h3, - .entry-summary h3, - .page-content h3, - .comment-content h3 { - font-size: 27px; - font-size: 2.7rem; - line-height: 1.1852; - margin-top: 2.3704em; - margin-bottom: 1.1852em; - } - - .entry-content h4, - .entry-summary h4, - .page-content h4, - .comment-content h4 { - font-size: 22px; - font-size: 2.2rem; - line-height: 1.4545; - margin-top: 2.9091em; - margin-bottom: 1.4545em; - } - - .entry-content h5, - .entry-content h6, - .entry-summary h5, - .entry-summary h6, - .page-content h5, - .page-content h6, - .comment-content h5, - .comment-content h6 { - font-size: 19px; - font-size: 1.9rem; - line-height: 1.2632; - margin-top: 3.3684em; - margin-bottom: 1.6842em; - } - - .entry-content .more-link:after, - .entry-summary .more-link:after { - top: 3px; - } - - .author-info .avatar { - height: 56px; - margin: 0 1.6842em 1.6842em 0; - width: 56px; - } - - .author-link:after { - font-size: 24px; - top: 0; - } - - .posted-on:before, - .byline:before, - .cat-links:before, - .tags-links:before, - .comments-link:before, - .entry-format:before, - .edit-link:before, - .full-size-link:before { - top: 4px; - } - - .taxonomy-description { - padding-top: 0.4211em; - } - - .page-title, - .comments-title, - .comment-reply-title, - .post-navigation .post-title { - font-size: 27px; - font-size: 2.7rem; - line-height: 1.1852; - } - - .page-links { - margin-bottom: 1.4736em; - } - - .page-links a, - .page-links > span { - margin: 0 0.25em 0.25em 0; - } - - .entry-attachment { - margin-bottom: 1.6842em; - } - - .format-aside .entry-title, - .format-image .entry-title, - .format-video .entry-title, - .format-quote .entry-title, - .format-gallery .entry-title, - .format-status .entry-title, - .format-link .entry-title, - .format-audio .entry-title, - .format-chat .entry-title { - font-size: 22px; - font-size: 2.2rem; - line-height: 1.4545; - margin-bottom: 1.4545em; - } - - .format-link .entry-title a:after { - top: 3px; - } - - .comments-title { - margin-bottom: 1.4545em; - } - - .comment-list article, - .comment-list .pingback, - .comment-list .trackback { - padding: 1.6842em 0; - } - - .comment-list + .comment-respond, - .comment-navigation + .comment-respond { - padding-top: 1.6842em; - } - - .comment-list .children > li { - padding-left: 1.4737em; - } - - .comment-author .avatar { - height: 56px; - margin-right: 1.6842em; - top: 3px; - width: 56px; - } - - .bypostauthor > article .fn:after { - top: 8px; - } - - .comment-metadata .edit-link:before { - top: 8px; - } - - .pingback .edit-link:before { - top: 8px; - } - - .comment-content ul, - .comment-content ol { - margin-bottom: 1.6842em; - } - - .comment-list .reply a { - padding: 0.4375em 0.875em; - } - - .comment-form, - .no-comments { - padding-top: 1.6842em; - } - - embed, - iframe, - object, - video { - margin-bottom: 1.6842em; - } - - .wp-audio-shortcode, - .wp-video, - .wp-playlist.wp-audio-playlist { - font-size: 19px; - font-size: 1.9rem; - margin-bottom: 1.6842em; - } - - .wp-caption, - .gallery { - margin-bottom: 1.6842em; - } - - .widecolumn .mu_alert { - margin-bottom: 1.6842em; - } - - .widecolumn p { - margin: 1.6842em 0; - } - - .widecolumn p + h2 { - margin-top: 1.641em; - } - - .widecolumn #key, - .widecolumn .mu_register #blog_title, - .widecolumn .mu_register #user_email, - .widecolumn .mu_register #blogname, - .widecolumn .mu_register #user_name { - font-size: 19px; - font-size: 1.9rem; - } - - .widecolumn .mu_register #blog_title, - .widecolumn .mu_register #user_email, - .widecolumn .mu_register #user_name { - margin: 0 0 0.421em; - } -} - - -/** - * 16.7 Desktop X-Large 1403px - */ - -@media screen and (min-width: 87.6875em) { - body:before { - width: -webkit-calc(50% - 289px); - width: calc(50% - 289px); - } -} - - -/** - * 17.0 Print - */ - -@media print { - body { - background: none !important; /* Brute force since user agents all print differently. */ - font-size: 11.25pt; - } - - .secondary-toggle, - .navigation, - .page-links, - .edit-link, - #reply-title, - .comment-form, - .comment-edit-link, - .comment-list .reply a, - button, - input, - textarea, - select, - .widecolumn form, - .widecolumn .mu_register form { - display: none; - } - - .site-header, - .site-footer, - .hentry, - .entry-footer, - .page-header, - .page-content, - .comments-area, - .widecolumn { - background: none !important; /* Make sure color schemes dont't affect to print */ - } - - body, - blockquote, - blockquote cite, - blockquote small, - label, - a, - .site-title a, - .site-description, - .post-title, - .author-heading, - .entry-footer, - .entry-footer a, - .taxonomy-description, - .entry-caption, - .comment-author, - .comment-metadata, - .comment-metadata a, - .comment-notes, - .comment-awaiting-moderation, - .no-comments, - .site-info, - .site-info a, - .wp-caption-text, - .gallery-caption { - color: #000 !important; /* Make sure color schemes don't affect to print */ - } - - pre, - abbr[title], - table, - th, - td, - .site-header, - .site-footer, - .hentry + .hentry, - .author-info, - .page-header, - .comments-area, - .comment-list + .comment-respond, - .comment-list article, - .comment-list .pingback, - .comment-list .trackback, - .no-comments { - border-color: #eaeaea !important; /* Make sure color schemes don't affect to print */ - } - - .site { - margin: 0 7.6923%; - } - - .sidebar { - position: relative !important; /* Make sure sticky sidebar doesn't affect to print */ - } - - .site-branding { - padding: 0; - } - - .site-header { - padding: 7.6923% 0; - } - - .site-description { - display: block; - } - - .hentry + .hentry { - margin-top: 7.6923%; - } - - .hentry.has-post-thumbnail { - padding-top: 7.6923%; - } - - .sticky-post { - background: #000 !important; - color: #fff !important; - } - - .entry-header, - .entry-footer { - padding: 0; - } - - .entry-content, - .entry-summary { - padding: 0 0 7.6923%; - } - - .post-thumbnail img { - margin: 0; - } - - .author-info { - margin: 0; - } - - .page-content { - padding: 7.6923% 0 0; - } - - .page-header { - padding: 3.84615% 0; - } - - .comments-area { - border: 0; - padding: 7.6923% 0 0; - } - - .site-footer { - margin-top: 7.6923%; - padding: 3.84615% 0; - } - - .widecolumn { - margin: 7.6923% 0 0; - padding: 0; - } -} diff --git a/wp/wp-content/themes/twentyfourteen/404.php b/wp/wp-content/themes/twentyfourteen/404.php deleted file mode 100644 index 7f5bef84..00000000 --- a/wp/wp-content/themes/twentyfourteen/404.php +++ /dev/null @@ -1,32 +0,0 @@ - - - -
    -
    - - - -
    -

    - - -
    - -
    -
    - - - -
    -
    - - - - - - -
    -
    - - - -
    -
    - - - -
    -

    - -

    - -
    - -
    - - - -
    -
    - - - -
    -
    - - - -
    -

    - - %s
    ', $term_description ); - endif; - ?> - - - - -
    - - - -
    - - - -

    - -

    - - 1 && get_option( 'page_comments' ) ) : ?> - - - -
      - 'ol', - 'short_ping' => true, - 'avatar_size' => 34, - ) ); - ?> -
    - - 1 && get_option( 'page_comments' ) ) : ?> - - - - -

    - - - - - - -
    diff --git a/wp/wp-content/themes/twentyfourteen/content-aside.php b/wp/wp-content/themes/twentyfourteen/content-aside.php deleted file mode 100644 index 0401579d..00000000 --- a/wp/wp-content/themes/twentyfourteen/content-aside.php +++ /dev/null @@ -1,62 +0,0 @@ - - -
    > - - -
    - - - ', '' ); - else : - the_title( '

    ', '

    ' ); - endif; - ?> - - -
    - -
    - →', 'twentyfourteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( - 'before' => '', - 'link_before' => '', - 'link_after' => '', - ) ); - ?> -
    - - ', '', '' ); ?> -
    diff --git a/wp/wp-content/themes/twentyfourteen/content-audio.php b/wp/wp-content/themes/twentyfourteen/content-audio.php deleted file mode 100644 index 9fa9df41..00000000 --- a/wp/wp-content/themes/twentyfourteen/content-audio.php +++ /dev/null @@ -1,62 +0,0 @@ - - -
    > - - -
    - - - ', '' ); - else : - the_title( '

    ', '

    ' ); - endif; - ?> - - -
    - -
    - →', 'twentyfourteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( - 'before' => '', - 'link_before' => '', - 'link_after' => '', - ) ); - ?> -
    - - ', '', '' ); ?> -
    diff --git a/wp/wp-content/themes/twentyfourteen/content-featured-post.php b/wp/wp-content/themes/twentyfourteen/content-featured-post.php deleted file mode 100644 index 6cc88224..00000000 --- a/wp/wp-content/themes/twentyfourteen/content-featured-post.php +++ /dev/null @@ -1,34 +0,0 @@ - - -
    > - - - - -
    - - - - - ','' ); ?> -
    -
    diff --git a/wp/wp-content/themes/twentyfourteen/content-gallery.php b/wp/wp-content/themes/twentyfourteen/content-gallery.php deleted file mode 100644 index 6e3fe832..00000000 --- a/wp/wp-content/themes/twentyfourteen/content-gallery.php +++ /dev/null @@ -1,62 +0,0 @@ - - -
    > - - -
    - - - ', '' ); - else : - the_title( '

    ', '

    ' ); - endif; - ?> - - -
    - -
    - →', 'twentyfourteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( - 'before' => '', - 'link_before' => '', - 'link_after' => '', - ) ); - ?> -
    - - ', '', '' ); ?> -
    diff --git a/wp/wp-content/themes/twentyfourteen/content-image.php b/wp/wp-content/themes/twentyfourteen/content-image.php deleted file mode 100644 index a81e493d..00000000 --- a/wp/wp-content/themes/twentyfourteen/content-image.php +++ /dev/null @@ -1,62 +0,0 @@ - - -
    > - - -
    - - - ', '' ); - else : - the_title( '

    ', '

    ' ); - endif; - ?> - - -
    - -
    - →', 'twentyfourteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( - 'before' => '', - 'link_before' => '', - 'link_after' => '', - ) ); - ?> -
    - - ', '', '' ); ?> -
    diff --git a/wp/wp-content/themes/twentyfourteen/content-link.php b/wp/wp-content/themes/twentyfourteen/content-link.php deleted file mode 100644 index 858301ef..00000000 --- a/wp/wp-content/themes/twentyfourteen/content-link.php +++ /dev/null @@ -1,62 +0,0 @@ - - -
    > - - -
    - - - ', '' ); - else : - the_title( '

    ', '

    ' ); - endif; - ?> - - -
    - -
    - →', 'twentyfourteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( - 'before' => '', - 'link_before' => '', - 'link_after' => '', - ) ); - ?> -
    - - ', '', '' ); ?> -
    diff --git a/wp/wp-content/themes/twentyfourteen/content-none.php b/wp/wp-content/themes/twentyfourteen/content-none.php deleted file mode 100644 index a83e06ee..00000000 --- a/wp/wp-content/themes/twentyfourteen/content-none.php +++ /dev/null @@ -1,31 +0,0 @@ - - - - -
    - - -

    Get started here.', 'twentyfourteen' ), admin_url( 'post-new.php' ) ); ?>

    - - - -

    - - - - -

    - - - -
    diff --git a/wp/wp-content/themes/twentyfourteen/content-page.php b/wp/wp-content/themes/twentyfourteen/content-page.php deleted file mode 100644 index 98394190..00000000 --- a/wp/wp-content/themes/twentyfourteen/content-page.php +++ /dev/null @@ -1,31 +0,0 @@ - - -
    > -

    ', '

    ' ); - ?> - -
    - '', - 'link_before' => '', - 'link_after' => '', - ) ); - - edit_post_link( __( 'Edit', 'twentyfourteen' ), '', '' ); - ?> -
    -
    diff --git a/wp/wp-content/themes/twentyfourteen/content-quote.php b/wp/wp-content/themes/twentyfourteen/content-quote.php deleted file mode 100644 index 10a5d112..00000000 --- a/wp/wp-content/themes/twentyfourteen/content-quote.php +++ /dev/null @@ -1,62 +0,0 @@ - - -
    > - - -
    - - - ', '' ); - else : - the_title( '

    ', '

    ' ); - endif; - ?> - - -
    - -
    - →', 'twentyfourteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( - 'before' => '', - 'link_before' => '', - 'link_after' => '', - ) ); - ?> -
    - - ', '', '' ); ?> -
    diff --git a/wp/wp-content/themes/twentyfourteen/content-video.php b/wp/wp-content/themes/twentyfourteen/content-video.php deleted file mode 100644 index 4c49aaa1..00000000 --- a/wp/wp-content/themes/twentyfourteen/content-video.php +++ /dev/null @@ -1,62 +0,0 @@ - - -
    > - - -
    - - - ', '' ); - else : - the_title( '

    ', '

    ' ); - endif; - ?> - - -
    - -
    - →', 'twentyfourteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( - 'before' => '', - 'link_before' => '', - 'link_after' => '', - ) ); - ?> -
    - - ', '', '' ); ?> -
    diff --git a/wp/wp-content/themes/twentyfourteen/content.php b/wp/wp-content/themes/twentyfourteen/content.php deleted file mode 100644 index e571d8b3..00000000 --- a/wp/wp-content/themes/twentyfourteen/content.php +++ /dev/null @@ -1,71 +0,0 @@ - - -
    > - - -
    - - - ', '' ); - else : - the_title( '

    ', '

    ' ); - endif; - ?> - - -
    - - -
    - -
    - -
    - →', 'twentyfourteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( - 'before' => '', - 'link_before' => '', - 'link_after' => '', - ) ); - ?> -
    - - - ', '', '' ); ?> -
    diff --git a/wp/wp-content/themes/twentyfourteen/css/editor-style.css b/wp/wp-content/themes/twentyfourteen/css/editor-style.css deleted file mode 100644 index 6bd5ac0f..00000000 --- a/wp/wp-content/themes/twentyfourteen/css/editor-style.css +++ /dev/null @@ -1,721 +0,0 @@ -/* -Theme Name: Twenty Fourteen -Description: Used to style the TinyMCE editor. -*/ - - -/** - * Table of Contents: - * - * 1.0 - Body - * 2.0 - Headings - * 3.0 - Text Elements - * 4.0 - Links - * 5.0 - Alignment - * 6.0 - Tables - * 7.0 - Images - * 8.0 - Galleries - * 9.0 - Audio/Video - * 10.0 - RTL - * ---------------------------------------------------------------------------- - */ - - -/** - * 1.0 Body - * ---------------------------------------------------------------------------- - */ - -html .mceContentBody { - font-size: 100%; - max-width: 474px; -} - -body { - color: #2b2b2b; - font-family: Lato, sans-serif; - font-weight: 400; - line-height: 1.5; - vertical-align: baseline; -} - - -/** - * 2.0 Headings - * ---------------------------------------------------------------------------- - */ - -h1, -h2, -h3, -h4, -h5, -h6 { - clear: both; - font-weight: 700; - margin: 36px 0 12px; -} - -h1 { - font-size: 26px; - line-height: 1.3846153846; -} - -h2 { - font-size: 24px; - line-height: 1; -} - -h3 { - font-size: 22px; - line-height: 1.0909090909; -} - -h4 { - font-size: 20px; - line-height: 1.2; -} - -h5 { - font-size: 18px; - line-height: 1.3333333333; -} - -h6 { - font-size: 16px; - line-height: 1.5; -} - -h1:first-child, -h2:first-child, -h3:first-child, -h4:first-child, -h5:first-child, -h6:first-child { - margin-top: 0; -} - - -/** - * 3.0 Text Elements - * ---------------------------------------------------------------------------- - */ - -address { - font-style: italic; - margin-bottom: 24px; -} - -abbr[title] { - border-bottom: 1px dotted #2b2b2b; - cursor: help; -} - -b, -strong { - font-weight: 700; -} - -cite { - border: 0; -} - -cite, -dfn, -em, -i { - font-style: italic; -} - -mark, -ins { - background: #fff9c0; - border: 0; - color: inherit; - text-decoration: none; -} - -p { - margin: 0 0 24px; -} - -code, -kbd, -tt, -var, -samp, -pre { - font-family: monospace, serif; - font-size: 15px; - line-height: 1.6; -} - -pre { - border: 1px solid rgba(0, 0, 0, 0.1); - margin-bottom: 24px; - max-width: 100%; - overflow: auto; - padding: 12px; - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -blockquote, -q { - quotes: none; -} - -blockquote:before, -blockquote:after, -q:before, -q:after { - content: ""; - content: none; -} - -blockquote { - color: #767676; - font-size: 19px; - font-style: italic; - font-weight: 300; - line-height: 1.2631578947; - margin: 0 0 24px; -} - -blockquote cite, -blockquote small { - color: #2b2b2b; - font-size: 16px; - font-weight: 400; - line-height: 1.5; -} - -blockquote em, -blockquote i, -blockquote cite { - font-style: normal; -} - -blockquote strong, -blockquote b { - font-weight: 400; -} - -small { - font-size: smaller; -} - -big { - font-size: 125%; -} - -sup, -sub { - font-size: 75%; - height: 0; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - bottom: 1ex; -} - -sub { - top: .5ex; -} - -dl { - margin: 0 0 24px; -} - -dt { - font-weight: bold; -} - -dd { - margin: 0 0 24px; -} - -ul, -ol { - list-style: none; - margin: 0 0 24px 20px; - padding-left: 0; -} - -ul { - list-style: disc; -} - -ol { - list-style: decimal; -} - -li > ul, -li > ol { - margin: 0 0 0 20px; -} - -del { - color: #767676; -} - -hr { - background-color: rgba(0, 0, 0, 0.1); - border: 0; - height: 1px; - margin-bottom: 23px; -} - - -/** - * 4.0 Links - * ---------------------------------------------------------------------------- - */ - -a { - color: #24890d; - text-decoration: none; -} - -a:visited { - color: #24890d; -} - -a:focus { - outline: thin dotted; -} - -a:active, -a:hover { - color: #41a62a; - outline: 0; -} - - -/** - * 5.0 Alignment - * ---------------------------------------------------------------------------- - */ - -.alignleft { - float: left; - margin: 7px 24px 7px 0; -} - -.alignright { - float: right; - margin: 7px 0 7px 24px; -} - -.aligncenter { - clear: both; - display: block; - margin: 7px auto; -} - -blockquote.alignleft, -blockquote.alignright { - border-top: 1px solid rgba(0, 0, 0, 0.1); - border-bottom: 1px solid rgba(0, 0, 0, 0.1); - padding-top: 17px; - width: 50%; -} - -blockquote.alignleft p, -blockquote.alignright p { - margin-bottom: 17px; -} - - -/** - * 6.0 Tables - * ---------------------------------------------------------------------------- - */ - -.mceItemTable, -.mce-item-table { - border: 1px solid rgba(0, 0, 0, 0.1); - border-width: 1px 0 0 1px; - border-collapse: separate; - border-spacing: 0; - font-size: 14px; - line-height: 1.2857142857; - margin-bottom: 24px; - width: 100%; -} - -.mceItemTable th, -.mceItemTable caption, -.mce-item-table th, -.mce-item-table caption { - border: 1px solid rgba(0, 0, 0, 0.1); - border-width: 0 1px 1px 0; - font-weight: 700; - padding: 8px; - text-align: left; - text-transform: uppercase; - vertical-align: baseline; -} - -.mceItemTable td, -.mce-item-table td { - border: 1px solid rgba(0, 0, 0, 0.1); - border-width: 0 1px 1px 0; - font-family: Lato, sans-serif; - font-size: 14px; - padding: 8px; - vertical-align: baseline; -} - - -/** - * 7.0 Images - * ---------------------------------------------------------------------------- - */ - -img { - height: auto; - max-width: 100%; - vertical-align: middle; -} - -.wp-caption { - background: transparent; - border: none; - color: #767676; - margin: 0 0 24px 0; - max-width: 100%; - padding: 0; - text-align: left; -} - -.html5-captions .wp-caption { - padding: 0; -} - -.wp-caption.alignleft { - margin: 7px 14px 7px 0; -} - -.html5-captions .wp-caption.alignleft { - margin-right: 24px; -} - -.wp-caption.alignright { - margin: 7px 0 7px 14px; -} - -.wp-caption.alignright img, -.wp-caption.alignright .wp-caption-dd { - padding-left: 10px; -} - -.html5-captions .wp-caption.alignright { - margin-left: 24px; -} - -.html5-captions .wp-caption.alignright img, -.html5-captions .wp-caption.alignright .wp-caption-dd { - padding: 0; -} - -.wp-caption.aligncenter { - margin: 7px auto; -} - -.wp-caption-dt { - margin: 0; -} - -.wp-caption .wp-caption-text, -.wp-caption-dd { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - font-size: 12px; - font-style: italic; - line-height: 1.5; - margin: 9px 0; - padding: 0 10px 0 0; /* Avoid the caption to overflow the width of the image because wp-caption has 10px wider width */ - text-align: left; -} - -.mceTemp + ul, -.mceTemp + ol { - list-style-position: inside; -} - -/** - * 8.0 Gallery - * ----------------------------------------------------------------------------- - */ - -.gallery .gallery-item { - float: left; - margin: 0 4px 4px 0; - overflow: hidden; - padding: 0; - position: relative; -} - -.gallery-columns-1 .gallery-item { - max-width: 100%; - width: auto; -} - -.gallery-columns-2 .gallery-item { - max-width: 48%; - max-width: -webkit-calc(50% - 14px); - max-width: calc(50% - 14px); - width: auto; -} - -.gallery-columns-3 .gallery-item { - max-width: 32%; - max-width: -webkit-calc(33.3% - 11px); - max-width: calc(33.3% - 11px); - width: auto; -} - -.gallery-columns-4 .gallery-item { - max-width: 23%; - max-width: -webkit-calc(25% - 9px); - max-width: calc(25% - 9px); - width: auto; -} - -.gallery-columns-5 .gallery-item { - max-width: 19%; - max-width: -webkit-calc(20% - 8px); - max-width: calc(20% - 8px); - width: auto; -} - -.gallery-columns-6 .gallery-item { - max-width: 15%; - max-width: -webkit-calc(16.7% - 7px); - max-width: calc(16.7% - 7px); - width: auto; -} - -.gallery-columns-7 .gallery-item { - max-width: 13%; - max-width: -webkit-calc(14.28% - 7px); - max-width: calc(14.28% - 7px); - width: auto; -} - -.gallery-columns-8 .gallery-item { - max-width: 11%; - max-width: -webkit-calc(12.5% - 6px); - max-width: calc(12.5% - 6px); - width: auto; -} - -.gallery-columns-9 .gallery-item { - max-width: 9%; - max-width: -webkit-calc(11.1% - 6px); - max-width: calc(11.1% - 6px); - width: auto; -} - -.gallery-columns-1 .gallery-item:nth-of-type(1n), -.gallery-columns-2 .gallery-item:nth-of-type(2n), -.gallery-columns-3 .gallery-item:nth-of-type(3n), -.gallery-columns-4 .gallery-item:nth-of-type(4n), -.gallery-columns-5 .gallery-item:nth-of-type(5n), -.gallery-columns-6 .gallery-item:nth-of-type(6n), -.gallery-columns-7 .gallery-item:nth-of-type(7n), -.gallery-columns-8 .gallery-item:nth-of-type(8n), -.gallery-columns-9 .gallery-item:nth-of-type(9n) { - margin-right: 0; -} - -.gallery-columns-1 .gallery-item:nth-of-type(1n), -.gallery-columns-2 .gallery-item:nth-of-type(2n - 1), -.gallery-columns-3 .gallery-item:nth-of-type(3n - 2), -.gallery-columns-4 .gallery-item:nth-of-type(4n - 3), -.gallery-columns-5 .gallery-item:nth-of-type(5n - 4), -.gallery-columns-6 .gallery-item:nth-of-type(6n - 5), -.gallery-columns-7 .gallery-item:nth-of-type(7n - 6), -.gallery-columns-8 .gallery-item:nth-of-type(8n - 7), -.gallery-columns-9 .gallery-item:nth-of-type(9n - 8) { - margin-left: 12px; /* Compensate for the default negative margin on .gallery, which can't be changed. */ -} - -.gallery .gallery-caption { - background-color: rgba(0, 0, 0, 0.7); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - color: #fff; - font-size: 12px; - line-height: 1.5; - margin: 0; - max-height: 50%; - opacity: 0; - padding: 6px 8px; - position: absolute; - bottom: 0; - left: 0; - text-align: left; - width: 100%; -} - -.gallery .gallery-caption:before { - content: ""; - height: 100%; - min-height: 49px; - position: absolute; - top: 0; - left: 0; - width: 100%; -} - -.gallery-item:hover .gallery-caption { - opacity: 1; -} - -.gallery-columns-7 .gallery-caption, -.gallery-columns-8 .gallery-caption, -.gallery-columns-9 .gallery-caption { - display: none; -} - - -/** - * 9.0 Audio/Video - * ---------------------------------------------------------------------------- - */ - -.mejs-mediaelement, -.mejs-container .mejs-controls { - background: #000; -} - -.mejs-controls .mejs-time-rail .mejs-time-loaded, -.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current { - background: #fff; -} - -.mejs-controls .mejs-time-rail .mejs-time-current { - background: #24890d; -} - -.mejs-controls .mejs-time-rail .mejs-time-total, -.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total { - background: rgba(255, 255, 255, .33); -} - -.mejs-controls .mejs-time-rail span, -.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total, -.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current { - border-radius: 0; -} - -.mejs-overlay-loading { - background: transparent; -} - -.mejs-overlay-button { - background-color: #fff; - background-image: none; - border-radius: 2px; - box-shadow: 1px 1px 1px rgba(0,0,0,.8); - color: #000; - height: 36px; - margin-left: -24px; - width: 48px; -} - -.mejs-overlay-button:before { - -webkit-font-smoothing: antialiased; - content: '\f452'; - display: inline-block; - font: normal 32px/1.125 Genericons; - position: absolute; - top: 1px; - left: 10px; -} - -.mejs-controls .mejs-button button:focus { - outline: none; -} - -.mejs-controls .mejs-button button { - -webkit-font-smoothing: antialiased; - background: none; - color: #fff; - display: inline-block; - font: normal 16px/1 Genericons; -} - -.mejs-playpause-button.mejs-play button:before { - content: '\f452'; -} - -.mejs-playpause-button.mejs-pause button:before { - content: '\f448'; -} - -.mejs-volume-button.mejs-mute button:before { - content: '\f109'; - font-size: 20px; - position: absolute; - top: -2px; - left: 0; -} - -.mejs-volume-button.mejs-unmute button:before { - content: '\f109'; - left: 0; - position: absolute; - top: 0; -} - -.mejs-fullscreen-button button:before { - content: '\f474'; -} - -.mejs-fullscreen-button.mejs-unfullscreen button:before { - content: '\f406'; -} - -.mejs-overlay:hover .mejs-overlay-button { - background-color: #24890d; - color: #fff; -} - -.mejs-controls .mejs-button button:hover { - color: #41a62a; -} - - -/** - * 10.0 RTL - * ---------------------------------------------------------------------------- - */ - -html .mceContentBody.rtl { - direction: rtl; - unicode-bidi: embed; -} - -.rtl ol, -.rtl ul { - margin-left: 0; - margin-right: 24px; -} - -.rtl .wp-caption, -.rtl tr th { - text-align: right; -} - -.rtl td { - text-align: right; -} diff --git a/wp/wp-content/themes/twentyfourteen/css/ie.css b/wp/wp-content/themes/twentyfourteen/css/ie.css deleted file mode 100644 index 82142d2e..00000000 --- a/wp/wp-content/themes/twentyfourteen/css/ie.css +++ /dev/null @@ -1,1335 +0,0 @@ -/** - * Global Styles for older IE versions (previous to IE9). - */ - -pre, -fieldset, -table, -th, -td, -input, -textarea { - border: 1px solid #e5e5e5; -} - -hr { - background-color: #e5e5e5; -} - -button, -input, -select, -textarea { - vertical-align: middle; -} - - -input:focus, -textarea:focus { - border: 1px solid #b2b2b2; -} - -.site-title { - max-width: 71%; -} - -.site-content blockquote.alignleft, -.site-content blockquote.alignright { - border-top: 1px solid #e5e5e5; - border-bottom: 1px solid #e5e5e5; -} - -.post-thumbnail, -a.post-thumbnail:hover { - background: transparent; -} - -.list-view .site-content .hentry { - border-top: 1px solid #e5e5e5; - padding-top: 48px; -} - -.gallery-caption { - background: #000; - filter: alpha(opacity=0); -} - -.gallery-item:hover .gallery-caption { - filter: alpha(opacity=70); -} - -.nav-links { - border-top: 1px solid #e5e5e5; -} - -.post-navigation a, -.image-navigation .previous-image, -.image-navigation .next-image, -.contributor { - border-bottom: 1px solid #e5e5e5; -} - -.contributor-avatar, -.comment-author .avatar { - border: 1px solid #e5e5e5; -} - -.comment-list article, -.comment-list .pingback, -.comment-list .trackback { - border-top: 1px solid #e5e5e5; -} - -.comment-list .reply { - margin-top: 0; -} - -#secondary { - color: #b3b3b3; -} - -.widget abbr[title] { - border-color: #b3b3b3; -} - -.widget pre, -.widget fieldset, -.widget table, -.widget th, -.widget td, -.widget input, -.widget textarea { - border-color: #4d4d4d; -} - -.widget blockquote, -.widget .wp-caption, -.widget_twentyfourteen_ephemera .entry-meta a { - color: #b3b3b3; -} - -.widget del { - color: #666; -} - -.widget hr { - background-color: #4d4d4d; -} - -.widget input, -.widget textarea { - background-color: #1a1a1a; -} - -.widget input:focus, -.widget textarea:focus { - border-color: #262626; -} - -.widget_calendar thead th { - background-color: #1a1a1a; -} - -.widget_twentyfourteen_ephemera > ol > li { - border-bottom: 1px solid #4d4d4d; -} - -.widget_archive li, -.widget_categories li, -.widget_links li, -.widget_meta li, -.widget_nav_menu li, -.widget_pages li, -.widget_recent_comments li, -.widget_recent_entries li, -.widget_categories li ul, -.widget_nav_menu li ul, -.widget_pages li ul { - border-top: 1px solid #4d4d4d; -} - -.content-sidebar .widget pre, -.content-sidebar .widget fieldset, -.content-sidebar .widget table, -.content-sidebar .widget th, -.content-sidebar .widget td, -.content-sidebar .widget input, -.content-sidebar .widget textarea, -.content-sidebar .widget_archive li, -.content-sidebar .widget_categories li, -.content-sidebar .widget_links li, -.content-sidebar .widget_meta li, -.content-sidebar .widget_nav_menu li, -.content-sidebar .widget_pages li, -.content-sidebar .widget_recent_comments li, -.content-sidebar .widget_recent_entries li, -.content-sidebar .widget_categories li ul, -.content-sidebar .widget_nav_menu li ul, -.content-sidebar .widget_pages li ul { - border-color: #e5e5e5; -} - -.content-sidebar .widget hr { - background-color: #e5e5e5; -} - -.content-sidebar .widget input:focus, -.content-sidebar .widget textarea:focus { - border: 1px solid #b2b2b2; -} - -.content-sidebar .widget_calendar thead th { - background-color: #fafafa; -} - -.content-sidebar .widget_twentyfourteen_ephemera > ol > li { - border-bottom: 1px solid #e5e5e5; -} - -.site-footer, -.site-info, -.site-info a { - color: #b3b3b3; -} - -#supplementary + .site-info { - border-top: 1px solid #4d4d4d; -} - -.featured-content { - background: #000; -} - - -/** - * Internet Explorer 8 - */ - -.ie8 img.size-full, -.ie8 img.size-large, -.ie8 img.header-image, -.ie8 img.wp-post-image, -.ie8 img[class*="align"], -.ie8 img[class*="wp-image-"], -.ie8 img[class*="attachment-"] { - height: auto; - width: auto; /* Prevent stretching of full-size and large-size images with height and width attributes in IE8 */ -} - -.ie8 .full-size-link:before, -.ie8 .parent-post-link:before, -.ie8 .site-content span + .byline:before, -.ie8 .site-content span + .comments-link:before, -.ie8 .site-content span + .edit-link:before, -.ie8 .site-content span + .entry-date:before { - content: ""; -} - -.ie8 .attachment span.entry-date:before, -.ie8 .entry-content .edit-link a:before, -.ie8 .entry-meta .edit-link a:before, -.ie8 .site-content .byline a:before, -.ie8 .site-content .comments-link a:before, -.ie8 .site-content .entry-date a:before, -.ie8 .site-content .featured-post:before, -.ie8 .site-content .full-size-link a:before, -.ie8 .site-content .parent-post-link a:before, -.ie8 .site-content .post-format a:before { - display: inline-block; - font: normal 16px/1 Genericons; - text-decoration: inherit; - vertical-align: text-bottom; -} - -.ie8 .site-content .entry-meta > span { - margin-right: 10px; -} - -.ie8 .site-content .format-video .post-format a:before { - content: "\f104"; -} - -.ie8 .site-content .format-audio .post-format a:before { - content: "\f109"; -} - -.ie8 .site-content .format-image .post-format a:before { - content: "\f473"; - position: relative; - top: 1px; -} - -.ie8 .site-content .format-quote .post-format a:before { - content: "\f106"; - margin-right: 2px; -} - -.ie8 .site-content .format-gallery .post-format a:before { - content: "\f103"; - margin-right: 4px; -} - -.ie8 .site-content .format-aside .post-format a:before { - content: "\f101"; - margin-right: 2px; -} - -.ie8 .site-content .format-link .post-format a:before { - content: "\f107"; - position: relative; - top: 1px; -} - -.ie8 .site-content .featured-post:before { - content: "\f308"; - margin-right: 3px; - position: relative; - top: 1px; -} - -.ie8 .site-content .entry-date a:before, -.ie8 .attachment .site-content span.entry-date:before { - content: "\f303"; - margin-right: 1px; - position: relative; - top: 1px; -} - -.ie8 .site-content .byline a:before { - content: "\f304"; -} - -.ie8 .site-content .comments-link a:before { - content: "\f300"; - margin-right: 2px; -} - -.ie8 .entry-content .edit-link a:before, -.ie8 .entry-meta .edit-link a:before { - content: "\f411"; -} - -.ie8 .site-content .full-size-link a:before { - content: "\f402"; - margin-right: 1px; -} - -.ie8 .site-content .parent-post-link a:before { - content: "\f301"; -} - -.ie8 .main-content { - float: left; -} - -.ie8 .content-area { - float: left; - padding-top: 72px; - width: 100%; -} - -.ie8 .site-content { - margin-right: 29.04761904%; - margin-left: 17.61904761%; -} - -.ie8 .search-box-wrapper, -.ie8 .featured-content { - padding-left: 17.61904761%; -} - -.ie8 .header-main { - padding: 0 0 0 30px; -} - -.ie8 .search-toggle { - margin-right: 0; -} - -.ie8 .search-box .search-field { - width: 324px; -} - -.ie8 .site-navigation li .current_page_item > a, -.ie8 .site-navigation li .current_page_ancestor > a, -.ie8 .site-navigation li .current-menu-item > a, -.ie8 .site-navigation li .current-menu-ancestor > a { - background-color: #000; -} - -.ie8 .primary-navigation { - float: right; - font-size: 11px; - margin: 0 1px 0 -10px; - padding: 0; - text-transform: uppercase; -} - -.ie8 .primary-navigation .menu-toggle { - display: none; - padding: 0; -} - -.ie8 .primary-navigation .nav-menu { - border-bottom: 0; - display: block; -} - -.ie8 .primary-navigation.toggled-on { - border-bottom: 0; - margin: 0; - padding: 0; -} - -.ie8 .primary-navigation li { - border: 0; - display: inline-block; - height: 48px; - line-height: 48px; - position: relative; -} - -.ie8 .primary-navigation a { - display: inline-block; - padding: 0 10px; - white-space: nowrap; -} - -.ie8 .primary-navigation ul ul { - background-color: #24890d; - float: left; - margin: 0; - position: absolute; - top: 48px; - left: -999em; - z-index: 99999; -} - -.ie8 .primary-navigation li li { - border: 0; - display: block; - height: auto; - line-height: 1.0909090909; -} - -.ie8 .primary-navigation ul ul ul { - left: -999em; - top: 0; -} - -.ie8 .primary-navigation ul ul a { - padding: 18px 12px; - white-space: normal; - width: 176px; -} - -.ie8 .primary-navigation li:hover > a, -.ie8 .primary-navigation li.focus > a { - background-color: #24890d; - color: #fff; -} - -.ie8 .primary-navigation ul ul a:hover, -.ie8 .primary-navigation ul ul li.focus > a { - background-color: #41a62a; -} - -.ie8 .primary-navigation ul li:hover > ul, -.ie8 .primary-navigation ul li.focus > ul { - left: auto; -} - -.ie8 .primary-navigation ul ul li:hover > ul, -.ie8 .primary-navigation ul ul li.focus > ul { - left: 100%; -} - -.ie8 .archive-header, -.ie8 .page-header { - margin: 0 auto 60px; - padding: 0 10px; -} - -.ie8 .site-content .has-post-thumbnail .entry-header { - margin-top: -48px; -} - -.ie8 .archive-header, -.ie8 .comments-area, -.ie8 .image-navigation, -.ie8 .page-header, -.ie8 .page-content, -.ie8 .post-navigation, -.ie8 .site-content .entry-header, -.ie8 .site-content .entry-content, -.ie8 .site-content .entry-summary, -.ie8 .site-content footer.entry-meta { - margin-right: 54px; - padding-right: 30px; - padding-left: 30px; -} - -.ie8 .list-view .site-content .hentry:first-child, -.ie8 .list-view .site-content .hentry.has-post-thumbnail { - border-top: 0; - padding-top: 0; -} - -.ie8 .comment-list .trackback, -.ie8 .comment-list .pingback, -.ie8 .comment-list article { - margin-bottom: 36px; - padding-top: 36px; -} - -.ie8 .comment-author .avatar { - height: 34px; - top: 2px; - width: 34px; -} - -.ie8 .comment-author, -.ie8 .comment-awaiting-moderation, -.ie8 .comment-content, -.ie8 .comment-list .reply, -.ie8 .comment-metadata { - padding-left: 50px; -} - -.ie8 .comment-list .children { - margin-left: 20px; -} - -.ie8 .full-width .site-content { - margin-right: 0; -} - -.ie8 .full-width .archive-header, -.ie8 .full-width .comments-area, -.ie8 .full-width .image-navigation, -.ie8 .full-width .page-header, -.ie8 .full-width .page-content, -.ie8 .full-width .post-navigation, -.ie8 .full-width .site-content .entry-header, -.ie8 .full-width .site-content .entry-content, -.ie8 .full-width .site-content .entry-summary, -.ie8 .full-width .site-content footer.entry-meta { - padding-right: 30px; - padding-left: 30px; - margin-right: auto; -} - -.ie8 .full-width .hentry.has-post-thumbnail:first-child { - margin-top: -72px; -} - - -.ie8 .singular .site-content .hentry.has-post-thumbnail { - margin-top: 0; -} - -.ie8 .error404 .page-header { - margin-bottom: 24px; -} - -.ie8 .contributor-avatar { - margin-left: -168px; -} - -.ie8 .contributor-summary { - float: left; -} - -.ie8 .site:before { - background-color: #000; - content: ""; - display: block; - height: 100%; - min-height: 100%; - position: absolute; - top: 0; - left: 0; - width: 17.61904761%; - z-index: 2; -} - -.ie8 #secondary { - border: 0; - clear: none; - color: #b3b3b3; - float: left; - margin: 0 0 0 -100%; - min-height: 100vh; - padding: 0 30px; - width: 12.85714285%; -} - -.ie8 .site-description { - display: block; - margin: -3px 0 21px; -} - -.ie8 .secondary-navigation { - font-size: 11px; - margin: 0 -30px 48px; - width: calc(100% + 60px); -} - -.ie8 .secondary-navigation li { - border-top: 1px solid #4d4d4d; - position: relative; -} - -.ie8 .secondary-navigation a { - padding: 10px 30px; -} - -.ie8 .secondary-navigation ul ul { - background-color: #24890d; - position: absolute; - top: 0; - left: -999em; - width: 222px; - z-index: 99999; -} - -.ie8 .secondary-navigation li li { - border-top: 0; -} - -.ie8 .secondary-navigation li:hover > a, -.ie8 .secondary-navigation li.focus > a { - background-color: #24890d; - color: #fff; -} - -.ie8 .secondary-navigation ul ul a:hover, -.ie8 .secondary-navigation ul ul li.focus > a { - background-color: #41a62a; -} - -.ie8 .secondary-navigation ul li:hover > ul, -.ie8 .secondary-navigation ul li.focus > ul { - left: 202px; -} - -.ie8 .content-sidebar { - border: 0; - float: right; - margin-left: -29.04761904%; - padding: 72px 30px 24px; - width: 29.04761904%; -} - -.ie8 #supplementary { - padding: 0; -} - -.ie8 .footer-sidebar { - font-size: 12px; - line-height: 1.5; -} - -.ie8 .footer-sidebar .widget, -.ie8 .primary-sidebar .widget { - font-size: 12px; - line-height: 1.5; -} - -.ie8 .footer-sidebar .widget { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - padding: 0 30px; - width: 25%; -} - -.ie8 .footer-sidebar .widget h1, -.ie8 .primary-sidebar .widget h1 { - font-size: 20px; - line-height: 1.2; -} - -.ie8 .footer-sidebar .widget h2, -.ie8 .primary-sidebar .widget h2 { - font-size: 18px; - line-height: 1.3333333333; -} - -.ie8 .footer-sidebar .widget h3, -.ie8 .primary-sidebar .widget h3 { - font-size: 16px; - line-height: 1.5; -} - -.ie8 .footer-sidebar .widget h4, -.ie8 .primary-sidebar .widget h4 { - font-size: 14px; - line-height: 1.7142857142; -} - -.ie8 .footer-sidebar .widget h5, -.ie8 .primary-sidebar .widget h5 { - font-size: 12px; - line-height: 2; -} - -.ie8 .footer-sidebar .widget h6, -.ie8 .primary-sidebar .widget h6 { - font-size: 11px; - line-height: 2.1818181818; -} - -.ie8 .footer-sidebar .widget code, -.ie8 .footer-sidebar .widget kbd, -.ie8 .footer-sidebar .widget tt, -.ie8 .footer-sidebar .widget var, -.ie8 .footer-sidebar .widget samp, -.ie8 .footer-sidebar .widget pre, -.ie8 .primary-sidebar .widget code, -.ie8 .primary-sidebar .widget kbd, -.ie8 .primary-sidebar .widget tt, -.ie8 .primary-sidebar .widget var, -.ie8 .primary-sidebar .widget samp, -.ie8 .primary-sidebar .widget pre { - font-size: 11px; - line-height: 1.6363636363; -} - -.ie8 .footer-sidebar .widget blockquote, -.ie8 .primary-sidebar .widget blockquote { - font-size: 14px; - line-height: 1.2857142857; -} - -.ie8 .footer-sidebar .widget blockquote cite, -.ie8 .primary-sidebar .widget blockquote cite { - font-size: 12px; - line-height: 1.5; -} - -.ie8 .footer-sidebar .widget input, -.ie8 .footer-sidebar .widget textarea, -.ie8 .primary-sidebar .widget input, -.ie8 .primary-sidebar .widget textarea { - font-size: 12px; - padding: 3px 2px 4px 4px; -} - -.ie8 .footer-sidebar .widget input[type="button"], -.ie8 .footer-sidebar .widget input[type="reset"], -.ie8 .footer-sidebar .widget input[type="submit"], -.ie8 .primary-sidebar .widget input[type="button"], -.ie8 .primary-sidebar .widget input[type="reset"], -.ie8 .primary-sidebar .widget input[type="submit"] { - padding: 5px 15px 4px; -} - -.ie8 .footer-sidebar .widget .widget-title, -.ie8 .primary-sidebar .widget .widget-title { - font-size: 11px; - font-weight: 700; - line-height: 1.6363636363; - margin-bottom: 18px; -} - -.ie8 .footer-sidebar .widget_twentyfourteen_ephemera .entry-title, -.ie8 .footer-sidebar .widget_twentyfourteen_ephemera .entry-meta, -.ie8 .footer-sidebar .widget_twentyfourteen_ephemera .wp-caption-text, -.ie8 .footer-sidebar .widget_twentyfourteen_ephemera .post-format-archive-link, -.ie8 .footer-sidebar .widget_twentyfourteen_ephemera .entry-content table, -.ie8 .primary-sidebar .widget_twentyfourteen_ephemera .entry-title, -.ie8 .primary-sidebar .widget_twentyfourteen_ephemera .entry-meta, -.ie8 .primary-sidebar .widget_twentyfourteen_ephemera .wp-caption-text, -.ie8 .primary-sidebar .widget_twentyfourteen_ephemera .post-format-archive-link, -.ie8 .primary-sidebar .widget_twentyfourteen_ephemera .entry-content table { - font-size: 11px; - line-height: 1.6363636363; -} - -.ie8 .footer-sidebar .widget_archive li, -.ie8 .footer-sidebar .widget_categories li, -.ie8 .footer-sidebar .widget_links li, -.ie8 .footer-sidebar .widget_meta li, -.ie8 .footer-sidebar .widget_nav_menu li, -.ie8 .footer-sidebar .widget_pages li, -.ie8 .footer-sidebar .widget_recent_comments li, -.ie8 .footer-sidebar .widget_recent_entries li, -.ie8 .primary-sidebar .widget_archive li, -.ie8 .primary-sidebar .widget_categories li, -.ie8 .primary-sidebar .widget_links li, -.ie8 .primary-sidebar .widget_meta li, -.ie8 .primary-sidebar .widget_nav_menu li, -.ie8 .primary-sidebar .widget_pages li, -.ie8 .primary-sidebar .widget_recent_comments li, -.ie8 .primary-sidebar .widget_recent_entries li { - border-top: 0; - padding: 0 0 6px; -} - -.ie8 .footer-sidebar .widget_categories li ul, -.ie8 .footer-sidebar .widget_nav_menu li ul, -.ie8 .footer-sidebar .widget_pages li ul, -.ie8 .primary-sidebar .widget_categories li ul, -.ie8 .primary-sidebar .widget_nav_menu li ul, -.ie8 .primary-sidebar .widget_pages li ul { - border-top: 0; - margin-top: 0; -} - -.ie8 .grid .featured-content .entry-header { - border-color: #000; - border-style: solid; - border-width: 12px 10px; - height: 96px; - padding: 0; -} - -.ie8 .featured-content { - padding-left: 17.61904761%; -} - -.ie8 .grid .featured-content .hentry { - float: left; - width: 33.3333333%; -} - -.ie8 .grid .featured-content .hentry:nth-child( 3n+1 ) { - clear: both; -} - -.ie8 .grid .featured-content .entry-header { - height: 120px; -} - -.ie8 .slider .featured-content .entry-title { - font-size: 33px; - line-height: 1.0909090909; -} - -.ie8 .slider .featured-content .entry-header { - min-height: inherit; - padding: 24px 30px 48px; - position: absolute; - left: 0; - bottom: 0; - width: 50%; - z-index: 3; -} - -.ie8 .slider-control-paging { - background: transparent; - margin-top: -48px; - padding-left: 24px; - width: 50%; -} - -.ie8 .slider-control-paging li { - margin: 12px 12px 12px 0; -} - -.ie8 .slider-control-paging a { - height: 24px; - width: 24px; -} - -.ie8 .slider-control-paging a:before { - top: 6px; - left: 6px; -} - -.ie8 .slider-direction-nav { - clear: none; - float: right; - margin-top: -48px; - width: 98px; -} - -.ie8 .slider-direction-nav li:first-child { - padding: 0 1px 0 0; -} - -.ie8 .slider-direction-nav li { - border: 0; - padding: 0 0 0 1px; -} - -.ie8 .slider-direction-nav a { - height: 48px; -} - -.ie8 .slider-direction-nav a:before { - line-height: 48px; -} - - -/** - * Internet Explorer 7 - */ - -.ie7 audio, -.ie7 canvas, -.ie7 video { - display: inline; - zoom: 1; -} - -.ie7 button, -.ie7 input, -.ie7 select, -.ie7 textarea { - vertical-align: middle; -} - -.ie7 button, -.ie7 input[type="button"], -.ie7 input[type="reset"], -.ie7 input[type="submit"] { - overflow: visible; -} - -.ie7 .screen-reader-text { - clip: rect(1px 1px 1px 1px); -} - -.ie7 .site, -.ie7 .site-header { - max-width: 100%; -} - -.ie7 .search-toggle { - line-height: 45px; - margin-right: 190px; - padding: 0 20px; - text-transform: uppercase; - width: auto; -} - -.ie7 .search-toggle .screen-reader-text { - color: #fff; - position: relative; /* Override inherited `absolute` value set in style.css. */ -} - -.ie7 .search-box { - height: 24px; - padding: 12px 0; -} - -.ie7 .search-box .search-field { - margin: 0 10px; - width: 33%; -} - -.ie7 .site-navigation li { - border-top: 1px solid #4d4d4d; -} - -.ie7 .primary-navigation .nav-menu, -.ie7 .secondary-navigation { - border-bottom: 1px solid #4d4d4d; -} - -.ie7 .secondary-navigation { - margin: 48px auto; - max-width: 474px -} - -.ie7 .content-area { - padding-top: 48px; -} - -.ie7 .hentry { - max-width: 100%; -} - -.ie7 .menu-toggle { - color: #fff; - font-weight: 400; - font-size: 16px; - line-height: 45px; - text-transform: uppercase; - width: 200px; -} - -.ie7 .post-thumbnail img { - display: block; - margin: 0 auto; -} - -.ie7 .entry-meta .tag-links a { - margin-left: 0; -} - -.ie7 .content-sidebar { - padding: 48px 10px; -} - -.ie7 .singular .hentry.has-post-thumbnail { - margin-top: -48px; -} - -.ie7 .entry-meta > span, -.ie7 .widget_twentyfourteen_ephemera .entry-title { - margin-right: 20px; -} - -.ie7 #secondary { - border-bottom: 1px solid #4d4d4d; -} - -.ie7 .content-sidebar { - border-top: 1px solid #e5e5e5; - border-bottom: 1px solid #e5e5e5; -} - -.ie7 .widget { - margin: 0 auto 48px; - max-width: 474px; -} - -.ie7 .content-sidebar .widget_twentyfourteen_ephemera .widget-title { - padding-top: 7px; -} - -.ie7 .slider .featured-content .hentry { - display: block; -} - -.ie7 .featured-content .entry-header { - min-height: 0; -} - -.ie7 .slider-control-paging a { - line-height: 40px; - text-indent: 0; -} - -.ie7 .slider-control-paging .slider-active { - color: #41a62a; -} - -.ie7 .slider-direction-nav { - border-top: 2px solid #fff; -} - -.ie7 .slider-direction-nav li { - border: 0; - width: 49%; -} - -.ie7 .slider-direction-nav a { - font-size: 16px; - line-height: 45px; - text-transform: uppercase; -} - -.ie7 .slider-direction-nav a:hover { - background-color: #000; - color: #41a62a; -} - -.ie7 .search-toggle { - line-height: 45px; - margin-right: 190px; -} - -.ie7 .featured-content .post-thumbnail, -.ie7 .slider .featured-content .post-thumbnail { - padding-top: 0; -} - -.ie7 .featured-content .post-thumbnail img { - position: relative; -} - -.ie7 .featured-content .entry-header { - width: auto; -} - -.ie7 .grid .featured-content .hentry { - float: left; - margin: 0 auto; - max-width: 672px; - width: 33.333333%; -} - -.ie7 .slider .featured-content .entry-header { - margin: 0 auto; - max-width: 1038px; -} - -.ie7 .slider-control-paging { - float: none; - margin: -24px auto 0; - max-width: 1038px; - width: auto; -} - - -/** - * RTL for Internet Explorer 8 & 7 - */ - -.rtl .attachment a, -.rtl .gallery a, -.rtl .wp-caption a, -.rtl .widget_twentyfourteen_ephemera .entry-content a { - display: inline; -} - - -/** - * RTL overrides for Internet Explorer 8 - */ - -.ie8 .rtl .site-content .entry-meta > span { - margin-right: auto; - margin-left: 10px; -} - -.ie8 .rtl .site-content .format-quote .post-format a:before { - margin-right: auto; - margin-left: 2px; -} - -.ie8 .rtl .site-content .format-gallery .post-format a:before { - margin-right: auto; - margin-left: 4px; -} - -.ie8 .rtl .site-content .format-aside .post-format a:before { - margin-right: auto; - margin-left: 2px; -} - -.ie8 .rtl .site-content .featured-post:before { - margin-right: auto; - margin-left: 3px; -} - -.ie8 .rtl .site-content .entry-date a:before, -.ie8 .rtl .attachment .site-content span.entry-date:before { - margin-right: auto; - margin-left: 1px; -} - -.ie8 .rtl .site-content .comments-link a:before { - margin-right: auto; - margin-left: 2px; -} - -.ie8 .rtl .site-content .full-size-link a:before { - margin-right: auto; - margin-left: 1px; -} - -.ie8 .rtl .main-content { - float: right; -} - -.ie8 .rtl .content-area { - float: right; -} - -.ie8 .rtl .site-content { - margin-right: 17.61904761%; - margin-left: 29.04761904%; -} - -.ie8 .rtl .search-box-wrapper, -.ie8 .rtl .featured-content { - padding-right: 17.61904761%; - padding-left: 0; -} - -.ie8 .rtl .header-main { - padding: 0 30px 0 0; -} - -.ie8 .rtl .search-toggle { - margin-right: auto; - margin-left: 0; -} - -.ie8 .rtl .primary-navigation { - float: left; - margin: 0 -10px 0 1px; -} - -.ie8 .rtl .primary-navigation ul ul { - float: right; - right: -999em; - left: auto; -} - -.ie8 .rtl .primary-navigation ul ul ul { - right: -999em; - left: auto; -} - -.ie8 .rtl .primary-navigation ul li:hover > ul, -.ie8 .rtl .primary-navigation ul li.focus > ul { - right: auto; - left: auto; -} - -.ie8 .rtl .primary-navigation ul ul li:hover > ul, -.ie8 .rtl .primary-navigation ul ul li.focus > ul { - right: 100%; - left: auto; -} - -.ie8 .rtl .entry-meta .tag-links a:before { - right: -8px; -} - -.ie8 .rtl .archive-header, -.ie8 .rtl .comments-area, -.ie8 .rtl .image-navigation, -.ie8 .rtl .page-header, -.ie8 .rtl .page-content, -.ie8 .rtl .post-navigation, -.ie8 .rtl .site-content .entry-header, -.ie8 .rtl .site-content .entry-content, -.ie8 .rtl .site-content .entry-summary, -.ie8 .rtl .site-content footer.entry-meta { - margin-right: auto; - margin-left: 54px; -} - -.ie8 .rtl .comment-author, -.ie8 .rtl .comment-awaiting-moderation, -.ie8 .rtl .comment-content, -.ie8 .rtl .comment-list .reply, -.ie8 .rtl .comment-metadata { - padding-right: 50px; - padding-left: 0; -} - -.ie8 .rtl .comment-list .children { - margin-right: 20px; - margin-left: auto; -} - - -.ie8 .rtl.full-width .site-content { - margin-left: 0; -} - -.ie8 .rtl.full-width .archive-header, -.ie8 .rtl.full-width .comments-area, -.ie8 .rtl.full-width .image-navigation, -.ie8 .rtl.full-width .page-header, -.ie8 .rtl.full-width .page-content, -.ie8 .rtl.full-width .post-navigation, -.ie8 .rtl.full-width .site-content .entry-header, -.ie8 .rtl.full-width .site-content .entry-content, -.ie8 .rtl.full-width .site-content .entry-summary, -.ie8 .rtl.full-width .site-content footer.entry-meta { - margin-left: auto; -} - -.ie8 .rtl .contributor-avatar { - margin-right: -168px; - margin-left: auto; -} - -.ie8 .rtl .contributor-summary { - float: right; -} - -.ie8 .rtl .site:before { - right: 0; - left: auto; -} - -.ie8 .rtl #secondary { - float: right; - margin: 0 -100% 0 0; -} - -.ie8 .rtl .secondary-navigation ul ul { - right: -999em; - left: auto; -} - -.ie8 .rtl .secondary-navigation ul li:hover > ul, -.ie8 .rtl .secondary-navigation ul li.focus > ul { - right: 202px; - left: auto; -} - -.ie8 .rtl .content-sidebar { - float: left; - margin-right: -29.04761904%; - margin-left: auto; -} - -.ie8 .rtl .footer-sidebar .widget { - float: right; -} - -.ie8 .rtl .featured-content { - padding-right: 17.61904761%; - padding-left: 0; -} - -.ie8 .rtl.grid .featured-content .hentry { - float: right; -} - -.ie8 .rtl.slider .featured-content .entry-header { - right: 0; - left: auto; -} - -.ie8 .rtl .slider-control-paging { - padding-right: 24px; - padding-left: 0; -} - -.ie8 .rtl .slider-control-paging li { - margin: 12px 0 12px 12px; -} - -.ie8 .rtl .slider-control-paging a:before { - right: 6px; - left: auto; -} - -.ie8 .rtl .slider-direction-nav { - float: left; -} - -.ie8 .rtl .slider-direction-nav li { - padding: 0 1px 0 0; -} - -.ie8 .rtl .slider-direction-nav li:first-child { - padding: 0 0 0 1px; -} - - -/** - * RTL overrides for Internet Explorer 7 - */ - -.ie7 .rtl.grid .featured-content .hentry { - float: right; -} - -.ie7 .rtl .slider-control-paging { - float: none; - margin: -24px auto 0; -} - -.ie7 .rtl .entry-meta .tag-links a { - margin-right: 0; - margin-left: auto; -} - -.ie7 .rtl .search-toggle { - margin-right: auto; - margin-left: 190px; -} \ No newline at end of file diff --git a/wp/wp-content/themes/twentyfourteen/featured-content.php b/wp/wp-content/themes/twentyfourteen/featured-content.php deleted file mode 100644 index c56edf3e..00000000 --- a/wp/wp-content/themes/twentyfourteen/featured-content.php +++ /dev/null @@ -1,39 +0,0 @@ - - - diff --git a/wp/wp-content/themes/twentyfourteen/footer.php b/wp/wp-content/themes/twentyfourteen/footer.php deleted file mode 100644 index 519e1288..00000000 --- a/wp/wp-content/themes/twentyfourteen/footer.php +++ /dev/null @@ -1,28 +0,0 @@ - - - - -
    - - - -
    - - -
    -
    - - - - - \ No newline at end of file diff --git a/wp/wp-content/themes/twentyfourteen/functions.php b/wp/wp-content/themes/twentyfourteen/functions.php deleted file mode 100644 index 74141dc3..00000000 --- a/wp/wp-content/themes/twentyfourteen/functions.php +++ /dev/null @@ -1,547 +0,0 @@ - for posts and comments. - add_theme_support( 'automatic-feed-links' ); - - // Enable support for Post Thumbnails, and declare two sizes. - add_theme_support( 'post-thumbnails' ); - set_post_thumbnail_size( 672, 372, true ); - add_image_size( 'twentyfourteen-full-width', 1038, 576, true ); - - // This theme uses wp_nav_menu() in two locations. - register_nav_menus( array( - 'primary' => __( 'Top primary menu', 'twentyfourteen' ), - 'secondary' => __( 'Secondary menu in left sidebar', 'twentyfourteen' ), - ) ); - - /* - * Switch default core markup for search form, comment form, and comments - * to output valid HTML5. - */ - add_theme_support( 'html5', array( - 'search-form', 'comment-form', 'comment-list', 'gallery', 'caption' - ) ); - - /* - * Enable support for Post Formats. - * See https://codex.wordpress.org/Post_Formats - */ - add_theme_support( 'post-formats', array( - 'aside', 'image', 'video', 'audio', 'quote', 'link', 'gallery', - ) ); - - // This theme allows users to set a custom background. - add_theme_support( 'custom-background', apply_filters( 'twentyfourteen_custom_background_args', array( - 'default-color' => 'f5f5f5', - ) ) ); - - // Add support for featured content. - add_theme_support( 'featured-content', array( - 'featured_content_filter' => 'twentyfourteen_get_featured_posts', - 'max_posts' => 6, - ) ); - - // This theme uses its own gallery styles. - add_filter( 'use_default_gallery_style', '__return_false' ); - - // Indicate widget sidebars can use selective refresh in the Customizer. - add_theme_support( 'customize-selective-refresh-widgets' ); -} -endif; // twentyfourteen_setup -add_action( 'after_setup_theme', 'twentyfourteen_setup' ); - -/** - * Adjust content_width value for image attachment template. - * - * @since Twenty Fourteen 1.0 - */ -function twentyfourteen_content_width() { - if ( is_attachment() && wp_attachment_is_image() ) { - $GLOBALS['content_width'] = 810; - } -} -add_action( 'template_redirect', 'twentyfourteen_content_width' ); - -/** - * Getter function for Featured Content Plugin. - * - * @since Twenty Fourteen 1.0 - * - * @return array An array of WP_Post objects. - */ -function twentyfourteen_get_featured_posts() { - /** - * Filter the featured posts to return in Twenty Fourteen. - * - * @since Twenty Fourteen 1.0 - * - * @param array|bool $posts Array of featured posts, otherwise false. - */ - return apply_filters( 'twentyfourteen_get_featured_posts', array() ); -} - -/** - * A helper conditional function that returns a boolean value. - * - * @since Twenty Fourteen 1.0 - * - * @return bool Whether there are featured posts. - */ -function twentyfourteen_has_featured_posts() { - return ! is_paged() && (bool) twentyfourteen_get_featured_posts(); -} - -/** - * Register three Twenty Fourteen widget areas. - * - * @since Twenty Fourteen 1.0 - */ -function twentyfourteen_widgets_init() { - require get_template_directory() . '/inc/widgets.php'; - register_widget( 'Twenty_Fourteen_Ephemera_Widget' ); - - register_sidebar( array( - 'name' => __( 'Primary Sidebar', 'twentyfourteen' ), - 'id' => 'sidebar-1', - 'description' => __( 'Main sidebar that appears on the left.', 'twentyfourteen' ), - 'before_widget' => '', - 'before_title' => '

    ', - 'after_title' => '

    ', - ) ); - register_sidebar( array( - 'name' => __( 'Content Sidebar', 'twentyfourteen' ), - 'id' => 'sidebar-2', - 'description' => __( 'Additional sidebar that appears on the right.', 'twentyfourteen' ), - 'before_widget' => '', - 'before_title' => '

    ', - 'after_title' => '

    ', - ) ); - register_sidebar( array( - 'name' => __( 'Footer Widget Area', 'twentyfourteen' ), - 'id' => 'sidebar-3', - 'description' => __( 'Appears in the footer section of the site.', 'twentyfourteen' ), - 'before_widget' => '', - 'before_title' => '

    ', - 'after_title' => '

    ', - ) ); -} -add_action( 'widgets_init', 'twentyfourteen_widgets_init' ); - -/** - * Register Lato Google font for Twenty Fourteen. - * - * @since Twenty Fourteen 1.0 - * - * @return string - */ -function twentyfourteen_font_url() { - $font_url = ''; - /* - * Translators: If there are characters in your language that are not supported - * by Lato, translate this to 'off'. Do not translate into your own language. - */ - if ( 'off' !== _x( 'on', 'Lato font: on or off', 'twentyfourteen' ) ) { - $query_args = array( - 'family' => urlencode( 'Lato:300,400,700,900,300italic,400italic,700italic' ), - 'subset' => urlencode( 'latin,latin-ext' ), - ); - $font_url = add_query_arg( $query_args, 'https://fonts.googleapis.com/css' ); - } - - return $font_url; -} - -/** - * Enqueue scripts and styles for the front end. - * - * @since Twenty Fourteen 1.0 - */ -function twentyfourteen_scripts() { - // Add Lato font, used in the main stylesheet. - wp_enqueue_style( 'twentyfourteen-lato', twentyfourteen_font_url(), array(), null ); - - // Add Genericons font, used in the main stylesheet. - wp_enqueue_style( 'genericons', get_template_directory_uri() . '/genericons/genericons.css', array(), '3.0.3' ); - - // Load our main stylesheet. - wp_enqueue_style( 'twentyfourteen-style', get_stylesheet_uri() ); - - // Load the Internet Explorer specific stylesheet. - wp_enqueue_style( 'twentyfourteen-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentyfourteen-style' ), '20131205' ); - wp_style_add_data( 'twentyfourteen-ie', 'conditional', 'lt IE 9' ); - - if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) { - wp_enqueue_script( 'comment-reply' ); - } - - if ( is_singular() && wp_attachment_is_image() ) { - wp_enqueue_script( 'twentyfourteen-keyboard-image-navigation', get_template_directory_uri() . '/js/keyboard-image-navigation.js', array( 'jquery' ), '20130402' ); - } - - if ( is_active_sidebar( 'sidebar-3' ) ) { - wp_enqueue_script( 'jquery-masonry' ); - } - - if ( is_front_page() && 'slider' == get_theme_mod( 'featured_content_layout' ) ) { - wp_enqueue_script( 'twentyfourteen-slider', get_template_directory_uri() . '/js/slider.js', array( 'jquery' ), '20131205', true ); - wp_localize_script( 'twentyfourteen-slider', 'featuredSliderDefaults', array( - 'prevText' => __( 'Previous', 'twentyfourteen' ), - 'nextText' => __( 'Next', 'twentyfourteen' ) - ) ); - } - - wp_enqueue_script( 'twentyfourteen-script', get_template_directory_uri() . '/js/functions.js', array( 'jquery' ), '20150315', true ); -} -add_action( 'wp_enqueue_scripts', 'twentyfourteen_scripts' ); - -/** - * Enqueue Google fonts style to admin screen for custom header display. - * - * @since Twenty Fourteen 1.0 - */ -function twentyfourteen_admin_fonts() { - wp_enqueue_style( 'twentyfourteen-lato', twentyfourteen_font_url(), array(), null ); -} -add_action( 'admin_print_scripts-appearance_page_custom-header', 'twentyfourteen_admin_fonts' ); - -/** - * Add preconnect for Google Fonts. - * - * @since Twenty Fourteen 1.9 - * - * @param array $urls URLs to print for resource hints. - * @param string $relation_type The relation type the URLs are printed. - * @return array URLs to print for resource hints. - */ -function twentyfourteen_resource_hints( $urls, $relation_type ) { - if ( wp_style_is( 'twentyfourteen-lato', 'queue' ) && 'preconnect' === $relation_type ) { - if ( version_compare( $GLOBALS['wp_version'], '4.7-alpha', '>=' ) ) { - $urls[] = array( - 'href' => 'https://fonts.gstatic.com', - 'crossorigin', - ); - } else { - $urls[] = 'https://fonts.gstatic.com'; - } - } - - return $urls; -} -add_filter( 'wp_resource_hints', 'twentyfourteen_resource_hints', 10, 2 ); - -if ( ! function_exists( 'twentyfourteen_the_attached_image' ) ) : -/** - * Print the attached image with a link to the next attached image. - * - * @since Twenty Fourteen 1.0 - */ -function twentyfourteen_the_attached_image() { - $post = get_post(); - /** - * Filter the default Twenty Fourteen attachment size. - * - * @since Twenty Fourteen 1.0 - * - * @param array $dimensions { - * An array of height and width dimensions. - * - * @type int $height Height of the image in pixels. Default 810. - * @type int $width Width of the image in pixels. Default 810. - * } - */ - $attachment_size = apply_filters( 'twentyfourteen_attachment_size', array( 810, 810 ) ); - $next_attachment_url = wp_get_attachment_url(); - - /* - * Grab the IDs of all the image attachments in a gallery so we can get the URL - * of the next adjacent image in a gallery, or the first image (if we're - * looking at the last image in a gallery), or, in a gallery of one, just the - * link to that image file. - */ - $attachment_ids = get_posts( array( - 'post_parent' => $post->post_parent, - 'fields' => 'ids', - 'numberposts' => -1, - 'post_status' => 'inherit', - 'post_type' => 'attachment', - 'post_mime_type' => 'image', - 'order' => 'ASC', - 'orderby' => 'menu_order ID', - ) ); - - // If there is more than 1 attachment in a gallery... - if ( count( $attachment_ids ) > 1 ) { - foreach ( $attachment_ids as $idx => $attachment_id ) { - if ( $attachment_id == $post->ID ) { - $next_id = $attachment_ids[ ( $idx + 1 ) % count( $attachment_ids ) ]; - break; - } - } - - // get the URL of the next image attachment... - if ( $next_id ) { - $next_attachment_url = get_attachment_link( $next_id ); - } - - // or get the URL of the first image attachment. - else { - $next_attachment_url = get_attachment_link( reset( $attachment_ids ) ); - } - } - - printf( '%2$s', - esc_url( $next_attachment_url ), - wp_get_attachment_image( $post->ID, $attachment_size ) - ); -} -endif; - -if ( ! function_exists( 'twentyfourteen_list_authors' ) ) : -/** - * Print a list of all site contributors who published at least one post. - * - * @since Twenty Fourteen 1.0 - */ -function twentyfourteen_list_authors() { - $contributor_ids = get_users( array( - 'fields' => 'ID', - 'orderby' => 'post_count', - 'order' => 'DESC', - 'who' => 'authors', - ) ); - - foreach ( $contributor_ids as $contributor_id ) : - $post_count = count_user_posts( $contributor_id ); - - // Move on if user has not published a post (yet). - if ( ! $post_count ) { - continue; - } - ?> - -
    -
    -
    -
    -

    -

    - -

    - - - -
    -
    -
    - - = 2 || $page >= 2 ) && ! is_404() ) { - $title = "$title $sep " . sprintf( __( 'Page %s', 'twentyfourteen' ), max( $paged, $page ) ); - } - - return $title; -} -add_filter( 'wp_title', 'twentyfourteen_wp_title', 10, 2 ); - -// Implement Custom Header features. -require get_template_directory() . '/inc/custom-header.php'; - -// Custom template tags for this theme. -require get_template_directory() . '/inc/template-tags.php'; - -// Add Customizer functionality. -require get_template_directory() . '/inc/customizer.php'; - -/* - * Add Featured Content functionality. - * - * To overwrite in a plugin, define your own Featured_Content class on or - * before the 'setup_theme' hook. - */ -if ( ! class_exists( 'Featured_Content' ) && 'plugins.php' !== $GLOBALS['pagenow'] ) { - require get_template_directory() . '/inc/featured-content.php'; -} diff --git a/wp/wp-content/themes/twentyfourteen/genericons/COPYING.txt b/wp/wp-content/themes/twentyfourteen/genericons/COPYING.txt deleted file mode 100644 index aece214b..00000000 --- a/wp/wp-content/themes/twentyfourteen/genericons/COPYING.txt +++ /dev/null @@ -1,9 +0,0 @@ -Genericons is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - -The fonts are distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. - -This license does not convey any intellectual property rights to third party trademarks that may be included in the icon font; such marks remain subject to all rights and guidelines of use of their owner. \ No newline at end of file diff --git a/wp/wp-content/themes/twentyfourteen/genericons/Genericons-Regular.otf b/wp/wp-content/themes/twentyfourteen/genericons/Genericons-Regular.otf deleted file mode 100644 index 5cd41e8b81c9fa490d0ed695536226c0dbe69ac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18212 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 - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/wp/wp-content/themes/twentyfourteen/genericons/README.txt b/wp/wp-content/themes/twentyfourteen/genericons/README.txt deleted file mode 100644 index 7a0a92e5..00000000 --- a/wp/wp-content/themes/twentyfourteen/genericons/README.txt +++ /dev/null @@ -1,123 +0,0 @@ - ___ ____ __ _ ____ ____ __ ___ __ __ _ ____ - / __)( __)( ( \( __)( _ \( )/ __)/ \ ( ( \/ ___) -( (_ \ ) _) / / ) _) ) / )(( (__( O )/ /\___ \ - \___/(____)\_)__)(____)(__\_)(__)\___)\__/ \_)__)(____/ - - -Genericons are vector icons embedded in a webfont designed to be clean and simple keeping with a generic aesthetic. - -Use genericons for instant HiDPI, to change icon colors on the fly, or even with CSS effects such as drop-shadows or gradients! - - -_ _ ____ ____ ____ ____ -| | [__ |__| | __ |___ -|__| ___] | | |__] |___ - - -To use it, place the font folder in your stylesheet directory and paste this in your CSS file: - -/* =Genericons, thanks to FontSquirrel.com for conversion! --------------------------------------------------------------- */ -@font-face { - font-family: 'Genericons'; - src: url('font/genericons-regular-webfont.eot'); - src: url('font/genericons-regular-webfont.eot?#iefix') format('embedded-opentype'), - url('font/genericons-regular-webfont.woff') format('woff'), - url('font/genericons-regular-webfont.ttf') format('truetype'), - url('font/genericons-regular-webfont.svg#genericonsregular') format('svg'); - font-weight: normal; - font-style: normal; - -} - -Note: the above only works if you don't use a CDN. If you do, or don't know what that is, you should use the syntax that's embedded in genericons.css. - -From then on, you can create an icon like this: - -.my-icon:before { - content: '\f101'; - display: inline-block; - -webkit-font-smoothing: antialiased; - font: normal 16px/1 'Genericons'; - vertical-align: top; -} - -This will output a comment icon before every element with the class "my-icon". The "content: '\f101';" part of this CSS is easily copied from the helper tool at http://genericons.com/ - -You can also use the bundled example.css if you'd rather insert the icons using HTML tags. - - -_ _ ____ ___ ____ ____ -|\ | | | | |___ [__ -| \| |__| | |___ ___] - - -Photoshop mockups: - -Genericons-Regular.otf found in the root directory of this zip has not been web-font-ified. So you can drop it in your system fonts folder and use the font in Photoshop if you like. - -For those of you using Genericons in your Photoshop mockup, remember to delete the old version of the font from Font Book, and grab the new one from the zip file. This also affects using it in your webdesigns: if you have an old version of the font installed locally, that's the font that'll be used in your website as well, so if you're missing icons, check for old versions of the font on your system. - -Pixel grid: - -Note that Genericons has been designed for a 16x16 pixel grid. That means it'll look sharp at font-size: 16px exactly. It'll also be crisp at multiples thereof, such as 32px or 64px. It'll also look reasonably crisp at in-between font sizes such as 24px or 48px, but not quite as crisp as 16 or 32. Please don't set the font-size to 17px, though, that'll just look terrible. - -Also note the CSS property "-webkit-font-smoothing: antialiased". That makes the icons look great in WebKit browsers. Please see http://noscope.com/2012/font-smoothing for more info. - -Updates: - -We don't often update icons, but do very carefully when we get good feedback suggesting improvements. Please be mindful if you upgrade, and check that the updated icons behave as you intended. - - - -____ _ _ ____ _ _ ____ ____ _ ____ ____ -| |__| |__| |\ | | __ |___ | | | | __ -|___ | | | | | \| |__] |___ |___ |__| |__] - -V3.0.3: -Bunch of updates mostly. -- Two new icons, Dropbox and Fullscreen. -- Updates to all icons containing an exclamation mark. -- Updates to Image and Quote. -- Nicer "Share" icon. -- Bigger default Linkedin icon. - -V3.0.2: -A slew of new stuff and updates. -- Social icons: Skype, Digg, Reddit, Stumbleupon, Pocket. -- New generic icons: heart, lock and print. -- New editing icons: code, bold, italic, image -- New interaction icons: subscribe, unsubscribe, subscribed, reply all, reply, flag. -- The hyperlink icon has been updated to be clearer, chunkier. -- The "home" icon has been updated for style, size and clarity. -- The email icon has been updated for style and clarity, and to fit with the new subscribe icons. -- The document icon has been updated for style. -- The "pin" icon has been updated for style and clarity. -- The Twitter icon has been scaled down to fit with the other social icons. - -V3.0.1: -Mostly maintenance. -- Fixed an issue with the example page that showed an old "top" icon instead of the actual NEW "refresh" icon. -- Added inverse Google+ and Path. -- Replaced tabs with spaces in the helper CSS. -- Changed the Genericons.com copy/paste tool to serve span's instead of div's for casual icon insertion. It's being converted to "inline-block" anyway. - -V3.0: -Mainly maintenance and a few new icons. -- Fast forward, rewind, PollDaddy, Notice, Info, Help, Portfolio -- Updated the feed icon. It's a bit smaller now for consistency, the previous one was rather big. -- So, the previous version numbering, 2.09, wasn't very PHP version compare friendly. So from now on it'll be 3.0, 3.1 etc. Props Ipstenu. -- Genericons.com now has a mini release blog. -- The CSS has prettier formatting, props Konstantin Obenland. - -V2.09: -Updated Facebook icon to new version. Updated Instagram logo to use new one-color version. Updated Google+ icon to use same radius as Instagram and Facebook. Added a bunch of new icons, cog, unapprove, cart, media player buttons, tablet, send to tablet. - -V2.06: -Included Base64 encoded version. This is necessary for Genericons to work with CDNs in Firefox. Firefox blocks fonts linked from a different domain. A CDN (typically s.example.com) usually puts the font on a subdomain, and is hence blocked in Firefox. - -V2.05: -Added a bunch of new icons, including upload to cloud, download to cloud, many more. - -V2: -Initial public release \ No newline at end of file diff --git a/wp/wp-content/themes/twentyfourteen/genericons/font/genericons-regular-webfont.eot b/wp/wp-content/themes/twentyfourteen/genericons/font/genericons-regular-webfont.eot deleted file mode 100644 index 46574695ece5d4a4d2eb5dd29c1b09995d93e214..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14935 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 diff --git a/wp/wp-content/themes/twentyfourteen/genericons/font/genericons-regular-webfont.svg b/wp/wp-content/themes/twentyfourteen/genericons/font/genericons-regular-webfont.svg deleted file mode 100644 index ef236c10..00000000 --- a/wp/wp-content/themes/twentyfourteen/genericons/font/genericons-regular-webfont.svg +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/wp/wp-content/themes/twentyfourteen/genericons/font/genericons-regular-webfont.ttf b/wp/wp-content/themes/twentyfourteen/genericons/font/genericons-regular-webfont.ttf deleted file mode 100644 index b6f125e7eec0da4df8acaf85c86fc993115a4723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27348 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 Jcw`b|{~sIWCISEe diff --git a/wp/wp-content/themes/twentyfourteen/genericons/font/genericons-regular-webfont.woff b/wp/wp-content/themes/twentyfourteen/genericons/font/genericons-regular-webfont.woff deleted file mode 100644 index da8be383d82820c6f279d9a2245b3e4303790907..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17224 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�k{_P|1Ev!tIOu)ySyKQ{3k7)MKUDw84%8ig$ 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 diff --git a/wp/wp-content/themes/twentyfourteen/genericons/genericons.css b/wp/wp-content/themes/twentyfourteen/genericons/genericons.css deleted file mode 100644 index b10b86fc..00000000 --- a/wp/wp-content/themes/twentyfourteen/genericons/genericons.css +++ /dev/null @@ -1,197 +0,0 @@ -/** - - Genericons Helper CSS - -*/ - - -/** - * The font was graciously generated by Font Squirrel (http://www.fontsquirrel.com). We love those guys. - */ - -@font-face { - font-family: 'Genericons'; - src: url('font/genericons-regular-webfont.eot'); -} - -@font-face { - font-family: 'Genericons'; - src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'), - url('font/genericons-regular-webfont.ttf') format('truetype'), - url('font/genericons-regular-webfont.svg#genericonsregular') format('svg'); - font-weight: normal; - font-style: normal; -} - - -/** - * All Genericons - */ - -.genericon { - display: inline-block; - width: 16px; - height: 16px; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - font-size: 16px; - line-height: 1; - font-family: 'Genericons'; - text-decoration: inherit; - font-weight: normal; - font-style: normal; - vertical-align: top; -} - -/** - * IE7 and IE6 hacks - */ - -.genericon { - *overflow: auto; - *zoom: 1; - *display: inline; -} - -/** - * Individual icons - */ - -/* Post formats */ -.genericon-standard:before { content: '\f100'; } -.genericon-aside:before { content: '\f101'; } -.genericon-image:before { content: '\f102'; } -.genericon-gallery:before { content: '\f103'; } -.genericon-video:before { content: '\f104'; } -.genericon-status:before { content: '\f105'; } -.genericon-quote:before { content: '\f106'; } -.genericon-link:before { content: '\f107'; } -.genericon-chat:before { content: '\f108'; } -.genericon-audio:before { content: '\f109'; } - -/* Social icons */ -.genericon-github:before { content: '\f200'; } -.genericon-dribbble:before { content: '\f201'; } -.genericon-twitter:before { content: '\f202'; } -.genericon-facebook:before { content: '\f203'; } -.genericon-facebook-alt:before { content: '\f204'; } -.genericon-wordpress:before { content: '\f205'; } -.genericon-googleplus:before { content: '\f206'; } -.genericon-linkedin:before { content: '\f207'; } -.genericon-linkedin-alt:before { content: '\f208'; } -.genericon-pinterest:before { content: '\f209'; } -.genericon-pinterest-alt:before { content: '\f210'; } -.genericon-flickr:before { content: '\f211'; } -.genericon-vimeo:before { content: '\f212'; } -.genericon-youtube:before { content: '\f213'; } -.genericon-tumblr:before { content: '\f214'; } -.genericon-instagram:before { content: '\f215'; } -.genericon-codepen:before { content: '\f216'; } -.genericon-polldaddy:before { content: '\f217'; } -.genericon-googleplus-alt:before { content: '\f218'; } -.genericon-path:before { content: '\f219'; } -.genericon-skype:before { content: '\f220'; } -.genericon-digg:before { content: '\f221'; } -.genericon-reddit:before { content: '\f222'; } -.genericon-stumbleupon:before { content: '\f223'; } -.genericon-pocket:before { content: '\f224'; } -.genericon-dropbox:before { content: '\f225'; } - -/* Meta icons */ -.genericon-comment:before { content: '\f300'; } -.genericon-category:before { content: '\f301'; } -.genericon-tag:before { content: '\f302'; } -.genericon-time:before { content: '\f303'; } -.genericon-user:before { content: '\f304'; } -.genericon-day:before { content: '\f305'; } -.genericon-week:before { content: '\f306'; } -.genericon-month:before { content: '\f307'; } -.genericon-pinned:before { content: '\f308'; } - -/* Other icons */ -.genericon-search:before { content: '\f400'; } -.genericon-unzoom:before { content: '\f401'; } -.genericon-zoom:before { content: '\f402'; } -.genericon-show:before { content: '\f403'; } -.genericon-hide:before { content: '\f404'; } -.genericon-close:before { content: '\f405'; } -.genericon-close-alt:before { content: '\f406'; } -.genericon-trash:before { content: '\f407'; } -.genericon-star:before { content: '\f408'; } -.genericon-home:before { content: '\f409'; } -.genericon-mail:before { content: '\f410'; } -.genericon-edit:before { content: '\f411'; } -.genericon-reply:before { content: '\f412'; } -.genericon-feed:before { content: '\f413'; } -.genericon-warning:before { content: '\f414'; } -.genericon-share:before { content: '\f415'; } -.genericon-attachment:before { content: '\f416'; } -.genericon-location:before { content: '\f417'; } -.genericon-checkmark:before { content: '\f418'; } -.genericon-menu:before { content: '\f419'; } -.genericon-refresh:before { content: '\f420'; } -.genericon-minimize:before { content: '\f421'; } -.genericon-maximize:before { content: '\f422'; } -.genericon-404:before { content: '\f423'; } -.genericon-spam:before { content: '\f424'; } -.genericon-summary:before { content: '\f425'; } -.genericon-cloud:before { content: '\f426'; } -.genericon-key:before { content: '\f427'; } -.genericon-dot:before { content: '\f428'; } -.genericon-next:before { content: '\f429'; } -.genericon-previous:before { content: '\f430'; } -.genericon-expand:before { content: '\f431'; } -.genericon-collapse:before { content: '\f432'; } -.genericon-dropdown:before { content: '\f433'; } -.genericon-dropdown-left:before { content: '\f434'; } -.genericon-top:before { content: '\f435'; } -.genericon-draggable:before { content: '\f436'; } -.genericon-phone:before { content: '\f437'; } -.genericon-send-to-phone:before { content: '\f438'; } -.genericon-plugin:before { content: '\f439'; } -.genericon-cloud-download:before { content: '\f440'; } -.genericon-cloud-upload:before { content: '\f441'; } -.genericon-external:before { content: '\f442'; } -.genericon-document:before { content: '\f443'; } -.genericon-book:before { content: '\f444'; } -.genericon-cog:before { content: '\f445'; } -.genericon-unapprove:before { content: '\f446'; } -.genericon-cart:before { content: '\f447'; } -.genericon-pause:before { content: '\f448'; } -.genericon-stop:before { content: '\f449'; } -.genericon-skip-back:before { content: '\f450'; } -.genericon-skip-ahead:before { content: '\f451'; } -.genericon-play:before { content: '\f452'; } -.genericon-tablet:before { content: '\f453'; } -.genericon-send-to-tablet:before { content: '\f454'; } -.genericon-info:before { content: '\f455'; } -.genericon-notice:before { content: '\f456'; } -.genericon-help:before { content: '\f457'; } -.genericon-fastforward:before { content: '\f458'; } -.genericon-rewind:before { content: '\f459'; } -.genericon-portfolio:before { content: '\f460'; } -.genericon-heart:before { content: '\f461'; } -.genericon-code:before { content: '\f462'; } -.genericon-subscribe:before { content: '\f463'; } -.genericon-unsubscribe:before { content: '\f464'; } -.genericon-subscribed:before { content: '\f465'; } -.genericon-reply-alt:before { content: '\f466'; } -.genericon-reply-single:before { content: '\f467'; } -.genericon-flag:before { content: '\f468'; } -.genericon-print:before { content: '\f469'; } -.genericon-lock:before { content: '\f470'; } -.genericon-bold:before { content: '\f471'; } -.genericon-italic:before { content: '\f472'; } -.genericon-picture:before { content: '\f473'; } -.genericon-fullscreen:before { content: '\f474'; } - -/* Generic shapes */ -.genericon-uparrow:before { content: '\f500'; } -.genericon-rightarrow:before { content: '\f501'; } -.genericon-downarrow:before { content: '\f502'; } -.genericon-leftarrow:before { content: '\f503'; } - - - - - diff --git a/wp/wp-content/themes/twentyfourteen/header.php b/wp/wp-content/themes/twentyfourteen/header.php deleted file mode 100644 index 7286d889..00000000 --- a/wp/wp-content/themes/twentyfourteen/header.php +++ /dev/null @@ -1,65 +0,0 @@ - section and everything up till

    - * - * @package WordPress - * @subpackage Twenty_Fourteen - * @since Twenty Fourteen 1.0 - */ -?> - - - -> - - - - - <?php wp_title( '|', true, 'right' ); ?> - - - - - - -> -
    - - - - - - -
    diff --git a/wp/wp-content/themes/twentyfourteen/image.php b/wp/wp-content/themes/twentyfourteen/image.php deleted file mode 100644 index 83ac67f6..00000000 --- a/wp/wp-content/themes/twentyfourteen/image.php +++ /dev/null @@ -1,79 +0,0 @@ - - -
    -
    - - -
    > -
    - ', '' ); ?> - - -
    - -
    -
    -
    - -
    - - -
    - -
    - -
    - - '', - 'link_before' => '', - 'link_after' => '', - ) ); - ?> -
    -
    - -
    ' ); ?> -
    - - - - - - -
    - - - - - - - - - - - - - - - - - diff --git a/wp/wp-content/themes/twentyfourteen/images/pattern-light.svg b/wp/wp-content/themes/twentyfourteen/images/pattern-light.svg deleted file mode 100644 index 55a48f1b..00000000 --- a/wp/wp-content/themes/twentyfourteen/images/pattern-light.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - diff --git a/wp/wp-content/themes/twentyfourteen/inc/back-compat.php b/wp/wp-content/themes/twentyfourteen/inc/back-compat.php deleted file mode 100644 index c184d912..00000000 --- a/wp/wp-content/themes/twentyfourteen/inc/back-compat.php +++ /dev/null @@ -1,63 +0,0 @@ -

    %s

    ', $message ); -} - -/** - * Prevent the Customizer from being loaded on WordPress versions prior to 3.6. - * - * @since Twenty Fourteen 1.0 - */ -function twentyfourteen_customize() { - wp_die( sprintf( __( 'Twenty Fourteen requires at least WordPress version 3.6. You are running version %s. Please upgrade and try again.', 'twentyfourteen' ), $GLOBALS['wp_version'] ), '', array( - 'back_link' => true, - ) ); -} -add_action( 'load-customize.php', 'twentyfourteen_customize' ); - -/** - * Prevent the Theme Preview from being loaded on WordPress versions prior to 3.4. - * - * @since Twenty Fourteen 1.0 - */ -function twentyfourteen_preview() { - if ( isset( $_GET['preview'] ) ) { - wp_die( sprintf( __( 'Twenty Fourteen requires at least WordPress version 3.6. You are running version %s. Please upgrade and try again.', 'twentyfourteen' ), $GLOBALS['wp_version'] ) ); - } -} -add_action( 'template_redirect', 'twentyfourteen_preview' ); diff --git a/wp/wp-content/themes/twentyfourteen/inc/custom-header.php b/wp/wp-content/themes/twentyfourteen/inc/custom-header.php deleted file mode 100644 index 287b1068..00000000 --- a/wp/wp-content/themes/twentyfourteen/inc/custom-header.php +++ /dev/null @@ -1,147 +0,0 @@ - Header screen. - * @type string $admin_preview_callback Callback function used to create the custom header markup in - * the Appearance > Header screen. - * } - */ - add_theme_support( 'custom-header', apply_filters( 'twentyfourteen_custom_header_args', array( - 'default-text-color' => 'fff', - 'width' => 1260, - 'height' => 240, - 'flex-height' => true, - 'wp-head-callback' => 'twentyfourteen_header_style', - 'admin-head-callback' => 'twentyfourteen_admin_header_style', - 'admin-preview-callback' => 'twentyfourteen_admin_header_image', - ) ) ); -} -add_action( 'after_setup_theme', 'twentyfourteen_custom_header_setup' ); - -if ( ! function_exists( 'twentyfourteen_header_style' ) ) : -/** - * Styles the header image and text displayed on the blog - * - * @see twentyfourteen_custom_header_setup(). - * - */ -function twentyfourteen_header_style() { - $text_color = get_header_textcolor(); - - // If no custom color for text is set, let's bail. - if ( display_header_text() && $text_color === get_theme_support( 'custom-header', 'default-text-color' ) ) - return; - - // If we get this far, we have custom styles. - ?> - - Header screen. - * - * @see twentyfourteen_custom_header_setup() - * - * @since Twenty Fourteen 1.0 - */ -function twentyfourteen_admin_header_style() { -?> - - Header screen. - * - * @see twentyfourteen_custom_header_setup() - * - * @since Twenty Fourteen 1.0 - */ -function twentyfourteen_admin_header_image() { -?> -
    - - - -

    -
    -get_setting( 'blogname' )->transport = 'postMessage'; - $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage'; - $wp_customize->get_setting( 'header_textcolor' )->transport = 'postMessage'; - - if ( isset( $wp_customize->selective_refresh ) ) { - $wp_customize->selective_refresh->add_partial( 'blogname', array( - 'selector' => '.site-title a', - 'container_inclusive' => false, - 'render_callback' => 'twentyfourteen_customize_partial_blogname', - ) ); - $wp_customize->selective_refresh->add_partial( 'blogdescription', array( - 'selector' => '.site-description', - 'container_inclusive' => false, - 'render_callback' => 'twentyfourteen_customize_partial_blogdescription', - ) ); - } - - // Rename the label to "Site Title Color" because this only affects the site title in this theme. - $wp_customize->get_control( 'header_textcolor' )->label = __( 'Site Title Color', 'twentyfourteen' ); - - // Rename the label to "Display Site Title & Tagline" in order to make this option extra clear. - $wp_customize->get_control( 'display_header_text' )->label = __( 'Display Site Title & Tagline', 'twentyfourteen' ); - - // Add custom description to Colors and Background controls or sections. - if ( property_exists( $wp_customize->get_control( 'background_color' ), 'description' ) ) { - $wp_customize->get_control( 'background_color' )->description = __( 'May only be visible on wide screens.', 'twentyfourteen' ); - $wp_customize->get_control( 'background_image' )->description = __( 'May only be visible on wide screens.', 'twentyfourteen' ); - } else { - $wp_customize->get_section( 'colors' )->description = __( 'Background may only be visible on wide screens.', 'twentyfourteen' ); - $wp_customize->get_section( 'background_image' )->description = __( 'Background may only be visible on wide screens.', 'twentyfourteen' ); - } - - // Add the featured content section in case it's not already there. - $wp_customize->add_section( 'featured_content', array( - 'title' => __( 'Featured Content', 'twentyfourteen' ), - 'description' => sprintf( __( 'Use a tag to feature your posts. If no posts match the tag, sticky posts will be displayed instead.', 'twentyfourteen' ), - esc_url( add_query_arg( 'tag', _x( 'featured', 'featured content default tag slug', 'twentyfourteen' ), admin_url( 'edit.php' ) ) ), - admin_url( 'edit.php?show_sticky=1' ) - ), - 'priority' => 130, - 'active_callback' => 'is_front_page', - ) ); - - // Add the featured content layout setting and control. - $wp_customize->add_setting( 'featured_content_layout', array( - 'default' => 'grid', - 'sanitize_callback' => 'twentyfourteen_sanitize_layout', - ) ); - - $wp_customize->add_control( 'featured_content_layout', array( - 'label' => __( 'Layout', 'twentyfourteen' ), - 'section' => 'featured_content', - 'type' => 'select', - 'choices' => array( - 'grid' => __( 'Grid', 'twentyfourteen' ), - 'slider' => __( 'Slider', 'twentyfourteen' ), - ), - ) ); -} -add_action( 'customize_register', 'twentyfourteen_customize_register' ); - -/** - * Render the site title for the selective refresh partial. - * - * @since Twenty Fourteen 1.7 - * @see twentyfourteen_customize_register() - * - * @return void - */ -function twentyfourteen_customize_partial_blogname() { - bloginfo( 'name' ); -} - -/** - * Render the site tagline for the selective refresh partial. - * - * @since Twenty Fourteen 1.7 - * @see twentyfourteen_customize_register() - * - * @return void - */ -function twentyfourteen_customize_partial_blogdescription() { - bloginfo( 'description' ); -} - -/** - * Sanitize the Featured Content layout value. - * - * @since Twenty Fourteen 1.0 - * - * @param string $layout Layout type. - * @return string Filtered layout type (grid|slider). - */ -function twentyfourteen_sanitize_layout( $layout ) { - if ( ! in_array( $layout, array( 'grid', 'slider' ) ) ) { - $layout = 'grid'; - } - - return $layout; -} - -/** - * Bind JS handlers to make Customizer preview reload changes asynchronously. - * - * @since Twenty Fourteen 1.0 - */ -function twentyfourteen_customize_preview_js() { - wp_enqueue_script( 'twentyfourteen_customizer', get_template_directory_uri() . '/js/customizer.js', array( 'customize-preview' ), '20131205', true ); -} -add_action( 'customize_preview_init', 'twentyfourteen_customize_preview_js' ); - -/** - * Add contextual help to the Themes and Post edit screens. - * - * @since Twenty Fourteen 1.0 - */ -function twentyfourteen_contextual_help() { - if ( 'admin_head-edit.php' === current_filter() && 'post' !== $GLOBALS['typenow'] ) { - return; - } - - get_current_screen()->add_help_tab( array( - 'id' => 'twentyfourteen', - 'title' => __( 'Twenty Fourteen', 'twentyfourteen' ), - 'content' => - '
      ' . - '
    • ' . sprintf( __( 'The home page features your choice of up to 6 posts prominently displayed in a grid or slider, controlled by a tag; you can change the tag and layout in Appearance → Customize. If no posts match the tag, sticky posts will be displayed instead.', 'twentyfourteen' ), esc_url( add_query_arg( 'tag', _x( 'featured', 'featured content default tag slug', 'twentyfourteen' ), admin_url( 'edit.php' ) ) ), admin_url( 'customize.php' ), admin_url( 'edit.php?show_sticky=1' ) ) . '
    • ' . - '
    • ' . sprintf( __( 'Enhance your site design by using Featured Images for posts you’d like to stand out (also known as post thumbnails). This allows you to associate an image with your post without inserting it. Twenty Fourteen uses featured images for posts and pages—above the title—and in the Featured Content area on the home page.', 'twentyfourteen' ), 'https://codex.wordpress.org/Post_Thumbnails#Setting_a_Post_Thumbnail' ) . '
    • ' . - '
    • ' . sprintf( __( 'For an in-depth tutorial, and more tips and tricks, visit the Twenty Fourteen documentation.', 'twentyfourteen' ), 'https://codex.wordpress.org/Twenty_Fourteen' ) . '
    • ' . - '
    ', - ) ); -} -add_action( 'admin_head-themes.php', 'twentyfourteen_contextual_help' ); -add_action( 'admin_head-edit.php', 'twentyfourteen_contextual_help' ); diff --git a/wp/wp-content/themes/twentyfourteen/inc/featured-content.php b/wp/wp-content/themes/twentyfourteen/inc/featured-content.php deleted file mode 100644 index ffeb993d..00000000 --- a/wp/wp-content/themes/twentyfourteen/inc/featured-content.php +++ /dev/null @@ -1,531 +0,0 @@ - $post_ids, - 'posts_per_page' => count( $post_ids ), - ) ); - - return $featured_posts; - } - - /** - * Get featured post IDs - * - * This function will return the an array containing the - * post IDs of all featured posts. - * - * Sets the "featured_content_ids" transient. - * - * @static - * @access public - * @since Twenty Fourteen 1.0 - * - * @return array Array of post IDs. - */ - public static function get_featured_post_ids() { - // Get array of cached results if they exist. - $featured_ids = get_transient( 'featured_content_ids' ); - - if ( false === $featured_ids ) { - $settings = self::get_setting(); - $term = get_term_by( 'name', $settings['tag-name'], 'post_tag' ); - - if ( $term ) { - // Query for featured posts. - $featured_ids = get_posts( array( - 'fields' => 'ids', - 'numberposts' => self::$max_posts, - 'suppress_filters' => false, - 'tax_query' => array( - array( - 'field' => 'term_id', - 'taxonomy' => 'post_tag', - 'terms' => $term->term_id, - ), - ), - ) ); - } - - // Get sticky posts if no Featured Content exists. - if ( ! $featured_ids ) { - $featured_ids = self::get_sticky_posts(); - } - - set_transient( 'featured_content_ids', $featured_ids ); - } - - // Ensure correct format before return. - return array_map( 'absint', $featured_ids ); - } - - /** - * Return an array with IDs of posts maked as sticky. - * - * @static - * @access public - * @since Twenty Fourteen 1.0 - * - * @return array Array of sticky posts. - */ - public static function get_sticky_posts() { - return array_slice( get_option( 'sticky_posts', array() ), 0, self::$max_posts ); - } - - /** - * Delete featured content ids transient. - * - * Hooks in the "save_post" action. - * - * @see Featured_Content::validate_settings(). - * - * @static - * @access public - * @since Twenty Fourteen 1.0 - */ - public static function delete_transient() { - delete_transient( 'featured_content_ids' ); - } - - /** - * Exclude featured posts from the home page blog query. - * - * Filter the home page posts, and remove any featured post ID's from it. - * Hooked onto the 'pre_get_posts' action, this changes the parameters of - * the query before it gets any posts. - * - * @static - * @access public - * @since Twenty Fourteen 1.0 - * - * @param WP_Query $query WP_Query object. - * @return WP_Query Possibly-modified WP_Query. - */ - public static function pre_get_posts( $query ) { - - // Bail if not home or not main query. - if ( ! $query->is_home() || ! $query->is_main_query() ) { - return; - } - - // Bail if the blog page is not the front page. - if ( 'posts' !== get_option( 'show_on_front' ) ) { - return; - } - - $featured = self::get_featured_post_ids(); - - // Bail if no featured posts. - if ( ! $featured ) { - return; - } - - // We need to respect post ids already in the blacklist. - $post__not_in = $query->get( 'post__not_in' ); - - if ( ! empty( $post__not_in ) ) { - $featured = array_merge( (array) $post__not_in, $featured ); - $featured = array_unique( $featured ); - } - - $query->set( 'post__not_in', $featured ); - } - - /** - * Reset tag option when the saved tag is deleted. - * - * It's important to mention that the transient needs to be deleted, - * too. While it may not be obvious by looking at the function alone, - * the transient is deleted by Featured_Content::validate_settings(). - * - * Hooks in the "delete_post_tag" action. - * - * @see Featured_Content::validate_settings(). - * - * @static - * @access public - * @since Twenty Fourteen 1.0 - * - * @param int $tag_id The term_id of the tag that has been deleted. - */ - public static function delete_post_tag( $tag_id ) { - $settings = self::get_setting(); - - if ( empty( $settings['tag-id'] ) || $tag_id != $settings['tag-id'] ) { - return; - } - - $settings['tag-id'] = 0; - $settings = self::validate_settings( $settings ); - update_option( 'featured-content', $settings ); - } - - /** - * Hide featured tag from displaying when global terms are queried from the front end. - * - * Hooks into the "get_terms" filter. - * - * @static - * @access public - * @since Twenty Fourteen 1.0 - * - * @param array $terms List of term objects. This is the return value of get_terms(). - * @param array $taxonomies An array of taxonomy slugs. - * @return array A filtered array of terms. - * - * @uses Featured_Content::get_setting() - */ - public static function hide_featured_term( $terms, $taxonomies, $args ) { - - // This filter is only appropriate on the front end. - if ( is_admin() ) { - return $terms; - } - - // We only want to hide the featured tag. - if ( ! in_array( 'post_tag', $taxonomies ) ) { - return $terms; - } - - // Bail if no terms were returned. - if ( empty( $terms ) ) { - return $terms; - } - - // Bail if term objects are unavailable. - if ( 'all' != $args['fields'] ) { - return $terms; - } - - $settings = self::get_setting(); - foreach ( $terms as $order => $term ) { - if ( ( $settings['tag-id'] === $term->term_id || $settings['tag-name'] === $term->name ) && 'post_tag' === $term->taxonomy ) { - unset( $terms[ $order ] ); - } - } - - return $terms; - } - - /** - * Hide featured tag from display when terms associated with a post object - * are queried from the front end. - * - * Hooks into the "get_the_terms" filter. - * - * @static - * @access public - * @since Twenty Fourteen 1.0 - * - * @param array $terms A list of term objects. This is the return value of get_the_terms(). - * @param int $id The ID field for the post object that terms are associated with. - * @param array $taxonomy An array of taxonomy slugs. - * @return array Filtered array of terms. - * - * @uses Featured_Content::get_setting() - */ - public static function hide_the_featured_term( $terms, $id, $taxonomy ) { - - // This filter is only appropriate on the front end. - if ( is_admin() ) { - return $terms; - } - - // Make sure we are in the correct taxonomy. - if ( 'post_tag' != $taxonomy ) { - return $terms; - } - - // No terms? Return early! - if ( empty( $terms ) ) { - return $terms; - } - - $settings = self::get_setting(); - foreach ( $terms as $order => $term ) { - if ( ( $settings['tag-id'] === $term->term_id || $settings['tag-name'] === $term->name ) && 'post_tag' === $term->taxonomy ) { - unset( $terms[ $term->term_id ] ); - } - } - - return $terms; - } - - /** - * Register custom setting on the Settings -> Reading screen. - * - * @static - * @access public - * @since Twenty Fourteen 1.0 - */ - public static function register_setting() { - register_setting( 'featured-content', 'featured-content', array( __CLASS__, 'validate_settings' ) ); - } - - /** - * Add settings to the Customizer. - * - * @static - * @access public - * @since Twenty Fourteen 1.0 - * - * @param WP_Customize_Manager $wp_customize Customizer object. - */ - public static function customize_register( $wp_customize ) { - $wp_customize->add_section( 'featured_content', array( - 'title' => __( 'Featured Content', 'twentyfourteen' ), - 'description' => sprintf( __( 'Use a tag to feature your posts. If no posts match the tag, sticky posts will be displayed instead.', 'twentyfourteen' ), - esc_url( add_query_arg( 'tag', _x( 'featured', 'featured content default tag slug', 'twentyfourteen' ), admin_url( 'edit.php' ) ) ), - admin_url( 'edit.php?show_sticky=1' ) - ), - 'priority' => 130, - 'theme_supports' => 'featured-content', - ) ); - - // Add Featured Content settings. - $wp_customize->add_setting( 'featured-content[tag-name]', array( - 'default' => _x( 'featured', 'featured content default tag slug', 'twentyfourteen' ), - 'type' => 'option', - 'sanitize_js_callback' => array( __CLASS__, 'delete_transient' ), - ) ); - $wp_customize->add_setting( 'featured-content[hide-tag]', array( - 'default' => true, - 'type' => 'option', - 'sanitize_js_callback' => array( __CLASS__, 'delete_transient' ), - ) ); - - // Add Featured Content controls. - $wp_customize->add_control( 'featured-content[tag-name]', array( - 'label' => __( 'Tag Name', 'twentyfourteen' ), - 'section' => 'featured_content', - 'priority' => 20, - ) ); - $wp_customize->add_control( 'featured-content[hide-tag]', array( - 'label' => __( 'Don’t display tag on front end.', 'twentyfourteen' ), - 'section' => 'featured_content', - 'type' => 'checkbox', - 'priority' => 30, - ) ); - } - - /** - * Enqueue the tag suggestion script. - * - * @static - * @access public - * @since Twenty Fourteen 1.0 - */ - public static function enqueue_scripts() { - wp_enqueue_script( 'featured-content-suggest', get_template_directory_uri() . '/js/featured-content-admin.js', array( 'jquery', 'suggest' ), '20131022', true ); - } - - /** - * Get featured content settings. - * - * Get all settings recognized by this module. This function - * will return all settings whether or not they have been stored - * in the database yet. This ensures that all keys are available - * at all times. - * - * In the event that you only require one setting, you may pass - * its name as the first parameter to the function and only that - * value will be returned. - * - * @static - * @access public - * @since Twenty Fourteen 1.0 - * - * @param string $key The key of a recognized setting. - * @return mixed Array of all settings by default. A single value if passed as first parameter. - */ - public static function get_setting( $key = 'all' ) { - $saved = (array) get_option( 'featured-content' ); - - $defaults = array( - 'hide-tag' => 1, - 'tag-id' => 0, - 'tag-name' => _x( 'featured', 'featured content default tag slug', 'twentyfourteen' ), - ); - - $options = wp_parse_args( $saved, $defaults ); - $options = array_intersect_key( $options, $defaults ); - - if ( 'all' != $key ) { - return isset( $options[ $key ] ) ? $options[ $key ] : false; - } - - return $options; - } - - /** - * Validate featured content settings. - * - * Make sure that all user supplied content is in an expected - * format before saving to the database. This function will also - * delete the transient set in Featured_Content::get_featured_content(). - * - * @static - * @access public - * @since Twenty Fourteen 1.0 - * - * @param array $input Array of settings input. - * @return array Validated settings output. - */ - public static function validate_settings( $input ) { - $output = array(); - - if ( empty( $input['tag-name'] ) ) { - $output['tag-id'] = 0; - } else { - $term = get_term_by( 'name', $input['tag-name'], 'post_tag' ); - - if ( $term ) { - $output['tag-id'] = $term->term_id; - } else { - $new_tag = wp_create_tag( $input['tag-name'] ); - - if ( ! is_wp_error( $new_tag ) && isset( $new_tag['term_id'] ) ) { - $output['tag-id'] = $new_tag['term_id']; - } - } - - $output['tag-name'] = $input['tag-name']; - } - - $output['hide-tag'] = isset( $input['hide-tag'] ) && $input['hide-tag'] ? 1 : 0; - - // Delete the featured post ids transient. - self::delete_transient(); - - return $output; - } -} // Featured_Content - -Featured_Content::setup(); diff --git a/wp/wp-content/themes/twentyfourteen/inc/template-tags.php b/wp/wp-content/themes/twentyfourteen/inc/template-tags.php deleted file mode 100644 index f63ee828..00000000 --- a/wp/wp-content/themes/twentyfourteen/inc/template-tags.php +++ /dev/null @@ -1,227 +0,0 @@ -max_num_pages < 2 ) { - return; - } - - $paged = get_query_var( 'paged' ) ? intval( get_query_var( 'paged' ) ) : 1; - $pagenum_link = html_entity_decode( get_pagenum_link() ); - $query_args = array(); - $url_parts = explode( '?', $pagenum_link ); - - if ( isset( $url_parts[1] ) ) { - wp_parse_str( $url_parts[1], $query_args ); - } - - $pagenum_link = remove_query_arg( array_keys( $query_args ), $pagenum_link ); - $pagenum_link = trailingslashit( $pagenum_link ) . '%_%'; - - $format = $wp_rewrite->using_index_permalinks() && ! strpos( $pagenum_link, 'index.php' ) ? 'index.php/' : ''; - $format .= $wp_rewrite->using_permalinks() ? user_trailingslashit( $wp_rewrite->pagination_base . '/%#%', 'paged' ) : '?paged=%#%'; - - // Set up paginated links. - $links = paginate_links( array( - 'base' => $pagenum_link, - 'format' => $format, - 'total' => $wp_query->max_num_pages, - 'current' => $paged, - 'mid_size' => 1, - 'add_args' => array_map( 'urlencode', $query_args ), - 'prev_text' => __( '← Previous', 'twentyfourteen' ), - 'next_text' => __( 'Next →', 'twentyfourteen' ), - ) ); - - if ( $links ) : - - ?> - - post_parent ) : get_adjacent_post( false, '', true ); - $next = get_adjacent_post( false, '', false ); - - if ( ! $next && ! $previous ) { - return; - } - - ?> - - ' . __( 'Sticky', 'twentyfourteen' ) . ''; - } - - // Set up and print post meta information. - printf( ' ', - esc_url( get_permalink() ), - esc_attr( get_the_date( 'c' ) ), - esc_html( get_the_date() ), - esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ), - get_the_author() - ); -} -endif; - -/** - * Find out if blog has more than one category. - * - * @since Twenty Fourteen 1.0 - * - * @return boolean true if blog has more than 1 category - */ -function twentyfourteen_categorized_blog() { - if ( false === ( $all_the_cool_cats = get_transient( 'twentyfourteen_category_count' ) ) ) { - // Create an array of all the categories that are attached to posts - $all_the_cool_cats = get_categories( array( - 'hide_empty' => 1, - ) ); - - // Count the number of categories that are attached to the posts - $all_the_cool_cats = count( $all_the_cool_cats ); - - set_transient( 'twentyfourteen_category_count', $all_the_cool_cats ); - } - - if ( 1 !== (int) $all_the_cool_cats ) { - // This blog has more than 1 category so twentyfourteen_categorized_blog should return true - return true; - } else { - // This blog has only 1 category so twentyfourteen_categorized_blog should return false - return false; - } -} - -/** - * Flush out the transients used in twentyfourteen_categorized_blog. - * - * @since Twenty Fourteen 1.0 - */ -function twentyfourteen_category_transient_flusher() { - // Like, beat it. Dig? - delete_transient( 'twentyfourteen_category_count' ); -} -add_action( 'edit_category', 'twentyfourteen_category_transient_flusher' ); -add_action( 'save_post', 'twentyfourteen_category_transient_flusher' ); - -if ( ! function_exists( 'twentyfourteen_post_thumbnail' ) ) : -/** - * Display an optional post thumbnail. - * - * Wraps the post thumbnail in an anchor element on index - * views, or a div element when on single views. - * - * @since Twenty Fourteen 1.0 - * @since Twenty Fourteen 1.4 Was made 'pluggable', or overridable. - */ -function twentyfourteen_post_thumbnail() { - if ( post_password_required() || is_attachment() || ! has_post_thumbnail() ) { - return; - } - - if ( is_singular() ) : - ?> - -
    - -
    - - - - - - %2$s', - esc_url( get_permalink( get_the_ID() ) ), - /* translators: %s: Name of current post */ - sprintf( __( 'Continue reading %s →', 'twentyfourteen' ), '' . get_the_title( get_the_ID() ) . '' ) - ); - return ' … ' . $link; -} -add_filter( 'excerpt_more', 'twentyfourteen_excerpt_more' ); -endif; diff --git a/wp/wp-content/themes/twentyfourteen/inc/widgets.php b/wp/wp-content/themes/twentyfourteen/inc/widgets.php deleted file mode 100644 index ee766cb3..00000000 --- a/wp/wp-content/themes/twentyfourteen/inc/widgets.php +++ /dev/null @@ -1,290 +0,0 @@ - 'widget_twentyfourteen_ephemera', - 'description' => __( 'Use this widget to list your recent Aside, Quote, Video, Audio, Image, Gallery, and Link posts.', 'twentyfourteen' ), - 'customize_selective_refresh' => true, - ) ); - - if ( is_active_widget( false, false, $this->id_base ) || is_customize_preview() ) { - add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); - } - } - - /** - * Enqueue scripts. - * - * @since Twenty Fourteen 1.7 - */ - public function enqueue_scripts() { - /** This filter is documented in wp-includes/media.php */ - $audio_library = apply_filters( 'wp_audio_shortcode_library', 'mediaelement' ); - /** This filter is documented in wp-includes/media.php */ - $video_library = apply_filters( 'wp_video_shortcode_library', 'mediaelement' ); - if ( in_array( 'mediaelement', array( $video_library, $audio_library ), true ) ) { - wp_enqueue_style( 'wp-mediaelement' ); - wp_enqueue_script( 'wp-mediaelement' ); - } - } - - /** - * Output the HTML for this widget. - * - * @access public - * @since Twenty Fourteen 1.0 - * - * @param array $args An array of standard parameters for widgets in this theme. - * @param array $instance An array of settings for this widget instance. - */ - public function widget( $args, $instance ) { - $format = isset( $instance['format'] ) && in_array( $instance['format'], $this->formats ) ? $instance['format'] : 'aside'; - - switch ( $format ) { - case 'image': - $format_string = __( 'Images', 'twentyfourteen' ); - $format_string_more = __( 'More images', 'twentyfourteen' ); - break; - case 'video': - $format_string = __( 'Videos', 'twentyfourteen' ); - $format_string_more = __( 'More videos', 'twentyfourteen' ); - break; - case 'audio': - $format_string = __( 'Audio', 'twentyfourteen' ); - $format_string_more = __( 'More audio', 'twentyfourteen' ); - break; - case 'quote': - $format_string = __( 'Quotes', 'twentyfourteen' ); - $format_string_more = __( 'More quotes', 'twentyfourteen' ); - break; - case 'link': - $format_string = __( 'Links', 'twentyfourteen' ); - $format_string_more = __( 'More links', 'twentyfourteen' ); - break; - case 'gallery': - $format_string = __( 'Galleries', 'twentyfourteen' ); - $format_string_more = __( 'More galleries', 'twentyfourteen' ); - break; - case 'aside': - default: - $format_string = __( 'Asides', 'twentyfourteen' ); - $format_string_more = __( 'More asides', 'twentyfourteen' ); - break; - } - - $number = empty( $instance['number'] ) ? 2 : absint( $instance['number'] ); - $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? $format_string : $instance['title'], $instance, $this->id_base ); - - $ephemera = new WP_Query( array( - 'order' => 'DESC', - 'posts_per_page' => $number, - 'no_found_rows' => true, - 'post_status' => 'publish', - 'post__not_in' => get_option( 'sticky_posts' ), - 'tax_query' => array( - array( - 'taxonomy' => 'post_format', - 'terms' => array( "post-format-$format" ), - 'field' => 'slug', - 'operator' => 'IN', - ), - ), - ) ); - - if ( $ephemera->have_posts() ) : - $tmp_content_width = $GLOBALS['content_width']; - $GLOBALS['content_width'] = 306; - - echo $args['before_widget']; - ?> -

    - -

    -
      - - have_posts() ) : - $ephemera->the_post(); - $tmp_more = $GLOBALS['more']; - $GLOBALS['more'] = 0; - ?> -
    1. -
      > -
      - →', 'twentyfourteen' ) ); - else : - $images = array(); - - $galleries = get_post_galleries( get_the_ID(), false ); - if ( isset( $galleries[0]['ids'] ) ) - $images = explode( ',', $galleries[0]['ids'] ); - - if ( ! $images ) : - $images = get_posts( array( - 'fields' => 'ids', - 'numberposts' => -1, - 'order' => 'ASC', - 'orderby' => 'menu_order', - 'post_mime_type' => 'image', - 'post_parent' => get_the_ID(), - 'post_type' => 'attachment', - ) ); - endif; - - $total_images = count( $images ); - - if ( has_post_thumbnail() ) : - $post_thumbnail = get_the_post_thumbnail(); - elseif ( $total_images > 0 ) : - $image = reset( $images ); - $post_thumbnail = wp_get_attachment_image( $image, 'post-thumbnail' ); - endif; - - if ( ! empty ( $post_thumbnail ) ) : - ?> - - -

      - %2$s photo.', 'This gallery contains %2$s photos.', $total_images, 'twentyfourteen' ), - esc_url( get_permalink() ), - number_format_i18n( $total_images ) - ); - ?> -

      - →', 'twentyfourteen' ) ); - endif; - ?> -
      - -
      - -
      -
      -
    2. - - -
    - - →', 'twentyfourteen' ), $format_string_more ); - ?> - - formats ) ) { - $instance['format'] = $new_instance['format']; - } - - return $instance; - } - - /** - * Display the form for this widget on the Widgets page of the Admin area. - * - * @since Twenty Fourteen 1.0 - * - * @param array $instance - */ - function form( $instance ) { - $title = empty( $instance['title'] ) ? '' : esc_attr( $instance['title'] ); - $number = empty( $instance['number'] ) ? 2 : absint( $instance['number'] ); - $format = isset( $instance['format'] ) && in_array( $instance['format'], $this->formats ) ? $instance['format'] : 'aside'; - ?> -

    -

    - -

    -

    - -

    - - - -

    - - - -
    -
    - - - -
    -
    - -
    - - 781 ) { - var mastheadHeight = $( '#masthead' ).height(), - toolbarOffset, mastheadOffset; - - if ( mastheadHeight > 48 ) { - body.removeClass( 'masthead-fixed' ); - } - - if ( body.is( '.header-image' ) ) { - toolbarOffset = body.is( '.admin-bar' ) ? $( '#wpadminbar' ).height() : 0; - mastheadOffset = $( '#masthead' ).offset().top - toolbarOffset; - - _window.on( 'scroll.twentyfourteen', function() { - if ( _window.scrollTop() > mastheadOffset && mastheadHeight < 49 ) { - body.addClass( 'masthead-fixed' ); - } else { - body.removeClass( 'masthead-fixed' ); - } - } ); - } - } - - // Focus styles for menus. - $( '.primary-navigation, .secondary-navigation' ).find( 'a' ).on( 'focus.twentyfourteen blur.twentyfourteen', function() { - $( this ).parents().toggleClass( 'focus' ); - } ); - } ); - - /** - * @summary Add or remove ARIA attributes. - * Uses jQuery's width() function to determine the size of the window and add - * the default ARIA attributes for the menu toggle if it's visible. - * @since Twenty Fourteen 1.4 - */ - function onResizeARIA() { - if ( 781 > _window.width() ) { - button.attr( 'aria-expanded', 'false' ); - menu.attr( 'aria-expanded', 'false' ); - button.attr( 'aria-controls', 'primary-menu' ); - } else { - button.removeAttr( 'aria-expanded' ); - menu.removeAttr( 'aria-expanded' ); - button.removeAttr( 'aria-controls' ); - } - } - - _window - .on( 'load.twentyfourteen', onResizeARIA ) - .on( 'resize.twentyfourteen', function() { - onResizeARIA(); - } ); - - _window.load( function() { - var footerSidebar, - isCustomizeSelectiveRefresh = ( 'undefined' !== typeof wp && wp.customize && wp.customize.selectiveRefresh ); - - // Arrange footer widgets vertically. - if ( $.isFunction( $.fn.masonry ) ) { - footerSidebar = $( '#footer-sidebar' ); - footerSidebar.masonry( { - itemSelector: '.widget', - columnWidth: function( containerWidth ) { - return containerWidth / 4; - }, - gutterWidth: 0, - isResizable: true, - isRTL: $( 'body' ).is( '.rtl' ) - } ); - - if ( isCustomizeSelectiveRefresh ) { - - // Retain previous masonry-brick initial position. - wp.customize.selectiveRefresh.bind( 'partial-content-rendered', function( placement ) { - var copyPosition = ( - placement.partial.extended( wp.customize.widgetsPreview.WidgetPartial ) && - placement.removedNodes instanceof jQuery && - placement.removedNodes.is( '.masonry-brick' ) && - placement.container instanceof jQuery - ); - if ( copyPosition ) { - placement.container.css( { - position: placement.removedNodes.css( 'position' ), - top: placement.removedNodes.css( 'top' ), - left: placement.removedNodes.css( 'left' ) - } ); - } - } ); - - // Re-arrange footer widgets after selective refresh event. - wp.customize.selectiveRefresh.bind( 'sidebar-updated', function( sidebarPartial ) { - if ( 'sidebar-3' === sidebarPartial.sidebarId ) { - footerSidebar.masonry( 'reloadItems' ); - footerSidebar.masonry( 'layout' ); - } - } ); - } - } - - // Initialize audio and video players in Twenty_Fourteen_Ephemera_Widget widget when selectively refreshed in Customizer. - if ( isCustomizeSelectiveRefresh && wp.mediaelement ) { - wp.customize.selectiveRefresh.bind( 'partial-content-rendered', function() { - wp.mediaelement.initialize(); - } ); - } - - // Initialize Featured Content slider. - if ( body.is( '.slider' ) ) { - $( '.featured-content' ).featuredslider( { - selector: '.featured-content-inner > article', - controlsContainer: '.featured-content' - } ); - } - } ); -} )( jQuery ); diff --git a/wp/wp-content/themes/twentyfourteen/js/html5.js b/wp/wp-content/themes/twentyfourteen/js/html5.js deleted file mode 100644 index 6168aacd..00000000 --- a/wp/wp-content/themes/twentyfourteen/js/html5.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed -*/ -(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); -a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; -c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| -"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); -if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d 0 && $( slider.vars.controlsContainer ); - } - - slider.doMath(); - - // INIT - slider.setup( 'init' ); - - // CONTROLNAV - methods.controlNav.setup(); - - // DIRECTIONNAV - methods.directionNav.setup(); - - // KEYBOARD - if ( $( slider.containerSelector ).length === 1 ) { - $( document ).bind( 'keyup', function( event ) { - var keycode = event.keyCode, - target = false; - if ( ! slider.animating && ( keycode === 39 || keycode === 37 ) ) { - if ( keycode === 39 ) { - target = slider.getTarget( 'next' ); - } else if ( keycode === 37 ) { - target = slider.getTarget( 'prev' ); - } - - slider.featureAnimate( target ); - } - } ); - } - - // TOUCH - if ( touch ) { - methods.touch(); - } - - $( window ).bind( 'resize orientationchange focus', methods.resize ); - - slider.find( 'img' ).attr( 'draggable', 'false' ); - }, - - controlNav: { - setup: function() { - methods.controlNav.setupPaging(); - }, - setupPaging: function() { - var type = 'control-paging', - j = 1, - item, - slide, - i; - - slider.controlNavScaffold = $( '
      ' ); - - if ( slider.pagingCount > 1 ) { - for ( i = 0; i < slider.pagingCount; i++ ) { - slide = slider.slides.eq( i ); - item = '' + j + ''; - slider.controlNavScaffold.append( '

      EV_TU=87NF%$YFjBKMFB;tI~ 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

    1. ' + item + '
    2. ' ); - j++; - } - } - - // CONTROLSCONTAINER - ( slider.controlsContainer ) ? $( slider.controlsContainer ).append( slider.controlNavScaffold ) : slider.append( slider.controlNavScaffold ); - methods.controlNav.set(); - - methods.controlNav.active(); - - slider.controlNavScaffold.delegate( 'a, img', eventType, function( event ) { - event.preventDefault(); - - if ( watchedEvent === '' || watchedEvent === event.type ) { - var $this = $( this ), - target = slider.controlNav.index( $this ); - - if ( ! $this.hasClass( namespace + 'active' ) ) { - slider.direction = ( target > slider.currentSlide ) ? 'next' : 'prev'; - slider.featureAnimate( target ); - } - } - - // Set up flags to prevent event duplication. - if ( watchedEvent === '' ) { - watchedEvent = event.type; - } - - methods.setToClearWatchedEvent(); - } ); - }, - set: function() { - var selector = 'a'; - slider.controlNav = $( '.' + namespace + 'control-nav li ' + selector, ( slider.controlsContainer ) ? slider.controlsContainer : slider ); - }, - active: function() { - slider.controlNav.removeClass( namespace + 'active' ).eq( slider.animatingTo ).addClass( namespace + 'active' ); - }, - update: function( action, pos ) { - if ( slider.pagingCount > 1 && action === 'add' ) { - slider.controlNavScaffold.append( $( '
    3. ' + slider.count + '
    4. ' ) ); - } else if ( slider.pagingCount === 1 ) { - slider.controlNavScaffold.find( 'li' ).remove(); - } else { - slider.controlNav.eq( pos ).closest( 'li' ).remove(); - } - methods.controlNav.set(); - ( slider.pagingCount > 1 && slider.pagingCount !== slider.controlNav.length ) ? slider.update( pos, action ) : methods.controlNav.active(); - } - }, - - directionNav: { - setup: function() { - var directionNavScaffold = $( '' ); - - // CONTROLSCONTAINER - if ( slider.controlsContainer ) { - $( slider.controlsContainer ).append( directionNavScaffold ); - slider.directionNav = $( '.' + namespace + 'direction-nav li a', slider.controlsContainer ); - } else { - slider.append( directionNavScaffold ); - slider.directionNav = $( '.' + namespace + 'direction-nav li a', slider ); - } - - methods.directionNav.update(); - - slider.directionNav.bind( eventType, function( event ) { - event.preventDefault(); - var target; - - if ( watchedEvent === '' || watchedEvent === event.type ) { - target = ( $( this ).hasClass( namespace + 'next' ) ) ? slider.getTarget( 'next' ) : slider.getTarget( 'prev' ); - slider.featureAnimate( target ); - } - - // Set up flags to prevent event duplication. - if ( watchedEvent === '' ) { - watchedEvent = event.type; - } - - methods.setToClearWatchedEvent(); - } ); - }, - update: function() { - var disabledClass = namespace + 'disabled'; - if ( slider.pagingCount === 1 ) { - slider.directionNav.addClass( disabledClass ).attr( 'tabindex', '-1' ); - } else { - slider.directionNav.removeClass( disabledClass ).removeAttr( 'tabindex' ); - } - } - }, - - touch: function() { - var startX, - startY, - offset, - cwidth, - dx, - startT, - scrolling = false, - localX = 0, - localY = 0, - accDx = 0; - - if ( ! msGesture ) { - el.addEventListener( 'touchstart', onTouchStart, false ); - } else { - el.style.msTouchAction = 'none'; - el._gesture = new MSGesture(); // MSFT specific. - el._gesture.target = el; - el.addEventListener( 'MSPointerDown', onMSPointerDown, false ); - el._slider = slider; - el.addEventListener( 'MSGestureChange', onMSGestureChange, false ); - el.addEventListener( 'MSGestureEnd', onMSGestureEnd, false ); - } - - function onTouchStart( e ) { - if ( slider.animating ) { - e.preventDefault(); - } else if ( ( window.navigator.msPointerEnabled ) || e.touches.length === 1 ) { - cwidth = slider.w; - startT = Number( new Date() ); - - // Local vars for X and Y points. - localX = e.touches[0].pageX; - localY = e.touches[0].pageY; - - offset = ( slider.currentSlide + slider.cloneOffset ) * cwidth; - if ( slider.animatingTo === slider.last && slider.direction !== 'next' ) { - offset = 0; - } - - startX = localX; - startY = localY; - - el.addEventListener( 'touchmove', onTouchMove, false ); - el.addEventListener( 'touchend', onTouchEnd, false ); - } - } - - function onTouchMove( e ) { - // Local vars for X and Y points. - localX = e.touches[0].pageX; - localY = e.touches[0].pageY; - - dx = startX - localX; - scrolling = Math.abs( dx ) < Math.abs( localY - startY ); - - if ( ! scrolling ) { - e.preventDefault(); - if ( slider.transitions ) { - slider.setProps( offset + dx, 'setTouch' ); - } - } - } - - function onTouchEnd() { - // Finish the touch by undoing the touch session. - el.removeEventListener( 'touchmove', onTouchMove, false ); - - if ( slider.animatingTo === slider.currentSlide && ! scrolling && dx !== null ) { - var updateDx = dx, - target = ( updateDx > 0 ) ? slider.getTarget( 'next' ) : slider.getTarget( 'prev' ); - - slider.featureAnimate( target ); - } - el.removeEventListener( 'touchend', onTouchEnd, false ); - - startX = null; - startY = null; - dx = null; - offset = null; - } - - function onMSPointerDown( e ) { - e.stopPropagation(); - if ( slider.animating ) { - e.preventDefault(); - } else { - el._gesture.addPointer( e.pointerId ); - accDx = 0; - cwidth = slider.w; - startT = Number( new Date() ); - offset = ( slider.currentSlide + slider.cloneOffset ) * cwidth; - if ( slider.animatingTo === slider.last && slider.direction !== 'next' ) { - offset = 0; - } - } - } - - function onMSGestureChange( e ) { - e.stopPropagation(); - var slider = e.target._slider, - transX, - transY; - if ( ! slider ) { - return; - } - - transX = -e.translationX, - transY = -e.translationY; - - // Accumulate translations. - accDx = accDx + transX; - dx = accDx; - scrolling = Math.abs( accDx ) < Math.abs( -transY ); - - if ( e.detail === e.MSGESTURE_FLAG_INERTIA ) { - setImmediate( function () { // MSFT specific. - el._gesture.stop(); - } ); - - return; - } - - if ( ! scrolling || Number( new Date() ) - startT > 500 ) { - e.preventDefault(); - if ( slider.transitions ) { - slider.setProps( offset + dx, 'setTouch' ); - } - } - } - - function onMSGestureEnd( e ) { - e.stopPropagation(); - var slider = e.target._slider, - updateDx, - target; - if ( ! slider ) { - return; - } - - if ( slider.animatingTo === slider.currentSlide && ! scrolling && dx !== null ) { - updateDx = dx, - target = ( updateDx > 0 ) ? slider.getTarget( 'next' ) : slider.getTarget( 'prev' ); - - slider.featureAnimate( target ); - } - - startX = null; - startY = null; - dx = null; - offset = null; - accDx = 0; - } - }, - - resize: function() { - if ( ! slider.animating && slider.is( ':visible' ) ) { - slider.doMath(); - - // SMOOTH HEIGHT - methods.smoothHeight(); - slider.newSlides.width( slider.computedW ); - slider.setProps( slider.computedW, 'setTotal' ); - } - }, - - smoothHeight: function( dur ) { - var $obj = slider.viewport; - ( dur ) ? $obj.animate( { 'height': slider.slides.eq( slider.animatingTo ).height() }, dur ) : $obj.height( slider.slides.eq( slider.animatingTo ).height() ); - }, - - setToClearWatchedEvent: function() { - clearTimeout( watchedEventClearTimer ); - watchedEventClearTimer = setTimeout( function() { - watchedEvent = ''; - }, 3000 ); - } - }; - - // Public methods. - slider.featureAnimate = function( target ) { - if ( target !== slider.currentSlide ) { - slider.direction = ( target > slider.currentSlide ) ? 'next' : 'prev'; - } - - if ( ! slider.animating && slider.is( ':visible' ) ) { - slider.animating = true; - slider.animatingTo = target; - - // CONTROLNAV - methods.controlNav.active(); - - slider.slides.removeClass( namespace + 'active-slide' ).eq( target ).addClass( namespace + 'active-slide' ); - - slider.atEnd = target === 0 || target === slider.last; - - // DIRECTIONNAV - methods.directionNav.update(); - - var dimension = slider.computedW, - slideString; - - if ( slider.currentSlide === 0 && target === slider.count - 1 && slider.direction !== 'next' ) { - slideString = 0; - } else if ( slider.currentSlide === slider.last && target === 0 && slider.direction !== 'prev' ) { - slideString = ( slider.count + 1 ) * dimension; - } else { - slideString = ( target + slider.cloneOffset ) * dimension; - } - slider.setProps( slideString, '', slider.vars.animationSpeed ); - if ( slider.transitions ) { - if ( ! slider.atEnd ) { - slider.animating = false; - slider.currentSlide = slider.animatingTo; - } - slider.container.unbind( 'webkitTransitionEnd transitionend' ); - slider.container.bind( 'webkitTransitionEnd transitionend', function() { - slider.wrapup( dimension ); - } ); - } else { - slider.container.animate( slider.args, slider.vars.animationSpeed, 'swing', function() { - slider.wrapup( dimension ); - } ); - } - - // SMOOTH HEIGHT - methods.smoothHeight( slider.vars.animationSpeed ); - } - }; - - slider.wrapup = function( dimension ) { - if ( slider.currentSlide === 0 && slider.animatingTo === slider.last ) { - slider.setProps( dimension, 'jumpEnd' ); - } else if ( slider.currentSlide === slider.last && slider.animatingTo === 0 ) { - slider.setProps( dimension, 'jumpStart' ); - } - slider.animating = false; - slider.currentSlide = slider.animatingTo; - }; - - slider.getTarget = function( dir ) { - slider.direction = dir; - - // Swap for RTL. - if ( slider.isRtl ) { - dir = 'next' === dir ? 'prev' : 'next'; - } - - if ( dir === 'next' ) { - return ( slider.currentSlide === slider.last ) ? 0 : slider.currentSlide + 1; - } else { - return ( slider.currentSlide === 0 ) ? slider.last : slider.currentSlide - 1; - } - }; - - slider.setProps = function( pos, special, dur ) { - var target = ( function() { - var posCalc = ( function() { - switch ( special ) { - case 'setTotal': return ( slider.currentSlide + slider.cloneOffset ) * pos; - case 'setTouch': return pos; - case 'jumpEnd': return slider.count * pos; - case 'jumpStart': return pos; - default: return pos; - } - }() ); - - return ( posCalc * -1 ) + 'px'; - }() ); - - if ( slider.transitions ) { - target = 'translate3d(' + target + ',0,0 )'; - dur = ( dur !== undefined ) ? ( dur / 1000 ) + 's' : '0s'; - slider.container.css( '-' + slider.pfx + '-transition-duration', dur ); - } - - slider.args[slider.prop] = target; - if ( slider.transitions || dur === undefined ) { - slider.container.css( slider.args ); - } - }; - - slider.setup = function( type ) { - var sliderOffset; - - if ( type === 'init' ) { - slider.viewport = $( '
      ' ).css( { 'overflow': 'hidden', 'position': 'relative' } ).appendTo( slider ).append( slider.container ); - slider.cloneCount = 0; - slider.cloneOffset = 0; - } - slider.cloneCount = 2; - slider.cloneOffset = 1; - // Clear out old clones. - if ( type !== 'init' ) { - slider.container.find( '.clone' ).remove(); - } - - slider.container.append( slider.slides.first().clone().addClass( 'clone' ).attr( 'aria-hidden', 'true' ) ).prepend( slider.slides.last().clone().addClass( 'clone' ).attr( 'aria-hidden', 'true' ) ); - slider.newSlides = $( slider.vars.selector, slider ); - - sliderOffset = slider.currentSlide + slider.cloneOffset; - slider.container.width( ( slider.count + slider.cloneCount ) * 200 + '%' ); - slider.setProps( sliderOffset * slider.computedW, 'init' ); - setTimeout( function() { - slider.doMath(); - slider.newSlides.css( { 'width': slider.computedW, 'float': 'left', 'display': 'block' } ); - // SMOOTH HEIGHT - methods.smoothHeight(); - }, ( type === 'init' ) ? 100 : 0 ); - - slider.slides.removeClass( namespace + 'active-slide' ).eq( slider.currentSlide ).addClass( namespace + 'active-slide' ); - }; - - slider.doMath = function() { - var slide = slider.slides.first(); - - slider.w = ( slider.viewport === undefined ) ? slider.width() : slider.viewport.width(); - slider.h = slide.height(); - slider.boxPadding = slide.outerWidth() - slide.width(); - - slider.itemW = slider.w; - slider.pagingCount = slider.count; - slider.last = slider.count - 1; - slider.computedW = slider.itemW - slider.boxPadding; - }; - - slider.update = function( pos, action ) { - slider.doMath(); - - // Update currentSlide and slider.animatingTo if necessary. - if ( pos < slider.currentSlide ) { - slider.currentSlide += 1; - } else if ( pos <= slider.currentSlide && pos !== 0 ) { - slider.currentSlide -= 1; - } - slider.animatingTo = slider.currentSlide; - - // Update controlNav. - if ( action === 'add' || slider.pagingCount > slider.controlNav.length ) { - methods.controlNav.update( 'add' ); - } else if ( action === 'remove' || slider.pagingCount < slider.controlNav.length ) { - if ( slider.currentSlide > slider.last ) { - slider.currentSlide -= 1; - slider.animatingTo -= 1; - } - methods.controlNav.update( 'remove', slider.last ); - } - // Update directionNav. - methods.directionNav.update(); - }; - - // FeaturedSlider: initialize. - methods.init(); - }; - - // Default settings. - $.featuredslider.defaults = { - namespace: 'slider-', // String: prefix string attached to the class of every element generated by the plugin. - selector: '.slides > li', // String: selector, must match a simple pattern. - animationSpeed: 600, // Integer: Set the speed of animations, in milliseconds. - controlsContainer: '', // jQuery Object/Selector: container navigation to append elements. - - // Text labels. - prevText: featuredSliderDefaults.prevText, // String: Set the text for the "previous" directionNav item. - nextText: featuredSliderDefaults.nextText // String: Set the text for the "next" directionNav item. - }; - - // FeaturedSlider: plugin function. - $.fn.featuredslider = function( options ) { - if ( options === undefined ) { - options = {}; - } - - if ( typeof options === 'object' ) { - return this.each( function() { - var $this = $( this ), - selector = ( options.selector ) ? options.selector : '.slides > li', - $slides = $this.find( selector ); - - if ( $slides.length === 1 || $slides.length === 0 ) { - $slides.fadeIn( 400 ); - } else if ( $this.data( 'featuredslider' ) === undefined ) { - new $.featuredslider( this, options ); - } - } ); - } - }; -} )( jQuery ); diff --git a/wp/wp-content/themes/twentyfourteen/page-templates/contributors.php b/wp/wp-content/themes/twentyfourteen/page-templates/contributors.php deleted file mode 100644 index 92602ab1..00000000 --- a/wp/wp-content/themes/twentyfourteen/page-templates/contributors.php +++ /dev/null @@ -1,52 +0,0 @@ - - -
      - - - -
      -
      - - -
      > -

      ', '

      ' ); - - // Output the authors list. - twentyfourteen_list_authors(); - - edit_post_link( __( 'Edit', 'twentyfourteen' ), '
      ', '
      ' ); - ?> -
      - - -
      -
      -
      - - - -
      - - - -
      -
      - -
      -
      -
      - - - -
      - - -
      -
      - - - -
      -
      - -
      - - Themes and click the 'Add New' button. -2. Type in Twenty Fourteen in the search form and press the 'Enter' key in your keyboard. -3. Click on the 'Activate' button to use your new theme right away. -4. Go to https://codex.wordpress.org/Twenty_Fourteen for a guide to customize this theme. -5. Navigate to Appearance > Customize in your admin panel. - -== Copyright == - -Twenty Fourteen WordPress Theme, Copyright 2013-2016 WordPress.org & Automattic.com -Twenty Fourteen is Distributed under the terms of the GNU GPL - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -Twenty Fourteen Theme is derived from the Further Theme, Copyright 2013 Takashi Irie -Further Theme is distributed under the terms of the GNU GPL - -Twenty Fourteen Theme bundles the following third-party resources: - -HTML5 Shiv v3.7.0, Copyright 2014 Alexander Farkas -Licenses: MIT/GPL2 -Source: https://github.com/aFarkas/html5shiv - -Genericons icon font, Copyright 2013-2016 Automattic.com -License: GNU GPL, Version 2 (or later) -Source: http://www.genericons.com - -== Changelog == - -= 1.9 = -* Released: December 6, 2016 - -https://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.9 - -= 1.8 = -* Released: August 15, 2016 - -https://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.8 - -= 1.7 = -* Released: April 12, 2016 - -https://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.7 - -= 1.6 = -* Released: December 8, 2015 - -https://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.6 - -= 1.5 = -* Released: August 18, 2015 - -https://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.5 - -= 1.4 = -* Released: April 23, 2015 - -https://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.4 - -= 1.3 = -* Released: December 18, 2014 - -https://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.3 - -= 1.2 = -* Released: September 4, 2014 - -https://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.2 - -= 1.1 = -* Released: May 8, 2014 - -https://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_1.1 - -= 1.0 = -* Released: December 12, 2013 - -Initial release. diff --git a/wp/wp-content/themes/twentyfourteen/rtl.css b/wp/wp-content/themes/twentyfourteen/rtl.css deleted file mode 100644 index af7f6f46..00000000 --- a/wp/wp-content/themes/twentyfourteen/rtl.css +++ /dev/null @@ -1,854 +0,0 @@ -/* -Theme Name: Twenty Fourteen -Description: Adds support for languages written in a Right To Left (RTL) direction. -It's easy, just a matter of overwriting all the horizontal positioning attributes -of your CSS stylesheet in a separate stylesheet file named rtl.css. - -See https://codex.wordpress.org/Right_to_Left_Language_Support -*/ - -/** - * Table of Contents: - * - * 1.0 - Reset - * 2.0 - Repeatable Patterns - * 4.0 - Header - * 5.0 - Navigation - * 6.0 - Content - * 6.3 - Entry Meta - * 6.4 - Entry Content - * 6.5 - Galleries - * 6.7 - Post/Image/Paging Navigation - * 6.10 - Contributor Page - * 6.14 - Comments - * 7.0 - Sidebar - * 7.1 - Widgets - * 7.2 - Content Sidebar Widgets - * 9.0 - Featured Content - * 10.0 - Media Queries - * ----------------------------------------------------------------------------- - */ - - -/** - * 1.0 Reset - * ----------------------------------------------------------------------------- - */ - -body { - direction: rtl; - unicode-bidi: embed; -} - -a { - display: inline-block; -} - -ul, -ol { - margin: 0 20px 24px 0; -} - -li > ul, -li > ol { - margin: 0 20px 0 0; -} - -caption, -th, -td { - text-align: right; -} - - -/** - * 2.0 Repeatable Patterns - * ----------------------------------------------------------------------------- - */ - -.wp-caption-text { - padding-left: 10px; - padding-right: 0; -} - -.screen-reader-text:focus { - right: 5px; - left: auto; -} - - -/** - * 4.0 Header - * ----------------------------------------------------------------------------- - */ - -.site-title { - float: right; -} - -.search-toggle { - float: left; - margin-left: 38px; - margin-right: auto; -} - -.search-box .search-field { - float: left; - padding: 1px 6px 2px 2px; -} - -.search-toggle .screen-reader-text { - right: 5px; /* Avoid a horizontal scrollbar when the site has a long menu */ - left: auto; -} - - -/** - * 5.0 Navigation - * ----------------------------------------------------------------------------- - */ - -.site-navigation ul ul { - margin-right: 20px; - margin-left: auto; -} - -.menu-toggle { - right: auto; - left: 0; -} - - -/** - * 6.0 Content - * ----------------------------------------------------------------------------- - */ - -/** - * 6.3 Entry Meta - * ----------------------------------------------------------------------------- - */ - -.entry-meta .tag-links a { - margin: 0 10px 4px 4px; -} - -.entry-meta .tag-links a:before { - border-right: 0; - border-left: 8px solid #767676; - right: -7px; - left: auto; -} - -.entry-meta .tag-links a:hover:before, -.entry-meta .tag-links a:focus:before { - border-left-color: #41a62a; -} - -.entry-meta .tag-links a:after { - right: -2px; - left: auto; -} - - -/** - * 6.4 Entry Content - * ----------------------------------------------------------------------------- - */ - -.page-links a, -.page-links > span { - margin: 0 0 2px 1px; -} - -.page-links > .page-links-title { - padding-right: 0; - padding-left: 7px; -} - - -/** - * 6.5 Galleries - * ----------------------------------------------------------------------------- - */ - -.gallery-item { - float: right; - margin: 0 0 4px 4px; -} - -.gallery-columns-1 .gallery-item:nth-of-type(1n), -.gallery-columns-2 .gallery-item:nth-of-type(2n), -.gallery-columns-3 .gallery-item:nth-of-type(3n), -.gallery-columns-4 .gallery-item:nth-of-type(4n), -.gallery-columns-5 .gallery-item:nth-of-type(5n), -.gallery-columns-6 .gallery-item:nth-of-type(6n), -.gallery-columns-7 .gallery-item:nth-of-type(7n), -.gallery-columns-8 .gallery-item:nth-of-type(8n), -.gallery-columns-9 .gallery-item:nth-of-type(9n) { - margin-right: auto; - margin-left: 0; -} - -.gallery-caption { - padding: 6px 8px; - right: 0; - left: auto; - text-align: right; -} - -.gallery-caption:before { - right: 0; - left: auto; -} - - -/** - * 6.7 Post/Image/Paging Navigation - * ----------------------------------------------------------------------------- - */ - -.paging-navigation .page-numbers { - margin-right: auto; - margin-left: 1px; -} - - -/** - * 6.10 Contributor Page - * ----------------------------------------------------------------------------- - */ - -.contributor-avatar { - float: right; - margin: 0 0 20px 30px; -} - - -/** - * 6.14 Comments - * ----------------------------------------------------------------------------- - */ - -.comment-author .avatar { - right: 0; - left: auto; -} - -.bypostauthor > article .fn:before { - margin: 0 -2px 0 2px; -} - -.comment-author, -.comment-awaiting-moderation, -.comment-content, -.comment-list .reply, -.comment-metadata { - padding-right: 30px; - padding-left: 0; -} - -.comment-edit-link { - margin-right: 10px; - margin-left: auto; -} - -.comment-reply-link:before, -.comment-reply-login:before { - margin-left: auto; - margin-right: 2px; -} - -.comment-reply-link:before, -.comment-reply-login:before, -.comment-edit-link:before { - -webkit-transform: scaleX(-1); - -moz-transform: scaleX(-1); - -ms-transform: scaleX(-1); - -o-transform: scaleX(-1); - transform: scaleX(-1); -} - -.comment-content ul, -.comment-content ol { - margin: 0 22px 24px 0; -} - -.comment-list .children { - margin-right: 15px; - margin-left: auto; -} - -.comment-reply-title small a { - float: left; -} - -.comment-navigation .nav-previous a { - margin-right: auto; - margin-left: 10px; -} - - -/** - * 7.0 Sidebars - * ----------------------------------------------------------------------------- - */ - -/** - * 7.1 Widgets - * ----------------------------------------------------------------------------- - */ - -.widget li > ol, -.widget li > ul { - margin-right: 10px; - margin-left: auto; -} - -.widget input, -.widget textarea { - padding: 1px 4px 2px 2px; -} - -.widget_calendar caption { - text-align: right; -} - -.widget_calendar #prev { - padding-right: 5px; - padding-left: 0; -} - -.widget_calendar #next { - padding-right: 0; - padding-left: 5px; - text-align: left; -} - -.widget_twentyfourteen_ephemera .entry-content ul, -.widget_twentyfourteen_ephemera .entry-content ol { - margin: 0 20px 18px 0; -} - -.widget_twentyfourteen_ephemera .entry-content li > ul, -.widget_twentyfourteen_ephemera .entry-content li > ol { - margin: 0 20px 0 0; -} - - -/** - * 7.2 Content Sidebar Widgets - * ----------------------------------------------------------------------------- - */ - -.content-sidebar .widget li > ol, -.content-sidebar .widget li > ul { - margin-right: 18px; - margin-left: auto; -} - -.content-sidebar .widget_twentyfourteen_ephemera .widget-title:before { - margin: -1px 0 0 18px; -} - - -/** - * 9.0 Featured Content - * ----------------------------------------------------------------------------- - */ - -.featured-content .post-thumbnail img { - right: 0; - left: auto; -} - -.slider-viewport { - direction: ltr; -} - -.slider .featured-content .entry-header { - right: 0; - left: auto; - text-align: right; -} - -.slider-control-paging { - float: right; -} - -.slider-control-paging li { - float: right; - margin: 2px 0 2px 4px; -} - -.slider-control-paging li:last-child { - margin-right: auto; - margin-left: 0; -} - -.slider-control-paging a:before { - right: 10px; - left: auto; -} - -.slider-direction-nav li { - border-width: 2px 0 0 1px; - float: right; -} - -.slider-direction-nav li:last-child { - border-width: 2px 1px 0 0; -} - -.slider-direction-nav a:before { - content: "\f429"; -} - -.slider-direction-nav .slider-next:before { - content: "\f430"; -} - - -/** - * 10.0 Media Queries - * ----------------------------------------------------------------------------- - */ - -@media screen and (max-width: 400px) { - .list-view .site-content .post-thumbnail img { - float: right; - margin: 0 0 3px 10px; - } -} - -@media screen and (min-width: 401px) { - .site-content .entry-meta > span { - margin-right: auto; - margin-left: 10px; - } - - .site-content .format-quote .post-format a:before { - margin-right: auto; - margin-left: 2px; - } - - .site-content .format-gallery .post-format a:before { - margin-right: auto; - margin-left: 4px; - } - - .site-content .format-aside .post-format a:before { - margin-right: auto; - margin-left: 2px; - } - - .site-content .featured-post:before { - margin-right: auto; - margin-left: 3px; - } - - .site-content .entry-date a:before, - .attachment .site-content span.entry-date:before { - margin-right: auto; - margin-left: 1px; - } - - .site-content .comments-link a:before { - margin-right: auto; - margin-left: 2px; - } - - .site-content .full-size-link a:before { - margin-right: auto; - margin-left: 1px; - } - - .entry-content .edit-link a:before, - .entry-meta .edit-link a:before { - -webkit-transform: scaleX(-1); - -moz-transform: scaleX(-1); - -ms-transform: scaleX(-1); - -o-transform: scaleX(-1); - transform: scaleX(-1); - } -} - -@media screen and (min-width: 594px) { - .site-content .entry-header { - padding-right: 30px; - padding-left: 30px; - } -} - -@media screen and (min-width: 673px) { - .search-toggle { - margin-right: auto; - margin-left: 18px; - } - - .content-area { - float: right; - } - - .site-content { - margin-right: auto; - margin-left: 33.33333333%; - } - - .archive-header, - .comments-area, - .image-navigation, - .page-header, - .page-content, - .post-navigation, - .site-content .entry-content, - .site-content .entry-summary, - .site-content footer.entry-meta { - padding-right: 30px; - padding-left: 30px; - } - - .full-width .site-content { - margin-left: 0; - } - - .content-sidebar { - float: left; - margin-right: -33.33333333%; - margin-left: auto; - } - - .grid .featured-content .hentry { - float: right; - } - - .slider-control-paging { - padding-right: 20px; - padding-left: 0; - } - - .slider-direction-nav { - float: left; - } - - .slider-direction-nav li { - padding: 0 0 0 1px; - } - - .slider-direction-nav li:last-child { - padding: 0 1px 0 0; - } -} - -@media screen and (min-width: 783px) { - .header-main { - padding-right: 30px; - padding-left: 0; - } - - .search-toggle { - margin-right: auto; - margin-left: 0; - } - - .primary-navigation { - float: left; - margin: 0 -12px 0 1px; - } - - .primary-navigation ul ul { - float: right; - margin: 0; - right: -999em; - left: auto; - } - - .primary-navigation ul ul ul { - right: -999em; - left: auto; - } - - .primary-navigation ul li:hover > ul, - .primary-navigation ul li.focus > ul { - right: auto; - } - - .primary-navigation ul ul li:hover > ul, - .primary-navigation ul ul li.focus > ul { - right: 100%; - left: auto; - } - - .primary-navigation .menu-item-has-children > a, - .primary-navigation .page_item_has_children > a { - padding-right: 12px; - padding-left: 26px; - } - - .primary-navigation .menu-item-has-children > a:after, - .primary-navigation .page_item_has_children > a:after { - right: auto; - left: 12px; - } - - .primary-navigation li .menu-item-has-children > a, - .primary-navigation li .page_item_has_children > a { - padding-right: 12px; - padding-left: 20px; - } - - .primary-navigation .menu-item-has-children li.menu-item-has-children > a:after, - .primary-navigation .menu-item-has-children li.page_item_has_children > a:after, - .primary-navigation .page_item_has_children li.menu-item-has-children > a:after, - .primary-navigation .page_item_has_children li.page_item_has_children > a:after { - content: "\f503"; - right: auto; - left: 8px; - } -} - -@media screen and (min-width: 810px) { - .attachment .entry-attachment .attachment { - margin-right: -168px; - margin-left: -168px; - } - - .attachment .entry-attachment .attachment a { - display: block; - } - - .contributor-avatar { - margin-right: -168px; - margin-left: auto; - } - - .contributor-summary { - float: right; - } - - .full-width .site-content blockquote.alignright, - .full-width .site-content img.size-full.alignright, - .full-width .site-content img.size-large.alignright, - .full-width .site-content img.size-medium.alignright, - .full-width .site-content .wp-caption.alignright { - margin-right: -168px; - margin-left: auto; - } - - .full-width .site-content blockquote.alignleft, - .full-width .site-content img.size-full.alignleft, - .full-width .site-content img.size-large.alignleft, - .full-width .site-content img.size-medium.alignleft, - .full-width .site-content .wp-caption.alignleft { - margin-right: auto; - margin-left: -168px; - } -} - -@media screen and (min-width: 846px) { - .comment-author, - .comment-awaiting-moderation, - .comment-content, - .comment-list .reply, - .comment-metadata { - padding-right: 50px; - padding-left: 0; - } - - .comment-list .children { - margin-right: 20px; - margin-left: auto; - } -} - -@media screen and (min-width: 1008px) { - .search-box-wrapper { - padding-right: 182px; - padding-left: 0; - } - - .main-content { - float: right; - } - - .site-content { - margin-right: 182px; - margin-left: 29.04761904%; - } - - .full-width .site-content { - margin-right: 182px; - } - - .content-sidebar { - margin-right: -29.04761904%; - margin-left: auto; - } - - .site:before { - right: 0; - left: auto; - } - - #secondary { - float: right; - margin: 0 -100% 0 0; - } - - .secondary-navigation ul ul { - right: -999em; - left: auto; - } - - .secondary-navigation ul li:hover > ul, - .secondary-navigation ul li.focus > ul { - right: 162px; - left: auto; - } - - .secondary-navigation .menu-item-has-children > a { - padding-right: 30px; - padding-left: 38px; - } - - .secondary-navigation .menu-item-has-children > a:after { - border-right-color: #fff; - border-left-color: transparent; - right: auto; - left: 26px; - content: "\f503"; - } - - .footer-sidebar .widget { - float: right; - } - - .featured-content { - padding-right: 182px; - padding-left: 0; - } -} - -@media screen and (min-width: 1040px) { - .archive-header, - .comments-area, - .image-navigation, - .page-header, - .page-content, - .post-navigation, - .site-content .entry-header, - .site-content .entry-content, - .site-content .entry-summary, - .site-content footer.entry-meta { - padding-right: 15px; - padding-left: 15px; - } - - .full-width .archive-header, - .full-width .comments-area, - .full-width .image-navigation, - .full-width .page-header, - .full-width .page-content, - .full-width .post-navigation, - .full-width .site-content .entry-header, - .full-width .site-content .entry-content, - .full-width .site-content .entry-summary, - .full-width .site-content footer.entry-meta { - padding-right: 30px; - padding-left: 30px; - } -} - -@media screen and (min-width: 1080px) { - .site-content { - margin-right: 222px; - margin-left: 29.04761904%; - } - - .full-width .site-content { - margin-right: 222px; - } - - .search-box-wrapper, - .featured-content { - padding-right: 222px; - padding-left: 0; - } - - .secondary-navigation ul li:hover > ul, - .secondary-navigation ul li.focus > ul { - right: 202px; - left: auto; - } - - .slider-control-paging { - padding-right: 24px; - padding-left: 0; - } - - .slider-control-paging li { - margin: 12px 0 12px 12px; - } - - .slider-control-paging a:before { - right: 6px; - left: auto; - } -} - -@media screen and (min-width: 1110px) { - .archive-header, - .comments-area, - .image-navigation, - .page-header, - .page-content, - .post-navigation, - .site-content .entry-header, - .site-content .entry-content, - .site-content .entry-summary, - .site-content footer.entry-meta { - padding-right: 30px; - padding-left: 30px; - } -} - -@media screen and (min-width: 1218px) { - .archive-header, - .comments-area, - .image-navigation, - .page-header, - .page-content, - .post-navigation, - .site-content .entry-header, - .site-content .entry-content, - .site-content .entry-summary, - .site-content footer.entry-meta { - margin-left: 54px; - } - - .full-width .archive-header, - .full-width .comments-area, - .full-width .image-navigation, - .full-width .page-header, - .full-width .page-content, - .full-width .post-navigation, - .full-width .site-content .entry-header, - .full-width .site-content .entry-content, - .full-width .site-content .entry-summary, - .full-width .site-content footer.entry-meta { - margin-right: auto; - margin-left: auto; - } -} - -@media screen and (min-width: 1260px) { - .site-content blockquote.alignright { - margin-right: -18%; - margin-left: auto; - } - - .site-content blockquote.alignleft { - margin-left: -18%; - margin-right: auto; - } -} \ No newline at end of file diff --git a/wp/wp-content/themes/twentyfourteen/screenshot.png b/wp/wp-content/themes/twentyfourteen/screenshot.png deleted file mode 100644 index d9f60df442451c6cf5f04cf9aec6e2fcf3302974..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 933301 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 (~cE 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

      settings.zip and clicking "Import settings"', 'wordpress-seo' ); ?>

      - -
      - - - -
      -
      - -
      diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tool-bulk-editor.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tool-bulk-editor.php deleted file mode 100644 index 68ae14b6..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tool-bulk-editor.php +++ /dev/null @@ -1,81 +0,0 @@ -set_screen_reader_content( array( - 'heading_views' => __( 'Filter posts list', 'wordpress-seo' ), - 'heading_pagination' => __( 'Posts list navigation', 'wordpress-seo' ), - 'heading_list' => __( 'Posts list', 'wordpress-seo' ), -) ); - -// If type is empty, fill it with value of first tab (title). -$_GET['type'] = ( ! empty( $_GET['type'] ) ) ? $_GET['type'] : 'title'; - -if ( ! empty( $_REQUEST['_wp_http_referer'] ) ) { - wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), stripslashes( $_SERVER['REQUEST_URI'] ) ) ); - exit; -} - -/** - * Outputs a help center. - * - * @param string $id The id for the tab. - */ -function render_help_center( $id ) { - $helpcenter_tab = new WPSEO_Option_Tab( 'bulk-' . $id, __( 'Bulk editor', 'wordpress-seo' ), - array( 'video_url' => 'https://yoa.st/screencast-tools-bulk-editor' ) ); - - $helpcenter = new WPSEO_Help_Center( 'bulk-editor' . $id, $helpcenter_tab ); - $helpcenter->output_help_center(); -} - -/** - * Renders a bulk editor tab. - * - * @param WPSEO_Bulk_List_Table $table The table to render. - * @param string $id The id for the tab. - */ -function get_rendered_tab( $table, $id ) { - ?> -
      - show_page(); - ?> -
      - - - -

      - -
      - - - -
      - - -
      -
      diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tool-file-editor.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tool-file-editor.php deleted file mode 100644 index 18c9731f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tool-file-editor.php +++ /dev/null @@ -1,150 +0,0 @@ -

      ', esc_html( $msg ), '

      '; -} - -if ( is_multisite() ) { - $action_url = network_admin_url( 'admin.php?page=wpseo_files' ); -} -else { - $action_url = admin_url( 'admin.php?page=wpseo_tools&tool=file-editor' ); -} - -echo '

      '; -$helpcenter_tab = new WPSEO_Option_Tab( 'bulk-editor', 'Bulk editor', - array( 'video_url' => 'https://yoa.st/screencast-tools-file-editor' ) ); - -$helpcenter = new WPSEO_Help_Center( 'bulk-editor', $helpcenter_tab ); -$helpcenter->output_help_center(); - -echo '

      ', __( 'Robots.txt', 'wordpress-seo' ), '

      '; - - -if ( ! file_exists( $robots_file ) ) { - if ( is_writable( get_home_path() ) ) { - echo '
      '; - wp_nonce_field( 'wpseo_create_robots', '_wpnonce', true, true ); - echo '

      ', __( 'You don\'t have a robots.txt file, create one here:', 'wordpress-seo' ), '

      '; - echo ''; - echo '
      '; - } - else { - echo '

      ', __( 'If you had a robots.txt file and it was editable, you could edit it from here.', 'wordpress-seo' ), '

      '; - } -} -else { - $f = fopen( $robots_file, 'r' ); - - $content = ''; - if ( filesize( $robots_file ) > 0 ) { - $content = fread( $f, filesize( $robots_file ) ); - } - $robots_txt_content = esc_textarea( $content ); - - if ( ! is_writable( $robots_file ) ) { - echo '

      ', __( 'If your robots.txt were writable, you could edit it from here.', 'wordpress-seo' ), '

      '; - echo '
      '; - } - else { - echo '
      '; - wp_nonce_field( 'wpseo-robotstxt', '_wpnonce', true, true ); - echo '

      '; - echo '
      '; - echo '
      '; - echo '
      '; - } -} -if ( ( isset( $_SERVER['SERVER_SOFTWARE'] ) && stristr( $_SERVER['SERVER_SOFTWARE'], 'nginx' ) === false ) ) { - - echo '

      ', __( '.htaccess file', 'wordpress-seo' ), '

      '; - - if ( file_exists( $ht_access_file ) ) { - $f = fopen( $ht_access_file, 'r' ); - - $contentht = ''; - if ( filesize( $ht_access_file ) > 0 ) { - $contentht = fread( $f, filesize( $ht_access_file ) ); - } - $contentht = esc_textarea( $contentht ); - - if ( ! is_writable( $ht_access_file ) ) { - echo '

      ', __( 'If your .htaccess were writable, you could edit it from here.', 'wordpress-seo' ), '

      '; - echo '
      '; - } - else { - echo '
      '; - wp_nonce_field( 'wpseo-htaccess', '_wpnonce', true, true ); - echo '

      '; - echo '
      '; - echo '
      '; - echo '
      '; - } - } - else { - echo '

      ', __( 'If you had a .htaccess file and it was editable, you could edit it from here.', 'wordpress-seo' ), '

      '; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/tool-import-export.php b/wp/wp-content/plugins/wordpress-seo/admin/views/tool-import-export.php deleted file mode 100644 index 5356fcb3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/tool-import-export.php +++ /dev/null @@ -1,135 +0,0 @@ -import_headspace(); - } - - if ( ! empty( $post_wpseo['importwpseo'] ) || filter_input( INPUT_GET, 'importwpseo' ) ) { - $import = new WPSEO_Import_WPSEO( $replace ); - } -} - -if ( isset( $_FILES['settings_import_file'] ) ) { - check_admin_referer( 'wpseo-import-file' ); - - $import = new WPSEO_Import(); -} - -/** - * Allow custom import actions. - * - * @api bool|object $import Contains info about the handled import - */ -$import = apply_filters( 'wpseo_handle_import', $import ); - -if ( $import ) { - /** - * Allow customization of import&export message - * - * @api string $msg The message. - */ - $msg = apply_filters( 'wpseo_import_message', isset( $import->msg ) ? $import->msg : '' ); - - if ( $msg != '' ) { - // Check if we've deleted old data and adjust message to match it. - if ( $replace ) { - $msg .= ' ' . __( 'The old data of the imported plugin was deleted successfully.', 'wordpress-seo' ); - } - - $status = ( $import->success ) ? 'updated' : 'error'; - - echo '

      ', $msg, '

      '; - } -} - -$tabs = array( - 'wpseo-import' => array( - 'label' => __( 'Import settings', 'wordpress-seo' ), - 'screencast_video_url' => 'https://yoa.st/screencast-tools-import-export', - ), - 'wpseo-export' => array( - 'label' => __( 'Export settings', 'wordpress-seo' ), - 'screencast_video_url' => 'https://yoa.st/screencast-tools-import-export', - ), - 'import-seo' => array( - 'label' => __( 'Import from other SEO plugins', 'wordpress-seo' ), - 'screencast_video_url' => 'https://yoa.st/screencast-tools-import-export', - ), -); - -?> -

      - - - - $tab ) { - - printf( '
      ', $identifier ); - - if ( ! empty( $tab['screencast_video_url'] ) ) { - $tab_video_url = $tab['screencast_video_url']; - - $helpcenter_tab = new WPSEO_Option_Tab( $identifier, $tab['label'], - array( 'video_url' => $tab['screencast_video_url'] ) ); - - $helpcenter = new WPSEO_Help_Center( $identifier, $helpcenter_tab ); - $helpcenter->output_help_center(); - } - - require_once WPSEO_PATH . 'admin/views/tabs/tool/' . $identifier . '.php'; - - echo '
      '; -} - -/** - * Allow adding a custom import tab - */ -do_action( 'wpseo_import_tab_content' ); diff --git a/wp/wp-content/plugins/wordpress-seo/admin/views/user-profile.php b/wp/wp-content/plugins/wordpress-seo/admin/views/user-profile.php deleted file mode 100644 index 2d9a7a3b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/admin/views/user-profile.php +++ /dev/null @@ -1,53 +0,0 @@ - - -
      - -

      - - -
      - - -
      - - - -
      - - ID ) === 'on' ) ? 'checked' : ''; ?> /> -
      - - - ID ) === 'on' ) ? 'checked' : ''; ?> /> -
      -

      - -

      - - - - ID ) === 'on' ) ? 'checked' : ''; ?> /> -
      -

      - -

      - -
      diff --git a/wp/wp-content/plugins/wordpress-seo/css/admin-global-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/admin-global-471.min.css deleted file mode 100644 index d1ef4bdb..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/admin-global-471.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-premium-indicator{display:inline-block;width:1px;height:1px}#adminmenu .wpseo-premium-indicator{margin:-2px 0 -3px 2px;color:inherit}.wpseo-premium-indicator svg{display:none;width:auto;height:100%}#TB_window .wpseo_content_wrapper p{font-size:14px;font-style:normal}#TB_window .wpseo_content_wrapper label{margin:0 10px 0 0;font-size:14px;font-weight:600}.wpseo-premium-popup-title{margin:1em 0;font-size:1.3em}.wpseo-premium-popup-icon{margin:10px}.edit-tags-php .column-description img{max-width:100%;height:auto}.select2-search__field{margin:0}.select2-results__option,.select2-search--inline,.select2-selection__choice{margin-bottom:0}.select2-container .select2-search--inline .select2-search__field{margin-top:6px!important;line-height:inherit}.yoast-label-strong{font-weight:600}.yoast-video-container-max-width{max-width:560px}.yoast-video-container{overflow:hidden;position:relative;height:0;padding-bottom:56.25%}.yoast-video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.yoast-settings{margin-bottom:2em;padding-left:220px}.yoast-settings h2{margin-bottom:0;margin-left:-220px}.yoast-settings label{display:inline-block;width:200px;margin-right:6px;margin-left:-220px;padding-top:4px;padding-right:10px;color:#23282d;font-size:14px;font-weight:600;line-height:1.3;vertical-align:top}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio,.yoast-settings fieldset,.yoast-settings input[type=text],.yoast-settings label,.yoast-settings select,.yoast-settings textarea{margin-top:2em;margin-bottom:.5em}.yoast-settings__textarea--medium{width:100%;max-width:600px}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio{position:relative;top:1px;vertical-align:top}.yoast-settings__group--checkbox,.yoast-settings__group--radio{padding-top:1em}.yoast-settings__group--checkbox .yoast-settings__checkbox,.yoast-settings__group--radio .yoast-settings__radio{margin:0 4px 10px 0}.yoast-settings__checkbox+label,.yoast-settings__radio+label{width:auto;max-width:calc(100% - 25px);margin-right:0;margin-left:0;padding:0}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{margin-top:0;margin-bottom:10px;font-weight:400}.yoast-settings legend{color:#23282d;font-size:14px;font-weight:600}.yoast-settings .description{margin-top:0;font-size:14px}@media screen and (max-width:782px){.yoast-settings{padding-left:0}.yoast-settings h2{margin-left:0}.yoast-settings label{width:auto;margin-right:0;margin-left:0;padding:0}.yoast .yoast-settings__radio,.yoast-settings__radio+label{margin-bottom:1em}.yoast-settings__checkbox+label,.yoast-settings__radio+label{max-width:calc(100% - 35px);padding-top:8px}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{padding-top:4px}.yoast-settings input[type=text],.yoast-settings select,.yoast-settings textarea{display:block;box-sizing:border-box;width:100%;max-width:none;margin-top:0;margin-bottom:0;padding:7px 10px;line-height:1.5}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/adminbar-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/adminbar-471.min.css deleted file mode 100644 index 28543e00..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/adminbar-471.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{display:inline-block!important;float:left;width:12px!important;height:12px!important;border-radius:50%!important;background-color:#999}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#999}.wpseo-score-icon.noindex{background-color:#1e8cbe}.adminbar-seo-score{margin:10px 10px 0 4px!important}#wpadminbar .yoast-issue-added,#wpadminbar .yoast-issue-added:hover{position:absolute;top:32px;left:0;min-width:300px;padding:2px 8px;border-radius:0 10px 10px;color:#fff;background-color:#a4286a;box-shadow:1px 1px 1px 1px grey}#wpadminbar .yoast-issue-added{display:none}#wpadminbar .yoast-issue-counter{display:inline;padding:1px 7px 1px 6px!important;border-radius:50%;color:#fff}.yoast-issue-counter{background-color:#d54e21}#wpadminbar .yoast-logo.svg{float:left;width:26px;height:30px;background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgc3R5bGU9ImZpbGw6IzgyODc4YyIgdmlld0JveD0iMCAwIDUxMiA1MTIiPjxnPjxnPjxnPjxnPjxwYXRoIGQ9Ik0yMDMuNiwzOTVjNi44LTE3LjQsNi44LTM2LjYsMC01NGwtNzkuNC0yMDRoNzAuOWw0Ny43LDE0OS40bDc0LjgtMjA3LjZIMTE2LjRjLTQxLjgsMC03NiwzNC4yLTc2LDc2VjM1N2MwLDQxLjgsMzQuMiw3Niw3Niw3NkgxNzNDMTg5LDQyNC4xLDE5Ny42LDQxMC4zLDIwMy42LDM5NXoiLz48L2c+PGc+PHBhdGggZD0iTTQ3MS42LDE1NC44YzAtNDEuOC0zNC4yLTc2LTc2LTc2aC0zTDI4NS43LDM2NWMtOS42LDI2LjctMTkuNCw0OS4zLTMwLjMsNjhoMjE2LjJWMTU0Ljh6Ii8+PC9nPjwvZz48cGF0aCBzdHJva2Utd2lkdGg9IjIuOTc0IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIGQ9Ik0zMzgsMS4zbC05My4zLDI1OS4xbC00Mi4xLTEzMS45aC04OS4xbDgzLjgsMjE1LjJjNiwxNS41LDYsMzIuNSwwLDQ4Yy03LjQsMTktMTksMzcuMy01Myw0MS45bC03LjIsMXY3Nmg4LjNjODEuNywwLDExOC45LTU3LjIsMTQ5LjYtMTQyLjlMNDMxLjYsMS4zSDMzOHogTTI3OS40LDM2MmMtMzIuOSw5Mi02Ny42LDEyOC43LTEyNS43LDEzMS44di00NWMzNy41LTcuNSw1MS4zLTMxLDU5LjEtNTEuMWM3LjUtMTkuMyw3LjUtNDAuNywwLTYwbC03NS0xOTIuN2g1Mi44bDUzLjMsMTY2LjhsMTA1LjktMjk0aDU4LjFMMjc5LjQsMzYyeiIvPjwvZz48L2c+PC9zdmc+);background-repeat:no-repeat;background-position:0 6px;background-size:20px}#wpadminbar #wp-admin-bar-wpseo-licenses .ab-item{color:#f18500}@media screen and (max-width:782px){#wpadminbar #wp-admin-bar-wpseo-menu{display:block;position:static}#wpadminbar .yoast-logo.svg{width:52px;height:46px;background-position:50% 8px;background-size:30px}#wpadminbar .yoast-logo+.yoast-issue-counter{margin-left:-10px}#wpadminbar .ab-sub-wrapper .yoast-issue-counter{position:relative;top:-5px;vertical-align:text-top}#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-kwresearch,#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-settings{display:none}#wpadminbar .yoast-issue-added{top:46px}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/alerts-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/alerts-471.min.css deleted file mode 100644 index dcd52f8e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/alerts-471.min.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-alert{padding:0 12px;border-left:4px solid #fff;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2)}.yoast-alerts .yoast-alert-holder{margin-bottom:.8em}.yoast-alerts .yoast-alert{width:100%}.yoast-container__alert .yoast-alert{border-left-color:#dc3232}#yoast-alerts-dismissed .yoast-alert{border-left-color:#d93f69}.yoast-container__warning .yoast-alert{border-left-color:#5d237a}#yoast-warnings-dismissed .yoast-alert{border-left-color:#0075b3}.yoast-container{position:relative;max-width:1280px;margin:20px 20px 1px;padding:20px 20px 0;border:1px solid #e5e5e5;background-color:#fdfdfd;box-shadow:0 1px 1px rgba(0,0,0,.04)}.yoast-alerts>h2:first-child{margin-bottom:1em}.yoast-alerts .yoast-container h3{margin:-20px -20px 0;padding:1em;border-bottom:1px solid #ccc;background-color:#fdfdfd;font-size:1.4em}h3 .dashicons-warning{color:#dc3232}.yoast-container .container{max-width:980px}.yoast-container .yoast-alert-holder{display:-ms-flexbox;display:flex}.dismiss .dashicons,.restore .dashicons{width:24px;height:24px;font-size:24px}.yoast-bottom-spacing{margin-bottom:20px}.yoast-alerts .button.dismiss,.yoast-alerts .button.restore{width:45px;height:45px;margin-left:10px;padding:0;outline:0;line-height:inherit;cursor:pointer;-ms-flex:0 0 45px;flex:0 0 45px}.yoast-alerts .button.dismiss:focus,.yoast-alerts .button.dismiss:hover,.yoast-alerts .button.restore:focus,.yoast-alerts .button.restore:hover{background:0 0}.yoast-container .separator{margin-top:1em;margin-bottom:1em;border-top:1px solid #ddd}.yoast-container .dashicons-yes{color:#77b227}.yoast-container__warning .dashicons-flag{color:#5d237a}.yoast-container-disabled{display:table-cell;position:absolute;top:0;right:0;bottom:0;left:0;border-radius:4px;background-color:rgba(232,232,232,.7)}.yoast-no-issues{padding:1em 1em 1em 16px;color:#666} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dashboard-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/dashboard-471.min.css deleted file mode 100644 index f08dbdab..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dashboard-471.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{display:inline-block;width:12px;height:12px;margin:3px 10px 0 3px;border-radius:50%;background:#888;vertical-align:top}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}#wpseo-dashboard-overview a{text-decoration:underline}#wpseo-dashboard-overview a.button{text-decoration:none}#wpseo-dashboard-overview th{font-weight:400;text-align:left}.wpseo-dashboard-overview-scores{display:table}.wpseo-dashboard-overview-scores li{display:table-row}.wpseo-dashboard-overview-post-count,.wpseo-dashboard-overview-post-score{display:table-cell;padding:2px 0}.wpseo-dashboard-overview-post-count{padding:0 0 0 10px;text-align:right}#wpseo-dashboard-overview .onpage{margin:5px 0 0;padding:10px 0 0;border-top:1px solid #eee}#wpseo-dashboard-overview .onpage .button.landing-page{border-color:#7b1e4f #6f1b47 #6f1b47;color:#fff;background:#a4286a;box-shadow:0 1px 0 #6f1b47}#wpseo-dashboard-overview .onpage .button.landing-page:focus,#wpseo-dashboard-overview .onpage .button.landing-page:hover{border-color:#6f1b47;background:#90235d}#wpseo-dashboard-overview .onpage .button.landing-page:focus{box-shadow:0 1px 0 #7b1e4f,0 0 2px 1px #a35685}#wpseo-dashboard-overview .onpage .button.landing-page:active{border-color:#6f1b47;background:#7b1e4f;box-shadow:inset 0 2px 0 #6f1b47;vertical-align:top} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/admin-global-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/admin-global-471-rtl.min.css deleted file mode 100644 index 67d2c3f3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/admin-global-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-premium-indicator{display:inline-block;width:1px;height:1px}#adminmenu .wpseo-premium-indicator{margin:-2px 2px -3px 0;color:inherit}.wpseo-premium-indicator svg{display:none;width:auto;height:100%}#TB_window .wpseo_content_wrapper p{font-size:14px;font-style:normal}#TB_window .wpseo_content_wrapper label{margin:0 0 0 10px;font-size:14px;font-weight:600}.wpseo-premium-popup-title{margin:1em 0;font-size:1.3em}.wpseo-premium-popup-icon{margin:10px}.edit-tags-php .column-description img{max-width:100%;height:auto}.select2-search__field{margin:0}.select2-results__option,.select2-search--inline,.select2-selection__choice{margin-bottom:0}.select2-container .select2-search--inline .select2-search__field{margin-top:6px!important;line-height:inherit}.yoast-label-strong{font-weight:600}.yoast-video-container-max-width{max-width:560px}.yoast-video-container{overflow:hidden;position:relative;height:0;padding-bottom:56.25%}.yoast-video-container iframe{position:absolute;top:0;right:0;width:100%;height:100%}.yoast-settings{margin-bottom:2em;padding-right:220px}.yoast-settings h2{margin-bottom:0;margin-right:-220px}.yoast-settings label{display:inline-block;width:200px;margin-left:6px;margin-right:-220px;padding-top:4px;padding-left:10px;color:#23282d;font-size:14px;font-weight:600;line-height:1.3;vertical-align:top}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio,.yoast-settings fieldset,.yoast-settings input[type=text],.yoast-settings label,.yoast-settings select,.yoast-settings textarea{margin-top:2em;margin-bottom:.5em}.yoast-settings__textarea--medium{width:100%;max-width:600px}.yoast .yoast-settings__checkbox,.yoast .yoast-settings__radio{position:relative;top:1px;vertical-align:top}.yoast-settings__group--checkbox,.yoast-settings__group--radio{padding-top:1em}.yoast-settings__group--checkbox .yoast-settings__checkbox,.yoast-settings__group--radio .yoast-settings__radio{margin:0 0 10px 4px}.yoast-settings__checkbox+label,.yoast-settings__radio+label{width:auto;max-width:calc(100% - 25px);margin-left:0;margin-right:0;padding:0}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{margin-top:0;margin-bottom:10px;font-weight:400}.yoast-settings legend{color:#23282d;font-size:14px;font-weight:600}.yoast-settings .description{margin-top:0;font-size:14px}@media screen and (max-width:782px){.yoast-settings{padding-right:0}.yoast-settings h2{margin-right:0}.yoast-settings label{width:auto;margin-left:0;margin-right:0;padding:0}.yoast .yoast-settings__radio,.yoast-settings__radio+label{margin-bottom:1em}.yoast-settings__checkbox+label,.yoast-settings__radio+label{max-width:calc(100% - 35px);padding-top:8px}.yoast-settings__group--checkbox .yoast-settings__checkbox+label,.yoast-settings__group--radio .yoast-settings__radio+label{padding-top:4px}.yoast-settings input[type=text],.yoast-settings select,.yoast-settings textarea{display:block;box-sizing:border-box;width:100%;max-width:none;margin-top:0;margin-bottom:0;padding:7px 10px;line-height:1.5}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/adminbar-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/adminbar-471-rtl.min.css deleted file mode 100644 index c69393ee..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/adminbar-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{display:inline-block!important;float:right;width:12px!important;height:12px!important;border-radius:50%!important;background-color:#999}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#999}.wpseo-score-icon.noindex{background-color:#1e8cbe}.adminbar-seo-score{margin:10px 4px 0 10px!important}#wpadminbar .yoast-issue-added,#wpadminbar .yoast-issue-added:hover{position:absolute;top:32px;right:0;min-width:300px;padding:2px 8px;border-radius:10px 0 10px 10px;color:#fff;background-color:#a4286a;box-shadow:-1px 1px 1px 1px grey}#wpadminbar .yoast-issue-added{display:none}#wpadminbar .yoast-issue-counter{display:inline;padding:1px 6px 1px 7px!important;border-radius:50%;color:#fff}.yoast-issue-counter{background-color:#d54e21}#wpadminbar .yoast-logo.svg{float:right;width:26px;height:30px;background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgc3R5bGU9ImZpbGw6IzgyODc4YyIgdmlld0JveD0iMCAwIDUxMiA1MTIiPjxnPjxnPjxnPjxnPjxwYXRoIGQ9Ik0yMDMuNiwzOTVjNi44LTE3LjQsNi44LTM2LjYsMC01NGwtNzkuNC0yMDRoNzAuOWw0Ny43LDE0OS40bDc0LjgtMjA3LjZIMTE2LjRjLTQxLjgsMC03NiwzNC4yLTc2LDc2VjM1N2MwLDQxLjgsMzQuMiw3Niw3Niw3NkgxNzNDMTg5LDQyNC4xLDE5Ny42LDQxMC4zLDIwMy42LDM5NXoiLz48L2c+PGc+PHBhdGggZD0iTTQ3MS42LDE1NC44YzAtNDEuOC0zNC4yLTc2LTc2LTc2aC0zTDI4NS43LDM2NWMtOS42LDI2LjctMTkuNCw0OS4zLTMwLjMsNjhoMjE2LjJWMTU0Ljh6Ii8+PC9nPjwvZz48cGF0aCBzdHJva2Utd2lkdGg9IjIuOTc0IiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIGQ9Ik0zMzgsMS4zbC05My4zLDI1OS4xbC00Mi4xLTEzMS45aC04OS4xbDgzLjgsMjE1LjJjNiwxNS41LDYsMzIuNSwwLDQ4Yy03LjQsMTktMTksMzcuMy01Myw0MS45bC03LjIsMXY3Nmg4LjNjODEuNywwLDExOC45LTU3LjIsMTQ5LjYtMTQyLjlMNDMxLjYsMS4zSDMzOHogTTI3OS40LDM2MmMtMzIuOSw5Mi02Ny42LDEyOC43LTEyNS43LDEzMS44di00NWMzNy41LTcuNSw1MS4zLTMxLDU5LjEtNTEuMWM3LjUtMTkuMyw3LjUtNDAuNywwLTYwbC03NS0xOTIuN2g1Mi44bDUzLjMsMTY2LjhsMTA1LjktMjk0aDU4LjFMMjc5LjQsMzYyeiIvPjwvZz48L2c+PC9zdmc+);background-repeat:no-repeat;background-position:100% 6px;background-size:20px}#wpadminbar #wp-admin-bar-wpseo-licenses .ab-item{color:#f18500}@media screen and (max-width:782px){#wpadminbar #wp-admin-bar-wpseo-menu{display:block;position:static}#wpadminbar .yoast-logo.svg{width:52px;height:46px;background-position:50% 8px;background-size:30px}#wpadminbar .yoast-logo+.yoast-issue-counter{margin-right:-10px}#wpadminbar .ab-sub-wrapper .yoast-issue-counter{position:relative;top:-5px;vertical-align:text-top}#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-kwresearch,#wp-admin-bar-wpseo-menu.menupop .ab-sub-wrapper #wp-admin-bar-wpseo-settings{display:none}#wpadminbar .yoast-issue-added{top:46px}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/alerts-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/alerts-471-rtl.min.css deleted file mode 100644 index 7ea24a92..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/alerts-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-alert{padding:0 12px;border-right:4px solid #fff;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2)}.yoast-alerts .yoast-alert-holder{margin-bottom:.8em}.yoast-alerts .yoast-alert{width:100%}.yoast-container__alert .yoast-alert{border-right-color:#dc3232}#yoast-alerts-dismissed .yoast-alert{border-right-color:#d93f69}.yoast-container__warning .yoast-alert{border-right-color:#5d237a}#yoast-warnings-dismissed .yoast-alert{border-right-color:#0075b3}.yoast-container{position:relative;max-width:1280px;margin:20px 20px 1px;padding:20px 20px 0;border:1px solid #e5e5e5;background-color:#fdfdfd;box-shadow:0 1px 1px rgba(0,0,0,.04)}.yoast-alerts>h2:first-child{margin-bottom:1em}.yoast-alerts .yoast-container h3{margin:-20px -20px 0;padding:1em;border-bottom:1px solid #ccc;background-color:#fdfdfd;font-size:1.4em}h3 .dashicons-warning{color:#dc3232}.yoast-container .container{max-width:980px}.yoast-container .yoast-alert-holder{display:-ms-flexbox;display:flex}.dismiss .dashicons,.restore .dashicons{width:24px;height:24px;font-size:24px}.yoast-bottom-spacing{margin-bottom:20px}.yoast-alerts .button.dismiss,.yoast-alerts .button.restore{width:45px;height:45px;margin-right:10px;padding:0;outline:0;line-height:inherit;cursor:pointer;-ms-flex:0 0 45px;flex:0 0 45px}.yoast-alerts .button.dismiss:focus,.yoast-alerts .button.dismiss:hover,.yoast-alerts .button.restore:focus,.yoast-alerts .button.restore:hover{background:0 0}.yoast-container .separator{margin-top:1em;margin-bottom:1em;border-top:1px solid #ddd}.yoast-container .dashicons-yes{color:#77b227}.yoast-container__warning .dashicons-flag{color:#5d237a}.yoast-container-disabled{display:table-cell;position:absolute;top:0;left:0;bottom:0;right:0;border-radius:4px;background-color:rgba(232,232,232,.7)}.yoast-no-issues{padding:1em 16px 1em 1em;color:#666} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/dashboard-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/dashboard-471-rtl.min.css deleted file mode 100644 index 1fb78479..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/dashboard-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{display:inline-block;width:12px;height:12px;margin:3px 3px 0 10px;border-radius:50%;background:#888;vertical-align:top}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}#wpseo-dashboard-overview a{text-decoration:underline}#wpseo-dashboard-overview a.button{text-decoration:none}#wpseo-dashboard-overview th{font-weight:400;text-align:right}.wpseo-dashboard-overview-scores{display:table}.wpseo-dashboard-overview-scores li{display:table-row}.wpseo-dashboard-overview-post-count,.wpseo-dashboard-overview-post-score{display:table-cell;padding:2px 0}.wpseo-dashboard-overview-post-count{padding:0 10px 0 0;text-align:left}#wpseo-dashboard-overview .onpage{margin:5px 0 0;padding:10px 0 0;border-top:1px solid #eee}#wpseo-dashboard-overview .onpage .button.landing-page{border-color:#7b1e4f #6f1b47 #6f1b47;color:#fff;background:#a4286a;box-shadow:0 1px 0 #6f1b47}#wpseo-dashboard-overview .onpage .button.landing-page:focus,#wpseo-dashboard-overview .onpage .button.landing-page:hover{border-color:#6f1b47;background:#90235d}#wpseo-dashboard-overview .onpage .button.landing-page:focus{box-shadow:0 1px 0 #7b1e4f,0 0 2px 1px #a35685}#wpseo-dashboard-overview .onpage .button.landing-page:active{border-color:#6f1b47;background:#7b1e4f;box-shadow:inset 0 2px 0 #6f1b47;vertical-align:top} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/edit-page-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/edit-page-471-rtl.min.css deleted file mode 100644 index 6b8354be..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/edit-page-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{display:inline-block;width:12px;height:12px;margin-right:6px;border-radius:50%;background:#888;line-height:16px}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}th#wpseo-score{width:63px}th#wpseo-score-readability{width:75px}@media screen and (max-width:782px){.column-wpseo-focuskw,.column-wpseo-metadesc,.column-wpseo-score,.column-wpseo-title{display:none}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/featured-image-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/featured-image-471-rtl.min.css deleted file mode 100644 index 336c6100..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/featured-image-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -#yst_opengraph_image_warning{margin-top:0}.yoast-opengraph-image-notice #set-post-thumbnail>img{box-shadow:0 0 0 2px #fff,0 0 0 5px #dc3232} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/help-center-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/help-center-471-rtl.min.css deleted file mode 100644 index a72d21d7..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/help-center-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-tab-video-container{margin-bottom:20px;border-bottom:1px solid #a4286a}.yoast-help-center-open .wpseo-tab-video-container{border-bottom:none}.postbox .wpseo-tab-video-container{margin-left:-12px;margin-right:-12px}.wpseo-tab-video-container__handle{width:100%;margin:0;padding:10px 12px;border:none;outline:0;color:#a4286a;background:0 0;line-height:19px;text-align:right;cursor:pointer}.wpseo-tab-video-container__handle:focus,.wpseo-tab-video-container__handle:hover{text-decoration:underline}.wpseo-tab-video-container__handle .toggle__arrow,.wpseo-tab-video-slideout a.button,.wpseo-tab-video-slideout a.button-primary{text-decoration:none}.wpseo-tab-video-container__handle .dashicons-before:before{margin-left:5px}.wpseo-tab-video-container .wpseo-premium-popup{max-width:770px}.wpseo-tab-video-slideout{display:-ms-flexbox;display:flex;padding:2em 0;background-color:#a4286a;box-shadow:inset 0 10px 10px -5px rgba(123,30,80,.5),inset 0 -10px 10px -5px rgba(123,30,80,.5)}.wpseo-admin-page .wpseo-tab-video-slideout{border:1px solid #e5e5e5;border-top:0}.wpseo-tab-video-slideout.hidden{display:none}.wpseo-tab-video-slideout .yoast-help-center-tabs{padding:0 0 1em;color:#fff;background-color:#a4286a;-ms-flex:0 0 164px;flex:0 0 164px}.wpseo-tab-video-slideout .yoast-help-center-tabs ul{margin:0}.wpseo-tab-video-slideout .yoast-help-center-tabs-wrap{max-width:916px;padding:0;-ms-flex:0 1 916px;flex:0 1 916px}.wpseo-tab-video-slideout .yoast-help-tab-content{display:none;padding:0 12px;color:#fff;font-weight:300}.wpseo-tab-video-slideout .yoast-help-tab-content.active{display:block}.wpseo-tab-video-slideout .yoast-help-tab-content.active.yoast-help-tab-content-video{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.wpseo-tab-video-slideout .yoast-help-tab-content li{margin:2px 10px;list-style:disc inside}.wpseo-tab-video-slideout .wpseo-tab-video__panel--video{max-width:560px;margin-left:12px;padding-bottom:12px;-ms-flex:0 1 560px;flex:0 1 560px}.wpseo-tab-video-slideout .wpseo-tab-video__panel--video iframe{vertical-align:middle}.wpseo-tab-video-slideout .wpseo-tab-video__panel--text{min-width:220px;max-width:560px;-ms-flex:1 1 220px;flex:1 1 220px}.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea{margin:0 0 12px;padding:15px 15px 5px;border:1px solid #fff;border-radius:30px 30px 30px 0;color:#fff;background-color:#a4286a}.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea a,.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea a:focus,.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea a:hover{color:#fff;font-weight:500}.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea h3{margin:0}.wpseo-tab-video-slideout a{color:#fff}#wpseo_meta .wpseo-tab-video-slideout h2,.wpseo-tab-video-slideout h1,.wpseo-tab-video-slideout h2,.wpseo-tab-video-slideout h3,.wpseo-tab-video-slideout h4,.wpseo-tab-video-slideout h5,.wpseo-tab-video-slideout h6{margin-top:.5em;margin-bottom:1em;padding:0;color:#fff;font-size:1.3em;font-weight:400;line-height:1.4}.wpseo-help-center-item{display:inline}.wpseo-help-center-item a{display:block;padding:10px 12px;color:#fff;line-height:20px;text-decoration:none}.wpseo-help-center-item a:focus,.wpseo-help-center-item a:hover{text-decoration:underline}.wpseo-help-center-item a.dashicons-before:before{margin-left:3px;text-decoration:none}.wpseo-help-center-item.active a{color:#a4286a;background-color:#fff}@media screen and (max-width:1280px){.columns-2 .wpseo-tab-video-slideout .wpseo-tab-video__panel--video{margin-left:0}}@media screen and (max-width:1024px){.wpseo-tab-video-slideout .wpseo-tab-video__panel--video{margin-left:0;flex-basis:100%;-ms-flex-preferred-size:100%}.columns-2 .wpseo-tab-video-slideout{display:block}.columns-2 .wpseo-tab-video-slideout.hidden{display:none}.columns-2 .wpseo-tab-video-slideout .yoast-help-center-tabs{width:auto;padding-left:12px;padding-right:12px}.columns-2 .wpseo-tab-video-slideout .yoast-help-tab-content.active.yoast-help-tab-content-video{display:block;padding:0}.columns-2 .wpseo-tab-video-slideout .wpseo-tab-video__panel--video{max-width:none}.columns-2 .wpseo-tab-video-slideout .wpseo-tab-video__panel--text{max-width:none;padding:0 12px}.columns-2 .wpseo-help-center-item a{display:inline-block;margin:0 0 8px 4px;border:1px solid rgba(255,255,255,.5)}}@media screen and (max-width:782px){.wpseo-tab-video-slideout{display:block}.wpseo-tab-video-slideout .yoast-help-center-tabs{width:auto;padding-left:12px;padding-right:12px}.wpseo-tab-video-slideout .yoast-help-tab-content.active.yoast-help-tab-content-video{display:block;padding:0}.wpseo-tab-video-slideout .wpseo-tab-video__panel--video{max-width:none}.wpseo-tab-video-slideout .wpseo-tab-video__panel--text{max-width:none;padding:0 12px}.wpseo-help-center-item a{display:inline-block;margin:0 0 8px 4px;border:1px solid rgba(255,255,255,.5)}.wpseo-premium-popup-icon{display:none}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/inside-editor-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/inside-editor-471-rtl.min.css deleted file mode 100644 index d16fec52..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/inside-editor-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-text-mark{background-color:#e1bee7}.yoast-text-mark__highlight{color:#fff;background-color:#4a148c} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/kb-search-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/kb-search-471-rtl.min.css deleted file mode 100644 index 36099215..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/kb-search-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-kb-search-search-bar{border-bottom:1px solid #ccc}.wpseo-kb-search-search-bar form{display:-ms-flexbox;display:flex;max-width:600px}.wpseo-kb-search-search-bar input[type=text]{margin:0 0 1em 7px;padding:0 5px 1px;font-size:13px;line-height:26px;-ms-flex:1 1 auto;flex:1 1 auto}.wpseo-kb-search-search-bar .wpseo-kb-search-search-button{margin:0 0 1em}.wpseo-kb-search-results{overflow:auto;height:500px;margin:0;padding:0;list-style:none}.yoast-help-tab-content .wpseo-kb-search-results li{max-width:none;margin:0;list-style:none}.wpseo-kb-search-result{display:block;margin:0;padding-right:5px;border-bottom:1px solid #efefef;text-decoration:none}.wpseo-kb-search-result p{max-width:none;margin-top:0}.wpseo-kb-search-result-link{display:block;outline:0;text-decoration:none;cursor:pointer}.wpseo-kb-search-result-link:focus,.wpseo-kb-search-result-link:hover{background-color:rgba(93,12,55,.5);box-shadow:none;text-decoration:underline}.wpseo-kb-search-result .wpseo-kb-search-result-title{margin:0;padding:14px 0}.wpseo-kb-search-ext-link{float:left}.wpseo-kb-search-back-button:before{content:"\f139"}.wpseo-kb-search-ext-link:before{content:"\f504"}.dashicon-button:before{display:inline-block;font-family:dashicons;font-size:20px;line-height:1.35em;vertical-align:middle}.wpseo-kb-search-navigation{z-index:10;padding:1em 0}.kb-search-content-frame{width:100%;height:543px;background:url("data:image/svg+xml;charset=utf-8,Loading article...") 100% 0 no-repeat}.wpseo-kb-loader,.wpseo-kb-loader:after,.wpseo-kb-loader:before{width:2.5em;height:2.5em;border-radius:50%;animation:load7 1.8s infinite ease-in-out;animation-fill-mode:both}.wpseo-kb-loader{position:relative;margin:80px auto;font-size:10px;text-indent:-9999em;-ms-transform:translateZ(0);transform:translateZ(0);animation-delay:-.16s}.wpseo-kb-loader:before{right:-3.5em;animation-delay:-.32s}.wpseo-kb-loader:after{right:3.5em}.wpseo-kb-loader:after,.wpseo-kb-loader:before{position:absolute;top:0;content:""}.dashicons{text-decoration:none}@keyframes load7{0%,100%,80%{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}@media screen and (max-width:782px){.wpseo-kb-search-search-bar input[type=text]{padding:6px 5px;font-size:14px;line-height:normal}}@media screen and (max-width:600px){.wpseo-kb-search-search-bar form{display:block;max-width:none}.wpseo-kb-search-search-bar input[type=text]{width:100%;margin-left:0}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-471-rtl.min.css deleted file mode 100644 index 861e66e5..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-section{width:auto;max-width:640px}.snippet_container:after,.snippet_container:before{display:table;content:" "}.snippet_container:after{clear:both}.snippet-editor__view{clear:both;background:#fff}.snippet-editor__view-toggle{display:inline-block;margin-top:10px;margin-right:20px;border:1px solid #dbdbdb;border-radius:4px;background-color:#f7f7f7;vertical-align:top}.snippet-editor__view-icon{float:right;width:31px;height:31px;border:none;border-bottom:4px solid transparent;outline:0;background-color:transparent;background-repeat:no-repeat;background-position:center,center;cursor:pointer}.snippet-editor__view-icon:focus,.snippet-editor__view-icon:hover{border-color:#1074a8;background-color:#fff;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out}.snippet-editor__view-icon--active{border-color:#555;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out}.snippet-editor__view-icon.yoast-tooltip:before{bottom:-10px}.snippet-editor__view-icon.yoast-tooltip:after{margin-top:10px}.snippet-editor__view-icon-desktop{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1728%20992v%2D832q0%2D13%2D9%2E5%2D22%2E5t%2D22%2E5%2D9%2E5h%2D1600q%2D13%200%2D22%2E5%209%2E5t%2D9%2E5%2022%2E5v832q0%2013%209%2E5%2022%2E5t22%2E5%209%2E5h1600q13%200%2022%2E5%2D9%2E5t9%2E5%2D22%2E5zm128%2D832v1088q0%2066%2D47%20113t%2D113%2047h%2D544q0%2037%2016%2077%2E5t32%2071%2016%2043%2E5q0%2026%2D19%2045t%2D45%2019h%2D512q%2D26%200%2D45%2D19t%2D19%2D45q0%2D14%2016%2D44t32%2D70%2016%2D78h%2D544q%2D66%200%2D113%2D47t%2D47%2D113v%2D1088q0%2D66%2047%2D113t113%2D47h1600q66%200%20113%2047t47%20113z%22%2F%3E%3C%2Fsvg%3E");background-size:18px}.snippet-editor__view-icon-desktop:focus,.snippet-editor__view-icon-desktop:hover{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%231074a8%22%20d%3D%22M1728%20992v%2D832q0%2D13%2D9%2E5%2D22%2E5t%2D22%2E5%2D9%2E5h%2D1600q%2D13%200%2D22%2E5%209%2E5t%2D9%2E5%2022%2E5v832q0%2013%209%2E5%2022%2E5t22%2E5%209%2E5h1600q13%200%2022%2E5%2D9%2E5t9%2E5%2D22%2E5zm128%2D832v1088q0%2066%2D47%20113t%2D113%2047h%2D544q0%2037%2016%2077%2E5t32%2071%2016%2043%2E5q0%2026%2D19%2045t%2D45%2019h%2D512q%2D26%200%2D45%2D19t%2D19%2D45q0%2D14%2016%2D44t32%2D70%2016%2D78h%2D544q%2D66%200%2D113%2D47t%2D47%2D113v%2D1088q0%2D66%2047%2D113t113%2D47h1600q66%200%20113%2047t47%20113z%22%2F%3E%3C%2Fsvg%3E")}.snippet-editor__view-icon-mobile{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M976%201408q0%2D33%2D23%2E5%2D56%2E5t%2D56%2E5%2D23%2E5%2D56%2E5%2023%2E5%2D23%2E5%2056%2E5%2023%2E5%2056%2E5%2056%2E5%2023%2E5%2056%2E5%2D23%2E5%2023%2E5%2D56%2E5zm208%2D160v%2D704q0%2D13%2D9%2E5%2D22%2E5t%2D22%2E5%2D9%2E5h%2D512q%2D13%200%2D22%2E5%209%2E5t%2D9%2E5%2022%2E5v704q0%2013%209%2E5%2022%2E5t22%2E5%209%2E5h512q13%200%2022%2E5%2D9%2E5t9%2E5%2D22%2E5zm%2D192%2D848q0%2D16%2D16%2D16h%2D160q%2D16%200%2D16%2016t16%2016h160q16%200%2016%2D16zm288%2D16v1024q0%2052%2D38%2090t%2D90%2038h%2D512q%2D52%200%2D90%2D38t%2D38%2D90v%2D1024q0%2D52%2038%2D90t90%2D38h512q52%200%2090%2038t38%2090z%22%2F%3E%3C%2Fsvg%3E");background-size:22px}.snippet-editor__view-icon-mobile:focus,.snippet-editor__view-icon-mobile:hover{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%231074a8%22%20d%3D%22M976%201408q0%2D33%2D23%2E5%2D56%2E5t%2D56%2E5%2D23%2E5%2D56%2E5%2023%2E5%2D23%2E5%2056%2E5%2023%2E5%2056%2E5%2056%2E5%2023%2E5%2056%2E5%2D23%2E5%2023%2E5%2D56%2E5zm208%2D160v%2D704q0%2D13%2D9%2E5%2D22%2E5t%2D22%2E5%2D9%2E5h%2D512q%2D13%200%2D22%2E5%209%2E5t%2D9%2E5%2022%2E5v704q0%2013%209%2E5%2022%2E5t22%2E5%209%2E5h512q13%200%2022%2E5%2D9%2E5t9%2E5%2D22%2E5zm%2D192%2D848q0%2D16%2D16%2D16h%2D160q%2D16%200%2D16%2016t16%2016h160q16%200%2016%2D16zm288%2D16v1024q0%2052%2D38%2090t%2D90%2038h%2D512q%2D52%200%2D90%2D38t%2D38%2D90v%2D1024q0%2D52%2038%2D90t90%2D38h512q52%200%2090%2038t38%2090z%22%2F%3E%3C%2Fsvg%3E")}.snippet-editor__view--desktop{overflow:auto;width:640px;max-width:100%;padding:0 20px}.snippet-editor__view .snippet_container__title{width:600px;white-space:nowrap}.snippet-editor__view .snippet_container__title .title{display:inline-block;overflow:hidden;max-width:600px;vertical-align:top;text-overflow:ellipsis}.snippet-editor__view .snippet_container__title .title#snippet_sitename{display:inline}.snippet-editor__view .snippet_container__url{width:600px;line-height:1;white-space:nowrap}.snippet-editor__view .snippet_container__url .urlFull{display:inline-block;overflow:hidden;max-width:586px;font-size:14px;line-height:16px;vertical-align:top;text-overflow:ellipsis}.snippet-editor__view .snippet_container .down_arrow{display:inline-block;margin-top:6px;margin-right:6px;border-top:5px solid #006621;border-left:4px solid transparent;border-right:4px solid transparent;vertical-align:top}.snippet-editor__view .snippet_container__meta{width:600px}.snippet-editor__view--mobile{margin:0 20px 10px;padding:11px 0;border-bottom:1px hidden #fff;border-radius:2px;box-shadow:0 1px 2px rgba(0,0,0,.2)}.snippet-editor__view--mobile .snippet_container{display:block;line-height:20px}.snippet-editor__view--mobile .snippet_container__meta,.snippet-editor__view--mobile .snippet_container__title,.snippet-editor__view--mobile .snippet_container__url{box-sizing:border-box;width:100%}.snippet-editor__view--mobile .snippet_container__title{overflow:visible;padding:0 16px;white-space:normal;word-wrap:break-word}.snippet-editor__view--mobile .snippet_container__title .title{font-size:16px;line-height:20px}.snippet-editor__view--mobile .snippet_container__url{margin-bottom:9px;padding:0 16px 9px;border-bottom:1px solid #ebebeb}.snippet-editor__view--mobile .snippet_container__url .urlFull{max-width:100%;font-size:14px;line-height:20px}.snippet-editor__view--mobile .snippet_container .down_arrow{display:none}.snippet-editor__view--mobile .snippet_container__meta{padding:0 16px;font-size:14px;line-height:20px}.snippet-editor__view--mobile .snippet_container .desc{font-size:14px;line-height:20px}.snippet-editor__is-scrollable-hintwrapper{display:none;margin:1em 0 5px;text-align:center}.snippet-editor__view--desktop.snippet-editor__view--desktop-has-scroll+.snippet-editor__is-scrollable-hintwrapper{display:block}.snippet-editor__is-scrollable-hint{display:inline-block}.snippet-editor__is-scrollable-hint:before{display:inline-block;margin-left:10px;font-size:20px;line-height:inherit;vertical-align:text-top;content:"\21c4"}.snippet-editor__container{position:relative;cursor:pointer}.snippet-editor__container.editable-preview__container--no-caret{cursor:auto}.snippet-editor__heading{margin:0 0 15px;padding:8px 20px;color:#555;font-family:"Open Sans",sans-serif;font-size:.9rem;font-weight:300}.snippet-editor__heading-editor{border-top:1px solid #f7f7f7}.snippet-editor__heading-icon{padding-right:45px;background-repeat:no-repeat;background-position:right 20px top .6em;background-size:16px}.snippet-editor__container--focus:before,.snippet-editor__container--focus:hover:before,.snippet-editor__container:hover:before{position:absolute;right:-22px;width:24px;height:24px;background-size:25px;content:"";display:block;top:-3px}.snippet-editor__heading-icon-eye{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1664%20960q%2D152%2D236%2D381%2D353%2061%20104%2061%20225%200%20185%2D131%2E5%20316%2E5t%2D316%2E5%20131%2E5%2D316%2E5%2D131%2E5%2D131%2E5%2D316%2E5q0%2D121%2061%2D225%2D229%20117%2D381%20353%20133%20205%20333%2E5%20326%2E5t434%2E5%20121%2E5%20434%2E5%2D121%2E5%20333%2E5%2D326%2E5zm%2D720%2D384q0%2D20%2D14%2D34t%2D34%2D14q%2D125%200%2D214%2E5%2089%2E5t%2D89%2E5%20214%2E5q0%2020%2014%2034t34%2014%2034%2D14%2014%2D34q0%2D86%2061%2D147t147%2D61q20%200%2034%2D14t14%2D34zm848%20384q0%2034%2D20%2069%2D140%20230%2D376%2E5%20368%2E5t%2D499%2E5%20138%2E5%2D499%2E5%2D139%2D376%2E5%2D368q%2D20%2D35%2D20%2D69t20%2D69q140%2D229%20376%2E5%2D368t499%2E5%2D139%20499%2E5%20139%20376%2E5%20368q20%2035%2020%2069z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__container:hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23bfbfbf%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__container--focus:before,.snippet-editor__container--focus:hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__preview{max-width:640px;padding:0 0 15px}.snippet-editor__preview #help-yoast-snippetpreview{padding:0 20px}.snippet-editor__button{padding:8px 10px;border:1px solid #dbdbdb;border-radius:4px;color:#555;background:#f7f7f7;font-size:.8rem;line-height:15px;cursor:pointer}.snippet-editor__edit-button{display:inline-block;box-sizing:border-box;margin-top:10px;padding-right:32px;background:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M491%201536l91%2D91%2D235%2D235%2D91%2091v107h128v128h107zm523%2D928q0%2D22%2D22%2D22%2D10%200%2D17%207l%2D542%20542q%2D7%207%2D7%2017%200%2022%2022%2022%2010%200%2017%2D7l542%2D542q7%2D7%207%2D17zm%2D54%2D192l416%20416%2D832%20832h%2D416v%2D416zm683%2096q0%2053%2D37%2090l%2D166%20166%2D416%2D416%20166%2D165q36%2D38%2090%2D38%2053%200%2091%2038l235%20234q37%2039%2037%2091z%22%20%2F%3E%3C%2Fsvg%3E") right 8px top 50% no-repeat #f7f7f7;background-size:16px}.snippet-editor__form{padding:20px}.snippet-editor__label{display:block;position:relative;width:100%;margin-top:1em}.snippet-editor__label--focus:before,.snippet-editor__label--hover:before{right:-22px;width:24px;height:24px;background-size:25px;display:block;position:absolute;content:""}.snippet-editor__label:first-child{margin-top:0}.snippet-editor__label--hover:before{top:-3px;top:20px;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23bfbfbf%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__label--focus:before{top:-3px;top:20px;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%231074a8%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__input{display:block;box-sizing:border-box;width:100%;max-width:100%;margin-top:5px;border:1px solid #bfbfbf}.snippet-editor__input:focus{border:1px solid #1074a8;outline:0}.rtl .snippet-editor__container:hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23bfbfbf%22%20d%3D%22M1216%20448v896q0%2026%2D19%2045t%2D45%2019%2D45%2D19l%2D448%2D448q%2D19%2D19%2D19%2D45t19%2D45l448%2D448q19%2D19%2045%2D19t45%2019%2019%2045z%22%2F%3E%3C%2Fsvg%3E")}.rtl .snippet-editor__container--focus:before,.rtl .snippet-editor__container--focus:hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1216%20448v896q0%2026%2D19%2045t%2D45%2019%2D45%2D19l%2D448%2D448q%2D19%2D19%2D19%2D45t19%2D45l448%2D448q19%2D19%2045%2D19t45%2019%2019%2045z%22%2F%3E%3C%2Fsvg%3E")}.rtl .snippet-editor__label--hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23bfbfbf%22%20d%3D%22M1216%20448v896q0%2026%2D19%2045t%2D45%2019%2D45%2D19l%2D448%2D448q%2D19%2D19%2D19%2D45t19%2D45l448%2D448q19%2D19%2045%2D19t45%2019%2019%2045z%22%2F%3E%3C%2Fsvg%3E")}.rtl .snippet-editor__label--focus:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%231074a8%22%20d%3D%22M1216%20448v896q0%2026%2D19%2045t%2D45%2019%2D45%2D19l%2D448%2D448q%2D19%2D19%2D19%2D45t19%2D45l448%2D448q19%2D19%2045%2D19t45%2019%2019%2045z%22%2F%3E%3C%2Fsvg%3E")}.snippet-editor__meta-description{height:70px}.snippet-editor__submit{margin-top:1em}#snippet_cite{min-width:20px}#meta_container{clear:both;min-height:20px}.snippet_container .title{margin:0;color:#1e0fbe;font-size:18px;font-weight:400;line-height:1.2;text-decoration:none}.snippet-editor__date,.snippet_container .desc{font-size:13px;line-height:1.4}.snippet_container .url{color:#006621;font-style:normal}.snippet_container .url strong{font-weight:700}.snippet_container .desc-default{color:#545454}.snippet_container .desc-default strong{color:#6a6a6a;font-weight:700}.snippet_container .desc-render{color:#777}.snippet_container .tooLong{color:red!important}.snippet-editor__field--invalid{color:red}.snippet-editor__progress{display:block;box-sizing:border-box;width:100%;height:8px;margin-top:5px;border:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.snippet-editor__progress::-webkit-progress-bar{height:8px;border:1px solid #bfbfbf;background-color:#f7f7f7}.snippet-editor__progress--fallback{height:8px;border:1px solid #bfbfbf;background-color:#f7f7f7}.snippet-editor__progress-bar{width:0;max-width:100%;height:100%}.snippet-editor__date{color:grey}.snippet-editor--hidden{display:none}.yoast-measurement-elements-holder{position:absolute;right:-9999em}.snippet-editor__progress--bad[value]{color:#dc3232}.snippet-editor__progress--bad[value]::-webkit-progress-value{background-color:#dc3232;transition:width 250ms}.snippet-editor__progress--bad[value]::-moz-progress-bar{background-color:#dc3232}.snippet-editor__progress--bad[value] .snippet-editor__progress-bar{background-color:#dc3232}.snippet-editor__progress--ok[value]{color:#ee7c1b}.snippet-editor__progress--ok[value]::-webkit-progress-value{background-color:#ee7c1b;transition:width 250ms}.snippet-editor__progress--ok[value]::-moz-progress-bar{background-color:#ee7c1b}.snippet-editor__progress--ok[value] .snippet-editor__progress-bar{background-color:#ee7c1b}.snippet-editor__progress--good[value]{color:#7ad03a}.snippet-editor__progress--good[value]::-webkit-progress-value{background-color:#7ad03a;transition:width 250ms}.snippet-editor__progress--good[value]::-moz-progress-bar{background-color:#7ad03a}.snippet-editor__progress--good[value] .snippet-editor__progress-bar{background-color:#7ad03a}.wpseoanalysis{padding-left:0}.wpseo-score-text{float:right;width:86%;width:calc(100% - 56px)}.assessment-results .wpseo-score-icon{float:right;width:12px;height:12px;margin:3px 0 0 10px;border-radius:50%;background:#888}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#999}.wpseo-score-icon.noindex{background-color:#1e8cbe}li.score{margin-bottom:6px;list-style-type:none!important}li.score:after{display:table;clear:both;content:""}.screen-reader-text{overflow:hidden;clip:rect(1px,1px,1px,1px);position:absolute!important;width:1px;height:1px}.assessment-results{clear:both}.assessment-results__mark.icon-eye-active,.assessment-results__mark.icon-eye-disabled,.assessment-results__mark.icon-eye-inactive{float:right;width:28px;height:28px;margin:-5px 3px 0;padding:4px;border:0;border-radius:100%;outline:0;background:center no-repeat;background-size:16px;cursor:pointer}.assessment-results__mark.icon-eye-inactive{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1664%20960q%2D152%2D236%2D381%2D353%2061%20104%2061%20225%200%20185%2D131%2E5%20316%2E5t%2D316%2E5%20131%2E5%2D316%2E5%2D131%2E5%2D131%2E5%2D316%2E5q0%2D121%2061%2D225%2D229%20117%2D381%20353%20133%20205%20333%2E5%20326%2E5t434%2E5%20121%2E5%20434%2E5%2D121%2E5%20333%2E5%2D326%2E5zm%2D720%2D384q0%2D20%2D14%2D34t%2D34%2D14q%2D125%200%2D214%2E5%2089%2E5t%2D89%2E5%20214%2E5q0%2020%2014%2034t34%2014%2034%2D14%2014%2D34q0%2D86%2061%2D147t147%2D61q20%200%2034%2D14t14%2D34zm848%20384q0%2034%2D20%2069%2D140%20230%2D376%2E5%20368%2E5t%2D499%2E5%20138%2E5%2D499%2E5%2D139%2D376%2E5%2D368q%2D20%2D35%2D20%2D69t20%2D69q140%2D229%20376%2E5%2D368t499%2E5%2D139%20499%2E5%20139%20376%2E5%20368q20%2035%2020%2069z%22%20%2F%3E%3C%2Fsvg%3E")}.assessment-results__mark.icon-eye-active{background-color:#a4286a;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23ffffff%22%20d%3D%22M1664%20960q%2D152%2D236%2D381%2D353%2061%20104%2061%20225%200%20185%2D131%2E5%20316%2E5t%2D316%2E5%20131%2E5%2D316%2E5%2D131%2E5%2D131%2E5%2D316%2E5q0%2D121%2061%2D225%2D229%20117%2D381%20353%20133%20205%20333%2E5%20326%2E5t434%2E5%20121%2E5%20434%2E5%2D121%2E5%20333%2E5%2D326%2E5zm%2D720%2D384q0%2D20%2D14%2D34t%2D34%2D14q%2D125%200%2D214%2E5%2089%2E5t%2D89%2E5%20214%2E5q0%2020%2014%2034t34%2014%2034%2D14%2014%2D34q0%2D86%2061%2D147t147%2D61q20%200%2034%2D14t14%2D34zm848%20384q0%2034%2D20%2069%2D140%20230%2D376%2E5%20368%2E5t%2D499%2E5%20138%2E5%2D499%2E5%2D139%2D376%2E5%2D368q%2D20%2D35%2D20%2D69t20%2D69q140%2D229%20376%2E5%2D368t499%2E5%2D139%20499%2E5%20139%20376%2E5%20368q20%2035%2020%2069z%22%20%2F%3E%3C%2Fsvg%3E")}.assessment-results__mark.icon-eye-disabled{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23e6e6e6%22%20d%3D%22M1664%20960q%2D152%2D236%2D381%2D353%2061%20104%2061%20225%200%20185%2D131%2E5%20316%2E5t%2D316%2E5%20131%2E5%2D316%2E5%2D131%2E5%2D131%2E5%2D316%2E5q0%2D121%2061%2D225%2D229%20117%2D381%20353%20133%20205%20333%2E5%20326%2E5t434%2E5%20121%2E5%20434%2E5%2D121%2E5%20333%2E5%2D326%2E5zm%2D720%2D384q0%2D20%2D14%2D34t%2D34%2D14q%2D125%200%2D214%2E5%2089%2E5t%2D89%2E5%20214%2E5q0%2020%2014%2034t34%2014%2034%2D14%2014%2D34q0%2D86%2061%2D147t147%2D61q20%200%2034%2D14t14%2D34zm848%20384q0%2034%2D20%2069%2D140%20230%2D376%2E5%20368%2E5t%2D499%2E5%20138%2E5%2D499%2E5%2D139%2D376%2E5%2D368q%2D20%2D35%2D20%2D69t20%2D69q140%2D229%20376%2E5%2D368t499%2E5%2D139%20499%2E5%20139%20376%2E5%20368q20%2035%2020%2069z%22%20%2F%3E%3C%2Fsvg%3E")}.assessment-results__mark-container{display:inline-block;float:left;width:33px;min-height:1px}.YoastSEO_msg .left,.YoastSEO_msg .right{display:none}@keyframes animatedBackground{from{background-position:100% 0}to{background-position:0 0}}.YoastSEO_msg .bufferbar{display:block;width:100%;height:12px;margin:10px 0;border:1px solid #dfdfdf;background-image:linear-gradient(to right,#fff,#0063ff,#fff,#0063ff);background-position:100% 0;background-size:300% 100%;animation:animatedBackground 5s linear infinite}.yoast-tooltip{position:relative}.yoast-tooltip::after,.yoast-tooltip::before{display:none;position:absolute;opacity:0;pointer-events:none}button.yoast-tooltip{overflow:visible}.yoast-tooltip::after{z-index:1000000;padding:5px 8px;border-radius:3px;color:#fff;background:rgba(0,0,0,.8);text-shadow:none;font:normal normal 11px/1.5 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";text-align:center;white-space:pre;text-decoration:none;letter-spacing:normal;text-transform:none;word-wrap:break-word;content:attr(aria-label);-webkit-font-smoothing:subpixel-antialiased}.yoast-tooltip-alt::after{content:attr(data-label)}.yoast-tooltip::before{z-index:1000001;width:0;height:0;border:5px solid transparent;color:rgba(0,0,0,.8);content:"\00a0"}@keyframes yoast-tooltip-appear{from{opacity:0}to{opacity:1}}.yoast-tooltip:active::after,.yoast-tooltip:active::before,.yoast-tooltip:focus::after,.yoast-tooltip:focus::before,.yoast-tooltip:hover::after,.yoast-tooltip:hover::before{display:inline-block;text-decoration:none;animation-name:yoast-tooltip-appear;animation-duration:.1s;animation-timing-function:ease-in;animation-delay:.4s;animation-fill-mode:forwards}.yoast-tooltip-no-delay:active::after,.yoast-tooltip-no-delay:active::before,.yoast-tooltip-no-delay:focus::after,.yoast-tooltip-no-delay:focus::before,.yoast-tooltip-no-delay:hover::after,.yoast-tooltip-no-delay:hover::before{opacity:1;animation:none}.yoast-tooltip-multiline:active::after,.yoast-tooltip-multiline:focus::after,.yoast-tooltip-multiline:hover::after{display:table-cell}.yoast-tooltip-s::after,.yoast-tooltip-se::after,.yoast-tooltip-sw::after{top:100%;left:50%;margin-top:5px}.yoast-tooltip-s::before,.yoast-tooltip-se::before,.yoast-tooltip-sw::before{top:auto;left:50%;bottom:-5px;margin-left:-5px;border-bottom-color:rgba(0,0,0,.8)}.yoast-tooltip-se::after{left:auto;right:50%;margin-right:-15px}.yoast-tooltip-sw::after{margin-left:-15px}.yoast-tooltip-n::after,.yoast-tooltip-ne::after,.yoast-tooltip-nw::after{left:50%;bottom:100%;margin-bottom:5px}.yoast-tooltip-n::before,.yoast-tooltip-ne::before,.yoast-tooltip-nw::before{top:-5px;left:50%;bottom:auto;margin-left:-5px;border-top-color:rgba(0,0,0,.8)}.yoast-tooltip-ne::after{left:auto;right:50%;margin-right:-15px}.yoast-tooltip-nw::after{margin-left:-15px}.yoast-tooltip-n::after,.yoast-tooltip-s::after{-ms-transform:translateX(-50%);transform:translateX(-50%)}.yoast-tooltip-w::after{left:100%;bottom:50%;margin-left:5px;-ms-transform:translateY(50%);transform:translateY(50%)}.yoast-tooltip-w::before{top:50%;bottom:50%;right:-5px;margin-top:-5px;border-right-color:rgba(0,0,0,.8)}.yoast-tooltip-e::after{bottom:50%;right:100%;margin-right:5px;-ms-transform:translateY(50%);transform:translateY(50%)}.yoast-tooltip-e::before{top:50%;left:-5px;bottom:50%;margin-top:-5px;border-left-color:rgba(0,0,0,.8)}.yoast-tooltip-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;border-collapse:separate;white-space:pre-line;word-wrap:normal;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n::after,.yoast-tooltip-multiline.yoast-tooltip-s::after{left:auto;right:50%;-ms-transform:translateX(50%);transform:translateX(50%)}.yoast-tooltip-multiline.yoast-tooltip-e::after,.yoast-tooltip-multiline.yoast-tooltip-w::after{left:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline::after{width:250px}}.yoast-tooltip-sticky::after,.yoast-tooltip-sticky::before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline::after{display:table-cell}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w::after{margin-left:4.5px}}.wpseo-tab-video-container{margin-bottom:20px;border-bottom:1px solid #a4286a}.yoast-help-center-open .wpseo-tab-video-container{border-bottom:none}.postbox .wpseo-tab-video-container{margin-left:-12px;margin-right:-12px}.wpseo-tab-video-container__handle{width:100%;margin:0;padding:10px 12px;border:none;outline:0;color:#a4286a;background:0 0;line-height:19px;text-align:right;cursor:pointer}.wpseo-tab-video-container__handle:focus,.wpseo-tab-video-container__handle:hover{text-decoration:underline}.wpseo-tab-video-container__handle .toggle__arrow,.wpseo-tab-video-slideout a.button,.wpseo-tab-video-slideout a.button-primary{text-decoration:none}.wpseo-tab-video-container__handle .dashicons-before:before{margin-left:5px}.wpseo-tab-video-container .wpseo-premium-popup{max-width:770px}.wpseo-tab-video-slideout{display:-ms-flexbox;display:flex;padding:2em 0;background-color:#a4286a;box-shadow:inset 0 10px 10px -5px rgba(123,30,80,.5),inset 0 -10px 10px -5px rgba(123,30,80,.5)}.wpseo-admin-page .wpseo-tab-video-slideout{border:1px solid #e5e5e5;border-top:0}.wpseo-tab-video-slideout.hidden{display:none}.wpseo-tab-video-slideout .yoast-help-center-tabs{padding:0 0 1em;color:#fff;background-color:#a4286a;-ms-flex:0 0 164px;flex:0 0 164px}.wpseo-tab-video-slideout .yoast-help-center-tabs ul{margin:0}.wpseo-tab-video-slideout .yoast-help-center-tabs-wrap{max-width:916px;padding:0;-ms-flex:0 1 916px;flex:0 1 916px}.wpseo-tab-video-slideout .yoast-help-tab-content{display:none;padding:0 12px;color:#fff;font-weight:300}.wpseo-tab-video-slideout .yoast-help-tab-content.active{display:block}.wpseo-tab-video-slideout .yoast-help-tab-content.active.yoast-help-tab-content-video{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.wpseo-tab-video-slideout .yoast-help-tab-content li{margin:2px 10px;list-style:disc inside}.wpseo-tab-video-slideout .wpseo-tab-video__panel--video{max-width:560px;margin-left:12px;padding-bottom:12px;-ms-flex:0 1 560px;flex:0 1 560px}.wpseo-tab-video-slideout .wpseo-tab-video__panel--video iframe{vertical-align:middle}.wpseo-tab-video-slideout .wpseo-tab-video__panel--text{min-width:220px;max-width:560px;-ms-flex:1 1 220px;flex:1 1 220px}.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea{margin:0 0 12px;padding:15px 15px 5px;border:1px solid #fff;border-radius:30px 30px 30px 0;color:#fff;background-color:#a4286a}.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea a,.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea a:focus,.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea a:hover{color:#fff;font-weight:500}.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea h3{margin:0}.wpseo-tab-video-slideout a{color:#fff}#wpseo_meta .wpseo-tab-video-slideout h2,.wpseo-tab-video-slideout h1,.wpseo-tab-video-slideout h2,.wpseo-tab-video-slideout h3,.wpseo-tab-video-slideout h4,.wpseo-tab-video-slideout h5,.wpseo-tab-video-slideout h6{margin-top:.5em;margin-bottom:1em;padding:0;color:#fff;font-size:1.3em;font-weight:400;line-height:1.4}.wpseo-help-center-item{display:inline}.wpseo-help-center-item a{display:block;padding:10px 12px;color:#fff;line-height:20px;text-decoration:none}.wpseo-help-center-item a:focus,.wpseo-help-center-item a:hover{text-decoration:underline}.wpseo-help-center-item a.dashicons-before:before{margin-left:3px;text-decoration:none}.wpseo-help-center-item.active a{color:#a4286a;background-color:#fff}@media screen and (max-width:1280px){.columns-2 .wpseo-tab-video-slideout .wpseo-tab-video__panel--video{margin-left:0}}@media screen and (max-width:1024px){.wpseo-tab-video-slideout .wpseo-tab-video__panel--video{margin-left:0;flex-basis:100%;-ms-flex-preferred-size:100%}.columns-2 .wpseo-tab-video-slideout{display:block}.columns-2 .wpseo-tab-video-slideout.hidden{display:none}.columns-2 .wpseo-tab-video-slideout .yoast-help-center-tabs{width:auto;padding-left:12px;padding-right:12px}.columns-2 .wpseo-tab-video-slideout .yoast-help-tab-content.active.yoast-help-tab-content-video{display:block;padding:0}.columns-2 .wpseo-tab-video-slideout .wpseo-tab-video__panel--video{max-width:none}.columns-2 .wpseo-tab-video-slideout .wpseo-tab-video__panel--text{max-width:none;padding:0 12px}.columns-2 .wpseo-help-center-item a{display:inline-block;margin:0 0 8px 4px;border:1px solid rgba(255,255,255,.5)}}@media screen and (max-width:782px){.wpseo-tab-video-slideout{display:block}.wpseo-tab-video-slideout .yoast-help-center-tabs{width:auto;padding-left:12px;padding-right:12px}.wpseo-tab-video-slideout .yoast-help-tab-content.active.yoast-help-tab-content-video{display:block;padding:0}.wpseo-tab-video-slideout .wpseo-tab-video__panel--video{max-width:none}.wpseo-tab-video-slideout .wpseo-tab-video__panel--text{max-width:none;padding:0 12px}.wpseo-help-center-item a{display:inline-block;margin:0 0 8px 4px;border:1px solid rgba(255,255,255,.5)}.wpseo-premium-popup-icon{display:none}}.yoast-section{position:relative;padding:0 20px 15px;background-color:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2)}.yoast-section__heading{margin:0 -20px 15px;padding:8px 20px;color:#555;font-family:"Open Sans",sans-serif;font-size:.9rem;font-weight:300}.wpseotab label,.wpseotab legend{font-weight:600}.yoast-section__heading-icon{padding-right:45px;background-repeat:no-repeat;background-position:right 20px top .6em;background-size:16px}.yoast-section__heading-icon-file-text-o{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20file%3D%22%23555%22%20d%3D%22M1596%20380q28%2028%2048%2076t20%2088v1152q0%2040%2D28%2068t%2D68%2028h%2D1344q%2D40%200%2D68%2D28t%2D28%2D68v%2D1600q0%2D40%2028%2D68t68%2D28h896q40%200%2088%2020t76%2048zm%2D444%2D244v376h376q%2D10%2D29%2D22%2D41l%2D313%2D313q%2D12%2D12%2D41%2D22zm384%201528v%2D1024h%2D416q%2D40%200%2D68%2D28t%2D28%2D68v%2D416h%2D768v1536h1280zm%2D1024%2D864q0%2D14%209%2D23t23%2D9h704q14%200%2023%209t9%2023v64q0%2014%2D9%2023t%2D23%209h%2D704q%2D14%200%2D23%2D9t%2D9%2D23v%2D64zm736%20224q14%200%2023%209t9%2023v64q0%2014%2D9%2023t%2D23%209h%2D704q%2D14%200%2D23%2D9t%2D9%2D23v%2D64q0%2D14%209%2D23t23%2D9h704zm0%20256q14%200%2023%209t9%2023v64q0%2014%2D9%2023t%2D23%209h%2D704q%2D14%200%2D23%2D9t%2D9%2D23v%2D64q0%2D14%209%2D23t23%2D9h704z%22%2F%3E%3C%2Fsvg%3E")}.yoast-section,.yoast-section *,.yoast-section :after,.yoast-section :before,.yoast-section:after,.yoast-section:before{box-sizing:border-box}#edittag>#wp-description-wrap{display:none}#wp-description-wrap .wp-editor-area{border:0}.term-description-wrap td>textarea#description{min-height:530px}ul.wpseo-metabox-tabs{display:none;margin-top:6px;margin-bottom:0}ul.wpseo-metabox-tabs:after{display:table;clear:both;content:""}.wpseo-metabox-tabs-div ul{list-style:none}ul.wpseo-metabox-tabs li.active{background-color:#fdfdfd}.wpseo-meta-section{display:none;width:100%;max-width:calc(100% - 50px);vertical-align:top}.wpseo-meta-section.active{display:inline-block}.wpseo-metabox-sidebar{float:right;width:50px;padding:0;background-color:#fff}.wpseo-metabox-sidebar ul{margin:0}.wpseo-metabox-sidebar li{display:inline-block;margin-bottom:0;padding:5px}.wpseo-metabox-sidebar a{display:inline-block;width:35px;height:35px;font-size:20px;line-height:30px;text-decoration:none}.wpseo-metabox-sidebar li span{margin:3px -5px 0 0;padding:0 5px 0 2px;border:0 solid transparent;border-right-width:3px;border-radius:3px}.wpseo-metabox-sidebar li span.wpseo-buy-premium{color:#a4286a}.wpseo-metabox-sidebar li span.wpseo-buy-premium:hover{color:#832055}.wpseo-metabox-sidebar li.active span{border-color:#333;color:#333}.wpseo-metabox-sidebar li.active span.wpseo-buy-premium{border-color:#a4286a;color:#a4286a}.wpseo-metabox-sidebar li.active span.wpseo-buy-premium:hover{border-color:#832055;color:#832055}ul.wpseo-metabox-tabs li{float:right;margin-left:5px;margin-bottom:-1px;padding:0;border:1px solid #dfdfdf;border-bottom:0 none}ul.wpseo-metabox-tabs li .wpseo-keyword{display:inline-block;overflow:hidden;max-width:8em;max-width:8rem;vertical-align:top;white-space:nowrap;text-overflow:ellipsis}.wpseotab{display:none;padding:20px 35px;border:1px solid #ddd;background-color:#fdfdfd}.wpseotab .wpseo-cornerstone-checkbox{margin-left:.5em}.wpseotab.content{padding:20px 15px}.wpseotab.active{display:block}#wpseofocuskeyword,#wpseometakeywords,#wpseosnippet{margin-bottom:2em}.wpseo-metabox-tabs .wpseo_tablink{display:inline-block;padding:5px 12px 6px;vertical-align:top;text-decoration:none}.wpseo-metabox-tabs .wpseo_content_tab a,.wpseo-metabox-tabs .wpseo_content_tab+.wpseo_keyword_tab a{padding-left:12px}.wpseo-metabox-tabs .wpseo-score-icon{margin-right:0}#wpseo-meta-section-social .wpseo-metabox-tabs .wpseo_tablink{padding:5px 7px}.wpseo-metabox-tabs .wpseo_tablink .dashicons{width:16px;height:16px;font-size:16px}.wpseo-metabox-sidebar .dashicons{width:30px;height:30px;font-size:30px}.wpseo-metabox-tabs-div div.wpseo-tabs-panel{overflow:auto;padding:.5em .9em;border:1px solid}#wpseo_meta .inside{margin:0}#wpseo_meta .postbox .inside .wpseotab{font-size:13px!important}.wpseotab .select2-container,.wpseotab input,.wpseotab label,.wpseotab p.error-message,.wpseotab textarea,.yoast-metabox__description{max-width:600px}.wpseotab fieldset{padding-top:5px}.wpseotab label{display:block}.wpseotab input[type=radio]+label,.wpseotab input[type=checkbox]+label{display:inline-block;font-weight:400}.wpseotab fieldset,.wpseotab label{margin-top:2em;margin-bottom:.5em}.wpseotab input[type=checkbox],.wpseotab input[type=checkbox]+label{margin-top:2em;margin-bottom:0;font-size:1em}.wpseotab fieldset:first-child,.wpseotab input[type=checkbox]:first-child,.wpseotab input[type=checkbox]:first-child+label,.wpseotab label:first-child{margin-top:10px}.wpseotab input[type=radio]{margin-top:0}.wpseotab input[type=radio]+label{margin:0 0 0 1em}.wpseotab p.error-message,.yoast-metabox__description{margin:.5em 0}.wpseotab #yoast_wpseo_focuskw_text_input,.wpseotab #yoast_wpseo_metakeywords,.wpseotab select[multiple]{margin-top:0}.wpseotab .wpseo_image_upload_button{margin-right:3px}.good,.warn,.wrong{font-weight:600}.good{color:green}.warn{color:maroon}.wrong{color:#dc3232}#current_seo_title span{padding:2px 5px;background-color:#ffffe0}#focuskwresults ul{margin:0}#focuskwresults li,#focuskwresults p{font-size:13px}#focuskwresults li{margin:0 20px 0 0;list-style-type:disc}.wpseo_hidden{display:none}.wpseo_msg{margin:5px 0 10px;padding:0 5px;border:1px solid #e6db55;background-color:#ffffe0}ul.wpseo-metabox-tabs li.wpseo-tab-add-keyword{border:none}.wpseo-tab-add-keyword .wpseo-add-keyword.button{height:auto;margin-top:1px;padding:3px 6px;color:#000;background:0 0;font-size:12px;line-height:1;vertical-align:top;text-decoration:none;cursor:pointer}#wpseo-add-keyword-popup-title{margin:1em 0;font-size:1.3em}.snippet-editor__button.snippet-editor__edit-button:focus{border-color:#5b9dd9;outline:0;color:#23282d;background-color:#fafafa;box-shadow:0 0 3px rgba(0,115,170,.8)}.yoast_help.yoast-help-button{overflow:visible;position:relative;width:20px;height:20px;margin:0;padding:0;border:0;outline:0;color:#72777c;background:0 0;box-shadow:none;vertical-align:top;cursor:pointer}.wpseotab .yoast_help.yoast-help-button{float:left}.wpseotab.content .yoast_help.yoast-help-button{margin-top:-47px}.wpseo-admin-page .yoast_help.yoast-help-button{margin-left:6px}.yoast_help.yoast-help-button:before{position:absolute;top:0;right:0;padding:4px;content:"\f223"}.yoast_help.yoast-help-button:focus,.yoast_help.yoast-help-button:hover{color:#0073aa}.assessment-results__mark:focus,.yoast_help.yoast-help-button:focus:before{border-radius:100%;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.yoast-help-panel{display:none;max-width:30em!important;padding:0 0 1em;font-weight:400;white-space:normal}.wpseo-admin-page .subsubsub li{display:inline;max-width:none}.yoast-seo-help-container{float:right;width:100%;max-width:none}.yoast-seo-help-container .yoast-help-panel{margin:.5em 0!important}.wpseo_content_wrapper p.search-box{margin:10px 0 5px}.wpseo-metabox-tabs .active a{color:#333}#wpseotab .ui-widget-content .ui-state-hover{border:1px solid #dfdfdf;color:#333;background:#f1f1f1}.yst-traffic-light-container{display:block;height:30px}.yst-traffic-light{width:19px;height:30px;margin:0 5px 0 0}.yst-traffic-light .traffic-light-color{display:none}.yst-traffic-light.bad .traffic-light-red,.yst-traffic-light.good .traffic-light-green,.yst-traffic-light.init .traffic-light-init,.yst-traffic-light.na .traffic-light-empty,.yst-traffic-light.ok .traffic-light-orange{display:inline}#wpseo-score{float:right;margin:0 -5px 0 5px}.yoast-seo-score .yoast-logo.svg{float:right;width:18px;height:18px;margin-left:5px;background:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23999%22%20d%3D%22M403%20218h691l%2D26%2072h%2D665q%2D110%200%2D188%2E5%2079t%2D78%2E5%20189v771q0%2095%2060%2E5%20169%2E5t153%2E5%2093%2E5q23%205%2098%205v72h%2D45q%2D140%200%2D239%2E5%2D100t%2D99%2E5%2D240v%2D771q0%2D140%2099%2E5%2D240t239%2E5%2D100zm851%2D218h247l%2D482%201294q%2D23%2061%2D40%2E5%20103%2E5t%2D45%2098%2D54%2093%2E5%2D64%2E5%2078%2E5%2D79%2E5%2065%2D95%2E5%2041%2D116%2018%2E5v%2D195q163%2D26%20220%2D182%2020%2D52%2020%2D105%200%2D54%2D20%2D106l%2D285%2D733h228l187%20585zm474%20558v1111h%2D795q37%2D55%2045%2D73h678v%2D1038q0%2D85%2D49%2E5%2D155t%2D129%2E5%2D99l25%2D67q101%2034%20163%2E5%20123%2E5t62%2E5%20197%2E5z%22%2F%3E%3C%2Fsvg%3E") no-repeat;background-size:18px}.yoast-seo-score .yoast-logo.svg.good{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%237ad03a%22%20d%3D%22M403%20218h691l%2D26%2072h%2D665q%2D110%200%2D188%2E5%2079t%2D78%2E5%20189v771q0%2095%2060%2E5%20169%2E5t153%2E5%2093%2E5q23%205%2098%205v72h%2D45q%2D140%200%2D239%2E5%2D100t%2D99%2E5%2D240v%2D771q0%2D140%2099%2E5%2D240t239%2E5%2D100zm851%2D218h247l%2D482%201294q%2D23%2061%2D40%2E5%20103%2E5t%2D45%2098%2D54%2093%2E5%2D64%2E5%2078%2E5%2D79%2E5%2065%2D95%2E5%2041%2D116%2018%2E5v%2D195q163%2D26%20220%2D182%2020%2D52%2020%2D105%200%2D54%2D20%2D106l%2D285%2D733h228l187%20585zm474%20558v1111h%2D795q37%2D55%2045%2D73h678v%2D1038q0%2D85%2D49%2E5%2D155t%2D129%2E5%2D99l25%2D67q101%2034%20163%2E5%20123%2E5t62%2E5%20197%2E5z%22%2F%3E%3C%2Fsvg%3E")}.yoast-seo-score .yoast-logo.svg.ok{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23ee7c1b%22%20d%3D%22M403%20218h691l%2D26%2072h%2D665q%2D110%200%2D188%2E5%2079t%2D78%2E5%20189v771q0%2095%2060%2E5%20169%2E5t153%2E5%2093%2E5q23%205%2098%205v72h%2D45q%2D140%200%2D239%2E5%2D100t%2D99%2E5%2D240v%2D771q0%2D140%2099%2E5%2D240t239%2E5%2D100zm851%2D218h247l%2D482%201294q%2D23%2061%2D40%2E5%20103%2E5t%2D45%2098%2D54%2093%2E5%2D64%2E5%2078%2E5%2D79%2E5%2065%2D95%2E5%2041%2D116%2018%2E5v%2D195q163%2D26%20220%2D182%2020%2D52%2020%2D105%200%2D54%2D20%2D106l%2D285%2D733h228l187%20585zm474%20558v1111h%2D795q37%2D55%2045%2D73h678v%2D1038q0%2D85%2D49%2E5%2D155t%2D129%2E5%2D99l25%2D67q101%2034%20163%2E5%20123%2E5t62%2E5%20197%2E5z%22%2F%3E%3C%2Fsvg%3E")}.yoast-seo-score .yoast-logo.svg.bad{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23dc3232%22%20d%3D%22M403%20218h691l%2D26%2072h%2D665q%2D110%200%2D188%2E5%2079t%2D78%2E5%20189v771q0%2095%2060%2E5%20169%2E5t153%2E5%2093%2E5q23%205%2098%205v72h%2D45q%2D140%200%2D239%2E5%2D100t%2D99%2E5%2D240v%2D771q0%2D140%2099%2E5%2D240t239%2E5%2D100zm851%2D218h247l%2D482%201294q%2D23%2061%2D40%2E5%20103%2E5t%2D45%2098%2D54%2093%2E5%2D64%2E5%2078%2E5%2D79%2E5%2065%2D95%2E5%2041%2D116%2018%2E5v%2D195q163%2D26%20220%2D182%2020%2D52%2020%2D105%200%2D54%2D20%2D106l%2D285%2D733h228l187%20585zm474%20558v1111h%2D795q37%2D55%2045%2D73h678v%2D1038q0%2D85%2D49%2E5%2D155t%2D129%2E5%2D99l25%2D67q101%2034%20163%2E5%20123%2E5t62%2E5%20197%2E5z%22%2F%3E%3C%2Fsvg%3E")}.yoast-seo-score .yoast-logo.svg.na{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23999%22%20d%3D%22M403%20218h691l%2D26%2072h%2D665q%2D110%200%2D188%2E5%2079t%2D78%2E5%20189v771q0%2095%2060%2E5%20169%2E5t153%2E5%2093%2E5q23%205%2098%205v72h%2D45q%2D140%200%2D239%2E5%2D100t%2D99%2E5%2D240v%2D771q0%2D140%2099%2E5%2D240t239%2E5%2D100zm851%2D218h247l%2D482%201294q%2D23%2061%2D40%2E5%20103%2E5t%2D45%2098%2D54%2093%2E5%2D64%2E5%2078%2E5%2D79%2E5%2065%2D95%2E5%2041%2D116%2018%2E5v%2D195q163%2D26%20220%2D182%2020%2D52%2020%2D105%200%2D54%2D20%2D106l%2D285%2D733h228l187%20585zm474%20558v1111h%2D795q37%2D55%2045%2D73h678v%2D1038q0%2D85%2D49%2E5%2D155t%2D129%2E5%2D99l25%2D67q101%2034%20163%2E5%20123%2E5t62%2E5%20197%2E5z%22%2F%3E%3C%2Fsvg%3E")}.yoast-seo-score .yoast-logo.svg.noindex{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%231e8cbe%22%20d%3D%22M403%20218h691l%2D26%2072h%2D665q%2D110%200%2D188%2E5%2079t%2D78%2E5%20189v771q0%2095%2060%2E5%20169%2E5t153%2E5%2093%2E5q23%205%2098%205v72h%2D45q%2D140%200%2D239%2E5%2D100t%2D99%2E5%2D240v%2D771q0%2D140%2099%2E5%2D240t239%2E5%2D100zm851%2D218h247l%2D482%201294q%2D23%2061%2D40%2E5%20103%2E5t%2D45%2098%2D54%2093%2E5%2D64%2E5%2078%2E5%2D79%2E5%2065%2D95%2E5%2041%2D116%2018%2E5v%2D195q163%2D26%20220%2D182%2020%2D52%2020%2D105%200%2D54%2D20%2D106l%2D285%2D733h228l187%20585zm474%20558v1111h%2D795q37%2D55%2045%2D73h678v%2D1038q0%2D85%2D49%2E5%2D155t%2D129%2E5%2D99l25%2D67q101%2034%20163%2E5%20123%2E5t62%2E5%20197%2E5z%22%2F%3E%3C%2Fsvg%3E")}.term-php .wpseo-taxonomy-metabox-postbox>h2{margin:0;padding:8px 12px;border-bottom:1px solid #eee;font-size:14px;line-height:1.4}.wpseo-buy-premium{padding-left:5px;color:#a4286a}.wpseo-metabox-go-to::after{position:static;top:auto;left:auto;width:auto;height:auto;border:none;content:" \00BB"}#wpseo-buy-premium-popup-button.button-buy-premium{border-color:#a4286a;color:#fff;background:#a4286a}.wpseo-metabox-buy-premium{position:absolute;top:0;left:12px;padding:10px 0}.wpseo-metabox-premium-description{margin-top:.5em}ul.wpseo-metabox-premium-advantages{padding-right:1.5em;list-style:disc}.wpseosnippet .yoast-section{width:auto;max-width:640px;padding:0}#TB_window #TB_ajaxContent p{margin:5px 0 0;padding:5px 0 0}#TB_window #TB_ajaxContent ul{margin:5px 0 10px}#TB_window #TB_ajaxContent li{margin:5px 0 0;list-style:none}#TB_window #TB_ajaxContent li::before{margin:0 0 0 10px;font-weight:700;content:"+"}.yoast-section__heading-icon-list{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555%22%20d%3D%22M384%201408q0%2080%2D56%20136t%2D136%2056%2D136%2D56%2D56%2D136%2056%2D136%20136%2D56%20136%2056%2056%20136zm0%2D512q0%2080%2D56%20136t%2D136%2056%2D136%2D56%2D56%2D136%2056%2D136%20136%2D56%20136%2056%2056%20136zm1408%20416v192q0%2013%2D9%2E5%2022%2E5t%2D22%2E5%209%2E5h%2D1216q%2D13%200%2D22%2E5%2D9%2E5t%2D9%2E5%2D22%2E5v%2D192q0%2D13%209%2E5%2D22%2E5t22%2E5%2D9%2E5h1216q13%200%2022%2E5%209%2E5t9%2E5%2022%2E5zm%2D1408%2D928q0%2080%2D56%20136t%2D136%2056%2D136%2D56%2D56%2D136%2056%2D136%20136%2D56%20136%2056%2056%20136zm1408%20416v192q0%2013%2D9%2E5%2022%2E5t%2D22%2E5%209%2E5h%2D1216q%2D13%200%2D22%2E5%2D9%2E5t%2D9%2E5%2D22%2E5v%2D192q0%2D13%209%2E5%2D22%2E5t22%2E5%2D9%2E5h1216q13%200%2022%2E5%209%2E5t9%2E5%2022%2E5zm0%2D512v192q0%2013%2D9%2E5%2022%2E5t%2D22%2E5%209%2E5h%2D1216q%2D13%200%2D22%2E5%2D9%2E5t%2D9%2E5%2D22%2E5v%2D192q0%2D13%209%2E5%2D22%2E5t22%2E5%2D9%2E5h1216q13%200%2022%2E5%209%2E5t9%2E5%2022%2E5z%22%2F%3E%3C%2Fsvg%3E")}.yoast-section__heading-icon-key{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555%22%20d%3D%22M832%20512q0%2D80%2D56%2D136t%2D136%2D56%2D136%2056%2D56%20136q0%2042%2019%2083%2D41%2D19%2D83%2D19%2D80%200%2D136%2056t%2D56%20136%2056%20136%20136%2056%20136%2D56%2056%2D136q0%2D42%2D19%2D83%2041%2019%2083%2019%2080%200%20136%2D56t56%2D136zm851%20704q0%2017%2D49%2066t%2D66%2049q%2D9%200%2D28%2E5%2D16t%2D36%2E5%2D33%2D38%2E5%2D40%2D24%2E5%2D26l%2D96%2096%20220%20220q28%2028%2028%2068%200%2042%2D39%2081t%2D81%2039q%2D40%200%2D68%2D28l%2D671%2D671q%2D176%20131%2D365%20131%2D163%200%2D265%2E5%2D102%2E5t%2D102%2E5%2D265%2E5q0%2D160%2095%2D313t248%2D248%20313%2D95q163%200%20265%2E5%20102%2E5t102%2E5%20265%2E5q0%20189%2D131%20365l355%20355%2096%2D96q%2D3%2D3%2D26%2D24%2E5t%2D40%2D38%2E5%2D33%2D36%2E5%2D16%2D28%2E5q0%2D17%2049%2D66t66%2D49q13%200%2023%2010%206%206%2046%2044%2E5t82%2079%2E5%2086%2E5%2086%2073%2078%2028%2E5%2041z%22%2F%3E%3C%2Fsvg%3E")}.yoast-section__heading-icon-edit{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555%22%20d%3D%22M491%201536l91%2D91%2D235%2D235%2D91%2091v107h128v128h107zm523%2D928q0%2D22%2D22%2D22%2D10%200%2D17%207l%2D542%20542q%2D7%207%2D7%2017%200%2022%2022%2022%2010%200%2017%2D7l542%2D542q7%2D7%207%2D17zm%2D54%2D192l416%20416%2D832%20832h%2D416v%2D416zm683%2096q0%2053%2D37%2090l%2D166%20166%2D416%2D416%20166%2D165q36%2D38%2090%2D38%2053%200%2091%2038l235%20234q37%2039%2037%2091z%22%20%2F%3E%3C%2Fsvg%3E")}.yoast-tooltip.yoast-tooltip-hidden::after,.yoast-tooltip.yoast-tooltip-hidden::before{display:none}.screen-reader-text.wpseo-generic-tab-textual-score,.screen-reader-text.wpseo-keyword-tab-textual-score{display:block}@media screen and (max-width:782px){.wpseo-metabox-sidebar{display:inline-block;float:none;width:auto;margin:0 -5px 10px 0;padding:0;vertical-align:top}.wpseo-meta-section.active{display:block;clear:both;max-width:none}.wpseo-metabox-sidebar ul{display:inline-block}.wpseo-metabox-sidebar li{float:right;text-align:center}.wpseo-metabox-sidebar .wpseo-meta-section-link{width:40px;height:40px}.wpseo-meta-section-link .dashicons,.wpseo-meta-section-link .yst-traffic-light-container{display:block;width:40px;height:35px;margin:0;padding:5px 0 2px;border-bottom-width:3px;border-right-width:0}.wpseo-meta-section-link .dashicons:before,.wpseo-meta-section-link .yst-traffic-light{margin:0}.wpseo-meta-section-link .dashicons-admin-generic:before{position:relative;right:1px}.wpseo-metabox-buy-premium .wpseo-buy-premium{display:inline-block;width:20px;height:20px;padding:0 5px}.yoast-help-panel{max-width:none!important}#wpseo-crawl-issues-table-form .subsubsub{float:none;max-width:calc(100vw - 20px)}#wpseo-crawl-issues-table-form .yoast-help-button{margin-top:3px}.wpseotab select[multiple]{height:auto!important}}@media screen and (max-width:600px){.wpseotab{padding:20px}.wpseotab.content{padding:20px 0}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-471-rtl.min.css deleted file mode 100644 index a84238fa..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/metabox-primary-category-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-is-primary-term,.wpseo-primary-term>label{font-weight:600}.wpseo-non-primary-term>.wpseo-is-primary-term,.wpseo-primary-term>.wpseo-make-primary-term,.wpseo-term-unchecked>.wpseo-is-primary-term,.wpseo-term-unchecked>.wpseo-make-primary-term{display:none}.wpseo-is-primary-term,.wpseo-make-primary-term{float:left}.wpseo-non-primary-term:after,.wpseo-non-primary-term:before,.wpseo-primary-term:after,.wpseo-primary-term:before{display:table;content:""}.wpseo-non-primary-term:after,.wpseo-primary-term:after{clear:both}.wpseo-make-primary-term{margin:4px 0 0;padding:0;border:none;color:#0073aa;background:0 0;text-decoration:underline;cursor:pointer}.wpseo-make-primary-term:hover{color:#00a0d2} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/select2/select2.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/select2/select2.min.css deleted file mode 100644 index 76de04d9..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/select2/select2.min.css +++ /dev/null @@ -1 +0,0 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/snippet-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/snippet-471-rtl.min.css deleted file mode 100644 index 0d539c51..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/snippet-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -#snippet_preview{font-family:Arial,Helvetica,sans-serif;font-style:normal}.wpseosnippet .snippet-editor__label{font-size:1rem;font-weight:400;line-height:1}input[type=text].snippet-editor__field--invalid{color:#dc3232} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-471-rtl.min.css deleted file mode 100644 index d4c5cd96..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/toggle-switch-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";.switch-light span span,.switch-toggle a{display:none}@media only screen{.switch-light,.switch-toggle{display:block;position:relative;padding:0!important}.switch-light::after,.switch-toggle::after{display:table;clear:both;content:""}.switch-light *,.switch-light :after,.switch-light :before,.switch-toggle *,.switch-toggle :after,.switch-toggle :before{box-sizing:border-box}.switch-light a,.switch-toggle a{display:block;transition:all .2s ease-out}.switch-light label,.switch-light>span,.switch-toggle label,.switch-toggle>span{line-height:2em;vertical-align:middle}.switch-light input{position:absolute;z-index:3;opacity:0}.switch-light input:checked~span a{left:0}.switch-light strong{font-weight:inherit}.switch-light>span{position:relative;min-height:2em;padding:0;text-align:right}.switch-light span span{display:block;float:right;position:relative;z-index:2;width:50%;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-light a{display:block;position:absolute;z-index:1;top:0;left:50%;width:50%;height:100%;padding:0}.switch-toggle input{position:absolute;right:0;opacity:0}.switch-toggle input+label{display:block;float:right;position:relative;z-index:2;margin:0;padding:0 .5em;text-align:center}.switch-toggle a{position:absolute;z-index:1;top:0;right:0;width:10px;height:100%;padding:0}.switch-toggle label:nth-child(2):nth-last-child(4),.switch-toggle label:nth-child(2):nth-last-child(4)~a,.switch-toggle label:nth-child(2):nth-last-child(4)~label{width:50%}.switch-toggle label:nth-child(2):nth-last-child(4)~input:checked:nth-child(3)+label~a{right:50%}.switch-toggle label:nth-child(2):nth-last-child(6),.switch-toggle label:nth-child(2):nth-last-child(6)~a,.switch-toggle label:nth-child(2):nth-last-child(6)~label{width:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(3)+label~a{right:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(5)+label~a{right:66.66%}.switch-toggle label:nth-child(2):nth-last-child(8),.switch-toggle label:nth-child(2):nth-last-child(8)~a,.switch-toggle label:nth-child(2):nth-last-child(8)~label{width:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(3)+label~a{right:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(5)+label~a{right:50%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(7)+label~a{right:75%}.switch-toggle label:nth-child(2):nth-last-child(10),.switch-toggle label:nth-child(2):nth-last-child(10)~a,.switch-toggle label:nth-child(2):nth-last-child(10)~label{width:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(3)+label~a{right:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(5)+label~a{right:40%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(7)+label~a{right:60%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(9)+label~a{right:80%}.switch-toggle label:nth-child(2):nth-last-child(12),.switch-toggle label:nth-child(2):nth-last-child(12)~a,.switch-toggle label:nth-child(2):nth-last-child(12)~label{width:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(3)+label~a{right:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(5)+label~a{right:33.2%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(7)+label~a{right:49.8%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(9)+label~a{right:66.4%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(11)+label~a{right:83%}.switch-candy a{box-shadow:0 1px 1px rgba(0,0,0,.2),inset 0 1px 1px rgba(255,255,255,.45)}}@media only screen and (-webkit-max-device-pixel-ratio:2) and (max-device-width:80em){.switch-light,.switch-toggle{-webkit-animation:webkitSiblingBugfix infinite 1s}}.fieldset-switch-toggle label{float:none}@media only screen{.switch-light.switch-yoast-seo{margin-bottom:.2em}.fieldset-switch-toggle legend,.switch-light.switch-yoast-seo>strong{display:block;box-sizing:border-box;min-width:200px;margin-top:10px;padding-left:1em;font-weight:600;line-height:2em;vertical-align:middle}.switch-light.switch-yoast-seo>span,.switch-toggle.switch-yoast-seo{width:250px;border:1px solid #ccc;border-radius:.5em;background-color:#dcdcdc;box-shadow:inset 0 2px 4px rgba(0,0,0,.15)}.switch-light.switch-yoast-seo,.switch-toggle.switch-yoast-seo{float:right}.switch-light.switch-yoast-seo>span{display:inline-block;overflow:visible}.switch-light.switch-yoast-seo a,.switch-toggle.switch-yoast-seo a{border:1px solid #b5b5b5;border-radius:.5em;background:#a4286a}.switch-light.switch-yoast-seo input:focus+label,.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus+label,.switch-toggle.switch-yoast-seo input:focus~span a{outline:0}.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus~a{border-color:#5b9dd9!important;box-shadow:0 0 2px rgba(0,115,170,.8)!important}.switch-light.switch-yoast-seo input:checked~span a,.switch-toggle.switch-yoast-seo input:checked~span a{border:1px solid #b5b5b5;background:#a4286a}.switch-light.switch-yoast-seo input:checked~span span:first-child,.switch-light.switch-yoast-seo span span,.switch-toggle.switch-yoast-seo label{color:#333;text-shadow:none;font-weight:inherit}.switch-candy.switch-yoast-seo input:checked+label,.switch-candy.switch-yoast-seo input:checked~span span:nth-child(2),.switch-candy.switch-yoast-seo input~span span:first-child{color:#fff;text-shadow:none}.switch-light.switch-yoast-seo-reverse input:checked~span a{right:0}.switch-light.switch-yoast-seo-reverse a{right:50%}.switch-light.switch-yoast-seo-reverse span span{float:left}.switch-toggle.switch-yoast-seo label,label.switch-light.switch-yoast-seo{margin-right:0;cursor:pointer}.switch-yoast-seo .switch-yoast-seo-jaws-a11y{display:block;overflow:hidden;height:1px;margin-bottom:-1px}.switch-light.switch-yoast-seo label code,.switch-toggle.switch-yoast-seo label code{background-color:inherit;vertical-align:top}.switch-container .label-text{display:block;margin:.5em 0;font-weight:600}.switch-container{clear:both;margin:0 0 1em}.switch-container+.switch-container{margin-top:.5em}.switch-container+p{margin:-.5em 0 1em}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-471-rtl.min.css deleted file mode 100644 index f7d21e53..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/wpseo-dismissible-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-notice-dismiss{position:absolute;top:0;left:1px;margin:0;padding:9px;border:none;color:#b4b9be;background:0 0;cursor:pointer;text-decoration:none}.yoast-notice-dismiss:before{display:block!important;width:20px;height:20px;color:#b4b9be;background:0 0;font:400 16px/1 dashicons;text-align:center;content:"\f153";-webkit-font-smoothing:antialiased!important;speak:none;position:relative;top:0;right:0;line-height:20px}.yoast-notice-dismiss:active:before,.yoast-notice-dismiss:focus:before,.yoast-notice-dismiss:hover:before{color:#c00}.yoast-notice-dismiss:focus{outline:0;color:#c00;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.ie8 .yoast-notice-dismiss:focus{outline:#5b9dd9 solid 1px}.yoast-notice.is-dismissible{position:relative} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/yoast-components-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/yoast-components-471-rtl.min.css deleted file mode 100644 index 943cc4b0..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/yoast-components-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-wizard--step--container:focus,a{outline:0}body{background:#f1f1f1;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:1.375}a{color:#0073aa;transition-timing-function:ease-in-out;transition-duration:50ms;transition-property:border,background,color}a:active,a:hover{color:#00a0d2}a:focus{color:#124964;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.screen-reader-text{overflow:hidden;clip:rect(1px,1px,1px,1px);position:absolute!important;width:1px;height:1px}.yoast-search-result-preview{overflow:hidden;background-color:#fff;font-family:Arial,sans-serif}.yoast-search-result-preview__heading{margin:0 -20px 15px;padding:8px 20px;border-bottom:1px solid #f7f7f7;color:#555;font-family:"Open Sans",sans-serif;font-size:.9rem;font-weight:300}.yoast-search-result-preview__field{overflow:hidden;position:relative;width:600px;cursor:pointer}.yoast-search-result-preview__field:after,.yoast-search-result-preview__field:before{display:table;content:" "}.yoast-search-result-preview__field--focus:before,.yoast-search-result-preview__field--hover:before{position:absolute;right:-3px;width:24px;height:24px;margin-top:-3px;background-size:25px;content:"";display:block}.yoast-search-result-preview__field:after{clear:both}.yoast-search-result-preview__field--hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23646464%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.yoast-search-result-preview__field--focus:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%230075b3%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.yoast-search-result-preview__title{overflow:hidden;margin:0;color:#1a0dab;font-size:18px;font-weight:400;line-height:1.2;white-space:nowrap;text-decoration:none;text-overflow:ellipsis}.yoast-search-result-preview__url{color:#006621;font-size:14px;font-style:normal;line-height:16px}.yoast-search-result-preview__date,.yoast-search-result-preview__description{font-size:13px;line-height:1.4}.yoast-search-result-preview__date{color:grey}.yoast-search-result-preview__description{color:#545454}.yoast-icon,.yoast-icon__eye{padding-right:45px}.yoast-icon__eye{background:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555%22%20d%3D%22M1664%20960q%2D152%2D236%2D381%2D353%2061%20104%2061%20225%200%20185%2D131%2E5%20316%2E5t%2D316%2E5%20131%2E5%2D316%2E5%2D131%2E5%2D131%2E5%2D316%2E5q0%2D121%2061%2D225%2D229%20117%2D381%20353%20133%20205%20333%2E5%20326%2E5t434%2E5%20121%2E5%20434%2E5%2D121%2E5%20333%2E5%2D326%2E5zm%2D720%2D384q0%2D20%2D14%2D34t%2D34%2D14q%2D125%200%2D214%2E5%2089%2E5t%2D89%2E5%20214%2E5q0%2020%2014%2034t34%2014%2034%2D14%2014%2D34q0%2D86%2061%2D147t147%2D61q20%200%2034%2D14t14%2D34zm848%20384q0%2034%2D20%2069%2D140%20230%2D376%2E5%20368%2E5t%2D499%2E5%20138%2E5%2D499%2E5%2D139%2D376%2E5%2D368q%2D20%2D35%2D20%2D69t20%2D69q140%2D229%20376%2E5%2D368t499%2E5%2D139%20499%2E5%20139%20376%2E5%20368q20%2035%2020%2069z%22%20%2F%3E%3C%2Fsvg%3E") 20px center/16px 16px no-repeat}.yoast-button,.yoast-button__edit{padding:8px 10px;border:1px solid #ccc;border-radius:4px;color:#555;background:#f7f7f7;font-size:.8rem;cursor:pointer}.yoast-button__edit{display:block;margin-top:1em;padding-right:32px;background:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555%22%20d%3D%22M491%201536l91%2D91%2D235%2D235%2D91%2091v107h128v128h107zm523%2D928q0%2D22%2D22%2D22%2D10%200%2D17%207l%2D542%20542q%2D7%207%2D7%2017%200%2022%2022%2022%2010%200%2017%2D7l542%2D542q7%2D7%207%2D17zm%2D54%2D192l416%20416%2D832%20832h%2D416v%2D416zm683%2096q0%2053%2D37%2090l%2D166%20166%2D416%2D416%20166%2D165q36%2D38%2090%2D38%2053%200%2091%2038l235%20234q37%2039%2037%2091z%22%20%2F%3E%3C%2Fsvg%3E") 8px center/16px 16px no-repeat #f7f7f7;background-size:16px}.yoast-search-result-form{overflow:hidden;background-color:#fff;font-family:Arial,sans-serif}.yoast-search-result-form__heading{margin:0 -20px 15px;padding:8px 20px;border-bottom:1px solid #f7f7f7;color:#555;font-family:"Open Sans",sans-serif;font-size:.9rem;font-weight:300}.yoast-search-result-form__container--focus:before,.yoast-search-result-form__container--hover:before{position:absolute;right:-3px;width:24px;height:24px;margin-top:15px;background-size:25px;content:"";display:block}.yoast-search-result-form__container--hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23646464%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.yoast-search-result-form__container--focus:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%230075b3%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.yoast-search-result-form__label{display:block;width:100%;margin-top:1em}.yoast-search-result-form__field{box-sizing:border-box;width:100%;border:1px solid #ddd}.yoast-search-result-form__description{display:block;box-sizing:border-box;width:100%;height:70px;border:1px solid #ddd}.yoast-search-result-form__progress{display:block;box-sizing:border-box;width:100%;height:8px;margin-top:5px;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.yoast-search-result-form__progress::-webkit-progress-bar{border:1px solid #ddd;background-color:#f7f7f7}.yoast-search-result-form__close-button{margin-top:1em}.yoast-search-result-form__progress--bad{color:#dc3232}.yoast-search-result-form__progress--bad::-webkit-progress-value{background-color:#dc3232;transition:width 250ms}.yoast-search-result-form__progress--bad::-moz-progress-bar{background-color:#dc3232}.yoast-search-result-form__progress--bad--fallback{overflow:hidden;max-width:100%;background-color:#dc3232}.yoast-search-result-form__progress--ok{color:#ee7c1b}.yoast-search-result-form__progress--ok::-webkit-progress-value{background-color:#ee7c1b;transition:width 250ms}.yoast-search-result-form__progress--ok::-moz-progress-bar{background-color:#ee7c1b}.yoast-search-result-form__progress--ok--fallback{overflow:hidden;max-width:100%;background-color:#ee7c1b}.yoast-search-result-form__progress--good{color:#7ad03a}.yoast-search-result-form__progress--good::-webkit-progress-value{background-color:#7ad03a;transition:width 250ms}.yoast-search-result-form__progress--good::-moz-progress-bar{background-color:#7ad03a}.yoast-search-result-form__progress--good--fallback{overflow:hidden;max-width:100%;background-color:#7ad03a}.yoast-search-result-editor{position:relative;width:640px;padding:0 20px 20px;border:1px solid #f7f7f7;border-radius:20px;background-color:#fff;font-family:Arial,sans-serif}body{margin:0;padding:0}#container{max-width:1660px;margin:0 auto}.yoast-wizard-body{box-sizing:border-box;width:80%;margin:1rem auto 4rem}@media screen and (max-width:768px){.yoast-wizard-body{width:auto;margin:0}}.yoast-wizard__logo{display:block;margin:0 auto}.yoast-wizard{box-sizing:border-box;width:100%;min-height:20px;padding:3em;background:#fff;text-align:right}.yoast-wizard--navigation{width:100%;text-align:left}.yoast-wizard--button{margin-top:1em}.yoast-wizard--button__next{margin-right:1em}.yoast-wizard--button__next button:focus,.yoast-wizard--button__next button:hover{background-color:#6c2548!important}.yoast-wizard--button__next button:focus div,.yoast-wizard--button__next button:hover div{background-color:transparent!important}.yoast-wizard--button__previous button:focus{background:#ddd!important}.yoast-wizard--button__previous button:focus:active{background:0 0!important}.yoast-wizard--button__previous button:focus>div>span,.yoast-wizard--button__previous button:hover>div>span{color:#000!important}.yoast-wizard--step__active svg{color:#5d237a;fill:#5d237a}.yoast-wizard--step__inactive div{pointer-events:none}.yoast-wizard--step--container h1{margin-top:0;margin-bottom:1rem;color:#a4286a;font-size:2.75em;font-weight:100;line-height:3.68rem;letter-spacing:.03em}@media screen and (max-width:768px){.yoast-wizard{padding:1em 1em 2em}.yoast-wizard--step__active{overflow:hidden;width:38px}.yoast-wizard--step__active div{display:inline-block!important;vertical-align:middle}.yoast-wizard--step__active div>span>span{display:block!important;margin-right:-7px;padding-left:99px!important}.yoast-wizard--step__inactive{display:none!important}.yoast-wizard--step--container h1{font-size:2em;line-height:1.25}}.yoast-wizard--step--container h2{color:#a4286a;font-size:1.375em;font-weight:400}.yoast-wizard--emphasis,.yoast-wizard-field-description{font-weight:700}.yoast-wizard--stepper{width:100%;margin:auto}.yoast-wizard-overlay{position:absolute;z-index:10;top:0;right:0;width:100%;height:100%;opacity:.2;color:#fff;background-color:#000;text-align:center}.yoast-wizard-overlay-loader{position:relative}.yoast-wizard-container{position:relative;min-height:20px;border:1px solid #ccc;box-shadow:rgba(0,0,0,.15) 0 3px 10px,rgba(0,0,0,.2) 0 3px 10px;text-align:right}@media screen and (max-width:768px){.yoast-wizard-container{box-shadow:none}}.yoast-wizard-container fieldset{margin:1em 0;padding-right:.5em;border:0}.yoast-wizard-text-input{padding-bottom:.5em;font-size:14px}.yoast-wizard-text-input-label{display:block;margin:.5em 0 0;font-weight:700;cursor:pointer}.yoast-wizard-text-input [type=text]{box-sizing:border-box;width:100%;max-width:450px}.yoast-wizard input{margin:.5em 0;padding:5px;font-size:14px;line-height:140%}.yoast-wizard label{cursor:pointer}.yoast-wizard input[type=radio]{margin:.3em 0 .3em .7em;vertical-align:middle}.yoast-wizard-input__explanation{margin-top:0;color:#555;font-style:italic}.yoast-wizard-input-radio{font-size:14px}.yoast-wizard-input-radio-option label{padding-top:2px}.yoast-wizard-input-radio-separator{padding:0}.yoast-wizard-input-radio-separator input{position:absolute;right:-9999em;width:1px;height:1px}.yoast-wizard-input-radio-separator input+label{float:right;width:30px!important;margin:0 0 5px 5px!important;padding:9px 6px;border:1px solid #ccc;font-family:Arial,Helvetica,sans-serif!important;font-size:18px!important;line-height:24px;text-align:center;cursor:pointer}.yoast-wizard-input-radio-separator input:checked+label{border:1px solid #a4286a;background-color:#fff;box-shadow:inset 0 0 0 2px #a4286a}.yoast-wizard-input-radio-separator input:checked+label,.yoast-wizard-input-radio-separator input:focus+label{border-radius:10px 10px 10px 0}.yoast-video-container-max-width{max-width:560px}.yoast-video-container{overflow:hidden;position:relative;height:0;padding-bottom:56.25%}.yoast-video-container iframe{position:absolute;top:0;right:0;width:100%;height:100%}.yoast-wizard-notice__error{margin-bottom:15px;padding:12px;border-right:4px solid #dc3232;background:#fff;box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}@keyframes heartbeat{0%{opacity:.4;transform:scale(.7)}80%{opacity:1}100%{opacity:1;transform:scale(.95)}}.yoast-loader{animation:heartbeat 1.15s infinite;animation-timing-function:cubic-bezier(.96,.02,.63,.86);animation-direction:alternate}#wizard{overflow:hidden}.yoast-wizard{padding-top:2em}.yoast-wizard input[type=text]{min-width:250px}.yoast-wizard #gsc_authorization_code,.yoast-wizard input[type=text]+div{margin-left:1em}.yoast-wizard-body{max-width:80em}.yoast-wizard-return-link{display:block;margin:1em 0;color:#646d78;text-align:center}.yoast-wizard-mailchimp-message-error{color:#dc3232}.yoast-wizard-mailchimp-message-success{color:#008a00}.yoast-wizard-input{padding-bottom:.5em}.yoast-wizard-input__select{margin:1em 0;font-size:14px}.yoast-wizard--columns>div,.yoast-wizard-image-upload-container-buttons__remove{margin-right:1em}.yoast-wizard-image-upload-container__image{max-width:151px}.yoast-wizard-image-upload-container-buttons{margin-top:1em}.yoast-wizard-image-upload-container-description{display:block}.yoast-wizard--navigation{margin-top:2em;padding-top:1em;border-top:1px solid #a4286a}.yoast-wizard--rows{display:-ms-flexbox;display:flex;flex-direction:column;-ms-flex-direction:column}.yoast-wizard--columns{display:-ms-flexbox;display:flex}.yoast-wizard--columns .yoast-wizard-text-input-field{max-width:100%}.yoast-wizard--columns__even>div{flex-basis:50%;-ms-flex-preferred-size:50%}.yoast-wizard--columns>div:first-child{margin-right:0}.yoast-wizard--columns .yoast-wizard--heading{margin:0;color:#a4286a}.yoast-wizard--columns>.yoast-wizard--column__push_right{-ms-flex-order:2;order:2}.yoast-wizard--columns>.yoast-wizard--column__push_left{margin-left:1em;margin-right:0;-ms-flex-order:1;order:1}.yoast-wizard--choice>.yoast-wizard--rows{height:100%}.yoast-wizard--choice div{align-self:flex-start;-ms-flex-item-align:start}.yoast-wizard--choice p{height:100%;margin-top:.3em}.yoast-wizard--box{padding:1em;border:1px solid #a4286a}.yoast-wizard--box>div:first-child{flex-basis:100px;-ms-flex-preferred-size:100px}.yoast-wizard-newsletter--header svg{position:relative;top:4px;margin-left:6px;fill:#a4286a}.yoast-wizard-newsletter--decoration{width:100%;max-width:490px}.yoast-wizard-newsletter--decoration img{width:490px;max-width:100%;margin-top:-3em}.yoast-wizard--video-frame iframe{border:none}@media screen and (max-width:80em){.yoast-wizard--columns{display:block}.yoast-wizard--columns>div{margin-right:0}.yoast-wizard--columns>.yoast-wizard--column__push_left{margin-top:2em;margin-left:0}.yoast-wizard--box{display:-ms-flexbox;display:flex;margin-top:1em}.yoast-wizard--box:first-child{margin-top:0}.yoast-wizard--box>div{margin-right:1em}.yoast-wizard .hide-on-tablet{display:none}}.yoast-wizard--suggestion{margin-bottom:2em;padding-top:2em;border-top:1px solid #a4286a}.yoast-wizard--suggestion:first-child{padding-top:0;border-top:none}@media screen and (max-width:50rem){.yoast-wizard .hide-on-mobile{display:none}.yoast-wizard--box{display:block}.yoast-wizard--box>div{margin-right:0}.yoast-wizard--video-frame{position:relative;height:0;padding-bottom:56.25%}.yoast-wizard--video-frame iframe{position:absolute;top:0;right:0;width:100%;height:100%}}.ie9 .yoast-wizard--stepper{display:none} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-471-rtl.min.css deleted file mode 100644 index 6761f47e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/yoast-extensions-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";.yoast-list--usp{margin-bottom:1em;padding:0;font-family:"Open Sans",Arial,sans-serif}.yoast-list--usp li{position:relative;padding-right:1.2533333333rem;list-style:none!important}.yoast-list--usp li::before{position:absolute;top:0;right:0;color:#77b227;font-family:FontAwesome,"Open Sans",Arial,sans-serif;content:"\f00c\0020"}.yoast .h1,.yoast .h2,.yoast .h3,.yoast .h4,.yoast .h5,.yoast .h6,.yoast h1,.yoast h2,.yoast h3,.yoast h4,.yoast h5,.yoast h6{display:block;margin-top:0;font-family:"Open Sans",Arial,sans-serif;font-weight:300}.yoast .h1,.yoast h1{margin-bottom:1.35rem;font-size:2.5em;line-height:3.68rem;letter-spacing:normal}@media only screen and (min-width:30rem){.yoast .h1,.yoast h1{font-size:2.75em}}.yoast .h2,.yoast h2{margin-bottom:1.2rem;font-size:1.88em;line-height:2.5rem}.yoast .h2.tight,.yoast h2.tight{margin-bottom:.6rem}.yoast .h3,.yoast h3{margin-bottom:.8rem;font-size:1.25em;line-height:1.88rem}.yoast .h3.tight,.yoast h3.tight{margin-bottom:.4rem}@media only screen and (min-width:30rem){.yoast .h3,.yoast h3{font-size:1.375em}}@media only screen and (min-width:50rem){.yoast .h3,.yoast h3{font-size:1.5em}}.yoast .h4,.yoast .h5,.yoast .h6,.yoast h4,.yoast h5,.yoast h6{margin-bottom:.2rem;font-size:1.13em;font-weight:400;line-height:1.88rem}.yoast-button{display:inline-block;position:relative;width:100%;padding:.345em 1em .345em 1.5em;border:0;color:#dc5c04;background-color:#dc5c04;font-family:"Open Sans",Arial,sans-serif;font-size:1.1em;text-decoration:none;cursor:pointer}@media only screen and (min-width:30rem){.yoast-button{width:auto;max-height:2.86rem;margin-left:1.36rem}.yoast-button.left::before,.yoast-button::after{position:absolute;top:0;width:0;height:0;border-top:1.43rem solid transparent;border-bottom:1.44rem solid transparent}.yoast-button::after{left:-1.36rem;border-left:0;border-right:1.43rem solid #dc5c04;content:""}.yoast-button.left{margin-left:0;margin-right:1.36rem}.yoast-button.left::after{content:none}.yoast-button.left::before{right:-1.36rem;border-left:1.43rem solid #dc5c04;border-right:0;content:""}}.yoast-button--full::after,.yoast-button--naked::after,.yoast-button--noarrow::after{content:none}.yoast-button.alignleft{margin:1rem 0 0 2.5rem!important}.yoast-button .arrow{display:none}.yoast-button+.yoast-button{margin-top:1em;margin-right:1.88rem}.yoast-button--full{width:100%}.yoast-button.default{color:#fff;background-color:#dc5c04}.yoast-button.default::after{border-right-color:#dc5c04}.yoast-button.default::before{border-left-color:#dc5c04}.yoast-button a:focus,.yoast-button:hover{color:#fff;background-color:#f58223;text-decoration:underline}.yoast-button a:focus::after,.yoast-button:hover::after{border-right-color:#f58223}.yoast-button a:focus::before,.yoast-button:hover::before{border-left-color:#f58223}.yoast-button.academy{color:#fff;background-color:#5d237a}.yoast-button.academy::after{border-right-color:#5d237a}.yoast-button.academy::before{border-left-color:#5d237a}@media only screen and (max-width:20rem){.yoast-button.academy{background-color:#5d237a}.yoast-button.academy--secondary{background-color:#a4286a}}.yoast-button.academy--secondary{color:#fff;background-color:#a4286a}.yoast-button.academy--secondary::after{border-right-color:#a4286a}.yoast-button.academy--secondary::before{border-left-color:#a4286a}.yoast-button.software{color:#fff;background-color:#0075b3}.yoast-button.software::after{border-right-color:#0075b3}.yoast-button.software::before{border-left-color:#0075b3}.yoast-button.review{color:#fff;background-color:#009288}.yoast-button.about,.yoast_academy .yoast-button{background-color:#d93f69;color:#fff}.yoast-button.review::after{border-right-color:#009288}.yoast-button.about::after,.yoast_academy .yoast-button::after{border-right-color:#d93f69}.yoast-button.review::before{border-left-color:#009288}.yoast-button.about::before,.yoast_academy .yoast-button::before{border-left-color:#d93f69}.yoast_academy .yoast-button a:focus,.yoast_academy .yoast-button:hover{color:#fff;background-color:#d42a59;text-decoration:underline}.yoast_academy .yoast-button a:focus::after,.yoast_academy .yoast-button:hover::after{border-right-color:#d42a59}.yoast_academy .yoast-button a:focus::before,.yoast_academy .yoast-button:hover::before{border-left-color:#d42a59}.yoast_academy .yoast-button.dimmed,body .yoast-button.dimmed{color:#646464;background-color:#dcdcdc}.yoast_academy .yoast-button.dimmed::after,body .yoast-button.dimmed::after{border-right-color:#dcdcdc}.yoast_academy .yoast-button.dimmed::before,body .yoast-button.dimmed::before{border-left-color:#dcdcdc}.yoast_academy .yoast-button.dimmed a:focus,.yoast_academy .yoast-button.dimmed:hover,body .yoast-button.dimmed a:focus,body .yoast-button.dimmed:hover{color:#646464;background-color:#cdcdcd;text-decoration:underline}.yoast_academy .yoast-button.dimmed a:focus::after,.yoast_academy .yoast-button.dimmed:hover::after,body .yoast-button.dimmed a:focus::after,body .yoast-button.dimmed:hover::after{border-right-color:#cdcdcd}.yoast_academy .yoast-button.dimmed a:focus:before,.yoast_academy .yoast-button.dimmed:hover:before,body .yoast-button.dimmed a:focus:before,body .yoast-button.dimmed:hover:before{border-left-color:#cdcdcd}.yoast-button--naked{padding:0;border:none;background-color:transparent}.yoast-button i.fa{margin:4px 0 0 10px;font-size:140%}.theme-academy .yoast-promoblock{border-color:#5d237a}.theme-academy--secondary .yoast-promoblock{border-color:#a4286a}.theme-software .yoast-promoblock{border-color:#0075b3}.theme-review .yoast-promoblock{border-color:#009288}.theme-about .yoast-promoblock,.theme-home .yoast-promoblock{border-color:#d93f69}.theme-academy.yoast-promoblock{border-color:#5d237a}.theme-academy--secondary.yoast-promoblock{border-color:#a4286a}.theme-software.yoast-promoblock{border-color:#0075b3}.theme-review.yoast-promoblock,.theme-software--secondary.yoast-promoblock{border-color:#009288}.theme-review--secondary.yoast-promoblock{border-color:#77b227}.theme-about.yoast-promoblock{border-color:#d93f69}.theme-about--secondary.yoast-promoblock{border-color:#a4286a}.cta.yoast-promoblock,.link.yoast-promoblock{border-color:#dc5c04}.link.yoast-promoblock::after{-moz-filter:drop-shadow(1px 0 0 #dc5c04);-ms-filter:drop-shadow(1px 0 0 #dc5c04);-o-filter:drop-shadow(1px 0 0 #dc5c04);filter:drop-shadow(1px 0 0 #dc5c04)}.cta.yoast-promoblock::after{-moz-filter:drop-shadow(1px 0 0 #dc5c04);-ms-filter:drop-shadow(1px 0 0 #dc5c04);-o-filter:drop-shadow(1px 0 0 #dc5c04);filter:drop-shadow(1px 0 0 #dc5c04)}.yoast-promoblock{display:block;position:relative;margin-bottom:1.88rem;padding:20px;border:1px solid;border-radius:30px 30px 30px 0;background-color:#fff;font-family:Merriweather,Georgia,serif}.yoast-promoblock p{color:#000}.yoast-promoblock p:last-of-type{margin-bottom:0}.yoast-promoblock i.blockicon{position:absolute;left:10px;bottom:10px;padding:0 .5em 0 0;font-size:2.25em}.yoast-promoblock a img{border:1px solid #dcdcdc}.yoast-promoblock p a{font-weight:600!important;text-decoration:underline}.yoast-promoblock form a,a.promoblock,a.promoblock:hover{text-decoration:none}.yoast-promoblock form a{font-family:"Open Sans",Arial,sans-serif;font-weight:400!important}.yoast-promoblock .h4,.yoast-promoblock h4{margin-bottom:.7rem}.yoast-promoblock.link{border-color:#dc5c04}.yoast-promoblock.link a,.yoast-promoblock.link a:hover{color:#dc5c04}.yoast-promoblock--white{border-color:#fff!important}.yoast-promoblock.theme-academy a{color:#5d237a!important}.yoast-promoblock.theme-academy.secondary a{color:#a4286a!important}.yoast-promoblock.theme-software a{color:#0075b3!important}.yoast-promoblock.theme-review a{color:#009288!important}.yoast-promoblock.theme-review.secondary a{color:#77b227!important}.yoast-promoblock.theme-about a{color:#d93f69!important}.product .yoast-promoblock{overflow:hidden}.yoast-promoblock--hometitle{display:-ms-flexbox;display:flex;max-width:16em;height:11em;margin:1rem auto 2rem;border-color:#fff!important;background-color:rgba(217,63,105,.25);font-size:16px;font-size:1rem;line-height:1;-webkit-box-pack:center;-ms-flex-align:center;-ms-flex-line-pack:center;-ms-flex-pack:justify}.old-ie .yoast-promoblock--hometitle{text-align:justify}.old-ie .yoast-promoblock--hometitle::after{display:inline-block;width:100%;content:""}.old-ie .yoast-promoblock--hometitle>*{display:inline-block;text-align:right}@media only screen and (max-width:30rem){.yoast-promoblock--hometitle::after{content:none!important}}.yoast-promoblock--imageholder{margin-bottom:0;padding:0}.yoast-promoblock--imageholdersmall{position:absolute}.yoast-promoblock--imageholdersmall:first-child{right:4rem}.yoast-promoblock--imageholdersmall:last-child{top:4rem}@media only screen and (max-width:50rem){.yoast-promoblock h2{margin-bottom:0}}a.promoblock{color:#000}.promoblockimage__holder{position:relative;width:240px;height:295px}@media only screen and (min-width:50rem){[class*=promoblock--icon]::before{position:absolute;left:.47rem;bottom:.47rem;font-family:FontAwesome,"Open Sans",Arial,sans-serif;font-size:2.2rem;line-height:1}body.theme-about [class*=promoblock--icon]::before{color:#d93f69}body.theme-about .promoblock a.color-cta{color:#009288!important}body.theme-academy [class*=promoblock--icon]::before{color:#5d237a}body.theme-software [class*=promoblock--icon]::before{color:#0075b3}.promoblock--icon-academy::before{content:"\f19d"}.promoblock--icon-blog::before{content:"\f1ea"}.promoblock--icon-book::before{content:"\f02d"}.promoblock--icon-calendar::before{content:"\f073"}.promoblock--icon-check::before{content:"\f046"}.promoblock--icon-drupal::before{content:"\f1a9"}.promoblock--icon-gears::before{content:"\f085"}.promoblock--icon-pencil::before{content:"\f040"}.promoblock--icon-plug::before{content:"\f1e6"}.promoblock--icon-video::before{content:"\f008"}.promoblock--icon-wordpress::before{content:"\f19a"}}.yoast{color:#000;font-family:"Open Sans",Arial,sans-serif;font-size:1rem;line-height:1.88;letter-spacing:.01em}.yoast *,.yoast :after,.yoast :before{box-sizing:border-box}.yoast-hr{position:relative;margin:0;padding-bottom:1.88rem;border:0;border-top:1px solid #a4286a}.yoast-list--usp li:before{width:1em;height:100%;background:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%2377B227%22%20d%3D%22M1671%20566q0%2040%2D28%2068l%2D724%20724%2D136%20136q%2D28%2028%2D68%2028t%2D68%2D28l%2D136%2D136%2D362%2D362q%2D28%2D28%2D28%2D68t28%2D68l136%2D136q28%2D28%2068%2D28t68%2028l294%20295%20656%2D657q28%2D28%2068%2D28t68%2028l136%20136q28%2028%2028%2068z%22%2F%3E%3C%2Fsvg%3E") right .4em no-repeat;background-size:contain;content:""}.yoast-button--purple{background-color:#5d237a}.yoast-button-go-to:after{position:static;top:auto;left:auto;width:auto;height:auto;border:none;content:" \00BB"}.yoast-button--installed{color:#fff;background-color:#77b227;cursor:default}.yoast-button--installed:hover{background-color:#77b227;text-decoration:none}.yoast-promo-extensions{display:-ms-flexbox;display:flex;margin-right:-24px;-ms-flex-wrap:wrap;flex-wrap:wrap}.yoast-promo-extensions>h2{width:100%;margin-bottom:32px;margin-right:32px}.yoast-promo-extension{max-width:330px;margin-right:32px;border-color:#a4286a;background-color:transparent}.yoast-promo-extension:first-child{margin-right:0}.yoast-promo-extension img{width:100%;height:auto;margin-bottom:.8rem}.yoast-promo-extension .yoast-button{width:100%;max-height:none}.yoast-promo-extension .yoast-button--installed{width:auto}.yoast-promo-extension h3{color:#a4286a}@media screen and (max-width:900px){.yoast-promo-extension img{display:none}.yoast-promo-extension{width:100%;max-width:none}}.yoast-seo-premium-extension{margin:2em .5em 1.5em}.yoast-seo-premium-extension:after,.yoast-seo-premium-extension:before{display:table;content:""}.yoast-seo-premium-extension:after{clear:both}.yoast-seo-premium-benefits__title{font-weight:600}.yoast-seo-premium-benefits__description:before{content:"– "}.yoast-link--more-info{padding-right:calc(1em + 5px);color:#646464;background:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23646464%22%20d%3D%22M1152%201376v%2D160q0%2D14%2D9%2D23t%2D23%2D9h%2D96v%2D512q0%2D14%2D9%2D23t%2D23%2D9h%2D320q%2D14%200%2D23%209t%2D9%2023v160q0%2014%209%2023t23%209h96v320h%2D96q%2D14%200%2D23%209t%2D9%2023v160q0%2014%209%2023t23%209h448q14%200%2023%2D9t9%2D23zm%2D128%2D896v%2D160q0%2D14%2D9%2D23t%2D23%2D9h%2D192q%2D14%200%2D23%209t%2D9%2023v160q0%2014%209%2023t23%209h192q14%200%2023%2D9t9%2D23zm640%20416q0%20209%2D103%20385%2E5t%2D279%2E5%20279%2E5%2D385%2E5%20103%2D385%2E5%2D103%2D279%2E5%2D279%2E5%2D103%2D385%2E5%20103%2D385%2E5%20279%2E5%2D279%2E5%20385%2E5%2D103%20385%2E5%20103%20279%2E5%20279%2E5%20103%20385%2E5z%22%2F%3E%3C%2Fsvg%3E") right .2em no-repeat;background-size:1em}.yoast-link--more-info:after{content:" \00BB"}.yoast-promo-extension .yoast-link--more-info{display:block;margin:1em 0 0;background-position:right .4em}.yoast-heading-highlight{color:#a4286a;font-weight:600}.yoast-money-back-guarantee{font-size:1.1em;font-style:italic}.yoast-license-status-active{padding:3px 6px;color:#fff;background:#008a00}.yoast-license-status-inactive{padding:3px 6px;color:#fff;background:#dc3232} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-471-rtl.min.css deleted file mode 100644 index 01b0b0a7..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/yst_plugin_tools-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -#wpseo-debug-info,h4{clear:both}.yoast-sidebar__title,.yoast-table-scrollable,.yoast-table-scrollable td,.yoast-table-scrollable th{box-sizing:border-box}.wpseo_content_wrapper{display:table;width:100%;table-layout:fixed}.wpseo_content_cell{display:table-cell;height:500px;margin:0;padding:0;vertical-align:top}#wpseo_content_top{width:100%}#sidebar-container{width:261px;padding:0 19px 0 0}tr.yst_row{margin:5px 0 0;padding:5px 0 0}tr.yst_row.even{background-color:#f6f6f6}.postbox{margin:10px 0 0 10px}label.select,label.textinput{float:right;width:200px;margin:5px 0}.yoast-inline-label{float:none;margin:0}input.textinput,select,textarea{width:400px}input.textinput,select.select,textarea.textinput{margin:0 0 15px}input.checkbox,input.checkbox.double,input.radio{margin:6px 0 6px 10px}.textinput.metadesc{height:50px}textarea.import{width:500px;height:100px}p.desc{margin:6px 0 10px;padding:0 25px 8px 0}p.desc.label{margin:0 0 20px;padding:0 200px 10px 0}.wpseo-gsc-reload-crawl-issues-form{position:relative;top:9px}.wp-core-ui .button.wpseo-gsc-save-profile{margin-right:200px}.wpseo_content_wrapper h3{margin:1em 0 .5em}h4{margin:1.2em 0 .5em}.wpseo_content_wrapper li,.wpseo_content_wrapper p{max-width:600px}.wpseo_content_wrapper .notice p,.wpseo_content_wrapper .yoast-blocking-files-error p,.yoast .search-box{max-width:none}table.wpseo th{text-align:right}#wpseo-tabs+.notice{margin-top:1.5em}.wpseo-variable-warning-element{border:1px solid #c62d2d!important}.wpseo-variable-warning{clear:both;margin:5px 0 0;padding:5px;color:#c62d2d}.wpseo-variable-warning code{color:#b02828}.wpseo-variable-warning a{color:#c62d2d}.wpseo_content_wrapper h1.wpseo-redirect-url-title{margin:1em 0 .5em;font-size:1.3em}.postbox form{line-height:150%}.text{width:250px}table.yoast_help{border-collapse:collapse}table.yoast_help,table.yoast_help td,table.yoast_help th{border:1px solid #ddd;color:#444}table.yoast_help td,table.yoast_help th{padding:5px 10px;text-align:right;vertical-align:top}.correct,.wrong{padding:5px;color:#fff}table.yoast_help tr{background-color:#f1f1f1}table.yoast_help tr:nth-child(2n){background-color:#fbfbfe}table.yoast_help tr:hover{background-color:#ddd}table.yoast_help thead tr,table.yoast_help thead tr:hover{background-color:#fff}table.yoast_help .yoast-variable-name{font-weight:600;white-space:nowrap}table.yoast_help .yoast-variable-desc{font-weight:400}.correct{background-color:green}.wrong{background-color:#dc3232}.wrong code{padding:3px 8px;color:#000}.yoast-notice-blocking-files code{color:#000;line-height:2}.yoast-notice-blocking-files .button{margin:.5em 0}.button.checkit,.button.fixit{float:left;margin:0 5px}.button.checkit{padding:5px 8px}.fb-buttons .button,.fb-buttons .button-primary{margin-left:8px}.wpseotab{display:none}.wpseotab.active{display:block}.wpseotab p.expl{margin-right:6px}.wpseotab p.expl strong{font-size:115%}#wpseo-debug-info .hndle{cursor:auto}#wpseo-debug-info .wpseo-debug-heading{font-size:1em}#wpseo-debug-info .wpseo-debug{display:inline-block;padding-right:20px;color:#c00}input.wpseo-new-title,textarea.wpseo-new-metadesc{width:100%;max-width:100%}#separator{margin:1.5em 0 .5em}#separator input.radio{position:absolute;right:-9999em;width:1px;height:1px}#separator input.radio+label{float:right;width:30px!important;margin:0 0 .5em 5px!important;padding:9px 6px;border:1px solid #ccc;font-family:Arial,Helvetica,sans-serif!important;font-size:18px!important;line-height:24px;text-align:center;cursor:pointer}#separator input.radio:checked+label{border:1px solid #a4286a;background-color:#fff;box-shadow:inset 0 0 0 2px #a4286a}#separator input.radio:focus+label{border-radius:10px 10px 10px 0}.svg-container{text-align:center}.svg-container .dashicons{width:200px;height:100px;font-size:100px}body.toplevel_page_wpseo_dashboard .wp-badge{background:url(../images/Yoast_SEO_Icon.svg) 50% 10px no-repeat;background-size:140px 140px;box-shadow:none}.nav-tab .dashicons{width:18px;height:18px;font-size:18px;line-height:24px}.nav-tab .pinteresticon{width:12px;height:24px;margin-left:2px;background-image:url(../images/pinterest-23x30.png);background-repeat:no-repeat;background-position:center center;background-size:contain}#wpseo_progressbar .ui-progressbar-value,.wpseo-progressbar .ui-progressbar-value{height:25px;background:#006691}#wpseo_progressbar{height:25px;border:1px solid #006691}.wpseo-progressbar-wrapper{display:inline;width:100%}.wpseo-progressbar{display:block;width:100%;height:25px;border:1px solid #006691}.wpseo-add-fb-admin-form-wrap .notice span{margin-right:10px}.archives-titles-metas-content{padding-top:1em}.yoast-sidebar__title{width:100%;margin:46px 0 20px;padding:10px 0;border-bottom:1px solid #a4286a;color:#a4286a;line-height:19px;text-align:right}.yoast-sidebar__spot{padding:10px 0;border-bottom:1px solid #ddd}.yoast-sidebar__spot a,.yoast-sidebar__spot h2{color:#a4286a}.yoast-sidebar__spot h2{margin-top:0}.yoast-sidebar__spot ul{position:relative}.yoast-sidebar__spot li{margin-right:20px;list-style:none}.yoast-sidebar__spot li::before{position:absolute;right:0;font-weight:700;content:"+"}.wpseo-banner__link{display:inline-block}.wpseo-banner__image{vertical-align:top}@media screen and (max-width:1024px){.wpseo-tab-video-slideout .yoast-table-scrollable{width:120%}}.page-wpseo_rss .yoast-variable-desc{min-width:300px}.yoast-table-scrollable__container.yoast-has-scroll{overflow:hidden;position:relative}.yoast-table-scrollable__container.yoast-has-scroll:after{position:absolute;top:0;right:100%;width:50px;height:calc(100% - 16px);border-radius:0 10px 10px 0/0 50% 50% 0;box-shadow:5px 0 10px rgba(0,0,0,.25);content:""}.yoast-table-scrollable__container.yoast-has-scroll .yoast-table-scrollable__inner{overflow-x:scroll;padding-bottom:16px}.yoast-table-scrollable__hintwrapper{display:none}.yoast-table-scrollable__hintwrapper.yoast-has-scroll{display:block;margin:1em 0;text-align:center}.yoast-has-scroll .yoast-table-scrollable__hint{display:inline-block}.yoast-has-scroll .yoast-table-scrollable__hint:before{display:inline-block;margin-left:10px;font-size:20px;line-height:inherit;vertical-align:text-top;content:"\21c4"}@media screen and (max-width:1024px){.wpseo_content_cell,.wpseo_content_wrapper{display:block;height:auto}#wpseo_content_top{width:auto}#sidebar-container{width:auto;padding:0}.yoast-sidebar__spot{float:right;width:50%;border:none;text-align:center}.yoast-sidebar__spot strong:first-child{display:block;max-width:261px;margin:0 auto;text-align:right}.yoast-sidebar__spot p{max-width:261px;margin:1em auto;text-align:right}}@media screen and (max-width:782px){label.select,label.textinput{display:inline-block;float:none;width:auto}input.textinput,textarea,textarea.textinput{display:block;width:100%}.select2-container,select,select.select{display:block;max-width:100%}p.desc.label{padding-right:0}.wp-core-ui .button.wpseo-gsc-save-profile{margin-right:0}.wpseo-gsc-reload-crawl-issues-form{top:0;margin:1em 0}.wpseo-gsc-reload-crawl-issues-form .alignright{float:none}}@media screen and (max-width:600px){.wpseo-gsc-reload-crawl-issues-form{margin-bottom:0}.yoast-sidebar__spot{float:none;width:261px;margin:0 auto;border-bottom:1px solid #ddd}}@media screen and (max-width:500px){body.toplevel_page_wpseo_dashboard .wp-badge{padding-top:80px;background-color:#a4286a;background-size:100px 100px;box-shadow:0 1px 3px rgba(0,0,0,.2)}}.wpseo-checkmark-ok-icon{float:right;width:18px;height:18px;margin-left:5px;background:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%2377B227%22%20d%3D%22M1671%20566q0%2040%2D28%2068l%2D724%20724%2D136%20136q%2D28%2028%2D68%2028t%2D68%2D28l%2D136%2D136%2D362%2D362q%2D28%2D28%2D28%2D68t28%2D68l136%2D136q28%2D28%2068%2D28t68%2028l294%20295%20656%2D657q28%2D28%2068%2D28t68%2028l136%20136q28%2028%2028%2068z%22%2F%3E%3C%2Fsvg%3E") no-repeat;background-size:18px;vertical-align:top} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-471-rtl.min.css b/wp/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-471-rtl.min.css deleted file mode 100644 index 01c4325f..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/dist/yst_seo_score-471-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{display:inline-block;width:12px;height:12px;margin:3px 3px 0 10px;border-radius:50%;background:#888;vertical-align:top}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}.wpseo-score-title{font-weight:600}#taxonomy_overall{position:absolute;top:0;margin-right:87.5%} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/edit-page-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/edit-page-471.min.css deleted file mode 100644 index 9775e1a3..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/edit-page-471.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{display:inline-block;width:12px;height:12px;margin-left:6px;border-radius:50%;background:#888;line-height:16px}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}th#wpseo-score{width:63px}th#wpseo-score-readability{width:75px}@media screen and (max-width:782px){.column-wpseo-focuskw,.column-wpseo-metadesc,.column-wpseo-score,.column-wpseo-title{display:none}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/featured-image-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/featured-image-471.min.css deleted file mode 100644 index 336c6100..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/featured-image-471.min.css +++ /dev/null @@ -1 +0,0 @@ -#yst_opengraph_image_warning{margin-top:0}.yoast-opengraph-image-notice #set-post-thumbnail>img{box-shadow:0 0 0 2px #fff,0 0 0 5px #dc3232} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/help-center-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/help-center-471.min.css deleted file mode 100644 index 227ce746..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/help-center-471.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-tab-video-container{margin-bottom:20px;border-bottom:1px solid #a4286a}.yoast-help-center-open .wpseo-tab-video-container{border-bottom:none}.postbox .wpseo-tab-video-container{margin-right:-12px;margin-left:-12px}.wpseo-tab-video-container__handle{width:100%;margin:0;padding:10px 12px;border:none;outline:0;color:#a4286a;background:0 0;line-height:19px;text-align:left;cursor:pointer}.wpseo-tab-video-container__handle:focus,.wpseo-tab-video-container__handle:hover{text-decoration:underline}.wpseo-tab-video-container__handle .toggle__arrow,.wpseo-tab-video-slideout a.button,.wpseo-tab-video-slideout a.button-primary{text-decoration:none}.wpseo-tab-video-container__handle .dashicons-before:before{margin-right:5px}.wpseo-tab-video-container .wpseo-premium-popup{max-width:770px}.wpseo-tab-video-slideout{display:-ms-flexbox;display:flex;padding:2em 0;background-color:#a4286a;box-shadow:inset 0 10px 10px -5px rgba(123,30,80,.5),inset 0 -10px 10px -5px rgba(123,30,80,.5)}.wpseo-admin-page .wpseo-tab-video-slideout{border:1px solid #e5e5e5;border-top:0}.wpseo-tab-video-slideout.hidden{display:none}.wpseo-tab-video-slideout .yoast-help-center-tabs{padding:0 0 1em;color:#fff;background-color:#a4286a;-ms-flex:0 0 164px;flex:0 0 164px}.wpseo-tab-video-slideout .yoast-help-center-tabs ul{margin:0}.wpseo-tab-video-slideout .yoast-help-center-tabs-wrap{max-width:916px;padding:0;-ms-flex:0 1 916px;flex:0 1 916px}.wpseo-tab-video-slideout .yoast-help-tab-content{display:none;padding:0 12px;color:#fff;font-weight:300}.wpseo-tab-video-slideout .yoast-help-tab-content.active{display:block}.wpseo-tab-video-slideout .yoast-help-tab-content.active.yoast-help-tab-content-video{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.wpseo-tab-video-slideout .yoast-help-tab-content li{margin:2px 10px;list-style:disc inside}.wpseo-tab-video-slideout .wpseo-tab-video__panel--video{max-width:560px;margin-right:12px;padding-bottom:12px;-ms-flex:0 1 560px;flex:0 1 560px}.wpseo-tab-video-slideout .wpseo-tab-video__panel--video iframe{vertical-align:middle}.wpseo-tab-video-slideout .wpseo-tab-video__panel--text{min-width:220px;max-width:560px;-ms-flex:1 1 220px;flex:1 1 220px}.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea{margin:0 0 12px;padding:15px 15px 5px;border:1px solid #fff;border-radius:30px 30px 0;color:#fff;background-color:#a4286a}.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea a,.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea a:focus,.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea a:hover{color:#fff;font-weight:500}.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea h3{margin:0}.wpseo-tab-video-slideout a{color:#fff}#wpseo_meta .wpseo-tab-video-slideout h2,.wpseo-tab-video-slideout h1,.wpseo-tab-video-slideout h2,.wpseo-tab-video-slideout h3,.wpseo-tab-video-slideout h4,.wpseo-tab-video-slideout h5,.wpseo-tab-video-slideout h6{margin-top:.5em;margin-bottom:1em;padding:0;color:#fff;font-size:1.3em;font-weight:400;line-height:1.4}.wpseo-help-center-item{display:inline}.wpseo-help-center-item a{display:block;padding:10px 12px;color:#fff;line-height:20px;text-decoration:none}.wpseo-help-center-item a:focus,.wpseo-help-center-item a:hover{text-decoration:underline}.wpseo-help-center-item a.dashicons-before:before{margin-right:3px;text-decoration:none}.wpseo-help-center-item.active a{color:#a4286a;background-color:#fff}@media screen and (max-width:1280px){.columns-2 .wpseo-tab-video-slideout .wpseo-tab-video__panel--video{margin-right:0}}@media screen and (max-width:1024px){.wpseo-tab-video-slideout .wpseo-tab-video__panel--video{margin-right:0;flex-basis:100%;-ms-flex-preferred-size:100%}.columns-2 .wpseo-tab-video-slideout{display:block}.columns-2 .wpseo-tab-video-slideout.hidden{display:none}.columns-2 .wpseo-tab-video-slideout .yoast-help-center-tabs{width:auto;padding-right:12px;padding-left:12px}.columns-2 .wpseo-tab-video-slideout .yoast-help-tab-content.active.yoast-help-tab-content-video{display:block;padding:0}.columns-2 .wpseo-tab-video-slideout .wpseo-tab-video__panel--video{max-width:none}.columns-2 .wpseo-tab-video-slideout .wpseo-tab-video__panel--text{max-width:none;padding:0 12px}.columns-2 .wpseo-help-center-item a{display:inline-block;margin:0 4px 8px 0;border:1px solid rgba(255,255,255,.5)}}@media screen and (max-width:782px){.wpseo-tab-video-slideout{display:block}.wpseo-tab-video-slideout .yoast-help-center-tabs{width:auto;padding-right:12px;padding-left:12px}.wpseo-tab-video-slideout .yoast-help-tab-content.active.yoast-help-tab-content-video{display:block;padding:0}.wpseo-tab-video-slideout .wpseo-tab-video__panel--video{max-width:none}.wpseo-tab-video-slideout .wpseo-tab-video__panel--text{max-width:none;padding:0 12px}.wpseo-help-center-item a{display:inline-block;margin:0 4px 8px 0;border:1px solid rgba(255,255,255,.5)}.wpseo-premium-popup-icon{display:none}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/inside-editor-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/inside-editor-471.min.css deleted file mode 100644 index d16fec52..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/inside-editor-471.min.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-text-mark{background-color:#e1bee7}.yoast-text-mark__highlight{color:#fff;background-color:#4a148c} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/kb-search-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/kb-search-471.min.css deleted file mode 100644 index 337e9463..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/kb-search-471.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-kb-search-search-bar{border-bottom:1px solid #ccc}.wpseo-kb-search-search-bar form{display:-ms-flexbox;display:flex;max-width:600px}.wpseo-kb-search-search-bar input[type=text]{margin:0 7px 1em 0;padding:0 5px 1px;font-size:13px;line-height:26px;-ms-flex:1 1 auto;flex:1 1 auto}.wpseo-kb-search-search-bar .wpseo-kb-search-search-button{margin:0 0 1em}.wpseo-kb-search-results{overflow:auto;height:500px;margin:0;padding:0;list-style:none}.yoast-help-tab-content .wpseo-kb-search-results li{max-width:none;margin:0;list-style:none}.wpseo-kb-search-result{display:block;margin:0;padding-left:5px;border-bottom:1px solid #efefef;text-decoration:none}.wpseo-kb-search-result p{max-width:none;margin-top:0}.wpseo-kb-search-result-link{display:block;outline:0;text-decoration:none;cursor:pointer}.wpseo-kb-search-result-link:focus,.wpseo-kb-search-result-link:hover{background-color:rgba(93,12,55,.5);box-shadow:none;text-decoration:underline}.wpseo-kb-search-result .wpseo-kb-search-result-title{margin:0;padding:14px 0}.wpseo-kb-search-ext-link{float:right}.wpseo-kb-search-back-button:before{content:"\f141"}.wpseo-kb-search-ext-link:before{content:"\f504"}.dashicon-button:before{display:inline-block;font-family:dashicons;font-size:20px;line-height:1.35em;vertical-align:middle}.wpseo-kb-search-navigation{z-index:10;padding:1em 0}.kb-search-content-frame{width:100%;height:543px;background:url("data:image/svg+xml;charset=utf-8,Loading article...") no-repeat}.wpseo-kb-loader,.wpseo-kb-loader:after,.wpseo-kb-loader:before{width:2.5em;height:2.5em;border-radius:50%;animation:load7 1.8s infinite ease-in-out;animation-fill-mode:both}.wpseo-kb-loader{position:relative;margin:80px auto;font-size:10px;text-indent:-9999em;-ms-transform:translateZ(0);transform:translateZ(0);animation-delay:-.16s}.wpseo-kb-loader:before{left:-3.5em;animation-delay:-.32s}.wpseo-kb-loader:after{left:3.5em}.wpseo-kb-loader:after,.wpseo-kb-loader:before{position:absolute;top:0;content:""}.dashicons{text-decoration:none}@keyframes load7{0%,100%,80%{box-shadow:0 2.5em 0 -1.3em}40%{box-shadow:0 2.5em 0 0}}@media screen and (max-width:782px){.wpseo-kb-search-search-bar input[type=text]{padding:6px 5px;font-size:14px;line-height:normal}}@media screen and (max-width:600px){.wpseo-kb-search-search-bar form{display:block;max-width:none}.wpseo-kb-search-search-bar input[type=text]{width:100%;margin-right:0}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/metabox-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/metabox-471.min.css deleted file mode 100644 index a930f33b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/metabox-471.min.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-section{width:auto;max-width:640px}.snippet_container:after,.snippet_container:before{display:table;content:" "}.snippet_container:after{clear:both}.snippet-editor__view{clear:both;background:#fff}.snippet-editor__view-toggle{display:inline-block;margin-top:10px;margin-left:20px;border:1px solid #dbdbdb;border-radius:4px;background-color:#f7f7f7;vertical-align:top}.snippet-editor__view-icon{float:left;width:31px;height:31px;border:none;border-bottom:4px solid transparent;outline:0;background-color:transparent;background-repeat:no-repeat;background-position:center,center;cursor:pointer}.snippet-editor__view-icon:focus,.snippet-editor__view-icon:hover{border-color:#1074a8;background-color:#fff;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out}.snippet-editor__view-icon--active{border-color:#555;transition:.15s color ease-in-out,.15s background-color ease-in-out,.15s border-color ease-in-out}.snippet-editor__view-icon.yoast-tooltip:before{bottom:-10px}.snippet-editor__view-icon.yoast-tooltip:after{margin-top:10px}.snippet-editor__view-icon-desktop{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1728%20992v%2D832q0%2D13%2D9%2E5%2D22%2E5t%2D22%2E5%2D9%2E5h%2D1600q%2D13%200%2D22%2E5%209%2E5t%2D9%2E5%2022%2E5v832q0%2013%209%2E5%2022%2E5t22%2E5%209%2E5h1600q13%200%2022%2E5%2D9%2E5t9%2E5%2D22%2E5zm128%2D832v1088q0%2066%2D47%20113t%2D113%2047h%2D544q0%2037%2016%2077%2E5t32%2071%2016%2043%2E5q0%2026%2D19%2045t%2D45%2019h%2D512q%2D26%200%2D45%2D19t%2D19%2D45q0%2D14%2016%2D44t32%2D70%2016%2D78h%2D544q%2D66%200%2D113%2D47t%2D47%2D113v%2D1088q0%2D66%2047%2D113t113%2D47h1600q66%200%20113%2047t47%20113z%22%2F%3E%3C%2Fsvg%3E");background-size:18px}.snippet-editor__view-icon-desktop:focus,.snippet-editor__view-icon-desktop:hover{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%231074a8%22%20d%3D%22M1728%20992v%2D832q0%2D13%2D9%2E5%2D22%2E5t%2D22%2E5%2D9%2E5h%2D1600q%2D13%200%2D22%2E5%209%2E5t%2D9%2E5%2022%2E5v832q0%2013%209%2E5%2022%2E5t22%2E5%209%2E5h1600q13%200%2022%2E5%2D9%2E5t9%2E5%2D22%2E5zm128%2D832v1088q0%2066%2D47%20113t%2D113%2047h%2D544q0%2037%2016%2077%2E5t32%2071%2016%2043%2E5q0%2026%2D19%2045t%2D45%2019h%2D512q%2D26%200%2D45%2D19t%2D19%2D45q0%2D14%2016%2D44t32%2D70%2016%2D78h%2D544q%2D66%200%2D113%2D47t%2D47%2D113v%2D1088q0%2D66%2047%2D113t113%2D47h1600q66%200%20113%2047t47%20113z%22%2F%3E%3C%2Fsvg%3E")}.snippet-editor__view-icon-mobile{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M976%201408q0%2D33%2D23%2E5%2D56%2E5t%2D56%2E5%2D23%2E5%2D56%2E5%2023%2E5%2D23%2E5%2056%2E5%2023%2E5%2056%2E5%2056%2E5%2023%2E5%2056%2E5%2D23%2E5%2023%2E5%2D56%2E5zm208%2D160v%2D704q0%2D13%2D9%2E5%2D22%2E5t%2D22%2E5%2D9%2E5h%2D512q%2D13%200%2D22%2E5%209%2E5t%2D9%2E5%2022%2E5v704q0%2013%209%2E5%2022%2E5t22%2E5%209%2E5h512q13%200%2022%2E5%2D9%2E5t9%2E5%2D22%2E5zm%2D192%2D848q0%2D16%2D16%2D16h%2D160q%2D16%200%2D16%2016t16%2016h160q16%200%2016%2D16zm288%2D16v1024q0%2052%2D38%2090t%2D90%2038h%2D512q%2D52%200%2D90%2D38t%2D38%2D90v%2D1024q0%2D52%2038%2D90t90%2D38h512q52%200%2090%2038t38%2090z%22%2F%3E%3C%2Fsvg%3E");background-size:22px}.snippet-editor__view-icon-mobile:focus,.snippet-editor__view-icon-mobile:hover{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%231074a8%22%20d%3D%22M976%201408q0%2D33%2D23%2E5%2D56%2E5t%2D56%2E5%2D23%2E5%2D56%2E5%2023%2E5%2D23%2E5%2056%2E5%2023%2E5%2056%2E5%2056%2E5%2023%2E5%2056%2E5%2D23%2E5%2023%2E5%2D56%2E5zm208%2D160v%2D704q0%2D13%2D9%2E5%2D22%2E5t%2D22%2E5%2D9%2E5h%2D512q%2D13%200%2D22%2E5%209%2E5t%2D9%2E5%2022%2E5v704q0%2013%209%2E5%2022%2E5t22%2E5%209%2E5h512q13%200%2022%2E5%2D9%2E5t9%2E5%2D22%2E5zm%2D192%2D848q0%2D16%2D16%2D16h%2D160q%2D16%200%2D16%2016t16%2016h160q16%200%2016%2D16zm288%2D16v1024q0%2052%2D38%2090t%2D90%2038h%2D512q%2D52%200%2D90%2D38t%2D38%2D90v%2D1024q0%2D52%2038%2D90t90%2D38h512q52%200%2090%2038t38%2090z%22%2F%3E%3C%2Fsvg%3E")}.snippet-editor__view--desktop{overflow:auto;width:640px;max-width:100%;padding:0 20px}.snippet-editor__view .snippet_container__title{width:600px;white-space:nowrap}.snippet-editor__view .snippet_container__title .title{display:inline-block;overflow:hidden;max-width:600px;vertical-align:top;text-overflow:ellipsis}.snippet-editor__view .snippet_container__title .title#snippet_sitename{display:inline}.snippet-editor__view .snippet_container__url{width:600px;line-height:1;white-space:nowrap}.snippet-editor__view .snippet_container__url .urlFull{display:inline-block;overflow:hidden;max-width:586px;font-size:14px;line-height:16px;vertical-align:top;text-overflow:ellipsis}.snippet-editor__view .snippet_container .down_arrow{display:inline-block;margin-top:6px;margin-left:6px;border-top:5px solid #006621;border-right:4px solid transparent;border-left:4px solid transparent;vertical-align:top}.snippet-editor__view .snippet_container__meta{width:600px}.snippet-editor__view--mobile{margin:0 20px 10px;padding:11px 0;border-bottom:1px hidden #fff;border-radius:2px;box-shadow:0 1px 2px rgba(0,0,0,.2)}.snippet-editor__view--mobile .snippet_container{display:block;line-height:20px}.snippet-editor__view--mobile .snippet_container__meta,.snippet-editor__view--mobile .snippet_container__title,.snippet-editor__view--mobile .snippet_container__url{box-sizing:border-box;width:100%}.snippet-editor__view--mobile .snippet_container__title{overflow:visible;padding:0 16px;white-space:normal;word-wrap:break-word}.snippet-editor__view--mobile .snippet_container__title .title{font-size:16px;line-height:20px}.snippet-editor__view--mobile .snippet_container__url{margin-bottom:9px;padding:0 16px 9px;border-bottom:1px solid #ebebeb}.snippet-editor__view--mobile .snippet_container__url .urlFull{max-width:100%;font-size:14px;line-height:20px}.snippet-editor__view--mobile .snippet_container .down_arrow{display:none}.snippet-editor__view--mobile .snippet_container__meta{padding:0 16px;font-size:14px;line-height:20px}.snippet-editor__view--mobile .snippet_container .desc{font-size:14px;line-height:20px}.snippet-editor__is-scrollable-hintwrapper{display:none;margin:1em 0 5px;text-align:center}.snippet-editor__view--desktop.snippet-editor__view--desktop-has-scroll+.snippet-editor__is-scrollable-hintwrapper{display:block}.snippet-editor__is-scrollable-hint{display:inline-block}.snippet-editor__is-scrollable-hint:before{display:inline-block;margin-right:10px;font-size:20px;line-height:inherit;vertical-align:text-top;content:"\21c4"}.snippet-editor__container{position:relative;cursor:pointer}.snippet-editor__container.editable-preview__container--no-caret{cursor:auto}.snippet-editor__heading{margin:0 0 15px;padding:8px 20px;color:#555;font-family:"Open Sans",sans-serif;font-size:.9rem;font-weight:300}.snippet-editor__heading-editor{border-top:1px solid #f7f7f7}.snippet-editor__heading-icon{padding-left:45px;background-repeat:no-repeat;background-position:left 20px top .6em;background-size:16px}.snippet-editor__container--focus:before,.snippet-editor__container--focus:hover:before,.snippet-editor__container:hover:before{position:absolute;left:-22px;width:24px;height:24px;background-size:25px;content:"";display:block;top:-3px}.snippet-editor__heading-icon-eye{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1664%20960q%2D152%2D236%2D381%2D353%2061%20104%2061%20225%200%20185%2D131%2E5%20316%2E5t%2D316%2E5%20131%2E5%2D316%2E5%2D131%2E5%2D131%2E5%2D316%2E5q0%2D121%2061%2D225%2D229%20117%2D381%20353%20133%20205%20333%2E5%20326%2E5t434%2E5%20121%2E5%20434%2E5%2D121%2E5%20333%2E5%2D326%2E5zm%2D720%2D384q0%2D20%2D14%2D34t%2D34%2D14q%2D125%200%2D214%2E5%2089%2E5t%2D89%2E5%20214%2E5q0%2020%2014%2034t34%2014%2034%2D14%2014%2D34q0%2D86%2061%2D147t147%2D61q20%200%2034%2D14t14%2D34zm848%20384q0%2034%2D20%2069%2D140%20230%2D376%2E5%20368%2E5t%2D499%2E5%20138%2E5%2D499%2E5%2D139%2D376%2E5%2D368q%2D20%2D35%2D20%2D69t20%2D69q140%2D229%20376%2E5%2D368t499%2E5%2D139%20499%2E5%20139%20376%2E5%20368q20%2035%2020%2069z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__container:hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23bfbfbf%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__container--focus:before,.snippet-editor__container--focus:hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__preview{max-width:640px;padding:0 0 15px}.snippet-editor__preview #help-yoast-snippetpreview{padding:0 20px}.snippet-editor__button{padding:8px 10px;border:1px solid #dbdbdb;border-radius:4px;color:#555;background:#f7f7f7;font-size:.8rem;line-height:15px;cursor:pointer}.snippet-editor__edit-button{display:inline-block;box-sizing:border-box;margin-top:10px;padding-left:32px;background:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M491%201536l91%2D91%2D235%2D235%2D91%2091v107h128v128h107zm523%2D928q0%2D22%2D22%2D22%2D10%200%2D17%207l%2D542%20542q%2D7%207%2D7%2017%200%2022%2022%2022%2010%200%2017%2D7l542%2D542q7%2D7%207%2D17zm%2D54%2D192l416%20416%2D832%20832h%2D416v%2D416zm683%2096q0%2053%2D37%2090l%2D166%20166%2D416%2D416%20166%2D165q36%2D38%2090%2D38%2053%200%2091%2038l235%20234q37%2039%2037%2091z%22%20%2F%3E%3C%2Fsvg%3E") left 8px top 50% no-repeat #f7f7f7;background-size:16px}.snippet-editor__form{padding:20px}.snippet-editor__label{display:block;position:relative;width:100%;margin-top:1em}.snippet-editor__label--focus:before,.snippet-editor__label--hover:before{left:-22px;width:24px;height:24px;background-size:25px;display:block;position:absolute;content:""}.snippet-editor__label:first-child{margin-top:0}.snippet-editor__label--hover:before{top:-3px;top:20px;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23bfbfbf%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__label--focus:before{top:-3px;top:20px;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%231074a8%22%20d%3D%22M1152%20896q0%2026%2D19%2045l%2D448%20448q%2D19%2019%2D45%2019t%2D45%2D19%2D19%2D45v%2D896q0%2D26%2019%2D45t45%2D19%2045%2019l448%20448q19%2019%2019%2045z%22%20%2F%3E%3C%2Fsvg%3E")}.snippet-editor__input{display:block;box-sizing:border-box;width:100%;max-width:100%;margin-top:5px;border:1px solid #bfbfbf}.snippet-editor__input:focus{border:1px solid #1074a8;outline:0}.rtl .snippet-editor__container:hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23bfbfbf%22%20d%3D%22M1216%20448v896q0%2026%2D19%2045t%2D45%2019%2D45%2D19l%2D448%2D448q%2D19%2D19%2D19%2D45t19%2D45l448%2D448q19%2D19%2045%2D19t45%2019%2019%2045z%22%2F%3E%3C%2Fsvg%3E")}.rtl .snippet-editor__container--focus:before,.rtl .snippet-editor__container--focus:hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1216%20448v896q0%2026%2D19%2045t%2D45%2019%2D45%2D19l%2D448%2D448q%2D19%2D19%2D19%2D45t19%2D45l448%2D448q19%2D19%2045%2D19t45%2019%2019%2045z%22%2F%3E%3C%2Fsvg%3E")}.rtl .snippet-editor__label--hover:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23bfbfbf%22%20d%3D%22M1216%20448v896q0%2026%2D19%2045t%2D45%2019%2D45%2D19l%2D448%2D448q%2D19%2D19%2D19%2D45t19%2D45l448%2D448q19%2D19%2045%2D19t45%2019%2019%2045z%22%2F%3E%3C%2Fsvg%3E")}.rtl .snippet-editor__label--focus:before{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%231074a8%22%20d%3D%22M1216%20448v896q0%2026%2D19%2045t%2D45%2019%2D45%2D19l%2D448%2D448q%2D19%2D19%2D19%2D45t19%2D45l448%2D448q19%2D19%2045%2D19t45%2019%2019%2045z%22%2F%3E%3C%2Fsvg%3E")}.snippet-editor__meta-description{height:70px}.snippet-editor__submit{margin-top:1em}#snippet_cite{min-width:20px}#meta_container{clear:both;min-height:20px}.snippet_container .title{margin:0;color:#1e0fbe;font-size:18px;font-weight:400;line-height:1.2;text-decoration:none}.snippet-editor__date,.snippet_container .desc{font-size:13px;line-height:1.4}.snippet_container .url{color:#006621;font-style:normal}.snippet_container .url strong{font-weight:700}.snippet_container .desc-default{color:#545454}.snippet_container .desc-default strong{color:#6a6a6a;font-weight:700}.snippet_container .desc-render{color:#777}.snippet_container .tooLong{color:red!important}.snippet-editor__field--invalid{color:red}.snippet-editor__progress{display:block;box-sizing:border-box;width:100%;height:8px;margin-top:5px;border:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.snippet-editor__progress::-webkit-progress-bar{height:8px;border:1px solid #bfbfbf;background-color:#f7f7f7}.snippet-editor__progress--fallback{height:8px;border:1px solid #bfbfbf;background-color:#f7f7f7}.snippet-editor__progress-bar{width:0;max-width:100%;height:100%}.snippet-editor__date{color:grey}.snippet-editor--hidden{display:none}.yoast-measurement-elements-holder{position:absolute;left:-9999em}.snippet-editor__progress--bad[value]{color:#dc3232}.snippet-editor__progress--bad[value]::-webkit-progress-value{background-color:#dc3232;transition:width 250ms}.snippet-editor__progress--bad[value]::-moz-progress-bar{background-color:#dc3232}.snippet-editor__progress--bad[value] .snippet-editor__progress-bar{background-color:#dc3232}.snippet-editor__progress--ok[value]{color:#ee7c1b}.snippet-editor__progress--ok[value]::-webkit-progress-value{background-color:#ee7c1b;transition:width 250ms}.snippet-editor__progress--ok[value]::-moz-progress-bar{background-color:#ee7c1b}.snippet-editor__progress--ok[value] .snippet-editor__progress-bar{background-color:#ee7c1b}.snippet-editor__progress--good[value]{color:#7ad03a}.snippet-editor__progress--good[value]::-webkit-progress-value{background-color:#7ad03a;transition:width 250ms}.snippet-editor__progress--good[value]::-moz-progress-bar{background-color:#7ad03a}.snippet-editor__progress--good[value] .snippet-editor__progress-bar{background-color:#7ad03a}.wpseoanalysis{padding-right:0}.wpseo-score-text{float:left;width:86%;width:calc(100% - 56px)}.assessment-results .wpseo-score-icon{float:left;width:12px;height:12px;margin:3px 10px 0 0;border-radius:50%;background:#888}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#999}.wpseo-score-icon.noindex{background-color:#1e8cbe}li.score{margin-bottom:6px;list-style-type:none!important}li.score:after{display:table;clear:both;content:""}.screen-reader-text{overflow:hidden;clip:rect(1px,1px,1px,1px);position:absolute!important;width:1px;height:1px}.assessment-results{clear:both}.assessment-results__mark.icon-eye-active,.assessment-results__mark.icon-eye-disabled,.assessment-results__mark.icon-eye-inactive{float:left;width:28px;height:28px;margin:-5px 3px 0;padding:4px;border:0;border-radius:100%;outline:0;background:center no-repeat;background-size:16px;cursor:pointer}.assessment-results__mark.icon-eye-inactive{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555555%22%20d%3D%22M1664%20960q%2D152%2D236%2D381%2D353%2061%20104%2061%20225%200%20185%2D131%2E5%20316%2E5t%2D316%2E5%20131%2E5%2D316%2E5%2D131%2E5%2D131%2E5%2D316%2E5q0%2D121%2061%2D225%2D229%20117%2D381%20353%20133%20205%20333%2E5%20326%2E5t434%2E5%20121%2E5%20434%2E5%2D121%2E5%20333%2E5%2D326%2E5zm%2D720%2D384q0%2D20%2D14%2D34t%2D34%2D14q%2D125%200%2D214%2E5%2089%2E5t%2D89%2E5%20214%2E5q0%2020%2014%2034t34%2014%2034%2D14%2014%2D34q0%2D86%2061%2D147t147%2D61q20%200%2034%2D14t14%2D34zm848%20384q0%2034%2D20%2069%2D140%20230%2D376%2E5%20368%2E5t%2D499%2E5%20138%2E5%2D499%2E5%2D139%2D376%2E5%2D368q%2D20%2D35%2D20%2D69t20%2D69q140%2D229%20376%2E5%2D368t499%2E5%2D139%20499%2E5%20139%20376%2E5%20368q20%2035%2020%2069z%22%20%2F%3E%3C%2Fsvg%3E")}.assessment-results__mark.icon-eye-active{background-color:#a4286a;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23ffffff%22%20d%3D%22M1664%20960q%2D152%2D236%2D381%2D353%2061%20104%2061%20225%200%20185%2D131%2E5%20316%2E5t%2D316%2E5%20131%2E5%2D316%2E5%2D131%2E5%2D131%2E5%2D316%2E5q0%2D121%2061%2D225%2D229%20117%2D381%20353%20133%20205%20333%2E5%20326%2E5t434%2E5%20121%2E5%20434%2E5%2D121%2E5%20333%2E5%2D326%2E5zm%2D720%2D384q0%2D20%2D14%2D34t%2D34%2D14q%2D125%200%2D214%2E5%2089%2E5t%2D89%2E5%20214%2E5q0%2020%2014%2034t34%2014%2034%2D14%2014%2D34q0%2D86%2061%2D147t147%2D61q20%200%2034%2D14t14%2D34zm848%20384q0%2034%2D20%2069%2D140%20230%2D376%2E5%20368%2E5t%2D499%2E5%20138%2E5%2D499%2E5%2D139%2D376%2E5%2D368q%2D20%2D35%2D20%2D69t20%2D69q140%2D229%20376%2E5%2D368t499%2E5%2D139%20499%2E5%20139%20376%2E5%20368q20%2035%2020%2069z%22%20%2F%3E%3C%2Fsvg%3E")}.assessment-results__mark.icon-eye-disabled{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23e6e6e6%22%20d%3D%22M1664%20960q%2D152%2D236%2D381%2D353%2061%20104%2061%20225%200%20185%2D131%2E5%20316%2E5t%2D316%2E5%20131%2E5%2D316%2E5%2D131%2E5%2D131%2E5%2D316%2E5q0%2D121%2061%2D225%2D229%20117%2D381%20353%20133%20205%20333%2E5%20326%2E5t434%2E5%20121%2E5%20434%2E5%2D121%2E5%20333%2E5%2D326%2E5zm%2D720%2D384q0%2D20%2D14%2D34t%2D34%2D14q%2D125%200%2D214%2E5%2089%2E5t%2D89%2E5%20214%2E5q0%2020%2014%2034t34%2014%2034%2D14%2014%2D34q0%2D86%2061%2D147t147%2D61q20%200%2034%2D14t14%2D34zm848%20384q0%2034%2D20%2069%2D140%20230%2D376%2E5%20368%2E5t%2D499%2E5%20138%2E5%2D499%2E5%2D139%2D376%2E5%2D368q%2D20%2D35%2D20%2D69t20%2D69q140%2D229%20376%2E5%2D368t499%2E5%2D139%20499%2E5%20139%20376%2E5%20368q20%2035%2020%2069z%22%20%2F%3E%3C%2Fsvg%3E")}.assessment-results__mark-container{display:inline-block;float:right;width:33px;min-height:1px}.YoastSEO_msg .left,.YoastSEO_msg .right{display:none}@keyframes animatedBackground{from{background-position:0 0}to{background-position:100% 0}}.YoastSEO_msg .bufferbar{display:block;width:100%;height:12px;margin:10px 0;border:1px solid #dfdfdf;background-image:linear-gradient(to left,#fff,#0063ff,#fff,#0063ff);background-position:0 0;background-size:300% 100%;animation:animatedBackground 5s linear infinite}.yoast-tooltip{position:relative}.yoast-tooltip::after,.yoast-tooltip::before{display:none;position:absolute;opacity:0;pointer-events:none}button.yoast-tooltip{overflow:visible}.yoast-tooltip::after{z-index:1000000;padding:5px 8px;border-radius:3px;color:#fff;background:rgba(0,0,0,.8);text-shadow:none;font:normal normal 11px/1.5 Helvetica,arial,nimbussansl,liberationsans,freesans,clean,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";text-align:center;white-space:pre;text-decoration:none;letter-spacing:normal;text-transform:none;word-wrap:break-word;content:attr(aria-label);-webkit-font-smoothing:subpixel-antialiased}.yoast-tooltip-alt::after{content:attr(data-label)}.yoast-tooltip::before{z-index:1000001;width:0;height:0;border:5px solid transparent;color:rgba(0,0,0,.8);content:"\00a0"}@keyframes yoast-tooltip-appear{from{opacity:0}to{opacity:1}}.yoast-tooltip:active::after,.yoast-tooltip:active::before,.yoast-tooltip:focus::after,.yoast-tooltip:focus::before,.yoast-tooltip:hover::after,.yoast-tooltip:hover::before{display:inline-block;text-decoration:none;animation-name:yoast-tooltip-appear;animation-duration:.1s;animation-timing-function:ease-in;animation-delay:.4s;animation-fill-mode:forwards}.yoast-tooltip-no-delay:active::after,.yoast-tooltip-no-delay:active::before,.yoast-tooltip-no-delay:focus::after,.yoast-tooltip-no-delay:focus::before,.yoast-tooltip-no-delay:hover::after,.yoast-tooltip-no-delay:hover::before{opacity:1;animation:none}.yoast-tooltip-multiline:active::after,.yoast-tooltip-multiline:focus::after,.yoast-tooltip-multiline:hover::after{display:table-cell}.yoast-tooltip-s::after,.yoast-tooltip-se::after,.yoast-tooltip-sw::after{top:100%;right:50%;margin-top:5px}.yoast-tooltip-s::before,.yoast-tooltip-se::before,.yoast-tooltip-sw::before{top:auto;right:50%;bottom:-5px;margin-right:-5px;border-bottom-color:rgba(0,0,0,.8)}.yoast-tooltip-se::after{right:auto;left:50%;margin-left:-15px}.yoast-tooltip-sw::after{margin-right:-15px}.yoast-tooltip-n::after,.yoast-tooltip-ne::after,.yoast-tooltip-nw::after{right:50%;bottom:100%;margin-bottom:5px}.yoast-tooltip-n::before,.yoast-tooltip-ne::before,.yoast-tooltip-nw::before{top:-5px;right:50%;bottom:auto;margin-right:-5px;border-top-color:rgba(0,0,0,.8)}.yoast-tooltip-ne::after{right:auto;left:50%;margin-left:-15px}.yoast-tooltip-nw::after{margin-right:-15px}.yoast-tooltip-n::after,.yoast-tooltip-s::after{-ms-transform:translateX(50%);transform:translateX(50%)}.yoast-tooltip-w::after{right:100%;bottom:50%;margin-right:5px;-ms-transform:translateY(50%);transform:translateY(50%)}.yoast-tooltip-w::before{top:50%;bottom:50%;left:-5px;margin-top:-5px;border-left-color:rgba(0,0,0,.8)}.yoast-tooltip-e::after{bottom:50%;left:100%;margin-left:5px;-ms-transform:translateY(50%);transform:translateY(50%)}.yoast-tooltip-e::before{top:50%;right:-5px;bottom:50%;margin-top:-5px;border-right-color:rgba(0,0,0,.8)}.yoast-tooltip-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;border-collapse:separate;white-space:pre-line;word-wrap:normal;word-break:break-word}.yoast-tooltip-multiline.yoast-tooltip-n::after,.yoast-tooltip-multiline.yoast-tooltip-s::after{right:auto;left:50%;-ms-transform:translateX(-50%);transform:translateX(-50%)}.yoast-tooltip-multiline.yoast-tooltip-e::after,.yoast-tooltip-multiline.yoast-tooltip-w::after{right:100%}@media screen and (min-width:0\0){.yoast-tooltip-multiline::after{width:250px}}.yoast-tooltip-sticky::after,.yoast-tooltip-sticky::before{display:inline-block}.yoast-tooltip-sticky.yoast-tooltip-multiline::after{display:table-cell}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-moz-min-device-pixel-ratio:2),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.yoast-tooltip-w::after{margin-right:4.5px}}.wpseo-tab-video-container{margin-bottom:20px;border-bottom:1px solid #a4286a}.yoast-help-center-open .wpseo-tab-video-container{border-bottom:none}.postbox .wpseo-tab-video-container{margin-right:-12px;margin-left:-12px}.wpseo-tab-video-container__handle{width:100%;margin:0;padding:10px 12px;border:none;outline:0;color:#a4286a;background:0 0;line-height:19px;text-align:left;cursor:pointer}.wpseo-tab-video-container__handle:focus,.wpseo-tab-video-container__handle:hover{text-decoration:underline}.wpseo-tab-video-container__handle .toggle__arrow,.wpseo-tab-video-slideout a.button,.wpseo-tab-video-slideout a.button-primary{text-decoration:none}.wpseo-tab-video-container__handle .dashicons-before:before{margin-right:5px}.wpseo-tab-video-container .wpseo-premium-popup{max-width:770px}.wpseo-tab-video-slideout{display:-ms-flexbox;display:flex;padding:2em 0;background-color:#a4286a;box-shadow:inset 0 10px 10px -5px rgba(123,30,80,.5),inset 0 -10px 10px -5px rgba(123,30,80,.5)}.wpseo-admin-page .wpseo-tab-video-slideout{border:1px solid #e5e5e5;border-top:0}.wpseo-tab-video-slideout.hidden{display:none}.wpseo-tab-video-slideout .yoast-help-center-tabs{padding:0 0 1em;color:#fff;background-color:#a4286a;-ms-flex:0 0 164px;flex:0 0 164px}.wpseo-tab-video-slideout .yoast-help-center-tabs ul{margin:0}.wpseo-tab-video-slideout .yoast-help-center-tabs-wrap{max-width:916px;padding:0;-ms-flex:0 1 916px;flex:0 1 916px}.wpseo-tab-video-slideout .yoast-help-tab-content{display:none;padding:0 12px;color:#fff;font-weight:300}.wpseo-tab-video-slideout .yoast-help-tab-content.active{display:block}.wpseo-tab-video-slideout .yoast-help-tab-content.active.yoast-help-tab-content-video{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.wpseo-tab-video-slideout .yoast-help-tab-content li{margin:2px 10px;list-style:disc inside}.wpseo-tab-video-slideout .wpseo-tab-video__panel--video{max-width:560px;margin-right:12px;padding-bottom:12px;-ms-flex:0 1 560px;flex:0 1 560px}.wpseo-tab-video-slideout .wpseo-tab-video__panel--video iframe{vertical-align:middle}.wpseo-tab-video-slideout .wpseo-tab-video__panel--text{min-width:220px;max-width:560px;-ms-flex:1 1 220px;flex:1 1 220px}.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea{margin:0 0 12px;padding:15px 15px 5px;border:1px solid #fff;border-radius:30px 30px 0;color:#fff;background-color:#a4286a}.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea a,.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea a:focus,.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea a:hover{color:#fff;font-weight:500}.wpseo-tab-video-slideout .wpseo-tab-video__panel__textarea h3{margin:0}.wpseo-tab-video-slideout a{color:#fff}#wpseo_meta .wpseo-tab-video-slideout h2,.wpseo-tab-video-slideout h1,.wpseo-tab-video-slideout h2,.wpseo-tab-video-slideout h3,.wpseo-tab-video-slideout h4,.wpseo-tab-video-slideout h5,.wpseo-tab-video-slideout h6{margin-top:.5em;margin-bottom:1em;padding:0;color:#fff;font-size:1.3em;font-weight:400;line-height:1.4}.wpseo-help-center-item{display:inline}.wpseo-help-center-item a{display:block;padding:10px 12px;color:#fff;line-height:20px;text-decoration:none}.wpseo-help-center-item a:focus,.wpseo-help-center-item a:hover{text-decoration:underline}.wpseo-help-center-item a.dashicons-before:before{margin-right:3px;text-decoration:none}.wpseo-help-center-item.active a{color:#a4286a;background-color:#fff}@media screen and (max-width:1280px){.columns-2 .wpseo-tab-video-slideout .wpseo-tab-video__panel--video{margin-right:0}}@media screen and (max-width:1024px){.wpseo-tab-video-slideout .wpseo-tab-video__panel--video{margin-right:0;flex-basis:100%;-ms-flex-preferred-size:100%}.columns-2 .wpseo-tab-video-slideout{display:block}.columns-2 .wpseo-tab-video-slideout.hidden{display:none}.columns-2 .wpseo-tab-video-slideout .yoast-help-center-tabs{width:auto;padding-right:12px;padding-left:12px}.columns-2 .wpseo-tab-video-slideout .yoast-help-tab-content.active.yoast-help-tab-content-video{display:block;padding:0}.columns-2 .wpseo-tab-video-slideout .wpseo-tab-video__panel--video{max-width:none}.columns-2 .wpseo-tab-video-slideout .wpseo-tab-video__panel--text{max-width:none;padding:0 12px}.columns-2 .wpseo-help-center-item a{display:inline-block;margin:0 4px 8px 0;border:1px solid rgba(255,255,255,.5)}}@media screen and (max-width:782px){.wpseo-tab-video-slideout{display:block}.wpseo-tab-video-slideout .yoast-help-center-tabs{width:auto;padding-right:12px;padding-left:12px}.wpseo-tab-video-slideout .yoast-help-tab-content.active.yoast-help-tab-content-video{display:block;padding:0}.wpseo-tab-video-slideout .wpseo-tab-video__panel--video{max-width:none}.wpseo-tab-video-slideout .wpseo-tab-video__panel--text{max-width:none;padding:0 12px}.wpseo-help-center-item a{display:inline-block;margin:0 4px 8px 0;border:1px solid rgba(255,255,255,.5)}.wpseo-premium-popup-icon{display:none}}.yoast-section{position:relative;padding:0 20px 15px;background-color:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2)}.yoast-section__heading{margin:0 -20px 15px;padding:8px 20px;color:#555;font-family:"Open Sans",sans-serif;font-size:.9rem;font-weight:300}.wpseotab label,.wpseotab legend{font-weight:600}.yoast-section__heading-icon{padding-left:45px;background-repeat:no-repeat;background-position:left 20px top .6em;background-size:16px}.yoast-section__heading-icon-file-text-o{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20file%3D%22%23555%22%20d%3D%22M1596%20380q28%2028%2048%2076t20%2088v1152q0%2040%2D28%2068t%2D68%2028h%2D1344q%2D40%200%2D68%2D28t%2D28%2D68v%2D1600q0%2D40%2028%2D68t68%2D28h896q40%200%2088%2020t76%2048zm%2D444%2D244v376h376q%2D10%2D29%2D22%2D41l%2D313%2D313q%2D12%2D12%2D41%2D22zm384%201528v%2D1024h%2D416q%2D40%200%2D68%2D28t%2D28%2D68v%2D416h%2D768v1536h1280zm%2D1024%2D864q0%2D14%209%2D23t23%2D9h704q14%200%2023%209t9%2023v64q0%2014%2D9%2023t%2D23%209h%2D704q%2D14%200%2D23%2D9t%2D9%2D23v%2D64zm736%20224q14%200%2023%209t9%2023v64q0%2014%2D9%2023t%2D23%209h%2D704q%2D14%200%2D23%2D9t%2D9%2D23v%2D64q0%2D14%209%2D23t23%2D9h704zm0%20256q14%200%2023%209t9%2023v64q0%2014%2D9%2023t%2D23%209h%2D704q%2D14%200%2D23%2D9t%2D9%2D23v%2D64q0%2D14%209%2D23t23%2D9h704z%22%2F%3E%3C%2Fsvg%3E")}.yoast-section,.yoast-section *,.yoast-section :after,.yoast-section :before,.yoast-section:after,.yoast-section:before{box-sizing:border-box}#edittag>#wp-description-wrap{display:none}#wp-description-wrap .wp-editor-area{border:0}.term-description-wrap td>textarea#description{min-height:530px}ul.wpseo-metabox-tabs{display:none;margin-top:6px;margin-bottom:0}ul.wpseo-metabox-tabs:after{display:table;clear:both;content:""}.wpseo-metabox-tabs-div ul{list-style:none}ul.wpseo-metabox-tabs li.active{background-color:#fdfdfd}.wpseo-meta-section{display:none;width:100%;max-width:calc(100% - 50px);vertical-align:top}.wpseo-meta-section.active{display:inline-block}.wpseo-metabox-sidebar{float:left;width:50px;padding:0;background-color:#fff}.wpseo-metabox-sidebar ul{margin:0}.wpseo-metabox-sidebar li{display:inline-block;margin-bottom:0;padding:5px}.wpseo-metabox-sidebar a{display:inline-block;width:35px;height:35px;font-size:20px;line-height:30px;text-decoration:none}.wpseo-metabox-sidebar li span{margin:3px 0 0 -5px;padding:0 2px 0 5px;border:0 solid transparent;border-left-width:3px;border-radius:3px}.wpseo-metabox-sidebar li span.wpseo-buy-premium{color:#a4286a}.wpseo-metabox-sidebar li span.wpseo-buy-premium:hover{color:#832055}.wpseo-metabox-sidebar li.active span{border-color:#333;color:#333}.wpseo-metabox-sidebar li.active span.wpseo-buy-premium{border-color:#a4286a;color:#a4286a}.wpseo-metabox-sidebar li.active span.wpseo-buy-premium:hover{border-color:#832055;color:#832055}ul.wpseo-metabox-tabs li{float:left;margin-right:5px;margin-bottom:-1px;padding:0;border:1px solid #dfdfdf;border-bottom:0 none}ul.wpseo-metabox-tabs li .wpseo-keyword{display:inline-block;overflow:hidden;max-width:8em;max-width:8rem;vertical-align:top;white-space:nowrap;text-overflow:ellipsis}.wpseotab{display:none;padding:20px 35px;border:1px solid #ddd;background-color:#fdfdfd}.wpseotab .wpseo-cornerstone-checkbox{margin-right:.5em}.wpseotab.content{padding:20px 15px}.wpseotab.active{display:block}#wpseofocuskeyword,#wpseometakeywords,#wpseosnippet{margin-bottom:2em}.wpseo-metabox-tabs .wpseo_tablink{display:inline-block;padding:5px 12px 6px;vertical-align:top;text-decoration:none}.wpseo-metabox-tabs .wpseo_content_tab a,.wpseo-metabox-tabs .wpseo_content_tab+.wpseo_keyword_tab a{padding-right:12px}.wpseo-metabox-tabs .wpseo-score-icon{margin-left:0}#wpseo-meta-section-social .wpseo-metabox-tabs .wpseo_tablink{padding:5px 7px}.wpseo-metabox-tabs .wpseo_tablink .dashicons{width:16px;height:16px;font-size:16px}.wpseo-metabox-sidebar .dashicons{width:30px;height:30px;font-size:30px}.wpseo-metabox-tabs-div div.wpseo-tabs-panel{overflow:auto;padding:.5em .9em;border:1px solid}#wpseo_meta .inside{margin:0}#wpseo_meta .postbox .inside .wpseotab{font-size:13px!important}.wpseotab .select2-container,.wpseotab input,.wpseotab label,.wpseotab p.error-message,.wpseotab textarea,.yoast-metabox__description{max-width:600px}.wpseotab fieldset{padding-top:5px}.wpseotab label{display:block}.wpseotab input[type=radio]+label,.wpseotab input[type=checkbox]+label{display:inline-block;font-weight:400}.wpseotab fieldset,.wpseotab label{margin-top:2em;margin-bottom:.5em}.wpseotab input[type=checkbox],.wpseotab input[type=checkbox]+label{margin-top:2em;margin-bottom:0;font-size:1em}.wpseotab fieldset:first-child,.wpseotab input[type=checkbox]:first-child,.wpseotab input[type=checkbox]:first-child+label,.wpseotab label:first-child{margin-top:10px}.wpseotab input[type=radio]{margin-top:0}.wpseotab input[type=radio]+label{margin:0 1em 0 0}.wpseotab p.error-message,.yoast-metabox__description{margin:.5em 0}.wpseotab #yoast_wpseo_focuskw_text_input,.wpseotab #yoast_wpseo_metakeywords,.wpseotab select[multiple]{margin-top:0}.wpseotab .wpseo_image_upload_button{margin-left:3px}.good,.warn,.wrong{font-weight:600}.good{color:green}.warn{color:maroon}.wrong{color:#dc3232}#current_seo_title span{padding:2px 5px;background-color:#ffffe0}#focuskwresults ul{margin:0}#focuskwresults li,#focuskwresults p{font-size:13px}#focuskwresults li{margin:0 0 0 20px;list-style-type:disc}.wpseo_hidden{display:none}.wpseo_msg{margin:5px 0 10px;padding:0 5px;border:1px solid #e6db55;background-color:#ffffe0}ul.wpseo-metabox-tabs li.wpseo-tab-add-keyword{border:none}.wpseo-tab-add-keyword .wpseo-add-keyword.button{height:auto;margin-top:1px;padding:3px 6px;color:#000;background:0 0;font-size:12px;line-height:1;vertical-align:top;text-decoration:none;cursor:pointer}#wpseo-add-keyword-popup-title{margin:1em 0;font-size:1.3em}.snippet-editor__button.snippet-editor__edit-button:focus{border-color:#5b9dd9;outline:0;color:#23282d;background-color:#fafafa;box-shadow:0 0 3px rgba(0,115,170,.8)}.yoast_help.yoast-help-button{overflow:visible;position:relative;width:20px;height:20px;margin:0;padding:0;border:0;outline:0;color:#72777c;background:0 0;box-shadow:none;vertical-align:top;cursor:pointer}.wpseotab .yoast_help.yoast-help-button{float:right}.wpseotab.content .yoast_help.yoast-help-button{margin-top:-47px}.wpseo-admin-page .yoast_help.yoast-help-button{margin-right:6px}.yoast_help.yoast-help-button:before{position:absolute;top:0;left:0;padding:4px;content:"\f223"}.yoast_help.yoast-help-button:focus,.yoast_help.yoast-help-button:hover{color:#0073aa}.assessment-results__mark:focus,.yoast_help.yoast-help-button:focus:before{border-radius:100%;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.yoast-help-panel{display:none;max-width:30em!important;padding:0 0 1em;font-weight:400;white-space:normal}.wpseo-admin-page .subsubsub li{display:inline;max-width:none}.yoast-seo-help-container{float:left;width:100%;max-width:none}.yoast-seo-help-container .yoast-help-panel{margin:.5em 0!important}.wpseo_content_wrapper p.search-box{margin:10px 0 5px}.wpseo-metabox-tabs .active a{color:#333}#wpseotab .ui-widget-content .ui-state-hover{border:1px solid #dfdfdf;color:#333;background:#f1f1f1}.yst-traffic-light-container{display:block;height:30px}.yst-traffic-light{width:19px;height:30px;margin:0 0 0 5px}.yst-traffic-light .traffic-light-color{display:none}.yst-traffic-light.bad .traffic-light-red,.yst-traffic-light.good .traffic-light-green,.yst-traffic-light.init .traffic-light-init,.yst-traffic-light.na .traffic-light-empty,.yst-traffic-light.ok .traffic-light-orange{display:inline}#wpseo-score{float:left;margin:0 5px 0 -5px}.yoast-seo-score .yoast-logo.svg{float:left;width:18px;height:18px;margin-right:5px;background:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23999%22%20d%3D%22M403%20218h691l%2D26%2072h%2D665q%2D110%200%2D188%2E5%2079t%2D78%2E5%20189v771q0%2095%2060%2E5%20169%2E5t153%2E5%2093%2E5q23%205%2098%205v72h%2D45q%2D140%200%2D239%2E5%2D100t%2D99%2E5%2D240v%2D771q0%2D140%2099%2E5%2D240t239%2E5%2D100zm851%2D218h247l%2D482%201294q%2D23%2061%2D40%2E5%20103%2E5t%2D45%2098%2D54%2093%2E5%2D64%2E5%2078%2E5%2D79%2E5%2065%2D95%2E5%2041%2D116%2018%2E5v%2D195q163%2D26%20220%2D182%2020%2D52%2020%2D105%200%2D54%2D20%2D106l%2D285%2D733h228l187%20585zm474%20558v1111h%2D795q37%2D55%2045%2D73h678v%2D1038q0%2D85%2D49%2E5%2D155t%2D129%2E5%2D99l25%2D67q101%2034%20163%2E5%20123%2E5t62%2E5%20197%2E5z%22%2F%3E%3C%2Fsvg%3E") no-repeat;background-size:18px}.yoast-seo-score .yoast-logo.svg.good{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%237ad03a%22%20d%3D%22M403%20218h691l%2D26%2072h%2D665q%2D110%200%2D188%2E5%2079t%2D78%2E5%20189v771q0%2095%2060%2E5%20169%2E5t153%2E5%2093%2E5q23%205%2098%205v72h%2D45q%2D140%200%2D239%2E5%2D100t%2D99%2E5%2D240v%2D771q0%2D140%2099%2E5%2D240t239%2E5%2D100zm851%2D218h247l%2D482%201294q%2D23%2061%2D40%2E5%20103%2E5t%2D45%2098%2D54%2093%2E5%2D64%2E5%2078%2E5%2D79%2E5%2065%2D95%2E5%2041%2D116%2018%2E5v%2D195q163%2D26%20220%2D182%2020%2D52%2020%2D105%200%2D54%2D20%2D106l%2D285%2D733h228l187%20585zm474%20558v1111h%2D795q37%2D55%2045%2D73h678v%2D1038q0%2D85%2D49%2E5%2D155t%2D129%2E5%2D99l25%2D67q101%2034%20163%2E5%20123%2E5t62%2E5%20197%2E5z%22%2F%3E%3C%2Fsvg%3E")}.yoast-seo-score .yoast-logo.svg.ok{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23ee7c1b%22%20d%3D%22M403%20218h691l%2D26%2072h%2D665q%2D110%200%2D188%2E5%2079t%2D78%2E5%20189v771q0%2095%2060%2E5%20169%2E5t153%2E5%2093%2E5q23%205%2098%205v72h%2D45q%2D140%200%2D239%2E5%2D100t%2D99%2E5%2D240v%2D771q0%2D140%2099%2E5%2D240t239%2E5%2D100zm851%2D218h247l%2D482%201294q%2D23%2061%2D40%2E5%20103%2E5t%2D45%2098%2D54%2093%2E5%2D64%2E5%2078%2E5%2D79%2E5%2065%2D95%2E5%2041%2D116%2018%2E5v%2D195q163%2D26%20220%2D182%2020%2D52%2020%2D105%200%2D54%2D20%2D106l%2D285%2D733h228l187%20585zm474%20558v1111h%2D795q37%2D55%2045%2D73h678v%2D1038q0%2D85%2D49%2E5%2D155t%2D129%2E5%2D99l25%2D67q101%2034%20163%2E5%20123%2E5t62%2E5%20197%2E5z%22%2F%3E%3C%2Fsvg%3E")}.yoast-seo-score .yoast-logo.svg.bad{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23dc3232%22%20d%3D%22M403%20218h691l%2D26%2072h%2D665q%2D110%200%2D188%2E5%2079t%2D78%2E5%20189v771q0%2095%2060%2E5%20169%2E5t153%2E5%2093%2E5q23%205%2098%205v72h%2D45q%2D140%200%2D239%2E5%2D100t%2D99%2E5%2D240v%2D771q0%2D140%2099%2E5%2D240t239%2E5%2D100zm851%2D218h247l%2D482%201294q%2D23%2061%2D40%2E5%20103%2E5t%2D45%2098%2D54%2093%2E5%2D64%2E5%2078%2E5%2D79%2E5%2065%2D95%2E5%2041%2D116%2018%2E5v%2D195q163%2D26%20220%2D182%2020%2D52%2020%2D105%200%2D54%2D20%2D106l%2D285%2D733h228l187%20585zm474%20558v1111h%2D795q37%2D55%2045%2D73h678v%2D1038q0%2D85%2D49%2E5%2D155t%2D129%2E5%2D99l25%2D67q101%2034%20163%2E5%20123%2E5t62%2E5%20197%2E5z%22%2F%3E%3C%2Fsvg%3E")}.yoast-seo-score .yoast-logo.svg.na{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23999%22%20d%3D%22M403%20218h691l%2D26%2072h%2D665q%2D110%200%2D188%2E5%2079t%2D78%2E5%20189v771q0%2095%2060%2E5%20169%2E5t153%2E5%2093%2E5q23%205%2098%205v72h%2D45q%2D140%200%2D239%2E5%2D100t%2D99%2E5%2D240v%2D771q0%2D140%2099%2E5%2D240t239%2E5%2D100zm851%2D218h247l%2D482%201294q%2D23%2061%2D40%2E5%20103%2E5t%2D45%2098%2D54%2093%2E5%2D64%2E5%2078%2E5%2D79%2E5%2065%2D95%2E5%2041%2D116%2018%2E5v%2D195q163%2D26%20220%2D182%2020%2D52%2020%2D105%200%2D54%2D20%2D106l%2D285%2D733h228l187%20585zm474%20558v1111h%2D795q37%2D55%2045%2D73h678v%2D1038q0%2D85%2D49%2E5%2D155t%2D129%2E5%2D99l25%2D67q101%2034%20163%2E5%20123%2E5t62%2E5%20197%2E5z%22%2F%3E%3C%2Fsvg%3E")}.yoast-seo-score .yoast-logo.svg.noindex{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%231e8cbe%22%20d%3D%22M403%20218h691l%2D26%2072h%2D665q%2D110%200%2D188%2E5%2079t%2D78%2E5%20189v771q0%2095%2060%2E5%20169%2E5t153%2E5%2093%2E5q23%205%2098%205v72h%2D45q%2D140%200%2D239%2E5%2D100t%2D99%2E5%2D240v%2D771q0%2D140%2099%2E5%2D240t239%2E5%2D100zm851%2D218h247l%2D482%201294q%2D23%2061%2D40%2E5%20103%2E5t%2D45%2098%2D54%2093%2E5%2D64%2E5%2078%2E5%2D79%2E5%2065%2D95%2E5%2041%2D116%2018%2E5v%2D195q163%2D26%20220%2D182%2020%2D52%2020%2D105%200%2D54%2D20%2D106l%2D285%2D733h228l187%20585zm474%20558v1111h%2D795q37%2D55%2045%2D73h678v%2D1038q0%2D85%2D49%2E5%2D155t%2D129%2E5%2D99l25%2D67q101%2034%20163%2E5%20123%2E5t62%2E5%20197%2E5z%22%2F%3E%3C%2Fsvg%3E")}.term-php .wpseo-taxonomy-metabox-postbox>h2{margin:0;padding:8px 12px;border-bottom:1px solid #eee;font-size:14px;line-height:1.4}.wpseo-buy-premium{padding-right:5px;color:#a4286a}.wpseo-metabox-go-to::after{position:static;top:auto;right:auto;width:auto;height:auto;border:none;content:" \00BB"}#wpseo-buy-premium-popup-button.button-buy-premium{border-color:#a4286a;color:#fff;background:#a4286a}.wpseo-metabox-buy-premium{position:absolute;top:0;right:12px;padding:10px 0}.wpseo-metabox-premium-description{margin-top:.5em}ul.wpseo-metabox-premium-advantages{padding-left:1.5em;list-style:disc}.wpseosnippet .yoast-section{width:auto;max-width:640px;padding:0}#TB_window #TB_ajaxContent p{margin:5px 0 0;padding:5px 0 0}#TB_window #TB_ajaxContent ul{margin:5px 0 10px}#TB_window #TB_ajaxContent li{margin:5px 0 0;list-style:none}#TB_window #TB_ajaxContent li::before{margin:0 10px 0 0;font-weight:700;content:"+"}.yoast-section__heading-icon-list{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555%22%20d%3D%22M384%201408q0%2080%2D56%20136t%2D136%2056%2D136%2D56%2D56%2D136%2056%2D136%20136%2D56%20136%2056%2056%20136zm0%2D512q0%2080%2D56%20136t%2D136%2056%2D136%2D56%2D56%2D136%2056%2D136%20136%2D56%20136%2056%2056%20136zm1408%20416v192q0%2013%2D9%2E5%2022%2E5t%2D22%2E5%209%2E5h%2D1216q%2D13%200%2D22%2E5%2D9%2E5t%2D9%2E5%2D22%2E5v%2D192q0%2D13%209%2E5%2D22%2E5t22%2E5%2D9%2E5h1216q13%200%2022%2E5%209%2E5t9%2E5%2022%2E5zm%2D1408%2D928q0%2080%2D56%20136t%2D136%2056%2D136%2D56%2D56%2D136%2056%2D136%20136%2D56%20136%2056%2056%20136zm1408%20416v192q0%2013%2D9%2E5%2022%2E5t%2D22%2E5%209%2E5h%2D1216q%2D13%200%2D22%2E5%2D9%2E5t%2D9%2E5%2D22%2E5v%2D192q0%2D13%209%2E5%2D22%2E5t22%2E5%2D9%2E5h1216q13%200%2022%2E5%209%2E5t9%2E5%2022%2E5zm0%2D512v192q0%2013%2D9%2E5%2022%2E5t%2D22%2E5%209%2E5h%2D1216q%2D13%200%2D22%2E5%2D9%2E5t%2D9%2E5%2D22%2E5v%2D192q0%2D13%209%2E5%2D22%2E5t22%2E5%2D9%2E5h1216q13%200%2022%2E5%209%2E5t9%2E5%2022%2E5z%22%2F%3E%3C%2Fsvg%3E")}.yoast-section__heading-icon-key{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555%22%20d%3D%22M832%20512q0%2D80%2D56%2D136t%2D136%2D56%2D136%2056%2D56%20136q0%2042%2019%2083%2D41%2D19%2D83%2D19%2D80%200%2D136%2056t%2D56%20136%2056%20136%20136%2056%20136%2D56%2056%2D136q0%2D42%2D19%2D83%2041%2019%2083%2019%2080%200%20136%2D56t56%2D136zm851%20704q0%2017%2D49%2066t%2D66%2049q%2D9%200%2D28%2E5%2D16t%2D36%2E5%2D33%2D38%2E5%2D40%2D24%2E5%2D26l%2D96%2096%20220%20220q28%2028%2028%2068%200%2042%2D39%2081t%2D81%2039q%2D40%200%2D68%2D28l%2D671%2D671q%2D176%20131%2D365%20131%2D163%200%2D265%2E5%2D102%2E5t%2D102%2E5%2D265%2E5q0%2D160%2095%2D313t248%2D248%20313%2D95q163%200%20265%2E5%20102%2E5t102%2E5%20265%2E5q0%20189%2D131%20365l355%20355%2096%2D96q%2D3%2D3%2D26%2D24%2E5t%2D40%2D38%2E5%2D33%2D36%2E5%2D16%2D28%2E5q0%2D17%2049%2D66t66%2D49q13%200%2023%2010%206%206%2046%2044%2E5t82%2079%2E5%2086%2E5%2086%2073%2078%2028%2E5%2041z%22%2F%3E%3C%2Fsvg%3E")}.yoast-section__heading-icon-edit{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23555%22%20d%3D%22M491%201536l91%2D91%2D235%2D235%2D91%2091v107h128v128h107zm523%2D928q0%2D22%2D22%2D22%2D10%200%2D17%207l%2D542%20542q%2D7%207%2D7%2017%200%2022%2022%2022%2010%200%2017%2D7l542%2D542q7%2D7%207%2D17zm%2D54%2D192l416%20416%2D832%20832h%2D416v%2D416zm683%2096q0%2053%2D37%2090l%2D166%20166%2D416%2D416%20166%2D165q36%2D38%2090%2D38%2053%200%2091%2038l235%20234q37%2039%2037%2091z%22%20%2F%3E%3C%2Fsvg%3E")}.yoast-tooltip.yoast-tooltip-hidden::after,.yoast-tooltip.yoast-tooltip-hidden::before{display:none}.screen-reader-text.wpseo-generic-tab-textual-score,.screen-reader-text.wpseo-keyword-tab-textual-score{display:block}@media screen and (max-width:782px){.wpseo-metabox-sidebar{display:inline-block;float:none;width:auto;margin:0 0 10px -5px;padding:0;vertical-align:top}.wpseo-meta-section.active{display:block;clear:both;max-width:none}.wpseo-metabox-sidebar ul{display:inline-block}.wpseo-metabox-sidebar li{float:left;text-align:center}.wpseo-metabox-sidebar .wpseo-meta-section-link{width:40px;height:40px}.wpseo-meta-section-link .dashicons,.wpseo-meta-section-link .yst-traffic-light-container{display:block;width:40px;height:35px;margin:0;padding:5px 0 2px;border-bottom-width:3px;border-left-width:0}.wpseo-meta-section-link .dashicons:before,.wpseo-meta-section-link .yst-traffic-light{margin:0}.wpseo-meta-section-link .dashicons-admin-generic:before{position:relative;left:1px}.wpseo-metabox-buy-premium .wpseo-buy-premium{display:inline-block;width:20px;height:20px;padding:0 5px}.yoast-help-panel{max-width:none!important}#wpseo-crawl-issues-table-form .subsubsub{float:none;max-width:calc(100vw - 20px)}#wpseo-crawl-issues-table-form .yoast-help-button{margin-top:3px}.wpseotab select[multiple]{height:auto!important}}@media screen and (max-width:600px){.wpseotab{padding:20px}.wpseotab.content{padding:20px 0}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/metabox-primary-category-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/metabox-primary-category-471.min.css deleted file mode 100644 index 04564fad..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/metabox-primary-category-471.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-is-primary-term,.wpseo-primary-term>label{font-weight:600}.wpseo-non-primary-term>.wpseo-is-primary-term,.wpseo-primary-term>.wpseo-make-primary-term,.wpseo-term-unchecked>.wpseo-is-primary-term,.wpseo-term-unchecked>.wpseo-make-primary-term{display:none}.wpseo-is-primary-term,.wpseo-make-primary-term{float:right}.wpseo-non-primary-term:after,.wpseo-non-primary-term:before,.wpseo-primary-term:after,.wpseo-primary-term:before{display:table;content:""}.wpseo-non-primary-term:after,.wpseo-primary-term:after{clear:both}.wpseo-make-primary-term{margin:4px 0 0;padding:0;border:none;color:#0073aa;background:0 0;text-decoration:underline;cursor:pointer}.wpseo-make-primary-term:hover{color:#00a0d2} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/snippet-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/snippet-471.min.css deleted file mode 100644 index 0d539c51..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/snippet-471.min.css +++ /dev/null @@ -1 +0,0 @@ -#snippet_preview{font-family:Arial,Helvetica,sans-serif;font-style:normal}.wpseosnippet .snippet-editor__label{font-size:1rem;font-weight:400;line-height:1}input[type=text].snippet-editor__field--invalid{color:#dc3232} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/toggle-switch-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/toggle-switch-471.min.css deleted file mode 100644 index af082b71..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/toggle-switch-471.min.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";.switch-light span span,.switch-toggle a{display:none}@media only screen{.switch-light,.switch-toggle{display:block;position:relative;padding:0!important}.switch-light::after,.switch-toggle::after{display:table;clear:both;content:""}.switch-light *,.switch-light :after,.switch-light :before,.switch-toggle *,.switch-toggle :after,.switch-toggle :before{box-sizing:border-box}.switch-light a,.switch-toggle a{display:block;transition:all .2s ease-out}.switch-light label,.switch-light>span,.switch-toggle label,.switch-toggle>span{line-height:2em;vertical-align:middle}.switch-light input{position:absolute;z-index:3;opacity:0}.switch-light input:checked~span a{right:0}.switch-light strong{font-weight:inherit}.switch-light>span{position:relative;min-height:2em;padding:0;text-align:left}.switch-light span span{display:block;float:left;position:relative;z-index:2;width:50%;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.switch-light a{display:block;position:absolute;z-index:1;top:0;right:50%;width:50%;height:100%;padding:0}.switch-toggle input{position:absolute;left:0;opacity:0}.switch-toggle input+label{display:block;float:left;position:relative;z-index:2;margin:0;padding:0 .5em;text-align:center}.switch-toggle a{position:absolute;z-index:1;top:0;left:0;width:10px;height:100%;padding:0}.switch-toggle label:nth-child(2):nth-last-child(4),.switch-toggle label:nth-child(2):nth-last-child(4)~a,.switch-toggle label:nth-child(2):nth-last-child(4)~label{width:50%}.switch-toggle label:nth-child(2):nth-last-child(4)~input:checked:nth-child(3)+label~a{left:50%}.switch-toggle label:nth-child(2):nth-last-child(6),.switch-toggle label:nth-child(2):nth-last-child(6)~a,.switch-toggle label:nth-child(2):nth-last-child(6)~label{width:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(3)+label~a{left:33.33%}.switch-toggle label:nth-child(2):nth-last-child(6)~input:checked:nth-child(5)+label~a{left:66.66%}.switch-toggle label:nth-child(2):nth-last-child(8),.switch-toggle label:nth-child(2):nth-last-child(8)~a,.switch-toggle label:nth-child(2):nth-last-child(8)~label{width:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(3)+label~a{left:25%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(5)+label~a{left:50%}.switch-toggle label:nth-child(2):nth-last-child(8)~input:checked:nth-child(7)+label~a{left:75%}.switch-toggle label:nth-child(2):nth-last-child(10),.switch-toggle label:nth-child(2):nth-last-child(10)~a,.switch-toggle label:nth-child(2):nth-last-child(10)~label{width:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(3)+label~a{left:20%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(5)+label~a{left:40%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(7)+label~a{left:60%}.switch-toggle label:nth-child(2):nth-last-child(10)~input:checked:nth-child(9)+label~a{left:80%}.switch-toggle label:nth-child(2):nth-last-child(12),.switch-toggle label:nth-child(2):nth-last-child(12)~a,.switch-toggle label:nth-child(2):nth-last-child(12)~label{width:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(3)+label~a{left:16.6%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(5)+label~a{left:33.2%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(7)+label~a{left:49.8%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(9)+label~a{left:66.4%}.switch-toggle label:nth-child(2):nth-last-child(12)~input:checked:nth-child(11)+label~a{left:83%}.switch-candy a{box-shadow:0 1px 1px rgba(0,0,0,.2),inset 0 1px 1px rgba(255,255,255,.45)}}@media only screen and (-webkit-max-device-pixel-ratio:2) and (max-device-width:80em){.switch-light,.switch-toggle{-webkit-animation:webkitSiblingBugfix infinite 1s}}.fieldset-switch-toggle label{float:none}@media only screen{.switch-light.switch-yoast-seo{margin-bottom:.2em}.fieldset-switch-toggle legend,.switch-light.switch-yoast-seo>strong{display:block;box-sizing:border-box;min-width:200px;margin-top:10px;padding-right:1em;font-weight:600;line-height:2em;vertical-align:middle}.switch-light.switch-yoast-seo>span,.switch-toggle.switch-yoast-seo{width:250px;border:1px solid #ccc;border-radius:.5em;background-color:#dcdcdc;box-shadow:inset 0 2px 4px rgba(0,0,0,.15)}.switch-light.switch-yoast-seo,.switch-toggle.switch-yoast-seo{float:left}.switch-light.switch-yoast-seo>span{display:inline-block;overflow:visible}.switch-light.switch-yoast-seo a,.switch-toggle.switch-yoast-seo a{border:1px solid #b5b5b5;border-radius:.5em;background:#a4286a}.switch-light.switch-yoast-seo input:focus+label,.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus+label,.switch-toggle.switch-yoast-seo input:focus~span a{outline:0}.switch-light.switch-yoast-seo input:focus~span a,.switch-toggle.switch-yoast-seo input:focus~a{border-color:#5b9dd9!important;box-shadow:0 0 2px rgba(0,115,170,.8)!important}.switch-light.switch-yoast-seo input:checked~span a,.switch-toggle.switch-yoast-seo input:checked~span a{border:1px solid #b5b5b5;background:#a4286a}.switch-light.switch-yoast-seo input:checked~span span:first-child,.switch-light.switch-yoast-seo span span,.switch-toggle.switch-yoast-seo label{color:#333;text-shadow:none;font-weight:inherit}.switch-candy.switch-yoast-seo input:checked+label,.switch-candy.switch-yoast-seo input:checked~span span:nth-child(2),.switch-candy.switch-yoast-seo input~span span:first-child{color:#fff;text-shadow:none}.switch-light.switch-yoast-seo-reverse input:checked~span a{left:0}.switch-light.switch-yoast-seo-reverse a{left:50%}.switch-light.switch-yoast-seo-reverse span span{float:right}.switch-toggle.switch-yoast-seo label,label.switch-light.switch-yoast-seo{margin-left:0;cursor:pointer}.switch-yoast-seo .switch-yoast-seo-jaws-a11y{display:block;overflow:hidden;height:1px;margin-bottom:-1px}.switch-light.switch-yoast-seo label code,.switch-toggle.switch-yoast-seo label code{background-color:inherit;vertical-align:top}.switch-container .label-text{display:block;margin:.5em 0;font-weight:600}.switch-container{clear:both;margin:0 0 1em}.switch-container+.switch-container{margin-top:.5em}.switch-container+p{margin:-.5em 0 1em}} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/wpseo-dismissible-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/wpseo-dismissible-471.min.css deleted file mode 100644 index f90fda18..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/wpseo-dismissible-471.min.css +++ /dev/null @@ -1 +0,0 @@ -.yoast-notice-dismiss{position:absolute;top:0;right:1px;margin:0;padding:9px;border:none;color:#b4b9be;background:0 0;cursor:pointer;text-decoration:none}.yoast-notice-dismiss:before{display:block!important;width:20px;height:20px;color:#b4b9be;background:0 0;font:400 16px/1 dashicons;text-align:center;content:"\f153";-webkit-font-smoothing:antialiased!important;speak:none;position:relative;top:0;left:0;line-height:20px}.yoast-notice-dismiss:active:before,.yoast-notice-dismiss:focus:before,.yoast-notice-dismiss:hover:before{color:#c00}.yoast-notice-dismiss:focus{outline:0;color:#c00;box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.ie8 .yoast-notice-dismiss:focus{outline:#5b9dd9 solid 1px}.yoast-notice.is-dismissible{position:relative} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/xml-sitemap-xsl.php b/wp/wp-content/plugins/wordpress-seo/css/xml-sitemap-xsl.php deleted file mode 100644 index 91f1380e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/xml-sitemap-xsl.php +++ /dev/null @@ -1,173 +0,0 @@ -'; -?> - - - - - - XML Sitemap - - - - -
      -

      XML Sitemap

      -

      - Generated by Yoast SEO, this is an XML Sitemap, meant for consumption by search engines.
      - You can find more information about XML sitemaps on sitemaps.org. -

      - -

      - This XML Sitemap Index file contains sitemaps. -

      - - - - - - - - - - - - - - - - - - -
      SitemapLast Modified
      - - - -
      -
      - -

      - This XML Sitemap contains URLs. -

      -

      ↑ Sitemap Index

      - - - - - - - - - - - - - - - - - - - -
      URLImagesLast Mod.
      - - - - - - - - - - -
      -
      -
      - - - - - -
      -
      div>span,.yoast-wizard--button__previous button:hover>div>span{color:#000!important}.yoast-wizard--step__active svg{color:#5d237a;fill:#5d237a}.yoast-wizard--step__inactive div{pointer-events:none}.yoast-wizard--step--container h1{margin-top:0;margin-bottom:1rem;color:#a4286a;font-size:2.75em;font-weight:100;line-height:3.68rem;letter-spacing:.03em}@media screen and (max-width:768px){.yoast-wizard{padding:1em 1em 2em}.yoast-wizard--step__active{overflow:hidden;width:38px}.yoast-wizard--step__active div{display:inline-block!important;vertical-align:middle}.yoast-wizard--step__active div>span>span{display:block!important;margin-left:-7px;padding-right:99px!important}.yoast-wizard--step__inactive{display:none!important}.yoast-wizard--step--container h1{font-size:2em;line-height:1.25}}.yoast-wizard--step--container h2{color:#a4286a;font-size:1.375em;font-weight:400}.yoast-wizard--emphasis,.yoast-wizard-field-description{font-weight:700}.yoast-wizard--stepper{width:100%;margin:auto}.yoast-wizard-overlay{position:absolute;z-index:10;top:0;left:0;width:100%;height:100%;opacity:.2;color:#fff;background-color:#000;text-align:center}.yoast-wizard-overlay-loader{position:relative}.yoast-wizard-container{position:relative;min-height:20px;border:1px solid #ccc;box-shadow:rgba(0,0,0,.15) 0 3px 10px,rgba(0,0,0,.2) 0 3px 10px;text-align:left}@media screen and (max-width:768px){.yoast-wizard-container{box-shadow:none}}.yoast-wizard-container fieldset{margin:1em 0;padding-left:.5em;border:0}.yoast-wizard-text-input{padding-bottom:.5em;font-size:14px}.yoast-wizard-text-input-label{display:block;margin:.5em 0 0;font-weight:700;cursor:pointer}.yoast-wizard-text-input [type=text]{box-sizing:border-box;width:100%;max-width:450px}.yoast-wizard input{margin:.5em 0;padding:5px;font-size:14px;line-height:140%}.yoast-wizard label{cursor:pointer}.yoast-wizard input[type=radio]{margin:.3em .7em .3em 0;vertical-align:middle}.yoast-wizard-input__explanation{margin-top:0;color:#555;font-style:italic}.yoast-wizard-input-radio{font-size:14px}.yoast-wizard-input-radio-option label{padding-top:2px}.yoast-wizard-input-radio-separator{padding:0}.yoast-wizard-input-radio-separator input{position:absolute;left:-9999em;width:1px;height:1px}.yoast-wizard-input-radio-separator input+label{float:left;width:30px!important;margin:0 5px 5px 0!important;padding:9px 6px;border:1px solid #ccc;font-family:Arial,Helvetica,sans-serif!important;font-size:18px!important;line-height:24px;text-align:center;cursor:pointer}.yoast-wizard-input-radio-separator input:checked+label{border:1px solid #a4286a;background-color:#fff;box-shadow:inset 0 0 0 2px #a4286a}.yoast-wizard-input-radio-separator input:checked+label,.yoast-wizard-input-radio-separator input:focus+label{border-radius:10px 10px 0}.yoast-video-container-max-width{max-width:560px}.yoast-video-container{overflow:hidden;position:relative;height:0;padding-bottom:56.25%}.yoast-video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.yoast-wizard-notice__error{margin-bottom:15px;padding:12px;border-left:4px solid #dc3232;background:#fff;box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}@keyframes heartbeat{0%{opacity:.4;transform:scale(.7)}80%{opacity:1}100%{opacity:1;transform:scale(.95)}}.yoast-loader{animation:heartbeat 1.15s infinite;animation-timing-function:cubic-bezier(.96,.02,.63,.86);animation-direction:alternate}#wizard{overflow:hidden}.yoast-wizard{padding-top:2em}.yoast-wizard input[type=text]{min-width:250px}.yoast-wizard #gsc_authorization_code,.yoast-wizard input[type=text]+div{margin-right:1em}.yoast-wizard-body{max-width:80em}.yoast-wizard-return-link{display:block;margin:1em 0;color:#646d78;text-align:center}.yoast-wizard-mailchimp-message-error{color:#dc3232}.yoast-wizard-mailchimp-message-success{color:#008a00}.yoast-wizard-input{padding-bottom:.5em}.yoast-wizard-input__select{margin:1em 0;font-size:14px}.yoast-wizard--columns>div,.yoast-wizard-image-upload-container-buttons__remove{margin-left:1em}.yoast-wizard-image-upload-container__image{max-width:151px}.yoast-wizard-image-upload-container-buttons{margin-top:1em}.yoast-wizard-image-upload-container-description{display:block}.yoast-wizard--navigation{margin-top:2em;padding-top:1em;border-top:1px solid #a4286a}.yoast-wizard--rows{display:-ms-flexbox;display:flex;flex-direction:column;-ms-flex-direction:column}.yoast-wizard--columns{display:-ms-flexbox;display:flex}.yoast-wizard--columns .yoast-wizard-text-input-field{max-width:100%}.yoast-wizard--columns__even>div{flex-basis:50%;-ms-flex-preferred-size:50%}.yoast-wizard--columns>div:first-child{margin-left:0}.yoast-wizard--columns .yoast-wizard--heading{margin:0;color:#a4286a}.yoast-wizard--columns>.yoast-wizard--column__push_right{-ms-flex-order:2;order:2}.yoast-wizard--columns>.yoast-wizard--column__push_left{margin-right:1em;margin-left:0;-ms-flex-order:1;order:1}.yoast-wizard--choice>.yoast-wizard--rows{height:100%}.yoast-wizard--choice div{align-self:flex-start;-ms-flex-item-align:start}.yoast-wizard--choice p{height:100%;margin-top:.3em}.yoast-wizard--box{padding:1em;border:1px solid #a4286a}.yoast-wizard--box>div:first-child{flex-basis:100px;-ms-flex-preferred-size:100px}.yoast-wizard-newsletter--header svg{position:relative;top:4px;margin-right:6px;fill:#a4286a}.yoast-wizard-newsletter--decoration{width:100%;max-width:490px}.yoast-wizard-newsletter--decoration img{width:490px;max-width:100%;margin-top:-3em}.yoast-wizard--video-frame iframe{border:none}@media screen and (max-width:80em){.yoast-wizard--columns{display:block}.yoast-wizard--columns>div{margin-left:0}.yoast-wizard--columns>.yoast-wizard--column__push_left{margin-top:2em;margin-right:0}.yoast-wizard--box{display:-ms-flexbox;display:flex;margin-top:1em}.yoast-wizard--box:first-child{margin-top:0}.yoast-wizard--box>div{margin-left:1em}.yoast-wizard .hide-on-tablet{display:none}}.yoast-wizard--suggestion{margin-bottom:2em;padding-top:2em;border-top:1px solid #a4286a}.yoast-wizard--suggestion:first-child{padding-top:0;border-top:none}@media screen and (max-width:50rem){.yoast-wizard .hide-on-mobile{display:none}.yoast-wizard--box{display:block}.yoast-wizard--box>div{margin-left:0}.yoast-wizard--video-frame{position:relative;height:0;padding-bottom:56.25%}.yoast-wizard--video-frame iframe{position:absolute;top:0;left:0;width:100%;height:100%}}.ie9 .yoast-wizard--stepper{display:none} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/yoast-extensions-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/yoast-extensions-471.min.css deleted file mode 100644 index ea745817..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/yoast-extensions-471.min.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";.yoast-list--usp{margin-bottom:1em;padding:0;font-family:"Open Sans",Arial,sans-serif}.yoast-list--usp li{position:relative;padding-left:1.2533333333rem;list-style:none!important}.yoast-list--usp li::before{position:absolute;top:0;left:0;color:#77b227;font-family:FontAwesome,"Open Sans",Arial,sans-serif;content:"\f00c\0020"}.yoast .h1,.yoast .h2,.yoast .h3,.yoast .h4,.yoast .h5,.yoast .h6,.yoast h1,.yoast h2,.yoast h3,.yoast h4,.yoast h5,.yoast h6{display:block;margin-top:0;font-family:"Open Sans",Arial,sans-serif;font-weight:300}.yoast .h1,.yoast h1{margin-bottom:1.35rem;font-size:2.5em;line-height:3.68rem;letter-spacing:normal}@media only screen and (min-width:30rem){.yoast .h1,.yoast h1{font-size:2.75em}}.yoast .h2,.yoast h2{margin-bottom:1.2rem;font-size:1.88em;line-height:2.5rem}.yoast .h2.tight,.yoast h2.tight{margin-bottom:.6rem}.yoast .h3,.yoast h3{margin-bottom:.8rem;font-size:1.25em;line-height:1.88rem}.yoast .h3.tight,.yoast h3.tight{margin-bottom:.4rem}@media only screen and (min-width:30rem){.yoast .h3,.yoast h3{font-size:1.375em}}@media only screen and (min-width:50rem){.yoast .h3,.yoast h3{font-size:1.5em}}.yoast .h4,.yoast .h5,.yoast .h6,.yoast h4,.yoast h5,.yoast h6{margin-bottom:.2rem;font-size:1.13em;font-weight:400;line-height:1.88rem}.yoast-button{display:inline-block;position:relative;width:100%;padding:.345em 1.5em .345em 1em;border:0;color:#dc5c04;background-color:#dc5c04;font-family:"Open Sans",Arial,sans-serif;font-size:1.1em;text-decoration:none;cursor:pointer}@media only screen and (min-width:30rem){.yoast-button{width:auto;max-height:2.86rem;margin-right:1.36rem}.yoast-button.left::before,.yoast-button::after{position:absolute;top:0;width:0;height:0;border-top:1.43rem solid transparent;border-bottom:1.44rem solid transparent}.yoast-button::after{right:-1.36rem;border-right:0;border-left:1.43rem solid #dc5c04;content:""}.yoast-button.left{margin-right:0;margin-left:1.36rem}.yoast-button.left::after{content:none}.yoast-button.left::before{left:-1.36rem;border-right:1.43rem solid #dc5c04;border-left:0;content:""}}.yoast-button--full::after,.yoast-button--naked::after,.yoast-button--noarrow::after{content:none}.yoast-button.alignleft{margin:1rem 2.5rem 0 0!important}.yoast-button .arrow{display:none}.yoast-button+.yoast-button{margin-top:1em;margin-left:1.88rem}.yoast-button--full{width:100%}.yoast-button.default{color:#fff;background-color:#dc5c04}.yoast-button.default::after{border-left-color:#dc5c04}.yoast-button.default::before{border-right-color:#dc5c04}.yoast-button a:focus,.yoast-button:hover{color:#fff;background-color:#f58223;text-decoration:underline}.yoast-button a:focus::after,.yoast-button:hover::after{border-left-color:#f58223}.yoast-button a:focus::before,.yoast-button:hover::before{border-right-color:#f58223}.yoast-button.academy{color:#fff;background-color:#5d237a}.yoast-button.academy::after{border-left-color:#5d237a}.yoast-button.academy::before{border-right-color:#5d237a}@media only screen and (max-width:20rem){.yoast-button.academy{background-color:#5d237a}.yoast-button.academy--secondary{background-color:#a4286a}}.yoast-button.academy--secondary{color:#fff;background-color:#a4286a}.yoast-button.academy--secondary::after{border-left-color:#a4286a}.yoast-button.academy--secondary::before{border-right-color:#a4286a}.yoast-button.software{color:#fff;background-color:#0075b3}.yoast-button.software::after{border-left-color:#0075b3}.yoast-button.software::before{border-right-color:#0075b3}.yoast-button.review{color:#fff;background-color:#009288}.yoast-button.about,.yoast_academy .yoast-button{background-color:#d93f69;color:#fff}.yoast-button.review::after{border-left-color:#009288}.yoast-button.about::after,.yoast_academy .yoast-button::after{border-left-color:#d93f69}.yoast-button.review::before{border-right-color:#009288}.yoast-button.about::before,.yoast_academy .yoast-button::before{border-right-color:#d93f69}.yoast_academy .yoast-button a:focus,.yoast_academy .yoast-button:hover{color:#fff;background-color:#d42a59;text-decoration:underline}.yoast_academy .yoast-button a:focus::after,.yoast_academy .yoast-button:hover::after{border-left-color:#d42a59}.yoast_academy .yoast-button a:focus::before,.yoast_academy .yoast-button:hover::before{border-right-color:#d42a59}.yoast_academy .yoast-button.dimmed,body .yoast-button.dimmed{color:#646464;background-color:#dcdcdc}.yoast_academy .yoast-button.dimmed::after,body .yoast-button.dimmed::after{border-left-color:#dcdcdc}.yoast_academy .yoast-button.dimmed::before,body .yoast-button.dimmed::before{border-right-color:#dcdcdc}.yoast_academy .yoast-button.dimmed a:focus,.yoast_academy .yoast-button.dimmed:hover,body .yoast-button.dimmed a:focus,body .yoast-button.dimmed:hover{color:#646464;background-color:#cdcdcd;text-decoration:underline}.yoast_academy .yoast-button.dimmed a:focus::after,.yoast_academy .yoast-button.dimmed:hover::after,body .yoast-button.dimmed a:focus::after,body .yoast-button.dimmed:hover::after{border-left-color:#cdcdcd}.yoast_academy .yoast-button.dimmed a:focus:before,.yoast_academy .yoast-button.dimmed:hover:before,body .yoast-button.dimmed a:focus:before,body .yoast-button.dimmed:hover:before{border-right-color:#cdcdcd}.yoast-button--naked{padding:0;border:none;background-color:transparent}.yoast-button i.fa{margin:4px 10px 0 0;font-size:140%}.theme-academy .yoast-promoblock{border-color:#5d237a}.theme-academy--secondary .yoast-promoblock{border-color:#a4286a}.theme-software .yoast-promoblock{border-color:#0075b3}.theme-review .yoast-promoblock{border-color:#009288}.theme-about .yoast-promoblock,.theme-home .yoast-promoblock{border-color:#d93f69}.theme-academy.yoast-promoblock{border-color:#5d237a}.theme-academy--secondary.yoast-promoblock{border-color:#a4286a}.theme-software.yoast-promoblock{border-color:#0075b3}.theme-review.yoast-promoblock,.theme-software--secondary.yoast-promoblock{border-color:#009288}.theme-review--secondary.yoast-promoblock{border-color:#77b227}.theme-about.yoast-promoblock{border-color:#d93f69}.theme-about--secondary.yoast-promoblock{border-color:#a4286a}.cta.yoast-promoblock,.link.yoast-promoblock{border-color:#dc5c04}.link.yoast-promoblock::after{-moz-filter:drop-shadow(1px 0 0 #dc5c04);-ms-filter:drop-shadow(1px 0 0 #dc5c04);-o-filter:drop-shadow(1px 0 0 #dc5c04);filter:drop-shadow(1px 0 0 #dc5c04)}.cta.yoast-promoblock::after{-moz-filter:drop-shadow(1px 0 0 #dc5c04);-ms-filter:drop-shadow(1px 0 0 #dc5c04);-o-filter:drop-shadow(1px 0 0 #dc5c04);filter:drop-shadow(1px 0 0 #dc5c04)}.yoast-promoblock{display:block;position:relative;margin-bottom:1.88rem;padding:20px;border:1px solid;border-radius:30px 30px 0;background-color:#fff;font-family:Merriweather,Georgia,serif}.yoast-promoblock p{color:#000}.yoast-promoblock p:last-of-type{margin-bottom:0}.yoast-promoblock i.blockicon{position:absolute;right:10px;bottom:10px;padding:0 0 0 .5em;font-size:2.25em}.yoast-promoblock a img{border:1px solid #dcdcdc}.yoast-promoblock p a{font-weight:600!important;text-decoration:underline}.yoast-promoblock form a,a.promoblock,a.promoblock:hover{text-decoration:none}.yoast-promoblock form a{font-family:"Open Sans",Arial,sans-serif;font-weight:400!important}.yoast-promoblock .h4,.yoast-promoblock h4{margin-bottom:.7rem}.yoast-promoblock.link{border-color:#dc5c04}.yoast-promoblock.link a,.yoast-promoblock.link a:hover{color:#dc5c04}.yoast-promoblock--white{border-color:#fff!important}.yoast-promoblock.theme-academy a{color:#5d237a!important}.yoast-promoblock.theme-academy.secondary a{color:#a4286a!important}.yoast-promoblock.theme-software a{color:#0075b3!important}.yoast-promoblock.theme-review a{color:#009288!important}.yoast-promoblock.theme-review.secondary a{color:#77b227!important}.yoast-promoblock.theme-about a{color:#d93f69!important}.product .yoast-promoblock{overflow:hidden}.yoast-promoblock--hometitle{display:-ms-flexbox;display:flex;max-width:16em;height:11em;margin:1rem auto 2rem;border-color:#fff!important;background-color:rgba(217,63,105,.25);font-size:16px;font-size:1rem;line-height:1;-webkit-box-pack:center;-ms-flex-align:center;-ms-flex-line-pack:center;-ms-flex-pack:justify}.old-ie .yoast-promoblock--hometitle{text-align:justify}.old-ie .yoast-promoblock--hometitle::after{display:inline-block;width:100%;content:""}.old-ie .yoast-promoblock--hometitle>*{display:inline-block;text-align:left}@media only screen and (max-width:30rem){.yoast-promoblock--hometitle::after{content:none!important}}.yoast-promoblock--imageholder{margin-bottom:0;padding:0}.yoast-promoblock--imageholdersmall{position:absolute}.yoast-promoblock--imageholdersmall:first-child{left:4rem}.yoast-promoblock--imageholdersmall:last-child{top:4rem}@media only screen and (max-width:50rem){.yoast-promoblock h2{margin-bottom:0}}a.promoblock{color:#000}.promoblockimage__holder{position:relative;width:240px;height:295px}@media only screen and (min-width:50rem){[class*=promoblock--icon]::before{position:absolute;right:.47rem;bottom:.47rem;font-family:FontAwesome,"Open Sans",Arial,sans-serif;font-size:2.2rem;line-height:1}body.theme-about [class*=promoblock--icon]::before{color:#d93f69}body.theme-about .promoblock a.color-cta{color:#009288!important}body.theme-academy [class*=promoblock--icon]::before{color:#5d237a}body.theme-software [class*=promoblock--icon]::before{color:#0075b3}.promoblock--icon-academy::before{content:"\f19d"}.promoblock--icon-blog::before{content:"\f1ea"}.promoblock--icon-book::before{content:"\f02d"}.promoblock--icon-calendar::before{content:"\f073"}.promoblock--icon-check::before{content:"\f046"}.promoblock--icon-drupal::before{content:"\f1a9"}.promoblock--icon-gears::before{content:"\f085"}.promoblock--icon-pencil::before{content:"\f040"}.promoblock--icon-plug::before{content:"\f1e6"}.promoblock--icon-video::before{content:"\f008"}.promoblock--icon-wordpress::before{content:"\f19a"}}.yoast{color:#000;font-family:"Open Sans",Arial,sans-serif;font-size:1rem;line-height:1.88;letter-spacing:.01em}.yoast *,.yoast :after,.yoast :before{box-sizing:border-box}.yoast-hr{position:relative;margin:0;padding-bottom:1.88rem;border:0;border-top:1px solid #a4286a}.yoast-list--usp li:before{width:1em;height:100%;background:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%2377B227%22%20d%3D%22M1671%20566q0%2040%2D28%2068l%2D724%20724%2D136%20136q%2D28%2028%2D68%2028t%2D68%2D28l%2D136%2D136%2D362%2D362q%2D28%2D28%2D28%2D68t28%2D68l136%2D136q28%2D28%2068%2D28t68%2028l294%20295%20656%2D657q28%2D28%2068%2D28t68%2028l136%20136q28%2028%2028%2068z%22%2F%3E%3C%2Fsvg%3E") left .4em no-repeat;background-size:contain;content:""}.yoast-button--purple{background-color:#5d237a}.yoast-button-go-to:after{position:static;top:auto;right:auto;width:auto;height:auto;border:none;content:" \00BB"}.yoast-button--installed{color:#fff;background-color:#77b227;cursor:default}.yoast-button--installed:hover{background-color:#77b227;text-decoration:none}.yoast-promo-extensions{display:-ms-flexbox;display:flex;margin-left:-24px;-ms-flex-wrap:wrap;flex-wrap:wrap}.yoast-promo-extensions>h2{width:100%;margin-bottom:32px;margin-left:32px}.yoast-promo-extension{max-width:330px;margin-left:32px;border-color:#a4286a;background-color:transparent}.yoast-promo-extension:first-child{margin-left:0}.yoast-promo-extension img{width:100%;height:auto;margin-bottom:.8rem}.yoast-promo-extension .yoast-button{width:100%;max-height:none}.yoast-promo-extension .yoast-button--installed{width:auto}.yoast-promo-extension h3{color:#a4286a}@media screen and (max-width:900px){.yoast-promo-extension img{display:none}.yoast-promo-extension{width:100%;max-width:none}}.yoast-seo-premium-extension{margin:2em .5em 1.5em}.yoast-seo-premium-extension:after,.yoast-seo-premium-extension:before{display:table;content:""}.yoast-seo-premium-extension:after{clear:both}.yoast-seo-premium-benefits__title{font-weight:600}.yoast-seo-premium-benefits__description:before{content:"– "}.yoast-link--more-info{padding-left:calc(1em + 5px);color:#646464;background:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%23646464%22%20d%3D%22M1152%201376v%2D160q0%2D14%2D9%2D23t%2D23%2D9h%2D96v%2D512q0%2D14%2D9%2D23t%2D23%2D9h%2D320q%2D14%200%2D23%209t%2D9%2023v160q0%2014%209%2023t23%209h96v320h%2D96q%2D14%200%2D23%209t%2D9%2023v160q0%2014%209%2023t23%209h448q14%200%2023%2D9t9%2D23zm%2D128%2D896v%2D160q0%2D14%2D9%2D23t%2D23%2D9h%2D192q%2D14%200%2D23%209t%2D9%2023v160q0%2014%209%2023t23%209h192q14%200%2023%2D9t9%2D23zm640%20416q0%20209%2D103%20385%2E5t%2D279%2E5%20279%2E5%2D385%2E5%20103%2D385%2E5%2D103%2D279%2E5%2D279%2E5%2D103%2D385%2E5%20103%2D385%2E5%20279%2E5%2D279%2E5%20385%2E5%2D103%20385%2E5%20103%20279%2E5%20279%2E5%20103%20385%2E5z%22%2F%3E%3C%2Fsvg%3E") left .2em no-repeat;background-size:1em}.yoast-link--more-info:after{content:" \00BB"}.yoast-promo-extension .yoast-link--more-info{display:block;margin:1em 0 0;background-position:left .4em}.yoast-heading-highlight{color:#a4286a;font-weight:600}.yoast-money-back-guarantee{font-size:1.1em;font-style:italic}.yoast-license-status-active{padding:3px 6px;color:#fff;background:#008a00}.yoast-license-status-inactive{padding:3px 6px;color:#fff;background:#dc3232} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/yst_plugin_tools-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/yst_plugin_tools-471.min.css deleted file mode 100644 index ca132042..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/yst_plugin_tools-471.min.css +++ /dev/null @@ -1 +0,0 @@ -#wpseo-debug-info,h4{clear:both}.yoast-sidebar__title,.yoast-table-scrollable,.yoast-table-scrollable td,.yoast-table-scrollable th{box-sizing:border-box}.wpseo_content_wrapper{display:table;width:100%;table-layout:fixed}.wpseo_content_cell{display:table-cell;height:500px;margin:0;padding:0;vertical-align:top}#wpseo_content_top{width:100%}#sidebar-container{width:261px;padding:0 0 0 19px}tr.yst_row{margin:5px 0 0;padding:5px 0 0}tr.yst_row.even{background-color:#f6f6f6}.postbox{margin:10px 10px 0 0}label.select,label.textinput{float:left;width:200px;margin:5px 0}.yoast-inline-label{float:none;margin:0}input.textinput,select,textarea{width:400px}input.textinput,select.select,textarea.textinput{margin:0 0 15px}input.checkbox,input.checkbox.double,input.radio{margin:6px 10px 6px 0}.textinput.metadesc{height:50px}textarea.import{width:500px;height:100px}p.desc{margin:6px 0 10px;padding:0 0 8px 25px}p.desc.label{margin:0 0 20px;padding:0 0 10px 200px}.wpseo-gsc-reload-crawl-issues-form{position:relative;top:9px}.wp-core-ui .button.wpseo-gsc-save-profile{margin-left:200px}.wpseo_content_wrapper h3{margin:1em 0 .5em}h4{margin:1.2em 0 .5em}.wpseo_content_wrapper li,.wpseo_content_wrapper p{max-width:600px}.wpseo_content_wrapper .notice p,.wpseo_content_wrapper .yoast-blocking-files-error p,.yoast .search-box{max-width:none}table.wpseo th{text-align:left}#wpseo-tabs+.notice{margin-top:1.5em}.wpseo-variable-warning-element{border:1px solid #c62d2d!important}.wpseo-variable-warning{clear:both;margin:5px 0 0;padding:5px;color:#c62d2d}.wpseo-variable-warning code{color:#b02828}.wpseo-variable-warning a{color:#c62d2d}.wpseo_content_wrapper h1.wpseo-redirect-url-title{margin:1em 0 .5em;font-size:1.3em}.postbox form{line-height:150%}.text{width:250px}table.yoast_help{border-collapse:collapse}table.yoast_help,table.yoast_help td,table.yoast_help th{border:1px solid #ddd;color:#444}table.yoast_help td,table.yoast_help th{padding:5px 10px;text-align:left;vertical-align:top}.correct,.wrong{padding:5px;color:#fff}table.yoast_help tr{background-color:#f1f1f1}table.yoast_help tr:nth-child(2n){background-color:#fbfbfe}table.yoast_help tr:hover{background-color:#ddd}table.yoast_help thead tr,table.yoast_help thead tr:hover{background-color:#fff}table.yoast_help .yoast-variable-name{font-weight:600;white-space:nowrap}table.yoast_help .yoast-variable-desc{font-weight:400}.correct{background-color:green}.wrong{background-color:#dc3232}.wrong code{padding:3px 8px;color:#000}.yoast-notice-blocking-files code{color:#000;line-height:2}.yoast-notice-blocking-files .button{margin:.5em 0}.button.checkit,.button.fixit{float:right;margin:0 5px}.button.checkit{padding:5px 8px}.fb-buttons .button,.fb-buttons .button-primary{margin-right:8px}.wpseotab{display:none}.wpseotab.active{display:block}.wpseotab p.expl{margin-left:6px}.wpseotab p.expl strong{font-size:115%}#wpseo-debug-info .hndle{cursor:auto}#wpseo-debug-info .wpseo-debug-heading{font-size:1em}#wpseo-debug-info .wpseo-debug{display:inline-block;padding-left:20px;color:#c00}input.wpseo-new-title,textarea.wpseo-new-metadesc{width:100%;max-width:100%}#separator{margin:1.5em 0 .5em}#separator input.radio{position:absolute;left:-9999em;width:1px;height:1px}#separator input.radio+label{float:left;width:30px!important;margin:0 5px .5em 0!important;padding:9px 6px;border:1px solid #ccc;font-family:Arial,Helvetica,sans-serif!important;font-size:18px!important;line-height:24px;text-align:center;cursor:pointer}#separator input.radio:checked+label{border:1px solid #a4286a;background-color:#fff;box-shadow:inset 0 0 0 2px #a4286a}#separator input.radio:focus+label{border-radius:10px 10px 0}.svg-container{text-align:center}.svg-container .dashicons{width:200px;height:100px;font-size:100px}body.toplevel_page_wpseo_dashboard .wp-badge{background:url(../images/Yoast_SEO_Icon.svg) 50% 10px no-repeat;background-size:140px 140px;box-shadow:none}.nav-tab .dashicons{width:18px;height:18px;font-size:18px;line-height:24px}.nav-tab .pinteresticon{width:12px;height:24px;margin-right:2px;background-image:url(../images/pinterest-23x30.png);background-repeat:no-repeat;background-position:center center;background-size:contain}#wpseo_progressbar .ui-progressbar-value,.wpseo-progressbar .ui-progressbar-value{height:25px;background:#006691}#wpseo_progressbar{height:25px;border:1px solid #006691}.wpseo-progressbar-wrapper{display:inline;width:100%}.wpseo-progressbar{display:block;width:100%;height:25px;border:1px solid #006691}.wpseo-add-fb-admin-form-wrap .notice span{margin-left:10px}.archives-titles-metas-content{padding-top:1em}.yoast-sidebar__title{width:100%;margin:46px 0 20px;padding:10px 0;border-bottom:1px solid #a4286a;color:#a4286a;line-height:19px;text-align:left}.yoast-sidebar__spot{padding:10px 0;border-bottom:1px solid #ddd}.yoast-sidebar__spot a,.yoast-sidebar__spot h2{color:#a4286a}.yoast-sidebar__spot h2{margin-top:0}.yoast-sidebar__spot ul{position:relative}.yoast-sidebar__spot li{margin-left:20px;list-style:none}.yoast-sidebar__spot li::before{position:absolute;left:0;font-weight:700;content:"+"}.wpseo-banner__link{display:inline-block}.wpseo-banner__image{vertical-align:top}@media screen and (max-width:1024px){.wpseo-tab-video-slideout .yoast-table-scrollable{width:120%}}.page-wpseo_rss .yoast-variable-desc{min-width:300px}.yoast-table-scrollable__container.yoast-has-scroll{overflow:hidden;position:relative}.yoast-table-scrollable__container.yoast-has-scroll:after{position:absolute;top:0;left:100%;width:50px;height:calc(100% - 16px);border-radius:10px 0 0 10px/50% 0 0 50%;box-shadow:-5px 0 10px rgba(0,0,0,.25);content:""}.yoast-table-scrollable__container.yoast-has-scroll .yoast-table-scrollable__inner{overflow-x:scroll;padding-bottom:16px}.yoast-table-scrollable__hintwrapper{display:none}.yoast-table-scrollable__hintwrapper.yoast-has-scroll{display:block;margin:1em 0;text-align:center}.yoast-has-scroll .yoast-table-scrollable__hint{display:inline-block}.yoast-has-scroll .yoast-table-scrollable__hint:before{display:inline-block;margin-right:10px;font-size:20px;line-height:inherit;vertical-align:text-top;content:"\21c4"}@media screen and (max-width:1024px){.wpseo_content_cell,.wpseo_content_wrapper{display:block;height:auto}#wpseo_content_top{width:auto}#sidebar-container{width:auto;padding:0}.yoast-sidebar__spot{float:left;width:50%;border:none;text-align:center}.yoast-sidebar__spot strong:first-child{display:block;max-width:261px;margin:0 auto;text-align:left}.yoast-sidebar__spot p{max-width:261px;margin:1em auto;text-align:left}}@media screen and (max-width:782px){label.select,label.textinput{display:inline-block;float:none;width:auto}input.textinput,textarea,textarea.textinput{display:block;width:100%}.select2-container,select,select.select{display:block;max-width:100%}p.desc.label{padding-left:0}.wp-core-ui .button.wpseo-gsc-save-profile{margin-left:0}.wpseo-gsc-reload-crawl-issues-form{top:0;margin:1em 0}.wpseo-gsc-reload-crawl-issues-form .alignright{float:none}}@media screen and (max-width:600px){.wpseo-gsc-reload-crawl-issues-form{margin-bottom:0}.yoast-sidebar__spot{float:none;width:261px;margin:0 auto;border-bottom:1px solid #ddd}}@media screen and (max-width:500px){body.toplevel_page_wpseo_dashboard .wp-badge{padding-top:80px;background-color:#a4286a;background-size:100px 100px;box-shadow:0 1px 3px rgba(0,0,0,.2)}}.wpseo-checkmark-ok-icon{float:left;width:18px;height:18px;margin-right:5px;background:url("data:image/svg+xml;charset=utf8,%3Csvg%20width%3D%221792%22%20height%3D%221792%22%20viewBox%3D%220%200%201792%201792%22%20xmlns%3D%22http%3A%2F%2Fwww%2Ew3%2Eorg%2F2000%2Fsvg%22%3E%3Cpath%20fill%3D%22%2377B227%22%20d%3D%22M1671%20566q0%2040%2D28%2068l%2D724%20724%2D136%20136q%2D28%2028%2D68%2028t%2D68%2D28l%2D136%2D136%2D362%2D362q%2D28%2D28%2D28%2D68t28%2D68l136%2D136q28%2D28%2068%2D28t68%2028l294%20295%20656%2D657q28%2D28%2068%2D28t68%2028l136%20136q28%2028%2028%2068z%22%2F%3E%3C%2Fsvg%3E") no-repeat;background-size:18px;vertical-align:top} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/css/yst_seo_score-471.min.css b/wp/wp-content/plugins/wordpress-seo/css/yst_seo_score-471.min.css deleted file mode 100644 index df91e15b..00000000 --- a/wp/wp-content/plugins/wordpress-seo/css/yst_seo_score-471.min.css +++ /dev/null @@ -1 +0,0 @@ -.wpseo-score-icon{display:inline-block;width:12px;height:12px;margin:3px 10px 0 3px;border-radius:50%;background:#888;vertical-align:top}.wpseo-score-icon.good{background-color:#7ad03a}.wpseo-score-icon.ok{background-color:#ee7c1b}.wpseo-score-icon.bad{background-color:#dc3232}.wpseo-score-icon.na{background-color:#888}.wpseo-score-icon.noindex{background-color:#1e8cbe}.wpseo-score-title{font-weight:600}#taxonomy_overall{position:absolute;top:0;margin-left:87.5%} \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/deprecated/class-googleplus.php b/wp/wp-content/plugins/wordpress-seo/deprecated/class-googleplus.php deleted file mode 100644 index 1dea3146..00000000 --- a/wp/wp-content/plugins/wordpress-seo/deprecated/class-googleplus.php +++ /dev/null @@ -1,75 +0,0 @@ - '', - '1' => '', - ); - } - - /** - * @deprecated 3.0.7 - */ - public function get_message() { - _deprecated_function( __METHOD__, 'WPSEO 3.0.7' ); - - return ''; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/deprecated/class-onpage-notifier.php b/wp/wp-content/plugins/wordpress-seo/deprecated/class-onpage-notifier.php deleted file mode 100644 index 6ed700e8..00000000 --- a/wp/wp-content/plugins/wordpress-seo/deprecated/class-onpage-notifier.php +++ /dev/null @@ -1,45 +0,0 @@ -content - * - * @return string html for snippet preview - * - * @deprecated 3.0 Removed, use javascript instead. - */ - public function get_content() { - _deprecated_function( __METHOD__, 'WPSEO 3.0', __( 'Use javascript instead.', 'wordpress-seo' ) ); - return $this->content; - } - - /** - * Sets date if available - * - * @deprecated 3.0 Removed, use javascript instead. - */ - protected function set_date() { - _deprecated_function( __METHOD__, 'WPSEO 3.0', __( 'Use javascript instead.', 'wordpress-seo' ) ); - } - - /** - * Retrieves a post date when post is published, or return current date when it's not. - * - * @return string - * - * @deprecated 3.0 Removed, use javascript instead. - */ - protected function get_post_date() { - _deprecated_function( __METHOD__, 'WPSEO 3.0', __( 'Use javascript instead.', 'wordpress-seo' ) ); - return ''; - } - - /** - * Generates the url that is displayed in the snippet preview. - * - * @deprecated 3.0 Removed, use javascript instead. - */ - protected function set_url() { - _deprecated_function( __METHOD__, 'WPSEO 3.0', __( 'Use javascript instead.', 'wordpress-seo' ) ); - } - - /** - * Sets the slug and adds it to the url if the post has been published and the post name exists. - * - * If the post is set to be the homepage the slug is also not included. - * - * @deprecated 3.0 Removed, use javascript instead. - */ - protected function set_slug() { - _deprecated_function( __METHOD__, 'WPSEO 3.0', __( 'Use javascript instead.', 'wordpress-seo' ) ); - } - - /** - * Generates the html for the snippet preview and assign it to $this->content. - * - * @deprecated 3.0 Removed, use javascript instead. - */ - protected function set_content() { - _deprecated_function( __METHOD__, 'WPSEO 3.0', __( 'Use javascript instead.', 'wordpress-seo' ) ); - } - - /** - * Sets the html for the snippet preview through a filter - * - * @param string $content Content string. - * - * @deprecated 3.0 Removed, use javascript instead. - */ - protected function set_content_through_filter( $content ) { - _deprecated_function( __METHOD__, 'WPSEO 3.0', __( 'Use javascript instead.', 'wordpress-seo' ) ); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/deprecated/class-yoast-textstatistics.php b/wp/wp-content/plugins/wordpress-seo/deprecated/class-yoast-textstatistics.php deleted file mode 100644 index 498a1dcf..00000000 --- a/wp/wp-content/plugins/wordpress-seo/deprecated/class-yoast-textstatistics.php +++ /dev/null @@ -1,198 +0,0 @@ -options = WPSEO_Options::get_options( array( 'wpseo_titles', 'wpseo_internallinks', 'wpseo_xml' ) ); - $this->post = ( isset( $GLOBALS['post'] ) ? $GLOBALS['post'] : null ); - $this->show_on_front = get_option( 'show_on_front' ); - $this->page_for_posts = get_option( 'page_for_posts' ); - - $this->filter_element(); - $this->filter_separator(); - $this->filter_wrapper(); - - $this->set_crumbs(); - $this->prepare_links(); - $this->links_to_string(); - $this->wrap_breadcrumb(); - } - - /** - * Get breadcrumb string using the singleton instance of this class - * - * @param string $before Optional string to prepend. - * @param string $after Optional string to append. - * @param bool $display Echo or return flag. - * - * @return object - */ - public static function breadcrumb( $before = '', $after = '', $display = true ) { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - // Remember the last used before/after for use in case the object goes __toString(). - self::$before = $before; - self::$after = $after; - - $output = $before . self::$instance->output . $after; - - if ( $display === true ) { - echo $output; - - return true; - } - else { - return $output; - } - } - - /** - * Magic method to use in case the class would be send to string - * - * @return string - */ - public function __toString() { - return self::$before . $this->output . self::$after; - } - - - /** - * Filter: 'wpseo_breadcrumb_single_link_wrapper' - Allows developer to change or wrap each breadcrumb element - * - * @api string $element - */ - private function filter_element() { - $this->element = esc_attr( apply_filters( 'wpseo_breadcrumb_single_link_wrapper', $this->element ) ); - } - - /** - * Filter: 'wpseo_breadcrumb_separator' - Allow (theme) developer to change the Yoast SEO breadcrumb separator. - * - * @api string $breadcrumbs_sep Breadcrumbs separator - */ - private function filter_separator() { - $separator = apply_filters( 'wpseo_breadcrumb_separator', $this->options['breadcrumbs-sep'] ); - $this->separator = ' ' . $separator . ' '; - } - - /** - * Filter: 'wpseo_breadcrumb_output_wrapper' - Allow changing the HTML wrapper element for the Yoast SEO breadcrumbs output - * - * @api string $wrapper The wrapper element - */ - private function filter_wrapper() { - $wrapper = apply_filters( 'wpseo_breadcrumb_output_wrapper', $this->wrapper ); - $wrapper = tag_escape( $wrapper ); - if ( is_string( $wrapper ) && '' !== $wrapper ) { - $this->wrapper = $wrapper; - } - } - - - /** - * Get a term's parents. - * - * @param object $term Term to get the parents for. - * - * @return array - */ - private function get_term_parents( $term ) { - $tax = $term->taxonomy; - $parents = array(); - while ( $term->parent != 0 ) { - $term = get_term( $term->parent, $tax ); - $parents[] = $term; - } - - return array_reverse( $parents ); - } - - /** - * Find the deepest term in an array of term objects - * - * @param array $terms Terms set. - * - * @return object - */ - private function find_deepest_term( $terms ) { - /* - Let's find the deepest term in this array, by looping through and then - unsetting every term that is used as a parent by another one in the array. - */ - $terms_by_id = array(); - foreach ( $terms as $term ) { - $terms_by_id[ $term->term_id ] = $term; - } - foreach ( $terms as $term ) { - unset( $terms_by_id[ $term->parent ] ); - } - unset( $term ); - - /* - As we could still have two subcategories, from different parent categories, - let's pick the one with the lowest ordered ancestor. - */ - $parents_count = 0; - $term_order = 9999; // Because ASC. - reset( $terms_by_id ); - $deepest_term = current( $terms_by_id ); - foreach ( $terms_by_id as $term ) { - $parents = $this->get_term_parents( $term ); - - if ( count( $parents ) >= $parents_count ) { - $parents_count = count( $parents ); - - // If higher count. - if ( count( $parents ) > $parents_count ) { - // Reset order. - $term_order = 9999; - } - - $parent_order = 9999; // Set default order. - foreach ( $parents as $parent ) { - if ( $parent->parent == 0 && isset( $parent->term_order ) ) { - $parent_order = $parent->term_order; - } - } - unset( $parent ); - - // Check if parent has lowest order. - if ( $parent_order < $term_order ) { - $term_order = $parent_order; - $deepest_term = $term; - } - } - } - - return $deepest_term; - } - - /** - * Retrieve the hierachical ancestors for the current 'post' - * - * @return array - */ - private function get_post_ancestors() { - $ancestors = array(); - - if ( isset( $this->post->ancestors ) ) { - if ( is_array( $this->post->ancestors ) ) { - $ancestors = array_values( $this->post->ancestors ); - } - else { - $ancestors = array( $this->post->ancestors ); - } - } - elseif ( isset( $this->post->post_parent ) ) { - $ancestors = array( $this->post->post_parent ); - } - - /** - * Filter: Allow changing the ancestors for the Yoast SEO breadcrumbs output - * - * @api array $ancestors Ancestors - */ - $ancestors = apply_filters( 'wp_seo_get_bc_ancestors', $ancestors ); - - if ( ! is_array( $ancestors ) ) { - trigger_error( 'The return value for the "wp_seo_get_bc_ancestors" filter should be an array.', E_USER_WARNING ); - $ancestors = (array) $ancestors; - } - - // Reverse the order so it's oldest to newest. - $ancestors = array_reverse( $ancestors ); - - return $ancestors; - } - - /** - * Determine the crumbs which should form the breadcrumb. - */ - private function set_crumbs() { - /** @var WP_Query $wp_query */ - global $wp_query; - - $this->maybe_add_home_crumb(); - $this->maybe_add_blog_crumb(); - - if ( ( $this->show_on_front === 'page' && is_front_page() ) || ( $this->show_on_front === 'posts' && is_home() ) ) { - // Do nothing. - } - elseif ( $this->show_on_front == 'page' && is_home() ) { - $this->add_blog_crumb(); - } - elseif ( is_singular() ) { - $this->maybe_add_pt_archive_crumb_for_post(); - - if ( isset( $this->post->post_parent ) && 0 == $this->post->post_parent ) { - $this->maybe_add_taxonomy_crumbs_for_post(); - } - else { - $this->add_post_ancestor_crumbs(); - } - - if ( isset( $this->post->ID ) ) { - $this->add_single_post_crumb( $this->post->ID ); - } - } - else { - if ( is_post_type_archive() ) { - $post_type = $wp_query->get( 'post_type' ); - - if ( $post_type && is_string( $post_type ) ) { - $this->add_ptarchive_crumb( $post_type ); - } - } - elseif ( is_tax() || is_tag() || is_category() ) { - $this->add_crumbs_for_taxonomy(); - } - elseif ( is_date() ) { - if ( is_day() ) { - $this->add_linked_month_year_crumb(); - $this->add_date_crumb(); - } - elseif ( is_month() ) { - $this->add_month_crumb(); - } - elseif ( is_year() ) { - $this->add_year_crumb(); - } - } - elseif ( is_author() ) { - $user = $wp_query->get_queried_object(); - $this->add_predefined_crumb( - $this->options['breadcrumbs-archiveprefix'] . ' ' . $user->display_name, - null, - true - ); - } - elseif ( is_search() ) { - $this->add_predefined_crumb( - $this->options['breadcrumbs-searchprefix'] . ' "' . esc_html( get_search_query() ) . '"', - null, - true - ); - } - elseif ( is_404() ) { - $this->add_predefined_crumb( - $this->options['breadcrumbs-404crumb'], - null, - true - ); - } - } - - /** - * Filter: 'wpseo_breadcrumb_links' - Allow the developer to filter the Yoast SEO breadcrumb links, add to them, change order, etc. - * - * @api array $crumbs The crumbs array - */ - $this->crumbs = apply_filters( 'wpseo_breadcrumb_links', $this->crumbs ); - - $this->crumb_count = count( $this->crumbs ); - } - - - /** - * Add a single id based crumb to the crumbs property - * - * @param int $id Post ID. - */ - private function add_single_post_crumb( $id ) { - $this->crumbs[] = array( - 'id' => $id, - ); - } - - /** - * Add a term based crumb to the crumbs property - * - * @param object $term Term data object. - */ - private function add_term_crumb( $term ) { - $this->crumbs[] = array( - 'term' => $term, - ); - } - - /** - * Add a ptarchive based crumb to the crumbs property - * - * @param string $pt Post type. - */ - private function add_ptarchive_crumb( $pt ) { - $this->crumbs[] = array( - 'ptarchive' => $pt, - ); - } - - /** - * Add a predefined crumb to the crumbs property - * - * @param string $text Text string. - * @param string $url URL string. - * @param bool $allow_html Flag to allow HTML. - */ - private function add_predefined_crumb( $text, $url = '', $allow_html = false ) { - $this->crumbs[] = array( - 'text' => $text, - 'url' => $url, - 'allow_html' => $allow_html, - ); - } - - /** - * Add Homepage crumb to the crumbs property - */ - private function maybe_add_home_crumb() { - if ( $this->options['breadcrumbs-home'] !== '' ) { - $this->add_predefined_crumb( - $this->options['breadcrumbs-home'], - WPSEO_Utils::home_url(), - true - ); - } - } - - /** - * Add Blog crumb to the crumbs property - */ - private function add_blog_crumb() { - $this->add_single_post_crumb( $this->page_for_posts ); - } - - /** - * Add Blog crumb to the crumbs property for single posts where Home != blogpage - */ - private function maybe_add_blog_crumb() { - if ( ( 'page' === $this->show_on_front && 'post' === get_post_type() ) && ( ! is_home() && ! is_search() ) ) { - if ( $this->page_for_posts && $this->options['breadcrumbs-blog-remove'] === false ) { - $this->add_blog_crumb(); - } - } - } - - /** - * Add ptarchive crumb to the crumbs property if it can be linked to, for a single post - */ - private function maybe_add_pt_archive_crumb_for_post() { - // Never do this for the Post type archive for posts, as that would break `maybe_add_blog_crumb`. - if ( $this->post->post_type === 'post' ) { - return; - } - if ( isset( $this->post->post_type ) && get_post_type_archive_link( $this->post->post_type ) ) { - $this->add_ptarchive_crumb( $this->post->post_type ); - } - } - - /** - * Add taxonomy crumbs to the crumbs property for a single post - */ - private function maybe_add_taxonomy_crumbs_for_post() { - if ( isset( $this->options[ 'post_types-' . $this->post->post_type . '-maintax' ] ) && $this->options[ 'post_types-' . $this->post->post_type . '-maintax' ] != '0' ) { - $main_tax = $this->options[ 'post_types-' . $this->post->post_type . '-maintax' ]; - if ( isset( $this->post->ID ) ) { - $terms = get_the_terms( $this->post, $main_tax ); - - if ( is_array( $terms ) && $terms !== array() ) { - - $primary_term = new WPSEO_Primary_Term( $main_tax, $this->post->ID ); - if ( $primary_term->get_primary_term() ) { - $breadcrumb_term = get_term( $primary_term->get_primary_term(), $main_tax ); - } - else { - $breadcrumb_term = $this->find_deepest_term( $terms ); - } - - if ( is_taxonomy_hierarchical( $main_tax ) && $breadcrumb_term->parent != 0 ) { - $parent_terms = $this->get_term_parents( $breadcrumb_term ); - foreach ( $parent_terms as $parent_term ) { - $this->add_term_crumb( $parent_term ); - } - } - - $this->add_term_crumb( $breadcrumb_term ); - } - } - } - } - - /** - * Add hierarchical ancestor crumbs to the crumbs property for a single post - */ - private function add_post_ancestor_crumbs() { - $ancestors = $this->get_post_ancestors(); - if ( is_array( $ancestors ) && $ancestors !== array() ) { - foreach ( $ancestors as $ancestor ) { - $this->add_single_post_crumb( $ancestor ); - } - } - } - - /** - * Add taxonomy parent crumbs to the crumbs property for a taxonomy - */ - private function add_crumbs_for_taxonomy() { - $term = $GLOBALS['wp_query']->get_queried_object(); - - // @todo adjust function name!! - $this->maybe_add_preferred_term_parent_crumb( $term ); - - $this->maybe_add_term_parent_crumbs( $term ); - - $this->add_term_crumb( $term ); - } - - /** - * Add parent taxonomy crumb based on user defined preference - * - * @param object $term Term data object. - */ - private function maybe_add_preferred_term_parent_crumb( $term ) { - if ( isset( $this->options[ 'taxonomy-' . $term->taxonomy . '-ptparent' ] ) && $this->options[ 'taxonomy-' . $term->taxonomy . '-ptparent' ] != '0' ) { - if ( 'post' == $this->options[ 'taxonomy-' . $term->taxonomy . '-ptparent' ] && $this->show_on_front == 'page' ) { - if ( $this->page_for_posts ) { - $this->add_blog_crumb(); - } - } - else { - $this->add_ptarchive_crumb( $this->options[ 'taxonomy-' . $term->taxonomy . '-ptparent' ] ); - } - } - } - - /** - * Add parent taxonomy crumbs to the crumb property for hierachical taxonomy - * - * @param object $term Term data object. - */ - private function maybe_add_term_parent_crumbs( $term ) { - if ( is_taxonomy_hierarchical( $term->taxonomy ) && $term->parent != 0 ) { - foreach ( $this->get_term_parents( $term ) as $parent_term ) { - $this->add_term_crumb( $parent_term ); - } - } - } - - /** - * Add month-year crumb to crumbs property - */ - private function add_linked_month_year_crumb() { - $this->add_predefined_crumb( - $GLOBALS['wp_locale']->get_month( get_query_var( 'monthnum' ) ) . ' ' . get_query_var( 'year' ), - get_month_link( get_query_var( 'year' ), get_query_var( 'monthnum' ) ) - ); - } - - /** - * Add (non-link) month crumb to crumbs property - */ - private function add_month_crumb() { - $this->add_predefined_crumb( - $this->options['breadcrumbs-archiveprefix'] . ' ' . esc_html( single_month_title( ' ', false ) ), - null, - true - ); - } - - /** - * Add (non-link) year crumb to crumbs property - */ - private function add_year_crumb() { - $this->add_predefined_crumb( - $this->options['breadcrumbs-archiveprefix'] . ' ' . esc_html( get_query_var( 'year' ) ), - null, - true - ); - } - - /** - * Add (non-link) date crumb to crumbs property - * - * @param string $date Optional date string, defaults to post's date. - */ - private function add_date_crumb( $date = null ) { - if ( is_null( $date ) ) { - $date = get_the_date(); - } - else { - $date = mysql2date( get_option( 'date_format' ), $date, true ); - $date = apply_filters( 'get_the_date', $date, '' ); - } - - $this->add_predefined_crumb( - $this->options['breadcrumbs-archiveprefix'] . ' ' . esc_html( $date ), - null, - true - ); - } - - - /** - * Take the crumbs array and convert each crumb to a single breadcrumb string. - * - * @link http://support.google.com/webmasters/bin/answer.py?hl=en&answer=185417 Google documentation on RDFA - */ - private function prepare_links() { - if ( ! is_array( $this->crumbs ) || $this->crumbs === array() ) { - return; - } - - foreach ( $this->crumbs as $i => $crumb ) { - $link_info = $crumb; // Keep pre-set url/text combis. - - if ( isset( $crumb['id'] ) ) { - $link_info = $this->get_link_info_for_id( $crumb['id'] ); - } - if ( isset( $crumb['term'] ) ) { - $link_info = $this->get_link_info_for_term( $crumb['term'] ); - } - if ( isset( $crumb['ptarchive'] ) ) { - $link_info = $this->get_link_info_for_ptarchive( $crumb['ptarchive'] ); - } - - $this->links[] = $this->crumb_to_link( $link_info, $i ); - } - } - - /** - * Retrieve link url and text based on post id - * - * @param int $id Post ID. - * - * @return array Array of link text and url - */ - private function get_link_info_for_id( $id ) { - $link = array(); - - $link['url'] = get_permalink( $id ); - $link['text'] = WPSEO_Meta::get_value( 'bctitle', $id ); - if ( $link['text'] === '' ) { - $link['text'] = strip_tags( get_the_title( $id ) ); - } - - /** - * Filter: 'wp_seo_get_bc_title' - Allow developer to filter the Yoast SEO Breadcrumb title. - * - * @api string $link_text The Breadcrumb title text - * - * @param int $link_id The post ID - */ - $link['text'] = apply_filters( 'wp_seo_get_bc_title', $link['text'], $id ); - - return $link; - } - - /** - * Retrieve link url and text based on term object - * - * @param object $term Term object. - * - * @return array Array of link text and url - */ - private function get_link_info_for_term( $term ) { - $link = array(); - - $bctitle = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'bctitle' ); - if ( ! is_string( $bctitle ) || $bctitle === '' ) { - $bctitle = $term->name; - } - - $link['url'] = get_term_link( $term ); - $link['text'] = $bctitle; - - return $link; - } - - /** - * Retrieve link url and text based on post type - * - * @param string $pt Post type. - * - * @return array Array of link text and url - */ - private function get_link_info_for_ptarchive( $pt ) { - $link = array(); - $archive_title = ''; - - if ( isset( $this->options[ 'bctitle-ptarchive-' . $pt ] ) && $this->options[ 'bctitle-ptarchive-' . $pt ] !== '' ) { - - $archive_title = $this->options[ 'bctitle-ptarchive-' . $pt ]; - } - else { - $post_type_obj = get_post_type_object( $pt ); - if ( is_object( $post_type_obj ) ) { - if ( isset( $post_type_obj->label ) && $post_type_obj->label !== '' ) { - $archive_title = $post_type_obj->label; - } - elseif ( isset( $post_type_obj->labels->menu_name ) && $post_type_obj->labels->menu_name !== '' ) { - $archive_title = $post_type_obj->labels->menu_name; - } - else { - $archive_title = $post_type_obj->name; - } - } - } - - $link['url'] = get_post_type_archive_link( $pt ); - $link['text'] = $archive_title; - - return $link; - } - - - /** - * Create a breadcrumb element string - * - * @todo The `$paged` variable only works for archives, not for paged articles, so this does not work - * for paged article at this moment. - * - * @param array $link Link info array containing the keys: - * 'text' => (string) link text - * 'url' => (string) link url - * (optional) 'title' => (string) link title attribute text - * (optional) 'allow_html' => (bool) whether to (not) escape html in the link text - * This prevents html stripping from the text strings set in the - * WPSEO -> Internal Links options page. - * @param int $i Index for the current breadcrumb. - * - * @return string - */ - private function crumb_to_link( $link, $i ) { - $link_output = ''; - - if ( isset( $link['text'] ) && ( is_string( $link['text'] ) && $link['text'] !== '' ) ) { - - $link['text'] = trim( $link['text'] ); - if ( ! isset( $link['allow_html'] ) || $link['allow_html'] !== true ) { - $link['text'] = esc_html( $link['text'] ); - } - - $inner_elm = 'span'; - if ( $this->options['breadcrumbs-boldlast'] === true && $i === ( $this->crumb_count - 1 ) ) { - $inner_elm = 'strong'; - } - - if ( ( isset( $link['url'] ) && ( is_string( $link['url'] ) && $link['url'] !== '' ) ) && - ( $i < ( $this->crumb_count - 1 ) ) - ) { - if ( $i === 0 ) { - $link_output .= '<' . $this->element . ' typeof="v:Breadcrumb">'; - } - else { - $link_output .= '<' . $this->element . ' rel="v:child" typeof="v:Breadcrumb">'; - } - $title_attr = isset( $link['title'] ) ? ' title="' . esc_attr( $link['title'] ) . '"' : ''; - $link_output .= '' . $link['text'] . ''; - } - else { - $link_output .= '<' . $inner_elm . ' class="breadcrumb_last">' . $link['text'] . ''; - // This is the last element, now close all previous elements. - while ( $i > 0 ) { - $link_output .= 'element . '>'; - $i--; - } - } - } - - /** - * Filter: 'wpseo_breadcrumb_single_link' - Allow changing of each link being put out by the Yoast SEO breadcrumbs class - * - * @api string $link_output The output string - * - * @param array $link The link array. - */ - - return apply_filters( 'wpseo_breadcrumb_single_link', $link_output, $link ); - } - - - /** - * Create a complete breadcrumb string from an array of breadcrumb element strings - */ - private function links_to_string() { - if ( is_array( $this->links ) && $this->links !== array() ) { - // Remove any effectively empty links. - $links = array_map( 'trim', $this->links ); - $links = array_filter( $links ); - - $this->output = implode( $this->separator, $links ); - } - } - - /** - * Wrap a complete breadcrumb string in a Breadcrumb RDFA wrapper - */ - private function wrap_breadcrumb() { - if ( is_string( $this->output ) && $this->output !== '' ) { - $output = '<' . $this->wrapper . $this->get_output_id() . $this->get_output_class() . ' xmlns:v="http://rdf.data-vocabulary.org/#">' . $this->output . 'wrapper . '>'; - - /** - * Filter: 'wpseo_breadcrumb_output' - Allow changing the HTML output of the Yoast SEO breadcrumbs class - * - * @api string $unsigned HTML output - */ - $output = apply_filters( 'wpseo_breadcrumb_output', $output ); - - if ( $this->options['breadcrumbs-prefix'] !== '' ) { - $output = "\t" . $this->options['breadcrumbs-prefix'] . "\n" . $output; - } - - $this->output = $output; - } - } - - - /** - * Filter: 'wpseo_breadcrumb_output_id' - Allow changing the HTML ID on the Yoast SEO breadcrumbs wrapper element - * - * @api string $unsigned ID to add to the wrapper element - */ - private function get_output_id() { - $id = apply_filters( 'wpseo_breadcrumb_output_id', '' ); - if ( is_string( $id ) && '' !== $id ) { - $id = ' id="' . esc_attr( $id ) . '"'; - } - - return $id; - } - - /** - * Filter: 'wpseo_breadcrumb_output_class' - Allow changing the HTML class on the Yoast SEO breadcrumbs wrapper element - * - * @api string $unsigned class to add to the wrapper element - */ - private function get_output_class() { - $class = apply_filters( 'wpseo_breadcrumb_output_class', '' ); - if ( is_string( $class ) && '' !== $class ) { - $class = ' class="' . esc_attr( $class ) . '"'; - } - - return $class; - } - - - /********************** DEPRECATED METHODS **********************/ - - // @codeCoverageIgnoreStart - /** - * Wrapper function for the breadcrumb so it can be output for the supported themes. - * - * @deprecated 1.5.0 - */ - public function breadcrumb_output() { - _deprecated_function( __METHOD__, '1.5.0', 'yoast_breadcrumb' ); - self::breadcrumb( '
      ', '
      ' ); - } - - /** - * Take the links array and return a full breadcrumb string. - * - * @deprecated 1.5.2.3 - * - * @param string $links Unused. - * @param string $wrapper Unused. - * @param string $element Unused. - * - * @return void - */ - public function create_breadcrumbs_string( $links, $wrapper = 'span', $element = 'span' ) { - _deprecated_function( __METHOD__, 'WPSEO 1.5.2.3', 'yoast_breadcrumbs' ); - } - // @codeCoverageIgnoreEnd -} diff --git a/wp/wp-content/plugins/wordpress-seo/frontend/class-frontend.php b/wp/wp-content/plugins/wordpress-seo/frontend/class-frontend.php deleted file mode 100644 index 6e07b4ad..00000000 --- a/wp/wp-content/plugins/wordpress-seo/frontend/class-frontend.php +++ /dev/null @@ -1,1955 +0,0 @@ -options = WPSEO_Options::get_options( $this->required_options ); - - add_action( 'wp_head', array( $this, 'front_page_specific_init' ), 0 ); - add_action( 'wp_head', array( $this, 'head' ), 1 ); - - // The head function here calls action wpseo_head, to which we hook all our functionality. - add_action( 'wpseo_head', array( $this, 'debug_mark' ), 2 ); - add_action( 'wpseo_head', array( $this, 'metadesc' ), 6 ); - add_action( 'wpseo_head', array( $this, 'robots' ), 10 ); - add_action( 'wpseo_head', array( $this, 'metakeywords' ), 11 ); - add_action( 'wpseo_head', array( $this, 'canonical' ), 20 ); - add_action( 'wpseo_head', array( $this, 'adjacent_rel_links' ), 21 ); - add_action( 'wpseo_head', array( $this, 'publisher' ), 22 ); - - // Remove actions that we will handle through our wpseo_head call, and probably change the output of. - remove_action( 'wp_head', 'rel_canonical' ); - remove_action( 'wp_head', 'index_rel_link' ); - remove_action( 'wp_head', 'start_post_rel_link' ); - remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head' ); - remove_action( 'wp_head', 'noindex', 1 ); - - // When using WP 4.4, just use the new hook. - add_filter( 'pre_get_document_title', array( $this, 'title' ), 15 ); - add_filter( 'wp_title', array( $this, 'title' ), 15, 3 ); - - add_filter( 'thematic_doctitle', array( $this, 'title' ), 15 ); - - add_action( 'wp', array( $this, 'page_redirect' ), 99 ); - - add_action( 'template_redirect', array( $this, 'noindex_feed' ) ); - - add_filter( 'loginout', array( $this, 'nofollow_link' ) ); - add_filter( 'register', array( $this, 'nofollow_link' ) ); - - // Fix the WooThemes woo_title() output. - add_filter( 'woo_title', array( $this, 'fix_woo_title' ), 99 ); - - if ( $this->options['disable-date'] === true || - $this->options['disable-author'] === true || - $this->options['disable-post_format'] === true - ) { - add_action( 'wp', array( $this, 'archive_redirect' ) ); - } - if ( $this->options['redirectattachment'] === true ) { - add_action( 'template_redirect', array( $this, 'attachment_redirect' ), 1 ); - } - - /* - * The setting to get here has been deprecated, but don't remove the code as that would break - * the functionality for those that still have it! - */ - if ( $this->options['trailingslash'] === true ) { - add_filter( 'user_trailingslashit', array( $this, 'add_trailingslash' ), 10, 2 ); - } - if ( $this->options['cleanpermalinks'] === true ) { - add_action( 'template_redirect', array( $this, 'clean_permalink' ), 1 ); - } - if ( $this->options['cleanreplytocom'] === true ) { - add_filter( 'comment_reply_link', array( $this, 'remove_reply_to_com' ) ); - add_action( 'template_redirect', array( $this, 'replytocom_redirect' ), 1 ); - } - add_filter( 'the_content_feed', array( $this, 'embed_rssfooter' ) ); - add_filter( 'the_excerpt_rss', array( $this, 'embed_rssfooter_excerpt' ) ); - - // For WordPress functions below 4.4. - if ( ! current_theme_supports( 'title-tag' ) && $this->options['forcerewritetitle'] === true ) { - add_action( 'template_redirect', array( $this, 'force_rewrite_output_buffer' ), 99999 ); - add_action( 'wp_footer', array( $this, 'flush_cache' ), - 1 ); - } - - if ( $this->options['title_test'] > 0 ) { - add_filter( 'wpseo_title', array( $this, 'title_test_helper' ) ); - } - - $primary_category = new WPSEO_Frontend_Primary_Category(); - $primary_category->register_hooks(); - - $this->hooks = array( $primary_category ); - } - - /** - * Initialize the functions that only need to run on the frontpage - */ - public function front_page_specific_init() { - if ( ! is_front_page() ) { - return; - } - - new WPSEO_JSON_LD; - add_action( 'wpseo_head', array( $this, 'webmaster_tools_authentication' ), 90 ); - } - - /** - * Resets the entire class so canonicals, titles etc can be regenerated. - */ - public function reset() { - foreach ( get_class_vars( __CLASS__ ) as $name => $default ) { - if ( $name == 'instance' ) { - self::$instance = null; - } - else { - $this->$name = $default; - } - } - $this->options = WPSEO_Options::get_options( $this->required_options ); - } - - /** - * Get the singleton instance of this class - * - * @return WPSEO_Frontend - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Override Woo's title with our own. - * - * @param string $title Title string. - * - * @return string - */ - public function fix_woo_title( $title ) { - return $this->title( $title ); - } - - /** - * Determine whether this is the homepage and shows posts. - * - * @return bool - */ - public function is_home_posts_page() { - return ( is_home() && 'posts' == get_option( 'show_on_front' ) ); - } - - /** - * Determine whether the this is the static frontpage. - * - * @return bool - */ - public function is_home_static_page() { - return ( is_front_page() && 'page' == get_option( 'show_on_front' ) && is_page( get_option( 'page_on_front' ) ) ); - } - - /** - * Determine whether this is the posts page, when it's not the frontpage. - * - * @return bool - */ - public function is_posts_page() { - return ( is_home() && 'page' == get_option( 'show_on_front' ) ); - } - - /** - * Used for static home and posts pages as well as singular titles. - * - * @param object|null $object If filled, object to get the title for. - * - * @return string - */ - public function get_content_title( $object = null ) { - if ( is_null( $object ) ) { - $object = $GLOBALS['wp_query']->get_queried_object(); - } - - if ( is_object( $object ) ) { - $title = WPSEO_Meta::get_value( 'title', $object->ID ); - - if ( $title !== '' ) { - return wpseo_replace_vars( $title, $object ); - } - - $post_type = ( isset( $object->post_type ) ? $object->post_type : $object->query_var ); - - return $this->get_title_from_options( 'title-' . $post_type, $object ); - } - - return $this->get_title_from_options( 'title-404-wpseo' ); - } - - /** - * Used for category, tag, and tax titles. - * - * @return string - */ - public function get_taxonomy_title() { - $object = $GLOBALS['wp_query']->get_queried_object(); - - $title = WPSEO_Taxonomy_Meta::get_term_meta( $object, $object->taxonomy, 'title' ); - - if ( is_string( $title ) && $title !== '' ) { - return wpseo_replace_vars( $title, $object ); - } - else { - return $this->get_title_from_options( 'title-tax-' . $object->taxonomy, $object ); - } - } - - /** - * Used for author titles. - * - * @return string - */ - public function get_author_title() { - $author_id = get_query_var( 'author' ); - $title = trim( get_the_author_meta( 'wpseo_title', $author_id ) ); - - if ( $title !== '' ) { - return wpseo_replace_vars( $title, array() ); - } - - return $this->get_title_from_options( 'title-author-wpseo' ); - } - - /** - * Simple function to use to pull data from $options. - * - * All titles pulled from options will be run through the wpseo_replace_vars function. - * - * @param string $index name of the page to get the title from the settings for. - * @param object|array $var_source possible object to pull variables from. - * - * @return string - */ - public function get_title_from_options( $index, $var_source = array() ) { - if ( ! isset( $this->options[ $index ] ) || $this->options[ $index ] === '' ) { - if ( is_singular() ) { - return wpseo_replace_vars( '%%title%% %%sep%% %%sitename%%', $var_source ); - } - else { - return ''; - } - } - else { - return wpseo_replace_vars( $this->options[ $index ], $var_source ); - } - } - - /** - * Get the default title for the current page. - * - * This is the fallback title generator used when a title hasn't been set for the specific content, taxonomy, author - * details, or in the options. It scrubs off any present prefix before or after the title (based on $seplocation) in - * order to prevent duplicate seperations from appearing in the title (this happens when a prefix is supplied to the - * wp_title call on singular pages). - * - * @param string $sep The separator used between variables. - * @param string $seplocation Whether the separator should be left or right. - * @param string $title Possible title that's already set. - * - * @return string - */ - public function get_default_title( $sep, $seplocation, $title = '' ) { - if ( 'right' == $seplocation ) { - $regex = '`\s*' . preg_quote( trim( $sep ), '`' ) . '\s*`u'; - } - else { - $regex = '`^\s*' . preg_quote( trim( $sep ), '`' ) . '\s*`u'; - } - $title = preg_replace( $regex, '', $title ); - - if ( ! is_string( $title ) || ( is_string( $title ) && $title === '' ) ) { - $title = get_bloginfo( 'name' ); - $title = $this->add_paging_to_title( $sep, $seplocation, $title ); - $title = $this->add_to_title( $sep, $seplocation, $title, strip_tags( get_bloginfo( 'description' ) ) ); - - return $title; - } - - $title = $this->add_paging_to_title( $sep, $seplocation, $title ); - $title = $this->add_to_title( $sep, $seplocation, $title, strip_tags( get_bloginfo( 'name' ) ) ); - - return $title; - } - - /** - * This function adds paging details to the title. - * - * @param string $sep Separator used in the title. - * @param string $seplocation Whether the separator should be left or right. - * @param string $title The title to append the paging info to. - * - * @return string - */ - public function add_paging_to_title( $sep, $seplocation, $title ) { - global $wp_query; - - if ( ! empty( $wp_query->query_vars['paged'] ) && $wp_query->query_vars['paged'] > 1 ) { - return $this->add_to_title( $sep, $seplocation, $title, $wp_query->query_vars['paged'] . '/' . $wp_query->max_num_pages ); - } - - return $title; - } - - /** - * Add part to title, while ensuring that the $seplocation variable is respected. - * - * @param string $sep Separator used in the title. - * @param string $seplocation Whether the separator should be left or right. - * @param string $title The title to append the title_part to. - * @param string $title_part The part to append to the title. - * - * @return string - */ - public function add_to_title( $sep, $seplocation, $title, $title_part ) { - if ( 'right' === $seplocation ) { - return $title . $sep . $title_part; - } - - return $title_part . $sep . $title; - } - - /** - * Main title function. - * - * @param string $title Title that might have already been set. - * @param string $separator Separator determined in theme (unused). - * @param string $separator_location Whether the separator should be left or right. - * - * @return string - */ - public function title( $title, $separator = '', $separator_location = '' ) { - if ( is_null( $this->title ) ) { - $this->title = $this->generate_title( $title, $separator_location ); - } - - return $this->title; - } - - /** - * Main title generation function. - * - * @param string $title Title that might have already been set. - * @param string $separator_location Whether the separator should be left or right. - * - * @return string - */ - private function generate_title( $title, $separator_location ) { - - if ( is_feed() ) { - return $title; - } - - $separator = wpseo_replace_vars( '%%sep%%', array() ); - $separator = ' ' . trim( $separator ) . ' '; - - if ( '' === trim( $separator_location ) ) { - $separator_location = ( is_rtl() ) ? 'left' : 'right'; - } - - // This needs to be kept track of in order to generate - // default titles for singular pages. - $original_title = $title; - - // This flag is used to determine if any additional - // processing should be done to the title after the - // main section of title generation completes. - $modified_title = true; - - // This variable holds the page-specific title part - // that is used to generate default titles. - $title_part = ''; - - if ( $this->is_home_static_page() ) { - $title = $this->get_content_title(); - } - elseif ( $this->is_home_posts_page() ) { - $title = $this->get_title_from_options( 'title-home-wpseo' ); - } - elseif ( $this->is_posts_page() ) { - $title = $this->get_content_title( get_post( get_option( 'page_for_posts' ) ) ); - } - elseif ( is_singular() ) { - $title = $this->get_content_title(); - - if ( ! is_string( $title ) || '' === $title ) { - $title_part = $original_title; - } - } - elseif ( is_search() ) { - $title = $this->get_title_from_options( 'title-search-wpseo' ); - - if ( ! is_string( $title ) || '' === $title ) { - $title_part = sprintf( __( 'Search for "%s"', 'wordpress-seo' ), esc_html( get_search_query() ) ); - } - } - elseif ( is_category() || is_tag() || is_tax() ) { - $title = $this->get_taxonomy_title(); - - if ( ! is_string( $title ) || '' === $title ) { - if ( is_category() ) { - $title_part = single_cat_title( '', false ); - } - elseif ( is_tag() ) { - $title_part = single_tag_title( '', false ); - } - else { - $title_part = single_term_title( '', false ); - if ( $title_part === '' ) { - $term = $GLOBALS['wp_query']->get_queried_object(); - $title_part = $term->name; - } - } - } - } - elseif ( is_author() ) { - $title = $this->get_author_title(); - - if ( ! is_string( $title ) || '' === $title ) { - $title_part = get_the_author_meta( 'display_name', get_query_var( 'author' ) ); - } - } - elseif ( is_post_type_archive() ) { - $post_type = get_query_var( 'post_type' ); - - if ( is_array( $post_type ) ) { - $post_type = reset( $post_type ); - } - - $title = $this->get_title_from_options( 'title-ptarchive-' . $post_type ); - - if ( ! is_string( $title ) || '' === $title ) { - $post_type_obj = get_post_type_object( $post_type ); - if ( isset( $post_type_obj->labels->menu_name ) ) { - $title_part = $post_type_obj->labels->menu_name; - } - elseif ( isset( $post_type_obj->name ) ) { - $title_part = $post_type_obj->name; - } - else { - $title_part = ''; // To be determined what this should be. - } - } - } - elseif ( is_archive() ) { - $title = $this->get_title_from_options( 'title-archive-wpseo' ); - - // @todo [JRF => Yoast] Should these not use the archive default if no title found ? - // WPSEO_Options::get_default( 'wpseo_titles', 'title-archive-wpseo' ) - // Replacement would be needed! - if ( empty( $title ) ) { - if ( is_month() ) { - $title_part = sprintf( __( '%s Archives', 'wordpress-seo' ), single_month_title( ' ', false ) ); - } - elseif ( is_year() ) { - $title_part = sprintf( __( '%s Archives', 'wordpress-seo' ), get_query_var( 'year' ) ); - } - elseif ( is_day() ) { - $title_part = sprintf( __( '%s Archives', 'wordpress-seo' ), get_the_date() ); - } - else { - $title_part = __( 'Archives', 'wordpress-seo' ); - } - } - } - elseif ( is_404() ) { - - $title = $this->get_title_from_options( 'title-404-wpseo' ); - - // @todo [JRF => Yoast] Should these not use the 404 default if no title found ? - // WPSEO_Options::get_default( 'wpseo_titles', 'title-404-wpseo' ) - // Replacement would be needed! - if ( empty( $title ) ) { - $title_part = __( 'Page not found', 'wordpress-seo' ); - } - } - else { - // In case the page type is unknown, leave the title alone. - $modified_title = false; - - // If you would like to generate a default title instead, - // the following code could be used - // $title_part = $title; - // instead of the line above. - } - - if ( ( $modified_title && empty( $title ) ) || ! empty( $title_part ) ) { - $title = $this->get_default_title( $separator, $separator_location, $title_part ); - } - - if ( defined( 'ICL_LANGUAGE_CODE' ) && false !== strpos( $title, ICL_LANGUAGE_CODE ) ) { - $title = str_replace( ' @' . ICL_LANGUAGE_CODE, '', $title ); - } - - /** - * Filter: 'wpseo_title' - Allow changing the Yoast SEO output - * - * @api string $title The page title being put out. - */ - - return esc_html( strip_tags( stripslashes( apply_filters( 'wpseo_title', $title ) ) ) ); - } - - /** - * Function used when title needs to be force overridden. - * - * @return string - */ - function force_wp_title() { - global $wp_query; - $old_wp_query = null; - - if ( ! $wp_query->is_main_query() ) { - $old_wp_query = $wp_query; - wp_reset_query(); - } - - $title = $this->title( '' ); - - if ( ! empty( $old_wp_query ) ) { - $GLOBALS['wp_query'] = $old_wp_query; - unset( $old_wp_query ); - } - - return $title; - } - - /** - * Outputs or returns the debug marker, which is also used for title replacement when force rewrite is active. - * - * @param bool $echo Whether or not to echo the debug marker. - * - * @return string - */ - public function debug_mark( $echo = true ) { - $marker = sprintf( - '<!-- This site is optimized with the ' . $this->head_product_name() . '%1$s - https://yoast.com/wordpress/plugins/seo/ -->', - /** - * Filter: 'wpseo_hide_version' - can be used to hide the Yoast SEO version in the debug marker (only available in Yoast SEO Premium) - * - * @api bool - */ - ( ( apply_filters( 'wpseo_hide_version', false ) && $this->is_premium() ) ? '' : ' v' . WPSEO_VERSION ) - ); - - if ( $echo === false ) { - return $marker; - } - else { - echo "\n${marker}\n"; - } - } - - /** - * Output Webmaster Tools authentication strings - */ - public function webmaster_tools_authentication() { - // Bing. - if ( $this->options['msverify'] !== '' ) { - echo '<meta name="msvalidate.01" content="' . esc_attr( $this->options['msverify'] ) . "\" />\n"; - } - - // Google. - if ( $this->options['googleverify'] !== '' ) { - echo '<meta name="google-site-verification" content="' . esc_attr( $this->options['googleverify'] ) . "\" />\n"; - } - - // Pinterest. - if ( $this->options['pinterestverify'] !== '' ) { - echo '<meta name="p:domain_verify" content="' . esc_attr( $this->options['pinterestverify'] ) . "\" />\n"; - } - - // Yandex. - if ( $this->options['yandexverify'] !== '' ) { - echo '<meta name="yandex-verification" content="' . esc_attr( $this->options['yandexverify'] ) . "\" />\n"; - } - } - - /** - * Main wrapper function attached to wp_head. This combines all the output on the frontend of the Yoast SEO plugin. - */ - public function head() { - global $wp_query; - - $old_wp_query = null; - - if ( ! $wp_query->is_main_query() ) { - $old_wp_query = $wp_query; - wp_reset_query(); - } - - /** - * Action: 'wpseo_head' - Allow other plugins to output inside the Yoast SEO section of the head section. - */ - do_action( 'wpseo_head' ); - - echo '<!-- / ', $this->head_product_name(), ". -->\n\n"; - - if ( ! empty( $old_wp_query ) ) { - $GLOBALS['wp_query'] = $old_wp_query; - unset( $old_wp_query ); - } - - return; - } - - - /** - * Output the meta robots value. - * - * @return string - */ - public function robots() { - global $wp_query, $post; - - $robots = array(); - $robots['index'] = 'index'; - $robots['follow'] = 'follow'; - $robots['other'] = array(); - - if ( is_singular() && is_object( $post ) ) { - - $option_name = 'noindex-' . $post->post_type; - $noindex = isset( $this->options[ $option_name ] ) && $this->options[ $option_name ] === true; - $private = 'private' === $post->post_status; - - if ( $noindex || $private ) { - $robots['index'] = 'noindex'; - } - - $robots = $this->robots_for_single_post( $robots ); - - } - else { - if ( is_search() || is_404() ) { - $robots['index'] = 'noindex'; - } - elseif ( is_tax() || is_tag() || is_category() ) { - $term = $wp_query->get_queried_object(); - if ( is_object( $term ) && ( isset( $this->options[ 'noindex-tax-' . $term->taxonomy ] ) && $this->options[ 'noindex-tax-' . $term->taxonomy ] === true ) ) { - $robots['index'] = 'noindex'; - } - - // Three possible values, index, noindex and default, do nothing for default. - $term_meta = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'noindex' ); - if ( is_string( $term_meta ) && 'default' !== $term_meta ) { - $robots['index'] = $term_meta; - } - - if ( $this->is_multiple_terms_query() ) { - $robots['index'] = 'noindex'; - } - } - elseif ( - ( is_author() && $this->options['noindex-author-wpseo'] === true ) || - ( is_date() && $this->options['noindex-archive-wpseo'] === true ) - ) { - $robots['index'] = 'noindex'; - } - elseif ( is_home() ) { - if ( get_query_var( 'paged' ) > 1 && $this->options['noindex-subpages-wpseo'] === true ) { - $robots['index'] = 'noindex'; - } - - $page_for_posts = get_option( 'page_for_posts' ); - if ( $page_for_posts ) { - $robots = $this->robots_for_single_post( $robots, $page_for_posts ); - } - unset( $page_for_posts ); - - } - elseif ( is_post_type_archive() ) { - $post_type = get_query_var( 'post_type' ); - - if ( is_array( $post_type ) ) { - $post_type = reset( $post_type ); - } - - if ( isset( $this->options[ 'noindex-ptarchive-' . $post_type ] ) && $this->options[ 'noindex-ptarchive-' . $post_type ] === true ) { - $robots['index'] = 'noindex'; - } - } - - $is_paged = isset( $wp_query->query_vars['paged'] ) && ( $wp_query->query_vars['paged'] && $wp_query->query_vars['paged'] > 1 ); - $noindex_subpages = $this->options['noindex-subpages-wpseo'] === true; - if ( $is_paged && $noindex_subpages ) { - $robots['index'] = 'noindex'; - } - - if ( $this->options['noodp'] === true ) { - $robots['other'][] = 'noodp'; - } - unset( $robot ); - } - - // Force override to respect the WP settings. - if ( '0' == get_option( 'blog_public' ) || isset( $_GET['replytocom'] ) ) { - $robots['index'] = 'noindex'; - } - - - $robotsstr = $robots['index'] . ',' . $robots['follow']; - - if ( $robots['other'] !== array() ) { - $robots['other'] = array_unique( $robots['other'] ); // TODO Most likely no longer needed, needs testing. - $robotsstr .= ',' . implode( ',', $robots['other'] ); - } - - $robotsstr = preg_replace( '`^index,follow,?`', '', $robotsstr ); - - /** - * Filter: 'wpseo_robots' - Allows filtering of the meta robots output of Yoast SEO - * - * @api string $robotsstr The meta robots directives to be echoed. - */ - $robotsstr = apply_filters( 'wpseo_robots', $robotsstr ); - - if ( is_string( $robotsstr ) && $robotsstr !== '' ) { - echo '<meta name="robots" content="', esc_attr( $robotsstr ), '"/>', "\n"; - } - - return $robotsstr; - } - - /** - * Determine $robots values for a single post - * - * @param array $robots Robots data array. - * @param int $post_id The post ID for which to determine the $robots values, defaults to current post. - * - * @return array - */ - public function robots_for_single_post( $robots, $post_id = 0 ) { - $noindex = WPSEO_Meta::get_value( 'meta-robots-noindex', $post_id ); - if ( $noindex === '1' ) { - $robots['index'] = 'noindex'; - } - elseif ( $noindex === '2' ) { - $robots['index'] = 'index'; - } - - if ( WPSEO_Meta::get_value( 'meta-robots-nofollow', $post_id ) === '1' ) { - $robots['follow'] = 'nofollow'; - } - - $meta_robots_adv = WPSEO_Meta::get_value( 'meta-robots-adv', $post_id ); - - if ( $meta_robots_adv !== '' && ( $meta_robots_adv !== '-' && $meta_robots_adv !== 'none' ) ) { - $meta_robots_adv = explode( ',', $meta_robots_adv ); - foreach ( $meta_robots_adv as $robot ) { - $robots['other'][] = $robot; - } - unset( $robot ); - } - elseif ( $meta_robots_adv === '' || $meta_robots_adv === '-' ) { - if ( $this->options['noodp'] === true ) { - $robots['other'][] = 'noodp'; - } - } - unset( $meta_robots_adv ); - - return $robots; - } - - /** - * This function normally outputs the canonical but is also used in other places to retrieve - * the canonical URL for the current page. - * - * @param bool $echo Whether or not to output the canonical element. - * @param bool $un_paged Whether or not to return the canonical with or without pagination added to the URL. - * @param bool $no_override Whether or not to return a manually overridden canonical. - * - * @return string $canonical - */ - public function canonical( $echo = true, $un_paged = false, $no_override = false ) { - if ( is_null( $this->canonical ) ) { - $this->generate_canonical(); - } - - $canonical = $this->canonical; - - if ( $un_paged ) { - $canonical = $this->canonical_unpaged; - } - elseif ( $no_override ) { - $canonical = $this->canonical_no_override; - } - - if ( $echo === false ) { - return $canonical; - } - - if ( is_string( $canonical ) && '' !== $canonical ) { - echo '<link rel="canonical" href="' . esc_url( $canonical, null, 'other' ) . '" />' . "\n"; - } - } - - /** - * This function normally outputs the canonical but is also used in other places to retrieve - * the canonical URL for the current page. - * - * @return void - */ - private function generate_canonical() { - $canonical = false; - $canonical_override = false; - - // Set decent canonicals for homepage, singulars and taxonomy pages. - if ( is_singular() ) { - $obj = get_queried_object(); - $canonical = get_permalink( $obj->ID ); - - $this->canonical_unpaged = $canonical; - - $canonical_override = WPSEO_Meta::get_value( 'canonical' ); - - // Fix paginated pages canonical, but only if the page is truly paginated. - if ( get_query_var( 'page' ) > 1 ) { - $num_pages = ( substr_count( $obj->post_content, '<!--nextpage-->' ) + 1 ); - if ( $num_pages && get_query_var( 'page' ) <= $num_pages ) { - if ( ! $GLOBALS['wp_rewrite']->using_permalinks() ) { - $canonical = add_query_arg( 'page', get_query_var( 'page' ), $canonical ); - } - else { - $canonical = user_trailingslashit( trailingslashit( $canonical ) . get_query_var( 'page' ) ); - } - } - } - } - else { - if ( is_search() ) { - $search_query = get_search_query(); - - // Regex catches case when /search/page/N without search term is itself mistaken for search term. R. - if ( ! empty( $search_query ) && ! preg_match( '|^page/\d+$|', $search_query ) ) { - $canonical = get_search_link(); - } - } - elseif ( is_front_page() ) { - $canonical = WPSEO_Utils::home_url(); - } - elseif ( $this->is_posts_page() ) { - - $posts_page_id = get_option( 'page_for_posts' ); - $canonical = WPSEO_Meta::get_value( 'canonical', $posts_page_id ); - - if ( empty( $canonical ) ) { - $canonical = get_permalink( $posts_page_id ); - } - } - elseif ( is_tax() || is_tag() || is_category() ) { - - $term = get_queried_object(); - - if ( ! empty( $term ) && ! $this->is_multiple_terms_query() ) { - - $canonical_override = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'canonical' ); - $term_link = get_term_link( $term, $term->taxonomy ); - - if ( ! is_wp_error( $term_link ) ) { - $canonical = $term_link; - } - } - } - elseif ( is_post_type_archive() ) { - $post_type = get_query_var( 'post_type' ); - if ( is_array( $post_type ) ) { - $post_type = reset( $post_type ); - } - $canonical = get_post_type_archive_link( $post_type ); - } - elseif ( is_author() ) { - $canonical = get_author_posts_url( get_query_var( 'author' ), get_query_var( 'author_name' ) ); - } - elseif ( is_archive() ) { - if ( is_date() ) { - if ( is_day() ) { - $canonical = get_day_link( get_query_var( 'year' ), get_query_var( 'monthnum' ), get_query_var( 'day' ) ); - } - elseif ( is_month() ) { - $canonical = get_month_link( get_query_var( 'year' ), get_query_var( 'monthnum' ) ); - } - elseif ( is_year() ) { - $canonical = get_year_link( get_query_var( 'year' ) ); - } - } - } - - $this->canonical_unpaged = $canonical; - - if ( $canonical && get_query_var( 'paged' ) > 1 ) { - global $wp_rewrite; - if ( ! $wp_rewrite->using_permalinks() ) { - if ( is_front_page() ) { - $canonical = trailingslashit( $canonical ); - } - $canonical = add_query_arg( 'paged', get_query_var( 'paged' ), $canonical ); - } - else { - if ( is_front_page() ) { - $canonical = WPSEO_Sitemaps_Router::get_base_url( '' ); - } - $canonical = user_trailingslashit( trailingslashit( $canonical ) . trailingslashit( $wp_rewrite->pagination_base ) . get_query_var( 'paged' ) ); - } - } - } - - $this->canonical_no_override = $canonical; - - if ( is_string( $canonical ) && $canonical !== '' ) { - // Force canonical links to be absolute, relative is NOT an option. - if ( WPSEO_Utils::is_url_relative( $canonical ) === true ) { - $canonical = $this->base_url( $canonical ); - } - } - - if ( is_string( $canonical_override ) && $canonical_override !== '' ) { - $canonical = $canonical_override; - } - - /** - * Filter: 'wpseo_canonical' - Allow filtering of the canonical URL put out by Yoast SEO - * - * @api string $canonical The canonical URL - */ - $this->canonical = apply_filters( 'wpseo_canonical', $canonical ); - } - - /** - * Parse the home URL setting to find the base URL for relative URLs. - * - * @param string $path Optional path string. - * - * @return string - */ - private function base_url( $path = null ) { - $url = get_option( 'home' ); - - $parts = wp_parse_url( $url ); - - $base_url = trailingslashit( $parts['scheme'] . '://' . $parts['host'] ); - - if ( ! is_null( $path ) ) { - $base_url .= ltrim( $path, '/' ); - } - - return $base_url; - } - - /** - * Adds 'prev' and 'next' links to archives. - * - * @link http://googlewebmastercentral.blogspot.com/2011/09/pagination-with-relnext-and-relprev.html - * @since 1.0.3 - */ - public function adjacent_rel_links() { - // Don't do this for Genesis, as the way Genesis handles homepage functionality is different and causes issues sometimes. - /** - * Filter 'wpseo_genesis_force_adjacent_rel_home' - Allows devs to allow echoing rel="next" / rel="prev" by Yoast SEO on Genesis installs - * - * @api bool $unsigned Whether or not to rel=next / rel=prev - */ - if ( is_home() && function_exists( 'genesis' ) && apply_filters( 'wpseo_genesis_force_adjacent_rel_home', false ) === false ) { - return; - } - - global $wp_query; - - if ( ! is_singular() ) { - $url = $this->canonical( false, true, true ); - - if ( is_string( $url ) && $url !== '' ) { - $paged = get_query_var( 'paged' ); - - if ( 0 == $paged ) { - $paged = 1; - } - - if ( $paged == 2 ) { - $this->adjacent_rel_link( 'prev', $url, ( $paged - 1 ), true ); - } - - // Make sure to use index.php when needed, done after paged == 2 check so the prev links to homepage will not have index.php erroneously. - if ( is_front_page() ) { - $url = WPSEO_Sitemaps_Router::get_base_url( '' ); - } - - if ( $paged > 2 ) { - $this->adjacent_rel_link( 'prev', $url, ( $paged - 1 ), true ); - } - - if ( $paged < $wp_query->max_num_pages ) { - $this->adjacent_rel_link( 'next', $url, ( $paged + 1 ), true ); - } - } - } - else { - $numpages = 0; - if ( isset( $wp_query->post->post_content ) ) { - $numpages = ( substr_count( $wp_query->post->post_content, '<!--nextpage-->' ) + 1 ); - } - if ( $numpages > 1 ) { - $page = get_query_var( 'page' ); - if ( ! $page ) { - $page = 1; - } - - $url = get_permalink( $wp_query->post->ID ); - - // If the current page is the frontpage, pagination should use /base/. - if ( $this->is_home_static_page() ) { - $usebase = true; - } - else { - $usebase = false; - } - - if ( $page > 1 ) { - $this->adjacent_rel_link( 'prev', $url, ( $page - 1 ), $usebase, 'single_paged' ); - } - if ( $page < $numpages ) { - $this->adjacent_rel_link( 'next', $url, ( $page + 1 ), $usebase, 'single_paged' ); - } - } - } - } - - /** - * Get adjacent pages link for archives - * - * @since 1.0.2 - * - * @param string $rel Link relationship, prev or next. - * @param string $url the un-paginated URL of the current archive. - * @param string $page the page number to add on to $url for the $link tag. - * @param boolean $incl_pagination_base whether or not to include /page/ or not. - * - * @return void - */ - private function adjacent_rel_link( $rel, $url, $page, $incl_pagination_base ) { - global $wp_rewrite; - if ( ! $wp_rewrite->using_permalinks() ) { - if ( $page > 1 ) { - $url = add_query_arg( 'paged', $page, $url ); - } - } - else { - if ( $page > 1 ) { - $base = ''; - if ( $incl_pagination_base ) { - $base = trailingslashit( $wp_rewrite->pagination_base ); - } - $url = user_trailingslashit( trailingslashit( $url ) . $base . $page ); - } - } - /** - * Filter: 'wpseo_' . $rel . '_rel_link' - Allow changing link rel output by Yoast SEO - * - * @api string $unsigned The full `<link` element. - */ - $link = apply_filters( 'wpseo_' . $rel . '_rel_link', '<link rel="' . esc_attr( $rel ) . '" href="' . esc_url( $url ) . "\" />\n" ); - - if ( is_string( $link ) && $link !== '' ) { - echo $link; - } - } - - /** - * Output the rel=publisher code on every page of the site. - * - * @return boolean Boolean indicating whether the publisher link was printed - */ - public function publisher() { - - if ( $this->options['plus-publisher'] !== '' ) { - echo '<link rel="publisher" href="', esc_url( $this->options['plus-publisher'] ), '"/>', "\n"; - - return true; - } - - return false; - } - - /** - * Outputs the meta keywords element. - * - * @return void - */ - public function metakeywords() { - global $wp_query, $post; - - if ( $this->options['usemetakeywords'] === false ) { - return; - } - - $keywords = ''; - - if ( is_singular() ) { - $keywords = WPSEO_Meta::get_value( 'metakeywords' ); - if ( $keywords === '' && ( is_object( $post ) && ( ( isset( $this->options[ 'metakey-' . $post->post_type ] ) && $this->options[ 'metakey-' . $post->post_type ] !== '' ) ) ) ) { - $keywords = wpseo_replace_vars( $this->options[ 'metakey-' . $post->post_type ], $post ); - } - } - else { - if ( $this->is_home_posts_page() && $this->options['metakey-home-wpseo'] !== '' ) { - $keywords = wpseo_replace_vars( $this->options['metakey-home-wpseo'], array() ); - } - elseif ( $this->is_home_static_page() ) { - $keywords = WPSEO_Meta::get_value( 'metakeywords' ); - if ( $keywords === '' && ( is_object( $post ) && ( isset( $this->options[ 'metakey-' . $post->post_type ] ) && $this->options[ 'metakey-' . $post->post_type ] !== '' ) ) ) { - $keywords = wpseo_replace_vars( $this->options[ 'metakey-' . $post->post_type ], $post ); - } - } - elseif ( $this->is_posts_page() ) { - $keywords = $this->get_keywords( get_post( get_option( 'page_for_posts' ) ) ); - } - elseif ( is_category() || is_tag() || is_tax() ) { - $term = $wp_query->get_queried_object(); - - if ( is_object( $term ) ) { - $keywords = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'metakey' ); - if ( ( ! is_string( $keywords ) || $keywords === '' ) && ( isset( $this->options[ 'metakey-tax-' . $term->taxonomy ] ) && $this->options[ 'metakey-tax-' . $term->taxonomy ] !== '' ) ) { - $keywords = wpseo_replace_vars( $this->options[ 'metakey-tax-' . $term->taxonomy ], $term ); - } - } - } - elseif ( is_author() ) { - $author_id = get_query_var( 'author' ); - $keywords = get_the_author_meta( 'metakey', $author_id ); - if ( ! $keywords && $this->options['metakey-author-wpseo'] !== '' ) { - $keywords = wpseo_replace_vars( $this->options['metakey-author-wpseo'], $wp_query->get_queried_object() ); - } - } - elseif ( is_post_type_archive() ) { - $post_type = get_query_var( 'post_type' ); - if ( is_array( $post_type ) ) { - $post_type = reset( $post_type ); - } - if ( isset( $this->options[ 'metakey-ptarchive-' . $post_type ] ) && $this->options[ 'metakey-ptarchive-' . $post_type ] !== '' ) { - $keywords = wpseo_replace_vars( $this->options[ 'metakey-ptarchive-' . $post_type ], $wp_query->get_queried_object() ); - } - } - } - - $keywords = apply_filters( 'wpseo_metakey', trim( $keywords ) ); // TODO Make deprecated. - - /** - * Filter: 'wpseo_metakeywords' - Allow changing the Yoast SEO meta keywords - * - * @api string $keywords The meta keywords to be echoed. - */ - $keywords = apply_filters( 'wpseo_metakeywords', trim( $keywords ) ); // More appropriately named. - - if ( is_string( $keywords ) && $keywords !== '' ) { - echo '<meta name="keywords" content="', esc_attr( strip_tags( stripslashes( $keywords ) ) ), '"/>', "\n"; - } - } - - /** - * Outputs the meta description element or returns the description text. - * - * @param bool $echo Echo or return output flag. - * - * @return string - */ - public function metadesc( $echo = true ) { - if ( is_null( $this->metadesc ) ) { - $this->generate_metadesc(); - } - - if ( $echo !== false ) { - if ( is_string( $this->metadesc ) && $this->metadesc !== '' ) { - echo '<meta name="description" content="', esc_attr( strip_tags( stripslashes( $this->metadesc ) ) ), '"/>', "\n"; - $this->add_robot_content_noodp( $this->metadesc ); - } - elseif ( current_user_can( 'manage_options' ) && is_singular() ) { - echo '<!-- ', __( 'Admin only notice: this page doesn\'t show a meta description because it doesn\'t have one, either write it for this page specifically or go into the SEO -> Titles menu and set up a template.', 'wordpress-seo' ), ' -->', "\n"; - } - } - else { - return $this->metadesc; - } - } - - /** - * Generates the meta description text. - */ - private function generate_metadesc() { - global $post, $wp_query; - - $metadesc = ''; - $metadesc_override = false; - $post_type = ''; - $template = ''; - - if ( is_object( $post ) && ( isset( $post->post_type ) && $post->post_type !== '' ) ) { - $post_type = $post->post_type; - } - - if ( is_singular() ) { - if ( ( $metadesc === '' && $post_type !== '' ) && isset( $this->options[ 'metadesc-' . $post_type ] ) ) { - $template = $this->options[ 'metadesc-' . $post_type ]; - $term = $post; - } - $metadesc_override = WPSEO_Meta::get_value( 'metadesc' ); - } - else { - if ( is_search() ) { - $metadesc = ''; - } - elseif ( $this->is_home_posts_page() ) { - $template = $this->options['metadesc-home-wpseo']; - $term = array(); - - if ( empty( $template ) ) { - $template = get_bloginfo( 'description' ); - } - } - elseif ( $this->is_posts_page() ) { - $metadesc = WPSEO_Meta::get_value( 'metadesc', get_option( 'page_for_posts' ) ); - if ( ( $metadesc === '' && $post_type !== '' ) && isset( $this->options[ 'metadesc-' . $post_type ] ) ) { - $page = get_post( get_option( 'page_for_posts' ) ); - $template = $this->options[ 'metadesc-' . $post_type ]; - $term = $page; - } - } - elseif ( $this->is_home_static_page() ) { - $metadesc = WPSEO_Meta::get_value( 'metadesc' ); - if ( ( $metadesc === '' && $post_type !== '' ) && isset( $this->options[ 'metadesc-' . $post_type ] ) ) { - $template = $this->options[ 'metadesc-' . $post_type ]; - } - } - elseif ( is_category() || is_tag() || is_tax() ) { - $term = $wp_query->get_queried_object(); - $metadesc_override = WPSEO_Taxonomy_Meta::get_term_meta( $term, $term->taxonomy, 'desc' ); - if ( is_object( $term ) && isset( $term->taxonomy, $this->options[ 'metadesc-tax-' . $term->taxonomy ] ) ) { - $template = $this->options[ 'metadesc-tax-' . $term->taxonomy ]; - } - } - elseif ( is_author() ) { - $author_id = get_query_var( 'author' ); - $metadesc = get_the_author_meta( 'wpseo_metadesc', $author_id ); - if ( ( ! is_string( $metadesc ) || $metadesc === '' ) && '' !== $this->options['metadesc-author-wpseo'] ) { - $template = $this->options['metadesc-author-wpseo']; - } - } - elseif ( is_post_type_archive() ) { - $post_type = get_query_var( 'post_type' ); - if ( is_array( $post_type ) ) { - $post_type = reset( $post_type ); - } - if ( isset( $this->options[ 'metadesc-ptarchive-' . $post_type ] ) ) { - $template = $this->options[ 'metadesc-ptarchive-' . $post_type ]; - } - } - elseif ( is_archive() ) { - $template = $this->options['metadesc-archive-wpseo']; - } - - // If we're on a paginated page, and the template doesn't change for paginated pages, bail. - if ( ( ! is_string( $metadesc ) || $metadesc === '' ) && get_query_var( 'paged' ) && get_query_var( 'paged' ) > 1 && $template !== '' ) { - if ( strpos( $template, '%%page' ) === false ) { - $metadesc = ''; - } - } - } - - $post_data = $post; - - if ( is_string( $metadesc_override ) && '' !== $metadesc_override ) { - $metadesc = $metadesc_override; - if ( isset( $term ) ) { - $post_data = $term; - } - } - else if ( ( ! is_string( $metadesc ) || '' === $metadesc ) && '' !== $template ) { - if ( ! isset( $term ) ) { - $term = $wp_query->get_queried_object(); - } - - $metadesc = $template; - $post_data = $term; - } - - $metadesc = wpseo_replace_vars( $metadesc, $post_data ); - - /** - * Filter: 'wpseo_metadesc' - Allow changing the Yoast SEO meta description sentence. - * - * @api string $metadesc The description sentence. - */ - $this->metadesc = apply_filters( 'wpseo_metadesc', trim( $metadesc ) ); - } - - /** - * Based on the redirect meta value, this function determines whether it should redirect the current post / page. - * - * @return boolean - */ - function page_redirect() { - if ( is_singular() ) { - global $post; - if ( ! isset( $post ) || ! is_object( $post ) ) { - return false; - } - - $redir = WPSEO_Meta::get_value( 'redirect', $post->ID ); - if ( $redir !== '' ) { - wp_redirect( $redir, 301 ); - exit; - } - } - - return false; - } - - /** - * Outputs noindex values for the current page. - */ - public function noindex_page() { - echo '<meta name="robots" content="noindex" />', "\n"; - } - - /** - * Send a Robots HTTP header preventing URL from being indexed in the search results while allowing search engines - * to follow the links in the object at the URL. - * - * @since 1.1.7 - * @return boolean Boolean indicating whether the noindex header was sent - */ - public function noindex_feed() { - - if ( ( is_feed() || is_robots() ) && headers_sent() === false ) { - header( 'X-Robots-Tag: noindex, follow', true ); - - return true; - } - - return false; - } - - /** - * Adds rel="nofollow" to a link, only used for login / registration links. - * - * @param string $input The link element as a string. - * - * @return string - */ - public function nofollow_link( $input ) { - return str_replace( '<a ', '<a rel="nofollow" ', $input ); - } - - /** - * When certain archives are disabled, this redirects those to the homepage. - * - * @return boolean False when no redirect was triggered - */ - function archive_redirect() { - global $wp_query; - - if ( - ( $this->options['disable-date'] === true && $wp_query->is_date ) || - ( $this->options['disable-author'] === true && $wp_query->is_author ) || - ( $this->options['disable-post_format'] === true && $wp_query->is_tax( 'post_format' ) ) - ) { - wp_safe_redirect( get_bloginfo( 'url' ), 301 ); - exit; - } - - return false; - } - - /** - * If the option to redirect attachments to their parent is checked, this performs the redirect. - * - * An extra check is done for when the attachment has no parent. - * - * @return boolean False when no redirect was triggered - */ - function attachment_redirect() { - global $post; - if ( is_attachment() && ( ( is_object( $post ) && isset( $post->post_parent ) ) && ( is_numeric( $post->post_parent ) && $post->post_parent != 0 ) ) ) { - wp_safe_redirect( get_permalink( $post->post_parent ), 301 ); - exit; - } - - return false; - } - - /** - * Trailing slashes for everything except is_single(). - * - * Thanks to Mark Jaquith for this code. - * - * @param string $url URL string. - * @param string $type Context (such as single). - * - * @return string - */ - function add_trailingslash( $url, $type ) { - if ( 'single' === $type || 'single_paged' === $type ) { - return $url; - } - else { - return trailingslashit( $url ); - } - } - - /** - * Removes the ?replytocom variable from the link, replacing it with a #comment-<number> anchor. - * - * @todo Should this function also allow for relative urls ? - * - * @param string $link The comment link as a string. - * - * @return string - */ - public function remove_reply_to_com( $link ) { - return preg_replace( '`href=(["\'])(?:.*(?:\?|&|&)replytocom=(\d+)#respond)`', 'href=$1#comment-$2', $link ); - } - - /** - * Redirect out the ?replytocom variables when cleanreplytocom is enabled - * - * @since 1.4.13 - * @return boolean - */ - function replytocom_redirect() { - - if ( isset( $_GET['replytocom'] ) && is_singular() ) { - $url = get_permalink( $GLOBALS['post']->ID ); - $hash = sanitize_text_field( $_GET['replytocom'] ); - $query_string = remove_query_arg( 'replytocom', sanitize_text_field( $_SERVER['QUERY_STRING'] ) ); - if ( ! empty( $query_string ) ) { - $url .= '?' . $query_string; - } - $url .= '#comment-' . $hash; - wp_safe_redirect( $url, 301 ); - exit; - } - - return false; - } - - /** - * Removes unneeded query variables from the URL. - * - * @return boolean - */ - public function clean_permalink() { - if ( is_robots() || get_query_var( 'sitemap' ) || empty( $_GET ) ) { - return false; - } - - global $wp_query; - - // Recreate current URL. - $cururl = 'http'; - if ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' ) { - $cururl .= 's'; - } - $cururl .= '://'; - - if ( $_SERVER['SERVER_PORT'] != '80' && $_SERVER['SERVER_PORT'] != '443' ) { - $cururl .= $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['REQUEST_URI']; - } - else { - $cururl .= $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; - } - $properurl = ''; - - if ( is_singular() ) { - global $post; - if ( empty( $post ) ) { - $post = $wp_query->get_queried_object(); - } - - $properurl = get_permalink( $post->ID ); - - $page = get_query_var( 'page' ); - if ( $page && $page != 1 ) { - $post = get_post( $post->ID ); - $page_count = substr_count( $post->post_content, '<!--nextpage-->' ); - if ( $page > ( $page_count + 1 ) ) { - $properurl = user_trailingslashit( trailingslashit( $properurl ) . ( $page_count + 1 ) ); - } - else { - $properurl = user_trailingslashit( trailingslashit( $properurl ) . $page ); - } - } - - // Fix reply to comment links, whoever decided this should be a GET variable? - if ( preg_match( '`(\?replytocom=[^&]+)`', sanitize_text_field( $_SERVER['REQUEST_URI'] ), $matches ) ) { - $properurl .= str_replace( '?replytocom=', '#comment-', $matches[0] ); - } - unset( $matches ); - - // Prevent cleaning out posts & page previews for people capable of viewing them. - if ( isset( $_GET['preview'], $_GET['preview_nonce'] ) && current_user_can( 'edit_post' ) ) { - $properurl = ''; - } - } - elseif ( is_front_page() ) { - if ( $this->is_home_posts_page() ) { - $properurl = get_bloginfo( 'url' ) . '/'; - } - elseif ( $this->is_home_static_page() ) { - $properurl = get_permalink( $GLOBALS['post']->ID ); - } - } - elseif ( is_category() || is_tag() || is_tax() ) { - $term = $wp_query->get_queried_object(); - if ( is_feed() ) { - $properurl = get_term_feed_link( $term->term_id, $term->taxonomy ); - } - else { - $properurl = get_term_link( $term, $term->taxonomy ); - } - } - elseif ( is_search() ) { - $s = urlencode( preg_replace( '`(%20|\+)`', ' ', get_search_query() ) ); - $properurl = get_bloginfo( 'url' ) . '/?s=' . $s; - } - elseif ( is_404() ) { - if ( is_multisite() && ! is_subdomain_install() && is_main_site() ) { - if ( $cururl == get_bloginfo( 'url' ) . '/blog/' || $cururl == get_bloginfo( 'url' ) . '/blog' ) { - if ( $this->is_home_static_page() ) { - $properurl = get_permalink( get_option( 'page_for_posts' ) ); - } - else { - $properurl = get_bloginfo( 'url' ) . '/'; - } - } - } - } - - if ( ! empty( $properurl ) && $wp_query->query_vars['paged'] != 0 && $wp_query->post_count != 0 ) { - if ( is_search() && ! empty( $s ) ) { - $properurl = get_bloginfo( 'url' ) . '/page/' . $wp_query->query_vars['paged'] . '/?s=' . $s; - } - else { - $properurl = user_trailingslashit( trailingslashit( $properurl ) . 'page/' . $wp_query->query_vars['paged'] ); - } - } - - // Prevent cleaning out the WP Subscription managers interface for everyone. - if ( isset( $_GET['wp-subscription-manager'] ) ) { - $properurl = ''; - } - - /** - * Filter: 'wpseo_whitelist_permalink_vars' - Allow plugins to register their own variables not to clean - * - * @api array $unsigned Array of permalink variables _not_ to clean. Empty by default. - */ - $whitelisted_extravars = apply_filters( 'wpseo_whitelist_permalink_vars', array() ); - - if ( $this->options['cleanpermalink-googlesitesearch'] === true ) { - // Prevent cleaning out Google Site searches. - $whitelisted_extravars = array_merge( $whitelisted_extravars, array( - 'q', - 'cx', - 'debug', - 'cof', - 'ie', - 'sa', - ) ); - } - - if ( $this->options['cleanpermalink-googlecampaign'] === true ) { - // Prevent cleaning out Google Analytics campaign variables. - $whitelisted_extravars = array_merge( $whitelisted_extravars, array( - 'utm_campaign', - 'utm_medium', - 'utm_source', - 'utm_content', - 'utm_term', - 'utm_id', - 'gclid', - ) ); - } - - if ( $this->options['cleanpermalink-extravars'] !== '' ) { - $extravars = explode( ',', $this->options['cleanpermalink-extravars'] ); - $extravars = array_map( 'trim', $extravars ); - $whitelisted_extravars = array_merge( $whitelisted_extravars, $extravars ); - unset( $extravars ); - } - - foreach ( $whitelisted_extravars as $get ) { - if ( isset( $_GET[ trim( $get ) ] ) ) { - $properurl = ''; - } - } - unset( $get ); - - if ( ! empty( $properurl ) && $cururl != $properurl ) { - wp_safe_redirect( $properurl, 301 ); - exit; - } - } - - /** - * Replaces the possible RSS variables with their actual values. - * - * @param string $content The RSS content that should have the variables replaced. - * - * @return string - */ - function rss_replace_vars( $content ) { - global $post; - - /** - * Allow the developer to determine whether or not to follow the links in the bits Yoast SEO adds to the RSS feed, defaults to true. - * - * @api bool $unsigned Whether or not to follow the links in RSS feed, defaults to true. - * - * @since 1.4.20 - */ - $no_follow = apply_filters( 'nofollow_rss_links', true ); - $no_follow_attr = ''; - if ( $no_follow === true ) { - $no_follow_attr = 'rel="nofollow" '; - } - - $author_link = ''; - if ( is_object( $post ) ) { - $author_link = '<a ' . $no_follow_attr . 'href="' . esc_url( get_author_posts_url( $post->post_author ) ) . '">' . get_the_author() . '</a>'; - } - - $post_link = '<a ' . $no_follow_attr . 'href="' . esc_url( get_permalink() ) . '">' . get_the_title() . '</a>'; - $blog_link = '<a ' . $no_follow_attr . 'href="' . esc_url( get_bloginfo( 'url' ) ) . '">' . get_bloginfo( 'name' ) . '</a>'; - $blog_desc_link = '<a ' . $no_follow_attr . 'href="' . esc_url( get_bloginfo( 'url' ) ) . '">' . get_bloginfo( 'name' ) . ' - ' . strip_tags( get_bloginfo( 'description' ) ) . '</a>'; - - $content = stripslashes( trim( $content ) ); - $content = str_replace( '%%AUTHORLINK%%', $author_link, $content ); - $content = str_replace( '%%POSTLINK%%', $post_link, $content ); - $content = str_replace( '%%BLOGLINK%%', $blog_link, $content ); - $content = str_replace( '%%BLOGDESCLINK%%', $blog_desc_link, $content ); - - return $content; - } - - /** - * Adds the RSS footer (or header) to the full RSS feed item. - * - * @param string $content Feed item content. - * - * @return string - */ - function embed_rssfooter( $content ) { - return $this->embed_rss( $content, 'full' ); - } - - /** - * Adds the RSS footer (or header) to the excerpt RSS feed item. - * - * @param string $content Feed item excerpt. - * - * @return string - */ - function embed_rssfooter_excerpt( $content ) { - return $this->embed_rss( $content, 'excerpt' ); - } - - /** - * Adds the RSS footer and/or header to an RSS feed item. - * - * @since 1.4.14 - * - * @param string $content Feed item content. - * @param string $context Feed item context, either 'excerpt' or 'full'. - * - * @return string - */ - function embed_rss( $content, $context = 'full' ) { - - /** - * Filter: 'wpseo_include_rss_footer' - Allow the RSS footer to be dynamically shown/hidden. - * - * @api boolean $show_embed Indicates if the RSS footer should be shown or not - * - * @param string $context The context of the RSS content - 'full' or 'excerpt'. - */ - if ( ! apply_filters( 'wpseo_include_rss_footer', true, $context ) ) { - return $content; - } - - if ( is_feed() ) { - $before = ''; - $after = ''; - - if ( $this->options['rssbefore'] !== '' ) { - $before = wpautop( $this->rss_replace_vars( $this->options['rssbefore'] ) ); - } - if ( $this->options['rssafter'] !== '' ) { - $after = wpautop( $this->rss_replace_vars( $this->options['rssafter'] ) ); - } - if ( $before !== '' || $after !== '' ) { - if ( ( isset( $context ) && $context === 'excerpt' ) && trim( $content ) !== '' ) { - $content = wpautop( $content ); - } - $content = $before . $content . $after; - } - } - - return $content; - } - - - /** - * Used in the force rewrite functionality this retrieves the output, replaces the title with the proper SEO - * title and then flushes the output. - */ - function flush_cache() { - - global $wp_query; - - if ( $this->ob_started !== true ) { - return false; - } - - $content = ob_get_clean(); - - $old_wp_query = $wp_query; - - wp_reset_query(); - - $title = $this->title( '' ); - - // Find all titles, strip them out and add the new one in within the debug marker, so it's easily identified whether a site uses force rewrite. - $content = preg_replace( '/<title.*?\/title>/i', '', $content ); - $content = str_replace( $this->debug_mark( false ), $this->debug_mark( false ) . "\n" . '<title>' . $title . '', $content ); - - $GLOBALS['wp_query'] = $old_wp_query; - - echo $content; - - return true; - } - - /** - * Starts the output buffer so it can later be fixed by flush_cache() - */ - function force_rewrite_output_buffer() { - $this->ob_started = true; - ob_start(); - } - - /** - * Function used in testing whether the title should be force rewritten or not. - * - * @param string $title Title string. - * - * @return string - */ - function title_test_helper( $title ) { - $wpseo_titles = get_option( 'wpseo_titles' ); - - $wpseo_titles['title_test'] ++; - update_option( 'wpseo_titles', $wpseo_titles ); - - // Prevent this setting from being on forever when something breaks, as it breaks caching. - if ( $wpseo_titles['title_test'] > 5 ) { - $wpseo_titles['title_test'] = 0; - update_option( 'wpseo_titles', $wpseo_titles ); - - remove_filter( 'wpseo_title', array( $this, 'title_test_helper' ) ); - - return $title; - } - - if ( ! defined( 'DONOTCACHEPAGE' ) ) { - define( 'DONOTCACHEPAGE', true ); - } - if ( ! defined( 'DONOTCACHCEOBJECT' ) ) { - define( 'DONOTCACHCEOBJECT', true ); - } - if ( ! defined( 'DONOTMINIFY' ) ) { - define( 'DONOTMINIFY', true ); - } - - if ( $_SERVER['HTTP_USER_AGENT'] === "WordPress/{$GLOBALS['wp_version']}; " . get_bloginfo( 'url' ) . ' - Yoast' ) { - return 'This is a Yoast Test Title'; - } - - return $title; - } - - /** - * Get the product name in the head section - * - * @return string - */ - private function head_product_name() { - if ( $this->is_premium() ) { - return 'Yoast SEO Premium plugin'; - } - else { - return 'Yoast SEO plugin'; - } - } - - /** - * Check if this plugin is the premium version of WPSEO - * - * @return bool - */ - private function is_premium() { - return file_exists( WPSEO_PATH . 'premium/' ); - } - - /** - * Checks whether the user has written a meta-description. If written, makes sure meta robots content is noodp. - * - * @param String $description The content of the meta description. - */ - private function add_robot_content_noodp( $description ) { - if ( ! ( empty( $description ) ) && $this->options['noodp'] === false ) { - $this->options['noodp'] = true; - } - } - - /** - * Getting the keywords - * - * @param WP_Post $post The post object with the values. - * - * @return string - */ - private function get_keywords( $post ) { - $keywords = WPSEO_Meta::get_value( 'metakeywords', $post->ID ); - $option_meta_key = 'metakey-' . $post->post_type; - - if ( $keywords === '' && ( is_object( $post ) && ( isset( $this->options[ $option_meta_key ] ) && $this->options[ $option_meta_key ] !== '' ) ) ) { - $keywords = wpseo_replace_vars( $this->options[ $option_meta_key ], $post ); - } - - return $keywords; - } - - /** - * Check if term archive query is for multiple terms (/term-1,term2/ or /term-1+term-2/). - * - * @return bool - */ - protected function is_multiple_terms_query() { - - global $wp_query; - - if ( ! is_tax() && ! is_tag() && ! is_category() ) { - return false; - } - - $term = get_queried_object(); - $queried_terms = $wp_query->tax_query->queried_terms; - - if ( empty( $queried_terms[ $term->taxonomy ]['terms'] ) ) { - return false; - } - - return count( $queried_terms[ $term->taxonomy ]['terms'] ) > 1; - } - - /** Deprecated functions */ - // @codeCoverageIgnoreStart - /** - * Outputs or returns the debug marker, which is also used for title replacement when force rewrite is active. - * - * @deprecated 4.4 - * - * @param bool $echo Whether or not to echo the debug marker. - * @return string - */ - public function debug_marker( $echo = false ) { - return $this->debug_mark( $echo ); - } - - // @codeCoverageIgnoreEnd -} diff --git a/wp/wp-content/plugins/wordpress-seo/frontend/class-json-ld.php b/wp/wp-content/plugins/wordpress-seo/frontend/class-json-ld.php deleted file mode 100644 index 7445173e..00000000 --- a/wp/wp-content/plugins/wordpress-seo/frontend/class-json-ld.php +++ /dev/null @@ -1,270 +0,0 @@ -options = WPSEO_Options::get_options( array( 'wpseo', 'wpseo_social' ) ); - - add_action( 'wpseo_head', array( $this, 'json_ld' ), 90 ); - add_action( 'wpseo_json_ld', array( $this, 'website' ), 10 ); - add_action( 'wpseo_json_ld', array( $this, 'organization_or_person' ), 20 ); - } - - /** - * JSON LD output function that the functions for specific code can hook into - * - * @since 1.8 - */ - public function json_ld() { - do_action( 'wpseo_json_ld' ); - } - - /** - * Outputs code to allow Google to recognize social profiles for use in the Knowledge graph - * - * @since 1.8 - */ - public function organization_or_person() { - if ( '' === $this->options['company_or_person'] ) { - return; - } - - $this->prepare_organization_person_markup(); - - switch ( $this->options['company_or_person'] ) { - case 'company': - $this->organization(); - break; - case 'person': - $this->person(); - break; - } - - $this->output( $this->options['company_or_person'] ); - } - - /** - * Outputs code to allow recognition of the internal search engine - * - * @since 1.5.7 - * - * @link https://developers.google.com/structured-data/site-name - */ - public function website() { - $this->data = array( - '@context' => 'http://schema.org', - '@type' => 'WebSite', - '@id' => '#website', - 'url' => $this->get_home_url(), - 'name' => $this->get_website_name(), - ); - - $this->add_alternate_name(); - $this->internal_search_section(); - - $this->output( 'website' ); - } - - /** - * Outputs the JSON LD code in a valid JSON+LD wrapper - * - * @since 1.8 - * - * @param string $context The context of the output, useful for filtering. - */ - private function output( $context ) { - /** - * Filter: 'wpseo_json_ld_output' - Allows filtering of the JSON+LD output - * - * @api array $output The output array, before its JSON encoded - * - * @param string $context The context of the output, useful to determine whether to filter or not. - */ - $this->data = apply_filters( 'wpseo_json_ld_output', $this->data, $context ); - - if ( is_array( $this->data ) && ! empty( $this->data ) ) { - $json_data = wp_json_encode( $this->data ); - - echo "', "\n"; - } - - // Empty the $data array so we don't output it twice. - $this->data = array(); - } - - /** - * Schema for Organization - */ - private function organization() { - if ( '' !== $this->options['company_name'] ) { - $this->data['@type'] = 'Organization'; - $this->data['@id'] = '#organization'; - $this->data['name'] = $this->options['company_name']; - $this->data['logo'] = $this->options['company_logo']; - return; - } - $this->data = false; - } - - /** - * Schema for Person - */ - private function person() { - if ( '' !== $this->options['person_name'] ) { - $this->data['@type'] = 'Person'; - $this->data['@id'] = '#person'; - $this->data['name'] = $this->options['person_name']; - return; - } - $this->data = false; - } - - /** - * Prepares the organization or person markup - */ - private function prepare_organization_person_markup() { - $this->fetch_social_profiles(); - - $this->data = array( - '@context' => 'http://schema.org', - '@type' => '', - 'url' => WPSEO_Frontend::get_instance()->canonical( false, true ), - 'sameAs' => $this->profiles, - ); - } - - /** - * Retrieve the social profiles to display in the organization output. - * - * @since 1.8 - * - * @link https://developers.google.com/webmasters/structured-data/customize/social-profiles - */ - private function fetch_social_profiles() { - $social_profiles = array( - 'facebook_site', - 'instagram_url', - 'linkedin_url', - 'plus-publisher', - 'myspace_url', - 'youtube_url', - 'pinterest_url', - ); - foreach ( $social_profiles as $profile ) { - if ( $this->options[ $profile ] !== '' ) { - $this->profiles[] = $this->options[ $profile ]; - } - } - - if ( ! empty( $this->options['twitter_site'] ) ) { - $this->profiles[] = 'https://twitter.com/' . $this->options['twitter_site']; - } - } - - /** - * Retrieves the home URL - * - * @return string - */ - private function get_home_url() { - /** - * Filter: 'wpseo_json_home_url' - Allows filtering of the home URL for Yoast SEO's JSON+LD output - * - * @api unsigned string - */ - return apply_filters( 'wpseo_json_home_url', WPSEO_Utils::home_url() ); - } - - /** - * Returns an alternate name if one was specified in the Yoast SEO settings - */ - private function add_alternate_name() { - if ( '' !== $this->options['alternate_website_name'] ) { - $this->data['alternateName'] = $this->options['alternate_website_name']; - } - } - - /** - * Adds the internal search JSON LD code if it's not disabled - * - * @link https://developers.google.com/structured-data/slsb-overview - */ - private function internal_search_section() { - /** - * Filter: 'disable_wpseo_json_ld_search' - Allow disabling of the json+ld output - * - * @api bool $display_search Whether or not to display json+ld search on the frontend - */ - if ( ! apply_filters( 'disable_wpseo_json_ld_search', false ) ) { - /** - * Filter: 'wpseo_json_ld_search_url' - Allows filtering of the search URL for Yoast SEO - * - * @api string $search_url The search URL for this site with a `{search_term_string}` variable. - */ - $search_url = apply_filters( 'wpseo_json_ld_search_url', $this->get_home_url() . '?s={search_term_string}' ); - - $this->data['potentialAction'] = array( - '@type' => 'SearchAction', - 'target' => $search_url, - 'query-input' => 'required name=search_term_string', - ); - } - } - - /** - * Returns the website name either from Yoast SEO's options or from the site settings - * - * @since 2.1 - * - * @return string - */ - private function get_website_name() { - if ( '' !== $this->options['website_name'] ) { - return $this->options['website_name']; - } - - return get_bloginfo( 'name' ); - } - - /** - * Renders internal search schema markup - * - * @deprecated 2.1 - * @deprecated use WPSEO_JSON_LD::website() - - * @codeCoverageIgnore - */ - public function internal_search() { - _deprecated_function( __METHOD__, 'WPSEO 2.1', 'WPSEO_JSON_LD::website()' ); - - $this->website(); - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/frontend/class-opengraph.php b/wp/wp-content/plugins/wordpress-seo/frontend/class-opengraph.php deleted file mode 100644 index 52393881..00000000 --- a/wp/wp-content/plugins/wordpress-seo/frontend/class-opengraph.php +++ /dev/null @@ -1,1086 +0,0 @@ -options = WPSEO_Options::get_option( 'wpseo_social' ); - - if ( isset( $GLOBALS['fb_ver'] ) || class_exists( 'Facebook_Loader', false ) ) { - add_filter( 'fb_meta_tags', array( $this, 'facebook_filter' ), 10, 1 ); - } - else { - add_filter( 'language_attributes', array( $this, 'add_opengraph_namespace' ), 15 ); - - add_action( 'wpseo_opengraph', array( $this, 'locale' ), 1 ); - add_action( 'wpseo_opengraph', array( $this, 'type' ), 5 ); - add_action( 'wpseo_opengraph', array( $this, 'og_title' ), 10 ); - add_action( 'wpseo_opengraph', array( $this, 'site_owner' ), 20 ); - add_action( 'wpseo_opengraph', array( $this, 'description' ), 11 ); - add_action( 'wpseo_opengraph', array( $this, 'url' ), 12 ); - add_action( 'wpseo_opengraph', array( $this, 'site_name' ), 13 ); - add_action( 'wpseo_opengraph', array( $this, 'website_facebook' ), 14 ); - if ( is_singular() && ! is_front_page() ) { - add_action( 'wpseo_opengraph', array( $this, 'article_author_facebook' ), 15 ); - add_action( 'wpseo_opengraph', array( $this, 'tags' ), 16 ); - add_action( 'wpseo_opengraph', array( $this, 'category' ), 17 ); - add_action( 'wpseo_opengraph', array( $this, 'publish_date' ), 19 ); - } - - add_action( 'wpseo_opengraph', array( $this, 'image' ), 30 ); - } - add_filter( 'jetpack_enable_open_graph', '__return_false' ); - add_action( 'wpseo_head', array( $this, 'opengraph' ), 30 ); - } - - /** - * Main OpenGraph output. - */ - public function opengraph() { - wp_reset_query(); - /** - * Action: 'wpseo_opengraph' - Hook to add all Facebook OpenGraph output to so they're close together. - */ - do_action( 'wpseo_opengraph' ); - } - - /** - * Internal function to output FB tags. This also adds an output filter to each bit of output based on the property. - * - * @param string $property Property attribute value. - * @param string $content Content attribute value. - * - * @return boolean - */ - public function og_tag( $property, $content ) { - $og_property = str_replace( ':', '_', $property ); - /** - * Filter: 'wpseo_og_' . $og_property - Allow developers to change the content of specific OG meta tags. - * - * @api string $content The content of the property - */ - $content = apply_filters( 'wpseo_og_' . $og_property, $content ); - if ( empty( $content ) ) { - return false; - } - - echo '', "\n"; - - return true; - } - - /** - * Filter the Facebook plugins metadata - * - * @param array $meta_tags the array to fix. - * - * @return array $meta_tags - */ - public function facebook_filter( $meta_tags ) { - $meta_tags['http://ogp.me/ns#type'] = $this->type( false ); - $meta_tags['http://ogp.me/ns#title'] = $this->og_title( false ); - - // Filter the locale too because the Facebook plugin locale code is not as good as ours. - $meta_tags['http://ogp.me/ns#locale'] = $this->locale( false ); - - $ogdesc = $this->description( false ); - if ( ! empty( $ogdesc ) ) { - $meta_tags['http://ogp.me/ns#description'] = $ogdesc; - } - - return $meta_tags; - } - - /** - * Filter for the namespace, adding the OpenGraph namespace. - * - * @link https://developers.facebook.com/docs/web/tutorials/scrumptious/open-graph-object/ - * - * @param string $input The input namespace string. - * - * @return string - */ - public function add_opengraph_namespace( $input ) { - $namespaces = array( - 'og: http://ogp.me/ns#', - ); - if ( $this->options['fbadminapp'] != 0 || ( is_array( $this->options['fb_admins'] ) && $this->options['fb_admins'] !== array() ) ) { - $namespaces[] = 'fb: http://ogp.me/ns/fb#'; - } - - /** - * Allow for adding additional namespaces to the prefix attributes. - * - * @since 3.9.0 - * - * @param array $namespaces Currently registered namespaces which are to be - * added to the prefix attribute. - * Namespaces are strings and have the following syntax: - * ns: http://url.to.namespace/definition - */ - $namespaces = apply_filters( 'wpseo_html_namespaces', $namespaces ); - $namespace_string = implode( ' ', array_unique( $namespaces ) ); - - if ( strpos( $input, ' prefix=' ) !== false ) { - $regex = '`prefix=([\'"])(.+?)\1`'; - $replace = 'prefix="$2 ' . $namespace_string . '"'; - $input = preg_replace( $regex, $replace, $input ); - } - else { - $input .= ' prefix="' . $namespace_string . '"'; - } - - return $input; - } - - /** - * Outputs the authors FB page. - * - * @link https://developers.facebook.com/blog/post/2013/06/19/platform-updates--new-open-graph-tags-for-media-publishers-and-more/ - * @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/ - * - * @return boolean - */ - public function article_author_facebook() { - if ( ! is_singular() ) { - return false; - } - - /** - * Filter: 'wpseo_opengraph_author_facebook' - Allow developers to filter the Yoast SEO post authors facebook profile URL - * - * @api bool|string $unsigned The Facebook author URL, return false to disable - */ - $facebook = apply_filters( 'wpseo_opengraph_author_facebook', get_the_author_meta( 'facebook', $GLOBALS['post']->post_author ) ); - - if ( $facebook && ( is_string( $facebook ) && $facebook !== '' ) ) { - $this->og_tag( 'article:author', $facebook ); - - return true; - } - - return false; - } - - /** - * Outputs the websites FB page. - * - * @link https://developers.facebook.com/blog/post/2013/06/19/platform-updates--new-open-graph-tags-for-media-publishers-and-more/ - * @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/ - * @return boolean - */ - public function website_facebook() { - - if ( 'article' === $this->type( false ) && ! empty( $this->options['facebook_site'] ) ) { - $this->og_tag( 'article:publisher', $this->options['facebook_site'] ); - - return true; - } - - return false; - } - - /** - * Outputs the site owner - * - * @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/ - * @return boolean - */ - public function site_owner() { - if ( isset( $this->options['fbadminapp'] ) && $this->options['fbadminapp'] != 0 ) { - $this->og_tag( 'fb:app_id', $this->options['fbadminapp'] ); - - return true; - } - else if ( isset( $this->options['fb_admins'] ) && is_array( $this->options['fb_admins'] ) && $this->options['fb_admins'] !== array() ) { - $adminstr = implode( ',', array_keys( $this->options['fb_admins'] ) ); - /** - * Filter: 'wpseo_opengraph_admin' - Allow developer to filter the fb:admins string put out by Yoast SEO - * - * @api string $adminstr The admin string - */ - $adminstr = apply_filters( 'wpseo_opengraph_admin', $adminstr ); - if ( is_string( $adminstr ) && $adminstr !== '' ) { - - $admins = explode( ',', $adminstr ); - - foreach ( $admins as $admin_id ) { - $this->og_tag( 'fb:admins', $admin_id ); - } - - return true; - } - } - - return false; - } - - /** - * Outputs the SEO title as OpenGraph title. - * - * @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/ - * - * @param bool $echo Whether or not to echo the output. - * - * @return string|boolean - */ - public function og_title( $echo = true ) { - - $frontend = WPSEO_Frontend::get_instance(); - $is_posts_page = $frontend->is_posts_page(); - - if ( is_singular() || $is_posts_page ) { - - $post_id = ( $is_posts_page ) ? get_option( 'page_for_posts' ) : get_the_ID(); - $post = get_post( $post_id ); - $title = WPSEO_Meta::get_value( 'opengraph-title', $post_id ); - - if ( $title === '' ) { - $title = $frontend->title( '' ); - } - else { - // Replace Yoast SEO Variables. - $title = wpseo_replace_vars( $title, $post ); - } - } - else if ( is_front_page() ) { - $title = ( isset( $this->options['og_frontpage_title'] ) && $this->options['og_frontpage_title'] !== '' ) ? $this->options['og_frontpage_title'] : $frontend->title( '' ); - } - elseif ( is_category() || is_tax() || is_tag() ) { - $title = WPSEO_Taxonomy_Meta::get_meta_without_term( 'opengraph-title' ); - if ( $title === '' ) { - $title = $frontend->title( '' ); - } - else { - // Replace Yoast SEO Variables. - $title = wpseo_replace_vars( $title, $GLOBALS['wp_query']->get_queried_object() ); - } - } - else { - $title = $frontend->title( '' ); - } - - /** - * Filter: 'wpseo_opengraph_title' - Allow changing the title specifically for OpenGraph - * - * @api string $unsigned The title string - */ - $title = trim( apply_filters( 'wpseo_opengraph_title', $title ) ); - - if ( is_string( $title ) && $title !== '' ) { - if ( $echo !== false ) { - $this->og_tag( 'og:title', $title ); - - return true; - } - } - - if ( $echo === false ) { - return $title; - } - - return false; - } - - /** - * Outputs the canonical URL as OpenGraph URL, which consolidates likes and shares. - * - * @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/ - * @return boolean - */ - public function url() { - /** - * Filter: 'wpseo_opengraph_url' - Allow changing the OpenGraph URL - * - * @api string $unsigned Canonical URL - */ - $url = apply_filters( 'wpseo_opengraph_url', WPSEO_Frontend::get_instance()->canonical( false ) ); - - if ( is_string( $url ) && $url !== '' ) { - $this->og_tag( 'og:url', esc_url( $url ) ); - - return true; - } - - return false; - } - - /** - * Output the locale, doing some conversions to make sure the proper Facebook locale is outputted. - * - * Last update/compare with FB list done on 2015-03-16 by Rarst - * - * @see http://www.facebook.com/translations/FacebookLocales.xml for the list of supported locales - * - * @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/ - * - * @param bool $echo Whether to echo or return the locale. - * - * @return string $locale - */ - public function locale( $echo = true ) { - /** - * Filter: 'wpseo_locale' - Allow changing the locale output - * - * @api string $unsigned Locale string - */ - $locale = apply_filters( 'wpseo_locale', get_locale() ); - - // Catch some weird locales served out by WP that are not easily doubled up. - $fix_locales = array( - 'ca' => 'ca_ES', - 'en' => 'en_US', - 'el' => 'el_GR', - 'et' => 'et_EE', - 'ja' => 'ja_JP', - 'sq' => 'sq_AL', - 'uk' => 'uk_UA', - 'vi' => 'vi_VN', - 'zh' => 'zh_CN', - ); - - if ( isset( $fix_locales[ $locale ] ) ) { - $locale = $fix_locales[ $locale ]; - } - - // Convert locales like "es" to "es_ES", in case that works for the given locale (sometimes it does). - if ( strlen( $locale ) == 2 ) { - $locale = strtolower( $locale ) . '_' . strtoupper( $locale ); - } - - // These are the locales FB supports. - $fb_valid_fb_locales = array( - 'af_ZA', // Afrikaans. - 'ak_GH', // Akan. - 'am_ET', // Amharic. - 'ar_AR', // Arabic. - 'as_IN', // Assamese. - 'ay_BO', // Aymara. - 'az_AZ', // Azerbaijani. - 'be_BY', // Belarusian. - 'bg_BG', // Bulgarian. - 'bn_IN', // Bengali. - 'br_FR', // Breton. - 'bs_BA', // Bosnian. - 'ca_ES', // Catalan. - 'cb_IQ', // Sorani Kurdish. - 'ck_US', // Cherokee. - 'co_FR', // Corsican. - 'cs_CZ', // Czech. - 'cx_PH', // Cebuano. - 'cy_GB', // Welsh. - 'da_DK', // Danish. - 'de_DE', // German. - 'el_GR', // Greek. - 'en_GB', // English (UK). - 'en_IN', // English (India). - 'en_PI', // English (Pirate). - 'en_UD', // English (Upside Down). - 'en_US', // English (US). - 'eo_EO', // Esperanto. - 'es_CL', // Spanish (Chile). - 'es_CO', // Spanish (Colombia). - 'es_ES', // Spanish (Spain). - 'es_LA', // Spanish. - 'es_MX', // Spanish (Mexico). - 'es_VE', // Spanish (Venezuela). - 'et_EE', // Estonian. - 'eu_ES', // Basque. - 'fa_IR', // Persian. - 'fb_LT', // Leet Speak. - 'ff_NG', // Fulah. - 'fi_FI', // Finnish. - 'fo_FO', // Faroese. - 'fr_CA', // French (Canada). - 'fr_FR', // French (France). - 'fy_NL', // Frisian. - 'ga_IE', // Irish. - 'gl_ES', // Galician. - 'gn_PY', // Guarani. - 'gu_IN', // Gujarati. - 'gx_GR', // Classical Greek. - 'ha_NG', // Hausa. - 'he_IL', // Hebrew. - 'hi_IN', // Hindi. - 'hr_HR', // Croatian. - 'hu_HU', // Hungarian. - 'hy_AM', // Armenian. - 'id_ID', // Indonesian. - 'ig_NG', // Igbo. - 'is_IS', // Icelandic. - 'it_IT', // Italian. - 'ja_JP', // Japanese. - 'ja_KS', // Japanese (Kansai). - 'jv_ID', // Javanese. - 'ka_GE', // Georgian. - 'kk_KZ', // Kazakh. - 'km_KH', // Khmer. - 'kn_IN', // Kannada. - 'ko_KR', // Korean. - 'ku_TR', // Kurdish (Kurmanji). - 'ky_KG', // Kyrgyz. - 'la_VA', // Latin. - 'lg_UG', // Ganda. - 'li_NL', // Limburgish. - 'ln_CD', // Lingala. - 'lo_LA', // Lao. - 'lt_LT', // Lithuanian. - 'lv_LV', // Latvian. - 'mg_MG', // Malagasy. - 'mi_NZ', // Maori. - 'mk_MK', // Macedonian. - 'ml_IN', // Malayalam. - 'mn_MN', // Mongolian. - 'mr_IN', // Marathi. - 'ms_MY', // Malay. - 'mt_MT', // Maltese. - 'my_MM', // Burmese. - 'nb_NO', // Norwegian (bokmal). - 'nd_ZW', // Ndebele. - 'ne_NP', // Nepali. - 'nl_BE', // Dutch (Belgie). - 'nl_NL', // Dutch. - 'nn_NO', // Norwegian (nynorsk). - 'ny_MW', // Chewa. - 'or_IN', // Oriya. - 'pa_IN', // Punjabi. - 'pl_PL', // Polish. - 'ps_AF', // Pashto. - 'pt_BR', // Portuguese (Brazil). - 'pt_PT', // Portuguese (Portugal). - 'qu_PE', // Quechua. - 'rm_CH', // Romansh. - 'ro_RO', // Romanian. - 'ru_RU', // Russian. - 'rw_RW', // Kinyarwanda. - 'sa_IN', // Sanskrit. - 'sc_IT', // Sardinian. - 'se_NO', // Northern Sami. - 'si_LK', // Sinhala. - 'sk_SK', // Slovak. - 'sl_SI', // Slovenian. - 'sn_ZW', // Shona. - 'so_SO', // Somali. - 'sq_AL', // Albanian. - 'sr_RS', // Serbian. - 'sv_SE', // Swedish. - 'sw_KE', // Swahili. - 'sy_SY', // Syriac. - 'sz_PL', // Silesian. - 'ta_IN', // Tamil. - 'te_IN', // Telugu. - 'tg_TJ', // Tajik. - 'th_TH', // Thai. - 'tk_TM', // Turkmen. - 'tl_PH', // Filipino. - 'tl_ST', // Klingon. - 'tr_TR', // Turkish. - 'tt_RU', // Tatar. - 'tz_MA', // Tamazight. - 'uk_UA', // Ukrainian. - 'ur_PK', // Urdu. - 'uz_UZ', // Uzbek. - 'vi_VN', // Vietnamese. - 'wo_SN', // Wolof. - 'xh_ZA', // Xhosa. - 'yi_DE', // Yiddish. - 'yo_NG', // Yoruba. - 'zh_CN', // Simplified Chinese (China). - 'zh_HK', // Traditional Chinese (Hong Kong). - 'zh_TW', // Traditional Chinese (Taiwan). - 'zu_ZA', // Zulu. - 'zz_TR', // Zazaki. - ); - - // Check to see if the locale is a valid FB one, if not, use en_US as a fallback. - if ( ! in_array( $locale, $fb_valid_fb_locales ) ) { - $locale = strtolower( substr( $locale, 0, 2 ) ) . '_' . strtoupper( substr( $locale, 0, 2 ) ); - if ( ! in_array( $locale, $fb_valid_fb_locales ) ) { - $locale = 'en_US'; - } - } - - if ( $echo !== false ) { - $this->og_tag( 'og:locale', $locale ); - } - - return $locale; - } - - /** - * Output the OpenGraph type. - * - * @param boolean $echo Whether to echo or return the type. - * - * @link https://developers.facebook.com/docs/reference/opengraph/object-type/object/ - * - * @return string $type - */ - public function type( $echo = true ) { - - if ( is_front_page() || is_home() ) { - $type = 'website'; - } - elseif ( is_singular() ) { - - // This'll usually only be changed by plugins right now. - $type = WPSEO_Meta::get_value( 'og_type' ); - - if ( $type === '' ) { - $type = 'article'; - } - } - else { - // We use "object" for archives etc. as article doesn't apply there. - $type = 'object'; - } - - /** - * Filter: 'wpseo_opengraph_type' - Allow changing the OpenGraph type of the page - * - * @api string $type The OpenGraph type string. - */ - $type = apply_filters( 'wpseo_opengraph_type', $type ); - - if ( is_string( $type ) && $type !== '' ) { - if ( $echo !== false ) { - $this->og_tag( 'og:type', $type ); - } - else { - return $type; - } - } - - return ''; - } - - /** - * Create new WPSEO_OpenGraph_Image class and get the images to set the og:image - * - * @param string|boolean $image Optional image URL. - */ - public function image( $image = false ) { - $opengraph_images = new WPSEO_OpenGraph_Image( $this->options, $image ); - - foreach ( $opengraph_images->get_images() as $img ) { - $this->og_tag( 'og:image', esc_url( $img ) ); - } - - $dimensions = $opengraph_images->get_dimensions(); - - if ( ! empty( $dimensions['width'] ) ) { - $this->og_tag( 'og:image:width', absint( $dimensions['width'] ) ); - } - - if ( ! empty( $dimensions['height'] ) ) { - $this->og_tag( 'og:image:height', absint( $dimensions['height'] ) ); - } - } - - /** - * Fallback method for plugins using image_output - * - * @param string $image Image URL. - */ - public function image_output( $image ) { - $this->image( $image ); - } - - /** - * Output the OpenGraph description, specific OG description first, if not, grab the meta description. - * - * @param bool $echo Whether to echo or return the description. - * - * @return string $ogdesc - */ - public function description( $echo = true ) { - $ogdesc = ''; - $frontend = WPSEO_Frontend::get_instance(); - - if ( is_front_page() ) { - if ( isset( $this->options['og_frontpage_desc'] ) && $this->options['og_frontpage_desc'] !== '' ) { - $ogdesc = wpseo_replace_vars( $this->options['og_frontpage_desc'], null ); - } - else { - $ogdesc = $frontend->metadesc( false ); - } - } - - $is_posts_page = $frontend->is_posts_page(); - - if ( is_singular() || $is_posts_page ) { - $post_id = ( $is_posts_page ) ? get_option( 'page_for_posts' ) : get_the_ID(); - $post = get_post( $post_id ); - $ogdesc = WPSEO_Meta::get_value( 'opengraph-description', $post_id ); - - // Replace Yoast SEO Variables. - $ogdesc = wpseo_replace_vars( $ogdesc, $post ); - - // Use metadesc if $ogdesc is empty. - if ( $ogdesc === '' ) { - $ogdesc = $frontend->metadesc( false ); - } - - // Tag og:description is still blank so grab it from get_the_excerpt(). - if ( ! is_string( $ogdesc ) || ( is_string( $ogdesc ) && $ogdesc === '' ) ) { - $ogdesc = str_replace( '[…]', '…', strip_tags( get_the_excerpt() ) ); - } - } - - if ( is_category() || is_tag() || is_tax() ) { - $ogdesc = WPSEO_Taxonomy_Meta::get_meta_without_term( 'opengraph-description' ); - if ( $ogdesc === '' ) { - $ogdesc = $frontend->metadesc( false ); - } - - if ( $ogdesc === '' ) { - $ogdesc = trim( strip_tags( term_description() ) ); - } - - if ( $ogdesc === '' ) { - $ogdesc = WPSEO_Taxonomy_Meta::get_meta_without_term( 'desc' ); - } - } - - // Strip shortcodes if any. - $ogdesc = strip_shortcodes( $ogdesc ); - - /** - * Filter: 'wpseo_opengraph_desc' - Allow changing the OpenGraph description - * - * @api string $ogdesc The description string. - */ - $ogdesc = trim( apply_filters( 'wpseo_opengraph_desc', $ogdesc ) ); - - if ( is_string( $ogdesc ) && $ogdesc !== '' ) { - if ( $echo !== false ) { - $this->og_tag( 'og:description', $ogdesc ); - } - } - - return $ogdesc; - } - - /** - * Output the site name straight from the blog info. - */ - public function site_name() { - /** - * Filter: 'wpseo_opengraph_site_name' - Allow changing the OpenGraph site name - * - * @api string $unsigned Blog name string - */ - $name = apply_filters( 'wpseo_opengraph_site_name', get_bloginfo( 'name' ) ); - if ( is_string( $name ) && $name !== '' ) { - $this->og_tag( 'og:site_name', $name ); - } - } - - /** - * Output the article tags as article:tag tags. - * - * @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/ - * @return boolean - */ - public function tags() { - if ( ! is_singular() ) { - return false; - } - - $tags = get_the_tags(); - if ( ! is_wp_error( $tags ) && ( is_array( $tags ) && $tags !== array() ) ) { - - foreach ( $tags as $tag ) { - $this->og_tag( 'article:tag', $tag->name ); - } - - return true; - } - - return false; - } - - /** - * Output the article category as an article:section tag. - * - * @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/ - * @return boolean; - */ - public function category() { - - if ( ! is_singular() ) { - return false; - } - - $terms = get_the_category(); - - if ( ! is_wp_error( $terms ) && ( is_array( $terms ) && $terms !== array() ) ) { - - // We can only show one section here, so we take the first one. - $this->og_tag( 'article:section', $terms[0]->name ); - - return true; - } - - return false; - } - - /** - * Output the article publish and last modification date - * - * @link https://developers.facebook.com/docs/reference/opengraph/object-type/article/ - * @return boolean; - */ - public function publish_date() { - - if ( ! is_singular( 'post' ) ) { - /** - * Filter: 'wpseo_opengraph_show_publish_date' - Allow showing publication date for other post types - * - * @api bool $unsigned Whether or not to show publish date - * - * @param string $post_type The current URL's post type. - */ - if ( false === apply_filters( 'wpseo_opengraph_show_publish_date', false, get_post_type() ) ) { - return false; - } - } - - $pub = get_the_date( DATE_W3C ); - $this->og_tag( 'article:published_time', $pub ); - - $mod = get_the_modified_date( DATE_W3C ); - if ( $mod != $pub ) { - $this->og_tag( 'article:modified_time', $mod ); - $this->og_tag( 'og:updated_time', $mod ); - } - - return true; - } -} /* End of class */ - -/** - * Class WPSEO_OpenGraph_Image - */ -class WPSEO_OpenGraph_Image { - - /** - * @var array $options Holds options passed to the constructor - */ - private $options; - - /** - * @var array $images Holds the images that have been put out as OG image. - */ - private $images = array(); - - /** - * @TODO This needs to be refactored since we only hold one set of dimensions for multiple images. R. - * @var array $dimensions Holds image dimensions, if determined. - */ - protected $dimensions = array(); - - /** - * Constructor - * - * @param array $options Options set. - * @param string|boolean $image Optional image URL. - */ - public function __construct( $options, $image = false ) { - $this->options = $options; - - if ( ! empty( $image ) && $this->add_image( $image ) ) { - // Safely assume an image was added so we don't need to automatically determine it anymore. - } - else { - $this->set_images(); - } - } - - /** - * Return the images array - * - * @return array - */ - public function get_images() { - return $this->images; - } - - /** - * Return the dimensions array. - * - * @return array - */ - public function get_dimensions() { - return $this->dimensions; - } - - /** - * Display an OpenGraph image tag - * - * @param string $img - Source URL to the image. - * - * @return bool - */ - public function add_image( $img ) { - - $original = trim( $img ); - - // Filter: 'wpseo_opengraph_image' - Allow changing the OpenGraph image. - $img = trim( apply_filters( 'wpseo_opengraph_image', $img ) ); - - if ( $original !== $img ) { - $this->dimensions = array(); - } - - if ( empty( $img ) ) { - return false; - } - - if ( WPSEO_Utils::is_url_relative( $img ) === true ) { - $img = $this->get_relative_path( $img ); - } - - if ( in_array( $img, $this->images ) ) { - return false; - } - array_push( $this->images, $img ); - - return true; - } - - /** - * Check if page is front page or singular and call the corresponding functions. If not, call get_default_image. - */ - private function set_images() { - - /** - * Filter: wpseo_add_opengraph_images - Allow developers to add images to the OpenGraph tags - * - * @api WPSEO_OpenGraph_Image The current object. - */ - do_action( 'wpseo_add_opengraph_images', $this ); - - if ( is_front_page() ) { - $this->get_front_page_image(); - } - elseif ( is_home() ) { // Posts page, which won't be caught by is_singular() below. - $this->get_posts_page_image(); - } - - if ( is_singular() ) { - $this->get_singular_image(); - } - - if ( is_category() || is_tax() || is_tag() ) { - $this->get_opengraph_image_taxonomy(); - } - - $this->get_default_image(); - } - - /** - * If the frontpage image exists, call add_image - */ - private function get_front_page_image() { - if ( $this->options['og_frontpage_image'] !== '' ) { - $this->add_image( $this->options['og_frontpage_image'] ); - } - } - - /** - * Get the images of the posts page. - */ - private function get_posts_page_image() { - - $post_id = get_option( 'page_for_posts' ); - - if ( $this->get_opengraph_image_post( $post_id ) ) { - return; - } - - if ( $this->get_featured_image( $post_id ) ) { - return; - } - } - - /** - * Get the images of the singular post. - */ - private function get_singular_image() { - global $post; - - if ( $this->get_opengraph_image_post() ) { - return; - } - - if ( $this->get_attachment_page_image( $post->ID ) ) { - return; - } - - if ( $this->get_featured_image( $post->ID ) ) { - return; - } - - $this->get_content_images( $post ); - } - - /** - * Get default image and call add_image - */ - private function get_default_image() { - if ( count( $this->images ) === 0 && isset( $this->options['og_default_image'] ) && $this->options['og_default_image'] !== '' ) { - $this->add_image( $this->options['og_default_image'] ); - } - } - - /** - * If opengraph-image is set, call add_image and return true. - * - * @param int $post_id Optional post ID to use. - * - * @return bool - */ - private function get_opengraph_image_post( $post_id = 0 ) { - $ogimg = WPSEO_Meta::get_value( 'opengraph-image', $post_id ); - if ( $ogimg !== '' ) { - $this->add_image( $ogimg ); - - return true; - } - - return false; - } - - /** - * Check if taxonomy has an image and add this image - */ - private function get_opengraph_image_taxonomy() { - if ( ( $ogimg = WPSEO_Taxonomy_Meta::get_meta_without_term( 'opengraph-image' ) ) !== '' ) { - $this->add_image( $ogimg ); - } - } - - /** - * If there is a featured image, check image size. If image size is correct, call add_image and return true - * - * @param int $post_id The post ID. - * - * @return bool - */ - private function get_featured_image( $post_id ) { - - if ( has_post_thumbnail( $post_id ) ) { - /** - * Filter: 'wpseo_opengraph_image_size' - Allow changing the image size used for OpenGraph sharing - * - * @api string $unsigned Size string - */ - $thumb = wp_get_attachment_image_src( get_post_thumbnail_id( $post_id ), apply_filters( 'wpseo_opengraph_image_size', 'original' ) ); - - if ( $this->check_featured_image_size( $thumb ) ) { - - $this->dimensions['width'] = $thumb[1]; - $this->dimensions['height'] = $thumb[2]; - - return $this->add_image( $thumb[0] ); - } - } - - return false; - } - - /** - * If this is an attachment page, call add_image with the attachment and return true - * - * @param int $post_id The post ID. - * - * @return bool - */ - private function get_attachment_page_image( $post_id ) { - if ( get_post_type( $post_id ) === 'attachment' ) { - $mime_type = get_post_mime_type( $post_id ); - switch ( $mime_type ) { - case 'image/jpeg': - case 'image/png': - case 'image/gif': - return $this->add_image( wp_get_attachment_url( $post_id ) ); - } - } - - return false; - } - - /** - * Filter: 'wpseo_pre_analysis_post_content' - Allow filtering the content before analysis - * - * @api string $post_content The Post content string - * - * @param object $post - The post object. - */ - private function get_content_images( $post ) { - $content = apply_filters( 'wpseo_pre_analysis_post_content', $post->post_content, $post ); - - if ( preg_match_all( '`]+>`', $content, $matches ) ) { - foreach ( $matches[0] as $img ) { - if ( preg_match( '`src=(["\'])(.*?)\1`', $img, $match ) ) { - $this->add_image( $match[2] ); - } - } - } - } - - /** - * Check size of featured image. If image is too small, return false, else return true - * - * @param array $img_data wp_get_attachment_image_src: url, width, height, icon. - * - * @return bool - */ - private function check_featured_image_size( $img_data ) { - - if ( ! is_array( $img_data ) ) { - return false; - } - - // Get the width and height of the image. - if ( $img_data[1] < 200 || $img_data[2] < 200 ) { - return false; - } - - return true; - } - - /** - * Get the relative path of the image - * - * @param array $img Image data array. - * - * @return bool|string - */ - private function get_relative_path( $img ) { - if ( $img[0] != '/' ) { - return false; - } - - // If it's a relative URL, it's relative to the domain, not necessarily to the WordPress install, we - // want to preserve domain name and URL scheme (http / https) though. - $parsed_url = wp_parse_url( home_url() ); - $img = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $img; - - return $img; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/frontend/class-primary-category.php b/wp/wp-content/plugins/wordpress-seo/frontend/class-primary-category.php deleted file mode 100644 index bbf63400..00000000 --- a/wp/wp-content/plugins/wordpress-seo/frontend/class-primary-category.php +++ /dev/null @@ -1,69 +0,0 @@ -get_primary_category( $post ); - - if ( false !== $primary_category && $primary_category !== $category->cat_ID ) { - $category = $this->get_category( $primary_category ); - } - - return $category; - } - - /** - * Get the id of the primary category - * - * @param WP_Post $post The post in question. - * - * @return int primary category id - */ - protected function get_primary_category( $post = null ) { - $post = get_post( $post ); - - if ( $post === null ) { - return false; - } - - $primary_term = new WPSEO_Primary_Term( 'category', $post->ID ); - - return $primary_term->get_primary_term(); - } - - /** - * Wrapper for get category to make mocking easier - * - * @param int $primary_category id of primary category. - * - * @return array|null|object|WP_Error - */ - protected function get_category( $primary_category ) { - $category = get_category( $primary_category ); - - return $category; - } -} diff --git a/wp/wp-content/plugins/wordpress-seo/frontend/class-twitter.php b/wp/wp-content/plugins/wordpress-seo/frontend/class-twitter.php deleted file mode 100644 index 22d3b682..00000000 --- a/wp/wp-content/plugins/wordpress-seo/frontend/class-twitter.php +++ /dev/null @@ -1,645 +0,0 @@ -options = WPSEO_Options::get_option( 'wpseo_social' ); - $this->twitter(); - } - - /** - * Outputs the Twitter Card code on singular pages. - */ - public function twitter() { - wp_reset_query(); - - $this->type(); - $this->description(); - $this->title(); - $this->site_twitter(); - $this->image(); - if ( is_singular() ) { - $this->author(); - } - - /** - * Action: 'wpseo_twitter' - Hook to add all Yoast SEO Twitter output to so they're close together. - */ - do_action( 'wpseo_twitter' ); - } - - /** - * Display the Twitter card type. - * - * This defaults to summary but can be filtered using the wpseo_twitter_card_type filter. - * - * @link https://dev.twitter.com/docs/cards - */ - protected function type() { - $this->determine_card_type(); - $this->sanitize_card_type(); - - $this->output_metatag( 'card', $this->type ); - } - - /** - * Determines the twitter card type for the current page - */ - private function determine_card_type() { - $this->type = $this->options['twitter_card_type']; - - // TODO this should be reworked to use summary_large_image for any fitting image R. - if ( is_singular() && has_shortcode( $GLOBALS['post']->post_content, 'gallery' ) ) { - - $this->images = get_post_gallery_images(); - - if ( count( $this->images ) > 0 ) { - $this->type = 'summary_large_image'; - } - } - - /** - * Filter: 'wpseo_twitter_card_type' - Allow changing the Twitter Card type as output in the Twitter card by Yoast SEO - * - * @api string $unsigned The type string - */ - $this->type = apply_filters( 'wpseo_twitter_card_type', $this->type ); - } - - /** - * Determines whether the card type is of a type currently allowed by Twitter - * - * @link https://dev.twitter.com/cards/types - */ - private function sanitize_card_type() { - if ( ! in_array( $this->type, array( - 'summary', - 'summary_large_image', - 'app', - 'player', - ) ) - ) { - $this->type = 'summary'; - } - } - - /** - * Output the metatag - * - * @param string $name Tag name string. - * @param string $value Tag value string. - * @param bool $escaped Force escape flag. - */ - private function output_metatag( $name, $value, $escaped = false ) { - - // Escape the value if not escaped. - if ( false === $escaped ) { - $value = esc_attr( $value ); - } - - /** - * Filter: 'wpseo_twitter_metatag_key' - Make the Twitter metatag key filterable - * - * @api string $key The Twitter metatag key - */ - $metatag_key = apply_filters( 'wpseo_twitter_metatag_key', 'name' ); - - // Output meta. - echo '', "\n"; - } - - /** - * Displays the description for Twitter. - * - * Only used when OpenGraph is inactive. - */ - protected function description() { - if ( is_singular() ) { - $meta_desc = $this->single_description(); - } - elseif ( WPSEO_Frontend::get_instance()->is_posts_page() ) { - $meta_desc = $this->single_description( get_option( 'page_for_posts' ) ); - } - elseif ( is_category() || is_tax() || is_tag() ) { - $meta_desc = $this->taxonomy_description(); - } - else { - $meta_desc = $this->fallback_description(); - } - - /** - * Filter: 'wpseo_twitter_description' - Allow changing the Twitter description as output in the Twitter card by Yoast SEO - * - * @api string $twitter The description string - */ - $meta_desc = apply_filters( 'wpseo_twitter_description', $meta_desc ); - if ( is_string( $meta_desc ) && $meta_desc !== '' ) { - $this->output_metatag( 'description', $meta_desc ); - } - } - - /** - * Returns the description for a singular page - * - * @param int $post_id Post ID. - * - * @return string - */ - private function single_description( $post_id = 0 ) { - $meta_desc = trim( WPSEO_Meta::get_value( 'twitter-description', $post_id ) ); - - if ( is_string( $meta_desc ) && '' !== $meta_desc ) { - return $meta_desc; - } - - $meta_desc = $this->fallback_description(); - if ( is_string( $meta_desc ) && '' !== $meta_desc ) { - return $meta_desc; - } - - return strip_tags( get_the_excerpt() ); - } - - - /** - * Getting the description for the taxonomy - * - * @return bool|mixed|string - */ - private function taxonomy_description() { - $meta_desc = WPSEO_Taxonomy_Meta::get_meta_without_term( 'twitter-description' ); - - if ( ! is_string( $meta_desc ) || $meta_desc === '' ) { - $meta_desc = $this->fallback_description(); - } - - if ( is_string( $meta_desc ) || $meta_desc !== '' ) { - return $meta_desc; - } - - return trim( strip_tags( term_description() ) ); - - } - - /** - * Returns a fallback description - * - * @return string - */ - private function fallback_description() { - return trim( WPSEO_Frontend::get_instance()->metadesc( false ) ); - } - - /** - * Displays the title for Twitter. - * - * Only used when OpenGraph is inactive. - */ - protected function title() { - if ( is_singular() ) { - $title = $this->single_title(); - } - elseif ( WPSEO_Frontend::get_instance()->is_posts_page() ) { - $title = $this->single_title( get_option( 'page_for_posts' ) ); - } - elseif ( is_category() || is_tax() || is_tag() ) { - $title = $this->taxonomy_title(); - } - else { - $title = $this->fallback_title(); - } - - /** - * Filter: 'wpseo_twitter_title' - Allow changing the Twitter title as output in the Twitter card by Yoast SEO - * - * @api string $twitter The title string - */ - $title = apply_filters( 'wpseo_twitter_title', $title ); - if ( is_string( $title ) && $title !== '' ) { - $this->output_metatag( 'title', $title ); - } - } - - /** - * Returns the Twitter title for a single post - * - * @param int $post_id Post ID. - * - * @return string - */ - private function single_title( $post_id = 0 ) { - $title = WPSEO_Meta::get_value( 'twitter-title', $post_id ); - if ( ! is_string( $title ) || $title === '' ) { - return $this->fallback_title(); - } - - return $title; - } - - /** - * Getting the title for the taxonomy - * - * @return bool|mixed|string - */ - private function taxonomy_title() { - $title = WPSEO_Taxonomy_Meta::get_meta_without_term( 'twitter-title' ); - - if ( ! is_string( $title ) || $title === '' ) { - return $this->fallback_title(); - } - - return $title; - } - - /** - * Returns the Twitter title for any page - * - * @return string - */ - private function fallback_title() { - return WPSEO_Frontend::get_instance()->title( '' ); - } - - /** - * Displays the Twitter account for the site. - */ - protected function site_twitter() { - /** - * Filter: 'wpseo_twitter_site' - Allow changing the Twitter site account as output in the Twitter card by Yoast SEO - * - * @api string $unsigned Twitter site account string - */ - $site = apply_filters( 'wpseo_twitter_site', $this->options['twitter_site'] ); - $site = $this->get_twitter_id( $site ); - - if ( is_string( $site ) && $site !== '' ) { - $this->output_metatag( 'site', '@' . $site ); - } - } - - /** - * Checks if the given id is actually an id or a url and if url, distills the id from it. - * - * Solves issues with filters returning urls and theme's/other plugins also adding a user meta - * twitter field which expects url rather than an id (which is what we expect). - * - * @param string $id Twitter ID or url. - * - * @return string|bool Twitter ID or false if it failed to get a valid Twitter ID. - */ - private function get_twitter_id( $id ) { - if ( preg_match( '`([A-Za-z0-9_]{1,25})$`', $id, $match ) ) { - return $match[1]; - } - else { - return false; - } - } - - /** - * Displays the image for Twitter - * - * Only used when OpenGraph is inactive or Summary Large Image card is chosen. - */ - protected function image() { - - if ( is_category() || is_tax() || is_tag() ) { - $this->taxonomy_image_output(); - } - else { - $this->single_image_output(); - } - - if ( count( $this->shown_images ) === 0 && $this->options['og_default_image'] !== '' ) { - $this->image_output( $this->options['og_default_image'] ); - } - } - - /** - * Outputs the first image of a gallery. - */ - private function gallery_images_output() { - - $this->image_output( reset( $this->images ) ); - } - - /** - * @return bool - */ - private function taxonomy_image_output() { - foreach ( array( 'twitter-image', 'opengraph-image' ) as $tag ) { - $img = WPSEO_Taxonomy_Meta::get_meta_without_term( $tag ); - if ( $img !== '' ) { - $this->image_output( $img ); - - return true; - } - } - - return false; - } - - /** - * Takes care of image output when we only need to display a single image. - */ - private function single_image_output() { - if ( $this->homepage_image_output() ) { - return; - } - elseif ( $this->posts_page_image_output() ) { // Posts page, which won't be caught by is_singular() below. - return; - } - - if ( is_singular() ) { - if ( $this->image_from_meta_values_output() ) { - return; - } - - $post_id = get_the_ID(); - - if ( $this->image_of_attachment_page_output( $post_id ) ) { - return; - } - if ( $this->image_thumbnail_output() ) { - return; - } - if ( count( $this->images ) > 0 ) { - $this->gallery_images_output(); - return; - } - if ( $this->image_from_content_output() ) { - return; - } - } - } - - /** - * Show the front page image - * - * @return bool - */ - private function homepage_image_output() { - if ( is_front_page() ) { - if ( $this->options['og_frontpage_image'] !== '' ) { - $this->image_output( $this->options['og_frontpage_image'] ); - - return true; - } - } - - return false; - } - - /** - * Show the posts page image. - * - * @return bool - */ - private function posts_page_image_output() { - - if ( is_front_page() || ! is_home() ) { - return false; - } - - $post_id = get_option( 'page_for_posts' ); - - if ( $this->image_from_meta_values_output( $post_id ) ) { - return true; - } - - if ( $this->image_thumbnail_output( $post_id ) ) { - return true; - } - - return false; - } - - /** - * Outputs a Twitter image tag for a given image - * - * @param string $img The source URL to the image. - * @param boolean $tag Deprecated argument, previously used for gallery images. - * - * @return bool - */ - protected function image_output( $img, $tag = false ) { - - if ( $tag ) { - _deprecated_argument( __METHOD__, 'WPSEO 2.4' ); - } - - /** - * Filter: 'wpseo_twitter_image' - Allow changing the Twitter Card image - * - * @api string $img Image URL string - */ - $img = apply_filters( 'wpseo_twitter_image', $img ); - - if ( WPSEO_Utils::is_url_relative( $img ) === true && $img[0] === '/' ) { - $parsed_url = wp_parse_url( home_url() ); - $img = $parsed_url['scheme'] . '://' . $parsed_url['host'] . $img; - } - - $escaped_img = esc_url( $img ); - - if ( in_array( $escaped_img, $this->shown_images ) ) { - return false; - } - - if ( is_string( $escaped_img ) && $escaped_img !== '' ) { - $this->output_metatag( 'image', $escaped_img, true ); - array_push( $this->shown_images, $escaped_img ); - - return true; - } - - return false; - } - - /** - * Retrieve images from the post meta values - * - * @param int $post_id Optional post ID to use. - * - * @return bool - */ - private function image_from_meta_values_output( $post_id = 0 ) { - foreach ( array( 'twitter-image', 'opengraph-image' ) as $tag ) { - $img = WPSEO_Meta::get_value( $tag, $post_id ); - if ( $img !== '' ) { - $this->image_output( $img ); - - return true; - } - } - - return false; - } - - /** - * Retrieve an attachment page's attachment - * - * @param string $attachment_id The ID of the attachment for which to retrieve the image. - * - * @return bool - */ - private function image_of_attachment_page_output( $attachment_id ) { - if ( get_post_type( $attachment_id ) === 'attachment' ) { - $mime_type = get_post_mime_type( $attachment_id ); - switch ( $mime_type ) { - case 'image/jpeg': - case 'image/png': - case 'image/gif': - $this->image_output( wp_get_attachment_url( $attachment_id ) ); - return true; - } - } - - return false; - } - - /** - * Retrieve the featured image - * - * @param int $post_id Optional post ID to use. - * - * @return bool - */ - private function image_thumbnail_output( $post_id = 0 ) { - - if ( empty( $post_id ) ) { - $post_id = get_the_ID(); - } - - if ( function_exists( 'has_post_thumbnail' ) && has_post_thumbnail( $post_id ) ) { - /** - * Filter: 'wpseo_twitter_image_size' - Allow changing the Twitter Card image size - * - * @api string $featured_img Image size string - */ - $featured_img = wp_get_attachment_image_src( get_post_thumbnail_id( $post_id ), apply_filters( 'wpseo_twitter_image_size', 'full' ) ); - - if ( $featured_img ) { - $this->image_output( $featured_img[0] ); - - return true; - } - } - - return false; - } - - /** - * Retrieve the image from the content - * - * @return bool - */ - private function image_from_content_output() { - /** - * Filter: 'wpseo_pre_analysis_post_content' - Allow filtering the content before analysis - * - * @api string $post_content The Post content string - * - * @param object $post - The post object. - */ - global $post; - $content = apply_filters( 'wpseo_pre_analysis_post_content', $post->post_content, $post ); - - if ( preg_match_all( '`]+>`', $content, $matches ) ) { - foreach ( $matches[0] as $img ) { - if ( preg_match( '`src=(["\'])(.*?)\1`', $img, $match ) ) { - $this->image_output( $match[2] ); - - return true; - } - } - } - - return false; - } - - /** - * Displays the authors Twitter account. - */ - protected function author() { - $twitter = ltrim( trim( get_the_author_meta( 'twitter', get_post()->post_author ) ), '@' ); - /** - * Filter: 'wpseo_twitter_creator_account' - Allow changing the Twitter account as output in the Twitter card by Yoast SEO - * - * @api string $twitter The twitter account name string - */ - $twitter = apply_filters( 'wpseo_twitter_creator_account', $twitter ); - $twitter = $this->get_twitter_id( $twitter ); - - if ( is_string( $twitter ) && $twitter !== '' ) { - $this->output_metatag( 'creator', '@' . $twitter ); - } - elseif ( $this->options['twitter_site'] !== '' ) { - if ( is_string( $this->options['twitter_site'] ) && $this->options['twitter_site'] !== '' ) { - $this->output_metatag( 'creator', '@' . $this->options['twitter_site'] ); - } - } - } - - /** - * Get the singleton instance of this class - * - * @return object - */ - public static function get_instance() { - if ( ! ( self::$instance instanceof self ) ) { - self::$instance = new self(); - } - - return self::$instance; - } - - /** - * Displays the domain tag for the site. - * - * @deprecated 3.0 - * - * @codeCoverageIgnore - */ - protected function site_domain() { - _deprecated_function( __METHOD__, 'WPSEO 3.0' ); - } -} /* End of class */ diff --git a/wp/wp-content/plugins/wordpress-seo/frontend/index.php b/wp/wp-content/plugins/wordpress-seo/frontend/index.php deleted file mode 100644 index e94d9a42..00000000 --- a/wp/wp-content/plugins/wordpress-seo/frontend/index.php +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/wp/wp-content/plugins/wordpress-seo/images/banner/basic-seo-training.png b/wp/wp-content/plugins/wordpress-seo/images/banner/basic-seo-training.png deleted file mode 100644 index 3a1828b6411fdf9c3f175e8d8a4c46789fc02dc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83980 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

      !{tPQK-RKaCh2#te{szfrHhU zBB21F5Cnso30Htj#3G}y=5Wuief`2HDi?#W~D<76)V4xS9(? z#-JOFx%M!IeO-<7*b}D-L+2r}YaVJ1=ZO1N-IiajeeCUdFgFO=JBTyRHD?aI9xOaW z=u_9sDPin9tz{qd+ws*NQ7r8%4A?T>%7g{u!?C3i=fX^CJZh|QXY6@xpQRB)&s9y7 zACs22&J{}UYa^17l7RaLN8LwvTLFgc%|{_ufC%=p&-qFI%WoHaVJo`( z)Xq5cos`nOTmy$H3}G&bl}Twd$*2fx4K~MEtIUE%;%5V{>nLQ@81_MZVLXHu>r;r? z5U>%baau$EsL^sG1maPXg$E7B7+gXgnBvOZXwN{b(|z%ca)n$=oV35rYyQ%A#IMdW zPP_%*fV+|Lnd=^NWt`?W8;l=gR%gt0KS*3VmeL@Z%rf97W}`2Vb=n-F<2Y&V5GjwD^8XSXihC*s6J_0JF_R!o+A7{!v-Xkbs9D}K_yM7U(6Fgd@sbcw_?+*0@zX!+ z$gzQdn*P7|_2mi3@#0Y)1+i*AYfIhk^qBt<^h(}E&lz&zD1)^vT#U;Xi67FB)vob)dV zp`JL^>_CuxX2pc(wV-&8U$>h>88AVU<)`<9G4{-X{m$GF{#Z!k)VvsHu0in% z?x~LXml^XScEBWIz@lI|RzYP~NbtkFMmGETu6G|7#pLGOZ{LdTKDWz%n*WmOcfNax zgtxwpbF-os63#;qH4H;KZUK8>&Ji%pvCefdVg6MJFq%?Xk{ zEqi|cz}Znu4*mGh@|7n%Zy(#%zH{+Mb8Zh^2du1y!FktAtkqoHz9*mhGk9)aKbhcV zvX=Cl{XO3#)tkwEJ^Ao!UVmSm@BGBy=7j>%@9+3R*w@d+7NHgRyNUC9O|h{E_UG(# z+t*uvU2C-Y@;TO^r~QNYu^NTN^nF&}TO0N1?=tPRHaqF$!%<95z2rMvvEAqPp|k!W z=Jq$gxmQ?Qg9(?$^lZg7SXZ;K_H2dv@SIe$v(bCyb!Y32Tjqmi-^J?trL*_k)vxbs zTz71JULn@HKX!iFzh=DG9oOKqOtD%C+uF17)8kwZy0!uqaTbmBoCSPX*e~y;@r{iw z_FeORO*UtCqhKNdd6@tZ@Uh0RXh3>)SOLX6Bw_3e)&A`5bJ^wBMlt!~S?^rF^7!ZN zW82!RPk7<-kw+el`F-u{zR?tzu+k7iygvfpZ4-^L4gM3J8-jpO_@2g*F#V}BtERcG z&x-wfft|^3@8`VC$O)s)F~)ON{nJPC(gJy7ljJkmpIUd7#%&bVqVP+6G^Y$0!P?A~ zG2|HYGyBR1otM97+C%1bEW{auNsL*?wSVQId|BvhUbnff8pC(R z&3dc(c|Dl-_nNLJ+d{f6Y@$&>aZZz%WEXhZ0zefxjUoznQcPN{GozDsUV((KNb+KN z)6MxWyuJU_f7y!d2H4d%U6cRm>*vlSRz#4C!dNTYSI2h!1g znZPuT_ua7YY#u*acova(83&#bK5Hz=cacerXTZ5F78PgZL}KVh1LPjhgK-uG3veb^ zt}QN8o@Y~x$z@aQgeSx-iIByTK9`vnXQT2w5*sk*ijBtTdpf7`8pRqhEx)7-ZtUpm zgu&cEQY)sIT5#D+!Gv2}(>~H5;YJOeF{-9We&jK(KXZZW+jSDSO#A5`YArNoYHSb_ zGzt>=vB1s%)ucKM15MJRqfQdQy@1nY*pKTQa5ED+Nc*9O|Nj%`-oJu)%?U5r3hf5i zS%>pqRy}y|hZbKJm&jFQDv|(>S-fft&@4~m7ZeMU1O)}yNAY4V3BPK^BF=NvHHn-W zAMEefq9RJ{55F0>s-#q$edB?B(;zA8>+VLw;diLlXghVlKisoE^Dx z699Zj?8UnvaQIv}fFCu6;*2wwAIzz8sJPodH)Cpc$ls$Ia_6AV$5^s9kO%m~eB(S4 zO8Cvj#|=K~74buCfIVQ>xIP%0K6OLAm*Cmb<|vo>g_opVb6DK0T|Wtvge|nw zJ*-RND1WdouCobYEJ3KF$lOg5_9-*@kuNAhB02ibxguc+IhsN>Q4%MKu9^qLgCy@p zgAZTE1@H(T-6Zi0qj{HO*=TrgKNXLP8)B;_h4@Cp#F(-f#dqeyuecpsu8n!zkN&yo zs`aQ#d@#j*o|iF1ZF@~%5KR$cC%!=~=b z&zXQR;uD0(;xO^*=?P-uw`}??3}by@n8k-{BJogr5)b(RKlNl0>b1;bZ?WNglL^I% zX9|Br6Ph3y_vYIS3$kOX#>b-Q_30mSN6|`egVaDo?$VwbLs3C&;5&)lZw4@r>pSn_ zNi`J^blua_XlR-Po{dX4@aO|gIRN&oFZwRO;hSqQ7Qq~2<=OZB#!_d*y(lh@g?Y_lOat*V zcJdLwCFnNq%TLE#=4)(TJjU^k`GT*iAAKU88V^&$l^YskR%ZO@I{cOYDPC=}7h)dA{`0 ztBI-QunLZd^U=hM&N|k7rp}~%4bJDP zb>cl|2Q;pk-~so4>PZN%_Rt#OoUCv%$x_euv{e{ynyIZE!q$b4@7kT3css z{0v;gHB^hnL-xzQGnT6D;+pb((0Zv+&>>ZL5_1TAfu=q!{%~aPGZPpO4gh-J5WJVY z{L4{1?!E7Ut+;NOz52u#EgyaCv6$~yz51&niTVyggZLNbP&^XjAhO0@&2>?Sxid8t z_+A1zU9aCY2lb%>x3Ias+}I2xAl9V(940?ZEF6cXYvKTsO?^^8b8aj~7QP_p7OVQs zb1~1%e;M+GIKp@3N%8mEh&krhKEsUU4xCvK+$31IC%nR6W03peI>w5h-F#W}xd(BK z{Oc2Xp*7U}j@Fm3M$#H!4dysoz?EY*-4<=e*zwkP#RYj6b}hiH6>BK=#C2nWIL+FK zdIs)=b*!a^(v3n91B;`8W{}X)y3g?_()uI_^ogPZkrLb>%~~J9Mv=bfz4_nQUvtCt z%U2xtybZIhU3c>hG2fs3)afW%5i7AvOxOJ)hcXaq{bmuesjj)WhN7O4oJrir@&$Ee zL9`fQ4#~z(wjc-An%-0(UKo!!pg{<{U;$y=5Z@^t5*J#0vYk1GBtyom&Wn6j4iRhQ zjb|fPxTpDwcyL2UpO7!)LxRUO@aZOjxS^PkC&|mgDX^HP#|^%*A{Viv@-?C11EMYq-9{ zKyda8{(wjl^@gD6S%4`3T<8LlL>nXC{8w%mFJBR^)~8 zuk|?&e(5O{O{92O;>D&2hIPTAz!wEXXOaLZHt+)iEUYUo)D?;7w3l(99J(VcqgktiI;o&Ti`6w0lA>D)KPeE%)*UU_*v;2j0h+5C>u{HLAuRztcB2TF$TDd?Qxc147%x81Z%NZI0c{O@#F=|8bw6 z>{XL!#v^{&_#h6z0kGBN8*daGbejQ}%)s=<4vd4zK;(6mU=;Mxqxn_zXU}-e1`6fY z-gfGr#e6^X(4))Q90Uy<;#w^1_{5Os5Z}4LgmaG1M2#-r>zPP>7K&k>i_eDO;#~P1 z8ySx^88$Jpk2+WOB{fs}BK`6OXYpFWR;UEgh5FUKe6$_)yviIv8w z`D`8pn+HQRK+cQv>KL~EOC-^-wsj&*>l`+oL3yy4`wYsv-wFzA!bhW@ZekT@zg{bK|hOb&Z#QTZmRayKRM7 zxT$EwKhN#gcAT4eE9>Oy`BNSD`RVJmX+mS8@cHF1JauEog9m)~{XEWdv`1r_!~JaI zxL7{+_!CS2?~z9zTfXAB=WnP`Ztdumhhn4f)vsO9W6D_eHGLPR^%*gne`~Gwn*A7R zt+KlAYu>wCANRZZ*829ZzbBtn=XJi`#~4rT<1sz2r8#{Zx_!xczULe^c+zJ#-q!fM zve~a5+l^nuv}4!nQoq-l&c5Th#)j{Eey^=Qk2SH`YlYYaY)p*;Z@~5nw+>#84JH!@ zh4+;7L4`gLR16$QZ{T&W_msWq&EJZGam(#@Y_L#n?f8oit%r3bkTS15)h$1{elLWzp8c)3;Trbxx={?XIGZcV6e~A0 z;so#t_vARoKs@7I@~qBziW?gq`*xtN_s02AjL63kA2wiNAdcZzhYjy#f4!I2@*K_^ z?4$8ls>P6SIql#A6ij>p7s())r|$y~QhwIlPkriO6pSl=d}#Ud?>}!tZEGJp>)&JE zZ@>LcV6<>8;1kFEUbqUlmw=0WcgjExs*_qbiQB;Op@A4wlLPBYPva8rJ!2hF6s89N z?@v+JnXs=!-2Pw=;#2FwM+CfHxZhjZ=>I2XQG{F&qOiRZ!oj3ejb9_N|^ zF%R+0=P5pO6ToJ+<`SRGwdck+DHi7t6Fn5Fab*n*%!#W!cv2#c?hO~qt=)L*O)>W$``BqHKs|j} zoN--m8BDPF)YG1^$!1wN_S2I|!EXWhl$YnZHdudr0;Yi+{EFU0!q?N>iz4VJW5h=S zReM_$$Q{~8gs5f#ap4}!DRM_)*INKLNAv;B4dRN1g?#5T>S-M@L5$p#aW7)nZ(g__ z*0FGM?bJ-zAIDR^BUhM14Z)ivi6qXW#zl%eRI%pAwYo%M<}@^97v8)N2GHI7_p zUHc8ZV7wZ9oE`BukNEAD{bsB%hq>0C;yH008ih!3fqY`&rX&hrD&8<4oISeVyb zb4L`5_n-1_%a?usc^hn7JNM{mG505)c*uClBw_5a0DWIiK*A^Pn;eX5?k`c*8vv1b z_BZ~90L$FG_~}2!Mm25UIFGT@`5{({5e1glcs|^B4E)vru?}mDrW6YbnAF2=Xb zxM}0xm@vsRs6MDBd*vU^c(3iMXEzG}%idl1 zNSYj30RMAF795}8KzNLTV-mWn#>~vjY|r$XahaK!naRw|OnvUwJ}G~*?^3SCIajR| z`s&M!j0}$VZ5!@S%f9aZqe#zq=7;K__}VwVwHc&qKrcVz&s+F+!Q(@iXGie9p*8f! z{@>UbY~r&2@QL&CQI}Qn3ZM|CUE1$O%V7^;5WI0Za2e`*5lu$_SXDd?(*$Y zyR*l=_Fwz0lpI;97Vur}$Xl!(1$OsL*jyK&)Rv~@%uKk z26W5aH`N^Yzy~g5_@!Wn+#<&qY!rBgUEZk;8!SVSAG&wRhfda zIk4-%aE#fIL&hn*oXcL%U+*@by)S!-iN4x9AL5?;=2_MRt8Kr_(k9*u(9P2vo8|xn zs3zY+rH19}vg1c;(^$zD-g(~D`Km2`7zh-Wxs2pYQM;F_q?0ykoedI@7Q_j@%z?*Hgw9BAFMfW@g;X850l5kP!%X-FMLZ2i3Z3(OkTok z@#W5?AYnlNHtl(VN0v2btyLi49z!5DrM?9Ver?CbQ3r>e!=iuPEg5F$TpGCGL7-(% zB7W&1+4C;@*U;b6TLd#U{@Cw2{Rwb{oajbO0C35T!Jf!S&H#3iG3(2TC;YL~Ji<`G2QTUxn=oCAwb?Z13 z-SuZ^1nNT`cotC2j0IRwj{qb1loOo-6hO8(K8a<+Ac143#g)CGp|paD696JDX$@$2 zZ@#7f*W=!D#^csxP;Th$=Wf*;`0QuDp1g8+6fl~-V*9Y3ejL(9039}A8$RSuBKU4RV=fOd zWY0eDz04TvXdK$*%QVw!R9@WHE5H+20|3YEIxs zb7pb}1jti1vy1u0S@J>sN?y}z!dr6Gd(a{J3WBY#1{xB#0EOBBE#yKNZu2RG;TS7A zQbsW(^n@qArw)kkeeZ{BHY_*vxi5a90>(GJ`Bd{KRPwMFHUBzZK1o0!SWs@r{b{4j zx@TSY9YS|y_qwn4b-C=>ggWoccgBICHY4<&->W};pT}$N=hbafM)#dMC_~au0I7aQ z_pj&XF+-kb)L+oi^_k~bsM_m5t~TmZ`Fh;FQ(pgc+0WKBfMlbbN35xNT!Fg<)a9N9?etG)&?O!`Llt=zf&UC+(^_m}xsl3pv=5xODcz*S~Uue(jI;!iucg)E; z9)ZFljx523NTe9o1Czv0GG)zsLKcciWU{9LoqY1ObvPV<@rTxIP;TgzXZ&r=h3|g% zhvw39yEGWylczL5Wn|E2J%tfoZJCf21>{r!Vl`0d@!FJf{__{W!PeS@~6abiL5*Upnxg> zW8znU3~{DzaxPDRV%`O~@rQN9x#-$KV<>V34h-PT9ddL874lfSf_7{nM%&KP=oLFd z(VLh`)}8r;-qDMAhXf3zRNZmwVc!+)B6pDpZxS^J5N3SF`L1;hIHCh zAMO7uofq6X465WCxy;a`=xMCOfFb_@z&vSm0B`Oi|B->dHi*<0#ZNP?>eK*0 z8oyx5p{NeM2f*jO?9qpEZvkAa=bU|wVU2Glcb1P7W1yYN$-7jBnZvvd56`PxhGhpc zz1ITDyl+3?4S>Ng^qetlAD#jzC_|NV)CPIbfV&{VLF{l8DEns&b5hXmp1_MJy5n`G7})P{7{dwu-6a%osC?|TiYhhL`-xK{i*XLC_^*3^kF zBlfgG{|cV6mLX$<)7J3MKV%#V)gB1jyvHFf^+DBQCpas%W3zf;yLUj7p4xf&3fG67 zYK@R%6YyL4v2#VcTCUaE(Pf*f+7N%&v-5hYHu8=SCuDsZAJ+x2+N=!ihOFO-y#j@K zvbnZ8&CgC0?zH>gk8l56ck2y1Pd;|vhSrdtb>i>s{ojip`p?gQ{)^rJ&5hOb)3t}5 z+EDJ)2h8D5HqVEUmMadnqj1SSp^EGUw*=7Xs$7R@he}hdGWf} zon#J@qpXGG&F@9>)pdwkN-K4F_uV!7_gt5meG`h@>HeIj>pS0@=alR7y%pl19>|^e zeKot2OIyQy&9ms2p26Aq-90z3AE2->sq=&eg{wf6Yv*Hh_5>CtWh<(K(P8iJ&h4M~ zpY!U?z+7Xx?3N2_UL1Gal@<;K*9KMg!+(%Gbtr_FGevIX40W&wMUKrc`fe#t8`AXA zu?&PoAM)738FY`{_#pR25Bf&dV{_gYHnix0p0Oo&#CLmp!#Vmw^bQ}kVYiLFtmU5W zH$JA&PcVht*ytWjKYPl=|FK_6&y8R4FL6n%icbC(gk}%>mE-%N_Gt&}1L%PV{>Y`) zT8_#GphAx#ug|;=3fMPy^%=SlljvezB!`rpb?wFu^Zj5*ot^WL@~{`6K(H||O4=+f zk{F)mCK$+G&g_yhlkj^4=)f`Izw^$|*MabwQ~qb?NyqNn(3;XmFMdP+lhpN}NIqG7 z$?q}$(zGmE3O8qXGH5fr89>S3;p}kNP$vTEG@0l#%Fdb4Fl54q4T5tANorG{WDnoP z1{>|*H}zsadd5ZuTh8f!?bZ&?EF8W$<4}b!vIqX?D=)(;@yq#;@p3S>VGB@XSYj*W z;Ehaez&`r)0N})#y?h|@U3rsKh33o#XGF|dfTEn`D&%0 zGE~Uf{9cUv9qo63tn5Vr4b&}PGB&+XbPFx0^VFPtf`Y*xf*+c9&fq(SUd{l6`Fb9nx!*y?Ui21}kRuFD zbS3{|d+yM_tUDjjll+O!+BdBAJ3^5`JqmcK5Bv?NrM3V($ixT6H0Q|Eg*ocEv4#LX zyi>n`_2KUNZ`WdHdKP`90D6J&2oyLVS|YHZYKqhZEJc$i!(SP$*<`c!#3#M44uh|M z<6ApVI%eO7)|j4r>|=I*_@f`y{CL)LK1^fV8XA{*mvx@zWC~W0ocF?`EQTn&(PcI) z{HjI|fH*QC1|AL38kB|xRDe9d$uru{U=pP0XV!?Blx9ogW5`5j_Vi5$Qvwfxij5W9 z1O((9y_Mn5o!kw7DDRSM%_rt0x|VqJ=G|3h=4 zfS=rL?y5I68$I~|_K7Zn!{`t)4@<3;SeLxdd!5yjJ^2C@U@ihV=)UBoUM#N&QyHON z0IzuEadi;fdiR|>n_;=3J3eto&5wiI=a@^iSxp9<&9B!>m%+WI+0SdohQpp`x@`}N zY;Ne%CkPV+mI ztsf+SnYwj7kRf)z{}|4)Fe9>AmkezYc=)uQ_MuiO1~Q(3;a3R~=LHee|55M zH}snn+tul@|JSofen;?23p-rLXn z)|iaB@4(J!r(ItM!AH+~*Un~8Zs=X-JhkS>$3Olhb1KiR-8}4hH*Ffp^*p!k1I5Wz z&xK$4bK)GN4BnyWm)e4Mbwz&o*q_$_q({_2LJv3~?-nvk&)^*y+QDz_iH${8xr3Oc z2Ni#1oxR-A;;s$aEUz-4(l?b`a&?kp?#=a;e>Gj@>w4=;sptP*9mf_vPOZbaoT{Ja zol&)>X7vjZyDroGwl=5!F1q8B6>1isaA4QbWiS^38Sn~~Y?v`LawkgS7>oD5^Vi?- zi8=`0eA<(Co_O@W4Xrsn`@}!2`SH`A{(NWuXj0h^Zz;@q;~C|3u;4uh z9K6&Y>)gxG2E2Q}q<->726{0JbC-P}wnXpfw72fyw|UJ5u7J!Y9KG}I@bS)aKf0+4 zI@LY}uwh7*VM33LPY2ycS)Pep^%L}{SI+6H$nkvc>>!8yk8E-#b^*NRHd}w;L1%}j zdMH2lnU|Se$phzDzbm?#TiQSztYhLBnZz(Yj1QpPEg+ScrQX z3M)+^m!$v(Lls(3ehK!Tocs>u9K{w=mb!fY^WUh0;5o1I%_FF{}a+Sh81yy{ga zB-aiFrhbiN&?J8kZH}Sv(!4UHa(-B|zR+dw2~V0|?#$jG6N>J9F{@+r?oEqhh$yHgPW-P-0LG!ijRCBU420OqoeoIt zw87&WL0RmKezRB&fKc6|XYxefIbgG&b%wE^M}Nn@$d9e$rMam7=0o1I47QqSBs$Q=BQe~5!MX8i#aO!A%pI3WB02Y)9x7+sqgjX*u1=RNPEbpYJ^=}+%G z;ply9NiRM9FLsW&?D2c_p39%K^Wm$Xvqx__|KHcvCm*}`tu;@szUE#E%`a95pG9Z` z?1gR9p_zCtYYqwWpFvW-z-eR*JmrNKTf9$uBiDMhHuZ;pDzPbPkG^*};X4{`&O^%e z3kV>Dul+X!%4SGGZLI<;Z7lZCXBl7unSM{sd0vp)`H7pdL+W4c;v9G9Nq#~M&SFn! z?nmD}UjUatAigd>VMfjKq1wrl`K2uaW58DQ7r0W-*duSdU%*7(!*7mOe+MYUFfVIQ zlcFaVq+w+pqPdlO-u{j=>HxU>#>>`rC|>c&W2;ZjyX!q`>yuZX@z2#KU;Em3&9@bs z{d7o`9M5~_FNG<;YhBk~lT#A3^nuGzqFz@dzx=g_M(LT=?dbchpLO!?`FihZtIKUN z4jeq=f5|rs9!YK>3jdpsFwD%%ygYW8nVIRh!_0Ji3t?tvW@hH3qG@@QPfxX0e0

      zd=DBxx!r6#ExFPd7C9yNNNc_zDdkqJ$;TT>8AnzuEC}XJjOptj%7Bh)fMAGU2|&sJ zgdZ3O17x-^FndCeh*04fsAh zF7fi;pegxv2{10}>Jo~E_k@!==&J>lx zG%528vcMu<5ohSt**2A23c3jMe$Qft=gHV1sn|WJ0`r8Jm&LL%A1n*jrCLR%amz4n z4V=hSk~yc3u-&4E4NNtze;G&=2ctR@t4&xIRE^zPI|Bj_3cD4uO{~PJ|6RtM4B*v7 zk}lcMT-y72dj9G6^`cc<9mlbOP*+zs%`a!Ei(N}B>scK%u-9Ng1U!UY=D9IZWVWh- z{bRs#uNb-67VUSG z&fGfRHg@j$*@m-|3W-)V?s%;9s{e^$ER8vP=j?<#=O^4cKV{5=Kf}FWD#bi)%>T-N zj&}+Mr8LY(_{8fE_-pTdKY!(2@8^~KH#~FeEWzU)%~)|c{@+q-@)iU;t3gU9`E zV=inP6KvbSs#J#lyf^>Gk#XEI?rt+~F8tV>RncXeb)wEo^SQira>_I33&*A3vzuct zo+6D^n32?(Ymf~bSbE}W?riO9XW3K>N-nYWZSKxe7SW-vqSlC7#! zZAqaj+RNNmrAn|&YYj8@YGCN10lv5m0A4JF6htXeBqnB*WFAUUJ|Co;f}_#rhIHMe zNoG>+Ux?k`Hg<2vRwU(91yh=-{rRr5uhO!x8#DWHU@C>B44u<6D0mX3Yo%$*&mNQe00@-o9*s|lhZ91r>ERIKjCcCC4rZRxm6u}^}#i-y#9a(4?Yc0 z-Y^{x9b_NJ&Sos5cic@TC=1j&w_{AXblHD4aA>pPPQDh*gM1?zwv!}>l*9I^zzL==fw&Rm>J26Bvn7@<90HOgH6R9gN)`EIE z!YlLQphNe4lX~RQ!^>9a;3RE1OnYO-XG$?yWfWHc3T2p`4Abs+yu2+b8CD;)GUQD! z=A<-BfZc9`?yq_H@+WxP7k@dD3w0JW<5mj2i4thnL>EjY%??CZG3_ck)*!SkZSX8>~+(yl|U9s;6le|{2_lC5NyVX6j#Mx%x zPjs;JiAuq?jN2`w)RN;mAibx}U`>0sCO zAvHdjK<@6$ksx^-CT3IRKED_Z)wKO@BY9i z*cN!}v(J3$`};gRB<@^XG~i~M4lGq#6~{abTwU%FNnBrd*;@1bkkn0p$KJuc<899% zgYxlLAMyI*BXxnaqy{SGF_Vf?XK6B)-AQS3!Fiq=?O&Ved`36IO*(RZOB!IbKR$*E z&)&YLS!!&@m&W2W_O@u%t=o;=ar@3QyydN*$DMo6u-Sc@?Xjg~V;W2|*Vm6)@N;^yqlWY^Dt)c8 zQem2en*T|FO<|;N2GZ zC;=T3hXB+p(;HP63)0z2jfM5v&8r;tGcUaGLi1kHib>Rhbg%0BC9-{9VjuiFM76J* zbI;f>3nYRPE*i@dm3E$gcE>U&s+GZ?ro=MAaiOsTrUOjJ%9w?dO=j7SEG3&6`U22o zvw7H;Wa8AkSp%B%Npy2MbmB{5JMQ%jXrmG*o)a&GR8n7pq*G7(DA1}c2)rI-2kANT-&?E@cb44W_g{I~Pd ze$-d-wO{;sZOp~)zfWSl+7sc}(->@<&8Eq+$IVHX34%@B3Y*d4J;X>7Ed=#yUa^+S?NI;qRrJePSP@B8r{cS8dS zy?WqOE3?VMWK{C5uuX&4ivu(gW1fZ2i7M^hMMX7*$(dcALAPg0VnSh(Rqv|^_7#x) z*;E6?OsZKOC=Bl`E3}}&!f+toq^r5KLIkb2z{z&YkaN55YT)=-3T5bw=W$3>GRY@z z<{2ac%QQ84)3Q_^@3suhM{8zTy6&r3>)01Cl=0o1fS?KZzZVU!OBVt9PvRh|VQM@-Vb z54#Hr!Q8aJtw3^TL?yLnl{gho4~#B{A~uT1haN;gEFQr{g^6{nGQ>=>UgmVZWc6MB(CMN8v~v2U60;jJm$*62_btZVp@C`nG3D zxpMi&tDK*}bc9!4xsQ&8r3h6nx}kI~xfh#tsVdF!211}3IQ zkGOp@a`x6++`oU#@t7I!J=0ibmp3n1VFaw$8s3;E` z>*nJh`VjL{n+L+~)1cMaGu(OhExhGzZ{ykLpW~TlpXKdue+Rq9U~}Si_+Vu#(e1{& zIYpp_5(9lMVgHy|fkcsEN(d1Mq?G}Aw9zK~%TnEw$qcw95VZiToPthJ?V~b_l8`Vw zjff$b0k*9YY$n#;RNhb^24`a^LHJkY@Wjfojo7X=_1~jK5FkXALsr*N{b!AejU;T} zHc_b_+;}EWd@|f*tmmg^yz#~x&6Dre=8l=~#x-2aFbSUm$u9k|?-dcN<~7eG=-x0Y z?Kx}Um<8&6eNYQvpSj)T$IH^+o#RxQCzxyD=BQjVv&>7E>Qy0YV*r@9lu1jQYwLU|uZ)i+M?ycTESyY9+b(urvS42)UqTAlv_1MsTUYat!Lf z1-?)^WnRMURU0EevR*=Z>o1_Lh93it%S_M#*u6RL~KVgG>3$FK7E(HlIzzT|k=BU!j;2KFN-n?1vD z`LRj6&WHU?16cRhgUPg9iVLSDbAB@N z)_W&Be|yKtShzXP&F@N78aTSl$F|)v7B<^mV>S=N7Lbrr^{fV&-2JZRI%B|GcG+ydPLs+;I1gjCFD31f^5!KilsAF~o_+seg&ovJ{k6l3|2>^l$@ zGp4U?+p`j$iO%R)l8;>^Sh^09vL;cT5`sU8^~)l39N#H5Nh|q{EKpT0&yS_%?4I$xHhRV zbW$}bW+d-WoWbHAP=XrcsvfWS(2F1DV;}kuAAa#gzVG{fknj2a_mFdDG*B{W+zSya z0+X@>((Pw~VC8@TF@v*g$fk}v-X z-tl>#&-tA@EH!xyi5Sk2i8!qL9nl$u&_7bm(B8mCvNLh5?{r`>?kx}rGtHi?2(bXR zj6?!ZoV}Hj@7P#}11NS3Kva`5jBPR@AtnNyDQ zkrzMw$;L2v%e`}M-F=3u%bAz<_nSFx$uoCvZ>VP@o3ddujGW&-t9 z&IxaO+p}ypCp>t#=jLYLys_?Hobgx}4wrkBO)(Lu+C= zR+c64kyjt_;FubiGz+}+`h#W+`Gqgs48`ns>hCx#o>^d3D8e&p*#pVVX0WK_Mq@QMv(j%Dm&5 zXSua2+zgxcyDT)b`s=HNk{d8_oE{;n+`fC8B*LS|j~TaDEvP&kKFA`%ox689JwM}x z7oO)Uzv?S_`{%u*P1;m4_wLhWgPE~6!&;4C0to8&D#!}o6akP3>Lh`$ zO|s>!{PZ|(TM+$`kAAHAu08*jw>H^jDFdkty>zvemG3NsM0M$4veNI^@mYCy#s6-l zs8^G%C_;vta7OqML4Haxh%0@c>ak9MPC2E(xiqgQbR;)7MgfuV8SwqNZ;Ja3r99XU z1X%ld*#IBr?HWe<>XV@0wt4W$+1Ujj|JWyZ?X}mqxP9AMW+4^Ipfv)r4$x&J1>=sC z1K`X9Qm5wCR+rj5V&?kr)6(Mh93=~y$XIov!rAFy(xt+*sqFX4RNy$%GyRQ;r44BB zmHet_-WuzYl-#^JCa(RWwqtO^;p*34=<< zVJ-mSjb|4rmyueRb^2A*CS6emJ!$US_3EH4(+@?n0aU%ORjFn)2UX0YXj%IIbs@9z zsEr9)29$NBzA8=5rUnSqn#p-)p2sdHY~FZXQaH~W4!e!9#A;(+-R$>V?+?wxuP)V? zIGv@j%u7!Yob0T!Q6*V%iOtyW&0^jshgqBdkmvwe8FDv)-)#yhH=ne|1RCZUNrhzQ z={YMy8h~s@_JwWpN!&D+)HGLKdi51P@rh6H(rd5t$yXk7>+BXk?I-*Qe)doPiM->v zd(8VA_WR2w>06|>PgN6^)auvEJwzYXy-mfjm|NumF*ET;^{H zr3z)q21X0Dd0a}A8Bpbrv@z$*#^JD3IJ+@+_DVL2~7j+u|m?7gu>&8KqPq{L&BuHLyg;bK>s7uD%@XpF?0i^}cG zU8@jyeVNgXG3K}1#;`8KrW>=@+L@fFfj&5+&kgW9^Yv`U`P~b)+kqhqV^)R|<7PFc z+9ch;f1Z{OFx07?fGA|M!>E!DOiHQ-llf>|4QFASw$)3gX>&@Rg+ z^@14)6bHYBAr&OUEUAsXh!{gTJA&z* z{|Wxmw|o=d^3C7Y#`gPfJmBHuYYt0gu!0)1IC~BX*+6M$pV5nSjkmGY+d zBX&v{^KU40hUxK&MJt=#MSDKPO~^GIuu_UdXfXPN8I;@~iDVvO)siF0Zn>;M69a=B z#P#Hq-;?me@_l3j5MEfxfKf1@FyT`8XzpEwdBypTY&~Dv_n{(oFge)!=1J$^ zYD(C))T@BndHM4b@nF!tykCxY0L_RqFJrsycL&xpy@*5*)Vz8mfHNDt;6Oyw+0HSW z&4y?STYv1Dne1{gWq|v&w)>t_B#ZO^m%YD^mgLCNJ<*?;IRzh1R%S{il}ak+s;=tp zYP!tK{090CU1nxxW@c!()QnRMVkw0QC-ZQeAZPQ}wSBMftJVMZntAg^t`+MXkNBis@zkXKup+A&Q>%gWH!$@pBMNtmk!>gD?99r9E+(DhR?7cvVXkf z=%^xW;OO|2e!R&%%Q#sU^uvK{E_*hlNi))H!K!F*wIi!DOcXF4Prz$Yhxm4hgfXi! zmU<N-@iV%0gDA1f~)XDMBk|L-jMLsOm&PUnqThc|&?)C<`DVP?9XP%p~I=;{2*EV?aU6-k<6_GLQ zKS($@%^3}bREs0Zyre7x0xD)z#&T6LUDlkQFF8FpqAqK!q{FzDVdnz&@7?DtbmBjA zK3|g8Ra*cRjhF>bmnn@!z_)oZm(|L2c>RyJWbZrqfDVdvr{KKAjCaQ&gnEfwD*M!L8_{79sT zSW6~QA1FE#dEIbySOW^$py%GD@hRf~gIjk7rSOqOSAj6E#e$}|H7X^u)SW%Ff_!hH zTsKhFtR+wiJgEm(rJGe$Rv{iSUDr)bI=yyKK@F0z^4K*;%X(;ZE3i&l>NZP3m;M12_c-MLtzye4_wMMJ=g@ zm2UWa$0Nf-W+6)juo5nFv?J%%qg-Jt5rxKp%$?)2J$>5U9Ci(#~KXgvKrqqk71!AltuuhnXNcZ#RpQDTXuyNf38Sa$QVaaq@=64uzcix!b)%gzPY9aDg!4{bph^_Q3DMs zO|L1dhN4D()>_ooDyOyrK!KtCZsn!J8SoY0wHQ$8UX7N}rTS^f@UH~y%gai>SF%o2 zB5{-VjLzFCt?K*;y)rG8WhuqFdS&S_SbLpVl~^e{s0C){OCy(A8MLN>4jAxjIT4x| zYMjR6D?nCe8PmMzJo)NcZpe4Rci%_7IU8fcSmi=a*>)vpdSeiY)-hH*qMZavYou^``1ClW@B@lM&EH3G@0$-0%#Is(%cmr>-{+?;S>Z&Ok} zNBuwy{R1m(N3oqqi&}i=mT4uxahex0ml*}_z4~BbTHjMlK<#Oz$X1dl)w2v)3uSHt zxo-zTdbuVvfJ&!oEUtlCq;tMy>jdiYBV!&ps=5(2kTwp~pHU^WXmE`HQ)}(Z8`}aQ zzDBV&Wo~JTBFc!AYpx6}bdF!ky1WMszv;{fY6W$z_|7SNL;){7^EEpMJfOeIzw2*n zcCuMZ4izZIuE&zRszsj@nKPGXM|{VB`1kym@A%K0oz671*)bYz5LX2jFV{qxeX?Eyt)#0&OIUw(>P z&p*rkH(ur!|C(RT!|!;XrY8EeDgAPGhQl))4>>=*!};_MSFXN;!T6d^CgSPX8Po^i zdRe!qFXh@SUfF~lPnm`ajCzHko>0CWkEn+kdgWQ;_=YY`+Ut8WZ*rniW+fPCf2`T} z9qSYY>l%6ePOU&g7iFvb2a}bk7Z)5kHM4p>`>~x~9oZ10+Dko}pPkUiQ-M&$W3LbYT}=2t&6& zZUuyTS6E9s9pK*ru--b}I)0*#^JU4sqjOf-j5`PWvMH%uz<6haw5+(hf50&6lNT$P zS8N0$SyY0aA&JEmgZcc72h%gs(o&~T9n6`|3-Nf$vx>l!RE5QtDLWex7bn|TUx^HG zHk;8@NT++5E~(89lZ^|kiZf1+XPnnH4_(}3*h|{T+|olBL+x;p5kH73FE}}wOM$a7 z+F-J=!O_7Hd9R?Z5q1>L5jFj`QxQSZ4;YMk;vwZ4&(?TAl30;7ELWc8DyKId(eG_b z2eOw~8f3F0sZ^W8gkiErw(PU2E0z-f95OJDq!)9Z=5Tl{kBwuC3;XoLo^;)sGUM^< z+r0guZIYlb>^JMIM4QJU0!A%;#mOS0sxpG!SKoik?nWZXDXWt+`mSPQb1ZVY;V@=n z(#K#ZiVEK>8TVV(*5 zgv*!4lq)OpghV#LQ%3zBbrf@YH0REP83b)dxT$mICo@L<4a~4=B}x`%dB)N4Iid`( zHG|mF6rLpPi^MYuBI$sgOy`7w6Cbfeyk$a0!y%y)+Pj=X6g48j84rh&&@>+R1e`iL zJr?k*CgAw^lowunQHu8<7zv;iMxhkQ?|A$jY;0~Z8IO7F?T@t^d@Vw119_gYST2Yp z`7T;ZN9wYa!dShVh~ikzRXgvz{`zhH{y+E!eCdl%addPl8{jW}`5DqYV{30u4DYX9 zyDFQuTQ9!AfBP^0jnc#WKm0-7`K~7z4tl6`@XgW|DTcZtr#%dveV2kVU6LQlTUoQY zDqpox^PRcmT9#u?$KL8TbWY!Cz5RqGDaNE90N zfRX3W4TMHH0Aw#G<4U^Jq_nf(B(J389rrt?H@} zwu7*kbYpG2vJdLI^Kq%vT)k3*a~j@!Xm_(JY5YP9;fjvqj>-(p8o;zcJ@Lg#+Coa0I7R?~C~%Zj#jV@7 z`H^Rz;@Q`3Q|E?@8@s&Y;TwGLJ@4X)M;~W2-l1ybdP`t|l~l8esxD-#h-Z$-a=JuR zVO?3dN&2OAu{_R+9IU{}b*`w9aV0EJUt0_k11{&`@I+1vDfP^PUj$HbBf7(wVr#7g7_#Cuvr8AdeC%?Q0UUc^fg()u3F7r}N zf^X!paznk8tdaCq0i}R;j94{!R#2gm?-Q~NZj*jM5*lF> zTC64;*V3q5=3ZFsi$yAd6?NGNU{m{2zzh|{w}$5)y`BmT%CK?L@DhMi{=EfwYyei} zLRekn)GN$^>aIOT!I{Q6^w+jI3&w-25P)AssaUxWd5Uu zTA9S^l#Qkb`>O7ec>#-4HeEM9od9*}kk#n5vkq(npW)yA+yBVvS<1&h`f(=XA#dD$gV$ew z9aEatr_CCCRVk~wl5_8cfq1RuxiB2nO2F#g22IPg@_i1hG|6Sm7Ii6WtOpiFDb4Cq znYj+b#miTC=leb=ijiB-Kf|lfKgAdR&mZOH&4;*f=^=WXJF*VxA|Ufxx>yiK;L8~g z?mtbhA21m2;cP;drP9QSWlfGX@M_%y?2N>_MxlOgnv#qKtG;2{cmlgNatE)Vi5kkU zeOL`TAk+du_X1WKj{=NZ{a$!|{?2Pku|H@moiq^zVmyHEFBO;*K)zO!^iE2PN;{Rc zuky}r?l$QAr)$zS>*UIAzV2*6I+X&f0YCkF(6J}idIX2>fL6T@cAc>3^*NyiPv>>o z{-XPq?%Frhpth8@QBYmq2erxy4Z4R_R^)##`PD_NF%_oy2?Ma+I^H_oI$phff~}X_ zxH=)WvPB_`3Mnp&ET<_w!w7o)kf!m%3YwkI36lj^FYbzGMp;(`^EtEGk}_>bBEvGT zWswlSl%~S_T)>#fCRi$oB44DaUTsL(%j?gQWoL8oiV$Ugq_ido{LDrm^3TMt6Zc{=aR5;g0CS8V*z_M zMwab|cG+9@I669JXLEzyogLCFW6-xEZ#tNsQ&vlcF2K|wmoM$|@WVU2a`Y<4XH$+& z7hIfJ@pGwJ(ResM&Nw(eWilDCsxt2EAJXJ0<0xUVtnnfbOxfKTN>Z0Mk!-Skl2EuQ zXQxZ9UcADE;eaYT7uxwe%}I=tbi$pTZLVJ3AzRL6gAs;_MDI5=oSdHEtjHbIN2)C- zs(vD%8Pm-Y*mxjmT5L;u~>*~vMe2C^*n=NpYg_o*Is=? zipibrU4GWj{#gP}RE3v~{%|~EV|SayY$0PP2of6az54EG+`oE2=&qTn0)uOJ~bo(E7m_Wc- ztnKLS>NB%GO5yrmLg5;BC?fPrv~PYrc+thZHl{0Yq~MDmbvJ)u~tu~?ZlQv-7+-_1uEgq zUTYmLu}&0qK`34Fz1>YN?o0$6KU<_69!{ChmaMXzC=ymz3(RGPdFmMS6Z!lEh^Q-( zy7!Y%=DztTW;}?997F+Z^h*J)2E7CtkqQgAesDhHxmRE3GtWKE3;TCjriPo_SNXuZ zp5SBeeuCYtv4H<+x)4^cwE;#Mgti3>^?R>4q815gD&aby!G%QqkvvE3E5f2jooAF~ zF6*X2;b22L*tA9S&;y*Ucjr_e96%?lHxpx+9bca zYQzUC%WGvSIN~rOh%8|kh}A<`wZM~a+H|&X&?XG`l7u)3r7_b>Vj1UAWZ4|V?2ICk zNX|^IT~;F3TgFK0Ia}nM&sL<%lqyRFaP_nRmN#|#{Wl6sR>F#rc`{J{C)-rCR)|)m zZC&E2nlR%fRT^9n(+I;@*)TGG)gMobRbd??e_u1+0voCsd^ayNUgzCLfu;cQ2SsFQ zXt4>N8ixa69<~6X3jk&MKtqMjpA9O%R-gc#qZGiDxwn!x-2#uOIeo3?wU+C*MX-z< z-}0k%s@4<&WoHYJ-&qYH0UUClE-(WHcC{fUjBL7Q5ehk1TBsv(C%`KJV&yEl*DxK2 z3tx)om!z-Sn(66XZryqn??$}+@h4?}-*~tFT*V4ZKB|iQ_xHJb_W?n&$@@O~3BKX$ zKgO+>U*vng`@4DSi(ls6y*u)rCmSQ0c0!;kYi9EqU4k>(_^K)E&PZGUM%!MuRh`k^ zgBH}*bm6+zeM03WjN{37zMWtD>wc9mz-~SF4B!8q-@)rIKPPPO`Rt7T=C-ng+vI`X zXe8^|^z1&~FYrF)^!P4UE-lE*1rHAIi9fFM0hcacW3s*1fifO+jaA8?Rd!CJ<4T!4 z9!;tQx{Mh*&je5B*QD%bZ`P^Nbl#*2n#r?vz@=;lTLz;_dOMc?T7IY?tj>Sx)7QNh zs}=-0&JaMjOMdOV;TqkO8bH~FN*%*@AF13|u1m+RMZv!A36Z1o5OZ{9?d^>Yi2^L0 zOp=aa-X$UGd)A92_fUYUQNK04Kkz2QeBV@E8aEz&cU|ZrY7>FiYw{E6f%Vq$*74RM zlCW%LB~9wW<|cz#!LXNezL--QPwkv^JCfKDCj(ZCLL?A=l}ViVqJrMA&$Y`}SS;?c zs56HB7EDSg*_`y)o9vJTEhYT?e1U5!-tqoNNb8J~+;DJz#kHN7hi>ffBcHv+Yj2$J z*v+eKZ)~zLNVtBX$At|;R#r@>Gm*5pD3;D~7|z)mkBOqb7{Q;NFIg=Mu3ot;VA1L6 z34I59+avnPgoEP+r^}3@wj!0Zbs>e0sSN>+?NOg#7>kMTqA0j?G$k!yp4F^;NV)Rj z{gj=rI5mzmOWE9-5ZQ>zmK0Phr1%XP#33{VG&M7maWY$w7KL>DU%Gvtw_U!(6E^}( zdPuR#n4PaUnNP939%kbLx9?8zO-MhE*xBfF^Px?yULCQlRvbQvMXE@Z;>s0?gL&Fe zXG?asMqIzTBY;%Y8}ZoNBfjwJ0SBjZZoP5HrHzQ)jZm0Sgnf=qrW9pJ)Ejf>;GF%# zW1^;EXJbNDTNZgO62~OjWjNko<7&XN%$emC^h4$cb7tv^tx?3u;S^`Q_>%^)Xv*TG_@9Pdxdg04aC(52gEf_1aYd zSL0s7_U?|b9BS`*_>o8XmA~rONaE$iOP5IE0Y%>VM}XC$wOLcb)q@DdjJgepLGOch zgjq*eHy#B791UHE;Hy4na=khx23pXn zEMy&_pXa%pR}v>$=t3jRnSfy!QiM@kSS;sw@8z|cvScN?-CBK+WSq&h!C8@y;cGQ5 zw@@3Am8DTgk;Ur4R8piFb(a3PBtShn!&U(t5=;<*3tQPunalOZqZ>;r-Q6JWW0D?L z0C|HiN_<{WSM6hbxq?Q0ub`8ks29YKKh(d&7>xzDBC$YHvm7m1NIR+ux?0zoYj-BL zwHm^Uq)b6p0cO-Mt1FnOSVvD=m4dA^3v}bEgTIyC3NWcjd(P=q>tqp@01PSt?Q`YQ z4v*cqz{RbR0FZ~%RKBMt)0q_BL2AWh-34+Jz@RKV#-s{vRsvA<;!v76Cz6WWW0*LG zeFMOFB>q2g|M_ak-IEiZy7dZQdHojq=cg2<!E})cEBj=YGGCR#!jb@$x}j3@_DbiaHfX?VSG<*(VwD*t zCi703H5Q|iGDB52GB;;co0_ZCB2bp7`cJ9httM0|*d*y~;%O-3PHuHe1ACK{TD#+G zIdTJ_;HpRgRlZxRqG_3 zY2I+QDmglxOJim=UqHITmu1T+Yb1oHle;&DMp6q4`3{QIStQ0age@o@_(sSC zw7B1c(K^KUboo)J%ymTeB;oPgfQ94BC<-a=en%JUBUeQ9_O zhy7Lp?P7X^K9kKYxh4ICG+Xk6Kk%bG^Yn`Z7T)#5BYfSbzLtwuF3bG*z7Kzd3%k1< z?7u-Wo{)?-+c{=!haikXVaqO8DR*zb!oh=6vNYn_gf$quHC%A;}2~RnwTPO&1Cm347hZ8Q_OR3zjj~1q&f>RdCI|qL&keU zdQl)OsKvZuxf(KCEyb&3xtNLZ_oeM2m&P#zTXA%D#%!K4TeKb6C<*EJVYx^}Bj1FM z<7q{?%<$DYi^Ytyvoqd)V~>sDNVM0Nwk9M|z%(oH#?pwz`6<1PF*{pBHpU56VkGh8 z#k(_>tAeJexOZ5Q=8lU)OV3pF#skJ-!&zlGnU~x@&%qdmeaqV(zQolln}k75*ch%{ zzDO^OrMQlwU99W##=SXM%j1t;;o^lcHi%iK4SRb%E??Z?_R;IyIXvTZvB%D4%c5GA zjYMxpQBOd)SKhe8bUx?e=9onh0yc%zr zFPC^ck#o}dUE~>YFB0FB-O-2(+X-i@3i1+{$C$XsJX}#y3Gld_&WI9A968FY;N=%y z6~GnegdvE5+poSt5=JZ+3os2yln4M9_j)YTl&II^z3+P;aS(I;=1q1lT%>Wdtdgn} z-;+yMu9B6NFoiMJSBEx^76*ls-Qi9B}$5QJ1Vkl=<&88~lFlLVE6s)vboQ@i+U(BBm(!79@XEe27)DrLMW zAkw8~DhsNU2hahU__gF!nSlCwjj|2Uaf`Bhw3zCc1yW4u7}t%b%5tz)li=EO9SjHT z?M%3^*<+Bj=d&>g*%4cb_l6{3@>>9x~5UF`Rzv;&p!Nhd;=N-hPwV8A(NyM-_!6 z0OsjAVHj&5MJ=CORTgwIh%QWxeu242>Vz#J0V@JNb%Iqb2hcJRIYeTm(nE`+_u0AyK&zsXpPI}CO{alr|I_y? zOhlCluG0yoCG%3#9oW*HvXmrmi|L zLH~Obb3uVJ)Yqs%8EkU?s7Dj(iKnboYY4)DvZP`i7Zt^_5EfQZR?HR!lYURmZIxwh z;7Xe7x`7;_D=8}@b0#$6zo>G;HR~#HElaeN??E8{9)g~e7w|DJ8`836qR!Hilk*h^ zC+AGhreupbtX5FvSTQmefMhK(6J{zNr$*M5uhkb&n;5!QbcJ#SL7PzPyvW344zw2N zB+uZ4!K|sn6^$@Gg%7Awb)ARkqj$*+^f&DFCHxJ#Q3%5H@EEVymea*rxSe z^O97ntXXA9tE{P8SZiJ9Ep%yzGVaxDO~Ev@;BEkwy3) zD_{9E|N1+=M_8FQ=<&&~`zgHZ9gi|SJ-}CnWH=_#@rg1vo3i2YcfN<;_`mNkJD)M$ z+>kxqXfWW)l`A~{_O~(U#T046+aG-!qs>i{@h)3imt>8TJ%X}kTxf_~z}eZkd{$Sl zT%?~Q^!u^w=i<0eH0U!Jj_D630@N-SXB<8_<%?f@mSm9dkq>{6_kZX^lr=IhTWi?4 zar4J+H}J~btJeWBjjmZOOLDTc$E_Cv9^9R=T84c3(?86=`7vqa^yH9l{>E?S+NC|l z@{X}-E0(4eABK;+3`A_nssBbUf;L#C(~Cnniz@h0sebm zS3uWSeeO;I*NFpB5UP_Sqq5Vk*`#2y%74LhNyF+RKUx>%u_v zJiW3VJQkoSst^C4QMQ>JPB-n6e6(FKg*Ydl1j6 zOBc7fbYX{8ToZWDFm~7g>SD>I-7%vJN65IZK@A$wQ1M5?%0rZmA2 z=K^6yIbV|u`WP28FOOMN1x@7e4q=C7c_U1%?NI{0;=%EhH}+4tapfA3h1>flyz$_G z{&2)-IHEZW#M>gREazDzi;H+%WEHoUrwr~Mv3q5gqxpa(wy#S6k8x8}tHCf7oNOTrr)l zI6a*TU^N^KWnA>*kgd%P@$`|+aTG(7Q*8{$V!^T4Fd;Uy9G#p|j|0Lu5mr{{A~9%h z@)>#MMGA@Wtm>T7Iq_q|7&x0zc0A~zle_L0Dv8kUmKI^kerh+k z`nYC&f7XSYSuf;(#x-}FpUxB>=sXBCvRm#;$NoS;1Z^T~;*d%V)hhs6sh`K|b9xa;a4mQhMA)zemyzT+XeupgMdqT#Qy?jq3V1p7Y-l&A zHi>Z}V=81UH5D?j3>_P#^Q+Kt+Ig+ftN|{tYcNwib`&V`jcyEOtk%F54o-Ob)z^9IjW;-+%_%Dw zCIjAk^AWz~1MlG-4_zd*2uPq{oU(%&1xQu`9?-onYBeUuG@Y-8{@qz8vOyO_%DzxA z64{`uNjJL5uF+JrH)oqGgTY#nONzJS`KlDKHY;li@v^EZOEv!X8l{hsYb(SqQ*+}& zpZ7kt!)pgi?j9{L7?J&ju4N*Er;@ow-j~Y%yaIAYQ^Hi-h!3T`V>EB{{CC0oOYOS=iDc&n3VB1ZX0a&gpB=U*i*KIv0=D;Q zYF(!Tc@15$J3vXF&nk<==*^lMJnC`R;8ZB*LC+se1U6VXeFYf=Orx7qL7%rl!(rt< z0&t;ouFkaz^s=+N#s2MEym)ZLQ_nrm%dg*~YI^*fpY$Y`@!2UiuD^pv zAA5oTu&5+VQUwua{p0U^qBUeMN|C`9MJa1|SynPXY-~>W#&7y&-u~YAFxa?AuQ$X7 zp?*&*1sWP*f8F0dl0C+?>z7*~Ql;FDv1>-Ce1Dyx*VF`20_uIZv%4z*S5_m3a)9J> zQ8)$d4r(Bz1~-_7&B-&~bNJ&Fpfh65o zb|4i-7;ba`mo{iR+XdF?l%3SR(dLA0AJf4#UE|2h9rZCrJ*qm1KDw5mY{!On9RxJ^ zz^=h4@N@?BehrOTl@6*upr%;reXU!cdzbLtyh+9BPhKE zf~Lk*DUtEw&D1zYNR6#6^DN+enX{N?TpUe#-v=HdtP-7&Jy}z6@BW!|Ye)Sd&Q!!f zL*Ob-S0%3=oRbWDOw&SG7q1@9xpn6OS!vlGkBECQv(`QeEI2q{h?iEGXZYOXf*!jYF}vGij!!b~9xOOpSgOEr_x?(Xmdkq~i)=w& z)bxh~`lAuEWzOO85nzeJ0lByM$`UL}VRmIXq=lvLLP?>VO&1cqeY!}cTbUON&Zjd7 z0!kv9X22@*1W6=7ixZCuizViK=?P~!*RJf42Qha}4!L{hP&TU*6LI0n4!tPk{OnX1 zenAkjT&6T>&FOqanpTojS5XiJv20eaY){zU8Pn_aI66FU6XmQC5b}JPOXqODNHJ9- zK3t(yX^O`F498>Hyf0T7`Etd}FTTXT`xpO;qN!QsnOvuh$p&wG^ikgbp%1fn=`uLl zj=nY2Mm~StFvv~4fNYmTt!yaW5XgDx1{dv8{kY9Y3utx8VBWL#d#Wn+Ay8>xWxN6| zje<&`$NJw``yzFlB=MJ0zZ6)T#cLu8wanO1_3D4heo?w zDt;g@Dqer%6>i_T&2Tv8p@(j=y|st6kb6(&J!NAg@l+TXDueW(v~Q>8&I-OL3rp$u z0=AY_!*n{Q-y3PcWY^KsMgbTbIVKw+qtS%ZX^&68P)ky45DGJ3&G3+fJm(2i0@o;$ zN`i;9;;_o(Gy(F937mja#cD~NWm52290Zm|{i&=b{&^#xjryQyml6~_s>Qt5I}gxF zHm#BKcXfodjhKh~Jk^+J1&!$F{Gi2(y!QGg|L>_qYHf_B5)sG-UW;&yj>W2~I?xKO z>(`zu9UBY0${92kyfcdJ00+RWt=qcpr+!ts6d?^X&;pSz2}$px3=Jtll{L63DgmIv zIAm{k183FSX^{#`sBUW2<*IBzy;iJLMvgFWBD31vOt^MwK+?CobmuP5yn35g_77O7 zx$w?#laD>|7~k;zcXEAi69?o~rDpgBP{xg%f2F{ifLrUtutp_t5+N_+s~zisYf}&7 zct{xbW%I04L?2BQm-Vp*eT40mWeWjC0@tR|d1{fW6>3B-J}I@A^R0ZNW78Ab zhKpMXn;Q;nNnU8WmYN2a3KD427T%*iRc}7@1JgpYiy@~2?7HZA1vs7S*p>$MKT?K| z*h(oFuf?p6H(KAU_Cz`mvHe}f@X6VXJBKk>uI%vS6A^aU=jrEbP7Ygxa*;Bt?96I9 zp|WA{C_~UH12=F2FhV2D;-bjAb5{Qqd2IdFn=-i+TrP`3d>Qky67RM!4CS$9A<3lz zR24QS6KSs%U@Mooqy_2gu)#E~>3UtsW8}4zP9#m8Fmm+DP#EcfZ9@l+&Q{Eq1xe(@ z%sq5Y8kntut>nJ z9~J4`waeGp+SnEe^KzCUYDQs*D%4;-R+A|uP(#0`Mc*-B%mj?v-q_~Cr7H}_+wy+X z<&4vlQ(PEIpi9$O`J7E@g~?Uq6_bsLvdwvuJW_zoMy{{0U9)_NvqtPETvM_*J0~Mv zv(ywEqgL?SAuQ`PiySri53Ofw>jD=qT;t_uKhH3<{M2v$6z_cEgFOD^2XNt-G|e%# z(CKR}m(%r5nN+U*-GZ_f0}R2ssR)^TUcAYQp<^HexWHMx$mz*zCi5j0RRy=4bKJw&E-uB2vKJ(1;yz=s0Zjbwz-JxjL zovYZG1lYb|Fd7M1HeY49MtqNC)3MW!7{2{FXY&IBmQ03mYuuQXSl7tLX0a@pEgVN@ zo-cgmWukXJ#I*|}bf&`fVqrH`#xS1r7=$ng96K8W8gt0uw4lP1W);h_<~+;rnpTtM z1=Hy{@3^r`XuWug%vLqyUcfLe83YwJ^z@^UC=8g4hSCvw;fnBU*MS(Rv z2JsM|8(w<;Hbs_kewvGqQs7E%T-_qv+Y*lwUpC-l*{IIWQmQP&*DX_J(6el9_1WGS zaCne$KC5`+{*vG{aF zT~q-xK>cBKtHyL zqD?mWVmgl8=uibZprN7Z?w||}x{a0tSGQpJ!TtLj9Gx*;%pnZey?BL-7cX*u|32UO zAHJPiw_d;|3D<5u#-~2@&Aj{F@1{SQP>2)=Dk+em){UR9YZ(L9%4S_Vc3omv$B=N6 z+$O+=u~Z<%ftZy$OI6lgN{}<+hZANi=Cgt{D@E3!6n8DMjK~qgP=E#L=4%nF$xMdQ zR#c{;k`8#I1)IahiO8FpD#aUR*(g&^3V7RK*FHTO$FJ{4`AK+XjfmUHN?9W#PhbMCmkIz}o=Tx=V?yGFVrC|~$j?Gb@i#ubkU7T>~LLXegv#-6z3$NYd zU^b(y4TEUJ%}aZH?D4npp~r7>X=^OLI+aQ>aSc{kAj(@)7A4A>Kx90+`6qNi_nGQA z4ugO=N(e+g7|>XS?L6z^bWl&84Z>w3Poxihh}=y;f-p%$svbrWcqpAXtuAsJm1CQ{z?X&00m6DK%l3OJ zDSvJFMsJYd0xJo}abV@SXRBO-4vMn%b#u1;>=vtxG|eQjw_2?z)0L#CItwlisl$-d z`GS{TzeDMTO(Wk?w1~zAGS3DGcp>Ylvq8rgQJ^J|z=)RNX04U6E&&*to{8W^Et|&r zN_`w70lRF2fH2s$xHLEt=LnRIgMivW>(8d@I&6EMUcJZy7q&n}K+7H!FezMn89A#! zstnjJAs{dffhc(8^VcLaa0JTcsrB_O&I&-*j%b%)efzv&Bys)9m~q-rayk#GIk|wP zrUkMsUC)dg8IQNQdTa`gt0i(Qn0C_yL*S=O3q+<=Xh)fS<=t#4%!MU38 zc*10~MV7uI;NhqraqrIST)cRh$1Xj@#&Ao<_sPjIo|2|1Bn$^1sL{H|DWHg4Be1}7 z?m0a@!gwzLYLTZLJvfvxyqKTyJ>T=aT)KFfulbsf3oFkHN(cLQ-=NBB2K`W_s}?Ko z6;MW*5shr+N=Rz(NN0g&l*T` z@;6_vjn;KOa5~QiGH1(oLVmBQHPIPFPOWD#jy77p3 zQnq8)Bi?iRK07wCGUBneQD6}?DR%8;=>QsOnkXv`0vjmfwZWpz6m2>fJkDuT#8}Eo z{LvJcvvdab%4F1ZaYTYDa%lyklv0JRoW5EoLJI5Jh5}y8+^Vl#>&h0$mqU&B>-An- zWzSxLe1m52VE^y+z-lMEFleMxOaq#BBb(PCYRw7DBA3M=?hObm?IyFK)z7QpV^x;o z1JHnWY(uDWMbVK7S?K9`P6Y(fknPQP@yNr5FMs(9EtOc1PVEkaft*8AmEu8D)^cJ* zft5ITO^cFZISLKA#LvHV{J;EA1HXnOiC7keM99nLAPi&-XJskf>hYv6W2ss$D9Zv9 z4=_o@>G3J^DreDnrrDCF3Al5xWO|+wU?GZ`Br%(lgfI++mG#R01LFCRv(<{icv*O6 z*@_~aaWdOva2)aAWWlWT+&fQ2YSMGCx6`AJa%QQQ?$-&1lhXyKe$HetU=SPfG-YdZ zi$^Y9l(eXT9w(<$HhQ}}I6mWiT3{%d&udB?hx0iv-+92z3uAh=;WS&(G?3Vsv~C1| zs~0tIzqI#bw{2{max}~-h}oa!+&?>GQ8o}JG*!r=s`;KTzQ${ZXOir=GZ_&iLwY?= zQ=Jmk3nrtnNYA#1J!opCndcxioTN4W^q7O$TueX*vcSUPEF+&~WUEX}DF^+ALFDMi zF}=8ra8J{cY_X&t#0vo2AU>bG$?R z(C{^cFc<_BtCB$!v)S)6?Du7(bG}-Vm94q*el(RLq09_Lm2i9b6^!!}>6kHIH=P6(O(r3Bx$aQ|o zPy0#jrW-m_bu|FCf>3CBm&PIo-n2&f%Ng_eLhd)2YzTWW3__KfpqqdiXjJx~{v=J? z{Z+6=6UG~`;5B7SQ7O93h05JD@eH8slDM!~@~jl2=_rmdVkGX-w8XWHu0a_D%F=-L z?+T1bijOfy7;vq9fhX`ackjH)fBe_~mSP7(qTEle(9jm$)naV1!Bp70~%9JgkpPyAWNMwoQP=Kr?abmn22LXwsYPM{d zG^ohyjD~`$syd0Jf?-~1M_4Ull?~O@P?r@=QM9Jnp|B0~J}nR;=E+uNE`%MUMaB;} z0R<|kD&1`9(HZx5ju}R~&7hk^S`f>61=tkqG_*f;{D>S-ep=AODq__+espO@a%iVl zr3xMJfJbG9y4kK2%+O7#ZO44qdRC7k-OQtMwX&=^nXY7G8z+HWK>c@1iJJQm(*?sl1GD=R!@q6Ej*V zlIvQMGG$#=nTZ13EkGiM*kwvpq!dLe|0aK4dqI^H*@{&3mKs3cz=U?j38D_1JaT&YFq}vrh8_r`Kh6 zp7ZRBXOcGdo_E7L9`}TC!?VvC4)$w`w5F~ql~p!c+@auv6IpvQ7>NH*o1oTjt;`JqSW(w&#%aB3gF$rM z2&f~hpK16ItT0|RAcYnL6CcJ>&H-nr6;zgjJ_rDnuu2mmlE2x|tpRmv z@Cu}@`GHQ>S^=MJAanED`>BNhpjKK)WF3K|QtCK#t$a1F8X~DB1N<7?Z&0S1_;&eP zlN|-1)A#0#G68FFM%mPe1Q?ON%HUR!n$_l6%UThSF1c<3Ahux~UX7_uMWdgiG`OW; zj~HxT95ckf`NMCq^-Q67?f8w27zwtKt&XkSEAx#J!0}+@2M3x3#{lTDFgVP%J zBA{V~ZH0VlwNUzk7higjr@rzulPKi&i(g^q+70^SEjho?HJHc~hcZ$qz0S2pn>+$8 zv`AS|mn^fi_1#owq;oEZe7AX{sG?hu6JX5 zyVUe$&33M8eGThI##3Ny%QTaZ?cT#k=z-Fy0oE!hVnYpZmM~ufO$AG5z@O=O6r`pT@WS(qG7*`@+j4 zlV8fe`Jq3=a~7*gx?-0uUBqFP8efSSybCQhjyYMaI6R$G zm6pv(jEhRLRm$Of$Pa(2dJ*LQjMyB_EAH0P<8-r(NJqAeH)Lsn_Y z;Vh>gRs?m;mCGZxwgO-bs9O6f|saB^(}|GtE{+ql7CLHb|D6 zJUBU%jpk}z@cga&OpkLGN9TOg2XFGJ_dUv4TJ!ozjk$eB)4;Oy;_Z}+fqB9Ha>c>R z_j&DfD)N!*dpoj_UE7{u^Nh(PWOp-QYZSKh_oI26j+IsvP2S2_KsLV=m3Vv&MiI7e z#BhJm^IY2-OXq8IGZ7ic`Po7W+405}e(4N(#4`>AC#4BgbLFdwl+QxdUjcqU~DVD)e9PxdC`cMhydxUybzhn*<#5&&8VdV)d&O18b=Z*!g^_3&G90~S!6R%W}d7* z7Zdn?FKmrteZ?@0IXhp;80(G4R9V3BG?h))?%s%AU!)z<7+9q#>2gJy&Nw@b#NW;M zR&Ei<=EO>xps@kzYQhNc;jUpNrAmOKjcS$@Oydqp^JRrgCCX+ngA8n zXNBOC z*^b4b42Fiz*UBJ3OlSYu0SMGe-$yq*n2yz*rKvEQnijNDnm=;>D1E$Rgmp&k3XG^c z$qV2KPM8Qy-4OM zRNheKHDy)`v&~mp!B}O3goZqhNQN;c=#wP21t3DF*S{h3mN01u(o&=^R1H2W@I|4< zt3eA)ig|mi?1hFJ1r{ZGFUCZH6uI(mc&IvQUTrOeb?c9%@|{+@h@`f9^{GMSr(GcR ze;>R3-zVsF=~gJf+1*=H-T(w>vBXI%#ZpmLlH%s8F5So|#on(yVAcj7Z({K&>Z>5{ zI&etYOCqP0O?9n*!|R4sfJ@p!mTqJ1JuI_|l@t_~tx?R)iyPe78%mO3UY1grF0zWl zekiQUATUx$3V78^xU@Iq9XEHld3i{dFZj}nw|V;ZZ4S=o$h1hr-o_Rmc=RS8dEzEF zcDESB!TNm}x}XIGcznK!9Wm_nnaw>f-accQHPo%goqRu6t`v|Xi2^ZDjw4GLKoYjembFM+6@*a# zsHRf$>{33%wampEWmL)Y>o_qTi$(xU-vVBma;bAI>gT4#ve)!Duk1|Ibn;7Orpg?3 znDOPWID)XxyWSo0*rPetmU0evUpErsApUYzizT|$ufST_3&o+M7ezSNvJtAHpvVd^ zCE5&^@0X-sx*n0H1Iij(3rNI%0h15Sxg*?*Hk#{ z6OY=PN7=kJazsIZr!A}%o6|X?oxhFKIY0_j0p8`B2~$cvj7$&`D%g#)0#rGb$rp9Y zNQqn{;IGl^jkj`r<@yK8?h?N$PeTX<;9Scd@wBg}YYMvF1ul}kn=nsJO&A!wt|Ly^ zbr$Enyfy}Ek@*UXOx`yhng0u4;{sun$^ODo11NLP2${iC3t%R|6c!JmBQ+EnZsgGoPI>-g^kJ%#M#}>VkvY zP}D{qH`%*{i+Z}=7O`|u+e>@C<#CsJepW(v7m~87993fg9%mkEKDmSAr-Z<$&J2VtqIBk zYEf%KpZe38kVe2MhiN+Ip)lA8)q~ZlEV%QJvch^2sjjY%z9msK>d9^cO(@mK0hRoz z!2u{!OaMZ8tHMr|^KJ<6$kyKKMp=zUS#_8|n|PK$fOSh*X8-pASnvH=pWqk$lJ|105C7BSPw@HAzQR2Z4}I0J z?$VN9^Yy=++4Wz*ANjk#gv-#sw5%YK~4+lH1zvJq9hjM><5Pn9({OEHbJMkVY#ZA&JCd{SSE$|UF{#9 z^YBea7!SFBvg9=PxZZ%_sHQSGZye7VCWcXxaG{A=p5;u>j!9Q=y3FZ^HLF=86Lrv} zY+u}BGwE@9<_LN{UVU&x&P3#IFTHw1KX&4~P!^3yPEJnGIi4=q+}&b!e$Mo0O1)e# zv>B8Ik&h((Yfiz!dddnO+&?GGO2$>i&Y;IfA9)CW^8(9sPF*!DSH}Y8T;J=9#N&9H zv#cRI_t+W+QNpMfVyd|$1nz8(CDo)KSHwX{KXRCAfhh}$#f*Bj;$;6mL3W0(QV!1x zju%BM3Ck<$%8P^}&zH=yMA$6(azSJZ#!14ZtzEL^i4=Uw=1}?&D$y|NnN&)#Mdd{% zxijjsGmIGaL#C@GgUJS!ZCF(mRc!^>Q-=_&by6U$$`a-a*__X^oT|~{tMbB_ps8D6 z!GOh5VM!}wadj~i4Q&U%E`>E$mnGZjgw1&^g;HrM7FjB3ST`>A*&0RE8zDiMkXy&} ze9mI(Bqi(k_<&_zGo7V!!&-{G?G_FD1Ga_(j4xT9pVA-n>4gR&$7DF7mqZk0&LS(x zPap8Cy%Ri#BC45#Owe~vGH=}Vl?=CXm@+T11S4Jkzy zS(7B1Ac%JQk>oGMAk^Cm){-mefFzKgN>5kIPwSKhEk?I;dsFnWf@Q6QL;apS3PJ$3 zWwC^6B4R*+&00Xgx-RMWl9mANT-!gCVx6d2o74Jlf#WjjLR_xJOUAgzW~`<<;6VqN%+apGu)En>3Z5sIQIs z_^8Av2ol0Dk>sM$q>%uNT50PI>Mv5)YD{h^O5YkOTd*?zl@5-YH#?=DTLEST#7TOw zFtV)GVy88xRaS@t0mO2uY(-NQ0GcpmA#@n^*^2MwSME?Y^gdspX8FD4B70S+Uws!=auV;r-y856}N zx9+{nv#;Ob_R%?uv=UFGVch5Xg-d+ku}66K%`5DUBjP~(Rup(L03GWIDYg~l?F?=e z6jo0)M-;`v;E&=V);R(0>oRL)ca_}QF}j#4SgD<6uVA&v7As+z2;09b+Tue28qmVJ zEabMzbE=lMPhe3Nwxt((^$GJ7!f+jP^XdlsM~6^5#>s>)zHpD@SuTZ}n)M5qLLlhd;7$$n2P3z-lJkc7-CoG*Uair?NlpLATkx?;YxtQHZ651_{CnrPIZy-`V) zC63y3=TWbRl_Cg9Dzi?T44?q8B}x*;lQE;=ply7V6-8MJ*p=m}fJaqb(J>8L&n(JX ze#eWsmo^tHK`$om_vCXZ=5u_OBNsLd35H{ao10wN+F);U#H1h63q_JAMfaqJQ7_>< z%2?7+<)!%a`6?IIl`yjEsx!c^tF{PCLTR3dNkq}el^1rgkvXdcV;WF7d(cThbzW~- zFHS(FNC7nQmQv3+L^c?-ELmmH3bWKU@;#5kkjQ!g#VP?tN_lN(W30@7NMfC-8blc= zV1SYPhc3`Dhk#5`5~(cRqdHs-8EDTX2tb}h0uTZskk>ZOwX9(DdfIjzQ5zbMjMaV; zX|iL`7W#p0F*!VOfXWZ0AXm^pW$I2nAAL;_#Q@Yo60_RCGgu_NLenivB0QK#7@Dq? zK*_jjJhBIC8kP7XEb2& zqYaA8V*~J3y_INiBJFI`1D$OHacVVC7jUMoaKikHWZ4Qsy`I*}H4h`la=zrn7hhs$ zd&1t%2Iq%|y!`5Sak?l4DDNk+fS*^cUSMNm#D&W@*xcF`U)@p|i7m4$jxE0I$#*lb zhS)jrlC`0c8ps&8o?n_qy(`0DE&tMNyVes-S;_c{dx!V<{_p-Cxwc>XEkA`ij9IQ0 zy!OJ2#1`K1?)T8RNd2J<0fBlWX=76wku9TA*n1KR1E^e;+Nmw2rDLnMKq*bwvX+El z=|IL^O(4x1OI?GNe=`KW>5Th*3)D46Z7OVt>ym#3=yy&-SFB1ft&C;4kDNQg29)Qw zI4}yFHsbr%vWZo8E4zutL6>eQ4Mt<**0+yV3SEhOT)nNl`c@gOKN!KNX}|dExsvp8Map8Ck=}faKmP~+ zAm6n08o%w6Ka;pl(e*74RcpQYTsb3mRI3e0J%B9F(EE!gV8b_x4X&oX&at`VJQ^>=IkY>$mSveD*nEFMjFP0~X$K>Cz>7gCR%r zn$uOoJoC)L3|_fUe-d$YIAwOWWP7{MWHO*hXHsAfl7Nlzh|&aX4u=vK{`?z9oa7C6 zADr{jtvl@PZZg`O5cm7^dKq=#cy<4nqW0{L2RwOo!V?eg2{rh9x**GI@r62D6lB&g zU9LDjIN`!5;qo|UJBCNMWA-jyVmdpaXc|stOX&`kE?|_DU?vp7F8}dIUXuIt;)v@P z2RyVlpqF?7@yb;}niizxihMX^IPOa_Uq3J{*hR(Am8=#EhB(S7=Hz@%Rd|L$k7P39 z==7A?{G5%QZ8k;`dmC_RZ&Rd()6<2dq?yXnG(z{6v>czM^aly!K@Y5@EWC7the^cs zD?98>dZc+tDF*KagYkss@QhY+u07<;EnB9LZ`j(|q1W$odU7NM#>YSYVLtMa57K&IJL04#=J3{9 z>MAEaKauN|l{ImHAmEm6NU4f8)*H*ZFtwVZh{^~svin*)T?v3D#<`ujvo~tWzD{6L zDV<;E8d2B!+}5dd#-rjfb*4f7{qXQeHn!Wl+b!b*FWxCp(v$b?Ow8u)E+6{n*KqUk z_epR;I2dyM;jj7yZBb__*B*U@NpX#2FlIDJ=(pBER0cJ1cG$WmG7hVqT)d^Cp>}~3 zhR$yc^tDY3C2bug` z3upxV%8OFuhv~9pwMa$kTPzm>d_#9=EY@0*1g0%uQ2z!k z2CYb6Jo2#>6{c^b75=1WRxi2>Dd?r^dn0g8JS<5STI-t_anQ( zBNxWvd)A8sT<9r$%JJ+0w_d%=>jy`i%qq&l(F=P#w0nW~J#v%xJaUa|I~yX$!Za<* zBXVe(lu9eto^x-K*=owD6f#&aQnV$+y^-9qq9DZ4kNc#R02$&#l%*^3x)3H%qmM^r zBCT~!qY>~`8%&|ycbcyAUHL}Xh-r~CPjlv3B|#_%z+?n;5I-UUCWEiuCbC}KJvfqi z?b?OQJpJ+mUcP%qE(v4nG(Wi++PNk#knc(8ENSS`ak-WjR_X!ftjr-Y*3@rA+aAh1 z^&V=yo{IbhsJEJ$^jBh5P8V{4LEY9nfJzVjVCa~mejPTT!=A&#f~UUHdL!L@TgZh= zE9MKReZujP#g~92$%5C2cWX7MLvDsHU6u|^6Gj9g366USlgWt5uul>PIB9TH;tM*P z1uR!7ezl^hyTmfnh$;6PIHOiz&l&k{PPR5>Y@Y>=#o1ZwsWTW8O(yh*eTMy5q@vD3 z6k4Ldt&?xX4#imN($f@W%e<;Gs4A5&Hp*^jplsh*kSKFWP0}qjja4}oa$fSBh`(bf z3=;uiWnDpljuxl#gcf11*0cc&ctfauJ2rIfcNXORm%fpP1bF!#M{(2|D_50(0%4#@ zw6+T?@y5#YgrSq?ZEB-)WFWw?wYsJ?P*kn2Rul=i)=|hB1@oPeYiAWe3~V6d+_g9a zrFzpv!ag)Ok#HFZ18MGgEVQyw;FrPdZ`VGK-Q0jSb}?Cwpd_|5jLO%NVrNsrZBcFR!d&K z^@6A)7W0(IwqV8=p1#HXdk54_Bh1l3Z$PlQ$^C;vj*m{besxN~C z(F*tz${2~`7`G+@21HRpD$+)sM-9xTQ}O%VyRb_y=?Oy)Nk3HUGYg7baDRWFyRW}a z_JJpfBdDT~*}3P-U-&Y^xZ%lnKS3=FB=u*s%5ZJuMOj<3i?3$qJt<6Lz$!x!`Q9~j z-cs@y4YiQnTQ~Qh^CsGyQYo*+gRq)F(-dXSH7zKnjBBewF`hUGX_Uz2eLVQ5wxgZkUb%=?spqey_Ho{OwVcqUat@uK= zEIFgF7U=VfQM-br7K;Q($!9J2pRmdTOwcmh0U4tZfyftit+Ih8CkkUw!5DB$ z-q^N5g6_73)n97bvPbS3{NI#9*#G#)`P9#UKQH{@KgOTG|0I9(pZ-pM=DYti-}lm& zIQJg2@ecmd-};x7gKNA$eu;nokNzeFpt}-vwQrB7zWf6J@`q}E)BCRQbN)Y9dF&g; z{Ea{H_xb2g`6>LmPri-m<_DQ1bN>0?dXcaDtDEHKKf+(RFW{9N<@{M*|Ign^_G>=M zV{gB~*-6cNf9|j6uRiq6Tz~Hq3}5}PeCtaubL(9{ozQRdJO0VHGe}na^G|&(fA!XV z^myxd>ktZLRT_~Gq-D)$Sb}i^iVTtvU#&Qo;yIK;bG6D?Oxx5qntQHg-d(PmlYL; z-R)iJaG%UGUOQTH=WIz6#GEa?EK;sHCLZ=>LtmSK(6#jG>GTZmMy)v|hUv+Y*jZtO z*?z<@veF^j>?Q0zev=0$r!4D&{iB5}mfMpJddZM{nbWg1S1*hh#j#9wtNDW7W}llE zw%FJji$9nNop{n!Wg)&PHtvb%(wD#TGUwA%F6@liiXBa{B3-m5xr1Jx$!H{6>B_?H zh65b0odoiJ0&CeG7~Xe%gLgjEr}7zbnNb_ZxHqD%dd#wdg9oR?)-z5v84tJU1(wYy z=i-G;u15nNEGizH_n6KrUVQC{Lb{F-vvkg+uDN#Q0`Gccj9;#pxtzxy-jr_U!Qo2M z6K!PJ2n-kFklpc!D%s}#e9qbFT;vfO?%WNtBS>^IBPk-qLSe)JCmDg@__x=H46bmT#zW0BG zPki$0=|!ID`3yIhu(Q2IKN(`J5sL9*dCINlU*e5dZc#2~oGw;8I9n0MV=i5~#-ne4 zJ6Eqi#9%a*jj9orfhL)WUzN&AoYKD?U2@Sn6|te|%#AVXnFU5R176s36}ByCq+l+q zN;ZGqx020JydcEWK^F4Cc*H18x&8X9%+9A=ynIza0x6=)oU$y%@HdS6go6<`cdt;3 z*M<{geF^*zEdB8aSC+(KLgE7P+`$?`InRJPj##Y<@e+wbG4t2=u3i&iLZt@(TEy#5 zMD`gvh@8i#O967q%2JlCad%{6vbtiKt^{BYTqMjB>G+2Z6Ip^L1eI_^aUfFWo&Z=e zgI-J+s5Hs9AVFGtR$0k%k+GW3DFwVL=?=vj6`VsiL8u|Q6fSC5uJ-?HiB2OO{w`(A zG|F76>n?pqzf1BSq(GAaA(9GVkQ3 z=Ir!(Bl?3e%cA7@TQBgo>kpFzAyr+<8dDUx0P4#kBhM--YF*2fNu&v7op+x4r@(q2 zYSaujFG~Sv&*nKNi=13#gR%jSJZ&IT!{#uOBI)+Q10I~rxUjp&OLxzB^^IflvMv6d z7O%C+q!HgLXv#|LHR`IC#+ZbaNC97q2bp>%cajcaprCR{LB_SPGzxg41-;Y4N)syN zXg>oyI=&n@o$I=S4@@VZ)nD{J8o#b=ID_Nt6kdG62qSLyV#SqfIYkywWHHlok0~1z zH50G{18JV)mQH1K4fEBCG|$901pygb_NEiIT|yEC(pVe!+af#6C zDoSBVT3_Ic94ZCNEGX+td~aM)5DZ<*cnbOiae!?K>bg{Urw7-1yFq{z`Asd%%`kQX z4hBI;EV5NGqHnLi0QF7Fo>V`rAc|#wVwzIC-Na-&4CU`GP==H@@;;>@=B?~^tVKRs zdEeHlNxLPo0hKWOD&jaH4x`pQUzi_F3z#`e61evHM1G1e`5R?sg(CZM1llt|lJ-PK zt{{QOxT=*D;B<9uYKmCK$vZvIeXHRbtJ&j^}ZUpSq%)41jfkGiycYO@crNQeSGJ4{s3ta z^5h3zWAE~Hl3oI)5(Z6GHS1=JCO@`}IiHg)rrg{As)fKQ7cO36{OBWcjTIWCvPcT* z?0mug@iSlyU-z{i<89Y3@k8JD1N@&~c!A5;FY&H-z7y(- ztSU3E^+Xd-YdBxbcfGH9*%v z4K`8Pw2WP0!>cbQYJ}c&zLVCfae1xJZ>;>?iBwS-=Gq+UK4bLrmtRez4OUL$$imjJ9MEoZrj6n^)$q(kKNkrTmUyoU(~Rh zNe8Y#|!%x`@_`;{Yg(qLyX15sfi+{!A{JHP_ zibQ2X%+|FVJpSa{c;+AfT7J_X{yrK|`W@?3COPgr#T(!CUkSeT=kuGd_1K+#p1<-v zzlY_!uJQ+d&Hu{(WZq5x-VgCFrsw>cvf=BJi|mDPH%E_%X7@5dp0Zk=x2UJ<@wWGV zgeM=F^E-awZ{xeZ@CNVr_z-L6{OEuB0j_@FlYH}^`R#n*7yXZX;gtmdZyj$Pd)s3! zZYI2b?-XyKmskQ55!8lWfZWQ)P)VF_M1z;YF3&wxowM*2N#Y6n1AGwi`u%&|z zDkt)#Yz~*p6klZ|gC70KKp19X z_t`X*>5L6q@ip(h%4#(sTg_yX5}H8h(92@g%ACR;IRT5+oG5^Jyv0keKj3J(q!;xV znucCFBhHOjKbOtz z9>;UfAm}r%mLg%>eB>%uFJ0jN>o3xaO5XSA1+HG$;+0zuxW9iai}2OWO(s#F+*+FP zh}<_4Jsb=y!%0N$D^AZ>oXrc0!qTv0d$K7V`>JZh%yv3EqxM!~iq%XNzmD8Z;z-yA zS&^%Gv9vJNV@YW7T@7X%>ZWYFby4e0FbWgtuoQVI2{rRYA^tACIL6uve>i2aSW2?u z-p)3g8xx_DS3V%Cjci&r2Lp^p?tiw-I6XNhzji?wcblUC1gwncKeB^cd&5-g_~7ZC z2Mqg;Bn&X+Df@3c#re?@)oKYe|S_>{Lj_84`#;Hj6tBxC*Y#~x?cPdM4X z&C9o5lC-sc=&w?~l9%pBBp{XJ=<3NfP-$7>fKZ9t?0v zOz7H(>+{oNUViB%@j<$D$OqfuljYw&Hyzn{#1ZV}u!1 z`&9tel(>Z6O+j!UhmqMsxFzWys4f$687TM%?>{IWlRmNAgiLP>8EwpPh zh<`^#!z=ghbN_J4-u52Tndk0q?zTs1x z96aC)pZPStT2fpXbM5*K9)0J#*dB(g&Q3VnzsqNT_y@VYyUEvm{ikH_znYz}w=^(L_KLe zIyY;O2U(cWaCGX)||MgQGE-l+1{;7P!Z~M8- zp8kt`-}ilypZ@b4-~V_1Fn{nro%83u?eFk^{EDB)4}AMG9H#{~$oQT=`CIufH+~8K z?C<}6{>@*0k)Qf2{xHv+Fd?rUE;v0t zXPH-|tCFf#(_~|$D<;wO#xY$r)OXHsCXkI(o8ynbz^0-9@#(& zw5+u9w>(EuK3{m_l-F&|)}+T1H}p{X;U3oQLxf-Y>a-ddy%M$;38@BYLi45ETT86R#X!MpEF7hmmyX zSF4gbx3a*>###JBG684?{UM|13^zelF*^JS6LRpto>5ReN1+HG)VbBZPF7Kc(48~`^ z_|Y|GX$zV&d*^40*_ zIV;S|v+22XCS#EYWn8#&nPfC#b8{OS&&FiT#%REu*IsLlfQw4Zs3((M0vijcROU5{ z`GWDrX6rpswKVoneJF}rigIC{r1P18c}?9ieRId2^{j0xoPt%V_@N4NQHtnP@ldkD&GsRcw~0Zmzx zt>&y2J?eam?S7wYdo>rfOX5k%c%!60f|4QA)sQrAlTuAx=|)mmliK|>8iB50&sqkd zz!e=RWOegv8%Hfh#N9axz^6W8jnVr9kyYc_rUe%?MOwz!GCyaL9dj^$!2bC$cc<-K zH(yy6i-0PP*d1^4#LcUG`0*P&er<<-7*JN3fI>|aNOG&ut}S+*tgVN7c!U<^h$-VL zBn)H1FqGe=Xcqqy&+P~I`Qa~piTA$!F>F(kE;9*Mkc8=~(A2<6*dijOkRemA#|kLp z2>s~sYx82KfDL-zz=XmG?L{?3T?+W>wU`+u0Tng3?mgha!5KT7yDU?~{^1;qWoz6g z&?xg&UXo=MphdTWQjGxozV+p*y!u^v0s5n$9bE;DTD;XXi+cB|x-?m$NIZy^X-?t2fGS23$_-TwwJ>YFFyGGRS!>MSGV%mq zTP{*zlc&p7o5rcWlp;@-id$I={fL{7T_Q*VUf(~H#*xTl5`<+IIiu{G)=ScQs3oB> zz-roE5Vbx>z7&vL090Y*%HJW1RsC7FrqYEM>AE~V3R++)48e+o7HZ=)zs!R)Y=qq_ z0UEtf05A=9P{wZLsGwadEM!$l?E*E9Z)BdWWlTCMN`eMzLTunL~6BP-d8oWc-xA!s-2` zF=0b&Baf!>;ytIq9CaHA;6W_E#P`t(Fzg#GJ4qtnb_M&=nrq z9*Os6x?FPa_UpX-%Bw7=Q-%g!{M-*QyZ?sB<@2)Od_D);FbD(g+__J_ILBA8JUt~l zzDIcD5r#b&juK3j5{rp`KvfA?tG;!u-<9kgu)5TCd}lT8*XC^tlm@mzAW#9koyzk7 z3pL7qT4xU`V_CsZl+6VS7MU)gxoOZn0y^$$YPAt)6{QNkBHpz6y*B6rl@aC%1Q>3p z8y&_DG`>aG0Pu2-==!WKn`;kN1*GIUs9&RguQ08FzKRR+|9x7qf`bZ#waI_B{T{P! z#u)_%b*?w+TWZn92RLzG(6vPO8D-_=dlrTQqAMw>J7*VwN14575RQD`8}VgT&fQub z3I6|T04w2ZzU8O!zkl-u{=skgS^N)w_S*o6KKa}DzHj@J{E46ONuIs7MSrhHv0U=U ze#IZ>8*l$T{``0TZNB_XKc63YsloLo1REm~$NKp47jE&{=L+8UQOo!I$T6?vP=5RO zaqBnzDjs<>=iC4JS2&*+eEu*0S^mk-csIY{?|&~FU-#GeZ?8JO@mKyve$vh>{NX?Q z@A&7h?()lb6CT>zVgIxLfIs=WKFq)TTfdJ#{s->z7Z)2u$%M_&@|Az}2l%Z|T;req z{y)S&`x8&|%l@ZtgpP;8`7Doew8U6Uoqv=!?_*SYAsEi{p zk(hhdCIpLY4AQE>hXFxaadtZ6;vnY6)h%Ylihdt1?he_?6GmglvVleADRRg0Y0Amz zg2v}U>HpY!Z?f659GuLVrhsqb$$N9b?&)$vZ89NEdKpbOxW{ejmP!-m?mYmI3u$?&K5aIVMz|pB+2A#wjl1+ zT)MKu&Fu(l3x=bSbO*OLLx=(j6APo{&gq<95DBy8!Glv?+3FKD4I7g^@RFdFg`IPHdIBJu z`i;qmOBZ%Yq8|I%5+7Q2Hzy2+eM(`bB~)5`RK8?1mN z>MM81@>n+3jfazybM8GjCU8RnSFk!u$(A{T-cUA6XXmG6Wl7T@48D!YCaYD>gL@BH zEeeLiaZ3P*EJ;5k>LG>n+1VYr{);`0@K z8LzZOW8fqN;Pc=ApGZr%aQP-5`^49C_1aC6sE?(QB4N5n#ZM)S2N;RSR<9gy1Z2s| zN`O^o8UYAFqL<`7NjcyUX+=nnO5f-C**RsUo=a)Q^5}^3lM~7`Hg#Wtl%On;T}2LgVf)t>hfQXqv{QLG?r{Y}E8^-hwFmL`D3 zQJYNX8#RAcsYYERX2o)invkl3##DG^*Hi+~<*a6Nit`28Y>v-!-h3F5dDtkH8_ucU zgvVADO;yUqzo~0Ad<~%vX+%EQ`O#oZ_tWW?(9;0|YcDN_HeogKFu+xzu&Gq*q)iDi zZB?qg(D`+P=ujX`iqyPGDRN7e7VUUxhLi+6QD*cuOUfXl87>%Yr(C-{CQbX?%Tn>r zbJ%s)6x3V82ogd=%Y;BTr0styNpUU6MeVVQ&VVwt+*)=h07jZu60R`mJ4Q()o9oDW zCOt>e6cmeNmid&kbf5dH``kXCvp+MO&I8hAK)#BI+=v@jc6rYuS9$!}9y{ZhBG0Ic zw)hq%N#ihLILjJrL!~?d#)E8rBNqxFBB^ts09FE8i0s@d`_5Oaii*!Y`yBU<&-nWH z^(fN0%-d<13rjUGiuQK_^(!fowPalzoEuobKHX)KpKATI_D%^SLsGTO(PdGSG z7{Ym0a_9ab`^RTo-n)pQ$HD2jFeo=iJ+56CvoVaw%bEwLEA|g(oSo0RLdn_ocW+vz z6qOh+W7NmV2jWHK8Z~A&^1W3ySIZg%uM88fA#_$4mYTk*a#EEJ(kRj?H)Rm$O$r?? zUgX>YupZVjM2GsiNRim<_t@FnVq;@0V{^G$^5Fi0s8@0EO2%+2WqTQr=MfDtV5swy zT8;LLT#F@1@GGc`T-b}&*Ge_3rOB7)IrCK}g>G4Uio!ErT83QP@X(XTko+rA?n50pfyQeE?3ZqFPY4-btUXIWmPJ;mgm%2E(}kZ zXV4;3Qz4Un!1YHWl8r!ucaD!eMO9KZHKmTnm==U=g!yHq!51nsqiHHBtSy#6q~8U3 zWiVdCFT~rbssfDlSYNer%BsR)=}BQ5uE$m(K&~OK1^8Nf`xTNwJ37y*u})8pC93 zmrs8EC-~&oyq{N||B5usKJm$q$=;!o;15fc6_Nzmk9INJJ2X_R7Auz1rC4q_SBYm| zxieu9KgyS$yT!||-Q!pOieJjF_>~{xzisq+`paLYI(&sYPX%~sLgh@4j(GkHU%>?l zpZMteg_%|^j##A+#NYL~XI_wcU^MA5*_d!?d%)@GDR|G(-B<8|rL;ZL(<7`iqF8Z* z0qsXv19S{emCqSa)^sZ=@1)IU9WDb3+9-_U^?48!Agf^}MZub;_@n zeTsre9qX`0u05tfRN7YUE{s>-NMt^w5yoW){yC@iF-jybfsA?I_--Gei)7ufKD^iW z+0<%skNR~AsII^px(D%U+rav}S$px@67XB<7d+r~*Cif)^8IzdZwGq(Uvf-%=;jBw zU_Z}4|409tmmVwtsBa&L*=BU*m@gizxc9;{{I~D=e&*>H`SfXz>!XC=@Vofo7fSj& zm$Q;H2?5leFv`{%whgI(WDPYpXQJL$M0sk$Y|;}_%A>7 zD$#hGE7w27hu`-$=5KtSfBEPC7=Pg(d=Eu`lZ%rLZhz*x`H?TZ#B)!b@u2SU_+y?g zy?n;`;cI;5d%laOk7nHZ{%>P7xyjbfP40c$f9CnO0IdJlAJ;dNAG@_0VCtN5p0VAJ zc-z$tNenCrI8AHzk7pd8=aiM2;yI6r+J)2^D6*QxqM)u3$=&W|!sWdlQ4|r!J(04l zmT6neOIVah2gG+o&~g`0c`r9(pchz4wHx*$22sd%FX6&Qf{>WVxwt*z((WdsK}0_Z zgq_d?5v$U0cYnrwRZ@B{K*u;T^limPFC>(Svlh9A0fxPV%|VaLyF<2nj-BySo?zNkpWHcl+UN*-meU8ox`r&}EX*fTh zlNJWs#9SE+rd#%Uk3xr0+VEsN5P-w`nqK1M|C2ZrX;&x`LoWd3 zU^r~MB_g{hu)tst^U&2xB$0(WA4%6ahM z4rixF%uWx9T`LPaJ-pBP=@EBcdxg8V_bKv9ESE1|VZ5V&WIXDD zrk^EAPoxXy^I4mwSTzEO3gta)je_&#jJik(LrXO15%h-ZjTAW943@%l$y+}#-|*$< zo~Ev9jrc|jlBQ*pR9-x^@?4k`60)$IXDp|4vePN~`CNhte*9r19^QqKu)c6X%O0v5 zxjuE7YwA~t8eY*fwR+Kb6t+=dV!ff%v@9z(ls1nhfXdAX_@c(9Z4ph=Js(zCW>%la z0EnTzdIN<7fyyWl7Mm~;z51Dr>(J)Qx(tsV|du zapgTq0qjvv4ehX^1)9~s0FO%Zy7P2SZsPSN@%({2X3z_`urUyTCJ7rJnuKiG3_rie zYV|4y%RAhe&DcM;9G-lt9Y<+A`$E-eR{nCgTaJee4&pMnJ}$!u%&5PqAFJltr35Z z*X|y0_x>q6Tf2nOfWwm|MTtnWukMa`k=CB9WY z&&0<{7(PiN*FBR!i6yJ~l5DvoU#-ZO3;9{fYvnE2CakY^?okghl?p-F581tG7+%Pj zEh^5AJ;Tu!Pia6Hs|eZIr!gG$cY<6Q~(|*)$StqlK=F>#|a2gfLW{tdVi( zh_t}B>lEAoBXT(%=K>fRVf;r)EMpL3DXUuU(~BbklC8?)gehV|5JPlfn#j3&tUPxV zB(i238cFkX1}#J_UW!&V=LY#MOS3a@?R@EC0ZOg1BR~eS##_}77IiCmih@ADr=6Ttq}Q5k z8ipag$T2(F=fC~u|H`L7{S`4xzjyzTWm-x@uqbn0e)%zdeeTOV_4IS>KR6a<+{G(b zh?1eyH#+~dDh^OjIR!qIB@Q~Dqd=Dck*(&i(GL`5V1fRqz1+`ggrQ3KXphcUQ;1pW zb=4)J%06i=7qq(GO2VP+cWOO%t4vsno?R!8^k`s34Yl023tADR2TkFY^;^Sf%@Y3o zM9e+z#gV4Zk$qfQ=hh3~d+*K6n;8-R=l{U}>7VHSYzQ+-5@W;2q{_LNFQ_y@TNag5Vosk@5W6l)Kvt_2e(byDc>Po)NfS-*LU!FaVc8Xuny^m6F#EE%Rl;;$*_XKfywodCA!JT}+PIwQclo z=p_GBJhjcHoZP=h7A9QXu6g&xnoT`W_B371(fKKNZA)V-?8LI~UaF(9-mkS_zF!rr@AkBH z$G#ppnJpMrTUO6&73!tm;>(=*(S&^AFnRPHsfvP6eCz_7O?dz5C0(}xACvFat6T0r zdPK8ZvR_^E%A+$bPUqY^o3PIVc{s(mLZDZ$p3`MP*BMSvN`?XEv!yy-_<`IO^0=6k zE;8V@8@%rXoaDJpg;G%Pz-%%Vfc5C&i1q54kH7f}AN%Ns=$nq0lPpS#OsCG-qx%<} zpH+;*UK9WM`3cu|HJf&1*T#b4`O7;QLO;4Uml<_GZt45mWQH3sMf4q+OiDb102{@K z7X{nhmKRsIgxd|L+w)jVvgiDG$y`ZpIYp5cGhw91s=yDykPnu2vuC|+Sk8}_WK}e> ztui+4pa6ruZj=DGoEB_fzRTO6DtXscN~Rq>y#3B&ZdWb$U->ZK_w#=qU;7PTE4F2k z1%mDA`W<6El9w4-9^`SAF;cmlE-n1Jx|U4C_k);LxwD)uX1Jk+q0@rp==7ZR<9FnJ zwY&d-v!f%9j*h8vCm`nP_Kv&jmn=@tI3169c>j!N?<}}{`kdv-DcN+wY&KPD>3X#i zbFC~ZMbSHpz|I`cmQhklW4!$ArqdaD=5cc;vtp80)o$O(->fJz6&+#%xPeNs<UPS0 z*RZ;PGwC``111+~!flNqNMBhZns0;2y8vUvRc8C{3WqtN`F#k~Ax@ zr7B7$Ss4wQZQRGic{(u2tUS|V!r5f9q?#_VE))3dhn8_1HP^KDj(xM|M?U*`-g|M$ zFaEY~VDvpVn^yBiKlTx%AH}>ngcJn)!LKQOCI=JXgUpPBBJ|(|l3D#W`VE$b@qc6IR7M!Np7JKAZ%b?{Sp4Xt zG*@9I@wKz`4&J8EBPB}=O~V#T-}Sn_x~3BgdT90<7i^LonGnC?57)ZB>eso>NCX6B zdLIFlF!maY+T9*2qx4L`WV>$&y}Yyz;9ZmuC0|NN(mWN92Z>P}hhnj|ty|7Z!^s0n z@g)yIQkw*R7=cofj;3IUZjAm-VkW784v7U}qwFp-Sdu?g!NHh4f;2&3u?Z2}!X&Rp z6V!0Ytra_4YzY7hxkc;3OrRDiK`pU4;|+o(nZLV2QbR|S+UqY&WQ|!RAP!o;3dF+* z406VZi5Q%tP$FS0)H55Ihhs9jH%UrV$dAy|is>{`xeJ8*@ zcNK_j+;MsHf*=3nr+NR`E$-#5nl4#cNFMs*Uwk3CX-K||_y{_D>g{I)9TVDg2}Pj! zaLw8Dz4tJm&-wQ6{7(Mfzw1}=?celq{`{Z*6a2^z|0uumSN%#}d*gLUTm5Jg_}r(E z2bmNxj)|RU9Kq&MO6a`CsMC{Ut!uYU&CmbdZ{i33%8&9N|0lnN-}q%Y;`jWLU&5dI zvp>Ke{u6(Jciw+a7$cBxvuI25BcFRujXgi6Knpe8)BFn>pT}U7xclU8&*LBdA|7Og zGRmjWvpBuaw|~#iV{w#6kXGP_Pox1KWo^;F>HwH{#Ew09Tc%ErJ`b0qsxl8Z0(K(s zb4W0bfQ{quyyVN4p6Ao7>J#q@qCC$6k)@R82vT4Spx2I)e@~PYAN-=wdkeT#xPzDF zLXs**Rx6$qc$CI%2l&K@O`w`yE6rj0or!=NW6-@Ay}w9S1NOkim4Uk813O2 z@m6xoL$e{{|8KXa2)p_!Z69nOY?I7!Z#JW~hL>%PPlm0Jul8JCcf7Z%dFSOFop(S^ zW+SVpsH_s30?>AGp!Lqv)AMq@rP;$LKlPl4$1{d~!^!<)+OxUn!CI2pXf%v8{hbyG zvxSUZ#khLqVnOZ$o4Ym3spI^j!1_IwoWfN~8!@Xbgh3SbA>^!Xw_Lq!)b*Op3Kr9x zX;HGi8+ota%4g={tYlGnDx1-+0_&S=?$7Qs$@5r9M8Ci&aV)^JBYoX#Knht&-PSR6 z(c9!l<0z+<7E;^Yp3G$O;o9z31Rtdsl^JN-fmVfgGy)%oXm+^S+=3a{ddJIkD_P;$ za>g{bnxt==Xqp^$4Rt+ow}+wGX#%K%p$wS@$lKk(Zm_&q-BOyGr<;}+cRP05k?n59 z#ctr};#4f0>2$A{`1$;TtJ`ZSz8tco?Sh| zi6)$LaXjVpe8S@7L}sYF^&QR8G23mU7~;(LeB{*&HnV}(Up?V?S;=pO%Fs_O^Z8T@ zvB|7rx7#sjz*%8K;%)!yT!dGzteR4Es zG0VxA^2Wn6PM0}hTHw2V+ILTJF=4rw^8D(ty1VtR*P`Rz`6*@Hv+D-2V4J%Z-o9kJ zX#~bRf4;pxkO$*oLXU%B7&p+{$& z&L;wSuCK2stBEG-X*pBpv&;%wQ*-a)lq#dzRyX9Xf$mBM_FdPji|BC?1R5VH-usK6{S-s*c=+f;OczIzJ-xhq zCX@Rr%gGs;IHwf4dna$Oy*T6UcE!Di59mzbYPEtqlkZqLjMR76+Q*{vtgl{hwOBH% z3XZFsSMJ^C{deD|-_>HK6j{!4KI7(g#gO;R<})oQ)Fsafrt?#V%`KNN9y8_>M!Tf% zCt7g&G0OKYudgZR3yN~Vh@+Q(N}yJm@-58s ziM-ZE0aA?`9ZkI#fc0{-<%d80c_qBQa&{zuzUf;+3EJTC+TB>2?KujXTgNZ!bDvR2Qj<&|X!ZAahiu*OSr zznE5Rw|mxiYsMkYJrI-T?wucN9Jt+XCA$;rrzo&u9U+j)cP-7XCScTfE1YA*(>8l( z8qiwA9b)w{Hklxf-_dQRH!$UNF^N4ha%egd=OC_!(UPK>W{9QCq!p6hxrWICrq zA5y`p>o+k06R?$AYyxC#N`ouQoG>DQBr_q60nqy-UrJz9nK`lcWkZ1nn`n5t_cFb{ zRl;8cM|~I~zyyTRMvw;|_kHLXLZ-ylLV(wZ4~N7-P^#PzJy1vRwh-$$#|q>sWz023 z|1;3MG`DdM9Cqf2RLRv>MZ!{fZb6+&##_{6%5l5=n&acl%Y zL~pEJ(`kHPRuSL}kfd5Zu`UGwrXyXT)&piI8xkzc3dBJ2hr>t_x=0Y%3v#EfO zAj1)nQZ;;XlL= z{H4Fl_y7E#!`FP{*GPicH@(Kp5PB&f!f4dQ3|$jJzbK)Xw_4}|-DoL%^s~Hw->`e{ zJ^FUw=YIcp@hASwU->eK^*i`AzwVcQ*;nh=^47<`mf!w+{t%!2{5y$}UPM48jR!+A z`xX=3T0&|x^<$^C$I#Zgu8OjX)*#cV&g;+&YUD+RU5L*OKmt|coR=h`X)Kmucp9fu zI`knukQDNQz@Z3829ugRQEqrhy42=}6si&TUlMyAOY*)V8O&pn1&BbfWGtW9N|^(a zG%!8S55rdk0(nE)$0R|;#cP)YYT-$H7aszABVbKBW?d$c{d5SjNf=OMh9&STl2_yT zvT-4lytU$W7KT9pyY}54x;7|cC5!itfNPn#Z0Hy@y^*0OdxosYgEh`Af<-Mvlvz&E<2fo3dC` z0z;ai#Q~GtO2)_7VKbOiGcq4Aea-1&%K2=L$4_3vqiDbSGkN)GkI}!W6#Uo zNKZ~-3zqYY+kV6sCCf8QJ**UQUb&ursOjsP(!%SnJfyGptZ!}^-nh^4#km$8Lt7|0 zXz|)TdQ%B}*>$^^WEZ@S+YAQN!(vu3&7F)a3py4P$I+zZbXIbCvte_2#hc&oQ9kjZ z8GhW8%fF{(TA_qTmstTQMO9IiP958e^P?!k+HQID@IsSq+ibO1IXzzJTp!OXnYEj{ zUX$6;;)r#zqpc;$6L?kSmc_|}*Pr^txCyay`6G>d!;nG)ed!x9@-q=L)&=f(~QO9h~;w6rnzCe z9cab$kqk$R?b~c8gX!DbE0)VSRaGh>@8Rh&#nj^Rk;QDncD-f2?xDz($d`FZJhgx_ znUi-zQD#w>KX&vgc57zyoY!8v;Ob^ew|>t1pZQ@vwOMm>w^I6IH9KK>bj0I(7b+OO z@Wn5(Sv7q4BOmAV;t^dyEWLX&q<_GJ<2gI@J4<>)5%n3-+7i}E5)qqeC3mj z<#NI5($o14S7u-{EreWjd!}xBI%@LCJSK>#TYE4eP4JUr=wZ9vVt1bDNsgN?VkbUi zVorpvm0V%$avWl89au?0oO%HX>iT-EfXrc0g*wq|)Y2w@K(RVoF+I#OYLD4Y*^D4QfjBo|ea%#~eQ2r8v3i)O<(feWOk>KKKq#r;Z# zJB)V3!T|`eq~jiwug?(JtwzG*98a$O%<~a*yrVd6xOlx{-&R~cF?9PDwfUcx)`6Y$Jb19+TV8WavW~mUH9z!t&5ytRgwI?S zoSnSE_q_QgA9`?4vXhrLTYl^IN3oV-;pq>lh8!4m z7!Go(bY>3UAFhY=2)e-1HDu&VCC{Rfz_#mo@A8^Yed#GrpWX1*tM~cH8;`hIH}V-W zSO_u^7kG8KLi2Evbt=*BYQ3lFqEUEYjD=fBMNdG_jpvC2@EZaGhb0^-6PRHQ-l3w< zT7gf=(=8S(2Y)*y&=o8f71JWq-%QJl9VaPnG*Tx5#=uv|k)vNvU~@CFTW4gm zfyq&Tt%Z<9mT@pC^)uO1FiM{1#57L#g_w*EFGKMl|I$1r5UbG{qNkRAhcRLX>Abp} zkiaM_8N8<-M#&4EL!V*mM}bR-xz$kxM>b|cdd3vCG5E+51IwfeVyD?KX#e}M7eF#P z1o-LNVu)bHFoM<)1KWC}$1~uV2Qk&;z2&=6DWN#T#Ln`9Kmr{MpnV_Zf95i;F(!Ap z?ssd@oE9h(;5}!I_=d0lTAn{&@!=1@#q(#+)Nt$Cfp7fQZ{w|xz7+uktItWk zb|>>WI%^4A7rVJ>V(3%IXu6#eRF9XZy!P;dPrUVj()9eU-}XEB;UD}Ve%{adUVh%s z{W4JIGvvyePvV1$7+b`Z`Wco`VNtlBs*r4?su&UbHmG02pye#>jzDYy_%tSmT*6 zfYtFIyyA>}loJq~X+I*%Jb_*jdlxqrTsn_|!)v4Gnqji;6eQj`d~-AJC5 zVm(!PhM(-YIGcR=amKTkH(afE0#JHSqPylYAlGDA7|Ff9@gw(m{PL1_R~;n=?;-_w zk{gc7inG%hr7b15$_qx?eMl^wzPvS+m}@8fb^EWmZkdqt;)(WV?>&{nJ`@ z^sIWARyhyP=2X+@msFOP-NvxlbQ(yH784#^ob$=gzsKeEntgr3L$CIC4KPHhW0#t@=^tkF&)dvgp<=Fw(Xwnwx;hR zWj)K~w2f+b%E!bJ2GQ}Pc=L2`wd&X|V>guVavx6V0$|>)>{nz>Q zm%*;bPw$u>FM0KiH`#ymkqN`Ao)p@jg2bmqeO+|@pCX~ z&~yHqH!Wg&(le9%>%Zv<5!g9+O2qd#$f*Qd9M-2CBv*&n9YZofb%%F@gQvv7@gbN) zsv(E>O~9JI3Xm{qUknH&^k0z#Hx8cNYDk_gC0Q{rx}L1)Sw0+j)gNJ5@bYn>*)@8d zxL+KkVUebPFlIkU3DqH140!?uh@1Ionc8Rt$jSe#8@X7__~@$xuN~j<_?hSB?ud4@ znCTmQ>o*_s(br$$wTmN-$dT_xve)J7S5DTdvyd+v; z9S$RX<0V6D_8l*8XBuDD+nVjZp&LAXHweIUS-NKqw}R1E!a<%I3xxzE88_-Y7A|_h zI0vRr-XjUX!XgGxaN&?>X9$OMzS3E-=f-iS-`(ErXrhrz0*^v`j2@pnut;M|ya$}d zl6Je}Y8=^bwrWyfNd9Zld+hcmP|kA7a>}IIGe53bZ*uxh&7~v_LkDjn=7iPzM*l$o zOO$34I?`vQ{c=^##ZkrAyf)|2*+lH_w~LHM;8G9HX%2k3y5*xEo$>LnoyU29$)hIo8Iz+qUV#KXr1N7^A;&l*uhXx@-VJe6>hH#|y$dX7o?-!} z7XYPjh+JSwN=B2XRP=wc$iQEKW!tMrk7Kg8G5s{L!_bP&c)BQf<^CD-S%LS_=kCenm3%&%AN^6j^z?mwzB=wKXx%?8N-`^e zF^#2aE~J2#o?&eGny>!^KmX@`FW>m_kJ7KN`7QtPf6QP0OFzud{{=sfU-Zj<5oIx< z-tTqnnM(mHU1C0mQOAibpx1nz(&{=)-!S%uz6b)#@Lv9*_aB_|{yR^2`L| zZ(-}1788t*EQiUgATIzn;B8E`$P5g`&T0`HmCfamWV6`a?R}8(cm1U&bT=(FE652P z<%X#<9OZC+JSV@ukcso6nsPiZnP#4oSxGi@?6*4>nPqyiq^&#sjyh2Ikq0M76pJ~x z+nVa$jOoO2y=|y+&r#7(TEk*FSGpj5VB$N07Jct=t|W{>o?4}I^v1JiV9YZm*||Q* z*#7k7l(XX#T$Z!n*GeWTf?=nmpInpdyO%ZZU2a)zJe$t)`019_&6@mUo;NP0%u2)2 z*)jdDBPUK4)zWg;ddj<(EGLmf~N$#cuVAD2~6UUev z+@v7SE84tc)pe5ZGORm6j%PO;nbaPgAMw$}lrKDg&hx7~US8ej zXtAKo0wZPYU}Y5EnncTtwt&qnI7 zXEv)?98Cr2X4!^mRmhkzCvY;KupK(e40ZVT?N(j7Vbr8Alk(lZRabI3E!j7%SYKHN zlZm1Cj>%*$pl!cv*zY)ytuidbC%iV4c-2lHy+(rq;$P+Wz@gl?>ReK zaJoFgvzG+PIH#`l7zPzu&PCsfX?e`q>_{G3{k&vSSOJ3%A70?CRkGM{w_`qWN+hhC zEt5%3Q3kQy{IH|24Oz&!dj38yPEN3)hN0#3P%vp8Q zUtGPU4|~evV|CZMu~UIu&W;I9E0(6~w@QK<#MrRplNr7ZVgY3?vP}B45XocqK0_GA z@;EwLQVylM`6IAht<_zh*pMU_1&zt5{a%slURmu#pA6f>!B5IZ`JJv+BCsIIVy~|R z&wuN7SQP$Dwu7iJffuqys?lLMKhG(aSA6by!)Lxw(U&FnAKv4mZyYHM zb z0^z`b8i$aIgm{iuZO3PyKIbRC_?YJ}Z+Yv{1HS$1KEiaG@#1>RcHgtwZWN8LzD}=V zN(E`XYvkW(<;er!4{S8A5R6o2xX3QjIdBPlOl%~^kr?n9WZdmKuhcAqi2!B#GZFwM zkiq){XgZ9eKC@|+F%whH3y3+J7u-Ld=@_28xaMxPqw9x*j4Bp5=~|6|@IgKp<%AoC<$y98`>wJW}myY?Y;^boB=&Yfx9b=o*jxf40es*IjW+HP{uWv!`Eh!Pn zn+}grQ5dg@s`4ymtpFUT0S}4&5b^?wf}35-7oNZ5&5syf{jgzicSMmLLx85~WCp)U zjSdkz_cgsUVwB}oNp-xCbkT43Nv1hOGvhItgc)}L8WW8!U2cYU7uc=f=%Hh>7-?4x z+nYOF;mKp1zUCuI&od{hgFf^aMtu&AEWIlENf}*OBTcJ&L(InL5fs4}Zw4%>@V7QG zJv}`UxJi-sx~?WgWK0f3S$8R*Gs>D=FbN1A$Sf2;?Xv|C(zuNklU@E-VpR3Ct)Zx- zLQvs4ddLjSikM34lAJ4gpjkD7tcfg8Gxh>p>b8;eYRnv?@6^Do@`;`wLK7K?7=|&j z_o}iYGZE0Vc^;3{STz7cN;@;bCgw;MWso)*;}3|{*AJu2`y*i6DPX|ZQlQj!yOXJT zQIupCXJl1L2=drVO@lbT4t2x2-Ewnz#nWd``0SUSNNKRz?$pG1|H)H;1N-x5x_$RI ze4M}SSNwclJ)5(>dd3g^`9IGWKlep`#jpOA{E}b!i*?@aZdQz4tLwq%HZ?5k)tFZ~W!_&foV(`8~h) z_wo3>_xbg|{#WwxZ}?gP_@Dpm7x-g;>d*4*jMJQn%%{Z0)!##8 zSsVKmbAKGaL9A{iiGiK9?I#AxX%u6deZ`T{qna6Pyd#G;*nrT z{PLRX)sFjTr@ZlS&i%83*FHYIytUttR?OWpI_@#mxM!R_rexr39V1t%wS(RRDGW-={c z9BKO<(^)Csvu+IBtsAk-w)+MQT8K1F%j)iq!eyMDp2^=Lf`-ugQIgPch`{Y^V&w&M zbhP03WWmYlf^KN!^|f!tsD-!SlM#1OOqi4vjIBJzn!49{nNA9&N%?-n+L%%_2AIyL zl1dIhHx5Zdul5`_cUvA`-tz4FPUj?e$G&daH9fAVbU(HIAfRnlR$^vtc6-i_mfSx% zWxHObh~~JcUY;&=oa^mYi&rC)*hU@9YEqDwg^n$^Ub4=jiZZb2(J|9WMc3|FZ?>4R zWj=M3MG)Ay+3s0ww=#*}uWoq$_+9QUU+P#MK6;f`9zNpk_L9rz?`uq$PmlFEw9Sr( zj~?*K8y`~8L9?$hS&w(lyLpX~Vj+b!=s z&AF>B`w@kOEGPM40l#ZoR{K__>AJV9Q)oo4DFdpsl+c@98eGEt9!l~@{?3iG0j z9zdDW^~!jUj~(OK9=ga{!xtGp_Qm)4vCqB7_k6?0_?p-6Cm$3r=`$mJ_OXaJ@$2C; z;9$4L!MOd9+6c)|yBS6S`@Q7gaND$e=Kbe<>fI;2czMf*AKl}-zTqPr&n9$D&%PbG zUhf6;cij;E*@iI!iZOCs#`1OB3zUfIf?{eN(h&&<^Z$cYItLk3dK_4P92jMOM9qe- zmu&06wo8THAyv`DOF=TP(`6~<(u0!;4~}O%IGJ*OG*voj-HifudflrjEZ_jtCSW8= zWe;-U6gSG?hl7+(|Jf)f>H1Nh!DI&2v{ixB?j6l`#Or+$fbBz+CZ{pM=)FDh!#{Yw z=_}4*Cpj1QGhTlbFmBHmpRIZNyw*BJS6f+8E|)A$j+xHqEKV%b;~kT^<>L4rXGf>H z=7!O0j2+u9j!|8!aY=<@?kK7vNwG%K0qPMlm*mH!A`=c?_mQn8;J%m{<`))I4fx#z zv(B(GA@8G4VAs*?_G&iyzSr2^Y&X=~t^5WVVxy|tZ3%4yU8m;N(6$Qe$ig5HCIaG} z&Rb?62dwrv9f!3z4~2{0XFyIMHzP)$fe}l}64JOgXuNSFdR~@UJy(8OxfP2KZ#93o zG*$w7|Gw*#m^*Zhf`_6f-9X#*37GZN%?|vK*pg1yLEW}=eMcBOvBbqrNdT41=JiGZ zj@%VgE~CsWxf5U@wu(jR*wLsz7y&4jcrRqh^G+UAdTW7Dk{agnFG_(2&IwSQxSZv5 z&SE-YT9%ZB(;7=GEgxr^O#2>q@!}bu{OqUs;(O1z+cW^tr?beJPAeI(FXnSGxt#Ob zmuXe0L3z5Ia{{8&opZDGJd;5LA`~Srs|D%6~U+_zR zDZk>^|0<;^uWoK)GIAKODIh~EP~T$`n`Qnmp=qM+Z{8=w9 zPB=YYa%vjxR1~yyfk8pK6``#)sbEFJ^DH%GB)g0A zFbbq_X-_R0v5DC|4@dXs-tz5)JL( zd6?iI#^4VjB*Z-heDby{^jbbi3L_9^rECb6g9*Dfd-%Hud<9ueq(+ovk+O!c^1F*H z`(&$sNJaL910Xf}!`dqaL}X$Jqt8g^BJ~0k_Vd+BA^c$bVEbUZ+QH{v47|8&Sv8*i z<%+>OCMHwS?bOxU=_Z_HV1vUBIqOx&?Yfo3D@4hTJPvF^lpp0iK)mPVUiKTsKwd6;}Sc1UT$k%tfG%n@$j4>uejUp=!_`gk|TjYV| z(H!GE``Zl|$I<+VP3Z|)C7S!bALuc(CKnK5tW$CI?)&d?+$?d<2`GE}#SLctJi z*0*=?#1&tBfq4?*dL)^}our96412u_cW6i#rr-the94&#iX_@7+X^vxAV zM-%SfbNW1Fo=eYW+pECuMkB_=ZntOGcJv`*x7l)Wwh#m1`Qw-DcP*}*v0ANZ+P$Qb zc~R)I+0}#M`}2G%KZ|DHa{26uW-j56leO_~&ul;Cw_UwITE@N6+?wU0(Ufi*q2nfHM)1Q}o3EQs9~7xEVH@>UsrG-n;#k=1U+ zIC`<;z_7ZxrXTi9&R=1kKp8*A$C!MtyrS}3#N=Xk z-ybAo`d$3tknRQOm@=2Tk{pu65;cEJX7t0MXg};l@=JjO~6;xch8i}*0}SIE&(u>U_bLMpH zgZE+*SvShx#cw@r*D)z3R7D;WP$SDEEwCe_Did2LEo3Fl=u_&~0E8rcBg*fZjxRiY z!O>#M*S+zGBX#?mC_l7TptiLhmr}S=hgpv?j1ddL18_)WJX|OT)|P zy$-%D7KY@N5QTLe{8ae|LseQOIk6JNU@eKf8Q10+(=L2fe&NKUDpKFJ5+cvf&c ziT8UqdVv52!@llxeGPrDbD*Np36P9ZEJ&IunE_ae6~J=WU%hd z7>nuiQyx7ymrcM?)#GP@e0qtg3rzibd@X0Afq5!0bzgS_{b~&sre~*2PL}$+c2^U| z#4s}G+#>l|Dz^1=Ebd55zRk5|zb=?O2o#kU%PbF;QGb#E{-LLLPHQc~NY04EGK7w{ z-ADG4q{dksOFZ(X@)@+wFp^VNGcpT<8K}KVYNg1QvxVlZUaw)bHtJxt9nqL!#e4$K_K#|~#=0NX9vB;e3^)qCUXVEus z3`}(1vxvWso>>GZWjJ4&oJ_uvMpgw@X6X)aGLA1?pwM|T0&51ZHMN+#=gdGn3e_{`_u{_^8JzWcksoqy!N_jmGJe#`IU zFaOn_2sysz=7m>nr}pfDNZ7-UO;5(KSSor8}77FH7X-i&2^;a5mByq$YnMhnB(%i z9Ch5O-{lTK7fFuEL3S9#>P)*InY_tsY#icvC4f}mn?10KwYErXswlY(j1lzGJbz&B zYCcSBC#N;iq4_9Km=CrOwhy+i%J%-tHMhI17&XCrn!RIl^OOfCb1s%k-ne%v`Psf} zM8P#dlxxWfIz^ht#a6DlJCBoXKj^i}YQkbRry}~q^uCuddqK^d9VZpsJ6>=yostbE zF}BeAAkYW~4TilEb4)D?2H zDYhyyCY9yU!xN^z@KBT1KBK$uA)PB6X{# zvy6S~nHMFC<2l0ejbna1rS1lGmW<2jeJ$UCXXj0OX@Kn1Q2Z#rdOioRSB=;f7iT9d=2Im$R>pDfc*gzn38zKH{*{M#Q^fPwcIvkhu8w7%SP1IRrf^{{|@=au=&F8eu$m1u^ zd2+X5v=eOanau|BiRJFLzO^b4M|qVaE$h+fn84=;1v$uBcbn4Eq{W^;nz9*Nl2CY3zD5Xfnst(-wnFX z#%^G2duV%wA%wOApB7*IY`34uEBM2rjl*_eL+NWEezh@L`>-fIIK3x7D?i30t>hMb zSg1u~ZIfcd4F^dY@q27IbU>paHV5{M7MKZKK!23T2ONBzj3Kd>;=|g=pt{?)eDT>8pZ?M_p1-)^qp#lQJHPhB@;;P* zWs>XU#we7dJDq6^UG+7%=(95RscW5L&}~T96*fX!srX24xVnZ8j4NWXRptfOB|nrg z#4)HJ7)O&#q@j;&sYB}3q0=8?2fc8)ycny(F$@V@tD+B3W+GE3H=d(u!D3#q*_Hya ztoH}7_Fx#C%#*dh2bPpz1c7V4@08RyTASo8D0TMs(y}4Q=8-dN-T7fdd&4L>D4F* zE(pZ3IB=Ojp{D6!9Mr_b=8|?zik!?u5YDS^&hc3tcZm?kL|2fx__*!A>vOur6AWH=SZvfppW$}*;M0t=U^(dH$2 z1z)$4#W{g8TDJ(`apOpEmQWTNL;5ZPa;_{1)Kmh+JUu_{E0xQ~bxZ(-NoLnd<{b^a zl6=K5lh4*Dpl1{l)Qtnxm}?E)C!eZuP*{(c*a`&jBS%MPeEj23#dz#t|~LN~GTUKS%L&jlC>*l71HRaJ@U z>V2;U=%f4R{Nxwjy4Nx;877`7+Rs0fmg z#_H6F(>;pI4&H>~V2y{lH5#IOqJet+1vY^_0lkKN=fK2}6-!z}*tGr_={44SrAlTl zfyy}2@JQyO1lXss23_wEAv&*pH>41bAXe~U-DiX0z$!z)dP)Z-zE1@0G#AJH%|HPC z5Pj>ij9#hqEtwU-uD{KUm$xp?CRU({>_5F(eC>mmV)D=O#;AdwKBBJ{fc3%l!S=y6 zXdwe*--{AlkYW2C+qax83htjR>AQ-3TSt@4(XnYQcP&&|0r`N#FfDV6EKc6L?H)4> zlrE#pJ+Ge3<(*R)Ctr%A%rGxU9$id$aDK|z4s4sl?^=Zj1c-?!Vfij}v+EpF(wIGW8)xa~%o-N;=xaQ9-R!S3?5WmlL^LE<}*Q-4@1GE^jhXA}lL%&DNrzQKk=S$CCaCy6jr|!+3xNrT)}|nW?eIzMSqL)duQ@KdUm;DQg%%8R%tZXH@7SoX98N* z+eThU{m{#}b22IAnX%vPUQOkB_Tc^*7pD^)e`c~6ATX8`HfLT=xOZ}*#lWLi&zY4O+s#HDOXQ#7 zaiHS&jx&x_5Plj8-C?wxS9m{4>huU(w0V0`-WhGu=sdcPB!@wJD?I;J9% zCxsFY_q#n+0bldhYkc@aAL897PqB93=x8S3bhFws_9fPqgt#~t75sL+Vc)f4VECufqNUcGou?+P&hjwf?2FJE9x&)IB7x8JciKBXRdjO`UI|Mc>ix~tRCQ;31* zR22Dc&xm2@M7c|>D$yS!f$C&jsVQ9#P z9evZ$)=dPgnqDAQ=sF02pYfKM6(&Wdhv*RgH;jCR|C;xV3nmwfYLdCHF$Y6fB7Sv{ zDMhpM6qBC*UB3_hz@$ogv_tY?{JW8GuwCLSjpx%(gagw{=Q}EWjEec)b(CLac1q^< zWM>8-1XL(M0gfC-%@mk{37_^e6wa3@5PrQ|~_K({DfJ>UzU#56=0P zul)!|(@NkLO7)D3^D#=r6tO?a9c#it?nWw<n>p6D2?buOfhT zU_eIh*?}3A0N;ZZjR32C@Cy9c_aPOKQC=g@Bj@P)LGoK?3qm)=b4#xOpozuD7u z8AI1Y@>|nA1QB4ui9zOrVYWOXD<+z2#oEjrSYm;vBGX4XWMp9-B**=(XLU7_KP+*r zCu>`=3|)>`ufb*l3Nx{FU7`XS0Vy-*()}F21~F|+1j&SmW@IH8qAyNW+7#+g#)efG z)kt#IQjyboOA#y!r5ozHkK>^;WWiv&kzk_l&tSY7O7lrUrj)y$ebck9Yh1p=ESCzt zDddkhDrm+StL9Z6de*la`7WNEoG92K_Xgv7LNky}a^3g4u7%8yIT#0{W`P^g*kMMe zaF)`Q+JDk`J@nB?zA`b1HW-H;gBmqX67Z3xb7F}E3)?y-gq|NS8O6*rxLnp48drp! z#`!|uw_`7>gv{hAl%r2$2iPnZ0~-T{HTr%S2AyZIO0z<#%2`&zIET|yMg^QyRFj3S zM?%nAhM~daB_YejILb^%-mKYgRxFKSdw0bT{gof&M}OqU_|;$by!!U<{0`pw`0Mmt zEvA-rR_nZ&+$vBlfh&pqBEZ56c#Bjk@QGPxvzWR#s{+Ay0&%;#!3;jm5s|5-wcPp1 z319f)yR_Y&pZ5#DkH7El`}OiU{4;;?hxzTlqneu*Q#&R3pNLbw7<_39E@9HnZmP15-DSrCw}NBX(($ z%LnxLdS#7+M*G+`14R}AS;-AOpD7ISs9gzIHd<5UdG5t*hzvPz{&z0uTk;tktCN&xGU~&SH zO`T`xGb1tnB)uHRcyE%V-((ybf5f>Br_VDn$dhlQuGbG3SYNH}gYAP&V9CRIK{xjD zBU+S>VectzPd@G_LoTrC{_z4^PTA}{pL_R8owVcmf;MjmL#NlN94rj(m9h;$HHwLb@jR3qV%UIZ!*Y6$k=J^6! zRrp~+)9i86Qa(F3n;rGzl_=1!T;wz% zHPgysvKfS)s#tdRm}BDL)x?3HneT0?$>tPso+>1Em$t+l(}Kp zZwcd`+nW^+9^Mz#{n4Wbl$j^Adzx{enmAluv6vbruU|0B9bM=Za)^|GyXn|KuD?)CyK$E<1GGRVl z(6=4yO^bCEbq|*}TkXTRoO18M33md!2CRH}a_X)XlkH@B!mL`*)Pc?BMg>7L7;J8o z#>n6$;oNSvymX$X8JSNO?AAT|t>^yflrg9qEg!0vPdt;X6ri+S-Ew_%!+LeiqgP*- zKi9NaDVgc+<{45P7bUefVzE8$0(W<}ES6LJ`I2^DbN}@vC)I*4eettgoGm30e(~fv zN8`ZB$%LXE<#S`RLPdXJ2Tb1!G}`Z1jQyU>!LF|9w_7n6&o1uMhJu|7Yi=w)Rkqg=^=#!=(hST~aK zCAjBrh?ONkDFR~$X&pp4)WI$_L<4YaVy`#{J{$lvm%xGW6>oJgi2n+3%KONyRgt9M zaWIiTJUIa;dVPUi$*albV34oU<|^njv3VhIG&{Xxel+3r*QSik8AIK2ce_1!P8|w- zrv+m&PxUHr#$kx>1su%Z@fH3Uo3^#a+etCDUoT2ybF z4ol!@>g1jD>iMxkFeYV&4_>}<>wV33KVX2a7%|4Fu)Er9#0-6Ke8Q}2CFLP`kjb~p zbc50dtEv#=*;xciDX}arlLgKXy`#xGea+k;K+P*9Eiz9B$=_lT zlKwkfLNcRu1uyqIKKbr*e*AM!xO{oTs}Jt;4Ih6~K=ZEYb*wfeOLaq_PrfKsnX{Nr z1^8|ET>{T7E=2D|FG_*k0OMDrUTLjyG@o-cuQW!sol_HSXuBu_7walS zFbonPn>yR6yFYq|A9d^+!`iN5s4Uw?9#4{e1#ejGdakxT*PB)#MNDxEdH@ICw!`m; zfLNjp91QXU91tgkJ_V#4I8pU zT#`pA?G9byJ`W;dlVA0F8y+s%LC+s;rbpXI?~>elUp* zG#dF|WhQ!>1#&Tyre&tjG$xcq=`J3uK%*2wAW$+S7KGO^%AO&bzUwn6t3q<9!Z?9u zMvM|C@FUBe*x{MYiK44cAQ9eD3CQsfdNn{iC1i!}!=rhDi-~Zu9T?0AKAK~<0_b9* z+vU}jK#S#kP7z4spQjxMvLdoio33HIY1J$)bE}|~t{)jqj&Vnnd8xUha6yLiBfue@ z(yNKm)_aDokZ)>+1q9G4!8p%sWEw`mPGgKKa{=9(yDiQ+-Pi5tBOqNAj6)}2)zh&P zz>#U~W|OZEt{`a4*+&plvTQ3rK|pTr$TY9TlwZTB^lB_vGRD?0SVxr`rU9}c;H{yW zFF3n*!e>AAll;j){%3gOtvA1%Hu#Hq>mzTm+1_${bt_*nXS3+F2l^bnkG`vf9*aNt z4~_zzy0=~DaB04EUBFTcr0B;M*II?*Wch@wGJIlo%ye zwfwz*?=R=$AAf^C`RD#BzxNOPVWlAd#=reHvOGU$UO1d7S+{{r)8WL(@hm2j=n0lj zWMzU;6F~cp&D4-DviuMZQRKxz`Y&+qr+i)mi*iVh>aQx4ynj$ z*h3F`UwKA~ffv%>Sc}fpFhWL>Ui+ZG!}tV3kr>_{X9WZv8e96Bo|k0?o5|!|z_!(~ zL?^40kKfw*rNfoJJ;O=Oj6 z43%m90o*dgebYW6FzYZkADFNj&*PkuZX*utZ-LW4?Q@xFyo_NeQ8JjhUhfk@==544 zHGqbY&XdP8kQw*Y0VKG;6k?#~Op_F*NDkJ&6^G0U*yoLqF{oOXT1?0Cv7pYY=5 zj?3-9i>oWPdzc{TaLSNGd#QdpdB_j^sc@5V4ddqgVW;8=gB9l%Y zy57r}J)cY%$mAC=pPq7dagX`&oTt}!TwUGC6x(E(3i8nu0`pf_8?Z)QsA5t=HRVcR z$&NlPP#SNl@oK%jB>5PlTL?+Jr?hY4=I!&e_FPX}~(X+E9@2+Zg?Z~s+mcF;q z!z;7c(FpJxdZWa}axxLf*6tgnM!GVWQNB840lIeN`Rx^5Q!`t@>G2GoWzpEsPPkq* zy!-TqFTVXuiGO#iox0s^zZXDdontn2oE^=$e6f`o_jX&0-s{Jf*>pxxl{k}QOin)r z6+7=fdCr4-3r>~`UOaz6H$-X8)%7)t#R;4J$auSc_ur+eO72}8GhNKtZa3UruT-!JtV`Y2rXN&r z9UUDpc8!3d{ccNMRx;Y0&1F!mbf>DY)QYS|-M>69D2kv(RL+j$<&2Z54=tr}s{{IK2lpq`1(*-fScKygK%i;oj=+sGm z_lxh!(EWH>va4Hl^LBSPN|EZF#pM&;efNoi5KhmI2*Zw9Ze`s6${WX8Fuwcl+X4mG z+bfU!R~7wUBjWH}b1;TiVQ?^u zRTuVP@O)su1jE6sTCX=A0D_e4?J+*GSh~7r{nAH6+brO+Te9PUW1f6Ep^DZx5-16Fk3%>R1-{NRGWxsFf zb4#5Jv*VcR9DI^n1~x0mUzWIhN>;VZPGNJEv)i=wq92!uAXZWZ$HFY=q4CBi24}P1v%0>Co};PYyj!p7hbAP+G9J*c-xzP169=vJ}n^=(BjV7lalxq2x4D&Zc0U*a1HoBcivoUq zD?d4xGQFCvS97q)pxJNO_>oCD5ug@CITsD~ z$1eKyk!yY)srbzWAV!C%ubK_vA_OFe)sSG!<3UL-}>#}NIA)A$LMjJn;es8ku7Qm z&5iO$%kv0i4RvH;**rq~qdc;7KkAxr9U&0qi~??)?y0`b1g3z)mQ|Fk8q3UBmPbow z(~>WJ=^Z}%lb_|gzV{pWd;ZQ}!RhHS|F{3=@8tLXzCR>s>M!~wKact1n8l<5TWQ@r zFv$PcxhgV}Y(^f-JeSSquG0of|m|{!=rxPpDVl>tzU%Yg`+bl^XO=1;WOUxFC zf8!#HDgjO@%px_f0`ax7Jo-3g;lNmpV_!(%OdyWUpodM#of>nA<2s4HZ4;YS;As}w z#abF@+)8P|o+R%Bo4hF@0dhdlHExy0iRraJ>9qugMi!YncyPvH*Czx29)CzL%rrlG z`RzpyPnp6ym(p$HJLXC1=aan92h!M)#+AhC7IQ7h`Mq8%j>#c1`*iFf?o7Of6#PLP z&x|=F=BBh$y?30aZDiDWB14|9nuPF!?St)u?cOZ#{hv5jm&MwFGS^~PRN&asw{LqbdX(_9TG0$}ySft-;NJ2c zuB^D*Lf^yl%jb$l-?bxy$*AT>yu8}-;(Eo1rx`k`>6BL=UGVbRiWg5;T;Hu&ZBLnx zMp5+>EZfbVBA>FWZ?$0DZQ>&B)kpXB+KrFWk>{6}fMdOGMXSzor{X;qI5lu}y<>S) z;X)9brG5XIn08$k*zRk|0nhK9(>5Kqm$y86Fyrj_gv*!Dxw^XKjW=FbN9yMGMiI-- zI_{mFK+@FL^^T*(jN_vv>$_VlK}@nouRPF1etLc^`J!_{H2JP=lk~=`ICIHQt!o>l zOD<<6O|zwKdmYEF?+Ys$p7I6lUPob-0r`^?uE6 zeIuj)C(qu+4=vNFqsT_~tC!qeT{2`7ZmTKBC&!}F_r}w9L4fUcb;HRl<7jFHY+B#5 z-tDA^)><&Pp9lJjwg&5ElqGRo;~ect-; zjIq1m-S@5pVB}eG=$1ywF)KJdnsK_EF`pIWWsLLg$6kQQFvQ~-fX;iKuXa4Wx>G~pqsyfV z(A#aTxu@=Xb#9L)6&FW=(&o76=^;t$ki2d_{q8d{iofq0&nT_aK0@@>Fd-vk2}l(1 zW8(rj6$mbNeGe&rZnOeuLO^rLkeD=A^^U*#h4=U?KmH}2J-_9x2N!(zH-Ah_wSChG zwAgosaa*fMNxtl<2oP&eAV*xdTSkDC$e7{dHH_DLCf^x>6o)u-EC~M`^=;EMVqVMa z-q{G6^uq!4NyUaClK)EtYOR_Pcea!H^lI1XI^Whk>s=$Cq^9lJ@3*wI zfE4W;0f=l#Nq7z^3>K_V*8@HAK(-|MsAwOR1}0Xbq&XUYZ(aoQNyY56r#$MJo@CT_ zd1U=0AE}699SDmFq!K`v?iHfs#*LDY8k;elO{f+YlXZlY0=T)o)$y$6b6pGdZcn@4 z5<*L{%s77FdG*7vTf;khFQ#DvkyUiYl)6#ZOWpKZ^H>$th5QzM-X`Y907}Ij`LEmh zZBMry@k5mS+b-UldXMB+M`ELlK|r`XEn!G0f|=Wip?w&fF?Q~q=4Nw4UvC9C2w)C@ z%thv$7uX`ntmY9I^)n`mzz0cgZVHXhM%P{d`A9`MoTQk>$xp0rS^;r-e&(41_fMDH zUe0;?-g7=PoA7-<=R5ht$3Mi^eC#!T@P|M1Ws~_o%x1M>vRF#a>++IEufE2sZ@q~r zO1uDjiy_BjqG9?d$Q^4Uh?8b$#&AfqJFtqz1kUD}#zQgm;^$-WAVA2OG`9=PPO|VQ zr9OC4L0oG>l`4s z15-Nz!g?(e9F`Fi)BX;90EpKWp+C$|j*(0Q0CA2ND=Y{^hoI*V0#~&j&{%TtE!6im zg6WFiGzST0@Pk4;4nCeKZP0T_D~9-q>Dc1|#pZ^?9lXZWKmY-6T1^x#Ne97%Ln>mN zpMpu!@N~ZjNR8(<2>i=3e)ii3+XveR+p@5{wy==rIMXXy+&UvxhBpz3Y<~za98hfzMzx` zMx+CG)^oYr(Czm;x_FgERk7-0baYnEGo3+7(9ml7~T0HnH7o%#|d%94w zTJPn7FA`;lzdP!&^#(MBmiQ7Ms)kXmzDp_Cg_R6KimNwdG>Y_?#2 zG$(8JEKep3iB?|ZxfUo{4$Jwm*g-?rbGx~t5q-K8fH62HKQS1^bh*B(<&8DTCb2VV zGl5Ha5q(qIu4S_yxV_t}Yn~T{jO@qIQv^eAV6*F#fOm58h{fU|x3^n9_r=F-cRhgu z+zeZdI5UtWmTXpLe^95HoYl?}X$Oeuk6PcYh zoy;5sVijd6*~fOXlMM3FqgPn1R_yCNi{+6FL!E=$n;V+C=Fx)(%&G}vH>Vv(>ZW74 zI1)(M_bm_aKTuI>bHi%0i3^M9=OGZa-fiQ8q3y}@iixY(Z}#+Epl&^P+m|v`@4RIs zQoJ|2n%tEFdGoxaEDOAyQsf)?n91OMFmzosa_#k;juFqM?rD0G)R*Bj~k&tH9&qvb*#YZx%eyJEF(WUBsrp7Y@R zoXd5`W|S|Qk~o*kKq*;buUKrCmH5H&{Bp&36qqk7yvYOzS6LMYGKO9Ip3qyx*~>(=%rN69!0qnsPcog)Wx9HPx}dwelpjYOy`sJnWlHBd zD+{toNl_&;*36Nj{tprT&PV!vgntfFJH{bJ?fa3R)g~}0QQomBzTJUOOXd`--H%an z7lzoe1P*K~%mD<_$rQFV+%*-YI3*YVo`AaVNMnn>gqpzwoVK%FvQnQsFfb(@P7{SwTpXG9=(xqS6^~@ zvtwva31LF!3XNCtZOL;1oZ}F`pHC_toGm#&nlM+oYZlpF<4D^L0$b`7Qgw;*9c*hr{HSeiK)A-+gMo3YBEZ6n^%iz`f{J@WYiRaI6dGpad ze*U+9g8L^6dH(p(GYaquw0)3?eJg2Z5F4f{Vk(-kL2Lt^JKL*pF0(@SMW>?EYaBg* zP#hS71d<7VlK(Vy!)m?5*-Wq5cP-o9UQA;zU%vPVf%pKBCyol|^t+(Xr`P_E^y7@C zE7bLtSB;p$gXWU`uF-qwejCRF)9@e>^oMH}IQUc@C{y~KfTiRgH=x%V(%*OxQ)kor zIKNGE%1O`U%u`-v_&U?yM>!4$pEzw_35!R}*?}!Y^q>d@M@Ms-vx2rB>D8#%({8uy zcGv7~Z}m9~Xc~H+cY*nNpqyt^vz|A;-ZBgY@Bi3Hf8E3A5Bm`Mfo@-eisI-amx&31 zSfycBXdVqcF#b3Bs2YYH`dsMyD0dyAbUQ2Z#3amRWG$A8Kr)k(<&eZLx8MXwa$r}C z!w_YfMIP_Pp^wG0iy-DOB#Ga2LRAz1GFTT=(`Et+d>p^T+#Uox$HKFi7L-+~q-iw& z3}Qr;WhL*<==~Puhmz>o4q=`eQ%6Q)DDsIUV;B;k3|-e@4PxCGrBvrsHekbC>*aVK zWE!Kh+!Ka$jrAQcGM&xHBttVm89nq&WbZ8IhOQ5E9h&2d!Z3Dw`aa5er&$ChZOE`e za;HN>#VYOB$FQa>;9LxJ=)9LF=#iM`88&w@nRkri_Rw`YX6v0omPUi*T~(En%cIVd z7ZU+^b<+~MR&1|KY`l(XHD~tV7*po_{@?$H_)~xMPeRx7D}U85=9mBSU%+CvVC-tP z>uZ9}LD2hWS&26#5Y+fEKCjmK$64f7Dj0_YX zS(^Ql$*j~mJA{EO51bs&S+DN++-JYY;&{o2Kl&Db=il+G+0}the)9ADq2K>Ub$;qD z`lx;XFZy}B{?;4hS*7)F&(m}Xp@GbI_0GProFrF=S5M3Z%EBG4$- zQvy{0m&Pie%=`6r-s02WgcNKdV|9Tw;3MFENHcV}*s$>ta3MwraPYr0CVE!6kWA7^ z%&-U|sfM#+j3r>oq;WbK%O{V=2>6dgoG1cj8aFv40|FLTB!=l2ucbf)qHJ&idE@?p zO|K8h98gW?1oGL8U^S*i)?qU7_X37nor?tI>9Y|FKE%0F4LTj02jdd+9K0s2!~(-| z82c@Rl)!3i^kTG*1hx^!4QyI3qR-P9m)1o+;{e&mKmKvO@CVxm+Xvg<{MLEHy$i2S z&EoV3!oYsNV;FiB>9`5r2Sxfnz1;EMi#6*G@_a(&Vv^H#yJo;}QW?p~j;BsW%eyW{ z=GrP_)7SXbz&x*5X1SOjt?$^6J|hxKA_ocSnqlj;GHW7*_3QiGI~%*AOXJ{=>qKAPUh`5n@0NPr_U~#9xb?dbf4*b zp-J8qr547IpFP)D(+;(|q30*(FlHQ`R2&^yZf;gI`!)4GXJUH7i0JozXvi{Xn=QSE zyvn${y`u-wuJhc=U#YG;85U;KsbqQ{pOR&INuaK-Ry1wUVyYW6!dT*loGdRereqw0 zQtEnNaJPfYPd($wPZj%ZpqkAkwHtiLes{~R?KJ_lV-PdpWVw{YVt;u@nHj8Ga&~^k zljkpZakXN;cm>>)>+6@??K&B+o*W-xvWXH5L)dANn;R=5*`k<;v2cC0((%snKs71Z zZKvEnIgza9v!DOG*a^qWiatci0>0zs=8~5$E@j?6UCy!2$pZ}ISa0rBP`&p0Ynps_ zyNwobZ@hKE>EeXDmsix=8dp^uFOLZx8LlsnPb4kqhK8H#D?DhC+SEHuj$PYJqM6wk zyYHF?pT{os>Tb`|%jay{JxAx~93NlMcfA&tHsq3CN~NE~dimzU6k^ zh`D8rV!(~Jx$Xx`i6(EUTAW@xw=z2X481cOR5=cn^6lyNk_Fv zHQYP9$Gn_zeRV6t`ydvaiq9k;f~VJO9-SWX+QWN1UN`L4H5oNVQk$G=I)S=ozwgP( z1%xf<17~M5ftdTXp4#eBwW7TJZ9S*3Gyv)Zv~43!Lr z!4;0Yf;RL@&uV(OUAN5VIRjhDEU=suOmiy_l2^|bl17f9;p%F~*lc+D`ce5JWF3A`#M6}BqK%ACB+F*bGnhUAd|2ZLr6R1g^j zZO2>D1S{x5T0vNj?<7nB-W7xW%aH|Ek%Q{^`H+YM28?loEc3-^Wd>I2{M_QAsif z9~mTY@Dn=7--6Z8(U@5vNC_^dZw;##MiLC0HRSG=a+Y!L;XU5kAF;1HZf^D*3~fX5 z;u^<;sWzUpe?k5=A9`!S^rYeKrnwIr`bjTuqTu za;Aa0?bu}v`vx(T?sj`_H?91Yx*^bb&(rlamv>vxH>w!t> z#JnAS^l9pqK-ST9gM3h)-|l(u-po53XxRo z6XHYNb9eAtJ9un?QP*9vs$ry?&cxF30{;dvy}Gv3oF0p$5COnw{C_aHhiGo)6Ig{$ zBEnQ~9(=O&UzEuD#%rt{vLQ-nRG_4QiJt7M=-_%Cxj@;H6|s1NabU6u(zlgv}|d%zTqF@rJ0_#&xfzsnRpp4yUQ6 z!wTf^0<1|a-Z9C^)ToK`t6m4+W6CMGOwGh`hzZGKUq`PclHU>)z8Bq6Ov&5}&M(-@m&`9a1TtdVb9rUr;jpj#io z*GaCmrb%9D2QQ|SI*N?OB~?x1K^B_$dZ!(qE7&nOUxyR>}~l*WobB+EcKA$DewoI#(Wp=Vl}*cWGxdxBHoUx9k)33e_m7y)GcIp#3ji{G~#&1X!? zf@U1K-8Y<4v#(`A-TJ&O80 znMU)=+0laCzUOMS`>EH}_jxvDJ389kfV{`)kJ`sJiPE!rDr-d zqMcXe$lZR$^?E1f)pU9!*;u#Tv)#9Pp2>2tWN;Mp0QvuK^;=j`@Q1w*?B6ADcXZ8I>R9Z60k4g26(-E76g>4W8Fvt_@n@g|q|5!NzY zEI2w@vRQ3;`s|scHjCw)*dhGXms-mLrVZUv7dbwghcu56|yp(ik-+ONFwiw%Tb$u(JF&RQ)FnL8eKWDXF zQ}0{JcJ6i??&^_U8|dXVJ4lx3W>c2SBeJT{y}E1m;GnNt6>g(J(uj%)9@No1UQFrT zguClYj*dLbdBw}CJ(gTRjTWES9Sq6gK1H6yjU;}4Swt>t6XOCP3t+kC|Oh`r4|*A(i%$F za5Nh^T{ya-WLV7TB`4`=cWX97fz1^ut%Sm-Pv2+PK4#l!Atvc%-!|mVD@dT4Il9`> zR3#4|oXGPlFp7oP-1V$)@0ewV`=@i-V0iN688^1W(O|;_Tki0~cwjEMBG-e$VGFB$ ziOF3CEU~yANk-Ojp-1!=k@0cA+vD3BzG{uQzyYXAVAJ2sE60W9NYW@Ae6h6HJ0M%q zWTbzy>T1X8EyZaQc^2WJ=T!^n$X61SAVCBtLI zpHK4Wdoz0EZ?`rz!zfv_K%mvWWxa3d6cS*#>#w=oTvKFAdC_c|madN-@VXlae$-rW zJS|yFa-6Y}2i57m0jqKJ@ylB=k-qigZ?T+J$zy~VXCH?DT3M$UYzB=H&bh=G?g?2C z@RNDRnCEQvH9z+5(=UTp?@BiQO&@;5ulnAv=h5k04XUB{OtKt1u|SV+Vyw9HMg{yh z1_5n*B`w-0#qyCwSrpL^C$||*+X@`8#sRTwO_I4C0NnIF2b16sWmlEKV$Twq|nN^ZGaBSW0dl zR|GS|;3T{E-N4W_V%Yeh7dur2ZJCoV=H$}}IPisqeM@M27}L42PDT7U0C~=2F~Jp< zK7v02L^1)L$qbs2cJSmb*Td$~$Ho&9cxc3maz&Q4pxHN>a+mEOK}?4r8&p-F0}4 z8I}A>wa@xbUY=SHWl`p)^VgeH_;-U0*==NqsKA{m9XFR0&L6~-0prv7MDiIlmJTD( zyJ;H;s8N#nn9@i-VR3XUfZ2%^FEB=y4MFE(kIQ0!1i=Xyx6x}(%^hchnhUMGzJ@5L z#E^sL(9RnHfFWxLjbwP5zY!i#l2-}L8hWO=VP?F%)|xP=A?-@fpa0W;kw5eY{seVD z@O|I*&HP<|*RSCItFH=(>FPaU7&H!#N^bQymwY6(i1QI(4axIRpG5?8T<((XVg$8p z^dr*oh^d)CaHqhKGJ>sGI{EIlWF~r%jcL?5J(+3TZTi6V|5Z0i22 z`I=9BnBV-L{2tzZ=ZV(t##%MGb)A)wwd8^Wfh=gPt1-NXs&wQEEEpqmC$VYqmO+7@ ziOqwLAiMnNa&T$td$&fOlhpfCW$}koFyWFuB|coXSv8I zG|6i!Ql&}wy`CHQ!QymIgYH!V(LWO+!_35M$Pn+7!AHrR(;XKj{}#xV4hf|D22TR2 zlOGq6or&=}AHl#O`4y97lzMZ$ubPEoMn!}A-X||BV#1(+DI1x1M!;3B^F5?7TlS^$ zEhVwnOf#G#6Qd^YJ{2Jth{b=BE+pBiN~NHFJin?|Xjs z+XveR+Xvfd40pZf_V%R;{{6lcNVD4Q6p=Wg#+V2tDpyDeEUk^|XfiW_<` zR$ZgKD3sbUos>ecx7(gH64CSxH~T%?(b9NJ>m8GFA`1JeZQ1#b%l%#hNHLi)x}41b zo$)kU5Dmkl zkk99=w>!!G_S=?cPhU!A*!R6yC@04!93P)*2wu*Xk|=KO);znsVp5gN+=xFaxcB-Q zWj<9mqr$6@4}Gmc{rui34=#?`?YDGI;NIyu+uF;p+uMx0u48Nlbu!ArlQ}Q*&XzG1 zcb?^Z%JFh8Pl3Bh&h2L4{bzUFZud;rPG-}q-3Cw2e0fA(O*A10NNO6Tzo^jZBdt3( zj@%YBO@{X+A=GiwZURkv!+NtL*dVsliII!-x=;!8=8H~Y&z%Y_=GHrhP=aIr5oSwcig{! zpQGc2{F;pK3Es-&{`O|aUJS?;Mm|sTMahfjYr>E- z$qd=lvhjl!^JQLW5kH$vIX?2-u4MKtZ;_MJ1!Gfl-EJwZ<$N*Wc#?DJtk_M9dCv9i z3gaibZby0wL-aUcq%10KgVA}a3U%WTl<%%@b$!ieC6*TNTcro?o1V>jOYa=_?%k(p zGnvnCR~>^-UKzP#b#lpY6eT!s>+k_miBXa}+58w6g9G4{i6zsFzx)R%a6x#H_T^nkzn7kwL_cy!L# z5AwI077e?0P%OU;cY(1E5x~wYQ}Wmy9|PNc6Qz0{z;TE#w*i|{RI}{B2onGR9009@ z13Ky3ghoap-FPtVJ$RMa6qzm{HOd#0fCiJ~l8i(UB1wEZ9|7Vq?{%Gx!>GoM_cCoi zNCzd5H3zyHVB-Bre1E<&`%1q*+!M)%izF#FV>kpb2m~9V_t)mivAmx%zi*f<0@>1G z*N&h$6g@XSNMJGX__6Uv8)YpDM(GABP#8ehdVnYcvM^Z0$5K!BMG zWcxL}8)@8{^2GDt6Qv~2raoirGtKvP*fDgF9E~wLpK)H2fq9u@%0g`SAusUznoxI< zjpZCprsq}(zL}d5GRUVh3at~2fCi-yT5x#;MtiKh18wdOlIqN51ecK~U!z_U>c6BemMlvHyf<>OQ?*|#ulUwFhhViAw*|Lg2HCfJSIm7l1 z#}k;D4u+OsE0$#`5b_89(hu;b|HPlsdh}bq>FfEqKj+(d^xA7`Qnt;O{brR6^GAV7 zxycly6X((F;4?SKqQXX5o8-cpagq;UWMqM57+Tp;SdB$7bu!DX)*XQa=$IX(@DD;J z5O&lU+cKLJoGeRjt_D8$nRi*7obWwA_uF~pwfnsC@BxpXTxmU06q$fbWAc>93fY+M z<1sOV0uhXMSpuSm1NfG?oPbT^{D@5qrP0HXq^kPH64{FVD4@<63;hsTbJiVv0z(+3 zG(hsgTudo~jlh}{-%8gp@;VOD|1O0ene^}44@113$Dk&77Jrt+))Eg?39y4FP3?z- z#K^dIi6IvKC^1qf9KvGyHb?I{J~`p(^9{GRHTO;`?w=kpomB#FdXuy3 zycjC8#gu%OGxn{3lCG{L3#+D6R$WU=CeWY{u@lhOp4+bF{mV|1&15>k9~S*a(!pl5 zv_0(Gp0M7tSX5%aT;8qm6dGWcRe>`d_s%BN6GOkx*fpbAJ`e953m~Y9lKpnWc5};m zHHsY-!c_hf7x(USdUQf)1C_1V>>BEJ&tf7vdh`e=3oV$+Nf`%Yaxe|$G-Grn&o1}W z`*^+=M-}DNa(#OZi;BtdglW}LP8{b)70YGGVo|Vr=Z5!QJmcLbd-C#DwAz!i)94>m z7LuvOv<|Pujv-fCjtM!2kxVITIkz`=d~(0l#564}&2mm&PLK@jeLt``Ig`&=-R$UZdUm^x zp}*t$`brD*@z`*Be57me>Elbv(qS0n{c-Q!sk)Dw^-dj-i_=pr9)xeJAtQzQzFLDP7SXQOGP58CB1w6Gl3)4fs+(cGK=TIXU8N z5xBX$rkdvh7yK|XpH-Zm6!NY*JDT9ef%D@Fj+S$ZV&we%gn9?nq^4>{ax4!X94FJ| zTr9z&EIB=0vRQ9vYfoFmG^)DpB$ur6L16-$d?0fbophLrYE;nGDYWlHcca@NA6<6*1KPN%*Fj9&d<-uvw`j1mbTrot{dKYdP_B5 z^5B&RRL95k&6>OV7MEx8ue06~Z1h?wbdTrqzsf6@7DXhp+=?yZRJg@0vR1~(TM&2!mXX-C^c}2kJy%aN zipi*PvMP2=k8ILOKoOf#gvbnUymiWlzdq--eVZ3|E5>0;7$$_F z;Mvm^&z@Y;4q^&Psxq{l0QYo&^!=zgBc=@w(LbpkxvN{Y`%W^M;$C3YJmY3vb5h<@ z0+?jUJ}_h+m%+R&IGI;sCuUhPR&IMq*E<0ov3OqHZh7y;HH&%0y`vcirC>yH4iBGz zEDmfPBEw_o52ol!OJl$TxBFUYgMaapU*NrGw|wN$1%KBs_%6QVW3N&ftAhP#HdU~} zYF8^{!tPr3UC*wOJVesMT(a_9Qg`|KbpxZ1g$^og9C@ZsS`Vx7E+-oXB`M-bfDv#Y z^96_iR|0}YMpB`2kOdOGi4LT{)P+|^-5tz~A)Z?Zpywi%f^U`ZndFRP3LS_KV<7#H zgpfhpgJcpP4qk93y?X+j4gsGw7J_=c!|{=f=MyuqzO$?@9p$khn*^$3M|)Gyw>^X* z8uX(sy>PUK1H$AdjH!>QjfUf1~gECQ=_eYotzgqW1r4Y$u2-InZQ9wxHVv?*SJD8+n;(joU41=yQfh0qeIjhmLEGO~a75mf+l#7XeL5%D& z%V@fRUXsELlh~=Fji9=f{I3PEvU27I%l?;UP3<9xB?um8}G@Q413Kh03Ly!HA$e%|+f1K;_rUq_KU*6SO#*Ecwv zj-hL7f{zmLIHDLauf$FQbQXsJpBXTNSUtL*eLR*(2a2Hw_#ALpqRk1VC3Gk_#`|7= zej!*f>M>S~U}ps|iD@&RRFaLp_wHGRT6yPicxUa_|I= z%yWYtp6ILVAntD@=N{&78|B@)&NA~s3gHLa2isR|yIZYz`P_;nV92y6MhJ9C?LA#R z&=^P4rPy8HbFwUW<^CzA$hoU)rJ~gB$cB-d+ZFk=V0wH?(+=^5_lBa(RLogh(wl;p zch_9s?PNY~y<=z_PL>OnHfIc(7!jM*p1$!iU&k7musV}Pa>+*LEnvx z)U4aU)uz+JyzzTXj?x0VfEMYqtdwyxLx*p798D`e{^3^?>x(AQihxye;QDsUZg<1c z@shKXDJ$D4xzLBmzG<3K2Jg44HTZ!C=M(w!6vlA7xz(UMU(6Z%Xr63coFq+NC`oQt zx0FXy%4v?x1N+rp#?|A-D@E^QGGTGPq+Y$`t{thSbLPj#n3o+PGnm3DNzgZlIpt%= zMPDQJHb5pVxIV*ReCo(Vsa25`lx4>G`8_6+Id%Vx>14`XyOweK?Bs}YUJ8^rJ~?7K zD}V+V$cq6#AoEM5^yMB`<}Bt@wwq3X6SQLTU0>g_uX|jP>wN5XE!IxNl&bOx(@CW+ zTfMIt3&+vX8IvlooKL`Xk^yE}5lz%LExX;GcOO5em`yO-J?}q$DwFuvUwebg%S+yU z|9ws5le}VIHw0(Iz#6V^xqp7nqeqX#7VO)dipp;6w1Dh_6}Z}wF?ODPyHSLA-$pr6 zE(2r7uCCP)Z^h_vOeROX_v9sAFs%2T3Sg(0-XJECF}c9C&IT33SsvtR)pZ?NmJ8&& zy1t1;SebKsy_PRk2+(vbo9%{I&yF~qYSV|k7PQ1y}A_`*1p%o2q2HT61!8N+rYFg42^2pIuE0uCIFbP0R7rGMzXT8TXSb zTrpol76K>p38fh+7gNjxnb9w16NY|ESy^V&oYIvXpU!yp5;lAC%(H76#d7ECYi_qY1`682vf8#(c~72g33j9?bAiw~ z1xJ%o%*Oq*jf_`26UdjP*k7Oi)C(Rx+;DV!MBi>{wl`eg)I8Y?n43Fp_ct-cOOBLhQ9k(O<)x(bpLpw4CV58FHDpeV#AMJO{nWk^JWO(tVE|_sM*~p; zqHWdG{LmM^#Gm`o&+z_xcQS_mbwBr;`Hqjj#_?npQ0 z06qbm&T(Mxc@;y6`2^ZmNU`xLdR>KM^taNn4Zz_#6<`g1#mxOGq+QzJhJ& z_4QDt5D;*hz}xXFfh&RvZkuF{CLqR*q%^)>Kw7ZzngAnaNgo0x%hhB8B^yQ{D9hEn@u~3a`(F2UDJGVf zg$k-M28treYE9`P8^#GZ(E31LRyf8~$PPX>HHSD5rn#UOL%SXV^Q??4sj*@3HC2|2 zjTt;if+Z=Yf@K^#^{> zAK>zO%dh&S-^Dk6?OU8bcmUS3+un-x9{Qm9I*cP(u=3%Gvb#RY#3CzJ=Sp&FYjnK9 zcuB*ItT*8ud*lb%4uII&fK`by(lV`>*ZgOQ>^LmARVJVgLrq(Q(FG zA1Ra`{`}=NKla!EI_(by>RrwGammsA5!dSt2V-+AaWL}w9I`BeVulE+MIus^w|adZ z5s;JQI;ARVyo_e$x(M*9)g|yzCi4&z zUp3|=zdak0kvWGjlw3fk;3!Pca|BqCz!@0RzPRYu+bKs;0C!tAQff>mIqty3KFGk; za1S=4ACerD0HotdzK=ooOFTC|?UNs4vb$00F3C)Nq{yQ&dzxePx-d}WN-vEMbd4kr z&_g&)dY@!v5M{!L=7#nDu*NY?M);cR1_6!e+9Jg92sHo3$2g>a=ip~J;B`&sHZ^(p zVEbVEVEgK9gJ)J0O5y73j-%Ov&RTAFEiZSSq&mf|CN81LNmnk0@EN3>zX)zuA~{*D)yw=ftM<(#wWQl1Xuq>RzlO-~s{ z7DdVR%R4SNYdSaKt_}J(AGC;(G|$UdqG9SLcoZd@sKunj5@MGmXpm0DNn{yJ@v}H_vcd0ZRp#kT8XK_%1FQL=;%$Mf4Yj6~0b49PBszUO#a zP%LxW-HKr-Ny|KDh2us>#)izs`+#wXi(fP7`Ykfc+0l`tlUbf|bTVhX85J&Ydg^%i z=!EN=$MTVT^y;ge9L>n{HPg~CsR}033XGS5@WoNVe3EnjVo9@Y<(al=YIVWSPL5cf zO!>s@4W2*SaeaNqYJH2RV}4vH*dZ7%)9Zfh*>?lhk5rApIh5+-GITvn%1Wu4MU``L zekLh!7XlJoWMcWLv)*)u{eB>;MrMhIt zG08mh`Gk`^NRr!awopv)6DOZNd5UFuOs|?`OePsc;pD+$ls*;H+Zc((@!*r}HZf>? zTC8yZBL3TrsFG3o-|Ut^kFP#6OY1#%U}y*c7)c&SA+b{Y!QU#Twng6{0Yqam`F1&3 zm5X69n;)sj7?F%bNt~Eoh123}%dCLodkbFOO%*Dzx!J`|aVmm~s^YCrobk#>;6?qE zm$walH^+A+HdF*}1dRLO51vt845pYwnr#X&E&|zu*L@N|lEL-1q3>$me6!^2e8;EW zdB)@SJc~)eX4aCM^!J0O8_==kS!6o&UMP&DZL94d|HEPQVl5Qy$a^nub^qT#nn!Q9 zzKvr8U?71_e5KjA$ZlQ*Wf%>?9t?X`kpJ~}-sjK$=;wI%{aao=I^kD*_t*0sAA3WE zsShqjkY^5OazIiw-GgPG$*ZN(!awNRCV@3JAa6UX#z#)EX=H4_+SdA$vb1`BT(w7b zS&;_@Nj2lWpiQz2u!MtzE(pg-*Gn??juV&W{q&l8L?FV980$0^9WAF~bL{u6z{y=* z6Y%MAk`tMFfj-X9Dr#(r|W5M z8@AU4`68p7jZBU#!@3g7UEVKo9}{R6AI{n+F|t<1=Os?;pv&tGn{}u(_+$xk+7<+$}6qv@vyYcyw_oE*y& zvTj=WMGk$Y&=Q6LQ<#|CnpM&B<*vpP$c)#xJDW{3Zu`MR7DS%MVqJhW^kbZ{a%*L{ zE}(x9D?(#zEFcAP>iyecq|9USF8LIx_;gMUge(MkGP&pnrt6`YW%$twtO`WmoV*Y$ zNIse<)3cDfK$d)wGFc*|MCmMJE(Un?-YIM$Ruu=v%81M2r{A=#_SNZH(SEBy_s-M% zAQ|2`BH(8r0xzx}aPr^xI!{~QG0Amq^tX6G;IL7nHN&c)k3K!9X;tQq!es<{jXw=R zjjM_7m62AmTpJm0t{~U(T8$f?_}O&*K-&du=4tvy?^oCI&3{8i# z72|LS_YfOQsd?l&M#;CrfXOY^&QhHrYEm+9A0r54oLEKJKwmU*ejyX6YMmti@~SH5 zy_#1|+fj}2nhar#U{jGPz0s6Wk~lp%=luRdKHSs_sqifVG+h?Q_rLn1KhCVmle`$f z>)0I$Bq4&dN%^g7TL6a_u&DXZ>6(TNE6_-+9yPsGXX*K94p4|wOuq{b%$Vj06OH~| zY%UJ+b;_bAl)$ez|L79;eN5ytx{i|%R;K-t^v{r9e~c#PL`hv5))~A&Fo9VD%RG9Y z2qpzg0&oVGZIpB zGI??l!C~*^7peD=51oNACfLd{plcg?D-+=l0IUzT54Nw;CK|CVDw_UQ=}Plr5<7y< z)6z*|aIbK@dT&8DSefZgi;Vql&Euz+Y`Q@}#9%E$QBW=}xT|ZW^DQScF3yf9W;xF; zZ@Am_?3y)~`;N=?K)biBhmLyN#$=efWoV4L+Cvst_o8Ua;5o|-P17^d;xQ@p0m^*F zU~)y}S7pKJ@se)0*Q7eJR*7iKDwh%HQC?y}lX6*Pk{|ANJLvZmWho%$_WDjH)aMr$ z9G@&XIa+Xhc1qnf49#APse9)aU~-;a-(Y<%U#E~;ip7N97*@MR3sf<17^v$t)7gZ6 z*eF3UU?qXuYMHnCFB@--t<}_){o#B=H52z+{p1!!{t~NZmzG1cVbTyjL`XTx> z$loJGN^uy~IgCD40T`7+63sC9pZu zYK8@x{QzVPgAsVuwpOn-nVmCTIQF}Zq?&iDwb(^PpD~e#M5gHUrtOqKH4a`NR8^K@ z0&Vtt$^MS!6W;jHYnrI8uJ2^FdTV!FUEZ+W?^!O6fSP?j$S1AoIsrt+i2e6ai&JHh*URCK<0dCj{|E~&=>*ER$LMOi6yz*?A2ChVJ5K-(y)^1yT)IKMcR2S~GP zm?&yIBVfd$=)7k_A+NB`5BNz;Cc0^AUVAv_!TFqS+$qN0(lVPZc;%G~vAD+3Ft`l6 z4`e1&H_W=gzFF&j+SgllyMo1RBA~I|?-}PM$0uhzdi98_>m6O+3;Zi4f#uvVn`GEb z>=k*eeEf|E7}s-sb46PlZnhh?re(ivB*nOYe!_$4Id`}3u?wdw-A_+kOiwB!`nn%tH!aI!r14}{@ZjD(R=bMT>XP-Up>7*3Xq&!g*BfvJfsDJ& zM&0B4CkvV;#(>Y}GZxEZZ1R?o*1jbUeB>aU?z9Dyh+5ea6&Q! zvh=;<=4FwRf(G2#j_C{@yfUL{j(Df@)Y}G2>c$ZI96uBk zrid)!x&y2VS;9e*pn`QTiEZ@t=(|y@x?qSBpSI!kM>%hPIPmo98DISDp7r$vj%)VI zozhiL<|Pp1Bhz#vH`^%L9es@d-*y9+t5(d+JhM#8LTuE>S1W-@$MZ_ph94>@B30?& z?-k{8hlHntY{7>V6c88n?a=d+PoMIqf8uj|;k_GXS;hB#{YUt&kH5*HD8$0FjNrUH zObp26Ic0zgL|`EazxeGA(j>*Nk||uHw9S$W{B2fttbhlFnCWTTbwFd&BNdu2d`+6&I%q ztj*=O7%@bx$)cwpX?&?NvSr1PWRq1Mm=@7%s4$Kp_X3cV;FSw#Nj^P+JS!!4w_;R# zjBhYec69J5YR5qUi_=_MV6sB51&P7vV$q-ZfVVlB04#7eu{ap1iiyG*GBaq53ASK} zUi)H+Oe!&q5^$*-jgbf<<|dFy4sGLlZSZ1`rHir@7}O0t zZ9vD%5E$@c3`VJ#qsmL2vmoHjGWtQ|N9H2SEi(ZVqCveuUZ%P(DoFs9Mym0$>pB7P z&N+r`jzgfnI82_dS(w=;~4HlF9KI$H&L~^&k1G{O141Z|3pKD}Ljz{`q|3BX5fB9EYp5Qwr!Fzs=4nD>CpPjobieAsP$L;dq#oE!{8$;&Zgr4 zeMKxeAT^i-pt%u;C+@O~*P2)3EFLG>2LRRw+XvfMYuoiBk8k#j#X=p*%T=QSuD4bb zcbfV-W7qO>yMy(f(`m(#I%<)&e0AH49(@0z z5(}bqCDYR>>&+VaMl!*|1k64T@C{DiLW#5l@b z#_evesPubh_t?}uZ@>FQ33JnG&e`#juJ@R2D}RV)*Ge*2ik1$>^xV5RXB_X;S(;Q+ z_RWsEPhKOY!8fX=YjkcWWyyZK*QIcHi@#^pd6>DwVtD_eu&o}|%O_H_l z*kg`^D?1TH~(J<2!J&}^JcfD`)*;RQ#OAVvfXFr%ApPt-A!&w=BmR11d&CMNE zHuB-uPx;uJCsfs%#t#Dap1yp}>#slJ{`rjUddFl{^4{ZH_S;^b8+kGC{A$CjS`b1l z*~R_ySGo2(d||~R+iyFjWvMhYd`wKc_wa;;EmSbtdmEH`G?^{9yW4^7nJ+VT!%iUBh!fCh+r7pS zZw=q@;1j(0#sl8{eBkA?=e)S}Y=;@IKbY~#>-X88>}YoltL-&)-(t#&EEnra-ESN7 zv2}m8?MPjZv`u8ub^DQi-!ZlWzV9TD_H744|KEiSVPt&lBKYISpA}o`Z<>J>SL7-j zl#(TL{T>e9+vCA#+qhKbCtnCiZpkvNPm5`JX{49MqV;R=hdB8NGQ{WDQ4$$Rv%?^> zWcie3$2*E6$NkqP?6ymuywl5YeKK`?^b<$C^47?c{R^eG`k}-RxjO0@xeUm=&Xbp= zz~oF|MjS77&8e{4iMiTzMUsFoXs+{6vvR?E2W~Ii)d{PmHa9|C6<(9yngL;z$ z2KfUss|zEaeR0X3|KykW)E8djM#DFL{1v|Q>p#NTVjd&PZJ;v)0W@X;V%2p0DCSw8 zm~r~ti3L7Mf;eEutgc*;d+ce6T!0s=!rS_c#SDeUYh{ifiQCL&YNx`hh#iq}5d)WU$EUXdVSIl_8He9g}*LpgWz~W&GJ~q_)bu<|_47x7bu8jc{ zF}h12Yuj5HCl{f_m6m)_%116QP+`BRYe>=aeWcfsiLud3V%d2$O_erXZ?{;F##4vf zkX7i(hp5b$$;>fuV)k>)A>OR{JeAu{^=N$ z1lqO^ljqvUeK&#t5FiXHz9%N0mzoA##_5wtodLm z1JUdoBbi<_p-#SGnZthV+P zy}-2)21%~4qteU=t>GNQSf|v`Hm2WYB|{1b$y@{>1yUuz+j}u1lNq~MSqfwE9-XVG zZp{Q}27~I0evHr0WC@W)NGS7~&om4cHu?7Tkp%>h)KwnvhBXB?6SC0WffOo)IXhb)TZ zXLTS3>p2ljBPYZ$S??K#QIot01J0$PHcG+|Q-#3R1Wc1yVj&Cy`E+l{q|IuKZ+$1w z`*^;H4KV8j9OfF>WUC>-RL86RC*E&(Tud0$&l*Q`uB@KZ)(zHNAz7uYmwmP1Z0y7It0n+n8% zhUI)tZasDBaQVo7Q%gQ(UCyR!8MjRYLaLswX}R9iFc>XLW+w}pea)&d)E&%9%dYO! zT{@l5nN2f>B6V8F7LC8gQDks_JmF|jX+WFU5e82&DcSZNN6U;nyH7Aqo#ejj*{;_D zv6hP^!IWHGUrT1SYX`R5JAooD8!4JrK-g|KO1r;YI3=wNL&LtYlv+Ry6lLJ$Z7qq) zaphPpb7oU3v-rW60#$PBxoJFYJz&US7V)b2$yafv9vDlhLY6hRQoFviH8D?Y7*1 zcuJKU?)H0igT^6tkFzS{>bB+l;}^WTIOqI$Cg$JSyuy}Kc5Tni)gHshaz5j1IcGAp z@*OyH3l+k5wdd*8l^7>Q))}S#Z-%v`Oyq;WH@fGZe^bD&B$Up#kuG&Hz^Uz zae7kn;B3jX2wG@7eYvG>8l@NByEvAITJSwC_qrdq?H;#pnUz&6!d;a9_F)vAypx=F zRIxIdSC|a;eZ%N7FmQQ&Cs6wG=1xH6H-GpMk52E=YrBs3;AP8^pcv+Pww z1Vy>`40WUN-X}JK3O(1cSZ>LW;PgSxYCYHWdUk)tC%$RMSYGk;$u0YxBa9WkFDWQs zKn!2JVKSeJiC306U?d^z`$0^;Ud+%zk|3K!(CE?mgs=bDln}1?ss zj`Rp$sW!E$z7A|5d0Cmj+b^#9^Pl+wKlZsNjQf!f-8l>XFdygxsg^6;qOxUz9>IIg(2opW`& zVZR$dY$_t~Z@{HAN}qlwCfT8*9c7bxSW7i2afMR>)^|yYB_m{qF+p>4mRo^|GXXgj zA%mjKGzUd*!BNj|+Mc$CkWyq1K6N2^XJN62EBgQdYoAq2r=JguE1!Os_~3YdknKnB zu6T~eUC;iqWpSF3O@o+N^&}UgD0E{4P>Kn5GKaj69J#(C@W|i!!_<4Rpq6e2)x8QVf44soXFK!qc@n zjstn$QQ9mriWnoqau~58D7;~$)^(LvITM$&RkLY?JOU45dxSy1D_xY^iVq|CTf7ck z0+mCE-ak5LLj-GOyibB5LQf;LpBETq<)0NBW^LclbTJXv(6ZXK?1obku(uc7?bxBBYIUE#}?xvi0`GOC?XI(_BerhMU>dpTV1btaZIZO)F39Y zK8mbhFd7&18o7(W&Dh8B*FplnQ}XJ;Xx&B-&Y2`nPK==>bB<}LB!*95Nb{<7Spp!F zwBGorI2a;8Dv*^3Qu(Nr)jfwA#l3umBS1>>_DW38#IP2#P3)&Q&U5fxv}$q`&P2e= zSeibDm6Qr>2=Q|iFoeeA=n)nU-eEGN2Yod|;E-yJJpf`u@~tw7#alOftraoI|2Ru* zwM_44)v)Y`kjZAIOZ8Ea>_5nz8LvI6b(3PZGhk z48Sd?(;SB=#0M`HBYk+zbTVUFRgB%B*ja<;~;;?*&rs@zTT+AYaM#u z5NWdV1roz5OQwg>yd|+5Ok6~zsM@|C1xTqQGPLqSsOy%^ZkIet1Qf~KdFXpd8O$c8 zHCl2d!I?hLH7UKQjcJDvb7fQ6bM8zM)py2FE&;%41Lh&twag-xbY6`YSBUvY6}*|mH57%V52uFt63 zz_ZI+3Y&|OcXB#seO+_A+0%@-L82 z_J+LZF{4)^lCvEj`OpKNJsu*HMU6QXD3ZWjoSbv-s8I6SkH37M{auT1I{`7o*#5sU z=2M95g%D*;e=9`gxaor9S6=1(;RE`%WoULZn_FVp5F*)%#I(Z3RHMAY6#{a!`15_Q z!qX3uXb6M?16E07ddO(Gt5y8D-soQMn>}r_W9&MO!9YzlSV zKm74y9=_>$Z*$4bT}K#8hQ4C-neOFw*HLexL{Ok~RjNtiO!Pn83Ydunp+D@m=lH1L z>pr$*z8LwzAHU=2yBVREL`6W<@p2-$^K6>S3&j(d6duE#x*6Ch^dTGym(E8ojJ54l zygj+R)pK4sTXIxYT0Cofi&6#f@Q7tC1iLl$oMnaJHnwZ+_ zUB`ZsV{G&)>&93ZO(wY-6q6zs_}*F=M~iJG@kjt!0#SvcK~(94DCaR8yd&fOsQVwE z6KPl&BEtcJUtp4)Q*ywx<^ZB>b{MH|d$zYD%ZVdjK(?@S>m0g1&Yyipv)#~HqeQ@9 z2gq{BLu58*12!MY<|DNiTkSnc1Zpul4v$=qfJPVRa^?fG*+`CL`lEFexuj7(`PSh8HK!j1n^?+j>V-v9H zdWx*VMq?@P@;;K0J`M)S(bL++3eHfI#v6;12UsCSaVvl)$5JS%&gEk?(9a^!()G~y zL1R@LBCDs!t^8g)T$FOFk2`1$mH-ZhW-q4pgn|3>B`0|fT}R!l1^AsmdX1C&5BQNE z{A>Kq-}1Y8c6GrlGMlc|g9jDHM6f0`iv+M#5j;9H zMtqVQT1#RPAqMU+j*?`%1O^kE;QITfi?U0Hq4x=xNj`$D*YniuYWtC4jEt>b=fY~t zXonW#qOaGG{M~fkO*H98GI%usbZ?QsNJzk+K-y#;A3;CW9}q!o=bXlr(iQrQ#+clj zrq9HRO91K6jqyB2`DT(4y2!*5n-9`ZuYWI%jaDt*K_DK3JQE{eh9!bpYTVh>)Cy8`hf*$44a(9$c{9uDM&cWK3vBtM2s8 zdd;@=T&=dE?$6YHb@Bu1x&d2E*~{~@R^0v2JC>D`FOJJ#SU1c|cx9PE-&1ym5C)}w z6qAf*@SHAVQ7liQ)t1xAoRhN|!_doMe$xZJ;lZ-v;e!S5J*~xDvc@r5LuWHq`&I_L z%W1{&e1adKseAU@PAr(4yN1il7owZyc_ta%bT&X{shghF>XvqF$#XcGFTs0Bwfbhy z@ySd@^={jU`Q=)}Zr_R_6b2Wms%~Vln9+4HHL4gL)5?g3zuu?LPL^@KY1s80FIEG= zSCCg+tv7mIF^g1Cck-FI*hNkK-LAnKRD2lQD;1|4!DeyNYnnPz?*r>-?86!nnc#Cnrad~Yy4;=doW>uF(&-rQH=I% zT2NFIGGE9feQZ5GH*{gp`>M!Ki_`@0lJ}Ov)L=eyd|Hs*I|f zi*mnRuk|+}6aw?g$%sJ{rzYmE?Ffd*OxkY5jw>eVZzUDXY|q7PrqA%nlV^n9GcTt!y`;tp zUYH#h*wV=;H5&&?-_h%%++fjhQ>G_hn zxsnWZv$|zAak@`;%}CQm>7U7r7KX-H$(Bbyh{2NCAl4?{$~WeCvWN@NF?JEV{Z7TU zXO1Nnp_>MN;tNm6i%Mh9*}XZtb|)Yq$opdC{>6fauiWP^y!%+dYS)ceH%3C09eMV0 z!z4fBo4)SraD(Fqe&8nsM*dB)r?kKt|2x@JHp|8O3!|rN_FD9P)wV2Wa&pSWgZrGF zA9MBcl3|E|X4($y9R1FjSQL~6FEKk~dHw#8_@U zx?yBfH!+PUMt}iIe z4t7(w8h3IhlXih{N*`=HMwtiav8%3n#))BU_R+_uA5t+EqKrLxQGJC<(xl&dACEJA z6bCkHF)1jkoNf@yMaJS|fVyb})Mw5JJlxkkmv>usyIKHWCiVvLF1IrG77#M@aSj{t ziS3oVvd}znkj_Mz42hxS#4I!}OLI~*QPMTrcQ6hy4nN5+L!(!((tg)p^fZ8OV=vn)QNNIn`%3j?gro zwHd?=?}xzcw&UHa9q&B8;>EK|cI!L#+kp>P0e@=Qn_lN;9AiAmSxC$cBj6&JJUlakhYk|ns4yNh zkGrza8YZMfN+a+lGA2i2n(lt^YQ{_oD@jib0Zo28z+fCjnd`h{)~leMcpJ^jWiFkO zS*K>H(heaS$vb!Op|m#28iViU@w90o*qG-~T7xMHtdfO2{-?d;{6Lc$5HhMSqSt7i zf*Cw84Dq_EvP>z77SFt@upv8y0XXaAAG>WjuJ(J1V#39Ii35QGZMWBJC~cTN`3sJC z-)Y^O`PeYXH;-aC_zSp;^h85r!2+{Jyt1qQL!EY6ack|glQV8%G04e4$h#~^l%@TfK@VbGa| zv2+9w$cGZZ9V0z{bXxz(|2M11a1aIt28?gyh%3aJ)=^x#oQ5ysHVG#^N}@?)#VbP zWs@C6=ST7cvWoExItGkh9RdkZ4?se%bb@rJ=)Fgh$C}Gyvm*F-9g77x$_s7iTQ#Lt zO&lvuW);pxP-;l`Cm_a^3ks%)>^WU$=sxO#>;!bqvn&@-R}187dy4`T*N zlBnnS2#gU^))ma9Ijrvh6V2;wh@cblozrzLKrD*@uysLTo+Q%)An+{KBf*avXOwd9 z9Ha2l2*g>vsLpi^UJ&ytr8QbB_HteKV(1l;GP~568KdGOGtu`eHbFiBus+y6*uF}e zSRK`LqGXv;vVslX!?x~uez}oc>Sfz-wP`iD_dV=yYu&WhLqiXe)h!Cod>Xjd!?tT^ zx4k;+Rh~1{b(Hypvlz$R1*TaglhWn9q?BB5Pc?C5lbm7KDjqd!Mvk53l}8VF@a4x4 zJny{!0<(`GK{+YKrr7V-3}dTFd((QJts7SL6~j-*W-mIo*96iroofoF={wDg0I{t#JCKkf)aLnaz?VBgg8a?+#B$^5`LI^-syE;WfhY@%U(7iA-H zy*`QsRaOOgS!g0^+n}N%%PMv743?qmGywpy(3k09jM)vrCPVFzn(dkd1WrvW4(8z|(PGXpYq`(6o|n347N4r2#ww%4)hQw^d>t1~-hM(K;5Oy|Xb zu0ag)r0Q&^LTt5O zJ@$G{mQMsgZrhe-sO1H9v~X0wgQFu}eQm)oGy?jHtfO!Dlx4;F`6<_rpRwK7OcstZ zkMZ5FJ$R%=@25WbC3eG}ljCC?J?+>~&1V#a=lQc04;~rv%3|71sbpS8w|mZxrW_qj z*tdIi#Ycq?^h`>}WD@U{Y;nZSU~_k{zIP?X!6yU z{#ltl-+$%4yw$F+?s)%8?-6|aRbyXelPQbSV@}Q%6gj#+`npcA)#2|B_ny_lFfMvY z94#BdK@JiBHXhf(+rp!FgZgTQKK0p}wkZXIjtr2bT1`7BkYHU|vJhoPyROwd=S`4*T-}UGUg;!po0gf< z3zeE#H_YdiSbmXJaY(j1Y{4Ir`x4wUMoGNQxY}*M3|_s=e*oxG_8$Rl2V-8NVgWIE^Ad^*vZ~^)o!_ZL{ zo|j+z49`FFDaL-3RY9mq`e38fOXGVMJxU!hNitXvkY(ff;?U3$xZ%C9C@BeCX|VD! z%9F2Rr)EOmMj%EFJZlc#UbP*ywi^d4X0ha6u88TCjyN`CIoOQRM<#KRY$Ax#RgJyl zFv@&BU@598^nu$apC@!RmrtJZV}I?(u)%1(>@u0QD{ZzYO38gqk;W5O@R7IP;>{0z z2$#(nFd9qSbbTt3l<09L*{jAfNHc|imka|baKqC_=9)=kECRa@pt=c(brmuIMxsKY z_dOYru?Hj|$r1YT5TH?LEDACCJhub~gb30`s$5Q& zq~?qd0IUzT54Nw?HV&g0S4+2`_lA0iAWS}+bGPldz1_3jZN!F9npv0-_ED!Dii~#O zspva9J>u2Vg@B%SpWU(^1I2t!UkAEv$9w|5+X_(1L&4EZ=A(MeeS0fbMd%%-9wpOj zyN=T3%#KcYbbiY8sN&P_J>&9b&AuH(A3Z&ui&nnh??m$+hQMaqakn36Z6hP@K_;Rj zWw~K7pR(UK8u*Joup14VK9CP%ocK&830SCWdJNa=EoME?E#_oi6k9En=6OjG0UJs6 zy3xw_#tcR=)6%P(obA3#DO`pjKL zOl20Mpo5QWsnJKdi?k~3fXwkcAXqn^_O@vpdsIBQ|IuamLjK-U=v985Jw-)mAE1{GCE$a zDX?(8-mu*^lChkeoC$nftyXOJNiI1Inv4fAPoOF*Mldo}i;~wK+~>`=Ug7fQlDFS`#(0sjIJ)5M z>_~nWMdmO#s>*S8QsAtY58BwYjJZ{DHJMMe0I-=Q_?+F|^Yq1%L(O zu=gYN*khWGd0A*-SJ+aE1+u_&o^gG9%h2y79hn_h9Gx98EhgOE_3WElkTe7Oyl1hn zG@+p?rqruZ65!clNi`*2)7_q7x2LrkjHAFQ6>Y<)!mr-<{7^sgp*J4zp|Agh!0;da z!B4Td+oyQ&3{rv=)R6+CKOQ z>3PwV7R%Us`IK#5WMX0&MjqTVe9bpia z;Vnwl?N>ttJF=KMwyzt7qpWUM^y@Xg*+bvb?+0Fd!BE|wV9yHov&!KJ^Zh*eTU&QM~>mq#~lDY{%^u(Zm(OH6IUQi?e9BUX2hg48M z#Nu5AE1qF!@w%S$DJWq~kX;I>$ps)C5+()o2$UAXA~x{KGBQ`aH!57aAxfO9E)(!# z{6Tss*4LMLrZfQ7C)ZwRFSJa`k? zrKQUy(dvij_tX!AfZP%km|~pMddPv^>wI1?%aHYk&r7n?d*qWj#cWAYSpM9f{&W0} z-}ZZS4!`T0Kf)(I5tyHxaqsL1>ngGIcb8w{-B150&CR6%17jP8p=1o{^Cq6}aZKZ| zfJ;Y~m}|zwxzfOa1>=2eh7LuE%?5&yg@RV&c&EA``Y;-be1g?+p|NBz#4v|$fME4V z_pjJGHqXVzj!c=z&hK6HWy8nhOOsU$33?Y8GqgI#`^_DUEpub=SMTuh>3d{_k!{H# zQP?`&uU?@tfqgyj_+uYs_8Wd3pZJz8fgQ1)X_0MS;$r2hHm*XlwKy_g*8h&LL{z;uJC&d;yoLhRWcX&~{pEkwp+i>sg#o_;nGelAlP{4~(rBMR*vz zyh|n+#wK=~yFM0aBe2=ljGAyVyg^$Cg8;%Z&jh+Pb+19K9egws?gs*690b*E%MMH- zyt@BNWsD}Mn!Hq)WiDf=3QQ0ASco~)bZzXU5C{?c&|<+zS3krg5g)rzp+|#$qt9%J z6Ps!cC3)zzy0#|-QmTn1WC7~s?jQWzi=t&v`Re0(I3 zt{)?f-KGRU4waXUo){3Xi)i|L0LX0c^3BMz$OLerVD}N|1Mogc_WXg>a3F{PhvXA$ zFj)AS zT7)@KsOz?kUFR%z`F8s)n2c8*o-#R_(lrfk^c3egM~j*0{_=j9E+l!hwjlUDWj4rA zKX_PFQ!RAo%L(83^=~rIC!8NIMfHCE797Zw=t7hPKJF;*NrcSPE?l&c(%BId!x{&uW)(ceA5z;9@by76?S^2G8PXLbt8)i~=K;`IO0|pl)_-H#^Qw ze~RI>WOMVJygXL7y5H;>O(u|YCHfMT#B#=@}%zdpCQs4K7zd01z2SfG*RE4BRPfQ{LkzJEw_`gz784|lFK)RR1 z=;K$CcZEP@4ykWLJ5aB{7MWPFXJ0>Ib^`CcTyuF{(+`!Tg9H;3S$o6wdZ$F#%tY2E zHjbA9AEGJ9!Hm8zf!FTM`R;G|kb(&Q{9k*UmsholrRW1f^0_d&@Aplw=0k|+jE-?q zIF?m3{H-Jpoa()1lZ>Njp=7n9D0uv$)dKkZcuJ8uv7PU-y~Yq{5aT!c7p8NUSWC`k zVnF@q+mHG4KmHzHc<+X@#gtFHd7tCL@Xa52#K&I0!06cGeuYBcv7sz6&X42?Ge$6Qw2TB?0j@-!zqg$Vg{o9iomjzLKj`@uz!`>q z5IZg_T7gv_;@FU0A1l^QWav00+(iIWM!X?4V@T%;ZHbtinlAp}?I_ljzNYJ$kQiI` z0Mvys#m~1r{kmh=RZLDS<-*WT9etib*Ad^?ie(auKS_twAiBGQ+nYfW=BjbzeMz<$ z$g7`vtjVzQ&8*iMb?e3A8TwwpbLe`4im5zN@EX>aBX^GjXU7#?9wqBRMWac_&`>=x z9PcZxYZ#sd@WX$tEL!Jc-{=^cZB66HXqufGL%Gd?L7#PQ<9*&K*$_qrTqXcq-a>=c zD21DVwK|S*?9!ZQHOJ>!855MTV&pr$NA%wrL#Oe%Zbt?nxL90P&IwdoHx12TB)wNM z=HQtW1x;C!$CMWaNuRp|n@8sURYj4D!4+k0BRGLbfC*$ifyE+#q=Ze2UT-`YMvr(g zNnA497n@T6P%8Ixu$ zBeG<`MYfJu>f5GaHl4&E9}}A~A+$_O!*Nz&+fK>4_y{t)a>D&LUM0%{f8_W4E`G~@ z`n!4j^qOz{rjPN9e(BHU^+%^-SLgG&WK<^9Tt9zGHJPz^eMzn)?q7<+moKH#I14iIMOr`GnI9`_m z$TCJXGCQ)O!V?q0CwVksAIZhMvSQmQT`n<>V^~mT%Xsdcl{9kUgP1xe_g~|U2WLF} z>|dc>KNi^Uhk#ED&Y_FUo!eE%`;XULKYy1$|A+nyECV0^rf(IX5{!%M;$dLW`#MPr zH5cmo91oEbT?o;4a2O@AA9_QcMPIR$tf%wVwNb$#ZqyLHbDf&8IW~E!k-VfjS%E~h zmDT7H1SA54xQ5mPMvOqULF1r_8teF34S`;V9Itf+IE?bUOYB>(wW%!%to9K|l1nE* z*lL_G{TO{8T?Dgwt>b~j%(KaeUi|2`*SKyAmr`yy_;x{@dvXD2u@1F{WCfsf(=-hk zT-v{~h(2?KIFA~#_?il+@>thJun>*+`dw_o3}gbTt2q8+B7Qe~a^9|1a=Q{)S(|tM^CV|H5bZ zgY9Rzi4oE^gVMG-?-*=M^SjyH$j{0V&Fey!xQ}BauYyTdXwp#%*jRIQbIaprISgMl5#irSFx2Z9;7waNY#B;V=k8KzvZ$0x>=1&E zk!?*;jtt(&{5G?>9#vJu!p+%~2xJ($5gTM$u7S5{$3w)fm1+5i%bg^HT8NFKlJ%DJ zBj(eo_H|7An&p)!^>sUFf*HhU8?nh4ImG`C{w9fOafl^v+M2ej4kpH8RVC(ti^+j{ zFR`Y)(LweY0n_SYUH^kg!;T3{qt(pFDB; zK1Pc>o9jKAdJo=VavighGS5#Ith$;=7#PVwo?}B-OFlcB%vc_s@WvZ&u-YT9x2Kys z74wt4WC$&J?o`yRuP({8xD3&o&9AYxqu#H1_1+BIk9_JgYpkCMv97 zGa0OhFp4#HViDV`tq0zD_bGko=w<#m5!PI0l?Usv0!D|oZxNN{Kr;t^= z|L${{vMbTb57A84X0g1Kgx=dFBX^xUL_#Q2Y+C+#MHU*AVut& z5wn6SpL6zL!p(li+wZT~?i^#U&Tf*7I7!%dt0wy0WRf&#{2IF0DNd+0Sahwt@ye9% z|IYiIoMimSPd??nC#%THG5+A)M8qsqG*2g`0M)9@B$F@X$CEMi^3IUI&a|2_DGRF1 zF)4G&!fJ15hFha~n@?LD7=@{}L^+-Jq$eD&TvzU8ft z@L+KyuP8OQaz{TFl4h-Jqn8=Iy7zG`3qAX8q-X~%(Cg8wJMJoxibY81T!M52894o6LUK8F&iA!Qn#~TrRKSJBnyOuU{Nk$aG?W}N` z7s(9X8HVVwl0dZsAQK<@UG${0evAy*A;Ex3R!rb)dH{MK@=OVX#+k_UZAq^OW9?~I zp2^aYPXcc4aFbH0o21YcdBYhew$i2rKNy;QU~GE2dX(%x50=6fbQYW&DDxF&(lgd2 z-PS2JGMY3y@_C7~OYMu8+I6iko|~tE<5w%HdjpN%>oZEpZvuuw)=<7W<+z@5*9V5{ z8piRzIeen`3{6X)nob^19!PQcKKfo64ryJ^nu8&8BTq|#newC>Q*#ZGLo$l8pmM}x z%1S*?5>jT3B}w|IfRt%r#Wb=8H9>t+Q_u2@c~)R; zrgIR&K!(?v%=jo#cO-CMOe(~R)_&Mb_l-#nGjB*~1jx8P8zLJLU`(dqaRG(^p+Wa| zL7zwVT4_8JAE;c=Req z=O=2^x#>i{b$2fw>smT{_$Dr&Bw$uYhxf4o?CGJ~D@j|$y)(FIAS&>67#c`EP--4) z5kz7*=DN3wvBo+W2d8TxHX6M=?*u-&2$&Zdmkr}!s3w&db=Wbksmd9dn_#W{!33&| z6cEbDPPHi|(;G=)^RmSFLco^%AFC?b9Q3WEf+r8(;^d^_@n`-5{pO{B+b%>lVCac< z5{ruEEa$x^d!D~|!XN*Ae^9K+ulcrbV^%G&Q^#uG3AhSlgeNsW;&HMG^C=VwAR3}u z6Pd7MjQG{MzQ_cOA3WuB?Ybb_7C#y_qcy!r)*5}n%A!nRHOYH1!d8h17Ju%f(iqh& zR=|MH?Ld}T)?tWVVa`TYtoOR_wDuhnlMEYloev&*dF+J2$eAln~$N1a7{jc$F{y+aSu3!C) z{Lla4e}#wRr}>Beg`eOz{%ij(|Hi-ky?p79|A+jpKkz=^^5wt%7ykF(&#T87f6xE? zKjn>&{`dHgf5*SY&-vJMe&>JipYpc-1b^Ru?;q#;zx89>{{8Aa^LPHe{{TPm z`~Q9Z;~%`>fAnwsCjQNT;d}V)|I~k<-GhIe|L4E@&vNvI|APPHf9m;1|MBnU+kW!5 z!tdvU?St)SyD4ojgdj?EIXS`@dG@HoOt1_#E=+?Goq83vySB!K4rhX-CPjd4R_B++>>N0 zH-Y6m=k#>J{d=dJRq*opmAVGw#Bx{nm`TCos};AKR`l$)AJk!;Oe(q*>DrruXIEQI zxIrL}5*RgsWJSYlKCs{ST6Ao-EkoGT`y(cz%tm^z!7!OjCA*{}cGdy}GU6-Mu20VBYi{pqIzloNPla3nl7E!EIplw2CVn=ozffXi(>4*@$`0|_Q6@KxfIb5~v^W5U zaTMEQHk%2=iiWyM;E7C()UgD`TY-Efv`AK5`pINU*7tn|Bcm>->Rc6O@7lzXS=Jior79Xm=FIGWF8zI?sfP+VS#DRQ&gaJ^n}Z$5(| zV0|ne=gWczXA>NIoSpFadIf{!{P=>C;{^}zpD_A;G}|2wMq=f#T^i(yJWDR_3d z=kmtm%1UX4+g;1e-N3+(?YfO-)wQA3aXaRV33FR;ema*C^XI0S_-K-h1~M zgPAGVVYS|Keb;excA@Kjx8I9iUYJM|H@U?XGkM#YyrCVufU5bl#14k-cBHi(bNS6V zJR{B<7DdIyazZsdV!E6}-@liadGCi78PD_kIjKHStwAhqJISIWc_Vtpz{-`;M4S8-DP|UhtEj?r53>k_7Z%jAJoau_TU` za}~zZB4<7;qse(cFpLL7CjrnWiy8B(q|BVg?*8qM zQ&oX7`DJJ*RKf1~!t-nX^pAasAN%5SNhQAhYd*}qMa5B7@U?HfBD30F2wRlE850gn zhDa_7*aRZH*lqc1U-$w){DseG9Q}@ue4KCn$VWMw%mp|%nPXCn`pkyW({>{+2N%u7 zb>D8~u>&Qgl* z*uof+ypCkEGQt>TizK3>IUR@hF0P@xmoMaU62m@5 zTVfJhsUJ<;R{}PROjw&uaCREQ4ruWxSy=UkH>H?l=su6lS2Z}q_OGat|Dxug(&Bu4 zO-v9#X(SyBl8#n3$5?j=_Q_prgnKb|ri?C}MhT2YPrDFbP2FgNZ<mRz2?(SfYLZvnY23>=h;q8{7mcY zG0{y!0&WN+S;*pe;gftl`B!Ex1r=yNTwK#9Mw-CKEGG|%Q%e;2>;yFbd${}+Bf|AYV0xAT|&M}HUp^zZq@ zeCBe`>2LnS{EGkCf6jmM-}@){iO;^x=GXr#eD~zX_?N!_AL2jwe-_18Zobso> z{M!GQfA9bGW#hb8FwJv5*gn|43Y%{1yoyo2>)np+exPZg>jJ~r$N2NiF*HLoG9Cxq z-jfBZ#lW!-oKG`#1~>bGwpq&*GIxeYr&E?yDL1^e|a`+Xxo=EaLk+PY!6TxgNDx?6Ek&RE>L&(&%}+tyIz zERPpTA+e6=S5Q{0o1XRUnzrs3$H?+=(tihXV0XP1BMJ;%h*HK)H^`in(Wt{(s~Zzy z3W-duy%x=ZXyiQvmB%1zd-5QO=^|;8&1jomj}Z>60~<$md^aSs^VG>D&(?w8XMzhZ*Q)-){AMusLny=^i>10QrD(a4cJ*xFk3D-JwF$a zHD4~YnA>f)y!*~O+^+64@xSrtKKG91l5*Z$Z}G0;cDv*4_uk>^`ih~`M1AOPn|OfQ zcSUDsS)}u(&h;=3dSrR7>m`f>2fIoW>D`Bpedrl_PnH|zi;9Qm4>_MyoGdCa{|rtB z>6^O6l#bv6qZwohIm@T)b~~}3A`>A1n#dwWSPSm7KuH~O$)xb|7qeK#LHi}}FE27p zqQj69)jaySZ3g+6xx6BnjxL#cyExm%6h|LBp>?Q5<;Nu7g3+l9{KliRnC56RC2Zyy z>K@*0ZmCu+r+KN#|M9b$qh`m|-HLq3I9*g69nV;A_mo+w`1#$YQ^9$&*)c5~t8Got z!X}epf8QCJVc_9|2fTLwoU+`?G(F^&-G0EW_pH{n5+j$>p1Vz8ep+$w(TrW=>HCJZ zE4ZvXUS2n}-g17n{PLs3kDWfl+x1Qb!tr9kzUf#VEqQQ$ERU1L#POj=5BcGr{32J4 z;d;I2(V_%D^77_ZV8_wfg3YiK!?Ev&L#o}bX@J1Vy(L5MWVSy$udq{t?Ti*Oy=_?> zPk30(S=y1CO{Ycd+3Ac&_a-q~J$GUrz4L|V^c`G0n6uvBQ7tD}({Qkx4*XZ8f1|-S z9o>4z$;EZmQ->d8VGn4$qB&-k`vV5SdGJJ1jr26WE zDQ~`UESYM%@A;eDRQTnK8Re|f>kHT&jQswN&(A5cT<5AE2eDT7+nW7mOP|t{C`z)) z46CteP^yxWea2msE-OAdA`1uBfIM4BQRV`y4`$~gkvIew2h3(`84P2zkbH|eQ!m+*zi|=WX~r* z6=-%j?hyLm8ApK|2~3JfrAPBh>4DQSlZkYm#xQ4%Jmd;fa5|rGaWq$IXOwkV-hQ!W zUGKQKx8%Xuu|BtY@YF+K*YwE?W+W5{xG+Qz?fu&ofA%Nd=0`sFjJodl{%?GXuYKbl zx0hGE@zw(+agKc-fj)eS@J^Br4s0hH@A=%*=luCk{}}IIKIXykIp6&?U(eUR@+$M9 zjI6WFQn`{yw}O$8vKYt*OPM=8^1`vH2ih(~*;eOS*9}+OHLLAPCdW~ZCOX(bHWl7D~+t=D3uQb{Lv@Z#yBA&CP8W=Z_9d?#ar5 zENjKMu=$j6Ux+zW6s7i23^E%T5W^&1Z*ZiR`F^J6R;bzKj^Yps!GCIP~Rkk}GRvb2HR5xu1>(M&%2 z=jgL>p~rePP$Td$j`93jqm(yXM(a_`y|X2lc>anMr!Oy0?L!{d8)1mx1%@m@E@`f$ zi~@@y=3%5hki=|^-k2l_Q{|G}NS~KiL$ECJcn#(`r77gClcCf#jdL=GPk?KW(Yj>J zaz^6#ax|IYM#m7m*2qlAaHr9#N-e>FQ2}k-gfNkAW2_k0w#1A*@8rX$|Uwa zSvZ6{7*i5VE-5k=HAZsN%ge}x=xZp}XO=}ENzWO{Tp=LKB~?HWGqH-SDdW@nJ_qX{ zdF=^c#)wIz00N)FJg~90aXDVnyM{K5lz9O*i@u%SMVTX>!Pj(cO5HSlll-BgPcNpM~0 zv@Vp?vV8wV6*zX~&dm$V~JsF)J(lGHu znzzyQoY>bGB&(E7#>klFX|W_zinwP|W^wJ+`^aWZ?BJMu$ibg0b0OA)Xf3TZ2BE{6 z=oi;Zi5?C9Lx}Q9dq~n9Qq$ff)}tX#IW}6ckiHLwVGQ!)axq*?`ycmvX#{^yh+&uYf{K0?kKjF#W@ju`n`a6FS zm*4l0AN)hViQn|szr+Z@hA;e?|CB%VNB?$y{onTOeACU2_1%pB!N2!gIDPd#fAxRx z_wz6Rhkt|(P<`@$%OCv7@8y^L1OI#e+V}s%{ITEsf8*c&zkiVrwhy+i#&&sq$J9;O zcd*{I?Do+1MjlI^QJr4nNBTt14@8=3j-kp7^{%6}fpWUgL_NtpS?H-ICDUp`7zRaR zH)Eu~yJAl6qNaFSj67U8rt<~suIH|8WHMS!G8tQX1N+|d?z86tDuN%WH+$}y8@jsI zBKP!U$$UOhQrp9a_poItL;3wMDp9K}D*l~iJA+Q886$tVNv7;x(%+vgCA4sn3PP&g+5rpgw2 zPK2nUKb3PywM~>!h%uDgL_K#0BicOA)d36YR?aAYdf_~xE{s=l3R-}ReK7V(GGWE8 z7-eJ}3&XBy@dPad*V~;;F<-oRe(=S(xw*nv*zfl|e*Znr7CBW}2;{oB_X;nscU-OR zwCEy9Oq?+SqU}C!lj&k66IxhrN6PjLefY3+A3J2`NlDk6BSK$;$474^H(2r3*dwR6s z?Boc1BMH)GXeAjkMjC%Dg6`ixlF9adY{`Z#`+5Vl=V*Sx@yU$5OcCaI`g)|yrpy-$ zF&oNqqTg3pq5bKHj>#-Lh*oj3c~q^gw!Z$VzEYo{)M?kdsG4bcOls4^w|JbSzX?;sTPU4!ciHg`SE zxM7-k9?g#gF8Tl;|L`%N_~=7@#y7VcR=YJ<*DH2w&vG`S9t_Qx(fRDZgC`}VCHgjO zd;0B;vqv+AZbvma;g|lRj{xwOf9SJn1em^&`RmU-nQ)->HM`-C``Ho8iDO=kOy&b; z4-3jK7JpL!mO-Gpk`2q*l%gs$CaGvwfnjw29M7lBXA{QY1;X7`dp&QoKybLpjB2@v ztkN;iXS--jy-TdMxWd-Mq|PRZmEr(wWW_*~D$9^Nolh5yTLtDUPaU85mIdYUz&p=Y zY}OF^5u&43fTGRqZoA>d@WaD3CZE&0~(DrmDcKm6A_zVzvW zv6+w?6r?Z)c^DlSL=fc-$Hx=yom8C7OUdI4=NRM>)v?~!Dq3fYidj`LEh}czsqVAh zz^ZB3Hw~XSdxiTa$6Wb4v4XlTGBW*;5~Rj(@D6*q+wqq_^$tJu*(cnr_k8__?(s{$ z{S#bW-3lmt<>Ewhp&>CyF%b|lha^G)jW^qxzxsvG^8=sxF?RiiZ~E|Ce9uR|fmcp0 zC~O>S57Fg%l^BYU;iAmBEL6zlc8d#^$_(7laaVVWS$}!A;d*mN*KP?zDhv#%&=?PF zS1)igft3W(&K|n@m?+a51l+dKfY|mlZ7POvU=C1KY?1_XVD~vpVlt1hyPhO}eHOuo zvdT1Gj3xpUb{JziGH{TV9#~n1kk|=w<~b{V*c?D}^Ok-M@pe^wu(D(V+eM-GNt+3TDeJ7GuMR$)Y^j_{ik23z)qzy;7n#Ra+~Sc zdmryDJ9wpkKRl|SnsYTQ7zA8b6pK?rw`JEim^`wY|G@A0{ro@v{olfSPjC79pZ^W~ zhF|(!JbLvUSLPTq0W(D7bvy9I&wP^g<@-3_LLde_3~^1El`dLTkVBTjA-WzD8cAg( z@rz@F*i%K8>1TbOc^;454D7dSjA=2+e^GOU<-qO_nhRQekJE}*>?nxRVNy!zXc9== zdu)hd0R}@Ur9-aIwHF9!D9agnnJcL<%OZG;@nT;25W@tl8`2nN1wvl?k>%+Lr?0$; zZ}*t4#$@0MCvYy1F20R_O801Hfe;P)#kz*E^B6Y@08Z*p_VpfTVsfYrshOJxscT4$twF3w zqNLM=$aE8^JVq1w6sQuP?if?(f$seza6n^^f+J!wyUDN$h7egHF>IZhYo0NV^*9I$ zj7mOXBhjlRAS@3XJuy9G)-%l=y@!S|je3Dzjxi}DO5m$f$CIb88WMkN04zt8nKWU~ zCfmZ|P5z!=`klP}`a}in&1?#6AZ?R&h(%=Xm{`w?tYZ91-afW#Wh6P63`0XVC|ZA0?=+AZA1A}rZY3>$pE~P=X!^cu2PS5Som&$&^u9VuJuBo|q|BTlk-Pa^PjJ*cp zeiW@anU2d8^k6(LCYK5ulAn}||DH&>v^9ObQ_{vw-3t73DK~nMS5}mS7>F#cA<}c5 zOpQ}atcx8~7(vVfQujuSd>zyC7cY2l|AYtk?ok${QY_zj=N);HHI0Bpfj>o7l8Nyp z4S4c@8V`lD7Ieda_kfB1RC%6hoSjT3jKiSBzDPqh2j3k76zakSIv<&RckKo<#*Tjv zqPW}Kk@*nK7;{aSlKL>8rosn`B5-!Lq^hPoeg7Ii8Ua|ldQgE;6nUJ~+dig8>fA+d zGed~yGo)e(n|wMl(76sNraz^!*eILC1f>fOz0&M-%orrY?7Bwr)7JLf-rZ7WNUl>F zOOet}mZ#?|j|NJCgB{KkERW}09F2skr|CEJo#WBNd#vv^GHgAsjs+4$sgmP(IpcbB zL)&f%W)S9ce6*yk_mb~k-wmw0E%)x9(>8|Py5V9nXSp<--=A`HmUDgU>2?8n$D{N6 zI`%KV`-IC~&+?V~ERRcG+}=|Ao|DrOiW%28mb<&17Q8pBTVA}VsW&ats^sO(UUI7G z%*jhDD`!;mp00mM7#-93OdaTcGz?=$;UKHZ7->Gw^|{qMF{{K5@?Gryzr4Dm?l=|t<0Q~yBXOb`sx(E4h*-~8o&_O+L_1-1N z_biKJ_~Flgk{5TcaPQR%9=-D(?|$}u!r$1;t@FC;JD%28T$q~k<%HeX@b+rWvvD94 z_HP`xN)KE{KA%#|EAqtJ)PlSlV(p{@ySyNlcdtg*xDvPA%z>nhb8S-^v63qr%K1+V( zk#%IeJIEOIUmyW;A%gY5$$7!IeCM36|JID!ulUqY^t|(_f?-=yxjc^1y+(*Q=4cR% z?5oAeoHt%M<>A?clX=CgEGhC#^F-bD@`MWkowK&9B+Y31*ts5nmv?K;L$95kaXOpQ z*EQ#h37fhXvnk7Bf*(nqv1*$yUqkQn1D|@2XIE?9IG^)tzW3{R>;4&E_}pW16WMq+ zpn}YhWP{;AL}Cc=?)5c)_9uUgAA9H10{?&EH-0PM{?^Ainam&+g6R3$4u<6Vjqn*m zL9QY{{?-ay+B8x6wW%BVIqvI5*Nr1JZ}hrwfH~s-^hmrqLMp<6bnL`!Ffy>VnGyT7 z+j&|Ql*!xc@Tw+WJ3%9IG=e7_WQ%5uO`z5Un!4iXxTKoonxpy5b zvnMmTSWb2vi_lpqd$D}Pt5uYJiRpNjortBRal*S1r`ECK}=r$@YYx?oXym|5og;yJ8Oi{@?vy@ZOVac|*PR*6V!JH+&SAN2ZLY&|IDuju-EJmfL5ar*9fU z*HKL?hHg*abTmVtm=5fBd)lUD#OR!5#>yWJ&^RKmSLev9QjGbgZZQS{o|4jLfwtYz z?rQv)5<`=5KGthrBBMVxm9jiCF2_D-ZPg8N4ev)Hn3m+lLK-A-gUKWpNTiSwd`g6j z?7lu-$Ie)RP}BJ_#uOL^vRna2QkgVeCzktkdBoR${nzm3*L*8?m+vvQJDga8x%{)h zGo@g0R&e&J=j`DXpZ)9?`N1Ff5w2G)-~02vmxr&uN?sJ2i`xR4AxiK_9+O(fI!72F z!p0_f&lx>>{X;KS*)T*<&WWX#6N$QMekL*?`~IiLuO_J|qDmvnGQC$u02`m@vUHEi z5+F+avIMGGtmN|YiE~+MvUo8g6}ptb+g@vAunc%(56mTiAju_(Ss56|mVgu|2M8{5>@S0BqTo&f1)hITe8zNg5YsAj$_nu+YoG6dE zsm%_4Sh>92#t5Fpjx^Jvl1x;p8+<%J!DGYUq7=fSTC)4W{}cb)f9!w7U#O4yr~d8V z#=rUZ{rC8De|X1}=0p51zWo9JqtCzK)&tWE&i=W-k9*yU|KPX(4%X%Wi2w0Nzk|Q` z5&YJtXfxmb3wZO_e-AJI{C~>3pF81~{@sB;^gsP4_+!Vvj{oa#`j`1V|Mq+Qx_|or z!LzPn{oZH!E&uvI$shmSzmtFG5B?YY!e9Ce_{f(5tk3bY+&y~JX0*(zGE&{ghE2WFU^bi1 ziG0_Qt94DY?gY5J*zLI8543(@*LqglR#Gu%qZ#aAJwwPDqcN>s_qGYN*ENP7L(P2O ziB>(EPUHc!-R#-#N0~GZA){`QUf+AmC<%B3M@Ekp39)lJGU6f#HI4#a66%wvwue|` zMxP?j^)NB%LrD7&yO1&(bc~Xhq(m!_XUKam?zmaiIIWTT2$;n#gutQ$y*HX-C8}#O z9JfSff}|}8II$)bpwNpl8)L#}$t!E$)><6lg9@dpDmgtp6?<*JsUrt08Z~I~fcM

      W?Esl8q-S?&Oe|~w(e0e5g^S8hFE-zlZ&@tylj&t)^v}z(E`hX;}MDPTC z^bs74wQ81Vw~>YAtQ8|H$i!D(UJ2+L^|JtvKybfvigH(H#k-8<(Nv4h?RHB$4Cy*H z5m@R+Nk6?L6o#hj$>aex5%^F~Z*hcuN+T0kVuJEzol=0D_jS*NoOzKmtEQ}WTe^0`V!6QKuw%!`@s#~mfLrvgTLtXs#LjtiKIipUmuz3I zxT{B2&B)A;>~10aZ8s?Kz7BhJI;)><6PZ&c>34*KQL@piZ8W^K6M_B>u&x=>-toRk&L&twZ6 zHg(a<`IM~6VzH-`s)1&wgg2QX585S=OA%LN+d&z&hu9b8- zdITl^kW~0%6%;$~s z3l@_p&8+6$a!#4mEN2CivLshJ6m)*%C*OOx)CJql`t0?Zh7^y0#?@+_SW_bkqum|wuV4{^kvG{HB0UJlq+&Z#Z?^rBLj14MK z>coU)Nc(hPgmGZhlDuCarEVVFjS~Rli0NQ@&KNx~2Md9NWGbD{C@b8x)VCeQaem|8PMM%95zr-&xb;y+W>dkPP}sP_N-VgD5Jm}Jvm5AQh=5p4i>hFf zJF;=qJ!*;9qtbx;kz7gvi#K^nJhXHHJTZhtg?1K`Pq+IGHkn6v8p;j(fV`R7vC}+| zWihP56QAp4bZsl(ecl-cXOMiqEGh-5j7E)3d0qNJM%(hqnuoxq-Lbb;bNQku zDUD%YjFgfq_IMXreoZI;RY|+2&atWYGHI zF|W9PG~;YmP}0$C?vic8M5)zTSu&l?$Xv(G&5pnFmwxEWvg$8zeZ9uGn4DcX*xtOL zZ}x=DkdfmdxdqXyr%Qcf0sEfHQgW71A{z)}#q5IQCa zq%}E~Ak_f2#1kUufyE}!b%c0-_sO}|#W@08oCi#yn&~*VoQn|Z=$iq*JY#Y37Q5^B z@y!;jQB%N@F=8ZnJ*hJC(h1P}(&yjjCx7@ydHUX$`1!x!`}o>#`er7xCArp`IqQC4 z*U2MR5`UYeMEPXsKYD2Uz-}1u!=U-99e`w#E)Wk-Kg3X>Oo)?emcw`%f{!dn7jW(n z;u@vW2JJWUX3HZ$J&Y0TQPUw4lQJVqChXBy%V#mXAvak%uX2q_>FA^+QlEfqo2&$M zkLvu#cTL`!K}{Zgo?f7(%<|Q^)ZwJYgBtZ_1ihD1Iz@7bOsO7cypkwG3Ui7Hf@&sd zjB3ZAMrQ6JI2XbwhNS>3W8=dG0fj^GY5Ew%S`Ic#1c!z!vZDVM09YnUg65~MGW+-& zym9_(`DH)nn`poA2lzw(+JC{(zwvMIPyauD597!G_xwkH?p?n2H~#bdEC1-%@y;Lp z-}A5h=Re7Z-}%4rKm0HLMgHC2`&+s9@BTmdar+JY_y48;Ilu1p_xM--Cx4kgn*DnI zr^hq0?G1nIcm50fYv1w_{;&VNe~ozw^}%w`J$J-f}Qn>ojGIxBeNl`~#F zt;oiP+ilI$P0ytk8#(!AkMUj$#a%tBOMPl*%<>7ByB#m~doH(oZkmSL!zeRxk0)ak z&(#x5FGF_cJ=J7NM;Dn-MxAeYhh#Y{mq+-*(Ttw`&5C;HXmPYY$P1wNLj-lmqNG6q z9V$8mxCDrlcP&~yE-_{h(jO94{Ln?lpl*5Wf@Crq*6#(32=s6a9(BX|UTIr;MD4%T zW$e!}i`$SRi)@d>z$?Xj2_s%8_|0n<|`9c{*#1BK@`1pwBVi}DmGZ{5X8hNx_ zvfggEy16FAZm80;?%%(!f4h2lO_5LJh31Na)%uQ1CcdQ%K-YIGz309A_t~sAJbV6> zm)9#EJnGnPHe6m`3v^Qltsf}l2}1<_KpjFa(@!ffCXBHolNU;+Ie5*ea}*_~VrNBZ zUrw+bQmK^gL^S6g+YXDRO5Hgxxn+{T7)t?UAtnE$WO@0sX_4UMv9VlE1yEejpddKJAeJOy?n;ow|xPY-2TW&Ti$xX?uoN=@`QKH>@PhZj(HM98%Pv3i~ z;wiI6;6zy->sq+I*|I2SeE7ACXpZXl40dF3anAN;BOvegZqMUq4M!)H0KnVZ4eNDJ z-vt@%_Fb>*IOH*jN-RZ(WFPpR&8DIEqd>l)8@al=6R20$TOPeS=fNu{eDU)yfkKPb zZQYA?=m)Q~vg5g@6S5$?k?+Zzv%c3BR`{fe=NzvQk07@B`MP`vO0h<^rNmds9%nm+70y88b z5g;Y$;PO$=+m{FEoOkLKJzJyL-?t7a_cd$4dcn=&b@X#5Ji{o;y0{}XTX znRhQ0AoBCS^&|YeZ~Pduvfwk9Pnc%#;Ro}0t~t_t<#oDam-*#-$6xu(r})7y{4ksD zmalu`O@8jzd^;bxcu0b8CB`+-ftnoT+7!s2}7e<_WNlY@Y?tM>InpmWW4PiA-T1%9*BxZOZF{mWp z&m!}A9Atq2XguDnx7^+;oFsvEsbG^#2ferU@c{J_&&O9VsSJ#Xb?f92dI$#z-2gTL zi6CFHQ7rE9@Oq4aVK?BLkz#5orqDJHoRReU!9~gWa!=+Ow#Hy{gUKPPS3HCuJSinNf~8?!-avX&dM^HN$F0HfGdWsWCE!qJS5h++#}1ZWp+EVmY%@%Dj%Bd++Ii zJhwXEyEae9zrT&9_PKRRryf#roFlHKf{m=0+(f@AfoC|J@9|ws zwH`uh2H^xG={Q}8Ny;Yr0QOz0wUN!U*gOo5aUe?dv|e*apk|DWs>_69#*i zsUgM)3|^qRwB|Z9+QgU-?8chcCKtSUddkVPVyM@wH&>c}^J zma3RVW}^Nzj&VohT#A4!D(0+0ilcvxi*0`&npj@tM~+C^4w1;(g)Z;Sr1vC)8WV zdvAY{KXUn$%lE#>w|wvSa`xy$Oo|2d&?}9)>7B-1HHkIfrr;54*$o{pR$Dcb&Zia2 z$sikw+!m@sh66FwME_qiiZxhNHhE1&uTkVVWi$XC68DBN0nA@}Kh0+Kla={!jQ#|GVEr%g=uMVEbTG^lVxj0asRmTA2#&a>xAcH2rcH4*5z*B~fD8~;rMf7eEdhUmav)aD+*M=EV@ z6&4E%UVI2^lyzVmu-pW@IpC#9%v0YyV(rdgt#ER2X< z;+)g|g~4(4V#m$hM&KqkPizAlKSvwAmd3VKoO*}I=4}}kk~YkBofXhO0uOZ3#Bkt*__u;C;07(Fe#WWmfUQgadc!jnN3+vr;Pnf z9w{S*u7S&!cQ6Eoh3DqF;n`-*M?U^4Wo6lK_W~V0^Zt9RZ+18a9-c2L^Ij=W=SK_7 zP%xX%0jtEo%j=rSNzQ&ZvRT)>_SyrU?rv!6k*19i`4<-tII3pyIe7csr(6Z(MdZ!M zWa22xKs$6|L@8Dr0U#+jU=$!GDm@W++-_^e5EC+kx4d}1)iKtcp&w#0WYg|g9vh|` zN7J^Fb>7}KV!Rxkm0aI#+4ZB+m8{QLOk#0yyXu(OjOE;7?4U4&{mwI+&nOE+v)!?n z-q#}d>gA0*NUAb+ey5X)ax&$;m-|B!8R09rO!}3Ow-Qt2saPI(`FJEhA2~U-ym)rY zr{8mY&7*TZ{Pl0}>A&_leRe;SO(1z@=?tvL=nvQBmVrR+M#z!`kCC6rmV{<9Z_nma zvNG=TIK%|i{c6kl=8n(}Vg~N3iT);7t5l@Cn(*-cDQ~@U!K1U8jH9=mXFe^IBDTHu z3|$LYv1Q~3m?cmF4&7ZsILOsWQnN_64F?d#W}ZhMo^bCYp6h1C)2l6`FEm#7Jz6v; z(E&mJTOHX9<`aY6VPBGkOp?@)k_N4= z?F&v86H0%^db{Pr zAG*)UbfQIendd5g7gfe$GNH%|0eO$_R{Yr?{{nyg^DiW4{Jw8|lVAL;ALHU=#%|y7 z^7@veNzSw^G>_mU@`4xZqCw`PqKlvO*(eqs&`v$)6W8cifV6Ay6L#vcie3o71u+bSj2sjs%vhHfMsw10@xyB z1$$uH1atVe__qnfvI$Ugv}Cq8BqHVoxGWke4|EB*H2^YEchgy9@%d5LVd(l;2oE0L z_H0%y!9))lY;1_&)Ah)hz9wdc{G$%nEC)wp#`M(?=?STM)wK))fO?(B14As!fSAZ- zs){_HQ-leHG7th?F#uKo*75P2#njTV$1BY${ywykLEwF#WQ#yQ5cVCzT@`&NgT>4o zrh(A(gmz%ijP2uly8>hL$WpQ+#(De*m+y}F4vya_Sj+}&W@N_Pbq8=!DQXR#{HUcj z;CwC+OU$Fyps4!XCq^G$0KlLW<~ZVbJ7}$C3A^0H9Vs>ZPiQy zTrS40Q8URZti^g0eWIL#9yHG?iPl6`%jYlnt-tm6@q2&oAHp(_xl%s2=f@R(*>kikI4T=_ ze@EBvm}D7cG19KC#g3EQ%mJp4K=wEg5*OtnD>V%`isdiiF-(RR>f7C`@x7S3XW)7n?}G##1z6*DSh8EmGpBqSzSmO-n~s~&u(V{C?2a=P=2 z2P`iha`*0gjJxaD-1H6~3IR<%bo%)yjJ!Ip2}g!6z4w?u_$6O3e*w`WS+hg^8|*XquW0Sw3*JB*x>sDfSWpr(e5795nhF|}cGN_O9O7E@a0c#VpHmOaBWCSTuQp{v*3XdUzSA#!z)N0ssMqjfmXkOp$ zJ$r>?n3xu<`YZ+ppxOqVH-V!erGSED%5{h~3ogsWgk$vdeXa4LGZ}8|=sL+Ibv;4% zw*bJ}{UHD0zxWII&;RGSJ|q*ODd2A35CA^?+xf?T`5$08`#Qeqn@;)UPyUct3qt+0 zUGW3|&wqyR{cZmn-hBP1BIvL9^rt_qF07{BKl*>*H~i^;kFjg@Gwq&# zsU3{V$lpr z*o#zK4PwDd(q$oat9nv>qet!HGLLZHr~M0}5XVK91D|1H5uk|}EJdCS&LzcDA)<+5x82Ef`RsJT>B(FjnRnlR z!Dd(E)eY;^x%=qrAL8QTl+S$b^K5rpY&n6<5L{&AO(rF~%|>jgOo>y4b~pAP3+9}3>XZB zj1h+vZCqdg8W@xq)#|g$^IX!USvBGA_Kvn|1$GvB1e08xgmg~Yrq%B<(b4DXDD8F- zuu2_TtsBO^6KG*`Lzx?;j9D8QEzSp}E?Gtui}MMR>9uC5*X^5{?Y0M;x{HhhE{n`L z5_k!LEG?v?akWur*N=k|5l@eo9M2~_xOc)wK6H=sV&M7HCp5-UH?4diPR>duvwVs7>VAppt_AJV!OxyFKlJCiW+tKVsu3v7b-Z=F* z&t6>NO`!k>`Frd-hAzlZ`|SLTYC7fp_pf5QP!U0K7$xW2?gHCgC&TNDi(@90k8;Si zmC1YN3eN9MIeRdbp?R}yxqflOX47$}?r+6@-)doBIw!_WRl)i3gkI*KQAaJ?#O7Au z($91Y5vdTET+AnsIr=174o#ittbbbrppvXF;g z-3N_F&t6nK&8(OQu9_-TLI9ko_8g=JJ{5(EPfz|CidB#3F~&#s&GMe(t#8U0XItLC zykk?_XvE%T5$|%*V{xo=c3Th2p82$=STrn7O6VL9Udj26pHp%2TE{ytSA6kvhG$eap6O=yV<|i9jb7^{Vb9QM%i=T&~uv_j?uAme`T^ zX*>`597lDp6Qk;ojz~z7;>7wQ`LQI`9-}09#4fsI{;?35PKa_Z3kEflA~Pb(72J}p zJI$rzIAz#38mB|oCV0V;1mZObjkcho1t&Am)sK zHay^f7}e!>j=@6KTNS0gN64Wm40bAsyBN|IoxdmrazPTn{?7Aq-Dobj_;5uri4y;9 zEBTPTgvugpIN&vR=M ziyn-ghZ>}g2sl_ z!t5ZoWCmOWoAo(#eGKp^te0P2=bvZ7=XW8*`kU$lSc$uV{96ng@ou!BwSv zPlGpcOfp1pdU+_=hOo_!`#l{UDjyMh{3jOm66hhQ8}qOhz7^4!F@{ zhKl!JZ2958^n*Nq@{(WpE3f$G@B1Dm^E0h$vnq(4y$^=Yq||O3udi7KE~V`?gP29S zuji90HgpN(xnbg}2qupM9WkZRdzZ#l7Xcw1lgBzK0rdF!Nd~H)ibi{uPzaQjG9z_(hUf_Rk-EKr1KAKrR^xBEg zqr3HvZpb3y?g#0E2kSJb-K{qaIQCs&wQXqn5LrUTYhaNF)S#|xM8?MmFa@L?Nu5ql zo?_LTraPon#U`eU9V!((4H$t?$v7}2CV9(#-veG9!@SJYH4DSY*lJOke2w%v`pO~Q zCCbw@Fqp?6Z&4!=UQk%?3@)U*oa_2)8R^DGEd)YKyykU zw346=!>GYD6CK_sb{8?;)u(+%QWyageW~u4LkKbA2sv`oX8o!Xz`Yd0v*5AOHBryuE!O zD=J|iSP|6{^D8p~bC%6QSyoIYQxU8VhlcZuE0$-cym|9dM3Iw|3vmuCmYIB}ZQIBK zsLZSgNg-rxHa%UJEVNaw#Q`&P1DQfZry|R7#t5+AS;N?l62pubiARbx`WV45M49w< zyB$?ovYbw7+FqQ5nU0WanM~D_T3Sms;*@j3$(qgz?(SQnPOV&H1bvJ9=2!MNKZ?5G%xIF6cepsXS_78RjA?1&MjlbL+(^1e!& zN|ZJrnTC5M8;VRrVc_Ya;OE}Ez_+hy_b}`uFJHXn&^Vqxo=_A6nQ_!r#zQmmaIMTzYXhIwYczMTE62+g-%R^GOD2J-K}cdPUKZU>dD%3X;y8Kze?-DE7E@Q)GEet&0sI=dF8f1^ABI!` zEnK=DS_L+vs-{w~Fs(DDrJ>5DB~Z?jTr0U|%E<)3JjKKm>k)xsbVONTIs)P{mHRRR zl|J6f0r?*?m4>{IeDrfO&OeB}-K=?YKL~_7be1?kRe-e~hLZLk_A8HmmXqb4Ebq8@ zYWeoh%z5wYhJ1P8)9WpteQLP-ykPyZM|lXPrtdm&OInVl7z)CXhXFbbER+`E;P!4U zB7cmh^kc!vG~;|WVLq$HJ-BT;-V6;7eakvH`pj^(c*3Lk6TW}5#^*T~%cTs2~w@Sn$i5lqHZ!u>ZIw=iDjGu9oI5gb8^tvw=S|uG3s3S`aH5hJ7ZqIx zrbMnYQ-JT0XXnFuPpn#W73oIt4vWYG9*+i-p$Z@(*Q6@S9<=_L>xfJCNiemI= zb##I#arFydE?Q}7mi4Rc6-A!b7D_7tFQ<5}5w}f0deBDJB$?(22??Eq-u`bOSBOB)w zDKprtKZ*h2==eNh4Wc_Thak$pFBg_pWi%73nHHMMX~yNGq%@#JoU4gyhEb!GbJ%jm z{Ol3+Y)Z4c=a>KVU*doEKmOnFXMg4UY#S$$@YDH}zvmBpn~xqV;^vj8g!LpRxCT3! z@aV}I{b9$epWMni$jdoe(5*^og~VowF*mftIAAnM+%_f7>|`K0`aw4STFcN;*2Y8+ ziAyU(5HS~9X?GMsplO2u+TBBBf4E5?`+P*}0V24eg;voX)k)B35xB+KBjEs2n}w;!X%JsQ$A>{{qsOz9|UsHUSdJYSqG_~GYUUcY?v54y4bkKEm_ z_?^G+Z{qCn6KaXxkMjI>c|qq5KBgpvc#$+1D^6co(~EORX(=#D4yt1zLQnvBNxaB@ zNA?))ICAJ(20zN$U0T+GB1`2+u?&pLpa}AF$Mg|W=ExeZ9hJDvtr`JO(|JNPl2S0r z%OGEX{?dqT(>+^a=#fk=E7`LhQ6mHGIABmr%PHED24KhMwDVE^$#LzO6)>Mvj4qdf zjEGU=hyih+YfN%isr1};U&8$R#Og%i$Z}mnNW+;3Mg&)P#2+YpiY1C0yD(AQT}G#8 zCPy=Z;>hgctK+NVtK+xgkm*l9CL4TF)gnG^w|nZsa=x6A6%(G{ZD|j^w0Sj3lh@)j z630)O<>FYn-5k<`OBXn&_k*<(`*Y_PnjSuPP8Cd|Qn$@Dt z2!4R0<0?qAph;P1Bf#+^+vo@=jzddnKg2Qmxa19cv--Eic*|GB78+;<0cCl zv?0jPI!0#%AU|?^V^W+_@#UgT%c9GqW;|I?0wl-T!)lvy+`}jn3u&G?JLT)|zr&)o zynXwI+tn6rYpDTNDwBsq7(7D+w8fZQHs*OzQB)OCE18%Tg#gfn8P@C%Fq|+yneyc7 zgy;uu?;qsndJofSEi8fS+cmrOp2?&lD97D)gPK_Cyp{>&(520Jl@-aptr5_+tY`2T zS)C|Ak8+u?}Wi{b~>jywDP{D04KQPbbnIjB8r@z%-J3GQYIjvd8+|Mt~0dH z2!P7c1JEBgl}064a5b^wzN#xj+YQ`r8&>;KCNb0bgwjLUcG&1BO!|BVsou?*&E|}K zN59`PuM3p6;wU-@yhF}inN*$3avq&d@XbAw%(0y2TyHwzSQrA+c|o2H6xMTjxg@NN z2*`K0YwCQ?VmjsJixt~uE7#t``oO!7M^4Uat{yM&s$jbwF#eXix3_Ff$0Vz%%S#S> zBTh=28_rIrm`YJjro4W+VhBMN-orTZ=;~A!8>c7dJpb$sh3W~a=lt;{+rxp`e2#NQ zT$)*n2t>29inEIeD(moiV7jd62TQwcWpgw*M<=c?b!-Q-^aHH!4?xe*YqqPAq6qA_ z9ozjVpU2gsIk&HyG`TM{=ND&${+e9Dd{XfA*%kZMj`e2CY*90xTZur{^-^N}xA*t5 zu*ovm?HX~yJ!}thzV^)^j>u_IBw%tFi0TL+2ie?AXA|DJIwKPJ{KXxIF{XHAo=e28 zC{rE2^98rB4W~~OkDghcf8KMuT}dg-SBt;^x{?pqtov% z3@bYRIuBXAnYu*fCb2%EC3wWa;JOx$(d`IHU=pzNPaE=3eA%p-_HY76mBNZ@IuS>M zv|lMB!?>|+2%R`Dk}!0PVH1vD5-I9&;>NOI;Otq&yWc4oZO8Sxr|pciQTib<*=&}o z^vAtr^P;2MxztWn!qZ2QpZS*M*;B)M*z%(<_PlvnuzOXrebv%$2de2@Him~oi|c#Y zAf*^bI7ZtH7IVDka0G!zqP4>3(sse=e8TzilqV-A65$&BJ&G+;UGubhhRGiBt;-AE zJGtUVw&CpJl8ciinMsU2fmb7y=JLHietpY7@T(v5!_RM7Rt108@AwA4^wB$%T3X9w zfxSL7e6c>TZuh)eAGlJQk6*puhp&Ikpa0P>qq2eD`Hi39_k8WQ@&3glY*gtpJi=xr zDoOeb)7bz5i8V&}63U;ERV8^@VYBp1ugZyRMjL+(ZNpE2@IU=$dcTfwHEW>AF;#_~ z7Gz~E_aS-4j~Su&!jO_5YYlmw0WkWW;m}Dmx9d85pX15N7ZHd6cM(O*aZ|xJOV=` zZQPpI18=`yaAIfl^GMX5;1OrL(m_5)NSky?SIsrWP?8^NC@tP25$@EpbKKNMc^${K zog$Fj6DUAL?2+*ZPnI>CHjEyIAfLP-3S2iPXn0;8<3yf8)^&)IG|vT`cFi(IV|{VwD)jPh(s zn|}oYAcw>qDlFtKxnG6dcU-&T1DQEO)3u0-N2jO~;mU^u*0*?yd?d?KV>KQK$*~i3 zlr})4j0o9EM2?)UA5ro-C!n~CBd(8F5rH##_6#mHf*Zj2m>Oi;9z$vYSGlE#20^13IVU!&*Z9nGaq%6Rz2WBi*NDRoB_iBFCNbHP z=u_izk;BCabZ&;qE3WUh{K5ajAL99oSNzR?`|szYZ+|Pb=MEhqAm{QyG-+`<%aGVh znNb8Jsw?RixrW@p;E+a16M80fNmWj<64UcUf(X{_Ffxoibt&gTN$->sCdw_Ka=&n(NJ0~*I1bs zGKh>`fbUY`AOjerJyBj?G+Nwg-XTq(Iyw<9r&R%&0=d^5Q8mW=7718i9bX+^9pcnb zst`BJp>^yJ2ioQ!;>+v124kWq_Ra~US~j$p_GrOWn9x9kJ{nvkxt7rQn3_6-dvk1_ zkyxBW@;osd1s|EJNt1{y0F@H^w?GjyYiZjy-F!)04P%u&lpsCKb7{RZvS7|LY1Wgh zy3G`UWFI$D1z#p0;n8xMXBoz3^6#8WFhO-(7)0E0BCcfLwJw|rWsb$DWC9q7_()d{soIW-VrW>=8 z$zCT;P?<6oImQ?fWVB7wwL{aSn%{g%W^*bvayF~@&ey+5J)iQukAIV!`+K5Ii}wAY zf!LsraS5AAJ*{Ne2Z5$r5o)Y8BKqCmzDe+HWh7F#x?8cZ9jozy^V6DlFXmG7`^hJt zv+En?ixV!E6{oWt=X-JR%*#MAE4VyA#b8*kcPUt46{aW&&kgtYd#vs`JDXEiIm6J( zqP)mc{3Vp7IGD05qGHdihDklg+QdiNY<3(5hqf@W20b{`=s25A@ez*9ANdmD!DeZr z)&`VIF2K!ZPYm)f65zTauwEVTV_=$ll!cR}74FSRJ!NPe(@9O^N5;@GVriQWgBQ+) zBFF-X@wJFcZZ=yv zzYqJKecy1u-m$|1hORek`;oj$8G?A`D#D$Eji=}Y4;*gP>z?<6#s-hH8v)OFP%3Q=Z z@Zz)^`yTv2kN-5y`wx^^5~n7`Qlffi?#l*ddQ+3xgU%{iAWzbpdc8JDix--j1O`R|86Uw1)<)0xn6w1%!*x(nBt}I-Nn$@Qn@BdOob`f~F+OcT@F&5xuYAzc-CGE79 z!%d*O>*XUlJoH?>oAc3oGakQdx!d3KqfZZ9zpCgSW*n{^!+sQj-eyH|oHb2y>Eam~ zj=!%uPTiARO&0SK$1?J}MI_oKO@foMlzaZ>&`GOqJHR}fa9&S&bTZ*PAG}Lh)V#dv z_}bOLN0*PNiz$Qh=&mEna@kCvc-}?!_`lDA8_51z5^K1ORpZiEyZbv}BJcA#0 zd#<+)_q$#q=_ltsuh&1|`Rxt!S;p`D`Y-WI?|+-~>GB90mr>7OPCyfDM*6q<%a%y_ zr+f*Ur^qm7BBFBDwUk9B&#_(G()xj@JIcIcI_~SqC8y^O9`35XafL-{ZQSTuWNSJQ0j!n8Y|HR*er3jy3NS4I2C=qS}C#XlOyK z6$}x--Lw6Chn{3q-zbUYfK$jO*4pG`GAf}SB)FN6n1#V!De|bXAqWRi{=2wUBKjCL zYKJa4ofNV`PVLNql%F6%g>0&$I|^7bpcBrOQ8tN7#)z{jvkD)Sh+KuNsX}r&2xkXb zN99FM07h|T$mcDhPg&%GFc<|ConlfrCr!RlYY}UsLOyqGw7BA2?6E4Xg_2?qBngl* z110N3!AD3$5m`ra1Z5k_iIl#`@8^+bMH&98;F8;1$+;;_z$Qik&8w9*#cEf(LCnj{ZmOZc-M>DNx40rfBKTXj})^B^=v5)ZHEze zstl!-k@iQ6Njl}|=)1iPWpf)6OSCAGh%L)qg(oK04VI{qpyb{0{uL6NuK*kYY+zB9 z7-`@%(txT7A|xR=jv8BL*usdAVpYW?OKpauiDVdY|BQ9SA;SduY$tU=2!#~(I1%fS zqKYchOtXx<$Yg-4EvW%n2H%!sw+jT>zX-rxqI%Jd0(m!?kpZFhPFh;`_jmFPSYCaN z?d=Wsci#o?gozl8u)<`x7mpmLvVzMqEAOi@n$O>^`3rykSGm5v<@f(>e-pp>+kQ^C zv92Adi@AW>(ShASDuq%Zl}iavEj9RM(a1o&Fv$CXPJ5W}Wpip2F>zX0@_a@=R|2m5$FVIkA$DPDCPBo^C|wCAMe#NoKM|=vXAWgUc_mk)0mi|jwHl@II{xugMt9V zaG)rx47o+f%8U%yeM~WHd6pgTD`^G0*3ZEFnC9*Em zAw!YktWp#}!0BV!MIVd2oa~K~Lol-xWJISaawn`-A4fX5kLc8FuffT={#({U_|@^% z@zpW9z%T|(7RBz{_sI=`S9H5J2|99<04-MUc;uEOhszi_x}1D^2#cdiY@DK$8)J|5 zP7Q!RZjO+6iU3KEOsNPO5oYSD5XD_0EZz_dvcMnRAd8ej9?F(_Qc@jxJA0ib!q|6DyL=h zoLSNhH_MOhS6&{F-Ld_{#|}NjRC_!vL~!}h_rJ%w>$q)p3}RB-A?>JpfdGh3hS8wiF?HkSyhFV1yMUcf@9xVl_fo8wDk@s@3 zoMZEeG|gP7g)pp4mb2UM!Fas1;yLQfNQQhq&E?z}+ZI*kGVL-tm&KSi5uGcnvI0Jj zA#ynEaZ=^1WfLU=PmD7c6F0 zoN=?#3Tt9fD#mt8t|IGAD^sGY#hllx1Jjd&tJ4{a*_5~Y4eRZmL!)T+(l#h!lq|w* zAtHwx;I8R-`D)LHkEZmk1C#*Um)Q*8mAt&Urkc)(CgXnf8aKitH&5_QAJ}j9cptEOthnDa$Ce&16V~h7t+Y~>Wg#14r|6HZ}&HT%5~>?Cqwb%#IPlwwHzL$)v=FN?d2Hh=4V?dyolX zii(WF=GqBM;$&`k`w($mhc7Ay+XJ9XiadoraM(xQs*bZ~CC#kkupW7n9eDT2lE=G_ zS3i35SJ$3o6&+GbQV@56Tm#CaCZ|~B=rWT<;pp@JHt_k#OWS5d~y}vfxv!MTQ2G z=|rIH%PJ?s(=>Z_`vb36J6_zbST%#(d#+|vzW(@}_bxBl>^Y;}WRACb$ zuX9INu%VnD8+V6_U^7`m4c;^EI=Y=9JIPZqNRV~ZQ6$lb4%H5fO`kSRHk0<{vFinj z?uRz9wNwPl@jZ+3g*drw8rlsJ1_%YHN|D}{h~M>?QA>0>n@mw-z#aB%KiQBkGI)|R z=)kC86j!_^*FXS$+<4mQKz$j}dxZHXlE9boRIn*DoMNRWy${kD7>^EillZ4jt~rRZ zv4n`iV$)iO@TL5UtXH7aR?2FWMubN>6mrPwE~Ilv)>cQZT_2-3rABuwt8pWBUSQ;J zq}Pdo93isHXKv(YBJZU*0>4ZL7}?<4Y>DQ7m9 zA&WdyKl$Vpf8o17;E(@_KTE9!X2)3G(M2m9uiO}M7+qXladPpDu$##57Okb8<r6g(<&&#R&NUKa zkt2jWk_I>gE3f5<6-oCHmCL`=7OXnnBM2f;XIUj&$`F;DV|h^%MG(%!5P(Xeqc(+z z93e$DP_CC@>gyMuGg&Tq^wG~s5z5Wy-(%={JiV;vM}K_g`Voz1Qfsc10TJvQ^-}MVjPEP5@Hz=FLu1H0kJ%((8(WK{cnSlDea}+uiKZzJD_o}of zj3PoCNdQ;{_0g#)?So;2pc#XczbE?{`B?$vdXpAI0j_5`X{Z%{TH0VWNhAxh?iZjt z#*oRqjl_d9a0J7MI4h36f`r|zhy0iUmaf^Umba3AIZj5S{(q=!cc?&k4h7TF{$!Ij`w#5%8-|dH!%!@=YhCJaV^%n?J=wTX>oG_$Id<{Jg_z)llGBMm)uITaynv+dZZ6_f5;qqDkCd2@=Q!*ISW+p8)UsPX7}>O7;WCd{T25&blB7X+1Rmq%>`D%}m9u@87B?}OYpYjIA=R8u%3 zd13Jph@gpyqacfD@15Wbz+mb7=Eimbk_*p4qe_D>B9e+?V?PaU5l%6?_oU^89Kpi^JyNxVt~l9|pQZFVpZz zmCGU{@huSELemdom6j>7DTFhYIBOOA#xpGo%6j1BbV6MeB2e8w3~YCA(Qcs5N?f1L zfs-tUTr;5%hJsg~W^8fvOeTiQr&m-s7zS(@cy?No`Bof}tJ`~?oL%s=vb=ixz&lUQ zcy>1Ddb{O*v*GT#W!D5$p6aHz2gDK6Mc8Z`9v%i&7f+YMQhIfJ&Fy-_en=3~K{jDQrqvKqf**-_aa0?spaEXNt3> zp~@n=?N+W^+=wd+&?-T*yB3;;?WUnnj??p!u6N>`yD^qW?_bjHI__Vs{%Q~`LO-DU z673OyajiWo=aY-j1}IG8@QnO54_#&weKLi`%Y8Y3RLwg~9${7r(A*E6Q8;5x#C^OY zbS?YMmN(ZA^rMrgxf7wYXR|)A*&Na$EiVD&n(RarO^{pXL@YlFS3lk4f&w&=!18g% z2R~mzJqT;9=^#2wYz=sgE{|@ZzTj}}IjlOeiRGhjP5FhtvEuxF&lfijynNBITa|>a z25*T@;$+fvR!wVyKZ=fH60p)v5TX|m;Y&7D&_={TooCoOXFkh$d|vbPtYSXNXoi;S z^+5!@L)S5mqX_U%&Zj&+oy)}dVY3!a#8rSX#tK5z|NQq|vH4R;EvjoL$$adwAQi?<}etDJKt1r!9+%1JmV% zv%{3teZlr_z=sD$ePDKR;N8qHk}>|EWc$#djuZcIe9a)Q`v`CM64NPagSyu;7|9AF zUpmi@VrWFkFeeZ@FHXYbH3OoQ1&GKI6|~06K&+Zp;uvs4g81V`l=ojc)>M&Gh-23i z_9_kEtd+G$#ac1$s%cFy<(uY^qptB@^UU{mF;qbjd*!C#I7PvzFmv7o?3+Hk1jbTqF>+4P;8t4M(xJNWvvfo^i$p zG?}=KP^9Kzan0ysYcxkx#3+r&#%s`l5iRjE4TuNpXxu?X+0eT&2x})0WG!2oEV)gT zk;s&A*z{58)kPAughMLM3*kTMV6alm5b$G1B#M)4l51JVX33E+QC8_a6IPp()-~-d zRx7!`*4D7dBSnPVR;c4f-9&ffua0Ep3@s>#Q4kn)HKD9ZahQJphp+h4fA&}SBY)!0 z@t1z%M{IWuf5+eSZTiWCy^DARn;`Bv#Nid0R<#IauB;iyNIsb|Ihk;422!SI1Y!Z`~m^*O|r-X`>oq%Hmh`gu}s0yw0F8S+XW)b$(jBG4-cjRaKcP&YL#1n|Q^L_#fhmF`6S&L--3KlA&X& zX4i?|vYgMzvP{Gbu~_FC-w(u?RQ~3$kqvcKRkD~F-6$fDhW6_yNLlU}Qg!gqqcbBF&>!g9XAk52e% zq0wBucOk;e+v}CM*iaUm!RhHtHW6=LyaeYcib7s<=SPVcgfX#vcDpURy{8d4X+@4l zn;?s)p?4yj&L_2;%Zuo_Tiqvaf-E-YDlT03@Km6=kI10Dxy~L;{6U(gB z!WyUwMQJoXdineV5|@)rL(FQn&5m|;OF7qEEh>s=<(z%*Vkwb|?|-)DezoIbwv=3b z=m&|Y9=2OvzrLX#gV^E=r@4HxWQYTA-rfs?=}uTxDshMK9QIBYn`1p<4jtRI=i$C( z*L0M#9MHmFnoKIrFBXYakeB4$DAnwFne+J38Ok5TKL7ai{}MlZj*DqhSyxiIoT9N= zA+HUq$fuU^p_lV|7zc3!x^Y5bbIvbH9#$)+l|sdg-deWnmfO3Xe4bim6h(~>2#af0 z6)et6A~{-G38O$jd1!e0Ov6L|FKjKxXK>)iuwh^Rahrk8B0({XG98#p+}Xan<8#e538y903; zaBTxsDa;nxShpRq-9d0Xe6Qi+Z#ZXpUU2_9@UU$u&NUa`ctp2vIc&PWGIV`#u=AL~ zP)WQi%7k|7f;b6Prr@vDM5t5}Vx}c}l7orq`c@HRIdb7FHdt`Ug%W)f)?6IZz1%f> z+SQ6Xr6p#XXNgPH9a`b2_~2#nJ>-_iC<0#Bw&L`R-W|!@9yIcEe|jhY@`dHYUz~IL zOmny0@^BdO!J>u?KO&Ju`88d}xKeCxTJnkJJHNE#7k+m|aoO?W{((2IN7_wA7%KVm zc{Re+(C-ZaD=w_A-HF39IG2PP^l>5&iWF5oP7$O|-Ik>=@2<{jo?TR&%|%J$cH8l0 zeGn#wwVI2v;OkG%`Nq4Cxi~!$NAvA^&E~L!=pc@Gxvy#w@;2L+^?KyIzT|KF*#%#J z_mp4!;0c9^a-NB(BW_^xRmVoMzS#*YMO3Qu1 zw;=1K^ko$2V;Lbj2@$!WE-Jb<6~k;dEqM;pX<#uA98|&nCZlZvM8p{u+A%r6s|1~o zSs*Kr4Xc*y2`O4D+)nVS2irhVqUuW8M6IE;f!GelKAB#M*&QcIXVAic$8TsYdj;OQF@*cNpATNL~K(U#u%iGL(Kc~c_HFz zuE2u`uwfiQA?u_d>?@0yA&v|lf}`X??A=Y`80xG07sciDg-6%-At@ z5u;@wCL3_!1&K-2Q)I|`xF}2V(#rbgH-7U6{OLda7x`m<@-On6-~U(|LnBZoH+!V;cQka4XdLgF$$$kJK~%r zXe;h#75taZVG(Sk;3B!sLW@WX-rXTs6|F+-3yYF3y zz%=@Xe)lP=*kh-UQFfVP$b+YpYg9?Jcl4wZf)or+r2-)5Xokd)kBzbE8d3^yF?}u$ zkn)Bj7C^^i13ZMFL|6oclKTWC$<)BHCO@%AmI3nKx&7ZEh}lhbI!5Z?l`el8WP*XL84^)T~E_oQ|4AS;La(w ztAi|j+}NQ>06rbYqy5v-i-W5;TBemOko~b59}EbiOF-@-RuQFnN;W1<+Y*Q@>Ivtk z=ioX~>g%e4P>Pt<4PAm}W(FOC@BoThak~l-Ns&aECK&Xw)nYlDvTs^>PjoI7z0#;= zqk#xTZiKJZkICUiv=}AeVR4ugWlmLDbkHF0b;GpUyx+L3+JA3=`dP7|mpUKY6$ zn{q?~V2%$baV7ZUIU&xgc!cK$N@IC)HRJ3oLsRh1vr|5MbI+UYfj|1)&zY;9CyN}z z9$_lV1}rkmG)PP%r&wkjG{P{dra9+kDlK3|4)eMcE|Rdy!boN2Jia*P(DY1|W*;Ii zuOH|JxWC`w7CG}p!Q<%}v&o#hP0Pb}FVnxvvkDEwK1UUSjEt-*FeS41xW18wCvlGS zT`wZkd|t7f6}XVf2bS|(I2`+~ky_}kF9A*4?T_svkvumdcuq>q`P`Dnh>cMuS0M)S zDr1xfq-Q>xlU*+8hb=Qba8}GjoT98SjO@2PLmQ7!VTT(6RaS~Hbhm0DmQ?j1?J+i2 zEKe(1r}^wn&w3X)Gy<`fXiMliF3-@}<19-Y-Zy*j~$nvWho=DaBQJUaTpi7k4wKM-PpAEWTlWFh*j#?ErezDBdB zvXNz7i%3_N3SACdp4U8DUh?|QhM(L&BzBSp6N5PVj4nlF@}1O2*B|lx*Ix+hCLIbnVuZoN-lMiTbQ$DM+7^W^ zkwvmRRk8>E3WwGLm)AB!RT+9Y!IT={Sfi~eGnL{SnPflY^9o}?nH2j$spISDaoZJ5 z@C;3p;^RY~YV?O8O`4C8_TCxaB zP6Szej_Xrxd0qyYY{o{jxf>`-_|7k#@N>VTB20IDdb8&4*3s{#xV|C=(0NOqJ90H; z>`J;$%L2PSbhuIYhsTX=T7)|XpyW#&EmmR5oO)jJ_+rWjS5wYrIgJ~*e%SN;b}OY0 znbMq2a^Af-=R5B`<(-QwCX=b$m+p5v9FaU%!t4vq$vyS@?vC&N=sB-%T4Cb+{5PKP zov%M*QluDst6I5#1R{+KeE*AEK7MsamOHKI#Cm1P{XlqM_| zp5^kuayf8T=3LDKwuncOzHcKmp}Fl2X}l1r=gCvvgwhQV{l+1+8_~< zJSLzz!Xr7l17*k(No@C+B7attS#f<3Q@#A<`3co*%FX?nb_n8DkOsn`0|Ii$=1UY6 zDM-*oF76Md0b~Ot?+wWp2RJelg~xX?tLf@Uvv=aevc_TUKvs5yOo=GFUibL6h29f- zmr4>QnrIY3QgRZ_m1jU0-LbJVkd6@|KqmYhon^-eWODq7NPTR@QX(RhvKGsw8a~4S zyV%l4FHS6dS|qr-?_dB>N$?y4&5JE|o>P91<8y~c+z1laB`6UUaELRbwwlUhvVjvJ z#vbn}M`0(%1PG6Up72;{Ld!&CER7Tc$%a)#QM_ zNEwcJ5M?u*+l->H!i+2Qv2i$r#7)gL{gLw;1fHES$VPgQ`>P6y%0w2WW?ot5xu(=m zW&)EIku2CFzs@TniODvp%G9nNgddYtB7|roVrz<(>P(!BzUyTj9Gw>-B-2KI zkIoP2nSdfhiHwTS4C#4jj@T27#T$=SB+l(k zjmaV9<8kmGQtD({Sz%pSj@P+44oXBU4usUyC!(Oy`EePMzVIGHOijclAyI0rSOkT_ zlUqc@4&m7Hcf3|5su$ds`?VpY7^jkbX%DfGL6V2Gh8*>A9iy>Pb4&w?nPJ-uY}*5M zrdZY$by<-*wM=Tum&WkaC|GO5w4BJb*pEFiI2quIGgF2@N=mX4CV>_Um=3Tbq%y458&HTfHWO&36Ifx98(iC=oEImM#dCJHNHKwCk){ewh?@}eN(#fsXs z{V`*0D2qbg^Exl^ejo%WbjG%67{wix8V@7LgIzW+Vt;k?!thbds#_K>R3`<~OfVlk`4^53=t zeWy4ab|NI~d(Fq6zM(3$EYfe@Zh6=pWaFQgT3-8oZ-`Y!Xgrx8#ci{gSCsRD-bZPJ zYrMmhg@A8!TS%ixnN6|tQ-O`&-QV!$lP@qDrnTkr{DQ@#f_~(r(p=3aT+A)j6!Osg z$;+3NrQu?>kciwzCkvi+1KZt}N0$?+_&*#@Sxb9epmzb41zAX$%L!vNbp4L1@SM$S znP5JwJ@=cQq9~cwHK1sE$G)u?0$?>{`QnycuUJkecyDN(!cOL_Mi|?XdQ#!M#agh& zi6AsI(##`&zA6gxJQLt%-dd)Ul78sLDP={#)MSecs}^k54ShRub$TxBsy8=pxW2z- zQeDdV`mo(Go98s`jz`OaXIJNp>m83CUvU4$8{XcoICOiSy>lUpq_G`@OIA*EnTiWv z4xOSp*3vf}Y8++3^X&0s+D`HL+Xr6W?Z`^a>D3In$Z!}5(@{X>n};36Wl8W};(5zc z&Dm)opI?z1vFGQxqN+=Fy{GRRi34YODc8>9%L|@8e#)nxd@LK9<=o;`WVPOl4c-$` zqi5(kVsH{ewo&tNyJNfVu;oNtjl{q|^oY(2T={OJS)6K4ALqEnX;esP96alBX`Sa%V8 z32lMvl$3Nt+0SVDCQy`)Z~x+wum3_uXYTpz&6qCQ{X z?zO~eyS9~|Ed?1EG$fd`0e=+nwKQoJWYdb1lPT{#n(_E#A`aQl?%(jq>NR(}9^aQN z^En?pn)A`K3!YwGF_|u8!99#y9=47AtVx}v_95M2^;IQN*iQEG=M-%3`Z2m z7xFw&{Iu^cK>F;EBe|af$3x=mB4A~iB|8FiQ9;Dz+-fPYnB1@=6%nzcfD*ToUn*`CTEeSU#}(V{`NBn%}-kcjRllv7(^rz7`iQxSo1h~ z0vw-{0?bL=EcpTy$jO}Ls7xBC5-z}}VcMe3DeQ?vuW#>G>^Dc@PyTLlX^>(~GKk8{ z3^!Qhm53nQ${HzFn%o2#WYm?ozU4gadk?ZX1WlfJQMScr4Q;S8lyO5ZujNQACkKK> zn$X%#B2?1)=-n{_38>>aiap+A6yO}*Xw0z%6iBhXs+2W{B7!h!3UGnKk9aM7E{P~n zWN=cTNt;?i1K}v(?ne%vZCFgtC@w8M0Y}D2grj>qh7_{}$c-WsxN(XCLJ)C?V;M{! zCfC29MpgP!fH07R?@Fm6Lg^syZ*B@%*Z<-- zp7JmJXZ*eYpy2U0$dJ>R9EcKcADm{sSkku}e)OwMi#TKKEgJx~%Mlat#*Omyv zdyNWU6gSq;50rWkr{3tCIP9~m6)`N}(WDq_5R>Q8d7Nc{me0)!m_29o$vuWL7*gUv zjpzo_t+g&-X8WfQdtD)zrr_89BGa0WMtDs>}t)FbqnVmHKt$M?di@%X*tAnri#LyCDTdG;N}WIzK!3zs(-up&So9hf1xMCG$r*;fMASI1Y!Z_y!4 zs(GE$H(H`swKQy4I6fq-Eo35*<(9%|cDtRpezelG+nrdQ=cf}U)6~?|G>r&O`+ZA4 z9+(t4V_wMO_vEDFoo5S9&z9V-TRwYv$Ib0tl=IWmib-uSz2}{)bF7Vc4`yD7=tBtX zqUUUW#%xy6H!I;!edC+YWb=Iea>vQEB6MDyPLo-gB4wLiz~E|D%Y$U!^fc|j`C^IE z$OC!5>tx#9b!qYv!zkj_d@_}vJ@#V)K%ykGJ@$^1S;3==xlCMBPCwloaTDsQW^r;N zi>xN2v+h?aY1hK^Tib7qfGuT z=2ISD&Z%nHHCr|(BSl#;oz--QEwg&$(c^R8dA4LfYF=GGaC>{t&COeB13N!CXFjdS z4`8hkmP=KTcsDsrtBkX=2}NG<=C0@JaYb1u-oCx%``_R5uxqhJK^85>IT1q+7`8(v zu`kn)+_ybJImRL2V_I-4(=sbF=7pl&MbI4{gA1M5z;(1#IrtH7uUArcZ$K9D)6DSr z*(HimoKac+5zntT{QAdld3C$xgJ+kVEfRBPx7y+?Y6_1~u;nKLC+v|IINNt+~ ziwfR*a>>bJ$!fJ>Xa~kwMmLP&J`~`nww%ric88wWjw0k{*~s~M#n+xJrD4mDp1b{4 zCWG^3$=TT%P1}hmSrmrD*2!dcxzG{|DDzTk|AjLbH8}*s2d2n)^7xdY zU$fge7RyQi=iBv09Fv)}az^lJLAic7VD!k;c6|2YCzwIe`%xgoU4T+$tPdTv$)u^V zKCP*znKa`tMlQ}y1jITmWlELW08L*ibo>*1P zx!K>dSr1%XKA}9Fu-)`z(hfCXY>GY~4w15$(I0wD%%vsr@?^=)+YK*X-EsAJL0!(o zsTMUNS_Fv)AdA7-wC35f$9Uf*t9P`x!HCO-Bpt)@~yxk6r&X5fj*J>hQiZ7A zs~!N8DRKM;(_$tiY>VWURWUWidO+eL4#ce_3-e>NGN-62DX#eF=_&7DEeYE5a{Zbg z?|#U&dyUUCCfO4%=a2aMJ6AlrxL`7wfi}3{1<<}d97N!llm$pLZO11s-|)Rpuesf} zoG&K4|IR|#S>6pOf(VC&s@OCgzy8T9{_OWYWk0lBT}&nZ@$Fv>m;Nu2XE*ksIY?n4@Y%b(UfENH00zp2>OS@zB zDygO&lM~q97{VYCDcR5(tZaBNQQF=12Q85D!S_Tsis3*6P-s!aGzjxaEKm}Ii^C|- z_haM~or~*T+Ra2j@)klxS%AtKcJ$Kvr%DUUEM41p;x<4`Y`EdByjFHpOp_ z7y?Mwq#tvMXysNA21l54Ji0;yc!|%+YefF8BK-;)G_=D&C-+Ly`mHXKi$|OuF*!Yn zU&5Q6oXR2`iK~2)6|%`s{I|d`_VRf|udyik>O){8QY%eqgnT6%=*n1mU1M&^6hx5c zsWdW+Tf>Wp<^)aXR!%ga)Dv`Ql)a#a-~1b^>0f54ypOF!Y{@gv@O zZ^@hMTiV`<8%Tt;7*I}B1GEUksiflJD02Kfzvp-UtXvz1*30@ulNuhYd5yA; z>yLlL{`wVpRAhiECyAFUjdcd49A!yzwTNKXNXj8}PKHg2coe-|;vmU2G|Fb*1TXj9 zG4$Zfv6WOY3_cY+5z;+NAx@h?D-PmJL}2wIRO-kOJiSBW^|=U4$pK?sE^Z~^iouub zZ!g%8LR_;+kmw}}i15b@z4t@}_%EWN%~CPU_+{H(kOYR#tPEof!m$;XxHw03hElbN zXmvfMs;1IT=f;M-nkHsl5d^%in4rkS8Ma^T>2u4;)rX8@$L{)bYI{t^kP$>MK01+z zlo?!}S8}b_Mc{O4d3jUv=@<9>p+E9#Y&Jc=?+^SoKKR-*jE4K0H{AX3GxFsX)w7>L z&7Tr;0|bf7Nh5p`5s%LhCC{*7bn^a)V5QS~PHPbg<#Qipe?(e$#Pt5Cv}cm*#we9i zB1%*&_-U*ig^0u=f_b0BCyDY#h;q&th9Rwu@0$Zn(@|%Zd6kQcEz2wUY@8ct`vJde zKqr1$FVS6x6{nmKD97RG=nG#7SYI7q9luq_VYej@7OPXkm@!(w#q;_U=appX zPZv{}Zkgaj)X~9F)&*5zFrlO{8Gh*HLAF?y)KV)RB>oW`%qAI&*^FoJoidvTVrcNg zAXD(|!&V$3i^(acvy8QCc=pZ}!`N_pw`Mjk(@g;d7d2I-m`)>AvEcM%!eVCl?CpxG zgb%)c#dg(;OX|H3=4cx+s>k;&RbC3SX1CjjAmnEgnb>%l)OcZBlr|&FjupOcNI=7? zW?JWL_gfJ&=8q<11U`IrCftCU0EIP|ztkr#@xR=DAw zet@&{DVL`UwyV8FIWNyHMdVp+2l~BdJVZJSI+pC3R6A`LOPg6Zc99Ge+^joZ-|uA_qHIYvxkP6JjaU5m&5AE> zx5BiVs4#9M4+C{I zl|Nh6C5ytaQ(79Ja4qHF7D zbX<|KT+DfXbBk9Q^Ro-W>YlUnC7=KBhL<-RT%WO18y-D*1j^8~f%{d8lYVG5Cub9? z3Eb}+PEQ}vw_dmi$z_3D!~1=zv-hKAHeC?iYl%Fbp3cR6uvxE|o|Y_Ur)<~ALw9*{ z!fJg(+c;SucsdZ#O|jiVS=B_Vcyqny!}AN?fA7lHjWgd`N9cF&6AsBY4X=IB~EHE;8(T ziCm{v5sxmcX2jhKi5eCLeW9@v#3iCDaeXEJT#;cX75QRDHm^j) z2`WOSF{J_022%wo*bopY2?{S83>DM#StWqE2!82^KNYd~D;<$I_KCFz5Ci|vdPQ|~ zUZIY{po%OWXPkfC(&#U&4i6*RMu}vYA`&NoXj^mz`NR@@g*v{k(%vcn6Hwyv(5NyO22wpKc<=Fo zZ#-K{`{C#7SA5ZY!cBZmpKqy6#gqIQzwq>mZ$5d#={z~Ff)~iL#0Q(M;p%)Q44n`? z&u?z{l^=bMe8U+ev}2d;q%wm{Km(h^YP1DE~Zm{$G6^Lwb}BA zes#y80d+g!#b>>^czdVB5uvS1li_15P#bY_92e1=Xh0$V0@TrqC13Hl`ACiv;7hQ2 ze~gu+$cYxFOqF@+(ouE2FkPl)F3o7GqQLco2nig)#={7oe+rW&e6uzpsEpA|G%MPU z`IY9$SmRv5!*hxC$mGA$IUg=hXvaa^phXF-)*@Pu0RligektU0!)T&50%6bU5|vv( zfaT(J7@CgtdQGl8PnIRho$~N-l{P9}a*Twi1LhGZcMOL01>WguY-;fDzb zz6k@)rB=7?p_k2+b5Y75ZmuKqQ_bmIGd?x64~9E&I{Fk*3_7{gbHmsLcALO}XB^V+ zq>GH`Q(aHN^narmYbuQ8GVRRA^yPPk{O3!9EaI@R6 zZV&hh6dA+`L|_{sq@UNm-eD(}@|#ooiD#5{We|3HOy_Eh(k3lJdFl{Qvf(x|6bvHF zYDkc7r6g)RBJYtr&)U8dx1G&uiQ{FtPM<{(&Y`$35N_1*`-=Oc5XY0%BDka>?f670OuYc=_2+HDKQzo&V5-qf#Q%HYyojx-g(ckF^kmx(f;sj#3enm+LVK z<|LPO&0)WjwU|;`oJ?6YA*xYgo=QZfT%w05A|B9T5Jz1Ed96`~^ggxv%BiMA$cSih zCK^Q&(i0O(KF?q+kSC$kdl42hYh*p@JtAI+U~X)B{)@XiP?a+ZSIK#<$O#dK@xX4s zk%*rNH=}32Z$!*}?}K-E|GlrHGevXvIl51rJn$k46SL#+3F<76pKBIX&FVo@ih0!V z#oH~v`Tft>Hv_-#_y2Z&_7}d%`PCDK-2;caALH0#&UXy6cL@0eh2iL0AYElXv8+O5 z5T;cx*Lsx~R9P;cyWD4kBFc4hES-volP|!R?_G$bXNTMqQe3#mCPy*RA9+z)1`APQ zmQn7F5E-JE!Wab<#?a|VHyqHRK{J!J))=Ft4bt!pIrm4Eu^&f*YnWS^T8bz>EtCj! zT_0p9A%jMr8uaB{F_92uV3S06aa&nbWyy>8s+~9){BBRE1j;TG`T3+|xttMfB!-gy zppa!q-^qmBhn&^sAkzt>bEylry2r~xrQ`NyCrxSVwUg@hCzmtceR4sr0*BQ~l>1?5 zYzmuN6}wR;t@$Kpxm=PLS|V+w0T@`XHk{0-vcQr} zf>shSdwsp3AMeBtyxNTnLm;m;MWIvDMp;Zz5|kErxQT&xrWY(vPkHg?n&&Ux5XY8! zGM9;g+IhOez@{Bpp47be&J!k9iItn6DGZz}W}q{&OdyJ~puAh}IW!&H9@;k0??y<=DKltD=#k>G>j8qnt@Wr;fy$D&xDxN*P6r1~cy(Kt!e09Rva?bt3J*{h* zoD|%xd-^c)GNr^VrhOn&fl?#Ujb~R&6fs3_jAME+CD)N=MEFL{VdQ?b zXS$e(3$1Mi4*O9SyuDAaGcQJL-tn;79bt@0EWoS%flR~svSM<6MUe;Y-n=HnEpZ5p zeGegEwBvGl#^$h<1w)}n5!Z4IW@u%TKf7FVvYgTO0S62^1(+g^tb5fZShB>CG@D&Z?*;%girHks&~6DH@+@s!7<;1A0!aPj(>s=v zk|$>;m`9ZeMmP8O;vVa7A|X^Xog>7Kpi_&U#0_#QuE~eB(u!PbT!P6)s71k*@2xTWy3X zHacX{J)0UHKe`aX`isx6#f4U%)P$y$d*N(hn9Z}}LN@+G0fG#zXTM98+gF#ceMcN$ed`(HuYW;*=zyae#(C5*5*kp0 zB{mA*fL|IiGzv(xWP_@5fwh}DCz>c?fs3QSh)rf0dk;YY1~(v$gT7BqVgayLl#idr zwEnMMRz&_LKq*+KhN2`BL%h=SpTz6*o;Iuzf>D>@7oM0E4n#gh-gsG66gA`Q{aGhEI5iZzT>^Y0YUq=l#VMA6{N?KA(s~$-7Y&uKT{@ z?P@Cm%xqG~x%jZ%@|S+}Ip2SAFR|ute{jLieDFw`{etrX01$3Nc>o2Ci=uPtJAXnF;^Mei^rlB$znIMLmE%Mq$wW zRJ?LQ7T3x6bQB5VF}f#}@(LHF*9{QZwlvFCxfS7RR*uXIO`YdQmjiMx0qJ$P$gXpI z`a><()73jUTJ`ehJPOK|#Z$#IU*pD#&D%~k;f07Zo?X}A6UbejNnRL(skR)Gn#SZ1 zN1sFor95PLe#T@zAqLp4w``pwbV?jExWLWZ2kzIcY+UNuoW3YUv~uFW2w0QJKrXe@ z2{c|@zKdx|5CLwa9Xwq(%Kf`=St@<$262;WBQJ@ziL?#8^Vl$ZH>X=GxoW}|S@WLoMA3=z~)ST#v}@Dg#9^W*UO7E@X5hXtr%f;gKJR6p^sf+7KqQ4}VLI*K4JSf!KzrA^Fm8gaEqbT2AwmZM1##4O|~!sERB z-$icZes3gd=g>jPnhGpNdBV`qIgc%@#EsB}xOl8B30Z~KViCt;5=abk4O?-| zXX3)ob)?FU0C*LM;_{M)Oj#>NapG7E(Dpr>wkIn>VtV=HKzXv5axpuRb=R^gIjKvD zh&6{c!P4_moKSuU3}K)sGf6~LlZo)HiYh0f`2364{MkSA=lN5A`Y-bRAO3`!yFJT` zr_AdqZamQU`&0&i0>B>Qmq$+sC$kwJeeK(P{hQw=_*TwgWkAOiD=(_laQ(^mf0HkM z^y?D+w-}U&4+GAx325pYo4o|KX4G@sB^}cl-@M!#hu&(QORP?ltjx zPw6+Pvv1<_Q-aFT(!#EjC~UJ75sjlnnw3P6bF7i)i>x!FiRh!NQp6w9br_S=O~fJZ zgOn2WG2mj5dn6L;R>HZ89!7ajoeZ@KodZ!EQZ9ID3m3sLWaM>`5F~}AENUR9cOG&m z@(fR8bY7Ay^D@JRT-qkZRVhF7xb`cn#Hf-)Ok@zop~FW+i1Gn>4v6_RhP3`L2&yBq z1uDt_G&N}g8t_N1UW_28M>>ZEqmqhp%vS=|SI1Y!Z`DyqtmqM_k*X}HB$sb+{U|Ie z0WAhE6QHQlbkj+Dm1i=|IXz2@4X9)>{;=v;uLrj416p+~Pn3vR&K+pF162iiCKcxL z0KB+dNSoc}VaxT+Mm7sYmdPT~8Y9y&rGi8&%6cxT1SzcM#a7LZdMfFKiAC z^OK1@u-swI#e9|~05i?a^#iNz0iqEOz1s?W2)3QVlJx@=j1YPsyX3OY$?j8vto7sKxU`xHn-fqxn?@eB}Q4FW^8`&oX+oY>d1p=9m>OGW_fg8 zalXuCAuCY^G!Ixm%O;W;pP3B&88)@U=RqZv^{RNy@;$vTh2}v=)7ciIEXE{ zYj%_trg??YnM}OJvg@O8!G7?Qx5AQ;W}~U0UG1oI!)~*qXnN-J1>1cGI04Epr!}=P z6wgj@j6|I*#-VMt~BN4lpi-5T( z3eM&;5h#BAlWRWx;tiLNYO={h&WG8gLR0XzZ@9kOupWEHW3;O_Ifu=FHJMnS=d-CS zZeL&D)ASvKlPH!<*ALB3+>guU92D|i%|juLJa2EetoJ=X`{BC+4SoIkb95f073Z*3 za*cFDFN+XtM2U+$wNmN4=K0&VeD{a1WdSp>m6R(Gb6(vaczt`z}$THh&NzrH_mRvZrx zTju2)KPvY716tSY+CaM>B_?owaw1}9*X{8E9#&h4GM_BxT%JAU?qS1vy_ZRm22XVUGb#1!NyT`ow{!58012RNNquSICm{e86xE+bc z5e|+7-N~TH(WM0=@Laj4>EgJVkvNQei6}MH8(8Uo$kiW7~PaNbBIZ&j_QDW>qB&!@$Xz;`05BbvSTyzh%FLq0Lb)0PR2$ zzk|MDc!)IXfw7PHkO0{28YrwpC$qVytXpXcwJK+On<~YPQE5V&X}O1JtA!IL(fQIc zgafbl8#d-sHrchf1}bfsW))AXCp?{9G06+51V1zY$i{2cbiBNMpmTvqnM-v1`=7q# zyPw|hup4;)YR0!exD+R%L}Ikz{?PNApT6OjfB1!nR~IK0KmWBWe(`HhnOCJmv?p23 z^V<#EwG-jMS}zXYOe5}y;3NJR<&xuwrUoSwVu?uVR5cz!1_?4Ljv>9*kT%MN^A zVrnCFg}BvZQLiEt#!_WQHW|WImjVzk*9P(u#8oEW>;9$ZlUj?@xjY}Fjd*a!`%H0Q z{uG{$i6v81o~nrK#shB;dq%9>uWX^j)hmZMt_+x;{w!qURY-hxak}K{;zYQGcaxeI zeqEKT$csYOMOrIyY)gbtz`#!a+#nXID9yt` zhW!30_KswQk_}#(?2oiVY7Sk@9am2@HxF8X_d}N)T&^|LX!1&NSVxIat0XEPcSApQ zgd8Era{Y?n3dwn9#C{=SRxC5TQ8e3JHtNlgnqg5hfmUBkYWd6-!tF}p+#6O50A#2* zPw(gEkldN=$o{hpllm0%IK$@wl#@-IGAUjppEUu@cx)nzvWAd2qr~wwQfR8gN`t|t zsAfz;WTpY(@Qn093ya6ZD6MQpX%QDHlgltwTLG~jV`o7=n_l9Lpnb$fd3{nw;jEH4 zVC)@RuP|ka#pC=aKflfjO09@dzK?9+9SV;)ZNxn$j?p9IukRhb8^MpDyu>zLa-GTd zBS72lh)u(jvnd}uy5ezdnJFjHH3Ibe79YD~L-iCR??Wn)D9TdSy0eqiLJf+SFW>Oz z{`{};$N$8i<2QfvV|Lp{;;zEmDN7NQ`~4v~$$h{DB=%*qOg8q65*HU{?8)i53{ic1 zAi7aRIFDtvT!=9E_Vb_c;(Nczc-V=6Cqi8}piL0rvg;iEJ}|9}2uq>uK^STojv#J9 zC6{LWvP8lp>m8BgzE$3#h5yXrjMMim#B2`(Y zWPl@BZC})CT5yz!glmRMouGAQh2m^E!+zr%-{Ak* zF{fT9)2EZ16p({f@EesS7KadsA4n z%4G^kjGUdFBzT?k?AwE6xwVN{7nzzlkV$0jQ_Abt zw_^W&^k~6sHfOWm%b&kEJ(EqY(mhWeUkcaatjbwFT^yS#3MSJEMPRvH$ZOmkdZ~VX zxLworqbyEuZ*K_#5;bg_4ShEdNV)ct%OwQIc6U!%Br9{XJ+M=Or{{C#lSseakw+sx z!`+I;AeHPu=x0>%5!9*F~Jv)j|`6GYhc8z!~lWO;@e8a}vMV4q#ljSa)t z;)vp)nP1I$_H@B8cHG^)mMY{)bxKt)$!x{L{SLR^3w*FXn{s!vX4^ufptO$1rx|Be zDFD(>?}l`<9xbc8j%N3YtMe%zJ~`)NmT~d)RKVK1eNNW}u5a%|wD|V7zQO9D<@Jj< zcr^;Z+hm3}8^>9mbF=B`8prhUgvAu-olHP-<)mVH(|c+D5TK|_E`VqQlg#qubjjtU z;^KTNo1e|5m!_y~H^}=isV(#AL?)VVZnZoVB2#IfRHhV%9KbLR(k}Jlhzz z^T_I)vqdG2sKO1&J>xsJU7FJNA*1(-$BTl~^JQ{f1=#F6wtadiZVqeub`X)bC`)2Y zvD(vVMM2Nmq@vC}#k?ZZX5Kcy}Lg!gqD#)Y}Rep2|HxJ8-$B845?ww=2qfy z!WvVS!x;JavsY}|J@3AENnt7uhYhZC!pdp~fwRiyeZ6gIn!wF%!^bZkxNCZ@P6~$6 zi&%tGGz_deC;T#18Cm2G>nQP#7#xLGj1L3PKYztd^vo_!nW~I@Qqrg>ZH87^uFe)% zZ!tE=^|$Tz>~@_r)akjs1P zhh7%?zg0&(GBSuzEpi@xtA-`KUAOG|D4U?rWw_QN`&^Si`1u6RALkrG$L;FCVW${c zg&Hk(%o%pju11M7`_ap5kHY8xv(Fd~hN1FgWlJ$JRD+?}MghV@Kuk%pn$@U0!(<|! zNrPO&YYx1nH@8GJP})qyi4!~JJilOK<~ZksV`%01lcu-V>yB5q8*v3?nU+Z4ul(pW zukU-|Lw^0~f|IEc;BQo#Rpa^9AHU`|KYPQjYk6`y;dg!KUB2`FmAFcFG7!?<)p`l9pl)e0uq~wU)DWI0=Gf)00!swBu6y)!b20T82+WS5gwzQ+; zVYjEW5MyGcb>konxi0#jBH?3ls7U-yL@|zW-GDztUVqY4Pb)qw3rsN*VvqO8&o}nK z@=0=HOv{XSpITO9%WjMyk@SEqVC<01RdSLYzk>WAi1OcLQ=E<&4k$>Dbx0&fovmwC(yJbFJ9$NK%7BwCDpiq6;q`Ce{w6sY`>%@!dZ88RRY z8TrDCz@J2IMv&*KLHk^OZm$)6*DxxNElYyLZIT#SRXNk#a+;rTm9-4z$erKe#7&YB znG@ns#PWf0-O+xsV_KYH&XTi=w1-6@Tr3$5^yzb#b)Z%vc&<1g~Xe%O?3QBLj1UHa=BEMzYifqRmvgR zFmPD6l(Q2afAe=s)Oh>i`;4od@T#R06#qa&yU*q)bDTmDi+b@0{bAQ9~onNFpeV;L#GkEjmy;Ozdctx%`$KVI7 z&WPw^#5c-yACRF);$pc0o0WJGWd|mil5^C!D2`+u1JMVG2SS9H-Z!I+#P(tw<-N?6 z<`@ZX_^XJuBS#UHAcFF0*Fg-}+uK|D zW&WQyzB;}-zB-hm&%xJGA+&^ z06mjl2z=6 zPFy8Q-DA~(WYSq6UxAo_DUMOs5m3#T<+lwvx6v z*Vh|vS6fDL7iejZxLD*od2-3D@Z8D0Al~hH> z+CF zol#XYu|>Nu<>i}eR(EUqAxK+dF`co!YX#ittmAEXOQAcST%9tnOK#jsM7Zf>$>q~0 zY`=I#XtsQKHQ}RomYh!u-ac%(-QDuuqYPsv9Qu*Xe#hH~y|7g-mlZ$DJ4~k~eHUoD zf!$%`bw*O+p5#jSa`Sbw9QCNOJZ?)l|)Xm9T!uLsS0}KnG{;8)O+W+-!$yn zo~Ucg7}+{Seg2fD^-Pu*oL!dC?ih!b?QSPAk5BJ5P**&A_k!JO5Vlj18)>?lOiNxo zf6JTeE&I+(EGlH4b_g=jT1-l|c7t-Q#A~&%aRS{q$^z$hwZpZIv=u15r3lm!xxsm^k`Ln|BI$+Tv-X%P2* zj1mzEzLzO+RTnZ9)hhDz*%gOP%a4Bi8LwX7O3ge&dvuy0Y_qoO<@-N*v}Ev3Vz)|! zBG@-A^FH!dJL2Hzb_4gfhPw;H(`BF*=)1>tEsTE+=Td~`Wy^Z8;pE#VVpHF5N4A}l z7RZaAy`pU$56>SUPtL02>KsCpDRvxG+7JkY1IUDZlGsE2C=RY@R9YB{9X>U(MjwRZ z4^dPb1FMJ8>FFhz#n6`zcq&fkk>{5XCIcFy`Qt{w``i!73G~~>_ljhG7m`N z$9!Q3dgNwxpxMLN6~s}Y$AV#JXzm?j6C^4u4j=&vOIB1|d+jzk%cy!N4yfG9robOT z%>p?Fl(dX$(2=qls2BHyddpa>amG<9OOd6?;u_m_J^P`j@yVH`b=qhI(N>NkgNHP__q3alFMgz$ zEovTpZ9=aH4lX3I7*8xVoIWe~+M_v-pBV1H@Qfa`ICMsFNhx8>0qXcWM!-kpPyIQH0KT@xq~X<*91^U zp=qk6EmT<<^hl#x9!Ba+b2=$`GAlVPGiJFZ_bqfWwR@Kp&dIqZ!j;J^TAC1Z>N=Gj z)w3n}WXgJV$DjLCzs%qF_x*AH^e=y(w>RtLhRIV)X@nGGB8os{5?o3)+(Vz958wL6 z6aHbp@8@{$(VWS&Ag|}t%cnd(H#D19bh`)Y*$F3?=h(bvzkOhPe=UVa*>XW}sTFiG z3`COKOT}IqEnU#*eNHk1K)K{r(jr@mV-FpO7!)~CRGa?jzR`(8 z6=QN&sdOI8XE-`6#{o`)W6OCgqTnzkgfnS&OoKC$P)0;qEzhtNu}#!Vgbd_VEd;*J7^YXf5eSjk7Qt3Go$gKK~KT z^)<_newO;3pCzjvi5M88#>d3M;#hnT)15jYS4e1&!KY?FKlbT<5t03a69;dH9~5=z zF*cX=9>k+ShMd>YM}oK=gQiFvT>L|}j>e)i_&4-;Au8j(NmeW$; z?ZY^-Z}uoN<>}=qF-Do@tv5M!l}p4%+z!p25knU|ML%$HvLMf3E*1WXQ?PmHM5!)n z%j2t4hOXz=zx$f&hYf8XWlDWAEh)+gN+E4=%gXYN58si6!S#K^e72AU#d^D=vKg9! zh^3lU0z`a!zvk*9$fD=7Pro3~D&F25cv$xoMJYnkJ5OhP@a`F9rRmNS7{2WiA7(k9 zvfk}6<%FgQ63LoO;A~#LrI;@cyzjCzuofct`}aw2T#wbs|i_Ev2Jz@ z@ex1%?4B=PUh~5jD{l9rFdDQEEM^(!=M!nEll}PM*sOLaQ}BATCd&hj&c!X`b!0zu zJZ$&$!Li@3aqE`z*@BbhL|kx_&f)~lyr-IG(xy1^V8;WEYq`7IQJRcNSxY1jRT9UJ z^}_>!Oj;y+uQ*#QIh)TRIy%?MLrYmLuA9xlQDik!V>!tq-+t!=g<-#KrI~L)OM}qW z`GQ$JBQ_E_kk%+wmy9jY8v>g9#_`$BUbq?a#e$Q?8SC|mUEgtfvcR~WEI3ZDPI=f5 zyt-erTuiwjS$!KwUDM7EG6O zs)^#$@SN3ZB`r25iwT~{VK*|4TEq^tg)u-xGXDn8BG+7=obX2PSnYb&+m6mT`F(D# zH*AfAVAyv9n_WX*MiI_dyA8`rMO9lipYFK7Z@D}#v885=2dYYr0Q zEwhO@RJ0z1eYTj+3B8g(KR>HLDVdlFguO0UPAmBxj8@ENCA;lL7QXY7io1sgUc9&? z2rn+@Sb{^5r@{ooz)W0qPU@?>z9Y!g7!g3+82GCm-itW9-FS%voy?$`D<)ILLvp43 zwFR9qviqWA`nc!pJg4tQ+?a8@J}@~ec=u#TEt1 z8WCk&HxjxLRp+vyk07qBFdo195&DrtT?WvgWjil_E($|!gyW(99}W`!<$pgAGP-vIqcNvEpPqzzjY`9A9 zD=&~);Z=AfS{QRpta2~|nQc&24H|Le5xfYRWm$;J!qlGgtA_bii<&mFVJK}TVsaKC zHj%+)Y_!7k2TI$ck6b1Z3SH#wL&x^eaWz@+`eDxxKY!qE<2YU9%qB+eId506X+6LB ze8v5`kw(~OXLH`YoJ!Q;&BHxzaKsp8(|l-;;^R1Sey(`>%wtS)h~7&JgTfsJEct?C zF=afu%#1LgB-W+HZIvd`-pfBjP=q7%V{~xe^sM?lx6L)5-5ZQfn|MM@vE_bX*9`0q ztqigZX#){#emp-NA$obu>c~~vUbj5|k>>0&XK`9Fx&vJhu(t@*7t4%CkF|*N2N&^5 z$_Yfkl;Kje#Gh8WgAb@9G(M)b`QyJ%k;vu5@a#-;x`1Ykj1jI?WOPZOH;fFvq3;`p zwjs1_y0-J2wyGyYv zvDIv|K{hpYHe$~-OIP5vqU{hjLI@cukMa!HofXFj+9$@3hyxKogl1J$iCJbezBzEr zu>l%Dm@@P|sFdD!L@Cy{@L z3$R!&nJkyobw!yQ5r$*XtX5lo@E50`VL#FZxq zk1A90JUd9^>7M1(@_T>RclgKrBmZW8@fW`(aYQ8wQAXdT(jsF^&K|!*H9LU_uRi&h z&CN?(-;rmfT-$COu(=g@yo&p)p|~_#}cDBO<)SH`}2V5ieJk7&8$| zLCJtrYkh2OO#)a**Nc3HS+2zyPxR7=D2_=2hB37_1~6s7w;f^ZrO7!frot;Tc_!}v zB(}v=kl}TTqopi$x;>c^ofnk(NYk!m*f^OisAr17CAWN@SKusBxO$Dak4ACO7oc;2 z)ptQLd*>IZs&hX3l|RSk<}*%bmaH`LUIu3w0*GYJ`;M z8c~`p6CS}w5#Z%IFp4pR<1+|J*c6#fK=&qR*;fTR%C~PL8=qTfX7bPfW=>kI(t~ zhnM2UI6pn5=@Ey<=p^DJe68(a*7c_pypdz=o*G%(_MNx4!yAYvjH1KA# zkq95dhPLxLIE6c#Jc;g_owvv1BgolJTA z*%z{Cc>3fqoAoBKHZ+`^EP3(rHAA=K{H&6PMnAx8vEcFPLZ&Y#XA5DLz5o6tx7QE! zZGifOyX&n$ioH?XJgitOJ=3ya_pqk2QNZjkU$1%o=D@4ia#|P2^C<2p%L#3(*lv1U z+w#0~GHIMGD_j-CO;a_kv=V-?8TgeSJ#b=17G6;NmC`(H2l_X6l|lR1FK!j_TZT0K^BE)SEo$;zy?S7MaFo+pVu>fqiTwBV{XK2tC7RanJDyw>RHrl4 z>cIVaE4+-wBrTlICv#4x6V4VhrX@_vi7Y&?w`=Z)mQQb9v%25WwVv~H7|IDgjskp- z6g+-(N>ydNy&t%_>1p~NRXCbflj{kpcNA5@<;jAkxyI<4(pUlPcS9hmoW2iCt68d> z_dAF^+6JCHJ>z7$wwO(bZ#S~oIGbIvU-yjT$jPHKTrYewY3=&jhtIHP6vmY? zNVW3A{hhRgU6xZWFVDHT*>O0GpbS}_qZ%h{kG}J=D7V_7yCBz5z78mwBmV;VJ^!kX zZ{hunBA(no7#_|PixSSxEH|a4+k5_c4!<6`|IwbO^95Iznm0F|p)^&Zi*8Ag1A99PHR+vdaP)b}#u^qsRV@4bikbv#7xe&L4j4=~1H@PKb zQATQ6l1&=_PrBVjwEDkRzM{v@4Uc|)Litp2yK8U*)S04bEa6~bFw$}<8z3Dh>p<@Z znm#gg8a-&Nv&2J2`w$s+K22Pc&H+&r8|)D(?)wqf48qs2lN`a9WFA#|OaVTm=+EiJ z3DZf%q1#d{cRYGJaB)7$#^n$LPN&Gsuy^z;EiIetc*kqgGm#jYY?x%C9K?auvgulu zuI2|XR($$uOI4P_W<{Yx&^iyWz!=YeG#yb2&A0* zJKwPPH?;ZPynGf^nDZ;&`bwrS)e|T;y7AANONF{#gvLM zOEF%9mADwk0ud1}MPLFY>=p||0;2MWqeW#osQWqln9_;eNfQw2Dbla_AhZ zO(Tw0iJFVBkT!_ebYD=j4DDyB#(&pHq0iR*)5$6s?%SP}&-FWVR^Dib^B1Hv*xO{_w|yr}le)_qTcajf(Z#Puaiv4VvwW z$+O>vx%>zzAly*W8o3$K!rsc|^@yOQ#o2rW@)z=K z>3m|K7IMyJ_-MZpuzrh+!4%Y{ zAa{Al|>pYW1B{$=iQ+^ky`lNon!o5UzlN&xfwz86Qwem!u%T1#8wh)1hiPG*$=QkTmU%6cLd;jeEu zGzUjBD&F39#4zE}lPTMF%evWcUKt)eTCzMl6<1a7943#lxIP>l4?D-rz2lqTy5g!F zWl?(buxHcvtak?#8S}-I^Y`E5v^E3{udlbfeQ3loe78EVUcIFsb4+EhMHD-AF;(oE zPMXLjo1Fklw_U^b;5js-Ec}h`nNBkf8qnv4Z52|Is6MN2l zagulm*3%D>laqxoN#4G>!&)sZjD?B3dHb5xs^eiba&|fAooDCV{p60%KDowPC615B z@1FDS*Pc+7N+!5X-=c)Ekcm}0jtGMz(~-X4GM!jXPtLf1y~YiV2*%xLx!Vkky(O~} z$&gmT$s`x+|N3FaY+m!|$$~6{ySJ^xEFV9zz#y)GdS<8>wb-~{eEN!4FK>mda5y|j zJLjaXaf4=c-;1+xHnp-aU!I&vBqZ%21{6KxfKs05*Vd!O1*9=ageM(1cu4S>h-Ry8aN))4Od*O4PT})-M+%zkh@FANem)@_; z$mAPTidS|>8{Ok)rxaO(j&0gV$zoEY_^ThWAA}*bxi{RMSr(7r(W8vF7d3Ah2f_2# zJR-C&8Xo4Fi=SVzJPq7$9s4ozrn%?CkET2uN4~i431um*N+K>f4t;klUP(vr3%u!)gF>p9#j zwr>rc@aFC?x|JrK23 zm`yZq?jJ;)8GPW-CU|g^IAwB*pkUvn2(FO|{2UcDyC(4Qs|{VJAp*n{L6e0(NxYKN zImopmuQO!|lTho@ebyzWiA1!b8X44%!+0Z%t=8T0c3a|x3g3$uAxGCsyOy-+;UoIU zPC;uhN?t$u_|FKcFi_<@G$XUE7x?ldPw}|3ML}H~nlZ3Cbody=i8i>S^DLwz0mE*J#zU3%B(CEo--D=QFxt#yAEMe5Nxa;{QekIEuO`C12KRVFQN3 z0t$s;bb|=I>&<~z>&V69nv;twy1}yA1Zk5ysiw@!k{dKVUN*=%A;o1x9CzYQn#=~~ zg_nEgz5}NN2W@CeaPmyk@?17LiBL+IJWjqM$oKMjj>`+;WR%Tx%nju{r=A#b6AVrX zx?qSNKXg2-?-=?<#EQ|Sb9x+lLObC4KDAF~nowHE6;VT&<>)w*^;F!pA_%WP*$5Cm zKD8nMFJ>hQj}^zn5d&$D&M>K~oIr-X)P9F@+@N*18$wT=j(Hu<~H!b(VOg#2u5VD2%8o&xJMF zj3Z5it~E@p;&M6R{gaZ@ET>XXD8z*=fbPtS5K|Tt^2wZPIzyH zF}lP)vL?CLhIU|x?g*ckvq+q7QRjGvd{$amX(acTwq#flHKKCDRU0Het!0m-tOXD; zq^KsT0o^MRlNFJnZP^UH+(V+24k1ytNtIJn8Cf|6ZK?7gpOJXe+#t_w#sjyv8OzJ3 zeB*EYdpWs$#KUL5iXQIaSjwWvP&T!Ls;I>QHJb;XTp1qrj<@%LlU2rZW4LSJ?b|*7 z^Z(7Ck({OgNkjDTAC3I?G6Mx|jP*8pz~W zGO(buPw`ZV8$&mA5c(uU8;kY|Z3=o>AGh+XFLTReQb_Czb$oSvb?m#5HxDhZ zUhnwmqbEGRI+IOpyW695MOIX@sSH`h>$??kyQS#@<6xw5smyX&z-XyLj*NZ~)`uHl zY)3SKd1ZKVUh}p09}9P9@Sd@|VZJn+RHba3*3E(K5P1Feo-z;Y4v$3qdGX>_1dS1x zmzFwjm`tZcjR;`-{lNXhARF+j%O$5LbBP^gnUfm)k3aof7Q3djG9A*^;ra$c!T!*RxV38!Ji0iMjP$e1$4uYL(Xpp4 zYhuj#-lsPLx-W^me>vl4zy1VUI38B5ED~mu8Mm8;+q*SYq51aDJi=$1@Bip?-hS~Q z&Zx;OryoWE*WcV7xV`J}L&IWH5yF(~>s}@b>&=#j`wjDI!h4S+xwN_rw9XN7u`|nL ze7|b&Z70sApaN~zO4adlIh82rX0zeFtBS{`6`y@^%gs&8rWvKdXBX~i_j@JcDVcqUI3>r<& zdW(p0g)PXdl1ZGf=m_;S{y2eeJ=}6kH`1DEL?ZHJx}r})463BI*P){1a|$f#u`smYlpI5B=98A}Bxm+PMeCyg;@{l1phg~l zdqVqpa568{(h1w{s>0h738GE^8-Ln6Zf-lvF`Hehse zM;v>gkqId2_$$Q+#mx{QME+`rxMGfV(x|}fS-|6g*?6{%rrQ}=!0Mxb ztBBI(CgO^>Fd8y%pvh?OpnLEb5gC;%@Iw+fWD#r2LPSZwZzXc6h`7C?z1OHomg@Qe zTSK+5Olr+^;mPPQ)t>1ik1nFLbIK;zruN&-t!Movar568wy&=ygR7DbZK7X_3CogU#Chn#)O*^duw?lWl##mD5L5Z+plBA20exFbLs1u=1mjyv$_ym~Wo))*Pe)boL}lM17ub%E6`HOtnOLX8gBA%!s_Na!?dKu6?AaC31j_%XFb zozxl=2j1N8xr=X6=PL#V22-aP$q>-SGhcXlPTZD(E&+5v8`)SvOsteVlkeSb8@9Vn zVy7;QYq&w`uOJhDB_T8a=nwyqA<6nXNuW8xlH=Ovfl*`he6^= zUArat7JzY3gi)n9@i2%WFL6n&QDY#MMjB0{g)l48kYZTd2EXnYo^P?$5+;#|xFtm7 z(&?519^_X*zNfrilgQp6aDU|fGs!{snCQd`8~ct@De4@idF08o z;{DT#vssRnXKRahPDC-2Wt5W>DbNrXQeH_Tn>5bVCDo)LlPF(LcUa@Q1K<70Oa7Pt z$3Mp3_ecLcpTE4u0Uw@}{GET}*ZIYt`-ngN=fBVJi6exx#s&yL(CIyl;xtVh%10*) zPU?vazpCj8?&zS7u3_vB;w;LtjLD+L2q65H)%7)#dcu1jeO*NK+{(2jpTEhZTTVU~ zf~Ks?{XCQ9`;2NzL?xjaNMJkphFBHFiKWFEsqsXbu@T`}%12DW z7@|BE)sSNB%7 zc*@rHBCcB_j<{4#A?e0J(jbl?4T-oYYgn{64ds06`d*&5){YEbCs(?>K97qXy&L5| zQ5nzatR}A}C@B|+gpkq;Dr6#-x1HQ4z7nv0tB$XZua16H>>7`?R^a6Q(DIv~yy5NJ zd!9U5@N_xl{GBCslk@7$n!|%5Dj|xpKOE?Kk0tQoI~SZTGU~eITW6=Vhmo7NZ)LLn z!TV2ne6`@_=8nU)e9pE#2*(Rku)LhJ+4W4OGx{Ot`sRSCVwxlf2g0-2Y$cL)b9X0> zl36t)V0gRU(YS%LMNM-^%{J3|N{mQj;K{6(HW^K%t~H150Ksu}Rx+*ToS#m~jFAn( zcJSQocC^C-?RLwutT;Iif?uPUtetal3MG(UXtnz#3k_pUBb-m=>T-h29(pZVyK)Q-Qtev4w{ z-S^(*Vo~vfAAHX1=l9&Kdsdz2;-qGAvcS6*+@5DoPkD4XgF}P4I_IJ;=-W}+c*?9o zDbHd#V=*oH?r(l9i=c0Oc!KjroPdXJ#ms8j{ef=h`S7D>bp4vu!wsM*ZAGOrCPj)q zw0p-7USH!69Z#MurBSEvUz1tbwN6Cmyv&Y`Rs%(4<xrjqd4fsKGF@yqH}jRq)B-W(+O#FR#!4ryIE~{ak~;H*XeR8&Zcg= z!$g=(ryLG@5wE;45|zlxob93K)%6_{J(cLitjIWhXGZ5e+x5Vq3(WJ3>2$%%^@^rb zOtfJ#u@Vc^nU&4bY9+3|G!@m3p>t#eCi9vwB94F%kSVYM_S*xXr46cePNHHe&-iN{ zarBIbp7ni}Tv%6utH*}7Z%f{OF+lk1j1uk~cR$#3KFgUeGjaHg2gBR#$o#D5qwh=^ zzF6}xj@XHXydq=T9QH);LVN$DYEPx1T5WW=efHbP#AF>7X_4M6n8bMmpDqKCu#@s8nrkHoZ~27 z9jok#;yf;98q)UbS!kpCHhl!vjI5*DSi z7T2I?GOP;;XNrT)gNTN9=aatf*1-^oyqHr(-M8uw&U)AzdfK!gL&@~ zDserCd&>qzB#6T)%4cMVC2&C%nd=n+GTMp7m}!tO~Rt{3?49+swgmk@s3JIG99?8OD?8U zu4+SVM=FEF{Z#94aTFJEz)(&nB3fltmLlrfP)}zRWt9Ny))Q!j$#-abX|sOylaKk& z{x|<1f8zzsVXJEAsH2DBR-MOI4e*VI$t;3_{b_N@py z_V~UA5jPZZ>;?T`ZO-EKT+Xi$rB5!smXKoiMrHEnb7^6;5|>7VvD9LxwTK;ZFAUz0 z9UFi-wv&o*6BXV;**3y*3pxXAb-|cX;KtXxR5s8hzW?B|LR=Rx`8Mno|0JYZt#5fH(ukK!0-N@ zAMlM2PAI3I&FwYA7vH1Xt|^~flb?MJd-4uZ7vPaSlfvVpl4qB($Z#{=lO>swBGd-@ zp{MDcw5={CHIpi$f(S>)7`scKsrF>v$>*cUh>Y@VF+&hAz88W*Pk|BEl`X8CKQ1U4 z(i>xCU62JO`=3J^B1)tetca3T5h-kn{h^f%Bcj}vk`MsMKsUc%R5_)o@FA0OlJO|Q z%C$kD_al9b@;OKWMh?|I_E(UGLcM%r_Q^t1gzhxH9$lU>oz^IT z5Tz=+J?vOa=INm|1Yx1r=(yW#xqsM6^UKL%&g12h_b$$eu9udNI)}DxxZWT5@tYMl zjp7Gy?+HqY%OleneKSaN%lq$KV(W}S1)jh9oaUey`kK4lJ-**kSjV)qtPTyeHDF#@BdyIwN*8 zH)M*#5j?!z?B(^%>j_=R*f`C$i!{5)wr|L4%eEPbK}i$d>9Rs=1c*DUYbH}G{HM#4 zxlCKGU)_tH`1RX0qc<#1=TZyYbPcP+ftR1$;#-(1%jJ_=8Z1A3aV^}bZQrvSzTnBz zOSYrp{OS?s?^@P}t<>+HE;BNm#4U7T`N_+-{NR(Va$L(`|t%ytc~Ad$#R{yVW4>hZ_`JiNWb z1(#SM+TcqgWehhDJ5J{dE>9<%o-cWIyXLb`Z`icGM2pYQPXxpp@dBQYIEewFec}{3 zc-S6r0TDa9E)a<#)VVOQ*^Kxx%Je#~A=8e&-{Uai$_xtdLBy%Q<`IJMrViVYyL-#k ziD7Z3xO%T-z3%B&&0htA9{&nFtia~;k+bhu7N?Q*J~C>}^M@VF4-8-bTFDRJZa8$Q z0$gqgcNtN*a6u}zW9N`Jz}jQXgyc+-&91B{5%p0RS3n@S7$6A}qZ1MAull=dElq5u zD#51>h|(fJ%J&@idx8T{=_^FYB4^*ISbig8rw{CUPfwbpj!i+g&t+`XMuTcH+Si`l+n(saWJ;n~)@b4HSalTF@)Cu@?HXd!K};?dB$5FAgF(+rsxmN{ zc_z!i<Y5*WW$k$>ow)H*3EC*=uPp`_|VU6L9?a^IMwXfHqDXL5T}9GL9BMh-8JerHB?$ zmy||R9pi0zuviatUMb)9@kF7*Z@u`AW(l#K}1+P>~c5-5(fVZyDz;zVP%;a**hdm`D}{Cc(H} z+Ng@VSaXcSkw7y>N%_vvH6oGk)V60c3IzlwuT`5&L=zW8m=QNbuZ~dgA);d9;gxwI zr3)fVijxami1N>%g19;bsP5!v3oB_c&AD0>oY=sL)yy(0&1KUv!@HfhHbytdGb}TZ zl_gPS;;bslTJAyhWI{QeQdU#6a;VtJHPDScpZ@TgKlUeooic}yE*-nOH`Hh@=Q%(7 z;Tiwvzx%iG_`SzmH=fPtXkBCwL!gt0wGlB7h)3#~xMx!Xwk=D@ND;gUUKnsaO2c$M zL8}hmA9#3s%j)@$aGM)q{iZCYix=-4*^GNiS(lqfkhfO@rjd|?xWH&s*4=FNBL3ip;1LFFt8P& zBIul?kktT8(thA%Y+A2jN<$AVQ zrR4VyGH45I4=sbU;@$}kv~J1DjLeL}gF~w%ibNQj9j}@O|Ku^}-}t?pTs`7&^D*Q0 z2BRHb++w7tZ6eCcaAZC>%2~(quIFq8*XzKGmE(3h^4*Vbg$?{We(o_p|MgRn&hs8k#^`ALPlmYtd-AS_OO9mqUKr$83-6Fzo)R5Gd-a( zE&Vu3+jsALYHl5k6uL~xk{FDLPo@%~T=tXErMRMzq(O2l8{yB9N^#5-kCJDI8(O@G zhMLTzAzXn?V&sq*UEO$emhoG0e06+ve07LptPjDyNjw3)ZV!*4J-2 zoh-Of2dUuBs!SL{QRnO*dQ@yNMDj2&jX7Qx;T>hEP$tLZ2~j`e25Mk_3zNtyBOufKz_xj0Rn8M)hg z#zu2@eb1}wR$$jt9r@s5P98OP4||HHy0c93RR+f#L5C$ivX~% zEYIG3M}8;Q4dm9y;`!`!CO6X8ukL}8K19YmLstctXK;3Uh9X6Qq6rXtlr<8EoGm9r zGm22Dp7?N>vmpOOryqUk*ti|-mGO|zL-z>#(R&LWrn*~5B%`% zmE7d@kX#^-FBeSCr@T9zV46M8HzP0Z25IE0mJ>E_?wHy%Sv@+uax%|YZ`QnB~g}}pM1f-^IV;u@ZOU%Ha9DbM%;^K7N~3#LGVTt~&KqlMs;Z{h zZYfNV1!q-RaZDbzJ2Xn5_Lf?vr$%KQhJ9i|j8dQ=uynL$GA)_S=Dd1ykJ2ParBRFn z0xFi*S|N;x*{q`XF-1CbL|Y}?j@5ogGdjwuz#kfkCYn<%r4b%OS;PD9o=Jn@Z+`!C zwudMjm!hsI^NQ8|9a-jO0iT#Wjx1M9O(Ayew)1I|hmnP|)=vKXa2UlwM%0{43(h2B z;PJ}yux=RK(aoSN6Pp1of6c=M{BGd>KIhFv#*;^$zk6!Kg=6h4#xhVPgZOfP&)QJ+H%+&NFOXpff9*UliD?5DtZJ8<`#-kK^}<)Q<{Ie|Caf zNNv9e6J8ns6>68^8iNveb85lUSpvX{vjmH3E&I2D=4K@HK|}*A{5OEPG(D1 zhmjXwyvFZ#$PNv4{Qr*P+_q&;uW0WK4=;_} zw=>z${j>sHqX8}FuTn6b7EGpwn`U5PbDmtz8SBWan+-pHc`KW~cb}fgqWkTe6>ZZ9 z>r0!o4GPC5slIPS?2UdyZfbe<*sNe^EiqJ7WsT8kk)K&B#RX+KN-JP93@~(LHi+PD zvyg-g6#YgfP+VOsu|?XjulGFjbKfgScq1eM}Ctp5BaohzRY5ho^TWOOGt&;n%YcpEyMWl+^fJ4j1-n*j) zD$bK6;F`ioRItktCuD3I85THm0Ap#&5?xi8ELFGH(_BQjYN>EUhJ$0*D286%|07r$ zYz{gD7lOF4hCaDR$9+STk`x#_b9_%D_#T`SSEX_jm>h}IlN@c91Z#-vEnV9nUX>W+ z8bjx(U{Z|M2b2o({(;6}Qml{U{s>1to`z!y0z;&E_i}$L zv=zseXw?x$2T`0pM!wfLjKacnNko-Oe5+IJX`U--EPggG_~w&S7P>?A4JKNt^dE*M zZESs%b5djIhIBqdpdHsNFAAoMGv?<@aU)3?h8v~*_|wl`@#lZ#2mHxD_3M1^<6HjD zzw>Y8>(3rj&oVBSBVT{-gx~&)&!|opylo3Qo#8_-(YbaAj0DUGg;CQg{RasLEoWldhz zxeO}Ae0mgRl}ln6GMtSv98pT6EOP%>h-rK#Vd} zD>ATIMy7HgC+Yz&jln&`0GXYTX9ZpZgrf@&0>|$eoP1sbnzdKb8adB3i!y^?Idnbp zUv-pbKw)SdS!a{7qL#r5eG`NJ;h{( zu^rdfTQXDf?T?;d^nv9x6L@Ibbwn)ps{;@BFT^SFt*2A=&A@iQ;)g#@w#w7f6NVAS z@xbzACMvz9WWC!{)CE4%66f3Q8}9dOn!!_O&pTHOzV+cV-Z?)-Wkz^G58Dk9aLp)< zPY;`hU;f^Y#m4`^hwsp-0;`okw`X(9<>ed&)YXi|EUD$I)tdGF1E;4mzV_i0;Y*EO zE0){+IxQHA=^2AI-0oI5*YWt`emY}0EjT$TsER0Hdq0eXcE`!d zl-cBheLF%xrj%{Fli%Mt1a7_Auf?{0F<%JG`itjxytp}V*!8^l;+kR5oL`-Bak*eo zO}Uy*IXj(GPipSgYc@^8VJPW>6_Mw&pS%(Gip?rkyAF?{A0tM~DnS6lg;nDCT9k%q z5pmU&ebck;J*#eHwcT)k*zxHXx7_as-hH&>=RSDGGzNa-%{4#%zi_6iDes>zaG_w^ z93aoZT1J!zj$i-anY4Fp9vb$$wM=w!YuKs>CfOO$TXx%l!?tHw?>Jo+GKrs0mm<7A ztgm_T>WsG{cK;SJ|zo|+QP$YfG8Xy_kb&~^_3ZjUm3A5pntGB0H#pE(f# zM1;};@vNw-78R95Y5T)Q+=fMwV@xa2rv5O;_Gb)>_JAcWS55jDmnq#fN?a1?b?yhFaCEI8$V68{RG zF>N!lNhM%-iRAU2Ovoi_sge8DPoszOi(wWSi=UaIuVCG^;zCqLV_abDEW=I_JlHac zQ2;7S%o;f(21|DzY44pZD2r)@NiG;Uzl}zO^sC1+e(Bp6eDBBCJpcFr?if`fN~AQ3 zHNivM6L%UlOo4EOl?RD>!~zJ2%V@W=bo&f{Ftj&@c6}6kbV%otQa=^`Mkkx2*(_&% zT1o>^=e&p*gL8cGcE|NyD;$)1DieHZmlfumb`mo}C81>)k$dYfdT|mYaB@T2Y*E_C zW;5nXW~UZY_LLH@*9?8ddbdr{S*s;FGO3k_TLzOhN-3k0Hu?mDynf_R`WOkaTB1<> z=p@!*GcD8bL7x3S!GS}P?bMNZL)z}i=OO2jmk6qWg^~a5i6(6bZIM8`{UOMP`{F#~ z(T5oa)k*|-zfV6y>m=@o1{ovdLDnd{#^BWiTPF8QztP}>#71U|oW-f3b0g0m91o2n zik=&2SC(O?iLJ(u0734_d9BDRMNtXMN8D&hMO0rxsdXy!lnqKT$+^5dWj3Ekd+w{7 zdvP5XrIkUK3yy6cm>VwwekP*6rrj&Tm`n6hO&UT5-W%Ki(Pbj)l(_;Ma2hEWP^CUb z@Bq^LN(ku6V#-KfTC!3zKU36~1C)V&uQ-HAGem|~VmfjjOr=I15!m(zPv1KF{eatd z#PlYUG#U4on?wf>p-IfBu|iF9C@sFSXf-9OATca=bVw0IdICHscPwSF;y8&;?!&TK zOy`>+0wEm#M)Z6MPa__kf@16oLOyqta z2y&m&@~qASM>x3r{~=n4kuW5%xy>VxxSJ>#oR^=83gSG~%92}~BJ|=8ji|f;;UR&R zc(THv@j4O!O%yhlGDe2gS|iW8)Cj6DSrXR8Ip!@P=F;?tNm1h%jX2;`j40u0=5l@? zZyapyc5t%hGR8~kQIzO!;t8uPV`3|2 zbwQrb1bjdG4y!!5$we3*R3r$~Z@^kB&&niPD`{#qRl3&iR~sH4Hd3(i!PO-vlbNjD zUCiWprHN$ek#JmEjS>YdY$oLlQrZxZ?@Ltj`HKh}ISz4<|2xXR7>N-%*VXY{bYprB z32&}6B4kAjgOm10Ip1Xdhr*CB1DVOi*=PAJIlel+I=(u#`z`Kl$_MYg%e2sFY2=x* z-L-gYcyvDH$<-zATr3$ILs=HW%=-LrM{~4`mQit5*YfvA0=sd^+trr)b;E9RkZM^0 zGa5%#P1)aX1i1X@(E?k*Vc+ufe95-)+^p7EJoCB$;4ltsw=ECbEq-tk`^)FG*lpb* zF>t1foUAg;P8J+?Tb9cOm*+G3*0X(BQ{-v-ygWJQ)SO5hakn3_wqdnt#UhF}><`ej zk(u^fU*FR1sbRn4ZmU6kufAH|*8G9k~K3;N+8lh#AmqCK3SO!)ctukdCn9H+OpTVCI7*fu>) zKT^~go{Y(C#-m5)JpbY+yuI5pd07fWshk(GndvB4FFTkMw&l0#;oV zvS{rFFU?Gk&rhX9;U}NJ6kgiwbSD2^kBYJNI2EZTQ;0@dQp=*0_{(l9tPXiUs-k4{ zqeO(GG9bfRl{6#or4?pzGNH&|cnEX?vW|EUMQK=`P1vm);qd%*9p2*(BkKpxYHyj% z9gpAD7&D_?7vyBZXuE#9p*{4(RJ%hOLmP2aWOXhueLqHauSOQ{Y2o?Ywn3)YZyy|s z$-v`_84q_GHce_hiv*eAW`$+cDMFM+-XaW&Fe1%^{g@Pi5J|^RWvZx<1z1S2uYag` zCBp4 zRSlD($9PTf=d?pZ(;dW}lnGoo7f^g|!NXA;03S&kEJcDRLvlS>E0L8L5SCT+k!k{1 zp=aSbBzh=f6`+rG<}n1>v;t_vMJJPPjsli!28@+WtuYGUYr5S?raT{g=M=qY*z^s} z&T{h{%Bo~mwd{y=A&PU@_({kUb*!22{m@<%;in54QRlwLF=O>U@aea{3kRBzPCCrqwv!xW?3<0hm9#|hX zs5}T?3#Diq{4OO(G{c&Gpjhu z3r?zvWuZd*>D zKIO@KA2Ey@zV~ZC;E(+Me}X^yC;lQo{PZQ8Hb?}v6lRhp+LCg9!PkE7=U5&BL0gt}M`Fy#_kpJ1|y3_Lb>*R0>Zz_$-5 zU5U8Xwhyds*Sz@24_V*dQCAbHVu3Z4tPPZFQ>-g5X?sua3{^2Dw}~s)lVepb;*Ziu z#4VVJl1Nn&B5e?o88*2GCEle;t|e0{GLsyo!vKooeKS+SsX{CI!=6reOipH!RtTQ- znxqZa$#B3bonY`OaxU>W!iet%xh8aaaG>DmEF9(a?)Q6)fk{0T2a{Gx1RrT}jzPo~ zW3>SI$1xH|h0TxWmPURb5&iwKtyKW+$oB~t`DZE|&|j8Fq=AqJDVmUi3;CxPF(iTQ zQC7~ysD)oA1r@mTWr|u_HJk3?I0#6sr`jmNJQzCxQxIcnxaEYn#IX5jYzAOqHC z7eB*!al*~Vzsdc}k7ZD=j0PKs!ywMu;1#`71ORbJ4w4#ix#lqTtoz9BRm1x5S_)Ub z^R)%b#Y_fqHBX>T%R=IIPcD!bNw6vW@(~HYL$Py~BalPzivm%$@ zBbU!y%e~iN&~Pjz0Hi(lD+bnY+40r!)nTm?kg`}QMWHr?)}cqoNs&>X%~>uA+QS`T z=*e|Xp>mdGNg0Dgm@1p$7+4<$ilUN@=&~+3olPXB6Qbel(J5m*h%ltI$Dw(1bHlv0 z5(SDbu&hc>CQrqlyk6b&*%#0Gp)zcnz<%o>T3}5zF)UANX=W*B6^n&sS~$+m=Im|6 zGqBnAMU+{6eCY_qX>P){!bVY@3eNc+OA$FF^gf4P|+t$ams=TFeWI61D@( zmXFxI*>HEW0c>hAL2*57Xa~jqplJ?4#GW&0Xhguj+o9p@YR_`AfV%^(cQUPf*tgto zw=B+1MbrpNi#uVv*=yw+pS~0ec)!brw^8|z4tEfEDFkeAeJMO%JSqq*~f>_aWyXm(*EZ9z^{Gx zQD2w(s3_O140yj1c zjI8z#eDKaw6qdKE6;{Jw;l9~(f9KinI)QZOi<-lA%iG(QzJb>d_betkvuP=d^|O;H z%ZbMO9%pjahmk{bkcf@7fz$bn!WdRv!|Lup95d*h#3{-=lLcTkEhvI#HZ$Tvxxe3u z&^Vhf*sS)v{Nhexv|1J56_DzQ^BgWN&N;LX+-){e>u(CfZr{lDaki`^`czh07EiY~ z4TUzc$hx`Ra#AZtW*1Hz805fG0dvSRJ8fk2NxNk&Qi$0h4Cd)k$ zxV?Gc{CrAPO=$YGI43$O0Z>NMG=nUn|GJJCiEgBAgRrYEd}Mh#a;b85mBGd-^~sF# z>_mi#{ca~>a=YswXmp;503`?zr3ib)=A~o$j%86Pw&Dn|d~w}TSC;o5P5IuYk?Eie zojs{NOjc#mOekMRUJCIDaL4)o+s&%c(#E8`M1YQ)Wqx{Cjj9S%mC5&W-H2~H`Tp5_ zDm*jq9OdaLp{yA;JNz(^Ul^9(so}(P7)HEH@gTe=GzI>U0Sc2N4#6mmlcN-L#KDs9 zGgN0~^J}I#N?c`NrDZ8FGy~g1K$j!-BI0HTV&0S2Id04diKt2(JnE;vtW3Htx= zK=L^R>j+0?$E*-=xZL9g;Zh+^1c}LrlOTdQcJ*6vmK}lY15r7N*9Pm!gAuMsyAAjb zBFE-1A|U^iFH{uA0>T>^Ida0}vopeNGQzkV8^^ovO?dZf8H3qNr0wo`VZmq=1 z`o;@eC@&CpSRn&8r1i4X3OwMWZ1%$7@Ky`cs-BfB7jtp4-QC}_-t0hore}tF5^461 z!!F485uv<@D3?B0*D0C$2Q-~2#Bq>k5#tJmokfkFOd?dN7yunpT&d8+Av?x_4feER z`XuAg2aegIBZymMB-+H>$!ks4XYx!D{+J>`%}TSe&rDe20@qPbmva+uUFmk2$$KMHLtP;QK$~kN=53!5{jA zf0!Tr@KYH84p9?QUI`uLpAx0&y{2&)PUl3c<^Be65N1x#{ll#YFyFYG^N;#R{67A% z|H!|Qrxz2({vfVQ%v72|v!E%8D6zW9$y46@)_0iAPKbWbCqMiypMLg&?Ph}?k{iUe zdq%gCVGdYRXD~1RdQ`A5#IFie{117g^>O{N0CdbOk823To(ZpGVsPF-kjf!grOG)IZ-p6 zoq#SxZ0lB@vI_Xv5JI}nz+-ZY(gN%w*8{IVf6dz$mal*7BOZU}_Yv)cmp}e4xQP-d zaXKqS2wtyS)S!5De#)$_MZ_B2Ap6AJ7U}%N;dDgnjLd?P`Lp>WMYWC#%?Iw%oi zxep3rA&To*FbAbof?Dw^$ZNM*6470zusLL23)^nLZ?GD4nG=GM^h@+X#IL%}Wk73? z^W-Z5>$mFo>iFuYCxti_e(-}=;5_ZVq0DoMRDJ84Ph~>z=6Wp~TBRd*yETjHRN&8O zkEyHxwuiPSFLDN>*lyPJeM?;$-h2NFR3)yK?RrP94Cg0Hl$8aZOntTw1J;P`UfSkP z=2Hkc?a;DzL1J&?pwPM$o<)0o&-qEi(??efzTuEnCyUQ&!?xz1s_`WpQ3Yt=ac`x?RuJa?U%CFJ$_m z!^pIb_z|=%nVd}t)0!`CHnI?}Pp_ozf4$!EjSrs*V`IO2;L}fDlVv6Mt6msD)9DoL zwPfb+cL(~erJm$W%9%9gO(%uKOPtcUVA-^hZF4UZm*^Bj>}4`r&8K)AMXBZcm1QYT zJbcf|q+n4Glp1DpP2O0xW6y7X@rukjf!crL-Amqibjg#`oR`-fpWPhz3%~X``7mON zOePl2MtN;oK(>bMD$w2?IJEb&h!35oI5s@3_iJ9gIdHRy3~nXoq0$q+xVa@)p2M~w zMoT%F(0aqFaXh`cm;xi_FbWf4aRKYw9pC%$ zO2G12t-zF2bHFOD9!*8qd;a`JTyY*N-}{4aJfg_p`sP6j6MVm68!}d-W^=zIw=#*8 zSWup8ftR|`i(~Ml$~nC{LHm)b%L#*P8T~+BC>}pqa=#iy*z9{p*9>eo2X?zX%h?Ib z#R;>irR#RG=+Y{(nAL=EPjeW>@l@wV9^hq}Nh4QlgDmp5+pR3RFHaX(6x&0`Z2)zUMgMxem*2H% z8#G2Z5HN6hHluBO`HK8McK9){-oeAcP|qE9;pjFE*ROgQC%pUgDc^W@iB>INym`w{ zK6}me+k-U1p(A-ls)HXb_Ya;mBeVC7@caf7MT2_r_P|G1Cp!}41t^)p4IM-gZ+$TZsbhGAofy+-Arw1B{6Ggedq<05&dnPaij96hT9 z8cb&K99cO1K(qG@-peAqzK9H3Vt2>QzLI~Uj{g)62@=(uT};WR3bH^s%_P?Ou=41Q zmgdLxYeWB_#YrQ7-Ga%Dh*-Jo*@Y03gt(|he1G<6!E#!0XuVvk+lP*R?>Jk|(Mi1m zouJ6J@Ypy4y)+<=Ly-4p=taCb3RnpyD^WZQDV>+v$A;dCSYqY|TN=nTVGPOP;zNSr zdQD{lR~48H-g+3LCIAs90v2dtW2G-eM5g4z`tVV>Twl8KiUJl(*w=y8n}BbufY@cD zDNZyIDURZTKMHS0o{2Fca+)d^;i20*VRL=(tqFSG(nrsDD7pQ(W%J2MWd<(a%cPOE zliw=}UvucSFwlI{)8#pnc|mzrfsK@9AfFhT-m~4OT78U?O|K3L*9Z3ND1{mQp%dm# zR%G&d7^~!&SJoLjtHC3OY*u3wr-jM1#JH6*T;HyEbA3zOwNz({lS_n?vfTs`_&TE@ zD8fX^<_;ePVxLKA0bmS1mg2xOy}|7is?+qDCMyszN|O2oP+IT>c2-OLGMj5==P)_z zDW|>MZ~7x+&sZqxK-DQa4c+MRF$sBr2q`KfzmJH!M)UvB5rM(M_5ePBpFpA0_w+$r zQ$cHSGL7R%9Knd|Xq2csF`Z`;Ba9>#Rd$p}1lH}yLXRCs38in&wciN9ohPx-}Vb%<8S?azlY!VH~%)_NRES-Ha#O; zulxu?uaonsoDzWPq9P0(Z$A5k;jrfMS;58P5vW}FOWkVAdbJY4Q`<~9m}5Us>wuLO z$xiM^jGYX0e2NImdn(|3B3jr!N5Rn;JU+pyqZc;|-Vuo)pRu?{kHb(cg2d3v_mX>+ zh@B>JuYSrT$|&T$AAkrRl>B{@VtTn2;Vn85$%Q$FG(37@RMNH>T_=OAqLhS1YFQ^7rELcbE5+Ko$eu4U$mk+g_ZwCbKLSg}5wzFqD%eN`UzzR`_>X_@~mO zHzY8;ia}zpKWI06^Jl-slW+eH^2w6j?PsWQOQ4tbL~(^3-Lw#BdRT7;Ufwob-#d9f z4+FCAT5k^g`5&xtSbqMSC%pIc6m6H{=@II;1wo zkgiuPB|E*~R>F{xTPt7AXVTm_#-5(Y=Frl%EsYI4K3no+dB!k_;uJd^dO3d!TVRxk zPJ$mXR#6&K^j+t&jzTzlS_C^tpG!CNvW`)uC6niqmZXX>yD~?}fhZ!M+-nRHO-w~Y z$LQ%y*UYJD$5EaWnVi4K-gVdYG+kidCg{FR_k;gm5U?!Z_-h_zjv5AH;QuAZSI1X} zBGR@4-9Z7+_K_|IhWj2qzeAZQ(CaKKS)R|RYegJ8Djou}8aFz5=(jEi|DqYC z=}X|Rbv@_${+7J3yz}IgZnKu}lNA+1=VZ~|wJpBe(=>N%ddI#SI5{hr>x$dehTSmG zb_(;*;OkDBc*eVdH>-iqU+ww&#YF7iFRyp<;Ov?$H`{|u_zv3x`z8?bLLMUi(24AEzM-7d0xlkf7f~^(Cbav2Q8};Q-m%*s z2ue$fiyb0$Q8SxptWm#3)6Zr*MM z)Nb-9+!$jcnNnQLr`$c^0W>4z>&jN2aP zN2%M6F7Zk>tB$@85~B>!3pdT!#FvOtEndhXsOg-Di1Ao|U6z)U<&2x_8xcbk{Pl@g zN~f;?-9B>npqS1L(@8*26KARKds&$6$H2RnXDpW!&MqeW;Kwg{@nVg~%Y^>4Hqr06?Zs2qlgpa081uCak(1jpvsbf0|tlTL_d7>o_ zb~p^|_FjZjT%tKg5f2~$SWR^?VfLtm>_Ab$e3G-i_iWxO0i?S|)80o^A5sj=8gZ25 znWCr^Ssu_PhyWVKAaLbpS930wQ{LX~`Rvt7?)`l?Qdn{Ph?7eAVmSh^9aK*Y17qmL zl`^`tfp&vTf@L!sQ$-*gLFp=eiSS^LPNuPq422O^Qi3;+sVz$@!l)_Z$Z6)p*|%$* z#Os1Gj7rnRV}wN-6hRvVFh2H9#0ZIMNqi_k3}8Id`9NL=x3M)pn^cU0|7MHBA^S7Lf+9e zmRhCc`(|Z@*H(BlcX#(}HXFzgTtGP;8AoY!6c;;DvDXo$a*C;{R(I$agvS_C6&{u&Xlc|E zE0nfSog7(KC-K)G#a&b+7$vTxHX3=a+&D@)0Aby!FI_JNg$IJLbEN%K*fbfDQaKiN z&eM~cC-a&`p{cScO^&YXIP3=zI_z{Vj-1Tqgk!`jproq5%r%xsUd=dr@{Gm#30{T= zd$cr!?)mJKJAUQ6zs#Tf^S{Bb|HjAcniRpxvI3=!PDBDABJh{Iog#NAJ>u~UP8@U+ zVUtK(@SK(f-};4b^GhFnz=!WX6CrsoF8EUJwbDA6iI6Iraglr`a{=3H25#Pb&f6ES zDY6NZ*@-YBUDPP=nO0NI9-oV2DF!EPoF!M+^WSbBq^aEJ3cDF~#0-xL$!WGLX>9O2eKO#!@5#I`hI& zRZbw~a$kmcuEK0!yRCOceIr|36+{ysveskbY z{n~5p_dS10IhPc~bfU=H7S}bj`)l6*_%D(_S!2&Wpx1Nuy?kyWEXmy3 zL@(?-5uEF+l-5oYM~Vmq6Lu=##{jG=D6X%V7v#q#*rxaL zy35QmpOo^?uIm|wPWHM!C|c+L-ymS+&-kUk z$IsLL>i>*Cvic7Hn7{cOT>shs9)I}9BLT(vli$JL{kJ{l`~Tbj4Zj|i{Jy{IpUXe; zZ~8W+eZ%+u{Ga82_kZ{`PJZrp^Sj^M@qhT=|1n-ZjC|*J{T=)*f8#ImtzY~O=I|qa z@XO!hPyC<$xBS{`ek+f!j;{`}_fPUEbupEwK+!6BcmyB0UhO4zAQofqX?86|HN{Cx z#mL6C*|eOU*J9%yqG5LkyuCZnJGjiwdGpDR&1%EhV$R8ONxL0*_41bR#wRPuhu-=tz|Ow{)dnG+DGrg*fAU$9zU63tCAnT*hxjUl{)20*j9&4$J6tLECR-% z6DZ{Re&Fq^2ePatxD4;LxMH+Ch$E|qmeYk{^gVa01D?qFB4=>WIW51B*QwIDs4L+} z+^r9?IIqh_a^K32FdUdw6HczK(7NJgec<`+J;Pzo>~u;Y)16b{IJx1#bYAiFWJYy5 zJub8?ebdPlg*vC2JQh&r+nXJFz31`cr97B^@_FETV;M{#@YLV@(Puc9$;R!_jW~OX znN0cOvzNSC_u^0*+nyl?_F*gSfU!)?J}OK0^D)A@5A2$)wC-G-Dyke#uBJpX-mZFL zo^gIU!!j^-J7)ESvG-CkaJ}vcIJW&QtKGoeZlntaEw$1G7Z-EJcFXqgz@Z=UyamJnZ*4w6u0MLyt9D;sx(K zI_1N!J;ujYuBo9JX*Vsd9l3dPU{dV`RvhCX`TMCo<*-`w_SK5pRiIh#(Op4N8gVRC zSuNk&RF?fP(j7d`Ypyo~=gXR|hdLX9z|F&sC>sS$W(ybs^q#ENOy?!t(BXWFneCf3 zjH7Hyoz#SDwyopk%X^xxlL@6P07oN?h>3w&ol8?=N#yF;Q$Bg|mbdr!Qak^2QL?Nu z-rVo7lbXkiOdJdKq+*oCdXKTm0a{dsJTIA-o_Pj0F>=4Y<k|0;2olnF8ceAqfptB#M}ozSedbW$Of zm`NO`+DaWY5D&OOdc)vIR_4gpk@G;B2UCOGU*3#Z7i5cC+78EdAPf>Al7DaOQZ^7{ z(@5)|K*+aSig#)*zc!~l4{XN~;<3@nYuv8DuPu0k$vN^)0(BiQMHFyrox!vinP!2B z&CzN`JB)HKl6$Eer8K1J9lDB4mI`g*u!?N%0^PPpb%D?w>DxzOes)rG^3GHuhtUko zrZ6oOo6&N(4m4{;7$EeCQx!~Na;TUJC5i%ZPYEYXWz35yXR{OL(Iz!bNIzynvi>2n>ZxnRdj{VRPy9qa+ z3^X?bkTyG;onm^>)U~0`15E>Ah+m$^Zr9Tn26I{pgdGisKC<6CVXes~8zYRHqR!>@ znM@y>|56*O)<1PoWCiG2%d<`e(3zD8NtRoQm7B6)cj#$%Er*8o%-`vVbvN`&#Z_$Ti5( zu?X?6EN=NgJO~sGU-$UZp))P_R;$2dkQO2&Z10ec(vvdSmCvMn z$e_ryMGoN}C78F0ph+8QqQctLY(4rQr8z;DoYWOYcszm2S;fzO_=pdmoKR(;-IX5KQAEM6 z_h@6~`i&9r1$kYIU?yu26EMOXYauFemZ79wQru2Pgwgc-WqFps^3DnCPuem~Dc4Di zqs026@1>MM?&abPhotzW;teGIfC%cL4+I9vx|HXib6!L!lUaiIf@kQv$YeTA?~%g&V6WOm8b*B8{w$J~DU1N!w_aW7>t zLxl_*9UjeMnp0}SJTJJuZ$x;mi;78A@OHiDSAV==-G9vQ-@|YJ#g90>Iy+uNk-LW# z-P=#0Z!pVu$;=6dA+2xovJmlg9D}$CCzYnk3%Tay-mDbUDhZtt17r+~iR_!?zG#g6 zw=6HIY$3@W+>ji6)>3F`QI?bf22{F_$naG~MM%#u+4oFKlQ?1?96#lLMtKhvQ5?)s zL@ng=PB%1#mivcMBo3SiaybM`+Z^b9E1&74tP);lG@yGx)AaxEfVfvb!$16A{$J$Z z`wze8-G9tKf`8xt`d8QkFy$ZnFZ=iL-}^WJ?fm(F;~(eOe*DkmKl7ja=kjO%)&Fh& zfgeL41`#bsP{iA=87r*(R=I8&} z{~rE*|JYCXJO1n+V)={zX#Pw8<^L{!)4Lsi@(=%c!ngjF{EPqDE&ug@*`MWK_}{!G z@>_R&b$oT4EK4rWj6`&*YQc7I2+E0qpX)R!tDjuRlen&qTftWtr9i&1y&oXg;EEZr5w9e3tk;{_{i3<*gMpW!F*HpRX^khagt!TQQ ze3-IaOnB$L39EHar59xRQox0;Z*FCyuv|on%wWfX5=CcAbheaDpbM7!RY&iUfv!!?5<@KUe-0E^K>pP z2yd_Nd2ziGYimEY5;;6s&V})F``K#|UnVAJce~|)6L{%-T2W>h^V2y)=&_}ih2I4k z%gKbN=QDxuo@Q1e6L;Of%eN~&+wa*my-X^!R$M={SOwh>IDK?3ER+4N!G=}@5b}vU z^k?HJb;!C*3&!cJ5Pnf~32=Y0T(X>1!bI{}&x^Y)*AE-!mEm%Ek{o4q#OzyPCY8k$ zFdX`hR}WiRWIa2tdGvT8Q~T|9VB0x~VO~s6_~7c4i-~7hLZJ(Zs~FvirXaiN9(X|IcJIc977-bQz zW5d%&r@VgcY4-=rFmm&D&HZ|0=#5OJ9=3sttddFIe7=x4O}p+`9Y!{Lj}SjpCakc$ z(43r3=zTBO?D@qNo5O3I3lasbsw!0-`<_kb#GTcSO4uS7Cvy>o??hNsyt=-ZCdptG z`dCM7v{ZG=W-e2a{dUjUlPTBNH@ta$BO8*7i-K=HJHexQ{(K|Nn$b8GlL@D1Cw%lwVnL_E<|xM z7>R|C6y73uqT}@4bWz^NsMN8kF<`QQ&OzfPYGg8x_kdRfXGHwVYL6{qavTtkE-a3K zBEEF_$vIZ$WRsk{Hu9gr@zFQu6sH}V(8x4=bC33G_h~aDaA70okTROQfPA9K zPbb951Y-~e(qvY%Sj?p4VYgokY9S0G#2~M$E+My$EQ{Ex5cZDKt(fWODU(E3 zxxX@^@JwsNEH^wp$+?;s>JTZEC+mHJRI4blX{D@e`g3)RvAH9DU|wM)+Sn&f*tB9X zpJDP6YfEW$4mvS&9&Qi(=8r$+M_;_;$3Ofrzy8B7I1FBdEA?esSrL+m{3W#9s+dHg z05;ELh}jRl#7|w8OO$DvC8y*^^PG1k3On{VZ?Hv*AH}1SZR`&0cL!-WuI5Y5A3v6s zXxx^E=Re`~=bs5nuO#NGQ;fjxe=?Ca51&9!oDR&`X< zCQ1Y}c*|ZL3>yl(@9?9QwMw^Agv=0)7EvX5BW>yat`(tC zm~GKBv}?NVAVQejKg$9eE#u(W9=05s0UzM&U;l_-{O!M;$M1iO*FXA;TtEN5uw1i{ z3E~BDFCha88x3Lba*yf8Ai~T%XtuX2e&fgYY_~m4G~0dl+x)MA~~Gyf(mo|~N~j1BAcie0Zrhr$oAzPn*Pd5>@Y-hU47m!I%& z`*;6~`5*pr!QcD$p7R?ocKo7m=^r+1ul^4HCI8m{Jipui&-mBFJkdubF(aEPROZ+<_XJ;~ zbYjQ6xL@WuBmb91v|HzwvtY@M)$ z&d=tO-S0Zb)DCiU9EP6F%^hdUb0+hev1_nc;T{F=WkY4l8QpH6-4865bD2u751yBA zpY#0lTXt>0PI4B@9Is*59oTF;Hk+O}4!CX*uG8omnR=H}!(K_d-2M82#mSVc2)ul? zmW}K<9gycM_+$NJ~hOL zLF(9dO(P=U`C^of!lX=$njicm#n3um$pdIMsX4SA59@pCNr|;He)7cwZyz>P)18Q{ z&B3Nt5)M4SStrQs=s8&^F3QN{>!&?}Kf!w#TF45=S}9IS!*pU$SrkXo!`+sLapcY2p3%d_tYTJMTz6o! z1twp}wOkYheIu+Zi7ZSOis@p?oAm}K%8nBu**PO3rkxj@&ga~%JMOm+yjeGRn=`3$ zim|26G~hX1RJ{N0Bi_8aW2Jg z^!WG%cMk^|59hVwX%@(|xK<>5S#M;o)rnqeOU8g#}a+ zLX=934sly)be1L2A^}=}FTvY?Is0lpA)D8z9NCnIwudn>Kx|#e#C_QB@okG73aWQ! z%)eO^>QNdytx1uSq0MMk7T;Nr$XZAo9v@`$IC@XC4qc6GtxF4W6NsiK3-|0@#i~)P z501Q!ES8q8S7ddRuVFN79vu7oHoeB<5kXiN({~mup40?-iGW|8E6x`NGg|t+aHXWN zQ1&djh=1ZJv4tWlH5ex`xs!Ur)AJ`7b;9+X=hgKcFRnMZ08h_PB&s?(_hk&N7olO0 z1u#{M*9ROuW5}dPBr1urr1Lm(tTy~<%#)NpLXq5n(=y|mS0z9H(VUl?z#sa}2N^7x z+{%XA7A>)9WK$qp(iKitIw8}(GiDBf?6U*7t$Ug4zSj%n1ji;Bp-!DKmTnYRCwN$w+!R|Jg+ zSj7agT9|LbYb?uL)+g3l*4s7Rp~3YdB2SbV`P7nE0c{;NBXPLqR+?M!kuXNuF>>&p z!A7PaL%rNU?h)}_WuR&;Wh>PTtPSEc5fMl!##|Hd(!SaqG`UtH47kBE_TYL;yUp0# zM#d(P5_fX%60so5jBL)FcMSe0UZIEr?bk$M;1xuW>r{?hC*eFq*=WXbMAS17@!M3T zxO+p>3JcFfMOjwTKARf6WB?=X6lv~?98;xEHlTgqifAUo29p>xZn69yk34PV0=5`GoUH$>Ukh=>&%Dj^?n%0ctEUMI~4SV_Ld)g_L?tVzeOA2E{P}#Bav_{ppc3>Ab^1E z!5$k+jREgPTo7DRni3d4xq1x-FEQyJjY5kcRf#*y z#fX;ZU`T*(HImF~ieWea9&Ky1Dn!s2`%Z8cF(~28Dur;PG?8|lqfAb4z5H1xuJSIm z&=wVr5r6M7F&C5oD$us0xG|#)CmcG6+g#QW<8XAqYJ)q9xH`qsq~s+p^E4!GT}nR` z8l{}s1;r65 z$ZFFG`eiyPnbb8^WzcFQ(nFNS!xYI!rQzPtt6BM zul_~ahgU?7d^#y#@TqX2_rz{wvu;^+QKF!eA{XKL#qFLy_(y-8oBKV#_jiAr_un}| zg&sqX?)S7W@3BMAeVXIJ=QnO=voxOhA_w8*@&CLM%t2ZQhqJ4W4#fUhDPT$DtI z2-w0bJl@axfpG*&0{<)RW#80yN9UD|M=?r6NU{8;^~b@3LZ#MI;kOME+m9F=$a*PK z87(o-AwWPuOhUYlR?ao=2cjF&wV;ilaC+zHk332lo<*IUdjD@}A=H|3y60EF|BBhS z{|Wr7{~7;Ne)Zq`UH&Qm{C_DwZ=Q3#s`194`G=Zp1E>ShRM^8yUj6WY$fo$0@UQz1 z|A+b6Kl%^wKmITM_jrCcksEAqJs6Sn(atjp_hWZij*ZrH-gW=#dl^=6F=oy2%-S&Ma< z3?7}I%Oa#}TCrzl`Gi9|aQ*f{9-7J)!aRx!7V}aT0lTgfaipvYu{!(MgYt}RhZ|sj za5Q~GXg#IzOcojSe1>KuGdX5bNmJkL?SZ122|Ty&hZKW+v!bdE=a+MW&!jD|%rh>R zQ?jbT*+wFPCzGkX?$YMG`~Fg_p5FI#%?=-W4o%Dbss-h!YE9!D7pEnck4_oX$YDIt zdxcMWJg6FNYL=%Z87+m?yfZtet|tPEetZAGebYm(c-Zd5$?(pzOSZd}{LaCpHW%L< zgeQ;}fq7L@%}dT_X^~`4&ZL6-WKl`W%s333%+9IG2@k6+ZRgqdUf2NZhb`k^xja2( zepawpXsQAxlZs5OW%D@C7o1N^c_6HIQ2_g^^&kuKo0|i-_d8bGp1?{bFGd=LI)Slw zHwWxX%e&9sVL3hJW<4^W_ROZIJpb&TeLK?YoKg3jY_^=$6{qu>iC)spIv$;#$`oYN zfwr)i8sU5ijC)!#$up)p!eJ}G$W~RvvEgfv=M?pfyN9i~dY(Nx<=L|{p1*w{PD=7= ziE_7`EK0udwZ}w1U=_kmdVReSEArdh1Dl5f!!8K?b2s)Bg~yGpINhdIL7in>om4Ur zeSNoKm!@Yj&0SPeX_4FM$fT^x z%2FP-(ik^PQWbOG2l;F#r4onJ=n|Jn#Tga_!E$JO`8?2u%h`e$jZCYRhqL7pype^~ zdygMW^I+HX)Vbn(o^d{}dH%%>udjD#HRZ5rQtZ)Ac=hUm-FA@3XkF%PciXgB?0Sl_ zmMB1763_?jIBlR~n!*dS zVzW2A)X#S+V{?Qe7fYF$6IkqJ~WOx*PN7!c~sN~!~H(u z4Ct96WPzX!_noIS9p}#q4$pV=J54MsXq`9?j&x{HnMK7k(IqC}Hbe*_YRW(5&HZ6O%R=-H;-AF^a23)w%qhu5F1&S61<)>PIjzO0-2|WTV||EW6ZgNM6Sz)T`4*K{3h9|Gec@RuE# zA%8q&_FhTIyljR~&m+&yEc4v(u+rSW_37`89zqgP&?-T*D~rkz5#Z|d5$|3-Wf%+} zzk18U#H2Knv^x)FAL#EyYhIR*ys8Cpra zI5}xlT5Lz*U3uZOWEO@#fJctxXbiaCV7)@yAb$>V1|Y7Y;6vItStF5pACj1AL`+R> znDbfW!>^ZwVka(~jDq#sApEf?yJZqvh7`RdS{_<2E`~}etP-{C_=PwIop&OtWCnb% z(3QqihN_q`olk{}xo=xW>t*8Z|B^Dyu@=HA)OKIwzOmpF#3O+DPxQ5T)-0|z5Kk)sR z54>FM*momEmT`HKgY)uUh5zf02m;~QikPl1Qq=JXtQTW!mP^}T)Acf#`{?m0-+Fh> zWrZ!Bh#W)i=WW#RuVIw&x-Wy z2Znxw^ZT?%H4&9pgf@r^u{Vu4+)PMO`OyO?5dzvFZT6F&%rIcU_31jROIdqnN{W7x zlPU&G0IR%+FTL}!ehbb~SR>!xcOBlrI3muqZUlv4R%OBrLMu!`68=vI zw3A@~O^PySVM?t^lnx>e5l1qc1aTjPc_?vC?_m;0TI(rFm`puYU7%GIvA&v2<@pv} zhq8!UPOBQ7Dd9-AW66&``w{<(k3Z*k{+{2#M_>CTa+~v$U;XoJ?`{B%(j-n)mP6sG z=Ox*!;?-Tx&2|uB+nQ3Mfw$Y9KmKQb$lcwBzxDTilb`v}Sa5j~R8upb0tyAS#J}9t%r+YU(9NlSEP<#T_p9m)?1~4_0MPWphc2#F)PF z3=zaKoyj@3ZF~}KO>zR}!fY$h>70>)dv0=ys*wAWXCw;4G0M=X?+0;(Rdt0isWd=D zJug=lMNBR)OQ?CPF>)<5T;&%fp0 z^H1O(|NDNHf6~9?f5iIG%T4d2cWdgp=ZjySlku9K|JNR09bX+Tb__Jq_!fLj?4X-1 zc`*@S`@`M6#EtSSmkT`C1yLdy$?@~-YKbC<2v*dF>0C?Zy0E3xqFz7jq~$HsRyK`6 z!ESp)Ra$y?!tKqT{liKo5zC7+5wiNeW3imd)P7OV7zWS7{g&;+fhQLWPA^Z<1gb)F zb~eWas3w(cy6f!c*&AOp13Z6bbr+@yEavu3zzvDe-^M!CVu2skWFbHTg zC?#=|3d4!Yv7_gFUU53Nvgw{I&e;sTY%VP|*UvW`#uX05&1S>HwxMYUj45Q=kgE(M zRoXeK_cTqYUS=;=@OC9?f&!-nXm= z$Ni?^;WlzQon!Dc+n&9TJTQRo3C7UcL8@xsxjNl)jqEo)O%u>V#?AefLz^OKMqC0V{ow$3sl$Kv_%X|B!o$sqH!ttW zikjK1=3-Ki8L1Q(H`T*t&)bIsK8`Yxsp>h3fwM`;C;!_PJ>%#_j4N`T z206B3yB+!U>rcsYM^)#%d3#4apJH>Ua=3ka;N#CWyt(hN#>;|WHl1+4+wt=44g0~9 z+vK*&vIK{BjPzlo@4fsU&UduUK;MH?2`a8;75(T0o}A}JT3k6zKYZ!?01pbpG0-;$ zboA7DE&^yfN~B0ON6try^ePpO&IHf?FcO1QG0U_#+0iXAkfM0urz|YAhQdOT5s%C( zj80$2<~woQh{FZ8PRo6v+eP}Fqu&j($i!-y^143R+*{Yt`%~uA8OzfxuU_qVwNi9- z#<~ftw-MKYQwmcknU;bU0q^$Ucw8ASKAiA!J3y9dqw(s?7#;G*bz1O!sY*l$Vm3o3v3nnQGzZG!Kr$ zT_AMfFLRM)S2JcGO|c84tuxO9=jU)SGtgOHej0fD+{?yJ-U~>)v6-QsS>dCVWx>_i zDUZ(|@$lgI(HEcLs;%53yB3P9=6oq2Wq}_{gB-^r>I7IWdra98^O2ZE!m;_!+M_$A zPy8$Ij{sRwtRozSJQ4oHf#tY5-B8ZFaKcW{M&k2$6odd3P=Ja`T$Xn�Cx;_9~!_ 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

      EvHz8XY(P-l>gB-icGet5AmxIfEAKtA}7 zp{&xi#Im(e`1QsUjbu67pjWR&o{7}?QV_37-3Kv~c&SX40vi#EcX)(Zqca2+L2NTQ z(}>`Uzsi>?t514dPJdY2s_mQkmNCQZTQzDOoDJK102>_**5gX)SgLaFi==vf~UI8 zn5-B5#RK+vyBKoz7X#8@`hlAEfSe47(zG4C9|P7rlNK0OTT-ROn+q z?YyD%{`ODVwfcy&V$qp>^5z_o=2$$9WVMJvp?3u|Atj`g6TVtnJB4dDn<~=#o-3l3 z_6j%x;_~s}{$WQW6+Bz$o49S^<1$EFX3frjslQogt)Jx&E)bFf7Q&;87$l2=gI)J-O>T()F@g79n~z?k zcHO$cfN2)(o(RRri4Om1=jVnek%I^wq848W^je>o8Nnd8{t4;YQBBXsG%zC8F3QV6 z{W@~rp!uY=h0my*gO4JRFqDz?_cd5{k~Ts%fwr3SW%)J^rx? zi-%U6H&wB8rYp;i(?9w7`)ZH&SA7Gfy5`L<4pouD%m=#(wMF+EomJy31ZvAD_DjWQ z{Jo`n2d$aF8?_Sio}fEv-!E!!vV9w*H&a72{x)A5%>)jkgL-aKNDSY{7;VgXQ;Eg+ z8QyrzfGX{C9HILY*1NM|b^aagqY>uG8Lqk&lO^6}`7Nx1Ufli9R%>8jik+d3SUaKi z*0W8hd!BM&J%s46kw(h2h<&K8+QVexL8~!2z#T@u+mTMm)TQ!!e@Fgm^6Y7rB9DW@ zT|9Etd7>ud5W8hwi{jE`soRNc-!gYlNG{D*jHP`qNrkXLUB_XmjtRW^v8wJ$0JrDT zrt#Rsdc_NPzreH4q#Wcsdl=>K*F7_|oG)=Q&QN=r^=MJeagxefJ^IPS$I^gMollgM zSL6B%E%!EnCa#Ty$TlFO2sRNPk>x&_fz2+p@vY6*uAW7@Yn>AidmvZ2`Nr3{WWnz2 zL@hx`h|GfIM>Uu%8FN)ETKtVHC8w6%mPrm0-~n~a9|y@VSHg`B2KRB-YiVqD>{t3m zDzvk$Os)X>apVgrJI&NpDU>flU2Ttf?@s3rMxP`7lj~NGQ-_UHHw(DR10&ss?>kQJ z((n|+g9Kg-H7KqL#V8Uq?}1vrzCyv5wHM^T@H5NYFHPanq$`VcK}&g>t%@@4;gLLp z`U9f+EJ|{sH12jHo$M*cMq1W8-w|mfUzbh!G7m0Rj^e-yY0nJ~p2K|Cq~uSsEiaduy7`I2aP*h7Vs{}rtofqXFWJVRusQTwz zX~KT(dawBuOWUHO37rP>_4%tknyXkGdj!R`9^5x%stOehopbsE^dw8d${XG#_bl^a zIZ(W~VAoTtZ6`r`i-{nRO?hNuh(ze%(aXc6YG#emLpPwF!DMdS{fv zv<)UO(kZok&Ly*Q7fCy{YP=pl73Q%`jlP-$EV|p16zfbuD8{WM-FGuG=bX{4w3d1IfUmyO?-@C}%a<8a7KHdCI(_U-+ z+SVozBx)A0L9eMD;G|@IvdE_(v+p(437m0dBWTp$yCY502*wt-bmYk@y7vPY#ow!D zLOahky%ivUAaUI{YJo?>^eVM$a9DwjbF>1qQsbt#%+DeXF~WSljnknQ%eaNIag2I0 z1Nvf6QI`y1@LX(7(?kG70&L4@c=yrub5 zGER2^zv~!Y{!QNrKMYR=2{|HqyZWU-27+@tFd|~(y}ueNUBCWa`5SnNEByX~8pL4> zd)E*e4cQ6ESa-lA7k;DY6nTJFTHNnGKX&yGG*_!BdS+5H4#WUd^^Jj72BvNb7$1;J z>_chsb)q~kyAyJBZXf<$War{LO#7R#mqr8a&mUh1?=OI5=PI38Wc%gcsahn-+3eLv z<6TW{3I_=i15Kj}ta^BBrRD;z#!f`ekR;1h#EBxKWUfx}Fgg=Y_6ew;cO6N*=LMQ23o|N_5eitS%OXd zFG+3~p8S9BUu^W(0Dk8{fsER<$XfP4Ig_%#FM^;Qri6X!OeBdSlo|(eJOLxU?3lZN z%)qan6OP&m$#8JM)p4%Qr1D}_%;-LELN=(1ufg;FeXEUZt=r^dRjruj?o2wLCm2R# zGq4YSbzJ&em1Gl>eHyYNypCDj+>K;}9dW}Vu-%6{L}qpih+pJXM%<;(tg??@jE2$H zhdcRxl(q*^kCBShY~P^y!@55AFLw=&e^|<4K@_9hW^aEwL%s62TidOBRm_?5*@K@+ z>=x_!o}6l9d(yVUbqQGPU}%gRD9U)qfqCd{H0m#pMLC8+xQ(;4-^szIt=VONr;qbA6gZr{~2ded|FV{V6J z>9+#SMwc=fY&?4y`J2Mg0TB1?eN1p2&#ybpl$AAzmUc6R4&-?{p$87%@X7P-YM()bG}cz`REV%~%tF$~0Vgg{ zi}4;MCw@oK{cM$h*41Jp`n)ahkHpjckHn!kr$jQ#t0iaoeBlqhxWK9kJru|d2YZ^{ z|JlPwFwo;J7;~@9ovIZf8RH|(;BvG17O$`_99spytc7RJD!&l+kk3Le8@o`hN?^;C zz+RKU`MX(26vt>!)a~Qhv(&%7HyFV-C~cVk!`E9ywbcdex>)hzS{#ZMcPGU^T#FP9 zT8aiJ1PH<1-JwXKv^d3zyF-B%w-6wuXmAL!`Om)DXOA<^WiHl5#+YkOd*A0Vxjxil zm?5(=?@4uIM?VGQnNme`?jYoOK%aS9l7zpQ zf5$?j=Z5GWy9xYW)1x%=1joG{iEZ_C6}YG4pD)9IGU&%m#7}dEMfoNQ-Xh}}i8CrK z8HzfgAC%d2Rhoa4#-{uyYO_U2xs=k7CSmO1xPVx7_H!2Cm#$;2bkMd{8J9nt5~#G* z!um3aJ8m5)vfDI&3;qk#KGsd2?d}65RXHyqoJzToOr>t-?>E24-U+^qX%fl6!`+k%BCwtu+ghQ9 z?j_w(-k4xzCu|`yJGg^q*MGz&?D-hEV&++U%fMpK&BWl^#)mlreQk_B2fy&6OMh20 z88^A~^nGbpUn2w3NIIzm>*Dgj*Z6hQ}OtSfdJcd4N4LSbV|I>u;5^Odx%*Ud! z{B!QRrpfk|HW1m8*!cu^KkM%}8*Rsvr2KMq2+l_I=$21>^79HNc(J<*I-2(&Z+9jv z4wj7TXYNT1StnHmt}t#ec`?Ly)`0)s3RzIVwvzPfq{YMy=afS zV9kLs^W=1omcA-pj|Mj`_I-w@qtfwTodl8CR_k09`AU;|AYZy#b;+53;RkOhWfCa_ zx*5CMF-}TJm6T|!%&Ws;OG0ZW6x=T%E9Aq^hut&!IW$P{r4FlUX~@FGfhFclNmb_$ z*=!NBpRSmj)nq??J}5k=uRvGW#_@I7Cn?}I?nHL$*=1y1l*hktSdqeP*{t0=k` zZ|$eRwTG)QLEj}BeSoArL!p=45ecs>{B;RFawyv(E|fz_Pf529DVPiST!x;hqvyCRf8%~h0mV?H;7LG#xBH}=x8-tTP2-9hs-NZ3y&S~l_JQwVcdxGBPY;}I%q zN3eP}d6})ZDJnIdu$`NIXDC;n&|z(^m^9Mwj0tlkd|N1|!c0{FEDq>m)FAoIJ<^xl zS{@P%kdUz2OyUsg@CWI#GIdJDZ#@HRVpL?>nY9QH>}jHr)(^$|295mP2Z;V|6H7{aOYvAyDkYr__{uAv$veg z^b!)lvBrA^8PH5aWqnVIM~OV>k(VFIc=ePyrq2p2py1`C9U=MK-#|NCl@s3bB{ z?-KY*F*ogyf`eakc$cv3p%X(0)XY>?aAS$A5%JB#8|5?PTDam4MfQ3xXVMxsw9H{mU&c z3O$^OLTaGiAFubduBvGdt^Cl?G|eKkB((EdOH|^iL_Id{Jw?Ch{GrJx%`jEeBOEuW zQJSEdO4eSimU`(jOb&$ClaMufa)?$Q^=6w1-oG&j_D^K=>r{Df6+@0^{8n({UBzRA zL$=C1_MmbkNOskYKH+^>i>(V#i1KMO?>DZBG8174#*gT^V}JM~Mt^n7p_yq&U2a zTWjebgiH2C)mF)D9er7upWTGz|>YI2MT7!dWaX`Mwl@bFF}Rv!FAv1N_%}I<%CO|kR|DUbYO{PW%ODM7mFyp%?^Zf6oQ~JnwJ6A{ zhzkihpYEdxo*Kq;JV{UsEzSuttot4R@3|r?k5lsA*lNIR8?QTLbH}Xz0^Ruf^gw(b0r)>h+p5B3Q0V4Qu{5KoVS4kfSmm+_BO6NK=FPJR~ zaxG|!8@-yU+IT}|u-D{0FWoQDmXP=7BiiTpL?wpJaff*~7*$n)w5@Y$u4PsiNtAE( zxogF}>IchSEq2$ z(lrtf-l{Xw1s4o0yRH_8b%IUn#^%*lxMJIaTXnFvQc?%qEOt^ zP2}#;DKt4(XTM``Qycwwc)|;YELtk~Lh`6d%uDdqV!XDhEwlf<<1wuAqWma+)L%0I zD2a3v&_wX>xK^h`0tqUeCl-E4mb_fe`3K^_PRaI;NmiSA{d3>#aH%CH*$NzTPA5?w z5Jnd+LP|onOD9^P;LKqD>PwHPNo4?Ke};4xmY$+=B>0_LYS@bSQ}F*umNVqmOCL%G+-u-k29F37+C;i~v)vy;}{fz``k=KXFtFg=Tt zF?vtCDtD`QC%H+iCzD`iUu$8exCtQglBjDyK%MsYKX2k@J1vbD^HP$xL3>U{h?2TA zQ%RWHaeF7h%a0}lK(0qg;7L&pL>S6fSQ{Lf=;CxX*CjF6q9FH1g(u129!f6^xt`5t$t7iUsqhVD0 zKJrZ_k708F!!*;Ge5>VB!ch-I*VtD+n2Ih~3OHNZthG_{cd=TA(pZ>z?qEu4D45_?=5fP`U$1gKJZa)ylWR^$&x-C#@8AV>NXvO+Xe576%lQ??0ij+>L zttq9j!|!yOl7VL3gG@OsjqmmuHPP>Z={8rg%$N|hoNa5-4TfhTqauSXI)Sr@GMEcD> zclO%=%gSYYpV}+F3<Wy&hf?6v!QI-iC=9)=0@HqQ5p9t z#dhH%h;K5OJnB7{-=aCZof`zo-t18GPGNHOoxS+r`9~A-Nt=+8mDp>475?8C67(iM z4I_S~ux{tPYMrzr(LjUcmX22R6j(92J}HDv6dgN+#UETj-XZ^Lvb;6x7rY|XK2q_X zGz$1xSr50e{#}Lo0n6_xtKoF`a0pdeP0;>DtP z_>rq5ZqV^@#2E+jGMVIbPw432i|n~=5dQ(DW^lFIgLEr=sWqn1CChL;X8Y{e&G|5Y zBuHd2g&z%Yx}3oRk-U+vt&$1z6W_H#&+YI7oy?QxK8-PRSnfI;EzX=TBM3;LfG_lt zr%i$9G8X4nGJEp(f+ud)W4+mkZKaZ%#oKs-`sTlVDR_x(f1GS3Bvr$(2DZO4df1t% zhZwL@V22O>mMuQvd?Xad{6e8YYuZldf3mzvEA;rh?iR+oJN=IJ-ui)`e1@mj-H_f6 zb}bWAXH=v&OpNth=0xi?zaYS@Ys(unDTbY$zXG9Rkh0{|Tc~8!v!xhfb&ZMs?MVu> z{*mO($;WahTFCr6(IXU%W^||a)i_c%aFJYV**oQ)IhZVdTQ)pNf(U4P4W;p=!wwOy z$1woI#_4W73k%1Q{E+=Xyoj)ZM8Hl74QJGRkgIh-fBRma)7Rk3bxBK@Wa$Ly_?Y8Z zgvsBhCFQuze&^VJ!uW_oO33xxfQ9HWxmCap^s1I&cyf}Ylp-eMp=Le{Jg@$5p_ycd zSC|{g36yf#@)|-{=iTTmdhjCd`o<|3}Sm4~;u*1gQ#N8t&%vLs6Sug3Lmu4fQ6=!@r9 zjyjsA1JUFgh_zz@5g38QkU7V%qe%a9F#5bgSrVRU+RURiwhc(Nit)Y*>N-oLMP7eH z9XVg-5-9zx*#cmP-toeQv8oyG= zD?Tc8XfnX*^>r7DCfi!3Sd58((0{1u;%FhkY@pWZq=-;jdYy}x7qsOoT47+1hcYDg z^i_t4i9e!6}&;1}#)^k12aPiMwK<1tQFTL%u#JAo1K zSknka(Ap);#KQ7#pP)7ce&xjLPgAbgmTSdBEV#E_5tHvNd{H>Rk1>xuaT;La7#p@w zn%UyT;2d3{PgUt8FWb#e{pAW0*{$L*eFM&6S?hMR+fPG8cm z++l^+xsLo%+O$2DnSK3u`dYW^hO()3Zwn8J;wI=*(J~b!;GEoQf`)_t!8A>OfcfI* z;55iz4!?Es$0_X$)dgI`CmcP6{mSDzgIs8kOUf16e@D6`w1K}kC!`R0`R%(u!NY5h z^6}RJ&W!teSbb;;CZY)WTQ&fIY*4b+YDxCe?wIkEHx|tlOrR~jDHtQ<#^1MxKR`;0 zGZaamCy|Cu44n?udU~qFqB1qluD|IhZo4Z1uDvD_cIq5zTt}e^N~vaGOeo?%pebi~ zXrB-ie^zBqozkSTt=qugT_4NQ*F7Dp#&G4pQrcbq5lGj%86eZe|9n?#j-I`lK9^UR%Z%o7z zT99HpA0W<#HOoe0lKRo~#1&OgrdVBBkWUM9PwMw2u;Ux2-ujLC7|ahW<7*Qx}@p-FdyU9wAjY zGEFeA+84Sjd(n#%(a*5t$}zsjoYR`D%|q-Zomb&XI&;|>s}HUvw2Zzb6A++vY>xSh(zQh1ojf)$mzal@Ra29lJ_Yx?Q^ePxCc?k2J z5n76&N1f+4FFQph6`B}Z1#NmSEqs=hChI7s#Y_n8Yrc4@yh+P?UU{A*aSCv}Dy#Oy z@Q*!Q%J-_?@Wx$U9TD2ej11{_HstD1V0HtTw|W{o&jaixZ{j}yesDHz1{AJ$G;vYl zH-Oa`|DDDC{^(rd819KpDsC|=j)CIC@VZ$Sz{Uz^F3@=WR*z!*2S~d1=eqOagX4d< z8Luc^<}dF9XiULG{@mlqdo9t=nv{2_QSO$T>)HO$A5*K~?abRrMkvFzwM_J&^rE-P zAra$^D;3>?-Uwblh>*OJ(iT;o?e8$Hpy%tV0hHjKOY?2aP3JBR8G=`w&$73k4gShE zYh2JxHV-uP7{PKc@QK0DgtcJO(2Q#`|475Irl}qOBPoN~v8zfuBIjF95tAL1FVXl1 z{`qJqsLG@*CBL>i1~2;l{#Eq60<#BRoxDtx>@lf%iufu&iz4*#oHnLx^(>3Q2lOV0JUgnS{WXe6o&xU7Ak^2iF z3GqJ8LX*D-)=^-A=1YY9F_Whl8-m@CBXuoIYcgWRbXxFph{%~5Py)krdl##gW;ADL zP~WcYzL2`T>iW%^P^%{p4pz0kmgM$lUxF9h%g|IPjOLF?B+CsJ6p&>MgktF7e=kRK zQWQB3*nK&k8^`v1mjqrohw(5q+14d{!8kD93Po2S3~Z4j%04A(D4oFxqPYCltZuDOtqJADkllKD(ZYBa}huMtPx#g zq4%Ah{J1T16;P}e1ISK%igDeW&Y!potgUdlWws7_B#A5&q zJFSiBUZDVS%ey|FxkL<~O~~j90*^UX)(`qg7vdNnia35%#AM-#XFc7}Hg(??FiCfg zj|y%6f~^afoqX?|3dhms^rjW)dStYWp5CgFcOUM4WRDfA-AaqGm$z!nuopd=af-*S zL=0q;?~!l+yR@5JlF<(_h2Cf7%j#le`+OKE=Z-fundBaxlvdtU<@5jQOg?^Hr5bSM z2jRvi;gVEdC_kxpmoKhWI_4-d=JcZO8W|Q-r-!`-w&I(02Jm|uvx8KlVneeN*1dDi z=N+df6NL#oon3Ms7Hm0Au1*I6XOI(vx_|wT9saRnd8oC>UH!9HD@AHWr z=CzfYyS5yawN5fOsBcv+C_14RqcWQDwjEtGl^O#ZNa z;?doUD+hwBsCUk4WturxYs^^+9#K-J@GyLN;OP1`Df!Er{C@=9oe$3pnKdXfP zC=k_ESN^ih{k<_kH|@+obKoiRoDB>A|<$rw(qmuo?K+*{KX=lP5~&DnKSBhn2!x8F%&PLr!grk%u8cZdbBM)k>*2!q>C@ zYy?7d+Xpnnb+;YpTnc68#0SGc(n_X97&^N^R2o5_r)LB@7=nJax9V)wEu49jLbi2b zG37j0&UbYoMp0R*KQ5S}_hwTb1UNYvA8y+X^6d$h(CzYO`i|W>)D4-|pyeLts@sE;@{Z~q&|CyY(0f1TmS0THtD`|26U&NNU5?IZUz>T^7w%`q6Q-6GA0X< zGs33>4?jA$RELvp3qo4~y>owbn`(a%^gd29E0{RsWfRn=iZrDD+WGizwaK*6h1|xg zaoIXyH-4jw=4L0}g3+33W`^l>ypb^MZA4#Bqyc`z*>b0+{Jg=LWNwX4Oc4}-r%`x{ zsW_hBzwm`Tw|#t|N3-yI;IAq}O0T&{R52K59;n7*T7st9t)f+vw6@HghVZ5G>U;~t z?@0*AvL4oj!DfQ@n!m5ky7x;~9By0h*e$M{`0rGlw4ArD_c+Vk&rbM86)&Yia+KXp0~WiV5t%qt+mhW_PWOQg23a~ z(RY-;Ux2O!3Lgc@vj`?3vq(sW%1e@-X_JiJawIP31pN2}(0^ zlb!4Nv|U{3fb_oL|K>{BAy<3U_o7HKRgX;-^e-BLj?ZlG+#~-Nhh}#o>6HR(XFne; zesziLYWSY+pW=XbmUY$phWl#HX`kj5`zOTUcjwajJ^C^~#p<-j3iJtswiM)Zy9-z3 z>b4d%>C)Oii0T4-sOuh62GTr+g`r4=JPU7;hgGcG`=QDk@NeG#`B;=f5gx>o^VM(3VrQ?VtZn_o;PkIGFIL z=PgNymaFO!^ta}#?K~oKZ=;8rfkH0#3zS(*3kpMMLJ~I>X?^KADDLm^CDug>A{W{x z?~cj&T}|>0aZT@`-KCJC?kjc2+kD}}CZ`XiwYU)x8a^F$Ow&Q%{ehzlYeJqj`wg^`A4vQ*Aavo@d6TtE=WQjL-rKHd2R9BAj7EtB z{`WQfZGU{b3l2E`%YEyM-_&!L6hW2kHKOFVCEJz}L_m#UlX0ND=$=i|{t;hbO(wXVUn*4yh+Rz(56l8e615hHLM zrI1UAh%Xb~(aBCpyg4X9e7a}<&GBDHL61Gfg%fzaGS!i(nz1P-Bcw^<6VC~J!c6{5 zDT7Rx)LWj30PmLKPyDr9>pb1(jxRdW0&+EaH zW>_T%axq0E{o`vS?_GhP-%&*j`SKz5Mi~8Yg0*suckOm&{=cm~pS9lye$-v4-?p<6 z%ZJi>qonvT-p_!@ZvULNn8T$r5@mB1 zXl4s~ulk}^rU$cz{s4S}3|;d-C?up8t^ZNmjw+IAL!_FFK5I~C<`={FD-{3WE59oE z$`!fx+ei_Hw{)Zf1<1gVnOxL}J$sa}*C_t-*F!I*z4vn>UR8mAYD9g!@zu)C+kb*+ zmbqP)K2>BuZN%UJRLW6m;a9_r8N^JFlEHhSoawYwadcGX7 zyp1qW#&FG@9EA}JTU++xcyx}ke|ogO>cy}ZvF;HMsgs(`0ttxN&^xFC20oQZVG_Gg zLq=ad#mwi4MFl>R&c6GeX2ZZL6j|mw4UX@4BK`JJ?u}Vhc{#;%Ebzquqju%0s@_y^ zjL9Z6*X(;&0WarIM!8x@dc1V2?Qs9Y&huwnqj2=!50vxf5k?pemB`ikOVfV++*nl3 z=>VfUw3>l}ce{fxeiT9Tg@TJ^E@99?TF8=v^>aoj5SP8%RuQTIwE4=cL7~wei)$Ex z)!X}nHX=?IT!Th6!i9;e@UPmW4WySstR_Elh{rU4{xkH8T!S(i`alV;U)U;RQe%Wc zMJ$XMhV;h+mY}g043^e!nY#y7;JL{A#~i$&MxLvV=iocM=}l~-jG9PXtq2i(V^pP( z?ua=1jY>9TK|Pn+PJ__;WALqo=aqVQeEf7xe;$%8r?nGJ(AnS2kN;M6^t-dqli>R6QV$i0xF#vY+te|JWFsmK2JlB@AaQeD1u=79ULRTDH{_+ywD+k z9uHQbe+^x`+iIq8zs>P?@s?zJt{eW`K(Z$L;vY?1D`zx`Hzq64NIJ$f5h1aK7bGy~6o#CY01RAqj`wh1s;zwn1HyKD-4duQ3yHrByznazfab6)# zDk)5%u2Y?7##a9JLXE0cDu$Y_dDVLAx#W`svcVQH2G_q6B_SY;R%pYtNb*d8AA65e z55k|tfKg6CvBJZ`sG?!hKt3N8X|J`5`8G@kOgw;iz7wjFW*0|ZiX zKce9)07nQ3*d|5wHPErg-;{5i%Dp$kAD~Tw5s?5}K^Z+EtW3{u-1}$bL(nwbL)8E@ zMFF)cnxtK()ZivmlR5;xFtxQcWaiRRBE`+xx_n=-!PuRD&ymS0-ek8!b5-synG5uL ztAKvK2@abHd_Kqbcu@A8g+rR0A#_sy5ChO@{WL%UqxJQk!!t7PeGc?YF3t%;S!@pTm6K@S=Zl<(i0|ftMnu z1kN-(=!&~<(a))BST@6!Ue&Y*{<`$>KH05mo)|?CW+*92?_J*bE;V)L zwq*C!>99Clac$81^B2pbIVMnK9xfSG`TATHlwl$MXB5iC7Ok5q8kT z71UW30HH1f{N2D5M{r|7ezBJTPJ{a~tzJn7i4t7fHxd=JgGa(ij5tb>xD=UNDms?B z>`R%Un(ZLv6)9E)M4rWkgaYs@i-+$Z@i>yCKpXxHt1?sT(Gv6l&+c|M&H6VGGrqlygp=)l?O z$or?uwB!avI@DcE0(trPy0c)J+sW}*+!%UCb26X3Z%5T6l`N7raEUPuraxvSbg)6Q zu@S-Y=nda=($^r=6Hi(K1d0wYRZVA?6(I^ud_DiJv@SE>bGzOHvV;GU+!hqkuV~}v zT`k6H#Mlmgj@og(PY^(Wr3#NUjfH?97J>C(5s?Z3$NN0qB+hbS=rQ`SOsn`UYVWkE ziupDDyC2DiLje7IQyJ5qG`Dy^kZi+peYDt41E+PFM*w3IE?rg#Foz~8`khD-ym{uD zgb+{M+>*Z&h*c~;%E7*l>b-o_OiIe2=Gw+UH&Q+c3FkS!5<$+J z!^tB$ zDYOEzDqoqv4@T-(`gSXfdNC$gtJlS3Pkjl49)QYHgc*Ydtsw9BV*DeuOe4sfjtAOo zC(>;iO5ND9q{YZc{UTIX`K_T zs5dby_SGquYXd*wP@R|Z@K!>Dod_YCGPjWtVZ#+J1t<5?$hTxh*h9rT|LwGjLFvPS zOoNCaWpYGZuU;H^1ck3TO-q}n1xKZmH#w~noA6{3Ix|VVie7^=u{<=G0vd=rVT88i zN~AcnN_+ih^*O*2|D^EV6bm%%6|w48phZi>x&~5?l#-Og^aG1JO3~?bfW|L@5`=F@ z*G~41S*(8{wwEDtAgZxP<2CT+)bI1^y%MKxpgL8hU?FVqCo7(xv|fn)VX5t^6U{n; zj6*x8cU*h_$BDl{P=}h}K_brWJtDk7QR?|B!*Kd|uvYS&y=cR1LmOduQ=?RDoHr@M zasQU|XOZK`Iw&`5g@XCD@(Ya(9!+F5E(| z&(9fW2Zf;Y8Ix-#Mg};MeccE9s14>!_>PHMU7s@|(iyLME=Vooc6H2ij9%GPh2 zBtX1+pcH91I(_BY8PO>_|xALDj zkJI1Z?e-T@ffYK|Nuoz%Vh@2^^7RqGnXb_Y%Ysp}Y{ssW3I`j8a0!8J=E|nnYfjg_ zGZWP5&h8Z0mev$T>AZ+=mgfs57xIMfyC!m4YE>;|8jcZrf&6}vrR)-g5qlu_)42;@W z2kzw$m>!IMhIEYFK!=AQPeT&CGJ5}IYkDB!rb#EEmqZoQE0bedeptH}ySPoOl63RO z%+mZ>^@8bTkdEBD4ZF_wC>JZpmE8Rh3jA;2G9ma#YRy#k>FTmVI7x zN6JR_C9`;-43n&6L2Gy36zLcB^?I5$qHsHd+qX3J!id)P0>(ey{#PB%uXnxi@vy+xUCxB4tB+P)U2IJR z{{;UIIa_$`N_Ia0Um7bCAGfti^i2Ug52y*2c41g=WYZ-5ESwD<6112Yi;G)=qP^U% zHE&%fm3;&I+b^O*3(PM`iUFb_Vsz=~H@6S1;OdVrR69@Q0qb70c9k<6%NtQLbseG7 zX`^%lMeqS<9I1ZK2s`g#65sxYDVuF4U7^(U_L!tZ_DyweAuW0#UyD>Ay#VNv75j-z zXD=y%m4gE#Ux9n~C8(*75y}8(LCVn`LXwWi z);eT;2fCeF*N~IPz|agt(NO{K$(`erW=nPc2cU4>k;Lv?*yVn4awT=xnX(eDu02eC z(d6@ois%c%yD_|K$n-^E?&Z4a!r|!fHkfKC)K&OiVNbVc`1c>wsh3tSnQ)^4*F`{s z5lQhgAns%YalU<-k&@e1xSMZ?7ZpaK_uqSCAzyP6-F=@YLV=BK+eYGAr-v5I9c)6a zKp~k$KH%*%y==b_%2*g=Ck?_%DOl&-grH5pSvaL$5bI!Ac{t~Ofg!gp9UDJR1sDhu z;Jyh@U^vL_v3c=g2%6;d;^EM&BScZiw84|nrS&-av&v|?3JA!-j!s^7v3d}!N`!Om zX1lT@06vFR<`i(57L4M08#K4%%NbS*y3f67lzK)i(E8i&AmE#gDVKqb$P|s#nTbBP z9zox=_Xd~>I$M`%>3Ol4T@m|+PPl376}i>q~4M&yJ9IU$~!*)s^g@%qVo&DcP;K!cXcTAVKHp?`c3;~w`h zMP>NW9;1c1JLKuFKkPDVi)Yl~I*ad6Qm^-kQTrKT>cTmJ;AIx7!<7Qk--K0Fzpqbe z?r4-`7^ojzZpyNzs%GO8@a(@7@<4u@JFr`xWIr66EL$=URXtkOultrRcg}HsW$q#T z4?&4rX;2aRtjzqrH{}!9E?Q5y9QR+u{MF_E{ZCqiih&8d_SQzLGv@dM*`KMojzR~Ex1deC}q{!^dE7Ks6D0U&@Y*d>KwM*d`rHqUbU3@vv@EWn%k z9Kmnz$%i(QS10Q#8p+>9)o2{xVKrUxmrN2H5g8*)5!M)5LLe)4pYhU(&*y)ZXx zV9S*C5E^qfTT)VxWh7>2XMc)ejXU>VdJaI#5LFnOrYS&6s73x(w)sHJ>^V;y_M?FvZcAbC*} zx}qR1u==(IXam+<>h@veX*nK3eV-5-UFptZpAd%;N1*i;H)NUtYF|&KD?mq89~KHf z7}t?ip(KRt&P)=(|6WvZRFKFvFdx3?Flz>L2gY^cI)sH1QfaS;iirOgfMhYQU5y0h zP&}U>X17mF1kkc#@ewaOn}KVXNqP_D<`($4ySlGxo^s7Z5DlJc`0Pbw-$dPXRyo9w z4(|5bYIVpJr}X8t32wsq!Sv>I2XCtS$_uDZz;oIR|J=0U1Kw(qM+Ze^qa8|hE}r4* zZzN_B^cl&8KR;zG9uUfiKy313Q435TwD}$26MfPrR6tEpH6sAQ!;+! zM*Gp3pz0nTOZqq+&k+Yg*N-ft$*oCSZ z=;25d8TronPb~r8Hl^m?!>GwgSD(3^6Uh#4pMfH9foN~Wysw*ZrtY!vC$PNf^X{XXD+5{0 ztD^(G8M0{$0*;rp;b1A&!RbqL$sFsD8jF<3_yvPQXob# zCui?~utAPw#OwAth;Waovn|eSzE_U?HYgQYP+$}n$NQM{#`t?Eo9SEMkNiXT43g?! z$)ag-pV@EfDNoq5zrRu@3W%itU?uKRcjXl$+s4~v_vR|Y(nk5ke1D&gTNbgiL#W8| zNX7cbn01&iEjwL3HTsFm1foLLe?&oDk(y5a7UdUP>UH$t-g((RGvoAx!n_?n75tz2 z6bn~@iqxA$-spkifyWHqAAr~YAIACc9-;pi)cF73IRAfBh<*M?Tk?NA|9}5}lp*^+ zn9Bb{Xhz}uZyqylq@roo&`IfGgql%>YGJK~4@iYxf*O-+Rt@SUGt2bVR-!l?{SB#JKv{T& z^TheSHTquqYCxze4UDSZV@8uQbF+u<@x9ltbQHq~MbqF8LkF-B&=cX{>qY4q_{2C6 zEb6}MgyZc7Rci^;el3WY6*loV*n6pkS`m0pry-lyZYf4+X8 z*FY2Gi?7C1cU@~GF0RB)-rNR{?|lwP=Mb&7j2GmIU=Ks%!c+>onWGZ%b3=b5Ckj*0 z8X6aMnU9mqk1cTpcLgqYxe)K~L-FHf>Fo@9lw>}#zupq2VC^TZm{PTJr{bX&D1H5b z#PSRNlzB7jf*uz;eZCPe??ts$OVZ8-Btp1iK;6iQqEMhaqC)HqOzKB`qM>8c%0bBz z-Ij7(T;{*|a&hJdZ0dRrF*nRO8sw^-TnBG_52(^y+Y> ze^?u*o(t}^_~qUAD5Gy5*k~v+u#h-mHqxFs_!*%NnVz0ctm3Xn@@&1LGojSOjplrk zN?}(q=k=dtv^cF^g3V}sKz?}YdP|2g>|%dYlL6-@!R1{z`aQ_kaiy+>YQbt!3R zl_i3Q{QdO!9w0mgW?BAFs-smhr@WjB&^EGlb@`|73ltwt&9@u%jjYK&h|YjcBtAl~ z^&JI{oYni0K^ycKmEIGa`J^ewQf0jgb=cmg>Se!>uoO?(c~aH(C4#oYD5?y@Xj6a( zt7Z#|8;OIa(w^5`#YEQ^I+d?Z^uD0q=U0iP`PI>ihN>^4?avtZjU>lDvFbGo#gHZ; zL6?^D+IMfSO62U#41U(VTKKNCQqr|U0hXjw@qhI@W=MxMKV8vg>Fe58(!_%Wb_@cT zX`vlWoQ+^%r1yfs-^OZV%?L5&js#M8mll6es{A($x+=2pnC=aD^y3V!i%-84uQnweRY!U1v2I5-Q z!evo_vDI{h;T96p#xDwlRPs1o>oU>r!zIDxCUgKkYb6=BC$1S`L&?up_|Ayd?y&2T zAcf3WU7@WiVyV%pBAT8U)cf6EHLKc(8r&=;Cr++GPZ(JV{wW7cDD)oBwDGma3+lB+ zS8PA|jsgP4pyI$lqv3j9j6UY$QLZ)d(Fq>3cULUJDP7U6sN$K|x`y)iAo)T&If^VS z5(-;y66d{hc$4ng;oquq?CIUa*^~LY38LDL9eyhJ8C6Lu$wbE7-g}l$ITsg0gtQFh z6Y!JMp_HVETP0H()2MKp6-X2jG=h5~t^UKHx#6&<(mj2E6^bI?K#7LBb9_bMq&$wV zSTXrUh$8TnxK?GNT)g~tbG8+5Aq!2R#AwJW{N`o~@t5Z4%M#OI{i>h}2?cX`?L$=2 zLlJx3=m=@c_>})vjfa0{pzKiO5SBhJ3t==}AWVmm@eV89sqWcp5aNAf`)o zdUv5x-M9`u(UMC7OZ^dQIkHE1tnmcgS1&+INB=EHhT=z>qQ;IOps(WB zawyhJD!D1j>!9HxTOGaT*)FYn5KU&BUkZ&?^qo6-7=6>Vrai5WhKb&NiC=A zOA1G8_f+f5Wu?tRp@rB@pm0z@5v*cWtPZ(8IzfxNvtbN)Q2PoNnh8E7x-O*F0frJ! z)Z2+9vp2}T$fsR-2!Kv=l`AHi=lk3^%gZ!_KhqOn}1@8$&1hWT#^>&J` z2>u<2IGcXJyahh${O@TMs*>ckSZjIjBC5@!Nso0qRnXkFn+WRkGj};7b2_`FW4rYo zR&87d{phS_(%tw|EK}T8JcVZFNw(?Lv_}4W2;y4l4oOz)o~i`6F_*huv^_$f zvl00vb-`+xUlj-g_Hi_@wDQB3B24?)EFvVkMq^CL$PRPFF-Zn-Ie#i@*V13$&+tEm za#n_T%F;apzKy=osNGI}g51nmPBN0KS#S*&J)rz=4rmEo^#^ws*EN7#1v!8J>tr8t zT}BtuhJU4GvboGb(VhW5GhXtd?u>pZwl+BI+N?19?II5otQpbaWp$)FX_ckS zLR4Bhu3u|QSfPz>BgvyLHa9)K_|tnPn=ve8%4hblfS~=y=1Yq|2f%K(g#@*e_UIWZ zgbjMF*KXA;SJodT_q{&a15cChic%AbMAzM`O@TQ7v)ixi@Biwn!=SMcJXP2#JH$Z| zVNyEq&QEx|#Qf&|+%M(e*ygO%&9p5>AUj0kF7)6onVH5o^lOYDZ|^CXYq=@i%|8Uj zEZ)r`(Dr+x9MsJHg%E-QC?SxLXMB?(XjHL4rGtyN3`01oz<{a{Ubgea!aN+%|NFRv!Wq$=jLV?M6 zc}fR}#OU)&H#r^(m>tn>Pwu2Yma}gxq@6cCCc?nci^u z*TJ3JQwN@_eRC&X`!Fy#nqC9JH^WV*{WC|i#45#()o|KyH3P+~Uc>U2%L^4(DH_!( zdFWpoS9B=Tb5`T+H?-Sc2o&tW@{2og+G#EknU$a2k}iyhrZslCHQGNSGfqJa^(!h- z(OHsI4Wx7O_leZ6U2}(yecjt$$%Q9Nqt{Nf?j;msXidkd`#lzN?9O(^Ek5xQU9}!- zy6G=^i&D=99BC}$`Vy-ImEICN3`v}z{_Wg(K^f?o)1CPRoiy4Xm} zos)xC7Qw|!0i_HPeFh?ViTuMwZ%_BcBt49x!FFp@t2L{=4s1alTEYy`l(+Wgz?QGW zZl|a55ZuAd=<)~@xV|P|_0KQzURjX;+F!S9(i0^0(YpQqR-C8aw+jp6C0}7b$E!MO zism=Pr&6}IuOiXap#P-=J{&Lur<+aV^63}D_agZ{x`nYN2Rh@g@KK;c?^qXUkYv7V ztD@r7IFRQ&GsapcQ=7Uzb>|24_XfSNpp>xQO?e+NQGmD6#3r{?T^yo-O~GgO%l(n2 zz;ll8HEUJ-LLAQVm=)8hztRVl@w9u~wRO{5^n1O3=VAObZ0(lYSYb$cU4Q*fhA+05 zPSd+iIq=P+vq^(Xj3~RU1nJEo6UwD+65|X_Q>*haUub8QT?ys~e}Ha9$I#G-eS0iK zu+{a|G?9A4zL1UDB6ZNRuRrqy9p3ewd!<9DjjQaTLP5%_QSzCwFpK><94XhcFjI{} z%-#Y)SM(D>Vr%I~UvE!^0=t~YoF50n?x%hi`b{d5qxUCt$)w-psOyDD=@1K3FAGoYqS=;wK$V(D3GC>K@HShNlm3z;-)N+d@G-db+ng zgjX5gy5_rqkx?#{fR#Vv%q(l*dalg4v`TOspt^Zktf*UYGl%@eT8NS@;r+lzTqeF( zWpanJ9urg7%(6Cvz?WOtCWp1k?@)53`4y*gBRnX@mDx|}8Z!EN!*FI!uWg4Puf0f? z(mTh^ehXWaR9;VzOCMr@@o8tUOCt=F8duf?V z-0L#$0@*g&_Kr&qM6%2N`exK-w={82)BVxZ=eye4mBUo3M6M)S)WOM#Lxxl-apB|? zN$(rI-CK9%setQ=14Vc}F*&2V>{}ZQhM*QAe(8H};0{LeFiE7G`-{!b^;%l(4Swwy zsWM96M8FLY83Jyn%g~dDIxuYTzzJPm zX(#f~$UHDzSny%rX;LOPFJlMOG$ObdiSPqWC8(W;IRVYWmHuf}aCyjX8Cet^@9F@S zQMPVqY|dDwhgE*@lW>}8<`0v7o{Otvc~bU}BICFmf87 z{^+%b;pX@W1Ta>yKCl9Z;pOo|fHI>yE3x2MRuEO=5WCmEg`m4HFwu8IH_nM1RJaO0 zX*IMroyJ)qotHl?VJka<=%hKW;;hDIWE{1r0A`sLhC%6is2=c3FJFQ9IWI;n27{Nu ze6+gxWhv}uV-@ZAtSSUnB3(rZ1x_Ee{PT7a6|jjDs1)#`CT+%YwB~D1eSF zCJ+)D>gvgruK*82=BvDeJOUFyY_j$>Y)-g9`tfO~^JVSXvi1i6`)?$ycI06)WG71+!G?anI)@5Nl zC33kf%}bQ19S3?MMelnn2Sf<&Aq=| zPyslP)v7I-wny}hhDrE+&E=e}GHNZ(2F#B0c!Gq5eyLNDg#_Y6t|}h~_XxTlexm2> z3wwa^9NL3Rr9Z3RZ+q!#_?`cdb$`Q7Znj36rXCU8gjr+cop5m<(Qy@zdvpE!}`L7mK+^}uXq;Cm<>7{h!8FdXUs<9H1@Ilb4zFtmCmPsF><}KaleU! zXzQFbzbb|Cq{io3-ROrc)r;DNOjIN@Ow3`;ma$S4I$Du{AS2;hs=!VpfB_K8>tWD{ z%N+OMMn}K0aA1VTN)a>I{64~fV+Mj?Oi&5nTM6cy$|0wkoTR9n_U%zz{a;`Gu8;ZA z5&1q3PF;N4ExBL2+u*Q!0kCH-GMY}iCN_;*tI=nTZd@3fUSm;o9QG&~%sZkN`mrUC z^cih3o^QVIw?c7w-PDEb39J@_yc@x_x0p zx}b(#Ag(DFU!|+Iix3PL#4^&jKtuLd-=^q#)M$wh*F#;TRC&6e50o>k@P5?kgje?y zhscg63iYDR@V5_Ul89$BPqzM^%Y9u<7O=(Kw8jCarpJ`bOXlQ%S7(lg7Nad47itJa z&h^lkCZP%ghIGqAb{V_CyG!u~tB18a%4fleDe#h`hD9O7ci#UJ-t$Q~lbFgKIlp6A z&X2!09^Q6oeC}@d-XEFuyBquzF*mzaG4C3TD(?)zfJ;uwjNjH1HPxii7*-mS!qenD zCFTN2csC)zG7p%bC4TV{L?7QOA4p`KHNUD)N-AtD^p_jkMq$0nq^ivqN?_S|%7~}y zUg@$S@gD5!51z^%3;u!f=yXqobo#*RKU%w08A`QWdhEOq|L|SV_QMh*Fnr5$JsK>` zTyY`dvEBK?)_DFT*A(C^qri;c2+m5o)QZCLkhp(%*t8?%ji&^<@Fn8(ll>R`2POU!rcydfeUS2%6IfT4^E( z?X{Z(+wZpuDS~q)VD!7eKgSo2lxI^5t3pqyMIFq>dJ-?gdA2FD;|0G&zdTU8S_>Au zvta?EIh33xC$$ALi3Ciapa?3+C*U|yfU|s*gvgKZ6Hg5aCxVtYr5GNpH?kb>O9QEy zsiXO6BY8|lbKt~{SO8m|tQXxtO{?m(AqyXMG7K&Pb6)A04S3hPj69i84FA@1ebmB=*RR1>RzA_}?OfJhiv|yp2zt60d@TjoA|RE zADP`UcpAB8L-YX7o%wsPV*en*p2_f!ia8C9PdMl$6nV@3Ba|096E~qE)~6^_e4qkG ziDJw@c@6{npfW0KjB4)$E<5;9^|=x@cfOqyvNs$4u-T?K^&M~J70MKIYlVZ53J`oM zGE+jz6=StP1BH+?petVE#EUBNvs50x=NiJg?Jx zt=L39_hr`pBPVm~BMcm=y!o%G8#^Zi^;_8rlWbS}50@{YpaN)nc$N=F5LTRL%-zu^ zj)3SIVxQE}-q1BpGjiBhAQ}2KnOTqx1yoS*!kP7UH-(quu{=cbHf=v>j{Q;!D2~*? z>mXP9PzQ`2I}c0`RZEU4j;b;!WEOgMexbNnSVnR>(chJ0XmR2ra~#8k5x%Dw5e}cK zQ{|Ro<;jQ4r7i8ZLZL|m1Yd}}rQAI+6MD#JbB78kJfturscj7$##CC0>hx!a3xsMS zG;4r}1EGSD7Y<6C-sKOJbVQBz>ySEn8DM_~j#{<{#73IieZY}6h2b#j4uALw3$FpH z>a9d*@KhnM0x}@wp;6Nj1Z+2UM>dPFBT$KhfVZ)%HTFY_0ngWW9Yitg)Xb4dtu~mR zNV#(3>b#2KO$;HrRi~>7_r~L3CRi*zkDNrg@!P2nMwE?9M0PjO4Z|LTPq^6fR-<2N zyw46f(Fd_IXptgSTbwz%V|c}SJQ7(?bFl3SIbz4#@}Evef(<-px=*)^JwF{S2?7&? zjt!h2?rzU~>Dv4Fh#0Qb&;3l9(>@3zP<>NP}cwUmj*jkYYkap=_^XCF)nie-6; zeBHbqdQ13WxtUC)uywc?0RgbBrI^kLO<}3S7{u5S^m62wmyj_U-plQ~7%;u_ImSj_ zQHPGQrj_zT3@|a9GAo2xDI+=AB$ubF(VDMT^o4;!*{~#m@k*=b=Fgy-!}OVyd^w9k z$D}kYF*p)y%t`CTG!)&t8$b0iMG#2DuX$i@G@)Y4<0}%qGTUDsV5f_tb;XQZLjtv zM5W+8N~^fbZu~7og~T_~dgqzh8+PcPz*gcV}@dN>Ye6Sjw9Zig%W0dkh zwQ1217Q4QJ@3ZA`e$V#O23tj+j&y_{?LL%ag3?Kk-W66RAFRm%gB%aP_)Q|5my6dumiXmh=zkmxK`@fV~57Y7<) z!!R4%$AA(3>I!+e@QvN0Ub=p!QBkW`$E?J#%E^*9&C2V?!;=WDaF+u$R8Ogp{-z*h zW>f$l#0wXP;!9`f0x@?4lH7T)m>#Pj(t@877OMi4Cqjgg&-v;?u< zs8d^Gt%e1&1dNo!!+O6Ki!n|U2@$^7)2hxq$=g&v;s&=^wdkM=@d&p&QO-cKWNmc5^T1Z%S^TFcq?0IPE>zP_g}5gD_;2A8w9|#3EjI51|eAjhY2X2n{1yW{Ww1} zm%FrIy$;Wx*1GVa^gex9GW-_f1y*9?I>7{ZSd?gqUz-8-Pmrx5nn(~HwyH{6Nl$y1&20D~63v8_M z=y@J+3bZPnS-jO;pQc(LL}cd>ZJTYMKYy@<0w<6UjwYWbQZaDjL*Ln@!zmOM|AVtT zmJF$1l{Q!WisAd=&FH1}ip9z73khK8oBqo;fF36|DL~wPwy#9wBEjc`WC&6b|B4eM zz;bH8d+lGh2JZCsTh8{BpaQF0IKtF=4=vIl-m;rIc`ghe5SUTyPuBV^;Z! zg$*1M^@9ekJS%H79D__}mdh~7M&v%j#|l41PKTCvk6k1Ggvvnq^22>45NHH?Y$+0y zM){-josS-E_gD}NAg*T$1zqM=qgTfN|*erzZlSgzOk6^-u4<)pby z@09aazF^#-iF*3LiBP}W5gfp^YGBUCC>YXeJpp3EdrF=kj27#)@OzNm+V8_S813^X z_pn|s69k_O8Nh?SRDb==vquzRycrBx*fVz8!U$#;G$7}4&4NFuFcAP9dIdD0selg5Gr4in@QVm5_M zku7&ZP_PyMGF#b{t3D&}VDY8DdOF0kcfS^IJyk|kU6kV z2W!8D+p;)LBphAb3~MXM!b2=aMa5B(>zU$WgH?}5G6*LaCHhTyzA8A;VU(XrN@^B+ zpWs8aF(0hw!rYvLNSun|ww<=!!kv$XSX6goeBt@XRWpLrX&1_zhTI(dZj}(^{RoSZ zASI-}cZ?weL^}DY=3AX$L&MVRCAupX>Msopg`|E41e&7T==VOZv(D}1x zvIYlM!aa8%Hws#U>=Ia=!llqKj`+86acT=EQz0G8kISO{9v8dI-27thbfG)w7mF^M zMbvgTP`BmPMu#0Dbhxhkjl3PvkMe?Nl)d6|;WC4FC?n)_+!*KIoD`MkoWjt~q9~_L zOXH-*i6vTRB_4Nj8CdN?oGnOxokHC+?>AQxn*zb#4mgLlsrec6oGOt=CVt**ToxO6 z%tCc(M?pf0!i6(7EFMn3YgqiGi~=@*#QnJ+U?;bYBi4YA17f@S^l_;nW-R ze!kHbe3n$Q3gpXE+0c=!ujw^Iu^c|=C)y>apN<~Lo(RUGgsIaF>quT(7pv9VHZ2npMP#+}~NB22Tk!l15SL z*W`NW&GFv$GWV#B<{-_ro#xLTuAk2`o0xo%Pk1O(F?VYJ3{qkyArD_=E^yA+IT62h zwU-*jA8^_dNA`J_{%z`t9D{zLMg_%%=XEg8y^4^fR-K5s z_f(#KfA-)7FIU;?UE}VC`7or*lrf(*+)&CWq0;WI)I?IL9*Gog-<$`=uY=4~n*q#5XIvaBiYi@8jScndp;D$ll+*3Go?!)$e z)_B+9w^Cc0&m)oB9?N2k35Rm4(=x^?Ai7GIFue4BzIB#Li8CGY!6CL}$6k01uOGCJpbC~z#`1u8Axl23wBpQ^daylYB2&Kb4)FEVmn$q> z*8+btaP#N7oZX#8B}NU~L&lmz$r=e2RyAiP&){jE_TTmBZRx%! z-YDfL(xh~SXgKSlDkn4Z{Kwc>y8EZc8<2+_9E@%vfC7Z4Jw9TwX?{5^qov9>`*Y&9 z^oc<*B)GD4X1+K^@7?fhS{}q$IJN8-jKO}N=gQx9R5T0x@Xei+!qH|dc;547BL&KV z=nX2ftwtf;#d)us(Cp^BoZt0qyPXzt$7O~X2s$30xf0S6di+;+NaiLmY<=X+`#L+I zr5Z1K%8C?(;__?a$DGmb)V}Vp*6GNCBXW^+7DgozM6Y;;|DCWSFipOGAkk^{Dczax z)C5{~vo-5*6PO2S)42992m&JPKzE2l1~0n=OWp7fBQd`?7<%zlrx8v_kr2pYeUlK* z&Qq)mM!A~ivX9~*rLp0f>w6`e`gtz)*AmVbB^RVOb>fm5tun_=nT}!&TSC!OXdLI0 zZ>zsWZiTBgtHAoxUmXu;S6Rq@#vB&6i|n^rpO-gsBxY+ICaDz@g-XZm#Yfgxc8TOs z_nhzLoO3PrSd!%e(mUUJ54~UN4m4}E3pe~7cXsH>4rvKkT*S90$8tg>pI``atZ<&{JTF|+*C-}p?s{|Ov3SY6_ud>Mc%nJ znS11GM1}3JIy7n+eY#cF*e%qk~g^Pk!Cs*uIfM&>m0HKTiQKw3eMX%`7vA3faYf za>!5-yor=;MvNT)fh?@c0qE%vbxKP;Fl0$j=L=Z5UXVRnIdGPv+n_LyZ_$CS3c+2a`yxh% znml7H#Jn#$xl~JqwR19_4%vr=mgwhYjsq_7`A0pA^E_Igf8f!#Vu}AJo%-*Kaqh=h zth&{S7`bT8la(|*_qqxtptl8pKW4v=a3@7T02HLktvX8B`F5N9qo)jVR+QZs*?73F z1%fdQnC7mS`$iXOa98E}#s`IPgBR;*qGr5SShB8dr3km#{xeXUL~Od_KAr9WfMBWM7wy22;Spgkg(A(wOJ2 zN3!PL7^>7$8w#7}Pr(BgV07k%y_nU6op3>_?D`am#lW#;Tt}TyBcHEMk2iJSDZI-W zgSighJIym!lj$B#vCUuJ^Q#B<+vm5hcAHNaPx~zU)o5H_HrFN&HxtPXrLL~N<#y}` z&|nR6Joy0w#65$Gku-xL!YJ%!&4A$HP)fi7^tkGo&f{4aNv)`Z$U_*m+gNX}8lE8= z`ZV?dFvfmtWjWBk2x&Sf5u&O;`~fhxbAt5wN5W3#L&Wvbxc{y1A^voZeaC&lfh0{B z$N80j7ch4OQ~#?oKjsHZQZrIfop1e_ZRyr^eOWfz$UFNoFV0gOBx+R#NS?x1cuNob z{aT)DbE%#WrpsUCI^qSqZ6?*_|I9!9dm;xQhV~gGEeftTB@`v2LoXSBA_7_N>zP%^jOY)~5{-UyvAl5&~iB)wXvX_y|ygxbRuv1n46OGd_%*CVmvRUT$ z;_GK(1F*yVKw?9)Fu*W$oX-yRZ08=ll@I=WyDL%k-(O)ohE7tW7fnqi^{y)Q%OP;O zI6u6>i+a_=a;FK8a;8As!H9dr)_7~|F5HdenaMaFSMu=2hhr}t<#A`h;WURc`>2qK zhMhm5;h6Zlw*SP7BS1nd^W|x4zUIqET{Kl{=lE{*laTw{t}C_P*CT=1*zui86cRF; zvM9KAwXCjqrQEhA*M|TXA#kT|r)6>{Z5A@it1-aCz09Mp;OH32LvhYJc~RbQnysuw z>c_l=M#wXkW3gE9i{{U-en!8S;_=f7TwMhO7@7=z^aLX0YRBy#yW-E+scCe5ylrM= z%h&wV3H{p@ZBC8`ihqJW!RWILoU~WW>P}@E0kh5S^AbK>w4ItOUD`rKfJ*f~t2Y2;Cdo4zPLa+a#v5KYKthwx7x0B`g7c^ zZq8+8fS*?6(ymN>sXVuQM0pxsVxe??7i&VmqJhIoPHsvCQAnQC>O5cF02a!)Q4H^R zwR-&$hrg~)2-OReZXU%|VQv68v6Zu>+xQdp3rR+lf|73`FZ?fId}}tu`l|iCUHxzx zR+dHXpoQNpnW2HiITdudkdb7Mui#qV)5KY0nZ)Oqe5mVd!7gy+@v$A40M&;13 zv4MD!IVco*1%K62t&tmgvedM?J3s&z%-$eiu&f1Y2UL*-F>Hi|cV9k3;39wuI6i2Q znV}&)USj&fLrga8x~w(=h5dq2WzsT^+)QbL=5S~k77j=S*R=TSP4Sn{J`j3ffHg8g z6qt!yQSMLiR9M~l{j6J&iXKZ`J`Lkz(C7<5PNMX15QrLcyy{bMjSQbJHW%=4G@2`p z^Havg-blj6Dw!Bx>n{)|p^2^f5$%A?p4G<;U+RtHv-DL;v4dc$2^9?tDL3C_QurfF z-o&$AEWVQde6OLc84DU}@l;Crgb~9HDWioa)Und_tjF@=Cn*MqD0_di`wxbTA}O^I2OW8B$*+1`i)N zgi5%2_1rq5x#Cav4~%qhz*z%zo>JRb?_==_&sH{)M5DB@y(}O_GdBe zFiocSST1Ca9(-Nh7uBmv!=#>iq=AuNz>UNmt2dsqwpb)iWb`Ww9u5xDM|U8kAy%nl zd;@w!w-!1SYNq=d8Ib#0i7*K5CL*K6DkaqvK53%60#gc;8TH%kGG=mlrZR+JDcgrx zCO}8iv-r=^sTxzK!dq-|w=YyrqC1Ue>m3s459OeKu7Xn?e)+DpDyC!38+v`MPPb+C zM#e-%uOkn55Gn1(Zx_5~dTqfP;WT2dxCJ{IOT4#TX1dvB>O{_0odL?z`gvi&x8&jJzVP`=!l<}rBBfdv}kt#JZ z17V{a>Z;tn^lRs2^-2drn;&12IqjAub2zK$wQBIqaOFwG&V2$hWUnAPcSGpSa;$7{ zwdfVbY|oQCN9R%*>#1Nf1DU_pP#{Q-ET$F5rc(J2VIEn2DZL3B)5<_}^pliU(Phcj zCAXCkp+zoTANyH!8j4tu zz9ECIa}I^~xUI5-QGaSAs9VtcBp&USWriEkk(0-g2mtx+jSj%*uFG^np_At zdAWKq3aTLn_N!tBs=+Gdta|BG70R#QSf)e(hJ%Fig(rXetFMgn`oDuLm_n~hxKr9s zH~M;BYZQK0@1a-aCrzb-sc8--wNhp-%NM7?N9@GJ%va(*fV-MjGHbP_f+W6rsDH~vV0Xp|{{?a}~ z$|fU*cOkXYSaSJy6+fy`J#zL5c09C_58{>kW_r$jjABBbuASbQD~XKD=N3SOHz~DR zjl`&A<%?(hx|*Z>rXmc%X%!bhxXegHTW-`nKt>TeVaev2jWQ)d z+NngiB21Xd=G2J=>FXQp)Bzs%N+m2FYco$?GLC2xW50qCX@LT~SMZ0VWPza{JPU>O<0W+IJBxeb)x}^~=M)j?-3eKHCu=W^B-uva=LE>2x!X z#P*G*=A%poL(~>!4hHhsG^Hof*p*NM;5}Qxa&1iEt+fC)XowX|mdKyz?aIp%9wl&-Jo4@e6CLl6V)m@9$Tn^87wkyk`**LH5bQW3t$Zz z#aB;ApHNP|XR`CTizvvA*BK56#x@wC%hc>L5;mv2kr@&t!}WiHjr zJqFV}@+EdB7;e})(Y3&WUq%KLqoQHyUyoCuuzFo?HFaDF!)*Ff_g3Z(7M|{{y^oKj!@!F`#Tp?!&U`yH z%geW~^w-}Zfw~6zKU2B?G1_ ziqAXty_;oT&yA5@yQwr)bJ#{ck6QA8fH%Vb?nL7IK-uOEKkmdAgt>*p1>kk8$(0Yi zM{f?oYG$MLBtlUb-zs(!^)13W0hi@30HlGhga2`N+x1|DcntUureMZaLeWf`)hOj23mJ^d1xgMpeSqLXME=0zUZDmppuS&ocpf=A1n-vPKSq83P9I!uqbK$`hz$ef z+9vlNsfWJsyp{dQ`BvP+Rc938zSbb>W?;j>%UIx8+mj=3Py9Q_E8(^(DiU^+&BI5a zSU@;^`~pT@N3Aeg@(AMwLUEEf-7Ir0F;|Y;U~*slU>;|HfJpYs*ySZ6Q`XBs55R3o ztc`bpu2C@!S$0#($Oi_?#~@ZHfT%3ZDXh|hN(C7Jo+(t20oiN$Y#5U?LZbd&y`dT7 z)Zj3SUNU&Lc6|x`$f3TRs~*k3Y!f9OoR*}mK3<2JI_2YGH8{tSU5H*XjjfKL0f)^` z=R)w8)#?3@c3ki8E1=y#F9D3}kvVb_sBn+llx__3a`#uOLGBAK${G>rU|a0V5_YP! za~c>zxG99#tT?z)Lkw?zg8#*S{^~4M;C8BCvm6>iyD7bB7-}WP9N%lC>)fJ!7Vs^f zaW!x7VuywF>ckYV#vXh~f-C<5AaC-tBl`qaU>TSHjF{QWm4!pRuJ~SDsD@q^C+h6+ zVPvnt-`=Q%4gv*H9{3agz_IYE;`w90WQ3Eldt1jHTYYGB&2Yn@QA$u z+3k8<7Q!z#I4R=U=aDIu3q*+na)eC|spH7`BW480r}1507f-h5R%glz$fG=yTa|^QjrY$EJq>t> zR`oQEQR?8LY2yDqR=e<1xtlJHE}qIixHh?P;m=p= z+NWePnOiF}V_T+~f&lrokF^r0*aySW6DYRk%uk-n?bb9T%k`K({cM48-gY>xAg4@2 zfQCrhD{Hb{NB1~zNo(r6WP){ng&4x^$gEw6$q}smgnZJ{l%xw?JMJkVkwJk3sQrCgqJGeutI?r1D@FiOmR{gjyv!`zh)4h*o& zZZyMgtx}Usn2&aITep~6pIgh^Yvk>WI`dv9I>CN8E=K=q6wCO!EGiaVC=&mlB{!qg z%-pZf!dp4iM`vd?;X;(N%{ePqvvxY55ewPd*nd|oK7_~a`~L6$nb)9;7Q+9t zxCQ^jG5BL0`RnulA=5Pc^(Lp%KjgE`?7yr3PZ$MGf}Dz1{oA93Kcccl{|#0C+GGcL zreBNN#xtPRCgMMTUxiKJlnfk~5(7QG_+RwO|NB$^If(yB{>Pve{vrQkQ2!j{KjnWY z^S=$bU-U1UD=qwgRPO(!vj3BE|G58um2xfbhwzM+yN)B0AT;}@dP4NSn&!-?@iehU zvb0i;I@xqTC$c0XAUxYnr!m>DnciOD2hC_Xs}e?ekV%kG&0!M*%5m$lWN6o-%~}!p zh@8GopN)tv6}I!@F{%v*D>7twkVvNC3if_UY4k0z#d&o;*fK`We3cD^G-;+dN3fUY z$~6;WS}`l@xKKyx%<4V5>=)%5Y2+x^>e7=VhH0~fCigusUWWM+cZ%u}o?>rE9$kIz zrhs>4?u+F_9D>+ldp25xjvx=YsKNdOIG~=$UpdyK&Lm;e6uxKXK#b1Bh^PxzkR|7 zo5ZZbcGq3wY{_g^bv){g#W(UxrJ(FWh(+UDBa36e74>2IZdM7UFp(S0!!)mCq<*2< zbTf}SPhM%$(#&o-c<2-J{6zdk;8>0JPboEO%h!+c25dj5e_+cDme6Y!Acn6j)z%akIylMRR;+BzX`P+ zKB;{qUeS7CyB=ZrM65sF)>)d}*$C$ACba{68F!{qrGndIGMiqWs8w;^rp`A^uiuJM zwkInly6Anv#N*iY-`K}!ZhNOHqgd@YdT+UaQVl&O}~vR*#huR^a{7C6Ch z=-P#5B&{{@ELl}7^;{S=P$xq`F$wD?%^FLjPUOw zI^2?8`&k3e9f^T}((w5e0)%b-w>J(0^A4W@{ljE@f#m8{qg}P$g2S=zin-g9u-~RV zxO!T`F~Q=L2LtbE7&=c|1R}`)CFSuAjK+!YEG$HH1QG9X8h13|HQ{B}UbOpUiL+~u$jGM%ar*;ep`|K4d&s0Rfr*)?q!W81STiw-$OAk_VMlU?Y0}-4y1e`~ zT3D@rjWa(TRf4_U#svt(aGe0>>N(e(x2)RfwIAov<2z@s_bWKQwmTS>^D+gvlV%L* zudq`R;hjd7jAVx&2Nl+R7K4c*S1VE7RndPnXsb(-;{HOJt|b{$SyNqT#=_R*wK8!7 z2UuBr6~SxL_J{6ZGKzyHKVLL3tj|Ao*PhdwI_<(n!qilCLS|r6fJ7H4eenX0-3cf- zc17d+gQnsGy>v){*Azbwbz6SVqh>Bdi-7q2qKwHr&?jZK=QjF>AB;@CnX@#S8Dk?z zrNaQ*4r<~}YROQm7aj{;TA%)gGS*m*%fInGliA)DoLCf0H6vKPe_$kz z;7*WdLojHp5SR^7a^x~{W>C%XHxQ%cM-^7gFBZc7t{=Drj7N&51g>tkR&`m0GawR4 zRC$rZw`0omdbqu~1E&KnWPaFvk5>`KpLl$#(yY}l^h%#7fPft#?sqcDi3!3}Ijr$b zRj)??C*h?q*S)?I5X@VMs@gPC?jXYKi)RP3CAsK*MsLovw_3_!+Jors)ln&IL$3P% z#4O!=V&R^UD9=?_tN|^M4XZH@XViaqVLTGN-6J3=~ImpvNYI|XtP)zS{c}1+t9nmg~959{ec3Q#8*b%<6 zw=c%-hQj)|OuQz#!dn6aGA<`W>zh`*nK%MFAa;K-(C(Ulm)Xs3KSuqAs;vVBwylf- zt$D6fc;jo>AKv3olxD%|KCPiB)c-E{SHB2t0qG2sBHXwAUbox%BaYE(e~|B#IpHv* zF8>SWS&_-6Se~;QFU1;eMKlB)X48J=g>J5H!K^=XnG`61`t=Z$a9OuAYKhtlA#I)Q z4ARjs&4NJySAjYC9!3v;C5dfkb+9vo=>z?_WjDw51VeUn0;R7OMjKP9`?kbVD%5{< zsmblkA;C%8Mt1DOq3TNZSjp2AZ&J<>Jo$<9#?zrHO)+@+_H5=Y=ZcI_9K zyroiTrO!)6IjbYRh9}ugPIQsqU4lR9xt}Yh>N#6DGFQ&sWhLe(ER*8<{2&A zPQNv6@#e6Jg5a!g-1nkqY-=EN{=b{kvrYO#9f*^@2;@wLuq6hdA+M4^uWHbOGq_Oz z11xuBVNoGF$Orw!zh;>4_9>&*XZB$k)Anb3Jqal*8~x>Wg$<0%-^9Ov8)RUA`?U%i ze$a;YKcObj#Xn`3zuwHL!1&wD``_e${P;f~_D}hr5BrCF^hez5FVFv<YEqC$&>d|1ssl#@1URGRkd=nc8<-ecKzh@*%L-eNDr=AkYS`{1qTZld z1#;z#BxTqp$zER}G+a~>QSn>h0VLPIW)GBV`IR;r8VE3rd@wMj!bVT`Z2%Zp&>v$r z6F&zSzwsw9fv3fs42r|LaDMrgY$t@d*IvC)!epp7+~jv`=dpk3sQt7v;CDN^ZWjnt zF34}fMFF$-GGBvrOE4OvTKYgG)SlHB%FiP>+nu;BR|<#N0EbCzcAr^)y$8!d3wPQ5 zqt}#|M8qFY0ptRnX3qCV$e8c~j~4w}Xdq)b)Nt8mI$V|&06z8{NNQm&o|mKR4^3aL zwE%a|Gqs(&(nfkM&@5mu+cOdDj^Ee4e)V-wsjFL8Ir50R?_sYAQaj&QBJgzQq zTBKCJ20$X1Q-C;Zl$w9W^U;u_L{>d^M}1MxteE*Qe$F}joU`}ZYp-RWDE5x< zE#G}pYbBSL)GhrNS#=8Ws!SL%PmDdd^_;3+q(|LQ4P!^3HerF7bG)2aqRu;<>xswq z>Ig-x64rLR=?9T!8;=W$hUsd9f)Acy8H}9M-D<9`I9OZTjPwt;VeQgbpvQZx+D4Zh z&Jy);rQx4anJ+PivLqK-wNO6IK|KI8V(ZPmiyB^sI~SIa8#h8KTlGJGL9>VDknxet ziQ}5V5z$*of-*7rhlp_s_4_9iQdExw?4Ti}^M?fu6PEzz&1&%{QRe&5iySyq=yHkJ20poUw@^P5tec>wr$V|q2#Ox5Zow5N|H zY;%)zqgg&#>p8Z5uJV@^d6QTw>-i{%+d9|ChWUFmtTYZHs;%(Eh_Ow6S5-gqa%FhG zTP4w2|0|yCyJ7}EnHVe1kO#sLQ@UccMV{ln@ShDWy)H(kC)hCr2An(=EXyGdyp66$ zY(g$u>uh8s;f=se+ls`bZTUWVwJ^}gAfhNlGFm(UP9Kwd=1|Q3g6TO6HQcmOM`xJr z!s4rCrA`a=8eWRIGJO?=5wS0N>Pgsmk(%rcYl%)}ORHT|J6>sSSe(dGTps zD-$aTya4pn;lKABSe)p>wV$8Jb zP^RTKBU8dBy5Lq09kCws5~;ppxi0K00s|14xM1|e#~RhnH9#Pg<1Kzf?E7ha{IxGM zn_<3An{9jJ?T=eZFDd?d@AD+`hxs17kNuE#xOJL9SJ*is-(wls+#M{ycXbx$e-?O4 zS`2J~QYg+gPLN+sLVn=~@n&bxT%=v|;gzQ1>e4oyFDQ%*GW3!0WijIF*yx=t`u zU`1rTih{QFn&3|trw31~Onh{mc1ZjO^B4zo&&M@=PJjF;<$OEx$DDyrYGI^3tLDw+ zjhDEqj4qz!1ECpLODg^6x#Q!}ULQB#C(E6cbR@iaT^5-7T4`k#&E=bbp=qkr-CAZMa3hhu(0n9^Tmvmg4pj<8@V4j+Vdt14 z1a4o2cSvLmDPWaWY`dfyfZ%!g|4J@_WjA&kbdk7~pTT%ExrFeXD{>{Bz!(gJ%hiz@ zx}uZ%tv_Qh=Q8k=`95M%bLp>?E)RWtaiuUZhF+z1%24fRNb5arEl$Dqpzm{w!W!!8Q(1o2 ztJEh2w6Ze`rkh!|oz_!3XNTILhs?Dm66l8RuupyTN_+9*4y!#126!lYq_8Mla7R(-+ScG#k0{&~ZAq zGi-#MCr&kW>sqO>Ig{ORlqJY}qL;gO3eq>4N37;?{rV+qp<1i`2J3??*u7d>I(#H4hKoEa$7?#k8FH&piX7b1MU97u&~^ zyLEi*y`xxiL(j1Zb&&!j?-p7P8t6IMcw5>GaP*WS-#S05%hkm*7*R-nCpGlYu`ti$ zgXaISBPYiA^FS27F2o_oIo6In8t24&^~2vY3Lh*psQ`Ma+kDND0Sdp9ZW~SjqN8Tp z)i~h`|Bf5qrCA_HhF2h>nQnP3vV+ug*kaaJDkZZ$iDLJ{RX^pWd-KnRTmLKB5FNoD ze_Fvhv*8Jx7vHA^(wDrDD%*~j`QG$T%OvKcenbv^<(}ork`H)6piu}?-`0Jw|DT%R z*AqHF>BHp?R6TVYnAhd{%OtTaRnv^7&udg1F#Xkv*lW>S()V}#@1GOf$z}~`+9Rry zvoG3D?(t1tF~%HEy(ngHF8YFD`N=|5E!AR>1k1a(K?{+g+C>#qU+HYwOH7O9f|w@; zq$fobDlPDbRzw6OY(0-yLS}qDz4`vTC#H&k3U@v-=A(43#nU&(HN>6}2iD%cgGkU+ zm&Nt)W&ii>)@|>rj+mbpy%P>A#=+&^a@GXQ`+xJh!UbB+|86U5E{|LZ<=evFb9!ZY zx_XVRT|XJnwj3a&(;gb1?(kleYV`1bdT=Ndw7vWQ4%Ei0OUU*)TQHnT{}zFNxgAkG z$L%$y8XI^k`Mh-lJ^2)URo&_!V&dfd1^$oEZ<9K1VIIG5Z4aIb)jR#hcbKP;oto7@ zid=m{Jjmma8Nk(jXu44`_c`^6-Dcq=Hgsl zORY5x0}cZiX*F|#G|l!-aS=-?7u3iDG)t|cfigOj_UM3K5va^`&Vpw#PXv2USzM?zxG<9;RBSX zD!6@pG%=SR`3-ClNiUk8X3UYXK&VwiUv7a*pS@lSmsoW60ezGPIXV$6=ZaIS`?}7l zPUxPgQ)2ASLItkS4gv&&Gd(jV8^466fx{(YGv}3xsU7#OSjTU}>IM%tj&~h5jz7rP zvi_BRR1H&#R>#qlv;-6;Jfrd2f+$B*aMI9qSwipZRX1zzp9nCtak3~CD&{^AuX zUGG|1td)eUc>P`RkK)M0y2H%w=byMptcbu~^Jva;as*Ulp`-3ZL{u?Si}Aegu%GGG(dTr{R^5Cnh-FyGJ+d3yLw`+=MrivkX%h-d3?AskWRy4$a_mBNIM1t1jQg!@FoSh zwkynL3wuf$@ZO=!#hEw77^2uSCK}Ct*B?j+x&BzA&b*{Ra^}ctd^T;``yO1MD^Y9O zoEa7qEqr(~T1k@IYiqULXyHVfafZynF-A;1{w8CMk7O#cd1tTxc^+v^5tHFiH2Vimn@>j7&6AV^e%hZSjJV!{(cfu_yfk*}E<(nmCEY;fo2=?OQ#%A6p~3 z&DziQ!m2oPZYVyz7=wLS$KZEd2|IbgE+rW|^T!mHse5Phhel-WTD z=SK!Pr?PWwa9S6LZ1$zWX)XQ+ZS%>_-*yKkit;?XBd!c& z7B;>!3h+mZ{`7HvC3)RUjP&t6@F5{gC+Ke2406}4byAV~Oa(1aJOIBe)~sqOo&e*d zS$uyY;GkOfgp&}f7cRNe937Nvq zbTL;rGC1}YkEIrAJUa~hr7pB2*YW=RDhAbC_xW!s)r*Ww1H+8xZ+|Xq>;v~cOBjaC z!)&aQ!!bRaf*CCB&BgL~@+{-4)K*o3XG%#A`NIwoQ$k?)=^;%RSD#%=?}$~iwT>3- z&i5BIPS$9m z4Ma(NQo(vOA`R&;kOi!%r5-giA%yv4qK+cib~XK?+WPI3q0}B-rYPh^Lt|VjMWHP4 zajINBXP}?VY|IQL5%O$sATTD^a#BP;O0kP*(`ka8DYKiWpU>yM?DpqUosR|G_G-KN^I)cszN8?W4y#{5p-~NPQ~EwV<%{KMI@c#aFPaPYjt3LhAHjLjr{G%}t?Nj?J4<0v)>FjYT?0J8Mrt9UKRL{x) zgFz>wX0OIDBdh~-C3es$g4)x-Ru$%hbHw_o3cR@6!q z;>h`IAXbC%_c3NbCs@|4(dl(fZH*_*3wJV1Gn0H?`q@X}s06e31?OppYdrxphR63p ze!@q;I4mcXN$uePn_fF<{1Unm0%UW47Si30Omx2WUZ~S41wWmg{ju`;TT}^ zkoj(?9AblwC*jo`GR6G^%s0+eRN z;ySkA%5TwY?^kw0@2iXjF$F>b+PEbewvX^qcRtXPPBfbF#!D zD}TjpFSn%r+S+q?#gmdCmD9IpH>A8yR3^pLi|^Mc(lj~jgFza`dOLCly+&^{msf)!2Hf;@->GzHK$H-eEu;qU-Rneeuzj+f_&rfhNcp{fw`}_1J!nB!=+pCU(eXH4;zL8}$?iB}1&>n2 zl$$sBJq*pt~X6?m}2Z#NZT zN;VUIYV1}uD5LforH*$$!CcSq$Mf6@LNy(UZ|av$_uFZ0j9SjaAJH&zUY@HC4ig8# zSu`q$^j(9DsPMIPK4W;0C9GfLKTR3o@scbx&!ZuEIVFIUk3CrPH0*fU?Edbm$yw6>aaxxp|N5VvzCEWu~>0J zFjYWhKm;7Ek8rOXx9>y>`kWV-e$J1XS7;VmsiWTmP!ktrO6<>TobaCNY$OTdH;1hB0z8q_UL$jXB(g zcGT5_h!rVRpa5o85GWO!!IC~0P+l~Wtd))rq=$0z020jsqm4(TWT*?}$QPZM#OEmW zYG{0znS~`jXeD&Yrh=6#BGMU!+;2oi#r3awn(M+qs5YA#Q7!@N6qX@O5OsG_nai>X zr}Gf0VEqatk>M1PRg^<@+&-WHB=?=^sxy}!DP#A0mZtVfq2RSqk<72r(CxUK~kpp1s9^tFs|xqbgm(+ASmUkog6LW6K^4S8Z%0>{IRHo7)SMoXM{&XVmN zCb*9yLq~A!Ev4A%XlO|^H`qzt++v2kX4ih1W;DA0t+{J_i$471ve9*o-`>nqsMqmO zwZsr5JpV9AOWzd2EG_vU4TccqRB4TbFF7(40VM0_aDo6~qstY6D-%3~JI)i8bS?7F z%!jrv8zhMPW}AeZE?a}ekzo>ov|e9Rq+NMsf;9_TGYU+-oZn2KX<_13;I!G9huvM> z2f)+iM;_?D?pBMC>qK;F`i(AZ*Zt0GJ6Id!4+VN@Qku+?IfVz0s-ZGe@D(2x0tD!7 z+He))sXt2d1{;R(qS~YAy*8G*q>^S(h!|d5Fv;1*Im+d74UfaPAPB#XE2!}Pl25v7 z^6C?ttcwDWp@(Ou)a!K>@}pOz#nEALz`KsLn}z# z@QCQQyQL_IC}wDgyINlZCMlTw=MVQtzajxGT?7FIy5m!C66`0aApwzB=Z#7*kQ1i? zgd%U3m6aVI57M3PH?JfoC-)SLzX-DtXqz0qkjTN?w_N7Mw;SF)7HrQfKhItTUeVMA zbFz*+6&UTa2L;HYL9s!Vi(fHb{c7slKbA~N#yaDBAG zsa&CnhKC^%_p;t$lX3C!hd4IS+$Uz}PH`2tmkMGL7Co#o!9?S{MY6^gG~SHAHF)5) z7VqlzXWM|{YIBgk^;(AZ&?va=z$e!+L%i=(bDri9UEk2kxLD{7&-(}{BsDQj8z`4l zgpxB%Y#*bZoC=<2P-*XHT0EjQ`$C0~Q%G#_q`rTG913oC^S(u;sK2;Ff*MoW*2E6J zK602CNRA3==E^Et2yYdiC@*Kobs~Y^CwNXnn{8;qdL`eV z_&14;o*|-QK4F5cYnSK*TZQ%52%&|5a%z`ZhlNmAaLOnQ755$V!Xm3eh_{G!bF(zv zzs5OdXgz-(a*{?=sr89{ZOc;2Vr`z$5=9s?#72XPnak3rY8QgE0`GoT{HNo3G51t! zl$e;9+i~&hV+<8mr|M|K7;-IZnBASuYe$Lgxc-`vIi*Me;gCpC( zS!ZDM_lKG+*C83Xw@-L@1mVK0W;G-k4~*l;6W-;(6A?+OOFlM{pH~1f)FZ0d+4qVG zK|!Ed5}y}o_DCTlDO?cX)X}Zp8*%bG)x$wDbC4i>H0l*ws>OP7Y_ClrMCeNhO}oUN z?7FW+pYbJr**^ZKsE=9+8hQ4F3x5I*sGP-Scokh2IHuk#H_+HUp<(p{M~LJK=VC*M z+G2P;iMX|QU?l}@3F{vdc<nRIESj)V8kC)XFMvMsu$%Aj; zhL)?R7)O}TI3b+9;nrB#M5>4&Aq1EeLoi2Xs1ZfUg@j3w_dsKu6^(S*k>530pkIH5r z9e_B*gxCbhmMk57;XWMc=FfK~nBQeja)`%%*tBpFWI0fxQ)N-#x}{i2f&PpZJMfQn z#3E5XCD#6PY(Zl(xN}Zr=W`4&rC83SlcMNpEyQ1A>R~f^E@U(%W$~-2%whghYR!%5 znEcXvt6gn$A(m~4GjQIkB;tzlH4lVUCT4Kov)YH>6fb7l(_T9{z2G$K8>A!C-BqD` z)}z+iT%*3B!cx>a=X^NjADJLDG<2+E3W0R3KQgOBwCS+a4)FVE;6{@$|P*@a9>1h|QheSvFlgD$rs=`708tpQ>f2@M(8!XuBwGbeb z>tH}27QHqrPyJ5^a%_}G8a)RB`z3jJk3};h8ctwTf^%COc{9}>OZaH`8b1~$3A2ys zo@bcE7@8!Pf*~kVMhnwC1S6BhGEB=d$dKC2^_zc>*v=#Azvkt;nQHy9e2KO*m+tj- z%LljOKi|J%ZO=h?EpiI%Gdv5Gb1+%sp?9YEsOs`6gfwKeIV6%Rp$}ui?Jou+H-Llb zN}oF8e0TJnmuFYjJ&tK0fM*g#l%)wJd|r@91TC2VY#D5uMv$ zPhC9){5x6Kq0nE~WBJ9?q0gzcw^8a+_d|pU{jC^uR!|0VNYeKkM^V8y8sv}4C>j4N z<9hJ>kWA^$xtIwj0y&FgD%S23%m(!Q!~{z-fGPyUtwwbGaXs!y0KLm8`dP>N^MgPu zK^Fz|gKHp)EJKdq#1{r|fmB20bI~AF#QVlQLqdbeYYkw0n+8uaJbkAffJzsrf)T8; z){nOylqe5ljdWe@8clUVS})$6%NaCU?Jo}&r&4n^J=%l-)j*-Ttbo(KJnqzWwN%tx zX-VR`H@1gm3$mfIzL{hvZiJO`L(nl;Wk&{#Wl}9 zTZDBr0yD!`xk>t8fEmGr{8%JUu#5zmD#(p9m1{B5=OWflL$Db}0DOd7kqS(Dt#N`= zQS{g%?Pid&E**0ezQfx9;s)u`jC!y!M}o^X9Z=W1G;tu7cF?uKvmMRXN84H`3HlOF zj~$l>F|Co!F%Urv5=pco#AfXhn=9Pcbwk$qhd}xvJ4SZ6!26XU@;Y0uComFj0d#d| zmIJZI=q9A~JFyJzh+6}8N;m9>>1u5u(#I>Ss2qib9CG3XU1`Um;X>x?Gw-(CgnVhL z+}R`-Be9TuOz2>L$8ON&gJ|v84Qe^?lLZ4&uys_KOP`(<5q}v}Xa}B#AO&G#I#d z;9ShWz>OP9#ENbpN1XJ6oFyX5v!~cZF073Qt#^%qm$SCXB!?sR2rLvo&++v!9`kDZ zekg(}d&&py+rzL^tRyGg)3+AiLrW39w95VD04(+cHP(gA{Yq}&t8cEFmoo3%Zb9Gdz z%}xvl?Z#j4G^D7Wh{I*GFJ z;I$PcTqvsa6l+Y_QI}4NME75p){wS5*XxP zhQ(P%Opcw(0L8Xs4Xc7dA#2<;hJ-!X;YU>1ZA+#%kNJgALYzRQBco_SqG%OA5d3*< zs`ws365@IiYxHRHhLMgCYFXb70^~SRAW~uN zCzfjYO-*&jf5Trdxyd)37;9OCr0xWT#GyU>?^xqY*j?w^3S26JcyS?R!jIii?*6OO zT%x$LE(n!3gR8cRZgn0zA1;P6-kO&Th)DRfdf?|DU1L=@3WnHaQ(Fl4RQ@W$*Zi{k z?Yndk)Vx`&0W})xC3XWf_2#)i8 zdHR#q)|YyK*4Kf0@aKS_xiq;Nlp)cvXYbzW(Bs9DZvi0~N_eKZTf6hI zTC!?qM?bLR@=%=68dwB?G*w{{a6NQ7CPHP18$eYd{GixtUr*;HeIb|L&&~B#bCP;0 z*}^icVhAY33oJFoh47c(3`lAztt~C1$r!R#mwdy0W-o94AX+Sg#P`<5g7`VAf zkMzEI^k?fEvR96jqg8{0lc3(tVM;tA%H8O!pw^}5R&fHejH*Ctkl?Y$#}ryGJStxy z*Yo`W16ixM^ETv(?A_2rJBFC>V8{6?8{$Hm4Z&chg1z=qIp|1B7mT6S8A}Xrn`p%i zHlgJYJE9+oSK=ZVU_+S2PXo}iOuL;fx_|Rn^!|2k;Ia#z^w$=C_zZ z0EQdD9S`8-4M@)_%I_7YAR7ZdV;7}jVQo6ktl__qGqmzQW<&h<%?6()m%^-$GH{r% zSFfQI0p-!v3IdD@w0Z8W4p2F+rxbk6MSqf>nP)mN*2-30jY*VD8AqX?q7{=bh^qde zB~$x^mSnT?ezqV6q4hky^b#Jm59LMA7_1To%w)(!&ldaG8Q%7>EsN@7TNIUJOQ^@L z&?k#tQXO6$9X((g`@IE*9Hl@LMKUEbLiz{W8?~w@B$@O!eK39-NO)Rr4MRGDoQ9tQ zN^Q;-PH!IxC^ip)0ZhH#VZqOaK1?$~&nKeD8Q>6_C$Hs$U{@k6!PRzt^zlL8>nL}i zf5MZy{k{c1P`8nV8@}QZ_-Sop^Mp_Lm4@iCT)fCJd32O?@MK%0 z0t14i?M~?i|NFo1p;-U3r*Zn+sGXI#d9B!Pw2{ONyZkKvbuF1O57kp1gCsJt0dB#9QzxF=tQRPRFvA-*(`~*)?@ z`_4h)x8du1VrU^jJrI6$qi)X$VqjM49DHV$0?Cx8?bG^2dn57sL@7cEA4wp_fbY}U zM;q5^(PN(_kx7;=A*%ND8!bu8;oFjAl3v;Y3`N?Tj{CHXpfy5JquL~Tyz-d0+`s1& z72G^s{~~--W;N}@5+wyMGb~up9QR=v!t})h8xt75HDL|dB7~wt9IW3~$>@aIh5i6Q z)zIpp-Po3ZvMwc5ZV5`3rjOie-Cw(TE*?L^s}6$?X=@e!G*C&@2!=_&zEl@-+j`2i z{c+*YW+ETG&u|^aE>jY&sFI~MqmoA$Dyj`i2r8DMPMrRup@xE}Yoc2<5XGg+3c7QB z)`)ZPO$BaKwqa?w94;q?$C7t6z4WUYpPWSMeGK>#Kd75N zD_dKiWH>bl+R*{|*r(-T9tL}J@_tb|z_PJWSp~9w&kZ7y*XP#lL*ZN@s!TzERgdf_ zr_o0Dq4eo`a#xiS0Gxu+gZDivA+Z4YMFc{RFKvpTf`zeT3q@!0hiZw+cjs>$yzVVG z5*#CT5ItaRH5Md%Y72b^BmK^AE^>k^qfQ_Cxt6E$zq|AXGbM{hN@{{p#^crL`Gts@)?@}=CWxY;|yaI!A@HnMsr?VzD z1tvse&LE1DPbmDpFAmqnD=z%9Ii4RK0<~3))d0yc=_6b z75a5Ca`Zmw;qpWo+P@i7iYv02R#vi^*54|u=HuyiHY`$y%hA{{hqYF{=w@){W`?U^ zL5G4=Qf@>DVM@~KQF2UFtz_~tQ?EZ=CwA-nMAHYAY3yuAlUIuD@$vy)eJhYkvHYK>v2yRw>E^us2=I_KKw%ad!uRFILtZ(z&QWx?EQs~<9J04HDzIv{Rza=g=d^{66 zmUZ%>-;H?kQ(|%G({s^?sHQRIIVz{CV7jfWr?@S)m%M}G*KD~+j}Wt~)4;X-dkK~a z@8>Iz{ww`4bW**FhYwWEcOd2>Q<+si<@Sb=G zg7{4MYpCo=23qZT#Uv$H)su6;4t=?RJxpF1OcTirl7<|ioAaR8&!6z2X}KrvH9*t&k%A3xbmrpx?co=x9*+)~bw~W!Ou9JHe?724o2%? zG+1)X5JFym6Q}+!JSfpQ-~QqH#usUO93m7bCbV)I(f&9G z?Ah~AU~U1djtALrgTaC;*MO@*v(f7c`S)HgN=1Rri!Iy7J=;?0yUXXu>(EP+?!ME` zyn^>rZa#l~4macR$3Kllk7OB{p6z5bx_I*;AEg2lsB94^0@<>|F zxE?Z_18*Gjuc{9>e9b&~CcGaNjq=|!tcZpfaEaJu+aGX`e*OVi%JOJG`pngbXEwlf zH(BuAK_r3h=1^*csK6VIjux%fux<(gF#i?J2UbeLUSUEAWl%5?ZAFKq3 zfwjP;q1+Y@i1V5B&zCQT;`g~ro1KD3CC_~%&l@xw+J((MmsqMxIWH;0?IFo)RUu&E zTFUnlmLXZ9K`Pae#0VJPm*i%~QWkAenw7aX#jH4f#&XkuSkbCFNpLt?b~izJDJH1I zIMuKOL@@14PD*_S4rd@#etGK>QQ9E=LFSoH(+d^cbOWx`$e3ByS3|-M&$@JaL2A=x zVlecbRA{h9l7HJyc(L)iGo&(yk_uCkDwSI~4`f$3SNDThn&I~1EOTei*0@>K_FgnP z>)V^yfU(j(hcdHBU@*yt_U1Y$)BnW8|IK;ee@LVJo0mg9G`63uT#6pte2`iz?}m=5 zHgg;`Ilaf>@|kQ=ONT#xmoT|FPH_7ZOLki8jeq#?DR7l#we-}iueoDg?Rm%9DfO>A z@8z>5-M^VUUUS>mqk(=xGe%^mzisn|$Hp+ri@z_pp?i(k<@zp)mNv&|c3vKOKgNew z7tFgK$ooA`NTkQ**b4jg4tj5kEqBMMR-Dw%b!5j({8T6!>CBNFHoF^rlJ$PQ#=93| z0X#KWZ&&<#cJv_~*}nN=8u9m>5AqS2t}4mBI=tczBtR>abbnglGg#oVj||M+za{&zJUpLiiRtn!9SN4J* zkZ^wc2OO8gKhURD7T!4l4#IyJlS>N6v>?+(P-UWqNCbnH014XhV{$OvAgiqV5Q*DO zVOCK!LJJ5tB0dM0*)6bUZNEN!Yd@dUuMX*_3zk!>#k{KQ;;63bO53yXIU*sYJGNy58WJ zPWVt=a(mwq37@xUZrq^Mb0!u)qx{29g-#h8BLZtQx7#aB9Im*(6UoMVs%`FW*^tN%Mle^A+I9v~0`LUMjX7)|DII;gB zr*4&|*>t>KqpPZYJ>*o_^l**K^Vtup582DWg7muD_xt)|j6P`EB0N?9rVc zF3RGZr8}2(;BeBByPk#PyO z@muJGf*ID9#g*cZ%CXGe+A!7J5V<6E?QvX5<6@73dEd`il;lVH^ z&MtF{OASes$I5`Lc{E@({U)^eHSuATs!V{uwnFt}VIP?o!YK&=V!5Am!cM$(9!@`kC z$f;)T(oSoHX8bFQZomeW z5d&KNlh<1xI>S%P2x*T*qbU;9FkWVb9FwT9`9W`k75{WR19eHikcYON(Fb{>m*hoU zd?uFx5OAZT3ou3=Ob^$r#W5Cc_+5 zgib#NUXd*}H2PyN*FO7FRFeME+&bvAy$Yck&+ws!M!^S^ti znUWUiAEt=ZsC|LE7jo&hzSq-I9T^ELE}Ud$?wBb;_f(H(e`|!V_6$zd`KYq!zh@~e z`Y&y@Ulu%uz53+Ucz*ZEXWgyf+i}Bdf9Sa1VwgjXP(y%ga@IzI?R#ZI!{zbYz{}>V zuBBV$Z&36ua=hOZgu(%hG2|aOXCOqVv$4~L%*c?c8ubml^}6oK4<%O|N-d`ZGC$2f z|901>`D!dU;gRp~ZZOAt@=}~Y8ROR~JPnYE(c_wM9Y*V*Z%NGEALetb?-V6=vG`5G zS7Uu|YJ79=bbQ;Y*)K$d)`L>D^NM+J48Ye%SSSsoR3Z^IDMvO9_1pntR7>W1qcter zR7bCwuWA)?63tG((I&Da(@Jzdj42t=@=-Vo{Y_hw{mEz zSU9uG1(=39$;^5xlza>!Du6otNb{hkN1v4r^55@j*x;qJ;jF>tEf271S|9Sn(n^f! zE>R2{j9a`j!`z(H$cB{PWWqPGpV)-3i`xDVQ|}$mcK?2lheX7V*_chNqSRK@h`no9 z&=P95wcR#B5NfX)t-WiHs!^l%Xi-${QM1(E^XGlvpYP-G`{(t4@_Ih6*SXGh&be45 ziK|1fRMc!(QX(Q%h$tQ4d!uf@%` zkhPp8HzDAf0a@GaFNv&uiCyavaQtlx@4{14~o?u58azpJsH^G5HOs;fk+hz>bo>%JGTTr z{{M6OcQg!s_4Wui{v7%E;p4sAn>F)auG^mbxwW?3N{u&#PrSEFhF8Pq&!lb^!X4LF zD}ANJ+TJqGpVEKQ=C3_mHeZ^$C+c_bH}GqHR&yjtOcR0s&H4LJHwu1#NKTz^+|0WU zi*^=M9JRPO=TJr)p9PPtiZqgtwsn6~2;|yR*ShWs(SA|Zz}J%D--hccek&9*-Aie1 zXDPd0ybl6TI{kLS2r_T3-ili~_bUol_41FODYT6uTF z)wcIV+xB2D`nl`hfJc7aAI1L`zCtxEzjz%uf4Vm?$&%f81i#m^7Ap1BY0ao|b{LN@ z)mV0LrGG0eJ=1EedcF2MX-iduph#wOwPo=tF~02#K=ME;`Ryl;fBbAHe0f?cL{nDk zxRkosEVJpMfAGY3LOL+OaB{cBMGFIqxuH4*kYH63lY!j}O1> z9O^qD+oM+uBUn>U)mq59EEuVP_1w|vjOB~~Jgs@U<+y>Zt}QtXj$y_)gYPbDU2tu~w&_ zI$e`2AWHV(k(%5FMhS^Ivc5F=ch2_z9x$|V_w17NHqW~fns&RLE6E z)W`SUY|b>g6Ez7_w=72VB1j0+7&YCN4*6|dua(JJoUSJBe{nKk8T1SoeCs_(ufX|L zYWF;(?QY51KRNG*J}w;mm0G=`RvmPE?fc#IY}nR6sO>DYZSBqN>D<-c=@*QV-=!zj zKyc{r74Til?Tc;URy_s{P%fO+uYjZR=9$eYk@WL~VbPlPc!Zp5lYNMTQt9kvq=i%a z@()a7C?1QPFp*Z?c;|qAcS1(hq@o7u>3QcCuolewX^t|`=}iU#BqDy)hnCZ&gop4~ zR`z>vDvp!D&Rl%E%+|~J?^{Ncy+G&zKz6Ru=S57KU zDzqP-5)vlx&@<6<%SGWs$e-jZqU&185GK*R$G zRvX#^#J!$%bZES;lPsu|?(KNh8d$BGIMhpXKwn7ysdxg1Nw?rEX83cwR?Y)Q>9q?C z+Q*ivMu|xHQ-K8GpGp#1%c*G)KT>OED>rE((n{1SE7gf;#aC{Y!CdF+TlQ@KD8lb}vUYu?@2HH7{2(j;B6NsF>)MusUm;fmw?2%%bYL80E+XQ+5cQsW(stg&E`=^Jr*if- zHaeoCb#7Y<=ZEaK!2(JjJu1>31RHLAE)RuaYfbtd_U?|BQ{oye`zfaCJ3y*u#+ z`S-cl2;ZxN)^=m~7T#iV+3VUIk;2pov#z{KA5>sa$5+J3->Ko_hS|=TIYMa%tC_;% z*B|~0NgE4^N_T8;(`<=3<_kB+2-LF-aBmDDr#g5sio1^`21pp?$HIL8{rdSoy$~6| z3I;gEb$mBGu2K+H#(q79hlIf%6~_n zrI1asg` zT~sbElUy~C%kuS?&jT>kX*9mlC<3ZOXsrX1OQ2Hp8v;3_z}S-n$j&znlbiCN|g(V z=9{m)tT|W|J|&Qy#?Iy|>j?nx&~FZp7o@o|crI}Iklr`a-(F}aNhQ^U`cx&J1&ldv zKm7zVH;tGpifBfiMMk@Hcg?Z<>YDpcg5o#vKaIs*?av7gf1$2VW+yIRXwZpgY^Psc zYz<+qoKPE{`A?00Inc;`6FAX9b zJ{oUl8yI%@a;E$_-uWHa;kMvX{tZYf3~K5r9muO(yXVV$%s_V$0lfn#0>(5+tHtaEj#McOs_K_y z;)aXv2mp~^17d9*t(K!@8uhUiNX$xH$oHC(fzV_FT1`IE!GS3+gHEciyvk&-E`+Q2 zco0F6K&r3r{9b5vOecL(%*He9vv;+_z$v602g8-%^yEfDP~vC$_kRsbPnr)K8qK%g zt7uH?W*K@tt={k?h;n06A%&3EkgC)~xj-4Cqe$AGEm-_VQ7czB2ilPk1PhKI7r;}L z{$O&a*bq^G^V?*H!BkHa9}ZB}f(3NA1`{|ZvLnj2xeJP|W9#!_Hw=f@%kA7~bV5-F zM7gj?yHGRMKe5&>dG1K9O>7mjd? zn{Pe-?vWd|bK#Gx=?3*AadK3C6a<=|SK-t8IJggXSv}A@e#rTti4-h4*csMXfOxAB zLFRj^TZqu_w2u7dU-u-`-4-Ggp%!%hd?l#*f`#~H$nw8k|NlMilsEp|LNXT>p8LlY z)vV^3Kb0qEO~J+YNcmY;MB3g<7AwdzAf>Z+_-gAuZj$DjN)WlfN=4+^ zW0kr{=!8h^2v0ezIsX`;`DUEq30PJKm$bIiBa5aOLD3uTmy8yzq$2AuDU2o*^ST|2$nWi@LeY7BT8xj;l_22?yhVpE=G;LGo=Lq!jW2k;{yIuk!3P9zqw~*2};?kxeGQlSm(2k>6{b z#=teDGuw`IWrnu*T^_>9L4pDpOyvE5J(0F&<|d`FlyUFF!s)4KbnepaNCiS)Q;|0= zu)-p-08XgWa2$(>Ze- zuuR?KLY+_~&4DshFVB6DN-L7v4y<1MX;NT<=$#^sfQHCVDCH2oI-R;+xD^O+9B`2e zVhh6+zBfr_AO`inW507eus}HQbawUg=>MT-8O7oKsIXZ)98DF_B%-{ND5S4PhM6UE zJs~Ji^yyTj1e(y0hLPEqSW1i=G;G^!EqRv)bbivmaBuk8_3cF&*9=asK8!2);mUb6 zKJG?xA=f-++D;TN4kIx{EzruF2I+g3Zgwr;OqIwF%$#}*cSdFKIGpsMTzTN;v8f@3silA$IV_`;o7!jX5WJn6$6{G7pD<-GR;>m2@-zmQhl zb-=vTc%(XASYHhn3jm0OVtLq7MM|-tKAg9lNt@`k;dR)q!b5g4BCTi@v*UZH_oi02 zIo|*LHC_AePqHmJyS}#^H?`UBS84fzUr2P+qVy$AwaO?r_k%DRYG(P;DhmoCB7^o` zIC?5dS`;VtG5f>$nUyGJaMRR=NF&TR#5fv@K+r((IpOR$Yey9fz!Emy+8Q`DVC%&t zBl^kVW8(~QN;~G~c&l7622kuYM5?#Pr^pU0tDoROR}H`x>ViZR%Q)?#pFu4nXb|SU z1bP|7pOh`R_trTx;B_!86OUlwNIIBupd z8llcu+Jqm`%5Yy%Gcn|2=~L3Jl^bnqW1mQiIAmfHCL2cnA$Y~~2Xb%Uws`f8C3JA3 zQVDeT_Yw%^LE?G19m2%94yx-t>d@86Z7NVqOKA>%Hd3II9onKzgd5k=S~_G9tetgY z>jJQ<#v~lv6k8N>Wv8%xr3og;V(b$jmrJy&q#@7`2H;}(=;9qy+XbpfPlB^OqKi1y z70WyNZVc$3aziqF?(TyvIs`dmGusD4Jw~2t~dIaA9U~c#-rEpZCqPjr zo=F6ly0*_=R>8!jiuZ#XK8}L17Qp2M->M2h@FCa@(?ouuGI;>iBkESWDaySn(PC{J zEY5<2y{01uzadcr>&iH@GW4l5w$4dSvR^9bE^uA^V({%7^hpvBb$Z{)*cuY(U> zvZqK_Qi(*MBYYPAIhi{k;4JH$Fq;2f@5z$=NNnW8dnL-XaD~$Gxb#JVeBD#auhO}Z ztSXFh>H}4!_UTyFY~E%GOZBTSpY)UR?xg2+g6tsnPFd0J@dH-6MB~&~QuQOtsaBtHje&9k92)!2f{n1B=HJMOk=pg0 z@~?R$&OD?{SYB7gCPi5(>&Q`Rew%rV-`}1A=xeo{KqDNH9I^!Y4>X@ii|-7bpCueIw<4cbNc#ys?VI0pvd$g=LJY(+mli67=vEP3N3T z>rmjuK@k%u(e`wN{ja>X*_R{tYwA9C<#fK?o|Wx=;Y-)(HjM8}PJ#NvZTMz<0+SzB z7|F@K#Yy~AD+M0k?X7zDOW3Kd78Y*b>qcLpebW`%2Pm zh!}wEr`-Cq+|#eZ`%G{)(ShVN3BG3aljEg`V>HG-q-jbVs?JLqCy$gw;~B`|2jGKO z8l8B$!hZd*pxbGRwrL!WnIrK#`7>jzN>FPWTOfoo+o^s&G42t~arnt0sVAvs&+y`E zI(2!Z*pUG+;Ml7V4!_RH%Cq^)$BbWWA5*FiNzgw?;vxu!PmMpH_-WIVUjOlkj1b5U z258c1IYMGr6Se%BdFt7+(`#&-E^Sup6bOc9DCn5_)WWPsFCT%}fnsvByA2>Y$cQ`_ z@K!U3o}EBI1gRc8YzX%6Pf#feMJ*zURgroMUs1>)&LuZ z;w=Q#h5Hj`hU{lBF*4Xu7_Bww*}&(Jt``$bGe14kWTmW%8*2Bvlw$s9j!6^(U5Gc( z(UyXD5X=#;3}Q(UPLYiF^V1WXloN&!x#hv&;tl!Ha`gaS7N2-oORO_`!T4Q}60esMR0_b%>j zZOqJQC^FEQ>_Jj>h2@h)gT=nn^sOBqeN=3dwJL$Y?);qYk}qy^$-^8J1~$=3q^S&H zJ{OE2c^u7CBc`yk^DpyM*Q%o>TGqSfD2@4Hz&*)G(v;N>l-SHaxfY5 z)u1hmD3#4_8}BT$adiL-y2XXBw5s%<#wW@@ABEDSBYqrJ6?mt3I@!A1B6j8jFpRs? z!&S5GE1HDdz)p4JZHg)sbdU%vb~hv`RSS5dKnlW+vs0Y~)RV>wj3=m&iKduPAHlFX zURFsVl~AVQ?0{B1)iAcWBEv7_ltLoJ*V}3R{GjxS}OgTg|W3imxnRY5}@7sf~!1>A)py`$=82(0<63L2)TSx9S5$MHC>**U1eA^6k0LUY! zaSyWY>-S|1hT`HhUB6`8$n46I;u#P>{uTS-5uJwixd=6J*5S%zZXC`e|DF0j{4jk% zq1o#8?5C=>!M_V1SopAY8AstGf=?%)Z_x*L3i!1~U>sY@2NgT(k1-v@arZ2u6?<6z zE}$h3SOkRsCxlO+H-6)DZluLphvYnNSKpl6&Xe8rjy6%lg&toKU$Bh=si=vJ z*)tP5<}+CzZ($f4FwY}GoTpfX{-m|fKDy92@{y)Xx!9idk83_n<25u@&r=VFLw4a&!Mp>`qmzfJdlTdc}!yq1mS!CBZ~Z0s!K z#ybqh4Dt&(ClvlHVV0^ay#t8qmNs6paqU>FOcrfp$b$ehuh?$Nf(v7h*QyjQiz%4b zGCvSDUaT>1OGxEEX(rqJ2R1JHb`W^C_5zk-M8Nd-lrIOMUIi%>@%XDlLe#Zrvz1z^ zVkz1QqNj;aKWU=kjWePlC9e;*BPrawW-(kHeMZ%uu$-mPawAkksSZKIExFJ(SZLo9 zBQIQAI0n6#HAWf%SMl%0#m@}OnEr%C2C0SF%d2aBa@C;Gjl%$?Nyn)osRaD|Kzaay zme_ zFjB9Xnfbf)XxsmNnYLb)+-uzneeSgs`Vwf1g1nbSvJ>5C^JZ?{c1 zYCq4${ZTc1*r{AX%7DdE5d;(20YX-DYJPo8GktF3EiTIQ0-yFMT+{st4quH@P@7+$ z5Jg$9=pd9!vRtAiImMAe5FMF;;Xl4$Vmfx(U9$e?zL}MGBcjJ!?C+ByK~r0arPOb) zXPV+Sqa*M!w6bi1LM;Nk7(6)6C7<5oQ33*)`I52~Mo%gWK9Tz5$~uSpw<{4+WFfvbe0M!Z2WP-iqPHD5jA z2EAdkT^};kH{L}fmtB#rt2VCY=3t(tzsqVvp1*M?^D#^|x*9}s`>I$|Dg^al3s<Ils@Ff2uRQQu zr}i$#p@de{wJs}mV(Ff)jwtV{%*%imkr5br^oYpksaAUOJW)kWDk?UT&h%{g4Z@3t z-MluD#TJNgb>XZ5QWp-Y0wiFhD)@sGBmU=8xvN8+Wvi>!0o%O+QU4;I%6iMFyK`kX zaVIV2EWSX^sg&UvqRxHDC?Nz?8dVsMyXiW7CFIr8+iCS9Lk4+aOrgB8>Bm=fB|7?L zEP8ipNfFt_ky)W;@<%a?6H=Z#rbo133cd#^V6y8Vy$5;rQTdTzRRAO%Ptk#t3|~RJ zHn-NG)+5KJ2KK`pzd&UP#7+v4OXYf^7;Pt%p3iFpG(d1EMm;r_WQvEv#>u|q2sJ#f zUT>#rCg-c!-K*&ovamn$2|72+GMH4PqKc-!O)!^_!Vzeau(Lzqop`)J-rDUP>r`$$ zBohaKpgef5T}Tz#w>Us$Ni@2mqt2_4*Mnd!DY5$lenpj%ROnE=rTD>N_UbuxXJO&w z?(ZsAIXxX=gIAUyK`H+#GqY@n4$X^CyR+X`nv7FZEfqY|Eyb}<_Zmgo%!m}Ldv+z{ zYlqM`0)+qUtS;U}`u@XGXc0V>c8o+fF4&gHVxej?)z~c{Cmsvpjd!Why`^Z%9vL^ z71@`5LV8{L;vx0#8}=R}?Gtz{AKs7vO(%p3a2V_#I_>xuu>C4MpxJ(m^KOY^*S`mN zQjeON`Zvv2mGT~jj}_=D?D4(6kN7@n4&->y4mnMUpipuwwipfOBtR%W?@`4g^9eF=>JdwC}t_-ELV>5u501GRIym;vTfr*kr` z3&g?+QnT@GGJBNrvSF*1=+hj$IaC}ciKMmF2v@RLDuj^}XpIx$IV#0F{DQYLmzWLt z+LcckPBtxaRJxLBN~mHzc}G~?5I#38EBT{{`}#wt`g51&*2)r0yXJk5;hbs6`EzwB$fSZmCyOHjE08#N{2sfeHEY)~`e`p>J~YOp`5^aR)X&PN z6I(_568IuP5U&jS@5{O|DBkv{eC7CF?ouclXIhI%S zw16ju`epw`zkS&zB9SpCRWVVaj43Fkmk&&JxC{kbn)_`ePw}9(zZ4`xdQ6DEKF-9d z5Y{se2f5rPRBpneX$gLAe1ufBv!tCyfdsC3=0OL?`;R66t*$5kdZ+G)n;fao(l$v8v*6mt808FscGo{mUwHN|{r=u)|fBF5YPc zH|=um&N|hHi&Up~H0kAy^*>Au&dyUPrZeIYk$xtj66NtdODgAxY|C;)Lnj}RT>+CB ztje>g_vp^9!^M>Wx{i#n_;xUYN>|hLU?!~=hgFG`89(1ibg*{K9aQ9}gfhHAZBH_p zR7g~zYEPYGLo^h8{PXtfDv>V*M0MzVBFYpJ_j(_c9@eFzBtW|;po zq%32)&!9m=cg>(jTuz8E(DB#(kBC9v6IK!hx|HOZf0%P4UT_xK7AHE}xui+bcZ{8} zdVo=eV;G`poHxTa4gE=&G8ZwSSqG_rNM||@NS~C%_S$bN8-mEFco0m`jxYp^LtRTt z0L0{;Glukn?2AGSy!_;Vuo8soQ!!oVXAran9fwEV$l~F3FEV+8*zM?< z>GQQ~I21BO30_JSU*>wN_i8zaa_!!lm;b5ECyccGFk4*N-ef8h46|D5Fmu=Etr31 zsr+=3YucjRlxH4+i`Nd=Y^8t*@bTgW-Mw}G>nQ#o3r?*cUy>*0x={ffdc8qqTbQ=s zg1aNO*o!xhM<^9PUsm`tW$spAE;5l^%h&|6{Rhc>Q^K~5VKpM8 z23qWC=rS6^K}rrZ1|Our-ev?x=Jf=NZD&=cW>zo-XexHsebr1u6{mjK7M>vU^3g9i z3R9r-9h_eqPx?WN0ECzrGZ+jVQ-{0K{QRK<8(;gYs0HsB-lCYut510sPFe_d=S<;l z!ux|%hN)K3c>z-G%|iKeIuR-3mk$lvL0xLkzIw7gN=%L>_}LeQCKf@?RUlJKWuB46 z`E2Mqf9byKm{L$EhN{{7I)(#i)FljDUo8c_ziz30^#vx9V#lCB>E5Vqtc)MObS0(j z-Cz5w`Vjhrf*fX-Z}ctkPuQES$!c%^$)#st=cps_(FwDSMPL@A(?Yi; zo96d2H`MRVJP)P!8zWq#ABht;_Bz`wRCSfxiqgkN*u!68S&P1vSmKlW(4Yvc1v9YTB3u8q@qOP1X$t){qWO<9MJ$ePLUT<)o?jc(kv!l1M}Jz>3IM zvlZM+>$tO&*)Ruu#HrkLGR5_5oW-L@QhWl638LrE4+9W?zX36^v`!?>kd5{3*Uw`+ z#VkVOjkmTqR;meP-{q(0k#`6<$>QR={I;W4L1|)<8iFKd_qo2v4M(341(0nRDG#i> zzqQ|KvM0>2wf*IO1m+Ygd%5-*PiQ7QB3eh28v8tueFX=myt6=i{dWNWLza(O+9fyD z_*cT`FW98c^F45wXM~^sumyHk-YjVRl3j4-@3;BxHCK7~X_EI)WaEz zX+3ax{cOaMMK@h~4U~D2)a$m9uI<*%9PZ7&`KvZ-sPd}Pe5HcoMn?A5cX#PwQS}MS z^Tmq{PnW;UzK#Bqay#>nduJ_U3!gR31?PRL_`RXUD6vya##HZ;{`=D#%flvn8{4AI zI{?IhlGjvqXk~pNx~*&Eul?5{ETYgnuV05YY`SW;GR=Hjc=FXRStB<)yUuhl8}?mt-Wsg2!010@9Dz2t9C)n*869A{)nmzNV+KB@slN zoXzf>On*>yl}X|_XB zzOn-Y1GOf;7GGCBT0C|3^Iw{Zi?8KO&tGTr#uc!b{=CP_|6MS!SfglGwMtFim?}6o z1fh3aOh+eCd@_*Yd zt_6T+1E2mc{sD%T-tn&dZ4|ic>Al%#I^{iRINMsemQP~dEzIvDxpY0eW?R`5N)QvL zCE)v`)@%AMfyDlhCj6=IqhayNWvo4m%k)1#&#z+5FL(V8-nIRuB&_0m{N}eee_JXe zMN4dDSx?h`Ca~r9VCJ*+CE_0@6Pw}LnxZKVLIQ%sOCHXF>({A|el=AL?wkH}*)D$X zJVf{DjoG@cNvJpyt@GfbGu_}xSFU{$OkENQk}cAE+31Mc=62H%bsNn4@zHqu0Z*t& zX#O9i;JC7$1o$UQsW(U=B_^b}K?i#RFEUse5noJxoNE3@@QJR_93K%r2!W#tax@-` zAkallKtfqN5rRm_sKvDW@EG}~p>o@^Qm`Hw9WV!Q$dw+v8n8SfpOxnLZfXjT@uR(J zq)4P183;mDPMu3utas{5dg-vynFm zj&LjEze;+^ONL}Dp`z}?A3G1ox~i|EPPmNysyDcFAx)hSdr*)M>BHA)P*=@ zf7EP!dyH=5YNmqShS2DTBV5Bxv4IwW^&~>oa1w>fl(ggQLV13fKa;?P&i%Z$-bsBgkBz;)`6}y=xbfly&14>K$UvVP)C}o17({?4k{_(T| zWd!(@98rC)axb$vU7zuEdPVrQQa6P1or}GM(jcC$^DB~6v$)Jf+vJqIy z1BVcB+;!Cs$#kl5j1Exo8QLN2IeCl0^o3|a%R+D1=_C_QXo_2{q=T1I0VEm>@z|

      8=^G#)mEF2wf6i{`o&R0!F#A4Es$4{w4Of(&OKck6?UlO zk)%#iLNdk%XY-Ocee9>DvsOcvI2=zZEgjy`bq&8=%~M!09NMNl1LV3hbA>U{o0n1s#(TG){zezP=edn6I?H)MdsXxEmF34Lh=z`ri&9OaY+oD5477} zo-WCFro4UbJ1HkNHAAS|z;;^oW*x1^Gy$XR_UkG8Qqd*lA`kiolXedfYJKy(5W zOh%d@_?jVXr!l$s{U&ILR7uUI_<}B+P7W6~2!f+w{X$hZ0&e>)r=)b`+$-34&?=9h zA-m*vvfzbNB>=ra5(h{hl!wSk(9e@sOTMF84L<@u$mQi*jaWIsPd9?*1zg10n?Cdv zYKbank$%LRKm(K-M3+-w5f0>MVT1m6{v{VXM;8OSyZf4GF!kAj;cZnp*XC2tI4cwk zP4z{Z-Ah^(Y{H2~0~~P0K%rMmmO0-ra&0Ps_GzJ^)+fv+mXkLeC%mL6RH+(~W~fCe zy$BgMkxeiq>}OAvI(Y*rfQx?8vMNHRVDmFEA6Y@| zG;#On$?y#RM|I3ilS$O-LNO?U4=WJD z@F>y6z4KpY1G8`$mnsm#Fm$H0Vz^ZN_m?7IO2L_6nQ=KF>BZ{PfoSomgsvvb=U zp_DalYPC-GSZF`WsHXAP(AMn?$9w9d%O(ot6DZ&^17cA5=` zT5Sg!S1W@tw%#R!J!v1FyR0(xvII)?G6@g<(7L~D8gO*)*V!NQwZ~>|oMMeZ<@zr; z)Bj%e2cF-0UCx8RV%yY_V_vKL*Zct|91q3}(3frPw`b>B>k97{q8VQL+q=3QNRn?F zsn_6uY#;)?H=yu*0>zi;udY;ddg#ezp@!WTHlL_Be2C*ze#Pk>(6mgIaC0^h)KUY* zhX45`G{*d82M*b}C;D1|8!m#?smoL#_m6%~Dyrkrhe3QMB}KB<@DQ`7Q9*NYA*sr4 z(&SD#`nZtM8nvVk0Q?{0G$3ffQzBZaAB0r>SWdZeJ4QOcuw;XZVLXaEW&u^f14yK+Fq;_*V-3zrV+Y^99s0&6B)ed{AfNTZ&HseofcNB~ zjvUm%ZJ6JngEx+Mbet?5SqKi_cW2HN+nF^rvV(OKpB|%RcG~@+6vXvc}mW2f+ zf^a&Me{}V7xbEWeaS~qg?Aa+g!d;+XpBI#J!Cun+;~jBnKR#?o!u1VF0R>#m`N}iC zY*?W)LU!zleS7v}A29SRMI+X`zKyeh^tB`wW*0{G;b|J# zZ?bNo_xNm+Z1^BWAg4rvK$(||sFo|bkUWd`(uf|Ugb#{HmB)=+#f)0eKxR^-m+47q*tVk7GMY;it9j#z}cOO_Iw-+ zgE%c)6Y1~ebWhhEq((ndisJWJDBax6m%c|&-s0P4 zxzq9c%?m!iunipO-T53IICJD9a{;XU{h)Pq@~qX<^E^K5QY>cdbZ;tl8-#YXA<_1} z8B4wTwR`B_wnrhgdRL&b&R5OXvbF|4pLtZSb1*usskB|T#XY)l2{^tCObTR}ZGWSE z!T;RvK<4JqG$3Z?zMIVYqlFN1mR`5v$mjd<4TpiZOJlQw;ai{YUBhoT*8}5)E6-^I zu8d^6+yYPDT#cLGLS-)-o_PIvYu?!$=oAmszIYl_BGX}h{Wsa2<@8zP_5HQj+cp0r z{tMZwlfZLw8L!2xDc7(1;=55Vt`@g$!xCFJqpyw{WMe6=er}z8_)~Bdd;dx<;CFIh zSMztt=m)Y}Q_oMrWxFY^HTrkW4j%eV#@>ROZ+f5TGFMgkiD>(DQyjj#J@0P04ZJ12 zT?bNM9qnFA-k!BJ9M(8p8q4@UdFda)U_dO*R=)oprDmFYoEDjiN5@1?5F{rn$giF+ z_j>V0tJ=MdTarXWGbM;DkwC-0yG(&Jh$^pwMk{C>rp3(sUJZvG0Yo;~2f-<;-k;nP zz$6Jla4>vub{8Bcz5(YjakB?HfQUw*IO1x-d~p2YF`b!F2&J6?bABoVQ73O__?09K zyLipPE#ffVZ5Z{B!=BrrNyB&C1`kL-KAa3&t*8mYa&6xvMOF_uh2NeX8JG_3yZQ-SuqEH;OVo=Yj^O$}` zl^u?TOAvpf>SE26knCftHHesM|6-rSstnEh0UmcXa5(UNvRV!Wgg27oH49d56v4R> zp}_l^$=|#3C;!G5rnK;ZWa&cC^i=dg`O2tjDDWQ2_prO+}<`@Ff8}qs!LSs;pi(|%@7an4G5EqUe0>N-{+xMcr|9V0qaIdtXW8lIDldC{i%*Lx3ug01uHRL1cZg??J> z6s~+MRpx7}uX3+mV&5KB9d}~ctUiOF-d;@>7SX44^tU7@$;}Uf>uhrWi>&fz2A0hu zjlq(M%v6uejuMOx#$@;YzV{gC&AMoOaHtS?dU@6G(QN4SHqdF=rKmiQG38g)QwhD! z(lwV@i4@!S!bpg8>ah8IJVRz! zzwPjz_wtM8vlM-b!zJ@8{YM`v@t|)t$$YQod~c&Yzg+wCzG=qn`g}h<{Ic*5jcu06 zUeUt&*wtvbtj2|1mQ%p7lGGvX!nY?fUcyhby?A9WFJ*gWzx=K|4>fPY3ZKZN9sM+} zxaqsUUzs)iluo;OkN5kN!cONKYrowU zkDaGvluC7ve%?wX-fO#=`MeiFJ(6bqyU;j+c<{dWgRIL*^R-O3;nfG1V^`^QWr{iTi)0B=F_CVg(2v<_%U8A&ZL6{fT*FNT%UQ1H1O1DCrHCv6hU&N$ar?u z0vZHV!IG87gUkWQbjEJ|;xSb|oYI(ubn~3pE232J&oq;`9czd%Ub{)E4IGJM4{i$w zAgh=@u;Q2JhL7~|H6nfpiN0h2FNR@=5P z?;~EzlEvb@CaLSqd-7wp_B#T#V~HRl(mG4;VKet%7L%Es+vy+U`stUu*hxYV8l4C& zq5HN%Q2c8LoF01dqd8UR>MDmkCU;wW1u{jbDGydc#eA({I(~`6qT5R`6s#keeU`Q_+XX@+CCire%=nFq7;V<_lERTdd;cz^~WTAg7cB8Mh7H+`1tr9hj!X4jD zAFY3yc?a9lc(+;y2a13c$v~Ksw-T%YnGb!h?7%2X{3=Vk4@kByE_N+;JYt-N0@660 zYa@v{>1%Y_WxZf=RO#2CNaGvUM|g%xc*3qeXs{kVstn0FlK)0_noUmVN{A|0p+Z>@ z??v)SazcWIVhlME^1vU`+TH$`vzVAj0TVE%a}>?GtbFwLOL{F>JP<+ds99LamEvOR2o)eili*o zEqls-AZl+x3Bzz(WixcDGg#yi5haZ2Ckuf{b%J1BK~ZTIcne`->80&8y>xNkX2{-o zbzn$qTguv>ee;NLN^Ds2fWKLc73X@@i$89tFvPk0{{a#~?Y^LXVv`g>uNXJa}&z4=&+;HP%>TjWyO-V~sV|Sb>LG z>4p#R_TT&|Zkm2MZ~N;{^83H^<9yqjUeAB|PcP!k6Jht>Q+fJDPv?xOoA~WN{4=gt zgwDow9#K(rXXwmM(}{s{a+Xb7HgMw?ZsvWTp5sNYd_L!&9+)`g+5GTt{355Fei|wz zv(r<)0-Q@LKKp-uol6f0C!QF%`a^%kyBbOZmTV z`x`!T{gChYqu=69ueq4-`puu=30rF3|F3_`tA6k&`LB0KmCLJ z*_G40`HwH<2cP?7-tv;?l6p7stN-imd}{wRVRnkL)1^B#!|Y6#B0xDYO*y%aiB5!K zf|=1d(_K%8VPf_K-teElhgZDvr}*WU9K~%{U&_1g?6Pj_W;PwZgFD{$PWG*TDzAFZ zli7&yq}Trtzx-W~<@70KtS?#Fo5ylVq~wJr7dJ-tBA5y(f#y`AlnhNqYKx*dovvvT zbqZ8T9LCNsR?IKg92%8_y@rE}Lk=wsM*IGw^ym$T)G5(uLv2PvQ3N#sHAsr(NEHLr z5~d2OU`kRim>K?`fwue2KdX)Rjiit?(4;`^tMCa)L-qg*8RU2!fV6M|1SH}B%j;6= zM%~1Hv0rm&sn1-$VqsV_sNC?J;jr?wx`l;42j_bZu67^jvFGrBL(3Jz8XAo>TKKkC zDf{P!+_7hY>+e3mwRi62`rG$%^WFQn<*xnQde<(t@7%}S;RTxh02}m?VIS=+QY{>& zH^0Dv1M}Ryb3ZrUv3FGVbK8!2b{%dw*i)8<=D@6SPbp|r7`PFAsC&juH}7O=S(%!i@hGb0!GKL&kc96=Z0I5;SvlE zfc5~Vq9757Kwu4t{4!(@v5Ym=SYv&o>1&!gJ=R!bc^1b}M;*nWNC4c&%E!C_``R;m)_tkC6=g%%GQ^@k>7kupHi>m z7vK87xa@vp8g|hak1gfB-QN--etj2uR2<2qXv~ z{+a|LhKaVO)Bj>Va z1SP419{RO%s8_RZamaMHU~;lUw-mypr-`vt4LG8*>9Tbt05u%b5 z0)eGLO>KQ&>2&{Gj}6l$>t;$iMd@jP%S+0jN*rC+4!esoAZiTy6?5}FcJ5yoL92sa zb{-rs-wO;C6tD!Q8S-gEGVyjz1pqO?uPb=La->}#B;&YkN3&_;Mt1GoMXDO={(!}W zIdHGyg&B^guKniP$YmuSXIiRSb=XqgL-`g_who+2n32k z08jvv90{g)eFm0`2pKFol=Hq8MM(@1kIYPpX(DF$==~QVN+5vW2c`-J?k`3ll#zsb zed^I(%EIC@Q=2!^>-Xt&3X%=kzjrTbd7fdv$NH`7m^|@hC?+A4zyxN3wEYjrgZVbe zgLqyE2oF&~xL?`V#}~b^R;9w5ju#U6Vq}IZ!+pc}`q5ZrSt8=mxnGk!YY}-!fX(-d zwEYqjtgX-1d`<+~(~$bIv*E@ZuN0*tch%c_v36eKZFT9^}?rZ{@}tZ{$NC`Vd!Lb(Qb) zA97>7SH}fF9(-)_Kvz$r7vvFC)dnC#qPR;8<+bS0AY0AX`FW2fa|W`P8O3}ws7M5 z^&GtYb`J1RRj_{DsT_OUA~)W+`%C)VYyS2M{`#9|c9=cHX>?vA(*BlT#EE zlPmt7W&{D1e4Gdf7K9ZkuDnD)2%s4%fMftgGA6qnrn)8TCJSaKBHf}u^NMD@;m{#X zZ|KoVq){<}28fbDgMyhLW(c4HhJryLAR;+E%m4_6ivWtXP(wt>$`C4VGgw%y5CU0< zta@*PS@sKafMu8}r3hs=uwkadahoSNc71oWo#p6FQ*7BVi2w@=J@zjQ*>!Nh&O^%_ zSgx2`9#T2D2p~csMkyd65rg<@j#Hh2nQmZuvY^}PG8v4m>pL8?WtQWQ-N@EW>qp1B zm?oAM`|La1WBZ+a~+G?)i^p)2yzQEz3Ad~B;2<%_%v)FGKTEU=c9C*(6`o1Dz84G;XyJXaL z^4F+hDG`cDvy$%C0uVyTru%7S6r#+c))QQmD0-ddxbdaQgc_BPV z1eOHW${wE7!EXqFWgy1azw{9au!1R%Xo-L&4CN~)<)KRK;TyNhEN>L~N_k)jAPNR( z1LY}D9>v3@x%qisGWznoci%p`-R=WnUy%C*KOTu)H?^m&cQOovm2<1gqn+t=I(emG zR_0OUONPjQ zPpnb*x^=#Pm0F97e!tHLKlnlZ;UE5iJMXyDSLycajuB$J zYIaK=+aDRsfYtq$dxO0-?*$B0jiu#f7MFT7b@FR5DjYg=h>3{~h_!R23QE47fSQ1; zg@2NFk&op$y%$EFpF7O&|Nigt-QV%;Jd8S2@HN(fJMXw}z;n+IuH`E%DM_cF#AR>) zOFr=1e{%1>?6`%0e*e3<=C=JD9xRUv_tN#(U(Z@8{lTqVcf{`gfdkw;Dqo%&<`-@m z6~06nJ3spo-W5CCIk(Ktdxks=8q3J$$qGg`PX@zQ0rGrKD*^G7(Uo7HT3;U_fB^_Y zHPWDV_|WSMlU+9?XV}!#jWYBSXlg+yQ4GYW)escSzyg7Q0gWgCVv30oC=nCD08m*; zO)@|c{6D+*s!(Pt=H4q3R=+j#0wM$i080ro2O(gP07>c*WsCiieX*ujFR*)li4C(I zCW{WKHWmko!~Mi!r7Ts(FsCy%O#%#yf?*B@Obk*$Y9m=grAoJkei5k5SgzGm5I4*& zFg4X7n9v{899$T(!gT_!50uc=$5=cof3z%gOGzq}U1s8H8Tomf% zMK(`$IqjrlIIw>|d-v{P-TIB3aP(&C`F$Ke8#ra_dKz28${BBO*Us&1*%+9fZqTNO z_KZV^`t04`W1uD7*;!KT&|B`YR1F!VK!aj=^}ecVeB0@EeQ)JZB2nOdMlhPD#>nRF zK|l=6*Axs>%djXzl3+*>hdUl2gm}tc$I}G`$zUtCEA>Ilrs`q_IbzSFvk2Z+092D- zJ3&wZWX-RFx$Zy^Rz*-nOw7mRuoeh;9HtJED2nL)D~cSYrACM`|82OC9B~ygq-``2 ztOd4tOa|be&E8%#1_VQJAO&JThGdeX#Z2>f-N+pzkjxOXJih`NRwJ~4ZpAK7z3=$z zY^a|BxtW4V8@)x0sN|?K2^fH%>urEFm>40L*DGZK_^O#XVogDf{-8oIEG4Riii3CF z&DIUGq@qM@1_@!+^%2bS*zZSzuvS7VbG@qo%8Y0c}DfAB+T z`=e%{&?IAGa*~Z3H?p|6!2JAt>-{J}(Bun`aLlnsGZ+lL-$hZh&;_w}Y!3vmQc4bb zUNeFacieG1pa1+7#9U7XH0`-SJ0}vv`<7B-adBzYvyPGSLN=Q>ZDMY2ZghMRBrrQW z!_?F?l7FCESX|)1fkO<31BVK+D8N?FrT1_2nJJFix)mfZ1k)%P9`$XGWHXU$gs*nvxc5NR_EiWnV+ z#uxx0h#)Z_xqZA{L)9Ek9((Muyx|RRF;uG7KX7K1l{M zz~K+-&iK;_X?>QHNO zxWx7Y3+}In1R90KLBpZNAq&0AS5Iw1Bw?6lxRX*l9sw)^LIfaT0*GKaqR5g`h;iES z$D*p-wPPm}oeoD$cR6LtCT6t9gw~vR)J8U}pJ6cQvu@o+Zk)fF&6_t-EiO`NMQ3`J zJ9i#nxfY~5!BC-?=wLF8!fU+dSz~a&}s)@3Q6d_PI$@^}QqjDfd!5W82knc6r zKmZI3Fok3gBFPky0482Sh^T67ysmA;6JA%U8-kG|s|-sGl7Ut9^8`tX2t?Y4looa( zwDa2|HkTBsHAl(>vpV}@#m5u?8*i0^mEm1sx?*vbPQh@YDyzJS%>3PeI1vL7vC zrhv9{K>k}Z%VPyBeQHipJm7_YJ?maml>mvIY&?W z>mo-P@Kigo*U zQfw=bi49-@=t3y+xDz6Bzw!4bJfI}c`MqU)*%Izw#@C626&YWjl6EWd$QiRC571-d z5hD}UNbDQ*k4hf(|1)S8#tGu(zN1YAguK6f+eY|Y@R+lC=}TV14cFhmJKpgQRF$Gr zl2SvA1s7d(5htB=(kO!D@0p)paM;ZPt`JLQiC8M z$-nf!`OR;jt}EX5wm)NGVUfwHNmBNge8w}M!NnK9fOq}tzdFDQIg$wjXu-ppRIHY5 z2|4;i9n3xRqGuvO`1}=D5wpjp0hqO0pk07wdTN?){^oCXNb|n;z0V`m$}(bx&*!m6 zAIrCW+nf3Dhd(kZA7#Ua4ZQs2FXz1T9`8U)H8H=i$nM>Hx#Ef|x$gSw(5m)lfYsMe zf^q7pr|`N_TitGlCIh!_r%Qj(_XzV&(P8JVo&4S3{{yo#v%K{Oe}H$t_r1LT{U7kp zgb>>66T|%jtos5+AcU|69<2e9teT^$uKl^;;)^e4>(;IO>7V|YgS8bHbtJS}n+_gh zJhBgK+FAWQDEH3`fFYPEsc~OYk{OsE_xso1uCnvM41pZ|B)%VhDOAZ{^ zPuZF9`=%_5b}TE`M)Qi_N=n(cG}~(cD2A*_GYyyth!9dB2ux0P5oENT;OS3$DkqB7}BLV68;5-?}S!y`U(;eQ%&?6hX<1#3?!i41)k>hD!sH?6JjK zU?wI&{s&9sUis9POE3U|WLSn0E0QB3tPBjuzf55P7lupxB-9dknpwmUv^C*2v@t3- zicbV0$plq6yj&4vh?yU!)`0t78CZrXgg_vGI!vK4@P14Fm4-mdru0#uPKnCFK*CIk zA)?6`s`{#Z!$!T0#zLNVKm`X1$QrW(@lC!KVy)klngccZ{T}BYcQhv)y^T*_c@>qW z5zN}gdNVc#p<0}0X?{0HZ8?LfnOU~qvWtzIJDhU*X&gFm0IP*z-#{XbP10`~Dut!t zkkmkxK!{inLd4-;HB1guir66#NKKugRc!AGpXI{e6Y{lBrmd%xnj$9o+?DiCLiW*; zK%E)~9blxo_J}7?lBVp9CJ06u10Lxk(n2gV^FBv0LI~amLslXYbGn{dLN$Rz4E($x zA^-9TInv2f2O+2I5m5y(kIusU+5`+CH4UsviM0&jd`lq4kin1;5(LRe%s@P{3&b4C z`RifraF9-S0`YqZ5|Tlm`j{~vBic0hy(WoB2CN83Bt}K+8kBqwWf+#!uM;BPw{K zB9S9yreCu$o5+L0*{{6>R-Z(ShNvF zo{|`2`-N7MI&cvQIeI9d!Jw{5iUR~y^CBUzXU|^ly6Y}pJ@V%L%x6B!CqMNWZ>MQ$ zHg4R&%U<>phe6j~cU>Eq;%R`M{%#(PHYyo-n78jKf)X%TiPkZ2=#f1?LyiQhhC|=_ zb3_0P46la}g3m`)Rjr*t3+=q^!VSDf5m(+ujM3i%4z*Nq2y)(ekK-v%zL3BD`+xB9 zsrk8U{K57gILL=Taw#I>0PFno&f{rMeKH^T_kZX1|42vcbXZ(o_LQ-vNqlfr|2_9? z_h=wBBUN=90bixY$5?hc_&yx0_`DUdZ~(CiR<-@`6vjL*pVJ_StxD_5a}Y!Hac$kY z#jkx6g4cUrz}3`fRxBj^9`ths0KZn2=c5`{nE5qz$mh?g<^Zx?dAeT>Np*u^em`iw zcRh;A$hICeNgMB5r&H$pGf))&@xEvQRtVDmT|ow{_~*U7=RWs2JmxXycwLwQcnarj zx82IG{OT`_BD21Qv(J7EOG`_vl8^V~Q%>OpFL)vEe$TrQp-sy@(%a2ws|Evsc0nVs zb{{R26x7;CF(2QIM_PefQ<(CUr#=Mj!AF6RNsuzdsft-tHJ+jWyPzSqAr!t$gGu_xgna;l5>t;@g~pWf_XBr2n}>1S}U? zxFW`?P*}s(^eMFcSpDTP8GzmA7d+Jm_P$WfAj$yb0Zcb@pF%z(r?VxDsDcGZ2EDp* z!}1UWMGyfsqfUluhHPrMEZ{;=LIwt42|@rBFcq}1?2#l6!un03WpZMO32HEGpwfV) z3=P!_q6%0pf{3gESPJ+q(Y8<4G<1ODjyaa4r9N|e_we|0&t~g%7n@&X<8+7J`v*)- z7EElIAq^V_LuFxUkrPikp4pj6icVxUZseBRb}+YCGgLuCWSEqtUY|juNYNp>w|_O- zSCiC0pafE#kQ`bc3IPlu_dc1On0+$PwugLBRY0*87(qu5vq21cB^{ zP?RzMs#QVAe;Zg^Fhg3$*cRaCV+uLMJp!PtmYR84?SCf(g802g)ZpG<5@FaMy3baW zKr#nMIknL!XhZ4ShqNdLNDKS?t>xDe+Q`Tdr0q+{z|hBQimBsEVvHb>07y<-_RmV; z*Rhi1AhKzcSVqhWs#=Ir&|hfi2Iau5cd&K+G00Sn#e@Se0wES)5AX$7>;b%QZ5&25 z)>vbW^<@Ao2Mh#2FmiOeD!TR=uYIkmGEQl@EG;iNQ0Y!guyJZ5%S%f%sUd&Cb-2-FPp2F~&8AHoh_Up@E{~p8 zBY9fm#0d6W%K7I%eiXg*5^lWdW>1YPqVTL|UF15%)Z`R{{=oZs%rVC> zIXN{t_kgD!mSvYRr$lbtw21{zM+_XbZJXOSs2M<;#->Rz;OJwHCLkO>JlC!W+@ZR_FLqGVveCwOP#nUryxbdc(f@STq z(Sd`9*!{7OQ+srgUn9ZS6r6jiwfm3EJyGSt z3!lgrzHlYGcklA~xtDFI2$*0N5R`y|8Lj{rfVQiJBY*^gL=5~#@?LL=*>xK@@uU+t z<&;x>j7^hx(vzM@2*O|e_22m1&d$y<5xai>Xq$p*V1R&lSqs=4{vwp79_5##)iMk$ zzFq;=SYwT)Z8);602~DqBk$mWq^hm&QarLQ*2*xlFr)=qV0r8Nur~SwAmBnX6I%<# zR{VE_2UG6dN(ea$0>Nlys$eVqF_Zup0gtS~7}N=+a&tfC?n)wU{hJio0C}IhR zG$BG$@t9LiX7h#(T=AJta_X^1amuE3*l7$j3a-g+UdGDh`q zZv+VdijbrKpf!|l1R~;N2{95(@cz-R4%qr-m>S@P5QHWv>iZx@FcBJY19Trt$aRPq zhWS=Wvxk(Hy&KqNrz5Ro#&!q7%%ky8a> zCDpTxgmZE?ohVS7w`Cew z?$uDjp?!-KePOWN=jaO)I$VTq7n3fGN*>4qFX1Eh&;XS^m_fWT)>vbW^^GJ6(M$Vf zwl&~3%!GhpAriUwkCI8U>1|~h znVg*F1uuL)z21=b|Jw)h^MjC|1sooI?Bk#GRKg2JAnU^)`Ix7tJ^y*n<;D^0x%S%Y z9Jmat$|IaE9@RD4I?xyl`h51YpX2JQzu<6gjM=6mb#?(tn35@K;1VD~MYI4%gnVy|x)8@@y zzhz&hGfqFQ;`0$55JUVu@M>q|KL-(_K#xtJ5Ip;iv>FH^Dy&jic_F1mH@=DCC1y%ql zr5wQ@0C9lEy;jC_nB@1ulb-x!&OPTG%4|4)%gwj&p;7zu3kwb$FSy`*PCDsi?zrQQ z5wJVYeVeMP;uD|vgkRITb_mFEBe?b4=RL?G%pLvXKcL@`T4cp28AyONpjdnx@AYrykAekKM*{Z-JX{xsBQG1T$ra zxq}DTa@;Yf1oq#xn_&~_H%1joUwyK!mHwasK$8LPrvxUD!G(v#$B5xz(u*lzf*7db zhLR2iF(9YrnTOJ2t3ZT~v)j`44 zK3F$RgFhIpiMR@ojo|$=1QMzJ8xS1a9KgQmjgGu4WPyt1MQ2;^K?Onrl)1d9MD z3M;;;&_Zy#*CGmLzC~3)4a9QFrXv29*0aQcWHJae>6nE z%!`AKO&d4y+Sk5@V~;zQPmMsyU^pCsj;D`Or{3V+NB3;s$x%lgMR`GoFI;miszZ;A z8rAE-=%XL~m`4B|fBXp}AaH@3r&m?wkyCiTjIuB!1U@^0NKbp}lX%g^FW`zRt{O#O zJ=0;z2!dtM!>FyTqbQ~~`F50|=U?KV^u#BQ`ty1Khb~1?a>f~_bL_FlaOD+O^0~_{ z=fHu3t@*pBI5w5Tt8aGDw%t?oB!m@nd;=}~xg@8(m2R?LRm1k27^CmYD=fVZ%mtjOOZ&JMZF@lTTse#!U`jif+*wiMQTfnpXfXVw>97?RLDV8ckh| zKEIyx&wIRsJy5o6-r~Mn#~*(jmyNFN-FM%`*=L_US~>64zLI{^)Lb`$j3SKY^;r%W z4;(zm?%lf`(!BI#FCBrT3r4``O7`yA$KywJz4o=QrQh#6aLT|2!!o$>zIw@NaccmU znb9=jDRj?z_CR-cLkfbZ01$3dWA;;UOKv`mX?;?>*+hc{Vje!eeORZ)Heqx3seCb!?bJIRzf~xbsHW=>kq4!K<0s z*%rn*Xf-hNR9?T&CCJE+>u-DkfT^jO{9SCV3;{J%ET_x*=SlfNFIvDqXXbORs$+mP z)>w~T9f_T+1uqZqMX5EpR8kHBmk0cUrmFaP*(4qZ0uRz(zdJX1qF`yY}@Dxk`v@UbK*e&$#4Kn0W~b=+ov4f>c_~CFMwDJ{Z^SZt~xIW zhM;+$5HJx^?v|OMO(5p^3qp?GQ9wziBojn~&$$BRwh>@$vL>{n48$O4UAHSx&dy9T zSr)7-BNv{1I_tU}cJA24o_+g?TGQ#A%wsM%i|%a29oOE9)dP+_{&<>UpUz|#nV4d* zw9NjwAxi@zNr!%der*hf4N0Nsc4$;-%t!_)11&^B0)#*)3QQyeDc?n%j3}W^<1;`c zwDTK70YPZ2Y426c{S>I0I{%6!*+VR>Sy?DT_9aLwsc{)xdX$|h9=4vVT>}hO;Nu#T zZ?PObWDsHww+750<#U4svM@3L7IG0V%l;YQuLY9iRJ>R~hNFlQOfgM94;V-uVj!n) zKn9iu+2>0zhk-?I!}}Ye_g6_61{4GVJz~jd)kNOw<3RGl0g?c37YuBTne_^2&OO5C z56SgL{CaAgAF{wyu^=dlS#;o7b|Q$UJ5p5*CW;0jA=IH@AYD?wX7{bPaol9b>kZQr zphJ+!wGhR)U(?vNkVW{KN&p^B*@%D@NC$UF9u~z|g;Q z?qkp86)$_KFZo{&Ye2lDqz+h~ebGgu$epwK^FRL!KJbBmM+goge)LCwnDfp*kGt>L z&h^*dz=an+fwFX8Ax=H@GFi0_;c;SU!=b!%RpY!<Jw=_mWHe^~f}yGtWGeQ%*UF zU;p+0#Z5Qe?EPO@Sm0Z~^;tiALlFQP0v-nWxZ zIDv~saP__Kdq4j;x~9v$Wxw}+=BIy}r#jXe|=4>v0?Xx+3^E6HG5SM@SQZBpcZthbX&*9k@ zKaC5HUym&v;+D^Sn18!!J0NU3?_ys5^vAG%(pcPn?I=X|quhEx$>PMbF5-pHJef~_ zj4CTAO)sI(gq2*0)ntY?1T(Zf`SM_Xy+#2pp1y20!oH^W@`*!+bLfg*qf(TNp;F8 zZg`k?-PCN|Fv+$VVTu8r5V`T@+uctp+K>%XaMFpJ>296o@LhKkn}%~wJ(+5_M7eQ> znQfa%jj?af9KAZSR4M%=qixMlp-v6m&IB3*RnyQLR+vOI;B%5JLC7ZQQ9u>-k`M~e zgcKQq2Fno8TEDSm4UqzAKkJc3IF!nfMyi0f2c{|eA_xS-+YxD@A(o?-gnS>Hzjpb) z=wKvDLJoZLl)}12%EzGQ&f$4QX7oh|z$U+cMTtb$u0bE&@%Uam~kY!+|_nMQhYZ(|uE8*)| zV~sVIvPOD$#8uQ@*CTeKCssqa8pIJetb^AqL$}NtyfL-cCi#;0*U#S~oM}o>(a* zH^^UFT5{j1qmMqC<>e(`<*{iR_a0MKzc!;tGWU@hrHVSp>-Bnm&auZF%f#e_&ruNz z6!mTXK|S|9BEfttts*g(W&i&DZdm{1CqIRzNnAeyUANqNtDE9aPD~;(aQf+|<`oO!1Uwr%Hze;5HQ9vM34MQ`K>zUPgcknZ62 ze|Zmg)-b(kE3f_TALb=b-pu^2{Y-9q0Z%!3BhB0XlF#3Hh_yO}mw)qH__kM{%Hf-L zFtzO&Jo%gxncM#BT-&{fw|@V(@woLvZr^X5^up(I!ukpR^e^AXJvE$s_Vf6zxBd{% zJ9&X!H+(JwtfP3rtKZCbz3u|~x86>3)ag9={L_&`Kg}iA8Om6X90_1Yq}doQ1q*gW zELT1+2>BZ|s9}Jb0^y5mPwr<4Z6nKAs|UjwSpR2;Q_lJibKmb-7djXUnz&eEW!EaB+s4v#-=3&$S2i9NU9%%Pn- zIQf_@#NL2=7WQz|wo_=5Fdy&^(Y4{1!>=$>GihnVJ6 z0Kv%S@UbANWtbGa&Ec@3bf{yfU#o!R|4=AGfk1{;_`K$&d)qWbNja$$^ZwY7{FCvkZg97}S0DEm;_hwlu^;6@!Ik);B{&FR;leumVv4p`~yV zKmfZ}=pv>{t2}4Eb;(11ATkWp5L~$*U;V%>`x*s~8DNsZv)$V;-|{?;HP%>Prj4H6 z*U84$N+GPI5Z+5UZCjw-imZ8_Y@?BjB08A3_PXo&?B_nuvo3lDciefqr{22|UjcAr zgzaCtpK$&YkQ^bDQo>h*Tkd<5&Gzj(9E_ZP`soP4eR$sSj(_pUo>2slN3x8-l1J5y z;E5Zow-Nt<0f^*PcB@hJ&*hA~m^?jh&t^#`Ge=eX5FB zc>AFU1Ol2g-%Gf%7pHGs0)~0C**WK&<0*?%Q(>|Xdvh=t z`09D1RSvy>qkGIFw4ORjEj<7H^F}F#Pj=J$&wS>xQTpKL0XXL9qkY_ud+cLZOwY~y z9@w{kzt`XEEu*R}MDkS%C%TyWDxIjdeyk4BMzAeEU*ZykrfEj-_JmPip3XJbT+QG8 z&0mcooG#?)&v+)spLi0Q61vJ?VR3N*3E&ZmA%F>%kKtR(Z2|()0xZPt-v|K96lsj*omcZufBAP@amRon3eD0S`wr`Uo?rDAm|t9EJ^&L_(ChKF z)Oj!ecE00HZ{S4KjR9*E5H@VNh*v!SSnhfMAM@LPcO|Dj^OgL>_dbVnAODei0j%kB zp2drveF439|1W;?9oNvD`Q7~d4?Lb1zxWAE%)XLyrh2^h7k-g{omm-qmiwKokU*i9+@v zYCmWA*o5|f@;SPufIKe&5H-|4YeWPIaRru;qt8S!1#@7K%@bqD{#Sx&<6+<_WeAp6 zbhG5%P&gbYB4rTF5~)c<1fK`B z1ZJp$1G4Oig{ePuX*LosqF^MCp^i_Xk&wHt+$fg!YT&DwYN zz}`|t09}EDVgLrHZ;-IkN6Wr~EkqLTU-FRi6@_;0@_nam$}gsf0zrTXvT{EH2rFZ- zRUT!nBo{#J(G${juY1G{Fdp5yKfg)EMc|8)8TVFLTe}&E@#vS``$lddFMx0FdyY-k z))8#&F;l=GN5KkNmY^^mPRS7-SVu})8-{yFwVD|Ypb+vwkFZj;QIyk1IPJ7kc*VrQm(bh}7h`*`~O0n;-xY}~W~ zHKmkDQO0bTo*aCvS{*I>N{N?{R|vfG&bvIN?Uk>5rF%q;(hU8xzA7FdV);2Ucma=& z_H;o_>i<5fnn%QB=#n8!ToZv6McM^vs$riKPB`9uxvu#9l^$_40&Hti4!uMHv-Z8q zKym@r9Lo_*-Zns#hy$k($tx9SP?V$GLz|kI!Hl7rsO#GO!|u7~9=}#*>T{CE>Cab! zfZ%-$5&>yfYQ|RjWCE#fJUZ_=&v`Z@Q*lpM-M4R#L#-FR_(kr^wc`6Ft5alKpW7lw zG^M8YYkb#T_poc%9*#ct7>89)e)1D}{m9EpRo$$ z5y{V$Mj(Ip0Mx+zy|n;o-`>4$93On1GU!2Qs>)Zke8Zc*g|i>?n2{m=2l>RuKgy1~ z@8SF>UC0xk^b}tSQnT6r!2<^XTLrMdg7}t@0TzlXVAet`B(yYjq1PL6g$sDXg-=FA ze5^5hx`mwPx_{pR|C?ODVLkbn-(y!@c{Ts=_y5e|{32U6ZK6q4ySiYKCf{7LlHnqP zB}grZvm8TUUNkRw1bkz7UPb$V*=ISh|&P+$oWdy#G#Swrpd|@+f!rk{dX% z@!5RWo1aSksXyVJSFGp7Z+Qb3oV9_%Dt2D^N&fnuFJs+PU&=Q>dn>(qJtu6MAcZdT zcYT6O-u-TF+ykdP`4znOCFgL>Kl~LRx_LK>cpHOzF5$0xXY<12gdzx_EHB)`yZ_-Y zx#Qy>VCOz%cISXZLb~xBUC-shlVq^ZDM}!KJK~uE|8MhPU6&~x}1K@ET^2Xm4kQPf(&|W zJL*`Fnu;M?Hf+HbdsKa6_x=HgdcuGXOSPg7dm4uqjS0ghp_U_xh?JqkM`R7+FeA2U zs4HGo4*vi@-bN0I$jU>dCNL1l@T&A<9;Iba7KLBW26BWGq((ie7Beh0etw zmVq!3LaxkMn}XWjn;DKlHiXapLO}d*evr_77T9Wtpyu_&DD8t1*h&6A zU<8Zg0K`B$zx{b^x>9=x)OCYL)tP#U5`ACj6vWseX`)yKm-F=aJ>XstjgpdOgWH5@ zi5U*CCc7OZ)eiU$?mf)%{zax|Hbc{g&NR?Kj%*X7l}Ub&k+qW2B6+|1_QAiC0%D2< zVI?8P5CgI&0|MmsM8N`BqFqJO+LYi2fkr0KLLNoT>-Pc*khfu_7#UtYbU^XovKH`5 z?u%)Y`?sNX` z$A3>`EkrRuR>5j(KoeL(R!6m4<;NawNeIMT?jofl(yY;~ZjKd+qfek=4}6SNc;`B!jS9Zn=HrDfKE( z6C17Q=aD|62o_&`@43%?wx^)oz5O1KcoK4YV_0j3Avj?2#bts=OBIwkJuY-Q)J@}& zI8S}blRfQiEplk)>|>P3|QLdk=CQkf@a7hYk^f8RVT1=ET<_703k1aEHs?jMseoeBcX-<0#xeIxmnn;@G0`cdMqmMp@qmJ6f=P$pU zE3f!`j^M-Zm(~#8=L#QtQA7unO;fXB<0elDoI5Cw zt)qyzn{T<9pZU)}>E`vZva zPH}U`8c^R9Z{bpYNmLH)v|GQL*-*oZNEnIr#R^IXhujiF}ORl@S!?R!W0{WL< z&Rw_Nz+J;xUi|orc>MmW_*VfYPZ)*rJ%gp~f6pbmPveZ!XW4(vCEO&><9lBDGWIXc zbM^EEyzqHvaQk)FbL|(dXVY2d@yyq}fxGU$aRjiIxo8Bio^$RFKCMd_0LE4C`crP{ zHk|bOpC+6X!32Q$z1Q*ge|r-fww=g#|JNVp+2v_z`0Y3EMyEy0chNe2mA}%!S=WwsX)W%J0|IlUp&W#`EtY^HI$33wC!Nu~8 z{M$QjBULB!h9CGAp8n)>=^nm{-}%>TsS{&;jT8)2cyI{>SZlDp_Heru?yW#3;}Y8U zCS*upK>o69tD>)b8weQEes<-2Xd?^m*I&UuXS9k~8_LWo^re>fOCSb_@!r4u3kEI2 z3mECh(YD|Wk+lFTZ!H@B)&iLKuYJ&yT(_Z!+M4HE3AhZv1l5ouvKj|8_~(UEgxRSM zvz@@s19M23P2ih`Xlb;+;PhjU<}*Q=Uzq2FbtTV#!dYB!%tm^HKJ*qi{-|R(@3doh z%yCo9bYW^**mLup9J6_X>8XNdSb6S0jZpU+Qd6)r3@i+leu4(ULP1sc&=4?*)Jdr| zQLCXQc~v6CuYVNJxlc_(f~^l|R&moBT11Sb6B{FdHZ89SOgh0scs#$&w0YC0r!?O9N zs03nB`1y)|*})KpwHUZ!j{kevz| z0~3r@QdY~ykAY=4_<(6Vifd({h=NLszE|KC25M_l6BURG8bR{>uXw;bFr?80YKSH< zT@(3)C;&!**u5V@O#%-jG1kB&R!6}I52$vzZ4}W4bO_dfHhEkHXaU~0?&?t9{5iW% zJR$;;_aec!CTq^{GS*m+Y>sIlt5!KSK(p72*vdI5t0jb0Y0$O;t+WCifYo4jMEx~r z&BLu2LL2FGe<_4ntIx@cl>{#__?8gF0T5;*0B|FhefD#_?4>VZ*Y4dEvG8_A-coL+ z{_1af6-C))er}GFPCC(7jT=SmaP0^jSW<^VWm)>_fFrQPKJRA{B8B%ivfS&9`g4P)kiGB)&m*P8^3u{M66Z<2 z(%T0=_#yYr+PZbKe?Au+xJ0kJT{va^`gL4;&9xkN+;Lp=tc%!xVE^d-^^`Nyem;N} z?)Q{If~V@C>ifw4Nq+9A~g9C@6@Ynfs4x!wi>Xw^t9RbK& zc-hNe27*UnZQZ(!XN~6N_S-mmm9KpHD0=FXG<6zzab4u*=bstfV^!^GkZwl5 ze*LRF9r4hiInF%mbh;B0?wtjU#&9dUcJ1aBqj999+#q3%hYuh0_Ufu)I56f9FHm_JWb(FdyzvI!cgep}4Hh_R%Pb)X zDM!@1M{BJFi5Osc70HS2gnOeUGqA+6HW;ADim$xU`Z9k*04zf>n_%6hW00AWN!!Kg zPdS-0PToRU9mkU|x`^)48=07$<)otvws(!gyKm+_fBLsvH9VGd?&EmN87I?Y2ZP-= z@S%7AG4K4uPL?)2ljptU1q=oaYCtn!xICaXV{qVd{`?Pbk!Pkcr6=m0XW3 zMV9ZpiA(?N*LnBN%akYI!MAMsZ@l!J)7V=Hr#<;7KKpln&NX)~Vz}td9im6z>=1~e zWMPJfI4&>t*|&2i2T$G1NoSrt0%yl?#}#+6M%pkK00^)8zMtY%k6X_tfA_!ek-K`F zC6S^svd~mw$p|4(_m|k;hvRL6Qj9DFJX{dAvwPP)EF3)W8*mxNplm&p-uPsEEMD|O~bun>J7atdMl6|FTFZ|jmAQ4@d!vE^mK z4KO=llIh7wj^4bEh2=i}kCPY_#@yareDcHp&iSXG%wS=XC!c;IC(o8l3M|)&w7kSQ zCvN5Gk2{em4pVd^RlUTz^%Km@PD3&V{fgy_ZS`T0My3`4LSuCDFFnb(;?VUg>Ov2ch+vGS0X@3Xw3 zj}dZ+bqGRA*4B|joHJ|-`1^d%r8a^p12({;w!~V~%Pd47t@2zmZTGj3&DBPa8K#EU z=kuiq5m$zBMTp*ql%b0SRsm!|9MI%N1&Wv-mU9TV3f4wSLO`(mAC{q?DgsE3c+2ya zBdV+g$|IxiBV4*=Q19%KYysr-k ziBvPVYFHJH2rcLrKrvEI4VjfY6t?c0PA`I z+SN$Cm;#EB+GxgBDu4q%1j8l5SYtifWxfk@r;L#>U%-%y2EHC%?599s_R|v`d5cyZ~m4yh>Jw=N340@Q}|7Kw$;` z%#@$A{qsp%kd(cqNV(3^-*+759JTEz-tflP(KL-mI2}B2(2ebHxc(+4Ca0K~=(Ls_ zBC-a+ib_tk%)qQD+7%wn%#Y<1PejDqjB(|cU>2^998s%pT|ExF+>i2uT zQs8J6M_%!YSNJtw5s6; z`N&5;!ZV)n3|>A;PX&B+%ImJX-p%+&u+#555%CDU;h^G;Z+L^JWrh$OdR~3?HJ%=N z&-NYs%RAo1b4MwOZ+g=kJtA;vY0+0D{QTut_?!&unt%M~e;H+IUCe8~=~douMA$yM z_pZ6-8bt7W`n<=VHyYQi+ zJKqLiie;K(cz}+#f5zF5$=4J#nFGq}uKfbND%)nLv>o-mWRws6`g)i{Vzxhk9xUELC=BVd> z7Z*JfuK$mlbjLh(=W5=)cOQ4%Q}N`dN3IN)%N{u9; zX@Gt})JVY8h0o$UUiK`u&D1OnI%rDtDkDgssg{{LyhN3ty8SA?Fv{u+JH;RqQ?0W-92fXKEBUcoEQ59UGf(E@zxXTs)faZrpI%Qd3KN@-)dWeHdgPe$_BBOnsi zgr>J!kv5{Fg)$j5ndPXAEb;RIGhhWONXX&F`HQ!p!0Kq1e9YT0R%3IQ34w^@^IS%b z`~W%90V|N}&QU0^=8Rab&0%lP5OTDZwPQ7aY}jb3Snjuwp+pc2SqruVFChRKu&8OS zQy}*_gaUy!k35Q@+Mo_T3W7kCfMp2bP5X_P|?J&zXJI6K8m zP6)=$x> zuztfP`n`(&fj-l-v&awzixmeCB@WJ49A2t8Fuz1?k*ZGADgRm$O6p_`>x3abre>9y zqX99e0wRi921u%?X*OZ4@YPGqRvsQ5E+sEHrye2uswrd$n7ykCL=*wQh(!Q|lxji| z9ULaL_Fhk#*8F;iK%<(E2i$YZEQc@)QaF$S)qLS0_|`CJqq*{z6BMPfgo@^e&lPV6 zungH&0FTJq>3bDxH_yDxvHmQFW%Mn>5+QkJ{hyQC*F!lF& zg&*&y&zrP{ybh9@@q%U_(O`gr0+t}vpna0| z5FHX|as*ad>#?Sl@0W+)_pL2Q%3w{pJqTH3KO9fBy8VtjS#}SmE+GU!-1lg1ex5)0 zzi;z%`-6cWS50i+v2*01^LCFUDvC(2*LQPoGi$w(YTzG7perDNIP94TGj81eTfg-8p3WFU z@Ti#)2*D#rCMLYCzaOnm*SI-*1~$QcBl)vG`wNF3WmzyeI(JxAyki7LrY9$T%!T_u z3V?rZFc|VLBPf!RVrmYD5OV5d*FD4jd{pPCuee8+rV(WLcRuvNk01e5jk>BFK8)J( zc`nOb#~M2fTM3{uNM*@QH{HzLciqi$Z`m`F5HK^3dK!6-@%z93`yQP$GR^m>w?BT{ z+Zgovot}mjuHG)IFisK*u@gIAiM|BZGU~Ybne|`769Y~EJB%^Db zS1YW&zuEjBgbcuRRwefWm!15+_QU+r<|IZrvwhFAv4o6EG;c% z53kZ;=fA!G18mr^anz?N78e)Yd(8|wU5A1mxwd1+P6t|Ge%+Urd#IXUcQf4k>Yx7Q z9lqk=)a0Z?u3m3IYHAhNf~f@{9;1&%s; z8|Po}g!Z`@%kbMJ2(;M_{x1K0-g?W;TzAct#3E33I{7=#YFP_0Rgvr32aE5&jLDy=W&o9e=iLQUbvhfE>*DjR3F$MbV)X3KkCk2Z`TXJpQy9e&g5PhMoBue(uzb zltmzDLATo(6|yS6FuK^E8HJ&~<|(s$^w_ zi2b8@!Rw#TxkpWnpwTTn?kP`WUGHx84A%4HH~cuyoA@k$|Bg>^*F41TD2nVSzK_>l zd^Wdy_+9Kd`gERm!l~@K^>e)IBiHlPH$0vn_}*{gUDr0e@>{=|;hmr6+RuIlDLPC~ zuVeGJW9iOzShry-N3Gk>;`A0yx$q@C@3dL|>K{H#_uLn8bVs=L?pw$3>S2;)@S`Y# zfB|y-FX53X;!Jusl}r`a#X>_k3+t z>haEepT7jfq zC)q0jGe9svLPShk0EMiWU!^ZVW2p`A&&m;8ZU1}>O{3nXN$~knO>IBOZJR-m44wqnN~&dsZ7c9E z!xD8UXDi-d?Ju_~i6$GO5{~#1lB3d407C)<3m~}snj$`*hysw3`op2H@^=IHSp31O zh`H_rLVN9EDBEA#Gy^5G?784Z{RwTOnuL__Up2cKN=}wj%pEw4N+2CxAaYJ4XgpHF>S!XVF9CpMUb4T zp@0BNzBc4K0aFw}h?vo$3lO(LBN3lm6DL+FA;Fj@J6uKks<;d29_gT+Zix*%n~W&#;7iwI*q zDl~>yE+bR<>{T_ug@DRhgN6Wxf+oxw0yU<6WK_gz-wzE~LM#E6>#2am!>zT?fUVYg zB(~n9YZd&!QKhLHUs2FhkN|<;a13Z8c`_Utowtu{K<<6&j0$RG?^Peq?p?b{ zxj(Up4n0MHAPypHZ*M~(oyf-CC26+xjx#9Y2M}Y7B9#yqr;|2$2nv}X}a@Gni%l@;LG-q}M ziYV>hL|s+Bz2>Sb*t>fN>(J{yq|fMZ--DtWdDJE?EAz%@Au5i6qtfV1oPu5 z8JZFfuwuXf@xSMQi23KLYUusM@N;7jjQmUsC=f&tz7YVHRV>UOVAp{q)H*;P*F7KL zUoP3m`d2-hZ~4ieq6r<+-PdrXDN6@-b9it9&-~sW<9QS7Y3{s~k9^=CnLFh>d^ya8 z;Sks0YCd=Q`#J0Qi}~IkJCV8`aOl8x_AXR>?BiGQ_-!xX`@icuSx&-^-Mg7v>{F$K z?B9QgexFvu5%js~`a9{JF~ukEzKi|ISfdkO$Pawa^EmU^f_@!&(NFy>Cyd(toqu=_ zfA-#^_}1rL%nv;7`E<&fPmGq-{KUr=xcDbt%L}(9KK`-KbJu*Iqo4Lz&OCV&%e!_n zee5}0{MrlXGT`P9?&Nnq_$U1Bi9g0SKjW3W_2~sRypealb7atdSHsk47x3CQeJdB8 zyq?2*hrIAL-^+#Pevm)dkJnHuV?7Kq3>D-5 zXYW72Wl7Gve*E)RbNA5 z1VD|p5F8_!2jSSf!(QM2T8hlVh356RDW5lS+}|As;t=Lm>n)H*+uuWvZDe_jKT)V; ziUNSRVK(`7C9D~WmE|D4_<9922z7rNR+z`-I*Tkw00+UO9+!v^OAT58Lv7@fB3;>5 zLNP)b*!O$;OvV$U!bZ9}$YzGzAnh%A7J)5G11N`wN06@X6y z$x?ZE17tbeqR)*~Gsy;-DUsBZ1nV8tlxcYy6CnsRAY|9))S0}!J%sRe8T&>*#GaZ(KF zGk7;mfq<8We3X|-pk>gRX)}6^8IiD^JLiPg1%NAG%wThHub+Y9JApa;o+gOQ6xC_t4<3aczof#GDc>LOK8 z0$3nugkV^k%;W%5P;3IPHrd!51067n8OUN$fUGjwnMOo{12nk~FQP#4z@hA;4LB3a zv_k-MaNYV0Vx^d`Jx^Q&JUz8YcgM0ImTN4uol@T~NgFI3A>%%_x{MxNf^nVCQs^KZ zLE1vP9ndv&eFpI)LIQLw>#Xx@>9E*A+(Kl)!YM@j{^`JhU4-AL<$AeZY@VQrVXQF* zgq2Hyk2f1l<$ia7N)nRRnH_0kVOphWGQ1us-dG9YDJ%j(sxQ(L16VR|uNELU7DKFajA!I3@8xGA%VO3Q>q0)?K zm*>wP`?heA1d@_3=^o6a6ogh++wlJEcDhJil~sSGTcCanv$Pm{nhQUVz7$k~%`1OxTuvhnP-iwbMRh*!75RI5;>W5!v3^;knOw77smeKi95aVSU}f z{V6MPu{~WkQ*HFbfq>AafH*=DLN#DS+NVMF`k6DXfEg3SWn6U>tNg9Y5yUtF44XeF zrLq~s_b*b*?6bjIGFN@z&nWCJ7Ye@I%JSg;L`nh%y z1|EInKDsV&_SAXC6tK|IZ=K~GZ+VdWA5Gk|*YVZ|E^_T?V3ZExHiIea%@M>nQU4D% ziqe6|G!hv@@Mz?Tg1og{W`oHf)98~G(8`a0v))V%821Gk#|(n`$ZIzBP7^p)2vnIh zRlJ^pfa*9s#7E6x0TSFkq>Knjz?o0(8`a*gIwqVQma<`b9$6g*#3&8v+UZcpOr!v6 zqXWTSpGzk4^*3-vl9hQj(X1oMQf9ry1%jffNEgi;T!A5t{=m<^Vr1!njfpO1`n-r0 z&#qVj1_DwTR-17Egnqfq4HJ{hip${Ol1pt=}Z%`We;J1;%2;2 z0xtjSLhdkZR%>FpmlxT0q4-$z^xc9nmwm!Z>25zqclI_c-URUs!WQTPbD-HMWe#8skTxLNbS_(J zeWB`0K#7RtDOiLMAtfk)t;vX`oC+p7*6hcUK!_{~kkbQQky8qUvfNVL4>QogJFQiM zB#I$eSYTmEkR>90Wh@~e9Rzv&Ts(0gbHsE#)i0z9)=5c_5|FlI&X|FxaUYH@p?i-p z99*922`Hhk9<5tKzl6ok)Q%$d5DN2T93idHagFMb*@>}-Zb?|4MY~f3IR&yc9cPF= z#14}Jj$-^qE)MLzuZy_n(yysVne6}hu~-S)`1L7|zrSMqzbT@b&23J-b^v;f=@Did z&_uwF*`ZVzuoRF>2{i0W&Hi%62D7pCNC#aZ=RXVCeI-v(nM}<8`rrJ!T-&=wpF8q1 z`-ZxIF6(MbUB4D_FozS0`*w#Kp6%JFv@~^_Pc3kD%r~>H zFH&tjfMf5I{O3Q98_%ETCx7avkq~OKBT~;_ zJ$Jc2zrzYRSW1=g0r+VP6r=ryNk(BJX#%qf;Knd9x|Ul@x-NrLrn!wajESAyQ#|jv z&*$mScm_A!eDfsHJ2=?qu}2=|f&1_0UGI21SFc_o6x#{I2q7nGlG|z}DO!kq=PZ5? z>Txit_@MUFzH}iHCiO)sZU)BT!QsS~9L6l~TTbBLlFhIwNrHuyruqEUWXwcT!&FNG zVdWQiPhmgE9OPn-+w2s|7B)nqU?Q-eipW(m!l~Y=kB>z>$FesAK9QJCP=4 z53fudyuwa=D48h|1L}ZJ0UJadG)N~VP>G6zYshQ_C!0#*rs~Ly`vU^zrt*S+_U zXa@IGB?B|wy=(mf%DR~?dMG^f5Xo1X)a&7%wrc1xU%Yb_}U?dn}O9vbL_Dw5$L)s zC0q}NNluI#QerHPgD7DFP1FP}?3ow>X-E_J(sv!>IA+$336>0uGKwV#nO2|gui(-| zj4**B4m#1M13J4+`T|yDU?m%?3qeA;J`q##IBJq^Fo97MK=ED*`Mp3gK#Mfi8(luC zD-cYOP^sHOrfuhI+o6~no)_8RSW+5e#t$q%ygiMFV2qZq5jvrO9>S26XhxI>7D!mx zIdM;c%v$mY?VMg&?khzF_s)P~P@kljm`eu2l9Km<+z?ZY#bmbYUU0Dh%N5*>U6-#P z!I^{vBm;`$h?>!t@3gA>Im9eSEQ~$Oyc$NMuj0k zvK`i|CHKGW9&V9+PQ?zkK$f+UZPwQ&sB{g(6UWb;J@1NYLUx)*-e4 zi8ba`6=TF?L>RC%V5!tg@wf{SiK!Ty8<0wU0oCHwB?g*GeTC(g2CxmJ4U!T>gAgzU z!DWqtYgnKw9p?^AAk0(xi}V&Po#D*#5Jq6YG$GbwqL?sE6^S*(25dY)*8AAO74&eA zFm4dbqqdS1G$CVxv7Cdk$0Ss5E>%+6xStoAjR&DyfkIe-b%sPm#F>F0ae;r~py`+e z1wb_XKbD2fD8*RAiZnzeuTtdCN&>1RzlMgi&mu!G{$CU;ZGw|ZFntn0RxQ8Ipq39* zRR&V{za1Nw6Zh4G6N{Ler`I}6YMr9<4`}-r@ycz3>WH{(P&bH;73n~!y*dRQ!Q7`a z6+o}}U|DK@iwp>D8wK=z1D3i>3FeG_+V{t@k>^$t!C#0w3f9lIY%B5g8W2q8XinLl z0|stz4Q^CUWxblhd{9-4V5QzrXz@=hUv4p-UvrUqAD&3vmX-~M9S5aBfGT1Y2mLb> zSgMC7W>kCH`L*+Q60OnzYk)x9rhplUb;4S}sK{bnCD)aw znXg<1Rs)N^pF);G5UlvMjT4Zy;jZ_*gS+4TP7F{>rLX3Rmoj<9d0X35p|sya2+%u| zGVixD!_*RKNTkVoDkpVMGQ!Xi+&tgN``0lMe}<%}2`OdMeF-CJR7R9e$t5E zFn*Jl>k`8DA>uR%FM5oZl&RGQmEoVQ4U;+ORFLyHA7Sw2>eXmF{yQHHno)gyTk1@i zGPQeaZ9>{?zp4RYkh(8whWH9@5`Xg885pw?XlA-ub*-P4Rc=`GAXW3vgIZf(z#KFS zhL@Cd?tV%XnV3o4qGL4-QzFP_bA(vn^zIhVdDUq zPrvg{Hc2@=TC<3Or`>WRH=jLX++1YqRL|~CM=!>?Gv`qaT)T1vLq{6n(*EZEOvU-ekY7u19ks>Xdd;8ES$Q8t|C%wN^E! zVQ2lkR7vIpen6ovgC!*uwwkH7;A{rR%4nWT3Dvw^pXF|WQ0|d{n&!Vrj~VF{@DaH- zqfM1Q_9PwX3TQTt8$4_v##qt`1&SQtI7x*w&s-i=^sRZHLcq|rg^#&aic#(#TsBy- z6QRiVaH*C1N#zkWXPyBzQ*0kEbz@_W${Gy_2n<#>l@qg_aUdX0o~Mg5lsn(}w500kBF!p$Q&-G-rFgw`C4s&1I9m zk8@D0u2rwBuU{EqAQY{1Nl4Tu(1g*ISk#o|MZ zc(79GQdS^Kq2T8MZQYi6!wmQFnGKWr%Xwf|2q2*TLm0r*>XK4{ zHh~1R?X2MY<(2DflQKU&6-cmx4JtyAvfrgnQ-8oKgaS5Lks1ae6?U7L;4CfEFas9@ z!zM9|hlF(~)Y*|3d-@<;-rwV%2k+;_&v_O%pWfn`7fx{|Whvh2GdFP4ozLXzV-K?$ z4(Vjg2R-Lb`pvsxeUWpwou4|K!~Tke^c-9~V5{3&=i2vy-sdjErN-G1C%rvd$zgHa5e0Vp9#nCQJA%6`5I&tAWOp zrujk2!x~6d!6_?vf&&=Z8c(W15JZJgm_6%ZMARE9MyU2t4r0|rKp%}QC5`zrS^zOC z=8~qyXk%#*M1nXF34%CFtIUgK03si!nc>W$R>ByZAr*2%LxWMUR zO9g)waoJ+B+$d0O^a&$|%OxXfi6{Xni={~=9CaXX()=cGjY3CqFgDiXNHj?6f%Ub4$A0B8E}VIkt=kma zz6$*oi(J(9#)2306$mo%v*fGq4y(R0jmD z9j0U%z)1n?5<)^)7eABZ36TLpNh@@}FBKpZkSu`cQyljzb0$_@hBn6+<}9Gb za9`{5=X&`KTm;dIqExEQy!}+}LmR->kT$4okdO!@Bx?Cca^S&b!Tww;zYAJeK?*t+ z@G4;#z8k@;VSamPguO3hvSlCCnOJRV_3XVcFLMA(s{GA8LvtI`K|2KT=dD$?j?6t( zeXh+>B_BvCKzNxwZwd+l^9G@m_cKsVj!j*xOMk7!uqH{|s;?KI4cn7>vH5&XWW9AA zsLI?=s*%>wUb|UsdB3c^Zqf{7OARzaPVD2(07z;7w)@%u9Dc6>NZsKU%Cc6TI3Gl) zaG8~fPywuDhA3Fe1jVSO+LTmWR4_5H3M!guwU7Wzs`^7nl-26JZrQR#ax!^kL;=pC zk|Hr=ri#hI1(pXYafVV=d>E8ARv-kczND&5vx{jvQA*oS%67|up>NAWaV*m;Hi^Xy#Q#Djwr69#Tf5?NttQH8^hCZM!`KMKtt}oqT=B-Yzl(Io)42J} zX+G*D&*i}fAHlkQit4@RuJ`cb7e1F|NZj$X3tWBRZKw!~t#ce*-J?@seY9a*!Lr}s z(&3uN_69C)A{P%54_{reHyF#^o-`^digghkjceBqv5@_LHbd6qOK?CAFd>AFVcZny zT*qdLq3+oXoAMA#&cd1|Ofa?H@E6eGG+6-xbX+8)aFwG6sQ@r`mINx{Dc7&Wrnvpd;QDP_df!M8l*CAXY$NK++oZF%0j}cY<`GkqCB} zM1&smL6oPgIC$j~H5@<_?I@7MlDuf48FrsJ5MM8)C?LOa7+7M>Ujdn|APQ{?v5iYIz;OS&_<9S=*~n^ zSoL)Uu<{f`W-<%@{Q>Xv8^;-ZH=d{_?majgoE1dsq(CfSRtuh(g|5m9k}HGF4dX}eb7&(w45Tc+X zKpEV1Bl&tU^FD;yud8e}1M{{aO}m@9FIi!88&WE)EX|WyV$` z2z!4R$b5OIubaMkwyCPWF`s{a4#$j#x#Hk8naC7>Pq>AH@}VH>Sez0 zQ$CWNal^YGJ!0J3=h6G_=0(rGlV}I54j*NsD;BcF!IeY0F_KmT`&U;iy3_3Mk34d5 zpKAj=wn{vDxaQhAkrrF*uSbp!H=H_s3X{mS!)vTmr<9R#OpM7g=o7QY)G!QFg3LH> z7&Os`4pS{mBuJ?MCV0Z25JUFF!p~zGi{Uz$C3F}eNCCW{3mx77>SB*!_530PBIcC2 zNb$IG;L1Ur2oj4)_>jG?BsAOzA(D_37qo=VFqwRXd2~}0azp|fiZ26SbP^^@!ygTLE7)21AO^h z7-(TQIc0ntGRP(la+ijy-@DZqG|MvG55r58fCdNYvI%GB-?i54RYE?u0%kcN1cYH6 zkzx>^l0wLya<6ynvRKH+7B(7b$M2uUk?!TMGO^3uYH)5-ZEPIHB@kWse z1cQ`;m!MXeR$@@@JxGX*h_2DiAz>U~Fm#iB9GDtZIYwGUh>PCSd@@)XW%7uyt_S*Z zpKJgrOf|#C0UHKv9MQC4*sQbJzDGod!tN}9cIbMv>yhOaVcbBM&CgkExe*7%1%xe- zep)VcK=H&X-hx6Z2KFl$kEY4e;j}-P7O-qtsRd~RtHbF$=;{botKwq@HYzUJ5RK4w zjta0H#V{xUX(RdY&IKSIh%=6u9HE*B3ngqdUSBA%K*9nVzen@^e4H|uyF8g9B>!Zk z4wqtNwv1S+^Cgt)QPL-g)UJ+{zsB`a0qx2#G2S;tsQv(rZcWV>*P;rcFc~!!qxC}w zBLRhw?*$KmsQx|bY{LpniQ?w%Btvy9K|6}L*C>jY%+5;nwb}btYAG~8fmTKhgChPTk2r-$?KTbRdCOza?acH>jQK#RCU8KQavk^7=+eB1gVlx_h=>J zaB$s*f(DEVgb_hz*V_*%;#Lk3-$%dK=f@E6`@|@vE{{T>`dtOdKCH2TSzUk-{rPX+ zHZ0dW5Rht7flKUbSe1%lA=?h9`6D!7m1SSNS3!zRN}_^Z&Z@&K-)EK$-zCPW{iB)+ zcvY`~%P~zAOImIh#RHWjg6WL0n3Jd{AnM@YXtE?ZJX}rh)jUD7Oy&9v;~Iz@9&JdY zzW)PQ*UR;Cy_}TZ@whqaRl*0*=(_`gKWe1ybcTijQ5iM@K-hbL z7k<$5*uVTRD;45u!{%_03p=N|{Llj|mS;Iy3->;{&&5OK+8B6r?~uLCFx81Ha$4&! zfCTnd2OJF>$e>8kqbr1nCzxoC)Xly}5(v&dD{?}BE_M?DcCIDnKt*QV#Nn4cEz|7VY5+u zw6Ker0W_wO_^VM`oWLX3X@RREg~ zv#|ov0KrYALA4xb5R8_-pO*=l5^vbdtE7D$h#`_R5lW*{kmo8Q`5s7?FpxTZHPJ$ zLPtne8dE)e?1*&8IG|D*k9`E(jCBnNY&MgJoemq)X2q~xWsp@$^EU_tD+c)rU5~|{ zZdgxXo^(CZEs>)P$Pyyb<@7(gEwC*JO9<}URoES*k|wyyQ(7V828Kt+@0TPDBXDt9R?_&T55G91#f`2cHalJfM#iZ>z8!%S+ zbpf7g$*Ev&JdbI;52VV1MLUM=EpPiZQzgxD^Eif=lu(GyO@0t!~x)oN~`b z2Z&pc%8l;T-4sTD0#=rshZ9vrK$!v_Hes~P{<{C#$}otYvF0;rv{{6(5u%iB6-gAC zEfvbBg_;8b#n9XL&7^<q^uVJMvg)-}z>y|5~6J;0d8X=Io(N|>2be&0Jw5>oL3 zlLjC+Tyj^=kwwG}`YroD5dy2tdP*sbQBVtL3LLGKMd+t%r=!3+dvOtzs4HxB1=$gh z0W20jEUCbiPkO|7w8AF#mk~N6tqoji7ZmA*AQ@1NLx+rz)>^KOG7Jiu2wfzIVQD0k zbW7BV)NCwie*qf?biE>NRuhmluGa;?jwMN}HewN=OGq51^O}-`sY2y8RQn*U&m3RFn#Q;a(txQd<-FNu0_7xZL)-@40ZE`s2n)m__TDf9cw)9z z1HF~b^9F0F9IeTGHtTkuw8{vPt^ggI>9vI7Q6@cNZRgq^-*$`Z7tkD26m3m06bBNCC5?`VQsokO&U)I7rjnCmz0ICi$~ZeF$Ok zzv(7cao2TKa;~*~Xjqf5*@9St;~?cg@Yg{M9kX0Gn9Mx3e02p?LJI^H0Hmr9JgspK zoK%UG(fDenBGL9_GeEisV#S-YGXHCEP!qb-^+*|{8Ey2Sn6g6MP6e=hu(sVdD;}YW zOUu->fNM(LZONe~or7!vi;)x~X6^7%KBukCd2MvJ^FbO0kxHl zu%t=kgJXSoD=V)s)9`0pm3_8hQ%&(c!3?l)%+$XZZC{~!E`=b?K|2@*LSeQ`3;bE- zPZ?!j!R8>SP?iJJx>_v~5nyI{(o8hIUm@>9JrAJ?7O+xNGAQj!O#RrZk|E|K>kuQ+ z)7*m~1I_P>e@7|{KTi%CrpB{1`)lR;9Z>ZHC~ZYC@5klA-jFI_3r%Q|x$HQ9M>Jt- z`F+ashGAecWY&G?IyyJTH!C1>u7jlLFxG2`V!Yo1Sl7$-a=n;OCyX?QAk2#zfCEt0 z+C5Z)wABYrepR&6;`;93qaUvCZpRp=`2h%JS-V?WOgcl64c5-SI?E}q)Y7Y|ZtCr( zpiN52Q<{Tzv@3&zP^BvpkBPRGqARb4+eoO=N$Mz12CCYILIEgT4q4U<0Z7frV=>$A zqYz_9R3$Q&q>zAsH%un*M~#UQWrtUJ$#b7eh{D4U+{+?F(*7Z*Vj!+ooZa2x+?g{x z_TVGje8&xwj(j^T=n;l>Li*D@ba9_+D`kvJuC0u#1MCl=EHLdD#GngE*Rh!%FiHXt zaL_|ciI(WXa(bW2gC@k70g$mY#?weFdj3#=j=t*{Mnf&j)g;hzoxJPC`E)(6^YRS>HHnWL+{4C4+Ye!tW5H?DIj$~2r*PsP0g~(Y2Uhl6eD(v zf^`vzfDJ{uX><~a5^=NBAQ9EE$d}9!KSYo2cRN=bB+-vrp8U{oMY}mk%NSYWKk&x(@ z0-9Lut?3ur#H|H_X3%HyY}iMnBZei`^=vj{Hbm`uqJa)0-7-rIE#-zGqhxSsGcc|< zY*s7AA*cL+vlugAuNVYF#=P$)MiN0n#}EQ04wMGsa>14jgu*aH5=3X81+avr&2+4! z0ZAJeH<@9zUL)%@k_J*5*k~fDKvI^b^zJ2tq0RS9ag$^>KsKy`_O&CF3=0r2GytUm z?p_%ZL!q^TgH}Sy;B4AV%rc7`q#Kc_5ELUJj9BQA6q{aRsPZGUVK#X3QXR;l@j?`B zjP;ALy)gpTFl7t}Bw#>f12obu3z(Gc5+HPt1_%p?3M?VS%9uErb2ZQMJtl^+G9ZpI zAAUb60Wa@lM}ZhZwSE{KY^sLOu`)nrDWyhR#3a{S_R-;<*ag7rko>HgYz2G`@xv|* zVrdv#f-}*AD#+YazNT0kRAAq<0cd6+HCE@LWq*^B5_Fvs1B@XM7tnP9vxT$OJqd0G zB38hqf?LO5SA3aB9Wc(jbWA&6iV?ZsgSjHHEO)hqp;hL9IJOIQKrS}F)xHnzF=@WC z)vzS|P-1hBQ9Yi_)1%8X#mLGCfi`I}M7K?m5+>wE==B_+iiv@g`kQmz^aD*&XO$b%f@HceY-~0VvV5=Qk8+~aXQEA^*UQ? zq%tUPQhk|4CR2Ebblq6)6Dtaiarzq=kyP$I#buoD&j8l-a=l!a3@UcAOhRO~esu`| zp@RKRX{9!YXCzp0l6Dz=*H)I*8g>>0-GY!#NFW4hH2C$ezxKN8eg+Jw2_Vh#7|Js6 zbxu47g0o>NEw%2SR4u&J`b30O#Mps)oGB^okp)5t88WOB%=O@8up#-=(MM**CI-d! z))otlMez!95G$oD%UdiLnQ^jNapC+fFL>tDc+1=0O{C-Y(@UOv%Z=P|%WYh`a+Sxf zT;uHdbL<^nJbv32?^!`?-%-TM$b%QFmdhpPu8S67KWja)ifvA;1kDYFKW2!kdD zGfd!Uy~->qeAFpT)b&_&`ivt1f#Mk@Av(}f{a#ctm^$%{i6LzY2tt;Fm9$1blfy9P z4txLyfPyz5tA|7NWD14lR_M*a0+fbhYo%%AQSUDHpn)_dtVq({VTP&A(zDo9B zDn3<)d&5cNxh8ZHa^s>jibCZQWLq0;n6#dv_w0hyuwb<*B@ilATmmB5klZYl z2EG=cD-nRcTNMAWlqv3wk*Nglh=}iHPNeL+d>*0{)Gixz8~OXWh&@TH$bADLbd4-0 zp^T^s1WHPzuybmQ_5L35=mK%;6cJ!NLel~C+k~x{88vZ$O$NI{Vb8>2a$09|?SSom2^QJAy2tw95~=U$ws$5VZfaC+E$9}D=^98BLLh^s zDa#4R&6;7gp1|d%|5E(Xw2sPJD1gbB*=c~uP$>N|1A{Q&j zmVKKTR#=(R<_KM{={6hEdLV3XqXzxC8<3Pp7ayhvqBG+tB^l0$Fqc<3dn5=EFbASj zF^>&OP{CUBZYzvLjg1$f7CWIM95Av@^Y?l|@d?^swglP2EV_KpS#Pb(sxYApRAy26 z0uCPN2*Fb+*IAky-E7-%GiewKcw9g(&ELB=oCL;_1Ui681;fOOk5~6NP?K**jsdT% znI)(gj@i*JQy#yZxI%nNJv?i16K!oz0>Ab$t6Qu&uasbb41{7O`H}(L*Gv-7cvaD! z-^S40l=|gOb=$QASeaUFDjr^41qKvFa3CnxUGL%4NVmXTs>oAUgzUl8Po3phSU0g@ zlKWo(!v{bFE3%}TL(7DJHd)VoQgaHN zt-*}ta*IWbSlQpCRsw*Oq?HlV22h0h^HJ}k>U%W{{;pOV?lYxW3A)M5b?Z8!gaW)& zzpe%tDJl*tp(hHO?~B-#wyso+rOuFz#S^G%1+Pjvau<3+6c8!(!bx zCfYFvbL$3hDPIP#TCf)@pju{fCrxE=cfd4FNrYjlX8>Vp$1Osbn30&}fF14VyF^Mo z9=xDN?fZaBbMrKL*={&mtr=5tu-HL1-`B=YMhFGe>bi&(;zBB)9fp!zxEZE%dvI`w zpKB1e2PuGQJ=bn6U~TWy<1f&PI*l37Tq{$;a4wA%jZezZ4GYDmd zKXiw2$e?Jj46@XQ;dH!iYU!m&rK;zLcRI`^b7^XPjcRDpsX<{dfjg>pOmKmb(ug3b!u4q-SX zjL>1M4%QrvYj)3UvmO&$r%rS6fk)ZD=V3$xX}#gjTW{ygg_|cC<5jM4Y5$P@{T2Q8 zHj94Aa(j!NQ-Tfox2EetVV4=>W@NQKByC1~^cbxJ(kh0tGBh}ApaLc4YNJpcJ%S~U zu3eqL@FfsZg2e*qR=HwLWl|W|*!l<^iWk-}kcMHp)*)`QPJz?6+>Q(z4lX^C8>a5d z(=ZG$tL%aTxKT#sX%nUb2-=vg`(I}?(K?ejN==BxSU+uwbUlDZNEC3%PeKQT0zOsQ zku(4nM37jM9SNY)q)~2)QFaEVL<-ZAv8Iz)k$@G6prv8Ph*GeCKn1TP7C<9Gpv3el z(7%^V8l3}KE*UDnP0kpgrZWojGJA#vPAbB0zEXW^{C*gUIkEy79L7eFG)=~kS4Yca zv+K~-1qAAVn9cQlKCk{h*ZQn3pVckcY`&Dg)eq~bE-{u)YY0vYX)d${a zWqD;@m2Qng0msdh(=p(bRVKLuSQS00p9KgFxF$s0;=zo`;vop-m`k!^ z0CSL*wiIUQiAL;F|N8R?w}SKQrXVe_ke~U3Cj1y;h*@SDyJ;Y2vFs3pG>mMf5R?t7 zWB{}z(>A_H6X4-ngDMSl%K|GvCSt`>AeMFz#PXXyYRar|6KDY}%jaj=Mb4f&g#>bY zP!s!m`$)*`*vw{waTqz+JDARQ-}f0bTrAwaVoFTjtT%)pY%P|Y-rZq)XNwp+#$jOp z@Q|x}*Ct>{jcPJqSbnjK#ZsZL?wkEgnsU1}4H>}7p%LXXWsrNbVZ9zeGAq3WM!T+~ z?<1xeq}r5rh69q>MrCB!jMH}3n_;qP7{(FI2k$B1RRCaM!#ETcSjfIxU9sG-JosD( zeO29OHLp)Gs&~0|vo9&>v|S^hDThKCf|Po^U0Hu(Yx#f#u&$Tu<$AI9WkJ3DtyQDU zQbtvLqyPe{W0SHXPkQ9_*R!-H@!@gzrJ;PL^31kRj3#d2Y+ zhBa@y`wB03=AE3s?dhC9+w;ul+|EM}yo1%%JwnRfKi94v5yJwLj=go_+QGnPh$w-C zF(yTe9Bg-cml!%yvf?dOC6it3>AH{~D6x0Rq%%jRM&U4|a?H-S4+Ju0T+Cr$eT+_EEIv_vX-K4$93U!eETDFr^Ex`xNd(EDTkJbXMIss9 zFKsM9UZ5>LvPtnyv1H7ZQL(UdppgJbWno%LlL5>0a}2@#s0{a47&ik}u7wq!4<#G$ zquCR!7r=pEHx(7i_D?QBB7?JnR51&6G!m@fx7Y1*JcI9wf}wkF0k z(kmtj={kmkO=gIRF|H4gz9+DNFw$?s{-w(dgVO8BaB!7{^#qM<_7Avv?J7rmTP(Mh zjO&5jozpya-+l%)wBx>eALE9@H8d_(p{g+Y~T22rhEnU<4>2tkmDmx!JHa za;f42;%q3ZTH0Kvj);c*+D0S|7-5>1HOj$(qj~NuCJy>_C_RJ)!2m75QUQNNHedrx zf5&3rp4p;81JV^^Z(&4r#M02Db~+0qqO?i62`u}6R2xc#b{(^0e3@eXd@UKYcGfCB z@D!>X?g_mh?E?wCs>kKtWyPd8;F7-t=Ca!?D;7Ln-#xKvO@;GX!6-`=+!Ts;mf@dw zAXTt(AC&DldyAC6lbRs-em1F>Zd=f>3M~~TFi&MEY>ePw&)gRY+N43Lpj)-AaHkw8 z>&|3u;@`2x-ogh&o$YNDMvvxmSh<|71Pmw!=+ZK>B>2Eo?oih-6<@FJ>&*0BCtxIZ zwkr@++rS3RCmd`!nJePQrKZiS_Hz(=Pp1pzcgERRnT-?bfIw9=6d-B7Eo*&Ot8}ue zD9q)ld3!FiQ`7Rf=K2=Klupc`F%NtQq}XNPZUJ5Kfb6?IryR$DBLhJ^5QbruI^3s_Fbe4K8SCiiGa~f_fl@(hQMSav9q;gYkN6?NQXy< z+3#sg0GXK``x+9J5@^dzOjFkuwJ|0Sd|EdI32ec*)C)pb6`_x_dEGuNNED|l4=QT zinw3!qF+n^U+B7gUy3knviH?!I`tQh*6Zn*%@n`K!P8z9XFxLt|E~jB*UR;Cy|kT* z#DlcZ3G6`%1TFXXnf!kN=cj!y0J$bFBn-Su3#x<45_FHWE1(xZnw zc5Thk*s-_Tuo)FXN0O0IwRoLHECis8j%a3PWwXi1IA$hCKaF7eb0!f=qi`5jnB*iO z1I#smno!f?LsLye3Dq#&&r^^BO8JNp-p~sfuyOw%t>+bK&Rr06%#9Q8WFwR$y*zR^ znie@MEV`IkW3pkT#>#k{u2XOW-B6Ni1XAAD*67otlY#6z4T! zq-nh%#;NTsbhDv5w?*99D(s5ltrU8OqeJKeAsCu6h#7WH6ArF19$aQS2+|Atm-pyw z$yUE)=(f1@*i~-6_MLPoafVbk8*HrMHjcZyxMTM+2iv5nhWQ*IkU6NGA>xg zBSs5!{gT7gio?A_Lg=z@NdX?SS9F$!QbsF1j3N{^r)oeVpb*4rD26mlQc+Jt%lC5( z*wKLM!Q`(ceNR7ZWwt@_Y-3PJX#%m(O_up4NFyvypC+C@I|1v5k3G!Z)kj&NB(15a zX5eP6hEe6|K|Q5K94{84R3N)|DG)A~ zaxuLFF;>3Iu{^{5I~s8CB({d$R?m?%YBozr)LN=9i8+5T)p^Hb*ysnZHtup-QdQ+8o2`Gc`?B z#W31ffw#t|D8@K}Mh+;tKUO}El_};-9<#X(i4;$zNJ=n{LwUvnA}tS)r1?7FxdLOV z>g@vjEf)#`B#J6KW#ruhaFyUN@7 z9vTrsB=sF#H%{j+X4?%1lsqjnGqZ{eaGh2Rsj}-P&`l^{*n-%1Y%RA*g}ryQ+CYei zth~|Z>*f8dIPJPpo}GQ&cuo0_h&DQE zUu#wzWcqdRuP|mYBK2J>Q8_Vy%JAZb$6n^g;J{T~9$Hh%44PP5kJR15n%9l7q>pqt zVBwAydFLu)1x3AMSik@RrQ^TiS>Zo&Tgh@&wP7Cjn*>(eKx z;P!F}v76X81i>VO3sxE}ix@M&B*8&FV(hZiD1bX1NgG^Vl0^U2@>+PO(~Cd;_RWaJrPW* zVP(uqz_ zkAgyxGvsU6ODLnU(3RIovw64|2dSx)^!(mC?3O{zK1Ls{b#NK=27Xeci++E2!?Ug* zV~$PsfP(&-(`cudz$!5g zYx=&=_4fh#CA;Tt;OOWYV+8FZ29uA)wMVZ^{#3imZB_?|^aPHsT;_%w&vNC;UXg!w zjH%<|r9<}j_qlLphtpg6Uf$i>qFZdS9tIANR;XphV2FWG&Y>0H&+i{XzK6sNjR{px zBrMA$<@LnLJ5_q?jp~4*GBU1nhoM`JfT8`68=wf5$e`7jQxVa^{7Qj7#K{Be(p~p* z+2%aQVkHBx}>g8^Zm9)UggrS z6d+pT83bY@OjFrc2b37ycPoEh$m_8ITV;cLb5J9vRa%jmcs#n4WrUJg)g};=LF>W@f77*89m_Vn|PaUZMTn^w!%f!mk_i~;(OrR?U(hh>y z8btClH-wP)sdLtn5Mlv;8uq>+heqze8ORyON_G%CY-fDq6$&Cln&n0qJF z;xTJA;0VLU(Zh_YVY`5Y*m^Sgc|pg*Y_zNz*gdu50V52XB71X*S{mxFbh$jvCexzC z=({d6hqjiSK6@H4jt-9;oXyGuwf!9T-+w2A8ayTNIOQVKJ^j83+}+l4Hohw3n5B@zu*v5~6-!!F2_q>D<@=St`?07D5C>{Km9ulmswR|zdj?OQ zUVP{^I!Q<{GGr5*SP1~|1E#(pZyme!OQKu=Fj~_KJR7s@)!T& zKjrmzAAiKx%k|$ul+DB!hOEN2&5ij}!)#Q9ADtDN-I)0Tu5r0MSDOX1QAi zjXQ<3{b!S6BwbUCk|k%pWsugD8&;EFG?flS@zrWUAVmC_iwBna=qb`9un>fRxL1gS zHpD=#2g!^l*Yy|asEOYjhWfb__xb>=Bqr&IDt<3D-$O+OhLraw_z2pxzmh>gEq+^W z%H9ldJFun!V(}e_EdbrdSW~5l`Li=Ag4*miqZ)@+Gxus-ztPe-3vS3hkP?KhtBqo{ zB2~x$V;_1nSxsBaDmaiWV!vdyzfXU|4iZbMSsLgTg6^#tuPNQ>Q&^HLOI>cWIDb?2 zzfxuQ^ni>bbSuuBUvlZOJ+56@@$_dugNGlz$ZgMlF6S;^#n!^GwyDt#d^s1qOKJQso)$AwuI_Sh9ah|)n0GaMew2)T_n zV0$kFY3Ee{-*2~|GuEtw;0>Ea8o)QS4A_~OxwwDP0LhtEer`u#EcM1RAW*pjEk(w3 z#B2kakdVsv%q2Pn2&1qwl_K>v)aC;$3IxozVeXyh+H#?whY-rO^%A5Fvqgwt-LW1u zMkwHwfrYxfEH$o|c`?Q!AIywRmvzFX$X3jO2vBYAue@$$N`;v(Rcq30buwxl+RU$> z4Tv>zd1s;H=J2I%q_Y3!Ajnf+%I|MrkrRifX}Qeo&P5+52|eP#6O%MnWI4M_-$x@%+wU{55ySzk0*tj}PY=crk`FFv zS=gqonH09~h#JLSph_MCk%XdJzw1B&IO}sxtjZRH*WU?%C(cemJzL8y`WQ*Y2Wl8M zjN_P(L;N|as8lweNKG76gU%ep%F;SNc8bM;iZ(uBc`(HXR8%9QjhRK0tPCcm2~b(D z*V8`fZ15On>E(#e$nyDdLl9vlp-M6F+dma^a(^!P)6D@918vefU9Kr1du$bHrI}8k z-^P@EQ~J#+D+OY%Elhx352d=*(TdG_MJmbwEdyy*q;X?P*#v#q5RMMn+S-~xq2<ICi-5Q+J!R&52V)o~2A7Ys>(urhCl=Xevzb_5q{J;Z z-9#4yTZ;u}PoE+LVX-*kaOHA7LtUm@j%k#D$l%gd2e0z`EOjklY^(*$%(HJl z&*euS=Jd`EUD|MI?;59;r`g)sB}vD_R}Xn~f8^@Xz__)|Y8cs=VFh%`#*7_(pG_(^ zoAm@D*g6#x?cC@bhYicv0eC}|q(&bDnu;d_!Z56fiv_U@)59~FGFl?W4z*lYm68Rl z7&*FJO#wrT%s`NKWV<9tib?eyg9;W(pmW{7YAe~mKOjPuJcj7WCvMhG!su*TUI7~e zD_&t}8S(9+%NVC~xaj(#{WoMf2b-MqhqU)ZA&RK)!!%jTFf()0b`%AI`?dkz>5rso zgbGR|4Wo{9T?a9cY(!caq|}J&DCM}QB_MeU0rezF1GJ{mh$>0PsX?b$_6Y-*y*V`z zFD<}TN7yx+;A22nR5F#NMXoXXO>_~ZjG$|7#Pr>g*ah~Et`SA(LYx}ci~bZ{w;*i{ zwm^Cz>5$oDk~<9+;qpWGbJOxph&J8dNF?r_X1KbU?)^;^*sQtXrgO+B*v5F|p-0iJ zZM5&vlsJ2O7wr@AR5xw!a5ZqS8MwSZuy?ef-#*Lby~j8jz$P_-iiMpdZ8Vnj1qu?oNf`-!YbE)*`X1DIC1Cor*<;%qF zT{u`_izUO+1|5rS6k7IO5h&l+%0MY9UxMq|VoUX>z82a}KB|IAsgHmmUS(k}jb-W( zmwwS#k0Q~=gJ{UISPvV~NHl@YFv)BX_i}V8pI8CCio}eZmReH@$?2rQJ68n6@AsDe ziBd~wOt&Ld>ok^&EY09YP5PB`%qAmH!LM9mm6cg}kJQOSSdjY6V_pKeD8HGC=*bT5 zN&*`R!D{-Tj#wINct9gj2^cVfIKb)8gIX$M%UX6|3;gHht#3=YFU4pXgQyg5I!b+N zSo2v^pA;$YgYi_C0uFifKXeg-7+rwA3-r;&Z&m_!%-K!_w9A7KqKdlrpJ@iMm;qQq zm9RU=5!`3dlXN4ocqT0hI|OeQH2VoO;EPr!meJU@duKdkW{?<~Qdvi`hY!V2TX3(! z_B&Pg*^3`X@Ii`f-W?*oZ`p9WixYqq2^kDbkyHj3oNS&-JFVKwR}jm6+Cr3xQPXu< zvK|^~s%n)_XV0ln7|{(#WH6QlY=B`HrncZ_0#FPq>$o46w*k%NvxJ(!*hmtkB5sv^ zh(VPlmVLKM~F8JCa4 z2$c3{=m>#)eL|e-Iy^XZU$%*9==&EpBT!hGiG0r_<8Zaf#_5`6_nUEKwc1R8WEn3a z4T2g4eA6sD)QjvNt=ZY$W_x=Z5n;Kt&8`Yc3EfG{uEo`aLKr&<4 zREl|g4l7!%k4VFMI;Nweqv_h-eB+HEVew<{pOuXeuHe-KS=C76j}7Q(x-jKaUa9$h?CKrsOAKTR{kWJ_NpnH5_(o*~g<8+NxHM(Xv=Rlujo6F)3$P}}yvhZO*)?zs>$I|K014EEv%RkS;WU0+ zdUm2PL#kIMhUNVn6%n$R5yjZOj;=XtrY2++gJz`X7vK0+KH={limTdPsJp9ljJo}DYIJ*2Gr%vs%9@E4yIU3>7t4BP#e}r{g93HONtOufW zSO~1f4Iy?}(lxF*y?ct)%24-PDxlDq*7>@`3^JK|Lq(C;GmHbl$n^BsWpGH{mP+VD z=j#^(c7+Hk%8)iWqMCqE{ak`r9uYK!a_&r(IBjnvmSnOR+$)Ge1vf+>X)y&Y=QMaM zw`M;R3)v9dH2JNKIT0*Qf2*OYH{Oa|!P!Br{LZX2)QcBI2to){V|T0oP{rsx7)b|$ zmGd0)yu7|*3Nhxg&vg*xddUl z=f-j1+M|zf=Jsb|Bp3}ATPT4Pdk$BL;o-~NaQhvk)oQwrpZmOLvpBWQ>b^DizULlx zyKT%;?s#lvlhW-?po{0|Pwg-!WgIhY-|qp_gcnmX0ICoGYgtw$R3SzmYA;jB9X^t@ z@>C=kP!qu*I2(j6ly%TT=rF`OPeMcp*~B(!1ym*bE2YCV`}f?%W|Qc2Ae7H#AF2RR z>u*({9sB??SO$3;A~T60wUg@Ep&=t{4r1lwlE#b32GD?LglXy;xmGImr?PGd1kkb6 z-4(;^1l4F?RO(%*@9W=cirp3hwP=}Iz|G!=jOy63rk+q1SYKP6<|QOT zNI>nRugJB7Dk`P! z%Fc3MBgq?i>Lr9lrWXPPj7a_qngMz@MbE)28A#UZF_!JJLI&FjnPF6b5)TxqiGqfv z0(JK^bFWhyx*z2Z1!9nnA+ypvcc3N#$I{a(~wO8Gz9YRE+ua4mM_hCV@CA=aTWV zFI1}$o6`l6DgkeOz61!0YVb5~M5^~=5UHM-U03|O%Kl(gx!_<_O5{i00A|^~BfvQ3 ze!QAZ$K|PqSoSVmEIO9`a$@rV1su!EB?Lkli0fizf`OHRp;!WgQU+;ENCtz#W`tqL z48&25G#X=JWU2c`jYnMGJ0!-K(+>N{R=+5rNedPWLygP`EZYcWfZfE3aerbJqy+yI zFES121XgBNpAG{tNFG#94>Be=bM|y51H_I+h?95cR@w$L#tA1F7#+Zx?xS&%BW{K@ zDFrYi6-M`F*i2Hv5JIceC?@tJDTgoA1Z)9wc3m_=!_u#6gdzn_AQ6Iu38akO2MmDq zJU;FtK9iU4{3KudpRe#CAN%Qi)u%s$U;3$caR2Zs{?UK@tGx8)UCy67%hv9KxBl3_ z;|ssyA9KrdzJ!1N4S#~?pD|Q=9{ira%|HIOxA2NT`zQH=XKcY&d<{SR2_Mdve!~He zT)x65|Ix4GyFTv-c6#3aeP7G(`O{yA?Y^3S^B?~_FTSxc zMIMV}I`DFvNB0i7aQ-yfMGgn!!AnhDs`<=K+#xD{U$_L6rlzFBw+ZKY9I{ngjxkj44pPo?51y#6Ykr;i*1S)D$U8 z^}eR0Cna$Zw#fg)Suvz!-e4kl-zHg+RchXM>6|51%r$GoxRlQdMX?m}`*9reNO;#f z%giMXF4>?fjc(OMmp#fdDA&b2`Y)lFdIqe>0E3@L0zn{|L6Jue>&@iN5zA-9D1coA z%stT<%-HI2Py>bBn6^m7C6-qrP2bUf}0lvPT9GC3=iGBuIE< zyb%T5BH2ue9I8<+ndQ1n8%c{N^o2H$&F^1S-RmuYDN#Ct8FF}ttk-mlB@jzYyLT`{ z^>Q&mONTmO{=Ij`T@#2TvPCguC<;9eTBut8FUumBl>&|oe)11ZMR z+1K(LmcZG9VNrm;vc4)5@R>Bgw0{Zl<9#9-yJH@8Ni}-*@7Vm=rm5+y2M}M+QFKEK zFy}Hv*H=r+{8EFUK<7!3mGS}e*ZgKILR$<%1Mo;HM*Ti%y;m$1Mqj08OZ_tWy^CPZ z&Z^r|1&R-ihZVGPK+}4CNN!GE2e1QGCRLKwLSv*U)FLe~iWP9yc#2D93I%*$3d_?n zi_)}s<_J-uvw-Sv&2*e0OY{u7WGwo{BvV_L7=JSZXZ;2R6$I*_Du$OJSvuJF3qrt6 zqv>Nn#Om`{sR0kAtuu^i>X-+s%y%^a3WyZZuFHUg;A~-H2VJiWn{2g^)G#Rk4>U&O zlu3LlVH#4BS0UiRK9F#Uezh!cFR&OO764@&2h1EGY#FYaff>!<%%(^O)0n}wq^(Mu zX+0^-st^Q-6Nn=rkP4egQv!s3Aw{xh3{#y0YJf|#%Q1MWqMAQfs*e>iZ-09qAXM*I z^VHq)yBVSz+0(^9?6MJih?TWvRs<^m#o$!<3>^S=edw9Fieauo6hHY9J4faO0;Y|Kgr%yFcQK@A7R-A zw)(A{sI6r?M*g0u`-ctF-}b_mHOnK-oJm#Kn}Q}7#7KLG*h3e&an#A{E5Uf5lIu|L$e{nb-Uwp7rm3f&1Ux^RkcpXg=w}TluS> z^T)aNd;SrB=`+5VfAOV1%*}uDYx&gEujj9R`QPWRXMY+0;h+2q9=Z1AeEWa@7A}3} z-)8@3euV$>pTC)RUi`#~Uf8F5_}5?km$>~8{%gMC_x*9c{Of+0XZ_v3&u@Lz5r5?i z{v4NH{1tq|zxr!D9KVSlj33I!e&jRxneYEjzT*deinrZeovWVnd7r^Ye&n$jQ*Zt+M;2-?_DgNZY{6~Cp9N}euh`;zJznV|l{-1o=U;a)w5dmk$dmQl`gJL$HZzg5r#!W>rH-Fe zw0PPC3!qwNQb!?Jw!TluAaYHg=(FJZibBiK$PCTj0=t4wP5fkSqR0dG&up*~) zNt0@IRtTk&5sUv+W(k35-d=D(AVvmDjAkBj?BZMsJ@CIHQ z4N9XkcW&^}P&6gqznYv_fL>>#g~n1@!KJ4x`i|jfoKpVIZJnM#w!JG?xiOuiKXn1N z&gIc{jrm;myYy$4#O-Yk9=eZv-|=Ri{y`s1cji2rhRL{`^$N}jw>)Q!~PLt z2<%sxtpH+DM&&h2E-Vox zR;I3KH7s`4!<>oRW?Y2KCTs>w3hSWy#K&CVxAtx8jnL|hgqfGO$ zAtNF51(Y((MkEXnI-ms{M&CxBFb65{QunF#)8g0;nriKU7j%2Z?4=Ypx>rEz6s&-o z0dtBSsd|f5z^?oaO^R)(Q|N)dC5t%7H&+z;mft^$v<#T$b@1zw$R#yK{go{Qsh)Fl z;46W(%&Mle{(tJg@XVL3lnPigFHgjBEA>*hZ{}4Y_P#Yr-Re8ivUf9lqD$#SNn@I% zLYvKozUwAmr`RpBoGmT@NRtXBuXnf_8OPkgUTxMB+cpg&;Ea+;j0Lc8mPW{v;K^iZ z0?c9;SWNQr$nMS#TZ>{OoyIC{2E+lZN!GOD2+ORNa!b_TB(fcVDWfD35Q?9jk!5Us z3;+{|rPa=mCUUUK;h->4YI{q{08N|$-$^0q=1}>R6xyuA{i(hGlOY8 zjEqSu7}Y$(Jxqr*PW6le>rUx{gSi33lOKno+RC0=+Ja7^7zIGoa(!AfEu49Wn$_bRi(i-I@2{CnK(Ul_pWJL8 z$>&ZB@S3vEDHx_6oRF8f|C!Ckf<6EMtd5WRu$SBm$-KO z^LWnFU(Ko4e;r@{P2a)~-*+n?`x9TvCw^qlM|{dh@`i*UR-{-nq9YA8q6kLJ|3O*^f4j?MZoDl{k9=r$IlN4P(~66;A%R zH$IC@Mx}OvD)?5kXDJc7J~)$4p$rv8!SYUF_|icZsF$QnBr`v`tVZ) zs`o?}^C*{_)0+sxI64JCr-yXW!4j6s1t}@Pqq51;G&ctiGAhZrv3n}DR2DWxTyCNsU7*lIsU9~GbVHGO^*sYbfB)N^Gg-p@X| zTYxfk2_k09Mt+SD^8L{FF|$xz!ZSTAZKt*vPYGbWJw1SomsHx7MPA%B2Y|LQ=!nu zxIlIA^Pd3^KQ2`WdBhbB`F+{fqhVlsv7A_kF|4_A^)kcO3t28tp{bvIoOB8fuq+>3 zrD5Gg88U9;u04DiYLr5 z?TIRt0{4x>@KR&trHQod-+!lo*TN zSb6|wkpPO3nOEW+L@yGMIS662b80a+0gpU!@qKnai{)LDt{G*LxzrCMRqOU-bst1P z9Kebc=ezt~l;G+#31z#1_x~bAo2!6UgMUeYIUCQ@B~cygz*8&vQySS`mgCf`>)(}7 z{i~j^SiNqdn2psQp+xozUbMM~6IS+Dn(t_9e)LoqA%i-LzAwy|Lo6Xc& z)#7OxLSScmhyK(VL?oxOt`50;^%@5UBb$xpPOr0TTL2@B^j$(03*w?D7I3BSi$4x- zzMs%EFpdzyk`T$3Eh3CV2DB|e3>~p^=57Y>hce(~J~&jp8?!My9Z@3+XaQqX3+pt7 zlFaBP=~k14!99cWxl$0alnXI>iwK?D6}Yu$WvvT@!e9~~C{rBb&y%z+Az%eq)lDKP z#H6`hhcPBYQEaXkyI`Br_ml2;(pi z)|<&gY2zMK&MmWQkdFx#%kP~Cee7}@4su&0Gs?5?m`J|QygefnhCEeoUDO8I0RsE?s|bBeRn7?Mq@h;;#E#{$F{ zIDE~~gl>NiiBnb?nWe`nUo5kWUmhiIZ`V1^jM*0O91iEOXUP&pHv`O;oQAs99>{%=X zbtWWafH!a=Idi9pZ)c1 ze8Hc5HUILLU(eCufLJ62(8G%yTH?%dJKr#oQiM*xLd5zd5<7@@elw04-l3@y8Lc_{+r%@kPIfkNB`pX1MquH@xDL z`1}tubnkxjwrB9=U;Q!s`#<&f`RtE>1AqK)d?~Mf&7a^O-`w#HU;CpBr4!So$ap9m z9Re)bS!OvviajB&`Pu*R_59l(dMgKKZ(`WL%IkkDGBR?#TnD7)pitZSE*Oi?uboY5 z)URnxrgE^twazmMVcEv<``}Wm`92^*Xn}%u9XCJ?vvE!zH7U|IE3z!J%vg~YWS|~* ztv@vLbe;%xj1hh-AFIn_45(YQXz8Q|Fftt*f$gqmx6ekAng*6J&@XqeAY9zr=fTTY z*uCi{PG7yqkG}3F_>>QM0dcv7*}$otj-$P6XjeL|@f7=O<;tjBI@qx8diD<2j07x1 zjy5A3izJL?->>DtS<78IZ^#L$K7eUHMOJ;-R zcxW{gCB#rXzx-a%YOG%Nqjt9I{b+y{dOsmY5}W#GlrXJZxPiet+f=Dj%$^*czT=}= zp%c`NC6Nrc6!s6J5u|_x)rj4hGx;2Z4nmgZ1!)>uSOvhQ?RC@Nlu{net!ud45LL@S z62aM3kk5Vfl~Bb9ByCMzvxFnMF9p(?!V^N6u0e<$WVTlJDk$>H5MzucYLJU=k*$JtbrH8)CQLFqWdpB58wx;DBNrz(GEA#=z(da_RKu$_X?7=9>ObN4m zjuV=fPmMui_re(@gzU)>3=K*8LvEb>?c@~?!t8ncSoW23H z!@3B%#WmO=uaZ}iPgF~&@iv6 z3A-1GR=_I5Ov_|gDEF!gSgK(pu}D%y{lQgxj%IUv2Ba{PrD{ zTpGVww*c_3Ne!%!YW^+(99)usNh}_*k*=g%X2uoByuI)Bd75Q1#tD#AT-m7AP1Of6 zD^6{YRHn&P7&V)=s~WON#8|FL+e(u_*9m}Ki2@MZwj~6tfS<)#ASX|*#?r4+ ztgI1&2miE#xPcJLHFNup*fkPS!%}XukS4Hp0y0^FQ5fA#bKEFb=o zzskAYp54_lrxo=(oV(Do_lBS4Ctm;Yy!y-k0)OFWE^_a)|1f{}1qb}+fB$;^_nXf0 zIicqzpYq%I<5#cnuOE3j(gn`!EQtavPILC$f=3R&pYQ+SFXi`r+Gp^&FZoga=Up%7 zkNw5p#&>@A4{)j5ra!aG_JXEt^Z8%+nSAamPVpZf%BfR>yd-?a@_^)`&3qF*;bmlx~V#m(;8#w#mgWUbjABW%n6};vv-^3kPpUdZe z{wvvj_b>AE-~YpW&VMU&H;+`b56;BwTSON^1nu3RC;CBO2{ck@vn{K1^tU2^&12YBrA&D{QsXV7&cdzT;O zj$3bGbF^a6z_p{1N3I<4=+T-Z3#^lJxE>hI*xx9tlp76Qzvb+&V!GXBsxYM?VZza7 z!>Gp2){;fnXKlJE76PLtHfe;M5L8)tA<#)cRVROov7``o7BPbmJ5-W01`sPg2VIZZ zfR#?JVwLe{nt?wlQ!!*Uamkux&}{;#geW~yd^eym%WsU?efzc4)F&x4cd^<5v62v| z1ssYoI#`RP+#vPN4rTNz#_Fjc)DkAJQL5q~R8Y4`@hL#7Kt5d5liz@Ggc$QW2Hx1E z-4f!)_mLQ-bSP4mXh%{GC+RDMq?h&ShLg zw3zjVP&xuwVg6B4Fd>%hkfo#6y~`^!;2bn*C{v|PNAT-gz+p-d!iYLjLqdp3 z@&8Du7Vth6?-o-+VMylhoHk5YH_#0^QSfL)7J-Er;&w^JoEB&OiL_?BU~`GK72t*1 zc$GO5N#;h0*xZ~DAy{P`AZ-lov8Ia!s~fF?)> zGL(~;8eprd(#!Y9Vpahsamk>+9^Lnhy#j2Uew~C;MjBNvr}> zCzcu_z=`fNsjcfNzjOu@%WAV;vsmObSeF~ePCS7ZinpP-?5*p-lwnNlZ0!)F=gjFq z4CS{!KQ{dNHTfla3SN+GmfiOYe|{BP0L4g*o`P0#SA*6 zs`FC<5*KuR@%S_$Q02@)@U&qN&;%-qIswlaW1$Q*6!)Q2{6L3I=j~6Rdt*@}CJZ-OGSXG+@)tO6gGflkiOqU5*^p$z zcn_|~1J6qSoLW0biUW5UG>st-h=!0&;yKEnEt1p^008SO=lYv?_?N$jum6eH^7f-6 zynNGt{XSlC#|1v=>HA!I%TMwn_q;Q+n8t^B!!P^-@BH>3;h+BS!*t*LmHeKs{h#z{ z&1=8ztNC~T;XAo!^O1bpH~cVP^_ef_cmKgJ;s^iXUHtq{{}6j`zsyE~YwzF}f8i(j zl{enYKlt~5n(&|gIv@V~{tU0MfL!@St~`8^N8k06{QRjm@yG#9c^Vgj@|K_bCcf@X zZ{(rFL%jTxfB&7_^7$XaZ@+z;mwfbZ=Tkmyht<`ec%qyKd~pZ2+bgy*iVa{udpo_DI*jpLpw1L9hQuMFBDIa6IuY&6#K@4q{P@J+Y1K zOkx-)9V$9WKz65K4lG~j%+O2I;ITv&o)G>&^{A>KHk>tm5+P<)nZ5h_>{ z5Td^q$qb|d?s&?fvsI$x(cXOOvWzT*t_BoXo|0zTdh%H4)?nF6OgNxA=7u^hiA)na zj%d(;!+qD-##e@6UanRodYva5LII=3;y+~+7Fx)XzhE)}Mk(aak2>aSsV;RBmk&D{ zQyQyTqUlEZ(#Uj^Dg9!>`skJbror5xkl0%(B>Z#H6fN>wNA*Ao%%SEa-Q) zSPkn5ti9#TE<3$2UcJI%b&7F&No18JX0naQ0^&LP{t5?sZ|7(nknOW-H9e1+4@ogMjJYW%)y!j39X*O#v=KPqp^|17)H#5 zD3Yb4h50vU$ErEluI{r|7CLxrAo+OA<%`bt^P&!DS@|pkYXNTYd$@u-^?_4Hk3%b) zs>KS31?Z?HjZ=^|fzOkpW&n|q$aZ`Q30Z;+5ie#{M(8rKmPv_($Cs5K`$SNT!f-S& zO2^+pCbTLbgJ3QvLRtXq1pgKA z`8-TU_cAMhRVoZS#k2*N8v{8iqZP4}<$$Fg@%zQ^4@)(Kz?$=J)c_u}eO=6^{X3v@ zBlya~@?|D9E%7Nwux$DbUmYD$+=`GQ&0F?;20DsqxVZ#xnFqbbaUe!z(HYCdIIX)_ zY~{4#zAv7DG9|ZOxwgl_;b9*5@Q!SZ1ZTq+d1Z@Dw^j^lN?NZo@RJOgk>;yHU{O2a z+9tRPFoBd{6f1sXTb?$UL5aTl=Ejb3@JF{P-6N13CZ$j#$?%~JQ&EB&*P#emf!Ud+={~{aAdt1 zra{uxI-7_4dGhn%Odl!i^y=qpP+IU|4cMvG_N&o>ppTD}}2a zt(v$C4HHc&h!wSXTxpxeUI#ZYLZF^w3w4=HwHNQy1T7v;ZfA@X*1Y#gDCwA6arz!E zmR${K5GoUtz+$p%SWea+AwBmMM+d7i%b9a!+*;;39B=_m|S2;f9yIh#L>y&D-AbD7DF}PAsKUUIDDxXGLmf!hbZI^@7aY zKs+%el&JN>FmMT>ogi6sc~$$K`Pzv8A(#-Hetb-kVAZI$bquNdT|H__x)80_`j{?= z`|{Kxa|Tv9*7i93^S<1Q&w+zm8GN{K_6%KMqSfyo9cEBwOq|<2MZde?($%YsgH9uf z=g-~9A9>C1;g;3IT)FG5yz@Qp)n?a7U#JC+KNkq zvJOiw9;~^tzvf`093^9wgw-%`=JXE3X6+tS?4CL`nXo2RR!5r&P(vbp7df@FOAw}5 z-Hj#$$)lyFC1EEtDSe@6;77-9GMye_u~?9F%dp3}8imH;h9ah0>zy@49Kffyp3WgcdyWw8adOc&6nTTKoq?Ev9%89|SUbE;rV&7pv8Zy|}_kA|( zAI1jwC?kWGrjAN3=3xNt)y3}CHsg9jjMMp>8k{B>G+V7!#1OOJ#$*&6IlYrd+z*b9 zxOQ!SGUi<_deFo|;MDelaZ2ah<4k}TKK&+kc2;cPy2Xtj{$k{YbJ*ex8hR2C<7ooB z$l(<(zWH?=UAxR3AN*mgY{hW-K~CTPGzM8>3HqJ0Tz=Dgc=P}MNzxJ1ckjXtOYV5u z1=4CCQ#gI$X70cLG48qV5mJg1P$nS*0^qVv2qFb2h1eD2`XF>s2;!r{QkZ-K=JGK2 z12eo@5hEbA11&`gixSC2LY25?K-7xoSm`7ai2fVx47vge1`EUwL{stVYIH50_k;1Ww3OP$9Ua7m1+(oQkB-QPBhG&EwT{qe0RK!3gvNsf=>Tcnp;2lHp~GY*dy#-RXdS#RFq4{+ zX1T-ebs}DWAQ!7I$uGpBM?^KrVBQ(a$BLg@>A||nK$BSIb!}&uFk`^gIvW%F8N&GM z7p7v2coC&-=hRd|6vU@0zf&6>yuxfOKrc|FM4{5htK_mUQ5>hNj4YQBCZvF6Vy(3S zS%Ma{0%YC}C`>vff%)VBmIG1swK>q{gD_>8sizp``fRw0-0`Jw;S+eO%6hfpzkl<; zpAwN5i@rR60$W=>TU%RnT~|Pk4T*$FAWHPaSi0a!O{1GwRZIHVl}P+0B9WujF!^Kc z?d_A2BI4}jnm}gc>#8J@xu=sslp+LELu&A>1WQyXF!##UMg=0Ful z29*ndMfJ>5ZKZbrGdmO?`L6rozlHt*6Yv(8gLGEv^9f_d=&CjWQ0JRjW^xVrKBDax zNofPLsn`KeJjNWoECVpA>Ueu$Mk*qutx9+UB!KK&S1UP?!Ab{pv!<4F?A_ z2x#$MYDQWLh*BT$^SVtP9IG9PcGE2l7;61ZWh6`V0;D|Rb>Z|GPH*=-{K#XhMzG>X zvc0{Srv0N8nvC7$l2cpT^g(&!8-9UXUT`}XAHI(r+YmN;+;Q7k4)!jw>`!qt!nKW( zMA_dY)+#x5Fe#f+OWH~R8|k9uMww|bkp>B28p(=%&xjC0kB!P=(XogfsWiZ20Y5xP zCcv~@3R`O&vft7;f}6cZaYIeW-C1Yg*|ZF@kCdPAE=bn@JK$0b<5MxT4TL<>+4UI3 zb3;JfyfX^pU{IuvQj9^9rtH^LB#z>ZDvGyN0Ub=p+mqZO36?zxf_h?G0968pj_YZe z7PP`rVi-3pyB?P#32~Z&<#Uw5jR9xWgxCYl=n81LPXwcnWqoxiK$ef8mYFRi5N{Mz zx}o^7kV?H-@?q4t;;vf&MoJXf$FfL}ilZ6x9bIWN~>q8C?_Sw2&m-WFRalOxlXWUMAZil0zYus?| zCLX%~elDCk&B4JThpPjgxqX^jZ#~auwa+7uU1O7s7?$7?;R2)t0*F@6Kxx=OcE0E z>k$Z=r3RsNAUX>m`C5t{!_aMJipxgCL9#&WkAg)!nG_4)*S`W-)o|Y^jJ6S>gb(<0 zNaFknRbM%PWZI+;DtL(j#1Qw$LTg=qB1IrXu(3XGOUF0>tx>)pl`Y}V1gmmLFO`Mq zhVm^Nq{=M42!8IYHNp3boA+NFV0PrsW8$TzJX$#xbx)QsO%h51mqZLIqtFCF<~qp} z0jy(;E;+F{8*P5;nAYXKKoUsnc{PBJMOLUr06O=9r7$a1(5PU39tD%eYseX`NNq!7nIUZj0UQmW+23;f{#X2@ zFgL=U0ayag^;N;d0R+hg@Bu6a_E&2LWqP)f607ydFldoU`nO1`->ib-Kn0{GfjL?9 zwX48hMnFiRoKL8B3AJX7TL1>P$u~`g(=nO6VH^7i!E|F}4dc|i| zmL?GoS~2qHOal(i3k`u+G&AXrl=a4$&_WOg*+2>yd{`7V4$=*ylGMSwES=Pp%Juep zP8`^);TTBqoRbW4rOH^N1Rlv|D6&zex`s5e8HWOZWytWUE*-z=%Jp)+TrXxyE%IxY z1$rlM4siXNig)H|2T|HO&Fl8pCvR6koEc z1aH(9_E`)dgxUzot2If5AfYSPD>Y(V5Zu!%P)xt2umvc-T-M&(QYNaWmB(&l#Ml)x z`QU4oI(+n#X>@%Y6J6Kk?TyJ}zNh0I)7Xqq161=)ue3B0z0s1{Xk7u;bR?PK47tUW zPP9OfiI$EU+lxg8KQs}<=(c+Lt)4|^99+GIUcJJZr{9@@pHT?(lZRXgOQzCqb98OZ z-aYqm_U!YqxWjO8$kwSfu}D<|%FTD)!NDW%pbvTbhwG8W`5Srnn;&8|zK55+^hMl$ z$E}<`cbbPDxys(P6)6S!Zi|$F4va$QM_8}N=~&1kkOfGP`u!_XI#p%v7pTtC5v5#R zz~$O)Io^xP5O7AA%NZP~3BHZ|-a-IUQ;#*B=sJ3BxL2I|c3kFD?&V|l!~A>tWc`jR zBcU}c4}g>;JqfPn?ex;q(w zIO)9D?1i*{=3Xkk-Fe+wfW-_7`1+M)W)15q0-;^QnMNm=Zl(4FKF+=PgaFoTzh`FX z(JRsF=QV$gF$ev`n)hO}9hzNWF{Irljdx~kJk0#x^q6xp^XT%|CO)g|ug*X^;rLQN zU$6R8UpC3uj7BU{Xc>ht8nPZy$P%;72E|z{V>VFVM08ASwzt@}Kn&yo5kSU)et<=9 zldLerp04YPDYp8NBjV=qf}3Bb;@Ko7sQV&S_I56JzS<;XCH4haAEb>dE)Gg*6`ogS*AUVZ(J(+|L zBo)RWq){0)HIh6B_@%O;unLNV0!$ZB5n3KlXztkBUKooVK{6PVO`xQZ!MkyUWLlV3 zKm(ps))%N-2$b`r0OsIayAM{dT_a#9p-7w+Dff>y;I)|pW+DI8EMxO<8zPLzLs-mjqK20x1M47SVU9B(-FUp<#W<3%cVw=Wbm^dz1ybO-`P~8s=;ks zg!*fEd zw0;CL`P{F)zF*IM!(|-Qbhv7iSeaNnj?D4#%Y5D0XT+d*|BQpO)Av00j$0YmM_jqO z4~r#&AZqONOD^p0a?9z{FeI)HiG%gP>hOr&kl5-Hn=6-i&Yib#^XY9aKKKBOThFt# zbB2d5uDH5^12r!09kNN06gpPpn)R5_!gx?MMm0j$p*GNkh$bd|``*FfWYBnUa70oi zhLGw0T|h07bY#>P3}PC6j9rJ01B8w=md2nKpbD_!#S~)gTxvP=I!X9B20-#8Q_weaIGgv|_+1U0&Bm(A={p#Of<02o{`G0x4BL z14~LQsej#KnSHs&VVY+ptxXgxjl?c9iOihIVYEJU2?{8d0UIII#t49TV_vg27mAJw zo%yyKAP!?b=MB3L#FUGzQ42I5i}j#k7|3)I#eUb@E4I1pAx&~;eo zN_V`+QbY!&r{~riZY1mHNEXl#c>436!`pu9R~R>I&YnNb z;?yqZpZP2f-}p9UZ_R^`T;ays&NA*@;aN|=nTPMc#Kp@8*<^mXoJI@BV8jSok!F8}c5v;7AQ^htKV{j)8ps|9h)A484G^ah4+Q{7J zAe}&%14r{?wfffNBn!oP-E}|aRdcNDeOBr|)O15Pb0@!dfTp?_B6Fs(&9?=L0;ytl z%+7~KYAJLGFJZo}9&^mrY6u~ezcymz;}C1~OyW{MDPVb?@4w}Qu`$L6%I}^?du+4) z5}VDd=g~|m;6=hRV3zkm-Avk$vK;fzd7`IQfY*FIu=>6nlRo7OBBdh_Vi6%Oh#^2>-yoJ{>(a4Gk+jyrKvp0FH!)@aYdL}hVGMyJ!eEJ{24$ek z3R632KrMSNjiX>z@zFF|mDx3B*A^;x=<;kSjseNaK#boTniz)cm)ZHCP5`rJayqPL zhL;6lyYC6HY^Nlxnh6e?NcmlLpq~Pw#30$Me$f}B@a*q74kJgaRW`#O2R1{NXt}@8 zFe-|bfjUYskjoq$;Hn^(doenY6A)(xRse^*Ut_Qs=n@LYNuHi`Ov+&K&Hjqc+HU1z^>QQX*!ViasP|_l6sI*7Kgv z55D$?v2H;!=zx?qJoDMl;O3id(wBb7(|pd+dq?!4s!x5fj)(IsB=tXt_BSY1_O zSn|*#S9s{^nj!A8O2#??A;&wfRvR{hVMqq6G)>?@>|zE2GAn8_+D_N@S%!d*s&oOi zw|XFD8h&ByNN^t)2r-sMQvrZt#KDSj92?_qGFX)(?fpE}Q7M5Ci*zo4%|^#nwfd|{ zy>`WCt+L!o!itr7-m;ApQ+I_Bq3tM8%*+*~r$e0WRE*wnpny6mSN>Mkmt_``X>%_W zuK)zh&l_&o4Gvnl94tsXY8DVu?f3v8iW|pIf4i7dBfSn0JP|U#r#Ae8ROx})h*?+t zB|=$SwHin_jEGT3Vu+bRB;a6H@FYkjr!tc79dS@BL_#PaRRJU^=|OH9Pw~kJQOfln z7&Q?EC?MrH>a8^W0VQYMMZKHad-!q(h) zVVg(qyU5imm$`7u&0Ia)r#C4c4?^gcgzXKcD>_Cl+;AfgJ@_CyH{Z&lKQ*O&-gn%Rh%q;D7aw>r-%o(K}+r2&!D_3I{E$_Y*rIHezhJsT8|vA1`ZBaQ`>Gm zj*Kpk)>K&B4(>FvJQMtTfjUzQXfax6`%skx`TJ#lo0fTvA5``=^2FMD?s3^z0Q2__ zkXaidM;aTuN^&2o`}!7gH>p-5(!nSV#;N@(%# zUI9=lxTJ=!T<-z1BCpk^FH+8PVMx_lohex5i$HU3w2(jjGsiz0eZWSw9Z;#^M{Pfc z=9&ce8>9HR;YG^zF3-m1RQUBC4azuN_PNpwGLNR!_ft|iZh(?V>CeOhVm0miIvK9* z^glqrsNQdWPrM&9u&$Tu<$4jB16ZNF58gn0Qgtz}yZLdRGmAJzZYL7T#N(EE1I!J- z>oGmfKKet!d_*KLH=kGEzowHzb1cwq!%q4kEQxFWIepUSu$J0E?UqX}+};GU6IS$k#gd`Qbh) zeGH85w?<|vh1eA^hvIFZNEG6%!J~y_-e;5a0(41Prg$pcIF7!oW%pDd5BwTuj{zx- zuJW0dS>yC^31q(k0h~?ep$7iCtdB^R5K0}HG*d!c62&l0zW4{yL6gL` z>=$f~4sw!}7!>*8*7g?b)xlK%;r@!yCH5=RxkgO}XLRS+=(#4?OfJm#-b6gF#$^WtL+MmO(larg*2ecBa8Wlj_yt;GakZ zWXO}6W^kr8hNT@57at)m$xrS5)5s*sy?}=a1TdkR>dt`w`7_9x@2QdNb4DH1&-yw+ zXiSJH`$63<+5kPwSWt<&Mw6K9tOw~Dt0^Dl_h&}~!a3ko?ms`Tt>jkBXU+yC3duH8gRq12PBfwDEs$mK$>!{V^;noprWCT}>1k#zh@|pI7D2!j>YS5K7lJISAL| z{UVuxjzS%|&!t|sypO(LlBbi3Q(dD`i`KsmSg8VTrj8evzckkiYVTZUfa0v9D#x?S z3d&KpUk9@)V@*=?+1hTZ_a3d;{p_BH*Edxju^{vQrI^`!W3f2;Uz|3Og$+H zs##9w=HbbTluXHX1)3^Q9~v+q7(NgdLYA62*ydIQF76si!fuSdEU#Z!sy9z0}YszBslBbc3_%t(ASSxsDQrMj0{?RK|RS%3{nAa)PcR}y*~>AVEHpmyI&;F zLk(I&tJejM6jJhJRq2Z_pQrG;e;i>3LlO7-I;tAJ+Ge^6NOFID1G2tjZF+!SN)0 zy~_H|AIB%5Ej1~{4HxlJ5^W%g2Kh0wgKg?oznxoB%-Lp4v>Ct`GNjO-q(5^>g$66Kd92u|~ z(p2YS*^@BV>!U&&wk-4OLT2`Kk&%&QAHizm{$>~n%N|WW+Cl-VLP=i&NVplfi_TmM zIHqd8Xi1S65g+0AgqbKnLIN%qEbN{9dE5^uI0&N6=$#V$8u+EsynmF2hy-y8e1r9> zceuSXoa4KL;DA~P+4G6A9zk+LObdX8;hs>7t}jx#8lBz`hXCb1 zT4cYp6bS^jms`^)_11-LR@Ni2gK! zsw8ZZnW6(^Ghif3I<2x-JcYBQ1WD;2h4~=0cVwj0-;B<;AZjfxEvop6q6py33?Wvw zjT`KG8&~47_CO+)$>ZxQ;UT@R0X!k&# zOmg20!0`HMLq@ETT*?fyk>*{XE!ER0feg;bINk)(L20AP2xsYt1OZ~b&`q(~I|(}T z(@M}@VD)s_%+6@Nro`8g*)?_FDAD#>HQrOyWykHE8YaF@b*wS>jWNxCtEj2&3*>pN z@w#cA&PVxIa*A#>6<005l@?E)go)6{K!{S>F=U`A#(WI| zRSHH&jFHYm3``kHAj`Bgw39fu9u{WcMHA4Ebli=GJZY4x6;v)$^h|3qW^tTb(xP46!uPoW%iCC6D8YC&5cl`N@*Ne^j)SDkHb`NM~7JcOsmtE zSVncS)Ube0p=8u}@|}1D_Ovdk@fo17Q!rdxZ>52uGo$h@bbv7=BYGpqEFY)K1$|_= z7*Yl|m$yVm9x)zEXGA(75HQP;+1Ye4 z^}C!>wQU_*j(5?Ma&i%w>@Y9ka-Z%o-Y3Qffveq?*O zU50!Ue!hqSLyJ5@3eME=*kc!Y_8oVS(sBZ`x-pUT5NwTT-X}|njK*@YOVS1VYdAO< z*nijE-1hWy4ExvMOmSb218ZHgeR_wzv}O#Eo!wKAAP}Gvqzi0TE4mQb+B(Z-Saa_~ zmnN^0TP~dD!VPDq=3apmBE)u?ofoyO8f3s_rNa|9q{87^-459UCQGeU7Ac9-u} z(^faYPZVZdsDN2Yeh#~7{v4B#0?7LBapyo+Zq#OwwH-mlJv^w1d*X87V#aEv-eZ2< zjX5ABU?r_96d3~^w=VUAGOJ7H9$5t(You%{T2l}S%;`vV?F#%*j@wx<66eoTtx}wF z^-N~6Kd)01Az;TO)>f%gJr5#jW+ESGO8t%#8rcX??uRD3s(71u=Wtdm%w&=RI2e=2 zWklwwh0wzW##39Q zz;qL6!i)eN zBG5%cmSGz7Oh{&5mn=!(SMNms&?TS-zvb|L!x_D0xDCRu%wD%X^^)8pK}c z0mj0_YUGUWk%}|3sIpnJI_TeZ84$Bn+IbR?*m!0YU|E}MJPb+<9|!=};#OYrksr;+ zy!2*-NQXh_*uVd$`0gM4c^+*g2Hn5RJAU>@ z`2JtM7l4~T=u>(1N4}7AJ8pO<9lBBcCMHAjR#gWQ#Y`H$gkZv-F^}~#LO}a z9Ie-EcU#0LY%Le0VZg?eC5WX_*F~o|7b#TPUmZbBsz1b-KN}}t1Dpw@$q3GHpcqnj zLede)=YJftr$oLksnD3SXBV1?U2yQEfG~n+W=^T4Da9ywLrHW3Nk$t8vMkZUvGt%S zKuV$m2dNzBaxl})cFmxpC0lVzYr5pYJ2F-Gk&j)#QUI!1W{eRn z+v%jkfsA03#5~ZH_cf^@eZV(mR{YmAgSG)5X;&Z+x}FfhQUtAD5m+bynV~l3{T&82 z!F5xa5yllJJ>#G(LJtOK&YflF^jY?g z*6bgwIk^8(o_78Pplev~V{v-|kPi9ef&4hYgs9we$lu!z_Kf{+Z5p4b6I z9=W*3;o*v#&Y#b|Ca0F1-t6$`)dQ~WZxENNx~YGWvm%NEMVLYXZnXM_lu^-qUlPha zEXvr(DxiiexMTo<7z!{t-Mf9MN5OsM&@xJ2B(`ERE3L*814G&dwm68416TFC?W3&) zD8?0a0ytpSfT1RWSaV;95O7}&r$01uu@GjGvD!utt(8{ODX1l2>HrA{UTO*{Zpf=v z@uFsX66O|-b@@DRtIG8RlLp|RmU7nXx`2qzfv4HiRT?ioM?U?S9fUikb2m3H*H{ih zD+5N#_MXstUuS-0v2FmcKu^ER!3}wwls#=s-X+TfYtg!|!Joe;B^>&$y7!d&oLWbl zNLa~RwMZ2yq1IgAR>M?RF7xYs+_p8!{p`#dA%KwAp9Reb+JKnW?3?0uk(j;D7+BH( zhBeT@rR7>A>Gc#YmRsC#;S{HLmMnr0v;ZYZ8B<~yhG|Nvq`{5KXo}Dw5+=}L7!pSC zz>gxqx4fPj?y0C{nPZU-5(*%U7@+|)jHE)OFSmQHD}>A;TST(wRS0w{3??}QM=RS# zTd>8Hu9Nb-6Nb$u+gYR@)!YtoXF&uK0kjQ5QO3jDx(XdO0B7e=Bltd8dl#63NwBjZRw)BALA(v^`>zP0s!61*8}e3@Rs;Fy`x9dY z*9k}y)MSOJ*NK&FYqdPA0Gc0TeV$5041xoJ#A@~rgxDb;5E8=fCSLdvpTie@+9}@i zo=3U1hOMmy7kL*y6pvef!Sg=$)A+1g@8zxk_4~P--x%dZpZ58D#h3qXo}usNu5bHp z-ZQ}N`5XCdU;0P+%#XZ@y$2p+>y}UBBcF8xU;A&qkzcs$GSHT1@#^34#r(eC{yeU{ z<9>E-{&+s(CC}i>U;lf&Y56hyk+1l@yyC*hyB}5V{4JlvGtO=E_22Zp+%v#4p8pAa z=~sRwpZx4S9(vo)7Xa%fKIwCQ4`25AAI$n)?;+jvEI#6u&qpqOHQ)PYLwTyp^&--~ z;eAwUeCw}$U*yF3wc!-nC(9hxt0ogj`6Gx_hSqVE{dRsRBOaBk?DbZ#O9(Ul%G}W1 zS1zoeaf2o0%<0oyxNweGMo}cViFM5D4I^E%2Z510Zoa^sx9oEJO=npj>>~s=gJNL| z4I>AGvLr0uv&2H^S+7>ryjeiR z0WtD!Od68Z`s zlm>p+FW6gc*uVEtE}YxprW;RB-gfj`9IYQ^+$fS=k2BaP25!=9n*Hbu@2nQ-4TwP} ziV!i60?&RU{v9t8;81;bu6LVJr?;~ zO1V9>ScHj1JW1z+6)&scG*kq^vCTL!lB2VUvoUx%7gD5_AwUa&OYwM(9R!JZg5ao% zDx_e9j_J760!ojRLAljY&t|hOpip#J1tEFuS)Pdy1r{uF8lptPI-$3RIf%xgj& z6e*(LGMFMR2do}uI3ij?=H&`lD!yO^fI@|xfE1w1nt``7juP(V0$)5r2TpZYZJ z{r-Q;Kl;{R;@KbbS^TLl{WxCwvL9g%VC}y6WB80u{1A@5^B?jL{^u`~p8sY1<*)c4 zUj6B>Wc&1I^U~cTzWcBK4ZiKl89wqe{xrY;lRlZBeccaZ@g@AhKlw*^-ZL+7`H}k= z3iFHGUdg9^?1vJ6?(6u6|K{hodghb)Yk%dp@fjcea(>_~uV1$&FQxcMdC^mWgY<0q&H=pLh zcHpjezKc6=yPY?_<=tFa3D)m&G#KjvLbqfvNJ&U3ppp{;7mIDi1mn2LOst|;??P8b z9}BA^89g0rMt06`vsoW8q(mPh0yxNET8_&*h6J=UI^6VeOltt*BBIS_1^1=hrsh(zZJe!|}Snq)tantfh23jnQ zxXGr=pG-Bs$8v*L-Eh81c1xN^UF$woU;t`bj6e|b@y0q@KTjmnF_FaOVzv0WZdjP^ z|K)xK-l)n9D%$1MWYaXE3YyP#`78y1D<<51N5FwN0n9AOBP!Ji6hzz=WeNiFchRjW9vwFYMWbbe;U{Bz0Bs|fZLyOE7uMmi|VMmxe%)9>utLWyLxvheJT(0#k}1dnAno6mWxf%aSWY zD+5FV1gWphXni@%O}M26&!t71@IRUqf+uuV{|phSo$HbW8H-fM*-5H+^S{QQ7tgjf zJt`ClMP-4NaD>wfAnU-E zvpOT>sjoWPwxa%(XR^=FAl^${~e$X=*sIY~FPO_er8%6(9!l3^ne z2SRp2N5AaZY_>|>Sys3y?7Oj;|C{?Ts-mu%aOP|CyCd^&zETqw3jn4wIj%}g1r=+D zq>W&H9x6apaH#54<$nw4WHnW?%J|x;Nd#2ipY~Zs4Wg==!IQ>145fyt03 znq+woBWOL?@_L(zQK%mP0G6Zh=?eGX_m2NFftOoe@yYy-PyZP1JiBB#y29(f|KIcN zzkI}cJ+gK4^ZC5L_*Xe~!)cE0`9;3-zy5Eooc|C$<5OP3au9BRR^+wc{~mU4xP==J ze}Mn?J#XQ$^B?zrfTj;;_{p#5+kf#4pY}zc&nsVWp3c_X|BFAtxBSna=FEqG2EXIu zZsKq_%bgdtNMXsF+jH^+Cm>>;Pi!EKH>#8^S}c?&wqaFJzN8R@u&VPhoAe!-1dU!@s>w!K<@nke&HQUp7*ks z(e>oAcOO6f+HdE_e)hGz`Qbybk@b+UxC_Gda=rY9^xC4Pi}<`>v+=w(4O0k@Qka2Qzq`$?=g+X&zdViX z?H_KqcxeyWKF4NMj#45Ao^5lmf5a*og9$?!B_v3p>gyCI3<8Dv-uGP|y-bN{fvs)< zHV|O~uS6n>5c;0YdhMfFB`Ug`WRD@*R1akoN`p-d91+Pt5^hxKBP|J4$-v1lPQZ~i zDRn8O$*;-17y7=(N6gBkcdgbK`Jj=e6vuaW%IeO6i8l&fI90cw^v5K47ma3vuFOpz^5hD_2oxS?qNn=7ubXyCcCU%Ax%i8S- zXAM*6`W_p=tYN1mgP5g+CXh7COmgEVph>4V@kPuOc!IGR4|R~p7qLS5U(9gzHsCEh#2>X;Vdkcu+oGR??4x-;+LgTskgUF53c2 zWjGWq-XdLqAo*P6b*p#PEH*g|oxu9Bry^#t1wPjr$nX2;Yr#jHJs1lTda zm9#9WM#^e4pvdrI$9i6YkPv@AKYvZVg4ScRx(zION3Pi)@6a}$L1np!;-G%B5Hkp+ zZr@*HrqFM(+Ke1-Hf%PDq|l2ICDBKn-fyRf0m+m!Kq~YQ>m=7F z+la&hu4e=J<)WwWODbY9=kG+>Su8nq=2RYxn*6Uu2ds**xzs^~YJpZ|zb>)E|9V@o z_)BW@gKs_<5QqpCq~*i_?ypq=qfqL_r~x1Z0${B!IRpZM5F%j$))o^GI1CvmOK4$l zIdB1rGuSGiQ^Hogjn)2$Lj&H37=f0}n}H*!GET2Olw(Vm3_~g)gl58xJFGVA0PnMCannT|6lmt zhn~v|UvQ4gzw&*&MLvly``q8kV+U9H^Ea$Mat7I-wUU>qGD@W3Mv^Wm>}dG;O}6QR)B5BK&s zym}2%Vpy*UyQkP)^qlP@H+DT2ww7Fb;3Bu*ek*T$%R7)ha_0Pb_V-teqq0#&hk>JE zWbg10`krwEqbec5sFne&Etl#+8pg>Rs3T6M?;(H$*xB06b#6vNm(vh)d!o|D10l1d zhOse6)~QhvI>8xKX0^lNqkB=p1WK7@Ppl9N3*?0B>L8HE5(6zes{$ugHs$wOkp>38 zrp`9XAP(gE-1p4A1OiwEs4|@%u+dPfogOQRd~OJ@NpWC6u}Y~2d_Bd8A?9NTv;Ydx z43|#!F_7qx;u$98p3lci*{80IIFBxCEg)gQ0B5&pF?f%Qt~9ihODhYInD;rBq(&)z zToS;~k3_JP0O|K3? zVZF!c8_uygI%0ir$X2&aT#jU|Mov#u)(oSe>wy?L0LC#9Bba&`Wbw8t*8!I<#|4`) zo7@M1F3Jp)$oFWB;$Z?!!%z@XCBTW1%p<6!oKFQUfUFsT7Tl=~T!Lhor>3%>0_HMV zDd(hYLo)CQ)t?M8paPxdfV4SK48gozp4XRZ#55P19Se1|fg2{(Lqh`1_O(WJ&wa(Q zB4v>3O(ecgC&}*H&WqskbbX%aLzJ+;@BOQOTT2IOOK2+p}6N`a8?(_5**`Vk#gsxPNd6wK& ziUUrSrINHRceKd;nlJ>Z;L)7O6+)?IgwV3qteLV$BmR48sq!BRBiFyPHR@l$)a5pf zpPbfXE$cgQS*4B2`=a!*BnWm9DT6uE_n?Z~5CrLPmP-&t$Hd{0u^Bd#@8ItC$nMrQ zi>||*#S4Y8Bsn}K#OZfG^gSVl?8T{xG>-Kd8WjPx(}5WaL&!Q z=K~m~NC8cKJHD2)(=mmX`6O9JYHTPd6h_0WBH}(;LM|~l*Q^6ZTuP`=*;88g6SWy9 zvZnX>arjJ=%3N0ULFhWL*2?YG3QJP!x1HQ}tsY(eOlbNobJ@4%umazENVT(2JmhAd zn-u{EKGjpYTL4RE;Z(_h)*}n*o9a!;oYBkU6?>e)qj{SAY>cS-TIK=PyaP4tA_V3h zmBBm~#pj!!ci&fMw0%GTScRIo!}%NUq(9rSr4R7PM{e=_XWm4=xyFZl)JL;*>v?w0 zoZ(rwcHFZxEw%g9}hW)_7yWh%dzy9y=?Qh*@ z@vL|8yD$6&Uj3ry@X#8b^I^B}v;XNo@P_wX!^q|E%3~Z7czy^((Uv+n>Aw&6j=1>H z!(4gZ&D{CC=kuKB+`_wlapvBo14k>S@>#$C&+@siIL}Z1lRwW7z2|`E6X-TpS4};Z zatCK~xX&ZN(`<`g45OCKW&_;E!w)~e;odX2{f4LW(I0d>?|kqYPsHxKUal9B_ZF0s zrc>-u)hBw0%u>p0$E4L#%j1t^J8k<3P4wTJVgfE2SZ_95x%?Qn+;omtyzIri?&p6N z!|1!^Bvrcm-FHn!-#d$*tq2!(wz12Paqj77IKPanETO<=RCdmuWhiE*o1~1RO^I(R zWK(gI$&Aw^l8WXY2SU`!4>X3-SzKsAFGs!AFQ=mbPJG9Ocs z07i5ipa4~n|Aqh#mPi4TDjTk0ECDfu7KExvWWfj&V|R6#5*QV%3gTc<1yV}8)zjFD zFI4{9+>FI|)sR@{dq-W20z4@ImP(RPE!C8D78{@G`RXHF<+VTvM4aZXwQCdvQGt-9 zcJ6qA_%YEYS5*(Jln}H4LP8`n(E1ok#CUFSE*6VC>S>v+wkXtEPgKk%p1wU#Nt+uQ zc_$^*(J~QY`K*@sbFHBZIo&aKsE*U*G1AU1=!)6DVbz~&uwwk5=(d+oJP=HnQZk1$ zu)DRx;n9Zm;mBf=q>K!k6$?3yjO#3$)d*35NWUge_a=Ia8?P@HS9on!ckmRJvIf-q+!&}yt<`A1f~AQm%DllmQGqVv!w-x^cd2Q zspoBC7GOp&a(^@_vKDdQx@zxq((ubM`~O~-0suB1Ay3*^Qf8piNgvlau=hAeQ2`6X z4Zfe)rwEy;_?-BGOLoICJ7#&2e{dcYL+Q93R}=#AiO-J6Y^%qBSK>f@sPpGuT^MkZ zq4P<~ySGy;Spc-|xnc(GR{%O~8Q6q=P5#)BC)L7$HF41!Cw4 z!Lnq~oMD|nn*aog2NMu1(nqkhFqpFFUEZHStpM_cF%=@q-dHZA$mtyTi^O0A^J~%- zpute>FccO{Wk9Dun$3_3hLCXP+Mvp?8HzWgOl_{Mz9%d@+~3$A(&vMiSwl3VxtpX1joIdp&Zal5L z^=PCPkGmZJIQ!gB;Lnf%!I{10CD9pA_se(DW;%|HB;eB4KWF#qWX-%e8HdbwVH zeTw|rnsGB7{4orvr>H0rv;Wc#!lnBk;$3h2Wq!-YeH8cJdpCDK^cX`@B=lUpa*bY; zbK6^-j*;DQ;8|xEJo|yax|@E za?8G4i;&q(DOo<|Wb{5_YvibM%N+zPgFt;BaWFAy0tc;%@o-8I@{A(GD&8N?mYVL{ zh!;~ut9e6V7Lh67ZpJDpd!y(k13U$I^JG2Mp&0r0h#C%hCRJh##SlKRTCb7VasNY) zant$JSQ;5FAJOfCbV}?5OF9j-^gFwZ!lFs10W_5G>*{+zS490+jS_Jk%T@loMeSFTwIuC86LyEf9T^0rz~u30sd<;)~= z^9G&Q^{c&0=B54)%_MHe*6p&>8H*AkCRKKLm zg0hqc=2Bvl1}u$4*#Ze9Q`Vb-uInanD|QQS17y30&DePG2-YOoVbwX%=2yteXMTY$&wgvwY$!DWi-o}d}PN}8HBQIUdrxJ?5VC98m&IZ#H! zR&xMs_AJW#)v$zU0s2ti&qF}!=Z|;glV&{!vZPJ_YwAAsxgk&Di#JaxY{4t3f1Z#C zTlb{Cm-+MNNj^8d9UM-~EU|`s6R1V~y`8}Masauo&jlfsd+Y-Mz{)>ji_mfP(nTJ7 zbOpd8Kl={u`=k%&Wv_TKKlG#D%%gXFIG^x}ml57|Kc+nwZhktic;$203?Isue&h|j z{d<3sU%KxsAH1{0VzFc@2P+P*9dhdje++j#?+PFM;Vyoe%oZ59iF$Jv_WQ$E!a7Pw)GBu&AFRzV{y9Y^w}G@>C_|a@7~07UiE4|@j0jXrvLnd zEMM{|+_Dhfb{)0FOQT2(SII zALkEz>F?vE&we%!J@goZNscof2ST(dwdZUXxOF%3st`0sBF0!uqbUh6VPb_P&8F1RV0&wczyw@b*Re?> z{*W7nF*h)~n1Pz42-youLUcpd;)M`0z*HoeDLKOdVqrifO-1^Ys^KJL7FQbmdgafT zx}|FvRv{oLp^<|c=2FEP7aYXt*4e1NfC#FUg%u<~ktzz6+FhyTkTg{yQiw!TPZcVl zLY2AA`;x(b5JJ;5%Omib zq#U!i4D&gPAutXjV-TX%YjpMMJ}-IE3%PpvGDny8IKL~bj}C~-CClmjE)W$ot+CC3 z9v#x5Ja%c1M<2Sv9b0F(a_{||yYm8s$Z)s<6Yjt39&SH<8|$I?Sd1HDi1bBLyI!v+ zCYzMBEs@+oK_F?uT>mnZvs1yJ~ zpy+*Ri&W*}Oh!>xXj2K><5!pbk^#6j@DHo^rHUbPvX=-2EVNnTlXyMWtQ|p+85=3i zy|FyI2{V7^*COJ@_tTi$W*u+HJAXgx-_`3P2@f=%m&)X`C+vhFc8q5j1*8Gc85^m1 z;b?my-SFD#b@5VsrYajCA%5MwI5=QRsImMf3|x%F08l{brsFS`%6h2+!$#Sj%d-?H z>pD3fWnuNS`~Csa`0-RHy7x`l35DTnKUO;I3=Nv^+(^j%LVX4Kwp!CK!Q-xugK(WO8ayPAlNv!)}`^_anCJus+Y zM5t`sEHzB|uWA9Tq#Aov){xY;j(GQ)Lf&okkr11U#gsE_VRQ z?I7F_Dphc&^P;Q=>+XA9xS?eKZc}0Aw3bb;__AfIi zsMa%^s#QguSFveYUqG9)JX;lr`=B+<`NqxsiM@E8?Ti8Sb0#yQsg=K+T&kqLUfX$T z=V4E*NO9@xye^y7L79?4oc>n1Y2aiAdG#36BAHDeAOMz)?Co9Tp-TrSOQ7iJ?)`rL z$9JFS+~lQ_8e2v>$X`S`E+(|pSE9D4VU@+05>pSk?3FX6F^ zkFmE|GnJ#)^Rqwq{k-tbPva~8)H5de&ecoz^XRpKAAjBJdF5@N!XNn3*Kn934?OfR z*Y=Otq{}?^*dvzpYhdy zg*$)#`}o>#{Z9V<_uj%6ed1^EM_&GEEEgj`@gKjD*S+={pZX_1kKb~O{-6E$Mee?K z#H}CoLA>aBH?w;95l%hr#eDkbzmlb`dFu~8$UpwyU&nuX#-HSOe%$Bs$3CVvIEF)eaz$OUyUOwQ;!NAL&`yAf(*0=G_i&rPWNeB>(WrW4% zD$h87CpTTVz}3TRT)DR5)|(cSmxP3E(g3Tqu~FEVa9#>v|vb|tB&3nY)=Z8~n=V2B|Uf2>sMkJA)lWEj>+X~4DKDBh_LA!hbf%BJG6?@^IFB5V+2s9s0{jb#sJmbW2* zl!V0)NEi}3)N1MvfQ}>5MTkX)Ct74`0ZX}|7yAfgPYV$;s8kwxaS-`jYS%yL|6-Arc&1E}*3VL2O#4 z31ZA?M62~7B%$vXBpY*@AD+gQP#uXePRA63OsQ9!!z0Ag9g$*ezd=*(c#H_Q-*PiY z7w?B#cUc_{EOs|6!a$5WfJ|VM9__Pw>=KLh4p*-kdwXln?sTN}0Su=(cXo%JQ%l$g z55Dsf=U@Ij)?OvN(>qNhY!<6}`wTBS&2 zTgFRDBX|i?7!7$|(Bi{J-XBQ{6py-MhMZLKa~fg?<-3l7m3^`x)t9BnN;|X#kf-Zk z#n9PrkTyY(Fq0aE!V;j>asWkMi6D;Uq!B`FzB~z`oR?62vHUp^rFv4#*tx6Y&HdS^ubSjz{O*FL;KzJ-?OQ$&@Y4tL{0Q1q{i<#m##{HfyhA`Sgl8r zd#h2~tOOxQbffl}$5UmEs|i{Xq>B)+Nk(?vaH{QP0$5|n?!W}iK(A2kw5zohiq~I2 zGu3KnUZxqGlEJCg@Z3NXsCgX;1so7d2o{<&T~k_`Qi3@;*ejor?>$mg2zy8nhBSEL=MZDOCU-{nu z$Y1=C|H*REA*KwQ^^}$&-|%<&`TrO>b9R@TZ`|dbZ@+IcKbMF91AqD#WlG}8W#IMS z|DSowYrli7MIeniIbqza*`)u<-}r@}<9W}C+Vl z4CIXELEJ|nMB(z)EBxZm{1l)3l4tSZ&wo01|Hw}gw@$M<+7K5@&TKC@6ZSc?g#Duf zZn7CHlp30*z7{>AP5@6)F27 zEf$jx#AdTD@+U0}Az>VI$9FZXv0{cFoHaEj`n~`@x$cbkVFdWdIz&;-P6fQ_8`}jZ z3ed$GlV5QkD&ff%!I1KOHJ<9CjXVXw9@jCcMxy7xLMQ+lPp%jsC-=M@Xsf65c<(bW zt(mYK`+@czkn-oGV@=R1ZR-pAqi5^f~Mo{l29p(V^nLr{Zm{l)T!Xg1cWFVaESuAS7jBw(Zw*e zKe{f^M+j16nGHCFSY`FJeqo-m7cx-fo>MKWLv-f7CoO;hK$UuCmQ!X(g>LH85Icwq zLdt4yu}TrOe7P<6J~alo@ymMezf_hlOp(ERasf#%Ps)wEbG^UT_m z&%k`(JE{8_@~Z(RYQWDidc1Z(zR3S*0k!%aL9qIvT(3)8=kr~PUe2kt@9_GjMX1cFYQixW2D*pi6P2dFW%dM!S{d{~9;dEw(h`ETb@5bvpU>obvWnAt{69PcyPc&542>iHHYJ@`jl85 z?lG?el>NPT@Jp{}Rz?nIJM)5Pp60pXUHsP{e;aol0rN5*v3K=|V@uj_@&5a#2`}eQ zap{qt<-h#YFY(U3vf6sZ;hGbR4J#gg=)q}fi;V*Z*RGt%Zadt+#v6Y5m$_cv_W;)W z^VX=%ZvK(5Z1mmI`+nJaFUbE-JRWHOcng`g1?d zhnyLB@hum4_PJdyCgU*n+<5*RrUN@W3vRyoJe#!P%#Am)*h#$WEf1h!$-zdsvfi+< zz?h8nFc#*Jphk(A&CD5w1Q^S{L&wZ&u>$yv*#{zP-xh76UeY%8(64*mwkHM3Y-BE*#uxCgrk9yiH4-u4>>?y5JxLTC z9O*-T?OLkL*0BQE<#kkzq|RnBH(}3`G7|!!&Xbnq5%7`U5JNeZ0=Sj)RFe?%=y%se z#&N78@K`Z!FMeobKQz=OjGojKNNFHxG5&Y5ff`7pm^;z+i|mOt8rEldo?)aC*B;^) zo%9^74_PjjEJe6{@iA8G+u7T@!Wbhc=sFQJABU}1XcS`TCs22FxaOwYpN0-MA!me9 zB64-$%40{wbQPYvWcP*}=(;7uNGL%C*~C3mV^SstOe*H!&K$)9Va1|d{GpSCe9?f0z4 zaUcIXtx)Z|%6^*>lc7Pu+Im`$qy<2#LZ-ST2a7@1NKNY(}h;9X4DcmvDh(S zUzn|L`Zyj~k@mM!+5iDs@JH+U6+K>$;>&56SyqAKN?R)6g9@!2QM6vo+EJ?Ywn?`L zWq?gV72iLxvG^vs3{e|Npd#w~H1hu=s@n1mw7%Qg;O7eErC3ZfVhPm@!td*y>UE@j`0%Em_G7>KdM#92zd zS9x7RVAMD+3YW~cPq>j1MBxx0ITz8pEthF9Q10oPg%!Kj&7}vR|eGzzj3&%Ap7G7 zL0DyXpG3f_HP2h(CsVA%t=KA-KQq#omeE`9qbgr*w^!Te=0I`&O9+MCF24}~tn1}X zKm0xXsUP_s#-#kZlq+xJ$G+`t{|_~y*UR;CJOnPnlPy)s7x0e73B~ET8BD5%wzPH4 zBVOmka`!uWBD}12I=yjBI60-T7z!sH3z$$S-eWfO?n8$FLwTrmea|CT_xRsG_A`9! zM}9aT{lPEefB)pqa{BCz+<11E!^a-x{4FSQD~#iBtk0V(hY?(3mh|^7QE>uvqjHII&)DNQ9C& zX!MH?kz%@z6w_}b21v<0ph~1af=C6SoM~l6CZ(p%`kD5@JBmRf5kZ8?kcyJm8^_}i)!SqMYdNZj@c(G#=P$iR>jCTCcjVe^^84~>yuI{EV+szn`MC2 zBov9GvR)6!vMKXMdFlDzM&wuAp0H ziH-=%^XEA@c#ISdId|&?(&~U=1xI^_oawjOIe!+qz?rk>**yFRx8HO#m+yHP9Y(A$ zpt0Jyt+Cdj8gmCvt#T=ywg$*G74?`Rm6131{Bx;D*?uaXE7R}Iz2YOUrt`%J9a_fiPlAd@HhuLJ2=&2OukRH^S}bMjML*r>V2-9 z6rW{{iN94N^*OMmfUiUSY?W6zi`C|*7YVI8M!~9Sv;?8O)?pSHQ&1^;$ZM z6KX5l^#QyLVkXFz0!blcm@R2&q~aBDPYB5Zs+DysK=Av;K+su=W~kCuY$gZG`^{XM zj#BZn7Cev&Owq{Yw17ty9IF6}`F*Z)Ioh#3c9Q5)cCqCCDGvAq)iuBad zTy$waU)f8wZQCrjCr;iqq4fi+(}^BfHseVcz!OrUgxNE2W?>)dtolr@&$fEM2ioti z|D95^LkQOatoMC!jq|T#F~j)HUalAS0|5QMtf1rVGqJhx*NT@xaXAvTh_1$DEm>_F>ZY62{vfys0;IlQDx#Z%0~6$lTvSh z5R63108x2B9&Co0p>e=mI>(AFglqR*;o#@r$jhJm44!q%O^k7Y3~Ovi+<40!Bw6zC zgO74>`(<`dM?$~NX8(|WvCFu3h!Ic%(g~U*)3rl~l2CF=plJb0LPx)h48tY^Dq~(2 z`vsfzimnTjPtei&h*68tCjtVCev2S54l9D>l*177`A_3O*Si!?Q1X1gw)I+6mP3|z z1;){c-2$v6ip5YQrGlvC{Y;hFW17(78Pujcr2<&_cKmhMbGDYt@8B2` z!Zgo<(#3qghCIYrfXiy{Y_tuY`oOR3gn+7_2Sdtw9?47viwekBOYCCttuVZ#lqhGj z_4}CS2aGOO)7i~tlRd>GWFN5tg2k@*E{zVH)e%Y6gqnla6+96ledy`J7C|Drr+0bV zyWh@-e(-Zx?hkaQcG=!uf^9(h?BixJCvl!X%W1U+ zq=Rd$_pfp7>Wb&T@a3reGQ)aBzt}=Cia6N8+|pS0D0Rh8s?8WTLXlzyap1K8n~fYX zIr=o%cw()%#HU$ z`x{&BU{o!yS%6?uD~X&AwjKj+X_FR~E5QU*s;^kC3rt$Ttpe5H!3weUJ!%@jQgNG5 zBifzKYqJKp1UE1ip0JqJk#Cb~FpqaY19%Cv2o3X|QB9J>lND#@t9>5NSl2R7qf*e5 zl3OB3nvoCXMR=yJkZje4r z$#?guF6EeKhS4IpBw2C*MV1W4o>+*yeH`e!k**6l*n>t2FBzcgwF5O)Ni+La6mwZB zN^1c`&7LbAdm+fNo$w5bm3pAc_B9!!DnqgYUDoa(UOdqXGrz+)3V4w(Y96y?R z+o=L4T0N<(NXylHUn;XYS!EvvfR@#Q5oiHB8pHPdmlnW6D{G3m(zVtx^M;zK$Lf5n z4sujkom2oz=fI-Q4AI*(PG>z;nWq+jCK*&d&e-};`TiVd$zFj+1ZYDuDp?krF`qD= z*!H|-8~Za&aPO%(Y*ZUm0y8sx!OP5tODa3K#jh&sE-$N#>hhELQ?pX<*u;INXRYeKSzFy%f|-PW*N(0B3u z8^F3=u9xe@9_PKh{{V3@)W)0r-x=9^2|;Gw8*;pvp-D?eKX(6~Seq_hL2L3k0|Ijb zoyXxHsFAvu?kIq=^R}xybEzJPqrYyz~D1Cu8aDxZ&_{uEgQbq^*8U}fYbtH4pkx_M$Y<00?YimJ_g&`FK?9%~M^2M69pBS}+)vA}V$L4X(s&CBYMPl=F|UUSswDv{ z1C<4IawZiHnibYom8z&ImVWi9Uj=R56uu*Pe+M5WC+}|o7(~DUQc4E^xj;t0J*lT3 zMnZ^XTS|x>hTvXQeqT$>U`Ly7Gfvm8CY2FNOm*Yxle{5~B5{G~nCIbQ5~T}L?mjShlp7!^2CVRnysClWg1zpjBy<~rIE{*FLV0*4Q!n~!((r~oAtE=4u(Y7 zJ;Q|y=eWFi5Q!lJadBCI((Kh$8nv^?e7~n0V6UK&ubY??b*j1UaXx+K>_#b)v=A_@ z09cgAf&B|e7(%W;5O6O)3lRs9aF4l`^-usrp@RA%QobXh9&-yYHLO|C8B;bkZzy%t zYinY>x5Wn$a9yR$#&13dm~^dQln*k@S-i&^)wa!ks{*GvFof?;3&7CT z?nZm9rAgLm&Sx!3ka)s#&#GB-Esw*nn%7+-#ZLUZoj9~rko_lcCpHi}VOf|hPmjYA z^Aj^S$I&X^6Y_g)z*7%a(Gj5Wmuge3gn7_S3)-nOAj`Ju>RMSCIAE;=|7{SP)!h0& zc@>J5eK8DiNoJ9jIdJ_xDiw?hv3V=lm;xsZwtrF`Nq{i=IH?h{%_oxOiw9@PXY`RY-G=Q7c!9!@kT%iHgsxslk zVhzidTAzr}GO*C{dd8v>tb%G~84fCWl5qhdlUAQB#Nl3M>?tZDHLdH{rJ_kPJGL$V2cH-P2%mB_mQn_o_2Pd&FX+VpME=+5B9mX zxy)yN$P2g-4!HOJN4a{mVU>DT!-z^`7!zh$3O5pppMapvUr5=@r=@6PqzS+>C=9Bt zttCm*)IpcnGo&>bbY09|SjibWQcUer1$xvUc0LlRbOxkU%;AeyQjxKldoKh?mO#oV zRPY2RK}upD<_tO^c7CmtG>(KA3kxU^yg}u_mM85<-p4A}_r_NScDyl=(%`pZ(^#v% zCK9B81Oi&+tcKfJZ28m(JvXbpuSqo^l4iJ-x71KgBqV_HO~eP=%EYMP~?5>eE@Th5?t{^I^t(=m6k z^N@LZ2NFwXBTnlKh;)SFca_qHQ8$>5Q`+Fxa*Nf$9u_)G0BSmEIi{Ri7^S2^MkLB~ z&n~yOrtPQkkTfcNIE9Zir(r<4HHa`CK8Eg%>_4)C?Hh>aZsvivy_2v|c5bv1!&A8jn>&{ECZoUqcQ;6O7GO=v=KbLNlWr0 zZGYO?t<_`1OWvf`&RY<0nWY$G0fA!y0UVIB&?do3ZP+KlB8XH&+v+1yx&4+54PfPa z+)54=ZSDspsSv~Q0}Ec}n2Au40@KoY4`tsaA0xBiJ@YpqfPcRIO|}9W90MCPh9T7i zewHQ$a~2(y1?bxo-)sf)gZppIqM~X|e!Mf|V*_R*>+(20CbP<(FxIMN1pv+Hc${6B zz)7Y0Qk_u0>f_fX%)Haub@d63L1t3Mnil7$pf2+&Y6ri{u8I$wU&2;iGzaypGM{Rv zt^xa;5J~uph_x?XEnjf^+_uJo7tRu!$VF8hG?jDTkDx$q}2|t zBxhSj<7ElK?E5dTD*NYI{l@$ZAy|`F$&2x5itr ztT6*l>pD&YuGU;y*+qFqg&ZsY5$3O2mvn!Pzn?vSUEOCgQ>jY}MLuErs`>p}SYtuz zmi#`hX_pnmsd#$J*doubZP&WphRsKX)%|18$TtxPv){oe5PTW2hINqKYp&i80s#e& zZ*VU+t82FWxav|_tw21zn&9e|+Lwa@z>blwd;j&ox?ZlA>%~W^@ZzZ+f;?#t4-oU$ zm2P@s@s;Fw;7sJb0j=5xTSCbt&X@--C#o&ZTEG82-mqH;;drkUK@jtfI42aDnKWA6 zX7y_F4rN`}Ws(G6xqvEy6_a%dp?D{4vT3y#V~DKAft{@dXOIEwj>d#apzi`{OeMW8Q~HI(dbJ@G>6Ruf4R5A> z=ocNUqoXW4Eb;p&bc=~$lz}amIt4IEm>ON|QPol}*q}&&Q40Xn7zqdI9P}xGVkC`Y z@y_VV=xg>LFEyYLM0w$T=6uQhH8^$qvA{9xersRg{wZU5a)?zGfrXm@b)P!2& z-6erkJfl<%vZ;4|ty;hP?WhWCyGgjguq0bC+Wk2m-_aiFglxg(7iTq<4|wH4?0 zmx-VWxp#@&b)KhrLw!|+3NZUfEr>4n0ty9rdw%fOJFo3 z0wD^PMiyJ!6EL>5eF|NTbf+UK2|~=wqI5JRT`ndNZ%K?>#Kp*{hiukI+;+#!T&-lH_k;AKu+uLYy1;#Jdk4>a`c0FJb~V~`Jv%b^NIlm@=2rZrTm}m`P~|}2 zvJVC5E#Rp7Jysj*gu)|gm~~dLnl1#;vVIydDNVoxF*rb70b4bLX_=u>5v$VfEO{}4 zju62c#I5X?l;3B-II~EdDFsD>O#-Ubk|`if2S0}TyErpT5~`meG$ZYP5Bu`A<5tO3 zzgjBd&j(XnA}ASsu0T(qb`Go^2+C~A7E_t4OQiMM!J5xIi!nA%9=;q@=0@xxPXbc+ zqb?7IFz4pAqxoVm08ug)Ok4uF88YYR*%7E z-c9Abzs3S22ki1B##3HWGSX-Szl(xDa~vQy^3Ri@gRp@jC5Hta-6+IReTM2_BUMfY zm{oA32E(+zr$#cD+B>jOz$_{2v`xqYfT>o12n#4uQj!gAIyc`H?;?ds<}seVB%^9_gIX1-Kv?RpLpRq)H#I|0K| zntQt#?pH9UZcAohQw5q@aBD6zY&;$70KmD~>4cscB4;6T>vRFf!oY5)`kK#K60cT#- zeI0v<;r$lCx?ZlA>qQFwt%yHzYy7a)0m+k!Im>mvu9fzZ@VFng@>hg13BcUz6x=iLVDBUVRi)<-89+4uq(+q%gizO+I5So!>vFRH1 zU1Tf(pM#s*%Vl0A22bsCsY%1Ui0(_5S!5FEC9vB^(q_ZaFk+S)CtW0iB@SMt1l{yu z2F;AN2$+r>tv3_+b#QRV_Jx!IgsvwnmuT7tJtQ4LzqL)+KF_6x9$-ku`O_WUV&v2< z+oXFQC5rIaJ&&>6-|*t+zl2}>#kcVAJ@;_uGw)>YAYlYz7a%~&W>n?AuE1_r8jOK* zKScqTX1ccul@ed*^tCY@qw#Yl;)0@qygY;= zi6~Q20_9lL8?bfcG?aaXyj_ZaOk0XHQTK?U5G&>DsalxLBVQf5f^76^r*yD+7Xfe=7) z7)tfW!ytIawF4@%Q=#<-a$qJiRhxF60XUmmW=trP+OgM`p_RQTM*xC@Kuwxos_i_>C17KY**UR-Hzq&zaPcFmBcxp-o1b*#Ds7_sX&GpRp%8SVC zD4#@`@1r(v1tUoC2gG|>wSbkWcw=-D>0)Ftb-s^SU)kqXFL(hro!a5Z) z;IT&@V{5Ts_lBEz;GGZ9$0f1fX4s6Alq&Sg3~ z24WN(j2gvA7-kv#X=A6=!2~3;WrE<07xybd$slG3?paU_iEF}PN+XS3NAWqUfJvt5 z2ZEIPCD$nk-Z<(Cm>DEyARs9saXK#|hJ%w@fX^UG>@sk;9`k*dMuSN849UP;0miZ{ zaIuI)gK^xjz3jPq?GiW1naQAi*OZ_`F?&v|R{Lz7x`4zj_OBhGx?pj7m&2or$QF~2 zmL4XK9zNpQ)jiHGuW|nL4)@-F58;Lz=}wQYye+R?%j2%{V8 z=JW0MK2+&k6li?X0qZa zf?`i5T38L{9&L|@x`pExiqpTPS(Xeh?gusZ;WATT#-5t5gCKI;a&@M`?0nb3s`efP zof$TJXUx~tS&F8$U|OA5!MNFeHXTH-*O^5HrcDpU`shGCQ%39vQ*mH;*bu;xThS~sL-nQ0Zli9!f1NvE5wD+O`eq3T$B@SdIgYlagz`9~W*>_#8;j@k!Na4R<|hG533JwyFo6Y_vM6TY4q8-}2qi7A zvVv3~;D($Kpn#6v;K))sPX#Qjk_@0AL^AUV%lo+OI)-s9BRW}L=jP_7d7hePi4|mX zZNUMv*2ujaLnsFId3z2*r2@kBG2%&k?yHqlNmvDioc$#=y(q+(_hmGkd1WOL(UbNR zH?0@6k(&&g0SOs=iyF~!WM_Me&A5grD1fHv*kh~>0dGWiA!4SC<1m?=8z7#Tsi4(V zz5-dH^?<{D#j>{(;J!`f4Oen;@HjYNrDFyk3#mktcSw2$OE?$@ZMvsTNsy~CacXBV z9jC9e8AtjqAezs8zvx+yX#(dKjjXc+Hmf5}ojuDqj%+P=d2H`8X}uwA1(J@K3H@>h zii~vJC`VUUL`^X6PYkfFr#*}JyyY&gJh;c%Q>XcrH@}@1zVNx6yWt#{A9;|S-CZ^Z zM@25%6~>+xAiDrdrl@4LrAdG$#yf~KfS`9|8kR_K{|EP0sUA;3s>C2Es3ihI7xMk( z>0fFQwd8fy(NU@LY=kmdo~qe;JJr>yiE#lEGbk4%mSq*Ng2tnyezq+0b$q!t>{zL) zJ`W<0oY)wGFBh+`f+K5Y~Wby^4bdrYYVwX>AP zxiz?Nt1_m107e}7!^F>7D^;xWz&Y;Qjsk=lwmRGY)&R{ge=o6qo_2kZW}1^NrM>o2 zS%J=&3K%Nj#}EX+hBYOV%9b;stfO>NP1l3uH3CX|{SluRurfPJJ6K;$@N@m4rcyS) z!67JuCp}vIU9>8V&qZndQ7&5<-1l{DQ2upM|CzD-UeVX`ht;mH6Ol>D0Gok3#jftn=!& zZN5MAB$NW$crll)P?7y7W?Y@LTw0l8-KMHrtehZ)^u`mkX*8b3x9EF1iL8!R+;HK- zG_UW3TW`LBMGS0?)@Xu$vBUk3U1kVjnpUedt4;O*+CMxZnUF>!E+R}mQlra}rUbZA zhkCA5X%p$jr0gH9kkDmgcz&kyhr(1AIN{}kw$fScA z^F$yvazD+Ws~f}n@7c`!+z`Bh9cbm?s&>pXBG0cQ(dGIkMZzp~&YTTKF6txBO>B7( zaK?fZIW;3v0p92!{5)6M=`AN`b2A8YE%Z7H4NJpBo%y~ zCn;BN_r_~U9QzFgFp{Z40-!QCVDffmJ7{Nf0Bb%W@;KgkYIQKCeOBRMKmHzR+r}Qs zks!8{RO?;Iqxv$t{>oe>uGGwlx zsnFwZUIy0na=lzH_C!*=88BqwWU-w*p$4&j>PZ)wwIj7Q^fSY$?&sXxy#=$3;w?mg zd2}qbG4bA(`MQ;+ChhVpk1=UCTN@82{Me>3vFsz;+gpH52I|)yyTo&!_KeBod4KOJ zTZ_o7&FWqv!7 zXnyYn%=?wjC`(H0gEys$?}g6d{ELh$rMm5y88n+=V#(DGcHV*dz^Af0`q*VdbJZg0 z6PEpgC|PouVysm1NCqnbvnqRVnU|6QCNnAsL7?v!Y&PrS>r+5F3{4|e8q+>1+KUvx zO)8L?B?1|6E8s)dbs1z6rRxG_GF|H!GgvkZBVAX&A8JfYF$qSD3$_*`qX~Nl>j{tw zT?WvC7}3)&$-vlXuo;a-wCQ~HahvsOpR3mnx#@;ox)Prg`(>6c79;W);LL?H$c?8+ zt3Ad}S)RF>x4iysT)KF`?YG@NF~YR(dGOIo+@2srbmc0c+sYuJdLy0+Vq5kS zQ+I7~5J}1iW-2U!5ZwRe1YZSD|{Qh!FhTYC@!|;TyHBkGZk5N_n3ppl%9NBkgOFf0zL{^ATa8VWffIGYHjt z%yBTGfRwE#l0}|;apUm-?Q;(~5gbD2{4$vxh45aN(0V=@XdoBYvqrpF-EIYhX7>%I z4L0b@oW0U?pywV|!5W~^>UB14;SIl6>*u9S2(TGft;nTXDWiDZ)&K_$d#j~#)X(`e z^8jk)t_dN{f$MVI?>h;hXN7300BucrYz(5cZC_TPJ&BN#c$tpAxU}A(c zgAv6lxZD6Hpj7ptS|i%!awuz}!H*m65h7*X{2oHUqGHnIP3< z+oaB;4J)D+kxCF$2fngYd^D{F?TEjg0a6*PnIA(lJ$_?9GwJFxz+l|0S+9;5$8}A% z8wbYC2E5)mBXXKI2inTZW|@CJb{(->G`0>#-)|8o8-hA0B%aY>Pmp464KLSY*A6&?QozhpK`R>r>2X@P*eI^T2dT#@6ED+ck;i5JR=+kh}*D)Ye~IY5Wo; zHa>|$SGIwc!9oIERd_r7iyWauBsH1 zQf8qn*8Dcl<&7$s@_`IsT`$+m^&&I0YMwkO{J$yg|AI)7aDbPyS zq_Dc}D#g*+4tP?Cgg$rP(}vO3NI2roTTXFq3m$vm9_}~=7k0LI^x)bA3|v_ajA4t7 z4veN5P?3(!dW~u->2?b?t2F>!=sd=jF^vSv4@qYSg&65VP8eJdBLrtjW$B(7rQt&! zEp6CxLA)atP#tU9qL8J1rrFe8noa>q=ptPdHbZi{bsb%6Qqofzou!6~K*&jY4pO3Aa^uXrZU8CC zkGT{k6wEt|8K@Z*iMi33$z4Vt!ZhDPaHIChO7c=rU^QeyO?;lNIml1i(+up@T zeZt4`x*z{hhSi$Ia*Nu+q~2RVumlo`u~6v6fu}qwo7~q!fX4r-E$YLfxZJ5q=LpqT zr6uhE)z?Z2>$6Yh{Hk(`NB8j$Op4wNBzor8=M#tv+qJa7QCbjTagIHci&93)z z=5n!CCJ0iV9WIM%mudCSYFIf6mNMX(kEt%RCJ9jjPjzvyMztDEn^l%cl_Q54fK}yS zsr)|06tUQ455!{{e&*H#+Q|64zWGRN^P4Fq&b)$S+O!d$UydQ&@Rwn>5?ZuTE{$c}6Yb_X;iTt&#=}A4r)ey;ZpzHa`aUuX^tQEK>rJgZ*n< zeCY1Umv!6>Bu$l@n6kXTeb#`@oxLh^wOwYj4Hip>Q0VkNKXi+!U2*E{P3)ez;7PND z1}Ju4JoNiZ-@UDmN=eGU^I!kPI9amRt9^E@+)AbX8C0!sE zP+|XIg_P8@aU9F&VR_&VBa5Bov^-4!Lk0#y4B02Ci=;G8%orrH-VB5o(J{Hk9`zKz z%wnn_k~e_J08;ECF?QaFnd&hT-Xs{5l6D7U8c;3X6SZMgK`={%V)zIU`<`L5&StAA z<@CU=BNZQ~l$3EjPN0l98?4B%w7gEKJnSE+hOs0IDnTTBXbq#^lB8mqpORM4 zLM_)J;wgV9Deq58Q{xZGY&I<{vKTvtv}qgKWt14Y7zhzeH3M4Ze1Rg19y7mB1PM9i zvX42PQYGa5*ReE6Y14_ycQe9Fxu)UkvdtKj?%5|35=kr~TNAPncSQ;_uCgz}8 zn0&Ijj%isMH?>oq6sXdN5QVL?r`g(G5?Hc6*yq~bH7=ZcI)T8Ihxh1uVSBmF(R$>8 z2Os0++wSDi2OrD^`Qi=h`Wt2visZoSF7NZZ)<4|~R9^So|Jb}7bIt1J$+gbeNVPnnvsOX~wZdZzfw5WD!klKzuYairda^um_P%BIwRE{E zM`>26-et8atJ{#!NFGxIURjeusdasHR)=5g_Py4_P(zB0xJnb-{l%|o@xf}2t=*0& zVm5P7a}ce9cA2fmQ(jWC;@1@rv$?%OE>h)Sb8sR7s1Gn1DdvH$=(lJKeFkeR;u`kU ziQk8o!40Wx`-uR>OVIsxyr=__-np;AH|B|Kb8tzFLQqBLOeSB~+Vn(DT0Z;DI5yg@ z0^qGjmNTxrGysHBUt0?R(3FZ;%)%7BvWD##1J^EHk&ylsDr-9*9!b-gk zs<)=`h#~di(tzVLhHWUS6>INFMNBG)?B@Mt(A)~>cKn!2Sbo;M@NBpW&N+o?ml$&PRS6&tF{S zCw}HlTw5jHzsvPvfSR0az!(G`f1I|AQu>I8An&aNQD#eJJ|ZV4O7TRb^^vG)P&TK9 z1==T%Nim})7d^J_>UQZ3tG2ONM-zNMDepaMdA8q{0Gw@9Q;%dujYSBAavtW9#;)U6 zRE$Vq+4lr=Vo&WXPjR$P+;;jLyKzCVz$n7r>WC{>_DIsP8V8P2;@Z)G5irfNuej{k z92y$~je)@o`iLfF91~p^i6Ip8@NCXKCS|c)5CxX~A_FVK5f(bsnMERWu^6@+EEkPVccj96un^pA7eyEqXW}5LKsnFSj4nxp0?PGWU%;ad zQ)4rxEIpIrX=TPD10K$($e>dJkDSu2DHRrwmP9^r-=e}4$xNbvpsD(IX;Q?<=TZWK zLCoM8A!No{%Akpm_o<6nW)_5LUvx~UW`KY)QrAg9+E{gugGNXNtO+LQI8ODYaX>J{ zO}%lZSjziIj|AK=3ksML5F#;uHsO*^Y%~`Af>gjb@!xj$>w1#k|gD zSb?PKUQr^u34&Re_Q51y@6IAHPK+uQPk&NWl|F0KSZpmwDNU0%1bbN^#sprDn?#gA zBuvYtB;GA!4{98(*DM!3mNs+*kPhn>gi%<8$ZG$PoeQS{qucH|bK@D7-4?^OH85)3>rt5m`Wg(U;zhFodGCx1+NK}eF0$Fuvy6rH!A>fsgkq$!2r&H@n>A?^W*gdp>bet={`vNG{e9e zliSw2T>?_Ch(DoE^pG^w$MKz1Fqs29jlAgb`2fqGluxnoYuuiz^9@j^% zhF+H!$FR|Cw!Cprnh)^i0ZRuUe6dKq{ky>C;E+e|dpG-69wWw%*hRb?w+nSf-R_B) zc6+X{R>RON%Eh-jtdF?z=>07E9nPM=85GpPq0;`SR{nxf+wF$cflT+8be2}Bqh$|^ zxSuGbU?2%iB|s)*zt+yp)uSNNMp=}0Cdnm(g|Q#&^>!Iyy$eo=g|9MpW~S@@uF6wS zz!KG8&q1X64?GyD097ul)l|cG#1q16h4O?pGL?lkzwA{wKZm3nGkKjE^xFp#1MBR^ z@@c>8|KqoP#|Jbkah6j{iQ`vbbzvEB+U0(7tf0sY-{|B&6J)aNx(2wUC z51ip^^w$As`=US1-~HQvk&nD%!MlFpO+3cUeDbG$DxdHX&*5o*;J5L2ehiE!UtawO z{xn~9>o4(nzxV$SU~#?t=JUCl0Z{VZ$ID14RzgXIeAx7a#!j>`u}9F4HDCHw0Q`$tD;T#zgqjSj;aMOcpmq3ak|1EUC9 zOwkwJGRG8aHe**EO2<1*>&Mt-zowXhmlz}K%^HH!rz5BlI%j2t%5;c@)dX(3PO`+1 zMwpMzPO>VB$+$s?^j+r(DOB!K1~es9FsF|h0E#g)txPjZiU#-$Qev<*FApJ*9AI?+ zE83Bqat!2sOYXZS?S1LTN^R^Ih?1F2QiqTnz-eWRK?2oYBcH3qqR;X=A48puI;R9N zbYS_Ks2O;t-O>cq4F#ynhT4;2!g9)K8V|(f#uw-y1M06aGq!2<) z84~XV)~IwVjk~UM5F=rvYSIqi%(Dmz8E`6KU+jg@cO_vD&YdASzsszX)lQ~ukOfd#Grl~(j0g>05Zq@3D9;NMD<8G`xTpY9?SK|= zOKOD`(P=i_0$6qBdTs!uc8OZ#xvpdF=8d+5kk?bpB{`MxRZI0zI;k`!yeA?EV(md4 zvuZeA1~>!9o@^|!gmBX8?i2GQ>H^alaDq>@nAJc99DHckZCO(`mX}%;pVfC~&Y!FP zX&7Ew$##JD_i842G*7i`SY0|xIIIAQX!CpFi^YIhG8@(0`l&88Fh>#OL|{TgX%ih& zY?i#I)*N5UvIL?hn>mPW$AF?DXq94}+!~!pd9h}Hn~rhCu8y(tufJb&Z>M&CJ9v4F z&~}zG=$0Dg^WnX1bjwMvg;)+J2@VQYBXtD-L3j31gvPtbP^?Pr5H4T2$hAw4PBMMw zM^xdm6J^VDysc%^VbXwSf-nQ%oLxjMp^FT|5qno3AgL|=AKs|J!8B7S$WiL%B4F4GDVr5Ygv>BMFpkR>dmhP#V(lCM%Bl*2D4;sK6 zwDQ+^YR%Erjx48>t&z#v3$nIKbw`oZJ+i#x%0XIoi{x2PHK^fH6WT93Uzj%>mpcY zG)(1L&*bJ0eJ*F-ybaT`4F?B_y$6Io-b|DOQaYfPK-WjalwnM?#YfZ46PtEEiO>H% zf0B>9<0@bIyZ->+{bO%p&61~m{NLgSzvXxF$N#^-!qvu3YC}<>{CbEbx9)-!e87mMYMlqrcbeSzO0bZWw+(p5%KUM)x#tc;9qfr3~ zHMuOAvgkUruz>u*m>StyN&_j4x&Goigep?Z+`AAb<8TqCWi_H-9B^s6C=Sd7(y&4L zh>`2+W9KUoWAuh3G4C)0+EM^2e7*W$4C3FR<^i1dtCh8i6%%<%v11cC-M6cD23!A@ zAV`deCbZDBy$%%!fELCWCT(L4lYr@%&!ZX%!?XZZo^)sVI71mRG^c(SAZRS$l+Yn1 zzFIY9mYGlt=y3)V0AdB4lp?Q;0o>eQBEwX_Z&OI4qN(_4nUvJ5!nhjqeG+5OW;2v@ zMq?Z{#fznD=#pY}RLj61mh{$Z*xMly&DHjNYh`!s^`$L*sfMTuGwvG$FNi8 z{$myR@cFY+QwOnQRS0^5lvog??dYE}Dox^Tu>3ZbL0m2JZwxdD zI&3)HzgAM3BVg}EGrk#gmM2)Zm1DQY{IfL$o6ED&afOci?CkDVzb}E%uwb$3X*FkH ziKEy^kp%k3qyUz6+j!_`jD&_w6sCGxiF5lpHBca!wKisLo3zTA=g(P(&#O5;<-MnQ zSH^99&IGhFSWirv^w({$07eC6eVqoJmCyoL0_`}PJTU_c9v_E|%nakDk%wC~&XErs z0PA^t{D;4qSML54|Kz`1;X^+5xA0ZJ<(a(xr{2l^!-w&Y{^MWar8n(z{=!+dcNYB0 zkNrD-*B|;?Zhg*c_-FtAPw@P+pwjWc_xx?X_S@dVEC1Y|;tQU!1%K$T@FSn_5q#M< z9`NwxD}2%){W`wu^H;Fl@wV^#TE6(td>y*`YW~eP|9M_~TaQI}`*;0w{=i@VNk06K z{3X8T3+~`hZ{g_|9_F8X&0ps0{`*gG$ESQEuX@$fc+1y)A>a02et`RxsXX|tf0}Rn zgP*`_UijI3#k0PZ7ypxg&+a?^8^8OHeJ#)UkWc1c{_DTZ&;Hx5;&1-%fxr1r{~^Ei zS=%H6!+k%)AO2(C#EXCXYxsf>c`>JX8vp$}K8*kN7ruyp$`|qv|GzKed5aA}Mt2*LAdfK00a$RUSCsRtUb#N5D?h>_5H(nFK-% zC+?@0G3AG5*D=YQlBP)(b$YqYxt(ox7m>7HBLt2PH(c9W@n}r!-gYyXaP{&&>tv|J z$wYcwZ4e8jB&cR)Q%aVB1Eg4e=)~CRVq{1oX*6t1&}a5j-!Cx{2Gt3~vLGZ&wQ(Fg zp(nqNp)qlv*icn>A7f9#oZ;h!j6@R@Hz+nxV;mA_^&=W5sh{S70+GV%fKI}+|GrI2 zT3BKsAJZ^kP>tEG#tD0IFDR!vyI+=-d#%bs0V?yaO&$`D2-nK^s{T4HW2-*cCwb*C zWP{om88(^urq1xtB4?DQOXiL10+?w5FdQ^V3d5$tSF~&as(h zW*yo1bQlM^5CK8e0XofQ_*PR9l@cSK&+`OeZFLJQ4Tvr1wzh~pV1W>NY)A-A>u~}C zmq>q>{k=V|9VYhgyUb0Ok9htIpUeI|_j2u_tH5bYwu*V{Nax^fmNFLr3S^f06u?0) zfMd+14Fg}dfM0b~T#KJh>pO*C-f~(EFBQBJAqOp(R?zsJ z?Lb*~wn_iYv86ESDjQH9=iL7quNO6qPJEkXF3j1UMrc60UIItMiuLM%5a#IK$zlw7 zZ?1dm12^;VnypsXo3%+&8rf_PICW;*pQp3B>;C$};9xK^OJle8`Z^WTE#7NeCR7%s z*D#kEd(mS+&XlrmmbCyC4Ump7E7kPh=1k9761E?eFRy>+%)vQG>r?AbT&43f@3wmH zwD-L{Dc}kLIezA`!3ROy<4md&I?EC&B-|~n4GC%uM5Aw0E z`3jzS=Q&`(%Rl;K_|y;I<@>(s|A0h4z2Q?|{l)zA*Sw5>`al0MpZd&wzU8aGhQIZ% z-^IuNiGRWG`J`v_&j0bBxU7MDfA&ZDZ(skPc-MoMSuU6KJix#Ei(kq2yiNJ!-}lG) z(&s;yzxhpnpU?X69lrU`{eS$ke|Ilm@HKypzxFl1m+jkL#m9ZrM{&c^Tlt><@jbl# zo<{(9)yr<<`8U81eCIoOOsPd4=C$v6grUE{$9>{9FaMAa<7F?t6M&u57kJexUe4_w z`T6|Tul$Gn@z1!EpZwQD@%z9h7p{th4 z`2{1@^XrTi5@vbA8wq8q%%19b6h-JmU|1cpyX-l;yT#73N7Bgda>1$XZHCQeVxmZh z&;|C7)?C?NLFid5wiyRSR7iu7l5%i(gc2Au6%fk6!US~nF_MZIdG?B0y8a$Zsj!cw zFim^LRM<4-njj765sE!+&Hsh=zR_$Dk5G;H-AhXfEjf)D$m@F$7)?n9U`dvWxj2L_ zAYCM>F^nVKqDP8vk^!R{lmtc9EW?ViD;`@}J_&U{%&eJaV}%mDhuM1k02Cm_+O^C5 zln@|F%j&CU(@E9uby6{`bssJ%z6%NU)SKdA1rmx8zkfC z&IC(&-Ii1ld32*)Mn+ zyQezFaZ?y>Ofp5645T8T4b8RJS%WJjE!Q-Iy{hIwD%y04ydh?$eqTWGBuQ8Sk(mJI zVH_D%F#^mZ(aZP9aDY-sRzHt4-{qNHrvfweZzxHZQrLMGq+u0Wu1oVVy2RAW<4Xua zIp)G-!+%fxIS|Woe^35BBF~FR{w$&X)`#Fechz4}8(9+6M!n|AnppYvHB=uJmn!-s zUXzPTFpLpM#h}*>pS2tx(-g}D3I$*hvvP$~soWVpK0SU3Vr8n&nmV<6S2HIc!mnPFwqX3BtAer?I`9mKRu)bf_q2==2@vGisRhuyEm@1q+qj;9 ziO%*%-K^RtEt4rwJM>0t8^DvADtn~X5K#gpy#T{NJij+UMDrx}YnuG?!AdPLn zmA?w&gEBs;za|Q#al>YH;J+R7%QZjE$Q;-=^EOSDh*jFzu|S=l)%w0IR@usFWW72f z2AX{~V#rehn^3@GbV(7KiTwMmuPODeYu z>y#|FTg~PZqbXxvue6t&37-r_bKSM=`Ku?b(;VBIpIu*NUPP=Rd3pcy@lru*ks5e& z;#7P; z>2=@5KmAWX!nNnTgtI%_y!~7M2LI{%UdzM!!+g$%{yskEGd_bmKIvALdX>-l>OV_= z{&uchJYwhO8|d~Hq}P83U-!qqh;Mv*z8L|otc^n;F18qGiYjVZf-**BeQ*GWYXFAL z5tlAr=GNythtK%<59TfZ<}dMg{>6XiU7Y4cAM>gFmDl`U9{XE=hqu1tK3;Xp5AjXk z@b%pLqJP3S-FYjgF5k{qebpc5+)byre0Z6gZh9v05ZB9Z{8BsIcEaMoZ}Q>|rI~O2 z%s@T3vE%V019fCc5u&qjP)ik5GsSeOr-EZ*{-ZpXD9+{?p)`2=t|N-lleqonn>fGI zV+YqbyIiu{by-qK&!X?x**V4jdf>5Z2kdW@6t-Aw^&IRUP9VcD42)yxu*NLW8j_+0 z5$Gp?fx;j$*2Bi-B82jHGY(VZf)Fv2JYg(iMARFH6j@jSUR2o(iC}>kIs$GcKKkep z!vwg1y5`@Yt3FA^^T-OILj{Y>im5siKoh#iI1Y3KhBTB!oXC*0cs{x36li(BC^5zw z=ACjW+Zo;A1ZAv@Got_rGa`JIIAj2(098q?w5g>Xu__I#0w$H$A|EO7#UQbdu{0Ap@mS68BUB(F*vie(dT1HHsBL)fk5{-~VR7hDc5Wj1~|T`o81znNwW3 zwg)0Cwze2Xr4t}z<8v)64#>c$jpH8ASa#QIJef;Tlx+U0&;jB(7{ZwEF&9jpNf1r!iMIi;S2Wm0@Qg4EB7%zlsE z3y-!`51Sdg#u->Jf1u2GSM4^M)dC|B+I7+D=TuGNrG}W8OOx7j|HNg+OqvK3W8<&rFTqgqo^LbKVS1DWu(xUqzi6P?Nk?P0haxvt+y@95>TD_$du-ZRk zNO`HgA8tE=55`n>me9y2=j<7qv9XR}Z(g`?f$i-r9(>>dR_irg*W~~oe=c%Nk(%0R z_5JbBlr*-?E2Q2Scr(C|+V+JeBt^XLde1nMpW{kpPtqo%Qs0(!W+*rDs`ZwWo?~U<^yqfL6}F>+Z?o-gO(@6g;obT;rL?nYU&JE z>D2T0fneeuZvJRK_>;eg-TkZdx4n|j|Kl%*c*wz~;|u@fXYjAz@Oq982C&E&ARRo$ zfhA5acjnYU0zin+FN?`=O$HW(&9DaoTpJnJiGD}uW#FOLe;@zoAN>GvA&i&a#n0Wd z)GnN$&=^8?iLqLE!kouM&Xv7CAMBq0G3EZHb?Y}EiNA%aBVPF5;z)1`ehH2f$U8> znmW{Ru|SJ)w+|u{po<+66qD?0G>pRp3N8A+_!`NSg6N&EaU2jef{24sMW$9Cn5qWG z1bRgxF~q4(GcA65Ml7;2$x-&z1t5rzW)=xtnx+s!?L;~lRG2HofT=K;GNgos0Mhyd z70HCBMPK?c9i z+QwG{bo#v{;>;$)%->r+=P^!`vk4tIlj_Ij^WC&_0*z8(=ENAVO$L=}s=gI-)(j|S z!`yOQ0)y#vjfYJl7N9LumU;%>lFQ*zH7Sn5m=dZ&AA2k*y##`eY%L<9##*(c{N(#> zeRRmt!6DLj&;^nRYaa!dh)(-stj3X3QRqw41=2rdPjrI!gbDSi-$lGlx00r^tXs1^4dE54W^V5Q#JWf0G!tVM<361fVNxA#S^ zyUb2*5R3pdZvME=hXtukpCHwAIMf;f0-pLLlNsr^dzU3YEs|$ zhXezaIikSj_(&fSpV2 zM4HZ&K7nAt^u)eGbpl(fdk+9b@)!KV5CXzk_C(F!@vD|0r_nQ_*BzRDJB(K&F|_-TQZzh;tO zYdJQI_j!@FQ#<=5`8D|A0LP?6Q`!Htr3HAZujzaM*M6N3_vG__{4zPgyDGF_2dsMi z$^5(9-n&2z5qVq`z(|!fZq|V3{u)9B32Hz^b1QoKTpGujdAB@)<%YLqgb(?U59Ui= z^BTVG+rEwO`~L5rWcx=)NAy!WH2&W@qs*Qy%u;5hN_g9wqXnL|B67}BhGRn;F;$;h zWVEhs1~QlK9glGO>;hkT8~CJBt@tVoS`T9$=IH0ap6HY+Uc9zrov9kxpfmPbNv(*t zf7|xY2`U|VGBz=ky3PNR%Ljysd(Ve`{KxSXpYsfU;&1*je*fS8_uL<|9OBRXhwtKR zKJU-+su%w?&hGT=td?{l$P~-jvHymjG2i~h_m+Y8#l-VgmN{^P&>AYS=Ze~kb2-#>=`@-6?1`_4X( zPyZdC&qv<2&p-X+e~j;Y7(Vh5`(tu z{?J?B!FTSxl+XX159K}I`Nz5U-Z#)~ZF9rZKAtcAqk*^om!IQj?*0Nk`7^(emwwlu z;SD!^8ejD#JACKg{4xI3&+z_Gt`~3PV66^$md+ENG$YF-Pi@iq&~4(!>$ZPmmiiDm zxv?}K`)kKC0*V!xSZ0;D$+DD=C+%Oa)^%!7l(Gw9m5pF!Y%a)7;GkP(4 z8(8ixICJI{`QPus@IfD-GYz?r+5b>gyNlJ#kjL4MwtMxfTt}+3`mw48DrAy^VG+@adKVSbgCVA zamx@@_q6Ifp{ey2tCB%ChsWq+01JhNou)>RsTLFS#zV-cGAElWq#%Z_m~WT$9RPEG z2yc`7?wiZ(MpO(fb&CcpR(a)g?#8i^GdP%5j^Dkw+SDJZ($@@-B{w`mwTu>`5M%-$ zQyQo9*2jpsSF;8}Py&GD?V6@?Oe2=my#pH7MrEYr^Oumq-V64ty*`o}WAUsK3c!K@ z)ql+lhA|;sKqa{8E`f+9r3*p~LMI)!+;}50TZK)4jP^EKv<8*&A-NIbv~Y7hSJ0GJ_Hg99$W=`83(tBwSB@UwX}90Z-r+-BzIH&@pDOYT9LJDKEj@X;lym|>%ze_blp+=UQ5<@@~ zG`KA4@yvl0vrs_h+IbK$REiOP2%r@JFDvAI_j#(bCzj-C)+h5gcC0l6ZoJEURuQbF z=DX_>*A#@%)N2xm!dy=8AUfiHgVM0LEOAn)9FFRVWl&|Bb4FIV?i9IjTTJ!wxG;#w zoMm@Hn_@(?n=!8DoyIT&rD}1{zFblT0b2%&%_%R=KK0k-%&42W*LzOpAv`g7 z_4sTI^L6?4FV@_iBF8jk#or^d6g@c!v$12~UppSeie`j4l46a=SvZEts^$AThwP69 zea#K9XDq=A^vW!-#*59^slza^S*-~%U?&50^8@$6v58szK_B!%yy!(Q;dv-$4t z{%*eed%lOg0%R=~i!z8guV_AN4vs@gX&Qv}@0ypn@2!WN$qCAhdiv}4__%xAlIF=g zEXk;~(weQe4CC289WU9FCq#B+7Cs=g?oxmIoX01u*(YX9RBh_E$KOe5?^WiYAy{kt z#uJAS95d`w_qUnh`zCWl_cuKQ>n!KDZspROzn`!FiP!Shg9E&LOL=IMbu$-MY#16OOu>O7&84^XE$UoEz;` zUlRR&N9O9r-0C4sXNR4{#`wpyS0nGTRN{wsA5CW#Lcsva# zN}%pz7dytXA4(vNnIY3fL3Jcs*aS%V;p*&`t-dFikTwH1p5Ed7>1~1~j`k1eNbH>2 zo+ADqedJ-b7J*yuxSh+__R!GhYdk1jP;AVA&(UVZYS;jop`;2HBB&8#d9bDdwd^6a zT5pK`l0_dUKOdFAFe(XQEG&)9IMR0uj0{@k^tzs|TTFgHLd@G zwb%n@YlFy&+EP2O^+t zha(lE@)$vtXb?rROma*FvhUB32D%7cznoqN$>+j~gs-1IAJ}YG$YMd)We^X^VBDBS za6{k(5zU`Zi9jU51o})y z2FA2uNl%cDVZA}M2Z@a9fqooW?H^7lMO(Y4v9X7BMAs3G%COq7v%L)jp7E^b@#gou zjR!8RknR-M_U`AIPrsGbJMNmU2_b`}K>`|-QAd}$AQr*2fU7oLA1q9b>(F=kJ1m-+ zZ$=J1C=Fo=5v*!$HC0BAd#fP@IFsl=KwdpKNFH+#gBW9gfOmwTqa=Mb10FE~M8u_7 z&Q^+DUa2ID8Vbd`tqYj};()4S7v}6n1fY7%DI~m;7yt)ooiS+zSPfZH;;gBlvyN`8 zohHlIKM3IGUMgF|sDOhwpd}TgsVt;6%}r4$^CS|?s>_v)F7fobYA02kNn?IomBlcf zKfGWlNmC==4u~`z8!gw<99-^v`LRW$J^3xTCdDjWu^FQUD6CAyiv!Rn7oD@`9*2=7 zVCm#Q!;tsuSoX9*z)oOZfzZ3>oF0xN|<}=x7T}at#B*= zDb&)Ya(l4N%U}L-p8x#k^C_S5Dg4j>^}qP>*ZnwGu3TYtw3-HHLkM%Qqi*C_rzOMm z@%Ca4$;;!c<@@TdPi8^2`{Zxt>xeW7f5!+`Z6*=sWDx5_>0SL+%nj-5oD-$yEyYZp zAR2If^S0-+Wi1O&Tx1TE*4g&BH`x2W2yhX&@Ed7|jK?X>A5(ttT`A??2^d&Dr@41gNpYvz=5C80|c;=-a)T8$xBI zx}}~&sDCSf<#HGYp=JP<982>K;`1Y3YI0R8uj0g{h$z3B88u(0HelxT;Hl2KpK}1q zj6RB|XJr{%7l2wHCMUArjU4emj!LrpS+j(w(#OuhHEaTG27*+-tPq@?v7w7Xl*~2? z2HVReedq|5*zS~PKmArt^}@lms|<&SJm=O6+8IdqCyoO;@((hz4jqhU5a?yDsh@+!b1`L;r2?!G;`(uUR zeo$^;4l!nPa#NxdZ!8^2W11Q7YSV+{HJOWC~m)YjH?u1057MZrdcR60}wRzN&W znWdIUjKje0?k-1%M@W##wBIFMAw)>o{62g%FmDzIDMqzLYS@W; zDHY@BoY)DeNJc8?PF@`@+QVL`?_n(6XYpcS;JXgG8;DC1o9x zyd7x)tad*VXp@du>htvkL$t0hHAU<}{zU+9|qn>m1I(;GPzn9ud-m1BMjDbfVdXTsN@-NQheor{YT^OeD>Q{dT zf9G%i9S5g;J6ybYk=MWe^?duce>-n{XD!Q}8Jlhfh0Q|<>it<$R`WDpCiDHQ4753n)b3Y39)-vEt1NYizi-tsGZ@M5 zf2j!T%(KgXFRKrjVh#qvEKO5pK$7A!=1em)L5|n8pO}Pbrf37hwcwxO^J-F~h)nFg zKlvyAG@tqE&*UjAmpXof72^rY`YMn8;!p7y^YSR~de@WLkfO$uE^m7Co0-bD{3X8h zOyJLd&WreMpZt7&;`R5VE&Y2|?tb^XxSM%_```SgV|Gn3-XF{LV)ez7p<35xr9D0X zf71NwBcuTTPvP>~(RmVjc<*%7QUTu?aOG?DUCh8$RDvb~%5tlpSRFPFNX!fjDL`2l z1FDb|0*Y7-FqfQUQs~i4%%`OYx1L>adJ);%+h^~}0XJ+dIKOj>{k<#Pam$Sy9_}+7 z9da-+9wNF<3}a&B>2<`3sj?ZBA&o4ywkIG!U7K$TqTVTER2YVY0kIQe7cy8irYY$# zSt?9|n2$k)5L?EYl;jf40TSaly^jk|{K_mF2Rw#x1hWj-G{B-in7XdR1U8zG%+x6| zJ_z89Adq6BPo2dk6wLre=mM+ts?;|N);9>0#KI7=Uzr5V&DK%(I4bf;qwAylXyt2MKsg6&Hp7tj zsaqf+c-m)?A8JW9iX^kVoPZWr|5XB+Kq~_Rfg%}P57}3(fa|Idl<9k#gXZ9IZz7AAFSU z?T*WL-^=i_7jycKJ9+2b5Ad|7-O1j;-J~?;Z5J>W_cg;ZSdKH^4HZSm>_RK|l?epO z@5S8jqG`aoI1`up`6xJ!!vqlTvR1zzf?a{g?9+WE)N zRrMj%62I@*h%;=1lzF}?idblzPHXC_nblPPdDOeL(dS?x%(M~>s5Dn=__59;IijHi zh6E5!C^B2*b)BTJP@r~VEF5nS;6>2(O)W(N3wpeSPz2Kv;Kbz+5SvG`w*Vl=nrOGi z$yjPTX0;*XppmZ+jSrOop7dwcr_Go#bMm@k$M|lEB4}fZJc3F2oHTW}fR{SR)f!<_ zPGjwm(w2&uC6~h&APcGKVi9{^H8?A)#9DgHO!ij0)6_ZU?@KI)__fQf9C9)YCUnXH14D{#u)_%skP15Z#>(ynhIEb1}G4Zqn!D1 znY0@}S^ed|w*|?v)~`(KfhrZ`t3Z~($@QMhWNKfW5T117jW_ZUAMp_rBkQeieJlU_ z2mUud`IA4z<;$1py6zb8s{OI3@4bzt>Hv=&%Ux1z_S-z$+X^T(>b15$JT~Y1nR<21kV-;7{wSyvazS-Og(bqUOHnc5uzC1BlV$J!olRBaf ziZ(!7>k~G+rd}m2IEH^7)ZWh|gx8DlQ~&ZW@Y(;8>!p_K#_B#ft@z1R0Co(W*-kQt zo&NyV4n+mftd7+F8cQ_>w9?6HSyU&+wayYe<~v_U)x88?MGXo=M~h6!O2=wz*>h&m zv48E5O#vg!(qu|4h9|BSyOkjuk4pg~LS)eeA|t2zCCd<5EP7U}HT(NVbRlwfcZ)6< zqb9bNTMX+pk3ISrXV0BuRAFy5GFr!G*dUB-FMEcODR^SJ*a0ivPd*4A^2l+Nj+8P` zHK=7kqbpJR5*Tf0BJ~w9XJOznC`=Qf>+*65Ai~&mJiXyQj>WjU%ZYm}csLFj&`Kpb zSg~o|)EVx(mS&!>uLD9TSl-@rO=2Vz04*!)R*c@ILv^I@13@zYyc$4?M_J!RHp7~L z(uY7NfyMSV{coTGE~!$81ed}!BfvPgov%xb<(|%fV~j#^hr6*R$*wYlE0_o%!8;Z130L>Yi+h1pX4IS!o!XTVami08 z`*C~`3t*`}g&XN2xa?}qqEg=pNQTMD3@kgrh~1_6?P8fp`jN=v7PBX@tns5!YYf=k zYi#C&RW!2ZUNJO4hH2{slh3bKhJ@kEKpZ543Vsf9icxj}bWuo;h}z9Xkjt6)>It&fx}~djUZU zv=_#2MMYZEt=WDfb8rMxA7E=i^?EMscmT_vA5X%Z?8yyhpE`AFn#OVD>eZ{f`(5wm z(MKMoi`}tcn3p+Ns7a^k*xxh9RYU!*9vf$AmC5O4zOE*lCR{>3$D}ZrvGDv#oOB;m zVCL}+$}20(>ke)kfl}LJV2yXw@wM7K0n%D8t|!u_3DA7rYMo{$d!p6u>g>DczY*p6 z;!EoJ^ZgCf5&-#t1hB4`>*ad!hkSJqIQHQqoS+B@v?B-2y5vXR66eQv$&7S8SL@Sgi0Mon@e+b|Tv z^9ZV#n=uEb&T>RJwYyEUfiugF8+Lnw+649-9&H%L#F?EXH=Nr=#>4;f_jL9N8kC*g z(`;?;@W{bFd+WqOg3Vf4E_*`gN$bQoGI=3wMnzLmk>c!_NZ&0vTCYfB>6mo|Y{C%A z`3{1pkj9*96yt)>cbF<^91s$Sk&3rb8f}_l7g0+jN}WX(hv5D;SYwLbb=gxX#A^I5 zv6{t$O|K;iqb3MNu4gcgii*&Mh!IePWSW^DS;0VD;(vSbmV3jvG5 zU?U+0-zN;4>PqC#jYXPhB{?jQhAXO?nPf%I5iB@h=LY9Z1JS_23=}L8x45u`BiLSQ&tb1I&yU6U@b+}&moIu3^cTOATDaJUYnZil_~ z11!#*B{2|8CV=X(`|ja`KIIcRf9tK>^`7^zv)ti852s~g~eap|0eb(8!J_vOpKqb`jL|hI* z3y4eWcjN#O(G+#S%dd%*tOklGiBKadE6{;DvJ4g~18nYZ zBn519fR}*y0EM`(Ck14v114_i5!%5#%E#JB{inDD6hWuIIs-7J0hCN=mLJd37XcOZ z-@Qg==S9lA5{!XAi|ckPo2X@TxP?XapA!VF##HX1e=HHF5i?O%dxBwHkP4e0yWU(! zSrHS*M{UMJH3Sa;sUsP4c9^eTJNXU6MJl+fmZ}`FC679AW{@xkS1Zde1l05dPjBIEnd#P|bI5^-Je&HASk=MSK@B7~G<*|zw+1lQQTKD5t<#nXSc3 z9R#R%tWXT?QFRc?Ln)UN_u{6+`Rt8pm7MA;OCe?Npmk%&_J3y@-!)iS+s(zpX zSl7$-a=jS8_R`?`mC@neRfM+gS-i0jLaViQhL!sJU!$?8cYcf~SFACzhCvg3SIp2Q zvRSWq__0eo=NWhM{I27H2Os8Ovw;w?AS4}$ZZayx-$nH4V2wC^UNS@TL)jnhc}a1-^JyXzs8F+|LAx zXN^tE8_%{-!4w0m)ZzQ?Ku?JI*u@(YzOLl$iAe#IWCDr?9q7Bh90Q~=(QkFcuEUFJ zDu46#LkUih_TDR_gB>BWxxB+eW_SgY30y=11S{vz@^MO)IXb{GrUY1K*Irx!am?OAn*GBJ z%RUzZX+5IJCL{H67)XN>mwh&&4iQWXaFP&|5G6}XrAILk^^Q4d+%T+R*`LXV^TUY9 zf+$K1kX9qBYx^uaL2Y2A!gBj8X_J9KCt937dzQQ3b2m?a>`^}Sl`rRqzWsZ7;R|2N z(J(R`tr(|ph?qedw93Z{lgI>@gF?vX3#6L+hZbyif2w8(K#f}R`l0d65LJ+xl!}PU zLwpn&%O8LUg3!f|P_9{^NbFQdNitwP3|Nq<8v~M-b!YxHR@U*3Q#*;~`8qc{ zZrVNuRNt#=7t(;-fdtli-MAdm&$nRO4k*s#YxPg{@+obOr@k17`Jmr?{`_^3thIPe z!~P4$m^zEED|Lp5`!yjh=~V+M6Z3n)X)Y1kELEAxV*Vdk^@f^wa@@q_@HB52g^+K!oUhMQ!=gc!{*%8Nm8nV zd)UbmLO)@1wh+gc!^1;_kFH%NyTV^(uUnCzCEei7v=@(HvK-V`|6C*CZxjKKv1m=RGVjx z-+Rq@sxrdLn7wvwpUq}?{|2zGm+R$vu`EI2@NLP&!!D>aIn*L&{f zg?HS+>1W=_TkpD;z4aOiQW|qPf<7iVeP)a8-P802TfsQHduozX?H%p0*$h+1J@ygZ zZ0NUomN9Yq?3oF?8k2JF+|3-UmHRJV2MX3f#Cf!H%zVx0yEi^6zF zWR;Jw(SgHZ&5%a0#3F7HLj-Hg)K&dBQKiVja8Iad0wHFPr?O5!kSuKrVe&yjDibT2 zvWN?S=`)@Ns8$Tm*Qxs1NM)nA-%sqiGNP269aN0k6|#x=bUq==2V+-E+zY#IR3&Qm zP?}1>!4?M@Dh*o=iBtTX}%Q(Stus-=0HT7y4E(E%HJwyG$_Y{XPD&Y&7i%QX_5C*XrvkU>=exLDd1lJ!9VC$Zs ziRI3cQ)hR%e03nCLr(3SBCQ6j3ygq-$OHG>$I(L%bNdUQ%kXXa{y5wW)BPU%-kF!h z7b~;buzZe80_xz(sECzR%px0f-!+Pljsa-x@Yhs0E7#n?fjU=FLiyebN?JdOh~#=?#S znRj^1SrQe*_Ck?jR**>B-mj+t&cGQ@AB5t4UpxZMwbr>h(@K0mDnm?x5MVZbjx@tJ zF7G1Dr1vKYrsnV4XQ-hz$8v;PPWEy{>T#Qh%gpAiP(9;$Wu3|5nj}N1$zXX=ndhA{ zt8A}Gs6dN@%*Bh+G_!Q8FPAgJ+;$;glxKuh53yp*?YoknNsZS`Fy1FcC<6&i=hp;6 zxd!HpK$pNtu@q>p-3)9Nd}JvQyu<9zP6NdVg(+_>vLtDKgSPj61*s$e5gfR}z_C(` ze(f5w>yrZy+U>M|D`V6@TWthzMxE4C(9r2}`n`<=%o&wc%H`}%Ygs5QO|#x7&K?S4 zEszg|fm;U;1TPLm8ogYuVZDQ)Q1FLr`AFDEp|A)?AYxE#(~Awg8jooR%>Ow8CWhC*&ArH=GL2UW7&_KJ-y4dYlmnT zNekhgM=tW%CUI>@Bon&O7l~L-`%4&!RATidgD?n5!9tjpZ_>yn4Wy(cEf7e>blQLr zrgc^Q0hyqH8mUO+vZ1)r$AE4I)VC*0%g3aQsgAyYOh82pSu!||6dOPz=V^^0AF6(Jz-U8WPCB1!O~Y5mGX+I)WJ_IGYPCjhh54x(*!%H>JjW zIawBHQc@Q&2UrQ^u8l>ykR(*2;R0NEW6u*CLzF7{BJW#QJTww1149JNLIGtuPYWel zPqLH~8#`&3j9QMXN@9~4fdVR+6)&~~I4g$CtV6Q#zIp0sWEc}_u;}^>SfwH@n67nU zP4zuvGDb^9I+{@P^IO0x0w&oLN(ws)6BePH?zc=n%I7yoPY4}Bv`y=x3*EF%ZSX6E zZUU0Gx{fHqLZBxw4vAP&<)Q{O*~C`tw@$IXcA0)D#1Ih)jGGOsy=$D_tg-bPVvqEh zk<~AuQ(zLFW`AEc^<=N;P7z6SY*Sa zf+$%kNno_vV2_!#SUq{ff2EaJI%o>hUr++E04Y8qPfOn~0KL_5`yw|qQN&lA<~i_V z<*zgE6eN3aIUo=V2s@0MNg8T^dPmIa53d8!qtts+2#pX;@Fr;&@P@d@jiE|S1S25? zRB=DFT!Q5JfT-1EFm z0V|y?FJTsn0?9jEsJOpLWrG}ROzdUG3=@Tb&O4FrhgDx&13H;jR+U&~B%+OfU|EmG z15-86$LpHiPg4BOtnsy~hQ)22?r)WkM-{VKXpDg-XIE<7XY=b;?kP0~Y>@<3X&vs7 zh49oC(-CyjNHZIrp|wF4g&7?x1H1he1;4&X3#t%Eh!uG*5h?Xo#$~;>Mgj+<+xuHv zHop|}{gi8QcFqh87ioT{-fIBM%6hebpJw13 zSRJe==T>RX8d5wEk2MByWA_%Ar5=YyC2htsuvHm`%!o(g`-F#H6oxiJ-!B}v;zxeu zNBF@X`eEMowzp4yu%~u+F)>u@F<1UjEmozbmHk#;s~W4-i0WAPk@oylStQu;7G5pe zXO`O6?nz21w>z;`CVg`MNpa8ysRJ&)W0*0!-;{X)nfao%4CMJS_)xE0ALB2v(4t)nhhf1vS^=I{aSsVX-z+zfxynHt^k%O^|Xqw>$2)>oud3^0kE!@ z>*YFlB{Rvz+-IYe@l{jwlZ+4N4+5FJr4?j1?!SDA2d-RVPdn(hN{6zfIa!zh2#X!bET<1*P|UwWh;;qZ zlhI0~w6I((2o^A{r14~65-}@sogiqSjvy0|A`3J#bR05UWCEJ{%<@_dWt3H%F3ono zL?n>XfE53zG({sXvWJl-LJSC@KJV0!u6k98kIGCS6{tdtndOE+5H~edf-_wpvzcNB z6x|cSEL1>iVghx=^T#r4hibB;riB$m?SLRasD3#TK*l0LRLp9_Re(?=gKondq_Q}o zWzVq?VlmD4l&Sy$dg)L`q`Hagt*v3i|k8BWov5}GtGW$W-zXh zVL{y9MdE_hus5+1cec;6SSs6F3$9){;Ko~T=dMQ{WNYh`%ZoUB=0+ZQ@G?)k_kM1F z+AX~6P4_bnBa73!BvVj9$m~xQnj}BTb?AtZODt?VXP{NzD8n?gX+rsX>I@TU{Nc#J zsd|GNm&F=EvJBXnaz-lmS=kPG11%U9O9G}%`x(7)UqTTA!2z!l7GNoZK$a*B$;?1> z`E?fpQCy~1wpBZ6#s930+YVSu%7~$wb_)c8w|gs4hs-4D3Dna9=Q5G{m)g0j;E)1X zWj2bh>+BIj@{Y|IBeicT&>RmyUe|v+93*d=j_)@qMf;9dBY>FW52dgm#gEklBE07*b_DO|jYMGyA4pt_`3hc~Un!uV(k4b-QL| z_12%W%xmRjT3LSO;n4W*v>;ZVFMi$1Y(c;$RR_rkQs0YIe=H%(y=o+;6fZ7MHq$+TU$$KC^h>7w4O}I0)`x8T@og5PSX)& zF5ISgfVBWtS*M0h)ou7X)HWURs{t%cX%-SSXRx;YiMsE{M7dM(a4X?I$KN)7ek+*c zpwfIf?x&em44PWCK8UpYS0#jv{}~NS3mzZHJ>iR2fxoJ*sjSt8C8j>#{W2>&>GJCK zUhqK!hV_VkKzLv+ZsElr{*iptOKw3V&;v+h|AC+3dw%#Aco{7Ij~D^FkK zb^qfBxX1VnQ(pM-pUEq33Hwffgyz7$TI6H({vAL|olL1f8Te8Qs48i38&ezLkX+NNB+*_msjkAfb3)75^haT;2$VuZtjv)?}voP%gesg>9rMxtV+EOl!Vp z#v=6#&@!hzVMadG$vwj%6{IDJVk$)yEj;=L%;!3 zHK1jf&C={U3hPLjE%lM;+91_jcM4R=l9qEl4v2K+d6ro@QbGuHD9#oIv=afv=p=wS z2&P3!3Tez8lI3IoZ={qH0V9ncPcg-IfM*=X352qyH?Ja-yj2Z0qY)Mn0;nb2vc%=O zT@2Ib$1pM~4C7c@dx>QiSw^EriA1)R9Y;fC+)rTHI6fB1+y34)ZaQ^}Fl>mxa?xXx z#1PW3&b}hcCAxt$E*ZuhuB2TaedHdVe#fmm8Xsj`A0VTV2q+0rV`qDphab4aJKpdv zZoTbhj*i}iYDwU<*6+dDH;rc+;%|Lkoq$OGe4+*im^a$R`3a4|u2x?dUnjb+j<{qD z%-siD8h<0rw$?w+4d%#Ra02dqRRI}q#O8}zLK8GggUf(J#5+XF*f2t@Vc2@-Hc07A z27a{xJ1(KA-AM@?WByD%FFH324sH9kE#84EpR5d#CeCTb2Fo+@b_^*1p#zPfO-Iw} z=@VLk%6#7ZUhl=&JoXJE!&GDO1+gOVrlloV=_ndC{@#mKRBCD4FS zz{SS1OKf&s=HQprmFn44mzXvFDPE`6{b;3qQ2sXYTC~7hIToydVh!WMmzQ}W)&imJ z?m_UErH=MEXw0LL^4a=~YR!zrfA<@jT$`jhZ_&y7D1mUR3oN?~R;TI&P6!4LFbRal zPpuQT3OhhpL6TIyyL(B0QdYx0k1ygck+jR|L@@$_8#u}j_>8J0d~*d$mhQ1EBUP- zeJlG9J;v6}&*Gz=b0c5-b>GA<-gTL_z%%*u-|>5S&F^>td+&UJ?VIo5BVYPVuKxAE z&zrYCnm_Utui=$9ChmGvx#QKJ!ZXk9@b%yFecU_1)1UWoe92dSC7=4710H?HFBJgm zCO+}Ae>Y$D1+QYb>pi5K{?E2Q*XWB%+TplmE$Y7qd z!Q&(LA~QqZCtK<>=ZOz#j@enO(XaJ%vCktRX-yO(blqeQ`HQcAJs5(5`yXQ1tT@^;x}7Z~1lC7K6QCp}gnpaD^~klu%XC{yqzecU=`!%MMdHPG-pcuH zVQ>GCO%jeIa`noJi+cm1@7W0*8yR3?9*w9hroYLI^*C@eCd@M9#Ux-lmIS!OFr+M( zi_uwjc^%2joy|C)I$}uidkWd-$+Yd%WdMahdcQf_qGNP9-=fRL;6eNWlD(WX8>;tx zkBCgi=nq);u`+D#i$=19jYijZ#8~AWR*jmyO_Gf>P3gK=lK67Hs(Jr)0zd$iPGapO z28!HI9XLX*c4Azz7~Pn@ND?JPFhhq8N%Ofxtf8p~LICJ;osa>pl=A0YRy%Km5Q`_( zF*j^Ug~TMU>-*^{F+j=8tD%@0yA*2F1R5%XuAF;oWIh1_vd`E!4kW=r!YnD20$RsN zDu81elp&3DT?a){X*v>vWOkNno@Xh`Nt3bC_4N5pv$R$yY!cP{IRKLkpqUWzh6t8e z0H^v0me^hP?DkzTs2-4@<(iSN>$qXPw?}{G48x#o?=I5&jzrZ%C)e%ks6oImt86xEB5REn4_R^> z%XLi2g9-#oMhH?H-Vz)jDn4-mO!G1;*G^IfG?8hW3R&73oULcr+@ncC9i11NsTjG2 z&eQ!)09ir-cLb>G%)uH%s=+oD@R(;n8Pv{{HR*2^Ln(5{a(+xvW>Md@u4*n{wo#XG zjE*P)fs;y*;}{5Su~`zYoH!yb^X(i1@SR-h@mBAxCx*f*FgO!a&Yl6aSd+Ha0#FKs zBGXKbys7%ARO9>RdeeeIcp@c8mH!C>4Wk>clj@`8hW?Od!CJF4XP3cL0NBBg+Ri9! zU8&$$si=8ht1avKbE&Q`t;se|ZP`*|2ci6`y9ski%Qa9XRFJ5o)kZ`lw-3zfph;2$ z_aH5{65{eGzn;xtfws)J01hfs&bLYRu?t1s+xXgHT0pD(Hz3U;T72-en5|oGpD3U% zz3K?LMq=zxRo3f`vug_zn+zPqP@b*1ZG=MCFX&6~iit6r=7F1(14z;^5<;$90L0C? zb(;Fn3~yDhf4x zM_L)5wW!jufY$ELcKPf)K~R9QUFM~PmsG+|yNMbqQYLlK5PjVAax2n(DM3YE)KX?d zC&kb<#kqXO8E}d!&2}m?%HPipenF{?3n{rU^MSJrdS<>nuV#T>ahTp zOA_aHGTI)S16#t$WiE?vh>_TQaG|}R73^yhlGSWxFyG{8n0Pzn0|3A>g;6=U|MmR0 zZ~QO(;(Lzhy1;Pl5)WTa$F9FQyvEh5dt7FsKEP_l`?7q{XM7Q_`8~gjXLqoFd5-}F zgmX82ET8-7Pv^ex|9bxMxBddp{+Q3=PkhP8@ zZ(w}>m++VV;0N*QPk$xbr#_btI=$k1{@UN<+b^BrBVPTd__9y>WPa`^egq3I<`4df zujKj9xrxgU-_PL2X}7(SPy6@}qyNQ!$KUzaKg-o~pUhwTOP|ZDKjvlp&|80*jdHy_ z1%&Q-!>6*F=HKr+zs{)<_45=!BbCl_JihTeV~*6^s)Sz(`?lnyv;nH1S1j{(uUZ@?5PukzTe@U@41WHZn}XF{*YI4wD)6N z-8loG#aBtq8b+LtI)@A>g~*_zdrB0>QAg}D05gnbS>v4$V=NSF#S6tRD~$=mrq`y1 z1#8V73HkauO}obM6F_iA7X6}kSz|Vm7sHZyr@g93%0ssc5rQFFq16~e@gXV3sUiC( zCCl=?;GHPTsdph5B9*ljLUdzw-_Lxn7lsxy(AV#OQ_V?*UGe(TT>p&A*i*90aUA%UcQ@h)2?{T@P`~xwD+V@h0Mfk78+!gk|9|2}cJjc6ZNn{{xS4`>jvo^5rXx zmgu_WbRA<&B5>I*qDD%F1*w2xj0Lkum@>Op4bz!a7RL3BD`}GlTfY_rMa`B6GRo zY}>~db;cBOk}$|@cD&U)4HQjdWpsH0tkD>(TYH?XBftf?`r7UNP3+O|0z^S9VotyVP@~QWzRm zSjjHWOOOmuVo+iLkqqQS$$*giHH8?(R9NThLjcbxLcmZ~5DDGp$%05F+C^mSa|D^3TlVD`>7tX=C|$3n-fJ zgE5B(Rb%nW&T|0EnYl@|eLgi3JOkRq!4{tqf(4>Q5OJkM1*sc`sK2c&FPQ;a^Wl33 zeru|_f1qtM%u+IrXVTeml1Sl+iXBtG18A5v3Xh_u2m#swAA@vm^| zhBF-9{R@28fBONhoc|C${Zn4dau9BRR^+wce;222yqOygevtq6y>H>-xsT;Fzw5)< z{N&g3?Z0$}-|~AtpI5x#Je{q%{}+FP|M9ez4(voF?4b{E&*t^QZ=k@%g=ODkDNSJ0a`!Y62BIk4qMy>ySRHW7t*1GA zYQe(~+)o0QyJxuPq01btSKM&nH2reH{^36BVT}yJ)^bTwWjzdxCL|FEK+J~K(ZV#k z*~Q2>CRB~scLk`ZqxmMV8AcGW8I!=TA?Cg|<-zXYR0z`qQhfjsuSVz$O-l2LaNXV0p89>QK)XJdQh}t9ELlBaIj)~CqDC);R5TOqd z)zJ-5T^i`ActnZ*eVD)|Z=BSJc?DoA2%9IXVC;+)-OL99)jP?{Smd2T%KKCd(?!b& zpny^v@eT-h2Te7((YqtbnLVZrSR6t*_jp1OvDvpE5i;;M0i{}i!fITdmzm}Fq{O*X zXBaj|?5|dcbO_MLerlLo0SH|-6GKNQ5y9xY0=SJMiy#x*O46EBeb2rKT^G>Jnm#DY zPFRG%YE0S0yff5vGJEg30+bnq*t6PPAsrd#7CUSPW4VZIHir|ab^Gaa@bF`tJAX6l zvFA;1e-9t_s#kK;EjMxLJ@?TCnL1}(SWL3n<<<`O-uED{eDU)LZx@m$VV3i&D6PLR zmAP7glu%eBT7_e+UkX)f)&~d#aHf+x{kW`9<}Tb|S{Prg!Lu0dY*v+W0%dO3rdLs` zY&l9^)EROjtpp>>QRz?{Ar*t~P{E|&a}tr>drn{X^sU=Avs z3>5i0-@F^|S95f{%nX0ay7qXKEPb5aQm_;EYnG0vd3_>wjDHrIs3kxM?fplP==Fg4 zY=0&gYE_2kzEi(CI*^vlg%}Q4l{$TXmC7JiKaW-KG@4?i4re#UfENcvjaru%OIoF~ zMhj|zn@qR!)!9}K$TiPb)2Ez)WoDCo!v2*jq@C@O>{-%zLo6P8$)C-{7&uCqmA=^w z&7h5<1soCy<+po);Bx6e7X#6sy~lR49mJ~4Hgz*{HTSecQNLExzIGA%-iTq6uxEcz z4<-r1reXM*Sq`e126Li&UFLyJf&*oQ00ckZL^kPx=FwjfAuXC5Aa!FqMX(P{;REUhysK8tfw>0A$3*-=0%yF=#w zgv{iNr5MiM&vmuStJFQSiPuM~>92<)So=M$J&FQ?i?<2cFyuiQH~%-8vz$tM)Sww) zPgX1}sOg49B3v2A=JjYRCC%-Zpj8hS1e)|rp~`UU{a+-zrC!W3+rQXb;B4#C#`Shu z_KVs$yBM2&eSCi@*LH5OUK=(BRzbKHaH`K6qa|v!b{oO0z0Oc3QJn*2Na8e{`oKC6F%Si zIXc<^@H>C^2XQJ~;)j3uZeIADkzw-~SII@gLtH*wuzUUn?){;k<{!WHM|u87{dQjR z!F_G7?Eebi^FQ82T0fo7`vafPM|{`^vAq1t{F85g15Zu5<@F-P+el6_R1Gx6juG6+ z?ES26q--O!^G`5>wff_)5X6x7-wZf$Z_`!|rm)R=+i|H`Aaj zyPnwh9PM8vN#axo4Ex-6)6;my)1Sdl-}4~Bw&>zESFhf~>Fu4#Q)@G1LrRgzI1GfP zOe23;J06u7+WXA{K%5YK?_RkVqOfgsyY%1~h2~#X|50F@c&&B2qiHsjx7{ z!iJIt=)5=MlZ_F`E8DdJwmVv6z&%b9=&vxhaSDmbDsZv9=Lpk!%ZTkk;73LgRoj1 zaq;3MRt84~DP&d}O`Cs3d?4JCvF@&exn6VzhRGZoi{ZUD zk`#OV6=3=)kepqa}4$c}k1HG*GeL z91)^TGW2m=v)o!vpbIeB2ZWdzNDCsX)gkNE=%7boXIt^3%*Qrr!qVuHA%Z83wvsiN zJ`)`H_5sK8>;;OPIf6Q9t=TYqxjqK`r0K%BYBJ-|5K`h>CDfxV+M8IqN`xw~jMd?VUqivYZ;U>?_*38-nOl2vXv!P z0*=(bBS^73z^v8kqscJ)z+hk%wDk-(-11D87kak!ejfX%CC`7>&Gef+Uisl4&hnP? zoH~1!=iVNy)x4*!UogHq!{XB2n4;;MbZM^pD{|?{& z);;=Xy_4VbXZ}2&@uKJO;0m7es$2QlZ~aDo`Q6trayhvCCM@LNMGr#Q5@Y_H527daV{sn&M-FrNjK)2Dl zYU45OCKdJWviqmMnp=J0@17w+UEUUD1nc;Fhz_(pRRebX9yeoW`% zaXSVkrT*FZ^2EI}XHL8v+*$K8@b78yZ!l^C7a*NA{D`dILBM(2yR@bw=wIrHOjVjdw zfJr0)n{mVljKf%aiWZR270td=qch88(2-#rrx8X7PDL;4xqL@F{iAdqgQwQ{LyqJP zPM5uD9!b>F*fz`3#hkvDC35X(*S{Tya2#8sNC>g+ zr%M{W(P9?x;&QTXZbMxpV7?uQO*1W`ZYmohgzW33etlF3VlMe5I@mZ(rQuHYNHb~) zxiOU+s}0k#>pEfxs7L`5AxxmyI7tpeFU8Iyf=aF^og?!qSmsi6~+6 z)lw2n%d(eJY_W7zIukk(b~@p<8_sihdC1N_3sjX_&74V!2BS&VT~}j#h_s zePFq@#cF-P?%5?<+dX0_rzfRx0&~yabe_Y#43IGnQ{y~z3+{jT63>3oOE`by%{=_} zcX0aLc?d$1d|fxI4I_pux+%p`GWb|WKMe4WI!?2%vND zNhtm}+8TMIUhgr_$l&0Q`qGBkQ@rU+1SBB@a9p8EAZo?_bX233RHYqgO@2J7R7?IU z<2wQRQ9zjQ!pZFb0&`Z?dkv&aXTOi)?s}=|i zm76Ep5m-PL)3GCS4-=}n450-TuySuxfmY?xv6XWRAsa+O* zR0<4gB$Q17!3a`)I}P#?w5InNkUKa$%#ye=5TRy{XI4HySSY8jih5U8_(rsLHLzLN)YDO=!)ux$5n!x|-qo#0z*$JQmzu)~i1MUYs$ zN=XGE7WW-Pg88*940gj9y>C%Gy&^Fbd2+y$G+pN23LDV^qIQ#HF$cz+-rZ$0tT;M4 z%nbin{Uf1(L|te-7~MpF+HMFkwYNlM0<^|qC<%}?$YZ(aICJ_mSND|tgMla+IE!I9 zt#kg|>CDjEtfqZfZ#GCOjCYCC=gpF<9^CVi*mosZrAR7EinK`MOBSTsh%~-qorgXZ z&}~eKR0eZJ{a#~Im8>@-#6Ziv>tcX1knKQr*Y#{|Z?V6BI03^Vff#aNPiA%srVhf5 zVETapU@hVjyZX!guW$J#e&L-XVjFJ$_}B0;AEW%rkNyO2e()N@8-9iFdGI0LbI-u5 zJ~E=4BMuG|^aB?+Yr^)1xCrRs5tlAr=GuAyOLToel8^@AFgM;3u=UE1;)`DWaXjsu zvA^okF>$o9%;;F}bLp|GtVdYC;}?1T55JC2`mMi%*Ss7S`bPf!8{f{}c)nI6OKcjRO~UPjO)pc*)Z)aLbv~Jowlp4nog3 zChmXi3cF{{(Dj*7MaZ4SqlrOPI7QM=jWx(d@IgApLD7_rC_{*B)<-P*1*5@w8VT(& z0uV6w<}pEyLZ|PhhnRznQ6hmrN+Yq$UQq3YG!G$}&{craM@q|it=?pnRaKb; z9@XD>AvZ|HNCrt0>cBve66u)e#3{u}AB$0XmybE6448;z^KqBM=Jf;P^!bR85G8}E zT~3({Az-3qzpISU3Y*CU0#8nZD2 zoTgI;ioPcut=YeFmEGk9PMw;hpz9%#|xEj2?*{NdrllIv(fG zoMWd8*sv+a#7ksao-*iX`5rR~kj&YENN5bFTe`gnc=y6+B%ir6o>Y)VMis3qvZPRC zunOjYV`1r)25%>!Hsl2eEnBxEP3sw5%)cAXX6w6{KSPoE#z0EdY$r&uG=c(n<$a9} zLjn~{s^65Bdsf8gLQW0^K|~1_kWyb#E&gi)5{h$rau$!vTtFIMB2m0hKsgCo>9wJ< zY1GW0Wi80ysB-nI(rRMtzzzXVON9`Sm>D?|Ljl|)RlS#AXnC&*LPc(>--mSN>L*Sr zCdF^;Sh<}+F@sM2efL3ov@oD$?lpBXpryyKtlWc8+V!gezs%}V0W8#WdR*l*n*o`3 zNoVK7W?qUC%l1?Cv8vwQzWr)uOme@h=Cl=4bR4i!XV$eqWC6dNX^K>aNHsZg7KeK& zI;)`EXH9}&a$|82ucMW~6d+qsf+@7NPc}}U@z04H%-aZJPdR{f_RKDe#W}h@u(#Kd z(rIGM9ZXZr>B&&62qIl)6Z>O(Yk`EoViDWHf~Un%w!(cjGHloU@_1ymKet2DtEL! zWzO&a(b?N*VPmZ)hLV6wo!BH}of2DH+Z-LO^MDRQoNOIBY%{R20aFN*?ZcWFTy~kQ z4o3GfEKIC1dr=iuHH77|1Pp2U4KIwH!aDC_9sng9=#o74dx{xas~d5G~SgEm?E{F`XEQSR&&w`5ddI zoRY0t?$>PX0YdCTZnvrufUU(=4ncA0e{lJ$LGjv(D3*pifJrKrF{yYtD*Jm^z>Muh z&-Tvtq~JI_IGoy1qbE-5rZDlG!ITh;FtwvQf^?Ig+Hz3>mB;}E5{nhZ;lVPYvg`p61^M}F>|-2X`*!AoEMe17mp{v(gx z@nL-Y%U%lax*yY?^EcheD_;IA*5ilrnvb}FcYOa(@%sDD@XDPfi^Z}~qgEVVJK~mC zeiTo8&Lv*);VBImKN^#$t6lpZ0~Hz>9C% z;+ucqZG6y&d>Chr?&aald0zE-e~gdc`dR+VxBVpdT!YxZnBV=!e?Oo1>X-1&AO1G( zJ^yq*=C|CzL+}0tzWudthyVT*nOCT-CKCxhkquY@a$c_@jw3%TQB(}ZdnB0bML!Js$4Hm5d#ZA{Owa_ z9bdMq%*)(B(Ra^j#|}`4OR1nRSPU;!Q(i%js=1z*)<-B{$D}~1)YJ<_+Q5r4k_Vbi zlZY5+Pn|;3$lk$*!7^AAF&05`%9%mGdzw{BtR8uUv&)_rKI3T^iG$T4aS`bj9X8}7 z!-W_(?QZe3(~)Q2dLxHduJZ7MkFwT|!(qd6d%L9h!N!c$m>VveaW%#HC#}E{MQ#(j z$WR_g%k3pnjKoDE2}Mm=bk0n&GNO~sJssmzj9>+@%%dTNhTrFFWu?(bDAaK+4LS&= zl2E)V!Zh-;W=xq`CrjOH_Titz>&PU59(4^~%q$$hPa^0E; zdE{zZj#;IymvuuB(x?O<9V?@X5@J4P5|oE^2t6iFThE`NVG^1eeKDa|8?a=Img@JR zkhfjpHKehOv~_46p(+5XRkoj&PL}(DIZFVL7^}yK6u`vty1rg40F#(CvPG93*0iM1 z2}#R3RJNRzWWX3)?#0xg*xJhHxJx@1cHs{`Uz&(8LeZUNidODx`G22OA9aGDNxz4-!{E?!}Cv|@SsRAIXbsuWZ6d=Ih;$X@D~S9fU;QkFF1XuQkAfr=lszGAQZ$kbX6#Ywq2K`e;O9 z3Fg0nc|l|Oe89ZpNxd&asQ12m4}~Ie4nk6Bt9 zsPY{!Y0YhcSt_Ack4R_U)Q)svR3c;X!@)hAsyvaVv@$Sf)IAZ^iScpRNiNY-Lb)EQ z^KY|_Bd;nfLj5Gc>n#MUCBUBE0lh&&mEFBeOOF0*|EC6v*~ z%{WdSjP*L-kM_~GtOgI_BBhkv-f^N%K&pg z3F2N-35?vHT<$Uqt6bmXWPp3%Mzvy~7J0n>jLcW7UcDg@Tnf2du)TAdATs%1nd)@k zY;SKPFwGlPF&i@oOunvepRio?B@ig(^Pdt)M$))O$e>A1_-3jTGxqoPGFWXReKb*dat}%`qXR8vd_5;)u9TFPG2?&%Bu{1EQAw-!5 z!UHg@Q}G5fhBQtx#tB$mFFAec)C5AAj)ks$(YVIcrtkJP3KK{q| zUf|s4emuYTtNuJg+`{gC18lI#D-}N@$^2T@ZY0o{)kKg?s9vO|c@burpSAO{?@xnW{8ElK+`WOBh z&-nT8<7@x(ck&J2e=A?~37^RyedVXKTqb_%TfdPX|B-8a%Afe1e8w&ClRy4T+;i=S zTR-|0y!3^)vw8GUPT%oTUj2n1!WL`Z`U4O1kAC3m_||9qDSqcC{to`c$9079oqYR$ z{hz${JsWnO^Gbf_@A@J>?%C(rzm)j&&;LWb>SaH`zy8+m=6`V=FRy1%u9v6C#NB0Azuv_-;i2Q!FDJ!j7m3<&$%w(z-b~xZAX=C)fO{&z z2`PgR0BKFJXQ3BT-xPU@;YroAksT2N!ACR@9XY$ZGmXk!x^l$fdQIHgMN$TOmR)B5 zP*_Psp<`=eJ6${4Fs2QMtAVY>HWE8Ft0Q`Zb6Y((Y#Fzn-(tIqT)eo)(MH&;05Q&< zJt}DJq6edoI ztB=9cJgV_+NsJ0H%hZO=fHi=S`#q&`%=4RMmM(M|5J{;T{hPC`l3)KaB9jUT6>C(y z15Qo38la!)qFby zM%)-x2xYX%i^HZdgxTn$;Kk#!Rm;d|%WS3G>)xOhvN^fcm~0&rF^0B<2m;l@yQY7N zhVSw9P$j?5AY?2|ncScSrTV}dsYqa=OXg6hk=xV#=CV%J5yR6SJA&qh zlG!-jkA3XetT$QOr-?2oJIjdbA!fVmYfc^6!k-YpAtG<7FQL7;O|d2oTC^XOKwZ<=#M^Fc-X@Hh6;~^D0cqCo0x5 zh@?C<=E+Lc5ee*xdRH~w)ZaJ=0SUwbGq4kxP740pS?-;a%RI=0rU-cQZ0X=@(suu! z6o5s*OO>mwjfKUYlqvXoU8?ydMq_|%id6rodiRl43O+~;`LV+42}HI2Zsv#$maF?Yrk3lf9$;nxGc$89{g5She;>i zyg^!J2@wP$=bST`~Jv|+#zk0tn$YNU7eT+|e>h)qaqYsvInM&f2vDT?5 z&tp@{I^L^PcHhf$8k8IBkmUk6Ef*de!x0%C%c^4IBEqN?9kwV?O_q{^mpPFWB4Rcf z3k$g{00_wCoE3I%wF1hPFv@T>f#e18v9lsk>ell zs0-e=mU z$gERIIN8*B?qHl{a|wnuG1UzPnco>k!x7Hx?!X#DuxbC`fXAs9uG6qZm0YXge1#AsL~YXFP8?!L%ejkSo9#;gqm z@vCi`)%r3R>caW+D{oE8aCtp@*43OZ?@>}nCQ}HqjXnh=1U}kYn>BtWb{D>?5LOMg zvPYFxQ&rp->Je<(FcbaFq3mC6M3ziu4D>vWMa^S2nM_x#L+*bc1NSEZtofYYyLQ*G zJ~I&*^?OvP010yY|ZAnCSp5-w!vGiuI~lrtJ*4v-AYXLC}2`^yCGogMR}us z$nQn~*7BYB<$wK6c$Eu8&vinq@YbLEF?{QMB ze&{jGmJQ8q8~hIb(l19;bLfQfSuezMKH&Md{EB~#cf9kFCmxnZUygtNgTDb2YBT}J z@|+S!KcC|l|IPQ|b-!>PcWiIr=;4QOWp%>EJJCG$7=CYjKW^NRb-ngm{}tc$`k#eK zhRkY6?3Z)Y^9uj%AN@7F=FAQ*oIi^P?tcenvxOusJ^WVu=YRY?_!%^)o5=5mUt%(z z;*p>I7x*i`_V4k$=RO-(EHJ+O3>FJ5|{{KTjR@ZKo1zmSOEz&~EIOv$L zdzF(JaGoyfN~U%B+39W6wQX)0Ep2qR+{D+tDR9zAUd;=cm;-~-Mx5W-#L;|)$zmym z2^lV6!O<%-N&qSuD`l46|ho?=Ae&6Er9su$2LKj&eNXOo`p0W1`D! z5iqSH`oj&ftg7XLjEE*gR81i3E2Nut@J#UIdrgxxke06zEa;a5c5N2T5}7LyjmVyQ zDP2b!%K@_g_1IaUHS>;vV1~8ArfOQ#T0ZFcM8GWQ{uQ8R4Irv2E!Z;o%g(IG9d#b@ zjWWPma*mPn;1-^0TsD`Zg+F~KeEQCoaYSY-^fdq()Hqt$33{$+*VII##-}jer*n>} zjml0^07qFzx(pUNnR8umR=T8s&ZnPIbM_VpG~$b)W|;cS2JwiBG07;=dJhBxl{6r_ zjt5I-q#4J$**#wIEC+&bKid;LNB*VFQ9+U~|~V6~h5JeN}R2Smd~J6V8A| zrYj4A#={k;RSUS--`v3A@ff|q2ATZq}Ol}B-8FqE2*c#n|*+vhO*%+hY%J*f&^-{*DdWEcmJSG{IJMISoAe*3)GZ}DY z$mB9^>8Wzw*qGRTKKWb;mj0W zEw~kImv6f^g;s9fgaAjwa*<=n`iMjpdX8J3Z+Z=IeWC!)s;TO*T}%RagS@ZnU`;Zw zZ4-}l>awra6K=czSJ@X|hYaGvTEJs#VrGCKAYa#WQe(i^jl2!S&r31B(B7N7>(+jc zxjmC9i8*i2R%&bl#G4jwx48~d0DB4$*Y%qT-S<3T)|p)Kc4|bJu)YmG&1!EKI>X2R z%B0|shDsO(KZDo1{s{n6r`SCPQRi!8_YFelIJM^ZXibXS?Pz7f|7$i7K+DWpXSo6G z_m~#6{$ri!5lWd5?+JOYP_`1KKeO2!yDKSBPnqo=d4C{`tR(4ME*DxKaQhDr_Tl{| zK^u`@3y3rsPlN&8?*WpA+p;%dXdd4m^jWja##5?nHU>i~WGvc-7Nt_O2ZJ=vY4)mti~}BX=3^55`)YJ$Ih_eSiOmskFP+VzvV7ih|c149L7+4fG8n z$A9y&FqndG#JAICFv+tiHlA`V?}PgLv^8uK;6pzw zG@l_h4IJ?(FLoMo6bSOsQb2#}V})pp)GVP^4=lt4EFc4!Io;5O+&LQF*A=j+BYd<3 zLon&4;2S_DQ|=&%8s!vb|} z_4Y`#EV6g;m@-^gDB%w}X2u`XW5 zC2OYKWei=~ySaz?jHdl62W2z+&P#XjzVq0lj|q6?o1`4ze60a`j9gaE1n-sHu7_dS zhckvvwkFwRw4p+#r2z0;ILTTSzfsGvgEoB-0&xpysy5WF!V^?gFl;m&vJTwe+rxM= zCIfE1TnNipytP{9Xox)4O=t)n(l?i2bk)l2onEhoRxBsjswV12ygM+kJY@>EgjH5M za5BamooNN?EJ1Yi@yF0k^#aqnyZF^Ij-R*;1RNi|1FwGrI#Z2lg%i^Yp1qA177yX4 ze&g+UXoe?F%?w8eGu(1&mbm%oqkQOuoe>UhycR$CTW`QS$5CcmtYXe_yNQ6<)hnyV z;~fH9g~{RmZP{(p@e$ti#y8^W>5rwBxP_T0{?HWtZjsOD>1KxL^#;R9B2l|>*?@&@ zlcltq6vAn!m==PaICov2Hd$`{1`li6ftvy{#A+H}UHQDG+(4FPeZbk# z0HfUD^35rh#-i-^q!2I>TZ2{7%!+MQA*P70L9am5RP^7md5*)I2MES-aGZIMk*)B8 zbDOx>172`(8>lMy2DpAS#sMtK;fS>7`SFZWCVHA6a&TVzfX$5otZ^)WmhA2&(1Abj znq*@{x))YAW`{*pwGrz<01D6_OQ^p_yZ6>A8;Uo;Xa(2~2B_$tCC1;mbWKU$*YiXH z6bqxWK;DG3C~c#rjdn|0z%oJs55UO#GH|A;E5Fxfse@~R04FD?=)w|#Z~e8LlV!`i z0Wkq+Xc_`&kYlXpngXpXV(NOy4l8NZKC-Zko-+&Z03awBh6EnQz`sF?YB@g>lSOk? zl1i*)nVlFsw{FuGPS0_EUVxoUw>dH9poKsJ*!X|$W7!zUIvFvt1=Ot5BhL&P*MfVL z6tYms`JEC~FWcdiy=5b5+)6dimBwN;Lc5i(5Uh5I1)2a*B$-1b_?5%B0E;ZiF@c=T zo(jWafZhs(wX5r^z%X|>oX!CY7GOZmuIglRjH2kVxKban#%ovIp{g4kFKU9k^VtkL z8zssOCm@Iuzo)HHiL9DnduKp;{bY7bWAWjr&;53Aa0EvtS3m)a&3=jL(LP@AyyxKZ zY6}3X z{7g-+AbxV~B+GJ=TqR(YX#rINuO||Kgc0Sk1g0jLs~&DW7upoS#MBD0^>nhJ(W>pT zVFeu1kd5_$zkpYrN#|=HE$b+VZSH<`kgA zafZ|Mbyi*r+Q{(GNq#TdbqQTC%*w0nqPjK7X(2QIR4~XW@TBY}F*oPuU?n*d@SH~# zoe?@X3v1_A&^geP2z*RpXAjoSk|7i?cab9*3Ov_ z^!#m)C+jj)0y^g9k14ISlc*|b6QBDFUL zWWN*z2q@H9iCE3(DMfO`Xamcon9UD*16U)#UccAlepyx(0l^is$Zl9nreiFZGeqy% zyy=%Y?AC^`skoYv{#E+3^sh*hm@=sJhlfJ zfsPxtX4AIu0@}cW0H5P&E%i-5>v6k7$au`^swM#?Ly2KwX**!59wxCOPIUCz>7vD6>n1Z!p{BONsEq?9lRqXHYvCaum ze9wY_RD6i7hTOl)yhy(R?T-UdIMn z({Y(H$>-JRU6z+TwW8-bNBZJz@)!&TLtJ_MaopIu$>SAR?5BFDz2&qrSN=A(jBNFv zjfhBwal*zjYvaUzJa=6KX91F&9rVN%ZF0&1DWjmci}t&6*d8fK(dU z?}IYE4BwYWTj0u41>_RXB4L~fz$6Bqb!^b6Ob^Ly(q+jsI{Ea-vb6Y89|@HjDw~E6 z8Dt6|6{5`V47x>xGQ;>;C>1|#w@%7NlMbbt{wgQ{SXmgF6d&Cx6i*JeBOo|lq&QxVBieQ zd=A?;xOnCQ_V)JylVLfpQ1*r>I53%s{Lt`=HN}rWW4!{Cv(-BGI1t*{+&~kV$VWL# zJ)ff39?5k!$}u}W!nreBxcT@VQ$sg43*@V^sU9K|b)WUDdq{(?>kSwiI6r-* zY(%uJ>8x`Kvg_{-K}an|`TqKGtWXfvfu3n8_ZUva&u;?@C}uFqG8LDd3oe~6CL$#kvG^1HrX5x1JG0-*>= zvJx?m7F!5H|U0p`j>FIyQtv~z2B^?LcZvNXexK3-pwT%p;dRU|2YXoA`h6l7q zSPi5)D|GtzD%hl~T!$w)>3JzEzLtp>2wf@T@aR{*^zkuM4)am-p{JKVvW@A_sLc{JUXJ(D;i+2tWrXuqlJSt z4m|=dC7T^hvyu`3jzDq0HN5}QiXa5an~n~TQRW$&P+6)u4DCz<+3C5>Ft28478Rzm zDWzk(XLnHMCFawW@6`mx=IHl_uysTomN1RSbT*MBLbs}~jtJ24ewPC#E)eS(eZNeY z@g7(hpA4@(kO3Q`9yT^MnZ%nJ5WFh-B^&_)3zNCk`;<-|9~~psOYH7!;@sKuIM~05 zqoYHqGw1`k0b_nN2L_Ii}MwHcEqY+kN!RHm0*NrjrSRF+3L-4B{h-UMccSXR);<4c^Qd&buEQ zm{?;un-H{H&L^x7wl;>Gr>T}$ibpG#v8*cz5aj(eW_>n#pXz{h?|EVXJ2h*2%MsY^&vRNsw_d7seHs z3|_Dqr{Oh+2ZscM&YwHCS{A`HVOTYI{PJay+qtY|B~n(J3%jamkUPhHQx*lmUWoS= zy{9tzd%2aIlFQlN+Cq%rxlwz++9w25HLKFMvSoU40U*fNG+vD3tCOFp98V_%W4#XoUagjiMw^Y?24PuKekqBL0K!`6Ry1gn4|!ipG6AVO)yM1q z78CcUr{Dtu{x?oCczb$!H=nFIz1V~~r4ThZ>3?$i8Jc`ktb$T&>;b?h<6E6{o_4?& z)=YjO@)_G@XQ7p-=)k@8M^O~N1;?OqtpIE*BePsDw1aB{0fM5#-OsoSkKA`Z83uzQ zXOU6ZfYJwy`WfbRjbO!rW6yC<_H&hKvEXkO8aXCrsGb2BG}`NFE>gbL?&c5v@Q zkI`puu{gp!cntC!+hvYLCEd#g!YqLgYM6=WBSCFSxzf5KJ%T4Kn+BA@vlZ>Bedr3rW55Zlwx58MftA8n2!l)F$CpuF1t;YiBbJg3D z7`-3xfo$CkN9AcA&KpFiyf2gOH5?2HNT|R^OC2ZM$U10IF8j%>9tr|@HS=dzkn5yA zOD+MM@BpAbT-;_I)hINv-W@a%vYi&fZZkj@8~z>U8FmIeRF#;JhNi~kc!F4N!MdEL z?4hnvM~|~-ci=P2j=0MQSkx7AIQR@q8FZN;6~DI{nDi}RqnMp8Bx>1i6aml6XTVKrqIO$Y?#tj#3w#hx7R(nHK9wigKK z{Gq3K8>_qaoWi&sPKf0l}^i$X?>P(k}}F zILdShp~3#aA;E#NEMUgRumP-{mWzhKR#Eop$K&N5CpIrD-y^c}GB)O>VMYKga2r9E zOn)@sfIG`F4EqDj=L;@}))Au->yP z#c(h}v^fHRt?g}$j}CC-#u#}&$Dr3IE6TxQYqW_5k?DKm14H@eaJYrZWKLf*V}Raj zoi7ML*vYe@#JRbr2Zc+BQv%QV!e3p{+0_$(G z7L6fzYZ5>Y81#ygfRD=@hJzuce$fYB8x=vSNY&V6Hp6Im2D@i=X}X?gnOv*Rp{fN) zJ|0goJ{BO3*gs9(Dxmgyw=G%dNg0s9>v$fvW#exY<=)j z(-yK0TH_)@x33M`l0l0`oJd`13vE_t-Amxq`{rF3zINY#KD3}%?95}#$t0e&HF19Ycid)5+VG&=ROyQS09JHv4>&L!DJasSYqfR&h2jC z{;M~D%)-Tp(ME}W2J~Hy^P3~gW;d|a&#{>S7dLy@%_0VIK`GLWy#wqWPtfGRv|1p~ zOY|Ht$TJ*Gmk7~Hf|!Y@g=-<8L5!H!4Qi#`CvYK>lALk9r?a^n1Dcq61rbj$Zfeqw zwKFVin-EwvE07}vHW7|m<+Z5U8CO00;>bgHce%w(c>?z*3oF<9RG2!0wfS5kpV{K1i?A zr-1V+xVN5usq#O$X{H3j&bjZne*%3Atdn^{NB|$tRi4kSSDOK#04#(B=Yz-<1SDCP zr$hmRA@Ttj?o)k8(QZ_#66Kn*t%q0XGBieR_|8y1+6EXTLwlQLYNV>s=rsOsqOuZQ z>;IIB6rTXm5FxTlBol6tj|t1pH|XUSg#|{L!S3cZj*j->g2DFoIbh{gad6DSc(Pog z81xC`+QMSc%i$994GxsXrBe<8lCbG=3qPHszgmBKSq6;G^iX65hzr1FaJiuwsOyz5 zb^(`FID2M*1p&=DM#BgWzH0SaI2Ea2%t6OF9{}@;vn*3W|IX z?6=8WJ~bCw;E4aXMq=xo1FyMUPKd+;6V@E8fK}c`kwPRHW$SZgWSQ%%G9G^gXhVwC z*9OPQ`;jqL<*03Sp4Z8(wRMpXtAGyY59zb=Nk^%=$%nAzK<;7m zCY>SpLxA1wcnUM`wD-F2#}3Hk0CW3J++&<2Om^U&~f zy6CP!ehd~y8H^%f|Kniv)4OLe>meGE^+kx33# z#ZuwJWDEbi>?a2xt%Np{+b4OTDaFlC9Y ztxarhjL48VKHNvWSi+{p+2*hmSw14cGKa|D-$Cw>qX!s*Aq1$lM}1s8cNV_c1dPS; zbWTuVIXU8XG|L4L`m6^-vm|hqml*7zlwrHdC)*A)Sqe)2B^GS-I&2m82q@dEC=;}V<&ZeG6$(Erg< zO1e6y?z!h#xceE;AaM2Y!w+FPosrcyo6Wd?SInk^{lgV&k4cZy$qYAc+$5u|@hd;e zDQ@f?Vp)3(hC_sCa6Fk&Ue{E$gdB~h+&9)*Wkw3v!-iN7VcFp5XoC5?(u8gC((0LH zKT#k8==B)lBq@kJ0h|Bm*anvTZ^jVFsMvz7qyW#6noEJ`Eiy%~L|R^Lx1Tb`kAJlW~f$+7rP1t@?8ga$S= zm`=uI^l|(k-C51DGY(vv<7Br4cnlR`RjVUo^I_10BM#+ zK$9V1DCgCCzK%;INXmQQX$IEQ)6>(t?qvBeYv^>RHgqxvpy^a?MPvy87)8K^k_k0n zx3FlvP}&r4vzD^9E;DPvDSeO2pufniOkG_vEpC6*m7!wAm#V`evxsZvx(d!cG5y=X zW_(wRR{~c~C6LBK3sVz8sx4VT#-c>T-FIHZJGMvY6%oBr#tvPWSGaIyglF7!5x@W7 zLvTf(ROmt8U||rYhhH;6DI~(YYHgMlNucJoBB4|84#?HnD zw)-;JI+)DRz{xhTTUjF{$zw1U6(YPbX&(hj27TS6ffNvGPnJ|@#LU-;akPLzAqr>` z1W*b9JM}sMaMHEnw>$N@N*+Vb5U>zwfU*R{q+OODl_4i!8_;%Cj556<_}2*ojs>Yn z0gjEZND@QLLyt{R<{qS|6vJ^VUmm~-L7};zVCJGA-Cc?oI*sLJtqRxnUwhkmBJAyevBY+0C z5uWRqWw|oH=(#{}(uP1>_K5!Da=!&`pfU4dbWf0S}8n*@O!VZ1?&& zw~^!E>H?@EdYcC zkB?9n3v6B5hH(wx=Ri}CfoAdugee9k@XR~UAu}rv$3tvx<$$l@5OC?-F8YN>KkMW1 zt2fD{%1n;&@jkXT`z&x5)lz;dqhshoR%8gChfIzmy<0Lwt4t&ylT%odOzrCZh>Sp? zNT>mW9La+zh#bX0K_(SL$^6zpp_v45LYYH6e~m%vnkuu(33wdSZ=uNq08J7|!|O5< ztjZwgli)K}K+e>ZC|WN;E*Eeuu;Tz_`~{wyWTNqULrCB!S`Q-iM^dnA9bf3Os1jxZ z1fT=_)PXoxf1`O!KwI1~yMzQ<}#>lp2T3oJ5DD@7 zsjHd;e!b^JksXuCl4XVXVl9`LPA9N11WbB^5|il!Q37cQm`TkNX{uiNhOdPX30(Qw z6F87?6am_^$q|CDB)!n`e%ksN0w`mF!j`-b?;os8!e^AJ?d|Vjd_2ZzV+ijn?Csqo zfVH~cgl2$^jSxDEc}8|yTu#x<<~W=j z5pdbv9HN&yHc^I~BU(-D9UkyFI%~-qqpUB0a=D$IZJgOTLrL3oGDn>x>^mD<*xKF% zLcrBfjlqy9v*$<5gajbu)<=t#PMv7 z#j-}UV%mP?`Zd;rbzM<%C+USv3IK8<^|y}ZBF3+7K`-7*Ot6*A17ItRZ;rd+*s)Q$Igrl0WTQ`mP4Ij91}LvuOgv zHgL4RkIRoe%6jw6_AalF>1;+x?sBNq6_ zm|W_Ku6dx5n|O3;RpVhCS;kKTSWiz+Pw%ReaRx5e&N5B_SP|;IVmj1*Whfc&?Wks^ z5m@V{8{-lPg%s27<$c#8T29-CT_aZ*8Th!i+pi!RqQ<|s`Uq>=ip`}Tz>`xHU?L@< zAw>Q0(&Us@I=eO$vI1Zw{}fHKvM`CgV_lH0N|vKUWO7QLW!T#2p}$eEYm@aI?mEAV z-F}X9!vdzvxZF``Fv>FQ4tj9S3}=TK`kOs$ml;O3#<{@|=gyqL)#DismjK+VYtcuq zoC{67Kg9lYj#*W+3s;lg3>nO^r~;Nv#T#(5T2~0bqxx|GyeT@eX2cX*%pxss7EHY{ z0iMhC5DdWbZ@ZTwO*z#NKd_^c01XynCYf4l#D9BZBKXw~7&M`YH0oq3-Wui0vDWjH z#ba30-N&_#a?N7Gwg%;TlVg&O-fUa>o!k&JcILR;6u+$T-au>QFQ%6{0@QCSD$pkn zi)6qpo+=@zX>QP%=#=)ABzF=MF1}e-z%2xyqPv6cCyo4-b&m0bH;)?ei>t5`@Ghvi zI{3PE0$!>~^?I^q0ALe9Wm*pw9qh}#l9PRI5QZA4Cgk6^bOe@<;Zh_h6FZ|S=2&op|oOeag1sa zUyNg&gfEOUY=oi?%Fv5I!h~Pcb zosK4l*cfDdKQ;|^w?^3N^BA%CvlbW)`v}n?7{iV(Ld}6jgyA|_cJMVb&Jw&LSVM3` zVY4P4d*3*=a8)HR|JDMC+7zSB5x}*nc`8ltE6qhIW0RW~=)l`5xzlux+D*>usD%*Nh^3c0Jsq%iikh>f3vu{#WI)WRKd;pgp@S^I4s>bgiM+ zrq0o2Mcb~QmTW`Umr9s6Er_P({xDX~MOz>rY{T?6fV>a*3UN9{Gn*n-m4J}OoN6&~ z`V@4f5WBMrfPI@~$pLxNQ#YwGoW5$EEoz%lMnAWfYPn{_Z}hn9HKnt1|0~N|>H-Ck z_<(6awRPEFXC*ni$l_ZtSr--4a$pk3Y0_&-Msw{hlM7k@F93K*%P=-cRJqQaFS@5T zh%3fO#?k)XK0*A(d+0qh%Y`KcP3kokq2FgS1QNfW65a{{Wc^ASes;yG;efyF^$`Oo z)pqp3%2C(!Wg^R@$a6lTh1}0#5Qb0DN8aRIm(@CWsZZoyl;==yosgIt%Vxn{IamQs zMUR92YPR5ScG(-SW;l2L9AXRvZdQQHl`9h%6A1zhM|}prT)p}j8$xB75zvaklZ_L6 zz>Lh8)C?{PdUVCb5@9w6Fh_`y68fUwgDrCLdGs}Qw^lMY)?-}PYB@o_S73W8mxomp)gLAaIo;(_kI&WZhi2aF)OG^Z67JVEBs5 zayI*1W?At9%7auFA7RhtL7NNL|O)zs)k<#2@G%+mG=bw zY?g@>I{>c8rPffHnh6L|04y{COW(k!KonK9EQ0`HbaFKOJhDe4x!C@M+m#cl^8>VS4ngt?LnxUzPdhg=? zi( zNx4rmu%4ctp59d_f=OB75Z5T~`Y?zIlu~d=5OSSE!iA!O4C|)SDmCNZR&L^SK&(Jn z@;cIizF9BZh5AXr2v7rEeb+|yz!E@379-0Qa!SW9ON(42fa^pW6gtc=2crhNk?YI( zrM{H)$TGkcMFO-O0vZ@t>>cdW>)`y^ZOlW30yQ><1(qxN_4E+WKHKLFqp2D=Yxp=b zED`4sc9dgdBZH}C*c$e5*Inl@o7T8?G=a|sa0dJV@0A&oYZj}U*GtXA@il7g83ZzVG=dw@j&BKTjliEu6J1u7L}(O^#m z3piz7wMlHiJJfrZvU9$=Bw$a777bjm+0%WRx5RfE@X}f|)&LD+k*bjrg%ix*{BkOQ+V~C4qH*xdE zRSf$Ep&7%t$ZKq{(Z{k0xN&VCz0oEM?9pHd8!QfQ9%AR7XTZd?9hqfvl>AQA?6&S~ zZ*p0%9(itA_&0S#5giBlHeaH@>9D9Km`>-sp2}WE^Xoj181*;M?>R~k7mFH|U!v&e zlpWVKuO))p9JE=RyvzbUHGGr`4PbFx^+$<71wf#Hi0tWsdz(LT03{xc!Qn zF33xiICSh1)=m2333eE4SijV`pf@%LBK1Z0(c^|L6$6!#x6%M9wC~|}2<3r2} zB$+t@6{b*cZjM;Hj;CWB9v*U^T5A&X-1B>43^=>HLz(8${sDnJX>y6D5`xEUIw5$N zCm*GQg9E7znRHm;h-|rnwP#*9dUaLvl>~4FI*8Zfxw98hH*+*%s!w3aTEpg%SU7k# zOK#q{frI@693LN{?Dep_dj{T18ewnL$JXxFiZRDTzbV;CHPs2h00)OhxOVL(L6_Nd zPMK(Gl5)PV0zroZ9>20ISZln`d%u|Msm8CosSa@O{SV{v{+Qd>U&$ReMyR4k5qj9# z-IX-MxtOC1+ucbB08=4L6up2VB@!Y+6GRCpi){jHF8&R%^*x*}7YKYkkU8k-Q`>9V zoJp~gS+UXR*c=uFORX)@c+N{HW77osjv54%MTV`S z2j^=UuPmn$ek6N@{%+0~ty$$ds|kh)nC&vmyeCL4=Pj>8zSq&7Xp@YqX=ZEKNa}86y2@)Ga9c_t3;h% zlfEPqb^#PftER_ONbf6P(M@c$N%H3$pq~v*n;ID;+MJ+En>rYP)?-f2E6?rWyv<@M z1(^+S;4<~7@}aCYXTfWMY^x%Ni5_SgNt+A}N;Eh#7~tI205$}6c{c_d;`voikmU}} z^ia~LYDRWcKXWKt1aaoPgtLLg6TP{jcwaSEWLv#n4r@H%7sySNsC8N-h{0**D-^wg zvf$<36unK$LakX!n&EJ`itNr1ec-Ye(UXCmW7wDdH|+!`n!0JP+zwy7XsNXyJg50%wsPJkex-tqNy0E_1^LgYCPJw_Rl zbWk7@ryf=Ylw4Z{1YkLT6ii2^MAi2MYjip715iSUYq1`l+wFA=VZo{wS1Z%Ae3qo^ zM!rn_pOk&69#y)At_9Fw)_ti?GNYi=I$(yDan;VN&!d7DUCX9U!d&c9h}xO#$>l~E z#UENJzk*`Qs)@HoYj~$h^6v-*lr0BYW;g-}8ZLo)hOjt5Xr^!oNzxck7|NR`c6y$? zKUVjBZu99M{i6a{FzxZ^KvwOt*L^)Z{)7>oV-;h&TCub4M&?l~LWt*3XZ;d8*TfS` zHyxH)n@Fj^bb3u0lyE?L&2(sOJhSz4DLNhif%G7TFfHH~3?SZ>QcK|}2CzcJ(RfUd zsmOEmdVLhV9@L*MB=%`Zv*rvNqYVJyz}PyA-E-$wtSfrvfXygR2FlK$F9z6+Fv`!I zKgZ_9<;#}|%IxfHQ8uUXxvyddY7zuPVvEhK)_y9Csz@$7!P}>3TVZ2A4K*oAi z*BOJJ%Mf}!Y3u|~spkI88>#MucohwLtc5)Ng^mz?g<_SkcWxKMUZ2bnS~xVUgUAl9 zEC_(+#_)dTtij}P2^)c}(FoZJpsVKuRd;u{v8*O!hdBVV$rNsD6a7Jfx>;a6X?->O z{ejjL%7W$nZu{)E1ep-nDKQ#uplT`{93BdIH=S}n2(zss^DHY0dYUaaH?eudqqJRsc#z0=QC)EUR5`kPbQcgIrIl* zs%h)w`BtJ?Hf-uD^S{?Cu`w91hK;@@)93LEGYw!%*b;kvaMj3WDN?f~k1KtCJ!8QiHO*Ze}`Of=MEoNdMpZCzSU?`Oj z4UU&{o`WuAXzC^Md;k*y_gn5Pn}X4pWJJFt$QeT9U&KK9toZkOSjaRQ4sqeadA`m> z&lu1&D{s8Hu=_HXND!=-c>QJooYt&Q16WT_Pfzc<6Mtw62S@gjCO4#lR|_8K6YcbA z;l%El039K97=oH<3u9^Ba96x&T6u$k8m}9`wZ^HMWX3*1fJkc+;E`o%&=Yjf(SXfF z@zN1SnX$;N6#hB|Nmb)~#zt5u!yrH>1xRGD*n(D0nE=TLt1&?Uv%1EhCzRm|fyLB2 z?|&QK`_n!R4?P52+#2CIci)Zs-hQtbfSXA3_T^%NVZTH#3&@N^&qQqW3et1u(<3Gl zp55x>>fsS)>4wx)6(WiR_IUnXHo$b*prRpqj;d-<`-rkw%>zCU+#X1>k97A4z!a_! zk0%8dqfN3nBp@r3|Hm4hpo@Zl$t)UH&YdiW0z*ErrbII4H0iLF4;q`mqBc2IHrt$22D%h*c z8$GY{Ogzg14Ky7z=-+BGj4|!`ed7Phax;{%DL80VPUYKUnz5h@u!)g}PAZw;W`Q0a zVmNQaq&)3!k*g%5cadYXLScSCiwnJW#rMnrrE@U#3_GI|TLXt-nat;1PEa>C4Vrom zmzOA_#}NlML70IEh<=X2utXCKd{`u(B{@FzatZI8#Cew%%jFa<_L!pQvI3^;!7yMm zAQ;cC-DqnI)5>FGXTMfn*4JUfHWmWe0;Qevi_0I{sl?6U~t1OV-NU>PLv zKFD{ge_&Fd!K7tcWnkI#e|Q8gD}!lib+Tq^dLCNeDltBH>-a(|Y1F%eLN*;=DV^kc zXwBDQPa1W%GQSQOVIYI|6Sp>D(y9in3s@O*`*gYP^DcYIm@Zhc{>SoR^(`AuVmiL% z0Iex^b;Uc3p)M$tu5lwGMFGMr2j-X@BA6iZRA0l-j$vX$xsC}|yaKH*Re`rt7+0qA zq{9m9zI|H+iyH}@6d3R5E>HPxz3+DbEF~#M(;iR-hoSp~Zf%P7&oVKi&N5-M(7HgN=w5HgW=7c`;OKZpzn~T4!_)LU7a%HG zPHb)UXcE1W*Oh}IqM-E9MqF<&px2NxpXRd){r)JKd(U71u8Rfexzp6b+EOrmYhwew zL7#vI09?BB4g~KhRa=2_=gwW=0D3Z>vF38DNyID72Z9Hb!yO+TVQ&Rqojn6DUYM)x zVRL3aol`2cwXsbQCOYx9oYf092QQsH!@BdzL)XyQ8hJlM?P~%U8@(R3w?_nmR)F2g zcWXEt!5Xt-t5DW;bU4OjGDGmvwA>huQgb)Q#&8pP<_Jiwz?$G82H{yo#+kKdb({!r zxFW~V(J_Xj5p14gbF@v?&*iIEFr6+jUNo3{spIQKjs5X4E}YxKbDsACJoh=z<8sNG_KrL6#Lo5xmQ9Vrqhls0?jKA<5fL-o*gv3|`(!r7 znKNezzKQhRVRJBq0hmCX_keuGj0|H?g}jz#V5cap$?S1ZU^d zC5obti(4h;d)M%IGh>S3?wL(I=h8V8F2l7e*Kl~a$92tnC91^&2!_`i0vJND0<8c6 z2EDax*4K5-eIB#0V&hQ`?1M;oErbQRwYh=4ULlOdYJsL&iU(*L=9QEnfv+PbUo7Bh z6Zfa5r>A$}iC_+G2Ry_?6i%9S%Fu9K`hP2lFo@dkCSc-&ru+$Y8VX!luStT*heww0 zY$U_0Es)jsD#F^JT}sh$iy^Tf>R1B=ka0bVL`@Lj39twqn!N&cax;ce=7GBDw%#fR z3SLE70|HM0CJn-om)uqJ@f7#mb%|Y(%Qvs{#}w59k39GmJn!yZ>|G7$!QdH}E@3u3 zz#vDGc7Y~{rH$xWgHbQTuxAmgDTc!g&%AV&h1Dt&*ycHDv6YuZ7Wy<*3*>_l=2eYF z6Jcyd5NlD_$wR^r^k6rL32;D`fs@eif#@JmrIF;pXpQK~wOgxx8%Q^1vz|;TtPnL+ z*3MDz!i*}iLKse3gQ}))wN*2+FH6~YJE+84UI|ZfK4QfO#mjIWL=-EJA8;tAuj1~}3gA|cN)C~*8%mPTjXfz5U zp);LiMhTc^PbN4Kwqr1@ICFO~4m{%tnncZb3XQOBp%0pIY`sE9>N6dI#kE z8-hwBl^_5C6#1fhhqV&mpwd&*o=^$|=FY)1p2yPJj38(ZU|1F?u%!HNW9uv$LQ{c; zya(40VS;B7UN~TSbcje9E0EiqpfK4vxy6!k%%DeGur=2)Pm$xx#T1*PA+i)Jy}x&e zJL5eBrHWp`!qiWuz#LdiEA-Fw2-Yq9O6D>uw=xrY|SX0m+FYj5{1~fU3UL=EZ zOg$L}E;?9VvUwua2s=Q3Yt{G4@i$Rra)~?x+a07Mh72(QA+3B%@g$W`LzZQ<_=Xtj zYq$j*mqqEc1wsO_GYj>p;=CG~=Hz@Q2&bmzfJm`H;96y-Xs>^3JJ)OMLNI(E%3!?3 z)H0ovK@+=!Wqtbui^>A)K2?%Tq~|1zvVpta-|f_qc&$GdMOsJVdpndM-U`Nu2I)ttUJhK9TqA`?^7H2VY;p*` z1L&Dk*jcA}Z>_WAbY0PbJx>Q4TMVsp*0qd7-R2gniUcN4C!Lv-GIWzX;tYcNC3Iw| z?XqzSrWe++*>%=0*?FA>nD(==eQ+K&Mb;T$P9%;7Pu&z^z;f9jFgzh6izbFhc@R7> zomcRF4y)IyG|6b<9F4uFHJi$1h zG1br_LkylQmdpz4?8g2c8ZQhtm(#qP&--N`TU*=Q4`#KGk0%5mw|9041TK~h8sji) z0;bgjhx64s6)0^^R^UC)yohH%=Xtnv$2l6JA01C||NRf){JHaZ&U2rG;iyNe4C^xd z{=M(O=Jqb`dCqgOv%5v_w5!+maqapZ#zzxmu0XFp#PM;3CS+t^jVB8jThJ)HYUY?P z8);Zo71y72Zv}Y6#yBksX5%?R!k8OxV9ODPc@KdseV`~kQ>FzNF_chh?bp_9nyzeM z)KS#?Bp;L{<$&}&jhSp>OzULniy1MWPEm${K~H?ghAxvDb6FG29FzrmnZ@|vP^>}- z2n7rVee`=JS#jgUY_rA?Y^_${5v7iqdH|EDck}vnOvXoO>Lu$a7i!Fo_An|Po_WVP z>TOy&Ko*qZTOPtkEngEN2T$j*noCV-02jeun|zoPd9gNItnwCUvd07LsadQbM(O z8uL0pX!x4eIBLJqcz#xs&0CAcr%l}7b*HDNrzgkGzXvjth!O@~*fbKwA047;2Tm>% zN@|39@pu@52q96ckz`p)QC5R0`IE)g_bMevDE*!QiW&x6#MVF>!m2WeEV9*jSYqT= z788M}X<441S!ex+U;qKYvqkGgwM8a2p(Vb7qNA7ZO8 zxZ}(gWlvXEk-duwE*r9&IG;=Ejjtnp7Mfb59@Yf{6wP9RMO9&Q*rT?-_6>`?Iy3|c zRW2t)G%Lr~H^|E#Y4bI~uL7a=l86>OnKq61Cbh+XY#9}nK$d9M#d|9Xppqp$d*f5# z+%nhzsPs@M+M$tsZZj^^OM%d)^(BBtL7bLx(HcN!A|I3@L5DWHTw09pVl8os{H!qU`2 zKySRV5A-w8l$HdxMNQX)n$BiiXECUz^ihVxrUiXvEG4fAKo{U*qP=$pWCY(xi%-lR zYuNd6&hgRIjeva)h(foNb5y*^6l74EJhuf#mSx{KGGX*GMjSyykCm6aoNE6fMyvHs(|Hqh8htEH*R7y9KkOu)HE3m2*JU} zDZF(A;X(v*D@lEIVsHBB5)f$tZ(vi}BOH(wR&B^pSn<0Ma7JZ@DJe6qvrKqBsD+dQ z5UpKLRB&Ie4ky3mEX0FKQPq#l$ZP63C0$}=)LQi)L@?m{{6EwZNCgWTQ~<88uRHG^mZZHRG`Q6y z$1R>D&vm`ILR?P`JY}7`$dWc9%x(8pe1ZocPC?c>pY8yr9dG#-1Zw@sZh5|;D^rZ^ z$s5%p&A3)p+5y^R|J=r(tA!?8u*#r?d*jKkH8^dGdPGFrq`-Id>HkmtbTppfaQ`L_ z4ySS+$vu{To2E%=gI??{%922TS(co4JehDFVQyL4Fdzg?N+WYuMrH4!G8qbU10+}lgZ zlpa-9VtMTvPtD=5L|*1-qD7VsfWpG$19(%4ht#w}9UP7)D<(?@AC_!x9vzJdUW6zT zuE}(P&5a=}fa=B#Ci*U_1zeG#A0o2G!NcP^O}|%(i5qbF9F8e@4pkj+a5Tki83-oM zmJOmv>d4#%Ed+#BeK?uooew-fDdqOg4j#XL16Qu^;hFc0c%NQv_rY|Eqv;$6#}go5 zg{4fes68Hf=wUqk$aO5M28Rc8SX1H5nI8K6EfoC?%x4pVd`$o{WCU%zuL&4h>x2c4 zfB;SeQRhucE!E#0lO=!06vz=lh7wK2V_3hnB)}@HU6WRskD?~vy=C=)-gguD6{Us` zF%h!b#NgU{n5sfyBuQ_F0BM6Mebyv+2~8tFXqKTi^0}s|=}9#l>|%2?!cAu}n=L6B zHJQWB8`m*fg-p4OAaGMJ=`HoZgAb6cH90;;XnN?Cz~0Rpc;LSKV5489c~T~LG(N`R zWPsu*p0+1TH5xw(VG?XkCi{wJ*x7BxnGU^B4TCfGi87q{b#7&w$*@0HK$ukBbyO zR#ABlj8q~Z+Y9k^N*$Or`HeALFO^9a4$5{AAO=9+Sp-OWO*wG5`sn?5|Mz}hYz!Ul zz5g9Jv$=)7$#L`YLpXo-0* zMm~3Fg6yXl1bD*gxiiVcKEjKsJ8vf9XQPAYsOe*f8B#IOCezXAJ#~139A9}rm>gu# zIjadk!bV9qeT&4xGfsdKlL1z4fbyLJiY2(QjU-136EIl^cL^8sUi6JI~eEFQR(X1vZ29->5c~HsK>d~~3znKLN>W%5a+qq$V#SHCcrZ3V{RijqS}5dgGq3 zA_D*fZ)5C(OfE zx~r+2Mlm(B7P6p&X(IrzuD?tzc%@rlPm}MpK_W4W_zBrQotBP>s7`7YwBRvU(3n;Bi_cyKe5_PY{9@2j#&w;*2GG~M+bD{B$N)_ zUnc6d2B5=wg|Z;+Q|y5SgGJR~ZzW+{RIG1=A<@Xa)Ctq4Zp7%>%@>I47g_|tqbkf0 z0m_AZQ^8Q$4*nMR%97jF%W{zO5-pb%mJQR~n&8vD($TEk8Y^{9jAVk)bbYpvbkN3= z?L4nM>#Eh~GdID`QVic?2$;^MI9f4(nfe?tU0hDd$q*33H%wAnB_&!D>GxCS8ULRd zgZX5R`n>00elQ&2jLlK6((sOEF#RF2!H|AiS*lmYO~iQr2-T_?dfZ2um;CIo-^ZXg z1l$07hYgO#4T2jXm>Nfu1~(7KXc}RnRMnKqf#Btyd_13Hb27xJH-NLWR}esC+Q8Xk zZcl^2Z7Nq@Q{yR$y+c@+Q|7l=M)>I*nAPwBJdT55q1F<#$|!7x3?N(V_ul$eJbHN( zySqEsKRhBk`tck4sNeE-S|J=9?bD<`xB`>e0&jim+hJ^u>(}?OcQ}#c$a0VxaT#ou zAtTmzcO+Kt%>y-I9KoZskBqdNpFEdS57rP3t zz&-yX^;Q}{Ah!;g6$V#u2GjABW2%0cON~d#X@+^`l1FYvdFk=dF{bkg>vRV& zMRGP4IqHRT=U|z!hlFaF3f*3sm4yKbOnz|quOR1grT;JSsVB}Wk=>%tYc3GR$jnu|vzvTYAxxdHt zh=^n++Ql6CN;X^cV4@Yt=$RcfwWk!-TEj+sSk=bDW@O!WbMGc53{P@^abnltoGNlK z81#7Ehft#^3s@>FY6crLzT&pI%+XJ)sutMVI*;?`&SGO@^sWkEJv}`=Jv~_)krxJ` ziTuC%967uCt6hGJL|7Mu+ZevD6iq2AY#Q7fc_b5HYg(#$kvUn0kNmt3sX!z}TTIYR z8k}XuXyOJ3$pt&Y!k8#B&V({^$V`BZK)L$7O-z&=Fd_M888IkVgZbR0fm#CQ8bm2( zRN4SiZh2EFoK?y&qBY4dTjFZzGi3s5*8qNo?Lm%nn|%!6adu+>7aJTMACUh3;QepK zi(c?7Jn+u9U~9!1L5;<1ik6&(%ZS`k9sp9u(N{y zU5`7~J{Q#w2aR@`yzcv)MNw1Li3#LL3vPXJfDj3e@Iga&>x4sQie} zEfh?Eu75jTi1LW-pq%Td>1{NnZ-kwrv=3quQDt62mkx#o`~rGu!4%{<0VhrD6c9?k zo%6Pl@s0qaKwQ83!`V#sg94Drn7;OsI9bgX?0he4cBU!GgQPd{*j7!$LNZ2=pt470 za7OW9<2ImWZ0I}+RG8ospaL4(!dsMCL}41Z!otOxlGK4&br$>dFM;6M@#WhFij~E1N9HJFRiM{%;+y3EEii$PQ%I zR)T&jkO>NK*bWHwxp&xGSkVq_8Fi4pFsAgzfA&Qb%C{rE>L%S4|Zud z+gn5I3(uD4&CDcC-1*|5THRc}x= zT92k(jtQq6bJN);X^GnGh+PS{fl>K&cbA%u1T{2pvcPmKwTY8JFe5B6H3T$x3MbzC zBkBmaH3^mHeLIC#NAi#d(tnb^yQ4d50vtP!yNaB+yshYQw<+uK`|IM&$^#YTx>EoL6D#XxGN#`AB! zVn%J0EYS|9OW3f$q^xN-Q5?=-bGgTlCyjVU#MCK*hdkJ6h5x9194?u~V4C2T>n>6 z(=J}{C;mGA_9xHrqu=)}_)quYk2Li*w(zxo{U6{H-{S(!gApq{@amt!kN)d_hu2)i zlb=k6{JlRKpLF&Bzw)X#uv@?>yMXunyuXO={4?*zWVJl~a4#>v5`X*e{Uf~kEff5o zo{Tg2ppW@z_(y&VZ+Pb%UW=pMJMme6>969eKkzO}J8Y_F_I~T%;2->hpTzGRJXL1r zAAs-v7hi`n5B&%Hl^^&yOsk0h7bfcfm#GI)VoW6vz{b`zRQve`GM_WT?Z{Ma0k5Wp zQu~IKW`+PHP^>VX0F;&XuMGZuGRAiDeTW{J5x~m90c3#yMZWsHfy3%Oq-gMnobo~^ zU{)p+YaweHc>Xb{8#Px|ZFNL|_&!yEl{?KV9g=Jf5&c3;!-F^J(qYxd!8`|mndLTZ zo!Q0JtCx|LId)b_WYHrJ4f_28S8g7lia9}(t>HyH^U^ug^&E?8#w5aFo}-!15&Z(A ztr3>>90${y=T@*_S8cP`$Kn1V2iGrp?laLe4R7LA$Pq$DU!4F-0=dr&Lh|152=rje z5PTpw>A9~h)Wm#j+T@8q=hz})pyDw9h+#BsUw{qXGG4|1a>P67K&T~ zk5Nox?8MD#Y12#u5_S*TWJJEN$&V&PO>WZ(Jc@FzwO&e5w$r%8Sn4GGsUMRyY5U|k zi(13u?fLMl`7>czY5YIbQ&$r?)!!zuK4kC5H6{lDuCw6-;zuCclGtkM4HR!V5{;d| zCNT-p_NuUq)O-QtbbYK%k~Axcj}#hO1-HBsf|4Ap#Rk0hNiLg7;huay)WgOT(2(s8 zDQ-O1G*Cd~g*g)_c^nkMQ11e?K$b8xlWeI#z$nX5h9!ospzl>&&QXR6X9pX|qCt;= z3G!Pp*eEpx553%?$iYIX4vvxvlSeew44cE11UI5-#;`@ivRT5I0tN!E#wPi|aUfFw za0-NoF>5_X43#hxSL-wwpeP3@H+Fe`47ay=J=6{0je!eMz(^yX&zz!3&<#P zaq1LX6fDYL`Ts2iQcna7%!C0J;V9Yh8|N)@O*F^kO{+Psiy_ z1vvuO)ylebw*3^yrQKFJwL6H`Ellzw6vS*9OWnz=Gn(QF&{?mcmQh89`4f+`>B=T= zC(D%O8$BNSIX%|hq)fB!P*2&8O2u`dU283wwY@~2^2swO#-I+eYcugCMgX2%B#@$5@PUt_Ue$7Q)HMMJHX{M~UN%Wx#)j0g zw$daq9tV{}-m9@#E@;A@(!qQF}}mN0iKu=S%&a6A2_B zARxf{v>24!ZogW06ewjKc)s>~Ju&unku{FyVje&Ysi?C%4ifv=Z9sIXi$;atZ3(eDok9L;89dR)S6U^bruF<@tR z8_@!fKYk_otet_INR2Z}UboJG(#X+hKyYd?pVAE900Io1J5NSoh)nWhvv0I9La)C{ zn7o?_gNwzCa=gur5uW>;=ivN>3%K{*ci{44j{yd_xpx4cR5h^DFfVKmMK8n6<71lV z$6g;zp5fuES9wg0b=cWGLx3*Ol)WS~@~&q*1B1OiGVoSll~|9|I6T-dbMni0EZ6L--nQzlH+_o4&CK?(1WYd|I ze;t?oZUA5%qknOLPy5_IkL7D#jn}^RKjJ22`s_dT1^7!}_=)(w|M(!D|2`j&7iKe* z4r^0^-4}f-KI5~;c-_DF7T}KvVCDS{eDa_8Gx+2?Zs3)#yccI*`2P6BkNsf0XloOH z<(vKq-uQPj6Lod@7?tb6T$LD3sF3=GFe_0 z4ZC)|ETAVIKyssGF=2#>ltmz_hn9HoH0;_%4t|44z?Vj>Q$830evbe^K5{z=%G4pq z{G|5R03xc{5;in=!3&;?>ETW6kH?AS;7J*O^x^yP?7J@F+SMZ%2b|m9qLJaesWHei zc1l1>@r=N7<_c=Hi=p^0_3{FD-fytU14Gtfk}OG?ch-v6#Ijxzh%!b^&V@ZD^&2zp6BnhBN`yv|MyX`~S zT_Fl!rHPJ6U>E?SzDH`v9U<}5F6c2qv~Ab|(`gilOV^}t=$+OkxNz3cMw#;sDL&~_ z6+|v*$!$waA z=j7lBE{lm3>DgiL^>TV$98Lpb*5i4dk;Mg+nG7&oxee1xzS{ak= zq~=M|pV4y%&bDt#N~e6rz#*h&gBZq zId-Q=20Qb1*G;8vHg;#fZDL>StVjF4yX7~xM9lw{V-?a)Zhy;yF7I^ks26m{|Btsgj{|H=!IFoD3$|ud?J~MPT?%rV&Ng-?6G8&gjGi3nPx2e(qg_`8ym+q? ziK5<5)+vVo+J`Q~5-i~Jr(8nl`LL8Hp$Q1luom=9su>Za4omff*YlRoIt)~sw|-Q~ zuW?yR+E`5I527BrOc>gY;4O8{<`kb)!C>k64QztcA~Q^?1)LdpQ|fStd;Hs+uQet&x2eJ%OvNC{-Q|BlPdI z@7utTU=5aQl4uiE#;)ggNC0I7OpE%5HN@0d@!nMLC#ZL$rZuPK%5Qe-hiAF2HRttm zmlH%RuZu#!HT@d#kZ^$KVBb#q&wC%EG*@#1cGvl(0GDJbzQ@$Sy}=( z<;EUY%$=1{KVLhuy@@+6oG0k`=%bHdK3jQ;jd`rg++k-l#L>YXLN(`c?GH-it}jhy z0-qJnkt`R5$>I12b!d1j%Phyn<`9En9~aJ_!)UaD!^2~g{Z+c;4%ta{wOpk@l98mf zV2mI`EBQmw0DgCOo6Y3I{W;SoSKwMOk;$D#)ijjQ1~$95x3+O+cb8ss!8ce|wO(`R z5Bk{I-NAS^r3dL`zGS_8_KrL0$91r`Pe#<%#wGwmpsFwyyJvTi43v33?d|QOEa&_z zU~u#1bu>++ubrq{G6n?HbPap+B68 zY>0fxS&XM+WUwqAJg<9$MUbMapJj+uz<5!ksv6#q$MXfF`Qamd8kqD_*G%pydwo*B zMV{9PkeFF4>jq7f0d6#MOpR2!WSz)y7sFB>_b9BTdfp`FPy~X!=B$yw^c#S9Ndy5Y zUFKK}2t#Zk9jq)0JzQubZQ-weS>kuab#1RdO#fPPfP(Gs4S^m3Y_zb>lFyJg3SI@y%j04K zmm%xyQ$)1`0HLHC`7W-b0u?q<*@O64Wy)HkbWuP{q*(Me!7-%$yT+bK>+X`@RTJf0 z;rZd4)I|=+RNm+;{X14*l{ey-0R_7qVLK+g6sAyG05aL{>Tf6AXwoLZYl;Jo1WHB| zDe2oN47M^bxu)OCu$V`dVy$j4i;jbYZ?%Nuq-zydj*!hf^|9NCT!kuwetHbg`|@M*(RIWH9sDZ zr7Fu+KO5(9a!PDJ!=vB1zget1IP+Mh^GsMTEudp!>;OEg=W8Hx3$=2R1ST~O)YpWK z7UjN?z|l2nP!Rcg>l&RR_!KA%W>6hl%Uwhz#P}_<`6iko&9S-DMIbIY8G% z8Jq3#G-#J04W&~-Wvl~A2A%t*ZcON~u{c)X|7DdtkUSV$EW3MbBV^NcIe5yaU@`(v za5xm~n;Z#zN-S)fX$S=GCoM?GUru3_2cy1h@X8p6(KKy&FSPqVgoq|U0SeT< zf|XjOP25x)w&b;mlwc+-?Y8m8n!@rp5C~8^?x=?|msH?owLoYZO1dH<@3+oL-JO{z z4T~W4XjzmTqvfn+q~7WGnJ~wDaK^ET)Y_xr2Kv3gdsSYRihXLWB*9053c&@Z^%tM( z|EaiXg8JJkFxzee5~dRr)z&#QltvXAZ6aTL(Ls+v%XADT`GzV+oEoXg`|I}4Y%ZkNf1@LTQ(6iVoGd9a^9#*(;;d!X7g9<4@`|b z*0cx7%MtFm`%Y|aZ?aK8K0Lsqk6p%idd#uIXnO-jDDea@M`Rlr^m_x`bI-E~TD|RU zZ^Q0lPNl%3m#^Tl#~xb&mSi&3b;WeXYgex#0_c?m0j?&?aBy$~v+0x!q|qv&uwTMB zsnvVE9v_Rvf|9(4AAXn#mBD+Sqe})sabC({&z(O<*58$DS1}$Rb6@Z5j8F~+Sj^@e zXEiaPY#N&Uhv^i1$4AHqLmr!}H*etat5>nNzekDh*7lBsIvgDUkea+#mXsQ;c@Sg<#~K8zHfCCq-jaE zr4x8M&*<0t|GWp*{GG4FZ~ph6#$WoIpM@8{|G)VI0P8jQ_|N_{e9()x@n639C-BhK z5x)N4elMPL?VsTg)ay{`wbw06W0_jpx8me;u<4aK}qN65sm+-;ej)anu3- z{!e``{_5ZQ@2EcNOY!}GCd_u`@JQ?%3Sf;z_ao7aGwZ^D~@ zHF-EapJH1F24C&zZtK5+g}CJ_^{tjDEHNHGiW}FjqSZ-$6#mj*{~P$)587eU zh2Q@@{Ozy)2K>kT^YJ4;_$k=voxyX?JG}jOUV(4<)r>U*}=K3V?28Q{kS>5 zgqObeIbiY_{`Oz{X8hP2w(*yK;Ct~^?>|BnEDqoCOZeI!eH?$`tG*h~zGHwpzw6iV zb6@x>{M9e`I{f;wK}wG zck#F~!pw0-*e^5_kBGq{0;#+Zz$&)_=+HBU07oVrRx%_CI1B#YS{aNQ0Tu=DGU8E` zJD^9JDNwk8LSyC$fF%QCr$*Vrv_Mq96=|clgQtilY29tXZIOc1rEXpfJl;ad&B!Ja zI&qGu`>x2D3X)kdh(9{Gfpcee5V94slyh%={6BNjB{^EJu*gN3<>${wQY@U~R zeE$gJdBaq-907JP#CSHRVY|%=JbLX07Qs?V8?D7;KEpCnOV1mOff$3siwBlRV%fMH z0aEa|TqTqN00cmElt!``q9icU;%zc{73POY&*gm3^c5eIXPCML#73yVxhyM&L@C$( z$-A_ zQ^$1M=<+owln*X1Dxl|2PpT8(>`6-npE#`n2||=qKe3jfsj?&s`Tsibb4&CJdK~q+ zuIVW&*fnB5l?B7~I(1>_EDN`NipcA-g!Wf`CkHghD_Kqu_}$R;~It!YT-B ztgy<1Bqc|!@zzjOyT&wak4UOvB7m;Kxn+2(HOAU~I{7ETp>86oWgu9kY{A^-utw?) zM5rI8tO~uQY8Wz|40@$wt(9dCBa-%(4WBt-P0MF2fc1Mq zE8DmH6BF>J_mKb>Y=?1}nDL=CFNf*)4|cupPU2VyP~a}!613M3#1?}WnW#@n0UihS zB&CNWeV$@k_sJ@KvaZRNuB(Rk=$h%-1hB}mp@cBd1CBmb2YY?ob*9AgH!tDrXoxso z;DOl~hx-Qvun;`GZ0n`L;ql79>5y`~5HjwwGB>m!Km-|rMZY9-Y&ssx@~=M55T<)} zc5v6`CYfD_$43}Ai!3x4l{t*B5t}7;w}xa@&F52u%?)nHbb%)ABAawrE|xIHkioREF`^IDa zWe8pySxB!hu(P{M(D?A+kTvUIFi3uB6GQ_hI%iqNvCEB{`veD{_k!nRclQjA$C6&z zh`%YNt2eIRVBPF%NspdaHHwB#{!EX|4-c?yfazj^s%Z$aVzq6)X86v0x#T)7mu!@B z-{g7D^Kv+@cLNjmIL2@M&M)JYN1uzY{Bt|e)QbG$ya_ne&g%E0{{5td3?+r*YNUJy&50-(Vv8KoA1DX_>rH)Ti);%aH2Wg6d1fW zzWiJN8$R?a7T6dZ;V1vbFQNCopM-Dw^7qHD{gto9k3RS;eAB=DR{XsmJH+q)!)?6p z2YnJ==--SV{trKo*S+UKf_`9$FRQ&3jUxVY1dls(0=@;?uf9^N& zCLa~yM>RP{@nIj2zxHdd$Denb2#>!U-}!BS9dCHe|G?Z<-fM<``1k(>-uj#`!w-GQ z$KsX$^gHn*|Iy*E{LAmapZSGf#BXO8@e!Z=ak%lH|0e#wAM<|zT7EOW=^y-E{MS$Y zZ>VMyRCWUwKIMDy5B~CJWB-@G1K<2JGkope`6p%6eMPyaYoEGtr75o1GE4*q-b@Zf!9P28nPD-$Q;^kSqLhpN{Lu{ zqpZcxCm5zu*<2!LEh2$2m$dMOamZ-^Ey*5#9FcVXXSRXwky$2vPlM#9K+X z%|iy8E(&N9>W}~!gN7!MDr;lMjN5Gp*a10x7%XqDAvgd6RtUwsVF6SYIe%!U%L*GS z?RrtbWd=>Km`p3=xoG6AH^}=#JaYMQm?DEM3LMQFEWE+IX;5K-qeVqfxhN%$8N3NB zIe7Nk*))*Uzse_BW$T?p^Gic5S(0k-h9^Jjl(bp#ImbjCMlhb1p;V4XNSH zLqQx*({qPtAyQ81(D1lOkpzv%R}=Vdk=?!)+V`Q|#n!)Owcc&qe{#MK+^*1?*P;dA z7-=n^<;^Th5;!q8w}7$-BT|WZKpcO_5&0s^WDu5E!AIiL8uBHIL);b^wNkl;ADJwDVl zb4PA5n;)XI9=n^HxVd))^>Pa9YV?YdT~|bh91^~;7*Ej4JbWEc^m_=tfbnC5sz#=r zdE?1u zwXfOr!FSX_#tE<{#x+Tu4jj<{5d>D1?F5w~qm^5!JQ?bl1bYhT;c@z8I`S-Yl0v0^ zIw8GdTjuZuP1>7oj!#wdn9I&xRjqGYDa zY7+I)>1mSMLlCe^o(Qv9=S{eH0!$Q&fr4nt2#cD63#abca4=kC2arq>xTkuG5m;0; zlg6ye)_^`WuGglHll!Hl-SRbkI9I?*6N+_Bqy9=kkDCzy---X@I?!U$?-Q&xx{`eW zFuL8X-GuHtzSj*vP>(o+*g1b? zpJ_rhTBcR^UZepLP#~+LQ#N|(8C1&}*REb8;KJus4etf8iDC**z{CfUiG`GyZH%np zGOXTTU{psm=Nx*y3)r%NS;;e}Gd529y%mF}Pax%Rf1lq~<`(nV5Ny2T!Ua6*nfK66 z;CMR6-q9RQ11#rr)&`HpFskHW<|+VO&=oVgvMHwD|Q>Kq+x2o z5JfpLolQ_T4I7J>E?mSj?tTWp)6Mp(Z6hw(!%e;eNOtN$Jz`-$(v_x!DYhqs}Jdp_vn@dID`)v!Nt zKYsVEH}Fw^`RlRqKVFV+{Tn}qH^1W$j~#pq#*260AN=!wjma{ej6ODUBe3NFy?BJh z^WFpR_fa2#@N?gW@B7z3j@QhAi@)?q_<=9`B7FK!z83wP`}mcA@&)+%fAJ8G{Wf0w z7rqkBqwmCT{;R)?UmgAlJUst2y#6 z_Xhmy@BG_vpME!HU+D0gFaLY^J8%DZeDsmQ&c-InL%=OA<8S}yf5I>P%v z9`xqNzfMmN>EIA7Dy>NXjxdo-lAguHeyI@<82=8wmm#8nm`lP~crODIiW63;HaFWMigw0V;TxN(-V|&#+q-7F$@$pdaE5tRE+BW$~K_M-Ec${NeE`rQ&Acbob&3r0&T}OHl z`P`ah)K4HMLs(-Gd6Cn}|D{M&CK5Y;aF+iU14(6a>GC`r6mM#Q8p!_FeIx(3tuIf9 z717ZzY1cF$_{i(Ri0_B`Qb{pwo8)caWWN}jOuCH#UC9g|&Lc){qq2F_V~f|Mc4dv6 z+bjt3BztU{iszUMNX)H(LL;gvI}W7E6Tq@$X13ldt{o#0vFvpYNJjfOBc1zaJ-Mf_BQ%wci@kY(6a-k1c|f>37qAA5cyuv z?+F})DC^Z|m*1RxIBT?1zRsmv^U#S%M80)^vvb~9NtZNh=S}EKb)VJ zroye+Y2U_=N#(;j#an?Fr)^q%(rhjT$!|N^+nCE6*e7oBtpJx(SH*Tr)Z;1hcJ@~X z9}2eXr)4@O?x#$*@xZeB+3v>0m>wa42JJp?87g6Yxhku@wfUAZu)5&^0*>6)*k3^_ z#MDqyZ%CkJwkRXasEScHGPK{T5;v9H!UHCg<#)leriOXyK`b#pUshOJVR^LPnb6=F zGBK=kY{<>$bCKC)oR<$Kh=zu>g`S)8o@*@#67ZyxzSjQkh=-&1x||?kCBj1Ib7LS4 z%%X=Zb9|I}fx)0Jew0nnx1w|bKbNU6XYl&Rb@ z&qE7CDci5TPV}QKkO#EDd*>@*(D69DZBPPV=_DlRxt(kt3=*)fy2CY@;W}{Ey*^sZ zSnorW?~RX+c~3V+8TM;U53lv$8e6sn$Ea%P7X|V-hg*6S9vIpT{U||DvadZNWr$1o zy5fFbPUmELI~!2kbsp!=jW8Mw(K|T6{=pvSDe@kopX2!Wm<_Pe#(<#IvZ^=+T2Lxl z!&eKgTU`g%#nR}J<9_DsIc#iht$-a$_a1)a5jdMs>KB8@WH!ZMaF(8C22t!Ol9#BD z4FRljrO+5pDYsia?zrQQR1;>YiSC))JQ((1OeBjfB4Ron}+kXq=#fWE$V6oVDXyV*;#pHox#Rv16L_ojMzT6g`6Q!9!G~q7+8xl8=GL+ z2ZzaYjH9Dt3|4iUF>EN>+EMA_oO-2_DN1j*`D`xN*qsAz#|nHisWGkfytRe_4ddyI zUUOSJTbQk6pf?W)L`DSMbypwf&TPRQA0s9pa8cLDikyJoV9@7s-YozuG{1*ezwW={ zonP_);ctCIgY(6M_}Z7n?oZ-lKL4-r$96G2f`8t};qQH& z42o(1zz{L?0o%jx|K}gX5B$9|__JU4)%eSw`4xEi3oqa!{=_#iio?WKSdu0(KQOx& zKlu;865sV7F4Hu3cIH#?k}vvd*ja?$=X_j8={?5B4`EW(&^6#q1wg;IAiyw>4iP2L zG?*-wc>hoPVtn0K{&hS%+>f_jFW{RR3uLJ1djQH9WA}iULp0ZZ2S53JUygrs-+=Ox z#cTnC0XE9>$mS8qxA5Y;2cX1f{-y87_xzcU#PsSraMd`G|_0(HklEQ0EW}dw=~EC96SnY@m(@Fl~h2H-30xiQFRi{3!xo)1i%SZ zxk+AIIuR(cPL^#TU_jcMPMdKSjRyQn!B$dl7Z@O{y@U6vPo9r=k%5uOPsAK;+HaW&(UjN}v`QBw6v*Gu3VQo)|{w?5X51~UNS^CeyL zMt~>lBkIubJTVEq%9tK%QDz1fK7ncmRpl`%6LlVQ*gU6H89rckJmGei{ULvwm$L?= z?I8yc(|H4%_YusLGU4s50pKn6uN}Z`3}H=yxLClr4E^B-{Pd8=cvuXQtkZCCVWOwk zoG}@_E0&Wv;=G5_Z32FVEJifd0@Lf)&^x<}(Zx%s4-XNS6`YTYG66ttzC<93GdA%Qo>wrn6BNTV$ru zGIh$)=^Iq`)Dl6{nbjMUEOx+ju31Q+OeX6oOeKYMx*#;t`rdNqweW9Tmu%DW;MUB; zQ+@5$fd7s$UV7enP3ARF5UVpE%j%OJYZ@}M{@K{MzB<7ntXZ16QUI~NMxy=>%M#R= z40xiyTMU7IVHZXN><%}u)gQ3V-t7-?$JsNOh8n#xPYrE@LBA*d&cRC~Foj(>M@|$K zO2^|BOREC79+v*5(W$3cV7;~iTqZ}yv^iLTVk3G^G5CleQE43x_Ky%3HLT4D&N96a z767PVI5<4QBac1CdUktrbLI2IeX_H)#qT{HPsn1dnt<7S2EP}vTvj3h41s`8O?Fx! zAbjn{4az1d4;&6ylOIpUJZ~@EdFM(N$i&2(dwXmkUpTseixxr{WtN&H^;c~f-l3zy!agc$G`a})TqjJD$6hS7Gh$n)4h-4mH*{U_|t#>tMTW4 z@6Gt}%g@9Yf8mGYk)QiU^j`E*eEUc5;@5xdd-1~;UxYvVfp;?catz?iGhc+i@E5-h z*Wda>_~Boi0ns2U`@o>!{cwDI1Wx1E$3{Z?plo?>%Dyp-eE7$FI9_n(A$-v{{X^XKr+)Ac zzHb|Y!lD?gG{UR(wQ$7{!+aC{vgE*Kv{AwpIhs&mQe46pz0Zf>ZRKa;^FHPMG5_^{ zgI~FEgwHs$i}GfJU;6{5+~LQ31wQ5TJ_$enoj;8ie#KYePrdJJ@V&qNTKo>)wI&*% zn-p)WH*zO_AXyqmWlq5zqs1lQ1A)XWMZRaeIY%|&mN<5!X8JNvbu{A)l3M7Mi6h@^ zZMJ6aEwTY6M{x?iEm-)x5ji5+2Ye?DVgkHZW67>0O(6{{MLQWOrrXsOkD{pF7@`5N zDv{#nM6xKxubIXN11vPbsAFe=vNQtLFxH-eJj#$=Hj28=-rl7KzRbzGM z_|WxgP24+-0D~mg2(4r!eWvvfGMa{{VHWZ}Wb&Ry>MYt@|LfFgY&}(^I5*;S6?_5$ zp$Uqz&dS?S&_d1P$uLM@Bckm8u32>i*hwR+Ey%IaRNnn>5P%d{mlUmjt}6?sv~$ewt7P>jxr|cz*$NWo8=Ul?E}bA=6$ZSY=hAv z6mc*>-XFl#;;~`tfRGii^%Rb)Q%kq?;0VQF1I5`h7}O0G$CG5J&+CKWWCk@$4+*%^ zj(qDq1w;*YY0nWkL;^%2c1HOY(CY&FTF0cBz_sh@vUJ%1K_+uswo@=VXL}xX8G(u{ zSp9#Roart%b_Po8j41i60&@ab;fbJ~mD$ayGO^P=oo@ZsDKwxb$&oT$Vv_M4e5C~u z6^QG6{>e`f-Or!SisA=ucN}r@-pKjF{}#ERNnoFXX#d-$RxJ=N-);nSi%+%j-FZ*o$_kMjH`QO%KPfg_ch_RIfrWz=! zzZ}6X*RHF9{;ng|6&!1rr*_J+Odi4>rX0ye=sg)he69GLjEx>sX;qTEejk?l!|+M_ zx*GqlF`IMNFjngy09I<4Py>eVbD*9%);dzpCg0DZDEJUxpq%TgslDqSU4UuXP<*s( zFIl&sxXv0I3EB|7C4-bpJh5#p0ITz!{u`*wbY1r8QdV@B@22HXodm#)JS+_447MHr zIDN#H{hsy(VhhF_q~jgfBqg(`0t6RUr5!0EcDeF_|9Xfd?PM^=o^W zO)Z)xN=jxiM05qy{A0bu)vH(N$J8%NszkQ8hIrBQpN$wnuO@2?Dp#hHD_AU7Ku-_8 zmg|0NYm4InYb+K_Ra^zA?MqYHd)5Y9Tibwf*xud6gAYA|-+$-tGj(t@+CtOROha4& zJInbDS;j^_L9Is~c^F5BhZv4F=q=`BMw%{{Wdn&8RCs~V5PqhkWxRa3*qAnWEm0juMq1Mvi|mZI#57RjJtRmU+Q zvi4rstv3ct+~55<-2ZR`nT~PqTi%St<@>Pz@BShF z(F@Pw&wS`-;cvZg2|V%!{Pxwy@Rr|sJAU*2FU1S~&fmvp|E0f$PY)Ju@&Ljc{|)~6 zeQ(DL&wmU4>fipCFtx|qfBx^|Pk+xVp&sr{v&8Sc>9shza#?FRnPzXnFZ|G7!9RND z_v5qv+;`)1qQUZQKZUROYd?+~&-#3P?&p39KJAnK1QyL6e&Tz+9gjWyDE`aOy%HaN z>0|Kczw8U~D?fhk9{^ZC4}=-^9(z50|BX2wKWNZS58$8u%kRhLv%Ujg^^M<)pEVwf zhkpfM_hn+dtoO$k{H4EvPun}dgTMD$y#A31s^5G$e)(0OhR^x%FUOxf{~GN7_|M=! zc_7piJo3A*!0!((;sqb~m3V%V9FF`)o!R7z?V;qCwV=W&d8xrsOGVVNN}4O1IxFA03ni8*?aBq?W6BVJP)OzTn6CjQu#p%?`)t3@0y z5xr#Y$gNf7G&;3ZWcC1|lU3%knzN=3P{z+|_>$_Ma%!oK_%5*k2~7pq5?LnTQWIp` zWPJl>)eP6i$FR=P=jU)TMW_V;+#YQ4^$;Cu%J8Oj6j2!4ya25a@(@n3=cLn{dEw)huu^k z5gU)Du36}z1)VevT|JQa*X1sCrA(4As_#Xcm)BCo8y?u98O4y( z6$UZ$yiohY0jlYQOyMGrC~^p+&DQ|IKt8`{VhvaHk>?h6Pyo4sF%_Jj!7nJ!VP_Dr z2G4kQT`P9zRQ_kP9=)o1qXO0}5wi%_%a9Lqm<9;T8i$WQj1f@0n5zNoq{dhZ>Uu-pVw>+*2AnM=vgiSOZ z1aSTNY3pbK8&1dBWWBlz>#_?w$$fIrPMf0bE~^FQ5>(tS&!{9%WuCm>-_oDVMzm}X z(}GXy$I-;Fe!(g`QO;|x>?**t0M^<;ZU1jtLvmTSWa2HnDtRBBhsuEEku0^NS6N}p z7?g+9HZ;)2AJ3#N5RFG;YTm!=x~9Jn4Y{2oprpTpDj(GCpjo}sA!-}M0NLjRqO@Tr zih%Zfa8BxhEO%lbV3}w}_N{X{YhveGX4e{E#)oh12wG3aRG-SMtpU6?N7~>UHBGlI z7^-Q;>i`v6`++B$w9tN!?vECHx;1FkG4)raY8!ZQf{|sTJpo9YxX!lJ_ON_sSZ8tR z98n%pj|0`RLDN)}d@W`(-s=a?x`(p4^LJdrop;=c`|f)uUi;eDQTpX;FSSy-w#+(X zEhs2~mUWFMf~rz{bWV&!cl^&*J)xo4EY= zHQXF8+5FnyI~0$mjS#n$GMb;4EBT!R%Cf-ui+5l)U!Z*F zJ2ArodEqFDTP`ae%ZryTVY!^LseJkJ<2X1v0uXULImX`60bnyF0}y;#ESCg@6a=0x z7nm+)Dd@=Pb;fNzT=`+mrpkm8gZ0A$#1NQ--tTX~V99k6b|aXo2naJj#08IYndO*{ zCupjM>yc+Ak9Y8a=fh+&6Q5z1qt|!Hd?TP$U158B8)wg)L2ocX_1NPWPmVDe3outgEc>?6XrI(NSQp6~r$ zD6d?`n{Vu)!XIvW=ChxTI{^It0}tQ`GFkJCKUn4#9(&|I>>td*$rUK?dNE%7_*?ON zz9I7cWTs0mdNH0eypFfNJ_RFC9z25toxcBXsv7A@k zY^8KVSu2QQHy&JMY(4dQkP%VWbUkAV<(+dq*0R53f{Ue}=nDBX_SSM<` zg@9AWIy3=121SvJ{Ls^3i|?yv51A<`3fS}iPL3Z$swQ#|D@N2nm_n8qTQV;J<&?^dTmJYcoaC9{14dmjPEo_ZOs2kvs%X=`z zF5dp=K8}`#gYl}anIO0f279xBxwlyOfF?933Wxc832!Wct-6t72${vQ3B36W_LR)D zQ?VPAG31ENCmH$@!JG4CW#?m4>U`~NdSxI?Xsz) z>kBy##kk+7vAT4pfaIOkvby1VC^0>j_A*AJTV-(JqrCReH(o&Ya^u zB=C^Zm2@%ypX;@QBzq7Uq=SW;XFGs~=ty94D(tNIj9Klt5je6euq+@^-t5>l$vD>& zh+NDUluXQKGofI6UcWrf^e$L5jGP8M%1rKQTBtNWfrY-2hP-=?uQzk|gSY^IHQf z#s_$h4|oY4eej*wD1iKo!}<5U6UD_L=CdPYJ|IlyFiVf+ti~cn6kD5c8zb~b11wgQ z`q@;Zl!3>h1^f|GGF5DuhSn)lK%?3_fQpWG!wIu}nfwW8KpBT#Z`3>1hp`gy*tl3J;06NqJuu-J|G{86=~pNoJE zQ3jFf2juGnlxfOoN_h)U06MuXs19I1_-_Eu{wzFI)4{0s|Vo=c|Wn>-ibtI*_I*$=yKEmc`y# zUjx&*mUR8wzxbbq40O%2T6S1KYX+}V2<>z4wP}?0hcrY9-YgaiGLFVahX_rByYIRa zcinXtUhv%K;+fBQ1|E3ee*DTW{R*z!*hdqi$ox!Vvg>ui>mjhN?3V>SY(q20*2W0W zyLbs3&SEj2(lgVRJsdV3SC1F8qUaBX*xJ}&`r!WlK2ro^0EYb%cU-zeM){+UK8EAT zl+rlZ42|b^(`0>fAc`Zz3gd$#^ok7c|9&sQ=EjKYHW>79?|l#AO>eoEK}?%l8#Ff0 z@_c1lPIj615nJ1v1gy5Vwy?9cf$i1jA)xoon|pB1uD~lYnL-2so|Uouwd;GVIiLI7 z=i$bUo7|rlFP_Kv_+SOvkjd4=X7yRJ)yLBbw`0ZriV%Xi>?bIaG?@_WCB zKkD@G0}tR~oSZ^@1i$yYI63(W%ZJ~HH{cI9U3uGEaRvXIrfZMmt=G_<_~Z1ZH$I44 zPXc0`J_&fm|2^~&-tb2;>wn-)_|;eT@W_=zJhFG=^lyuSn%#Hh$t81j^;~gH0t+P- ziU@XYSyb`;NTYNoGAxLUPHy6AjjV$-8J*{pBxce(6g8eO9E{peh(C_CnV4dRhVx}6 zc|ODh063S7O9P8JSg6kxzydC$hl#?1g7FJ2iM(MMj~Jv|k6v!k&oazcl-D}KC-d%&!4Mhb^$l0RA;Zv>q(%D}cr%$+ zOXLd&7cI611KgZ0D2=kkHcT4G8k>psy$+}&*eS`%0*FRHz|8RGS_kkLq45GVLKtDK z--RYFc3K%UcU2CjL z@XcAL`&NN9HALrg?RYBiPsSGGg}q1^i=4}VE`#$%nMXi3zAk&hF;;|X~t{dTo3tR8wZbE zMxOUzGb56L5V5&)4i-Vo+cyV@c|aX&IFyWd&g>AD0IEgffqq`X*cyYZkn?yp1%?9* z&upWzz;Zeh7Aqw$Ci$`fQNdZ8l*zg45Qahr#IW)Qw;J^GSam@f?w==u9_zgAHo?={ z))@FyU7JDoefbUUPU^-6TV~2Zau@X2FT?wak~6LD$aTDvXs)c~aJApwq36sl)B2jzQGv zNq0}upQwF;Kl;?N3H51bUBW5u{3n3|1sG0F0k_>~(_Qs=f-M4zH8b>-LgRJ5(>L5^ zCdu?dIuB!eoKrHKE?XIZrh8qd29kwQMqzp$^fR!!9SNw4RyII^FQml1z=v;{jp-4w z29Tz6U7_Z6#uj3euAirNGTcU~jr7;d_oGW{Xn6^zOb zrCC-rG}WHXX40U`Gi?mEO$ej=O|2?`kb-g49zh$l!CGyi!MDvfO;~Qt-P1m5*;l9L zd$!*jLJMH2pP?|lI{Qi+#t;xunqv~`(unLU#z>R!jnR;Pq}6 zV7eav`T!gpj`@8{jt^|Akv;1(er~a#EDq6=@l)g_)5jmYdWihy5lryd+}y;~gDH+@ zOJK2t$ubN#cj)PQ<;ry&A5SR_+}=5dd+vEAwzoD3z%8d^jF0xIc9_pAL@%CRMX$#G z{vmt>cFtbJXtTz_(IIZ!xWRKM_&}Lm@7#IJ7juHKRkNfVvDcGC&yDRJ+{rv;7)K)CC5CRVN4)Dk$kKw}k^SHS37OiWZ1A_rsXWdpTd}V~43rvXnZq4-T#_+B3{uZ~ufCex2QdcDM`l)LSYyuTb2ey02>0VUk5@)lgibnei0yNs zp&Rw7G5l-NcPPWgQ9>y{j_TWGggHb2CMKZG29KSM9$fTHOpAf21{o%WWnsj)Uy1QH z>=qpz9RVR?I2s@m0veXf1~w~UoTMs-x<+oD`0jWyGdC_L5QlVApU&q5urg!R0S8uM zwPl?F#FPXlhT8&kMKw>h26bo%4k@chNfs=0Xh70Jg;fagR(sqy{_5=1GsBjDAeaHX}A`1y2-JhRx?+@vvQv=-%{4~U;T*Nb%dqK9L8Pg(3AA0i(VxZ|D+ zFfQ<1Dh7ST+yFE2KR6iA;pqn>-OT7R%qCMxX=*=LGkWg7*=&LBYzx)#6j*Gc=#5a7 zz~t&4Mmy(_Eh_;#V}J=3ez|}hZ6M!11K14Jbj;(V9)GZ6@~uoN*YPkx?2hBRBXKkde@(!{DR=ck98@RfM$zlT#)pWWJ@%oyDpo%1iYOEjScreM%9W@CM%08s~! zlqGakn>tzj%sRtn4Tv(VJwlrn8v(nv?_x+kk{za;+`F{NXig>}>Tffi>M5~kqNW5U zGj}KmY}b<)1$be@rA`u{kR(T$f?fP;6bQ2lo>T$^LQ<;35aw+T5f;i?D zxM+JX_N}hInbjYN(5F-Zt0g94dT>SrNV?@AB zmezXd&1b@1!kRZH#2}vyQ8B)k`+W#O!ExxDpr zlnuye5uNTMeGjmf%zlyOMH-Fs`}McDm)5hOiGM^@_Q<$dNyr{}@IfY32Bu;Qu(zx| zvW%W&vQBa?knPm(m6V?@swG+Jc|PEGP8K2&bp#iCn9OU`!E@i&wTE5SFlLUbX{51g z9l@?;@TiWC`CYXSXaHntJ(4_KD>jI0Hp%kbVYk1*WbpeQxk`14FtGMHPu7$5nO6Zf z_m0HWyatA&O<0#>HeZ>r&*(vVaIlB#S06*Qm@+tOP!4!5^vZrxl~~v!XPV!+^A`}J zrGfflK3Cr>rUV8bxV%uUe5)!91|wuek6>Kx3d}-<9?!QNi`kUNs@LxkKwR{COqyn@ zIS(e}oE-G=oaa0XANTgH4 z`+)#6LE2pHPB5L!Rw;yBhW8CwSF7YiYaP#_@%R``T@%Ra5Bdr4U3sC7SmPcYAJY5m z?AbH0j`cs6(d+lIlR3;6l1y!-!6vE^|1Jw)Jv}`=Jv}j5j)@-`Tr?<>6iWdNBp<1q z9jgr9T2zS=to{QTC4^BsP*A%E6M`DDi?>x2))HbPv}0wAM8G1&&pQhwki&_uj`r?b zKY`G|!OF7LgUDqtHV6}mEE@GU5P4P*GfBQ4Q@WuE(4<7JyGvjcF&!>fr8-HnXdOHP zd<n8NJmc;-8&f0`y1sRP1 zQ3_0H>R|Gm2z4XJy{?sA(f*DyKo6g~65yxYcnUt;)Mb3-pM5>aP zFiH7Vh+fX2} zCcRH-m85zlKr~Y$O>Rfe0?)qdPRtIjVP{a{cz=pByF2I)M!5dSO|BOxORA9#*-l%18_hAAo;Vx0&Q zpEADoaL?|Ht-RH0lGVp%f{IMy@LPj8+2*szp4t3@ouJ^__%E zt@A=FZBu|bBvK~dk0{HWa-^aZP^!!evO5%@)9oTqrP4ky6_@qkvR-Ji9aM?h>y-j> zse-`X{(98s>p&0dhDfG3S;ZmJk4IDV)NGz$8er4$Hki%l9E`63th%XrpHub=3~1Fr zFe}g2eKYADbo1tQ%EMv^3RWqD3!9tU7;SDQRtyK~1g{vVBF#wt)f!71O&*?qPi@L| z!hTrCAZj`%qWXfhfjTrAuj@+LSS@fFBi9W8>tf&3OtHHjZ!)Eh4DA@DR;TZ2Y%LB- z0X}$UXJTvO0n8Rl)C>s71flHcmiWBw?9NfTMFYE+}PWvjBdG@ar{u# zHT|_VHny;+DjXah3;Sz4!JyyAUC+3i0M>s}AT!GKb}#d1kj7LyzkKwljkqxKEeDb6}3 z4^mnfLpncdvZbnONv7E9{j1lm;hE2T28v!mK#ELyDs5_>|AUPoKQmuU=*xBK&O26V zh1@4AbNUb?e?!V5=Xbn|0$5K^Pft%zEc9)T7@V-DQlzwtLF9C%Wl&jyHUZX(pOsYu zbqfJU00o+aX3v{|As7PfJ|l2>nviFVQp$rcKExx7x(*E^{)n729j7Frs=G08MEXeUFv4Ow z6`gf2Czv%XOF)<uUC+f)dX;RICc!l5Hv{@0z&KCl_Yc`1yh>7JP(aeG0;lkH`*Bi z3~08<$!O=)u^8as*=2G=Z%-;pYYo=B$STcrEu9@L1;6VBqY^ePNR4fQA4&}Yvf~uQ zj0g$nv4BQo1MFUU1!7GC(p0tx0g3WtcJGo$nhEXq(GVMnp%>7aw02nm#&&E=qi$Dg z^bVDHMH&ZUkJ_$6qOWp?-5=&e=WW0_o0>NtwpYVZ<`;qKGf>>qY zP-d0@QEm*jdOgJX7^7Z}Vq=JAF-GP@Svfi0he3@ZFT`)IZs3=0()5GRpIowdnX%zy(xAU7Fi6(xl%N{2MX&>8pU* zq(<~55Dn?`TX$T-^5_V`8syG$A5pF`p0c}|6$STa)+bb~6DB;vVgIIUF z^8n0=l%;^EtVs5ZgHVF6r-aBMn1RSDIM&F_rb0wTf1HDcj{}m_3=_FZ~Ib2 z_(S9e;*@jo7U`Mxq*;A{hh0zbGp>_9h?a!~J%{wz#FJlT;uEhGgbrvKJHT#SlSQ_P zbL)otLHAFGaj6eEmg|?G7at|B-zy-TI>aLbOvl*WA|@QW^vh0r>yzEQ&d ziL3w1J-MB<=_OuRg8|t#QkRH)Onf@cNv|qR09L=SfumDgk`l@W4=OwwqA+hU`TUtX_{ujidrrRVA#y1r02k8!3bkT z8)5n|hVmy$u$IdiYnFb$m%?c(?w8E1_EVpK>0y-1UjXaUL@w(|N{#jVZ~Goj_+Kd~ z8xnX|P~NrzAw+)XcuWaug_wNG+H^ReW#31s#WW;_uTAP2o1+o8(Ew=bfCcLYgM7sv znlItQ5<$Q{dNS2bpu&Lr$bf!LMQ$a)?~F-kR16h>RK!2_A@I3Y{AG(x@Wn*GHA;@wJ=<5^%X~jY%Xq{H&Ug+YFUoGRY?duwcl=$Er=Clg^)XuA)jv9hpS2jYsGEL1U=35R$GeZ-BBr zTI`B(t90oER21(F@oGczxeCGpYCX2{f}otsP5O+N@8f*A3=oo8uXf#n$m=-2)V8f* zs}xy5Zq%(jBc0Puy-~FAMwEeTOUV}?kmo-j^2;W80h?smvfluLOfXtdTZClI;x)WL zz+{4C1SQqG4osAxl$DG*rXPA(2p|?}PgY=;<^V&EeqZbJVj5DtKgr z0s1@JC^ok#?QAA<9v=rM5*8mjM%OWcun{qNg}|xPn4Z&3lDg=iD!rdrf+wfj%jwK* z65n*PCfpuW2rU@XQa$5I*%HAI0o$Urw+OZ)4TI;Iik=ZHf{}Bp{kjAq=wQ^SXN#Bb zfo~xtWqRFrdVb#0gG&Ks zy*^s%Q{XZ>)WjAfRF+hm9;q(!tqFLDZHUe~gc*!7y%NA8QZBt#c^}p8f{S>nC$c(r zwkS6$$)budR@wED19D{|iK@>fHaisn1SqU+gB_f0L1Eoj3Pf78;R%^>%4U^E3-H|% zz-q6>u>Ql9ev1-p8MQVs2vJO_AHRB)?4e#+k}YPCtQ97}tUtqAou;U$iQ}V2EeR00Z#tE`@Cz^-Zg0NdV)pZ ziOY!Kb^#zrV6DMyHl;jFfH@$BOeLbMW1EI-F7Yizo7n7(fhWi%wV$S9TO;i7d9}c7 zG2=crNHqzfVAhWJcFx}fFKUGtk>^0Bjh!fs5uX@yfJ2>XFPT#PgI29zj5JV@$vGA`JIUL%*vYztb9E(L~h8M+i+M zg9}!eUcnlALYWAuiybIA?DfmUN`y#7hZ}%3E59wWwx-iLCbKz#y*QoXo%i35jb0Di zJG(TspDmZz+utLwdbnS4%v6>cHj5s%vl34j zH+gM7@A=Qi!w)}o3dk+E59=l{sc>g|XXR1G@4tHeD!sZI`sQZ*%=vS>*xVew z%K}(WPft%zPaz`u#0o%!gUaQQe4rdM7=ke#;)!Jh1(&}*A|trO0z*9x_#7G~93zYu z298ayIVjK+VOmPD-k1`o6_Hz$ymMNn4c`Zl8Nl*81B;(>t500m>S%HS@3N+Eex&l5n z?C=%+J`)CK%LSP{2+50z$vzP9imPn-V4rU{lM;> zf$GOKvQ{H?5kpAnB?d4M(|iPFI!Q5-m`E1j^L4}Kpj35<)sum#n1GA)fJKQ*EHD8? zy#jTuY*OIGWae)o<#DaavQ@cZKos)^ShVRX(&;k-TEcYLiUNEHD?|qesUuEsw>9l) z2O|c8$+lfd#5P<&KN8gIB-(W}p-r>WV@41u2nD;T5RH-JoUu?-seqi@X%Gj~f_GNa zkzirOtBc*s;1e@W(kgjv2OD73lSXLu1OlzFz6gTm){!p0>ICY*uC6L%MFyjVqzNb} zyE9}ED7aUyyd8!;Cd$l?#^SS3tiYftihKtfo4bHrq9{th6MaQ!mf~gQ`j{;mdd^+g z+QjyDA5ArZuPutahec?R6}-x&!%MHO$Rg9Ej$rL8AT->zk}y4?nHjemeVw=cfjxxBu6PvL<0-@&6~i z;Wg@Bz+oV02Osh$oLJ8mlu*D{*5iNOwEPeC*$x{gA_QgUM&%Ztvd=o;Vaq01d$$Ge zPi~hzeXZ6&q_}Qe|70AFtP>y+T_vM}C;k*BR5)e19)RnZ%!l-7joMEK4^MwCNDQ|@ z0j*o^DX|O)0!}IFfY4z|*>+oX*@&m89OeC%sd&ou()kKx**dWO8L>O+D1H|`%jb;Y+;8&}ElvO}*# z2c+vvJXNAD|McHR1-UwDjiL2q6B#5^B{SCY)9I98R#V4hLs1c2P>Ut0dbPyqcs(sNI39{?-r z5nJZ)sn+#PV#lKmTqp>LBu1HuTrcAwN|R)_0yY#IO8R{CsZL9l7m>%5`zQjG>rJbr zq;*>XWJ0J}-!&$RFIbGImknTZoY~pMY(B;D(LTpOJ~rwxjK#9Xyg9^dz7R_Xk&qHZ z%6mPI6CS&A1=|}Nc=3f7VPkt+WSG9jVmU{(tT7t&aL1h&@vJ-VLN5T-!I%xky@Nv< zxi3QCaT;xJ!WB8LT)Bd4H*eqq{kh~ks;ebHUn=lekwG`wVsr0Ue69qrIBcqXCVv@5Vtgh=fZs3teRz~wx3;c5>A~r?? zf}Zc90M^sf)6>(F+;BKRYV9H5`8Qe!kQJlI^fXb7M(xrWg7e6%+%RP_WN{>R2A+QXGB&eKo_?NHa!ouut;JujP}b0#b%CPZs48tt;<4ux%#~V zk4?thj?Ik$e^|9sm}kIfqr_~b`42UAxB7VS#su>w07VIy9E*94#)IEGu4{PXS^QOG zK|#QWC=`3|qkw#nBuCg}(4BlH3>>UAPBG$c$_tbkvF&| z1_4VTz)mJ6;(Ul_ldOl0$wV^&TtPufei67noV|mK9L_ zoSv^ymt))-fYo+P;pDr7)fV8;y31OViXcd8T~I)ffODJP7VSwkgMP+Y`Mk^Icq47U z$V5{YT23C$Ls=I6#F~`08DVn+-5V}<$Q{|2q`&v_1X3aJ(Xdb{l8LSy(=0Q*u54^b zRS&f%kh8tLgJ?56a^*4X^ewFSK($0^OZ0N_{~B$d!+3TLh>`N#%oQk1MgVeu+~DTX z1pPsd^XEp$%82>2LOr*L!LV>M#V%s<7_+?`^}!r5Qg%WB!q+QMX@>rwpvfy>P!4(+ zA0CL&s;?09h)7S1oHY95n@1?NcG258gX+drEt-)$mU%pKSom3mML1%zp(``wqak1| z>cu>H1g?p(){NGD&;gwuUkd}I#4(qozj)G9>;N>k8qcgxT{4%kXeX7V!UDEs5_V;C zde){w-#@91h;6DQ z;BF5d*$89W^A*u|H>ve6Gwqi1aT`_S>8AKN9l%P!n_kmEXjj3cq*5rj;`PYF_!hA> z2|Uxo&G)QnLk$AtJq3$3Oe7>w!3nb?suB8AJCUVb^h&80)V~o?*`$bTz@9!=Mj5bf zLf?Ad$J_nx!6*>b(aWw)Z4gXb6Gzjst2;oJ{y(+5ba7JKG#&^+la%=|Mw$LLfsbI* zvFsIzg=T?Z5EY=)=Gbt+<*4tdB6N9HtQtBTC$P_DmAo&05Qk;66td0w(XPBvAjQhGXV5eW7ij*n5-V*fB0ZE!uaJV$_p zN?8la8kbFj%U7?a1a}E#+C8%azo@Xaxk2Wj$xGZkIK=+mP1r>PzpSypvQuyd{jCk; zTO;&F1I(+6o?%DF$GGo-hp?PY$ec28m`oQ``Q&9uzp8mfZ!x9~4*NYCuFscq93CFQ zSi|dMJshZNY6R{+4~GU@TYa26vyHOf!{x`X;^=scpi0j%NzUi5(;BZ0D{u z0@lcF^_)SphyetvOqOAMTw!Op2{aSb)*(`o=*hCmv$GiWOCUtB>DYibn!L=hy}7}g z>cRd5F6(1Ft#CM5BHEIytA(#odC|VlmrLrn#Xlm$axoW%5{s2aWO3S&Lh2~3NkSS9 zgkiHTPidOab~4eLt2aS_A_9e0y(}ENAbP{GFvz)nL1J#P-nA4^ z3(1p7b@D;whR(Gnq4NEFU5g*>$OedJUTE5F3X`F+Wz^zS!JW2ni;dH3Z7C+O%dv(6B6W8KN9eGwBRie699oWl}`=gTkjtel^Lam*fLKHoZlxVTxPQt zaJFr?liQ{H-k8=TUVXzNgq|N|elopGNJXP<{RNCsur7gGTzHb!f>JKR#le&5lvA49 zz#G65l(j&V;pad|%^5y}y&hDT%cMi+_L%^qi2rv7% zi5@u&P)za^32_92hm+3hV2-P3PWHyyF{&{3S@lvKS4gmyjGSsgOlsVRh~zSo-UoCf=x z2I6^`Rvvk~PvMl+Y2WLtS8SJ{zGb?-U0|%U{EjzIn}E?yam}dQbl12GOzGQR#_;P* zFzwRmO0+&!w_*1skf@aewm_XSW>osxGR@>;IzQGCm(X61>0W5lbF{2JuJgM0oQd)~ zi{w)(Y@v{Li-wJ~sla+~fQ#BRk!#*61MsPwSdYmgYHgABz1Dfk7;95HPo^@Wm5D|! z5AA+7C;i|A^tK%aR>xy6Dt}Lx5nT>|@@0h0?eXL0fTIV|Q=JoM-zQqN}=7tWo_xP~S#g~23CLVt1CdQQ^dcOC@NAXH$ZZUs} z7ku=m;Il72iu+ao7XI&;p8v6*i$C`@e+Kv9K|K1izeoUUuzd!f^`(CipYaiwFu%5s z^4uQ)O3yxvzyB|P6mNX^5GSW+;uAmTPvgt~#0xQf;0pTZ?!>!7=WSbh#bT@)mrAy2xXSv)cfL&rDu^1Q6s9?#+ zP`{2|?%?1t9UsAlhCVn&)`yJ_^&JwAh28=)w<6CRO>)90p9wL*bA^S;Wt;#u zZq3-*8U>ElK%W>1=0#GqJztlU7z21^>p?*}#Fin(Wk~^NVAoku5Jr^_Wb`5Qe(X~MLjbBUMK)Zqu?k`Tt>#k$+t|Wb61YJB67C0ANYr=}nq+iKW^31V`*xB+P8RX@ z33SmsX$DM0JRu=O0%_Mhuv*Yc|LXr+5Nmz#*fJf=t(js`L5uD-*e80CpPC$q+xjlq zc#5R0BW)yj+y&TRZn^Ae^!;`+I&arRxxHR*Yt?0}dE$~z=iZ%uT%o|sZA{)f-Z)PN zSc|tr3&R@Fc6vIZG3fXcgGgVdu7kbqCXW zvvpWz;kNtQ7$^YM%B|A&={mJ?t=nC7Z38Lj_vwDIHZeScFzQscrXZJXJ+a8T)$g(5 z8~IdD5n%mLQ)VU1=GHeX0cx=mb!yDX{n-I-5w-c$1yc1-Y8ahzZtHPTO`-{ggXUSa z5T<{GHiNkSFqU=7U^qhA%ef31q~{r>WKCURHl3iU^OVl*u(?^XVNuOz@KsF~a;R#! zs43A22$lPFYcXJLdrhEYO(5rS+ki7Ii#7xWm^viUC)6KmOuv4v>#l7jn77DSXu)We zJ8CdU2rKY`DT^z)T5JMYQ&cbHS(3y%O^{ZGKD3+QTUM6*9}ram=d&W!3xJP-z>eE+ z81x1_ud3xjn;x*~7-wRK%P-OA)q100Ro(f!8q%4 z);%H>6eD;91_!Ygg(G9Tt`?X?n%5IN>J=qHE5v}sa!C{Z;b;Tn<1r4#M;HwI==FLu zTPI5@ci1RPzyXz&v_7%*SfVyH(+aIMxbxz9?ChSQ@q51VtlHWl*p^SG!jxiJYRG;H z0{&8oFkddX9aU8&PgpXeSd;avMXXZldzPbL_IRl0O$~2>hQ~5sx~QFA{(%P`TsbbdGva!3D4;HCELo7IyXAIJj)}xh4fRHNd+?3SkUD6ES`4ckv&8 zFSC(a|vuB7m|4mP`C`PVf22UxF|FlYbJ=$$`l#x-v@9 zwR8R>@VTFQ4<7rKe~o|e6K}w?KI}8_bzkoEphGe=>DC}rBpK;H8I;@c68gH^VO z6%U@8AXQ7JMr;5B0R_mmNw?!9IVp3BbzqsERwu)5xzP!D;<%2^AThPTsX5^8rK#B#-Y*}?c8!unpv68M__Z5VfjpPb@%@n4Tv~+j2u=OZNk0A5N_a$GoXsyV(3`pgVw;0Gv!k#jV zS|&vZR{q9-B!C5=NtJ8+A=S>_t9OZdSZKPTgVbFfHmW?)YYHJ>kHNyEeGEBPdi|(j zy$(PW)ZpuyJXiYwOW;nHPa>6`FS1?gN2V!8Z6Vx(S<*3X4WwBZ1$MP$ev@VLzO&*l zr`}yAh!K01r$QxTrw&yGW@h?13lkpGP@^;fn^{B_W>_|!o(lcap`Lq!IHSP`%W4J( z2Oyw7$S@k^h#4elC{7XV5*N;&$6|kuMePw>j>+r@rYvyg{8{9^0?}K9YKdZF8@#@7$9b8ZLO)&|f7%=eF2%npj4hEM>MVmq?B>f;G8=)v`JxIqts zY}NEXAvl%fMFJvcDDzUl#JU2!SJ4z~JUJk<*8Guij1d24N-5KMZ_TtFXa|l0@ZWM_ zU8k&W7@>N=omd&y8Fa?m8P(ga#}MKZfuU0!oJKcT z0cev3PoAk!?{f+cCg~><0Ej?$zv#GT=xuQNg@6;E;dXSkD|UdB^>o1mOa!0Oca>oo z62mHX4C@`=Yh_$%9tFKZTo21>{rZ#C*7C15I&|A)ek04#&3S4kHcV^QBQE$BxYmYf z#|fYBcG5c)#D#ta5$IrAx)=qnTE=5ndTgM#cm@9Xus~fkxPJXQfvlBhk8>G83au?N zCi>+B8|2)Q^tw>gfB;V7wHc&-%{Dhtz`!&O<@dAWW7M-TJ)L@GkDfy-z{0Spr01oA zYzcJj8mK2GYnMu*z*J{y!OhNZjr=_Y-!^(=6m)OZ5JBn;sZS6QxP2bu<0H%tkJP3B zktu$TAf9F2Mo(4xUGcM_4KYCsVtt@ZajF+G@wPG+S&;g1Q7yTTt+7m@t5=}obV|=7 z1Ebzp=$AE_Su~7aF0r$-L*QyUn;^>z3VU;!iRe>fFEnHzMFbk!A08bd!ZK`TQCCv`2k;ylPpu}A z6Kpy1`j^)0FDlhD0@}U!X?Kq(wqxR@jjl&cu~B!swJNJjJxrSXFP-Z z>FsZQ8}<+OVQlOBx4AjM+0}839=3@X7=w)>Lk-YBxYr+Gw7G$t9&9CSl1Cno_km=* z??e6W;eq8~5u1HH^2pop$ivVH=imFI@j0LL;kbLdhh~0&H~!KO<7eNzV9G%6-1G5y z-}=`uJhO?}!>`BB|L2$EaQpr6NgwwfC~Jc|?s0h4uRMg|ne#X^`&InsUwk|Ewm%$y z<_kXn^=p0@Kl7$de8LxhK3?*|9pqt&$KLpx`0=0qZESwvC*!j}>@YetIEGd+s`mc@RecUi%wAg)jb$KZ!eD@Lb$`^BnSPufQ7~D)8L*d{1OKWSU;a@BI4D z;x~T#<@mkF=fHBo!HLN?pQ0P<(^F=EJUSEzhyoPR$0xHw`^*cALRlmxaNwkRWWbPd z;l13jtuk#?&LnIpq1&n?PyI1iT{UnD3XuKNnv9bf!&JG%_EKQQ87as@>d0h3Y&f7N zLnN$sv1NIZ_{D9F2{>>BG6Fr8py_z92*@muJLO+Pq>7m(;9I72Lj$1f7t(1k4uV5e zycu3Nza#80WXP;X69pI$=8r*W0QiXAvzy3z+)+YJheZ<{=5=5Z69dT1a{WG|dz*T} z*G7Xr_h(&s-n>k17xE7I%4p7*0qS zJ=t=4t{bxdgy)|r5Ri`1T1Vc11&1Xl)DFI)oOomyn%uT5NCm+V zEZ@I+{Q$0Tum}QVyGS_VhFvW?5N2L93s`zo z9BP5Ueh2S^?@uSVDHl))g@_d6c(R=R?7+|GF4T;Y55)PrpZ2eQ}TEceF&|` zQ_G;e-LjA~--75R;T|2_qbu)Oe|ozlK^=X{-}bv>XPeEfxl3fO z{Eu~ra9o^>Tq;o+F|{?Y;Vn@xF3=&5ML}NAkUf#r3*N-vxTjlZH!lPso4xwh&Y-o6KEA$BYN3iDZs`l z6R~4`VA|g!2Sg=TuAdp2R``eX2$VT&3*rhBQ4F&e3o>}%N&ONQOo-SS3}M)GYp}3O zM5B#WktgT7vhqCOE zHMC+0o!Q+XaMd)8Bv2MPrt>++JcFHG_$D%?(uW2LA-Zu6zo5+Mfe8=ncA%SW*ObeWN4N}9V1_;mf+P1X=i06aLBQ1&AY-PIG1 z>BTO?=FV9(VTr}T96=hr+|J#dUEI05gHSIpo=tG|(JR>4DDd9z{k}MN_BCcm|*F(vQV^-FPd0{+Hek4DP`PeelO%eDy!$m##ez@A+OAFn!xE z;qCZneCg+W22YSTZ+;*??NgqM2jBKiyzMQ&kDcef7e4+Az8H^PekbnzUA!Y2FNFL_UlvID&G*B-+2pWUFY_HYE5g1v(MS%Kls zSv>lR-^Sm+_f>e_hkP#H<9*+^tx+exkDvcf_rovl!smbWpTGxwze#t$c1yHO5tdX0U%FGPwwgfIA8NJ(< zo*s=u1H&Q^Y5BR$d6P6TrQj(sUBDUvnbeyo8IudQIdUCb&nbw7A{!tgz}tY$?M>A4 zhBwh*Y7F`g8^Zw_FR3Mq*%FHiSOiP+_8>_j1i}O?WI_#Z=Kb7>iDeMBO)Y?xu;>EQ zQxsDYP=$uv5vI-Q=5YwTxdk{$;Uhrd1Z?Du&uio`m}(=wOUY!s2^v%FU;#-xX)3_B zCZ#+y1O%PRH+e3&%psSwJOLF~{|~9#rT`ma8&hv$E7=I1?}>y8fEwM3G(!C#_?^)0 z6|V>ZQN>fL^=k`qzKh*a>S$Wa<#GuI2}}SBSCd&5Sjw1EuLmH>ACruuU-ZZX;yI|J z6peO#;**B|&!FraK$LJt%uRx?GG8MeG&E9;-eY=mAGRpb z9}W?FB|_DpVewfD`_l&kykag|0S3s210ZwA2LniaVFUOiB_Y5YL`Ir~-3}&U>n$*< z61R1*!$jM`IKpj{?F>$K;+^S84)tr4DG|;3f)QK5B(VgsmMmynuf-TzP^3q!- zy_2Bd9&QaTLWLY;;Fi)Lfe@Z}o7LtyhZcc=l@hh$nhaDI)iP?H(#a&hBdZM; z==8+1czuR7HWIM@SO0&)tBH^Ga03mEQQ2B6lk3W(PcW6#uZx3z^^r96ezgeE@SbvT zbgapDl$;F;tAs#cqZ$n?sxZRQbbgjgvlL`cQ(Fg8Z8Fyv~v|XeFl>_O<|)HFo{_)Nf2jI1GN|CkoN{wJ8mX2#j&YY_3i-WU_iFF_f=v^1_kR_ zOJ>e-JhE7Qf9|kch+k#DR}z>akg@`idWEcPXt=zlnq#?GA~dzyN)SY<>zd8GC7VW` zGSJaz$a7|~5Z@-7YUdo0tfa+qNnpg7v`xOo?#{N@Cm>QrxVt&RayDfW^Ptxw+p5RtIYt{>c;;P~ z2o4prmx*}v+Eu*$fd_Hp_=s#Q1Wyp~VIOez%o*H$=?)D0eV#{!b2Og!nM)1WIsvLa z-O?Pv(8K)$j&;uNp2dJZW)2(l5X~?dH`v|Y#QEJV`0*a*!DDlK7n=i%+#SLk9N~C2 z<8fjbPvg0*dxwWO98WNBfa^DAI68Va0k8tQbXz!g={e}1&Cw5+u^$S&=vfy~)MLEY z2Ydi}=XS8UvyJE9>F`h)ad7n=_}PE)BY55H5~}CF2fp})&%wexisiMp;pIQ`L-^@m ze-uYsAC8awgpXy?m;}Hru$V4rIJew?9scz{c^h8%UhjiT&-aY;zVogfyk%@LeefN4 z<-hs?{Pf$7P(1sC@h89jTk$C`d^WDkf#-g}MZE4OeiUzf;0O^iP4};33WMibi_CvK0L%6cjB&RJsbDja}M{tspH<|E6ir#^r>I|GJO6AoWpPbqwm1WA2`Ib zVUblHIt8DL6vbIo(_>tj0vAIcxjA9)iREGe;BnFeL$$!h?w$C67hS+RE+4^1JU#s% zo(cnOEma#6Q(BB zHUVAEX}224V94Gf^9yUTvDWE;pA(u%lYD|eaDiI-D4;-Qq84ughFS1Cxn7jLL1b(k z>_>uiVqBjC#%jbn%?h(9^AdnF;C3=HUzuxUCgec$7#|#C=gf$7=9)&24cSTkqTmf^ zduzn!MV=FcxVbmR;dqIvDX{PXb+qiJkZzr4m{t{xwd^o0swoE+b*K?+hKBPcc9b^) zWUUwfKw=O9TB4Al1=;D=DT6G)Yr&>cGl?1&PbwJH(v?vfe;TaH=hQGW3UDG|n0A1J zQ9lQfd|E3K$Pgf39@}COdW@tylshg<=0RwSr_@PBlx3@7`FeVm0RSFuS*8M!O7uAC zGA&DAYhJ=?Hxq5q9NMs|TQUj=0I@r$Cb}Xg3_(Cn@n>`JVa=)RDp=pc{ZEvcV538$Ux_Q#lEkZgkz|Lq* zW|MCsGMn?9&vQ#(JJ;0cTVRxBn30VI7O>mB5<3HjVP;UxCkV?qC4aERe(fNW&xH8&g; z@JCb3rwd$q_Ol2GEygvb$8*eP3k1Vt8+s~uUXwZU++b17G3amd`WB!G?5Hm1OZ4ji zS)}Nm}3sVR9=^U8>!iq&4BPG2>e*ib=BUBXuG$v^xT?bhY!8i15 z$OomQ`I!v1AlOC#Gy(*V3I1#6UnBPgw3O>Wz1&3lc^krv#qB0*jDnmBV&c}54CoaO zkSDTEqIxtfSfLFM9SEw#D~4MS7~AWxg~Pfg-JSK)Z8gfIyd9f>+jNq(=5<+W!i<1Z zrYC}Hc(S%(@ziC?CU*fL(>^~HV2~gMAl`zCqNdC7iGZK!E?IqUIew(1D?TQw#)9r%QBk;#A zZqRzpS^-ekL8;bL)wW=aY^%=GK2ja%Z1TPAfHy$9T)XD87a|!nEohH;!pxk1QYx}E z^CC^B)!5v*jQ573aI9%7k*3KqONR@)n>f2YM9%xY0J(tU{i2L4LfItg6&t9-5U>m` zqNHt*70TL&m+x!Oq4ZFRt%+(-ZDC{|a27sqH$Q>E$tz7gyf~TENOtRH?cLvJt?5$j z-+JbSx~BC1czi&ka%VCoyV3vZ-~jVQgSa`u_Vy;XQIZ!k6!`#4UsL`E0Hci&nq`CO zbPngF3BC+9Vr&R(H73v`Jv3}kb3YoFX#-qpRC=_oUIX$B1h9sKfvl?R6M|CpV#4D! zS;-q0OCB>c0VY|OOea$^&2#H8D2G_gCu|&NdCBIc2hi*HaQ6IpGO(Ju0T@iPBm-|H z1>M@%p!I=WR;)7+8f^A@n3X+xs#zPcy|cwyI8+PPP=LpDGUj=t3EFidsm*hMi{0Q_wx?~cvx4$XN3-?A!zmgs%Q9#%7;X|UVh}-| zG4N(%w1M5tEn)%l$q`Bi+;iteZpS-jQ#8kOc-DrFjI)&w+WWotOYou>y^tpU58VF% z<+Ct`&BSv%+ZdHOY^-tP#!XzgdPB(rWMO$92rAZ9P3iG`F+%~1-UbJZdzj);;9(=gQ`+tZ-sHT`q8z8T6eKCjaSI9~WKbv9i z#y*agH4p?%HQvD20A?0wSk9t+pAW$of67PV?lT6nh3IPM%fzZ!j_feSc0L`4m=l%IVhtK|)=i`5T-}mB2UiT2D!)+{ci*n}K#(*IM-VWls0iLL%sBTgkZ#XXF0>Nsj#!V z!Bj%7Q}oEP0X6F5smF8)vajk|epJ1W@Q@_Eqwx{)a*)6snx1nYT^sQK##vo=?b4-n z(qtv+x(J{VBrz@q0#i=+lNHnU%4E!9IW3yzEZq(DFQC&K8GFHwT=z8(g zauRJETEHrz1bNe&Dkx=cPjR=_a=olduQa*P7)=gD6!259vW`?o)}ZwZQv{2j z;qe8U7!cd|?6$Kn08`7-qg2#OQKQy4dI-=aB8I3;tR&Nf`jNB=kuX?i5(q=giF6Ng zHJ$LP1C-s<%0ZQ@sLPXmBI^uelQFG9^l6)8NNI!ukZJ-cfnTqZ-5fC)m%_#*j|v!; zB`yq0U^$1c=CDnJjllrhuE7Qx>}(D2_>HT`vw%S!QNv>qYZRFy?cdiG%1qdvW#;5M zsv4#RWdO}OvpmDWafKU)$0!FSOaXW!(v2cNgGHQUSmy8t0n7OU*{IL`(?bSZSp;v$ z`Wp56lyw|e5w0*I38(_X;W0*KhTMU4c!LJZX+z(txGlbY#uczW0Mi+klPO&3Q1(V} zgAKTTgT+F+&?b1wbhDxd*DGN+azq1yQ+`pwLX7)qIy(^=fVCMxW!LKg078{yzKLlE z0VH{zDH|uIgi64+31i0np$C+$IK%<|lwq#nqeT`>5Rg^@TLlnW4{dcaR{-KR;6>!X zhf6WIrGH&G%{W}Z9Qhr#`rau4b#`sgtQ3}0F{sehgYoglIz_-B-rjFZn?h^eQYW}K zEpeeBkBc6e`)^QP3*A;9Cj0ZbF-X}T-TJ}S0mTlzz zVWKh++wV>XHQq*X8kE5k;~$HJ&{)$xS~jQ3`O-Dajcfs`%&vQOwjh`RGBIk_*IN*i z%Z_d1l}vT|HSrN~dugxKC$gL-LQ?UxKJ*n?xV^@65KdEV<2leap+Z^g;EwYETrdg5YN2@} zGROIxM&wq~x(TGoKGtMC4*<&E?)b;WJ?xc*yP+w`1TN$2Q&+SI(K15l8XkBaGpHEh3xabSbE zsj9>V&nVq1^1d*_Wq-&e>|+8g0e~j$WL7P!idG6)CaKi}UkF&z$bQd^k%YiriN$z| zh!n~rAuBwti{*lK&I*W`PA2ev#TeQ}(JQfB+{E$GG4dF3X=SdyImE%`L#i}-^FEdf zE49IMz4h-7#ng2~Up8~DcYb!ULG5V__uvB;N;1`Y*!y&*qOmYR;iLIkRYUQ{T2y4JvT zzj^Zp9)Em``}<(!`^Ix;iDJ;hv+lYZ&ws{UC|rXFAAS_SUA-B5`$q)wmS%zL*RHd! zKRh_#2F+#@jHeCmytIRzoe|R)bEY`j-JciC<@8(Scl39@h*3utr z+0-yufuh`mbLG1OfMr;?=houj#&ul3CKuP$*S-^vf9wb0J>K&<_~l>y_qcJ_2jZh% z{2mDRJ%$)^?3}wB@BLoS#JqWbeAx$|#eKi>+j!HXBfM|FWG9=`bcxw`jtejO5L|lJ zO}zI9y%2ZbS>X3$#3y|G$Ka(e+Q8rXz8^w(-sj-2|A}q6fP#|_Ko4nJ;!UspE&SF8 zzdt_fr5kwl5B@mrePF*+%oI$_xX|B4nJ;nI*#RC{0KMuie9D)66yD=(5C87v_u|Db zc_}s*kKuZ~gAe%pzl4u0UyJ|vGq1rT$AHaVgfIF3z6ziJY43#xUh&g-c;ild$R}LF z)d$~*|Mtpz@qM5F-uT)t`!xLYn;U%QpZXJM9)2Bu|94(Pw7e{b*x0>*eB>|~ZDFTh zV!m++FZhtpz{fmigdhHim!o`-kHY!F;^D_0f)7sxc=hy@S)j~T52ML)fI;dA0zL@n zV~i!h?BXsTJKobcQ0Oeq$10<%`Yu-vO%Dmz|BsXQ9 zL{;YHrp?Y!(%riP&gDrzzs5orutc7OmrIGT>Rql*;{_V5_7s#y34`>Vjb0;cl@wY8}@r5YTt85UK; zf@LsT0b>;n4UcC_1PI$o{l>)P-XoZ`ZZA7;igCz|##dru8R;t})OrP~lyL7>43QTMkpi_D^5P0XI<;Eh8%gGjY)q_osoQ}}#(6A!9T0VW zLXc&T$(oI|DQTnk+H6Bt1$J51WPwKCWJ%pAVQkbM^X7j53R1Y_L;iuwll= zO*Fu0STf)w7=veAx(nbsntcZE zx!qY}7?v(WHDAK*CZpcErbM*o3e1j<5Gx?gJgh5FY;95sV&-!+j1F&5FBVLtLS|`L znh%CRe*ixnQ<5O(N#H#_xR_$_EkQ419qL4RR=KtSSRx~Z4%EF@HWp$6Gut@%4ui$u z^aMHm&F<>;ZexxPmHDA%Z~36-b9YdG`ggZ1orv2{cKvr}o$(`pOJaiQ?};wA>wyJl zH62x@$fp7-2LCrsr~BA+Q7Lmv=9p={%uE;1iFndeH`P&DWN<(_55zMks1)zXE(+#W zw6$nknYm8gWHn_Kw(6ur0*p_TPIBEWj5*z0zFnVqi}wX6X+twkc$&3rD?V)jv~_=@ z1RZxIaouAQ@kg3sXBXm+XKD@S+lC|}65!H?wIC%V7s=irtO0{&{k)9?r4*{^u&G+s z60mmc5pT%~JAqfyuPSR9bVh5ApvjnN9G5moEiICqu*|^P)$v{~v)LjS57MTBp+}-h zb(0ytv)tayIxMS(&9J&!NFsAe#hlG%Jims6A&j*I(;|ey<*YOUB@NoLZma5sK+&>V zVt?-@=8F~Ur{K2vUXS}GbD1>Pf>;9(l=iK?2S$RaMC-@v); zO){QV_wuIp3~4zu4SZN)G8zzt zIl5o;Sr06F3khDy3~Il`Y_edYH*5NY*GJC;J~D+?>oK2Cf#BtyY69haPVNod_ho-2 zXLH;?MKM5;8w}=hSNr?>T<44D z&(oa!=2)OgiS@g@2>q?eaQD(?x!vPMDj_GBK)F`fefVa|clQeak(%`vM zQj=Cwq8pwU#8j&Qd1_!cSR)n$5YPia&}kOHrlt2l z*&iVyL*p%uj*bZU<#~z2$pW=;XlT(PNnO#1MaAXo*Kqw{B?k;lHuOGv8f9d<-zWX1jaCCGi4ZH;4=FVYrFhI^gEklF&qset# zxw#KGhw~RNz#ya7)k@uEGr3NVCsUf*6VJ)nSb29yA#5<29^vNk0x%_j1vowYOZd;f za0WY{{ZaU`Z~1oAt`GCr@8S22$L!!HCh-~gxWD+#_{4Gt_VNFL|MW}$0sHrSITHeA z^%9)sZ^G+d_bYhu=Y1mn!Z$ygjDhL+D)y%}e)BbN#!K(|SbWu&eJK_waDDG4Ci5kl zW<~cqgn-mCEgpP3e*ew);}f2{iB~`L5Uw?y+tV{X8Gq?3KNc^1#te&ZE~__)9PdHA&R7QgkIZ^9$Tb6ooH z_r-g^=iLbVd)U0|z3}OO^8L}n0&n}}8~D2~{}=cV_q+_B_wiqVXMMCo79PaU{M3KJ zD;}sZc+UIc^S}5{;iI0ti`gOYsbBc#@qzF2EBNO>@pJgE|9uyK;d4F&f9_>3MdJ!Q z_J&vB@BN22q7HZprl+UOS@d#;URaZ-Xkn(N(`f)uhrlj?ZxYaDjmXVdLx^O_tVuKq zrf3MQSqH+#K)s!ke@+xY3XYm~Ehco3ZUYb{O+?;v8gES|AJ>mkZ)Izd*(Iq^O}gpl zOwWsG0&kRUF>fJeh@nA9gG6u46XiCcl^a9?U;t#c#1u>3PbR`SLsRPIe1=}XpfuQq z90h651@{Tyc_Ugh5sNxvR!1yrkC;W?NbAZYThWt|VZQ3tlmqSl(Ti%a948+tBycE` z7~Cc(0w^8BAmE8r%C|6ySPVo3t7I`ORFr`f698$f4Dy=F^Eu?R{P8!=Bu18p0krsG zfs(r{9bb7}05&J`%i#G?K+*@#WyIva2I(AX0V*9uV-)yYXI}A~^CGoW9|O*->kkiE zmI67FzSs`-(|h`+><1$NY-~XurQ}Hf6BNngIs%r*4bdwP3qh8v z>ynO-8rl=MZNWka(@wUH=d=J;8d4BEA{A(vGFM;$VbclYmGdb}tuf$!%UpZ>tzBcv zxg2IGlzrI16rRQ}V0erw77LjV=w%stFxbi*vN`}wg+*17eRTJ^UATIN7-u+p=Q$P~ z`#1J68Vng7zVu7nea9L6{@V^Q91aMi_e;PbXrdm5gA$8+!cJ>Zj&SYD1XuQsQRF4g zt_tR1#-zZ$b*PWWDElQ$6Vcl&VKxRpVQETw_1db?a@gA0f^|zYSdiUhT|{mis#%R_ zOKhIq!qQLRgD@#=$fS$d7}!A2h}Upt7BGz$`K8S$r>y4{CbMhEH~J`to5%(QT)t$Y z4w?q0j%emfgn5NxqmOKR6K0X48BfXRicOomW{Z;2VFHAq6wtZxu*%32_5jyO&!xtw z%S9^<(G;$@F1b_bt+_=SpbC#n>s_@j@zFV)yxuCfY|Bav-X||O1s7D(c#C8#bJ9HC zST$B|!M9Ttd21lLnj4E1q5;}#Ua3l_B>n{$XP>kOR+nM(hcSF_rO4_2##J+?&U?FM zo9-^?0xDuWcANc0u=u2zxM{%_sRKOP$#z7CO)K>RI`aasSu5E)Az9@4cslTAB2F{h zlG#I>gqEa^+5oXFDNB>m+HEATrSi%Sv}Xd)0w0}ufS~VT9XM^|^(c)#ez&ee%eH9) zI!prdlG0q$Y!y$IIcaTwnmtk{jlK{iP z;Q^Nug2#9)jHPB7$ewAMC4s1-$l#*Kc44vAcW|c0xSqlI8t{?#{qa=1i28ZXW;LaA zlrq*>uHK)`=~0zs8J6?pO%)@*Z#tV|Guy)1vuD}J8XxWRp1P8TRr8w7IQ5saCZbx* zP%jMn6f){lTugByCUPhIyxG&9zB0%R}=t^%2lBNDA`2>aO#K)yIXL1&U(J`K#ic> zPD~baI9IVLXyF8iLlnh?bLb6v^!ZxM=P&^n4Tl6VH#Rm=7B!8_$Fn(o+CoT%@6HIg zn)fg$R>yh^ChwtcCUX7+Ath{#R;;EH$KzvU{Sq0Q_N(t4V%Y>-y>WoIzvG>39*#D* zu&gV1m&4=%(6AXYL_KAci$mG>k_swK-mt&q#zU>wNh5j@qdQu@*Cg>q zFs8E#=IX!2*T2bNsmnoyH~!*}$jN(&yvxSNvIT*;(kU9;mxwaGE0s)y|bg&`IR{$fbkAW5W4cM9B zdjwDtIM(nTaAmzuvC>q`S%^YM7&l042&GYjURr3G4e=z?sGVA>x?Af!jK?zops8~& zA7C+=kR7toFR)zBQNYS$UKs*C)#tJw5ZepLu{+P^m+AkFbZt8oc5)B5}+hIv^l)Qe3%p7VTQP;rH(J?l5 zdbsPZl_6-r{?&ct2G|(((HrEL`6XFT83N|b41qw8cqr^x$H8c*J#0bXk%sn>0Jas$XE#4dL>O6 z05J-1TNX@fY^nv&1cIT#8!5g-QXl~Ix`ayy$81dSi6&#pXKn|QsM>E$dSh?nVbjX4 z0BE9-UQ?mQyZ*vLmv6bX{+ma7ci@O;o%k zn?@&e?vi~nn$_~-5h^H?5Bp}!YTyTn6dgu4|Ry4crYo~jDb&@Jio0KFR@#H3J zPA)rkmIH%Zr(nkJiU&Tr@=pb?{_s_HW?-o?y4GmC<7WcG$mJgt6y)`8Vpq!60$8TQNNWN27By{?E8~;CRz;#| zTgw2M+S;!L{ZFzOfz(KYr~}~i_on>~wno6BJWrl(Yr!&khBEhTu7p@)G8yyxg&CZS zT+w?bRRgjd1;klb1-YMYY;NE=&wVZj^~Xnt$Q=DrDY+v9-!$C5B_L8dYnc`|91eLu z8;wSoFX#O1VzD6G#s~4;3Qb_`ol(ZuU_Koq4?}F0LpD;UjWlg&5>iEuWwRoq^iMsv zoHnUpQnQ2G$ous1c#K6=6LeiJYl21nK@Y>SAox`;S5^T%4D(eAU`6A0$FZm<=u%fT z4v!AFud)@GbnYBInBIQxy|}r*#|GSLz7>chWtVzJc>*J4Zjon508}IU-buYC54pp( z^_&9!Mr&i;P6WPZ+313`(xf-3ZqDSsZDIJxtc5o~1Cc~3vp!m*Hv?f?*+|B?O=+1$ zMqrR;`Tbr=Fme?j2a}PJH5>@wIhjr2eM1xZ-R%)Bp4r0ra~CkLR@--#{$R(8B@CJ8 zhBgdWR}#MSXR$fxql&=Mc!HzjDK1~TiEG#QIR-hHH-L+$I}V!o30WDkFh8$dWQ$tyLmw1aX1(fZ&{t|MUu)whbUI}yd1ZxT9SD- zn^l;H1H9pPe-~NS!}aUeF#pD~z#z&ZqadILO z42+MDarqInQ$6o`Q;~)^JwC(~-KoOS;oI@r*P%1j7%y>Rdf{_+@Z$a>_>aGFFCLmj zbSKm+Gsfh3odVMmn zRvnRz!4R{_0hWsy&h2hvFA%#sR%qT?f$?lc zqs3sX>=Pb0%VQ*T`c%yD|3Id)1RlpmOxRo5pfG@vqFdwq-1hJ`IWva*Eto@S@H4cI?8gvt5{WllC0m_h`~ z6MZwrxwFs0Y_q{kOfLu2 zSy_-RW%C>{1H&LfkOmh5hkn{9Xn_pV0zN^zmWkC6gW-CDe{m8NSofn&ptPo7g|&G# z&8saQRmv=k+7OI_SBYhD^1O2fx0>3pi8ZK&r`Q@05sgd#Z`Va97>{7N7Jyu)%0SZw zLp`;uqYs2P`Wd?@90leEh>Ucj_Zh(WRWR`yIb2BmLue4M#j6d8I}uz zKy1h%HcW?n-m{;Db30o&JRW0E8WgDTIFC^gD>^|GzsuJw-%z@|yqw8f09G5P${(R5g^} zMN&tr#!G?|WlUON1^#sgfHN{^P%o0`M7wPP7X#&GA{PQm#Uq(j_LuV$j~C@Pe4S zpSthbnC{MT1-}=*L78PV@wdEY0|xyZg{e?YXXxb_MrDDG9EkHHm?B_vYk;_1z=ptB z>FM-{{!@dpm)51he7VHV))0+fdAwz)R|W9GvoOu`9-Qgp+U0%hUp>I6SK!QrJ~l6I zU^Fl^lATo*JJHeQlrWYtuzS}WO;JskIM_R4QqA@KYXD{lehveVg2uo#i?7i}52l$R z+ucO5?4vn2qR)maa-aa3B>5*+X%f?p-c#IPe8I>;O>}ny8$j7$tRj#*xRBG_bv1B^ zi&om2MA^O4eRkv1TiW9z^! zdI2*fc0V!uf`Q2l)9T9q$caGcuw;~-)c)U5_6$ClB&xq@;<3p8>e8ZuTT%V#IwnDD&x2g3(6uuy zh{tmSH3kJ1d z5kZm8v0RfMnifG%Cho1zW(xpzj;qBQEj1l>VK&Fk>d1GkH7w9QZ+r)63b#RTY`cB8 znd}Mq-8$3Dw)+pJJ%w&7S&i)s1opxS&=Ro=n4ESR2}spm%k6cd%{m3L+W8FrxF+>S z^+8f@6)^W{w@7^@*JgpD1@#1o)`Z?Rc%o%P-QGt{!7BmNpOo~M%^Ufi+wOl&!1FSL zTzx^WS#8?dR6n-tKMk4)A!aA<)+cChEEQ+1kRl~gLCK3;ry911h9NCJO+7LayeJ7U0q4{==*fFS`s**r&gZvZwx+3VuhJ3 z_c<^PF3&uy&7>wqqYVoLNN7+Ch^Hoxv5CpvW+Ve~88zCttg42O zY*^y%ix9IA2km%84eiEzc@Sw!^}NRGyVF# zOLdE@4sA>dl-zwy_tJ86+iCkA>zezzUe`=|nk+IR6q373ijaT)!Tpv=VYOcI^5tvZ zzJ15!K6It1O(30|uH4r)^X!@RfhnZYlpK_DrG-S)6(rJS0ul1O@40C8Zhgq6ckf^| zfT)j=Vd(64{_^6C&p!Hyll78eu{74#$9;qVcXu1^Hg~fLKf=}JC9AU&50p8Y_iYik z>FDMpzM^KoVy5z|)!Gx+aW7d@HW*=MIvm+<4qRMak)~uu^5bDbMdstEi7pCHE>5{R z8Hg#8wuwLa@;QI@!%z6x&ws_={Nz`>*&VpQ*%E`09K3sbeZ$>mN0Ht@x~@+K7RH!( z`t*!vPfl6%h4ZtgNIB(aKmC@k4sUJTcQpUq$zk_so?pLy{fe9?>*oM&dm=o4{*1r> z5B>rB?UsMz-~6{MwKDdxb-XjR+aqp)1DV2<=2Z4Z&GrWol;(-|9}foBWAS7S{@E3~ zAo&0B@>m3EgOaXCihHW$LIMuQiKFShnP*jMGJXr!{t+Y5z;gKt`MeDhRj%ssRG1fmbL7cu}Q*rP%t`ek>l@ z6ZMMe_502|ux5X-&7In|xNqL9IgdJ?WfTC~oTCMIoxY&1*Hw zcccH%wE;OGT|g9TYhMlhgOJdHWs>^_w@WPEUC9BwW69x<79xCs+!bcu{uLz0m+PaBilC{$`KZ)3x4ni zpKwfDhSP=3=IOHM9jpi2-iz3);;tY;; z23nd4@DP^d<4B$|=`b;+Bca}$mFlNrg9?|>3N3-GfuUZ^fHnz9GjfXv(i$m^IrXsZ?Vko1B3)g{fqiZA*3dzz`zc5X z4(=Az4Hqk*C@76J?jE7lYY_2c?R;Qo>_7#Z3lxCj74wEXJU&G!Wg=<>4Yj$=*HCLP zN(3C>#=$nNz?<;9E;*;!ztq^@>I-wJb`H?k6V1b(5OijXbwB|ijr09cl-N>e0i97bD1urWtKG+(tXDD=2?pA1 z(~iyEJx{JK`Qo!rSuR$*dv|Sy=b1V2?$8DD>A>lF#bPm-9Pr)kJfcfn zG4HOsyF0#+FL?6giqo?-hr^M|9?qKQRPNl_@A6{NnZf<>kXQ^mI+=r+YQHZRJ^f;3 za=62Bvi)jG1mNlA6+`SfKRYGHS>E~d=_LU*&~UrmkxS;{>fC(HrZLflfwPO1)q8Vy zN6I6eDyOR@aTv%24%1{N@4M{|2_{Xn<@EBBML!sbxmfg^pPq94?j67W^;hJ4XVxPU zI+KhZkCXeo7Gf-HH+LrO{PIt~;Fr5={^sSc`TWZt^2dMnXT)^iS3mtF_X(RsyuG<+ zeRjrXbKrh+;5cRwNNEnW(K55qpFVrapZ(D%q?;QqPoJ<}zTp1rJH9%6ONkL|Oja1j z2?-8fW*d*#YpE12)@x#neEP{J{OA93|2cl~i(l~PfAJSHa}4$SFbFii+7Rr8`QE>U z$e@7#IML+4516mHJOWt1ujR2kmT4@csh|#4NfA_qlwm&|IZTNJB>SO(BF@n9DF2Q) z$Nt7SVm2D+pbXN{6K8PB2iie0B6#}49NQbTpxLEm0#FQW@FzZiEf*_HQ2b`s+9qk9eF6$PKRU%81W|1N1{R1A9USUKtc^mLx8-&3LvYra z+K#rz5o9)F&xJX~ zLs?ZPbb;|aB%gx;e>EP;e!NvK4 z5G)eh0M_*|*l|55 z!tneOIyFPrzMIppmS<;3nix(N(033Qr0I?hVOT9GIaq(!abYu#7Sturc4IGrY5vYK zsfJF#)S02`$*?8?(_yszb^Sou?g*NhrqMvUXkcdtC>o(VSy~LP<8h+%S@2Lm zXkK_B250NF!JCRwOOP0;&Db<^foIORev{8r$NRu-!*rJ<&7Oze`&2Ml6; zU=m;dtso^WB!*UIK)28U#}E5nssE-44*^o~$7*^W`HxFc{2I)OFw7GPy+pew3{}Wg ziup1bTO>izKybf_;wSd}phyLjT4}(uG{BnDt}~JE1+W~vvVav&Gi}GM!hle%60}(- zgqDt2ve{EK_FKs`hIVN{d4!JW`w#4QBb&{}SWo9?XT)wGh7KY4qbC7RetubBii1TU zq?wgVrtgHI1F=p_L@AUsa@cJcr`ft?zdtyT11OYSLFml>kjeWzvwxD}+1Qj`K#PNP z%FvC(0KI!?20tR=o~dEEG^SSUI@?0ZFdmhhg&d3hzNP74V9;vlIa{7`b^e6yCp!af zzWVxGZtw58nU0+HaKE{OvNAu(-OU|`VFgpF{-lg)G`3I5*#NMcn_HJg27s1x8|+@p z7~r9cELSUIfL&dlbGlq{zCN-2f+;kNQPnL5PR}oiF|gSkSqz;qrpEn&JdIqOotSKK zI_~-QyO+lPwvZ?r3+#-AHLPYc{_&X5yf?op1K%XGSVT&p0fzmO)#(|yQUCFH09Eqg z01~)-dQM7{d6zwZ_SEiKzWL@mlM@~e2M4hpChktggdYzZE>G7m9@xBj%kagge0;Iw zql>k%)0qlEV1Jyrz1wqhdq10>8~aY76t^TO_S)&$DIY(7X32jSaluJHaH7C*BrS%S z;l?c8%u_Po@c@oS&DC&M!#p&EbY*EDp z@!3x5jS-7JvWU<{7zhUF^id7e>IAx)nnCrisxw#32SN-pd_6K)IRviQW&QrSpgymAsJJvO5Xw{M2aT7Ce{z?OdWtoM~n~wEt9db zdW{B7RM}u?q7ni+8*G+Y?lj3 zzu;`6(8Zd7=YCwpUaRLrX!a-$fYgLOXJL8rqetpH%c@0N*QFi&4;n=K(%6A9#>OJa zrFvS>z^z;XE<$Lb0V-6`2B66nTiT`Xhjt@c)Xq1c0$CLIc|d&dAkyYtYhT1zXN6~$ zPK;G%O8`m$3DG0w)d$G|rISQ9oSDbc*D1~7W zh(n-XuE?chOu@kN7!q9^c)K}ry}9G;WWlrZf%A3Y;(W>WZpUE^+~4gG?X51a-@Zlr z&OA2G&I9XJARl%%>$`IRS5vY8l#}H^T%Ch1DEIe_H+xGYy1jkN*nh$B#pi%)O2f!?q4*b$Zs&dyKlxZ;wO zP@s5dpkP)_9FvdhQo zwHt#=u?oa$@?3!Y0dKC^Tk;`Lf;u~<8RdibcWJCE#L=4nsEQ~&P;|fdUIW+y`heag zq5k^-0Pxi+Yejq~ZStalV@{iUz_J74`?5rN(08R&Z<>JO#>%*N7@0~kY>jL$ykGIU zIIH}7OJihNwaYB2r}-7O?`)Up*M4Zt{r+UW#-8E$Mq(Q<#m#(~)2O@;AJEbv^&~Ye$J;2J2Mnpw#8k z)MNjUnfY6_TLF1s1RrB;UapO)`2POHegq>;0;6HZT-24L(ChxvP6X5d3gCTg*CyyXx%Z11?c zUJyg%WZBvC?cFVV2SRcYV<9P^p%|EwN@B8Y3Y{$Iq~n+i$7zddCNRq^hjq_#Ij~v` z?2aS*tc)25(HLZ__0r76?Vcq>?l(Jb?(Z2*Vc~6ApYi5 z`|g@|H@9dW*>5)7yn9Edmyim*Dg%&2h$y?14U{{MM+1d&DF)=EG}Y&`d3Pz4I!PR*zL_c|M|01{`61&fTvHNb9=p?4eh&#qP)9)$FSX-VR-?XZ)IUh zc~&LpWbCH>ek5vU-3Qi--j35qVYbYS^uvl&?nqhN^(7FfK9$OXj+F{KO$7V&M3K^@ z@FCE53p?IZDaH;wIXh#yUfCEYjgzssKKtYoe)xkgdH3!uIZga)|JuL8ZnH5T@|1Tb z4V@X@8A1FS6K6BJ&sMa@CbO3SNLzdiiu~RJSdZngJQl4_@3D z*}RviGCbFt3_)ywI|L;P^g-zS^&W_l>7=tqPn2_IUh*Nmpy1%iOsQ5Ndjz#)MMETd zYDtGNs|;Ky*#}n9SvA@HfU3z~O-m6a15@_sRzL%Dv@Mk$4w>K@YL^m*LRWmyr$ULr z>eAJ8!T`}h0FB}Xl7T!aY05_1mab0!x{b%=S|v zNo2D-pk07ejAp!8t-0MF*o_m}6Ne1&up68L1SCWQOmcDhw=;mU`zwIj>t-xj89+tB zHWMnqgv8K%lALK!W5113j}V$6JH_ONfuJpQuFd#^gS5`(SK(O&Dqm4yZPH zAIY)T>y)B~$qMJU1nv)ni9-mY?;P)u-5c4b+k#4UlqhKujvBo=6kOD4m8DGDcx4 zN{1Jd-e$TO9l!&M0hOLOs0;zrC6)VeA^@k01^eB0W>`jH-33-dAn&$Jaiohq7w0FW z{WWpfae8^iI8Ej`u~?nX60gwH4+{gg_Pbj?ez9cTk6b-Dv$*gn!*PV$+dcW1d2+dA z9Cvo3dFD6D{ppg;c5l8C3?0Ya9U&|0erdqT^6CPHHOISaI$hZHJjKHG*Wd7bwJ;fO zx8L&glS{(cXY5hd$0N%p=Uo5hEs;QGVA9BOv*+rE&&X`R`aE&iZx}Q{RLI!?v@TTh zau6!Rr-R^rD)l-LKlbh+6uTY}kH{9vcF*>BWc}olDfCSHgMsH}8XpQ}6f((xJz^j% z7IVT=j86IS6xmMZnaJk9ZKY6%X1;3Rn~^2BTCFYme|>U-h#1f?*}dij(}wFe?>HPL zLWGh71hKZF+Rn}Jz3GDOenG0>wjL|}@JZq4jNcy^U{K}6pmnLqy_V`n=&JOSLP3I> z_vvC-pni@HvOptb=5?lANJ*h3DZ?o2(u9g~db(!F%4WN>gz1_xXh!ZqSgw}FHvaUJ zPg$=9zWMss7L;g;?4jjA^xJoD z_=o@C@AK)WpYWSs{gQWY-|&MkKPQ~5>~XP*{LSC|n4I%GhAY9Pxq(zeXNs^|_r$K7 zjqayJ=mP8YiPd4Z+qdu0-(LpSV|gr(MG;DN8Jf%lAqWL= zro#}OVIzfJJG2O6&Jf&}3K)+E>xYZ;C){lU?`{(>Z;ot}kQ|80Ia^%twkVtZfzl0T z3Ylb{wVH}rKtn22h7m=Bv#&Zgxy2IR6lK{jn@>bz6;+=FV)b{(^I$lqJe$S4|5C}t zyn%}3>SyK2cg~7XrE}o1lUOBhGl*r6fl?ABKpRNa)Wf;Gz(X+W;mxSi`DegP!UKc) z5Z?3DlDTfpgC=`Qp@U*tu-A$-j|6RI$aJBb&q+5Xu6-3^oS91=Hb4Wjyzb6wtH!S8 zkySym24o?imGdXD{_s^5gJecq?D@BHldnxQfI@g&F_!LO98*8M!R9v zY8;RHc7p@ZK}|Ml+YG^diuz~_$Zbi0qLZ3Y`a%-x#e!Z7!=PL}J!gBj=U9$hoIEuz zHv?BYWn(vc0U0Ouy90|3&K4c(PFbHWAVS_Hj&}#f5;z~0dykd;xzsN9rqyF_9X?Pv+cC&5rt00C8|IO4y-o7b(XzE zh}91&AkHZ4Eum+@akppM9+6?iv>OS;S*ol`Ic7vNNz)7gS01jh|LCSQOFs0f@%9dZ3zhzq*EC0M3dDT4u0PAx1xEeTfp8OKHhn znw{0y_8}5l`ctXQm*CsM9~=Frf(ezOiiGCzLt}u}QXURqn+y#t>YJ(_5>(7l@u zOyj`@=4eOBBg;Yf;pd<5^lad}Z@%NN{^l1P51GU6j*<@i!@u{(eERW~CBy%l|K`8N zcVB;HtlsmB=Y09a=j5EZzP&S`YPmc&52w?GaCNcZ>~vuhEXNf1>f0NB`I}dyG@_kP z`sM^9Y_?ki*}A|i;ZKFB%)XdKmAm^p`r}X~<%AIJ{iKkNM7<0-q%9lK?sUqsTh zWjqwNccX!XiZ#BFBShh_+mfey7NM|SpR(JHl$=dg zr(xph(qUzDr>Z@^ z{O%?HR%ttQK~hZ#S9EE|b9RH3C;xSGFDV@pXoA!6&}Fh(d4Vg`OZig=hfb zQ6UTiPtTvA1nzEctqsqvE?J+fxV^ufQB|}N1tBZ3| zI`Gq)II9JmWp#hQuiB*1$y*9148bs1%*5N!Y&Y+Dk9T5@it znkdogTyK_(%N7MMZq?l4 z!JxPiZ>ZM@Ex9s?_}~GQ`hVMgP7_6pbVeB1DE57(^^VFz@$V zov%^dvpkI)<%paK+c$eC*m-(LnX}V#jwvyYTQ1KRtWN?b>%l(12$6%a$mY1@6ngF_ z*zG0*)~+s3S*(I3_?5$mE_#;hQx1DrT%NOecSpZmk`EL6`;m8VHgw?>jgj?w#ofDi z2$B9+xO+FxqUQch2DEnIUMc;sByIO}XKNUiCRgmb0SVFirsRlvutF~L z3?_$(zK_m?NlxJi6lY^%U|Rrz>5$0z2xwzoI*TSo=$&c#!Sp)eea4J~JwTHRYLo4% zmga*b(zZ)z+oz_B@Wd!RF;wDyaVb{I3~= z)Yb-fJ+Hs;bw91|R36CZLVe;7-_vk;AUSM77mbBgoVnW0u?KRo=4Ul4z_cac5m0YW z1F4z^mO}HB^WtEaZx?7@ZUk-Xq74fJc|e70*Gkds6@AEpYwV#4s6;wMrPk56(~=w8 z>i+o#)ckOQz^9*lgve`dZtiC&E@cWWj0Lv< zAmV{5^5A!q_x^95mfHNq8i+?}Y(GRAIkkad?QqpIdz?ljh8a|;09J96_6oEUC}s9! zy}dthyS=3lQJwu5ce@?G{?%6oUR_;Y@$~ZC_M1!La&^h+5P19UhWo?7>Dfpc3n!;1 zL{VO>*lNHbZ(cd>V&;Q~7@PFku zzy6vpf4JoI?2I4%;g2j}WwSdNfcE6{j2FwEXQz>;rz`v2*_OyaXGw+I>CjF~;5bdZ zd;87|*vTIo>#R3)L zO|qpB7z-R!xjr5^ym`&A9LQa;RK=ABo-7CRkKEkcK*}68TO?qh(?>5pV!Ka-&1Nnn)Ls;-E(<%YQ9}UHUoA6(lnay z*0AXL!$0@|pMLf!?{4n6-yTdJxLB-t{^D~M-O50m(`DrAufF2;&3AnH$rJw3zx)I4 zrZx7@;!pnYBmT4hnSX`f{PH*a8~?_?&2N7G@3KC5YN0qLmsBM+ z=`%&mx7Lp5svkJ*60cvr;V*-lHN%r>Ax|c2@V4 z3VqjD)5X7E>g4coKe63pXBjH{V_~-+8CDaQ7gq*G9X5BQ!xmlaMCpPMiSuI=dt7ufrww-1^gI)p zL7h$uLd1&bY)pu!=iqk;ZknDw&cDq>7oYi#fUV<3lHzizL`3Pj8A>XLqb1<2mkY}2 zitTY?vl|V#A^Bh&_sw#zq^v$iDbe2tQ2POp;Hhp7)Fe?)z$++y^)NxSkO>svn6kA4 z4R({!kytK+C4_V#m<;pv-Ja{+k&@?rB!ZSij7wBtmy-2UbV((BZwVsDDUp#mK`_R7 zM#Nr&F3tc*Nr_U58KRb4AV^EmQ3IFk^Ld)=^D){naNjdEx_o896#?7_rjMR_NcBsa z&D*IyB%+>f7#RkaY~|D#8``|13I!BrV|4C`_JF-Wy%}_-nDW75@J)6m3Y{65XR;YY z#^}B+&hW6lfw}KwmNy!6OvFJbf$Zk|)+d=#Z&Y=HQjpFE3eM(JU_ScudD>)y25Qv? zHO8I@l5kHk<(TRqc|L|Y6;DK*y$*6N4eaxJ7KMn?z{i=L)`e!YA7f8(mWNm(Bp}X= zQ3uRo*KX*8dcvo=R1{)SGhQ9XBdZV@WcIom`VQ&r+%;xlSOxkZDA{IwLx^Y>6Bss zcGQ_gRZ8{y6SOjh+8`PsKpP;Lr)pqlO4udqA9EX5Z0Y%7^kulZ1_$DD((jmcA)iy?-_2*jCHR7nBz zK2*r$MwTe84_av{gblbZ?|*M-LfhE8$@-KJ7*{tbE*Wc6BL#)`*C#$qxbrwLp$gNQ z>^-|24wq|ZK#*oi{(hUF0wJ~-fT6{~bq6~L?qlRq&9+Y@;2=ByOp5sOFhrwh^=+bo zOkQf+k>X4q`5-CE>+V1o6ri#3ss|WNS|_f&)B+9pY+)7nxg`&!pKZ6a_na@f{h%@7~1V8Sf`dn6!uJNh@RfgY;-)ljs{YlV35n4nxK%iLw zSdqpB0^0Ah%d#kBYma$Hx)s1|K7X^>@bz~udHM1?y2XhxbJiNUzP{(p>v!DU-g7)0 zjA?SZ>}Nls)q<wOe6p3U;KwAADjxjetXMe{gU&GE4y!8Etd?-rA=U7tp+YaVR_texr)R9Itt4$ z(e;@kQ@zWEmiOXrbMOEBb+xv_58&|Bq19%@EQ#M7xP&)8*@9Om` z%q17I6)|bt>)Sit+-+dHvvk3e)tZaT3!e4^UwrH1T4`#Gt4bH8DGd*J@& zHQVc3&U%|jHLHXe1GwZagkS*LG)`>BJ;KDZrx(2b<}I7siFemq=r`ttmQ*PK;+892 zM8S^p)x{+jCj(EG%0;g{y*T5GPd_zllfV9(pYnhEH~$Tue*6(HUOeUP?Y*^?QY?(; z`O|0I-riHP5`zB@(|!Zr-ER2#FTdqyKmCUDCz-{wo+(9Af}87G4*O#rqp;uJ&_7x7 z{A|HZ9$~TKIAsg#xqkbGpQCK<@9ccuTwZc}{my{F>2M&5GrJLr0ljJr#r^((2O%3M zx^bzgdXm?hH*fg##WViVpZ$pK{f>Y9PyYsT{(S|o9?N5SELp3*U!XwjF}i7oAeF^~ zphHKV2P(D%$p%{Wy)bm48FvGLOef+|@EHxD>iH?Ej^1kpF;ES*O-rt#RBFGiClNyQ z-Q|2H9i+1X$Me)X@R2#vH2sC2bVpvO_8Z0r3Cb z1_fYpc8YByL{wcmXkI-&)80IJfH{)9P*Z}0TmpRwvER;L4FOuW6j z|%l=<467@A>T%r6YjW0d4h&10;}kdxq5t;>_-{6sN4djrtwh zqjinPFK)>1$4MLe%&%#w0VfY7)qksmP#-u~i|X7H z#U-E0`^8?cf#-ufCI_x0G;ojb0Q|~8ZHLP@X@z=TdmmAybI{NoFIqg{0^d(*K43IJ zrWO65pOss=RS?ht)zVlrDnQP@b_0(D53doBQW`(!;W?rOZ45i!@2&vO2(Q0)wVA$$ zd0*AMKR-ZWO8_AH-rWNcVI%#tj>V-l7!v$(_j zJ6O-@u8ZDG<>cg)^~nX(6nXh_$;nAi0`^B`zn_0!7ONGGE~AxIT!NduH$Ysfm)(1c zrv^aTn^911A+gq-8TfTYq zir25+a@-yH_~SGB{)F*Zc=vY0_1%G?AFb_|rzggeIbSarx=0Da#rl*K*KCeQzTy`g zxA&ZV{(>hLr%2B1Hyi8M=Py2D^@FAPN(JEV=7#O&jvw5832Kv!X0-m@tJl1}xg*A& zzV8j7_~Po67bh!*-5vYux9meUdF0D?_q=-jhGRaGQU8r_9$Rr6gWOY6Ad`u15phUn zH&W63HW`ACIkJ1RgxlpW7th)Ae9rRVjt-Vb9HGYd&GGukX0o9L!E3D{RY==>Rcr_=At1uvo81 zxv<%7xxT$;TY#>kF;*eB)NEGkHG*2|;q}c8H#awY^5Pj!ug>`NF3gfWP z><*)~Wvl?Xv-lUwg{7Gnvk-|er@kAb{`u9~*m+-k`~?yR{^?)+gm15}x%}cY@;Di5 zJ~*@R>C;R8{@?#I-oAUso440cBE^AY>^z6B4TRnCt6#rmeUtbk4F(Vv;4qHH#0w%0 z{wpt@oEnobk0a~#nXP+$eZyvRhZ-U=xJZ05uPD{Em0AkS z?`uYYE@1UL9wrOLI_&psHd`{*kH4n?)?;}rkHus7l}L1EMqsd{I_N@AsCx1^16Ykh ztp;F4flf0~BT@~E39}akZa(ei>A5IHYtoy0jYLHX^`;I_es|emoTK6uVkgAVhVGG$ zRAw)Mamo;Tn+turFq`CS`j#7^pR=dL)0CV|l4r`7Tq_?2^G5P?Ij8F_0$H(i^qAi!&=D1e}fG zGluRZlAQu?%#EDe4E78X+UHXdItiZA6KtOW7`nj#td>CLU}czT{kZ{J%}~1JW+-1v znLktgwo)n(E4L}QPmX~*_IV*xGiUSv0*KW+rpo-7&nN74cYm%1_gd&WW0m+IM;-j@ zJk=12K*Z}HZ77On^C=^bL^44jG-nZOH>D7~J$bS;IIG{3itUpSPy!`oLi53D;9(JB zz&+}uGUNa;c43u`C7t`DlljO}+YHQmp!%VZih9&`nP=~1W>j^78F;3E(f0)@$v!uw zJ9g?atFJiw=nMkn`^0{m3FD40zx;xapI;zp2cd8nCvdsgG#+ied@>PAq8txM z={elradsAwIHA%ZF#`#XI~Yz3z^u~C5S35>b%2|h1t&2$NEOf^0De9-hDZnw$mHe? zRV64Q!9Y3)E)&%mcyVtj(H62$9LQ|O-;K>v$Kj1VlKedyV=1^Pu`yer^MP|_E;TqH zDD|-h9zqZYmI|OvmgExNX7;UKhYD=e=QOY?wCB{NwS$`VE)P6zyc*6J6T}}?8yNP` z;5#@|u9iaZYrD`w>Zy1mX1L zl%pv9uyCnfaJj#5>=Rwzvs$h>j_~676*(V}uIGL;^6hum2EeFJ6e9KPY{${3b?To2 zmCdHjXH6}E4c4o(Szf-qW3$__+wLrxZ@1rD_|9gtnLX z?T&BXzNS2V!g$#7(_j9QZ{NP-cDrZXXHJJTA+ET)I~btx`t>`y;gn$zF3vA`@%$r} z9LXuOJMJix(naOuWPqY@JfhP`D2bIbVeSrlt9!nB!pUlB;K_2iA^;^N^JmJIkS#C@ z`{R-QadP=~G&c225#>*{MC>DnkQH1{P7RJu(8L< zYOv#?xmbT@o#?yXK&!437Si#9FJ5rDUh|7z{DN12XPNp3%_}5Hr<(`Q|Ol(-TfFFZlND zt=XY0dyEN{(w;BA_?S;Wdd}ug zZbyI&^>tpqyXE?BYiZ93DEj+r;{I43%VW{vhTLk=v7NJy%sk!9!24OQ=7Sw|FCQt@ zygi^PqZMRO_tPqXv4xlygegIt>qQ|30i8XYavBL#AOU(~3`IA?RH8sAElEpDn2j-+ zk@hYIR_g`#clW&MZ!Mu?I)dm7XhZ|xGRaNr3u?gCAt{rBx^Gh#fov=uYn!0<*mwAi z&pc>HU2X`BK7xt}SquzwV5MU!f&C$qy9IYC@_M`H{+J;t>tSg(b7O&<{gK=K(b!ju zp{JV)HQ%j&#m{o)K( zr`&zLLz6Hak0>3-G6xl$FHbD)`C{EO5a|es!{hqwt(Oo?!>YQRZO_TX{kdBmoAm@2zI`5AaEUYZ5X0)FRM3-Wf z;_ObB^fVGyGdM?ED1d|cUEedB^b(T=r#wqVrO?h>1ZjrQAihr(K2+?wZ|gVKBW-+# z{_TvH@;$yeMQ|yY??;qoLtQA&R8ZazTM*w~afz|`3-z&0csMvw*ReixkUTmk@X)-6ngKV}ckf}pI@sZWO?~2COj^My z3i<(@gH{)6`OqPM*usZ^Ob~!}EFP>tlcfnf*p}b`oJ5xy279EM^8=Ftoslke7}Usuxls06$h9qiqwATpgbH< zx^JSNpRI%sBojuEYGCf~KM4AmOYk~91h5n-t*)Zb?!XFR%1GgNUCd8&I!3!cNhuiv zXcz`#jK>%WRMTzc>D2{`WlsTa?zY4(@bc|7hr{GRRb@a1KpvjIWCIloNF)&J8{{dI zrX$DQf*9bi-E-V+Ic~RXHyhr*yEZS1 zH`{FtB#6TKdf=m{7d*RKv08Ny=6meam`2pvW>q$a(T?eE94*c7yg%d1Pd?+5i#3N& zU(6~I9XVZfEIxZ`pOM%jQF;38jGun}a`pms8L>~?TYa;_;W!y%C_B4~%G%ddhPT zJnP1Zv&D+5vlA{CV(hw4u2%fp$2(-Iep6ddRBzw!g$CA7)5t*}h$mI6GG$C=dU>Q}se_m-=VUU0fTL7L2%`@3u2y?f2`=a>9z|Jpy|^z@AX*FXLX4r3xv z{a~@Q#3Cb;VAsUUw{IJ}yE5;1f1*HjUO>zeWlV*fCrh_nE!GAuFD(?QC#P)pnSsc3 z6vks#?t?~UE|NMJ4neqRBs$MRSnOBaMy1c)rm<0k{| zuah%bGE{4-l4tYTzH?J^fdC~J_sfa|PXr9KM5v7;7wgW={6Y%9OLczwA8KA}1RZ z$0$&W?ORGjTt1h4Kq@7p#leX#K!~K07)L>J;&ibl#04o7ZjZ{_gR;$mL{AwNwn?3tnSglX2UQ!Y%&t~uvsGta_)z{KAii-I@5j%>5Std{O*@`J=H*t=(yyp$! z(jgFHH@~0UxV_4fs^5pi07X5)&jBm|m!WkSfMW0Gl1U|dDxer>NO7Nz5Za(yDoFJ~ z6L;H|x=c-r?bF#p%`?MiZmq4V&5WAR+9@Ak5D4yV<6sy#C53(IYFnOU^iW{?^wjye82ApMCUZi&3Hh^3CSZJg_MecXeY}B zOlwZNC5z>NvS&Ey=*||93WwVxQX=bR&!Nm-8L9z^V*4vOnw%m6LT23EkyGaC{K9DD zW)i<#aMI0Qd!+=revNdQI0 zcFAG;#;#35CJuqK7w522^I(|nH^}x#FEc1#a$)EfOvgR_dST}oTHLsOKto3IgwWuR z?B8=03?}-3o=jEGwsCKj=PDI=^3Bu~O+Qx6^joy9CysA4CQvOt+xX!Dx)tU7ppFp3 zdoP6$n&QkssqZf>gdpWo*-G}P4YYgs31^X(3f#Wuk7M1LX`~}@;2=PZ{$1jI?{eWb zq2j<3 zkkSWleqSv3!~GUbKx`nP7HH*t5L9_kbgpBCaJ6<|lbw2>wNySYf;<3VVr{=Oejnlx z52F+R_I5RCYG}`;nWlfZUueK&-I;_3jJDQ>mR8u#otpRuemxd_z>}&#Y^F*CRILOuXz6aYEJMw9(Z@Z;dnf7JRBKf;LW>h?!J4=)%uFn z`6)x!nb&KS8DIzs(v14Ky}34t)Ox+<>f#0GXG@-3UGmNATc)hDVRr0j-=$&p#0-HD zA`1f#F6c@&ucpOvO^}X~p(dh6X*LbVoOpS6!}IMW@odHO&pzdgmv7B;s2hamPe0<5 zPd>3@Y#>|C=Kb_;fJor^(+mFW@BIN+PZmsh$8^|{k0Tumx(YY~0`tB6lprcEZ*NJz zO1#*d@els^OaAzaFF9VG^X~N1X)`q?>{LBC9pV2RR{^qAYVSl|xRU43(OS9boGsdSSzBa}yco>)3QvH07 zCNYGm%=e>HHuZ@06}e89FB!Tur3_4|=k~Ukm)Uo(UfcdeAV!GY?Cs0k-^PIZ^s^Vd zdUeCg06{^%zBjkjqQAcY)?;}rkEQc8v8h0m;^`>`H6wSi#IPU{%@9JQ6v(N#6sb@q zN8yXigRJD{=&DXLp0}5Cf#3jv&}Hy^&;3>vV3ynW7$&4bH!N@ZEJnb;t{9^|5Q z0ow-xtHp}taLVqWY*OUyCiCicWOGzfhF&_O&L#rKqHM>6bc3ayB#&y}ngnxUr5D8$fy*ytto}4^q?^ zUk0Su=be29kaMX3OasfDnNiP!5Q8(POtRO&t5WPU(E+(>ny6;cT4y{Z%%9gXKabL+ zQtyRi(JNwoyE^nrYzh&AN2!(FBFd(h$_MDt7 zZRULFm$QGKW}9_>_x7!synp&9Uoe~$j(1yb@3ve#{gk5uC?;YyCWGpHZkK@US$m4u8Kvs^*{fKA;f80~V4rAe5FWH%pSV zn$|bRnO0n)M)7{}bw0@Wspo2AMpe+dZZ`yZNQ|-9Dr=V#9IU8vy&9pf4{;ASp{ z{)j%1yOj6XT8a%+n^%(xO6{M@kPK+`{tD5r`&MUlkgauKIl(IH5hZ2Y-yh*dk8{sHZIlZj@nH11$A#QRsUaYkz5evcUe4m zr8qOZUi8Uj+3!buJ3Lv5G3c!$*N~qM7G;K`@IJONdKpn+ z$HyO^)2}}>M$=ErTPh?>QESh$%X9YEZwM$sy+5@9&V>qA39Z+a>}m-WsD|~F8q#tk zmm@hfsbWDXQrvue$J=Sg>9Y$?mZyX;AZA-241F-x(9_E^#_f)t!Vf?Dh|fO#h+qEt zCI95l|B{!lzoQ!>mlscY`tb|yw)d8lSX^B(9*=WUru&=rSfaS?`!`>I%ddX*H9vm& z4KH_lVs;sHDo8HWd*>KBALET^IdFBg;9vfi|CE2{-~DS|zq_OTlr=BHmVVm28S8q{ zw`-u6TghxUJ8o}o8G0dQ0SOer(g$V2faWMOxY`X%Hly<9X3uW(j-UPdE8gAS&j40{ z&;@H_O4VjWS#+JrA9I55-rSc*x zg*?qaCOE(oVjz}Gw(aP={fha7%D`aR!I_o}9C@1roi}zk~Zfsn3^I1N$t2K=WS-F8_)seT;-Qn-5vs%Vu7ung>UF zl*$S)T2xuJ`x_P5}Cj|$u5XkP| z6R3li_apWzv!o?MwS8Cc#6UP_jX9vy>Md0Be^=?4*Oe_HbZt=FjG|F!@|4OlBy%-xogmgQraEdG>M<64Q2`(<|UWA2XB*Lgw=7oY&X4EEXAJwi|R^2FQiQ$qBEgH$1ueh~ao(wZDau zkR)iHuQ@TWJ(0%@$25Z!rLjh&6ql?B0ihyAEfLF;(u#X0RY2)Ok?%41`JPb}O$DUM z(a4Q4@_mE)4>O*C8bw_hR`UJK9Z}GLpFfQcqC716;ISI13#~4S>I3j0H2*fJfVFSO zWoFWZc>uVzU1Kddqqp&yXsLi7HixqJpg!V{rPa^7TSAqh`J{#iNO**PV}3QpRx@~S z*D(kWWRhN21D9L9tZtorFN+F&@WhVk!$yAiyF|R+wX`4%tZk^9k{9J6(oyj5`DTjK z_SibHrSBmhu5)XXuhEc~)?doQ90cWqrS&U-KJP_BZ*U`@CqN zT^+^O4bHBLG=Qv~uY}g^WPYlbauAl)6bsq?8S3ZQJa*wez)WH z{z#z#4VC#XL`s<%Nv~hMo&!?)!Pc1$N6Iu2DID+axLhwN=PO20LhSkS#WO^O*EcsH z!s&YLHVeiobsGZ=fO-1tDHj(fq`c$#^HVZ~pZ)A>HrtW&)rynliuKvVCs$9HO6IWL zp-(Sa9*X_${on^*67rGbe#6tV6JlJjUv&KV{+d_s-m#7y&p-Zx7cZXh^vNZ%5WfEQ zS8R9pcD`k1X<*4^W)Dq?v53jBUcJ2~YvyLFeEag+vjGNFBb11gM4pbbxwRzj?$_Mj z-;qONZLF&ZNhy#CLxjb1yS7uMI>m6_Jw&c(ehQVwIBp-=s z&ypkOPfj>HdyeWnnK-2*U6;)dDt2eQeA!jMIcML;%0_iB*xB+T#mGJ#;dako|MgG! zPvUd(Agr|Awc}pYr6RD|(5XoUA!tpUjeVpQv4R0~hNR%W=iJ z6Jw&AoJ}*u8DROn>C5?lt!d`C=OY-Ks0#r^Ng*?KnY}1m^FzcvCkrB=84f8!iG;9b zdzjcC6EXChKe=FWvPSxz?4d!clQVws!yocjKl=^8{>jgnim+TQ`1qq2eDQ-Ha2$_J zDH#BIb92qz{XMT=zvlAtl0W;CKQ&nV1EazU$etLRbE)^G z&G&M&>*e3y&X2e{zv4GveP;j`wDCprvsJ|9!hP2x-M6PuWf7+nA8zT7zIogEJV=MI2OUDPct#L0t-T(T&Z0V-kb}9Hzt+ zmfRkXTyGQihs>DgPFoDK|Iz(%;`TU#o8sp(CmoJsGM@k>P#o;&`+hccA18ZVXpAD9 zQ53}FSyh7Oz+aQ>xh%(`suc)baE4W#O|DEfp#m(T2K2nAUpG_tFiYQ3DF`klO_`u# z? zQ>&Y1O0KF2XSD&*+a3!By7~;XU9Z(wL`}X}Y+re9V`HMEgcum<#_mHzm;um}Zpn09 zQN~0!44m{Gk|s9WEnxva_~91}{T+vtSglT(`UnN4``zqWr4xtaNJ{g~3woem2svhS z2%KG>Fm3lN;=rhr0Y!@*PEGGlpO2iryrYtHnN>z}@5 zdw0(t{lmXcyyzJ>*9e7^Riu+WXu&v5DHB(xbi>*tf=ov!f!+O<%k^iJvgf$pbFLSJ z*qezdhaGWP5G8Uf6RVRo>270e%6i`5=aSmLrAk`flYEJ@T7>syMnWs40X-E6t>=M* zX2qqm`u*=2Lx@eIonl{2S|nx znh#EZ8sOKQcHQTs2p=kyS=H)Yy~qM083{A+<`BCB!@ksXEccoV(is38LZQkHCD4L3 z6iWF3YluJz1={xnMH+LoJj8yQarl39#gpC8LaF^oE253kR)W0G3TvSOt;X`u!^+M7 zp)$N$+ZuS){N%idRP3hp?9Br3U?L`l_kdR@^Lmoex_xawc7?ef!6omgHs(kWw3(p)&WebzT&?K3 zr!%8ef@i9PnQd`Ak~OgymYfVHEbfoo-XD1NYC}%SKm7Yo`NKc>Bld@p*NeA|`)_&o z=GK4>^AuVxDJfO=I%5y*HXF9PEn0NGcVcE$la)ed)XegvXGtO&TP3jQS60u9%S)Ce z87r9BRS?TS6$SG?>O$b7=g)cebl{_p&$zqW@YOHA;nmGOZ}uZ{f6u4qE6zXrgcv*S zt}aNoTTAuphlLr%$8_NN`8hv)c0mjRC#SsK-Sf?>H)tN|G@&JPef@^J?JdXcEjcA; z(I=CmW%rsT^xWRw^W&fYieG*E8VNni zwfUNzpP!Khwz~~4Utg1wxWDdvY;rDsZp;j~5C!#A>LAdW0tB>R>2-holV7ro%Aftw zm*$UIa$>t1&1`(T9T}%O6^@%pgiew;{tc}D!+z?B~v;mx}}@2=nS z_I67M9qaWuaj|5VAWP)!-G+bq*FWPh6;4mr{Q9f!>^LGlo6QX`zv($SJvA@UBL_;# zh|VgTC+8RZm;OutMV?+>@jv~aB>ws@{wa4icZ>m!(HT*qXb2P$vNYyYkb2)faCz~B z&%gMb9?N5Ke-WRx%E<q7MK92KqEJU)urB6zPdFgAdveeZWWVs?HJ#ZkDd7 z8_FZu0l7k&%3Nm^0}9gQ9!(irO#YzE35wEEYy3aD;9yHhGmY5+uP(UHlry@z>L&oE z^Y3DB{s!B{vd$pNI8B_M ztcbBArEJfQ*4qU%0LgXa#Zu{6i6JCK4x zm5g+Y9x1rzl>r@1MnfcqYNCsSOAr2cz>5k%p;UHN1F`C$J)pVyUR73B&P{%p@?`sq zajs_wk?hCJm`St}9)MWIK_%-iq%tsU(X7^%jzE-V5-lasMX|aCn9nr_gRJi!GD`>u z%(P|%LLjGN$FlDRVra4R2ChU}+mhOTtOT!zkC~#F4_fnz(@f`5&fwkm;j*^ zw?T0bw0;+W-Gn_qyRI9AAI%$t`8I6zI)ALbw*b*r^CR-`3ZOTx1`(=Sd#Y#B7yB@4_#-5s8<)K^u3bu zfyJUD>ydmsu-_ic2P9-A9S-CIt0&Ltx(mMgtAEUTeaiWZ3yR({l_RUg3CofRDG^g9 z0`w6*t9JnEQ^Pm#J z>p8Dm2d%-cQ-`Q&3@>T&AdVSRGK`sCCAtXD5za=u*fN1y%)SBs@Fi%;VcoeKBk9^LIZW8|>AH+I?i z*(twzb7OM7#S&h6>(7sZmJanO4@?783GK`c-bx#u`d6pcik3$A692qN{ zT%mfw?xu-fy?Kqk`i|m0unO$PM3M+m*c}t!eEXUoee#rxfAB{(_7i%{MO%T-qLC zdws*#Z?=5)#SeLYamg>sZ#Wy)eEHdPvcOON=4X8K-5Z{N`GTv{Q)e+oDr_H6+Mo9Y zZrf4RfD{>(X@ZpJ1oEH$E_2Dzu@)t9s5J#L~eicHT@8{yg1>VCxi|LAVzX7^W^Qb^7;KqAF#!_pHRyu_tHX@ui-Tr4 zp%gloH`#kOnCJ-FWPE_7pJ;(e3en_RI)esIS2p9%#O$>tSY2|-GowfhtZ;7%V?Now zqZFUdo413#m#qz<3-ch;2OU{65bXx-nBXoYlL_9XBlr6QK@-oPUeOIbpujv+76%OD5iwfqG|gZU0*He%fNHiMr(o@!W+QO_(aI?iMa>h)VMY$qNU>za z9@Rqiy2_|0M=H^0zGIDluky2OKX~@KVsZeRNoAJ)xuj4?CEN2FV0ceKiv?ADkq8R(kz#s9W6^IUa1(!UAc^_l|0~$4FI;&GgN+EU; zrFz56rt7g3f{!-SlsuVIY>5t0v_#Ds39e{0>dttSdzBYK%Gnc{I#kX0-s)=oCBbeK zL?IBILJuJ*u>_O^IB00whCVKY zl|azRZeSOkaB+4*CyB%L)^4)RJoaqKS6{zFbRei5T>CDK#|B@tPW z7ZA?RNZW~Te)To~@L&8Bc86P{Z04DBvK{MkfW!U4`eAXgB%F2-N0tjE_Dk|4Xh<+^ z+3j{FWsJkXn0FL{fmg%@NJlvy(QZ#9fOU5b8c;-=$vS`*sbG))UuO2(Lrd zV`%cjjMDlZqVGd|pYHF}k`_w?Rh%M21rkm{5&uQ^|@Ge^I@ z-x#QMaXC3qaNy?E8>V-kFbzuD>{&RoKV!S$cq|+aJBA^Ehyhuz@5b3|z3UiK$5+Q4 z&sLGASLYl{v3m`5LVR*||C#;94#XNVP|T;(m@d0G8>FXPI82#CQIv!@+g=>O4=5+0 zV}Xz`;;ygoyp3!yB+s;cV+;u^*f(n^2hCdPnxxCq@pBM_qc4}_6*iJ zxSo|^-Sfo{zTihc`UAQU>6a(`<3ImP?l(L84c{Lpc84w9>el3-A6=fZUIw0>bT)~c z4?7Ehv9{FI@-mWArdoBBDzR?G#}vsvyW1TMj5&;joRn|Bz9wbiXTSKCo4XBf-`zX- z*P#6zKtkZ=cwlp!NI>Z$B`5CQ-0;c86;r?G^~=|G{tzOceEJDreEJ#dlM5EBH{5LQ zjm37e-Lc&txHvmQQS(mIf|>bm?r-_O{-6I(>;(E7O4Ii zejhEyq!J3%Iwj1k`1yOr!0FSI6Q=RVW^-@tn8uN#D`igBE1o@h%DPitJblXR@7{8I zyJI&MVn5q}9Ckq93E>BEWxj&93nVhoyzB+q&K6j?E zSSZBtxMQ`vw6Vf|cRx?Qr~La0U_F+{@>rBMTOT`5LR0lwg-nq^L74I!cWg2v^8xT- zv_e4~xmQGIBlsL8_DBrmSEe}hu$p!(o%*X z(3L`tE^%<9`0VVW96-$&9y3Uk0GTj@2O@NiG34x&`wT>}B?O3Wikqw7iOhzi6SM5e za?U(7%~fskK%ga9mgF8+;d`V=LNnc++g{ldf`evY#~Eld zXgO0U>ZM@&4(`Jh#R0T{v#*!|vND67Lv;5lh2VgywZF0oYFec@OVF8P$CAj#kWzx( zs1!g*_n3Ybk(D%%wU=Uj56=D%4}r@L@@SMM=WYAr^#y9+A_<35irB_1p-VyWFbICZ371qY(ehz<# z(IN&50R?#9^lglEDHh9&2uWCBy?^ApmtUK# zt?Pw-DG-#)t1JIrg`D9yPV;?cO6-mYibj6&(_iw7Uwv&1o15DW&z_v~!!N$%^2swc zCl6tRIk<%B^GZ1-EXyN+RXV##s8{N~-izr5z% z{T-*P6@UEMXIxxdaD8*lU;p%{eE05}5^e#E`M$Zk=jPQr7II{JIJ#dDOhC3rv3oh) z?3iT5<<&FRZ@1?Av)}L8l%C`DmOuRbBYyCMEB3nshwTw22k%oczp$$(m)zdp`uXXA zszff&&It6xKEi{u0Z%Me%~Wrxz7w9FEP3(dl#iaB@#12|`RSS*Bfole%Xc?h{`%`z zY&3I3*zFam2HYW9oA+r#rTsQ^9xP;F50$;2jRmAAHFT$_*@qaYb)06qi;xQ`XZD8! z<1rifn9Bfqq$(du;}?Vbu-1E4i5;ue39IE236ZO3&$-(j`Rkwml8-+5jO}qUS>^qH z;$Qx=Kjpvs-}!IRcY)o0&(DALl}FrSlFq*C8OO=kb)&I}Ab7habd)@z<>7C4F|hUR z?X7udbvh8j8H>dwNFv6`QV?^2Pzpt0B2f@Z5DuD&fO@!5kk0O3cAFhfPuKJ!-0lxN zd3wno|L{xB&n`&`(vvwE{LS?}XJ-q}PfuAc7B&HA{W^yS8DRMD{^Ng_mv3H^QC@!c z9i!R72*rbb0J4FGb3F@qzYDn4jE0UvFi)#@Z*RHZZViy^v}5ul_~Y>~2QMjgF=o^+ ze(?*A+b!$mlK=95=|9hxA3x_`|G)hktd;{s631Mu&$Eq*f+rx(vfn9Z4wi~923Bo$ zdmAe)*Kl@rO3JsSlqfY+L8t>1#IbD9^sm51GR$B@M4dWX8V5rJ%)A3js2|Q`8L4g+#4ysXnU^LDC$l927bOFx(p`Pb6xxpViy; zn}BNIsVNY8v55T;3ITPMh}xI=@d%T^Q3AJ9Vw;rXq-Oklae2jZu`pTIyUm`gk-ir+ z6o^8xAN7Q)*uK&=1_m#>T5c<#?=uwR)(>Pk+_k93Q zOta$Yeg@vej`xc+0Bh(Fs327JnzGN;Qq-S|5UL4!Y4XK-16jezmXamZb*hI~%E`@g zAJ#~GAZb91|Bo9&d6Jg;b6>B?i=x*_>6*6=AxKS4GoUVZJ(7js=WLa(M(KUvp>8Z4 zcsLe_>g}lBCLzp;HWVsYC{^A81P%5a?}I5#GyOTI`TR>66>pw1$$~2CsgRw_tw_g_ zVc}B9noKz*qxYAb4Kxn+SqMdEk1B6p8jlQJ;AFYvu-))<-CKIgGQc5^JbQA*y6=&o z#`HTGg!RdSl@wyh9Cur!baYb87p94(2g6KaGiDP)ksfA)~$0U7m2f-LU8fc6awo`z`TgiNrOe$lF)%xO{R>FA2>@2c~UC zd1fMpS(?0Dc4+6|QwZqE1@ue4`Ndywd3nL=d|=a!NGWv7OJYfOW6O9%hb7&`3FEsP z4!bQf&5}L^3U$EfY!U~QgFcWFl?({^gI-fgyWWEJwVAk1(+s$J@I;}?2bmeAVNP%@ z!tB9>`uQGtX#TAf$j#5gclkgZ2BNe&*PH9_*BsII(@b3pP(iFFt&M=vb{^3RG&yq! zmjl-#B|S(I?B>Vl;8xa$!Ez0X@c!`f(96gJBLd)nzh8%yWz*U%bDFIuPCk@He?P!c zF|`L~=;Alsu^GAp6a(h80z?h;Xwpk(bs3o001+?ZAbc%8;A?eOT2TnUl|@z|XbZ%o z(VSY}wT(YGFO-L+$__=P0jQA%LP?u=km3Mu2oTzS#2ISp+tO61Z7Qvq6)|k!o)_W4 zrBELFew7c@yPnDKBc#ehcd5cdGe*Hn@TJNU3(k6L^{Bvi1+tpOn@efI<*5NQ*N(RL zDj43LzzZ!)ThWKl_w#udn&`^*e5Ndy^jK&5pyda4_(z9sem!+}z)?2$74` zz~?VM<=N#4>yxE1cD{af!%x0?!<*fXsT9taYn~2kPD0PS{b&{s+B`T>DJC)e`sGWK zp4ofd(DVGs6Sh-gzu$5{C4T(PH6ca|@6ot0<8))qqiF1qVMXGE>wEZ{pMAyKS8oXb z0>?C=_+)a*ww>j$;AFJ|5&Bin>FEi#yCa>zqL&%aTJ$6>NR-(+V=QPm{&Zp+)c0H$8PdS#KTc6zA z-*a<&%P}2!{`^17f8)RYU#1Jnzxi+eoBaAWzp3PSo3x6t<9>5*p))GNYPCkDLcdt@ z;>C0B@9%i?>NO(Rz5HUaBzB!K$e%xb#_i3PbSQM)irqG$F_Uwo>js8?;&eF>ho0-Z zTa!zMB4}tZ^gI!&gic9$B$tV&PcB%W3>FS$35_Y?xwx|wFBhIZd1`5j_xJa9Zh;u9 zX|Y<`G1!ks-rda7)!W-!sLcCN=)34+y}&WSI28&o=0Yhl-=h_H`SPtDqo4i!7ku^Y zJC0-G{BrgY8+UsSyA8)fXaPaBmXf)?zG2)S`TUcQ(VQ9j!k_-VPmylopZ?{q`N^+e zGTv?G^Qeo~pCw~ynkVOHy!_@n?)OKsUjrh+{Nqyjmi^wmfosq+1=^j3fN0_F{)Q41 z4ItD~eqRBs$MRSnONe3iZ8D%Bq9)lJX9<^kQ%Us;dEnjBd`wyq!M35*6kZD0^MVp7 zuAi4uZ2KL}939jV^XyVS;g|qXI%iO!N))At-^_*vlmL|Sel)!n#l;e+;`IDD%NvWc zw_;~Ni3(&lFiZktF0*_r+y1;gfzWke?aAQMv_1y=!X3h3rtP~a@NRqLW_RQ;K}isb zu!uclQr>P3Y!lY^K_X+GW?5#LC66LKL5NP8aE~bmJlYJj8=gZe?U-8~IyXJ{!JEr86POeul1+L_llQs2!hx#yjoalx zI#&DNpF1nc)7Xku86XwZYSJt!0}blnT}y_U?%evt04rRED#TbNJ%anc6J<{K>*~$F zKydk27o&L!1Z$JW{y&(x51J9MzBfjq^;cp_*}>vS%AFFigyF2dQz2kIoN*8C)`DC$1(!h7We#KYc ze#^i3r+;LIo%e^GnealS8&;&lk^T0bZZS)rr$)d4W_$R>6WL>;|!m zJ)vGB_2#f7MBR(Z-pf?EhXnl|v+E|?LTMn&-^O-yPpa_!G5K!%Dh>3afmjcVYHt4{ z4aj>43OgY4eMP)q8gr^VG@3*-DsJ2KWrPcFQoE@eS)dUZZ!&C^JUm+p#uuiR&o`P7WCWp<% z_d{*rKTpq9V;!Xe{cu8&$Y!(W<-0pnUvqoCVYfS)|I#oFTwFZ!?@?cK&^yQ0cke3)`Q+Ph)FYZQS#^$t2Cx$ofJf7WkxbqjZ#RI zk|>(#`bZZS+?q^uB1f$v`4av0(2$y1bwzL!J}T?oVgtpxMZyuUy2?RVd?A4m2% z*l+ae;G^6ZLFKKq38^K&$hgcvxcgSA6Nj9E5mW;Y&<$+uXp_`wffu-zR^ zRq(}UpYrbA((Xk{P6ik$m@M|A7at*^=bQM7H*ar{F0kF~%y9fL?KwGF@Z!lO%A7`h zj61T`L70b0I=3~=2!6D&m=Yqq`1p#`lP`&(GtdkHW#WEw%iY~Q0ONSzaM-imZpqnM z+SxpFt(_+)CniCS5;<)5=5;CrqJxk{W`Mj9n#|GeNtMHx`1a*1e)fxBuv)K7zWdF0 z?;v&zi@`uKEyXACoY`C;Aamb3sbLBeuiw7qtFL~;v$KiItH>Y!>F50Nn`_FiU!tbq z!Rl0UaTc5!_$;UTC-$At`nWhHL`ya~e$sA$PD=8wamBlv9j`Wf z1pR#lupY}}c`Ryx!ssAUFtk5LA!;y+sd*N-5xU=KIs2w~;)J8^Rbq#ll&%Xfbmo0! z3#fraIQRmyUr}<2S1*E<;tUvsES^9l3VkGMWfjcy;ou1%XrYMA035{)=>vgCC&Fl+ zA2J(Wdpe%!sJjjblq%~90NA#Y&(OwFY+q8-2`h7>rh_?nMM=a0yK&-vmpSOb_Bb+@ z*=MLsh1IaI6t~^6ustNQ#yMrqTIiY+yS=95CMr+G@wSX}hXlr!${m!1t;)3f}Kjm_L&LXIJY{ipEcUaJ$ zoN@c@4S6@Qx>%Zt?qPSwe!Jmh6n^}dzv9XB7o1+4G8Ky#H#5`YVNW_v<^{GHH=rHE zYM?ur`*K*HFg$(A_N$kitU8wKrBT%5dO_(TqyyR&G8040SeNGl(`e^MA(9K^qTtsa zs1uyR`?4(w{#a-3#QbRQ|P{AC?nfW^_hZzi&;^09Ayrf>kGf*4@p@GtWYe1n$ zlbDILw9@iH@0un}RtYp%>OoN&*yCWA51=1_)fsj62vTS!?szFY1l`E*KMz4@5{?Em z)xHLkv-@|PBHS_CBRzUfPVs9MG@DfKlI1 zaiAYtN|mVACbl*geF!jqfO$rfP`Iz7WbbplNL{BrO7j_PK351d_AKf$KmU9Kp=jT$ z4`fWXG!V2sZ*uYM+gG{}nwfi(q@oYyc?QZgpi&yJMX1+Zc^~B|0->J2O6|+m<`^6x zE>Ow?|MXDfMSa0aHLkDQ`XEwQ|1Hg>)(D41gg}u>zWnGZfB2&xu(`iy-0rx)yJ2%YKp#0- zpRhPNp==L?5SS23!K7>ey}5|V(5K9*6Ru89 z`1q4&{O}KdNbCoG{p;Uw_x3e16}oDqE})fJKS3tgcE{;Rw^(vH1r2a_Z^m4o7lM`NGeZMJ|S z%ze9F_MEJhYCSo^-Fq@-&X+Zu{@T?GES4}?Z+$xpA`ySN9cr@ zJz2mRQ8Mu!L!}S zIuak|0a|eLcd4>KcaT+-sBYF<RM||KaS}FT;%*v^dVNgAWP8g_EDpAGk-Oc&Obaze`k_NK z*|uiihh+7bG=U0>z9R%N>TM}XGed8QcPdcIY?O(r`?XMGi0#Itlx>1{}p`kK^%3 z>>>nV%n1Zz`9vRBx51_~hESf(*{ca}&e-;Z5^Wv<9F2s329{q93E_(_-1LhJ#5sHInMzux>_`V*v$EfJM z1UGQ6;3tqPYc3bWrAWs98z)bK1c~B+M*%l`??dNphM?+3`PHa9q1lr+YYI{94e-iS zCcCU{=msd+_OB(oZ&qfILI941*|2ozfjom>>Br23_#o*VpFd(VwkI`#YBFH976=+S3vk z(`52qDM~6wE-s!L%dQBd%`F{?%d1QJe!=baJBH;salinOxQfI+Ama{(Q)IOyQ|t!o zv_GM^X>*k>K@%>iHuX>p0;pTl%pPaWE6d+2^LJkDN ziRy1V$>U9F5r;&{`l1 zG>7ZU z5Gmo|i9pH4w^i^eQ5t)%8r!%1N&_ir3zU|)S%W|dnOZ87UR<*IyDdT&&&g@S&wlnD zzxwJczIpW>x7(e`mU1fKK6sa7HulAsl>*K-b;X@5jp{H4}0zo2lFcG zB0N9q`NL12@#Tvr{N(yAH+MJew>zX0yNB!giQUZ&-@bayZnr1IKrIzFB^T->?Xkdq zEb!(f=j&7Q5XrjWARPkel=$mkf6a^ChzKU*J3C!+JRIm^B>DZFmW6`!?xUzJBnf4f{+*tj^2x^^Q*xf!)hTgv z^KNDXX+bL>?33FHbHGr{^F*d!Ffqc-~5{GZqH)qc>e4;AO8pSE^0E=<2Z7Cea$wF zgAMp_wFqxt2Li}@`<(QaM&ZvleqVHw|1Yg4T)({ z*yVf9bKyr{{E$ESqaX0><0t&!N1xL#JN~^z;oGmj|){&l|j_Pcou)v1S3 zW$y1b22@?HPWi#dpIQLISNkKod|)ihlf~8Nkp}P{$D^^YPEXb>mjk=~&cNe-2(x9% z;RqC0JJzz zGo~6qBuq&OHZj|A`TWw_`0`~mN#$hzU(CTktARzISoei;xaG-7;P3z7WB&ZFe#zpI zf%SV^9?N5K6?GyL5uzKLdx}GJz@$hsrDcvDRS~kI?rNs&?i(b~1!d7GeXO$zg+MXD zAS2|QeCEp;3aKzTlcjgx4xxb9-fX=hkOc>?gy0e)@(d7YXq5l#M(bIWT&d>-Yu9M9 ztvE~TVzto-NYq)TW48bVO~vAiH6NY8SCQZD)zh^%lW;5zuAO~kiWyVxURn~*oFKZ?s z28tjMz}K^QSp%v1Zb5X3S;~dZ6GTcW)yUsKxl+^l{P^{;xBX7jRGC2z>LjRf!dmLh zVH&gq^A77Hgi;*@s`S+dR6bDGGBcurbe@99{5(dI0$P1!3INqo zyOR#$%sk7*&)iT4cEQ>d`$(2jEpV)TU5p5s&J#bQNstORM(@X^mzlm~ATfxr?B?rr zG!#csVNPa|%xbmpfPujI#VJbW{K-e`&5J1+NG&FD?bvSb>6R~8KD{7ZUZCq0+ua5Z zg=xyhXhM}`6qc)wa-6t4T@gDNrvoJmh8wN|Nnn>g9d$L$9 zEm5cdXHTB7xj)d;&BycnjQ#c-F4hC%?v`aY5QY`|cRK>bQVCT@(1a8*Z>!_>4vq(7 z&LAC|n;lmdmrMfFapdgk1dT!(50o-6tXHg`TrqAZ@*aW|PvtRrZB4wa=YIn|04cT=7CX*03nMdk56W#;PW=3TItpONPnN{!4Vh4N8rN}tL z6!&$}#-{mz)T{9QFjEC|+iX0w*gk7|YAXRKe|He8(umZr-vShI`AMmx*2?~TPzN4( zxA-;?k9K!(!FSPO`I+UK5_XfB>oIi!_6Kry^-%@X$^q5UMoT>qKei zT3uH@;7{hy3x$9*K+98Owd5wy=Cv`uz6e;$(CPk<1D=V6*348!6LDaqv`nyT*n+CF_9EyWtO*Yw1ExPx8%&dO3 z-qhv8zF!pHE6xaRCHiqM1uApQJwe?c&52*-;Q^tj%)p!1M@xFp#R3|D);6r#E~oz; zO9+4U>zDlG$3NwpmoK@#y=6CzCZn6m45&rse%S5~yt}@&WVK4bEP(p=St?4ICR=}@ zfhVgKA3wX|$=L~u(cZUPN`s!=$PZz9)Na_c= z#e#k`6pa!Bq3^lb?bsZTlo(ho3Lif`;g7!ji09AG`RjkW7b@K@K@21ZONzwfnXfGHGFaM|lVCzcen4~Q&?%cTwG&4l{?o}2qUAw)BNe|FNd zzu%fXzNS8_`-+v4sR@T!SII39TR^aHOqcsex2DY4^}3D%SpMr+wq&P zzF~X)hS#rO@#^Kb<_-1n=O6Le$thpFxTH%*Qi$x!o^M`W^UdowcAwnGXla?J%N3t} z_647P{sq7I#m{;3>J1?Z5fAtYkvs$zDH&7mN1uJhpZ(E~*zDhO_vRa(e00U1{NcwW z{m*m1|9|l2&0Dgwn0$iT6QRp2r``0V6uG}2Vayg3H5H*-t~otBFpARkD?WPh38g5T z-Ik)o0K4UKX)?!gOdNK5%6QAO^$Ay}Yw~_;$HGcuC!$TaU_jHi-9J9RxBy0k$PZsUL;r;ZKY#U-`@1{aW>g`e z+}z!niX{6s5nJpbr_8uJP!=mX8=pmbna6s|7|kPYFe{Hh(2?EUTlV)ieE#tjpGF9e z9$3H6<*_^#_pQ)?Mgs$8Fr-v(6m@wFDDE2(J-^BaV+eHOppO=M33O5ut_nf`Is%Gx z0YOYwM=zA5M{+m96qc4ec)y!C zOo`<(njg=UmAk{yJPL>%{SYZ7Gju)UapaIPSux-s8oNu0Q4Mr6Un~b{#Ob*)cHU=& zoH9}>00lxz&YC9s0h-$!puR>l&n4S74ip8K7}Ot8RGlppsS-Y|hOj<(PFc}XsGdHh zILPUJsLtFn)AN`@!5Dciw7z@4T^g*h%G^y)D>%+ zG|G1LI+>)dC3E&6*gk_`KuicVRkO6zvnHWwgMpSJH%kT4nvP=o5(90sC(4aTUDneDSA$#GB1MCwDzh zK7WR+mu6TxjR|FCeYNN^t7SI>V{t_vk0v3Q?ss-B9kvtSe*M;@3SlV>XA6={1`x|} zWZZ3yRo1P0@_u7!Hj9%L{pBTJ{nKxmj)|wwp1^oOi%^XHCP*9@52N{Q=qe%(j)zsp zBn9a@It^^6TNXs59|)zloAb-_E0Wl(p)s?H`T#N&yFS-v=Nyh(idNa0Uq{T~s&h%2 ze5!Pm>wt0$<>n1gyEYdznG<-j;*yLO=?IRjI(5@Q8noUtc0g|3is00cKCkBtpN z1qY}_&<~rD|E>Qk`F-h_3ewm}&hl#@7R{rO3SDchh2mh1*Hz@9*>?q@9+(yRcADg` z0ptF91ryOiivgDp`v6I39$ey&?$_tX$^Un=Vh1Q2Xe4e}9FWpFr?|oK!=MV9H@SmQ zwy!2bb)d}vBT*WQwDxZS_16p3H;XR;(9-t#ut@diq9r$Gw1G&af>)*42h`AyA`jGZ zWoCe4#m)4+-~98`2?YIsiMy8eomK(ADklvzz$gGAG{P38wdDc5MespX&i;Ntf*amz zKr$e6Tc~wPTF;>d{`n@uY)IG6>7w&Fl?%#48dz<{!`B}ISnd5F5ox>h{a5g^f@m2< z+UDv~5|q;RmtFc*LFtD;TV+Q(Soymwxn%zQ$3NxAfAu%U7)rS?X<@{HOJ|m8$tLG} z_4bWP%{?>4P3$8jzt4h<0hT9Ay48Y2VHt$8vlIU4kAB1_pM1tY{wKfS&AYA3V%zz% zA1A)M*`RUY`RN5&C&Icgbcs%?oJzUbZOx~N5C|wIrz>7Of5OKfKj-S%6OO>)n24J_ zPd;Aq(HCEEc7Dm})fFe_=e&IR(pWJZjt{~_6;i`L6}9$GQ=;#pNuxgc=p)WnD}M4f zKjH3vGlP6m$YZ7?CDH*MN=9U)xZhp%lMS&$ZSqmc8XGu~Gxxi~ufDluclgTg2|xM# z3&zxu3e*Y7lB*s2Y^g96Ww+gNcYjC8lQEhuPET#}>DjY$mdhRu^Z8xUf>08xvlA}P zFE|e)%f&!QnQ=dI*hAJ6Vpr(nDXYaav(kav?Vb#bTA%`0%yRmW6Hx==ZB;S>e1djO z(iQi|p6gU7bcE28vhq*={HF%`ZEjw&xxHoC51d|I@}K>qPgtx^2`Ib!TTWJI48twA z+llFRgHHZCTz2eb!^PPJ@#Bw(Gm^@9oV{hyjHZ#(^}xmIf<-EH!y2XMXTSWK&EXyY z@L%{N{_J1)`~1t7Kj7c`fB%HnFJF_HTKGlR)A!NtcVbv^asC9=bN1VTXID=cPR@Ck zuetj24+&Q<%**WZ>dFELP_^?#2^^0j5~Cg0&FwwY(K?&uYOu+439vd@62gkR-Hs{G zwk*ndj## zPOqNx=^y-nU;p~o{J;O-|ClH+G0Q_co1iZgFd(=(%amNWxxQx6b(Rv^Aq)s0oGq5D z7Yn-B5d>nVq_W}dyE~pe`G}7{T@kxS3E}T;c`T2`022{L0|=_RI8rENl%g|GQ{`mA z2C?&dsu;2_0?WQ<0Aqj*24;1LWJ+bwsE};{FhdX72kcoPR~Kn12I4?rp+X2fu_!UC zF(*O^?mZN&4p{xd>{nD-VsSRXolL%$nUWYidCDEB2&F_y31rPgOeW?jeK4bAYVR4y z6_n*LaJCY_=;j6@j8i6?q;f#DW87l{Zy}OY*-fyWU^f;ZaNJMmY2=tQ_lIIEmgULG z3_^)BH{8fQ8QoV|bYk+t2$sk*reZQMEmgiD49k9&^rgw~OWhwpmChub9mOS0IhPsm z>f(H363lDFwrkQv#XcK-Fcq1%l?{w?8Kb3qsGHaeX!U7$t zSl!UszLMW4+Ii@bL-XUx1?`0DZ4|)joAL;_F}?^TWpaR_4@8u{6js(JaIqM;OG=1J z7ag3Hj!0n{gE1b*X-_9TAwrK3d?0PfeG$s>z>Bj}1ICPfHFQXZxa>JhTh<>vW3x}( zyu0Da6kyCV(7W41cVb}LxJ_K1F3BaKec)&be+#-%EhXwW2Iv-?pDrL|Rwq57m)Um? zW&idL$(i-)jNRs*@wn&W;}>=={^nO-v0kkCj@gjSx}9T^L*V5gBhxp zP@pf!q9f>R02)_4LtH}F&46weVkmScYo@N)wz_4{n6gP383l@<%{bf#nX!VzF5iSU z63(bHPYz^3)Q+t!_PTovMIUso`@#Gt4o98YYB|w$GswBHL0pp{YHWHBdZ>XM zZECfp3@T+#Lh|)JK{J37X?3J|bY)OUC>5B;<>xNN4bULG!b1?f)i*SMCBcpNA25?7 zI?F(riHs8+9a24*PzVoYYyqXotCiA#EdNYoemz70PjamwT^kiZaStS#Y$H%m@R0-% z=6yaaLGbVD2F%$0i!&_%il^05s@)z?CHu_9!F*@~mkNy8QgZ9pO5=MV31V(n19jZj z5l`aOOgmOp@}v&d$OF%>0!Z^FL%jb~+(S&>H&rj$`%2z}S8J(YYEIefS;-|8M0CKm zA#2vBJoJ!jAQlhLIV}^^1mXHoud^fP_I{{9HR@ns@N`mtJ+z(F7)NCSbwIm<$PO~| zyJlcz<(u!mlh_aoDq|=ns;MP6Y9snz^dHy?Yk|L+!**3 zmkaZOdU<`z^s`^mEl;?5dSE;pP3FE>tlsDBs=Rb2m;Lfl`6a{mA{VUh(5! zzqEUcKS(`?@yLEkBtNIxG4WH8`99|D%{v3x?zUU*cN^|^Th^y%oSv>oI)XG4$J<@z zFMjr#bx8DmXZ97F?SWl6aJNrPs@#nW-d*3>eRBa0(|oU#0~Dd1A4RP%Qf}8PC|Th3 zW=DK=!^`c&w+G?X%?;nayoRs@lwW=QhF|>pH%#LOa<<>tk3K%~Szd5@o;d6eW^!){ z;6$E0drIhf^PJl652%AEcXxMu_0`uF60ka18|!HtN2YOP9FIs=wnt@~m7jk79ozCB z?E9Lr97#X^noU{K4=*T1A>%U()7p5+9wqA37dPX;#@b#;EhOi^)f^Y8+d~^Gb z?QxG`*L2+8Zulqv(icOwH(;=k*;9DC-}3ITqdQrdhu6KeEwkNj zO;R~c6M^^3G-h_Y1Jg8L7l-|5`$(l!7Pzy^A97La@Gj4)n4*03>Xsj$-k>GfvCKs1 z4;-}v@q6P@C|PHP52<-hsx|;iv-w_~tk(vh9*!e9y9C<}-uGi6cM-;poCfq4ulaZv z$lb!&mX83|?`wH1k0lE93sNrZ4xUg)u;(dFNU%Ym`!QsKMwk*B93%-d?RyYdb`Vg4 z&a+pxPS?!?wsB?+j7d3+1(lxTG*g`cDw|3|bblD7h>~MOv!KU93WdQ;wS}Hp?vq4O zAW61um6AXs>mjD2qs>RkqplI_~8T!uF9jB30lw|BB>e-J0t5jO%!#5e5mgkO;_q) zjPpA9Ok6cX_H8Kkd>Eu0#ePTo8LzR zq0GE`ra6bu(Rc0_Q4*cWF2ZbFPnA-NJqDMXR>S!0109LXKp#}b!3-w&0HUvQlro>o zD2?d_^L`%kJJbm<5@uFkF0(YxPBlgCwSaViS>2~}Lu4!?QN$LN85ll}YJDPt?Z1K@ zc1(h^ayKZl$;gy1VbduX`a(ONSZ9+ zX~{S#yL|%bsGxfY5h#pla8EM)<5>+J1#nSxEJDZF0*G zmkRn+nc;(^!3w5mao@x2=S86H*W2>9?xuj!yv4lV?XiMY?-{rIdpdzi1(zLg%n$tA z9Mo%(kuz96j&wOA{O*dXNt_H^%B2t*K;EDTzo#3=Vjhf&I>0|i@u!sW()v^3_4N(g zKmRMcZ|WBVBK32Do7)XZGnq02?zAg4m(1P$)+CEv-`9JC+IJ2{DzzLY_?zFnxr-Kw*1>)y$0~M=xk=anV5=$?#Ba%Z@xkmtHZH*^_h=Y)(PriM#fnre_vlc;|8ddpw_eWS$v z>~1%snWEQ;iB67ubNdy4@vFBiRtrKYXfg28K{K<>FcwpqoE;5(_4YNd?{2HDhwa0H zb8@!xX}2%1KR|)aU;mil=fAMmyFT#q@9y|_{>gWUbllzC&&R;--5~hn72|xLzB?Y_ z-8)jrM1(*8#m`76lNJhfGFzd{eyx4qH@2dOCmqL;qnW3dS;G7B4PU>xVZYz`B(tzJ z|Fpu_-+gDS`pss8JRpwV-*3z}Y?hg0Nuj!RD-0(9w69TrY$|fVl?Mv{-p{}07vH`^ z{KsD1BQ&d$C*}UIXDlt?L^A|wVIgfo1S1B#zJ6yc$;1A@-s_VNd-l_a0>LN1Q<{k1 zZ8-hK8*c7y*^Q49!r$xiSRNTz$4NO%YUy}g*O_)&LPVuFx?YH39z?+`t?C4mBgIJb z;E_US%o|1W=*H`D22@0iNsx0P6_`pkCP@e#LU7-wLKIJ!Ntr`QB$r{NoD4-*mmO*s zd}d8igjAf3Z3xqx$d_|qEJ~8V$V^ioMagDhUFZ~|fkvqs;JQ(3v9_&;fRxNJ7gDat zR*^1rR^MF0?Bf+Xb`!=zxjz>6M%4yNp8dcU1G|*C+aDNHw&b-%aEW9}6r#&9-Iv0p zd!dUQ4kNi_aLJ0_w41^9G>-EPji~pXqFQ{AD<~O4Z(aj{Z7-$SmxvIY0g?c0p8{lT zzxKRTHW2s^^DJ$YC=>?*CwmqWgc3{%&&DWU6X2Lt)<2OyB~-m{dtn2KPRf3QuQw`_?-gj{Z^}yrWRe|EBwpbej4ssa{z90fa z7h76lDprr^v!t=g60NSz%o1pWbgA?U>c7!hH{gAyAW|1^gZrDA_gd^dN=oNs$!V$s zG21`+2w|X@^ryTh%g@E^n~qk%VEDEc27AT4@OmwL5Z@^oPM>=}2jzv2AioIJw*?!fkb&&8+DK%hSjh$VAo4*MOat1AdF9uEwIQbHl; z19{PL*xj%`%<|G81HF5ol(7(phzt<2I(QDu5!tqcqGTLEn*Rf7AZ{uX^|kVS|CNM8zDG@#tqJkEe^=cuc^x;z3UKZF?d-T&=mX5 z!FdN}fbvCO6;R-zN09>|TBTb8jlot+V>cCfV1RCqZQDZa??R{&ZCsWoZHob_ zOl=0c97xAgR_i__3$Z5nQ2~w8_Ftd|tr8kw^U#V)wR!L~S!r+yCLc0H^9c+W1T7JWN){|`{T@*a3s9pS_C-s(TG@$o)SqjBiR5&evumhHh`f3P0#VD$=N!nlFE4S~4?+Bu|D zrfe&RoZ)bIkgVH^fjqTOHut_Q+=EpRw`2)utBXR`CKBF_M_cp*XJchj>W9-_Te14L z9#`P{eg|4VTWC^jjQzLY??2dAW15gO)%yas6T!FAiqJr-TJ*v5cbhHO^}MaEsS^1Q zT^|pafC3b0+r2*?(D6u3$IZZ$lilCe{RU~W{p-zv35;p@2w?r5mdEl~(lifBk5h2J zmBeu>oU9j=*mFGYW^}wL9T>agWI3>k7|_*sP3AR?nHa;I(ua9l8FL{@bPxiR46*tg zMRJ~jqokRnep{=7Lz-rPEQush@(^r5(n&Y_1We{-;ri?111NE(LNNd<<=MaHkdIs+Z(D>7^5R0 z2CP7E`J@e8-B`Ss>~SQ<8RR%P%R~G|*b*3HG!Ow*Tfbi}iJ_%O7EhhB{bGR43@8?- zT6jux?r6g2~55lS+7pR-429Y+XF6y9J zi}=Ut;GQ?N@5E~037e2~Hqh4~w#_LO%AjT-uQ`Dh$Th91BcPy_Wu|t#C3md4o+qbE zUTyXqj+v9yz~#^rri_~RTAU>o)6syfg-#^t3^?n9%nYoQSYHlEHa`tZ8QLEv7UyfL z!p+@1PfvS}ch{U=oI(iD4TQJ^_GB|6hMxFiSZ<2B6?xTcypyD-QPI z+iKMiKWCcS{jETxmg)^TS2wu9exRjMmc}sF&;Z5?4iOQ3U^-t1s1HzBX+Bkr z;np|{_Rva`iZ&DY!uzGrw$hC4)z5(z+EAd>wq~jXxDB!!fB-nyT+jx#`8E<|oX?%# zb$oEzOAZvT!w<-GY`G@xSTWngJ zWcGu=llSw7w=J~OwbcK=e_IHx-@mucN_%LJSsFj&)n9u`4q zd;A_K*gyZ_{{Q~-q;+EkK7fI?+YxF17isHI9vpaS>*555hkcrrM*!>hwLF%`5|G&= zMQ4AV{qe|n*xA6%fClln|2z-8m$9?K?z+d!oI?yIvk_7HrPHs|NG^)zfQF9A2K|D@ z-czWO4M1}Wq>=eG^K|iK8G#%+1ERJWm}XWE$9eW{2%*k6I>6FAx{5+!_B5KZPznax zjLz;+fanJ9A$oMVF|X{kD8;0MXl6gnlB~X)fsaV>;^GTxhRT>A5D(t32l1P?7 zE)(nJij(!qQ2wpy>L>bsuzhOIOfrLM$LTmrwcOi5L|6>HJ&vQN_eq_dQF>?Q6l`Vc zaf}FEtb;7`_Oe+rN;a8PHsC_t@LZ_W_~=ZzoJPP2pMTJSv8`)6KlgddTDYaa5BksO^L%$p> z?QppernDn)PH?77J}7zb*Fg_@ECx((zkNyC9r)ti#Cqa*eWQdA?*4h>MOau)p0hNC)Fc z&O6e?>@DYp&{jkV(fy{1xFSms8km!Ff)G$QPSvcI7!*R!-G0aZINJY)1?$XSR0lSN zOmHSo43R>nqbD(epFhPU)qxQ7ea{_FkF{cKJ8AN56~7MJjqk%^uLfwKOabJF;5J@p)5k7XZtpfQ%h&Zqp@M^j zDz9-Msx;P@(#-P_2k=UBjjup?(Le*QGEl<}i+eAHxj(WtmRSWrf)M>!IpfcsOAsJb zkHZH+0D%zldm{;T*;5P-;5Y2i!Ogl}MSdJ$4N3^JuVUN2*Uz`F`jA56z*TLCNfl$0 zPb$#*q8SlapS6eSi4O;J-v1Q+fKJl=*gk*>hq^jmf;<3wiq%^x7)b*tJwdWEhny`R z-~YU`_zd7K4jB0a$nUx|W+xATt2U@tzQ1@Mem_XjXhgJ?<-?Fs>s4s4eGkl}{9Ve! zx(k2DqP_%ZG_LPQ#M+Mk4i$OWW&DTlvhrK>58vDK-`~u(KEK5lLBIFizhl2WILjZN zb>+9+zpooU(DvYu4V`=l+VVjliwD~%v=Y9DbybVcx zLog%nqVwkhnII7>-7M!4#eIc@qy@rk1U{x2K*1!0nL`v-U7VwZ)g?L}OAnBIz)_0Y zA~Fwhf?`QzQf81Wpmc$G0H=9=PGPm^=wdK4z_AGP_$E=NMBiIFh?@&{>^4V}MNUNS z_meTKjz!p~X=Yw^9mIi~o3{p1g&?zcRT?1%l)$L7vEh^oQ^}tA6p5H=x&d)D{i>8q zl%AnqSlcEuX74E|&}M5<=v-1)N~xgGd)^T^`zm(50XrzR&AuO;c?89Qo?MDc<2uyk zbF-HZln>lW2J3Ty;6PTJ{jLKPYa{l5gfRPE1t5m_{;aToIM8O>Eb0dDm6?$UaRFfl zTnWvDSAF(9h*+KRn|M&Gf2Mk?D1t|L`~D=((yx>=)gKHS96(2;dg4GpDsUA$0-#j} z7{q}suSYfCRi*QR#xc9Ju`xFM9wUN*8#1%Iih)!Hf({x%>#%zEJ_yFfnq?5(Fj#6{ z3R^TytUDnL1LupLWiJpr#!)E8#B#Y}5eF8%F!Td=$BE!mTPaNh637f3KYMy*GT33c zU^J;P(24a?k&a=}8LeKlBOQ*GJTy)nsT5AmP6<5}nYh0{5LQb|R603bGotLb8_v#7 zIa!67iI|V{VMz&t`B6>zK;J_NfnmL(Tb%Rt*RO$|)v(}X*;5E`*wIU5^KL_wf$cu= z(PvK?%VgkN>;l>ehjB~E2Zr+tie{sqck3nN*Kf$Y_PCcEbUlq4hKd{+?maT6=5+f2mp32 z&N2CFjH_b%Lgl^m!m*?olnxn@Lahrz8!U^W6mqVNBfz$u(Gd9Cii2Gb{qzg=TN*I0d11uiYmebMq8;MRVnX-88o2E9t$-I z*xRDe)~O6uPl>Flh7If}S`FL_;M?`bP!sDaQ;I6%)W)Jh+xM_b86#l^WQ}Fmyv<61 z7!x_y&U0yJslZ@cVi!?p#`W`K1GJpgi#Sk*FBRYmv*~}Z{%$~$%xtm;M(VlA{xm~z zfD#&ejbi7VJ_Jx|7d19k{oSnB*h7?|ZKFIGMY%Mb5S*k@XamUL?W?bq22y%oK1}-a z;*(zr1!uGRcD&6(;GcI9gjNFKdmxVTKyHWPU@RZfD?MOeJpin}cXTU!_)&j5eCPYH zo!@@T-@l>q{V2?DkMevEbw>YgfZPAKxKQ}5m~Fp(g#^&w_PFTZz0DuO`tBuJR==;54ZX-jhoE`iG^*)-FUMeI2ig{&+>G{8nO=3k`d zK^2I@!aSmKQkSnq0P>XWvr?dhSvKW*L^lwJlEtH5p)fPYtQZIvs#)@E;w_%I7?kKU z^$G?AtcSq{kjGLyTPpi#_8$dKpldao#J=s}V zUEdRQA~~x}G*DyLgR|o*_c*6yV35gT#{)5RP*c;O86XFj(I5^~h%=--IkU_NmOW4) zDmV)+sgQx}Ccu7(D*MDtNBbydG8+2@6c7Vf1u1z3D-Z%<1|v(cIxM>0K%!x}WVv3D z$32_-JYKmVx7D%i`q9%uVwI z-RcA)gaT}LCZApQ9Sat`x!&0E8deLsMS+tQdD;+q;mIdYV85a3JCiD}*Grbm1)6r& zr{iwV>hhGV5WCF9vn$3hvRGen*hOw{_pFv{1mXJ4YtEjXFdlbM1WmBd6N~lve69jI zo9~;!{50*6i#6T(niM0+2knR578JVGl7k+RF|%IvWCH0hGAx!Hw?{;}SsLr-KoB6r z2Z?d@H6;*y{4`%P#Q~8;zaS2C%=c!qXE%=2na0F?9ppU2@~f_MAQ)5|SP?>?Fb66G z0$CFxy{CKzV#x&U-5&|$p;wcibJcT+oS~Kq9?_&ap6mY~@_xO6xx^Wik`Ij?LjwXt znA_>~QwO&Kfoi8->!cNgez?8pS7-?J|M!74_dF~`UCIVpf4eF<#pP;2i-RZ+WHHsh zNdaG7g$BA&*-io)nh%fQhP{D@QnD%$E7g~iFCNC820#!!`hlhh8Ey8DA+G zJW&x325BBt6%2zw@Gf*<4W$}mqcot#11+?str+JzSA^r?`P%+QY8gkZS5r0}~z5 zD{fCf$;d;QsnU+6fM%`FJiV*-0SJ(N|JeRm{AFwc}gNYgCQ zFu7och(qfYX z=JQhgCavot0oW&Prl(QP!&!1Yx_`Q8chzELjg7U1yE4q_(35v;;HI+#E8;DVTI{Dv>cqj{5@z zA$E~rG4Ss0*6LOWq$2b|tWTuOtcj9^T&&LSqob@XaygjUdM9xPsock;?*c{VR74Fz z(Rtw7gPA`|Pzo@CZ7*~^#iWQwdsM;AdDZ&FK#%}sD)g~OJ;pbuCMgjjof~^k(_|6K z+R~8-F}Ngjau%IB2-Oh;s-bYC#ob%a3znj&rI}lU8q=*x`84}z&Ce}mZgVJsK_UgL zu0_fW$P}zi0MTvDip;)1T9{>|IiUifxSy9Qix?POgAx=vqHU{_jt&T^&`CdopF#zU z9OMngbRq~i;7c)+dIQcvo(L2mq6VVQX@Y2CDQ2*4EIHC>th*2fr1<7k>EeK<0@;~S z#nL$Kvr%Ryq?BZB>_SIQM?xMMqQZFK?0n5+rtZpdcR()ASb5@4kdZD-#(vrn2{-Qu zvO-A)46eJ`-|qb4gv0)xzQ@j`ZY5+oa_LZd(8$eBc^-PUU;l=|!XQpa(=D9}k!Zk5 zSaqz<*6cP1E}uOk??z&<6OfWel16lh$Z|m%_p^Unz`_c;i&OUFj#zr$yu4w*J@V}0 zij(z{DIGyz(o7c@q*OSJJDxs&%25xTUY>9`Tod~Nj>)c>#ghxd`8i=yrtvtZFj_wX zD2Ky=lhc#go3C3zPL$#X>3)ncc_}p=u!2=H(Cu>Lsknz+n3;g0g&}svb{xV$E?6?x zejJg|p*{#li-Gq?M@#+MmZd{$grRq%xjUn_vdKCa|Y!nBa8tfG))ZhsrQ!>79|3EGv&L*vO@b(s$ zylTPwyGb@Fcz zBU<-ik>8(g(BDzhe*aGt1>`@@h)@F(|5+Z;M+xEYb9pR}Mai0IgA1hsTk6rxeH5Zp ziC4$6@6AxT(_-LODISrnGdrh9LBW|$0gXUWih(0aC>Y=s3>cExpGmVNMhI@M9fXKd z!1fWG`6Uv_IkVdzeNcj%x=*M=2x{w;iP>u_M5gS%PcCU3dSTIb2DaohntUqC%xIaW z(HJ^0cC5P&QH)WN^F+bCuuQU+vrte{iB|7XqnY0ekzwe7zRw0 zsRl~M2GgUlrIfyl2J%e?>@fQ#xoNsd9XkUS-9x7iL;+7U5vrU;D4`Cd3&qE9g*LD@ zun9F#s+3|rKUxPY3MILOwDZ0y#pO-zhebyn=rj+GCWi~+J|zjX#g8Kdv>MO)U^3V- z7MG$H9~c!62`ID>C8$QUNg)z!DFo{m0tAg#KigC2JpQ?m>rf#lHwX?y$HqbwtAnKM z0D;(heFzKzI#mO0amHD|jfHb@kT(*9mIfE&Y>;1y#rFoq`gs@zI*VDp=ZhcwfFr`M z-|dWfs5v1Nf_lnf6fl4)xS8_Ywm^WA=nAZtJ!RU1F#E`qnH@=Ivs3bZG8y4&aS17~TJ%hPN7PxKDqUdgGRw;qV?KZ?iy^Xz%5L+HxVq%* z<1@m#Cx*m+bH`z`vHqm*VCvwY+`PIYBCM8!9nZl$;|yrEYjnHavRHK-rY&WFI0(H} zxuZ-OSqv~libT6M2NmL!E$;km(OY1|Nm!a(GP%RtaCSo3Z&<7b$WV@$50k2pvqF`g z8KYtbI;K22({*HW@M_U74DiYslUyGTMH%)wU-90c$_EZ+CI z%JnKJ(G0(_*R+9H3TOo&8n{CJKFnoa7X^(KRBSk#s4b%NqAewm>Mck+wmxxE@WW1U zI#pwmHO7~leB1tM?|KSqwnxE%nMN*hLv-=9!_fQ=rObFv2#uvA6(Dl)nidL8>PW;& zc*rLR58PcG9K`z-yVmr9H<_QqF*F8Ll~+2-*VuE4W3=A4g`y5H7WF#d#_z?Ci`YWj zAp&#+ia0Qp>v7V?)GZD0#OqV=KpAz3U#uWos0ou^e;)eHS*bvD{U6#n(d6_FD3?rS z+!d8a0O+wimPb7E?||eekL3}-`kj}@@>p6lZg4|WH)ah&ReVISfqN%PZ*sq4Y=>oB zB3*RT^=4oy8k{{+h@l7nZ0rP0N=`~aND4xkWjFzp3Pk8UKnY6n>ysJd!)T+e9AOSR+e5#9qljVXT3P(V?!P=2ZHqb$^ z&(7W+^k|vQ)yFI(gh`8mSjTikDV&^KK#bgNww9Kd4d4)BH-juw&U7LAz(oxd8uRQU zcD6pn{OXU#nJpx-COXc*TIiV4;TUU<`r+_ zV99Y!Z5~mwv)5vb6ji2iLUSfMs1|(SVJUfZ zN_CH|L=<_?Bc}qYN@InT;-<9L7AVG^3Y6kz)ZU)z`;yy06V+lMfR=0$*xr3fqDf`d zw&k3VnW+{8N=-?Gp$-J?9Cfqy7A^1Rwa{rsN}x9xV%d=ke+eeQB*no z=nAHh6~UNSX}jm?)ftyp3&!JyWsFS6qqQp?5?z4Bx~B}0VI56|Swf^6I;KvDLo|Om z_Ip+rr%2AEn`_EA5uZFWPplX)&}=%+*XDk6%jt3;4n2e=)BS-o0%M{h62+v~v*%t- z!PHVUvq&Gv0;0mr-F6-XhdBG*#U4p&%*vdz5A+LN5ckQ-6lXGt3QY{~fe3G)RE9~w zlMltyAhR=K+Pc}9sZ?|5JOj!(DAE$=e4hohxdn&tegt0yBOD-VNJsd9cdUXVFzp4+ z4*opkSTqxQfM#0$;C*Pawg;dU=mYP^2CxY=rOl;d^|5ZZ0a(uVn(J9KILOufh}>-c zJp*tM55|ZOTy=!%L!~&=DM&L-FWUCs01;uR#vCTMVc zvN%ANpwIxe81drZXqDhfOPKT|N0)iJ7nXaL)qNEJ_cB8pORjYmwN$XGlteYjuQGLQ zDTkEy2-@VPnwe#mg(g3R%FwGuR&6`YIKHx(+qq+2WRc(zmKlYT!MFQ+S02k_c`T3R z5x{yZkL9tHIy*`L5l>C4_m{$=3-l5Rp7fV<;cz@cPR7s>iD;PzczBXtFd(c)T_ae^ zkq|qgW)^*O&PwW?}%ySbWyAr~wI40-FQNuM+;2{@)gLFwG%Na|4D zO_u8nuV#Qu&}{pgVm9VSr^0C;IbROsqHOn>sU%WTA72TvGv?Vm&@8wY)I8WcW;G-3 z$pN<2$%42D+;5KT4jDp+Xs*VowhzQXHx#V^kYep!Eoau(VVo%Tew$S_P)IRplX~xB zCetQMbO5S);}n-$h(A}-Jo{>G2{zbP3J{n9u)y4o8XsR-4vHEen2aIkOr>g+@A986 zbo9P1V8^X!aj6AO{$n!L8sT0%-CpWCGYF6hF^0-!@udx%W+1V8zknU-Qply)d&QXq zK?SY#&&3|2#2GlK0|qU|vg##3PBT~~wo%4pvPAE9bwhZF?z0w{&(CQ6k)5s9M(QHe zZ5uE$$dQZ1#NYqo1z$dY%2qSuc8BIf*PW0A=bD#Qr!M z%P36;bkQ3Nsc27`vi0e57&uCxMB#84Ia@Bdy}c)%j68qwL)MFP^td;$D_*YoO?bvS&1)1P8O)Ye4MYJ z&HZkcy%wQFapUHhMVhBV)n5nqRf{-qngi0VAGA|&w#bJ{^P+15>|C*=_8DqWg926^ zbs(z(zAjU2>4N%!Ky7^wtg#a6V?gAC;oG+Fwrx)Xwf*@%TQQ(H`)k!N52@crP_O$M zlt3xf!2CS`s<`9~aW+h8>3pbCD()7bR4H$R{G1sRsb=Sz>vvQjJOp~EY-S}qkYslA2T-O|8CLIu+7?dIW? z{s2KhCQKxzGf_hBwjsM0@c z(?k4HYqBhJ|KR6(F4e?6xG$$o)_8wKDB1S~f#ATSHsIGixp-IFlc90 zUo3}N=GFJS+ibZ%97q_zWMBvWs6J5120p=lD(uG0m;#3>u^W@^^YrwD9N;jH?2n1i z&yuFWJfadJ3eE^ROcTi^1Sw4{7m?Mn=QtWzG!K*l)qLEZPkysnZ6gNrVAV;2>>* z;2u3L4$7r6;R+NnkSDnJ4Aj&|nL#R)z5{XQ7L<7jfHa9nG=uptOF(lm)9ER5FqIkDEkOWFq_YG(zyEE}@>5EN zZdlL-L52?9-2j7K+gIlc6ez>M{usIb_NAqGUYssqJdlow<)FlFByUGz87XO`lqJL! zhiT+E&eC9YcFE~##kfx#51H+5L{@83-t%RDMZO;p(D8>{FJQ_DU-oCl#i!VPm*3^^_jJwRq@|>hS`@=maPgca`!miKFes7?XX4r2= zPERh_ZuSg|NIql(g-)JaK@`}595XT&I1^-8(Vs47qw}t(TP){+e3VK#ap|L?1hL?`~P0K@sOxf6x7OEg(=eb|%d;`){0BEY{p!?@U_U z4@*kMUeCrN>_8jvi-YkoC|xtecGhH}3%Fd(2h&0Av7u*M&>R zOp;t0gQ|YtM+Y%VE+EuIxewa7`k>lDZ-2cgUQy;!S%vlD{Gf@h12x$Jmqy#l4$6nn zjL;Pasw(@b0&GEn=-bRqCI>ZH?*W7WLak$=png5K_oKL>Hgmr_Mnr9I5v>4M{g&}2 zHjgZj1_a{$pG)ogCZ!e!w5SqIK^*k2pd$r8ACxA=Y(P>VI#X7ueN&m%f#8QifokO6 zwxdO8z-a5c;*$g+1X~c^XWk(Wtj&-0`#(gNf;&J56@;p+q2`n3jYpdr()+b~YBltW zB8^3*>icg%m3Tey^D{W>FPB_#t{I5R-mh6)$_<@)W+}J~6KzS2S<3_2CVu=I8Beu> zf`x{^wW3-9%RGZhSs)6v&Z=CUWmlYSw4{N?gS)#sG_DPS;4XpS?gS?gtZ{eOhTsr1 zxCe(ug9Z)m1a~t1o>^Scv!TS`$|$@eq|94b^^{hMAJ1>Z(dxn2?OY*M4* z$BzUJcQ|NNMgV zUqX}Lz^SE1!K@x0!xbQ_KeEvksWc2-_fSH{%EI8C+?um!M@V&|)Ce~lzP7251h~^q z&Hc=ae*gJ7M)T--s{lCnGFn2~y}05NY!k6ISJ=VTv80ILu=bTMY-3|OBP~-Rxsg{` z_GL}8;ksD(3yY*35yXQUyGW7!IG9~;n#vi1&$U^^?;9o@MId9>N8yr00hi7u^}XpI zSA0%uaz1Gk;^+4u7FkH@R$~g^bFOA-+;K`hnx{D)NXw$dxf&yi=#=tX@rv!=vnGcv zI}}7!4CC$Tz=sg(z{U?sylAI&LD%HP95@moikQ6n+nU;x9;DTrUwOd!%Eq5L>R^~t zW@Z4lhv1z#yo}~`3z@w1IxrsgoqVa@u=T+cn3Px<;T9G%1UdtS?tKQYflT=dr6f@u zBz~@sNp?($*+;_e9VQJD6sTGl55L6Sgqfze^nkIAvg77fYc2*+8UzVD$xX39teuQN z+@q4eur`K_3BrkAz#B=o-u3#Ga}lwx+x^Jdfl;6>Vc2+P81*rX3$Fv*cG%wW<)=HZ z>(|!|TG_i*z=SQa(dI@&PZx-5I?Ki72r*$v$VQYpGxVz|Cr&)mdMSg&X)>$F8by?G zUMOCI{J0rfW&u>>IdD&>E$BL8h}m&U>M81FK?ve-qKKpy0_(IYCK0PS5zDAf=dDv> z_3pwNnQe(?Tfpggl0y34cY}d--|#+94wr6<4Xt9i{cJ>u92jm>d`6hlUky?4{^lJ$ z&oH+ZjO!lZ^5z7*3QR)3Z_PL^vUYaZ-yk%D%YkJhgTHINf|agSi@$5Ty8->+5sLY7 zl-V7Z!M$`93~5mx2eK906;Y^ZY|p<>4h*t>kE>+a;xN*&AKt)azzl+l9j_wJWJ9<+`YYlFVPh65j;q0x(*@wpL? z7uc@g;6LTSimFH>@}BVl+S`Wa!*@}Ng-~)lhW8Z$!HU{70xk}Mk?u`dk1ubMVj!Ls z`=ouS;aY5+6;MzV;-`6`rY;^Cd62alIR>n2)Fn$v;GU>MQcxW?Q`E)=Sy^Dz1XEcw zb=;b1?2!Li-WUTATl8MzdOW00*t)k8qr_;`KvC}K{g07uupeN^A1HHM)EID{DDS;v zb#eRt04}=zGy_KKOEL@YM^ur^)@nH`s9hr9JjD`I$_L!?bPkNR%v_cV5em9Lb8+==6QJ@ag$iOQ_Z67Cm?$46^G`~3!k5&#_rJoo&G35jiht8}aGssJGq+5G^p`kSh5|m-2sD#u;_iSPOd|}btQX;TF z?$i;nSlQVq4KvTVh-m>I1%7{NDWg6mhR#iYGePY3)pG%oYAiMGspa)eSB~rjhasAJip0Sau{pPC_t{*b zPaI%ALZ)mIBJkc!@@JnK;__29KfQzLFOMg^yG=fTLUAeEW_|bN4IqafiQeE4X=i3# z_K#53U+U2=f8siu81a>ecr|Q`-Z=)bB=4+C*ar>l?UAlqfK`$Q&N!=Ksrgg^6(GoO zxvjwub>==Vk8=ff=PHL<;I5qB)nwR?!rE8T>^%nl?xLTGGI7dM%bvRk-Apj9AI0pr zskeS|?dmP1CK}yi9Qg7RMgZ{W-E;Ula&#oJ_lRHin*3@r0fELvj{P$1+^GF$AGGxr zIAUk=sT&+rNx+vKOfwA8(Ym|-{fg4L5sLitg@kS%Q6+8Phn_RL7A!dzY=q*f%wx7d zCEy4UK5g(r_a)2eRpTW+i$rm~%R07wCA95~Y69m?E)PG3@0;s7I>nO59N7532DjkJ zKz5BJZfZ8EmcI(Iv)w$RlhtYL6cHT|ocm#jgm4Fp+TT$cX-5*NUp`g#F6!2nfftX5DN;$OOIFal zz;jmXvQ!y1PMgabEP)#~4&#OUGGm0NN?2VVF5W%&Habw2=oYs&Gy-C^eVW5nwUlpm zR5hgz_|p5sLVJ!u8O3Q@){(bRXw-+ywFqSK6`N+<`Vi0;xP2n$lW!301To0%8Y?=M zq*9CJc8yh?&)C#{BYNvyn#>0c^&rp3K+8v8l9-16D~_h=9*F=e)7Lkm|0F}Nqi>hm z4eU+m=7dRzl41%z6-KBDXVH_k^%LB&hOUJm!X%!^zKZ!B7J_u>=EGw=kcDvzP^iGx zM4Wcus?CotGm`az4;m5OO>wF#E zPhxrf-BRdY))dy9@I0BX2xqyp^g|qmEe2|jyGWWqJK6C^gYopUU?i0O-B5IxAuD_Z zZf!Toz8DnyWdzJ_G^Gi0)+ETAEW^4Z2qB+E!PT<18agcCI(}9lm?z<*MI7dzJd;P8 zl~Dgtme}qz_{1@J>uGKdyz|n)M}5ngMu35DspPq^Y|H~qw%mU$12m{e1Y2hv1XOFG ze5eF`8no4T=<|1e@9=EgU7AfJRrU{#eg*7 zi4X716wMa~Vwoj~xruK4w!ZWpv~kuHCyAL;hIf0Ox)+_mr*eHjxpBBKUw!w9q{Q{# zxqwh)f*e7aKR-8$L$p$zBVVhP`_o^pNGBqeN{C9OT~7fHg) zZOgk>)r>9#{X1R=80yi1!kJj|qLW4eFKOnFQC148!9P?eNC*ow50GJl zdRB@=!FX#k;Q;$J{FCg4O}^s1peNq)NEMNU3^UQ&{*p9X?t-FK%9QnMX2$E?agpTV zI09NFez;G}QOG(|OKDG!>%Lh?e4)DCrl#pfmV7_y(za|a@uJ?=ld?%YTGGh&s9AM_ zglTO?HBsA1VM&3K<%kateXHx2B{+7{f$?BK)Y3=raIk$`L2z>eW0F!pFQ*P7q!h=7 zvoBI*4FC@-j$DZL*9ckuOCluv`Jyk&epn3ql+VRD^rsKnmpG;77iWt2jXJWpkc{~BoS6oh>HM)=0NHi zw%p37^ATvx54`R*d=K4-zJUa~uIhu^2h>OvY$JYDANL`^j8gEh3E4HS-BI6d9^p*h zY$O=*jfM92^Igt%ue7S5oij825M#G}Ph`cZ*P+uYcqWj&nmI$ACVkv)Dk=5eTJK>! zM89Qo-30|y^fHyL-Fu?-g`<~SUfKEaU!){^;z3)ceGV1Owy^Y{tO!(c8dfPle;;g) z^Mip}+{=zDt{q2I=%Z>j1q5|BB`St|`9np+^b`#m-u`j`rd1~2kckQ&a4*brIgnw> zL{D397?F(TwE`>KvrYACT|tNNgv zEkuSY(X)z)eC>d84vp0oQ00Ea5m3APv;JHYGvh}7P;+3$3FH9%UPRrtc>$fSPF3JS zLJaXlen18D+E&r}yYjOT3yCr<3-+n}{a%+5Fv5d@Y`1G)EUauUz!62uqn7F`QZ$rc zK%hPsqo4Z?G!|WKj!Y}DP*+_xtz%lD!23a8W=4c_ZiC&0f!mX>@SS%LqRo~PZ5Gs{ zF)-`iq_iq|N{*;qDH>6$wrsH{z>A3NA-H1(w?<9mJp{yse50fN=)$Z2d-IZKMP#wv z;97jyb;q04E~md{=3eh&8$`XEyfKm_?IEMXi*V283@egD>YRPEU`?HpaR>kM@j6te^6}AaaV^#k8;Fq1UVNy5CNz3Dns6;0~2`)BePS;IU`MtXG+)@mf;nbZD zu8f3eT9#KZpZPv3-;!N{dmWJMjWUQ3N=w?Q(NUdYzE6j*AmAkV2B}iB@Lv?H2L-nX z2XNmhFv6EtL@WzM&QL$%SxG=eJqfQSVIi*Pi8?*QDF*J=cMM4>)p;(IZBar7GaS54C?4Q>1%1dzy&9?`4yIiADqA__*mHTIua3y)9ulsskN)GU z!|UZS$g#*>RwG}(6_$BW538{RnrKgMm-3@khmJrdr5XzivF>!UdE14>e&16g;s~Ys zyni;bTcXvOZnS5+fKT*x`oUA0ZSdB~!TaIuLH#Z3B-at)&xK07Mqn;oug6pB3vey= z?H}%fveV=Gl2Kry;^!;s4)vc>zdYUtMjj-+0Zs15QknlBjzXCMSK)jBFW;R?X{#bz zX@|M5VZ+Q3LZc#SBu_VlsT@lbq754cCnFH)I3mJ<{;&SapN{7@RhB{vl5r6c5;|`qa zEc|EL(iy$*m~-|frl!ZdtN10b!(xqTlo7j5_iw4)AoS$!Aow|-)-H3d~5|f$9 z9!tZ^ws87M;&)YX+G1#FzIQYl=<(hZeS(XJiWzG)IrFnno~cA@;1Lle$JgtQcks$g z9P*5gHnZTH@H`$kKd;7|R653bBWwzvuYmUHsahBwmM%VeeVvmoXu)L z_F^P^k|69Pmpo!JSxyVqq=+I}zy?TuYWa*SAk%!|D$4#iJ!aPqTQ|Wv##-9NLJ? zSjL_+O5ZO|_sY(1CIF?|Bv5Hqb5ClIwUDlbb+-9e^9m~$DScZTIEQzvB1CD3m8#s7 zB3#yR1^BxyGX0?2C^QjKs`aYev^Qbq9_D!Md;7kAMxwiO#zCge%9n@ zZ|6UfwiZtP2n9MMRq(#IKa|E8!*2a~BmQ(@IlGvm2CAf`*oZKG>8ut?H}$|NLTxU| z%N6Mk`sWyN3Q^ZYYJ8Pi`U8lQG-Q7G)^dO53mh(IA!G^Nf7FKuabC-+pF(Os2AuqU zbg65;KU?00n25cZ_@^*U!(3?aJ8?BO)HD7gcKD(j8=KbcZEahdFRgEr@{ik6_y4mc zJ$inF>7juC^pMpg(+VqUz~Ai68EpbA-z#!QMgm^I4ed>VjMWYO<`AGbU3a%0{uu> z1|BmXj1_75App6xM0PCNydJ({?Ax*GlNFry2(LAOjVQpD%4o;aN@WarfexG^55Sg* zqbU3K{T-xd5a&B5E!oz#3Px#gZj`T5wsO3ZU`yn}2u8yc>rbZ zQ-9tRJmm=hkW!`C)!Z!?P5;~9TWicCXjvt|4ozEC#>)BpnW|_^yUhMdI!K+8LGTeb zt)m5CB!|$4QKnazb4(wOLs$&9)-PP)jm}p@!h|DDy(OlV$$F;$lFQJS1YkcB)_4(r zC%L7SN}0hwD+Z@P<$LEj6g$22SBIqz;mDX)vK>Su@lG@%t=&lWJTaU1Mr9;A3C~!w zqexyxUXqHm!)%opQU(og3#%_5MI02-Y>ZW4wTY9g={3WZzuVy)@Rjd9B5eh>Wj}*@ zKj8|y|I9H#=R4PrP^t4!+Op{d?(YsAk?#B%z3bUI9?ORRV61|J{+=L%tgXA7(UaZ9 zXT(6Q!)S#*|LQcA7}n^geV2XIMPFbdUEhBK9pU5^WOk2l{E57pEr z5d*tFJp{KSu|zdpLf=hwJ6IgDijb3(6){<(yL9evr3CtfHe0}6k%s&=4FgxS)B?5uPr~}Ld1O>6XPmHiN{F(<2CVkw7x@cO zayKp3k_e6pF=ysimo=_&#ZjI#QAi>5XbwN)kMHQ1i(}HU$e=1s~ z(+y9DE+^jLh1|+!wj2XcEM-y=byTLFGC%m;eY^SCr3%-d2xQ<~u$(=ymB)-xgc_!n zzGq1Sq*$By=U2>v`-5`|X(r3Ng*yeAUClISko$Dn^MP0}e46SR{i=<1gYM@KC4XYx z5;K|DoRbWY7Rh)PPiOt*5$0RBq3HPe+1uN<*ZkWKIoymScAriRW1h+yCtP1&q%}}Z z>knox0{Em$hXkK`XMSpF<@^e-7P7t(PTjP|#U+YG`e*u|`Rc#Z3cp*>f2UX->NGgu z>KG#iMCT$*g^3`vI@(G`gCE(Ddk^8$C0>y}9hF`Puvj#;ghCo5!;n=nl=Z14KwwAb zIml*+py&oymbFjE>MjvafM~fQoQ{SUZ+=CDH|d>~r9R=k6MCBXW?x~=5-Ji)h6&MA zHZA@nvvLjfFh(Wfs`n+hToDo2)TKdp-x+NwNDyXEf%Y21OXzZOPeJ%3muMs4$`Qkd z!H&pI)htD7mexoD%Fxtfc1*Guo(;>uO7pnn7hI;q-X|q`Z<^X#^RLQuUf7pHik~$W zy&>cye_u)sd ze2x67ymzIk>xU>E98Sdf--W2O%TGwnPvxTDIFaV#r>lLXINNy$<@{Y)2oU(VXIBV5 ztr=Qp7@BiPIgN=Jn3f?_V-Zot{eu4f>J~Ugchl9;{S6WI6UI%w6NS{@@a| z#60dl#~gi^5w{%&f6p*sW~5)&@6JsUIiCAcZ*xAo2-Z9kem=j4I4l+8C@@NEsAT|b z*Fn^xWk(>jm8n~j-=pp;+$6A+s?5mbq(IPL6x*Z^`iNWw#`QA-b*Ag}$6xhM1c=Lt zRW##`3B?#QphIIhC!O?>ZY8lE!u@yN1Gmjrvm?|VLH}Z!Zc{81YWSf&&O4_79|a4J zrq{PoMg5;cAf4smJ^F47O5>CjttQ8{O7H zy$54^@*G6AT~Ehij{lB^VrFdhY$@jmb?`H!ytbr>cR44zA_cQ1BZ}D$cx?1)3 z3&?%v`qJt|$Z z$m|qDq){IZEU$r2t4j3&trwclONqq8g5!6+nM}GjuR~mTmQJ8<>Ou=M^M-pC zCj8t~NA^j5nxsnmjNs54lOKX66{S`v4=Tf%r@nvT-ff>6>me#BELT!@kk$y8Hm!xg z9b2JfZ*Qq%%&sy_Vby5KIwk@#Lzred)L8>-atIa#GYR>%W3?t%4@S1)*sD17UIXO- z*fD_YN$lFJu(XUG#@{6gTyog64BIVrMp^=PgtHT1_P%)13q+<#t zGjjMr{f_0-W4gj&s}FG(2bD_^qk+D%o|-vD78ZKYhP$_KTq2DyAk$~k5Wuc6C+TBM z30NXEpq4QGYR)c1`G_ zMI5DNRw*LKdvf0&f;N&$n zIcc~UFn#uCbREX@Fy`gR#IRM?XX*g%rK(G9!|u9znUu_isH9h@R(-(>AdV!LR+V27 zO%vLBwr*6X@k*uv!Hs-pe9u1L8l=(2Nb;(e4JomGM_MTK173J9kB}HCF*Q=e8&Bz1 zcM5*l+A_V*y8^3W=F46yw3;CNyi7Xm#9w4)p20+n&&xx0`RsBC{xwl9{@Rc2-1*CA z^YZS@QLmg>TtbYV(ucq{CrsbE2fCD(tCd+b5W79ctj_=LQ>r{=65$V!baF5`ccu-? zM%Q%i?H4pe8vFE7BAt+1N;ygv4VdWG%AwXx#wajDpHvV-LE=mcHvL?xn9c?|!zffp z#byV6_c2GVRF>;pORXRaJU|d8j|;&O58&5pDW9M!Y9ru`_)9g4qf-$~EG$gde+T%! z37{d=cSsRmRpUwzDAg#9oKM2YKd~9n`qW_#^pnpQksm{5(b=T_zUVTxtBg zK;%Vwi*a7@b%(V2^P+%Oe;@h-BMP!|EsgcMf2DoxTRVso$t%VHj1IHD!s+VeJ&o)K z*h~^2#woHEq}djvdKA;Fuf*V z%D;5~ohGzzl(9ehT1pU-;fwd3Zz8mOjSa4+m+68XscJTW)z@Tcn$=QA#4-Q0z^L*E zqMTHQ$mD^_>^wuwJmLO9j^P7*DHRaO7Jy8^FT*@&w^iUQv=`0F_*@v4-zz}I)Il0_ zdvjb&Gxyb@0q^kib+h{a4k{e5g~)&AQMq-)5IU=D`~BZ&QBzI~UX~wwbCuCODMbl8 zDwiQVQNg}lsO{kbq>iPr+YzhzXXR1wd`#&Ro^fPZO0@W_Ed+ob_XxajR#sU#x)Ov` zHl)J!o9vaiW!1bv(!U0LNeEVGR-6Sth&AtnwA3{@M3O>XgLpubebttFTEkYdWQhDT zBUB80r6P=#RyG>dpfVWomYt7?fSyKZ`xKR0O$D43{SWWO-7l_;pjs;CL@hxFwA0_ai+cA1dTasZ9~aw zY9$DP3c>hi^dftrW>@ew(sBpz2uf4Iyxa4?i+{|`A4isQr-)u3|wT^JnpcG!2U6dvHf*{33V>> z0HvsR9Sb?u!nU_g)5jK*Zn=jOve`_QYw3z2M_=cD*ft-oT;RJer+SM`sZAd$+i)P6 z+f;Lc^PsL9`r#*geLtwj6j!JcjQj(KlA)sodqW5&=sV_CUwe5$Y!Tq2B;SvS%1gKjqB2ln5vUBW;=Cls2~I4egkjR618g zhb@@Cvqk=;bPZvf1WfF%IFm<(x`H6@74JH_ZMLF+@0>;x9N#|~ZRYqN@QGK;dm2z9 zyixT({gzx3ZPEC}TuqH{jeNUP8=!=jna`|Cmv{8P}uGp+$cfej+LK@|XqpEB-w*)r?kWq4BEkM=d7pvDd$Uu6T z(Hw`qVNI1W#WWqm+r!laT_r%+^0& zKEHhEX}k2{305+~n;lZXsVtnR&02lbhP%{1x;texrP}BIL!+gt0YN4M1csCfcyzbF0_HK zC6&i|v=YYx+n{ZoYFQnfxA>vPlTA?ge9gy!pS$)j;6w$OkIL6H+QG$hox@PlaT+_f!+HYDXMr zTG*$&a&)4{ko1Wl+%mN_o#p=fumnEzH&SLoyyv;rY1EsSTtzAho*<)-HLw4d$feF( z4{Z@4U%?)hL``Bw97S^to(tx4qnR+kFKY4x-h9j)&Da@;T+)3nqIBNA-i|E4+x{36^y!1F1^cmbK2w+?IIu264^U2G{G|HEqB6dsz zjp9xsb$}}oug?4SA7YxQyI`Ktq1)c;cM*JUjrzDF$!g(KbJ+O*H4tt3U#EBpxnAEP zvyN9KGT@4FFPd-pH(Pu}x8u{BnL)V@^}D~Lq&`9VW1+gyYwf$z9~eEAY`eC;-Xv`7 z(L>SpcrKO@8$G?4oIA;R(xlxCl2LX?vdAK z;u4#hUb<=EITK1MGL<@5?-arqNLd)F1S?g5r>;dl@kOq~{O$Wk*plVs*lRCOwxcUZ z>+X}=$04cA)62%2Zm&;bdew{^(jyW-;m9gE7^7ph+#56~`mUtQyiuvf&H7QGAa8d# zWrCM>&Fu`#%rG+!hOYh;phy~`8Z=Mj7g`_fE6e`{`X)IV)v*PGBFrwgz2Fqqv2Zx_pGWo{+oFI7RktL;DWvU#UM~VMWF%1Ueg`@U^3rc?K%&QEulKv&XtpLI?j^n_gC8_2d z;DyQlfS>aBSB; z8<;;2S3H@AT}6+(8Iwg42VLn@l$wOqfhHR#-dOke?X`?RRMgUPmtf@__{`z*MY5?; zFcP4xhMYw?^39n%aqyxuDno^+1{l*4Uhg0QN+fhP~D`u-qJ8Al!w>QD=^v77b6j#$x7!UdG*Ku>O z1@;s&DoxhE)CMW^sYUHZ1>m`xq6W?-_)EQ9DId$=F^?zZuP-#H7}fpDQV3~uR+cRb zZMSAy)@(?O{L%8PvSE0TwC(OK*mB?sLYeAhR{S_ZVyGt26!+6poFvLOuBk{0mNf=-x-qqc2=*h~gx0^W< zdTa&GkPxB%a=FcV-`aXA6s!ia3TVuEt~nvmdlw-m-%7pWbdEt`X?#ytO2y|WJ6fOyE z*qfSCH>kCB728V|C)kGA9n8(v0%sQQ=)tuF+YZtcL^y*apZ$8Rv)@$#msj%h8)Vzb z?=jehGuTJOyz5NeE_X?7se=aps|dANYZ8~pmj0I~9OEvg%7E~Z*zsl`YtkMWF7H-f z37#!h&NvY9I4%=JbBvJ_zI~C5frFbPr0Hg+Fzf63`7ZgyI=q8kDDztRllF{&GM$*ElsKUX7^VXx9Hcft@O-l#eBy^TG6pd@1M!ya# zJU56jg+Cf$w&ssVfk#IOA?TZ*&7aC>v<17mYMZaJvDi21pV(&Ld+ctR8ZmK8;8d}4 z2oWiMphb0jCQLWTtPBi{f1Z!ID1OCO%~)S{LT!WZ22iui$wh(7E?u1A+;nE8ISjL? zasLLQB9aMwXR`LgEBbCt0I3%{>J`b4OP>mT|wqwMQz zQBs!v)f1b`epp|rbjPE=oFP}`7r*Tb?f)I7*=DL#^$tfTsMw${%{g=6SurHwsQPzU z2@>9scP^Eg51CoHb4SxzT{oJ0`NU;+2toY@*5k<-SSeijW*8Z6fvXQF7sZoLO1dTGKClQUU zOmOW*Tz_#Nju<)4MPe#t;W1_gdnl%q2^aM&Vi>77bi05SHGsfxo~l!lkEuwwEs}tN z+|Dk*ubqk{gf9WV`~)BC$S$BuQlbcZ#_><*=1YvaWZ=(C)4=|T&pmr*>y*4_7=54a z!0H7?^)dLw)$r-z*)N+LYggNkDVHa$vec(*-7D_C0f`&V`gyg&?MBy%K4Yz|n<Qge0VOJm z*%Ul_MPShhLRgc_zAWDQqXRNC;801tYF}v+6R&@@<>|ZoUArndOozC|i8uxuo7f!{~ zWEyUFpblfoo1rX;ILw(5QoK>L2o8Xj{rryhQwnsl&z#;K1SFTu}F3XInZ8t zKDVEY)r^Btx+D0DU%mm7PHp4U&5i!~F#t z7QYRW_)3b(-?Pf8gVuB{RJcDy{6BE)>cYi?f)+P_c{{V-#X$Ln! zpcrF#c3Z5I9qdE`+U#yoJf0&r%m4R+rgY=F8G61BFHIJzfb>-v+50hH=3dbN^Kvt=P!|iFkxF6u#83`N=GvLdvbx1- zVzCmMMDDAbU>i2&^XsTZdkzZC7~X;tE^A!mz?vScO)7fjsTH`WVvBsffM3s@j)bdPOW#HOxul$kd+f-%_-S(i@oJ14pmX8;(`){MOD`+u>GfizdH7IKT^dK#BBZZsQHZsml8)Y~(3FA%y!`#xdesB`QV9YF~QSlULu3_+Nc*h3tRQLJ@z zl}XQP_H1P$bxOnve6W1(b^o6CYWX}>@oyHco=8hmx>2jt@wmoJuH@lsxJ9g1j7IDQ zA^S#9__+R0e9|EU_8y5W_{ThuU8ScqWSmK^ntA2xbJf^q^o<_2M?p|Oa}c^fbE|iZ z^XAIOm)a$erXpg1;xdt6KfdIX&zz8~==c;?$9z1kpAaqnv-}j=ff?bp8j7~VKTDsAqb4TgG`Yi z)LGVRX>#F@5G%&y06lRifHS|;4h6clOu`LI{3tVpl#bn+Z|&dpt-DxRNmD}x6VB4w zR;WimU0j5RBzb%=D$W`Y|r4(S8n8 z;g7N;RJWlN0H+`pkN{^v_qPxr5dykR@#bP(*$>_iLB^vZ@ZnBQockpot_d6gvkuD? z6}Ybpt+F-o|9O3Ru-SnPcks23-Yd^T-4(KwJo5&_KU#JrONq^KL%|T;xh!p&WM8+% zaW}GAoM>qbSIzei!Ej2Ia|ElzKN`aJw`&qm>B8umz^;c`Sn^o8$zB=-5@JF}TjkWo zSD8VtDTS}wVg=&Qc?%Qd*P_4Au(}@a4E5e`nLbDU3pRbZs(bwSZ%9h+-tg|i1ed5h zPfF_G?M%Y2ZSUAZt|y-*z(xdAr+h`w7Vwz!GLU%Ib&?65To+S&E;y66osr|o*z{H! z78Xs5u52VP0dC#$5Ju=@7Kq6l9#PsHvjIvpiSsb zubxQkC7Flp9f=TAOVIYMU0Ep3 zu}fY@ALR?_c=@PcvBKA=GdE=uq=LY=JPIDtIxXnO+FcA$0N@6|7k3zFLDp1CbZ*j9 zA_OrQ^>s-NgQj5}x)q;HMNJ@$e5>C)i=QOi?eh#8Fz-EhIcAMK8a=Q^ldXDQ` zlfmv*HntGrQiQ$sG^P`G`ineD5VK5rcyvd9TQI+kQhKv4y=Q;-S+Rygu_XbbJw&Hy zvD*vtJLkL?QUyd`_3Rh&&CXS|md!q-O1OSci_1m>ozp{+3W?t*gZuPE6o0EfY^%~ayq-dEqsVn)m@lm- z7X#VCtPEMEm|&Q>flxR$JHnUngsl;Mk0RlBtcZW9zo9d=w^{<0LCL7Q?RDws=ks)F zYkg`LS|~*_5@jZX{i;SO!pt`gm($3FP<*7qFJrn)hbr}3G}>qIcBM}SRc0gY^UYO9 zV&jqEI=GlZl=JY9!K6{n5YxWwljNLbQu;v`WO>Vj6s==L=AP=G7iIt5t^f1CpuGTD z|2tz7(Y7rql)M8Pe)y|@RD35Ti!N!$MzSnW`ZFu-JsSny>F`f)sFS>PCi-fc2!Z*> zdE~9gJQ0U2ee`EOHz}&+T-L8;6*)#uhsaMPXaBfZ@=>Kjd20~*4YXWnsOXP{UWVe6 z1h#+)7JQP*APkpba%q-*122^^ee!2FI%3NYD=m%F8rblQ)dIPS54Y8ZE%a8Hc3CL! zK9QkgSt-0`d=?Q~*$7n5SUYJPwBO4DRDUJ2#up?pf&{a*^?;uFn48K>vQfOk6_8-X z6PtD=osJ5`{=HCAc%h?wYXJPM@HNIpo!uqNlf_BM(+&q^URiR=dZ;`?Kpv?f0_Sh? z=AH!y?~`bUQc!=4GdsB*+JyDAJ1+^y4D<~fF*F92K_dUbMbur&6kP%DC#W#$a8{_r z$6ESeCXb*pr8HqJnXz^Gs+YMNN1h!pim_X@e+DGcbH6L8VPpNtkZ;NAZQ}p<`0i~3 zyU=yxOvJG7+Vapr}c{WepuM78$~KgZWOb z3Eg-#$CHCo635pkGw`-4bX-YDf2R0zoC=|o?I^&pXsB%G3Oiw!oZ)KHfLh}y#yARV zNDB&!_;^+2m63G%RUSIIe*ZH-F!vgFgWh$d{d8-}C5;|1gB-rO@@ zI^GgzM}hj9vy91PDT_W7d@JKzLlT9U&x;aEu5u!t;j>=}my*tx?%*lWq~PpkK!h|h zV)V4Pi+_9{x=8Xy`lBKmQs5aSqv4F_@y{c+E9MFc$^KUdl{7>;)jWaZn_bwazolpI zS=cNB?aUJ=(~K#_C*EFxQrl+f<@KUbdv)PkSHEY1nW|5^3Xcmv))aX)mMHSZa$0Aw zmbY_7EvzzHlPYCDb3Oa{zF~2RXc`q)ojc1;*$q*gHv3ktLaY$ITzS9?z#`<1{U>SJ z9NNzCFN3uq*mq<_T$mW?l6d>6s1~x8gFMeYxu)+H%C$5HcnOQO5ayjL!jSofL>dI3 ztIcO&Bzg90?d|?Z!D&QS@H1InZ*k*-1HW7abQWj2Dq5z)NumRUxRK4gqMBX^)OXHo z(b$lbELSwI0PR&Vl&gHcjpp`o>|TQ01yM&B0-3WJkHR09D@$*G7xz$q{r=GL7Gzu@ z2v>!uPKVi2@sG&+?B)9f!FQ&+9 zK~t%KH&e7l&cs1O7KCp69{`>}VZTSqMb9wA*{do>V^zd{AcPKeDMzV{17juiNEfW0 z8VU+z9U0S+X|iQz30cbBXwtt?mEGaU)|gaEh;#dg0H?!}*e!T@f8fn-Lc@Z^>csZ7 zJs#LiBPB$Xh)M(k$8ognBM`&P!pfoq_imadPwI=oWO1sA<#HhBiE5-AgGmPsIE)IK4J@(u zV;^VcR|s>T1MLReJgTft<|j4u_W8aG_8FBbhY{O%7dv|l&W0*#V4eYIX_`|fMWgju zWnWFx^NpB=blS85N5)ktp8wC!Cfv*=&&iUlyQx@Hx z`E#{H4M`uR_}{L?SduH)6K4NsnY z!iGvId01A!H35^lB|awsf^fJ_s^Fpwr?Se#NMlJi6m$R*J)2B?yf47<(VrL)~E z(>snF_6HXIU;tgpiNZt(GxP5-W!6{ESgZ$#1-b}*kM@PlxMy*;=HzTm(Lyhg@or1M zTB2PBDK@Ygx&?Rldu}%O=GS#dM;pXW>Bz8L*zrA12lK{yv$-dpobmLdPYv897l<84 zNgQ;~)zzBAZo|8Gx13#lOpJ5;x}h`QseDKrw&rCk;9?MBYd&ndmI ze6k|<1zmRZs{u-$(>YUyll~n)+grf)0oA`y09)J( z4`;qOxQ$Rts}D249vl!4fmQ_ZNf;1XsQ`SHZn#Q1gXMl`-l|u}3fO0d_&c`y4v~Z3{>Pph7o; zP8jGF&=4K;sr;yH&qHXRk=Q{9Xtdu_|3A(l9bGqrS2J_hCFyZqLZB6;$r<6ps=mrP zdr(BEELxRXr$7juP2z;UF1>;F!Rr`oi3m-OiUun1S#qFcVa6bR(j}GmpO;pLk_%8O zP}CAJBSZ)8r1qVCz5=m+4m4m4?{Ejmikq^7Kug#Zb5JeEmeEaC>^iQ;C^SppJTl)2cVAerJUB8kCgClk4-fkJx&uo9c8a5pBlsj$n+ zAqQiwOj$@7RD|NDwZTl)Bas>082X-NznHz7;ykD<5@(4cfyo#LZssk;1RJlV0U#_z!auOKcdDm0cu z@U?Qb$E-@q*&eNZ?m0Dd21Hn0>!_f(X>A>xMuc94sKPjnbe3G#F^-ehqPW~u?X}LqIZ?HK8M>a}gZEUFBpr8S;V*vn z8^Y>>|LlM1KhNp8u;1OINf)h`ON?xmq^4uhafALTL!obVZkQlFDqFo`Zdb*P}!|8$~h3y`Ku3?%35SEuq`m2Hcal?MI zrI(%v5JhKMW&hV|NHf;kEMw;SYc$MNNNu-_6EYsRUt+uU*e^)DH>cbs3I z5z~>C!1?)=G1B&%JC^H#u1oa&k#hga0IjRfKWCD}KJ7>`G08-ULJ0*G|K2qw)Xc&P z(Xqx(7`ia~Zgrg<`xqO0MdpEWV}pc%x*0o-{XuXxV(20@raw_USflzo1qu!ZIGZCn zpke0SRi9R+h?UtDl@OZQI@JWcfVxkV0Y#bSWvA~i6%gb5OY_0vw=e2cnYN9(K<&TM z)i5ONAoUjwZPzicSU;G&WAIV8{G>o4rnLaWi&XY`ylLBYh1- z1Yc_3sV}8UMr#QLHP9?0ihDankccBQ_Ak+;tWm+9D;iyn86(8tAF=&cad!huqs#dO zd#p8bN_PXe)TQwhYJKp>GUG6)%in{g=tY7pf!OuK3e?tPN$B);qKr+V%=*PO)@##i6>{>OD($8}uC^?R6s zb@Fxm@xS=*@cUl8$kyloA^+w7{ttP2J@D`!_)qzdfA|e77fL|MQyzQ&FYv$okAH`o zz}mU*a-A_nI zE^7cU42&!UIR)ND+L)*8z=~iBg39Ym6zjkIKqp453`p|g3%qjzNHyp{61k$*c%_qw zqFu|Wr6t06LPNpU-WKBqS~NXtXxqSe=5RhHHyFmyOlQdrqm47KjR4q}v!GP9m5AEs+}lf#ZA6psKLRfmJ29 z$kz5Yx=^G#6he>qH8yc?nl$gWal{DT1*UOEK%q@R8+?L`D{bgj9qPJGE;(YQ_f_h5HSrHz2rYi8qyey_*%o12_EbBT>v&3@Ygii61*Q`jVQ24xfAKg!@( z>3m+9vO?8$5(<3lFdf6(e2>9WkK3D@fJgT##$k-bqe|$XJ3;@sTkIc<>Dw;a2Bxzy znn*EMF{k@9doAO=5uIw0Xk&VvY88{QLk||wyE9r7SzJ3qZ~O{er z^KzrgtRn4luvUV$wJ?5>YkEpz0lv(%x{f$p%A&V|Z$(O${G(o<9&di2=a zKA^5^7EdoSIJ?TU98=B@8Em>`=+wHvwHH zQCd}9Vlzw2-@Uy>cLjFqnx%_(p@z#?2eX5H_I9>7asCYBI|sBruz2ze-Tpi(27J?S zFxjWqt(Y9_5Y{^k*3MGk2|Jr;VeACwAaLl^P=S1(C?bMFtB6Hof}tUcK}rN`l)|UM zZbMKCjYUU;)*^T+l29Cxh?&F(5pItbpg2AvA0j9?6q_LsKm__g^y2Q+np_cd$gk5; zMDB11owoXjqZnla2>>cj5h;a|?IF2TkV&CH)=8Lu-%u(Zd46)~BcTK(w-EUT(dnq< z{UmPBAmWjdWux=45}`Eq`e-2fBQa6S zYYtgsguLE>A{-qoWSfzO1n^r$E(JtHph9Bz$i*RKKgSp7pco|_IU_tc4`|s(j^Oh- zYyht$qKd-@O*ZZci;9p%EEiB@u_{W;@6fHMlnAoxu<_K{2c^?&?V_|8X90*>h{((SyGOKUHu(L*l1=mh&e_c!@*V7hQW-~655!Rt=! z@qvZ^j=SFQcE0_scQdOr)1!=bcQ6Z!yzFJGeBv+tH~jj9<2o++y{fWp z-2_UVf3Oz<-u4;XE1e0IaFzlPvNH&QgQ`48aX#Py0@S!{|F@axq@yMfuv&wMPML)u zEnEwuKq&*kAMz<0ACdszg26?782vCu0u62J(8-11P%7p@o;VQ{dD-C66aqc=q(_o~ zF+<0|La*dt=Qb;YC3f~BdlP740cDxH{WUeCS)C$J#wuKhNwo4Z0M#+`K+rmO?NXV^ z0wIZnSj%KIArP7G^;67l*3<;8k7AHUQMUrNS1~g`$e{D=z|gp+&0zBwL1_`J<6&2# zC<2X=AIhZXk@r85sEk~R^~9(Nt#m{z3alwW<>-Ynn!;v4zfvkYuG&DvN;gP}MUZ1M z9c$?nhF($7D+@x5l)AtN()^_mt~USEOiqIDAd#Jr+vAc5(YtC@)%o||m$*wt!A$sp}Cg6jT;w)67P3(b6$KIdwFi7%Vr}_jqXSG{jB3YbgDI&fEe%D6|Tc z{Vs#yJhSx!7FK)2exLoV9Xh1}1H;8R#>GCnds`H9hHj@w!fiW+K#A!uV0)X%!K6F$ z+_`=WzrV}Hi}x^VV1H-Kc&|s{Ew=1Kv;<$$DLeGan#tZi(~g0=PN1p|)6ovS`5~(( zSJ>OwMM)e?I}dH7P}$kHS#M*yin)7E;rj*@s7^tDI6&16%9LO`*eVMrlf4oBg$2+7 z3`sPd?Cw)_JLs|?lFNICwk6twE<2b$G#h&~8wboUEik@zmHx#`sKv7c?$BXMv%N#7 z+h@GK#f`6hjgx22W0qH;Zx}?28z0c`1-7nUVfXeO&OGn{sxs`|zKL(9STuz$utpQx zAP%S&qI?btzYZPozRAM8;n4L_hlVz^=ps^}uqx8+WT%K0$6*j&p$8O4+$2RV-wG?I z4Wva{D7Ae-R8Y7^Xse0N5YoEF%tgxGP4hAlQ9=X?Z45EyzeQpOo;z8SDC?pO3K2eh z#E5v89?fD~n&JyO@_7KP(mApxqKt|Vh=}SU%QzC5QYnRWWR%BqBn$MR69$fiHguGW zGzxXtsn!F?Hi=XuQB9m|H@RW}qHF`8q81TINmNb~k9OG$oncCWS11#S(GUZ98}o*u zFh?#dt%>3elak%wvnb~S1hOL$kj{ySU&W!6e*&=G_gMj$_zK=!?fr%nOLa+DHa zeUzvjkeaL%5*utW)}VEI7}D#5L=MT~l_syZmJ2*+NO8p6^u~*$&$l9wX_FmwDjqtX zjmfZoO^!C_NFo4v-Gz7N+5nOKUiFF~9YSTwG2O$)2?+8mqM`?kd{jh``6-k%$x&FV zCB`c6?wdpZp*H%OqZ1|M1W9hhOp%UjDL2dFjhv!MFXH|Alv5 zaX?_ZRYa{}cf$Bi4eTc9^<=yUz_q7t@Z*2!|KtjA>fzV&J#U6n7tito-*-Pup5$jf z_^bTnl`#q_EtC^+g2M2_4c91)^};LuTJhL1!J}9lhQO439wPMFbPdJPi9890P52M8c>!@O^F7U`q|q(F5c5<%d`O5%ZV z#DOu0V?!BAQ>MR%7?0YU9|CKISte10%zXirO50v&O|L5G7M70HMDMAmGl(%qL9IPx zQTZ5iJkSfIJ;kC*hyp0KIkpy5WHcEOVoa|OF3`-{BvyKV#2is5w8|3-LIl!%jdxkt z0-a&Q+G0`!%cA7?pfp8UrR^Fu4sR+p4jSI|zEAM|S z6+IbaI%Q&4-Mn#~c06OQH)L;T4;3|w^J|PpfrITDyaiK2r$^m{#Br*WqM43~WkCxB z1*%(NyCt)BN=|PX{G?@eFa;m!&-IwNF?JX!S4zx$L1$%Ngkr;FGUfKwYj_ta`*YO$ zBWOK3lA!S3HEDf=kExSn63$zX37LgMr;m%Ex;^N2SXy0XuGgpV9y=W|y>SE6o1=T; zETlnf#B}@2FD}xnI*d2Bxbda0u<^`gdi^>2iziY?(dAPoQa8%0U;PqZMfwYKbO*f@ zHHPr!pAI|!{JYT;y=K(}A8c6y1^=T=xdvB2FIPIKw}30CHM zR65cv4BgVwuL}B|lFC|2lizFRkdc!GCZ$b&@1Xz)PTVLW3Q4SuBcUaNmpC$rUXBD3we9Rw_s{33x%%KM`P56u>nQ(^EZga$&lmns0<6owL!Lr< zPJ98R8^|u!!x$Fwca4fxmVCr9Lgqz~?TSb9m-%K9?(lhme3J$K!zmoCH~DG!^qeS@ zKbo8{%X~n258gqDXcy9?(&L~)7S5E!#brV`QA+rthIhh|i+9!w6*dU9|4yPQa^DRW5&&AC6vRI{&Z%v8Gl5q!0)>COT z7NW_ACuH7M2Ci!)0-qj7mZ_AId8H}M3m3ABRrp-4jWjM&rzm5{^YJRj>Rp~^zE~(1 z80TJOm-Z|RF(>8&&Cf(L`%VgRzo&M(SEY0V*j_bIN>$rXoJFu2t^IG2c&Tm5B z`BnbT`&wS{#_#1jf8<9v|I=S$Je}erlnZzB$Nu=g!;4;fj(YPd&p+`6UiY>ihPchA zKlbzdgD*eMVHI=SngM8j-+%wt_?G|pevXa5mD_nAM#Uwq{m zUhy6OAs_kGv%GNywm$mneC$0x%Y`5P9zgM(f8sCjvhV%l?0w;{@hAVYPx7J9Jjct< z-NWmD=s)AHzUnF;{pJ6gfA?!&gBp(OxV(zY@F*-HLL0yuEi4Fy$RLMTUR40270T+& zUpWK;dtB5wG`076KxA|Vj>eGYX(gi3qQFCgM+J`xGC(RcWz-lYU5%m#6k1ud4rt{? zoQUY?QPHEkqdJ7D8q{H|Mge4QM9AA!yOzcQne!r@_n_2~jxA8C!@*RsIcbLvzNAMvW#!t$kOaesH)I8Ea-Ns!^oz}qc6x{ za$!j&_J3em&C0Y6qU(WwI{O~Z3KtH6VrMt(f}z#;R6H(gm@SgjCgcq@ygM7 zO`8NQlJMg_X?X_H{+*0!ViWMu(CzfuxVgc5fAy1`_@Nc^Es+oK7dwfiojR)-YhdDO-ZU;EONoIiUOXsL{6f3!!hJI~JU9;=J}bk5Eu zGv><<V=NKQ1=;7&v8fP`F2CEEC8Ky4K>kZgDIG`ws~-lCmhtu`)nbpb+#?=ru+m#*b}(Y!eSPu)+fh^tbI=&#L5-SI z3{EVu9WJxCzR$%6A7-=Jp*|Qx<%te(j&fnhsBKxlv(1I!d75U*Xm>O9&F8Li>b|?NR--$XsD1v-YN4Kt=*|xa!86($fo|z3 zP0{TWLypJl1Ua5!3P;`U)68;Ih^fbg=NO(pO}Vg4(@gNCp;+kA)-x=cJ}|mRspX(n1a^Xd`XiAx52ChBI1Xo1@={0)7^5z0ciSv&x=f&m2b3 zr^<)}VvL$rL`cB2)-GJa~)}$EY}fjw&3viHNjq#M&&xi+GC&XQa3Ie7_N(33S+#>wJ!`J8i zt0F2*@>;3v)biK>(IAlZ!w9Fi^MF7uErO9$&SWca9u@L=qrD=^Hm4aYEw9u0-_a3e zUMK@f$>Ra=C_{D>X%B?~6SK3(`@H!eu=2zBU_L%Unr(!D3Pu`x7}+nfK2d=PV`Oi) zh=t_Wqd?&0F?EzZ62>%280I1j1x1wkIc+d1;FU#bj{+bIT2Wq)3KHX$uAk{YC5$RS zd2xRQKp(oiTIpaMRm3Nzlt(Iywuqoh1Y>01A4TbpCIvv&NON$8}u4cO6(IuY2`t`Id(?(;Z7O zo>7GmN_sQSj!=ITjS87P0-HPR< z6D%$+&~@+Tzx)$F%3t|^-o>4;#7kcBM*gk;@PFWc_>K-1IIiPrV_@nWwQrN~H1mO3 z)6zQ9fWJ+!PyvdK}Fu+g|+nEA*w!nCcK z%q9@Ch*K#=Xg!T9Sl^v7@rw4a<-B7wsR_z}g*LR=r9|F0Ubs>^ftMB02MkGgN%tG? zsav1eJ4V5r1r2Sb~EpXqM_ig&2ja-@bX=;PRhmfZHQcv^_t6)$S^ve3Wb81(uK`+Yh^fzb+|_Cu4mSq6%Sza4{f} zo$R{PCWEV`O}(_w7lF}>pan4rZU#-hLah@pThX?eQx%m-1CnmH%j)t;Zr|A9-S7GU z3(IF&JaLKJ>jy;Fve+q6t*6@?a4>C|wUN;@(a4h{XyP1KpS#9rX9Tunacz~#1jhS2 zZ0~Hc_4P>^WZ+mZIygY7$lPF_LDl8NaDetT_$Hkv3WK&4yQ6777X#R$#QBi;X~DNt zg{9x^VL~L%X3TXg-2x5{_5g)%X4tg95a6_;voN1Ttms>OQ|EzG>rr*YD$DYjlc-+B z%)10p_rThT6VTLbZ>(c0OV!aV4J~U+gXD6m$`bEd?rdzLi$1f1hRNPIyB0eors{Cw z#2Kz#zDl?3Qtuv6Vo^<2nRQtbRl)B19tWFyl)X6ygZU)F)o#YQ7vIH+m)t|SJjZx6 z!Uaw39I7lBo;Z=f%)@?{gZ0~~@q#W4(P(_r(u~J>U(NMEX-sEGXRt&wYlzZStuUZ< zNML-^E%Bj&EW9L_+4$yFww`$kQ}wgc6EKU5^iQ6^YpCYBoIJHk9Pg)C;b?1z-f)PC zk?ydIcQwtyh`Cdzm|tFEusBbr*T+h9+l3a7qv{nDR*R_NFh)S`rN#=BzKEU*DDk-I zgx&3J>Uu`iEislfPjaWT>^jtjAQ5aSX=(v3fDZ~UtRR38Lz+ayAvlkMv>vw1(eRj= zLBjuWM2=P5*qv46==g^Gn0%)Z6j_kL90B1uT2FKqwSp##P)32# zM9H#*%Y_REOOx zo%}ZPaz7&Pr6WgPP`N>l{1$7SM1n(<=p=YyaAhYS84cicy5IVc#Nej!G);DHMX$yA zm(SPZIaRRSgXQ8qZ{WUt_~55+0c*VZO+UaNxp$tW#fSKoSAP$$|CSd~sQ@(m?0@m+c;jnc z!z;i2f9K;*&7drJL76TzyWIT5|G=+Zah$(+H{bOg=Wtg)#bplK;|7yQfK0rjC8EVa7F|mq=D4J|3yifWV^Yk^ zhZd_9MnJ2L^Gs$9!FwvBSm;(%8oYPuIlggdod;yDX;A@TQf0T7(V!tcSLs8DeiEKy z%p%eu&^Bf^jY<40hz?z3XCG{pZR`|xn38aTqzL)BAj@%iWFKRpfN`(mCb@?>ss2jp;S7}*J{$f zaWUdlAQ}zEX3;CeJm51C2~waSM+Hshe5DHH*89e!*L2D%#|tHXVgwv)(s~$XO~bTq zl3=sAxWdyoak{rTVED5^Dw4~pJ{S`vLQ8kR&D{}pah|d&xqa;#^TR&Yn&f0NwxVM@m|!Vv z5AVSg9bA(mM!_}gtZ(4znr>Al$6&WCam|FX&}kcHF)DNHB`v%vnwHfC|2 zYHfwtXrC6(@ccRYb4!f257>GBI)2j7?2VIyF1jY4J4&1!_*m;A!Eq=!gU1?`gwmq0SZfcv86sjpj?Z~C0Ygkvp$&z}KzAeE6;a4*#4$vW z>4kz&kc%HV@(p;>W7$0wli2FL2X^bgQD2YSIEGp#f%2VTTE>Ag5=ukd4 z%!osV93wQAqmG#n4lk}{XQ9ys&~iNek(jHXK~ZZ(Z6Zy~ zSc0^lkT@;E0!48oRw_U+2pkExTEme*N-hzI z{v}@Yx*y?hfBGHV8Ea0STH^6fK0)jnphS(wZ0zjNE;;nD1FBD?Nn#gGV zI{(ejeUb0{i?0CSv5$U~Uw%I@C@HHBp!xIv_J6|neea(__Z8Qk+vky&KFs1=;Mr$) zx#!_E7(K;@f9VUjz;PWHLZlF06a*|mI1)icJV;kT4N;?`I%=a%b^-Yq@^d4^D6eq= z1STAT5c2>^1IEX^%)$~-X!#+mLSz;q778CH5U zD5LQ@31Kbw zw>AVC4>4vzsz`9<7k0Q(A-l1(bWPK!bPPcemX z^gsET$5>fe?}0T=o;%0svp3ni zy^VU>vUc(eYH1!eM=UHZu``=cPii{dF3qT+^(}UBj-e}g^2ujdTwG>;FkowMmR)fK zbj*<(Rg_HYmR^~K+v&kRU9Fi+MwB`*UuwEVNmP-t+rdP|?#2#hAG(l_wJnn18eNU* z6@--`H$VF&?zwm`3o9qMas3XR#ge9R7|4Kmt7&I7!D&oY;iAjJwXY$zbO#-pv18m! z5-W-r=yV2*r=DuJVZ7f`o-u%D<=h%qp4~*D36nMnwQ2^1Dw&OESW_ofm7&aTKNVAa zbbo(Be|42fQ!{KEbhXIp`E%@EejYbf6vKJiy$Qu|NC-{pMrd8Y?~RB>j^Y(ng(?b^ zDQUNN86O-lIK7JLS={ap&Gs(E>Ks01fg#$0{qdM?ieF`SVC(i-Tv%Z9+EosAe{;V+ zgjI&o<}PKoqJQc%&F&8S2m7hZeqc7R`Q* z0m`Dn6O!mgh?oq+OM*rWPMkDIWJ^(Mn*_Kvsth@|I>!l1BTh+!SK`c2hBmsx_X1Ii z3pVqalqQLLo+#q6lDHt!Btb-`2s-^;#9wRCxnp9EiJ_2^=(o*cIpRnPcEAcBME2!JK;Vfo&QM2-p(jH0|=fja8iceuzyH&n>qO-g0v6XdRnilcQC z0ZNIW_YI2^ro)P~=9niMB`G|U z{)T|k0aOHo5;%T91T5K)$Z`SU0BQl1Bd~nbZ?pa(;6)J3B9=kEqGY~VFpFtk;=EF% ziYiZvyxgcg9CGyyMq1m0Id(@KA2on9Byl3D0>WtX1Tk@i zBVjSdEZz$HP04-$1rdTW%$-?FF48y|bFh)$vpS1F`CLMY5E#;gh7ejX7E_SdTL}Y8 z1Va(NL`*$=Oy;BWdr2hp+G?J8ioIDW3k@-9_~VTT*q}> z$8{`Von*z_M|kFGKJvl;oxk(H{T)7e8~8O?ICX~adD)PA_ik|WtDdXZuX6j=FY}lG z>YF(KZ@iwl`%ZJ;!H@Dof27A>|I6Ra#glXNZOg5vKF%-v^k*nfK0>Fz&&~Y_1<sj~BiA<(ybsq-||;JJ;HNb#{~++!k_)}t+Z{{ zD7jiEoRR1;3Mw=BB$zb5P3u1OF~uTVvD2#%6PwAXn4Ay`-9Gc3 zd7M-1jBEC4N7?D2YzOBe({W9qpjVYg5jdA&@O9e~(a9+lf=k<2R0dP&v=7?G(KJmG zvbw1|Uj`_*UiKFXo4Opj1ondsGFLiqs56b%K+i7LiG#u+>jVcM!VZ|R?lGP3h=)< z?+VxLv%kK_!s;o&)9IF|P&3}%U}4t{y3fYLHX3ta&!Lx-?7Xu%yV#kLjUxH za!xZmzeII%j^^fs{p}sPv0!nv&vdfS{Ms_pnWLyI^+d6`vCr_-AOY{6|MK&ccdv5S zgZJT$L%AucTT%|Yw9N$5TIN@KtY5vx;__)KJ7Bzio5GOxry2IK%PR;3hNwv$6w7Xp za%rC3{e67hU}hdOHv|Gzzhp4qV|r&7Uq?FC0ArwTT28F3vbny_%`bh0Q!jm#?!q$T zopp+`L-+JqI^zk`%^eQ*Cy7s1=>@hn*BJ~45CW6g4!yY!LD!g-dC+@Iwg;qso z*#(aiUR`V>F#u>x5{4tD0BsCDIkz+}=Gc%eMUai+wvf-7Xbhy7u{%8H2}pb_V3bA$ zWYC?v7+R$c9W9`Vh-i!mA-u3u1TBN;UU3xVll72zp~8unqeQ3^fg9xc*@X(4qYC`C z73C%zEko{SPLX-R@?{dIjrTb^ZzS5;dWn;U9Ff-^ZF6VH;A3V|`usfzkZ)AJ6`;Lu zod`V!j3Oc|C!{nYv<1-!4M9bs00xg@ejF9DFA%{>XVEo?7^Fasb>y%FV1E>$M9KgV zln8-QLCleFl2GKp2av`tgdDq%Dzmw?(gZ|=6U9u&C}*oiMUQj!3(u2~=SR#O&!7Mz z1QDf(1RZfvWp?25B5GJ+Cu6326ZtN+1eHPX@*0FykG4tT(gUUju*9sN$b}0=}Ixds;NnZcp^40?=az&Ix2+Q>E-;;G*$8}uCbu3_A z<5zy-NBPyCjM=&#$+i2-{0Be$EBqxTZIKUM6oC)@Pk)Su{?~j}D>#S$(x2y>-~XSn z`p|>iyT8xVPd~*SpIs&Y$$u(Wl>naoTl^c}{&!H2T?>Elhxp(BT^ZENg0DaEcX|6G ze-9r;(B#ozr)Z{^4TBjm?ct{A*@al6EeU$Vxt&wQEv{SlGlI<8zAg9-*f1gy-z zQpC(&kX(vFVN`bBI0ZT?a1pVhOXnh;T|inRR~dy>kK7;-nT zO5%FkFR1%Tu*(?cN#+WQz2?I-~s2$SvF9Pb2;SmuCIvl#AK*YkBTfawzIKw=R z4{*5uIc$Az(!P&)0lc~p1Wc?^hk*}`mLJDjvpPx%wU(%!@UwJn=pBJ*- zXv7T=QwP6ZmECJi)22>w5kOpAP2FOOGRIeDt6$~({g+rfvC6e)Z_4|l zK&z6C_1mnhE@E|q?L@kj!n%gl#W~c|*NL`Bfbzm-CeE~JlW1t$K&4wMW%Id=PCO;s zX^A0bV0&RR$lgMX4mX>jyDb_6+JJMY*%%bm{R%Y&YoKHDK7^J|#}NFC=x6l0hV`vY z?zyUZ1jh(862=gM$9qMf^^~ zY+S>B%VhHaQ#hLa9lHGmE?zp%6JNQR=5?t#nPR@@@4t)2Pnga2>6~03Mvp2h^k9J7 z_lfn@S(>NQwd~)#!NU9r`nF3uIiS>;4`wUkG#ImGXUEyGQo89dLI;u$XN8BNWE#*C*#S3Xx zAyD-|2${u$Du_xk88t)`a4}}4U;u|Xj0^?H3^+J~R)a)+k;s)tanxi&8H<$&_+i|P z{5eA;-`9xvB=;2(e+obpPL@7m8U_CX4pbJA@^cZlRu-?k#KMJVWHn0u4k9!Nvq&Ko z6<{F-A|w&tIXH?S0^&x3Ku|fR9go~nppKS-xWc+_DsaLBomNFqdW z^@<-E5xTN|8IJ_cBNb5241H>tp`Cua0@q1Um zIBwzVJCn``e?tf#0s=IY%We z_Wkd){{C4$|M_S6#yYO!GCIS;>$(w663JcU(731wB!MY2gb1{R97S*;b3;r)&<^Bh zBf>Qy1`x5NDhw9T*;9|z7OM>=M$BP1AV3@hnb#nEBo*+Go>!PMEtBXEyYpD3vg^P= zz|jH?&<0E6;vo~J4HA?r44`Ri$8xX7LVw8i!Gt?|Q^t)a=mK3DM)icP{VAA&s_N3z zGrU(2RpxJmkOr2~J8+IdXD&?NcEAVfSxe*c;Gtg@%=Ih!{SLFq1RoqBI z&+_mC5AfwLjo9C5*xns6JhjBh3v2jw57U-AS8lSha+2$@PFysjETcBkpyPiJnPo6kH$C=81iF43tfLVG}LCwK+68WMa%H5@V< zO$aU!TF3709=)pK?Af!}YQ(|rHj`(cp@04y<=g_(t##_@6x&Skvl+UaXZiFw{A|ST zom+UVVLYbl^%(8fbgP20KVbgCB}V2J?e;c!Fsh_X;+2v3RmkiiB8AO>c}I@&I+Y>M zje}XxvL&rw|L%`^ORiN_+Wtx|b0jr@<`iQ$Hcp{115dg^XGcS>1 zWkDe#kqT%5Y5PcyT!$#!z9C{X+(w{j~2mOKx%h%F)>DJ$QTDc{62 z5g###+gAe+WPL1Agf}I^XY`(sBBC+_iO3rxtj(DBrzeR(ndOkgisMSD%zpzd-(f)nK_#ND z%IhJ1xS(X6Km+Kbw(Afv5h7YZsgW3@bCq~?Ak8zw zvz5UbgNYzNj1RjRT7?KBpbUV*InOK!SOFcih+8?{VukIXRYb?ko+{*uWFes9+Skm` z)Ire((rxWM0dX|NnA}dwor=}PMZ9Yw+@@b^GVIm`v~+Oe5X>7<$t7k{>L?yGYio3b2uXyj(*6!< zzx&n$5F<2gL#Qk+Wbv!hDUu`1m=4=JcewlEd%3-Slde&mKYfaw{VDy0in--Ew9$#D zrrekd7tiwS%_lL%d;+PL4=gc%@eG^K-^A#W?a_p-y?tKvqWiHug^v?Dx@Nww*qhb# zI~DtFj$GLyyYt#M(6%kUv?w5`NNGs!x4LO*0IWb$zsDo)y0n&rMO{|Re2wiG>Vp~4 zYO3X$7+VV6fuf6AT106}IM`=kBMeIRclH?eSMjkI}gPS#UOhq%D zKpSaWMYC2-JWM>( z?E~7nWvRbJQ#*n_z|0RYg8^z`k+Pa&p>Ak)*72i#&>G)HtnConS?0}DB?ou5P+Dan zRt4%=9`Nt(?n6;hPg)Lc-JA?(BNV{894$QYe9-%jZRgh$~?>Ap__XY0I!^r9%d38;;mV zN(uYW%V!p{?m=8h01;)xajtcafk}KzzEgfn+&vO8-hhZtRu`G!7s8QPL=*_OKNPTB z`s~gEgY#LaFRSrPKwkjkHb#vL@iXO2^L=DU6lu}OzWCa8m z6cl)E@WD~LHj6XjkSesv+tGNmEkLOp5%eMPi8|eiUbmY%#QD|{P&BO<$g6=!W@i;; zh9#E;+L|1-i%J9b=~4%#HHSl#4^kH+BRQG`_=#vcu&Z2(kEvBjpXaXwH;cSc1dRay_7MK0M| z-?kV-dR>~obYqNxwC}Yoa+H<4|4XeY6&M?t)H9q?EcE9%*c-Ea;tZ-|X^WZ{z3!!a z<^#XM&dxq3%D|wqEX)ts-k)Ksd1_-hdEecsBi-ipbtWE0ZNO9o#zLE17lD2!vblGF z#uHtn>h@_=M7b6l9mITG%A&+2!H~ocJJ{b~*zKfq!)eX1Kj2`pnRs2J)^V`0Np)fw zU3Sr`1F>Ov@ zemo_rf^uPr{``=#=up`)w$0+novktE%X=O4P4_2)+1Sl?rzU*ban z5qiTev{PCFipb{90jG;)_HJHd@$`MDl>xKq9-WR&$H_#Ea~@Nc^yU_5_jW0|U8=<; zrt3F|vnBzTP0vu64lY_$)g_t=Z7LQn-Nm?D(9TALCa}G^&ElywN?qYb2k5HLV0DS- zFF(cdV2Opb6=G@9a&~riSiAdvE}dHC%Hy9W76tPzV9GM_wz}N`YF4xHl`qq5?a^O6 zMW|}r{w~^9tS+vgf@gel8}<$;=lgW$mnhF(py+H-uir^RdiGxwC?X;)i9skw2(^aB zH$)|Zk9-!o=(2$C0w9p}kVSE0vXj!Nh*se+QXGlGNzy2QG}u3aJ*%LOB7cC>2tYcZ zl{`nDhmKi1I^+W72we;TLw368sKs@Ih%gEXG!jMdIVy=#BNK*f{K@O%0|J^y1bBxR zmQ>q-a}w3U96C6ogJ5#p{g6`>qd19?d8xcx$;%R`dlpB0O9TR-M9_o$e4_$Kd?Wd8 zB*XAs5Vlx|DDwT_6;4EX6~Sn*g~rmzd(wvO+u(9R(~d@qI)Di-*fcA#N!Nq9fv0P=q$CE8?M* z=jIakFW?~}^OWV1|E&$eg5t0tfH)H~Oy3)n&g+|FoCbv#j+#2;M1^!dir5L#tU$I& zX}m-!qX82&1>i?B+JnFtGJ7uMi$-2tU0H1MXj6bV)3lK;ls<~Mq_XfO_p_-@n%P7J zUZ?x%Z=OTvqS5lZN_db##AYv$e*!X306D)w&b^}viG#MD-*t$4a1(A`y-l%pp0&Q^ zr~(I@>uk*oCr|d+xwD1ouX17@?%cS|#?C134>W^?RnA^GNkuN-j<|XGCI_<_O#p(! zcIP>D@otto0Flk>&vIj94;L+SE2p{p{3@CkRtytvUcSN3!I(B^I&&+WJAax%!C}pI zZgKhgoz&I3J6PoW-Io|zj;h(`xo0o4J$4LFoZtynp6ma`{@0JH~NT;CY8eEJk~oq`vZXZ`9G+U^NXuMSYi{Ps7vz2jIudzztv z(e^E_UAx7Mf?lVB;8JQMm?8JvbDlxBfaux0d6ljGF?H>U1fuP-ytGQ!?J%;-TsXam zB9|L&bM@99^J`~Vo+|;Ux9@Oc-*fuxNjjo5L^tF1jhp!XY0j>6cwt3G+qc;~P^_Ih zNj2N$=Iz_*H&;M2SUSOl^Cu~Q@%nXc&kD|+S*0|ZT%O6!I#+M)(z-@2ZblZ?&T{VT z3I(~wTkCAjDo&nWp(_tYKjG$;o9s^})Sm22tp=RAaDi^U$(7rCxWjqE;_35TSnINR z^A_vdqkIvi=&^eG9H*AL0J!lcS8i-D8qdH~ES@;cnUf0`BBPxx_9w7<=4ice2i&-Q zKzDA5rMV6Oak|arn+GhNJIj1&$Q7vf?{N9XHnUlSD!QzkI>+hdK4G-QwLAOid|eur zAXRVO;_9~J^tsdYI|ewa{oB_$FpHd7?Q>Xu#N}t6W&I$seC94LoSMV(JCvVr?V0CT zA2kft&U5eC6*Rf(o$EaP{4E+gm zG%8x!0J9iS;?NSe5H2w>f>`vk$YX34F?4{FgCWaBh4!#>FlG0^Q@0)po50t*lRXY* zQwIG$S_PUWM_y16eK>SGnFz+_*ad_fcMP5&P6%xb-A=uh-90d7b1}3l-UVZw`iqB-12w_+FG1&NNi~nY`$re@Q|JZptTma0U(jP zATA3XB|ZW~I2xRWkmjQx!<<8)vL->gqpOnuG&ksD0K@@B)M!)S0$GfTF#+|x%1%AV z5L=T(5tHVTHxjHZ(~lzONg`kCgl&VuC=sv7?gJIGn5mUc`?jugL`WCec_Ez$B|3pP z4sy3Kf=^B&r9q4MXG}rc_(OPeo%WxiX9{qhDygT6s@q|Ecb7*WJjdRhYwRBErETmE zJ1i_Lu&}ty<>#(2w|o{GRa%##TT;vq*uH+9)wNZ6g8{C+PFZ${(NR=7#qjjVr*j}E zmDpP12Ps{>|jpzQS+PeuuXZ@WX5PLzbn z9hzoJuaH4-a17@9bbCEUdlS^%LyEx;s!*tA#x#tvCszo?I0+u3y5;2Z8snYoEY1%I z?UcRkeMaMbhJzI*+dCLlqA01S4KzBrj<&XTnD2LKwpzl$h(OEIi6xwk>`ZD_R+rh` zn=oHkjE+p|5jym+y#bxxJhOut`}&w!e?Dfljx>$wwY$`?>4f zzIKPn)vH`Qdyd}HBC2i}*JFHWXr}uV({U0vb$@|wr$cq}1bRH89Zw0fKxmr$xuZ>v z&bB#XWsF3Qq#K*WzLP-VF=&&!q>76Y6SE`67Ao`hbQVCQLmeU*zW^?d60rgB;)2S0 zS?(eVBJ5~@C{9+Lmm87!Aki(3m^?;_*sTaEKUcm(h;5E|9SKPhWVz{IDuUL8D2+ap zJ`^-WILk4zEL`P?S6&%3RzB;Zh&chJqX;8P)?Wk=fS|}eUJ>X~j`n*C>v#{Q2c%J#|#_T@#5>3peiwaHV7(ktjmuQG72D0rKneMji_I zN6azl_UJ+uT+oN9LFGm4&;k#SFW{bu2qIk~k#!;-Z99iTnlP90yzoc7FWC+eVSuRM z@FtQ^O#sQ}MPYNIlyvkB6uO{kMVLhiH%>Tt$T3mios-`=(hLC+cfBG8@?bUzzFCO% z!Qo?k!Fwkl`&~r6D1Sd<9|feSBt z9j|@eD>>EG)ceoyv;W}dIjH7YTCDJs8J!dN@P<=&vl#bz=5z1oeV=}Uecz*_XN=+k z55MA@cJoH z-{HQOzUffFs&9UU_x;ST@U&mz)Jl(7Pic#bEUukmzSr{9=RU@JKJYnaro`fy1;fLy zdk1fL)gvqyk(o3tdYnFR*-SEeTlBjrsU5{v@ARcbr;YK{LaZ%e>^}uVdlHhj`Z$eSY9ae}D%U z3t+<6KKgUK`{{~r`@SC#0juSUAN)mr{tJ7&^GAP_SDu?gC-Gs25B}ue<<`kJ@W=ni z+gVf`R+y~w*U+8Q>0jn& zo?PVL_&2|w6Fp6;IO5tDeuW=<|8-8BTBD~O2M3Y+Ui~Ic9tl{?W>XHvfmI)&Pyo34 zD!=qoKg}K2V|k?qvl_d2fj2EK!B^hJkALVECr_WCtMWV_eABmcZa(sncl|VC zt4JMujracIm$~@rxAM)eI0wM>PrZj9f6r4q`1}7fKk(>Di~^`x|H}LM2k(B4)zhm` zPtcuJUia;}5?5#qdrE+`?l}oRhL#Vd_#p1U;fyy^MOx2pV0PrZ-#{KnS^2AY}q`ab(U-u&uwSdJX)2crYxTsV#p9@laGUMZtZf{iu_+Uk=) z60`*nmW9R%n?u@u3+`2{{n9DQ1IA_!lu}}ISCObmWvszSd-j-O9mpiW_>8E*1!zN{ zl^@J1u`_hK4<3c4PHrC!F~d-;R^lSCC}L(xgd7=>hysOHgr;V`C^$1W&tg%sKXvSl zTV{2jEUV;1*_+Imv<^yxDzprSpiH7ni_ZPyi3F;$Kxv%-;nt`$x!~|3{B%220*Mzo zLhwWdle$J*lLVaUbVfu|looAcicqN(8H$;Ggvv~!;M2A>ZIj#`M4jSdN|_{HiLfS- zs@!cZ3hXz>V=P)}G>{LeMw=|WMek6i$nEs&I*X9jQnCu`fQuxpS*r-kdVOw94&gF4Ju8^T7T0bL-C2v{O%XKE)PS z&Yz}t>J(2u{v`G8E+x+z0M8xn;E0ogifzd zr_f2jEo~3gIB_B7I8Ol#dwq;9*&ny8tS+&;x6Z++#;FQ588bIOha=ML?@=wxfdbtz zN$hIwY!W9EbhqNfnN{@uCaUAHI?^9>XnQl(_YRm}TE@3KwBqvF+}xvB8Zew2aIiOH zelXAO)&!%f)Lqi5f|Zp;dS!?8TT|vP4d^d+6Jx8tP_kb~eCo=0la;koUA!OeCDL>)MP?lgNh*V$X&X5rLH+Io+%pV6P|@xbdJ<=M|Y&W&fj#_HNB z7M2##`y&oUW0sbOEX*&mcY6ahH^<`H720N>@%{$Y@;R0se2`-01iQ~)W`FB8>(4(+ ze|d%B+A>u+WU;e^Ml;#pXSTkLT3$vkF3~x$M(I71>oFk@gv^`A}YN$#4Pj$ zpem1=Oh6XsgAA~v4BkTki0D8T6i@aG`d_*IxJrqtFT396l zS(+4JMA(Z0zYmxY$vHNk9R0JXjN2+NfA!-rW$u2oGqSOJP$d8kRN}{H~U*mU;M* z75>quKh4#*Ji?_OskW{?!)QzlR@s&BH94 zExz=r5Ae&s_K#7+AK}|yevXn{J~YfskJrBQ_wlNgl53y+5Wnz|U*p54?&UjA-{cp5 z?pL_ndokbpgRkellO3)-{#kzI7e2^OwH5uT<$M$&9xBh-!cUO-qpZ`3& zw#y@L`$1lzT5dk~F@E_&S9$aA`ynnB3fmcSSYbjlv%Kha-^yEGcac~-qAppO>$CUe zckz=y`x#bW_RW0Hn_tSj8uP>_-otx;Kf@1w(S|;PJ;Vvp*g3 z%vZk1Ywv#pC+>cf?_Rqf#Rk9f^Y6l)c_r_7%_9^T7Up|E7E0?;pnvua{NOuZN=JJ_ z)btk?ap!8zJn;+s`bQq)uJ3sn&E?PX!N)ha_@>{_eP?>I3%?AK@>eGw7x^$6EJ#~a@Iy}atY;_(l? zn_qa(uds6QM_AAfJ9DVWQN>7IPZ*v&!`pu72RWw$jgNGCJ-Qs0aQ*=FPnGjgJy`p5s@3 z>SuY^hfi|%55AJ<8;Z_dyz>u!H}h_bPkrDY^P%_r8fWhQ!vs|`Rf@o2NxY>+9p;5M z`1E6!Y5WdPeCn$lJamGEN<;MN;_&?Pi};~G_IB8Kjt~Co&-0#N{V*s0#P{>MM^Ew- zpZFACedsP;d2Yb&S3k~2E(c!v-7n|Fyd_oi+E6-?#y>`w&VphdG-VR{CmE_i@);^@|K5(eDz&_@9XRG z5ngiP&0PKXuknS=HU7}oMY^T^FY?nr{Xu^1lWY93?|2E@m%qxpf9XAZKgnGkLoOvwZT_W~=3hu1*Kr+J)RBfj zlb8q*hmx2_wxc)R3lLQ2XklVK5b&}kj3y&kSI5f|5dkFY z>?}wCbS+n#L1LQ$A3Yd_Co-8$(=yOm)GDk1^C3r(luC~Y<3+kQAQ{VMpIBG>)0~M95tpk8nB?fz%N4eQm(#qlk+sOuC;y^@UCDuDWSbj8U09BU{*XT#4d( zQ!0yi3gRLE#!!?cDnXPRlvQco+GxsdhuwpHCe4glJ;5l?%KQ-HJ-4r4C%Tro{sOkG z7~R<;V(1UMR8?SQzJuG|q=TlnFvmetGn`-IVEuqlYs}mtt}NNA$COJ$&aBNrJAshJ zQtboY)hRC4wr$$?p><5B6DG3}Yio-M$R0vOm4VJ&$-?piILD}-()d7d2GBIqJ+KZs z77C39CGZ^-g82-i2e1&N&SU7(s zN0{q|FqsnDDKs-^YA~9BPCq)^@dVvQ+PyJtBYYT}JKyO>K`2nF%-(}A1LK)a#{^x0 z?y`9H9P?`{T>08ljCb}i{SHfK)~MSVzS7+F$i3LguyN})+js6THyqHjHVKNW=g-rf zAF}<-v(&e@==PVP?6dX!6%MZ7WH{gF+&$-6yL5(?`|bj(xc2LI@f0Z~qqZg4Ph`4eDK#v4csVLp-g1C@kdQOw>$8^7Sk+ucbDq5d~ zNaqwj=`euxm%p_3|=49Jmn6k!JMT@t>X%j*||#Or)G z>~N^lHd|s^ZcD^x?o{jXE;FfuN47aTMwOTErs(B+%IED)4pT?t+vKdB&e}9EnKiAz z^xMoMisVkYUSRH7h|4kaHY6UJb9o(_B*Y?OgaXu|YZX8%C6Rg~0tSRb;m;7$q*2zQ z3X3jFbf-X<1*Rxc6knSnJ8{XS04EZLFu@Bo5iOi@k&G*qCB28PIWW^ zh)8!>N~XhTATOw>$fdsFC02=3Pl-4PN=suIrO7g+#57ezW!Xnu(H^5?j>wvbDk7=? zQ)slw=aE(F1>Z^5$ajcUl!@b+U2bjD9yOY2LOPdcjiYI$bD#*PQGn^hAPzLL>s*}Z z&LxgvzDU%z@*U}DU2f9Rgpd&mLD7W#yKL43n)E(01Tr3>@ruUf$pr{e<-Y}umsp|? zK8s^2;(;K4^GQIn={3KrrAtmf`b`YOEk5zsI;p}QS1x~*dj1kGy}zH`pCLP)u*|Xx zyu85D(kja*mZ{1PtEWz|vbxH`u!EGiS1VQ*POvzbV`+Jb<;4NUO!(L*zDn=nYxtq> ze=`?W7g$(1!)w3ehxnF<=Xw5fA7wv7Rg=s3#IVc!nfrLzi(ZP|*kyYw3!G;868&3` z^XV@?Jp4sh}6@8Xgms#reSULR&uQ;`c+dW8p zT?&mY2CU7`v9xxH*L=$>@$H1$BcIuoXkJhT5H~Ksv;906Bu&E z;JNkeQYQlXl{buf4?y+*|WxVm_C)vC86t^5~UA+P)?&c+rJV>{# zX~`8_heu!YX1?q74>31bzkYN{9WhsnChe%mg>Ar#t*f$DoG(JGvwn^Nm zLtqv>t#{&cr=c> zKA27jf5jza#=a|?nLRnzC^Hk*yv#kw^av9$?%w{!3 zw_q^rv%9rR3^Co;Mgh`del}%1-Jw@3GMw)vSEC6nipa*s7Na{Ycb#3}*^fWLec$p@ zVhgJ$mZ^rlB*b*QW#jfP=hjYBb-L{D{w9;_F245FYdrJ#6TIa0m)PAJ(Tpc_mOD(_ z34R7aK{3BXS@j8{eeexocf#)G4)d#PbeHGZ-?~Fn*Z8eH2+;4{MLE}DI@?EA70O1g zU%$c0Z?B2Z0xx4S8f9521G^Nw)uypQB5+VKeHq$$sC}T0U zgE0lV2#l`YL{~-Pqzwjh;5`R>n znK5Liit+NiAnPaEl9t#Wyx{*z{uO@l|K}&j+_b+d4)_N->N8&N+~#+_iw4Z zz7p{Z5fB$rM52^fkOm)0umnUe`dJhvCq!c;dWQh`6`BYla2YKwJ)`78h;&E>G=>;d z60BkX&=74BBek_j;5IsdLZbQ_jS{Yvqiz+!M_P}>S+lU2o2Q82gmf`XVsFIxh!02< zR2XkDV1mRh(Lh9b@aY^o;>Ja#5%-yh!{qY|f!YUfQ4#swug>riuQ^}w!7qK5$*aE| zy>*+XzPioH2j0wS1GAv`h7z|MXmZ{6`WG>L?7cjGYsBkMSX49R*^j@UkDV&;ro-90 zU&6_Q4K80Vx%ZnMVA*n1YMJ}boZ=H7d4}z+S95MSkCY$>DgX{{KF%{UP2nfpdipA- z&cA|}oUDMOx^(w>F7+Sh=Ee;ky7%Rr{rE5PYd`akc=oP~-1o>!xc6kAT#?YW+3DT_ zCErj5#vE|v%9r`dUb6={(1CBhTIMc$A^xsC0+>U-D5leW zZtv{jC%5_37r#pX++AEap=q9+5tbh2&G$RL^p#KY#AN~~Pk=OBh`&GWw z1{B~AHhJ>1&r;p6KFMjA0hLTeczm?Zt`z1d7V?V~?{g3e0cf6Xlid@YNKL7YF79RdC-u$`_JAdP+ z`P`Ka?pi*J@{Uk0@yM%QP5k_azCQ0O{K2=J;l@`!#q*;sZ+ycm+25Yg0$Rj%Q&|9R zKlKFL8!dMi1x7*Sx0Wp|`|CIP$Zvd%dG9F~PjUAH_p)5^Ppka7>Kr$|`Z>Pr7Kl#K zpFhPt=T%Bo?A*G>hrd40p?6d(=eXyAyI4#K2gT*bzs$#GJIM|I%+-=tzWF|em1XQb zKF+wkwauK{=hGj33_X9EyB7-9#Xb2um*=yedmdIF<&AHC6n*Qj^Vv^dA;b%Yk1%BqIKF2mIyx~nRX0gjrDa(D|{7&xg z6@2yQpXIs;SPH}WdtS|jyCdVxD}4M5pXSR~YVLl~YdP2Dx76@~xA5%`C~{5s;^)>0 zi!Wg=ct)M-b?rJAmDdjb!>^z~ePeV-?P>8JQq(-I@8ic_!T9p4GD-QqJJ z_$1F?zs%W}zJ*I&b1YyT*Kz$`F6T8(OXfI4K-yaahpY=_Z2lWw7%SxV-Wr0EAMBwe zr!#a0nMaRRfv5~oe%uxcLfuLX1$-n6Qz{E-EdtJt*;?Pmmf$sLo9=sY`Y0bUa>Z50 z03f^-vX~ah9Rnk@DN^GYc1o7|C3BT!<_Zp6%Z%K$$l5B2KD(1C<5@$e)4?c{#3a{7 zbYWBcO!**e1F<2ai3zB#sEnnqM>y$9)bDjM1PX2NtplAo7`7~vP}6vlm|%5wIi&$Z zG&GGTL;({Ao#C_*VY6g+RPHS0F{Vg=C+3)^Z@tJmxdUWbl+s2$2m?$+8`)xWd4|dqeD1qsUAZV*F$!pI3k73UF<69 z+@};dmWd*-juu8rkj_;Oyi5Dc6csbq5+_qSg-x9SyH%IV*VZ}p;6+R`qS?F6-Iq?X zyT8re?j6=v*SLA(CbWvhxgoc&-{F)!iNeyE>#}t)Vy@p~aMwk)ZrveHVRU(ux#1}m zsvgQ1Orcp>S)f-H983e=1$v!=x#1k^*KQJ5`(QP`)j67aFrt5U72`dV-7QX>JDmjE zw%KEUcc0E&pV?%evS_eLaP1=P9a%cD!l<~+&fYGawM7O?i%fU6ab6(#gAQeF>CQqD zv_|6*z0LyFpv!nVVSjr!iF9qKSvomPuE*J}Z3Z2~PMw_vU2AEl4cpIevi-#&Cm*;k zMGf!2=Mo3EwpbkY7*7vy(P0+m*?;CKPOaX{+KE+mHaD^QKKg?NRPgw=N#ai^JJim@ zXiVAbpbAepC{qW&*0zKW6sz+LR~Kn#HFuuB%J{h(oGJzkS)rKk5M7=4W!+7<^0lvV z>fC7tC(m;F+!mwlZOpJsvAlqa(CK#5e(5f+qRl+(Uwew+8&tGxZIAG`wi$LhoH>0u zbvk|Wqo3yVJ$Ezr;(M{G;r3Uat35IM1x!!qhdT)`{CU+pRg+-(%uDUUvx5VgX&07;T_&G%gC4 z5Y%BOI3+Qu{GOG@4KLtdsgQY0Ak83@Fnp2-;IrT(o!gv=5Q6~96(RG7vZDf(1sUP+ zSw;R%NDUkmC=Q*bK1KDA_q7HM3WGtV$!Y|S9r5IK7VZ%-gM%^`k$A`r3n4pmwIVx9 zrE6U9910}H1oEl`(3#<+F%a`b76L@X@e(W$30h_0Bv`ye_HbD!@g^n_&j-MJ0KB-$ z((F9BiAv%&3WG}`^aP7?0k2H%A}QS((F!H;%+i)@c z>Rix{PFQCxqHwC>90Z4D{Lue11NE!t!R0Rmii9@;iLxs!OLB$|lAVR13w zTxM%w3?7{YNEA_-{O=TJMYcuO-#Zbhvanzjs1VQyI}(*eQ(=Aq*-bAER(`ijmlgNF z=EZ#Ur@zMI+YP60KE+ix&zoO!5C5N5=q;hOW_!OOtSGc^6Qq0HR5W_P+yz*wJyX-c z%rEebRSgYQGfI3_sdU_RGv*UN{}VhvRBYb9Nqgp%yyYdUJojtarBm1)sNhBtpZuYYhU9fyBvDT8Ikm8;KFgag`xea^mWm9-O& z2&^m^EO1l?-uP}T5d04&3cYXWoxG;cCAE|3N|FXAGZU1#X z^_ed+fA^Tr-k#@ezyDFpXCKD}&;+*bJj)liEH8S~eGC`IoWI!Rlh1#R8})shsraXt ze6P6CZ8q+7h#p#V8l-f8!19Xa_U)TAmtI3}I0UKvr#{EEy}--vTBbj@#>M4=kAC7Y z#xFTT&nRlASUUAE553|RKmXy6@RbWM<>{|nX6ex%;HBm{-g9f3mv1`Q(c^sN-T#PZ z<^$KCyUyu{-^5EVEVK2jBSd~nDGl{>%&nUnG=54M2b_)kGfOFj4vx)dzswVpAro&n zaZjInF3h1dOvfW`-`-%>PO0=F=MVXVaIm$<=F&WV<9Y7vO;~LlT97X7>^VOCpH*u{*zpvJj7iCi#0GF zJ%{&e}f0shTpKCG=s$@nC&LS z2PH@yI&eeqOt)@wd&9B(kj5x}n^NRz`SP#5iw|5L^7bEj84LO*T7xMJNLehUjzkZ= z#d#oKsBe`*@eQQ{)4gqOT-{`DIbyXs7O;-%xPC8JNKpty>morL=^P~RTY;bpi9rM^ z`B5g2+T5uJyi)`PQ5!<;3yoFM-7RMEp=+g0I}vRSF^LZfho_C%Ht*5t-;Eb;3K?$e zl@)Mqq{z7!>7=Kz+N8&ki-}zS8cs?;Zq<^ z3lN5e{2hrKM6FUzJ`%yG%#zY7LBcC*=;)GeazY3rL}?0Jfr4>erw%ydrop6mVSzPT z;xIte1e7=#Om3xbG>~I@b(0-{Gv@_boCm=sW;WQ7Pz9JgurFlD%#Nj2is$cK_5zostip#qUgE7@iCU& zK4)I>63$Wb#rJ=R>8NJ@WW$N&RZLm2d*w1HsQPnBbk>SI_(h|GP9jUkSnBbNow&{X z*|YTTUuFC8uhDv+I9~N=oZg>p2;9DP3l|G)ze}{1qAZhmu6#t9h>|2jB#Ima#0Uhr zuL0paL4Hm2Xmtc1*FoZR4x+d>wFcEXv{ornt;wQ~QlNq-0A6K5y$zmDsi~qoCrT&5 z7}CJH^$;*eO+k)G?m6P9j6|~hp>X9R1QE{_!m^5>foe&Y}*oq#ppaJ1SF3_ z>xdPRh?p-TaOmvOhpa}F2I5g?#$d#CT!72#rF_H`iWof3w-RU6IO+E51G0~_bmk*X zt_5WrMq9iOw2tgRQUU31CoUoKeI;(B^mmAI;Yr!dC?ttG(v?=}e7t0tdAk%*i_=Vj z29QXe44V$!J$QsW!Ze6L1Nj_)D4=^diUDR< zU0#7akV1|XXaa!BVipQGN|l3LoXGCDw2UnBkq?u#1~Ah2AZB4yQjpTvCX22CqKf%K zP}+vP|AK-xedk$>Q6kD33at+vf(o65*5quCf)dF4EVCiO0WN3)`8|M#5OY^$11Ovb zu^Ke^+2!@SUxwjtiV;hX@!9u$i1R!} z=jS44aR(JM5KNcBV43-O!^v-XDG$HsVHV5ChI5DS6^<&!w-?t=^DW=?4o*c6wxq21XI6}! zU<%H?^o_jXzInV-RKryWW7@{Ea^?cx@}2MCMDS2llvX^d))Y>35eWZ&Mje!fYhU;( z8ygeClb__>Hy@)tm@?VF$tS+H#a%BO5YhDdXL;nFQ}{bqSRc-_bY_9WGE3Zh<`n1d z?{LrgGxYTDxZzkLN7XXk-KP$HmQLKow|xJfVDL*n!}~w|X`XrD9$vh}Z&Opg`0MZD zJ)a-(rtkZ%#N8U*P_(m_{oNMMnfxp>VLvL2;jk16%~3Ub8|*O0>ijC-^xeOo3-`T` zAOHCe@Yrh}=GDt3FRWt*)^Q!z@0s#3&?aY#3@p;%A{_ENqC&2S2b7T8wX$e!(I{|0 z`r@~!Sm2!&jz^wi054!tA2cyqz)G8FX&de}As)egL&$=TOOqmpq9U!2`3hwSNr+G? zgX2qUDT>_Du1r&rB7GgJs5DfuWp!93H_Nnc*&a{Xo3^+pwt8bz>}@=oCDu&Yt?)6s zdTe1qfW6u%(12D%psuHA<>*$LCVJ`wUkwyxfzgptnk0OnH5Bz?ce}GtHf{d z(vqB*2OfpdNxZ6zrq?l)g_ipkr3;#%IGEP#?vI&_YYdTYWf=6!Bp9g#+&6MXUN~H6 z=?J9-wy&7EkoZ@v0ErKQy#glYs2dvO!CH2Sq0;$^u^Ei(Jpr920_hkGIu*mJqGL2g za_|L8ZS#65izsYIQ-na?$Ca_!eyt0pwZjKbzgsaG?PqbUYbpAgNj>H62kznI>O$g6 zojG@kvMLEEX0_(ZjeVZKzQ?WY83)cVY89hV&Enz;E*N(9CamAOL!ng?KVopu*35S* z29?38kUBo95Eynl%qEj0cy_8@603Yvj7L+dUJqp~)5(<9*9^|A(U_QASe4Sm=@@2X zVrU3BFcv$%OlN)pT`I==+e{}1U=6OB(yc0t&hfEkazH&EbNcid%A$uUdxU5S(!`p=(+2xR0VT$6*0Dn*V6*iaf6Q~!E`8wbM!j} z?PS8(D;i1;c1CE^L6<{(>!F#YZSuQ&5Mj1AW_Nv)-qH!W=kCHRu7S}sIJ|0DyLf^V z_nxAj?Xh+JdWs05474-OTsXrZM0THk8e=Wz9=Mm*P4VNsEW&gv>dB1gJ-%3rwA&c9B}*#I3Ngln7Zt zMZ6bo)IXUTm)xsu>#|$d#q@XAh77~@q)EVw5TndXg8;SLv`#)vK5bhT`6Ia$=1`P~ zX^LqA4X7-bA?_R*s6-dV5ylbrNuq+zMS{;_nj(Lvf+j{SU1lK$B|M{WBsQUPOie3d zo@w4B9VA|#g%=TzGOXTb*m&!jBxZVX>;~rvE~Lq~+3A^%sSm;+gM6a^^11;&_AM}g2s52Dma#52mIiL#AC?gxe3%DERo$9${OvGYW+Y?HP}++e5|u+tEyp0-+? zXj$mPK(r9G1{9jie=ABur&CgOe)HB)^$calQWOeXnB)YoY0^o!DyjsNPm?vd`)y$j zRav67O7ql89SLB7Q5H>s_xU~HgA(_XPv`gHc~?7{bgn9KHpX=Bx;CasjtlY|DeZeF zzt!3RZE_Q8d_-8H(1z^xYFxx6W){@xw-dB2X&wQ^zl3}h-uhPF^qQA)a$taY?t0*5^wvMd z&%gUOxIS(H*uU}xe)V1NV|4OGy!igJT>JdT_{b-}%C3XCwUhKzmA==|ihp)_LMT~T zImx**r?`0W0xNSBsyxXXUUY&hpZFDi>Ell`_Azb4b6gI_Z)JY`Wq#%ZpJxZCv;s2gvpVw{-ttfn79QrcFTWR4DcTURHnO*Sjn6(Y z=E57liPQbu^huE`h8ov9&nw>acHa8dZ{-ay|4s3V!%nS{ z%vg14iij!?%F?Mibo%`?cF;ur+1nZkS~FZb&zbY*Ie+dPYYQD9$~?`{JWGovS0tcK zNzWQ=q1fANlB>u_IzsCeUi^yJ^S$5u4(@ZG;TPWh2@bHFTRqLf&R6)24}6v#4{>~r z4}I)&+@3ql$>kBBf8u$TUhz%5=A{pD>B2c4c-c4e%?}K?_Q}sO_BA1Ds`4a{zVw^< zq3?J-bGP2lFMs$kCLC2^BGqs}R0Y3dl_i9TG8zp)%k`&!gMaj{_i}jx6a_9cG`7OF zBd$FC9JjY899G=nGw=Qd-u}WCu7k#=PV<0Hd^7jy9hJ{;2T}Nu?Q$(<^nnG)$MD8X{O&fA|!O>(! z)KC=~V?Y~~2V((RC+iOK+g<@j14d64!%Py@jEFZ`R7ue~o84#eu$8>eT_MFaM^xFZ zW;BEx`3vL@g5HJfI71PoqnFZ9py(Q#fbEslInGxaywCivv76Dh`Nwxvl<62)lbv!d zW28X_%B3+$I5Lo<4N9Q}KHT^w?LQCM;U@b|D`7JLNb7SWZTDN}slB6i**!&?BGv+A zIB(AubWM@|O@x9Jx6IBhm)8(Qo`^C@bV(a&f#2Y~!+Y4?*=5l0F}Zn%;9P=g>pt9B zzr(O;xNz|lJG=YXVu-eeo40R)u}oUU7ryc=r!QVioT=T>3{$tL1mdnKEmS^trYr{q ziU^Iz#>nbopWR7AJ)Pp~mTqa;I@l);=Ms-BwpM`9xyzapVSyMZ7kkW~T&A8)7^;%c zWT3roCWJ~H3%w4ZQzjdIr>js}v$D2KGo4WMIy9p(CdTw$3AQEr$o~F8VrNA^VsCqw zwg?zoKy+!)x45`~)kDh713HFuj+mmu#A`ey*S_{F4}a&kQE#rZxYXm;)@B0d>Y|S` zHbv%CRWKY55?89(9kIH!!tB5?*`3f`9TIRfvoThA!lc2^fU)Q1l{*Yp@1pF?(JcqG z^#R62yr1C0h{X%5*ghGoJ!y%Z0(3z23%dO-cP>ANBd~hcc{+1ditx2=mO!#?x5M_0 zO*+*wooKlB%uVLbo#3vQKFYz>TU>kU*(APLTXOlvZ7!TW$)yt)*?9UUbz5-m#Sd|D zcEIhgJ;7{io!j-8h5PPe<-YsqpIE}LZ!#Gj5M7Qo$C%@H5b$lyT-nQ=PVa2cl$P3P z)?W4~v!^a|>-rtq*rSdniGEG(==bJW?pE{$UH0~NIXKv7GMZr&4Eq(mUP)Dm@B7-3xn5uedI55$Q$uc(1&g|R46 z=*GnyQ4i!Om-7UpQMQoxqsana$j;L?I(!Uxad8Iar{JWvKyET zJl9H~@PIZzv;^hA8xgrYvf=3HkBzS%JEZH0k?ZrOAmP>Lms!oGq*}vTY=n zck44oK^vRjkHO(mH(j}C6~KxSFB%D6I!8b_qisOPe4(xO5MtzCO6ii7OE2YO?>E@! zUE)>u_c*M?zssDsR4VZ05B(|!Pk$EerX1`~n7{OTzV}<+#DX@AgCQPl^QB+q69nZ}@IT^}G0uU;jCt`0Ns0W^8Ovx$wHT@SShGpMC*S0_ty=j>j+< za#WU;yI;%qeCv#Nf8-cFzUu|>J|DBtm&-@@62lG}cl&wud4eCE?1p{HkT z%`Wn`AAFQ<3FLQh`W_7YHWk4~$ILanuqqz-rtjdp`BmQifuG^(7Z&NLmYuy3i;ujO z?|ReAusD3ojdyl|vn!AA{cpR@-+$M;`QVvFUZ+c9Xk>pDy!6fQTP{aueLG_^sey{aQW|9n#`{n3lRy5q z>FaQkP zz|ztqyyIJM^AkVwOT23^#}B>n<$U{_?(oaM@hkkT%b#b^th1$8c=LCEI}4j1=E+UV z8{hU?UVdR7DW*$XeBtkWfzMuhF(SHCXezW*y+d1iwH`;Ymt`aT~0mha-?*$XUu;eGt0zj2e*&V=o@R12PuF%pLs98_TJy%mOjbSr{2X=ADYr#ILX`o!1wX$x4w;= z|M=bfoxgsCYP5&zUF6%}`by?4%&tAgM?U@uKKuAp#`^2){x>f3hHw849z6SE&VBah zc+XG%O+MK#nQZLy;x~Q=56@fvRV)Q;0ZSa$aUIt`SKV`V$i-7VW(kTH#fp9u8&FB? z$er>!h0RcMJWYr=`C&E-ipJ;1z!1rh(L%=*IV&`D3Qf;wN(F^6+4ZG8@etzfB|4~R zgURy`QLacE+R)-dz>>QKbqhmfRdNJbl?0)*em03hHn)+V)vWY8+`ZW2-28y68&e*; zvd=7bz;^H|5RGB%H8*Z=fNxn_Tg51-r?p%Wx4By&kv4T>%C0ZhG$JRr6slv0aC2a>moT&#!X9A+9Z_O#5%I66VZ6u;v=9nIl(8b*L@&Jti$T; zGV>wQG&x=}nNEQWp)HFd!;if~OVp<@HqSD8jM8*$i6M(OE<|*hT}TJxn!0tMA|#GR zq+4p1hC`P6U3x`9sUw9>JD6!bVK&JEq>|2mgI*77p=oAW231vZl}%gE&GjvU)pW{| zj#8;ZT~$~*or)#|?(82Vu)ddArHYC|D>PsQhOA;t!eB>Sb}j^_O~bg!%p9BG@F|j+ zwy#qt=6WS_$wdUw$K=wOwvNJD5k);-k)iW#n+2n8#i{uLy;5U*le)Nh7b%L8QY!{F zqW5=s;OrugKC;G%^nl#pgJ8>J;4)Zr<5IcNVz5vCZ7d2`*ha zMZYwxU%8As7$?B^{QM9f9m}T|33HK0Ui>JxzW6L3`}h}`b>`UEn-Y};Q{lAX)}0Mb zEG}`PU()dt7Av^t>x({j(NUxK$YCUwgv-uHPH z=lYy};3OySI>qMaKF`YP8g?+p_U@GH&t2i+H@}>=Ga{%lb88D3P#he(nKIkn$2N+l zhV?reoPXKNu;(t|^9YXV<}Hk$r1Pzf1*)tlx)rgkh`kDwM+ct-t;xnNySHy+O3m7( z(=?M2s?(($459Yi{>szbdG;2k&ODe{6L)T1W98f`OLGex9E{n#v(EO-J4EjobW8f( z4*j_yb)lKNc#{4?!R}K}v;F+dB77_+`P>@VNHd+%?vH6kHBFs`auXt@GW3cr zktm()99}Ez@=1DwCHC)Za^>t#)+7LoPe=yHvGGUsoN)~8S(d(9UJCc;2LK%q$y;7+HYQ)JhX(OE!AgZK2klO28mASg_7nUW(^QGp0D63gPSN!|L$f+Au}ftGy}(t2rOBn4dC z5?m1IRv>sU>@C>_6;Z-%(iU+b6=3s49HqsqfQTzD;+q!N)C8}x$dZp^c0LiLOCSU# zVpVjII;pzsFg+9o4JakfT7%UEXeGZ5k{dBSKW4ow3pj-ZV?il7muz-sDG?Ogn$X59 zD6P?EfO%!lDBKk$;K_c;525}^@QE&>i&%7uXXp`_n`X2FZ=2|tW34o!{7NuhD zZkuB70hC6*XOgfzbDnAAspWkWgUXyxz{>?J?`2(tC5BQN^xn3FD4ju7cEY1Qfha-uHJcA4{M7LmeFce!icXl$Pvl?>x{N0?AfpTm| zT)%Rit(^m+Eg7D;#64%`kYYC3;@0|vwe#nGOFYX@wz+wGm(JozRu_BxmU1JmK7W<1 z-3cxly2Ay|-F1oi3LtW@x6al<;MCbuoIXc7Dr7v%h|W zojAv$+GDHfapC-l7e=)9x4CiWfWg{1R_6k@Z`>qy=UH2tM{`s$IySCdX8T~mtnol3 zm>vs@%M9Zd({hdTCl`^T-rMBLt$m`8bQcymadL@{;i#HTE??hcZf%Wva}&LChP8gd zH`Zi(gRQY+@yscDquX5Djj8F%d{=W+Fy6eu&8^+^TbmdNy2HZCDb{*ZuHM>7;-!~{ z0Sl+jaPG`WN^)&peU@93l1rD)GN_d7x-nO;-l1AK!^yb{g;Z=g*uKNH+k3P!1_&;) zboM;wP7K(*af6NRaT4Srn(opXcV9S3k@od1Zfq;go?oNT3UJ(c=4lShGWT3M0iogM z<>$DyGa^RA;^_pEBW6sLc4A5nn0NmakZtR8McK<=7*}KM*SGK`a*ih5x4yP_Xz*-L`n^$@I$_7n{%&(o} z;`ud7_ci{}-+4dFk9-T?`nvlu!06U<+}xi@H&^Mz-syAxf%}=$uy^Zup1ZkC8#|o3 zc!6^(0|45+b*^5!&H)`N6;iXSlXu_8$@w1b-W{I3dW*d#(C;sC>E4U<4Tm+`-{JYI zw-}tdhjagOV};w6<2tV6`WI6Y7f=zjG7=vN1mp*vw9PIxIfA9Lz*Wc(+B$fGC&vyG zz!n6n1WMYF$Cx3qC$NgT@pkF+{Y{xCr~>5iU3u2R-^##dJDB!C}%`A>1w? zNVhBitujZcmH3L)meQK!R3Qeuhk@0=492^f=O3?bxY67yrk!-17tod<==tSz6nUn?z91W!a*FTqn8!?5bI z(Cg8!N^A^(&I7Jy#&|r%JE+PkF~iEzP!@{l+w9t~NovG+&^i*7>^mTUaJ@8;-8pG} z(Afd#{b3ZwnmnjdAt2VYykBFa@h$=J3AwYDDQ$KMg#bDvp|G%;NRC`6AQ14rIf_ye z1sEMbfhO-eZ3LPd1CZTCAqeoZX&IDViq3$oJG+#z=JbV2Jpary>4)2J`6Q#!lZ;0* zhRZ$XhXZz}nR#?DYZz1=LOWtIKA=~1nKcb%cgXtoHkX#puv6b5)Bq+&bt6~}v$n=c zJN%+78O>(QSBh?O4LG!h{$R+hD>s=>u>zL?&#}dg9cE>j-s&m#M`OCZA*QRrH!$-U z?P=PY=oCc5=-?m^SY1f_&}oM)N;=&V=Npz6=Cg|=Oej>J;b1OB!Ki0c{fO-;#<%y9 zkUJ)30Dqcwkvim^Tkdh~i(lZbx4f9pl*y6M>n(Bl*=t<5_Z*$lV0)Uj<3TyvS>W2` z+nj%76-S%Si|9Sm@eDhg(FrB>xMBU)I%Z`NeflIZwkTT=8|W@BFx#3i8qMfb6_e=< z+dzM%ORODqE#7MMutV2WNhof|`|NG+FkD(l+&VRxCDCj7u5;8oGj3ddo)afEE5l`) z&3)($m>e818&6qYT1G3)?(Pnwon6Ywn7PF{Mpv&9{Q?UQ+>5I{)Ah|H#D|@2HtPer zXIAL1tx*jJ)M>stDv1SZw2xpw zNt^|L7_XD{Xb;_Q!8?v(em<{bdX6KNR_GAHWG-41zEe(fE6^H56pJdLffzuib;(gg zQ~(dk>g)!Nh$GIDbr^#p0u90C?u-hBLXMwA#?eN2Rv|A#OVlkylsE%prs8MO&RS3! zd=zLu8EK$hKCb{JtT07(ZOcIw0r2SGM9{+MQh67ljHZYNn__}l95twn0tg;k5Z$_mHD7bBB@b2WyYh1HMrp9cZ{$fbGPQ~ zz*b0{i&W0HI24fQnUQ2!9Q&76#>36Jhg^PE|-}?i8r|K=O(v#I=?j#rH_-(7da)x`q zKK<5Ol5(X?(0)rdcpcz*6w+b zHKcUO>AN1_8`rj6KFdAJ{FYL>%Z0;r?9yN4sBDk34?M(Cft_DN3|zlWDa!fty!gex z{qgUuoaZGgFZ^4Wc6rGgzKx|*XEEd&oVttqPVqa|{HaU4^y||%Rxy8qyT3jGzs=v) zc;H2A|IEnezY1l5{}AYMT*q}>|6H{=uq<>9NHj~MEKj7s`p~SHi8k4U88i^XHNJIuPG2)fLO^>1$0;ts>VArzHlt(Tcs`57{ zMYpn)zd0G`DCiQHD>QT63LQ&sZj8CUQ`4Frwkq-79RhVXclXnJ&iA@`u%D^EM06H_ z1pe!?=#{rcN6NBHLc+MN6U(JY?5!NJjLAjNG7EuVtaRrKRNW3$RbXuvjwZ7@M={YT zt8-LQ9Yp}60%f#7W&M$B2nf+(1>~)?N`gfQAqy~C37p-NN@qZ+QF$50+BA7!Jgd|G zN9E^R4Rif2i~Syh(k8c*HHJV;EU(68D}13fy{e+$D=7+n=!h^nCQ(aclGxLPz}|SA zTkT8ivn*^DJC#cC_k(F8f*hGWmRgxxw35M}0E7$Sq&S}k1wNfyxdnQ+Dk;*ysiiQQ zL8naXo*NU8CZuzk&LHH>5`(-?L!>m8VOcWlmJ|l*WFkVEf=*eWBJ7V2xbM9Seh!6K76ydt*KET!u?M%Ef{r zv`jZA$?exYu}BjeOl7b|2ctSLX{ooi*}lHXpd7NWus|~%rE|Vpbx;JxlMzN2co)-l zwoSvJ-(h=ai{Lfg;Ud-CBAvN{sA{IW2h4URbZmhSo|>54hx3CW?PScUwMDiMHaKy9 zHHm%)BSSrF=!6+_sWCzqRcL~8bjksfNu(W(C`~{WCdF8TZz+q4(XB1U8+&xB1sY)a z+zIrcg5dx+n_xnX>Gdf(L!!5|E#M=%buX?AuGlCx@O zbBDq!=GIQpJ9jp5#m0MEbh{n2)=c-ugu14h>!Sy~6dM{%4(JaD43-xusxos6$?QTD zn5b#?4!HUJHKO{>nBprbiVl~rUS>9%P?pa##Y>C3Rl+_ew0DWtPHy>bUSI8lcwOtR>RiV(~!F8rPs!ws2i8KR8_a4Uljz`LIkk* zC_fNmpl%yn$Q=t~5>24nt!RD7?u?klHKWyG2cRZ+8Z=FeOlA#b)ya`e737DtqLC0C(5%KJHOn@<1EBHZr50ry_K zh}+s_yuCryDH+ZWdG6^e+_}BU$svUN#mT5t5(HgTG$9Xwmj_*zx|SkN)A3q9d!F6> zT?V}pTSau$RVtf9HUM-95UU4s(lL znr4i)Io3J7vrXj{tt;y+w?c zvcHg)l?S($(Rh>~_9}H$h4KC_uK{HJC^?Yk5=v6i1?3%q~}?%a}3+ z#un+{XpPS{pDct!j!kNfMxl`SV3tns-pOrtyJ~B*Yc);cb_yP)BDT=^^HFPAw}4g> z84Cim4NUvT*sx2rLg8$ zy!!vLlrho;_Frx(t+9m_@rq*s>$r~V_d?ANimy*405(Oo3^E9jt9E22QScO5D9Y@j zLZ|0qG>8p9M3V;}E<1%H(gg@5S129YXwcw-$5>5p9s?p^WjK6{N&xLjuB3uai^`lM zEt5^WBTuOVRqzzS(ba*aL6?<&pH5NYL&c4)Dc5&eS}aj3`GJ_lw!P7WnRBTdQE9+p zKv|N8WHn82G_A+SfHGEiAv#Cqtf6sj%3>R1=yfWrv5E8IW6Z76qh&N{uw^O2ASreT zD!H~=$)zbHgF5LrrOB=$g-YuIWR8g!mw|{<###^;n^9Ko>+BeFEf$RxMwO2F7*<6| zx6>s?&B0_s>&1CNK*x|GgA4sGWs#TBI-jCfP2D8N)m*<%uQYU$m=rV9#Al#=r>v6T z7K6&MiKrOO8YWFEAm==QwmJ)KGZ)#P)U-$34`Rq&o{+&~VJs>tOeDL(bY|tu+9tuW z70@k;Bp|kKidHb_cd_a9IeO}S3ySPQBj&i20!1F^v_40j3?w0F&?zy|=V7bFepDo{ ze_64;yH8ga+`YWWt>>P>dC!?MXPC~W+`4@;2?p9&%5IO~Bi*7((LK}Y6Rl0~d2I^n zrcNS2x``zLTPD{e=P5+yGC6q9PU*x+)X@>iRQRD27WcE-m3^Q*KUnE- z#QwCw==?*lFoDJSK6_htID7sAZ4>$Gm%qY&7cQ{9z0JbvB2znM`JOfEdO~R{v@xun zT&2I%W#;zs=f`wPySq!L&?q!F*SG1dEE8K#GoG-1?J5iNOQ_^pYbd%MLffLNKDyIm z*344;c6Kmfx_>~mFhC{NQWtCc?A*LTslap!d|l(~hEBIY6%IS-GFVt;zB9+(`aW$P zSXns%e#T_9$z(K6!sWTMXYnrb{Il1X?+;m?n}cS|?w#8#o?4^4aF(J|&^G%Rpkq5I z@2N*)>Vq+5RnT2pp+CQfYbG3QZ?eC+MLU`h>pHzZdUJEkFE6pQb}DiCn(=;ef1P{j zOQ}?3^V(Hn+hCNUtPDy;iGl?Rt;i{{2ta5Xh*6?rd7!LB8JXLFCB&8A6~CClu15H)x0&yfCw@ zA_C`RhZDWGYKk z65}&A%_qBVwOmvYCs+VvKPhd*rDZ@c1_2J)T*Mq3civ@?I^djx7!O_J1X-pCiHeZ# zYl#U0X|JU2xguD}xdjrB4T>oHDhpRZBAyWP%=2=Pa}-4sB{zm3-8z*xsl#cibkB~D|A(g_$MB7jA?H3rZ`rSY=gQHQ3uybkH#0;<=BAgwpGTzs_2 zK@Nl#8%Esq`ggK&@3DaOyHLkQ_FE3*Kz#|Df#6D0is0q6cR^>;F4npDr+cg zhR5a~<6x7;9)fZNrIRRCw_dmsh5&i+19&0?kJ28kiVWBVNVjse8!+TfNJb+Lq%1&$ z;N(7N`Jt+Pi`J1sMY_h)FEtCjg1M?pT&h+XHV#_u?A1(yMkkk!bmY^TsYFnW)oGi8 z2W@obxDY`2Ds5njp+7yDLhImBB&VdT|ec zHX>4a^3_v;=38r%2<1a|6|`-8*cs9w!G;KJ1dNt0aG7_}x)!_#YXxQ;F)E90))s)K zuBQSJ7FLN0>F;u^QQ9z_HhHi>q|@yrM~cRyd_)(yLy~t2Ev~i@0l^ZS9$QZ~-C;Bo1iP`6bL11y(vbcFQvJ#WeVOCNSrK4w1C`g2R|Bu9_H$ zGQd+NppgL$piDkqF*!bhh*%uD3y1&#`3FJvc@PIl033?F$&}*E36_@ExP5(txusj2 zz3(FXlM&O=KHa%hV$oyk)(w>N>}+hZbYX!`caEo?xyBpb_!{nj&i<}T!%Jjb~kp|`}#CEbCKa-89gkM5VTh+7!Fahz+%zk z=2K56Zq?F>6`G*AbNMExAHE+I8m0%ksA!V|F*#4dkkRHHDg)h4B<^n#%_0$lou6aw z)H!Z_?J?F)Em3qj6t<#iYKl-W*$rNB zL}aZ@5ow9^h<#V zXynd=I9$kL1ks36i5-v=3`RFRG zlST_yNSvOK_K67|q6dWk6aXTK2qJ|~ok_h24+=z>L+%n4+JiB&UJ+V6LEN!E-3nkH zP$(oqnB8&`LqsCfkfV=*9GN6$(L>e@?;E7+UYdeL*~sz4%+u2zk|+nt6glcwrY0bH zvROcq3>sd*;3^4<_K@ubNF*^JB^?dPB9w{5nE$Sgk>ei4i6yQ$@^fUsQ;GNqnxHgRXI0FG>=Jj$v{4s=2;p zIItNa4st;^2-iwj9{H+t?(&v+Ncpi;+T@N*f!v+PgVPEp*8j{D$pV8_(w1GT-1!O- zCxECk=ZBzjMx{7l(>TWCaT0_&RR?1g z&N~{{Bw@^B(ydaOqEIQy6^S_Knbi$0NBOdF5~Vv+3`vBMff(8-KqWp9F<^8SjWX<3 z14s;0x)p^Cc@F|Sw#H(NCd#}@TV@D!H0&LWnbzV=BA`MRiRS-_d#w#=u&#Ba>XgZ0 zR%p`mlsGg3k-Bx_bO_m1=0oo6=N!{n&D1$&F2@{0Bj>t2Mo6)wEIe9m z=%;hYU^U_h1EY{=Q0_uGo;Fw&S?gEad+t0}uiQ$&?)jx2r%#_u?wcPhF$ko>BzM&iW=cf*lTsCek~30@LrJOH0`)^7c*}bkxiZ=PCS*fTB2Y z67M6Utu4an0OM*@2#HA-{gfD{*iH%2ql}0MMVT5ExOPg}>(EZ7=`maND2j^l&URYX z{QMFd*RFE)^0OR_Ck&TXId%4Ia<=S`$L#JNuyJRd5F2_u&2Z3V&>t|HjM=_*lZCZa z%<4)Ku3a-rVl`3WJ!${NY0d8XI=b~~*@Klemd>2TwKaRA5!&=|jiMPj4n_?JjZcvF z(0Hz2zl~8P4}R-g7%b0mu(3{TW=Xu#QBf)ZxN9W?VFae`CDEo3`QcD-QA*MJNRa5Q z^O2x5K14#)M1)(1mWW`?&xwiv1cG$&BUKP*ONja3qHclQWHU^Z=VdocAwst`8Lq9w z`GSbmQJgo%7TDy7EU-nD{;jOd;(Js?4cbT-IUOO0V4{TUB%H3JxO>D$Bo67Nfe1hp z_;F6%SBoTjj+2K5%BXSYf;!k7FnzS;EficF5vOPN6eq`5fL{+klTo; zd9uzR+7~{^HUxPrl9^Yf!B~y91}kC+S^=OAq45zFO}b5!lL(^EZtE-zX|z#C+lwc} zybrbPH}DXGh+7V^AfeD8`%zih4}cywM$xf43t2h~TbXHPWZQM#uPTk zBT~dJp!E?*U-T(y;q9==MT%0zkVP@)BSa_!jBwq6 zbYF%h@^1x7Q@4RyI)8PIN*u7tXh7w4B5$7+ZqEL=rm1U+rsjc5ccFvg&Yjydq2a=X zbGX@z?fofbe-RZU^>jqHH=qr0<<>gOE2|8wVsX%+ZQ3MCoj!M#aXn#wvd{T*YxL)P z`0<4Gn_Fq%?NXP{$avPGw52c_69NnUL5jAO*0Q`fK;h{1I_R#(^dnw-jP9oP(Tz6D zomqwUfTE+JleqwHZ^Xuxb>^4OGU!-lTX*OW7a5PnSleQ(yr0V<2V3J5n=QM&B*JXp zyhCSD(OK@I=AgG|@%smi)_0hV#&oM5vj+A?HPa?y%Zg#Ii=T}+cXEaG%^RFLe}bad zXZ_|jOTz`WZ{KEVZH{tnfSn)W$20b>Z8F}_u+v2Zq; zVPd46%-G-FK}#%oHXbGZ)$qhg2%eqw+xTXh1gwI{bZ-x14W_KXNb?C>QS^FPMRKwQ zZP>VRlMV`7S*k&w$?h(y4Rrb)W|IR7Q_wV?n>Vg;>-H_QHYr-Tys(T$ad0qVXKNdj zqTi{gfbsqw-Q^YZ@-opigxM6W6uzkm0)^6%#6;WK-h*H$x`Whpa%t@x%|T>*5SY~v zOqV(oG(NZO?{x<3?e5d;?55V>XV0IdQijoJjMXNIzJ)j+<$WkD!U%BK)lM1(N+XNh zm9upri7|ORZ?dq1mUti1%`OXZE_j@XP=O#~S0DzJ#g+6oPYkkbM5K_YmT>wcs;1Mr z=ZK%iDwCOZMx(99N9pDlvvWw95^YLM60$0kDu~9U=LIi9hjb`)ZHr1gBPT+K0a=I4 z70eSVFFOlZM?9to!rhbgC(k48uO#F_>%h5~0rVl@;fNKYA|?xSd9o(Qoi#u_WJ<;) zaK^*^hOh%okw52icRqF4IWpt}0zf?EbXiPcDI_i~-Ct2k1g9v@HeH|)c9#e_(ZwW~ z5XkFz=mg5*Uh944Gx;_%xx5o5SDP=^WUCMaWLYu4&b5gH=h`|ukbNs4`ZmM-LlBYG zgRmosxl3gh=#)eD+R@D3YM*TuosNrO|S(<@jNm zubdkyy+1NKpkp-M5(b54t~4wbEz2+eZp!nIa9qcAT*q}>#{$-I9oN4`4lI+pm*s(e z77$zvY4TA(wF)GbkRn`0L17eD!0trwiA$8bL)G39RG`q7N-KJW&fFm)MT!I(bc`7q z4@m%WE&?h$W|RUQ2}%L-LtS9EN=1q!f+)IHVTcS%OIO9rE*j3UbKqD%aBPn~jSDQy z&$GI;n1r3({R5&l)FEW{kTGch>zx<2L;$04ktAxg&ZBf55M(f{$}z(jlYphQN#d0; zhPs}m_?*&~pe)l_gGQx&Rum?83QPi4ON_!^(FQL+w2cUXM(GS)hQvr}+6E&X1hp1X zB_a$LEwE&j9SY8gSY@+#r4%a7TjdUV=;R!mPTTC9iX28WJ7r17+U#Tyx0Ep&f~QoG zLMaMmF;UvGqYlNp!q~KqMUms7d7u+$gU17P@H9S9*c@XFJ|_3oB+UmIgn&W@Z(3TJ z6X+%PmrVlAtZ5mKXZV<-n1#{eT=U5x*6(z(v&08VVaFI5RH=|VG!e2ZDGzjF5+rA> zqxP8xG$<|o%3_Fk0a(ibB;9J0xn_m7)T0SD2F|Rku)cnqSqRJ~6S{@r)Txu4I(M2o zw{CGTatY8rnbpjEr0RA#u{2<^yOs7|x8JAn4U@KJ`(TTgyyzizFJEQn<~j<4wG{`W z8i%EEF~?TXiH$WF42W%u37&;PCyB)X!3KushBy<@dcb7n*dOh)cJ2g*5uxy@t6n=9 zVH%G+h;(C*z79-A+mxM7ikTW6uu2oWhE@}&ir^GQx0f7yn>TNP4J@8n!pujCe!wVA zebAs<=ydu_CXUIprPT%7yL-%+1+$$E?tS14vu2;Y$%KWI=h<05U}gRUH=cclwF_%> zRywp{%-q6&*>=tCXYVkrrz|{t55u)3RH(riy35PB$&A8O?5=MUn*d%>nlcH8qtS#= z&xi*#F&H{$&(WD1qM9kA+qYoWW~bY%q3m|hbMq3fRf#vIwZYXbDtJ0o$=37FQTJyPg|DeR#;eAp|S-lBA+dTETFR*>{Hj8J^v$(j-?BD=vps)hmCgMe`lEFGge6U8D!}n)E z3HJ(oPy{qCLKDDA^gI9_Vc~@!4j_f72_kkFB7nFfj|2pT*kTa3O`fzC(Mp_2TII>8 zEW&BXI=ir*60p5O+X76H_D3W)fj}5UP2*^1GhAKco0jN2Dnt>XkaaWC!BjdPN_X02!+0Era zi7QuIogG!yiW5lZm>uNTMV0@pvPdai1~KV*5_Oa=fv8A89CtwxqY)8|EOJHZ3<;UZ zrHx!rK}5)af_!l%@82Z&yVet&!@CyJbFx#7NRHiy{P*A*T$_(cXxr>CjWJD`c?Ag9 zi|8R9+SpKNd2SHBDhjL0OFZ(0QxN_b5qX`s$Vjff{5S89K>1|x)XKig0;9p2C>Q6* zj~Nln#8C$j;LwfOwjMBu0GFEws6b^E9cz*k*+{2cc`u}W-Rt+LY<7$rf^3t=n4|Yl z-M09svgoMaOs!_DA@lL!mjWW;#lppmkZH znlamZW0Wl^jOMpgsM*=tCsbWZjg(`uzt7Yus?xsTxqAl_0)|4j>~8NShU4zu9{UF) zT(s%p+i@M&aUIvOfOTBQ^)Ij%`j&-3fdc75mjS(P$U>GD;p#B@XLN$fb}E|zwK}(g zZan#ixyx||t+HdMRFP7vEMO@pjiyM04l;OGDRgebgO#YFi4ke9Ev|iNbKD>;Gc8|7 zOlTQc!+cpX->K+#2h^?N`sO|xBbVUdRd>Mr+>o|ylH+QBHYI4qcvj;hR8@tsCeL51 zB&whlZ3wh&zB+Ghfi{X59Ys|nVQ4&SQtYfOI`pazt!q-t`ozgHMT!o#KEr^kszh5u zATpcPcqAq$0+tIdI}re_Raz&7%2%S>h7h4BOUj~<2%$wH7g=od{s`y`Sfz8v6hOr& zT^I9!D599uHPhPTB_4x7gG+7b8bf8Wn<0sm>2XcRmQ>cJW2VuFD=&#Jnp{djNX{*v z2WzP%es*BZT*J(@XJf?_iD$>pbPjz$tA zu4xm5zh9PU=cId}#+vNRh{%8{M$8dNpAaOXsx6bYq4AMY=_Fuv5)-YJ_0T9`w?O&_ z4wFQY7-E8jpIKZ=`)YqYVRW#MHL!Ma6{Vq`wHf4ZD_SC6tK^&+ZQV{C@K#TpVltbg zu6N5PmQXry_RQ%dV(e^h6I;-#WPNjss?#CH4Aw7-l3Cp**n6)m>D$0u1%pzturSZ& z{yM{x9aL4IJ40rZ8KIuA&{cRlC0b1sXP}z4_z{?KAo>}Yz}&(-8@FzwaH;cNGi&IW z4)r*&vol6lW$H3G+Sp3x|8QkUXUSscY;w7{tudvt%%+agcGIAJ`(R4l`oyWzzUI`a zIofu@_RbEcPhY~819msIneJ}TUn;3i4;h}E!%wG-H>MoiKA>r*=rCn?YL5NpfNrnM zpDjUA*e(W@_)~*^FLB#u&Zih)r7eWWY`0X=Ap3E(}N_a78E$w&>42XXuAC&zG>3AYWp3=(@_?#tp!N$-Cn0dRaDYl z)1!<_=a^Qc*lRQ1Pu(8-C)cP}mI-x}oQ2&KPcBk4xNcpF6PKz0r?__Q2K!qFSluNA z#r5@DT)S}%Yc*%jon!6PsU({0@9(GMSCu^|DsEoCNn6+S`xTV|YXD+;T}Vn3Npy-J z0x(B~i)Iwl05eIWHo203?1UF>Qg= zi?d5&TIjq^q(ey@k1RUH;0V&uFQmyIx&V>aMd>;y#|o`v zUT6{Yvim6S(<8=Kswh(u=49E(`Wqn1c1S)jNNkY+!7JI1dEIiy!|b{$lA8@|k@u<6 z5ThsHWf=hEG$KK*w4t6O+JHrlfU zfA(V(C-36Sa*r2QWcSJU@V9>aJ!}r|EAe!h}E*6)wm;jmZO51^AE#i)(XpbVEpwJEzzl)$C4MCJrX9VXoJu z>~*<*^Ckz=38pH<(dAJn%CgAJFP&XQtp;N27)OkO#<}Fa(!v9ap5QOYuNE^(=hE+htH(`zbis1gL-$b57XAFYB;VNoi(DU`$> zKubp{pV=pAUJ%G^omhfXkvcYqOe>{g5}N{=I>G6E7BIXl1bQ^+ZI%}D= z0aJGHcyWM)-2Jd9C;%G)7r^AMjMkX6?}K!SQYyOwK&45Ud<>C&7$Y*UC?vk2fE<77 z*dj+^qNh_8>?$z5Av@y{H#WAobn-NN(+LOT25+l$)p)$MN1-)!J)#W;iZaJdO2cf| zq3f8g*zWA_(&?4-jAgR3&;I@%i)+iY&pw|Vc+*LPO`vc^6I({Jnpjl$7&#bEIelsc zT~ATIVNg|cia=YBsSifzVnDf4FgnPs_fA_wT9mxQJxwyUcbWRU>{R86y13U1=E9? z#rw~}T!*bEpQc15C!2HGIWqGN0f)7jVHdNSnuK0emc;!rw?F?FCtmszs*Cp!^kqhy z>*;)1J#&)%oqY~=4{(iQ+|Dw;D+a2LX4Z}v4o%v3=)jGe&n2Nz*)lP@R@Y9^?+;Kh zVu>hbbc+B@3#rSjLIs7>5DeI;(ek+~;xEb?lDUoSSe%7Gi=v6(A_8j{!3TxX!Xg6U z9vv~xEeaGzik3Qz4hk$D3<^h(?-LFI*`Ua!P(i0D>UiWfLd1>eiQWmYToIx~ugOlK zHi_&(pxO%GB7#7mj0P`J_$-cqkHVJ15S7A25o3^;p8_4UxM5kO_3Ex>n$^KFi;i@Vt< z>BJ{pU(rFL6(TE%g#&}rELiEkpH`WVC+6eYZ!=M}ui z0oow@$wMT6{|A*O5ep9+Y#4)p?z2-$;UKwnHOfY?k?4IELA8ip04m?ch?Hy}S{~O> zM0BBvItzs2o&wdPq6l*?Z&xZEP$I5sakCK(Q6kHjNTDn^McV|F4;TVkWv5nQ#c_-# z>B34=n1GIkNWcY^M9$a-nrZG-3z2TGAOz3e!8T=bKpU)xidq>^foL^oXrx0VCNm)m zrKk*)B^Z3#N59(@+#a8N*FWNyo+^0lH-9IudEf-Qm!IH$@BRS)U}wS~{A1t4DZkHX z$8q1Qzm>PY{vxBNKgTcr>brSwZ;c=Lru(RO#`w7x@tyB{H48;{G7gqjVQ-&sEVw z<%CZGC-S@8`XL?{9MF`~NMz z{}pTe|92hNaUGZCxQ^?%{)JQk;frMZeN^gjARlD_9~5Y1@G(1-4r)zQ4p%rzW2pnw zaz$Anvw4uD428}jNKb353KU9bM@)*NLEoAzlGq%BXkB2|dS)&%brBN-_<*+J`|&Nx zwHO;2Rs)8;4skjW_mtyc<_M~y^)-!$QBzaZGsaDw91OOq5}4h`NM&uB?_}1{21NwG z(1@$aqp~YNgZJ5@uhD5+BZ|Cx^28z3+$Kg*5_*8D%#I7!xDyK!X)UB2%EL0hc11f!VxfKet*ATA7*`8h#2 z9nzp*&K-@?h(E0JUrBsS;W#}5{7=ww57=0Gdh)HmP>_Q`oizI5< zhk5^NWr0ZaE)QlM#84b|GHil$_wwYyaEP=DTnrS$VG^6Jt#5H+ae={Lj*Xpd?rhK4 zo7`b(VZiSG4!vH**8YrMwUpQ{U1QNz2OnID92PpVJU3wH_Dy!yHwexr#?r#lJO}GD z%I=VP$^`%K7X@_{a0H^tZP|N+F1{u?z|NH`wBEC@IHW2pJ~V{p0IMDIORIAHi#))e zPSIMEduGCPcb{r7Kr4egm=PL>UYx^^_fcb;x^8xhKAo3Lr z{sd-a5dxTgfwq=tJiT7YZ0wna$bJo-Y2dETfUeo*&W-D=t)0PkGz-HMj3(Rood!k? zW^s;cai8w6q^dd`?2eMNjH*V>SHz|v(%`52Xj`JR#YhLapkR7%Kw$u#<8U2SP~Tc- z`}!RYW;OGxtE?<8asEZ;Svv`=d=3 z`W?J+be4yi>o(qIVWkh3PP2b?ogy?jo^8Mu0FgjT?Vv0)qtqo5=>%6X+T7#Hr@p|s zm%WtkrTf5^Y(M)f(^12)+h_jlkp0~Qi2GO_*gu%kx-2k7RCXHyy^f)GdIc90E_gO} zZgXSZQ%`5$9sMG()bDa?dB~tsWRbgWg#}2ym_T-mX{E$D6PbmWKBFhjGxd=sXq=BZ zN+`kwK)`^^3)CTi-NfuvO3pTG1-6}I>#cWr8z6J%ltkV{1R*H21&uz!86{yVq`|t< z*;SRJiUuFD;9&zGVv34Ngp%C6p>;8BcW9dA%p*9QQ3ME>_Hfu`w#gLt~&!tVXap3wy+(EP(ko zA7i{nd6gNG(PPol6b6(I7~w)9j>q5Kii|hE%157Uc=YW*%sXFu7JySHPO`M<`8)sc zOMLE2JAC&kOH>_BEuUg#euySY;s1i(JZZ;`Axbo?HXgIDhFp)!+GReBy&2X6Mo0$D-x9j_bIN z1+3#buH*XWuSgDiiuLr_^nXkuhs*Z5#)3QuJ`9)rtQOEZXF;I=v5 zq3IO{t1<)2l40K9lVH;?6~nTiBQBwt(;Vm=RSC*dHwtgajE(5&6woPkiVQ~Avb&eM zoF(yPZ!%@v1nQu14p5d!)8MwZQ{2Vc601ydX2lp$)({l5J`$BiC$TOIXl?7!QHx6_ z3n2zg2qv+!T#6Q&-16G_EFRg4y~eXYnWeZ;r!a|C;aYzPAZ~o#r;#YU5ry((ZU%X< z)i}ADO?JWcyPdS0*ksW~`WF$<5c2+3A;)O6L=!^m^XpA!Nkxeg&YaKgHd7q3PlBt# zC>l3o8VZVDhpNb&vMR;tN;D!oT1~%GCLUFc9spx3-Z}K)Kn)ZC5+zk8t)J$IdE-Gi zI_hw+r{D-6oc=A5Q)8J(1pP%7`w==gDKaywmGrXXKDEqUwQI* z?z!h8ODjXJ-F%wm(8E-{5-ltLX0|=Y>{T>{J7spAZGK6{$3RQt|ggC)Bk(nx)gg|bWR#0f5or0f1*PyB) zy5sPZ$inJ8dVR!Xw2!TZbYho{y&1Ne$LfN5Ym;#M8Y?Rc49gxjpW0;e`90=OE})F1 znyaXW9Tparn2sApySvzVOJkv28M4^UpxGnDAHbkvb2gg~{0ESW-nwe*A zFvRGB8((^iaeto02VTnX)LBlpGd8b3!}Z6$!o}VYI*OvdNYwL0>+#`${@F9I;S=<` z>OyEH*j`0cF-4Y_FPz3G%kJ|xDUhZYHuGt8$mghzCiB?50pLkPn2u+YKdYiu#MEW41rV5X5@VA1 zT$qZ!F$}FmDNEyl7)UoLQYn=gMm}JKb?BnPDaE*US;+E=)DU0m5i>BHXFu7FD?`ZWJz8>c$#S zt(X3D5v(TEDhpRW;2W3TgTBp-GmXXvMH3XR4H=ScvJ+J$kvx(&B%~<>O%t+UBr!}> zjFd^V4@3-+EUL9Z(ME+6K_x0A-k0}{_fTk)`GYZUPxL?pPn1r%ju<1Qw!~nvpkx)g z%#Kr|ZN8}B!TTJAZycaZ?)(RMgl&Z)lHV(eygm5z2tN9J0i=vMim3seVdZTT@;T=m zt#jl*We1%xN;qVmhzN{wTyP4b;^B5{ARxPvTwXx_E(@pGy+wAS$-1EwIj*nbk%%O* zLTHHqUI96Rr%ZNAshCAN)KOD_m}Ukfr*C#sVTH>Ty~Jk=P;J`w7r6?#|GQeDVe84SpoXXU=2xEOs9^2P-MsAlr@4CT zYwVorP?#CFe$!1gx5Z?#&b4Nd2QQtbZy*wJTTk(YFBbGnq#B&!o=Yo-Q&+wyv;ElPHE1rL9MbDK_ewKr|`+4VE-@q3({yty%#AAH(xmTcZG-W8k_WH;8^^ad80BFNqulsi1^5XM!RbcbkPw@Vaev$PN|BBUdiTetL&VzrI zBU>V5iA^8K5ins=X*@Q^ENzx1Orz4Bs%m9i4AI~gx#xfhmhK?)meD3hVDO! zpeYE-5^L~*+~F>ITvIdXmaNSU7?hey#pJ-5PCdRXsRL|{n>3)VBe-Z%ce>J)GyJd76iVD5nG=GR7-8_ab612yTXdLVl}fCs zN$aWGY4t6NC zVb_m2f94d08WN)C#Oc#K|J+lYK6{3R{v5^uzQF2==wULRCE+!Jyea5(BE@t7-78cwHChTQad$`(RwIzC$=27++F@p}21t@68 zBa{XmYCJ8|W|p3>JDuFAEn4b0VR2=N^}St`EdYfJ4P|hYMZhk1=nWL{_8#Z&KEd_p zHwX)hT-n@Z+UpX1q;54;r()Pz+-Q%5;Uag|_i(CD>r3iMfXz+1!zHS<1$uW5DBCQK z^oIk+lU-uf!_0RG`!mLSdl=Kf=n_AjVM>dOk@2XdNQ3VN?;{q&!R8(dYbWVmx|glZ z4X%9tGc2u~VDZE}Cr_MW-;J2uyu;vJ0h1kE(V^(g5&e7;v*%7!_p?77ICmPQD>g6RK({T0k$|j%;C+f_8m%M(4N;n0EDYwDOr~7_!k0Mx;Jx(Ep6ATV zy4-p4G1jkLg`LRC;t8s7Fli%A5@aBV5)4WlyIC;z0f+Sb!L(z>)RN3C>J1RWtl@KBoUKz1RbO?C@YsthqFtENr2DGKPCEHo*PHae|4 zhr&?Ip!>2Afe`eeSu20Hp-7XG1FsN>zLu`B`7dY_F<8)`4Z<0d3qb$`KwLI*Pi854 zQUoA!6iXD2mprc0bU2S_L@f>EHEFYG77Qv0b_kOV)ZuTZAYxgR<^utg#>%m^0VpyK zKx-}VcBm3pRHMnqZ`L@B@f1GuBy9|Ib;Q}sUMm$C0yc?bpwetLjfPS?`CSIB_Y(Cl z2;?X&fQmk?v7zs6S|YcMe~x2m}N(h8`^)EO?`_Zr@?w9DW4+27!OU%rbMmlc(o5c!=e%x>|q z$F~{0`0bpUU!i{S8ejPImw9IT3hpZ*_=d7N!|UGg5Vs%y+r0N@KgziuT%*@5_?>60 zVc`TZJjU&<8jc05-_<&<<2n|wx)1T)fBtXq-+t>;{FNX6ZvOk9zrg{(x$oh>{J;J? z=70R-{SxIyy1ub^S{bp{WEW4cXN-Wl@4F}xeNU8pZM!Mu{VP1Mf~A^>;L4h{?BjV zD?k3dyzdj&2(in_*Z&dz`rrQ_c*`lx=A_S>{R02}AOF+*_doMl_V`z+j!U7?D)Wu- zS%iv;biYtVjzAEPeqbvgh6KKyMT6FgrfriL;ZkG`iUbNZ^lS#SmkKN)16m1a0gY<{ zHrv_L-!ulRkWPe-p3&&aQp6f%HS>d#f!1`={35z2O2@b z7*BBCr#P22d4Qc;%*W)y@)5KVwh{pqV!py%SaCOangnF`l%}9GhO($oXzI46nbjCw zpsl8LB4lN_cxH&C&R&i8cn3^UHzG4k@A%0W_ioG>keN5N1&^A_EHrfRZbvR-9LP@Z^#! ztw?Zt2yH{Z>d-GMtO`lgDwJ^7Y<7aEw2T0eLjhI^`z$j`q{F7MfS0(YPC}X2(C;nN z4T{MOo;)z689nZ13(9%PzNeClvh=%0YWjr>I?FdWqwfQeU$g*95lrN35(Z zF`OJw?~NFA`?Ph7G4nLD@gaP=Z6kgH-DpuRx#5zaQvtdS9PI2ccWMokfu@13A(%i+ zD_5c_MbHlF87c(k=ZCn1mhospT{}WkvwHd@-f8NM+v%K~HIX6|;61~I3Ny6menku| zb{6Rv&t0e2m^Ar)F&r$U?O*B?uly9M0L`okSnblfDKx!G6O%iuAv%w*9Xq#oSUR&zIUTbY zCsbj^=5rgEo@MRgxy0sb)m4To^UPGFsP4wFkl0~CTMVGu84<8miJwdvk4E%*!*o8) z-F*pPR_s0V4E6p22h$cGLKejpxj{i`51VKxr$Kpo-HO@=Zan@ZtF>eC(s|Y%zMtMg zpY1E_+_-Tk3D2{IVeZt~wagFa*c;C%#xr6pQXF~OI_eOUYbN3a@@)yer4?|tj#G=O3F5#B!2<@OaGb;i6(C0j$rm5s$n6!B&Vp-q1J^D5CJKvdEQ$rMzuuqE#YZdaRCU zV!E$Yj@y-mxS|uR+u#)WyMMBaeYUM zbRo~?@3G{Vh8Ug1L1T7kncU6U8F}ADg-MHb>Gh?N4xEK1r1vb$e4uvV5_mqJU&QQ4 z4jz1H()RqWmN6`!nq&Ix2Dcly(BY^W&(3B`_tXMI+tRoJ4?gr7-ug{I)j!W~qT`@4--h%37{G0#D|H!voTp^WLu;+18 zMdWv{lxtJl?%SJNT;rdwdMEGZ&-~^8kyoh4`S<_85Apl|z5kidocwnF@b7;!-}}yQ znI(zkU@3pi4tQosJwra%JXR)-i1R)gmW&LI4y<+%Y}YG}-wSVrGFM(D%7cCr4A$ ze$r_&N`nuej$9kk4NUe0xuOhkgGx~<*Z2fUPxrN^vXOq`Fm)5ti2xmKDRqw4?T<$E z2E)w5L7{BPG-?hUNz@%p8}@e&81@%gSUkyo9hguMOv$XCF|8fC>?RSYoz)bkcH|+kB*rzS9;14#`QFHBkWftHU^f5LyDqcJe|?)&r{cd z{oN7M@eCa`)>63wJJF-8x^5rX+xXDlYXzjPY&2#-=bd)sjMM}8H9l1$X&~nAphaO)2h>hgCE>NODha$r8tkeZWmbkZ1SZ}waXty|)22;M)7FQ?6>OtU zB3Kg?vo7jS&sGj7!R3PCU?z~&Td*d^5u?z$o!N7 zWsbW2#gI9RVtdK!*|c~O)k082q$8i!2$N9;?`;wwaIJiXIegoSll>*+Zwr5RN2Xt zV}Yj3%%ifD*V`P!%<)43!b97T-v4#&Q`3v-%q3=H>w@s86p9=(RMNPjZM=MU#Pqyr z-KN(zP5SQ25yhy`!b58tml`}YwWCRnVQ~kCES7i=At1#4ES6@D8RD?g5X7+-j-0yq zENmjr(Z+%zPbgs@T1-`7ZGqAnj1?i+pbw9E?gDw}(lR1E8jUI}swnb>pe(MX2|TDM zFnf87-0hMyKMf|&H_t0W;&bB?g~BI6IJhQ>_2AQ#JK%Z@8LN=omIexADbu8}B2-$F z1uJk6eR^J1YRXbkm5N?v>2)mqQYZ96r!sUaOSjT=JDN^u7<3K8u1?=yy-Lxm9CKa6 zLce6#DJV>S|Da!c(y}a_C0aqUX1S4Rm782fq7mwy%7Z zuUy%u>{?m07VjW{W8;}m^X^~!9R0gq!Hd^Qj_bIN>)3(yyIhLWdZv3b`Y-}Gf=}OM@BAcB0e3y} zE&S0x@G^eoJ)dH8?h*dnJ0793p4(sfF#p@%{(0gf-_D2VS*`9$w(=oagC}|6Ts?pLrZbOZoV(@&A1KZ}PwY!h3M{ z*L>^NzsL8wd-wzQ&+|a}96$1R|1R%+|I@tpnS1%3mp#fmfB5zMKfhu5ec!akC;sZs zaPjLIb6X5hKr}VGmw%1F^|@c+ul(%0*)4DKroZr)`L30UIm^FdbzE9Op&>vLIgAMe zRBmM*S_+A`85JSscHkr@i%O9gxtSZ=_9B?peXroHvPFa*hTps8U zaS<>&O*u{&@kERY1Z8Q1N8m{LYN(HNtAY@67r#h$HyIsioy#086r;(67-M!YNgPHP zFSMEEkwqD!(|#jFjIr1x26~#NrEv|)<^fBg6;_-FP2CWDOhVP6dn!UyVcBle(d9Jl>Ik>qaL|*Pv6;F-D?k7-gesB?&43a!atcdukVpo|tkv~hT z-k~=f(k(1A*PuHU+XuVMTuZbj2@XM5Orv2OB889iOeaP4W?KiC5>}Q@GG4z))I|~s zIw2%D$Y=DpQYg<&Mfit?H!^q%+1ZQzPXc* zhc_mU6?Hmi@7%e~;(aIScNeI~6Am^vi6%0)XzBJU z%t3>mHRx`a7&Yx|MmZQT9!)thTuw|hH*IN614>i&d-6HrDO4bY7GgnBcG86wJGAJ^ zz;eN<`v=rt-NWB(81L?KW`2lo+9X1+-E|+M8+TCia}4Jenayg>o>-yXJ%HsQy3->} z$1Gf2=3r-=oy|QKW)@W}0ux-jo6dXJjA{23u`n#3T_a4Ucnb8~BH9|FpW#AFyK{hd zQ+jhP&nzM>pG(>(Jb|o9sLZd5 zS%?=|3KbM6VHQSnC{h`5^AuXi>mscJq6k-!?9K_<1(lqP6o8_Q(E9B3b&)LCs|Y4y z1ZHoOU=LOs%0kg8vna2$&JMH)EkV9}kp>_VO-u(xr{f4dcUweBl+xp!0>BixE2IwD zZ71SB-sd=F1n{|opbElRLIDs&X;KkF2#8}f|64(jh-4%}(DIKMh%wt0)qy_QGb@x8q4-Z|Q*G=v>K{?T`_b88j1eU;1G zC9it(i#Rb~@^~|5_qh-7lmF;4eeJ1Zmvb-vW?tM0xMoHhNTvF#y!_j~pF4N9`0BwJ z7lB}K%^g1U>p#!)UmPS6TMsl}eOB{Lf8uStJ2$~|KI0ByNkTzkN-LTkFULtKl)=Wqk~9?$jiR}NBB?w=fB3w!>9RMzqrot{|kSJ zx4rV4_{6jK@u&Y-m;N&!;y?am$;JpL1Zhfi(4h(Glo{a>6I{$YOO?my0d{%5|0 zUcJp@k9`q!?XRMM@$KjMU;q4{LXWTGD0%qe+xY$qQ-1ximgko)^1XXs!c6Xv>dNQ2 zbNe>0eBe=R|F7|%{P{nDfATbc`<<`DSm77#UgIDC7eC4e`g5H8f&YO2^ACP2Z@lNL z{O$k#m-yr^|BBUd6-v=BUWWojFa?v)QpZROsG`Ia1$E=H2vb%>4NY<#M64A6F&Y4C zl1m}|U29FJTM0A8Cs)UGS|9ei$Z@_x+e7zN zVGNb*&qC*8D)B_bd6y$Fc?JS#7cP!(Gsi?j)OpaA*fjxgc^*X)i5dbSpF2Jtu3H2O z715})KdjBs#oD!r5oE2!6o%N=6bAYoOJy~om2<=vC_HEdku+~@G)JyCllHO1B@m}b z9$fg4g+yafszs|vsWeM-Lu@;tC=D}hnEE7Mru`U*%)CQcoy5($p3&n4| zL!9>vi;|tKZS2xKliCx@K7+-;{=p9O^8}gCxEtz`q;Sgw!px zrRsIrUf;xSLU8_bh?F1h?TzmE^ z4?T2=TaP`?T)9YJS3Ljp)4ckjbIf-a*je9Yt28X1UIGH0(<_**14dVFGPg3suJ#zM z-%7`1ZgrJ*YnL#cvD@z9XO5*acT=pMg|Y*_WvKg%;&b@%1XtHAEL0pEY%w@@AF7$4 zXJfo~NjNpeFxuN;a&z@&=#o_L?38T&Je*WBe8Wr zi_oDgMhO%=iES}=uZxI?0vd=qqVvX}Aw$K9guoG8{E&Mj^NWh;rL~0ck^thNo61WU zQ;pIQ$H!5|W%1C<4~Hl)wIJf&!%#Yz-WR$RmgO{Y-Fc~hk5q9rOL zuGC1A_=_1{?$f_>B(e!$Tp&bGVKcDYWvvhtfRae2oCCpuDrCR-9F;$cIATy~z6zu} zq0i6F$ajb;Jx^S6ppXj(vY))d2bC`lL=j<>5+|rd8E_(mMHC7tq&uF0r~)7t$8;88 zl#Y;&0cZiHA08+94`GIhkOfK1@_<2!R5DpvVsF)+1h5WwIL^;niI{LgVkyKg)sSqQ!h-n`K-#1E4_n2Au!im-3QJeU1wHXI{$p zykj0UKhMIe-@=MpJJHDUwtpjO-w8WYFUco~zdW7Yk z;<%3MxQ@&6yIv7=pK|;df9J3K63?Bzo4@qu{uloIm5(z&+hJx(e&A34o4j=8Du3+T z{t!R=(H(yM&ad(_fBw~Mf8}rUSoxpu+CTW+yma&O*WFhS@w311lU%Vc;t!ph9hQ?AAUPu{ZxnB`y0IfFaA0H;^$t(8=m-E%zx^C;*bBkKgl0`@Voi9?|l^) zD&(c7%a^W8S?H~SDp8Hy4 zbMH34{O|k-|JTQ#V1M@-5x`AZzjYNbTzcfs^0)uHe;fPWALD;}&rkBoKl4U(vq$hX zxejo)#W{~}pXGC(ewK3K52hc^O+?C3Z{Fd~rsKkEF7dKgyqF88W()`Obop1Uj>~FI z&stE1*5~M+(V&AOmvkbG*mn05S8$$$b*fh_1UdrjC3VzlNjb=kZwYXD#3hB7M)yC~EMq?m)lsG!t)+J|M zr>vONvm~JD9FIt>uBbJ(DDlpteL$mgcO_)J7NWSa1Qr}Tg)LF!m>~*Of^AQU#3Zr= zS5s-28+0jbhSr8C5f2s8Ha1No-OnH@*6xy>hnzAu#Id|y{ z(}TdB8_y6H`}nfY%sFfWI?vvbl_F1aCSLv+{==JB=y!<>T@40|&J$BjwQzM0VJDmHK3$_*LxjM6B)bhzu5HVGA*m#=}ZS-bZn^=wS^ z^VtE1qpfRfXAV_%(>|mux$x+V=zQ%Oel#W2Gs=FSGxuF&_2e42pMH)Tm#@(6RKoMg z47Z>nrBx7He2BSgX5w}M-ZAX;(`VKG)&%Eo;ARuLRS6nA4r2^BatAk?KksNEh^x^D zmBr{ZK{WY(kXYBWAw>pf&Lds(@jC(S1x4NTaYM~ zQ4;laN!&1K3=qUkB1T_?k0_2Cab~FuB_|0uB77JFX`2F3k>AJ81D?`aN~1C(t92CK z5H&Qd7qN*fTttP2G!K=wMIVY15$P02lqj`alnGAUHVTv>=J;b?e(P{1QhI~Z5idL@ zg+BbAv}8dqCP#9PvSoJ+7;VMz6|q_qvhXO@yxwnpUAa*ju(A>`v0VCZ;l6F`6#(g za*`L8>Yw7Fmz^S4j~Bi41pi9aaUIuj9Xqgy0efPR-RoEQ-~Y`2%%eZ|xA^z|(rK8h z`1mh1oE&JTyHE0~pScdeCqH%t^Biw&|{4XFA!V-Mq=xaLDd#N>fa6C~VQP z{^V6|?Tzrmn|$iVKHq%b8l~y8^VN@W<6xJqZ|2!x5{xLuN$NwXqxZdzBmBuVw!gN-F>rmdyLU);}nTS0+Qfc|c zDeH#Iba`AACR?o#S;TTiUHexE!7kbLyp+`6*h@)g(=grrjsdzNUy3W#P!n# z60=I75ZG;YTSWyfV2jLEaV{iYRDc|h(7EFsF($WE)H<(=2v>oK6~KCkAq~Wuw!ufA zsn#TvOu%n5eQirgC&7q>f)PuN$BQ^c=lI+sqbmA!OkrLRA$g-_kWIajz<2 z;Y2(}YdY2vgQpd74Um|U&sXjv62prG@5NQ7iNtiPjKRB>Cgee(b1nT|kGZ)%?m%IT zVmdk?D2q0RUe%!$2Z|xmD>6WQf3}b57mQqFgrQd!1lMAGq}?A;4Er$I<3*3$#Y(qj z``Qh9CkAPIxA%6qa{UIqPKW4XI%j8f!|C&DR5oxh+NCNqIs`gpms4lXrjCH#x9Rxp z?~jt$sR0UlGwKB&?Ldi*Hg69=%Npu3SB9Ba~<|~w@|w~ zl*^YW7Q3u!&C1dmPd#^&%66e{2(y}n)kQiTO&P{XygL|8*gu%i?+zK-l5lW zJE?;sA#w4N5NvEop|YzaI%pE}FS}*iBp~SQq>A7P-~kXII(Vgt+7JPiZB-DpM8-t? z@$y;_Czcf#W)`cwM0QO9F-qJ26h#Itfa(JIcMQ2{gEsgeLW*m%dnSqqkuR3Wg%FQI zi4!Z(M2C+ti#0I|C{|*0ZFbt^Sey!21Fi`ow5YtE5mb!w86{RTg|G&5^wMjMSI`O< zG7xYs5S+^2A5MfpG)?Mm=#w~YY=JUb;O-$q+KmwopM3VoF_nd)(HLbhI-(K>(cpr3 zi!kDJjRX@2E`rZaxr~I;M3=vhIqVh-Mw)0C6|sOZAw3pczK{Wmw(&W77?FLZ()_f~ zZX#rkS~y<8JG_(c1jwQf3J65}J zy3EJN%3FgdOfwHhVizK7N=HNy)|}7ctIm$S7?I~e)Q9R{o_~ zB5A!;g5;~rNlWL9!ze@4{!joVcc4s@0x%UQj_bIN>-TIO*D=H$X^|VCKL>Z7`vrdV zKmMycGgzU&FeJ7OUwC#4yYx-`SAXo4bbCGi_@8<;wx03Hzxggc`gi_Y4$i%b@AyOC z&r|RJ5byt~pC(*?8kR3He(WFfU;X9(gHP?0oa}5+`aP7csJaD;9>x|_-8m|yk{d*c zpy1jbcinT5`xl4Y^T44weWx>x88K8$J`0jt_f8zi8pZ_wy|8)x#-FfbQX~n_K zO~yMd|7z87DFE;CkILv#%46{4hRYEfA_Y+BNUzk%iC~Quu&lw$KuE0i5-kJ|L=+xq zQa8Tbk*`k9t4JL*tuoA_V$=rqYuKJfHpZU4TCqQk?2T)bG4y&}6pH=Pgq`seuPnxP z0h8Vz0WxejcSMpnT!D8EZw$d$niy#DvR+2otY_6pFiBad&r0k;2D0=iWQt%>FxX zW+!`Qy=$-E^OXK+qn{QAm>MBedcxvA|E3QWKciAfRqR6}6VLQ3l$9PNOf1i}U*65e zfDdGpeY6YF5rpMyS?aaoU3NeQGut-NSVb`{n6^m)pUI4s zqq*G_GEg`}Q~O%!WUN~s9kGxuCln9(E=3F7r$UO8QmsrhkvPuoRhkpJZ_wjUq0@PU z+(YWykt6rG!d&qZEucQycvOEGtFTm@XkY6?LK&1U+TOb)CsWhV5sD>`T~UeLt14ki zJlZiLYt0yvt>2_mC>RAG;biqjXh8{Q1G zoS780&23qK6j7DAvYh{g57seU*Qbam>3aQGSkR=rTW!6uvs=vrVI?e~ZTvvr?r3ew zkp4)NdT~#7cAEP=mpA=v96Pf{|FgbI;GsDmBG%4P@UOLxKRgB+^W^NJr;e;pRA)6j zn3-+61^3&&yHQNBzsZN^4HsHR=k4Nye>v1daEF>YM7yX>50I%h5oRICB00xwQZDm@ zHg=(r!$G}jAh$2GM>eN+xX1Pr>)&7@N$*7GR#z8|?eBO;v);`H0e%`f@3k_vK0TwW zRK20+o0LDft3^btwtLV=l+j9lG;wgxe)uho<506B%L5X2Bi0Qs#`PArs+IF>Nllk2 zRSU|INX1(QbX2SF#ZH9Zux7T2ds+yFFaOX&;z}=4Ejwqgu`gknd z7Fn|jrkdlWK`|Q{fz(R`S#%9u+1+kszSHURZ8XUKsLmP zjDw}k^-vh|5me0TBTo3LQ?fb}^GOp1@G7!sjR zNML~grIjd(g;OvU{V68<^pUv`Y-VJO+r>jBUeYYoSF$els}BiO9FUOFw*j2r_=t3V z6JgLGH(~eeG~71?S#-LyONumu{c&+B1;JMunaU9oxHpGf(_4lg9deEsbu*kNU~6a{ z8Yi4)>8j@ugUqXLcwCy=#AyxO5#r1anfvY{a>I+$4iyE2$Zo|iqOgMyC_f*D13?d6 z>Z~6H1Fvr~QyA!I=>QehK}uZc*6Xw@CBsGav$`x$g_)P0d?ZONeB5z=zrcweEJ5<@ zyghO)5jOx+Aw~X;S6e(Zq3!<1Y^aBjq7iuG=PFhoYCyBC>6>C>VjSSU2UK{WqCz6M zu{Fgjp$3U-(R7U_K79Tv==YtjaVaik|K#Iek&9KY*@8eR_?a_q*Zk`vhEdPpVtE4g z;)e{HHPkqjPTCRAA0ZH0y)Me1Q?wgkHX1J~F21%RrMy`!ZD|iC3P4@r1c4A{=s@9x zm2Ed^3?D*_u0(cvf324F6R!+%WatdIGJFvMHd6T2Rh@iJP3%_{&f5Z0YeqTfGU(ftvI{zIh zdnAjEzdnWoUTd1|uLE#jxpkZQ-=uP{emCX(&tlJIug}z%$70<3r{77wKEC>p_$_!N z0JXZe{K@N_Gj_@Si?eF~UN>L+`EB-cdh%Q4yskW_h+TcTf`9r~+5X_S&+(F!vt{2b z;o9lHe2QA$8Ear5O>_Z5eu6YXyO`*U~aZOX&+Z)En@Tfg2fZUXDUN-zP#V&vHJHO80zdXGVi27V( zKQH<{4nC~B?tR&5^83eet?Rele|l&!!7keU<$?c2l)B^WuWm)OA}!H-gP@sYEqDx{ zcbhCON)lEeR<2kJcD78$_ch~OuryqVi#~F9*l8EW!>SA^xq=jh$#D}@6a$!B$kK%B z2EXhw^|cts00a1lH$mYqFT9r<9-dNYWbQCE$m|l??S>|=HXPJkKZH{(9#+QLNI@kntJsy@N7LvC5ZFr6qPxj zE>yj6Z;{fPiB%yLqL=mQ3osa&15vsFI&&po0&kY^o<-DD9g@}T&RwPs{ic{n9oDsl zmJZTwBr1(X#aYI0M}_aTk`3({hy~{p(qeP9wyK#&lQQGx76kG_V|om@{3nAHi>^Di zDVX=Wm5H~xsTEOWCqYV@uC>45Md?iHe+MjeW95J=DLorUrux=IX(-f>a! zudc4-Njg9FFfVvkZ=R4vRM4~V4C*@Cn+bi=(a~-7eLzvS9HM6*cN z6R$rMP%Pj-O}L@jeeud(Uq<)7p<1>?_z`iYH5{O^$nIS`(kdHf^m3i@@Ej&Ol7@NU zwL4A1Bj6SPQadw{fp@884Zn0jNl!jg=YtmcH()yNt5NC#PmT8)+tI7#0 zbrBhwh<%*|27-@CI)yO(+HOIcrzB!BVI0UUa7eB9H^3z%<%$dpu6-`-=kp z&I~sbyTVfasl~CYeY7{3L+lP!=Dx7!Rt_qgqHE747`|81-y)emvf__!vHXHAgl!S{ zSA^XWay0(KrZ^BnN^LOQk$H1G7$VPJ_e^$ZBu8*0ykPOiT;05zS4@dc)j*2ZYvpS9 zJDFLwnrs9i+OHXW>ah$cFfiqU6X>*C>M{KL@T#8OV4^IS7lVli4xp_a3}WZc+Tbak zT11G{_WCwL`ThBq!T%$({^fbD>b&$`FLJm#WpC{vzIgibO11tc;+0@)o+!Kh!Sr5X z>92dTp9fz7RLjXsDqu9;wuOh|eTJOZniqS~n_02ZiZ9;r!p$8cDZV>WA`1wh^{4w+ z>TI8d4dX^JsU)gL%K@HAL3Xh}IoEGgf~?#~#eXY4=XH}eeGMsOu12rr+B73Xt8yk7 zTMGUfv~9M9uAg_JmkTlfCPC?ukV#EicE8G=0Nuv|V{ipkKo`H<&Er9)jgYpJ|PHZvH)xhKM~=seUG z*ad@UVk|S^R9%(2rDJdlXGSa!l&pD9=N7O~>65gBe*!w7SVJ(NV4o44v$ZKNxQnH5 zHt#+3eQ9m7T%p6qX+4@v4c0MpMs>WYil(`4t}@##gTvLl>3+g#+vR=GdeBI$YgM>? zmsie9m0|=jL*)HuEr}>vhP+}{Ou&uNyTW{0!QwX^V}rOTqiJXsroiW|AS|7xki&ip zOEjEx>u*SPNfJ;#eahcnA!zV`2CefBdLV(Q`4vVK44&Zo@$*6rYgRr@C^40G=+cgV zsxX|TjNVV}nKN}1u_I?VWN@?sJ`o%c-=GnLbWhXHy|G!<#C@CK?1LGhY*uw7I}L)n zvMf`m#c-p&=9q(tGkgEjvI*+iQE@0j#V^sIXbVe<)jqRth(9Y74-cBt9L`+Nj%<8QT3QGBT#r<>slX)AFDxigpe1kbUye7T}kurA_+3#C5 zdi<8hVplOWOLh|^ih4%4c7ku$y*qDd`lUYzn_PFcj5r=LSA#)L?OZiD07Z{ZbA$?* zrUE|Yp1K)Zaz9nsr$$>2w`yX4TSRKAxuGe`s;h1E-=N}2d&fByG4&hi8om;W;oVPW4N2zs0~kG=F3q~8zLI0PcZwPgvj0P z;X7+}K`GJn?pOVjz&@Jq$5?!K(P+WOP-ue=DVP?eo{wE!6!3t(>&`_^^`YLDkN5^? zsw<%}+vPI=#3L@IB^k~~kOM>^>Rxc-?AKs1BvYUu84nc8O4S%ZO0xPzPwqs`R5w!KJ7Hm*@dbg{b~pU103U z1Acj09eg0~{G{ylsCc0|>-?|c(>o{s2=Wa}4-J^#aLhvwsCB#Yl7?M0Dq3jenkP}m zw{Y)Zgh&bl8MbQ8kx>x|6%%?jo|lgPSJsY1B9-nJO!&n83zoWhvT5eQ#l#jEHd2GA zOr-=X4f46Hz85BmzmW@&NhSA}Q0K2|j937tWWh+K zA&ehr-w@DD6RghCeR8n^6eGr%2{FnUpTNXZ2;{mUw2!Cc7zj-2v`{sv=%d^zcuwO+ z3HiQikR35vQ$GPZJA<>*$*JB<-!3a{DAq%YgzfFtC58tcDg{12z0A?Jb}sw{cZ;48 z{`Ox4(_A$*W{t!e&Baw^4IyiNtj`wHZ}6|>v~SKVL%H}x0&XVorL2iX;b_Z;&t}x- zwG~c3jU9gxXlcn<4P?c^;qkEgP@a%x(CkU^Sb~)RA-#QK9cS}rTOx}( zQo;^;n@~EUuh~zF`5t;T5S;XzU`~{w&c@kf=$v&>er108>~?zkP44&jOVnn5rjKc@ zmHme+O`wF<0HRPIr!95sc0a^7t>ePH9D$ z(H-tB&b?;`4$eCxt|06KYQA8#g15$=5RNjk zqed^w1a|9RVX~k9;S*2PaQ%5-{6s+r)=Fd`%x?bz)UTYcYSH8c_c@bYt_QUHWiYhK zwg+wQm>7*B=Y)LW9Wao~%=JTX*R_5!n}ZBpkiZ?WmnQWiPKT{>N}5`T1_D!L*L#=q zu_1t>Cg7Q^S#JG9pg(e?T>_LWbqsstWSi(M@*Y3?z%zA>Ks`MDv(&mBd=aQ{f=yoA z2Rc{Jp@{RZ#Uc{KVfge1+Imx|4O^vAAwUD=I!oy3FQMCN?~{5FO&cK5C3UJA05a-( z*{CTh`lW+`J$bWLIIn$s$;ep{?dUX$Exh7M3KONDLyaClW8~INBz5bfRpv^%f=hcs zezlj5Tjq$bQIkgU1cXrwn?bx!LnpJ|cqBTXHJ$Nf4?t{8=lffDht>JAL5Exle+}?I zDg_z~AeB;##nF&Af!7exK4V7*_mX0Zx|V|pem@9Hia!oNFmAs|5aLG8W(Tb~=edBI8v0;(Vqnrt}H5!q$L$8yF#gJazJOh^!VFPp&ld zX+h;b;^+Sjt^TL`UU8RQ=E++XSQ?Yt&TJe&+JHG4u|l6eW2Wv)x&x0LfCj>o0RT)z z@NvdW99`hi!sNuMWY7XJmWa%6l6+Z=7Y0xb4qW}awd9{6>FK5K53xdPR^$v(6BiP- z16lvN=i2r|~;A7u8u5l4_DJ&}s!G8m^xp}h9v zcEofVKo$5DVJ>ZH=fifJAk~;6dj~{=xF5}Ml{2M%IU}QY_8F~QaJ0gpKwSM>2{WZQ zR1qej6qEC%w8Z?tqYdj^W+(3|x_5zt3?$$&ATfD?OXCbVavz;}QWCxQls^;ZF_NGd z!b9kMzz2v~|K47$0iuvQ;+%rIffQAJX<_2&23`!M8c411VBbL-gGxk3TA_e|Q`lWM zB3oQ;f>e2ok{Me9sKiZO$tJ!^E*MA{9|>utMdguoV*AO8ZZUj! zN2O9#%_){@CSsk+tGPO+S=bHE=$n2^*yKVpaT2`80?`gVm*R_FBHzbng&#ui@L zzf(FAXP;1&`1zSCO~08%&}&W|xs_>Qh8rds-rl!;Vrct@_4AX@j&n$f*l8e^ft^#S zM+8loq~!N)dEnAZYB{LvCzV!n4-U~!#1@gs zqpx6n_cTMJu5vU7SUJj@6Ln^y*v?^nb2lyFHgweIK{3bFgjZ!^aGB4j<%HFfuX(A( zIpS)p=p1&}4c{h=%368Bt#`WFRM7S{d(;qB$zeUO`KP~nfJc2ykFjEH5Vs&V$C@iY zqmHgR`K6}ToYIehxd!?D%JK0$sbKwt$t}s*Zq787%O(XCMLVU;dX83iShpC zM8agf+r>xLnos8U#}<}feBvLzvF9g;3T)&?U})>5UTptifULPZzRbSqOzFmCN|)ZT zX$sxAjwz><-Qz%3gaV$C9kMfoX%6`Dw8jGc83tkCp*#2^SW1?TsEyAhZ_{8uYwh1d zXZt=IHDou zQfuIVnqDoK*Ph|5>jXWj{b@L_q2H2r=crPpah5@s~cvTC3M=0Km88!UYvN| zG_kA;bg zMVe-k5fqRa5u{v{RoEYJ5Qh_dZyyUAUG|r(LI{z){hfFr&^;#mbftS&+ zCq6>r0^A{MpU%>qJtiXgkwEDb7|vP6A|>}eO`askC^!6_J_rQA5}}Ea)eLZU9zNj? z{*+#ldP^9!xgjyHnU)&Tco^WXAv#GNe#ppY9%~^_qK075{Q8Kl_x~CO|EV2+i`IS- zHYkZj8_dgvODBb^x|^D+X= z*(1Aq931SNhait;$Jx|C8i$%5as7S0Y>kJPN*rr79k8M-iPi|7b_5&Yhz!lt+=qtZ zHw`efn;yOb?{kbJvQu@};n+wmGAL>1Yf{tgw=BvE>;OJVD6E{dp$#pS55ER{P;oIs zuLdt8z@s8feo=o$JtgnNmG(`Nn5ywo{`jZL4NDYonH{Ie=VJsD z?gY_P-MufobM3>D!hui3@}Uz&JH~5?o(Rmt>Hsz7eIc@Du6mQ1FOWwl1YHpq4eK5U z*`e-!FV%{+M@iZ*y9@*BAPK5KZO01&idvH07L`TPxUtP-oIf0WhqtO=1?P zx4e>_J1fe7jyMfU*O=Bf@*hDYXwOi)Q<$q9H)?%g-w9gL>UCvh#Wfz} z$yRw7k`)_i?)(>(DcU;rvd(}>GBM+wmH9bh^!tx=uGzcqj|Y>^uB#dku-cO{61Kc+ zLQ5IHI^(BD_hj}=>6$SUH^qi#?2dr^e0z^p*E_++naava250F(xe!U&sCwc(s;nd; zOW|+f{QE2VLI)!%al)Y!M%&-UCu{1(mV2g5-O@~d$Q+dJ|Jj+W_1Oa6+%UG@_318l z{+L)+{H*l)Oa`Jnvm-HMf%(d}@t8C=DA$OAC$Z6=vNOe5$g+QC81tvveJLmxvD{Dn z{q7TSm}Co#0sWB+24ML$m=AWN0?h0d_{d;#iqKp!N46LN=M56oK_pHiqsE`{b^@eS zK7oTqBwHfjm5B!u_nj`Qh-L!VUO#%9xADrIPCcY%aDtTSw)bxOK-YipBt-cm`Q-J; z`9JV11ja`oPoVWtrqe+L2{HPr3Ifr7>woXTaIDgWR5Bp$MkO1@&}xuI0ca;}(S-0S z2g3Sfl{BHiU{thV%4SVG4gN1F1Q!}(}jXzvBjPD77k9%3C)8$H&2{_-ZJC;E{G_rtj-jM=m57KC~DV;YNur${3 z=D>wmsR;%K;JPElq8Xu-g=-3%YDL$|QgfqXOw7!7Kh0-s_HiKR8N1P1<4%J6ptQfaGON8qr@NLZ-> z6vibWi&^8TKiCCp?KG_Fcgnbh(6MKKDz6wCNL#|vZ5Tj&ATq$gbEr3 zO&1!YYLi(5ShE|~5$UWHN-ACMe}bHhin^ax)#WI(u#WiPJvDE^C?)>dlp5CQ1ABi9 zzyj?l>`?shVbj=rLqa#$8@L>&84o=cxtjElDAbpBS|s7Yu!v8uXvPfVS_n$O#xo{| zBa%aAX#La#^!zJjggYF7=W=r2qrpGE1vi46I-kuK+>4W>KtTqIT{B!)r$5jpjuZ+R zMg+1QsKJ=Mr=UFVE&n=z!R>JVBoeADGi=Oa{0cs5@c4sDfVOf&=d*dXK#fH5(2(xN z4>!Ls_6!(ybOHGx^>@H%Wjx;A5uK+dG%USfG`XHV3 zs;cjNd>;CrjT8`is;aUYPeUBS9%h^@Edq|drnL6M>&0Yo?gX(iOXx9zk16LbiJ=@004_XUB~yrXeXmvbTLU zjcs$5&e4=5tlXn)7Uhkq^w*}2uuHwE>b)zVVcXDnNE6m#fH9%{(DeRt$nL7O>p}M^ zq07uETr_3u01dNaw69eh{Vx^qU27LweCW^<=b+OEuyt4NOafvEK(~aXu67F29cWl} z9UOlV?w@2y2<=KP(4<9w)m+%WOV-oh0nYNN$wGW$qdi=lLyWvA2+5N^@yL{fQvCaz zw&=Y!r`_C@o(irUNk3&*%1LA65?nHUIadeH_0u3AfRfg7MR!Y0&b~+cNpy(k1~V2n zd;=AJXAIOOw4yLC{RJa5(6ou-f{_kS7zlbaP1Zy#?_VtUv0&+GG6YQ0Pm2Z`VZ{wZ zwenQ(uG0YXBZ>J6Q=mp3Z%Ix4KHLz#2Vs@rI<-SyWK{#p7YYb($oSL3?nMGGQ%FmV zdF$I00Iu+X!VPISsmq~S!i2Av21YAfAn!+bwOHDtqgH(E$-!P^A94R%b)lPhWCOea zLg%dT8#VCOCJ^lP9gW7{C#%YgwAaK9PoMh8fC*c*%S+YiUCvMO$7kO-#C$kufmIHG zU<|l@bXqzFYIEc$?okBTCAIOYVl~_^x-$t|TP>>PB(1o4@I3U_1uEH^y85@?f14`# zJoY;IAF{xIR&nxw@x~-0T^ImfW>>{VV6h%peC4!qW_!~*tIN8sr&1%6eFSs|> zj0i&Cr7azaru+Uz%xFlL6_KnXD@|o-$?ajpLZ`gJXR^6HeDIwgtVYx`>kYOc5&aZU z+|?YqNd=P|)KkD>4(^*^8o{>$DrYtK+C`N-0gvOd`zTv@+opgr$C!V0; z*`Qe6oXUUpFm9sdnR&MEFkZ1RFqa63w`g2Fi0>=F7YLOrR0fk>KY}8<_o>&w`7JZ; zDSIec`zDp+V(UQ@l5zgO_hf%TT^P`v)#Vr1aNXDNlZGcTv8il9Q7UyZhJ+9z2_eM+ zf6hE!X?6TSG#zGK2OcSf%`@@X`9};kF10uMH@0Q#chWX*Ge3(jF;y?HeJF7r{07+1^Bg1?z!}&bL5% zad~+)ubv1VQ9);sKe18E0@dCfrgiMm0}+DPq-*)MbhJZ@J-3j&-`d(VdPDJac3X$SK0+%$GzsEfu-kD*_q&`r^8eAw>%~n}#N>o5OZl2J>i~0}8rbAU=QASW2 zfK>|1KW3b60%1pmT8fyk|G8SpXiVVJNm;6r^-#9)!Pia~2wh6tWRaZ2XNYDNWOFtD zy@E47q{*&TnjduZgV(udB>cmO?I%9m;<526?)9~Ny~7zpeHss;%!|Y+HqOt}t4qdL zGh`kr=Ku%$+3FZ|jPeG>qh|rvE!G0zX6VP>RYXttWSeed2Z#E)y78Hio70Pr5&&jq zZEpPyvtrys4&PD459Q z(MleFF5h0~RXLomyHmCpHJ{A`ZETDOat-U7+eTkr;HUQoh>OY!8!B3`?dj4}QR~I+ zJ}OvOauvdInKGu2x`%M&^*mapfudi%+x^o zmf#TornCwxZ7?#~R|1L5Pk3tethL~F{{gBv)|pnhXt8_<)mzYq?UM@y^r6YXf&_OU z7rp>I1s^H@s&b+&=VKs`+AAKR4ppmxETgGw9s=7Y>0ab+hvRnAK{&MG!vL%Pp!(ro!y^xKHnL<*1Nse`>MX>VhCTJ4ySCfqrfkS{0 zmVs|C-%|OQCZfU>T_c`#1yf$A54-+0bsz;61Z!Rhm4Cav3|U}b-?ZHGXNxVhm39>_ zIab_08aklTOGd(X0{CDl;y8iq2@a)mM~kcJ-5X7oqjr{BR`aYz+T+ys#h_N>qVkma{W}Xipf{`NokWbsB7x3TEop!VHog zh44a_zWe{X`EdScyZ65~oyjEkY0}}`Q8^9BiOc*7{?cH&9Qxk!UI|YHHZwCohEO;t z?h6ic`g*rAn7YHSET`V4zC+p^El+U0DP@p9h*wWg3aVXpIvCJ?)E+L1@T}_;Gv&5L z11Tl)&5dk-Qo=!0l#um=R>{h$mMjEFHZ1U-3g-xs4x~0ueu$p(uH*s(8-5~(Kipv` zCZ*Do)jGsd?=U5orp@u7#mx}=*LKMTwP7tpZ3colT{|N6SMU&kocfV&YqLm+XaX=1 zYF;pcx{(f`wVw4-hr}nHn^nLVN4m&AUeBzARgL+bj6|l}fuuBVoUiqfZm3FJfirnw z)i0URKPdgQYO*YVA`yAKE3Vyu2yjT_#EFax2u+UU+Iez~+;wjHo6S++et1}58HyX$ zaMpBPr=Ubld1>YNsKnkYZ`c}P(#VNoEW373qsENJDylweO2CSOE#N8MIO!bIM@X8} zkb26Z|D`*421JZPFGV2Gz^kfF+=#yJ;3T@+&Fl4LaH`mq0V#%?zWCV1>YgUNJ?~Eb zQvc{~TD_rD*wmLZCX^EO1G(XTfERlRDh>mIkAKi~aDNE>&tI_Chj+qlZHI8*+MdQN z<3fJBzGVeCPYI01A?-PzXs3BfdH+f7WH9xb;LftCQH@t-i!Du|MZR&`KMrJ0TcXZsYJm~4Q3P%j8#;VKC z|4z(yqOYv&k;aFktq)U);cTiD^NZ;3*UtWS?uCMhY2)|Le*fZn*%QA2w)W#wE zU(}~%;zvgB)Ow3N;mP$XDkI^d!^A|_8&H)#@!6brA;iZFZUGa85zmN zdPkY^*)O&H3ZEu&KWlZ~AugCEt-_v92G>Yfi3(DApjl$m?#U; zO$c^K%aMO+Uz{RB%Vc|s3?oeLyb+_7r;4-&Zwc2K(Sl0~b3wi@9~7s`F;S6A`0jmv zt{aXH^f2{4B3a%@W4q@%O_x6Z%V*$WDV}PUT}J$1K}*r+Au%kjcR~=?a7DSk->eEK z;sMaSrGFLE7?CiS_90VT?#@#65hxn;lq8%UMZEYBvAdr&*Gn49;0Me1`~8E60`#co zKWO!;!_8bZjxL|*;YUVK^4#^uU^8HeGPh`pKL&Bls(D}}LV%uWZ67q=o?%U!X2Jxn zsvo_CXol!&s*05~;MqV#eO{dw!PzO;64UkdK2P-*^uM@ta5NL3I?aKs^AVt&-N4gxQLf=Gup z*E7NImcZIRCg$TGEE4{E(p#3FvqAxx({Q!hxY)p)I`+?|-b z7x(}cu`ES0)f&VC@GUk#h5du7Oi-qWqers(B)vf~mqs%U;%Xk!9Y4wYMxOVceaXN?T>s)vS_6`AqF!Q$Y}pl z>x>3sdDa&1W??~mbSqC0RJD6|QON_Tw099%9jWr!G2ka6!ZH26D+xUn>k3MZe}3P% zj8c}VhD^CfpPRGX7gPl?<$RU5Ks1hc(Lz%LfRK|yc`?(@b?Y3JOx1>c!>Htt z-Z9ULZCqfAy1Gt`s=@hyfia9IXps|B9J08wYL&lV=RDFKZJH+*=1$*c*vv_l@l`P- zV;h$t*B~)tD}yT}K+lm|_;QR0EhsaZMnFCuLF#hzu}{T zMb|ilZ2IR%tra|mwpt%}+kh!as$BkEzuq9Nwue&|Kd_a3qWjxa3cTYWR>RUqo({Qsz+-4y5Oe>NfspIR ziNz1+BHyDdza>*z6ud#Z#|_d^D$Af;8X=*UjsxqDAk5-r{3Hd+4rp)l2Wj=Zs1ZQd zJix$&`#0MUXe7h??7yp`p1)3|Gg);PTkb^oMepQQqArSrxWH^x#a`YQoFVxQLc4QD zDR{X{OR7%ySINC;z<^7u{|v^fSUrIkawT&X%?G0#fq;}~Rk&pa22tZ#QX|_-HeSvC z#t;S&uaM{L9Ib3Ydyk^q_%~?^LLQP-2ItSg97XkLR9&(;Ypv;87@Xi^JUa5KaE8J9 z3_T$46T{Nj7L5!J3v300SHha>{lOsc-B9#SF|wvPqsw%TY?}Bbc~Yk5 zW9<{SH8+01_|sfTS|IavyWL}@`pnf5wMPpf7qeiq7Sj7c0X*riH)$;UA3=S2q-a2) z{5X4!;NBst;M|!iJKJ?t(d~5qEBN03Ticx={a1&{UKC;*PrD-lKg0Yn*lEa^Gi>|! zmMX*X!8Lq&9dO$@o@@wHIVc4PMV;j84rdf1A9_uuzgX8H`6_!K_ zQW4t3o`7*;#jke=T<*LTXo=D(^G!;oL9<+So~CZM<)YJ1l;Mi)Wvl~oiAtm(!OuJu zhz3B6^(WT$BB&0$=nOBJ%jx&gPxq^X&okWYU=t_vR6c_(4bMS7>}W;%5LVmTB567Gs(Y=HXCrFpe1Of^3~_JcJg z54H9CBS-bJMir`rHOD0)b#r(%R4ns@#2JXQF_RWbAceDbUbw%ojhC-mNct(t*fZ{B z)u=NDz3$7bcaz)WFQobP)n(w%^dyNKuf5cqi@F~_#v~0jzi~G6p#lFK=XV)Mb(#s1 zMy0M~<(9wmyR5p{?9F*5l<};aO(%%Bxy`pc&kIX!pf8$X)sv<&OvnGTtnWhVvA>@R zj&XgrXP{tM@9n}?mpqR-7*ylSlrbqf99VU@5WuNtK8|xl0_#sgX3y+EO;jE$-n7Ib zK^?otXtXh@&TTnB`d1~KDp^1rHXJuMKyE7MEc(GHv^++rRmM|aoju3@Dl)r6?!J%G zS50D;PQ8FN42!x&TwcO%YwoyUu|Kf39l>?fSVWsE)Fh~!;^#jmZ|9IHlt^@A1ud)S z{uEXdqwa{#fA|!JZCa!EF4yjgc4rPeElzQ*d-O8==e5r>nsXoCJg<3GSVEwQj_s;Q zPlmA^!SS=RjN4uVgrUhbcZ7`}Q~JHPI#BU(G&4iD9W*X(qZ3V5$NIZl>~scUGU1*< zS7q^jN?SHL)zk zPXXG*Xu*e2=E05x&3@z&hAGEx*`WJS%j7gY`>7>+MAC|xcD#e6dw3Ep56Oq;XMYAc zq}8_5fh#Z+NQ_ACq9lOA3slPx(dN6!vWs-9EUMpy(GHeH0nuVWAmxQ8I*kup`*-rO zHUU3m0aJ;RnWjg4_raHkavhM|YY*!#xFCnHdQK3f%)z7&w*DJyQPjm)np*te-*gp~ z{kNgdsutq;=I@+;>v>naG00PZ%S zTYdDu228;r7{}CqiT;xne?SoEHj6|Q4dzR%?P{D@fgpzZZ#?7YS;KD$cuQfu#CGn9 zv>>hF&ZyDKUROl-FQ>*-xZ-1D|J_8BSpCB8*Z}0vZC~;SUNps~phL9MFSB#^Hm=+J z@xrf{OZ`caK{c0Qo!Zy`{%^sz#)NDKulVfx-za~U!C8I1(H=+=&Dyw{Fsuk)Rl@ff z_GulC91VuW+KfW&+NYe`lZ!BI#idAF)t@wxFB4d^|HL3^;>uW>{UMRq%_)`i=*@p_ z@3D`hI{PT1r%ApMSn>W&&%_j-ofAZedGpC;t=>`OJyGkgZ?Vbzq&Tz+g+0XbvE_!c zSfbd~``%Ov(kRK_Qi2Jql!&h)RVGTIp}A<+z21&~eP3R3UUWMyp8R4r+WuRl{_h^S zF3b7SY$JetgW(vz>Qz3G$2`;ozZPMf_e-RBpQLT>0$ZsNxvhj@xU5XfJzEEH9SbNw zfwYLT0ZtM|51T3(2Z+2=Ge<4{fbm{M!!))NJ=7mGuE*O)DP?z`Q*w{!mos7eiuWp3 z^MAH%`Nw|~Po1$gzb3bphLT@mH&-Zi@>l^`JFd`QpB2TJvjj1@Y+AiJ*jWU26#$6p zq^uLo!KF?v?mP&hV(1mT%8^LaWf(y)wt+;qavb{vi4z0a#^0n0$49}%0f(59D>KdX zzv_kDP>_mBGm`PNO#4Xfr4>patC3W0?jzcQjM^T zN4Lr#PzMQlmcjG&L@UWZ?c>BZO27pbIEoLMS==rItCEeidyo2?OvWjx;`Dp8Ys4AL z5JltT=#7*A-`^x|9@&&YExdD29d_DolZB>-av@I3hSe@baedPs<_6D}Zzq7X-5eE0 zIwet%FNp|AVsx?7UjgzbZK-{YPtC*s>j%eeNoz(K>pr>`Ea>J050S*LC44pb9|YrV z0`|WTQy|H;Cw9Z*i>nO==1T1c{v}mYwDEzn#z|p;z=xQd{2Xpo|u}&qt+K6SGX;ZiVOv%so@2822?+ z1dezK(a# zYoB}sIh+LzzB(LIJFXs^Ph~DV6h0r;^9#T9yVi^a*Xz255C&p|->>8Ub^i7K*A0se z*l2AM!#F_haBz9rm(2H9pnyt%K_M7G5BMltgzIRCyW1V-BWoyth*Hup2&xB&jGx~i z^RbESwuz$OG?XRaQR455g{za9x?(1eAG5${baBH-=x3q)95kE0G`D5cS6r)vHU>^n zlGalSQe!HP`Nh`8^D@OzC3o*4@^$qQ$f>)*oS#h+$0g%=HPzO|!L?WzL(bwvt_M<$ z%BEVr_~PdspmBFv?}r5Wnw!sn?_-OhZY)63SI0juh$Hp&O0S)r_y0tmGRv#aQPLx6 zqVx03a8hNYxlU4DdoC#&%q9SoJE^WJse^!iO4&JTn0{g^^fbug0Q0} zo0jhc#p~<*d6QUEb<-q{yY6q8)u+46Us+=)+2%ZnSSUf=#wl#I1G@W`_brU~?NgTMCPXO3+IRk-BHuErRy8~d^TxU8V| z$uf%;hUX;4X=PFM>f1VP_{q8SmHhRJI%g-v%FdtY>GM6G$nARbe&i%&?}DmW7)qDu z>J=^Sel))*=|Uur?=`mQOWLbxT=ztw#f(+Fbs?AmO$yx-_$d`@(8-f74-cPCUh(j~ zH7#YWh8zty+*Zf+FBCR}?mr-BZE@pJOdCleJ-U8ug4^js8hi(u?q%Sw-4JG z5o6*l;Fdkz)xk~2M{cQuzZI)JRI+m6^AdaM?qxmspfh#x06WmVwVvl@QtT(R<{ zIk!j-UH)|WKfA+8TG+SUIL*ML;68>$mrtK2f0CddB$^4QBtM#qZ0S71w>^e&!;Ex_i zGv`&v_wn1}{bQKxT*k)m4sIv$#os&Jzkd`0+*4#b-|VMH@=Xm2b+5e_BQFWE zu5-?v#s^$OgaF`Mq6U;I6)z{F&_aVO9lG+zEKLTtF}Q;akl&&{E)h+H2h?0?HjsC~ zwIuB!V5Q>O!v9T~Adc?7hn*Gwy8w_ymcjV(H%kLV58B!aaNmU%#u!_6V-IjY8*WoTk~0XEtl$){w9sVET|TTLWUu8apIsO!(L%oG!|ph@32@r6wMn{5tOX zxm(w_X$Z1@#37Wz!vS%URw$<6*ov{8cNOhg6;Vol$XL2~*M3=qYkA?iG5U%6*^&YE zWBjDw`LM`&c+9@;MmxOfFXbJ~8sWeK(T=gK*FEg^$8gncoG*VVt*TlvYP|kGrrtWP z>GumC9;0D&jglH2j!mT-$3O%`=?+Iqhe&sKZIU`lB?Xm|ZbpfK2uMi@k|GVyK7N0{ z=Xw6wf7@&C_kGTNuIoD2eV>zyfF2vt$m#l~J#v8C5ZuZKGPBb@@_F~jRl+=2T=BYz z=4iZpp$MCLL2Tdj%~802dl5q@%}mQ2_W5DA`|wT3mFVf| z*cfk)->O{EB~j63m+0yA?a|20ke>TysrJWHHMo(#t;Bhu=X{DszZgz?pVn?EDfRIc z{ULDk+D|^a?rrg2Gblf}uDMQOU$|_pyv0h=foMC3rr94}{9LrEb9z^=snWeNZ~I#l zi0Dqd9yeT@*KkDwfP2LTwg%b@sla&e6a5@ISl6R-(wm1W3q#bjl+moh%fjo;37ab1 z-lhU7OQl$bCoP0TLcJ^#gAA)nWdBz_xK)Y<#TZ!Z1s#fdgc0HG~(yKPSi&~;CfA9zNQIe9Sa?4K`ZWB#gnw`)hS(^o}3Q( z7ho;_dQDq4Brxb$^uvozrSIMRHOl|HUF5O+(#3P*f^(2_OeUQsXdfRON6=e;_BHB` zBSJU29k@mn_Cnxgf~|>r9*~-VYwy`w8_Gr5O%?gA1F4_$i`Ov>?I%_{{-4dfib&gX z77NZOb%JhCw>43PXVFW=?Apmvz#BVbhMxC8Y&`FEx+2tJuzvG9lsTFxl-Nj_ z_QkC|5lfEJO^0|4U;Gm_EoUR+yCRir{*3W$$BYaQ$qfgh1k~P^0FT}uN;~sVgwuh$ zz8zEjE1+>TEKN!zzufod@@DgJzPDQ)9uzZ>=y9&h0ar_7ZhACj#dM@`*qhZ6}Wn?ZXH1Hxnt-6 zSG;Bt1$Fs@)0C;JnyHF~W{c}N96qc3-`$K>xZHhc7n^zp>vex(Z_c@|uL4;lL$Mc! z?)^deH@=DN9z&(0$-ACpi-EI=r$b}6RRONEhC$(;MJ%nkQi`h{A!ltGM=QF8osoO| zLdmRi4_~7Hs8mJwK4kIyA<%eu+`G%ica~ZDK#Bm-UROTnaJQu@Z?*4J3*F@kho3|w zqdf$b4T;xIipc*>1dK{o{-rC)N^Kp+kG7+>1ofw}QamEgB-6J>JxMaa4!t!+i;<$2 z`N}_p*+Ttbgc?!SUlOb83)izZ36BTgHqres5SXaH`vO%uZf|YvmiGFXioTUCW*KFF zFM$=SF9fc-TQ*r(Eec5s{?g^B^;2i1k+q5+LqZ*&#+vbe*L}dTA;zrTwmrMu32gC=hxnJTMl2% z5Gw`k<(`hrnxU_DW;l*o;AdN7fxAKNL#|GIEbi!zOJqV&OIS=-DP#=I|-kM!qz9)~mm5 z`|on|_EIkU^3vyNuZ7@^Mu@;4S0keIw5ka}b&yoyQKOmXuH0gW!;il~*V}nT>zRwP zg>%=#YWq?lh4$sJEF%o07|F{3O(5qzSYZSi#cKc2GF3&Tk)y+-2rVfreCI{obi|pY z?3iue3h!!mI!ZmKn)up0ubFS)R#BSTsW2-YF+KB5(CXp}H7ulvLF+fo? zyEwy%)`tX}o%8>J<+PNK#DE03UeFWT7$mg3`4LX&$D@RF46X~A(NGMW0ug0=){%eO`ga`inO67P)O?(St13{ERLC>iooW z<@VUR*N=l5_cMrl@Sqw-ZjCbNpoH#I`$>1>@ZFQ8)0rDm&#JkDuSQC-azEB@$sY&Y zUYC8)zGBuc9e!-M*>}XzIwy<&1Kruo(;nE*a=-8+#bz$#F(*OG!SYLpnUxox8U<%e zS;Vfd#WD&8mBUPWD@tTuTU&bg<3Rdp)K2QkMdL(tDPI84j(HF7dCrrF+!TFLON}|p zRbo*lQ60&0(@uI*uCP^0CmtMZG&xdi7QeY0kEm4nwRb{c~PK2WRgYf+6j2v1g^++V0 zlRa3k!a_rs>4d_k;SRGya@Azt7crCF%rz5O!QJ!eO}?$iI2c(}(4vU zIO;FxP^h`_usm?DQ9Ww$?2OK>4e->`mRNoN;PzA5Wv{%DONF+ZQ=lR>nsjGC}E5E!uWBsX@-|Z^F-{W(rOktqn-@Eb`R9tJ5?m>6lPjL_94@}Dh zL-5S`ufdKv35r-KOvqA*IDxek99<&4#OtUIL8~NilM_hmN8}TAco3dM1Zp7C=us&) zX-n%#vV?f`gH^rLRU5I?d%(!7z~@hG`bp4xH{bsNks;{>b$M(!698rsz^HFTsb@6o zyus4BQ44eQOX{m)8s*BYtCM(uFi$2`&9b=Z0irz$W<6+DJk&mhC?=EjPdzL0A0~u; zJI-e0VXBWJ!j~IanZxbSgkh9qjuiUgc^#Ah6bYEMi?){onV}38Pd4c& ziFH!uqQa(a2@$@bS03h`$K2=TC&mgLFf#H)FhXqqV|{Wl1ngnHJ3@-KBfHzia&G3$ z2l_c>oojvXz6I8NHg0jI9xE&r&zr4Xh6R1{-KlfN{kZtuYd~W<9ItdL!(#QG$;!CD zu!ZTK`~1MPCSZJ|%66eJupVWgktYFn8ML2#ac^{8dQ&Ubb2u+qdW)spV{4r}v$RUA zzN65)vn-k2*cC8tu@~OD#!&S0+Ce@y@Ulkga5Z_w>nO19ra2(L$3?@4gW&4$X}pDXbt=A6dVbfPSN0~^%KvNa(~Ke{NV+YWWoD!eivDA z-XnNpuWwDX>DWn#FGc-<>C5~o_D^0NzZ8rWq{h}i_NWtBJQeWV${E2WZd)+~a$t=T^*v0Q|(1 zA->cgqW=*^KZ|Fc3`)Th7HD%nf`u+N!!#6xm{o}I@k(5i?Gs%@@20#8AWeLLF@bfR zoDtM-ftC?~GW3FoauAR0mww*Ht3pOYCRQDdcmL$%8Gr)YEutlGnA4;9;LCk*J#)&UK^hdzu zVfp3Y3PQs8=j}h4{1UP^t`aK=FGjDrKb`&IYK*uq@eOCyIATNUz2O_WG*xs>pfo3R z-F5gvLcZu`_OLYndXmdq)@b~r*I>X6=k?2{60#d7L96ZXZ}H?E`zu*1KBZp_`jOh> zGDs@TMwzWH{Pygx9R@my$m5g2jDJ#}(&V;p0FVQSh+a<=tEQ(?mR>EOWW$pZZ&((K!mpEL(K^|3s4(#m9P_6y#n+WXllpl8mHV!s&7YP!8-0 z$xv}F9gitkU4<$%OzwIRd*%KOnJ?gO2?&?Rp1?R3E`p`@{g|H zhhWyLDIwb+IH7KYGKmc$5uubfk=<2csBQb@gebrsI0Y3WKLY@tl#}a!V{mAwK@nol;g6H;V?-MQp~}g z2u8>q-o`)F0mUT&1cLQ&6+b3U-~-&j4Z-p9@W18?vA*7wi!hZ1GPs&^Qh)S>xdygQ z-b`S=L)0+YlmcOkDGoDz;$EpcWH(2A%+GBU$x|K&DCWv6vHF9-_qC~gL~ zJmQ>Ba*SY{RZr}JLNtJy>Jda}TFoNfc_BJU-Cm*twOvFxen zKaaic*(@rYsQYT)CKT0nfGhi8RZV%xz11KO;q>7$th}ancYej`V-Uq;%08t_fOP56 zhN4H#y#O2aJ5Ud}F=lZr1E7i+@=*6I_sRY>`hOldFHHRo`F(EnUt^R!1IT@KCN1G4 z=T5Q#Za7^GEk-ku2yP#pHBny7Z+Ks_8>;=&^8oNdV6>720am4Pvd>6r;M6wH=+W8 zG=La}xSW^-51DEpK1l6LGU6Z%ph&zFvZkf(L6OJRhvRXwOy1Tm6ZUFkRGL&=~cz8umDM>*0ViE#u3 zKzRwM28kTPX-p)m%K`7JU4?3QPi^7cw-oU=@<2m+GH~c8ow(tifHJ z^Hju0Re&YbAF=zD=&|h<_qZ0&?mH19a>De>R069|B%``OBhOvuyUqG0apgZunSr60zx=$?EpQ4y(-&{Itiz`E0d8<#sSFXO%&!0soe zm_VwC>5}709)HR1`gY$F+q_ER^#99i2{(jM(xa$+(uZ-vz5^vs9qG0+rnzB zBdw*~Na!&HhK~{&O2A1iDQ8WRZ>*gH;(O}usN0s(Xa44AQMM<%T@sI^qiBBg3N2YZ z8e}Bo_J__M_P_XM5wyO?G%0K>nNgx^qXimpY*aBy(x-y!vDF?bk|?Y4B=sP9GfeKN zrqHYNgtf)9CEG3uzz7Ei@BAFC5Y1Yd+vAe;!T}7*Ci{8>N{mnx3GBo|IgB*(l)XvS zVJ-h(YK!dZB~;Bj3{|)xRcau(O*8A#aotQLG~-|%%+C5ClU%E=Ksg5E5k+9(iPxCj z5CV9i*=E;Xz$OCl`q6{l1wE2@I0s54VPicMZS$i&t zM%18H&kTlKL21(#4QNo0YRNO}~8r}!x? z9S&GV6`=)bKz0m7%~m?N$)o0zF*+|m;ZdxN@OjQG0GdD<^_plt9+|*2PdOo_4}Z%F zbDXGMS;A&-)0?dLJP$7`W)&NG@sfiS1oj=R*hb@WIw`=#CC%`+2&4Ra+a~kP+7Hy? z^z*+be`NARArQ98$6Y1v4T>u9Jk6sfXm&{{qkUj-!d9i=>pJYSwk3$-@!4MbBzc~L zZODiUhu?*qN4?rfM5*`L^{2L;nw*+Gi`^hn>e+?x!pH50_uDSsjm)pSI$0qh-6QDW z8aq{7Jnb7hT`dz{_`cB8xqPzZH}jeP`zdM4&848UXE*xpJEO^_Z_U1x!^4#GzpDN5 z@@X5z@U|{q@lY&WENmxEMsRpd@-?nLtLb+(>>+8p=)HZAIVsU&^t;oSx<%nr^TCwK z!oOhZ)X|7oQ#3B*_okkrSk~+;j#K28gheQ3RLfd8Fvbrkql6gXHqyO7|9*oyWQl58 z1LLa_{;;$ToM-X#r*}k>WGi|%=Y@BryRyP0rKETtYoqDKp&j;Nue7sNwt3+HDZl?A zE)qE=ss07BPOn9%x&ZD8rgW1*pdKJthS*P9neVMv9nJoRYqn8J_x`>MP^aM&_LaLSd1uqF<1?=qk{H32O?7%fSgS@J4Wo&iY)ZK3{NI zRF3~FeahxC>$4T58@xqyy+(f173uz==S1x0hM?bU!0wY`=NJ`U7_?>V28Ymv2-CenaN@}KCbw={ScmlQPPLnAn=UbH=05vr z26B}3E}BSrXwyvpGdEjC8Yl~3O`F~*6F;E+CBGpCgVlzVH!mB~AsjDU>VYsAkw5}d ziT(78bH-rsdsPt?J)DR4`7DSKG$AHQs)kN=WEIm9u#d14x?h643rluRq3s$#@&X}< zDHHTNoNu(JxHRGpTH9eR1GD2;3ib}%8B>%B;&2cBF=8A#bkKTm|Mn6?(L!qX^?_TZ z$+yS_JOA}{gsYV9!ZWGqow^(YyVZR6&&g8lYrikAn`zdw-P@(4zPYE&K6NX9(Z(}8d5O)w+UVo*zaxfY3tLao1MqFv)z9ZNn}Af zt?&e-ESL|3qYqQHhDfOGqCsjnUSV*KH3@o>(Rv(-zdh8RVF<#2!a(pneWthm#p-up znI?c>-e3oy6%B5P&iI{LA37>c8I3^~GNM zHj6RNDlt(0`i=Zj2gCELJjK46F^3kyy&iaBfEBaO^SkaB^Rup6esRr3IOhz2-q(E7H zv3u9T03#C33P`b276IUmBon}Ss(J`|K?Fv^3WG*`$W-wIh`JUwfk66d8a$Nht)Snf9lOj;GQG$vZg!!YKp&`5#@Tovj6Iz*$p;>(ci^&e<>h0t#alu7%|f_eJX#j++j@3oo9oh@LHz z3m!B$ETn`=143H&oDmPU8~c3SalX_MT*1FTUvB2Icy1dhzARVT_vizd=WgF>&fy9= za>_qltMUA+#?|-Mt#Ivu?kWS9VobMNAj_?wa(39*Kb9m{qnO;r%3J*IiL4%YKy$`pP^h&z?;Vl~L z-TC_G(`GtL@?pNQ2TL0Ag?A4^6g_rkU2XgK?_PLpLqja%Ge)sO)`dRE==UAvGHL2B2;rw-3pl7E=VW83u@J~dwBuZI`!nBWcp@6|u)rDr%&!8IUmUATDAd5BgO_V>|H zoQaZ+Q-IcE{m)p_*&JIPob|nDVq+O=nl#|uXwFf&byrcA>r*QEt)>f@%!b(YNr2I6 z*{3#EBcWFG^M7b}z5Da_8%P)OV>u3JT2~hf2ZMJ5Z|?^F z$wgak+sLm;1lH#+7Jh2mrkWcP{nqtmB@V#+S7ENuQ69LYw8RvdVT*3&{VpLH38@& zRG=M4lCfGE!SY4qb(*2$mY7avuRzX=)%W5GX1TpyG!HUM-1|ys%6L!&!Ky!p=EIoN z{we+~y9%{QO?0k`8>xT1XO>I%f@G9JmsZa@%kD=FkU^h+qg?FE-17w!JLVR2)^S}B zZ7lqZ=a?-L%%V26T1CE*6~xZ~IkRNcB%=DvrHN zQA}{R@?yAkk-)N#X8%nH4!!KHlmA`eU%T#h`)5VqE!9tRQ_|Kp=|#6L4PS7mk`} z+6JP2WR!km@%;!kjDq(nU9_r;>e~i%I_gQ}6KG)$rW)m*Tc@6n-*f0lU6R%xVA+5V;?dD?WO={k?cJsNA^Pal` zux$iy9i8sDe);=TK!aoGk_JCq<;Q-2+f`w?N0o2%yqCbuaos1c&R+_RL&r3By46DA zbTiFc9~yss(75amZ0~vI=A*V7^7(Vv{gBi6PhQ_+s62-I>vD6XZ@wOxc>m7xD0jKx zqcjWc?zajcVV}|cAAfdW!h59bZNY{V>3W{~5f~2^w-^Rw7cNfwyp5;BvxJDh#D1#h?cgQl9*(y>6;Bv)&6ZtI?T;bAk& zQA4?T@@jiSbW7_ca#Ug2jw2L5r#=4mdX9^(-Bp!)zfEeR)MC(8;^|jSqqT||h167k zhy5}tskI#c&w|5Nq43+XN8ej7tcv=oMz0CnLk3%2m=^Oq zG)i4dYMMLD!4{64@42n#ysH_87kP>PxM^kCKTdQX&9gj%r3gFh^R&zOH_p&~Gr`+o zZqAt;E|(cW=qjaHn)Y3O{4F4Vm))d-8EIxu=&!Fzlspa$YI+H!ZgRd@Q2^>E8(k0R zhklTTg~n|t9tZj)ep)N5QOH=)qdKQ@xXBL4JMGYHU*3RUkAmh$9I)3O}7Xq)6|C z9@W!?Vz4*IcNG1v)F${@yw)|9O1Z4^SdtFh6%R`2h%w8OMuXZ48>?# z06LS5KtF=xCz_kJPMYB*2`Zd$)%l53E6bG4&)3oe+}ieJp!2A#f3Yud#n_cH;btcN z_nG^~Cwz7HSK3N$UHRkgz1EDOdOQEyO{3N*6!gx9Zmp!G5^-mQHKV)3-sa6~@`^_Z zpAKh>EFv8gcFJ%!d;W*tSKCH$tBk+2J51Rx#ovKS&~2Nd-VrHVOE<9Cy(c zL-Tok_wwh%vDK0O;22Vl;L!Y$2GB>!FX7rSiM5Oe)@~=N!qjBf{QrvX-pB zSd!B=Il(T{+*0p8rL%7#c*uG zzz~dWGN`m{VV_Ep^=B$PsFw0RPHoLT2|6bYy74bxZtD=g_56-*(27FSLCW> z93&jn^CX|C25m^g{hdC+KO2JFnNpc(VVGTd2baQI~KC5bo#rGSn;x2JpcS1 zm*DB!|3V@$aO1RC&w?ki^=!{zCADlQ?uQwXqp?vL*H%P0kc%ew70SH?Z z*~k74z~m4!At6+I$*@=&L+)lQToI>j<0L%};~^j)wwJf;ecNQ9-u2}$30a;)v5rG2 zduu z$n79;{}(T6{l*jk#@6L2pnu3dWtofnSgh3<*zNf$`$0nPEtSv%nV<`co545zZ3&N= zsn?rteAGhzTJ<0Oz8w-x8Tyw{fb>V98ONQK9r)NP*Y3V`q1PvcrZ2yQeckRJttLqJ zzl|m~tTBDKF?x9^vcA#BNLrV(z3`_DKceo_Qk%b0hQlJb?Q}5pD10?!^it_Zc3x$k zXWyQb*Hvf;I8`aA$MRi-Tgcsa8yjcdzSrElK7aa8*XOu8-io*XoC&4XXxn@$zrOF{ zb?%?KcA8i-G;upXGBxlIU%=!=(V&vWneC5@w>2J}2)nT>nw4>v#W;oO-O=V?_kk&z zR-TKU5dPige37}5DT!f;n^Ej!6twje{gR}O-gI6<%|TIvd7=XhQtt*Vrj6xs*%!Ve}3 zO(>&;ri4nlK}SR8Gm>w!r`aY$V)T<*=-&15tq;Z7B0i|T;mmAvn9Sk-+VggTgL2j2 zra;D7e8=%=Lr2KPZntI2$jyh$%2_+BzjNMF>j`xQ^|cqWf90&*4US0 zZW}WA7TO+s^S%|hpE4D=bF^6R=g`I$+S$L;cA{v0wj}CZN=R)iTyx!nc=zq1J=JPW zL3y{rLV&bz9f}EUHZIeGRXuw*D!8!)z2_@&?MU3 zA4f3!QAsGBm+*LdnFz)ENXYA~2$`@B5d0C9tQ1AeQ#}r?2#u8p+a(G0G)&Kbnq_3C zL>o|)xoK(V@#*oVZ4O(QV|$3y?V#UnJJ+om?`=v)>{pNy03qAUC4~qP?9Ub<6 z;F)@AA*JV*N$bk0((09eV;ue)#`ivu7u}rZJ>PwGarmd@Gdgv#O|tMo$REnOqv{=eoIO?8Mk8*xW+4q`i#tlSjq?Fg+~=cDC_Zv=plk}6RkrK zLrxP=Dd1*Sl5k^Ey3Dd>#WMJV@&@rRA{Ol}DKXB}Z9&$N1T7{f1^sJxaCV1Lb;$aG z@!kW~anm&0=!s+mE&QC;P|*cdK29o4PpS zW1s6iexa``>Wd7p=10+>bEMX9A$*I{P|n$tTJbrT;RuV)_3_>oA)qn|&7N98{Q4O0 zwX=!-CF;#@xU`$p&j*XftoEuzxM~Z)>A}f0L&w!EEV<^FW}|Wre4T!)29!w&n+^n) z6%yZFDSV@@Qv(zxopj^c`67K=M(R;EJzp9mlS_2twDoz{8kv-l)M27^wgaGp+<8#9 zaX4mq7ho@-Kkm!q-_76r%U-~@G>whtuetHa_a@2uHizLA7*Fk&2@NP_)RDZ@5b>eb zc|M%m%-Su8~N(nUW{u{yfNF;Hj=7>7BriW27#5aS%_(Cob+L4t9uG-!C(on^Nq?I(BF zx8vwy(w|4?#GBfU+KkF^fH7behn?5(M{*ugrUH|SNKw~?*23<>D<0~z4UIai>wIJS zJFBZ-b00$=;I)r^e9t1gT=DqLjxxKboH_kf(o%xDQr>&u{jsu#N*fo88x%wnaH?zl zzhbwKFH8Hxu7j?Vm_pCw{=i?y!gZ8lMfGvUmM^c0yw8-L3Jec3Tw7rtj;)j{DI|)% zln{rl)ocoa{CG(kRoHf8pnA5J9!w?bP9;$o8?ZGJ7|%37C6nvT4L1pI$)v|q+A3n+ ziqi2WNh=YovprGp166L&(=Rm~NBSQvtP<={LMn_fwq%5Om;ovsXUeDA$fPA6#sEA~ zH4=@P1fHANxw#dN7Sypc>w9)q?{xp28U{bNV+x1NFzIMxZ&|+ z`r&}VG?w$sUcbZsb{{WeKutJeq`BhQSUtRKW_hDs8y%tycRw{QY;anGs$JPSdHwSfH3K-ka%3J zY3&^d9ThA?Z=4<6g@dYlYJlm!O{rRso zMhy4p#sPTvRn2vPgxzUTm~d8iU^1$)$ z#133Rr4 z95{yWEvuy*?+5Xzo{F%RdaO7uc~(E)?Q1%C2m)78r56s5Vn@sDMz2tZfr!AOIEfoU zF%n09GQtEoy!8hF2_pz&4I@ZnwWlam2E?=UdqAP^4&zyFaw0dsvk;eXR&Wen4kK8P z!5N1W0A1Ji@G1eIR5pfAn8QN~2ZB5DsOxK;+*t34bwGr7?_Iz9cwn-qAhqk^A4?Pq zp|z#WxV^i(E77w+{zx?q(7CX1EG_-%c;NuEd+zt6+`o`dIgR$|j|U3y7WkxvfyIN5 zp%>SSFGpjiI9{}sU(c}nR-UhK`ra+m{khc8cQmj#%Nc3E>RToA?Ai3!UqWp4)TOyL z=Pr)F^{A^Z$iq$TRA5M1>R)KnOZ7dC+uH`TUl)8ViccE4JPpPr6}YHVwm-Iw{Rx`e zn$;+x!qUDQE8dd>R0TNu(z@JgLYQ8C)tvD3Y40g>9tm*K&a33SOa5SjU;wi=M5Wk<^$d`5@ZK$N!p*HgCFiXZ!~<0ilwq*Kj=GP)D}X8kWX zaxGni8_s8&r_~K-CY&CIxcuJUnDWGhigq}^tNLg@^Y~41!L;X}OpHM^20D&O&vwrnWIHG^Dj_nbl(xDGW!ARp!`CE;c7=w+9xj55q zTi;tIKg_Pkv1!mGpZt={jspu`yNW08p1APb`%)cw8WMKS$;*qj%_y@f&Epv!=Cx})}UtZ>sapJH;3S^vCCvLcW*1oIJ zPI+PJtzAZJ24zlU?=DO;tx|boTw*L1PGv?rE?HfzV*57WSE7#MmBw$w^(tbE7Sj(} zP3HPJFkk~ozxToX`o`xs0!t-lz7{l~mr^cOyb2us6+Is>Uv$n%;&TV+x>gI*z z^PRe1MI!F6k=_`s(r-4goZp^q6a*Y3TJ}V8|e0=VN%2t0!4>5$#a%|63J6Y-$7{SCrvk}(m z1=VD#8`I|b&8r}IX-8qI>A>OL=2C; z`#p)1xqHylIU|j3mt4hQpDm?AW(6a%Ah2z1RFrHXp-`nljFoYsol0tY@4b$5>SKh( zlF<9Nl3%ey0E<+FaliD^i;=zPb0ug$IJ#cSm2j*XY_6IJ6L~$bLVB+BAY6js{&$6O z>x!A}s8`u)!<6zFZE8zkdU7kMC`=-AO{CZM{>>w80UwSe>h&%2gs4A~n&96pnI4Jw>uSL8Tj;T2Nu)@R}r^?~t znQlgseItXvG6Jms$_fqO`03$E^=OAI!DrHqINEiIqE6mu_u9>c$m!{8-ldsZ2xn|GWp3@%y}3v4a)g=siC&fY+kh-I!fNzH>fA<5_qU^_ znn$YQ$x>uTP!UuM%tMEmygS3an#fZS6*;hrcI zbiJEwa>|$RUK?(JYMn8oo*1LNb2ia;-?<~=33?UPerMIs#Q|0HZQL|8+wZtK zsS6nqaV?oGS=$HR4S)T@J9%0!N{jEw&31=k%kGe%;)#skq8-iKskiGUN0_ng0B^V2 z98++F-Sg|C!m*6r#IwU(rLo>z^O9dV_OMrV0fprkZ##}?IozZBjg^aA*Al)48!|5c zKV-dSP+M&qw%bx%i@OweEpBb0IJ7u~;MU^q1cy@G9oph<#k~}QL$TlRqiC<88DJkx1({H8yOTfQjX+gF@vL`Dwvc#}bWIN}dgLI%x8 zGJ=azug%eV-cD0Y4ItwB2dx)>PFVlA>iY2BKFUEvcuugs@pE9I4pE~0tE%Rudw7kc zs2}dfA2ey`*k(;t^CchqXd!0rWN!zfj~nXMO?IeVV*3t+V`5^iV!Le}-+wci0ng_Mv2p5CE+utD{d~@vzNA^zH!@{UJVm~Ef253bG zlXstzj^(vbmge1a)wFK`$9)+$Q&b+rG~|C8lmwa4@dcb=wf~g4gUDLk^{WaD{_K!c zIzvJxvA`0eHWx3GU+# z_d?*!`)XP*#uM_i0c<&`G71Lb1+1)W6x6hqZU_H_D?~n5DF`Mpl7>~@-oRVi#A?Dm zet!3q!>z_IBf=pj*ZJ~2Cx_C<*QiCwBOfP07L`lSv;8(~DGt&PQe{zDP{49PB?O28M#T`=6>e6!v)4Dd<;ru8OlG(S) z)?xgaYxFVM=cWJ21C5ALr!Xw{j#?oSf}`QMz(16(?f$T}Z8FLuy51W>o;Rw==Tkqg z*rb(4TvOR-bc0o__1+R?R9)1hZ%!XLl<$8$+5JE}wzr^k^zQp?Z=Ly*9i87ENMc&t z1TlEy^5mJ}epd|pu{ssD`{*-!_@?8inHq!M>n+>UBL*;_@AaHpoZq;G2Zam2Yg<*{ zr(5~_!pu~yVzqLBP`sRKIR6-ALogRaSiWHT{Pv z+Y6rN4JP_Kv4|~Z@AW{*EH$k_L4`CPJ2Pv&&kC+xKkcW!h&UqG@`yxg^G3^S;lB&v z>S;ncyY5TeXY)IN2)veDZFeV)dXe}eUOG>QsqDJ>Lhq6uWm&xQHYb&$25%I@8nhca z-;fk+QZ5z^434L!R}=xLNxnkH#%Ft$80YfYA6mNtx-bE&7v!Ix)09Z$-!Y+#u4hCW zp@RM-UQ1KGi~iPohL+9Ql<4;*I##ZjaGJq^w%J5on}hVrTf4Fo)Ay%(FDi~6?h{~E zZEC_ge>Gjwy;In|mYMeOqMF!=$3s*UEHaoh;5b{|{x&pJg3Ouz)-3AaD z@w}_!s|sBj?szPY*n~sGZ^X_2lIQ;(p}JW#+NzuxBNmufwQKLPvXhF@uz;0Y@7|{< zTr>)!wG%7sm5jQ-^7ImPQ8g0n1=kI;x2}sugzPPiZ3i%@&wu@v%gO$1d@jwp~!UA&Vri zOPT^a1NWR$kQ0Tz(ZjDY6oS>Q>Pgo54PgJuR>8hf9Q2SF_%ohf2a&;;TAh)TNck8E zn(S+hcLIsxjyM9VIkz#h z5MMUF@%bL(q~nD5JCsN+ENp!G{mT-yh8(-<_pB*72g?rEvKyxyiLOm6rtbxn6O|4I z*S7fmCq9U*2T;$~8p&;prp8ic{^c+$SA{l zH?&uQI6Jr(#&VzZG4k%XvvkncwXtYwmfgnp#OEu<)J`%L!v3APMn*+(q<`lmRvTs^ z-D@0og}NJxgQX@Np+oJVMD4sYESYYTsiUM< z-(Zk9Q(D=P5+5(M=#XAymdlnws`oM9YTDQBPUFuIzl6kaWLy~X3e4O#J!6fGjJjQQ z4w^XKK(Fbz7o=;2JB1tsbcaDYcdNNgyJJ=P#7lkE#%DGLn?k+X0-}CQu#gvwMqX7S zXRmrJc~^js#R+*&(wCPLKN<^>VKE9$8A6Anu2j11;pLSwQnY_GqOCf|L3S|9H&!_1!eNtX%zm>g8(sa=9jXEX37bxR1-MT}9FI^(ihYUl#>v(ASGs>~%)o z2nj>4C>nDP!)N<1rFmYPJkGvs>xgI3R#<+A$2i&;Aj^!?a895!dk|Y8xMHzIp-cuV z7rB*&eb1LM>or3a#O`1wh~s}Ha=gU(-BH)1iOv;0Lx*yg0Q=vm<}Y5{G0}P2nR=*D zR!SVRYF(k3d0(O9-iE!?J)ef<1BBJ~7+4k%GYRy5O@c306`B_ zqETm*w0Zff?f(+;{~icO7A+2w`-uc?zKkh2qk!7?S%yE)junFF5$%UppRI!x5~|l@ zQ2V~1Wpo6eSCzc#E0z16Q!Dw~Nifjz6o@(;(8rH~!GGqOiQf~SSQRY?BfWGi*BKdG zaIFn$+YXX5kM%$4NWin7w@7uS3bB0OcaEQz#cg~?lckgF!TB*!E$nc**8)7KgHldC zJ&ZCbdvv$rwT(x@s>`Uvn_`DTzUt%cdDQ@Vy8nu_ZGve!%^I{h;YGN`MYxj*1r4I; zNq5EqT$4|bAJsyvIL_Wa?bP`380AHu{4FRlq+1+?OxpNW=2XrB0$n`({Ep_;t0&}% zBoZM3O|+N0kL60t>lryu2Hvc3QtTcOlv*bbbE}H1r~fQ*uQYhAmMOshP6JlJ6$RPZ zp=b-x@YTq2C=DLnJ4HXhv+g~x2^#1hHEgtFxiYo`DDGPk|A7wK3UWH*5`DE9&*F1= zD?20403^>V+qn_WOtQ7FP!Ns&mQzd35e)+YHD3 zrOOTt_7S#s_-9hk6XM!`Xk55s@gdwJn8kZ?T3eP($#PHUmk=Dg-BV~A#ErzG7TL-S z7I!DZ;vCNuPch!*{Q=-;bc2Saj_L~Tb9Wc$7+P{jaXdwZ z$hPP9QG>37H+{N&@{=>Ig8Qh(w6yFt1MZkaGBuXb4)RTa7@@xvRNh@Cq+?@6ImH!8 zFZ9fRF-$>T=QgyT46>K%gV#Y1$3AN~@h`s>n)SZ;TSqW8nc18E`)j;Fr~wAeDUF8g z(`>l_u)MoW%7rTUAk)pK;_cK83auz65ml+%P;3}eFLOrf%CF3?LkXbtoa)NTC|a+D z2*>6{6G*pS<>2eX)qq1IQ)u_YiQaG_Oq_>2Q;61_IBZsdiKKVh>F&kgo`JUd#Vo32 zH}zZ9lr(djT*MO5A7o{Fc-o(^6wlGOJeL!;|TMxRteC2!WfWk)l3 z!|c?p)8CNsrE14HaDFt^7nL@a_Slsq4R@4k+lvOO{?yaVGH3!ozmM`+BR3>i4Tla$ zU2Z(>Tu}CvNGBEb}TGMKxPUPS7H(qOBKMg7ZEv*2e5|!+d|5^mcZ@9P_M(6K-p$^f`%$@37UODkmQB&saq>cv`QNB3}41LP4&e-2y!uOa(? z6HCO{i$^>z$ZL)CG<|LGhg@T*B!1qaRF`p}hxc_E$s`U+ER0y3Urgd}-p#72GgwWW zm$&^ipn1uS8kvN(Nj>%k?r3ok4F`|6tfVhC?z#?;k_*{iOTGN{Z`f5~KCW>F-~aqx zzdLQTruCcqs=Yre#H_-JA7;5^aK_ByE2+4aO2 zbUqXi6L)cliKoDR(I?Xz8o!78)C?#EMk1Gd9rUEb$r7CBRoc-}aAi+V6kDdl)QtQh z6e2O&U?}_FBydBalwVDCu2#x>=tjGdgA+${5{k zd%hoSgYI&b-nTP;K14kawj5P9sWZPnS+x9-mli@F1V0vZU zuY4pg7=OB16S=yJ(1x7xr#p1d=@jspTUfj@Hl}SykGK52-9lfqU|RrFA76~uPK4KT zn?Co>8j!p6hA6VHJUqH17!n1XpBb;09^TpT1|=>#cg16r{#czif{*n@NhSPC!dr29 z(p~EOYVivziZPA#!v}GLIk&Vs?E=}IIwp!tffOV~&7}?5W<|e$Al)k%x7KOe99RTs z76Dnse++`b{H(E~TzTc`vkye?LqkHcZo7$Xo3MN|t4UDbP{*NTqTjV@5J{0kL|fly zTM3pnVPYnFdRPrZg?vKgcvqWKp4XhvMRyGw{i;#mqz-fnZq1I(R?!orgg29O*2qdtZ{N0Si6QOU<*A4v5nkz03ysvOso&mYhd4;sk00b_bGNSj48lnM`pK?84ra7Ha8a3Y@pAw11 zZyL}dB6SKd5Xm|CRH$whkgP6l*;0e3wp2m&9Fa%Bk@CS<)55`PYd z2->d&q|18L29J129+e1|b-=r55Bt!Z~N z(Y+?W@IOUitdH%{v|cN5<7CeLR}kZ$omDJ3&Xe=YPLtLd`K2`a>!0?X6o$!`XsMC< zM#&`AB0!-@WjU&ohl3iWCdG@{9v$K`q12X~ z{W{(|F!WKR$1oTiS3m3UNxxQgNeR?Fb=#Bq@pL-83aG5;FQMUDu z4i3DL^}#lCqJ>F{|DEQI)T9`BKO3%(l=*=%kR4zjKo>E+{_Zrox zZqddkgb$Kmq>aN}p6~)|o%pqz&aMN!P>a*QU*j%n?h{nZDe+!E)L2pXX7$0ZAndBR zeVmM#NsQFkPJ`2a4kxeg&og?yhv7@;FjR^c0G5MGqR4b(R&~=jT-tG*{U7|r&;IhA zo%X9X36;{L`sADC(-}jE)pEH>JaWZ;cQv&|xYG7kkO;;y#@%V!{ntVLf5#2~`-Q7; zr`N36AME7Nub{4x8o;Y)>y5EEAypng#+S$Jh8tm#)B*2E@IPsbI*{*b>M-8$1qM8e zOTqUn7vRBRZC8Vpdnd=1XURNm7d1v@b6lJssi-Jzp6>B*KS`VTZ2DgAb}TqgJ{dlK zABQ>_wtlGx(#@Z_yh^ZQD8En9jQj{DEH{ihLgv$1o*>J|11W^ z9%?yK#1dQVU}7Ov_|v@ZM$TQtO@MIA0AxXH+7~A2)RDx~ydvTi!K@Pr{Yz=x1_WqS z*cBVniF~Kgr1%u1e2wvYTU$ORCgRKM$!S-#%9}=8K87^4uQdKAPr&yPZuQKGi7M90%z`7MBfIC^rXbn8JmuYq zWv%#JEmyVAJmo7~Ay`zJN^LsGoggQVPN>@_t@#eD@4atuu?L6_=cSl?XFObeYbvKZ zRhrbyEm9|HXxbd&`+gFNmt>p$b4|3bE-btQq+c2&4}ZvFuM+Y<0rq7qJ9R~iyYIS= z)q~Zm>t~coQ+&GF66bL#YjrpQ8N)^Is(?y)d9)rojU$qcOO8`-2$@qSJz;sGLK5wS zzjt|F*E>CNLY>tm>-4G&23NHY=RKi=)53ATzD2||+x)XJ!puj*GJRL3Rl|PTshNYX z-QwY4v$ua-q*pE^C8k!crGK~a7T2DI4CjcQJ`>et@gwRcx$NFk z^7-O7nvtt-R^?UQcQvJVBJXrs!sQK!L*wcUzChoAO~YOs=eAw=JS?yE%OI7Nd&?Cl zAG&7B>(dplUsONXHT^nVUY@D$uHgRn>3lSr&fWn$eSltiR&sD$^U`-ILaHBi3qaxJfE3F1dPNQ&hTQ z1(twcwj=Ro?R5tgz-e>aV)%hwU2e2rTZ9=>lyPoZl3yl=sCCN~hYh-BiaHC~Oynw( ze6-u%F2s(4pPXp9v}}uo^3FA+xeuJ7#A+_4zZ*Z8tIQO*P=E%jM@&@a)_taMZqL=B z5)XP#W@RT5qo6h6JAFGPi^G3;J&_ora$(>+#M5ju{@unD%KM7MN@fb8Xe$#1_v0KV z&J~K^Z3J>?a;phSNGKH3{aajR3bs*`4?^Ic-~C?EUqH9qW(xHm)}h*3-4C_;@UChp zTs@-Vei4%?WL#$_)E+ZAovCO~i7YCFps^%ctYjiC5z3eHA{t#} z!Po^18uvvFL0Ln48YymwZ}J(|3zfCBv_#4KDN-@*6j>CuyX1;y8}P~6e^^bNj*MEF04JVB+62KjyLVkUdvf z>dmd2WlfJzA>{*9 zG{14`;9_RoyuIKZ6nsP5W{|r4-eRx0;G%o-IrIS%DfMCBDgJJ2(#LqcKj1k0#uW{L zwN&sa=rE9`8}{P!Ze(N7fTU~?QKH4apYSasdhy6-l3DP{?y@NYyVT_J#mv%Krs!FH z3vEAX!Tk%_?pDP;R=Y|X?ohpOGH&bfpuNv? zOoDCYvA4}=b&Kux6#9vgtE}diOm4MlOgYX0!LN|b){L%X=~6RD0W$5KuL{IuqpbVV zSZ(n83)W(lU`r-9DVmK#IL&8DzW2?eEEy`Vz9@Dh%gE9=m~VA98@T?h-FBH&t&X{m zRrqW+6c^8NrwxO4I8GE;XngI|e%4T;t@s%Xa3K*n{ykC^i5}&%@%*4GXyfvtu70$% zvJ$5c4}uA@n&vo`QO3QlNNebY{Jmwj%|A1muQB9(r&SF>HEdXX+Xhs@XMe>U8eFz% zS*@#F*p##}c%aKwuBTF!nT@#b_QaRC{30RI?z{I>l7l=dGnc~V8tEMs%G@7zSPtPr zae=yJ@ng4Lr60DQw8xwR<^Fsc8sEK(RB;WLw@9L~>*{){3J?o{4NP%1@U#j_2!1~_ zNLvljl|7up-uKXBi8+L<)vl6KUwx)DUv$W~Fwa$KT5x--u7SOgIJ|?#uh!{Q^+QoN z(EfV#>O*pT<)OHg)X@FaXgP%SZj`d8ur>%CO!E*V)p{wD&eLV|{$vqImbN0kfksIS zxsVE6^E5_E38Ix*RdqQ9E(JL6aCfrZjjctnM8pS4_k`k^rUdyJymRBVDy3%XoDLYf;E`8P%qANr3e;a3vFtyY2` zV12GHX{7aK((Pw^+=~CGCV&Jc15e(_n-?9Dm=eZn-f`PQYUVE}g=~f+*u*GML-l2! z_Pq@{Y|?(5k!0#*eW4Kk#<&F((1#|k4m;7>Ye~LM|NSxyUjCa9xy>sHgpo}{pJ90z zL~rK%I4C%_zclEIMdm!n z-vx44s-1a5vv&QQpy_kU3v$`kdweYV)L`UBsc+g9=}6$ivwm2kN$bmHyNWH@vsaya zd&TFz@yKo8eNzmUUNc%paQwPzIXfv>o#=V@-zoG>#L;+`knM6o0uJF#QX$;`{xZAA z=ZBtw;p)yP(F!4zh+E-q|6T0RqJc~{{DyCX3VYH!)twJ>Q9`o)#CGFxLC{M2d(P`# zOWy~{_2Jz-sge_!^cp^VmckKIq7WuV@FFUS zypIX8*CV?6^va>}@cF0%qBl0g>I+pKolPNNL0GM{eL@arW<56<+(g z_$Taf%iVPMK$wNfDY#F@k4K(&UrqF)W$C-4*GkrE%X(;*G3B%7YT!KI-BJdxb&GdT zlxU9!8<4I#E#oP5GS7q3i1tQc&2wSC_0baGz0DDD)DiUa_bn>u_GkaT3PpY_CxP)q zOZN@&1od(jA80G?sEZ#wqibz}=WXhb79@=ba0>jw)HGGtloyCvv)+IGK-;Go1s~Ng z8fWEC@cyBj`#3{?0aHCG?hvZ2iUeo$EpVb83f93SZ|9e13y5!)zQdYP^*_KtcJ817`nx{3#`c<9Ha8)easq3b#gE2}=d73oO9ZTL zCLU*qs(-uUmS6VaUxFB{!rH@gH{WMWGfO#nY#E*xupQT7=3}wyJ_5O&DB$f2I>ER@ zO2Xy5li7;D^ydX2a!k#SI}3eoj1p{vOUt$Z8i+IURu=~u`27&ZBI8vn+tyA(V2F@& z)8l%EY#)x-5sc&O(fjU)F1X7<#2fh2(S!JXaK!Jq`Jim1Y9AOw{)J5hxUT!dKT%_g zRf?*)&&oAa*B){<)ll3TK9==Qk*Oi}6A5Y}e`I_>d`&#Jy`B`i%f(86eyLl%drsfR zDBUkjth6_1W>wZFW0c5NP`ZPGtmg{G$r}$l<}N8(TH{dVeTPVS*75c$YIYJ86l|oi z$l-qf{Gl7}%W%R}F6-4`|9n|I3>{F5$G%pYmmy=946=`}t8emGfKMu<&7GWITww6t zb9Db`Xj9_14kx)`i&v8u=F!msOWMR%N2G^DDK0bQqHbOTL-(-LSlXDgv5~B9uOwjL z9K-PW^vR)dmDj_=%k5Bo6pfIxiPOlbDeOF@D(>_Z0S*P^6=Pq%g+LLYvV8ptpng)N z@-_6V-uznj^z%v24LYH+u`;O|1Jj)-Zh% zQ=VEXI2s>Mm&Qn>i`kC^9$nFG#`-U`k#8=GhL62y^@f=9A6JITfxSc?Stqt!CIvN# z*iyj7ap?r&MO-8cE?(d(cVRYr2oFTKER}1dNO1mOCGQ?VOs+4kj8f{8-{;Bnr)-gP zDeX0P6Cmw_Ij$OU3HSDIq#*Ke{Swr+2Rdu4)vhEvebRW(JpM+e>~aRXQ@Dckeal(B zfSo57J4fBlLlMze@x<&yc1)?4+&HMp^h_@}KC`rvME=}0w`fpevU?(obzoIw&Cz@3 zFNnEC`vUJOGIY|_7_+cq-mKg}Uu1Ej<9H^Qemq0vVz%U>$xnQ1kG!G32I((tI=Ks8 zf5s=zcNbCY-1tJqW5Ufw+=~Y>o!qf{nPEUi)%4B6VA>~);SDS+<&wk%E{6XD$RAg% zRq-V(lqp^+8`!N4Y5APFb1mt--Q5A#GFjbQFmR`}gAKKG9j|h3UP@)C@^yWKgJ6eM zh8K0Yq0PYj=l&mVTUz@sCNHj}yiUJ1VuD>s7i1(PI9rUE96s01lE|A@>QmB{vr``- zFZxAH?UuSTi|+fR7S|C^;$LMYCMBOem5Q{P0|}_@mQ@K62Y)G;Qds_kygXkueoF^X zXaj)TWkO)zI{mu2a_mqkmUCxcANnxXHJcRE*)5yQb+^AIf1hQ?lsY%#jrXm&ov|v; zF9N_L4|X%=VYkz*FvoN^8U2R=@1636!xl0Sxd8ZR+euBW%M=y@Y`S~&CuH&Awy)!Q zcRNS}c_O+e=ryF`SH17WTWngk{yKxQR?olMUB&7ALMNkp@VN=h=}!>H7DB7zMuv=e zS)-<;K8}qGTc=iXtt`|UU!oV4dbX=4g{h1H?3nEp|NE~iF8$0P*039^Ugb8W$$2Ic zDye!-`?lkeb(ed`md~^&)@#>_7tfZv7Y0;qPhKY-yLR(gG{cHFa=w&t-+Xe`6bV{2 zbFC(}n92amM}8BMhjzR@f&>4WBtEI*>D3yH2C7s$9Ht}hRqf?L91(Qx+ixa4pLQ=G?L^pPHY;rg__kC z<@zB{u}s1TX<~Yhegc#!PsR;{{+o^$SP2-N%Y9-a0JARc`|?56oqf=juaT>Xzf-K# zh1%D4MdoL8=e~BiGfHcN^Od?E--)`-jNtkopVD4uC+&Q#{2iOpedf;FxkKl+jiFup z3M)UHTOR>MnRs0FT{&DGf+`*lYvA0x8PHCtcHDTRe-1W%+ziko(&QjZmHh{4`4$qw zo4duXs$W}TU^LRtb+WZ0`ufXmkv0JU_PTvT*SQ~1(+x`OuHi<12!ByY z;Z^_9DO_TsG1_71$@V#%xaUgMiK6;5ub~akLh?r;_o{ZdhTh7}3$Bx{ICqU_ncDka zahX%b1UW7rR&eR&uEgTg9HKLg4a$G1JWo;OB|%-B286FPd;$lbLn4ZL8U0r!PQ4Nzrgiwha} zaDIg9^Q}GT>UjOL?@7mgzHADT4*r8d9Wzm?IE=mgH_^3t=n|i$?;XtnuinXfqt&m?TKZdO#!~m zZ~Y18UskbM!BH-;y7AM=JT2DaOVHQ^@+@vLOq632aM#UB|I>{$!@E>vTOA8B5xW)F z(JM@|anqq<@`4CBrIhIF&Yb(Ik$F16HN(}t*7eGvS^mWe)6NenDu-)NedHKUpH>Ky zh=TZQ4ao-5_?$ZyOM((iNJ2$TJ$(`+dE6k%=euvee{f_0J;x}W=vpKRmk2GsS^L{{ zvl?uvbkWEWZ>eka#g8u7!^3sz~@losO zOU}*Co3$L|G{oO)(Xpp>Wi)ZLXz%2Ju{^f^9gF?kh#0|&HmBhg+4UAjFr{lyrl_WeAb)v)(;e zRFeLSzOXi!5Tuf7>A+rD0s1^{f1b+iXvD+@k|QyG5kJ9!*;9AqqZ%7N8+eJ z06Dx~EBLqRDdjS$KJpLH>Vsi3X3!f4$p=R^jiQy=&3!{o>vwv?609axA}FeWPUb+m zFV$%&!>+(x9)q&;zPyrm^S65xIgZVS#6w?YAhkwdYjR`x@-+tNJ1hDSg)+T^rMdb| ze|eG5pp0!JJI`bGZ%s)r4sc9dxQ(2f;#4^K+IBwhioqR_vt{)rz2bS)psPqwHxN7* zAOa5BjDTrSe(CPbp5scxfwco#vfU?dF6kgQb?8rzA_u~>wI z4ZPSQPjkM+cYc*X_t)9vLPewV$mGw}=-oeZ+5UqI(8TwD%G1#jO)6RP?ISXL27d;Z zYc@Jfbt&RFfxi6%K*MroRgZmqjvi9jA(Hw#9dV46)yV5Kd`o=*H;V7(Vh>; z(3S4V$S677=}534UGTu_Kfy2cGq!KsV>+dXMJ~MfZ|ujMvt7Q&)G%^ZUqLrP+RGiE z4{@>{eEN_3tf3)`ng1l)4kIrN{4aAdt$k9x{2w5<{q`eoUHBu@Y1YBj4m&Fa-37JA zgf4$NWJV9K^H?fR*VC0)E>r08j$^!0dpa9Uw zaQnw(#UTY25vc&l(#M0AT-QF&$4htb&lR97@9qO%57`P?vO}Fcs?0vF9v338!_06> zk}`B}0&$!~m70s2mqR;Q8+5ILE;wQNYFs6vuMZ0JzIGNn&K(tpL)LdkRGqiG=zZyH z114-J^4q0k8FDmI@OwAwcS6aN#(k@RAmkgFBh9_ulv6&x^tj2Ag+5BcnMQW@_pSuu zBiLpx&ZygVyQvM2y#TA!^dt65-?9YC22Ksj= zP6l4C9tn@aqODx9l6{kdE>^9Pm{^AF6DcoX9jsXkB6s#3)f^jU#R|~xc@^s%kl5Js zL|s}4Ynnp!W@g2tR)(MnMwy#Sr5X)Y_gFG3()!6tO&eqX;~ICW>sKJJtPeUGyO z4v3k!9~L0KHz4<0BTDMcWeK4h*?d0GUiFdShD^BtTQcpfRQ-8k)wN#Z;)lba%_6=wx>7xI1);ewgk8ygK89zvo)ePYsm>cF4#8o$04?FFA z;UvfLfL&bPc)HItWh9QWo=fhNHkb%@%Ewi90;d)BIz3+UzF#kn zdqs=14UzqvsJ08T2ERG2=`51sE#@nQxPSjP%i+~#UtFZitpLIHyH(;e4_o@5%TpIx zL9|@@+{KNJQ9#9X6*NX8h&X4OO*6y~-3C`sTtEd$B~9hzE({skK4;6}2MX|s-ILB9 zkV4scg7)a zQxJu~UQd>peEeRR>)W5~5hi2E_AYgfyLHKrITP&-8~UmyT)b-NiDV5}!BdJH2~z^c z7rmC@1M|x#V}o&rZwZisi(YN#Pc01D^r#fuDC~PrgNG9{PM(s-o$ETw`rGYK>6NX| zOE{PTng3+p32tgvrVo2teR=DrLj}NMOv8(elc;%bou0;Dq*YU~G9xCVN!%=tXC1@x zh$?NIw{wvv)p>+}((Ueky>Rh@6)frkJBIL!i4_5xJZe(T&Inn-;2o4P8!b1bJ2%u~ zepao;4R?Hr4;L@?2rX0Du21D|1Y`t0l#9JD)J(DD&cjz?ohf7f4bT=hs|F+;Ru(dq zR#o3!q+`ZwjQ50Iwyc4IBD&VSwu{{utc56tBxddKYH|QQiak5RsL@3YzcAG+ReAwC zdX+jOC?6zGro)T%@L4SrK{u7A4O@K}%E2SvEDl_+*Fx9UF>|UzSdyu+EukXrz=V%6 z8EVG0#>ka^Jf=@0wr$(-M&)yy6qd8^Civf1v6Cq6Y{l?xEU({x_W~cm;p7IMIp7#o z)_Ux}`r?+w0K(X6y^7HFCO2KngzW8a+(|g-igo$K~!cAB*=aHB4}iBs^%V|hbAC^z^2W@sPgMFWW*4j$K`Bp@J ze}DZ0G@L4p&{{kR&2J0XU@I^)^PyZvEDjf~gHVW@7%Q2I&fK!nm~?k{+6`Q12z+6c z8n%O@G6PtApI)F}h=C93L7D51M{JMwvq=0ve9%lPCPz)k@}Gl^=lNw3tpl!8qLtYu zqs{nMRtk?RTsp($;1t(u$x^?4G{fzzy2br2FNLP(sc>Jv!5Q8C-iM|*YdNnMl|y3J zL1u1J>JvA{q_C^nfOdwaP!OV#45cS)oIl18KVkYvJZ8}*qhIVi!4#%yig+n2eMaEW zXhm((xz0GYo;&7aQ*n36Yak`uy+O}Ot=~L|^cQVjq&de=s1%P8v3$t8-hw)J7SIPg z$%A|k76UeUnB>==84=!lj5HS>ySP3pzCvPOF(8wP#eYW{d-~cYm&3@Nmix5l2kmc{ zIP}k42G|O&1@J!s2#j6Pyn*gq%QUVujS6(TgGk5K_Ts3d%EzzfU2CBgh+ z*oDhPI7t-b6uLf(c7Z-XUBzlfYEB#Jk`6KTI`a8^JV){L&o`u7QYMRscZ6PxA?q9y znd>CcMvFV_^WoqLw8n2#x-t*--otn^GijE)Rg|r7Tek;CeZMTOW)^|>{<7b!deakd z2Y!PR)avbphR+VhN+rWKukLg%(9 zB}c92az5EJ(RB zF>Pxbb4xeu$h;4{kO)`fm&tV|eH3X)uIsB1_iUUpL()IZWC zmsinf%&8D3??^Vpe3f4qe1t&F>p~hVF-6@{-87PFb#?o#RbJV&MlCUCH5}kBy zin*O3SK3d8n)w+UHOsYT`%j|D8sbzzii&JcuU;V)IS^xaUeQ$-fx$@ZpY)Wpy4}-5 zQwrU;i{8Kd&DWVy#;3C23|SiXU2EQxo-4j!;fnn4j4?0Uk`AsU;$K|>u(rh>uOVy} zxR=*gZ{MVw5&fvU7Ote*m@JiI_Dj*aEy}_NY*Q!B(T_pWITw>+cx>3p50UIB zTfLr@LFgD9=%ynG?pqKUSz-E?p)5z-dScu>(e!(t<2ik| z>&2iFV6N2<=XY?(8R;KW(#LAZhnL-MZQQLKX1WAu9R2&9e6MQUcBT5>0?Q)saFH&) z_`yhE@E2BO&4T$V5gX!Ij3YEJ_v?m^PnA04UWF!?^mug3COeMr3(4M3io-6|SQ3yn)<-ZT@X@xQ=H5-< zv~F)5`u@AdAU-A0DWAgRF{tbzd1g~~*RM|$kxD1p=YHt9ca*xEqN023qg=V)7!?n| zHiOc2SRuV2r}}5oUve*eP--GMlh-2_Rhkj-W|KLE^3^juh<9IBUfj-#YFKRAz-8M1Q!+qzt$_bCwoT?@{%h zgfjoL7b$ElfSSD8@J~hp=oQAi#`Y7z<2PBLA6FE-IZ?cvjpDs8nl0iiD&XOd@R;m| zn9TKAg3I4|X)&pg+~CLFT^d9*y{mk^3TMvtnN{H_{e2sq|1HR=V~2{2{tn;datZb? zZ9@QB?7wi4>0NKXb2=*?_m3~unqks%m}RwvQnB-HX2tJGRowCF70}}Wa~ZyRacfy) z(0i&@e&5RiL~I<#^7>Hn1wvW*>pa5Rlht6orc$rAb|1N8K4zTNj!!vh#!^@F7j&xlS zo$9%-sf<)3d=7JHIXkGhQ0GKTtykMu&p(x< zU-o;XjLK7r?MF{f#z_r6`n^Az&%rDbO~?veB5=7-Z#h5h4-3cJ8xp_t+@ah%VBQR^ zCfh^8X5B5+d}+T-Dn-NU(K=7MFPs!g@=LYcRuYwqb+6NvOLa}in2FAu!dX=QG1tJb z-Kq_nk{?bw6vY9*}$sv@tlzH`ETIgvC3VxQC$F7gXNTd3tAF{|PRoU<2B z>pcE_@yx7cc+$Ns@vCeCN%kz-<>XP)t}0pCyS+D`vbDRCxKjBzQR!D00#`6o9m!BB z4b&=kN=9xK%2h1MWg`x8{q_sJ*p3CA7R4nL*bOW1d7n7zK1skY7V0BpbIJ8?UE$}* z0~7giufAg{>9>N3BD6r1+w8wlamAUBPsk3%-<^!t0@d5g$ST#VSnz2#r0@oZJDDfp2S`rS@3l@u86J3w|Z`lXT}Y8GlyJ zp%OMpgrT=lYPP4{Pu!0U?oSRhpj-8Pf`}W%Ta2QrTDv?9&A^XC|7jQ2d8bOhnSxWWwn6QrM#C>MOWv{V2&*|J)r)$Vsq9+d69bjW*vqPzuX4{WUikY z0pN!PJ|_~*c*g%Ju>gko;vcI(w{{?J&!JyT>2-)}cg#VrEnlIazog#AljDc@Hnmw& z{#N%3&UX0CIhq!~wTcIO-VuIMHnHOc2VM3{@r#J*lHF*7Jl8@To=RX-FxeSH_BZhb zyS>|MYR@$tw`)AI+c4PiI5-|KmZH1g+<3Pi;VqCIDB~=%X$|y3(5_Iwt^4#V+-0Z6 zzV)F!X3uXTXVK!paq(B-;7SS~bc{Z4VwxO2nd|818}LyopnvXhSCTw&<Qd6a*#LOfVzl%ROwY`d=*5w=qeMZ(uR|Tz%4R4|;<^+e};f)TZ*aVX#Mo5RxzH zS?vq}C($p)@uZL0OvE&AkhiRXhlAQ9w!Mv%oRbm!Q1QnuIBch5t>2Rzlp>qk!3G!i z6QWa1n}eK{x@+vto2jnd{DQgO?tVq8ab$J#VGV~)MkC|e)pP7>BouU1mL5g#etyI>K>s7?N5Mon%;`1e zySLsf$kJa(bj61{Oiu37%X=yf{(~u_u(C1ixf_I35e#|nkjTD{^!z@+h-5Xap(APX z=6OH+@J1v?cHKO@J!g^*Kew6BM9i(uu-vk=d^-%?-n)>a78QK^w(6aoYMI-Pj$nDi zXgtuQw-l>CG(7awHBOPlFfEc)^&{&bI4d{vGnS!X7Ri^rL+a1;Qj>(Q_l}SMLE^Vx zh7ykat(fC<1FF-?)d^&&V7IGZ8CD}XQXN4X{`eTj@bIQ=nh)B6|AU8Ly(<-d4swR}+at{^jq8h>sujX)$Pl-Gm}9-j-(Bn4-0-xL42KD1jO9 zzGSh{=4V5a}IhwJ-q`lWKG5a?+sliLCSS&xZsS_xM->s#>VK#q-bE!`HZ71@0tKr zq+{Dw7N;Kcbrf2aXGV=sVfW|$^(>W02Cd+Ew|QQz2jBB`?R2bAz*i;0){`hQxs{v1jeUQtf=o2_E`Y1j7uVugYG`SYi%ug z&)Mg5?JJMsgg3s0OKoS8Wg zwHq(aWJxAmq@h)8T(ydUm%M{xF3qyw$QQ8fq7+vF&);Vs7WFrH#XEjaX219G^5=Ju zO(k#}8T@>Pv`?%C7hP~Be|X^wdB=15Ipf>E<<>hk&{F4SeC?DAdBc7SnY`^hCg;C` zZ+`nY?!Wjiobvhaa@$p3<9$E>E#9B*;ox_Dn9M`x^M{KrVI=5d$yQtP{C#(0aWX@B z?}K=YjX3$CI-mdHnY`_w#jWFg?OU&4^$n-+$)8?ATWz(~mMyR2j~wZ`ttp_=dL?A_vdHwnnQP_ zZ}TpmIT_@l3v0NuHsiR@pTH?E`zq&t=f@ni|JT?t#}g|Wpxd2lbVqu@bh3?xhLwC28D?#qoWgykBn28EHF`+WOA~I zc2jFYt#XNKv*fT0g@R$ka|Bn6=ivD&4Ee2V4RUoPQYliI3=uFgJ}xM+ zdi7e?tY3?5M9l2%Q;AyGs0#%3^>hhFb#!%*>&mIDzc4w$#=$`zdgx)6KfIEtQK7%L zldgQ8&TN+6&Mx};d+F`#)$V}V;L6EiX3ShfGLvJ&h7~Mdb_WyV8w7QV z#k$JT{(c>`qkatEkM_Vbyg*D+RadK4I;n=h&LX{ z$thOT;}Iy>!1k^`(-t*Pu#Fw0IuuYhc} z0}MR8^iDRcTh5{-+cJC3B6@oJNoR5l4-T?s#R?v{>rQUE>N18_uf~LtK5HF^0C4?4 zc~*&JLlCQ6t;kI$UZj6uERr4~s8zK)q5|qu=|I_B3g!<25a@zRqt+a+T0_?@oN9u1 zDie%irY zpZjtT&RdS>hX!4lyk`MRUjBA=$pqZ+`_J-=pMHbMoj=1R7mc!X z%{Wr!QcgMfi_FWvikH6W1S*qjxb(7hT)T9F@7(-LmZaXoS3du7hKDzD&ROSk^F1pW zsb0qAm#$~|7%fH19^k%vSHjK@aOwkhv4%}F?@;{lwOn(}T5ObMhh4YFbs`euxA2ue z|B{z{a1pP!;ewM! zvBN8-j%KJIxq=(pShr@a4;Y*P6i`iwDgW36)ALaUcF5%(o z)+|i$tkL9%p)gXX#|?4$&sE>vFJZTBujIBfPvOR8uV9bOcO}6yC<8$;!nT5gx4Ls3)}YxJeI~+Jj69;TuA>8$Fk26&!>a`Na-*0 zv*)bg%DXP(n)?pts4YABx5-8nHm<|sV~xYVN)KInG0U#ImMvcTb++1OK2qmSy#6_} zxp(cI{Qj(aIPmRzk}~|qY4bzh$Se1_hA&-z9^X1?Z+3p~v80$*#JZdR%Bes9E&kT8 z;Kk2-8C#}ltF8ZRS+tuOuCL4>FX56*Wyp0w|D0|bHGv08#gfW~nweB1Bjbz=k1#$_ zpirt%E;k`XP31#jRT(E(&^G=P$%H^wkZgjUq)NNO$N?uoL_s0XqoZStkB#FRpN?!2 z&vkGOSR!)iG&5(+&`yWxY+9gWWPFTOD_604)kH^NPrDON zPMvp!Tvwj&3ovCf89@-itDIa{s01!ZsQ;BpRq$_YWJG-p!v@OcN(&qaA~k`Ms}eea zKa~?&Yl(;`H_tCQB^bpLQi?xwlQJozfbjIU!41|#&j6mbW_*m1$6FZN5 za@h{Kx{`uVehVO3BC6FQ4=uZqO1VN^(4{UHj$B9H^?m&SNlXN ztE(#msnMtlBt=oAvb#46qA=2Dn+<_hxxF+$)6h)k zHO&UD?+N1B$l@wvtfWBw@$qrZb6004Jv}{uqtd;xu`#O6GSH@@ESUt5%di%MtLB>5 zxsB1!MIwsh;ME!k$4Zg&saR6u&pT#adJ4e8n#S57Yi$BRoKoAcso*U(zEu0Dk= z2UbfcB)(y(+XiyFnX>wz(!WMS^RLoKl^r&}7ZKLwu%Z=XHQfw2Jo0;v1;@nC0TZ9y z8oj?I3p$=_BFv_s?O6e^insH-PriWP@o3%u=kN0JsrD#+=5_q_GmuL8%%0uJgAWcO zo%1OUI)_K-+S7i-i>BJ6^+R5M(OGP{CER!4YFgq94*VsL(9A=Q;@DU1%3Z&HHMiXS z5RcFuKjbyf{~?d3Wj}cv&-p{1`8_=hKm0Ib#2USf@4j!U@o2r{bpEH*R$FZuFfPxC z!U7Lo`)967%;Y)S9K}upw6y*1J8{5sm++1A?%{=pkFapBZk`pYtl`>Q?&hw-X6)0~ zPwELm*#E6Eb2(E)m|f0P|Adn-5p;fI{F|DL>H zOOMA@`2qg$+rM)C!`-~^q$61}BY;u^%af7i?i+66(sP!w-z#6sZhH(ct&VMuV3+xS z;_eGh;pzvEXPf>-xcsdm)~;L5l}od1`=U8KXXg(7c`|BGSGk!B*mCDx`Ta?M;iq5A zl6wE!*=wr>r1;mXzVZTz1RdT)%EM@7!xU7IhHIVds~; zn1Me%$Zfy-Ef2qP7q;&7`Hz!7z;T~?Hy6D2ZQS#_Z}7)G_vh7n_X1EGeULx><|O_) zxrEofpxrq6zkTH;yIAdXYm7H!1ReyRBIu{ z$ug6Z1;!={jE)u<**GdERnw(aE|vr^now(EqQt~xQGg-{0+qWZlf$I48$lU8kzVsX zPc86V-Hf}Q(G7ZMM~>d^9@5#QoF5xDuGbCz`t=(qS4!F;&T$+$Z&In0+%&mnDPV7& zj=m0z>oGPt!J4(}xbOa@tXi=`j-F&PA@@^fN2lOV69RSj2w;&)$vs7_-eBGOwLJXL zGVN$*5uhQL&8p8yg~T^Am-2LUJ92u0g!2k6N4m2*V}VlK_$-@@DhBnf*~m6JF)^mt+KhW(GVo^V%MJUCA2ObmHEl} zr00>f0#41(hRTqN^qTLwa#RH_118gmrs{Ghi8nmLa8D#utd5h#xgAj0VLVHBx< zrE+r&4O9|4Hq7W$>*&lgXJ8h&WQxh5QG&Eb;Q4}?a-&67w8+EIz!EqvUNS|(@u>I} zN~NlD>{Q)H3uNKw{HUC@T9&JhVxfZP2_`nLfm#?^Yy{Tm1CnVqsrBg40#|;;JCna`Js81gt$LlmCJR(tEaEk+;<;OsD;U4iWmKc5B~mo?yc~Y z)tH!I*;H$*t+xJqWUa+6y0+2fq41610RjZ)djK z{UG|zI*nUzeF4wg^Ki0;|58PO!I%VrXLwu{S99razRGX@dKQ@jKf->y>`L-+kLQp` zcJS|3&t?lrbmY0|`sIv_HJCBr{ZpJd09_0Aa#U*oVHx5a-dmhkd&uDkP6u5k9?vpep^k{p|87RMj7Ef?PYAiw?HbsV$P z0%oQh9;qs$V=H(#IhS1qc4Z*opCfB^GnCC4p03;(J96*|AL6E4KFc|O`YG>Svx1ks z>}Bk;^&%E7-kiBTS^i;JlsV(^_$m+G!LNV#E&i}H#epw-A%}0C;jyLvmTAn-gvM^a zk{fTj0<+(%*>(FJNYE15`3G_ImOtZ%w_d?1*RJQ&N6h6vQ5}n)%ST>yFt7dWW&HG8 zC$sl1?_u+x%$F9EWVSTfx#3lXb$VgkvV~5}sNr z6_7~!1aiK(f+Ru4A)W7_4=*!GSm9o7GPCU=k-_ohnxfID2^Kl7E2mdsa+2YpLCr-YtdmG31i8}bEa}+A zq*A|xk89*$A~MK%B*)cMtJca8DUW%&Br%3pZVVAD9o?PUY0wf9g$=B=I##1mms_k> zt0@nwtE*e(mkN_NE+&RC(+;u1#3W0H#*1 zs?7uwitx6*d1x)|}%}g#sI+@0a`|3G9#ueqzTq{E> ztWj@78Y7WP8&OH4uk*?=H^-T;<8|aa70U0r2$mVYIj734Vti~2Ihu^oYmS2;Z1dc6 z=gd*~dlW{R(@MFb@v6K|t)X#PtXx)p^BVcSp5r+2buzkcKzy8#$wEo3d48?yN==Ti ziSYs(hlUikKQL=R*L-Mr1Z{>;YY;e|U}&x0(7YHq;5Tj8xm7vkEJWA7lby~0k`|h|E14$l75$l#-#GjV;Fl+C< zIAW_jk5q=|?7Aa|?C@L8zW7$2f9OH%yV&QyQx3+2gwY_SQXK-H5Q`Iq`pfIY=tdq~ z`T)0__X~dc`->>fIFL`h=Lq&#kmj-EI6h&u#5Jd%gu5tD*od%?z7F~Y(#+Y0J$BxK z`5FEx^3z>7ehPoAs0;(}_@~LwvfZ(7=Y?m!g0n6?i9epZKW{u@;4!NCui(@_ozI=c zo%z>W^S9wShabWIyKT$nOSWbE?YE%AfBKm=2lnKTnR& z_AhxK$6a_UKe^{re(}d6c<){t`0cNLOmWcxy!Dvl*rSiO+WN2Ag>cE@t%;}Ck7SV4xrPVF*syMplpHN6|H@A# zNF{x}&r!LbC6i9l)!m_dt;kyCO>G<+VcD`3EPHr4Bg2#Ut{1zlI_d82q^q+_C5BUg zM_(tCNd?(&ShbFa9(<6st5<5LJnin6?@-`)HkB3-X@V%%*Dh^>FyoWsjE#>1RwaAQ zuyTVTolTMN%#%$up-}A73Or?Mscf#+kc+1Ytt!>3K#2vNGvOyycA4-KxPDx!M+~1L zIiHC1dyUH7a9vN3YG7bM>|k(kkglF?mCmJ7DLJ78pF*pAsA938^G*fAYYagU2+(zP zb!ooi62TU9u#qJcY?50FIiI3PFe4C<3-Du?m5YN)F&(2mTLi7-_z}QTzw3fmPP~I+ zSZ|J@MlO>hmCnRvi4ImJde!DR^%(`IdmgSz^HQWAaH z>VwKhJr^5A0-5z@S#4CO-e@}EYG5IZV02`RQn|{^nR&Up>a|fetQ}-_7>9v2gJlbljt+v|2Po^2WZy7)Q_`5hI>pecevJu6}IlSwuALRvm%*XHu$yQz( z8{+rh{5+?6kAnn^AsXL6`uQK`d!K!LfE86Xa?P*)gz4^N$0LtthT&1_-erHb+xIz~ z_Jeb{{pE+T*W#UV`EQhiAHc-eO?>~$pJPrgLCr=aTn7h-;Z^r=d$5OL*C4b zU-@#5+I!2#9johk)XT%1{)4aaSKnf=*vBX@49C|I9PlQ-^5yNApK z_59*%H{r$Q3x6wP8+37?7bV8p86Lqzj-NZHZ0}VGk?lo zel*7Hoe$-C&pVX84m^UR_Lz^yQ`tj!} z-)uPJ!2u3^-O;@4=()7j)_;>+KTye3;Cb{8fF)vVtjO}^>+!shWTqxKQ>`=u!JB1H zB^+Z(CgpY^nM#mPCJ7RO08=u^kniY_t0@Wv4k#AOR7zEflLdxH#uy);)Q$Y`=qO`j z6U~5eIeBW8kZP&Q1Vs$sxpE-M4P+b#Kk1Y0Oq0wcZ%o!RQlIyBDN6I5g1afOBW5{!`D$|Q_JVTK51-_!lQZAN} zQ>t2(3&?GbHItHKN5=^gI+nnd1uN$i+6}MPs41f;Y(yC4G)==JqYN|8n@NxiG`@5? z1EH1MC$bhdc8ZOTjZiL?MIJhvK(DJuE;fM@$3enSZ`4(aSgB|iJ3$~ouqc&m?Lw%} zILf4=6(o)&E)i5|8mRQmpgt>zJGgu zqfMMWF3Rt!*UFl68->*BWzgq+%~h%=1D;D{(Yoj#=vQfII-OKL+J^NTSigRqKp%h~ zs0=U;JohzjPwp}oK-X8n|E58uT$5X?7K24&Q65<~lPBQ^ASer5aDQk)5)Zu zt?yMRH{E^pka`q83Se1uNg#r1r9s^dNu?CBkLv~0blvM($GY^73~g^^U+Gb~THrWV zrKYa$sbo~}N~OU*Uf>WBp)yv_kjf;r-fPsfhW{M^tF5-$YOAd?v5qjo5 zmscD$pT|^c9{X><6TA2Qg|lzGg+mY7nI(DtDgQd|=kGq7Kc4;^KK=5YFi1?^aVe*raw+TQzkn~ibRTBrcuFchd^^{k z^B1BW4`RDL4<*fGDZ!qveLnryJiwKw{E=lZ-I?uX1Uy0(2n;6Y@?$^5ST--kcNe*5mvzS}Lp=kLqbDx|kOfLFitNVe{ItT7u54QjT5KVw(Y z4v!qS(2a@DJQ7$vLdl~P3 z#g)9}`&V+xZw-s~IG&dse>|PE)z*KH3v=m ziNeIF!o$m@0>xqzZWY)VHk5bd2AqA3O((QHXkPZ?~K>on4)}nID}PWqfji zuu&H*@ElhVBaukb)6+|LSF`jkuk0v4@b%tRt5$Qz9d~Jm!F0-_x2H?cs+ozE&*ucZ zIyyVZcXX0TXQ_t~gB#YfZtZG@Muy}#^F5a!ou<39OHeG4OvF3j)rd@loLQB!fK9y~ zDwy4dq2NO%m(iRxp_vm0qYFw*=S4+U?xT9OE|?P$;=2LKK>1Q~6$$1D9vEd}B~l5D zkz$MswRwraJ)U}FQGpJK+q4Dy|ws8rB(2i$Y6O)w!uRsyeUZx%zAn_t`OyN@2V5otXI$#p9}!%U~>X=FSmF znVKWbYgM}mR@CRtbV^V#5$M`tu{uYs79tQC)>M*-wW#dVcLkfOl>(lr(g>TI7K}47 z-h{R#&21wL<5Jyj?VOp9pjF~`gc_;;!_w3b?_NaRAqzeb7P%{cnKZ{UIx z-p%=cI)(lA+lGVZ22da5!n6L&MVHrk@i&iSx2<}4YN~VhUAJ=jf89sU$0?s(jygkM71I- z?_a^}onOkHFFJw_!y^>cYh>nZ%V95h343<)jH-L?4m|%=Q;h}>T)!{poc3#eeA>l) z=ZhhW7kr(gcj&|A$*Eo`vh6W1;uCLw8H;>NyT_;aQ zQN2oj{*D~+(wDGPo~N(!a&El+7H%l)$Jh3JE?Z}LY?**vUjAkl{OtX#xZtD&Ev_XGN~K;0^_4&3~g+>vnHvOi*j()>Qw}^!UnZ!NU<0(VhXHZKSDOURsgFB z$|4(LT&w)hbV4o^jDt$}dV6{`7T0mKL*2xh0vk7OVD;KHa#A%xMqgjIatR39I%H=Cqw{EqdM>3fd>`;JwKC8T|Dd;7L<#|4J+sr+hU~uC`#x`zf zg@UUz%W-thcy~P=%eYQlf@R`Ty#`qAR;SQ&<3Ku@BI&2}UdJ)5aB)NPG19S#EcK{H z6ox9%^0d>T^2}7eHEYfso!^F`0_+pXq|Q-@%L^y9Yhs98c1b}<_0RVMfi+{4Z6y$* zazK>_Hk)nr#h~@2vPmz_(Q3))vw|35RM+ucw_C?`eOCa^bqxAC4sef4FXP?+nxAVR zfK;zzL#T*qE9zu3TJE6rwQsumMK!1}{orC<}Ihr~J0D(Q($T8=_QLE;pNY>x>#YZ#JJI zuY9yLevlxWO_4~Z1(7i5Jk}zI-^l2g%6p>*!g}4ko%p^Zpfox>Cdk~J6PrkCO_(^r z-QXff8qa;HTBQ+beGmagPXU9DWd*dXN_?Y|C5Y!-V{SBbY|nMkM+|~wK|*U7!AZx& znPdU3V+64hNjU@sjHjAlr8Snpje{yL?CS0koD72C-vzMRYOAfb+PnIse20OQ_m8`X zqL9)=33}2zUDbvk;Fo7D#fco&uRM*feCa}>$8~Q^a?4tW?8voTcHiwBxX;iCa4 z40Ag@67DKijZ6?N?8M=jRD`uIo;R0){!TJFc!n)^K7x;ae1g#_SIZgS`!tJZeT_F9 zwKD-vAOkjPmU~VDJ^VYh=C&Is4X$VQ;S1^L2>92?Vcs^+;f*Kk$7_D^SI#(XHx7K) zu?${&A*Y^xKF&d}=9q(ar_13fDH>nFJvW`tnsgVl?!1~Ge`N#C<1S3Y`nAK^=dx+-zn{tYUoi^$c?$13a+?_Iwwgp7U~S!|Io@`sgZ7`Rs?dJKc$I z0rMDc$9kD^A%bp)e~vsh-{S>rzUAh4g}3w5ORnM1H?QD`?fXa>o|K}<(%;p=tj;V+ zAW4qhUiuC`G&#YWzjiWT{q!f8_wBE8=w>ONP{zoGRW4Y_8=kH<+;kmxUVI~|p3S-H zFDEm4M*_=ZE3A%Dsur1W?&A07tz_5Z7xJH~bl-dq*}b20#ygm~(<0hx>%UG0K?UtD zCsz|{7zgb@CxF!eLNLlfl3PoG&&do~2O8F+D?32{KrhvLMgLz}DV3*Mfl7IjaW=`a-=l-?CIv&Ba=%}DJ50ns9gusP_KrJ*Cv$xGzG9!wpFQCl$$hr z)=a&xtF!66>Yz*cSe@iL^7zRV!^5N8f8PTNcCVC+a$I$Hb*n6~Bi|wSNJnRfo+pz5 z#z47RWn^NM(cxjaZH#s=Oro%O*HJE~D&XV%t5hu=-}t-wx>~KpJ2=W+gO^OiyEY04 zwP2$KL7m8|bS;s!y4nKNf87+u#{-$!nr4I4J-x^#8-(AU=& zgDag+??dOa%Fe3Q>Vim7q;f{RPcXxE)f~rZxx;J}=O!xGs;?c|A7Q{)1A6WwI184AS`rHQhjZ#tb|U`8L<@C7U7K1>9@pj0;99HTPr)Lc(FWt7TgHf)HP7@H(LxRFYwBnbDfmPcD{wbfQz zt-lUc>k;7a?^VRg+y1~+LoN-|0}tKA1@||w_VFDM8NbTxxfL$?{k0so@4obJmE)OJ zC-Y}GBopfxpR8edigJJ`qG2N*i!*=|TiKhoZ3}6`v}W&kBp-kGUA*T*C-VKze~&rc zpXTVj=JDU5F)q4s4a)~h9JTXo`ZE0Ml$p)G$G?RaUGZ`*Irln`e2dT6OQ8oO{+C%$_@ohTX_z=RZvNcYdb)rfoiYn9?n$an~B8<*S{vUr;k zqie3?!ljS*b8mFR6D*iPVd*$G|K<0rdC^Ci9q^wi{qmo|HbNSu3Xr3%w*KqnI59LZ zMApbK)kcjV;bKc6wMv=6p^YjVY`Ueg=^S!Md4^QhC!GrzFr8QdfVy^(FBYndj+YqR zIHGc_(Xr+ZdQA{jooY2o%9d&dxsM41B@&)W4aY|(ltDD@GK)YEDUnFVE+da@HmefD z?(RI9jCSFpR4B9l;gu|X@FA8xvKwqE0RbR6tv8PLbL-|qZwC1vzoisSOk@Xul zDBvAy>FCVGC5&BUvpEDUTt|SST&b$WaAaf{Yc=l*NOxVAOeTY4f93p|CQ19=|=NTIr!6XvQ7#PrwjgDi~ zFHjh}fZNoZ3j#L#n9XKLCRJLf=ERPv=^gSyg|BGcX|!F`i#M} zGQSiYAIf=07&heea*U(TC`ZXj;=3-67taamXUlmO5u)cdBot(`n)@JVo_88}8M*Ep zxt@Hj1K$q-)E||=StDSU&ud*YbK6w%x_tRc%B7OZ|7z7brD9QltofcyCQWBY7d<`Q z&GG4b%9rvz%{4AGY$ynaRZmfVR}*4cs46(VjvQtP7SWsR!0qW)-jx#>hKEL|)+X`1 zh>hzes8u7<*&MUy&t!PrIwm)aArRICSwK=D`yO>C(vF6;Fd{M#fj|@noePZ}&9!lj zu1zYNR8E*2R9HF6anqLx!Wq$ivHVB zC{zWipWOhft+v`~t1X4M|K*pL;TeaQzW+14e78OvWB(4oaxjezoci5w^UL3z#?AL1 z#U5MjL4s#ehEz`yJfGWFjZ%#u?eOGOU(U+$)eLqnq%+fl;i)Re)(5?fcb>444}bnV zzVMAL=>5{$*=KQv|8y1aIG5}0Udje@5C<+;z`wf3U5oePl_$KKYd&+?6#QF-H+(BQ zyx{G;j(p{tdG~8~CwP2t6lY!3x%;%w^Mya($8S%*lOsQW z02vplYyLd;dj58tan6HW`IqZC_^tcn^3>EQ7ZrGpYxqx4a?TKC?~YA>VL<)5nZ6g0o}sxv5WcK|PY=UX{++b(PvJubj!|L0MGSQhGm=x+kC`< z7(M`4pqf@W%D0T8QI=bwVZz6ATXyk@Nx* z!KljPnh-&bA>Y#td@`AkYpJ6nqq4qvCQ!Cexl&P<(8NSRI}Z*GjW9V;WMXnstqBww zQ*ER?BG_Q81>=xV0K9Ul(4q<~VeIV+5}#mQ=DQ2vV=tR7RD~ zq~kKR2$gfysx+cdZW!fcIibF9<5IdPipvq>plru;1i8S(Wqx|E9%*G&fx*U5(!rvD zcjbv$gZkFl)g=I-j}ZY-sWccK8DV&6NZ%La%6DiURfY-zPIB+mL*$;aIybH|xCC!v zcc0u@(4uMrQ1KFrROYAg5rJcHji(TN!4bhOTK=IpZ%gM^DP!0IW@^p(@LJ`vo^~$O z3-P&vz++&bFD`{djxFV785hs-<({(Ekt?oIZz#iUV!R-bH#$0kagb|o=F9=|&9&Oh zT1#gHNHgiA&TUn;C-f`e*iZ?ic2`ti^-5$R0$mSK@Or9Qew)kbSe_hiK7kVucs_jt zJp>6Lgf+|7bMHMX1Vr;aO$T9y;lw%yHw-a4F-};kYsjtxXkuKbH$jvITBU?oy~k1W z967E8XFKv~f>eMz9l{^@L{TUgUMiDRiEb{R*II1UYH|XWsuj5j%ayWn-^$9jn`mBJ zf!t&&sS?d7s$($Ec7WAZTWz(~*5vX_Is48sPU1jb{nGtelHy5dOI~)+HQaRF6`XYO z9UQ#hE^OE1@yy9EZ=0=f6L)dlZ%$|B^LJp&&VVPQjaOd5omX8?WBWHTFr%NRrSuG* z`-V^O%7;ez%Gp2Ti@%x2*WP_RTX*swtU-Qr>iJxM-%9p6{$p&n`3wyIV!1hXI{bKE zcKOwO|AHGR&)A1g9eoU2ce^}QO+0ijSN!5adUrUS!;X77J8b3gWVEF71b%+Tr+Dbn zA9L^Mp6uG2Kwaxu%ua{BjK#nB5*J>64*NZScMhAIpw5b?p24y*c*Sy_jQo655hiy!;5x z`0A}(`0GnJewP=L<(XGoZM9`+-OxK8Rt|E5ahqVu=zA(Hb1ji+)fUOUgRp`TFi9kJ zV~rIokjDv$2phRH2#KsuB9S8qQW&?WGD2lI#ZH|tinKFdqf#f~C)BSdL|FdN!$eUi z_>*rsJUYAS=~F%t-JMx_dh^&&8BvrgD!XHHVv^yJQ3{h~#>XZV7C$~Qp_}MhwXPDt zTCJo~wZKoHGP0?b&5SUd&&er+AVVFH1BdR8Zqn(L+&TGtF5bnkLvEDju7w*mtmlEH zOIg2eEno$z`g;24>F=elw^@qUORgg)Fjc8k1l-2P#sq@O<+1=lZ%+^1-6~&GDWOX3 z2H^e%wP2~%>KIm-ST80c4DjdHz0LB&eBLKKGjULpwedJIGak{s93`H6$j!4OS{ zzi$!-ZyW?rTme!SjMfU681yvX--385FN7FcIlhZyJOp7{C50OMBSBtdb#4=vF?!lv zGE^%HxKso$wb{VfC>uAfM{q8TNF_6Dw%HISo`|~{X@JiONTaNib5^K^B0 z=*4oesEoMYzHW-e62rqonl~GTjE{~gN3C3%luIp)1X$xTS!HNxTmrSJRGdxMBdC?n zw?o|9YOAfbp53x#Zv6G{8FnJJ{lDXwpW;bt$sq?a|D21t^z75P_mzjRUC#oZNzLBx zW$e>&F@L)29KLzRaeVL9+v7j6m4h=bzL?AIjX3tx+pxpp6i-*F{>8lh;~!-C#E1FA z$zR~-3%mKyD-NUIq!j+edaIIg??$0QDV zDaRbR6^5s(Di7RyJ*VE2Vb@pg&U1G1c(U>b4&b<*;lvy6;1?IIV3*@IkIx^l)ozFJ zvX}pr&z*ldzxwHBEPVePwKM0FRJ;W^|2)|`wQ_};lOdaQ`1@*b)5#Z592#ZI#XSTb z&zL&4ei85c>;~?6$BCTs%dax9#fiNCpqczLWJe$7w(BnDp4|StaQpq3ZFrJ$Sn!;e zv+L(BX60R{bJhCiarg|MXI^c!)s`cGrG@~OH40XC;_u;DO!EP~8x#Kn!7e>_v_mdn z^p&0)0BZ!b>O|B-2ofo6&tD6R%F>dQn-mZj57(39Lyi~UxRgpYM%RrnIbLKiF^HG& zNaV6CT(pq+3+9o?B;?>oPqjqCQ{ELeNq=9S`SWHHMn;aI$;pBoSPE{RYyz!O#>OY8 zRvXl7q4KuI#>W|TN7)d9)!WxA$5+#lvU=kh)~sHo&o*H~;0FR$y}dmQ^v_VJcaThJPN%b_ z!m6F#4X+ja4h9gMLI4C*=H~k@uI~%V*f?Ok1+7%3En-h78^BUP}K@_2S;lx z-n~w1vX!NUK0jR^7;5ZtmLX`RjRPESx`ff_xbe94UN&{2S&M*B^F2|dfbv?ks&c(z zsl?!h5r&61GC5I@+b@i)#y$n?1Pvz(1;MKM^XAdfl~cK#W7K`YHLG)lDzl4SRdR=g zwxR3QXlU%Z&QtRwfSF9Gtg&^C!!T4iYC-|$zF1<+!ieG^c4J(U$t zfhLvzRm%#h7hEe$OlViqdZWhr4QnaOx!7E%5mBVF$GCJd*($3{B~t_mKMwXc0E~~h z`d%AgwbfQzZT*k@a`|*r8@ZF8UA=~eoyl>>Y(v14m+9V(qjp-tEm!@S)33Rg19w=m643DGwMo#_3kND21S5w>dr5t(SbC{7Z z{3GgKxHlhq-|HCp@aH)7D_>x<8GXF|u$>8>`gM3}QjUnjlTvkvKmX`EeD8<9VddCN z-tzgkarkyKaQSyBV97qO;k$o&E`I+4=45!vY79NZt!Mn4!d6?e#UY0>;PB+-b#mA% zUd}hK{T;Xd;SAOs`$6UeNI~!ByyT6q<<9%x&jr8xCZD6ud*1#AcJ2>&GAfR&Vc9xM zV`fCdJZ>$cuHDnoy4x=2n;-ZBqkBG|x4+|E>@eUy{(EmZi635g8{?IodH(M62zX|- z`QfkOlOJ5go4@#5e*66|vem+`aMYsosBs4^+t9%@Gb0rz&043yt-y@ z$;*zP%X`mT&KZBXo5SC@&-1KRTWuLYju^*_vyu#3MygC43bI*BvL-fOp=a#2JQOiy74iCR>n~-o1mvV!|Yl8)an8Ul;nV# zV0?U%3Bj!~Mn}e}RT|W*&GN7kjj%+eP+@X(g1~o3r3A|u=@=%H%gA8^a{o{Zt5}uX zb;w21)7x}sbxt*Xt&E_x>(;Px<>S?}LK&Y>GfP6=n=BHe(QfP+P zk2PICm=5xmd2}11JQ&R;$bPRH}@r+|qb1VB^wAPtefweVq9J!&=}9 zy-RXHu*kx6Zk66IfFN4rZV1l+Vsv*%5}UyicSM)VEztJKpE0v!`j=z6VErCO_L zJ$Nx7^*yhZucq*IM-5O|mV(BkNWe;cpWaQ-H5MJ)aq&e=r`NLJoS+sK^el?>sL$(M z+K_;H7*eg&1c@fbM%Dj%ts&>#_;`Uvy{6K^zTQ5v9a%a%nx&%y8uP}%^@2E^9XaY@ zjdFQ1hJwhwrE?oc@XFw*Z@%lG^=u3&CncAa=D_#mYMX|UfaapvFR%hXp6kYrI*mWx zjZiR;Mos08&9X%Swvpj6x|^F3^mO1j4H8~JrXxkRGtKaZQEt5P4%U@Ma1HUUf`Ll- zs*Mn%bHp%Hps_}!93r?p)k=keGSVi-Mq+1G1-(x>Sg15Jn@tP4B@~XIB$Z0xdCDD& z%Q#zkXMhC^wOUzo(FRy;wbfQz{{ss3*Bk%I-;fytz{3~(oMjUwy!~FmJ_9+Pnmi6X zYJYxv@ikoXle4++s6FXl(#12WEnoOXKCtvoK6}!YeD{;@=GHr2#YbQ9d^R7*;W*Qo z1`&gIU%~Hw^>co9&b4facIDl#dlQFl)5G7B<;lol{vI#mJ+Hij;jjFXZ+-A5%P0OpdJO_A5@~&wn|e%Wimx;b?Q-{MnE5 z?*H3`Ou)Za$vg|U-;Spz%bJz9andDYY_s2Dp7-2^JXQ7X^g<5n{SD`@x`4B9c^z-w zvj-%HnL8fMCqGxh{o+^n>+iqI1J~a^1wl^Wgk$%jKNs)V)RNUNY=f)r;mXtg#IMi0 zf(O<+Y%xDW^6!Oq>o4NYQ~r5OC2EA>eVq5Z)!cXADo%LS>v`o7Ta)&t*NG*pjdJ^$ zKj!N{{tY)y7+&zcx3T}C9t_X4QXKNixALjg_wcD-{+XYAHOJzwe330W9(&BnF^SAm z8*{jx+wZ=B%QtMs35)h;kC}$2B9rW6=NBJO{`X&G*%iOy{#Sg9Ez-1PRE`m8qlPH3 zJdqv+9t|o1sg^BK+VVuwO%-jm^*<(~8|ApUK)n6FN|+phDI9}t!9mXfgtKTmN%V>! ziRU^*#sVr&YrW6G2nsbFOSwcEzxlqX5$6&KUqdD7-wKOKC?q-}M9={J^IX zHsnm1EKD*sF|JVek>Md4jk?Mp`}_Kpqt)NvKlOZoR5~L!*oO7%S-W-(LxV%qs}&s2 z5eVz->0w}CKxLGEB7re-Xi+U!Xt)usuS_U4s~jk+{_6J)EP&qQ*=dM{V35EMw8GN? z8nN?B(5v;vP4cD)Ra%A@mzX*(`COLX-d=T}tE)?8gS6aThC;cl61HNY(999jxKl}i zjp+^$FCQYybPkoSp$#L9EAZ9|6*sQi>Jjm7gL-cC;n+O}4h~pA-?mgLRh0zFF*Z8J z*i3)7h_3a3|wS3)JLelSa=fD;pAtXjQXuA{E5PL0VJ zl}m!k5(RQd1c9DgjG&f+&4F62CI}jbwJQhBQ=XhrX`UYhnoq|u%J>Q!bsBZ;rYLY# zuhtMqbX+hl-5nheSplzsfgUh*Twnilhmuq!DF&8!N}kS^*6E&e9vu#;Cn_6F}Vz<1Kc%yh|4m4S{Y<=;|Ws6YsbX9 zZdL>apEUr>^%Ep~k!BkD57E=#LC64>e^idFo4$#(5F^V!F5{C*`8YtMR-xL6n3fwP z(fFf=$acf>2zfz(W3|%&kCd#R=m#N;XsfNZo&i})Sg%lb8d&}jDNK`*RS)sy*T0bO z2M$l9s9t5x(eLHcZ+HRoy@&YiZ*Qkiba>+l&!sELQ&wX0L)drT>D+MDnVf#htJ!h! zZjZT>zW(}GuM=9!QF=M%mB0EruRrTo^!ChR>#gVF6i0Y)`TcAd zDl)ur1C`nP^TGFgjJF-WIcbl_l||b#>o2@@okVZ~FmndG)#aW&dwg zuh$eviw!9knpq2jEZXlSeCBQMN<1XRYDcH1go~JB7Kab;Hy$5H0{yNV5$z{B9j~9_?U92Q?_x(S< z{GH92_4RLY@;R4q()aJ?tdmpp&tJrrRGnp4T+y~|ad$#+cemi~4#BN(mmr0^TYy3f z32wpN9fCW-CAdRy2oA5#y{EnQ-WM7_p!VKt%{fNz>y9$cTz#pERgjba`h}4~z246+ zT%+C@X1yOTaL#^H1$V?`jKm@7ru%E$PYVvU^ygwbnABGDQ-@JqDdYjBLBjcNu}4=) z2e40axHeu&uMSmBwN+~a&P6NF5udy0+=D<<^1maf+E)TK=$tbn@RLNwB2=C z@(;z(H=B=0zD;k8o}KIBE!5j?Zl4+5pz(Lq#_D>X!0%u_ll~}>*z4sRV90PlsO!CP z>qy3rZP-dv|C~U((l31JW~;1aO(PQ=ESv3Y<>=pdLP4L<7fkV)ARk_+=^dO>Lc+SJ z<|B@VKKmPv_!9~U=)4>3>he=*h{YQe#!ORkX)1Aq9%H+WCGf80M&Vf2#E~P<7(1py zkenH8NtKu~;w7vM2!;P#D46sc!w%xDZx_MG2~o1_hvY15k|%RS)H0>bL<;p7xOhd! z_g4sTr*bglWC;jK=0H&@P@3i144;%fp%bVTT;%)F!8@yqtJQ$&nrXH|EFCtJp>c4fUau!>i3aqH7vASBwC{NWZgjA)+@qF_1k2cH zEO@cwgZ97h9jXth)2EWBtl(#>WU#7NnZVyecQ*(G`NxYiGJiZP{B7cD8b`P2GpF=i zyQ)Pw2a3NG=Ej(mD29aD=QBJ5O-L zig>8|kRjZ;Mf!V97dK5p<;u=yqJ6SCjCi0vkJ~UE9UTEF>EbZ`bbvYYkH zPwuUPs&eT>2qf-AbhU}Z66I(5JX2NWNO)2(E|By9XCF8&J@5c)1UoW#`xm}C84xQ| zMKv9vA)5-xZNP|i1R9GoJlZ#HBJg3DFGO`f9XAP$2Tvzm!Ss`Fso3Ky;L4=Z(Yd<9 z>*vgd$m0FNQ4mv*tAX8`Uj#|iEnXHg^7ZjxqmS6Dw<+83#bFP4X)U153rqOmrw`o43Vc1myb05+*(Lv<$scLDWl#F1R&Ms? ztCW@X7)bOclWJ%OUD;p)m$6D)K4Cc;Dw1qBmqE^V8UHr)JkM#{i(QU92q~R4D5KNa zP-UlV!&|GTa1VRmW_H6$p@by2B72f0_hW6QapPiUFI((2W-HH+2NUFIId$qsX@8vF z_NPx06mZlj@Xsfz@gP(c=Dp|D5;Sz{OTfu3Pdot0uON8;mJ=JCl}^etdN+Lcoe*{G zHFXw@H>S-z`$=tL;b=+iP%oTB1g4sn&y*ddw)`XBTL+4(J}R(MqQv+ehxftL3{u$7 zY&>uxx!MijH%&NS1?~WRg}8(R1oo2&t?wp_sTV^aoHZOv!IR^^zr09uu`?kz6MCa3 zt%(RNa^n3EW^(hRjek3|>}#k4^Xj417(TQ!Z|^x(1U(=gFn+zyca{CQc5iag$L4D9 zF^7xodtaOF>UW4QMlQFrQr)lt2I;_+*8De9790Uv4^-oZC7icxdzy9i9g;~+_|kt zmhcr5po2(5-RU=s6y6>#d(|OhWvnjqly&{MZ2eq{?~7tKL>ThEz1adDa3Fv3<;Le8 z9UzK3HQ2gz6dA&`i9MHBmu zA6yN+i>WZXXit7DR0`yF&Qp_@=*N7Ol3Ho?H85GJ8)Yfd*M#Zv_iDNo#os<&D&>6* zrc}sF)Y{)&QoQm6L_}nNC=x%>uW5Vup7C9>Lr#`nolTccg{p+uWjI4Yt-j+Tq~AHi}1P?C)@dU_$rig!`MBQrzz6$ zJm@ihjR?^}(5H!7(5gg65(JfU4H#52m9GAZK;;=JC-|dpU@bGn$!RP3Mn4_vc9o3$ zs-p3?Yfbw0925zFsp%mZtJj#ms>#0CwKRU5q zGmxjz8Y9sq1;V0?M3A#vU^VNOfPiOg++FH>!fg6%Ri&UMzqw$+3Ff7{)T>7u^Cc?M zk9m3~Pg$C;IKu7OugT00Wmw}jISOnEZ^gjg5$h4HO-hKX>04gcq=Igp8H>meI-c;y zCVkk*U;Aqx_uYs9zW+*;@BU8q8*2L;OqfhO>23~as+*^$-(+nC#NvqskY0W~x4%j$ zo(~%a`66#^?edX880!3P8KvxA7&Adb2?F<}GghlUrNH|ufU(Oj(W=*r57$>d-mA#G z_ejjYy4!aqCLx^@vHbo~L}Gy_pst7P`#V-&XfdH%HInA$8Ka;loORMSb*NYAWGUl+ zc0Kp=nDsOS``pexJbCZGO`c}d4Y!`Ay}U<+Hv5Be)-))re9Ys1Adep2dLP=6N009l zlyum?LNFh9L0DrftL`v-RUBOU!@h*RKxj3?mY=;^i;l_DfbVjR@zM6>;sw?UR>0y9 zXj^<8#W?(7f;^V5OiR&ma$M;}LV1fO%`oZo^u!uOdHJ&9HIOP;{AGDM3d(^ySI$1S zLbe_L?|p(HgYY5K$&^kECo0zHZGkM$%Hc=LB#yY;V51Ii35}5So&oMc*^xsfy>CA0o0dnIMQEHSI+w5jcqB3djTEO`nA8rF zQHu@f;8~NzjY>&wxYU@LQ&fjGb1HGsJ2y@1P=HG~CQm+Trj%nh42b(RmLxad!BxCY zN^n_X&JC(sYAQ(J3&E}Bu$8>kZ86NH^LQwA#eo6}kHN>=3%iElw-dUj3g(*G8ebqI zVfvUP7(GmCZKJA_xkn-gK~ImPj1ZSgkV~TabZ$OpKuMajtB!y-$w5z~0krPi7C*G{ zHffw{>g`T@uNZcJ#@FC^PxQ+k7OWCs3Ma~vgs$IX&dQvgpvg$6xK{+%BCE?gh9TrE zcN8Zqu|zHJ7s{ouMURanX&Og?HVDEru?ko#SId;$KJ5j^&*I1+)6t!2R)=O?U8i8w zI3Ijfpr4}&qglhQUkVc(6C|bGNv(6&D zRR|cCL^Va0g&GflQ8=RaJU5L-TX}TgvC>x&dKHe0jBJ{)-1Z}q;!UUCL4^5%O?MD5!<_Qe%TY!@6(4cW5hUkCL~eVwV%JXjos17SD6n0lDkF}Ixs z^T0SPTH|SV7t9U2Gs%gjTMRsdA>685#B|YFKIn}A;16ijl=mrQr#TMdFdQ*+1Ue)KR1lE4E|lGQ=rp8m{Z+)R2yPoTA{96|lkn;<6cMGH zVThNiEUV1ry&mQ>U0gKvxk5@fxRmQPEXFWmSAA6@$0wgy^!a1Kn6>nZ?i^l$VhS@~ z$;hpTen?QU&xi+MY^f!x5PrwS{Zt{^E#l*7^jU1UlJed+WX&>im7CWh);LPBQPgvQ zLVZ8!EN`spf`!dPmaoQQLmnH)X!2OqR3#KJTxvjIwb)^HoHvvQQ zhiNADFTwwBUAIrf1=}D&@qhp$G*}k zwSVTS&cP7<;p~4jb@xTKe8FLbp%_vw@|C5D_3da(zY`0jNPcok7FO|5Xotx~##dn@ zzj_497vE~e2kAL+sdzQs-z1E+6$^Fd-tb(_>vxo{6)9G`8PPmO(IV>D*!1;E8FQ&D zYx(&ThC0&E*j}2q-Hkdw?fbqwj#!PlKP2uTmuNJCtk3>h@T#c+O%FOouaw6q!Dm{; z8U5UJd$gk-blw$;9{-Yk?*@~`5Y_x90~3F?icN_zja)ZtKl}v#fO4-8QL!WaDdd-% z^r1>WN2(eBp#fRt!K@spCQHFZs80C6q{)6#wIOJRN(+{GojJAs9EUjGlo?5UtX`{T zsIIm9>5+lt59cwzY#{lh`)UEMgoCc26l~aa7R4xKlIo6*HUZFW11wgK!-uq!yFK|y2nq4@>|i1;a-AYP9+X8qJ-m{Y=^4|$$En3}3WydQH5(YQ z<&-bqXZp(-2V+)w{y~*0I>BYpSm``Oj#GEgf}lmMLRu)07QEmf0G?b~qk=!l&DB`m zQc4}uoM+2CTs4@V3m^4DF8N;QDCQRzOWIuyOeJZ9sHq2F$X2U@L47|IFHg1M*V8A! zhZjlp^A*zV8bcm1V5mc&Kz{`tl=1|2X@e%T%E4EjuaVkPRzB!W7hnnPs1+VMBu3rT zn#@BtU#|gRd+{M6Q{y6=|Glh(?$D#n_~I*3KVL-aS+*I$7`6@*c=1S<`cpniWs;{5 z$+6q9y>(9ewSb7OzUhkm(E~s?!QdS!>ZB{v@jGja{^aZx7V*eZz5M}EWYn-ceb(P! z_^%B~i~d>@Rsx9e9tN|lj-gEk@*5Pb#YgsG@S)+bHHbjj(-2Fh0u|Igjq>y{X~t*Y zPCOEFq{&c4QP)y0!-Z$2bpNGl=bD+qaW?obM$Fq0J3+nSv#J=}4Z{0Z_`PvOwOyIF zHN9E)%*&ee{gjtabS8nf(BZ_03X{h>AzM9BUJ!P{zmLfi|ARWGNMM(lRo!0t462uKpF-)CGRAl(i18?LF&$t$M^!ecPza#HC@t zC*Gg0Y~Pc}%i&eSI`C~fq$fXU&TG#FnxO^drQh_Yc6PzXZioO6aS~8*s_L$^qrJ5R5nH$m&hw=!pemNwdJ5ACU1@3 zloVcYy)ML}=?R5*7rP|Vm+Ix)r!6!;epM;H79IILKM&ZvSO(&W zs9fbV_r96pe0RoZHB?jw7A?Fjzv=^2^or(wO=FzDFLN&n z3f-e~cqRA*KtKYpxzK2zsf26MKs!L8R3lV= z?63>6aX)ehWO71=_lznasdc?-JM7&=BFq-tn$+iR9>|WTYLBL)r*|i9cOq#N$ zXxR?@MGymYG@kUSEOj;|OsS6Ldj2gE(bu6eAun==AdU$6Nrs#<-T0WO$j`>x?>6~TR3x_V*n3E@U;-5K2a zNSx_;Bki&~)cM<$Gk~~tgXeSuI%vA=P7zD3If4&5G0zWzZZ-@WI8yD&jw0(KE$12~ zJ$j81f`W)2-}YU*tdFpJZW~bbIu8KGH@j3kL=-ZPEaBmF5>~))=YR`t_bKDa6Y>Wa zbk+^O`=_o;`-%6F-gG`Vgo#EKNbm(hRr~Lsw4;`r$o)tck)p&~EiUmA|D*_&(8Yt? zOpMi~d8ECvQDc*^_z(OOk?j)#7(HZiWmw&i>De+ltxD`OzPJXnH-nDO8x}nd6AYz@ zgk`GJH9JN! zno@-opWio4G)V3d>s5S$N2C)jB87vUq0CWj2plj_JfI5P9#a6T9=XP;RnI|`RN+9# zzU&yw!eSs)r5(`tw=Nx0u423s$-3;@<`DieDP17%3Y46c+h)qq@YK=uYE@*0N269M zoBQ?kiZ*LXyeq5VaESmq58|_hNU_N57n!nHjf=1Oj7%zZs-^Y6o-|Q8#KnZrBXw-s zB1-p{CH+{a`-A>j{Y|qtYMvj{YL=UqEb^N0(mr}m%IgM+ICHd_1=-(>VuILzTX<)X}^anD#@6egg zb*1sNgxE8o(K6mD)w-#>IrHXIf!Yq;1iUjWX6*N; zPDQSAWx(9NSt>Q$5(-(9UVJ>&!Sfd)bTF2re!*fceR>SkqGkQ~tX@dc7?p8F*lJ+p zwRuv~Z{*<-R5ne%JE>f3%K)kUV9A;_= zT&U+U?Zyf-`K0Vrax-PxW~)1jDXWF;8~?qp)NQ2X5q5qoiPE-AQ)s71f^Qibz4^PG z9;P;iwfI}Jvd|dI{VWGB*YKLQ1H^ttNJeI5YbhVhm^rS_7J=rZN4=7W1alhSK@oaJ zfAaS@k-M_BmhgC!k#FPKgGt2FylT}1{-Tnk*2}tf9Mdhc3BY-vCtkdCV#9r`>{4dl~$EER0?TK|x|7-QB(yhz3gYSo9c1 zy7D3gT&<~AC9@vqp+|xl6cn^b)JK`1<;jD%U(vG7KOG$4@AgRsJp!sRw{#ivO-q}{ ziE+cL(j1uRtF#?Zxbhf2t+ctq?GZpPTMDj+JGx@%gDC2=rMaedr&{2ta`-e3)535C z+Kh3O%iQ35)C36;Tj(_y95*?=Z9Pzt#_Es7X>h?gxSjLOoq&EF%B4EXLGRL?7ReMu<{rlFNaZsI#_V8SX$4EmGx`+b;3$ zk6s-@KWmW+9^7-^u$T>JpD%AJmgm$DNG*@GpzVfj`uQ5az3TT&CIp9DWu)?p(d}}m z_YhUAH@ZI4aPAnD?<5H?8k-up~5(C3Ll~z4wtw zOvH;P7XM$p>#?fN)C<-c(HC(ss1Qy)cBs8w{y|C)@lQLRo*EBOwOQ~=haB~eJnraU zO@d&zo_@sudVi)z!0PL4y5iybk;YsKNWWX``&;tvHIqNVMz4=4(R1(n?#wDb)mPlcyMXcpL*ASDi@}D&OkA zjk5oK-R^tYV3Ga}cA_x(eMee$H4q9ngEydHyXTw-rT9v1QzTv82cq#q5lB=;Be@{Q zml!O?i`0-HU)x(yg*+S}-*?*J7hKgx+$+4z8DdQ0h6V z2x?PDt3v}3!Fok{i8#W2zTrfuVzUCu)_0clMdJ8!1m=xRBVrnS9O_SU3MF2 zUe^3^<*Klako1RT>DxJ1RBXReCzHv%NI{6fF=PIEWI;A7vV)6ck-)8pz?dzT2A(By zeY|`hW0q>2OTQ$1Ek2V~yBi&fm5y*%8iym2xIl$6aGnMidKgBqi! zCWoz>&U2Ju27IEhY=O6cw@}=8S$WHe@W4+|%c%Ams5s=Fr-)iY%S0Bba&AIwqv@Y*!W?t}#w-o9+vK$lflW zNmgVN%*=E9qT3!$=l&p-d`UoZx#(Sh#2`YAjFs<+vW5$ni_tG6G(j;oPP9gy>1vKR z_g5X4UflAk6&x7QlJ>7#MuUU3p*Ozj1|_s6jq6Rt6oxqrxI_QH9uw6kmOj{84r8 zU*DUs%Vk)ViO8?veq`B^?^>q?EstAuuHoomMYFcHa(^7DVx2{l^$rEB1ua zkhZG|mKum=rDWL;JjXK$WoMI=V(WMqX`IAK&SXjaF%mIi+N%8W@JjGHt>q6N^%NkWJ7DkitTfn(*tN#!RN=izo&D71%{n^sZtQ4lh z6r+20V^&X(@$>Tw*aAFey$~vm1E+l|t)t4=-%5w2Ntnk;)L1`A>k&-vhU^5;`2MLG zxaBWa!a0Jf>%fyaKIp`Z$SzNP1i?(z8>F07>BN_*HREBb+`sIA*BF7DT~GTr8C@78zs4|BGms+Gz5@%@wqq)g~NHHa9T(Li-%tD?|9j=53H%jx4( zhO16Bn@6X9P)jnkX1h15D={*EFSuJMIjUVFQD*S7@4Cb(3=V1qTVxzerWGoEh7A_# zu0bF&39Qk~5>jeXxo^HvqiIJdH(TXj=T^|QOkbCX8V|s0tobkxVWPTo(E8H|AJWt00mmL&Kxfx_Z*A>!;9gN zr|7((6WG_?{n+*rH+o1sNX+f^(CBZSDYNSHA3K1jTv%(bz4JeQd&6Hh)!Bai)p46b zgU+f%X6M~CW!HrCAE5$L%P{aufDgk!3*FnkNLQltx9lyequ zNxc%bM&t{}%^*Hn^-ja3E&r1RA38#3z#w~IedKyt%N2NkALjJp{Po@IA+#!%%o>Q5 zMUroGfBE>1zop`|5B}S_=NZS=n_Bz&i0Hplh{BU%`VZs9tuI#u@b6{IEGJkhK`^6{ z7l4|w;TY71&4QGsM*1M}I>>?nA+7xJU1ps{(3?T||L%yfVZ?~-)ZPa;NLV2ocf;J9 zM&C4#t?>R<14XF}<+esRy0tUoyGe7;Ql@`qu;8~p9j^a0okd5hCbb53$<}{a953)J z(zXm0)mu$aYy{sbM&P?(@Vlg`(`W^OXX4M z73fp6NqgAa$^ZNthUw3JVMH}Aac!x%l+#er@JARU@LmDQ`i<6{&eJ3sr26CWC5$l9=`olkJX%-4;B42czse&z?T2^u38`Hm+l#hIApLS~5uqHkT zJh=6limjonR)Nw|wWVH%;bAIOqVX`=(7EMM9>{9TEQ1fM!Yhl(QOX5Y7S2}aJ3tWA zF!o>we>g1lyLJvAkfKUoSWIENlz^y4xjGi_uh+J*W9wdxd7gVB3a%zX+Vda*76-q zIfkz7m{LlA#4wFaE~ORM9dy_b)ra!^{r!m;+P637W1+1lj7!K$_>sQs{~bue5nklL zC_Y&W82l=kD`WIy$Wk8X!8>ZTz?!me7m9N&Uz8N^@%7D8CCp=}XjY6U9HkJzh-cWH zez|~PcCkv;chpK>NgN|0+zvH=#1Rl?<{QLju;>sF5fyOo#vrrCex9UuL5rw|`KdmF zd`4pw#oDrx4WGq6I3~+aC{IHQQG+Y6Gs;CbbS~H|IB#Lf7pLY(Gi6d_D*U$9!uzC3 ztMRTHo)KrqIlV z{E;pXFU@&~78)4bma&H@s^8(#u<`~W=uQ^AIdW}Z>NC3!3u zRD&TX)G^980nd#r(Qr?^#HpTv)hAE0zo}tox}~L5IuDH1cJK(PG&j?@V#@kvEqt&` z;Q?0T&3bm3T3oLCTTsFjK|-kRA|&*;E+upxb}J>8N&Y8T>Oe594*N7Cxw%OZ<{KPq z6gU{E2@pE(@M-KcPn>4B0MB=mDXkGnk4F-spVF<-ZP(KA7FnWnlr~r&Q_h{PVGFfX zj9%qcLqygY$Zrx3Q5zJr7=wV+?46CVv4q9Lmu8=N+Xz!v}9JyOOj!Lf&aqCnfH zp5V`}j2v{|ZOrD!+2Rce4eupKwegK6N{);bd>RTph|L)yIrPdjs-nDOf@PErxx6IA zVv1=qx%Po}U}riF@${SRxTcTP9EKMVa4f?=@V5)p!H7LEb)Oe} zY{DOWfT0^k1m89t9A-66rLA*xnPrb%bCtX2`du21A73%37hy-`@O^4w9YMCneTXb2 zHY1iomOIjnePNzO(3mJFq|1;{KB%HVl1NOIs)83H!Ca0dAT)+Z2sZnVuizNP!fb>E zn&NU0C~}|6MZIf`-Hb4!T{vN|6-H?H=*Q?a_QT-x*+U#i3+vdhzMNCV7Dm=c{JKZV z7WXk@CNqd1vdTI<@(VyI!BN*rhn+ON?rxIoXgoo4!~Yi9{FUhwp>t%58t7!x#bqx) zcwyxcsRWoAKc&pcjGq#0Jb%8hY)F$e!_-;!S*J{knaTO=^i*rx4`L_@*@Lh*s{rlE z=JoP4Bbno$@W{5pvBtCvmRlh1CW3|VqWe0wQL8Gm{!kgmMip6%Y8lP9^U6U_FSuOX@X-l#O&P$FkQQDu+?7Ap1f+_my$d{V5y%d^Qp)#1&8|Yc!KGM$<2jDRj|AeQPtNRp!yn$m-G2-TL8#1#CMgC!0)QBcP48XAf2yr`Hcs$o9?PO(NP!zT{RM(Ccx_3 zzA{*<3e2dpS9q}lgbg3%TR=BKr8%R;`@(|N8B;q8df-5EYnY?(3O8d~x9S#Ui9y>-8liUUvTU$G)S9w~E}{WiKQD``Hs*4}?_s zv$HkUz?3mU`?N%z_lMc{DV8eVOp2@hHboj7mA;ZQK>^PGh%2BcLO31bck}XNm#ilv_MBJL7G)1M5 z&!hpL4&HKwW-y?lqnQB;kIl0ampZr+&iJv092S48{s11CS-8aExk$3nR$GB{h;&W% zgvgA$oJgl4)T!AH?n%Ppp>YWug`Jx$#q&{SXG&<7la`v@?*ghF`hWL%acVOM;iJ=21VB({A`~K&3_1tRjeozf? zU-e)y6j7{JM-+Y=avVCHr=oM_LichYWTTw<;>C_Hg0$;wO>J zGwn6w#OKV(i@sRM_Xu7@6sp9-%k9*phOT%0*5`ei+tr7u!sWI+=&<6NkmO|-Hgo;@ zSS>1ovL@4j`Jtnc|86C{o?>cCeK1m}=I}4Gv-R6(c;MKet9)_e%!2cRR>)z~Rg3_@9$J?kG!hwePrlRe<{M+Lg=PqFR;%YcRML zwEpxFM@!L;MpnR%{$_*%R0%G%1C3BZ)o|wJXaH+9$J5fXs~3FB?yQ5Zh2~ab)=$nw zfG!5pUd3PK?P4;X6^@2n^LBAA`LO^iB#YJ`ML6O)%%MoJHfWI;wU)@tk@Ny@xi zT`p5QULGWlm;h-nP!CuX&kJ<;y5`m| zSML)O|2ylp8`vpWI%Ll(oisn53fw3^~fKLB_* z%DcU7WIGzKthK4jHSaIe!ZfI$y{$3G4a~zvoPs*jXGB_>7zr@_t>a?TJmDI zY~9}^xlV;%g2VsV(S6xy2?g!_;^PT z;unqX{m9~XjXG**2R#fjp^J^O_xe*633Y#m{Q(u*s~y%^!=HW`c;c=~eEqodVluAN zjiF{R!~^gd*L~WEtX?^Zrbo~VYt8+|*K;Sgq#Rj{%hptU_4SoPLGVPQGOb)o>OGBa z#U*=Z=+f-P=wBRkn$?C%(Ej?C5SVqV1yxSODp-5_yJpb9vhxjrINL6&5lu$$ulP0EMB%+ zkqu0-$RcnyS?{~S13%0X$q1O3q{7lr2{2ql2pAz+Z z?OD%sYN)psOY4tr117Vzhkhi!hlt{g4>Bc@lO8S^Iu{a2vNokU&?^6i@Yl*9&T(Ai zj!q!jWUk6q6`}M!tyU%aITybmZ~y2lmXyPCz1ckzF9rsuF#`v$FjK1@R}NJ}5}8nk z;K5vdzR|PeCuBfLat_Ta3#dF4z1eVg@R(tk3MwtvzF$j;F>GSsRujpepDl?ZQNran zMVpNwv}z&kpcY=39DxjzZWD?LCZlep@ZBs*`_$oNX6aXtEj65CjeX@Gii?ReUh`rW z&^6btF0S3d?k$C;ehx5&vof~0;KOo9jWhKl1cS8BXv=X*d7@vkJZxER(X`?RZJ)Qi zqIX%CiUNtjhd5NnpCZ-K%#GsHt)*&cXs8{Pur9BTJJ`6SGgXM1#yxXRtnXob^Jyil zqIVl)<(Z_EtTM~WwZ3jwz*`K|VZ*XZNQ#td?-G)WMaKT1pKVUvRkeLpwsDjA^g-hA zHbNVfY$x=;uJeXYX{#`eZ>+KE5Vd%Dvx-2maNWrs_c~ z-^O>9fP`hTE?oVec(56^mJ!NbpX* z?_U19M}{}u4rM2`1Tl_~3Yr8}4`#^mn`GyHTQyTHT>LO_MH0)R z#N!txZEq(b%~9y0H(-uoVf)M>thiY6`kuaZIKRb@cPJLs8t_i~x9LgvxwAn!f^z8_ zV5&Mjuiq>1C4jBl1`k}rezhrr;4M70dPM7gGkCtTO>>3DdU812%+h&EquODKmqmWZ zYuqzKRn;JE%jmcuKVvWnY83gYO+wo5Wi&SyTuS*?(!!lJ{9;pk;(VD--f!B zkHG&7B@6Z}N`L&;dGi3!_hDz;>|%X`)uVxpToT)W>Kvay>GuwfH{w#AP|%3|WUab( zuV6~RlJ4U@Wsp{Fphl-Wm#Koi$YK@_70anjH%!bl5bGFyEv#G}37s>6Dy;lh__|4G z-Q6c;NU&_EU?X7^aqfZaH-HD4ZHp3!B@PrBuq`PlQ_pZx)LLoepv8Dwl}|c!9&Dsj#JDv6j`_gq9wVi9Oo;`~h?$!;lRI zEDNAPAQMC~E{B3MY6iZbk#8%W)1S*^IpcNA?+xM&2oTX?#yh>YR@fqF-SXt4mLgvD zNY5cWK3n!L(NMrSAvtkGY&@I}E0bsj6mp18u8b0dNrhGEcSDNZ%iQV^3-Ocz0$*I6 z=Ueol#?_dsJnj6x5Nr89O>Rn|4l7n9-fOtjoZDFOyk&EzX__OO8W&jWsf@Vud+OV# z&Z9xuMB?~Im|-g)2A6K*PM>O@~RqQO|)C_(`rB z2FpF^LwewG7`EKKc^B#sT5uXp=M|L_){HA)jjqlzZX5TcN{uZqv2jXW|Ibe$D4Zy; z5bH=`!#tIXMScutsFbOJRVrv2U3Qy$lk&IgzUQq7=8Q)($Q|Q$^ssCwQC_t|4weNL z=39Z?G$IqZGL8S+AEaqt1l@Tub0p~gBLdTQ4iV?I$pZK(^I&U3C{!@^{142r(Q;=!^-_R_N-?b7+v-q-E^}Guvm;paX|2NR8C+@|WAswLLq1Z_c1L>u4W8(gD;2 zpXA$AT``S+25^Nn|2j@T<1I-KX$@Sh}_1(ZPZeX>4** ziVxNR%#}3sLsk+N1lt5m>hdCJ3PeE_J`1PlOSO44Xt3~>Gm~EC4m?zl^W1feQ<`X9 zs>j)qro#e~f7pP#Cn%OUom>EfC;nS3CrgJn(P@x6Bw@v;#9N}Oni@Pg12Vo+(8*VcnP zoz@RI0vqe6nlLGGf-hyO(UE%$o~A<$Q7d(xtXUpTB{)M`i3`);VOY!&#{COB{Scl2 z>?f9pV{pE#=@-A&)*+dXWQt>&oKsmL8dxkA*XRk0y9cQ%K%mvalaI%;OI7+qD=Q4mYdVik@^pJC6P~m4 zixOToxznKXr45-x)euSqP~_}5GX1P2+!r`axWr$xI5FwA-+tRlrz-J4V4kB#oyW(g z!yd3;CWIKS$kfA*B8y<HBkmzZ6hyLio(vzlxW0r zV6`!RHk?x872IyN%91vVh!?>9Ta)U~oY>D(e&u>vbowP48i_)|G0>@#-i4NA=(=AM zM%${l-TL|Z^69)G^ahes2)dlCTUv=1p$2`u&pg!-tW0+oD3yJV(8lVOPNElT4N_eR z)wOqeJ;s9lviz-DrmCkDc1WZsq9;E7NZ#z)9@0GNMgQ-2x&&p!=c+@qy@Wq+AmIh7 zR=^z}hD>Tz|L@c5GFMPKe$we=%61;bgxF7xVq=p&H_Ww2@WV!*bMGsmr`{_oXvKV+ z@GMW#fVt?)@xb0z5kr;wk9N|R^Odo+^_s&$%=geCu@8pMZ%bpnI=HE4=-Hz)X)F44R7Ardt)q0x4}EV6+PH@hn#)c{m2CrFSE&Vdrq~Ou!9{xu(yRz z?uT(twt90}^;lvb1XC~ig?zUEI=l3vdhXK--QT2YnM^sWcE)9qo$idj9o=qMSUn$n zTw78pX)#<^L7Gs_B^wvhqL(nq%W*bP zd{k7a+=FUmuexhRoBdi1+a6D*JX z&^J)(NHYJx?}%Q(OnG`-V&6r*5RIM)d}HIgP`Dgt+}&cdAfDGBrmPO6o;=>#o)dq< zxp-S~eBJG1H&a0T@a6qM^dZWG!D&d4zZccF9F)My`ARCNU_Fuhgm%q07L-Hv&Uu{r zt<_63hMyhKpW5lmCH^{Y`|s&xiJKpMX?eFz*afb;aWcPG5*tEB#DDC0AS<}{h8pYN zsJj05-zlJ_xY>St&?;RVv6|JV(maO4T=!xhDX8YEp9Es~wzeJpJEs9n{>-#nQ3lr5 zA`4xU63i8UxuS5^NwGvrvKOI(4g99y+etC-rljY5L8`#g5?kOpGwop5(@~yyb_^d_(%xW znhHr0ng$jU+ZOU#s#Xjj=6Sok(LJWSh%7zI(L<`3UyL%1fIjs02*fn#<1-CFH<-sG#qP z+b2ZAl}2|zNq*smgEA8t=3Oc!g!w!@Jd!Vlxj8i!eHYonPw=G|ZJ}#g_d@bx5J-!bW8tathqLn1{0N-K}`#ODg2>eLQG^j_jBx^K~>8B-C9nKLUON0NcUf2%v7H2 zYY8LX{Ok)A2y50=$QT*l>R3*;Q}Ja z=o|gylP}Co6&pF#otMs@|Aaz)8zXoRq8B&+SG`Y>IWIoxhg0n+BgwK`G4pqaGb|?_ zlcrL)PQ-ttdHn(O=N7JwRjie?=}d-@4}VS-gIwkp79^O`)orsb3NQWft3PqIRg>d* zR~QHnUq-mheo+&W=yi)`5lSdWV^jM{wY1XLUEvd_rpxIaqWBjZ`Nw0h8gm+{vkP1u z2gXs0hSV(eoosych2pZyRYO0#9Am6Y^YSk5;dQ4FA(Qw-F;1{KvY~9g@EvpUYb6w%6|am zpZ(~DSsa#@5XRV!S?lu)5-~b7`j_sAlr`mMWvHQki96NLJ4|wnlu)p2rcsj2^m;Zn z^v8xd+BgEdTxtINPp`6{7;{(Z57n!67*&CFu1{Qwh1mDYZit^0A}1#cTp5M0vv2Rg zrTmhABJ%VZG|Lx8EN54p2Of-ia^wxZVZ+1;ctfwg)vB{xT}q9uc)nyG9j7x+A9zm) zX7tMfdv`1z5)b&3kEewi5-)#e9MZ$KXRlbB+GE-GDzm;Uoqs@ddt3LD?sw@avFKK zk}#bBxmgDyxd{S646r&ZY=4!MyV$&q{jNpG-k=SzLZF(HwPq>gdu8n(R|UbdTjMQT zqrLw>RM8uKI3hkWp8(0QH9Nv1c722X*r?+v!yR@U$P{~#U<)`LYPs5u2HTF@)Eo1*&}$rIJohe*JV?ip6Q9`+U)OpsIqPf zIJ`_KudD&|s65;}KXhe?cRihE-NcjM^lo(a12-bNsuA>FuiPgEAH+NZ*O~-PrwAYU zagnH%AV2mCix$@At5`S-aOBG0q6`tUmJ`Fir`R)JATjH~6N{*UO*FoNQ+&5K+rX=% zmPzg&2aVK5bjbspOj>{1=!a4=ous_<_yNPyQvNyaPda8K#cLs<`pS`Fyx6s#m5l*T{;ciONj3zW8 zT^fqC-7@V83AjAmIOYi6!7+HgxCAaC&PmHg$^AB(N~uwe?_?0F8k*z!m#T8DFEXaR zA+(OVCQWtd(dB>D-OMi~Pr0Sh!+b*uB*!aF!xc$J4uus8U|d@;;>+r(zGfGKAiz20X+Vt`Tf_dumxXswkQ)m zT(0up&>B2SM9jGwRdv-bLw}(EDoWr)|LWeh_^2H;o7-Jn zp-HxF!3cMu0=3$SX#V30@rJ=N9JmSSwNrWXFluVV^YAZ!u${a^>!ILiFtpenumA}w zp33@{e{NF~>&p%!_+0KX;;N4`gA#%qx`HgGw zy!Csz>q1P@v6Oekz!z|W%T7SP2shX38aVV+ABu17!NdPDtmBAzeNb=fiP_Q6=-{HH zQktAw$mS<;Tb$GDzX!t>_pB(JdbFuH$zCL(dw~=$NG)f-@9=8E#N;E)?W^C>r^(KJ zmXry9vTFYwiE#`xPzIQD!SjCrR|Mz+x`wM_O4;RZzOU3YWonIpsLF^m*|1XHl2oQ& z^eEb~w2&2V2mLM}h*_`ZUys##;0vjt+XSzn`;1K1+fu#2X$5!7@!;2nd?NxGch85p znT?_DtS9&T37R?4FAwA4Jg;c!RfOZ44$O6;+($%deScV+1|JDgKtvz_(&+h>`H)-~ zC5CxI==w(UtCE#TyzJPF8Ohku5d*VcWfIQV&90^-_;04SR}&F2pQ9-_2BaJZWV~Tc zSMTOs0LbLR#unGl!kEUZ^FP*}N<*s(;Q22lpVEPplg6x$|DDj}PK}IMi$JsVmg>4u z%QDL>VmMh&9ATXf$q};Q!!;0T6kHX4LIwrUibOilu`W}U1kbt7HN219{lQCBDntHz zt{pB=QNV_~)`Ja7?KDZ*8P3JM%Fe;c+Ks&ng z=O$-MhK4J1-fdaTKi%=o0kVE8Y*}m{YQt*vMe|qNANGhJv{*mxEF<11@neyTif|NT*9(F^U zKQ@U4!L#I7DTNQ$i(Z{T3yck5m2!mk_H{1Jl2Y=1DN`vi*}pDNQ8~&l^izIoLjq6N z4=$&+Cfl$1@59(ivm!KWFDKP@PYU|UqO*q})+6uOfQ<5gIvh~_0jhYN5nHVZbx=}LAD zc7|jRgxP7`H>6gc13-+HVP8KX1v*$z(7;y8*CE__>}E3uhb-9%4nIfyXo||IrSI~V z;O5>&-HTK=IV)=z{WJn?X@s7bf-G6aB;?%ghdU1;`RQ-H&35q-(M1^x>*y-L>*-dV z3L-3o_^kKGpebp$3|E8WJHN}5bY(TE+>fx72Ky}f zD687aOFzU3DSJ7YU{H#YkyVZzN-4fbba(V^BQG0-A+zqYw!uVtb}~A*v{h)x!|r^A zljC{e#=A5((PJB&p#Ik2{Uc#6hBB9peXbsl<4@yS;h-w2>0DJ`a&;bC*?_-QQQ3}pD{Ixa^7C9J zv~>yW#($$?wPj(^h3XoxTpboG0q*Fc4%NA^2faB0#4G^l)A_VHk;}FRPp+DO|Dc+$ zm%ksibh3MykF{8VVi!jJ?RhH+)qZ2EB*hQa+D2DKztA=xApOLPm4RQS|Abr-uy`hU zlyrJTmuknsB_a#vWW|ioo2sJqKiW>*iZUT5?Lcmc7l}!2@10SHR;520BZHx;PmSi&;1H$) zK0Z0mjj85~k8jV< zrOkl7^9pM}Fx|1CJ+rVOv3=l&Pe+_+H&b$YEb^I`8Te^sv4t5OI8VF?VetNqfVt6h~`7ncNWHcOv~CQn-g z*iJ@+@gFjE2$S3sg}uX4D&eY$-i0GZgtSZq*>n@-=}Y(|=_owMcqtGVu*m5rhwRR-`9*UxVmUAzz4nHS@kkutyCXHE zhIG3sp>2IhG*7u}Zw*yx)Sy@*yec(?)sL%U4*+dEvoIBNZ%bDdv?v~=0O)Hrgs5)s zqk!c_!96{iP$0x(_hXM?i}i9Il~l^YljujGhSQOa2I)-J8s2A*UAKPqlf>W3x}0}7 zjBMQVE%9}Cw;mn3ebck`$fgs!=;Uv-7s4l$#&6eNZabv3WR*0eh(W1yU3I)&K6{Jp z4>0dluMYGd5ARb~rCuEwB-oA7evj|v#zXj3t&!RvJ+Ipd;`_^IZKZ<9y2g)6o3Dcj z&S&b-Kj#0+UA2(E{;(*gznNU}&#Ko8wM=pdT$g*g(%Y209Xq@V%I(VG_4u!P_`wP0 z7Z1aHHx{Z7>6Fs?c|2>lBpjJ?C4V#KCIuqrF37hpdglfI8_z@v8h4c?j;`eMV#x=o^#!(Y_NtjZ1 znIQyxh6kU9G5`}kQmUI)pwFUSsr$=Dt5WB)FKOxqBPJpiQYHa$a{d?~jewB8&egld ze}&5*#A)q<=32zl8|7Q5C@sC+8W#Nnfy1DRLx4|0ER!Pn`ig|yAKxN?1cstFBEpyV zv;VAW)L+$~%72_ar|27W19+-v;ett*1YDKS$H#vv7N%#BXkfJllDmDORRiik`8oYf zJ{cB>&nwksL#3km1Z}+9H+HB%uSEl^Cd^(`lwpHaQnEP8bHYocK?=3@P2CAh?wPm_;QNQU{f@PZ54u#KBwt`V`M4}Q}AUBl1)2{ao>q-rs?EE@hi4Ndw!OEot zo4W!NAJO|rhjyio$6IaYV3E`A7fGn%J71-%+lagYqIhhjSB+3Hds4*R(-_pW z#oC%V6+t5y_lcq_5ycbDQy>4zY5ZeD1a|B%c`<{9LH$c8q$ad2iL_Ne1zt?iI zx!%z09I;Ln@5&P>m6De>!c47TO$hI_mvI@E0y;YA+jGI=cc1DXP1n^Rq zUmV8VsO|lO$WC{7`?79A6Rsl3o%-xI@36%#S4BtOzo&y5r5C3~gWMpsNB%4T`io^= znAYK{5}S=onZ*8;n#R;(i9`@Kn zX%V|9pb}3lG`AaNrbp{*Id4$)5(J`UG$GvO&1({{3UMJ2Rn3MesXPSY-rUBYzLw zta8jU%y5^(fAU9U=t4;{z7Zt@#+NKG5p~5A37KpQ6omfB@uy$0jPPAHoxkG98{j8v zk&Y=i-P2c^y&Lu{AgtD1e!T2+zjZ&kp{zSp7Pi|JVTQ#zL`&B-#g&LS@p+C4TI2k%F7iUrHgOMJ zCy1ln7m@5P4?Y!QwMqM2jry%+VE*%Q)t)d?lmO>^y?hRN16O|B6LGP&KSoO^loH(U z+H#YLA#Wh3a+h9V9EEq-qzu~8w>#!@i&F=H-+a%?EfE1?Tp-yrfLGODMZ}?gU`fR- z4_RI7cZXQhNQ(orl46HMo%~z?K6^j3p=JwOv?a_CYlyKHyM_U4hP@!&LX-C^Oqg`Z zno#NBB1(UP)RqTJ$83g|xy+Bn&@X4V%F-tv^<`nxOwKjNUVNqgGN(ZM1%8=~jIwh(6!$2p$QaQynI(t)mdn{nB=(ZDzjU&y>YJ zO%I9pr!TSE^i>!wzc;?rpM@;B_Wy;gXt{N3zv`gZoSYiiI5sx!>f0m{IrM+ty74h? zZycI^L3JmVvP^701Mbz6`%teWE}#jDKIb(xK<%s zBc0fN471M^zvI3=`3v$*&<)$)V}F!Fpcx#n?`G?nZL{`*3hg6WvF@*NFWrZL;26LK#N>qKzTU9MA6*FBBy zwwiMS@Xi87oK`N}#rzIU1dne+pVnR4%zq4Szh!xxq#NpN#H*2b!nNHK<|OqJ(H5sp zVE77~cz=+Iw9P|)GoOMJMyujN$&4h>gEOps60XxK=;;$&Yk#ffE0bxKer{2g{V`Tj zF{-EU*Jx~R?wSSB5i^i<5dJY{_+0vHR67$K4KDklUuis~KkXQF=Ud*cR#yT6X%K-> zfD*qg?;_Aqu2pIMKLvi_gRC*6b7xE@jahTfI|nf6vOwH}mi3IFgu*!k(94Jlb%|xk zCr%L|#fj*BX->x<7qt7M5VS{8ef?Kpg=`+$UF+b|zl1#>v|CJu%MR>tOE>iuP$;?tp4V-mPrO5Jd4eWW;C*5mYDh zBR)?>(jFEO3wdN)$OlFo?)2xR!84-uwx5;1c(j<)udeV(P9ua!>dPXM#$l<1#lAGC z{HbYIG33@@OLQ2f*1$P11T&Amq*bJ6KQv&=MMaU1j$%lXO$6M3K|MP9lfkxnGrMx)D3s6%K_Le^7|Xf)@>v zQjqXtWYK$mT|t`1&!!J_hbnHA%9okt_9)}*oHzB`;Hx|{IAHZ#6t0Yg!Y({(l1xL1XIGdf`*=5y?H*Ja`BK?1qW1iN_8jmZb@$=83qP4B*fe(R64#`o6= zTqL?JM`~M#J@t_-XRY9$X+7(m(3;7Z&NrT4FFmLBdX&`qVLa>ltKXlYF8rQE{;ryf z9%jE#Z~EJ2?Cx}vdW9>GhcTsjq2re;9UCmHoqwRshen~L5Z|fyc zHE_VM`H^3INATr*RKksD-DT$Z^?1pv{xDN~GB5J`m{tmG5ys!{dgcFa&xfrn26ci} zrzjabM7*yQ5JQ|Fi)ohbCWePZQ3Qo{p;eun|EpQ9L(_dhLu97n&-+E8OYnU*X3aUkRvY%wksvelPBt0W1SGWW>7HSBhs^Y;7=|5w{ne*dXKa$wIMnrJ4Fc{))+$0Zx?&N(i4g;BE<%PjZ6kuqrsfEtvpof; zwKauMH9Z5^Vm4&$G_y$QN=`!_GiJO+Ps?*N0i$To8`1_^cN~8-E45gD)y4~{YJXZ+ zMqqP%ZP8UI2*zvI%tVk$9CQNl({&fik))k75!|h%w#_aH#0^FtY%N^DVZm4MkI35# zQWvUZIrqCUD9fOo72O=zLXS7+ZVLi4;vL!(L#j3)7i!yLR0^2W-7qpfIN|KkE%k3? ze-E(XAX_k3N^Ea^#80D}kypL&;)g&Z;PzwiLYDXW%DT1;An^2#C7}sv>)=iN0E9TX zSCQKuqk~Bnb@=>wso)1!S*npvcPrs6nDhK`qp78DBbfhve*+5u0Jy=^2RxzZKk~VX z5+eEhErZOUU7vlPGCvX!&)ZUSjXlZtEO5S%2Qja7LLZjmAHFI5B3h1F3OKV^zdU$w zzGE~wOkJDYIg|UI@bZgk+d*XT!_eyR--w?0J7Dwm@09B(f9LRSde?r~;q5hf!6Lxr zLux5zu7i;M?MSZq_L;w~^NQk>j@s94vdb(dXELo)?BT*>Dnjt9SZYGMzn<~i-dDk= zCj6Q=7t$=Z11E#Vr}y@qX^Um1p}8b@Q0f0Y`~-o02TCbFFOGiee-?p2QjrIj>`;jC z!%9=eAZB_iQ_vV~OSI$^Ef*G_HoVklomz0+x<-yuNw^gq-5`TbjO&*bhItiND*5dZ z*8LgzLi059=s)V)b|>C;bC+etdJ#BxvY~){*+wv&JyHhGS0htc=-+nK=5^{;&fg^Y z2TLs_g$E0@prgZ>e=N)_$cQZ|5YU2FzKLFHF@mZ+Jnm}0?Z6-)_!a~3H;g*s97qZb z88lc@kIs*1vvI;^o9XBWHCBFyyHkY|r|#3X!|^p_jB$Lb>k(>@tceDsD+=kBysXIY zG3hXsG)!=#gy%A-mcVf*Pnt;)5NBIDlnlp(vkk7neMw)0^{q;3m3J$y{#t0LyOgr5 zU}Nzx$>R~l62>PvU}}cMN9E8@sN{O8A9tFp3_kvs6M0I{X_i=}Iu=I=@rl3;vU72^ zWB{xh8vBgP|0Ss85U0w!&G;s`jw%+y;Oy;Kg>Z~p$AK~^-zE6N`sh&|kK;0R+!0y8Do5x2`3jvdeNXAuj@%E3~) zu(9)kf6M`_PLj*QVZgxI?h-}_EBdc_14eVAc8Q*xlP=arJN?i19v0K*7v-rtYUr#S z19_U{(eSxDKGU!E{R_2{6^dbvx*T>9DZ%JVlJ?^ehdECiEUWCd;F3nOFXfcpY|Gz~ zzJj9;R^V%91&oc`Fw?qmkDY#%131w1kWR7Zu0J6U>Q?SHOa;bbZa%XazizPC`#6h~ zSA8(rWVxXys1J$U2OcgxPWXB5oNon$r3UT0E4GP2(k+U)9jziX?Ms9@2(ixj%XK>e zzia}6P8|UZpMz9|P5r7Jb3Jb+_;8xrou3%h0!IHMKBEN;?GMhc-e$dcC87^F%VbG^ zQUR{7z}i1;CH7?*eIz7w?f^F5ub7`E4}-d`*8-D7=P>m9lC{33|8v057nxK@#;mjE zF>fozs99Bfs5`y707s#kOu?oGWV5s94i%=(`%DUB9+pVi%>EaX-u<$qK!Smf!f7*i zT|rA*1bQ-=mFej0%60$>)miFX`Vc@UL@Wd53c~m)qfD662l)I2dSl6e$$ zB+9LeTnlw^c{ED1ph2>HLx+OT#`Ee=xsLDDckt`Y%Ip}337IpmcuKVKJ|m_8Ua9LxbPuseS#dKUub3xnnr@+&h{J*NA??!D0$_xM8V?g56j}NjSP0)cyz!`-LbtS z@924q1opR^5I{#!BXI=GPhWe{GOf}D2E16NTpeq}#&mQ&)4u0B2z8E|ho>MOlgzMH zd$P~9P&QAS(oWwFL{!>MnY|j*-S~MZCZls17eYm;n|u44$#*M?fA<+MXXfm%JesL# z>)eYUl}T16Qz1FQTSZ}=uZ!QGl`rVpHeZo=HKOd`7;*d z#bG&oTBT3{&cNEylcDXR5!c}r6`Y7I!v5Rl{nP0BsI}7buuZ&Y{g-P6TC=@vM*o+J zrkn88&Is!A)5mlC$=x!KhF>|2VbogzR9oJA?`TGkqGGQdZiHzw12MCW6$iWyLA`A& zXKGs(J`d;ZVDMLU7UM}!`Ij;vr!7%hgxbudybj8I+yEbpEPRrW?thP*n6!RPg{dO? zL~xfL>t$h@8&k0 zANOYp)}NN^z|jl3-=ydUlW9T--48`peSJ@inyH<9#!!9M{64yK9ow>BC)sx|^MQp+ z)Bkrktl}iV!Hp4FifOtfjZpHvF5rxez-q+|NP-Pdr^zT$=G#H(J?D{xUSq zY$i=MP+}ir91@6gp&J@a)&~%QM6c?M59hseh_)Ko-A^^XL&xDptz>)AxF%2 zljF042d(K&f=1cDnuLe%D_Qj}sEa?i#J zAG84f&Lkk$i7vdF_BVBpw-v0OH{>NIoX;?kLl8XVBCKqjNyMJW-6Zdu=<>Mz?IJw4 z^WjVCU}#s8?gYK!{mW&ofW6^2J^)xnoVvhRL*~qZ7Z5MgT?Sy&AjzE)fvHf)3>G%t} zs9r8?jJ!mxs>VGE4YUXzYvbGb7_^M_DqwYxqG`7;)%=0YwbHYziye1TK-P^RBIAI#dp-<_;3zBgH< z(!vM6K$vYu8I)wk@7BhzqwF^m*Eh@eHPlBJW4pq5{E5ZIZL#MhzhwEGN7cH9+Dxu_ z*M+OLlf;eDSUsF?PsN5V#4i0!lkT{4`uGFg30k(H#jgG|-Q20=^i2gm5(a*pZg|&N zcwv0y=uOzVRGBo|;qtnY$hy485x5;TfP1p=K5UXZeg>02&Iw}HJj_(@Pp9T|=d5|( z`sD7G-+1otW4x$Hudrx0#(w>_I2Dp3HI_q^n1BG#p!Y2JPf23=Ywkl-*7r zwYyr4P=>4)?BT^T~_eSV58s~ z_FtXR66ZwNcv$A`(21n4s(i7%HhnO^IyFLYl;c(wf#^6m14Z?+xl=UBpAAzjr_uZ` zC~~Km$>Z#BznruDv?$^gm)>q}EiEPsca`NeTkr1=BP)+b(D*zO08%V2R=S5vFytTW zW&LZjbHBE09Wa~CNK}M@GIhTXhtemYPJ$JNMS~jc5SntVpf>#ia3uUD>ePemj^%7b z0+uF}T#GUT#(KKBk14BG^e%rYrT7itb|s3BN8=KyLvRQ-3?vGiz4mFO_}mNe#PIS6 zjQ2|i2X6+V=>|Uy&W4l?qQLxF455+-(l^6mg;uDmb8lvSsV3|ptki-MZFONw!`5>M z&z6#EaSBT;+>Ao%qsyu|NmE(c*|!XqWwiwNVQS>~lC8*N)#@{G2^tjWGYnwOC5>37 z3EQxBbac$yc^K;5$g!msc6H^x2Sa}v`3$_ee1lt2Mwn`xkLjB~#ZtLA|3;#WCbL(x zCw%4Rkv*h&8+B^8E2#K5ar2a+cG~{~E4EzD8JbkM;Y(~1a<^R>2P?xtGw??h&OktH z;)(@)D2nFE8`}T}4H~>(E-6OE=&&rxK)i_mS&QNQ+s)G?`MK%dFiqF%fgfRuSCF+A zUCZNswTo*0=o!BXSAX^6axwcZ@CAxx@>wX6^srTFYI_%PS(+`>%eXhStN9lKS*hg@ zm|cP*K(Jfjt4q?Prl+{GFkW2N_)wrfJbkWzp4j0NW9zGn3*Gf_k(=cyveCMw zklfVe#Ot+^-lu2V>k-wY=KoD0Vasrv_d+gQC*OQL{oavD+I{E~s<{rcT@g}^ybxbV zAAGH+lrOic#w#kl?`*_|NiW`^@N;fOT^Z$_#K?zsf)umeJi*+M>E?y+Vd~QjW{~_U zu}x1W8^)9*Zi?Hc$<+P{?_2wAGk*Psa_*2$b0T-prQ5lyKgOz;SL>79ysqbgt`^6g zoBO)hh=d%8V#fa#;fvW|uO`}JYuVU8Hvj2KApw?QuL`ov4zG)wLpS`J~j0gzSeL_3pp3wl{9u(x4H`)qqXqe;#8~zGJ$PBFGANu~t(tTM?a{SEWd>VvRlXmz z2^}AwTW`KT(Ig|EtwRzX5zwFK&Y|vc!hKhtULxrujs_lmv9OtVR72q_tN`j1>U8I8^+A4hYs9bcx<=*G&GJcIzXsKvSTBk~ zU%Z>qgrG!1`>LIW5%d`#*{(YV)_9X8i_P1z$B z$Guy*0t^4?X5Z--w)2Q5cTUB9(qxuI$FKK*d$jE9AdE=4veqQGcXuump<{ote?nmi z9Y+*+heq%CJbvY{kMnKDgNWi+0gfhzoHq86^qO4B1AAQxVs4&3@D~Ah+5X$HK~}t! zsPQ`njKY(RhuNd}sw=~!Uh92dO}y4WXRRJ+EY*uN$BDmR3j04aEzP#P#d)BpnngTbOHjVLwt>2qZrJ z4sJvz(tuy8FPI|>CZ2Jo1j#2&323p(G-k*KVuCmTy{)0OWOs`3k#wp*-3`*`(5K5>p+d5iGmR@7fn4O zSONOiC~d=wk*MWUjE*uM{eMlFG;td?;qNUiz2`&pL#6yDuGixkyvc@Qk-73nKU5?z zLDDh^ui6xP(cRk2mcyorQZg7E;F!_`pywL%k{vwc8OeD$i{m66C51iYbP%ws%^amglLAX_xIJtr$EnqP+o1xf z-rwKt_>p~!Lb_jJ&_1?;><6o+EZC*j)>0ZS)p<@_m+n<8Tn)+&5t6J&9eUGfDOgvh zt9W_QuQ(v4JIH1tqoKz`>Drs0EHfRKFP*q1p`)Wy7pHFqn?S`FWia~z!xrJ5moRz$|`Tgeg_+jfHpZVfI(C>V>cY@#M zy*>RAjLy>bB5~ezVLd7ILZtsHBK8#QRqNF>B~JHJ{b31FWZu12ry$F>QHwagB|P=w zTZ@#EvYU~y2foEFyUM2gS9k6Ds_~g`Czj$TZ7}ZfHs?Q51e~@E5^f`3`En7A4H7v5 z9Ldke0#!Ehg+>*X*b#WdLQFk%JRD(A&3v9WG$e+5IE10Z;XHKow#y8V3Bzzf(yhDo z$boB^zN7@jSyIV$RbnD1gnhB&>j9G85f-4sZu{F!3pdm+C|2voT((EhfxFk@9hjn= zhV4#7oJ(;D6Co?x3_)zB&&?^>*x-ZXi7!R15N8$^SW9>fSeViv5YI5pN~-3c^6)~r z89rPgO>6w*a(p>d4NW>;rYEU&D_Pm8u{ws#~_(%;0j?JvGfB1;u zu110jWaa0$myIAQIyh8j zX_}iiPHP~HmubT2Ru<*PjJ-JAHEa?cgQ2%84p*T2N$aVKVF3J;H&l+#cKtjp@xyKum5m zbC6kk=edSrXGU$fg>M;8lo;}^Rr(8Z#9V&PMd2|x^o)Byf1NDV4FqlCV9B72Mjmj+ zP3tlXPuc~SHufIQJXr9jMn{=^v2g&KkDL{A$?i1|^U`vtKt|%BzLxM+?m5E%Uh|>P zm2OlmK-=J%<5Ne@2F6elFp0R|G2`;I6HxK>Y$w2CO2brgJP zRrwv*-sKxtsk7)HvnDV~$?KEm0ZMlSMT-9TrfcR&b~xtRu~JS2yva46-Q&J`I%EkY zRF>!#2?&m42ff0lu3jo=e*@0>Ew3#*OdX($t0|WCvHxOB^*1C_A|n*<52GzZAJfv9 z=1s*ByVP|IIN~GAVEAP4E2HV)30W!J*E3H7@;3l`n~5v*VO9WL*GG>`*hW3B*on@Ne!V|wPd6XQQ;M4Fe4?D| z{`t+59InAFYT$~j+B^3h6NFYL_U}^LszlFTS(lmTedTl|f=PpcasDHgO8B;m?0?%1t|}S{q0<}3uQWJrD7#rS%8<1r zsIi%cy=&1m7=2)Lw!W+-HZdpp z9_=Zv`jha|0~}!pMPBAsPY>mJ7dga*RO%ixd9Dgs<qEl!Nzvt}=ew5Js zLIqMb^Vj=Xi9L!dv+R#{8p1c0TD_g})ybkO+pD0dIyY`FX|h0}Sj#0nSHmEWxLLsL z#z)3LUVH!LV9JRt*YeE3S%n~2ov%^$-N zOT7w@g2}>x8?KX~DXlRg(X6jOEaC8(CfOjomwzX<5&e!+Yihe$3CBDD z{43lx6c${FP{BTd;%*pp(K&LU_aJTZrNRre0=vZQ9g;|@`!-Vyed478Lh!nnz=RuO zh*Y!K0>H}7khye8Qs^cd(z!K1Z{K6HQugrju#HrWaUJq%66}+3D(PZyx$bqd0grR*zzHG!>EN@! zT^6t8ua5j-OBhPpY7(q|yfz@&oidLlNhocJY>%FTq~7(OX+v5%)(4C2$Nl6rQ>#BK zZCXVD5og9%ww*5947jH|1Uc#&`t&nxkXHmn46JOP7+$$=dqBrO>CryCp^ zww$}Yzhki6yn~5nO;^M*CnQW)uhQ+XcF9J&Lnx>xb-(j~sGv*u%ATcqVKK$vD4KB> z@)-s0DZa8Bc83tw56fVu`y2lr;fzqGQ}I&6ckInqXBuhLtX_c2SMN-gpZ;ept6i9LEi?o28_743S7G+?zFygOqHWn09859vx|aO2k8AK~^xXtG5aqe%V? zGkq||m1&oIw6r|G2s5P4Rv5I!^u$Zie6p=uVF}+YPz1*eP=${uELMJ1%hNZt^p>Xe z0-kaS36CDuA&vKyo(g6&NB<~4ax%(n zg&oAs!G)RZyy9YrJJNKV=#@gstWLSm(0Yuu$#Nv=dm6V*@UwtOMNusQy+po7-YQya z^?Q(C5VYq?qRHW|(?UcaxfHj&U86pAMq-5MecV|zsg}c55J?^B&`2Q%H@5)B`tQDP zgUhgFIf*<(obKg>Vh5p_W$&}T_g<}5wj{1u>%x8kYNC;Rx(hx9H}}t#n$hI8DI7$1 zAS3t;zr6+Ah2lwjw0$;Zw~AVeA)g#DjNhm?s-%?xZw9IAx+|*JhD+o&`IpMSGWjdo zCC>zx@Cb*n;gv%!Mpe`%mfI8P4*)`fpqo*@ZUUIS(X;j+9FwP_mp=;8a+W-}j_!`` z5k@0!9RD9zU%}OO+^mTN*8+tA!QF!gw_?Rhi@QsUQ(S|z#oetGD-Ok7ifeIqx8M+L zxp()TbKm_4Iho)5XXdfBw!Oi&xkt>M*o*bytS0Bx^PFt`*7Uhs<)vX3X7wK)LRySN z7x3XTw>T1{7Ec&FKg4=Hs>hZJP!6S5zg)%IMS)KQu610R_=?Q}H^I}FWdqkX&wHVb z+P^=Rd?>ij_b7du8|LvkmTEr)zC`^Hx*o{S+#DVjD1=;BINn({q(S_t&VcrjXO21}=;(FEG^H<1*^y)0V?N zs6FSFYPUn``5d3=?o;acIVeUHZsgDKDWfgRqy6^lsve?dM8jns-pZJEHtVO~7GQu>$fXPO z;M*;g=j1fmcqwp?PZv^bYx=orOsGdA5)z@!Ckdf?q=-x0RvFya)Re$n(LyfdS+T%d z^kYxSv*7A>_5kFqh#FED%Qk8ekK}M3a_z`C-}l3yny`V2LYf()` zqi0c8r7-mo)KFaPLJqh2vk1{IPCQAoHa2rMeWUbi!m%dux|~CmO04_QB10=b$Qiv) zR)cSZKjZY{|lr z4H*d(&m-q{VIko(rcvW9EG)8}(dS!KA-iTQw<;fb#yt3wq5SpK9HP+V|0UFVOgx4= zZ)gKE1w+rUt^Hl)oH-vT?m*b(CxI}dW#^*}AAz#>?!q4THYDd@m8HLK0Q0K{{Awz& z3mzD?O;!hItsjZv0ZfzAs03A`s}=jZhbENTov$k?t8${N@^3be`8+>*8Tnmj4n6&# zWg=y`x@p!s;o{OZyxM6+Mza)8n(Fi{7uU5A;?y>~_e2cN7-otRWNsAWDxS0ZBb)%- z`d z2Je$zE9t-9!}}y`EvL>0vrLbx9c-OGV3V|g#(oninwkhZ<*m1CAg?FZ%4uL1m;t?z z8`8=GtB~9YwXp_NT(Jm;8F}T8-&*1z=`ez~s1}0i^F&K0^Ko#liz~p6`Rex|wI58~ z7;Zvk;mqF@GK<87RKENkOJYm$dS2Lj9gL?!oCg;Fk;PSKLVQCYb`zglam(!3RaGXk zvn&tSK>{iRaO5x6U*1KLr41_>z6;D(kaLkh1aQ*2;m@!GV|ZGJ`j>tF(Q0C(qtPbS zC#h!qq-IkhGX!pC@LyDQ_GSBfbh25GRkt-u70nQ++tw`w>qcoExyKgFm1{+)7G3Ju z+t&52geDp}GAp>hTIBk|d2=j%thK?6%snk_YaUY}?@R-6%KBE2ok78a=ax;Nv3!jI z(Xk{~1a%>+iny64pr}`6?vly|qr7^uWw7MS;o7sj`0YKDkT)#1ruQe<%H1}JN&E%k zvFw~)Qldy9G0u~OODv1ZiFVd`M-VN&n@Rm?T}(C|qYOnLcd~c`6D89A83`f@CWdll z1;}n-fIH_0uL~~(%wJJ@se1oP!R$dBkw18SggVp+RQmzv-AQ{QHcIU-m6R zUgA~e4O%Ew{$Br6ME|dvY5+Ew0oy8p))Kk8D&r_gkrX0TWp#F*Xb&hZE_r}?YW0$< zRn-(x{*b(jFtD6FQsq|H-8`jZEQm5-3eVh0hp-rcW2ld?N^3prKS+eCruz^0(}laN zOXs~;*>xZrv>Zy%+1Z_kyzG5Q#3k_}Ixg|_M{W-)r`_k& z+W8zHACtwXglQz?8m8uZs2LgmkyLFp|A8elpLs(*+ZsEZ%)XOuPU9S2jbn6XE9q|R zFX4e97O8Y!CTs3~={oYzEuj@(j?rJbUN%>5m`L)xNBQC!M9PQT9RBm&``OmD4m2;s4w%pqxzh3Ju?=VAM6?nrLrlfiW~dVD-;B&OMk2R&ew6*(&L4|3a?HGJ z!)vX%z}yQKrp>ZNlhi+ul}#Ld=fw6Of@DT-KwO$Q@&S=)Ud8pni5d z@{lEh*?!qBSHlo?UEV8Q738Jj3XJ5Do>n6o?1Zz>hJ6n)+!tUs>ORqql z4`!#`-_K%p5wRPTw>evVIyxpr{3V zXBAIb@f~Z>V>FFcqab}9dyQ*j2tBDUFse+j5`xl8nJDDl#+HUuQM3KH@av)s1_x8) zuMhdjX-N~CbF^g{&Q==iO_!jg3z#V=tn>lOaj%QzIs_5yZTQmp^i%+cVD|E|e@Caz z@cO0i!%2kIG-{&vL@8XxS~_0%Attf*Ok96h3-q$BAt@M->q+H*PqU|-%TSVfF;q!0 zwS}v0kb7o269a&4ivf<02FiHXq$b}FRm2~0I+8`z?(gKqS<(J=Zz5V*?Y*sv;r?Yy z3*Iuo7-XXLp|dwUBD=UeJ%l zmBXOof@JCKB_&+?LH>O)JAT2L^EZ>U_x@rCs3onA+QGtTc3NxBY?cxsvC|Z` z^e6FmOK3)ZT8L#0TL1gA#`?)+Rg*~dUSd^!=z@{dNtId#HbfS&-9`os;d~EEq;IP6 zU=$|w6cylGRO_G2De6_)VrP!gB#z_4zxpQ>i>%OT2T?vK!l}&Vu=ApPa)62v2x3~E1!o^2>)_B1I;nHCPG{huD<#h zGl6Q@qdy)+iRHC<5UJWsD$A{bfM&cP3bo zc;^iB8-=^AxoOmT+fw zF%qxPlRA>rhxO18wP98gRJSXlRLwZDqXQ6B5N!Hq(TX(S=_R{+rD!nbq!G1_n318Y=jO0-VgNC_-K_2?N>YZfadZ`5Skg1&?iblnb*f~hN`zVc;{OYVuCVenzUzZ$}WVOpRpM>t{&kFp`?f9fqERjjAFj$r-FX~qR6hv%H;;O z-694D8TW~^){#-GPz_xW7_00aBnrtjzHzm#e*lGysHjL~S2whXg)xYTh-~Ag6DDl; zAV#7BWW$u?0nWc%q(hB(cfIXYb+v_{7T>f)K$ZhLABjB8rwtb7vY&M5$Ek-u(h6|v zGS$VqbKOys2@oVVJ)gqi0bq=OqC6dHg%}hW2y9|1}13-*}j{A&w zDuY})g`)5T2}yd|HODdG=n7F7pO`=BnJD}~aHJh+WS`matw6Z{Y#*_@$k-IV5}|#N z-7$1Cls-i3^F-P6(*)m(tRL4I4n5nMrgJp6a>)LiSY2Hcb`2JqWE{>=Zecl$0(N`~ z95nsp$oEz7Hc;fD6^HX1%$d5Oer(5 zlUwqd49OuNCbvG0q-Pjvn+%z+GFSdVs?zmpc z1mcphG!m42QR_sjt8hB+e8i`XK#lmgLRl|W^%u4dmhgWIyg&x*fA2_@oNK!_yO2HY z8=X#BS57JCQs&&+wThw!akTuHJP1sfFKVvXZjt1rFz`Aj$ZtO4vQ%kq3sX@m>q zuTobQUcNJ>PsJGc&WCDL$Zk7~wGt3d7OB|hrDFzuYA``uNb76+vgP?m?z7S zrB`=m<X2cVZ2V2k~ZQUS#`l`=s3&D^xZRW97Ofe{c(WD*B2L+nrdS@be7V0R+xmC zb!pcuP996Ih+&80wL4(QI3G#P;W8~Gd5I0C_5}8y-(3Us$Ro&h-iL*@d?#E5)WR6@ zn&Zx8!`5jjtK?#cZ^Pv~g zejY5D-j!ZgHQ5?7c1g{7 zsYIVUC~xWLKt8}|(daNr(uw8=&bInpA|J)X8Q#HHkNK6ALfsrXcIaSG^^)C7Q^&zQ z`IVBfH`lt`V=o3usd2Mg+{%g}BEHbod+o$P;+@N%)E>Xo zz&eIS?Y#8!6!BN^NSB?gxLx9(WN3~eU2Rm))L6HfR<=Gd!`9>RUvE<}WrVL$^`E}X zY9%Ywa@sEDx1?;kM7Sc#B97%Hzq&?be&0-o`#?bPyC|s4!AMbt>^jU<=|V;Q-fa~Z z8y^k@S1M=TXQvXl9Qjf*XUr{I9v6~TvfDUVKv!a;q3KQ4Ux0F~h!XZmPJSkL(NcgrBloSQ)$Hzm+A1aeF|$EU*tCMPY7t*Nuc@ z=M1G4G-&b9A~E(<1%I(K`+$0ry(_9Vu!fc}lc!IkRGv?tzp#)oH7Cc)>gx}4 zrf4VFgp??=Jli<09452cfMG>^^`z6g00_MzCODaz^<&}eVTiIaA0j?ILOkE6oA@pn z42CuO7o{A}E=qG8Jn=i~wU?)ktemH&oE?(qsqyNjrjnXQZw@W$#w9#iuJ_i-BqpTc zUFMxBm6yvatu8qr3lc6v3m@|+NX0?h*CH8%QrESoTi4U&(z42mp|-cZGy>?`+u!rm zmxQe+?h&>-gEt&V&MJA+m2`A;@C{U^A}5(Afuw}7rB}Rj?r5_cW#c8C4lQKV)0R5P@gEDOmo~CDleyb+euWt-yM;wSHy<~To5ZQNq1iw8--HVx(zt3y zx9(PZ1=XUW6l0? ziI(Yi+}o}uEmK=)^p8v7s-TsPSoT@tP_Co>v4Ltmo^5U}XlY!}J(%UO(gzzt;jDDj zbdoudX>eMSjyU3K>-J99_>TkC%hrywXXGuQqu0-}UAf5=A7B@60w`byS|S8Vrf6U! z-Ub=4n{pItv4I)Q9POd(mq@II0CP_%>?EnTvUxH-eyDv=86k~aib$7Vs8BIRM*R?t zNGZ0WH~l!cRKltPDLfJ$smz)5q>Ld_%BM008bu4~f9G{7O4;Trolcj9IE|ZW11)hF z(4F-V&loYjHg->`pc*vSjBIw(q$jvu)eCNa9h}7ce#n&4NF}795qId7Q@cND>6Fm7Jg77aCw=atk!UD^-JS--8KTUzV_Oo^m!w}h0wJjD|O-y zO3wzuwMM1ds6erxeQ{2Ze*pEqMdXgvfn>bbQ3DD%v+re_qX8E1NcF;GeCux9KmPI< zu({`dW4)lGKV|3n8V3sdr|W?n!Pa%kwHHud|G04}p_Xm<6Tr8Xg2(j zCHC)xa=|3TIeQ?#S}DkMAK3SXkV)0)t{tuEIxqZuG*wOXTu2;V9dkKUx~JeOgsF?k zPBWkj*~c3kzP0D(JIa1mO;OF4Y2laE^2Ej^Uv`phcEKfTA^~!cR^{f@WqnmxJIc$|`W;84bH;nNp-fjd5~JqC5aDs>hSr!qH}0@jQ-E1xFUy8He6JzxPZQ#lrR zzs4q~9!mmXj`!{TWRGJlYk%=LzMPll{jWPL>!%A#6W8K`E1b@Z3#VV?K_ixfv0TRF z(^cx=WS*KK%eyGNZMb3$jqYZZ&5UH^AooLmmpM$YYve5oal~ZP(7(Qm?Lu~q_u-^H zT?(8f-aT(ZxktwUm$jE8%A;|NX*KD|T3ht#Z`d?PFj8T2nwMxQ57Dodt^!{q!-KcicU z#=%vQe`dd#sMd<6?;LDOpr`wh7v8FfuZO@c7hvOi+ka@4mhtVA*P}~j`KPhTd2aWk z@`iK2wcDrGGrzOFA|t4B4t$$Q*HG7Lo@&B|&wUgriP$iMFIyk|_WB(o4&Xb0f zK0&`%$HbcYvBO2yrHl*%;ea^a%2uRRj1W=;`}4jdyuoo5=t-$-H%FN77=3gNXkF_I2D7B-gZ$dM*9QZ5(>D0ooALs_eAPO~a@{LmX z6rB~{Pf~4$lS=JkWYJtD1IBZAt51l}NBCUjV_Y6YD7V%Rd`Qy*)qHmo9{1Ir=#{i9 zwBEvA=!Y^vx^k1kX@{& zr?Gcj!|u3K;a`ZTb}XM__Ru}=Ax_CsDzlp>>bi!jxnNwTt{^7>X4SzmZqk<@EEJ!{nL!;N|P`&ArB-iej7RhG(Yo|tp{JEjGICE}FbRI9|1IU?`e~E{KwhVI3Y6!u zl&6``y%5|Z{NWqIL>=kSsc<9~Pw5!X?dWe@7GFKhwdla!^|R%)IfG6<`l8~tH6`ci zAZK%gjjN`$mA;B#&fc>DPud~#eLp6$(9}=JM=ERCvGauf`$FSel`_Y&;Yt2uoVyaL z2SxuIrU1PH=iC;eW9JHL58C(i`EUAA(Q|Vj{*rN3k)T9_aT9U)k8cl7u0O7l0Cq5a zWV=@jO6g6r_%5yzIISSPR)`#{`?m%jsl6;^Y(U-^4 zba^V9wv4nUfw3NwVp*iBKGr2xP14VRF@)kAl+<8^cSJa*82J5uKl)RewBkJk+Y=yJ z@@tx%HX^WDXfx=_u)14gv2vNfEj&38p(iyY|H6pe1oI&YwMx>WW>*(4U`tZyXG%k>ubxKB_)@&VPi5i&6zRq_yBdeonyt z|JE*fifOlM2HxV~ytLG+(_VMipeBW`d32j}iUd}-bT?)CR~AuUe*Z3DYVwvi>xQ7U z0U~7kA+r`Z1h(TiKkJ7fn)i`xRwD>^bg>QFIDAdFYLPOchi^ElNOlOSvlynoCfk@J ziPG5W?YHVLi4dKNMxc=#D62BpGGUi@FZsx7S5$Z>B2gl;k9*dM;@QoT`Nq|_ov^m( z_orn!@&w#553^;kmsd==B_pVrvIjc|^m>MSka{&Onq*tiv<_<>Q@J0WgyTNM}Zo?qJsfj_|j%kQiDLr{5drDBFOL9~|_ z0^3$bCMK`_yzs`8X%@~*pQLeLc!KW+R*tE?J(T&|d8%M~3wWLYa!|)oTXO-}x=pq7 zDkN7~Hppm76F^dFf=Vu>oQl!eAh{q!DJf?K>gIjv#H3y9j3>g#pHy&qjZZ6nL6<|Z z@{s&uk9Qc`kUjVYsgfcu9ggxgJcdap1|C)51!h7jbp z?y!qXMUR~!nbkH*IWBh1PBLcDDGa61-ahT&!-HTN2M!~)F=As!^#Ss5>U6qNvc0m? z?iE*`vgN^fldY^jf|;X>`?+<2W|_Hhr(!?MrG0Qy-?J4SQse{kKebV?5x zYQM-ubwqb83Ney0xi0oW^u=IR3ZH9K?8BEsO4<6iRoRMvOKa+RM}Gelupa}PU}_KZ zc&bpVa+`Y@lXxas8zc!>6MGz6J=-*X$#ArW4V4<`FRpi0dcA^SDgJ~Vmt6ko#xEo< zZ`NL(Q)2>d-ky5*pKZL{o(7D(JQux)S8|?poig2#2OJ{#Sa-ae>pJ%cz>(ME_$qN7 z(R$J@Kflm4K$s(=x75;Yt>tQZJb7kmeg3BX)uzv%EV;VR3;shYGJw4 z$@(CvXo@GNiob4AG>SYsgax)gTxmQLt2HAr!v-ZeL0hy!p%(+DqIRBKbN`k{*!yEB zn0`pdyGh0g8JrIO_;^d_R4{TYSpdz~=$o)$<*l8yvurWkVJ5YUBJ)Z%oxJ|=E7T=5 zap^7dI=PT4ty*9)hC2Ry$jPWBr?H-y8C***Ap#`io_;i3T4rFFCyO5J=0X{_6B<1C zFc`b))C<0TXQ>tEfl4R~JR7DY37M>YN-<;b0{n4TSs&60qgS=E-zp1BM8UjQmwFF;F6_JBBqus#5uiKB}}lEd$jgaVAG zI{VL}*BGOC#@iO}u4a=lDh{RfB%puN?T6mO= z>^(0Gj|4oOfKCAhS7CmJcYmq&kYHUtSih^i525 zfaxV}Q_2H~0PJpJ5Rp(8v0=?$q+!(?t1-BI)bJlY;!$;9w00|7!DU}vs$6ZK2?QxA zK^88xx^iTO{mO8SqS^~(8g@GgrVLsSc2ZB1u^oUFl%_&q zKb&yhVQ3N>5qV(%wl+9LZI;-}8^HRqT)N!ZUMIc_B zY-3njtyKxqN z^$p1j3k#NJ&4Z^moTW-^tP8!mfCC;h+@Fn{9wyl_+aZzN3X&|5*rpr+EXezBbyS1hbbj(Fk7zYoTAo&4D%scx(Dt5q?e1n+3~*XV)({C z$Q*{Tig+aR#!GY7g1Cj;z!T0QP>bxlsY!C*MkPMzhgb3HQtH)|x*k_~k6%8Mv%~dr zV13u?s>qL(&j z=7FKQtTN|7wSI#i?f$c*0oX>~8?w9P6ipuv2|4Vpn_ZlLQhykXqv_OxMoCLC`UW}| zV(;R1@}M&J3Go+=W7UWj5z7P32T;O3)L8slvzX#_UH-a65kh=HYt5%T5H|5c?>OsN zdgId}|410NpK4fv)*0+3oRV=g>~#=CNn+Y8@6;-tq4{W=HFq6M==9SmSm)#`luw1| zvug5DwFGeB4N)k+(1)_>V5$@iw?~yfJU>TAmz3OD^1#4&D`C$7Rt9YiRX!*U=EvKE?r{VJ0(92s8=C&~}zqy?cmfIN^>^WMx1zqb!EHiP74_Ro32ZKBi~zGEFlL84WFyp>iXI#?_n=} z#;+4hj7OODU026_jHmZ4bpzL_%PxPo*3nr2f5(o8KZo&M5f^OV!&i_h`{cYfC3}aJ z;2x~K;y8c8je(8Q65CBn52J}{Qz1jde(6sR(E8uQOMLDSlf+HLbkxp77j$|_CB2;Z zS}sA=Ctj_P8w2BDwG`Y=b&4E^0dx(IK(IYkc(L)$6G>+)q91O)L_?r5$!Z4*PEW=p}x6 z5L4UK&S-5|Dik#&oy8Q3Rn$tU9q7tX#o8D2WFP6N3Tcve)4JJH@g!3X-P&L$4gTIGe$ z!cND4aJ3vW_&QSgpyKB4(WT9g@^Y2U6eH@2hE!3fz~Y6@1Ai=ED+G0M58+?T1k^~- zngy*n?R^}NnW74}pO%>4#)qrjbcE_%q{;d} zk=Dg(Y7-6~Hq#l(Dk{8!yoyCn-V%QRW5E#W51t}Jt9JFm$0ygos1J)@5R^))AKt4k z>uoZBAivs~hrft-Hg6dk4^utT1;olbiVSj~CEw`>+>>}-pMNs)z4y7lS-ac2)0VhD zS-u$P8Bvx8cn0f545~s4(W(HWidJ~S*-!T`ohi8fcmdB1FK?cAy60jk{SzBh{1eaa zPpuo9>rwh8MyTMWFCmpeDdz=c4bOwi@JR8^Nfww4qth!=y<;M^xlzro~L?N zZNFYx8{Kq^TD#njKp>KQw6ogOU)Ke@NpG(G_3oMeO5%bdwQL$74mOVyqEU%12dD zq3;UxqU0!GL%ko2QYtr8-UYH~!+9Z?6^0#sW4oN?yR@Oh*K{vI@~e3~-6`1tls|$y zk))W_Qwo!*i>E%1@^aS|38d+QiVne(D9@d4H6%EWn1sN=>Z8h z6ZMlfT|R~>zJ^LMBqE*xWoXK%Qht#}fb11JDj%*q*~#?%z3v6YV)E1B*StCRd{j>Z z@~^C!qWRT!PJHeTh_)3|UK1glJZ}ZnI2j8w(FEYsO4+9Ui9o}os*X5gL)6D=pcq)K z{q9$kqMe51TGaFlKf4r&pg|8iUU}nDq{XM#IqUVGAj!K_kivhxxuWPQnG^}d6_G-; z+sA~wmsr~2`t6}T;W4k9L6VYos)SoAa*+drogg@EdC@50HA}uS^qiiM?1cRMT{eUKJV^$=(s=azrDNL(^~L7@M*l-HV0+eNZ!18KDaOP zx=<#uZS0bGsO?C|u_c;sRLv(24u3wpq=$0B8vOem&2E<{cYrdoZMz zm7D%Ha2d%*8gJFK{6RK5;g?Y8@W9l^vy)Q?r|U)8OfIDup#He`NvfHmgVQ5r2>5-h z;{!r6`NUJj4eF#Oz(lEkfrIBnI(y6)iF~d)(umREALr0G1mL!Xt&|bEU3JTnrMbD% zjUdSCN^W#FklQnIS=Pr#q^!K$d4E7Eb_*qX)g`{6<7nmc=P$1i#@onF z6G^p-nm|>bux-Uq%O9*(3xh&xF zi{rI6vij-}+_WID-d_~rrwv4kXlG|D7-``dgUXD0_2E}c+9u2t-CyZNh&rOP?+VbS zOGwgH_4?@lK~Ige`@^{S$C|OJ`A_%mEaz~kJuuQlHM^zSo*kQ(k+IOGE@MAF(;5Pr zSXrVQB!Fe}g{MK$njSXL(z1+m_g`^1_mXf##P<^^!=+&SX;Cj8Gd_@=1CcD=t5P(@ zGSKL9;;kVnl>eeN%oPX8&f=bONo1J*fD)gXoMV{aHa4>=R!Z6MjWa>y)EPTasP6)Bi33f0KoPtWxDl^;i$agquyqmkFA z!T;SfsDeMJ(Y*H2>Igl9#w(5+gtM>&Rh}qU1;qf`dnWL8cNVxoxZmyLcGGZfcq?N8 zZAg8c{OUs1>e+BM1QU)dzig^UnE-q&h{OJ3gxZCpvAyFg)14p*Gr!6G0o7iPSXA%L z)MHCPF^S{sBH`n7hfgq9sZ!2n_%pod&U&_;TS}sBBtha5&ojQ^AIZJo3oPQ}?~ey; z(lslUWo1q$i~RnFMgExf93E?af{q2BFGX|i?yMVIwZZPkMwD$2fR;+%A54|kC3EEO z@(L7Cui#<&RQ@Dq&5p@j{*NrjaU!1k(NKV7y=ziY`RJ6v_8Uu4alig1w9 zI_H^yJfX6!-4!*^%<&bb-_;F1z!;EAZ4&W(FbuC&h^&wp?$6fQxq4Xr`-Qjs#Ub`~ zGR8lV#K<#fVL?|o3%5uuXBX!JxuPAWEB-vqqtT`c3QeWWTchA{KBQT_-+yB7&30Au z&*WX25`~X7a4*#(So9qEJ}2x6-Jg0m{V_z&?YI!7dg-=|7QNsXb!x=zw7I6u@ws?g zcAOUzGD`G<`7g{ll^~|Ya;PW@Uc~%_55=_MKm$Qjb+X!BJI(#Q%Y zyo1hvOY*bli{G&gv)q&$!coXkPPez;KRLyu0Sj^!;`aKJDruP8^_?LeXcB8+8vg{Bz! zN<|mG-W|E2xo)^ZT`H~G0X~jFvFxLRH3TpSS1#!yLMw74e5&saV}+}8{&-S>Jtmnp zhCRnmeoW?c#C*Ok6z({@D&3%?7#Ps*I;^jL?x?o9N%0gjXoyzrE$6BYAK>Fp>Rz8N zo-jq}58K{`0Ieu+;Dox4S~MNUhYL{}H)2OWA;+j)*~%7q4eSFv0h_Od&ac1msCeGo z=ZJMBRJeS%b%^NptKjR^#bV;j>~o0Af*TI5(>AJ^{lT=pGQa&FvNx`pyqV%(rK5{E ztVso0QoDI2cx74^3YSha9A|*oJoO%xyr5lAYsCmL`jpoWz8@{-iy@8WR2T_G)%m;=k9!?7h~g*+@aB7OUp*3*1*)Si!+0WT4;qw2X);?|a98EY;Zq>ghw-*kOER(k^VU*Pt~aDmB@wp;Heb9RcTIy$?i z8YUGh&(n<1NVPMv%FWf$zDdL57bY-ZG%d z_ZDef{Myz*#2?M04Y$h3FTRNDov822m%Eiu;!j%=-PcKY7bnIZc+jYsx%H(fP?|Rr z9%yl^J0fTAZ&Jxzy_m`{)756I*5~T~>gd{XuNX5!NO^HrSC72SNd3U&yQ;y(DuXYa ze|?g4xXEr39}?(o(@f3dL>Se$gFe}sCR=}YD6461?yWo023|jG+m7YVF_A_pBq%Rv z_GnZ*{a8+TOMK>n3I*+9G0RyJtLI%pND#Q?qnEp01-a{VxFE>L$Z_k~La`vAKddJt z&p?w76Y~dcf;oWDq(^<-3Vay97ixs27s@f?MU4Pje|t(HOXEz$raA1x)fgHs?SySc z`#BdxC1#Z$Qea>Dxy=35@+xkNiOa;Ja+rCvN-C1uJ$@uE(oXpgv9737unbyE6}Um6 zoY+L=mn)h1bc_y~I5jE#=R)%16E|H$!@cFwJ&5l%7_Z~$Wci`Y$u1` zU$l=>%+4U6xjQu@pv8NY{bhKJG|)R=3aAqV8cmws8sh#$`dbzpN1z%>Q1qZ(qHCmH zDgVcwU;5gddLRU2A2+=0@mn1*h)Xv$9gR?v>saHJ-3tQXK1 zhVaME{aPitfRCJ?v5*m?Y+?jxA*T_EA$N%8i1U4Tu$3A+l>g2uioMFBf*KaA%<$(N zlEXvh_DZ=hwf6{J2n7!C`9ms?zFrL+41TGr+o_t?X|Er#iTz-KA{-NF#4Y|6A9W~O zm~X|jV#=g>WgE6B6%7)Oe4{(2@F0UkIPop%zVBiPQ=tAzo>Wczp3fF(6$LvCIZC#i za_aLe%1!sgD}A4a7!TBo;8{F(_>OV<90S_~)|Xf+bgB`Fg!<%_l#Q9%T;ny~E*kce zJ?F|3TpYA#Mar8Ub6BYEz#FmJ^D>UA^WTJqB%F5mVd<-O=%SZUZQuuGSl;51L)p0R zE-y&jH#IGdlpX{<8h1JM&T@QMb=fzY`>p+5n7p;~DyB)f*eyt@?b~;~m{$yR>ne|w zQKl1+I!_S7Eq-#@8}lqbhC_VszV?KOdukkThMB@?@N3n!*7X{x(#S7xA%Vl>sqR6% zXL(7Yv%!D;1Sw!H8C6+OTC1(dO1g|Yku`-J&rP+JDH3xN9b0faimptkTk`CKrwx_& zH#}b$_u+zY_*TH!cq(7*Ln#*?pU^3@1v5VW4m6J#Kjt^1GN!U~R$MjXQ} zBsMs*Oh5Wn6a4<+2F){bDC28O%l^FA&kK1#8WI9x`AL=`ELj18j;x1Az46a##Fhfs z!qneL)%mQoLd>mNGU9y&5q^x8IJWZG?k=i!CFkp&5}7H+)$W_j<$H>iDfYnHV;aV- za&4{gPFZDqSdpLmyxGSpBPvT}R=c5!wFqgiHY4*Rs(CE5aA`#Y{ciR~V8uVCnAml0 z#e;2$trNzL!rk-ofmzk|2;Axl~4| zGOEn`$7AmdbU|z4WqlaQViE{b5K=MqGAo@pGjc>OKg}A%H=8wBvgT3ofPJ`gS*VxRq6!P2IJBvK5~_&SDf}{>C>8u!VYtK6Ih; zs>X(4CdK`ZVacH;_51nNJfJ9yMKIRaYxzR+tlFmaeeoy6vj19(;W-QoZUMX2{&Ko% zUYz9Zou4#_Kob6$O-(|lt(U4#M;kb#zR&Qle(*tb<%~gO`LuVm2tS!WnAm;9!;pSY z3fAK!T@&d^I}&MqvhN6zSL32a;lN#UAwy`WMPn?y5l(D^5lO(Sk1{>y8em;5BFPD$|Q{yhrS9~csLP}3x&bISJtg0V9l;&PO8DD=Ay<3OA$|ZE?*WUM`z9Uv9 zdK31>bb1<73K4-^)a!;|xBeEUa%;GYr6%$Bu&pRnbOK@GYxUC3V^Kg@zcx12W47bY zmGVe?vXR*Mu(n9+nSMvw3W>z<|KaK_+@cDgg`6r?+c z2Bo`8q@+>6p*x0d5E#0%Kn=db#Vpw)HgQ{AXc` zu|ynK&LL})y|fS*#22i4SL2>^W90Et1czTXYI0Tmf-kT4Oa6HXBU|^1|JPSrF@zE zk}BK(bD7jR2z$Z<4<7(UOT5Xu+#Nf=8xM#>#iUXJz83JP3@Ho#jaJ(94l9LfKae+A z8*Mn{!9~Y14Jl~N{SmtrT`?+CV$h`eeDIQvJyNIaQ78u6$;le{7dJ*lK=n`AMK{Vf z^i;}Tg8hs_)YO|^69OOZ(%;g!+4}8kR#MrJ*Z{N`;3C2)3S%OpV^)?=5-zGveWlx0 zK*5w<)mWgrP9Vo^Po!UC@>2bML4o8Rxi6spq>TlSh!T2&RcqIvbs|S-ci=QrYJkZp zC}N8qT033v4#V1-Ju^Fhi)LxW#r7UhC`F)X)PJR)An z1$1w@x{wi4qU1LZ(-g`HEiacSVW;xBUVfRDUY+zKpw`y0>90uMXOG#7GYH3>gG( z`{qiMmW3H}Q~PDbpKX}tc@gsLR4D6Dx)ajlMt~ZK@M~yl8rYS&kr>Mdb#%m3FWa2@ z&bNqr9s!+-zyIcV$aee#S(o7b$n)oLe!0uyhH-0=3c;fJadB-cxTv?VkJ#%@6M4j# z5bx^vB(gfbMA}4MVX(V#mwpyq>V1`ax-+#S5xBFA&D-`AsG-Sy(KP_?hdd6VhGFRp zyK6%&-Z!|Q-ea9Y*8yKYzVjYrq2`y^``4=}DO}CUmbbI7WHM^Oprya}?K>~8c*_jChOXn$ zk7IcOnTPY~68?J})6avv9^LrBbJ3&D4_CRHP_K4H2zTeaV|zl~g9P>;kWu}PT& zhIEsyV86N-&~~5WJelJcr_?B9{R5IT2-3s-=*`TRp+%;{Kn0cyHKsz7S3Dg04VM@^ z{N1!=^E_}`^wxrR5|DrY0eN89jGKP4x_-^(%E|bN&S=&lwM0=5P>EA6lnu`xHH9=e>jbiR4Zh%v2iP{cSauG=q;X@axGi5{qaY zlrH!jjA2q%2Fo^mz}YpX6AM|5EDAI2&}2sYV2hF|f2p~>s!eMhY~b$#i_iFJ1Ie#H zZJ9)4e35A9;JkA;(xfVT18KegN;Fk;}^sjr{jk)oQqrXH6W)hUceIdArw?Th5L0ZM{EiVj z`1%Qd;SzBsKJhr{j-cg+-h7NE%8m|t$cr;BGYU%{uk%=aA@nkcmiy!85m&`;4bY(N z0=w<}xxVT80raH?$UCa%212~*cNEB*7x1-I<^enKDst|&Wc9+{MU?4Vsf5e?irN~U zoygSnYuYwd05;Ochm{r!(848kb4OfV{YBs=&S`h4{eUDy%(xVr%h(NNnjDk-9IGfy zGN#q^f9k2Apkg&kFxM$I{nn>`~^x|U-oaX`SC(znb3$7@=(FSNn5S0@W$xx z@A65NeWx<5E?~4*#{n$g*&BcuV$0 zO~DbMa}C9*Bkj(>#HGs2%+-s~5szc%cOtG~tzj!yi@7kGXy}E_)o=OeH7{-m#={8I z0O387B4@=FKRG&;Lc*T{&F<_QMv_V95-)M%F)l-82ZYU|bO>v;-?pt_aAOFM#Sc8~ z{1mYPO6JrC6}%4~7wVet#LaRmB>YcGz{V?*TQf61cPBCOWZ=$64ZjwK&~^j7t+R5i zm*_BJugEiU)ip%aDA^*V=+Ly}Iw z*^5vKqbjyhy<8>&VGX|(-j(^R8wMkfPfinFVE*@kdhY?^@`e$rC{L%+<${@iYr{<-K2nZda|qLR8ez*j+jy04ChFpbUrua3ZWX!o*Ls?yBFQs zoDMx=Y!!(;#^+(kEp>hWf)wt@m|HLZZ97D@#)Qr5ao4I7GxKsL4%8pnaSx<|oUfkm zr{{z3K9)j7guQ!cQ*4~~7VzPSwWpb~|Hdf=hFf(i{)??gvDfa4dI*ET(#&a zHN#KvwflYI`=iR5=W{#wn+bm?ZTnsqJrRA*Dm%7W2NRpqtslMHHi`Wc(S)v?ILTOC z>G;KY$$`IxKaw~mN3h05BNj(Kyz#W9R`Ygh3bkqNm>;flQ<*v^hGA8RWxaKY zowWTC$UvgQPo44B$8LzD*f|ghpBWGB(sFj5piPKX>{ZZc6YGvAARubCv*$OLb;L|{ zrcCUb{j@PeA_pLN{9G6OT+fbAb`U>4RR^|KiR-W({QL(6cKEdcH?PtXi@r{mLsK5v z)-VC~Q~Y{tSkIb)K~CY~n}RtC>Ijp3WjL84wa&DMlzh_6#%DC=$AxEs$6|r>$G*`v z`M!C9e9Y8w?}P?A6|QjPeOD4)*KuNLw&FUmFbwu>S0UIo9@mu|1I_lbN>biN@L_O8zno_Pa5T(wc7fJz*=BgB+@_giYIt zoNw?PCEY@QUi4eHGQY2;#A?*Y`|dK91mFBR z&S-JNnxOH!s?Y8B+3mTJ@nW;2a<#*n$RbGBF32mb=d|h-%cm40Hd1&`lfP3wG$!yF+^wWfd?pee{$fy4?f2rAardfeecU%gf zV;UC$I$fo94=t+{5S-(-iDiS+gASK3T4dXAqE@7C9~{z+!1XzC&l7N}d(HYeZz{$p zL#o$XQ?8`*xaFiH{g2^hcb`7A-CcJb?s{cwQ!qky!SHRPBFVS=nMEn~tFw3!=uCl6QGfWO}iIOWN3 zZ1_)H?mBWS)8f~z&;C(`K{9!-h#HvyOz<1G?yDbqb1{`c_F6<=59&9_O8n4^-h72ulw zDKtualv}ZX!tQrwPL!=E`@88B;eA0GOF;FAQpLb;cBv9d^4pw1r+0#!XK`j8;s4c{ zVb|PVm4bLsN!+>APKr*y)dy3w7y*An>fxhfFTsZkB~wflDh_|yht8$DhSdua?&mH= zeMd*au?e&UG-{*tOpc;w1{wi-Ew?*6;}?Wxj~JlG3#wX%gXyO8hWKR_fWt&)o>emi z8n{&Re3lX6@dI>@Qh)oXByPJR_x3_@rZ07b-M=FPXYE9~B)N=z-j%z^WON^`zLA>& zTYIL}QlraPdq#3E2QYfA3TRHh|Jm2V&>Ws0=$N^_CjN`?a;6Fw{O@+@4jG`|9Upk~ zIq)Dk5>LE4*9r2D>(9~Q77MBKZfbnpp*@}W@&;i%Bt}0UAFu2@jue9HHKuV1+oE$L zB+tm6$0o2-8y!g$!({p)6p)bll_Vk?@H-q9tODE}4gLCc{)*@qQUQa3`|H{Os>;q7%ZS_3%pI1>)hqYb__W1s?4) zYsgFCKjrRZ{8l}LU}$&nrIWjvAw8Zv8o)dCWrUih`uiF&3Ree{P^rVjT~{Zt+S?+5 zp{{A?4gVyCr`Bd7m# zvIzux=s0N0fo#9b^Vx7|UitWqRZf{Kndh~T(AmAu{M_KQTEKe)vewTc&Xm3(`qW_e zd@$O$LA(2>I}9hLLFs!;3}K{5HHKk`Y#~gXF<`)A+2x+s({rxV>Y(F1X8=vl!a_um zgq#s$<@{riW2JvZx0QiwtB32Yx>{3RVf`M~Q&tt*(@BC}ML++(%hjICNe9x@ z)MuOGTX%W_6lk-e{V$mK1+*Sjv35Fg^zXTuzP&kKIwr}?%;fA@AQrRiAC=(yBPt=l zqXcIN2q}wDLJq2C0Ty0#MR?H2g;uTb?wYj?78k#)lKt;Gtb0G3dXXb4Dtdbs2^!hh zcrgVudD_(lIrFU|j8B>PTnXN6@V}^yY49GGyhWwEC-1R zM?V|ItnFJSCXyH3ooLZg_f@Msl8()J_gyV_JExK#`*qT?d=s3I>ZE(kkeBWoz4+~? z5ACPJyovTz0mE+LxTotq$fcFNi1XIVp4C3d*ghI~f&A&cXZwwI>1NJt>Se|J$L(*7treMuN*MoR-87>{fsxQFjfx@!v|JX`aXejl@%NU$tJldJ{Y!j5EJnPXP4qO#DG*ANQQ&$la{cHZ$4_S zT1FKq;@R@?q7`gy7q`9j=tI|{SgN%O&KLZTGu(5z^YkSVpNE1z)hpy>Fz_vji0h2rVMg2 zetK#7C2Dd{O=C`>t?F>`&*VL@?bV2u!j^FkE)ixUA z(m0yvdzils4aa~mT^p>A8%DkROHP})@$EXZHp#yn^>Z`i z?&b|JnEM5U7FWe5v&qNAeu$%vRLpFS)SzRl4ELrJtu@m9y^DKK{2VJ0yp9s+yQZ!W zV-&wqa`EG6K~}KxTAv9oEi72_1JOgu#63zV)=bP+xj))i=d8;#{$9sEXm!KT9pYfA z7D?sPuMh!-vE;zs^&D#e`taDR@QogOrx*sUv^hVcjCeB zh8P+Eu{xw~wGB9Y6@fwic zEH^hM&c33=qRej^5N-@#ddIl7hF0SGAeK@k$##Pg+&QDdA1=Y~{g-@t*=>A@Y>l6C z071GPBs`qT7arOAZsG6W?Yq*NiDL%=$pCiq6#O5t5%T`{#+Af?E%@>E!ph-6_{*oNldDShA`X8`#-+K5weEEj ze$VqXZw&i})3QNoHq35c6 zdhC?cHJ(XUw|T-@W+@(loePm{>GXP?660p?Ik{^*w#6+q)B5=VFqAlUSp{YDoF>TZ zpDVBh+hVArFIJ+3kjPbijivb!ir#M+Q#Ea?QR@s&TtE3nr&li0`#FlyBQuKUGYeL- z5L8@gChL0?NYlYO;;ZLK|6h;4qZ#r_@%$1Z;pwzvvSb_*LfF1a9w=;f0}L@Oby|B{DjZ;+z79;|tTMQt(IH-4=rRP~O^;b2bjhk*^xKOboO0 zzyyO#uf`=$@W^-~Z0IZR{shW$R#~80vs%hQ6^0**#zLjbj63`9Uo~njHc3{gC1Iis z?uk;IPOvJMjjr1cbY-UC>^UU$B{H>lkx~FCac09V6ZnaSJ6%#KV6)#_v~2wq!8(=b zu!J-I-@WGV^a>6E`goXcK4pzI=2)Oa?YAC%)FTX%y|5Dxt7ID5J^wkQoL4HcHXMu0 zl&ZG!=oGQ!IIwocnEM<_uQ*A^j`+U5o|*4B@V+&S7}7enDJbnV2@YS>cJ%X4!C8e; ziMTa8iM8GzBdNB029_Atul9{mfF))d@gqUt&ygfyngJ)5QV+e!S94+lJu!Gif-v7-#Qg+lvsuJ1xHFIZuw7cJbPH~pT^F^pLOZGU z?qdh=Y@d>j_()4yU)A7@g-)Wkwqp+2metQJIf2yM;N8hg>DicaD)#7+Vo=zN&`y53 zmnh?y#N50m^yx$P@2EPtm>WH-j3Vtg<`=a_h1yT3I4@AX2t_{wslivb--E22ezB7k zPmKwa?ZKu$jFr{SmDCCpeOF~EBlj?RdkkEP>cYY5Lge6mwG)W@-pbd*zb{0g;Wk{= zbaBD83nYp7&3<6z^D3zN>+v!DoR}E(%U2{SXP>)L;(E9(YL=!kP_qnPL5W2MNdBxc zmh3)JZ*3b?&Y(g_2&73j`&l?EBwINtX-DHyU`5rStyLvU{@EP%FRuR=9NylF$pvgN zP_alg=O$$W3ymdSFbo0F+9L6p@Q#SJz}UF`L4ylqCg|c0nqZer%v2^K5aL-3Ts|(} ztNq~_+iM~28WS5QCw)WRSjA9&JgoA6_W`K9C|fOTnDg74MLi$wJvXRpYtB9=@eFC8 zgdc`fCLLGNq}EIGs!C-bj%&;hLpCbC_sz8t*Ut#XNkXT}SoNte*j<9q(aSho7b-hx zHEm;G(0#8Ro7n

      j;ggj|)itLW@l>?v{kQUvoco;v*Y$rM|31MI(^ZWds~jZY@y}Dp(~E$JzOn&B zXd$X{-pb3K7J6}Za4632x?%&Eln$)=Y-PSVnxIs4%N54I?n9lJH&t7iRo=90R z>EXabRu{k!QtzK|A#RFmnPF)HZ5*j1k2EyN2|a%l3ept{sSFM}+Sw_2b0kSlj$zPq zA7u{G+5b$}>)zy7Sy?R)SQjQ8)qmb;=X&4n<^0eko#*{Xt>;C6nAeGAVP{;=J(W@( z6>qHR=+#7SOrv4pp6p=8uZ#z4pe)##r6A{b!glZh?+t9q)T2YmP%?9RYIWXl*tjQwqgu zFA4O?a32;8p{5owH1ISqTPKTnXKeWCqq^1zo^OM(Iwd7ZEwru&yfFW5Y}$*QycwKp;vJx7B~(*>eAd5p0MZMa7Aq>^2Ncy)Sm{v%~;~&KpfRlA{DhPO*`0 zt))~$0}LAx<5Ei%&h!zYusK37xRQZbg0p<&eHjHOV@^hfrMXMo9Tas&c z^L2`X&eW8+8{(igrvGN#IzHd%ys{OL-;WGyRfsevj z>O>w}1g;!c%ig34a)}fG=l~7_o%m^gLgd9VTKglWv(=w=e5rnMrU4@*fYHX_r&irL zofG*Dqgz4fUtbX@m<{A)**!Z?!*Ii@dZQIk#eLbD32$1GsvH_mkmU<7^pLBaGYIN5U_6 zGjemkPum^bTHOZh3;zC*$#PB|8YovGFi_RBEDtt1awMjXD;OkCWvs5QJcDuZ4aHKv zYwHy;ZWWm`D3>eVLRqGrTB?zQ3 za=~asG0bU+*)D!=*~978t{1(}jH;*u;#2LnW2#r&Fs)-1%T=U}b4dz!-bB}?k?rO! z7^0rDc4jr)2v0sTxP~>Tq0i=n()T;Hlt{;>3(+5v#J7nuwZz4>- zd^W;>aoz6~${p}&saQB9q4P6Nz)N&)r4uDUco*4uM@~2SV;bl&^7dcN$vFxVcDe)l zC_co9ID|xW+zxbP|6(UO^XoV^uYQbO?K!=_<61^mK_Wp9*+^i=lMO-ya@vkn=D67@m=^ds+qN(fHLN%b zcN;;guxfl)7(%}W2hEOhvEpK|B`)*ztVfAg>yUCY`03oXnS<0}Dd6s6iJ<~jIGr{? zJ)|}+maW!>kam_V>T98pgk0J#L6YX~u5L-$^2;uSxn zYHr8yj~hTggGKY5FKPyUyDmNigvuo1*A4bX)F;-*ObqU`Oh~|PX~?@sFM7ywXT~#Cm){UY}BXuv2SG=x0W&LM!0WHU1-8Jo2$)jl2fnPC~y+ z+p*aaWp)n)T@c1kdnhfm%x&%>c954@76$`=7Nol)+fQ43j_Q`~h&%Qf4tm@kPe6A~ zx8-@e$!0kl$VXyG@|{aqYyrt{s}+I=6m?+!^>vdX?{~tEJ#bxn z)x5F@Of;u4uq>nkJMIK8@!eOgraiENXV0-{f^v`P^8$7xXs$)Q;6Av`rHgo>lit3h zb_!qNu*Zr3{M(dTwOuXheVGMJa$swto40FfqEG(%I~O3#@C}*h!t&8Yre;7^x|x3* zVvdqcS=Tj#6vuVioXHc%L;&Y~`EYG4O?WsQ9M+^qQjS`}K*4-Cnx%5tX{&Mc#fkh@ zHoy=dVIb*=NAt0z+Ia1!wiAYFTyqz=z-ROPtu}{k_~l}5c05K3jzC?K0g+Nrmp>B+f7QW0SJJ0j@{EYr zuXP+SNWE74*iob^lUDCEUzT1dP0yrOL7ASt&LxfwVH_i9Z27UWT}Tdy*WZkRVQleT z`oTzYgmC=hR(SdxUiVaS289(GLflCm0xvjiz1)Ms8_*5&T(0kFG^L+j=;V?_lF;`W zeK5)(ip1)lI=#j&?cTvAp_l0X=(Vc)MgD*dP|()c(Dlz&b~&nU+l$_&{ki-yy`gUi zDWY)|1wkmm4!i|P^@t(cPuFQrulz3=@9^6X;~#YcFUy~yaA$-jNB$y^Gh@c}8pJhZ z{3!pyz7;tQ35{>Vsr5YZVeGiUMc^2BoIcM#P`{8wT;;Ew@I5KXtomkv&f8X%ZEkvU z9-5J%9oLXHMxo{H%+mIEUb`>bcW9A1HHi=jPlEf`HDWQLg1} zt|HcueI1K!{qLzr+Mar(oNr!LL$;iRypDi!zPXx>uP2sRzCcohR-!VCZfac-r{@oW z(_VGndmNC9`~Y&%i=)F$j_mX;b^zXo%}u&_g3)!!0 znV$XWABuRl_MMWDVg05s0pC{rw{3$ltj);GOdo2--I!&^! zVvB7VnwI*lZUT(ppKq5qJ5&Z}ulz9RuAA$-w*I;Nm3i?ED4DQf6w5^5%=-tQ)v)p$ z1K};L^%}7GT*sY0 z#Ld91=yBT4j{~b#synE@- zuoFa8eV(88&q5cWKB?3pJw`P?R`~c1u|`ru(l^V)eZ%9wTAJR}fWC7q|H*Gf@9$LU z#xR8>nK*@ZMd_Q$@ZtU~l#dq9A{Lz&T{t{>F|kjK9r0rj+SsaL{-(r;JV(kIz}N}p z(pL^P*cAb6d+l-Ifm0i`c{=uQ7eG(LM=~y9h%qAec7(Av(yu*L@sjHN2|asPX29ug zHISUE35f&0)PW>9H>cMBgQts%Z@)Qe>{P+-=m!q5jAB>Gkxe4_gU#<<{R?I7Y;TqOcvY(P$%`Vt4`mkD?D?yYE7; z#Mh?pg@mZbOeLkOLT2ab%RuRBC3$ zof#?`?w8dIo??hLi5h$~RVYrjBvPWzNGO|Qio)4)wUJxT4QXj39oWtfIw8bb!*aRG z3Tkyeh(~q)RX;H4}qI%uK~t7P;}KmGPfsiU(YdS3ZKK7@M!Lm|zA&UMZ3l=@of zM^ECic?rX-T9AO^W~PKv#j|PKMt(WjpHq@6O*?(}{aO73l$3=`hv$@E%97dxm`b5D zU*-h7BSM4e3^;Rz5yWJD`-&7~@m(SK*v_xeZ3_kG>-}|!S9-*YE3XO+`8W*5*l`Ku z#VowCJ-OZ0TIHTHw-XzwxOs)<_!XUhF4~#L>Z}so2l%#0|N9rwE0;S7PCw374YE1! zlq%G70t^-#l5$k`EHQYkxW!PJ$@JNPeyMob{D|QsbVezlNqo5pVo(9OTEZOj1xUbZ zPVu2VhJj(00PqLrqKMwSMiTp%FN)keRckv^ktHOx^DCS87eD*!obv`@sb7&WSf|ks zxG8JB{!qlPoYvE0|I3?4-;+#yTRPi`w%RI0HM->CypNSfr^zlpug4))ZYa=Vb`sn6 zI>IunJqnkKRwi+OyQ81E}NEu1Ph`Q?!KzlLO5!a|w@Q7f%RYc5@ zJ{l(7_{d!B21b}k<-7dSXuCANy@c#KT^64GdMrFeg6`NguWqB|qMcpy7KOK8YyDss z7q+N_TA68oNWh2?8{QnetNEXN{eKsgpSpOZB_$t7#OSV6cavd1qYga|%)K`Uq!d9r zb&Vs67#(J&y@>duC~iI=(Q|(Ea21#=+8{2cQ*_9?^#$z@EZ??WUyRcmX1zMJvlgBG z_YhRV9XjO~ijZ}1aESft83~2@1ph!OC(w*3;neIO9K#bp-+JNMZ(&B-S|r*2L|By# zA-bW#vd>`W``5arlnNfXH#@0FcSgA=4~<=wN;TBLehJ-UsT&p5iAqvd|ZZ)_5q)$hls=GMpRj6bCfZR|=v#jHNE zU@y?ev!k}z%7eLS?r*M;WgIscMy%>o3~tty23#U)Z$4KiqBEE>QjI3=1(L8q-i*A$8uHTG%K!C5(( zuS>QTC@Z*sk)6H|Xi`_Vs?5qae>P$JR!jvzI51l=zelR5C6rZ>JgtKn}Stpo4P84h|M-EWvy9}fdrAQ$nVezS*wj_7gCKw8jkOM7UR$XeIm zcV=jFEuBHJW{=E>^}E$h#>by#nm2?X80q7${E~5E>9azoO}@vfj?sBFhYL;QPW;)_ zo+unC8=8OHZ9jjDxVhX7Tt&vOK8@$?&OgS1hUwQSK^Mu$pn#Wm+;27HJkiKI8PFnx zkHFteDqg?!#eM(3Xy*IF!=WnGS^uH)NpS$D4n4O!v$FEo;9iQ}XYexjsLqga0iaaS zt85VqD)OJ-$_Yh(7@9VF5(TfNVoZ8emQij>xhh&2a@zFU3V--&zRyXMejhGZR&a_U zVWswrs%cK2{2sb6nJAw>JzTDKhV8wAjqt)Q2ABvwFR*DFVw9z>%MPSI4EdmQ137Uk zCT+>#{-^zG+x>5f?G>~KMf7SY!sNoR&%}blXX~nrPTcAz$rwpy_)IfF5pc)!Uwrw6 zElaxjtU&Bxo9cq;FWMC%SG1&b{beKHgvaZGJ8={W>)*NZMZGxVxCPD*UcR}RbM$i8 z*xH)Bt*vk6{^JZb4@MlG6km&Uv2qj=26fU>g{q-wRy)emJk z1N&zY(^5}c!~W|+`4;w86d)k}-r@*;5D@mfnU$TIh$HDk0Nrnk5RGKhya`Rk5ChQ| zl%Nczlk{5x7EC(|0ZD{S&B?%(lM8;Eb-`-}_#jNQtk{x!iDB2+k7*PI=bXWnn6;a- z4+S}pcB~IOC3J%N-rwF79PS+S*1>#AX;X-j20EBKmeSX6lWsQMPLGf3>Kf%*Rww~S z*S=pIPQeakcfXd7U$t<4qnWYeL08f2b|fs{~bF)!hEGW zBc7plo8b;<=BzueUQcTK6KVe?lLeV zTasq?xnF&HhPdsJ&~#q&4BR|@h<;==yWvoB$UVJvfCT%U_~Jqy_z<513;z*6LP2Me zcMYeIFmaOGF32NG&coj7wihxLGM-wMWA-0@!~Z|b{`tXL7nf60@X3_=_3^V0-(G}> z^9B=Qu&03R))k>CO=!h__6b@5(+V1biyso;1~V{<%bUbCh@*#AaTdo)zi!gyT*l;K zbj)TBy)gSAL-HVxYJz(EqN$Xp!?sf?B%)CEvCzq&ypX?2;^8fl=rQ6kXJXs0@zL

      @%^HJMTJ_{RRpmD~^7rSEx|LeL#3$7Q|jnK2?!NTFA*~EGugIn>1 zr%frZBt!V6EwF7YDThmc+~s>hC)C{I z!H_GcTmHNFf-47h+wH41^I1SRPA*S?({*L(=tofTvU~V&W?oK`pQDXeIzJ#~@?osP zUwyl%LHvzXxabFEn<~on=p11#*qWtxU<$^;u|RE4uU)^=|ssYDmiJnud+ z?;lI!F`C+m#Z4#Pxx^5dkbA;ggUSaAC$c1}QdM6hgU)}MG<&D|owQ~5g=5Zqe{}*m zV~|1KmO|V86#^_PaaEFRD)THH+ne9R%Ncdwe~D?w&DBt{igpO_B0kKnfKg{>WPvj* zGYa}QuDG8Xcq?eL|8Sr=Wn|{fnjHW0?bMfzde|j&@i{CSBEA#mkiqV=Vd zF4HHB{M$N6Kc(1bXOuC1w<-A(SW2hr zLifMU*j0Wq>>ABJ2A15N8P(P%4LD%vn^6y9XOwjAJdhh-@UjKgrZ{ra$MXM7+-7l2 zZN=u8W=|+mAhyTbG{{sgGLL|**MDHL`jjzY_gV6ze3}(%{b-)PsgJ_^oSlfFp)osT z|0PN^M_HPzoix`cT^DB#^{fnF8t?bPB_$NQ_W>8e(*cp%tZ3$rXcBV4ll;1d=0&Dd zZ{IvwI*+9kf5f5UXw98;E}Ivv?G?pg`4e2|{*UReT;j`HOV+*6@x`T;t-jqnD?hi; z&VqJSU^HRdD43Mn#bo{|R6ovu%pg35{c{L0CR(o8xGQwGUdl$82H#R$Llo2K6VGm4}mMD@47n5E|3s?4mYg2X8)*xNK1f{srLDP@>PfC!I`Du8!yiBRf(9#{^##&keEsA7#E< zl`nsLaGgcijvfV_Bspn8GR)1TW4U9}g3r8R?Th0iv}XBPmSq|GY4zSR%a*_0to|~InTv+%a2Ar~M z+{*a&CY2ULap3to+lDjF8<=ih+1jCFd|(axo{nDR{v)uHHg(miJctSy>YY8S^ZT#) zx=I1I4}R>6ZC`~DvV-xdDwcJQix|sVCCU8_YS*WGLH+8S;z8V*17>ZofV$??Ar~Wu zo2lGMgOQGgD45PYmyPAf_J_T4(%TztYupYKh9cz8p6(`n<^;!;V^C2n{Pn%`B;ce^&0Nc|gjk2_($-C;9 z!E|R`wr6tC}GW_|b%PJNVyWOQP96eZ7> zXL+#4^e9>1b1NK}Rw?V{;;nfjJwf=UF7E)%MlCxEjj428c!-WTVE#B+Vyk)2fFK2c zpUHW27ggpt9ZymDZw68m5_)U-Z~#ZQwV!+PdqXoFm6X*Y7wIB=zA!48j+;7}%0(N? z&@*|%<)xMN)w1P_#@6PM=IOp-=D%EccNQHd$?Jhv(FYwtcU2DyXfTNi*&G<2=~0!N z9)d?;yQ{71MgGR{FzrLv6ZLmD;7#P_*LKV}&_}q9kGPHmr4;oDt zMRWH&o`vz!_zQ+7h=7tFmXw>HJ7`@0`bENq5uUjU3z(iFid;P%+%K89VH|0$Ka@6( z{h<|y1wCAdSD@bW=bA5pMU#!4Thc5Sc+~==3bj6qbun|nZls+m>(^8-#~KdWlnbv0 zN{{B6fs>s9H|ugSt2DDytC)XEL@K?<|4VBe*OPbicN!SVnM%jd0Q4X^l7sKV;dhEU zFjAUC=v?LUbm!351c85>-QqEi@AAhPT&$D&&C>tXZ;x8&2+nopSr7+dMo#A0v{`ej z{RCBqTT0svo;u4#sLuYJV%ku19OHmH3e?AN&_$f&p%{=k@z*)gQqCl1Vw9*958wAhup@(bVDAz_$|7gp*_uwE2b)uvX#vj zi4pqpqG9Y%9!u%wjklfXWXt2mLZ;so%R8*0rkLi$K5bFf9jX`TIdr{0xzvoL}n8F#F1J zlBadaiyF~tDGcycSFfXMb^tlRyQA|m{~*7dae8C0r}(_Ky#Tor%lM|PfC>-q1yLBf z!!2{t(4p9cCYPHle!X=_NTG{Sz1Ocwv%4S%hY#=H$Mi*d!C5Z-?y|gV+}t61WF9`# zKELFY226YFIv=Vl2p~xhaTvH4bTZ6 zT(Thf_2UAiH5y5d!Muu%ZH@eTyNT8g4mmrAzU9;OQ}!9}$J9;FNDxo$Xl#=zfxyiD zCwNqlc?Kq@roofp^Ygl7nvuqcZEUPH{3*joRX6}YqIz!#q9?~uMLBfoGdVLQmMqW- zXQsbIa1K6h@b!cdFO9Wkvnhu&Td}#i@p?b5Jw+*q(UISo>htWau24KVe27v1_@pKX zjsUiKYy{ezhDlH|A{fmXm6@LD2= zdT&m>Uf6&Xhc`&k069)F&M5QEcF$HJ3Ku(>4_XAZxfe55xI!c zelmFhZgRaF+Hs8g0MkF zGLw9z$o>Nel!*I&5W_gu>xBtfzxTZXZs4gIhQ`DE|~Bs=B(n6Yfqh>Cv9FB-S05Dfuo2vDwOeuW$c}=P z67uk&Yid?E1yX8|4DZ##U#WuLzR+*z3o7jGb;FRFe4BqK4(8&*^c~fD=4hSzK?}k+ z9UDO}Px)$IDrTtUftoe-qam{MMQgL|%Nchsh;wC&%r;s%hH!t>Nq~wxXp#?{O zXuTK+%B4hTN%{j{xLh)d#bXpb7tlb(MK=Pa%`oZfNie0#Du4i=Pd2teMVRFl+Pr;z z|8;n&Y~KpL_~f1MxoTS$y5h8#-Ho%({od7IsT(a^TW#BOrF?mFvFBAfc?XCuS+DN338}Js_Z=l?GLu8F!w0bV+syKX-Q2y{6f*nd z!dh(-CUc}4X}KI8EH_C#RaMPwt^5}pQ~3wnals@w4RIDtU#t#GqQ%G|k@ zwHC4d%LNN9|K158l?52E%FseQm^BOg4sLD;x&Nv8-^q{vRuFa)kC znmxZ4^oeN+Go>Wc(_>Sv@kOdUGXj&DCf-36q_CZ3E~#vu)i^2bw3=FiUP7m^FhJRr zl}`IqBzR#yrf%ZmhW(P6GMRV2+A7%-e6|e`4CuiT=|cp5vxs*D{w9oGkzf_z&2z-F zh9{q$xuvtExeN#Y4I;^ayv%km?euJd&++bd74=0!Mn%`{^U)B z6Z!bAa?UL)WmEPSNrB}wm{Ny~ClT{5K~0fNIaz=xQpw0fOC_BkS9G@vExR@KA!=iP zZRsg`o#4W*-sM|K0x^C|_9U_BiF@3TyS(DaE8`w|DfQ2~D|y>nGUrH!l)getT%f?s z9B#1w`$~JSK)qwszQV5CiJ`ivwc?qUC0pmZXRZ9^HigEbXXe-FriBOGvxxVy~ zc75IKctQ{lyAAj=U?bof;r;>7;y-xq7#hQPSVz4t*dr?oTrKNL@Gel&tn(cuH#suS zHG|CCw@33|z;V~}GhgSAeHsXOn6k-SPW!u##DczH+Vqsh{Dh)S1dDl~Ra61||%Yzeul zxtw=+R_VzkLg4zl8spCD0qo$o^(0EXYiCq+@5evAWkk2r7BOgsWTR6?)n84uZ+D{; z3Z#7rmtJo3kttet2K;#6tQ+8}Qw&ByJnd^hlafrgvA|sk+tKwFIxNwdB5!5r;Jzd~kGDaB@ zXOJrupYme&a>B`3!;{`rFKFxNr0;iL*S!PdIrdt{i^++pfX0=c#o10g#ny}~Y3hA8 zJz^K&l+RVsJL+vQvSpcLSzkX1FkC8#c*#aHF!75i+OEPV;%1zE6LFrOR8L@u5B`Wy z473nC7E_{mw}Y?sN|hPc5ElIICH^V~K_?PO&ciw)c=^cQjuM*ZkLI;XicG9ubQj&r zeFqkx@+u2>0|7PuKQ{0~C#MmD(tboIvg<&FnPf1PKIOQMbm(E+mX)c=Gws)|`PLcq z3iQ@yPZFF~Mh^kKM5o)j1nV0lzXERA+E{D1+NbWt?z-VD)ub8ZWqk^A8h>eez1(4l2*y9k3Ro4bEJi*h|BR` z3Aq2`9Mr57t(tW$&YDDXVa9tgfW>6&N~WLiwni;a9}Ke5QtW=3T~`jWlDvLa>X{do zBIL`8$vkP3RH1>yv6bJC{O*wmZuW9LvZx5GXn_W&cw+OTecIjY zs1C+CCyB~sn=%egWW%vTh?2NV(sp>cxydwc7djI9F2o??0BD7<%`=pxQyG6 z7mwWM(!TkX_6b`{;z{puUZ&|!dM`nvH&ga;|3x=z^W4 zqtT`tz8U>2z8SY>jdLcWjM~bOsZXC09&`TuS*)FQO4{Yb#k@N-$-aE(^tUX;y`TGF z*7DE(elb1!xLeP%pNfWnK zux!;)m_GS-v+6%?KuXQS=WzDa1|0tBtP{hVW2z!eImHK;~7}W3{=)3TYf>% z|9rtSy(U0ia_&_NgLBm76Kyquz+xvKEaqA08NIR!vLi8N0d$tlaK-9=M@R zC`Prq&gIojM2{d_rHvpj7amHyIlL5HU#+03uA26AVGs|ce}}{U4`Cu2*;2)1+Qugc zmysFPg-H6WVy6`@3FGz|soa<4kh|E9$F}*G!%e-NV@vzAuF?;YuTzgAGeN_Zr3b?N>ICyQK+$T%6|Djo5)F9PgR(^#>?ZE?w~lGkmK0CMbkh#Qy7f z_;7E;Lp1oRZj?FhPR&khj7y4)g(BS-x6TwNiLw{Z^i=J{~ zOjl1-pWfjF7+}Ui-BrD`_f~4eGXF8)f1&rk;a30sQn}^8zx=)a&o2)H4yutxjq>4D zLk_eT4cTm(f|OstVOJ0|GaMB&itPfU=YXvnl6k1cV`9lQ?^r->%L_r1a_Z+Ive0{* zN;DeJVj}%%(=me+meuN8XKA)O>o2d`XXTtlCEe#8y#Wc}TNVgI^{`f{Kp_4eIXBe& zTpc~&YC_1%w5CV^QH((?vo6D3INqeiFO0%iq^obuXU=W~RMJ5Hj&N@*rQ*J8Mz?v# zg}cLEfr;AG5A5;E4clnCQN{Qyxnu{tCfO$&kCs-+wX3UA95NK+f4iVRY1iwOS&0zU znOdd!PTbUF0ZJry7Ul^Zzv{XJ4!RllHZOuCMo1Z1L=8j4b~tH#h(DZE*I0h$7?l8# z_!Oy}OZxqe3LBlA6ipz!;b!mgyCaw%=Wv;GUdYSKx9;qlESBL?Zuizo-*piy+b;vK z3aA9Dckuu!1U}yHEVkZaMiErANE^Y12*zRcLcq#W=I~k@Jg4b)A16Z*10u&$j zt}$F{hKsof-n#gtge%z?q_94dbxh1$e+k=Xb5b(JOHBRV1&Kj*x;ce%qo?O!5~dja z{nBbo($`^`vF9{%F~Lp^(%kPkw=VEU%}5PwPl1R|r0?yX z8Lp0hKF+c*B)>5|lue9bMNRacY+md{Q(L`tbJJ#~4u6p%mbe~(N9;jRLyDo~jJ|5= z&s@G+I+24t|70&up<#6SPrk?YcDOS4&sGFpuD!|d?(SRchX1kUtepE`K#5)7_fYj> z0?z!2OL=6dftTf$%1-$whRwkC8-B;j6+M3T(?0~BlHo9@U3*j1I66+fjUqS#+F+OVbpoHF!aQ2s95HB6P&S!@hWT_XnS~jE&F-QSasiUOtP1goA1CKdnof zTi`(C?{^7?>yFrJE|>&4dm%b$2i&ne7qH+TYosBmzrOh~=~L+EzOe~QA}Sn9zD`M; z0QvbpU3vUXI4we-jO-W~dY{og<1D^-(d5%io_ViENQ^D?GT{CslqG!ROgp+|>h?i-tO-6w|DtCc;pU%v|*h!B!U z#{cnXFM8f0eYSj4g4JkfWb|{PT>k4=2IrOI<>I|W4(VXh2G2I}1>Gm13UAaqVT85N zwl71z07?Bcb}S*TaiZE>N$)(!*2FNokBaC46BS+R6oqD!?vhN38^Yis2^y7a>uY53 zw@7EhSn~fCnDXKWH3_|K8QG`OSy!*q6)(oWgVaAdi~j1aY~X#_5;b&2*%7+#+(G|( zhme|`Wg{A!yQi{va!gDt$@`C~X<~PC{{<`oO|$V}k2ryXKDBi-nen0O|NCBkD19O+ z2}KH?c7J+fm^DHCB)UYSFP)7g(Io(@?y@d*0zU6lS?M$Og))B?4FOc zmho?*BPH~f_1zzDT|hpu5z=Zkvt6acCDkGSio*&r#)J5*`7#Eq|N7C7yEP49G0NxN z(^3E#(FY|TbQX$THmHheZ$GMvDZXUX`WHw!a=FS28ro$6{`I*>|9n1FAs-*#)vl%h zHys}y25p3%B|nV0%KAE@SY+Vg0jKEQZ^DS;LIfMdnfe?4j$ZAmut!BS-U*SIu~e@3 zN|haL#j(VJWVJbhtgW1Wy=28m;%9?1T*bZQYEhI(c%Sfc`nxE0HLN!^Gvv!3fS0}? zH1}ZCqVn!0k8S4nWZ zJ!1Cjp`2wP7Uv4Ti0Py7`W=*Tw-GGR@IA=V2w?xRX@gMDqtB;jT*aJJiOtVjm?Jh) zy_^42HcW@iTv2eMM!gXDj6|`@*U#YK>IvWG_IAx`k?rZ6Br}&L?|`Y>5HStpA1k>b zv&blYlSQDoc7C3sXRq*L8#!jy;ph9F>F*fRKK%1#vupiD)hR!T&G&fna0V`aK*_{t zS%cYmxx>28J0jH>1EcmhQz$^nYZuL}Z3t9Cj)|3pgI`d#%tePXI?@*f{;H+ZA{BJW zyewd~bDWj%?l|K!*X8~BeUI8>Rbr{CMaiuLqF|?g7qH}!5>y}q%b=~yh{nJH$H2VS z8;8K1uhj3IiLt#nhZ1|`I(Hjzj){5Dq(LNDH2_T%Oo)M72tyw;? zxi1hh{5Alrs{3vBQfI0>d=P&unXCfltRI4g3n8nGL%9C|JlNtT9shZxr8O!>vGivWo`~Ia)R5guEuYpqu376_k@vhLg`bOQ2TLe?7;;;_1QVx zxC-tGs~>=JXoL3BFwl94!n}ggOKGYncoJizF5XSc6?C2WsjjA`ygPRIv7+`*;=uWn zghGxp)t4Z(mr1#*JRdDcb779J6V@jY)1Kcp{k;zu+C?Pfl+hA#l-mrK1AczZ2|UlE z?g&D~Z-{;H__qD8IqqxZJm>=NYH}J_P;9d#-RBuuzF^OeP4+ygZSNZZxAnClzG~)V zrWuUhWwCmS(!ci5eO~kTbWRMtWC{66V>PH-E{jx0TgSydF+oaDFX5|zZ+V2;qg>*u?h7a>|R zmwkl{*~?2EZ7na_Wgs(5O^vM+!w5#Y;Na6l93+l8WHw*~z3@mqgj5S6)zDCE&M{!D zG#e2@Bj)aBmBjQ<-b1dV# zREMIFQ!uI z#9#k5|6Ak#e8>bI^qac(K8lMkEoarwyS6)O`%uCxrq@L|IglTPR0U&a`-NunAl6sR zu_R1y0nFli9WxSI8}iiAgcqow$XT*PJHg{wI%L3GEj?BNW|}b*6?uC6GRm#Wf|-+- z5R5GJW84em0vor;4R-J*pHw(n;<gV8zCCFd9RDHMaYmFjO>6E_qfBM^YLop$SZdw5?I{3<=sW!bR92PJ*K z`B$)g(@RE)Z~HVa=jRvBKNRpk+@u?U5%X#(O_DP3Qx_JX=X6+Oo29uzO zf@bw1*rc43^`!J=$x|PEOhTIx@^pMmrKy>i_Q3bnl7a;<`9F|T$GBAtoE(6UxN#NnFuZa+Dg9LhiaF{McO)m1-f)zvFMvRR; zPiB;z?EZGgpUfl|GXP|2OHNF!%uvw>R@7iKq(ByVni92AbQeWN5b(E>jlFkVuP9YnT1SifgR_2N z?_H?VFE@sdKi<+_pzCHQHY^<)Z*Izu38LE8-S^x8>qXJupDEh}{@%Ot#TVgQ5om9& zLE95qvM0U?<@C<*9$9B4#a=EvxBl^KVa=Om?1pPm&Uojromv0@_dk}=Rcy?@zmfQW z+!oOo17MxACbV_5xOp4|L8B$JXMR>La$Ui}&h@x3COJRCau0>6N?;t@bWCL6{$+gt z5TBIR;I^-tn+G0AZ=KrgGes6*mi?;4F_D>Ptzv$_7awhts9g7?f6pM*3~&m1!4Z|gI`et? zwl;3jx_<}NRyzF({pBywm;#oAJ06!ZCbe4du34PK2kGjy%2k8Y$2zfT^+h7cRI>M) z3&8Eu<9F=*1)qzV?*<%SrQ7-7Vv4sRgeNJ=$~Xd$ZvGUj9O0Eh62W1tv9Y%}?;ma! zn-4lq>Vok;hJDlpib$CgB9W;3xu0p~n|7FvEYiiSflQp&& zw`MtHR4S*8MxgJl6*(4x=1P8CHEa~C98 zx~-m=`u{l0Y*p71trpUmkQ); z_Qs8KNsIU<@ja;EvuC(V4x+K8Nh{>-%@q$c39E9Qzj z5ESXF!`%OKnNC8u>3gAy9jLv{VC<7ksvWO@+ts9g&g$Ctp8FFfxm!xxr$ZfV?B~}Fy#VG|&&LN}spAOd zPnI69ZFQuyK726aW_4|o_Tea7Sv$!HCS{hGDdqwZ7_8QaR6Y-hZko~TKP%R zOXrc#FAvpMr*+&}=)#FvMG3Y}8fzMc=-}AcIFF2h*-xa)8|RB~p(%t!%XPe0S1BR+ zn7C97rxyH;B}9=?{|4JZ!A}bnN_0g_^l2 zeVEqtzNIMYuwu^;TArPrI$oi39{S&Khs12)(^?OqB`p3jEIJB2f(T2dAkaNg*C$GU zm{6BH@Q9eCAboEEBG$rgaD8)gb7}g@YNrXti5E$oMK8bc2~g#8_cV}S(4czJL{=~* z>}`Gdw2)4qN4WmyaU}=A2ycWFk%@`vE~5KlCmh&MP>243Q?j?*^`W`MMdnCOCr|0Ka1{c9b|MBgbjrKEZuJiySg_~YhPW$7K3q=OBVMC62&AVlk=X^1nvyb zk}#S|WW?YrdcUE-S8}eq}kRd#??57`K)x$KWzm+He}z_EV}DU z*8fU@8;9{Xu&A>8Rx(3CIL0T~(>}!E#aO-8MW|9=Sn&C?dYB37cGF|850?qzY#*Pr z$PRlrrM~Qq0wfI?(k)*BTq=?mJRkda;BljY7#Lb)haFpJ51nElI1#!V7Y1y zJ;>3+ll4u;M^Sbj0#~v$>5*0MgP)V-Ob6k(TdDxaJD$!*I(SlNI*p@p?fRNvUc_7U z17CQRhRsAdU{> zc!TFfFT$;s?w~Bo?t`6GghVzk9X{-PaL6d3=pXS<_K6yE`4oKlQye^+C%hKlJ}o-o zL&!~P83Qi2BhWHOni?C&AC5Uj0Jh?3IOfYvhlWxn7j-_##jwReebL;3A0q3W$*AyTA^ANpMwhBFZM(YB4`NvP3g#@ z^KC|-8&jU1xw%BEyRfK>0Kc;=_v)>scZeitTq=(`Pvae6w5$nySPM7~$dC)6c3h@A ztd3mt>b==}J)AV9o%ONr{8jLN-a%(uixzzI&FDY9v&CD^V{%56(S12!(0Cd)N-o&5 z@#!RO@{??%<t{j1 za_ON~3UMyhHB8f6fmx3o<}($EGeX;McB4ji7$jvo1yWfjq+DmV7mj3{#PZEME@cla zL&66TB!Tk9^Y2kV)Nz!r7xuhkM~+8=_l2?RizJt@vE(Q<+-j&h(2!9BfrZ~_NikR~ z^;j02UEf2L%IC?yJdu2krIiXFHg;1$^bO)!-nO>#NwEdqztV4lid1B5s#VL zNQx}I;H8NwJvLB^MJ}SwL*S&wB1XuP{T`7yEY460Fb0}h0jG`2@~U=B)Lm|5LIQpM zhtj7bKK_13=YFfl#FFBmx%|_L&-{5|hP67?asvyy7!~#2H9~vWV6mRgk|{yZw! z*#u*L+~Gt~8k+=AKGE6l8SJM%pl;#b{d!_#ytSSd%rjJ-=+ia(tSNh8XtDL_(u2jm z{XyQTR)de*QLA6l*(U$J>~Ch=6#5eK5lH0KakdJW+0*Hci#hXYXC1Z8RTwsz8s7za z%9}y3l0d)pOc8jsYIw?2U%I9LV~n}Es`dzPNtT9!(#6g#Bj{q$>fz7RXbsY*7#E2f zx`@E^**GNy@;I?2o@tVUtf$n^_3MU<6)3~BuX4FKs+OH}wS~lFCVEL_fxTKmABD*L z{K8%wIKQc{bLz~0W2|yr=jvKhz(pwT*ZJp^sX{l}q^<%_qk1bFNqS)^F>UzP!hMZr z@_WRm;^j0}HSYhL#<|7TDb3jN%N^*s)RRi}Qq_5%rg=mhdwO=-)YCLMHz#~TN5}iQ zFKA_vr>4G6cw?QN=2R)0oJKcH5$h047Qx0-A;A%NxV0`7*z%S7bIYK4Id%ql+hkk( z9<38?Q`c43x^pbOE=zmD00b)&@MXV*ucpG;CSn7sUkhN7%@Gy0@~UHc0(+=g*KPmC&HWN*LI2!_Av_J@-ct~9X|&!>Oh-&U}X{T{JMPyg}z4Pn0UK1Y0Lpohq! z;F!HdC!q$6ODBy@J%gnaMu124*+IRzy_-Wq3HrA<+gb+l{JgX{Te!|zi@aBXRN{Z=t2r)4%0dTgCoAi`L0vp%c0b3GhGx#dy> z?1Nx3rnTZ=zCmi8UmZ_g($p{-#2*(h>pf4hJA!hD=PdsL7*&!)_)1~!NP>5D4PKtn z!}V0E3vlVF3f1yiwyH%(U9FjO-Q8!^df#>6wdo^ViCEu$dxqgF$2h&X0LEs5dOiVf z;D8a3|4V-na9~r=_vkkTc1aq?#vLjNGl0|LnF zj2R5H>)H{_3*7loAp)Nmpak{xx5mz+N&?7#+m8O%l3ikAJ1=o}*;HGBS17t49m6C| zBbuZ|dc*IK>+w(6;+4 zYtwx`G0m0`qEdy5nUF3nE?R9e3-DY+IEz32){(p$euHe^ z0ZjAdE(AkifWfrKpPQy2zhL*U5e~J&RtkH5^WkBLMRP*4KDi*LMjbT{=@H38#++BzE%1UPii;Y7E=u?Cg%F zra^m;l#h(FP6+D=vMi`+7UbB{0BTIRO)oF7P}IruMhEmE;^@7&H-&agiJhC9a`ka( z9&^mYyq#s9Ssjt#^5eeLPp$#~;L)o{^8SegdgWJX4vDIa7f|}I9W7Hf-;0tNw9_4c zYgdzg+aTuPCb71^36tB~S0%YX)o!J)HO91ez_xnI7CxnSgX@Qj@dnE)Zu`Uits4G& zbp!F0)0X#i#1{A8hdH4BCiTpBB1Qs@>lYX>``$|Lf^N_7sWUh9E#{e?#lDD=uKJK; z+kQd*qnpoIhEn4~;*4A$gd`lIDt8z-8c-~ce_#PM^3?5Xv0r}(eVY5;g@ZlC1J^7K z?Ho>J(-vC}daNsE!Rc&ml3fm2ywNJxmp7-JJ@d!MQKqdGe+(^hC<-(zZB-&8w_G?* zH}4F}Vw;fiKbP&bv|2S$&mX6W+pq(&HG~heyvy|hJZja;C&!jchRZ&^7w<-7Btvgs zVK;15{7*3oc^z?}aF306dG*5=jEn${LE;3A?&-QB8fIs%|EM`o=U#}8=^&chgX0qF zfvsxmdw~K&IH6))=J`1ZTxsCFP3+~*xYos|iLo=HPGW1^2l^Zc&&abg#%TWtQ>W}* zf^bn`k5qk5-A>Ox^nq!@LUQWq>=8!r*;fjK1F3nGMHAR%d+u)TbA@K96QgU2$*chG zXK=-!%f6qc{qtJ!+5(cTTxXNNd=UWU3TIu*{u9Z%|K)v#EKre1FB|a6&Xhzq&7PM} z;O2|I?)B--bflM08Rw|$m))I6dTBpAx&a`u@P%hup43T6E*YH%Bz&0SnE3kRDCA>^ zB07RP!ZA{*=x%Bmeb;xOrSxRt^wd|VHP?`yeAys|OK%S=PS&I>%ni>>TWoF*uk;38t~fAhBD@yRT&(LZ6>{h9p5Y&7X* zsv&4P+b^#j&Dj%SF8|>7E)`vY^zg09H_NE7BA5^;TNMJGFkB7C43UqQsh_00$S@lu zPMbyO2S*#)yGPoHStcr@(K7-yY8TnQZN8mhA|TOeS=+YJq6DX4u2C?M(984wkUG3? z0LKjpouGl=wRS>^RZno?S?u!a`pt+Djs@&Q zUO8h=D6uJV^ZZ7-Y=GdI8u$z1ds|-u(3`t-&oVaWwOVQf`TW(CfvIy)!w4?6rfQe` zxD&Q|^qjHdZyy1qSLuI56W^$pnlnAlGTE$LkgKuODW2!qin8h6KuZOuM{z}|Nv@Oq zKWB8GcgJEj^3d0Cl=01>FExAp5>>j|#_pT0+X zZb6~7OS`5ei1~{tn%WNGoA@JQ7+NfoOaT2hF;TOY^+9kXOKb`wBq%i70z1F~OMG}0 z!+~K~>Wn9D_vu@Coadm(Psz(SbNB~$jD`#G?XU5PN62uQeYs8ENUd-DrjMm2B?C>r zVt?nGWCaKpA=5H;@=hCA&qHW>+?An3PT70Vl&}mwJXwfxOklVsMZs0Bq-_v1yfe?l z{$M{(reSnoZ=~bE?cV!($?UMjl;~FoP=c3y#0i7A*ib}IQ)9PwB;TvvRB=&mTVT<%r0j}2KW=OPhfk9`K7!}K zs`PU^P<8f&+HNf0yP`$sob6Rep*wglp-5q9SYrV2<#?WEn~*R%HFkLB1NpB4U8mN4 zA-{egZ?wLdIq8v3BsbwgM_Fw1-ib*65p6m?ae%9QT^Ee6?^q%6widE~Wg9_i*r{So zZ^H*rs%Fmo)HC6qPNE;L+vZxIeD3Qd2Hgfh(+j12HSTF+N)QR*s=X!4zka^h$Ygj^ zzkIdzyd3Be$GD(J!-0oBf5$@o26ixxy>@m6kOrS3ECR3-jgCr*T^7t3l9^s>07+X0a?f4#a1oJ+{|>E2xBM@1B0)pGmjFqeWqlE>a{H%2^j5kbSj<(J8Wr_Nug;5a-uQ z*Xn%OfBC_%yp+Bfu!?$ZZ!3{7$c+Qv1n|t@LSu3fyEi?{#(4ZtTLwuGUhY}Edli62 zMCBgu6iWvg$An5?cR65v(?Y{ZYztQAL1#Jq8EWEKQ6q5|o`cD=0HO{YSX$z!!L+JnDXiCaT8&dm2*~n6)WID!f1(bB1ZFW(C~iP)2L*p#Lk&wovTJN z%Ez}fmEXZ;6zNTQlP6`EM}EC=uUYr_99q%fU^m*{h(iaG z%C8ZN3zjU0c-mml5=SeX^vX^*fGEjeD9H=t3Qf0hm?+VEt$s_(nTtErCsPZH#XDpm zKiQ0vKi-~RU6o|~U7kj}Ya`(@%6eH(Ljq*2@)0e*!icpIQ)MF80q2PwK6LQ{q&yZlF8P|`iwjUQEK}}=f zohBptefGSP2F4sapKiHJMi*;IdZiuDXqIK}V4Y$(?^SoWOAk*Gs7EM_ zHhp;4KJYTAC>@E`Co3+Uf>!eCecA^HZ|{W7BNO}bWUhXNs;{={8hu45_8h(BfhWUa z(a|Gb+KSb3pxL~F7iiqT1MS14maY^3SFn}?G-B*XJ?j%ffL~BfY7BWR8k<6I|2Bxg zLloB_KZi;O^`3Eb;vg`)QdU0!8wusE@^IZA4_%9Op`tSm6XLxClvVWMw_51AR}M;! zUeTQK%<=A-PjSKxJ>Fo7#@=gQyE3b>j3?gcc+-=D>0g{*N@jgD)%(Y6&q>TVqS=~^ z07{Ib47@K_Pl(60gq1bf6H^nBe)>2j(zN86?1^@LS%%Fm;R8G4PYhF%c=1w6-hT`m zdr#8GYQ25>oj%GfC^BmE4=j7I zUWG+HEsW;LD*Aifqciu0u02WrvDekhxqvek;44I!Gy|vv?W$$criPiaZ^z?1Li8k* zP|FSs0nqF1+r#mu=jgl^kvG_NXhwr+s>-FNlyIyBbCoY(mXRz9v@0|a8xc;=a^pv? zXWIJFUBNwdU!UqI?%hpm+^3lH41e>qR`L4%AdX?o&NbrEoTdW~}NAtONpM{=x>{-5Jyjq|x3Osu>T0OF~3-W^f#7w}_X-Mqlb?9xceJyc9 zA5$P1HfCSgc|?*?7*nj8&(2$4H+t0C*jp|9`D}|@=8EIdteg2O}l+pHtJr`3F z`uMU0I-O^++IWNar>m;SJ-54;f>=N-*C+u;OV`Iy`~+0}L?=R!s$zUTs$_T`-Zaxu zHrFaxMJ{2gm5Ig^hmnLjos?}gwQzgue0=w_R;a+DfSrifv{xuzNJ$T&eHoB7>V9!9 zOv`S{tjMQMw$Y5Ewc0b=T2Yjw!FMHyK;ya4^8~tOYBU~+P~Ws0H2O8_rvmPjLh8<9 z;5)?BhM@GsC*fU#QvFVSE8$_tzTwj7lB74!WM+>JWg_ldKJeLn^X(2{7+QISXt9Tn z-MN^Sg3-p`wg}rAepdqTFJc=mSG$N&^+Yo#f=GgTe(c_ucfM2abTdg$PsXXK=l2c? z%mets*>x5G@P6)3wg)OZgOexhuKIuFxHTTuYh3SgEo8N1+I}xr1fMnbC4bhwBvbDWaaq95O%i%X?Y4tr1 zSyygRp7>jxb$)rOuiLcVlN5U)r#>%ixbOKG_NQSkLP54rL#SgpCa{KaTDe)(6!pb9C36t_ht3BP+w zSWEw1RjRk8Us}`gS^V{1?E+s&Y;G|cZfB(HrF8C^ogIo>pm*+BybXG7XP#7xA8=tVVrnqM8hVYB!UlKZfnslZ(lyHekl1?Vy@Zr_5ue`9u_K zp&A**=Fc{iDN2(@^uRX6m`c79A^GB`tx|CfdwBo<7heIO{@mph-V3Dct*)`Lxy{9k z7qv3t;iHEH5f2|esItGkUYFirkI|?n$dM#Nx!$~BU4RuhYzPpoEU&P+v5EJT(8>T_ z&3SIfya7|;4L3`#EfSuaWq6}Z+1?m%ZajMK@oa8w@#?wrw3>B+s3<6*4&aJha1tz- z0AofVM^a22#@MKi4FhZxXe^zaUXB_TkEL)%`(7IO z-UGC~N*hb3V6$06rL}tBW3gE4v7q+?W6?gLvgC9IyrWUCarn?7fvOV2>AT=vq3>{> z<(h}yxiP%7E-0_n5E#Q$yG=a|*xlOH0uNDWus&3#*kI6Ob#+ayuh+gGS}ftQcf5mN bZT - -

      -
      - - - - - - - -
      -
      - - - diff --git a/wp/wp-content/themes/twentyfourteen/sidebar-footer.php b/wp/wp-content/themes/twentyfourteen/sidebar-footer.php deleted file mode 100644 index 20f3798a..00000000 --- a/wp/wp-content/themes/twentyfourteen/sidebar-footer.php +++ /dev/null @@ -1,19 +0,0 @@ - - -
      - -
      diff --git a/wp/wp-content/themes/twentyfourteen/sidebar.php b/wp/wp-content/themes/twentyfourteen/sidebar.php deleted file mode 100644 index be3c8e02..00000000 --- a/wp/wp-content/themes/twentyfourteen/sidebar.php +++ /dev/null @@ -1,29 +0,0 @@ - -
      - -

      - - - - - - - - - -
      diff --git a/wp/wp-content/themes/twentyfourteen/single.php b/wp/wp-content/themes/twentyfourteen/single.php deleted file mode 100644 index e2db3b04..00000000 --- a/wp/wp-content/themes/twentyfourteen/single.php +++ /dev/null @@ -1,40 +0,0 @@ - - -
      -
      - -
      -
      - - ul, -li > ol { - margin: 0 0 0 20px; -} - -img { - -ms-interpolation-mode: bicubic; - border: 0; - vertical-align: middle; -} - -figure { - margin: 0; -} - -fieldset { - border: 1px solid rgba(0, 0, 0, 0.1); - margin: 0 0 24px; - min-width: inherit; - padding: 11px 12px 0; -} - -legend { - white-space: normal; -} - -button, -input, -select, -textarea { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - font-size: 100%; - margin: 0; - max-width: 100%; - vertical-align: baseline; -} - -button, -input { - line-height: normal; -} - -input, -textarea { - background-image: -webkit-linear-gradient(hsla(0,0%,100%,0), hsla(0,0%,100%,0)); /* Removing the inner shadow, rounded corners on iOS inputs */ -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} - -button[disabled], -input[disabled] { - cursor: default; -} - -input[type="checkbox"], -input[type="radio"] { - padding: 0; -} - -input[type="search"] { - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -table, -th, -td { - border: 1px solid rgba(0, 0, 0, 0.1); -} - -table { - border-collapse: separate; - border-spacing: 0; - border-width: 1px 0 0 1px; - margin-bottom: 24px; - width: 100%; -} - -caption, -th, -td { - font-weight: normal; - text-align: left; -} - -th { - border-width: 0 1px 1px 0; - font-weight: bold; -} - -td { - border-width: 0 1px 1px 0; -} - -del { - color: #767676; -} - -hr { - background-color: rgba(0, 0, 0, 0.1); - border: 0; - height: 1px; - margin-bottom: 23px; -} - -/* Support a widely-adopted but non-standard selector for text selection styles - * to achieve a better experience. See https://core.trac.wordpress.org/ticket/25898. - */ -::selection { - background: #24890d; - color: #fff; - text-shadow: none; -} - -::-moz-selection { - background: #24890d; - color: #fff; - text-shadow: none; -} - - -/** - * 2.0 Repeatable Patterns - * ----------------------------------------------------------------------------- - */ - -/* Input fields */ - -input, -textarea { - border: 1px solid rgba(0, 0, 0, 0.1); - border-radius: 2px; - color: #2b2b2b; - padding: 8px 10px 7px; -} - -textarea { - width: 100%; -} - -input:focus, -textarea:focus { - border: 1px solid rgba(0, 0, 0, 0.3); - outline: 0; -} - -/* Buttons */ - -button, -.button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - background-color: #24890d; - border: 0; - border-radius: 2px; - color: #fff; - font-size: 12px; - font-weight: 700; - padding: 10px 30px 11px; - text-transform: uppercase; - vertical-align: bottom; -} - -button:hover, -button:focus, -.button:hover, -.button:focus, -input[type="button"]:hover, -input[type="button"]:focus, -input[type="reset"]:hover, -input[type="reset"]:focus, -input[type="submit"]:hover, -input[type="submit"]:focus { - background-color: #41a62a; - color: #fff; -} - -button:active, -.button:active, -input[type="button"]:active, -input[type="reset"]:active, -input[type="submit"]:active { - background-color: #55d737; -} - -.search-field { - width: 100%; -} - -.search-submit { - display: none; -} - -/* Placeholder text color -- selectors need to be separate to work. */ - -::-webkit-input-placeholder { - color: #939393; -} - -:-moz-placeholder { - color: #939393; -} - -::-moz-placeholder { - color: #939393; - opacity: 1; /* Since FF19 lowers the opacity of the placeholder by default */ -} - -:-ms-input-placeholder { - color: #939393; -} - -/* Responsive images. Fluid images for posts, comments, and widgets */ - -.comment-content img, -.entry-content img, -.entry-summary img, -#site-header img, -.widget img, -.wp-caption { - max-width: 100%; -} - -/** - * Make sure images with WordPress-added height and width attributes are - * scaled correctly. - */ - -.comment-content img[height], -.entry-content img, -.entry-summary img, -img[class*="align"], -img[class*="wp-image-"], -img[class*="attachment-"], -#site-header img { - height: auto; -} - -img.size-full, -img.size-large, -.wp-post-image, -.post-thumbnail img { - height: auto; - max-width: 100%; -} - -/* Make sure embeds and iframes fit their containers */ - -embed, -iframe, -object, -video { - margin-bottom: 24px; - max-width: 100%; -} - -p > embed, -p > iframe, -p > object, -span > embed, -span > iframe, -span > object { - margin-bottom: 0; -} - -/* Alignment */ - -.alignleft { - float: left; -} - -.alignright { - float: right; -} - -.aligncenter { - display: block; - margin-left: auto; - margin-right: auto; -} - -blockquote.alignleft, -figure.wp-caption.alignleft, -img.alignleft { - margin: 7px 24px 7px 0; -} - -.wp-caption.alignleft { - margin: 7px 14px 7px 0; -} - -blockquote.alignright, -figure.wp-caption.alignright, -img.alignright { - margin: 7px 0 7px 24px; -} - -.wp-caption.alignright { - margin: 7px 0 7px 14px; -} - -blockquote.aligncenter, -img.aligncenter, -.wp-caption.aligncenter { - margin-top: 7px; - margin-bottom: 7px; -} - -.site-content blockquote.alignleft, -.site-content blockquote.alignright { - border-top: 1px solid rgba(0, 0, 0, 0.1); - border-bottom: 1px solid rgba(0, 0, 0, 0.1); - padding-top: 17px; - width: 50%; -} - -.site-content blockquote.alignleft p, -.site-content blockquote.alignright p { - margin-bottom: 17px; -} - -.wp-caption { - margin-bottom: 24px; -} - -.wp-caption img[class*="wp-image-"] { - display: block; - margin: 0; -} - -.wp-caption { - color: #767676; -} - -.wp-caption-text { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - font-size: 12px; - font-style: italic; - line-height: 1.5; - margin: 9px 0; -} - -div.wp-caption .wp-caption-text { - padding-right: 10px; -} - -div.wp-caption.alignright img[class*="wp-image-"], -div.wp-caption.alignright .wp-caption-text { - padding-left: 10px; - padding-right: 0; -} - -.wp-smiley { - border: 0; - margin-bottom: 0; - margin-top: 0; - padding: 0; -} - -/* Assistive text */ - -.screen-reader-text { - clip: rect(1px, 1px, 1px, 1px); - overflow: hidden; - position: absolute !important; - height: 1px; - width: 1px; -} - -.screen-reader-text:focus { - background-color: #f1f1f1; - border-radius: 3px; - box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); - clip: auto; - color: #21759b; - display: block; - font-size: 14px; - font-weight: bold; - height: auto; - line-height: normal; - padding: 15px 23px 14px; - position: absolute; - left: 5px; - top: 5px; - text-decoration: none; - text-transform: none; - width: auto; - z-index: 100000; /* Above WP toolbar */ -} - -.hide { - display: none; -} - -/* Clearing floats */ - -.footer-sidebar:before, -.footer-sidebar:after, -.hentry:before, -.hentry:after, -.gallery:before, -.gallery:after, -.slider-direction-nav:before, -.slider-direction-nav:after, -.contributor-info:before, -.contributor-info:after, -.search-box:before, -.search-box:after, -[class*="content"]:before, -[class*="content"]:after, -[class*="site"]:before, -[class*="site"]:after { - content: ""; - display: table; -} - -.footer-sidebar:after, -.hentry:after, -.gallery:after, -.slider-direction-nav:after, -.contributor-info:after, -.search-box:after, -[class*="content"]:after, -[class*="site"]:after { - clear: both; -} - -/* Genericons */ - -.bypostauthor > article .fn:before, -.comment-edit-link:before, -.comment-reply-link:before, -.comment-reply-login:before, -.comment-reply-title small a:before, -.contributor-posts-link:before, -.menu-toggle:before, -.search-toggle:before, -.slider-direction-nav a:before, -.widget_twentyfourteen_ephemera .widget-title:before { - -webkit-font-smoothing: antialiased; - display: inline-block; - font: normal 16px/1 Genericons; - text-decoration: inherit; - vertical-align: text-bottom; -} - -/* Separators */ - -.site-content span + .entry-date:before, -.full-size-link:before, -.parent-post-link:before, -span + .byline:before, -span + .comments-link:before, -span + .edit-link:before, -.widget_twentyfourteen_ephemera .entry-title:after { - content: "\0020\007c\0020"; -} - - -/** - * 3.0 Basic Structure - * ----------------------------------------------------------------------------- - */ - -.site { - background-color: #fff; - max-width: 1260px; - position: relative; -} - -.main-content { - width: 100%; -} - - -/** - * 4.0 Header - * ----------------------------------------------------------------------------- - */ - -/* Ensure that there is no gap between the header and - the admin bar for WordPress versions before 3.8. */ -#wpadminbar { - min-height: 32px; -} - -#site-header { - position: relative; - z-index: 3; -} - -.site-header { - background-color: #000; - max-width: 1260px; - position: relative; - width: 100%; - z-index: 4; -} - -.header-main { - min-height: 48px; - padding: 0 10px; -} - -.site-title { - float: left; - font-size: 18px; - font-weight: 700; - line-height: 48px; - margin: 0; - - /* Nav-toggle width + search-toggle width - gutter = 86px */ - max-width: -webkit-calc(100% - 86px); - max-width: calc(100% - 86px); -} - -.site-title a, -.site-title a:hover { - color: #fff; - display: block; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -/* Search in the header */ - -.search-toggle { - background-color: #24890d; - cursor: pointer; - float: right; - height: 48px; - margin-right: 38px; - text-align: center; - width: 48px; -} - -.search-toggle:hover, -.search-toggle.active { - background-color: #41a62a; -} - -.search-toggle:before { - color: #fff; - content: "\f400"; - font-size: 20px; - margin-top: 14px; -} - -.search-toggle .screen-reader-text { - left: 5px; /* Avoid a horizontal scrollbar when the site has a long menu */ -} - -.search-box-wrapper { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - position: absolute; - top: 48px; - right: 0; - width: 100%; - z-index: 2; -} - -.search-box { - background-color: #41a62a; - padding: 12px; -} - -.search-box .search-field { - background-color: #fff; - border: 0; - float: right; - font-size: 16px; - padding: 2px 2px 3px 6px; - width: 100%; -} - - -/** - * 5.0 Navigation - * ----------------------------------------------------------------------------- - */ - -.site-navigation ul { - list-style: none; - margin: 0; -} - -.site-navigation li { - border-top: 1px solid rgba(255, 255, 255, 0.2); -} - -.site-navigation ul ul { - margin-left: 20px; -} - -.site-navigation a { - color: #fff; - display: block; - text-transform: uppercase; -} - -.site-navigation a:hover { - color: #41a62a; -} - -.site-navigation .current_page_item > a, -.site-navigation .current_page_ancestor > a, -.site-navigation .current-menu-item > a, -.site-navigation .current-menu-ancestor > a { - color: #55d737; - font-weight: 900; -} - -/* Primary Navigation */ - -.primary-navigation { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - font-size: 14px; - padding-top: 24px; -} - -.primary-navigation.toggled-on { - padding: 72px 0 36px; -} - -.primary-navigation .nav-menu { - border-bottom: 1px solid rgba(255, 255, 255, 0.2); - display: none; -} - -.primary-navigation.toggled-on .nav-menu { - display: block; -} - -.primary-navigation a { - padding: 7px 0; -} - -/* Secondary Navigation */ - -.secondary-navigation { - border-bottom: 1px solid rgba(255, 255, 255, 0.2); - font-size: 12px; - margin: 48px 0; -} - -.secondary-navigation a { - padding: 9px 0; -} - -.menu-toggle { - background-color: #000; - border-radius: 0; - cursor: pointer; - height: 48px; - margin: 0; - overflow: hidden; - padding: 0; - position: absolute; - top: 0; - right: 0; - text-align: center; - width: 48px; -} - -.menu-toggle:before { - color: #fff; - content: "\f419"; - padding: 16px; -} - -.menu-toggle:active, -.menu-toggle:focus, -.menu-toggle:hover { - background-color: #444; -} - -.menu-toggle:focus { - outline: 1px dotted; -} - -.secondary-navigation .customize-partial-edit-shortcut button, -.footer-sidebar .widget:first-child .customize-partial-edit-shortcut button { - left: 0; -} - -/** - * 6.0 Content - * ----------------------------------------------------------------------------- - */ - -.content-area { - padding-top: 48px; -} - -.hentry { - margin: 0 auto 48px; - max-width: 672px; -} - -.site-content .entry-header, -.site-content .entry-content, -.site-content .entry-summary, -.site-content .entry-meta, -.page-content { - margin: 0 auto; - max-width: 474px; -} - -.page-content { - margin-bottom: 48px; -} - - -/** - * 6.1 Post Thumbnail - * ----------------------------------------------------------------------------- - */ - -.post-thumbnail { - background: #b2b2b2 url(images/pattern-light.svg) repeat fixed; - display: block; - position: relative; - width: 100%; - z-index: 0; -} - -a.post-thumbnail:hover { - background-color: #999; -} - -.full-width .post-thumbnail img { - display: block; - margin: 0 auto; -} - - -/** - * 6.2 Entry Header - * ----------------------------------------------------------------------------- - */ - -.entry-header { - position: relative; - z-index: 1; -} - -.entry-title { - font-size: 33px; - font-weight: 300; - line-height: 1.0909090909; - margin-bottom: 12px; - margin: 0 0 12px 0; - text-transform: uppercase; -} - -.entry-title a { - color: #2b2b2b; -} - -.entry-title a:hover { - color: #41a62a; -} - -.site-content .entry-header { - background-color: #fff; - padding: 0 10px 12px; -} - -.site-content .has-post-thumbnail .entry-header { - padding-top: 24px; -} - - -/** - * 6.3 Entry Meta - * ----------------------------------------------------------------------------- - */ - -.entry-meta { - clear: both; - color: #767676; - font-size: 12px; - font-weight: 400; - line-height: 1.3333333333; - text-transform: uppercase; -} - -.entry-meta a { - color: #767676; -} - -.entry-meta a:hover { - color: #41a62a; -} - -.sticky .entry-date { - display: none; -} - -.cat-links { - font-weight: 900; - text-transform: uppercase; -} - -.cat-links a { - color: #2b2b2b; -} - -.cat-links a:hover { - color: #41a62a; -} - -.byline { - display: none; -} - -.single .byline, -.group-blog .byline { - display: inline; -} - -.site-content .entry-meta { - background-color: #fff; - margin-bottom: 8px; -} - -.site-content footer.entry-meta { - margin: 24px auto 0; - padding: 0 10px; -} - -/* Tag links style */ - -.entry-meta .tag-links a { - background-color: #767676; - border-radius: 0 2px 2px 0; - color: #fff; - display: inline-block; - font-size: 11px; - font-weight: 700; - line-height: 1.2727272727; - margin: 2px 4px 2px 10px; - padding: 3px 7px; - position: relative; - text-transform: uppercase; -} - -.entry-meta .tag-links a:hover { - background-color: #41a62a; - color: #fff; -} - -.entry-meta .tag-links a:before { - border-top: 10px solid transparent; - border-right: 8px solid #767676; - border-bottom: 10px solid transparent; - content: ""; - height: 0; - position: absolute; - top: 0; - left: -8px; - width: 0; -} - -.entry-meta .tag-links a:hover:before { - border-right-color: #41a62a; -} - -.entry-meta .tag-links a:after { - background-color: #fff; - border-radius: 50%; - content: ""; - height: 4px; - position: absolute; - top: 8px; - left: -2px; - width: 4px; -} - - -/** - * 6.4 Entry Content - * ----------------------------------------------------------------------------- - */ - -.entry-content, -.entry-summary, -.page-content { - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; - word-wrap: break-word; -} - -.site-content .entry-content, -.site-content .entry-summary, -.page-content { - background-color: #fff; - padding: 12px 10px 0; -} - -.page .entry-content { - padding-top: 0; -} - -.entry-content h1:first-child, -.entry-content h2:first-child, -.entry-content h3:first-child, -.entry-content h4:first-child, -.entry-content h5:first-child, -.entry-content h6:first-child, -.entry-summary h1:first-child, -.entry-summary h2:first-child, -.entry-summary h3:first-child, -.entry-summary h4:first-child, -.entry-summary h5:first-child, -.entry-summary h6:first-child, -.page-content h1:first-child, -.page-content h2:first-child, -.page-content h3:first-child, -.page-content h4:first-child, -.page-content h5:first-child, -.page-content h6:first-child { - margin-top: 0; -} - -.entry-content a, -.entry-summary a, -.page-content a, -.comment-content a { - text-decoration: underline; -} - -.entry-content a:hover, -.entry-summary a:hover, -.page-content a:hover, -.comment-content a:hover, -.entry-content a.button, -.entry-summary a.button, -.page-content a.button, -.comment-content a.button { - text-decoration: none; -} - -.entry-content table, -.comment-content table { - font-size: 14px; - line-height: 1.2857142857; - margin-bottom: 24px; -} - -.entry-content th, -.comment-content th { - font-weight: 700; - padding: 8px; - text-transform: uppercase; -} - -.entry-content td, -.comment-content td { - padding: 8px; -} - -.entry-content .edit-link { - clear: both; - display: block; - font-size: 12px; - font-weight: 400; - line-height: 1.3333333333; - text-transform: uppercase; -} - -.entry-content .edit-link a { - color: #767676; - text-decoration: none; -} - -.entry-content .edit-link a:hover { - color: #41a62a; -} - -.entry-content .more-link { - white-space: nowrap; -} - -/* Mediaelements */ - -.hentry .mejs-container { - margin: 12px 0 18px; -} - -.hentry .mejs-mediaelement, -.hentry .mejs-container .mejs-controls { - background: #000; -} - -.hentry .mejs-controls .mejs-time-rail .mejs-time-loaded, -.hentry .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current { - background: #fff; -} - -.hentry .mejs-controls .mejs-time-rail .mejs-time-current { - background: #24890d; -} - -.hentry .mejs-controls .mejs-time-rail .mejs-time-total, -.hentry .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total { - background: rgba(255, 255, 255, .33); -} - -.hentry .mejs-container .mejs-controls .mejs-time { - padding-top: 9px; -} - -.hentry .mejs-controls .mejs-time-rail span, -.hentry .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total, -.hentry .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current { - border-radius: 0; -} - -.hentry .mejs-overlay-loading { - background: transparent; -} - -.hentry .mejs-overlay-button { - background-color: #fff; - background-image: none; - border-radius: 2px; - box-shadow: 1px 1px 1px rgba(0,0,0,.8); - color: #000; - height: 36px; - margin-left: -24px; - width: 48px; -} - -.hentry .mejs-overlay-button:before { - -webkit-font-smoothing: antialiased; - content: '\f452'; - display: inline-block; - font: normal 32px/1.125 Genericons; - position: absolute; - top: 1px; - left: 10px; -} - -.hentry .mejs-controls .mejs-button button:focus { - outline: none; -} - -.hentry .mejs-controls .mejs-button button { - -webkit-font-smoothing: antialiased; - background: none; - color: #fff; - display: inline-block; - font: normal 16px/1 Genericons; -} - -.hentry .mejs-playpause-button.mejs-play button:before { - content: '\f452'; -} - -.hentry .mejs-playpause-button.mejs-pause button:before { - content: '\f448'; -} - -.hentry .mejs-volume-button.mejs-mute button:before { - content: '\f109'; - font-size: 20px; - position: absolute; - top: -2px; - left: 0; -} - -.hentry .mejs-volume-button.mejs-unmute button:before { - content: '\f109'; - left: 0; - position: absolute; - top: 0; -} - -.hentry .mejs-fullscreen-button button:before { - content: '\f474'; -} - -.hentry .mejs-fullscreen-button.mejs-unfullscreen button:before { - content: '\f406'; -} - -.hentry .mejs-overlay:hover .mejs-overlay-button { - background-color: #24890d; - color: #fff; -} - -.hentry .mejs-controls .mejs-button button:hover { - color: #41a62a; -} - -.content-sidebar .wp-playlist-item .wp-playlist-caption { - color: #000; -} - -/* Page links */ - -.page-links { - clear: both; - font-size: 12px; - font-weight: 900; - line-height: 2; - margin: 24px 0; - text-transform: uppercase; -} - -.page-links a, -.page-links > span { - background: #fff; - border: 1px solid #fff; - display: inline-block; - height: 22px; - margin: 0 1px 2px 0; - text-align: center; - width: 22px; -} - -.page-links a { - background: #000; - border: 1px solid #000; - color: #fff; - text-decoration: none; -} - -.page-links a:hover { - background: #41a62a; - border: 1px solid #41a62a; - color: #fff; -} - -.page-links > .page-links-title { - height: auto; - margin: 0; - padding-right: 7px; - width: auto; -} - - -/** - * 6.5 Gallery - * ----------------------------------------------------------------------------- - */ - -.gallery { - margin-bottom: 20px; -} - -.gallery-item { - float: left; - margin: 0 4px 4px 0; - overflow: hidden; - position: relative; -} - -.gallery-columns-1 .gallery-item { - max-width: 100%; -} - -.gallery-columns-2 .gallery-item { - max-width: 48%; - max-width: -webkit-calc(50% - 4px); - max-width: calc(50% - 4px); -} - -.gallery-columns-3 .gallery-item { - max-width: 32%; - max-width: -webkit-calc(33.3% - 4px); - max-width: calc(33.3% - 4px); -} - -.gallery-columns-4 .gallery-item { - max-width: 23%; - max-width: -webkit-calc(25% - 4px); - max-width: calc(25% - 4px); -} - -.gallery-columns-5 .gallery-item { - max-width: 19%; - max-width: -webkit-calc(20% - 4px); - max-width: calc(20% - 4px); -} - -.gallery-columns-6 .gallery-item { - max-width: 15%; - max-width: -webkit-calc(16.7% - 4px); - max-width: calc(16.7% - 4px); -} - -.gallery-columns-7 .gallery-item { - max-width: 13%; - max-width: -webkit-calc(14.28% - 4px); - max-width: calc(14.28% - 4px); -} - -.gallery-columns-8 .gallery-item { - max-width: 11%; - max-width: -webkit-calc(12.5% - 4px); - max-width: calc(12.5% - 4px); -} - -.gallery-columns-9 .gallery-item { - max-width: 9%; - max-width: -webkit-calc(11.1% - 4px); - max-width: calc(11.1% - 4px); -} - -.gallery-columns-1 .gallery-item:nth-of-type(1n), -.gallery-columns-2 .gallery-item:nth-of-type(2n), -.gallery-columns-3 .gallery-item:nth-of-type(3n), -.gallery-columns-4 .gallery-item:nth-of-type(4n), -.gallery-columns-5 .gallery-item:nth-of-type(5n), -.gallery-columns-6 .gallery-item:nth-of-type(6n), -.gallery-columns-7 .gallery-item:nth-of-type(7n), -.gallery-columns-8 .gallery-item:nth-of-type(8n), -.gallery-columns-9 .gallery-item:nth-of-type(9n) { - margin-right: 0; -} - -.gallery-columns-1.gallery-size-medium figure.gallery-item:nth-of-type(1n+1), -.gallery-columns-1.gallery-size-thumbnail figure.gallery-item:nth-of-type(1n+1), -.gallery-columns-2.gallery-size-thumbnail figure.gallery-item:nth-of-type(2n+1), -.gallery-columns-3.gallery-size-thumbnail figure.gallery-item:nth-of-type(3n+1) { - clear: left; -} - -.gallery-caption { - background-color: rgba(0, 0, 0, 0.7); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - color: #fff; - font-size: 12px; - line-height: 1.5; - margin: 0; - max-height: 50%; - opacity: 0; - padding: 6px 8px; - position: absolute; - bottom: 0; - left: 0; - text-align: left; - width: 100%; -} - -.gallery-caption:before { - content: ""; - height: 100%; - min-height: 49px; - position: absolute; - top: 0; - left: 0; - width: 100%; -} - -.gallery-item:hover .gallery-caption { - opacity: 1; -} - -.gallery-columns-7 .gallery-caption, -.gallery-columns-8 .gallery-caption, -.gallery-columns-9 .gallery-caption { - display: none; -} - - -/** - * 6.6 Post Formats - * ----------------------------------------------------------------------------- - */ - -.format-aside .entry-content, -.format-aside .entry-summary, -.format-quote .entry-content, -.format-quote .entry-summary, -.format-link .entry-content, -.format-link .entry-summary { - padding-top: 0; -} - -.site-content .format-link .entry-title, -.site-content .format-aside .entry-title, -.site-content .format-quote .entry-title { - display: none; -} - - -/** - * 6.7 Post/Image/Paging Navigation - * ----------------------------------------------------------------------------- - */ - -.nav-links { - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - border-top: 1px solid rgba(0, 0, 0, 0.1); - hyphens: auto; - word-wrap: break-word; -} - -.post-navigation, -.image-navigation { - margin: 24px auto 48px; - max-width: 474px; - padding: 0 10px; -} - -.post-navigation a, -.image-navigation .previous-image, -.image-navigation .next-image { - border-bottom: 1px solid rgba(0, 0, 0, 0.1); - padding: 11px 0 12px; - width: 100%; -} - -.post-navigation .meta-nav { - color: #767676; - display: block; - font-size: 12px; - font-weight: 900; - line-height: 2; - text-transform: uppercase; -} - -.post-navigation a, -.image-navigation a { - color: #2b2b2b; - display: block; - font-size: 14px; - font-weight: 700; - line-height: 1.7142857142; - text-transform: none; -} - -.post-navigation a:hover, -.image-navigation a:hover { - color: #41a62a; -} - -/* Paging Navigation */ - -.paging-navigation { - border-top: 5px solid #000; - margin: 48px 0; -} - -.paging-navigation .loop-pagination { - margin-top: -5px; - text-align: center; -} - -.paging-navigation .page-numbers { - border-top: 5px solid transparent; - display: inline-block; - font-size: 14px; - font-weight: 900; - margin-right: 1px; - padding: 7px 16px; - text-transform: uppercase; -} - -.paging-navigation a { - color: #2b2b2b; -} - -.paging-navigation .page-numbers.current { - border-top: 5px solid #24890d; -} - -.paging-navigation a:hover { - border-top: 5px solid #41a62a; - color: #2b2b2b; -} - - -/** - * 6.8 Attachments - * ----------------------------------------------------------------------------- - */ - -.attachment .content-sidebar, -.attachment .post-thumbnail { - display: none; -} - -.attachment .entry-content { - padding-top: 0; -} - -.attachment footer.entry-meta { - text-transform: none; -} - -.entry-attachment .attachment { - margin-bottom: 24px; -} - - -/** - * 6.9 Archives - * ----------------------------------------------------------------------------- - */ - -.archive-header, -.page-header { - margin: 24px auto; - max-width: 474px; -} - -.archive-title, -.page-title { - font-size: 16px; - font-weight: 900; - line-height: 1.5; - margin: 0; -} - -.taxonomy-description, -.author-description { - color: #767676; - font-size: 14px; - line-height: 1.2857142857; - padding-top: 18px; -} - -.taxonomy-description p, -.author-description p { - margin-bottom: 18px; -} - -.taxonomy-description p:last-child, -.author-description p:last-child { - margin-bottom: 0; -} - -.taxonomy-description a, -.author-description a { - text-decoration: underline; -} - -.taxonomy-description a:hover, -.author-description a:hover { - text-decoration: none; -} - - -/** - * 6.10 Contributor Page - * ----------------------------------------------------------------------------- - */ - -.contributor { - border-bottom: 1px solid rgba(0, 0, 0, 0.1); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 48px 10px; -} - -.contributor:first-of-type { - padding-top: 24px; -} - -.contributor-info { - margin: 0 auto; - max-width: 474px; -} - -.contributor-avatar { - border: 1px solid rgba(0, 0, 0, 0.1); - float: left; - margin: 0 30px 20px 0; - padding: 2px; -} - -.contributor-name { - font-size: 16px; - font-weight: 900; - line-height: 1.5; - margin: 0; -} - -.contributor-bio a { - text-decoration: underline; -} - -.contributor-bio a:hover { - text-decoration: none; -} - -.contributor-posts-link { - display: inline-block; - line-height: normal; - padding: 10px 30px; -} - -.contributor-posts-link:before { - content: "\f443"; -} - - -/** - * 6.11 404 Page - * ----------------------------------------------------------------------------- - */ - -.error404 .page-content { - padding-top: 0; -} - -.error404 .page-content .search-form { - margin-bottom: 24px; -} - - -/** - * 6.12 Full-width - * ----------------------------------------------------------------------------- - */ - -.full-width .hentry { - max-width: 100%; -} - - -/** - * 6.13 Singular - * ----------------------------------------------------------------------------- - */ - -.singular .site-content .hentry.has-post-thumbnail { - margin-top: -48px; -} - - -/** - * 6.14 Comments - * ----------------------------------------------------------------------------- - */ - -.comments-area { - margin: 48px auto; - max-width: 474px; - padding: 0 10px; -} - -.comment-reply-title, -.comments-title { - font: 900 16px/1.5 Lato, sans-serif; - margin: 0; - text-transform: uppercase; -} - -.comment-list { - list-style: none; - margin: 0 0 48px 0; -} - -.comment-author { - font-size: 14px; - line-height: 1.7142857142; -} - -.comment-list .reply, -.comment-metadata { - font-size: 12px; - line-height: 2; - text-transform: uppercase; -} - -.comment-list .reply { - margin-top: 24px; -} - -.comment-author .fn { - font-weight: 900; -} - -.comment-author a { - color: #2b2b2b; -} - -.comment-list .trackback a, -.comment-list .pingback a, -.comment-metadata a { - color: #767676; -} - -.comment-author a:hover, -.comment-list .pingback a:hover, -.comment-list .trackback a:hover, -.comment-metadata a:hover { - color: #41a62a; -} - -.comment-list article, -.comment-list .pingback, -.comment-list .trackback { - border-top: 1px solid rgba(0, 0, 0, 0.1); - margin-bottom: 24px; - padding-top: 24px; -} - -.comment-list > li:first-child > article, -.comment-list > .pingback:first-child, -.comment-list > .trackback:first-child { - border-top: 0; -} - -.comment-author { - position: relative; -} - -.comment-author .avatar { - border: 1px solid rgba(0, 0, 0, 0.1); - height: 18px; - padding: 2px; - position: absolute; - top: 0; - left: 0; - width: 18px; -} - -.bypostauthor > article .fn:before { - content: "\f408"; - margin: 0 2px 0 -2px; - position: relative; - top: -1px; -} - -.says { - display: none; -} - -.comment-author, -.comment-awaiting-moderation, -.comment-content, -.comment-list .reply, -.comment-metadata { - padding-left: 30px; -} - -.comment-edit-link { - margin-left: 10px; -} - -.comment-edit-link:before { - content: "\f411"; -} - -.comment-reply-link:before, -.comment-reply-login:before { - content: "\f412"; - margin-right: 2px; -} - -.comment-content { - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; - word-wrap: break-word; -} - -.comment-content ul, -.comment-content ol { - margin: 0 0 24px 22px; -} - -.comment-content li > ul, -.comment-content li > ol { - margin-bottom: 0; -} - -.comment-content > :last-child { - margin-bottom: 0; -} - -.comment-list .children { - list-style: none; - margin-left: 15px; -} - -.comment-respond { - margin-bottom: 24px; - padding: 0; -} - -.comment .comment-respond { - margin-top: 24px; -} - -.comment-respond h3 { - margin-top: 0; - margin-bottom: 24px; -} - -.comment-notes, -.comment-awaiting-moderation, -.logged-in-as, -.no-comments, -.form-allowed-tags, -.form-allowed-tags code { - color: #767676; -} - -.comment-notes, -.comment-awaiting-moderation, -.logged-in-as { - font-size: 14px; - line-height: 1.7142857142; -} - -.no-comments { - font-size: 16px; - font-weight: 900; - line-height: 1.5; - margin-top: 24px; - text-transform: uppercase; -} - -.comment-form label { - display: block; -} - -.comment-form input[type="text"], -.comment-form input[type="email"], -.comment-form input[type="url"] { - width: 100%; -} - -.form-allowed-tags, -.form-allowed-tags code { - font-size: 12px; - line-height: 1.5; -} - -.required { - color: #c0392b; -} - -.comment-reply-title small a { - color: #2b2b2b; - float: right; - height: 24px; - overflow: hidden; - width: 24px; -} - -.comment-reply-title small a:hover { - color: #41a62a; -} - -.comment-reply-title small a:before { - content: "\f405"; - font-size: 32px; -} - -.comment-navigation { - font-size: 12px; - line-height: 2; - margin-bottom: 48px; - text-transform: uppercase; -} - -.comment-navigation .nav-next, -.comment-navigation .nav-previous { - display: inline-block; -} - -.comment-navigation .nav-previous a { - margin-right: 10px; -} - -#comment-nav-above { - margin-top: 36px; - margin-bottom: 0; -} - - -/** - * 7.0 Sidebars - * ----------------------------------------------------------------------------- - */ - -/* Secondary */ - -#secondary { - background-color: #000; - border-top: 1px solid #000; - border-bottom: 1px solid rgba(255, 255, 255, 0.2); - clear: both; - color: rgba(255, 255, 255, 0.7); - margin-top: -1px; - padding: 0 10px; - position: relative; - z-index: 2; -} - -.site-description { - display: none; - font-size: 12px; - font-weight: 400; - line-height: 1.5; -} - -/* Primary Sidebar */ - -.primary-sidebar { - padding-top: 48px; -} - -.secondary-navigation + .primary-sidebar { - padding-top: 0; -} - -/* Content Sidebar */ - -.content-sidebar { - border-top: 1px solid rgba(0, 0, 0, 0.1); - border-bottom: 1px solid rgba(0, 0, 0, 0.1); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - color: #767676; - padding: 48px 10px 0; -} - - -/** - * 7.1 Widgets - * ----------------------------------------------------------------------------- - */ - -/* Primary Sidebar, Footer Sidebar */ - -.widget { - font-size: 14px; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; - line-height: 1.2857142857; - margin-bottom: 48px; - width: 100%; - word-wrap: break-word; -} - -.widget a { - color: #fff; -} - -.widget a:hover { - color: #41a62a; -} - -.widget h1, -.widget h2, -.widget h3, -.widget h4, -.widget h5, -.widget h6 { - margin: 24px 0 12px; -} - -.widget h1 { - font-size: 22px; - line-height: 1.0909090909; -} - -.widget h2 { - font-size: 20px; - line-height: 1.2; -} - -.widget h3 { - font-size: 18px; - line-height: 1.3333333333; -} - -.widget h4 { - font-size: 16px; - line-height: 1.5; -} - -.widget h5 { - font-size: 14px; - line-height: 1.7142857142; -} - -.widget h6 { - font-size: 12px; - line-height: 2; -} - -.widget address { - margin-bottom: 18px; -} - -.widget abbr[title] { - border-color: rgba(255, 255, 255, 0.7); -} - -.widget mark, -.widget ins { - color: #000; -} - -.widget pre, -.widget fieldset { - border-color: rgba(255, 255, 255, 0.2); -} - -.widget code, -.widget kbd, -.widget tt, -.widget var, -.widget samp, -.widget pre { - font-size: 12px; - line-height: 1.5; -} - -.widget blockquote { - color: rgba(255, 255, 255, 0.7); - font-size: 18px; - line-height: 1.5; - margin-bottom: 18px; -} - -.widget blockquote cite { - color: #fff; - font-size: 14px; - line-height: 1.2857142857; -} - -.widget dl, -.widget dd { - margin-bottom: 18px; -} - -.widget ul, -.widget ol { - list-style: none; - margin: 0; -} - -.widget li > ol, -.widget li > ul { - margin-left: 10px; -} - -.widget table, -.widget th, -.widget td { - border-color: rgba(255, 255, 255, 0.2); -} - -.widget table { - margin-bottom: 18px; -} - -.widget del { - color: rgba(255, 255, 255, 0.4); -} - -.widget hr { - background-color: rgba(255, 255, 255, 0.2); -} - -.widget p { - margin-bottom: 18px; -} - -.widget-area .widget input, -.widget-area .widget textarea { - background-color: rgba(255, 255, 255, 0.1); - border-color: rgba(255, 255, 255, 0.2); - color: #fff; - font-size: 16px; - padding: 1px 2px 2px 4px; -} - -.widget-area .widget input:focus, -.widget-area .widget textarea:focus { - border-color: rgba(255, 255, 255, 0.3); -} - -.widget button, -.widget .button, -.widget input[type="button"], -.widget input[type="reset"], -.widget input[type="submit"] { - background-color: #24890d; - border: 0; - font-size: 12px; - padding: 5px 15px 4px; -} - -.widget input[type="button"]:hover, -.widget input[type="button"]:focus, -.widget input[type="reset"]:hover, -.widget input[type="reset"]:focus, -.widget input[type="submit"]:hover, -.widget input[type="submit"]:focus { - background-color: #41a62a; -} - -.widget input[type="button"]:active, -.widget input[type="reset"]:active, -.widget input[type="submit"]:active { - background-color: #55d737; -} - -.widget .wp-caption { - color: rgba(255, 255, 255, 0.7); - margin-bottom: 18px; -} - -.widget .widget-title { - font-size: 14px; - font-weight: 700; - line-height: 1.7142857142; - margin: 0 0 24px 0; - text-transform: uppercase; -} - -.widget-title, -.widget-title a { - color: #fff; -} - -.widget-title a:hover { - color: #41a62a; -} - -/* Calendar Widget*/ - -.widget_calendar table { - line-height: 2; - margin: 0; -} - -.widget_calendar caption { - color: #fff; - font-weight: 700; - line-height: 1.7142857142; - margin-bottom: 18px; - text-align: left; - text-transform: uppercase; -} - -.widget_calendar thead th { - background-color: rgba(255, 255, 255, 0.1); -} - -.widget_calendar tbody td, -.widget_calendar thead th { - text-align: center; -} - -.widget_calendar tbody a { - background-color: #24890d; - color: #fff; - display: block; -} - -.widget_calendar tbody a:hover { - background-color: #41a62a; -} - -.widget_calendar tbody a:hover { - color: #fff; -} - -.widget_calendar #prev { - padding-left: 5px; -} - -.widget_calendar #next { - padding-right: 5px; - text-align: right; -} - -/* Ephemera Widget*/ - -.widget_twentyfourteen_ephemera > ol > li { - border-bottom: 1px solid rgba(255, 255, 255, 0.2); - margin-bottom: 18px; - padding: 0; -} - -.widget_twentyfourteen_ephemera .hentry { - margin: 0; - max-width: 100%; -} - -.widget_twentyfourteen_ephemera .entry-title, -.widget_twentyfourteen_ephemera .entry-meta, -.widget_twentyfourteen_ephemera .wp-caption-text, -.widget_twentyfourteen_ephemera .post-format-archive-link, -.widget_twentyfourteen_ephemera .entry-content table { - font-size: 12px; - line-height: 1.5; -} - -.widget_twentyfourteen_ephemera .entry-title { - display: inline; - font-weight: 400; -} - -.widget_twentyfourteen_ephemera .entry-meta { - margin-bottom: 18px; -} - -.widget_twentyfourteen_ephemera .entry-meta a { - color: rgba(255, 255, 255, 0.7); -} - -.widget_twentyfourteen_ephemera .entry-meta a:hover { - color: #41a62a; -} - -.widget_twentyfourteen_ephemera .entry-content ul, -.widget_twentyfourteen_ephemera .entry-content ol { - margin: 0 0 18px 20px; -} - -.widget_twentyfourteen_ephemera .entry-content ul { - list-style: disc; -} - -.widget_twentyfourteen_ephemera .entry-content ol { - list-style: decimal; -} - -.widget_twentyfourteen_ephemera .entry-content li > ul, -.widget_twentyfourteen_ephemera .entry-content li > ol { - margin: 0 0 0 20px; -} - -.widget_twentyfourteen_ephemera .entry-content th, -.widget_twentyfourteen_ephemera .entry-content td { - padding: 6px; -} - -.widget_twentyfourteen_ephemera .post-format-archive-link { - font-weight: 700; - text-transform: uppercase; -} - -/* List Style Widgets*/ - -.widget_archive li, -.widget_categories li, -.widget_links li, -.widget_meta li, -.widget_nav_menu li, -.widget_pages li, -.widget_recent_comments li, -.widget_recent_entries li { - border-top: 1px solid rgba(255, 255, 255, 0.2); - padding: 8px 0 9px; -} - -.widget_archive li:first-child, -.widget_categories li:first-child, -.widget_links li:first-child, -.widget_meta li:first-child, -.widget_nav_menu li:first-child, -.widget_pages li:first-child, -.widget_recent_comments li:first-child, -.widget_recent_entries li:first-child { - border-top: 0; -} - -.widget_categories li ul, -.widget_nav_menu li ul, -.widget_pages li ul { - border-top: 1px solid rgba(255, 255, 255, 0.2); - margin-top: 9px; -} - -.widget_categories li li:last-child, -.widget_nav_menu li li:last-child, -.widget_pages li li:last-child { - padding-bottom: 0; -} - -/* Recent Posts Widget */ - -.widget_recent_entries .post-date { - display: block; -} - -/* RSS Widget */ - -.rsswidget img { - margin-top: -4px; -} - -.rssSummary { - margin: 9px 0; -} - -.rss-date { - display: block; -} - -.widget_rss li { - margin-bottom: 18px; -} - -.widget_rss li:last-child { - margin-bottom: 0; -} - -/* Text Widget */ - -.widget_text > div > :last-child { - margin-bottom: 0; -} - - -/** - * 7.2 Content Sidebar Widgets - * ----------------------------------------------------------------------------- - */ - -.content-sidebar .widget a { - color: #24890d; -} - -.content-sidebar .widget a:hover { - color: #41a62a; -} - -.content-sidebar .widget pre { - border-color: rgba(0, 0, 0, 0.1); -} - -.content-sidebar .widget mark, -.content-sidebar .widget ins { - color: #2b2b2b; -} - -.content-sidebar .widget abbr[title] { - border-color: #2b2b2b; -} - -.content-sidebar .widget fieldset { - border-color: rgba(0, 0, 0, 0.1); -} - -.content-sidebar .widget blockquote { - color: #767676; -} - -.content-sidebar .widget blockquote cite { - color: #2b2b2b; -} - -.content-sidebar .widget li > ol, -.content-sidebar .widget li > ul { - margin-left: 18px; -} - -.content-sidebar .widget table, -.content-sidebar .widget th, -.content-sidebar .widget td { - border-color: rgba(0, 0, 0, 0.1); -} - -.content-sidebar .widget del { - color: #767676; -} - -.content-sidebar .widget hr { - background-color: rgba(0, 0, 0, 0.1); -} - -.content-sidebar .widget input, -.content-sidebar .widget textarea { - background-color: #fff; - border-color: rgba(0, 0, 0, 0.1); - color: #2b2b2b; -} - -.content-sidebar .widget input:focus, -.content-sidebar .widget textarea:focus { - border-color: rgba(0, 0, 0, 0.3); -} - -.content-sidebar .widget input[type="button"], -.content-sidebar .widget input[type="reset"], -.content-sidebar .widget input[type="submit"] { - background-color: #24890d; - border: 0; - color: #fff; -} - -.content-sidebar .widget input[type="button"]:hover, -.content-sidebar .widget input[type="button"]:focus, -.content-sidebar .widget input[type="reset"]:hover, -.content-sidebar .widget input[type="reset"]:focus, -.content-sidebar .widget input[type="submit"]:hover, -.content-sidebar .widget input[type="submit"]:focus { - background-color: #41a62a; -} - -.content-sidebar .widget input[type="button"]:active, -.content-sidebar .widget input[type="reset"]:active, -.content-sidebar .widget input[type="submit"]:active { - background-color: #55d737; -} - -.content-sidebar .widget .wp-caption { - color: #767676; -} - -.content-sidebar .widget .widget-title { - border-top: 5px solid #000; - color: #2b2b2b; - font-size: 14px; - font-weight: 900; - margin: 0 0 18px; - padding-top: 7px; - text-transform: uppercase; -} - -.content-sidebar .widget .widget-title a { - color: #2b2b2b; -} - -.content-sidebar .widget .widget-title a:hover { - color: #41a62a; -} - -/* List Style Widgets*/ - -.content-sidebar .widget_archive li, -.content-sidebar .widget_categories li, -.content-sidebar .widget_links li, -.content-sidebar .widget_meta li, -.content-sidebar .widget_nav_menu li, -.content-sidebar .widget_pages li, -.content-sidebar .widget_recent_comments li, -.content-sidebar .widget_recent_entries li, -.content-sidebar .widget_categories li ul, -.content-sidebar .widget_nav_menu li ul, -.content-sidebar .widget_pages li ul { - border-color: rgba(0, 0, 0, 0.1); -} - -/* Calendar Widget */ - -.content-sidebar .widget_calendar caption { - color: #2b2b2b; - font-weight: 900; -} - -.content-sidebar .widget_calendar thead th { - background-color: rgba(0, 0, 0, 0.02); -} - -.content-sidebar .widget_calendar tbody a, -.content-sidebar .widget_calendar tbody a:hover { - color: #fff; -} - -/* Ephemera widget*/ - -.content-sidebar .widget_twentyfourteen_ephemera .widget-title { - line-height: 1.2857142857; - padding-top: 1px; -} - -.content-sidebar .widget_twentyfourteen_ephemera .widget-title:before { - background-color: #000; - color: #fff; - margin: -1px 9px 0 0; - padding: 6px 0 9px; - text-align: center; - vertical-align: middle; - width: 36px; -} - -.content-sidebar .widget_twentyfourteen_ephemera .video.widget-title:before { - content: "\f104"; -} - -.content-sidebar .widget_twentyfourteen_ephemera .audio.widget-title:before { - content: "\f109"; -} - -.content-sidebar .widget_twentyfourteen_ephemera .image.widget-title:before { - content: "\f473"; -} - -.content-sidebar .widget_twentyfourteen_ephemera .gallery.widget-title:before { - content: "\f103"; -} - -.content-sidebar .widget_twentyfourteen_ephemera .aside.widget-title:before { - content: "\f101"; -} - -.content-sidebar .widget_twentyfourteen_ephemera .quote.widget-title:before { - content: "\f106"; -} - -.content-sidebar .widget_twentyfourteen_ephemera .link.widget-title:before { - content: "\f107"; -} - -.content-sidebar .widget_twentyfourteen_ephemera > ol > li { - border-bottom: 1px solid rgba(0, 0, 0, 0.1); -} - -.content-sidebar .widget_twentyfourteen_ephemera .entry-meta { - color: #ccc; -} - -.content-sidebar .widget_twentyfourteen_ephemera .entry-meta a { - color: #767676; -} - -.content-sidebar .widget_twentyfourteen_ephemera .entry-meta a:hover { - color: #41a62a; -} - -.content-sidebar.widget_twentyfourteen_ephemera blockquote cite { - font-size: 13px; - line-height: 1.3846153846; -} - -.content-sidebar .widget_twentyfourteen_ephemera .post-format-archive-link { - font-weight: 900; -} - - -/** - * 8.0 Footer - * ----------------------------------------------------------------------------- - */ - -#supplementary { - padding: 0 10px; -} - -.site-footer, -.site-info, -.site-info a { - color: rgba(255, 255, 255, 0.7); -} - -.site-footer { - background-color: #000; - font-size: 12px; - position: relative; - z-index: 3; -} - -.footer-sidebar { - padding-top: 48px; -} - -.site-info { - padding: 15px 10px; -} - -#supplementary + .site-info { - border-top: 1px solid rgba(255, 255, 255, 0.2); -} - -.site-info a:hover { - color: #41a62a; -} - - -/** - * 9.0 Featured Content - * ----------------------------------------------------------------------------- - */ - -.featured-content { - background: #000 url(images/pattern-dark.svg) repeat fixed; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - position: relative; - width: 100%; -} - -.featured-content-inner { - overflow: hidden; -} - -.featured-content .hentry { - color: #fff; - margin: 0; - max-width: 100%; - width: 100%; -} - -.featured-content .post-thumbnail, -.featured-content .post-thumbnail:hover { - background: transparent; -} - -.featured-content .post-thumbnail { - display: block; - position: relative; - padding-top: 55.357142857%; - overflow: hidden; -} - -.featured-content .post-thumbnail img { - left: 0; - position: absolute; - top: 0; -} - -.featured-content .entry-header { - background-color: #000; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - min-height: 96px; - overflow: hidden; - padding: 24px 10px; -} - -.featured-content a { - color: #fff; -} - -.featured-content a:hover { - color: #41a62a; -} - -.featured-content .entry-meta { - color: #fff; - font-size: 11px; - font-weight: 700; - line-height: 1.0909090909; - margin-bottom: 12px; -} - -.featured-content .cat-links { - font-weight: 700; -} - -.featured-content .entry-title { - font-size: 18px; - font-weight: 300; - line-height: 1.3333333333; - margin: 0; - text-transform: uppercase; -} - - -/* Slider */ - -.slider .featured-content .hentry { - -webkit-backface-visibility: hidden; - display: none; - position: relative; -} - -.slider .featured-content .post-thumbnail { - padding-top: 55.49132947%; -} - -.slider-control-paging { - background-color: #000; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - list-style: none; - margin: -24px 0 0 0; - position: relative; - width: 100%; - z-index: 3; -} - -.slider-control-paging li { - float: left; - margin: 2px 4px 2px 0; -} - -.slider-control-paging li:last-child { - margin-right: 0; -} - -.slider-control-paging a { - cursor: pointer; - display: block; - height: 44px; - position: relative; - text-indent: -999em; - width: 44px; -} - -.slider-control-paging a:before { - background-color: #4d4d4d; - content: ""; - height: 12px; - left: 10px; - position: absolute; - top: 16px; - width: 12px; -} - -.slider-control-paging a:hover:before { - background-color: #41a62a; -} - -.slider-control-paging .slider-active:before, -.slider-control-paging .slider-active:hover:before { - background-color: #24890d; -} - -.slider-direction-nav { - clear: both; - list-style: none; - margin: 0; - position: relative; - width: 100%; - z-index: 3; -} - -.slider-direction-nav li { - border-color: #fff; - border-style: solid; - border-width: 2px 1px 0 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - text-align: center; - width: 50%; -} - -.slider-direction-nav li:last-child { - border-width: 2px 0 0 1px; -} - -.slider-direction-nav a { - background-color: #000; - display: block; - font-size: 0; - height: 46px; -} - -.slider-direction-nav a:hover { - background-color: #24890d; -} - -.slider-direction-nav a:before { - color: #fff; - content: "\f430"; - font-size: 32px; - line-height: 46px; -} - -.slider-direction-nav .slider-next:before { - content: "\f429"; -} - -.slider-direction-nav .slider-disabled { - display: none; -} - - -/** - * 10.0 Multisite - * ----------------------------------------------------------------------------- - */ - -.site-main .widecolumn { - padding-top: 72px; - width: auto; -} -.site-main .mu_register, -.widecolumn > h2, -.widecolumn > form { - margin: 0 auto 48px; - max-width: 474px; - padding: 0 30px; -} - -.site-main .mu_register #blog_title, -.site-main .mu_register #user_email, -.site-main .mu_register #blogname, -.site-main .mu_register #user_name { - font-size: inherit; - width: 90%; -} - -.site-main .mu_register input[type="submit"], -.widecolumn #submit { - font-size: inherit; - width: auto; -} - - -/** - * 11.0 Media Queries - * ----------------------------------------------------------------------------- - */ - -/* Does the same thing as , - * but in the future W3C standard way. -ms- prefix is required for IE10+ to - * render responsive styling in Windows 8 "snapped" views; IE10+ does not honor - * the meta tag. See https://core.trac.wordpress.org/ticket/25888. - */ -@-ms-viewport { - width: device-width; -} - -@viewport { - width: device-width; -} - -/* Adjust positioning of edit shortcuts, override style in customize-preview.css */ -@media screen and (max-width:800px) { - body.customize-partial-edit-shortcuts-shown .site-header .site-title { - padding-left: 8px; - } - - .site-header .customize-partial-edit-shortcut button { - top: 10px; - } -} - - -@media screen and (max-width: 400px) { - .list-view .site-content .post-thumbnail { - background: none; - width: auto; - z-index: 2; - } - - .list-view .site-content .post-thumbnail img { - float: left; - margin: 0 10px 3px 0; - width: 84px; - } - - .list-view .site-content .entry-header { - background-color: transparent; - padding: 0; - } - - .list-view .content-area { - padding: 0 10px; - } - - .list-view .site-content .hentry { - border-bottom: 1px solid rgba(0, 0, 0, 0.1); - margin: 0; - min-height: 60px; - padding: 12px 0 9px; - } - - .list-view .site-content .cat-links, - .list-view .site-content .type-post .entry-content, - .list-view .site-content .type-page .entry-content, - .list-view .site-content .type-post .entry-summary, - .list-view .site-content .type-page .entry-summary, - .list-view .site-content footer.entry-meta { - display: none; - } - - .list-view .site-content .entry-title { - clear: none; - font-size: 15px; - font-weight: 900; - line-height: 1.2; - margin-bottom: 6px; - text-transform: none; - } - - .list-view .site-content .format-aside .entry-title, - .list-view .site-content .format-link .entry-title, - .list-view .site-content .format-quote .entry-title { - display: block; - } - - .list-view .site-content .entry-meta { - background-color: transparent; - clear: none; - margin: 0; - text-transform: none; - } - - .archive-header, - .page-header { - border-bottom: 1px solid rgba(0, 0, 0, 0.1); - margin: 24px auto 0; - padding-bottom: 24px; - } - - .error404 .page-header { - border-bottom: 0; - margin: 0 auto 24px; - padding: 0 10px; - } -} - -/* Adjust positioning of edit shortcuts, override style in customize-preview.css */ -@media screen and (max-width:320px) { - .site-header .customize-partial-edit-shortcut button { - left: -32px; - } - - body.customize-partial-edit-shortcuts-shown .site-header .site-title { - padding-left: 28px; - } -} - -@media screen and (min-width: 401px) { - a.post-thumbnail:hover img { - opacity: 0.85; - } - - .full-size-link:before, - .parent-post-link:before, - .site-content span + .byline:before, - .site-content span + .comments-link:before, - .site-content span + .edit-link:before, - .site-content span + .entry-date:before { - content: ""; - } - - .attachment span.entry-date:before, - .entry-content .edit-link a:before, - .entry-meta .edit-link a:before, - .site-content .byline a:before, - .site-content .comments-link a:before, - .site-content .entry-date a:before, - .site-content .featured-post:before, - .site-content .full-size-link a:before, - .site-content .parent-post-link a:before, - .site-content .post-format a:before { - -webkit-font-smoothing: antialiased; - display: inline-block; - font: normal 16px/1 Genericons; - text-decoration: inherit; - vertical-align: text-bottom; - } - - .site-content .entry-meta > span { - margin-right: 10px; - } - - .site-content .format-video .post-format a:before { - content: "\f104"; - } - - .site-content .format-audio .post-format a:before { - content: "\f109"; - } - - .site-content .format-image .post-format a:before { - content: "\f473"; - } - - .site-content .format-quote .post-format a:before { - content: "\f106"; - margin-right: 2px; - } - - .site-content .format-gallery .post-format a:before { - content: "\f103"; - margin-right: 4px; - } - - .site-content .format-aside .post-format a:before { - content: "\f101"; - margin-right: 2px; - } - - .site-content .format-link .post-format a:before { - content: "\f107"; - position: relative; - top: 1px; - } - - .site-content .featured-post:before { - content: "\f308"; - margin-right: 3px; - position: relative; - top: 1px; - } - - .site-content .entry-date a:before, - .attachment .site-content span.entry-date:before { - content: "\f303"; - margin-right: 1px; - position: relative; - top: 1px; - } - - .site-content .byline a:before { - content: "\f304"; - } - - .site-content .comments-link a:before { - content: "\f300"; - margin-right: 2px; - } - - .entry-content .edit-link a:before, - .entry-meta .edit-link a:before { - content: "\f411"; - } - - .site-content .full-size-link a:before { - content: "\f402"; - margin-right: 1px; - } - - .site-content .parent-post-link a:before { - content: "\f301"; - } - - .list-view .site-content .hentry { - border-top: 1px solid rgba(0, 0, 0, 0.1); - padding-top: 48px; - } - - .list-view .site-content .hentry:first-of-type, - .list-view .site-content .hentry.has-post-thumbnail { - border-top: 0; - padding-top: 0; - } - - .archive-header, - .page-header { - margin: 0 auto 60px; - padding: 0 10px; - } - - .error404 .page-header { - margin-bottom: 24px; - } -} - -@media screen and (min-width: 594px) { - .site-content .entry-header { - padding-right: 30px; - padding-left: 30px; - } - - .site-content .has-post-thumbnail .entry-header { - margin-top: -48px; - } -} - -@media screen and (min-width: 673px) { - .header-main { - padding: 0 30px; - } - - .search-toggle { - margin-right: 18px; - } - - .search-box .search-field { - width: 50%; - } - - .content-area { - float: left; - width: 100%; - } - - .site-content { - margin-right: 33.33333333%; - } - - .site-content .has-post-thumbnail .entry-header { - margin-top: 0; - } - - .archive-header, - .comments-area, - .image-navigation, - .page-header, - .page-content, - .post-navigation, - .site-content .entry-content, - .site-content .entry-summary, - .site-content footer.entry-meta { - padding-right: 30px; - padding-left: 30px; - } - - .singular .site-content .hentry.has-post-thumbnail { - margin-top: 0; - } - - .full-width .site-content { - margin-right: 0; - } - - .full-width .site-content .has-post-thumbnail .entry-header, - .full-width .site-content .hentry.has-post-thumbnail:first-child { - margin-top: -48px; - } - - #secondary, - #supplementary { - padding: 0 30px; - } - - .content-sidebar { - border: 0; - float: right; - margin-left: -33.33333333%; - padding: 48px 30px 24px; - position: relative; - width: 33.33333333%; - } - - .grid .featured-content .hentry { - float: left; - width: 50%; - } - - .grid .featured-content .hentry:nth-child( 2n+1 ) { - clear: both; - } - - .grid .featured-content .entry-header { - border-color: #000; - border-style: solid; - border-width: 12px 10px; - height: 96px; - padding: 0; - } - - .slider .featured-content .entry-title { - font-size: 22px; - line-height: 1.0909090909; - } - - .slider .featured-content .entry-header { - min-height: inherit; - padding: 24px 30px 48px; - position: absolute; - left: 0; - bottom: 0; - width: 50%; - z-index: 3; - } - - .slider-control-paging { - background: transparent; - margin-top: -48px; - padding-left: 20px; - width: 50%; - } - - .slider-direction-nav { - clear: none; - float: right; - margin-top: -48px; - width: 98px; - } - - .slider-direction-nav li { - border: 0; - padding: 0 1px 0 0; - } - - .slider-direction-nav li:last-child { - padding: 0 0 0 1px; - } - - .slider-direction-nav a { - height: 48px; - } - - .slider-direction-nav a:before { - line-height: 48px; - } - - .site-info { - padding: 15px 30px; - } -} - -@media screen and (min-width: 783px) { - .site-title { - /* Search-toggle width = 48px */ - max-width: -webkit-calc(100% - 48px); - max-width: calc(100% - 48px); - } - - .header-main { - padding-right: 0; - } - - .search-toggle { - margin-right: 0; - } - - /* Fixed Header */ - - .masthead-fixed .site-header { - position: fixed; - top: 0; - } - - .admin-bar.masthead-fixed .site-header { - top: 32px; - } - - .masthead-fixed .site-main { - margin-top: 48px; - } - - /* Navigation */ - - .site-navigation li .current_page_item > a, - .site-navigation li .current_page_ancestor > a, - .site-navigation li .current-menu-item > a, - .site-navigation li .current-menu-ancestor > a { - color: #fff; - } - - /* Primary Navigation */ - - .primary-navigation { - float: right; - font-size: 11px; - margin: 0 1px 0 -12px; - padding: 0; - text-transform: uppercase; - } - - .primary-navigation .menu-toggle { - display: none; - padding: 0; - } - - .primary-navigation .nav-menu { - border-bottom: 0; - display: block; - } - - .primary-navigation.toggled-on { - border-bottom: 0; - margin: 0; - padding: 0; - } - - .primary-navigation li { - border: 0; - display: inline-block; - height: 48px; - line-height: 48px; - position: relative; - } - - .primary-navigation a { - display: inline-block; - padding: 0 12px; - white-space: nowrap; - } - - .primary-navigation ul ul { - background-color: #24890d; - float: left; - margin: 0; - position: absolute; - top: 48px; - left: -999em; - z-index: 99999; - } - - .primary-navigation li li { - border: 0; - display: block; - height: auto; - line-height: 1.0909090909; - } - - .primary-navigation ul ul ul { - left: -999em; - top: 0; - } - - .primary-navigation ul ul a { - padding: 18px 12px; - white-space: normal; - width: 176px; - } - - .primary-navigation li:hover > a, - .primary-navigation li.focus > a { - background-color: #24890d; - color: #fff; - } - - .primary-navigation ul ul a:hover, - .primary-navigation ul ul li.focus > a { - background-color: #41a62a; - } - - .primary-navigation ul li:hover > ul, - .primary-navigation ul li.focus > ul { - left: auto; - } - - .primary-navigation ul ul li:hover > ul, - .primary-navigation ul ul li.focus > ul { - left: 100%; - } - - .primary-navigation .menu-item-has-children > a, - .primary-navigation .page_item_has_children > a { - padding-right: 26px; - } - - .primary-navigation .menu-item-has-children > a:after, - .primary-navigation .page_item_has_children > a:after { - -webkit-font-smoothing: antialiased; - content: "\f502"; - display: inline-block; - font: normal 8px/1 Genericons; - position: absolute; - right: 12px; - top: 22px; - vertical-align: text-bottom; - } - - .primary-navigation li .menu-item-has-children > a, - .primary-navigation li .page_item_has_children > a { - padding-right: 20px; - width: 168px; - } - - .primary-navigation .menu-item-has-children li.menu-item-has-children > a:after, - .primary-navigation .menu-item-has-children li.page_item_has_children > a:after, - .primary-navigation .page_item_has_children li.menu-item-has-children > a:after, - .primary-navigation .page_item_has_children li.page_item_has_children > a:after { - content: "\f501"; - right: 8px; - top: 20px; - } -} - -@media screen and (min-width: 810px) { - .attachment .entry-attachment .attachment { - margin-right: -168px; - margin-left: -168px; - max-width: 810px; - } - - .attachment .site-content .attachment img { - display: block; - margin: 0 auto; - } - - .contributor-avatar { - margin-left: -168px; - } - - .contributor-summary { - float: left; - } - - .full-width .site-content blockquote.alignleft, - .full-width .site-content blockquote.alignright { - width: -webkit-calc(50% + 130px); - width: calc(50% + 130px); - } - - .full-width .site-content blockquote.alignleft, - .full-width .site-content img.size-full.alignleft, - .full-width .site-content img.size-large.alignleft, - .full-width .site-content img.size-medium.alignleft, - .full-width .site-content .wp-caption.alignleft { - margin-left: -168px; - } - - .full-width .site-content .alignleft { - clear: left; - } - - .full-width .site-content blockquote.alignright, - .full-width .site-content img.size-full.alignright, - .full-width .site-content img.size-large.alignright, - .full-width .site-content img.size-medium.alignright, - .full-width .site-content .wp-caption.alignright { - margin-right: -168px; - } - - .full-width .site-content .alignright { - clear: right; - } -} - -@media screen and (min-width: 846px) { - .content-area, - .content-sidebar { - padding-top: 72px; - } - - .site-content .has-post-thumbnail .entry-header { - margin-top: -48px; - } - - .comment-list .trackback, - .comment-list .pingback, - .comment-list article { - margin-bottom: 36px; - padding-top: 36px; - } - - .comment-author .avatar { - height: 34px; - top: 2px; - width: 34px; - } - - .comment-author, - .comment-awaiting-moderation, - .comment-content, - .comment-list .reply, - .comment-metadata { - padding-left: 50px; - } - - .comment-list .children { - margin-left: 20px; - } - - .full-width .site-content .hentry.has-post-thumbnail:first-child { - margin-top: -72px; - } - - .featured-content { - margin-bottom: 0; - } -} - -@media screen and (min-width: 1008px) { - .search-box-wrapper { - padding-left: 182px; - } - - .main-content { - float: left; - } - - .site-content { - margin-right: 29.04761904%; - margin-left: 182px; - } - - .site-content .entry-header { - margin-top: 0; - } - - .site-content .has-post-thumbnail .entry-header { - margin-top: 0; - } - - .content-sidebar { - margin-left: -29.04761904%; - width: 29.04761904%; - } - - .site:before { - background-color: #000; - content: ""; - display: block; - height: 100%; - min-height: 100%; - position: absolute; - top: 0; - left: 0; - width: 182px; - z-index: 2; - } - - #secondary { - background-color: transparent; - border: 0; - clear: none; - float: left; - margin: 0 0 0 -100%; - min-height: 100vh; - width: 122px; - } - - .primary-sidebar { - padding-top: 0; - } - - .site-description { - display: block; - margin: 0 0 18px; - } - - .site-description:empty { - margin: 0; - } - - .secondary-navigation { - font-size: 11px; - margin: 0 -30px 48px; - width: 182px; - } - - .secondary-navigation li { - border-top: 1px solid rgba(255, 255, 255, 0.2); - position: relative; - } - - .secondary-navigation a { - padding: 10px 30px; - } - - .secondary-navigation ul ul { - background-color: #24890d; - position: absolute; - top: 0; - left: -999em; - width: 182px; - z-index: 99999; - } - - .secondary-navigation li li { - border-top: 0; - } - - .secondary-navigation li:hover > a, - .secondary-navigation li.focus > a { - background-color: #24890d; - color: #fff; - } - - .secondary-navigation ul ul a:hover, - .secondary-navigation ul ul li.focus > a { - background-color: #41a62a; - } - - .secondary-navigation ul li:hover > ul, - .secondary-navigation ul li.focus > ul { - left: 162px; - } - - .secondary-navigation .menu-item-has-children > a { - padding-right: 38px; - } - - .secondary-navigation .menu-item-has-children > a:after { - -webkit-font-smoothing: antialiased; - content: "\f501"; - display: inline-block; - font: normal 8px/1 Genericons; - position: absolute; - right: 26px; - top: 14px; - vertical-align: text-bottom; - } - - .footer-sidebar .widget, - .primary-sidebar .widget { - font-size: 12px; - line-height: 1.5; - } - - .footer-sidebar .widget { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - float: left; - padding: 0 30px; - width: 25%; - } - - .footer-sidebar .widget h1, - .primary-sidebar .widget h1 { - font-size: 20px; - line-height: 1.2; - } - - .footer-sidebar .widget h2, - .primary-sidebar .widget h2 { - font-size: 18px; - line-height: 1.3333333333; - } - - .footer-sidebar .widget h3, - .primary-sidebar .widget h3 { - font-size: 16px; - line-height: 1.5; - } - - .footer-sidebar .widget h4, - .primary-sidebar .widget h4 { - font-size: 14px; - line-height: 1.7142857142; - } - - .footer-sidebar .widget h5, - .primary-sidebar .widget h5 { - font-size: 12px; - line-height: 2; - } - - .footer-sidebar .widget h6, - .primary-sidebar .widget h6 { - font-size: 11px; - line-height: 2.1818181818; - } - - .footer-sidebar .widget code, - .footer-sidebar .widget kbd, - .footer-sidebar .widget tt, - .footer-sidebar .widget var, - .footer-sidebar .widget samp, - .footer-sidebar .widget pre, - .primary-sidebar .widget code, - .primary-sidebar .widget kbd, - .primary-sidebar .widget tt, - .primary-sidebar .widget var, - .primary-sidebar .widget samp, - .primary-sidebar .widget pre { - font-size: 11px; - line-height: 1.6363636363; - } - - .footer-sidebar .widget blockquote, - .primary-sidebar .widget blockquote { - font-size: 14px; - line-height: 1.2857142857; - } - - .footer-sidebar .widget blockquote cite, - .primary-sidebar .widget blockquote cite { - font-size: 12px; - line-height: 1.5; - } - - .footer-sidebar .widget input, - .footer-sidebar .widget textarea, - .primary-sidebar .widget input, - .primary-sidebar .widget textarea { - font-size: 12px; - padding: 3px 2px 4px 4px; - } - - .footer-sidebar .widget input[type="button"], - .footer-sidebar .widget input[type="reset"], - .footer-sidebar .widget input[type="submit"], - .primary-sidebar .widget input[type="button"], - .primary-sidebar .widget input[type="reset"], - .primary-sidebar .widget input[type="submit"] { - padding: 5px 15px 4px; - } - - .footer-sidebar .widget .widget-title, - .primary-sidebar .widget .widget-title { - font-size: 11px; - font-weight: 900; - line-height: 1.6363636363; - margin-bottom: 18px; - } - - .footer-sidebar .widget_twentyfourteen_ephemera .entry-title, - .footer-sidebar .widget_twentyfourteen_ephemera .entry-meta, - .footer-sidebar .widget_twentyfourteen_ephemera .wp-caption-text, - .footer-sidebar .widget_twentyfourteen_ephemera .post-format-archive-link, - .footer-sidebar .widget_twentyfourteen_ephemera .entry-content table, - .primary-sidebar .widget_twentyfourteen_ephemera .entry-title, - .primary-sidebar .widget_twentyfourteen_ephemera .entry-meta, - .primary-sidebar .widget_twentyfourteen_ephemera .wp-caption-text, - .primary-sidebar .widget_twentyfourteen_ephemera .post-format-archive-link, - .primary-sidebar .widget_twentyfourteen_ephemera .entry-content table { - font-size: 11px; - line-height: 1.6363636363; - } - - .footer-sidebar .widget_archive li, - .footer-sidebar .widget_categories li, - .footer-sidebar .widget_links li, - .footer-sidebar .widget_meta li, - .footer-sidebar .widget_nav_menu li, - .footer-sidebar .widget_pages li, - .footer-sidebar .widget_recent_comments li, - .footer-sidebar .widget_recent_entries li, - .primary-sidebar .widget_archive li, - .primary-sidebar .widget_categories li, - .primary-sidebar .widget_links li, - .primary-sidebar .widget_meta li, - .primary-sidebar .widget_nav_menu li, - .primary-sidebar .widget_pages li, - .primary-sidebar .widget_recent_comments li, - .primary-sidebar .widget_recent_entries li { - border-top: 0; - padding: 0 0 6px; - } - - .footer-sidebar .widget_archive li:last-child, - .footer-sidebar .widget_categories li:last-child, - .footer-sidebar .widget_links li:last-child, - .footer-sidebar .widget_meta li:last-child, - .footer-sidebar .widget_nav_menu li:last-child, - .footer-sidebar .widget_pages li:last-child, - .footer-sidebar .widget_recent_comments li:last-child, - .footer-sidebar .widget_recent_entries li:last-child, - .primary-sidebar .widget_archive li:last-child, - .primary-sidebar .widget_categories li:last-child, - .primary-sidebar .widget_links li:last-child, - .primary-sidebar .widget_meta li:last-child, - .primary-sidebar .widget_nav_menu li:last-child, - .primary-sidebar .widget_pages li:last-child, - .primary-sidebar .widget_recent_comments li:last-child, - .primary-sidebar .widget_recent_entries li:last-child { - padding: 0; - } - - .footer-sidebar .widget_categories li ul, - .footer-sidebar .widget_nav_menu li ul, - .footer-sidebar .widget_pages li ul, - .primary-sidebar .widget_categories li ul, - .primary-sidebar .widget_nav_menu li ul, - .primary-sidebar .widget_pages li ul { - border-top: 0; - margin-top: 6px; - } - - #supplementary { - padding: 0; - } - - .footer-sidebar { - font-size: 12px; - line-height: 1.5; - } - - .featured-content { - padding-left: 182px; - } - - .grid .featured-content .hentry { - width: 33.3333333%; - } - - .grid .featured-content .hentry:nth-child( 2n+1 ) { - clear: none; - } - - .grid .featured-content .hentry:nth-child( 3n+1 ) { - clear: both; - } - - .grid .featured-content .entry-header { - height: 120px; - } -} - -@media screen and (min-width: 1040px) { - .site-content .has-post-thumbnail .entry-header { - margin-top: -48px; - } - - .archive-header, - .comments-area, - .image-navigation, - .page-header, - .page-content, - .post-navigation, - .site-content .entry-header, - .site-content .entry-content, - .site-content .entry-summary, - .site-content footer.entry-meta { - padding-right: 15px; - padding-left: 15px; - } - - .full-width .archive-header, - .full-width .comments-area, - .full-width .image-navigation, - .full-width .page-header, - .full-width .page-content, - .full-width .post-navigation, - .full-width .site-content .entry-header, - .full-width .site-content .entry-content, - .full-width .site-content .entry-summary, - .full-width .site-content footer.entry-meta { - padding-right: 30px; - padding-left: 30px; - } -} - -@media screen and (min-width: 1080px) { - .search-box .search-field { - width: 324px; - } - - .site-content, - .site-main .widecolumn { - margin-left: 222px; - } - - .site:before { - width: 222px; - } - - .search-box-wrapper, - .featured-content { - padding-left: 222px; - } - - #secondary { - width: 162px; - } - - .secondary-navigation, - .secondary-navigation ul ul { - width: 222px; - } - - .secondary-navigation ul li:hover > ul, - .secondary-navigation ul li.focus > ul { - left: 202px; - } - - .slider .featured-content .entry-title { - font-size: 33px; - } - - .slider .featured-content .entry-header, - .slider-control-paging { - width: 534px; - } - - .slider-control-paging { - padding-left: 24px; - } - - .slider-control-paging li { - margin: 12px 12px 12px 0; - } - - .slider-control-paging a { - height: 24px; - width: 24px; - } - - .slider-control-paging a:before { - top: 6px; - left: 6px; - } -} - -@media screen and (min-width: 1110px) { - .archive-header, - .comments-area, - .image-navigation, - .page-header, - .page-content, - .post-navigation, - .site-content .entry-header, - .site-content .entry-content, - .site-content .entry-summary, - .site-content footer.entry-meta { - padding-right: 30px; - padding-left: 30px; - } -} - -@media screen and (min-width: 1218px) { - .archive-header, - .comments-area, - .image-navigation, - .page-header, - .page-content, - .post-navigation, - .site-content .entry-header, - .site-content .entry-content, - .site-content .entry-summary, - .site-content footer.entry-meta { - margin-right: 54px; - } - - .full-width .archive-header, - .full-width .comments-area, - .full-width .image-navigation, - .full-width .page-header, - .full-width .page-content, - .full-width .post-navigation, - .full-width .site-content .entry-header, - .full-width .site-content .entry-content, - .full-width .site-content .entry-summary, - .full-width .site-content footer.entry-meta { - margin-right: auto; - } -} - -@media screen and (min-width: 1260px) { - .site-content blockquote.alignleft, - .site-content blockquote.alignright { - width: -webkit-calc(50% + 18px); - width: calc(50% + 18px); - } - - .site-content blockquote.alignleft { - margin-left: -18%; - } - - .site-content blockquote.alignright { - margin-right: -18%; - } -} - - -/** - * 12.0 Print - * ----------------------------------------------------------------------------- - */ - -@media print { - body { - background: none !important; /* Brute force since user agents all print differently. */ - color: #2b2b2b; - font-size: 12pt; - } - - .site, - .site-header, - .hentry, - .site-content .entry-header, - .site-content .entry-content, - .site-content .entry-summary, - .site-content .entry-meta, - .page-content, - .archive-header, - .page-header, - .contributor-info, - .comments-area, - .attachment .entry-attachment .attachment { - max-width: 100%; - } - - #site-header img, - .search-toggle, - .site-navigation, - .site-content nav, - .edit-link, - .page-links, - .widget-area, - .more-link, - .post-format-archive-link, - .comment-respond, - .comment-list .reply, - .comment-reply-login, - #secondary, - .site-footer, - .slider-control-paging, - .slider-direction-nav { - display: none; - } - - .site-title a, - .entry-meta, - .entry-meta a, - .featured-content .hentry, - .featured-content a { - color: #2b2b2b; - } - - .entry-content a, - .entry-summary a, - .page-content a, - .comment-content a { - text-decoration: none; - } - - .site-header, - .post-thumbnail, - a.post-thumbnail:hover, - .site-content .entry-header, - .site-footer, - .featured-content, - .featured-content .entry-header { - background: transparent; - } - - .header-main { - padding: 48px 10px; - } - - .site-title { - float: none; - font-size: 19pt; - } - - .content-area { - padding-top: 0; - } - - .list-view .site-content .hentry { - border-bottom: 1px solid rgba(0, 0, 0, 0.1); - margin-bottom: 48px; - padding-bottom: 24px; - } - - .post-thumbnail img { - margin: 0 10px 24px; - } - - .site-content .has-post-thumbnail .entry-header { - padding-top: 0; - } - - .site-content footer.entry-meta { - margin: 24px auto; - } - - .entry-meta .tag-links a { - color: #fff; - } - - .singular .site-content .hentry.has-post-thumbnail { - margin-top: 0; - } - - .gallery-columns-1.gallery-size-medium, - .gallery-columns-1.gallery-size-thumbnail, - .gallery-columns-2.gallery-size-thumbnail, - .gallery-columns-3.gallery-size-thumbnail { - display: block; - } - - .archive-title, - .page-title { - margin: 0 10px 48px; - } - - .featured-content .hentry { - margin-bottom: 48px; - } - - .featured-content .post-thumbnail, - .slider .featured-content .post-thumbnail { - padding-top: 0; - } - - .featured-content .post-thumbnail img { - position: relative; - } - - .featured-content .entry-header { - padding: 0 10px 24px; - } - - .featured-content .entry-meta { - font-size: 9pt; - margin-bottom: 11px; - } - - .featured-content .cat-links { - font-weight: 900; - } - - .featured-content .entry-title { - font-size: 25pt; - line-height: 36px; - } -} diff --git a/wp/wp-content/themes/twentyfourteen/tag.php b/wp/wp-content/themes/twentyfourteen/tag.php deleted file mode 100644 index 208455de..00000000 --- a/wp/wp-content/themes/twentyfourteen/tag.php +++ /dev/null @@ -1,60 +0,0 @@ - - -
      -
      - - - -
      -

      - - %s
      ', $term_description ); - endif; - ?> - - - - -
      - - - -
      -
      - - - -
      -

      - -

      -
      - - -
      -
      - - - -
      -
      - - - -
      -
      -

      -

      - - -
      -
      - -
      -
      - - \ No newline at end of file diff --git a/wp/wp-content/themes/twentythirteen/archive.php b/wp/wp-content/themes/twentythirteen/archive.php deleted file mode 100644 index 445db7e6..00000000 --- a/wp/wp-content/themes/twentythirteen/archive.php +++ /dev/null @@ -1,55 +0,0 @@ - - -
      -
      - - -
      -

      -
      - - - - - - - - - - - - -
      -
      - - - diff --git a/wp/wp-content/themes/twentythirteen/author-bio.php b/wp/wp-content/themes/twentythirteen/author-bio.php deleted file mode 100644 index ae2f522b..00000000 --- a/wp/wp-content/themes/twentythirteen/author-bio.php +++ /dev/null @@ -1,34 +0,0 @@ - - -
      \ No newline at end of file diff --git a/wp/wp-content/themes/twentythirteen/author.php b/wp/wp-content/themes/twentythirteen/author.php deleted file mode 100644 index c7b5d87a..00000000 --- a/wp/wp-content/themes/twentythirteen/author.php +++ /dev/null @@ -1,62 +0,0 @@ - - -
      -
      - - - - - -
      -

      ' . get_the_author() . '' ); ?>

      -
      - - - - - - - - - - - - - - - - - - -
      -
      - - - diff --git a/wp/wp-content/themes/twentythirteen/category.php b/wp/wp-content/themes/twentythirteen/category.php deleted file mode 100644 index f82e0abc..00000000 --- a/wp/wp-content/themes/twentythirteen/category.php +++ /dev/null @@ -1,41 +0,0 @@ - - -
      -
      - - -
      -

      - - -
      - -
      - - - - - - - - - - - - -
      -
      - - - diff --git a/wp/wp-content/themes/twentythirteen/comments.php b/wp/wp-content/themes/twentythirteen/comments.php deleted file mode 100644 index 3d1aff46..00000000 --- a/wp/wp-content/themes/twentythirteen/comments.php +++ /dev/null @@ -1,59 +0,0 @@ - - -
      - - -

      - ' . get_the_title() . '' ); - ?> -

      - -
        - 'ol', - 'short_ping' => true, - 'avatar_size' => 74, - ) ); - ?> -
      - - 1 && get_option( 'page_comments' ) ) : - ?> - - - - -

      - - - - - - -
      \ No newline at end of file diff --git a/wp/wp-content/themes/twentythirteen/content-aside.php b/wp/wp-content/themes/twentythirteen/content-aside.php deleted file mode 100644 index fbc01e61..00000000 --- a/wp/wp-content/themes/twentythirteen/content-aside.php +++ /dev/null @@ -1,38 +0,0 @@ - - -
      > -
      - →', 'twentythirteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( 'before' => '', 'link_before' => '', 'link_after' => '' ) ); - ?> -
      - -
      - - - ', '' ); ?> - - - - - - - - ', '' ); ?> - -
      -
      diff --git a/wp/wp-content/themes/twentythirteen/content-audio.php b/wp/wp-content/themes/twentythirteen/content-audio.php deleted file mode 100644 index 73a0d692..00000000 --- a/wp/wp-content/themes/twentythirteen/content-audio.php +++ /dev/null @@ -1,44 +0,0 @@ - - -
      > -
      - -

      - -

      - -

      - -
      - -
      -
      - →', 'twentythirteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( 'before' => '', 'link_before' => '', 'link_after' => '' ) ); - ?> -
      -
      - -
      - - ', '' ); ?> - - - - -
      -
      diff --git a/wp/wp-content/themes/twentythirteen/content-chat.php b/wp/wp-content/themes/twentythirteen/content-chat.php deleted file mode 100644 index 6a40b893..00000000 --- a/wp/wp-content/themes/twentythirteen/content-chat.php +++ /dev/null @@ -1,38 +0,0 @@ - - -
      > -
      - -

      - -

      - -

      - -
      - -
      - →', 'twentythirteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( 'before' => '', 'link_before' => '', 'link_after' => '' ) ); - ?> -
      - -
      - - ', '' ); ?> -
      -
      diff --git a/wp/wp-content/themes/twentythirteen/content-gallery.php b/wp/wp-content/themes/twentythirteen/content-gallery.php deleted file mode 100644 index a43647f7..00000000 --- a/wp/wp-content/themes/twentythirteen/content-gallery.php +++ /dev/null @@ -1,52 +0,0 @@ - - -
      > -
      - -

      - -

      - -

      - -
      - -
      - - →', 'twentythirteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( 'before' => '', 'link_before' => '', 'link_after' => '' ) ); - ?> - - - -
      - -
      - - - - - ' . __( 'Leave a comment', 'twentythirteen' ) . '', __( 'One comment so far', 'twentythirteen' ), __( 'View all % comments', 'twentythirteen' ) ); ?> - - - ', '' ); ?> - - - - -
      -
      diff --git a/wp/wp-content/themes/twentythirteen/content-image.php b/wp/wp-content/themes/twentythirteen/content-image.php deleted file mode 100644 index 01e2f347..00000000 --- a/wp/wp-content/themes/twentythirteen/content-image.php +++ /dev/null @@ -1,48 +0,0 @@ - - -
      > -
      - -

      - -

      - -

      - -
      - -
      - →', 'twentythirteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( 'before' => '', 'link_before' => '', 'link_after' => '' ) ); - ?> -
      - -
      - - - - - ' . __( 'Leave a comment', 'twentythirteen' ) . '', __( 'One comment so far', 'twentythirteen' ), __( 'View all % comments', 'twentythirteen' ) ); ?> - - - ', '' ); ?> - - - - -
      -
      diff --git a/wp/wp-content/themes/twentythirteen/content-link.php b/wp/wp-content/themes/twentythirteen/content-link.php deleted file mode 100644 index cc02d824..00000000 --- a/wp/wp-content/themes/twentythirteen/content-link.php +++ /dev/null @@ -1,43 +0,0 @@ - - -
      > -
      -

      - -

      - - -
      - -
      - →', 'twentythirteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( 'before' => '', 'link_before' => '', 'link_after' => '' ) ); - ?> -
      - - -
      - - - - -
      - -
      diff --git a/wp/wp-content/themes/twentythirteen/content-none.php b/wp/wp-content/themes/twentythirteen/content-none.php deleted file mode 100644 index d9549e1a..00000000 --- a/wp/wp-content/themes/twentythirteen/content-none.php +++ /dev/null @@ -1,31 +0,0 @@ - - - - -
      - - -

      Get started here.', 'twentythirteen' ), admin_url( 'post-new.php' ) ); ?>

      - - - -

      - - - - -

      - - - -
      diff --git a/wp/wp-content/themes/twentythirteen/content-quote.php b/wp/wp-content/themes/twentythirteen/content-quote.php deleted file mode 100644 index ac4de672..00000000 --- a/wp/wp-content/themes/twentythirteen/content-quote.php +++ /dev/null @@ -1,34 +0,0 @@ - - -
      > -
      - →', 'twentythirteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( 'before' => '', 'link_before' => '', 'link_after' => '' ) ); - ?> -
      - -
      - - - - - ' . __( 'Leave a comment', 'twentythirteen' ) . '', __( 'One comment so far', 'twentythirteen' ), __( 'View all % comments', 'twentythirteen' ) ); ?> - - - ', '' ); ?> -
      -
      diff --git a/wp/wp-content/themes/twentythirteen/content-status.php b/wp/wp-content/themes/twentythirteen/content-status.php deleted file mode 100644 index e0e51f30..00000000 --- a/wp/wp-content/themes/twentythirteen/content-status.php +++ /dev/null @@ -1,32 +0,0 @@ - - -
      > -
      - →', 'twentythirteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( 'before' => '', 'link_before' => '', 'link_after' => '' ) ); - ?> -
      - -
      - - ', '' ); ?> - - - - -
      -
      diff --git a/wp/wp-content/themes/twentythirteen/content-video.php b/wp/wp-content/themes/twentythirteen/content-video.php deleted file mode 100644 index 8118a080..00000000 --- a/wp/wp-content/themes/twentythirteen/content-video.php +++ /dev/null @@ -1,48 +0,0 @@ - - -
      > -
      - -

      - -

      - -

      - -
      - -
      - →', 'twentythirteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( 'before' => '', 'link_before' => '', 'link_after' => '' ) ); - ?> -
      - -
      - - - - - ' . __( 'Leave a comment', 'twentythirteen' ) . '', __( 'One comment so far', 'twentythirteen' ), __( 'View all % comments', 'twentythirteen' ) ); ?> - - - ', '' ); ?> - - - - -
      -
      diff --git a/wp/wp-content/themes/twentythirteen/content.php b/wp/wp-content/themes/twentythirteen/content.php deleted file mode 100644 index 98b6c319..00000000 --- a/wp/wp-content/themes/twentythirteen/content.php +++ /dev/null @@ -1,64 +0,0 @@ - - -
      > -
      - -
      - -
      - - - -

      - -

      - -

      - - - -
      - - -
      - -
      - -
      - →', 'twentythirteen' ), - the_title( '', '', false ) - ) ); - - wp_link_pages( array( 'before' => '', 'link_before' => '', 'link_after' => '' ) ); - ?> -
      - - -
      - - - - - - - -
      -
      diff --git a/wp/wp-content/themes/twentythirteen/css/editor-style.css b/wp/wp-content/themes/twentythirteen/css/editor-style.css deleted file mode 100644 index 56841899..00000000 --- a/wp/wp-content/themes/twentythirteen/css/editor-style.css +++ /dev/null @@ -1,771 +0,0 @@ -/* -Theme Name: Twenty Thirteen -Description: Used to style the TinyMCE editor. -*/ - - -/** - * Table of Contents: - * - * 1.0 - Body - * 2.0 - Headings - * 3.0 - Text Elements - * 4.0 - Links - * 5.0 - Alignment - * 6.0 - Tables - * 7.0 - Images - * 8.0 - Galleries - * 9.0 - Audio/Video - * 10.0 - Post Formats - * 11.0 - RTL - * ---------------------------------------------------------------------------- - */ - - -/** - * 1.0 Body - * ---------------------------------------------------------------------------- - */ - -html .mceContentBody { - font-size: 100%; - max-width: 604px; -} - -body { - color: #141412; - font-family: "Source Sans Pro", Helvetica, sans-serif; - line-height: 1.5; - text-rendering: optimizeLegibility; - vertical-align: baseline; -} - - -/** - * 2.0 Headings - * ---------------------------------------------------------------------------- - */ - -h1, -h2, -h3, -h4, -h5, -h6 { - clear: both; - font-family: Bitter, Georgia, serif; - line-height: 1.3; -} - -h1 { - font-size: 48px; - margin: 33px 0; -} - -h2 { - font-size: 30px; - margin: 25px 0; -} - -h3 { - font-size: 22px; - margin: 22px 0; -} - -h4 { - font-size: 20px; - margin: 25px 0; -} - -h5 { - font-size: 18px; - margin: 30px 0; -} - -h6 { - font-size: 16px; - margin: 36px 0; -} - -hr { - background: url(../images/dotted-line.png) repeat center top; - background-size: 4px 4px; - border: 0; - height: 1px; - margin: 0 0 24px; -} - - -/** - * 3.0 Text Elements - * ---------------------------------------------------------------------------- - */ - -p { - margin: 0 0 24px; -} - -ol, -ul { - margin: 16px 0; - padding: 0 0 0 40px; -} - -ul { - list-style-type: square; -} - -ol { - list-style: decimal outside; -} - -li > ul, -li > ol { - margin: 0; -} - -dl { - margin: 0 20px; -} - -dt { - font-weight: bold; -} - -dd { - margin: 0 0 20px; -} - -strong { - font-weight: bold; -} - -code, -kbd, -pre, -samp { - font-family: monospace, serif; - font-size: 14px; -} - -pre { - background: #f5f5f5; - color: #666; - font-family: monospace; - font-size: 14px; - margin: 20px 0; - overflow: auto; - padding: 20px; - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -blockquote, -q { - quotes: none; -} - -blockquote:before, -blockquote:after, -q:before, -q:after { - content: ""; - content: none; -} - -blockquote { - font-size: 24px; - font-style: italic; - font-weight: 300; - margin: 24px 40px; -} - -blockquote blockquote { - margin-right: 0; -} - -blockquote cite, -blockquote small { - font-size: 14px; - font-weight: normal; - text-transform: uppercase; -} - -cite { - border-bottom: 0; -} - -abbr[title] { - border-bottom: 1px dotted; -} - -address { - font-style: italic; - margin: 0 0 24px; -} - -del { - color: #333; -} - -ins { - background: #fff9c0; - border: none; - color: #333; - text-decoration: none; -} - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - - -/** - * 4.0 Links - * ---------------------------------------------------------------------------- - */ - -a { - color: #ca3c08; - text-decoration: none; -} - -a:visited { - color: #ac0404; -} - -a:focus { - outline: thin dotted; -} - -a:active, -a:hover { - color: #ea9629; - outline: 0; -} - -a:hover { - text-decoration: underline; -} - - -/** - * 5.0 Alignment - * ---------------------------------------------------------------------------- - */ - -.alignleft { - float: left; - margin: 5px 20px 5px 0; -} - -.alignright { - float: right; - margin: 5px 0 5px 20px; -} - -.aligncenter { - display: block; - margin: 5px auto; -} - -img.alignnone { - margin: 5px 0; -} - - -/** - * 6.0 Tables - * ---------------------------------------------------------------------------- - */ - -table { - border-bottom: 1px solid #ededed; - border-collapse: collapse; - border-spacing: 0; - font-size: 14px; - line-height: 2; - margin: 0 0 20px; - width: 100%; -} - -caption, -th, -td { - font-weight: normal; - text-align: left; -} - -caption { - font-size: 16px; - margin: 20px 0; -} - -th { - font-weight: bold; - text-transform: uppercase; -} - -td { - border-top: 1px solid #ededed; - padding: 6px 10px 6px 0; -} - - -/** - * 7.0 Images - * ---------------------------------------------------------------------------- - */ - -img { - height: auto; - max-width: 100%; - vertical-align: middle; -} - -.wp-caption { - background: transparent; - border: none; - margin: 0; - padding: 0; - text-align: left; -} - -.html5-captions .wp-caption { - padding: 0; -} - -.wp-caption.alignleft { - margin: 5px 10px 5px 0; -} - -.html5-captions .wp-caption.alignleft { - margin-right: 20px; -} - -.wp-caption.alignright { - margin: 5px 0 5px 10px; -} - -.wp-caption.alignright img, -.wp-caption.alignright .wp-caption-dd { - padding-left: 10px; -} - -.html5-captions .wp-caption.alignright { - margin-left: 20px; -} - -.html5-captions .wp-caption.alignright img, -.html5-captions .wp-caption.alignright .wp-caption-dd { - padding: 0; -} - -.wp-caption-dt { - margin: 0; -} - -.wp-caption .wp-caption-text, -.wp-caption-dd { - color: #220e10; - font-size: 18px; - font-style: italic; - font-weight: 300; - line-height: 1.5; - margin-bottom: 24px; - padding: 0; -} - -.mceTemp + ul, -.mceTemp + ol { - list-style-position: inside; -} - - -/** - * 8.0 Galleries - * ---------------------------------------------------------------------------- - */ - -.gallery .gallery-item { - float: left; - margin: 0 4px 4px 0; - overflow: hidden; - padding: 0; - position: relative; -} - -.gallery-columns-1 .gallery-item { - max-width: 100%; - width: auto; -} - -.gallery-columns-2 .gallery-item { - max-width: 48%; - max-width: -webkit-calc(50% - 14px); - max-width: calc(50% - 14px); - width: auto; -} - -.gallery-columns-3 .gallery-item { - max-width: 32%; - max-width: -webkit-calc(33.3% - 11px); - max-width: calc(33.3% - 11px); - width: auto; -} - -.gallery-columns-4 .gallery-item { - max-width: 23%; - max-width: -webkit-calc(25% - 9px); - max-width: calc(25% - 9px); - width: auto; -} - -.gallery-columns-5 .gallery-item { - max-width: 19%; - max-width: -webkit-calc(20% - 8px); - max-width: calc(20% - 8px); - width: auto; -} - -.gallery-columns-6 .gallery-item { - max-width: 15%; - max-width: -webkit-calc(16.7% - 7px); - max-width: calc(16.7% - 7px); - width: auto; -} - -.gallery-columns-7 .gallery-item { - max-width: 13%; - max-width: -webkit-calc(14.28% - 7px); - max-width: calc(14.28% - 7px); - width: auto; -} - -.gallery-columns-8 .gallery-item { - max-width: 11%; - max-width: -webkit-calc(12.5% - 6px); - max-width: calc(12.5% - 6px); - width: auto; -} - -.gallery-columns-9 .gallery-item { - max-width: 9%; - max-width: -webkit-calc(11.1% - 6px); - max-width: calc(11.1% - 6px); - width: auto; -} - -.gallery-columns-1 .gallery-item:nth-of-type(1n), -.gallery-columns-2 .gallery-item:nth-of-type(2n), -.gallery-columns-3 .gallery-item:nth-of-type(3n), -.gallery-columns-4 .gallery-item:nth-of-type(4n), -.gallery-columns-5 .gallery-item:nth-of-type(5n), -.gallery-columns-6 .gallery-item:nth-of-type(6n), -.gallery-columns-7 .gallery-item:nth-of-type(7n), -.gallery-columns-8 .gallery-item:nth-of-type(8n), -.gallery-columns-9 .gallery-item:nth-of-type(9n) { - margin-right: 0; -} - -.gallery-columns-1 .gallery-item:nth-of-type(1n), -.gallery-columns-2 .gallery-item:nth-of-type(2n - 1), -.gallery-columns-3 .gallery-item:nth-of-type(3n - 2), -.gallery-columns-4 .gallery-item:nth-of-type(4n - 3), -.gallery-columns-5 .gallery-item:nth-of-type(5n - 4), -.gallery-columns-6 .gallery-item:nth-of-type(6n - 5), -.gallery-columns-7 .gallery-item:nth-of-type(7n - 6), -.gallery-columns-8 .gallery-item:nth-of-type(8n - 7), -.gallery-columns-9 .gallery-item:nth-of-type(9n - 8) { - margin-left: 12px; /* Compensate for the default negative margin on .gallery, which can't be changed. */ -} - -.gallery .gallery-caption { - background-color: rgba(0, 0, 0, 0.7); - box-sizing: border-box; - color: #fff; - font-size: 14px; - line-height: 1.3; - margin: 0; - max-height: 50%; - opacity: 0; - padding: 2px 8px; - position: absolute; - bottom: 0; - left: 0; - text-align: left; - -webkit-transition: opacity 400ms ease; - transition: opacity 400ms ease; - width: 100%; -} - -.gallery .gallery-caption:before { - box-shadow: 0 -10px 15px #000 inset; - content: ""; - height: 100%; - min-height: 49px; - position: absolute; - left: 0; - top: 0; - width: 100%; -} - -.gallery-item:hover .gallery-caption { - opacity: 1; -} - -.gallery-columns-7 .gallery-caption, -.gallery-columns-8 .gallery-caption, -.gallery-columns-9 .gallery-caption { - display: none; -} - - -/** - * 9.0 Audio/Video - * ---------------------------------------------------------------------------- - */ -.mejs-mediaelement, -.mejs-container .mejs-controls { - background: #220e10; -} - -.mejs-controls .mejs-time-rail .mejs-time-loaded, -.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current { - background: #fff; -} - -.mejs-controls .mejs-time-rail .mejs-time-current { - background: #ea9629; -} - -.mejs-controls .mejs-time-rail .mejs-time-total, -.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total { - background: #595959; -} - -.mejs-controls .mejs-time-rail span, -.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total, -.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current { - border-radius: 0; -} - - -/** - * 10.0 Post Formats - * ---------------------------------------------------------------------------- - */ - -/* Aside */ -.post-format-aside { - background-color: #f7f5e7; -} - -.post-format-aside blockquote { - font-size: 100%; - font-weight: normal; -} - -.post-format-aside cite { - font-size: 100%; - text-transform: none; -} - -.post-format-aside cite:before { - content: "\2014"; - margin-right: 5px; -} - -/* Audio */ -.post-format-audio { - background-color: #db572f; -} - -.post-format-audio a { - color: #fbfaf3; -} - -.post-format-audio:before { - background: url(../images/dotted-line.png) repeat-y 85px 0; - background-size: 4px 4px; - content: "\f109"; - display: block; - float: left; - font-family: Genericons; - font-size: 64px; - -webkit-font-smoothing: antialiased; - height: 100%; - line-height: 1; - width: 120px; -} - -/* Chat */ -.post-format-chat { - background-color: #eadaa6; -} - -.post-format-chat a { - color: #722d19; -} - -/* Gallery */ -.post-format-gallery { - background-color: #fbca3c; -} - -.post-format-gallery a { - color: #722d19; -} - -/* Image: same as Standard/Defaults */ - -/* Link */ -.post-format-link { - background-color: #f7f5e7; -} - -/* Quote */ -.post-format-quote { - background-color: #210d10; - color: #f7f5e7; -} - -.post-format-quote a { - color: #e63f2a; -} - -.post-format-quote blockquote { - font-size: 28px; - font-style: italic; - font-weight: 300; - margin: 0; - padding-left: 75px; - position: relative; -} - -.post-format-quote blockquote:before { - content: '\201C'; - font-size: 140px; - font-weight: 400; - line-height: .8; - padding-right: 25px; - position: absolute; - left: -15px; - top: -3px; -} - -.post-format-quote blockquote small, -.post-format-quote blockquote cite { - display: block; - font-size: 16px; -} - -.format-quote .entry-content cite a { - border-bottom: 1px dotted #fff; - color: #fff; -} - -.format-quote .entry-content cite a:hover { - text-decoration: none; -} - - -/* Status */ -.post-format-status { - background-color: #722d19; - color: #f7f5e7; - font-style: italic; - font-weight: 300; - padding: 0; - padding-left: 35px; -} - -.post-format-status.mceContentBody { - font-size: 24px; -} - -.post-format-status:before { - background: url(../images/dotted-line.png) repeat-y left bottom; - background-size: 4px 4px; - content: ""; - display: block; - float: left; - height: 100%; - position: relative; - left: -30px; - width: 1px; -} - -.post-format-status > p:first-child:before { - background-color: rgba(0, 0, 0, 0.65); - content: ""; - height: 3px; - width: 13px; - margin-top: 13px; - position: absolute; - left: 9px; -} - -.post-format-status a { - color: #eadaa6; -} - -/* Video */ -.post-format-video { - background-color: #db572f; -} - -.post-format-video a { - color: #fbfaf3; -} - - -/** - * 11.0 RTL - * ---------------------------------------------------------------------------- - */ - -html .mceContentBody.rtl { - direction: rtl; - unicode-bidi: embed; -} - -.rtl ol, -.rtl ul { - padding: 0 40px 0 0; -} - -.rtl .wp-caption, -.rtl tr th { - text-align: right; -} - -.rtl td { - padding: 6px 0 6px 10px; - text-align: right; -} - -.rtl blockquote blockquote { - margin-left: 0; - margin-right: 24px; -} - -.rtl.post-format-audio:before, -.rtl.post-format-status:before, -.rtl.post-format-status > p:first-child:before { - background: none; - content: none; -} diff --git a/wp/wp-content/themes/twentythirteen/css/ie.css b/wp/wp-content/themes/twentythirteen/css/ie.css deleted file mode 100644 index da48acd3..00000000 --- a/wp/wp-content/themes/twentythirteen/css/ie.css +++ /dev/null @@ -1,288 +0,0 @@ -/* -Styles for older IE versions (previous to IE9). -*/ - - - -.genericon:before:hover, -.menu-toggle:after:hover, -.date a:before:hover, -.entry-meta .author a:before:hover, -.format-audio .entry-content:before:hover, -.comments-link a:before:hover, -.tags-links a:first-child:before:hover, -.categories-links a:first-child:before:hover, -.edit-link > a:before:hover, -.attachment-meta:before:hover, -.attachment-meta a:before:hover, -.comment-awaiting-moderation:before:hover, -.comment-reply-link:before:hover, -.comment-reply-title small a:before:hover, -.bypostauthor > .comment-body .fn:before:hover { - text-decoration: none; -} - -.nav-menu .sub-menu ul, -.nav-menu .children ul { - left: 100%; -} - -.site-header .home-link { - max-width: 1040px; -} - -.site-header .search-form [type="search"], -.site-header .search-form [type="text"] { - padding-top: 6px; -} - -img.alignright { - margin-right: 0; -} - -img.alignleft { - margin-left: 0; -} - -.site-main .sidebar-inner { - width: 1040px; -} - -.site-main .widget-area { - margin-right: 60px; -} - -.format-image .entry-content .size-full { - margin: 0; - max-width: 604px; -} - -.gallery-columns-1 .gallery-item, -.gallery-columns-2 .gallery-item, -.gallery-columns-3 .gallery-item { - max-width: none; -} - -.gallery img { - width: auto; -} - -.gallery-caption { - background: #000; - filter: alpha(opacity=0); -} - -.gallery-item:hover .gallery-caption { - filter: alpha(opacity=70); -} - -.comment { - clear: both; -} - -.comment-meta, -.comment-content, -.comment-list .reply { - width: 480px; -} - -.depth-2 .comment-meta, -.depth-2 .comment-content, -.comment-list .depth-2 .reply { - width: 460px; -} - -.depth-3 .comment-meta, -.depth-3 .comment-content, -.comment-list .depth-3 .reply { - width: 440px; -} - -.depth-4 .comment-meta, -.depth-4 .comment-content, -.comment-list .depth-4 .reply { - width: 420px; -} - -.depth-5 .comment-meta, -.depth-5 .comment-content, -.comment-list .depth-5 .reply { - width: 400px; -} - -.comment-meta { - margin-bottom: 0; -} - -.widget { - background: #f7f5e7; -} - -.site-footer .widget { - background: none; -} - -/* Internet Explorer 8 */ -.ie8 .site { - border: 0; -} - -.ie8 img.size-full, -.ie8 img.size-large { - height: auto; - width: auto; -} - -.ie8 .sidebar .entry-header, -.ie8 .sidebar .entry-content, -.ie8 .sidebar .entry-summary, -.ie8 .sidebar .entry-meta { - max-width: 724px; -} - -.ie8 .author-info { - margin-left: 0; -} - -.ie8 .paging-navigation .nav-previous .meta-nav { - padding: 5px 0 8px; - width: 40px; -} - -.ie8 .paging-navigation .nav-next { - line-height: 1; -} - -.ie8 .format-status .entry-content:before, -.ie8 .format-status .entry-meta:before { - content: none; -} - -.ie8 .site-main .widget-area { - margin-right: 0; -} - -/* Internet Explorer 7 */ -.ie7 audio, -.ie7 canvas, -.ie7 video { - display: inline; - zoom: 1; -} - -.ie7 legend { - margin-left: -7px; -} - -.ie7 button, -.ie7 input, -.ie7 select, -.ie7 textarea { - vertical-align: middle; -} - -.ie7 button, -.ie7 input[type="button"], -.ie7 input[type="reset"], -.ie7 input[type="submit"] { - overflow: visible; -} - -.ie7 input[type="checkbox"], -.ie7 input[type="radio"] { - height: 13px; - width: 13px; -} - -.ie7 .screen-reader-text { - clip: rect(1px 1px 1px 1px); -} - -.ie7 .site-header { - position: relative; - z-index: 1; -} - -.ie7 .main-navigation { - max-width: 930px; - padding-right: 150px; -} - -.ie7 .nav-menu li a, -.ie7 .nav-menu li { - display: block; - float: left; -} - -.ie7 .nav-menu ul { - top: 40px; -} - -.ie7 .nav-menu .sub-menu, -.ie7 .nav-menu .children { - display: none; - overflow: visible; -} - -.ie7 ul.nav-menu li:hover > ul, -.ie7 .nav-menu ul li:hover > ul { - display: block; -} - -.ie7 .site-header .search-form [type="search"], -.ie7 .site-header .search-form [type="text"] { - background-color: #fff; - border: 2px solid #c3c0ab; - cursor: text; - height: 28px; - outline: 0; - width: 150px; -} - -.ie7 .entry-header, -.ie7 .entry-content, -.ie7 .entry-summary, -.ie7 .entry-meta { - width: 604px; -} - -.ie7 .format-status .entry-content, -.ie7 .format-status .entry-meta { - padding-left: 60px; -} - -.ie7 .sidebar .format-status .entry-content, -.ie7 .sidebar .format-status .entry-meta { - padding-left: 60px; -} - -.ie7 .sidebar .post-navigation .nav-links, -.ie7 .sidebar .paging-navigation .nav-links { - width: 604px; -} - -.ie7 .paging-navigation .meta-nav { - padding: 0 0 10px; - vertical-align: middle; - width: 40px; -} - -.ie7 .comments-title, -.ie7 .comment-list, -.ie7 .comment-reply-title, -.ie7 .comment-respond .comment-form { - width: 604px; -} - -.ie7 .site-footer .widget-area { - max-width: none; - left: auto; -} - -/* RTL for Internet Explorer 7 & 8 */ -.rtl .format-audio .entry-content:before, -.rtl .comment-reply-link:before, -.rtl .comment-reply-login:before { - -ms-filter: "FlipH"; - filter: FlipH; -} diff --git a/wp/wp-content/themes/twentythirteen/footer.php b/wp/wp-content/themes/twentythirteen/footer.php deleted file mode 100644 index 40fbc34b..00000000 --- a/wp/wp-content/themes/twentythirteen/footer.php +++ /dev/null @@ -1,26 +0,0 @@ - - - -
      - - -
      - - -
      -
      - - - - - \ No newline at end of file diff --git a/wp/wp-content/themes/twentythirteen/functions.php b/wp/wp-content/themes/twentythirteen/functions.php deleted file mode 100644 index d1f7d5b4..00000000 --- a/wp/wp-content/themes/twentythirteen/functions.php +++ /dev/null @@ -1,617 +0,0 @@ - for posts and comments. - add_theme_support( 'automatic-feed-links' ); - - /* - * Switches default core markup for search form, comment form, - * and comments to output valid HTML5. - */ - add_theme_support( 'html5', array( - 'search-form', 'comment-form', 'comment-list', 'gallery', 'caption' - ) ); - - /* - * This theme supports all available post formats by default. - * See https://codex.wordpress.org/Post_Formats - */ - add_theme_support( 'post-formats', array( - 'aside', 'audio', 'chat', 'gallery', 'image', 'link', 'quote', 'status', 'video' - ) ); - - // This theme uses wp_nav_menu() in one location. - register_nav_menu( 'primary', __( 'Navigation Menu', 'twentythirteen' ) ); - - /* - * This theme uses a custom image size for featured images, displayed on - * "standard" posts and pages. - */ - add_theme_support( 'post-thumbnails' ); - set_post_thumbnail_size( 604, 270, true ); - - // This theme uses its own gallery styles. - add_filter( 'use_default_gallery_style', '__return_false' ); - - // Indicate widget sidebars can use selective refresh in the Customizer. - add_theme_support( 'customize-selective-refresh-widgets' ); -} -add_action( 'after_setup_theme', 'twentythirteen_setup' ); - -/** - * Return the Google font stylesheet URL, if available. - * - * The use of Source Sans Pro and Bitter by default is localized. For languages - * that use characters not supported by the font, the font can be disabled. - * - * @since Twenty Thirteen 1.0 - * - * @return string Font stylesheet or empty string if disabled. - */ -function twentythirteen_fonts_url() { - $fonts_url = ''; - - /* Translators: If there are characters in your language that are not - * supported by Source Sans Pro, translate this to 'off'. Do not translate - * into your own language. - */ - $source_sans_pro = _x( 'on', 'Source Sans Pro font: on or off', 'twentythirteen' ); - - /* Translators: If there are characters in your language that are not - * supported by Bitter, translate this to 'off'. Do not translate into your - * own language. - */ - $bitter = _x( 'on', 'Bitter font: on or off', 'twentythirteen' ); - - if ( 'off' !== $source_sans_pro || 'off' !== $bitter ) { - $font_families = array(); - - if ( 'off' !== $source_sans_pro ) - $font_families[] = 'Source Sans Pro:300,400,700,300italic,400italic,700italic'; - - if ( 'off' !== $bitter ) - $font_families[] = 'Bitter:400,700'; - - $query_args = array( - 'family' => urlencode( implode( '|', $font_families ) ), - 'subset' => urlencode( 'latin,latin-ext' ), - ); - $fonts_url = add_query_arg( $query_args, 'https://fonts.googleapis.com/css' ); - } - - return $fonts_url; -} - -/** - * Enqueue scripts and styles for the front end. - * - * @since Twenty Thirteen 1.0 - */ -function twentythirteen_scripts_styles() { - /* - * Adds JavaScript to pages with the comment form to support - * sites with threaded comments (when in use). - */ - if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) - wp_enqueue_script( 'comment-reply' ); - - // Adds Masonry to handle vertical alignment of footer widgets. - if ( is_active_sidebar( 'sidebar-1' ) ) - wp_enqueue_script( 'jquery-masonry' ); - - // Loads JavaScript file with functionality specific to Twenty Thirteen. - wp_enqueue_script( 'twentythirteen-script', get_template_directory_uri() . '/js/functions.js', array( 'jquery' ), '20160717', true ); - - // Add Source Sans Pro and Bitter fonts, used in the main stylesheet. - wp_enqueue_style( 'twentythirteen-fonts', twentythirteen_fonts_url(), array(), null ); - - // Add Genericons font, used in the main stylesheet. - wp_enqueue_style( 'genericons', get_template_directory_uri() . '/genericons/genericons.css', array(), '3.03' ); - - // Loads our main stylesheet. - wp_enqueue_style( 'twentythirteen-style', get_stylesheet_uri(), array(), '2013-07-18' ); - - // Loads the Internet Explorer specific stylesheet. - wp_enqueue_style( 'twentythirteen-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentythirteen-style' ), '2013-07-18' ); - wp_style_add_data( 'twentythirteen-ie', 'conditional', 'lt IE 9' ); -} -add_action( 'wp_enqueue_scripts', 'twentythirteen_scripts_styles' ); - -/** - * Add preconnect for Google Fonts. - * - * @since Twenty Thirteen 2.1 - * - * @param array $urls URLs to print for resource hints. - * @param string $relation_type The relation type the URLs are printed. - * @return array URLs to print for resource hints. - */ -function twentythirteen_resource_hints( $urls, $relation_type ) { - if ( wp_style_is( 'twentythirteen-fonts', 'queue' ) && 'preconnect' === $relation_type ) { - if ( version_compare( $GLOBALS['wp_version'], '4.7-alpha', '>=' ) ) { - $urls[] = array( - 'href' => 'https://fonts.gstatic.com', - 'crossorigin', - ); - } else { - $urls[] = 'https://fonts.gstatic.com'; - } - } - - return $urls; -} -add_filter( 'wp_resource_hints', 'twentythirteen_resource_hints', 10, 2 ); - -/** - * Filter the page title. - * - * Creates a nicely formatted and more specific title element text for output - * in head of document, based on current view. - * - * @since Twenty Thirteen 1.0 - * - * @param string $title Default title text for current view. - * @param string $sep Optional separator. - * @return string The filtered title. - */ -function twentythirteen_wp_title( $title, $sep ) { - global $paged, $page; - - if ( is_feed() ) - return $title; - - // Add the site name. - $title .= get_bloginfo( 'name', 'display' ); - - // Add the site description for the home/front page. - $site_description = get_bloginfo( 'description', 'display' ); - if ( $site_description && ( is_home() || is_front_page() ) ) - $title = "$title $sep $site_description"; - - // Add a page number if necessary. - if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) - $title = "$title $sep " . sprintf( __( 'Page %s', 'twentythirteen' ), max( $paged, $page ) ); - - return $title; -} -add_filter( 'wp_title', 'twentythirteen_wp_title', 10, 2 ); - -/** - * Register two widget areas. - * - * @since Twenty Thirteen 1.0 - */ -function twentythirteen_widgets_init() { - register_sidebar( array( - 'name' => __( 'Main Widget Area', 'twentythirteen' ), - 'id' => 'sidebar-1', - 'description' => __( 'Appears in the footer section of the site.', 'twentythirteen' ), - 'before_widget' => '', - 'before_title' => '

      ', - 'after_title' => '

      ', - ) ); - - register_sidebar( array( - 'name' => __( 'Secondary Widget Area', 'twentythirteen' ), - 'id' => 'sidebar-2', - 'description' => __( 'Appears on posts and pages in the sidebar.', 'twentythirteen' ), - 'before_widget' => '', - 'before_title' => '

      ', - 'after_title' => '

      ', - ) ); -} -add_action( 'widgets_init', 'twentythirteen_widgets_init' ); - -if ( ! function_exists( 'twentythirteen_paging_nav' ) ) : -/** - * Display navigation to next/previous set of posts when applicable. - * - * @since Twenty Thirteen 1.0 - */ -function twentythirteen_paging_nav() { - global $wp_query; - - // Don't print empty markup if there's only one page. - if ( $wp_query->max_num_pages < 2 ) - return; - ?> - - post_parent ) : get_adjacent_post( false, '', true ); - $next = get_adjacent_post( false, '', false ); - - if ( ! $next && ! $previous ) - return; - ?> - - ' . esc_html__( 'Sticky', 'twentythirteen' ) . ''; - - if ( ! has_post_format( 'link' ) && 'post' == get_post_type() ) - twentythirteen_entry_date(); - - // Translators: used between list items, there is a space after the comma. - $categories_list = get_the_category_list( __( ', ', 'twentythirteen' ) ); - if ( $categories_list ) { - echo '' . $categories_list . ''; - } - - // Translators: used between list items, there is a space after the comma. - $tag_list = get_the_tag_list( '', __( ', ', 'twentythirteen' ) ); - if ( $tag_list ) { - echo '' . $tag_list . ''; - } - - // Post author - if ( 'post' == get_post_type() ) { - printf( '', - esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ), - esc_attr( sprintf( __( 'View all posts by %s', 'twentythirteen' ), get_the_author() ) ), - get_the_author() - ); - } -} -endif; - -if ( ! function_exists( 'twentythirteen_entry_date' ) ) : -/** - * Print HTML with date information for current post. - * - * Create your own twentythirteen_entry_date() to override in a child theme. - * - * @since Twenty Thirteen 1.0 - * - * @param boolean $echo (optional) Whether to echo the date. Default true. - * @return string The HTML-formatted post date. - */ -function twentythirteen_entry_date( $echo = true ) { - if ( has_post_format( array( 'chat', 'status' ) ) ) - $format_prefix = _x( '%1$s on %2$s', '1: post format name. 2: date', 'twentythirteen' ); - else - $format_prefix = '%2$s'; - - $date = sprintf( '', - esc_url( get_permalink() ), - esc_attr( sprintf( __( 'Permalink to %s', 'twentythirteen' ), the_title_attribute( 'echo=0' ) ) ), - esc_attr( get_the_date( 'c' ) ), - esc_html( sprintf( $format_prefix, get_post_format_string( get_post_format() ), get_the_date() ) ) - ); - - if ( $echo ) - echo $date; - - return $date; -} -endif; - -if ( ! function_exists( 'twentythirteen_the_attached_image' ) ) : -/** - * Print the attached image with a link to the next attached image. - * - * @since Twenty Thirteen 1.0 - */ -function twentythirteen_the_attached_image() { - /** - * Filter the image attachment size to use. - * - * @since Twenty thirteen 1.0 - * - * @param array $size { - * @type int The attachment height in pixels. - * @type int The attachment width in pixels. - * } - */ - $attachment_size = apply_filters( 'twentythirteen_attachment_size', array( 724, 724 ) ); - $next_attachment_url = wp_get_attachment_url(); - $post = get_post(); - - /* - * Grab the IDs of all the image attachments in a gallery so we can get the URL - * of the next adjacent image in a gallery, or the first image (if we're - * looking at the last image in a gallery), or, in a gallery of one, just the - * link to that image file. - */ - $attachment_ids = get_posts( array( - 'post_parent' => $post->post_parent, - 'fields' => 'ids', - 'numberposts' => -1, - 'post_status' => 'inherit', - 'post_type' => 'attachment', - 'post_mime_type' => 'image', - 'order' => 'ASC', - 'orderby' => 'menu_order ID', - ) ); - - // If there is more than 1 attachment in a gallery... - if ( count( $attachment_ids ) > 1 ) { - foreach ( $attachment_ids as $idx => $attachment_id ) { - if ( $attachment_id == $post->ID ) { - $next_id = $attachment_ids[ ( $idx + 1 ) % count( $attachment_ids ) ]; - break; - } - } - - // get the URL of the next image attachment... - if ( $next_id ) - $next_attachment_url = get_attachment_link( $next_id ); - - // or get the URL of the first image attachment. - else - $next_attachment_url = get_attachment_link( reset( $attachment_ids ) ); - } - - printf( '%3$s', - esc_url( $next_attachment_url ), - the_title_attribute( array( 'echo' => false ) ), - wp_get_attachment_image( $post->ID, $attachment_size ) - ); -} -endif; - -/** - * Return the post URL. - * - * @uses get_url_in_content() to get the URL in the post meta (if it exists) or - * the first link found in the post content. - * - * Falls back to the post permalink if no URL is found in the post. - * - * @since Twenty Thirteen 1.0 - * - * @return string The Link format URL. - */ -function twentythirteen_get_link_url() { - $content = get_the_content(); - $has_url = get_url_in_content( $content ); - - return ( $has_url ) ? $has_url : apply_filters( 'the_permalink', get_permalink() ); -} - -if ( ! function_exists( 'twentythirteen_excerpt_more' ) && ! is_admin() ) : -/** - * Replaces "[...]" (appended to automatically generated excerpts) with ... - * and a Continue reading link. - * - * @since Twenty Thirteen 1.4 - * - * @param string $more Default Read More excerpt link. - * @return string Filtered Read More excerpt link. - */ -function twentythirteen_excerpt_more( $more ) { - $link = sprintf( '%2$s', - esc_url( get_permalink( get_the_ID() ) ), - /* translators: %s: Name of current post */ - sprintf( __( 'Continue reading %s →', 'twentythirteen' ), '' . get_the_title( get_the_ID() ) . '' ) - ); - return ' … ' . $link; -} -add_filter( 'excerpt_more', 'twentythirteen_excerpt_more' ); -endif; - -/** - * Extend the default WordPress body classes. - * - * Adds body classes to denote: - * 1. Single or multiple authors. - * 2. Active widgets in the sidebar to change the layout and spacing. - * 3. When avatars are disabled in discussion settings. - * - * @since Twenty Thirteen 1.0 - * - * @param array $classes A list of existing body class values. - * @return array The filtered body class list. - */ -function twentythirteen_body_class( $classes ) { - if ( ! is_multi_author() ) - $classes[] = 'single-author'; - - if ( is_active_sidebar( 'sidebar-2' ) && ! is_attachment() && ! is_404() ) - $classes[] = 'sidebar'; - - if ( ! get_option( 'show_avatars' ) ) - $classes[] = 'no-avatars'; - - return $classes; -} -add_filter( 'body_class', 'twentythirteen_body_class' ); - -/** - * Adjust content_width value for video post formats and attachment templates. - * - * @since Twenty Thirteen 1.0 - */ -function twentythirteen_content_width() { - global $content_width; - - if ( is_attachment() ) - $content_width = 724; - elseif ( has_post_format( 'audio' ) ) - $content_width = 484; -} -add_action( 'template_redirect', 'twentythirteen_content_width' ); - -/** - * Add postMessage support for site title and description for the Customizer. - * - * @since Twenty Thirteen 1.0 - * - * @param WP_Customize_Manager $wp_customize Customizer object. - */ -function twentythirteen_customize_register( $wp_customize ) { - $wp_customize->get_setting( 'blogname' )->transport = 'postMessage'; - $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage'; - $wp_customize->get_setting( 'header_textcolor' )->transport = 'postMessage'; - - if ( isset( $wp_customize->selective_refresh ) ) { - $wp_customize->selective_refresh->add_partial( 'blogname', array( - 'selector' => '.site-title', - 'container_inclusive' => false, - 'render_callback' => 'twentythirteen_customize_partial_blogname', - ) ); - $wp_customize->selective_refresh->add_partial( 'blogdescription', array( - 'selector' => '.site-description', - 'container_inclusive' => false, - 'render_callback' => 'twentythirteen_customize_partial_blogdescription', - ) ); - } -} -add_action( 'customize_register', 'twentythirteen_customize_register' ); - -/** - * Render the site title for the selective refresh partial. - * - * @since Twenty Thirteen 1.9 - * @see twentythirteen_customize_register() - * - * @return void - */ -function twentythirteen_customize_partial_blogname() { - bloginfo( 'name' ); -} - -/** - * Render the site tagline for the selective refresh partial. - * - * @since Twenty Thirteen 1.9 - * @see twentythirteen_customize_register() - * - * @return void - */ -function twentythirteen_customize_partial_blogdescription() { - bloginfo( 'description' ); -} - -/** - * Enqueue Javascript postMessage handlers for the Customizer. - * - * Binds JavaScript handlers to make the Customizer preview - * reload changes asynchronously. - * - * @since Twenty Thirteen 1.0 - */ -function twentythirteen_customize_preview_js() { - wp_enqueue_script( 'twentythirteen-customizer', get_template_directory_uri() . '/js/theme-customizer.js', array( 'customize-preview' ), '20141120', true ); -} -add_action( 'customize_preview_init', 'twentythirteen_customize_preview_js' ); diff --git a/wp/wp-content/themes/twentythirteen/genericons/COPYING.txt b/wp/wp-content/themes/twentythirteen/genericons/COPYING.txt deleted file mode 100644 index aece214b..00000000 --- a/wp/wp-content/themes/twentythirteen/genericons/COPYING.txt +++ /dev/null @@ -1,9 +0,0 @@ -Genericons is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - -The fonts are distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. - -This license does not convey any intellectual property rights to third party trademarks that may be included in the icon font; such marks remain subject to all rights and guidelines of use of their owner. \ No newline at end of file diff --git a/wp/wp-content/themes/twentythirteen/genericons/Genericons-Regular.otf b/wp/wp-content/themes/twentythirteen/genericons/Genericons-Regular.otf deleted file mode 100644 index 5cd41e8b81c9fa490d0ed695536226c0dbe69ac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18212 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 - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/wp/wp-content/themes/twentythirteen/genericons/README.txt b/wp/wp-content/themes/twentythirteen/genericons/README.txt deleted file mode 100644 index 7a0a92e5..00000000 --- a/wp/wp-content/themes/twentythirteen/genericons/README.txt +++ /dev/null @@ -1,123 +0,0 @@ - ___ ____ __ _ ____ ____ __ ___ __ __ _ ____ - / __)( __)( ( \( __)( _ \( )/ __)/ \ ( ( \/ ___) -( (_ \ ) _) / / ) _) ) / )(( (__( O )/ /\___ \ - \___/(____)\_)__)(____)(__\_)(__)\___)\__/ \_)__)(____/ - - -Genericons are vector icons embedded in a webfont designed to be clean and simple keeping with a generic aesthetic. - -Use genericons for instant HiDPI, to change icon colors on the fly, or even with CSS effects such as drop-shadows or gradients! - - -_ _ ____ ____ ____ ____ -| | [__ |__| | __ |___ -|__| ___] | | |__] |___ - - -To use it, place the font folder in your stylesheet directory and paste this in your CSS file: - -/* =Genericons, thanks to FontSquirrel.com for conversion! --------------------------------------------------------------- */ -@font-face { - font-family: 'Genericons'; - src: url('font/genericons-regular-webfont.eot'); - src: url('font/genericons-regular-webfont.eot?#iefix') format('embedded-opentype'), - url('font/genericons-regular-webfont.woff') format('woff'), - url('font/genericons-regular-webfont.ttf') format('truetype'), - url('font/genericons-regular-webfont.svg#genericonsregular') format('svg'); - font-weight: normal; - font-style: normal; - -} - -Note: the above only works if you don't use a CDN. If you do, or don't know what that is, you should use the syntax that's embedded in genericons.css. - -From then on, you can create an icon like this: - -.my-icon:before { - content: '\f101'; - display: inline-block; - -webkit-font-smoothing: antialiased; - font: normal 16px/1 'Genericons'; - vertical-align: top; -} - -This will output a comment icon before every element with the class "my-icon". The "content: '\f101';" part of this CSS is easily copied from the helper tool at http://genericons.com/ - -You can also use the bundled example.css if you'd rather insert the icons using HTML tags. - - -_ _ ____ ___ ____ ____ -|\ | | | | |___ [__ -| \| |__| | |___ ___] - - -Photoshop mockups: - -Genericons-Regular.otf found in the root directory of this zip has not been web-font-ified. So you can drop it in your system fonts folder and use the font in Photoshop if you like. - -For those of you using Genericons in your Photoshop mockup, remember to delete the old version of the font from Font Book, and grab the new one from the zip file. This also affects using it in your webdesigns: if you have an old version of the font installed locally, that's the font that'll be used in your website as well, so if you're missing icons, check for old versions of the font on your system. - -Pixel grid: - -Note that Genericons has been designed for a 16x16 pixel grid. That means it'll look sharp at font-size: 16px exactly. It'll also be crisp at multiples thereof, such as 32px or 64px. It'll also look reasonably crisp at in-between font sizes such as 24px or 48px, but not quite as crisp as 16 or 32. Please don't set the font-size to 17px, though, that'll just look terrible. - -Also note the CSS property "-webkit-font-smoothing: antialiased". That makes the icons look great in WebKit browsers. Please see http://noscope.com/2012/font-smoothing for more info. - -Updates: - -We don't often update icons, but do very carefully when we get good feedback suggesting improvements. Please be mindful if you upgrade, and check that the updated icons behave as you intended. - - - -____ _ _ ____ _ _ ____ ____ _ ____ ____ -| |__| |__| |\ | | __ |___ | | | | __ -|___ | | | | | \| |__] |___ |___ |__| |__] - -V3.0.3: -Bunch of updates mostly. -- Two new icons, Dropbox and Fullscreen. -- Updates to all icons containing an exclamation mark. -- Updates to Image and Quote. -- Nicer "Share" icon. -- Bigger default Linkedin icon. - -V3.0.2: -A slew of new stuff and updates. -- Social icons: Skype, Digg, Reddit, Stumbleupon, Pocket. -- New generic icons: heart, lock and print. -- New editing icons: code, bold, italic, image -- New interaction icons: subscribe, unsubscribe, subscribed, reply all, reply, flag. -- The hyperlink icon has been updated to be clearer, chunkier. -- The "home" icon has been updated for style, size and clarity. -- The email icon has been updated for style and clarity, and to fit with the new subscribe icons. -- The document icon has been updated for style. -- The "pin" icon has been updated for style and clarity. -- The Twitter icon has been scaled down to fit with the other social icons. - -V3.0.1: -Mostly maintenance. -- Fixed an issue with the example page that showed an old "top" icon instead of the actual NEW "refresh" icon. -- Added inverse Google+ and Path. -- Replaced tabs with spaces in the helper CSS. -- Changed the Genericons.com copy/paste tool to serve span's instead of div's for casual icon insertion. It's being converted to "inline-block" anyway. - -V3.0: -Mainly maintenance and a few new icons. -- Fast forward, rewind, PollDaddy, Notice, Info, Help, Portfolio -- Updated the feed icon. It's a bit smaller now for consistency, the previous one was rather big. -- So, the previous version numbering, 2.09, wasn't very PHP version compare friendly. So from now on it'll be 3.0, 3.1 etc. Props Ipstenu. -- Genericons.com now has a mini release blog. -- The CSS has prettier formatting, props Konstantin Obenland. - -V2.09: -Updated Facebook icon to new version. Updated Instagram logo to use new one-color version. Updated Google+ icon to use same radius as Instagram and Facebook. Added a bunch of new icons, cog, unapprove, cart, media player buttons, tablet, send to tablet. - -V2.06: -Included Base64 encoded version. This is necessary for Genericons to work with CDNs in Firefox. Firefox blocks fonts linked from a different domain. A CDN (typically s.example.com) usually puts the font on a subdomain, and is hence blocked in Firefox. - -V2.05: -Added a bunch of new icons, including upload to cloud, download to cloud, many more. - -V2: -Initial public release \ No newline at end of file diff --git a/wp/wp-content/themes/twentythirteen/genericons/font/genericons-regular-webfont.eot b/wp/wp-content/themes/twentythirteen/genericons/font/genericons-regular-webfont.eot deleted file mode 100644 index 46574695ece5d4a4d2eb5dd29c1b09995d93e214..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14935 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 diff --git a/wp/wp-content/themes/twentythirteen/genericons/font/genericons-regular-webfont.svg b/wp/wp-content/themes/twentythirteen/genericons/font/genericons-regular-webfont.svg deleted file mode 100644 index ef236c10..00000000 --- a/wp/wp-content/themes/twentythirteen/genericons/font/genericons-regular-webfont.svg +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/wp/wp-content/themes/twentythirteen/genericons/font/genericons-regular-webfont.ttf b/wp/wp-content/themes/twentythirteen/genericons/font/genericons-regular-webfont.ttf deleted file mode 100644 index b6f125e7eec0da4df8acaf85c86fc993115a4723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27348 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 Jcw`b|{~sIWCISEe diff --git a/wp/wp-content/themes/twentythirteen/genericons/font/genericons-regular-webfont.woff b/wp/wp-content/themes/twentythirteen/genericons/font/genericons-regular-webfont.woff deleted file mode 100644 index da8be383d82820c6f279d9a2245b3e4303790907..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17224 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�k{_P|1Ev!tIOu)ySyKQ{3k7)MKUDw84%8ig$ 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 diff --git a/wp/wp-content/themes/twentythirteen/genericons/genericons.css b/wp/wp-content/themes/twentythirteen/genericons/genericons.css deleted file mode 100644 index b10b86fc..00000000 --- a/wp/wp-content/themes/twentythirteen/genericons/genericons.css +++ /dev/null @@ -1,197 +0,0 @@ -/** - - Genericons Helper CSS - -*/ - - -/** - * The font was graciously generated by Font Squirrel (http://www.fontsquirrel.com). We love those guys. - */ - -@font-face { - font-family: 'Genericons'; - src: url('font/genericons-regular-webfont.eot'); -} - -@font-face { - font-family: 'Genericons'; - src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'), - url('font/genericons-regular-webfont.ttf') format('truetype'), - url('font/genericons-regular-webfont.svg#genericonsregular') format('svg'); - font-weight: normal; - font-style: normal; -} - - -/** - * All Genericons - */ - -.genericon { - display: inline-block; - width: 16px; - height: 16px; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - font-size: 16px; - line-height: 1; - font-family: 'Genericons'; - text-decoration: inherit; - font-weight: normal; - font-style: normal; - vertical-align: top; -} - -/** - * IE7 and IE6 hacks - */ - -.genericon { - *overflow: auto; - *zoom: 1; - *display: inline; -} - -/** - * Individual icons - */ - -/* Post formats */ -.genericon-standard:before { content: '\f100'; } -.genericon-aside:before { content: '\f101'; } -.genericon-image:before { content: '\f102'; } -.genericon-gallery:before { content: '\f103'; } -.genericon-video:before { content: '\f104'; } -.genericon-status:before { content: '\f105'; } -.genericon-quote:before { content: '\f106'; } -.genericon-link:before { content: '\f107'; } -.genericon-chat:before { content: '\f108'; } -.genericon-audio:before { content: '\f109'; } - -/* Social icons */ -.genericon-github:before { content: '\f200'; } -.genericon-dribbble:before { content: '\f201'; } -.genericon-twitter:before { content: '\f202'; } -.genericon-facebook:before { content: '\f203'; } -.genericon-facebook-alt:before { content: '\f204'; } -.genericon-wordpress:before { content: '\f205'; } -.genericon-googleplus:before { content: '\f206'; } -.genericon-linkedin:before { content: '\f207'; } -.genericon-linkedin-alt:before { content: '\f208'; } -.genericon-pinterest:before { content: '\f209'; } -.genericon-pinterest-alt:before { content: '\f210'; } -.genericon-flickr:before { content: '\f211'; } -.genericon-vimeo:before { content: '\f212'; } -.genericon-youtube:before { content: '\f213'; } -.genericon-tumblr:before { content: '\f214'; } -.genericon-instagram:before { content: '\f215'; } -.genericon-codepen:before { content: '\f216'; } -.genericon-polldaddy:before { content: '\f217'; } -.genericon-googleplus-alt:before { content: '\f218'; } -.genericon-path:before { content: '\f219'; } -.genericon-skype:before { content: '\f220'; } -.genericon-digg:before { content: '\f221'; } -.genericon-reddit:before { content: '\f222'; } -.genericon-stumbleupon:before { content: '\f223'; } -.genericon-pocket:before { content: '\f224'; } -.genericon-dropbox:before { content: '\f225'; } - -/* Meta icons */ -.genericon-comment:before { content: '\f300'; } -.genericon-category:before { content: '\f301'; } -.genericon-tag:before { content: '\f302'; } -.genericon-time:before { content: '\f303'; } -.genericon-user:before { content: '\f304'; } -.genericon-day:before { content: '\f305'; } -.genericon-week:before { content: '\f306'; } -.genericon-month:before { content: '\f307'; } -.genericon-pinned:before { content: '\f308'; } - -/* Other icons */ -.genericon-search:before { content: '\f400'; } -.genericon-unzoom:before { content: '\f401'; } -.genericon-zoom:before { content: '\f402'; } -.genericon-show:before { content: '\f403'; } -.genericon-hide:before { content: '\f404'; } -.genericon-close:before { content: '\f405'; } -.genericon-close-alt:before { content: '\f406'; } -.genericon-trash:before { content: '\f407'; } -.genericon-star:before { content: '\f408'; } -.genericon-home:before { content: '\f409'; } -.genericon-mail:before { content: '\f410'; } -.genericon-edit:before { content: '\f411'; } -.genericon-reply:before { content: '\f412'; } -.genericon-feed:before { content: '\f413'; } -.genericon-warning:before { content: '\f414'; } -.genericon-share:before { content: '\f415'; } -.genericon-attachment:before { content: '\f416'; } -.genericon-location:before { content: '\f417'; } -.genericon-checkmark:before { content: '\f418'; } -.genericon-menu:before { content: '\f419'; } -.genericon-refresh:before { content: '\f420'; } -.genericon-minimize:before { content: '\f421'; } -.genericon-maximize:before { content: '\f422'; } -.genericon-404:before { content: '\f423'; } -.genericon-spam:before { content: '\f424'; } -.genericon-summary:before { content: '\f425'; } -.genericon-cloud:before { content: '\f426'; } -.genericon-key:before { content: '\f427'; } -.genericon-dot:before { content: '\f428'; } -.genericon-next:before { content: '\f429'; } -.genericon-previous:before { content: '\f430'; } -.genericon-expand:before { content: '\f431'; } -.genericon-collapse:before { content: '\f432'; } -.genericon-dropdown:before { content: '\f433'; } -.genericon-dropdown-left:before { content: '\f434'; } -.genericon-top:before { content: '\f435'; } -.genericon-draggable:before { content: '\f436'; } -.genericon-phone:before { content: '\f437'; } -.genericon-send-to-phone:before { content: '\f438'; } -.genericon-plugin:before { content: '\f439'; } -.genericon-cloud-download:before { content: '\f440'; } -.genericon-cloud-upload:before { content: '\f441'; } -.genericon-external:before { content: '\f442'; } -.genericon-document:before { content: '\f443'; } -.genericon-book:before { content: '\f444'; } -.genericon-cog:before { content: '\f445'; } -.genericon-unapprove:before { content: '\f446'; } -.genericon-cart:before { content: '\f447'; } -.genericon-pause:before { content: '\f448'; } -.genericon-stop:before { content: '\f449'; } -.genericon-skip-back:before { content: '\f450'; } -.genericon-skip-ahead:before { content: '\f451'; } -.genericon-play:before { content: '\f452'; } -.genericon-tablet:before { content: '\f453'; } -.genericon-send-to-tablet:before { content: '\f454'; } -.genericon-info:before { content: '\f455'; } -.genericon-notice:before { content: '\f456'; } -.genericon-help:before { content: '\f457'; } -.genericon-fastforward:before { content: '\f458'; } -.genericon-rewind:before { content: '\f459'; } -.genericon-portfolio:before { content: '\f460'; } -.genericon-heart:before { content: '\f461'; } -.genericon-code:before { content: '\f462'; } -.genericon-subscribe:before { content: '\f463'; } -.genericon-unsubscribe:before { content: '\f464'; } -.genericon-subscribed:before { content: '\f465'; } -.genericon-reply-alt:before { content: '\f466'; } -.genericon-reply-single:before { content: '\f467'; } -.genericon-flag:before { content: '\f468'; } -.genericon-print:before { content: '\f469'; } -.genericon-lock:before { content: '\f470'; } -.genericon-bold:before { content: '\f471'; } -.genericon-italic:before { content: '\f472'; } -.genericon-picture:before { content: '\f473'; } -.genericon-fullscreen:before { content: '\f474'; } - -/* Generic shapes */ -.genericon-uparrow:before { content: '\f500'; } -.genericon-rightarrow:before { content: '\f501'; } -.genericon-downarrow:before { content: '\f502'; } -.genericon-leftarrow:before { content: '\f503'; } - - - - - diff --git a/wp/wp-content/themes/twentythirteen/header.php b/wp/wp-content/themes/twentythirteen/header.php deleted file mode 100644 index 094f74cc..00000000 --- a/wp/wp-content/themes/twentythirteen/header.php +++ /dev/null @@ -1,51 +0,0 @@ - section and everything up till

      - * - * @package WordPress - * @subpackage Twenty_Thirteen - * @since Twenty Thirteen 1.0 - */ -?> - - - -> - - - - - <?php wp_title( '|', true, 'right' ); ?> - - - - - - -> -
      - - -
      diff --git a/wp/wp-content/themes/twentythirteen/image.php b/wp/wp-content/themes/twentythirteen/image.php deleted file mode 100644 index c29caedf..00000000 --- a/wp/wp-content/themes/twentythirteen/image.php +++ /dev/null @@ -1,90 +0,0 @@ - - -
      -
      - - - -
      > -
      -

      - - -
      - -
      - - -
      -
      - - - -
      - -
      - -
      -
      - - post_content ) ) : ?> -
      - - '' ) ); ?> -
      - - -
      -
      - - - - - -
      -
      - - diff --git a/wp/wp-content/themes/twentythirteen/images/dotted-line-2x.png b/wp/wp-content/themes/twentythirteen/images/dotted-line-2x.png deleted file mode 100644 index 07f6c93f29ab47b71b6d203a3e5a37ab49642256..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqvYsxEArj%q2?+@iY={2;|DS%K iO_D?FfU4mV5e5daJzJl?Z~Y2V$l&Sf=d#Wzp$Py_6&QX1 diff --git a/wp/wp-content/themes/twentythirteen/images/dotted-line-light-2x.png b/wp/wp-content/themes/twentythirteen/images/dotted-line-light-2x.png deleted file mode 100644 index 059d4ec05171be7a9bab5140ee59814561aea8fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqGM+AuArj%q2?+@s*dG4>|KB*_ iFb|99gGmxWTntTjwpdDa?wtly$KdJe=d#Wzp$Pyq8W(T? diff --git a/wp/wp-content/themes/twentythirteen/images/dotted-line-light.png b/wp/wp-content/themes/twentythirteen/images/dotted-line-light.png deleted file mode 100644 index b7f82cdbfd223a587bdc7bc5e724dd798a7aa911..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80 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 diff --git a/wp/wp-content/themes/twentythirteen/images/headers/diamond-thumbnail.png b/wp/wp-content/themes/twentythirteen/images/headers/diamond-thumbnail.png deleted file mode 100644 index 82777a04cb88ca0439a5ade06381c163fcaa9dad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1847 zcmYLKdsq`!7DtL*p6ddFQm9LXWThs40vWrCpYl)y!T<$?gzz?r84`;PaaF8hA{3)Y zQE)6%utG_+DTI(fKo%5{f;fx~2_~Y5#Rrp>iN!0W>f;91M2& z0m0(O4@TdXt_BBJfO1B|SDS%4e!9B^ARmGKE3G##ft~^|xEGYH1Ya!!=o;|m6_C=v z*&NW34O-%729AL7@4(qqux$xw2nXjS;2Q?$5rFbQ@boq)rGbi7peqF!{sA&wXD*ck zJRh7{54QV(hhspW1-eqf4l3x(?P-t!-r^Sn<$$OFZ3!JG_qW&V1Gp62QNDfoE7(Wd z6J2e!v6&B|H-shc%Iv$wj_V6`{xB!&a_vz6xv81;F0B>zYga0w+wOMu{_XX|H*Zd# zm^vA6op>s^kwv865JzX+^qE@H+41P{zBO65M!yi{XZ?IDQBa5%!um%o3d=NlG}6Q| z3$?rj^loK)Su!@R&8(#F;aZ_?-d$hffQDw~;!9YCaK2Xnnd+u;Ui3r@3-Kt0mEJwM zU_8fbzf&Yc7ci|#pbmW>*DC5;qIiy0m?K?F)+!od(V?WXJ zKhw>rzmGp76}qV`6j_0$tB1S%a0UEJ-nys0_+FoZnjUe(q!pbCWEIrjTMTQaF%v_| zyRfZZVOd)vvO?ah>+vDad$ghMwBwVGcn+3rWvrJspEz!xyUhOL6(q=T^9DLZrFL1o@Sl`nN?iZEhCqYFYGP7WPt3jkmPY#ZBCtiiH3iF=5Xc-pi z$7pq4KgcJ`vXSN=TSwMcRYu}!PH1qX6LH|xPL0G|tSC`l5ziwe3w6EcQruDdTs5X? z9ZqKd1|?mFBCe@dCqp^%e~)jjq&G1<&_be0OgtI(#OvzW8p%~IGlUpG5?Lw+3BH)h z!w>N<7)huL#9KxSL1iFm+Pt1yw39M9L-QiDiath^G`G!s=x zPlbpi?SJ7$k)~MLD<;TGVOr}`9*no_{6ptmp=E!TiL9Lg%%b}*BvI!1dOQ^bSc~%A}Qr5DT+bP?V#5@zBl87IH(TtV_+uh?B&FI ztG6xD`%IE9h@o#f<$y-i@QWi0Iz@rx`1WqujyU08)&;crGzse|Obhz$4m8JkKj&gU@S=jR8X+bt$wNTC zCIOzNv96(uSOA*-|AccyDYZS;Kw9>=2@fT}IuUZE9ZAIPh%_lx(}yi3dy`W2cd;)V z7*dM4Dl#7!8O&1-^s`EiEi71F;=mEZx<|uZR^WH+6nnYR4oyg+DPNuQso-P0bY03B z2ij4ky-9*oMq;&PLh~U=N-->yl6uhh>-JMD)2jL8+Z6iyf?c1urB}rNc9;AKZK5~E KZBU12%l-rXtfLVC diff --git a/wp/wp-content/themes/twentythirteen/images/headers/diamond.png b/wp/wp-content/themes/twentythirteen/images/headers/diamond.png deleted file mode 100644 index a14de6146938dd619f0dbdd8657ab2427f134b55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14266 zcmeHt2~<;Ow>BgpL<9*)6|I^8v5u``t+OU7nzU7`Xq~Gf)TwGe=YiJaK~$*J1gdS- zI#jULsx4ycP(?-soUzU`2#5+ACQ0B7_j%7r0uJrB)_?!I?)~rjzXhwGob&Ge>}NlF zztf2xK1}c7*4)j>$;sn=Lr}1jllw|1C+D*YDgL5vn!eS^Ns={u$f!ZpRSzHBJI5UP zgj*26#dWJT1#$a6Jn~AYxZ~u_b)$wW{c8CH%cGhv_$t}&aJeT z=W)CB+*h60GhcG1_n1@jxV3My-}Neee2e>IV(Fus{Ijd}vtktixd$Gw=E8_;UDWQBsAb%&h_-;0H-dLMH zpU>aHoQsKHHD%YPZLmKN+^7gF}DfJq#ko_vs78^|rvuqQ$-U-jZvwCC@f z;QpoNm$zlV?^SK=`^c#0OYicGb@yByUs1S!{=gq+57<7lU*)AgxK(fSrk?DvDeNX4 z7uBWu_Z94)llRZ<{o5~lD=RA5%{`cd!-~NR;{1NwC&>ve@@YfDho?g%2JjAAb%761Vn>v+eZt`WR{J;FU-v;ve z+xWj0^YdHtbN%_tOZjtiD{|JeC&u%a7V*5|^Hi>LqL@g-w^c=LJ5xy6;0MQJWA`z}j9%5B|OyG!5ct!^8(X}Mk{ zX>3aG@2-EP%T%o^bEPBoY9_Fal2a?o^gVQnNUbG6D`{ZVSwaV^nf~g0PbWVmci$-Y zGAxv(s~Su4JSAR~lY%z8QeC5TNdZdkd!>R>Mp>l7;Q0QsxR$gzD^h1!1rJUG)J&Sn z!{1Z_%WuJe%%5{o!U#7*Nr%DpfsTS}*Of40*2gO}eI$9t*04@TX`P4>?f60JJTC>+ z5e5`NjI$a>nA{E`#QyamPVzD=#lui>aC3<;I!G8CBYK|EKya-TgBD@Ow-Im;lzF!T zY@J}xxJ?M!Q#2?Q4KA;5&|NfG{BI2ow<9!JEe~2z9fQ;|P%=WKQ6@$hq`rXwH;9Zm z*LU4o%!^Y!i24Qs4_+dRVkj@0BYeGVZaEN(=3G~Htlmo#YJ=2iuX&S@_@8&|G{2`L zm)oCw?xf1!WJdBn5UF(%GQCzzw6~y~04E`-enL*;MP?PE#G-WRP*__r0}@e9c5_xv zNf%egY0I4jk%@mk?;>c-;4COq9Nwd;=*Fd1j);7)RxbBLxudOl^*-d%dX`I zv;38wu#=UsWcxLLWm(o6q6CKB`0bl-6q2@XD~s|z?o>q09+T-YX0Y66%)|K-@*8XH2**7*9qAO@- zIE*L}B8hnfNp=n|l|Fi2A0)t8f%65BkQ>4IB1izV;RMFO+*65Dp{H4dRWe?Tamc}= z;~`3ZHwot~>**d=qvfvuwqU~tJ3G7YXnFj->-3a_=p&z|t?m&p?0!)9hsNrwLPHOPspWB2QW`WZN->UGOLc?_f=O)z z*x63!%?QwR`vnWdTGBQ(R#KM|8!;M-CqRl-ZA`UM7|mu7AzgaGWUy#bC{|xe4fIUn zkg zJW&Jf(Dy_)rZ>B{aTo~36hjIoLsvt!XfXs7iRyq0(mn8AC2yG%LHR03i<}BCgfK`X zfy+`gc35v9T8H0KEw}l;J)H)#5C@dijxW0)1FfR+BZN@UrwkV3dv(C?3&7#Wn+qNK z8Yq$c*w?wt(_a1mrj^pV9DtB82iF|$kc0K)img9Pa~>4p^hW;G{pp=@KIoo*Q~vw< zTalx^F46ln!=i%xR&CL#qX)=;erw`gw|+WKDT|X zL!_KtUYmI1=o=1^mf7W%%}~Fec66+0-mdi`{=XY~*d_F?gU80rBlErdMb6|X>PfTb zbm~b~WzrWzTZKZKu&$9%u`fiC{R3smN+KQnC91m=s<;EUNzHDiUnIL37L#wdVs$`f zaoH$GF0&(HDo!+I(fZf%9hM5v=SY`E;i~*LGWK+qFD6fN#V3`jz>QeUhz+W|sH)bP z3C*F+GcTa6TZ}u(Nf*Atm2GF2>(BYeNSxaH25YW2zdU1?IpFGm@f+{UB|AHBx#)7l zb;*6Vef#{U28^}LlKIW@v)qm>9JFtm{3(0l+>Nj6=A0IIo{tivsOzDuc52yXLDV1e!Kbvw!x?)cwf@ z45<*6H%0vbl39)!ajLo}U))bAjixl;7m0#O)t!QfD_ccTnY#I0?w4x0H*W|$Cvrm5 z?z|^o+*ip*(FII=E#??5Hf*yv`AVhDP%XJ%s5vj``&NB5nmQA3W~;tUh0tYvvo9hs z&#|)cHKc3ZfcO)B-jav6bNZ0k!ByVHtYzY>F|$oqml-c%@HMLBY^x|jINa8XZnK*i znE0ib1u9hy(YBGYDe6_67|eViE$(AF_t)374;z|`Z3A@X9+nLvfR_U}58(2+3dFV!Dk{`o1?8BbQgx4!iDYD=CrGYrVL-!a&mUNURXd3} z*v6(1)#Rm72Kc0L&GVgQe z?iZ5poWF6>dKmKLvq8z&J|+-R!;i2>lgY2m$RUf{Ol=oajdpP(4WjMI@3ym8Zfx8_ zSpSEq3#pP824G&mIYt+#JV;9^GrA|3jbBT1wC-W&wU6yIGV#JbiHoIuxC8UlR;=Q! zdgxlnKpfRon7iRNUE57?+rPfsHDs+|(aVD^S?P2ETH0e(6*e^JZoURCS6G7}A~$|) zcM{PWHXhX^@R*}*PFi5Ts+l2Abw(aX`DP!XF56RJ)eAdYCP3Pb3B96&sG3z9Yi!vo zIQQ2;@o{`-6BGL2<;Q7d2W_y>;j&H%u*_r?BcNhcSvEG(b>%iT^2uUI&~uF))@lrU z)0M!=BvX+n3_BTa;7}wZ7AYewGgWt*pFuig6y<|pW(z48NcM|pv^4F*+qh_pUDov; zgo{(?Cu9kRtqyC;zzA?AX26{zt74%9EH*0Y#mbT;J1JhIvtFbpgh&}jq9ihRAu~z$Rn2TA>yRnIyIQcDro~d(rk7J>i$e6zggzvQ#+i+1VFLH%#xgr1{(4Ws zZWBOH6I05BGGw8PKjhc|x$p`bfg1jMvd1A+S8n_jEIhC#CriiG*kje$lR64X?dp-h ztMvMHu1Ug?fuJV4#&=_vKcl&U*N*lKOVj>|tovq9e*R?I$%ma|9wZ)SK8tz#>%&); z9v(D0Ky!M-uCY;@2gW9kG<~D&DM<=GeP%$rA7r1-Q>DGT&VZ?xF$)#nm&#+9yWI%axr zmrKu#4P;4eDW!tOd1jREv?`XIE#?_N{#jSU2CmjMDe#0{{LRZ?4H!wz;F#QYrWMo> zf73~zQQ(wxpe&fn_Q4sMf?7!2{iO)=s|Tlx=x(dzQFT_3WE_qkBQXqzhlR!=V!+k#hc)hb{Q2Ty%i_`@XB6@O)CPLJe4HI%yBNYiamu>dcIFVLHk;7)qN!2Ei zODEdBGD`yx8+4~?9#9j$3vd~rCP_58Q(irQtVixl1tT`;Mtxzfz|Nl6gO>moqQ5X%bb?Fo6l2h&Y^xea$7D ztd{G45@LkOWG=fYSU3U=I3wj=hJ^Y#TB%#k#&$B5XZ;Hbli(2A-((Q<;)t=bCSWpb z=K-V)DGpM{3Tm{a-&yjgN`C^jGXPQnxkc&xSwFm6*)S5occzqFJ2tE76lKsnewNS9 zLm#|zQ!}a4*gXls9W@aVpR3*a?cAE*xb5hO9UGO36On}*CUnfmdb(}o(B6fguh#Zz zsCk~HptDtr@v8{yuaMC(W>-I@HU1}^*;SIJ+Unw68ycxA@H~cJS&~K;p_5xyDWjMX zBh?luecyOq63qqP7eV+e)Zt|;LCGSV-+-mQGHVvvMrr6J@Wcv*oo{P)tb9&$|~k|ng{tksosODl(OQ5xn@me-2L zMGWeaYRgcya)7$g->DOt2ZJ*ynZ!?)Z~psaO;ykuCeKIVhx{{=vf2mQ@Wt!LyR;ZQ zVq#<0e5d#0GxtPSn7ghY+pft@<=UbvJMTB~|EPM(o}tbAD<`hXck}7c|KbNq&6dRD zyH0MbE#rGkZ>l}tR;ZVaI(MpTlPJauHACyB;%_SynbrCsYNGf+F}fLVDKk`aP!2Mb zh1!H!IZ7odW4#&!kTrCOD6yLjGR^vts3T`m{F)+=wO029l_?v5V)M1t_ZmqclN$_O z>PUS@ql7Jf%6qCnnpEg1TM6$XkbM3Pr1pSR3OFL99Rj3zFGF$zBq<%l`U#Lq1W0{e zf^>>N(y9AX1_2U84M2O=wx&?7# zH|Qd`?1l+U`rU}!^4fvyy0Pq^Dhl2BqmOk z%G-Z9QL@jeL*wS%`dc^fwS_rb?tOP{!Qy$`7+k5|PjhstRji>oJcLgj1N4#>^<8CdMk#5(@1nylyC9O;esuuJb7-bDza z9J}Fu0Nj0eV_v9s+;&J?p7kw>$DRJjD(fta%sWvacrVqCk>w_9(de6eoN%u0=v{_!OcZA+YM+ z3c(!~Ek$}KrGvH%0 zu!#=B-~jxFa3dCTx7$9j#Xt_=zqPKV66D@E&5gl9UxHPC^uP!?vO-RYuOh0Xv$&M* zZYoB8aaNmCA&4&(hYfdN?+gx*#bra%2^;E1bf5FD8m_V#?uQGb`iQ(RY7clm3AFtLHP)de&om$d0@+6ALfjk7cdXEri6fKprZEfpmx;VHdo zx+64$B3AesE+P6Nl@%Atk9AY1>C?~a+`~4B1(~W#f{mU$W>ap2YXo(+c@*6dS`i1{ z#K1z^K(lcf&Tm^gJVF3rjLjn#xIisWLZZn>35(Q|C3wr3&u*o_e>YNRTf!!8bzn29 zrQtbj;@U4?MXkamdI{~DO)fD}rq^j1WVDmRdKdp?LOGzMMU*9wOo$rk#C=p0brxr0 zFW5^!>WO`$6$o8Kgg@dQZ!LWpR|DkVfs|Ta&fcDOU0bOsFKn}a&MdoAcSm{0cR)fhhyN4Um`?Nou*jFI>UZoV>+iy61rc)=M)df~vY-pFM7;-MP7Fo1BnRBc7} z0YDg8BmHqsg%J%`WTz7St&W{a*8#VPXAB^$nqP>u*fX*lS2vP*dE}d1olojzpB}se z?Mrd8^u;xGalXV5r<;)h$>yMqVeTowJ z7&t$HW$Zyb4Sh z{J-jHq)5l##2Z6@f%~ZhOaSBt4WB{aimlw3j-z*>d;+CbbV@@RIZ`E!Bp1D`K($)P z9y)KRJgMTrx!BI8tI(2g#u(olUl3^BaJw%k`jmUv!zZV1;o*1~ME^jSda4^sOk9Sj zU?Lp)%NqO{NwIkEZqbLUI}!+|MF{BbT6|wa&NR_A@KYlViG>`3#jO)DViv zmZosr%85Y?>5X+(I)DmCx_pl%SMin5GyGe0`TasQzB3wUE*vHt>2e1SO+%J(fo2~4@ zooyI26gyImDc+Vd@cLi!I+kB~yKOFV++xdR8haPuLWlsUNj1VX4XUL=|!B~Nr}YfbnrU=Ni^Brbf? zL)3!NxO~e35o|yY;+J?Q>a?{Ak4z}y1|go%Z(!qb>zk?N4o>dAXVSHKzPhSs;n^QQ z>2^`MpZ3oSr!8`ipu|n9cGAk*>&$;_=9}E#=AOCrh;Lf!K1q=6C!IirIMmQGw> zX*^{&R&YOKOLC-5M#Nq^HfnZzt1{RW4^61prd5g#oIaF5BDUuL>qyGy>ULsUINjL1 zdN6*&!s-W+MoPV}SXGJ@DLyYCY;oAbG!rIC_;TZNA@Q@~_bUZ247!g!?Ek(&cU~J) zvgJtV;RsR~oX8ucxLjW~SWzILYZj52x^AMPAQ~{+Hzg(?dOe ztfKeMY1FMjMDB2pD+N0awHx}!)%T9{3~%#E%!A%%RFf=e6}L|=c;e^+7G00I*zRFc z5ea$h=tLIUe2m2wQtpj!InW^XAT%*(cgsTr#!1;+|L0$U8nk z5!#cznd8`pkHQBiGJLs$)H)&|Csz7mG{vVvih>=hSQM*vDjH|VOF?8{{qBWHIJ)Mg z5TGPuF+#Zbx)30$sbY_PF$8=QG2g5FH8DIw41Y~-gAc1nn=dDr35CRaEN0D~ecxpI zxC=!&Za-dQ1#uhwsE!OTZKKx`fP7!o8mmN9;ka3 o-$-h$eRf(mm&_2orAM7NnL{)B&5Y>gg#W!iXjss%1Exg$2Z4mH?*IS* diff --git a/wp/wp-content/themes/twentythirteen/images/headers/star-thumbnail.png b/wp/wp-content/themes/twentythirteen/images/headers/star-thumbnail.png deleted file mode 100644 index 693bb7618bbe65c106536ab376168a09f6efdd39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4039 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 diff --git a/wp/wp-content/themes/twentythirteen/images/headers/star.png b/wp/wp-content/themes/twentythirteen/images/headers/star.png deleted file mode 100644 index 24ca62686d5ebdbfd7bae2c0cc8e3afe4f7e2074..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22620 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 diff --git a/wp/wp-content/themes/twentythirteen/images/search-icon-2x.png b/wp/wp-content/themes/twentythirteen/images/search-icon-2x.png deleted file mode 100644 index 02b63b8027efb48e1edd1344fa8b81690df30950..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 829 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sZv%WnTt!5L{{R0EBu4^z=RETk z(Bpn3L4Lsu42;aIZ0y`T0)j%qBBJsNipnYmM#iRQR@OGQc0Rs-(J_e?l~ofa&Rei> z(c&drw(i)uYwy1O2M!)Oa`e=t%U7;mzj5>K>o@N{fBo_6&tI?n6H-7EH+s4_hE&9z zy_O%o$U%bjgP|7Bnb^Z7!H4Zg=rf-+%e=oXy>bjhT;^-<{rPFL7*U zw@PtJAA5UXRNK=X>yjmXTNfxSm>u`Q{$BSyro6WbV!J0XEXh0I87{wC1u|*f}AJY@@p31IL^*3~;!Onlq?-dIf=I)=XzVV6L!WW4F z3-8-2Yb*~55!k@E=2Oe$)B72g6)rg3{@du`vMuZvI~auzbZ{6kBy4(csQIgYhXZ3B zzki~G@H#`~LuV3qoNRDskTrb4U?7pexT4chwBaZNdxILA6hk}Xe1;Um35+{<3K&x+ zA8ccke;FLLxP6_v{TC+P*Uq0deUrSvWFX!w*iC5zFXS%ybVomurZrE2`Sm^hJl!3m|t zRhRyRPc8L5=N2l-8FFkdL;CDamgVo37k&s+ndrc9$)aZAoB8h({z@LKPxX~4-yHYl zcFBJOCPtYsg$Y^$9>N?QtV}DJ{54}`{$78`-khI5eZmjvisZk*WWnI+>gTe~DWM4f D1|tld diff --git a/wp/wp-content/themes/twentythirteen/images/search-icon.png b/wp/wp-content/themes/twentythirteen/images/search-icon.png deleted file mode 100644 index 11d8dc8e508ef47cca63ace49a5a4c377d5f3b6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaARRs8ixQd7f{r~?TNYWV{ny_XA z&<*M(L4Lsu42=8&5|Z)?28LGFHeTL!^$m?PX3kx)a>MRD2kzdx|KQ2XSFiv4JrQK) z2h_67)5S5Q;#TR!NTDVJ0oRLs3JcCG%9x?VR{Q(@LRAyPh=O|m)K?R3bS|3|qow+J zh6UStrtnHL7uk}TKkKUM7IoJ>_?F=`iz};ST_abo^PJ$tQ3}T-CTU*rkl>n<61pg1 zf=8~0qNE6)*^dAo{vX*AXToOkN=CK)`TwDN=elj{t@rs^^Y6LH6xXh1pxn5j?S}L8 zm*pK&Gg=z&q`rB-dq(QlK<8>(A>Ts@#}94L+@koIYvWzJ8iv<(f|ImAGuHuqz~JfX K=d#Wzp$P!)KZd3N diff --git a/wp/wp-content/themes/twentythirteen/inc/back-compat.php b/wp/wp-content/themes/twentythirteen/inc/back-compat.php deleted file mode 100644 index 993ef1c6..00000000 --- a/wp/wp-content/themes/twentythirteen/inc/back-compat.php +++ /dev/null @@ -1,63 +0,0 @@ -

      %s

      ', $message ); -} - -/** - * Prevent the Customizer from being loaded on WordPress versions prior to 3.6. - * - * @since Twenty Thirteen 1.0 - */ -function twentythirteen_customize() { - wp_die( sprintf( __( 'Twenty Thirteen requires at least WordPress version 3.6. You are running version %s. Please upgrade and try again.', 'twentythirteen' ), $GLOBALS['wp_version'] ), '', array( - 'back_link' => true, - ) ); -} -add_action( 'load-customize.php', 'twentythirteen_customize' ); - -/** - * Prevent the Theme Preview from being loaded on WordPress versions prior to 3.4. - * - * @since Twenty Thirteen 1.0 - */ -function twentythirteen_preview() { - if ( isset( $_GET['preview'] ) ) { - wp_die( sprintf( __( 'Twenty Thirteen requires at least WordPress version 3.6. You are running version %s. Please upgrade and try again.', 'twentythirteen' ), $GLOBALS['wp_version'] ) ); - } -} -add_action( 'template_redirect', 'twentythirteen_preview' ); diff --git a/wp/wp-content/themes/twentythirteen/inc/custom-header.php b/wp/wp-content/themes/twentythirteen/inc/custom-header.php deleted file mode 100644 index 9e40bfe0..00000000 --- a/wp/wp-content/themes/twentythirteen/inc/custom-header.php +++ /dev/null @@ -1,230 +0,0 @@ - '220e10', - 'default-image' => '%s/images/headers/circle.png', - - // Set height and width, with a maximum value for the width. - 'height' => 230, - 'width' => 1600, - - // Callbacks for styling the header and the admin preview. - 'wp-head-callback' => 'twentythirteen_header_style', - 'admin-head-callback' => 'twentythirteen_admin_header_style', - 'admin-preview-callback' => 'twentythirteen_admin_header_image', - ); - - add_theme_support( 'custom-header', $args ); - - /* - * Default custom headers packaged with the theme. - * %s is a placeholder for the theme template directory URI. - */ - register_default_headers( array( - 'circle' => array( - 'url' => '%s/images/headers/circle.png', - 'thumbnail_url' => '%s/images/headers/circle-thumbnail.png', - 'description' => _x( 'Circle', 'header image description', 'twentythirteen' ) - ), - 'diamond' => array( - 'url' => '%s/images/headers/diamond.png', - 'thumbnail_url' => '%s/images/headers/diamond-thumbnail.png', - 'description' => _x( 'Diamond', 'header image description', 'twentythirteen' ) - ), - 'star' => array( - 'url' => '%s/images/headers/star.png', - 'thumbnail_url' => '%s/images/headers/star-thumbnail.png', - 'description' => _x( 'Star', 'header image description', 'twentythirteen' ) - ), - ) ); -} -add_action( 'after_setup_theme', 'twentythirteen_custom_header_setup', 11 ); - -/** - * Load our special font CSS files. - * - * @since Twenty Thirteen 1.0 - */ -function twentythirteen_custom_header_fonts() { - // Add Source Sans Pro and Bitter fonts. - wp_enqueue_style( 'twentythirteen-fonts', twentythirteen_fonts_url(), array(), null ); - - // Add Genericons font. - wp_enqueue_style( 'genericons', get_template_directory_uri() . '/genericons/genericons.css', array(), '3.03' ); -} -add_action( 'admin_print_styles-appearance_page_custom-header', 'twentythirteen_custom_header_fonts' ); - -/** - * Style the header text displayed on the blog. - * - * get_header_textcolor() options: Hide text (returns 'blank'), or any hex value. - * - * @since Twenty Thirteen 1.0 - */ -function twentythirteen_header_style() { - $header_image = get_header_image(); - $text_color = get_header_textcolor(); - - // If no custom options for text are set, let's bail. - if ( empty( $header_image ) && $text_color == get_theme_support( 'custom-header', 'default-text-color' ) ) - return; - - // If we get this far, we have custom styles. - ?> - - Header admin panel. - * - * @since Twenty Thirteen 1.0 - */ -function twentythirteen_admin_header_style() { - $header_image = get_header_image(); -?> - - Header admin panel. - * - * This callback overrides the default markup displayed there. - * - * @since Twenty Thirteen 1.0 - */ -function twentythirteen_admin_header_image() { - $style = 'color: #' . get_header_textcolor() . ';'; - if ( ! display_header_text() ) { - $style = 'display: none;'; - } - ?> -
      - -
      - - -
      -
      - - - - - - - - - - - - - -
      -
      - - - diff --git a/wp/wp-content/themes/twentythirteen/js/functions.js b/wp/wp-content/themes/twentythirteen/js/functions.js deleted file mode 100644 index 88e8d0b5..00000000 --- a/wp/wp-content/themes/twentythirteen/js/functions.js +++ /dev/null @@ -1,165 +0,0 @@ -/** - * Functionality specific to Twenty Thirteen. - * - * Provides helper functions to enhance the theme experience. - */ - -( function( $ ) { - var body = $( 'body' ), - _window = $( window ), - nav, button, menu; - - nav = $( '#site-navigation' ); - button = nav.find( '.menu-toggle' ); - menu = nav.find( '.nav-menu' ); - - /** - * Adds a top margin to the footer if the sidebar widget area is higher - * than the rest of the page, to help the footer always visually clear - * the sidebar. - */ - $( function() { - if ( body.is( '.sidebar' ) ) { - var sidebar = $( '#secondary .widget-area' ), - secondary = ( 0 === sidebar.length ) ? -40 : sidebar.height(), - margin = $( '#tertiary .widget-area' ).height() - $( '#content' ).height() - secondary; - - if ( margin > 0 && _window.innerWidth() > 999 ) { - $( '#colophon' ).css( 'margin-top', margin + 'px' ); - } - } - } ); - - /** - * Enables menu toggle for small screens. - */ - ( function() { - if ( ! nav.length || ! button.length ) { - return; - } - - // Hide button if menu is missing or empty. - if ( ! menu.length || ! menu.children().length ) { - button.hide(); - return; - } - - button.on( 'click.twentythirteen', function() { - nav.toggleClass( 'toggled-on' ); - if ( nav.hasClass( 'toggled-on' ) ) { - $( this ).attr( 'aria-expanded', 'true' ); - menu.attr( 'aria-expanded', 'true' ); - } else { - $( this ).attr( 'aria-expanded', 'false' ); - menu.attr( 'aria-expanded', 'false' ); - } - } ); - - // Fix sub-menus for touch devices. - if ( 'ontouchstart' in window ) { - menu.find( '.menu-item-has-children > a, .page_item_has_children > a' ).on( 'touchstart.twentythirteen', function( e ) { - var el = $( this ).parent( 'li' ); - - if ( ! el.hasClass( 'focus' ) ) { - e.preventDefault(); - el.toggleClass( 'focus' ); - el.siblings( '.focus' ).removeClass( 'focus' ); - } - } ); - } - - // Better focus for hidden submenu items for accessibility. - menu.find( 'a' ).on( 'focus.twentythirteen blur.twentythirteen', function() { - $( this ).parents( '.menu-item, .page_item' ).toggleClass( 'focus' ); - } ); - } )(); - - /** - * @summary Add or remove ARIA attributes. - * Uses jQuery's width() function to determine the size of the window and add - * the default ARIA attributes for the menu toggle if it's visible. - * @since Twenty Thirteen 1.5 - */ - function onResizeARIA() { - if ( 643 > _window.width() ) { - button.attr( 'aria-expanded', 'false' ); - menu.attr( 'aria-expanded', 'false' ); - button.attr( 'aria-controls', 'primary-menu' ); - } else { - button.removeAttr( 'aria-expanded' ); - menu.removeAttr( 'aria-expanded' ); - button.removeAttr( 'aria-controls' ); - } - } - - _window - .on( 'load.twentythirteen', onResizeARIA ) - .on( 'resize.twentythirteen', function() { - onResizeARIA(); - } ); - - /** - * Makes "skip to content" link work correctly in IE9 and Chrome for better - * accessibility. - * - * @link http://www.nczonline.net/blog/2013/01/15/fixing-skip-to-content-links/ - */ - _window.on( 'hashchange.twentythirteen', function() { - var element = document.getElementById( location.hash.substring( 1 ) ); - - if ( element ) { - if ( ! /^(?:a|select|input|button|textarea)$/i.test( element.tagName ) ) { - element.tabIndex = -1; - } - - element.focus(); - } - } ); - - /** - * Arranges footer widgets vertically. - */ - $( function() { - var columnWidth, widgetArea; - if ( ! $.isFunction( $.fn.masonry ) ) { - return; - } - columnWidth = body.is( '.sidebar' ) ? 228 : 245; - widgetArea = $( '#secondary .widget-area' ); - - widgetArea.masonry( { - itemSelector: '.widget', - columnWidth: columnWidth, - gutterWidth: 20, - isRTL: body.is( '.rtl' ) - } ); - - if ( 'undefined' !== typeof wp && wp.customize && wp.customize.selectiveRefresh ) { - - // Retain previous masonry-brick initial position. - wp.customize.selectiveRefresh.bind( 'partial-content-rendered', function( placement ) { - var copyPosition = ( - placement.partial.extended( wp.customize.widgetsPreview.WidgetPartial ) && - placement.removedNodes instanceof jQuery && - placement.removedNodes.is( '.masonry-brick' ) && - placement.container instanceof jQuery - ); - if ( copyPosition ) { - placement.container.css( { - position: placement.removedNodes.css( 'position' ), - top: placement.removedNodes.css( 'top' ), - left: placement.removedNodes.css( 'left' ) - } ); - } - } ); - - // Re-arrange footer widgets when sidebar is updated via selective refresh in the Customizer. - wp.customize.selectiveRefresh.bind( 'sidebar-updated', function( sidebarPartial ) { - if ( 'sidebar-1' === sidebarPartial.sidebarId ) { - widgetArea.masonry( 'reloadItems' ); - widgetArea.masonry( 'layout' ); - } - } ); - } - } ); -} )( jQuery ); \ No newline at end of file diff --git a/wp/wp-content/themes/twentythirteen/js/html5.js b/wp/wp-content/themes/twentythirteen/js/html5.js deleted file mode 100644 index 6168aacd..00000000 --- a/wp/wp-content/themes/twentythirteen/js/html5.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed -*/ -(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); -a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; -c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| -"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); -if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d - -
      -
      - - - - -
      > -
      - -
      - -
      - - -

      -
      - -
      - - '', 'link_before' => '', 'link_after' => '' ) ); ?> -
      - -
      - ', '' ); ?> -
      -
      - - - - -
      -
      - - - \ No newline at end of file diff --git a/wp/wp-content/themes/twentythirteen/readme.txt b/wp/wp-content/themes/twentythirteen/readme.txt deleted file mode 100644 index b583fbe6..00000000 --- a/wp/wp-content/themes/twentythirteen/readme.txt +++ /dev/null @@ -1,108 +0,0 @@ -=== Twenty Thirteen === -Contributors: the WordPress team -Requires at least: WordPress 3.6 -Tested up to: WordPress 4.8-trunk -Stable tag: 2.1 -License: GPLv2 or later -License URI: http://www.gnu.org/licenses/gpl-2.0.html -Tags: blog, one-column, two-columns, right-sidebar, custom-header, custom-menu, editor-style, featured-images, footer-widgets, microformats, post-formats, rtl-language-support, sticky-post, translation-ready, accessibility-ready - -== Description == -The 2013 theme for WordPress takes us back to the blog, featuring a full range of post formats, each displayed beautifully in their own unique way. Design details abound, starting with a vibrant color scheme and matching header images, beautiful typography and icons, and a flexible layout that looks great on any device, big or small. - -For more information about Twenty Thirteen please go to https://codex.wordpress.org/Twenty_Thirteen. - -== Installation == - -1. In your admin panel, go to Appearance -> Themes and click the 'Add New' button. -2. Type in Twenty Thirteen in the search form and press the 'Enter' key in your keyboard. -3. Click on the 'Activate' button to use your new theme right away. -4. Go to https://codex.wordpress.org/Twenty_Thirteen for a guide to customize this theme. -5. Navigate to Appearance > Customize in your admin panel. - -== Copyright == - -Twenty Thirteen WordPress Theme, Copyright 2013-2016 WordPress.org & Automattic.com -Twenty Thirteen is Distributed under the terms of the GNU GPL - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -Twenty Thirteen Theme bundles the following third-party resources: - -HTML5 Shiv v3.7.0, Copyright 2014 Alexander Farkas -Licenses: MIT/GPL2 -Source: https://github.com/aFarkas/html5shiv - -Genericons icon font, Copyright 2013-2016 Automattic.com -License: GNU GPL, Version 2 (or later) -Source: http://www.genericons.com - -== Changelog == - -= 2.1 = -* Released: December 6, 2016 - -https://codex.wordpress.org/Twenty_Thirteen_Theme_Changelog#Version_2.1 - -= 2.0 = -* Released: August 15, 2016 - -https://codex.wordpress.org/Twenty_Thirteen_Theme_Changelog#Version_2.0 - -= 1.9 = -* Released: April 12, 2016 - -https://codex.wordpress.org/Twenty_Thirteen_Theme_Changelog#Version_1.9 - -= 1.8 = -* Released: January 6, 2016 - -https://codex.wordpress.org/Twenty_Thirteen_Theme_Changelog#Version_1.8 - -= 1.7 = -* Released: December 8, 2015 - -https://codex.wordpress.org/Twenty_Thirteen_Theme_Changelog#Version_1.7 - -= 1.6 = -* Released: August 18, 2015 - -https://codex.wordpress.org/Twenty_Thirteen_Theme_Changelog#Version_1.6 - -= 1.5 = -* Released: April 23, 2015 - -https://codex.wordpress.org/Twenty_Thirteen_Theme_Changelog#Version_1.5 - -= 1.4 = -* Released: December 18, 2014 - -https://codex.wordpress.org/Twenty_Thirteen_Theme_Changelog#Version_1.4 - -= 1.3 = -* Released: September 4, 2014 - -https://codex.wordpress.org/Twenty_Thirteen_Theme_Changelog#Version_1.3 - -= 1.2 = -* Released: May 8, 2014 - -https://codex.wordpress.org/Twenty_Thirteen_Theme_Changelog#Version_1.2 - -= 1.1 = -* Released: October 24, 2013 - -https://codex.wordpress.org/Twenty_Thirteen_Theme_Changelog#Version_1.1 - -= 1.0 = -* Released: August 1, 2013 - -Initial release. diff --git a/wp/wp-content/themes/twentythirteen/rtl.css b/wp/wp-content/themes/twentythirteen/rtl.css deleted file mode 100644 index 447d385c..00000000 --- a/wp/wp-content/themes/twentythirteen/rtl.css +++ /dev/null @@ -1,766 +0,0 @@ -/* -Theme Name: Twenty Thirteen -Description: Adds support for languages written in a Right To Left (RTL) direction. -It's easy, just a matter of overwriting all the horizontal positioning attributes -of your CSS stylesheet in a separate stylesheet file named rtl.css. - -See https://codex.wordpress.org/Right_to_Left_Language_Support -*/ - -/** - * Table of Contents: - * - * 1.0 - Reset - * 4.0 - Header - * 4.1 - Site Header - * 4.2 - Navigation - * 5.0 - Content - * 5.2 - Entry Meta - * 5.4 - Galleries - * 5.5 - Post Formats - * 5.6 - Attachments - * 5.7 - Post/Paging Navigation - * 5.8 - Author Bio - * 5.9 - Archives - * 5.10 - Search Results/No posts - * 5.12 - Comments - * 6.0 - Sidebar - * 6.1 - Widgets - * 7.0 - Footer - * 8.0 - Media Queries - * 9.0 - Print - * ---------------------------------------------------------------------------- - */ - - -/** - * 1.0 Reset - * ---------------------------------------------------------------------------- - */ - -body { - direction: rtl; - unicode-bidi: embed; -} - -a { - display: inline-block; -} - -blockquote blockquote { - margin-left: 0; - margin-right: 24px; -} - -menu, -ol, -ul { - padding: 0 40px 0 0; -} - -caption, -th, -td { - text-align: right; -} - -td { - padding-left: 10px; - padding-right: 0; -} - -.assistive-text:focus { - left: auto; - right: 5px; -} - - -/** - * 4.0 Header - * ---------------------------------------------------------------------------- - */ - -/** - * 4.1 Site Header - * ---------------------------------------------------------------------------- - */ - -.site-header > a:first-child { - display: inherit; -} - -.site-description { - font-style: normal; -} - - -/** - * 4.2 Navigation - * ---------------------------------------------------------------------------- - */ - -/* Navbar */ -ul.nav-menu, -div.nav-menu > ul { - margin: 0 -20px 0 0; - padding: 0 0 0 40px; -} - -.nav-menu .sub-menu, -.nav-menu .children { - float: right; - left: auto; - right: -2px; -} - -.nav-menu .sub-menu ul, -.nav-menu .children ul { - border-left: 2px solid #f7f5e7; - border-right: 0; - left: auto; - right: 100%; -} - -.main-navigation .search-form { - left: 0; - right: auto; -} - -.site-header .search-field { - background-position: 98% center; - padding: 0 34px 0 0; -} - -.nav-menu .current_page_item > a, -.nav-menu .current_page_ancestor > a, -.nav-menu .current-menu-item > a, -.nav-menu .current-menu-ancestor > a { - font-style: normal; -} - -.menu-toggle { - padding-left: 0; - padding-right: 20px; -} - - -/** - * 5.0 Content - * ---------------------------------------------------------------------------- - */ - -.sidebar .entry-header, -.sidebar .entry-content, -.sidebar .entry-summary, -.sidebar .entry-meta { - padding-left: 376px; - padding-right: 60px; -} - - -/** - * 5.2 Entry Meta - * ---------------------------------------------------------------------------- - */ - -.entry-meta > span { - margin-left: 20px; - margin-right: auto; -} - -.entry-meta > span:last-child { - margin-left: 0; - margin-right: auto; -} - -.featured-post:before { - margin-left: 2px; - margin-right: auto; -} - -.entry-meta .date a:before { - margin-left: 2px; -} - -.comments-link a:before { - margin-left: 2px; - margin-right: auto; -} - -.tags-links a:first-child:before { - margin-left: 2px; -} - -.edit-link a:before { - margin-left: 2px; -} - -.page-links .page-links-title { - margin-left: 20px; - margin-right: auto; -} - -/** - * 5.4 Galleries - * ---------------------------------------------------------------------------- - */ - -.gallery { - margin-left: auto; - margin-right: -4px; -} - -.gallery-item { - float: right; - margin: 0 0 4px 4px; -} - -.gallery-item a { - display: inline; -} - - -/** - * 5.5 Post Formats - * ---------------------------------------------------------------------------- - */ - -.entry-content a { - display: inline; -} - -.format-aside cite:before { - content: normal; - margin-right: auto; -} - -.format-aside cite:after { - content: "\2014"; - margin-left: 5px; -} - -.format-audio .entry-content:before { - float: right; - -webkit-transform: scaleX(-1); - -moz-transform: scaleX(-1); - -ms-transform: scaleX(-1); - -o-transform: scaleX(-1); - transform: scaleX(-1); -} - -.format-audio .audio-content { - background-position: right top; - float: left; - padding-left: 0; - padding-right: 35px; -} - -.format-chat .entry-meta .date a:before { - margin-left: 4px; - margin-right: auto; -} - -.format-image .wp-caption-text { - text-align: right; -} - -.format-link .entry-title { - margin-left: 20px; - margin-right: auto; -} - -.format-status .entry-content, -.format-status .entry-meta { - padding-left: 0; - padding-right: 35px; -} - -.sidebar .format-status .entry-content, -.sidebar .format-status .entry-meta { - padding-left: 376px; - padding-right: 95px; -} - -.format-status .entry-content:before, -.format-status .entry-meta:before { - left: auto; - right: 10px; -} - -.sidebar .format-status .entry-content:before, -.sidebar .format-status .entry-meta:before { - left: auto; - right: 70px; -} - -.format-status .entry-content p:first-child:before { - left: auto; - right: 4px; -} - -.sidebar .format-status .entry-content p:first-child:before { - left: auto; - right: 64px; -} - -.format-quote blockquote { - padding-left: 0; - padding-right: 75px; -} - -.format-quote blockquote:before { - content: '\201D'; - padding-left: 25px; - padding-right: 0; - left: auto; - right: -15px; -} - - -/** - * 5.6 Attachments - * ---------------------------------------------------------------------------- - */ - -.attachment .entry-title { - float: right; -} - -.attachment .entry-title:before { - margin-left: 10px; - margin-right: auto; -} - -.attachment .entry-meta { - float: left; -} - -.image-navigation .nav-previous { - left: auto; - right: 0; -} - -.image-navigation .nav-next { - left: 0; - right: auto; -} - -.attachment .entry-caption { - text-align: right; -} - - -/** - * 5.7 Post/Paging Navigation - * ---------------------------------------------------------------------------- - */ - -.navigation .nav-previous { - float: right; -} - -.navigation .nav-next { - float: left; -} - -.sidebar .paging-navigation .nav-links, -.sidebar .post-navigation .nav-links { - padding-left: 376px; - padding-right: 60px; -} - -.paging-navigation .nav-previous .meta-nav { - margin-left: 10px; - margin-right: auto; -} - -.paging-navigation .nav-next .meta-nav { - margin-left: auto; - margin-right: 10px; -} - -.post-navigation a[rel="next"] { - float: left; - text-align: left; -} - - -/** - * 5.8 Author Bio - * ---------------------------------------------------------------------------- - */ - -.author-info { - text-align: right; /* gallery & video post formats */ -} - -.author.sidebar .author-info { - padding-left: 376px; - padding-right: 60px; -} - -.author-avatar .avatar { - float: right; - margin: 0 0 30px 30px; -} - -.author-link { - margin-left: auto; - margin-right: 2px; -} - - -/** - * 5.9 Archives - * ---------------------------------------------------------------------------- - */ - -.sidebar .archive-meta { - padding-left: 316px; - padding-right: 0; -} - - -/** - * 5.10 Search Results/No posts - * ---------------------------------------------------------------------------- - */ - -.sidebar .page-content { - padding-left: 376px; - padding-right: 60px; -} - -/** - * 5.12 Comments - * ---------------------------------------------------------------------------- - */ - -.sidebar .comments-title, -.sidebar .comment-list, -.sidebar .comment-reply-title, -.sidebar .comment-navigation, -.sidebar .comment-respond .comment-form { - padding-left: 376px; - padding-right: 60px; -} - -.comment-list .children { - margin-left: auto; - margin-right: 20px; -} - -.comment-author { - float: right; - margin-left: 50px; - margin-right: auto; -} - -.comment-list .edit-link { - margin-left: auto; - margin-right: 20px; -} - -.comment-metadata, -.comment-content, -.comment-list .reply, -.comment-awaiting-moderation { - float: left; -} - -.comment-awaiting-moderation:before { - margin-left: 5px; - margin-right: auto; -} - -.comment-reply-link:before, -.comment-reply-login:before { - margin-left: 3px; - margin-right: auto; - -webkit-transform: scaleX(-1); - -moz-transform: scaleX(-1); - -ms-transform: scaleX(-1); - -o-transform: scaleX(-1); - transform: scaleX(-1); -} - -.comment-reply-title small a { - float: left; -} - -.comment-form [for="author"], -.comment-form [for="email"], -.comment-form [for="url"], -.comment-form [for="comment"] { - float: right; -} - -.form-allowed-tags code { - margin-left: auto; - margin-right: 3px; -} - -.sidebar .no-comments { - padding-left: 376px; - padding-right: 60px; -} - - -/** - * 6.0 Sidebar - * ---------------------------------------------------------------------------- - */ - -.site-main .widget-area { - float: left; -} - -.widget-area a { - max-width: 100%; -} - - -/** - * 6.1 Widgets - * ---------------------------------------------------------------------------- - */ - -.widget .widget-title { - font-style: normal; -} - -.widget li > ul, -.widget li > ol { - margin-left: auto; - margin-right: 20px; -} - -/** - * 7.0 Footer - * ---------------------------------------------------------------------------- - */ - -.site-footer .widget-area, -.sidebar .site-footer { - text-align: right; -} -.sidebar .site-footer .widget-area { - left: auto; - right: -158px; -} - -.site-footer .widget { - float: right; - margin-left: 20px; - margin-right: auto; -} - -.sidebar .site-footer .widget:nth-of-type(4), -.sidebar .site-footer .widget:nth-of-type(3) { - margin-left: 0; - margin-right: auto; -} - - -/** - * 8.0 Media Queries - * ---------------------------------------------------------------------------- - */ - -@media (max-width: 1069px) { - ul.nav-menu, - div.nav-menu > ul { - margin-left: auto; - margin-right: 0; - } - - .error404 .page-header, - .sidebar .format-image .entry-content img.size-full, - .sidebar .format-image .wp-caption:first-child .wp-caption-text { - margin-right: auto; - } - - .main-navigation .search-form { - left: 20px; - right: auto; - } - - .site-main .widget-area { - margin-left: 60px; - margin-right: auto; - } -} - -@media (max-width: 999px) { - .sidebar .entry-header, - .sidebar .entry-content, - .sidebar .entry-summary, - .sidebar .entry-meta, - .sidebar .comment-list, - .sidebar .comment-reply-title, - .sidebar .comment-navigation, - .sidebar .comment-respond .comment-form, - .sidebar .featured-gallery, - .sidebar .post-navigation .nav-links, - .author.sidebar .author-info, - .sidebar .format-image .entry-content { - max-width: 604px; - padding-left: 0; - padding-right: 0; - } - - .site-main .widget-area { - float: none; - margin-left: auto; - } - - .attachment .entry-meta { - float: right; - text-align: right; - } - - .sidebar .format-status .entry-content, - .sidebar .format-status .entry-meta { - padding-left: 0; - padding-right: 35px; - } - - .sidebar .format-status .entry-content:before, - .sidebar .format-status .entry-meta:before { - left: auto; - right: 10px; - } - - .sidebar .format-status .entry-content p:first-child:before { - left: auto; - right: 4px; - } - - .sidebar .site-footer .widget-area { - left: auto; - right: 0; - } - - .sidebar .paging-navigation .nav-links { - padding: 0 60px; - } -} - -@media (max-width: 767px) { - .format-image .entry-content img:first-of-type, - .format-image .wp-caption:first-child .wp-caption-text { - margin-right: auto; - } -} - -@media (max-width: 643px) { - .sidebar .entry-header, - .sidebar .entry-content, - .sidebar .entry-summary, - .sidebar .entry-meta, - .sidebar .comment-list, - .sidebar .comment-navigation, - .sidebar .featured-gallery, - .sidebar .post-navigation .nav-links, - .sidebar .format-image .entry-content { - padding-left: 20px; - padding-right: 20px; - } - - #content .format-status .entry-content, - #content .format-status .entry-met { - padding-left: 0; - padding-right: 35px; - } - - .menu-toggle:after { - padding-left: 0; - padding-right: 8px; - } - - .toggled-on .nav-menu, - .toggled-on .nav-menu > ul { - margin-left: auto; - margin-right: 0; - } - - .toggled-on .nav-menu li > ul { - margin-left: auto; - margin-right: 20px; - right: auto; - } - - #content .featured-gallery { - padding-left: 0; - padding-right: 24px; - } - - .gallery-columns-1 .gallery-item { - margin-left: 0; - margin-right: auto; - } - - .comment-author { - margin-left: 30px; - margin-right: auto; - } - - .format-audio .audio-content { - background: none; - float: none; - padding-left: 0; - padding-right: 0; - } - - .gallery-columns-3 .gallery-item:nth-of-type(3n) { - margin-left: 4px; - margin-right: auto; - } -} - -@media (max-width: 359px) { - .gallery { - margin-left: auto; - margin-right: 0; - } - - .gallery .gallery-item:nth-of-type(even) { - margin-left: 0; - margin-right: auto; - } - - .gallery .gallery-item, - .gallery.gallery-columns-3 .gallery-item:nth-of-type(even), - .gallery-columns-3 .gallery-item:nth-of-type(3n), - .gallery-columns-5 .gallery-item:nth-of-type(5n), - .gallery-columns-7 .gallery-item:nth-of-type(7n), - .gallery-columns-9 .gallery-item:nth-of-type(9n) { - margin-left: 4px; - margin-right: auto; - } - - .comment-author .avatar { - margin-left: 5px; - margin-right: auto; - } -} - - -/** - * 9.0 Print - * ---------------------------------------------------------------------------- - */ - -@media print { - .entry-content img.alignleft, - .entry-content .wp-caption.alignleft { - margin-left: auto; - margin-right: 0; - } - - .entry-content img.alignright, - .entry-content .wp-caption.alignright { - margin-left: 0; - margin-right: auto; - } -} \ No newline at end of file diff --git a/wp/wp-content/themes/twentythirteen/screenshot.png b/wp/wp-content/themes/twentythirteen/screenshot.png deleted file mode 100644 index 33ccea20a6577dd794671139e8af8bb9dcbdd0e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175485 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%0Dc++?T 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 diff --git a/wp/wp-content/themes/twentythirteen/search.php b/wp/wp-content/themes/twentythirteen/search.php deleted file mode 100644 index 1519c137..00000000 --- a/wp/wp-content/themes/twentythirteen/search.php +++ /dev/null @@ -1,36 +0,0 @@ - - -
      -
      - - - - - - - - - - - - - - - - -
      -
      - - - \ No newline at end of file diff --git a/wp/wp-content/themes/twentythirteen/sidebar-main.php b/wp/wp-content/themes/twentythirteen/sidebar-main.php deleted file mode 100644 index 3c700add..00000000 --- a/wp/wp-content/themes/twentythirteen/sidebar-main.php +++ /dev/null @@ -1,18 +0,0 @@ - - - \ No newline at end of file diff --git a/wp/wp-content/themes/twentythirteen/sidebar.php b/wp/wp-content/themes/twentythirteen/sidebar.php deleted file mode 100644 index cb5cf98e..00000000 --- a/wp/wp-content/themes/twentythirteen/sidebar.php +++ /dev/null @@ -1,22 +0,0 @@ - - - \ No newline at end of file diff --git a/wp/wp-content/themes/twentythirteen/single.php b/wp/wp-content/themes/twentythirteen/single.php deleted file mode 100644 index 1694a0dc..00000000 --- a/wp/wp-content/themes/twentythirteen/single.php +++ /dev/null @@ -1,28 +0,0 @@ - - -
      -
      - - - - - - - - - - -
      -
      - - - \ No newline at end of file diff --git a/wp/wp-content/themes/twentythirteen/style.css b/wp/wp-content/themes/twentythirteen/style.css deleted file mode 100644 index de890f84..00000000 --- a/wp/wp-content/themes/twentythirteen/style.css +++ /dev/null @@ -1,3228 +0,0 @@ -/* -Theme Name: Twenty Thirteen -Theme URI: https://wordpress.org/themes/twentythirteen/ -Author: the WordPress team -Author URI: https://wordpress.org/ -Description: The 2013 theme for WordPress takes us back to the blog, featuring a full range of post formats, each displayed beautifully in their own unique way. Design details abound, starting with a vibrant color scheme and matching header images, beautiful typography and icons, and a flexible layout that looks great on any device, big or small. -Version: 2.1 -License: GNU General Public License v2 or later -License URI: http://www.gnu.org/licenses/gpl-2.0.html -Tags: blog, one-column, two-columns, right-sidebar, custom-header, custom-menu, editor-style, featured-images, footer-widgets, microformats, post-formats, rtl-language-support, sticky-post, translation-ready, accessibility-ready -Text Domain: twentythirteen - -This theme, like WordPress, is licensed under the GPL. -Use it to make something cool, have fun, and share what you've learned with others. -*/ - - -/** - * Table of Contents: - * - * 1.0 - Reset - * 2.0 - Repeatable Patterns - * 3.0 - Basic Structure - * 4.0 - Header - * 4.1 - Site Header - * 4.2 - Navigation - * 5.0 - Content - * 5.1 - Entry Header - * 5.2 - Entry Meta - * 5.3 - Entry Content - * 5.4 - Galleries - * 5.5 - Post Formats - * 5.6 - Attachments - * 5.7 - Post/Paging Navigation - * 5.8 - Author Bio - * 5.9 - Archives - * 5.10 - Search Results/No posts - * 5.11 - 404 - * 5.12 - Comments - * 5.13 - Multisite - * 6.0 - Sidebar - * 6.1 - Widgets - * 7.0 - Footer - * 8.0 - Media Queries - * 9.0 - Print - * ---------------------------------------------------------------------------- - */ - - -/** - * 1.0 Reset - * - * Modified from Normalize.css to provide cross-browser consistency and a smart - * default styling of HTML elements. - * - * @see http://git.io/normalize - * ---------------------------------------------------------------------------- - */ - -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -article, -aside, -details, -figcaption, -figure, -footer, -header, -nav, -section, -summary { - display: block; -} - -audio, -canvas, -video { - display: inline-block; -} - -audio:not([controls]) { - display: none; - height: 0; -} - -[hidden] { - display: none; -} - -html { - font-size: 100%; - overflow-y: scroll; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -html, -button, -input, -select, -textarea { - font-family: "Source Sans Pro", Helvetica, sans-serif; -} - -body { - color: #141412; - line-height: 1.5; - margin: 0; -} - -a { - color: #ca3c08; - text-decoration: none; -} - -a:visited { - color: #ac0404; -} - -a:focus { - outline: thin dotted; -} - -a:active, -a:hover { - color: #ea9629; - outline: 0; -} - -a:hover { - text-decoration: underline; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - clear: both; - font-family: Bitter, Georgia, serif; - line-height: 1.3; -} - -h1 { - font-size: 48px; - margin: 33px 0; -} - -h2 { - font-size: 30px; - margin: 25px 0; -} - -h3 { - font-size: 22px; - margin: 22px 0; -} - -h4 { - font-size: 20px; - margin: 25px 0; -} - -h5 { - font-size: 18px; - margin: 30px 0; -} - -h6 { - font-size: 16px; - margin: 36px 0; -} - -address { - font-style: italic; - margin: 0 0 24px; -} - -abbr[title] { - border-bottom: 1px dotted; -} - -b, -strong { - font-weight: bold; -} - -dfn { - font-style: italic; -} - -mark { - background: #ff0; - color: #000; -} - -p { - margin: 0 0 24px; -} - -code, -kbd, -pre, -samp { - font-family: monospace, serif; - font-size: 14px; - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -pre { - background: #f5f5f5; - color: #666; - font-family: monospace; - font-size: 14px; - margin: 20px 0; - overflow: auto; - padding: 20px; - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -blockquote, -q { - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; - quotes: none; -} - -blockquote:before, -blockquote:after, -q:before, -q:after { - content: ""; - content: none; -} - -blockquote { - font-size: 18px; - font-style: italic; - font-weight: 300; - margin: 24px 40px; -} - -blockquote blockquote { - margin-right: 0; -} - -blockquote cite, -blockquote small { - font-size: 14px; - font-weight: normal; - text-transform: uppercase; -} - -blockquote em, -blockquote i { - font-style: normal; - font-weight: 300; -} - -blockquote strong, -blockquote b { - font-weight: 400; -} - -small { - font-size: smaller; -} - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -dl { - margin: 0 20px; -} - -dt { - font-weight: bold; -} - -dd { - margin: 0 0 20px; -} - -menu, -ol, -ul { - margin: 16px 0; - padding: 0 0 0 40px; -} - -ul { - list-style-type: square; -} - -nav ul, -nav ol { - list-style: none; - list-style-image: none; -} - -li > ul, -li > ol { - margin: 0; -} - -img { - -ms-interpolation-mode: bicubic; - border: 0; - vertical-align: middle; -} - -svg:not(:root) { - overflow: hidden; -} - -figure { - margin: 0; -} - -form { - margin: 0; -} - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - min-width: inherit; - padding: 0.35em 0.625em 0.75em; -} - -legend { - border: 0; - padding: 0; - white-space: normal; -} - -button, -input, -select, -textarea { - font-size: 100%; - margin: 0; - max-width: 100%; - vertical-align: baseline; -} - -button, -input { - line-height: normal; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} - -button[disabled], -input[disabled] { - cursor: default; -} - -input[type="checkbox"], -input[type="radio"] { - padding: 0; -} - -input[type="search"] { - -webkit-appearance: textfield; - padding-right: 2px; /* Don't cut off the webkit search cancel button */ - width: 270px; -} - -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -table { - border-bottom: 1px solid #ededed; - border-collapse: collapse; - border-spacing: 0; - font-size: 14px; - line-height: 2; - margin: 0 0 20px; - width: 100%; -} - -caption, -th, -td { - font-weight: normal; - text-align: left; -} - -caption { - font-size: 16px; - margin: 20px 0; -} - -th { - font-weight: bold; - text-transform: uppercase; -} - -td { - border-top: 1px solid #ededed; - padding: 6px 10px 6px 0; -} - -del { - color: #333; -} - -ins { - background: #fff9c0; - text-decoration: none; -} - -hr { - background: url(images/dotted-line.png) repeat center top; - background-size: 4px 4px; - border: 0; - height: 1px; - margin: 0 0 24px; -} - - -/** - * 2.0 Repeatable Patterns - * ---------------------------------------------------------------------------- - */ - -.genericon:before, -.menu-toggle:after, -.featured-post:before, -.date a:before, -.entry-meta .author a:before, -.format-audio .entry-content:before, -.comments-link a:before, -.tags-links a:first-child:before, -.categories-links a:first-child:before, -.edit-link a:before, -.attachment .entry-title:before, -.attachment-meta:before, -.attachment-meta a:before, -.comment-awaiting-moderation:before, -.comment-reply-link:before, -.comment-reply-login:before, -.comment-reply-title small a:before, -.bypostauthor > .comment-body .fn:before, -.error404 .page-title:before { - -webkit-font-smoothing: antialiased; - display: inline-block; - font: normal 16px/1 Genericons; - vertical-align: text-bottom; -} - -/* Clearing floats */ -.clear:after, -.attachment .entry-header:after, -.site-footer .widget-area:after, -.entry-content:after, -.page-content:after, -.navigation:after, -.nav-links:after, -.gallery:after, -.comment-form-author:after, -.comment-form-email:after, -.comment-form-url:after, -.comment-body:after { - clear: both; -} - -.clear:before, -.clear:after, -.attachment .entry-header:before, -.attachment .entry-header:after, -.site-footer .widget-area:before, -.site-footer .widget-area:after, -.entry-content:before, -.entry-content:after, -.page-content:before, -.page-content:after, -.navigation:before, -.navigation:after, -.nav-links:before, -.nav-links:after, -.gallery:before, -.gallery:after, -.comment-form-author:before, -.comment-form-author:after, -.comment-form-email:before, -.comment-form-email:after, -.comment-form-url:before, -.comment-form-url:after, -.comment-body:before, -.comment-body:after { - content: ""; - display: table; -} - -/* Assistive text */ -.screen-reader-text { - clip: rect(1px, 1px, 1px, 1px); - overflow: hidden; - position: absolute !important; - height: 1px; - width: 1px; -} - -.screen-reader-text:focus { - background-color: #f1f1f1; - border-radius: 3px; - box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); - clip: auto !important; - color: #21759b; - display: block; - font-size: 14px; - font-weight: bold; - height: auto; - line-height: normal; - padding: 15px 23px 14px; - position: absolute; - left: 5px; - top: 5px; - text-decoration: none; - width: auto; - z-index: 100000; /* Above WP toolbar */ -} - -/* Form fields, general styles first. */ -button, -input, -textarea { - border: 2px solid #d4d0ba; - font-family: inherit; - padding: 5px; -} - -input, -textarea { - color: #141412; -} - -input:focus, -textarea:focus { - border: 2px solid #c3c0ab; - outline: 0; -} - -/* Buttons */ -button, -input[type="submit"], -input[type="button"], -input[type="reset"] { - background: #e05d22; /* Old browsers */ - background: -webkit-linear-gradient(top, #e05d22 0%, #d94412 100%); /* Chrome 10+, Safari 5.1+ */ - background: linear-gradient(to bottom, #e05d22 0%, #d94412 100%); /* W3C */ - border: none; - border-bottom: 3px solid #b93207; - border-radius: 2px; - color: #fff; - display: inline-block; - padding: 11px 24px 10px; - text-decoration: none; -} - -button:hover, -button:focus, -input[type="submit"]:hover, -input[type="button"]:hover, -input[type="reset"]:hover, -input[type="submit"]:focus, -input[type="button"]:focus, -input[type="reset"]:focus { - background: #ed6a31; /* Old browsers */ - background: -webkit-linear-gradient(top, #ed6a31 0%, #e55627 100%); /* Chrome 10+, Safari 5.1+ */ - background: linear-gradient(to bottom, #ed6a31 0%, #e55627 100%); /* W3C */ - outline: none; -} - -button:active, -input[type="submit"]:active, -input[type="button"]:active, -input[type="reset"]:active { - background: #d94412; /* Old browsers */ - background: -webkit-linear-gradient(top, #d94412 0%, #e05d22 100%); /* Chrome 10+, Safari 5.1+ */ - background: linear-gradient(to bottom, #d94412 0%, #e05d22 100%); /* W3C */ - border: none; - border-top: 3px solid #b93207; - padding: 10px 24px 11px; -} - -.post-password-required input[type="submit"] { - padding: 7px 24px 4px; - vertical-align: bottom; -} - -.post-password-required input[type="submit"]:active { - padding: 5px 24px 6px; -} - -/* Placeholder text color -- selectors need to be separate to work. */ -::-webkit-input-placeholder { - color: #7d7b6d; -} - -:-moz-placeholder { - color: #7d7b6d; -} - -::-moz-placeholder { - color: #7d7b6d; -} - -:-ms-input-placeholder { - color: #7d7b6d; -} - -/* - * Responsive images - * - * Fluid images for posts, comments, and widgets - */ -.entry-content img, -.entry-summary img, -.comment-content img, -.widget img, -.wp-caption { - max-width: 100%; -} - -/* Make sure images with WordPress-added height and width attributes are scaled correctly. */ -.entry-content img, -.entry-summary img, -.comment-content img[height], -img[class*="align"], -img[class*="wp-image-"], -img[class*="attachment-"] { - height: auto; -} - -img.size-full, -img.size-large, -img.wp-post-image { - height: auto; - max-width: 100%; -} - -/* Make sure videos and embeds fit their containers. */ -embed, -iframe, -object, -video { - max-width: 100%; -} - -/* Override the Twitter embed fixed width. */ -.entry-content .twitter-tweet-rendered { - max-width: 100% !important; -} - -/* Images */ -.alignleft { - float: left; -} - -.alignright { - float: right; -} - -.aligncenter { - display: block; - margin-left: auto; - margin-right: auto; -} - -figure.wp-caption.alignleft, -img.alignleft { - margin: 5px 20px 5px 0; -} - -.wp-caption.alignleft { - margin: 5px 10px 5px 0; -} - -figure.wp-caption.alignright, -img.alignright { - margin: 5px 0 5px 20px; -} - -.wp-caption.alignright { - margin: 5px 0 5px 10px; -} - -img.aligncenter { - margin: 5px auto; -} - -img.alignnone { - margin: 5px 0; -} - -.wp-caption .wp-caption-text, -.entry-caption, -.gallery-caption { - color: #220e10; - font-size: 18px; - font-style: italic; - font-weight: 300; - margin: 0 0 24px; -} - -div.wp-caption.alignright img[class*="wp-image-"] { - float: right; -} - -div.wp-caption.alignright .wp-caption-text { - padding-left: 10px; -} - -img.wp-smiley, -.rsswidget img { - border: 0; - border-radius: 0; - box-shadow: none; - margin-bottom: 0; - margin-top: 0; - padding: 0; -} - -.wp-caption.alignleft + ul, -.wp-caption.alignleft + ol { - list-style-position: inside; -} - - -/** - * 3.0 Basic Structure - * ---------------------------------------------------------------------------- - */ - -.site { - background-color: #fff; - border-left: 1px solid #f2f2f2; - border-right: 1px solid #f2f2f2; - margin: 0 auto; - max-width: 1600px; - width: 100%; -} - -.site-main { - position: relative; -} - -.site-main .sidebar-container { - height: 0; - position: absolute; - top: 40px; - width: 100%; - z-index: 1; -} - -.site-main .sidebar-inner { - margin: 0 auto; - max-width: 1040px; -} - - -/** - * 4.0 Header - * ---------------------------------------------------------------------------- - */ - -/** - * 4.1 Site Header - * ---------------------------------------------------------------------------- - */ - -.site-header { - position: relative; -} - -.site-header .home-link { - color: #141412; - display: block; - margin: 0 auto; - max-width: 1080px; - min-height: 230px; - padding: 0 20px; - text-decoration: none; - width: 100%; -} - -.site-header .site-title:hover { - text-decoration: underline; -} - -.site-title { - font-size: 60px; - font-weight: bold; - line-height: 1; - margin: 0; - padding: 58px 0 10px; -} - -.site-description { - font: 300 italic 24px "Source Sans Pro", Helvetica, sans-serif; - margin: 0; -} - - -/** - * 4.2 Navigation - * ---------------------------------------------------------------------------- - */ - -.main-navigation { - clear: both; - margin: 0 auto; - max-width: 1080px; - min-height: 45px; - position: relative; -} - -ul.nav-menu, -div.nav-menu > ul { - margin: 0; - padding: 0 40px 0 0; -} - -.nav-menu li { - display: inline-block; - position: relative; -} - -.nav-menu li a { - color: #141412; - display: block; - font-size: 15px; - line-height: 1; - padding: 15px 20px; - text-decoration: none; -} - -.nav-menu li:hover > a, -.nav-menu li a:hover, -.nav-menu li:focus > a, -.nav-menu li a:focus { - background-color: #220e10; - color: #fff; -} - -.nav-menu .sub-menu, -.nav-menu .children { - background-color: #220e10; - border: 2px solid #f7f5e7; - border-top: 0; - padding: 0; - position: absolute; - left: -2px; - z-index: 99999; - height: 1px; - width: 1px; - overflow: hidden; - clip: rect(1px, 1px, 1px, 1px); -} - -.nav-menu .sub-menu ul, -.nav-menu .children ul { - border-left: 0; - left: 100%; - top: 0; -} - -ul.nav-menu ul a, -.nav-menu ul ul a { - color: #fff; - margin: 0; - width: 200px; -} - -ul.nav-menu ul a:hover, -.nav-menu ul ul a:hover, -ul.nav-menu ul a:focus, -.nav-menu ul ul a:focus { - background-color: #db572f; -} - -ul.nav-menu li:hover > ul, -.nav-menu ul li:hover > ul, -ul.nav-menu .focus > ul, -.nav-menu .focus > ul { - clip: inherit; - overflow: inherit; - height: inherit; - width: inherit; -} - -.nav-menu .current_page_item > a, -.nav-menu .current_page_ancestor > a, -.nav-menu .current-menu-item > a, -.nav-menu .current-menu-ancestor > a { - color: #bc360a; - font-style: italic; -} - -.menu-toggle { - display: none; -} - -/* Navbar */ -.navbar { - background-color: #f7f5e7; - margin: 0 auto; - max-width: 1600px; - width: 100%; -} - -.site-header .search-form { - position: absolute; - right: 20px; - top: 1px; -} - -.site-header .search-field { - background-color: transparent; - background-image: url(images/search-icon.png); - background-position: 5px center; - background-repeat: no-repeat; - background-size: 24px 24px; - border: none; - cursor: pointer; - height: 37px; - margin: 3px 0; - padding: 0 0 0 34px; - position: relative; - -webkit-transition: width 400ms ease, background 400ms ease; - transition: width 400ms ease, background 400ms ease; - width: 1px; -} - -.site-header .search-field:focus { - background-color: #fff; - border: 2px solid #c3c0ab; - cursor: text; - outline: 0; - width: 230px; -} - - -/** - * 5.0 Content - * ---------------------------------------------------------------------------- - */ - -.hentry { - padding: 40px 0; -} - -.entry-header, -.entry-content, -.entry-summary, -.entry-meta { - margin: 0 auto; - max-width: 604px; - width: 100%; -} - -.sidebar .entry-header, -.sidebar .entry-content, -.sidebar .entry-summary, -.sidebar .entry-meta { - max-width: 1040px; - padding: 0 376px 0 60px; -} - - -/** - * 5.1 Entry Header - * ---------------------------------------------------------------------------- - */ - -.sidebar .entry-header .entry-meta { - padding: 0; -} - -.entry-thumbnail img { - display: block; - margin: 0 auto 10px; -} - -.entry-header { - margin-bottom: 30px; -} - -.entry-title { - font-weight: normal; - margin: 0 0 5px; -} - -.entry-title a { - color: #141412; -} - -.entry-title a:hover { - color: #ea9629; -} - - -/** - * 5.2 Entry Meta - * ---------------------------------------------------------------------------- - */ - -.entry-meta { - clear: both; - font-size: 14px; -} - -.entry-meta a { - color: #bc360a; -} - -.entry-meta a:hover { - color: #bc360a; -} - -.entry-meta > span { - margin-right: 20px; -} - -.entry-meta > span:last-child { - margin-right: 0; -} - -.featured-post:before { - content: "\f308"; - margin-right: 2px; -} - -.entry-meta .date a:before { - content: "\f303"; -} - -.comments-link a:before { - content: "\f300"; - margin-right: 2px; - position: relative; - top: -1px; -} - -.entry-meta .author a:before { - content: "\f304"; - position: relative; - top: -1px; -} - -.categories-links a:first-child:before { - content: "\f301"; -} - -.tags-links a:first-child:before { - content: "\f302"; - position: relative; - top: -1px; -} - -.edit-link a:before { - content: "\f411"; - position: relative; - top: -1px; -} - -.single-author .entry-meta .author, -.sticky.format-standard .entry-meta .date, -.sticky.format-audio .entry-meta .date, -.sticky.format-chat .entry-meta .date, -.sticky.format-image .entry-meta .date, -.sticky.format-gallery .entry-meta .date { - display: none; -} - - -/** - * 5.3 Entry Content - * ---------------------------------------------------------------------------- - */ - -.entry-content { - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; - word-wrap: break-word; -} - -.entry-content a, -.comment-content a { - color: #bc360a; -} - -.entry-content a:hover, -.comment-content a:hover { - color: #ea9629; -} - -.entry-content .more-link { - white-space: nowrap; -} - -.entry-content blockquote { - font-size: 24px; -} - -.entry-content blockquote cite, -.entry-content blockquote small { - font-size: 16px; -} - -.entry-content img.alignleft, -.entry-content .wp-caption.alignleft { - margin-left: -60px; -} - -.entry-content img.alignright, -.entry-content .wp-caption.alignright { - margin-right: -60px; -} - -footer.entry-meta { - margin-top: 24px; -} - -.format-standard footer.entry-meta { - margin-top: 0; -} - -/* Page links */ -.page-links { - clear: both; - font-size: 16px; - font-style: italic; - font-weight: normal; - line-height: 2.2; - margin: 20px 0; - text-transform: uppercase; -} - -.page-links a, -.page-links > span { - background: #fff; - border: 1px solid #fff; - padding: 5px 10px; - text-decoration: none; -} - -.format-status .entry-content .page-links a, -.format-gallery .entry-content .page-links a, -.format-chat .entry-content .page-links a, -.format-quote .entry-content .page-links a, -.page-links a { - background: #e63f2a; - border: 1px solid #e63f2a; - color: #fff; -} - -.format-gallery .entry-content .page-links a:hover, -.format-audio .entry-content .page-links a:hover, -.format-status .entry-content .page-links a:hover, -.format-video .entry-content .page-links a:hover, -.format-chat .entry-content .page-links a:hover, -.format-quote .entry-content .page-links a:hover, -.page-links a:hover { - background: #fff; - color: #e63f2a; -} - -.format-status .entry-content .page-links > span, -.format-quote .entry-content .page-links > span { - background: none; -} - -.page-links .page-links-title { - background: transparent; - border: none; - margin-right: 20px; - padding: 0; -} - -/* Mediaelements */ -.hentry .mejs-mediaelement, -.hentry .mejs-container .mejs-controls { - background: #220e10; -} - -.hentry .mejs-controls .mejs-time-rail .mejs-time-loaded, -.hentry .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current { - background: #fff; -} - -.hentry .mejs-controls .mejs-time-rail .mejs-time-current { - background: #ea9629; -} - -.hentry .mejs-controls .mejs-time-rail .mejs-time-total, -.hentry .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total { - background: #595959; -} - -.hentry .mejs-controls .mejs-time-rail span, -.hentry .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total, -.hentry .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current { - border-radius: 0; -} - - -/** - * 5.4 Galleries - * ---------------------------------------------------------------------------- - */ - -.gallery { - margin-bottom: 20px; - margin-left: -4px; -} - -.gallery-item { - float: left; - margin: 0 4px 4px 0; - overflow: hidden; - position: relative; -} - -.gallery-columns-1.gallery-size-medium, -.gallery-columns-1.gallery-size-thumbnail, -.gallery-columns-2.gallery-size-thumbnail, -.gallery-columns-3.gallery-size-thumbnail { - display: table; - margin: 0 auto 20px; -} - -.gallery-columns-1 .gallery-item, -.gallery-columns-2 .gallery-item, -.gallery-columns-3 .gallery-item { - text-align: center; -} - -.gallery-columns-4 .gallery-item { - max-width: 23%; - max-width: -webkit-calc(25% - 4px); - max-width: calc(25% - 4px); -} - -.gallery-columns-5 .gallery-item { - max-width: 19%; - max-width: -webkit-calc(20% - 4px); - max-width: calc(20% - 4px); -} - -.gallery-columns-6 .gallery-item { - max-width: 15%; - max-width: -webkit-calc(16.7% - 4px); - max-width: calc(16.7% - 4px); -} - -.gallery-columns-7 .gallery-item { - max-width: 13%; - max-width: -webkit-calc(14.28% - 4px); - max-width: calc(14.28% - 4px); -} - -.gallery-columns-8 .gallery-item { - max-width: 11%; - max-width: -webkit-calc(12.5% - 4px); - max-width: calc(12.5% - 4px); -} - -.gallery-columns-9 .gallery-item { - max-width: 9%; - max-width: -webkit-calc(11.1% - 4px); - max-width: calc(11.1% - 4px); -} - -.gallery-columns-1 .gallery-item:nth-of-type(1n), -.gallery-columns-2 .gallery-item:nth-of-type(2n), -.gallery-columns-3 .gallery-item:nth-of-type(3n), -.gallery-columns-4 .gallery-item:nth-of-type(4n), -.gallery-columns-5 .gallery-item:nth-of-type(5n), -.gallery-columns-6 .gallery-item:nth-of-type(6n), -.gallery-columns-7 .gallery-item:nth-of-type(7n), -.gallery-columns-8 .gallery-item:nth-of-type(8n), -.gallery-columns-9 .gallery-item:nth-of-type(9n) { - margin-right: 0; -} - -.gallery-columns-1.gallery-size-medium figure.gallery-item:nth-of-type(1n+1), -.gallery-columns-1.gallery-size-thumbnail figure.gallery-item:nth-of-type(1n+1), -.gallery-columns-2.gallery-size-thumbnail figure.gallery-item:nth-of-type(2n+1), -.gallery-columns-3.gallery-size-thumbnail figure.gallery-item:nth-of-type(3n+1) { - clear: left; -} - -.gallery-caption { - background-color: rgba(0, 0, 0, 0.7); - box-sizing: border-box; - color: #fff; - font-size: 14px; - line-height: 1.3; - margin: 0; - max-height: 50%; - opacity: 0; - padding: 2px 8px; - position: absolute; - bottom: 0; - left: 0; - text-align: left; - -webkit-transition: opacity 400ms ease; - transition: opacity 400ms ease; - width: 100%; -} - -.gallery-caption:before { - box-shadow: 0 -10px 15px #000 inset; - content: ""; - height: 100%; - min-height: 49px; - position: absolute; - left: 0; - top: 0; - width: 100%; -} - -.gallery-item:hover .gallery-caption { - opacity: 1; -} - -.gallery-columns-7 .gallery-caption, -.gallery-columns-8 .gallery-caption, -.gallery-columns-9 .gallery-caption { - display: none; -} - - -/** - * 5.5 Post Formats - * ---------------------------------------------------------------------------- - */ - -/* Aside */ -.format-aside { - background-color: #f7f5e7; -} - -.blog .format-aside:first-of-type, -.single .format-aside:first-of-type, -.format-aside + .format-aside, -.format-aside + .format-link, -.format-link + .format-aside { - box-shadow: inset 0 2px 2px rgba(173, 165, 105, 0.2); -} - -.format-aside .entry-meta { - margin-top: 0; -} - -.format-aside blockquote { - font-size: 100%; - font-weight: normal; -} - -.format-aside cite { - font-size: 100%; - text-transform: none; -} - -.format-aside cite:before { - content: "\2014"; - margin-right: 5px; -} - -/* Audio */ -.format-audio { - background-color: #db572f; -} - -.format-audio .entry-title { - font-size: 28px; - font-weight: bold; -} - -.format-audio .entry-content:before { - content: "\f109"; - float: left; - font-size: 64px; - position: relative; - top: 4px; -} - -.format-audio .entry-content a, -.format-audio .entry-meta a, -.format-audio .entry-content a:hover, -.format-audio .entry-meta a:hover { - color: #fbfaf3; -} - -.format-audio .audio-content { - background: url(images/dotted-line.png) repeat-y left top; - background-size: 4px 4px; - float: right; - padding-left: 35px; - width: 80%; - width: -webkit-calc(100% - 85px); - width: calc(100% - 85px); -} - -.format-audio .wp-audio-shortcode { - height: 30px !important; /* Override mediaelement.js style */ - margin: 20px 0; - max-width: 400px !important; /* Override mediaelement.js style */ -} - -.format-audio audio { - max-width: 100% !important; /* Avoid player width overflow. */ -} - -/* Chat */ -.format-chat { - background-color: #eadaa6; -} - -.format-chat .entry-title { - font-size: 28px; - font-weight: bold; -} - -.format-chat .entry-meta a, -.format-chat .entry-content a { - color: #722d19; -} - -.format-chat .entry-meta .date a:before { - content: "\f108"; - margin-right: 2px; -} - -.format-chat .entry-meta .author { - display: none; -} - -.format-chat .chat { - margin: 0; -} - -.format-chat .chat .chat-timestamp { - color: #722d19; - float: right; - font-size: 12px; - font-weight: normal; - margin: 5px 10px 0; -} - -.format-chat .chat .fn { - font-style: normal; -} - -/* Gallery */ -.format-gallery { - background-color: #fbca3c; -} - -.format-gallery .entry-header { - margin-bottom: 15px; -} - -.format-gallery .entry-title { - font-size: 50px; - font-weight: 400; - margin: 0; -} - -.format-gallery .entry-meta a, -.format-gallery .entry-content a { - color: #722d19; -} - -/* Image */ -.format-image .entry-title { - font-size: 28px; - font-weight: bold; -} - -.format-image .categories-links, -.format-image .tags-links { - display: none; -} - -/* Link */ -.format-link { - background-color: #f7f5e7; -} - -.blog .format-link:first-of-type, -.single .format-link:first-of-type { - box-shadow: inset 0 2px 2px rgba(173, 165, 105, 0.2); -} - -.format-link .entry-header, -.format-link .entry-content p:last-child { - margin-bottom: 0; -} - -.format-link .entry-title { - color: #ca3c08; - display: inline; - font: 300 italic 20px "Source Sans Pro", Helvetica, sans-serif; - margin-right: 20px; -} - -.format-link .entry-title a { - color: #bc360a; -} - -.format-link div.entry-meta { - display: inline; -} - -/* Standard */ -.format-standard .wp-video, -.format-standard .wp-audio-shortcode, -.format-audio .wp-audio-shortcode, -.format-standard .video-player { - margin-bottom: 24px; -} - -/* Quote */ -.format-quote { - background-color: #210d10; -} - -.format-quote .entry-content, -.format-quote .entry-meta { - color: #f7f5e7; -} - -.format-quote .entry-content blockquote { - font-size: 28px; - margin: 0; -} - -.format-quote .entry-content a, -.format-quote .entry-meta a, -.format-quote .linked { - color: #e63f2a; -} - -.format-quote .entry-content cite a { - border-bottom: 1px dotted #fff; - color: #fff; -} - -.format-quote .entry-content cite a:hover { - text-decoration: none; -} - -.format-quote blockquote small, -.format-quote blockquote cite { - display: block; - font-size: 16px; -} - -.format-quote blockquote { - font-style: italic; - font-weight: 300; - padding-left: 75px; - position: relative; -} - -.format-quote blockquote:before { - content: '\201C'; - font-size: 140px; - font-weight: 400; - line-height: .8; - padding-right: 25px; - position: absolute; - left: -15px; - top: -3px; -} - -.format-quote .entry-meta .author { - display: none; -} - -/* Status */ -.format-status { - background-color: #722d19; - padding: 0; -} - -.format-status .entry-content, -.format-status .entry-meta { - padding-left: 35px; - position: relative; -} - -.format-status .entry-content a { - color: #eadaa6; -} - -.format-status .entry-meta a { - color: #f7f5e7; -} - -.sidebar .format-status .entry-content, -.sidebar .format-status .entry-meta { - padding-left: 95px; -} - -.format-status .entry-content:before, -.format-status .entry-meta:before { - background: url(images/dotted-line.png) repeat-y left bottom; - background-size: 4px 4px; - content: ""; - display: block; - height: 100%; - position: absolute; - left: 10px; - top: 0; - width: 1px; -} - -.sidebar .format-status .entry-content:before, -.sidebar .format-status .entry-meta:before { - left: 70px; -} - -.format-status .categories-links, -.format-status .tags-links { - display: none; -} - -/* Ensures the dots in the dot background are in lockstep. */ -.format-status .entry-meta:before { - background-position: left top; -} - -.format-status .entry-content { - color: #f7f5e7; - font-size: 24px; - font-style: italic; - font-weight: 300; - padding-bottom: 30px; - padding-top: 40px; - position: relative; -} - -.format-status .entry-content p:first-child:before { - background-color: rgba(0, 0, 0, 0.65); - content: ""; - height: 3px; - margin-top: 13px; - position: absolute; - left: 4px; - width: 13px; -} - -.sidebar .format-status .entry-content > p:first-child:before { - left: 64px; -} - -.format-status .entry-content p:last-child { - margin-bottom: 0; -} - -.format-status .entry-meta { - margin-top: 0; - padding-bottom: 40px; -} - -.format-status .entry-meta .date a:before { - content: "\f105"; -} - -/* Video */ -.format-video { - background-color: #db572f; -} - -.format-video .entry-content a, -.format-video .entry-meta a, -.format-video .entry-content a:hover, -.format-video .entry-meta a:hover { - color: #fbfaf3; -} - -.format-video .entry-title { - font-size: 50px; - font-weight: 400; -} - -.format-video .entry-meta { - color: #220e10; -} - - -/** - * 5.6 Attachments - * ---------------------------------------------------------------------------- - */ - -.attachment .hentry { - background-color: #e8e5ce; - margin: 0; - padding: 0; -} - -.attachment .entry-header { - margin-bottom: 0; - max-width: 1040px; - padding: 30px 0; -} - -.attachment .entry-title { - display: inline-block; - float: left; - font: 300 italic 30px "Source Sans Pro", Helvetica, sans-serif; - margin: 0; -} - -.attachment .entry-title:before { - content: "\f416"; - font-size: 32px; - margin-right: 10px; -} - -.attachment .entry-meta { - clear: none; - color: inherit; - float: right; - max-width: 604px; - padding: 9px 0 0; - text-align: right; -} - -.hentry.attachment:not(.image-attachment) .entry-meta { - max-width: 104px; -} - -.attachment footer.entry-meta { - display: none; -} - -.attachment-meta:before { - content: "\f307"; -} - -.full-size-link a:before { - content: "\f402"; -} - -.full-size-link:before { - content: none; -} - -.attachment .entry-meta a, -.attachment .entry-meta .edit-link:before, -.attachment .full-size-link:before { - color: #ca3c08; -} - -.attachment .entry-content { - background-color: #fff; - max-width: 100%; - padding: 40px 0; -} - -.image-navigation { - margin: 0 auto; - max-width: 1040px; - position: relative; -} - -.image-navigation a:hover { - text-decoration: none; -} - -.image-navigation .nav-previous, -.image-navigation .nav-next { - position: absolute; - top: 50px; -} - -.image-navigation .nav-previous { - left: 0; -} - -.image-navigation .nav-next { - right: 0; -} - -.image-navigation .meta-nav { - font-size: 32px; - font-weight: 300; - vertical-align: -4px; -} - -.attachment .entry-attachment, -.attachment .type-attachment p { - margin: 0 auto; - max-width: 724px; - text-align: center; -} - -.attachment .entry-attachment .attachment { - display: inline-block; -} - -.attachment .entry-caption { - text-align: left; -} - -.attachment .entry-description { - margin: 20px auto 0; - max-width: 604px; -} - -.attachment .entry-caption p:last-child, -.attachment .entry-description p:last-child { - margin: 0; -} - -.attachment .site-main .sidebar-container { - display: none; -} - -.attachment .entry-content .mejs-audio { - max-width: 400px; - margin: 0 auto; -} - -.attachment .entry-content .wp-video { - margin: 0 auto; -} - -.attachment .entry-content .mejs-container { - margin-bottom: 24px; -} - -/** - * 5.7 Post/Paging Navigation - * ---------------------------------------------------------------------------- - */ - -.navigation .nav-previous { - float: left; -} - -.navigation .nav-next { - float: right; -} - -.navigation a { - color: #bc360a; -} - -.navigation a:hover { - color: #ea9629; - text-decoration: none; -} - -.paging-navigation { - background-color: #e8e5ce; - padding: 40px 0; -} - -.paging-navigation .nav-links { - margin: 0 auto; - max-width: 604px; - width: 100%; -} - -.sidebar .paging-navigation .nav-links { - max-width: 1040px; - padding: 0 376px 0 60px; -} - -.paging-navigation .nav-next { - padding: 13px 0; -} - -.paging-navigation a { - font-size: 22px; - font-style: italic; - font-weight: 300; -} - -.paging-navigation .meta-nav { - background-color: #e63f2a; - border-radius: 50%; - color: #fff; - display: inline-block; - font-size: 26px; - padding: 3px 0 8px; - text-align: center; - width: 50px; -} - -.paging-navigation .nav-previous .meta-nav { - margin-right: 10px; - padding: 17px 0 23px; - width: 80px; -} - -.paging-navigation .nav-next .meta-nav { - margin-left: 10px; -} - -.paging-navigation a:hover .meta-nav { - background-color: #ea9629; - text-decoration: none; -} - -.post-navigation { - background-color: #fff; - color: #ca3c08; - font-size: 20px; - font-style: italic; - font-weight: 300; - padding: 20px 0; -} - -.post-navigation .nav-links { - margin: 0 auto; - max-width: 1040px; -} - -.sidebar .post-navigation .nav-links { - padding: 0 376px 0 60px; -} - -.post-navigation a[rel="next"] { - float: right; - text-align: right; -} - - -/** - * 5.8 Author Bio - * ---------------------------------------------------------------------------- - */ - -.author-info { - margin: 0 auto; - max-width: 604px; - padding: 30px 0 10px; - text-align: left; /* gallery & video post formats */ - width: 100%; -} - -.author.sidebar .author-info { - max-width: 1040px; - padding: 30px 376px 10px 60px; -} - -.single .author-info { - padding: 50px 0 0; -} - -.author-avatar .avatar { - float: left; - margin: 0 30px 30px 0; -} - -.single-format-status .author-description { - color: #f7f5e7; -} - -.author-description .author-title { - clear: none; - font: 300 italic 20px "Source Sans Pro", Helvetica, sans-serif; - margin: 0 0 8px; -} - -.author-link { - color: #ca3c08; - margin-left: 2px; -} - -.author.archive .author-link { - display: none; -} - - -/** - * 5.9 Archives - * ---------------------------------------------------------------------------- - */ - -.archive-header { - background-color: #e8e5ce; -} - -.archive-title, -.archive-meta { - font: 300 italic 30px "Source Sans Pro", Helvetica, sans-serif; - margin: 0 auto; - max-width: 1040px; - padding: 30px 0; - width: 100%; -} - -.archive-meta { - font-size: 16px; - font-style: normal; - font-weight: normal; - margin-top: -15px; - padding: 0 0 11px; -} - -.sidebar .archive-meta { - padding-right: 316px; -} - - -/** - * 5.10 Search Results/No posts - * ---------------------------------------------------------------------------- - */ - -.page-header { - background-color: #e8e5ce; -} - -.page-title { - font: 300 italic 30px "Source Sans Pro", Helvetica, sans-serif; - margin: 0 auto; - max-width: 1040px; - padding: 30px 0; - width: 100%; -} - -.page-content { - margin: 0 auto; - max-width: 604px; - padding: 40px 0; - width: 100%; -} - -.sidebar .page-content { - margin: 0 auto; - max-width: 1040px; - padding: 40px 376px 40px 60px; -} - - -/** - * 5.11 404 - * ---------------------------------------------------------------------------- - */ - -.error404 .page-header { - background-color: #fff; -} - -.error404 .page-title { - line-height: 0.6; - margin: 0; - padding: 300px; - position: relative; - text-align: center; - width: auto; -} - -.error404 .page-title:before { - color: #e8e5ce; - content: "\f423"; - font-size: 964px; - line-height: 0.6; - overflow: hidden; - position: absolute; - left: 7px; - top: 28px; -} - -.error404 .page-wrapper { - background-color: #e8e5ce; -} - -.error404 .page-header, -.error404 .page-content { - margin: 0 auto; - max-width: 1040px; - padding-bottom: 40px; - width: 100%; -} - - -/** - * 5.12 Comments - * ---------------------------------------------------------------------------- - */ - -.comments-title, -.comment-list, -.comment-reply-title, -.must-log-in, -.comment-respond .comment-form, -.comment-respond iframe { - display: block; - margin-left: auto; - margin-right: auto; - max-width: 604px; - width: 100%; -} - -.sidebar .comments-title, -.sidebar .comment-list, -.sidebar .must-log-in, -.sidebar .comment-reply-title, -.sidebar .comment-navigation, -.sidebar .comment-respond .comment-form { - max-width: 1040px; - padding-left: 60px; - padding-right: 376px; -} - -.comments-title { - font: 300 italic 28px "Source Sans Pro", Helvetica, sans-serif; -} - -.comment-list, -.comment-list .children { - list-style-type: none; - padding: 0; -} - -.comment-list .children { - margin-left: 20px; -} - -.comment-list > li:after, -.comment-list .children > li:before { - background: url(images/dotted-line.png) repeat left top; - background-size: 4px 4px; - content: ""; - display: block; - height: 1px; - width: 100%; -} - -.comment-list > li:last-child:after { - display: none; -} - -.comment-body { - padding: 24px 0; - position: relative; -} - -.comment-author { - float: left; - max-width: 74px; -} - -.comment-author .avatar { - display: block; - margin-bottom: 10px; -} - -.comment-author .fn { - word-wrap: break-word; -} - -.comment-author .fn, -.comment-author .url, -.comment-reply-link, -.comment-reply-login { - color: #bc360a; - font-size: 14px; - font-style: normal; - font-weight: normal; -} - -.says { - display: none; -} - -.no-avatars .comment-author { - margin: 0 0 5px; - max-width: 100%; - position: relative; -} - -.no-avatars .comment-metadata, -.no-avatars .comment-content, -.no-avatars .comment-list .reply { - width: 100%; -} - -.bypostauthor > .comment-body .fn:before { - content: "\f408"; - vertical-align: text-top; -} - -.comment-list .edit-link { - margin-left: 20px; -} - -.comment-metadata, -.comment-awaiting-moderation, -.comment-content, -.comment-list .reply { - float: right; - width: 79%; - width: -webkit-calc(100% - 124px); - width: calc(100% - 124px); - word-wrap: break-word; -} - -.comment-meta, -.comment-meta a { - color: #a2a2a2; - font-size: 13px; -} - -.comment-meta a:hover { - color: #ea9629; -} - -.comment-metadata { - margin-bottom: 20px; -} - -.ping-meta { - color: #a2a2a2; - font-size: 13px; - line-height: 2; -} - -.comment-awaiting-moderation { - color: #a2a2a2; -} - -.comment-awaiting-moderation:before { - content: "\f414"; - margin-right: 5px; - position: relative; - top: -2px; -} - -.comment-reply-link:before, -.comment-reply-login:before { - content: "\f412"; - margin-right: 3px; -} - -/* Comment form */ -.comment-respond { - background-color: #f7f5e7; - padding: 30px 0; -} - -.comment .comment-respond { - margin-bottom: 20px; - padding: 20px; -} - -.comment-reply-title { - font: 300 italic 28px "Source Sans Pro", Helvetica, sans-serif; -} - -.comment-reply-title small a { - color: #131310; - display: inline-block; - float: right; - height: 16px; - overflow: hidden; - width: 16px; -} - -.comment-reply-title small a:hover { - color: #ed331c; - text-decoration: none; -} - -.comment-reply-title small a:before { - content: "\f406"; - vertical-align: top; -} - -.sidebar .comment-list .comment-reply-title, -.sidebar .comment-list .comment-respond .comment-form { - padding: 0; -} - -.comment-form .comment-notes { - margin-bottom: 15px; -} - -.comment-form .comment-form-author, -.comment-form .comment-form-email, -.comment-form .comment-form-url { - margin-bottom: 8px; -} - -.comment-form [for="author"], -.comment-form [for="email"], -.comment-form [for="url"], -.comment-form [for="comment"] { - float: left; - padding: 5px 0; - width: 120px; -} - -.comment-form .required { - color: #ed331c; -} - -.comment-form input[type="text"], -.comment-form input[type="email"], -.comment-form input[type="url"] { - max-width: 270px; - width: 60%; -} - -.comment-form textarea { - width: 100%; -} - -.form-allowed-tags, -.form-allowed-tags code { - color: #686758; - font-size: 12px; -} - -.form-allowed-tags code { - font-size: 10px; - margin-left: 3px; -} - -.comment-list .pingback, -.comment-list .trackback { - padding-top: 24px; -} - -.comment-navigation { - font-size: 20px; - font-style: italic; - font-weight: 300; - margin: 0 auto; - max-width: 604px; - padding: 20px 0 30px; - width: 100%; -} - -.no-comments { - background-color: #f7f5e7; - font-size: 20px; - font-style: italic; - font-weight: 300; - margin: 0; - padding: 40px 0; - text-align: center; -} - -.sidebar .no-comments { - padding-left: 60px; - padding-right: 376px; -} - - -/** - * 5.13 Multisite - * ---------------------------------------------------------------------------- - */ - -.site-main .mu_register { - margin: 0 auto; - max-width: 604px; - width: 100%; -} - -.mu_alert { - margin-top: 25px; -} - -.site-main .mu_register input[type="submit"], -.site-main .mu_register #blog_title, -.site-main .mu_register #user_email, -.site-main .mu_register #blogname, -.site-main .mu_register #user_name { - font-size: inherit; - width: 270px; -} - -.site-main .mu_register input[type="submit"] { - width: auto; -} - - -/** - * 6.0 Sidebar - * ---------------------------------------------------------------------------- - */ - -.site-main .widget-area { - float: right; - width: 300px; -} - - -/** - * 6.1 Widgets - * ---------------------------------------------------------------------------- - */ - -.widget { - background-color: rgba(247, 245, 231, 0.7); - font-size: 14px; - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; - margin: 0 0 24px; - padding: 20px; - word-wrap: break-word; -} - -.widget .widget-title { - font: 300 italic 20px "Source Sans Pro", Helvetica, sans-serif; - margin: 0 0 10px; -} - -.widget ul, -.widget ol { - list-style-type: none; - margin: 0; - padding: 0; -} - -.widget li { - padding: 5px 0; -} - -.widget .children li:last-child { - padding-bottom: 0; -} - -.widget li > ul, -.widget li > ol { - margin-left: 20px; -} - -.widget a { - color: #bc360a; -} - -.widget a:hover { - color: #ea9629; -} - -/* Search widget */ -.search-form .search-submit { - display: none; -} - -/* RSS Widget */ -.widget_rss .rss-date { - display: block; -} - -.widget_rss .rss-date, -.widget_rss li > cite { - color: #a2a2a2; -} - -/* Calendar Widget */ -.widget_calendar table, -.widget_calendar td { - border: 0; - border-collapse: separate; - border-spacing: 1px; -} - -.widget_calendar caption { - font-size: 14px; - margin: 0; -} - -.widget_calendar th, -.widget_calendar td { - padding: 0; - text-align: center; -} - -.widget_calendar a { - display: block; -} - -.widget_calendar a:hover { - background-color: rgba(0, 0, 0, 0.15); -} - -.widget_calendar tbody td { - background-color: rgba(255, 255, 255, 0.5); -} - -.site-footer .widget_calendar tbody td { - background-color: rgba(255, 255, 255, 0.05); -} - -.widget_calendar tbody .pad, .site-footer .widget_calendar tbody .pad { - background-color: transparent; -} - - -/** - * 7.0 Footer - * ---------------------------------------------------------------------------- - */ - -.site-footer { - background-color: #e8e5ce; - color: #686758; - font-size: 14px; - text-align: center; -} - -.site-footer .widget-area, -.sidebar .site-footer { - text-align: left; -} - -.site-footer a { - color: #686758; -} - -.site-footer .sidebar-container { - background-color: #220e10; - padding: 20px 0; -} - -.site-footer .widget-area { - margin: 0 auto; - max-width: 1040px; - width: 100%; -} - -.sidebar .site-footer .widget-area { - max-width: 724px; - position: relative; - left: -158px; -} - -.site-footer .widget { - background: transparent; - color: #fff; - float: left; - margin-right: 20px; - width: 245px; -} - -.sidebar .site-footer .widget { - width: 228px; -} - -.sidebar .site-footer .widget:nth-of-type(4), -.sidebar .site-footer .widget:nth-of-type(3) { - margin-right: 0; -} - -.site-footer .widget a { - color: #e6402a; -} - -.site-footer .widget-title, -.site-footer .widget-title a, -.site-footer .wp-caption-text { - color: #fff; -} - -.site-info { - margin: 0 auto; - max-width: 1040px; - padding: 30px 0; - width: 100%; -} - -#wpstats { - display: block; - margin: -10px auto 0; -} - - -/** - * 8.0 Media Queries - * ---------------------------------------------------------------------------- - */ - -/* Does the same thing as , - * but in the future W3C standard way. -ms- prefix is required for IE10+ to - * render responsive styling in Windows 8 "snapped" views; IE10+ does not honor - * the meta tag. See https://core.trac.wordpress.org/ticket/25888. - */ -@-ms-viewport { - width: device-width; -} -@viewport { - width: device-width; -} - -@media (max-width: 1599px) { - .site { - border: 0; - } -} - -@media (max-width: 1069px) { - .sidebar img.alignleft, - .sidebar .wp-caption.alignleft { - margin-left: 0; - } - - .sidebar img.alignright, - .sidebar .wp-caption.alignright { - margin-right: 0; - } - - .error404 .page-header { - margin-left: auto; - max-width: 604px; - width: 100%; - } - - .archive-header, - .search .page-header, - .archive .page-header, - .blog .page-header, - .error404 .page-content, - .search .page-content, - .archive .page-content, - .attachment .entry-header, - .attachment .entry-content, - .post-navigation .nav-links, - .sidebar .site-info, - .site-footer .widget-area { - padding-left: 20px; - padding-right: 20px; - } - - .error404 .page-title { - font-size: 24px; - padding: 180px; - } - - .error404 .page-title:before { - font-size: 554px; - } - - .attachment .image-navigation { - max-width: 724px; - } - - .image-navigation .nav-previous, - .image-navigation .nav-next { - position: static; - } - - .site-main .widget-area { - margin-right: 60px; - } -} - -@media (max-width: 999px) { - .sidebar .entry-header, - .sidebar .entry-content, - .sidebar .entry-summary, - .sidebar .entry-meta, - .sidebar .comment-list, - .sidebar .comment-reply-title, - .sidebar .comment-navigation, - .sidebar .comment-respond .comment-form, - .sidebar .featured-gallery, - .sidebar .post-navigation .nav-links, - .author.sidebar .author-info { - max-width: 604px; - padding-left: 0; - padding-right: 0; - } - - .sidebar .site-info, - .search.sidebar .page-content, - .blog.sidebar .page-content, - .attachment .entry-header, - .sidebar .comments-title { - max-width: 604px; - } - - .sidebar .archive-meta, - .attachment .entry-header, - .search.sidebar .page-content, - .blog.sidebar .page-content, - .sidebar .site-info, - .sidebar .comments-title, - .sidebar .no-comments { - padding-left: 0; - padding-right: 0; - } - - .attachment .entry-meta { - float: left; - text-align: left; - width: 100%; - } - - .attachment .entry-content { - max-width: 100%; - padding: 40px 0; - } - - .format-status .entry-content { - padding-top: 40px; - } - - .format-status .entry-meta { - padding-bottom: 40px; - } - - .sidebar .format-status .entry-content, - .sidebar .format-status .entry-meta { - padding-left: 35px; - } - - .sidebar .format-status .entry-content:before, - .sidebar .format-status .entry-meta:before { - left: 10px; - } - - .sidebar .format-status .entry-content p:first-child:before { - left: 4px; - } - - .sidebar .paging-navigation .nav-links { - padding: 0 60px; - } - - .site-main .sidebar-container { - height: auto; - margin: 0 auto; - max-width: 604px; - position: relative; - top: 20px; - } - - .site-main .widget-area { - float: none; - margin: 0; - width: 100%; - } - - .sidebar .site-footer .widget-area { - max-width: 100%; - left: 0; - } -} - -/* Collapse oversized image and pulled images after iPad breakpoint. */ -@media (max-width: 767px) { - .site-header .home-link { - min-height: 0; - } - .site-title { - font-size: 36px; - padding: 8px 0 10px; - } - .entry-content img.alignleft, - .entry-content .wp-caption.alignleft { - margin-left: 0; - } - - .entry-content img.alignright, - .entry-content .wp-caption.alignright { - margin-right: 0; - } - - .attachment .image-navigation, - .attachment .entry-attachment .attachment { - max-width: 604px; - padding: 0; - width: 100%; - } - - .gallery-caption { - display: none; - } -} - -@media (max-width: 643px) { - .site-title { - font-size: 30px; - } - - #content .entry-header, - #content .entry-content, - #content .entry-summary, - #content footer.entry-meta, - #content .featured-gallery, - .search.sidebar .page-content, - .blog.sidebar .page-content, - .sidebar .post-navigation .nav-links, - .paging-navigation .nav-links, - #content .author-info, - .comments-area .comments-title, - .comments-area .comment-list, - .comments-area .comment-navigation, - .comment-respond, - .sidebar .site-info, - .sidebar .paging-navigation .nav-links { - padding-left: 20px; - padding-right: 20px; - } - - #content .format-status .entry-content, - #content .format-status .entry-met { - padding-left: 35px; - } - - /* Small menu */ - .menu-toggle { - cursor: pointer; - display: inline-block; - font: bold 16px/1.3 "Source Sans Pro", Helvetica, sans-serif; - margin: 0; - } - - .menu-toggle, - .menu-toggle:hover, - .menu-toggle:focus, - .menu-toggle:active { - background: none; - border: none; - color: #141412; - padding: 12px 0 12px 20px; - } - - .menu-toggle:focus { - outline: thin dotted; - } - - .menu-toggle:after { - content: "\f502"; - font-size: 12px; - padding-left: 8px; - vertical-align: -4px; - } - - .toggled-on .menu-toggle:after { - content: "\f500"; - vertical-align: 2px; - } - - .toggled-on .nav-menu, - .toggled-on .nav-menu > ul { - display: block; - margin-left: 0; - padding: 0; - width: 100%; - } - - .toggled-on li, - .toggled-on .children { - display: block; - } - - .toggled-on .nav-menu li > ul { - background-color: transparent; - display: block; - float: none; - margin-left: 20px; - position: relative; - left: auto; - top: auto; - } - - .toggled-on .nav-menu li > ul a { - color: #141412; - width: auto; - } - - .toggled-on .nav-menu li:hover > a, - .toggled-on .nav-menu .children a { - background-color: transparent; - color: #141412; - } - - .toggled-on .nav-menu > li a:hover, - .toggled-on .nav-menu > ul a:hover { - background-color: #db572f; - color: #fff; - } - - .toggled-on .nav-menu > li a:focus, - .toggled-on .nav-menu > ul a:focus { - background-color: #220e10; - color: #fff; - } - - ul.nav-menu, - div.nav-menu > ul { - display: none; - } - - #content .featured-gallery { - padding-left: 24px; - } - - .gallery-columns-1 .gallery-item { - margin-right: 0; - width: 100%; - } - - .entry-title, - .format-chat .entry-title, - .format-image .entry-title, - .format-gallery .entry-title, - .format-video .entry-title { - font-size: 22px; - font-weight: bold; - } - - .format-quote blockquote, - .format-status .entry-content { - font-size: 18px; - } - - .format-quote blockquote small, - .format-quote blockquote cite { - font-size: 13px; - } - - .error404 .page-title { - padding: 40px 0 0; - } - - .error404 .page-title:before { - content: normal; - } - - .comment-author { - margin-right: 30px; - } - - .comment-author .avatar { - height: auto; - max-width: 100%; - } - - .comment-metadata, - .comment-content, - .comment-list .reply { - width: 70%; - width: -webkit-calc(100% - 104px); - width: calc(100% - 104px); - } - - .comment-form input[type="text"], - .comment-form input[type="email"], - .comment-form input[type="url"] { - width: -webkit-calc(100% - 120px); - width: calc(100% - 120px); - } - - .comment-form textarea { - height: 80px; /* Smaller field for mobile. */ - } - - /* Audio */ - .format-audio .entry-content:before { - display: none; - } - - .format-audio .audio-content { - background-image: none; - float: none; - padding-left: 0; - width: auto; - } -} - -/* Mobile devices */ -@media (max-width: 359px) { - .site-title { - font-weight: normal; - } - .site-description { - clip: rect(1px, 1px, 1px, 1px); - position: absolute; - } - .gallery { - margin-left: 0; - } - - .gallery .gallery-item, - .gallery-columns-2.gallery-size-thumbnail .gallery-item { - max-width: none; - width: 49%; - width: -webkit-calc(50% - 4px); - width: calc(50% - 4px); - } - - .gallery-columns-1.gallery-size-medium, - .gallery-columns-1.gallery-size-thumbnail, - .gallery-columns-2.gallery-size-thumbnail, - .gallery-columns-3.gallery-size-thumbnail { - display: block; - } - - .gallery-columns-1 .gallery-item, - .gallery-columns-1.gallery-size-medium .gallery-item, - .gallery-columns-1.gallery-size-thumbnail .gallery-item { - text-align: center; - width: 98%; - width: -webkit-calc(100% - 4px); - width: calc(100% - 4px); - } - - .gallery-columns-3 .gallery-item:nth-of-type(3n), - .gallery-columns-5 .gallery-item:nth-of-type(5n), - .gallery-columns-7 .gallery-item:nth-of-type(7n), - .gallery-columns-9 .gallery-item:nth-of-type(9n) { - margin-right: 4px; - } - - .gallery br { - display: none; - } - - .gallery .gallery-item:nth-of-type(even) { - margin-right: 0; - } - - /* Comments */ - .comment-author { - margin: 0 0 5px; - max-width: 100%; - } - - .comment-author .avatar { - display: inline; - margin: 0 5px 0 0; - max-width: 20px; - } - - .comment-metadata, - .comment-content, - .comment-list .reply { - width: 100%; - } -} - - -/** - * 9.0 Print - * ---------------------------------------------------------------------------- - */ - -/* Retina-specific styles. */ -@media print, - (-o-min-device-pixel-ratio: 5/4), - (-webkit-min-device-pixel-ratio: 1.25), - (min-resolution: 120dpi) { - - .site-header .search-field { - background-image: url(images/search-icon-2x.png); - } - - .format-audio .audio-content, - .format-status .entry-content:before, - .format-status .entry-meta:before, - .comment-list > li:after, - .comment-list .children > li:before { - background-image: url(images/dotted-line-2x.png); - } -} - -@media print { - body { - background: none !important; - color: #000; - font-size: 10pt; - } - - footer a[rel="bookmark"]:link:after, - footer a[rel="bookmark"]:visited:after { - content: " [" attr(href) "] "; /* Show URLs */ - } - - .site { - max-width: 98%; - } - - .site-header { - background-image: none !important; - } - - .site-header .home-link { - max-width: none; - min-height: 0; - } - - .site-title { - color: #000; - font-size: 21pt; - } - - .site-description { - font-size: 10pt; - } - - .author-avatar, - .site-footer, - .comment-respond, - .comments-area .comment-edit-link, - .comments-area .reply, - .comments-link, - .entry-meta .edit-link, - .page-links, - .site-content nav, - .widget-area, - .main-navigation, - .navbar, - .more-link { - display: none; - } - - .entry-header, - .entry-content, - .entry-summary, - .entry-meta { - margin: 0; - width: 100%; - } - - .page-title, - .entry-title { - font-size: 21pt; - } - - .entry-meta, - .entry-meta a { - color: #444; - font-size: 10pt; - } - - .entry-content img.alignleft, - .entry-content .wp-caption.alignleft { - margin-left: 0; - } - - .entry-content img.alignright, - .entry-content .wp-caption.alignright { - margin-right: 0; - } - - .format-image .entry-content .size-full { - margin: 0; - } - - /* Remove colors from post formats */ - .hentry { - background-color: #fff; - } - - /* Comments */ - .comments-area > li.comment { - background: none; - position: relative; - width: auto; - } - - .comment-metadata { - float: none; - } - - .comment-author .fn, - .comment-reply-link, - .comment-reply-login { - color: #333; - } -} diff --git a/wp/wp-content/themes/twentythirteen/tag.php b/wp/wp-content/themes/twentythirteen/tag.php deleted file mode 100644 index f00180d3..00000000 --- a/wp/wp-content/themes/twentythirteen/tag.php +++ /dev/null @@ -1,43 +0,0 @@ - - -
      -
      - - -
      -

      - - -
      - -
      - - - - - - - - - - - - -
      -
      - - - diff --git a/wp/wp-content/themes/twentythirteen/taxonomy-post_format.php b/wp/wp-content/themes/twentythirteen/taxonomy-post_format.php deleted file mode 100644 index 3cf2970e..00000000 --- a/wp/wp-content/themes/twentythirteen/taxonomy-post_format.php +++ /dev/null @@ -1,41 +0,0 @@ - - -
      -
      - - -
      -

      ' . esc_html( get_post_format_string( get_post_format() ) ) . '' ); ?>

      -
      - - - - - - - - - - - - -
      -
      - - - diff --git a/wp/wp-content/themes/twentytwelve/404.php b/wp/wp-content/themes/twentytwelve/404.php deleted file mode 100644 index db3ef811..00000000 --- a/wp/wp-content/themes/twentytwelve/404.php +++ /dev/null @@ -1,29 +0,0 @@ - - -
      -
      - -
      -
      -

      -
      - -
      -

      - -
      -
      - -
      -
      - - \ No newline at end of file diff --git a/wp/wp-content/themes/twentytwelve/archive.php b/wp/wp-content/themes/twentytwelve/archive.php deleted file mode 100644 index f71ecf90..00000000 --- a/wp/wp-content/themes/twentytwelve/archive.php +++ /dev/null @@ -1,63 +0,0 @@ - - -
      -
      - - -
      -

      ' . get_the_date() . '' ); - elseif ( is_month() ) : - printf( __( 'Monthly Archives: %s', 'twentytwelve' ), '' . get_the_date( _x( 'F Y', 'monthly archives date format', 'twentytwelve' ) ) . '' ); - elseif ( is_year() ) : - printf( __( 'Yearly Archives: %s', 'twentytwelve' ), '' . get_the_date( _x( 'Y', 'yearly archives date format', 'twentytwelve' ) ) . '' ); - else : - _e( 'Archives', 'twentytwelve' ); - endif; - ?>

      -
      - - - - - - - -
      -
      - - - diff --git a/wp/wp-content/themes/twentytwelve/author.php b/wp/wp-content/themes/twentytwelve/author.php deleted file mode 100644 index 9a55c341..00000000 --- a/wp/wp-content/themes/twentytwelve/author.php +++ /dev/null @@ -1,84 +0,0 @@ - - -
      -
      - - - - - -
      -

      ' . get_the_author() . '' ); ?>

      -
      - - - - - - -
      -
      - -
      -
      -

      -

      -
      -
      - - - - - - - - - - - - - -
      -
      - - - diff --git a/wp/wp-content/themes/twentytwelve/category.php b/wp/wp-content/themes/twentytwelve/category.php deleted file mode 100644 index 02f13260..00000000 --- a/wp/wp-content/themes/twentytwelve/category.php +++ /dev/null @@ -1,51 +0,0 @@ - - -
      -
      - - -
      -

      ' . single_cat_title( '', false ) . '' ); ?>

      - - -
      - -
      - - - - - - - -
      -
      - - - diff --git a/wp/wp-content/themes/twentytwelve/comments.php b/wp/wp-content/themes/twentytwelve/comments.php deleted file mode 100644 index d6a733ef..00000000 --- a/wp/wp-content/themes/twentytwelve/comments.php +++ /dev/null @@ -1,60 +0,0 @@ - - -
      - - - - -

      - ' . get_the_title() . '' ); - ?> -

      - -
        - 'twentytwelve_comment', 'style' => 'ol' ) ); ?> -
      - - 1 && get_option( 'page_comments' ) ) : // are there comments to navigate through ?> - - - - -

      - - - - - - -
      \ No newline at end of file diff --git a/wp/wp-content/themes/twentytwelve/content-aside.php b/wp/wp-content/themes/twentytwelve/content-aside.php deleted file mode 100644 index 4a84ae76..00000000 --- a/wp/wp-content/themes/twentytwelve/content-aside.php +++ /dev/null @@ -1,28 +0,0 @@ - - -
      > -
      -

      -
      - →', 'twentytwelve' ) ); ?> -
      -
      - -
      - - - - - ', '' ); ?> -
      -
      diff --git a/wp/wp-content/themes/twentytwelve/content-image.php b/wp/wp-content/themes/twentytwelve/content-image.php deleted file mode 100644 index a683b83c..00000000 --- a/wp/wp-content/themes/twentytwelve/content-image.php +++ /dev/null @@ -1,28 +0,0 @@ - - -
      > -
      - →', 'twentytwelve' ) ); ?> -
      - -
      - -

      -

      -
      - - - - ', '' ); ?> -
      -
      diff --git a/wp/wp-content/themes/twentytwelve/content-link.php b/wp/wp-content/themes/twentytwelve/content-link.php deleted file mode 100644 index 31e4ec95..00000000 --- a/wp/wp-content/themes/twentytwelve/content-link.php +++ /dev/null @@ -1,26 +0,0 @@ - - -
      > -
      -
      - →', 'twentytwelve' ) ); ?> -
      - -
      - - - - - ', '' ); ?> -
      -
      diff --git a/wp/wp-content/themes/twentytwelve/content-none.php b/wp/wp-content/themes/twentytwelve/content-none.php deleted file mode 100644 index b7757821..00000000 --- a/wp/wp-content/themes/twentytwelve/content-none.php +++ /dev/null @@ -1,20 +0,0 @@ - - -
      -
      -

      -
      - -
      -

      - -
      -
      diff --git a/wp/wp-content/themes/twentytwelve/content-page.php b/wp/wp-content/themes/twentytwelve/content-page.php deleted file mode 100644 index 0abcbf79..00000000 --- a/wp/wp-content/themes/twentytwelve/content-page.php +++ /dev/null @@ -1,26 +0,0 @@ - - -
      > -
      - - - -

      -
      - -
      - - '' ) ); ?> -
      -
      - ', '' ); ?> -
      -
      diff --git a/wp/wp-content/themes/twentytwelve/content-quote.php b/wp/wp-content/themes/twentytwelve/content-quote.php deleted file mode 100644 index 0a98a96d..00000000 --- a/wp/wp-content/themes/twentytwelve/content-quote.php +++ /dev/null @@ -1,25 +0,0 @@ - - -
      > -
      - →', 'twentytwelve' ) ); ?> -
      - -
      - - - - - ', '' ); ?> -
      -
      diff --git a/wp/wp-content/themes/twentytwelve/content-status.php b/wp/wp-content/themes/twentytwelve/content-status.php deleted file mode 100644 index 55b72db6..00000000 --- a/wp/wp-content/themes/twentytwelve/content-status.php +++ /dev/null @@ -1,42 +0,0 @@ - - -
      > -
      -
      -

      -

      -
      - -
      - -
      - →', 'twentytwelve' ) ); ?> -
      - -
      - - - - ', '' ); ?> -
      -
      diff --git a/wp/wp-content/themes/twentytwelve/content.php b/wp/wp-content/themes/twentytwelve/content.php deleted file mode 100644 index 56493ed0..00000000 --- a/wp/wp-content/themes/twentytwelve/content.php +++ /dev/null @@ -1,73 +0,0 @@ - - -
      > - -
      - -
      - -
      - - - -

      - -

      - -

      - - - - -
      - - -
      - -
      - -
      - →', 'twentytwelve' ) ); ?> - '' ) ); ?> -
      - - - -
      diff --git a/wp/wp-content/themes/twentytwelve/css/ie.css b/wp/wp-content/themes/twentytwelve/css/ie.css deleted file mode 100644 index 706f5103..00000000 --- a/wp/wp-content/themes/twentytwelve/css/ie.css +++ /dev/null @@ -1,273 +0,0 @@ -/* -Styles for older IE versions (previous to IE9). -*/ - -body { - background-color: #e6e6e6; -} -body.custom-background-empty { - background-color: #fff; -} -body.custom-background-empty .site, -body.custom-background-white .site { - box-shadow: none; - margin-bottom: 0; - margin-top: 0; - padding: 0; -} -.assistive-text, -.site .screen-reader-text { - clip: rect(1px 1px 1px 1px); -} -.full-width .site-content { - float: none; - width: 100%; -} -img.size-full, -img.size-large, -img.header-image, -img.wp-post-image, -img[class*="align"], -img[class*="wp-image-"], -img[class*="attachment-"] { - width: auto; /* Prevent stretching of full-size and large-size images with height and width attributes in IE8 */ -} -.author-avatar { - float: left; - margin-top: 8px; - margin-top: 0.571428571rem; -} -.author-description { - float: right; - width: 80%; -} -.site { - box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3); - margin: 48px auto; - max-width: 960px; - overflow: hidden; - padding: 0 40px; -} -.site-content { - float: left; - width: 65.104166667%; -} -body.template-front-page .site-content, -body.attachment .site-content, -body.full-width .site-content { - width: 100%; -} -.widget-area { - float: right; - width: 26.041666667%; -} -.site-header h1, -.site-header h2 { - text-align: left; -} -.site-header h1 { - font-size: 26px; - line-height: 1.846153846; -} -.main-navigation ul.nav-menu, -.main-navigation div.nav-menu > ul { - border-bottom: 1px solid #ededed; - border-top: 1px solid #ededed; - display: inline-block !important; - text-align: left; - width: 100%; -} -.main-navigation ul { - margin: 0; - text-indent: 0; -} -.main-navigation li a, -.main-navigation li { - display: inline-block; - text-decoration: none; -} -.ie7 .main-navigation li a, -.ie7 .main-navigation li { - display: inline; -} -.main-navigation li a { - border-bottom: 0; - color: #6a6a6a; - line-height: 3.692307692; - text-transform: uppercase; -} -.main-navigation li a:hover { - color: #000; -} -.main-navigation li { - margin: 0 40px 0 0; - position: relative; -} -.main-navigation li ul { - margin: 0; - padding: 0; - position: absolute; - top: 100%; - z-index: 1; - height: 1px; - width: 1px; - overflow: hidden; - clip: rect(1px, 1px, 1px, 1px); -} -.ie7 .main-navigation li ul { - clip: inherit; - display: none; - left: 0; - overflow: visible; -} -.main-navigation li ul ul, -.ie7 .main-navigation li ul ul { - top: 0; - left: 100%; -} -.main-navigation ul li:hover > ul, -.main-navigation ul li:focus > ul, -.main-navigation .focus > ul { - border-left: 0; - clip: inherit; - overflow: inherit; - height: inherit; - width: inherit; -} -.ie7 .main-navigation ul li:hover > ul, -.ie7 .main-navigation ul li:focus > ul { - display: block; -} -.main-navigation li ul li a { - background: #efefef; - border-bottom: 1px solid #ededed; - display: block; - font-size: 11px; - line-height: 2.181818182; - padding: 8px 10px; - width: 180px; -} -.main-navigation li ul li a:hover { - background: #e3e3e3; - color: #444; -} -.main-navigation .current-menu-item > a, -.main-navigation .current-menu-ancestor > a, -.main-navigation .current_page_item > a, -.main-navigation .current_page_ancestor > a { - color: #636363; - font-weight: bold; -} -.main-navigation .menu-toggle { - display: none; -} -.entry-header .entry-title { - font-size: 22px; -} -#respond form input[type="text"] { - width: 46.333333333%; -} -#respond form textarea.blog-textarea { - width: 79.666666667%; -} -.template-front-page .site-content, -.template-front-page article { - overflow: hidden; -} -.template-front-page.has-post-thumbnail article { - float: left; - width: 47.916666667%; -} -.entry-page-image { - float: right; - margin-bottom: 0; - width: 47.916666667%; -} -/* IE Front Page Template Widget fix */ -.template-front-page .widget-area { - clear: both; -} -.template-front-page .widget { - width: 100% !important; - border: none; -} -.template-front-page .widget-area .widget, -.template-front-page .first.front-widgets, -.template-front-page.two-sidebars .widget-area .front-widgets { - float: left; - margin-bottom: 24px; - width: 51.875%; -} -.template-front-page .second.front-widgets, -.template-front-page .widget-area .widget:nth-child(odd) { - clear: right; -} -.template-front-page .first.front-widgets, -.template-front-page .second.front-widgets, -.template-front-page.two-sidebars .widget-area .front-widgets + .front-widgets { - float: right; - margin: 0 0 24px; - width: 39.0625%; -} -.template-front-page.two-sidebars .widget, -.template-front-page.two-sidebars .widget:nth-child(even) { - float: none; - width: auto; -} -/* add input font for ul { - text-align: right; -} -.rtl .main-navigation ul li ul li, -.rtl .main-navigation ul li ul li ul li { - margin-left: 40px; - margin-right: auto; -} -.rtl .main-navigation li ul ul { - position: absolute; - bottom: 0; - right: 100%; - z-index: 1; -} -.ie7 .rtl .main-navigation li ul ul { - position: absolute; - bottom: 0; - right: 100%; - z-index: 1; -} -.ie7 .rtl .main-navigation ul li { - z-index: 99; -} -.ie7 .rtl .main-navigation li ul { - position: absolute; - bottom: 100%; - right: 0; - z-index: 1; -} -.ie7 .rtl .main-navigation li { - margin-right: auto; - margin-left: 40px; -} -.ie7 .rtl .main-navigation li ul ul ul { - position: relative; - z-index: 1; -} \ No newline at end of file diff --git a/wp/wp-content/themes/twentytwelve/editor-style-rtl.css b/wp/wp-content/themes/twentytwelve/editor-style-rtl.css deleted file mode 100644 index 5fd832c6..00000000 --- a/wp/wp-content/themes/twentytwelve/editor-style-rtl.css +++ /dev/null @@ -1,28 +0,0 @@ -/* -Theme Name: Twenty Twelve -Description: Used to style the TinyMCE editor for RTL languages. -See also rtl.css file. -*/ - -html .mceContentBody { - direction: rtl; - unicode-bidi: embed; -} -li { - margin: 0 24px 0 0; - margin: 0 1.714285714rem 0 0; -} -dl { - margin: 0 24px; - margin: 0 1.714285714rem; -} -tr th { - text-align: right; -} -td { - padding: 6px 0 6px 10px; - text-align: right; -} -.wp-caption { - text-align: right; -} \ No newline at end of file diff --git a/wp/wp-content/themes/twentytwelve/editor-style.css b/wp/wp-content/themes/twentytwelve/editor-style.css deleted file mode 100644 index 24e9b24f..00000000 --- a/wp/wp-content/themes/twentytwelve/editor-style.css +++ /dev/null @@ -1,342 +0,0 @@ -/* -Theme Name: Twenty Twelve -Description: Used to style the TinyMCE editor. -*/ - -html { - font-size: 87.5%; -} -html .mceContentBody { - max-width: 625px; -} -body { - color: #444; - font-family: "Open Sans", Helvetica, Arial, sans-serif; - font-size: 14px; - font-size: 1rem; - line-height: 1; - text-rendering: optimizeLegibility; - vertical-align: baseline; -} - - -/* =Headings --------------------------------------------------------------- */ - -h1, -h2, -h3, -h4, -h5, -h6 { - clear: both; - line-height: 1.846153846; - margin: 24px 0; - margin: 1.714285714rem 0; -} -h1 { - font-size: 21px; - font-size: 1.5rem; - line-height: 1.5; -} -h2 { - font-size: 18px; - font-size: 1.285714286rem; - line-height: 1.6; -} -h3 { - font-size: 16px; - font-size: 1.142857143rem; -} -h4 { - font-size: 14px; - font-size: 1rem; -} -h5 { - font-size: 13px; - font-size: 0.928571429rem; -} -h6 { - font-size: 12px; - font-size: 0.857142857rem; -} -hr { - background-color: #ccc; - border: 0; - height: 1px; - margin: 24px; - margin-bottom: 1.714285714rem; -} - - -/* =Text elements --------------------------------------------------------------- */ - -p { - line-height: 1.714285714; - margin: 0 0 24px; - margin: 0 0 1.714285714rem; -} -ul, -ol { - margin: 0 0 24px; - margin: 0 0 1.714285714rem; - line-height: 1.714285714; - padding: 0; -} -ul { - list-style: disc outside; -} -ol { - list-style: decimal outside; -} -ul ul, -ol ol, -ul ol, -ol ul { - margin-bottom: 0; -} -li { - margin: 0 0 0 24px; - margin: 0 0 0 1.714285714rem; -} -dl { - margin: 0 24px; - margin: 0 1.714285714rem; -} -dt { - font-weight: bold; - margin-bottom: 24px; - margin-bottom: 1.714285714rem; -} -dd { - line-height: 1.714285714; - margin: 0 0 24px; - margin: 0 0 1.714285714rem; -} -strong { - font-weight: bold; -} -cite, -em, -i { - font-style: italic; -} -cite { - border: none; -} -big { - font-size: 128.571429%; -} -.mceContentBody blockquote { - font-style: italic !important; - font-weight: normal; - margin: 0; - padding: 24px; - padding: 1.714285714rem; -} -pre { - border: 1px solid #ededed; - color: #666; - font-family: Consolas, Monaco, Lucida Console, monospace; - font-size: 12px; - font-size: 0.857142857rem; - line-height: 1.714285714; - margin: 24px 0; - margin: 1.714285714rem 0; - overflow: auto; - padding: 24px; - padding: 1.714285714rem; -} -code, -kbd, -samp, -var { - font-family: Consolas, Monaco, Lucida Console, monospace; - font-size: 12px; - font-size: 0.857142857rem; - line-height: 2; -} -abbr, -acronym, -dfn { - border-bottom: 1px dotted #666; - cursor: help; -} -address { - display: block; - line-height: 1.714285714; - margin: 0 0 24px; - margin: 0 0 1.714285714rem; -} -del { - color: #333; -} -ins { - background: #fff9c0; - border: none; - color: #333; - text-decoration: none; -} -sup, -sub { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -input[type="text"] { - border: 1px solid #ccc; - border-radius: 3px; - font-family: inherit; - padding: 6px; - padding: 0.428571429rem; -} -textarea { - border: 1px solid #d5d2ca; - border-radius: 3px; - font-family: inherit; - font-size: 12px; - font-size: 0.857142857rem; - line-height: 1.714285714; - padding: 10px; - padding: 0.714285714rem; - width: 96%; -} - - -/* =Links --------------------------------------------------------------- */ - -a, -a em, -a strong { - color: #21759b; - outline: none; -} -a:focus, -a:active, -a:hover { - color: #0f3647; -} - - -/* =Alignment --------------------------------------------------------------- */ - -.alignleft { - display: inline; - float: left; - margin: 12px 24px 12px 0; - margin: 0.857142857rem 1.714285714rem 0.857142857rem 0; -} -.alignright { - display: inline; - float: right; - margin: 12px 0 12px 24px; - margin: 0.857142857rem 0 0.857142857rem 1.714285714rem; -} -.aligncenter { - clear: both; - display: block; - margin-top: 12px; - margin-top: 0.857142857rem; - margin-bottom: 12px; - margin-bottom: 0.857142857rem; -} - - -/* =Tables --------------------------------------------------------------- */ - -table { - border-bottom: 1px solid #ededed; - border-collapse: collapse; - border-spacing: 0; - color: #757575; - font-size: 12px; - font-size: 0.857142857rem; - line-height: 2; - margin: 0 0 24px; - margin: 0 0 1.714285714rem; - width: 100%; -} -tr th { - color: #636363; - font-size: 11px; - font-size: 0.785714286rem; - font-weight: bold; - line-height: 2.181818182; - text-align: left; - text-transform: uppercase; -} -td { - border-top: 1px solid #ededed !important; - color: #757575; - font-size: inherit; - font-weight: normal; - padding: 6px 10px 6px 0; - text-align: left; -} - - -/* =Images --------------------------------------------------------------- */ - -img, -.editor-attachment { - border: 0; - border-radius: 3px; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); - max-width: 100%; -} -img.size-full { - width: auto/9; /* Prevent stretching of full-size images in IE8 */ -} -img[class*="wp-image-"] { - height: auto; - max-width: 100%; -} -img[class*="align"], -img[class*="wp-image-"], -img[class*="attachment-"] { - height: auto; /* Make sure images with WordPress-added height and width attributes are scaled correctly */ -} -img.mce-wp-nextpage { - border-radius: 0; - box-shadow: none; -} -img.wp-smiley { - border: 0; - border-radius: 0; - box-shadow: none; - margin-bottom: 0; - margin-top: 0; - padding: 0; -} -.wp-caption { - background: transparent; - border: none; - margin: 0; - padding: 4px; - text-align: left; -} -.wp-caption-dt { - margin: 0; -} -.wp-caption .wp-caption-text, -.wp-caption-dd { - color: #757575; - font-style: italic; - font-size: 12px; - font-size: 0.857142857rem; - line-height: 2; - margin: 0 0 24px; - margin: 0 0 1.71429rem; -} diff --git a/wp/wp-content/themes/twentytwelve/footer.php b/wp/wp-content/themes/twentytwelve/footer.php deleted file mode 100644 index fe31e596..00000000 --- a/wp/wp-content/themes/twentytwelve/footer.php +++ /dev/null @@ -1,23 +0,0 @@ - -
      -
      -
      - - -
      -
      -
      - - - - \ No newline at end of file diff --git a/wp/wp-content/themes/twentytwelve/functions.php b/wp/wp-content/themes/twentytwelve/functions.php deleted file mode 100644 index 2dc2cd8b..00000000 --- a/wp/wp-content/themes/twentytwelve/functions.php +++ /dev/null @@ -1,561 +0,0 @@ - for posts and comments. - add_theme_support( 'automatic-feed-links' ); - - // This theme supports a variety of post formats. - add_theme_support( 'post-formats', array( 'aside', 'image', 'link', 'quote', 'status' ) ); - - // This theme uses wp_nav_menu() in one location. - register_nav_menu( 'primary', __( 'Primary Menu', 'twentytwelve' ) ); - - /* - * This theme supports custom background color and image, - * and here we also set up the default background color. - */ - add_theme_support( 'custom-background', array( - 'default-color' => 'e6e6e6', - ) ); - - // This theme uses a custom image size for featured images, displayed on "standard" posts. - add_theme_support( 'post-thumbnails' ); - set_post_thumbnail_size( 624, 9999 ); // Unlimited height, soft crop - - // Indicate widget sidebars can use selective refresh in the Customizer. - add_theme_support( 'customize-selective-refresh-widgets' ); -} -add_action( 'after_setup_theme', 'twentytwelve_setup' ); - -/** - * Add support for a custom header image. - */ -require( get_template_directory() . '/inc/custom-header.php' ); - -/** - * Return the Google font stylesheet URL if available. - * - * The use of Open Sans by default is localized. For languages that use - * characters not supported by the font, the font can be disabled. - * - * @since Twenty Twelve 1.2 - * - * @return string Font stylesheet or empty string if disabled. - */ -function twentytwelve_get_font_url() { - $font_url = ''; - - /* translators: If there are characters in your language that are not supported - * by Open Sans, translate this to 'off'. Do not translate into your own language. - */ - if ( 'off' !== _x( 'on', 'Open Sans font: on or off', 'twentytwelve' ) ) { - $subsets = 'latin,latin-ext'; - - /* translators: To add an additional Open Sans character subset specific to your language, - * translate this to 'greek', 'cyrillic' or 'vietnamese'. Do not translate into your own language. - */ - $subset = _x( 'no-subset', 'Open Sans font: add new subset (greek, cyrillic, vietnamese)', 'twentytwelve' ); - - if ( 'cyrillic' == $subset ) - $subsets .= ',cyrillic,cyrillic-ext'; - elseif ( 'greek' == $subset ) - $subsets .= ',greek,greek-ext'; - elseif ( 'vietnamese' == $subset ) - $subsets .= ',vietnamese'; - - $query_args = array( - 'family' => 'Open+Sans:400italic,700italic,400,700', - 'subset' => $subsets, - ); - $font_url = add_query_arg( $query_args, 'https://fonts.googleapis.com/css' ); - } - - return $font_url; -} - -/** - * Enqueue scripts and styles for front end. - * - * @since Twenty Twelve 1.0 - */ -function twentytwelve_scripts_styles() { - global $wp_styles; - - /* - * Adds JavaScript to pages with the comment form to support - * sites with threaded comments (when in use). - */ - if ( is_singular() && comments_open() && get_option( 'thread_comments' ) ) - wp_enqueue_script( 'comment-reply' ); - - // Adds JavaScript for handling the navigation menu hide-and-show behavior. - wp_enqueue_script( 'twentytwelve-navigation', get_template_directory_uri() . '/js/navigation.js', array( 'jquery' ), '20140711', true ); - - $font_url = twentytwelve_get_font_url(); - if ( ! empty( $font_url ) ) - wp_enqueue_style( 'twentytwelve-fonts', esc_url_raw( $font_url ), array(), null ); - - // Loads our main stylesheet. - wp_enqueue_style( 'twentytwelve-style', get_stylesheet_uri() ); - - // Loads the Internet Explorer specific stylesheet. - wp_enqueue_style( 'twentytwelve-ie', get_template_directory_uri() . '/css/ie.css', array( 'twentytwelve-style' ), '20121010' ); - $wp_styles->add_data( 'twentytwelve-ie', 'conditional', 'lt IE 9' ); -} -add_action( 'wp_enqueue_scripts', 'twentytwelve_scripts_styles' ); - -/** - * Add preconnect for Google Fonts. - * - * @since Twenty Twelve 2.2 - * - * @param array $urls URLs to print for resource hints. - * @param string $relation_type The relation type the URLs are printed. - * @return array URLs to print for resource hints. - */ -function twentytwelve_resource_hints( $urls, $relation_type ) { - if ( wp_style_is( 'twentytwelve-fonts', 'queue' ) && 'preconnect' === $relation_type ) { - if ( version_compare( $GLOBALS['wp_version'], '4.7-alpha', '>=' ) ) { - $urls[] = array( - 'href' => 'https://fonts.gstatic.com', - 'crossorigin', - ); - } else { - $urls[] = 'https://fonts.gstatic.com'; - } - } - - return $urls; -} -add_filter( 'wp_resource_hints', 'twentytwelve_resource_hints', 10, 2 ); - -/** - * Filter TinyMCE CSS path to include Google Fonts. - * - * Adds additional stylesheets to the TinyMCE editor if needed. - * - * @uses twentytwelve_get_font_url() To get the Google Font stylesheet URL. - * - * @since Twenty Twelve 1.2 - * - * @param string $mce_css CSS path to load in TinyMCE. - * @return string Filtered CSS path. - */ -function twentytwelve_mce_css( $mce_css ) { - $font_url = twentytwelve_get_font_url(); - - if ( empty( $font_url ) ) - return $mce_css; - - if ( ! empty( $mce_css ) ) - $mce_css .= ','; - - $mce_css .= esc_url_raw( str_replace( ',', '%2C', $font_url ) ); - - return $mce_css; -} -add_filter( 'mce_css', 'twentytwelve_mce_css' ); - -/** - * Filter the page title. - * - * Creates a nicely formatted and more specific title element text - * for output in head of document, based on current view. - * - * @since Twenty Twelve 1.0 - * - * @param string $title Default title text for current view. - * @param string $sep Optional separator. - * @return string Filtered title. - */ -function twentytwelve_wp_title( $title, $sep ) { - global $paged, $page; - - if ( is_feed() ) - return $title; - - // Add the site name. - $title .= get_bloginfo( 'name', 'display' ); - - // Add the site description for the home/front page. - $site_description = get_bloginfo( 'description', 'display' ); - if ( $site_description && ( is_home() || is_front_page() ) ) - $title = "$title $sep $site_description"; - - // Add a page number if necessary. - if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) - $title = "$title $sep " . sprintf( __( 'Page %s', 'twentytwelve' ), max( $paged, $page ) ); - - return $title; -} -add_filter( 'wp_title', 'twentytwelve_wp_title', 10, 2 ); - -/** - * Filter the page menu arguments. - * - * Makes our wp_nav_menu() fallback -- wp_page_menu() -- show a home link. - * - * @since Twenty Twelve 1.0 - */ -function twentytwelve_page_menu_args( $args ) { - if ( ! isset( $args['show_home'] ) ) - $args['show_home'] = true; - return $args; -} -add_filter( 'wp_page_menu_args', 'twentytwelve_page_menu_args' ); - -/** - * Register sidebars. - * - * Registers our main widget area and the front page widget areas. - * - * @since Twenty Twelve 1.0 - */ -function twentytwelve_widgets_init() { - register_sidebar( array( - 'name' => __( 'Main Sidebar', 'twentytwelve' ), - 'id' => 'sidebar-1', - 'description' => __( 'Appears on posts and pages except the optional Front Page template, which has its own widgets', 'twentytwelve' ), - 'before_widget' => '', - 'before_title' => '

      ', - 'after_title' => '

      ', - ) ); - - register_sidebar( array( - 'name' => __( 'First Front Page Widget Area', 'twentytwelve' ), - 'id' => 'sidebar-2', - 'description' => __( 'Appears when using the optional Front Page template with a page set as Static Front Page', 'twentytwelve' ), - 'before_widget' => '', - 'before_title' => '

      ', - 'after_title' => '

      ', - ) ); - - register_sidebar( array( - 'name' => __( 'Second Front Page Widget Area', 'twentytwelve' ), - 'id' => 'sidebar-3', - 'description' => __( 'Appears when using the optional Front Page template with a page set as Static Front Page', 'twentytwelve' ), - 'before_widget' => '', - 'before_title' => '

      ', - 'after_title' => '

      ', - ) ); -} -add_action( 'widgets_init', 'twentytwelve_widgets_init' ); - -if ( ! function_exists( 'twentytwelve_content_nav' ) ) : -/** - * Displays navigation to next/previous pages when applicable. - * - * @since Twenty Twelve 1.0 - */ -function twentytwelve_content_nav( $html_id ) { - global $wp_query; - - if ( $wp_query->max_num_pages > 1 ) : ?> - - comment_type ) : - case 'pingback' : - case 'trackback' : - // Display trackbacks differently than normal comments. - ?> -
    5. id="comment-"> -

      ', '' ); ?>

      - -
    6. id="li-comment-"> -
      -
      - %1$s %2$s', - get_comment_author_link(), - // If current post author is also comment author, make it known visually. - ( $comment->user_id === $post->post_author ) ? '' . __( 'Post author', 'twentytwelve' ) . '' : '' - ); - printf( '', - esc_url( get_comment_link( $comment->comment_ID ) ), - get_comment_time( 'c' ), - /* translators: 1: date, 2: time */ - sprintf( __( '%1$s at %2$s', 'twentytwelve' ), get_comment_date(), get_comment_time() ) - ); - ?> -
      - - comment_approved ) : ?> -

      - - -
      - - ', '

      ' ); ?> -
      - -
      - __( 'Reply', 'twentytwelve' ), 'after' => ' ↓', 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?> -
      -
      - ', - esc_url( get_permalink() ), - esc_attr( get_the_time() ), - esc_attr( get_the_date( 'c' ) ), - esc_html( get_the_date() ) - ); - - $author = sprintf( '', - esc_url( get_author_posts_url( get_the_author_meta( 'ID' ) ) ), - esc_attr( sprintf( __( 'View all posts by %s', 'twentytwelve' ), get_the_author() ) ), - get_the_author() - ); - - // Translators: 1 is category, 2 is tag, 3 is the date and 4 is the author's name. - if ( $tag_list ) { - $utility_text = __( 'This entry was posted in %1$s and tagged %2$s on %3$s by %4$s.', 'twentytwelve' ); - } elseif ( $categories_list ) { - $utility_text = __( 'This entry was posted in %1$s on %3$s by %4$s.', 'twentytwelve' ); - } else { - $utility_text = __( 'This entry was posted on %3$s by %4$s.', 'twentytwelve' ); - } - - printf( - $utility_text, - $categories_list, - $tag_list, - $date, - $author - ); -} -endif; - -/** - * Extend the default WordPress body classes. - * - * Extends the default WordPress body class to denote: - * 1. Using a full-width layout, when no active widgets in the sidebar - * or full-width template. - * 2. Front Page template: thumbnail in use and number of sidebars for - * widget areas. - * 3. White or empty background color to change the layout and spacing. - * 4. Custom fonts enabled. - * 5. Single or multiple authors. - * - * @since Twenty Twelve 1.0 - * - * @param array $classes Existing class values. - * @return array Filtered class values. - */ -function twentytwelve_body_class( $classes ) { - $background_color = get_background_color(); - $background_image = get_background_image(); - - if ( ! is_active_sidebar( 'sidebar-1' ) || is_page_template( 'page-templates/full-width.php' ) ) - $classes[] = 'full-width'; - - if ( is_page_template( 'page-templates/front-page.php' ) ) { - $classes[] = 'template-front-page'; - if ( has_post_thumbnail() ) - $classes[] = 'has-post-thumbnail'; - if ( is_active_sidebar( 'sidebar-2' ) && is_active_sidebar( 'sidebar-3' ) ) - $classes[] = 'two-sidebars'; - } - - if ( empty( $background_image ) ) { - if ( empty( $background_color ) ) - $classes[] = 'custom-background-empty'; - elseif ( in_array( $background_color, array( 'fff', 'ffffff' ) ) ) - $classes[] = 'custom-background-white'; - } - - // Enable custom font class only if the font CSS is queued to load. - if ( wp_style_is( 'twentytwelve-fonts', 'queue' ) ) - $classes[] = 'custom-font-enabled'; - - if ( ! is_multi_author() ) - $classes[] = 'single-author'; - - return $classes; -} -add_filter( 'body_class', 'twentytwelve_body_class' ); - -/** - * Adjust content width in certain contexts. - * - * Adjusts content_width value for full-width and single image attachment - * templates, and when there are no active widgets in the sidebar. - * - * @since Twenty Twelve 1.0 - */ -function twentytwelve_content_width() { - if ( is_page_template( 'page-templates/full-width.php' ) || is_attachment() || ! is_active_sidebar( 'sidebar-1' ) ) { - global $content_width; - $content_width = 960; - } -} -add_action( 'template_redirect', 'twentytwelve_content_width' ); - -/** - * Register postMessage support. - * - * Add postMessage support for site title and description for the Customizer. - * - * @since Twenty Twelve 1.0 - * - * @param WP_Customize_Manager $wp_customize Customizer object. - */ -function twentytwelve_customize_register( $wp_customize ) { - $wp_customize->get_setting( 'blogname' )->transport = 'postMessage'; - $wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage'; - $wp_customize->get_setting( 'header_textcolor' )->transport = 'postMessage'; - - if ( isset( $wp_customize->selective_refresh ) ) { - $wp_customize->selective_refresh->add_partial( 'blogname', array( - 'selector' => '.site-title > a', - 'container_inclusive' => false, - 'render_callback' => 'twentytwelve_customize_partial_blogname', - ) ); - $wp_customize->selective_refresh->add_partial( 'blogdescription', array( - 'selector' => '.site-description', - 'container_inclusive' => false, - 'render_callback' => 'twentytwelve_customize_partial_blogdescription', - ) ); - } -} -add_action( 'customize_register', 'twentytwelve_customize_register' ); - -/** - * Render the site title for the selective refresh partial. - * - * @since Twenty Twelve 2.0 - * @see twentytwelve_customize_register() - * - * @return void - */ -function twentytwelve_customize_partial_blogname() { - bloginfo( 'name' ); -} - -/** - * Render the site tagline for the selective refresh partial. - * - * @since Twenty Twelve 2.0 - * @see twentytwelve_customize_register() - * - * @return void - */ -function twentytwelve_customize_partial_blogdescription() { - bloginfo( 'description' ); -} - -/** - * Enqueue Javascript postMessage handlers for the Customizer. - * - * Binds JS handlers to make the Customizer preview reload changes asynchronously. - * - * @since Twenty Twelve 1.0 - */ -function twentytwelve_customize_preview_js() { - wp_enqueue_script( 'twentytwelve-customizer', get_template_directory_uri() . '/js/theme-customizer.js', array( 'customize-preview' ), '20141120', true ); -} -add_action( 'customize_preview_init', 'twentytwelve_customize_preview_js' ); diff --git a/wp/wp-content/themes/twentytwelve/header.php b/wp/wp-content/themes/twentytwelve/header.php deleted file mode 100644 index c3b99d6f..00000000 --- a/wp/wp-content/themes/twentytwelve/header.php +++ /dev/null @@ -1,53 +0,0 @@ - section and everything up till
      - * - * @package WordPress - * @subpackage Twenty_Twelve - * @since Twenty Twelve 1.0 - */ -?> - - - -> - - - - -<?php wp_title( '|', true, 'right' ); ?> - - - - - - - -> -
      - - -
      \ No newline at end of file diff --git a/wp/wp-content/themes/twentytwelve/image.php b/wp/wp-content/themes/twentytwelve/image.php deleted file mode 100644 index 976e017d..00000000 --- a/wp/wp-content/themes/twentytwelve/image.php +++ /dev/null @@ -1,116 +0,0 @@ - - -
      -
      - - - -
      > -
      -

      - -
      - Published at %4$s × %5$s in %8$s.', 'twentytwelve' ), - esc_attr( get_the_date( 'c' ) ), - esc_html( get_the_date() ), - esc_url( wp_get_attachment_url() ), - $metadata['width'], - $metadata['height'], - esc_url( get_permalink( $post->post_parent ) ), - esc_attr( strip_tags( get_the_title( $post->post_parent ) ) ), - get_the_title( $post->post_parent ) - ); - ?> - ', '' ); ?> -
      - - -
      - -
      - -
      -
      - $post->post_parent, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => 'ASC', 'orderby' => 'menu_order ID' ) ) ); -foreach ( $attachments as $k => $attachment ) : - if ( $attachment->ID == $post->ID ) - break; -endforeach; - -// If there is more than 1 attachment in a gallery -if ( count( $attachments ) > 1 ) : - $k++; - if ( isset( $attachments[ $k ] ) ) : - // get the URL of the next image attachment - $next_attachment_url = get_attachment_link( $attachments[ $k ]->ID ); - else : - // or get the URL of the first image attachment - $next_attachment_url = get_attachment_link( $attachments[0]->ID ); - endif; -else : - // or, if there's only 1 image, get the URL of the image - $next_attachment_url = wp_get_attachment_url(); -endif; -?> - ID, $attachment_size ); - ?> - - post_excerpt ) ) : ?> -
      - -
      - -
      - -
      - -
      - - '' ) ); ?> -
      - -
      - -
      - - - - - -
      -
      - - diff --git a/wp/wp-content/themes/twentytwelve/inc/custom-header.php b/wp/wp-content/themes/twentytwelve/inc/custom-header.php deleted file mode 100644 index baedf18b..00000000 --- a/wp/wp-content/themes/twentytwelve/inc/custom-header.php +++ /dev/null @@ -1,163 +0,0 @@ - '515151', - 'default-image' => '', - - // Set height and width, with a maximum value for the width. - 'height' => 250, - 'width' => 960, - 'max-width' => 2000, - - // Support flexible height and width. - 'flex-height' => true, - 'flex-width' => true, - - // Random image rotation off by default. - 'random-default' => false, - - // Callbacks for styling the header and the admin preview. - 'wp-head-callback' => 'twentytwelve_header_style', - 'admin-head-callback' => 'twentytwelve_admin_header_style', - 'admin-preview-callback' => 'twentytwelve_admin_header_image', - ); - - add_theme_support( 'custom-header', $args ); -} -add_action( 'after_setup_theme', 'twentytwelve_custom_header_setup' ); - -/** - * Load our special font CSS file. - * - * @since Twenty Twelve 1.2 - */ -function twentytwelve_custom_header_fonts() { - $font_url = twentytwelve_get_font_url(); - if ( ! empty( $font_url ) ) - wp_enqueue_style( 'twentytwelve-fonts', esc_url_raw( $font_url ), array(), null ); -} -add_action( 'admin_print_styles-appearance_page_custom-header', 'twentytwelve_custom_header_fonts' ); - -/** - * Style the header text displayed on the blog. - * - * get_header_textcolor() options: 515151 is default, hide text (returns 'blank'), or any hex value. - * - * @since Twenty Twelve 1.0 - */ -function twentytwelve_header_style() { - $text_color = get_header_textcolor(); - - // If no custom options for text are set, let's bail - if ( $text_color == get_theme_support( 'custom-header', 'default-text-color' ) ) - return; - - // If we get this far, we have custom styles. - ?> - - Header admin panel. - * - * @since Twenty Twelve 1.0 - */ -function twentytwelve_admin_header_style() { -?> - - Header admin panel. - * - * This callback overrides the default markup displayed there. - * - * @since Twenty Twelve 1.0 - */ -function twentytwelve_admin_header_image() { - $style = 'color: #' . get_header_textcolor() . ';'; - if ( ! display_header_text() ) { - $style = 'display: none;'; - } - ?> -
      -

      -

      - - - -
      - - -
      -
      - - - - - - - - - - - -
      - - -
      -

      -
      - -
      -

      Get started here.', 'twentytwelve' ), admin_url( 'post-new.php' ) ); ?>

      -
      - - -
      -

      -
      - -
      -

      - -
      - - -
      - - - -
      -
      - - - diff --git a/wp/wp-content/themes/twentytwelve/js/html5.js b/wp/wp-content/themes/twentytwelve/js/html5.js deleted file mode 100644 index 6168aacd..00000000 --- a/wp/wp-content/themes/twentytwelve/js/html5.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed -*/ -(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); -a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; -c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| -"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); -if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d
      |[0-9,]+) +([^ ]{0,11}) +(.+)$#', $line, $matches)) { - list($dummy, $date, $time, $ampm, $filesize, $shortname, $filename) = $matches; - if ((strtoupper($filesize) == '') && (strtolower($filename) == strtolower($value))) { - $value = $shortname; - } - } - } - } else { - $this->startup_warning .= 'GETID3_HELPERAPPSDIR must not have any spaces in it - use 8dot3 naming convention if neccesary. You can run "dir /x" from the commandline to see the correct 8.3-style names.'; - } - } - $path_so_far[] = $value; - } - $helperappsdir = implode(DIRECTORY_SEPARATOR, $path_so_far); - } - define('GETID3_HELPERAPPSDIR', $helperappsdir.DIRECTORY_SEPARATOR); - } - - return true; - } - - public function version() { - return self::VERSION; - } - - public function fread_buffer_size() { - return $this->option_fread_buffer_size; - } - - - // public: setOption - public function setOption($optArray) { - if (!is_array($optArray) || empty($optArray)) { - return false; - } - foreach ($optArray as $opt => $val) { - if (isset($this->$opt) === false) { - continue; - } - $this->$opt = $val; - } - return true; - } - - - public function openfile($filename) { - try { - if (!empty($this->startup_error)) { - throw new getid3_exception($this->startup_error); - } - if (!empty($this->startup_warning)) { - $this->warning($this->startup_warning); - } - - // init result array and set parameters - $this->filename = $filename; - $this->info = array(); - $this->info['GETID3_VERSION'] = $this->version(); - $this->info['php_memory_limit'] = (($this->memory_limit > 0) ? $this->memory_limit : false); - - // remote files not supported - if (preg_match('/^(ht|f)tp:\/\//', $filename)) { - throw new getid3_exception('Remote files are not supported - please copy the file locally first'); - } - - $filename = str_replace('/', DIRECTORY_SEPARATOR, $filename); - $filename = preg_replace('#(.+)'.preg_quote(DIRECTORY_SEPARATOR).'{2,}#U', '\1'.DIRECTORY_SEPARATOR, $filename); - - // open local file - //if (is_readable($filename) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) { // see http://www.getid3.org/phpBB3/viewtopic.php?t=1720 - if ((is_readable($filename) || file_exists($filename)) && is_file($filename) && ($this->fp = fopen($filename, 'rb'))) { - // great - } else { - $errormessagelist = array(); - if (!is_readable($filename)) { - $errormessagelist[] = '!is_readable'; - } - if (!is_file($filename)) { - $errormessagelist[] = '!is_file'; - } - if (!file_exists($filename)) { - $errormessagelist[] = '!file_exists'; - } - if (empty($errormessagelist)) { - $errormessagelist[] = 'fopen failed'; - } - throw new getid3_exception('Could not open "'.$filename.'" ('.implode('; ', $errormessagelist).')'); - } - - $this->info['filesize'] = filesize($filename); - // set redundant parameters - might be needed in some include file - // filenames / filepaths in getID3 are always expressed with forward slashes (unix-style) for both Windows and other to try and minimize confusion - $filename = str_replace('\\', '/', $filename); - $this->info['filepath'] = str_replace('\\', '/', realpath(dirname($filename))); - $this->info['filename'] = getid3_lib::mb_basename($filename); - $this->info['filenamepath'] = $this->info['filepath'].'/'.$this->info['filename']; - - - // option_max_2gb_check - if ($this->option_max_2gb_check) { - // PHP (32-bit all, and 64-bit Windows) doesn't support integers larger than 2^31 (~2GB) - // filesize() simply returns (filesize % (pow(2, 32)), no matter the actual filesize - // ftell() returns 0 if seeking to the end is beyond the range of unsigned integer - $fseek = fseek($this->fp, 0, SEEK_END); - if (($fseek < 0) || (($this->info['filesize'] != 0) && (ftell($this->fp) == 0)) || - ($this->info['filesize'] < 0) || - (ftell($this->fp) < 0)) { - $real_filesize = getid3_lib::getFileSizeSyscall($this->info['filenamepath']); - - if ($real_filesize === false) { - unset($this->info['filesize']); - fclose($this->fp); - throw new getid3_exception('Unable to determine actual filesize. File is most likely larger than '.round(PHP_INT_MAX / 1073741824).'GB and is not supported by PHP.'); - } elseif (getid3_lib::intValueSupported($real_filesize)) { - unset($this->info['filesize']); - fclose($this->fp); - throw new getid3_exception('PHP seems to think the file is larger than '.round(PHP_INT_MAX / 1073741824).'GB, but filesystem reports it as '.number_format($real_filesize, 3).'GB, please report to info@getid3.org'); - } - $this->info['filesize'] = $real_filesize; - $this->warning('File is larger than '.round(PHP_INT_MAX / 1073741824).'GB (filesystem reports it as '.number_format($real_filesize, 3).'GB) and is not properly supported by PHP.'); - } - } - - // set more parameters - $this->info['avdataoffset'] = 0; - $this->info['avdataend'] = $this->info['filesize']; - $this->info['fileformat'] = ''; // filled in later - $this->info['audio']['dataformat'] = ''; // filled in later, unset if not used - $this->info['video']['dataformat'] = ''; // filled in later, unset if not used - $this->info['tags'] = array(); // filled in later, unset if not used - $this->info['error'] = array(); // filled in later, unset if not used - $this->info['warning'] = array(); // filled in later, unset if not used - $this->info['comments'] = array(); // filled in later, unset if not used - $this->info['encoding'] = $this->encoding; // required by id3v2 and iso modules - can be unset at the end if desired - - return true; - - } catch (Exception $e) { - $this->error($e->getMessage()); - } - return false; - } - - // public: analyze file - public function analyze($filename) { - try { - if (!$this->openfile($filename)) { - return $this->info; - } - - // Handle tags - foreach (array('id3v2'=>'id3v2', 'id3v1'=>'id3v1', 'apetag'=>'ape', 'lyrics3'=>'lyrics3') as $tag_name => $tag_key) { - $option_tag = 'option_tag_'.$tag_name; - if ($this->$option_tag) { - $this->include_module('tag.'.$tag_name); - try { - $tag_class = 'getid3_'.$tag_name; - $tag = new $tag_class($this); - $tag->Analyze(); - } - catch (getid3_exception $e) { - throw $e; - } - } - } - if (isset($this->info['id3v2']['tag_offset_start'])) { - $this->info['avdataoffset'] = max($this->info['avdataoffset'], $this->info['id3v2']['tag_offset_end']); - } - foreach (array('id3v1'=>'id3v1', 'apetag'=>'ape', 'lyrics3'=>'lyrics3') as $tag_name => $tag_key) { - if (isset($this->info[$tag_key]['tag_offset_start'])) { - $this->info['avdataend'] = min($this->info['avdataend'], $this->info[$tag_key]['tag_offset_start']); - } - } - - // ID3v2 detection (NOT parsing), even if ($this->option_tag_id3v2 == false) done to make fileformat easier - if (!$this->option_tag_id3v2) { - fseek($this->fp, 0); - $header = fread($this->fp, 10); - if ((substr($header, 0, 3) == 'ID3') && (strlen($header) == 10)) { - $this->info['id3v2']['header'] = true; - $this->info['id3v2']['majorversion'] = ord($header{3}); - $this->info['id3v2']['minorversion'] = ord($header{4}); - $this->info['avdataoffset'] += getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length - } - } - - // read 32 kb file data - fseek($this->fp, $this->info['avdataoffset']); - $formattest = fread($this->fp, 32774); - - // determine format - $determined_format = $this->GetFileFormat($formattest, $filename); - - // unable to determine file format - if (!$determined_format) { - fclose($this->fp); - return $this->error('unable to determine file format'); - } - - // check for illegal ID3 tags - if (isset($determined_format['fail_id3']) && (in_array('id3v1', $this->info['tags']) || in_array('id3v2', $this->info['tags']))) { - if ($determined_format['fail_id3'] === 'ERROR') { - fclose($this->fp); - return $this->error('ID3 tags not allowed on this file type.'); - } elseif ($determined_format['fail_id3'] === 'WARNING') { - $this->warning('ID3 tags not allowed on this file type.'); - } - } - - // check for illegal APE tags - if (isset($determined_format['fail_ape']) && in_array('ape', $this->info['tags'])) { - if ($determined_format['fail_ape'] === 'ERROR') { - fclose($this->fp); - return $this->error('APE tags not allowed on this file type.'); - } elseif ($determined_format['fail_ape'] === 'WARNING') { - $this->warning('APE tags not allowed on this file type.'); - } - } - - // set mime type - $this->info['mime_type'] = $determined_format['mime_type']; - - // supported format signature pattern detected, but module deleted - if (!file_exists(GETID3_INCLUDEPATH.$determined_format['include'])) { - fclose($this->fp); - return $this->error('Format not supported, module "'.$determined_format['include'].'" was removed.'); - } - - // module requires iconv support - // Check encoding/iconv support - if (!empty($determined_format['iconv_req']) && !function_exists('iconv') && !in_array($this->encoding, array('ISO-8859-1', 'UTF-8', 'UTF-16LE', 'UTF-16BE', 'UTF-16'))) { - $errormessage = 'iconv() support is required for this module ('.$determined_format['include'].') for encodings other than ISO-8859-1, UTF-8, UTF-16LE, UTF16-BE, UTF-16. '; - if (GETID3_OS_ISWINDOWS) { - $errormessage .= 'PHP does not have iconv() support. Please enable php_iconv.dll in php.ini, and copy iconv.dll from c:/php/dlls to c:/windows/system32'; - } else { - $errormessage .= 'PHP is not compiled with iconv() support. Please recompile with the --with-iconv switch'; - } - return $this->error($errormessage); - } - - // include module - include_once(GETID3_INCLUDEPATH.$determined_format['include']); - - // instantiate module class - $class_name = 'getid3_'.$determined_format['module']; - if (!class_exists($class_name)) { - return $this->error('Format not supported, module "'.$determined_format['include'].'" is corrupt.'); - } - $class = new $class_name($this); - $class->Analyze(); - unset($class); - - // close file - fclose($this->fp); - - // process all tags - copy to 'tags' and convert charsets - if ($this->option_tags_process) { - $this->HandleAllTags(); - } - - // perform more calculations - if ($this->option_extra_info) { - $this->ChannelsBitratePlaytimeCalculations(); - $this->CalculateCompressionRatioVideo(); - $this->CalculateCompressionRatioAudio(); - $this->CalculateReplayGain(); - $this->ProcessAudioStreams(); - } - - // get the MD5 sum of the audio/video portion of the file - without ID3/APE/Lyrics3/etc header/footer tags - if ($this->option_md5_data) { - // do not calc md5_data if md5_data_source is present - set by flac only - future MPC/SV8 too - if (!$this->option_md5_data_source || empty($this->info['md5_data_source'])) { - $this->getHashdata('md5'); - } - } - - // get the SHA1 sum of the audio/video portion of the file - without ID3/APE/Lyrics3/etc header/footer tags - if ($this->option_sha1_data) { - $this->getHashdata('sha1'); - } - - // remove undesired keys - $this->CleanUp(); - - } catch (Exception $e) { - $this->error('Caught exception: '.$e->getMessage()); - } - - // return info array - return $this->info; - } - - - // private: error handling - public function error($message) { - $this->CleanUp(); - if (!isset($this->info['error'])) { - $this->info['error'] = array(); - } - $this->info['error'][] = $message; - return $this->info; - } - - - // private: warning handling - public function warning($message) { - $this->info['warning'][] = $message; - return true; - } - - - // private: CleanUp - private function CleanUp() { - - // remove possible empty keys - $AVpossibleEmptyKeys = array('dataformat', 'bits_per_sample', 'encoder_options', 'streams', 'bitrate'); - foreach ($AVpossibleEmptyKeys as $dummy => $key) { - if (empty($this->info['audio'][$key]) && isset($this->info['audio'][$key])) { - unset($this->info['audio'][$key]); - } - if (empty($this->info['video'][$key]) && isset($this->info['video'][$key])) { - unset($this->info['video'][$key]); - } - } - - // remove empty root keys - if (!empty($this->info)) { - foreach ($this->info as $key => $value) { - if (empty($this->info[$key]) && ($this->info[$key] !== 0) && ($this->info[$key] !== '0')) { - unset($this->info[$key]); - } - } - } - - // remove meaningless entries from unknown-format files - if (empty($this->info['fileformat'])) { - if (isset($this->info['avdataoffset'])) { - unset($this->info['avdataoffset']); - } - if (isset($this->info['avdataend'])) { - unset($this->info['avdataend']); - } - } - - // remove possible duplicated identical entries - if (!empty($this->info['error'])) { - $this->info['error'] = array_values(array_unique($this->info['error'])); - } - if (!empty($this->info['warning'])) { - $this->info['warning'] = array_values(array_unique($this->info['warning'])); - } - - // remove "global variable" type keys - unset($this->info['php_memory_limit']); - - return true; - } - - - // return array containing information about all supported formats - public function GetFileFormatArray() { - static $format_info = array(); - if (empty($format_info)) { - $format_info = array( - - // Audio formats - - // AC-3 - audio - Dolby AC-3 / Dolby Digital - 'ac3' => array( - 'pattern' => '^\x0B\x77', - 'group' => 'audio', - 'module' => 'ac3', - 'mime_type' => 'audio/ac3', - ), - - // AAC - audio - Advanced Audio Coding (AAC) - ADIF format - 'adif' => array( - 'pattern' => '^ADIF', - 'group' => 'audio', - 'module' => 'aac', - 'mime_type' => 'application/octet-stream', - 'fail_ape' => 'WARNING', - ), - -/* - // AA - audio - Audible Audiobook - 'aa' => array( - 'pattern' => '^.{4}\x57\x90\x75\x36', - 'group' => 'audio', - 'module' => 'aa', - 'mime_type' => 'audio/audible', - ), -*/ - // AAC - audio - Advanced Audio Coding (AAC) - ADTS format (very similar to MP3) - 'adts' => array( - 'pattern' => '^\xFF[\xF0-\xF1\xF8-\xF9]', - 'group' => 'audio', - 'module' => 'aac', - 'mime_type' => 'application/octet-stream', - 'fail_ape' => 'WARNING', - ), - - - // AU - audio - NeXT/Sun AUdio (AU) - 'au' => array( - 'pattern' => '^\.snd', - 'group' => 'audio', - 'module' => 'au', - 'mime_type' => 'audio/basic', - ), - - // AMR - audio - Adaptive Multi Rate - 'amr' => array( - 'pattern' => '^\x23\x21AMR\x0A', // #!AMR[0A] - 'group' => 'audio', - 'module' => 'amr', - 'mime_type' => 'audio/amr', - ), - - // AVR - audio - Audio Visual Research - 'avr' => array( - 'pattern' => '^2BIT', - 'group' => 'audio', - 'module' => 'avr', - 'mime_type' => 'application/octet-stream', - ), - - // BONK - audio - Bonk v0.9+ - 'bonk' => array( - 'pattern' => '^\x00(BONK|INFO|META| ID3)', - 'group' => 'audio', - 'module' => 'bonk', - 'mime_type' => 'audio/xmms-bonk', - ), - - // DSS - audio - Digital Speech Standard - 'dss' => array( - 'pattern' => '^[\x02-\x03]ds[s2]', - 'group' => 'audio', - 'module' => 'dss', - 'mime_type' => 'application/octet-stream', - ), - - // DTS - audio - Dolby Theatre System - 'dts' => array( - 'pattern' => '^\x7F\xFE\x80\x01', - 'group' => 'audio', - 'module' => 'dts', - 'mime_type' => 'audio/dts', - ), - - // FLAC - audio - Free Lossless Audio Codec - 'flac' => array( - 'pattern' => '^fLaC', - 'group' => 'audio', - 'module' => 'flac', - 'mime_type' => 'audio/x-flac', - ), - - // LA - audio - Lossless Audio (LA) - 'la' => array( - 'pattern' => '^LA0[2-4]', - 'group' => 'audio', - 'module' => 'la', - 'mime_type' => 'application/octet-stream', - ), - - // LPAC - audio - Lossless Predictive Audio Compression (LPAC) - 'lpac' => array( - 'pattern' => '^LPAC', - 'group' => 'audio', - 'module' => 'lpac', - 'mime_type' => 'application/octet-stream', - ), - - // MIDI - audio - MIDI (Musical Instrument Digital Interface) - 'midi' => array( - 'pattern' => '^MThd', - 'group' => 'audio', - 'module' => 'midi', - 'mime_type' => 'audio/midi', - ), - - // MAC - audio - Monkey's Audio Compressor - 'mac' => array( - 'pattern' => '^MAC ', - 'group' => 'audio', - 'module' => 'monkey', - 'mime_type' => 'application/octet-stream', - ), - -// has been known to produce false matches in random files (e.g. JPEGs), leave out until more precise matching available -// // MOD - audio - MODule (assorted sub-formats) -// 'mod' => array( -// 'pattern' => '^.{1080}(M\\.K\\.|M!K!|FLT4|FLT8|[5-9]CHN|[1-3][0-9]CH)', -// 'group' => 'audio', -// 'module' => 'mod', -// 'option' => 'mod', -// 'mime_type' => 'audio/mod', -// ), - - // MOD - audio - MODule (Impulse Tracker) - 'it' => array( - 'pattern' => '^IMPM', - 'group' => 'audio', - 'module' => 'mod', - //'option' => 'it', - 'mime_type' => 'audio/it', - ), - - // MOD - audio - MODule (eXtended Module, various sub-formats) - 'xm' => array( - 'pattern' => '^Extended Module', - 'group' => 'audio', - 'module' => 'mod', - //'option' => 'xm', - 'mime_type' => 'audio/xm', - ), - - // MOD - audio - MODule (ScreamTracker) - 's3m' => array( - 'pattern' => '^.{44}SCRM', - 'group' => 'audio', - 'module' => 'mod', - //'option' => 's3m', - 'mime_type' => 'audio/s3m', - ), - - // MPC - audio - Musepack / MPEGplus - 'mpc' => array( - 'pattern' => '^(MPCK|MP\+|[\x00\x01\x10\x11\x40\x41\x50\x51\x80\x81\x90\x91\xC0\xC1\xD0\xD1][\x20-37][\x00\x20\x40\x60\x80\xA0\xC0\xE0])', - 'group' => 'audio', - 'module' => 'mpc', - 'mime_type' => 'audio/x-musepack', - ), - - // MP3 - audio - MPEG-audio Layer 3 (very similar to AAC-ADTS) - 'mp3' => array( - 'pattern' => '^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\x0B\x10-\x1B\x20-\x2B\x30-\x3B\x40-\x4B\x50-\x5B\x60-\x6B\x70-\x7B\x80-\x8B\x90-\x9B\xA0-\xAB\xB0-\xBB\xC0-\xCB\xD0-\xDB\xE0-\xEB\xF0-\xFB]', - 'group' => 'audio', - 'module' => 'mp3', - 'mime_type' => 'audio/mpeg', - ), - - // OFR - audio - OptimFROG - 'ofr' => array( - 'pattern' => '^(\*RIFF|OFR)', - 'group' => 'audio', - 'module' => 'optimfrog', - 'mime_type' => 'application/octet-stream', - ), - - // RKAU - audio - RKive AUdio compressor - 'rkau' => array( - 'pattern' => '^RKA', - 'group' => 'audio', - 'module' => 'rkau', - 'mime_type' => 'application/octet-stream', - ), - - // SHN - audio - Shorten - 'shn' => array( - 'pattern' => '^ajkg', - 'group' => 'audio', - 'module' => 'shorten', - 'mime_type' => 'audio/xmms-shn', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - // TTA - audio - TTA Lossless Audio Compressor (http://tta.corecodec.org) - 'tta' => array( - 'pattern' => '^TTA', // could also be '^TTA(\x01|\x02|\x03|2|1)' - 'group' => 'audio', - 'module' => 'tta', - 'mime_type' => 'application/octet-stream', - ), - - // VOC - audio - Creative Voice (VOC) - 'voc' => array( - 'pattern' => '^Creative Voice File', - 'group' => 'audio', - 'module' => 'voc', - 'mime_type' => 'audio/voc', - ), - - // VQF - audio - transform-domain weighted interleave Vector Quantization Format (VQF) - 'vqf' => array( - 'pattern' => '^TWIN', - 'group' => 'audio', - 'module' => 'vqf', - 'mime_type' => 'application/octet-stream', - ), - - // WV - audio - WavPack (v4.0+) - 'wv' => array( - 'pattern' => '^wvpk', - 'group' => 'audio', - 'module' => 'wavpack', - 'mime_type' => 'application/octet-stream', - ), - - - // Audio-Video formats - - // ASF - audio/video - Advanced Streaming Format, Windows Media Video, Windows Media Audio - 'asf' => array( - 'pattern' => '^\x30\x26\xB2\x75\x8E\x66\xCF\x11\xA6\xD9\x00\xAA\x00\x62\xCE\x6C', - 'group' => 'audio-video', - 'module' => 'asf', - 'mime_type' => 'video/x-ms-asf', - 'iconv_req' => false, - ), - - // BINK - audio/video - Bink / Smacker - 'bink' => array( - 'pattern' => '^(BIK|SMK)', - 'group' => 'audio-video', - 'module' => 'bink', - 'mime_type' => 'application/octet-stream', - ), - - // FLV - audio/video - FLash Video - 'flv' => array( - 'pattern' => '^FLV\x01', - 'group' => 'audio-video', - 'module' => 'flv', - 'mime_type' => 'video/x-flv', - ), - - // MKAV - audio/video - Mastroka - 'matroska' => array( - 'pattern' => '^\x1A\x45\xDF\xA3', - 'group' => 'audio-video', - 'module' => 'matroska', - 'mime_type' => 'video/x-matroska', // may also be audio/x-matroska - ), - - // MPEG - audio/video - MPEG (Moving Pictures Experts Group) - 'mpeg' => array( - 'pattern' => '^\x00\x00\x01(\xBA|\xB3)', - 'group' => 'audio-video', - 'module' => 'mpeg', - 'mime_type' => 'video/mpeg', - ), - - // NSV - audio/video - Nullsoft Streaming Video (NSV) - 'nsv' => array( - 'pattern' => '^NSV[sf]', - 'group' => 'audio-video', - 'module' => 'nsv', - 'mime_type' => 'application/octet-stream', - ), - - // Ogg - audio/video - Ogg (Ogg-Vorbis, Ogg-FLAC, Speex, Ogg-Theora(*), Ogg-Tarkin(*)) - 'ogg' => array( - 'pattern' => '^OggS', - 'group' => 'audio', - 'module' => 'ogg', - 'mime_type' => 'application/ogg', - 'fail_id3' => 'WARNING', - 'fail_ape' => 'WARNING', - ), - - // QT - audio/video - Quicktime - 'quicktime' => array( - 'pattern' => '^.{4}(cmov|free|ftyp|mdat|moov|pnot|skip|wide)', - 'group' => 'audio-video', - 'module' => 'quicktime', - 'mime_type' => 'video/quicktime', - ), - - // RIFF - audio/video - Resource Interchange File Format (RIFF) / WAV / AVI / CD-audio / SDSS = renamed variant used by SmartSound QuickTracks (www.smartsound.com) / FORM = Audio Interchange File Format (AIFF) - 'riff' => array( - 'pattern' => '^(RIFF|SDSS|FORM)', - 'group' => 'audio-video', - 'module' => 'riff', - 'mime_type' => 'audio/x-wave', - 'fail_ape' => 'WARNING', - ), - - // Real - audio/video - RealAudio, RealVideo - 'real' => array( - 'pattern' => '^(\\.RMF|\\.ra)', - 'group' => 'audio-video', - 'module' => 'real', - 'mime_type' => 'audio/x-realaudio', - ), - - // SWF - audio/video - ShockWave Flash - 'swf' => array( - 'pattern' => '^(F|C)WS', - 'group' => 'audio-video', - 'module' => 'swf', - 'mime_type' => 'application/x-shockwave-flash', - ), - - // TS - audio/video - MPEG-2 Transport Stream - 'ts' => array( - 'pattern' => '^(\x47.{187}){10,}', // packets are 188 bytes long and start with 0x47 "G". Check for at least 10 packets matching this pattern - 'group' => 'audio-video', - 'module' => 'ts', - 'mime_type' => 'video/MP2T', - ), - - - // Still-Image formats - - // BMP - still image - Bitmap (Windows, OS/2; uncompressed, RLE8, RLE4) - 'bmp' => array( - 'pattern' => '^BM', - 'group' => 'graphic', - 'module' => 'bmp', - 'mime_type' => 'image/bmp', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - // GIF - still image - Graphics Interchange Format - 'gif' => array( - 'pattern' => '^GIF', - 'group' => 'graphic', - 'module' => 'gif', - 'mime_type' => 'image/gif', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - // JPEG - still image - Joint Photographic Experts Group (JPEG) - 'jpg' => array( - 'pattern' => '^\xFF\xD8\xFF', - 'group' => 'graphic', - 'module' => 'jpg', - 'mime_type' => 'image/jpeg', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - // PCD - still image - Kodak Photo CD - 'pcd' => array( - 'pattern' => '^.{2048}PCD_IPI\x00', - 'group' => 'graphic', - 'module' => 'pcd', - 'mime_type' => 'image/x-photo-cd', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - - // PNG - still image - Portable Network Graphics (PNG) - 'png' => array( - 'pattern' => '^\x89\x50\x4E\x47\x0D\x0A\x1A\x0A', - 'group' => 'graphic', - 'module' => 'png', - 'mime_type' => 'image/png', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - - // SVG - still image - Scalable Vector Graphics (SVG) - 'svg' => array( - 'pattern' => '( 'graphic', - 'module' => 'svg', - 'mime_type' => 'image/svg+xml', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - - // TIFF - still image - Tagged Information File Format (TIFF) - 'tiff' => array( - 'pattern' => '^(II\x2A\x00|MM\x00\x2A)', - 'group' => 'graphic', - 'module' => 'tiff', - 'mime_type' => 'image/tiff', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - - // EFAX - still image - eFax (TIFF derivative) - 'efax' => array( - 'pattern' => '^\xDC\xFE', - 'group' => 'graphic', - 'module' => 'efax', - 'mime_type' => 'image/efax', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - - // Data formats - - // ISO - data - International Standards Organization (ISO) CD-ROM Image - 'iso' => array( - 'pattern' => '^.{32769}CD001', - 'group' => 'misc', - 'module' => 'iso', - 'mime_type' => 'application/octet-stream', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - 'iconv_req' => false, - ), - - // RAR - data - RAR compressed data - 'rar' => array( - 'pattern' => '^Rar\!', - 'group' => 'archive', - 'module' => 'rar', - 'mime_type' => 'application/octet-stream', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - // SZIP - audio/data - SZIP compressed data - 'szip' => array( - 'pattern' => '^SZ\x0A\x04', - 'group' => 'archive', - 'module' => 'szip', - 'mime_type' => 'application/octet-stream', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - // TAR - data - TAR compressed data - 'tar' => array( - 'pattern' => '^.{100}[0-9\x20]{7}\x00[0-9\x20]{7}\x00[0-9\x20]{7}\x00[0-9\x20\x00]{12}[0-9\x20\x00]{12}', - 'group' => 'archive', - 'module' => 'tar', - 'mime_type' => 'application/x-tar', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - // GZIP - data - GZIP compressed data - 'gz' => array( - 'pattern' => '^\x1F\x8B\x08', - 'group' => 'archive', - 'module' => 'gzip', - 'mime_type' => 'application/x-gzip', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - // ZIP - data - ZIP compressed data - 'zip' => array( - 'pattern' => '^PK\x03\x04', - 'group' => 'archive', - 'module' => 'zip', - 'mime_type' => 'application/zip', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - - // Misc other formats - - // PAR2 - data - Parity Volume Set Specification 2.0 - 'par2' => array ( - 'pattern' => '^PAR2\x00PKT', - 'group' => 'misc', - 'module' => 'par2', - 'mime_type' => 'application/octet-stream', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - // PDF - data - Portable Document Format - 'pdf' => array( - 'pattern' => '^\x25PDF', - 'group' => 'misc', - 'module' => 'pdf', - 'mime_type' => 'application/pdf', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - // MSOFFICE - data - ZIP compressed data - 'msoffice' => array( - 'pattern' => '^\xD0\xCF\x11\xE0\xA1\xB1\x1A\xE1', // D0CF11E == DOCFILE == Microsoft Office Document - 'group' => 'misc', - 'module' => 'msoffice', - 'mime_type' => 'application/octet-stream', - 'fail_id3' => 'ERROR', - 'fail_ape' => 'ERROR', - ), - - // CUE - data - CUEsheet (index to single-file disc images) - 'cue' => array( - 'pattern' => '', // empty pattern means cannot be automatically detected, will fall through all other formats and match based on filename and very basic file contents - 'group' => 'misc', - 'module' => 'cue', - 'mime_type' => 'application/octet-stream', - ), - - ); - } - - return $format_info; - } - - - - public function GetFileFormat(&$filedata, $filename='') { - // this function will determine the format of a file based on usually - // the first 2-4 bytes of the file (8 bytes for PNG, 16 bytes for JPG, - // and in the case of ISO CD image, 6 bytes offset 32kb from the start - // of the file). - - // Identify file format - loop through $format_info and detect with reg expr - foreach ($this->GetFileFormatArray() as $format_name => $info) { - // The /s switch on preg_match() forces preg_match() NOT to treat - // newline (0x0A) characters as special chars but do a binary match - if (!empty($info['pattern']) && preg_match('#'.$info['pattern'].'#s', $filedata)) { - $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; - return $info; - } - } - - - if (preg_match('#\.mp[123a]$#i', $filename)) { - // Too many mp3 encoders on the market put gabage in front of mpeg files - // use assume format on these if format detection failed - $GetFileFormatArray = $this->GetFileFormatArray(); - $info = $GetFileFormatArray['mp3']; - $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; - return $info; - } elseif (preg_match('/\.cue$/i', $filename) && preg_match('#FILE "[^"]+" (BINARY|MOTOROLA|AIFF|WAVE|MP3)#', $filedata)) { - // there's not really a useful consistent "magic" at the beginning of .cue files to identify them - // so until I think of something better, just go by filename if all other format checks fail - // and verify there's at least one instance of "TRACK xx AUDIO" in the file - $GetFileFormatArray = $this->GetFileFormatArray(); - $info = $GetFileFormatArray['cue']; - $info['include'] = 'module.'.$info['group'].'.'.$info['module'].'.php'; - return $info; - } - - return false; - } - - - // converts array to $encoding charset from $this->encoding - public function CharConvert(&$array, $encoding) { - - // identical encoding - end here - if ($encoding == $this->encoding) { - return; - } - - // loop thru array - foreach ($array as $key => $value) { - - // go recursive - if (is_array($value)) { - $this->CharConvert($array[$key], $encoding); - } - - // convert string - elseif (is_string($value)) { - $array[$key] = trim(getid3_lib::iconv_fallback($encoding, $this->encoding, $value)); - } - } - } - - - public function HandleAllTags() { - - // key name => array (tag name, character encoding) - static $tags; - if (empty($tags)) { - $tags = array( - 'asf' => array('asf' , 'UTF-16LE'), - 'midi' => array('midi' , 'ISO-8859-1'), - 'nsv' => array('nsv' , 'ISO-8859-1'), - 'ogg' => array('vorbiscomment' , 'UTF-8'), - 'png' => array('png' , 'UTF-8'), - 'tiff' => array('tiff' , 'ISO-8859-1'), - 'quicktime' => array('quicktime' , 'UTF-8'), - 'real' => array('real' , 'ISO-8859-1'), - 'vqf' => array('vqf' , 'ISO-8859-1'), - 'zip' => array('zip' , 'ISO-8859-1'), - 'riff' => array('riff' , 'ISO-8859-1'), - 'lyrics3' => array('lyrics3' , 'ISO-8859-1'), - 'id3v1' => array('id3v1' , $this->encoding_id3v1), - 'id3v2' => array('id3v2' , 'UTF-8'), // not according to the specs (every frame can have a different encoding), but getID3() force-converts all encodings to UTF-8 - 'ape' => array('ape' , 'UTF-8'), - 'cue' => array('cue' , 'ISO-8859-1'), - 'matroska' => array('matroska' , 'UTF-8'), - 'flac' => array('vorbiscomment' , 'UTF-8'), - 'divxtag' => array('divx' , 'ISO-8859-1'), - 'iptc' => array('iptc' , 'ISO-8859-1'), - ); - } - - // loop through comments array - foreach ($tags as $comment_name => $tagname_encoding_array) { - list($tag_name, $encoding) = $tagname_encoding_array; - - // fill in default encoding type if not already present - if (isset($this->info[$comment_name]) && !isset($this->info[$comment_name]['encoding'])) { - $this->info[$comment_name]['encoding'] = $encoding; - } - - // copy comments if key name set - if (!empty($this->info[$comment_name]['comments'])) { - foreach ($this->info[$comment_name]['comments'] as $tag_key => $valuearray) { - foreach ($valuearray as $key => $value) { - if (is_string($value)) { - $value = trim($value, " \r\n\t"); // do not trim nulls from $value!! Unicode characters will get mangled if trailing nulls are removed! - } - if ($value) { - if (!is_numeric($key)) { - $this->info['tags'][trim($tag_name)][trim($tag_key)][$key] = $value; - } else { - $this->info['tags'][trim($tag_name)][trim($tag_key)][] = $value; - } - } - } - if ($tag_key == 'picture') { - unset($this->info[$comment_name]['comments'][$tag_key]); - } - } - - if (!isset($this->info['tags'][$tag_name])) { - // comments are set but contain nothing but empty strings, so skip - continue; - } - - if ($this->option_tags_html) { - foreach ($this->info['tags'][$tag_name] as $tag_key => $valuearray) { - $this->info['tags_html'][$tag_name][$tag_key] = getid3_lib::recursiveMultiByteCharString2HTML($valuearray, $encoding); - } - } - - $this->CharConvert($this->info['tags'][$tag_name], $encoding); // only copy gets converted! - } - - } - - // pictures can take up a lot of space, and we don't need multiple copies of them - // let there be a single copy in [comments][picture], and not elsewhere - if (!empty($this->info['tags'])) { - $unset_keys = array('tags', 'tags_html'); - foreach ($this->info['tags'] as $tagtype => $tagarray) { - foreach ($tagarray as $tagname => $tagdata) { - if ($tagname == 'picture') { - foreach ($tagdata as $key => $tagarray) { - $this->info['comments']['picture'][] = $tagarray; - if (isset($tagarray['data']) && isset($tagarray['image_mime'])) { - if (isset($this->info['tags'][$tagtype][$tagname][$key])) { - unset($this->info['tags'][$tagtype][$tagname][$key]); - } - if (isset($this->info['tags_html'][$tagtype][$tagname][$key])) { - unset($this->info['tags_html'][$tagtype][$tagname][$key]); - } - } - } - } - } - foreach ($unset_keys as $unset_key) { - // remove possible empty keys from (e.g. [tags][id3v2][picture]) - if (empty($this->info[$unset_key][$tagtype]['picture'])) { - unset($this->info[$unset_key][$tagtype]['picture']); - } - if (empty($this->info[$unset_key][$tagtype])) { - unset($this->info[$unset_key][$tagtype]); - } - if (empty($this->info[$unset_key])) { - unset($this->info[$unset_key]); - } - } - // remove duplicate copy of picture data from (e.g. [id3v2][comments][picture]) - if (isset($this->info[$tagtype]['comments']['picture'])) { - unset($this->info[$tagtype]['comments']['picture']); - } - if (empty($this->info[$tagtype]['comments'])) { - unset($this->info[$tagtype]['comments']); - } - if (empty($this->info[$tagtype])) { - unset($this->info[$tagtype]); - } - } - } - return true; - } - - public function getHashdata($algorithm) { - switch ($algorithm) { - case 'md5': - case 'sha1': - break; - - default: - return $this->error('bad algorithm "'.$algorithm.'" in getHashdata()'); - break; - } - - if (!empty($this->info['fileformat']) && !empty($this->info['dataformat']) && ($this->info['fileformat'] == 'ogg') && ($this->info['audio']['dataformat'] == 'vorbis')) { - - // We cannot get an identical md5_data value for Ogg files where the comments - // span more than 1 Ogg page (compared to the same audio data with smaller - // comments) using the normal getID3() method of MD5'ing the data between the - // end of the comments and the end of the file (minus any trailing tags), - // because the page sequence numbers of the pages that the audio data is on - // do not match. Under normal circumstances, where comments are smaller than - // the nominal 4-8kB page size, then this is not a problem, but if there are - // very large comments, the only way around it is to strip off the comment - // tags with vorbiscomment and MD5 that file. - // This procedure must be applied to ALL Ogg files, not just the ones with - // comments larger than 1 page, because the below method simply MD5's the - // whole file with the comments stripped, not just the portion after the - // comments block (which is the standard getID3() method. - - // The above-mentioned problem of comments spanning multiple pages and changing - // page sequence numbers likely happens for OggSpeex and OggFLAC as well, but - // currently vorbiscomment only works on OggVorbis files. - - if (preg_match('#(1|ON)#i', ini_get('safe_mode'))) { - - $this->warning('Failed making system call to vorbiscomment.exe - '.$algorithm.'_data is incorrect - error returned: PHP running in Safe Mode (backtick operator not available)'); - $this->info[$algorithm.'_data'] = false; - - } else { - - // Prevent user from aborting script - $old_abort = ignore_user_abort(true); - - // Create empty file - $empty = tempnam(GETID3_TEMP_DIR, 'getID3'); - touch($empty); - - // Use vorbiscomment to make temp file without comments - $temp = tempnam(GETID3_TEMP_DIR, 'getID3'); - $file = $this->info['filenamepath']; - - if (GETID3_OS_ISWINDOWS) { - - if (file_exists(GETID3_HELPERAPPSDIR.'vorbiscomment.exe')) { - - $commandline = '"'.GETID3_HELPERAPPSDIR.'vorbiscomment.exe" -w -c "'.$empty.'" "'.$file.'" "'.$temp.'"'; - $VorbisCommentError = `$commandline`; - - } else { - - $VorbisCommentError = 'vorbiscomment.exe not found in '.GETID3_HELPERAPPSDIR; - - } - - } else { - - $commandline = 'vorbiscomment -w -c "'.$empty.'" "'.$file.'" "'.$temp.'" 2>&1'; - $commandline = 'vorbiscomment -w -c '.escapeshellarg($empty).' '.escapeshellarg($file).' '.escapeshellarg($temp).' 2>&1'; - $VorbisCommentError = `$commandline`; - - } - - if (!empty($VorbisCommentError)) { - - $this->info['warning'][] = 'Failed making system call to vorbiscomment(.exe) - '.$algorithm.'_data will be incorrect. If vorbiscomment is unavailable, please download from http://www.vorbis.com/download.psp and put in the getID3() directory. Error returned: '.$VorbisCommentError; - $this->info[$algorithm.'_data'] = false; - - } else { - - // Get hash of newly created file - switch ($algorithm) { - case 'md5': - $this->info[$algorithm.'_data'] = md5_file($temp); - break; - - case 'sha1': - $this->info[$algorithm.'_data'] = sha1_file($temp); - break; - } - } - - // Clean up - unlink($empty); - unlink($temp); - - // Reset abort setting - ignore_user_abort($old_abort); - - } - - } else { - - if (!empty($this->info['avdataoffset']) || (isset($this->info['avdataend']) && ($this->info['avdataend'] < $this->info['filesize']))) { - - // get hash from part of file - $this->info[$algorithm.'_data'] = getid3_lib::hash_data($this->info['filenamepath'], $this->info['avdataoffset'], $this->info['avdataend'], $algorithm); - - } else { - - // get hash from whole file - switch ($algorithm) { - case 'md5': - $this->info[$algorithm.'_data'] = md5_file($this->info['filenamepath']); - break; - - case 'sha1': - $this->info[$algorithm.'_data'] = sha1_file($this->info['filenamepath']); - break; - } - } - - } - return true; - } - - - public function ChannelsBitratePlaytimeCalculations() { - - // set channelmode on audio - if (!empty($this->info['audio']['channelmode']) || !isset($this->info['audio']['channels'])) { - // ignore - } elseif ($this->info['audio']['channels'] == 1) { - $this->info['audio']['channelmode'] = 'mono'; - } elseif ($this->info['audio']['channels'] == 2) { - $this->info['audio']['channelmode'] = 'stereo'; - } - - // Calculate combined bitrate - audio + video - $CombinedBitrate = 0; - $CombinedBitrate += (isset($this->info['audio']['bitrate']) ? $this->info['audio']['bitrate'] : 0); - $CombinedBitrate += (isset($this->info['video']['bitrate']) ? $this->info['video']['bitrate'] : 0); - if (($CombinedBitrate > 0) && empty($this->info['bitrate'])) { - $this->info['bitrate'] = $CombinedBitrate; - } - //if ((isset($this->info['video']) && !isset($this->info['video']['bitrate'])) || (isset($this->info['audio']) && !isset($this->info['audio']['bitrate']))) { - // // for example, VBR MPEG video files cannot determine video bitrate: - // // should not set overall bitrate and playtime from audio bitrate only - // unset($this->info['bitrate']); - //} - - // video bitrate undetermined, but calculable - if (isset($this->info['video']['dataformat']) && $this->info['video']['dataformat'] && (!isset($this->info['video']['bitrate']) || ($this->info['video']['bitrate'] == 0))) { - // if video bitrate not set - if (isset($this->info['audio']['bitrate']) && ($this->info['audio']['bitrate'] > 0) && ($this->info['audio']['bitrate'] == $this->info['bitrate'])) { - // AND if audio bitrate is set to same as overall bitrate - if (isset($this->info['playtime_seconds']) && ($this->info['playtime_seconds'] > 0)) { - // AND if playtime is set - if (isset($this->info['avdataend']) && isset($this->info['avdataoffset'])) { - // AND if AV data offset start/end is known - // THEN we can calculate the video bitrate - $this->info['bitrate'] = round((($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds']); - $this->info['video']['bitrate'] = $this->info['bitrate'] - $this->info['audio']['bitrate']; - } - } - } - } - - if ((!isset($this->info['playtime_seconds']) || ($this->info['playtime_seconds'] <= 0)) && !empty($this->info['bitrate'])) { - $this->info['playtime_seconds'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['bitrate']; - } - - if (!isset($this->info['bitrate']) && !empty($this->info['playtime_seconds'])) { - $this->info['bitrate'] = (($this->info['avdataend'] - $this->info['avdataoffset']) * 8) / $this->info['playtime_seconds']; - } - if (isset($this->info['bitrate']) && empty($this->info['audio']['bitrate']) && empty($this->info['video']['bitrate'])) { - if (isset($this->info['audio']['dataformat']) && empty($this->info['video']['resolution_x'])) { - // audio only - $this->info['audio']['bitrate'] = $this->info['bitrate']; - } elseif (isset($this->info['video']['resolution_x']) && empty($this->info['audio']['dataformat'])) { - // video only - $this->info['video']['bitrate'] = $this->info['bitrate']; - } - } - - // Set playtime string - if (!empty($this->info['playtime_seconds']) && empty($this->info['playtime_string'])) { - $this->info['playtime_string'] = getid3_lib::PlaytimeString($this->info['playtime_seconds']); - } - } - - - public function CalculateCompressionRatioVideo() { - if (empty($this->info['video'])) { - return false; - } - if (empty($this->info['video']['resolution_x']) || empty($this->info['video']['resolution_y'])) { - return false; - } - if (empty($this->info['video']['bits_per_sample'])) { - return false; - } - - switch ($this->info['video']['dataformat']) { - case 'bmp': - case 'gif': - case 'jpeg': - case 'jpg': - case 'png': - case 'tiff': - $FrameRate = 1; - $PlaytimeSeconds = 1; - $BitrateCompressed = $this->info['filesize'] * 8; - break; - - default: - if (!empty($this->info['video']['frame_rate'])) { - $FrameRate = $this->info['video']['frame_rate']; - } else { - return false; - } - if (!empty($this->info['playtime_seconds'])) { - $PlaytimeSeconds = $this->info['playtime_seconds']; - } else { - return false; - } - if (!empty($this->info['video']['bitrate'])) { - $BitrateCompressed = $this->info['video']['bitrate']; - } else { - return false; - } - break; - } - $BitrateUncompressed = $this->info['video']['resolution_x'] * $this->info['video']['resolution_y'] * $this->info['video']['bits_per_sample'] * $FrameRate; - - $this->info['video']['compression_ratio'] = $BitrateCompressed / $BitrateUncompressed; - return true; - } - - - public function CalculateCompressionRatioAudio() { - if (empty($this->info['audio']['bitrate']) || empty($this->info['audio']['channels']) || empty($this->info['audio']['sample_rate']) || !is_numeric($this->info['audio']['sample_rate'])) { - return false; - } - $this->info['audio']['compression_ratio'] = $this->info['audio']['bitrate'] / ($this->info['audio']['channels'] * $this->info['audio']['sample_rate'] * (!empty($this->info['audio']['bits_per_sample']) ? $this->info['audio']['bits_per_sample'] : 16)); - - if (!empty($this->info['audio']['streams'])) { - foreach ($this->info['audio']['streams'] as $streamnumber => $streamdata) { - if (!empty($streamdata['bitrate']) && !empty($streamdata['channels']) && !empty($streamdata['sample_rate'])) { - $this->info['audio']['streams'][$streamnumber]['compression_ratio'] = $streamdata['bitrate'] / ($streamdata['channels'] * $streamdata['sample_rate'] * (!empty($streamdata['bits_per_sample']) ? $streamdata['bits_per_sample'] : 16)); - } - } - } - return true; - } - - - public function CalculateReplayGain() { - if (isset($this->info['replay_gain'])) { - if (!isset($this->info['replay_gain']['reference_volume'])) { - $this->info['replay_gain']['reference_volume'] = (double) 89.0; - } - if (isset($this->info['replay_gain']['track']['adjustment'])) { - $this->info['replay_gain']['track']['volume'] = $this->info['replay_gain']['reference_volume'] - $this->info['replay_gain']['track']['adjustment']; - } - if (isset($this->info['replay_gain']['album']['adjustment'])) { - $this->info['replay_gain']['album']['volume'] = $this->info['replay_gain']['reference_volume'] - $this->info['replay_gain']['album']['adjustment']; - } - - if (isset($this->info['replay_gain']['track']['peak'])) { - $this->info['replay_gain']['track']['max_noclip_gain'] = 0 - getid3_lib::RGADamplitude2dB($this->info['replay_gain']['track']['peak']); - } - if (isset($this->info['replay_gain']['album']['peak'])) { - $this->info['replay_gain']['album']['max_noclip_gain'] = 0 - getid3_lib::RGADamplitude2dB($this->info['replay_gain']['album']['peak']); - } - } - return true; - } - - public function ProcessAudioStreams() { - if (!empty($this->info['audio']['bitrate']) || !empty($this->info['audio']['channels']) || !empty($this->info['audio']['sample_rate'])) { - if (!isset($this->info['audio']['streams'])) { - foreach ($this->info['audio'] as $key => $value) { - if ($key != 'streams') { - $this->info['audio']['streams'][0][$key] = $value; - } - } - } - } - return true; - } - - public function getid3_tempnam() { - return tempnam($this->tempdir, 'gI3'); - } - - public function include_module($name) { - //if (!file_exists($this->include_path.'module.'.$name.'.php')) { - if (!file_exists(GETID3_INCLUDEPATH.'module.'.$name.'.php')) { - throw new getid3_exception('Required module.'.$name.'.php is missing.'); - } - include_once(GETID3_INCLUDEPATH.'module.'.$name.'.php'); - return true; - } - -} - - -abstract class getid3_handler { - - /** - * @var getID3 - */ - protected $getid3; // pointer - - protected $data_string_flag = false; // analyzing filepointer or string - protected $data_string = ''; // string to analyze - protected $data_string_position = 0; // seek position in string - protected $data_string_length = 0; // string length - - private $dependency_to = null; - - - public function __construct(getID3 $getid3, $call_module=null) { - $this->getid3 = $getid3; - - if ($call_module) { - $this->dependency_to = str_replace('getid3_', '', $call_module); - } - } - - - // Analyze from file pointer - abstract public function Analyze(); - - - // Analyze from string instead - public function AnalyzeString($string) { - // Enter string mode - $this->setStringMode($string); - - // Save info - $saved_avdataoffset = $this->getid3->info['avdataoffset']; - $saved_avdataend = $this->getid3->info['avdataend']; - $saved_filesize = (isset($this->getid3->info['filesize']) ? $this->getid3->info['filesize'] : null); // may be not set if called as dependency without openfile() call - - // Reset some info - $this->getid3->info['avdataoffset'] = 0; - $this->getid3->info['avdataend'] = $this->getid3->info['filesize'] = $this->data_string_length; - - // Analyze - $this->Analyze(); - - // Restore some info - $this->getid3->info['avdataoffset'] = $saved_avdataoffset; - $this->getid3->info['avdataend'] = $saved_avdataend; - $this->getid3->info['filesize'] = $saved_filesize; - - // Exit string mode - $this->data_string_flag = false; - } - - public function setStringMode($string) { - $this->data_string_flag = true; - $this->data_string = $string; - $this->data_string_length = strlen($string); - } - - protected function ftell() { - if ($this->data_string_flag) { - return $this->data_string_position; - } - return ftell($this->getid3->fp); - } - - protected function fread($bytes) { - if ($this->data_string_flag) { - $this->data_string_position += $bytes; - return substr($this->data_string, $this->data_string_position - $bytes, $bytes); - } - $pos = $this->ftell() + $bytes; - if (!getid3_lib::intValueSupported($pos)) { - throw new getid3_exception('cannot fread('.$bytes.' from '.$this->ftell().') because beyond PHP filesystem limit', 10); - } - return fread($this->getid3->fp, $bytes); - } - - protected function fseek($bytes, $whence=SEEK_SET) { - if ($this->data_string_flag) { - switch ($whence) { - case SEEK_SET: - $this->data_string_position = $bytes; - break; - - case SEEK_CUR: - $this->data_string_position += $bytes; - break; - - case SEEK_END: - $this->data_string_position = $this->data_string_length + $bytes; - break; - } - return 0; - } else { - $pos = $bytes; - if ($whence == SEEK_CUR) { - $pos = $this->ftell() + $bytes; - } elseif ($whence == SEEK_END) { - $pos = $this->getid3->info['filesize'] + $bytes; - } - if (!getid3_lib::intValueSupported($pos)) { - throw new getid3_exception('cannot fseek('.$pos.') because beyond PHP filesystem limit', 10); - } - } - return fseek($this->getid3->fp, $bytes, $whence); - } - - protected function feof() { - if ($this->data_string_flag) { - return $this->data_string_position >= $this->data_string_length; - } - return feof($this->getid3->fp); - } - - final protected function isDependencyFor($module) { - return $this->dependency_to == $module; - } - - protected function error($text) { - $this->getid3->info['error'][] = $text; - - return false; - } - - protected function warning($text) { - return $this->getid3->warning($text); - } - - protected function notice($text) { - // does nothing for now - } - - public function saveAttachment($name, $offset, $length, $image_mime=null) { - try { - - // do not extract at all - if ($this->getid3->option_save_attachments === getID3::ATTACHMENTS_NONE) { - - $attachment = null; // do not set any - - // extract to return array - } elseif ($this->getid3->option_save_attachments === getID3::ATTACHMENTS_INLINE) { - - $this->fseek($offset); - $attachment = $this->fread($length); // get whole data in one pass, till it is anyway stored in memory - if ($attachment === false || strlen($attachment) != $length) { - throw new Exception('failed to read attachment data'); - } - - // assume directory path is given - } else { - - // set up destination path - $dir = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->getid3->option_save_attachments), DIRECTORY_SEPARATOR); - if (!is_dir($dir) || !is_writable($dir)) { // check supplied directory - throw new Exception('supplied path ('.$dir.') does not exist, or is not writable'); - } - $dest = $dir.DIRECTORY_SEPARATOR.$name.($image_mime ? '.'.getid3_lib::ImageExtFromMime($image_mime) : ''); - - // create dest file - if (($fp_dest = fopen($dest, 'wb')) == false) { - throw new Exception('failed to create file '.$dest); - } - - // copy data - $this->fseek($offset); - $buffersize = ($this->data_string_flag ? $length : $this->getid3->fread_buffer_size()); - $bytesleft = $length; - while ($bytesleft > 0) { - if (($buffer = $this->fread(min($buffersize, $bytesleft))) === false || ($byteswritten = fwrite($fp_dest, $buffer)) === false || ($byteswritten === 0)) { - throw new Exception($buffer === false ? 'not enough data to read' : 'failed to write to destination file, may be not enough disk space'); - } - $bytesleft -= $byteswritten; - } - - fclose($fp_dest); - $attachment = $dest; - - } - - } catch (Exception $e) { - - // close and remove dest file if created - if (isset($fp_dest) && is_resource($fp_dest)) { - fclose($fp_dest); - unlink($dest); - } - - // do not set any is case of error - $attachment = null; - $this->warning('Failed to extract attachment '.$name.': '.$e->getMessage()); - - } - - // seek to the end of attachment - $this->fseek($offset + $length); - - return $attachment; - } - -} - - -class getid3_exception extends Exception -{ - public $message; -} diff --git a/wp/wp-includes/ID3/license.commercial.txt b/wp/wp-includes/ID3/license.commercial.txt deleted file mode 100644 index 416e5a14..00000000 --- a/wp/wp-includes/ID3/license.commercial.txt +++ /dev/null @@ -1,27 +0,0 @@ - getID3() Commercial License - =========================== - -getID3() is licensed under the "GNU Public License" (GPL) and/or the -"getID3() Commercial License" (gCL). This document describes the gCL. - ---------------------------------------------------------------------- - -The license is non-exclusively granted to a single person or company, -per payment of the license fee, for the lifetime of that person or -company. The license is non-transferrable. - -The gCL grants the licensee the right to use getID3() in commercial -closed-source projects. Modifications may be made to getID3() with no -obligation to release the modified source code. getID3() (or pieces -thereof) may be included in any number of projects authored (in whole -or in part) by the licensee. - -The licensee may use any version of getID3(), past, present or future, -as is most convenient. This license does not entitle the licensee to -receive any technical support, updates or bugfixes, except as such are -made publicly available to all getID3() users. - -The licensee may not sub-license getID3() itself, meaning that any -commercially released product containing all or parts of getID3() must -have added functionality beyond what is available in getID3(); -getID3() itself may not be re-licensed by the licensee. diff --git a/wp/wp-includes/ID3/license.txt b/wp/wp-includes/ID3/license.txt deleted file mode 100644 index 205c7e61..00000000 --- a/wp/wp-includes/ID3/license.txt +++ /dev/null @@ -1,29 +0,0 @@ -///////////////////////////////////////////////////////////////// -/// getID3() by James Heinrich // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// - -***************************************************************** -***************************************************************** - - getID3() is released under multiple licenses. You may choose - from the following licenses, and use getID3 according to the - terms of the license most suitable to your project. - -GNU GPL: https://gnu.org/licenses/gpl.html (v3) - https://gnu.org/licenses/old-licenses/gpl-2.0.html (v2) - https://gnu.org/licenses/old-licenses/gpl-1.0.html (v1) - -GNU LGPL: https://gnu.org/licenses/lgpl.html (v3) - -Mozilla MPL: http://www.mozilla.org/MPL/2.0/ (v2) - -getID3 Commercial License: http://getid3.org/#gCL (payment required) - -***************************************************************** -***************************************************************** - -Copies of each of the above licenses are included in the 'licenses' -directory of the getID3 distribution. diff --git a/wp/wp-includes/ID3/module.audio-video.asf.php b/wp/wp-includes/ID3/module.audio-video.asf.php deleted file mode 100644 index ee61d7dc..00000000 --- a/wp/wp-includes/ID3/module.audio-video.asf.php +++ /dev/null @@ -1,2013 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// -// See readme.txt for more details // -///////////////////////////////////////////////////////////////// -// // -// module.audio-video.asf.php // -// module for analyzing ASF, WMA and WMV files // -// dependencies: module.audio-video.riff.php // -// /// -///////////////////////////////////////////////////////////////// - -getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); - -class getid3_asf extends getid3_handler { - - public function __construct(getID3 $getid3) { - parent::__construct($getid3); // extends getid3_handler::__construct() - - // initialize all GUID constants - $GUIDarray = $this->KnownGUIDs(); - foreach ($GUIDarray as $GUIDname => $hexstringvalue) { - if (!defined($GUIDname)) { - define($GUIDname, $this->GUIDtoBytestring($hexstringvalue)); - } - } - } - - public function Analyze() { - $info = &$this->getid3->info; - - // Shortcuts - $thisfile_audio = &$info['audio']; - $thisfile_video = &$info['video']; - $info['asf'] = array(); - $thisfile_asf = &$info['asf']; - $thisfile_asf['comments'] = array(); - $thisfile_asf_comments = &$thisfile_asf['comments']; - $thisfile_asf['header_object'] = array(); - $thisfile_asf_headerobject = &$thisfile_asf['header_object']; - - - // ASF structure: - // * Header Object [required] - // * File Properties Object [required] (global file attributes) - // * Stream Properties Object [required] (defines media stream & characteristics) - // * Header Extension Object [required] (additional functionality) - // * Content Description Object (bibliographic information) - // * Script Command Object (commands for during playback) - // * Marker Object (named jumped points within the file) - // * Data Object [required] - // * Data Packets - // * Index Object - - // Header Object: (mandatory, one only) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for header object - GETID3_ASF_Header_Object - // Object Size QWORD 64 // size of header object, including 30 bytes of Header Object header - // Number of Header Objects DWORD 32 // number of objects in header object - // Reserved1 BYTE 8 // hardcoded: 0x01 - // Reserved2 BYTE 8 // hardcoded: 0x02 - - $info['fileformat'] = 'asf'; - - $this->fseek($info['avdataoffset']); - $HeaderObjectData = $this->fread(30); - - $thisfile_asf_headerobject['objectid'] = substr($HeaderObjectData, 0, 16); - $thisfile_asf_headerobject['objectid_guid'] = $this->BytestringToGUID($thisfile_asf_headerobject['objectid']); - if ($thisfile_asf_headerobject['objectid'] != GETID3_ASF_Header_Object) { - unset($info['fileformat'], $info['asf']); - return $this->error('ASF header GUID {'.$this->BytestringToGUID($thisfile_asf_headerobject['objectid']).'} does not match expected "GETID3_ASF_Header_Object" GUID {'.$this->BytestringToGUID(GETID3_ASF_Header_Object).'}'); - } - $thisfile_asf_headerobject['objectsize'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 16, 8)); - $thisfile_asf_headerobject['headerobjects'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 24, 4)); - $thisfile_asf_headerobject['reserved1'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 28, 1)); - $thisfile_asf_headerobject['reserved2'] = getid3_lib::LittleEndian2Int(substr($HeaderObjectData, 29, 1)); - - $NextObjectOffset = $this->ftell(); - $ASFHeaderData = $this->fread($thisfile_asf_headerobject['objectsize'] - 30); - $offset = 0; - - for ($HeaderObjectsCounter = 0; $HeaderObjectsCounter < $thisfile_asf_headerobject['headerobjects']; $HeaderObjectsCounter++) { - $NextObjectGUID = substr($ASFHeaderData, $offset, 16); - $offset += 16; - $NextObjectGUIDtext = $this->BytestringToGUID($NextObjectGUID); - $NextObjectSize = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); - $offset += 8; - switch ($NextObjectGUID) { - - case GETID3_ASF_File_Properties_Object: - // File Properties Object: (mandatory, one only) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for file properties object - GETID3_ASF_File_Properties_Object - // Object Size QWORD 64 // size of file properties object, including 104 bytes of File Properties Object header - // File ID GUID 128 // unique ID - identical to File ID in Data Object - // File Size QWORD 64 // entire file in bytes. Invalid if Broadcast Flag == 1 - // Creation Date QWORD 64 // date & time of file creation. Maybe invalid if Broadcast Flag == 1 - // Data Packets Count QWORD 64 // number of data packets in Data Object. Invalid if Broadcast Flag == 1 - // Play Duration QWORD 64 // playtime, in 100-nanosecond units. Invalid if Broadcast Flag == 1 - // Send Duration QWORD 64 // time needed to send file, in 100-nanosecond units. Players can ignore this value. Invalid if Broadcast Flag == 1 - // Preroll QWORD 64 // time to buffer data before starting to play file, in 1-millisecond units. If <> 0, PlayDuration and PresentationTime have been offset by this amount - // Flags DWORD 32 // - // * Broadcast Flag bits 1 (0x01) // file is currently being written, some header values are invalid - // * Seekable Flag bits 1 (0x02) // is file seekable - // * Reserved bits 30 (0xFFFFFFFC) // reserved - set to zero - // Minimum Data Packet Size DWORD 32 // in bytes. should be same as Maximum Data Packet Size. Invalid if Broadcast Flag == 1 - // Maximum Data Packet Size DWORD 32 // in bytes. should be same as Minimum Data Packet Size. Invalid if Broadcast Flag == 1 - // Maximum Bitrate DWORD 32 // maximum instantaneous bitrate in bits per second for entire file, including all data streams and ASF overhead - - // shortcut - $thisfile_asf['file_properties_object'] = array(); - $thisfile_asf_filepropertiesobject = &$thisfile_asf['file_properties_object']; - - $thisfile_asf_filepropertiesobject['offset'] = $NextObjectOffset + $offset; - $thisfile_asf_filepropertiesobject['objectid'] = $NextObjectGUID; - $thisfile_asf_filepropertiesobject['objectid_guid'] = $NextObjectGUIDtext; - $thisfile_asf_filepropertiesobject['objectsize'] = $NextObjectSize; - $thisfile_asf_filepropertiesobject['fileid'] = substr($ASFHeaderData, $offset, 16); - $offset += 16; - $thisfile_asf_filepropertiesobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_filepropertiesobject['fileid']); - $thisfile_asf_filepropertiesobject['filesize'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); - $offset += 8; - $thisfile_asf_filepropertiesobject['creation_date'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); - $thisfile_asf_filepropertiesobject['creation_date_unix'] = $this->FILETIMEtoUNIXtime($thisfile_asf_filepropertiesobject['creation_date']); - $offset += 8; - $thisfile_asf_filepropertiesobject['data_packets'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); - $offset += 8; - $thisfile_asf_filepropertiesobject['play_duration'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); - $offset += 8; - $thisfile_asf_filepropertiesobject['send_duration'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); - $offset += 8; - $thisfile_asf_filepropertiesobject['preroll'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); - $offset += 8; - $thisfile_asf_filepropertiesobject['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - $thisfile_asf_filepropertiesobject['flags']['broadcast'] = (bool) ($thisfile_asf_filepropertiesobject['flags_raw'] & 0x0001); - $thisfile_asf_filepropertiesobject['flags']['seekable'] = (bool) ($thisfile_asf_filepropertiesobject['flags_raw'] & 0x0002); - - $thisfile_asf_filepropertiesobject['min_packet_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - $thisfile_asf_filepropertiesobject['max_packet_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - $thisfile_asf_filepropertiesobject['max_bitrate'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - - if ($thisfile_asf_filepropertiesobject['flags']['broadcast']) { - - // broadcast flag is set, some values invalid - unset($thisfile_asf_filepropertiesobject['filesize']); - unset($thisfile_asf_filepropertiesobject['data_packets']); - unset($thisfile_asf_filepropertiesobject['play_duration']); - unset($thisfile_asf_filepropertiesobject['send_duration']); - unset($thisfile_asf_filepropertiesobject['min_packet_size']); - unset($thisfile_asf_filepropertiesobject['max_packet_size']); - - } else { - - // broadcast flag NOT set, perform calculations - $info['playtime_seconds'] = ($thisfile_asf_filepropertiesobject['play_duration'] / 10000000) - ($thisfile_asf_filepropertiesobject['preroll'] / 1000); - - //$info['bitrate'] = $thisfile_asf_filepropertiesobject['max_bitrate']; - $info['bitrate'] = ((isset($thisfile_asf_filepropertiesobject['filesize']) ? $thisfile_asf_filepropertiesobject['filesize'] : $info['filesize']) * 8) / $info['playtime_seconds']; - } - break; - - case GETID3_ASF_Stream_Properties_Object: - // Stream Properties Object: (mandatory, one per media stream) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for stream properties object - GETID3_ASF_Stream_Properties_Object - // Object Size QWORD 64 // size of stream properties object, including 78 bytes of Stream Properties Object header - // Stream Type GUID 128 // GETID3_ASF_Audio_Media, GETID3_ASF_Video_Media or GETID3_ASF_Command_Media - // Error Correction Type GUID 128 // GETID3_ASF_Audio_Spread for audio-only streams, GETID3_ASF_No_Error_Correction for other stream types - // Time Offset QWORD 64 // 100-nanosecond units. typically zero. added to all timestamps of samples in the stream - // Type-Specific Data Length DWORD 32 // number of bytes for Type-Specific Data field - // Error Correction Data Length DWORD 32 // number of bytes for Error Correction Data field - // Flags WORD 16 // - // * Stream Number bits 7 (0x007F) // number of this stream. 1 <= valid <= 127 - // * Reserved bits 8 (0x7F80) // reserved - set to zero - // * Encrypted Content Flag bits 1 (0x8000) // stream contents encrypted if set - // Reserved DWORD 32 // reserved - set to zero - // Type-Specific Data BYTESTREAM variable // type-specific format data, depending on value of Stream Type - // Error Correction Data BYTESTREAM variable // error-correction-specific format data, depending on value of Error Correct Type - - // There is one GETID3_ASF_Stream_Properties_Object for each stream (audio, video) but the - // stream number isn't known until halfway through decoding the structure, hence it - // it is decoded to a temporary variable and then stuck in the appropriate index later - - $StreamPropertiesObjectData['offset'] = $NextObjectOffset + $offset; - $StreamPropertiesObjectData['objectid'] = $NextObjectGUID; - $StreamPropertiesObjectData['objectid_guid'] = $NextObjectGUIDtext; - $StreamPropertiesObjectData['objectsize'] = $NextObjectSize; - $StreamPropertiesObjectData['stream_type'] = substr($ASFHeaderData, $offset, 16); - $offset += 16; - $StreamPropertiesObjectData['stream_type_guid'] = $this->BytestringToGUID($StreamPropertiesObjectData['stream_type']); - $StreamPropertiesObjectData['error_correct_type'] = substr($ASFHeaderData, $offset, 16); - $offset += 16; - $StreamPropertiesObjectData['error_correct_guid'] = $this->BytestringToGUID($StreamPropertiesObjectData['error_correct_type']); - $StreamPropertiesObjectData['time_offset'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); - $offset += 8; - $StreamPropertiesObjectData['type_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - $StreamPropertiesObjectData['error_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - $StreamPropertiesObjectData['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $StreamPropertiesObjectStreamNumber = $StreamPropertiesObjectData['flags_raw'] & 0x007F; - $StreamPropertiesObjectData['flags']['encrypted'] = (bool) ($StreamPropertiesObjectData['flags_raw'] & 0x8000); - - $offset += 4; // reserved - DWORD - $StreamPropertiesObjectData['type_specific_data'] = substr($ASFHeaderData, $offset, $StreamPropertiesObjectData['type_data_length']); - $offset += $StreamPropertiesObjectData['type_data_length']; - $StreamPropertiesObjectData['error_correct_data'] = substr($ASFHeaderData, $offset, $StreamPropertiesObjectData['error_data_length']); - $offset += $StreamPropertiesObjectData['error_data_length']; - - switch ($StreamPropertiesObjectData['stream_type']) { - - case GETID3_ASF_Audio_Media: - $thisfile_audio['dataformat'] = (!empty($thisfile_audio['dataformat']) ? $thisfile_audio['dataformat'] : 'asf'); - $thisfile_audio['bitrate_mode'] = (!empty($thisfile_audio['bitrate_mode']) ? $thisfile_audio['bitrate_mode'] : 'cbr'); - - $audiodata = getid3_riff::parseWAVEFORMATex(substr($StreamPropertiesObjectData['type_specific_data'], 0, 16)); - unset($audiodata['raw']); - $thisfile_audio = getid3_lib::array_merge_noclobber($audiodata, $thisfile_audio); - break; - - case GETID3_ASF_Video_Media: - $thisfile_video['dataformat'] = (!empty($thisfile_video['dataformat']) ? $thisfile_video['dataformat'] : 'asf'); - $thisfile_video['bitrate_mode'] = (!empty($thisfile_video['bitrate_mode']) ? $thisfile_video['bitrate_mode'] : 'cbr'); - break; - - case GETID3_ASF_Command_Media: - default: - // do nothing - break; - - } - - $thisfile_asf['stream_properties_object'][$StreamPropertiesObjectStreamNumber] = $StreamPropertiesObjectData; - unset($StreamPropertiesObjectData); // clear for next stream, if any - break; - - case GETID3_ASF_Header_Extension_Object: - // Header Extension Object: (mandatory, one only) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for Header Extension object - GETID3_ASF_Header_Extension_Object - // Object Size QWORD 64 // size of Header Extension object, including 46 bytes of Header Extension Object header - // Reserved Field 1 GUID 128 // hardcoded: GETID3_ASF_Reserved_1 - // Reserved Field 2 WORD 16 // hardcoded: 0x00000006 - // Header Extension Data Size DWORD 32 // in bytes. valid: 0, or > 24. equals object size minus 46 - // Header Extension Data BYTESTREAM variable // array of zero or more extended header objects - - // shortcut - $thisfile_asf['header_extension_object'] = array(); - $thisfile_asf_headerextensionobject = &$thisfile_asf['header_extension_object']; - - $thisfile_asf_headerextensionobject['offset'] = $NextObjectOffset + $offset; - $thisfile_asf_headerextensionobject['objectid'] = $NextObjectGUID; - $thisfile_asf_headerextensionobject['objectid_guid'] = $NextObjectGUIDtext; - $thisfile_asf_headerextensionobject['objectsize'] = $NextObjectSize; - $thisfile_asf_headerextensionobject['reserved_1'] = substr($ASFHeaderData, $offset, 16); - $offset += 16; - $thisfile_asf_headerextensionobject['reserved_1_guid'] = $this->BytestringToGUID($thisfile_asf_headerextensionobject['reserved_1']); - if ($thisfile_asf_headerextensionobject['reserved_1'] != GETID3_ASF_Reserved_1) { - $info['warning'][] = 'header_extension_object.reserved_1 GUID ('.$this->BytestringToGUID($thisfile_asf_headerextensionobject['reserved_1']).') does not match expected "GETID3_ASF_Reserved_1" GUID ('.$this->BytestringToGUID(GETID3_ASF_Reserved_1).')'; - //return false; - break; - } - $thisfile_asf_headerextensionobject['reserved_2'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - if ($thisfile_asf_headerextensionobject['reserved_2'] != 6) { - $info['warning'][] = 'header_extension_object.reserved_2 ('.getid3_lib::PrintHexBytes($thisfile_asf_headerextensionobject['reserved_2']).') does not match expected value of "6"'; - //return false; - break; - } - $thisfile_asf_headerextensionobject['extension_data_size'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - $thisfile_asf_headerextensionobject['extension_data'] = substr($ASFHeaderData, $offset, $thisfile_asf_headerextensionobject['extension_data_size']); - $unhandled_sections = 0; - $thisfile_asf_headerextensionobject['extension_data_parsed'] = $this->HeaderExtensionObjectDataParse($thisfile_asf_headerextensionobject['extension_data'], $unhandled_sections); - if ($unhandled_sections === 0) { - unset($thisfile_asf_headerextensionobject['extension_data']); - } - $offset += $thisfile_asf_headerextensionobject['extension_data_size']; - break; - - case GETID3_ASF_Codec_List_Object: - // Codec List Object: (optional, one only) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for Codec List object - GETID3_ASF_Codec_List_Object - // Object Size QWORD 64 // size of Codec List object, including 44 bytes of Codec List Object header - // Reserved GUID 128 // hardcoded: 86D15241-311D-11D0-A3A4-00A0C90348F6 - // Codec Entries Count DWORD 32 // number of entries in Codec Entries array - // Codec Entries array of: variable // - // * Type WORD 16 // 0x0001 = Video Codec, 0x0002 = Audio Codec, 0xFFFF = Unknown Codec - // * Codec Name Length WORD 16 // number of Unicode characters stored in the Codec Name field - // * Codec Name WCHAR variable // array of Unicode characters - name of codec used to create the content - // * Codec Description Length WORD 16 // number of Unicode characters stored in the Codec Description field - // * Codec Description WCHAR variable // array of Unicode characters - description of format used to create the content - // * Codec Information Length WORD 16 // number of Unicode characters stored in the Codec Information field - // * Codec Information BYTESTREAM variable // opaque array of information bytes about the codec used to create the content - - // shortcut - $thisfile_asf['codec_list_object'] = array(); - $thisfile_asf_codeclistobject = &$thisfile_asf['codec_list_object']; - - $thisfile_asf_codeclistobject['offset'] = $NextObjectOffset + $offset; - $thisfile_asf_codeclistobject['objectid'] = $NextObjectGUID; - $thisfile_asf_codeclistobject['objectid_guid'] = $NextObjectGUIDtext; - $thisfile_asf_codeclistobject['objectsize'] = $NextObjectSize; - $thisfile_asf_codeclistobject['reserved'] = substr($ASFHeaderData, $offset, 16); - $offset += 16; - $thisfile_asf_codeclistobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_codeclistobject['reserved']); - if ($thisfile_asf_codeclistobject['reserved'] != $this->GUIDtoBytestring('86D15241-311D-11D0-A3A4-00A0C90348F6')) { - $info['warning'][] = 'codec_list_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_codeclistobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {86D15241-311D-11D0-A3A4-00A0C90348F6}'; - //return false; - break; - } - $thisfile_asf_codeclistobject['codec_entries_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - for ($CodecEntryCounter = 0; $CodecEntryCounter < $thisfile_asf_codeclistobject['codec_entries_count']; $CodecEntryCounter++) { - // shortcut - $thisfile_asf_codeclistobject['codec_entries'][$CodecEntryCounter] = array(); - $thisfile_asf_codeclistobject_codecentries_current = &$thisfile_asf_codeclistobject['codec_entries'][$CodecEntryCounter]; - - $thisfile_asf_codeclistobject_codecentries_current['type_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_codeclistobject_codecentries_current['type'] = self::codecListObjectTypeLookup($thisfile_asf_codeclistobject_codecentries_current['type_raw']); - - $CodecNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character - $offset += 2; - $thisfile_asf_codeclistobject_codecentries_current['name'] = substr($ASFHeaderData, $offset, $CodecNameLength); - $offset += $CodecNameLength; - - $CodecDescriptionLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character - $offset += 2; - $thisfile_asf_codeclistobject_codecentries_current['description'] = substr($ASFHeaderData, $offset, $CodecDescriptionLength); - $offset += $CodecDescriptionLength; - - $CodecInformationLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_codeclistobject_codecentries_current['information'] = substr($ASFHeaderData, $offset, $CodecInformationLength); - $offset += $CodecInformationLength; - - if ($thisfile_asf_codeclistobject_codecentries_current['type_raw'] == 2) { // audio codec - - if (strpos($thisfile_asf_codeclistobject_codecentries_current['description'], ',') === false) { - $info['warning'][] = '[asf][codec_list_object][codec_entries]['.$CodecEntryCounter.'][description] expected to contain comma-seperated list of parameters: "'.$thisfile_asf_codeclistobject_codecentries_current['description'].'"'; - } else { - - list($AudioCodecBitrate, $AudioCodecFrequency, $AudioCodecChannels) = explode(',', $this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description'])); - $thisfile_audio['codec'] = $this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['name']); - - if (!isset($thisfile_audio['bitrate']) && strstr($AudioCodecBitrate, 'kbps')) { - $thisfile_audio['bitrate'] = (int) (trim(str_replace('kbps', '', $AudioCodecBitrate)) * 1000); - } - //if (!isset($thisfile_video['bitrate']) && isset($thisfile_audio['bitrate']) && isset($thisfile_asf['file_properties_object']['max_bitrate']) && ($thisfile_asf_codeclistobject['codec_entries_count'] > 1)) { - if (empty($thisfile_video['bitrate']) && !empty($thisfile_audio['bitrate']) && !empty($info['bitrate'])) { - //$thisfile_video['bitrate'] = $thisfile_asf['file_properties_object']['max_bitrate'] - $thisfile_audio['bitrate']; - $thisfile_video['bitrate'] = $info['bitrate'] - $thisfile_audio['bitrate']; - } - - $AudioCodecFrequency = (int) trim(str_replace('kHz', '', $AudioCodecFrequency)); - switch ($AudioCodecFrequency) { - case 8: - case 8000: - $thisfile_audio['sample_rate'] = 8000; - break; - - case 11: - case 11025: - $thisfile_audio['sample_rate'] = 11025; - break; - - case 12: - case 12000: - $thisfile_audio['sample_rate'] = 12000; - break; - - case 16: - case 16000: - $thisfile_audio['sample_rate'] = 16000; - break; - - case 22: - case 22050: - $thisfile_audio['sample_rate'] = 22050; - break; - - case 24: - case 24000: - $thisfile_audio['sample_rate'] = 24000; - break; - - case 32: - case 32000: - $thisfile_audio['sample_rate'] = 32000; - break; - - case 44: - case 441000: - $thisfile_audio['sample_rate'] = 44100; - break; - - case 48: - case 48000: - $thisfile_audio['sample_rate'] = 48000; - break; - - default: - $info['warning'][] = 'unknown frequency: "'.$AudioCodecFrequency.'" ('.$this->TrimConvert($thisfile_asf_codeclistobject_codecentries_current['description']).')'; - break; - } - - if (!isset($thisfile_audio['channels'])) { - if (strstr($AudioCodecChannels, 'stereo')) { - $thisfile_audio['channels'] = 2; - } elseif (strstr($AudioCodecChannels, 'mono')) { - $thisfile_audio['channels'] = 1; - } - } - - } - } - } - break; - - case GETID3_ASF_Script_Command_Object: - // Script Command Object: (optional, one only) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for Script Command object - GETID3_ASF_Script_Command_Object - // Object Size QWORD 64 // size of Script Command object, including 44 bytes of Script Command Object header - // Reserved GUID 128 // hardcoded: 4B1ACBE3-100B-11D0-A39B-00A0C90348F6 - // Commands Count WORD 16 // number of Commands structures in the Script Commands Objects - // Command Types Count WORD 16 // number of Command Types structures in the Script Commands Objects - // Command Types array of: variable // - // * Command Type Name Length WORD 16 // number of Unicode characters for Command Type Name - // * Command Type Name WCHAR variable // array of Unicode characters - name of a type of command - // Commands array of: variable // - // * Presentation Time DWORD 32 // presentation time of that command, in milliseconds - // * Type Index WORD 16 // type of this command, as a zero-based index into the array of Command Types of this object - // * Command Name Length WORD 16 // number of Unicode characters for Command Name - // * Command Name WCHAR variable // array of Unicode characters - name of this command - - // shortcut - $thisfile_asf['script_command_object'] = array(); - $thisfile_asf_scriptcommandobject = &$thisfile_asf['script_command_object']; - - $thisfile_asf_scriptcommandobject['offset'] = $NextObjectOffset + $offset; - $thisfile_asf_scriptcommandobject['objectid'] = $NextObjectGUID; - $thisfile_asf_scriptcommandobject['objectid_guid'] = $NextObjectGUIDtext; - $thisfile_asf_scriptcommandobject['objectsize'] = $NextObjectSize; - $thisfile_asf_scriptcommandobject['reserved'] = substr($ASFHeaderData, $offset, 16); - $offset += 16; - $thisfile_asf_scriptcommandobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_scriptcommandobject['reserved']); - if ($thisfile_asf_scriptcommandobject['reserved'] != $this->GUIDtoBytestring('4B1ACBE3-100B-11D0-A39B-00A0C90348F6')) { - $info['warning'][] = 'script_command_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_scriptcommandobject['reserved']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {4B1ACBE3-100B-11D0-A39B-00A0C90348F6}'; - //return false; - break; - } - $thisfile_asf_scriptcommandobject['commands_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_scriptcommandobject['command_types_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - for ($CommandTypesCounter = 0; $CommandTypesCounter < $thisfile_asf_scriptcommandobject['command_types_count']; $CommandTypesCounter++) { - $CommandTypeNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character - $offset += 2; - $thisfile_asf_scriptcommandobject['command_types'][$CommandTypesCounter]['name'] = substr($ASFHeaderData, $offset, $CommandTypeNameLength); - $offset += $CommandTypeNameLength; - } - for ($CommandsCounter = 0; $CommandsCounter < $thisfile_asf_scriptcommandobject['commands_count']; $CommandsCounter++) { - $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['presentation_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['type_index'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - - $CommandTypeNameLength = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)) * 2; // 2 bytes per character - $offset += 2; - $thisfile_asf_scriptcommandobject['commands'][$CommandsCounter]['name'] = substr($ASFHeaderData, $offset, $CommandTypeNameLength); - $offset += $CommandTypeNameLength; - } - break; - - case GETID3_ASF_Marker_Object: - // Marker Object: (optional, one only) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for Marker object - GETID3_ASF_Marker_Object - // Object Size QWORD 64 // size of Marker object, including 48 bytes of Marker Object header - // Reserved GUID 128 // hardcoded: 4CFEDB20-75F6-11CF-9C0F-00A0C90349CB - // Markers Count DWORD 32 // number of Marker structures in Marker Object - // Reserved WORD 16 // hardcoded: 0x0000 - // Name Length WORD 16 // number of bytes in the Name field - // Name WCHAR variable // name of the Marker Object - // Markers array of: variable // - // * Offset QWORD 64 // byte offset into Data Object - // * Presentation Time QWORD 64 // in 100-nanosecond units - // * Entry Length WORD 16 // length in bytes of (Send Time + Flags + Marker Description Length + Marker Description + Padding) - // * Send Time DWORD 32 // in milliseconds - // * Flags DWORD 32 // hardcoded: 0x00000000 - // * Marker Description Length DWORD 32 // number of bytes in Marker Description field - // * Marker Description WCHAR variable // array of Unicode characters - description of marker entry - // * Padding BYTESTREAM variable // optional padding bytes - - // shortcut - $thisfile_asf['marker_object'] = array(); - $thisfile_asf_markerobject = &$thisfile_asf['marker_object']; - - $thisfile_asf_markerobject['offset'] = $NextObjectOffset + $offset; - $thisfile_asf_markerobject['objectid'] = $NextObjectGUID; - $thisfile_asf_markerobject['objectid_guid'] = $NextObjectGUIDtext; - $thisfile_asf_markerobject['objectsize'] = $NextObjectSize; - $thisfile_asf_markerobject['reserved'] = substr($ASFHeaderData, $offset, 16); - $offset += 16; - $thisfile_asf_markerobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_markerobject['reserved']); - if ($thisfile_asf_markerobject['reserved'] != $this->GUIDtoBytestring('4CFEDB20-75F6-11CF-9C0F-00A0C90349CB')) { - $info['warning'][] = 'marker_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_markerobject['reserved_1']).'} does not match expected "GETID3_ASF_Reserved_1" GUID {4CFEDB20-75F6-11CF-9C0F-00A0C90349CB}'; - break; - } - $thisfile_asf_markerobject['markers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - $thisfile_asf_markerobject['reserved_2'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - if ($thisfile_asf_markerobject['reserved_2'] != 0) { - $info['warning'][] = 'marker_object.reserved_2 ('.getid3_lib::PrintHexBytes($thisfile_asf_markerobject['reserved_2']).') does not match expected value of "0"'; - break; - } - $thisfile_asf_markerobject['name_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_markerobject['name'] = substr($ASFHeaderData, $offset, $thisfile_asf_markerobject['name_length']); - $offset += $thisfile_asf_markerobject['name_length']; - for ($MarkersCounter = 0; $MarkersCounter < $thisfile_asf_markerobject['markers_count']; $MarkersCounter++) { - $thisfile_asf_markerobject['markers'][$MarkersCounter]['offset'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); - $offset += 8; - $thisfile_asf_markerobject['markers'][$MarkersCounter]['presentation_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 8)); - $offset += 8; - $thisfile_asf_markerobject['markers'][$MarkersCounter]['entry_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_markerobject['markers'][$MarkersCounter]['send_time'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - $thisfile_asf_markerobject['markers'][$MarkersCounter]['flags'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description'] = substr($ASFHeaderData, $offset, $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']); - $offset += $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']; - $PaddingLength = $thisfile_asf_markerobject['markers'][$MarkersCounter]['entry_length'] - 4 - 4 - 4 - $thisfile_asf_markerobject['markers'][$MarkersCounter]['marker_description_length']; - if ($PaddingLength > 0) { - $thisfile_asf_markerobject['markers'][$MarkersCounter]['padding'] = substr($ASFHeaderData, $offset, $PaddingLength); - $offset += $PaddingLength; - } - } - break; - - case GETID3_ASF_Bitrate_Mutual_Exclusion_Object: - // Bitrate Mutual Exclusion Object: (optional) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for Bitrate Mutual Exclusion object - GETID3_ASF_Bitrate_Mutual_Exclusion_Object - // Object Size QWORD 64 // size of Bitrate Mutual Exclusion object, including 42 bytes of Bitrate Mutual Exclusion Object header - // Exlusion Type GUID 128 // nature of mutual exclusion relationship. one of: (GETID3_ASF_Mutex_Bitrate, GETID3_ASF_Mutex_Unknown) - // Stream Numbers Count WORD 16 // number of video streams - // Stream Numbers WORD variable // array of mutually exclusive video stream numbers. 1 <= valid <= 127 - - // shortcut - $thisfile_asf['bitrate_mutual_exclusion_object'] = array(); - $thisfile_asf_bitratemutualexclusionobject = &$thisfile_asf['bitrate_mutual_exclusion_object']; - - $thisfile_asf_bitratemutualexclusionobject['offset'] = $NextObjectOffset + $offset; - $thisfile_asf_bitratemutualexclusionobject['objectid'] = $NextObjectGUID; - $thisfile_asf_bitratemutualexclusionobject['objectid_guid'] = $NextObjectGUIDtext; - $thisfile_asf_bitratemutualexclusionobject['objectsize'] = $NextObjectSize; - $thisfile_asf_bitratemutualexclusionobject['reserved'] = substr($ASFHeaderData, $offset, 16); - $thisfile_asf_bitratemutualexclusionobject['reserved_guid'] = $this->BytestringToGUID($thisfile_asf_bitratemutualexclusionobject['reserved']); - $offset += 16; - if (($thisfile_asf_bitratemutualexclusionobject['reserved'] != GETID3_ASF_Mutex_Bitrate) && ($thisfile_asf_bitratemutualexclusionobject['reserved'] != GETID3_ASF_Mutex_Unknown)) { - $info['warning'][] = 'bitrate_mutual_exclusion_object.reserved GUID {'.$this->BytestringToGUID($thisfile_asf_bitratemutualexclusionobject['reserved']).'} does not match expected "GETID3_ASF_Mutex_Bitrate" GUID {'.$this->BytestringToGUID(GETID3_ASF_Mutex_Bitrate).'} or "GETID3_ASF_Mutex_Unknown" GUID {'.$this->BytestringToGUID(GETID3_ASF_Mutex_Unknown).'}'; - //return false; - break; - } - $thisfile_asf_bitratemutualexclusionobject['stream_numbers_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - for ($StreamNumberCounter = 0; $StreamNumberCounter < $thisfile_asf_bitratemutualexclusionobject['stream_numbers_count']; $StreamNumberCounter++) { - $thisfile_asf_bitratemutualexclusionobject['stream_numbers'][$StreamNumberCounter] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - } - break; - - case GETID3_ASF_Error_Correction_Object: - // Error Correction Object: (optional, one only) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for Error Correction object - GETID3_ASF_Error_Correction_Object - // Object Size QWORD 64 // size of Error Correction object, including 44 bytes of Error Correction Object header - // Error Correction Type GUID 128 // type of error correction. one of: (GETID3_ASF_No_Error_Correction, GETID3_ASF_Audio_Spread) - // Error Correction Data Length DWORD 32 // number of bytes in Error Correction Data field - // Error Correction Data BYTESTREAM variable // structure depends on value of Error Correction Type field - - // shortcut - $thisfile_asf['error_correction_object'] = array(); - $thisfile_asf_errorcorrectionobject = &$thisfile_asf['error_correction_object']; - - $thisfile_asf_errorcorrectionobject['offset'] = $NextObjectOffset + $offset; - $thisfile_asf_errorcorrectionobject['objectid'] = $NextObjectGUID; - $thisfile_asf_errorcorrectionobject['objectid_guid'] = $NextObjectGUIDtext; - $thisfile_asf_errorcorrectionobject['objectsize'] = $NextObjectSize; - $thisfile_asf_errorcorrectionobject['error_correction_type'] = substr($ASFHeaderData, $offset, 16); - $offset += 16; - $thisfile_asf_errorcorrectionobject['error_correction_guid'] = $this->BytestringToGUID($thisfile_asf_errorcorrectionobject['error_correction_type']); - $thisfile_asf_errorcorrectionobject['error_correction_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - switch ($thisfile_asf_errorcorrectionobject['error_correction_type']) { - case GETID3_ASF_No_Error_Correction: - // should be no data, but just in case there is, skip to the end of the field - $offset += $thisfile_asf_errorcorrectionobject['error_correction_data_length']; - break; - - case GETID3_ASF_Audio_Spread: - // Field Name Field Type Size (bits) - // Span BYTE 8 // number of packets over which audio will be spread. - // Virtual Packet Length WORD 16 // size of largest audio payload found in audio stream - // Virtual Chunk Length WORD 16 // size of largest audio payload found in audio stream - // Silence Data Length WORD 16 // number of bytes in Silence Data field - // Silence Data BYTESTREAM variable // hardcoded: 0x00 * (Silence Data Length) bytes - - $thisfile_asf_errorcorrectionobject['span'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 1)); - $offset += 1; - $thisfile_asf_errorcorrectionobject['virtual_packet_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_errorcorrectionobject['virtual_chunk_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_errorcorrectionobject['silence_data_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_errorcorrectionobject['silence_data'] = substr($ASFHeaderData, $offset, $thisfile_asf_errorcorrectionobject['silence_data_length']); - $offset += $thisfile_asf_errorcorrectionobject['silence_data_length']; - break; - - default: - $info['warning'][] = 'error_correction_object.error_correction_type GUID {'.$this->BytestringToGUID($thisfile_asf_errorcorrectionobject['reserved']).'} does not match expected "GETID3_ASF_No_Error_Correction" GUID {'.$this->BytestringToGUID(GETID3_ASF_No_Error_Correction).'} or "GETID3_ASF_Audio_Spread" GUID {'.$this->BytestringToGUID(GETID3_ASF_Audio_Spread).'}'; - //return false; - break; - } - - break; - - case GETID3_ASF_Content_Description_Object: - // Content Description Object: (optional, one only) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for Content Description object - GETID3_ASF_Content_Description_Object - // Object Size QWORD 64 // size of Content Description object, including 34 bytes of Content Description Object header - // Title Length WORD 16 // number of bytes in Title field - // Author Length WORD 16 // number of bytes in Author field - // Copyright Length WORD 16 // number of bytes in Copyright field - // Description Length WORD 16 // number of bytes in Description field - // Rating Length WORD 16 // number of bytes in Rating field - // Title WCHAR 16 // array of Unicode characters - Title - // Author WCHAR 16 // array of Unicode characters - Author - // Copyright WCHAR 16 // array of Unicode characters - Copyright - // Description WCHAR 16 // array of Unicode characters - Description - // Rating WCHAR 16 // array of Unicode characters - Rating - - // shortcut - $thisfile_asf['content_description_object'] = array(); - $thisfile_asf_contentdescriptionobject = &$thisfile_asf['content_description_object']; - - $thisfile_asf_contentdescriptionobject['offset'] = $NextObjectOffset + $offset; - $thisfile_asf_contentdescriptionobject['objectid'] = $NextObjectGUID; - $thisfile_asf_contentdescriptionobject['objectid_guid'] = $NextObjectGUIDtext; - $thisfile_asf_contentdescriptionobject['objectsize'] = $NextObjectSize; - $thisfile_asf_contentdescriptionobject['title_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_contentdescriptionobject['author_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_contentdescriptionobject['copyright_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_contentdescriptionobject['description_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_contentdescriptionobject['rating_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_contentdescriptionobject['title'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['title_length']); - $offset += $thisfile_asf_contentdescriptionobject['title_length']; - $thisfile_asf_contentdescriptionobject['author'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['author_length']); - $offset += $thisfile_asf_contentdescriptionobject['author_length']; - $thisfile_asf_contentdescriptionobject['copyright'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['copyright_length']); - $offset += $thisfile_asf_contentdescriptionobject['copyright_length']; - $thisfile_asf_contentdescriptionobject['description'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['description_length']); - $offset += $thisfile_asf_contentdescriptionobject['description_length']; - $thisfile_asf_contentdescriptionobject['rating'] = substr($ASFHeaderData, $offset, $thisfile_asf_contentdescriptionobject['rating_length']); - $offset += $thisfile_asf_contentdescriptionobject['rating_length']; - - $ASFcommentKeysToCopy = array('title'=>'title', 'author'=>'artist', 'copyright'=>'copyright', 'description'=>'comment', 'rating'=>'rating'); - foreach ($ASFcommentKeysToCopy as $keytocopyfrom => $keytocopyto) { - if (!empty($thisfile_asf_contentdescriptionobject[$keytocopyfrom])) { - $thisfile_asf_comments[$keytocopyto][] = $this->TrimTerm($thisfile_asf_contentdescriptionobject[$keytocopyfrom]); - } - } - break; - - case GETID3_ASF_Extended_Content_Description_Object: - // Extended Content Description Object: (optional, one only) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for Extended Content Description object - GETID3_ASF_Extended_Content_Description_Object - // Object Size QWORD 64 // size of ExtendedContent Description object, including 26 bytes of Extended Content Description Object header - // Content Descriptors Count WORD 16 // number of entries in Content Descriptors list - // Content Descriptors array of: variable // - // * Descriptor Name Length WORD 16 // size in bytes of Descriptor Name field - // * Descriptor Name WCHAR variable // array of Unicode characters - Descriptor Name - // * Descriptor Value Data Type WORD 16 // Lookup array: - // 0x0000 = Unicode String (variable length) - // 0x0001 = BYTE array (variable length) - // 0x0002 = BOOL (DWORD, 32 bits) - // 0x0003 = DWORD (DWORD, 32 bits) - // 0x0004 = QWORD (QWORD, 64 bits) - // 0x0005 = WORD (WORD, 16 bits) - // * Descriptor Value Length WORD 16 // number of bytes stored in Descriptor Value field - // * Descriptor Value variable variable // value for Content Descriptor - - // shortcut - $thisfile_asf['extended_content_description_object'] = array(); - $thisfile_asf_extendedcontentdescriptionobject = &$thisfile_asf['extended_content_description_object']; - - $thisfile_asf_extendedcontentdescriptionobject['offset'] = $NextObjectOffset + $offset; - $thisfile_asf_extendedcontentdescriptionobject['objectid'] = $NextObjectGUID; - $thisfile_asf_extendedcontentdescriptionobject['objectid_guid'] = $NextObjectGUIDtext; - $thisfile_asf_extendedcontentdescriptionobject['objectsize'] = $NextObjectSize; - $thisfile_asf_extendedcontentdescriptionobject['content_descriptors_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - for ($ExtendedContentDescriptorsCounter = 0; $ExtendedContentDescriptorsCounter < $thisfile_asf_extendedcontentdescriptionobject['content_descriptors_count']; $ExtendedContentDescriptorsCounter++) { - // shortcut - $thisfile_asf_extendedcontentdescriptionobject['content_descriptors'][$ExtendedContentDescriptorsCounter] = array(); - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current = &$thisfile_asf_extendedcontentdescriptionobject['content_descriptors'][$ExtendedContentDescriptorsCounter]; - - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['base_offset'] = $offset + 30; - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name'] = substr($ASFHeaderData, $offset, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length']); - $offset += $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name_length']; - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = substr($ASFHeaderData, $offset, $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length']); - $offset += $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length']; - switch ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']) { - case 0x0000: // Unicode string - break; - - case 0x0001: // BYTE array - // do nothing - break; - - case 0x0002: // BOOL - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = (bool) getid3_lib::LittleEndian2Int($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); - break; - - case 0x0003: // DWORD - case 0x0004: // QWORD - case 0x0005: // WORD - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = getid3_lib::LittleEndian2Int($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); - break; - - default: - $info['warning'][] = 'extended_content_description.content_descriptors.'.$ExtendedContentDescriptorsCounter.'.value_type is invalid ('.$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type'].')'; - //return false; - break; - } - switch ($this->TrimConvert(strtolower($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']))) { - - case 'wm/albumartist': - case 'artist': - // Note: not 'artist', that comes from 'author' tag - $thisfile_asf_comments['albumartist'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); - break; - - case 'wm/albumtitle': - case 'album': - $thisfile_asf_comments['album'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); - break; - - case 'wm/genre': - case 'genre': - $thisfile_asf_comments['genre'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); - break; - - case 'wm/partofset': - $thisfile_asf_comments['partofset'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); - break; - - case 'wm/tracknumber': - case 'tracknumber': - // be careful casting to int: casting unicode strings to int gives unexpected results (stops parsing at first non-numeric character) - $thisfile_asf_comments['track'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); - foreach ($thisfile_asf_comments['track'] as $key => $value) { - if (preg_match('/^[0-9\x00]+$/', $value)) { - $thisfile_asf_comments['track'][$key] = intval(str_replace("\x00", '', $value)); - } - } - break; - - case 'wm/track': - if (empty($thisfile_asf_comments['track'])) { - $thisfile_asf_comments['track'] = array(1 + $this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); - } - break; - - case 'wm/year': - case 'year': - case 'date': - $thisfile_asf_comments['year'] = array( $this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); - break; - - case 'wm/lyrics': - case 'lyrics': - $thisfile_asf_comments['lyrics'] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); - break; - - case 'isvbr': - if ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']) { - $thisfile_audio['bitrate_mode'] = 'vbr'; - $thisfile_video['bitrate_mode'] = 'vbr'; - } - break; - - case 'id3': - $this->getid3->include_module('tag.id3v2'); - - $getid3_id3v2 = new getid3_id3v2($this->getid3); - $getid3_id3v2->AnalyzeString($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); - unset($getid3_id3v2); - - if ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_length'] > 1024) { - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'] = ''; - } - break; - - case 'wm/encodingtime': - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['encoding_time_unix'] = $this->FILETIMEtoUNIXtime($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); - $thisfile_asf_comments['encoding_time_unix'] = array($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['encoding_time_unix']); - break; - - case 'wm/picture': - $WMpicture = $this->ASF_WMpicture($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); - foreach ($WMpicture as $key => $value) { - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current[$key] = $value; - } - unset($WMpicture); -/* - $wm_picture_offset = 0; - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type_id'] = getid3_lib::LittleEndian2Int(substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 1)); - $wm_picture_offset += 1; - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type'] = self::WMpictureTypeLookup($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_type_id']); - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_size'] = getid3_lib::LittleEndian2Int(substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 4)); - $wm_picture_offset += 4; - - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = ''; - do { - $next_byte_pair = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 2); - $wm_picture_offset += 2; - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] .= $next_byte_pair; - } while ($next_byte_pair !== "\x00\x00"); - - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_description'] = ''; - do { - $next_byte_pair = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset, 2); - $wm_picture_offset += 2; - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_description'] .= $next_byte_pair; - } while ($next_byte_pair !== "\x00\x00"); - - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['dataoffset'] = $wm_picture_offset; - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'] = substr($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'], $wm_picture_offset); - unset($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value']); - - $imageinfo = array(); - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = ''; - $imagechunkcheck = getid3_lib::GetDataImageSize($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'], $imageinfo); - unset($imageinfo); - if (!empty($imagechunkcheck)) { - $thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]); - } - if (!isset($thisfile_asf_comments['picture'])) { - $thisfile_asf_comments['picture'] = array(); - } - $thisfile_asf_comments['picture'][] = array('data'=>$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['data'], 'image_mime'=>$thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['image_mime']); -*/ - break; - - default: - switch ($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value_type']) { - case 0: // Unicode string - if (substr($this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name']), 0, 3) == 'WM/') { - $thisfile_asf_comments[str_replace('wm/', '', strtolower($this->TrimConvert($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['name'])))] = array($this->TrimTerm($thisfile_asf_extendedcontentdescriptionobject_contentdescriptor_current['value'])); - } - break; - - case 1: - break; - } - break; - } - - } - break; - - case GETID3_ASF_Stream_Bitrate_Properties_Object: - // Stream Bitrate Properties Object: (optional, one only) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for Stream Bitrate Properties object - GETID3_ASF_Stream_Bitrate_Properties_Object - // Object Size QWORD 64 // size of Extended Content Description object, including 26 bytes of Stream Bitrate Properties Object header - // Bitrate Records Count WORD 16 // number of records in Bitrate Records - // Bitrate Records array of: variable // - // * Flags WORD 16 // - // * * Stream Number bits 7 (0x007F) // number of this stream - // * * Reserved bits 9 (0xFF80) // hardcoded: 0 - // * Average Bitrate DWORD 32 // in bits per second - - // shortcut - $thisfile_asf['stream_bitrate_properties_object'] = array(); - $thisfile_asf_streambitratepropertiesobject = &$thisfile_asf['stream_bitrate_properties_object']; - - $thisfile_asf_streambitratepropertiesobject['offset'] = $NextObjectOffset + $offset; - $thisfile_asf_streambitratepropertiesobject['objectid'] = $NextObjectGUID; - $thisfile_asf_streambitratepropertiesobject['objectid_guid'] = $NextObjectGUIDtext; - $thisfile_asf_streambitratepropertiesobject['objectsize'] = $NextObjectSize; - $thisfile_asf_streambitratepropertiesobject['bitrate_records_count'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - for ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitratepropertiesobject['bitrate_records_count']; $BitrateRecordsCounter++) { - $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2)); - $offset += 2; - $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags']['stream_number'] = $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['flags_raw'] & 0x007F; - $thisfile_asf_streambitratepropertiesobject['bitrate_records'][$BitrateRecordsCounter]['bitrate'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 4)); - $offset += 4; - } - break; - - case GETID3_ASF_Padding_Object: - // Padding Object: (optional) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for Padding object - GETID3_ASF_Padding_Object - // Object Size QWORD 64 // size of Padding object, including 24 bytes of ASF Padding Object header - // Padding Data BYTESTREAM variable // ignore - - // shortcut - $thisfile_asf['padding_object'] = array(); - $thisfile_asf_paddingobject = &$thisfile_asf['padding_object']; - - $thisfile_asf_paddingobject['offset'] = $NextObjectOffset + $offset; - $thisfile_asf_paddingobject['objectid'] = $NextObjectGUID; - $thisfile_asf_paddingobject['objectid_guid'] = $NextObjectGUIDtext; - $thisfile_asf_paddingobject['objectsize'] = $NextObjectSize; - $thisfile_asf_paddingobject['padding_length'] = $thisfile_asf_paddingobject['objectsize'] - 16 - 8; - $thisfile_asf_paddingobject['padding'] = substr($ASFHeaderData, $offset, $thisfile_asf_paddingobject['padding_length']); - $offset += ($NextObjectSize - 16 - 8); - break; - - case GETID3_ASF_Extended_Content_Encryption_Object: - case GETID3_ASF_Content_Encryption_Object: - // WMA DRM - just ignore - $offset += ($NextObjectSize - 16 - 8); - break; - - default: - // Implementations shall ignore any standard or non-standard object that they do not know how to handle. - if ($this->GUIDname($NextObjectGUIDtext)) { - $info['warning'][] = 'unhandled GUID "'.$this->GUIDname($NextObjectGUIDtext).'" {'.$NextObjectGUIDtext.'} in ASF header at offset '.($offset - 16 - 8); - } else { - $info['warning'][] = 'unknown GUID {'.$NextObjectGUIDtext.'} in ASF header at offset '.($offset - 16 - 8); - } - $offset += ($NextObjectSize - 16 - 8); - break; - } - } - if (isset($thisfile_asf_streambitrateproperties['bitrate_records_count'])) { - $ASFbitrateAudio = 0; - $ASFbitrateVideo = 0; - for ($BitrateRecordsCounter = 0; $BitrateRecordsCounter < $thisfile_asf_streambitrateproperties['bitrate_records_count']; $BitrateRecordsCounter++) { - if (isset($thisfile_asf_codeclistobject['codec_entries'][$BitrateRecordsCounter])) { - switch ($thisfile_asf_codeclistobject['codec_entries'][$BitrateRecordsCounter]['type_raw']) { - case 1: - $ASFbitrateVideo += $thisfile_asf_streambitrateproperties['bitrate_records'][$BitrateRecordsCounter]['bitrate']; - break; - - case 2: - $ASFbitrateAudio += $thisfile_asf_streambitrateproperties['bitrate_records'][$BitrateRecordsCounter]['bitrate']; - break; - - default: - // do nothing - break; - } - } - } - if ($ASFbitrateAudio > 0) { - $thisfile_audio['bitrate'] = $ASFbitrateAudio; - } - if ($ASFbitrateVideo > 0) { - $thisfile_video['bitrate'] = $ASFbitrateVideo; - } - } - if (isset($thisfile_asf['stream_properties_object']) && is_array($thisfile_asf['stream_properties_object'])) { - - $thisfile_audio['bitrate'] = 0; - $thisfile_video['bitrate'] = 0; - - foreach ($thisfile_asf['stream_properties_object'] as $streamnumber => $streamdata) { - - switch ($streamdata['stream_type']) { - case GETID3_ASF_Audio_Media: - // Field Name Field Type Size (bits) - // Codec ID / Format Tag WORD 16 // unique ID of audio codec - defined as wFormatTag field of WAVEFORMATEX structure - // Number of Channels WORD 16 // number of channels of audio - defined as nChannels field of WAVEFORMATEX structure - // Samples Per Second DWORD 32 // in Hertz - defined as nSamplesPerSec field of WAVEFORMATEX structure - // Average number of Bytes/sec DWORD 32 // bytes/sec of audio stream - defined as nAvgBytesPerSec field of WAVEFORMATEX structure - // Block Alignment WORD 16 // block size in bytes of audio codec - defined as nBlockAlign field of WAVEFORMATEX structure - // Bits per sample WORD 16 // bits per sample of mono data. set to zero for variable bitrate codecs. defined as wBitsPerSample field of WAVEFORMATEX structure - // Codec Specific Data Size WORD 16 // size in bytes of Codec Specific Data buffer - defined as cbSize field of WAVEFORMATEX structure - // Codec Specific Data BYTESTREAM variable // array of codec-specific data bytes - - // shortcut - $thisfile_asf['audio_media'][$streamnumber] = array(); - $thisfile_asf_audiomedia_currentstream = &$thisfile_asf['audio_media'][$streamnumber]; - - $audiomediaoffset = 0; - - $thisfile_asf_audiomedia_currentstream = getid3_riff::parseWAVEFORMATex(substr($streamdata['type_specific_data'], $audiomediaoffset, 16)); - $audiomediaoffset += 16; - - $thisfile_audio['lossless'] = false; - switch ($thisfile_asf_audiomedia_currentstream['raw']['wFormatTag']) { - case 0x0001: // PCM - case 0x0163: // WMA9 Lossless - $thisfile_audio['lossless'] = true; - break; - } - - if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) { - foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) { - if (isset($dataarray['flags']['stream_number']) && ($dataarray['flags']['stream_number'] == $streamnumber)) { - $thisfile_asf_audiomedia_currentstream['bitrate'] = $dataarray['bitrate']; - $thisfile_audio['bitrate'] += $dataarray['bitrate']; - break; - } - } - } else { - if (!empty($thisfile_asf_audiomedia_currentstream['bytes_sec'])) { - $thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bytes_sec'] * 8; - } elseif (!empty($thisfile_asf_audiomedia_currentstream['bitrate'])) { - $thisfile_audio['bitrate'] += $thisfile_asf_audiomedia_currentstream['bitrate']; - } - } - $thisfile_audio['streams'][$streamnumber] = $thisfile_asf_audiomedia_currentstream; - $thisfile_audio['streams'][$streamnumber]['wformattag'] = $thisfile_asf_audiomedia_currentstream['raw']['wFormatTag']; - $thisfile_audio['streams'][$streamnumber]['lossless'] = $thisfile_audio['lossless']; - $thisfile_audio['streams'][$streamnumber]['bitrate'] = $thisfile_audio['bitrate']; - $thisfile_audio['streams'][$streamnumber]['dataformat'] = 'wma'; - unset($thisfile_audio['streams'][$streamnumber]['raw']); - - $thisfile_asf_audiomedia_currentstream['codec_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $audiomediaoffset, 2)); - $audiomediaoffset += 2; - $thisfile_asf_audiomedia_currentstream['codec_data'] = substr($streamdata['type_specific_data'], $audiomediaoffset, $thisfile_asf_audiomedia_currentstream['codec_data_size']); - $audiomediaoffset += $thisfile_asf_audiomedia_currentstream['codec_data_size']; - - break; - - case GETID3_ASF_Video_Media: - // Field Name Field Type Size (bits) - // Encoded Image Width DWORD 32 // width of image in pixels - // Encoded Image Height DWORD 32 // height of image in pixels - // Reserved Flags BYTE 8 // hardcoded: 0x02 - // Format Data Size WORD 16 // size of Format Data field in bytes - // Format Data array of: variable // - // * Format Data Size DWORD 32 // number of bytes in Format Data field, in bytes - defined as biSize field of BITMAPINFOHEADER structure - // * Image Width LONG 32 // width of encoded image in pixels - defined as biWidth field of BITMAPINFOHEADER structure - // * Image Height LONG 32 // height of encoded image in pixels - defined as biHeight field of BITMAPINFOHEADER structure - // * Reserved WORD 16 // hardcoded: 0x0001 - defined as biPlanes field of BITMAPINFOHEADER structure - // * Bits Per Pixel Count WORD 16 // bits per pixel - defined as biBitCount field of BITMAPINFOHEADER structure - // * Compression ID FOURCC 32 // fourcc of video codec - defined as biCompression field of BITMAPINFOHEADER structure - // * Image Size DWORD 32 // image size in bytes - defined as biSizeImage field of BITMAPINFOHEADER structure - // * Horizontal Pixels / Meter DWORD 32 // horizontal resolution of target device in pixels per meter - defined as biXPelsPerMeter field of BITMAPINFOHEADER structure - // * Vertical Pixels / Meter DWORD 32 // vertical resolution of target device in pixels per meter - defined as biYPelsPerMeter field of BITMAPINFOHEADER structure - // * Colors Used Count DWORD 32 // number of color indexes in the color table that are actually used - defined as biClrUsed field of BITMAPINFOHEADER structure - // * Important Colors Count DWORD 32 // number of color index required for displaying bitmap. if zero, all colors are required. defined as biClrImportant field of BITMAPINFOHEADER structure - // * Codec Specific Data BYTESTREAM variable // array of codec-specific data bytes - - // shortcut - $thisfile_asf['video_media'][$streamnumber] = array(); - $thisfile_asf_videomedia_currentstream = &$thisfile_asf['video_media'][$streamnumber]; - - $videomediaoffset = 0; - $thisfile_asf_videomedia_currentstream['image_width'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); - $videomediaoffset += 4; - $thisfile_asf_videomedia_currentstream['image_height'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); - $videomediaoffset += 4; - $thisfile_asf_videomedia_currentstream['flags'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 1)); - $videomediaoffset += 1; - $thisfile_asf_videomedia_currentstream['format_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); - $videomediaoffset += 2; - $thisfile_asf_videomedia_currentstream['format_data']['format_data_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); - $videomediaoffset += 4; - $thisfile_asf_videomedia_currentstream['format_data']['image_width'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); - $videomediaoffset += 4; - $thisfile_asf_videomedia_currentstream['format_data']['image_height'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); - $videomediaoffset += 4; - $thisfile_asf_videomedia_currentstream['format_data']['reserved'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); - $videomediaoffset += 2; - $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 2)); - $videomediaoffset += 2; - $thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc'] = substr($streamdata['type_specific_data'], $videomediaoffset, 4); - $videomediaoffset += 4; - $thisfile_asf_videomedia_currentstream['format_data']['image_size'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); - $videomediaoffset += 4; - $thisfile_asf_videomedia_currentstream['format_data']['horizontal_pels'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); - $videomediaoffset += 4; - $thisfile_asf_videomedia_currentstream['format_data']['vertical_pels'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); - $videomediaoffset += 4; - $thisfile_asf_videomedia_currentstream['format_data']['colors_used'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); - $videomediaoffset += 4; - $thisfile_asf_videomedia_currentstream['format_data']['colors_important'] = getid3_lib::LittleEndian2Int(substr($streamdata['type_specific_data'], $videomediaoffset, 4)); - $videomediaoffset += 4; - $thisfile_asf_videomedia_currentstream['format_data']['codec_data'] = substr($streamdata['type_specific_data'], $videomediaoffset); - - if (!empty($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'])) { - foreach ($thisfile_asf['stream_bitrate_properties_object']['bitrate_records'] as $dummy => $dataarray) { - if (isset($dataarray['flags']['stream_number']) && ($dataarray['flags']['stream_number'] == $streamnumber)) { - $thisfile_asf_videomedia_currentstream['bitrate'] = $dataarray['bitrate']; - $thisfile_video['streams'][$streamnumber]['bitrate'] = $dataarray['bitrate']; - $thisfile_video['bitrate'] += $dataarray['bitrate']; - break; - } - } - } - - $thisfile_asf_videomedia_currentstream['format_data']['codec'] = getid3_riff::fourccLookup($thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']); - - $thisfile_video['streams'][$streamnumber]['fourcc'] = $thisfile_asf_videomedia_currentstream['format_data']['codec_fourcc']; - $thisfile_video['streams'][$streamnumber]['codec'] = $thisfile_asf_videomedia_currentstream['format_data']['codec']; - $thisfile_video['streams'][$streamnumber]['resolution_x'] = $thisfile_asf_videomedia_currentstream['image_width']; - $thisfile_video['streams'][$streamnumber]['resolution_y'] = $thisfile_asf_videomedia_currentstream['image_height']; - $thisfile_video['streams'][$streamnumber]['bits_per_sample'] = $thisfile_asf_videomedia_currentstream['format_data']['bits_per_pixel']; - break; - - default: - break; - } - } - } - - while ($this->ftell() < $info['avdataend']) { - $NextObjectDataHeader = $this->fread(24); - $offset = 0; - $NextObjectGUID = substr($NextObjectDataHeader, 0, 16); - $offset += 16; - $NextObjectGUIDtext = $this->BytestringToGUID($NextObjectGUID); - $NextObjectSize = getid3_lib::LittleEndian2Int(substr($NextObjectDataHeader, $offset, 8)); - $offset += 8; - - switch ($NextObjectGUID) { - case GETID3_ASF_Data_Object: - // Data Object: (mandatory, one only) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for Data object - GETID3_ASF_Data_Object - // Object Size QWORD 64 // size of Data object, including 50 bytes of Data Object header. may be 0 if FilePropertiesObject.BroadcastFlag == 1 - // File ID GUID 128 // unique identifier. identical to File ID field in Header Object - // Total Data Packets QWORD 64 // number of Data Packet entries in Data Object. invalid if FilePropertiesObject.BroadcastFlag == 1 - // Reserved WORD 16 // hardcoded: 0x0101 - - // shortcut - $thisfile_asf['data_object'] = array(); - $thisfile_asf_dataobject = &$thisfile_asf['data_object']; - - $DataObjectData = $NextObjectDataHeader.$this->fread(50 - 24); - $offset = 24; - - $thisfile_asf_dataobject['objectid'] = $NextObjectGUID; - $thisfile_asf_dataobject['objectid_guid'] = $NextObjectGUIDtext; - $thisfile_asf_dataobject['objectsize'] = $NextObjectSize; - - $thisfile_asf_dataobject['fileid'] = substr($DataObjectData, $offset, 16); - $offset += 16; - $thisfile_asf_dataobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_dataobject['fileid']); - $thisfile_asf_dataobject['total_data_packets'] = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 8)); - $offset += 8; - $thisfile_asf_dataobject['reserved'] = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 2)); - $offset += 2; - if ($thisfile_asf_dataobject['reserved'] != 0x0101) { - $info['warning'][] = 'data_object.reserved ('.getid3_lib::PrintHexBytes($thisfile_asf_dataobject['reserved']).') does not match expected value of "0x0101"'; - //return false; - break; - } - - // Data Packets array of: variable // - // * Error Correction Flags BYTE 8 // - // * * Error Correction Data Length bits 4 // if Error Correction Length Type == 00, size of Error Correction Data in bytes, else hardcoded: 0000 - // * * Opaque Data Present bits 1 // - // * * Error Correction Length Type bits 2 // number of bits for size of the error correction data. hardcoded: 00 - // * * Error Correction Present bits 1 // If set, use Opaque Data Packet structure, else use Payload structure - // * Error Correction Data - - $info['avdataoffset'] = $this->ftell(); - $this->fseek(($thisfile_asf_dataobject['objectsize'] - 50), SEEK_CUR); // skip actual audio/video data - $info['avdataend'] = $this->ftell(); - break; - - case GETID3_ASF_Simple_Index_Object: - // Simple Index Object: (optional, recommended, one per video stream) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for Simple Index object - GETID3_ASF_Data_Object - // Object Size QWORD 64 // size of Simple Index object, including 56 bytes of Simple Index Object header - // File ID GUID 128 // unique identifier. may be zero or identical to File ID field in Data Object and Header Object - // Index Entry Time Interval QWORD 64 // interval between index entries in 100-nanosecond units - // Maximum Packet Count DWORD 32 // maximum packet count for all index entries - // Index Entries Count DWORD 32 // number of Index Entries structures - // Index Entries array of: variable // - // * Packet Number DWORD 32 // number of the Data Packet associated with this index entry - // * Packet Count WORD 16 // number of Data Packets to sent at this index entry - - // shortcut - $thisfile_asf['simple_index_object'] = array(); - $thisfile_asf_simpleindexobject = &$thisfile_asf['simple_index_object']; - - $SimpleIndexObjectData = $NextObjectDataHeader.$this->fread(56 - 24); - $offset = 24; - - $thisfile_asf_simpleindexobject['objectid'] = $NextObjectGUID; - $thisfile_asf_simpleindexobject['objectid_guid'] = $NextObjectGUIDtext; - $thisfile_asf_simpleindexobject['objectsize'] = $NextObjectSize; - - $thisfile_asf_simpleindexobject['fileid'] = substr($SimpleIndexObjectData, $offset, 16); - $offset += 16; - $thisfile_asf_simpleindexobject['fileid_guid'] = $this->BytestringToGUID($thisfile_asf_simpleindexobject['fileid']); - $thisfile_asf_simpleindexobject['index_entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 8)); - $offset += 8; - $thisfile_asf_simpleindexobject['maximum_packet_count'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 4)); - $offset += 4; - $thisfile_asf_simpleindexobject['index_entries_count'] = getid3_lib::LittleEndian2Int(substr($SimpleIndexObjectData, $offset, 4)); - $offset += 4; - - $IndexEntriesData = $SimpleIndexObjectData.$this->fread(6 * $thisfile_asf_simpleindexobject['index_entries_count']); - for ($IndexEntriesCounter = 0; $IndexEntriesCounter < $thisfile_asf_simpleindexobject['index_entries_count']; $IndexEntriesCounter++) { - $thisfile_asf_simpleindexobject['index_entries'][$IndexEntriesCounter]['packet_number'] = getid3_lib::LittleEndian2Int(substr($IndexEntriesData, $offset, 4)); - $offset += 4; - $thisfile_asf_simpleindexobject['index_entries'][$IndexEntriesCounter]['packet_count'] = getid3_lib::LittleEndian2Int(substr($IndexEntriesData, $offset, 4)); - $offset += 2; - } - - break; - - case GETID3_ASF_Index_Object: - // 6.2 ASF top-level Index Object (optional but recommended when appropriate, 0 or 1) - // Field Name Field Type Size (bits) - // Object ID GUID 128 // GUID for the Index Object - GETID3_ASF_Index_Object - // Object Size QWORD 64 // Specifies the size, in bytes, of the Index Object, including at least 34 bytes of Index Object header - // Index Entry Time Interval DWORD 32 // Specifies the time interval between each index entry in ms. - // Index Specifiers Count WORD 16 // Specifies the number of Index Specifiers structures in this Index Object. - // Index Blocks Count DWORD 32 // Specifies the number of Index Blocks structures in this Index Object. - - // Index Entry Time Interval DWORD 32 // Specifies the time interval between index entries in milliseconds. This value cannot be 0. - // Index Specifiers Count WORD 16 // Specifies the number of entries in the Index Specifiers list. Valid values are 1 and greater. - // Index Specifiers array of: varies // - // * Stream Number WORD 16 // Specifies the stream number that the Index Specifiers refer to. Valid values are between 1 and 127. - // * Index Type WORD 16 // Specifies Index Type values as follows: - // 1 = Nearest Past Data Packet - indexes point to the data packet whose presentation time is closest to the index entry time. - // 2 = Nearest Past Media Object - indexes point to the closest data packet containing an entire object or first fragment of an object. - // 3 = Nearest Past Cleanpoint. - indexes point to the closest data packet containing an entire object (or first fragment of an object) that has the Cleanpoint Flag set. - // Nearest Past Cleanpoint is the most common type of index. - // Index Entry Count DWORD 32 // Specifies the number of Index Entries in the block. - // * Block Positions QWORD varies // Specifies a list of byte offsets of the beginnings of the blocks relative to the beginning of the first Data Packet (i.e., the beginning of the Data Object + 50 bytes). The number of entries in this list is specified by the value of the Index Specifiers Count field. The order of those byte offsets is tied to the order in which Index Specifiers are listed. - // * Index Entries array of: varies // - // * * Offsets DWORD varies // An offset value of 0xffffffff indicates an invalid offset value - - // shortcut - $thisfile_asf['asf_index_object'] = array(); - $thisfile_asf_asfindexobject = &$thisfile_asf['asf_index_object']; - - $ASFIndexObjectData = $NextObjectDataHeader.$this->fread(34 - 24); - $offset = 24; - - $thisfile_asf_asfindexobject['objectid'] = $NextObjectGUID; - $thisfile_asf_asfindexobject['objectid_guid'] = $NextObjectGUIDtext; - $thisfile_asf_asfindexobject['objectsize'] = $NextObjectSize; - - $thisfile_asf_asfindexobject['entry_time_interval'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); - $offset += 4; - $thisfile_asf_asfindexobject['index_specifiers_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); - $offset += 2; - $thisfile_asf_asfindexobject['index_blocks_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); - $offset += 4; - - $ASFIndexObjectData .= $this->fread(4 * $thisfile_asf_asfindexobject['index_specifiers_count']); - for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { - $IndexSpecifierStreamNumber = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); - $offset += 2; - $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['stream_number'] = $IndexSpecifierStreamNumber; - $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 2)); - $offset += 2; - $thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type_text'] = $this->ASFIndexObjectIndexTypeLookup($thisfile_asf_asfindexobject['index_specifiers'][$IndexSpecifiersCounter]['index_type']); - } - - $ASFIndexObjectData .= $this->fread(4); - $thisfile_asf_asfindexobject['index_entry_count'] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); - $offset += 4; - - $ASFIndexObjectData .= $this->fread(8 * $thisfile_asf_asfindexobject['index_specifiers_count']); - for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { - $thisfile_asf_asfindexobject['block_positions'][$IndexSpecifiersCounter] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 8)); - $offset += 8; - } - - $ASFIndexObjectData .= $this->fread(4 * $thisfile_asf_asfindexobject['index_specifiers_count'] * $thisfile_asf_asfindexobject['index_entry_count']); - for ($IndexEntryCounter = 0; $IndexEntryCounter < $thisfile_asf_asfindexobject['index_entry_count']; $IndexEntryCounter++) { - for ($IndexSpecifiersCounter = 0; $IndexSpecifiersCounter < $thisfile_asf_asfindexobject['index_specifiers_count']; $IndexSpecifiersCounter++) { - $thisfile_asf_asfindexobject['offsets'][$IndexSpecifiersCounter][$IndexEntryCounter] = getid3_lib::LittleEndian2Int(substr($ASFIndexObjectData, $offset, 4)); - $offset += 4; - } - } - break; - - - default: - // Implementations shall ignore any standard or non-standard object that they do not know how to handle. - if ($this->GUIDname($NextObjectGUIDtext)) { - $info['warning'][] = 'unhandled GUID "'.$this->GUIDname($NextObjectGUIDtext).'" {'.$NextObjectGUIDtext.'} in ASF body at offset '.($offset - 16 - 8); - } else { - $info['warning'][] = 'unknown GUID {'.$NextObjectGUIDtext.'} in ASF body at offset '.($this->ftell() - 16 - 8); - } - $this->fseek(($NextObjectSize - 16 - 8), SEEK_CUR); - break; - } - } - - if (isset($thisfile_asf_codeclistobject['codec_entries']) && is_array($thisfile_asf_codeclistobject['codec_entries'])) { - foreach ($thisfile_asf_codeclistobject['codec_entries'] as $streamnumber => $streamdata) { - switch ($streamdata['information']) { - case 'WMV1': - case 'WMV2': - case 'WMV3': - case 'MSS1': - case 'MSS2': - case 'WMVA': - case 'WVC1': - case 'WMVP': - case 'WVP2': - $thisfile_video['dataformat'] = 'wmv'; - $info['mime_type'] = 'video/x-ms-wmv'; - break; - - case 'MP42': - case 'MP43': - case 'MP4S': - case 'mp4s': - $thisfile_video['dataformat'] = 'asf'; - $info['mime_type'] = 'video/x-ms-asf'; - break; - - default: - switch ($streamdata['type_raw']) { - case 1: - if (strstr($this->TrimConvert($streamdata['name']), 'Windows Media')) { - $thisfile_video['dataformat'] = 'wmv'; - if ($info['mime_type'] == 'video/x-ms-asf') { - $info['mime_type'] = 'video/x-ms-wmv'; - } - } - break; - - case 2: - if (strstr($this->TrimConvert($streamdata['name']), 'Windows Media')) { - $thisfile_audio['dataformat'] = 'wma'; - if ($info['mime_type'] == 'video/x-ms-asf') { - $info['mime_type'] = 'audio/x-ms-wma'; - } - } - break; - - } - break; - } - } - } - - switch (isset($thisfile_audio['codec']) ? $thisfile_audio['codec'] : '') { - case 'MPEG Layer-3': - $thisfile_audio['dataformat'] = 'mp3'; - break; - - default: - break; - } - - if (isset($thisfile_asf_codeclistobject['codec_entries'])) { - foreach ($thisfile_asf_codeclistobject['codec_entries'] as $streamnumber => $streamdata) { - switch ($streamdata['type_raw']) { - - case 1: // video - $thisfile_video['encoder'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][$streamnumber]['name']); - break; - - case 2: // audio - $thisfile_audio['encoder'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][$streamnumber]['name']); - - // AH 2003-10-01 - $thisfile_audio['encoder_options'] = $this->TrimConvert($thisfile_asf_codeclistobject['codec_entries'][0]['description']); - - $thisfile_audio['codec'] = $thisfile_audio['encoder']; - break; - - default: - $info['warning'][] = 'Unknown streamtype: [codec_list_object][codec_entries]['.$streamnumber.'][type_raw] == '.$streamdata['type_raw']; - break; - - } - } - } - - if (isset($info['audio'])) { - $thisfile_audio['lossless'] = (isset($thisfile_audio['lossless']) ? $thisfile_audio['lossless'] : false); - $thisfile_audio['dataformat'] = (!empty($thisfile_audio['dataformat']) ? $thisfile_audio['dataformat'] : 'asf'); - } - if (!empty($thisfile_video['dataformat'])) { - $thisfile_video['lossless'] = (isset($thisfile_audio['lossless']) ? $thisfile_audio['lossless'] : false); - $thisfile_video['pixel_aspect_ratio'] = (isset($thisfile_audio['pixel_aspect_ratio']) ? $thisfile_audio['pixel_aspect_ratio'] : (float) 1); - $thisfile_video['dataformat'] = (!empty($thisfile_video['dataformat']) ? $thisfile_video['dataformat'] : 'asf'); - } - if (!empty($thisfile_video['streams'])) { - $thisfile_video['resolution_x'] = 0; - $thisfile_video['resolution_y'] = 0; - foreach ($thisfile_video['streams'] as $key => $valuearray) { - if (($valuearray['resolution_x'] > $thisfile_video['resolution_x']) || ($valuearray['resolution_y'] > $thisfile_video['resolution_y'])) { - $thisfile_video['resolution_x'] = $valuearray['resolution_x']; - $thisfile_video['resolution_y'] = $valuearray['resolution_y']; - } - } - } - $info['bitrate'] = (isset($thisfile_audio['bitrate']) ? $thisfile_audio['bitrate'] : 0) + (isset($thisfile_video['bitrate']) ? $thisfile_video['bitrate'] : 0); - - if ((!isset($info['playtime_seconds']) || ($info['playtime_seconds'] <= 0)) && ($info['bitrate'] > 0)) { - $info['playtime_seconds'] = ($info['filesize'] - $info['avdataoffset']) / ($info['bitrate'] / 8); - } - - return true; - } - - public static function codecListObjectTypeLookup($CodecListType) { - static $lookup = array( - 0x0001 => 'Video Codec', - 0x0002 => 'Audio Codec', - 0xFFFF => 'Unknown Codec' - ); - - return (isset($lookup[$CodecListType]) ? $lookup[$CodecListType] : 'Invalid Codec Type'); - } - - public static function KnownGUIDs() { - static $GUIDarray = array( - 'GETID3_ASF_Extended_Stream_Properties_Object' => '14E6A5CB-C672-4332-8399-A96952065B5A', - 'GETID3_ASF_Padding_Object' => '1806D474-CADF-4509-A4BA-9AABCB96AAE8', - 'GETID3_ASF_Payload_Ext_Syst_Pixel_Aspect_Ratio' => '1B1EE554-F9EA-4BC8-821A-376B74E4C4B8', - 'GETID3_ASF_Script_Command_Object' => '1EFB1A30-0B62-11D0-A39B-00A0C90348F6', - 'GETID3_ASF_No_Error_Correction' => '20FB5700-5B55-11CF-A8FD-00805F5C442B', - 'GETID3_ASF_Content_Branding_Object' => '2211B3FA-BD23-11D2-B4B7-00A0C955FC6E', - 'GETID3_ASF_Content_Encryption_Object' => '2211B3FB-BD23-11D2-B4B7-00A0C955FC6E', - 'GETID3_ASF_Digital_Signature_Object' => '2211B3FC-BD23-11D2-B4B7-00A0C955FC6E', - 'GETID3_ASF_Extended_Content_Encryption_Object' => '298AE614-2622-4C17-B935-DAE07EE9289C', - 'GETID3_ASF_Simple_Index_Object' => '33000890-E5B1-11CF-89F4-00A0C90349CB', - 'GETID3_ASF_Degradable_JPEG_Media' => '35907DE0-E415-11CF-A917-00805F5C442B', - 'GETID3_ASF_Payload_Extension_System_Timecode' => '399595EC-8667-4E2D-8FDB-98814CE76C1E', - 'GETID3_ASF_Binary_Media' => '3AFB65E2-47EF-40F2-AC2C-70A90D71D343', - 'GETID3_ASF_Timecode_Index_Object' => '3CB73FD0-0C4A-4803-953D-EDF7B6228F0C', - 'GETID3_ASF_Metadata_Library_Object' => '44231C94-9498-49D1-A141-1D134E457054', - 'GETID3_ASF_Reserved_3' => '4B1ACBE3-100B-11D0-A39B-00A0C90348F6', - 'GETID3_ASF_Reserved_4' => '4CFEDB20-75F6-11CF-9C0F-00A0C90349CB', - 'GETID3_ASF_Command_Media' => '59DACFC0-59E6-11D0-A3AC-00A0C90348F6', - 'GETID3_ASF_Header_Extension_Object' => '5FBF03B5-A92E-11CF-8EE3-00C00C205365', - 'GETID3_ASF_Media_Object_Index_Parameters_Obj' => '6B203BAD-3F11-4E84-ACA8-D7613DE2CFA7', - 'GETID3_ASF_Header_Object' => '75B22630-668E-11CF-A6D9-00AA0062CE6C', - 'GETID3_ASF_Content_Description_Object' => '75B22633-668E-11CF-A6D9-00AA0062CE6C', - 'GETID3_ASF_Error_Correction_Object' => '75B22635-668E-11CF-A6D9-00AA0062CE6C', - 'GETID3_ASF_Data_Object' => '75B22636-668E-11CF-A6D9-00AA0062CE6C', - 'GETID3_ASF_Web_Stream_Media_Subtype' => '776257D4-C627-41CB-8F81-7AC7FF1C40CC', - 'GETID3_ASF_Stream_Bitrate_Properties_Object' => '7BF875CE-468D-11D1-8D82-006097C9A2B2', - 'GETID3_ASF_Language_List_Object' => '7C4346A9-EFE0-4BFC-B229-393EDE415C85', - 'GETID3_ASF_Codec_List_Object' => '86D15240-311D-11D0-A3A4-00A0C90348F6', - 'GETID3_ASF_Reserved_2' => '86D15241-311D-11D0-A3A4-00A0C90348F6', - 'GETID3_ASF_File_Properties_Object' => '8CABDCA1-A947-11CF-8EE4-00C00C205365', - 'GETID3_ASF_File_Transfer_Media' => '91BD222C-F21C-497A-8B6D-5AA86BFC0185', - 'GETID3_ASF_Old_RTP_Extension_Data' => '96800C63-4C94-11D1-837B-0080C7A37F95', - 'GETID3_ASF_Advanced_Mutual_Exclusion_Object' => 'A08649CF-4775-4670-8A16-6E35357566CD', - 'GETID3_ASF_Bandwidth_Sharing_Object' => 'A69609E6-517B-11D2-B6AF-00C04FD908E9', - 'GETID3_ASF_Reserved_1' => 'ABD3D211-A9BA-11cf-8EE6-00C00C205365', - 'GETID3_ASF_Bandwidth_Sharing_Exclusive' => 'AF6060AA-5197-11D2-B6AF-00C04FD908E9', - 'GETID3_ASF_Bandwidth_Sharing_Partial' => 'AF6060AB-5197-11D2-B6AF-00C04FD908E9', - 'GETID3_ASF_JFIF_Media' => 'B61BE100-5B4E-11CF-A8FD-00805F5C442B', - 'GETID3_ASF_Stream_Properties_Object' => 'B7DC0791-A9B7-11CF-8EE6-00C00C205365', - 'GETID3_ASF_Video_Media' => 'BC19EFC0-5B4D-11CF-A8FD-00805F5C442B', - 'GETID3_ASF_Audio_Spread' => 'BFC3CD50-618F-11CF-8BB2-00AA00B4E220', - 'GETID3_ASF_Metadata_Object' => 'C5F8CBEA-5BAF-4877-8467-AA8C44FA4CCA', - 'GETID3_ASF_Payload_Ext_Syst_Sample_Duration' => 'C6BD9450-867F-4907-83A3-C77921B733AD', - 'GETID3_ASF_Group_Mutual_Exclusion_Object' => 'D1465A40-5A79-4338-B71B-E36B8FD6C249', - 'GETID3_ASF_Extended_Content_Description_Object' => 'D2D0A440-E307-11D2-97F0-00A0C95EA850', - 'GETID3_ASF_Stream_Prioritization_Object' => 'D4FED15B-88D3-454F-81F0-ED5C45999E24', - 'GETID3_ASF_Payload_Ext_System_Content_Type' => 'D590DC20-07BC-436C-9CF7-F3BBFBF1A4DC', - 'GETID3_ASF_Old_File_Properties_Object' => 'D6E229D0-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_ASF_Header_Object' => 'D6E229D1-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_ASF_Data_Object' => 'D6E229D2-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Index_Object' => 'D6E229D3-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Stream_Properties_Object' => 'D6E229D4-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Content_Description_Object' => 'D6E229D5-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Script_Command_Object' => 'D6E229D6-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Marker_Object' => 'D6E229D7-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Component_Download_Object' => 'D6E229D8-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Stream_Group_Object' => 'D6E229D9-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Scalable_Object' => 'D6E229DA-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Prioritization_Object' => 'D6E229DB-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Bitrate_Mutual_Exclusion_Object' => 'D6E229DC-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Inter_Media_Dependency_Object' => 'D6E229DD-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Rating_Object' => 'D6E229DE-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Index_Parameters_Object' => 'D6E229DF-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Color_Table_Object' => 'D6E229E0-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Language_List_Object' => 'D6E229E1-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Audio_Media' => 'D6E229E2-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Video_Media' => 'D6E229E3-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Image_Media' => 'D6E229E4-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Timecode_Media' => 'D6E229E5-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Text_Media' => 'D6E229E6-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_MIDI_Media' => 'D6E229E7-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Command_Media' => 'D6E229E8-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_No_Error_Concealment' => 'D6E229EA-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Scrambled_Audio' => 'D6E229EB-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_No_Color_Table' => 'D6E229EC-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_SMPTE_Time' => 'D6E229ED-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_ASCII_Text' => 'D6E229EE-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Unicode_Text' => 'D6E229EF-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_HTML_Text' => 'D6E229F0-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_URL_Command' => 'D6E229F1-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Filename_Command' => 'D6E229F2-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_ACM_Codec' => 'D6E229F3-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_VCM_Codec' => 'D6E229F4-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_QuickTime_Codec' => 'D6E229F5-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_DirectShow_Transform_Filter' => 'D6E229F6-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_DirectShow_Rendering_Filter' => 'D6E229F7-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_No_Enhancement' => 'D6E229F8-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Unknown_Enhancement_Type' => 'D6E229F9-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Temporal_Enhancement' => 'D6E229FA-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Spatial_Enhancement' => 'D6E229FB-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Quality_Enhancement' => 'D6E229FC-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Number_of_Channels_Enhancement' => 'D6E229FD-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Frequency_Response_Enhancement' => 'D6E229FE-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Media_Object' => 'D6E229FF-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Mutex_Language' => 'D6E22A00-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Mutex_Bitrate' => 'D6E22A01-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Mutex_Unknown' => 'D6E22A02-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_ASF_Placeholder_Object' => 'D6E22A0E-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Old_Data_Unit_Extension_Object' => 'D6E22A0F-35DA-11D1-9034-00A0C90349BE', - 'GETID3_ASF_Web_Stream_Format' => 'DA1E6B13-8359-4050-B398-388E965BF00C', - 'GETID3_ASF_Payload_Ext_System_File_Name' => 'E165EC0E-19ED-45D7-B4A7-25CBD1E28E9B', - 'GETID3_ASF_Marker_Object' => 'F487CD01-A951-11CF-8EE6-00C00C205365', - 'GETID3_ASF_Timecode_Index_Parameters_Object' => 'F55E496D-9797-4B5D-8C8B-604DFE9BFB24', - 'GETID3_ASF_Audio_Media' => 'F8699E40-5B4D-11CF-A8FD-00805F5C442B', - 'GETID3_ASF_Media_Object_Index_Object' => 'FEB103F8-12AD-4C64-840F-2A1D2F7AD48C', - 'GETID3_ASF_Alt_Extended_Content_Encryption_Obj' => 'FF889EF1-ADEE-40DA-9E71-98704BB928CE', - 'GETID3_ASF_Index_Placeholder_Object' => 'D9AADE20-7C17-4F9C-BC28-8555DD98E2A2', // http://cpan.uwinnipeg.ca/htdocs/Audio-WMA/Audio/WMA.pm.html - 'GETID3_ASF_Compatibility_Object' => '26F18B5D-4584-47EC-9F5F-0E651F0452C9', // http://cpan.uwinnipeg.ca/htdocs/Audio-WMA/Audio/WMA.pm.html - ); - return $GUIDarray; - } - - public static function GUIDname($GUIDstring) { - static $GUIDarray = array(); - if (empty($GUIDarray)) { - $GUIDarray = self::KnownGUIDs(); - } - return array_search($GUIDstring, $GUIDarray); - } - - public static function ASFIndexObjectIndexTypeLookup($id) { - static $ASFIndexObjectIndexTypeLookup = array(); - if (empty($ASFIndexObjectIndexTypeLookup)) { - $ASFIndexObjectIndexTypeLookup[1] = 'Nearest Past Data Packet'; - $ASFIndexObjectIndexTypeLookup[2] = 'Nearest Past Media Object'; - $ASFIndexObjectIndexTypeLookup[3] = 'Nearest Past Cleanpoint'; - } - return (isset($ASFIndexObjectIndexTypeLookup[$id]) ? $ASFIndexObjectIndexTypeLookup[$id] : 'invalid'); - } - - public static function GUIDtoBytestring($GUIDstring) { - // Microsoft defines these 16-byte (128-bit) GUIDs in the strangest way: - // first 4 bytes are in little-endian order - // next 2 bytes are appended in little-endian order - // next 2 bytes are appended in little-endian order - // next 2 bytes are appended in big-endian order - // next 6 bytes are appended in big-endian order - - // AaBbCcDd-EeFf-GgHh-IiJj-KkLlMmNnOoPp is stored as this 16-byte string: - // $Dd $Cc $Bb $Aa $Ff $Ee $Hh $Gg $Ii $Jj $Kk $Ll $Mm $Nn $Oo $Pp - - $hexbytecharstring = chr(hexdec(substr($GUIDstring, 6, 2))); - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 4, 2))); - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 2, 2))); - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 0, 2))); - - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 11, 2))); - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 9, 2))); - - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 16, 2))); - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 14, 2))); - - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 19, 2))); - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 21, 2))); - - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 24, 2))); - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 26, 2))); - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 28, 2))); - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 30, 2))); - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 32, 2))); - $hexbytecharstring .= chr(hexdec(substr($GUIDstring, 34, 2))); - - return $hexbytecharstring; - } - - public static function BytestringToGUID($Bytestring) { - $GUIDstring = str_pad(dechex(ord($Bytestring{3})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= str_pad(dechex(ord($Bytestring{2})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= str_pad(dechex(ord($Bytestring{1})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= str_pad(dechex(ord($Bytestring{0})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= '-'; - $GUIDstring .= str_pad(dechex(ord($Bytestring{5})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= str_pad(dechex(ord($Bytestring{4})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= '-'; - $GUIDstring .= str_pad(dechex(ord($Bytestring{7})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= str_pad(dechex(ord($Bytestring{6})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= '-'; - $GUIDstring .= str_pad(dechex(ord($Bytestring{8})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= str_pad(dechex(ord($Bytestring{9})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= '-'; - $GUIDstring .= str_pad(dechex(ord($Bytestring{10})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= str_pad(dechex(ord($Bytestring{11})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= str_pad(dechex(ord($Bytestring{12})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= str_pad(dechex(ord($Bytestring{13})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= str_pad(dechex(ord($Bytestring{14})), 2, '0', STR_PAD_LEFT); - $GUIDstring .= str_pad(dechex(ord($Bytestring{15})), 2, '0', STR_PAD_LEFT); - - return strtoupper($GUIDstring); - } - - public static function FILETIMEtoUNIXtime($FILETIME, $round=true) { - // FILETIME is a 64-bit unsigned integer representing - // the number of 100-nanosecond intervals since January 1, 1601 - // UNIX timestamp is number of seconds since January 1, 1970 - // 116444736000000000 = 10000000 * 60 * 60 * 24 * 365 * 369 + 89 leap days - if ($round) { - return intval(round(($FILETIME - 116444736000000000) / 10000000)); - } - return ($FILETIME - 116444736000000000) / 10000000; - } - - public static function WMpictureTypeLookup($WMpictureType) { - static $lookup = null; - if ($lookup === null) { - $lookup = array( - 0x03 => 'Front Cover', - 0x04 => 'Back Cover', - 0x00 => 'User Defined', - 0x05 => 'Leaflet Page', - 0x06 => 'Media Label', - 0x07 => 'Lead Artist', - 0x08 => 'Artist', - 0x09 => 'Conductor', - 0x0A => 'Band', - 0x0B => 'Composer', - 0x0C => 'Lyricist', - 0x0D => 'Recording Location', - 0x0E => 'During Recording', - 0x0F => 'During Performance', - 0x10 => 'Video Screen Capture', - 0x12 => 'Illustration', - 0x13 => 'Band Logotype', - 0x14 => 'Publisher Logotype' - ); - $lookup = array_map(function($str) { - return getid3_lib::iconv_fallback('UTF-8', 'UTF-16LE', $str); - }, $lookup); - } - - return (isset($lookup[$WMpictureType]) ? $lookup[$WMpictureType] : ''); - } - - public function HeaderExtensionObjectDataParse(&$asf_header_extension_object_data, &$unhandled_sections) { - // http://msdn.microsoft.com/en-us/library/bb643323.aspx - - $offset = 0; - $objectOffset = 0; - $HeaderExtensionObjectParsed = array(); - while ($objectOffset < strlen($asf_header_extension_object_data)) { - $offset = $objectOffset; - $thisObject = array(); - - $thisObject['guid'] = substr($asf_header_extension_object_data, $offset, 16); - $offset += 16; - $thisObject['guid_text'] = $this->BytestringToGUID($thisObject['guid']); - $thisObject['guid_name'] = $this->GUIDname($thisObject['guid_text']); - - $thisObject['size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 8)); - $offset += 8; - if ($thisObject['size'] <= 0) { - break; - } - - switch ($thisObject['guid']) { - case GETID3_ASF_Extended_Stream_Properties_Object: - $thisObject['start_time'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 8)); - $offset += 8; - $thisObject['start_time_unix'] = $this->FILETIMEtoUNIXtime($thisObject['start_time']); - - $thisObject['end_time'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 8)); - $offset += 8; - $thisObject['end_time_unix'] = $this->FILETIMEtoUNIXtime($thisObject['end_time']); - - $thisObject['data_bitrate'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); - $offset += 4; - - $thisObject['buffer_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); - $offset += 4; - - $thisObject['initial_buffer_fullness'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); - $offset += 4; - - $thisObject['alternate_data_bitrate'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); - $offset += 4; - - $thisObject['alternate_buffer_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); - $offset += 4; - - $thisObject['alternate_initial_buffer_fullness'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); - $offset += 4; - - $thisObject['maximum_object_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); - $offset += 4; - - $thisObject['flags_raw'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); - $offset += 4; - $thisObject['flags']['reliable'] = (bool) $thisObject['flags_raw'] & 0x00000001; - $thisObject['flags']['seekable'] = (bool) $thisObject['flags_raw'] & 0x00000002; - $thisObject['flags']['no_cleanpoints'] = (bool) $thisObject['flags_raw'] & 0x00000004; - $thisObject['flags']['resend_live_cleanpoints'] = (bool) $thisObject['flags_raw'] & 0x00000008; - - $thisObject['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - - $thisObject['stream_language_id_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - - $thisObject['average_time_per_frame'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); - $offset += 4; - - $thisObject['stream_name_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - - $thisObject['payload_extension_system_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - - for ($i = 0; $i < $thisObject['stream_name_count']; $i++) { - $streamName = array(); - - $streamName['language_id_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - - $streamName['stream_name_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - - $streamName['stream_name'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, $streamName['stream_name_length'])); - $offset += $streamName['stream_name_length']; - - $thisObject['stream_names'][$i] = $streamName; - } - - for ($i = 0; $i < $thisObject['payload_extension_system_count']; $i++) { - $payloadExtensionSystem = array(); - - $payloadExtensionSystem['extension_system_id'] = substr($asf_header_extension_object_data, $offset, 16); - $offset += 16; - $payloadExtensionSystem['extension_system_id_text'] = $this->BytestringToGUID($payloadExtensionSystem['extension_system_id']); - - $payloadExtensionSystem['extension_system_size'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - if ($payloadExtensionSystem['extension_system_size'] <= 0) { - break 2; - } - - $payloadExtensionSystem['extension_system_info_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); - $offset += 4; - - $payloadExtensionSystem['extension_system_info_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, $payloadExtensionSystem['extension_system_info_length'])); - $offset += $payloadExtensionSystem['extension_system_info_length']; - - $thisObject['payload_extension_systems'][$i] = $payloadExtensionSystem; - } - - break; - - case GETID3_ASF_Padding_Object: - // padding, skip it - break; - - case GETID3_ASF_Metadata_Object: - $thisObject['description_record_counts'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - - for ($i = 0; $i < $thisObject['description_record_counts']; $i++) { - $descriptionRecord = array(); - - $descriptionRecord['reserved_1'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); // must be zero - $offset += 2; - - $descriptionRecord['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - - $descriptionRecord['name_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - - $descriptionRecord['data_type'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - $descriptionRecord['data_type_text'] = self::metadataLibraryObjectDataTypeLookup($descriptionRecord['data_type']); - - $descriptionRecord['data_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); - $offset += 4; - - $descriptionRecord['name'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['name_length']); - $offset += $descriptionRecord['name_length']; - - $descriptionRecord['data'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['data_length']); - $offset += $descriptionRecord['data_length']; - switch ($descriptionRecord['data_type']) { - case 0x0000: // Unicode string - break; - - case 0x0001: // BYTE array - // do nothing - break; - - case 0x0002: // BOOL - $descriptionRecord['data'] = (bool) getid3_lib::LittleEndian2Int($descriptionRecord['data']); - break; - - case 0x0003: // DWORD - case 0x0004: // QWORD - case 0x0005: // WORD - $descriptionRecord['data'] = getid3_lib::LittleEndian2Int($descriptionRecord['data']); - break; - - case 0x0006: // GUID - $descriptionRecord['data_text'] = $this->BytestringToGUID($descriptionRecord['data']); - break; - } - - $thisObject['description_record'][$i] = $descriptionRecord; - } - break; - - case GETID3_ASF_Language_List_Object: - $thisObject['language_id_record_counts'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - - for ($i = 0; $i < $thisObject['language_id_record_counts']; $i++) { - $languageIDrecord = array(); - - $languageIDrecord['language_id_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 1)); - $offset += 1; - - $languageIDrecord['language_id'] = substr($asf_header_extension_object_data, $offset, $languageIDrecord['language_id_length']); - $offset += $languageIDrecord['language_id_length']; - - $thisObject['language_id_record'][$i] = $languageIDrecord; - } - break; - - case GETID3_ASF_Metadata_Library_Object: - $thisObject['description_records_count'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - - for ($i = 0; $i < $thisObject['description_records_count']; $i++) { - $descriptionRecord = array(); - - $descriptionRecord['language_list_index'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - - $descriptionRecord['stream_number'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - - $descriptionRecord['name_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - - $descriptionRecord['data_type'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 2)); - $offset += 2; - $descriptionRecord['data_type_text'] = self::metadataLibraryObjectDataTypeLookup($descriptionRecord['data_type']); - - $descriptionRecord['data_length'] = getid3_lib::LittleEndian2Int(substr($asf_header_extension_object_data, $offset, 4)); - $offset += 4; - - $descriptionRecord['name'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['name_length']); - $offset += $descriptionRecord['name_length']; - - $descriptionRecord['data'] = substr($asf_header_extension_object_data, $offset, $descriptionRecord['data_length']); - $offset += $descriptionRecord['data_length']; - - if (preg_match('#^WM/Picture$#', str_replace("\x00", '', trim($descriptionRecord['name'])))) { - $WMpicture = $this->ASF_WMpicture($descriptionRecord['data']); - foreach ($WMpicture as $key => $value) { - $descriptionRecord['data'] = $WMpicture; - } - unset($WMpicture); - } - - $thisObject['description_record'][$i] = $descriptionRecord; - } - break; - - default: - $unhandled_sections++; - if ($this->GUIDname($thisObject['guid_text'])) { - $this->getid3->info['warning'][] = 'unhandled Header Extension Object GUID "'.$this->GUIDname($thisObject['guid_text']).'" {'.$thisObject['guid_text'].'} at offset '.($offset - 16 - 8); - } else { - $this->getid3->info['warning'][] = 'unknown Header Extension Object GUID {'.$thisObject['guid_text'].'} in at offset '.($offset - 16 - 8); - } - break; - } - $HeaderExtensionObjectParsed[] = $thisObject; - - $objectOffset += $thisObject['size']; - } - return $HeaderExtensionObjectParsed; - } - - - public static function metadataLibraryObjectDataTypeLookup($id) { - static $lookup = array( - 0x0000 => 'Unicode string', // The data consists of a sequence of Unicode characters - 0x0001 => 'BYTE array', // The type of the data is implementation-specific - 0x0002 => 'BOOL', // The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer. Only 0x0000 or 0x0001 are permitted values - 0x0003 => 'DWORD', // The data is 4 bytes long and should be interpreted as a 32-bit unsigned integer - 0x0004 => 'QWORD', // The data is 8 bytes long and should be interpreted as a 64-bit unsigned integer - 0x0005 => 'WORD', // The data is 2 bytes long and should be interpreted as a 16-bit unsigned integer - 0x0006 => 'GUID', // The data is 16 bytes long and should be interpreted as a 128-bit GUID - ); - return (isset($lookup[$id]) ? $lookup[$id] : 'invalid'); - } - - public function ASF_WMpicture(&$data) { - //typedef struct _WMPicture{ - // LPWSTR pwszMIMEType; - // BYTE bPictureType; - // LPWSTR pwszDescription; - // DWORD dwDataLen; - // BYTE* pbData; - //} WM_PICTURE; - - $WMpicture = array(); - - $offset = 0; - $WMpicture['image_type_id'] = getid3_lib::LittleEndian2Int(substr($data, $offset, 1)); - $offset += 1; - $WMpicture['image_type'] = self::WMpictureTypeLookup($WMpicture['image_type_id']); - $WMpicture['image_size'] = getid3_lib::LittleEndian2Int(substr($data, $offset, 4)); - $offset += 4; - - $WMpicture['image_mime'] = ''; - do { - $next_byte_pair = substr($data, $offset, 2); - $offset += 2; - $WMpicture['image_mime'] .= $next_byte_pair; - } while ($next_byte_pair !== "\x00\x00"); - - $WMpicture['image_description'] = ''; - do { - $next_byte_pair = substr($data, $offset, 2); - $offset += 2; - $WMpicture['image_description'] .= $next_byte_pair; - } while ($next_byte_pair !== "\x00\x00"); - - $WMpicture['dataoffset'] = $offset; - $WMpicture['data'] = substr($data, $offset); - - $imageinfo = array(); - $WMpicture['image_mime'] = ''; - $imagechunkcheck = getid3_lib::GetDataImageSize($WMpicture['data'], $imageinfo); - unset($imageinfo); - if (!empty($imagechunkcheck)) { - $WMpicture['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]); - } - if (!isset($this->getid3->info['asf']['comments']['picture'])) { - $this->getid3->info['asf']['comments']['picture'] = array(); - } - $this->getid3->info['asf']['comments']['picture'][] = array('data'=>$WMpicture['data'], 'image_mime'=>$WMpicture['image_mime']); - - return $WMpicture; - } - - - // Remove terminator 00 00 and convert UTF-16LE to Latin-1 - public static function TrimConvert($string) { - return trim(getid3_lib::iconv_fallback('UTF-16LE', 'ISO-8859-1', self::TrimTerm($string)), ' '); - } - - - // Remove terminator 00 00 - public static function TrimTerm($string) { - // remove terminator, only if present (it should be, but...) - if (substr($string, -2) === "\x00\x00") { - $string = substr($string, 0, -2); - } - return $string; - } - -} diff --git a/wp/wp-includes/ID3/module.audio-video.flv.php b/wp/wp-includes/ID3/module.audio-video.flv.php deleted file mode 100644 index c5fbd4b0..00000000 --- a/wp/wp-includes/ID3/module.audio-video.flv.php +++ /dev/null @@ -1,745 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -// // -// FLV module by Seth Kaufman // -// // -// * version 0.1 (26 June 2005) // -// // -// // -// * version 0.1.1 (15 July 2005) // -// minor modifications by James Heinrich // -// // -// * version 0.2 (22 February 2006) // -// Support for On2 VP6 codec and meta information // -// by Steve Webster // -// // -// * version 0.3 (15 June 2006) // -// Modified to not read entire file into memory // -// by James Heinrich // -// // -// * version 0.4 (07 December 2007) // -// Bugfixes for incorrectly parsed FLV dimensions // -// and incorrect parsing of onMetaTag // -// by Evgeny Moysevich // -// // -// * version 0.5 (21 May 2009) // -// Fixed parsing of audio tags and added additional codec // -// details. The duration is now read from onMetaTag (if // -// exists), rather than parsing whole file // -// by Nigel Barnes // -// // -// * version 0.6 (24 May 2009) // -// Better parsing of files with h264 video // -// by Evgeny Moysevich // -// // -// * version 0.6.1 (30 May 2011) // -// prevent infinite loops in expGolombUe() // -// // -// * version 0.7.0 (16 Jul 2013) // -// handle GETID3_FLV_VIDEO_VP6FLV_ALPHA // -// improved AVCSequenceParameterSetReader::readData() // -// by Xander Schouwerwou // -// // -///////////////////////////////////////////////////////////////// -// // -// module.audio-video.flv.php // -// module for analyzing Shockwave Flash Video files // -// dependencies: NONE // -// /// -///////////////////////////////////////////////////////////////// - -define('GETID3_FLV_TAG_AUDIO', 8); -define('GETID3_FLV_TAG_VIDEO', 9); -define('GETID3_FLV_TAG_META', 18); - -define('GETID3_FLV_VIDEO_H263', 2); -define('GETID3_FLV_VIDEO_SCREEN', 3); -define('GETID3_FLV_VIDEO_VP6FLV', 4); -define('GETID3_FLV_VIDEO_VP6FLV_ALPHA', 5); -define('GETID3_FLV_VIDEO_SCREENV2', 6); -define('GETID3_FLV_VIDEO_H264', 7); - -define('H264_AVC_SEQUENCE_HEADER', 0); -define('H264_PROFILE_BASELINE', 66); -define('H264_PROFILE_MAIN', 77); -define('H264_PROFILE_EXTENDED', 88); -define('H264_PROFILE_HIGH', 100); -define('H264_PROFILE_HIGH10', 110); -define('H264_PROFILE_HIGH422', 122); -define('H264_PROFILE_HIGH444', 144); -define('H264_PROFILE_HIGH444_PREDICTIVE', 244); - -class getid3_flv extends getid3_handler { - - const magic = 'FLV'; - - public $max_frames = 100000; // break out of the loop if too many frames have been scanned; only scan this many if meta frame does not contain useful duration - - public function Analyze() { - $info = &$this->getid3->info; - - $this->fseek($info['avdataoffset']); - - $FLVdataLength = $info['avdataend'] - $info['avdataoffset']; - $FLVheader = $this->fread(5); - - $info['fileformat'] = 'flv'; - $info['flv']['header']['signature'] = substr($FLVheader, 0, 3); - $info['flv']['header']['version'] = getid3_lib::BigEndian2Int(substr($FLVheader, 3, 1)); - $TypeFlags = getid3_lib::BigEndian2Int(substr($FLVheader, 4, 1)); - - if ($info['flv']['header']['signature'] != self::magic) { - $info['error'][] = 'Expecting "'.getid3_lib::PrintHexBytes(self::magic).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($info['flv']['header']['signature']).'"'; - unset($info['flv'], $info['fileformat']); - return false; - } - - $info['flv']['header']['hasAudio'] = (bool) ($TypeFlags & 0x04); - $info['flv']['header']['hasVideo'] = (bool) ($TypeFlags & 0x01); - - $FrameSizeDataLength = getid3_lib::BigEndian2Int($this->fread(4)); - $FLVheaderFrameLength = 9; - if ($FrameSizeDataLength > $FLVheaderFrameLength) { - $this->fseek($FrameSizeDataLength - $FLVheaderFrameLength, SEEK_CUR); - } - $Duration = 0; - $found_video = false; - $found_audio = false; - $found_meta = false; - $found_valid_meta_playtime = false; - $tagParseCount = 0; - $info['flv']['framecount'] = array('total'=>0, 'audio'=>0, 'video'=>0); - $flv_framecount = &$info['flv']['framecount']; - while ((($this->ftell() + 16) < $info['avdataend']) && (($tagParseCount++ <= $this->max_frames) || !$found_valid_meta_playtime)) { - $ThisTagHeader = $this->fread(16); - - $PreviousTagLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 0, 4)); - $TagType = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 4, 1)); - $DataLength = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 5, 3)); - $Timestamp = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 8, 3)); - $LastHeaderByte = getid3_lib::BigEndian2Int(substr($ThisTagHeader, 15, 1)); - $NextOffset = $this->ftell() - 1 + $DataLength; - if ($Timestamp > $Duration) { - $Duration = $Timestamp; - } - - $flv_framecount['total']++; - switch ($TagType) { - case GETID3_FLV_TAG_AUDIO: - $flv_framecount['audio']++; - if (!$found_audio) { - $found_audio = true; - $info['flv']['audio']['audioFormat'] = ($LastHeaderByte >> 4) & 0x0F; - $info['flv']['audio']['audioRate'] = ($LastHeaderByte >> 2) & 0x03; - $info['flv']['audio']['audioSampleSize'] = ($LastHeaderByte >> 1) & 0x01; - $info['flv']['audio']['audioType'] = $LastHeaderByte & 0x01; - } - break; - - case GETID3_FLV_TAG_VIDEO: - $flv_framecount['video']++; - if (!$found_video) { - $found_video = true; - $info['flv']['video']['videoCodec'] = $LastHeaderByte & 0x07; - - $FLVvideoHeader = $this->fread(11); - - if ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H264) { - // this code block contributed by: moysevichØgmail*com - - $AVCPacketType = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 0, 1)); - if ($AVCPacketType == H264_AVC_SEQUENCE_HEADER) { - // read AVCDecoderConfigurationRecord - $configurationVersion = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 1)); - $AVCProfileIndication = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 1)); - $profile_compatibility = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 1)); - $lengthSizeMinusOne = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 1)); - $numOfSequenceParameterSets = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 8, 1)); - - if (($numOfSequenceParameterSets & 0x1F) != 0) { - // there is at least one SequenceParameterSet - // read size of the first SequenceParameterSet - //$spsSize = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 9, 2)); - $spsSize = getid3_lib::LittleEndian2Int(substr($FLVvideoHeader, 9, 2)); - // read the first SequenceParameterSet - $sps = $this->fread($spsSize); - if (strlen($sps) == $spsSize) { // make sure that whole SequenceParameterSet was red - $spsReader = new AVCSequenceParameterSetReader($sps); - $spsReader->readData(); - $info['video']['resolution_x'] = $spsReader->getWidth(); - $info['video']['resolution_y'] = $spsReader->getHeight(); - } - } - } - // end: moysevichØgmail*com - - } elseif ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H263) { - - $PictureSizeType = (getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 3, 2))) >> 7; - $PictureSizeType = $PictureSizeType & 0x0007; - $info['flv']['header']['videoSizeType'] = $PictureSizeType; - switch ($PictureSizeType) { - case 0: - //$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2)); - //$PictureSizeEnc <<= 1; - //$info['video']['resolution_x'] = ($PictureSizeEnc & 0xFF00) >> 8; - //$PictureSizeEnc = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2)); - //$PictureSizeEnc <<= 1; - //$info['video']['resolution_y'] = ($PictureSizeEnc & 0xFF00) >> 8; - - $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 2)) >> 7; - $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 5, 2)) >> 7; - $info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFF; - $info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFF; - break; - - case 1: - $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 4, 3)) >> 7; - $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 3)) >> 7; - $info['video']['resolution_x'] = $PictureSizeEnc['x'] & 0xFFFF; - $info['video']['resolution_y'] = $PictureSizeEnc['y'] & 0xFFFF; - break; - - case 2: - $info['video']['resolution_x'] = 352; - $info['video']['resolution_y'] = 288; - break; - - case 3: - $info['video']['resolution_x'] = 176; - $info['video']['resolution_y'] = 144; - break; - - case 4: - $info['video']['resolution_x'] = 128; - $info['video']['resolution_y'] = 96; - break; - - case 5: - $info['video']['resolution_x'] = 320; - $info['video']['resolution_y'] = 240; - break; - - case 6: - $info['video']['resolution_x'] = 160; - $info['video']['resolution_y'] = 120; - break; - - default: - $info['video']['resolution_x'] = 0; - $info['video']['resolution_y'] = 0; - break; - - } - - } elseif ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_VP6FLV_ALPHA) { - - /* contributed by schouwerwouØgmail*com */ - if (!isset($info['video']['resolution_x'])) { // only when meta data isn't set - $PictureSizeEnc['x'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 6, 2)); - $PictureSizeEnc['y'] = getid3_lib::BigEndian2Int(substr($FLVvideoHeader, 7, 2)); - $info['video']['resolution_x'] = ($PictureSizeEnc['x'] & 0xFF) << 3; - $info['video']['resolution_y'] = ($PictureSizeEnc['y'] & 0xFF) << 3; - } - /* end schouwerwouØgmail*com */ - - } - if (!empty($info['video']['resolution_x']) && !empty($info['video']['resolution_y'])) { - $info['video']['pixel_aspect_ratio'] = $info['video']['resolution_x'] / $info['video']['resolution_y']; - } - } - break; - - // Meta tag - case GETID3_FLV_TAG_META: - if (!$found_meta) { - $found_meta = true; - $this->fseek(-1, SEEK_CUR); - $datachunk = $this->fread($DataLength); - $AMFstream = new AMFStream($datachunk); - $reader = new AMFReader($AMFstream); - $eventName = $reader->readData(); - $info['flv']['meta'][$eventName] = $reader->readData(); - unset($reader); - - $copykeys = array('framerate'=>'frame_rate', 'width'=>'resolution_x', 'height'=>'resolution_y', 'audiodatarate'=>'bitrate', 'videodatarate'=>'bitrate'); - foreach ($copykeys as $sourcekey => $destkey) { - if (isset($info['flv']['meta']['onMetaData'][$sourcekey])) { - switch ($sourcekey) { - case 'width': - case 'height': - $info['video'][$destkey] = intval(round($info['flv']['meta']['onMetaData'][$sourcekey])); - break; - case 'audiodatarate': - $info['audio'][$destkey] = getid3_lib::CastAsInt(round($info['flv']['meta']['onMetaData'][$sourcekey] * 1000)); - break; - case 'videodatarate': - case 'frame_rate': - default: - $info['video'][$destkey] = $info['flv']['meta']['onMetaData'][$sourcekey]; - break; - } - } - } - if (!empty($info['flv']['meta']['onMetaData']['duration'])) { - $found_valid_meta_playtime = true; - } - } - break; - - default: - // noop - break; - } - $this->fseek($NextOffset); - } - - $info['playtime_seconds'] = $Duration / 1000; - if ($info['playtime_seconds'] > 0) { - $info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; - } - - if ($info['flv']['header']['hasAudio']) { - $info['audio']['codec'] = self::audioFormatLookup($info['flv']['audio']['audioFormat']); - $info['audio']['sample_rate'] = self::audioRateLookup($info['flv']['audio']['audioRate']); - $info['audio']['bits_per_sample'] = self::audioBitDepthLookup($info['flv']['audio']['audioSampleSize']); - - $info['audio']['channels'] = $info['flv']['audio']['audioType'] + 1; // 0=mono,1=stereo - $info['audio']['lossless'] = ($info['flv']['audio']['audioFormat'] ? false : true); // 0=uncompressed - $info['audio']['dataformat'] = 'flv'; - } - if (!empty($info['flv']['header']['hasVideo'])) { - $info['video']['codec'] = self::videoCodecLookup($info['flv']['video']['videoCodec']); - $info['video']['dataformat'] = 'flv'; - $info['video']['lossless'] = false; - } - - // Set information from meta - if (!empty($info['flv']['meta']['onMetaData']['duration'])) { - $info['playtime_seconds'] = $info['flv']['meta']['onMetaData']['duration']; - $info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; - } - if (isset($info['flv']['meta']['onMetaData']['audiocodecid'])) { - $info['audio']['codec'] = self::audioFormatLookup($info['flv']['meta']['onMetaData']['audiocodecid']); - } - if (isset($info['flv']['meta']['onMetaData']['videocodecid'])) { - $info['video']['codec'] = self::videoCodecLookup($info['flv']['meta']['onMetaData']['videocodecid']); - } - return true; - } - - - public static function audioFormatLookup($id) { - static $lookup = array( - 0 => 'Linear PCM, platform endian', - 1 => 'ADPCM', - 2 => 'mp3', - 3 => 'Linear PCM, little endian', - 4 => 'Nellymoser 16kHz mono', - 5 => 'Nellymoser 8kHz mono', - 6 => 'Nellymoser', - 7 => 'G.711A-law logarithmic PCM', - 8 => 'G.711 mu-law logarithmic PCM', - 9 => 'reserved', - 10 => 'AAC', - 11 => 'Speex', - 12 => false, // unknown? - 13 => false, // unknown? - 14 => 'mp3 8kHz', - 15 => 'Device-specific sound', - ); - return (isset($lookup[$id]) ? $lookup[$id] : false); - } - - public static function audioRateLookup($id) { - static $lookup = array( - 0 => 5500, - 1 => 11025, - 2 => 22050, - 3 => 44100, - ); - return (isset($lookup[$id]) ? $lookup[$id] : false); - } - - public static function audioBitDepthLookup($id) { - static $lookup = array( - 0 => 8, - 1 => 16, - ); - return (isset($lookup[$id]) ? $lookup[$id] : false); - } - - public static function videoCodecLookup($id) { - static $lookup = array( - GETID3_FLV_VIDEO_H263 => 'Sorenson H.263', - GETID3_FLV_VIDEO_SCREEN => 'Screen video', - GETID3_FLV_VIDEO_VP6FLV => 'On2 VP6', - GETID3_FLV_VIDEO_VP6FLV_ALPHA => 'On2 VP6 with alpha channel', - GETID3_FLV_VIDEO_SCREENV2 => 'Screen video v2', - GETID3_FLV_VIDEO_H264 => 'Sorenson H.264', - ); - return (isset($lookup[$id]) ? $lookup[$id] : false); - } -} - -class AMFStream { - public $bytes; - public $pos; - - public function __construct(&$bytes) { - $this->bytes =& $bytes; - $this->pos = 0; - } - - public function readByte() { - return getid3_lib::BigEndian2Int(substr($this->bytes, $this->pos++, 1)); - } - - public function readInt() { - return ($this->readByte() << 8) + $this->readByte(); - } - - public function readLong() { - return ($this->readByte() << 24) + ($this->readByte() << 16) + ($this->readByte() << 8) + $this->readByte(); - } - - public function readDouble() { - return getid3_lib::BigEndian2Float($this->read(8)); - } - - public function readUTF() { - $length = $this->readInt(); - return $this->read($length); - } - - public function readLongUTF() { - $length = $this->readLong(); - return $this->read($length); - } - - public function read($length) { - $val = substr($this->bytes, $this->pos, $length); - $this->pos += $length; - return $val; - } - - public function peekByte() { - $pos = $this->pos; - $val = $this->readByte(); - $this->pos = $pos; - return $val; - } - - public function peekInt() { - $pos = $this->pos; - $val = $this->readInt(); - $this->pos = $pos; - return $val; - } - - public function peekLong() { - $pos = $this->pos; - $val = $this->readLong(); - $this->pos = $pos; - return $val; - } - - public function peekDouble() { - $pos = $this->pos; - $val = $this->readDouble(); - $this->pos = $pos; - return $val; - } - - public function peekUTF() { - $pos = $this->pos; - $val = $this->readUTF(); - $this->pos = $pos; - return $val; - } - - public function peekLongUTF() { - $pos = $this->pos; - $val = $this->readLongUTF(); - $this->pos = $pos; - return $val; - } -} - -class AMFReader { - public $stream; - - public function __construct(&$stream) { - $this->stream =& $stream; - } - - public function readData() { - $value = null; - - $type = $this->stream->readByte(); - switch ($type) { - - // Double - case 0: - $value = $this->readDouble(); - break; - - // Boolean - case 1: - $value = $this->readBoolean(); - break; - - // String - case 2: - $value = $this->readString(); - break; - - // Object - case 3: - $value = $this->readObject(); - break; - - // null - case 6: - return null; - break; - - // Mixed array - case 8: - $value = $this->readMixedArray(); - break; - - // Array - case 10: - $value = $this->readArray(); - break; - - // Date - case 11: - $value = $this->readDate(); - break; - - // Long string - case 13: - $value = $this->readLongString(); - break; - - // XML (handled as string) - case 15: - $value = $this->readXML(); - break; - - // Typed object (handled as object) - case 16: - $value = $this->readTypedObject(); - break; - - // Long string - default: - $value = '(unknown or unsupported data type)'; - break; - } - - return $value; - } - - public function readDouble() { - return $this->stream->readDouble(); - } - - public function readBoolean() { - return $this->stream->readByte() == 1; - } - - public function readString() { - return $this->stream->readUTF(); - } - - public function readObject() { - // Get highest numerical index - ignored -// $highestIndex = $this->stream->readLong(); - - $data = array(); - - while ($key = $this->stream->readUTF()) { - $data[$key] = $this->readData(); - } - // Mixed array record ends with empty string (0x00 0x00) and 0x09 - if (($key == '') && ($this->stream->peekByte() == 0x09)) { - // Consume byte - $this->stream->readByte(); - } - return $data; - } - - public function readMixedArray() { - // Get highest numerical index - ignored - $highestIndex = $this->stream->readLong(); - - $data = array(); - - while ($key = $this->stream->readUTF()) { - if (is_numeric($key)) { - $key = (float) $key; - } - $data[$key] = $this->readData(); - } - // Mixed array record ends with empty string (0x00 0x00) and 0x09 - if (($key == '') && ($this->stream->peekByte() == 0x09)) { - // Consume byte - $this->stream->readByte(); - } - - return $data; - } - - public function readArray() { - $length = $this->stream->readLong(); - $data = array(); - - for ($i = 0; $i < $length; $i++) { - $data[] = $this->readData(); - } - return $data; - } - - public function readDate() { - $timestamp = $this->stream->readDouble(); - $timezone = $this->stream->readInt(); - return $timestamp; - } - - public function readLongString() { - return $this->stream->readLongUTF(); - } - - public function readXML() { - return $this->stream->readLongUTF(); - } - - public function readTypedObject() { - $className = $this->stream->readUTF(); - return $this->readObject(); - } -} - -class AVCSequenceParameterSetReader { - public $sps; - public $start = 0; - public $currentBytes = 0; - public $currentBits = 0; - public $width; - public $height; - - public function __construct($sps) { - $this->sps = $sps; - } - - public function readData() { - $this->skipBits(8); - $this->skipBits(8); - $profile = $this->getBits(8); // read profile - if ($profile > 0) { - $this->skipBits(8); - $level_idc = $this->getBits(8); // level_idc - $this->expGolombUe(); // seq_parameter_set_id // sps - $this->expGolombUe(); // log2_max_frame_num_minus4 - $picOrderType = $this->expGolombUe(); // pic_order_cnt_type - if ($picOrderType == 0) { - $this->expGolombUe(); // log2_max_pic_order_cnt_lsb_minus4 - } elseif ($picOrderType == 1) { - $this->skipBits(1); // delta_pic_order_always_zero_flag - $this->expGolombSe(); // offset_for_non_ref_pic - $this->expGolombSe(); // offset_for_top_to_bottom_field - $num_ref_frames_in_pic_order_cnt_cycle = $this->expGolombUe(); // num_ref_frames_in_pic_order_cnt_cycle - for ($i = 0; $i < $num_ref_frames_in_pic_order_cnt_cycle; $i++) { - $this->expGolombSe(); // offset_for_ref_frame[ i ] - } - } - $this->expGolombUe(); // num_ref_frames - $this->skipBits(1); // gaps_in_frame_num_value_allowed_flag - $pic_width_in_mbs_minus1 = $this->expGolombUe(); // pic_width_in_mbs_minus1 - $pic_height_in_map_units_minus1 = $this->expGolombUe(); // pic_height_in_map_units_minus1 - - $frame_mbs_only_flag = $this->getBits(1); // frame_mbs_only_flag - if ($frame_mbs_only_flag == 0) { - $this->skipBits(1); // mb_adaptive_frame_field_flag - } - $this->skipBits(1); // direct_8x8_inference_flag - $frame_cropping_flag = $this->getBits(1); // frame_cropping_flag - - $frame_crop_left_offset = 0; - $frame_crop_right_offset = 0; - $frame_crop_top_offset = 0; - $frame_crop_bottom_offset = 0; - - if ($frame_cropping_flag) { - $frame_crop_left_offset = $this->expGolombUe(); // frame_crop_left_offset - $frame_crop_right_offset = $this->expGolombUe(); // frame_crop_right_offset - $frame_crop_top_offset = $this->expGolombUe(); // frame_crop_top_offset - $frame_crop_bottom_offset = $this->expGolombUe(); // frame_crop_bottom_offset - } - $this->skipBits(1); // vui_parameters_present_flag - // etc - - $this->width = (($pic_width_in_mbs_minus1 + 1) * 16) - ($frame_crop_left_offset * 2) - ($frame_crop_right_offset * 2); - $this->height = ((2 - $frame_mbs_only_flag) * ($pic_height_in_map_units_minus1 + 1) * 16) - ($frame_crop_top_offset * 2) - ($frame_crop_bottom_offset * 2); - } - } - - public function skipBits($bits) { - $newBits = $this->currentBits + $bits; - $this->currentBytes += (int)floor($newBits / 8); - $this->currentBits = $newBits % 8; - } - - public function getBit() { - $result = (getid3_lib::BigEndian2Int(substr($this->sps, $this->currentBytes, 1)) >> (7 - $this->currentBits)) & 0x01; - $this->skipBits(1); - return $result; - } - - public function getBits($bits) { - $result = 0; - for ($i = 0; $i < $bits; $i++) { - $result = ($result << 1) + $this->getBit(); - } - return $result; - } - - public function expGolombUe() { - $significantBits = 0; - $bit = $this->getBit(); - while ($bit == 0) { - $significantBits++; - $bit = $this->getBit(); - - if ($significantBits > 31) { - // something is broken, this is an emergency escape to prevent infinite loops - return 0; - } - } - return (1 << $significantBits) + $this->getBits($significantBits) - 1; - } - - public function expGolombSe() { - $result = $this->expGolombUe(); - if (($result & 0x01) == 0) { - return -($result >> 1); - } else { - return ($result + 1) >> 1; - } - } - - public function getWidth() { - return $this->width; - } - - public function getHeight() { - return $this->height; - } -} diff --git a/wp/wp-includes/ID3/module.audio-video.matroska.php b/wp/wp-includes/ID3/module.audio-video.matroska.php deleted file mode 100644 index f2cc5ac0..00000000 --- a/wp/wp-includes/ID3/module.audio-video.matroska.php +++ /dev/null @@ -1,1751 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// -// See readme.txt for more details // -///////////////////////////////////////////////////////////////// -// // -// module.audio-video.matriska.php // -// module for analyzing Matroska containers // -// dependencies: NONE // -// /// -///////////////////////////////////////////////////////////////// - - -define('EBML_ID_CHAPTERS', 0x0043A770); // [10][43][A7][70] -- A system to define basic menus and partition data. For more detailed information, look at the Chapters Explanation. -define('EBML_ID_SEEKHEAD', 0x014D9B74); // [11][4D][9B][74] -- Contains the position of other level 1 elements. -define('EBML_ID_TAGS', 0x0254C367); // [12][54][C3][67] -- Element containing elements specific to Tracks/Chapters. A list of valid tags can be found . -define('EBML_ID_INFO', 0x0549A966); // [15][49][A9][66] -- Contains miscellaneous general information and statistics on the file. -define('EBML_ID_TRACKS', 0x0654AE6B); // [16][54][AE][6B] -- A top-level block of information with many tracks described. -define('EBML_ID_SEGMENT', 0x08538067); // [18][53][80][67] -- This element contains all other top-level (level 1) elements. Typically a Matroska file is composed of 1 segment. -define('EBML_ID_ATTACHMENTS', 0x0941A469); // [19][41][A4][69] -- Contain attached files. -define('EBML_ID_EBML', 0x0A45DFA3); // [1A][45][DF][A3] -- Set the EBML characteristics of the data to follow. Each EBML document has to start with this. -define('EBML_ID_CUES', 0x0C53BB6B); // [1C][53][BB][6B] -- A top-level element to speed seeking access. All entries are local to the segment. -define('EBML_ID_CLUSTER', 0x0F43B675); // [1F][43][B6][75] -- The lower level element containing the (monolithic) Block structure. -define('EBML_ID_LANGUAGE', 0x02B59C); // [22][B5][9C] -- Specifies the language of the track in the Matroska languages form. -define('EBML_ID_TRACKTIMECODESCALE', 0x03314F); // [23][31][4F] -- The scale to apply on this track to work at normal speed in relation with other tracks (mostly used to adjust video speed when the audio length differs). -define('EBML_ID_DEFAULTDURATION', 0x03E383); // [23][E3][83] -- Number of nanoseconds (i.e. not scaled) per frame. -define('EBML_ID_CODECNAME', 0x058688); // [25][86][88] -- A human-readable string specifying the codec. -define('EBML_ID_CODECDOWNLOADURL', 0x06B240); // [26][B2][40] -- A URL to download about the codec used. -define('EBML_ID_TIMECODESCALE', 0x0AD7B1); // [2A][D7][B1] -- Timecode scale in nanoseconds (1.000.000 means all timecodes in the segment are expressed in milliseconds). -define('EBML_ID_COLOURSPACE', 0x0EB524); // [2E][B5][24] -- Same value as in AVI (32 bits). -define('EBML_ID_GAMMAVALUE', 0x0FB523); // [2F][B5][23] -- Gamma Value. -define('EBML_ID_CODECSETTINGS', 0x1A9697); // [3A][96][97] -- A string describing the encoding setting used. -define('EBML_ID_CODECINFOURL', 0x1B4040); // [3B][40][40] -- A URL to find information about the codec used. -define('EBML_ID_PREVFILENAME', 0x1C83AB); // [3C][83][AB] -- An escaped filename corresponding to the previous segment. -define('EBML_ID_PREVUID', 0x1CB923); // [3C][B9][23] -- A unique ID to identify the previous chained segment (128 bits). -define('EBML_ID_NEXTFILENAME', 0x1E83BB); // [3E][83][BB] -- An escaped filename corresponding to the next segment. -define('EBML_ID_NEXTUID', 0x1EB923); // [3E][B9][23] -- A unique ID to identify the next chained segment (128 bits). -define('EBML_ID_CONTENTCOMPALGO', 0x0254); // [42][54] -- The compression algorithm used. Algorithms that have been specified so far are: -define('EBML_ID_CONTENTCOMPSETTINGS', 0x0255); // [42][55] -- Settings that might be needed by the decompressor. For Header Stripping (ContentCompAlgo=3), the bytes that were removed from the beggining of each frames of the track. -define('EBML_ID_DOCTYPE', 0x0282); // [42][82] -- A string that describes the type of document that follows this EBML header ('matroska' in our case). -define('EBML_ID_DOCTYPEREADVERSION', 0x0285); // [42][85] -- The minimum DocType version an interpreter has to support to read this file. -define('EBML_ID_EBMLVERSION', 0x0286); // [42][86] -- The version of EBML parser used to create the file. -define('EBML_ID_DOCTYPEVERSION', 0x0287); // [42][87] -- The version of DocType interpreter used to create the file. -define('EBML_ID_EBMLMAXIDLENGTH', 0x02F2); // [42][F2] -- The maximum length of the IDs you'll find in this file (4 or less in Matroska). -define('EBML_ID_EBMLMAXSIZELENGTH', 0x02F3); // [42][F3] -- The maximum length of the sizes you'll find in this file (8 or less in Matroska). This does not override the element size indicated at the beginning of an element. Elements that have an indicated size which is larger than what is allowed by EBMLMaxSizeLength shall be considered invalid. -define('EBML_ID_EBMLREADVERSION', 0x02F7); // [42][F7] -- The minimum EBML version a parser has to support to read this file. -define('EBML_ID_CHAPLANGUAGE', 0x037C); // [43][7C] -- The languages corresponding to the string, in the bibliographic ISO-639-2 form. -define('EBML_ID_CHAPCOUNTRY', 0x037E); // [43][7E] -- The countries corresponding to the string, same 2 octets as in Internet domains. -define('EBML_ID_SEGMENTFAMILY', 0x0444); // [44][44] -- A randomly generated unique ID that all segments related to each other must use (128 bits). -define('EBML_ID_DATEUTC', 0x0461); // [44][61] -- Date of the origin of timecode (value 0), i.e. production date. -define('EBML_ID_TAGLANGUAGE', 0x047A); // [44][7A] -- Specifies the language of the tag specified, in the Matroska languages form. -define('EBML_ID_TAGDEFAULT', 0x0484); // [44][84] -- Indication to know if this is the default/original language to use for the given tag. -define('EBML_ID_TAGBINARY', 0x0485); // [44][85] -- The values of the Tag if it is binary. Note that this cannot be used in the same SimpleTag as TagString. -define('EBML_ID_TAGSTRING', 0x0487); // [44][87] -- The value of the Tag. -define('EBML_ID_DURATION', 0x0489); // [44][89] -- Duration of the segment (based on TimecodeScale). -define('EBML_ID_CHAPPROCESSPRIVATE', 0x050D); // [45][0D] -- Some optional data attached to the ChapProcessCodecID information. For ChapProcessCodecID = 1, it is the "DVD level" equivalent. -define('EBML_ID_CHAPTERFLAGENABLED', 0x0598); // [45][98] -- Specify wether the chapter is enabled. It can be enabled/disabled by a Control Track. When disabled, the movie should skip all the content between the TimeStart and TimeEnd of this chapter. -define('EBML_ID_TAGNAME', 0x05A3); // [45][A3] -- The name of the Tag that is going to be stored. -define('EBML_ID_EDITIONENTRY', 0x05B9); // [45][B9] -- Contains all information about a segment edition. -define('EBML_ID_EDITIONUID', 0x05BC); // [45][BC] -- A unique ID to identify the edition. It's useful for tagging an edition. -define('EBML_ID_EDITIONFLAGHIDDEN', 0x05BD); // [45][BD] -- If an edition is hidden (1), it should not be available to the user interface (but still to Control Tracks). -define('EBML_ID_EDITIONFLAGDEFAULT', 0x05DB); // [45][DB] -- If a flag is set (1) the edition should be used as the default one. -define('EBML_ID_EDITIONFLAGORDERED', 0x05DD); // [45][DD] -- Specify if the chapters can be defined multiple times and the order to play them is enforced. -define('EBML_ID_FILEDATA', 0x065C); // [46][5C] -- The data of the file. -define('EBML_ID_FILEMIMETYPE', 0x0660); // [46][60] -- MIME type of the file. -define('EBML_ID_FILENAME', 0x066E); // [46][6E] -- Filename of the attached file. -define('EBML_ID_FILEREFERRAL', 0x0675); // [46][75] -- A binary value that a track/codec can refer to when the attachment is needed. -define('EBML_ID_FILEDESCRIPTION', 0x067E); // [46][7E] -- A human-friendly name for the attached file. -define('EBML_ID_FILEUID', 0x06AE); // [46][AE] -- Unique ID representing the file, as random as possible. -define('EBML_ID_CONTENTENCALGO', 0x07E1); // [47][E1] -- The encryption algorithm used. The value '0' means that the contents have not been encrypted but only signed. Predefined values: -define('EBML_ID_CONTENTENCKEYID', 0x07E2); // [47][E2] -- For public key algorithms this is the ID of the public key the the data was encrypted with. -define('EBML_ID_CONTENTSIGNATURE', 0x07E3); // [47][E3] -- A cryptographic signature of the contents. -define('EBML_ID_CONTENTSIGKEYID', 0x07E4); // [47][E4] -- This is the ID of the private key the data was signed with. -define('EBML_ID_CONTENTSIGALGO', 0x07E5); // [47][E5] -- The algorithm used for the signature. A value of '0' means that the contents have not been signed but only encrypted. Predefined values: -define('EBML_ID_CONTENTSIGHASHALGO', 0x07E6); // [47][E6] -- The hash algorithm used for the signature. A value of '0' means that the contents have not been signed but only encrypted. Predefined values: -define('EBML_ID_MUXINGAPP', 0x0D80); // [4D][80] -- Muxing application or library ("libmatroska-0.4.3"). -define('EBML_ID_SEEK', 0x0DBB); // [4D][BB] -- Contains a single seek entry to an EBML element. -define('EBML_ID_CONTENTENCODINGORDER', 0x1031); // [50][31] -- Tells when this modification was used during encoding/muxing starting with 0 and counting upwards. The decoder/demuxer has to start with the highest order number it finds and work its way down. This value has to be unique over all ContentEncodingOrder elements in the segment. -define('EBML_ID_CONTENTENCODINGSCOPE', 0x1032); // [50][32] -- A bit field that describes which elements have been modified in this way. Values (big endian) can be OR'ed. Possible values: -define('EBML_ID_CONTENTENCODINGTYPE', 0x1033); // [50][33] -- A value describing what kind of transformation has been done. Possible values: -define('EBML_ID_CONTENTCOMPRESSION', 0x1034); // [50][34] -- Settings describing the compression used. Must be present if the value of ContentEncodingType is 0 and absent otherwise. Each block must be decompressable even if no previous block is available in order not to prevent seeking. -define('EBML_ID_CONTENTENCRYPTION', 0x1035); // [50][35] -- Settings describing the encryption used. Must be present if the value of ContentEncodingType is 1 and absent otherwise. -define('EBML_ID_CUEREFNUMBER', 0x135F); // [53][5F] -- Number of the referenced Block of Track X in the specified Cluster. -define('EBML_ID_NAME', 0x136E); // [53][6E] -- A human-readable track name. -define('EBML_ID_CUEBLOCKNUMBER', 0x1378); // [53][78] -- Number of the Block in the specified Cluster. -define('EBML_ID_TRACKOFFSET', 0x137F); // [53][7F] -- A value to add to the Block's Timecode. This can be used to adjust the playback offset of a track. -define('EBML_ID_SEEKID', 0x13AB); // [53][AB] -- The binary ID corresponding to the element name. -define('EBML_ID_SEEKPOSITION', 0x13AC); // [53][AC] -- The position of the element in the segment in octets (0 = first level 1 element). -define('EBML_ID_STEREOMODE', 0x13B8); // [53][B8] -- Stereo-3D video mode. -define('EBML_ID_OLDSTEREOMODE', 0x13B9); // [53][B9] -- Bogus StereoMode value used in old versions of libmatroska. DO NOT USE. (0: mono, 1: right eye, 2: left eye, 3: both eyes). -define('EBML_ID_PIXELCROPBOTTOM', 0x14AA); // [54][AA] -- The number of video pixels to remove at the bottom of the image (for HDTV content). -define('EBML_ID_DISPLAYWIDTH', 0x14B0); // [54][B0] -- Width of the video frames to display. -define('EBML_ID_DISPLAYUNIT', 0x14B2); // [54][B2] -- Type of the unit for DisplayWidth/Height (0: pixels, 1: centimeters, 2: inches). -define('EBML_ID_ASPECTRATIOTYPE', 0x14B3); // [54][B3] -- Specify the possible modifications to the aspect ratio (0: free resizing, 1: keep aspect ratio, 2: fixed). -define('EBML_ID_DISPLAYHEIGHT', 0x14BA); // [54][BA] -- Height of the video frames to display. -define('EBML_ID_PIXELCROPTOP', 0x14BB); // [54][BB] -- The number of video pixels to remove at the top of the image. -define('EBML_ID_PIXELCROPLEFT', 0x14CC); // [54][CC] -- The number of video pixels to remove on the left of the image. -define('EBML_ID_PIXELCROPRIGHT', 0x14DD); // [54][DD] -- The number of video pixels to remove on the right of the image. -define('EBML_ID_FLAGFORCED', 0x15AA); // [55][AA] -- Set if that track MUST be used during playback. There can be many forced track for a kind (audio, video or subs), the player should select the one which language matches the user preference or the default + forced track. Overlay MAY happen between a forced and non-forced track of the same kind. -define('EBML_ID_MAXBLOCKADDITIONID', 0x15EE); // [55][EE] -- The maximum value of BlockAddID. A value 0 means there is no BlockAdditions for this track. -define('EBML_ID_WRITINGAPP', 0x1741); // [57][41] -- Writing application ("mkvmerge-0.3.3"). -define('EBML_ID_CLUSTERSILENTTRACKS', 0x1854); // [58][54] -- The list of tracks that are not used in that part of the stream. It is useful when using overlay tracks on seeking. Then you should decide what track to use. -define('EBML_ID_CLUSTERSILENTTRACKNUMBER', 0x18D7); // [58][D7] -- One of the track number that are not used from now on in the stream. It could change later if not specified as silent in a further Cluster. -define('EBML_ID_ATTACHEDFILE', 0x21A7); // [61][A7] -- An attached file. -define('EBML_ID_CONTENTENCODING', 0x2240); // [62][40] -- Settings for one content encoding like compression or encryption. -define('EBML_ID_BITDEPTH', 0x2264); // [62][64] -- Bits per sample, mostly used for PCM. -define('EBML_ID_CODECPRIVATE', 0x23A2); // [63][A2] -- Private data only known to the codec. -define('EBML_ID_TARGETS', 0x23C0); // [63][C0] -- Contain all UIDs where the specified meta data apply. It is void to describe everything in the segment. -define('EBML_ID_CHAPTERPHYSICALEQUIV', 0x23C3); // [63][C3] -- Specify the physical equivalent of this ChapterAtom like "DVD" (60) or "SIDE" (50), see complete list of values. -define('EBML_ID_TAGCHAPTERUID', 0x23C4); // [63][C4] -- A unique ID to identify the Chapter(s) the tags belong to. If the value is 0 at this level, the tags apply to all chapters in the Segment. -define('EBML_ID_TAGTRACKUID', 0x23C5); // [63][C5] -- A unique ID to identify the Track(s) the tags belong to. If the value is 0 at this level, the tags apply to all tracks in the Segment. -define('EBML_ID_TAGATTACHMENTUID', 0x23C6); // [63][C6] -- A unique ID to identify the Attachment(s) the tags belong to. If the value is 0 at this level, the tags apply to all the attachments in the Segment. -define('EBML_ID_TAGEDITIONUID', 0x23C9); // [63][C9] -- A unique ID to identify the EditionEntry(s) the tags belong to. If the value is 0 at this level, the tags apply to all editions in the Segment. -define('EBML_ID_TARGETTYPE', 0x23CA); // [63][CA] -- An informational string that can be used to display the logical level of the target like "ALBUM", "TRACK", "MOVIE", "CHAPTER", etc (see TargetType). -define('EBML_ID_TRACKTRANSLATE', 0x2624); // [66][24] -- The track identification for the given Chapter Codec. -define('EBML_ID_TRACKTRANSLATETRACKID', 0x26A5); // [66][A5] -- The binary value used to represent this track in the chapter codec data. The format depends on the ChapProcessCodecID used. -define('EBML_ID_TRACKTRANSLATECODEC', 0x26BF); // [66][BF] -- The chapter codec using this ID (0: Matroska Script, 1: DVD-menu). -define('EBML_ID_TRACKTRANSLATEEDITIONUID', 0x26FC); // [66][FC] -- Specify an edition UID on which this translation applies. When not specified, it means for all editions found in the segment. -define('EBML_ID_SIMPLETAG', 0x27C8); // [67][C8] -- Contains general information about the target. -define('EBML_ID_TARGETTYPEVALUE', 0x28CA); // [68][CA] -- A number to indicate the logical level of the target (see TargetType). -define('EBML_ID_CHAPPROCESSCOMMAND', 0x2911); // [69][11] -- Contains all the commands associated to the Atom. -define('EBML_ID_CHAPPROCESSTIME', 0x2922); // [69][22] -- Defines when the process command should be handled (0: during the whole chapter, 1: before starting playback, 2: after playback of the chapter). -define('EBML_ID_CHAPTERTRANSLATE', 0x2924); // [69][24] -- A tuple of corresponding ID used by chapter codecs to represent this segment. -define('EBML_ID_CHAPPROCESSDATA', 0x2933); // [69][33] -- Contains the command information. The data should be interpreted depending on the ChapProcessCodecID value. For ChapProcessCodecID = 1, the data correspond to the binary DVD cell pre/post commands. -define('EBML_ID_CHAPPROCESS', 0x2944); // [69][44] -- Contains all the commands associated to the Atom. -define('EBML_ID_CHAPPROCESSCODECID', 0x2955); // [69][55] -- Contains the type of the codec used for the processing. A value of 0 means native Matroska processing (to be defined), a value of 1 means the DVD command set is used. More codec IDs can be added later. -define('EBML_ID_CHAPTERTRANSLATEID', 0x29A5); // [69][A5] -- The binary value used to represent this segment in the chapter codec data. The format depends on the ChapProcessCodecID used. -define('EBML_ID_CHAPTERTRANSLATECODEC', 0x29BF); // [69][BF] -- The chapter codec using this ID (0: Matroska Script, 1: DVD-menu). -define('EBML_ID_CHAPTERTRANSLATEEDITIONUID', 0x29FC); // [69][FC] -- Specify an edition UID on which this correspondance applies. When not specified, it means for all editions found in the segment. -define('EBML_ID_CONTENTENCODINGS', 0x2D80); // [6D][80] -- Settings for several content encoding mechanisms like compression or encryption. -define('EBML_ID_MINCACHE', 0x2DE7); // [6D][E7] -- The minimum number of frames a player should be able to cache during playback. If set to 0, the reference pseudo-cache system is not used. -define('EBML_ID_MAXCACHE', 0x2DF8); // [6D][F8] -- The maximum cache size required to store referenced frames in and the current frame. 0 means no cache is needed. -define('EBML_ID_CHAPTERSEGMENTUID', 0x2E67); // [6E][67] -- A segment to play in place of this chapter. Edition ChapterSegmentEditionUID should be used for this segment, otherwise no edition is used. -define('EBML_ID_CHAPTERSEGMENTEDITIONUID', 0x2EBC); // [6E][BC] -- The edition to play from the segment linked in ChapterSegmentUID. -define('EBML_ID_TRACKOVERLAY', 0x2FAB); // [6F][AB] -- Specify that this track is an overlay track for the Track specified (in the u-integer). That means when this track has a gap (see SilentTracks) the overlay track should be used instead. The order of multiple TrackOverlay matters, the first one is the one that should be used. If not found it should be the second, etc. -define('EBML_ID_TAG', 0x3373); // [73][73] -- Element containing elements specific to Tracks/Chapters. -define('EBML_ID_SEGMENTFILENAME', 0x3384); // [73][84] -- A filename corresponding to this segment. -define('EBML_ID_SEGMENTUID', 0x33A4); // [73][A4] -- A randomly generated unique ID to identify the current segment between many others (128 bits). -define('EBML_ID_CHAPTERUID', 0x33C4); // [73][C4] -- A unique ID to identify the Chapter. -define('EBML_ID_TRACKUID', 0x33C5); // [73][C5] -- A unique ID to identify the Track. This should be kept the same when making a direct stream copy of the Track to another file. -define('EBML_ID_ATTACHMENTLINK', 0x3446); // [74][46] -- The UID of an attachment that is used by this codec. -define('EBML_ID_CLUSTERBLOCKADDITIONS', 0x35A1); // [75][A1] -- Contain additional blocks to complete the main one. An EBML parser that has no knowledge of the Block structure could still see and use/skip these data. -define('EBML_ID_CHANNELPOSITIONS', 0x347B); // [7D][7B] -- Table of horizontal angles for each successive channel, see appendix. -define('EBML_ID_OUTPUTSAMPLINGFREQUENCY', 0x38B5); // [78][B5] -- Real output sampling frequency in Hz (used for SBR techniques). -define('EBML_ID_TITLE', 0x3BA9); // [7B][A9] -- General name of the segment. -define('EBML_ID_CHAPTERDISPLAY', 0x00); // [80] -- Contains all possible strings to use for the chapter display. -define('EBML_ID_TRACKTYPE', 0x03); // [83] -- A set of track types coded on 8 bits (1: video, 2: audio, 3: complex, 0x10: logo, 0x11: subtitle, 0x12: buttons, 0x20: control). -define('EBML_ID_CHAPSTRING', 0x05); // [85] -- Contains the string to use as the chapter atom. -define('EBML_ID_CODECID', 0x06); // [86] -- An ID corresponding to the codec, see the codec page for more info. -define('EBML_ID_FLAGDEFAULT', 0x08); // [88] -- Set if that track (audio, video or subs) SHOULD be used if no language found matches the user preference. -define('EBML_ID_CHAPTERTRACKNUMBER', 0x09); // [89] -- UID of the Track to apply this chapter too. In the absense of a control track, choosing this chapter will select the listed Tracks and deselect unlisted tracks. Absense of this element indicates that the Chapter should be applied to any currently used Tracks. -define('EBML_ID_CLUSTERSLICES', 0x0E); // [8E] -- Contains slices description. -define('EBML_ID_CHAPTERTRACK', 0x0F); // [8F] -- List of tracks on which the chapter applies. If this element is not present, all tracks apply -define('EBML_ID_CHAPTERTIMESTART', 0x11); // [91] -- Timecode of the start of Chapter (not scaled). -define('EBML_ID_CHAPTERTIMEEND', 0x12); // [92] -- Timecode of the end of Chapter (timecode excluded, not scaled). -define('EBML_ID_CUEREFTIME', 0x16); // [96] -- Timecode of the referenced Block. -define('EBML_ID_CUEREFCLUSTER', 0x17); // [97] -- Position of the Cluster containing the referenced Block. -define('EBML_ID_CHAPTERFLAGHIDDEN', 0x18); // [98] -- If a chapter is hidden (1), it should not be available to the user interface (but still to Control Tracks). -define('EBML_ID_FLAGINTERLACED', 0x1A); // [9A] -- Set if the video is interlaced. -define('EBML_ID_CLUSTERBLOCKDURATION', 0x1B); // [9B] -- The duration of the Block (based on TimecodeScale). This element is mandatory when DefaultDuration is set for the track. When not written and with no DefaultDuration, the value is assumed to be the difference between the timecode of this Block and the timecode of the next Block in "display" order (not coding order). This element can be useful at the end of a Track (as there is not other Block available), or when there is a break in a track like for subtitle tracks. -define('EBML_ID_FLAGLACING', 0x1C); // [9C] -- Set if the track may contain blocks using lacing. -define('EBML_ID_CHANNELS', 0x1F); // [9F] -- Numbers of channels in the track. -define('EBML_ID_CLUSTERBLOCKGROUP', 0x20); // [A0] -- Basic container of information containing a single Block or BlockVirtual, and information specific to that Block/VirtualBlock. -define('EBML_ID_CLUSTERBLOCK', 0x21); // [A1] -- Block containing the actual data to be rendered and a timecode relative to the Cluster Timecode. -define('EBML_ID_CLUSTERBLOCKVIRTUAL', 0x22); // [A2] -- A Block with no data. It must be stored in the stream at the place the real Block should be in display order. -define('EBML_ID_CLUSTERSIMPLEBLOCK', 0x23); // [A3] -- Similar to Block but without all the extra information, mostly used to reduced overhead when no extra feature is needed. -define('EBML_ID_CLUSTERCODECSTATE', 0x24); // [A4] -- The new codec state to use. Data interpretation is private to the codec. This information should always be referenced by a seek entry. -define('EBML_ID_CLUSTERBLOCKADDITIONAL', 0x25); // [A5] -- Interpreted by the codec as it wishes (using the BlockAddID). -define('EBML_ID_CLUSTERBLOCKMORE', 0x26); // [A6] -- Contain the BlockAdditional and some parameters. -define('EBML_ID_CLUSTERPOSITION', 0x27); // [A7] -- Position of the Cluster in the segment (0 in live broadcast streams). It might help to resynchronise offset on damaged streams. -define('EBML_ID_CODECDECODEALL', 0x2A); // [AA] -- The codec can decode potentially damaged data. -define('EBML_ID_CLUSTERPREVSIZE', 0x2B); // [AB] -- Size of the previous Cluster, in octets. Can be useful for backward playing. -define('EBML_ID_TRACKENTRY', 0x2E); // [AE] -- Describes a track with all elements. -define('EBML_ID_CLUSTERENCRYPTEDBLOCK', 0x2F); // [AF] -- Similar to SimpleBlock but the data inside the Block are Transformed (encrypt and/or signed). -define('EBML_ID_PIXELWIDTH', 0x30); // [B0] -- Width of the encoded video frames in pixels. -define('EBML_ID_CUETIME', 0x33); // [B3] -- Absolute timecode according to the segment time base. -define('EBML_ID_SAMPLINGFREQUENCY', 0x35); // [B5] -- Sampling frequency in Hz. -define('EBML_ID_CHAPTERATOM', 0x36); // [B6] -- Contains the atom information to use as the chapter atom (apply to all tracks). -define('EBML_ID_CUETRACKPOSITIONS', 0x37); // [B7] -- Contain positions for different tracks corresponding to the timecode. -define('EBML_ID_FLAGENABLED', 0x39); // [B9] -- Set if the track is used. -define('EBML_ID_PIXELHEIGHT', 0x3A); // [BA] -- Height of the encoded video frames in pixels. -define('EBML_ID_CUEPOINT', 0x3B); // [BB] -- Contains all information relative to a seek point in the segment. -define('EBML_ID_CRC32', 0x3F); // [BF] -- The CRC is computed on all the data of the Master element it's in, regardless of its position. It's recommended to put the CRC value at the beggining of the Master element for easier reading. All level 1 elements should include a CRC-32. -define('EBML_ID_CLUSTERBLOCKADDITIONID', 0x4B); // [CB] -- The ID of the BlockAdditional element (0 is the main Block). -define('EBML_ID_CLUSTERLACENUMBER', 0x4C); // [CC] -- The reverse number of the frame in the lace (0 is the last frame, 1 is the next to last, etc). While there are a few files in the wild with this element, it is no longer in use and has been deprecated. Being able to interpret this element is not required for playback. -define('EBML_ID_CLUSTERFRAMENUMBER', 0x4D); // [CD] -- The number of the frame to generate from this lace with this delay (allow you to generate many frames from the same Block/Frame). -define('EBML_ID_CLUSTERDELAY', 0x4E); // [CE] -- The (scaled) delay to apply to the element. -define('EBML_ID_CLUSTERDURATION', 0x4F); // [CF] -- The (scaled) duration to apply to the element. -define('EBML_ID_TRACKNUMBER', 0x57); // [D7] -- The track number as used in the Block Header (using more than 127 tracks is not encouraged, though the design allows an unlimited number). -define('EBML_ID_CUEREFERENCE', 0x5B); // [DB] -- The Clusters containing the required referenced Blocks. -define('EBML_ID_VIDEO', 0x60); // [E0] -- Video settings. -define('EBML_ID_AUDIO', 0x61); // [E1] -- Audio settings. -define('EBML_ID_CLUSTERTIMESLICE', 0x68); // [E8] -- Contains extra time information about the data contained in the Block. While there are a few files in the wild with this element, it is no longer in use and has been deprecated. Being able to interpret this element is not required for playback. -define('EBML_ID_CUECODECSTATE', 0x6A); // [EA] -- The position of the Codec State corresponding to this Cue element. 0 means that the data is taken from the initial Track Entry. -define('EBML_ID_CUEREFCODECSTATE', 0x6B); // [EB] -- The position of the Codec State corresponding to this referenced element. 0 means that the data is taken from the initial Track Entry. -define('EBML_ID_VOID', 0x6C); // [EC] -- Used to void damaged data, to avoid unexpected behaviors when using damaged data. The content is discarded. Also used to reserve space in a sub-element for later use. -define('EBML_ID_CLUSTERTIMECODE', 0x67); // [E7] -- Absolute timecode of the cluster (based on TimecodeScale). -define('EBML_ID_CLUSTERBLOCKADDID', 0x6E); // [EE] -- An ID to identify the BlockAdditional level. -define('EBML_ID_CUECLUSTERPOSITION', 0x71); // [F1] -- The position of the Cluster containing the required Block. -define('EBML_ID_CUETRACK', 0x77); // [F7] -- The track for which a position is given. -define('EBML_ID_CLUSTERREFERENCEPRIORITY', 0x7A); // [FA] -- This frame is referenced and has the specified cache priority. In cache only a frame of the same or higher priority can replace this frame. A value of 0 means the frame is not referenced. -define('EBML_ID_CLUSTERREFERENCEBLOCK', 0x7B); // [FB] -- Timecode of another frame used as a reference (ie: B or P frame). The timecode is relative to the block it's attached to. -define('EBML_ID_CLUSTERREFERENCEVIRTUAL', 0x7D); // [FD] -- Relative position of the data that should be in position of the virtual block. - - -/** -* @tutorial http://www.matroska.org/technical/specs/index.html -* -* @todo Rewrite EBML parser to reduce it's size and honor default element values -* @todo After rewrite implement stream size calculation, that will provide additional useful info and enable AAC/FLAC audio bitrate detection -*/ -class getid3_matroska extends getid3_handler -{ - // public options - public static $hide_clusters = true; // if true, do not return information about CLUSTER chunks, since there's a lot of them and they're not usually useful [default: TRUE] - public static $parse_whole_file = false; // true to parse the whole file, not only header [default: FALSE] - - // private parser settings/placeholders - private $EBMLbuffer = ''; - private $EBMLbuffer_offset = 0; - private $EBMLbuffer_length = 0; - private $current_offset = 0; - private $unuseful_elements = array(EBML_ID_CRC32, EBML_ID_VOID); - - public function Analyze() - { - $info = &$this->getid3->info; - - // parse container - try { - $this->parseEBML($info); - } catch (Exception $e) { - $info['error'][] = 'EBML parser: '.$e->getMessage(); - } - - // calculate playtime - if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) { - foreach ($info['matroska']['info'] as $key => $infoarray) { - if (isset($infoarray['Duration'])) { - // TimecodeScale is how many nanoseconds each Duration unit is - $info['playtime_seconds'] = $infoarray['Duration'] * ((isset($infoarray['TimecodeScale']) ? $infoarray['TimecodeScale'] : 1000000) / 1000000000); - break; - } - } - } - - // extract tags - if (isset($info['matroska']['tags']) && is_array($info['matroska']['tags'])) { - foreach ($info['matroska']['tags'] as $key => $infoarray) { - $this->ExtractCommentsSimpleTag($infoarray); - } - } - - // process tracks - if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) { - foreach ($info['matroska']['tracks']['tracks'] as $key => $trackarray) { - - $track_info = array(); - $track_info['dataformat'] = self::CodecIDtoCommonName($trackarray['CodecID']); - $track_info['default'] = (isset($trackarray['FlagDefault']) ? $trackarray['FlagDefault'] : true); - if (isset($trackarray['Name'])) { $track_info['name'] = $trackarray['Name']; } - - switch ($trackarray['TrackType']) { - - case 1: // Video - $track_info['resolution_x'] = $trackarray['PixelWidth']; - $track_info['resolution_y'] = $trackarray['PixelHeight']; - $track_info['display_unit'] = self::displayUnit(isset($trackarray['DisplayUnit']) ? $trackarray['DisplayUnit'] : 0); - $track_info['display_x'] = (isset($trackarray['DisplayWidth']) ? $trackarray['DisplayWidth'] : $trackarray['PixelWidth']); - $track_info['display_y'] = (isset($trackarray['DisplayHeight']) ? $trackarray['DisplayHeight'] : $trackarray['PixelHeight']); - - if (isset($trackarray['PixelCropBottom'])) { $track_info['crop_bottom'] = $trackarray['PixelCropBottom']; } - if (isset($trackarray['PixelCropTop'])) { $track_info['crop_top'] = $trackarray['PixelCropTop']; } - if (isset($trackarray['PixelCropLeft'])) { $track_info['crop_left'] = $trackarray['PixelCropLeft']; } - if (isset($trackarray['PixelCropRight'])) { $track_info['crop_right'] = $trackarray['PixelCropRight']; } - if (isset($trackarray['DefaultDuration'])) { $track_info['frame_rate'] = round(1000000000 / $trackarray['DefaultDuration'], 3); } - if (isset($trackarray['CodecName'])) { $track_info['codec'] = $trackarray['CodecName']; } - - switch ($trackarray['CodecID']) { - case 'V_MS/VFW/FOURCC': - getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); - - $parsed = getid3_riff::ParseBITMAPINFOHEADER($trackarray['CodecPrivate']); - $track_info['codec'] = getid3_riff::fourccLookup($parsed['fourcc']); - $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed; - break; - - /*case 'V_MPEG4/ISO/AVC': - $h264['profile'] = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 1, 1)); - $h264['level'] = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 3, 1)); - $rn = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 4, 1)); - $h264['NALUlength'] = ($rn & 3) + 1; - $rn = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], 5, 1)); - $nsps = ($rn & 31); - $offset = 6; - for ($i = 0; $i < $nsps; $i ++) { - $length = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2)); - $h264['SPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length); - $offset += 2 + $length; - } - $npps = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 1)); - $offset += 1; - for ($i = 0; $i < $npps; $i ++) { - $length = getid3_lib::BigEndian2Int(substr($trackarray['CodecPrivate'], $offset, 2)); - $h264['PPS'][] = substr($trackarray['CodecPrivate'], $offset + 2, $length); - $offset += 2 + $length; - } - $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $h264; - break;*/ - } - - $info['video']['streams'][] = $track_info; - break; - - case 2: // Audio - $track_info['sample_rate'] = (isset($trackarray['SamplingFrequency']) ? $trackarray['SamplingFrequency'] : 8000.0); - $track_info['channels'] = (isset($trackarray['Channels']) ? $trackarray['Channels'] : 1); - $track_info['language'] = (isset($trackarray['Language']) ? $trackarray['Language'] : 'eng'); - if (isset($trackarray['BitDepth'])) { $track_info['bits_per_sample'] = $trackarray['BitDepth']; } - if (isset($trackarray['CodecName'])) { $track_info['codec'] = $trackarray['CodecName']; } - - switch ($trackarray['CodecID']) { - case 'A_PCM/INT/LIT': - case 'A_PCM/INT/BIG': - $track_info['bitrate'] = $trackarray['SamplingFrequency'] * $trackarray['Channels'] * $trackarray['BitDepth']; - break; - - case 'A_AC3': - case 'A_DTS': - case 'A_MPEG/L3': - case 'A_MPEG/L2': - case 'A_FLAC': - getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.'.($track_info['dataformat'] == 'mp2' ? 'mp3' : $track_info['dataformat']).'.php', __FILE__, true); - - if (!isset($info['matroska']['track_data_offsets'][$trackarray['TrackNumber']])) { - $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because $info[matroska][track_data_offsets]['.$trackarray['TrackNumber'].'] not set'); - break; - } - - // create temp instance - $getid3_temp = new getID3(); - if ($track_info['dataformat'] != 'flac') { - $getid3_temp->openfile($this->getid3->filename); - } - $getid3_temp->info['avdataoffset'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset']; - if ($track_info['dataformat'][0] == 'm' || $track_info['dataformat'] == 'flac') { - $getid3_temp->info['avdataend'] = $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['offset'] + $info['matroska']['track_data_offsets'][$trackarray['TrackNumber']]['length']; - } - - // analyze - $class = 'getid3_'.($track_info['dataformat'] == 'mp2' ? 'mp3' : $track_info['dataformat']); - $header_data_key = $track_info['dataformat'][0] == 'm' ? 'mpeg' : $track_info['dataformat']; - $getid3_audio = new $class($getid3_temp, __CLASS__); - if ($track_info['dataformat'] == 'flac') { - $getid3_audio->AnalyzeString($trackarray['CodecPrivate']); - } - else { - $getid3_audio->Analyze(); - } - if (!empty($getid3_temp->info[$header_data_key])) { - $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info[$header_data_key]; - if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) { - foreach ($getid3_temp->info['audio'] as $key => $value) { - $track_info[$key] = $value; - } - } - } - else { - $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because '.$class.'::Analyze() failed at offset '.$getid3_temp->info['avdataoffset']); - } - - // copy errors and warnings - if (!empty($getid3_temp->info['error'])) { - foreach ($getid3_temp->info['error'] as $newerror) { - $this->warning($class.'() says: ['.$newerror.']'); - } - } - if (!empty($getid3_temp->info['warning'])) { - foreach ($getid3_temp->info['warning'] as $newerror) { - $this->warning($class.'() says: ['.$newerror.']'); - } - } - unset($getid3_temp, $getid3_audio); - break; - - case 'A_AAC': - case 'A_AAC/MPEG2/LC': - case 'A_AAC/MPEG2/LC/SBR': - case 'A_AAC/MPEG4/LC': - case 'A_AAC/MPEG4/LC/SBR': - $this->warning($trackarray['CodecID'].' audio data contains no header, audio/video bitrates can\'t be calculated'); - break; - - case 'A_VORBIS': - if (!isset($trackarray['CodecPrivate'])) { - $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data not set'); - break; - } - $vorbis_offset = strpos($trackarray['CodecPrivate'], 'vorbis', 1); - if ($vorbis_offset === false) { - $this->warning('Unable to parse audio data ['.basename(__FILE__).':'.__LINE__.'] because CodecPrivate data does not contain "vorbis" keyword'); - break; - } - $vorbis_offset -= 1; - - getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true); - - // create temp instance - $getid3_temp = new getID3(); - - // analyze - $getid3_ogg = new getid3_ogg($getid3_temp); - $oggpageinfo['page_seqno'] = 0; - $getid3_ogg->ParseVorbisPageHeader($trackarray['CodecPrivate'], $vorbis_offset, $oggpageinfo); - if (!empty($getid3_temp->info['ogg'])) { - $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $getid3_temp->info['ogg']; - if (isset($getid3_temp->info['audio']) && is_array($getid3_temp->info['audio'])) { - foreach ($getid3_temp->info['audio'] as $key => $value) { - $track_info[$key] = $value; - } - } - } - - // copy errors and warnings - if (!empty($getid3_temp->info['error'])) { - foreach ($getid3_temp->info['error'] as $newerror) { - $this->warning('getid3_ogg() says: ['.$newerror.']'); - } - } - if (!empty($getid3_temp->info['warning'])) { - foreach ($getid3_temp->info['warning'] as $newerror) { - $this->warning('getid3_ogg() says: ['.$newerror.']'); - } - } - - if (!empty($getid3_temp->info['ogg']['bitrate_nominal'])) { - $track_info['bitrate'] = $getid3_temp->info['ogg']['bitrate_nominal']; - } - unset($getid3_temp, $getid3_ogg, $oggpageinfo, $vorbis_offset); - break; - - case 'A_MS/ACM': - getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.riff.php', __FILE__, true); - - $parsed = getid3_riff::parseWAVEFORMATex($trackarray['CodecPrivate']); - foreach ($parsed as $key => $value) { - if ($key != 'raw') { - $track_info[$key] = $value; - } - } - $info['matroska']['track_codec_parsed'][$trackarray['TrackNumber']] = $parsed; - break; - - default: - $this->warning('Unhandled audio type "'.(isset($trackarray['CodecID']) ? $trackarray['CodecID'] : '').'"'); - } - - $info['audio']['streams'][] = $track_info; - break; - } - } - - if (!empty($info['video']['streams'])) { - $info['video'] = self::getDefaultStreamInfo($info['video']['streams']); - } - if (!empty($info['audio']['streams'])) { - $info['audio'] = self::getDefaultStreamInfo($info['audio']['streams']); - } - } - - // process attachments - if (isset($info['matroska']['attachments']) && $this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE) { - foreach ($info['matroska']['attachments'] as $i => $entry) { - if (strpos($entry['FileMimeType'], 'image/') === 0 && !empty($entry['FileData'])) { - $info['matroska']['comments']['picture'][] = array('data' => $entry['FileData'], 'image_mime' => $entry['FileMimeType'], 'filename' => $entry['FileName']); - } - } - } - - // determine mime type - if (!empty($info['video']['streams'])) { - $info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'video/webm' : 'video/x-matroska'); - } elseif (!empty($info['audio']['streams'])) { - $info['mime_type'] = ($info['matroska']['doctype'] == 'webm' ? 'audio/webm' : 'audio/x-matroska'); - } elseif (isset($info['mime_type'])) { - unset($info['mime_type']); - } - - return true; - } - - private function parseEBML(&$info) { - // http://www.matroska.org/technical/specs/index.html#EBMLBasics - $this->current_offset = $info['avdataoffset']; - - while ($this->getEBMLelement($top_element, $info['avdataend'])) { - switch ($top_element['id']) { - - case EBML_ID_EBML: - $info['matroska']['header']['offset'] = $top_element['offset']; - $info['matroska']['header']['length'] = $top_element['length']; - - while ($this->getEBMLelement($element_data, $top_element['end'], true)) { - switch ($element_data['id']) { - - case EBML_ID_EBMLVERSION: - case EBML_ID_EBMLREADVERSION: - case EBML_ID_EBMLMAXIDLENGTH: - case EBML_ID_EBMLMAXSIZELENGTH: - case EBML_ID_DOCTYPEVERSION: - case EBML_ID_DOCTYPEREADVERSION: - $element_data['data'] = getid3_lib::BigEndian2Int($element_data['data']); - break; - - case EBML_ID_DOCTYPE: - $element_data['data'] = getid3_lib::trimNullByte($element_data['data']); - $info['matroska']['doctype'] = $element_data['data']; - $info['fileformat'] = $element_data['data']; - break; - - default: - $this->unhandledElement('header', __LINE__, $element_data); - } - - unset($element_data['offset'], $element_data['end']); - $info['matroska']['header']['elements'][] = $element_data; - } - break; - - case EBML_ID_SEGMENT: - $info['matroska']['segment'][0]['offset'] = $top_element['offset']; - $info['matroska']['segment'][0]['length'] = $top_element['length']; - - while ($this->getEBMLelement($element_data, $top_element['end'])) { - if ($element_data['id'] != EBML_ID_CLUSTER || !self::$hide_clusters) { // collect clusters only if required - $info['matroska']['segments'][] = $element_data; - } - switch ($element_data['id']) { - - case EBML_ID_SEEKHEAD: // Contains the position of other level 1 elements. - - while ($this->getEBMLelement($seek_entry, $element_data['end'])) { - switch ($seek_entry['id']) { - - case EBML_ID_SEEK: // Contains a single seek entry to an EBML element - while ($this->getEBMLelement($sub_seek_entry, $seek_entry['end'], true)) { - - switch ($sub_seek_entry['id']) { - - case EBML_ID_SEEKID: - $seek_entry['target_id'] = self::EBML2Int($sub_seek_entry['data']); - $seek_entry['target_name'] = self::EBMLidName($seek_entry['target_id']); - break; - - case EBML_ID_SEEKPOSITION: - $seek_entry['target_offset'] = $element_data['offset'] + getid3_lib::BigEndian2Int($sub_seek_entry['data']); - break; - - default: - $this->unhandledElement('seekhead.seek', __LINE__, $sub_seek_entry); } - } - - if ($seek_entry['target_id'] != EBML_ID_CLUSTER || !self::$hide_clusters) { // collect clusters only if required - $info['matroska']['seek'][] = $seek_entry; - } - break; - - default: - $this->unhandledElement('seekhead', __LINE__, $seek_entry); - } - } - break; - - case EBML_ID_TRACKS: // A top-level block of information with many tracks described. - $info['matroska']['tracks'] = $element_data; - - while ($this->getEBMLelement($track_entry, $element_data['end'])) { - switch ($track_entry['id']) { - - case EBML_ID_TRACKENTRY: //subelements: Describes a track with all elements. - - while ($this->getEBMLelement($subelement, $track_entry['end'], array(EBML_ID_VIDEO, EBML_ID_AUDIO, EBML_ID_CONTENTENCODINGS, EBML_ID_CODECPRIVATE))) { - switch ($subelement['id']) { - - case EBML_ID_TRACKNUMBER: - case EBML_ID_TRACKUID: - case EBML_ID_TRACKTYPE: - case EBML_ID_MINCACHE: - case EBML_ID_MAXCACHE: - case EBML_ID_MAXBLOCKADDITIONID: - case EBML_ID_DEFAULTDURATION: // nanoseconds per frame - $track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); - break; - - case EBML_ID_TRACKTIMECODESCALE: - $track_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']); - break; - - case EBML_ID_CODECID: - case EBML_ID_LANGUAGE: - case EBML_ID_NAME: - case EBML_ID_CODECNAME: - $track_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']); - break; - - case EBML_ID_CODECPRIVATE: - $track_entry[$subelement['id_name']] = $this->readEBMLelementData($subelement['length'], true); - break; - - case EBML_ID_FLAGENABLED: - case EBML_ID_FLAGDEFAULT: - case EBML_ID_FLAGFORCED: - case EBML_ID_FLAGLACING: - case EBML_ID_CODECDECODEALL: - $track_entry[$subelement['id_name']] = (bool) getid3_lib::BigEndian2Int($subelement['data']); - break; - - case EBML_ID_VIDEO: - - while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { - switch ($sub_subelement['id']) { - - case EBML_ID_PIXELWIDTH: - case EBML_ID_PIXELHEIGHT: - case EBML_ID_PIXELCROPBOTTOM: - case EBML_ID_PIXELCROPTOP: - case EBML_ID_PIXELCROPLEFT: - case EBML_ID_PIXELCROPRIGHT: - case EBML_ID_DISPLAYWIDTH: - case EBML_ID_DISPLAYHEIGHT: - case EBML_ID_DISPLAYUNIT: - case EBML_ID_ASPECTRATIOTYPE: - case EBML_ID_STEREOMODE: - case EBML_ID_OLDSTEREOMODE: - $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); - break; - - case EBML_ID_FLAGINTERLACED: - $track_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']); - break; - - case EBML_ID_GAMMAVALUE: - $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']); - break; - - case EBML_ID_COLOURSPACE: - $track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); - break; - - default: - $this->unhandledElement('track.video', __LINE__, $sub_subelement); - } - } - break; - - case EBML_ID_AUDIO: - - while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { - switch ($sub_subelement['id']) { - - case EBML_ID_CHANNELS: - case EBML_ID_BITDEPTH: - $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); - break; - - case EBML_ID_SAMPLINGFREQUENCY: - case EBML_ID_OUTPUTSAMPLINGFREQUENCY: - $track_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Float($sub_subelement['data']); - break; - - case EBML_ID_CHANNELPOSITIONS: - $track_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); - break; - - default: - $this->unhandledElement('track.audio', __LINE__, $sub_subelement); - } - } - break; - - case EBML_ID_CONTENTENCODINGS: - - while ($this->getEBMLelement($sub_subelement, $subelement['end'])) { - switch ($sub_subelement['id']) { - - case EBML_ID_CONTENTENCODING: - - while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CONTENTCOMPRESSION, EBML_ID_CONTENTENCRYPTION))) { - switch ($sub_sub_subelement['id']) { - - case EBML_ID_CONTENTENCODINGORDER: - case EBML_ID_CONTENTENCODINGSCOPE: - case EBML_ID_CONTENTENCODINGTYPE: - $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); - break; - - case EBML_ID_CONTENTCOMPRESSION: - - while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { - switch ($sub_sub_sub_subelement['id']) { - - case EBML_ID_CONTENTCOMPALGO: - $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']); - break; - - case EBML_ID_CONTENTCOMPSETTINGS: - $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data']; - break; - - default: - $this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement); - } - } - break; - - case EBML_ID_CONTENTENCRYPTION: - - while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { - switch ($sub_sub_sub_subelement['id']) { - - case EBML_ID_CONTENTENCALGO: - case EBML_ID_CONTENTSIGALGO: - case EBML_ID_CONTENTSIGHASHALGO: - $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']); - break; - - case EBML_ID_CONTENTENCKEYID: - case EBML_ID_CONTENTSIGNATURE: - case EBML_ID_CONTENTSIGKEYID: - $track_entry[$sub_subelement['id_name']][$sub_sub_subelement['id_name']][$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data']; - break; - - default: - $this->unhandledElement('track.contentencodings.contentencoding.contentcompression', __LINE__, $sub_sub_sub_subelement); - } - } - break; - - default: - $this->unhandledElement('track.contentencodings.contentencoding', __LINE__, $sub_sub_subelement); - } - } - break; - - default: - $this->unhandledElement('track.contentencodings', __LINE__, $sub_subelement); - } - } - break; - - default: - $this->unhandledElement('track', __LINE__, $subelement); - } - } - - $info['matroska']['tracks']['tracks'][] = $track_entry; - break; - - default: - $this->unhandledElement('tracks', __LINE__, $track_entry); - } - } - break; - - case EBML_ID_INFO: // Contains miscellaneous general information and statistics on the file. - $info_entry = array(); - - while ($this->getEBMLelement($subelement, $element_data['end'], true)) { - switch ($subelement['id']) { - - case EBML_ID_TIMECODESCALE: - $info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); - break; - - case EBML_ID_DURATION: - $info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Float($subelement['data']); - break; - - case EBML_ID_DATEUTC: - $info_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); - $info_entry[$subelement['id_name'].'_unix'] = self::EBMLdate2unix($info_entry[$subelement['id_name']]); - break; - - case EBML_ID_SEGMENTUID: - case EBML_ID_PREVUID: - case EBML_ID_NEXTUID: - $info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']); - break; - - case EBML_ID_SEGMENTFAMILY: - $info_entry[$subelement['id_name']][] = getid3_lib::trimNullByte($subelement['data']); - break; - - case EBML_ID_SEGMENTFILENAME: - case EBML_ID_PREVFILENAME: - case EBML_ID_NEXTFILENAME: - case EBML_ID_TITLE: - case EBML_ID_MUXINGAPP: - case EBML_ID_WRITINGAPP: - $info_entry[$subelement['id_name']] = getid3_lib::trimNullByte($subelement['data']); - $info['matroska']['comments'][strtolower($subelement['id_name'])][] = $info_entry[$subelement['id_name']]; - break; - - case EBML_ID_CHAPTERTRANSLATE: - $chaptertranslate_entry = array(); - - while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { - switch ($sub_subelement['id']) { - - case EBML_ID_CHAPTERTRANSLATEEDITIONUID: - $chaptertranslate_entry[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data']); - break; - - case EBML_ID_CHAPTERTRANSLATECODEC: - $chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); - break; - - case EBML_ID_CHAPTERTRANSLATEID: - $chaptertranslate_entry[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); - break; - - default: - $this->unhandledElement('info.chaptertranslate', __LINE__, $sub_subelement); - } - } - $info_entry[$subelement['id_name']] = $chaptertranslate_entry; - break; - - default: - $this->unhandledElement('info', __LINE__, $subelement); - } - } - $info['matroska']['info'][] = $info_entry; - break; - - case EBML_ID_CUES: // A top-level element to speed seeking access. All entries are local to the segment. Should be mandatory for non "live" streams. - if (self::$hide_clusters) { // do not parse cues if hide clusters is "ON" till they point to clusters anyway - $this->current_offset = $element_data['end']; - break; - } - $cues_entry = array(); - - while ($this->getEBMLelement($subelement, $element_data['end'])) { - switch ($subelement['id']) { - - case EBML_ID_CUEPOINT: - $cuepoint_entry = array(); - - while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CUETRACKPOSITIONS))) { - switch ($sub_subelement['id']) { - - case EBML_ID_CUETRACKPOSITIONS: - $cuetrackpositions_entry = array(); - - while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) { - switch ($sub_sub_subelement['id']) { - - case EBML_ID_CUETRACK: - case EBML_ID_CUECLUSTERPOSITION: - case EBML_ID_CUEBLOCKNUMBER: - case EBML_ID_CUECODECSTATE: - $cuetrackpositions_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); - break; - - default: - $this->unhandledElement('cues.cuepoint.cuetrackpositions', __LINE__, $sub_sub_subelement); - } - } - $cuepoint_entry[$sub_subelement['id_name']][] = $cuetrackpositions_entry; - break; - - case EBML_ID_CUETIME: - $cuepoint_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); - break; - - default: - $this->unhandledElement('cues.cuepoint', __LINE__, $sub_subelement); - } - } - $cues_entry[] = $cuepoint_entry; - break; - - default: - $this->unhandledElement('cues', __LINE__, $subelement); - } - } - $info['matroska']['cues'] = $cues_entry; - break; - - case EBML_ID_TAGS: // Element containing elements specific to Tracks/Chapters. - $tags_entry = array(); - - while ($this->getEBMLelement($subelement, $element_data['end'], false)) { - switch ($subelement['id']) { - - case EBML_ID_TAG: - $tag_entry = array(); - - while ($this->getEBMLelement($sub_subelement, $subelement['end'], false)) { - switch ($sub_subelement['id']) { - - case EBML_ID_TARGETS: - $targets_entry = array(); - - while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], true)) { - switch ($sub_sub_subelement['id']) { - - case EBML_ID_TARGETTYPEVALUE: - $targets_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); - $targets_entry[strtolower($sub_sub_subelement['id_name']).'_long'] = self::TargetTypeValue($targets_entry[$sub_sub_subelement['id_name']]); - break; - - case EBML_ID_TARGETTYPE: - $targets_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data']; - break; - - case EBML_ID_TAGTRACKUID: - case EBML_ID_TAGEDITIONUID: - case EBML_ID_TAGCHAPTERUID: - case EBML_ID_TAGATTACHMENTUID: - $targets_entry[$sub_sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); - break; - - default: - $this->unhandledElement('tags.tag.targets', __LINE__, $sub_sub_subelement); - } - } - $tag_entry[$sub_subelement['id_name']] = $targets_entry; - break; - - case EBML_ID_SIMPLETAG: - $tag_entry[$sub_subelement['id_name']][] = $this->HandleEMBLSimpleTag($sub_subelement['end']); - break; - - default: - $this->unhandledElement('tags.tag', __LINE__, $sub_subelement); - } - } - $tags_entry[] = $tag_entry; - break; - - default: - $this->unhandledElement('tags', __LINE__, $subelement); - } - } - $info['matroska']['tags'] = $tags_entry; - break; - - case EBML_ID_ATTACHMENTS: // Contain attached files. - - while ($this->getEBMLelement($subelement, $element_data['end'])) { - switch ($subelement['id']) { - - case EBML_ID_ATTACHEDFILE: - $attachedfile_entry = array(); - - while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_FILEDATA))) { - switch ($sub_subelement['id']) { - - case EBML_ID_FILEDESCRIPTION: - case EBML_ID_FILENAME: - case EBML_ID_FILEMIMETYPE: - $attachedfile_entry[$sub_subelement['id_name']] = $sub_subelement['data']; - break; - - case EBML_ID_FILEDATA: - $attachedfile_entry['data_offset'] = $this->current_offset; - $attachedfile_entry['data_length'] = $sub_subelement['length']; - - $attachedfile_entry[$sub_subelement['id_name']] = $this->saveAttachment( - $attachedfile_entry['FileName'], - $attachedfile_entry['data_offset'], - $attachedfile_entry['data_length']); - - $this->current_offset = $sub_subelement['end']; - break; - - case EBML_ID_FILEUID: - $attachedfile_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); - break; - - default: - $this->unhandledElement('attachments.attachedfile', __LINE__, $sub_subelement); - } - } - $info['matroska']['attachments'][] = $attachedfile_entry; - break; - - default: - $this->unhandledElement('attachments', __LINE__, $subelement); - } - } - break; - - case EBML_ID_CHAPTERS: - - while ($this->getEBMLelement($subelement, $element_data['end'])) { - switch ($subelement['id']) { - - case EBML_ID_EDITIONENTRY: - $editionentry_entry = array(); - - while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CHAPTERATOM))) { - switch ($sub_subelement['id']) { - - case EBML_ID_EDITIONUID: - $editionentry_entry[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); - break; - - case EBML_ID_EDITIONFLAGHIDDEN: - case EBML_ID_EDITIONFLAGDEFAULT: - case EBML_ID_EDITIONFLAGORDERED: - $editionentry_entry[$sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_subelement['data']); - break; - - case EBML_ID_CHAPTERATOM: - $chapteratom_entry = array(); - - while ($this->getEBMLelement($sub_sub_subelement, $sub_subelement['end'], array(EBML_ID_CHAPTERTRACK, EBML_ID_CHAPTERDISPLAY))) { - switch ($sub_sub_subelement['id']) { - - case EBML_ID_CHAPTERSEGMENTUID: - case EBML_ID_CHAPTERSEGMENTEDITIONUID: - $chapteratom_entry[$sub_sub_subelement['id_name']] = $sub_sub_subelement['data']; - break; - - case EBML_ID_CHAPTERFLAGENABLED: - case EBML_ID_CHAPTERFLAGHIDDEN: - $chapteratom_entry[$sub_sub_subelement['id_name']] = (bool)getid3_lib::BigEndian2Int($sub_sub_subelement['data']); - break; - - case EBML_ID_CHAPTERUID: - case EBML_ID_CHAPTERTIMESTART: - case EBML_ID_CHAPTERTIMEEND: - $chapteratom_entry[$sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_subelement['data']); - break; - - case EBML_ID_CHAPTERTRACK: - $chaptertrack_entry = array(); - - while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { - switch ($sub_sub_sub_subelement['id']) { - - case EBML_ID_CHAPTERTRACKNUMBER: - $chaptertrack_entry[$sub_sub_sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_sub_sub_subelement['data']); - break; - - default: - $this->unhandledElement('chapters.editionentry.chapteratom.chaptertrack', __LINE__, $sub_sub_sub_subelement); - } - } - $chapteratom_entry[$sub_sub_subelement['id_name']][] = $chaptertrack_entry; - break; - - case EBML_ID_CHAPTERDISPLAY: - $chapterdisplay_entry = array(); - - while ($this->getEBMLelement($sub_sub_sub_subelement, $sub_sub_subelement['end'], true)) { - switch ($sub_sub_sub_subelement['id']) { - - case EBML_ID_CHAPSTRING: - case EBML_ID_CHAPLANGUAGE: - case EBML_ID_CHAPCOUNTRY: - $chapterdisplay_entry[$sub_sub_sub_subelement['id_name']] = $sub_sub_sub_subelement['data']; - break; - - default: - $this->unhandledElement('chapters.editionentry.chapteratom.chapterdisplay', __LINE__, $sub_sub_sub_subelement); - } - } - $chapteratom_entry[$sub_sub_subelement['id_name']][] = $chapterdisplay_entry; - break; - - default: - $this->unhandledElement('chapters.editionentry.chapteratom', __LINE__, $sub_sub_subelement); - } - } - $editionentry_entry[$sub_subelement['id_name']][] = $chapteratom_entry; - break; - - default: - $this->unhandledElement('chapters.editionentry', __LINE__, $sub_subelement); - } - } - $info['matroska']['chapters'][] = $editionentry_entry; - break; - - default: - $this->unhandledElement('chapters', __LINE__, $subelement); - } - } - break; - - case EBML_ID_CLUSTER: // The lower level element containing the (monolithic) Block structure. - $cluster_entry = array(); - - while ($this->getEBMLelement($subelement, $element_data['end'], array(EBML_ID_CLUSTERSILENTTRACKS, EBML_ID_CLUSTERBLOCKGROUP, EBML_ID_CLUSTERSIMPLEBLOCK))) { - switch ($subelement['id']) { - - case EBML_ID_CLUSTERTIMECODE: - case EBML_ID_CLUSTERPOSITION: - case EBML_ID_CLUSTERPREVSIZE: - $cluster_entry[$subelement['id_name']] = getid3_lib::BigEndian2Int($subelement['data']); - break; - - case EBML_ID_CLUSTERSILENTTRACKS: - $cluster_silent_tracks = array(); - - while ($this->getEBMLelement($sub_subelement, $subelement['end'], true)) { - switch ($sub_subelement['id']) { - - case EBML_ID_CLUSTERSILENTTRACKNUMBER: - $cluster_silent_tracks[] = getid3_lib::BigEndian2Int($sub_subelement['data']); - break; - - default: - $this->unhandledElement('cluster.silenttracks', __LINE__, $sub_subelement); - } - } - $cluster_entry[$subelement['id_name']][] = $cluster_silent_tracks; - break; - - case EBML_ID_CLUSTERBLOCKGROUP: - $cluster_block_group = array('offset' => $this->current_offset); - - while ($this->getEBMLelement($sub_subelement, $subelement['end'], array(EBML_ID_CLUSTERBLOCK))) { - switch ($sub_subelement['id']) { - - case EBML_ID_CLUSTERBLOCK: - $cluster_block_group[$sub_subelement['id_name']] = $this->HandleEMBLClusterBlock($sub_subelement, EBML_ID_CLUSTERBLOCK, $info); - break; - - case EBML_ID_CLUSTERREFERENCEPRIORITY: // unsigned-int - case EBML_ID_CLUSTERBLOCKDURATION: // unsigned-int - $cluster_block_group[$sub_subelement['id_name']] = getid3_lib::BigEndian2Int($sub_subelement['data']); - break; - - case EBML_ID_CLUSTERREFERENCEBLOCK: // signed-int - $cluster_block_group[$sub_subelement['id_name']][] = getid3_lib::BigEndian2Int($sub_subelement['data'], false, true); - break; - - case EBML_ID_CLUSTERCODECSTATE: - $cluster_block_group[$sub_subelement['id_name']] = getid3_lib::trimNullByte($sub_subelement['data']); - break; - - default: - $this->unhandledElement('clusters.blockgroup', __LINE__, $sub_subelement); - } - } - $cluster_entry[$subelement['id_name']][] = $cluster_block_group; - break; - - case EBML_ID_CLUSTERSIMPLEBLOCK: - $cluster_entry[$subelement['id_name']][] = $this->HandleEMBLClusterBlock($subelement, EBML_ID_CLUSTERSIMPLEBLOCK, $info); - break; - - default: - $this->unhandledElement('cluster', __LINE__, $subelement); - } - $this->current_offset = $subelement['end']; - } - if (!self::$hide_clusters) { - $info['matroska']['cluster'][] = $cluster_entry; - } - - // check to see if all the data we need exists already, if so, break out of the loop - if (!self::$parse_whole_file) { - if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) { - if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) { - if (count($info['matroska']['track_data_offsets']) == count($info['matroska']['tracks']['tracks'])) { - return; - } - } - } - } - break; - - default: - $this->unhandledElement('segment', __LINE__, $element_data); - } - } - break; - - default: - $this->unhandledElement('root', __LINE__, $top_element); - } - } - } - - private function EnsureBufferHasEnoughData($min_data=1024) { - if (($this->current_offset - $this->EBMLbuffer_offset) >= ($this->EBMLbuffer_length - $min_data)) { - $read_bytes = max($min_data, $this->getid3->fread_buffer_size()); - - try { - $this->fseek($this->current_offset); - $this->EBMLbuffer_offset = $this->current_offset; - $this->EBMLbuffer = $this->fread($read_bytes); - $this->EBMLbuffer_length = strlen($this->EBMLbuffer); - } catch (getid3_exception $e) { - $this->warning('EBML parser: '.$e->getMessage()); - return false; - } - - if ($this->EBMLbuffer_length == 0 && $this->feof()) { - return $this->error('EBML parser: ran out of file at offset '.$this->current_offset); - } - } - return true; - } - - private function readEBMLint() { - $actual_offset = $this->current_offset - $this->EBMLbuffer_offset; - - // get length of integer - $first_byte_int = ord($this->EBMLbuffer[$actual_offset]); - if (0x80 & $first_byte_int) { - $length = 1; - } elseif (0x40 & $first_byte_int) { - $length = 2; - } elseif (0x20 & $first_byte_int) { - $length = 3; - } elseif (0x10 & $first_byte_int) { - $length = 4; - } elseif (0x08 & $first_byte_int) { - $length = 5; - } elseif (0x04 & $first_byte_int) { - $length = 6; - } elseif (0x02 & $first_byte_int) { - $length = 7; - } elseif (0x01 & $first_byte_int) { - $length = 8; - } else { - throw new Exception('invalid EBML integer (leading 0x00) at '.$this->current_offset); - } - - // read - $int_value = self::EBML2Int(substr($this->EBMLbuffer, $actual_offset, $length)); - $this->current_offset += $length; - - return $int_value; - } - - private function readEBMLelementData($length, $check_buffer=false) { - if ($check_buffer && !$this->EnsureBufferHasEnoughData($length)) { - return false; - } - $data = substr($this->EBMLbuffer, $this->current_offset - $this->EBMLbuffer_offset, $length); - $this->current_offset += $length; - return $data; - } - - private function getEBMLelement(&$element, $parent_end, $get_data=false) { - if ($this->current_offset >= $parent_end) { - return false; - } - - if (!$this->EnsureBufferHasEnoughData()) { - $this->current_offset = PHP_INT_MAX; // do not exit parser right now, allow to finish current loop to gather maximum information - return false; - } - - $element = array(); - - // set offset - $element['offset'] = $this->current_offset; - - // get ID - $element['id'] = $this->readEBMLint(); - - // get name - $element['id_name'] = self::EBMLidName($element['id']); - - // get length - $element['length'] = $this->readEBMLint(); - - // get end offset - $element['end'] = $this->current_offset + $element['length']; - - // get raw data - $dont_parse = (in_array($element['id'], $this->unuseful_elements) || $element['id_name'] == dechex($element['id'])); - if (($get_data === true || (is_array($get_data) && !in_array($element['id'], $get_data))) && !$dont_parse) { - $element['data'] = $this->readEBMLelementData($element['length'], $element); - } - - return true; - } - - private function unhandledElement($type, $line, $element) { - // warn only about unknown and missed elements, not about unuseful - if (!in_array($element['id'], $this->unuseful_elements)) { - $this->warning('Unhandled '.$type.' element ['.basename(__FILE__).':'.$line.'] ('.$element['id'].'::'.$element['id_name'].' ['.$element['length'].' bytes]) at '.$element['offset']); - } - - // increase offset for unparsed elements - if (!isset($element['data'])) { - $this->current_offset = $element['end']; - } - } - - private function ExtractCommentsSimpleTag($SimpleTagArray) { - if (!empty($SimpleTagArray['SimpleTag'])) { - foreach ($SimpleTagArray['SimpleTag'] as $SimpleTagKey => $SimpleTagData) { - if (!empty($SimpleTagData['TagName']) && !empty($SimpleTagData['TagString'])) { - $this->getid3->info['matroska']['comments'][strtolower($SimpleTagData['TagName'])][] = $SimpleTagData['TagString']; - } - if (!empty($SimpleTagData['SimpleTag'])) { - $this->ExtractCommentsSimpleTag($SimpleTagData); - } - } - } - - return true; - } - - private function HandleEMBLSimpleTag($parent_end) { - $simpletag_entry = array(); - - while ($this->getEBMLelement($element, $parent_end, array(EBML_ID_SIMPLETAG))) { - switch ($element['id']) { - - case EBML_ID_TAGNAME: - case EBML_ID_TAGLANGUAGE: - case EBML_ID_TAGSTRING: - case EBML_ID_TAGBINARY: - $simpletag_entry[$element['id_name']] = $element['data']; - break; - - case EBML_ID_SIMPLETAG: - $simpletag_entry[$element['id_name']][] = $this->HandleEMBLSimpleTag($element['end']); - break; - - case EBML_ID_TAGDEFAULT: - $simpletag_entry[$element['id_name']] = (bool)getid3_lib::BigEndian2Int($element['data']); - break; - - default: - $this->unhandledElement('tag.simpletag', __LINE__, $element); - } - } - - return $simpletag_entry; - } - - private function HandleEMBLClusterBlock($element, $block_type, &$info) { - // http://www.matroska.org/technical/specs/index.html#block_structure - // http://www.matroska.org/technical/specs/index.html#simpleblock_structure - - $block_data = array(); - $block_data['tracknumber'] = $this->readEBMLint(); - $block_data['timecode'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(2), false, true); - $block_data['flags_raw'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)); - - if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) { - $block_data['flags']['keyframe'] = (($block_data['flags_raw'] & 0x80) >> 7); - //$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0x70) >> 4); - } - else { - //$block_data['flags']['reserved1'] = (($block_data['flags_raw'] & 0xF0) >> 4); - } - $block_data['flags']['invisible'] = (bool)(($block_data['flags_raw'] & 0x08) >> 3); - $block_data['flags']['lacing'] = (($block_data['flags_raw'] & 0x06) >> 1); // 00=no lacing; 01=Xiph lacing; 11=EBML lacing; 10=fixed-size lacing - if ($block_type == EBML_ID_CLUSTERSIMPLEBLOCK) { - $block_data['flags']['discardable'] = (($block_data['flags_raw'] & 0x01)); - } - else { - //$block_data['flags']['reserved2'] = (($block_data['flags_raw'] & 0x01) >> 0); - } - $block_data['flags']['lacing_type'] = self::BlockLacingType($block_data['flags']['lacing']); - - // Lace (when lacing bit is set) - if ($block_data['flags']['lacing'] > 0) { - $block_data['lace_frames'] = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)) + 1; // Number of frames in the lace-1 (uint8) - if ($block_data['flags']['lacing'] != 0x02) { - for ($i = 1; $i < $block_data['lace_frames']; $i ++) { // Lace-coded size of each frame of the lace, except for the last one (multiple uint8). *This is not used with Fixed-size lacing as it is calculated automatically from (total size of lace) / (number of frames in lace). - if ($block_data['flags']['lacing'] == 0x03) { // EBML lacing - $block_data['lace_frames_size'][$i] = $this->readEBMLint(); // TODO: read size correctly, calc size for the last frame. For now offsets are deteminded OK with readEBMLint() and that's the most important thing. - } - else { // Xiph lacing - $block_data['lace_frames_size'][$i] = 0; - do { - $size = getid3_lib::BigEndian2Int($this->readEBMLelementData(1)); - $block_data['lace_frames_size'][$i] += $size; - } - while ($size == 255); - } - } - if ($block_data['flags']['lacing'] == 0x01) { // calc size of the last frame only for Xiph lacing, till EBML sizes are now anyway determined incorrectly - $block_data['lace_frames_size'][] = $element['end'] - $this->current_offset - array_sum($block_data['lace_frames_size']); - } - } - } - - if (!isset($info['matroska']['track_data_offsets'][$block_data['tracknumber']])) { - $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['offset'] = $this->current_offset; - $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length'] = $element['end'] - $this->current_offset; - //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] = 0; - } - //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['total_length'] += $info['matroska']['track_data_offsets'][$block_data['tracknumber']]['length']; - //$info['matroska']['track_data_offsets'][$block_data['tracknumber']]['duration'] = $block_data['timecode'] * ((isset($info['matroska']['info'][0]['TimecodeScale']) ? $info['matroska']['info'][0]['TimecodeScale'] : 1000000) / 1000000000); - - // set offset manually - $this->current_offset = $element['end']; - - return $block_data; - } - - private static function EBML2Int($EBMLstring) { - // http://matroska.org/specs/ - - // Element ID coded with an UTF-8 like system: - // 1xxx xxxx - Class A IDs (2^7 -2 possible values) (base 0x8X) - // 01xx xxxx xxxx xxxx - Class B IDs (2^14-2 possible values) (base 0x4X 0xXX) - // 001x xxxx xxxx xxxx xxxx xxxx - Class C IDs (2^21-2 possible values) (base 0x2X 0xXX 0xXX) - // 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx - Class D IDs (2^28-2 possible values) (base 0x1X 0xXX 0xXX 0xXX) - // Values with all x at 0 and 1 are reserved (hence the -2). - - // Data size, in octets, is also coded with an UTF-8 like system : - // 1xxx xxxx - value 0 to 2^7-2 - // 01xx xxxx xxxx xxxx - value 0 to 2^14-2 - // 001x xxxx xxxx xxxx xxxx xxxx - value 0 to 2^21-2 - // 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^28-2 - // 0000 1xxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^35-2 - // 0000 01xx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^42-2 - // 0000 001x xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^49-2 - // 0000 0001 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx - value 0 to 2^56-2 - - $first_byte_int = ord($EBMLstring[0]); - if (0x80 & $first_byte_int) { - $EBMLstring[0] = chr($first_byte_int & 0x7F); - } elseif (0x40 & $first_byte_int) { - $EBMLstring[0] = chr($first_byte_int & 0x3F); - } elseif (0x20 & $first_byte_int) { - $EBMLstring[0] = chr($first_byte_int & 0x1F); - } elseif (0x10 & $first_byte_int) { - $EBMLstring[0] = chr($first_byte_int & 0x0F); - } elseif (0x08 & $first_byte_int) { - $EBMLstring[0] = chr($first_byte_int & 0x07); - } elseif (0x04 & $first_byte_int) { - $EBMLstring[0] = chr($first_byte_int & 0x03); - } elseif (0x02 & $first_byte_int) { - $EBMLstring[0] = chr($first_byte_int & 0x01); - } elseif (0x01 & $first_byte_int) { - $EBMLstring[0] = chr($first_byte_int & 0x00); - } - - return getid3_lib::BigEndian2Int($EBMLstring); - } - - private static function EBMLdate2unix($EBMLdatestamp) { - // Date - signed 8 octets integer in nanoseconds with 0 indicating the precise beginning of the millennium (at 2001-01-01T00:00:00,000000000 UTC) - // 978307200 == mktime(0, 0, 0, 1, 1, 2001) == January 1, 2001 12:00:00am UTC - return round(($EBMLdatestamp / 1000000000) + 978307200); - } - - public static function TargetTypeValue($target_type) { - // http://www.matroska.org/technical/specs/tagging/index.html - static $TargetTypeValue = array(); - if (empty($TargetTypeValue)) { - $TargetTypeValue[10] = 'A: ~ V:shot'; // the lowest hierarchy found in music or movies - $TargetTypeValue[20] = 'A:subtrack/part/movement ~ V:scene'; // corresponds to parts of a track for audio (like a movement) - $TargetTypeValue[30] = 'A:track/song ~ V:chapter'; // the common parts of an album or a movie - $TargetTypeValue[40] = 'A:part/session ~ V:part/session'; // when an album or episode has different logical parts - $TargetTypeValue[50] = 'A:album/opera/concert ~ V:movie/episode/concert'; // the most common grouping level of music and video (equals to an episode for TV series) - $TargetTypeValue[60] = 'A:edition/issue/volume/opus ~ V:season/sequel/volume'; // a list of lower levels grouped together - $TargetTypeValue[70] = 'A:collection ~ V:collection'; // the high hierarchy consisting of many different lower items - } - return (isset($TargetTypeValue[$target_type]) ? $TargetTypeValue[$target_type] : $target_type); - } - - public static function BlockLacingType($lacingtype) { - // http://matroska.org/technical/specs/index.html#block_structure - static $BlockLacingType = array(); - if (empty($BlockLacingType)) { - $BlockLacingType[0x00] = 'no lacing'; - $BlockLacingType[0x01] = 'Xiph lacing'; - $BlockLacingType[0x02] = 'fixed-size lacing'; - $BlockLacingType[0x03] = 'EBML lacing'; - } - return (isset($BlockLacingType[$lacingtype]) ? $BlockLacingType[$lacingtype] : $lacingtype); - } - - public static function CodecIDtoCommonName($codecid) { - // http://www.matroska.org/technical/specs/codecid/index.html - static $CodecIDlist = array(); - if (empty($CodecIDlist)) { - $CodecIDlist['A_AAC'] = 'aac'; - $CodecIDlist['A_AAC/MPEG2/LC'] = 'aac'; - $CodecIDlist['A_AC3'] = 'ac3'; - $CodecIDlist['A_DTS'] = 'dts'; - $CodecIDlist['A_FLAC'] = 'flac'; - $CodecIDlist['A_MPEG/L1'] = 'mp1'; - $CodecIDlist['A_MPEG/L2'] = 'mp2'; - $CodecIDlist['A_MPEG/L3'] = 'mp3'; - $CodecIDlist['A_PCM/INT/LIT'] = 'pcm'; // PCM Integer Little Endian - $CodecIDlist['A_PCM/INT/BIG'] = 'pcm'; // PCM Integer Big Endian - $CodecIDlist['A_QUICKTIME/QDMC'] = 'quicktime'; // Quicktime: QDesign Music - $CodecIDlist['A_QUICKTIME/QDM2'] = 'quicktime'; // Quicktime: QDesign Music v2 - $CodecIDlist['A_VORBIS'] = 'vorbis'; - $CodecIDlist['V_MPEG1'] = 'mpeg'; - $CodecIDlist['V_THEORA'] = 'theora'; - $CodecIDlist['V_REAL/RV40'] = 'real'; - $CodecIDlist['V_REAL/RV10'] = 'real'; - $CodecIDlist['V_REAL/RV20'] = 'real'; - $CodecIDlist['V_REAL/RV30'] = 'real'; - $CodecIDlist['V_QUICKTIME'] = 'quicktime'; // Quicktime - $CodecIDlist['V_MPEG4/ISO/AP'] = 'mpeg4'; - $CodecIDlist['V_MPEG4/ISO/ASP'] = 'mpeg4'; - $CodecIDlist['V_MPEG4/ISO/AVC'] = 'h264'; - $CodecIDlist['V_MPEG4/ISO/SP'] = 'mpeg4'; - $CodecIDlist['V_VP8'] = 'vp8'; - $CodecIDlist['V_MS/VFW/FOURCC'] = 'vcm'; // Microsoft (TM) Video Codec Manager (VCM) - $CodecIDlist['A_MS/ACM'] = 'acm'; // Microsoft (TM) Audio Codec Manager (ACM) - } - return (isset($CodecIDlist[$codecid]) ? $CodecIDlist[$codecid] : $codecid); - } - - private static function EBMLidName($value) { - static $EBMLidList = array(); - if (empty($EBMLidList)) { - $EBMLidList[EBML_ID_ASPECTRATIOTYPE] = 'AspectRatioType'; - $EBMLidList[EBML_ID_ATTACHEDFILE] = 'AttachedFile'; - $EBMLidList[EBML_ID_ATTACHMENTLINK] = 'AttachmentLink'; - $EBMLidList[EBML_ID_ATTACHMENTS] = 'Attachments'; - $EBMLidList[EBML_ID_AUDIO] = 'Audio'; - $EBMLidList[EBML_ID_BITDEPTH] = 'BitDepth'; - $EBMLidList[EBML_ID_CHANNELPOSITIONS] = 'ChannelPositions'; - $EBMLidList[EBML_ID_CHANNELS] = 'Channels'; - $EBMLidList[EBML_ID_CHAPCOUNTRY] = 'ChapCountry'; - $EBMLidList[EBML_ID_CHAPLANGUAGE] = 'ChapLanguage'; - $EBMLidList[EBML_ID_CHAPPROCESS] = 'ChapProcess'; - $EBMLidList[EBML_ID_CHAPPROCESSCODECID] = 'ChapProcessCodecID'; - $EBMLidList[EBML_ID_CHAPPROCESSCOMMAND] = 'ChapProcessCommand'; - $EBMLidList[EBML_ID_CHAPPROCESSDATA] = 'ChapProcessData'; - $EBMLidList[EBML_ID_CHAPPROCESSPRIVATE] = 'ChapProcessPrivate'; - $EBMLidList[EBML_ID_CHAPPROCESSTIME] = 'ChapProcessTime'; - $EBMLidList[EBML_ID_CHAPSTRING] = 'ChapString'; - $EBMLidList[EBML_ID_CHAPTERATOM] = 'ChapterAtom'; - $EBMLidList[EBML_ID_CHAPTERDISPLAY] = 'ChapterDisplay'; - $EBMLidList[EBML_ID_CHAPTERFLAGENABLED] = 'ChapterFlagEnabled'; - $EBMLidList[EBML_ID_CHAPTERFLAGHIDDEN] = 'ChapterFlagHidden'; - $EBMLidList[EBML_ID_CHAPTERPHYSICALEQUIV] = 'ChapterPhysicalEquiv'; - $EBMLidList[EBML_ID_CHAPTERS] = 'Chapters'; - $EBMLidList[EBML_ID_CHAPTERSEGMENTEDITIONUID] = 'ChapterSegmentEditionUID'; - $EBMLidList[EBML_ID_CHAPTERSEGMENTUID] = 'ChapterSegmentUID'; - $EBMLidList[EBML_ID_CHAPTERTIMEEND] = 'ChapterTimeEnd'; - $EBMLidList[EBML_ID_CHAPTERTIMESTART] = 'ChapterTimeStart'; - $EBMLidList[EBML_ID_CHAPTERTRACK] = 'ChapterTrack'; - $EBMLidList[EBML_ID_CHAPTERTRACKNUMBER] = 'ChapterTrackNumber'; - $EBMLidList[EBML_ID_CHAPTERTRANSLATE] = 'ChapterTranslate'; - $EBMLidList[EBML_ID_CHAPTERTRANSLATECODEC] = 'ChapterTranslateCodec'; - $EBMLidList[EBML_ID_CHAPTERTRANSLATEEDITIONUID] = 'ChapterTranslateEditionUID'; - $EBMLidList[EBML_ID_CHAPTERTRANSLATEID] = 'ChapterTranslateID'; - $EBMLidList[EBML_ID_CHAPTERUID] = 'ChapterUID'; - $EBMLidList[EBML_ID_CLUSTER] = 'Cluster'; - $EBMLidList[EBML_ID_CLUSTERBLOCK] = 'ClusterBlock'; - $EBMLidList[EBML_ID_CLUSTERBLOCKADDID] = 'ClusterBlockAddID'; - $EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONAL] = 'ClusterBlockAdditional'; - $EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONID] = 'ClusterBlockAdditionID'; - $EBMLidList[EBML_ID_CLUSTERBLOCKADDITIONS] = 'ClusterBlockAdditions'; - $EBMLidList[EBML_ID_CLUSTERBLOCKDURATION] = 'ClusterBlockDuration'; - $EBMLidList[EBML_ID_CLUSTERBLOCKGROUP] = 'ClusterBlockGroup'; - $EBMLidList[EBML_ID_CLUSTERBLOCKMORE] = 'ClusterBlockMore'; - $EBMLidList[EBML_ID_CLUSTERBLOCKVIRTUAL] = 'ClusterBlockVirtual'; - $EBMLidList[EBML_ID_CLUSTERCODECSTATE] = 'ClusterCodecState'; - $EBMLidList[EBML_ID_CLUSTERDELAY] = 'ClusterDelay'; - $EBMLidList[EBML_ID_CLUSTERDURATION] = 'ClusterDuration'; - $EBMLidList[EBML_ID_CLUSTERENCRYPTEDBLOCK] = 'ClusterEncryptedBlock'; - $EBMLidList[EBML_ID_CLUSTERFRAMENUMBER] = 'ClusterFrameNumber'; - $EBMLidList[EBML_ID_CLUSTERLACENUMBER] = 'ClusterLaceNumber'; - $EBMLidList[EBML_ID_CLUSTERPOSITION] = 'ClusterPosition'; - $EBMLidList[EBML_ID_CLUSTERPREVSIZE] = 'ClusterPrevSize'; - $EBMLidList[EBML_ID_CLUSTERREFERENCEBLOCK] = 'ClusterReferenceBlock'; - $EBMLidList[EBML_ID_CLUSTERREFERENCEPRIORITY] = 'ClusterReferencePriority'; - $EBMLidList[EBML_ID_CLUSTERREFERENCEVIRTUAL] = 'ClusterReferenceVirtual'; - $EBMLidList[EBML_ID_CLUSTERSILENTTRACKNUMBER] = 'ClusterSilentTrackNumber'; - $EBMLidList[EBML_ID_CLUSTERSILENTTRACKS] = 'ClusterSilentTracks'; - $EBMLidList[EBML_ID_CLUSTERSIMPLEBLOCK] = 'ClusterSimpleBlock'; - $EBMLidList[EBML_ID_CLUSTERTIMECODE] = 'ClusterTimecode'; - $EBMLidList[EBML_ID_CLUSTERTIMESLICE] = 'ClusterTimeSlice'; - $EBMLidList[EBML_ID_CODECDECODEALL] = 'CodecDecodeAll'; - $EBMLidList[EBML_ID_CODECDOWNLOADURL] = 'CodecDownloadURL'; - $EBMLidList[EBML_ID_CODECID] = 'CodecID'; - $EBMLidList[EBML_ID_CODECINFOURL] = 'CodecInfoURL'; - $EBMLidList[EBML_ID_CODECNAME] = 'CodecName'; - $EBMLidList[EBML_ID_CODECPRIVATE] = 'CodecPrivate'; - $EBMLidList[EBML_ID_CODECSETTINGS] = 'CodecSettings'; - $EBMLidList[EBML_ID_COLOURSPACE] = 'ColourSpace'; - $EBMLidList[EBML_ID_CONTENTCOMPALGO] = 'ContentCompAlgo'; - $EBMLidList[EBML_ID_CONTENTCOMPRESSION] = 'ContentCompression'; - $EBMLidList[EBML_ID_CONTENTCOMPSETTINGS] = 'ContentCompSettings'; - $EBMLidList[EBML_ID_CONTENTENCALGO] = 'ContentEncAlgo'; - $EBMLidList[EBML_ID_CONTENTENCKEYID] = 'ContentEncKeyID'; - $EBMLidList[EBML_ID_CONTENTENCODING] = 'ContentEncoding'; - $EBMLidList[EBML_ID_CONTENTENCODINGORDER] = 'ContentEncodingOrder'; - $EBMLidList[EBML_ID_CONTENTENCODINGS] = 'ContentEncodings'; - $EBMLidList[EBML_ID_CONTENTENCODINGSCOPE] = 'ContentEncodingScope'; - $EBMLidList[EBML_ID_CONTENTENCODINGTYPE] = 'ContentEncodingType'; - $EBMLidList[EBML_ID_CONTENTENCRYPTION] = 'ContentEncryption'; - $EBMLidList[EBML_ID_CONTENTSIGALGO] = 'ContentSigAlgo'; - $EBMLidList[EBML_ID_CONTENTSIGHASHALGO] = 'ContentSigHashAlgo'; - $EBMLidList[EBML_ID_CONTENTSIGKEYID] = 'ContentSigKeyID'; - $EBMLidList[EBML_ID_CONTENTSIGNATURE] = 'ContentSignature'; - $EBMLidList[EBML_ID_CRC32] = 'CRC32'; - $EBMLidList[EBML_ID_CUEBLOCKNUMBER] = 'CueBlockNumber'; - $EBMLidList[EBML_ID_CUECLUSTERPOSITION] = 'CueClusterPosition'; - $EBMLidList[EBML_ID_CUECODECSTATE] = 'CueCodecState'; - $EBMLidList[EBML_ID_CUEPOINT] = 'CuePoint'; - $EBMLidList[EBML_ID_CUEREFCLUSTER] = 'CueRefCluster'; - $EBMLidList[EBML_ID_CUEREFCODECSTATE] = 'CueRefCodecState'; - $EBMLidList[EBML_ID_CUEREFERENCE] = 'CueReference'; - $EBMLidList[EBML_ID_CUEREFNUMBER] = 'CueRefNumber'; - $EBMLidList[EBML_ID_CUEREFTIME] = 'CueRefTime'; - $EBMLidList[EBML_ID_CUES] = 'Cues'; - $EBMLidList[EBML_ID_CUETIME] = 'CueTime'; - $EBMLidList[EBML_ID_CUETRACK] = 'CueTrack'; - $EBMLidList[EBML_ID_CUETRACKPOSITIONS] = 'CueTrackPositions'; - $EBMLidList[EBML_ID_DATEUTC] = 'DateUTC'; - $EBMLidList[EBML_ID_DEFAULTDURATION] = 'DefaultDuration'; - $EBMLidList[EBML_ID_DISPLAYHEIGHT] = 'DisplayHeight'; - $EBMLidList[EBML_ID_DISPLAYUNIT] = 'DisplayUnit'; - $EBMLidList[EBML_ID_DISPLAYWIDTH] = 'DisplayWidth'; - $EBMLidList[EBML_ID_DOCTYPE] = 'DocType'; - $EBMLidList[EBML_ID_DOCTYPEREADVERSION] = 'DocTypeReadVersion'; - $EBMLidList[EBML_ID_DOCTYPEVERSION] = 'DocTypeVersion'; - $EBMLidList[EBML_ID_DURATION] = 'Duration'; - $EBMLidList[EBML_ID_EBML] = 'EBML'; - $EBMLidList[EBML_ID_EBMLMAXIDLENGTH] = 'EBMLMaxIDLength'; - $EBMLidList[EBML_ID_EBMLMAXSIZELENGTH] = 'EBMLMaxSizeLength'; - $EBMLidList[EBML_ID_EBMLREADVERSION] = 'EBMLReadVersion'; - $EBMLidList[EBML_ID_EBMLVERSION] = 'EBMLVersion'; - $EBMLidList[EBML_ID_EDITIONENTRY] = 'EditionEntry'; - $EBMLidList[EBML_ID_EDITIONFLAGDEFAULT] = 'EditionFlagDefault'; - $EBMLidList[EBML_ID_EDITIONFLAGHIDDEN] = 'EditionFlagHidden'; - $EBMLidList[EBML_ID_EDITIONFLAGORDERED] = 'EditionFlagOrdered'; - $EBMLidList[EBML_ID_EDITIONUID] = 'EditionUID'; - $EBMLidList[EBML_ID_FILEDATA] = 'FileData'; - $EBMLidList[EBML_ID_FILEDESCRIPTION] = 'FileDescription'; - $EBMLidList[EBML_ID_FILEMIMETYPE] = 'FileMimeType'; - $EBMLidList[EBML_ID_FILENAME] = 'FileName'; - $EBMLidList[EBML_ID_FILEREFERRAL] = 'FileReferral'; - $EBMLidList[EBML_ID_FILEUID] = 'FileUID'; - $EBMLidList[EBML_ID_FLAGDEFAULT] = 'FlagDefault'; - $EBMLidList[EBML_ID_FLAGENABLED] = 'FlagEnabled'; - $EBMLidList[EBML_ID_FLAGFORCED] = 'FlagForced'; - $EBMLidList[EBML_ID_FLAGINTERLACED] = 'FlagInterlaced'; - $EBMLidList[EBML_ID_FLAGLACING] = 'FlagLacing'; - $EBMLidList[EBML_ID_GAMMAVALUE] = 'GammaValue'; - $EBMLidList[EBML_ID_INFO] = 'Info'; - $EBMLidList[EBML_ID_LANGUAGE] = 'Language'; - $EBMLidList[EBML_ID_MAXBLOCKADDITIONID] = 'MaxBlockAdditionID'; - $EBMLidList[EBML_ID_MAXCACHE] = 'MaxCache'; - $EBMLidList[EBML_ID_MINCACHE] = 'MinCache'; - $EBMLidList[EBML_ID_MUXINGAPP] = 'MuxingApp'; - $EBMLidList[EBML_ID_NAME] = 'Name'; - $EBMLidList[EBML_ID_NEXTFILENAME] = 'NextFilename'; - $EBMLidList[EBML_ID_NEXTUID] = 'NextUID'; - $EBMLidList[EBML_ID_OUTPUTSAMPLINGFREQUENCY] = 'OutputSamplingFrequency'; - $EBMLidList[EBML_ID_PIXELCROPBOTTOM] = 'PixelCropBottom'; - $EBMLidList[EBML_ID_PIXELCROPLEFT] = 'PixelCropLeft'; - $EBMLidList[EBML_ID_PIXELCROPRIGHT] = 'PixelCropRight'; - $EBMLidList[EBML_ID_PIXELCROPTOP] = 'PixelCropTop'; - $EBMLidList[EBML_ID_PIXELHEIGHT] = 'PixelHeight'; - $EBMLidList[EBML_ID_PIXELWIDTH] = 'PixelWidth'; - $EBMLidList[EBML_ID_PREVFILENAME] = 'PrevFilename'; - $EBMLidList[EBML_ID_PREVUID] = 'PrevUID'; - $EBMLidList[EBML_ID_SAMPLINGFREQUENCY] = 'SamplingFrequency'; - $EBMLidList[EBML_ID_SEEK] = 'Seek'; - $EBMLidList[EBML_ID_SEEKHEAD] = 'SeekHead'; - $EBMLidList[EBML_ID_SEEKID] = 'SeekID'; - $EBMLidList[EBML_ID_SEEKPOSITION] = 'SeekPosition'; - $EBMLidList[EBML_ID_SEGMENT] = 'Segment'; - $EBMLidList[EBML_ID_SEGMENTFAMILY] = 'SegmentFamily'; - $EBMLidList[EBML_ID_SEGMENTFILENAME] = 'SegmentFilename'; - $EBMLidList[EBML_ID_SEGMENTUID] = 'SegmentUID'; - $EBMLidList[EBML_ID_SIMPLETAG] = 'SimpleTag'; - $EBMLidList[EBML_ID_CLUSTERSLICES] = 'ClusterSlices'; - $EBMLidList[EBML_ID_STEREOMODE] = 'StereoMode'; - $EBMLidList[EBML_ID_OLDSTEREOMODE] = 'OldStereoMode'; - $EBMLidList[EBML_ID_TAG] = 'Tag'; - $EBMLidList[EBML_ID_TAGATTACHMENTUID] = 'TagAttachmentUID'; - $EBMLidList[EBML_ID_TAGBINARY] = 'TagBinary'; - $EBMLidList[EBML_ID_TAGCHAPTERUID] = 'TagChapterUID'; - $EBMLidList[EBML_ID_TAGDEFAULT] = 'TagDefault'; - $EBMLidList[EBML_ID_TAGEDITIONUID] = 'TagEditionUID'; - $EBMLidList[EBML_ID_TAGLANGUAGE] = 'TagLanguage'; - $EBMLidList[EBML_ID_TAGNAME] = 'TagName'; - $EBMLidList[EBML_ID_TAGTRACKUID] = 'TagTrackUID'; - $EBMLidList[EBML_ID_TAGS] = 'Tags'; - $EBMLidList[EBML_ID_TAGSTRING] = 'TagString'; - $EBMLidList[EBML_ID_TARGETS] = 'Targets'; - $EBMLidList[EBML_ID_TARGETTYPE] = 'TargetType'; - $EBMLidList[EBML_ID_TARGETTYPEVALUE] = 'TargetTypeValue'; - $EBMLidList[EBML_ID_TIMECODESCALE] = 'TimecodeScale'; - $EBMLidList[EBML_ID_TITLE] = 'Title'; - $EBMLidList[EBML_ID_TRACKENTRY] = 'TrackEntry'; - $EBMLidList[EBML_ID_TRACKNUMBER] = 'TrackNumber'; - $EBMLidList[EBML_ID_TRACKOFFSET] = 'TrackOffset'; - $EBMLidList[EBML_ID_TRACKOVERLAY] = 'TrackOverlay'; - $EBMLidList[EBML_ID_TRACKS] = 'Tracks'; - $EBMLidList[EBML_ID_TRACKTIMECODESCALE] = 'TrackTimecodeScale'; - $EBMLidList[EBML_ID_TRACKTRANSLATE] = 'TrackTranslate'; - $EBMLidList[EBML_ID_TRACKTRANSLATECODEC] = 'TrackTranslateCodec'; - $EBMLidList[EBML_ID_TRACKTRANSLATEEDITIONUID] = 'TrackTranslateEditionUID'; - $EBMLidList[EBML_ID_TRACKTRANSLATETRACKID] = 'TrackTranslateTrackID'; - $EBMLidList[EBML_ID_TRACKTYPE] = 'TrackType'; - $EBMLidList[EBML_ID_TRACKUID] = 'TrackUID'; - $EBMLidList[EBML_ID_VIDEO] = 'Video'; - $EBMLidList[EBML_ID_VOID] = 'Void'; - $EBMLidList[EBML_ID_WRITINGAPP] = 'WritingApp'; - } - - return (isset($EBMLidList[$value]) ? $EBMLidList[$value] : dechex($value)); - } - - public static function displayUnit($value) { - // http://www.matroska.org/technical/specs/index.html#DisplayUnit - static $units = array( - 0 => 'pixels', - 1 => 'centimeters', - 2 => 'inches', - 3 => 'Display Aspect Ratio'); - - return (isset($units[$value]) ? $units[$value] : 'unknown'); - } - - private static function getDefaultStreamInfo($streams) - { - foreach (array_reverse($streams) as $stream) { - if ($stream['default']) { - break; - } - } - - $unset = array('default', 'name'); - foreach ($unset as $u) { - if (isset($stream[$u])) { - unset($stream[$u]); - } - } - - $info = $stream; - $info['streams'] = $streams; - - return $info; - } - -} diff --git a/wp/wp-includes/ID3/module.audio-video.quicktime.php b/wp/wp-includes/ID3/module.audio-video.quicktime.php deleted file mode 100644 index 482c0912..00000000 --- a/wp/wp-includes/ID3/module.audio-video.quicktime.php +++ /dev/null @@ -1,2246 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// -// See readme.txt for more details // -///////////////////////////////////////////////////////////////// -// // -// module.audio-video.quicktime.php // -// module for analyzing Quicktime and MP3-in-MP4 files // -// dependencies: module.audio.mp3.php // -// dependencies: module.tag.id3v2.php // -// /// -///////////////////////////////////////////////////////////////// - -getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true); -getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); // needed for ISO 639-2 language code lookup - -class getid3_quicktime extends getid3_handler -{ - - public $ReturnAtomData = true; - public $ParseAllPossibleAtoms = false; - - public function Analyze() { - $info = &$this->getid3->info; - - $info['fileformat'] = 'quicktime'; - $info['quicktime']['hinting'] = false; - $info['quicktime']['controller'] = 'standard'; // may be overridden if 'ctyp' atom is present - - $this->fseek($info['avdataoffset']); - - $offset = 0; - $atomcounter = 0; - $atom_data_read_buffer_size = ($info['php_memory_limit'] ? round($info['php_memory_limit'] / 2) : $this->getid3->option_fread_buffer_size * 1024); // allow [default: 32MB] if PHP configured with no memory_limit - while ($offset < $info['avdataend']) { - if (!getid3_lib::intValueSupported($offset)) { - $info['error'][] = 'Unable to parse atom at offset '.$offset.' because beyond '.round(PHP_INT_MAX / 1073741824).'GB limit of PHP filesystem functions'; - break; - } - $this->fseek($offset); - $AtomHeader = $this->fread(8); - - $atomsize = getid3_lib::BigEndian2Int(substr($AtomHeader, 0, 4)); - $atomname = substr($AtomHeader, 4, 4); - - // 64-bit MOV patch by jlegateØktnc*com - if ($atomsize == 1) { - $atomsize = getid3_lib::BigEndian2Int($this->fread(8)); - } - - $info['quicktime'][$atomname]['name'] = $atomname; - $info['quicktime'][$atomname]['size'] = $atomsize; - $info['quicktime'][$atomname]['offset'] = $offset; - - if (($offset + $atomsize) > $info['avdataend']) { - $info['error'][] = 'Atom at offset '.$offset.' claims to go beyond end-of-file (length: '.$atomsize.' bytes)'; - return false; - } - - if ($atomsize == 0) { - // Furthermore, for historical reasons the list of atoms is optionally - // terminated by a 32-bit integer set to 0. If you are writing a program - // to read user data atoms, you should allow for the terminating 0. - break; - } - $atomHierarchy = array(); - $info['quicktime'][$atomname] = $this->QuicktimeParseAtom($atomname, $atomsize, $this->fread(min($atomsize, $atom_data_read_buffer_size)), $offset, $atomHierarchy, $this->ParseAllPossibleAtoms); - - $offset += $atomsize; - $atomcounter++; - } - - if (!empty($info['avdataend_tmp'])) { - // this value is assigned to a temp value and then erased because - // otherwise any atoms beyond the 'mdat' atom would not get parsed - $info['avdataend'] = $info['avdataend_tmp']; - unset($info['avdataend_tmp']); - } - - if (!isset($info['bitrate']) && isset($info['playtime_seconds'])) { - $info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; - } - if (isset($info['bitrate']) && !isset($info['audio']['bitrate']) && !isset($info['quicktime']['video'])) { - $info['audio']['bitrate'] = $info['bitrate']; - } - if (!empty($info['playtime_seconds']) && !isset($info['video']['frame_rate']) && !empty($info['quicktime']['stts_framecount'])) { - foreach ($info['quicktime']['stts_framecount'] as $key => $samples_count) { - $samples_per_second = $samples_count / $info['playtime_seconds']; - if ($samples_per_second > 240) { - // has to be audio samples - } else { - $info['video']['frame_rate'] = $samples_per_second; - break; - } - } - } - if (($info['audio']['dataformat'] == 'mp4') && empty($info['video']['resolution_x'])) { - $info['fileformat'] = 'mp4'; - $info['mime_type'] = 'audio/mp4'; - unset($info['video']['dataformat']); - } - - if (!$this->ReturnAtomData) { - unset($info['quicktime']['moov']); - } - - if (empty($info['audio']['dataformat']) && !empty($info['quicktime']['audio'])) { - $info['audio']['dataformat'] = 'quicktime'; - } - if (empty($info['video']['dataformat']) && !empty($info['quicktime']['video'])) { - $info['video']['dataformat'] = 'quicktime'; - } - - return true; - } - - public function QuicktimeParseAtom($atomname, $atomsize, $atom_data, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) { - // http://developer.apple.com/techpubs/quicktime/qtdevdocs/APIREF/INDEX/atomalphaindex.htm - - $info = &$this->getid3->info; - - $atom_parent = end($atomHierarchy); // not array_pop($atomHierarchy); see http://www.getid3.org/phpBB3/viewtopic.php?t=1717 - array_push($atomHierarchy, $atomname); - $atom_structure['hierarchy'] = implode(' ', $atomHierarchy); - $atom_structure['name'] = $atomname; - $atom_structure['size'] = $atomsize; - $atom_structure['offset'] = $baseoffset; - switch ($atomname) { - case 'moov': // MOVie container atom - case 'trak': // TRAcK container atom - case 'clip': // CLIPping container atom - case 'matt': // track MATTe container atom - case 'edts': // EDiTS container atom - case 'tref': // Track REFerence container atom - case 'mdia': // MeDIA container atom - case 'minf': // Media INFormation container atom - case 'dinf': // Data INFormation container atom - case 'udta': // User DaTA container atom - case 'cmov': // Compressed MOVie container atom - case 'rmra': // Reference Movie Record Atom - case 'rmda': // Reference Movie Descriptor Atom - case 'gmhd': // Generic Media info HeaDer atom (seen on QTVR) - $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); - break; - - case 'ilst': // Item LiST container atom - if ($atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms)) { - // some "ilst" atoms contain data atoms that have a numeric name, and the data is far more accessible if the returned array is compacted - $allnumericnames = true; - foreach ($atom_structure['subatoms'] as $subatomarray) { - if (!is_integer($subatomarray['name']) || (count($subatomarray['subatoms']) != 1)) { - $allnumericnames = false; - break; - } - } - if ($allnumericnames) { - $newData = array(); - foreach ($atom_structure['subatoms'] as $subatomarray) { - foreach ($subatomarray['subatoms'] as $newData_subatomarray) { - unset($newData_subatomarray['hierarchy'], $newData_subatomarray['name']); - $newData[$subatomarray['name']] = $newData_subatomarray; - break; - } - } - $atom_structure['data'] = $newData; - unset($atom_structure['subatoms']); - } - } - break; - - case "\x00\x00\x00\x01": - case "\x00\x00\x00\x02": - case "\x00\x00\x00\x03": - case "\x00\x00\x00\x04": - case "\x00\x00\x00\x05": - $atomname = getid3_lib::BigEndian2Int($atomname); - $atom_structure['name'] = $atomname; - $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); - break; - - case 'stbl': // Sample TaBLe container atom - $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); - $isVideo = false; - $framerate = 0; - $framecount = 0; - foreach ($atom_structure['subatoms'] as $key => $value_array) { - if (isset($value_array['sample_description_table'])) { - foreach ($value_array['sample_description_table'] as $key2 => $value_array2) { - if (isset($value_array2['data_format'])) { - switch ($value_array2['data_format']) { - case 'avc1': - case 'mp4v': - // video data - $isVideo = true; - break; - case 'mp4a': - // audio data - break; - } - } - } - } elseif (isset($value_array['time_to_sample_table'])) { - foreach ($value_array['time_to_sample_table'] as $key2 => $value_array2) { - if (isset($value_array2['sample_count']) && isset($value_array2['sample_duration']) && ($value_array2['sample_duration'] > 0)) { - $framerate = round($info['quicktime']['time_scale'] / $value_array2['sample_duration'], 3); - $framecount = $value_array2['sample_count']; - } - } - } - } - if ($isVideo && $framerate) { - $info['quicktime']['video']['frame_rate'] = $framerate; - $info['video']['frame_rate'] = $info['quicktime']['video']['frame_rate']; - } - if ($isVideo && $framecount) { - $info['quicktime']['video']['frame_count'] = $framecount; - } - break; - - - case 'aART': // Album ARTist - case 'catg': // CaTeGory - case 'covr': // COVeR artwork - case 'cpil': // ComPILation - case 'cprt': // CoPyRighT - case 'desc': // DESCription - case 'disk': // DISK number - case 'egid': // Episode Global ID - case 'gnre': // GeNRE - case 'keyw': // KEYWord - case 'ldes': - case 'pcst': // PodCaST - case 'pgap': // GAPless Playback - case 'purd': // PURchase Date - case 'purl': // Podcast URL - case 'rati': - case 'rndu': - case 'rpdu': - case 'rtng': // RaTiNG - case 'stik': - case 'tmpo': // TeMPO (BPM) - case 'trkn': // TRacK Number - case 'tves': // TV EpiSode - case 'tvnn': // TV Network Name - case 'tvsh': // TV SHow Name - case 'tvsn': // TV SeasoN - case 'akID': // iTunes store account type - case 'apID': - case 'atID': - case 'cmID': - case 'cnID': - case 'geID': - case 'plID': - case 'sfID': // iTunes store country - case "\xA9".'alb': // ALBum - case "\xA9".'art': // ARTist - case "\xA9".'ART': - case "\xA9".'aut': - case "\xA9".'cmt': // CoMmenT - case "\xA9".'com': // COMposer - case "\xA9".'cpy': - case "\xA9".'day': // content created year - case "\xA9".'dir': - case "\xA9".'ed1': - case "\xA9".'ed2': - case "\xA9".'ed3': - case "\xA9".'ed4': - case "\xA9".'ed5': - case "\xA9".'ed6': - case "\xA9".'ed7': - case "\xA9".'ed8': - case "\xA9".'ed9': - case "\xA9".'enc': - case "\xA9".'fmt': - case "\xA9".'gen': // GENre - case "\xA9".'grp': // GRouPing - case "\xA9".'hst': - case "\xA9".'inf': - case "\xA9".'lyr': // LYRics - case "\xA9".'mak': - case "\xA9".'mod': - case "\xA9".'nam': // full NAMe - case "\xA9".'ope': - case "\xA9".'PRD': - case "\xA9".'prd': - case "\xA9".'prf': - case "\xA9".'req': - case "\xA9".'src': - case "\xA9".'swr': - case "\xA9".'too': // encoder - case "\xA9".'trk': // TRacK - case "\xA9".'url': - case "\xA9".'wrn': - case "\xA9".'wrt': // WRiTer - case '----': // itunes specific - if ($atom_parent == 'udta') { - // User data atom handler - $atom_structure['data_length'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2)); - $atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2)); - $atom_structure['data'] = substr($atom_data, 4); - - $atom_structure['language'] = $this->QuicktimeLanguageLookup($atom_structure['language_id']); - if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) { - $info['comments']['language'][] = $atom_structure['language']; - } - } else { - // Apple item list box atom handler - $atomoffset = 0; - if (substr($atom_data, 2, 2) == "\x10\xB5") { - // not sure what it means, but observed on iPhone4 data. - // Each $atom_data has 2 bytes of datasize, plus 0x10B5, then data - while ($atomoffset < strlen($atom_data)) { - $boxsmallsize = getid3_lib::BigEndian2Int(substr($atom_data, $atomoffset, 2)); - $boxsmalltype = substr($atom_data, $atomoffset + 2, 2); - $boxsmalldata = substr($atom_data, $atomoffset + 4, $boxsmallsize); - if ($boxsmallsize <= 1) { - $info['warning'][] = 'Invalid QuickTime atom smallbox size "'.$boxsmallsize.'" in atom "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" at offset: '.($atom_structure['offset'] + $atomoffset); - $atom_structure['data'] = null; - $atomoffset = strlen($atom_data); - break; - } - switch ($boxsmalltype) { - case "\x10\xB5": - $atom_structure['data'] = $boxsmalldata; - break; - default: - $info['warning'][] = 'Unknown QuickTime smallbox type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $boxsmalltype).'" ('.trim(getid3_lib::PrintHexBytes($boxsmalltype)).') at offset '.$baseoffset; - $atom_structure['data'] = $atom_data; - break; - } - $atomoffset += (4 + $boxsmallsize); - } - } else { - while ($atomoffset < strlen($atom_data)) { - $boxsize = getid3_lib::BigEndian2Int(substr($atom_data, $atomoffset, 4)); - $boxtype = substr($atom_data, $atomoffset + 4, 4); - $boxdata = substr($atom_data, $atomoffset + 8, $boxsize - 8); - if ($boxsize <= 1) { - $info['warning'][] = 'Invalid QuickTime atom box size "'.$boxsize.'" in atom "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" at offset: '.($atom_structure['offset'] + $atomoffset); - $atom_structure['data'] = null; - $atomoffset = strlen($atom_data); - break; - } - $atomoffset += $boxsize; - - switch ($boxtype) { - case 'mean': - case 'name': - $atom_structure[$boxtype] = substr($boxdata, 4); - break; - - case 'data': - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($boxdata, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($boxdata, 1, 3)); - switch ($atom_structure['flags_raw']) { - case 0: // data flag - case 21: // tmpo/cpil flag - switch ($atomname) { - case 'cpil': - case 'pcst': - case 'pgap': - $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1)); - break; - - case 'tmpo': - $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 2)); - break; - - case 'disk': - case 'trkn': - $num = getid3_lib::BigEndian2Int(substr($boxdata, 10, 2)); - $num_total = getid3_lib::BigEndian2Int(substr($boxdata, 12, 2)); - $atom_structure['data'] = empty($num) ? '' : $num; - $atom_structure['data'] .= empty($num_total) ? '' : '/'.$num_total; - break; - - case 'gnre': - $GenreID = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4)); - $atom_structure['data'] = getid3_id3v1::LookupGenreName($GenreID - 1); - break; - - case 'rtng': - $atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1)); - $atom_structure['data'] = $this->QuicktimeContentRatingLookup($atom_structure[$atomname]); - break; - - case 'stik': - $atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 1)); - $atom_structure['data'] = $this->QuicktimeSTIKLookup($atom_structure[$atomname]); - break; - - case 'sfID': - $atom_structure[$atomname] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4)); - $atom_structure['data'] = $this->QuicktimeStoreFrontCodeLookup($atom_structure[$atomname]); - break; - - case 'egid': - case 'purl': - $atom_structure['data'] = substr($boxdata, 8); - break; - - default: - $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($boxdata, 8, 4)); - } - break; - - case 1: // text flag - case 13: // image flag - default: - $atom_structure['data'] = substr($boxdata, 8); - if ($atomname == 'covr') { - // not a foolproof check, but better than nothing - if (preg_match('#^\xFF\xD8\xFF#', $atom_structure['data'])) { - $atom_structure['image_mime'] = 'image/jpeg'; - } elseif (preg_match('#^\x89\x50\x4E\x47\x0D\x0A\x1A\x0A#', $atom_structure['data'])) { - $atom_structure['image_mime'] = 'image/png'; - } elseif (preg_match('#^GIF#', $atom_structure['data'])) { - $atom_structure['image_mime'] = 'image/gif'; - } - } - break; - - } - break; - - default: - $info['warning'][] = 'Unknown QuickTime box type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $boxtype).'" ('.trim(getid3_lib::PrintHexBytes($boxtype)).') at offset '.$baseoffset; - $atom_structure['data'] = $atom_data; - - } - } - } - } - $this->CopyToAppropriateCommentsSection($atomname, $atom_structure['data'], $atom_structure['name']); - break; - - - case 'play': // auto-PLAY atom - $atom_structure['autoplay'] = (bool) getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - - $info['quicktime']['autoplay'] = $atom_structure['autoplay']; - break; - - - case 'WLOC': // Window LOCation atom - $atom_structure['location_x'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2)); - $atom_structure['location_y'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2)); - break; - - - case 'LOOP': // LOOPing atom - case 'SelO': // play SELection Only atom - case 'AllF': // play ALL Frames atom - $atom_structure['data'] = getid3_lib::BigEndian2Int($atom_data); - break; - - - case 'name': // - case 'MCPS': // Media Cleaner PRo - case '@PRM': // adobe PReMiere version - case '@PRQ': // adobe PRemiere Quicktime version - $atom_structure['data'] = $atom_data; - break; - - - case 'cmvd': // Compressed MooV Data atom - // Code by ubergeekØubergeek*tv based on information from - // http://developer.apple.com/quicktime/icefloe/dispatch012.html - $atom_structure['unCompressedSize'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); - - $CompressedFileData = substr($atom_data, 4); - if ($UncompressedHeader = @gzuncompress($CompressedFileData)) { - $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($UncompressedHeader, 0, $atomHierarchy, $ParseAllPossibleAtoms); - } else { - $info['warning'][] = 'Error decompressing compressed MOV atom at offset '.$atom_structure['offset']; - } - break; - - - case 'dcom': // Data COMpression atom - $atom_structure['compression_id'] = $atom_data; - $atom_structure['compression_text'] = $this->QuicktimeDCOMLookup($atom_data); - break; - - - case 'rdrf': // Reference movie Data ReFerence atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); - $atom_structure['flags']['internal_data'] = (bool) ($atom_structure['flags_raw'] & 0x000001); - - $atom_structure['reference_type_name'] = substr($atom_data, 4, 4); - $atom_structure['reference_length'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); - switch ($atom_structure['reference_type_name']) { - case 'url ': - $atom_structure['url'] = $this->NoNullString(substr($atom_data, 12)); - break; - - case 'alis': - $atom_structure['file_alias'] = substr($atom_data, 12); - break; - - case 'rsrc': - $atom_structure['resource_alias'] = substr($atom_data, 12); - break; - - default: - $atom_structure['data'] = substr($atom_data, 12); - break; - } - break; - - - case 'rmqu': // Reference Movie QUality atom - $atom_structure['movie_quality'] = getid3_lib::BigEndian2Int($atom_data); - break; - - - case 'rmcs': // Reference Movie Cpu Speed atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['cpu_speed_rating'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); - break; - - - case 'rmvc': // Reference Movie Version Check atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['gestalt_selector'] = substr($atom_data, 4, 4); - $atom_structure['gestalt_value_mask'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); - $atom_structure['gestalt_value'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); - $atom_structure['gestalt_check_type'] = getid3_lib::BigEndian2Int(substr($atom_data, 14, 2)); - break; - - - case 'rmcd': // Reference Movie Component check atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['component_type'] = substr($atom_data, 4, 4); - $atom_structure['component_subtype'] = substr($atom_data, 8, 4); - $atom_structure['component_manufacturer'] = substr($atom_data, 12, 4); - $atom_structure['component_flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); - $atom_structure['component_flags_mask'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4)); - $atom_structure['component_min_version'] = getid3_lib::BigEndian2Int(substr($atom_data, 24, 4)); - break; - - - case 'rmdr': // Reference Movie Data Rate atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['data_rate'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - - $atom_structure['data_rate_bps'] = $atom_structure['data_rate'] * 10; - break; - - - case 'rmla': // Reference Movie Language Atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); - - $atom_structure['language'] = $this->QuicktimeLanguageLookup($atom_structure['language_id']); - if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) { - $info['comments']['language'][] = $atom_structure['language']; - } - break; - - - case 'rmla': // Reference Movie Language Atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['track_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); - break; - - - case 'ptv ': // Print To Video - defines a movie's full screen mode - // http://developer.apple.com/documentation/QuickTime/APIREF/SOURCESIV/at_ptv-_pg.htm - $atom_structure['display_size_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2)); - $atom_structure['reserved_1'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 2)); // hardcoded: 0x0000 - $atom_structure['reserved_2'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); // hardcoded: 0x0000 - $atom_structure['slide_show_flag'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 1)); - $atom_structure['play_on_open_flag'] = getid3_lib::BigEndian2Int(substr($atom_data, 7, 1)); - - $atom_structure['flags']['play_on_open'] = (bool) $atom_structure['play_on_open_flag']; - $atom_structure['flags']['slide_show'] = (bool) $atom_structure['slide_show_flag']; - - $ptv_lookup[0] = 'normal'; - $ptv_lookup[1] = 'double'; - $ptv_lookup[2] = 'half'; - $ptv_lookup[3] = 'full'; - $ptv_lookup[4] = 'current'; - if (isset($ptv_lookup[$atom_structure['display_size_raw']])) { - $atom_structure['display_size'] = $ptv_lookup[$atom_structure['display_size_raw']]; - } else { - $info['warning'][] = 'unknown "ptv " display constant ('.$atom_structure['display_size_raw'].')'; - } - break; - - - case 'stsd': // Sample Table Sample Description atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - $stsdEntriesDataOffset = 8; - for ($i = 0; $i < $atom_structure['number_entries']; $i++) { - $atom_structure['sample_description_table'][$i]['size'] = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 4)); - $stsdEntriesDataOffset += 4; - $atom_structure['sample_description_table'][$i]['data_format'] = substr($atom_data, $stsdEntriesDataOffset, 4); - $stsdEntriesDataOffset += 4; - $atom_structure['sample_description_table'][$i]['reserved'] = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 6)); - $stsdEntriesDataOffset += 6; - $atom_structure['sample_description_table'][$i]['reference_index'] = getid3_lib::BigEndian2Int(substr($atom_data, $stsdEntriesDataOffset, 2)); - $stsdEntriesDataOffset += 2; - $atom_structure['sample_description_table'][$i]['data'] = substr($atom_data, $stsdEntriesDataOffset, ($atom_structure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2)); - $stsdEntriesDataOffset += ($atom_structure['sample_description_table'][$i]['size'] - 4 - 4 - 6 - 2); - - $atom_structure['sample_description_table'][$i]['encoder_version'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 0, 2)); - $atom_structure['sample_description_table'][$i]['encoder_revision'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 2, 2)); - $atom_structure['sample_description_table'][$i]['encoder_vendor'] = substr($atom_structure['sample_description_table'][$i]['data'], 4, 4); - - switch ($atom_structure['sample_description_table'][$i]['encoder_vendor']) { - - case "\x00\x00\x00\x00": - // audio tracks - $atom_structure['sample_description_table'][$i]['audio_channels'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 8, 2)); - $atom_structure['sample_description_table'][$i]['audio_bit_depth'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 10, 2)); - $atom_structure['sample_description_table'][$i]['audio_compression_id'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12, 2)); - $atom_structure['sample_description_table'][$i]['audio_packet_size'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 14, 2)); - $atom_structure['sample_description_table'][$i]['audio_sample_rate'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 16, 4)); - - // video tracks - // http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap3/qtff3.html - $atom_structure['sample_description_table'][$i]['temporal_quality'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 8, 4)); - $atom_structure['sample_description_table'][$i]['spatial_quality'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12, 4)); - $atom_structure['sample_description_table'][$i]['width'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 16, 2)); - $atom_structure['sample_description_table'][$i]['height'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 18, 2)); - $atom_structure['sample_description_table'][$i]['resolution_x'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 24, 4)); - $atom_structure['sample_description_table'][$i]['resolution_y'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 28, 4)); - $atom_structure['sample_description_table'][$i]['data_size'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 32, 4)); - $atom_structure['sample_description_table'][$i]['frame_count'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 36, 2)); - $atom_structure['sample_description_table'][$i]['compressor_name'] = substr($atom_structure['sample_description_table'][$i]['data'], 38, 4); - $atom_structure['sample_description_table'][$i]['pixel_depth'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 42, 2)); - $atom_structure['sample_description_table'][$i]['color_table_id'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 44, 2)); - - switch ($atom_structure['sample_description_table'][$i]['data_format']) { - case '2vuY': - case 'avc1': - case 'cvid': - case 'dvc ': - case 'dvcp': - case 'gif ': - case 'h263': - case 'jpeg': - case 'kpcd': - case 'mjpa': - case 'mjpb': - case 'mp4v': - case 'png ': - case 'raw ': - case 'rle ': - case 'rpza': - case 'smc ': - case 'SVQ1': - case 'SVQ3': - case 'tiff': - case 'v210': - case 'v216': - case 'v308': - case 'v408': - case 'v410': - case 'yuv2': - $info['fileformat'] = 'mp4'; - $info['video']['fourcc'] = $atom_structure['sample_description_table'][$i]['data_format']; -// http://www.getid3.org/phpBB3/viewtopic.php?t=1550 -//if ((!empty($atom_structure['sample_description_table'][$i]['width']) && !empty($atom_structure['sample_description_table'][$i]['width'])) && (empty($info['video']['resolution_x']) || empty($info['video']['resolution_y']) || (number_format($info['video']['resolution_x'], 6) != number_format(round($info['video']['resolution_x']), 6)) || (number_format($info['video']['resolution_y'], 6) != number_format(round($info['video']['resolution_y']), 6)))) { // ugly check for floating point numbers -if (!empty($atom_structure['sample_description_table'][$i]['width']) && !empty($atom_structure['sample_description_table'][$i]['height'])) { - // assume that values stored here are more important than values stored in [tkhd] atom - $info['video']['resolution_x'] = $atom_structure['sample_description_table'][$i]['width']; - $info['video']['resolution_y'] = $atom_structure['sample_description_table'][$i]['height']; - $info['quicktime']['video']['resolution_x'] = $info['video']['resolution_x']; - $info['quicktime']['video']['resolution_y'] = $info['video']['resolution_y']; -} - break; - - case 'qtvr': - $info['video']['dataformat'] = 'quicktimevr'; - break; - - case 'mp4a': - default: - $info['quicktime']['audio']['codec'] = $this->QuicktimeAudioCodecLookup($atom_structure['sample_description_table'][$i]['data_format']); - $info['quicktime']['audio']['sample_rate'] = $atom_structure['sample_description_table'][$i]['audio_sample_rate']; - $info['quicktime']['audio']['channels'] = $atom_structure['sample_description_table'][$i]['audio_channels']; - $info['quicktime']['audio']['bit_depth'] = $atom_structure['sample_description_table'][$i]['audio_bit_depth']; - $info['audio']['codec'] = $info['quicktime']['audio']['codec']; - $info['audio']['sample_rate'] = $info['quicktime']['audio']['sample_rate']; - $info['audio']['channels'] = $info['quicktime']['audio']['channels']; - $info['audio']['bits_per_sample'] = $info['quicktime']['audio']['bit_depth']; - switch ($atom_structure['sample_description_table'][$i]['data_format']) { - case 'raw ': // PCM - case 'alac': // Apple Lossless Audio Codec - $info['audio']['lossless'] = true; - break; - default: - $info['audio']['lossless'] = false; - break; - } - break; - } - break; - - default: - switch ($atom_structure['sample_description_table'][$i]['data_format']) { - case 'mp4s': - $info['fileformat'] = 'mp4'; - break; - - default: - // video atom - $atom_structure['sample_description_table'][$i]['video_temporal_quality'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 8, 4)); - $atom_structure['sample_description_table'][$i]['video_spatial_quality'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 12, 4)); - $atom_structure['sample_description_table'][$i]['video_frame_width'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 16, 2)); - $atom_structure['sample_description_table'][$i]['video_frame_height'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 18, 2)); - $atom_structure['sample_description_table'][$i]['video_resolution_x'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 20, 4)); - $atom_structure['sample_description_table'][$i]['video_resolution_y'] = getid3_lib::FixedPoint16_16(substr($atom_structure['sample_description_table'][$i]['data'], 24, 4)); - $atom_structure['sample_description_table'][$i]['video_data_size'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 28, 4)); - $atom_structure['sample_description_table'][$i]['video_frame_count'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 32, 2)); - $atom_structure['sample_description_table'][$i]['video_encoder_name_len'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 34, 1)); - $atom_structure['sample_description_table'][$i]['video_encoder_name'] = substr($atom_structure['sample_description_table'][$i]['data'], 35, $atom_structure['sample_description_table'][$i]['video_encoder_name_len']); - $atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 66, 2)); - $atom_structure['sample_description_table'][$i]['video_color_table_id'] = getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 68, 2)); - - $atom_structure['sample_description_table'][$i]['video_pixel_color_type'] = (($atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] > 32) ? 'grayscale' : 'color'); - $atom_structure['sample_description_table'][$i]['video_pixel_color_name'] = $this->QuicktimeColorNameLookup($atom_structure['sample_description_table'][$i]['video_pixel_color_depth']); - - if ($atom_structure['sample_description_table'][$i]['video_pixel_color_name'] != 'invalid') { - $info['quicktime']['video']['codec_fourcc'] = $atom_structure['sample_description_table'][$i]['data_format']; - $info['quicktime']['video']['codec_fourcc_lookup'] = $this->QuicktimeVideoCodecLookup($atom_structure['sample_description_table'][$i]['data_format']); - $info['quicktime']['video']['codec'] = (($atom_structure['sample_description_table'][$i]['video_encoder_name_len'] > 0) ? $atom_structure['sample_description_table'][$i]['video_encoder_name'] : $atom_structure['sample_description_table'][$i]['data_format']); - $info['quicktime']['video']['color_depth'] = $atom_structure['sample_description_table'][$i]['video_pixel_color_depth']; - $info['quicktime']['video']['color_depth_name'] = $atom_structure['sample_description_table'][$i]['video_pixel_color_name']; - - $info['video']['codec'] = $info['quicktime']['video']['codec']; - $info['video']['bits_per_sample'] = $info['quicktime']['video']['color_depth']; - } - $info['video']['lossless'] = false; - $info['video']['pixel_aspect_ratio'] = (float) 1; - break; - } - break; - } - switch (strtolower($atom_structure['sample_description_table'][$i]['data_format'])) { - case 'mp4a': - $info['audio']['dataformat'] = 'mp4'; - $info['quicktime']['audio']['codec'] = 'mp4'; - break; - - case '3ivx': - case '3iv1': - case '3iv2': - $info['video']['dataformat'] = '3ivx'; - break; - - case 'xvid': - $info['video']['dataformat'] = 'xvid'; - break; - - case 'mp4v': - $info['video']['dataformat'] = 'mpeg4'; - break; - - case 'divx': - case 'div1': - case 'div2': - case 'div3': - case 'div4': - case 'div5': - case 'div6': - $info['video']['dataformat'] = 'divx'; - break; - - default: - // do nothing - break; - } - unset($atom_structure['sample_description_table'][$i]['data']); - } - break; - - - case 'stts': // Sample Table Time-to-Sample atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - $sttsEntriesDataOffset = 8; - //$FrameRateCalculatorArray = array(); - $frames_count = 0; - - $max_stts_entries_to_scan = ($info['php_memory_limit'] ? min(floor($this->getid3->memory_limit / 10000), $atom_structure['number_entries']) : $atom_structure['number_entries']); - if ($max_stts_entries_to_scan < $atom_structure['number_entries']) { - $info['warning'][] = 'QuickTime atom "stts" has '.$atom_structure['number_entries'].' but only scanning the first '.$max_stts_entries_to_scan.' entries due to limited PHP memory available ('.floor($atom_structure['number_entries'] / 1048576).'MB).'; - } - for ($i = 0; $i < $max_stts_entries_to_scan; $i++) { - $atom_structure['time_to_sample_table'][$i]['sample_count'] = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4)); - $sttsEntriesDataOffset += 4; - $atom_structure['time_to_sample_table'][$i]['sample_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, $sttsEntriesDataOffset, 4)); - $sttsEntriesDataOffset += 4; - - $frames_count += $atom_structure['time_to_sample_table'][$i]['sample_count']; - - // THIS SECTION REPLACED WITH CODE IN "stbl" ATOM - //if (!empty($info['quicktime']['time_scale']) && ($atom_structure['time_to_sample_table'][$i]['sample_duration'] > 0)) { - // $stts_new_framerate = $info['quicktime']['time_scale'] / $atom_structure['time_to_sample_table'][$i]['sample_duration']; - // if ($stts_new_framerate <= 60) { - // // some atoms have durations of "1" giving a very large framerate, which probably is not right - // $info['video']['frame_rate'] = max($info['video']['frame_rate'], $stts_new_framerate); - // } - //} - // - //$FrameRateCalculatorArray[($info['quicktime']['time_scale'] / $atom_structure['time_to_sample_table'][$i]['sample_duration'])] += $atom_structure['time_to_sample_table'][$i]['sample_count']; - } - $info['quicktime']['stts_framecount'][] = $frames_count; - //$sttsFramesTotal = 0; - //$sttsSecondsTotal = 0; - //foreach ($FrameRateCalculatorArray as $frames_per_second => $frame_count) { - // if (($frames_per_second > 60) || ($frames_per_second < 1)) { - // // not video FPS information, probably audio information - // $sttsFramesTotal = 0; - // $sttsSecondsTotal = 0; - // break; - // } - // $sttsFramesTotal += $frame_count; - // $sttsSecondsTotal += $frame_count / $frames_per_second; - //} - //if (($sttsFramesTotal > 0) && ($sttsSecondsTotal > 0)) { - // if (($sttsFramesTotal / $sttsSecondsTotal) > $info['video']['frame_rate']) { - // $info['video']['frame_rate'] = $sttsFramesTotal / $sttsSecondsTotal; - // } - //} - break; - - - case 'stss': // Sample Table Sync Sample (key frames) atom - if ($ParseAllPossibleAtoms) { - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - $stssEntriesDataOffset = 8; - for ($i = 0; $i < $atom_structure['number_entries']; $i++) { - $atom_structure['time_to_sample_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stssEntriesDataOffset, 4)); - $stssEntriesDataOffset += 4; - } - } - break; - - - case 'stsc': // Sample Table Sample-to-Chunk atom - if ($ParseAllPossibleAtoms) { - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - $stscEntriesDataOffset = 8; - for ($i = 0; $i < $atom_structure['number_entries']; $i++) { - $atom_structure['sample_to_chunk_table'][$i]['first_chunk'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4)); - $stscEntriesDataOffset += 4; - $atom_structure['sample_to_chunk_table'][$i]['samples_per_chunk'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4)); - $stscEntriesDataOffset += 4; - $atom_structure['sample_to_chunk_table'][$i]['sample_description'] = getid3_lib::BigEndian2Int(substr($atom_data, $stscEntriesDataOffset, 4)); - $stscEntriesDataOffset += 4; - } - } - break; - - - case 'stsz': // Sample Table SiZe atom - if ($ParseAllPossibleAtoms) { - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['sample_size'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); - $stszEntriesDataOffset = 12; - if ($atom_structure['sample_size'] == 0) { - for ($i = 0; $i < $atom_structure['number_entries']; $i++) { - $atom_structure['sample_size_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stszEntriesDataOffset, 4)); - $stszEntriesDataOffset += 4; - } - } - } - break; - - - case 'stco': // Sample Table Chunk Offset atom - if ($ParseAllPossibleAtoms) { - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - $stcoEntriesDataOffset = 8; - for ($i = 0; $i < $atom_structure['number_entries']; $i++) { - $atom_structure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stcoEntriesDataOffset, 4)); - $stcoEntriesDataOffset += 4; - } - } - break; - - - case 'co64': // Chunk Offset 64-bit (version of "stco" that supports > 2GB files) - if ($ParseAllPossibleAtoms) { - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - $stcoEntriesDataOffset = 8; - for ($i = 0; $i < $atom_structure['number_entries']; $i++) { - $atom_structure['chunk_offset_table'][$i] = getid3_lib::BigEndian2Int(substr($atom_data, $stcoEntriesDataOffset, 8)); - $stcoEntriesDataOffset += 8; - } - } - break; - - - case 'dref': // Data REFerence atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - $drefDataOffset = 8; - for ($i = 0; $i < $atom_structure['number_entries']; $i++) { - $atom_structure['data_references'][$i]['size'] = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 4)); - $drefDataOffset += 4; - $atom_structure['data_references'][$i]['type'] = substr($atom_data, $drefDataOffset, 4); - $drefDataOffset += 4; - $atom_structure['data_references'][$i]['version'] = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 1)); - $drefDataOffset += 1; - $atom_structure['data_references'][$i]['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, $drefDataOffset, 3)); // hardcoded: 0x0000 - $drefDataOffset += 3; - $atom_structure['data_references'][$i]['data'] = substr($atom_data, $drefDataOffset, ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3)); - $drefDataOffset += ($atom_structure['data_references'][$i]['size'] - 4 - 4 - 1 - 3); - - $atom_structure['data_references'][$i]['flags']['self_reference'] = (bool) ($atom_structure['data_references'][$i]['flags_raw'] & 0x001); - } - break; - - - case 'gmin': // base Media INformation atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['graphics_mode'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); - $atom_structure['opcolor_red'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2)); - $atom_structure['opcolor_green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 2)); - $atom_structure['opcolor_blue'] = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); - $atom_structure['balance'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 2)); - $atom_structure['reserved'] = getid3_lib::BigEndian2Int(substr($atom_data, 14, 2)); - break; - - - case 'smhd': // Sound Media information HeaDer atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['balance'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); - $atom_structure['reserved'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2)); - break; - - - case 'vmhd': // Video Media information HeaDer atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); - $atom_structure['graphics_mode'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); - $atom_structure['opcolor_red'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2)); - $atom_structure['opcolor_green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 2)); - $atom_structure['opcolor_blue'] = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); - - $atom_structure['flags']['no_lean_ahead'] = (bool) ($atom_structure['flags_raw'] & 0x001); - break; - - - case 'hdlr': // HanDLeR reference atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['component_type'] = substr($atom_data, 4, 4); - $atom_structure['component_subtype'] = substr($atom_data, 8, 4); - $atom_structure['component_manufacturer'] = substr($atom_data, 12, 4); - $atom_structure['component_flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); - $atom_structure['component_flags_mask'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4)); - $atom_structure['component_name'] = $this->Pascal2String(substr($atom_data, 24)); - - if (($atom_structure['component_subtype'] == 'STpn') && ($atom_structure['component_manufacturer'] == 'zzzz')) { - $info['video']['dataformat'] = 'quicktimevr'; - } - break; - - - case 'mdhd': // MeDia HeaDer atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['creation_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - $atom_structure['modify_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); - $atom_structure['time_scale'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); - $atom_structure['duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); - $atom_structure['language_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 2)); - $atom_structure['quality'] = getid3_lib::BigEndian2Int(substr($atom_data, 22, 2)); - - if ($atom_structure['time_scale'] == 0) { - $info['error'][] = 'Corrupt Quicktime file: mdhd.time_scale == zero'; - return false; - } - $info['quicktime']['time_scale'] = (isset($info['quicktime']['time_scale']) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']); - - $atom_structure['creation_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['creation_time']); - $atom_structure['modify_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['modify_time']); - $atom_structure['playtime_seconds'] = $atom_structure['duration'] / $atom_structure['time_scale']; - $atom_structure['language'] = $this->QuicktimeLanguageLookup($atom_structure['language_id']); - if (empty($info['comments']['language']) || (!in_array($atom_structure['language'], $info['comments']['language']))) { - $info['comments']['language'][] = $atom_structure['language']; - } - break; - - - case 'pnot': // Preview atom - $atom_structure['modification_date'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); // "standard Macintosh format" - $atom_structure['version_number'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); // hardcoded: 0x00 - $atom_structure['atom_type'] = substr($atom_data, 6, 4); // usually: 'PICT' - $atom_structure['atom_index'] = getid3_lib::BigEndian2Int(substr($atom_data, 10, 2)); // usually: 0x01 - - $atom_structure['modification_date_unix'] = getid3_lib::DateMac2Unix($atom_structure['modification_date']); - break; - - - case 'crgn': // Clipping ReGioN atom - $atom_structure['region_size'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 2)); // The Region size, Region boundary box, - $atom_structure['boundary_box'] = getid3_lib::BigEndian2Int(substr($atom_data, 2, 8)); // and Clipping region data fields - $atom_structure['clipping_data'] = substr($atom_data, 10); // constitute a QuickDraw region. - break; - - - case 'load': // track LOAD settings atom - $atom_structure['preload_start_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); - $atom_structure['preload_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - $atom_structure['preload_flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); - $atom_structure['default_hints_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); - - $atom_structure['default_hints']['double_buffer'] = (bool) ($atom_structure['default_hints_raw'] & 0x0020); - $atom_structure['default_hints']['high_quality'] = (bool) ($atom_structure['default_hints_raw'] & 0x0100); - break; - - - case 'tmcd': // TiMe CoDe atom - case 'chap': // CHAPter list atom - case 'sync': // SYNChronization atom - case 'scpt': // tranSCriPT atom - case 'ssrc': // non-primary SouRCe atom - for ($i = 0; $i < strlen($atom_data); $i += 4) { - @$atom_structure['track_id'][] = getid3_lib::BigEndian2Int(substr($atom_data, $i, 4)); - } - break; - - - case 'elst': // Edit LiST atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['number_entries'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - for ($i = 0; $i < $atom_structure['number_entries']; $i++ ) { - $atom_structure['edit_list'][$i]['track_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($i * 12) + 0, 4)); - $atom_structure['edit_list'][$i]['media_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($i * 12) + 4, 4)); - $atom_structure['edit_list'][$i]['media_rate'] = getid3_lib::FixedPoint16_16(substr($atom_data, 8 + ($i * 12) + 8, 4)); - } - break; - - - case 'kmat': // compressed MATte atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); // hardcoded: 0x0000 - $atom_structure['matte_data_raw'] = substr($atom_data, 4); - break; - - - case 'ctab': // Color TABle atom - $atom_structure['color_table_seed'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); // hardcoded: 0x00000000 - $atom_structure['color_table_flags'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 2)); // hardcoded: 0x8000 - $atom_structure['color_table_size'] = getid3_lib::BigEndian2Int(substr($atom_data, 6, 2)) + 1; - for ($colortableentry = 0; $colortableentry < $atom_structure['color_table_size']; $colortableentry++) { - $atom_structure['color_table'][$colortableentry]['alpha'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 0, 2)); - $atom_structure['color_table'][$colortableentry]['red'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 2, 2)); - $atom_structure['color_table'][$colortableentry]['green'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 4, 2)); - $atom_structure['color_table'][$colortableentry]['blue'] = getid3_lib::BigEndian2Int(substr($atom_data, 8 + ($colortableentry * 8) + 6, 2)); - } - break; - - - case 'mvhd': // MoVie HeaDer atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); - $atom_structure['creation_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - $atom_structure['modify_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); - $atom_structure['time_scale'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); - $atom_structure['duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); - $atom_structure['preferred_rate'] = getid3_lib::FixedPoint16_16(substr($atom_data, 20, 4)); - $atom_structure['preferred_volume'] = getid3_lib::FixedPoint8_8(substr($atom_data, 24, 2)); - $atom_structure['reserved'] = substr($atom_data, 26, 10); - $atom_structure['matrix_a'] = getid3_lib::FixedPoint16_16(substr($atom_data, 36, 4)); - $atom_structure['matrix_b'] = getid3_lib::FixedPoint16_16(substr($atom_data, 40, 4)); - $atom_structure['matrix_u'] = getid3_lib::FixedPoint2_30(substr($atom_data, 44, 4)); - $atom_structure['matrix_c'] = getid3_lib::FixedPoint16_16(substr($atom_data, 48, 4)); - $atom_structure['matrix_d'] = getid3_lib::FixedPoint16_16(substr($atom_data, 52, 4)); - $atom_structure['matrix_v'] = getid3_lib::FixedPoint2_30(substr($atom_data, 56, 4)); - $atom_structure['matrix_x'] = getid3_lib::FixedPoint16_16(substr($atom_data, 60, 4)); - $atom_structure['matrix_y'] = getid3_lib::FixedPoint16_16(substr($atom_data, 64, 4)); - $atom_structure['matrix_w'] = getid3_lib::FixedPoint2_30(substr($atom_data, 68, 4)); - $atom_structure['preview_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 72, 4)); - $atom_structure['preview_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 76, 4)); - $atom_structure['poster_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 80, 4)); - $atom_structure['selection_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 84, 4)); - $atom_structure['selection_duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 88, 4)); - $atom_structure['current_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 92, 4)); - $atom_structure['next_track_id'] = getid3_lib::BigEndian2Int(substr($atom_data, 96, 4)); - - if ($atom_structure['time_scale'] == 0) { - $info['error'][] = 'Corrupt Quicktime file: mvhd.time_scale == zero'; - return false; - } - $atom_structure['creation_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['creation_time']); - $atom_structure['modify_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['modify_time']); - $info['quicktime']['time_scale'] = (isset($info['quicktime']['time_scale']) ? max($info['quicktime']['time_scale'], $atom_structure['time_scale']) : $atom_structure['time_scale']); - $info['quicktime']['display_scale'] = $atom_structure['matrix_a']; - $info['playtime_seconds'] = $atom_structure['duration'] / $atom_structure['time_scale']; - break; - - - case 'tkhd': // TracK HeaDer atom - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); - $atom_structure['creation_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - $atom_structure['modify_time'] = getid3_lib::BigEndian2Int(substr($atom_data, 8, 4)); - $atom_structure['trackid'] = getid3_lib::BigEndian2Int(substr($atom_data, 12, 4)); - $atom_structure['reserved1'] = getid3_lib::BigEndian2Int(substr($atom_data, 16, 4)); - $atom_structure['duration'] = getid3_lib::BigEndian2Int(substr($atom_data, 20, 4)); - $atom_structure['reserved2'] = getid3_lib::BigEndian2Int(substr($atom_data, 24, 8)); - $atom_structure['layer'] = getid3_lib::BigEndian2Int(substr($atom_data, 32, 2)); - $atom_structure['alternate_group'] = getid3_lib::BigEndian2Int(substr($atom_data, 34, 2)); - $atom_structure['volume'] = getid3_lib::FixedPoint8_8(substr($atom_data, 36, 2)); - $atom_structure['reserved3'] = getid3_lib::BigEndian2Int(substr($atom_data, 38, 2)); -// http://developer.apple.com/library/mac/#documentation/QuickTime/RM/MovieBasics/MTEditing/K-Chapter/11MatrixFunctions.html -// http://developer.apple.com/library/mac/#documentation/QuickTime/qtff/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-18737 - $atom_structure['matrix_a'] = getid3_lib::FixedPoint16_16(substr($atom_data, 40, 4)); - $atom_structure['matrix_b'] = getid3_lib::FixedPoint16_16(substr($atom_data, 44, 4)); - $atom_structure['matrix_u'] = getid3_lib::FixedPoint2_30(substr($atom_data, 48, 4)); - $atom_structure['matrix_c'] = getid3_lib::FixedPoint16_16(substr($atom_data, 52, 4)); - $atom_structure['matrix_d'] = getid3_lib::FixedPoint16_16(substr($atom_data, 56, 4)); - $atom_structure['matrix_v'] = getid3_lib::FixedPoint2_30(substr($atom_data, 60, 4)); - $atom_structure['matrix_x'] = getid3_lib::FixedPoint16_16(substr($atom_data, 64, 4)); - $atom_structure['matrix_y'] = getid3_lib::FixedPoint16_16(substr($atom_data, 68, 4)); - $atom_structure['matrix_w'] = getid3_lib::FixedPoint2_30(substr($atom_data, 72, 4)); - $atom_structure['width'] = getid3_lib::FixedPoint16_16(substr($atom_data, 76, 4)); - $atom_structure['height'] = getid3_lib::FixedPoint16_16(substr($atom_data, 80, 4)); - $atom_structure['flags']['enabled'] = (bool) ($atom_structure['flags_raw'] & 0x0001); - $atom_structure['flags']['in_movie'] = (bool) ($atom_structure['flags_raw'] & 0x0002); - $atom_structure['flags']['in_preview'] = (bool) ($atom_structure['flags_raw'] & 0x0004); - $atom_structure['flags']['in_poster'] = (bool) ($atom_structure['flags_raw'] & 0x0008); - $atom_structure['creation_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['creation_time']); - $atom_structure['modify_time_unix'] = getid3_lib::DateMac2Unix($atom_structure['modify_time']); - - if ($atom_structure['flags']['enabled'] == 1) { - if (!isset($info['video']['resolution_x']) || !isset($info['video']['resolution_y'])) { - $info['video']['resolution_x'] = $atom_structure['width']; - $info['video']['resolution_y'] = $atom_structure['height']; - } - $info['video']['resolution_x'] = max($info['video']['resolution_x'], $atom_structure['width']); - $info['video']['resolution_y'] = max($info['video']['resolution_y'], $atom_structure['height']); - $info['quicktime']['video']['resolution_x'] = $info['video']['resolution_x']; - $info['quicktime']['video']['resolution_y'] = $info['video']['resolution_y']; - } else { - // see: http://www.getid3.org/phpBB3/viewtopic.php?t=1295 - //if (isset($info['video']['resolution_x'])) { unset($info['video']['resolution_x']); } - //if (isset($info['video']['resolution_y'])) { unset($info['video']['resolution_y']); } - //if (isset($info['quicktime']['video'])) { unset($info['quicktime']['video']); } - } - break; - - - case 'iods': // Initial Object DeScriptor atom - // http://www.koders.com/c/fid1FAB3E762903DC482D8A246D4A4BF9F28E049594.aspx?s=windows.h - // http://libquicktime.sourcearchive.com/documentation/1.0.2plus-pdebian/iods_8c-source.html - $offset = 0; - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); - $offset += 1; - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 3)); - $offset += 3; - $atom_structure['mp4_iod_tag'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); - $offset += 1; - $atom_structure['length'] = $this->quicktime_read_mp4_descr_length($atom_data, $offset); - //$offset already adjusted by quicktime_read_mp4_descr_length() - $atom_structure['object_descriptor_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2)); - $offset += 2; - $atom_structure['od_profile_level'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); - $offset += 1; - $atom_structure['scene_profile_level'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); - $offset += 1; - $atom_structure['audio_profile_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); - $offset += 1; - $atom_structure['video_profile_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); - $offset += 1; - $atom_structure['graphics_profile_level'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); - $offset += 1; - - $atom_structure['num_iods_tracks'] = ($atom_structure['length'] - 7) / 6; // 6 bytes would only be right if all tracks use 1-byte length fields - for ($i = 0; $i < $atom_structure['num_iods_tracks']; $i++) { - $atom_structure['track'][$i]['ES_ID_IncTag'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 1)); - $offset += 1; - $atom_structure['track'][$i]['length'] = $this->quicktime_read_mp4_descr_length($atom_data, $offset); - //$offset already adjusted by quicktime_read_mp4_descr_length() - $atom_structure['track'][$i]['track_id'] = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 4)); - $offset += 4; - } - - $atom_structure['audio_profile_name'] = $this->QuicktimeIODSaudioProfileName($atom_structure['audio_profile_id']); - $atom_structure['video_profile_name'] = $this->QuicktimeIODSvideoProfileName($atom_structure['video_profile_id']); - break; - - case 'ftyp': // FileTYPe (?) atom (for MP4 it seems) - $atom_structure['signature'] = substr($atom_data, 0, 4); - $atom_structure['unknown_1'] = getid3_lib::BigEndian2Int(substr($atom_data, 4, 4)); - $atom_structure['fourcc'] = substr($atom_data, 8, 4); - break; - - case 'mdat': // Media DATa atom - // 'mdat' contains the actual data for the audio/video, possibly also subtitles - -/* due to lack of known documentation, this is a kludge implementation. If you know of documentation on how mdat is properly structed, please send it to info@getid3.org */ - - // first, skip any 'wide' padding, and second 'mdat' header (with specified size of zero?) - $mdat_offset = 0; - while (true) { - if (substr($atom_data, $mdat_offset, 8) == "\x00\x00\x00\x08".'wide') { - $mdat_offset += 8; - } elseif (substr($atom_data, $mdat_offset, 8) == "\x00\x00\x00\x00".'mdat') { - $mdat_offset += 8; - } else { - break; - } - } - - // check to see if it looks like chapter titles, in the form of unterminated strings with a leading 16-bit size field - while (($chapter_string_length = getid3_lib::BigEndian2Int(substr($atom_data, $mdat_offset, 2))) - && ($chapter_string_length < 1000) - && ($chapter_string_length <= (strlen($atom_data) - $mdat_offset - 2)) - && preg_match('#^[\x20-\xFF]+$#', substr($atom_data, $mdat_offset + 2, $chapter_string_length), $chapter_matches)) { - $mdat_offset += (2 + $chapter_string_length); - @$info['quicktime']['comments']['chapters'][] = $chapter_matches[0]; - } - - - - if (($atomsize > 8) && (!isset($info['avdataend_tmp']) || ($info['quicktime'][$atomname]['size'] > ($info['avdataend_tmp'] - $info['avdataoffset'])))) { - - $info['avdataoffset'] = $atom_structure['offset'] + 8; // $info['quicktime'][$atomname]['offset'] + 8; - $OldAVDataEnd = $info['avdataend']; - $info['avdataend'] = $atom_structure['offset'] + $atom_structure['size']; // $info['quicktime'][$atomname]['offset'] + $info['quicktime'][$atomname]['size']; - - $getid3_temp = new getID3(); - $getid3_temp->openfile($this->getid3->filename); - $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; - $getid3_temp->info['avdataend'] = $info['avdataend']; - $getid3_mp3 = new getid3_mp3($getid3_temp); - if ($getid3_mp3->MPEGaudioHeaderValid($getid3_mp3->MPEGaudioHeaderDecode($this->fread(4)))) { - $getid3_mp3->getOnlyMPEGaudioInfo($getid3_temp->info['avdataoffset'], false); - if (!empty($getid3_temp->info['warning'])) { - foreach ($getid3_temp->info['warning'] as $value) { - $info['warning'][] = $value; - } - } - if (!empty($getid3_temp->info['mpeg'])) { - $info['mpeg'] = $getid3_temp->info['mpeg']; - if (isset($info['mpeg']['audio'])) { - $info['audio']['dataformat'] = 'mp3'; - $info['audio']['codec'] = (!empty($info['mpeg']['audio']['encoder']) ? $info['mpeg']['audio']['encoder'] : (!empty($info['mpeg']['audio']['codec']) ? $info['mpeg']['audio']['codec'] : (!empty($info['mpeg']['audio']['LAME']) ? 'LAME' :'mp3'))); - $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; - $info['audio']['channels'] = $info['mpeg']['audio']['channels']; - $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; - $info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); - $info['bitrate'] = $info['audio']['bitrate']; - } - } - } - unset($getid3_mp3, $getid3_temp); - $info['avdataend'] = $OldAVDataEnd; - unset($OldAVDataEnd); - - } - - unset($mdat_offset, $chapter_string_length, $chapter_matches); - break; - - case 'free': // FREE space atom - case 'skip': // SKIP atom - case 'wide': // 64-bit expansion placeholder atom - // 'free', 'skip' and 'wide' are just padding, contains no useful data at all - - // When writing QuickTime files, it is sometimes necessary to update an atom's size. - // It is impossible to update a 32-bit atom to a 64-bit atom since the 32-bit atom - // is only 8 bytes in size, and the 64-bit atom requires 16 bytes. Therefore, QuickTime - // puts an 8-byte placeholder atom before any atoms it may have to update the size of. - // In this way, if the atom needs to be converted from a 32-bit to a 64-bit atom, the - // placeholder atom can be overwritten to obtain the necessary 8 extra bytes. - // The placeholder atom has a type of kWideAtomPlaceholderType ( 'wide' ). - break; - - - case 'nsav': // NoSAVe atom - // http://developer.apple.com/technotes/tn/tn2038.html - $atom_structure['data'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); - break; - - case 'ctyp': // Controller TYPe atom (seen on QTVR) - // http://homepages.slingshot.co.nz/~helmboy/quicktime/formats/qtm-layout.txt - // some controller names are: - // 0x00 + 'std' for linear movie - // 'none' for no controls - $atom_structure['ctyp'] = substr($atom_data, 0, 4); - $info['quicktime']['controller'] = $atom_structure['ctyp']; - switch ($atom_structure['ctyp']) { - case 'qtvr': - $info['video']['dataformat'] = 'quicktimevr'; - break; - } - break; - - case 'pano': // PANOrama track (seen on QTVR) - $atom_structure['pano'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 4)); - break; - - case 'hint': // HINT track - case 'hinf': // - case 'hinv': // - case 'hnti': // - $info['quicktime']['hinting'] = true; - break; - - case 'imgt': // IMaGe Track reference (kQTVRImageTrackRefType) (seen on QTVR) - for ($i = 0; $i < ($atom_structure['size'] - 8); $i += 4) { - $atom_structure['imgt'][] = getid3_lib::BigEndian2Int(substr($atom_data, $i, 4)); - } - break; - - - // Observed-but-not-handled atom types are just listed here to prevent warnings being generated - case 'FXTC': // Something to do with Adobe After Effects (?) - case 'PrmA': - case 'code': - case 'FIEL': // this is NOT "fiel" (Field Ordering) as describe here: http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html - case 'tapt': // TrackApertureModeDimensionsAID - http://developer.apple.com/documentation/QuickTime/Reference/QT7-1_Update_Reference/Constants/Constants.html - // tapt seems to be used to compute the video size [http://www.getid3.org/phpBB3/viewtopic.php?t=838] - // * http://lists.apple.com/archives/quicktime-api/2006/Aug/msg00014.html - // * http://handbrake.fr/irclogs/handbrake-dev/handbrake-dev20080128_pg2.html - case 'ctts':// STCompositionOffsetAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html - case 'cslg':// STCompositionShiftLeastGreatestAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html - case 'sdtp':// STSampleDependencyAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html - case 'stps':// STPartialSyncSampleAID - http://developer.apple.com/documentation/QuickTime/Reference/QTRef_Constants/Reference/reference.html - //$atom_structure['data'] = $atom_data; - break; - - case "\xA9".'xyz': // GPS latitude+longitude+altitude - $atom_structure['data'] = $atom_data; - if (preg_match('#([\\+\\-][0-9\\.]+)([\\+\\-][0-9\\.]+)([\\+\\-][0-9\\.]+)?/$#i', $atom_data, $matches)) { - @list($all, $latitude, $longitude, $altitude) = $matches; - $info['quicktime']['comments']['gps_latitude'][] = floatval($latitude); - $info['quicktime']['comments']['gps_longitude'][] = floatval($longitude); - if (!empty($altitude)) { - $info['quicktime']['comments']['gps_altitude'][] = floatval($altitude); - } - } else { - $info['warning'][] = 'QuickTime atom "©xyz" data does not match expected data pattern at offset '.$baseoffset.'. Please report as getID3() bug.'; - } - break; - - case 'NCDT': - // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html - // Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some Nikon cameras such as the Coolpix S8000 and D5100 - $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 4, $atomHierarchy, $ParseAllPossibleAtoms); - break; - case 'NCTH': // Nikon Camera THumbnail image - case 'NCVW': // Nikon Camera preVieW image - // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html - if (preg_match('/^\xFF\xD8\xFF/', $atom_data)) { - $atom_structure['data'] = $atom_data; - $atom_structure['image_mime'] = 'image/jpeg'; - $atom_structure['description'] = (($atomname == 'NCTH') ? 'Nikon Camera Thumbnail Image' : (($atomname == 'NCVW') ? 'Nikon Camera Preview Image' : 'Nikon preview image')); - $info['quicktime']['comments']['picture'][] = array('image_mime'=>$atom_structure['image_mime'], 'data'=>$atom_data, 'description'=>$atom_structure['description']); - } - break; - case 'NCTG': // Nikon - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#NCTG - $atom_structure['data'] = $this->QuicktimeParseNikonNCTG($atom_data); - break; - case 'NCHD': // Nikon:MakerNoteVersion - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html - case 'NCDB': // Nikon - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html - case 'CNCV': // Canon:CompressorVersion - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Canon.html - $atom_structure['data'] = $atom_data; - break; - - case "\x00\x00\x00\x00": - case 'meta': // METAdata atom - // some kind of metacontainer, may contain a big data dump such as: - // mdta keys \005 mdtacom.apple.quicktime.make (mdtacom.apple.quicktime.creationdate ,mdtacom.apple.quicktime.location.ISO6709 $mdtacom.apple.quicktime.software !mdtacom.apple.quicktime.model ilst \01D \001 \015data \001DE\010Apple 0 \002 (data \001DE\0102011-05-11T17:54:04+0200 2 \003 *data \001DE\010+52.4936+013.3897+040.247/ \01D \004 \015data \001DE\0104.3.1 \005 \018data \001DE\010iPhone 4 - // http://www.geocities.com/xhelmboyx/quicktime/formats/qti-layout.txt - - $atom_structure['version'] = getid3_lib::BigEndian2Int(substr($atom_data, 0, 1)); - $atom_structure['flags_raw'] = getid3_lib::BigEndian2Int(substr($atom_data, 1, 3)); - $atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom(substr($atom_data, 4), $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); - //$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 8, $atomHierarchy, $ParseAllPossibleAtoms); - break; - - case 'data': // metaDATA atom - // seems to be 2 bytes language code (ASCII), 2 bytes unknown (set to 0x10B5 in sample I have), remainder is useful data - $atom_structure['language'] = substr($atom_data, 4 + 0, 2); - $atom_structure['unknown'] = getid3_lib::BigEndian2Int(substr($atom_data, 4 + 2, 2)); - $atom_structure['data'] = substr($atom_data, 4 + 4); - break; - - default: - $info['warning'][] = 'Unknown QuickTime atom type: "'.preg_replace('#[^a-zA-Z0-9 _\\-]#', '?', $atomname).'" ('.trim(getid3_lib::PrintHexBytes($atomname)).') at offset '.$baseoffset; - $atom_structure['data'] = $atom_data; - break; - } - array_pop($atomHierarchy); - return $atom_structure; - } - - public function QuicktimeParseContainerAtom($atom_data, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) { -//echo 'QuicktimeParseContainerAtom('.substr($atom_data, 4, 4).') @ '.$baseoffset.'

      '; - $atom_structure = false; - $subatomoffset = 0; - $subatomcounter = 0; - if ((strlen($atom_data) == 4) && (getid3_lib::BigEndian2Int($atom_data) == 0x00000000)) { - return false; - } - while ($subatomoffset < strlen($atom_data)) { - $subatomsize = getid3_lib::BigEndian2Int(substr($atom_data, $subatomoffset + 0, 4)); - $subatomname = substr($atom_data, $subatomoffset + 4, 4); - $subatomdata = substr($atom_data, $subatomoffset + 8, $subatomsize - 8); - if ($subatomsize == 0) { - // Furthermore, for historical reasons the list of atoms is optionally - // terminated by a 32-bit integer set to 0. If you are writing a program - // to read user data atoms, you should allow for the terminating 0. - return $atom_structure; - } - - $atom_structure[$subatomcounter] = $this->QuicktimeParseAtom($subatomname, $subatomsize, $subatomdata, $baseoffset + $subatomoffset, $atomHierarchy, $ParseAllPossibleAtoms); - - $subatomoffset += $subatomsize; - $subatomcounter++; - } - return $atom_structure; - } - - - public function quicktime_read_mp4_descr_length($data, &$offset) { - // http://libquicktime.sourcearchive.com/documentation/2:1.0.2plus-pdebian-2build1/esds_8c-source.html - $num_bytes = 0; - $length = 0; - do { - $b = ord(substr($data, $offset++, 1)); - $length = ($length << 7) | ($b & 0x7F); - } while (($b & 0x80) && ($num_bytes++ < 4)); - return $length; - } - - - public function QuicktimeLanguageLookup($languageid) { - // http://developer.apple.com/library/mac/#documentation/QuickTime/QTFF/QTFFChap4/qtff4.html#//apple_ref/doc/uid/TP40000939-CH206-34353 - static $QuicktimeLanguageLookup = array(); - if (empty($QuicktimeLanguageLookup)) { - $QuicktimeLanguageLookup[0] = 'English'; - $QuicktimeLanguageLookup[1] = 'French'; - $QuicktimeLanguageLookup[2] = 'German'; - $QuicktimeLanguageLookup[3] = 'Italian'; - $QuicktimeLanguageLookup[4] = 'Dutch'; - $QuicktimeLanguageLookup[5] = 'Swedish'; - $QuicktimeLanguageLookup[6] = 'Spanish'; - $QuicktimeLanguageLookup[7] = 'Danish'; - $QuicktimeLanguageLookup[8] = 'Portuguese'; - $QuicktimeLanguageLookup[9] = 'Norwegian'; - $QuicktimeLanguageLookup[10] = 'Hebrew'; - $QuicktimeLanguageLookup[11] = 'Japanese'; - $QuicktimeLanguageLookup[12] = 'Arabic'; - $QuicktimeLanguageLookup[13] = 'Finnish'; - $QuicktimeLanguageLookup[14] = 'Greek'; - $QuicktimeLanguageLookup[15] = 'Icelandic'; - $QuicktimeLanguageLookup[16] = 'Maltese'; - $QuicktimeLanguageLookup[17] = 'Turkish'; - $QuicktimeLanguageLookup[18] = 'Croatian'; - $QuicktimeLanguageLookup[19] = 'Chinese (Traditional)'; - $QuicktimeLanguageLookup[20] = 'Urdu'; - $QuicktimeLanguageLookup[21] = 'Hindi'; - $QuicktimeLanguageLookup[22] = 'Thai'; - $QuicktimeLanguageLookup[23] = 'Korean'; - $QuicktimeLanguageLookup[24] = 'Lithuanian'; - $QuicktimeLanguageLookup[25] = 'Polish'; - $QuicktimeLanguageLookup[26] = 'Hungarian'; - $QuicktimeLanguageLookup[27] = 'Estonian'; - $QuicktimeLanguageLookup[28] = 'Lettish'; - $QuicktimeLanguageLookup[28] = 'Latvian'; - $QuicktimeLanguageLookup[29] = 'Saamisk'; - $QuicktimeLanguageLookup[29] = 'Lappish'; - $QuicktimeLanguageLookup[30] = 'Faeroese'; - $QuicktimeLanguageLookup[31] = 'Farsi'; - $QuicktimeLanguageLookup[31] = 'Persian'; - $QuicktimeLanguageLookup[32] = 'Russian'; - $QuicktimeLanguageLookup[33] = 'Chinese (Simplified)'; - $QuicktimeLanguageLookup[34] = 'Flemish'; - $QuicktimeLanguageLookup[35] = 'Irish'; - $QuicktimeLanguageLookup[36] = 'Albanian'; - $QuicktimeLanguageLookup[37] = 'Romanian'; - $QuicktimeLanguageLookup[38] = 'Czech'; - $QuicktimeLanguageLookup[39] = 'Slovak'; - $QuicktimeLanguageLookup[40] = 'Slovenian'; - $QuicktimeLanguageLookup[41] = 'Yiddish'; - $QuicktimeLanguageLookup[42] = 'Serbian'; - $QuicktimeLanguageLookup[43] = 'Macedonian'; - $QuicktimeLanguageLookup[44] = 'Bulgarian'; - $QuicktimeLanguageLookup[45] = 'Ukrainian'; - $QuicktimeLanguageLookup[46] = 'Byelorussian'; - $QuicktimeLanguageLookup[47] = 'Uzbek'; - $QuicktimeLanguageLookup[48] = 'Kazakh'; - $QuicktimeLanguageLookup[49] = 'Azerbaijani'; - $QuicktimeLanguageLookup[50] = 'AzerbaijanAr'; - $QuicktimeLanguageLookup[51] = 'Armenian'; - $QuicktimeLanguageLookup[52] = 'Georgian'; - $QuicktimeLanguageLookup[53] = 'Moldavian'; - $QuicktimeLanguageLookup[54] = 'Kirghiz'; - $QuicktimeLanguageLookup[55] = 'Tajiki'; - $QuicktimeLanguageLookup[56] = 'Turkmen'; - $QuicktimeLanguageLookup[57] = 'Mongolian'; - $QuicktimeLanguageLookup[58] = 'MongolianCyr'; - $QuicktimeLanguageLookup[59] = 'Pashto'; - $QuicktimeLanguageLookup[60] = 'Kurdish'; - $QuicktimeLanguageLookup[61] = 'Kashmiri'; - $QuicktimeLanguageLookup[62] = 'Sindhi'; - $QuicktimeLanguageLookup[63] = 'Tibetan'; - $QuicktimeLanguageLookup[64] = 'Nepali'; - $QuicktimeLanguageLookup[65] = 'Sanskrit'; - $QuicktimeLanguageLookup[66] = 'Marathi'; - $QuicktimeLanguageLookup[67] = 'Bengali'; - $QuicktimeLanguageLookup[68] = 'Assamese'; - $QuicktimeLanguageLookup[69] = 'Gujarati'; - $QuicktimeLanguageLookup[70] = 'Punjabi'; - $QuicktimeLanguageLookup[71] = 'Oriya'; - $QuicktimeLanguageLookup[72] = 'Malayalam'; - $QuicktimeLanguageLookup[73] = 'Kannada'; - $QuicktimeLanguageLookup[74] = 'Tamil'; - $QuicktimeLanguageLookup[75] = 'Telugu'; - $QuicktimeLanguageLookup[76] = 'Sinhalese'; - $QuicktimeLanguageLookup[77] = 'Burmese'; - $QuicktimeLanguageLookup[78] = 'Khmer'; - $QuicktimeLanguageLookup[79] = 'Lao'; - $QuicktimeLanguageLookup[80] = 'Vietnamese'; - $QuicktimeLanguageLookup[81] = 'Indonesian'; - $QuicktimeLanguageLookup[82] = 'Tagalog'; - $QuicktimeLanguageLookup[83] = 'MalayRoman'; - $QuicktimeLanguageLookup[84] = 'MalayArabic'; - $QuicktimeLanguageLookup[85] = 'Amharic'; - $QuicktimeLanguageLookup[86] = 'Tigrinya'; - $QuicktimeLanguageLookup[87] = 'Galla'; - $QuicktimeLanguageLookup[87] = 'Oromo'; - $QuicktimeLanguageLookup[88] = 'Somali'; - $QuicktimeLanguageLookup[89] = 'Swahili'; - $QuicktimeLanguageLookup[90] = 'Ruanda'; - $QuicktimeLanguageLookup[91] = 'Rundi'; - $QuicktimeLanguageLookup[92] = 'Chewa'; - $QuicktimeLanguageLookup[93] = 'Malagasy'; - $QuicktimeLanguageLookup[94] = 'Esperanto'; - $QuicktimeLanguageLookup[128] = 'Welsh'; - $QuicktimeLanguageLookup[129] = 'Basque'; - $QuicktimeLanguageLookup[130] = 'Catalan'; - $QuicktimeLanguageLookup[131] = 'Latin'; - $QuicktimeLanguageLookup[132] = 'Quechua'; - $QuicktimeLanguageLookup[133] = 'Guarani'; - $QuicktimeLanguageLookup[134] = 'Aymara'; - $QuicktimeLanguageLookup[135] = 'Tatar'; - $QuicktimeLanguageLookup[136] = 'Uighur'; - $QuicktimeLanguageLookup[137] = 'Dzongkha'; - $QuicktimeLanguageLookup[138] = 'JavaneseRom'; - $QuicktimeLanguageLookup[32767] = 'Unspecified'; - } - if (($languageid > 138) && ($languageid < 32767)) { - /* - ISO Language Codes - http://www.loc.gov/standards/iso639-2/php/code_list.php - Because the language codes specified by ISO 639-2/T are three characters long, they must be packed to fit into a 16-bit field. - The packing algorithm must map each of the three characters, which are always lowercase, into a 5-bit integer and then concatenate - these integers into the least significant 15 bits of a 16-bit integer, leaving the 16-bit integer's most significant bit set to zero. - - One algorithm for performing this packing is to treat each ISO character as a 16-bit integer. Subtract 0x60 from the first character - and multiply by 2^10 (0x400), subtract 0x60 from the second character and multiply by 2^5 (0x20), subtract 0x60 from the third character, - and add the three 16-bit values. This will result in a single 16-bit value with the three codes correctly packed into the 15 least - significant bits and the most significant bit set to zero. - */ - $iso_language_id = ''; - $iso_language_id .= chr((($languageid & 0x7C00) >> 10) + 0x60); - $iso_language_id .= chr((($languageid & 0x03E0) >> 5) + 0x60); - $iso_language_id .= chr((($languageid & 0x001F) >> 0) + 0x60); - $QuicktimeLanguageLookup[$languageid] = getid3_id3v2::LanguageLookup($iso_language_id); - } - return (isset($QuicktimeLanguageLookup[$languageid]) ? $QuicktimeLanguageLookup[$languageid] : 'invalid'); - } - - public function QuicktimeVideoCodecLookup($codecid) { - static $QuicktimeVideoCodecLookup = array(); - if (empty($QuicktimeVideoCodecLookup)) { - $QuicktimeVideoCodecLookup['.SGI'] = 'SGI'; - $QuicktimeVideoCodecLookup['3IV1'] = '3ivx MPEG-4 v1'; - $QuicktimeVideoCodecLookup['3IV2'] = '3ivx MPEG-4 v2'; - $QuicktimeVideoCodecLookup['3IVX'] = '3ivx MPEG-4'; - $QuicktimeVideoCodecLookup['8BPS'] = 'Planar RGB'; - $QuicktimeVideoCodecLookup['avc1'] = 'H.264/MPEG-4 AVC'; - $QuicktimeVideoCodecLookup['avr '] = 'AVR-JPEG'; - $QuicktimeVideoCodecLookup['b16g'] = '16Gray'; - $QuicktimeVideoCodecLookup['b32a'] = '32AlphaGray'; - $QuicktimeVideoCodecLookup['b48r'] = '48RGB'; - $QuicktimeVideoCodecLookup['b64a'] = '64ARGB'; - $QuicktimeVideoCodecLookup['base'] = 'Base'; - $QuicktimeVideoCodecLookup['clou'] = 'Cloud'; - $QuicktimeVideoCodecLookup['cmyk'] = 'CMYK'; - $QuicktimeVideoCodecLookup['cvid'] = 'Cinepak'; - $QuicktimeVideoCodecLookup['dmb1'] = 'OpenDML JPEG'; - $QuicktimeVideoCodecLookup['dvc '] = 'DVC-NTSC'; - $QuicktimeVideoCodecLookup['dvcp'] = 'DVC-PAL'; - $QuicktimeVideoCodecLookup['dvpn'] = 'DVCPro-NTSC'; - $QuicktimeVideoCodecLookup['dvpp'] = 'DVCPro-PAL'; - $QuicktimeVideoCodecLookup['fire'] = 'Fire'; - $QuicktimeVideoCodecLookup['flic'] = 'FLC'; - $QuicktimeVideoCodecLookup['gif '] = 'GIF'; - $QuicktimeVideoCodecLookup['h261'] = 'H261'; - $QuicktimeVideoCodecLookup['h263'] = 'H263'; - $QuicktimeVideoCodecLookup['IV41'] = 'Indeo4'; - $QuicktimeVideoCodecLookup['jpeg'] = 'JPEG'; - $QuicktimeVideoCodecLookup['kpcd'] = 'PhotoCD'; - $QuicktimeVideoCodecLookup['mjpa'] = 'Motion JPEG-A'; - $QuicktimeVideoCodecLookup['mjpb'] = 'Motion JPEG-B'; - $QuicktimeVideoCodecLookup['msvc'] = 'Microsoft Video1'; - $QuicktimeVideoCodecLookup['myuv'] = 'MPEG YUV420'; - $QuicktimeVideoCodecLookup['path'] = 'Vector'; - $QuicktimeVideoCodecLookup['png '] = 'PNG'; - $QuicktimeVideoCodecLookup['PNTG'] = 'MacPaint'; - $QuicktimeVideoCodecLookup['qdgx'] = 'QuickDrawGX'; - $QuicktimeVideoCodecLookup['qdrw'] = 'QuickDraw'; - $QuicktimeVideoCodecLookup['raw '] = 'RAW'; - $QuicktimeVideoCodecLookup['ripl'] = 'WaterRipple'; - $QuicktimeVideoCodecLookup['rpza'] = 'Video'; - $QuicktimeVideoCodecLookup['smc '] = 'Graphics'; - $QuicktimeVideoCodecLookup['SVQ1'] = 'Sorenson Video 1'; - $QuicktimeVideoCodecLookup['SVQ1'] = 'Sorenson Video 3'; - $QuicktimeVideoCodecLookup['syv9'] = 'Sorenson YUV9'; - $QuicktimeVideoCodecLookup['tga '] = 'Targa'; - $QuicktimeVideoCodecLookup['tiff'] = 'TIFF'; - $QuicktimeVideoCodecLookup['WRAW'] = 'Windows RAW'; - $QuicktimeVideoCodecLookup['WRLE'] = 'BMP'; - $QuicktimeVideoCodecLookup['y420'] = 'YUV420'; - $QuicktimeVideoCodecLookup['yuv2'] = 'ComponentVideo'; - $QuicktimeVideoCodecLookup['yuvs'] = 'ComponentVideoUnsigned'; - $QuicktimeVideoCodecLookup['yuvu'] = 'ComponentVideoSigned'; - } - return (isset($QuicktimeVideoCodecLookup[$codecid]) ? $QuicktimeVideoCodecLookup[$codecid] : ''); - } - - public function QuicktimeAudioCodecLookup($codecid) { - static $QuicktimeAudioCodecLookup = array(); - if (empty($QuicktimeAudioCodecLookup)) { - $QuicktimeAudioCodecLookup['.mp3'] = 'Fraunhofer MPEG Layer-III alias'; - $QuicktimeAudioCodecLookup['aac '] = 'ISO/IEC 14496-3 AAC'; - $QuicktimeAudioCodecLookup['agsm'] = 'Apple GSM 10:1'; - $QuicktimeAudioCodecLookup['alac'] = 'Apple Lossless Audio Codec'; - $QuicktimeAudioCodecLookup['alaw'] = 'A-law 2:1'; - $QuicktimeAudioCodecLookup['conv'] = 'Sample Format'; - $QuicktimeAudioCodecLookup['dvca'] = 'DV'; - $QuicktimeAudioCodecLookup['dvi '] = 'DV 4:1'; - $QuicktimeAudioCodecLookup['eqal'] = 'Frequency Equalizer'; - $QuicktimeAudioCodecLookup['fl32'] = '32-bit Floating Point'; - $QuicktimeAudioCodecLookup['fl64'] = '64-bit Floating Point'; - $QuicktimeAudioCodecLookup['ima4'] = 'Interactive Multimedia Association 4:1'; - $QuicktimeAudioCodecLookup['in24'] = '24-bit Integer'; - $QuicktimeAudioCodecLookup['in32'] = '32-bit Integer'; - $QuicktimeAudioCodecLookup['lpc '] = 'LPC 23:1'; - $QuicktimeAudioCodecLookup['MAC3'] = 'Macintosh Audio Compression/Expansion (MACE) 3:1'; - $QuicktimeAudioCodecLookup['MAC6'] = 'Macintosh Audio Compression/Expansion (MACE) 6:1'; - $QuicktimeAudioCodecLookup['mixb'] = '8-bit Mixer'; - $QuicktimeAudioCodecLookup['mixw'] = '16-bit Mixer'; - $QuicktimeAudioCodecLookup['mp4a'] = 'ISO/IEC 14496-3 AAC'; - $QuicktimeAudioCodecLookup['MS'."\x00\x02"] = 'Microsoft ADPCM'; - $QuicktimeAudioCodecLookup['MS'."\x00\x11"] = 'DV IMA'; - $QuicktimeAudioCodecLookup['MS'."\x00\x55"] = 'Fraunhofer MPEG Layer III'; - $QuicktimeAudioCodecLookup['NONE'] = 'No Encoding'; - $QuicktimeAudioCodecLookup['Qclp'] = 'Qualcomm PureVoice'; - $QuicktimeAudioCodecLookup['QDM2'] = 'QDesign Music 2'; - $QuicktimeAudioCodecLookup['QDMC'] = 'QDesign Music 1'; - $QuicktimeAudioCodecLookup['ratb'] = '8-bit Rate'; - $QuicktimeAudioCodecLookup['ratw'] = '16-bit Rate'; - $QuicktimeAudioCodecLookup['raw '] = 'raw PCM'; - $QuicktimeAudioCodecLookup['sour'] = 'Sound Source'; - $QuicktimeAudioCodecLookup['sowt'] = 'signed/two\'s complement (Little Endian)'; - $QuicktimeAudioCodecLookup['str1'] = 'Iomega MPEG layer II'; - $QuicktimeAudioCodecLookup['str2'] = 'Iomega MPEG *layer II'; - $QuicktimeAudioCodecLookup['str3'] = 'Iomega MPEG **layer II'; - $QuicktimeAudioCodecLookup['str4'] = 'Iomega MPEG ***layer II'; - $QuicktimeAudioCodecLookup['twos'] = 'signed/two\'s complement (Big Endian)'; - $QuicktimeAudioCodecLookup['ulaw'] = 'mu-law 2:1'; - } - return (isset($QuicktimeAudioCodecLookup[$codecid]) ? $QuicktimeAudioCodecLookup[$codecid] : ''); - } - - public function QuicktimeDCOMLookup($compressionid) { - static $QuicktimeDCOMLookup = array(); - if (empty($QuicktimeDCOMLookup)) { - $QuicktimeDCOMLookup['zlib'] = 'ZLib Deflate'; - $QuicktimeDCOMLookup['adec'] = 'Apple Compression'; - } - return (isset($QuicktimeDCOMLookup[$compressionid]) ? $QuicktimeDCOMLookup[$compressionid] : ''); - } - - public function QuicktimeColorNameLookup($colordepthid) { - static $QuicktimeColorNameLookup = array(); - if (empty($QuicktimeColorNameLookup)) { - $QuicktimeColorNameLookup[1] = '2-color (monochrome)'; - $QuicktimeColorNameLookup[2] = '4-color'; - $QuicktimeColorNameLookup[4] = '16-color'; - $QuicktimeColorNameLookup[8] = '256-color'; - $QuicktimeColorNameLookup[16] = 'thousands (16-bit color)'; - $QuicktimeColorNameLookup[24] = 'millions (24-bit color)'; - $QuicktimeColorNameLookup[32] = 'millions+ (32-bit color)'; - $QuicktimeColorNameLookup[33] = 'black & white'; - $QuicktimeColorNameLookup[34] = '4-gray'; - $QuicktimeColorNameLookup[36] = '16-gray'; - $QuicktimeColorNameLookup[40] = '256-gray'; - } - return (isset($QuicktimeColorNameLookup[$colordepthid]) ? $QuicktimeColorNameLookup[$colordepthid] : 'invalid'); - } - - public function QuicktimeSTIKLookup($stik) { - static $QuicktimeSTIKLookup = array(); - if (empty($QuicktimeSTIKLookup)) { - $QuicktimeSTIKLookup[0] = 'Movie'; - $QuicktimeSTIKLookup[1] = 'Normal'; - $QuicktimeSTIKLookup[2] = 'Audiobook'; - $QuicktimeSTIKLookup[5] = 'Whacked Bookmark'; - $QuicktimeSTIKLookup[6] = 'Music Video'; - $QuicktimeSTIKLookup[9] = 'Short Film'; - $QuicktimeSTIKLookup[10] = 'TV Show'; - $QuicktimeSTIKLookup[11] = 'Booklet'; - $QuicktimeSTIKLookup[14] = 'Ringtone'; - $QuicktimeSTIKLookup[21] = 'Podcast'; - } - return (isset($QuicktimeSTIKLookup[$stik]) ? $QuicktimeSTIKLookup[$stik] : 'invalid'); - } - - public function QuicktimeIODSaudioProfileName($audio_profile_id) { - static $QuicktimeIODSaudioProfileNameLookup = array(); - if (empty($QuicktimeIODSaudioProfileNameLookup)) { - $QuicktimeIODSaudioProfileNameLookup = array( - 0x00 => 'ISO Reserved (0x00)', - 0x01 => 'Main Audio Profile @ Level 1', - 0x02 => 'Main Audio Profile @ Level 2', - 0x03 => 'Main Audio Profile @ Level 3', - 0x04 => 'Main Audio Profile @ Level 4', - 0x05 => 'Scalable Audio Profile @ Level 1', - 0x06 => 'Scalable Audio Profile @ Level 2', - 0x07 => 'Scalable Audio Profile @ Level 3', - 0x08 => 'Scalable Audio Profile @ Level 4', - 0x09 => 'Speech Audio Profile @ Level 1', - 0x0A => 'Speech Audio Profile @ Level 2', - 0x0B => 'Synthetic Audio Profile @ Level 1', - 0x0C => 'Synthetic Audio Profile @ Level 2', - 0x0D => 'Synthetic Audio Profile @ Level 3', - 0x0E => 'High Quality Audio Profile @ Level 1', - 0x0F => 'High Quality Audio Profile @ Level 2', - 0x10 => 'High Quality Audio Profile @ Level 3', - 0x11 => 'High Quality Audio Profile @ Level 4', - 0x12 => 'High Quality Audio Profile @ Level 5', - 0x13 => 'High Quality Audio Profile @ Level 6', - 0x14 => 'High Quality Audio Profile @ Level 7', - 0x15 => 'High Quality Audio Profile @ Level 8', - 0x16 => 'Low Delay Audio Profile @ Level 1', - 0x17 => 'Low Delay Audio Profile @ Level 2', - 0x18 => 'Low Delay Audio Profile @ Level 3', - 0x19 => 'Low Delay Audio Profile @ Level 4', - 0x1A => 'Low Delay Audio Profile @ Level 5', - 0x1B => 'Low Delay Audio Profile @ Level 6', - 0x1C => 'Low Delay Audio Profile @ Level 7', - 0x1D => 'Low Delay Audio Profile @ Level 8', - 0x1E => 'Natural Audio Profile @ Level 1', - 0x1F => 'Natural Audio Profile @ Level 2', - 0x20 => 'Natural Audio Profile @ Level 3', - 0x21 => 'Natural Audio Profile @ Level 4', - 0x22 => 'Mobile Audio Internetworking Profile @ Level 1', - 0x23 => 'Mobile Audio Internetworking Profile @ Level 2', - 0x24 => 'Mobile Audio Internetworking Profile @ Level 3', - 0x25 => 'Mobile Audio Internetworking Profile @ Level 4', - 0x26 => 'Mobile Audio Internetworking Profile @ Level 5', - 0x27 => 'Mobile Audio Internetworking Profile @ Level 6', - 0x28 => 'AAC Profile @ Level 1', - 0x29 => 'AAC Profile @ Level 2', - 0x2A => 'AAC Profile @ Level 4', - 0x2B => 'AAC Profile @ Level 5', - 0x2C => 'High Efficiency AAC Profile @ Level 2', - 0x2D => 'High Efficiency AAC Profile @ Level 3', - 0x2E => 'High Efficiency AAC Profile @ Level 4', - 0x2F => 'High Efficiency AAC Profile @ Level 5', - 0xFE => 'Not part of MPEG-4 audio profiles', - 0xFF => 'No audio capability required', - ); - } - return (isset($QuicktimeIODSaudioProfileNameLookup[$audio_profile_id]) ? $QuicktimeIODSaudioProfileNameLookup[$audio_profile_id] : 'ISO Reserved / User Private'); - } - - - public function QuicktimeIODSvideoProfileName($video_profile_id) { - static $QuicktimeIODSvideoProfileNameLookup = array(); - if (empty($QuicktimeIODSvideoProfileNameLookup)) { - $QuicktimeIODSvideoProfileNameLookup = array( - 0x00 => 'Reserved (0x00) Profile', - 0x01 => 'Simple Profile @ Level 1', - 0x02 => 'Simple Profile @ Level 2', - 0x03 => 'Simple Profile @ Level 3', - 0x08 => 'Simple Profile @ Level 0', - 0x10 => 'Simple Scalable Profile @ Level 0', - 0x11 => 'Simple Scalable Profile @ Level 1', - 0x12 => 'Simple Scalable Profile @ Level 2', - 0x15 => 'AVC/H264 Profile', - 0x21 => 'Core Profile @ Level 1', - 0x22 => 'Core Profile @ Level 2', - 0x32 => 'Main Profile @ Level 2', - 0x33 => 'Main Profile @ Level 3', - 0x34 => 'Main Profile @ Level 4', - 0x42 => 'N-bit Profile @ Level 2', - 0x51 => 'Scalable Texture Profile @ Level 1', - 0x61 => 'Simple Face Animation Profile @ Level 1', - 0x62 => 'Simple Face Animation Profile @ Level 2', - 0x63 => 'Simple FBA Profile @ Level 1', - 0x64 => 'Simple FBA Profile @ Level 2', - 0x71 => 'Basic Animated Texture Profile @ Level 1', - 0x72 => 'Basic Animated Texture Profile @ Level 2', - 0x81 => 'Hybrid Profile @ Level 1', - 0x82 => 'Hybrid Profile @ Level 2', - 0x91 => 'Advanced Real Time Simple Profile @ Level 1', - 0x92 => 'Advanced Real Time Simple Profile @ Level 2', - 0x93 => 'Advanced Real Time Simple Profile @ Level 3', - 0x94 => 'Advanced Real Time Simple Profile @ Level 4', - 0xA1 => 'Core Scalable Profile @ Level1', - 0xA2 => 'Core Scalable Profile @ Level2', - 0xA3 => 'Core Scalable Profile @ Level3', - 0xB1 => 'Advanced Coding Efficiency Profile @ Level 1', - 0xB2 => 'Advanced Coding Efficiency Profile @ Level 2', - 0xB3 => 'Advanced Coding Efficiency Profile @ Level 3', - 0xB4 => 'Advanced Coding Efficiency Profile @ Level 4', - 0xC1 => 'Advanced Core Profile @ Level 1', - 0xC2 => 'Advanced Core Profile @ Level 2', - 0xD1 => 'Advanced Scalable Texture @ Level1', - 0xD2 => 'Advanced Scalable Texture @ Level2', - 0xE1 => 'Simple Studio Profile @ Level 1', - 0xE2 => 'Simple Studio Profile @ Level 2', - 0xE3 => 'Simple Studio Profile @ Level 3', - 0xE4 => 'Simple Studio Profile @ Level 4', - 0xE5 => 'Core Studio Profile @ Level 1', - 0xE6 => 'Core Studio Profile @ Level 2', - 0xE7 => 'Core Studio Profile @ Level 3', - 0xE8 => 'Core Studio Profile @ Level 4', - 0xF0 => 'Advanced Simple Profile @ Level 0', - 0xF1 => 'Advanced Simple Profile @ Level 1', - 0xF2 => 'Advanced Simple Profile @ Level 2', - 0xF3 => 'Advanced Simple Profile @ Level 3', - 0xF4 => 'Advanced Simple Profile @ Level 4', - 0xF5 => 'Advanced Simple Profile @ Level 5', - 0xF7 => 'Advanced Simple Profile @ Level 3b', - 0xF8 => 'Fine Granularity Scalable Profile @ Level 0', - 0xF9 => 'Fine Granularity Scalable Profile @ Level 1', - 0xFA => 'Fine Granularity Scalable Profile @ Level 2', - 0xFB => 'Fine Granularity Scalable Profile @ Level 3', - 0xFC => 'Fine Granularity Scalable Profile @ Level 4', - 0xFD => 'Fine Granularity Scalable Profile @ Level 5', - 0xFE => 'Not part of MPEG-4 Visual profiles', - 0xFF => 'No visual capability required', - ); - } - return (isset($QuicktimeIODSvideoProfileNameLookup[$video_profile_id]) ? $QuicktimeIODSvideoProfileNameLookup[$video_profile_id] : 'ISO Reserved Profile'); - } - - - public function QuicktimeContentRatingLookup($rtng) { - static $QuicktimeContentRatingLookup = array(); - if (empty($QuicktimeContentRatingLookup)) { - $QuicktimeContentRatingLookup[0] = 'None'; - $QuicktimeContentRatingLookup[2] = 'Clean'; - $QuicktimeContentRatingLookup[4] = 'Explicit'; - } - return (isset($QuicktimeContentRatingLookup[$rtng]) ? $QuicktimeContentRatingLookup[$rtng] : 'invalid'); - } - - public function QuicktimeStoreAccountTypeLookup($akid) { - static $QuicktimeStoreAccountTypeLookup = array(); - if (empty($QuicktimeStoreAccountTypeLookup)) { - $QuicktimeStoreAccountTypeLookup[0] = 'iTunes'; - $QuicktimeStoreAccountTypeLookup[1] = 'AOL'; - } - return (isset($QuicktimeStoreAccountTypeLookup[$akid]) ? $QuicktimeStoreAccountTypeLookup[$akid] : 'invalid'); - } - - public function QuicktimeStoreFrontCodeLookup($sfid) { - static $QuicktimeStoreFrontCodeLookup = array(); - if (empty($QuicktimeStoreFrontCodeLookup)) { - $QuicktimeStoreFrontCodeLookup[143460] = 'Australia'; - $QuicktimeStoreFrontCodeLookup[143445] = 'Austria'; - $QuicktimeStoreFrontCodeLookup[143446] = 'Belgium'; - $QuicktimeStoreFrontCodeLookup[143455] = 'Canada'; - $QuicktimeStoreFrontCodeLookup[143458] = 'Denmark'; - $QuicktimeStoreFrontCodeLookup[143447] = 'Finland'; - $QuicktimeStoreFrontCodeLookup[143442] = 'France'; - $QuicktimeStoreFrontCodeLookup[143443] = 'Germany'; - $QuicktimeStoreFrontCodeLookup[143448] = 'Greece'; - $QuicktimeStoreFrontCodeLookup[143449] = 'Ireland'; - $QuicktimeStoreFrontCodeLookup[143450] = 'Italy'; - $QuicktimeStoreFrontCodeLookup[143462] = 'Japan'; - $QuicktimeStoreFrontCodeLookup[143451] = 'Luxembourg'; - $QuicktimeStoreFrontCodeLookup[143452] = 'Netherlands'; - $QuicktimeStoreFrontCodeLookup[143461] = 'New Zealand'; - $QuicktimeStoreFrontCodeLookup[143457] = 'Norway'; - $QuicktimeStoreFrontCodeLookup[143453] = 'Portugal'; - $QuicktimeStoreFrontCodeLookup[143454] = 'Spain'; - $QuicktimeStoreFrontCodeLookup[143456] = 'Sweden'; - $QuicktimeStoreFrontCodeLookup[143459] = 'Switzerland'; - $QuicktimeStoreFrontCodeLookup[143444] = 'United Kingdom'; - $QuicktimeStoreFrontCodeLookup[143441] = 'United States'; - } - return (isset($QuicktimeStoreFrontCodeLookup[$sfid]) ? $QuicktimeStoreFrontCodeLookup[$sfid] : 'invalid'); - } - - public function QuicktimeParseNikonNCTG($atom_data) { - // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#NCTG - // Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some Nikon cameras such as the Coolpix S8000 and D5100 - // Data is stored as records of: - // * 4 bytes record type - // * 2 bytes size of data field type: - // 0x0001 = flag (size field *= 1-byte) - // 0x0002 = char (size field *= 1-byte) - // 0x0003 = DWORD+ (size field *= 2-byte), values are stored CDAB - // 0x0004 = QWORD+ (size field *= 4-byte), values are stored EFGHABCD - // 0x0005 = float (size field *= 8-byte), values are stored aaaabbbb where value is aaaa/bbbb; possibly multiple sets of values appended together - // 0x0007 = bytes (size field *= 1-byte), values are stored as ?????? - // 0x0008 = ????? (size field *= 2-byte), values are stored as ?????? - // * 2 bytes data size field - // * ? bytes data (string data may be null-padded; datestamp fields are in the format "2011:05:25 20:24:15") - // all integers are stored BigEndian - - $NCTGtagName = array( - 0x00000001 => 'Make', - 0x00000002 => 'Model', - 0x00000003 => 'Software', - 0x00000011 => 'CreateDate', - 0x00000012 => 'DateTimeOriginal', - 0x00000013 => 'FrameCount', - 0x00000016 => 'FrameRate', - 0x00000022 => 'FrameWidth', - 0x00000023 => 'FrameHeight', - 0x00000032 => 'AudioChannels', - 0x00000033 => 'AudioBitsPerSample', - 0x00000034 => 'AudioSampleRate', - 0x02000001 => 'MakerNoteVersion', - 0x02000005 => 'WhiteBalance', - 0x0200000b => 'WhiteBalanceFineTune', - 0x0200001e => 'ColorSpace', - 0x02000023 => 'PictureControlData', - 0x02000024 => 'WorldTime', - 0x02000032 => 'UnknownInfo', - 0x02000083 => 'LensType', - 0x02000084 => 'Lens', - ); - - $offset = 0; - $datalength = strlen($atom_data); - $parsed = array(); - while ($offset < $datalength) { -//echo getid3_lib::PrintHexBytes(substr($atom_data, $offset, 4)).'
      '; - $record_type = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 4)); $offset += 4; - $data_size_type = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2)); $offset += 2; - $data_size = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2)); $offset += 2; - switch ($data_size_type) { - case 0x0001: // 0x0001 = flag (size field *= 1-byte) - $data = getid3_lib::BigEndian2Int(substr($atom_data, $offset, $data_size * 1)); - $offset += ($data_size * 1); - break; - case 0x0002: // 0x0002 = char (size field *= 1-byte) - $data = substr($atom_data, $offset, $data_size * 1); - $offset += ($data_size * 1); - $data = rtrim($data, "\x00"); - break; - case 0x0003: // 0x0003 = DWORD+ (size field *= 2-byte), values are stored CDAB - $data = ''; - for ($i = $data_size - 1; $i >= 0; $i--) { - $data .= substr($atom_data, $offset + ($i * 2), 2); - } - $data = getid3_lib::BigEndian2Int($data); - $offset += ($data_size * 2); - break; - case 0x0004: // 0x0004 = QWORD+ (size field *= 4-byte), values are stored EFGHABCD - $data = ''; - for ($i = $data_size - 1; $i >= 0; $i--) { - $data .= substr($atom_data, $offset + ($i * 4), 4); - } - $data = getid3_lib::BigEndian2Int($data); - $offset += ($data_size * 4); - break; - case 0x0005: // 0x0005 = float (size field *= 8-byte), values are stored aaaabbbb where value is aaaa/bbbb; possibly multiple sets of values appended together - $data = array(); - for ($i = 0; $i < $data_size; $i++) { - $numerator = getid3_lib::BigEndian2Int(substr($atom_data, $offset + ($i * 8) + 0, 4)); - $denomninator = getid3_lib::BigEndian2Int(substr($atom_data, $offset + ($i * 8) + 4, 4)); - if ($denomninator == 0) { - $data[$i] = false; - } else { - $data[$i] = (double) $numerator / $denomninator; - } - } - $offset += (8 * $data_size); - if (count($data) == 1) { - $data = $data[0]; - } - break; - case 0x0007: // 0x0007 = bytes (size field *= 1-byte), values are stored as ?????? - $data = substr($atom_data, $offset, $data_size * 1); - $offset += ($data_size * 1); - break; - case 0x0008: // 0x0008 = ????? (size field *= 2-byte), values are stored as ?????? - $data = substr($atom_data, $offset, $data_size * 2); - $offset += ($data_size * 2); - break; - default: -echo 'QuicktimeParseNikonNCTG()::unknown $data_size_type: '.$data_size_type.'
      '; - break 2; - } - - switch ($record_type) { - case 0x00000011: // CreateDate - case 0x00000012: // DateTimeOriginal - $data = strtotime($data); - break; - case 0x0200001e: // ColorSpace - switch ($data) { - case 1: - $data = 'sRGB'; - break; - case 2: - $data = 'Adobe RGB'; - break; - } - break; - case 0x02000023: // PictureControlData - $PictureControlAdjust = array(0=>'default', 1=>'quick', 2=>'full'); - $FilterEffect = array(0x80=>'off', 0x81=>'yellow', 0x82=>'orange', 0x83=>'red', 0x84=>'green', 0xff=>'n/a'); - $ToningEffect = array(0x80=>'b&w', 0x81=>'sepia', 0x82=>'cyanotype', 0x83=>'red', 0x84=>'yellow', 0x85=>'green', 0x86=>'blue-green', 0x87=>'blue', 0x88=>'purple-blue', 0x89=>'red-purple', 0xff=>'n/a'); - $data = array( - 'PictureControlVersion' => substr($data, 0, 4), - 'PictureControlName' => rtrim(substr($data, 4, 20), "\x00"), - 'PictureControlBase' => rtrim(substr($data, 24, 20), "\x00"), - //'?' => substr($data, 44, 4), - 'PictureControlAdjust' => $PictureControlAdjust[ord(substr($data, 48, 1))], - 'PictureControlQuickAdjust' => ord(substr($data, 49, 1)), - 'Sharpness' => ord(substr($data, 50, 1)), - 'Contrast' => ord(substr($data, 51, 1)), - 'Brightness' => ord(substr($data, 52, 1)), - 'Saturation' => ord(substr($data, 53, 1)), - 'HueAdjustment' => ord(substr($data, 54, 1)), - 'FilterEffect' => $FilterEffect[ord(substr($data, 55, 1))], - 'ToningEffect' => $ToningEffect[ord(substr($data, 56, 1))], - 'ToningSaturation' => ord(substr($data, 57, 1)), - ); - break; - case 0x02000024: // WorldTime - // http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#WorldTime - // timezone is stored as offset from GMT in minutes - $timezone = getid3_lib::BigEndian2Int(substr($data, 0, 2)); - if ($timezone & 0x8000) { - $timezone = 0 - (0x10000 - $timezone); - } - $timezone /= 60; - - $dst = (bool) getid3_lib::BigEndian2Int(substr($data, 2, 1)); - switch (getid3_lib::BigEndian2Int(substr($data, 3, 1))) { - case 2: - $datedisplayformat = 'D/M/Y'; break; - case 1: - $datedisplayformat = 'M/D/Y'; break; - case 0: - default: - $datedisplayformat = 'Y/M/D'; break; - } - - $data = array('timezone'=>floatval($timezone), 'dst'=>$dst, 'display'=>$datedisplayformat); - break; - case 0x02000083: // LensType - $data = array( - //'_' => $data, - 'mf' => (bool) ($data & 0x01), - 'd' => (bool) ($data & 0x02), - 'g' => (bool) ($data & 0x04), - 'vr' => (bool) ($data & 0x08), - ); - break; - } - $tag_name = (isset($NCTGtagName[$record_type]) ? $NCTGtagName[$record_type] : '0x'.str_pad(dechex($record_type), 8, '0', STR_PAD_LEFT)); - $parsed[$tag_name] = $data; - } - return $parsed; - } - - - public function CopyToAppropriateCommentsSection($keyname, $data, $boxname='') { - static $handyatomtranslatorarray = array(); - if (empty($handyatomtranslatorarray)) { - $handyatomtranslatorarray["\xA9".'cpy'] = 'copyright'; - $handyatomtranslatorarray["\xA9".'day'] = 'creation_date'; // iTunes 4.0 - $handyatomtranslatorarray["\xA9".'dir'] = 'director'; - $handyatomtranslatorarray["\xA9".'ed1'] = 'edit1'; - $handyatomtranslatorarray["\xA9".'ed2'] = 'edit2'; - $handyatomtranslatorarray["\xA9".'ed3'] = 'edit3'; - $handyatomtranslatorarray["\xA9".'ed4'] = 'edit4'; - $handyatomtranslatorarray["\xA9".'ed5'] = 'edit5'; - $handyatomtranslatorarray["\xA9".'ed6'] = 'edit6'; - $handyatomtranslatorarray["\xA9".'ed7'] = 'edit7'; - $handyatomtranslatorarray["\xA9".'ed8'] = 'edit8'; - $handyatomtranslatorarray["\xA9".'ed9'] = 'edit9'; - $handyatomtranslatorarray["\xA9".'fmt'] = 'format'; - $handyatomtranslatorarray["\xA9".'inf'] = 'information'; - $handyatomtranslatorarray["\xA9".'prd'] = 'producer'; - $handyatomtranslatorarray["\xA9".'prf'] = 'performers'; - $handyatomtranslatorarray["\xA9".'req'] = 'system_requirements'; - $handyatomtranslatorarray["\xA9".'src'] = 'source_credit'; - $handyatomtranslatorarray["\xA9".'wrt'] = 'writer'; - - // http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt - $handyatomtranslatorarray["\xA9".'nam'] = 'title'; // iTunes 4.0 - $handyatomtranslatorarray["\xA9".'cmt'] = 'comment'; // iTunes 4.0 - $handyatomtranslatorarray["\xA9".'wrn'] = 'warning'; - $handyatomtranslatorarray["\xA9".'hst'] = 'host_computer'; - $handyatomtranslatorarray["\xA9".'mak'] = 'make'; - $handyatomtranslatorarray["\xA9".'mod'] = 'model'; - $handyatomtranslatorarray["\xA9".'PRD'] = 'product'; - $handyatomtranslatorarray["\xA9".'swr'] = 'software'; - $handyatomtranslatorarray["\xA9".'aut'] = 'author'; - $handyatomtranslatorarray["\xA9".'ART'] = 'artist'; - $handyatomtranslatorarray["\xA9".'trk'] = 'track'; - $handyatomtranslatorarray["\xA9".'alb'] = 'album'; // iTunes 4.0 - $handyatomtranslatorarray["\xA9".'com'] = 'comment'; - $handyatomtranslatorarray["\xA9".'gen'] = 'genre'; // iTunes 4.0 - $handyatomtranslatorarray["\xA9".'ope'] = 'composer'; - $handyatomtranslatorarray["\xA9".'url'] = 'url'; - $handyatomtranslatorarray["\xA9".'enc'] = 'encoder'; - - // http://atomicparsley.sourceforge.net/mpeg-4files.html - $handyatomtranslatorarray["\xA9".'art'] = 'artist'; // iTunes 4.0 - $handyatomtranslatorarray['aART'] = 'album_artist'; - $handyatomtranslatorarray['trkn'] = 'track_number'; // iTunes 4.0 - $handyatomtranslatorarray['disk'] = 'disc_number'; // iTunes 4.0 - $handyatomtranslatorarray['gnre'] = 'genre'; // iTunes 4.0 - $handyatomtranslatorarray["\xA9".'too'] = 'encoder'; // iTunes 4.0 - $handyatomtranslatorarray['tmpo'] = 'bpm'; // iTunes 4.0 - $handyatomtranslatorarray['cprt'] = 'copyright'; // iTunes 4.0? - $handyatomtranslatorarray['cpil'] = 'compilation'; // iTunes 4.0 - $handyatomtranslatorarray['covr'] = 'picture'; // iTunes 4.0 - $handyatomtranslatorarray['rtng'] = 'rating'; // iTunes 4.0 - $handyatomtranslatorarray["\xA9".'grp'] = 'grouping'; // iTunes 4.2 - $handyatomtranslatorarray['stik'] = 'stik'; // iTunes 4.9 - $handyatomtranslatorarray['pcst'] = 'podcast'; // iTunes 4.9 - $handyatomtranslatorarray['catg'] = 'category'; // iTunes 4.9 - $handyatomtranslatorarray['keyw'] = 'keyword'; // iTunes 4.9 - $handyatomtranslatorarray['purl'] = 'podcast_url'; // iTunes 4.9 - $handyatomtranslatorarray['egid'] = 'episode_guid'; // iTunes 4.9 - $handyatomtranslatorarray['desc'] = 'description'; // iTunes 5.0 - $handyatomtranslatorarray["\xA9".'lyr'] = 'lyrics'; // iTunes 5.0 - $handyatomtranslatorarray['tvnn'] = 'tv_network_name'; // iTunes 6.0 - $handyatomtranslatorarray['tvsh'] = 'tv_show_name'; // iTunes 6.0 - $handyatomtranslatorarray['tvsn'] = 'tv_season'; // iTunes 6.0 - $handyatomtranslatorarray['tves'] = 'tv_episode'; // iTunes 6.0 - $handyatomtranslatorarray['purd'] = 'purchase_date'; // iTunes 6.0.2 - $handyatomtranslatorarray['pgap'] = 'gapless_playback'; // iTunes 7.0 - - // http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt - - - - // boxnames: - /* - $handyatomtranslatorarray['iTunSMPB'] = 'iTunSMPB'; - $handyatomtranslatorarray['iTunNORM'] = 'iTunNORM'; - $handyatomtranslatorarray['Encoding Params'] = 'Encoding Params'; - $handyatomtranslatorarray['replaygain_track_gain'] = 'replaygain_track_gain'; - $handyatomtranslatorarray['replaygain_track_peak'] = 'replaygain_track_peak'; - $handyatomtranslatorarray['replaygain_track_minmax'] = 'replaygain_track_minmax'; - $handyatomtranslatorarray['MusicIP PUID'] = 'MusicIP PUID'; - $handyatomtranslatorarray['MusicBrainz Artist Id'] = 'MusicBrainz Artist Id'; - $handyatomtranslatorarray['MusicBrainz Album Id'] = 'MusicBrainz Album Id'; - $handyatomtranslatorarray['MusicBrainz Album Artist Id'] = 'MusicBrainz Album Artist Id'; - $handyatomtranslatorarray['MusicBrainz Track Id'] = 'MusicBrainz Track Id'; - $handyatomtranslatorarray['MusicBrainz Disc Id'] = 'MusicBrainz Disc Id'; - - // http://age.hobba.nl/audio/tag_frame_reference.html - $handyatomtranslatorarray['PLAY_COUNTER'] = 'play_counter'; // Foobar2000 - http://www.getid3.org/phpBB3/viewtopic.php?t=1355 - $handyatomtranslatorarray['MEDIATYPE'] = 'mediatype'; // Foobar2000 - http://www.getid3.org/phpBB3/viewtopic.php?t=1355 - */ - } - $info = &$this->getid3->info; - $comment_key = ''; - if ($boxname && ($boxname != $keyname)) { - $comment_key = (isset($handyatomtranslatorarray[$boxname]) ? $handyatomtranslatorarray[$boxname] : $boxname); - } elseif (isset($handyatomtranslatorarray[$keyname])) { - $comment_key = $handyatomtranslatorarray[$keyname]; - } - if ($comment_key) { - if ($comment_key == 'picture') { - if (!is_array($data)) { - $image_mime = ''; - if (preg_match('#^\x89\x50\x4E\x47\x0D\x0A\x1A\x0A#', $data)) { - $image_mime = 'image/png'; - } elseif (preg_match('#^\xFF\xD8\xFF#', $data)) { - $image_mime = 'image/jpeg'; - } elseif (preg_match('#^GIF#', $data)) { - $image_mime = 'image/gif'; - } elseif (preg_match('#^BM#', $data)) { - $image_mime = 'image/bmp'; - } - $data = array('data'=>$data, 'image_mime'=>$image_mime); - } - } - $info['quicktime']['comments'][$comment_key][] = $data; - } - return true; - } - - public function NoNullString($nullterminatedstring) { - // remove the single null terminator on null terminated strings - if (substr($nullterminatedstring, strlen($nullterminatedstring) - 1, 1) === "\x00") { - return substr($nullterminatedstring, 0, strlen($nullterminatedstring) - 1); - } - return $nullterminatedstring; - } - - public function Pascal2String($pascalstring) { - // Pascal strings have 1 unsigned byte at the beginning saying how many chars (1-255) are in the string - return substr($pascalstring, 1); - } - -} diff --git a/wp/wp-includes/ID3/module.audio-video.riff.php b/wp/wp-includes/ID3/module.audio-video.riff.php deleted file mode 100644 index e8ba9445..00000000 --- a/wp/wp-includes/ID3/module.audio-video.riff.php +++ /dev/null @@ -1,2586 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// -// See readme.txt for more details // -///////////////////////////////////////////////////////////////// -// // -// module.audio-video.riff.php // -// module for analyzing RIFF files // -// multiple formats supported by this module: // -// Wave, AVI, AIFF/AIFC, (MP3,AC3)/RIFF, Wavpack v3, 8SVX // -// dependencies: module.audio.mp3.php // -// module.audio.ac3.php // -// module.audio.dts.php // -// /// -///////////////////////////////////////////////////////////////// - -/** -* @todo Parse AC-3/DTS audio inside WAVE correctly -* @todo Rewrite RIFF parser totally -*/ - -getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.mp3.php', __FILE__, true); -getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ac3.php', __FILE__, true); -getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.dts.php', __FILE__, true); - -class getid3_riff extends getid3_handler { - - protected $container = 'riff'; // default - - public function Analyze() { - $info = &$this->getid3->info; - - // initialize these values to an empty array, otherwise they default to NULL - // and you can't append array values to a NULL value - $info['riff'] = array('raw'=>array()); - - // Shortcuts - $thisfile_riff = &$info['riff']; - $thisfile_riff_raw = &$thisfile_riff['raw']; - $thisfile_audio = &$info['audio']; - $thisfile_video = &$info['video']; - $thisfile_audio_dataformat = &$thisfile_audio['dataformat']; - $thisfile_riff_audio = &$thisfile_riff['audio']; - $thisfile_riff_video = &$thisfile_riff['video']; - - $Original['avdataoffset'] = $info['avdataoffset']; - $Original['avdataend'] = $info['avdataend']; - - $this->fseek($info['avdataoffset']); - $RIFFheader = $this->fread(12); - $offset = $this->ftell(); - $RIFFtype = substr($RIFFheader, 0, 4); - $RIFFsize = substr($RIFFheader, 4, 4); - $RIFFsubtype = substr($RIFFheader, 8, 4); - - switch ($RIFFtype) { - - case 'FORM': // AIFF, AIFC - //$info['fileformat'] = 'aiff'; - $this->container = 'aiff'; - $thisfile_riff['header_size'] = $this->EitherEndian2Int($RIFFsize); - $thisfile_riff[$RIFFsubtype] = $this->ParseRIFF($offset, ($offset + $thisfile_riff['header_size'] - 4)); - break; - - case 'RIFF': // AVI, WAV, etc - case 'SDSS': // SDSS is identical to RIFF, just renamed. Used by SmartSound QuickTracks (www.smartsound.com) - case 'RMP3': // RMP3 is identical to RIFF, just renamed. Used by [unknown program] when creating RIFF-MP3s - //$info['fileformat'] = 'riff'; - $this->container = 'riff'; - $thisfile_riff['header_size'] = $this->EitherEndian2Int($RIFFsize); - if ($RIFFsubtype == 'RMP3') { - // RMP3 is identical to WAVE, just renamed. Used by [unknown program] when creating RIFF-MP3s - $RIFFsubtype = 'WAVE'; - } - if ($RIFFsubtype != 'AMV ') { - // AMV files are RIFF-AVI files with parts of the spec deliberately broken, such as chunk size fields hardcoded to zero (because players known in hardware that these fields are always a certain size - // Handled separately in ParseRIFFAMV() - $thisfile_riff[$RIFFsubtype] = $this->ParseRIFF($offset, ($offset + $thisfile_riff['header_size'] - 4)); - } - if (($info['avdataend'] - $info['filesize']) == 1) { - // LiteWave appears to incorrectly *not* pad actual output file - // to nearest WORD boundary so may appear to be short by one - // byte, in which case - skip warning - $info['avdataend'] = $info['filesize']; - } - - $nextRIFFoffset = $Original['avdataoffset'] + 8 + $thisfile_riff['header_size']; // 8 = "RIFF" + 32-bit offset - while ($nextRIFFoffset < min($info['filesize'], $info['avdataend'])) { - try { - $this->fseek($nextRIFFoffset); - } catch (getid3_exception $e) { - if ($e->getCode() == 10) { - //$this->warning('RIFF parser: '.$e->getMessage()); - $this->error('AVI extends beyond '.round(PHP_INT_MAX / 1073741824).'GB and PHP filesystem functions cannot read that far, playtime may be wrong'); - $this->warning('[avdataend] value may be incorrect, multiple AVIX chunks may be present'); - break; - } else { - throw $e; - } - } - $nextRIFFheader = $this->fread(12); - if ($nextRIFFoffset == ($info['avdataend'] - 1)) { - if (substr($nextRIFFheader, 0, 1) == "\x00") { - // RIFF padded to WORD boundary, we're actually already at the end - break; - } - } - $nextRIFFheaderID = substr($nextRIFFheader, 0, 4); - $nextRIFFsize = $this->EitherEndian2Int(substr($nextRIFFheader, 4, 4)); - $nextRIFFtype = substr($nextRIFFheader, 8, 4); - $chunkdata = array(); - $chunkdata['offset'] = $nextRIFFoffset + 8; - $chunkdata['size'] = $nextRIFFsize; - $nextRIFFoffset = $chunkdata['offset'] + $chunkdata['size']; - - switch ($nextRIFFheaderID) { - case 'RIFF': - $chunkdata['chunks'] = $this->ParseRIFF($chunkdata['offset'] + 4, $nextRIFFoffset); - if (!isset($thisfile_riff[$nextRIFFtype])) { - $thisfile_riff[$nextRIFFtype] = array(); - } - $thisfile_riff[$nextRIFFtype][] = $chunkdata; - break; - - case 'AMV ': - unset($info['riff']); - $info['amv'] = $this->ParseRIFFAMV($chunkdata['offset'] + 4, $nextRIFFoffset); - break; - - case 'JUNK': - // ignore - $thisfile_riff[$nextRIFFheaderID][] = $chunkdata; - break; - - case 'IDVX': - $info['divxtag']['comments'] = self::ParseDIVXTAG($this->fread($chunkdata['size'])); - break; - - default: - if ($info['filesize'] == ($chunkdata['offset'] - 8 + 128)) { - $DIVXTAG = $nextRIFFheader.$this->fread(128 - 12); - if (substr($DIVXTAG, -7) == 'DIVXTAG') { - // DIVXTAG is supposed to be inside an IDVX chunk in a LIST chunk, but some bad encoders just slap it on the end of a file - $this->warning('Found wrongly-structured DIVXTAG at offset '.($this->ftell() - 128).', parsing anyway'); - $info['divxtag']['comments'] = self::ParseDIVXTAG($DIVXTAG); - break 2; - } - } - $this->warning('Expecting "RIFF|JUNK|IDVX" at '.$nextRIFFoffset.', found "'.$nextRIFFheaderID.'" ('.getid3_lib::PrintHexBytes($nextRIFFheaderID).') - skipping rest of file'); - break 2; - - } - - } - if ($RIFFsubtype == 'WAVE') { - $thisfile_riff_WAVE = &$thisfile_riff['WAVE']; - } - break; - - default: - $this->error('Cannot parse RIFF (this is maybe not a RIFF / WAV / AVI file?) - expecting "FORM|RIFF|SDSS|RMP3" found "'.$RIFFsubtype.'" instead'); - //unset($info['fileformat']); - return false; - } - - $streamindex = 0; - switch ($RIFFsubtype) { - - // http://en.wikipedia.org/wiki/Wav - case 'WAVE': - $info['fileformat'] = 'wav'; - - if (empty($thisfile_audio['bitrate_mode'])) { - $thisfile_audio['bitrate_mode'] = 'cbr'; - } - if (empty($thisfile_audio_dataformat)) { - $thisfile_audio_dataformat = 'wav'; - } - - if (isset($thisfile_riff_WAVE['data'][0]['offset'])) { - $info['avdataoffset'] = $thisfile_riff_WAVE['data'][0]['offset'] + 8; - $info['avdataend'] = $info['avdataoffset'] + $thisfile_riff_WAVE['data'][0]['size']; - } - if (isset($thisfile_riff_WAVE['fmt '][0]['data'])) { - - $thisfile_riff_audio[$streamindex] = self::parseWAVEFORMATex($thisfile_riff_WAVE['fmt '][0]['data']); - $thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag']; - if (!isset($thisfile_riff_audio[$streamindex]['bitrate']) || ($thisfile_riff_audio[$streamindex]['bitrate'] == 0)) { - $info['error'][] = 'Corrupt RIFF file: bitrate_audio == zero'; - return false; - } - $thisfile_riff_raw['fmt '] = $thisfile_riff_audio[$streamindex]['raw']; - unset($thisfile_riff_audio[$streamindex]['raw']); - $thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex]; - - $thisfile_audio = getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]); - if (substr($thisfile_audio['codec'], 0, strlen('unknown: 0x')) == 'unknown: 0x') { - $info['warning'][] = 'Audio codec = '.$thisfile_audio['codec']; - } - $thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate']; - - if (empty($info['playtime_seconds'])) { // may already be set (e.g. DTS-WAV) - $info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $thisfile_audio['bitrate']); - } - - $thisfile_audio['lossless'] = false; - if (isset($thisfile_riff_WAVE['data'][0]['offset']) && isset($thisfile_riff_raw['fmt ']['wFormatTag'])) { - switch ($thisfile_riff_raw['fmt ']['wFormatTag']) { - - case 0x0001: // PCM - $thisfile_audio['lossless'] = true; - break; - - case 0x2000: // AC-3 - $thisfile_audio_dataformat = 'ac3'; - break; - - default: - // do nothing - break; - - } - } - $thisfile_audio['streams'][$streamindex]['wformattag'] = $thisfile_audio['wformattag']; - $thisfile_audio['streams'][$streamindex]['bitrate_mode'] = $thisfile_audio['bitrate_mode']; - $thisfile_audio['streams'][$streamindex]['lossless'] = $thisfile_audio['lossless']; - $thisfile_audio['streams'][$streamindex]['dataformat'] = $thisfile_audio_dataformat; - } - - if (isset($thisfile_riff_WAVE['rgad'][0]['data'])) { - - // shortcuts - $rgadData = &$thisfile_riff_WAVE['rgad'][0]['data']; - $thisfile_riff_raw['rgad'] = array('track'=>array(), 'album'=>array()); - $thisfile_riff_raw_rgad = &$thisfile_riff_raw['rgad']; - $thisfile_riff_raw_rgad_track = &$thisfile_riff_raw_rgad['track']; - $thisfile_riff_raw_rgad_album = &$thisfile_riff_raw_rgad['album']; - - $thisfile_riff_raw_rgad['fPeakAmplitude'] = getid3_lib::LittleEndian2Float(substr($rgadData, 0, 4)); - $thisfile_riff_raw_rgad['nRadioRgAdjust'] = $this->EitherEndian2Int(substr($rgadData, 4, 2)); - $thisfile_riff_raw_rgad['nAudiophileRgAdjust'] = $this->EitherEndian2Int(substr($rgadData, 6, 2)); - - $nRadioRgAdjustBitstring = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nRadioRgAdjust']), 16, '0', STR_PAD_LEFT); - $nAudiophileRgAdjustBitstring = str_pad(getid3_lib::Dec2Bin($thisfile_riff_raw_rgad['nAudiophileRgAdjust']), 16, '0', STR_PAD_LEFT); - $thisfile_riff_raw_rgad_track['name'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 0, 3)); - $thisfile_riff_raw_rgad_track['originator'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 3, 3)); - $thisfile_riff_raw_rgad_track['signbit'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 6, 1)); - $thisfile_riff_raw_rgad_track['adjustment'] = getid3_lib::Bin2Dec(substr($nRadioRgAdjustBitstring, 7, 9)); - $thisfile_riff_raw_rgad_album['name'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 0, 3)); - $thisfile_riff_raw_rgad_album['originator'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 3, 3)); - $thisfile_riff_raw_rgad_album['signbit'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 6, 1)); - $thisfile_riff_raw_rgad_album['adjustment'] = getid3_lib::Bin2Dec(substr($nAudiophileRgAdjustBitstring, 7, 9)); - - $thisfile_riff['rgad']['peakamplitude'] = $thisfile_riff_raw_rgad['fPeakAmplitude']; - if (($thisfile_riff_raw_rgad_track['name'] != 0) && ($thisfile_riff_raw_rgad_track['originator'] != 0)) { - $thisfile_riff['rgad']['track']['name'] = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_track['name']); - $thisfile_riff['rgad']['track']['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_track['originator']); - $thisfile_riff['rgad']['track']['adjustment'] = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_track['adjustment'], $thisfile_riff_raw_rgad_track['signbit']); - } - if (($thisfile_riff_raw_rgad_album['name'] != 0) && ($thisfile_riff_raw_rgad_album['originator'] != 0)) { - $thisfile_riff['rgad']['album']['name'] = getid3_lib::RGADnameLookup($thisfile_riff_raw_rgad_album['name']); - $thisfile_riff['rgad']['album']['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_riff_raw_rgad_album['originator']); - $thisfile_riff['rgad']['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($thisfile_riff_raw_rgad_album['adjustment'], $thisfile_riff_raw_rgad_album['signbit']); - } - } - - if (isset($thisfile_riff_WAVE['fact'][0]['data'])) { - $thisfile_riff_raw['fact']['NumberOfSamples'] = $this->EitherEndian2Int(substr($thisfile_riff_WAVE['fact'][0]['data'], 0, 4)); - - // This should be a good way of calculating exact playtime, - // but some sample files have had incorrect number of samples, - // so cannot use this method - - // if (!empty($thisfile_riff_raw['fmt ']['nSamplesPerSec'])) { - // $info['playtime_seconds'] = (float) $thisfile_riff_raw['fact']['NumberOfSamples'] / $thisfile_riff_raw['fmt ']['nSamplesPerSec']; - // } - } - if (!empty($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'])) { - $thisfile_audio['bitrate'] = getid3_lib::CastAsInt($thisfile_riff_raw['fmt ']['nAvgBytesPerSec'] * 8); - } - - if (isset($thisfile_riff_WAVE['bext'][0]['data'])) { - // shortcut - $thisfile_riff_WAVE_bext_0 = &$thisfile_riff_WAVE['bext'][0]; - - $thisfile_riff_WAVE_bext_0['title'] = trim(substr($thisfile_riff_WAVE_bext_0['data'], 0, 256)); - $thisfile_riff_WAVE_bext_0['author'] = trim(substr($thisfile_riff_WAVE_bext_0['data'], 256, 32)); - $thisfile_riff_WAVE_bext_0['reference'] = trim(substr($thisfile_riff_WAVE_bext_0['data'], 288, 32)); - $thisfile_riff_WAVE_bext_0['origin_date'] = substr($thisfile_riff_WAVE_bext_0['data'], 320, 10); - $thisfile_riff_WAVE_bext_0['origin_time'] = substr($thisfile_riff_WAVE_bext_0['data'], 330, 8); - $thisfile_riff_WAVE_bext_0['time_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 338, 8)); - $thisfile_riff_WAVE_bext_0['bwf_version'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 346, 1)); - $thisfile_riff_WAVE_bext_0['reserved'] = substr($thisfile_riff_WAVE_bext_0['data'], 347, 254); - $thisfile_riff_WAVE_bext_0['coding_history'] = explode("\r\n", trim(substr($thisfile_riff_WAVE_bext_0['data'], 601))); - if (preg_match('#^([0-9]{4}).([0-9]{2}).([0-9]{2})$#', $thisfile_riff_WAVE_bext_0['origin_date'], $matches_bext_date)) { - if (preg_match('#^([0-9]{2}).([0-9]{2}).([0-9]{2})$#', $thisfile_riff_WAVE_bext_0['origin_time'], $matches_bext_time)) { - list($dummy, $bext_timestamp['year'], $bext_timestamp['month'], $bext_timestamp['day']) = $matches_bext_date; - list($dummy, $bext_timestamp['hour'], $bext_timestamp['minute'], $bext_timestamp['second']) = $matches_bext_time; - $thisfile_riff_WAVE_bext_0['origin_date_unix'] = gmmktime($bext_timestamp['hour'], $bext_timestamp['minute'], $bext_timestamp['second'], $bext_timestamp['month'], $bext_timestamp['day'], $bext_timestamp['year']); - } else { - $info['warning'][] = 'RIFF.WAVE.BEXT.origin_time is invalid'; - } - } else { - $info['warning'][] = 'RIFF.WAVE.BEXT.origin_date is invalid'; - } - $thisfile_riff['comments']['author'][] = $thisfile_riff_WAVE_bext_0['author']; - $thisfile_riff['comments']['title'][] = $thisfile_riff_WAVE_bext_0['title']; - } - - if (isset($thisfile_riff_WAVE['MEXT'][0]['data'])) { - // shortcut - $thisfile_riff_WAVE_MEXT_0 = &$thisfile_riff_WAVE['MEXT'][0]; - - $thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 0, 2)); - $thisfile_riff_WAVE_MEXT_0['flags']['homogenous'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0001); - if ($thisfile_riff_WAVE_MEXT_0['flags']['homogenous']) { - $thisfile_riff_WAVE_MEXT_0['flags']['padding'] = ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0002) ? false : true; - $thisfile_riff_WAVE_MEXT_0['flags']['22_or_44'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0004); - $thisfile_riff_WAVE_MEXT_0['flags']['free_format'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['sound_information'] & 0x0008); - - $thisfile_riff_WAVE_MEXT_0['nominal_frame_size'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 2, 2)); - } - $thisfile_riff_WAVE_MEXT_0['anciliary_data_length'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 6, 2)); - $thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_MEXT_0['data'], 8, 2)); - $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_left'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0001); - $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_free'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0002); - $thisfile_riff_WAVE_MEXT_0['flags']['anciliary_data_right'] = (bool) ($thisfile_riff_WAVE_MEXT_0['raw']['anciliary_data_def'] & 0x0004); - } - - if (isset($thisfile_riff_WAVE['cart'][0]['data'])) { - // shortcut - $thisfile_riff_WAVE_cart_0 = &$thisfile_riff_WAVE['cart'][0]; - - $thisfile_riff_WAVE_cart_0['version'] = substr($thisfile_riff_WAVE_cart_0['data'], 0, 4); - $thisfile_riff_WAVE_cart_0['title'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 4, 64)); - $thisfile_riff_WAVE_cart_0['artist'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 68, 64)); - $thisfile_riff_WAVE_cart_0['cut_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 132, 64)); - $thisfile_riff_WAVE_cart_0['client_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 196, 64)); - $thisfile_riff_WAVE_cart_0['category'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 260, 64)); - $thisfile_riff_WAVE_cart_0['classification'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 324, 64)); - $thisfile_riff_WAVE_cart_0['out_cue'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 388, 64)); - $thisfile_riff_WAVE_cart_0['start_date'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 452, 10)); - $thisfile_riff_WAVE_cart_0['start_time'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 462, 8)); - $thisfile_riff_WAVE_cart_0['end_date'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 470, 10)); - $thisfile_riff_WAVE_cart_0['end_time'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 480, 8)); - $thisfile_riff_WAVE_cart_0['producer_app_id'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 488, 64)); - $thisfile_riff_WAVE_cart_0['producer_app_version'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 552, 64)); - $thisfile_riff_WAVE_cart_0['user_defined_text'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 616, 64)); - $thisfile_riff_WAVE_cart_0['zero_db_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 680, 4), true); - for ($i = 0; $i < 8; $i++) { - $thisfile_riff_WAVE_cart_0['post_time'][$i]['usage_fourcc'] = substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8), 4); - $thisfile_riff_WAVE_cart_0['post_time'][$i]['timer_value'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_cart_0['data'], 684 + ($i * 8) + 4, 4)); - } - $thisfile_riff_WAVE_cart_0['url'] = trim(substr($thisfile_riff_WAVE_cart_0['data'], 748, 1024)); - $thisfile_riff_WAVE_cart_0['tag_text'] = explode("\r\n", trim(substr($thisfile_riff_WAVE_cart_0['data'], 1772))); - - $thisfile_riff['comments']['artist'][] = $thisfile_riff_WAVE_cart_0['artist']; - $thisfile_riff['comments']['title'][] = $thisfile_riff_WAVE_cart_0['title']; - } - - if (isset($thisfile_riff_WAVE['SNDM'][0]['data'])) { - // SoundMiner metadata - - // shortcuts - $thisfile_riff_WAVE_SNDM_0 = &$thisfile_riff_WAVE['SNDM'][0]; - $thisfile_riff_WAVE_SNDM_0_data = &$thisfile_riff_WAVE_SNDM_0['data']; - $SNDM_startoffset = 0; - $SNDM_endoffset = $thisfile_riff_WAVE_SNDM_0['size']; - - while ($SNDM_startoffset < $SNDM_endoffset) { - $SNDM_thisTagOffset = 0; - $SNDM_thisTagSize = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 4)); - $SNDM_thisTagOffset += 4; - $SNDM_thisTagKey = substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 4); - $SNDM_thisTagOffset += 4; - $SNDM_thisTagDataSize = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 2)); - $SNDM_thisTagOffset += 2; - $SNDM_thisTagDataFlags = getid3_lib::BigEndian2Int(substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, 2)); - $SNDM_thisTagOffset += 2; - $SNDM_thisTagDataText = substr($thisfile_riff_WAVE_SNDM_0_data, $SNDM_startoffset + $SNDM_thisTagOffset, $SNDM_thisTagDataSize); - $SNDM_thisTagOffset += $SNDM_thisTagDataSize; - - if ($SNDM_thisTagSize != (4 + 4 + 2 + 2 + $SNDM_thisTagDataSize)) { - $info['warning'][] = 'RIFF.WAVE.SNDM.data contains tag not expected length (expected: '.$SNDM_thisTagSize.', found: '.(4 + 4 + 2 + 2 + $SNDM_thisTagDataSize).') at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')'; - break; - } elseif ($SNDM_thisTagSize <= 0) { - $info['warning'][] = 'RIFF.WAVE.SNDM.data contains zero-size tag at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')'; - break; - } - $SNDM_startoffset += $SNDM_thisTagSize; - - $thisfile_riff_WAVE_SNDM_0['parsed_raw'][$SNDM_thisTagKey] = $SNDM_thisTagDataText; - if ($parsedkey = self::waveSNDMtagLookup($SNDM_thisTagKey)) { - $thisfile_riff_WAVE_SNDM_0['parsed'][$parsedkey] = $SNDM_thisTagDataText; - } else { - $info['warning'][] = 'RIFF.WAVE.SNDM contains unknown tag "'.$SNDM_thisTagKey.'" at offset '.$SNDM_startoffset.' (file offset '.($thisfile_riff_WAVE_SNDM_0['offset'] + $SNDM_startoffset).')'; - } - } - - $tagmapping = array( - 'tracktitle'=>'title', - 'category' =>'genre', - 'cdtitle' =>'album', - 'tracktitle'=>'title', - ); - foreach ($tagmapping as $fromkey => $tokey) { - if (isset($thisfile_riff_WAVE_SNDM_0['parsed'][$fromkey])) { - $thisfile_riff['comments'][$tokey][] = $thisfile_riff_WAVE_SNDM_0['parsed'][$fromkey]; - } - } - } - - if (isset($thisfile_riff_WAVE['iXML'][0]['data'])) { - // requires functions simplexml_load_string and get_object_vars - if ($parsedXML = getid3_lib::XML2array($thisfile_riff_WAVE['iXML'][0]['data'])) { - $thisfile_riff_WAVE['iXML'][0]['parsed'] = $parsedXML; - if (isset($parsedXML['SPEED']['MASTER_SPEED'])) { - @list($numerator, $denominator) = explode('/', $parsedXML['SPEED']['MASTER_SPEED']); - $thisfile_riff_WAVE['iXML'][0]['master_speed'] = $numerator / ($denominator ? $denominator : 1000); - } - if (isset($parsedXML['SPEED']['TIMECODE_RATE'])) { - @list($numerator, $denominator) = explode('/', $parsedXML['SPEED']['TIMECODE_RATE']); - $thisfile_riff_WAVE['iXML'][0]['timecode_rate'] = $numerator / ($denominator ? $denominator : 1000); - } - if (isset($parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_LO']) && !empty($parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']) && !empty($thisfile_riff_WAVE['iXML'][0]['timecode_rate'])) { - $samples_since_midnight = floatval(ltrim($parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_HI'].$parsedXML['SPEED']['TIMESTAMP_SAMPLES_SINCE_MIDNIGHT_LO'], '0')); - $thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] = $samples_since_midnight / $parsedXML['SPEED']['TIMESTAMP_SAMPLE_RATE']; - $h = floor( $thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] / 3600); - $m = floor(($thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600)) / 60); - $s = floor( $thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600) - ($m * 60)); - $f = ($thisfile_riff_WAVE['iXML'][0]['timecode_seconds'] - ($h * 3600) - ($m * 60) - $s) * $thisfile_riff_WAVE['iXML'][0]['timecode_rate']; - $thisfile_riff_WAVE['iXML'][0]['timecode_string'] = sprintf('%02d:%02d:%02d:%05.2f', $h, $m, $s, $f); - $thisfile_riff_WAVE['iXML'][0]['timecode_string_round'] = sprintf('%02d:%02d:%02d:%02d', $h, $m, $s, round($f)); - } - unset($parsedXML); - } - } - - - - if (!isset($thisfile_audio['bitrate']) && isset($thisfile_riff_audio[$streamindex]['bitrate'])) { - $thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate']; - $info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $thisfile_audio['bitrate']); - } - - if (!empty($info['wavpack'])) { - $thisfile_audio_dataformat = 'wavpack'; - $thisfile_audio['bitrate_mode'] = 'vbr'; - $thisfile_audio['encoder'] = 'WavPack v'.$info['wavpack']['version']; - - // Reset to the way it was - RIFF parsing will have messed this up - $info['avdataend'] = $Original['avdataend']; - $thisfile_audio['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; - - $this->fseek($info['avdataoffset'] - 44); - $RIFFdata = $this->fread(44); - $OrignalRIFFheaderSize = getid3_lib::LittleEndian2Int(substr($RIFFdata, 4, 4)) + 8; - $OrignalRIFFdataSize = getid3_lib::LittleEndian2Int(substr($RIFFdata, 40, 4)) + 44; - - if ($OrignalRIFFheaderSize > $OrignalRIFFdataSize) { - $info['avdataend'] -= ($OrignalRIFFheaderSize - $OrignalRIFFdataSize); - $this->fseek($info['avdataend']); - $RIFFdata .= $this->fread($OrignalRIFFheaderSize - $OrignalRIFFdataSize); - } - - // move the data chunk after all other chunks (if any) - // so that the RIFF parser doesn't see EOF when trying - // to skip over the data chunk - $RIFFdata = substr($RIFFdata, 0, 36).substr($RIFFdata, 44).substr($RIFFdata, 36, 8); - $getid3_riff = new getid3_riff($this->getid3); - $getid3_riff->ParseRIFFdata($RIFFdata); - unset($getid3_riff); - } - - if (isset($thisfile_riff_raw['fmt ']['wFormatTag'])) { - switch ($thisfile_riff_raw['fmt ']['wFormatTag']) { - case 0x0001: // PCM - if (!empty($info['ac3'])) { - // Dolby Digital WAV files masquerade as PCM-WAV, but they're not - $thisfile_audio['wformattag'] = 0x2000; - $thisfile_audio['codec'] = self::wFormatTagLookup($thisfile_audio['wformattag']); - $thisfile_audio['lossless'] = false; - $thisfile_audio['bitrate'] = $info['ac3']['bitrate']; - $thisfile_audio['sample_rate'] = $info['ac3']['sample_rate']; - } - if (!empty($info['dts'])) { - // Dolby DTS files masquerade as PCM-WAV, but they're not - $thisfile_audio['wformattag'] = 0x2001; - $thisfile_audio['codec'] = self::wFormatTagLookup($thisfile_audio['wformattag']); - $thisfile_audio['lossless'] = false; - $thisfile_audio['bitrate'] = $info['dts']['bitrate']; - $thisfile_audio['sample_rate'] = $info['dts']['sample_rate']; - } - break; - case 0x08AE: // ClearJump LiteWave - $thisfile_audio['bitrate_mode'] = 'vbr'; - $thisfile_audio_dataformat = 'litewave'; - - //typedef struct tagSLwFormat { - // WORD m_wCompFormat; // low byte defines compression method, high byte is compression flags - // DWORD m_dwScale; // scale factor for lossy compression - // DWORD m_dwBlockSize; // number of samples in encoded blocks - // WORD m_wQuality; // alias for the scale factor - // WORD m_wMarkDistance; // distance between marks in bytes - // WORD m_wReserved; - // - // //following paramters are ignored if CF_FILESRC is not set - // DWORD m_dwOrgSize; // original file size in bytes - // WORD m_bFactExists; // indicates if 'fact' chunk exists in the original file - // DWORD m_dwRiffChunkSize; // riff chunk size in the original file - // - // PCMWAVEFORMAT m_OrgWf; // original wave format - // }SLwFormat, *PSLwFormat; - - // shortcut - $thisfile_riff['litewave']['raw'] = array(); - $riff_litewave = &$thisfile_riff['litewave']; - $riff_litewave_raw = &$riff_litewave['raw']; - - $flags = array( - 'compression_method' => 1, - 'compression_flags' => 1, - 'm_dwScale' => 4, - 'm_dwBlockSize' => 4, - 'm_wQuality' => 2, - 'm_wMarkDistance' => 2, - 'm_wReserved' => 2, - 'm_dwOrgSize' => 4, - 'm_bFactExists' => 2, - 'm_dwRiffChunkSize' => 4, - ); - $litewave_offset = 18; - foreach ($flags as $flag => $length) { - $riff_litewave_raw[$flag] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE['fmt '][0]['data'], $litewave_offset, $length)); - $litewave_offset += $length; - } - - //$riff_litewave['quality_factor'] = intval(round((2000 - $riff_litewave_raw['m_dwScale']) / 20)); - $riff_litewave['quality_factor'] = $riff_litewave_raw['m_wQuality']; - - $riff_litewave['flags']['raw_source'] = ($riff_litewave_raw['compression_flags'] & 0x01) ? false : true; - $riff_litewave['flags']['vbr_blocksize'] = ($riff_litewave_raw['compression_flags'] & 0x02) ? false : true; - $riff_litewave['flags']['seekpoints'] = (bool) ($riff_litewave_raw['compression_flags'] & 0x04); - - $thisfile_audio['lossless'] = (($riff_litewave_raw['m_wQuality'] == 100) ? true : false); - $thisfile_audio['encoder_options'] = '-q'.$riff_litewave['quality_factor']; - break; - - default: - break; - } - } - if ($info['avdataend'] > $info['filesize']) { - switch (!empty($thisfile_audio_dataformat) ? $thisfile_audio_dataformat : '') { - case 'wavpack': // WavPack - case 'lpac': // LPAC - case 'ofr': // OptimFROG - case 'ofs': // OptimFROG DualStream - // lossless compressed audio formats that keep original RIFF headers - skip warning - break; - - case 'litewave': - if (($info['avdataend'] - $info['filesize']) == 1) { - // LiteWave appears to incorrectly *not* pad actual output file - // to nearest WORD boundary so may appear to be short by one - // byte, in which case - skip warning - } else { - // Short by more than one byte, throw warning - $info['warning'][] = 'Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)'; - $info['avdataend'] = $info['filesize']; - } - break; - - default: - if ((($info['avdataend'] - $info['filesize']) == 1) && (($thisfile_riff[$RIFFsubtype]['data'][0]['size'] % 2) == 0) && ((($info['filesize'] - $info['avdataoffset']) % 2) == 1)) { - // output file appears to be incorrectly *not* padded to nearest WORD boundary - // Output less severe warning - $info['warning'][] = 'File should probably be padded to nearest WORD boundary, but it is not (expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' therefore short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)'; - $info['avdataend'] = $info['filesize']; - } else { - // Short by more than one byte, throw warning - $info['warning'][] = 'Probably truncated file - expecting '.$thisfile_riff[$RIFFsubtype]['data'][0]['size'].' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($thisfile_riff[$RIFFsubtype]['data'][0]['size'] - ($info['filesize'] - $info['avdataoffset'])).' bytes)'; - $info['avdataend'] = $info['filesize']; - } - break; - } - } - if (!empty($info['mpeg']['audio']['LAME']['audio_bytes'])) { - if ((($info['avdataend'] - $info['avdataoffset']) - $info['mpeg']['audio']['LAME']['audio_bytes']) == 1) { - $info['avdataend']--; - $info['warning'][] = 'Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored'; - } - } - if (isset($thisfile_audio_dataformat) && ($thisfile_audio_dataformat == 'ac3')) { - unset($thisfile_audio['bits_per_sample']); - if (!empty($info['ac3']['bitrate']) && ($info['ac3']['bitrate'] != $thisfile_audio['bitrate'])) { - $thisfile_audio['bitrate'] = $info['ac3']['bitrate']; - } - } - break; - - // http://en.wikipedia.org/wiki/Audio_Video_Interleave - case 'AVI ': - $info['fileformat'] = 'avi'; - $info['mime_type'] = 'video/avi'; - - $thisfile_video['bitrate_mode'] = 'vbr'; // maybe not, but probably - $thisfile_video['dataformat'] = 'avi'; - - if (isset($thisfile_riff[$RIFFsubtype]['movi']['offset'])) { - $info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['movi']['offset'] + 8; - if (isset($thisfile_riff['AVIX'])) { - $info['avdataend'] = $thisfile_riff['AVIX'][(count($thisfile_riff['AVIX']) - 1)]['chunks']['movi']['offset'] + $thisfile_riff['AVIX'][(count($thisfile_riff['AVIX']) - 1)]['chunks']['movi']['size']; - } else { - $info['avdataend'] = $thisfile_riff['AVI ']['movi']['offset'] + $thisfile_riff['AVI ']['movi']['size']; - } - if ($info['avdataend'] > $info['filesize']) { - $info['warning'][] = 'Probably truncated file - expecting '.($info['avdataend'] - $info['avdataoffset']).' bytes of data, only found '.($info['filesize'] - $info['avdataoffset']).' (short by '.($info['avdataend'] - $info['filesize']).' bytes)'; - $info['avdataend'] = $info['filesize']; - } - } - - if (isset($thisfile_riff['AVI ']['hdrl']['strl']['indx'])) { - //$bIndexType = array( - // 0x00 => 'AVI_INDEX_OF_INDEXES', - // 0x01 => 'AVI_INDEX_OF_CHUNKS', - // 0x80 => 'AVI_INDEX_IS_DATA', - //); - //$bIndexSubtype = array( - // 0x01 => array( - // 0x01 => 'AVI_INDEX_2FIELD', - // ), - //); - foreach ($thisfile_riff['AVI ']['hdrl']['strl']['indx'] as $streamnumber => $steamdataarray) { - $ahsisd = &$thisfile_riff['AVI ']['hdrl']['strl']['indx'][$streamnumber]['data']; - - $thisfile_riff_raw['indx'][$streamnumber]['wLongsPerEntry'] = $this->EitherEndian2Int(substr($ahsisd, 0, 2)); - $thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType'] = $this->EitherEndian2Int(substr($ahsisd, 2, 1)); - $thisfile_riff_raw['indx'][$streamnumber]['bIndexType'] = $this->EitherEndian2Int(substr($ahsisd, 3, 1)); - $thisfile_riff_raw['indx'][$streamnumber]['nEntriesInUse'] = $this->EitherEndian2Int(substr($ahsisd, 4, 4)); - $thisfile_riff_raw['indx'][$streamnumber]['dwChunkId'] = substr($ahsisd, 8, 4); - $thisfile_riff_raw['indx'][$streamnumber]['dwReserved'] = $this->EitherEndian2Int(substr($ahsisd, 12, 4)); - - //$thisfile_riff_raw['indx'][$streamnumber]['bIndexType_name'] = $bIndexType[$thisfile_riff_raw['indx'][$streamnumber]['bIndexType']]; - //$thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType_name'] = $bIndexSubtype[$thisfile_riff_raw['indx'][$streamnumber]['bIndexType']][$thisfile_riff_raw['indx'][$streamnumber]['bIndexSubType']]; - - unset($ahsisd); - } - } - if (isset($thisfile_riff['AVI ']['hdrl']['avih'][$streamindex]['data'])) { - $avihData = $thisfile_riff['AVI ']['hdrl']['avih'][$streamindex]['data']; - - // shortcut - $thisfile_riff_raw['avih'] = array(); - $thisfile_riff_raw_avih = &$thisfile_riff_raw['avih']; - - $thisfile_riff_raw_avih['dwMicroSecPerFrame'] = $this->EitherEndian2Int(substr($avihData, 0, 4)); // frame display rate (or 0L) - if ($thisfile_riff_raw_avih['dwMicroSecPerFrame'] == 0) { - $info['error'][] = 'Corrupt RIFF file: avih.dwMicroSecPerFrame == zero'; - return false; - } - - $flags = array( - 'dwMaxBytesPerSec', // max. transfer rate - 'dwPaddingGranularity', // pad to multiples of this size; normally 2K. - 'dwFlags', // the ever-present flags - 'dwTotalFrames', // # frames in file - 'dwInitialFrames', // - 'dwStreams', // - 'dwSuggestedBufferSize', // - 'dwWidth', // - 'dwHeight', // - 'dwScale', // - 'dwRate', // - 'dwStart', // - 'dwLength', // - ); - $avih_offset = 4; - foreach ($flags as $flag) { - $thisfile_riff_raw_avih[$flag] = $this->EitherEndian2Int(substr($avihData, $avih_offset, 4)); - $avih_offset += 4; - } - - $flags = array( - 'hasindex' => 0x00000010, - 'mustuseindex' => 0x00000020, - 'interleaved' => 0x00000100, - 'trustcktype' => 0x00000800, - 'capturedfile' => 0x00010000, - 'copyrighted' => 0x00020010, - ); - foreach ($flags as $flag => $value) { - $thisfile_riff_raw_avih['flags'][$flag] = (bool) ($thisfile_riff_raw_avih['dwFlags'] & $value); - } - - // shortcut - $thisfile_riff_video[$streamindex] = array(); - $thisfile_riff_video_current = &$thisfile_riff_video[$streamindex]; - - if ($thisfile_riff_raw_avih['dwWidth'] > 0) { - $thisfile_riff_video_current['frame_width'] = $thisfile_riff_raw_avih['dwWidth']; - $thisfile_video['resolution_x'] = $thisfile_riff_video_current['frame_width']; - } - if ($thisfile_riff_raw_avih['dwHeight'] > 0) { - $thisfile_riff_video_current['frame_height'] = $thisfile_riff_raw_avih['dwHeight']; - $thisfile_video['resolution_y'] = $thisfile_riff_video_current['frame_height']; - } - if ($thisfile_riff_raw_avih['dwTotalFrames'] > 0) { - $thisfile_riff_video_current['total_frames'] = $thisfile_riff_raw_avih['dwTotalFrames']; - $thisfile_video['total_frames'] = $thisfile_riff_video_current['total_frames']; - } - - $thisfile_riff_video_current['frame_rate'] = round(1000000 / $thisfile_riff_raw_avih['dwMicroSecPerFrame'], 3); - $thisfile_video['frame_rate'] = $thisfile_riff_video_current['frame_rate']; - } - if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][0]['data'])) { - if (is_array($thisfile_riff['AVI ']['hdrl']['strl']['strh'])) { - for ($i = 0; $i < count($thisfile_riff['AVI ']['hdrl']['strl']['strh']); $i++) { - if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data'])) { - $strhData = $thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data']; - $strhfccType = substr($strhData, 0, 4); - - if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data'])) { - $strfData = $thisfile_riff['AVI ']['hdrl']['strl']['strf'][$i]['data']; - - // shortcut - $thisfile_riff_raw_strf_strhfccType_streamindex = &$thisfile_riff_raw['strf'][$strhfccType][$streamindex]; - - switch ($strhfccType) { - case 'auds': - $thisfile_audio['bitrate_mode'] = 'cbr'; - $thisfile_audio_dataformat = 'wav'; - if (isset($thisfile_riff_audio) && is_array($thisfile_riff_audio)) { - $streamindex = count($thisfile_riff_audio); - } - - $thisfile_riff_audio[$streamindex] = self::parseWAVEFORMATex($strfData); - $thisfile_audio['wformattag'] = $thisfile_riff_audio[$streamindex]['raw']['wFormatTag']; - - // shortcut - $thisfile_audio['streams'][$streamindex] = $thisfile_riff_audio[$streamindex]; - $thisfile_audio_streams_currentstream = &$thisfile_audio['streams'][$streamindex]; - - if ($thisfile_audio_streams_currentstream['bits_per_sample'] == 0) { - unset($thisfile_audio_streams_currentstream['bits_per_sample']); - } - $thisfile_audio_streams_currentstream['wformattag'] = $thisfile_audio_streams_currentstream['raw']['wFormatTag']; - unset($thisfile_audio_streams_currentstream['raw']); - - // shortcut - $thisfile_riff_raw['strf'][$strhfccType][$streamindex] = $thisfile_riff_audio[$streamindex]['raw']; - - unset($thisfile_riff_audio[$streamindex]['raw']); - $thisfile_audio = getid3_lib::array_merge_noclobber($thisfile_audio, $thisfile_riff_audio[$streamindex]); - - $thisfile_audio['lossless'] = false; - switch ($thisfile_riff_raw_strf_strhfccType_streamindex['wFormatTag']) { - case 0x0001: // PCM - $thisfile_audio_dataformat = 'wav'; - $thisfile_audio['lossless'] = true; - break; - - case 0x0050: // MPEG Layer 2 or Layer 1 - $thisfile_audio_dataformat = 'mp2'; // Assume Layer-2 - break; - - case 0x0055: // MPEG Layer 3 - $thisfile_audio_dataformat = 'mp3'; - break; - - case 0x00FF: // AAC - $thisfile_audio_dataformat = 'aac'; - break; - - case 0x0161: // Windows Media v7 / v8 / v9 - case 0x0162: // Windows Media Professional v9 - case 0x0163: // Windows Media Lossess v9 - $thisfile_audio_dataformat = 'wma'; - break; - - case 0x2000: // AC-3 - $thisfile_audio_dataformat = 'ac3'; - break; - - case 0x2001: // DTS - $thisfile_audio_dataformat = 'dts'; - break; - - default: - $thisfile_audio_dataformat = 'wav'; - break; - } - $thisfile_audio_streams_currentstream['dataformat'] = $thisfile_audio_dataformat; - $thisfile_audio_streams_currentstream['lossless'] = $thisfile_audio['lossless']; - $thisfile_audio_streams_currentstream['bitrate_mode'] = $thisfile_audio['bitrate_mode']; - break; - - - case 'iavs': - case 'vids': - // shortcut - $thisfile_riff_raw['strh'][$i] = array(); - $thisfile_riff_raw_strh_current = &$thisfile_riff_raw['strh'][$i]; - - $thisfile_riff_raw_strh_current['fccType'] = substr($strhData, 0, 4); // same as $strhfccType; - $thisfile_riff_raw_strh_current['fccHandler'] = substr($strhData, 4, 4); - $thisfile_riff_raw_strh_current['dwFlags'] = $this->EitherEndian2Int(substr($strhData, 8, 4)); // Contains AVITF_* flags - $thisfile_riff_raw_strh_current['wPriority'] = $this->EitherEndian2Int(substr($strhData, 12, 2)); - $thisfile_riff_raw_strh_current['wLanguage'] = $this->EitherEndian2Int(substr($strhData, 14, 2)); - $thisfile_riff_raw_strh_current['dwInitialFrames'] = $this->EitherEndian2Int(substr($strhData, 16, 4)); - $thisfile_riff_raw_strh_current['dwScale'] = $this->EitherEndian2Int(substr($strhData, 20, 4)); - $thisfile_riff_raw_strh_current['dwRate'] = $this->EitherEndian2Int(substr($strhData, 24, 4)); - $thisfile_riff_raw_strh_current['dwStart'] = $this->EitherEndian2Int(substr($strhData, 28, 4)); - $thisfile_riff_raw_strh_current['dwLength'] = $this->EitherEndian2Int(substr($strhData, 32, 4)); - $thisfile_riff_raw_strh_current['dwSuggestedBufferSize'] = $this->EitherEndian2Int(substr($strhData, 36, 4)); - $thisfile_riff_raw_strh_current['dwQuality'] = $this->EitherEndian2Int(substr($strhData, 40, 4)); - $thisfile_riff_raw_strh_current['dwSampleSize'] = $this->EitherEndian2Int(substr($strhData, 44, 4)); - $thisfile_riff_raw_strh_current['rcFrame'] = $this->EitherEndian2Int(substr($strhData, 48, 4)); - - $thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_riff_raw_strh_current['fccHandler']); - $thisfile_video['fourcc'] = $thisfile_riff_raw_strh_current['fccHandler']; - if (!$thisfile_riff_video_current['codec'] && isset($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) && self::fourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'])) { - $thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']); - $thisfile_video['fourcc'] = $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']; - } - $thisfile_video['codec'] = $thisfile_riff_video_current['codec']; - $thisfile_video['pixel_aspect_ratio'] = (float) 1; - switch ($thisfile_riff_raw_strh_current['fccHandler']) { - case 'HFYU': // Huffman Lossless Codec - case 'IRAW': // Intel YUV Uncompressed - case 'YUY2': // Uncompressed YUV 4:2:2 - $thisfile_video['lossless'] = true; - break; - - default: - $thisfile_video['lossless'] = false; - break; - } - - switch ($strhfccType) { - case 'vids': - $thisfile_riff_raw_strf_strhfccType_streamindex = self::ParseBITMAPINFOHEADER(substr($strfData, 0, 40), ($this->container == 'riff')); - $thisfile_video['bits_per_sample'] = $thisfile_riff_raw_strf_strhfccType_streamindex['biBitCount']; - - if ($thisfile_riff_video_current['codec'] == 'DV') { - $thisfile_riff_video_current['dv_type'] = 2; - } - break; - - case 'iavs': - $thisfile_riff_video_current['dv_type'] = 1; - break; - } - break; - - default: - $info['warning'][] = 'Unhandled fccType for stream ('.$i.'): "'.$strhfccType.'"'; - break; - - } - } - } - - if (isset($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc'])) { - - $thisfile_video['fourcc'] = $thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']; - if (self::fourccLookup($thisfile_video['fourcc'])) { - $thisfile_riff_video_current['codec'] = self::fourccLookup($thisfile_video['fourcc']); - $thisfile_video['codec'] = $thisfile_riff_video_current['codec']; - } - - switch ($thisfile_riff_raw_strf_strhfccType_streamindex['fourcc']) { - case 'HFYU': // Huffman Lossless Codec - case 'IRAW': // Intel YUV Uncompressed - case 'YUY2': // Uncompressed YUV 4:2:2 - $thisfile_video['lossless'] = true; - //$thisfile_video['bits_per_sample'] = 24; - break; - - default: - $thisfile_video['lossless'] = false; - //$thisfile_video['bits_per_sample'] = 24; - break; - } - - } - } - } - } - break; - - - case 'AMV ': - $info['fileformat'] = 'amv'; - $info['mime_type'] = 'video/amv'; - - $thisfile_video['bitrate_mode'] = 'vbr'; // it's MJPEG, presumably contant-quality encoding, thereby VBR - $thisfile_video['dataformat'] = 'mjpeg'; - $thisfile_video['codec'] = 'mjpeg'; - $thisfile_video['lossless'] = false; - $thisfile_video['bits_per_sample'] = 24; - - $thisfile_audio['dataformat'] = 'adpcm'; - $thisfile_audio['lossless'] = false; - break; - - - // http://en.wikipedia.org/wiki/CD-DA - case 'CDDA': - $info['fileformat'] = 'cda'; - unset($info['mime_type']); - - $thisfile_audio_dataformat = 'cda'; - - $info['avdataoffset'] = 44; - - if (isset($thisfile_riff['CDDA']['fmt '][0]['data'])) { - // shortcut - $thisfile_riff_CDDA_fmt_0 = &$thisfile_riff['CDDA']['fmt '][0]; - - $thisfile_riff_CDDA_fmt_0['unknown1'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 0, 2)); - $thisfile_riff_CDDA_fmt_0['track_num'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 2, 2)); - $thisfile_riff_CDDA_fmt_0['disc_id'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 4, 4)); - $thisfile_riff_CDDA_fmt_0['start_offset_frame'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 8, 4)); - $thisfile_riff_CDDA_fmt_0['playtime_frames'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 12, 4)); - $thisfile_riff_CDDA_fmt_0['unknown6'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 16, 4)); - $thisfile_riff_CDDA_fmt_0['unknown7'] = $this->EitherEndian2Int(substr($thisfile_riff_CDDA_fmt_0['data'], 20, 4)); - - $thisfile_riff_CDDA_fmt_0['start_offset_seconds'] = (float) $thisfile_riff_CDDA_fmt_0['start_offset_frame'] / 75; - $thisfile_riff_CDDA_fmt_0['playtime_seconds'] = (float) $thisfile_riff_CDDA_fmt_0['playtime_frames'] / 75; - $info['comments']['track'] = $thisfile_riff_CDDA_fmt_0['track_num']; - $info['playtime_seconds'] = $thisfile_riff_CDDA_fmt_0['playtime_seconds']; - - // hardcoded data for CD-audio - $thisfile_audio['lossless'] = true; - $thisfile_audio['sample_rate'] = 44100; - $thisfile_audio['channels'] = 2; - $thisfile_audio['bits_per_sample'] = 16; - $thisfile_audio['bitrate'] = $thisfile_audio['sample_rate'] * $thisfile_audio['channels'] * $thisfile_audio['bits_per_sample']; - $thisfile_audio['bitrate_mode'] = 'cbr'; - } - break; - - // http://en.wikipedia.org/wiki/AIFF - case 'AIFF': - case 'AIFC': - $info['fileformat'] = 'aiff'; - $info['mime_type'] = 'audio/x-aiff'; - - $thisfile_audio['bitrate_mode'] = 'cbr'; - $thisfile_audio_dataformat = 'aiff'; - $thisfile_audio['lossless'] = true; - - if (isset($thisfile_riff[$RIFFsubtype]['SSND'][0]['offset'])) { - $info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['SSND'][0]['offset'] + 8; - $info['avdataend'] = $info['avdataoffset'] + $thisfile_riff[$RIFFsubtype]['SSND'][0]['size']; - if ($info['avdataend'] > $info['filesize']) { - if (($info['avdataend'] == ($info['filesize'] + 1)) && (($info['filesize'] % 2) == 1)) { - // structures rounded to 2-byte boundary, but dumb encoders - // forget to pad end of file to make this actually work - } else { - $info['warning'][] = 'Probable truncated AIFF file: expecting '.$thisfile_riff[$RIFFsubtype]['SSND'][0]['size'].' bytes of audio data, only '.($info['filesize'] - $info['avdataoffset']).' bytes found'; - } - $info['avdataend'] = $info['filesize']; - } - } - - if (isset($thisfile_riff[$RIFFsubtype]['COMM'][0]['data'])) { - - // shortcut - $thisfile_riff_RIFFsubtype_COMM_0_data = &$thisfile_riff[$RIFFsubtype]['COMM'][0]['data']; - - $thisfile_riff_audio['channels'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 0, 2), true); - $thisfile_riff_audio['total_samples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 2, 4), false); - $thisfile_riff_audio['bits_per_sample'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 6, 2), true); - $thisfile_riff_audio['sample_rate'] = (int) getid3_lib::BigEndian2Float(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 8, 10)); - - if ($thisfile_riff[$RIFFsubtype]['COMM'][0]['size'] > 18) { - $thisfile_riff_audio['codec_fourcc'] = substr($thisfile_riff_RIFFsubtype_COMM_0_data, 18, 4); - $CodecNameSize = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_COMM_0_data, 22, 1), false); - $thisfile_riff_audio['codec_name'] = substr($thisfile_riff_RIFFsubtype_COMM_0_data, 23, $CodecNameSize); - switch ($thisfile_riff_audio['codec_name']) { - case 'NONE': - $thisfile_audio['codec'] = 'Pulse Code Modulation (PCM)'; - $thisfile_audio['lossless'] = true; - break; - - case '': - switch ($thisfile_riff_audio['codec_fourcc']) { - // http://developer.apple.com/qa/snd/snd07.html - case 'sowt': - $thisfile_riff_audio['codec_name'] = 'Two\'s Compliment Little-Endian PCM'; - $thisfile_audio['lossless'] = true; - break; - - case 'twos': - $thisfile_riff_audio['codec_name'] = 'Two\'s Compliment Big-Endian PCM'; - $thisfile_audio['lossless'] = true; - break; - - default: - break; - } - break; - - default: - $thisfile_audio['codec'] = $thisfile_riff_audio['codec_name']; - $thisfile_audio['lossless'] = false; - break; - } - } - - $thisfile_audio['channels'] = $thisfile_riff_audio['channels']; - if ($thisfile_riff_audio['bits_per_sample'] > 0) { - $thisfile_audio['bits_per_sample'] = $thisfile_riff_audio['bits_per_sample']; - } - $thisfile_audio['sample_rate'] = $thisfile_riff_audio['sample_rate']; - if ($thisfile_audio['sample_rate'] == 0) { - $info['error'][] = 'Corrupted AIFF file: sample_rate == zero'; - return false; - } - $info['playtime_seconds'] = $thisfile_riff_audio['total_samples'] / $thisfile_audio['sample_rate']; - } - - if (isset($thisfile_riff[$RIFFsubtype]['COMT'])) { - $offset = 0; - $CommentCount = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), false); - $offset += 2; - for ($i = 0; $i < $CommentCount; $i++) { - $info['comments_raw'][$i]['timestamp'] = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 4), false); - $offset += 4; - $info['comments_raw'][$i]['marker_id'] = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), true); - $offset += 2; - $CommentLength = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, 2), false); - $offset += 2; - $info['comments_raw'][$i]['comment'] = substr($thisfile_riff[$RIFFsubtype]['COMT'][0]['data'], $offset, $CommentLength); - $offset += $CommentLength; - - $info['comments_raw'][$i]['timestamp_unix'] = getid3_lib::DateMac2Unix($info['comments_raw'][$i]['timestamp']); - $thisfile_riff['comments']['comment'][] = $info['comments_raw'][$i]['comment']; - } - } - - $CommentsChunkNames = array('NAME'=>'title', 'author'=>'artist', '(c) '=>'copyright', 'ANNO'=>'comment'); - foreach ($CommentsChunkNames as $key => $value) { - if (isset($thisfile_riff[$RIFFsubtype][$key][0]['data'])) { - $thisfile_riff['comments'][$value][] = $thisfile_riff[$RIFFsubtype][$key][0]['data']; - } - } -/* - if (isset($thisfile_riff[$RIFFsubtype]['ID3 '])) { - getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); - $getid3_temp = new getID3(); - $getid3_temp->openfile($this->getid3->filename); - $getid3_id3v2 = new getid3_id3v2($getid3_temp); - $getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['ID3 '][0]['offset'] + 8; - if ($thisfile_riff[$RIFFsubtype]['ID3 '][0]['valid'] = $getid3_id3v2->Analyze()) { - $info['id3v2'] = $getid3_temp->info['id3v2']; - } - unset($getid3_temp, $getid3_id3v2); - } -*/ - break; - - // http://en.wikipedia.org/wiki/8SVX - case '8SVX': - $info['fileformat'] = '8svx'; - $info['mime_type'] = 'audio/8svx'; - - $thisfile_audio['bitrate_mode'] = 'cbr'; - $thisfile_audio_dataformat = '8svx'; - $thisfile_audio['bits_per_sample'] = 8; - $thisfile_audio['channels'] = 1; // overridden below, if need be - - if (isset($thisfile_riff[$RIFFsubtype]['BODY'][0]['offset'])) { - $info['avdataoffset'] = $thisfile_riff[$RIFFsubtype]['BODY'][0]['offset'] + 8; - $info['avdataend'] = $info['avdataoffset'] + $thisfile_riff[$RIFFsubtype]['BODY'][0]['size']; - if ($info['avdataend'] > $info['filesize']) { - $info['warning'][] = 'Probable truncated AIFF file: expecting '.$thisfile_riff[$RIFFsubtype]['BODY'][0]['size'].' bytes of audio data, only '.($info['filesize'] - $info['avdataoffset']).' bytes found'; - } - } - - if (isset($thisfile_riff[$RIFFsubtype]['VHDR'][0]['offset'])) { - // shortcut - $thisfile_riff_RIFFsubtype_VHDR_0 = &$thisfile_riff[$RIFFsubtype]['VHDR'][0]; - - $thisfile_riff_RIFFsubtype_VHDR_0['oneShotHiSamples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 0, 4)); - $thisfile_riff_RIFFsubtype_VHDR_0['repeatHiSamples'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 4, 4)); - $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerHiCycle'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 8, 4)); - $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerSec'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 12, 2)); - $thisfile_riff_RIFFsubtype_VHDR_0['ctOctave'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 14, 1)); - $thisfile_riff_RIFFsubtype_VHDR_0['sCompression'] = getid3_lib::BigEndian2Int(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 15, 1)); - $thisfile_riff_RIFFsubtype_VHDR_0['Volume'] = getid3_lib::FixedPoint16_16(substr($thisfile_riff_RIFFsubtype_VHDR_0['data'], 16, 4)); - - $thisfile_audio['sample_rate'] = $thisfile_riff_RIFFsubtype_VHDR_0['samplesPerSec']; - - switch ($thisfile_riff_RIFFsubtype_VHDR_0['sCompression']) { - case 0: - $thisfile_audio['codec'] = 'Pulse Code Modulation (PCM)'; - $thisfile_audio['lossless'] = true; - $ActualBitsPerSample = 8; - break; - - case 1: - $thisfile_audio['codec'] = 'Fibonacci-delta encoding'; - $thisfile_audio['lossless'] = false; - $ActualBitsPerSample = 4; - break; - - default: - $info['warning'][] = 'Unexpected sCompression value in 8SVX.VHDR chunk - expecting 0 or 1, found "'.sCompression.'"'; - break; - } - } - - if (isset($thisfile_riff[$RIFFsubtype]['CHAN'][0]['data'])) { - $ChannelsIndex = getid3_lib::BigEndian2Int(substr($thisfile_riff[$RIFFsubtype]['CHAN'][0]['data'], 0, 4)); - switch ($ChannelsIndex) { - case 6: // Stereo - $thisfile_audio['channels'] = 2; - break; - - case 2: // Left channel only - case 4: // Right channel only - $thisfile_audio['channels'] = 1; - break; - - default: - $info['warning'][] = 'Unexpected value in 8SVX.CHAN chunk - expecting 2 or 4 or 6, found "'.$ChannelsIndex.'"'; - break; - } - - } - - $CommentsChunkNames = array('NAME'=>'title', 'author'=>'artist', '(c) '=>'copyright', 'ANNO'=>'comment'); - foreach ($CommentsChunkNames as $key => $value) { - if (isset($thisfile_riff[$RIFFsubtype][$key][0]['data'])) { - $thisfile_riff['comments'][$value][] = $thisfile_riff[$RIFFsubtype][$key][0]['data']; - } - } - - $thisfile_audio['bitrate'] = $thisfile_audio['sample_rate'] * $ActualBitsPerSample * $thisfile_audio['channels']; - if (!empty($thisfile_audio['bitrate'])) { - $info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset']) / ($thisfile_audio['bitrate'] / 8); - } - break; - - case 'CDXA': - $info['fileformat'] = 'vcd'; // Asume Video CD - $info['mime_type'] = 'video/mpeg'; - - if (!empty($thisfile_riff['CDXA']['data'][0]['size'])) { - getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.mpeg.php', __FILE__, true); - - $getid3_temp = new getID3(); - $getid3_temp->openfile($this->getid3->filename); - $getid3_mpeg = new getid3_mpeg($getid3_temp); - $getid3_mpeg->Analyze(); - if (empty($getid3_temp->info['error'])) { - $info['audio'] = $getid3_temp->info['audio']; - $info['video'] = $getid3_temp->info['video']; - $info['mpeg'] = $getid3_temp->info['mpeg']; - $info['warning'] = $getid3_temp->info['warning']; - } - unset($getid3_temp, $getid3_mpeg); - } - break; - - - default: - $info['error'][] = 'Unknown RIFF type: expecting one of (WAVE|RMP3|AVI |CDDA|AIFF|AIFC|8SVX|CDXA), found "'.$RIFFsubtype.'" instead'; - //unset($info['fileformat']); - } - - switch ($RIFFsubtype) { - case 'WAVE': - case 'AIFF': - case 'AIFC': - $ID3v2_key_good = 'id3 '; - $ID3v2_keys_bad = array('ID3 ', 'tag '); - foreach ($ID3v2_keys_bad as $ID3v2_key_bad) { - if (isset($thisfile_riff[$RIFFsubtype][$ID3v2_key_bad]) && !array_key_exists($ID3v2_key_good, $thisfile_riff[$RIFFsubtype])) { - $thisfile_riff[$RIFFsubtype][$ID3v2_key_good] = $thisfile_riff[$RIFFsubtype][$ID3v2_key_bad]; - $info['warning'][] = 'mapping "'.$ID3v2_key_bad.'" chunk to "'.$ID3v2_key_good.'"'; - } - } - - if (isset($thisfile_riff[$RIFFsubtype]['id3 '])) { - getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true); - - $getid3_temp = new getID3(); - $getid3_temp->openfile($this->getid3->filename); - $getid3_id3v2 = new getid3_id3v2($getid3_temp); - $getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['id3 '][0]['offset'] + 8; - if ($thisfile_riff[$RIFFsubtype]['id3 '][0]['valid'] = $getid3_id3v2->Analyze()) { - $info['id3v2'] = $getid3_temp->info['id3v2']; - } - unset($getid3_temp, $getid3_id3v2); - } - break; - } - - if (isset($thisfile_riff_WAVE['DISP']) && is_array($thisfile_riff_WAVE['DISP'])) { - $thisfile_riff['comments']['title'][] = trim(substr($thisfile_riff_WAVE['DISP'][count($thisfile_riff_WAVE['DISP']) - 1]['data'], 4)); - } - if (isset($thisfile_riff_WAVE['INFO']) && is_array($thisfile_riff_WAVE['INFO'])) { - self::parseComments($thisfile_riff_WAVE['INFO'], $thisfile_riff['comments']); - } - if (isset($thisfile_riff['AVI ']['INFO']) && is_array($thisfile_riff['AVI ']['INFO'])) { - self::parseComments($thisfile_riff['AVI ']['INFO'], $thisfile_riff['comments']); - } - - if (empty($thisfile_audio['encoder']) && !empty($info['mpeg']['audio']['LAME']['short_version'])) { - $thisfile_audio['encoder'] = $info['mpeg']['audio']['LAME']['short_version']; - } - - if (!isset($info['playtime_seconds'])) { - $info['playtime_seconds'] = 0; - } - if (isset($thisfile_riff_raw['strh'][0]['dwLength']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) { - // needed for >2GB AVIs where 'avih' chunk only lists number of frames in that chunk, not entire movie - $info['playtime_seconds'] = $thisfile_riff_raw['strh'][0]['dwLength'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000); - } elseif (isset($thisfile_riff_raw['avih']['dwTotalFrames']) && isset($thisfile_riff_raw['avih']['dwMicroSecPerFrame'])) { - $info['playtime_seconds'] = $thisfile_riff_raw['avih']['dwTotalFrames'] * ($thisfile_riff_raw['avih']['dwMicroSecPerFrame'] / 1000000); - } - - if ($info['playtime_seconds'] > 0) { - if (isset($thisfile_riff_audio) && isset($thisfile_riff_video)) { - - if (!isset($info['bitrate'])) { - $info['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); - } - - } elseif (isset($thisfile_riff_audio) && !isset($thisfile_riff_video)) { - - if (!isset($thisfile_audio['bitrate'])) { - $thisfile_audio['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); - } - - } elseif (!isset($thisfile_riff_audio) && isset($thisfile_riff_video)) { - - if (!isset($thisfile_video['bitrate'])) { - $thisfile_video['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); - } - - } - } - - - if (isset($thisfile_riff_video) && isset($thisfile_audio['bitrate']) && ($thisfile_audio['bitrate'] > 0) && ($info['playtime_seconds'] > 0)) { - - $info['bitrate'] = ((($info['avdataend'] - $info['avdataoffset']) / $info['playtime_seconds']) * 8); - $thisfile_audio['bitrate'] = 0; - $thisfile_video['bitrate'] = $info['bitrate']; - foreach ($thisfile_riff_audio as $channelnumber => $audioinfoarray) { - $thisfile_video['bitrate'] -= $audioinfoarray['bitrate']; - $thisfile_audio['bitrate'] += $audioinfoarray['bitrate']; - } - if ($thisfile_video['bitrate'] <= 0) { - unset($thisfile_video['bitrate']); - } - if ($thisfile_audio['bitrate'] <= 0) { - unset($thisfile_audio['bitrate']); - } - } - - if (isset($info['mpeg']['audio'])) { - $thisfile_audio_dataformat = 'mp'.$info['mpeg']['audio']['layer']; - $thisfile_audio['sample_rate'] = $info['mpeg']['audio']['sample_rate']; - $thisfile_audio['channels'] = $info['mpeg']['audio']['channels']; - $thisfile_audio['bitrate'] = $info['mpeg']['audio']['bitrate']; - $thisfile_audio['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); - if (!empty($info['mpeg']['audio']['codec'])) { - $thisfile_audio['codec'] = $info['mpeg']['audio']['codec'].' '.$thisfile_audio['codec']; - } - if (!empty($thisfile_audio['streams'])) { - foreach ($thisfile_audio['streams'] as $streamnumber => $streamdata) { - if ($streamdata['dataformat'] == $thisfile_audio_dataformat) { - $thisfile_audio['streams'][$streamnumber]['sample_rate'] = $thisfile_audio['sample_rate']; - $thisfile_audio['streams'][$streamnumber]['channels'] = $thisfile_audio['channels']; - $thisfile_audio['streams'][$streamnumber]['bitrate'] = $thisfile_audio['bitrate']; - $thisfile_audio['streams'][$streamnumber]['bitrate_mode'] = $thisfile_audio['bitrate_mode']; - $thisfile_audio['streams'][$streamnumber]['codec'] = $thisfile_audio['codec']; - } - } - } - $getid3_mp3 = new getid3_mp3($this->getid3); - $thisfile_audio['encoder_options'] = $getid3_mp3->GuessEncoderOptions(); - unset($getid3_mp3); - } - - - if (!empty($thisfile_riff_raw['fmt ']['wBitsPerSample']) && ($thisfile_riff_raw['fmt ']['wBitsPerSample'] > 0)) { - switch ($thisfile_audio_dataformat) { - case 'ac3': - // ignore bits_per_sample - break; - - default: - $thisfile_audio['bits_per_sample'] = $thisfile_riff_raw['fmt ']['wBitsPerSample']; - break; - } - } - - - if (empty($thisfile_riff_raw)) { - unset($thisfile_riff['raw']); - } - if (empty($thisfile_riff_audio)) { - unset($thisfile_riff['audio']); - } - if (empty($thisfile_riff_video)) { - unset($thisfile_riff['video']); - } - - return true; - } - - public function ParseRIFFAMV($startoffset, $maxoffset) { - // AMV files are RIFF-AVI files with parts of the spec deliberately broken, such as chunk size fields hardcoded to zero (because players known in hardware that these fields are always a certain size - - // https://code.google.com/p/amv-codec-tools/wiki/AmvDocumentation - //typedef struct _amvmainheader { - //FOURCC fcc; // 'amvh' - //DWORD cb; - //DWORD dwMicroSecPerFrame; - //BYTE reserve[28]; - //DWORD dwWidth; - //DWORD dwHeight; - //DWORD dwSpeed; - //DWORD reserve0; - //DWORD reserve1; - //BYTE bTimeSec; - //BYTE bTimeMin; - //WORD wTimeHour; - //} AMVMAINHEADER; - - $info = &$this->getid3->info; - $RIFFchunk = false; - - try { - - $this->fseek($startoffset); - $maxoffset = min($maxoffset, $info['avdataend']); - $AMVheader = $this->fread(284); - if (substr($AMVheader, 0, 8) != 'hdrlamvh') { - throw new Exception('expecting "hdrlamv" at offset '.($startoffset + 0).', found "'.substr($AMVheader, 0, 8).'"'); - } - if (substr($AMVheader, 8, 4) != "\x38\x00\x00\x00") { // "amvh" chunk size, hardcoded to 0x38 = 56 bytes - throw new Exception('expecting "0x38000000" at offset '.($startoffset + 8).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 8, 4)).'"'); - } - $RIFFchunk = array(); - $RIFFchunk['amvh']['us_per_frame'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 12, 4)); - $RIFFchunk['amvh']['reserved28'] = substr($AMVheader, 16, 28); // null? reserved? - $RIFFchunk['amvh']['resolution_x'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 44, 4)); - $RIFFchunk['amvh']['resolution_y'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 48, 4)); - $RIFFchunk['amvh']['frame_rate_int'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 52, 4)); - $RIFFchunk['amvh']['reserved0'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 56, 4)); // 1? reserved? - $RIFFchunk['amvh']['reserved1'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 60, 4)); // 0? reserved? - $RIFFchunk['amvh']['runtime_sec'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 64, 1)); - $RIFFchunk['amvh']['runtime_min'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 65, 1)); - $RIFFchunk['amvh']['runtime_hrs'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 66, 2)); - - $info['video']['frame_rate'] = 1000000 / $RIFFchunk['amvh']['us_per_frame']; - $info['video']['resolution_x'] = $RIFFchunk['amvh']['resolution_x']; - $info['video']['resolution_y'] = $RIFFchunk['amvh']['resolution_y']; - $info['playtime_seconds'] = ($RIFFchunk['amvh']['runtime_hrs'] * 3600) + ($RIFFchunk['amvh']['runtime_min'] * 60) + $RIFFchunk['amvh']['runtime_sec']; - - // the rest is all hardcoded(?) and does not appear to be useful until you get to audio info at offset 256, even then everything is probably hardcoded - - if (substr($AMVheader, 68, 20) != 'LIST'."\x00\x00\x00\x00".'strlstrh'."\x38\x00\x00\x00") { - throw new Exception('expecting "LIST<0x00000000>strlstrh<0x38000000>" at offset '.($startoffset + 68).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 68, 20)).'"'); - } - // followed by 56 bytes of null: substr($AMVheader, 88, 56) -> 144 - if (substr($AMVheader, 144, 8) != 'strf'."\x24\x00\x00\x00") { - throw new Exception('expecting "strf<0x24000000>" at offset '.($startoffset + 144).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 144, 8)).'"'); - } - // followed by 36 bytes of null: substr($AMVheader, 144, 36) -> 180 - - if (substr($AMVheader, 188, 20) != 'LIST'."\x00\x00\x00\x00".'strlstrh'."\x30\x00\x00\x00") { - throw new Exception('expecting "LIST<0x00000000>strlstrh<0x30000000>" at offset '.($startoffset + 188).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 188, 20)).'"'); - } - // followed by 48 bytes of null: substr($AMVheader, 208, 48) -> 256 - if (substr($AMVheader, 256, 8) != 'strf'."\x14\x00\x00\x00") { - throw new Exception('expecting "strf<0x14000000>" at offset '.($startoffset + 256).', found "'.getid3_lib::PrintHexBytes(substr($AMVheader, 256, 8)).'"'); - } - // followed by 20 bytes of a modified WAVEFORMATEX: - // typedef struct { - // WORD wFormatTag; //(Fixme: this is equal to PCM's 0x01 format code) - // WORD nChannels; //(Fixme: this is always 1) - // DWORD nSamplesPerSec; //(Fixme: for all known sample files this is equal to 22050) - // DWORD nAvgBytesPerSec; //(Fixme: for all known sample files this is equal to 44100) - // WORD nBlockAlign; //(Fixme: this seems to be 2 in AMV files, is this correct ?) - // WORD wBitsPerSample; //(Fixme: this seems to be 16 in AMV files instead of the expected 4) - // WORD cbSize; //(Fixme: this seems to be 0 in AMV files) - // WORD reserved; - // } WAVEFORMATEX; - $RIFFchunk['strf']['wformattag'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 264, 2)); - $RIFFchunk['strf']['nchannels'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 266, 2)); - $RIFFchunk['strf']['nsamplespersec'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 268, 4)); - $RIFFchunk['strf']['navgbytespersec'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 272, 4)); - $RIFFchunk['strf']['nblockalign'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 276, 2)); - $RIFFchunk['strf']['wbitspersample'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 278, 2)); - $RIFFchunk['strf']['cbsize'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 280, 2)); - $RIFFchunk['strf']['reserved'] = getid3_lib::LittleEndian2Int(substr($AMVheader, 282, 2)); - - - $info['audio']['lossless'] = false; - $info['audio']['sample_rate'] = $RIFFchunk['strf']['nsamplespersec']; - $info['audio']['channels'] = $RIFFchunk['strf']['nchannels']; - $info['audio']['bits_per_sample'] = $RIFFchunk['strf']['wbitspersample']; - $info['audio']['bitrate'] = $info['audio']['sample_rate'] * $info['audio']['channels'] * $info['audio']['bits_per_sample']; - $info['audio']['bitrate_mode'] = 'cbr'; - - - } catch (getid3_exception $e) { - if ($e->getCode() == 10) { - $this->warning('RIFFAMV parser: '.$e->getMessage()); - } else { - throw $e; - } - } - - return $RIFFchunk; - } - - - public function ParseRIFF($startoffset, $maxoffset) { - $info = &$this->getid3->info; - - $RIFFchunk = false; - $FoundAllChunksWeNeed = false; - - try { - $this->fseek($startoffset); - $maxoffset = min($maxoffset, $info['avdataend']); - while ($this->ftell() < $maxoffset) { - $chunknamesize = $this->fread(8); - //$chunkname = substr($chunknamesize, 0, 4); - $chunkname = str_replace("\x00", '_', substr($chunknamesize, 0, 4)); // note: chunk names of 4 null bytes do appear to be legal (has been observed inside INFO and PRMI chunks, for example), but makes traversing array keys more difficult - $chunksize = $this->EitherEndian2Int(substr($chunknamesize, 4, 4)); - //if (strlen(trim($chunkname, "\x00")) < 4) { - if (strlen($chunkname) < 4) { - $this->error('Expecting chunk name at offset '.($this->ftell() - 8).' but found nothing. Aborting RIFF parsing.'); - break; - } - if (($chunksize == 0) && ($chunkname != 'JUNK')) { - $this->warning('Chunk ('.$chunkname.') size at offset '.($this->ftell() - 4).' is zero. Aborting RIFF parsing.'); - break; - } - if (($chunksize % 2) != 0) { - // all structures are packed on word boundaries - $chunksize++; - } - - switch ($chunkname) { - case 'LIST': - $listname = $this->fread(4); - if (preg_match('#^(movi|rec )$#i', $listname)) { - $RIFFchunk[$listname]['offset'] = $this->ftell() - 4; - $RIFFchunk[$listname]['size'] = $chunksize; - - if (!$FoundAllChunksWeNeed) { - $WhereWeWere = $this->ftell(); - $AudioChunkHeader = $this->fread(12); - $AudioChunkStreamNum = substr($AudioChunkHeader, 0, 2); - $AudioChunkStreamType = substr($AudioChunkHeader, 2, 2); - $AudioChunkSize = getid3_lib::LittleEndian2Int(substr($AudioChunkHeader, 4, 4)); - - if ($AudioChunkStreamType == 'wb') { - $FirstFourBytes = substr($AudioChunkHeader, 8, 4); - if (preg_match('/^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]/s', $FirstFourBytes)) { - // MP3 - if (getid3_mp3::MPEGaudioHeaderBytesValid($FirstFourBytes)) { - $getid3_temp = new getID3(); - $getid3_temp->openfile($this->getid3->filename); - $getid3_temp->info['avdataoffset'] = $this->ftell() - 4; - $getid3_temp->info['avdataend'] = $this->ftell() + $AudioChunkSize; - $getid3_mp3 = new getid3_mp3($getid3_temp, __CLASS__); - $getid3_mp3->getOnlyMPEGaudioInfo($getid3_temp->info['avdataoffset'], false); - if (isset($getid3_temp->info['mpeg']['audio'])) { - $info['mpeg']['audio'] = $getid3_temp->info['mpeg']['audio']; - $info['audio'] = $getid3_temp->info['audio']; - $info['audio']['dataformat'] = 'mp'.$info['mpeg']['audio']['layer']; - $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; - $info['audio']['channels'] = $info['mpeg']['audio']['channels']; - $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; - $info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); - //$info['bitrate'] = $info['audio']['bitrate']; - } - unset($getid3_temp, $getid3_mp3); - } - - } elseif (strpos($FirstFourBytes, getid3_ac3::syncword) === 0) { - - // AC3 - $getid3_temp = new getID3(); - $getid3_temp->openfile($this->getid3->filename); - $getid3_temp->info['avdataoffset'] = $this->ftell() - 4; - $getid3_temp->info['avdataend'] = $this->ftell() + $AudioChunkSize; - $getid3_ac3 = new getid3_ac3($getid3_temp); - $getid3_ac3->Analyze(); - if (empty($getid3_temp->info['error'])) { - $info['audio'] = $getid3_temp->info['audio']; - $info['ac3'] = $getid3_temp->info['ac3']; - if (!empty($getid3_temp->info['warning'])) { - foreach ($getid3_temp->info['warning'] as $key => $value) { - $info['warning'][] = $value; - } - } - } - unset($getid3_temp, $getid3_ac3); - } - } - $FoundAllChunksWeNeed = true; - $this->fseek($WhereWeWere); - } - $this->fseek($chunksize - 4, SEEK_CUR); - - } else { - - if (!isset($RIFFchunk[$listname])) { - $RIFFchunk[$listname] = array(); - } - $LISTchunkParent = $listname; - $LISTchunkMaxOffset = $this->ftell() - 4 + $chunksize; - if ($parsedChunk = $this->ParseRIFF($this->ftell(), $LISTchunkMaxOffset)) { - $RIFFchunk[$listname] = array_merge_recursive($RIFFchunk[$listname], $parsedChunk); - } - - } - break; - - default: - if (preg_match('#^[0-9]{2}(wb|pc|dc|db)$#', $chunkname)) { - $this->fseek($chunksize, SEEK_CUR); - break; - } - $thisindex = 0; - if (isset($RIFFchunk[$chunkname]) && is_array($RIFFchunk[$chunkname])) { - $thisindex = count($RIFFchunk[$chunkname]); - } - $RIFFchunk[$chunkname][$thisindex]['offset'] = $this->ftell() - 8; - $RIFFchunk[$chunkname][$thisindex]['size'] = $chunksize; - switch ($chunkname) { - case 'data': - $info['avdataoffset'] = $this->ftell(); - $info['avdataend'] = $info['avdataoffset'] + $chunksize; - - $testData = $this->fread(36); - if ($testData === '') { - break; - } - if (preg_match('/^\xFF[\xE2-\xE7\xF2-\xF7\xFA-\xFF][\x00-\xEB]/s', substr($testData, 0, 4))) { - - // Probably is MP3 data - if (getid3_mp3::MPEGaudioHeaderBytesValid(substr($testData, 0, 4))) { - $getid3_temp = new getID3(); - $getid3_temp->openfile($this->getid3->filename); - $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; - $getid3_temp->info['avdataend'] = $info['avdataend']; - $getid3_mp3 = new getid3_mp3($getid3_temp, __CLASS__); - $getid3_mp3->getOnlyMPEGaudioInfo($info['avdataoffset'], false); - if (empty($getid3_temp->info['error'])) { - $info['audio'] = $getid3_temp->info['audio']; - $info['mpeg'] = $getid3_temp->info['mpeg']; - } - unset($getid3_temp, $getid3_mp3); - } - - } elseif (($isRegularAC3 = (substr($testData, 0, 2) == getid3_ac3::syncword)) || substr($testData, 8, 2) == strrev(getid3_ac3::syncword)) { - - // This is probably AC-3 data - $getid3_temp = new getID3(); - if ($isRegularAC3) { - $getid3_temp->openfile($this->getid3->filename); - $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; - $getid3_temp->info['avdataend'] = $info['avdataend']; - } - $getid3_ac3 = new getid3_ac3($getid3_temp); - if ($isRegularAC3) { - $getid3_ac3->Analyze(); - } else { - // Dolby Digital WAV - // AC-3 content, but not encoded in same format as normal AC-3 file - // For one thing, byte order is swapped - $ac3_data = ''; - for ($i = 0; $i < 28; $i += 2) { - $ac3_data .= substr($testData, 8 + $i + 1, 1); - $ac3_data .= substr($testData, 8 + $i + 0, 1); - } - $getid3_ac3->AnalyzeString($ac3_data); - } - - if (empty($getid3_temp->info['error'])) { - $info['audio'] = $getid3_temp->info['audio']; - $info['ac3'] = $getid3_temp->info['ac3']; - if (!empty($getid3_temp->info['warning'])) { - foreach ($getid3_temp->info['warning'] as $newerror) { - $this->warning('getid3_ac3() says: ['.$newerror.']'); - } - } - } - unset($getid3_temp, $getid3_ac3); - - } elseif (preg_match('/^('.implode('|', array_map('preg_quote', getid3_dts::$syncwords)).')/', $testData)) { - - // This is probably DTS data - $getid3_temp = new getID3(); - $getid3_temp->openfile($this->getid3->filename); - $getid3_temp->info['avdataoffset'] = $info['avdataoffset']; - $getid3_dts = new getid3_dts($getid3_temp); - $getid3_dts->Analyze(); - if (empty($getid3_temp->info['error'])) { - $info['audio'] = $getid3_temp->info['audio']; - $info['dts'] = $getid3_temp->info['dts']; - $info['playtime_seconds'] = $getid3_temp->info['playtime_seconds']; // may not match RIFF calculations since DTS-WAV often used 14/16 bit-word packing - if (!empty($getid3_temp->info['warning'])) { - foreach ($getid3_temp->info['warning'] as $newerror) { - $this->warning('getid3_dts() says: ['.$newerror.']'); - } - } - } - - unset($getid3_temp, $getid3_dts); - - } elseif (substr($testData, 0, 4) == 'wvpk') { - - // This is WavPack data - $info['wavpack']['offset'] = $info['avdataoffset']; - $info['wavpack']['size'] = getid3_lib::LittleEndian2Int(substr($testData, 4, 4)); - $this->parseWavPackHeader(substr($testData, 8, 28)); - - } else { - // This is some other kind of data (quite possibly just PCM) - // do nothing special, just skip it - } - $nextoffset = $info['avdataend']; - $this->fseek($nextoffset); - break; - - case 'iXML': - case 'bext': - case 'cart': - case 'fmt ': - case 'strh': - case 'strf': - case 'indx': - case 'MEXT': - case 'DISP': - // always read data in - case 'JUNK': - // should be: never read data in - // but some programs write their version strings in a JUNK chunk (e.g. VirtualDub, AVIdemux, etc) - if ($chunksize < 1048576) { - if ($chunksize > 0) { - $RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize); - if ($chunkname == 'JUNK') { - if (preg_match('#^([\\x20-\\x7F]+)#', $RIFFchunk[$chunkname][$thisindex]['data'], $matches)) { - // only keep text characters [chr(32)-chr(127)] - $info['riff']['comments']['junk'][] = trim($matches[1]); - } - // but if nothing there, ignore - // remove the key in either case - unset($RIFFchunk[$chunkname][$thisindex]['data']); - } - } - } else { - $this->warning('Chunk "'.$chunkname.'" at offset '.$this->ftell().' is unexpectedly larger than 1MB (claims to be '.number_format($chunksize).' bytes), skipping data'); - $this->fseek($chunksize, SEEK_CUR); - } - break; - - //case 'IDVX': - // $info['divxtag']['comments'] = self::ParseDIVXTAG($this->fread($chunksize)); - // break; - - default: - if (!empty($LISTchunkParent) && (($RIFFchunk[$chunkname][$thisindex]['offset'] + $RIFFchunk[$chunkname][$thisindex]['size']) <= $LISTchunkMaxOffset)) { - $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['offset'] = $RIFFchunk[$chunkname][$thisindex]['offset']; - $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['size'] = $RIFFchunk[$chunkname][$thisindex]['size']; - unset($RIFFchunk[$chunkname][$thisindex]['offset']); - unset($RIFFchunk[$chunkname][$thisindex]['size']); - if (isset($RIFFchunk[$chunkname][$thisindex]) && empty($RIFFchunk[$chunkname][$thisindex])) { - unset($RIFFchunk[$chunkname][$thisindex]); - } - if (isset($RIFFchunk[$chunkname]) && empty($RIFFchunk[$chunkname])) { - unset($RIFFchunk[$chunkname]); - } - $RIFFchunk[$LISTchunkParent][$chunkname][$thisindex]['data'] = $this->fread($chunksize); - } elseif ($chunksize < 2048) { - // only read data in if smaller than 2kB - $RIFFchunk[$chunkname][$thisindex]['data'] = $this->fread($chunksize); - } else { - $this->fseek($chunksize, SEEK_CUR); - } - break; - } - break; - } - } - - } catch (getid3_exception $e) { - if ($e->getCode() == 10) { - $this->warning('RIFF parser: '.$e->getMessage()); - } else { - throw $e; - } - } - - return $RIFFchunk; - } - - public function ParseRIFFdata(&$RIFFdata) { - $info = &$this->getid3->info; - if ($RIFFdata) { - $tempfile = tempnam(GETID3_TEMP_DIR, 'getID3'); - $fp_temp = fopen($tempfile, 'wb'); - $RIFFdataLength = strlen($RIFFdata); - $NewLengthString = getid3_lib::LittleEndian2String($RIFFdataLength, 4); - for ($i = 0; $i < 4; $i++) { - $RIFFdata[($i + 4)] = $NewLengthString[$i]; - } - fwrite($fp_temp, $RIFFdata); - fclose($fp_temp); - - $getid3_temp = new getID3(); - $getid3_temp->openfile($tempfile); - $getid3_temp->info['filesize'] = $RIFFdataLength; - $getid3_temp->info['filenamepath'] = $info['filenamepath']; - $getid3_temp->info['tags'] = $info['tags']; - $getid3_temp->info['warning'] = $info['warning']; - $getid3_temp->info['error'] = $info['error']; - $getid3_temp->info['comments'] = $info['comments']; - $getid3_temp->info['audio'] = (isset($info['audio']) ? $info['audio'] : array()); - $getid3_temp->info['video'] = (isset($info['video']) ? $info['video'] : array()); - $getid3_riff = new getid3_riff($getid3_temp); - $getid3_riff->Analyze(); - - $info['riff'] = $getid3_temp->info['riff']; - $info['warning'] = $getid3_temp->info['warning']; - $info['error'] = $getid3_temp->info['error']; - $info['tags'] = $getid3_temp->info['tags']; - $info['comments'] = $getid3_temp->info['comments']; - unset($getid3_riff, $getid3_temp); - unlink($tempfile); - } - return false; - } - - public static function parseComments(&$RIFFinfoArray, &$CommentsTargetArray) { - $RIFFinfoKeyLookup = array( - 'IARL'=>'archivallocation', - 'IART'=>'artist', - 'ICDS'=>'costumedesigner', - 'ICMS'=>'commissionedby', - 'ICMT'=>'comment', - 'ICNT'=>'country', - 'ICOP'=>'copyright', - 'ICRD'=>'creationdate', - 'IDIM'=>'dimensions', - 'IDIT'=>'digitizationdate', - 'IDPI'=>'resolution', - 'IDST'=>'distributor', - 'IEDT'=>'editor', - 'IENG'=>'engineers', - 'IFRM'=>'accountofparts', - 'IGNR'=>'genre', - 'IKEY'=>'keywords', - 'ILGT'=>'lightness', - 'ILNG'=>'language', - 'IMED'=>'orignalmedium', - 'IMUS'=>'composer', - 'INAM'=>'title', - 'IPDS'=>'productiondesigner', - 'IPLT'=>'palette', - 'IPRD'=>'product', - 'IPRO'=>'producer', - 'IPRT'=>'part', - 'IRTD'=>'rating', - 'ISBJ'=>'subject', - 'ISFT'=>'software', - 'ISGN'=>'secondarygenre', - 'ISHP'=>'sharpness', - 'ISRC'=>'sourcesupplier', - 'ISRF'=>'digitizationsource', - 'ISTD'=>'productionstudio', - 'ISTR'=>'starring', - 'ITCH'=>'encoded_by', - 'IWEB'=>'url', - 'IWRI'=>'writer', - '____'=>'comment', - ); - foreach ($RIFFinfoKeyLookup as $key => $value) { - if (isset($RIFFinfoArray[$key])) { - foreach ($RIFFinfoArray[$key] as $commentid => $commentdata) { - if (trim($commentdata['data']) != '') { - if (isset($CommentsTargetArray[$value])) { - $CommentsTargetArray[$value][] = trim($commentdata['data']); - } else { - $CommentsTargetArray[$value] = array(trim($commentdata['data'])); - } - } - } - } - } - return true; - } - - public static function parseWAVEFORMATex($WaveFormatExData) { - // shortcut - $WaveFormatEx['raw'] = array(); - $WaveFormatEx_raw = &$WaveFormatEx['raw']; - - $WaveFormatEx_raw['wFormatTag'] = substr($WaveFormatExData, 0, 2); - $WaveFormatEx_raw['nChannels'] = substr($WaveFormatExData, 2, 2); - $WaveFormatEx_raw['nSamplesPerSec'] = substr($WaveFormatExData, 4, 4); - $WaveFormatEx_raw['nAvgBytesPerSec'] = substr($WaveFormatExData, 8, 4); - $WaveFormatEx_raw['nBlockAlign'] = substr($WaveFormatExData, 12, 2); - $WaveFormatEx_raw['wBitsPerSample'] = substr($WaveFormatExData, 14, 2); - if (strlen($WaveFormatExData) > 16) { - $WaveFormatEx_raw['cbSize'] = substr($WaveFormatExData, 16, 2); - } - $WaveFormatEx_raw = array_map('getid3_lib::LittleEndian2Int', $WaveFormatEx_raw); - - $WaveFormatEx['codec'] = self::wFormatTagLookup($WaveFormatEx_raw['wFormatTag']); - $WaveFormatEx['channels'] = $WaveFormatEx_raw['nChannels']; - $WaveFormatEx['sample_rate'] = $WaveFormatEx_raw['nSamplesPerSec']; - $WaveFormatEx['bitrate'] = $WaveFormatEx_raw['nAvgBytesPerSec'] * 8; - $WaveFormatEx['bits_per_sample'] = $WaveFormatEx_raw['wBitsPerSample']; - - return $WaveFormatEx; - } - - public function parseWavPackHeader($WavPackChunkData) { - // typedef struct { - // char ckID [4]; - // long ckSize; - // short version; - // short bits; // added for version 2.00 - // short flags, shift; // added for version 3.00 - // long total_samples, crc, crc2; - // char extension [4], extra_bc, extras [3]; - // } WavpackHeader; - - // shortcut - $info = &$this->getid3->info; - $info['wavpack'] = array(); - $thisfile_wavpack = &$info['wavpack']; - - $thisfile_wavpack['version'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 0, 2)); - if ($thisfile_wavpack['version'] >= 2) { - $thisfile_wavpack['bits'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 2, 2)); - } - if ($thisfile_wavpack['version'] >= 3) { - $thisfile_wavpack['flags_raw'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 4, 2)); - $thisfile_wavpack['shift'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 6, 2)); - $thisfile_wavpack['total_samples'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 8, 4)); - $thisfile_wavpack['crc1'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 12, 4)); - $thisfile_wavpack['crc2'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 16, 4)); - $thisfile_wavpack['extension'] = substr($WavPackChunkData, 20, 4); - $thisfile_wavpack['extra_bc'] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 24, 1)); - for ($i = 0; $i <= 2; $i++) { - $thisfile_wavpack['extras'][] = getid3_lib::LittleEndian2Int(substr($WavPackChunkData, 25 + $i, 1)); - } - - // shortcut - $thisfile_wavpack['flags'] = array(); - $thisfile_wavpack_flags = &$thisfile_wavpack['flags']; - - $thisfile_wavpack_flags['mono'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000001); - $thisfile_wavpack_flags['fast_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000002); - $thisfile_wavpack_flags['raw_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000004); - $thisfile_wavpack_flags['calc_noise'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000008); - $thisfile_wavpack_flags['high_quality'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000010); - $thisfile_wavpack_flags['3_byte_samples'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000020); - $thisfile_wavpack_flags['over_20_bits'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000040); - $thisfile_wavpack_flags['use_wvc'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000080); - $thisfile_wavpack_flags['noiseshaping'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000100); - $thisfile_wavpack_flags['very_fast_mode'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000200); - $thisfile_wavpack_flags['new_high_quality'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000400); - $thisfile_wavpack_flags['cancel_extreme'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x000800); - $thisfile_wavpack_flags['cross_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x001000); - $thisfile_wavpack_flags['new_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x002000); - $thisfile_wavpack_flags['joint_stereo'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x004000); - $thisfile_wavpack_flags['extra_decorrelation'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x008000); - $thisfile_wavpack_flags['override_noiseshape'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x010000); - $thisfile_wavpack_flags['override_jointstereo'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x020000); - $thisfile_wavpack_flags['copy_source_filetime'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x040000); - $thisfile_wavpack_flags['create_exe'] = (bool) ($thisfile_wavpack['flags_raw'] & 0x080000); - } - - return true; - } - - public static function ParseBITMAPINFOHEADER($BITMAPINFOHEADER, $littleEndian=true) { - - $parsed['biSize'] = substr($BITMAPINFOHEADER, 0, 4); // number of bytes required by the BITMAPINFOHEADER structure - $parsed['biWidth'] = substr($BITMAPINFOHEADER, 4, 4); // width of the bitmap in pixels - $parsed['biHeight'] = substr($BITMAPINFOHEADER, 8, 4); // height of the bitmap in pixels. If biHeight is positive, the bitmap is a 'bottom-up' DIB and its origin is the lower left corner. If biHeight is negative, the bitmap is a 'top-down' DIB and its origin is the upper left corner - $parsed['biPlanes'] = substr($BITMAPINFOHEADER, 12, 2); // number of color planes on the target device. In most cases this value must be set to 1 - $parsed['biBitCount'] = substr($BITMAPINFOHEADER, 14, 2); // Specifies the number of bits per pixels - $parsed['biSizeImage'] = substr($BITMAPINFOHEADER, 20, 4); // size of the bitmap data section of the image (the actual pixel data, excluding BITMAPINFOHEADER and RGBQUAD structures) - $parsed['biXPelsPerMeter'] = substr($BITMAPINFOHEADER, 24, 4); // horizontal resolution, in pixels per metre, of the target device - $parsed['biYPelsPerMeter'] = substr($BITMAPINFOHEADER, 28, 4); // vertical resolution, in pixels per metre, of the target device - $parsed['biClrUsed'] = substr($BITMAPINFOHEADER, 32, 4); // actual number of color indices in the color table used by the bitmap. If this value is zero, the bitmap uses the maximum number of colors corresponding to the value of the biBitCount member for the compression mode specified by biCompression - $parsed['biClrImportant'] = substr($BITMAPINFOHEADER, 36, 4); // number of color indices that are considered important for displaying the bitmap. If this value is zero, all colors are important - $parsed = array_map('getid3_lib::'.($littleEndian ? 'Little' : 'Big').'Endian2Int', $parsed); - - $parsed['fourcc'] = substr($BITMAPINFOHEADER, 16, 4); // compression identifier - - return $parsed; - } - - public static function ParseDIVXTAG($DIVXTAG, $raw=false) { - // structure from "IDivX" source, Form1.frm, by "Greg Frazier of Daemonic Software Group", email: gfrazier@icestorm.net, web: http://dsg.cjb.net/ - // source available at http://files.divx-digest.com/download/c663efe7ef8ad2e90bf4af4d3ea6188a/on0SWN2r/edit/IDivX.zip - // 'Byte Layout: '1111111111111111 - // '32 for Movie - 1 '1111111111111111 - // '28 for Author - 6 '6666666666666666 - // '4 for year - 2 '6666666666662222 - // '3 for genre - 3 '7777777777777777 - // '48 for Comments - 7 '7777777777777777 - // '1 for Rating - 4 '7777777777777777 - // '5 for Future Additions - 0 '333400000DIVXTAG - // '128 bytes total - - static $DIVXTAGgenre = array( - 0 => 'Action', - 1 => 'Action/Adventure', - 2 => 'Adventure', - 3 => 'Adult', - 4 => 'Anime', - 5 => 'Cartoon', - 6 => 'Claymation', - 7 => 'Comedy', - 8 => 'Commercial', - 9 => 'Documentary', - 10 => 'Drama', - 11 => 'Home Video', - 12 => 'Horror', - 13 => 'Infomercial', - 14 => 'Interactive', - 15 => 'Mystery', - 16 => 'Music Video', - 17 => 'Other', - 18 => 'Religion', - 19 => 'Sci Fi', - 20 => 'Thriller', - 21 => 'Western', - ), - $DIVXTAGrating = array( - 0 => 'Unrated', - 1 => 'G', - 2 => 'PG', - 3 => 'PG-13', - 4 => 'R', - 5 => 'NC-17', - ); - - $parsed['title'] = trim(substr($DIVXTAG, 0, 32)); - $parsed['artist'] = trim(substr($DIVXTAG, 32, 28)); - $parsed['year'] = intval(trim(substr($DIVXTAG, 60, 4))); - $parsed['comment'] = trim(substr($DIVXTAG, 64, 48)); - $parsed['genre_id'] = intval(trim(substr($DIVXTAG, 112, 3))); - $parsed['rating_id'] = ord(substr($DIVXTAG, 115, 1)); - //$parsed['padding'] = substr($DIVXTAG, 116, 5); // 5-byte null - //$parsed['magic'] = substr($DIVXTAG, 121, 7); // "DIVXTAG" - - $parsed['genre'] = (isset($DIVXTAGgenre[$parsed['genre_id']]) ? $DIVXTAGgenre[$parsed['genre_id']] : $parsed['genre_id']); - $parsed['rating'] = (isset($DIVXTAGrating[$parsed['rating_id']]) ? $DIVXTAGrating[$parsed['rating_id']] : $parsed['rating_id']); - - if (!$raw) { - unset($parsed['genre_id'], $parsed['rating_id']); - foreach ($parsed as $key => $value) { - if (!$value === '') { - unset($parsed['key']); - } - } - } - - foreach ($parsed as $tag => $value) { - $parsed[$tag] = array($value); - } - - return $parsed; - } - - public static function waveSNDMtagLookup($tagshortname) { - $begin = __LINE__; - - /** This is not a comment! - - ©kwd keywords - ©BPM bpm - ©trt tracktitle - ©des description - ©gen category - ©fin featuredinstrument - ©LID longid - ©bex bwdescription - ©pub publisher - ©cdt cdtitle - ©alb library - ©com composer - - */ - - return getid3_lib::EmbeddedLookup($tagshortname, $begin, __LINE__, __FILE__, 'riff-sndm'); - } - - public static function wFormatTagLookup($wFormatTag) { - - $begin = __LINE__; - - /** This is not a comment! - - 0x0000 Microsoft Unknown Wave Format - 0x0001 Pulse Code Modulation (PCM) - 0x0002 Microsoft ADPCM - 0x0003 IEEE Float - 0x0004 Compaq Computer VSELP - 0x0005 IBM CVSD - 0x0006 Microsoft A-Law - 0x0007 Microsoft mu-Law - 0x0008 Microsoft DTS - 0x0010 OKI ADPCM - 0x0011 Intel DVI/IMA ADPCM - 0x0012 Videologic MediaSpace ADPCM - 0x0013 Sierra Semiconductor ADPCM - 0x0014 Antex Electronics G.723 ADPCM - 0x0015 DSP Solutions DigiSTD - 0x0016 DSP Solutions DigiFIX - 0x0017 Dialogic OKI ADPCM - 0x0018 MediaVision ADPCM - 0x0019 Hewlett-Packard CU - 0x0020 Yamaha ADPCM - 0x0021 Speech Compression Sonarc - 0x0022 DSP Group TrueSpeech - 0x0023 Echo Speech EchoSC1 - 0x0024 Audiofile AF36 - 0x0025 Audio Processing Technology APTX - 0x0026 AudioFile AF10 - 0x0027 Prosody 1612 - 0x0028 LRC - 0x0030 Dolby AC2 - 0x0031 Microsoft GSM 6.10 - 0x0032 MSNAudio - 0x0033 Antex Electronics ADPCME - 0x0034 Control Resources VQLPC - 0x0035 DSP Solutions DigiREAL - 0x0036 DSP Solutions DigiADPCM - 0x0037 Control Resources CR10 - 0x0038 Natural MicroSystems VBXADPCM - 0x0039 Crystal Semiconductor IMA ADPCM - 0x003A EchoSC3 - 0x003B Rockwell ADPCM - 0x003C Rockwell Digit LK - 0x003D Xebec - 0x0040 Antex Electronics G.721 ADPCM - 0x0041 G.728 CELP - 0x0042 MSG723 - 0x0050 MPEG Layer-2 or Layer-1 - 0x0052 RT24 - 0x0053 PAC - 0x0055 MPEG Layer-3 - 0x0059 Lucent G.723 - 0x0060 Cirrus - 0x0061 ESPCM - 0x0062 Voxware - 0x0063 Canopus Atrac - 0x0064 G.726 ADPCM - 0x0065 G.722 ADPCM - 0x0066 DSAT - 0x0067 DSAT Display - 0x0069 Voxware Byte Aligned - 0x0070 Voxware AC8 - 0x0071 Voxware AC10 - 0x0072 Voxware AC16 - 0x0073 Voxware AC20 - 0x0074 Voxware MetaVoice - 0x0075 Voxware MetaSound - 0x0076 Voxware RT29HW - 0x0077 Voxware VR12 - 0x0078 Voxware VR18 - 0x0079 Voxware TQ40 - 0x0080 Softsound - 0x0081 Voxware TQ60 - 0x0082 MSRT24 - 0x0083 G.729A - 0x0084 MVI MV12 - 0x0085 DF G.726 - 0x0086 DF GSM610 - 0x0088 ISIAudio - 0x0089 Onlive - 0x0091 SBC24 - 0x0092 Dolby AC3 SPDIF - 0x0093 MediaSonic G.723 - 0x0094 Aculab PLC Prosody 8kbps - 0x0097 ZyXEL ADPCM - 0x0098 Philips LPCBB - 0x0099 Packed - 0x00FF AAC - 0x0100 Rhetorex ADPCM - 0x0101 IBM mu-law - 0x0102 IBM A-law - 0x0103 IBM AVC Adaptive Differential Pulse Code Modulation (ADPCM) - 0x0111 Vivo G.723 - 0x0112 Vivo Siren - 0x0123 Digital G.723 - 0x0125 Sanyo LD ADPCM - 0x0130 Sipro Lab Telecom ACELP NET - 0x0131 Sipro Lab Telecom ACELP 4800 - 0x0132 Sipro Lab Telecom ACELP 8V3 - 0x0133 Sipro Lab Telecom G.729 - 0x0134 Sipro Lab Telecom G.729A - 0x0135 Sipro Lab Telecom Kelvin - 0x0140 Windows Media Video V8 - 0x0150 Qualcomm PureVoice - 0x0151 Qualcomm HalfRate - 0x0155 Ring Zero Systems TUB GSM - 0x0160 Microsoft Audio 1 - 0x0161 Windows Media Audio V7 / V8 / V9 - 0x0162 Windows Media Audio Professional V9 - 0x0163 Windows Media Audio Lossless V9 - 0x0200 Creative Labs ADPCM - 0x0202 Creative Labs Fastspeech8 - 0x0203 Creative Labs Fastspeech10 - 0x0210 UHER Informatic GmbH ADPCM - 0x0220 Quarterdeck - 0x0230 I-link Worldwide VC - 0x0240 Aureal RAW Sport - 0x0250 Interactive Products HSX - 0x0251 Interactive Products RPELP - 0x0260 Consistent Software CS2 - 0x0270 Sony SCX - 0x0300 Fujitsu FM Towns Snd - 0x0400 BTV Digital - 0x0401 Intel Music Coder - 0x0450 QDesign Music - 0x0680 VME VMPCM - 0x0681 AT&T Labs TPC - 0x08AE ClearJump LiteWave - 0x1000 Olivetti GSM - 0x1001 Olivetti ADPCM - 0x1002 Olivetti CELP - 0x1003 Olivetti SBC - 0x1004 Olivetti OPR - 0x1100 Lernout & Hauspie Codec (0x1100) - 0x1101 Lernout & Hauspie CELP Codec (0x1101) - 0x1102 Lernout & Hauspie SBC Codec (0x1102) - 0x1103 Lernout & Hauspie SBC Codec (0x1103) - 0x1104 Lernout & Hauspie SBC Codec (0x1104) - 0x1400 Norris - 0x1401 AT&T ISIAudio - 0x1500 Soundspace Music Compression - 0x181C VoxWare RT24 Speech - 0x1FC4 NCT Soft ALF2CD (www.nctsoft.com) - 0x2000 Dolby AC3 - 0x2001 Dolby DTS - 0x2002 WAVE_FORMAT_14_4 - 0x2003 WAVE_FORMAT_28_8 - 0x2004 WAVE_FORMAT_COOK - 0x2005 WAVE_FORMAT_DNET - 0x674F Ogg Vorbis 1 - 0x6750 Ogg Vorbis 2 - 0x6751 Ogg Vorbis 3 - 0x676F Ogg Vorbis 1+ - 0x6770 Ogg Vorbis 2+ - 0x6771 Ogg Vorbis 3+ - 0x7A21 GSM-AMR (CBR, no SID) - 0x7A22 GSM-AMR (VBR, including SID) - 0xFFFE WAVE_FORMAT_EXTENSIBLE - 0xFFFF WAVE_FORMAT_DEVELOPMENT - - */ - - return getid3_lib::EmbeddedLookup('0x'.str_pad(strtoupper(dechex($wFormatTag)), 4, '0', STR_PAD_LEFT), $begin, __LINE__, __FILE__, 'riff-wFormatTag'); - } - - public static function fourccLookup($fourcc) { - - $begin = __LINE__; - - /** This is not a comment! - - swot http://developer.apple.com/qa/snd/snd07.html - ____ No Codec (____) - _BIT BI_BITFIELDS (Raw RGB) - _JPG JPEG compressed - _PNG PNG compressed W3C/ISO/IEC (RFC-2083) - _RAW Full Frames (Uncompressed) - _RGB Raw RGB Bitmap - _RL4 RLE 4bpp RGB - _RL8 RLE 8bpp RGB - 3IV1 3ivx MPEG-4 v1 - 3IV2 3ivx MPEG-4 v2 - 3IVX 3ivx MPEG-4 - AASC Autodesk Animator - ABYR Kensington ?ABYR? - AEMI Array Microsystems VideoONE MPEG1-I Capture - AFLC Autodesk Animator FLC - AFLI Autodesk Animator FLI - AMPG Array Microsystems VideoONE MPEG - ANIM Intel RDX (ANIM) - AP41 AngelPotion Definitive - ASV1 Asus Video v1 - ASV2 Asus Video v2 - ASVX Asus Video 2.0 (audio) - AUR2 AuraVision Aura 2 Codec - YUV 4:2:2 - AURA AuraVision Aura 1 Codec - YUV 4:1:1 - AVDJ Independent JPEG Group\'s codec (AVDJ) - AVRN Independent JPEG Group\'s codec (AVRN) - AYUV 4:4:4 YUV (AYUV) - AZPR Quicktime Apple Video (AZPR) - BGR Raw RGB32 - BLZ0 Blizzard DivX MPEG-4 - BTVC Conexant Composite Video - BINK RAD Game Tools Bink Video - BT20 Conexant Prosumer Video - BTCV Conexant Composite Video Codec - BW10 Data Translation Broadway MPEG Capture - CC12 Intel YUV12 - CDVC Canopus DV - CFCC Digital Processing Systems DPS Perception - CGDI Microsoft Office 97 Camcorder Video - CHAM Winnov Caviara Champagne - CJPG Creative WebCam JPEG - CLJR Cirrus Logic YUV 4:1:1 - CMYK Common Data Format in Printing (Colorgraph) - CPLA Weitek 4:2:0 YUV Planar - CRAM Microsoft Video 1 (CRAM) - cvid Radius Cinepak - CVID Radius Cinepak - CWLT Microsoft Color WLT DIB - CYUV Creative Labs YUV - CYUY ATI YUV - D261 H.261 - D263 H.263 - DIB Device Independent Bitmap - DIV1 FFmpeg OpenDivX - DIV2 Microsoft MPEG-4 v1/v2 - DIV3 DivX ;-) MPEG-4 v3.x Low-Motion - DIV4 DivX ;-) MPEG-4 v3.x Fast-Motion - DIV5 DivX MPEG-4 v5.x - DIV6 DivX ;-) (MS MPEG-4 v3.x) - DIVX DivX MPEG-4 v4 (OpenDivX / Project Mayo) - divx DivX MPEG-4 - DMB1 Matrox Rainbow Runner hardware MJPEG - DMB2 Paradigm MJPEG - DSVD ?DSVD? - DUCK Duck TrueMotion 1.0 - DPS0 DPS/Leitch Reality Motion JPEG - DPSC DPS/Leitch PAR Motion JPEG - DV25 Matrox DVCPRO codec - DV50 Matrox DVCPRO50 codec - DVC IEC 61834 and SMPTE 314M (DVC/DV Video) - DVCP IEC 61834 and SMPTE 314M (DVC/DV Video) - DVHD IEC Standard DV 1125 lines @ 30fps / 1250 lines @ 25fps - DVMA Darim Vision DVMPEG (dummy for MPEG compressor) (www.darvision.com) - DVSL IEC Standard DV compressed in SD (SDL) - DVAN ?DVAN? - DVE2 InSoft DVE-2 Videoconferencing - dvsd IEC 61834 and SMPTE 314M DVC/DV Video - DVSD IEC 61834 and SMPTE 314M DVC/DV Video - DVX1 Lucent DVX1000SP Video Decoder - DVX2 Lucent DVX2000S Video Decoder - DVX3 Lucent DVX3000S Video Decoder - DX50 DivX v5 - DXT1 Microsoft DirectX Compressed Texture (DXT1) - DXT2 Microsoft DirectX Compressed Texture (DXT2) - DXT3 Microsoft DirectX Compressed Texture (DXT3) - DXT4 Microsoft DirectX Compressed Texture (DXT4) - DXT5 Microsoft DirectX Compressed Texture (DXT5) - DXTC Microsoft DirectX Compressed Texture (DXTC) - DXTn Microsoft DirectX Compressed Texture (DXTn) - EM2V Etymonix MPEG-2 I-frame (www.etymonix.com) - EKQ0 Elsa ?EKQ0? - ELK0 Elsa ?ELK0? - ESCP Eidos Escape - ETV1 eTreppid Video ETV1 - ETV2 eTreppid Video ETV2 - ETVC eTreppid Video ETVC - FLIC Autodesk FLI/FLC Animation - FLV1 Sorenson Spark - FLV4 On2 TrueMotion VP6 - FRWT Darim Vision Forward Motion JPEG (www.darvision.com) - FRWU Darim Vision Forward Uncompressed (www.darvision.com) - FLJP D-Vision Field Encoded Motion JPEG - FPS1 FRAPS v1 - FRWA SoftLab-Nsk Forward Motion JPEG w/ alpha channel - FRWD SoftLab-Nsk Forward Motion JPEG - FVF1 Iterated Systems Fractal Video Frame - GLZW Motion LZW (gabest@freemail.hu) - GPEG Motion JPEG (gabest@freemail.hu) - GWLT Microsoft Greyscale WLT DIB - H260 Intel ITU H.260 Videoconferencing - H261 Intel ITU H.261 Videoconferencing - H262 Intel ITU H.262 Videoconferencing - H263 Intel ITU H.263 Videoconferencing - H264 Intel ITU H.264 Videoconferencing - H265 Intel ITU H.265 Videoconferencing - H266 Intel ITU H.266 Videoconferencing - H267 Intel ITU H.267 Videoconferencing - H268 Intel ITU H.268 Videoconferencing - H269 Intel ITU H.269 Videoconferencing - HFYU Huffman Lossless Codec - HMCR Rendition Motion Compensation Format (HMCR) - HMRR Rendition Motion Compensation Format (HMRR) - I263 FFmpeg I263 decoder - IF09 Indeo YVU9 ("YVU9 with additional delta-frame info after the U plane") - IUYV Interlaced version of UYVY (www.leadtools.com) - IY41 Interlaced version of Y41P (www.leadtools.com) - IYU1 12 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec IEEE standard - IYU2 24 bit format used in mode 2 of the IEEE 1394 Digital Camera 1.04 spec IEEE standard - IYUV Planar YUV format (8-bpp Y plane, followed by 8-bpp 2×2 U and V planes) - i263 Intel ITU H.263 Videoconferencing (i263) - I420 Intel Indeo 4 - IAN Intel Indeo 4 (RDX) - ICLB InSoft CellB Videoconferencing - IGOR Power DVD - IJPG Intergraph JPEG - ILVC Intel Layered Video - ILVR ITU-T H.263+ - IPDV I-O Data Device Giga AVI DV Codec - IR21 Intel Indeo 2.1 - IRAW Intel YUV Uncompressed - IV30 Intel Indeo 3.0 - IV31 Intel Indeo 3.1 - IV32 Ligos Indeo 3.2 - IV33 Ligos Indeo 3.3 - IV34 Ligos Indeo 3.4 - IV35 Ligos Indeo 3.5 - IV36 Ligos Indeo 3.6 - IV37 Ligos Indeo 3.7 - IV38 Ligos Indeo 3.8 - IV39 Ligos Indeo 3.9 - IV40 Ligos Indeo Interactive 4.0 - IV41 Ligos Indeo Interactive 4.1 - IV42 Ligos Indeo Interactive 4.2 - IV43 Ligos Indeo Interactive 4.3 - IV44 Ligos Indeo Interactive 4.4 - IV45 Ligos Indeo Interactive 4.5 - IV46 Ligos Indeo Interactive 4.6 - IV47 Ligos Indeo Interactive 4.7 - IV48 Ligos Indeo Interactive 4.8 - IV49 Ligos Indeo Interactive 4.9 - IV50 Ligos Indeo Interactive 5.0 - JBYR Kensington ?JBYR? - JPEG Still Image JPEG DIB - JPGL Pegasus Lossless Motion JPEG - KMVC Team17 Software Karl Morton\'s Video Codec - LSVM Vianet Lighting Strike Vmail (Streaming) (www.vianet.com) - LEAD LEAD Video Codec - Ljpg LEAD MJPEG Codec - MDVD Alex MicroDVD Video (hacked MS MPEG-4) (www.tiasoft.de) - MJPA Morgan Motion JPEG (MJPA) (www.morgan-multimedia.com) - MJPB Morgan Motion JPEG (MJPB) (www.morgan-multimedia.com) - MMES Matrox MPEG-2 I-frame - MP2v Microsoft S-Mpeg 4 version 1 (MP2v) - MP42 Microsoft S-Mpeg 4 version 2 (MP42) - MP43 Microsoft S-Mpeg 4 version 3 (MP43) - MP4S Microsoft S-Mpeg 4 version 3 (MP4S) - MP4V FFmpeg MPEG-4 - MPG1 FFmpeg MPEG 1/2 - MPG2 FFmpeg MPEG 1/2 - MPG3 FFmpeg DivX ;-) (MS MPEG-4 v3) - MPG4 Microsoft MPEG-4 - MPGI Sigma Designs MPEG - MPNG PNG images decoder - MSS1 Microsoft Windows Screen Video - MSZH LCL (Lossless Codec Library) (www.geocities.co.jp/Playtown-Denei/2837/LRC.htm) - M261 Microsoft H.261 - M263 Microsoft H.263 - M4S2 Microsoft Fully Compliant MPEG-4 v2 simple profile (M4S2) - m4s2 Microsoft Fully Compliant MPEG-4 v2 simple profile (m4s2) - MC12 ATI Motion Compensation Format (MC12) - MCAM ATI Motion Compensation Format (MCAM) - MJ2C Morgan Multimedia Motion JPEG2000 - mJPG IBM Motion JPEG w/ Huffman Tables - MJPG Microsoft Motion JPEG DIB - MP42 Microsoft MPEG-4 (low-motion) - MP43 Microsoft MPEG-4 (fast-motion) - MP4S Microsoft MPEG-4 (MP4S) - mp4s Microsoft MPEG-4 (mp4s) - MPEG Chromatic Research MPEG-1 Video I-Frame - MPG4 Microsoft MPEG-4 Video High Speed Compressor - MPGI Sigma Designs MPEG - MRCA FAST Multimedia Martin Regen Codec - MRLE Microsoft Run Length Encoding - MSVC Microsoft Video 1 - MTX1 Matrox ?MTX1? - MTX2 Matrox ?MTX2? - MTX3 Matrox ?MTX3? - MTX4 Matrox ?MTX4? - MTX5 Matrox ?MTX5? - MTX6 Matrox ?MTX6? - MTX7 Matrox ?MTX7? - MTX8 Matrox ?MTX8? - MTX9 Matrox ?MTX9? - MV12 Motion Pixels Codec (old) - MWV1 Aware Motion Wavelets - nAVI SMR Codec (hack of Microsoft MPEG-4) (IRC #shadowrealm) - NT00 NewTek LightWave HDTV YUV w/ Alpha (www.newtek.com) - NUV1 NuppelVideo - NTN1 Nogatech Video Compression 1 - NVS0 nVidia GeForce Texture (NVS0) - NVS1 nVidia GeForce Texture (NVS1) - NVS2 nVidia GeForce Texture (NVS2) - NVS3 nVidia GeForce Texture (NVS3) - NVS4 nVidia GeForce Texture (NVS4) - NVS5 nVidia GeForce Texture (NVS5) - NVT0 nVidia GeForce Texture (NVT0) - NVT1 nVidia GeForce Texture (NVT1) - NVT2 nVidia GeForce Texture (NVT2) - NVT3 nVidia GeForce Texture (NVT3) - NVT4 nVidia GeForce Texture (NVT4) - NVT5 nVidia GeForce Texture (NVT5) - PIXL MiroXL, Pinnacle PCTV - PDVC I-O Data Device Digital Video Capture DV codec - PGVV Radius Video Vision - PHMO IBM Photomotion - PIM1 MPEG Realtime (Pinnacle Cards) - PIM2 Pegasus Imaging ?PIM2? - PIMJ Pegasus Imaging Lossless JPEG - PVEZ Horizons Technology PowerEZ - PVMM PacketVideo Corporation MPEG-4 - PVW2 Pegasus Imaging Wavelet Compression - Q1.0 Q-Team\'s QPEG 1.0 (www.q-team.de) - Q1.1 Q-Team\'s QPEG 1.1 (www.q-team.de) - QPEG Q-Team QPEG 1.0 - qpeq Q-Team QPEG 1.1 - RGB Raw BGR32 - RGBA Raw RGB w/ Alpha - RMP4 REALmagic MPEG-4 (unauthorized XVID copy) (www.sigmadesigns.com) - ROQV Id RoQ File Video Decoder - RPZA Quicktime Apple Video (RPZA) - RUD0 Rududu video codec (http://rududu.ifrance.com/rududu/) - RV10 RealVideo 1.0 (aka RealVideo 5.0) - RV13 RealVideo 1.0 (RV13) - RV20 RealVideo G2 - RV30 RealVideo 8 - RV40 RealVideo 9 - RGBT Raw RGB w/ Transparency - RLE Microsoft Run Length Encoder - RLE4 Run Length Encoded (4bpp, 16-color) - RLE8 Run Length Encoded (8bpp, 256-color) - RT21 Intel Indeo RealTime Video 2.1 - rv20 RealVideo G2 - rv30 RealVideo 8 - RVX Intel RDX (RVX ) - SMC Apple Graphics (SMC ) - SP54 Logitech Sunplus Sp54 Codec for Mustek GSmart Mini 2 - SPIG Radius Spigot - SVQ3 Sorenson Video 3 (Apple Quicktime 5) - s422 Tekram VideoCap C210 YUV 4:2:2 - SDCC Sun Communication Digital Camera Codec - SFMC CrystalNet Surface Fitting Method - SMSC Radius SMSC - SMSD Radius SMSD - smsv WorldConnect Wavelet Video - SPIG Radius Spigot - SPLC Splash Studios ACM Audio Codec (www.splashstudios.net) - SQZ2 Microsoft VXTreme Video Codec V2 - STVA ST Microelectronics CMOS Imager Data (Bayer) - STVB ST Microelectronics CMOS Imager Data (Nudged Bayer) - STVC ST Microelectronics CMOS Imager Data (Bunched) - STVX ST Microelectronics CMOS Imager Data (Extended CODEC Data Format) - STVY ST Microelectronics CMOS Imager Data (Extended CODEC Data Format with Correction Data) - SV10 Sorenson Video R1 - SVQ1 Sorenson Video - T420 Toshiba YUV 4:2:0 - TM2A Duck TrueMotion Archiver 2.0 (www.duck.com) - TVJP Pinnacle/Truevision Targa 2000 board (TVJP) - TVMJ Pinnacle/Truevision Targa 2000 board (TVMJ) - TY0N Tecomac Low-Bit Rate Codec (www.tecomac.com) - TY2C Trident Decompression Driver - TLMS TeraLogic Motion Intraframe Codec (TLMS) - TLST TeraLogic Motion Intraframe Codec (TLST) - TM20 Duck TrueMotion 2.0 - TM2X Duck TrueMotion 2X - TMIC TeraLogic Motion Intraframe Codec (TMIC) - TMOT Horizons Technology TrueMotion S - tmot Horizons TrueMotion Video Compression - TR20 Duck TrueMotion RealTime 2.0 - TSCC TechSmith Screen Capture Codec - TV10 Tecomac Low-Bit Rate Codec - TY2N Trident ?TY2N? - U263 UB Video H.263/H.263+/H.263++ Decoder - UMP4 UB Video MPEG 4 (www.ubvideo.com) - UYNV Nvidia UYVY packed 4:2:2 - UYVP Evans & Sutherland YCbCr 4:2:2 extended precision - UCOD eMajix.com ClearVideo - ULTI IBM Ultimotion - UYVY UYVY packed 4:2:2 - V261 Lucent VX2000S - VIFP VFAPI Reader Codec (www.yks.ne.jp/~hori/) - VIV1 FFmpeg H263+ decoder - VIV2 Vivo H.263 - VQC2 Vector-quantised codec 2 (research) http://eprints.ecs.soton.ac.uk/archive/00001310/01/VTC97-js.pdf) - VTLP Alaris VideoGramPiX - VYU9 ATI YUV (VYU9) - VYUY ATI YUV (VYUY) - V261 Lucent VX2000S - V422 Vitec Multimedia 24-bit YUV 4:2:2 Format - V655 Vitec Multimedia 16-bit YUV 4:2:2 Format - VCR1 ATI Video Codec 1 - VCR2 ATI Video Codec 2 - VCR3 ATI VCR 3.0 - VCR4 ATI VCR 4.0 - VCR5 ATI VCR 5.0 - VCR6 ATI VCR 6.0 - VCR7 ATI VCR 7.0 - VCR8 ATI VCR 8.0 - VCR9 ATI VCR 9.0 - VDCT Vitec Multimedia Video Maker Pro DIB - VDOM VDOnet VDOWave - VDOW VDOnet VDOLive (H.263) - VDTZ Darim Vison VideoTizer YUV - VGPX Alaris VideoGramPiX - VIDS Vitec Multimedia YUV 4:2:2 CCIR 601 for V422 - VIVO Vivo H.263 v2.00 - vivo Vivo H.263 - VIXL Miro/Pinnacle Video XL - VLV1 VideoLogic/PURE Digital Videologic Capture - VP30 On2 VP3.0 - VP31 On2 VP3.1 - VP6F On2 TrueMotion VP6 - VX1K Lucent VX1000S Video Codec - VX2K Lucent VX2000S Video Codec - VXSP Lucent VX1000SP Video Codec - WBVC Winbond W9960 - WHAM Microsoft Video 1 (WHAM) - WINX Winnov Software Compression - WJPG AverMedia Winbond JPEG - WMV1 Windows Media Video V7 - WMV2 Windows Media Video V8 - WMV3 Windows Media Video V9 - WNV1 Winnov Hardware Compression - XYZP Extended PAL format XYZ palette (www.riff.org) - x263 Xirlink H.263 - XLV0 NetXL Video Decoder - XMPG Xing MPEG (I-Frame only) - XVID XviD MPEG-4 (www.xvid.org) - XXAN ?XXAN? - YU92 Intel YUV (YU92) - YUNV Nvidia Uncompressed YUV 4:2:2 - YUVP Extended PAL format YUV palette (www.riff.org) - Y211 YUV 2:1:1 Packed - Y411 YUV 4:1:1 Packed - Y41B Weitek YUV 4:1:1 Planar - Y41P Brooktree PC1 YUV 4:1:1 Packed - Y41T Brooktree PC1 YUV 4:1:1 with transparency - Y42B Weitek YUV 4:2:2 Planar - Y42T Brooktree UYUV 4:2:2 with transparency - Y422 ADS Technologies Copy of UYVY used in Pyro WebCam firewire camera - Y800 Simple, single Y plane for monochrome images - Y8 Grayscale video - YC12 Intel YUV 12 codec - YUV8 Winnov Caviar YUV8 - YUV9 Intel YUV9 - YUY2 Uncompressed YUV 4:2:2 - YUYV Canopus YUV - YV12 YVU12 Planar - YVU9 Intel YVU9 Planar (8-bpp Y plane, followed by 8-bpp 4x4 U and V planes) - YVYU YVYU 4:2:2 Packed - ZLIB Lossless Codec Library zlib compression (www.geocities.co.jp/Playtown-Denei/2837/LRC.htm) - ZPEG Metheus Video Zipper - - */ - - return getid3_lib::EmbeddedLookup($fourcc, $begin, __LINE__, __FILE__, 'riff-fourcc'); - } - - private function EitherEndian2Int($byteword, $signed=false) { - if ($this->container == 'riff') { - return getid3_lib::LittleEndian2Int($byteword, $signed); - } - return getid3_lib::BigEndian2Int($byteword, false, $signed); - } - -} \ No newline at end of file diff --git a/wp/wp-includes/ID3/module.audio.ac3.php b/wp/wp-includes/ID3/module.audio.ac3.php deleted file mode 100644 index 2dc52f48..00000000 --- a/wp/wp-includes/ID3/module.audio.ac3.php +++ /dev/null @@ -1,474 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// -// See readme.txt for more details // -///////////////////////////////////////////////////////////////// -// // -// module.audio.ac3.php // -// module for analyzing AC-3 (aka Dolby Digital) audio files // -// dependencies: NONE // -// /// -///////////////////////////////////////////////////////////////// - - -class getid3_ac3 extends getid3_handler -{ - private $AC3header = array(); - private $BSIoffset = 0; - - const syncword = "\x0B\x77"; - - public function Analyze() { - $info = &$this->getid3->info; - - ///AH - $info['ac3']['raw']['bsi'] = array(); - $thisfile_ac3 = &$info['ac3']; - $thisfile_ac3_raw = &$thisfile_ac3['raw']; - $thisfile_ac3_raw_bsi = &$thisfile_ac3_raw['bsi']; - - - // http://www.atsc.org/standards/a_52a.pdf - - $info['fileformat'] = 'ac3'; - - // An AC-3 serial coded audio bit stream is made up of a sequence of synchronization frames - // Each synchronization frame contains 6 coded audio blocks (AB), each of which represent 256 - // new audio samples per channel. A synchronization information (SI) header at the beginning - // of each frame contains information needed to acquire and maintain synchronization. A - // bit stream information (BSI) header follows SI, and contains parameters describing the coded - // audio service. The coded audio blocks may be followed by an auxiliary data (Aux) field. At the - // end of each frame is an error check field that includes a CRC word for error detection. An - // additional CRC word is located in the SI header, the use of which, by a decoder, is optional. - // - // syncinfo() | bsi() | AB0 | AB1 | AB2 | AB3 | AB4 | AB5 | Aux | CRC - - // syncinfo() { - // syncword 16 - // crc1 16 - // fscod 2 - // frmsizecod 6 - // } /* end of syncinfo */ - - $this->fseek($info['avdataoffset']); - $this->AC3header['syncinfo'] = $this->fread(5); - - if (strpos($this->AC3header['syncinfo'], self::syncword) === 0) { - $thisfile_ac3_raw['synchinfo']['synchword'] = self::syncword; - $offset = 2; - } else { - if (!$this->isDependencyFor('matroska')) { - unset($info['fileformat'], $info['ac3']); - return $this->error('Expecting "'.getid3_lib::PrintHexBytes(self::syncword).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes(substr($this->AC3header['syncinfo'], 0, 2)).'"'); - } - $offset = 0; - $this->fseek(-2, SEEK_CUR); - } - - $info['audio']['dataformat'] = 'ac3'; - $info['audio']['bitrate_mode'] = 'cbr'; - $info['audio']['lossless'] = false; - - $thisfile_ac3_raw['synchinfo']['crc1'] = getid3_lib::LittleEndian2Int(substr($this->AC3header['syncinfo'], $offset, 2)); - $ac3_synchinfo_fscod_frmsizecod = getid3_lib::LittleEndian2Int(substr($this->AC3header['syncinfo'], ($offset + 2), 1)); - $thisfile_ac3_raw['synchinfo']['fscod'] = ($ac3_synchinfo_fscod_frmsizecod & 0xC0) >> 6; - $thisfile_ac3_raw['synchinfo']['frmsizecod'] = ($ac3_synchinfo_fscod_frmsizecod & 0x3F); - - $thisfile_ac3['sample_rate'] = self::sampleRateCodeLookup($thisfile_ac3_raw['synchinfo']['fscod']); - if ($thisfile_ac3_raw['synchinfo']['fscod'] <= 3) { - $info['audio']['sample_rate'] = $thisfile_ac3['sample_rate']; - } - - $thisfile_ac3['frame_length'] = self::frameSizeLookup($thisfile_ac3_raw['synchinfo']['frmsizecod'], $thisfile_ac3_raw['synchinfo']['fscod']); - $thisfile_ac3['bitrate'] = self::bitrateLookup($thisfile_ac3_raw['synchinfo']['frmsizecod']); - $info['audio']['bitrate'] = $thisfile_ac3['bitrate']; - - $this->AC3header['bsi'] = getid3_lib::BigEndian2Bin($this->fread(15)); - $ac3_bsi_offset = 0; - - $thisfile_ac3_raw_bsi['bsid'] = $this->readHeaderBSI(5); - if ($thisfile_ac3_raw_bsi['bsid'] > 8) { - // Decoders which can decode version 8 will thus be able to decode version numbers less than 8. - // If this standard is extended by the addition of additional elements or features, a value of bsid greater than 8 will be used. - // Decoders built to this version of the standard will not be able to decode versions with bsid greater than 8. - $this->error('Bit stream identification is version '.$thisfile_ac3_raw_bsi['bsid'].', but getID3() only understands up to version 8'); - unset($info['ac3']); - return false; - } - - $thisfile_ac3_raw_bsi['bsmod'] = $this->readHeaderBSI(3); - $thisfile_ac3_raw_bsi['acmod'] = $this->readHeaderBSI(3); - - $thisfile_ac3['service_type'] = self::serviceTypeLookup($thisfile_ac3_raw_bsi['bsmod'], $thisfile_ac3_raw_bsi['acmod']); - $ac3_coding_mode = self::audioCodingModeLookup($thisfile_ac3_raw_bsi['acmod']); - foreach($ac3_coding_mode as $key => $value) { - $thisfile_ac3[$key] = $value; - } - switch ($thisfile_ac3_raw_bsi['acmod']) { - case 0: - case 1: - $info['audio']['channelmode'] = 'mono'; - break; - case 3: - case 4: - $info['audio']['channelmode'] = 'stereo'; - break; - default: - $info['audio']['channelmode'] = 'surround'; - break; - } - $info['audio']['channels'] = $thisfile_ac3['num_channels']; - - if ($thisfile_ac3_raw_bsi['acmod'] & 0x01) { - // If the lsb of acmod is a 1, center channel is in use and cmixlev follows in the bit stream. - $thisfile_ac3_raw_bsi['cmixlev'] = $this->readHeaderBSI(2); - $thisfile_ac3['center_mix_level'] = self::centerMixLevelLookup($thisfile_ac3_raw_bsi['cmixlev']); - } - - if ($thisfile_ac3_raw_bsi['acmod'] & 0x04) { - // If the msb of acmod is a 1, surround channels are in use and surmixlev follows in the bit stream. - $thisfile_ac3_raw_bsi['surmixlev'] = $this->readHeaderBSI(2); - $thisfile_ac3['surround_mix_level'] = self::surroundMixLevelLookup($thisfile_ac3_raw_bsi['surmixlev']); - } - - if ($thisfile_ac3_raw_bsi['acmod'] == 0x02) { - // When operating in the two channel mode, this 2-bit code indicates whether or not the program has been encoded in Dolby Surround. - $thisfile_ac3_raw_bsi['dsurmod'] = $this->readHeaderBSI(2); - $thisfile_ac3['dolby_surround_mode'] = self::dolbySurroundModeLookup($thisfile_ac3_raw_bsi['dsurmod']); - } - - $thisfile_ac3_raw_bsi['lfeon'] = (bool) $this->readHeaderBSI(1); - $thisfile_ac3['lfe_enabled'] = $thisfile_ac3_raw_bsi['lfeon']; - if ($thisfile_ac3_raw_bsi['lfeon']) { - //$info['audio']['channels']++; - $info['audio']['channels'] .= '.1'; - } - - $thisfile_ac3['channels_enabled'] = self::channelsEnabledLookup($thisfile_ac3_raw_bsi['acmod'], $thisfile_ac3_raw_bsi['lfeon']); - - // This indicates how far the average dialogue level is below digital 100 percent. Valid values are 1-31. - // The value of 0 is reserved. The values of 1 to 31 are interpreted as -1 dB to -31 dB with respect to digital 100 percent. - $thisfile_ac3_raw_bsi['dialnorm'] = $this->readHeaderBSI(5); - $thisfile_ac3['dialogue_normalization'] = '-'.$thisfile_ac3_raw_bsi['dialnorm'].'dB'; - - $thisfile_ac3_raw_bsi['compre_flag'] = (bool) $this->readHeaderBSI(1); - if ($thisfile_ac3_raw_bsi['compre_flag']) { - $thisfile_ac3_raw_bsi['compr'] = $this->readHeaderBSI(8); - $thisfile_ac3['heavy_compression'] = self::heavyCompression($thisfile_ac3_raw_bsi['compr']); - } - - $thisfile_ac3_raw_bsi['langcode_flag'] = (bool) $this->readHeaderBSI(1); - if ($thisfile_ac3_raw_bsi['langcode_flag']) { - $thisfile_ac3_raw_bsi['langcod'] = $this->readHeaderBSI(8); - } - - $thisfile_ac3_raw_bsi['audprodie'] = (bool) $this->readHeaderBSI(1); - if ($thisfile_ac3_raw_bsi['audprodie']) { - $thisfile_ac3_raw_bsi['mixlevel'] = $this->readHeaderBSI(5); - $thisfile_ac3_raw_bsi['roomtyp'] = $this->readHeaderBSI(2); - - $thisfile_ac3['mixing_level'] = (80 + $thisfile_ac3_raw_bsi['mixlevel']).'dB'; - $thisfile_ac3['room_type'] = self::roomTypeLookup($thisfile_ac3_raw_bsi['roomtyp']); - } - - if ($thisfile_ac3_raw_bsi['acmod'] == 0x00) { - // If acmod is 0, then two completely independent program channels (dual mono) - // are encoded into the bit stream, and are referenced as Ch1, Ch2. In this case, - // a number of additional items are present in BSI or audblk to fully describe Ch2. - - // This indicates how far the average dialogue level is below digital 100 percent. Valid values are 1-31. - // The value of 0 is reserved. The values of 1 to 31 are interpreted as -1 dB to -31 dB with respect to digital 100 percent. - $thisfile_ac3_raw_bsi['dialnorm2'] = $this->readHeaderBSI(5); - $thisfile_ac3['dialogue_normalization2'] = '-'.$thisfile_ac3_raw_bsi['dialnorm2'].'dB'; - - $thisfile_ac3_raw_bsi['compre_flag2'] = (bool) $this->readHeaderBSI(1); - if ($thisfile_ac3_raw_bsi['compre_flag2']) { - $thisfile_ac3_raw_bsi['compr2'] = $this->readHeaderBSI(8); - $thisfile_ac3['heavy_compression2'] = self::heavyCompression($thisfile_ac3_raw_bsi['compr2']); - } - - $thisfile_ac3_raw_bsi['langcode_flag2'] = (bool) $this->readHeaderBSI(1); - if ($thisfile_ac3_raw_bsi['langcode_flag2']) { - $thisfile_ac3_raw_bsi['langcod2'] = $this->readHeaderBSI(8); - } - - $thisfile_ac3_raw_bsi['audprodie2'] = (bool) $this->readHeaderBSI(1); - if ($thisfile_ac3_raw_bsi['audprodie2']) { - $thisfile_ac3_raw_bsi['mixlevel2'] = $this->readHeaderBSI(5); - $thisfile_ac3_raw_bsi['roomtyp2'] = $this->readHeaderBSI(2); - - $thisfile_ac3['mixing_level2'] = (80 + $thisfile_ac3_raw_bsi['mixlevel2']).'dB'; - $thisfile_ac3['room_type2'] = self::roomTypeLookup($thisfile_ac3_raw_bsi['roomtyp2']); - } - - } - - $thisfile_ac3_raw_bsi['copyright'] = (bool) $this->readHeaderBSI(1); - - $thisfile_ac3_raw_bsi['original'] = (bool) $this->readHeaderBSI(1); - - $thisfile_ac3_raw_bsi['timecode1_flag'] = (bool) $this->readHeaderBSI(1); - if ($thisfile_ac3_raw_bsi['timecode1_flag']) { - $thisfile_ac3_raw_bsi['timecode1'] = $this->readHeaderBSI(14); - } - - $thisfile_ac3_raw_bsi['timecode2_flag'] = (bool) $this->readHeaderBSI(1); - if ($thisfile_ac3_raw_bsi['timecode2_flag']) { - $thisfile_ac3_raw_bsi['timecode2'] = $this->readHeaderBSI(14); - } - - $thisfile_ac3_raw_bsi['addbsi_flag'] = (bool) $this->readHeaderBSI(1); - if ($thisfile_ac3_raw_bsi['addbsi_flag']) { - $thisfile_ac3_raw_bsi['addbsi_length'] = $this->readHeaderBSI(6); - - $this->AC3header['bsi'] .= getid3_lib::BigEndian2Bin($this->fread($thisfile_ac3_raw_bsi['addbsi_length'])); - - $thisfile_ac3_raw_bsi['addbsi_data'] = substr($this->AC3header['bsi'], $this->BSIoffset, $thisfile_ac3_raw_bsi['addbsi_length'] * 8); - $this->BSIoffset += $thisfile_ac3_raw_bsi['addbsi_length'] * 8; - } - - return true; - } - - private function readHeaderBSI($length) { - $data = substr($this->AC3header['bsi'], $this->BSIoffset, $length); - $this->BSIoffset += $length; - - return bindec($data); - } - - public static function sampleRateCodeLookup($fscod) { - static $sampleRateCodeLookup = array( - 0 => 48000, - 1 => 44100, - 2 => 32000, - 3 => 'reserved' // If the reserved code is indicated, the decoder should not attempt to decode audio and should mute. - ); - return (isset($sampleRateCodeLookup[$fscod]) ? $sampleRateCodeLookup[$fscod] : false); - } - - public static function serviceTypeLookup($bsmod, $acmod) { - static $serviceTypeLookup = array(); - if (empty($serviceTypeLookup)) { - for ($i = 0; $i <= 7; $i++) { - $serviceTypeLookup[0][$i] = 'main audio service: complete main (CM)'; - $serviceTypeLookup[1][$i] = 'main audio service: music and effects (ME)'; - $serviceTypeLookup[2][$i] = 'associated service: visually impaired (VI)'; - $serviceTypeLookup[3][$i] = 'associated service: hearing impaired (HI)'; - $serviceTypeLookup[4][$i] = 'associated service: dialogue (D)'; - $serviceTypeLookup[5][$i] = 'associated service: commentary (C)'; - $serviceTypeLookup[6][$i] = 'associated service: emergency (E)'; - } - - $serviceTypeLookup[7][1] = 'associated service: voice over (VO)'; - for ($i = 2; $i <= 7; $i++) { - $serviceTypeLookup[7][$i] = 'main audio service: karaoke'; - } - } - return (isset($serviceTypeLookup[$bsmod][$acmod]) ? $serviceTypeLookup[$bsmod][$acmod] : false); - } - - public static function audioCodingModeLookup($acmod) { - // array(channel configuration, # channels (not incl LFE), channel order) - static $audioCodingModeLookup = array ( - 0 => array('channel_config'=>'1+1', 'num_channels'=>2, 'channel_order'=>'Ch1,Ch2'), - 1 => array('channel_config'=>'1/0', 'num_channels'=>1, 'channel_order'=>'C'), - 2 => array('channel_config'=>'2/0', 'num_channels'=>2, 'channel_order'=>'L,R'), - 3 => array('channel_config'=>'3/0', 'num_channels'=>3, 'channel_order'=>'L,C,R'), - 4 => array('channel_config'=>'2/1', 'num_channels'=>3, 'channel_order'=>'L,R,S'), - 5 => array('channel_config'=>'3/1', 'num_channels'=>4, 'channel_order'=>'L,C,R,S'), - 6 => array('channel_config'=>'2/2', 'num_channels'=>4, 'channel_order'=>'L,R,SL,SR'), - 7 => array('channel_config'=>'3/2', 'num_channels'=>5, 'channel_order'=>'L,C,R,SL,SR'), - ); - return (isset($audioCodingModeLookup[$acmod]) ? $audioCodingModeLookup[$acmod] : false); - } - - public static function centerMixLevelLookup($cmixlev) { - static $centerMixLevelLookup; - if (empty($centerMixLevelLookup)) { - $centerMixLevelLookup = array( - 0 => pow(2, -3.0 / 6), // 0.707 (-3.0 dB) - 1 => pow(2, -4.5 / 6), // 0.595 (-4.5 dB) - 2 => pow(2, -6.0 / 6), // 0.500 (-6.0 dB) - 3 => 'reserved' - ); - } - return (isset($centerMixLevelLookup[$cmixlev]) ? $centerMixLevelLookup[$cmixlev] : false); - } - - public static function surroundMixLevelLookup($surmixlev) { - static $surroundMixLevelLookup; - if (empty($surroundMixLevelLookup)) { - $surroundMixLevelLookup = array( - 0 => pow(2, -3.0 / 6), - 1 => pow(2, -6.0 / 6), - 2 => 0, - 3 => 'reserved' - ); - } - return (isset($surroundMixLevelLookup[$surmixlev]) ? $surroundMixLevelLookup[$surmixlev] : false); - } - - public static function dolbySurroundModeLookup($dsurmod) { - static $dolbySurroundModeLookup = array( - 0 => 'not indicated', - 1 => 'Not Dolby Surround encoded', - 2 => 'Dolby Surround encoded', - 3 => 'reserved' - ); - return (isset($dolbySurroundModeLookup[$dsurmod]) ? $dolbySurroundModeLookup[$dsurmod] : false); - } - - public static function channelsEnabledLookup($acmod, $lfeon) { - $lookup = array( - 'ch1'=>(bool) ($acmod == 0), - 'ch2'=>(bool) ($acmod == 0), - 'left'=>(bool) ($acmod > 1), - 'right'=>(bool) ($acmod > 1), - 'center'=>(bool) ($acmod & 0x01), - 'surround_mono'=>false, - 'surround_left'=>false, - 'surround_right'=>false, - 'lfe'=>$lfeon); - switch ($acmod) { - case 4: - case 5: - $lookup['surround_mono'] = true; - break; - case 6: - case 7: - $lookup['surround_left'] = true; - $lookup['surround_right'] = true; - break; - } - return $lookup; - } - - public static function heavyCompression($compre) { - // The first four bits indicate gain changes in 6.02dB increments which can be - // implemented with an arithmetic shift operation. The following four bits - // indicate linear gain changes, and require a 5-bit multiply. - // We will represent the two 4-bit fields of compr as follows: - // X0 X1 X2 X3 . Y4 Y5 Y6 Y7 - // The meaning of the X values is most simply described by considering X to represent a 4-bit - // signed integer with values from -8 to +7. The gain indicated by X is then (X + 1) * 6.02 dB. The - // following table shows this in detail. - - // Meaning of 4 msb of compr - // 7 +48.16 dB - // 6 +42.14 dB - // 5 +36.12 dB - // 4 +30.10 dB - // 3 +24.08 dB - // 2 +18.06 dB - // 1 +12.04 dB - // 0 +6.02 dB - // -1 0 dB - // -2 -6.02 dB - // -3 -12.04 dB - // -4 -18.06 dB - // -5 -24.08 dB - // -6 -30.10 dB - // -7 -36.12 dB - // -8 -42.14 dB - - $fourbit = str_pad(decbin(($compre & 0xF0) >> 4), 4, '0', STR_PAD_LEFT); - if ($fourbit{0} == '1') { - $log_gain = -8 + bindec(substr($fourbit, 1)); - } else { - $log_gain = bindec(substr($fourbit, 1)); - } - $log_gain = ($log_gain + 1) * getid3_lib::RGADamplitude2dB(2); - - // The value of Y is a linear representation of a gain change of up to -6 dB. Y is considered to - // be an unsigned fractional integer, with a leading value of 1, or: 0.1 Y4 Y5 Y6 Y7 (base 2). Y can - // represent values between 0.111112 (or 31/32) and 0.100002 (or 1/2). Thus, Y can represent gain - // changes from -0.28 dB to -6.02 dB. - - $lin_gain = (16 + ($compre & 0x0F)) / 32; - - // The combination of X and Y values allows compr to indicate gain changes from - // 48.16 - 0.28 = +47.89 dB, to - // -42.14 - 6.02 = -48.16 dB. - - return $log_gain - $lin_gain; - } - - public static function roomTypeLookup($roomtyp) { - static $roomTypeLookup = array( - 0 => 'not indicated', - 1 => 'large room, X curve monitor', - 2 => 'small room, flat monitor', - 3 => 'reserved' - ); - return (isset($roomTypeLookup[$roomtyp]) ? $roomTypeLookup[$roomtyp] : false); - } - - public static function frameSizeLookup($frmsizecod, $fscod) { - $padding = (bool) ($frmsizecod % 2); - $framesizeid = floor($frmsizecod / 2); - - static $frameSizeLookup = array(); - if (empty($frameSizeLookup)) { - $frameSizeLookup = array ( - 0 => array(128, 138, 192), - 1 => array(40, 160, 174, 240), - 2 => array(48, 192, 208, 288), - 3 => array(56, 224, 242, 336), - 4 => array(64, 256, 278, 384), - 5 => array(80, 320, 348, 480), - 6 => array(96, 384, 416, 576), - 7 => array(112, 448, 486, 672), - 8 => array(128, 512, 556, 768), - 9 => array(160, 640, 696, 960), - 10 => array(192, 768, 834, 1152), - 11 => array(224, 896, 974, 1344), - 12 => array(256, 1024, 1114, 1536), - 13 => array(320, 1280, 1392, 1920), - 14 => array(384, 1536, 1670, 2304), - 15 => array(448, 1792, 1950, 2688), - 16 => array(512, 2048, 2228, 3072), - 17 => array(576, 2304, 2506, 3456), - 18 => array(640, 2560, 2786, 3840) - ); - } - if (($fscod == 1) && $padding) { - // frame lengths are padded by 1 word (16 bits) at 44100 - $frameSizeLookup[$frmsizecod] += 2; - } - return (isset($frameSizeLookup[$framesizeid][$fscod]) ? $frameSizeLookup[$framesizeid][$fscod] : false); - } - - public static function bitrateLookup($frmsizecod) { - $framesizeid = floor($frmsizecod / 2); - - static $bitrateLookup = array( - 0 => 32000, - 1 => 40000, - 2 => 48000, - 3 => 56000, - 4 => 64000, - 5 => 80000, - 6 => 96000, - 7 => 112000, - 8 => 128000, - 9 => 160000, - 10 => 192000, - 11 => 224000, - 12 => 256000, - 13 => 320000, - 14 => 384000, - 15 => 448000, - 16 => 512000, - 17 => 576000, - 18 => 640000 - ); - return (isset($bitrateLookup[$framesizeid]) ? $bitrateLookup[$framesizeid] : false); - } - - -} diff --git a/wp/wp-includes/ID3/module.audio.dts.php b/wp/wp-includes/ID3/module.audio.dts.php deleted file mode 100644 index bdc78f0b..00000000 --- a/wp/wp-includes/ID3/module.audio.dts.php +++ /dev/null @@ -1,291 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// -// See readme.txt for more details // -///////////////////////////////////////////////////////////////// -// // -// module.audio.dts.php // -// module for analyzing DTS Audio files // -// dependencies: NONE // -// // -///////////////////////////////////////////////////////////////// - - -/** -* @tutorial http://wiki.multimedia.cx/index.php?title=DTS -*/ -class getid3_dts extends getid3_handler -{ - /** - * Default DTS syncword used in native .cpt or .dts formats - */ - const syncword = "\x7F\xFE\x80\x01"; - - private $readBinDataOffset = 0; - - /** - * Possible syncwords indicating bitstream encoding - */ - public static $syncwords = array( - 0 => "\x7F\xFE\x80\x01", // raw big-endian - 1 => "\xFE\x7F\x01\x80", // raw little-endian - 2 => "\x1F\xFF\xE8\x00", // 14-bit big-endian - 3 => "\xFF\x1F\x00\xE8"); // 14-bit little-endian - - public function Analyze() { - $info = &$this->getid3->info; - $info['fileformat'] = 'dts'; - - $this->fseek($info['avdataoffset']); - $DTSheader = $this->fread(20); // we only need 2 words magic + 6 words frame header, but these words may be normal 16-bit words OR 14-bit words with 2 highest bits set to zero, so 8 words can be either 8*16/8 = 16 bytes OR 8*16*(16/14)/8 = 18.3 bytes - - // check syncword - $sync = substr($DTSheader, 0, 4); - if (($encoding = array_search($sync, self::$syncwords)) !== false) { - - $info['dts']['raw']['magic'] = $sync; - $this->readBinDataOffset = 32; - - } elseif ($this->isDependencyFor('matroska')) { - - // Matroska contains DTS without syncword encoded as raw big-endian format - $encoding = 0; - $this->readBinDataOffset = 0; - - } else { - - unset($info['fileformat']); - return $this->error('Expecting "'.implode('| ', array_map('getid3_lib::PrintHexBytes', self::$syncwords)).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($sync).'"'); - - } - - // decode header - $fhBS = ''; - for ($word_offset = 0; $word_offset <= strlen($DTSheader); $word_offset += 2) { - switch ($encoding) { - case 0: // raw big-endian - $fhBS .= getid3_lib::BigEndian2Bin( substr($DTSheader, $word_offset, 2) ); - break; - case 1: // raw little-endian - $fhBS .= getid3_lib::BigEndian2Bin(strrev(substr($DTSheader, $word_offset, 2))); - break; - case 2: // 14-bit big-endian - $fhBS .= substr(getid3_lib::BigEndian2Bin( substr($DTSheader, $word_offset, 2) ), 2, 14); - break; - case 3: // 14-bit little-endian - $fhBS .= substr(getid3_lib::BigEndian2Bin(strrev(substr($DTSheader, $word_offset, 2))), 2, 14); - break; - } - } - - $info['dts']['raw']['frame_type'] = $this->readBinData($fhBS, 1); - $info['dts']['raw']['deficit_samples'] = $this->readBinData($fhBS, 5); - $info['dts']['flags']['crc_present'] = (bool) $this->readBinData($fhBS, 1); - $info['dts']['raw']['pcm_sample_blocks'] = $this->readBinData($fhBS, 7); - $info['dts']['raw']['frame_byte_size'] = $this->readBinData($fhBS, 14); - $info['dts']['raw']['channel_arrangement'] = $this->readBinData($fhBS, 6); - $info['dts']['raw']['sample_frequency'] = $this->readBinData($fhBS, 4); - $info['dts']['raw']['bitrate'] = $this->readBinData($fhBS, 5); - $info['dts']['flags']['embedded_downmix'] = (bool) $this->readBinData($fhBS, 1); - $info['dts']['flags']['dynamicrange'] = (bool) $this->readBinData($fhBS, 1); - $info['dts']['flags']['timestamp'] = (bool) $this->readBinData($fhBS, 1); - $info['dts']['flags']['auxdata'] = (bool) $this->readBinData($fhBS, 1); - $info['dts']['flags']['hdcd'] = (bool) $this->readBinData($fhBS, 1); - $info['dts']['raw']['extension_audio'] = $this->readBinData($fhBS, 3); - $info['dts']['flags']['extended_coding'] = (bool) $this->readBinData($fhBS, 1); - $info['dts']['flags']['audio_sync_insertion'] = (bool) $this->readBinData($fhBS, 1); - $info['dts']['raw']['lfe_effects'] = $this->readBinData($fhBS, 2); - $info['dts']['flags']['predictor_history'] = (bool) $this->readBinData($fhBS, 1); - if ($info['dts']['flags']['crc_present']) { - $info['dts']['raw']['crc16'] = $this->readBinData($fhBS, 16); - } - $info['dts']['flags']['mri_perfect_reconst'] = (bool) $this->readBinData($fhBS, 1); - $info['dts']['raw']['encoder_soft_version'] = $this->readBinData($fhBS, 4); - $info['dts']['raw']['copy_history'] = $this->readBinData($fhBS, 2); - $info['dts']['raw']['bits_per_sample'] = $this->readBinData($fhBS, 2); - $info['dts']['flags']['surround_es'] = (bool) $this->readBinData($fhBS, 1); - $info['dts']['flags']['front_sum_diff'] = (bool) $this->readBinData($fhBS, 1); - $info['dts']['flags']['surround_sum_diff'] = (bool) $this->readBinData($fhBS, 1); - $info['dts']['raw']['dialog_normalization'] = $this->readBinData($fhBS, 4); - - - $info['dts']['bitrate'] = self::bitrateLookup($info['dts']['raw']['bitrate']); - $info['dts']['bits_per_sample'] = self::bitPerSampleLookup($info['dts']['raw']['bits_per_sample']); - $info['dts']['sample_rate'] = self::sampleRateLookup($info['dts']['raw']['sample_frequency']); - $info['dts']['dialog_normalization'] = self::dialogNormalization($info['dts']['raw']['dialog_normalization'], $info['dts']['raw']['encoder_soft_version']); - $info['dts']['flags']['lossless'] = (($info['dts']['raw']['bitrate'] == 31) ? true : false); - $info['dts']['bitrate_mode'] = (($info['dts']['raw']['bitrate'] == 30) ? 'vbr' : 'cbr'); - $info['dts']['channels'] = self::numChannelsLookup($info['dts']['raw']['channel_arrangement']); - $info['dts']['channel_arrangement'] = self::channelArrangementLookup($info['dts']['raw']['channel_arrangement']); - - $info['audio']['dataformat'] = 'dts'; - $info['audio']['lossless'] = $info['dts']['flags']['lossless']; - $info['audio']['bitrate_mode'] = $info['dts']['bitrate_mode']; - $info['audio']['bits_per_sample'] = $info['dts']['bits_per_sample']; - $info['audio']['sample_rate'] = $info['dts']['sample_rate']; - $info['audio']['channels'] = $info['dts']['channels']; - $info['audio']['bitrate'] = $info['dts']['bitrate']; - if (isset($info['avdataend']) && !empty($info['dts']['bitrate']) && is_numeric($info['dts']['bitrate'])) { - $info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset']) / ($info['dts']['bitrate'] / 8); - if (($encoding == 2) || ($encoding == 3)) { - // 14-bit data packed into 16-bit words, so the playtime is wrong because only (14/16) of the bytes in the data portion of the file are used at the specified bitrate - $info['playtime_seconds'] *= (14 / 16); - } - } - return true; - } - - private function readBinData($bin, $length) { - $data = substr($bin, $this->readBinDataOffset, $length); - $this->readBinDataOffset += $length; - - return bindec($data); - } - - public static function bitrateLookup($index) { - static $lookup = array( - 0 => 32000, - 1 => 56000, - 2 => 64000, - 3 => 96000, - 4 => 112000, - 5 => 128000, - 6 => 192000, - 7 => 224000, - 8 => 256000, - 9 => 320000, - 10 => 384000, - 11 => 448000, - 12 => 512000, - 13 => 576000, - 14 => 640000, - 15 => 768000, - 16 => 960000, - 17 => 1024000, - 18 => 1152000, - 19 => 1280000, - 20 => 1344000, - 21 => 1408000, - 22 => 1411200, - 23 => 1472000, - 24 => 1536000, - 25 => 1920000, - 26 => 2048000, - 27 => 3072000, - 28 => 3840000, - 29 => 'open', - 30 => 'variable', - 31 => 'lossless', - ); - return (isset($lookup[$index]) ? $lookup[$index] : false); - } - - public static function sampleRateLookup($index) { - static $lookup = array( - 0 => 'invalid', - 1 => 8000, - 2 => 16000, - 3 => 32000, - 4 => 'invalid', - 5 => 'invalid', - 6 => 11025, - 7 => 22050, - 8 => 44100, - 9 => 'invalid', - 10 => 'invalid', - 11 => 12000, - 12 => 24000, - 13 => 48000, - 14 => 'invalid', - 15 => 'invalid', - ); - return (isset($lookup[$index]) ? $lookup[$index] : false); - } - - public static function bitPerSampleLookup($index) { - static $lookup = array( - 0 => 16, - 1 => 20, - 2 => 24, - 3 => 24, - ); - return (isset($lookup[$index]) ? $lookup[$index] : false); - } - - public static function numChannelsLookup($index) { - switch ($index) { - case 0: - return 1; - break; - case 1: - case 2: - case 3: - case 4: - return 2; - break; - case 5: - case 6: - return 3; - break; - case 7: - case 8: - return 4; - break; - case 9: - return 5; - break; - case 10: - case 11: - case 12: - return 6; - break; - case 13: - return 7; - break; - case 14: - case 15: - return 8; - break; - } - return false; - } - - public static function channelArrangementLookup($index) { - static $lookup = array( - 0 => 'A', - 1 => 'A + B (dual mono)', - 2 => 'L + R (stereo)', - 3 => '(L+R) + (L-R) (sum-difference)', - 4 => 'LT + RT (left and right total)', - 5 => 'C + L + R', - 6 => 'L + R + S', - 7 => 'C + L + R + S', - 8 => 'L + R + SL + SR', - 9 => 'C + L + R + SL + SR', - 10 => 'CL + CR + L + R + SL + SR', - 11 => 'C + L + R+ LR + RR + OV', - 12 => 'CF + CR + LF + RF + LR + RR', - 13 => 'CL + C + CR + L + R + SL + SR', - 14 => 'CL + CR + L + R + SL1 + SL2 + SR1 + SR2', - 15 => 'CL + C+ CR + L + R + SL + S + SR', - ); - return (isset($lookup[$index]) ? $lookup[$index] : 'user-defined'); - } - - public static function dialogNormalization($index, $version) { - switch ($version) { - case 7: - return 0 - $index; - break; - case 6: - return 0 - 16 - $index; - break; - } - return false; - } - -} diff --git a/wp/wp-includes/ID3/module.audio.flac.php b/wp/wp-includes/ID3/module.audio.flac.php deleted file mode 100644 index 348cce32..00000000 --- a/wp/wp-includes/ID3/module.audio.flac.php +++ /dev/null @@ -1,453 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// -// See readme.txt for more details // -///////////////////////////////////////////////////////////////// -// // -// module.audio.flac.php // -// module for analyzing FLAC and OggFLAC audio files // -// dependencies: module.audio.ogg.php // -// /// -///////////////////////////////////////////////////////////////// - - -getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.ogg.php', __FILE__, true); - -/** -* @tutorial http://flac.sourceforge.net/format.html -*/ -class getid3_flac extends getid3_handler -{ - const syncword = 'fLaC'; - - public function Analyze() { - $info = &$this->getid3->info; - - $this->fseek($info['avdataoffset']); - $StreamMarker = $this->fread(4); - if ($StreamMarker != self::syncword) { - return $this->error('Expecting "'.getid3_lib::PrintHexBytes(self::syncword).'" at offset '.$info['avdataoffset'].', found "'.getid3_lib::PrintHexBytes($StreamMarker).'"'); - } - $info['fileformat'] = 'flac'; - $info['audio']['dataformat'] = 'flac'; - $info['audio']['bitrate_mode'] = 'vbr'; - $info['audio']['lossless'] = true; - - // parse flac container - return $this->parseMETAdata(); - } - - public function parseMETAdata() { - $info = &$this->getid3->info; - do { - $BlockOffset = $this->ftell(); - $BlockHeader = $this->fread(4); - $LBFBT = getid3_lib::BigEndian2Int(substr($BlockHeader, 0, 1)); - $LastBlockFlag = (bool) ($LBFBT & 0x80); - $BlockType = ($LBFBT & 0x7F); - $BlockLength = getid3_lib::BigEndian2Int(substr($BlockHeader, 1, 3)); - $BlockTypeText = self::metaBlockTypeLookup($BlockType); - - if (($BlockOffset + 4 + $BlockLength) > $info['avdataend']) { - $this->error('METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$BlockTypeText.') at offset '.$BlockOffset.' extends beyond end of file'); - break; - } - if ($BlockLength < 1) { - $this->error('METADATA_BLOCK_HEADER.BLOCK_LENGTH ('.$BlockLength.') at offset '.$BlockOffset.' is invalid'); - break; - } - - $info['flac'][$BlockTypeText]['raw'] = array(); - $BlockTypeText_raw = &$info['flac'][$BlockTypeText]['raw']; - - $BlockTypeText_raw['offset'] = $BlockOffset; - $BlockTypeText_raw['last_meta_block'] = $LastBlockFlag; - $BlockTypeText_raw['block_type'] = $BlockType; - $BlockTypeText_raw['block_type_text'] = $BlockTypeText; - $BlockTypeText_raw['block_length'] = $BlockLength; - if ($BlockTypeText_raw['block_type'] != 0x06) { // do not read attachment data automatically - $BlockTypeText_raw['block_data'] = $this->fread($BlockLength); - } - - switch ($BlockTypeText) { - case 'STREAMINFO': // 0x00 - if (!$this->parseSTREAMINFO($BlockTypeText_raw['block_data'])) { - return false; - } - break; - - case 'PADDING': // 0x01 - unset($info['flac']['PADDING']); // ignore - break; - - case 'APPLICATION': // 0x02 - if (!$this->parseAPPLICATION($BlockTypeText_raw['block_data'])) { - return false; - } - break; - - case 'SEEKTABLE': // 0x03 - if (!$this->parseSEEKTABLE($BlockTypeText_raw['block_data'])) { - return false; - } - break; - - case 'VORBIS_COMMENT': // 0x04 - if (!$this->parseVORBIS_COMMENT($BlockTypeText_raw['block_data'])) { - return false; - } - break; - - case 'CUESHEET': // 0x05 - if (!$this->parseCUESHEET($BlockTypeText_raw['block_data'])) { - return false; - } - break; - - case 'PICTURE': // 0x06 - if (!$this->parsePICTURE()) { - return false; - } - break; - - default: - $this->warning('Unhandled METADATA_BLOCK_HEADER.BLOCK_TYPE ('.$BlockType.') at offset '.$BlockOffset); - } - - unset($info['flac'][$BlockTypeText]['raw']); - $info['avdataoffset'] = $this->ftell(); - } - while ($LastBlockFlag === false); - - // handle tags - if (!empty($info['flac']['VORBIS_COMMENT']['comments'])) { - $info['flac']['comments'] = $info['flac']['VORBIS_COMMENT']['comments']; - } - if (!empty($info['flac']['VORBIS_COMMENT']['vendor'])) { - $info['audio']['encoder'] = str_replace('reference ', '', $info['flac']['VORBIS_COMMENT']['vendor']); - } - - // copy attachments to 'comments' array if nesesary - if (isset($info['flac']['PICTURE']) && ($this->getid3->option_save_attachments !== getID3::ATTACHMENTS_NONE)) { - foreach ($info['flac']['PICTURE'] as $entry) { - if (!empty($entry['data'])) { - if (!isset($info['flac']['comments']['picture'])) { - $info['flac']['comments']['picture'] = array(); - } - $comments_picture_data = array(); - foreach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) { - if (isset($entry[$picture_key])) { - $comments_picture_data[$picture_key] = $entry[$picture_key]; - } - } - $info['flac']['comments']['picture'][] = $comments_picture_data; - unset($comments_picture_data); - } - } - } - - if (isset($info['flac']['STREAMINFO'])) { - if (!$this->isDependencyFor('matroska')) { - $info['flac']['compressed_audio_bytes'] = $info['avdataend'] - $info['avdataoffset']; - } - $info['flac']['uncompressed_audio_bytes'] = $info['flac']['STREAMINFO']['samples_stream'] * $info['flac']['STREAMINFO']['channels'] * ($info['flac']['STREAMINFO']['bits_per_sample'] / 8); - if ($info['flac']['uncompressed_audio_bytes'] == 0) { - return $this->error('Corrupt FLAC file: uncompressed_audio_bytes == zero'); - } - if (!empty($info['flac']['compressed_audio_bytes'])) { - $info['flac']['compression_ratio'] = $info['flac']['compressed_audio_bytes'] / $info['flac']['uncompressed_audio_bytes']; - } - } - - // set md5_data_source - built into flac 0.5+ - if (isset($info['flac']['STREAMINFO']['audio_signature'])) { - - if ($info['flac']['STREAMINFO']['audio_signature'] === str_repeat("\x00", 16)) { - $this->warning('FLAC STREAMINFO.audio_signature is null (known issue with libOggFLAC)'); - } - else { - $info['md5_data_source'] = ''; - $md5 = $info['flac']['STREAMINFO']['audio_signature']; - for ($i = 0; $i < strlen($md5); $i++) { - $info['md5_data_source'] .= str_pad(dechex(ord($md5[$i])), 2, '00', STR_PAD_LEFT); - } - if (!preg_match('/^[0-9a-f]{32}$/', $info['md5_data_source'])) { - unset($info['md5_data_source']); - } - } - } - - if (isset($info['flac']['STREAMINFO']['bits_per_sample'])) { - $info['audio']['bits_per_sample'] = $info['flac']['STREAMINFO']['bits_per_sample']; - if ($info['audio']['bits_per_sample'] == 8) { - // special case - // must invert sign bit on all data bytes before MD5'ing to match FLAC's calculated value - // MD5sum calculates on unsigned bytes, but FLAC calculated MD5 on 8-bit audio data as signed - $this->warning('FLAC calculates MD5 data strangely on 8-bit audio, so the stored md5_data_source value will not match the decoded WAV file'); - } - } - - return true; - } - - private function parseSTREAMINFO($BlockData) { - $info = &$this->getid3->info; - - $info['flac']['STREAMINFO'] = array(); - $streaminfo = &$info['flac']['STREAMINFO']; - - $streaminfo['min_block_size'] = getid3_lib::BigEndian2Int(substr($BlockData, 0, 2)); - $streaminfo['max_block_size'] = getid3_lib::BigEndian2Int(substr($BlockData, 2, 2)); - $streaminfo['min_frame_size'] = getid3_lib::BigEndian2Int(substr($BlockData, 4, 3)); - $streaminfo['max_frame_size'] = getid3_lib::BigEndian2Int(substr($BlockData, 7, 3)); - - $SRCSBSS = getid3_lib::BigEndian2Bin(substr($BlockData, 10, 8)); - $streaminfo['sample_rate'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 0, 20)); - $streaminfo['channels'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 20, 3)) + 1; - $streaminfo['bits_per_sample'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 23, 5)) + 1; - $streaminfo['samples_stream'] = getid3_lib::Bin2Dec(substr($SRCSBSS, 28, 36)); - - $streaminfo['audio_signature'] = substr($BlockData, 18, 16); - - if (!empty($streaminfo['sample_rate'])) { - - $info['audio']['bitrate_mode'] = 'vbr'; - $info['audio']['sample_rate'] = $streaminfo['sample_rate']; - $info['audio']['channels'] = $streaminfo['channels']; - $info['audio']['bits_per_sample'] = $streaminfo['bits_per_sample']; - $info['playtime_seconds'] = $streaminfo['samples_stream'] / $streaminfo['sample_rate']; - if ($info['playtime_seconds'] > 0) { - if (!$this->isDependencyFor('matroska')) { - $info['audio']['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds']; - } - else { - $this->warning('Cannot determine audio bitrate because total stream size is unknown'); - } - } - - } else { - return $this->error('Corrupt METAdata block: STREAMINFO'); - } - - return true; - } - - private function parseAPPLICATION($BlockData) { - $info = &$this->getid3->info; - - $ApplicationID = getid3_lib::BigEndian2Int(substr($BlockData, 0, 4)); - $info['flac']['APPLICATION'][$ApplicationID]['name'] = self::applicationIDLookup($ApplicationID); - $info['flac']['APPLICATION'][$ApplicationID]['data'] = substr($BlockData, 4); - - return true; - } - - private function parseSEEKTABLE($BlockData) { - $info = &$this->getid3->info; - - $offset = 0; - $BlockLength = strlen($BlockData); - $placeholderpattern = str_repeat("\xFF", 8); - while ($offset < $BlockLength) { - $SampleNumberString = substr($BlockData, $offset, 8); - $offset += 8; - if ($SampleNumberString == $placeholderpattern) { - - // placeholder point - getid3_lib::safe_inc($info['flac']['SEEKTABLE']['placeholders'], 1); - $offset += 10; - - } else { - - $SampleNumber = getid3_lib::BigEndian2Int($SampleNumberString); - $info['flac']['SEEKTABLE'][$SampleNumber]['offset'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8)); - $offset += 8; - $info['flac']['SEEKTABLE'][$SampleNumber]['samples'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 2)); - $offset += 2; - - } - } - - return true; - } - - private function parseVORBIS_COMMENT($BlockData) { - $info = &$this->getid3->info; - - $getid3_ogg = new getid3_ogg($this->getid3); - if ($this->isDependencyFor('matroska')) { - $getid3_ogg->setStringMode($this->data_string); - } - $getid3_ogg->ParseVorbisComments(); - if (isset($info['ogg'])) { - unset($info['ogg']['comments_raw']); - $info['flac']['VORBIS_COMMENT'] = $info['ogg']; - unset($info['ogg']); - } - - unset($getid3_ogg); - - return true; - } - - private function parseCUESHEET($BlockData) { - $info = &$this->getid3->info; - $offset = 0; - $info['flac']['CUESHEET']['media_catalog_number'] = trim(substr($BlockData, $offset, 128), "\0"); - $offset += 128; - $info['flac']['CUESHEET']['lead_in_samples'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8)); - $offset += 8; - $info['flac']['CUESHEET']['flags']['is_cd'] = (bool) (getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)) & 0x80); - $offset += 1; - - $offset += 258; // reserved - - $info['flac']['CUESHEET']['number_tracks'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); - $offset += 1; - - for ($track = 0; $track < $info['flac']['CUESHEET']['number_tracks']; $track++) { - $TrackSampleOffset = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8)); - $offset += 8; - $TrackNumber = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); - $offset += 1; - - $info['flac']['CUESHEET']['tracks'][$TrackNumber]['sample_offset'] = $TrackSampleOffset; - - $info['flac']['CUESHEET']['tracks'][$TrackNumber]['isrc'] = substr($BlockData, $offset, 12); - $offset += 12; - - $TrackFlagsRaw = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); - $offset += 1; - $info['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['is_audio'] = (bool) ($TrackFlagsRaw & 0x80); - $info['flac']['CUESHEET']['tracks'][$TrackNumber]['flags']['pre_emphasis'] = (bool) ($TrackFlagsRaw & 0x40); - - $offset += 13; // reserved - - $info['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points'] = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); - $offset += 1; - - for ($index = 0; $index < $info['flac']['CUESHEET']['tracks'][$TrackNumber]['index_points']; $index++) { - $IndexSampleOffset = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 8)); - $offset += 8; - $IndexNumber = getid3_lib::BigEndian2Int(substr($BlockData, $offset, 1)); - $offset += 1; - - $offset += 3; // reserved - - $info['flac']['CUESHEET']['tracks'][$TrackNumber]['indexes'][$IndexNumber] = $IndexSampleOffset; - } - } - - return true; - } - - /** - * Parse METADATA_BLOCK_PICTURE flac structure and extract attachment - * External usage: audio.ogg - */ - public function parsePICTURE() { - $info = &$this->getid3->info; - - $picture['typeid'] = getid3_lib::BigEndian2Int($this->fread(4)); - $picture['picturetype'] = self::pictureTypeLookup($picture['typeid']); - $picture['image_mime'] = $this->fread(getid3_lib::BigEndian2Int($this->fread(4))); - $descr_length = getid3_lib::BigEndian2Int($this->fread(4)); - if ($descr_length) { - $picture['description'] = $this->fread($descr_length); - } - $picture['image_width'] = getid3_lib::BigEndian2Int($this->fread(4)); - $picture['image_height'] = getid3_lib::BigEndian2Int($this->fread(4)); - $picture['color_depth'] = getid3_lib::BigEndian2Int($this->fread(4)); - $picture['colors_indexed'] = getid3_lib::BigEndian2Int($this->fread(4)); - $picture['datalength'] = getid3_lib::BigEndian2Int($this->fread(4)); - - if ($picture['image_mime'] == '-->') { - $picture['data'] = $this->fread($picture['datalength']); - } else { - $picture['data'] = $this->saveAttachment( - str_replace('/', '_', $picture['picturetype']).'_'.$this->ftell(), - $this->ftell(), - $picture['datalength'], - $picture['image_mime']); - } - - $info['flac']['PICTURE'][] = $picture; - - return true; - } - - public static function metaBlockTypeLookup($blocktype) { - static $lookup = array( - 0 => 'STREAMINFO', - 1 => 'PADDING', - 2 => 'APPLICATION', - 3 => 'SEEKTABLE', - 4 => 'VORBIS_COMMENT', - 5 => 'CUESHEET', - 6 => 'PICTURE', - ); - return (isset($lookup[$blocktype]) ? $lookup[$blocktype] : 'reserved'); - } - - public static function applicationIDLookup($applicationid) { - // http://flac.sourceforge.net/id.html - static $lookup = array( - 0x41544348 => 'FlacFile', // "ATCH" - 0x42534F4C => 'beSolo', // "BSOL" - 0x42554753 => 'Bugs Player', // "BUGS" - 0x43756573 => 'GoldWave cue points (specification)', // "Cues" - 0x46696361 => 'CUE Splitter', // "Fica" - 0x46746F6C => 'flac-tools', // "Ftol" - 0x4D4F5442 => 'MOTB MetaCzar', // "MOTB" - 0x4D505345 => 'MP3 Stream Editor', // "MPSE" - 0x4D754D4C => 'MusicML: Music Metadata Language', // "MuML" - 0x52494646 => 'Sound Devices RIFF chunk storage', // "RIFF" - 0x5346464C => 'Sound Font FLAC', // "SFFL" - 0x534F4E59 => 'Sony Creative Software', // "SONY" - 0x5351455A => 'flacsqueeze', // "SQEZ" - 0x54745776 => 'TwistedWave', // "TtWv" - 0x55495453 => 'UITS Embedding tools', // "UITS" - 0x61696666 => 'FLAC AIFF chunk storage', // "aiff" - 0x696D6167 => 'flac-image application for storing arbitrary files in APPLICATION metadata blocks', // "imag" - 0x7065656D => 'Parseable Embedded Extensible Metadata (specification)', // "peem" - 0x71667374 => 'QFLAC Studio', // "qfst" - 0x72696666 => 'FLAC RIFF chunk storage', // "riff" - 0x74756E65 => 'TagTuner', // "tune" - 0x78626174 => 'XBAT', // "xbat" - 0x786D6364 => 'xmcd', // "xmcd" - ); - return (isset($lookup[$applicationid]) ? $lookup[$applicationid] : 'reserved'); - } - - public static function pictureTypeLookup($type_id) { - static $lookup = array ( - 0 => 'Other', - 1 => '32x32 pixels \'file icon\' (PNG only)', - 2 => 'Other file icon', - 3 => 'Cover (front)', - 4 => 'Cover (back)', - 5 => 'Leaflet page', - 6 => 'Media (e.g. label side of CD)', - 7 => 'Lead artist/lead performer/soloist', - 8 => 'Artist/performer', - 9 => 'Conductor', - 10 => 'Band/Orchestra', - 11 => 'Composer', - 12 => 'Lyricist/text writer', - 13 => 'Recording Location', - 14 => 'During recording', - 15 => 'During performance', - 16 => 'Movie/video screen capture', - 17 => 'A bright coloured fish', - 18 => 'Illustration', - 19 => 'Band/artist logotype', - 20 => 'Publisher/Studio logotype', - ); - return (isset($lookup[$type_id]) ? $lookup[$type_id] : 'reserved'); - } - -} diff --git a/wp/wp-includes/ID3/module.audio.mp3.php b/wp/wp-includes/ID3/module.audio.mp3.php deleted file mode 100644 index 329f7a67..00000000 --- a/wp/wp-includes/ID3/module.audio.mp3.php +++ /dev/null @@ -1,2012 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// -// See readme.txt for more details // -///////////////////////////////////////////////////////////////// -// // -// module.audio.mp3.php // -// module for analyzing MP3 files // -// dependencies: NONE // -// /// -///////////////////////////////////////////////////////////////// - - -// number of frames to scan to determine if MPEG-audio sequence is valid -// Lower this number to 5-20 for faster scanning -// Increase this number to 50+ for most accurate detection of valid VBR/CBR -// mpeg-audio streams -define('GETID3_MP3_VALID_CHECK_FRAMES', 35); - - -class getid3_mp3 extends getid3_handler -{ - - public $allow_bruteforce = false; // forces getID3() to scan the file byte-by-byte and log all the valid audio frame headers - extremely slow, unrecommended, but may provide data from otherwise-unusuable files - - public function Analyze() { - $info = &$this->getid3->info; - - $initialOffset = $info['avdataoffset']; - - if (!$this->getOnlyMPEGaudioInfo($info['avdataoffset'])) { - if ($this->allow_bruteforce) { - $info['error'][] = 'Rescanning file in BruteForce mode'; - $this->getOnlyMPEGaudioInfoBruteForce($this->getid3->fp, $info); - } - } - - - if (isset($info['mpeg']['audio']['bitrate_mode'])) { - $info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']); - } - - if (((isset($info['id3v2']['headerlength']) && ($info['avdataoffset'] > $info['id3v2']['headerlength'])) || (!isset($info['id3v2']) && ($info['avdataoffset'] > 0) && ($info['avdataoffset'] != $initialOffset)))) { - - $synchoffsetwarning = 'Unknown data before synch '; - if (isset($info['id3v2']['headerlength'])) { - $synchoffsetwarning .= '(ID3v2 header ends at '.$info['id3v2']['headerlength'].', then '.($info['avdataoffset'] - $info['id3v2']['headerlength']).' bytes garbage, '; - } elseif ($initialOffset > 0) { - $synchoffsetwarning .= '(should be at '.$initialOffset.', '; - } else { - $synchoffsetwarning .= '(should be at beginning of file, '; - } - $synchoffsetwarning .= 'synch detected at '.$info['avdataoffset'].')'; - if (isset($info['audio']['bitrate_mode']) && ($info['audio']['bitrate_mode'] == 'cbr')) { - - if (!empty($info['id3v2']['headerlength']) && (($info['avdataoffset'] - $info['id3v2']['headerlength']) == $info['mpeg']['audio']['framelength'])) { - - $synchoffsetwarning .= '. This is a known problem with some versions of LAME (3.90-3.92) DLL in CBR mode.'; - $info['audio']['codec'] = 'LAME'; - $CurrentDataLAMEversionString = 'LAME3.'; - - } elseif (empty($info['id3v2']['headerlength']) && ($info['avdataoffset'] == $info['mpeg']['audio']['framelength'])) { - - $synchoffsetwarning .= '. This is a known problem with some versions of LAME (3.90 - 3.92) DLL in CBR mode.'; - $info['audio']['codec'] = 'LAME'; - $CurrentDataLAMEversionString = 'LAME3.'; - - } - - } - $info['warning'][] = $synchoffsetwarning; - - } - - if (isset($info['mpeg']['audio']['LAME'])) { - $info['audio']['codec'] = 'LAME'; - if (!empty($info['mpeg']['audio']['LAME']['long_version'])) { - $info['audio']['encoder'] = rtrim($info['mpeg']['audio']['LAME']['long_version'], "\x00"); - } elseif (!empty($info['mpeg']['audio']['LAME']['short_version'])) { - $info['audio']['encoder'] = rtrim($info['mpeg']['audio']['LAME']['short_version'], "\x00"); - } - } - - $CurrentDataLAMEversionString = (!empty($CurrentDataLAMEversionString) ? $CurrentDataLAMEversionString : (isset($info['audio']['encoder']) ? $info['audio']['encoder'] : '')); - if (!empty($CurrentDataLAMEversionString) && (substr($CurrentDataLAMEversionString, 0, 6) == 'LAME3.') && !preg_match('[0-9\)]', substr($CurrentDataLAMEversionString, -1))) { - // a version number of LAME that does not end with a number like "LAME3.92" - // or with a closing parenthesis like "LAME3.88 (alpha)" - // or a version of LAME with the LAMEtag-not-filled-in-DLL-mode bug (3.90-3.92) - - // not sure what the actual last frame length will be, but will be less than or equal to 1441 - $PossiblyLongerLAMEversion_FrameLength = 1441; - - // Not sure what version of LAME this is - look in padding of last frame for longer version string - $PossibleLAMEversionStringOffset = $info['avdataend'] - $PossiblyLongerLAMEversion_FrameLength; - $this->fseek($PossibleLAMEversionStringOffset); - $PossiblyLongerLAMEversion_Data = $this->fread($PossiblyLongerLAMEversion_FrameLength); - switch (substr($CurrentDataLAMEversionString, -1)) { - case 'a': - case 'b': - // "LAME3.94a" will have a longer version string of "LAME3.94 (alpha)" for example - // need to trim off "a" to match longer string - $CurrentDataLAMEversionString = substr($CurrentDataLAMEversionString, 0, -1); - break; - } - if (($PossiblyLongerLAMEversion_String = strstr($PossiblyLongerLAMEversion_Data, $CurrentDataLAMEversionString)) !== false) { - if (substr($PossiblyLongerLAMEversion_String, 0, strlen($CurrentDataLAMEversionString)) == $CurrentDataLAMEversionString) { - $PossiblyLongerLAMEversion_NewString = substr($PossiblyLongerLAMEversion_String, 0, strspn($PossiblyLongerLAMEversion_String, 'LAME0123456789., (abcdefghijklmnopqrstuvwxyzJFSOND)')); //"LAME3.90.3" "LAME3.87 (beta 1, Sep 27 2000)" "LAME3.88 (beta)" - if (empty($info['audio']['encoder']) || (strlen($PossiblyLongerLAMEversion_NewString) > strlen($info['audio']['encoder']))) { - $info['audio']['encoder'] = $PossiblyLongerLAMEversion_NewString; - } - } - } - } - if (!empty($info['audio']['encoder'])) { - $info['audio']['encoder'] = rtrim($info['audio']['encoder'], "\x00 "); - } - - switch (isset($info['mpeg']['audio']['layer']) ? $info['mpeg']['audio']['layer'] : '') { - case 1: - case 2: - $info['audio']['dataformat'] = 'mp'.$info['mpeg']['audio']['layer']; - break; - } - if (isset($info['fileformat']) && ($info['fileformat'] == 'mp3')) { - switch ($info['audio']['dataformat']) { - case 'mp1': - case 'mp2': - case 'mp3': - $info['fileformat'] = $info['audio']['dataformat']; - break; - - default: - $info['warning'][] = 'Expecting [audio][dataformat] to be mp1/mp2/mp3 when fileformat == mp3, [audio][dataformat] actually "'.$info['audio']['dataformat'].'"'; - break; - } - } - - if (empty($info['fileformat'])) { - unset($info['fileformat']); - unset($info['audio']['bitrate_mode']); - unset($info['avdataoffset']); - unset($info['avdataend']); - return false; - } - - $info['mime_type'] = 'audio/mpeg'; - $info['audio']['lossless'] = false; - - // Calculate playtime - if (!isset($info['playtime_seconds']) && isset($info['audio']['bitrate']) && ($info['audio']['bitrate'] > 0)) { - $info['playtime_seconds'] = ($info['avdataend'] - $info['avdataoffset']) * 8 / $info['audio']['bitrate']; - } - - $info['audio']['encoder_options'] = $this->GuessEncoderOptions(); - - return true; - } - - - public function GuessEncoderOptions() { - // shortcuts - $info = &$this->getid3->info; - if (!empty($info['mpeg']['audio'])) { - $thisfile_mpeg_audio = &$info['mpeg']['audio']; - if (!empty($thisfile_mpeg_audio['LAME'])) { - $thisfile_mpeg_audio_lame = &$thisfile_mpeg_audio['LAME']; - } - } - - $encoder_options = ''; - static $NamedPresetBitrates = array(16, 24, 40, 56, 112, 128, 160, 192, 256); - - if (isset($thisfile_mpeg_audio['VBR_method']) && ($thisfile_mpeg_audio['VBR_method'] == 'Fraunhofer') && !empty($thisfile_mpeg_audio['VBR_quality'])) { - - $encoder_options = 'VBR q'.$thisfile_mpeg_audio['VBR_quality']; - - } elseif (!empty($thisfile_mpeg_audio_lame['preset_used']) && (!in_array($thisfile_mpeg_audio_lame['preset_used_id'], $NamedPresetBitrates))) { - - $encoder_options = $thisfile_mpeg_audio_lame['preset_used']; - - } elseif (!empty($thisfile_mpeg_audio_lame['vbr_quality'])) { - - static $KnownEncoderValues = array(); - if (empty($KnownEncoderValues)) { - - //$KnownEncoderValues[abrbitrate_minbitrate][vbr_quality][raw_vbr_method][raw_noise_shaping][raw_stereo_mode][ath_type][lowpass_frequency] = 'preset name'; - $KnownEncoderValues[0xFF][58][1][1][3][2][20500] = '--alt-preset insane'; // 3.90, 3.90.1, 3.92 - $KnownEncoderValues[0xFF][58][1][1][3][2][20600] = '--alt-preset insane'; // 3.90.2, 3.90.3, 3.91 - $KnownEncoderValues[0xFF][57][1][1][3][4][20500] = '--alt-preset insane'; // 3.94, 3.95 - $KnownEncoderValues['**'][78][3][2][3][2][19500] = '--alt-preset extreme'; // 3.90, 3.90.1, 3.92 - $KnownEncoderValues['**'][78][3][2][3][2][19600] = '--alt-preset extreme'; // 3.90.2, 3.91 - $KnownEncoderValues['**'][78][3][1][3][2][19600] = '--alt-preset extreme'; // 3.90.3 - $KnownEncoderValues['**'][78][4][2][3][2][19500] = '--alt-preset fast extreme'; // 3.90, 3.90.1, 3.92 - $KnownEncoderValues['**'][78][4][2][3][2][19600] = '--alt-preset fast extreme'; // 3.90.2, 3.90.3, 3.91 - $KnownEncoderValues['**'][78][3][2][3][4][19000] = '--alt-preset standard'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 - $KnownEncoderValues['**'][78][3][1][3][4][19000] = '--alt-preset standard'; // 3.90.3 - $KnownEncoderValues['**'][78][4][2][3][4][19000] = '--alt-preset fast standard'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 - $KnownEncoderValues['**'][78][4][1][3][4][19000] = '--alt-preset fast standard'; // 3.90.3 - $KnownEncoderValues['**'][88][4][1][3][3][19500] = '--r3mix'; // 3.90, 3.90.1, 3.92 - $KnownEncoderValues['**'][88][4][1][3][3][19600] = '--r3mix'; // 3.90.2, 3.90.3, 3.91 - $KnownEncoderValues['**'][67][4][1][3][4][18000] = '--r3mix'; // 3.94, 3.95 - $KnownEncoderValues['**'][68][3][2][3][4][18000] = '--alt-preset medium'; // 3.90.3 - $KnownEncoderValues['**'][68][4][2][3][4][18000] = '--alt-preset fast medium'; // 3.90.3 - - $KnownEncoderValues[0xFF][99][1][1][1][2][0] = '--preset studio'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 - $KnownEncoderValues[0xFF][58][2][1][3][2][20600] = '--preset studio'; // 3.90.3, 3.93.1 - $KnownEncoderValues[0xFF][58][2][1][3][2][20500] = '--preset studio'; // 3.93 - $KnownEncoderValues[0xFF][57][2][1][3][4][20500] = '--preset studio'; // 3.94, 3.95 - $KnownEncoderValues[0xC0][88][1][1][1][2][0] = '--preset cd'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 - $KnownEncoderValues[0xC0][58][2][2][3][2][19600] = '--preset cd'; // 3.90.3, 3.93.1 - $KnownEncoderValues[0xC0][58][2][2][3][2][19500] = '--preset cd'; // 3.93 - $KnownEncoderValues[0xC0][57][2][1][3][4][19500] = '--preset cd'; // 3.94, 3.95 - $KnownEncoderValues[0xA0][78][1][1][3][2][18000] = '--preset hifi'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 - $KnownEncoderValues[0xA0][58][2][2][3][2][18000] = '--preset hifi'; // 3.90.3, 3.93, 3.93.1 - $KnownEncoderValues[0xA0][57][2][1][3][4][18000] = '--preset hifi'; // 3.94, 3.95 - $KnownEncoderValues[0x80][67][1][1][3][2][18000] = '--preset tape'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 - $KnownEncoderValues[0x80][67][1][1][3][2][15000] = '--preset radio'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 - $KnownEncoderValues[0x70][67][1][1][3][2][15000] = '--preset fm'; // 3.90, 3.90.1, 3.90.2, 3.91, 3.92 - $KnownEncoderValues[0x70][58][2][2][3][2][16000] = '--preset tape/radio/fm'; // 3.90.3, 3.93, 3.93.1 - $KnownEncoderValues[0x70][57][2][1][3][4][16000] = '--preset tape/radio/fm'; // 3.94, 3.95 - $KnownEncoderValues[0x38][58][2][2][0][2][10000] = '--preset voice'; // 3.90.3, 3.93, 3.93.1 - $KnownEncoderValues[0x38][57][2][1][0][4][15000] = '--preset voice'; // 3.94, 3.95 - $KnownEncoderValues[0x38][57][2][1][0][4][16000] = '--preset voice'; // 3.94a14 - $KnownEncoderValues[0x28][65][1][1][0][2][7500] = '--preset mw-us'; // 3.90, 3.90.1, 3.92 - $KnownEncoderValues[0x28][65][1][1][0][2][7600] = '--preset mw-us'; // 3.90.2, 3.91 - $KnownEncoderValues[0x28][58][2][2][0][2][7000] = '--preset mw-us'; // 3.90.3, 3.93, 3.93.1 - $KnownEncoderValues[0x28][57][2][1][0][4][10500] = '--preset mw-us'; // 3.94, 3.95 - $KnownEncoderValues[0x28][57][2][1][0][4][11200] = '--preset mw-us'; // 3.94a14 - $KnownEncoderValues[0x28][57][2][1][0][4][8800] = '--preset mw-us'; // 3.94a15 - $KnownEncoderValues[0x18][58][2][2][0][2][4000] = '--preset phon+/lw/mw-eu/sw'; // 3.90.3, 3.93.1 - $KnownEncoderValues[0x18][58][2][2][0][2][3900] = '--preset phon+/lw/mw-eu/sw'; // 3.93 - $KnownEncoderValues[0x18][57][2][1][0][4][5900] = '--preset phon+/lw/mw-eu/sw'; // 3.94, 3.95 - $KnownEncoderValues[0x18][57][2][1][0][4][6200] = '--preset phon+/lw/mw-eu/sw'; // 3.94a14 - $KnownEncoderValues[0x18][57][2][1][0][4][3200] = '--preset phon+/lw/mw-eu/sw'; // 3.94a15 - $KnownEncoderValues[0x10][58][2][2][0][2][3800] = '--preset phone'; // 3.90.3, 3.93.1 - $KnownEncoderValues[0x10][58][2][2][0][2][3700] = '--preset phone'; // 3.93 - $KnownEncoderValues[0x10][57][2][1][0][4][5600] = '--preset phone'; // 3.94, 3.95 - } - - if (isset($KnownEncoderValues[$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']])) { - - $encoder_options = $KnownEncoderValues[$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']]; - - } elseif (isset($KnownEncoderValues['**'][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']])) { - - $encoder_options = $KnownEncoderValues['**'][$thisfile_mpeg_audio_lame['vbr_quality']][$thisfile_mpeg_audio_lame['raw']['vbr_method']][$thisfile_mpeg_audio_lame['raw']['noise_shaping']][$thisfile_mpeg_audio_lame['raw']['stereo_mode']][$thisfile_mpeg_audio_lame['ath_type']][$thisfile_mpeg_audio_lame['lowpass_frequency']]; - - } elseif ($info['audio']['bitrate_mode'] == 'vbr') { - - // http://gabriel.mp3-tech.org/mp3infotag.html - // int Quality = (100 - 10 * gfp->VBR_q - gfp->quality)h - - - $LAME_V_value = 10 - ceil($thisfile_mpeg_audio_lame['vbr_quality'] / 10); - $LAME_q_value = 100 - $thisfile_mpeg_audio_lame['vbr_quality'] - ($LAME_V_value * 10); - $encoder_options = '-V'.$LAME_V_value.' -q'.$LAME_q_value; - - } elseif ($info['audio']['bitrate_mode'] == 'cbr') { - - $encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000); - - } else { - - $encoder_options = strtoupper($info['audio']['bitrate_mode']); - - } - - } elseif (!empty($thisfile_mpeg_audio_lame['bitrate_abr'])) { - - $encoder_options = 'ABR'.$thisfile_mpeg_audio_lame['bitrate_abr']; - - } elseif (!empty($info['audio']['bitrate'])) { - - if ($info['audio']['bitrate_mode'] == 'cbr') { - $encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000); - } else { - $encoder_options = strtoupper($info['audio']['bitrate_mode']); - } - - } - if (!empty($thisfile_mpeg_audio_lame['bitrate_min'])) { - $encoder_options .= ' -b'.$thisfile_mpeg_audio_lame['bitrate_min']; - } - - if (!empty($thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev']) || !empty($thisfile_mpeg_audio_lame['encoding_flags']['nogap_next'])) { - $encoder_options .= ' --nogap'; - } - - if (!empty($thisfile_mpeg_audio_lame['lowpass_frequency'])) { - $ExplodedOptions = explode(' ', $encoder_options, 4); - if ($ExplodedOptions[0] == '--r3mix') { - $ExplodedOptions[1] = 'r3mix'; - } - switch ($ExplodedOptions[0]) { - case '--preset': - case '--alt-preset': - case '--r3mix': - if ($ExplodedOptions[1] == 'fast') { - $ExplodedOptions[1] .= ' '.$ExplodedOptions[2]; - } - switch ($ExplodedOptions[1]) { - case 'portable': - case 'medium': - case 'standard': - case 'extreme': - case 'insane': - case 'fast portable': - case 'fast medium': - case 'fast standard': - case 'fast extreme': - case 'fast insane': - case 'r3mix': - static $ExpectedLowpass = array( - 'insane|20500' => 20500, - 'insane|20600' => 20600, // 3.90.2, 3.90.3, 3.91 - 'medium|18000' => 18000, - 'fast medium|18000' => 18000, - 'extreme|19500' => 19500, // 3.90, 3.90.1, 3.92, 3.95 - 'extreme|19600' => 19600, // 3.90.2, 3.90.3, 3.91, 3.93.1 - 'fast extreme|19500' => 19500, // 3.90, 3.90.1, 3.92, 3.95 - 'fast extreme|19600' => 19600, // 3.90.2, 3.90.3, 3.91, 3.93.1 - 'standard|19000' => 19000, - 'fast standard|19000' => 19000, - 'r3mix|19500' => 19500, // 3.90, 3.90.1, 3.92 - 'r3mix|19600' => 19600, // 3.90.2, 3.90.3, 3.91 - 'r3mix|18000' => 18000, // 3.94, 3.95 - ); - if (!isset($ExpectedLowpass[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio_lame['lowpass_frequency']]) && ($thisfile_mpeg_audio_lame['lowpass_frequency'] < 22050) && (round($thisfile_mpeg_audio_lame['lowpass_frequency'] / 1000) < round($thisfile_mpeg_audio['sample_rate'] / 2000))) { - $encoder_options .= ' --lowpass '.$thisfile_mpeg_audio_lame['lowpass_frequency']; - } - break; - - default: - break; - } - break; - } - } - - if (isset($thisfile_mpeg_audio_lame['raw']['source_sample_freq'])) { - if (($thisfile_mpeg_audio['sample_rate'] == 44100) && ($thisfile_mpeg_audio_lame['raw']['source_sample_freq'] != 1)) { - $encoder_options .= ' --resample 44100'; - } elseif (($thisfile_mpeg_audio['sample_rate'] == 48000) && ($thisfile_mpeg_audio_lame['raw']['source_sample_freq'] != 2)) { - $encoder_options .= ' --resample 48000'; - } elseif ($thisfile_mpeg_audio['sample_rate'] < 44100) { - switch ($thisfile_mpeg_audio_lame['raw']['source_sample_freq']) { - case 0: // <= 32000 - // may or may not be same as source frequency - ignore - break; - case 1: // 44100 - case 2: // 48000 - case 3: // 48000+ - $ExplodedOptions = explode(' ', $encoder_options, 4); - switch ($ExplodedOptions[0]) { - case '--preset': - case '--alt-preset': - switch ($ExplodedOptions[1]) { - case 'fast': - case 'portable': - case 'medium': - case 'standard': - case 'extreme': - case 'insane': - $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; - break; - - default: - static $ExpectedResampledRate = array( - 'phon+/lw/mw-eu/sw|16000' => 16000, - 'mw-us|24000' => 24000, // 3.95 - 'mw-us|32000' => 32000, // 3.93 - 'mw-us|16000' => 16000, // 3.92 - 'phone|16000' => 16000, - 'phone|11025' => 11025, // 3.94a15 - 'radio|32000' => 32000, // 3.94a15 - 'fm/radio|32000' => 32000, // 3.92 - 'fm|32000' => 32000, // 3.90 - 'voice|32000' => 32000); - if (!isset($ExpectedResampledRate[$ExplodedOptions[1].'|'.$thisfile_mpeg_audio['sample_rate']])) { - $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; - } - break; - } - break; - - case '--r3mix': - default: - $encoder_options .= ' --resample '.$thisfile_mpeg_audio['sample_rate']; - break; - } - break; - } - } - } - if (empty($encoder_options) && !empty($info['audio']['bitrate']) && !empty($info['audio']['bitrate_mode'])) { - //$encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000); - $encoder_options = strtoupper($info['audio']['bitrate_mode']); - } - - return $encoder_options; - } - - - public function decodeMPEGaudioHeader($offset, &$info, $recursivesearch=true, $ScanAsCBR=false, $FastMPEGheaderScan=false) { - static $MPEGaudioVersionLookup; - static $MPEGaudioLayerLookup; - static $MPEGaudioBitrateLookup; - static $MPEGaudioFrequencyLookup; - static $MPEGaudioChannelModeLookup; - static $MPEGaudioModeExtensionLookup; - static $MPEGaudioEmphasisLookup; - if (empty($MPEGaudioVersionLookup)) { - $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); - $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); - $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); - $MPEGaudioFrequencyLookup = self::MPEGaudioFrequencyArray(); - $MPEGaudioChannelModeLookup = self::MPEGaudioChannelModeArray(); - $MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray(); - $MPEGaudioEmphasisLookup = self::MPEGaudioEmphasisArray(); - } - - if ($this->fseek($offset) != 0) { - $info['error'][] = 'decodeMPEGaudioHeader() failed to seek to next offset at '.$offset; - return false; - } - //$headerstring = $this->fread(1441); // worst-case max length = 32kHz @ 320kbps layer 3 = 1441 bytes/frame - $headerstring = $this->fread(226); // LAME header at offset 36 + 190 bytes of Xing/LAME data - - // MP3 audio frame structure: - // $aa $aa $aa $aa [$bb $bb] $cc... - // where $aa..$aa is the four-byte mpeg-audio header (below) - // $bb $bb is the optional 2-byte CRC - // and $cc... is the audio data - - $head4 = substr($headerstring, 0, 4); - - static $MPEGaudioHeaderDecodeCache = array(); - if (isset($MPEGaudioHeaderDecodeCache[$head4])) { - $MPEGheaderRawArray = $MPEGaudioHeaderDecodeCache[$head4]; - } else { - $MPEGheaderRawArray = self::MPEGaudioHeaderDecode($head4); - $MPEGaudioHeaderDecodeCache[$head4] = $MPEGheaderRawArray; - } - - static $MPEGaudioHeaderValidCache = array(); - if (!isset($MPEGaudioHeaderValidCache[$head4])) { // Not in cache - //$MPEGaudioHeaderValidCache[$head4] = self::MPEGaudioHeaderValid($MPEGheaderRawArray, false, true); // allow badly-formatted freeformat (from LAME 3.90 - 3.93.1) - $MPEGaudioHeaderValidCache[$head4] = self::MPEGaudioHeaderValid($MPEGheaderRawArray, false, false); - } - - // shortcut - if (!isset($info['mpeg']['audio'])) { - $info['mpeg']['audio'] = array(); - } - $thisfile_mpeg_audio = &$info['mpeg']['audio']; - - - if ($MPEGaudioHeaderValidCache[$head4]) { - $thisfile_mpeg_audio['raw'] = $MPEGheaderRawArray; - } else { - $info['error'][] = 'Invalid MPEG audio header ('.getid3_lib::PrintHexBytes($head4).') at offset '.$offset; - return false; - } - - if (!$FastMPEGheaderScan) { - $thisfile_mpeg_audio['version'] = $MPEGaudioVersionLookup[$thisfile_mpeg_audio['raw']['version']]; - $thisfile_mpeg_audio['layer'] = $MPEGaudioLayerLookup[$thisfile_mpeg_audio['raw']['layer']]; - - $thisfile_mpeg_audio['channelmode'] = $MPEGaudioChannelModeLookup[$thisfile_mpeg_audio['raw']['channelmode']]; - $thisfile_mpeg_audio['channels'] = (($thisfile_mpeg_audio['channelmode'] == 'mono') ? 1 : 2); - $thisfile_mpeg_audio['sample_rate'] = $MPEGaudioFrequencyLookup[$thisfile_mpeg_audio['version']][$thisfile_mpeg_audio['raw']['sample_rate']]; - $thisfile_mpeg_audio['protection'] = !$thisfile_mpeg_audio['raw']['protection']; - $thisfile_mpeg_audio['private'] = (bool) $thisfile_mpeg_audio['raw']['private']; - $thisfile_mpeg_audio['modeextension'] = $MPEGaudioModeExtensionLookup[$thisfile_mpeg_audio['layer']][$thisfile_mpeg_audio['raw']['modeextension']]; - $thisfile_mpeg_audio['copyright'] = (bool) $thisfile_mpeg_audio['raw']['copyright']; - $thisfile_mpeg_audio['original'] = (bool) $thisfile_mpeg_audio['raw']['original']; - $thisfile_mpeg_audio['emphasis'] = $MPEGaudioEmphasisLookup[$thisfile_mpeg_audio['raw']['emphasis']]; - - $info['audio']['channels'] = $thisfile_mpeg_audio['channels']; - $info['audio']['sample_rate'] = $thisfile_mpeg_audio['sample_rate']; - - if ($thisfile_mpeg_audio['protection']) { - $thisfile_mpeg_audio['crc'] = getid3_lib::BigEndian2Int(substr($headerstring, 4, 2)); - } - } - - if ($thisfile_mpeg_audio['raw']['bitrate'] == 15) { - // http://www.hydrogenaudio.org/?act=ST&f=16&t=9682&st=0 - $info['warning'][] = 'Invalid bitrate index (15), this is a known bug in free-format MP3s encoded by LAME v3.90 - 3.93.1'; - $thisfile_mpeg_audio['raw']['bitrate'] = 0; - } - $thisfile_mpeg_audio['padding'] = (bool) $thisfile_mpeg_audio['raw']['padding']; - $thisfile_mpeg_audio['bitrate'] = $MPEGaudioBitrateLookup[$thisfile_mpeg_audio['version']][$thisfile_mpeg_audio['layer']][$thisfile_mpeg_audio['raw']['bitrate']]; - - if (($thisfile_mpeg_audio['bitrate'] == 'free') && ($offset == $info['avdataoffset'])) { - // only skip multiple frame check if free-format bitstream found at beginning of file - // otherwise is quite possibly simply corrupted data - $recursivesearch = false; - } - - // For Layer 2 there are some combinations of bitrate and mode which are not allowed. - if (!$FastMPEGheaderScan && ($thisfile_mpeg_audio['layer'] == '2')) { - - $info['audio']['dataformat'] = 'mp2'; - switch ($thisfile_mpeg_audio['channelmode']) { - - case 'mono': - if (($thisfile_mpeg_audio['bitrate'] == 'free') || ($thisfile_mpeg_audio['bitrate'] <= 192000)) { - // these are ok - } else { - $info['error'][] = $thisfile_mpeg_audio['bitrate'].'kbps not allowed in Layer 2, '.$thisfile_mpeg_audio['channelmode'].'.'; - return false; - } - break; - - case 'stereo': - case 'joint stereo': - case 'dual channel': - if (($thisfile_mpeg_audio['bitrate'] == 'free') || ($thisfile_mpeg_audio['bitrate'] == 64000) || ($thisfile_mpeg_audio['bitrate'] >= 96000)) { - // these are ok - } else { - $info['error'][] = intval(round($thisfile_mpeg_audio['bitrate'] / 1000)).'kbps not allowed in Layer 2, '.$thisfile_mpeg_audio['channelmode'].'.'; - return false; - } - break; - - } - - } - - - if ($info['audio']['sample_rate'] > 0) { - $thisfile_mpeg_audio['framelength'] = self::MPEGaudioFrameLength($thisfile_mpeg_audio['bitrate'], $thisfile_mpeg_audio['version'], $thisfile_mpeg_audio['layer'], (int) $thisfile_mpeg_audio['padding'], $info['audio']['sample_rate']); - } - - $nextframetestoffset = $offset + 1; - if ($thisfile_mpeg_audio['bitrate'] != 'free') { - - $info['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate']; - - if (isset($thisfile_mpeg_audio['framelength'])) { - $nextframetestoffset = $offset + $thisfile_mpeg_audio['framelength']; - } else { - $info['error'][] = 'Frame at offset('.$offset.') is has an invalid frame length.'; - return false; - } - - } - - $ExpectedNumberOfAudioBytes = 0; - - //////////////////////////////////////////////////////////////////////////////////// - // Variable-bitrate headers - - if (substr($headerstring, 4 + 32, 4) == 'VBRI') { - // Fraunhofer VBR header is hardcoded 'VBRI' at offset 0x24 (36) - // specs taken from http://minnie.tuhs.org/pipermail/mp3encoder/2001-January/001800.html - - $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; - $thisfile_mpeg_audio['VBR_method'] = 'Fraunhofer'; - $info['audio']['codec'] = 'Fraunhofer'; - - $SideInfoData = substr($headerstring, 4 + 2, 32); - - $FraunhoferVBROffset = 36; - - $thisfile_mpeg_audio['VBR_encoder_version'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 4, 2)); // VbriVersion - $thisfile_mpeg_audio['VBR_encoder_delay'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 6, 2)); // VbriDelay - $thisfile_mpeg_audio['VBR_quality'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 8, 2)); // VbriQuality - $thisfile_mpeg_audio['VBR_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 10, 4)); // VbriStreamBytes - $thisfile_mpeg_audio['VBR_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 14, 4)); // VbriStreamFrames - $thisfile_mpeg_audio['VBR_seek_offsets'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 18, 2)); // VbriTableSize - $thisfile_mpeg_audio['VBR_seek_scale'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 20, 2)); // VbriTableScale - $thisfile_mpeg_audio['VBR_entry_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 22, 2)); // VbriEntryBytes - $thisfile_mpeg_audio['VBR_entry_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset + 24, 2)); // VbriEntryFrames - - $ExpectedNumberOfAudioBytes = $thisfile_mpeg_audio['VBR_bytes']; - - $previousbyteoffset = $offset; - for ($i = 0; $i < $thisfile_mpeg_audio['VBR_seek_offsets']; $i++) { - $Fraunhofer_OffsetN = getid3_lib::BigEndian2Int(substr($headerstring, $FraunhoferVBROffset, $thisfile_mpeg_audio['VBR_entry_bytes'])); - $FraunhoferVBROffset += $thisfile_mpeg_audio['VBR_entry_bytes']; - $thisfile_mpeg_audio['VBR_offsets_relative'][$i] = ($Fraunhofer_OffsetN * $thisfile_mpeg_audio['VBR_seek_scale']); - $thisfile_mpeg_audio['VBR_offsets_absolute'][$i] = ($Fraunhofer_OffsetN * $thisfile_mpeg_audio['VBR_seek_scale']) + $previousbyteoffset; - $previousbyteoffset += $Fraunhofer_OffsetN; - } - - - } else { - - // Xing VBR header is hardcoded 'Xing' at a offset 0x0D (13), 0x15 (21) or 0x24 (36) - // depending on MPEG layer and number of channels - - $VBRidOffset = self::XingVBRidOffset($thisfile_mpeg_audio['version'], $thisfile_mpeg_audio['channelmode']); - $SideInfoData = substr($headerstring, 4 + 2, $VBRidOffset - 4); - - if ((substr($headerstring, $VBRidOffset, strlen('Xing')) == 'Xing') || (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Info')) { - // 'Xing' is traditional Xing VBR frame - // 'Info' is LAME-encoded CBR (This was done to avoid CBR files to be recognized as traditional Xing VBR files by some decoders.) - // 'Info' *can* legally be used to specify a VBR file as well, however. - - // http://www.multiweb.cz/twoinches/MP3inside.htm - //00..03 = "Xing" or "Info" - //04..07 = Flags: - // 0x01 Frames Flag set if value for number of frames in file is stored - // 0x02 Bytes Flag set if value for filesize in bytes is stored - // 0x04 TOC Flag set if values for TOC are stored - // 0x08 VBR Scale Flag set if values for VBR scale is stored - //08..11 Frames: Number of frames in file (including the first Xing/Info one) - //12..15 Bytes: File length in Bytes - //16..115 TOC (Table of Contents): - // Contains of 100 indexes (one Byte length) for easier lookup in file. Approximately solves problem with moving inside file. - // Each Byte has a value according this formula: - // (TOC[i] / 256) * fileLenInBytes - // So if song lasts eg. 240 sec. and you want to jump to 60. sec. (and file is 5 000 000 Bytes length) you can use: - // TOC[(60/240)*100] = TOC[25] - // and corresponding Byte in file is then approximately at: - // (TOC[25]/256) * 5000000 - //116..119 VBR Scale - - - // should be safe to leave this at 'vbr' and let it be overriden to 'cbr' if a CBR preset/mode is used by LAME -// if (substr($headerstring, $VBRidOffset, strlen('Info')) == 'Xing') { - $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; - $thisfile_mpeg_audio['VBR_method'] = 'Xing'; -// } else { -// $ScanAsCBR = true; -// $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; -// } - - $thisfile_mpeg_audio['xing_flags_raw'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 4, 4)); - - $thisfile_mpeg_audio['xing_flags']['frames'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000001); - $thisfile_mpeg_audio['xing_flags']['bytes'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000002); - $thisfile_mpeg_audio['xing_flags']['toc'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000004); - $thisfile_mpeg_audio['xing_flags']['vbr_scale'] = (bool) ($thisfile_mpeg_audio['xing_flags_raw'] & 0x00000008); - - if ($thisfile_mpeg_audio['xing_flags']['frames']) { - $thisfile_mpeg_audio['VBR_frames'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 8, 4)); - //$thisfile_mpeg_audio['VBR_frames']--; // don't count header Xing/Info frame - } - if ($thisfile_mpeg_audio['xing_flags']['bytes']) { - $thisfile_mpeg_audio['VBR_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 12, 4)); - } - - //if (($thisfile_mpeg_audio['bitrate'] == 'free') && !empty($thisfile_mpeg_audio['VBR_frames']) && !empty($thisfile_mpeg_audio['VBR_bytes'])) { - if (!empty($thisfile_mpeg_audio['VBR_frames']) && !empty($thisfile_mpeg_audio['VBR_bytes'])) { - - $framelengthfloat = $thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']; - - if ($thisfile_mpeg_audio['layer'] == '1') { - // BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12 - //$info['audio']['bitrate'] = ((($framelengthfloat / 4) - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 12; - $info['audio']['bitrate'] = ($framelengthfloat / 4) * $thisfile_mpeg_audio['sample_rate'] * (2 / $info['audio']['channels']) / 12; - } else { - // Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144 - //$info['audio']['bitrate'] = (($framelengthfloat - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 144; - $info['audio']['bitrate'] = $framelengthfloat * $thisfile_mpeg_audio['sample_rate'] * (2 / $info['audio']['channels']) / 144; - } - $thisfile_mpeg_audio['framelength'] = floor($framelengthfloat); - } - - if ($thisfile_mpeg_audio['xing_flags']['toc']) { - $LAMEtocData = substr($headerstring, $VBRidOffset + 16, 100); - for ($i = 0; $i < 100; $i++) { - $thisfile_mpeg_audio['toc'][$i] = ord($LAMEtocData{$i}); - } - } - if ($thisfile_mpeg_audio['xing_flags']['vbr_scale']) { - $thisfile_mpeg_audio['VBR_scale'] = getid3_lib::BigEndian2Int(substr($headerstring, $VBRidOffset + 116, 4)); - } - - - // http://gabriel.mp3-tech.org/mp3infotag.html - if (substr($headerstring, $VBRidOffset + 120, 4) == 'LAME') { - - // shortcut - $thisfile_mpeg_audio['LAME'] = array(); - $thisfile_mpeg_audio_lame = &$thisfile_mpeg_audio['LAME']; - - - $thisfile_mpeg_audio_lame['long_version'] = substr($headerstring, $VBRidOffset + 120, 20); - $thisfile_mpeg_audio_lame['short_version'] = substr($thisfile_mpeg_audio_lame['long_version'], 0, 9); - - if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.90') { - - // extra 11 chars are not part of version string when LAMEtag present - unset($thisfile_mpeg_audio_lame['long_version']); - - // It the LAME tag was only introduced in LAME v3.90 - // http://www.hydrogenaudio.org/?act=ST&f=15&t=9933 - - // Offsets of various bytes in http://gabriel.mp3-tech.org/mp3infotag.html - // are assuming a 'Xing' identifier offset of 0x24, which is the case for - // MPEG-1 non-mono, but not for other combinations - $LAMEtagOffsetContant = $VBRidOffset - 0x24; - - // shortcuts - $thisfile_mpeg_audio_lame['RGAD'] = array('track'=>array(), 'album'=>array()); - $thisfile_mpeg_audio_lame_RGAD = &$thisfile_mpeg_audio_lame['RGAD']; - $thisfile_mpeg_audio_lame_RGAD_track = &$thisfile_mpeg_audio_lame_RGAD['track']; - $thisfile_mpeg_audio_lame_RGAD_album = &$thisfile_mpeg_audio_lame_RGAD['album']; - $thisfile_mpeg_audio_lame['raw'] = array(); - $thisfile_mpeg_audio_lame_raw = &$thisfile_mpeg_audio_lame['raw']; - - // byte $9B VBR Quality - // This field is there to indicate a quality level, although the scale was not precised in the original Xing specifications. - // Actually overwrites original Xing bytes - unset($thisfile_mpeg_audio['VBR_scale']); - $thisfile_mpeg_audio_lame['vbr_quality'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0x9B, 1)); - - // bytes $9C-$A4 Encoder short VersionString - $thisfile_mpeg_audio_lame['short_version'] = substr($headerstring, $LAMEtagOffsetContant + 0x9C, 9); - - // byte $A5 Info Tag revision + VBR method - $LAMEtagRevisionVBRmethod = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA5, 1)); - - $thisfile_mpeg_audio_lame['tag_revision'] = ($LAMEtagRevisionVBRmethod & 0xF0) >> 4; - $thisfile_mpeg_audio_lame_raw['vbr_method'] = $LAMEtagRevisionVBRmethod & 0x0F; - $thisfile_mpeg_audio_lame['vbr_method'] = self::LAMEvbrMethodLookup($thisfile_mpeg_audio_lame_raw['vbr_method']); - $thisfile_mpeg_audio['bitrate_mode'] = substr($thisfile_mpeg_audio_lame['vbr_method'], 0, 3); // usually either 'cbr' or 'vbr', but truncates 'vbr-old / vbr-rh' to 'vbr' - - // byte $A6 Lowpass filter value - $thisfile_mpeg_audio_lame['lowpass_frequency'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA6, 1)) * 100; - - // bytes $A7-$AE Replay Gain - // http://privatewww.essex.ac.uk/~djmrob/replaygain/rg_data_format.html - // bytes $A7-$AA : 32 bit floating point "Peak signal amplitude" - if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.94b') { - // LAME 3.94a16 and later - 9.23 fixed point - // ie 0x0059E2EE / (2^23) = 5890798 / 8388608 = 0.7022378444671630859375 - $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = (float) ((getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4))) / 8388608); - } else { - // LAME 3.94a15 and earlier - 32-bit floating point - // Actually 3.94a16 will fall in here too and be WRONG, but is hard to detect 3.94a16 vs 3.94a15 - $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = getid3_lib::LittleEndian2Float(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4)); - } - if ($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] == 0) { - unset($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']); - } else { - $thisfile_mpeg_audio_lame_RGAD['peak_db'] = getid3_lib::RGADamplitude2dB($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']); - } - - $thisfile_mpeg_audio_lame_raw['RGAD_track'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAB, 2)); - $thisfile_mpeg_audio_lame_raw['RGAD_album'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAD, 2)); - - - if ($thisfile_mpeg_audio_lame_raw['RGAD_track'] != 0) { - - $thisfile_mpeg_audio_lame_RGAD_track['raw']['name'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0xE000) >> 13; - $thisfile_mpeg_audio_lame_RGAD_track['raw']['originator'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x1C00) >> 10; - $thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit'] = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x0200) >> 9; - $thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'] = $thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x01FF; - $thisfile_mpeg_audio_lame_RGAD_track['name'] = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['name']); - $thisfile_mpeg_audio_lame_RGAD_track['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['originator']); - $thisfile_mpeg_audio_lame_RGAD_track['gain_db'] = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit']); - - if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) { - $info['replay_gain']['track']['peak'] = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude']; - } - $info['replay_gain']['track']['originator'] = $thisfile_mpeg_audio_lame_RGAD_track['originator']; - $info['replay_gain']['track']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_track['gain_db']; - } else { - unset($thisfile_mpeg_audio_lame_RGAD['track']); - } - if ($thisfile_mpeg_audio_lame_raw['RGAD_album'] != 0) { - - $thisfile_mpeg_audio_lame_RGAD_album['raw']['name'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0xE000) >> 13; - $thisfile_mpeg_audio_lame_RGAD_album['raw']['originator'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x1C00) >> 10; - $thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit'] = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x0200) >> 9; - $thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'] = $thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x01FF; - $thisfile_mpeg_audio_lame_RGAD_album['name'] = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['name']); - $thisfile_mpeg_audio_lame_RGAD_album['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['originator']); - $thisfile_mpeg_audio_lame_RGAD_album['gain_db'] = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit']); - - if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) { - $info['replay_gain']['album']['peak'] = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude']; - } - $info['replay_gain']['album']['originator'] = $thisfile_mpeg_audio_lame_RGAD_album['originator']; - $info['replay_gain']['album']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_album['gain_db']; - } else { - unset($thisfile_mpeg_audio_lame_RGAD['album']); - } - if (empty($thisfile_mpeg_audio_lame_RGAD)) { - unset($thisfile_mpeg_audio_lame['RGAD']); - } - - - // byte $AF Encoding flags + ATH Type - $EncodingFlagsATHtype = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAF, 1)); - $thisfile_mpeg_audio_lame['encoding_flags']['nspsytune'] = (bool) ($EncodingFlagsATHtype & 0x10); - $thisfile_mpeg_audio_lame['encoding_flags']['nssafejoint'] = (bool) ($EncodingFlagsATHtype & 0x20); - $thisfile_mpeg_audio_lame['encoding_flags']['nogap_next'] = (bool) ($EncodingFlagsATHtype & 0x40); - $thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev'] = (bool) ($EncodingFlagsATHtype & 0x80); - $thisfile_mpeg_audio_lame['ath_type'] = $EncodingFlagsATHtype & 0x0F; - - // byte $B0 if ABR {specified bitrate} else {minimal bitrate} - $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB0, 1)); - if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 2) { // Average BitRate (ABR) - $thisfile_mpeg_audio_lame['bitrate_abr'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']; - } elseif ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) { // Constant BitRate (CBR) - // ignore - } elseif ($thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] > 0) { // Variable BitRate (VBR) - minimum bitrate - $thisfile_mpeg_audio_lame['bitrate_min'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate']; - } - - // bytes $B1-$B3 Encoder delays - $EncoderDelays = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB1, 3)); - $thisfile_mpeg_audio_lame['encoder_delay'] = ($EncoderDelays & 0xFFF000) >> 12; - $thisfile_mpeg_audio_lame['end_padding'] = $EncoderDelays & 0x000FFF; - - // byte $B4 Misc - $MiscByte = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB4, 1)); - $thisfile_mpeg_audio_lame_raw['noise_shaping'] = ($MiscByte & 0x03); - $thisfile_mpeg_audio_lame_raw['stereo_mode'] = ($MiscByte & 0x1C) >> 2; - $thisfile_mpeg_audio_lame_raw['not_optimal_quality'] = ($MiscByte & 0x20) >> 5; - $thisfile_mpeg_audio_lame_raw['source_sample_freq'] = ($MiscByte & 0xC0) >> 6; - $thisfile_mpeg_audio_lame['noise_shaping'] = $thisfile_mpeg_audio_lame_raw['noise_shaping']; - $thisfile_mpeg_audio_lame['stereo_mode'] = self::LAMEmiscStereoModeLookup($thisfile_mpeg_audio_lame_raw['stereo_mode']); - $thisfile_mpeg_audio_lame['not_optimal_quality'] = (bool) $thisfile_mpeg_audio_lame_raw['not_optimal_quality']; - $thisfile_mpeg_audio_lame['source_sample_freq'] = self::LAMEmiscSourceSampleFrequencyLookup($thisfile_mpeg_audio_lame_raw['source_sample_freq']); - - // byte $B5 MP3 Gain - $thisfile_mpeg_audio_lame_raw['mp3_gain'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB5, 1), false, true); - $thisfile_mpeg_audio_lame['mp3_gain_db'] = (getid3_lib::RGADamplitude2dB(2) / 4) * $thisfile_mpeg_audio_lame_raw['mp3_gain']; - $thisfile_mpeg_audio_lame['mp3_gain_factor'] = pow(2, ($thisfile_mpeg_audio_lame['mp3_gain_db'] / 6)); - - // bytes $B6-$B7 Preset and surround info - $PresetSurroundBytes = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB6, 2)); - // Reserved = ($PresetSurroundBytes & 0xC000); - $thisfile_mpeg_audio_lame_raw['surround_info'] = ($PresetSurroundBytes & 0x3800); - $thisfile_mpeg_audio_lame['surround_info'] = self::LAMEsurroundInfoLookup($thisfile_mpeg_audio_lame_raw['surround_info']); - $thisfile_mpeg_audio_lame['preset_used_id'] = ($PresetSurroundBytes & 0x07FF); - $thisfile_mpeg_audio_lame['preset_used'] = self::LAMEpresetUsedLookup($thisfile_mpeg_audio_lame); - if (!empty($thisfile_mpeg_audio_lame['preset_used_id']) && empty($thisfile_mpeg_audio_lame['preset_used'])) { - $info['warning'][] = 'Unknown LAME preset used ('.$thisfile_mpeg_audio_lame['preset_used_id'].') - please report to info@getid3.org'; - } - if (($thisfile_mpeg_audio_lame['short_version'] == 'LAME3.90.') && !empty($thisfile_mpeg_audio_lame['preset_used_id'])) { - // this may change if 3.90.4 ever comes out - $thisfile_mpeg_audio_lame['short_version'] = 'LAME3.90.3'; - } - - // bytes $B8-$BB MusicLength - $thisfile_mpeg_audio_lame['audio_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB8, 4)); - $ExpectedNumberOfAudioBytes = (($thisfile_mpeg_audio_lame['audio_bytes'] > 0) ? $thisfile_mpeg_audio_lame['audio_bytes'] : $thisfile_mpeg_audio['VBR_bytes']); - - // bytes $BC-$BD MusicCRC - $thisfile_mpeg_audio_lame['music_crc'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBC, 2)); - - // bytes $BE-$BF CRC-16 of Info Tag - $thisfile_mpeg_audio_lame['lame_tag_crc'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBE, 2)); - - - // LAME CBR - if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) { - - $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; - $thisfile_mpeg_audio['bitrate'] = self::ClosestStandardMP3Bitrate($thisfile_mpeg_audio['bitrate']); - $info['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate']; - //if (empty($thisfile_mpeg_audio['bitrate']) || (!empty($thisfile_mpeg_audio_lame['bitrate_min']) && ($thisfile_mpeg_audio_lame['bitrate_min'] != 255))) { - // $thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio_lame['bitrate_min']; - //} - - } - - } - } - - } else { - - // not Fraunhofer or Xing VBR methods, most likely CBR (but could be VBR with no header) - $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; - if ($recursivesearch) { - $thisfile_mpeg_audio['bitrate_mode'] = 'vbr'; - if ($this->RecursiveFrameScanning($offset, $nextframetestoffset, true)) { - $recursivesearch = false; - $thisfile_mpeg_audio['bitrate_mode'] = 'cbr'; - } - if ($thisfile_mpeg_audio['bitrate_mode'] == 'vbr') { - $info['warning'][] = 'VBR file with no VBR header. Bitrate values calculated from actual frame bitrates.'; - } - } - - } - - } - - if (($ExpectedNumberOfAudioBytes > 0) && ($ExpectedNumberOfAudioBytes != ($info['avdataend'] - $info['avdataoffset']))) { - if ($ExpectedNumberOfAudioBytes > ($info['avdataend'] - $info['avdataoffset'])) { - if ($this->isDependencyFor('matroska') || $this->isDependencyFor('riff')) { - // ignore, audio data is broken into chunks so will always be data "missing" - } - elseif (($ExpectedNumberOfAudioBytes - ($info['avdataend'] - $info['avdataoffset'])) == 1) { - $this->warning('Last byte of data truncated (this is a known bug in Meracl ID3 Tag Writer before v1.3.5)'); - } - else { - $this->warning('Probable truncated file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, only found '.($info['avdataend'] - $info['avdataoffset']).' (short by '.($ExpectedNumberOfAudioBytes - ($info['avdataend'] - $info['avdataoffset'])).' bytes)'); - } - } else { - if ((($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes) == 1) { - // $prenullbytefileoffset = $this->ftell(); - // $this->fseek($info['avdataend']); - // $PossibleNullByte = $this->fread(1); - // $this->fseek($prenullbytefileoffset); - // if ($PossibleNullByte === "\x00") { - $info['avdataend']--; - // $info['warning'][] = 'Extra null byte at end of MP3 data assumed to be RIFF padding and therefore ignored'; - // } else { - // $info['warning'][] = 'Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($info['avdataend'] - $info['avdataoffset']).' ('.(($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)'; - // } - } else { - $info['warning'][] = 'Too much data in file: expecting '.$ExpectedNumberOfAudioBytes.' bytes of audio data, found '.($info['avdataend'] - $info['avdataoffset']).' ('.(($info['avdataend'] - $info['avdataoffset']) - $ExpectedNumberOfAudioBytes).' bytes too many)'; - } - } - } - - if (($thisfile_mpeg_audio['bitrate'] == 'free') && empty($info['audio']['bitrate'])) { - if (($offset == $info['avdataoffset']) && empty($thisfile_mpeg_audio['VBR_frames'])) { - $framebytelength = $this->FreeFormatFrameLength($offset, true); - if ($framebytelength > 0) { - $thisfile_mpeg_audio['framelength'] = $framebytelength; - if ($thisfile_mpeg_audio['layer'] == '1') { - // BitRate = (((FrameLengthInBytes / 4) - Padding) * SampleRate) / 12 - $info['audio']['bitrate'] = ((($framebytelength / 4) - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 12; - } else { - // Bitrate = ((FrameLengthInBytes - Padding) * SampleRate) / 144 - $info['audio']['bitrate'] = (($framebytelength - intval($thisfile_mpeg_audio['padding'])) * $thisfile_mpeg_audio['sample_rate']) / 144; - } - } else { - $info['error'][] = 'Error calculating frame length of free-format MP3 without Xing/LAME header'; - } - } - } - - if (isset($thisfile_mpeg_audio['VBR_frames']) ? $thisfile_mpeg_audio['VBR_frames'] : '') { - switch ($thisfile_mpeg_audio['bitrate_mode']) { - case 'vbr': - case 'abr': - $bytes_per_frame = 1152; - if (($thisfile_mpeg_audio['version'] == '1') && ($thisfile_mpeg_audio['layer'] == 1)) { - $bytes_per_frame = 384; - } elseif ((($thisfile_mpeg_audio['version'] == '2') || ($thisfile_mpeg_audio['version'] == '2.5')) && ($thisfile_mpeg_audio['layer'] == 3)) { - $bytes_per_frame = 576; - } - $thisfile_mpeg_audio['VBR_bitrate'] = (isset($thisfile_mpeg_audio['VBR_bytes']) ? (($thisfile_mpeg_audio['VBR_bytes'] / $thisfile_mpeg_audio['VBR_frames']) * 8) * ($info['audio']['sample_rate'] / $bytes_per_frame) : 0); - if ($thisfile_mpeg_audio['VBR_bitrate'] > 0) { - $info['audio']['bitrate'] = $thisfile_mpeg_audio['VBR_bitrate']; - $thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio['VBR_bitrate']; // to avoid confusion - } - break; - } - } - - // End variable-bitrate headers - //////////////////////////////////////////////////////////////////////////////////// - - if ($recursivesearch) { - - if (!$this->RecursiveFrameScanning($offset, $nextframetestoffset, $ScanAsCBR)) { - return false; - } - - } - - - //if (false) { - // // experimental side info parsing section - not returning anything useful yet - // - // $SideInfoBitstream = getid3_lib::BigEndian2Bin($SideInfoData); - // $SideInfoOffset = 0; - // - // if ($thisfile_mpeg_audio['version'] == '1') { - // if ($thisfile_mpeg_audio['channelmode'] == 'mono') { - // // MPEG-1 (mono) - // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9); - // $SideInfoOffset += 9; - // $SideInfoOffset += 5; - // } else { - // // MPEG-1 (stereo, joint-stereo, dual-channel) - // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 9); - // $SideInfoOffset += 9; - // $SideInfoOffset += 3; - // } - // } else { // 2 or 2.5 - // if ($thisfile_mpeg_audio['channelmode'] == 'mono') { - // // MPEG-2, MPEG-2.5 (mono) - // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8); - // $SideInfoOffset += 8; - // $SideInfoOffset += 1; - // } else { - // // MPEG-2, MPEG-2.5 (stereo, joint-stereo, dual-channel) - // $thisfile_mpeg_audio['side_info']['main_data_begin'] = substr($SideInfoBitstream, $SideInfoOffset, 8); - // $SideInfoOffset += 8; - // $SideInfoOffset += 2; - // } - // } - // - // if ($thisfile_mpeg_audio['version'] == '1') { - // for ($channel = 0; $channel < $info['audio']['channels']; $channel++) { - // for ($scfsi_band = 0; $scfsi_band < 4; $scfsi_band++) { - // $thisfile_mpeg_audio['scfsi'][$channel][$scfsi_band] = substr($SideInfoBitstream, $SideInfoOffset, 1); - // $SideInfoOffset += 2; - // } - // } - // } - // for ($granule = 0; $granule < (($thisfile_mpeg_audio['version'] == '1') ? 2 : 1); $granule++) { - // for ($channel = 0; $channel < $info['audio']['channels']; $channel++) { - // $thisfile_mpeg_audio['part2_3_length'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 12); - // $SideInfoOffset += 12; - // $thisfile_mpeg_audio['big_values'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9); - // $SideInfoOffset += 9; - // $thisfile_mpeg_audio['global_gain'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 8); - // $SideInfoOffset += 8; - // if ($thisfile_mpeg_audio['version'] == '1') { - // $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4); - // $SideInfoOffset += 4; - // } else { - // $thisfile_mpeg_audio['scalefac_compress'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 9); - // $SideInfoOffset += 9; - // } - // $thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); - // $SideInfoOffset += 1; - // - // if ($thisfile_mpeg_audio['window_switching_flag'][$granule][$channel] == '1') { - // - // $thisfile_mpeg_audio['block_type'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 2); - // $SideInfoOffset += 2; - // $thisfile_mpeg_audio['mixed_block_flag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); - // $SideInfoOffset += 1; - // - // for ($region = 0; $region < 2; $region++) { - // $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5); - // $SideInfoOffset += 5; - // } - // $thisfile_mpeg_audio['table_select'][$granule][$channel][2] = 0; - // - // for ($window = 0; $window < 3; $window++) { - // $thisfile_mpeg_audio['subblock_gain'][$granule][$channel][$window] = substr($SideInfoBitstream, $SideInfoOffset, 3); - // $SideInfoOffset += 3; - // } - // - // } else { - // - // for ($region = 0; $region < 3; $region++) { - // $thisfile_mpeg_audio['table_select'][$granule][$channel][$region] = substr($SideInfoBitstream, $SideInfoOffset, 5); - // $SideInfoOffset += 5; - // } - // - // $thisfile_mpeg_audio['region0_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 4); - // $SideInfoOffset += 4; - // $thisfile_mpeg_audio['region1_count'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 3); - // $SideInfoOffset += 3; - // $thisfile_mpeg_audio['block_type'][$granule][$channel] = 0; - // } - // - // if ($thisfile_mpeg_audio['version'] == '1') { - // $thisfile_mpeg_audio['preflag'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); - // $SideInfoOffset += 1; - // } - // $thisfile_mpeg_audio['scalefac_scale'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); - // $SideInfoOffset += 1; - // $thisfile_mpeg_audio['count1table_select'][$granule][$channel] = substr($SideInfoBitstream, $SideInfoOffset, 1); - // $SideInfoOffset += 1; - // } - // } - //} - - return true; - } - - public function RecursiveFrameScanning(&$offset, &$nextframetestoffset, $ScanAsCBR) { - $info = &$this->getid3->info; - $firstframetestarray = array('error'=>'', 'warning'=>'', 'avdataend'=>$info['avdataend'], 'avdataoffset'=>$info['avdataoffset']); - $this->decodeMPEGaudioHeader($offset, $firstframetestarray, false); - - for ($i = 0; $i < GETID3_MP3_VALID_CHECK_FRAMES; $i++) { - // check next GETID3_MP3_VALID_CHECK_FRAMES frames for validity, to make sure we haven't run across a false synch - if (($nextframetestoffset + 4) >= $info['avdataend']) { - // end of file - return true; - } - - $nextframetestarray = array('error'=>'', 'warning'=>'', 'avdataend'=>$info['avdataend'], 'avdataoffset'=>$info['avdataoffset']); - if ($this->decodeMPEGaudioHeader($nextframetestoffset, $nextframetestarray, false)) { - if ($ScanAsCBR) { - // force CBR mode, used for trying to pick out invalid audio streams with valid(?) VBR headers, or VBR streams with no VBR header - if (!isset($nextframetestarray['mpeg']['audio']['bitrate']) || !isset($firstframetestarray['mpeg']['audio']['bitrate']) || ($nextframetestarray['mpeg']['audio']['bitrate'] != $firstframetestarray['mpeg']['audio']['bitrate'])) { - return false; - } - } - - - // next frame is OK, get ready to check the one after that - if (isset($nextframetestarray['mpeg']['audio']['framelength']) && ($nextframetestarray['mpeg']['audio']['framelength'] > 0)) { - $nextframetestoffset += $nextframetestarray['mpeg']['audio']['framelength']; - } else { - $info['error'][] = 'Frame at offset ('.$offset.') is has an invalid frame length.'; - return false; - } - - } elseif (!empty($firstframetestarray['mpeg']['audio']['framelength']) && (($nextframetestoffset + $firstframetestarray['mpeg']['audio']['framelength']) > $info['avdataend'])) { - - // it's not the end of the file, but there's not enough data left for another frame, so assume it's garbage/padding and return OK - return true; - - } else { - - // next frame is not valid, note the error and fail, so scanning can contiue for a valid frame sequence - $info['warning'][] = 'Frame at offset ('.$offset.') is valid, but the next one at ('.$nextframetestoffset.') is not.'; - - return false; - } - } - return true; - } - - public function FreeFormatFrameLength($offset, $deepscan=false) { - $info = &$this->getid3->info; - - $this->fseek($offset); - $MPEGaudioData = $this->fread(32768); - - $SyncPattern1 = substr($MPEGaudioData, 0, 4); - // may be different pattern due to padding - $SyncPattern2 = $SyncPattern1{0}.$SyncPattern1{1}.chr(ord($SyncPattern1{2}) | 0x02).$SyncPattern1{3}; - if ($SyncPattern2 === $SyncPattern1) { - $SyncPattern2 = $SyncPattern1{0}.$SyncPattern1{1}.chr(ord($SyncPattern1{2}) & 0xFD).$SyncPattern1{3}; - } - - $framelength = false; - $framelength1 = strpos($MPEGaudioData, $SyncPattern1, 4); - $framelength2 = strpos($MPEGaudioData, $SyncPattern2, 4); - if ($framelength1 > 4) { - $framelength = $framelength1; - } - if (($framelength2 > 4) && ($framelength2 < $framelength1)) { - $framelength = $framelength2; - } - if (!$framelength) { - - // LAME 3.88 has a different value for modeextension on the first frame vs the rest - $framelength1 = strpos($MPEGaudioData, substr($SyncPattern1, 0, 3), 4); - $framelength2 = strpos($MPEGaudioData, substr($SyncPattern2, 0, 3), 4); - - if ($framelength1 > 4) { - $framelength = $framelength1; - } - if (($framelength2 > 4) && ($framelength2 < $framelength1)) { - $framelength = $framelength2; - } - if (!$framelength) { - $info['error'][] = 'Cannot find next free-format synch pattern ('.getid3_lib::PrintHexBytes($SyncPattern1).' or '.getid3_lib::PrintHexBytes($SyncPattern2).') after offset '.$offset; - return false; - } else { - $info['warning'][] = 'ModeExtension varies between first frame and other frames (known free-format issue in LAME 3.88)'; - $info['audio']['codec'] = 'LAME'; - $info['audio']['encoder'] = 'LAME3.88'; - $SyncPattern1 = substr($SyncPattern1, 0, 3); - $SyncPattern2 = substr($SyncPattern2, 0, 3); - } - } - - if ($deepscan) { - - $ActualFrameLengthValues = array(); - $nextoffset = $offset + $framelength; - while ($nextoffset < ($info['avdataend'] - 6)) { - $this->fseek($nextoffset - 1); - $NextSyncPattern = $this->fread(6); - if ((substr($NextSyncPattern, 1, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 1, strlen($SyncPattern2)) == $SyncPattern2)) { - // good - found where expected - $ActualFrameLengthValues[] = $framelength; - } elseif ((substr($NextSyncPattern, 0, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 0, strlen($SyncPattern2)) == $SyncPattern2)) { - // ok - found one byte earlier than expected (last frame wasn't padded, first frame was) - $ActualFrameLengthValues[] = ($framelength - 1); - $nextoffset--; - } elseif ((substr($NextSyncPattern, 2, strlen($SyncPattern1)) == $SyncPattern1) || (substr($NextSyncPattern, 2, strlen($SyncPattern2)) == $SyncPattern2)) { - // ok - found one byte later than expected (last frame was padded, first frame wasn't) - $ActualFrameLengthValues[] = ($framelength + 1); - $nextoffset++; - } else { - $info['error'][] = 'Did not find expected free-format sync pattern at offset '.$nextoffset; - return false; - } - $nextoffset += $framelength; - } - if (count($ActualFrameLengthValues) > 0) { - $framelength = intval(round(array_sum($ActualFrameLengthValues) / count($ActualFrameLengthValues))); - } - } - return $framelength; - } - - public function getOnlyMPEGaudioInfoBruteForce() { - $MPEGaudioHeaderDecodeCache = array(); - $MPEGaudioHeaderValidCache = array(); - $MPEGaudioHeaderLengthCache = array(); - $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); - $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); - $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); - $MPEGaudioFrequencyLookup = self::MPEGaudioFrequencyArray(); - $MPEGaudioChannelModeLookup = self::MPEGaudioChannelModeArray(); - $MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray(); - $MPEGaudioEmphasisLookup = self::MPEGaudioEmphasisArray(); - $LongMPEGversionLookup = array(); - $LongMPEGlayerLookup = array(); - $LongMPEGbitrateLookup = array(); - $LongMPEGpaddingLookup = array(); - $LongMPEGfrequencyLookup = array(); - $Distribution['bitrate'] = array(); - $Distribution['frequency'] = array(); - $Distribution['layer'] = array(); - $Distribution['version'] = array(); - $Distribution['padding'] = array(); - - $info = &$this->getid3->info; - $this->fseek($info['avdataoffset']); - - $max_frames_scan = 5000; - $frames_scanned = 0; - - $previousvalidframe = $info['avdataoffset']; - while ($this->ftell() < $info['avdataend']) { - set_time_limit(30); - $head4 = $this->fread(4); - if (strlen($head4) < 4) { - break; - } - if ($head4{0} != "\xFF") { - for ($i = 1; $i < 4; $i++) { - if ($head4{$i} == "\xFF") { - $this->fseek($i - 4, SEEK_CUR); - continue 2; - } - } - continue; - } - if (!isset($MPEGaudioHeaderDecodeCache[$head4])) { - $MPEGaudioHeaderDecodeCache[$head4] = self::MPEGaudioHeaderDecode($head4); - } - if (!isset($MPEGaudioHeaderValidCache[$head4])) { - $MPEGaudioHeaderValidCache[$head4] = self::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$head4], false, false); - } - if ($MPEGaudioHeaderValidCache[$head4]) { - - if (!isset($MPEGaudioHeaderLengthCache[$head4])) { - $LongMPEGversionLookup[$head4] = $MPEGaudioVersionLookup[$MPEGaudioHeaderDecodeCache[$head4]['version']]; - $LongMPEGlayerLookup[$head4] = $MPEGaudioLayerLookup[$MPEGaudioHeaderDecodeCache[$head4]['layer']]; - $LongMPEGbitrateLookup[$head4] = $MPEGaudioBitrateLookup[$LongMPEGversionLookup[$head4]][$LongMPEGlayerLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['bitrate']]; - $LongMPEGpaddingLookup[$head4] = (bool) $MPEGaudioHeaderDecodeCache[$head4]['padding']; - $LongMPEGfrequencyLookup[$head4] = $MPEGaudioFrequencyLookup[$LongMPEGversionLookup[$head4]][$MPEGaudioHeaderDecodeCache[$head4]['sample_rate']]; - $MPEGaudioHeaderLengthCache[$head4] = self::MPEGaudioFrameLength( - $LongMPEGbitrateLookup[$head4], - $LongMPEGversionLookup[$head4], - $LongMPEGlayerLookup[$head4], - $LongMPEGpaddingLookup[$head4], - $LongMPEGfrequencyLookup[$head4]); - } - if ($MPEGaudioHeaderLengthCache[$head4] > 4) { - $WhereWeWere = $this->ftell(); - $this->fseek($MPEGaudioHeaderLengthCache[$head4] - 4, SEEK_CUR); - $next4 = $this->fread(4); - if ($next4{0} == "\xFF") { - if (!isset($MPEGaudioHeaderDecodeCache[$next4])) { - $MPEGaudioHeaderDecodeCache[$next4] = self::MPEGaudioHeaderDecode($next4); - } - if (!isset($MPEGaudioHeaderValidCache[$next4])) { - $MPEGaudioHeaderValidCache[$next4] = self::MPEGaudioHeaderValid($MPEGaudioHeaderDecodeCache[$next4], false, false); - } - if ($MPEGaudioHeaderValidCache[$next4]) { - $this->fseek(-4, SEEK_CUR); - - getid3_lib::safe_inc($Distribution['bitrate'][$LongMPEGbitrateLookup[$head4]]); - getid3_lib::safe_inc($Distribution['layer'][$LongMPEGlayerLookup[$head4]]); - getid3_lib::safe_inc($Distribution['version'][$LongMPEGversionLookup[$head4]]); - getid3_lib::safe_inc($Distribution['padding'][intval($LongMPEGpaddingLookup[$head4])]); - getid3_lib::safe_inc($Distribution['frequency'][$LongMPEGfrequencyLookup[$head4]]); - if ($max_frames_scan && (++$frames_scanned >= $max_frames_scan)) { - $pct_data_scanned = ($this->ftell() - $info['avdataoffset']) / ($info['avdataend'] - $info['avdataoffset']); - $info['warning'][] = 'too many MPEG audio frames to scan, only scanned first '.$max_frames_scan.' frames ('.number_format($pct_data_scanned * 100, 1).'% of file) and extrapolated distribution, playtime and bitrate may be incorrect.'; - foreach ($Distribution as $key1 => $value1) { - foreach ($value1 as $key2 => $value2) { - $Distribution[$key1][$key2] = round($value2 / $pct_data_scanned); - } - } - break; - } - continue; - } - } - unset($next4); - $this->fseek($WhereWeWere - 3); - } - - } - } - foreach ($Distribution as $key => $value) { - ksort($Distribution[$key], SORT_NUMERIC); - } - ksort($Distribution['version'], SORT_STRING); - $info['mpeg']['audio']['bitrate_distribution'] = $Distribution['bitrate']; - $info['mpeg']['audio']['frequency_distribution'] = $Distribution['frequency']; - $info['mpeg']['audio']['layer_distribution'] = $Distribution['layer']; - $info['mpeg']['audio']['version_distribution'] = $Distribution['version']; - $info['mpeg']['audio']['padding_distribution'] = $Distribution['padding']; - if (count($Distribution['version']) > 1) { - $info['error'][] = 'Corrupt file - more than one MPEG version detected'; - } - if (count($Distribution['layer']) > 1) { - $info['error'][] = 'Corrupt file - more than one MPEG layer detected'; - } - if (count($Distribution['frequency']) > 1) { - $info['error'][] = 'Corrupt file - more than one MPEG sample rate detected'; - } - - - $bittotal = 0; - foreach ($Distribution['bitrate'] as $bitratevalue => $bitratecount) { - if ($bitratevalue != 'free') { - $bittotal += ($bitratevalue * $bitratecount); - } - } - $info['mpeg']['audio']['frame_count'] = array_sum($Distribution['bitrate']); - if ($info['mpeg']['audio']['frame_count'] == 0) { - $info['error'][] = 'no MPEG audio frames found'; - return false; - } - $info['mpeg']['audio']['bitrate'] = ($bittotal / $info['mpeg']['audio']['frame_count']); - $info['mpeg']['audio']['bitrate_mode'] = ((count($Distribution['bitrate']) > 0) ? 'vbr' : 'cbr'); - $info['mpeg']['audio']['sample_rate'] = getid3_lib::array_max($Distribution['frequency'], true); - - $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; - $info['audio']['bitrate_mode'] = $info['mpeg']['audio']['bitrate_mode']; - $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; - $info['audio']['dataformat'] = 'mp'.getid3_lib::array_max($Distribution['layer'], true); - $info['fileformat'] = $info['audio']['dataformat']; - - return true; - } - - - public function getOnlyMPEGaudioInfo($avdataoffset, $BitrateHistogram=false) { - // looks for synch, decodes MPEG audio header - - $info = &$this->getid3->info; - - static $MPEGaudioVersionLookup; - static $MPEGaudioLayerLookup; - static $MPEGaudioBitrateLookup; - if (empty($MPEGaudioVersionLookup)) { - $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); - $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); - $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); - - } - - $this->fseek($avdataoffset); - $sync_seek_buffer_size = min(128 * 1024, $info['avdataend'] - $avdataoffset); - if ($sync_seek_buffer_size <= 0) { - $info['error'][] = 'Invalid $sync_seek_buffer_size at offset '.$avdataoffset; - return false; - } - $header = $this->fread($sync_seek_buffer_size); - $sync_seek_buffer_size = strlen($header); - $SynchSeekOffset = 0; - while ($SynchSeekOffset < $sync_seek_buffer_size) { - if ((($avdataoffset + $SynchSeekOffset) < $info['avdataend']) && !feof($this->getid3->fp)) { - - if ($SynchSeekOffset > $sync_seek_buffer_size) { - // if a synch's not found within the first 128k bytes, then give up - $info['error'][] = 'Could not find valid MPEG audio synch within the first '.round($sync_seek_buffer_size / 1024).'kB'; - if (isset($info['audio']['bitrate'])) { - unset($info['audio']['bitrate']); - } - if (isset($info['mpeg']['audio'])) { - unset($info['mpeg']['audio']); - } - if (empty($info['mpeg'])) { - unset($info['mpeg']); - } - return false; - - } elseif (feof($this->getid3->fp)) { - - $info['error'][] = 'Could not find valid MPEG audio synch before end of file'; - if (isset($info['audio']['bitrate'])) { - unset($info['audio']['bitrate']); - } - if (isset($info['mpeg']['audio'])) { - unset($info['mpeg']['audio']); - } - if (isset($info['mpeg']) && (!is_array($info['mpeg']) || (count($info['mpeg']) == 0))) { - unset($info['mpeg']); - } - return false; - } - } - - if (($SynchSeekOffset + 1) >= strlen($header)) { - $info['error'][] = 'Could not find valid MPEG synch before end of file'; - return false; - } - - if (($header{$SynchSeekOffset} == "\xFF") && ($header{($SynchSeekOffset + 1)} > "\xE0")) { // synch detected - if (!isset($FirstFrameThisfileInfo) && !isset($info['mpeg']['audio'])) { - $FirstFrameThisfileInfo = $info; - $FirstFrameAVDataOffset = $avdataoffset + $SynchSeekOffset; - if (!$this->decodeMPEGaudioHeader($FirstFrameAVDataOffset, $FirstFrameThisfileInfo, false)) { - // if this is the first valid MPEG-audio frame, save it in case it's a VBR header frame and there's - // garbage between this frame and a valid sequence of MPEG-audio frames, to be restored below - unset($FirstFrameThisfileInfo); - } - } - - $dummy = $info; // only overwrite real data if valid header found - if ($this->decodeMPEGaudioHeader($avdataoffset + $SynchSeekOffset, $dummy, true)) { - $info = $dummy; - $info['avdataoffset'] = $avdataoffset + $SynchSeekOffset; - switch (isset($info['fileformat']) ? $info['fileformat'] : '') { - case '': - case 'id3': - case 'ape': - case 'mp3': - $info['fileformat'] = 'mp3'; - $info['audio']['dataformat'] = 'mp3'; - break; - } - if (isset($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode']) && ($FirstFrameThisfileInfo['mpeg']['audio']['bitrate_mode'] == 'vbr')) { - if (!(abs($info['audio']['bitrate'] - $FirstFrameThisfileInfo['audio']['bitrate']) <= 1)) { - // If there is garbage data between a valid VBR header frame and a sequence - // of valid MPEG-audio frames the VBR data is no longer discarded. - $info = $FirstFrameThisfileInfo; - $info['avdataoffset'] = $FirstFrameAVDataOffset; - $info['fileformat'] = 'mp3'; - $info['audio']['dataformat'] = 'mp3'; - $dummy = $info; - unset($dummy['mpeg']['audio']); - $GarbageOffsetStart = $FirstFrameAVDataOffset + $FirstFrameThisfileInfo['mpeg']['audio']['framelength']; - $GarbageOffsetEnd = $avdataoffset + $SynchSeekOffset; - if ($this->decodeMPEGaudioHeader($GarbageOffsetEnd, $dummy, true, true)) { - $info = $dummy; - $info['avdataoffset'] = $GarbageOffsetEnd; - $info['warning'][] = 'apparently-valid VBR header not used because could not find '.GETID3_MP3_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.'), but did find valid CBR stream starting at '.$GarbageOffsetEnd; - } else { - $info['warning'][] = 'using data from VBR header even though could not find '.GETID3_MP3_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.')'; - } - } - } - if (isset($info['mpeg']['audio']['bitrate_mode']) && ($info['mpeg']['audio']['bitrate_mode'] == 'vbr') && !isset($info['mpeg']['audio']['VBR_method'])) { - // VBR file with no VBR header - $BitrateHistogram = true; - } - - if ($BitrateHistogram) { - - $info['mpeg']['audio']['stereo_distribution'] = array('stereo'=>0, 'joint stereo'=>0, 'dual channel'=>0, 'mono'=>0); - $info['mpeg']['audio']['version_distribution'] = array('1'=>0, '2'=>0, '2.5'=>0); - - if ($info['mpeg']['audio']['version'] == '1') { - if ($info['mpeg']['audio']['layer'] == 3) { - $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 40000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 320000=>0); - } elseif ($info['mpeg']['audio']['layer'] == 2) { - $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 320000=>0, 384000=>0); - } elseif ($info['mpeg']['audio']['layer'] == 1) { - $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 64000=>0, 96000=>0, 128000=>0, 160000=>0, 192000=>0, 224000=>0, 256000=>0, 288000=>0, 320000=>0, 352000=>0, 384000=>0, 416000=>0, 448000=>0); - } - } elseif ($info['mpeg']['audio']['layer'] == 1) { - $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 32000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 144000=>0, 160000=>0, 176000=>0, 192000=>0, 224000=>0, 256000=>0); - } else { - $info['mpeg']['audio']['bitrate_distribution'] = array('free'=>0, 8000=>0, 16000=>0, 24000=>0, 32000=>0, 40000=>0, 48000=>0, 56000=>0, 64000=>0, 80000=>0, 96000=>0, 112000=>0, 128000=>0, 144000=>0, 160000=>0); - } - - $dummy = array('error'=>$info['error'], 'warning'=>$info['warning'], 'avdataend'=>$info['avdataend'], 'avdataoffset'=>$info['avdataoffset']); - $synchstartoffset = $info['avdataoffset']; - $this->fseek($info['avdataoffset']); - - // you can play with these numbers: - $max_frames_scan = 50000; - $max_scan_segments = 10; - - // don't play with these numbers: - $FastMode = false; - $SynchErrorsFound = 0; - $frames_scanned = 0; - $this_scan_segment = 0; - $frames_scan_per_segment = ceil($max_frames_scan / $max_scan_segments); - $pct_data_scanned = 0; - for ($current_segment = 0; $current_segment < $max_scan_segments; $current_segment++) { - $frames_scanned_this_segment = 0; - if ($this->ftell() >= $info['avdataend']) { - break; - } - $scan_start_offset[$current_segment] = max($this->ftell(), $info['avdataoffset'] + round($current_segment * (($info['avdataend'] - $info['avdataoffset']) / $max_scan_segments))); - if ($current_segment > 0) { - $this->fseek($scan_start_offset[$current_segment]); - $buffer_4k = $this->fread(4096); - for ($j = 0; $j < (strlen($buffer_4k) - 4); $j++) { - if (($buffer_4k{$j} == "\xFF") && ($buffer_4k{($j + 1)} > "\xE0")) { // synch detected - if ($this->decodeMPEGaudioHeader($scan_start_offset[$current_segment] + $j, $dummy, false, false, $FastMode)) { - $calculated_next_offset = $scan_start_offset[$current_segment] + $j + $dummy['mpeg']['audio']['framelength']; - if ($this->decodeMPEGaudioHeader($calculated_next_offset, $dummy, false, false, $FastMode)) { - $scan_start_offset[$current_segment] += $j; - break; - } - } - } - } - } - $synchstartoffset = $scan_start_offset[$current_segment]; - while ($this->decodeMPEGaudioHeader($synchstartoffset, $dummy, false, false, $FastMode)) { - $FastMode = true; - $thisframebitrate = $MPEGaudioBitrateLookup[$MPEGaudioVersionLookup[$dummy['mpeg']['audio']['raw']['version']]][$MPEGaudioLayerLookup[$dummy['mpeg']['audio']['raw']['layer']]][$dummy['mpeg']['audio']['raw']['bitrate']]; - - if (empty($dummy['mpeg']['audio']['framelength'])) { - $SynchErrorsFound++; - $synchstartoffset++; - } else { - getid3_lib::safe_inc($info['mpeg']['audio']['bitrate_distribution'][$thisframebitrate]); - getid3_lib::safe_inc($info['mpeg']['audio']['stereo_distribution'][$dummy['mpeg']['audio']['channelmode']]); - getid3_lib::safe_inc($info['mpeg']['audio']['version_distribution'][$dummy['mpeg']['audio']['version']]); - $synchstartoffset += $dummy['mpeg']['audio']['framelength']; - } - $frames_scanned++; - if ($frames_scan_per_segment && (++$frames_scanned_this_segment >= $frames_scan_per_segment)) { - $this_pct_scanned = ($this->ftell() - $scan_start_offset[$current_segment]) / ($info['avdataend'] - $info['avdataoffset']); - if (($current_segment == 0) && (($this_pct_scanned * $max_scan_segments) >= 1)) { - // file likely contains < $max_frames_scan, just scan as one segment - $max_scan_segments = 1; - $frames_scan_per_segment = $max_frames_scan; - } else { - $pct_data_scanned += $this_pct_scanned; - break; - } - } - } - } - if ($pct_data_scanned > 0) { - $info['warning'][] = 'too many MPEG audio frames to scan, only scanned '.$frames_scanned.' frames in '.$max_scan_segments.' segments ('.number_format($pct_data_scanned * 100, 1).'% of file) and extrapolated distribution, playtime and bitrate may be incorrect.'; - foreach ($info['mpeg']['audio'] as $key1 => $value1) { - if (!preg_match('#_distribution$#i', $key1)) { - continue; - } - foreach ($value1 as $key2 => $value2) { - $info['mpeg']['audio'][$key1][$key2] = round($value2 / $pct_data_scanned); - } - } - } - - if ($SynchErrorsFound > 0) { - $info['warning'][] = 'Found '.$SynchErrorsFound.' synch errors in histogram analysis'; - //return false; - } - - $bittotal = 0; - $framecounter = 0; - foreach ($info['mpeg']['audio']['bitrate_distribution'] as $bitratevalue => $bitratecount) { - $framecounter += $bitratecount; - if ($bitratevalue != 'free') { - $bittotal += ($bitratevalue * $bitratecount); - } - } - if ($framecounter == 0) { - $info['error'][] = 'Corrupt MP3 file: framecounter == zero'; - return false; - } - $info['mpeg']['audio']['frame_count'] = getid3_lib::CastAsInt($framecounter); - $info['mpeg']['audio']['bitrate'] = ($bittotal / $framecounter); - - $info['audio']['bitrate'] = $info['mpeg']['audio']['bitrate']; - - - // Definitively set VBR vs CBR, even if the Xing/LAME/VBRI header says differently - $distinct_bitrates = 0; - foreach ($info['mpeg']['audio']['bitrate_distribution'] as $bitrate_value => $bitrate_count) { - if ($bitrate_count > 0) { - $distinct_bitrates++; - } - } - if ($distinct_bitrates > 1) { - $info['mpeg']['audio']['bitrate_mode'] = 'vbr'; - } else { - $info['mpeg']['audio']['bitrate_mode'] = 'cbr'; - } - $info['audio']['bitrate_mode'] = $info['mpeg']['audio']['bitrate_mode']; - - } - - break; // exit while() - } - } - - $SynchSeekOffset++; - if (($avdataoffset + $SynchSeekOffset) >= $info['avdataend']) { - // end of file/data - - if (empty($info['mpeg']['audio'])) { - - $info['error'][] = 'could not find valid MPEG synch before end of file'; - if (isset($info['audio']['bitrate'])) { - unset($info['audio']['bitrate']); - } - if (isset($info['mpeg']['audio'])) { - unset($info['mpeg']['audio']); - } - if (isset($info['mpeg']) && (!is_array($info['mpeg']) || empty($info['mpeg']))) { - unset($info['mpeg']); - } - return false; - - } - break; - } - - } - $info['audio']['channels'] = $info['mpeg']['audio']['channels']; - $info['audio']['channelmode'] = $info['mpeg']['audio']['channelmode']; - $info['audio']['sample_rate'] = $info['mpeg']['audio']['sample_rate']; - return true; - } - - - public static function MPEGaudioVersionArray() { - static $MPEGaudioVersion = array('2.5', false, '2', '1'); - return $MPEGaudioVersion; - } - - public static function MPEGaudioLayerArray() { - static $MPEGaudioLayer = array(false, 3, 2, 1); - return $MPEGaudioLayer; - } - - public static function MPEGaudioBitrateArray() { - static $MPEGaudioBitrate; - if (empty($MPEGaudioBitrate)) { - $MPEGaudioBitrate = array ( - '1' => array (1 => array('free', 32000, 64000, 96000, 128000, 160000, 192000, 224000, 256000, 288000, 320000, 352000, 384000, 416000, 448000), - 2 => array('free', 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000, 384000), - 3 => array('free', 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 160000, 192000, 224000, 256000, 320000) - ), - - '2' => array (1 => array('free', 32000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000, 176000, 192000, 224000, 256000), - 2 => array('free', 8000, 16000, 24000, 32000, 40000, 48000, 56000, 64000, 80000, 96000, 112000, 128000, 144000, 160000), - ) - ); - $MPEGaudioBitrate['2'][3] = $MPEGaudioBitrate['2'][2]; - $MPEGaudioBitrate['2.5'] = $MPEGaudioBitrate['2']; - } - return $MPEGaudioBitrate; - } - - public static function MPEGaudioFrequencyArray() { - static $MPEGaudioFrequency; - if (empty($MPEGaudioFrequency)) { - $MPEGaudioFrequency = array ( - '1' => array(44100, 48000, 32000), - '2' => array(22050, 24000, 16000), - '2.5' => array(11025, 12000, 8000) - ); - } - return $MPEGaudioFrequency; - } - - public static function MPEGaudioChannelModeArray() { - static $MPEGaudioChannelMode = array('stereo', 'joint stereo', 'dual channel', 'mono'); - return $MPEGaudioChannelMode; - } - - public static function MPEGaudioModeExtensionArray() { - static $MPEGaudioModeExtension; - if (empty($MPEGaudioModeExtension)) { - $MPEGaudioModeExtension = array ( - 1 => array('4-31', '8-31', '12-31', '16-31'), - 2 => array('4-31', '8-31', '12-31', '16-31'), - 3 => array('', 'IS', 'MS', 'IS+MS') - ); - } - return $MPEGaudioModeExtension; - } - - public static function MPEGaudioEmphasisArray() { - static $MPEGaudioEmphasis = array('none', '50/15ms', false, 'CCIT J.17'); - return $MPEGaudioEmphasis; - } - - public static function MPEGaudioHeaderBytesValid($head4, $allowBitrate15=false) { - return self::MPEGaudioHeaderValid(self::MPEGaudioHeaderDecode($head4), false, $allowBitrate15); - } - - public static function MPEGaudioHeaderValid($rawarray, $echoerrors=false, $allowBitrate15=false) { - if (($rawarray['synch'] & 0x0FFE) != 0x0FFE) { - return false; - } - - static $MPEGaudioVersionLookup; - static $MPEGaudioLayerLookup; - static $MPEGaudioBitrateLookup; - static $MPEGaudioFrequencyLookup; - static $MPEGaudioChannelModeLookup; - static $MPEGaudioModeExtensionLookup; - static $MPEGaudioEmphasisLookup; - if (empty($MPEGaudioVersionLookup)) { - $MPEGaudioVersionLookup = self::MPEGaudioVersionArray(); - $MPEGaudioLayerLookup = self::MPEGaudioLayerArray(); - $MPEGaudioBitrateLookup = self::MPEGaudioBitrateArray(); - $MPEGaudioFrequencyLookup = self::MPEGaudioFrequencyArray(); - $MPEGaudioChannelModeLookup = self::MPEGaudioChannelModeArray(); - $MPEGaudioModeExtensionLookup = self::MPEGaudioModeExtensionArray(); - $MPEGaudioEmphasisLookup = self::MPEGaudioEmphasisArray(); - } - - if (isset($MPEGaudioVersionLookup[$rawarray['version']])) { - $decodedVersion = $MPEGaudioVersionLookup[$rawarray['version']]; - } else { - echo ($echoerrors ? "\n".'invalid Version ('.$rawarray['version'].')' : ''); - return false; - } - if (isset($MPEGaudioLayerLookup[$rawarray['layer']])) { - $decodedLayer = $MPEGaudioLayerLookup[$rawarray['layer']]; - } else { - echo ($echoerrors ? "\n".'invalid Layer ('.$rawarray['layer'].')' : ''); - return false; - } - if (!isset($MPEGaudioBitrateLookup[$decodedVersion][$decodedLayer][$rawarray['bitrate']])) { - echo ($echoerrors ? "\n".'invalid Bitrate ('.$rawarray['bitrate'].')' : ''); - if ($rawarray['bitrate'] == 15) { - // known issue in LAME 3.90 - 3.93.1 where free-format has bitrate ID of 15 instead of 0 - // let it go through here otherwise file will not be identified - if (!$allowBitrate15) { - return false; - } - } else { - return false; - } - } - if (!isset($MPEGaudioFrequencyLookup[$decodedVersion][$rawarray['sample_rate']])) { - echo ($echoerrors ? "\n".'invalid Frequency ('.$rawarray['sample_rate'].')' : ''); - return false; - } - if (!isset($MPEGaudioChannelModeLookup[$rawarray['channelmode']])) { - echo ($echoerrors ? "\n".'invalid ChannelMode ('.$rawarray['channelmode'].')' : ''); - return false; - } - if (!isset($MPEGaudioModeExtensionLookup[$decodedLayer][$rawarray['modeextension']])) { - echo ($echoerrors ? "\n".'invalid Mode Extension ('.$rawarray['modeextension'].')' : ''); - return false; - } - if (!isset($MPEGaudioEmphasisLookup[$rawarray['emphasis']])) { - echo ($echoerrors ? "\n".'invalid Emphasis ('.$rawarray['emphasis'].')' : ''); - return false; - } - // These are just either set or not set, you can't mess that up :) - // $rawarray['protection']; - // $rawarray['padding']; - // $rawarray['private']; - // $rawarray['copyright']; - // $rawarray['original']; - - return true; - } - - public static function MPEGaudioHeaderDecode($Header4Bytes) { - // AAAA AAAA AAAB BCCD EEEE FFGH IIJJ KLMM - // A - Frame sync (all bits set) - // B - MPEG Audio version ID - // C - Layer description - // D - Protection bit - // E - Bitrate index - // F - Sampling rate frequency index - // G - Padding bit - // H - Private bit - // I - Channel Mode - // J - Mode extension (Only if Joint stereo) - // K - Copyright - // L - Original - // M - Emphasis - - if (strlen($Header4Bytes) != 4) { - return false; - } - - $MPEGrawHeader['synch'] = (getid3_lib::BigEndian2Int(substr($Header4Bytes, 0, 2)) & 0xFFE0) >> 4; - $MPEGrawHeader['version'] = (ord($Header4Bytes{1}) & 0x18) >> 3; // BB - $MPEGrawHeader['layer'] = (ord($Header4Bytes{1}) & 0x06) >> 1; // CC - $MPEGrawHeader['protection'] = (ord($Header4Bytes{1}) & 0x01); // D - $MPEGrawHeader['bitrate'] = (ord($Header4Bytes{2}) & 0xF0) >> 4; // EEEE - $MPEGrawHeader['sample_rate'] = (ord($Header4Bytes{2}) & 0x0C) >> 2; // FF - $MPEGrawHeader['padding'] = (ord($Header4Bytes{2}) & 0x02) >> 1; // G - $MPEGrawHeader['private'] = (ord($Header4Bytes{2}) & 0x01); // H - $MPEGrawHeader['channelmode'] = (ord($Header4Bytes{3}) & 0xC0) >> 6; // II - $MPEGrawHeader['modeextension'] = (ord($Header4Bytes{3}) & 0x30) >> 4; // JJ - $MPEGrawHeader['copyright'] = (ord($Header4Bytes{3}) & 0x08) >> 3; // K - $MPEGrawHeader['original'] = (ord($Header4Bytes{3}) & 0x04) >> 2; // L - $MPEGrawHeader['emphasis'] = (ord($Header4Bytes{3}) & 0x03); // MM - - return $MPEGrawHeader; - } - - public static function MPEGaudioFrameLength(&$bitrate, &$version, &$layer, $padding, &$samplerate) { - static $AudioFrameLengthCache = array(); - - if (!isset($AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate])) { - $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = false; - if ($bitrate != 'free') { - - if ($version == '1') { - - if ($layer == '1') { - - // For Layer I slot is 32 bits long - $FrameLengthCoefficient = 48; - $SlotLength = 4; - - } else { // Layer 2 / 3 - - // for Layer 2 and Layer 3 slot is 8 bits long. - $FrameLengthCoefficient = 144; - $SlotLength = 1; - - } - - } else { // MPEG-2 / MPEG-2.5 - - if ($layer == '1') { - - // For Layer I slot is 32 bits long - $FrameLengthCoefficient = 24; - $SlotLength = 4; - - } elseif ($layer == '2') { - - // for Layer 2 and Layer 3 slot is 8 bits long. - $FrameLengthCoefficient = 144; - $SlotLength = 1; - - } else { // layer 3 - - // for Layer 2 and Layer 3 slot is 8 bits long. - $FrameLengthCoefficient = 72; - $SlotLength = 1; - - } - - } - - // FrameLengthInBytes = ((Coefficient * BitRate) / SampleRate) + Padding - if ($samplerate > 0) { - $NewFramelength = ($FrameLengthCoefficient * $bitrate) / $samplerate; - $NewFramelength = floor($NewFramelength / $SlotLength) * $SlotLength; // round to next-lower multiple of SlotLength (1 byte for Layer 2/3, 4 bytes for Layer I) - if ($padding) { - $NewFramelength += $SlotLength; - } - $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate] = (int) $NewFramelength; - } - } - } - return $AudioFrameLengthCache[$bitrate][$version][$layer][$padding][$samplerate]; - } - - public static function ClosestStandardMP3Bitrate($bit_rate) { - static $standard_bit_rates = array (320000, 256000, 224000, 192000, 160000, 128000, 112000, 96000, 80000, 64000, 56000, 48000, 40000, 32000, 24000, 16000, 8000); - static $bit_rate_table = array (0=>'-'); - $round_bit_rate = intval(round($bit_rate, -3)); - if (!isset($bit_rate_table[$round_bit_rate])) { - if ($round_bit_rate > max($standard_bit_rates)) { - $bit_rate_table[$round_bit_rate] = round($bit_rate, 2 - strlen($bit_rate)); - } else { - $bit_rate_table[$round_bit_rate] = max($standard_bit_rates); - foreach ($standard_bit_rates as $standard_bit_rate) { - if ($round_bit_rate >= $standard_bit_rate + (($bit_rate_table[$round_bit_rate] - $standard_bit_rate) / 2)) { - break; - } - $bit_rate_table[$round_bit_rate] = $standard_bit_rate; - } - } - } - return $bit_rate_table[$round_bit_rate]; - } - - public static function XingVBRidOffset($version, $channelmode) { - static $XingVBRidOffsetCache = array(); - if (empty($XingVBRidOffset)) { - $XingVBRidOffset = array ( - '1' => array ('mono' => 0x15, // 4 + 17 = 21 - 'stereo' => 0x24, // 4 + 32 = 36 - 'joint stereo' => 0x24, - 'dual channel' => 0x24 - ), - - '2' => array ('mono' => 0x0D, // 4 + 9 = 13 - 'stereo' => 0x15, // 4 + 17 = 21 - 'joint stereo' => 0x15, - 'dual channel' => 0x15 - ), - - '2.5' => array ('mono' => 0x15, - 'stereo' => 0x15, - 'joint stereo' => 0x15, - 'dual channel' => 0x15 - ) - ); - } - return $XingVBRidOffset[$version][$channelmode]; - } - - public static function LAMEvbrMethodLookup($VBRmethodID) { - static $LAMEvbrMethodLookup = array( - 0x00 => 'unknown', - 0x01 => 'cbr', - 0x02 => 'abr', - 0x03 => 'vbr-old / vbr-rh', - 0x04 => 'vbr-new / vbr-mtrh', - 0x05 => 'vbr-mt', - 0x06 => 'vbr (full vbr method 4)', - 0x08 => 'cbr (constant bitrate 2 pass)', - 0x09 => 'abr (2 pass)', - 0x0F => 'reserved' - ); - return (isset($LAMEvbrMethodLookup[$VBRmethodID]) ? $LAMEvbrMethodLookup[$VBRmethodID] : ''); - } - - public static function LAMEmiscStereoModeLookup($StereoModeID) { - static $LAMEmiscStereoModeLookup = array( - 0 => 'mono', - 1 => 'stereo', - 2 => 'dual mono', - 3 => 'joint stereo', - 4 => 'forced stereo', - 5 => 'auto', - 6 => 'intensity stereo', - 7 => 'other' - ); - return (isset($LAMEmiscStereoModeLookup[$StereoModeID]) ? $LAMEmiscStereoModeLookup[$StereoModeID] : ''); - } - - public static function LAMEmiscSourceSampleFrequencyLookup($SourceSampleFrequencyID) { - static $LAMEmiscSourceSampleFrequencyLookup = array( - 0 => '<= 32 kHz', - 1 => '44.1 kHz', - 2 => '48 kHz', - 3 => '> 48kHz' - ); - return (isset($LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID]) ? $LAMEmiscSourceSampleFrequencyLookup[$SourceSampleFrequencyID] : ''); - } - - public static function LAMEsurroundInfoLookup($SurroundInfoID) { - static $LAMEsurroundInfoLookup = array( - 0 => 'no surround info', - 1 => 'DPL encoding', - 2 => 'DPL2 encoding', - 3 => 'Ambisonic encoding' - ); - return (isset($LAMEsurroundInfoLookup[$SurroundInfoID]) ? $LAMEsurroundInfoLookup[$SurroundInfoID] : 'reserved'); - } - - public static function LAMEpresetUsedLookup($LAMEtag) { - - if ($LAMEtag['preset_used_id'] == 0) { - // no preset used (LAME >=3.93) - // no preset recorded (LAME <3.93) - return ''; - } - $LAMEpresetUsedLookup = array(); - - ///// THIS PART CANNOT BE STATIC . - for ($i = 8; $i <= 320; $i++) { - switch ($LAMEtag['vbr_method']) { - case 'cbr': - $LAMEpresetUsedLookup[$i] = '--alt-preset '.$LAMEtag['vbr_method'].' '.$i; - break; - case 'abr': - default: // other VBR modes shouldn't be here(?) - $LAMEpresetUsedLookup[$i] = '--alt-preset '.$i; - break; - } - } - - // named old-style presets (studio, phone, voice, etc) are handled in GuessEncoderOptions() - - // named alt-presets - $LAMEpresetUsedLookup[1000] = '--r3mix'; - $LAMEpresetUsedLookup[1001] = '--alt-preset standard'; - $LAMEpresetUsedLookup[1002] = '--alt-preset extreme'; - $LAMEpresetUsedLookup[1003] = '--alt-preset insane'; - $LAMEpresetUsedLookup[1004] = '--alt-preset fast standard'; - $LAMEpresetUsedLookup[1005] = '--alt-preset fast extreme'; - $LAMEpresetUsedLookup[1006] = '--alt-preset medium'; - $LAMEpresetUsedLookup[1007] = '--alt-preset fast medium'; - - // LAME 3.94 additions/changes - $LAMEpresetUsedLookup[1010] = '--preset portable'; // 3.94a15 Oct 21 2003 - $LAMEpresetUsedLookup[1015] = '--preset radio'; // 3.94a15 Oct 21 2003 - - $LAMEpresetUsedLookup[320] = '--preset insane'; // 3.94a15 Nov 12 2003 - $LAMEpresetUsedLookup[410] = '-V9'; - $LAMEpresetUsedLookup[420] = '-V8'; - $LAMEpresetUsedLookup[440] = '-V6'; - $LAMEpresetUsedLookup[430] = '--preset radio'; // 3.94a15 Nov 12 2003 - $LAMEpresetUsedLookup[450] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'portable'; // 3.94a15 Nov 12 2003 - $LAMEpresetUsedLookup[460] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'medium'; // 3.94a15 Nov 12 2003 - $LAMEpresetUsedLookup[470] = '--r3mix'; // 3.94b1 Dec 18 2003 - $LAMEpresetUsedLookup[480] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'standard'; // 3.94a15 Nov 12 2003 - $LAMEpresetUsedLookup[490] = '-V1'; - $LAMEpresetUsedLookup[500] = '--preset '.(($LAMEtag['raw']['vbr_method'] == 4) ? 'fast ' : '').'extreme'; // 3.94a15 Nov 12 2003 - - return (isset($LAMEpresetUsedLookup[$LAMEtag['preset_used_id']]) ? $LAMEpresetUsedLookup[$LAMEtag['preset_used_id']] : 'new/unknown preset: '.$LAMEtag['preset_used_id'].' - report to info@getid3.org'); - } - -} diff --git a/wp/wp-includes/ID3/module.audio.ogg.php b/wp/wp-includes/ID3/module.audio.ogg.php deleted file mode 100644 index 2a77768b..00000000 --- a/wp/wp-includes/ID3/module.audio.ogg.php +++ /dev/null @@ -1,839 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// -// See readme.txt for more details // -///////////////////////////////////////////////////////////////// -// // -// module.audio.ogg.php // -// module for analyzing Ogg Vorbis, OggFLAC and Speex files // -// dependencies: module.audio.flac.php // -// /// -///////////////////////////////////////////////////////////////// - -getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio.flac.php', __FILE__, true); - -class getid3_ogg extends getid3_handler -{ - // http://xiph.org/vorbis/doc/Vorbis_I_spec.html - public function Analyze() { - $info = &$this->getid3->info; - - $info['fileformat'] = 'ogg'; - - // Warn about illegal tags - only vorbiscomments are allowed - if (isset($info['id3v2'])) { - $info['warning'][] = 'Illegal ID3v2 tag present.'; - } - if (isset($info['id3v1'])) { - $info['warning'][] = 'Illegal ID3v1 tag present.'; - } - if (isset($info['ape'])) { - $info['warning'][] = 'Illegal APE tag present.'; - } - - - // Page 1 - Stream Header - - $this->fseek($info['avdataoffset']); - - $oggpageinfo = $this->ParseOggPageHeader(); - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; - - if ($this->ftell() >= $this->getid3->fread_buffer_size()) { - $info['error'][] = 'Could not find start of Ogg page in the first '.$this->getid3->fread_buffer_size().' bytes (this might not be an Ogg-Vorbis file?)'; - unset($info['fileformat']); - unset($info['ogg']); - return false; - } - - $filedata = $this->fread($oggpageinfo['page_length']); - $filedataoffset = 0; - - if (substr($filedata, 0, 4) == 'fLaC') { - - $info['audio']['dataformat'] = 'flac'; - $info['audio']['bitrate_mode'] = 'vbr'; - $info['audio']['lossless'] = true; - - } elseif (substr($filedata, 1, 6) == 'vorbis') { - - $this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo); - - } elseif (substr($filedata, 0, 8) == 'OpusHead') { - - if( $this->ParseOpusPageHeader($filedata, $filedataoffset, $oggpageinfo) == false ) { - return false; - } - - } elseif (substr($filedata, 0, 8) == 'Speex ') { - - // http://www.speex.org/manual/node10.html - - $info['audio']['dataformat'] = 'speex'; - $info['mime_type'] = 'audio/speex'; - $info['audio']['bitrate_mode'] = 'abr'; - $info['audio']['lossless'] = false; - - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_string'] = substr($filedata, $filedataoffset, 8); // hard-coded to 'Speex ' - $filedataoffset += 8; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version'] = substr($filedata, $filedataoffset, 20); - $filedataoffset += 20; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version_id'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['header_size'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode_bitstream_version'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['bitrate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['framesize'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['frames_per_packet'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['extra_headers'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved1'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['reserved2'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - - $info['speex']['speex_version'] = trim($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['speex_version']); - $info['speex']['sample_rate'] = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['rate']; - $info['speex']['channels'] = $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['nb_channels']; - $info['speex']['vbr'] = (bool) $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['vbr']; - $info['speex']['band_type'] = $this->SpeexBandModeLookup($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['mode']); - - $info['audio']['sample_rate'] = $info['speex']['sample_rate']; - $info['audio']['channels'] = $info['speex']['channels']; - if ($info['speex']['vbr']) { - $info['audio']['bitrate_mode'] = 'vbr'; - } - - } elseif (substr($filedata, 0, 7) == "\x80".'theora') { - - // http://www.theora.org/doc/Theora.pdf (section 6.2) - - $info['ogg']['pageheader']['theora']['theora_magic'] = substr($filedata, $filedataoffset, 7); // hard-coded to "\x80.'theora' - $filedataoffset += 7; - $info['ogg']['pageheader']['theora']['version_major'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - $info['ogg']['pageheader']['theora']['version_minor'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - $info['ogg']['pageheader']['theora']['version_revision'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - $info['ogg']['pageheader']['theora']['frame_width_macroblocks'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 2)); - $filedataoffset += 2; - $info['ogg']['pageheader']['theora']['frame_height_macroblocks'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 2)); - $filedataoffset += 2; - $info['ogg']['pageheader']['theora']['resolution_x'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); - $filedataoffset += 3; - $info['ogg']['pageheader']['theora']['resolution_y'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); - $filedataoffset += 3; - $info['ogg']['pageheader']['theora']['picture_offset_x'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - $info['ogg']['pageheader']['theora']['picture_offset_y'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - $info['ogg']['pageheader']['theora']['frame_rate_numerator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['pageheader']['theora']['frame_rate_denominator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['pageheader']['theora']['pixel_aspect_numerator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); - $filedataoffset += 3; - $info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); - $filedataoffset += 3; - $info['ogg']['pageheader']['theora']['color_space_id'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - $info['ogg']['pageheader']['theora']['nominal_bitrate'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 3)); - $filedataoffset += 3; - $info['ogg']['pageheader']['theora']['flags'] = getid3_lib::BigEndian2Int(substr($filedata, $filedataoffset, 2)); - $filedataoffset += 2; - - $info['ogg']['pageheader']['theora']['quality'] = ($info['ogg']['pageheader']['theora']['flags'] & 0xFC00) >> 10; - $info['ogg']['pageheader']['theora']['kfg_shift'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x03E0) >> 5; - $info['ogg']['pageheader']['theora']['pixel_format_id'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x0018) >> 3; - $info['ogg']['pageheader']['theora']['reserved'] = ($info['ogg']['pageheader']['theora']['flags'] & 0x0007) >> 0; // should be 0 - $info['ogg']['pageheader']['theora']['color_space'] = self::TheoraColorSpace($info['ogg']['pageheader']['theora']['color_space_id']); - $info['ogg']['pageheader']['theora']['pixel_format'] = self::TheoraPixelFormat($info['ogg']['pageheader']['theora']['pixel_format_id']); - - $info['video']['dataformat'] = 'theora'; - $info['mime_type'] = 'video/ogg'; - //$info['audio']['bitrate_mode'] = 'abr'; - //$info['audio']['lossless'] = false; - $info['video']['resolution_x'] = $info['ogg']['pageheader']['theora']['resolution_x']; - $info['video']['resolution_y'] = $info['ogg']['pageheader']['theora']['resolution_y']; - if ($info['ogg']['pageheader']['theora']['frame_rate_denominator'] > 0) { - $info['video']['frame_rate'] = (float) $info['ogg']['pageheader']['theora']['frame_rate_numerator'] / $info['ogg']['pageheader']['theora']['frame_rate_denominator']; - } - if ($info['ogg']['pageheader']['theora']['pixel_aspect_denominator'] > 0) { - $info['video']['pixel_aspect_ratio'] = (float) $info['ogg']['pageheader']['theora']['pixel_aspect_numerator'] / $info['ogg']['pageheader']['theora']['pixel_aspect_denominator']; - } -$info['warning'][] = 'Ogg Theora (v3) not fully supported in this version of getID3 ['.$this->getid3->version().'] -- bitrate, playtime and all audio data are currently unavailable'; - - - } elseif (substr($filedata, 0, 8) == "fishead\x00") { - - // Ogg Skeleton version 3.0 Format Specification - // http://xiph.org/ogg/doc/skeleton.html - $filedataoffset += 8; - $info['ogg']['skeleton']['fishead']['raw']['version_major'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); - $filedataoffset += 2; - $info['ogg']['skeleton']['fishead']['raw']['version_minor'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); - $filedataoffset += 2; - $info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); - $filedataoffset += 8; - $info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); - $filedataoffset += 8; - $info['ogg']['skeleton']['fishead']['raw']['basetime_numerator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); - $filedataoffset += 8; - $info['ogg']['skeleton']['fishead']['raw']['basetime_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); - $filedataoffset += 8; - $info['ogg']['skeleton']['fishead']['raw']['utc'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 20)); - $filedataoffset += 20; - - $info['ogg']['skeleton']['fishead']['version'] = $info['ogg']['skeleton']['fishead']['raw']['version_major'].'.'.$info['ogg']['skeleton']['fishead']['raw']['version_minor']; - $info['ogg']['skeleton']['fishead']['presentationtime'] = $info['ogg']['skeleton']['fishead']['raw']['presentationtime_numerator'] / $info['ogg']['skeleton']['fishead']['raw']['presentationtime_denominator']; - $info['ogg']['skeleton']['fishead']['basetime'] = $info['ogg']['skeleton']['fishead']['raw']['basetime_numerator'] / $info['ogg']['skeleton']['fishead']['raw']['basetime_denominator']; - $info['ogg']['skeleton']['fishead']['utc'] = $info['ogg']['skeleton']['fishead']['raw']['utc']; - - - $counter = 0; - do { - $oggpageinfo = $this->ParseOggPageHeader(); - $info['ogg']['pageheader'][$oggpageinfo['page_seqno'].'.'.$counter++] = $oggpageinfo; - $filedata = $this->fread($oggpageinfo['page_length']); - $this->fseek($oggpageinfo['page_end_offset']); - - if (substr($filedata, 0, 8) == "fisbone\x00") { - - $filedataoffset = 8; - $info['ogg']['skeleton']['fisbone']['raw']['message_header_offset'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['skeleton']['fisbone']['raw']['serial_number'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['skeleton']['fisbone']['raw']['number_header_packets'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['skeleton']['fisbone']['raw']['granulerate_numerator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); - $filedataoffset += 8; - $info['ogg']['skeleton']['fisbone']['raw']['granulerate_denominator'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); - $filedataoffset += 8; - $info['ogg']['skeleton']['fisbone']['raw']['basegranule'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); - $filedataoffset += 8; - $info['ogg']['skeleton']['fisbone']['raw']['preroll'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['skeleton']['fisbone']['raw']['granuleshift'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - $info['ogg']['skeleton']['fisbone']['raw']['padding'] = substr($filedata, $filedataoffset, 3); - $filedataoffset += 3; - - } elseif (substr($filedata, 1, 6) == 'theora') { - - $info['video']['dataformat'] = 'theora1'; - $info['error'][] = 'Ogg Theora (v1) not correctly handled in this version of getID3 ['.$this->getid3->version().']'; - //break; - - } elseif (substr($filedata, 1, 6) == 'vorbis') { - - $this->ParseVorbisPageHeader($filedata, $filedataoffset, $oggpageinfo); - - } else { - $info['error'][] = 'unexpected'; - //break; - } - //} while ($oggpageinfo['page_seqno'] == 0); - } while (($oggpageinfo['page_seqno'] == 0) && (substr($filedata, 0, 8) != "fisbone\x00")); - - $this->fseek($oggpageinfo['page_start_offset']); - - $info['error'][] = 'Ogg Skeleton not correctly handled in this version of getID3 ['.$this->getid3->version().']'; - //return false; - - } else { - - $info['error'][] = 'Expecting either "Speex ", "OpusHead" or "vorbis" identifier strings, found "'.substr($filedata, 0, 8).'"'; - unset($info['ogg']); - unset($info['mime_type']); - return false; - - } - - // Page 2 - Comment Header - $oggpageinfo = $this->ParseOggPageHeader(); - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; - - switch ($info['audio']['dataformat']) { - case 'vorbis': - $filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, 0, 1)); - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, 1, 6); // hard-coded to 'vorbis' - - $this->ParseVorbisComments(); - break; - - case 'flac': - $flac = new getid3_flac($this->getid3); - if (!$flac->parseMETAdata()) { - $info['error'][] = 'Failed to parse FLAC headers'; - return false; - } - unset($flac); - break; - - case 'speex': - $this->fseek($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length'], SEEK_CUR); - $this->ParseVorbisComments(); - break; - - case 'opus': - $filedata = $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, 0, 8); // hard-coded to 'OpusTags' - if(substr($filedata, 0, 8) != 'OpusTags') { - $info['error'][] = 'Expected "OpusTags" as header but got "'.substr($filedata, 0, 8).'"'; - return false; - } - - $this->ParseVorbisComments(); - break; - - } - - // Last Page - Number of Samples - if (!getid3_lib::intValueSupported($info['avdataend'])) { - - $info['warning'][] = 'Unable to parse Ogg end chunk file (PHP does not support file operations beyond '.round(PHP_INT_MAX / 1073741824).'GB)'; - - } else { - - $this->fseek(max($info['avdataend'] - $this->getid3->fread_buffer_size(), 0)); - $LastChunkOfOgg = strrev($this->fread($this->getid3->fread_buffer_size())); - if ($LastOggSpostion = strpos($LastChunkOfOgg, 'SggO')) { - $this->fseek($info['avdataend'] - ($LastOggSpostion + strlen('SggO'))); - $info['avdataend'] = $this->ftell(); - $info['ogg']['pageheader']['eos'] = $this->ParseOggPageHeader(); - $info['ogg']['samples'] = $info['ogg']['pageheader']['eos']['pcm_abs_position']; - if ($info['ogg']['samples'] == 0) { - $info['error'][] = 'Corrupt Ogg file: eos.number of samples == zero'; - return false; - } - if (!empty($info['audio']['sample_rate'])) { - $info['ogg']['bitrate_average'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / ($info['ogg']['samples'] / $info['audio']['sample_rate']); - } - } - - } - - if (!empty($info['ogg']['bitrate_average'])) { - $info['audio']['bitrate'] = $info['ogg']['bitrate_average']; - } elseif (!empty($info['ogg']['bitrate_nominal'])) { - $info['audio']['bitrate'] = $info['ogg']['bitrate_nominal']; - } elseif (!empty($info['ogg']['bitrate_min']) && !empty($info['ogg']['bitrate_max'])) { - $info['audio']['bitrate'] = ($info['ogg']['bitrate_min'] + $info['ogg']['bitrate_max']) / 2; - } - if (isset($info['audio']['bitrate']) && !isset($info['playtime_seconds'])) { - if ($info['audio']['bitrate'] == 0) { - $info['error'][] = 'Corrupt Ogg file: bitrate_audio == zero'; - return false; - } - $info['playtime_seconds'] = (float) ((($info['avdataend'] - $info['avdataoffset']) * 8) / $info['audio']['bitrate']); - } - - if (isset($info['ogg']['vendor'])) { - $info['audio']['encoder'] = preg_replace('/^Encoded with /', '', $info['ogg']['vendor']); - - // Vorbis only - if ($info['audio']['dataformat'] == 'vorbis') { - - // Vorbis 1.0 starts with Xiph.Org - if (preg_match('/^Xiph.Org/', $info['audio']['encoder'])) { - - if ($info['audio']['bitrate_mode'] == 'abr') { - - // Set -b 128 on abr files - $info['audio']['encoder_options'] = '-b '.round($info['ogg']['bitrate_nominal'] / 1000); - - } elseif (($info['audio']['bitrate_mode'] == 'vbr') && ($info['audio']['channels'] == 2) && ($info['audio']['sample_rate'] >= 44100) && ($info['audio']['sample_rate'] <= 48000)) { - // Set -q N on vbr files - $info['audio']['encoder_options'] = '-q '.$this->get_quality_from_nominal_bitrate($info['ogg']['bitrate_nominal']); - - } - } - - if (empty($info['audio']['encoder_options']) && !empty($info['ogg']['bitrate_nominal'])) { - $info['audio']['encoder_options'] = 'Nominal bitrate: '.intval(round($info['ogg']['bitrate_nominal'] / 1000)).'kbps'; - } - } - } - - return true; - } - - public function ParseVorbisPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) { - $info = &$this->getid3->info; - $info['audio']['dataformat'] = 'vorbis'; - $info['audio']['lossless'] = false; - - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['packet_type'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['stream_type'] = substr($filedata, $filedataoffset, 6); // hard-coded to 'vorbis' - $filedataoffset += 6; - $info['ogg']['bitstreamversion'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['numberofchannels'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - $info['audio']['channels'] = $info['ogg']['numberofchannels']; - $info['ogg']['samplerate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - if ($info['ogg']['samplerate'] == 0) { - $info['error'][] = 'Corrupt Ogg file: sample rate == zero'; - return false; - } - $info['audio']['sample_rate'] = $info['ogg']['samplerate']; - $info['ogg']['samples'] = 0; // filled in later - $info['ogg']['bitrate_average'] = 0; // filled in later - $info['ogg']['bitrate_max'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['bitrate_nominal'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['bitrate_min'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $info['ogg']['blocksize_small'] = pow(2, getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0x0F); - $info['ogg']['blocksize_large'] = pow(2, (getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)) & 0xF0) >> 4); - $info['ogg']['stop_bit'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); // must be 1, marks end of packet - - $info['audio']['bitrate_mode'] = 'vbr'; // overridden if actually abr - if ($info['ogg']['bitrate_max'] == 0xFFFFFFFF) { - unset($info['ogg']['bitrate_max']); - $info['audio']['bitrate_mode'] = 'abr'; - } - if ($info['ogg']['bitrate_nominal'] == 0xFFFFFFFF) { - unset($info['ogg']['bitrate_nominal']); - } - if ($info['ogg']['bitrate_min'] == 0xFFFFFFFF) { - unset($info['ogg']['bitrate_min']); - $info['audio']['bitrate_mode'] = 'abr'; - } - return true; - } - - // http://tools.ietf.org/html/draft-ietf-codec-oggopus-03 - public function ParseOpusPageHeader(&$filedata, &$filedataoffset, &$oggpageinfo) { - $info = &$this->getid3->info; - $info['audio']['dataformat'] = 'opus'; - $info['mime_type'] = 'audio/ogg; codecs=opus'; - - /** @todo find a usable way to detect abr (vbr that is padded to be abr) */ - $info['audio']['bitrate_mode'] = 'vbr'; - - $info['audio']['lossless'] = false; - - $info['ogg']['pageheader']['opus']['opus_magic'] = substr($filedata, $filedataoffset, 8); // hard-coded to 'OpusHead' - $filedataoffset += 8; - $info['ogg']['pageheader']['opus']['version'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - - if ($info['ogg']['pageheader']['opus']['version'] < 1 || $info['ogg']['pageheader']['opus']['version'] > 15) { - $info['error'][] = 'Unknown opus version number (only accepting 1-15)'; - return false; - } - - $info['ogg']['pageheader']['opus']['out_channel_count'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - - if ($info['ogg']['pageheader']['opus']['out_channel_count'] == 0) { - $info['error'][] = 'Invalid channel count in opus header (must not be zero)'; - return false; - } - - $info['ogg']['pageheader']['opus']['pre_skip'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); - $filedataoffset += 2; - - $info['ogg']['pageheader']['opus']['sample_rate'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - - //$info['ogg']['pageheader']['opus']['output_gain'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 2)); - //$filedataoffset += 2; - - //$info['ogg']['pageheader']['opus']['channel_mapping_family'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); - //$filedataoffset += 1; - - $info['opus']['opus_version'] = $info['ogg']['pageheader']['opus']['version']; - $info['opus']['sample_rate'] = $info['ogg']['pageheader']['opus']['sample_rate']; - $info['opus']['out_channel_count'] = $info['ogg']['pageheader']['opus']['out_channel_count']; - - $info['audio']['channels'] = $info['opus']['out_channel_count']; - $info['audio']['sample_rate'] = $info['opus']['sample_rate']; - return true; - } - - - public function ParseOggPageHeader() { - // http://xiph.org/ogg/vorbis/doc/framing.html - $oggheader['page_start_offset'] = $this->ftell(); // where we started from in the file - - $filedata = $this->fread($this->getid3->fread_buffer_size()); - $filedataoffset = 0; - while ((substr($filedata, $filedataoffset++, 4) != 'OggS')) { - if (($this->ftell() - $oggheader['page_start_offset']) >= $this->getid3->fread_buffer_size()) { - // should be found before here - return false; - } - if ((($filedataoffset + 28) > strlen($filedata)) || (strlen($filedata) < 28)) { - if ($this->feof() || (($filedata .= $this->fread($this->getid3->fread_buffer_size())) === false)) { - // get some more data, unless eof, in which case fail - return false; - } - } - } - $filedataoffset += strlen('OggS') - 1; // page, delimited by 'OggS' - - $oggheader['stream_structver'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - $oggheader['flags_raw'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - $oggheader['flags']['fresh'] = (bool) ($oggheader['flags_raw'] & 0x01); // fresh packet - $oggheader['flags']['bos'] = (bool) ($oggheader['flags_raw'] & 0x02); // first page of logical bitstream (bos) - $oggheader['flags']['eos'] = (bool) ($oggheader['flags_raw'] & 0x04); // last page of logical bitstream (eos) - - $oggheader['pcm_abs_position'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 8)); - $filedataoffset += 8; - $oggheader['stream_serialno'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $oggheader['page_seqno'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $oggheader['page_checksum'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 4)); - $filedataoffset += 4; - $oggheader['page_segments'] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - $oggheader['page_length'] = 0; - for ($i = 0; $i < $oggheader['page_segments']; $i++) { - $oggheader['segment_table'][$i] = getid3_lib::LittleEndian2Int(substr($filedata, $filedataoffset, 1)); - $filedataoffset += 1; - $oggheader['page_length'] += $oggheader['segment_table'][$i]; - } - $oggheader['header_end_offset'] = $oggheader['page_start_offset'] + $filedataoffset; - $oggheader['page_end_offset'] = $oggheader['header_end_offset'] + $oggheader['page_length']; - $this->fseek($oggheader['header_end_offset']); - - return $oggheader; - } - - // http://xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810005 - public function ParseVorbisComments() { - $info = &$this->getid3->info; - - $OriginalOffset = $this->ftell(); - $commentdataoffset = 0; - $VorbisCommentPage = 1; - - switch ($info['audio']['dataformat']) { - case 'vorbis': - case 'speex': - case 'opus': - $CommentStartOffset = $info['ogg']['pageheader'][$VorbisCommentPage]['page_start_offset']; // Second Ogg page, after header block - $this->fseek($CommentStartOffset); - $commentdataoffset = 27 + $info['ogg']['pageheader'][$VorbisCommentPage]['page_segments']; - $commentdata = $this->fread(self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1) + $commentdataoffset); - - if ($info['audio']['dataformat'] == 'vorbis') { - $commentdataoffset += (strlen('vorbis') + 1); - } - else if ($info['audio']['dataformat'] == 'opus') { - $commentdataoffset += strlen('OpusTags'); - } - - break; - - case 'flac': - $CommentStartOffset = $info['flac']['VORBIS_COMMENT']['raw']['offset'] + 4; - $this->fseek($CommentStartOffset); - $commentdata = $this->fread($info['flac']['VORBIS_COMMENT']['raw']['block_length']); - break; - - default: - return false; - } - - $VendorSize = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); - $commentdataoffset += 4; - - $info['ogg']['vendor'] = substr($commentdata, $commentdataoffset, $VendorSize); - $commentdataoffset += $VendorSize; - - $CommentsCount = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); - $commentdataoffset += 4; - $info['avdataoffset'] = $CommentStartOffset + $commentdataoffset; - - $basicfields = array('TITLE', 'ARTIST', 'ALBUM', 'TRACKNUMBER', 'GENRE', 'DATE', 'DESCRIPTION', 'COMMENT'); - $ThisFileInfo_ogg_comments_raw = &$info['ogg']['comments_raw']; - for ($i = 0; $i < $CommentsCount; $i++) { - - if ($i >= 10000) { - // https://github.com/owncloud/music/issues/212#issuecomment-43082336 - $info['warning'][] = 'Unexpectedly large number ('.$CommentsCount.') of Ogg comments - breaking after reading '.$i.' comments'; - break; - } - - $ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] = $CommentStartOffset + $commentdataoffset; - - if ($this->ftell() < ($ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + 4)) { - if ($oggpageinfo = $this->ParseOggPageHeader()) { - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; - - $VorbisCommentPage++; - - // First, save what we haven't read yet - $AsYetUnusedData = substr($commentdata, $commentdataoffset); - - // Then take that data off the end - $commentdata = substr($commentdata, 0, $commentdataoffset); - - // Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct - $commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); - $commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); - - // Finally, stick the unused data back on the end - $commentdata .= $AsYetUnusedData; - - //$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); - $commentdata .= $this->fread($this->OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1)); - } - - } - $ThisFileInfo_ogg_comments_raw[$i]['size'] = getid3_lib::LittleEndian2Int(substr($commentdata, $commentdataoffset, 4)); - - // replace avdataoffset with position just after the last vorbiscomment - $info['avdataoffset'] = $ThisFileInfo_ogg_comments_raw[$i]['dataoffset'] + $ThisFileInfo_ogg_comments_raw[$i]['size'] + 4; - - $commentdataoffset += 4; - while ((strlen($commentdata) - $commentdataoffset) < $ThisFileInfo_ogg_comments_raw[$i]['size']) { - if (($ThisFileInfo_ogg_comments_raw[$i]['size'] > $info['avdataend']) || ($ThisFileInfo_ogg_comments_raw[$i]['size'] < 0)) { - $info['warning'][] = 'Invalid Ogg comment size (comment #'.$i.', claims to be '.number_format($ThisFileInfo_ogg_comments_raw[$i]['size']).' bytes) - aborting reading comments'; - break 2; - } - - $VorbisCommentPage++; - - $oggpageinfo = $this->ParseOggPageHeader(); - $info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo; - - // First, save what we haven't read yet - $AsYetUnusedData = substr($commentdata, $commentdataoffset); - - // Then take that data off the end - $commentdata = substr($commentdata, 0, $commentdataoffset); - - // Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct - $commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); - $commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']); - - // Finally, stick the unused data back on the end - $commentdata .= $AsYetUnusedData; - - //$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']); - if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) { - $info['warning'][] = 'undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell(); - break; - } - $readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1); - if ($readlength <= 0) { - $info['warning'][] = 'invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell(); - break; - } - $commentdata .= $this->fread($readlength); - - //$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset']; - } - $ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset; - $commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']); - $commentdataoffset += $ThisFileInfo_ogg_comments_raw[$i]['size']; - - if (!$commentstring) { - - // no comment? - $info['warning'][] = 'Blank Ogg comment ['.$i.']'; - - } elseif (strstr($commentstring, '=')) { - - $commentexploded = explode('=', $commentstring, 2); - $ThisFileInfo_ogg_comments_raw[$i]['key'] = strtoupper($commentexploded[0]); - $ThisFileInfo_ogg_comments_raw[$i]['value'] = (isset($commentexploded[1]) ? $commentexploded[1] : ''); - - if ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'METADATA_BLOCK_PICTURE') { - - // http://wiki.xiph.org/VorbisComment#METADATA_BLOCK_PICTURE - // The unencoded format is that of the FLAC picture block. The fields are stored in big endian order as in FLAC, picture data is stored according to the relevant standard. - // http://flac.sourceforge.net/format.html#metadata_block_picture - $flac = new getid3_flac($this->getid3); - $flac->setStringMode(base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value'])); - $flac->parsePICTURE(); - $info['ogg']['comments']['picture'][] = $flac->getid3->info['flac']['PICTURE'][0]; - unset($flac); - - } elseif ($ThisFileInfo_ogg_comments_raw[$i]['key'] == 'COVERART') { - - $data = base64_decode($ThisFileInfo_ogg_comments_raw[$i]['value']); - $this->notice('Found deprecated COVERART tag, it should be replaced in honor of METADATA_BLOCK_PICTURE structure'); - /** @todo use 'coverartmime' where available */ - $imageinfo = getid3_lib::GetDataImageSize($data); - if ($imageinfo === false || !isset($imageinfo['mime'])) { - $this->warning('COVERART vorbiscomment tag contains invalid image'); - continue; - } - - $ogg = new self($this->getid3); - $ogg->setStringMode($data); - $info['ogg']['comments']['picture'][] = array( - 'image_mime' => $imageinfo['mime'], - 'datalength' => strlen($data), - 'picturetype' => 'cover art', - 'image_height' => $imageinfo['height'], - 'image_width' => $imageinfo['width'], - 'data' => $ogg->saveAttachment('coverart', 0, strlen($data), $imageinfo['mime']), - ); - unset($ogg); - - } else { - - $info['ogg']['comments'][strtolower($ThisFileInfo_ogg_comments_raw[$i]['key'])][] = $ThisFileInfo_ogg_comments_raw[$i]['value']; - - } - - } else { - - $info['warning'][] = '[known problem with CDex >= v1.40, < v1.50b7] Invalid Ogg comment name/value pair ['.$i.']: '.$commentstring; - - } - unset($ThisFileInfo_ogg_comments_raw[$i]); - } - unset($ThisFileInfo_ogg_comments_raw); - - - // Replay Gain Adjustment - // http://privatewww.essex.ac.uk/~djmrob/replaygain/ - if (isset($info['ogg']['comments']) && is_array($info['ogg']['comments'])) { - foreach ($info['ogg']['comments'] as $index => $commentvalue) { - switch ($index) { - case 'rg_audiophile': - case 'replaygain_album_gain': - $info['replay_gain']['album']['adjustment'] = (double) $commentvalue[0]; - unset($info['ogg']['comments'][$index]); - break; - - case 'rg_radio': - case 'replaygain_track_gain': - $info['replay_gain']['track']['adjustment'] = (double) $commentvalue[0]; - unset($info['ogg']['comments'][$index]); - break; - - case 'replaygain_album_peak': - $info['replay_gain']['album']['peak'] = (double) $commentvalue[0]; - unset($info['ogg']['comments'][$index]); - break; - - case 'rg_peak': - case 'replaygain_track_peak': - $info['replay_gain']['track']['peak'] = (double) $commentvalue[0]; - unset($info['ogg']['comments'][$index]); - break; - - case 'replaygain_reference_loudness': - $info['replay_gain']['reference_volume'] = (double) $commentvalue[0]; - unset($info['ogg']['comments'][$index]); - break; - - default: - // do nothing - break; - } - } - } - - $this->fseek($OriginalOffset); - - return true; - } - - public static function SpeexBandModeLookup($mode) { - static $SpeexBandModeLookup = array(); - if (empty($SpeexBandModeLookup)) { - $SpeexBandModeLookup[0] = 'narrow'; - $SpeexBandModeLookup[1] = 'wide'; - $SpeexBandModeLookup[2] = 'ultra-wide'; - } - return (isset($SpeexBandModeLookup[$mode]) ? $SpeexBandModeLookup[$mode] : null); - } - - - public static function OggPageSegmentLength($OggInfoArray, $SegmentNumber=1) { - for ($i = 0; $i < $SegmentNumber; $i++) { - $segmentlength = 0; - foreach ($OggInfoArray['segment_table'] as $key => $value) { - $segmentlength += $value; - if ($value < 255) { - break; - } - } - } - return $segmentlength; - } - - - public static function get_quality_from_nominal_bitrate($nominal_bitrate) { - - // decrease precision - $nominal_bitrate = $nominal_bitrate / 1000; - - if ($nominal_bitrate < 128) { - // q-1 to q4 - $qval = ($nominal_bitrate - 64) / 16; - } elseif ($nominal_bitrate < 256) { - // q4 to q8 - $qval = $nominal_bitrate / 32; - } elseif ($nominal_bitrate < 320) { - // q8 to q9 - $qval = ($nominal_bitrate + 256) / 64; - } else { - // q9 to q10 - $qval = ($nominal_bitrate + 1300) / 180; - } - //return $qval; // 5.031324 - //return intval($qval); // 5 - return round($qval, 1); // 5 or 4.9 - } - - public static function TheoraColorSpace($colorspace_id) { - // http://www.theora.org/doc/Theora.pdf (table 6.3) - static $TheoraColorSpaceLookup = array(); - if (empty($TheoraColorSpaceLookup)) { - $TheoraColorSpaceLookup[0] = 'Undefined'; - $TheoraColorSpaceLookup[1] = 'Rec. 470M'; - $TheoraColorSpaceLookup[2] = 'Rec. 470BG'; - $TheoraColorSpaceLookup[3] = 'Reserved'; - } - return (isset($TheoraColorSpaceLookup[$colorspace_id]) ? $TheoraColorSpaceLookup[$colorspace_id] : null); - } - - public static function TheoraPixelFormat($pixelformat_id) { - // http://www.theora.org/doc/Theora.pdf (table 6.4) - static $TheoraPixelFormatLookup = array(); - if (empty($TheoraPixelFormatLookup)) { - $TheoraPixelFormatLookup[0] = '4:2:0'; - $TheoraPixelFormatLookup[1] = 'Reserved'; - $TheoraPixelFormatLookup[2] = '4:2:2'; - $TheoraPixelFormatLookup[3] = '4:4:4'; - } - return (isset($TheoraPixelFormatLookup[$pixelformat_id]) ? $TheoraPixelFormatLookup[$pixelformat_id] : null); - } - -} diff --git a/wp/wp-includes/ID3/module.tag.apetag.php b/wp/wp-includes/ID3/module.tag.apetag.php deleted file mode 100644 index 724b8b0f..00000000 --- a/wp/wp-includes/ID3/module.tag.apetag.php +++ /dev/null @@ -1,412 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// -// See readme.txt for more details // -///////////////////////////////////////////////////////////////// -// // -// module.tag.apetag.php // -// module for analyzing APE tags // -// dependencies: NONE // -// /// -///////////////////////////////////////////////////////////////// - -class getid3_apetag extends getid3_handler -{ - public $inline_attachments = true; // true: return full data for all attachments; false: return no data for all attachments; integer: return data for attachments <= than this; string: save as file to this directory - public $overrideendoffset = 0; - - public function Analyze() { - $info = &$this->getid3->info; - - if (!getid3_lib::intValueSupported($info['filesize'])) { - $info['warning'][] = 'Unable to check for APEtags because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'; - return false; - } - - $id3v1tagsize = 128; - $apetagheadersize = 32; - $lyrics3tagsize = 10; - - if ($this->overrideendoffset == 0) { - - $this->fseek(0 - $id3v1tagsize - $apetagheadersize - $lyrics3tagsize, SEEK_END); - $APEfooterID3v1 = $this->fread($id3v1tagsize + $apetagheadersize + $lyrics3tagsize); - - //if (preg_match('/APETAGEX.{24}TAG.{125}$/i', $APEfooterID3v1)) { - if (substr($APEfooterID3v1, strlen($APEfooterID3v1) - $id3v1tagsize - $apetagheadersize, 8) == 'APETAGEX') { - - // APE tag found before ID3v1 - $info['ape']['tag_offset_end'] = $info['filesize'] - $id3v1tagsize; - - //} elseif (preg_match('/APETAGEX.{24}$/i', $APEfooterID3v1)) { - } elseif (substr($APEfooterID3v1, strlen($APEfooterID3v1) - $apetagheadersize, 8) == 'APETAGEX') { - - // APE tag found, no ID3v1 - $info['ape']['tag_offset_end'] = $info['filesize']; - - } - - } else { - - $this->fseek($this->overrideendoffset - $apetagheadersize); - if ($this->fread(8) == 'APETAGEX') { - $info['ape']['tag_offset_end'] = $this->overrideendoffset; - } - - } - if (!isset($info['ape']['tag_offset_end'])) { - - // APE tag not found - unset($info['ape']); - return false; - - } - - // shortcut - $thisfile_ape = &$info['ape']; - - $this->fseek($thisfile_ape['tag_offset_end'] - $apetagheadersize); - $APEfooterData = $this->fread(32); - if (!($thisfile_ape['footer'] = $this->parseAPEheaderFooter($APEfooterData))) { - $info['error'][] = 'Error parsing APE footer at offset '.$thisfile_ape['tag_offset_end']; - return false; - } - - if (isset($thisfile_ape['footer']['flags']['header']) && $thisfile_ape['footer']['flags']['header']) { - $this->fseek($thisfile_ape['tag_offset_end'] - $thisfile_ape['footer']['raw']['tagsize'] - $apetagheadersize); - $thisfile_ape['tag_offset_start'] = $this->ftell(); - $APEtagData = $this->fread($thisfile_ape['footer']['raw']['tagsize'] + $apetagheadersize); - } else { - $thisfile_ape['tag_offset_start'] = $thisfile_ape['tag_offset_end'] - $thisfile_ape['footer']['raw']['tagsize']; - $this->fseek($thisfile_ape['tag_offset_start']); - $APEtagData = $this->fread($thisfile_ape['footer']['raw']['tagsize']); - } - $info['avdataend'] = $thisfile_ape['tag_offset_start']; - - if (isset($info['id3v1']['tag_offset_start']) && ($info['id3v1']['tag_offset_start'] < $thisfile_ape['tag_offset_end'])) { - $info['warning'][] = 'ID3v1 tag information ignored since it appears to be a false synch in APEtag data'; - unset($info['id3v1']); - foreach ($info['warning'] as $key => $value) { - if ($value == 'Some ID3v1 fields do not use NULL characters for padding') { - unset($info['warning'][$key]); - sort($info['warning']); - break; - } - } - } - - $offset = 0; - if (isset($thisfile_ape['footer']['flags']['header']) && $thisfile_ape['footer']['flags']['header']) { - if ($thisfile_ape['header'] = $this->parseAPEheaderFooter(substr($APEtagData, 0, $apetagheadersize))) { - $offset += $apetagheadersize; - } else { - $info['error'][] = 'Error parsing APE header at offset '.$thisfile_ape['tag_offset_start']; - return false; - } - } - - // shortcut - $info['replay_gain'] = array(); - $thisfile_replaygain = &$info['replay_gain']; - - for ($i = 0; $i < $thisfile_ape['footer']['raw']['tag_items']; $i++) { - $value_size = getid3_lib::LittleEndian2Int(substr($APEtagData, $offset, 4)); - $offset += 4; - $item_flags = getid3_lib::LittleEndian2Int(substr($APEtagData, $offset, 4)); - $offset += 4; - if (strstr(substr($APEtagData, $offset), "\x00") === false) { - $info['error'][] = 'Cannot find null-byte (0x00) seperator between ItemKey #'.$i.' and value. ItemKey starts '.$offset.' bytes into the APE tag, at file offset '.($thisfile_ape['tag_offset_start'] + $offset); - return false; - } - $ItemKeyLength = strpos($APEtagData, "\x00", $offset) - $offset; - $item_key = strtolower(substr($APEtagData, $offset, $ItemKeyLength)); - - // shortcut - $thisfile_ape['items'][$item_key] = array(); - $thisfile_ape_items_current = &$thisfile_ape['items'][$item_key]; - - $thisfile_ape_items_current['offset'] = $thisfile_ape['tag_offset_start'] + $offset; - - $offset += ($ItemKeyLength + 1); // skip 0x00 terminator - $thisfile_ape_items_current['data'] = substr($APEtagData, $offset, $value_size); - $offset += $value_size; - - $thisfile_ape_items_current['flags'] = $this->parseAPEtagFlags($item_flags); - switch ($thisfile_ape_items_current['flags']['item_contents_raw']) { - case 0: // UTF-8 - case 2: // Locator (URL, filename, etc), UTF-8 encoded - $thisfile_ape_items_current['data'] = explode("\x00", $thisfile_ape_items_current['data']); - break; - - case 1: // binary data - default: - break; - } - - switch (strtolower($item_key)) { - // http://wiki.hydrogenaud.io/index.php?title=ReplayGain#MP3Gain - case 'replaygain_track_gain': - if (preg_match('#^[\\-\\+][0-9\\.,]{8}$#', $thisfile_ape_items_current['data'][0])) { - $thisfile_replaygain['track']['adjustment'] = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see "0,95" as zero! - $thisfile_replaygain['track']['originator'] = 'unspecified'; - } else { - $info['warning'][] = 'MP3gainTrackGain value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'; - } - break; - - case 'replaygain_track_peak': - if (preg_match('#^[0-9\\.,]{8}$#', $thisfile_ape_items_current['data'][0])) { - $thisfile_replaygain['track']['peak'] = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see "0,95" as zero! - $thisfile_replaygain['track']['originator'] = 'unspecified'; - if ($thisfile_replaygain['track']['peak'] <= 0) { - $info['warning'][] = 'ReplayGain Track peak from APEtag appears invalid: '.$thisfile_replaygain['track']['peak'].' (original value = "'.$thisfile_ape_items_current['data'][0].'")'; - } - } else { - $info['warning'][] = 'MP3gainTrackPeak value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'; - } - break; - - case 'replaygain_album_gain': - if (preg_match('#^[\\-\\+][0-9\\.,]{8}$#', $thisfile_ape_items_current['data'][0])) { - $thisfile_replaygain['album']['adjustment'] = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see "0,95" as zero! - $thisfile_replaygain['album']['originator'] = 'unspecified'; - } else { - $info['warning'][] = 'MP3gainAlbumGain value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'; - } - break; - - case 'replaygain_album_peak': - if (preg_match('#^[0-9\\.,]{8}$#', $thisfile_ape_items_current['data'][0])) { - $thisfile_replaygain['album']['peak'] = (float) str_replace(',', '.', $thisfile_ape_items_current['data'][0]); // float casting will see "0,95" as zero! - $thisfile_replaygain['album']['originator'] = 'unspecified'; - if ($thisfile_replaygain['album']['peak'] <= 0) { - $info['warning'][] = 'ReplayGain Album peak from APEtag appears invalid: '.$thisfile_replaygain['album']['peak'].' (original value = "'.$thisfile_ape_items_current['data'][0].'")'; - } - } else { - $info['warning'][] = 'MP3gainAlbumPeak value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'; - } - break; - - case 'mp3gain_undo': - if (preg_match('#^[\\-\\+][0-9]{3},[\\-\\+][0-9]{3},[NW]$#', $thisfile_ape_items_current['data'][0])) { - list($mp3gain_undo_left, $mp3gain_undo_right, $mp3gain_undo_wrap) = explode(',', $thisfile_ape_items_current['data'][0]); - $thisfile_replaygain['mp3gain']['undo_left'] = intval($mp3gain_undo_left); - $thisfile_replaygain['mp3gain']['undo_right'] = intval($mp3gain_undo_right); - $thisfile_replaygain['mp3gain']['undo_wrap'] = (($mp3gain_undo_wrap == 'Y') ? true : false); - } else { - $info['warning'][] = 'MP3gainUndo value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'; - } - break; - - case 'mp3gain_minmax': - if (preg_match('#^[0-9]{3},[0-9]{3}$#', $thisfile_ape_items_current['data'][0])) { - list($mp3gain_globalgain_min, $mp3gain_globalgain_max) = explode(',', $thisfile_ape_items_current['data'][0]); - $thisfile_replaygain['mp3gain']['globalgain_track_min'] = intval($mp3gain_globalgain_min); - $thisfile_replaygain['mp3gain']['globalgain_track_max'] = intval($mp3gain_globalgain_max); - } else { - $info['warning'][] = 'MP3gainMinMax value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'; - } - break; - - case 'mp3gain_album_minmax': - if (preg_match('#^[0-9]{3},[0-9]{3}$#', $thisfile_ape_items_current['data'][0])) { - list($mp3gain_globalgain_album_min, $mp3gain_globalgain_album_max) = explode(',', $thisfile_ape_items_current['data'][0]); - $thisfile_replaygain['mp3gain']['globalgain_album_min'] = intval($mp3gain_globalgain_album_min); - $thisfile_replaygain['mp3gain']['globalgain_album_max'] = intval($mp3gain_globalgain_album_max); - } else { - $info['warning'][] = 'MP3gainAlbumMinMax value in APEtag appears invalid: "'.$thisfile_ape_items_current['data'][0].'"'; - } - break; - - case 'tracknumber': - if (is_array($thisfile_ape_items_current['data'])) { - foreach ($thisfile_ape_items_current['data'] as $comment) { - $thisfile_ape['comments']['track'][] = $comment; - } - } - break; - - case 'cover art (artist)': - case 'cover art (back)': - case 'cover art (band logo)': - case 'cover art (band)': - case 'cover art (colored fish)': - case 'cover art (composer)': - case 'cover art (conductor)': - case 'cover art (front)': - case 'cover art (icon)': - case 'cover art (illustration)': - case 'cover art (lead)': - case 'cover art (leaflet)': - case 'cover art (lyricist)': - case 'cover art (media)': - case 'cover art (movie scene)': - case 'cover art (other icon)': - case 'cover art (other)': - case 'cover art (performance)': - case 'cover art (publisher logo)': - case 'cover art (recording)': - case 'cover art (studio)': - // list of possible cover arts from http://taglib-sharp.sourcearchive.com/documentation/2.0.3.0-2/Ape_2Tag_8cs-source.html - if (is_array($thisfile_ape_items_current['data'])) { - $info['warning'][] = 'APEtag "'.$item_key.'" should be flagged as Binary data, but was incorrectly flagged as UTF-8'; - $thisfile_ape_items_current['data'] = implode("\x00", $thisfile_ape_items_current['data']); - } - list($thisfile_ape_items_current['filename'], $thisfile_ape_items_current['data']) = explode("\x00", $thisfile_ape_items_current['data'], 2); - $thisfile_ape_items_current['data_offset'] = $thisfile_ape_items_current['offset'] + strlen($thisfile_ape_items_current['filename']."\x00"); - $thisfile_ape_items_current['data_length'] = strlen($thisfile_ape_items_current['data']); - - $thisfile_ape_items_current['image_mime'] = ''; - $imageinfo = array(); - $imagechunkcheck = getid3_lib::GetDataImageSize($thisfile_ape_items_current['data'], $imageinfo); - $thisfile_ape_items_current['image_mime'] = image_type_to_mime_type($imagechunkcheck[2]); - - do { - if ($this->inline_attachments === false) { - // skip entirely - unset($thisfile_ape_items_current['data']); - break; - } - if ($this->inline_attachments === true) { - // great - } elseif (is_int($this->inline_attachments)) { - if ($this->inline_attachments < $thisfile_ape_items_current['data_length']) { - // too big, skip - $info['warning'][] = 'attachment at '.$thisfile_ape_items_current['offset'].' is too large to process inline ('.number_format($thisfile_ape_items_current['data_length']).' bytes)'; - unset($thisfile_ape_items_current['data']); - break; - } - } elseif (is_string($this->inline_attachments)) { - $this->inline_attachments = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->inline_attachments), DIRECTORY_SEPARATOR); - if (!is_dir($this->inline_attachments) || !is_writable($this->inline_attachments)) { - // cannot write, skip - $info['warning'][] = 'attachment at '.$thisfile_ape_items_current['offset'].' cannot be saved to "'.$this->inline_attachments.'" (not writable)'; - unset($thisfile_ape_items_current['data']); - break; - } - } - // if we get this far, must be OK - if (is_string($this->inline_attachments)) { - $destination_filename = $this->inline_attachments.DIRECTORY_SEPARATOR.md5($info['filenamepath']).'_'.$thisfile_ape_items_current['data_offset']; - if (!file_exists($destination_filename) || is_writable($destination_filename)) { - file_put_contents($destination_filename, $thisfile_ape_items_current['data']); - } else { - $info['warning'][] = 'attachment at '.$thisfile_ape_items_current['offset'].' cannot be saved to "'.$destination_filename.'" (not writable)'; - } - $thisfile_ape_items_current['data_filename'] = $destination_filename; - unset($thisfile_ape_items_current['data']); - } else { - if (!isset($info['ape']['comments']['picture'])) { - $info['ape']['comments']['picture'] = array(); - } - $comments_picture_data = array(); - foreach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) { - if (isset($thisfile_ape_items_current[$picture_key])) { - $comments_picture_data[$picture_key] = $thisfile_ape_items_current[$picture_key]; - } - } - $info['ape']['comments']['picture'][] = $comments_picture_data; - unset($comments_picture_data); - } - } while (false); - break; - - default: - if (is_array($thisfile_ape_items_current['data'])) { - foreach ($thisfile_ape_items_current['data'] as $comment) { - $thisfile_ape['comments'][strtolower($item_key)][] = $comment; - } - } - break; - } - - } - if (empty($thisfile_replaygain)) { - unset($info['replay_gain']); - } - return true; - } - - public function parseAPEheaderFooter($APEheaderFooterData) { - // http://www.uni-jena.de/~pfk/mpp/sv8/apeheader.html - - // shortcut - $headerfooterinfo['raw'] = array(); - $headerfooterinfo_raw = &$headerfooterinfo['raw']; - - $headerfooterinfo_raw['footer_tag'] = substr($APEheaderFooterData, 0, 8); - if ($headerfooterinfo_raw['footer_tag'] != 'APETAGEX') { - return false; - } - $headerfooterinfo_raw['version'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 8, 4)); - $headerfooterinfo_raw['tagsize'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 12, 4)); - $headerfooterinfo_raw['tag_items'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 16, 4)); - $headerfooterinfo_raw['global_flags'] = getid3_lib::LittleEndian2Int(substr($APEheaderFooterData, 20, 4)); - $headerfooterinfo_raw['reserved'] = substr($APEheaderFooterData, 24, 8); - - $headerfooterinfo['tag_version'] = $headerfooterinfo_raw['version'] / 1000; - if ($headerfooterinfo['tag_version'] >= 2) { - $headerfooterinfo['flags'] = $this->parseAPEtagFlags($headerfooterinfo_raw['global_flags']); - } - return $headerfooterinfo; - } - - public function parseAPEtagFlags($rawflagint) { - // "Note: APE Tags 1.0 do not use any of the APE Tag flags. - // All are set to zero on creation and ignored on reading." - // http://wiki.hydrogenaud.io/index.php?title=Ape_Tags_Flags - $flags['header'] = (bool) ($rawflagint & 0x80000000); - $flags['footer'] = (bool) ($rawflagint & 0x40000000); - $flags['this_is_header'] = (bool) ($rawflagint & 0x20000000); - $flags['item_contents_raw'] = ($rawflagint & 0x00000006) >> 1; - $flags['read_only'] = (bool) ($rawflagint & 0x00000001); - - $flags['item_contents'] = $this->APEcontentTypeFlagLookup($flags['item_contents_raw']); - - return $flags; - } - - public function APEcontentTypeFlagLookup($contenttypeid) { - static $APEcontentTypeFlagLookup = array( - 0 => 'utf-8', - 1 => 'binary', - 2 => 'external', - 3 => 'reserved' - ); - return (isset($APEcontentTypeFlagLookup[$contenttypeid]) ? $APEcontentTypeFlagLookup[$contenttypeid] : 'invalid'); - } - - public function APEtagItemIsUTF8Lookup($itemkey) { - static $APEtagItemIsUTF8Lookup = array( - 'title', - 'subtitle', - 'artist', - 'album', - 'debut album', - 'publisher', - 'conductor', - 'track', - 'composer', - 'comment', - 'copyright', - 'publicationright', - 'file', - 'year', - 'record date', - 'record location', - 'genre', - 'media', - 'related', - 'isrc', - 'abstract', - 'language', - 'bibliography' - ); - return in_array(strtolower($itemkey), $APEtagItemIsUTF8Lookup); - } - -} diff --git a/wp/wp-includes/ID3/module.tag.id3v1.php b/wp/wp-includes/ID3/module.tag.id3v1.php deleted file mode 100644 index 3b4edfd2..00000000 --- a/wp/wp-includes/ID3/module.tag.id3v1.php +++ /dev/null @@ -1,360 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// -// See readme.txt for more details // -///////////////////////////////////////////////////////////////// -// // -// module.tag.id3v1.php // -// module for analyzing ID3v1 tags // -// dependencies: NONE // -// /// -///////////////////////////////////////////////////////////////// - - -class getid3_id3v1 extends getid3_handler -{ - - public function Analyze() { - $info = &$this->getid3->info; - - if (!getid3_lib::intValueSupported($info['filesize'])) { - $info['warning'][] = 'Unable to check for ID3v1 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'; - return false; - } - - $this->fseek(-256, SEEK_END); - $preid3v1 = $this->fread(128); - $id3v1tag = $this->fread(128); - - if (substr($id3v1tag, 0, 3) == 'TAG') { - - $info['avdataend'] = $info['filesize'] - 128; - - $ParsedID3v1['title'] = $this->cutfield(substr($id3v1tag, 3, 30)); - $ParsedID3v1['artist'] = $this->cutfield(substr($id3v1tag, 33, 30)); - $ParsedID3v1['album'] = $this->cutfield(substr($id3v1tag, 63, 30)); - $ParsedID3v1['year'] = $this->cutfield(substr($id3v1tag, 93, 4)); - $ParsedID3v1['comment'] = substr($id3v1tag, 97, 30); // can't remove nulls yet, track detection depends on them - $ParsedID3v1['genreid'] = ord(substr($id3v1tag, 127, 1)); - - // If second-last byte of comment field is null and last byte of comment field is non-null - // then this is ID3v1.1 and the comment field is 28 bytes long and the 30th byte is the track number - if (($id3v1tag{125} === "\x00") && ($id3v1tag{126} !== "\x00")) { - $ParsedID3v1['track'] = ord(substr($ParsedID3v1['comment'], 29, 1)); - $ParsedID3v1['comment'] = substr($ParsedID3v1['comment'], 0, 28); - } - $ParsedID3v1['comment'] = $this->cutfield($ParsedID3v1['comment']); - - $ParsedID3v1['genre'] = $this->LookupGenreName($ParsedID3v1['genreid']); - if (!empty($ParsedID3v1['genre'])) { - unset($ParsedID3v1['genreid']); - } - if (isset($ParsedID3v1['genre']) && (empty($ParsedID3v1['genre']) || ($ParsedID3v1['genre'] == 'Unknown'))) { - unset($ParsedID3v1['genre']); - } - - foreach ($ParsedID3v1 as $key => $value) { - $ParsedID3v1['comments'][$key][0] = $value; - } - - // ID3v1 data is supposed to be padded with NULL characters, but some taggers pad with spaces - $GoodFormatID3v1tag = $this->GenerateID3v1Tag( - $ParsedID3v1['title'], - $ParsedID3v1['artist'], - $ParsedID3v1['album'], - $ParsedID3v1['year'], - (isset($ParsedID3v1['genre']) ? $this->LookupGenreID($ParsedID3v1['genre']) : false), - $ParsedID3v1['comment'], - (!empty($ParsedID3v1['track']) ? $ParsedID3v1['track'] : '')); - $ParsedID3v1['padding_valid'] = true; - if ($id3v1tag !== $GoodFormatID3v1tag) { - $ParsedID3v1['padding_valid'] = false; - $info['warning'][] = 'Some ID3v1 fields do not use NULL characters for padding'; - } - - $ParsedID3v1['tag_offset_end'] = $info['filesize']; - $ParsedID3v1['tag_offset_start'] = $ParsedID3v1['tag_offset_end'] - 128; - - $info['id3v1'] = $ParsedID3v1; - } - - if (substr($preid3v1, 0, 3) == 'TAG') { - // The way iTunes handles tags is, well, brain-damaged. - // It completely ignores v1 if ID3v2 is present. - // This goes as far as adding a new v1 tag *even if there already is one* - - // A suspected double-ID3v1 tag has been detected, but it could be that - // the "TAG" identifier is a legitimate part of an APE or Lyrics3 tag - if (substr($preid3v1, 96, 8) == 'APETAGEX') { - // an APE tag footer was found before the last ID3v1, assume false "TAG" synch - } elseif (substr($preid3v1, 119, 6) == 'LYRICS') { - // a Lyrics3 tag footer was found before the last ID3v1, assume false "TAG" synch - } else { - // APE and Lyrics3 footers not found - assume double ID3v1 - $info['warning'][] = 'Duplicate ID3v1 tag detected - this has been known to happen with iTunes'; - $info['avdataend'] -= 128; - } - } - - return true; - } - - public static function cutfield($str) { - return trim(substr($str, 0, strcspn($str, "\x00"))); - } - - public static function ArrayOfGenres($allowSCMPXextended=false) { - static $GenreLookup = array( - 0 => 'Blues', - 1 => 'Classic Rock', - 2 => 'Country', - 3 => 'Dance', - 4 => 'Disco', - 5 => 'Funk', - 6 => 'Grunge', - 7 => 'Hip-Hop', - 8 => 'Jazz', - 9 => 'Metal', - 10 => 'New Age', - 11 => 'Oldies', - 12 => 'Other', - 13 => 'Pop', - 14 => 'R&B', - 15 => 'Rap', - 16 => 'Reggae', - 17 => 'Rock', - 18 => 'Techno', - 19 => 'Industrial', - 20 => 'Alternative', - 21 => 'Ska', - 22 => 'Death Metal', - 23 => 'Pranks', - 24 => 'Soundtrack', - 25 => 'Euro-Techno', - 26 => 'Ambient', - 27 => 'Trip-Hop', - 28 => 'Vocal', - 29 => 'Jazz+Funk', - 30 => 'Fusion', - 31 => 'Trance', - 32 => 'Classical', - 33 => 'Instrumental', - 34 => 'Acid', - 35 => 'House', - 36 => 'Game', - 37 => 'Sound Clip', - 38 => 'Gospel', - 39 => 'Noise', - 40 => 'Alt. Rock', - 41 => 'Bass', - 42 => 'Soul', - 43 => 'Punk', - 44 => 'Space', - 45 => 'Meditative', - 46 => 'Instrumental Pop', - 47 => 'Instrumental Rock', - 48 => 'Ethnic', - 49 => 'Gothic', - 50 => 'Darkwave', - 51 => 'Techno-Industrial', - 52 => 'Electronic', - 53 => 'Pop-Folk', - 54 => 'Eurodance', - 55 => 'Dream', - 56 => 'Southern Rock', - 57 => 'Comedy', - 58 => 'Cult', - 59 => 'Gangsta Rap', - 60 => 'Top 40', - 61 => 'Christian Rap', - 62 => 'Pop/Funk', - 63 => 'Jungle', - 64 => 'Native American', - 65 => 'Cabaret', - 66 => 'New Wave', - 67 => 'Psychedelic', - 68 => 'Rave', - 69 => 'Showtunes', - 70 => 'Trailer', - 71 => 'Lo-Fi', - 72 => 'Tribal', - 73 => 'Acid Punk', - 74 => 'Acid Jazz', - 75 => 'Polka', - 76 => 'Retro', - 77 => 'Musical', - 78 => 'Rock & Roll', - 79 => 'Hard Rock', - 80 => 'Folk', - 81 => 'Folk/Rock', - 82 => 'National Folk', - 83 => 'Swing', - 84 => 'Fast-Fusion', - 85 => 'Bebob', - 86 => 'Latin', - 87 => 'Revival', - 88 => 'Celtic', - 89 => 'Bluegrass', - 90 => 'Avantgarde', - 91 => 'Gothic Rock', - 92 => 'Progressive Rock', - 93 => 'Psychedelic Rock', - 94 => 'Symphonic Rock', - 95 => 'Slow Rock', - 96 => 'Big Band', - 97 => 'Chorus', - 98 => 'Easy Listening', - 99 => 'Acoustic', - 100 => 'Humour', - 101 => 'Speech', - 102 => 'Chanson', - 103 => 'Opera', - 104 => 'Chamber Music', - 105 => 'Sonata', - 106 => 'Symphony', - 107 => 'Booty Bass', - 108 => 'Primus', - 109 => 'Porn Groove', - 110 => 'Satire', - 111 => 'Slow Jam', - 112 => 'Club', - 113 => 'Tango', - 114 => 'Samba', - 115 => 'Folklore', - 116 => 'Ballad', - 117 => 'Power Ballad', - 118 => 'Rhythmic Soul', - 119 => 'Freestyle', - 120 => 'Duet', - 121 => 'Punk Rock', - 122 => 'Drum Solo', - 123 => 'A Cappella', - 124 => 'Euro-House', - 125 => 'Dance Hall', - 126 => 'Goa', - 127 => 'Drum & Bass', - 128 => 'Club-House', - 129 => 'Hardcore', - 130 => 'Terror', - 131 => 'Indie', - 132 => 'BritPop', - 133 => 'Negerpunk', - 134 => 'Polsk Punk', - 135 => 'Beat', - 136 => 'Christian Gangsta Rap', - 137 => 'Heavy Metal', - 138 => 'Black Metal', - 139 => 'Crossover', - 140 => 'Contemporary Christian', - 141 => 'Christian Rock', - 142 => 'Merengue', - 143 => 'Salsa', - 144 => 'Thrash Metal', - 145 => 'Anime', - 146 => 'JPop', - 147 => 'Synthpop', - - 255 => 'Unknown', - - 'CR' => 'Cover', - 'RX' => 'Remix' - ); - - static $GenreLookupSCMPX = array(); - if ($allowSCMPXextended && empty($GenreLookupSCMPX)) { - $GenreLookupSCMPX = $GenreLookup; - // http://www.geocities.co.jp/SiliconValley-Oakland/3664/alittle.html#GenreExtended - // Extended ID3v1 genres invented by SCMPX - // Note that 255 "Japanese Anime" conflicts with standard "Unknown" - $GenreLookupSCMPX[240] = 'Sacred'; - $GenreLookupSCMPX[241] = 'Northern Europe'; - $GenreLookupSCMPX[242] = 'Irish & Scottish'; - $GenreLookupSCMPX[243] = 'Scotland'; - $GenreLookupSCMPX[244] = 'Ethnic Europe'; - $GenreLookupSCMPX[245] = 'Enka'; - $GenreLookupSCMPX[246] = 'Children\'s Song'; - $GenreLookupSCMPX[247] = 'Japanese Sky'; - $GenreLookupSCMPX[248] = 'Japanese Heavy Rock'; - $GenreLookupSCMPX[249] = 'Japanese Doom Rock'; - $GenreLookupSCMPX[250] = 'Japanese J-POP'; - $GenreLookupSCMPX[251] = 'Japanese Seiyu'; - $GenreLookupSCMPX[252] = 'Japanese Ambient Techno'; - $GenreLookupSCMPX[253] = 'Japanese Moemoe'; - $GenreLookupSCMPX[254] = 'Japanese Tokusatsu'; - //$GenreLookupSCMPX[255] = 'Japanese Anime'; - } - - return ($allowSCMPXextended ? $GenreLookupSCMPX : $GenreLookup); - } - - public static function LookupGenreName($genreid, $allowSCMPXextended=true) { - switch ($genreid) { - case 'RX': - case 'CR': - break; - default: - if (!is_numeric($genreid)) { - return false; - } - $genreid = intval($genreid); // to handle 3 or '3' or '03' - break; - } - $GenreLookup = self::ArrayOfGenres($allowSCMPXextended); - return (isset($GenreLookup[$genreid]) ? $GenreLookup[$genreid] : false); - } - - public static function LookupGenreID($genre, $allowSCMPXextended=false) { - $GenreLookup = self::ArrayOfGenres($allowSCMPXextended); - $LowerCaseNoSpaceSearchTerm = strtolower(str_replace(' ', '', $genre)); - foreach ($GenreLookup as $key => $value) { - if (strtolower(str_replace(' ', '', $value)) == $LowerCaseNoSpaceSearchTerm) { - return $key; - } - } - return false; - } - - public static function StandardiseID3v1GenreName($OriginalGenre) { - if (($GenreID = self::LookupGenreID($OriginalGenre)) !== false) { - return self::LookupGenreName($GenreID); - } - return $OriginalGenre; - } - - public static function GenerateID3v1Tag($title, $artist, $album, $year, $genreid, $comment, $track='') { - $ID3v1Tag = 'TAG'; - $ID3v1Tag .= str_pad(trim(substr($title, 0, 30)), 30, "\x00", STR_PAD_RIGHT); - $ID3v1Tag .= str_pad(trim(substr($artist, 0, 30)), 30, "\x00", STR_PAD_RIGHT); - $ID3v1Tag .= str_pad(trim(substr($album, 0, 30)), 30, "\x00", STR_PAD_RIGHT); - $ID3v1Tag .= str_pad(trim(substr($year, 0, 4)), 4, "\x00", STR_PAD_LEFT); - if (!empty($track) && ($track > 0) && ($track <= 255)) { - $ID3v1Tag .= str_pad(trim(substr($comment, 0, 28)), 28, "\x00", STR_PAD_RIGHT); - $ID3v1Tag .= "\x00"; - if (gettype($track) == 'string') { - $track = (int) $track; - } - $ID3v1Tag .= chr($track); - } else { - $ID3v1Tag .= str_pad(trim(substr($comment, 0, 30)), 30, "\x00", STR_PAD_RIGHT); - } - if (($genreid < 0) || ($genreid > 147)) { - $genreid = 255; // 'unknown' genre - } - switch (gettype($genreid)) { - case 'string': - case 'integer': - $ID3v1Tag .= chr(intval($genreid)); - break; - default: - $ID3v1Tag .= chr(255); // 'unknown' genre - break; - } - - return $ID3v1Tag; - } - -} diff --git a/wp/wp-includes/ID3/module.tag.id3v2.php b/wp/wp-includes/ID3/module.tag.id3v2.php deleted file mode 100644 index 70925048..00000000 --- a/wp/wp-includes/ID3/module.tag.id3v2.php +++ /dev/null @@ -1,3627 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// -// See readme.txt for more details // -///////////////////////////////////////////////////////////////// -/// // -// module.tag.id3v2.php // -// module for analyzing ID3v2 tags // -// dependencies: module.tag.id3v1.php // -// /// -///////////////////////////////////////////////////////////////// - -getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v1.php', __FILE__, true); - -class getid3_id3v2 extends getid3_handler -{ - public $StartingOffset = 0; - - public function Analyze() { - $info = &$this->getid3->info; - - // Overall tag structure: - // +-----------------------------+ - // | Header (10 bytes) | - // +-----------------------------+ - // | Extended Header | - // | (variable length, OPTIONAL) | - // +-----------------------------+ - // | Frames (variable length) | - // +-----------------------------+ - // | Padding | - // | (variable length, OPTIONAL) | - // +-----------------------------+ - // | Footer (10 bytes, OPTIONAL) | - // +-----------------------------+ - - // Header - // ID3v2/file identifier "ID3" - // ID3v2 version $04 00 - // ID3v2 flags (%ab000000 in v2.2, %abc00000 in v2.3, %abcd0000 in v2.4.x) - // ID3v2 size 4 * %0xxxxxxx - - - // shortcuts - $info['id3v2']['header'] = true; - $thisfile_id3v2 = &$info['id3v2']; - $thisfile_id3v2['flags'] = array(); - $thisfile_id3v2_flags = &$thisfile_id3v2['flags']; - - - $this->fseek($this->StartingOffset); - $header = $this->fread(10); - if (substr($header, 0, 3) == 'ID3' && strlen($header) == 10) { - - $thisfile_id3v2['majorversion'] = ord($header{3}); - $thisfile_id3v2['minorversion'] = ord($header{4}); - - // shortcut - $id3v2_majorversion = &$thisfile_id3v2['majorversion']; - - } else { - - unset($info['id3v2']); - return false; - - } - - if ($id3v2_majorversion > 4) { // this script probably won't correctly parse ID3v2.5.x and above (if it ever exists) - - $info['error'][] = 'this script only parses up to ID3v2.4.x - this tag is ID3v2.'.$id3v2_majorversion.'.'.$thisfile_id3v2['minorversion']; - return false; - - } - - $id3_flags = ord($header{5}); - switch ($id3v2_majorversion) { - case 2: - // %ab000000 in v2.2 - $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation - $thisfile_id3v2_flags['compression'] = (bool) ($id3_flags & 0x40); // b - Compression - break; - - case 3: - // %abc00000 in v2.3 - $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation - $thisfile_id3v2_flags['exthead'] = (bool) ($id3_flags & 0x40); // b - Extended header - $thisfile_id3v2_flags['experim'] = (bool) ($id3_flags & 0x20); // c - Experimental indicator - break; - - case 4: - // %abcd0000 in v2.4 - $thisfile_id3v2_flags['unsynch'] = (bool) ($id3_flags & 0x80); // a - Unsynchronisation - $thisfile_id3v2_flags['exthead'] = (bool) ($id3_flags & 0x40); // b - Extended header - $thisfile_id3v2_flags['experim'] = (bool) ($id3_flags & 0x20); // c - Experimental indicator - $thisfile_id3v2_flags['isfooter'] = (bool) ($id3_flags & 0x10); // d - Footer present - break; - } - - $thisfile_id3v2['headerlength'] = getid3_lib::BigEndian2Int(substr($header, 6, 4), 1) + 10; // length of ID3v2 tag in 10-byte header doesn't include 10-byte header length - - $thisfile_id3v2['tag_offset_start'] = $this->StartingOffset; - $thisfile_id3v2['tag_offset_end'] = $thisfile_id3v2['tag_offset_start'] + $thisfile_id3v2['headerlength']; - - - - // create 'encoding' key - used by getid3::HandleAllTags() - // in ID3v2 every field can have it's own encoding type - // so force everything to UTF-8 so it can be handled consistantly - $thisfile_id3v2['encoding'] = 'UTF-8'; - - - // Frames - - // All ID3v2 frames consists of one frame header followed by one or more - // fields containing the actual information. The header is always 10 - // bytes and laid out as follows: - // - // Frame ID $xx xx xx xx (four characters) - // Size 4 * %0xxxxxxx - // Flags $xx xx - - $sizeofframes = $thisfile_id3v2['headerlength'] - 10; // not including 10-byte initial header - if (!empty($thisfile_id3v2['exthead']['length'])) { - $sizeofframes -= ($thisfile_id3v2['exthead']['length'] + 4); - } - if (!empty($thisfile_id3v2_flags['isfooter'])) { - $sizeofframes -= 10; // footer takes last 10 bytes of ID3v2 header, after frame data, before audio - } - if ($sizeofframes > 0) { - - $framedata = $this->fread($sizeofframes); // read all frames from file into $framedata variable - - // if entire frame data is unsynched, de-unsynch it now (ID3v2.3.x) - if (!empty($thisfile_id3v2_flags['unsynch']) && ($id3v2_majorversion <= 3)) { - $framedata = $this->DeUnsynchronise($framedata); - } - // [in ID3v2.4.0] Unsynchronisation [S:6.1] is done on frame level, instead - // of on tag level, making it easier to skip frames, increasing the streamability - // of the tag. The unsynchronisation flag in the header [S:3.1] indicates that - // there exists an unsynchronised frame, while the new unsynchronisation flag in - // the frame header [S:4.1.2] indicates unsynchronisation. - - - //$framedataoffset = 10 + ($thisfile_id3v2['exthead']['length'] ? $thisfile_id3v2['exthead']['length'] + 4 : 0); // how many bytes into the stream - start from after the 10-byte header (and extended header length+4, if present) - $framedataoffset = 10; // how many bytes into the stream - start from after the 10-byte header - - - // Extended Header - if (!empty($thisfile_id3v2_flags['exthead'])) { - $extended_header_offset = 0; - - if ($id3v2_majorversion == 3) { - - // v2.3 definition: - //Extended header size $xx xx xx xx // 32-bit integer - //Extended Flags $xx xx - // %x0000000 %00000000 // v2.3 - // x - CRC data present - //Size of padding $xx xx xx xx - - $thisfile_id3v2['exthead']['length'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4), 0); - $extended_header_offset += 4; - - $thisfile_id3v2['exthead']['flag_bytes'] = 2; - $thisfile_id3v2['exthead']['flag_raw'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $thisfile_id3v2['exthead']['flag_bytes'])); - $extended_header_offset += $thisfile_id3v2['exthead']['flag_bytes']; - - $thisfile_id3v2['exthead']['flags']['crc'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x8000); - - $thisfile_id3v2['exthead']['padding_size'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4)); - $extended_header_offset += 4; - - if ($thisfile_id3v2['exthead']['flags']['crc']) { - $thisfile_id3v2['exthead']['flag_data']['crc'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4)); - $extended_header_offset += 4; - } - $extended_header_offset += $thisfile_id3v2['exthead']['padding_size']; - - } elseif ($id3v2_majorversion == 4) { - - // v2.4 definition: - //Extended header size 4 * %0xxxxxxx // 28-bit synchsafe integer - //Number of flag bytes $01 - //Extended Flags $xx - // %0bcd0000 // v2.4 - // b - Tag is an update - // Flag data length $00 - // c - CRC data present - // Flag data length $05 - // Total frame CRC 5 * %0xxxxxxx - // d - Tag restrictions - // Flag data length $01 - - $thisfile_id3v2['exthead']['length'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 4), true); - $extended_header_offset += 4; - - $thisfile_id3v2['exthead']['flag_bytes'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should always be 1 - $extended_header_offset += 1; - - $thisfile_id3v2['exthead']['flag_raw'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $thisfile_id3v2['exthead']['flag_bytes'])); - $extended_header_offset += $thisfile_id3v2['exthead']['flag_bytes']; - - $thisfile_id3v2['exthead']['flags']['update'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x40); - $thisfile_id3v2['exthead']['flags']['crc'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x20); - $thisfile_id3v2['exthead']['flags']['restrictions'] = (bool) ($thisfile_id3v2['exthead']['flag_raw'] & 0x10); - - if ($thisfile_id3v2['exthead']['flags']['update']) { - $ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 0 - $extended_header_offset += 1; - } - - if ($thisfile_id3v2['exthead']['flags']['crc']) { - $ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 5 - $extended_header_offset += 1; - $thisfile_id3v2['exthead']['flag_data']['crc'] = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, $ext_header_chunk_length), true, false); - $extended_header_offset += $ext_header_chunk_length; - } - - if ($thisfile_id3v2['exthead']['flags']['restrictions']) { - $ext_header_chunk_length = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); // should be 1 - $extended_header_offset += 1; - - // %ppqrrstt - $restrictions_raw = getid3_lib::BigEndian2Int(substr($framedata, $extended_header_offset, 1)); - $extended_header_offset += 1; - $thisfile_id3v2['exthead']['flags']['restrictions']['tagsize'] = ($restrictions_raw & 0xC0) >> 6; // p - Tag size restrictions - $thisfile_id3v2['exthead']['flags']['restrictions']['textenc'] = ($restrictions_raw & 0x20) >> 5; // q - Text encoding restrictions - $thisfile_id3v2['exthead']['flags']['restrictions']['textsize'] = ($restrictions_raw & 0x18) >> 3; // r - Text fields size restrictions - $thisfile_id3v2['exthead']['flags']['restrictions']['imgenc'] = ($restrictions_raw & 0x04) >> 2; // s - Image encoding restrictions - $thisfile_id3v2['exthead']['flags']['restrictions']['imgsize'] = ($restrictions_raw & 0x03) >> 0; // t - Image size restrictions - - $thisfile_id3v2['exthead']['flags']['restrictions_text']['tagsize'] = $this->LookupExtendedHeaderRestrictionsTagSizeLimits($thisfile_id3v2['exthead']['flags']['restrictions']['tagsize']); - $thisfile_id3v2['exthead']['flags']['restrictions_text']['textenc'] = $this->LookupExtendedHeaderRestrictionsTextEncodings($thisfile_id3v2['exthead']['flags']['restrictions']['textenc']); - $thisfile_id3v2['exthead']['flags']['restrictions_text']['textsize'] = $this->LookupExtendedHeaderRestrictionsTextFieldSize($thisfile_id3v2['exthead']['flags']['restrictions']['textsize']); - $thisfile_id3v2['exthead']['flags']['restrictions_text']['imgenc'] = $this->LookupExtendedHeaderRestrictionsImageEncoding($thisfile_id3v2['exthead']['flags']['restrictions']['imgenc']); - $thisfile_id3v2['exthead']['flags']['restrictions_text']['imgsize'] = $this->LookupExtendedHeaderRestrictionsImageSizeSize($thisfile_id3v2['exthead']['flags']['restrictions']['imgsize']); - } - - if ($thisfile_id3v2['exthead']['length'] != $extended_header_offset) { - $info['warning'][] = 'ID3v2.4 extended header length mismatch (expecting '.intval($thisfile_id3v2['exthead']['length']).', found '.intval($extended_header_offset).')'; - } - } - - $framedataoffset += $extended_header_offset; - $framedata = substr($framedata, $extended_header_offset); - } // end extended header - - - while (isset($framedata) && (strlen($framedata) > 0)) { // cycle through until no more frame data is left to parse - if (strlen($framedata) <= $this->ID3v2HeaderLength($id3v2_majorversion)) { - // insufficient room left in ID3v2 header for actual data - must be padding - $thisfile_id3v2['padding']['start'] = $framedataoffset; - $thisfile_id3v2['padding']['length'] = strlen($framedata); - $thisfile_id3v2['padding']['valid'] = true; - for ($i = 0; $i < $thisfile_id3v2['padding']['length']; $i++) { - if ($framedata{$i} != "\x00") { - $thisfile_id3v2['padding']['valid'] = false; - $thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i; - $info['warning'][] = 'Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)'; - break; - } - } - break; // skip rest of ID3v2 header - } - if ($id3v2_majorversion == 2) { - // Frame ID $xx xx xx (three characters) - // Size $xx xx xx (24-bit integer) - // Flags $xx xx - - $frame_header = substr($framedata, 0, 6); // take next 6 bytes for header - $framedata = substr($framedata, 6); // and leave the rest in $framedata - $frame_name = substr($frame_header, 0, 3); - $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 3, 3), 0); - $frame_flags = 0; // not used for anything in ID3v2.2, just set to avoid E_NOTICEs - - } elseif ($id3v2_majorversion > 2) { - - // Frame ID $xx xx xx xx (four characters) - // Size $xx xx xx xx (32-bit integer in v2.3, 28-bit synchsafe in v2.4+) - // Flags $xx xx - - $frame_header = substr($framedata, 0, 10); // take next 10 bytes for header - $framedata = substr($framedata, 10); // and leave the rest in $framedata - - $frame_name = substr($frame_header, 0, 4); - if ($id3v2_majorversion == 3) { - $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer - } else { // ID3v2.4+ - $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 1); // 32-bit synchsafe integer (28-bit value) - } - - if ($frame_size < (strlen($framedata) + 4)) { - $nextFrameID = substr($framedata, $frame_size, 4); - if ($this->IsValidID3v2FrameName($nextFrameID, $id3v2_majorversion)) { - // next frame is OK - } elseif (($frame_name == "\x00".'MP3') || ($frame_name == "\x00\x00".'MP') || ($frame_name == ' MP3') || ($frame_name == 'MP3e')) { - // MP3ext known broken frames - "ok" for the purposes of this test - } elseif (($id3v2_majorversion == 4) && ($this->IsValidID3v2FrameName(substr($framedata, getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0), 4), 3))) { - $info['warning'][] = 'ID3v2 tag written as ID3v2.4, but with non-synchsafe integers (ID3v2.3 style). Older versions of (Helium2; iTunes) are known culprits of this. Tag has been parsed as ID3v2.3'; - $id3v2_majorversion = 3; - $frame_size = getid3_lib::BigEndian2Int(substr($frame_header, 4, 4), 0); // 32-bit integer - } - } - - - $frame_flags = getid3_lib::BigEndian2Int(substr($frame_header, 8, 2)); - } - - if ((($id3v2_majorversion == 2) && ($frame_name == "\x00\x00\x00")) || ($frame_name == "\x00\x00\x00\x00")) { - // padding encountered - - $thisfile_id3v2['padding']['start'] = $framedataoffset; - $thisfile_id3v2['padding']['length'] = strlen($frame_header) + strlen($framedata); - $thisfile_id3v2['padding']['valid'] = true; - - $len = strlen($framedata); - for ($i = 0; $i < $len; $i++) { - if ($framedata{$i} != "\x00") { - $thisfile_id3v2['padding']['valid'] = false; - $thisfile_id3v2['padding']['errorpos'] = $thisfile_id3v2['padding']['start'] + $i; - $info['warning'][] = 'Invalid ID3v2 padding found at offset '.$thisfile_id3v2['padding']['errorpos'].' (the remaining '.($thisfile_id3v2['padding']['length'] - $i).' bytes are considered invalid)'; - break; - } - } - break; // skip rest of ID3v2 header - } - - if ($frame_name == 'COM ') { - $info['warning'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by iTunes (versions "X v2.0.3", "v3.0.1" are known-guilty, probably others too)]'; - $frame_name = 'COMM'; - } - if (($frame_size <= strlen($framedata)) && ($this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion))) { - - unset($parsedFrame); - $parsedFrame['frame_name'] = $frame_name; - $parsedFrame['frame_flags_raw'] = $frame_flags; - $parsedFrame['data'] = substr($framedata, 0, $frame_size); - $parsedFrame['datalength'] = getid3_lib::CastAsInt($frame_size); - $parsedFrame['dataoffset'] = $framedataoffset; - - $this->ParseID3v2Frame($parsedFrame); - $thisfile_id3v2[$frame_name][] = $parsedFrame; - - $framedata = substr($framedata, $frame_size); - - } else { // invalid frame length or FrameID - - if ($frame_size <= strlen($framedata)) { - - if ($this->IsValidID3v2FrameName(substr($framedata, $frame_size, 4), $id3v2_majorversion)) { - - // next frame is valid, just skip the current frame - $framedata = substr($framedata, $frame_size); - $info['warning'][] = 'Next ID3v2 frame is valid, skipping current frame.'; - - } else { - - // next frame is invalid too, abort processing - //unset($framedata); - $framedata = null; - $info['error'][] = 'Next ID3v2 frame is also invalid, aborting processing.'; - - } - - } elseif ($frame_size == strlen($framedata)) { - - // this is the last frame, just skip - $info['warning'][] = 'This was the last ID3v2 frame.'; - - } else { - - // next frame is invalid too, abort processing - //unset($framedata); - $framedata = null; - $info['warning'][] = 'Invalid ID3v2 frame size, aborting.'; - - } - if (!$this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion)) { - - switch ($frame_name) { - case "\x00\x00".'MP': - case "\x00".'MP3': - case ' MP3': - case 'MP3e': - case "\x00".'MP': - case ' MP': - case 'MP3': - $info['warning'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))). [Note: this particular error has been known to happen with tags edited by "MP3ext (www.mutschler.de/mp3ext/)"]'; - break; - - default: - $info['warning'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: !IsValidID3v2FrameName("'.str_replace("\x00", ' ', $frame_name).'", '.$id3v2_majorversion.'))).'; - break; - } - - } elseif (!isset($framedata) || ($frame_size > strlen($framedata))) { - - $info['error'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag). (ERROR: $frame_size ('.$frame_size.') > strlen($framedata) ('.(isset($framedata) ? strlen($framedata) : 'null').')).'; - - } else { - - $info['error'][] = 'error parsing "'.$frame_name.'" ('.$framedataoffset.' bytes into the ID3v2.'.$id3v2_majorversion.' tag).'; - - } - - } - $framedataoffset += ($frame_size + $this->ID3v2HeaderLength($id3v2_majorversion)); - - } - - } - - - // Footer - - // The footer is a copy of the header, but with a different identifier. - // ID3v2 identifier "3DI" - // ID3v2 version $04 00 - // ID3v2 flags %abcd0000 - // ID3v2 size 4 * %0xxxxxxx - - if (isset($thisfile_id3v2_flags['isfooter']) && $thisfile_id3v2_flags['isfooter']) { - $footer = $this->fread(10); - if (substr($footer, 0, 3) == '3DI') { - $thisfile_id3v2['footer'] = true; - $thisfile_id3v2['majorversion_footer'] = ord($footer{3}); - $thisfile_id3v2['minorversion_footer'] = ord($footer{4}); - } - if ($thisfile_id3v2['majorversion_footer'] <= 4) { - $id3_flags = ord(substr($footer{5})); - $thisfile_id3v2_flags['unsynch_footer'] = (bool) ($id3_flags & 0x80); - $thisfile_id3v2_flags['extfoot_footer'] = (bool) ($id3_flags & 0x40); - $thisfile_id3v2_flags['experim_footer'] = (bool) ($id3_flags & 0x20); - $thisfile_id3v2_flags['isfooter_footer'] = (bool) ($id3_flags & 0x10); - - $thisfile_id3v2['footerlength'] = getid3_lib::BigEndian2Int(substr($footer, 6, 4), 1); - } - } // end footer - - if (isset($thisfile_id3v2['comments']['genre'])) { - foreach ($thisfile_id3v2['comments']['genre'] as $key => $value) { - unset($thisfile_id3v2['comments']['genre'][$key]); - $thisfile_id3v2['comments'] = getid3_lib::array_merge_noclobber($thisfile_id3v2['comments'], array('genre'=>$this->ParseID3v2GenreString($value))); - } - } - - if (isset($thisfile_id3v2['comments']['track'])) { - foreach ($thisfile_id3v2['comments']['track'] as $key => $value) { - if (strstr($value, '/')) { - list($thisfile_id3v2['comments']['tracknum'][$key], $thisfile_id3v2['comments']['totaltracks'][$key]) = explode('/', $thisfile_id3v2['comments']['track'][$key]); - } - } - } - - if (!isset($thisfile_id3v2['comments']['year']) && !empty($thisfile_id3v2['comments']['recording_time'][0]) && preg_match('#^([0-9]{4})#', trim($thisfile_id3v2['comments']['recording_time'][0]), $matches)) { - $thisfile_id3v2['comments']['year'] = array($matches[1]); - } - - - if (!empty($thisfile_id3v2['TXXX'])) { - // MediaMonkey does this, maybe others: write a blank RGAD frame, but put replay-gain adjustment values in TXXX frames - foreach ($thisfile_id3v2['TXXX'] as $txxx_array) { - switch ($txxx_array['description']) { - case 'replaygain_track_gain': - if (empty($info['replay_gain']['track']['adjustment']) && !empty($txxx_array['data'])) { - $info['replay_gain']['track']['adjustment'] = floatval(trim(str_replace('dB', '', $txxx_array['data']))); - } - break; - case 'replaygain_track_peak': - if (empty($info['replay_gain']['track']['peak']) && !empty($txxx_array['data'])) { - $info['replay_gain']['track']['peak'] = floatval($txxx_array['data']); - } - break; - case 'replaygain_album_gain': - if (empty($info['replay_gain']['album']['adjustment']) && !empty($txxx_array['data'])) { - $info['replay_gain']['album']['adjustment'] = floatval(trim(str_replace('dB', '', $txxx_array['data']))); - } - break; - } - } - } - - - // Set avdataoffset - $info['avdataoffset'] = $thisfile_id3v2['headerlength']; - if (isset($thisfile_id3v2['footer'])) { - $info['avdataoffset'] += 10; - } - - return true; - } - - - public function ParseID3v2GenreString($genrestring) { - // Parse genres into arrays of genreName and genreID - // ID3v2.2.x, ID3v2.3.x: '(21)' or '(4)Eurodisco' or '(51)(39)' or '(55)((I think...)' - // ID3v2.4.x: '21' $00 'Eurodisco' $00 - $clean_genres = array(); - if (strpos($genrestring, "\x00") === false) { - $genrestring = preg_replace('#\(([0-9]{1,3})\)#', '$1'."\x00", $genrestring); - } - $genre_elements = explode("\x00", $genrestring); - foreach ($genre_elements as $element) { - $element = trim($element); - if ($element) { - if (preg_match('#^[0-9]{1,3}#', $element)) { - $clean_genres[] = getid3_id3v1::LookupGenreName($element); - } else { - $clean_genres[] = str_replace('((', '(', $element); - } - } - } - return $clean_genres; - } - - - public function ParseID3v2Frame(&$parsedFrame) { - - // shortcuts - $info = &$this->getid3->info; - $id3v2_majorversion = $info['id3v2']['majorversion']; - - $parsedFrame['framenamelong'] = $this->FrameNameLongLookup($parsedFrame['frame_name']); - if (empty($parsedFrame['framenamelong'])) { - unset($parsedFrame['framenamelong']); - } - $parsedFrame['framenameshort'] = $this->FrameNameShortLookup($parsedFrame['frame_name']); - if (empty($parsedFrame['framenameshort'])) { - unset($parsedFrame['framenameshort']); - } - - if ($id3v2_majorversion >= 3) { // frame flags are not part of the ID3v2.2 standard - if ($id3v2_majorversion == 3) { - // Frame Header Flags - // %abc00000 %ijk00000 - $parsedFrame['flags']['TagAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x8000); // a - Tag alter preservation - $parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000); // b - File alter preservation - $parsedFrame['flags']['ReadOnly'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000); // c - Read only - $parsedFrame['flags']['compression'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0080); // i - Compression - $parsedFrame['flags']['Encryption'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040); // j - Encryption - $parsedFrame['flags']['GroupingIdentity'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0020); // k - Grouping identity - - } elseif ($id3v2_majorversion == 4) { - // Frame Header Flags - // %0abc0000 %0h00kmnp - $parsedFrame['flags']['TagAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x4000); // a - Tag alter preservation - $parsedFrame['flags']['FileAlterPreservation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x2000); // b - File alter preservation - $parsedFrame['flags']['ReadOnly'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x1000); // c - Read only - $parsedFrame['flags']['GroupingIdentity'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0040); // h - Grouping identity - $parsedFrame['flags']['compression'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0008); // k - Compression - $parsedFrame['flags']['Encryption'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0004); // m - Encryption - $parsedFrame['flags']['Unsynchronisation'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0002); // n - Unsynchronisation - $parsedFrame['flags']['DataLengthIndicator'] = (bool) ($parsedFrame['frame_flags_raw'] & 0x0001); // p - Data length indicator - - // Frame-level de-unsynchronisation - ID3v2.4 - if ($parsedFrame['flags']['Unsynchronisation']) { - $parsedFrame['data'] = $this->DeUnsynchronise($parsedFrame['data']); - } - - if ($parsedFrame['flags']['DataLengthIndicator']) { - $parsedFrame['data_length_indicator'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4), 1); - $parsedFrame['data'] = substr($parsedFrame['data'], 4); - } - } - - // Frame-level de-compression - if ($parsedFrame['flags']['compression']) { - $parsedFrame['decompressed_size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 4)); - if (!function_exists('gzuncompress')) { - $info['warning'][] = 'gzuncompress() support required to decompress ID3v2 frame "'.$parsedFrame['frame_name'].'"'; - } else { - if ($decompresseddata = @gzuncompress(substr($parsedFrame['data'], 4))) { - //if ($decompresseddata = @gzuncompress($parsedFrame['data'])) { - $parsedFrame['data'] = $decompresseddata; - unset($decompresseddata); - } else { - $info['warning'][] = 'gzuncompress() failed on compressed contents of ID3v2 frame "'.$parsedFrame['frame_name'].'"'; - } - } - } - } - - if (!empty($parsedFrame['flags']['DataLengthIndicator'])) { - if ($parsedFrame['data_length_indicator'] != strlen($parsedFrame['data'])) { - $info['warning'][] = 'ID3v2 frame "'.$parsedFrame['frame_name'].'" should be '.$parsedFrame['data_length_indicator'].' bytes long according to DataLengthIndicator, but found '.strlen($parsedFrame['data']).' bytes of data'; - } - } - - if (isset($parsedFrame['datalength']) && ($parsedFrame['datalength'] == 0)) { - - $warning = 'Frame "'.$parsedFrame['frame_name'].'" at offset '.$parsedFrame['dataoffset'].' has no data portion'; - switch ($parsedFrame['frame_name']) { - case 'WCOM': - $warning .= ' (this is known to happen with files tagged by RioPort)'; - break; - - default: - break; - } - $info['warning'][] = $warning; - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'UFID')) || // 4.1 UFID Unique file identifier - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'UFI'))) { // 4.1 UFI Unique file identifier - // There may be more than one 'UFID' frame in a tag, - // but only one with the same 'Owner identifier'. - //
      - // Owner identifier $00 - // Identifier - $exploded = explode("\x00", $parsedFrame['data'], 2); - $parsedFrame['ownerid'] = (isset($exploded[0]) ? $exploded[0] : ''); - $parsedFrame['data'] = (isset($exploded[1]) ? $exploded[1] : ''); - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'TXXX')) || // 4.2.2 TXXX User defined text information frame - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'TXX'))) { // 4.2.2 TXX User defined text information frame - // There may be more than one 'TXXX' frame in each tag, - // but only one with the same description. - //
      - // Text encoding $xx - // Description $00 (00) - // Value - - $frame_offset = 0; - $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); - if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { - $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; - $frame_textencoding_terminator = "\x00"; - } - $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); - if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { - $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 - } - $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_description) === 0) { - $frame_description = ''; - } - $parsedFrame['encodingid'] = $frame_textencoding; - $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); - - $parsedFrame['description'] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $frame_description)); - $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); - if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { - $commentkey = ($parsedFrame['description'] ? $parsedFrame['description'] : (isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) ? count($info['id3v2']['comments'][$parsedFrame['framenameshort']]) : 0)); - if (!isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) || !array_key_exists($commentkey, $info['id3v2']['comments'][$parsedFrame['framenameshort']])) { - $info['id3v2']['comments'][$parsedFrame['framenameshort']][$commentkey] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data'])); - } else { - $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = trim(getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data'])); - } - } - //unset($parsedFrame['data']); do not unset, may be needed elsewhere, e.g. for replaygain - - - } elseif ($parsedFrame['frame_name']{0} == 'T') { // 4.2. T??[?] Text information frame - // There may only be one text information frame of its kind in an tag. - //
      - // Text encoding $xx - // Information - - $frame_offset = 0; - $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { - $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; - } - - $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); - - $parsedFrame['encodingid'] = $frame_textencoding; - $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); - - if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { - // ID3v2.3 specs say that TPE1 (and others) can contain multiple artist values separated with / - // This of course breaks when an artist name contains slash character, e.g. "AC/DC" - // MP3tag (maybe others) implement alternative system where multiple artists are null-separated, which makes more sense - // getID3 will split null-separated artists into multiple artists and leave slash-separated ones to the user - switch ($parsedFrame['encoding']) { - case 'UTF-16': - case 'UTF-16BE': - case 'UTF-16LE': - $wordsize = 2; - break; - case 'ISO-8859-1': - case 'UTF-8': - default: - $wordsize = 1; - break; - } - $Txxx_elements = array(); - $Txxx_elements_start_offset = 0; - for ($i = 0; $i < strlen($parsedFrame['data']); $i += $wordsize) { - if (substr($parsedFrame['data'], $i, $wordsize) == str_repeat("\x00", $wordsize)) { - $Txxx_elements[] = substr($parsedFrame['data'], $Txxx_elements_start_offset, $i - $Txxx_elements_start_offset); - $Txxx_elements_start_offset = $i + $wordsize; - } - } - $Txxx_elements[] = substr($parsedFrame['data'], $Txxx_elements_start_offset, $i - $Txxx_elements_start_offset); - foreach ($Txxx_elements as $Txxx_element) { - $string = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $Txxx_element); - if (!empty($string)) { - $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $string; - } - } - unset($string, $wordsize, $i, $Txxx_elements, $Txxx_element, $Txxx_elements_start_offset); - } - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'WXXX')) || // 4.3.2 WXXX User defined URL link frame - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'WXX'))) { // 4.3.2 WXX User defined URL link frame - // There may be more than one 'WXXX' frame in each tag, - // but only one with the same description - //
      - // Text encoding $xx - // Description $00 (00) - // URL - - $frame_offset = 0; - $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); - if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { - $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; - $frame_textencoding_terminator = "\x00"; - } - $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); - if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { - $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 - } - $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - - if (ord($frame_description) === 0) { - $frame_description = ''; - } - $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); - - $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator); - if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { - $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 - } - if ($frame_terminatorpos) { - // there are null bytes after the data - this is not according to spec - // only use data up to first null byte - $frame_urldata = (string) substr($parsedFrame['data'], 0, $frame_terminatorpos); - } else { - // no null bytes following data, just use all data - $frame_urldata = (string) $parsedFrame['data']; - } - - $parsedFrame['encodingid'] = $frame_textencoding; - $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); - - $parsedFrame['url'] = $frame_urldata; - $parsedFrame['description'] = $frame_description; - if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { - $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['url']); - } - unset($parsedFrame['data']); - - - } elseif ($parsedFrame['frame_name']{0} == 'W') { // 4.3. W??? URL link frames - // There may only be one URL link frame of its kind in a tag, - // except when stated otherwise in the frame description - //
      - // URL - - $parsedFrame['url'] = trim($parsedFrame['data']); - if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { - $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['url']; - } - unset($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'IPLS')) || // 4.4 IPLS Involved people list (ID3v2.3 only) - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'IPL'))) { // 4.4 IPL Involved people list (ID3v2.2 only) - // http://id3.org/id3v2.3.0#sec4.4 - // There may only be one 'IPL' frame in each tag - //
      - // Text encoding $xx - // People list strings - - $frame_offset = 0; - $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { - $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; - } - $parsedFrame['encodingid'] = $frame_textencoding; - $parsedFrame['encoding'] = $this->TextEncodingNameLookup($parsedFrame['encodingid']); - $parsedFrame['data_raw'] = (string) substr($parsedFrame['data'], $frame_offset); - - // http://www.getid3.org/phpBB3/viewtopic.php?t=1369 - // "this tag typically contains null terminated strings, which are associated in pairs" - // "there are users that use the tag incorrectly" - $IPLS_parts = array(); - if (strpos($parsedFrame['data_raw'], "\x00") !== false) { - $IPLS_parts_unsorted = array(); - if (((strlen($parsedFrame['data_raw']) % 2) == 0) && ((substr($parsedFrame['data_raw'], 0, 2) == "\xFF\xFE") || (substr($parsedFrame['data_raw'], 0, 2) == "\xFE\xFF"))) { - // UTF-16, be careful looking for null bytes since most 2-byte characters may contain one; you need to find twin null bytes, and on even padding - $thisILPS = ''; - for ($i = 0; $i < strlen($parsedFrame['data_raw']); $i += 2) { - $twobytes = substr($parsedFrame['data_raw'], $i, 2); - if ($twobytes === "\x00\x00") { - $IPLS_parts_unsorted[] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $thisILPS); - $thisILPS = ''; - } else { - $thisILPS .= $twobytes; - } - } - if (strlen($thisILPS) > 2) { // 2-byte BOM - $IPLS_parts_unsorted[] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $thisILPS); - } - } else { - // ISO-8859-1 or UTF-8 or other single-byte-null character set - $IPLS_parts_unsorted = explode("\x00", $parsedFrame['data_raw']); - } - if (count($IPLS_parts_unsorted) == 1) { - // just a list of names, e.g. "Dino Baptiste, Jimmy Copley, John Gordon, Bernie Marsden, Sharon Watson" - foreach ($IPLS_parts_unsorted as $key => $value) { - $IPLS_parts_sorted = preg_split('#[;,\\r\\n\\t]#', $value); - $position = ''; - foreach ($IPLS_parts_sorted as $person) { - $IPLS_parts[] = array('position'=>$position, 'person'=>$person); - } - } - } elseif ((count($IPLS_parts_unsorted) % 2) == 0) { - $position = ''; - $person = ''; - foreach ($IPLS_parts_unsorted as $key => $value) { - if (($key % 2) == 0) { - $position = $value; - } else { - $person = $value; - $IPLS_parts[] = array('position'=>$position, 'person'=>$person); - $position = ''; - $person = ''; - } - } - } else { - foreach ($IPLS_parts_unsorted as $key => $value) { - $IPLS_parts[] = array($value); - } - } - - } else { - $IPLS_parts = preg_split('#[;,\\r\\n\\t]#', $parsedFrame['data_raw']); - } - $parsedFrame['data'] = $IPLS_parts; - - if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { - $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['data']; - } - - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MCDI')) || // 4.4 MCDI Music CD identifier - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MCI'))) { // 4.5 MCI Music CD identifier - // There may only be one 'MCDI' frame in each tag - //
      - // CD TOC - - if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { - $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = $parsedFrame['data']; - } - - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ETCO')) || // 4.5 ETCO Event timing codes - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ETC'))) { // 4.6 ETC Event timing codes - // There may only be one 'ETCO' frame in each tag - //
      - // Time stamp format $xx - // Where time stamp format is: - // $01 (32-bit value) MPEG frames from beginning of file - // $02 (32-bit value) milliseconds from beginning of file - // Followed by a list of key events in the following format: - // Type of event $xx - // Time stamp $xx (xx ...) - // The 'Time stamp' is set to zero if directly at the beginning of the sound - // or after the previous event. All events MUST be sorted in chronological order. - - $frame_offset = 0; - $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - - while ($frame_offset < strlen($parsedFrame['data'])) { - $parsedFrame['typeid'] = substr($parsedFrame['data'], $frame_offset++, 1); - $parsedFrame['type'] = $this->ETCOEventLookup($parsedFrame['typeid']); - $parsedFrame['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); - $frame_offset += 4; - } - unset($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'MLLT')) || // 4.6 MLLT MPEG location lookup table - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'MLL'))) { // 4.7 MLL MPEG location lookup table - // There may only be one 'MLLT' frame in each tag - //
      - // MPEG frames between reference $xx xx - // Bytes between reference $xx xx xx - // Milliseconds between reference $xx xx xx - // Bits for bytes deviation $xx - // Bits for milliseconds dev. $xx - // Then for every reference the following data is included; - // Deviation in bytes %xxx.... - // Deviation in milliseconds %xxx.... - - $frame_offset = 0; - $parsedFrame['framesbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 0, 2)); - $parsedFrame['bytesbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 2, 3)); - $parsedFrame['msbetweenreferences'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 5, 3)); - $parsedFrame['bitsforbytesdeviation'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 8, 1)); - $parsedFrame['bitsformsdeviation'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], 9, 1)); - $parsedFrame['data'] = substr($parsedFrame['data'], 10); - while ($frame_offset < strlen($parsedFrame['data'])) { - $deviationbitstream .= getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); - } - $reference_counter = 0; - while (strlen($deviationbitstream) > 0) { - $parsedFrame[$reference_counter]['bytedeviation'] = bindec(substr($deviationbitstream, 0, $parsedFrame['bitsforbytesdeviation'])); - $parsedFrame[$reference_counter]['msdeviation'] = bindec(substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'], $parsedFrame['bitsformsdeviation'])); - $deviationbitstream = substr($deviationbitstream, $parsedFrame['bitsforbytesdeviation'] + $parsedFrame['bitsformsdeviation']); - $reference_counter++; - } - unset($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYTC')) || // 4.7 SYTC Synchronised tempo codes - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'STC'))) { // 4.8 STC Synchronised tempo codes - // There may only be one 'SYTC' frame in each tag - //
      - // Time stamp format $xx - // Tempo data - // Where time stamp format is: - // $01 (32-bit value) MPEG frames from beginning of file - // $02 (32-bit value) milliseconds from beginning of file - - $frame_offset = 0; - $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $timestamp_counter = 0; - while ($frame_offset < strlen($parsedFrame['data'])) { - $parsedFrame[$timestamp_counter]['tempo'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - if ($parsedFrame[$timestamp_counter]['tempo'] == 255) { - $parsedFrame[$timestamp_counter]['tempo'] += ord(substr($parsedFrame['data'], $frame_offset++, 1)); - } - $parsedFrame[$timestamp_counter]['timestamp'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); - $frame_offset += 4; - $timestamp_counter++; - } - unset($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USLT')) || // 4.8 USLT Unsynchronised lyric/text transcription - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ULT'))) { // 4.9 ULT Unsynchronised lyric/text transcription - // There may be more than one 'Unsynchronised lyrics/text transcription' frame - // in each tag, but only one with the same language and content descriptor. - //
      - // Text encoding $xx - // Language $xx xx xx - // Content descriptor $00 (00) - // Lyrics/text - - $frame_offset = 0; - $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); - if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { - $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; - $frame_textencoding_terminator = "\x00"; - } - $frame_language = substr($parsedFrame['data'], $frame_offset, 3); - $frame_offset += 3; - $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); - if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { - $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 - } - $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_description) === 0) { - $frame_description = ''; - } - $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); - - $parsedFrame['encodingid'] = $frame_textencoding; - $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); - - $parsedFrame['data'] = $parsedFrame['data']; - $parsedFrame['language'] = $frame_language; - $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); - $parsedFrame['description'] = $frame_description; - if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { - $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); - } - unset($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'SYLT')) || // 4.9 SYLT Synchronised lyric/text - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'SLT'))) { // 4.10 SLT Synchronised lyric/text - // There may be more than one 'SYLT' frame in each tag, - // but only one with the same language and content descriptor. - //
      - // Text encoding $xx - // Language $xx xx xx - // Time stamp format $xx - // $01 (32-bit value) MPEG frames from beginning of file - // $02 (32-bit value) milliseconds from beginning of file - // Content type $xx - // Content descriptor $00 (00) - // Terminated text to be synced (typically a syllable) - // Sync identifier (terminator to above string) $00 (00) - // Time stamp $xx (xx ...) - - $frame_offset = 0; - $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); - if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { - $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; - $frame_textencoding_terminator = "\x00"; - } - $frame_language = substr($parsedFrame['data'], $frame_offset, 3); - $frame_offset += 3; - $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['contenttypeid'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['contenttype'] = $this->SYTLContentTypeLookup($parsedFrame['contenttypeid']); - $parsedFrame['encodingid'] = $frame_textencoding; - $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); - - $parsedFrame['language'] = $frame_language; - $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); - - $timestampindex = 0; - $frame_remainingdata = substr($parsedFrame['data'], $frame_offset); - while (strlen($frame_remainingdata)) { - $frame_offset = 0; - $frame_terminatorpos = strpos($frame_remainingdata, $frame_textencoding_terminator); - if ($frame_terminatorpos === false) { - $frame_remainingdata = ''; - } else { - if (ord(substr($frame_remainingdata, $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { - $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 - } - $parsedFrame['lyrics'][$timestampindex]['data'] = substr($frame_remainingdata, $frame_offset, $frame_terminatorpos - $frame_offset); - - $frame_remainingdata = substr($frame_remainingdata, $frame_terminatorpos + strlen($frame_textencoding_terminator)); - if (($timestampindex == 0) && (ord($frame_remainingdata{0}) != 0)) { - // timestamp probably omitted for first data item - } else { - $parsedFrame['lyrics'][$timestampindex]['timestamp'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 4)); - $frame_remainingdata = substr($frame_remainingdata, 4); - } - $timestampindex++; - } - } - unset($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMM')) || // 4.10 COMM Comments - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'COM'))) { // 4.11 COM Comments - // There may be more than one comment frame in each tag, - // but only one with the same language and content descriptor. - //
      - // Text encoding $xx - // Language $xx xx xx - // Short content descrip. $00 (00) - // The actual text - - if (strlen($parsedFrame['data']) < 5) { - - $info['warning'][] = 'Invalid data (too short) for "'.$parsedFrame['frame_name'].'" frame at offset '.$parsedFrame['dataoffset']; - - } else { - - $frame_offset = 0; - $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); - if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { - $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; - $frame_textencoding_terminator = "\x00"; - } - $frame_language = substr($parsedFrame['data'], $frame_offset, 3); - $frame_offset += 3; - $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); - if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { - $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 - } - $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_description) === 0) { - $frame_description = ''; - } - $frame_text = (string) substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); - - $parsedFrame['encodingid'] = $frame_textencoding; - $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); - - $parsedFrame['language'] = $frame_language; - $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); - $parsedFrame['description'] = $frame_description; - $parsedFrame['data'] = $frame_text; - if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { - $commentkey = ($parsedFrame['description'] ? $parsedFrame['description'] : (!empty($info['id3v2']['comments'][$parsedFrame['framenameshort']]) ? count($info['id3v2']['comments'][$parsedFrame['framenameshort']]) : 0)); - if (!isset($info['id3v2']['comments'][$parsedFrame['framenameshort']]) || !array_key_exists($commentkey, $info['id3v2']['comments'][$parsedFrame['framenameshort']])) { - $info['id3v2']['comments'][$parsedFrame['framenameshort']][$commentkey] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); - } else { - $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); - } - } - - } - - } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'RVA2')) { // 4.11 RVA2 Relative volume adjustment (2) (ID3v2.4+ only) - // There may be more than one 'RVA2' frame in each tag, - // but only one with the same identification string - //
      - // Identification $00 - // The 'identification' string is used to identify the situation and/or - // device where this adjustment should apply. The following is then - // repeated for every channel: - // Type of channel $xx - // Volume adjustment $xx xx - // Bits representing peak $xx - // Peak volume $xx (xx ...) - - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00"); - $frame_idstring = substr($parsedFrame['data'], 0, $frame_terminatorpos); - if (ord($frame_idstring) === 0) { - $frame_idstring = ''; - } - $frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00")); - $parsedFrame['description'] = $frame_idstring; - $RVA2channelcounter = 0; - while (strlen($frame_remainingdata) >= 5) { - $frame_offset = 0; - $frame_channeltypeid = ord(substr($frame_remainingdata, $frame_offset++, 1)); - $parsedFrame[$RVA2channelcounter]['channeltypeid'] = $frame_channeltypeid; - $parsedFrame[$RVA2channelcounter]['channeltype'] = $this->RVA2ChannelTypeLookup($frame_channeltypeid); - $parsedFrame[$RVA2channelcounter]['volumeadjust'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, 2), false, true); // 16-bit signed - $frame_offset += 2; - $parsedFrame[$RVA2channelcounter]['bitspeakvolume'] = ord(substr($frame_remainingdata, $frame_offset++, 1)); - if (($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] < 1) || ($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] > 4)) { - $info['warning'][] = 'ID3v2::RVA2 frame['.$RVA2channelcounter.'] contains invalid '.$parsedFrame[$RVA2channelcounter]['bitspeakvolume'].'-byte bits-representing-peak value'; - break; - } - $frame_bytespeakvolume = ceil($parsedFrame[$RVA2channelcounter]['bitspeakvolume'] / 8); - $parsedFrame[$RVA2channelcounter]['peakvolume'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, $frame_offset, $frame_bytespeakvolume)); - $frame_remainingdata = substr($frame_remainingdata, $frame_offset + $frame_bytespeakvolume); - $RVA2channelcounter++; - } - unset($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'RVAD')) || // 4.12 RVAD Relative volume adjustment (ID3v2.3 only) - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'RVA'))) { // 4.12 RVA Relative volume adjustment (ID3v2.2 only) - // There may only be one 'RVA' frame in each tag - //
      - // ID3v2.2 => Increment/decrement %000000ba - // ID3v2.3 => Increment/decrement %00fedcba - // Bits used for volume descr. $xx - // Relative volume change, right $xx xx (xx ...) // a - // Relative volume change, left $xx xx (xx ...) // b - // Peak volume right $xx xx (xx ...) - // Peak volume left $xx xx (xx ...) - // ID3v2.3 only, optional (not present in ID3v2.2): - // Relative volume change, right back $xx xx (xx ...) // c - // Relative volume change, left back $xx xx (xx ...) // d - // Peak volume right back $xx xx (xx ...) - // Peak volume left back $xx xx (xx ...) - // ID3v2.3 only, optional (not present in ID3v2.2): - // Relative volume change, center $xx xx (xx ...) // e - // Peak volume center $xx xx (xx ...) - // ID3v2.3 only, optional (not present in ID3v2.2): - // Relative volume change, bass $xx xx (xx ...) // f - // Peak volume bass $xx xx (xx ...) - - $frame_offset = 0; - $frame_incrdecrflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['incdec']['right'] = (bool) substr($frame_incrdecrflags, 6, 1); - $parsedFrame['incdec']['left'] = (bool) substr($frame_incrdecrflags, 7, 1); - $parsedFrame['bitsvolume'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $frame_bytesvolume = ceil($parsedFrame['bitsvolume'] / 8); - $parsedFrame['volumechange']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); - if ($parsedFrame['incdec']['right'] === false) { - $parsedFrame['volumechange']['right'] *= -1; - } - $frame_offset += $frame_bytesvolume; - $parsedFrame['volumechange']['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); - if ($parsedFrame['incdec']['left'] === false) { - $parsedFrame['volumechange']['left'] *= -1; - } - $frame_offset += $frame_bytesvolume; - $parsedFrame['peakvolume']['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); - $frame_offset += $frame_bytesvolume; - $parsedFrame['peakvolume']['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); - $frame_offset += $frame_bytesvolume; - if ($id3v2_majorversion == 3) { - $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); - if (strlen($parsedFrame['data']) > 0) { - $parsedFrame['incdec']['rightrear'] = (bool) substr($frame_incrdecrflags, 4, 1); - $parsedFrame['incdec']['leftrear'] = (bool) substr($frame_incrdecrflags, 5, 1); - $parsedFrame['volumechange']['rightrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); - if ($parsedFrame['incdec']['rightrear'] === false) { - $parsedFrame['volumechange']['rightrear'] *= -1; - } - $frame_offset += $frame_bytesvolume; - $parsedFrame['volumechange']['leftrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); - if ($parsedFrame['incdec']['leftrear'] === false) { - $parsedFrame['volumechange']['leftrear'] *= -1; - } - $frame_offset += $frame_bytesvolume; - $parsedFrame['peakvolume']['rightrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); - $frame_offset += $frame_bytesvolume; - $parsedFrame['peakvolume']['leftrear'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); - $frame_offset += $frame_bytesvolume; - } - $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); - if (strlen($parsedFrame['data']) > 0) { - $parsedFrame['incdec']['center'] = (bool) substr($frame_incrdecrflags, 3, 1); - $parsedFrame['volumechange']['center'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); - if ($parsedFrame['incdec']['center'] === false) { - $parsedFrame['volumechange']['center'] *= -1; - } - $frame_offset += $frame_bytesvolume; - $parsedFrame['peakvolume']['center'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); - $frame_offset += $frame_bytesvolume; - } - $parsedFrame['data'] = substr($parsedFrame['data'], $frame_offset); - if (strlen($parsedFrame['data']) > 0) { - $parsedFrame['incdec']['bass'] = (bool) substr($frame_incrdecrflags, 2, 1); - $parsedFrame['volumechange']['bass'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); - if ($parsedFrame['incdec']['bass'] === false) { - $parsedFrame['volumechange']['bass'] *= -1; - } - $frame_offset += $frame_bytesvolume; - $parsedFrame['peakvolume']['bass'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesvolume)); - $frame_offset += $frame_bytesvolume; - } - } - unset($parsedFrame['data']); - - - } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'EQU2')) { // 4.12 EQU2 Equalisation (2) (ID3v2.4+ only) - // There may be more than one 'EQU2' frame in each tag, - // but only one with the same identification string - //
      - // Interpolation method $xx - // $00 Band - // $01 Linear - // Identification $00 - // The following is then repeated for every adjustment point - // Frequency $xx xx - // Volume adjustment $xx xx - - $frame_offset = 0; - $frame_interpolationmethod = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_idstring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_idstring) === 0) { - $frame_idstring = ''; - } - $parsedFrame['description'] = $frame_idstring; - $frame_remainingdata = substr($parsedFrame['data'], $frame_terminatorpos + strlen("\x00")); - while (strlen($frame_remainingdata)) { - $frame_frequency = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 0, 2)) / 2; - $parsedFrame['data'][$frame_frequency] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, 2), false, true); - $frame_remainingdata = substr($frame_remainingdata, 4); - } - $parsedFrame['interpolationmethod'] = $frame_interpolationmethod; - unset($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion == 3) && ($parsedFrame['frame_name'] == 'EQUA')) || // 4.12 EQUA Equalisation (ID3v2.3 only) - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'EQU'))) { // 4.13 EQU Equalisation (ID3v2.2 only) - // There may only be one 'EQUA' frame in each tag - //
      - // Adjustment bits $xx - // This is followed by 2 bytes + ('adjustment bits' rounded up to the - // nearest byte) for every equalisation band in the following format, - // giving a frequency range of 0 - 32767Hz: - // Increment/decrement %x (MSB of the Frequency) - // Frequency (lower 15 bits) - // Adjustment $xx (xx ...) - - $frame_offset = 0; - $parsedFrame['adjustmentbits'] = substr($parsedFrame['data'], $frame_offset++, 1); - $frame_adjustmentbytes = ceil($parsedFrame['adjustmentbits'] / 8); - - $frame_remainingdata = (string) substr($parsedFrame['data'], $frame_offset); - while (strlen($frame_remainingdata) > 0) { - $frame_frequencystr = getid3_lib::BigEndian2Bin(substr($frame_remainingdata, 0, 2)); - $frame_incdec = (bool) substr($frame_frequencystr, 0, 1); - $frame_frequency = bindec(substr($frame_frequencystr, 1, 15)); - $parsedFrame[$frame_frequency]['incdec'] = $frame_incdec; - $parsedFrame[$frame_frequency]['adjustment'] = getid3_lib::BigEndian2Int(substr($frame_remainingdata, 2, $frame_adjustmentbytes)); - if ($parsedFrame[$frame_frequency]['incdec'] === false) { - $parsedFrame[$frame_frequency]['adjustment'] *= -1; - } - $frame_remainingdata = substr($frame_remainingdata, 2 + $frame_adjustmentbytes); - } - unset($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RVRB')) || // 4.13 RVRB Reverb - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'REV'))) { // 4.14 REV Reverb - // There may only be one 'RVRB' frame in each tag. - //
      - // Reverb left (ms) $xx xx - // Reverb right (ms) $xx xx - // Reverb bounces, left $xx - // Reverb bounces, right $xx - // Reverb feedback, left to left $xx - // Reverb feedback, left to right $xx - // Reverb feedback, right to right $xx - // Reverb feedback, right to left $xx - // Premix left to right $xx - // Premix right to left $xx - - $frame_offset = 0; - $parsedFrame['left'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); - $frame_offset += 2; - $parsedFrame['right'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); - $frame_offset += 2; - $parsedFrame['bouncesL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['bouncesR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['feedbackLL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['feedbackLR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['feedbackRR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['feedbackRL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['premixLR'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['premixRL'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - unset($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'APIC')) || // 4.14 APIC Attached picture - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'PIC'))) { // 4.15 PIC Attached picture - // There may be several pictures attached to one file, - // each in their individual 'APIC' frame, but only one - // with the same content descriptor - //
      - // Text encoding $xx - // ID3v2.3+ => MIME type $00 - // ID3v2.2 => Image format $xx xx xx - // Picture type $xx - // Description $00 (00) - // Picture data - - $frame_offset = 0; - $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); - if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { - $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; - $frame_textencoding_terminator = "\x00"; - } - - if ($id3v2_majorversion == 2 && strlen($parsedFrame['data']) > $frame_offset) { - $frame_imagetype = substr($parsedFrame['data'], $frame_offset, 3); - if (strtolower($frame_imagetype) == 'ima') { - // complete hack for mp3Rage (www.chaoticsoftware.com) that puts ID3v2.3-formatted - // MIME type instead of 3-char ID3v2.2-format image type (thanks xbhoffØpacbell*net) - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_mimetype) === 0) { - $frame_mimetype = ''; - } - $frame_imagetype = strtoupper(str_replace('image/', '', strtolower($frame_mimetype))); - if ($frame_imagetype == 'JPEG') { - $frame_imagetype = 'JPG'; - } - $frame_offset = $frame_terminatorpos + strlen("\x00"); - } else { - $frame_offset += 3; - } - } - if ($id3v2_majorversion > 2 && strlen($parsedFrame['data']) > $frame_offset) { - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_mimetype) === 0) { - $frame_mimetype = ''; - } - $frame_offset = $frame_terminatorpos + strlen("\x00"); - } - - $frame_picturetype = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - - if ($frame_offset >= $parsedFrame['datalength']) { - $info['warning'][] = 'data portion of APIC frame is missing at offset '.($parsedFrame['dataoffset'] + 8 + $frame_offset); - } else { - $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); - if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { - $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 - } - $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_description) === 0) { - $frame_description = ''; - } - $parsedFrame['encodingid'] = $frame_textencoding; - $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); - - if ($id3v2_majorversion == 2) { - $parsedFrame['imagetype'] = $frame_imagetype; - } else { - $parsedFrame['mime'] = $frame_mimetype; - } - $parsedFrame['picturetypeid'] = $frame_picturetype; - $parsedFrame['picturetype'] = $this->APICPictureTypeLookup($frame_picturetype); - $parsedFrame['description'] = $frame_description; - $parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator)); - $parsedFrame['datalength'] = strlen($parsedFrame['data']); - - $parsedFrame['image_mime'] = ''; - $imageinfo = array(); - $imagechunkcheck = getid3_lib::GetDataImageSize($parsedFrame['data'], $imageinfo); - if (($imagechunkcheck[2] >= 1) && ($imagechunkcheck[2] <= 3)) { - $parsedFrame['image_mime'] = 'image/'.getid3_lib::ImageTypesLookup($imagechunkcheck[2]); - if ($imagechunkcheck[0]) { - $parsedFrame['image_width'] = $imagechunkcheck[0]; - } - if ($imagechunkcheck[1]) { - $parsedFrame['image_height'] = $imagechunkcheck[1]; - } - } - - do { - if ($this->getid3->option_save_attachments === false) { - // skip entirely - unset($parsedFrame['data']); - break; - } - if ($this->getid3->option_save_attachments === true) { - // great -/* - } elseif (is_int($this->getid3->option_save_attachments)) { - if ($this->getid3->option_save_attachments < $parsedFrame['data_length']) { - // too big, skip - $info['warning'][] = 'attachment at '.$frame_offset.' is too large to process inline ('.number_format($parsedFrame['data_length']).' bytes)'; - unset($parsedFrame['data']); - break; - } -*/ - } elseif (is_string($this->getid3->option_save_attachments)) { - $dir = rtrim(str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $this->getid3->option_save_attachments), DIRECTORY_SEPARATOR); - if (!is_dir($dir) || !is_writable($dir)) { - // cannot write, skip - $info['warning'][] = 'attachment at '.$frame_offset.' cannot be saved to "'.$dir.'" (not writable)'; - unset($parsedFrame['data']); - break; - } - } - // if we get this far, must be OK - if (is_string($this->getid3->option_save_attachments)) { - $destination_filename = $dir.DIRECTORY_SEPARATOR.md5($info['filenamepath']).'_'.$frame_offset; - if (!file_exists($destination_filename) || is_writable($destination_filename)) { - file_put_contents($destination_filename, $parsedFrame['data']); - } else { - $info['warning'][] = 'attachment at '.$frame_offset.' cannot be saved to "'.$destination_filename.'" (not writable)'; - } - $parsedFrame['data_filename'] = $destination_filename; - unset($parsedFrame['data']); - } else { - if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { - if (!isset($info['id3v2']['comments']['picture'])) { - $info['id3v2']['comments']['picture'] = array(); - } - $comments_picture_data = array(); - foreach (array('data', 'image_mime', 'image_width', 'image_height', 'imagetype', 'picturetype', 'description', 'datalength') as $picture_key) { - if (isset($parsedFrame[$picture_key])) { - $comments_picture_data[$picture_key] = $parsedFrame[$picture_key]; - } - } - $info['id3v2']['comments']['picture'][] = $comments_picture_data; - unset($comments_picture_data); - } - } - } while (false); - } - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GEOB')) || // 4.15 GEOB General encapsulated object - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'GEO'))) { // 4.16 GEO General encapsulated object - // There may be more than one 'GEOB' frame in each tag, - // but only one with the same content descriptor - //
      - // Text encoding $xx - // MIME type $00 - // Filename $00 (00) - // Content description $00 (00) - // Encapsulated object - - $frame_offset = 0; - $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); - if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { - $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; - $frame_textencoding_terminator = "\x00"; - } - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_mimetype) === 0) { - $frame_mimetype = ''; - } - $frame_offset = $frame_terminatorpos + strlen("\x00"); - - $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); - if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { - $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 - } - $frame_filename = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_filename) === 0) { - $frame_filename = ''; - } - $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); - - $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); - if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { - $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 - } - $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_description) === 0) { - $frame_description = ''; - } - $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); - - $parsedFrame['objectdata'] = (string) substr($parsedFrame['data'], $frame_offset); - $parsedFrame['encodingid'] = $frame_textencoding; - $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); - - $parsedFrame['mime'] = $frame_mimetype; - $parsedFrame['filename'] = $frame_filename; - $parsedFrame['description'] = $frame_description; - unset($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PCNT')) || // 4.16 PCNT Play counter - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CNT'))) { // 4.17 CNT Play counter - // There may only be one 'PCNT' frame in each tag. - // When the counter reaches all one's, one byte is inserted in - // front of the counter thus making the counter eight bits bigger - //
      - // Counter $xx xx xx xx (xx ...) - - $parsedFrame['data'] = getid3_lib::BigEndian2Int($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POPM')) || // 4.17 POPM Popularimeter - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'POP'))) { // 4.18 POP Popularimeter - // There may be more than one 'POPM' frame in each tag, - // but only one with the same email address - //
      - // Email to user $00 - // Rating $xx - // Counter $xx xx xx xx (xx ...) - - $frame_offset = 0; - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_emailaddress = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_emailaddress) === 0) { - $frame_emailaddress = ''; - } - $frame_offset = $frame_terminatorpos + strlen("\x00"); - $frame_rating = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['counter'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset)); - $parsedFrame['email'] = $frame_emailaddress; - $parsedFrame['rating'] = $frame_rating; - unset($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RBUF')) || // 4.18 RBUF Recommended buffer size - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'BUF'))) { // 4.19 BUF Recommended buffer size - // There may only be one 'RBUF' frame in each tag - //
      - // Buffer size $xx xx xx - // Embedded info flag %0000000x - // Offset to next tag $xx xx xx xx - - $frame_offset = 0; - $parsedFrame['buffersize'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 3)); - $frame_offset += 3; - - $frame_embeddedinfoflags = getid3_lib::BigEndian2Bin(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['flags']['embededinfo'] = (bool) substr($frame_embeddedinfoflags, 7, 1); - $parsedFrame['nexttagoffset'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); - unset($parsedFrame['data']); - - - } elseif (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRM')) { // 4.20 Encrypted meta frame (ID3v2.2 only) - // There may be more than one 'CRM' frame in a tag, - // but only one with the same 'owner identifier' - //
      - // Owner identifier $00 (00) - // Content/explanation $00 (00) - // Encrypted datablock - - $frame_offset = 0; - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - $frame_offset = $frame_terminatorpos + strlen("\x00"); - - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_description) === 0) { - $frame_description = ''; - } - $frame_offset = $frame_terminatorpos + strlen("\x00"); - - $parsedFrame['ownerid'] = $frame_ownerid; - $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); - $parsedFrame['description'] = $frame_description; - unset($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'AENC')) || // 4.19 AENC Audio encryption - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'CRA'))) { // 4.21 CRA Audio encryption - // There may be more than one 'AENC' frames in a tag, - // but only one with the same 'Owner identifier' - //
      - // Owner identifier $00 - // Preview start $xx xx - // Preview length $xx xx - // Encryption info - - $frame_offset = 0; - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_ownerid) === 0) { - $frame_ownerid == ''; - } - $frame_offset = $frame_terminatorpos + strlen("\x00"); - $parsedFrame['ownerid'] = $frame_ownerid; - $parsedFrame['previewstart'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); - $frame_offset += 2; - $parsedFrame['previewlength'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); - $frame_offset += 2; - $parsedFrame['encryptioninfo'] = (string) substr($parsedFrame['data'], $frame_offset); - unset($parsedFrame['data']); - - - } elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'LINK')) || // 4.20 LINK Linked information - (($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'LNK'))) { // 4.22 LNK Linked information - // There may be more than one 'LINK' frame in a tag, - // but only one with the same contents - //
      - // ID3v2.3+ => Frame identifier $xx xx xx xx - // ID3v2.2 => Frame identifier $xx xx xx - // URL $00 - // ID and additional data - - $frame_offset = 0; - if ($id3v2_majorversion == 2) { - $parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 3); - $frame_offset += 3; - } else { - $parsedFrame['frameid'] = substr($parsedFrame['data'], $frame_offset, 4); - $frame_offset += 4; - } - - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_url = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_url) === 0) { - $frame_url = ''; - } - $frame_offset = $frame_terminatorpos + strlen("\x00"); - $parsedFrame['url'] = $frame_url; - - $parsedFrame['additionaldata'] = (string) substr($parsedFrame['data'], $frame_offset); - if (!empty($parsedFrame['framenameshort']) && $parsedFrame['url']) { - $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback_iso88591_utf8($parsedFrame['url']); - } - unset($parsedFrame['data']); - - - } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'POSS')) { // 4.21 POSS Position synchronisation frame (ID3v2.3+ only) - // There may only be one 'POSS' frame in each tag - // - // Time stamp format $xx - // Position $xx (xx ...) - - $frame_offset = 0; - $parsedFrame['timestampformat'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['position'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset)); - unset($parsedFrame['data']); - - - } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USER')) { // 4.22 USER Terms of use (ID3v2.3+ only) - // There may be more than one 'Terms of use' frame in a tag, - // but only one with the same 'Language' - //
      - // Text encoding $xx - // Language $xx xx xx - // The actual text - - $frame_offset = 0; - $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { - $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; - } - $frame_language = substr($parsedFrame['data'], $frame_offset, 3); - $frame_offset += 3; - $parsedFrame['language'] = $frame_language; - $parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false); - $parsedFrame['encodingid'] = $frame_textencoding; - $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); - - $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); - if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) { - $info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']); - } - unset($parsedFrame['data']); - - - } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'OWNE')) { // 4.23 OWNE Ownership frame (ID3v2.3+ only) - // There may only be one 'OWNE' frame in a tag - //
      - // Text encoding $xx - // Price paid $00 - // Date of purch. - // Seller - - $frame_offset = 0; - $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { - $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; - } - $parsedFrame['encodingid'] = $frame_textencoding; - $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); - - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_pricepaid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - $frame_offset = $frame_terminatorpos + strlen("\x00"); - - $parsedFrame['pricepaid']['currencyid'] = substr($frame_pricepaid, 0, 3); - $parsedFrame['pricepaid']['currency'] = $this->LookupCurrencyUnits($parsedFrame['pricepaid']['currencyid']); - $parsedFrame['pricepaid']['value'] = substr($frame_pricepaid, 3); - - $parsedFrame['purchasedate'] = substr($parsedFrame['data'], $frame_offset, 8); - if (!$this->IsValidDateStampString($parsedFrame['purchasedate'])) { - $parsedFrame['purchasedateunix'] = mktime (0, 0, 0, substr($parsedFrame['purchasedate'], 4, 2), substr($parsedFrame['purchasedate'], 6, 2), substr($parsedFrame['purchasedate'], 0, 4)); - } - $frame_offset += 8; - - $parsedFrame['seller'] = (string) substr($parsedFrame['data'], $frame_offset); - unset($parsedFrame['data']); - - - } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'COMR')) { // 4.24 COMR Commercial frame (ID3v2.3+ only) - // There may be more than one 'commercial frame' in a tag, - // but no two may be identical - //
      - // Text encoding $xx - // Price string $00 - // Valid until - // Contact URL $00 - // Received as $xx - // Name of seller $00 (00) - // Description $00 (00) - // Picture MIME type $00 - // Seller logo - - $frame_offset = 0; - $frame_textencoding = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $frame_textencoding_terminator = $this->TextEncodingTerminatorLookup($frame_textencoding); - if ((($id3v2_majorversion <= 3) && ($frame_textencoding > 1)) || (($id3v2_majorversion == 4) && ($frame_textencoding > 3))) { - $info['warning'][] = 'Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding'; - $frame_textencoding_terminator = "\x00"; - } - - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_pricestring = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - $frame_offset = $frame_terminatorpos + strlen("\x00"); - $frame_rawpricearray = explode('/', $frame_pricestring); - foreach ($frame_rawpricearray as $key => $val) { - $frame_currencyid = substr($val, 0, 3); - $parsedFrame['price'][$frame_currencyid]['currency'] = $this->LookupCurrencyUnits($frame_currencyid); - $parsedFrame['price'][$frame_currencyid]['value'] = substr($val, 3); - } - - $frame_datestring = substr($parsedFrame['data'], $frame_offset, 8); - $frame_offset += 8; - - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_contacturl = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - $frame_offset = $frame_terminatorpos + strlen("\x00"); - - $frame_receivedasid = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - - $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); - if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { - $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 - } - $frame_sellername = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_sellername) === 0) { - $frame_sellername = ''; - } - $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); - - $frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset); - if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) { - $frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00 - } - $frame_description = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_description) === 0) { - $frame_description = ''; - } - $frame_offset = $frame_terminatorpos + strlen($frame_textencoding_terminator); - - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_mimetype = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - $frame_offset = $frame_terminatorpos + strlen("\x00"); - - $frame_sellerlogo = substr($parsedFrame['data'], $frame_offset); - - $parsedFrame['encodingid'] = $frame_textencoding; - $parsedFrame['encoding'] = $this->TextEncodingNameLookup($frame_textencoding); - - $parsedFrame['pricevaliduntil'] = $frame_datestring; - $parsedFrame['contacturl'] = $frame_contacturl; - $parsedFrame['receivedasid'] = $frame_receivedasid; - $parsedFrame['receivedas'] = $this->COMRReceivedAsLookup($frame_receivedasid); - $parsedFrame['sellername'] = $frame_sellername; - $parsedFrame['description'] = $frame_description; - $parsedFrame['mime'] = $frame_mimetype; - $parsedFrame['logo'] = $frame_sellerlogo; - unset($parsedFrame['data']); - - - } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'ENCR')) { // 4.25 ENCR Encryption method registration (ID3v2.3+ only) - // There may be several 'ENCR' frames in a tag, - // but only one containing the same symbol - // and only one containing the same owner identifier - //
      - // Owner identifier $00 - // Method symbol $xx - // Encryption data - - $frame_offset = 0; - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_ownerid) === 0) { - $frame_ownerid = ''; - } - $frame_offset = $frame_terminatorpos + strlen("\x00"); - - $parsedFrame['ownerid'] = $frame_ownerid; - $parsedFrame['methodsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); - - - } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'GRID')) { // 4.26 GRID Group identification registration (ID3v2.3+ only) - - // There may be several 'GRID' frames in a tag, - // but only one containing the same symbol - // and only one containing the same owner identifier - //
      - // Owner identifier $00 - // Group symbol $xx - // Group dependent data - - $frame_offset = 0; - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_ownerid) === 0) { - $frame_ownerid = ''; - } - $frame_offset = $frame_terminatorpos + strlen("\x00"); - - $parsedFrame['ownerid'] = $frame_ownerid; - $parsedFrame['groupsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); - - - } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'PRIV')) { // 4.27 PRIV Private frame (ID3v2.3+ only) - // The tag may contain more than one 'PRIV' frame - // but only with different contents - //
      - // Owner identifier $00 - // The private data - - $frame_offset = 0; - $frame_terminatorpos = strpos($parsedFrame['data'], "\x00", $frame_offset); - $frame_ownerid = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset); - if (ord($frame_ownerid) === 0) { - $frame_ownerid = ''; - } - $frame_offset = $frame_terminatorpos + strlen("\x00"); - - $parsedFrame['ownerid'] = $frame_ownerid; - $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); - - - } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SIGN')) { // 4.28 SIGN Signature frame (ID3v2.4+ only) - // There may be more than one 'signature frame' in a tag, - // but no two may be identical - //
      - // Group symbol $xx - // Signature - - $frame_offset = 0; - $parsedFrame['groupsymbol'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $parsedFrame['data'] = (string) substr($parsedFrame['data'], $frame_offset); - - - } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'SEEK')) { // 4.29 SEEK Seek frame (ID3v2.4+ only) - // There may only be one 'seek frame' in a tag - //
      - // Minimum offset to next tag $xx xx xx xx - - $frame_offset = 0; - $parsedFrame['data'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); - - - } elseif (($id3v2_majorversion >= 4) && ($parsedFrame['frame_name'] == 'ASPI')) { // 4.30 ASPI Audio seek point index (ID3v2.4+ only) - // There may only be one 'audio seek point index' frame in a tag - //
      - // Indexed data start (S) $xx xx xx xx - // Indexed data length (L) $xx xx xx xx - // Number of index points (N) $xx xx - // Bits per index point (b) $xx - // Then for every index point the following data is included: - // Fraction at index (Fi) $xx (xx) - - $frame_offset = 0; - $parsedFrame['datastart'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); - $frame_offset += 4; - $parsedFrame['indexeddatalength'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); - $frame_offset += 4; - $parsedFrame['indexpoints'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); - $frame_offset += 2; - $parsedFrame['bitsperpoint'] = ord(substr($parsedFrame['data'], $frame_offset++, 1)); - $frame_bytesperpoint = ceil($parsedFrame['bitsperpoint'] / 8); - for ($i = 0; $i < $parsedFrame['indexpoints']; $i++) { - $parsedFrame['indexes'][$i] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, $frame_bytesperpoint)); - $frame_offset += $frame_bytesperpoint; - } - unset($parsedFrame['data']); - - } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'RGAD')) { // Replay Gain Adjustment - // http://privatewww.essex.ac.uk/~djmrob/replaygain/file_format_id3v2.html - // There may only be one 'RGAD' frame in a tag - //
      - // Peak Amplitude $xx $xx $xx $xx - // Radio Replay Gain Adjustment %aaabbbcd %dddddddd - // Audiophile Replay Gain Adjustment %aaabbbcd %dddddddd - // a - name code - // b - originator code - // c - sign bit - // d - replay gain adjustment - - $frame_offset = 0; - $parsedFrame['peakamplitude'] = getid3_lib::BigEndian2Float(substr($parsedFrame['data'], $frame_offset, 4)); - $frame_offset += 4; - $rg_track_adjustment = getid3_lib::Dec2Bin(substr($parsedFrame['data'], $frame_offset, 2)); - $frame_offset += 2; - $rg_album_adjustment = getid3_lib::Dec2Bin(substr($parsedFrame['data'], $frame_offset, 2)); - $frame_offset += 2; - $parsedFrame['raw']['track']['name'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 0, 3)); - $parsedFrame['raw']['track']['originator'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 3, 3)); - $parsedFrame['raw']['track']['signbit'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 6, 1)); - $parsedFrame['raw']['track']['adjustment'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 7, 9)); - $parsedFrame['raw']['album']['name'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 0, 3)); - $parsedFrame['raw']['album']['originator'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 3, 3)); - $parsedFrame['raw']['album']['signbit'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 6, 1)); - $parsedFrame['raw']['album']['adjustment'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 7, 9)); - $parsedFrame['track']['name'] = getid3_lib::RGADnameLookup($parsedFrame['raw']['track']['name']); - $parsedFrame['track']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['track']['originator']); - $parsedFrame['track']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['track']['adjustment'], $parsedFrame['raw']['track']['signbit']); - $parsedFrame['album']['name'] = getid3_lib::RGADnameLookup($parsedFrame['raw']['album']['name']); - $parsedFrame['album']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['album']['originator']); - $parsedFrame['album']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['album']['adjustment'], $parsedFrame['raw']['album']['signbit']); - - $info['replay_gain']['track']['peak'] = $parsedFrame['peakamplitude']; - $info['replay_gain']['track']['originator'] = $parsedFrame['track']['originator']; - $info['replay_gain']['track']['adjustment'] = $parsedFrame['track']['adjustment']; - $info['replay_gain']['album']['originator'] = $parsedFrame['album']['originator']; - $info['replay_gain']['album']['adjustment'] = $parsedFrame['album']['adjustment']; - - unset($parsedFrame['data']); - - } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'CHAP')) { // CHAP Chapters frame (ID3v2.3+ only) - // http://id3.org/id3v2-chapters-1.0 - // (10 bytes) - // Element ID $00 - // Start time $xx xx xx xx - // End time $xx xx xx xx - // Start offset $xx xx xx xx - // End offset $xx xx xx xx - // - - $frame_offset = 0; - @list($parsedFrame['element_id']) = explode("\x00", $parsedFrame['data'], 2); - $frame_offset += strlen($parsedFrame['element_id']."\x00"); - $parsedFrame['time_begin'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); - $frame_offset += 4; - $parsedFrame['time_end'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); - $frame_offset += 4; - if (substr($parsedFrame['data'], $frame_offset, 4) != "\xFF\xFF\xFF\xFF") { - // "If these bytes are all set to 0xFF then the value should be ignored and the start time value should be utilized." - $parsedFrame['offset_begin'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); - } - $frame_offset += 4; - if (substr($parsedFrame['data'], $frame_offset, 4) != "\xFF\xFF\xFF\xFF") { - // "If these bytes are all set to 0xFF then the value should be ignored and the start time value should be utilized." - $parsedFrame['offset_end'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); - } - $frame_offset += 4; - - if ($frame_offset < strlen($parsedFrame['data'])) { - $parsedFrame['subframes'] = array(); - while ($frame_offset < strlen($parsedFrame['data'])) { - // - $subframe = array(); - $subframe['name'] = substr($parsedFrame['data'], $frame_offset, 4); - $frame_offset += 4; - $subframe['size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); - $frame_offset += 4; - $subframe['flags_raw'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); - $frame_offset += 2; - if ($subframe['size'] > (strlen($parsedFrame['data']) - $frame_offset)) { - $info['warning'][] = 'CHAP subframe "'.$subframe['name'].'" at frame offset '.$frame_offset.' claims to be "'.$subframe['size'].'" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)'; - break; - } - $subframe_rawdata = substr($parsedFrame['data'], $frame_offset, $subframe['size']); - $frame_offset += $subframe['size']; - - $subframe['encodingid'] = ord(substr($subframe_rawdata, 0, 1)); - $subframe['text'] = substr($subframe_rawdata, 1); - $subframe['encoding'] = $this->TextEncodingNameLookup($subframe['encodingid']); - $encoding_converted_text = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe['text']));; - switch (substr($encoding_converted_text, 0, 2)) { - case "\xFF\xFE": - case "\xFE\xFF": - switch (strtoupper($info['id3v2']['encoding'])) { - case 'ISO-8859-1': - case 'UTF-8': - $encoding_converted_text = substr($encoding_converted_text, 2); - // remove unwanted byte-order-marks - break; - default: - // ignore - break; - } - break; - default: - // do not remove BOM - break; - } - - if (($subframe['name'] == 'TIT2') || ($subframe['name'] == 'TIT3')) { - if ($subframe['name'] == 'TIT2') { - $parsedFrame['chapter_name'] = $encoding_converted_text; - } elseif ($subframe['name'] == 'TIT3') { - $parsedFrame['chapter_description'] = $encoding_converted_text; - } - $parsedFrame['subframes'][] = $subframe; - } else { - $info['warning'][] = 'ID3v2.CHAP subframe "'.$subframe['name'].'" not handled (only TIT2 and TIT3)'; - } - } - unset($subframe_rawdata, $subframe, $encoding_converted_text); - } - - $id3v2_chapter_entry = array(); - foreach (array('id', 'time_begin', 'time_end', 'offset_begin', 'offset_end', 'chapter_name', 'chapter_description') as $id3v2_chapter_key) { - if (isset($parsedFrame[$id3v2_chapter_key])) { - $id3v2_chapter_entry[$id3v2_chapter_key] = $parsedFrame[$id3v2_chapter_key]; - } - } - if (!isset($info['id3v2']['chapters'])) { - $info['id3v2']['chapters'] = array(); - } - $info['id3v2']['chapters'][] = $id3v2_chapter_entry; - unset($id3v2_chapter_entry, $id3v2_chapter_key); - - - } elseif (($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'CTOC')) { // CTOC Chapters Table Of Contents frame (ID3v2.3+ only) - // http://id3.org/id3v2-chapters-1.0 - // (10 bytes) - // Element ID $00 - // CTOC flags %xx - // Entry count $xx - // Child Element ID $00 /* zero or more child CHAP or CTOC entries */ - // - - $frame_offset = 0; - @list($parsedFrame['element_id']) = explode("\x00", $parsedFrame['data'], 2); - $frame_offset += strlen($parsedFrame['element_id']."\x00"); - $ctoc_flags_raw = ord(substr($parsedFrame['data'], $frame_offset, 1)); - $frame_offset += 1; - $parsedFrame['entry_count'] = ord(substr($parsedFrame['data'], $frame_offset, 1)); - $frame_offset += 1; - - $terminator_position = null; - for ($i = 0; $i < $parsedFrame['entry_count']; $i++) { - $terminator_position = strpos($parsedFrame['data'], "\x00", $frame_offset); - $parsedFrame['child_element_ids'][$i] = substr($parsedFrame['data'], $frame_offset, $terminator_position - $frame_offset); - $frame_offset = $terminator_position + 1; - } - - $parsedFrame['ctoc_flags']['ordered'] = (bool) ($ctoc_flags_raw & 0x01); - $parsedFrame['ctoc_flags']['top_level'] = (bool) ($ctoc_flags_raw & 0x03); - - unset($ctoc_flags_raw, $terminator_position); - - if ($frame_offset < strlen($parsedFrame['data'])) { - $parsedFrame['subframes'] = array(); - while ($frame_offset < strlen($parsedFrame['data'])) { - // - $subframe = array(); - $subframe['name'] = substr($parsedFrame['data'], $frame_offset, 4); - $frame_offset += 4; - $subframe['size'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 4)); - $frame_offset += 4; - $subframe['flags_raw'] = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2)); - $frame_offset += 2; - if ($subframe['size'] > (strlen($parsedFrame['data']) - $frame_offset)) { - $info['warning'][] = 'CTOS subframe "'.$subframe['name'].'" at frame offset '.$frame_offset.' claims to be "'.$subframe['size'].'" bytes, which is more than the available data ('.(strlen($parsedFrame['data']) - $frame_offset).' bytes)'; - break; - } - $subframe_rawdata = substr($parsedFrame['data'], $frame_offset, $subframe['size']); - $frame_offset += $subframe['size']; - - $subframe['encodingid'] = ord(substr($subframe_rawdata, 0, 1)); - $subframe['text'] = substr($subframe_rawdata, 1); - $subframe['encoding'] = $this->TextEncodingNameLookup($subframe['encodingid']); - $encoding_converted_text = trim(getid3_lib::iconv_fallback($subframe['encoding'], $info['encoding'], $subframe['text']));; - switch (substr($encoding_converted_text, 0, 2)) { - case "\xFF\xFE": - case "\xFE\xFF": - switch (strtoupper($info['id3v2']['encoding'])) { - case 'ISO-8859-1': - case 'UTF-8': - $encoding_converted_text = substr($encoding_converted_text, 2); - // remove unwanted byte-order-marks - break; - default: - // ignore - break; - } - break; - default: - // do not remove BOM - break; - } - - if (($subframe['name'] == 'TIT2') || ($subframe['name'] == 'TIT3')) { - if ($subframe['name'] == 'TIT2') { - $parsedFrame['toc_name'] = $encoding_converted_text; - } elseif ($subframe['name'] == 'TIT3') { - $parsedFrame['toc_description'] = $encoding_converted_text; - } - $parsedFrame['subframes'][] = $subframe; - } else { - $info['warning'][] = 'ID3v2.CTOC subframe "'.$subframe['name'].'" not handled (only TIT2 and TIT3)'; - } - } - unset($subframe_rawdata, $subframe, $encoding_converted_text); - } - - } - - return true; - } - - - public function DeUnsynchronise($data) { - return str_replace("\xFF\x00", "\xFF", $data); - } - - public function LookupExtendedHeaderRestrictionsTagSizeLimits($index) { - static $LookupExtendedHeaderRestrictionsTagSizeLimits = array( - 0x00 => 'No more than 128 frames and 1 MB total tag size', - 0x01 => 'No more than 64 frames and 128 KB total tag size', - 0x02 => 'No more than 32 frames and 40 KB total tag size', - 0x03 => 'No more than 32 frames and 4 KB total tag size', - ); - return (isset($LookupExtendedHeaderRestrictionsTagSizeLimits[$index]) ? $LookupExtendedHeaderRestrictionsTagSizeLimits[$index] : ''); - } - - public function LookupExtendedHeaderRestrictionsTextEncodings($index) { - static $LookupExtendedHeaderRestrictionsTextEncodings = array( - 0x00 => 'No restrictions', - 0x01 => 'Strings are only encoded with ISO-8859-1 or UTF-8', - ); - return (isset($LookupExtendedHeaderRestrictionsTextEncodings[$index]) ? $LookupExtendedHeaderRestrictionsTextEncodings[$index] : ''); - } - - public function LookupExtendedHeaderRestrictionsTextFieldSize($index) { - static $LookupExtendedHeaderRestrictionsTextFieldSize = array( - 0x00 => 'No restrictions', - 0x01 => 'No string is longer than 1024 characters', - 0x02 => 'No string is longer than 128 characters', - 0x03 => 'No string is longer than 30 characters', - ); - return (isset($LookupExtendedHeaderRestrictionsTextFieldSize[$index]) ? $LookupExtendedHeaderRestrictionsTextFieldSize[$index] : ''); - } - - public function LookupExtendedHeaderRestrictionsImageEncoding($index) { - static $LookupExtendedHeaderRestrictionsImageEncoding = array( - 0x00 => 'No restrictions', - 0x01 => 'Images are encoded only with PNG or JPEG', - ); - return (isset($LookupExtendedHeaderRestrictionsImageEncoding[$index]) ? $LookupExtendedHeaderRestrictionsImageEncoding[$index] : ''); - } - - public function LookupExtendedHeaderRestrictionsImageSizeSize($index) { - static $LookupExtendedHeaderRestrictionsImageSizeSize = array( - 0x00 => 'No restrictions', - 0x01 => 'All images are 256x256 pixels or smaller', - 0x02 => 'All images are 64x64 pixels or smaller', - 0x03 => 'All images are exactly 64x64 pixels, unless required otherwise', - ); - return (isset($LookupExtendedHeaderRestrictionsImageSizeSize[$index]) ? $LookupExtendedHeaderRestrictionsImageSizeSize[$index] : ''); - } - - public function LookupCurrencyUnits($currencyid) { - - $begin = __LINE__; - - /** This is not a comment! - - - AED Dirhams - AFA Afghanis - ALL Leke - AMD Drams - ANG Guilders - AOA Kwanza - ARS Pesos - ATS Schillings - AUD Dollars - AWG Guilders - AZM Manats - BAM Convertible Marka - BBD Dollars - BDT Taka - BEF Francs - BGL Leva - BHD Dinars - BIF Francs - BMD Dollars - BND Dollars - BOB Bolivianos - BRL Brazil Real - BSD Dollars - BTN Ngultrum - BWP Pulas - BYR Rubles - BZD Dollars - CAD Dollars - CDF Congolese Francs - CHF Francs - CLP Pesos - CNY Yuan Renminbi - COP Pesos - CRC Colones - CUP Pesos - CVE Escudos - CYP Pounds - CZK Koruny - DEM Deutsche Marks - DJF Francs - DKK Kroner - DOP Pesos - DZD Algeria Dinars - EEK Krooni - EGP Pounds - ERN Nakfa - ESP Pesetas - ETB Birr - EUR Euro - FIM Markkaa - FJD Dollars - FKP Pounds - FRF Francs - GBP Pounds - GEL Lari - GGP Pounds - GHC Cedis - GIP Pounds - GMD Dalasi - GNF Francs - GRD Drachmae - GTQ Quetzales - GYD Dollars - HKD Dollars - HNL Lempiras - HRK Kuna - HTG Gourdes - HUF Forints - IDR Rupiahs - IEP Pounds - ILS New Shekels - IMP Pounds - INR Rupees - IQD Dinars - IRR Rials - ISK Kronur - ITL Lire - JEP Pounds - JMD Dollars - JOD Dinars - JPY Yen - KES Shillings - KGS Soms - KHR Riels - KMF Francs - KPW Won - KWD Dinars - KYD Dollars - KZT Tenge - LAK Kips - LBP Pounds - LKR Rupees - LRD Dollars - LSL Maloti - LTL Litai - LUF Francs - LVL Lati - LYD Dinars - MAD Dirhams - MDL Lei - MGF Malagasy Francs - MKD Denars - MMK Kyats - MNT Tugriks - MOP Patacas - MRO Ouguiyas - MTL Liri - MUR Rupees - MVR Rufiyaa - MWK Kwachas - MXN Pesos - MYR Ringgits - MZM Meticais - NAD Dollars - NGN Nairas - NIO Gold Cordobas - NLG Guilders - NOK Krone - NPR Nepal Rupees - NZD Dollars - OMR Rials - PAB Balboa - PEN Nuevos Soles - PGK Kina - PHP Pesos - PKR Rupees - PLN Zlotych - PTE Escudos - PYG Guarani - QAR Rials - ROL Lei - RUR Rubles - RWF Rwanda Francs - SAR Riyals - SBD Dollars - SCR Rupees - SDD Dinars - SEK Kronor - SGD Dollars - SHP Pounds - SIT Tolars - SKK Koruny - SLL Leones - SOS Shillings - SPL Luigini - SRG Guilders - STD Dobras - SVC Colones - SYP Pounds - SZL Emalangeni - THB Baht - TJR Rubles - TMM Manats - TND Dinars - TOP Pa'anga - TRL Liras - TTD Dollars - TVD Tuvalu Dollars - TWD New Dollars - TZS Shillings - UAH Hryvnia - UGX Shillings - USD Dollars - UYU Pesos - UZS Sums - VAL Lire - VEB Bolivares - VND Dong - VUV Vatu - WST Tala - XAF Francs - XAG Ounces - XAU Ounces - XCD Dollars - XDR Special Drawing Rights - XPD Ounces - XPF Francs - XPT Ounces - YER Rials - YUM New Dinars - ZAR Rand - ZMK Kwacha - ZWD Zimbabwe Dollars - - */ - - return getid3_lib::EmbeddedLookup($currencyid, $begin, __LINE__, __FILE__, 'id3v2-currency-units'); - } - - - public function LookupCurrencyCountry($currencyid) { - - $begin = __LINE__; - - /** This is not a comment! - - AED United Arab Emirates - AFA Afghanistan - ALL Albania - AMD Armenia - ANG Netherlands Antilles - AOA Angola - ARS Argentina - ATS Austria - AUD Australia - AWG Aruba - AZM Azerbaijan - BAM Bosnia and Herzegovina - BBD Barbados - BDT Bangladesh - BEF Belgium - BGL Bulgaria - BHD Bahrain - BIF Burundi - BMD Bermuda - BND Brunei Darussalam - BOB Bolivia - BRL Brazil - BSD Bahamas - BTN Bhutan - BWP Botswana - BYR Belarus - BZD Belize - CAD Canada - CDF Congo/Kinshasa - CHF Switzerland - CLP Chile - CNY China - COP Colombia - CRC Costa Rica - CUP Cuba - CVE Cape Verde - CYP Cyprus - CZK Czech Republic - DEM Germany - DJF Djibouti - DKK Denmark - DOP Dominican Republic - DZD Algeria - EEK Estonia - EGP Egypt - ERN Eritrea - ESP Spain - ETB Ethiopia - EUR Euro Member Countries - FIM Finland - FJD Fiji - FKP Falkland Islands (Malvinas) - FRF France - GBP United Kingdom - GEL Georgia - GGP Guernsey - GHC Ghana - GIP Gibraltar - GMD Gambia - GNF Guinea - GRD Greece - GTQ Guatemala - GYD Guyana - HKD Hong Kong - HNL Honduras - HRK Croatia - HTG Haiti - HUF Hungary - IDR Indonesia - IEP Ireland (Eire) - ILS Israel - IMP Isle of Man - INR India - IQD Iraq - IRR Iran - ISK Iceland - ITL Italy - JEP Jersey - JMD Jamaica - JOD Jordan - JPY Japan - KES Kenya - KGS Kyrgyzstan - KHR Cambodia - KMF Comoros - KPW Korea - KWD Kuwait - KYD Cayman Islands - KZT Kazakstan - LAK Laos - LBP Lebanon - LKR Sri Lanka - LRD Liberia - LSL Lesotho - LTL Lithuania - LUF Luxembourg - LVL Latvia - LYD Libya - MAD Morocco - MDL Moldova - MGF Madagascar - MKD Macedonia - MMK Myanmar (Burma) - MNT Mongolia - MOP Macau - MRO Mauritania - MTL Malta - MUR Mauritius - MVR Maldives (Maldive Islands) - MWK Malawi - MXN Mexico - MYR Malaysia - MZM Mozambique - NAD Namibia - NGN Nigeria - NIO Nicaragua - NLG Netherlands (Holland) - NOK Norway - NPR Nepal - NZD New Zealand - OMR Oman - PAB Panama - PEN Peru - PGK Papua New Guinea - PHP Philippines - PKR Pakistan - PLN Poland - PTE Portugal - PYG Paraguay - QAR Qatar - ROL Romania - RUR Russia - RWF Rwanda - SAR Saudi Arabia - SBD Solomon Islands - SCR Seychelles - SDD Sudan - SEK Sweden - SGD Singapore - SHP Saint Helena - SIT Slovenia - SKK Slovakia - SLL Sierra Leone - SOS Somalia - SPL Seborga - SRG Suriname - STD São Tome and Principe - SVC El Salvador - SYP Syria - SZL Swaziland - THB Thailand - TJR Tajikistan - TMM Turkmenistan - TND Tunisia - TOP Tonga - TRL Turkey - TTD Trinidad and Tobago - TVD Tuvalu - TWD Taiwan - TZS Tanzania - UAH Ukraine - UGX Uganda - USD United States of America - UYU Uruguay - UZS Uzbekistan - VAL Vatican City - VEB Venezuela - VND Viet Nam - VUV Vanuatu - WST Samoa - XAF Communauté Financière Africaine - XAG Silver - XAU Gold - XCD East Caribbean - XDR International Monetary Fund - XPD Palladium - XPF Comptoirs Français du Pacifique - XPT Platinum - YER Yemen - YUM Yugoslavia - ZAR South Africa - ZMK Zambia - ZWD Zimbabwe - - */ - - return getid3_lib::EmbeddedLookup($currencyid, $begin, __LINE__, __FILE__, 'id3v2-currency-country'); - } - - - - public static function LanguageLookup($languagecode, $casesensitive=false) { - - if (!$casesensitive) { - $languagecode = strtolower($languagecode); - } - - // http://www.id3.org/id3v2.4.0-structure.txt - // [4. ID3v2 frame overview] - // The three byte language field, present in several frames, is used to - // describe the language of the frame's content, according to ISO-639-2 - // [ISO-639-2]. The language should be represented in lower case. If the - // language is not known the string "XXX" should be used. - - - // ISO 639-2 - http://www.id3.org/iso639-2.html - - $begin = __LINE__; - - /** This is not a comment! - - XXX unknown - xxx unknown - aar Afar - abk Abkhazian - ace Achinese - ach Acoli - ada Adangme - afa Afro-Asiatic (Other) - afh Afrihili - afr Afrikaans - aka Akan - akk Akkadian - alb Albanian - ale Aleut - alg Algonquian Languages - amh Amharic - ang English, Old (ca. 450-1100) - apa Apache Languages - ara Arabic - arc Aramaic - arm Armenian - arn Araucanian - arp Arapaho - art Artificial (Other) - arw Arawak - asm Assamese - ath Athapascan Languages - ava Avaric - ave Avestan - awa Awadhi - aym Aymara - aze Azerbaijani - bad Banda - bai Bamileke Languages - bak Bashkir - bal Baluchi - bam Bambara - ban Balinese - baq Basque - bas Basa - bat Baltic (Other) - bej Beja - bel Byelorussian - bem Bemba - ben Bengali - ber Berber (Other) - bho Bhojpuri - bih Bihari - bik Bikol - bin Bini - bis Bislama - bla Siksika - bnt Bantu (Other) - bod Tibetan - bra Braj - bre Breton - bua Buriat - bug Buginese - bul Bulgarian - bur Burmese - cad Caddo - cai Central American Indian (Other) - car Carib - cat Catalan - cau Caucasian (Other) - ceb Cebuano - cel Celtic (Other) - ces Czech - cha Chamorro - chb Chibcha - che Chechen - chg Chagatai - chi Chinese - chm Mari - chn Chinook jargon - cho Choctaw - chr Cherokee - chu Church Slavic - chv Chuvash - chy Cheyenne - cop Coptic - cor Cornish - cos Corsican - cpe Creoles and Pidgins, English-based (Other) - cpf Creoles and Pidgins, French-based (Other) - cpp Creoles and Pidgins, Portuguese-based (Other) - cre Cree - crp Creoles and Pidgins (Other) - cus Cushitic (Other) - cym Welsh - cze Czech - dak Dakota - dan Danish - del Delaware - deu German - din Dinka - div Divehi - doi Dogri - dra Dravidian (Other) - dua Duala - dum Dutch, Middle (ca. 1050-1350) - dut Dutch - dyu Dyula - dzo Dzongkha - efi Efik - egy Egyptian (Ancient) - eka Ekajuk - ell Greek, Modern (1453-) - elx Elamite - eng English - enm English, Middle (ca. 1100-1500) - epo Esperanto - esk Eskimo (Other) - esl Spanish - est Estonian - eus Basque - ewe Ewe - ewo Ewondo - fan Fang - fao Faroese - fas Persian - fat Fanti - fij Fijian - fin Finnish - fiu Finno-Ugrian (Other) - fon Fon - fra French - fre French - frm French, Middle (ca. 1400-1600) - fro French, Old (842- ca. 1400) - fry Frisian - ful Fulah - gaa Ga - gae Gaelic (Scots) - gai Irish - gay Gayo - gdh Gaelic (Scots) - gem Germanic (Other) - geo Georgian - ger German - gez Geez - gil Gilbertese - glg Gallegan - gmh German, Middle High (ca. 1050-1500) - goh German, Old High (ca. 750-1050) - gon Gondi - got Gothic - grb Grebo - grc Greek, Ancient (to 1453) - gre Greek, Modern (1453-) - grn Guarani - guj Gujarati - hai Haida - hau Hausa - haw Hawaiian - heb Hebrew - her Herero - hil Hiligaynon - him Himachali - hin Hindi - hmo Hiri Motu - hun Hungarian - hup Hupa - hye Armenian - iba Iban - ibo Igbo - ice Icelandic - ijo Ijo - iku Inuktitut - ilo Iloko - ina Interlingua (International Auxiliary language Association) - inc Indic (Other) - ind Indonesian - ine Indo-European (Other) - ine Interlingue - ipk Inupiak - ira Iranian (Other) - iri Irish - iro Iroquoian uages - isl Icelandic - ita Italian - jav Javanese - jaw Javanese - jpn Japanese - jpr Judeo-Persian - jrb Judeo-Arabic - kaa Kara-Kalpak - kab Kabyle - kac Kachin - kal Greenlandic - kam Kamba - kan Kannada - kar Karen - kas Kashmiri - kat Georgian - kau Kanuri - kaw Kawi - kaz Kazakh - kha Khasi - khi Khoisan (Other) - khm Khmer - kho Khotanese - kik Kikuyu - kin Kinyarwanda - kir Kirghiz - kok Konkani - kom Komi - kon Kongo - kor Korean - kpe Kpelle - kro Kru - kru Kurukh - kua Kuanyama - kum Kumyk - kur Kurdish - kus Kusaie - kut Kutenai - lad Ladino - lah Lahnda - lam Lamba - lao Lao - lat Latin - lav Latvian - lez Lezghian - lin Lingala - lit Lithuanian - lol Mongo - loz Lozi - ltz Letzeburgesch - lub Luba-Katanga - lug Ganda - lui Luiseno - lun Lunda - luo Luo (Kenya and Tanzania) - mac Macedonian - mad Madurese - mag Magahi - mah Marshall - mai Maithili - mak Macedonian - mak Makasar - mal Malayalam - man Mandingo - mao Maori - map Austronesian (Other) - mar Marathi - mas Masai - max Manx - may Malay - men Mende - mga Irish, Middle (900 - 1200) - mic Micmac - min Minangkabau - mis Miscellaneous (Other) - mkh Mon-Kmer (Other) - mlg Malagasy - mlt Maltese - mni Manipuri - mno Manobo Languages - moh Mohawk - mol Moldavian - mon Mongolian - mos Mossi - mri Maori - msa Malay - mul Multiple Languages - mun Munda Languages - mus Creek - mwr Marwari - mya Burmese - myn Mayan Languages - nah Aztec - nai North American Indian (Other) - nau Nauru - nav Navajo - nbl Ndebele, South - nde Ndebele, North - ndo Ndongo - nep Nepali - new Newari - nic Niger-Kordofanian (Other) - niu Niuean - nla Dutch - nno Norwegian (Nynorsk) - non Norse, Old - nor Norwegian - nso Sotho, Northern - nub Nubian Languages - nya Nyanja - nym Nyamwezi - nyn Nyankole - nyo Nyoro - nzi Nzima - oci Langue d'Oc (post 1500) - oji Ojibwa - ori Oriya - orm Oromo - osa Osage - oss Ossetic - ota Turkish, Ottoman (1500 - 1928) - oto Otomian Languages - paa Papuan-Australian (Other) - pag Pangasinan - pal Pahlavi - pam Pampanga - pan Panjabi - pap Papiamento - pau Palauan - peo Persian, Old (ca 600 - 400 B.C.) - per Persian - phn Phoenician - pli Pali - pol Polish - pon Ponape - por Portuguese - pra Prakrit uages - pro Provencal, Old (to 1500) - pus Pushto - que Quechua - raj Rajasthani - rar Rarotongan - roa Romance (Other) - roh Rhaeto-Romance - rom Romany - ron Romanian - rum Romanian - run Rundi - rus Russian - sad Sandawe - sag Sango - sah Yakut - sai South American Indian (Other) - sal Salishan Languages - sam Samaritan Aramaic - san Sanskrit - sco Scots - scr Serbo-Croatian - sel Selkup - sem Semitic (Other) - sga Irish, Old (to 900) - shn Shan - sid Sidamo - sin Singhalese - sio Siouan Languages - sit Sino-Tibetan (Other) - sla Slavic (Other) - slk Slovak - slo Slovak - slv Slovenian - smi Sami Languages - smo Samoan - sna Shona - snd Sindhi - sog Sogdian - som Somali - son Songhai - sot Sotho, Southern - spa Spanish - sqi Albanian - srd Sardinian - srr Serer - ssa Nilo-Saharan (Other) - ssw Siswant - ssw Swazi - suk Sukuma - sun Sudanese - sus Susu - sux Sumerian - sve Swedish - swa Swahili - swe Swedish - syr Syriac - tah Tahitian - tam Tamil - tat Tatar - tel Telugu - tem Timne - ter Tereno - tgk Tajik - tgl Tagalog - tha Thai - tib Tibetan - tig Tigre - tir Tigrinya - tiv Tivi - tli Tlingit - tmh Tamashek - tog Tonga (Nyasa) - ton Tonga (Tonga Islands) - tru Truk - tsi Tsimshian - tsn Tswana - tso Tsonga - tuk Turkmen - tum Tumbuka - tur Turkish - tut Altaic (Other) - twi Twi - tyv Tuvinian - uga Ugaritic - uig Uighur - ukr Ukrainian - umb Umbundu - und Undetermined - urd Urdu - uzb Uzbek - vai Vai - ven Venda - vie Vietnamese - vol Volapük - vot Votic - wak Wakashan Languages - wal Walamo - war Waray - was Washo - wel Welsh - wen Sorbian Languages - wol Wolof - xho Xhosa - yao Yao - yap Yap - yid Yiddish - yor Yoruba - zap Zapotec - zen Zenaga - zha Zhuang - zho Chinese - zul Zulu - zun Zuni - - */ - - return getid3_lib::EmbeddedLookup($languagecode, $begin, __LINE__, __FILE__, 'id3v2-languagecode'); - } - - - public static function ETCOEventLookup($index) { - if (($index >= 0x17) && ($index <= 0xDF)) { - return 'reserved for future use'; - } - if (($index >= 0xE0) && ($index <= 0xEF)) { - return 'not predefined synch 0-F'; - } - if (($index >= 0xF0) && ($index <= 0xFC)) { - return 'reserved for future use'; - } - - static $EventLookup = array( - 0x00 => 'padding (has no meaning)', - 0x01 => 'end of initial silence', - 0x02 => 'intro start', - 0x03 => 'main part start', - 0x04 => 'outro start', - 0x05 => 'outro end', - 0x06 => 'verse start', - 0x07 => 'refrain start', - 0x08 => 'interlude start', - 0x09 => 'theme start', - 0x0A => 'variation start', - 0x0B => 'key change', - 0x0C => 'time change', - 0x0D => 'momentary unwanted noise (Snap, Crackle & Pop)', - 0x0E => 'sustained noise', - 0x0F => 'sustained noise end', - 0x10 => 'intro end', - 0x11 => 'main part end', - 0x12 => 'verse end', - 0x13 => 'refrain end', - 0x14 => 'theme end', - 0x15 => 'profanity', - 0x16 => 'profanity end', - 0xFD => 'audio end (start of silence)', - 0xFE => 'audio file ends', - 0xFF => 'one more byte of events follows' - ); - - return (isset($EventLookup[$index]) ? $EventLookup[$index] : ''); - } - - public static function SYTLContentTypeLookup($index) { - static $SYTLContentTypeLookup = array( - 0x00 => 'other', - 0x01 => 'lyrics', - 0x02 => 'text transcription', - 0x03 => 'movement/part name', // (e.g. 'Adagio') - 0x04 => 'events', // (e.g. 'Don Quijote enters the stage') - 0x05 => 'chord', // (e.g. 'Bb F Fsus') - 0x06 => 'trivia/\'pop up\' information', - 0x07 => 'URLs to webpages', - 0x08 => 'URLs to images' - ); - - return (isset($SYTLContentTypeLookup[$index]) ? $SYTLContentTypeLookup[$index] : ''); - } - - public static function APICPictureTypeLookup($index, $returnarray=false) { - static $APICPictureTypeLookup = array( - 0x00 => 'Other', - 0x01 => '32x32 pixels \'file icon\' (PNG only)', - 0x02 => 'Other file icon', - 0x03 => 'Cover (front)', - 0x04 => 'Cover (back)', - 0x05 => 'Leaflet page', - 0x06 => 'Media (e.g. label side of CD)', - 0x07 => 'Lead artist/lead performer/soloist', - 0x08 => 'Artist/performer', - 0x09 => 'Conductor', - 0x0A => 'Band/Orchestra', - 0x0B => 'Composer', - 0x0C => 'Lyricist/text writer', - 0x0D => 'Recording Location', - 0x0E => 'During recording', - 0x0F => 'During performance', - 0x10 => 'Movie/video screen capture', - 0x11 => 'A bright coloured fish', - 0x12 => 'Illustration', - 0x13 => 'Band/artist logotype', - 0x14 => 'Publisher/Studio logotype' - ); - if ($returnarray) { - return $APICPictureTypeLookup; - } - return (isset($APICPictureTypeLookup[$index]) ? $APICPictureTypeLookup[$index] : ''); - } - - public static function COMRReceivedAsLookup($index) { - static $COMRReceivedAsLookup = array( - 0x00 => 'Other', - 0x01 => 'Standard CD album with other songs', - 0x02 => 'Compressed audio on CD', - 0x03 => 'File over the Internet', - 0x04 => 'Stream over the Internet', - 0x05 => 'As note sheets', - 0x06 => 'As note sheets in a book with other sheets', - 0x07 => 'Music on other media', - 0x08 => 'Non-musical merchandise' - ); - - return (isset($COMRReceivedAsLookup[$index]) ? $COMRReceivedAsLookup[$index] : ''); - } - - public static function RVA2ChannelTypeLookup($index) { - static $RVA2ChannelTypeLookup = array( - 0x00 => 'Other', - 0x01 => 'Master volume', - 0x02 => 'Front right', - 0x03 => 'Front left', - 0x04 => 'Back right', - 0x05 => 'Back left', - 0x06 => 'Front centre', - 0x07 => 'Back centre', - 0x08 => 'Subwoofer' - ); - - return (isset($RVA2ChannelTypeLookup[$index]) ? $RVA2ChannelTypeLookup[$index] : ''); - } - - public static function FrameNameLongLookup($framename) { - - $begin = __LINE__; - - /** This is not a comment! - - AENC Audio encryption - APIC Attached picture - ASPI Audio seek point index - BUF Recommended buffer size - CNT Play counter - COM Comments - COMM Comments - COMR Commercial frame - CRA Audio encryption - CRM Encrypted meta frame - ENCR Encryption method registration - EQU Equalisation - EQU2 Equalisation (2) - EQUA Equalisation - ETC Event timing codes - ETCO Event timing codes - GEO General encapsulated object - GEOB General encapsulated object - GRID Group identification registration - IPL Involved people list - IPLS Involved people list - LINK Linked information - LNK Linked information - MCDI Music CD identifier - MCI Music CD Identifier - MLL MPEG location lookup table - MLLT MPEG location lookup table - OWNE Ownership frame - PCNT Play counter - PIC Attached picture - POP Popularimeter - POPM Popularimeter - POSS Position synchronisation frame - PRIV Private frame - RBUF Recommended buffer size - REV Reverb - RVA Relative volume adjustment - RVA2 Relative volume adjustment (2) - RVAD Relative volume adjustment - RVRB Reverb - SEEK Seek frame - SIGN Signature frame - SLT Synchronised lyric/text - STC Synced tempo codes - SYLT Synchronised lyric/text - SYTC Synchronised tempo codes - TAL Album/Movie/Show title - TALB Album/Movie/Show title - TBP BPM (Beats Per Minute) - TBPM BPM (beats per minute) - TCM Composer - TCMP Part of a compilation - TCO Content type - TCOM Composer - TCON Content type - TCOP Copyright message - TCP Part of a compilation - TCR Copyright message - TDA Date - TDAT Date - TDEN Encoding time - TDLY Playlist delay - TDOR Original release time - TDRC Recording time - TDRL Release time - TDTG Tagging time - TDY Playlist delay - TEN Encoded by - TENC Encoded by - TEXT Lyricist/Text writer - TFLT File type - TFT File type - TIM Time - TIME Time - TIPL Involved people list - TIT1 Content group description - TIT2 Title/songname/content description - TIT3 Subtitle/Description refinement - TKE Initial key - TKEY Initial key - TLA Language(s) - TLAN Language(s) - TLE Length - TLEN Length - TMCL Musician credits list - TMED Media type - TMOO Mood - TMT Media type - TOA Original artist(s)/performer(s) - TOAL Original album/movie/show title - TOF Original filename - TOFN Original filename - TOL Original Lyricist(s)/text writer(s) - TOLY Original lyricist(s)/text writer(s) - TOPE Original artist(s)/performer(s) - TOR Original release year - TORY Original release year - TOT Original album/Movie/Show title - TOWN File owner/licensee - TP1 Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group - TP2 Band/Orchestra/Accompaniment - TP3 Conductor/Performer refinement - TP4 Interpreted, remixed, or otherwise modified by - TPA Part of a set - TPB Publisher - TPE1 Lead performer(s)/Soloist(s) - TPE2 Band/orchestra/accompaniment - TPE3 Conductor/performer refinement - TPE4 Interpreted, remixed, or otherwise modified by - TPOS Part of a set - TPRO Produced notice - TPUB Publisher - TRC ISRC (International Standard Recording Code) - TRCK Track number/Position in set - TRD Recording dates - TRDA Recording dates - TRK Track number/Position in set - TRSN Internet radio station name - TRSO Internet radio station owner - TS2 Album-Artist sort order - TSA Album sort order - TSC Composer sort order - TSI Size - TSIZ Size - TSO2 Album-Artist sort order - TSOA Album sort order - TSOC Composer sort order - TSOP Performer sort order - TSOT Title sort order - TSP Performer sort order - TSRC ISRC (international standard recording code) - TSS Software/hardware and settings used for encoding - TSSE Software/Hardware and settings used for encoding - TSST Set subtitle - TST Title sort order - TT1 Content group description - TT2 Title/Songname/Content description - TT3 Subtitle/Description refinement - TXT Lyricist/text writer - TXX User defined text information frame - TXXX User defined text information frame - TYE Year - TYER Year - UFI Unique file identifier - UFID Unique file identifier - ULT Unsychronised lyric/text transcription - USER Terms of use - USLT Unsynchronised lyric/text transcription - WAF Official audio file webpage - WAR Official artist/performer webpage - WAS Official audio source webpage - WCM Commercial information - WCOM Commercial information - WCOP Copyright/Legal information - WCP Copyright/Legal information - WOAF Official audio file webpage - WOAR Official artist/performer webpage - WOAS Official audio source webpage - WORS Official Internet radio station homepage - WPAY Payment - WPB Publishers official webpage - WPUB Publishers official webpage - WXX User defined URL link frame - WXXX User defined URL link frame - TFEA Featured Artist - TSTU Recording Studio - rgad Replay Gain Adjustment - - */ - - return getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_long'); - - // Last three: - // from Helium2 [www.helium2.com] - // from http://privatewww.essex.ac.uk/~djmrob/replaygain/file_format_id3v2.html - } - - - public static function FrameNameShortLookup($framename) { - - $begin = __LINE__; - - /** This is not a comment! - - AENC audio_encryption - APIC attached_picture - ASPI audio_seek_point_index - BUF recommended_buffer_size - CNT play_counter - COM comment - COMM comment - COMR commercial_frame - CRA audio_encryption - CRM encrypted_meta_frame - ENCR encryption_method_registration - EQU equalisation - EQU2 equalisation - EQUA equalisation - ETC event_timing_codes - ETCO event_timing_codes - GEO general_encapsulated_object - GEOB general_encapsulated_object - GRID group_identification_registration - IPL involved_people_list - IPLS involved_people_list - LINK linked_information - LNK linked_information - MCDI music_cd_identifier - MCI music_cd_identifier - MLL mpeg_location_lookup_table - MLLT mpeg_location_lookup_table - OWNE ownership_frame - PCNT play_counter - PIC attached_picture - POP popularimeter - POPM popularimeter - POSS position_synchronisation_frame - PRIV private_frame - RBUF recommended_buffer_size - REV reverb - RVA relative_volume_adjustment - RVA2 relative_volume_adjustment - RVAD relative_volume_adjustment - RVRB reverb - SEEK seek_frame - SIGN signature_frame - SLT synchronised_lyric - STC synced_tempo_codes - SYLT synchronised_lyric - SYTC synchronised_tempo_codes - TAL album - TALB album - TBP bpm - TBPM bpm - TCM composer - TCMP part_of_a_compilation - TCO genre - TCOM composer - TCON genre - TCOP copyright_message - TCP part_of_a_compilation - TCR copyright_message - TDA date - TDAT date - TDEN encoding_time - TDLY playlist_delay - TDOR original_release_time - TDRC recording_time - TDRL release_time - TDTG tagging_time - TDY playlist_delay - TEN encoded_by - TENC encoded_by - TEXT lyricist - TFLT file_type - TFT file_type - TIM time - TIME time - TIPL involved_people_list - TIT1 content_group_description - TIT2 title - TIT3 subtitle - TKE initial_key - TKEY initial_key - TLA language - TLAN language - TLE length - TLEN length - TMCL musician_credits_list - TMED media_type - TMOO mood - TMT media_type - TOA original_artist - TOAL original_album - TOF original_filename - TOFN original_filename - TOL original_lyricist - TOLY original_lyricist - TOPE original_artist - TOR original_year - TORY original_year - TOT original_album - TOWN file_owner - TP1 artist - TP2 band - TP3 conductor - TP4 remixer - TPA part_of_a_set - TPB publisher - TPE1 artist - TPE2 band - TPE3 conductor - TPE4 remixer - TPOS part_of_a_set - TPRO produced_notice - TPUB publisher - TRC isrc - TRCK track_number - TRD recording_dates - TRDA recording_dates - TRK track_number - TRSN internet_radio_station_name - TRSO internet_radio_station_owner - TS2 album_artist_sort_order - TSA album_sort_order - TSC composer_sort_order - TSI size - TSIZ size - TSO2 album_artist_sort_order - TSOA album_sort_order - TSOC composer_sort_order - TSOP performer_sort_order - TSOT title_sort_order - TSP performer_sort_order - TSRC isrc - TSS encoder_settings - TSSE encoder_settings - TSST set_subtitle - TST title_sort_order - TT1 content_group_description - TT2 title - TT3 subtitle - TXT lyricist - TXX text - TXXX text - TYE year - TYER year - UFI unique_file_identifier - UFID unique_file_identifier - ULT unsychronised_lyric - USER terms_of_use - USLT unsynchronised_lyric - WAF url_file - WAR url_artist - WAS url_source - WCM commercial_information - WCOM commercial_information - WCOP copyright - WCP copyright - WOAF url_file - WOAR url_artist - WOAS url_source - WORS url_station - WPAY url_payment - WPB url_publisher - WPUB url_publisher - WXX url_user - WXXX url_user - TFEA featured_artist - TSTU recording_studio - rgad replay_gain_adjustment - - */ - - return getid3_lib::EmbeddedLookup($framename, $begin, __LINE__, __FILE__, 'id3v2-framename_short'); - } - - public static function TextEncodingTerminatorLookup($encoding) { - // http://www.id3.org/id3v2.4.0-structure.txt - // Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings: - static $TextEncodingTerminatorLookup = array( - 0 => "\x00", // $00 ISO-8859-1. Terminated with $00. - 1 => "\x00\x00", // $01 UTF-16 encoded Unicode with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00. - 2 => "\x00\x00", // $02 UTF-16BE encoded Unicode without BOM. Terminated with $00 00. - 3 => "\x00", // $03 UTF-8 encoded Unicode. Terminated with $00. - 255 => "\x00\x00" - ); - return (isset($TextEncodingTerminatorLookup[$encoding]) ? $TextEncodingTerminatorLookup[$encoding] : "\x00"); - } - - public static function TextEncodingNameLookup($encoding) { - // http://www.id3.org/id3v2.4.0-structure.txt - // Frames that allow different types of text encoding contains a text encoding description byte. Possible encodings: - static $TextEncodingNameLookup = array( - 0 => 'ISO-8859-1', // $00 ISO-8859-1. Terminated with $00. - 1 => 'UTF-16', // $01 UTF-16 encoded Unicode with BOM. All strings in the same frame SHALL have the same byteorder. Terminated with $00 00. - 2 => 'UTF-16BE', // $02 UTF-16BE encoded Unicode without BOM. Terminated with $00 00. - 3 => 'UTF-8', // $03 UTF-8 encoded Unicode. Terminated with $00. - 255 => 'UTF-16BE' - ); - return (isset($TextEncodingNameLookup[$encoding]) ? $TextEncodingNameLookup[$encoding] : 'ISO-8859-1'); - } - - public static function IsValidID3v2FrameName($framename, $id3v2majorversion) { - switch ($id3v2majorversion) { - case 2: - return preg_match('#[A-Z][A-Z0-9]{2}#', $framename); - break; - - case 3: - case 4: - return preg_match('#[A-Z][A-Z0-9]{3}#', $framename); - break; - } - return false; - } - - public static function IsANumber($numberstring, $allowdecimal=false, $allownegative=false) { - for ($i = 0; $i < strlen($numberstring); $i++) { - if ((chr($numberstring{$i}) < chr('0')) || (chr($numberstring{$i}) > chr('9'))) { - if (($numberstring{$i} == '.') && $allowdecimal) { - // allowed - } elseif (($numberstring{$i} == '-') && $allownegative && ($i == 0)) { - // allowed - } else { - return false; - } - } - } - return true; - } - - public static function IsValidDateStampString($datestamp) { - if (strlen($datestamp) != 8) { - return false; - } - if (!self::IsANumber($datestamp, false)) { - return false; - } - $year = substr($datestamp, 0, 4); - $month = substr($datestamp, 4, 2); - $day = substr($datestamp, 6, 2); - if (($year == 0) || ($month == 0) || ($day == 0)) { - return false; - } - if ($month > 12) { - return false; - } - if ($day > 31) { - return false; - } - if (($day > 30) && (($month == 4) || ($month == 6) || ($month == 9) || ($month == 11))) { - return false; - } - if (($day > 29) && ($month == 2)) { - return false; - } - return true; - } - - public static function ID3v2HeaderLength($majorversion) { - return (($majorversion == 2) ? 6 : 10); - } - -} - diff --git a/wp/wp-includes/ID3/module.tag.lyrics3.php b/wp/wp-includes/ID3/module.tag.lyrics3.php deleted file mode 100644 index 419888bf..00000000 --- a/wp/wp-includes/ID3/module.tag.lyrics3.php +++ /dev/null @@ -1,298 +0,0 @@ - // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// -// See readme.txt for more details // -///////////////////////////////////////////////////////////////// -/// // -// module.tag.lyrics3.php // -// module for analyzing Lyrics3 tags // -// dependencies: module.tag.apetag.php (optional) // -// /// -///////////////////////////////////////////////////////////////// - - -class getid3_lyrics3 extends getid3_handler -{ - - public function Analyze() { - $info = &$this->getid3->info; - - // http://www.volweb.cz/str/tags.htm - - if (!getid3_lib::intValueSupported($info['filesize'])) { - $info['warning'][] = 'Unable to check for Lyrics3 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'; - return false; - } - - $this->fseek((0 - 128 - 9 - 6), SEEK_END); // end - ID3v1 - "LYRICSEND" - [Lyrics3size] - $lyrics3_id3v1 = $this->fread(128 + 9 + 6); - $lyrics3lsz = substr($lyrics3_id3v1, 0, 6); // Lyrics3size - $lyrics3end = substr($lyrics3_id3v1, 6, 9); // LYRICSEND or LYRICS200 - $id3v1tag = substr($lyrics3_id3v1, 15, 128); // ID3v1 - - if ($lyrics3end == 'LYRICSEND') { - // Lyrics3v1, ID3v1, no APE - - $lyrics3size = 5100; - $lyrics3offset = $info['filesize'] - 128 - $lyrics3size; - $lyrics3version = 1; - - } elseif ($lyrics3end == 'LYRICS200') { - // Lyrics3v2, ID3v1, no APE - - // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' - $lyrics3size = $lyrics3lsz + 6 + strlen('LYRICS200'); - $lyrics3offset = $info['filesize'] - 128 - $lyrics3size; - $lyrics3version = 2; - - } elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICSEND')) { - // Lyrics3v1, no ID3v1, no APE - - $lyrics3size = 5100; - $lyrics3offset = $info['filesize'] - $lyrics3size; - $lyrics3version = 1; - $lyrics3offset = $info['filesize'] - $lyrics3size; - - } elseif (substr(strrev($lyrics3_id3v1), 0, 9) == strrev('LYRICS200')) { - - // Lyrics3v2, no ID3v1, no APE - - $lyrics3size = strrev(substr(strrev($lyrics3_id3v1), 9, 6)) + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' - $lyrics3offset = $info['filesize'] - $lyrics3size; - $lyrics3version = 2; - - } else { - - if (isset($info['ape']['tag_offset_start']) && ($info['ape']['tag_offset_start'] > 15)) { - - $this->fseek($info['ape']['tag_offset_start'] - 15); - $lyrics3lsz = $this->fread(6); - $lyrics3end = $this->fread(9); - - if ($lyrics3end == 'LYRICSEND') { - // Lyrics3v1, APE, maybe ID3v1 - - $lyrics3size = 5100; - $lyrics3offset = $info['ape']['tag_offset_start'] - $lyrics3size; - $info['avdataend'] = $lyrics3offset; - $lyrics3version = 1; - $info['warning'][] = 'APE tag located after Lyrics3, will probably break Lyrics3 compatability'; - - } elseif ($lyrics3end == 'LYRICS200') { - // Lyrics3v2, APE, maybe ID3v1 - - $lyrics3size = $lyrics3lsz + 6 + strlen('LYRICS200'); // LSZ = lyrics + 'LYRICSBEGIN'; add 6-byte size field; add 'LYRICS200' - $lyrics3offset = $info['ape']['tag_offset_start'] - $lyrics3size; - $lyrics3version = 2; - $info['warning'][] = 'APE tag located after Lyrics3, will probably break Lyrics3 compatability'; - - } - - } - - } - - if (isset($lyrics3offset)) { - $info['avdataend'] = $lyrics3offset; - $this->getLyrics3Data($lyrics3offset, $lyrics3version, $lyrics3size); - - if (!isset($info['ape'])) { - if (isset($info['lyrics3']['tag_offset_start'])) { - $GETID3_ERRORARRAY = &$info['warning']; - getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.apetag.php', __FILE__, true); - $getid3_temp = new getID3(); - $getid3_temp->openfile($this->getid3->filename); - $getid3_apetag = new getid3_apetag($getid3_temp); - $getid3_apetag->overrideendoffset = $info['lyrics3']['tag_offset_start']; - $getid3_apetag->Analyze(); - if (!empty($getid3_temp->info['ape'])) { - $info['ape'] = $getid3_temp->info['ape']; - } - if (!empty($getid3_temp->info['replay_gain'])) { - $info['replay_gain'] = $getid3_temp->info['replay_gain']; - } - unset($getid3_temp, $getid3_apetag); - } else { - $info['warning'][] = 'Lyrics3 and APE tags appear to have become entangled (most likely due to updating the APE tags with a non-Lyrics3-aware tagger)'; - } - } - - } - - return true; - } - - public function getLyrics3Data($endoffset, $version, $length) { - // http://www.volweb.cz/str/tags.htm - - $info = &$this->getid3->info; - - if (!getid3_lib::intValueSupported($endoffset)) { - $info['warning'][] = 'Unable to check for Lyrics3 because file is larger than '.round(PHP_INT_MAX / 1073741824).'GB'; - return false; - } - - $this->fseek($endoffset); - if ($length <= 0) { - return false; - } - $rawdata = $this->fread($length); - - $ParsedLyrics3['raw']['lyrics3version'] = $version; - $ParsedLyrics3['raw']['lyrics3tagsize'] = $length; - $ParsedLyrics3['tag_offset_start'] = $endoffset; - $ParsedLyrics3['tag_offset_end'] = $endoffset + $length - 1; - - if (substr($rawdata, 0, 11) != 'LYRICSBEGIN') { - if (strpos($rawdata, 'LYRICSBEGIN') !== false) { - - $info['warning'][] = '"LYRICSBEGIN" expected at '.$endoffset.' but actually found at '.($endoffset + strpos($rawdata, 'LYRICSBEGIN')).' - this is invalid for Lyrics3 v'.$version; - $info['avdataend'] = $endoffset + strpos($rawdata, 'LYRICSBEGIN'); - $rawdata = substr($rawdata, strpos($rawdata, 'LYRICSBEGIN')); - $length = strlen($rawdata); - $ParsedLyrics3['tag_offset_start'] = $info['avdataend']; - $ParsedLyrics3['raw']['lyrics3tagsize'] = $length; - - } else { - - $info['error'][] = '"LYRICSBEGIN" expected at '.$endoffset.' but found "'.substr($rawdata, 0, 11).'" instead'; - return false; - - } - - } - - switch ($version) { - - case 1: - if (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICSEND') { - $ParsedLyrics3['raw']['LYR'] = trim(substr($rawdata, 11, strlen($rawdata) - 11 - 9)); - $this->Lyrics3LyricsTimestampParse($ParsedLyrics3); - } else { - $info['error'][] = '"LYRICSEND" expected at '.($this->ftell() - 11 + $length - 9).' but found "'.substr($rawdata, strlen($rawdata) - 9, 9).'" instead'; - return false; - } - break; - - case 2: - if (substr($rawdata, strlen($rawdata) - 9, 9) == 'LYRICS200') { - $ParsedLyrics3['raw']['unparsed'] = substr($rawdata, 11, strlen($rawdata) - 11 - 9 - 6); // LYRICSBEGIN + LYRICS200 + LSZ - $rawdata = $ParsedLyrics3['raw']['unparsed']; - while (strlen($rawdata) > 0) { - $fieldname = substr($rawdata, 0, 3); - $fieldsize = (int) substr($rawdata, 3, 5); - $ParsedLyrics3['raw'][$fieldname] = substr($rawdata, 8, $fieldsize); - $rawdata = substr($rawdata, 3 + 5 + $fieldsize); - } - - if (isset($ParsedLyrics3['raw']['IND'])) { - $i = 0; - $flagnames = array('lyrics', 'timestamps', 'inhibitrandom'); - foreach ($flagnames as $flagname) { - if (strlen($ParsedLyrics3['raw']['IND']) > $i++) { - $ParsedLyrics3['flags'][$flagname] = $this->IntString2Bool(substr($ParsedLyrics3['raw']['IND'], $i, 1 - 1)); - } - } - } - - $fieldnametranslation = array('ETT'=>'title', 'EAR'=>'artist', 'EAL'=>'album', 'INF'=>'comment', 'AUT'=>'author'); - foreach ($fieldnametranslation as $key => $value) { - if (isset($ParsedLyrics3['raw'][$key])) { - $ParsedLyrics3['comments'][$value][] = trim($ParsedLyrics3['raw'][$key]); - } - } - - if (isset($ParsedLyrics3['raw']['IMG'])) { - $imagestrings = explode("\r\n", $ParsedLyrics3['raw']['IMG']); - foreach ($imagestrings as $key => $imagestring) { - if (strpos($imagestring, '||') !== false) { - $imagearray = explode('||', $imagestring); - $ParsedLyrics3['images'][$key]['filename'] = (isset($imagearray[0]) ? $imagearray[0] : ''); - $ParsedLyrics3['images'][$key]['description'] = (isset($imagearray[1]) ? $imagearray[1] : ''); - $ParsedLyrics3['images'][$key]['timestamp'] = $this->Lyrics3Timestamp2Seconds(isset($imagearray[2]) ? $imagearray[2] : ''); - } - } - } - if (isset($ParsedLyrics3['raw']['LYR'])) { - $this->Lyrics3LyricsTimestampParse($ParsedLyrics3); - } - } else { - $info['error'][] = '"LYRICS200" expected at '.($this->ftell() - 11 + $length - 9).' but found "'.substr($rawdata, strlen($rawdata) - 9, 9).'" instead'; - return false; - } - break; - - default: - $info['error'][] = 'Cannot process Lyrics3 version '.$version.' (only v1 and v2)'; - return false; - break; - } - - - if (isset($info['id3v1']['tag_offset_start']) && ($info['id3v1']['tag_offset_start'] <= $ParsedLyrics3['tag_offset_end'])) { - $info['warning'][] = 'ID3v1 tag information ignored since it appears to be a false synch in Lyrics3 tag data'; - unset($info['id3v1']); - foreach ($info['warning'] as $key => $value) { - if ($value == 'Some ID3v1 fields do not use NULL characters for padding') { - unset($info['warning'][$key]); - sort($info['warning']); - break; - } - } - } - - $info['lyrics3'] = $ParsedLyrics3; - - return true; - } - - public function Lyrics3Timestamp2Seconds($rawtimestamp) { - if (preg_match('#^\\[([0-9]{2}):([0-9]{2})\\]$#', $rawtimestamp, $regs)) { - return (int) (($regs[1] * 60) + $regs[2]); - } - return false; - } - - public function Lyrics3LyricsTimestampParse(&$Lyrics3data) { - $lyricsarray = explode("\r\n", $Lyrics3data['raw']['LYR']); - foreach ($lyricsarray as $key => $lyricline) { - $regs = array(); - unset($thislinetimestamps); - while (preg_match('#^(\\[[0-9]{2}:[0-9]{2}\\])#', $lyricline, $regs)) { - $thislinetimestamps[] = $this->Lyrics3Timestamp2Seconds($regs[0]); - $lyricline = str_replace($regs[0], '', $lyricline); - } - $notimestamplyricsarray[$key] = $lyricline; - if (isset($thislinetimestamps) && is_array($thislinetimestamps)) { - sort($thislinetimestamps); - foreach ($thislinetimestamps as $timestampkey => $timestamp) { - if (isset($Lyrics3data['synchedlyrics'][$timestamp])) { - // timestamps only have a 1-second resolution, it's possible that multiple lines - // could have the same timestamp, if so, append - $Lyrics3data['synchedlyrics'][$timestamp] .= "\r\n".$lyricline; - } else { - $Lyrics3data['synchedlyrics'][$timestamp] = $lyricline; - } - } - } - } - $Lyrics3data['unsynchedlyrics'] = implode("\r\n", $notimestamplyricsarray); - if (isset($Lyrics3data['synchedlyrics']) && is_array($Lyrics3data['synchedlyrics'])) { - ksort($Lyrics3data['synchedlyrics']); - } - return true; - } - - public function IntString2Bool($char) { - if ($char == '1') { - return true; - } elseif ($char == '0') { - return false; - } - return null; - } -} diff --git a/wp/wp-includes/ID3/readme.txt b/wp/wp-includes/ID3/readme.txt deleted file mode 100644 index b627cc2d..00000000 --- a/wp/wp-includes/ID3/readme.txt +++ /dev/null @@ -1,604 +0,0 @@ -///////////////////////////////////////////////////////////////// -/// getID3() by James Heinrich // -// available at http://getid3.sourceforge.net // -// or http://www.getid3.org // -// also https://github.com/JamesHeinrich/getID3 // -///////////////////////////////////////////////////////////////// - -***************************************************************** -***************************************************************** - - getID3() is released under multiple licenses. You may choose - from the following licenses, and use getID3 according to the - terms of the license most suitable to your project. - -GNU GPL: https://gnu.org/licenses/gpl.html (v3) - https://gnu.org/licenses/old-licenses/gpl-2.0.html (v2) - https://gnu.org/licenses/old-licenses/gpl-1.0.html (v1) - -GNU LGPL: https://gnu.org/licenses/lgpl.html (v3) - -Mozilla MPL: http://www.mozilla.org/MPL/2.0/ (v2) - -getID3 Commercial License: http://getid3.org/#gCL (payment required) - -***************************************************************** -***************************************************************** -Copies of each of the above licenses are included in the 'licenses' -directory of the getID3 distribution. - - - +---------------------------------------------+ - | If you want to donate, there is a link on | - | http://www.getid3.org for PayPal donations. | - +---------------------------------------------+ - - -Quick Start -=========================================================================== - -Q: How can I check that getID3() works on my server/files? -A: Unzip getID3() to a directory, then access /demos/demo.browse.php - - - -Support -=========================================================================== - -Q: I have a question, or I found a bug. What do I do? -A: The preferred method of support requests and/or bug reports is the - forum at http://support.getid3.org/ - - - -Sourceforge Notification -=========================================================================== - -It's highly recommended that you sign up for notification from -Sourceforge for when new versions are released. Please visit: -http://sourceforge.net/project/showfiles.php?group_id=55859 -and click the little "monitor package" icon/link. If you're -previously signed up for the mailing list, be aware that it has -been discontinued, only the automated Sourceforge notification -will be used from now on. - - - -What does getID3() do? -=========================================================================== - -Reads & parses (to varying degrees): - ¤ tags: - * APE (v1 and v2) - * ID3v1 (& ID3v1.1) - * ID3v2 (v2.4, v2.3, v2.2) - * Lyrics3 (v1 & v2) - - ¤ audio-lossy: - * MP3/MP2/MP1 - * MPC / Musepack - * Ogg (Vorbis, OggFLAC, Speex) - * AAC / MP4 - * AC3 - * DTS - * RealAudio - * Speex - * DSS - * VQF - - ¤ audio-lossless: - * AIFF - * AU - * Bonk - * CD-audio (*.cda) - * FLAC - * LA (Lossless Audio) - * LiteWave - * LPAC - * MIDI - * Monkey's Audio - * OptimFROG - * RKAU - * Shorten - * TTA - * VOC - * WAV (RIFF) - * WavPack - - ¤ audio-video: - * ASF: ASF, Windows Media Audio (WMA), Windows Media Video (WMV) - * AVI (RIFF) - * Flash - * Matroska (MKV) - * MPEG-1 / MPEG-2 - * NSV (Nullsoft Streaming Video) - * Quicktime (including MP4) - * RealVideo - - ¤ still image: - * BMP - * GIF - * JPEG - * PNG - * TIFF - * SWF (Flash) - * PhotoCD - - ¤ data: - * ISO-9660 CD-ROM image (directory structure) - * SZIP (limited support) - * ZIP (directory structure) - * TAR - * CUE - - -Writes: - * ID3v1 (& ID3v1.1) - * ID3v2 (v2.3 & v2.4) - * VorbisComment on OggVorbis - * VorbisComment on FLAC (not OggFLAC) - * APE v2 - * Lyrics3 (delete only) - - - -Requirements -=========================================================================== - -* PHP 4.2.0 up to 5.2.x for getID3() 1.7.x (and earlier) -* PHP 5.0.5 (or higher) for getID3() 1.8.x (and up) -* PHP 5.0.5 (or higher) for getID3() 2.0.x (and up) -* at least 4MB memory for PHP. 8MB or more is highly recommended. - 12MB is required with all modules loaded. - - - -Usage -=========================================================================== - -See /demos/demo.basic.php for a very basic use of getID3() with no -fancy output, just scanning one file. - -See structure.txt for the returned data structure. - -*> For an example of a complete directory-browsing, <* -*> file-scanning implementation of getID3(), please run <* -*> /demos/demo.browse.php <* - -See /demos/demo.mysql.php for a sample recursive scanning code that -scans every file in a given directory, and all sub-directories, stores -the results in a database and allows various analysis / maintenance -operations - -To analyze remote files over HTTP or FTP you need to copy the file -locally first before running getID3(). Your code would look something -like this: - -// Copy remote file locally to scan with getID3() -$remotefilename = 'http://www.example.com/filename.mp3'; -if ($fp_remote = fopen($remotefilename, 'rb')) { - $localtempfilename = tempnam('/tmp', 'getID3'); - if ($fp_local = fopen($localtempfilename, 'wb')) { - while ($buffer = fread($fp_remote, 8192)) { - fwrite($fp_local, $buffer); - } - fclose($fp_local); - - // Initialize getID3 engine - $getID3 = new getID3; - - $ThisFileInfo = $getID3->analyze($filename); - - // Delete temporary file - unlink($localtempfilename); - } - fclose($fp_remote); -} - - -See /demos/demo.write.php for how to write tags. - - - -What does the returned data structure look like? -=========================================================================== - -See structure.txt - -It is recommended that you look at the output of -/demos/demo.browse.php scanning the file(s) you're interested in to -confirm what data is actually returned for any particular filetype in -general, and your files in particular, as the actual data returned -may vary considerably depending on what information is available in -the file itself. - - - -Notes -=========================================================================== - -getID3() 1.x: -If the format parser encounters a critical problem, it will return -something in $fileinfo['error'], describing the encountered error. If -a less critical error or notice is generated it will appear in -$fileinfo['warning']. Both keys may contain more than one warning or -error. If something is returned in ['error'] then the file was not -correctly parsed and returned data may or may not be correct and/or -complete. If something is returned in ['warning'] (and not ['error']) -then the data that is returned is OK - usually getID3() is reporting -errors in the file that have been worked around due to known bugs in -other programs. Some warnings may indicate that the data that is -returned is OK but that some data could not be extracted due to -errors in the file. - -getID3() 2.x: -See above except errors are thrown (so you will only get one error). - - - -Disclaimer -=========================================================================== - -getID3() has been tested on many systems, on many types of files, -under many operating systems, and is generally believe to be stable -and safe. That being said, there is still the chance there is an -undiscovered and/or unfixed bug that may potentially corrupt your -file, especially within the writing functions. By using getID3() you -agree that it's not my fault if any of your files are corrupted. -In fact, I'm not liable for anything :) - - - -License -=========================================================================== - -GNU General Public License - see license.txt - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to: -Free Software Foundation, Inc. -59 Temple Place - Suite 330 -Boston, MA 02111-1307, USA. - -FAQ: -Q: Can I use getID3() in my program? Do I need a commercial license? -A: You're generally free to use getID3 however you see fit. The only - case in which you would require a commercial license is if you're - selling your closed-source program that integrates getID3. If you - sell your program including a copy of getID3, that's fine as long - as you include a copy of the sourcecode when you sell it. Or you - can distribute your code without getID3 and say "download it from - getid3.sourceforge.net" - - - -Why is it called "getID3()" if it does so much more than just that? -=========================================================================== - -v0.1 did in fact just do that. I don't have a copy of code that old, but I -could essentially write it today with a one-line function: - function getID3($filename) { return unpack('a3TAG/a30title/a30artist/a30album/a4year/a28comment/c1track/c1genreid', substr(file_get_contents($filename), -128)); } - - -Future Plans -=========================================================================== -http://www.getid3.org/phpBB3/viewforum.php?f=7 - -* Better support for MP4 container format -* Scan for appended ID3v2 tag at end of file per ID3v2.4 specs (Section 5.0) -* Support for JPEG-2000 (http://www.morgan-multimedia.com/jpeg2000_overview.htm) -* Support for MOD (mod/stm/s3m/it/xm/mtm/ult/669) -* Support for ACE (thanks Vince) -* Support for Ogg other than Vorbis, Speex and OggFlac (ie. Ogg+Xvid) -* Ability to create Xing/LAME VBR header for VBR MP3s that are missing VBR header -* Ability to "clean" ID3v2 padding (replace invalid padding with valid padding) -* Warn if MP3s change version mid-stream (in full-scan mode) -* check for corrupt/broken mid-file MP3 streams in histogram scan -* Support for lossless-compression formats - (http://www.firstpr.com.au/audiocomp/lossless/#Links) - (http://compression.ca/act-sound.html) - (http://web.inter.nl.net/users/hvdh/lossless/lossless.htm) -* Support for RIFF-INFO chunks - * http://lotto.st-andrews.ac.uk/~njh/tag_interchange.html - (thanks Nick Humfrey ) - * http://abcavi.narod.ru/sof/abcavi/infotags.htm - (thanks Kibi) -* Better support for Bink video -* http://www.hr/josip/DSP/AudioFile2.html -* http://www.pcisys.net/~melanson/codecs/ -* Detect mp3PRO -* Support for PSD -* Support for JPC -* Support for JP2 -* Support for JPX -* Support for JB2 -* Support for IFF -* Support for ICO -* Support for ANI -* Support for EXE (comments, author, etc) (thanks p*quaedackersØplanet*nl) -* Support for DVD-IFO (region, subtitles, aspect ratio, etc) - (thanks p*quaedackersØplanet*nl) -* More complete support for SWF - parsing encapsulated MP3 and/or JPEG content - (thanks n8n8Øyahoo*com) -* Support for a2b -* Optional scan-through-frames for AVI verification - (thanks rockcohenØmassive-interactive*nl) -* Support for TTF (thanks infoØbutterflyx*com) -* Support for DSS (http://www.getid3.org/phpBB3/viewtopic.php?t=171) -* Support for SMAF (http://smaf-yamaha.com/what/demo.html) - http://www.getid3.org/phpBB3/viewtopic.php?t=182 -* Support for AMR (http://www.getid3.org/phpBB3/viewtopic.php?t=195) -* Support for 3gpp (http://www.getid3.org/phpBB3/viewtopic.php?t=195) -* Support for ID4 (http://www.wackysoft.cjb.net grizlyY2KØhotmail*com) -* Parse XML data returned in Ogg comments -* Parse XML data from Quicktime SMIL metafiles (klausrathØmac*com) -* ID3v2 genre string creator function -* More complete parsing of JPG -* Support for all old-style ASF packets -* ASF/WMA/WMV tag writing -* Parse declared T??? ID3v2 text information frames, where appropriate - (thanks Christian Fritz for the idea) -* Recognize encoder: - http://www.guerillasoft.com/EncSpot2/index.html - http://ff123.net/identify.html - http://www.hydrogenaudio.org/?act=ST&f=16&t=9414 - http://www.hydrogenaudio.org/?showtopic=11785 -* Support for other OS/2 bitmap structures: Bitmap Array('BA'), - Color Icon('CI'), Color Pointer('CP'), Icon('IC'), Pointer ('PT') - http://netghost.narod.ru/gff/graphics/summary/os2bmp.htm -* Support for WavPack RAW mode -* ASF/WMA/WMV data packet parsing -* ID3v2FrameFlagsLookupTagAlter() -* ID3v2FrameFlagsLookupFileAlter() -* obey ID3v2 tag alter/preserve/discard rules -* http://www.geocities.com/SiliconValley/Sector/9654/Softdoc/Illyrium/Aolyr.htm -* proper checking for LINK/LNK frame validity in ID3v2 writing -* proper checking for ASPI-TLEN frame validity in ID3v2 writing -* proper checking for COMR frame validity in ID3v2 writing -* http://www.geocities.co.jp/SiliconValley-Oakland/3664/index.html -* decode GEOB ID3v2 structure as encoded by RealJukebox, - decode NCON ID3v2 structure as encoded by MusicMatch - (probably won't happen - the formats are proprietary) - - - -Known Bugs/Issues in getID3() that may be fixed eventually -=========================================================================== -http://www.getid3.org/phpBB3/viewtopic.php?t=25 - -* Cannot determine bitrate for MPEG video with VBR video data - (need documentation) -* Interlace/progressive cannot be determined for MPEG video - (need documentation) -* MIDI playtime is sometimes inaccurate -* AAC-RAW mode files cannot be identified -* WavPack-RAW mode files cannot be identified -* mp4 files report lots of "Unknown QuickTime atom type" - (need documentation) -* Encrypted ASF/WMA/WMV files warn about "unhandled GUID - ASF_Content_Encryption_Object" -* Bitrate split between audio and video cannot be calculated for - NSV, only the total bitrate. (need documentation) -* All Ogg formats (Vorbis, OggFLAC, Speex) are affected by the - problem of large VorbisComments spanning multiple Ogg pages, but - but only OggVorbis files can be processed with vorbiscomment. -* The version of "head" supplied with Mac OS 10.2.8 (maybe other - versions too) does only understands a single option (-n) and - therefore fails. getID3 ignores this and returns wrong md5_data. - - - -Known Bugs/Issues in getID3() that cannot be fixed --------------------------------------------------- -http://www.getid3.org/phpBB3/viewtopic.php?t=25 - -* 32-bit PHP installations only: - Files larger than 2GB cannot always be parsed fully by getID3() - due to limitations in the 32-bit PHP filesystem functions. - NOTE: Since v1.7.8b3 there is partial support for larger-than- - 2GB files, most of which will parse OK, as long as no critical - data is located beyond the 2GB offset. - Known will-work: - * all file formats on 64-bit PHP - * ZIP (format doesn't support files >2GB) - * FLAC (current encoders don't support files >2GB) - Known will-not-work: - * ID3v1 tags (always located at end-of-file) - * Lyrics3 tags (always located at end-of-file) - * APE tags (always located at end-of-file) - Maybe-will-work: - * Quicktime (will work if needed metadata is before 2GB offset, - that is if the file has been hinted/optimized for streaming) - * RIFF.WAV (should work fine, but gives warnings about not being - able to parse all chunks) - * RIFF.AVI (playtime will probably be wrong, is only based on - "movi" chunk that fits in the first 2GB, should issue error - to show that playtime is incorrect. Other data should be mostly - correct, assuming that data is constant throughout the file) -* PHP <= v5 on Windows cannot read UTF-8 filenames - - -Known Bugs/Issues in other programs ------------------------------------ -http://www.getid3.org/phpBB3/viewtopic.php?t=25 - -* Windows Media Player (up to v11) and iTunes (up to v10+) do - not correctly handle ID3v2.3 tags with UTF-16BE+BOM - encoding (they assume the data is UTF-16LE+BOM and either - crash (WMP) or output Asian character set (iTunes) -* Winamp (up to v2.80 at least) does not support ID3v2.4 tags, - only ID3v2.3 - see: http://forums.winamp.com/showthread.php?postid=387524 -* Some versions of Helium2 (www.helium2.com) do not write - ID3v2.4-compliant Frame Sizes, even though the tag is marked - as ID3v2.4) (detected by getID3()) -* MP3ext V3.3.17 places a non-compliant padding string at the end - of the ID3v2 header. This is supposedly fixed in v3.4b21 but - only if you manually add a registry key. This fix is not yet - confirmed. (detected by getID3()) -* CDex v1.40 (fixed by v1.50b7) writes non-compliant Ogg comment - strings, supposed to be in the format "NAME=value" but actually - written just "value" (detected by getID3()) -* Oggenc 0.9-rc3 flags the encoded file as ABR whether it's - actually ABR or VBR. -* iTunes (versions "X v2.0.3", "v3.0.1" are known-guilty, probably - other versions are too) writes ID3v2.3 comment tags using a - frame name 'COM ' which is not valid for ID3v2.3+ (it's an - ID3v2.2-style frame name) (detected by getID3()) -* MP2enc does not encode mono CBR MP2 files properly (half speed - sound and double playtime) -* MP2enc does not encode mono VBR MP2 files properly (actually - encoded as stereo) -* tooLAME does not encode mono VBR MP2 files properly (actually - encoded as stereo) -* AACenc encodes files in VBR mode (actually ABR) even if CBR is - specified -* AAC/ADIF - bitrate_mode = cbr for vbr files -* LAME 3.90-3.92 prepends one frame of null data (space for the - LAME/VBR header, but it never gets written) when encoding in CBR - mode with the DLL -* Ahead Nero encodes TwinVQF with a DSIZ value (which is supposed - to be the filesize in bytes) of "0" for TwinVQF v1.0 and "1" for - TwinVQF v2.0 (detected by getID3()) -* Ahead Nero encodes TwinVQF files 1 second shorter than they - should be -* AAC-ADTS files are always actually encoded VBR, even if CBR mode - is specified (the CBR-mode switches on the encoder enable ABR - mode, not CBR as such, but it's not possible to tell the - difference between such ABR files and true VBR) -* STREAMINFO.audio_signature in OggFLAC is always null. "The reason - it's like that is because there is no seeking support in - libOggFLAC yet, so it has no way to go back and write the - computed sum after encoding. Seeking support in Ogg FLAC is the - #1 item for the next release." - Josh Coalson (FLAC developer) - NOTE: getID3() will calculate md5_data in a method similar to - other file formats, but that value cannot be compared to the - md5_data value from FLAC data in a FLAC file format. -* STREAMINFO.audio_signature is not calculated in FLAC v0.3.0 & - v0.4.0 - getID3() will calculate md5_data in a method similar to - other file formats, but that value cannot be compared to the - md5_data value from FLAC v0.5.0+ -* RioPort (various versions including 2.0 and 3.11) tags ID3v2 with - a WCOM frame that has no data portion -* Earlier versions of Coolplayer adds illegal ID3 tags to Ogg Vorbis - files, thus making them corrupt. -* Meracl ID3 Tag Writer v1.3.4 (and older) incorrectly truncates the - last byte of data from an MP3 file when appending a new ID3v1 tag. - (detected by getID3()) -* Lossless-Audio files encoded with and without the -noseek switch - do actually differ internally and therefore cannot match md5_data -* iTunes has been known to append a new ID3v1 tag on the end of an - existing ID3v1 tag when ID3v2 tag is also present - (detected by getID3()) -* MediaMonkey may write a blank RGAD ID3v2 frame but put actual - replay gain adjustments in a series of user-defined TXXX frames - (detected and handled by getID3() since v1.9.2) - - - - -Reference material: -=========================================================================== - -[www.id3.org material now mirrored at http://id3lib.sourceforge.net/id3/] -* http://www.id3.org/id3v2.4.0-structure.txt -* http://www.id3.org/id3v2.4.0-frames.txt -* http://www.id3.org/id3v2.4.0-changes.txt -* http://www.id3.org/id3v2.3.0.txt -* http://www.id3.org/id3v2-00.txt -* http://www.id3.org/mp3frame.html -* http://minnie.tuhs.org/pipermail/mp3encoder/2001-January/001800.html -* http://www.dv.co.yu/mpgscript/mpeghdr.htm -* http://www.mp3-tech.org/programmer/frame_header.html -* http://users.belgacom.net/gc247244/extra/tag.html -* http://gabriel.mp3-tech.org/mp3infotag.html -* http://www.id3.org/iso4217.html -* http://www.unicode.org/Public/MAPPINGS/ISO8859/8859-1.TXT -* http://www.xiph.org/ogg/vorbis/doc/framing.html -* http://www.xiph.org/ogg/vorbis/doc/v-comment.html -* http://leknor.com/code/php/class.ogg.php.txt -* http://www.id3.org/iso639-2.html -* http://www.id3.org/lyrics3.html -* http://www.id3.org/lyrics3200.html -* http://www.psc.edu/general/software/packages/ieee/ieee.html -* http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee-expl.html -* http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/binary.html -* http://www.jmcgowan.com/avi.html -* http://www.wotsit.org/ -* http://www.herdsoft.com/ti/davincie/davp3xo2.htm -* http://www.mathdogs.com/vorbis-illuminated/bitstream-appendix.html -* "Standard MIDI File Format" by Dustin Caldwell (from www.wotsit.org) -* http://midistudio.com/Help/GMSpecs_Patches.htm -* http://www.xiph.org/archives/vorbis/200109/0459.html -* http://www.replaygain.org/ -* http://www.lossless-audio.com/ -* http://download.microsoft.com/download/winmediatech40/Doc/1.0/WIN98MeXP/EN-US/ASF_Specification_v.1.0.exe -* http://mediaxw.sourceforge.net/files/doc/Active%20Streaming%20Format%20(ASF)%201.0%20Specification.pdf -* http://www.uni-jena.de/~pfk/mpp/sv8/ (archived at http://www.hydrogenaudio.org/musepack/klemm/www.personal.uni-jena.de/~pfk/mpp/sv8/) -* http://jfaul.de/atl/ -* http://www.uni-jena.de/~pfk/mpp/ (archived at http://www.hydrogenaudio.org/musepack/klemm/www.personal.uni-jena.de/~pfk/mpp/) -* http://www.libpng.org/pub/png/spec/png-1.2-pdg.html -* http://www.real.com/devzone/library/creating/rmsdk/doc/rmff.htm -* http://www.fastgraph.com/help/bmp_os2_header_format.html -* http://netghost.narod.ru/gff/graphics/summary/os2bmp.htm -* http://flac.sourceforge.net/format.html -* http://www.research.att.com/projects/mpegaudio/mpeg2.html -* http://www.audiocoding.com/wiki/index.php?page=AAC -* http://libmpeg.org/mpeg4/doc/w2203tfs.pdf -* http://www.geocities.com/xhelmboyx/quicktime/formats/qtm-layout.txt -* http://developer.apple.com/techpubs/quicktime/qtdevdocs/RM/frameset.htm -* http://www.nullsoft.com/nsv/ -* http://www.wotsit.org/download.asp?f=iso9660 -* http://sandbox.mc.edu/~bennet/cs110/tc/tctod.html -* http://www.cdroller.com/htm/readdata.html -* http://www.speex.org/manual/node10.html -* http://www.harmony-central.com/Computer/Programming/aiff-file-format.doc -* http://www.faqs.org/rfcs/rfc2361.html -* http://ghido.shelter.ro/ -* http://www.ebu.ch/tech_t3285.pdf -* http://www.sr.se/utveckling/tu/bwf -* http://ftp.aessc.org/pub/aes46-2002.pdf -* http://cartchunk.org:8080/ -* http://www.broadcastpapers.com/radio/cartchunk01.htm -* http://www.hr/josip/DSP/AudioFile2.html -* http://home.attbi.com/~chris.bagwell/AudioFormats-11.html -* http://www.pure-mac.com/extkey.html -* http://cesnet.dl.sourceforge.net/sourceforge/bonkenc/bonk-binary-format-0.9.txt -* http://www.headbands.com/gspot/ -* http://www.openswf.org/spec/SWFfileformat.html -* http://j-faul.virtualave.net/ -* http://www.btinternet.com/~AnthonyJ/Atari/programming/avr_format.html -* http://cui.unige.ch/OSG/info/AudioFormats/ap11.html -* http://sswf.sourceforge.net/SWFalexref.html -* http://www.geocities.com/xhelmboyx/quicktime/formats/qti-layout.txt -* http://www-lehre.informatik.uni-osnabrueck.de/~fbstark/diplom/docs/swf/Flash_Uncovered.htm -* http://developer.apple.com/quicktime/icefloe/dispatch012.html -* http://www.csdn.net/Dev/Format/graphics/PCD.htm -* http://tta.iszf.irk.ru/ -* http://www.atsc.org/standards/a_52a.pdf -* http://www.alanwood.net/unicode/ -* http://www.freelists.org/archives/matroska-devel/07-2003/msg00010.html -* http://www.its.msstate.edu/net/real/reports/config/tags.stats -* http://homepages.slingshot.co.nz/~helmboy/quicktime/formats/qtm-layout.txt -* http://brennan.young.net/Comp/LiveStage/things.html -* http://www.multiweb.cz/twoinches/MP3inside.htm -* http://www.geocities.co.jp/SiliconValley-Oakland/3664/alittle.html#GenreExtended -* http://www.mactech.com/articles/mactech/Vol.06/06.01/SANENormalized/ -* http://www.unicode.org/unicode/faq/utf_bom.html -* http://tta.corecodec.org/?menu=format -* http://www.scvi.net/nsvformat.htm -* http://pda.etsi.org/pda/queryform.asp -* http://cpansearch.perl.org/src/RGIBSON/Audio-DSS-0.02/lib/Audio/DSS.pm -* http://trac.musepack.net/trac/wiki/SV8Specification -* http://wyday.com/cuesharp/specification.php -* http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html \ No newline at end of file diff --git a/wp/wp-includes/IXR/class-IXR-base64.php b/wp/wp-includes/IXR/class-IXR-base64.php deleted file mode 100644 index 910f81b1..00000000 --- a/wp/wp-includes/IXR/class-IXR-base64.php +++ /dev/null @@ -1,32 +0,0 @@ -data = $data; - } - - /** - * PHP4 constructor. - */ - public function IXR_Base64( $data ) { - self::__construct( $data ); - } - - function getXml() - { - return ''.base64_encode($this->data).''; - } -} diff --git a/wp/wp-includes/IXR/class-IXR-client.php b/wp/wp-includes/IXR/class-IXR-client.php deleted file mode 100644 index f66bcb30..00000000 --- a/wp/wp-includes/IXR/class-IXR-client.php +++ /dev/null @@ -1,166 +0,0 @@ -server = $bits['host']; - $this->port = isset($bits['port']) ? $bits['port'] : 80; - $this->path = isset($bits['path']) ? $bits['path'] : '/'; - - // Make absolutely sure we have a path - if (!$this->path) { - $this->path = '/'; - } - - if ( ! empty( $bits['query'] ) ) { - $this->path .= '?' . $bits['query']; - } - } else { - $this->server = $server; - $this->path = $path; - $this->port = $port; - } - $this->useragent = 'The Incutio XML-RPC PHP Library'; - $this->timeout = $timeout; - } - - /** - * PHP4 constructor. - */ - public function IXR_Client( $server, $path = false, $port = 80, $timeout = 15 ) { - self::__construct( $server, $path, $port, $timeout ); - } - - function query() - { - $args = func_get_args(); - $method = array_shift($args); - $request = new IXR_Request($method, $args); - $length = $request->getLength(); - $xml = $request->getXml(); - $r = "\r\n"; - $request = "POST {$this->path} HTTP/1.0$r"; - - // Merged from WP #8145 - allow custom headers - $this->headers['Host'] = $this->server; - $this->headers['Content-Type'] = 'text/xml'; - $this->headers['User-Agent'] = $this->useragent; - $this->headers['Content-Length']= $length; - - foreach( $this->headers as $header => $value ) { - $request .= "{$header}: {$value}{$r}"; - } - $request .= $r; - - $request .= $xml; - - // Now send the request - if ($this->debug) { - echo '
      '.htmlspecialchars($request)."\n
      \n\n"; - } - - if ($this->timeout) { - $fp = @fsockopen($this->server, $this->port, $errno, $errstr, $this->timeout); - } else { - $fp = @fsockopen($this->server, $this->port, $errno, $errstr); - } - if (!$fp) { - $this->error = new IXR_Error(-32300, 'transport error - could not open socket'); - return false; - } - fputs($fp, $request); - $contents = ''; - $debugContents = ''; - $gotFirstLine = false; - $gettingHeaders = true; - while (!feof($fp)) { - $line = fgets($fp, 4096); - if (!$gotFirstLine) { - // Check line for '200' - if (strstr($line, '200') === false) { - $this->error = new IXR_Error(-32300, 'transport error - HTTP status code was not 200'); - return false; - } - $gotFirstLine = true; - } - if (trim($line) == '') { - $gettingHeaders = false; - } - if (!$gettingHeaders) { - // merged from WP #12559 - remove trim - $contents .= $line; - } - if ($this->debug) { - $debugContents .= $line; - } - } - if ($this->debug) { - echo '
      '.htmlspecialchars($debugContents)."\n
      \n\n"; - } - - // Now parse what we've got back - $this->message = new IXR_Message($contents); - if (!$this->message->parse()) { - // XML error - $this->error = new IXR_Error(-32700, 'parse error. not well formed'); - return false; - } - - // Is the message a fault? - if ($this->message->messageType == 'fault') { - $this->error = new IXR_Error($this->message->faultCode, $this->message->faultString); - return false; - } - - // Message must be OK - return true; - } - - function getResponse() - { - // methodResponses can only have one param - return that - return $this->message->params[0]; - } - - function isError() - { - return (is_object($this->error)); - } - - function getErrorCode() - { - return $this->error->code; - } - - function getErrorMessage() - { - return $this->error->message; - } -} diff --git a/wp/wp-includes/IXR/class-IXR-clientmulticall.php b/wp/wp-includes/IXR/class-IXR-clientmulticall.php deleted file mode 100644 index bc40efd7..00000000 --- a/wp/wp-includes/IXR/class-IXR-clientmulticall.php +++ /dev/null @@ -1,44 +0,0 @@ -useragent = 'The Incutio XML-RPC PHP Library (multicall client)'; - } - - /** - * PHP4 constructor. - */ - public function IXR_ClientMulticall( $server, $path = false, $port = 80 ) { - self::__construct( $server, $path, $port ); - } - - function addCall() - { - $args = func_get_args(); - $methodName = array_shift($args); - $struct = array( - 'methodName' => $methodName, - 'params' => $args - ); - $this->calls[] = $struct; - } - - function query() - { - // Prepare multicall, then call the parent::query() method - return parent::query('system.multicall', $this->calls); - } -} diff --git a/wp/wp-includes/IXR/class-IXR-date.php b/wp/wp-includes/IXR/class-IXR-date.php deleted file mode 100644 index 7304f603..00000000 --- a/wp/wp-includes/IXR/class-IXR-date.php +++ /dev/null @@ -1,74 +0,0 @@ -parseTimestamp($time); - } else { - $this->parseIso($time); - } - } - - /** - * PHP4 constructor. - */ - public function IXR_Date( $time ) { - self::__construct( $time ); - } - - function parseTimestamp($timestamp) - { - $this->year = date('Y', $timestamp); - $this->month = date('m', $timestamp); - $this->day = date('d', $timestamp); - $this->hour = date('H', $timestamp); - $this->minute = date('i', $timestamp); - $this->second = date('s', $timestamp); - $this->timezone = ''; - } - - function parseIso($iso) - { - $this->year = substr($iso, 0, 4); - $this->month = substr($iso, 4, 2); - $this->day = substr($iso, 6, 2); - $this->hour = substr($iso, 9, 2); - $this->minute = substr($iso, 12, 2); - $this->second = substr($iso, 15, 2); - $this->timezone = substr($iso, 17); - } - - function getIso() - { - return $this->year.$this->month.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second.$this->timezone; - } - - function getXml() - { - return ''.$this->getIso().''; - } - - function getTimestamp() - { - return mktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year); - } -} diff --git a/wp/wp-includes/IXR/class-IXR-error.php b/wp/wp-includes/IXR/class-IXR-error.php deleted file mode 100644 index 660f7d10..00000000 --- a/wp/wp-includes/IXR/class-IXR-error.php +++ /dev/null @@ -1,53 +0,0 @@ -code = $code; - $this->message = htmlspecialchars($message); - } - - /** - * PHP4 constructor. - */ - public function IXR_Error( $code, $message ) { - self::__construct( $code, $message ); - } - - function getXml() - { - $xml = << - - - - - faultCode - {$this->code} - - - faultString - {$this->message} - - - - - - -EOD; - return $xml; - } -} diff --git a/wp/wp-includes/IXR/class-IXR-introspectionserver.php b/wp/wp-includes/IXR/class-IXR-introspectionserver.php deleted file mode 100644 index 5628d81c..00000000 --- a/wp/wp-includes/IXR/class-IXR-introspectionserver.php +++ /dev/null @@ -1,174 +0,0 @@ -setCallbacks(); - $this->setCapabilities(); - $this->capabilities['introspection'] = array( - 'specUrl' => 'http://xmlrpc.usefulinc.com/doc/reserved.html', - 'specVersion' => 1 - ); - $this->addCallback( - 'system.methodSignature', - 'this:methodSignature', - array('array', 'string'), - 'Returns an array describing the return type and required parameters of a method' - ); - $this->addCallback( - 'system.getCapabilities', - 'this:getCapabilities', - array('struct'), - 'Returns a struct describing the XML-RPC specifications supported by this server' - ); - $this->addCallback( - 'system.listMethods', - 'this:listMethods', - array('array'), - 'Returns an array of available methods on this server' - ); - $this->addCallback( - 'system.methodHelp', - 'this:methodHelp', - array('string', 'string'), - 'Returns a documentation string for the specified method' - ); - } - - /** - * PHP4 constructor. - */ - public function IXR_IntrospectionServer() { - self::__construct(); - } - - function addCallback($method, $callback, $args, $help) - { - $this->callbacks[$method] = $callback; - $this->signatures[$method] = $args; - $this->help[$method] = $help; - } - - function call($methodname, $args) - { - // Make sure it's in an array - if ($args && !is_array($args)) { - $args = array($args); - } - - // Over-rides default call method, adds signature check - if (!$this->hasMethod($methodname)) { - return new IXR_Error(-32601, 'server error. requested method "'.$this->message->methodName.'" not specified.'); - } - $method = $this->callbacks[$methodname]; - $signature = $this->signatures[$methodname]; - $returnType = array_shift($signature); - - // Check the number of arguments - if (count($args) != count($signature)) { - return new IXR_Error(-32602, 'server error. wrong number of method parameters'); - } - - // Check the argument types - $ok = true; - $argsbackup = $args; - for ($i = 0, $j = count($args); $i < $j; $i++) { - $arg = array_shift($args); - $type = array_shift($signature); - switch ($type) { - case 'int': - case 'i4': - if (is_array($arg) || !is_int($arg)) { - $ok = false; - } - break; - case 'base64': - case 'string': - if (!is_string($arg)) { - $ok = false; - } - break; - case 'boolean': - if ($arg !== false && $arg !== true) { - $ok = false; - } - break; - case 'float': - case 'double': - if (!is_float($arg)) { - $ok = false; - } - break; - case 'date': - case 'dateTime.iso8601': - if (!is_a($arg, 'IXR_Date')) { - $ok = false; - } - break; - } - if (!$ok) { - return new IXR_Error(-32602, 'server error. invalid method parameters'); - } - } - // It passed the test - run the "real" method call - return parent::call($methodname, $argsbackup); - } - - function methodSignature($method) - { - if (!$this->hasMethod($method)) { - return new IXR_Error(-32601, 'server error. requested method "'.$method.'" not specified.'); - } - // We should be returning an array of types - $types = $this->signatures[$method]; - $return = array(); - foreach ($types as $type) { - switch ($type) { - case 'string': - $return[] = 'string'; - break; - case 'int': - case 'i4': - $return[] = 42; - break; - case 'double': - $return[] = 3.1415; - break; - case 'dateTime.iso8601': - $return[] = new IXR_Date(time()); - break; - case 'boolean': - $return[] = true; - break; - case 'base64': - $return[] = new IXR_Base64('base64'); - break; - case 'array': - $return[] = array('array'); - break; - case 'struct': - $return[] = array('struct' => 'struct'); - break; - } - } - return $return; - } - - function methodHelp($method) - { - return $this->help[$method]; - } -} diff --git a/wp/wp-includes/IXR/class-IXR-message.php b/wp/wp-includes/IXR/class-IXR-message.php deleted file mode 100644 index 69af8aa2..00000000 --- a/wp/wp-includes/IXR/class-IXR-message.php +++ /dev/null @@ -1,234 +0,0 @@ -message =& $message; - } - - /** - * PHP4 constructor. - */ - public function IXR_Message( $message ) { - self::__construct( $message ); - } - - function parse() - { - if ( ! function_exists( 'xml_parser_create' ) ) { - trigger_error( __( "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." ) ); - return false; - } - - // first remove the XML declaration - // merged from WP #10698 - this method avoids the RAM usage of preg_replace on very large messages - $header = preg_replace( '/<\?xml.*?\?'.'>/s', '', substr( $this->message, 0, 100 ), 1 ); - $this->message = trim( substr_replace( $this->message, $header, 0, 100 ) ); - if ( '' == $this->message ) { - return false; - } - - // Then remove the DOCTYPE - $header = preg_replace( '/^]*+>/i', '', substr( $this->message, 0, 200 ), 1 ); - $this->message = trim( substr_replace( $this->message, $header, 0, 200 ) ); - if ( '' == $this->message ) { - return false; - } - - // Check that the root tag is valid - $root_tag = substr( $this->message, 0, strcspn( substr( $this->message, 0, 20 ), "> \t\r\n" ) ); - if ( 'message, '<' ) ) { - return false; - } - - $this->_parser = xml_parser_create(); - // Set XML parser to take the case of tags in to account - xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false); - // Set XML parser callback functions - xml_set_object($this->_parser, $this); - xml_set_element_handler($this->_parser, 'tag_open', 'tag_close'); - xml_set_character_data_handler($this->_parser, 'cdata'); - - // 256Kb, parse in chunks to avoid the RAM usage on very large messages - $chunk_size = 262144; - - /** - * Filters the chunk size that can be used to parse an XML-RPC reponse message. - * - * @since 4.4.0 - * - * @param int $chunk_size Chunk size to parse in bytes. - */ - $chunk_size = apply_filters( 'xmlrpc_chunk_parsing_size', $chunk_size ); - - $final = false; - do { - if (strlen($this->message) <= $chunk_size) { - $final = true; - } - $part = substr($this->message, 0, $chunk_size); - $this->message = substr($this->message, $chunk_size); - if (!xml_parse($this->_parser, $part, $final)) { - return false; - } - if ($final) { - break; - } - } while (true); - xml_parser_free($this->_parser); - - // Grab the error messages, if any - if ($this->messageType == 'fault') { - $this->faultCode = $this->params[0]['faultCode']; - $this->faultString = $this->params[0]['faultString']; - } - return true; - } - - function tag_open($parser, $tag, $attr) - { - $this->_currentTagContents = ''; - $this->currentTag = $tag; - switch($tag) { - case 'methodCall': - case 'methodResponse': - case 'fault': - $this->messageType = $tag; - break; - /* Deal with stacks of arrays and structs */ - case 'data': // data is to all intents and puposes more interesting than array - $this->_arraystructstypes[] = 'array'; - $this->_arraystructs[] = array(); - break; - case 'struct': - $this->_arraystructstypes[] = 'struct'; - $this->_arraystructs[] = array(); - break; - } - } - - function cdata($parser, $cdata) - { - $this->_currentTagContents .= $cdata; - } - - function tag_close($parser, $tag) - { - $valueFlag = false; - switch($tag) { - case 'int': - case 'i4': - $value = (int)trim($this->_currentTagContents); - $valueFlag = true; - break; - case 'double': - $value = (double)trim($this->_currentTagContents); - $valueFlag = true; - break; - case 'string': - $value = (string)trim($this->_currentTagContents); - $valueFlag = true; - break; - case 'dateTime.iso8601': - $value = new IXR_Date(trim($this->_currentTagContents)); - $valueFlag = true; - break; - case 'value': - // "If no type is indicated, the type is string." - if (trim($this->_currentTagContents) != '') { - $value = (string)$this->_currentTagContents; - $valueFlag = true; - } - break; - case 'boolean': - $value = (boolean)trim($this->_currentTagContents); - $valueFlag = true; - break; - case 'base64': - $value = base64_decode($this->_currentTagContents); - $valueFlag = true; - break; - /* Deal with stacks of arrays and structs */ - case 'data': - case 'struct': - $value = array_pop($this->_arraystructs); - array_pop($this->_arraystructstypes); - $valueFlag = true; - break; - case 'member': - array_pop($this->_currentStructName); - break; - case 'name': - $this->_currentStructName[] = trim($this->_currentTagContents); - break; - case 'methodName': - $this->methodName = trim($this->_currentTagContents); - break; - } - - if ($valueFlag) { - if (count($this->_arraystructs) > 0) { - // Add value to struct or array - if ($this->_arraystructstypes[count($this->_arraystructstypes)-1] == 'struct') { - // Add to struct - $this->_arraystructs[count($this->_arraystructs)-1][$this->_currentStructName[count($this->_currentStructName)-1]] = $value; - } else { - // Add to array - $this->_arraystructs[count($this->_arraystructs)-1][] = $value; - } - } else { - // Just add as a parameter - $this->params[] = $value; - } - } - $this->_currentTagContents = ''; - } -} diff --git a/wp/wp-includes/IXR/class-IXR-request.php b/wp/wp-includes/IXR/class-IXR-request.php deleted file mode 100644 index b00687ba..00000000 --- a/wp/wp-includes/IXR/class-IXR-request.php +++ /dev/null @@ -1,54 +0,0 @@ -method = $method; - $this->args = $args; - $this->xml = << - -{$this->method} - - -EOD; - foreach ($this->args as $arg) { - $this->xml .= ''; - $v = new IXR_Value($arg); - $this->xml .= $v->getXml(); - $this->xml .= "\n"; - } - $this->xml .= ''; - } - - /** - * PHP4 constructor. - */ - public function IXR_Request( $method, $args ) { - self::__construct( $method, $args ); - } - - function getLength() - { - return strlen($this->xml); - } - - function getXml() - { - return $this->xml; - } -} diff --git a/wp/wp-includes/IXR/class-IXR-server.php b/wp/wp-includes/IXR/class-IXR-server.php deleted file mode 100644 index 095e4455..00000000 --- a/wp/wp-includes/IXR/class-IXR-server.php +++ /dev/null @@ -1,225 +0,0 @@ -setCapabilities(); - if ($callbacks) { - $this->callbacks = $callbacks; - } - $this->setCallbacks(); - if (!$wait) { - $this->serve($data); - } - } - - /** - * PHP4 constructor. - */ - public function IXR_Server( $callbacks = false, $data = false, $wait = false ) { - self::__construct( $callbacks, $data, $wait ); - } - - function serve($data = false) - { - if (!$data) { - if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] !== 'POST') { - if ( function_exists( 'status_header' ) ) { - status_header( 405 ); // WP #20986 - header( 'Allow: POST' ); - } - header('Content-Type: text/plain'); // merged from WP #9093 - die('XML-RPC server accepts POST requests only.'); - } - - global $HTTP_RAW_POST_DATA; - if (empty($HTTP_RAW_POST_DATA)) { - // workaround for a bug in PHP 5.2.2 - http://bugs.php.net/bug.php?id=41293 - $data = file_get_contents('php://input'); - } else { - $data =& $HTTP_RAW_POST_DATA; - } - } - $this->message = new IXR_Message($data); - if (!$this->message->parse()) { - $this->error(-32700, 'parse error. not well formed'); - } - if ($this->message->messageType != 'methodCall') { - $this->error(-32600, 'server error. invalid xml-rpc. not conforming to spec. Request must be a methodCall'); - } - $result = $this->call($this->message->methodName, $this->message->params); - - // Is the result an error? - if (is_a($result, 'IXR_Error')) { - $this->error($result); - } - - // Encode the result - $r = new IXR_Value($result); - $resultxml = $r->getXml(); - - // Create the XML - $xml = << - - - - $resultxml - - - - - -EOD; - // Send it - $this->output($xml); - } - - function call($methodname, $args) - { - if (!$this->hasMethod($methodname)) { - return new IXR_Error(-32601, 'server error. requested method '.$methodname.' does not exist.'); - } - $method = $this->callbacks[$methodname]; - - // Perform the callback and send the response - if (count($args) == 1) { - // If only one parameter just send that instead of the whole array - $args = $args[0]; - } - - // Are we dealing with a function or a method? - if (is_string($method) && substr($method, 0, 5) == 'this:') { - // It's a class method - check it exists - $method = substr($method, 5); - if (!method_exists($this, $method)) { - return new IXR_Error(-32601, 'server error. requested class method "'.$method.'" does not exist.'); - } - - //Call the method - $result = $this->$method($args); - } else { - // It's a function - does it exist? - if (is_array($method)) { - if (!is_callable(array($method[0], $method[1]))) { - return new IXR_Error(-32601, 'server error. requested object method "'.$method[1].'" does not exist.'); - } - } else if (!function_exists($method)) { - return new IXR_Error(-32601, 'server error. requested function "'.$method.'" does not exist.'); - } - - // Call the function - $result = call_user_func($method, $args); - } - return $result; - } - - function error($error, $message = false) - { - // Accepts either an error object or an error code and message - if ($message && !is_object($error)) { - $error = new IXR_Error($error, $message); - } - $this->output($error->getXml()); - } - - function output($xml) - { - $charset = function_exists('get_option') ? get_option('blog_charset') : ''; - if ($charset) - $xml = ''."\n".$xml; - else - $xml = ''."\n".$xml; - $length = strlen($xml); - header('Connection: close'); - if ($charset) - header('Content-Type: text/xml; charset='.$charset); - else - header('Content-Type: text/xml'); - header('Date: '.date('r')); - echo $xml; - exit; - } - - function hasMethod($method) - { - return in_array($method, array_keys($this->callbacks)); - } - - function setCapabilities() - { - // Initialises capabilities array - $this->capabilities = array( - 'xmlrpc' => array( - 'specUrl' => 'http://www.xmlrpc.com/spec', - 'specVersion' => 1 - ), - 'faults_interop' => array( - 'specUrl' => 'http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php', - 'specVersion' => 20010516 - ), - 'system.multicall' => array( - 'specUrl' => 'http://www.xmlrpc.com/discuss/msgReader$1208', - 'specVersion' => 1 - ), - ); - } - - function getCapabilities($args) - { - return $this->capabilities; - } - - function setCallbacks() - { - $this->callbacks['system.getCapabilities'] = 'this:getCapabilities'; - $this->callbacks['system.listMethods'] = 'this:listMethods'; - $this->callbacks['system.multicall'] = 'this:multiCall'; - } - - function listMethods($args) - { - // Returns a list of methods - uses array_reverse to ensure user defined - // methods are listed before server defined methods - return array_reverse(array_keys($this->callbacks)); - } - - function multiCall($methodcalls) - { - // See http://www.xmlrpc.com/discuss/msgReader$1208 - $return = array(); - foreach ($methodcalls as $call) { - $method = $call['methodName']; - $params = $call['params']; - if ($method == 'system.multicall') { - $result = new IXR_Error(-32600, 'Recursive calls to system.multicall are forbidden'); - } else { - $result = $this->call($method, $params); - } - if (is_a($result, 'IXR_Error')) { - $return[] = array( - 'faultCode' => $result->code, - 'faultString' => $result->message - ); - } else { - $return[] = array($result); - } - } - return $return; - } -} diff --git a/wp/wp-includes/IXR/class-IXR-value.php b/wp/wp-includes/IXR/class-IXR-value.php deleted file mode 100644 index 0fd878bc..00000000 --- a/wp/wp-includes/IXR/class-IXR-value.php +++ /dev/null @@ -1,138 +0,0 @@ -data = $data; - if (!$type) { - $type = $this->calculateType(); - } - $this->type = $type; - if ($type == 'struct') { - // Turn all the values in the array in to new IXR_Value objects - foreach ($this->data as $key => $value) { - $this->data[$key] = new IXR_Value($value); - } - } - if ($type == 'array') { - for ($i = 0, $j = count($this->data); $i < $j; $i++) { - $this->data[$i] = new IXR_Value($this->data[$i]); - } - } - } - - /** - * PHP4 constructor. - */ - public function IXR_Value( $data, $type = false ) { - self::__construct( $data, $type ); - } - - function calculateType() - { - if ($this->data === true || $this->data === false) { - return 'boolean'; - } - if (is_integer($this->data)) { - return 'int'; - } - if (is_double($this->data)) { - return 'double'; - } - - // Deal with IXR object types base64 and date - if (is_object($this->data) && is_a($this->data, 'IXR_Date')) { - return 'date'; - } - if (is_object($this->data) && is_a($this->data, 'IXR_Base64')) { - return 'base64'; - } - - // If it is a normal PHP object convert it in to a struct - if (is_object($this->data)) { - $this->data = get_object_vars($this->data); - return 'struct'; - } - if (!is_array($this->data)) { - return 'string'; - } - - // We have an array - is it an array or a struct? - if ($this->isStruct($this->data)) { - return 'struct'; - } else { - return 'array'; - } - } - - function getXml() - { - // Return XML for this value - switch ($this->type) { - case 'boolean': - return ''.(($this->data) ? '1' : '0').''; - break; - case 'int': - return ''.$this->data.''; - break; - case 'double': - return ''.$this->data.''; - break; - case 'string': - return ''.htmlspecialchars($this->data).''; - break; - case 'array': - $return = ''."\n"; - foreach ($this->data as $item) { - $return .= ' '.$item->getXml()."\n"; - } - $return .= ''; - return $return; - break; - case 'struct': - $return = ''."\n"; - foreach ($this->data as $name => $value) { - $name = htmlspecialchars($name); - $return .= " $name"; - $return .= $value->getXml()."\n"; - } - $return .= ''; - return $return; - break; - case 'date': - case 'base64': - return $this->data->getXml(); - break; - } - return false; - } - - /** - * Checks whether or not the supplied array is a struct or not - * - * @param array $array - * @return bool - */ - function isStruct($array) - { - $expected = 0; - foreach ($array as $key => $value) { - if ((string)$key !== (string)$expected) { - return true; - } - $expected++; - } - return false; - } -} diff --git a/wp/wp-includes/Requests/Auth.php b/wp/wp-includes/Requests/Auth.php deleted file mode 100644 index bca41092..00000000 --- a/wp/wp-includes/Requests/Auth.php +++ /dev/null @@ -1,33 +0,0 @@ -user, $this->pass) = $args; - } - } - - /** - * Register the necessary callbacks - * - * @see curl_before_send - * @see fsockopen_header - * @param Requests_Hooks $hooks Hook system - */ - public function register(Requests_Hooks &$hooks) { - $hooks->register('curl.before_send', array(&$this, 'curl_before_send')); - $hooks->register('fsockopen.after_headers', array(&$this, 'fsockopen_header')); - } - - /** - * Set cURL parameters before the data is sent - * - * @param resource $handle cURL resource - */ - public function curl_before_send(&$handle) { - curl_setopt($handle, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_setopt($handle, CURLOPT_USERPWD, $this->getAuthString()); - } - - /** - * Add extra headers to the request before sending - * - * @param string $out HTTP header string - */ - public function fsockopen_header(&$out) { - $out .= sprintf("Authorization: Basic %s\r\n", base64_encode($this->getAuthString())); - } - - /** - * Get the authentication string (user:pass) - * - * @return string - */ - public function getAuthString() { - return $this->user . ':' . $this->pass; - } -} \ No newline at end of file diff --git a/wp/wp-includes/Requests/Cookie.php b/wp/wp-includes/Requests/Cookie.php deleted file mode 100644 index 00fbbc73..00000000 --- a/wp/wp-includes/Requests/Cookie.php +++ /dev/null @@ -1,500 +0,0 @@ -name = $name; - $this->value = $value; - $this->attributes = $attributes; - $default_flags = array( - 'creation' => time(), - 'last-access' => time(), - 'persistent' => false, - 'host-only' => true, - ); - $this->flags = array_merge($default_flags, $flags); - - $this->reference_time = time(); - if ($reference_time !== null) { - $this->reference_time = $reference_time; - } - - $this->normalize(); - } - - /** - * Check if a cookie is expired. - * - * Checks the age against $this->reference_time to determine if the cookie - * is expired. - * - * @return boolean True if expired, false if time is valid. - */ - public function is_expired() { - // RFC6265, s. 4.1.2.2: - // If a cookie has both the Max-Age and the Expires attribute, the Max- - // Age attribute has precedence and controls the expiration date of the - // cookie. - if (isset($this->attributes['max-age'])) { - $max_age = $this->attributes['max-age']; - return $max_age < $this->reference_time; - } - - if (isset($this->attributes['expires'])) { - $expires = $this->attributes['expires']; - return $expires < $this->reference_time; - } - - return false; - } - - /** - * Check if a cookie is valid for a given URI - * - * @param Requests_IRI $uri URI to check - * @return boolean Whether the cookie is valid for the given URI - */ - public function uri_matches(Requests_IRI $uri) { - if (!$this->domain_matches($uri->host)) { - return false; - } - - if (!$this->path_matches($uri->path)) { - return false; - } - - return empty($this->attributes['secure']) || $uri->scheme === 'https'; - } - - /** - * Check if a cookie is valid for a given domain - * - * @param string $string Domain to check - * @return boolean Whether the cookie is valid for the given domain - */ - public function domain_matches($string) { - if (!isset($this->attributes['domain'])) { - // Cookies created manually; cookies created by Requests will set - // the domain to the requested domain - return true; - } - - $domain_string = $this->attributes['domain']; - if ($domain_string === $string) { - // The domain string and the string are identical. - return true; - } - - // If the cookie is marked as host-only and we don't have an exact - // match, reject the cookie - if ($this->flags['host-only'] === true) { - return false; - } - - if (strlen($string) <= strlen($domain_string)) { - // For obvious reasons, the string cannot be a suffix if the domain - // is shorter than the domain string - return false; - } - - if (substr($string, -1 * strlen($domain_string)) !== $domain_string) { - // The domain string should be a suffix of the string. - return false; - } - - $prefix = substr($string, 0, strlen($string) - strlen($domain_string)); - if (substr($prefix, -1) !== '.') { - // The last character of the string that is not included in the - // domain string should be a %x2E (".") character. - return false; - } - - // The string should be a host name (i.e., not an IP address). - return !preg_match('#^(.+\.)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$#', $string); - } - - /** - * Check if a cookie is valid for a given path - * - * From the path-match check in RFC 6265 section 5.1.4 - * - * @param string $request_path Path to check - * @return boolean Whether the cookie is valid for the given path - */ - public function path_matches($request_path) { - if (empty($request_path)) { - // Normalize empty path to root - $request_path = '/'; - } - - if (!isset($this->attributes['path'])) { - // Cookies created manually; cookies created by Requests will set - // the path to the requested path - return true; - } - - $cookie_path = $this->attributes['path']; - - if ($cookie_path === $request_path) { - // The cookie-path and the request-path are identical. - return true; - } - - if (strlen($request_path) > strlen($cookie_path) && substr($request_path, 0, strlen($cookie_path)) === $cookie_path) { - if (substr($cookie_path, -1) === '/') { - // The cookie-path is a prefix of the request-path, and the last - // character of the cookie-path is %x2F ("/"). - return true; - } - - if (substr($request_path, strlen($cookie_path), 1) === '/') { - // The cookie-path is a prefix of the request-path, and the - // first character of the request-path that is not included in - // the cookie-path is a %x2F ("/") character. - return true; - } - } - - return false; - } - - /** - * Normalize cookie and attributes - * - * @return boolean Whether the cookie was successfully normalized - */ - public function normalize() { - foreach ($this->attributes as $key => $value) { - $orig_value = $value; - $value = $this->normalize_attribute($key, $value); - if ($value === null) { - unset($this->attributes[$key]); - continue; - } - - if ($value !== $orig_value) { - $this->attributes[$key] = $value; - } - } - - return true; - } - - /** - * Parse an individual cookie attribute - * - * Handles parsing individual attributes from the cookie values. - * - * @param string $name Attribute name - * @param string|boolean $value Attribute value (string value, or true if empty/flag) - * @return mixed Value if available, or null if the attribute value is invalid (and should be skipped) - */ - protected function normalize_attribute($name, $value) { - switch (strtolower($name)) { - case 'expires': - // Expiration parsing, as per RFC 6265 section 5.2.1 - if (is_int($value)) { - return $value; - } - - $expiry_time = strtotime($value); - if ($expiry_time === false) { - return null; - } - - return $expiry_time; - - case 'max-age': - // Expiration parsing, as per RFC 6265 section 5.2.2 - if (is_int($value)) { - return $value; - } - - // Check that we have a valid age - if (!preg_match('/^-?\d+$/', $value)) { - return null; - } - - $delta_seconds = (int) $value; - if ($delta_seconds <= 0) { - $expiry_time = 0; - } - else { - $expiry_time = $this->reference_time + $delta_seconds; - } - - return $expiry_time; - - case 'domain': - // Domain normalization, as per RFC 6265 section 5.2.3 - if ($value[0] === '.') { - $value = substr($value, 1); - } - - return $value; - - default: - return $value; - } - } - - /** - * Format a cookie for a Cookie header - * - * This is used when sending cookies to a server. - * - * @return string Cookie formatted for Cookie header - */ - public function format_for_header() { - return sprintf('%s=%s', $this->name, $this->value); - } - - /** - * Format a cookie for a Cookie header - * - * @codeCoverageIgnore - * @deprecated Use {@see Requests_Cookie::format_for_header} - * @return string - */ - public function formatForHeader() { - return $this->format_for_header(); - } - - /** - * Format a cookie for a Set-Cookie header - * - * This is used when sending cookies to clients. This isn't really - * applicable to client-side usage, but might be handy for debugging. - * - * @return string Cookie formatted for Set-Cookie header - */ - public function format_for_set_cookie() { - $header_value = $this->format_for_header(); - if (!empty($this->attributes)) { - $parts = array(); - foreach ($this->attributes as $key => $value) { - // Ignore non-associative attributes - if (is_numeric($key)) { - $parts[] = $value; - } - else { - $parts[] = sprintf('%s=%s', $key, $value); - } - } - - $header_value .= '; ' . implode('; ', $parts); - } - return $header_value; - } - - /** - * Format a cookie for a Set-Cookie header - * - * @codeCoverageIgnore - * @deprecated Use {@see Requests_Cookie::format_for_set_cookie} - * @return string - */ - public function formatForSetCookie() { - return $this->format_for_set_cookie(); - } - - /** - * Get the cookie value - * - * Attributes and other data can be accessed via methods. - */ - public function __toString() { - return $this->value; - } - - /** - * Parse a cookie string into a cookie object - * - * Based on Mozilla's parsing code in Firefox and related projects, which - * is an intentional deviation from RFC 2109 and RFC 2616. RFC 6265 - * specifies some of this handling, but not in a thorough manner. - * - * @param string Cookie header value (from a Set-Cookie header) - * @return Requests_Cookie Parsed cookie object - */ - public static function parse($string, $name = '', $reference_time = null) { - $parts = explode(';', $string); - $kvparts = array_shift($parts); - - if (!empty($name)) { - $value = $string; - } - elseif (strpos($kvparts, '=') === false) { - // Some sites might only have a value without the equals separator. - // Deviate from RFC 6265 and pretend it was actually a blank name - // (`=foo`) - // - // https://bugzilla.mozilla.org/show_bug.cgi?id=169091 - $name = ''; - $value = $kvparts; - } - else { - list($name, $value) = explode('=', $kvparts, 2); - } - $name = trim($name); - $value = trim($value); - - // Attribute key are handled case-insensitively - $attributes = new Requests_Utility_CaseInsensitiveDictionary(); - - if (!empty($parts)) { - foreach ($parts as $part) { - if (strpos($part, '=') === false) { - $part_key = $part; - $part_value = true; - } - else { - list($part_key, $part_value) = explode('=', $part, 2); - $part_value = trim($part_value); - } - - $part_key = trim($part_key); - $attributes[$part_key] = $part_value; - } - } - - return new Requests_Cookie($name, $value, $attributes, array(), $reference_time); - } - - /** - * Parse all Set-Cookie headers from request headers - * - * @param Requests_Response_Headers $headers Headers to parse from - * @param Requests_IRI|null $origin URI for comparing cookie origins - * @param int|null $time Reference time for expiration calculation - * @return array - */ - public static function parse_from_headers(Requests_Response_Headers $headers, Requests_IRI $origin = null, $time = null) { - $cookie_headers = $headers->getValues('Set-Cookie'); - if (empty($cookie_headers)) { - return array(); - } - - $cookies = array(); - foreach ($cookie_headers as $header) { - $parsed = self::parse($header, '', $time); - - // Default domain/path attributes - if (empty($parsed->attributes['domain']) && !empty($origin)) { - $parsed->attributes['domain'] = $origin->host; - $parsed->flags['host-only'] = true; - } - else { - $parsed->flags['host-only'] = false; - } - - $path_is_valid = (!empty($parsed->attributes['path']) && $parsed->attributes['path'][0] === '/'); - if (!$path_is_valid && !empty($origin)) { - $path = $origin->path; - - // Default path normalization as per RFC 6265 section 5.1.4 - if (substr($path, 0, 1) !== '/') { - // If the uri-path is empty or if the first character of - // the uri-path is not a %x2F ("/") character, output - // %x2F ("/") and skip the remaining steps. - $path = '/'; - } - elseif (substr_count($path, '/') === 1) { - // If the uri-path contains no more than one %x2F ("/") - // character, output %x2F ("/") and skip the remaining - // step. - $path = '/'; - } - else { - // Output the characters of the uri-path from the first - // character up to, but not including, the right-most - // %x2F ("/"). - $path = substr($path, 0, strrpos($path, '/')); - } - $parsed->attributes['path'] = $path; - } - - // Reject invalid cookie domains - if (!empty($origin) && !$parsed->domain_matches($origin->host)) { - continue; - } - - $cookies[$parsed->name] = $parsed; - } - - return $cookies; - } - - /** - * Parse all Set-Cookie headers from request headers - * - * @codeCoverageIgnore - * @deprecated Use {@see Requests_Cookie::parse_from_headers} - * @return string - */ - public static function parseFromHeaders(Requests_Response_Headers $headers) { - return self::parse_from_headers($headers); - } -} diff --git a/wp/wp-includes/Requests/Cookie/Jar.php b/wp/wp-includes/Requests/Cookie/Jar.php deleted file mode 100644 index 69be0fb5..00000000 --- a/wp/wp-includes/Requests/Cookie/Jar.php +++ /dev/null @@ -1,175 +0,0 @@ -cookies = $cookies; - } - - /** - * Normalise cookie data into a Requests_Cookie - * - * @param string|Requests_Cookie $cookie - * @return Requests_Cookie - */ - public function normalize_cookie($cookie, $key = null) { - if ($cookie instanceof Requests_Cookie) { - return $cookie; - } - - return Requests_Cookie::parse($cookie, $key); - } - - /** - * Normalise cookie data into a Requests_Cookie - * - * @codeCoverageIgnore - * @deprecated Use {@see Requests_Cookie_Jar::normalize_cookie} - * @return Requests_Cookie - */ - public function normalizeCookie($cookie, $key = null) { - return $this->normalize_cookie($cookie, $key); - } - - /** - * Check if the given item exists - * - * @param string $key Item key - * @return boolean Does the item exist? - */ - public function offsetExists($key) { - return isset($this->cookies[$key]); - } - - /** - * Get the value for the item - * - * @param string $key Item key - * @return string Item value - */ - public function offsetGet($key) { - if (!isset($this->cookies[$key])) { - return null; - } - - return $this->cookies[$key]; - } - - /** - * Set the given item - * - * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`) - * - * @param string $key Item name - * @param string $value Item value - */ - public function offsetSet($key, $value) { - if ($key === null) { - throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset'); - } - - $this->cookies[$key] = $value; - } - - /** - * Unset the given header - * - * @param string $key - */ - public function offsetUnset($key) { - unset($this->cookies[$key]); - } - - /** - * Get an iterator for the data - * - * @return ArrayIterator - */ - public function getIterator() { - return new ArrayIterator($this->cookies); - } - - /** - * Register the cookie handler with the request's hooking system - * - * @param Requests_Hooker $hooks Hooking system - */ - public function register(Requests_Hooker $hooks) { - $hooks->register('requests.before_request', array($this, 'before_request')); - $hooks->register('requests.before_redirect_check', array($this, 'before_redirect_check')); - } - - /** - * Add Cookie header to a request if we have any - * - * As per RFC 6265, cookies are separated by '; ' - * - * @param string $url - * @param array $headers - * @param array $data - * @param string $type - * @param array $options - */ - public function before_request($url, &$headers, &$data, &$type, &$options) { - if (!$url instanceof Requests_IRI) { - $url = new Requests_IRI($url); - } - - if (!empty($this->cookies)) { - $cookies = array(); - foreach ($this->cookies as $key => $cookie) { - $cookie = $this->normalize_cookie($cookie, $key); - - // Skip expired cookies - if ($cookie->is_expired()) { - continue; - } - - if ($cookie->domain_matches($url->host)) { - $cookies[] = $cookie->format_for_header(); - } - } - - $headers['Cookie'] = implode('; ', $cookies); - } - } - - /** - * Parse all cookies from a response and attach them to the response - * - * @var Requests_Response $response - */ - public function before_redirect_check(Requests_Response &$return) { - $url = $return->url; - if (!$url instanceof Requests_IRI) { - $url = new Requests_IRI($url); - } - - $cookies = Requests_Cookie::parse_from_headers($return->headers, $url); - $this->cookies = array_merge($this->cookies, $cookies); - $return->cookies = $this; - } -} \ No newline at end of file diff --git a/wp/wp-includes/Requests/Exception.php b/wp/wp-includes/Requests/Exception.php deleted file mode 100644 index 37d4711c..00000000 --- a/wp/wp-includes/Requests/Exception.php +++ /dev/null @@ -1,62 +0,0 @@ -type = $type; - $this->data = $data; - } - - /** - * Like {@see getCode()}, but a string code. - * - * @codeCoverageIgnore - * @return string - */ - public function getType() { - return $this->type; - } - - /** - * Gives any relevant data - * - * @codeCoverageIgnore - * @return mixed - */ - public function getData() { - return $this->data; - } -} \ No newline at end of file diff --git a/wp/wp-includes/Requests/Exception/HTTP.php b/wp/wp-includes/Requests/Exception/HTTP.php deleted file mode 100644 index 9ac6a873..00000000 --- a/wp/wp-includes/Requests/Exception/HTTP.php +++ /dev/null @@ -1,71 +0,0 @@ -reason = $reason; - } - - $message = sprintf('%d %s', $this->code, $this->reason); - parent::__construct($message, 'httpresponse', $data, $this->code); - } - - /** - * Get the status message - */ - public function getReason() { - return $this->reason; - } - - /** - * Get the correct exception class for a given error code - * - * @param int|bool $code HTTP status code, or false if unavailable - * @return string Exception class name to use - */ - public static function get_class($code) { - if (!$code) { - return 'Requests_Exception_HTTP_Unknown'; - } - - $class = sprintf('Requests_Exception_HTTP_%d', $code); - if (class_exists($class)) { - return $class; - } - - return 'Requests_Exception_HTTP_Unknown'; - } -} \ No newline at end of file diff --git a/wp/wp-includes/Requests/Exception/HTTP/304.php b/wp/wp-includes/Requests/Exception/HTTP/304.php deleted file mode 100644 index 67990335..00000000 --- a/wp/wp-includes/Requests/Exception/HTTP/304.php +++ /dev/null @@ -1,27 +0,0 @@ -code = $data->status_code; - } - - parent::__construct($reason, $data); - } -} \ No newline at end of file diff --git a/wp/wp-includes/Requests/Exception/Transport.php b/wp/wp-includes/Requests/Exception/Transport.php deleted file mode 100644 index e60b4884..00000000 --- a/wp/wp-includes/Requests/Exception/Transport.php +++ /dev/null @@ -1,5 +0,0 @@ -type = $type; - } - - if ($code !== null) { - $this->code = $code; - } - - if ($message !== null) { - $this->reason = $message; - } - - $message = sprintf('%d %s', $this->code, $this->reason); - parent::__construct($message, $this->type, $data, $this->code); - } - - /** - * Get the error message - */ - public function getReason() { - return $this->reason; - } - -} diff --git a/wp/wp-includes/Requests/Hooker.php b/wp/wp-includes/Requests/Hooker.php deleted file mode 100644 index f667ae9c..00000000 --- a/wp/wp-includes/Requests/Hooker.php +++ /dev/null @@ -1,33 +0,0 @@ -0 is executed later - */ - public function register($hook, $callback, $priority = 0); - - /** - * Dispatch a message - * - * @param string $hook Hook name - * @param array $parameters Parameters to pass to callbacks - * @return boolean Successfulness - */ - public function dispatch($hook, $parameters = array()); -} \ No newline at end of file diff --git a/wp/wp-includes/Requests/Hooks.php b/wp/wp-includes/Requests/Hooks.php deleted file mode 100644 index 2e61c734..00000000 --- a/wp/wp-includes/Requests/Hooks.php +++ /dev/null @@ -1,68 +0,0 @@ -0 is executed later - */ - public function register($hook, $callback, $priority = 0) { - if (!isset($this->hooks[$hook])) { - $this->hooks[$hook] = array(); - } - if (!isset($this->hooks[$hook][$priority])) { - $this->hooks[$hook][$priority] = array(); - } - - $this->hooks[$hook][$priority][] = $callback; - } - - /** - * Dispatch a message - * - * @param string $hook Hook name - * @param array $parameters Parameters to pass to callbacks - * @return boolean Successfulness - */ - public function dispatch($hook, $parameters = array()) { - if (empty($this->hooks[$hook])) { - return false; - } - - foreach ($this->hooks[$hook] as $priority => $hooked) { - foreach ($hooked as $callback) { - call_user_func_array($callback, $parameters); - } - } - - return true; - } -} \ No newline at end of file diff --git a/wp/wp-includes/Requests/IDNAEncoder.php b/wp/wp-includes/Requests/IDNAEncoder.php deleted file mode 100644 index ebbe2111..00000000 --- a/wp/wp-includes/Requests/IDNAEncoder.php +++ /dev/null @@ -1,388 +0,0 @@ - 0) { - if ($position + $length > $strlen) { - throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); - } - for ($position++; $remaining > 0; $position++) { - $value = ord($input[$position]); - - // If it is invalid, count the sequence as invalid and reprocess the current byte: - if (($value & 0xC0) !== 0x80) { - throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); - } - - $character |= ($value & 0x3F) << (--$remaining * 6); - } - $position--; - } - - if ( - // Non-shortest form sequences are invalid - $length > 1 && $character <= 0x7F - || $length > 2 && $character <= 0x7FF - || $length > 3 && $character <= 0xFFFF - // Outside of range of ucschar codepoints - // Noncharacters - || ($character & 0xFFFE) === 0xFFFE - || $character >= 0xFDD0 && $character <= 0xFDEF - || ( - // Everything else not in ucschar - $character > 0xD7FF && $character < 0xF900 - || $character < 0x20 - || $character > 0x7E && $character < 0xA0 - || $character > 0xEFFFD - ) - ) { - throw new Requests_Exception('Invalid Unicode codepoint', 'idna.invalidcodepoint', $character); - } - - $codepoints[] = $character; - } - - return $codepoints; - } - - /** - * RFC3492-compliant encoder - * - * @internal Pseudo-code from Section 6.3 is commented with "#" next to relevant code - * @throws Requests_Exception On character outside of the domain (never happens with Punycode) (`idna.character_outside_domain`) - * - * @param string $input UTF-8 encoded string to encode - * @return string Punycode-encoded string - */ - public static function punycode_encode($input) { - $output = ''; -# let n = initial_n - $n = self::BOOTSTRAP_INITIAL_N; -# let delta = 0 - $delta = 0; -# let bias = initial_bias - $bias = self::BOOTSTRAP_INITIAL_BIAS; -# let h = b = the number of basic code points in the input - $h = $b = 0; // see loop -# copy them to the output in order - $codepoints = self::utf8_to_codepoints($input); - $extended = array(); - - foreach ($codepoints as $char) { - if ($char < 128) { - // Character is valid ASCII - // TODO: this should also check if it's valid for a URL - $output .= chr($char); - $h++; - } - // Check if the character is non-ASCII, but below initial n - // This never occurs for Punycode, so ignore in coverage - // @codeCoverageIgnoreStart - elseif ($char < $n) { - throw new Requests_Exception('Invalid character', 'idna.character_outside_domain', $char); - } - // @codeCoverageIgnoreEnd - else { - $extended[$char] = true; - } - } - $extended = array_keys($extended); - sort($extended); - $b = $h; -# [copy them] followed by a delimiter if b > 0 - if (strlen($output) > 0) { - $output .= '-'; - } -# {if the input contains a non-basic code point < n then fail} -# while h < length(input) do begin - while ($h < count($codepoints)) { -# let m = the minimum code point >= n in the input - $m = array_shift($extended); - //printf('next code point to insert is %s' . PHP_EOL, dechex($m)); -# let delta = delta + (m - n) * (h + 1), fail on overflow - $delta += ($m - $n) * ($h + 1); -# let n = m - $n = $m; -# for each code point c in the input (in order) do begin - for ($num = 0; $num < count($codepoints); $num++) { - $c = $codepoints[$num]; -# if c < n then increment delta, fail on overflow - if ($c < $n) { - $delta++; - } -# if c == n then begin - elseif ($c === $n) { -# let q = delta - $q = $delta; -# for k = base to infinity in steps of base do begin - for ($k = self::BOOTSTRAP_BASE; ; $k += self::BOOTSTRAP_BASE) { -# let t = tmin if k <= bias {+ tmin}, or -# tmax if k >= bias + tmax, or k - bias otherwise - if ($k <= ($bias + self::BOOTSTRAP_TMIN)) { - $t = self::BOOTSTRAP_TMIN; - } - elseif ($k >= ($bias + self::BOOTSTRAP_TMAX)) { - $t = self::BOOTSTRAP_TMAX; - } - else { - $t = $k - $bias; - } -# if q < t then break - if ($q < $t) { - break; - } -# output the code point for digit t + ((q - t) mod (base - t)) - $digit = $t + (($q - $t) % (self::BOOTSTRAP_BASE - $t)); - $output .= self::digit_to_char($digit); -# let q = (q - t) div (base - t) - $q = floor(($q - $t) / (self::BOOTSTRAP_BASE - $t)); -# end - } -# output the code point for digit q - $output .= self::digit_to_char($q); -# let bias = adapt(delta, h + 1, test h equals b?) - $bias = self::adapt($delta, $h + 1, $h === $b); -# let delta = 0 - $delta = 0; -# increment h - $h++; -# end - } -# end - } -# increment delta and n - $delta++; - $n++; -# end - } - - return $output; - } - - /** - * Convert a digit to its respective character - * - * @see https://tools.ietf.org/html/rfc3492#section-5 - * @throws Requests_Exception On invalid digit (`idna.invalid_digit`) - * - * @param int $digit Digit in the range 0-35 - * @return string Single character corresponding to digit - */ - protected static function digit_to_char($digit) { - // @codeCoverageIgnoreStart - // As far as I know, this never happens, but still good to be sure. - if ($digit < 0 || $digit > 35) { - throw new Requests_Exception(sprintf('Invalid digit %d', $digit), 'idna.invalid_digit', $digit); - } - // @codeCoverageIgnoreEnd - $digits = 'abcdefghijklmnopqrstuvwxyz0123456789'; - return substr($digits, $digit, 1); - } - - /** - * Adapt the bias - * - * @see https://tools.ietf.org/html/rfc3492#section-6.1 - * @param int $delta - * @param int $numpoints - * @param bool $firsttime - * @return int New bias - */ - protected static function adapt($delta, $numpoints, $firsttime) { -# function adapt(delta,numpoints,firsttime): -# if firsttime then let delta = delta div damp - if ($firsttime) { - $delta = floor($delta / self::BOOTSTRAP_DAMP); - } -# else let delta = delta div 2 - else { - $delta = floor($delta / 2); - } -# let delta = delta + (delta div numpoints) - $delta += floor($delta / $numpoints); -# let k = 0 - $k = 0; -# while delta > ((base - tmin) * tmax) div 2 do begin - $max = floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN) * self::BOOTSTRAP_TMAX) / 2); - while ($delta > $max) { -# let delta = delta div (base - tmin) - $delta = floor($delta / (self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN)); -# let k = k + base - $k += self::BOOTSTRAP_BASE; -# end - } -# return k + (((base - tmin + 1) * delta) div (delta + skew)) - return $k + floor(((self::BOOTSTRAP_BASE - self::BOOTSTRAP_TMIN + 1) * $delta) / ($delta + self::BOOTSTRAP_SKEW)); - } -} \ No newline at end of file diff --git a/wp/wp-includes/Requests/IPv6.php b/wp/wp-includes/Requests/IPv6.php deleted file mode 100644 index 204dbd7e..00000000 --- a/wp/wp-includes/Requests/IPv6.php +++ /dev/null @@ -1,190 +0,0 @@ - FF01:0:0:0:0:0:0:101 - * ::1 -> 0:0:0:0:0:0:0:1 - * - * @author Alexander Merz - * @author elfrink at introweb dot nl - * @author Josh Peck - * @copyright 2003-2005 The PHP Group - * @license http://www.opensource.org/licenses/bsd-license.php - * @param string $ip An IPv6 address - * @return string The uncompressed IPv6 address - */ - public static function uncompress($ip) { - if (substr_count($ip, '::') !== 1) { - return $ip; - } - - list($ip1, $ip2) = explode('::', $ip); - $c1 = ($ip1 === '') ? -1 : substr_count($ip1, ':'); - $c2 = ($ip2 === '') ? -1 : substr_count($ip2, ':'); - - if (strpos($ip2, '.') !== false) { - $c2++; - } - // :: - if ($c1 === -1 && $c2 === -1) { - $ip = '0:0:0:0:0:0:0:0'; - } - // ::xxx - else if ($c1 === -1) { - $fill = str_repeat('0:', 7 - $c2); - $ip = str_replace('::', $fill, $ip); - } - // xxx:: - else if ($c2 === -1) { - $fill = str_repeat(':0', 7 - $c1); - $ip = str_replace('::', $fill, $ip); - } - // xxx::xxx - else { - $fill = ':' . str_repeat('0:', 6 - $c2 - $c1); - $ip = str_replace('::', $fill, $ip); - } - return $ip; - } - - /** - * Compresses an IPv6 address - * - * RFC 4291 allows you to compress consecutive zero pieces in an address to - * '::'. This method expects a valid IPv6 address and compresses consecutive - * zero pieces to '::'. - * - * Example: FF01:0:0:0:0:0:0:101 -> FF01::101 - * 0:0:0:0:0:0:0:1 -> ::1 - * - * @see uncompress() - * @param string $ip An IPv6 address - * @return string The compressed IPv6 address - */ - public static function compress($ip) { - // Prepare the IP to be compressed - $ip = self::uncompress($ip); - $ip_parts = self::split_v6_v4($ip); - - // Replace all leading zeros - $ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]); - - // Find bunches of zeros - if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE)) { - $max = 0; - $pos = null; - foreach ($matches[0] as $match) { - if (strlen($match[0]) > $max) { - $max = strlen($match[0]); - $pos = $match[1]; - } - } - - $ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max); - } - - if ($ip_parts[1] !== '') { - return implode(':', $ip_parts); - } - else { - return $ip_parts[0]; - } - } - - /** - * Splits an IPv6 address into the IPv6 and IPv4 representation parts - * - * RFC 4291 allows you to represent the last two parts of an IPv6 address - * using the standard IPv4 representation - * - * Example: 0:0:0:0:0:0:13.1.68.3 - * 0:0:0:0:0:FFFF:129.144.52.38 - * - * @param string $ip An IPv6 address - * @return string[] [0] contains the IPv6 represented part, and [1] the IPv4 represented part - */ - protected static function split_v6_v4($ip) { - if (strpos($ip, '.') !== false) { - $pos = strrpos($ip, ':'); - $ipv6_part = substr($ip, 0, $pos); - $ipv4_part = substr($ip, $pos + 1); - return array($ipv6_part, $ipv4_part); - } - else { - return array($ip, ''); - } - } - - /** - * Checks an IPv6 address - * - * Checks if the given IP is a valid IPv6 address - * - * @param string $ip An IPv6 address - * @return bool true if $ip is a valid IPv6 address - */ - public static function check_ipv6($ip) { - $ip = self::uncompress($ip); - list($ipv6, $ipv4) = self::split_v6_v4($ip); - $ipv6 = explode(':', $ipv6); - $ipv4 = explode('.', $ipv4); - if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4) { - foreach ($ipv6 as $ipv6_part) { - // The section can't be empty - if ($ipv6_part === '') { - return false; - } - - // Nor can it be over four characters - if (strlen($ipv6_part) > 4) { - return false; - } - - // Remove leading zeros (this is safe because of the above) - $ipv6_part = ltrim($ipv6_part, '0'); - if ($ipv6_part === '') { - $ipv6_part = '0'; - } - - // Check the value is valid - $value = hexdec($ipv6_part); - if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF) { - return false; - } - } - if (count($ipv4) === 4) { - foreach ($ipv4 as $ipv4_part) { - $value = (int) $ipv4_part; - if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF) { - return false; - } - } - } - return true; - } - else { - return false; - } - } -} diff --git a/wp/wp-includes/Requests/IRI.php b/wp/wp-includes/Requests/IRI.php deleted file mode 100644 index 8dc2fa28..00000000 --- a/wp/wp-includes/Requests/IRI.php +++ /dev/null @@ -1,1084 +0,0 @@ - array( - 'port' => 674 - ), - 'dict' => array( - 'port' => 2628 - ), - 'file' => array( - 'ihost' => 'localhost' - ), - 'http' => array( - 'port' => 80, - ), - 'https' => array( - 'port' => 443, - ), - ); - - /** - * Return the entire IRI when you try and read the object as a string - * - * @return string - */ - public function __toString() { - return $this->get_iri(); - } - - /** - * Overload __set() to provide access via properties - * - * @param string $name Property name - * @param mixed $value Property value - */ - public function __set($name, $value) { - if (method_exists($this, 'set_' . $name)) { - call_user_func(array($this, 'set_' . $name), $value); - } - elseif ( - $name === 'iauthority' - || $name === 'iuserinfo' - || $name === 'ihost' - || $name === 'ipath' - || $name === 'iquery' - || $name === 'ifragment' - ) { - call_user_func(array($this, 'set_' . substr($name, 1)), $value); - } - } - - /** - * Overload __get() to provide access via properties - * - * @param string $name Property name - * @return mixed - */ - public function __get($name) { - // isset() returns false for null, we don't want to do that - // Also why we use array_key_exists below instead of isset() - $props = get_object_vars($this); - - if ( - $name === 'iri' || - $name === 'uri' || - $name === 'iauthority' || - $name === 'authority' - ) { - $method = 'get_' . $name; - $return = $this->$method(); - } - elseif (array_key_exists($name, $props)) { - $return = $this->$name; - } - // host -> ihost - elseif (($prop = 'i' . $name) && array_key_exists($prop, $props)) { - $name = $prop; - $return = $this->$prop; - } - // ischeme -> scheme - elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props)) { - $name = $prop; - $return = $this->$prop; - } - else { - trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE); - $return = null; - } - - if ($return === null && isset($this->normalization[$this->scheme][$name])) { - return $this->normalization[$this->scheme][$name]; - } - else { - return $return; - } - } - - /** - * Overload __isset() to provide access via properties - * - * @param string $name Property name - * @return bool - */ - public function __isset($name) { - return (method_exists($this, 'get_' . $name) || isset($this->$name)); - } - - /** - * Overload __unset() to provide access via properties - * - * @param string $name Property name - */ - public function __unset($name) { - if (method_exists($this, 'set_' . $name)) { - call_user_func(array($this, 'set_' . $name), ''); - } - } - - /** - * Create a new IRI object, from a specified string - * - * @param string|null $iri - */ - public function __construct($iri = null) { - $this->set_iri($iri); - } - - /** - * Create a new IRI object by resolving a relative IRI - * - * Returns false if $base is not absolute, otherwise an IRI. - * - * @param IRI|string $base (Absolute) Base IRI - * @param IRI|string $relative Relative IRI - * @return IRI|false - */ - public static function absolutize($base, $relative) { - if (!($relative instanceof Requests_IRI)) { - $relative = new Requests_IRI($relative); - } - if (!$relative->is_valid()) { - return false; - } - elseif ($relative->scheme !== null) { - return clone $relative; - } - - if (!($base instanceof Requests_IRI)) { - $base = new Requests_IRI($base); - } - if ($base->scheme === null || !$base->is_valid()) { - return false; - } - - if ($relative->get_iri() !== '') { - if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null) { - $target = clone $relative; - $target->scheme = $base->scheme; - } - else { - $target = new Requests_IRI; - $target->scheme = $base->scheme; - $target->iuserinfo = $base->iuserinfo; - $target->ihost = $base->ihost; - $target->port = $base->port; - if ($relative->ipath !== '') { - if ($relative->ipath[0] === '/') { - $target->ipath = $relative->ipath; - } - elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '') { - $target->ipath = '/' . $relative->ipath; - } - elseif (($last_segment = strrpos($base->ipath, '/')) !== false) { - $target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath; - } - else { - $target->ipath = $relative->ipath; - } - $target->ipath = $target->remove_dot_segments($target->ipath); - $target->iquery = $relative->iquery; - } - else { - $target->ipath = $base->ipath; - if ($relative->iquery !== null) { - $target->iquery = $relative->iquery; - } - elseif ($base->iquery !== null) { - $target->iquery = $base->iquery; - } - } - $target->ifragment = $relative->ifragment; - } - } - else { - $target = clone $base; - $target->ifragment = null; - } - $target->scheme_normalization(); - return $target; - } - - /** - * Parse an IRI into scheme/authority/path/query/fragment segments - * - * @param string $iri - * @return array - */ - protected function parse_iri($iri) { - $iri = trim($iri, "\x20\x09\x0A\x0C\x0D"); - $has_match = preg_match('/^((?P[^:\/?#]+):)?(\/\/(?P[^\/?#]*))?(?P[^?#]*)(\?(?P[^#]*))?(#(?P.*))?$/', $iri, $match); - if (!$has_match) { - throw new Requests_Exception('Cannot parse supplied IRI', 'iri.cannot_parse', $iri); - } - - if ($match[1] === '') { - $match['scheme'] = null; - } - if (!isset($match[3]) || $match[3] === '') { - $match['authority'] = null; - } - if (!isset($match[5])) { - $match['path'] = ''; - } - if (!isset($match[6]) || $match[6] === '') { - $match['query'] = null; - } - if (!isset($match[8]) || $match[8] === '') { - $match['fragment'] = null; - } - return $match; - } - - /** - * Remove dot segments from a path - * - * @param string $input - * @return string - */ - protected function remove_dot_segments($input) { - $output = ''; - while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') { - // A: If the input buffer begins with a prefix of "../" or "./", - // then remove that prefix from the input buffer; otherwise, - if (strpos($input, '../') === 0) { - $input = substr($input, 3); - } - elseif (strpos($input, './') === 0) { - $input = substr($input, 2); - } - // B: if the input buffer begins with a prefix of "/./" or "/.", - // where "." is a complete path segment, then replace that prefix - // with "/" in the input buffer; otherwise, - elseif (strpos($input, '/./') === 0) { - $input = substr($input, 2); - } - elseif ($input === '/.') { - $input = '/'; - } - // C: if the input buffer begins with a prefix of "/../" or "/..", - // where ".." is a complete path segment, then replace that prefix - // with "/" in the input buffer and remove the last segment and its - // preceding "/" (if any) from the output buffer; otherwise, - elseif (strpos($input, '/../') === 0) { - $input = substr($input, 3); - $output = substr_replace($output, '', strrpos($output, '/')); - } - elseif ($input === '/..') { - $input = '/'; - $output = substr_replace($output, '', strrpos($output, '/')); - } - // D: if the input buffer consists only of "." or "..", then remove - // that from the input buffer; otherwise, - elseif ($input === '.' || $input === '..') { - $input = ''; - } - // E: move the first path segment in the input buffer to the end of - // the output buffer, including the initial "/" character (if any) - // and any subsequent characters up to, but not including, the next - // "/" character or the end of the input buffer - elseif (($pos = strpos($input, '/', 1)) !== false) { - $output .= substr($input, 0, $pos); - $input = substr_replace($input, '', 0, $pos); - } - else { - $output .= $input; - $input = ''; - } - } - return $output . $input; - } - - /** - * Replace invalid character with percent encoding - * - * @param string $string Input string - * @param string $extra_chars Valid characters not in iunreserved or - * iprivate (this is ASCII-only) - * @param bool $iprivate Allow iprivate - * @return string - */ - protected function replace_invalid_with_pct_encoding($string, $extra_chars, $iprivate = false) { - // Normalize as many pct-encoded sections as possible - $string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array(&$this, 'remove_iunreserved_percent_encoded'), $string); - - // Replace invalid percent characters - $string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string); - - // Add unreserved and % to $extra_chars (the latter is safe because all - // pct-encoded sections are now valid). - $extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%'; - - // Now replace any bytes that aren't allowed with their pct-encoded versions - $position = 0; - $strlen = strlen($string); - while (($position += strspn($string, $extra_chars, $position)) < $strlen) { - $value = ord($string[$position]); - - // Start position - $start = $position; - - // By default we are valid - $valid = true; - - // No one byte sequences are valid due to the while. - // Two byte sequence: - if (($value & 0xE0) === 0xC0) { - $character = ($value & 0x1F) << 6; - $length = 2; - $remaining = 1; - } - // Three byte sequence: - elseif (($value & 0xF0) === 0xE0) { - $character = ($value & 0x0F) << 12; - $length = 3; - $remaining = 2; - } - // Four byte sequence: - elseif (($value & 0xF8) === 0xF0) { - $character = ($value & 0x07) << 18; - $length = 4; - $remaining = 3; - } - // Invalid byte: - else { - $valid = false; - $length = 1; - $remaining = 0; - } - - if ($remaining) { - if ($position + $length <= $strlen) { - for ($position++; $remaining; $position++) { - $value = ord($string[$position]); - - // Check that the byte is valid, then add it to the character: - if (($value & 0xC0) === 0x80) { - $character |= ($value & 0x3F) << (--$remaining * 6); - } - // If it is invalid, count the sequence as invalid and reprocess the current byte: - else { - $valid = false; - $position--; - break; - } - } - } - else { - $position = $strlen - 1; - $valid = false; - } - } - - // Percent encode anything invalid or not in ucschar - if ( - // Invalid sequences - !$valid - // Non-shortest form sequences are invalid - || $length > 1 && $character <= 0x7F - || $length > 2 && $character <= 0x7FF - || $length > 3 && $character <= 0xFFFF - // Outside of range of ucschar codepoints - // Noncharacters - || ($character & 0xFFFE) === 0xFFFE - || $character >= 0xFDD0 && $character <= 0xFDEF - || ( - // Everything else not in ucschar - $character > 0xD7FF && $character < 0xF900 - || $character < 0xA0 - || $character > 0xEFFFD - ) - && ( - // Everything not in iprivate, if it applies - !$iprivate - || $character < 0xE000 - || $character > 0x10FFFD - ) - ) { - // If we were a character, pretend we weren't, but rather an error. - if ($valid) { - $position--; - } - - for ($j = $start; $j <= $position; $j++) { - $string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1); - $j += 2; - $position += 2; - $strlen += 2; - } - } - } - - return $string; - } - - /** - * Callback function for preg_replace_callback. - * - * Removes sequences of percent encoded bytes that represent UTF-8 - * encoded characters in iunreserved - * - * @param array $match PCRE match - * @return string Replacement - */ - protected function remove_iunreserved_percent_encoded($match) { - // As we just have valid percent encoded sequences we can just explode - // and ignore the first member of the returned array (an empty string). - $bytes = explode('%', $match[0]); - - // Initialize the new string (this is what will be returned) and that - // there are no bytes remaining in the current sequence (unsurprising - // at the first byte!). - $string = ''; - $remaining = 0; - - // Loop over each and every byte, and set $value to its value - for ($i = 1, $len = count($bytes); $i < $len; $i++) { - $value = hexdec($bytes[$i]); - - // If we're the first byte of sequence: - if (!$remaining) { - // Start position - $start = $i; - - // By default we are valid - $valid = true; - - // One byte sequence: - if ($value <= 0x7F) { - $character = $value; - $length = 1; - } - // Two byte sequence: - elseif (($value & 0xE0) === 0xC0) { - $character = ($value & 0x1F) << 6; - $length = 2; - $remaining = 1; - } - // Three byte sequence: - elseif (($value & 0xF0) === 0xE0) { - $character = ($value & 0x0F) << 12; - $length = 3; - $remaining = 2; - } - // Four byte sequence: - elseif (($value & 0xF8) === 0xF0) { - $character = ($value & 0x07) << 18; - $length = 4; - $remaining = 3; - } - // Invalid byte: - else { - $valid = false; - $remaining = 0; - } - } - // Continuation byte: - else { - // Check that the byte is valid, then add it to the character: - if (($value & 0xC0) === 0x80) { - $remaining--; - $character |= ($value & 0x3F) << ($remaining * 6); - } - // If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence: - else { - $valid = false; - $remaining = 0; - $i--; - } - } - - // If we've reached the end of the current byte sequence, append it to Unicode::$data - if (!$remaining) { - // Percent encode anything invalid or not in iunreserved - if ( - // Invalid sequences - !$valid - // Non-shortest form sequences are invalid - || $length > 1 && $character <= 0x7F - || $length > 2 && $character <= 0x7FF - || $length > 3 && $character <= 0xFFFF - // Outside of range of iunreserved codepoints - || $character < 0x2D - || $character > 0xEFFFD - // Noncharacters - || ($character & 0xFFFE) === 0xFFFE - || $character >= 0xFDD0 && $character <= 0xFDEF - // Everything else not in iunreserved (this is all BMP) - || $character === 0x2F - || $character > 0x39 && $character < 0x41 - || $character > 0x5A && $character < 0x61 - || $character > 0x7A && $character < 0x7E - || $character > 0x7E && $character < 0xA0 - || $character > 0xD7FF && $character < 0xF900 - ) { - for ($j = $start; $j <= $i; $j++) { - $string .= '%' . strtoupper($bytes[$j]); - } - } - else { - for ($j = $start; $j <= $i; $j++) { - $string .= chr(hexdec($bytes[$j])); - } - } - } - } - - // If we have any bytes left over they are invalid (i.e., we are - // mid-way through a multi-byte sequence) - if ($remaining) { - for ($j = $start; $j < $len; $j++) { - $string .= '%' . strtoupper($bytes[$j]); - } - } - - return $string; - } - - protected function scheme_normalization() { - if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo']) { - $this->iuserinfo = null; - } - if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost']) { - $this->ihost = null; - } - if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port']) { - $this->port = null; - } - if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath']) { - $this->ipath = ''; - } - if (isset($this->ihost) && empty($this->ipath)) { - $this->ipath = '/'; - } - if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery']) { - $this->iquery = null; - } - if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment']) { - $this->ifragment = null; - } - } - - /** - * Check if the object represents a valid IRI. This needs to be done on each - * call as some things change depending on another part of the IRI. - * - * @return bool - */ - public function is_valid() { - $isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null; - if ($this->ipath !== '' && - ( - $isauthority && $this->ipath[0] !== '/' || - ( - $this->scheme === null && - !$isauthority && - strpos($this->ipath, ':') !== false && - (strpos($this->ipath, '/') === false ? true : strpos($this->ipath, ':') < strpos($this->ipath, '/')) - ) - ) - ) { - return false; - } - - return true; - } - - /** - * Set the entire IRI. Returns true on success, false on failure (if there - * are any invalid characters). - * - * @param string $iri - * @return bool - */ - protected function set_iri($iri) { - static $cache; - if (!$cache) { - $cache = array(); - } - - if ($iri === null) { - return true; - } - if (isset($cache[$iri])) { - list($this->scheme, - $this->iuserinfo, - $this->ihost, - $this->port, - $this->ipath, - $this->iquery, - $this->ifragment, - $return) = $cache[$iri]; - return $return; - } - - $parsed = $this->parse_iri((string) $iri); - - $return = $this->set_scheme($parsed['scheme']) - && $this->set_authority($parsed['authority']) - && $this->set_path($parsed['path']) - && $this->set_query($parsed['query']) - && $this->set_fragment($parsed['fragment']); - - $cache[$iri] = array($this->scheme, - $this->iuserinfo, - $this->ihost, - $this->port, - $this->ipath, - $this->iquery, - $this->ifragment, - $return); - return $return; - } - - /** - * Set the scheme. Returns true on success, false on failure (if there are - * any invalid characters). - * - * @param string $scheme - * @return bool - */ - protected function set_scheme($scheme) { - if ($scheme === null) { - $this->scheme = null; - } - elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme)) { - $this->scheme = null; - return false; - } - else { - $this->scheme = strtolower($scheme); - } - return true; - } - - /** - * Set the authority. Returns true on success, false on failure (if there are - * any invalid characters). - * - * @param string $authority - * @return bool - */ - protected function set_authority($authority) { - static $cache; - if (!$cache) { - $cache = array(); - } - - if ($authority === null) { - $this->iuserinfo = null; - $this->ihost = null; - $this->port = null; - return true; - } - if (isset($cache[$authority])) { - list($this->iuserinfo, - $this->ihost, - $this->port, - $return) = $cache[$authority]; - - return $return; - } - - $remaining = $authority; - if (($iuserinfo_end = strrpos($remaining, '@')) !== false) { - $iuserinfo = substr($remaining, 0, $iuserinfo_end); - $remaining = substr($remaining, $iuserinfo_end + 1); - } - else { - $iuserinfo = null; - } - if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false) { - $port = substr($remaining, $port_start + 1); - if ($port === false || $port === '') { - $port = null; - } - $remaining = substr($remaining, 0, $port_start); - } - else { - $port = null; - } - - $return = $this->set_userinfo($iuserinfo) && - $this->set_host($remaining) && - $this->set_port($port); - - $cache[$authority] = array($this->iuserinfo, - $this->ihost, - $this->port, - $return); - - return $return; - } - - /** - * Set the iuserinfo. - * - * @param string $iuserinfo - * @return bool - */ - protected function set_userinfo($iuserinfo) { - if ($iuserinfo === null) { - $this->iuserinfo = null; - } - else { - $this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:'); - $this->scheme_normalization(); - } - - return true; - } - - /** - * Set the ihost. Returns true on success, false on failure (if there are - * any invalid characters). - * - * @param string $ihost - * @return bool - */ - protected function set_host($ihost) { - if ($ihost === null) { - $this->ihost = null; - return true; - } - if (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']') { - if (Requests_IPv6::check_ipv6(substr($ihost, 1, -1))) { - $this->ihost = '[' . Requests_IPv6::compress(substr($ihost, 1, -1)) . ']'; - } - else { - $this->ihost = null; - return false; - } - } - else { - $ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;='); - - // Lowercase, but ignore pct-encoded sections (as they should - // remain uppercase). This must be done after the previous step - // as that can add unescaped characters. - $position = 0; - $strlen = strlen($ihost); - while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen) { - if ($ihost[$position] === '%') { - $position += 3; - } - else { - $ihost[$position] = strtolower($ihost[$position]); - $position++; - } - } - - $this->ihost = $ihost; - } - - $this->scheme_normalization(); - - return true; - } - - /** - * Set the port. Returns true on success, false on failure (if there are - * any invalid characters). - * - * @param string $port - * @return bool - */ - protected function set_port($port) { - if ($port === null) { - $this->port = null; - return true; - } - - if (strspn($port, '0123456789') === strlen($port)) { - $this->port = (int) $port; - $this->scheme_normalization(); - return true; - } - - $this->port = null; - return false; - } - - /** - * Set the ipath. - * - * @param string $ipath - * @return bool - */ - protected function set_path($ipath) { - static $cache; - if (!$cache) { - $cache = array(); - } - - $ipath = (string) $ipath; - - if (isset($cache[$ipath])) { - $this->ipath = $cache[$ipath][(int) ($this->scheme !== null)]; - } - else { - $valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/'); - $removed = $this->remove_dot_segments($valid); - - $cache[$ipath] = array($valid, $removed); - $this->ipath = ($this->scheme !== null) ? $removed : $valid; - } - $this->scheme_normalization(); - return true; - } - - /** - * Set the iquery. - * - * @param string $iquery - * @return bool - */ - protected function set_query($iquery) { - if ($iquery === null) { - $this->iquery = null; - } - else { - $this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true); - $this->scheme_normalization(); - } - return true; - } - - /** - * Set the ifragment. - * - * @param string $ifragment - * @return bool - */ - protected function set_fragment($ifragment) { - if ($ifragment === null) { - $this->ifragment = null; - } - else { - $this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?'); - $this->scheme_normalization(); - } - return true; - } - - /** - * Convert an IRI to a URI (or parts thereof) - * - * @param string|bool IRI to convert (or false from {@see get_iri}) - * @return string|false URI if IRI is valid, false otherwise. - */ - protected function to_uri($string) { - if (!is_string($string)) { - return false; - } - - static $non_ascii; - if (!$non_ascii) { - $non_ascii = implode('', range("\x80", "\xFF")); - } - - $position = 0; - $strlen = strlen($string); - while (($position += strcspn($string, $non_ascii, $position)) < $strlen) { - $string = substr_replace($string, sprintf('%%%02X', ord($string[$position])), $position, 1); - $position += 3; - $strlen += 2; - } - - return $string; - } - - /** - * Get the complete IRI - * - * @return string - */ - protected function get_iri() { - if (!$this->is_valid()) { - return false; - } - - $iri = ''; - if ($this->scheme !== null) { - $iri .= $this->scheme . ':'; - } - if (($iauthority = $this->get_iauthority()) !== null) { - $iri .= '//' . $iauthority; - } - $iri .= $this->ipath; - if ($this->iquery !== null) { - $iri .= '?' . $this->iquery; - } - if ($this->ifragment !== null) { - $iri .= '#' . $this->ifragment; - } - - return $iri; - } - - /** - * Get the complete URI - * - * @return string - */ - protected function get_uri() { - return $this->to_uri($this->get_iri()); - } - - /** - * Get the complete iauthority - * - * @return string - */ - protected function get_iauthority() { - if ($this->iuserinfo === null && $this->ihost === null && $this->port === null) { - return null; - } - - $iauthority = ''; - if ($this->iuserinfo !== null) { - $iauthority .= $this->iuserinfo . '@'; - } - if ($this->ihost !== null) { - $iauthority .= $this->ihost; - } - if ($this->port !== null) { - $iauthority .= ':' . $this->port; - } - return $iauthority; - } - - /** - * Get the complete authority - * - * @return string - */ - protected function get_authority() { - $iauthority = $this->get_iauthority(); - if (is_string($iauthority)) { - return $this->to_uri($iauthority); - } - else { - return $iauthority; - } - } -} diff --git a/wp/wp-includes/Requests/Proxy.php b/wp/wp-includes/Requests/Proxy.php deleted file mode 100644 index ac7c1d6b..00000000 --- a/wp/wp-includes/Requests/Proxy.php +++ /dev/null @@ -1,35 +0,0 @@ -proxy = $args; - } - elseif (is_array($args)) { - if (count($args) == 1) { - list($this->proxy) = $args; - } - elseif (count($args) == 3) { - list($this->proxy, $this->user, $this->pass) = $args; - $this->use_authentication = true; - } - else { - throw new Requests_Exception('Invalid number of arguments', 'proxyhttpbadargs'); - } - } - } - - /** - * Register the necessary callbacks - * - * @since 1.6 - * @see curl_before_send - * @see fsockopen_remote_socket - * @see fsockopen_remote_host_path - * @see fsockopen_header - * @param Requests_Hooks $hooks Hook system - */ - public function register(Requests_Hooks &$hooks) { - $hooks->register('curl.before_send', array(&$this, 'curl_before_send')); - - $hooks->register('fsockopen.remote_socket', array(&$this, 'fsockopen_remote_socket')); - $hooks->register('fsockopen.remote_host_path', array(&$this, 'fsockopen_remote_host_path')); - if ($this->use_authentication) { - $hooks->register('fsockopen.after_headers', array(&$this, 'fsockopen_header')); - } - } - - /** - * Set cURL parameters before the data is sent - * - * @since 1.6 - * @param resource $handle cURL resource - */ - public function curl_before_send(&$handle) { - curl_setopt($handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); - curl_setopt($handle, CURLOPT_PROXY, $this->proxy); - - if ($this->use_authentication) { - curl_setopt($handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY); - curl_setopt($handle, CURLOPT_PROXYUSERPWD, $this->get_auth_string()); - } - } - - /** - * Alter remote socket information before opening socket connection - * - * @since 1.6 - * @param string $remote_socket Socket connection string - */ - public function fsockopen_remote_socket(&$remote_socket) { - $remote_socket = $this->proxy; - } - - /** - * Alter remote path before getting stream data - * - * @since 1.6 - * @param string $path Path to send in HTTP request string ("GET ...") - * @param string $url Full URL we're requesting - */ - public function fsockopen_remote_host_path(&$path, $url) { - $path = $url; - } - - /** - * Add extra headers to the request before sending - * - * @since 1.6 - * @param string $out HTTP header string - */ - public function fsockopen_header(&$out) { - $out .= sprintf("Proxy-Authorization: Basic %s\r\n", base64_encode($this->get_auth_string())); - } - - /** - * Get the authentication string (user:pass) - * - * @since 1.6 - * @return string - */ - public function get_auth_string() { - return $this->user . ':' . $this->pass; - } -} \ No newline at end of file diff --git a/wp/wp-includes/Requests/Response.php b/wp/wp-includes/Requests/Response.php deleted file mode 100644 index 3152fb6d..00000000 --- a/wp/wp-includes/Requests/Response.php +++ /dev/null @@ -1,121 +0,0 @@ -headers = new Requests_Response_Headers(); - $this->cookies = new Requests_Cookie_Jar(); - } - - /** - * Response body - * - * @var string - */ - public $body = ''; - - /** - * Raw HTTP data from the transport - * - * @var string - */ - public $raw = ''; - - /** - * Headers, as an associative array - * - * @var Requests_Response_Headers Array-like object representing headers - */ - public $headers = array(); - - /** - * Status code, false if non-blocking - * - * @var integer|boolean - */ - public $status_code = false; - - /** - * Protocol version, false if non-blocking - * @var float|boolean - */ - public $protocol_version = false; - - /** - * Whether the request succeeded or not - * - * @var boolean - */ - public $success = false; - - /** - * Number of redirects the request used - * - * @var integer - */ - public $redirects = 0; - - /** - * URL requested - * - * @var string - */ - public $url = ''; - - /** - * Previous requests (from redirects) - * - * @var array Array of Requests_Response objects - */ - public $history = array(); - - /** - * Cookies from the request - * - * @var Requests_Cookie_Jar Array-like object representing a cookie jar - */ - public $cookies = array(); - - /** - * Is the response a redirect? - * - * @return boolean True if redirect (3xx status), false if not. - */ - public function is_redirect() { - $code = $this->status_code; - return in_array($code, array(300, 301, 302, 303, 307)) || $code > 307 && $code < 400; - } - - /** - * Throws an exception if the request was not successful - * - * @throws Requests_Exception If `$allow_redirects` is false, and code is 3xx (`response.no_redirects`) - * @throws Requests_Exception_HTTP On non-successful status code. Exception class corresponds to code (e.g. {@see Requests_Exception_HTTP_404}) - * @param boolean $allow_redirects Set to false to throw on a 3xx as well - */ - public function throw_for_status($allow_redirects = true) { - if ($this->is_redirect()) { - if (!$allow_redirects) { - throw new Requests_Exception('Redirection not allowed', 'response.no_redirects', $this); - } - } - elseif (!$this->success) { - $exception = Requests_Exception_HTTP::get_class($this->status_code); - throw new $exception(null, $this); - } - } -} diff --git a/wp/wp-includes/Requests/Response/Headers.php b/wp/wp-includes/Requests/Response/Headers.php deleted file mode 100644 index cc6a2087..00000000 --- a/wp/wp-includes/Requests/Response/Headers.php +++ /dev/null @@ -1,98 +0,0 @@ -data[$key])) { - return null; - } - - return $this->flatten($this->data[$key]); - } - - /** - * Set the given item - * - * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`) - * - * @param string $key Item name - * @param string $value Item value - */ - public function offsetSet($key, $value) { - if ($key === null) { - throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset'); - } - - $key = strtolower($key); - - if (!isset($this->data[$key])) { - $this->data[$key] = array(); - } - - $this->data[$key][] = $value; - } - - /** - * Get all values for a given header - * - * @param string $key - * @return array Header values - */ - public function getValues($key) { - $key = strtolower($key); - if (!isset($this->data[$key])) { - return null; - } - - return $this->data[$key]; - } - - /** - * Flattens a value into a string - * - * Converts an array into a string by imploding values with a comma, as per - * RFC2616's rules for folding headers. - * - * @param string|array $value Value to flatten - * @return string Flattened value - */ - public function flatten($value) { - if (is_array($value)) { - $value = implode(',', $value); - } - - return $value; - } - - /** - * Get an iterator for the data - * - * Converts the internal - * @return ArrayIterator - */ - public function getIterator() { - return new Requests_Utility_FilteredIterator($this->data, array($this, 'flatten')); - } -} diff --git a/wp/wp-includes/Requests/SSL.php b/wp/wp-includes/Requests/SSL.php deleted file mode 100644 index 2b037685..00000000 --- a/wp/wp-includes/Requests/SSL.php +++ /dev/null @@ -1,152 +0,0 @@ -useragent = 'X';` - * - * @var array - */ - public $options = array(); - - /** - * Create a new session - * - * @param string|null $url Base URL for requests - * @param array $headers Default headers for requests - * @param array $data Default data for requests - * @param array $options Default options for requests - */ - public function __construct($url = null, $headers = array(), $data = array(), $options = array()) { - $this->url = $url; - $this->headers = $headers; - $this->data = $data; - $this->options = $options; - - if (empty($this->options['cookies'])) { - $this->options['cookies'] = new Requests_Cookie_Jar(); - } - } - - /** - * Get a property's value - * - * @param string $key Property key - * @return mixed|null Property value, null if none found - */ - public function __get($key) { - if (isset($this->options[$key])) { - return $this->options[$key]; - } - - return null; - } - - /** - * Set a property's value - * - * @param string $key Property key - * @param mixed $value Property value - */ - public function __set($key, $value) { - $this->options[$key] = $value; - } - - /** - * Remove a property's value - * - * @param string $key Property key - */ - public function __isset($key) { - return isset($this->options[$key]); - } - - /** - * Remove a property's value - * - * @param string $key Property key - */ - public function __unset($key) { - if (isset($this->options[$key])) { - unset($this->options[$key]); - } - } - - /**#@+ - * @see request() - * @param string $url - * @param array $headers - * @param array $options - * @return Requests_Response - */ - /** - * Send a GET request - */ - public function get($url, $headers = array(), $options = array()) { - return $this->request($url, $headers, null, Requests::GET, $options); - } - - /** - * Send a HEAD request - */ - public function head($url, $headers = array(), $options = array()) { - return $this->request($url, $headers, null, Requests::HEAD, $options); - } - - /** - * Send a DELETE request - */ - public function delete($url, $headers = array(), $options = array()) { - return $this->request($url, $headers, null, Requests::DELETE, $options); - } - /**#@-*/ - - /**#@+ - * @see request() - * @param string $url - * @param array $headers - * @param array $data - * @param array $options - * @return Requests_Response - */ - /** - * Send a POST request - */ - public function post($url, $headers = array(), $data = array(), $options = array()) { - return $this->request($url, $headers, $data, Requests::POST, $options); - } - - /** - * Send a PUT request - */ - public function put($url, $headers = array(), $data = array(), $options = array()) { - return $this->request($url, $headers, $data, Requests::PUT, $options); - } - - /** - * Send a PATCH request - * - * Note: Unlike {@see post} and {@see put}, `$headers` is required, as the - * specification recommends that should send an ETag - * - * @link https://tools.ietf.org/html/rfc5789 - */ - public function patch($url, $headers, $data = array(), $options = array()) { - return $this->request($url, $headers, $data, Requests::PATCH, $options); - } - /**#@-*/ - - /** - * Main interface for HTTP requests - * - * This method initiates a request and sends it via a transport before - * parsing. - * - * @see Requests::request() - * - * @throws Requests_Exception On invalid URLs (`nonhttp`) - * - * @param string $url URL to request - * @param array $headers Extra headers to send with the request - * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests - * @param string $type HTTP request type (use Requests constants) - * @param array $options Options for the request (see {@see Requests::request}) - * @return Requests_Response - */ - public function request($url, $headers = array(), $data = array(), $type = Requests::GET, $options = array()) { - $request = $this->merge_request(compact('url', 'headers', 'data', 'options')); - - return Requests::request($request['url'], $request['headers'], $request['data'], $type, $request['options']); - } - - /** - * Send multiple HTTP requests simultaneously - * - * @see Requests::request_multiple() - * - * @param array $requests Requests data (see {@see Requests::request_multiple}) - * @param array $options Global and default options (see {@see Requests::request}) - * @return array Responses (either Requests_Response or a Requests_Exception object) - */ - public function request_multiple($requests, $options = array()) { - foreach ($requests as $key => $request) { - $requests[$key] = $this->merge_request($request, false); - } - - $options = array_merge($this->options, $options); - - // Disallow forcing the type, as that's a per request setting - unset($options['type']); - - return Requests::request_multiple($requests, $options); - } - - /** - * Merge a request's data with the default data - * - * @param array $request Request data (same form as {@see request_multiple}) - * @param boolean $merge_options Should we merge options as well? - * @return array Request data - */ - protected function merge_request($request, $merge_options = true) { - if ($this->url !== null) { - $request['url'] = Requests_IRI::absolutize($this->url, $request['url']); - $request['url'] = $request['url']->uri; - } - - if (empty($request['headers'])) { - $request['headers'] = array(); - } - $request['headers'] = array_merge($this->headers, $request['headers']); - - if (empty($request['data'])) { - if (is_array($this->data)) { - $request['data'] = $this->data; - } - } - elseif (is_array($request['data']) && is_array($this->data)) { - $request['data'] = array_merge($this->data, $request['data']); - } - - if ($merge_options !== false) { - $request['options'] = array_merge($this->options, $request['options']); - - // Disallow forcing the type, as that's a per request setting - unset($request['options']['type']); - } - - return $request; - } -} diff --git a/wp/wp-includes/Requests/Transport.php b/wp/wp-includes/Requests/Transport.php deleted file mode 100644 index 7e4a2629..00000000 --- a/wp/wp-includes/Requests/Transport.php +++ /dev/null @@ -1,41 +0,0 @@ -version = $curl['version_number']; - $this->handle = curl_init(); - - curl_setopt($this->handle, CURLOPT_HEADER, false); - curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1); - if ($this->version >= self::CURL_7_10_5) { - curl_setopt($this->handle, CURLOPT_ENCODING, ''); - } - if (defined('CURLOPT_PROTOCOLS')) { - curl_setopt($this->handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); - } - if (defined('CURLOPT_REDIR_PROTOCOLS')) { - curl_setopt($this->handle, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); - } - } - - /** - * Destructor - */ - public function __destruct() { - if (is_resource($this->handle)) { - curl_close($this->handle); - } - } - - /** - * Perform a request - * - * @throws Requests_Exception On a cURL error (`curlerror`) - * - * @param string $url URL to request - * @param array $headers Associative array of request headers - * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD - * @param array $options Request options, see {@see Requests::response()} for documentation - * @return string Raw HTTP result - */ - public function request($url, $headers = array(), $data = array(), $options = array()) { - $this->hooks = $options['hooks']; - - $this->setup_handle($url, $headers, $data, $options); - - $options['hooks']->dispatch('curl.before_send', array(&$this->handle)); - - if ($options['filename'] !== false) { - $this->stream_handle = fopen($options['filename'], 'wb'); - } - - $this->response_data = ''; - $this->response_bytes = 0; - $this->response_byte_limit = false; - if ($options['max_bytes'] !== false) { - $this->response_byte_limit = $options['max_bytes']; - } - - if (isset($options['verify'])) { - if ($options['verify'] === false) { - curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0); - curl_setopt($this->handle, CURLOPT_SSL_VERIFYPEER, 0); - } - elseif (is_string($options['verify'])) { - curl_setopt($this->handle, CURLOPT_CAINFO, $options['verify']); - } - } - - if (isset($options['verifyname']) && $options['verifyname'] === false) { - curl_setopt($this->handle, CURLOPT_SSL_VERIFYHOST, 0); - } - - curl_exec($this->handle); - $response = $this->response_data; - - $options['hooks']->dispatch('curl.after_send', array()); - - if (curl_errno($this->handle) === 23 || curl_errno($this->handle) === 61) { - // Reset encoding and try again - curl_setopt($this->handle, CURLOPT_ENCODING, 'none'); - - $this->response_data = ''; - $this->response_bytes = 0; - curl_exec($this->handle); - $response = $this->response_data; - } - - $this->process_response($response, $options); - - // Need to remove the $this reference from the curl handle. - // Otherwise Requests_Transport_cURL wont be garbage collected and the curl_close() will never be called. - curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, null); - curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, null); - - return $this->headers; - } - - /** - * Send multiple requests simultaneously - * - * @param array $requests Request data - * @param array $options Global options - * @return array Array of Requests_Response objects (may contain Requests_Exception or string responses as well) - */ - public function request_multiple($requests, $options) { - // If you're not requesting, we can't get any responses ¯\_(ツ)_/¯ - if (empty($requests)) { - return array(); - } - - $multihandle = curl_multi_init(); - $subrequests = array(); - $subhandles = array(); - - $class = get_class($this); - foreach ($requests as $id => $request) { - $subrequests[$id] = new $class(); - $subhandles[$id] = $subrequests[$id]->get_subrequest_handle($request['url'], $request['headers'], $request['data'], $request['options']); - $request['options']['hooks']->dispatch('curl.before_multi_add', array(&$subhandles[$id])); - curl_multi_add_handle($multihandle, $subhandles[$id]); - } - - $completed = 0; - $responses = array(); - - $request['options']['hooks']->dispatch('curl.before_multi_exec', array(&$multihandle)); - - do { - $active = false; - - do { - $status = curl_multi_exec($multihandle, $active); - } - while ($status === CURLM_CALL_MULTI_PERFORM); - - $to_process = array(); - - // Read the information as needed - while ($done = curl_multi_info_read($multihandle)) { - $key = array_search($done['handle'], $subhandles, true); - if (!isset($to_process[$key])) { - $to_process[$key] = $done; - } - } - - // Parse the finished requests before we start getting the new ones - foreach ($to_process as $key => $done) { - $options = $requests[$key]['options']; - if (CURLE_OK !== $done['result']) { - //get error string for handle. - $reason = curl_error($done['handle']); - $exception = new Requests_Exception_Transport_cURL( - $reason, - Requests_Exception_Transport_cURL::EASY, - $done['handle'], - $done['result'] - ); - $responses[$key] = $exception; - $options['hooks']->dispatch('transport.internal.parse_error', array(&$responses[$key], $requests[$key])); - } - else { - $responses[$key] = $subrequests[$key]->process_response($subrequests[$key]->response_data, $options); - - $options['hooks']->dispatch('transport.internal.parse_response', array(&$responses[$key], $requests[$key])); - } - - curl_multi_remove_handle($multihandle, $done['handle']); - curl_close($done['handle']); - - if (!is_string($responses[$key])) { - $options['hooks']->dispatch('multiple.request.complete', array(&$responses[$key], $key)); - } - $completed++; - } - } - while ($active || $completed < count($subrequests)); - - $request['options']['hooks']->dispatch('curl.after_multi_exec', array(&$multihandle)); - - curl_multi_close($multihandle); - - return $responses; - } - - /** - * Get the cURL handle for use in a multi-request - * - * @param string $url URL to request - * @param array $headers Associative array of request headers - * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD - * @param array $options Request options, see {@see Requests::response()} for documentation - * @return resource Subrequest's cURL handle - */ - public function &get_subrequest_handle($url, $headers, $data, $options) { - $this->setup_handle($url, $headers, $data, $options); - - if ($options['filename'] !== false) { - $this->stream_handle = fopen($options['filename'], 'wb'); - } - - $this->response_data = ''; - $this->response_bytes = 0; - $this->response_byte_limit = false; - if ($options['max_bytes'] !== false) { - $this->response_byte_limit = $options['max_bytes']; - } - $this->hooks = $options['hooks']; - - return $this->handle; - } - - /** - * Setup the cURL handle for the given data - * - * @param string $url URL to request - * @param array $headers Associative array of request headers - * @param string|array $data Data to send either as the POST body, or as parameters in the URL for a GET/HEAD - * @param array $options Request options, see {@see Requests::response()} for documentation - */ - protected function setup_handle($url, $headers, $data, $options) { - $options['hooks']->dispatch('curl.before_request', array(&$this->handle)); - - // Force closing the connection for old versions of cURL (<7.22). - if ( ! isset( $headers['Connection'] ) ) { - $headers['Connection'] = 'close'; - } - - $headers = Requests::flatten($headers); - - if (!empty($data)) { - $data_format = $options['data_format']; - - if ($data_format === 'query') { - $url = self::format_get($url, $data); - $data = ''; - } - elseif (!is_string($data)) { - $data = http_build_query($data, null, '&'); - } - } - - switch ($options['type']) { - case Requests::POST: - curl_setopt($this->handle, CURLOPT_POST, true); - curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data); - break; - case Requests::HEAD: - curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); - curl_setopt($this->handle, CURLOPT_NOBODY, true); - break; - case Requests::TRACE: - curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); - break; - case Requests::PATCH: - case Requests::PUT: - case Requests::DELETE: - case Requests::OPTIONS: - default: - curl_setopt($this->handle, CURLOPT_CUSTOMREQUEST, $options['type']); - if (!empty($data)) { - curl_setopt($this->handle, CURLOPT_POSTFIELDS, $data); - } - } - - // cURL requires a minimum timeout of 1 second when using the system - // DNS resolver, as it uses `alarm()`, which is second resolution only. - // There's no way to detect which DNS resolver is being used from our - // end, so we need to round up regardless of the supplied timeout. - // - // https://github.com/curl/curl/blob/4f45240bc84a9aa648c8f7243be7b79e9f9323a5/lib/hostip.c#L606-L609 - $timeout = max($options['timeout'], 1); - - if (is_int($timeout) || $this->version < self::CURL_7_16_2) { - curl_setopt($this->handle, CURLOPT_TIMEOUT, ceil($timeout)); - } - else { - curl_setopt($this->handle, CURLOPT_TIMEOUT_MS, round($timeout * 1000)); - } - - if (is_int($options['connect_timeout']) || $this->version < self::CURL_7_16_2) { - curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT, ceil($options['connect_timeout'])); - } - else { - curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT_MS, round($options['connect_timeout'] * 1000)); - } - curl_setopt($this->handle, CURLOPT_URL, $url); - curl_setopt($this->handle, CURLOPT_REFERER, $url); - curl_setopt($this->handle, CURLOPT_USERAGENT, $options['useragent']); - if (!empty($headers)) { - curl_setopt($this->handle, CURLOPT_HTTPHEADER, $headers); - } - if ($options['protocol_version'] === 1.1) { - curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - } - else { - curl_setopt($this->handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - } - - if (true === $options['blocking']) { - curl_setopt($this->handle, CURLOPT_HEADERFUNCTION, array(&$this, 'stream_headers')); - curl_setopt($this->handle, CURLOPT_WRITEFUNCTION, array(&$this, 'stream_body')); - curl_setopt($this->handle, CURLOPT_BUFFERSIZE, Requests::BUFFER_SIZE); - } - } - - /** - * Process a response - * - * @param string $response Response data from the body - * @param array $options Request options - * @return string HTTP response data including headers - */ - public function process_response($response, $options) { - if ($options['blocking'] === false) { - $fake_headers = ''; - $options['hooks']->dispatch('curl.after_request', array(&$fake_headers)); - return false; - } - if ($options['filename'] !== false) { - fclose($this->stream_handle); - $this->headers = trim($this->headers); - } - else { - $this->headers .= $response; - } - - if (curl_errno($this->handle)) { - $error = sprintf( - 'cURL error %s: %s', - curl_errno($this->handle), - curl_error($this->handle) - ); - throw new Requests_Exception($error, 'curlerror', $this->handle); - } - $this->info = curl_getinfo($this->handle); - - $options['hooks']->dispatch('curl.after_request', array(&$this->headers, &$this->info)); - return $this->headers; - } - - /** - * Collect the headers as they are received - * - * @param resource $handle cURL resource - * @param string $headers Header string - * @return integer Length of provided header - */ - public function stream_headers($handle, $headers) { - // Why do we do this? cURL will send both the final response and any - // interim responses, such as a 100 Continue. We don't need that. - // (We may want to keep this somewhere just in case) - if ($this->done_headers) { - $this->headers = ''; - $this->done_headers = false; - } - $this->headers .= $headers; - - if ($headers === "\r\n") { - $this->done_headers = true; - } - return strlen($headers); - } - - /** - * Collect data as it's received - * - * @since 1.6.1 - * - * @param resource $handle cURL resource - * @param string $data Body data - * @return integer Length of provided data - */ - public function stream_body($handle, $data) { - $this->hooks->dispatch('request.progress', array($data, $this->response_bytes, $this->response_byte_limit)); - $data_length = strlen($data); - - // Are we limiting the response size? - if ($this->response_byte_limit) { - if ($this->response_bytes === $this->response_byte_limit) { - // Already at maximum, move on - return $data_length; - } - - if (($this->response_bytes + $data_length) > $this->response_byte_limit) { - // Limit the length - $limited_length = ($this->response_byte_limit - $this->response_bytes); - $data = substr($data, 0, $limited_length); - } - } - - if ($this->stream_handle) { - fwrite($this->stream_handle, $data); - } - else { - $this->response_data .= $data; - } - - $this->response_bytes += strlen($data); - return $data_length; - } - - /** - * Format a URL given GET data - * - * @param string $url - * @param array|object $data Data to build query using, see {@see https://secure.php.net/http_build_query} - * @return string URL with data - */ - protected static function format_get($url, $data) { - if (!empty($data)) { - $url_parts = parse_url($url); - if (empty($url_parts['query'])) { - $query = $url_parts['query'] = ''; - } - else { - $query = $url_parts['query']; - } - - $query .= '&' . http_build_query($data, null, '&'); - $query = trim($query, '&'); - - if (empty($url_parts['query'])) { - $url .= '?' . $query; - } - else { - $url = str_replace($url_parts['query'], $query, $url); - } - } - return $url; - } - - /** - * Whether this transport is valid - * - * @codeCoverageIgnore - * @return boolean True if the transport is valid, false otherwise. - */ - public static function test($capabilities = array()) { - if (!function_exists('curl_init') || !function_exists('curl_exec')) { - return false; - } - - // If needed, check that our installed curl version supports SSL - if (isset($capabilities['ssl']) && $capabilities['ssl']) { - $curl_version = curl_version(); - if (!(CURL_VERSION_SSL & $curl_version['features'])) { - return false; - } - } - - return true; - } -} diff --git a/wp/wp-includes/Requests/Transport/fsockopen.php b/wp/wp-includes/Requests/Transport/fsockopen.php deleted file mode 100644 index 21cb56d5..00000000 --- a/wp/wp-includes/Requests/Transport/fsockopen.php +++ /dev/null @@ -1,444 +0,0 @@ -dispatch('fsockopen.before_request'); - - $url_parts = parse_url($url); - if (empty($url_parts)) { - throw new Requests_Exception('Invalid URL.', 'invalidurl', $url); - } - $host = $url_parts['host']; - $context = stream_context_create(); - $verifyname = false; - $case_insensitive_headers = new Requests_Utility_CaseInsensitiveDictionary($headers); - - // HTTPS support - if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') { - $remote_socket = 'ssl://' . $host; - if (!isset($url_parts['port'])) { - $url_parts['port'] = 443; - } - - $context_options = array( - 'verify_peer' => true, - // 'CN_match' => $host, - 'capture_peer_cert' => true - ); - $verifyname = true; - - // SNI, if enabled (OpenSSL >=0.9.8j) - if (defined('OPENSSL_TLSEXT_SERVER_NAME') && OPENSSL_TLSEXT_SERVER_NAME) { - $context_options['SNI_enabled'] = true; - if (isset($options['verifyname']) && $options['verifyname'] === false) { - $context_options['SNI_enabled'] = false; - } - } - - if (isset($options['verify'])) { - if ($options['verify'] === false) { - $context_options['verify_peer'] = false; - } - elseif (is_string($options['verify'])) { - $context_options['cafile'] = $options['verify']; - } - } - - if (isset($options['verifyname']) && $options['verifyname'] === false) { - $context_options['verify_peer_name'] = false; - $verifyname = false; - } - - stream_context_set_option($context, array('ssl' => $context_options)); - } - else { - $remote_socket = 'tcp://' . $host; - } - - $this->max_bytes = $options['max_bytes']; - - if (!isset($url_parts['port'])) { - $url_parts['port'] = 80; - } - $remote_socket .= ':' . $url_parts['port']; - - set_error_handler(array($this, 'connect_error_handler'), E_WARNING | E_NOTICE); - - $options['hooks']->dispatch('fsockopen.remote_socket', array(&$remote_socket)); - - $socket = stream_socket_client($remote_socket, $errno, $errstr, ceil($options['connect_timeout']), STREAM_CLIENT_CONNECT, $context); - - restore_error_handler(); - - if ($verifyname && !$this->verify_certificate_from_context($host, $context)) { - throw new Requests_Exception('SSL certificate did not match the requested domain name', 'ssl.no_match'); - } - - if (!$socket) { - if ($errno === 0) { - // Connection issue - throw new Requests_Exception(rtrim($this->connect_error), 'fsockopen.connect_error'); - } - - throw new Requests_Exception($errstr, 'fsockopenerror', null, $errno); - } - - $data_format = $options['data_format']; - - if ($data_format === 'query') { - $path = self::format_get($url_parts, $data); - $data = ''; - } - else { - $path = self::format_get($url_parts, array()); - } - - $options['hooks']->dispatch('fsockopen.remote_host_path', array(&$path, $url)); - - $request_body = ''; - $out = sprintf("%s %s HTTP/%.1f\r\n", $options['type'], $path, $options['protocol_version']); - - if ($options['type'] !== Requests::TRACE) { - if (is_array($data)) { - $request_body = http_build_query($data, null, '&'); - } - else { - $request_body = $data; - } - - if (!empty($data)) { - if (!isset($case_insensitive_headers['Content-Length'])) { - $headers['Content-Length'] = strlen($request_body); - } - - if (!isset($case_insensitive_headers['Content-Type'])) { - $headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'; - } - } - } - - if (!isset($case_insensitive_headers['Host'])) { - $out .= sprintf('Host: %s', $url_parts['host']); - - if (( 'http' === strtolower($url_parts['scheme']) && $url_parts['port'] !== 80 ) || ( 'https' === strtolower($url_parts['scheme']) && $url_parts['port'] !== 443 )) { - $out .= ':' . $url_parts['port']; - } - $out .= "\r\n"; - } - - if (!isset($case_insensitive_headers['User-Agent'])) { - $out .= sprintf("User-Agent: %s\r\n", $options['useragent']); - } - - $accept_encoding = $this->accept_encoding(); - if (!isset($case_insensitive_headers['Accept-Encoding']) && !empty($accept_encoding)) { - $out .= sprintf("Accept-Encoding: %s\r\n", $accept_encoding); - } - - $headers = Requests::flatten($headers); - - if (!empty($headers)) { - $out .= implode($headers, "\r\n") . "\r\n"; - } - - $options['hooks']->dispatch('fsockopen.after_headers', array(&$out)); - - if (substr($out, -2) !== "\r\n") { - $out .= "\r\n"; - } - - if (!isset($case_insensitive_headers['Connection'])) { - $out .= "Connection: Close\r\n"; - } - - $out .= "\r\n" . $request_body; - - $options['hooks']->dispatch('fsockopen.before_send', array(&$out)); - - fwrite($socket, $out); - $options['hooks']->dispatch('fsockopen.after_send', array($out)); - - if (!$options['blocking']) { - fclose($socket); - $fake_headers = ''; - $options['hooks']->dispatch('fsockopen.after_request', array(&$fake_headers)); - return ''; - } - - $timeout_sec = (int) floor($options['timeout']); - if ($timeout_sec == $options['timeout']) { - $timeout_msec = 0; - } - else { - $timeout_msec = self::SECOND_IN_MICROSECONDS * $options['timeout'] % self::SECOND_IN_MICROSECONDS; - } - stream_set_timeout($socket, $timeout_sec, $timeout_msec); - - $response = $body = $headers = ''; - $this->info = stream_get_meta_data($socket); - $size = 0; - $doingbody = false; - $download = false; - if ($options['filename']) { - $download = fopen($options['filename'], 'wb'); - } - - while (!feof($socket)) { - $this->info = stream_get_meta_data($socket); - if ($this->info['timed_out']) { - throw new Requests_Exception('fsocket timed out', 'timeout'); - } - - $block = fread($socket, Requests::BUFFER_SIZE); - if (!$doingbody) { - $response .= $block; - if (strpos($response, "\r\n\r\n")) { - list($headers, $block) = explode("\r\n\r\n", $response, 2); - $doingbody = true; - } - } - - // Are we in body mode now? - if ($doingbody) { - $options['hooks']->dispatch('request.progress', array($block, $size, $this->max_bytes)); - $data_length = strlen($block); - if ($this->max_bytes) { - // Have we already hit a limit? - if ($size === $this->max_bytes) { - continue; - } - if (($size + $data_length) > $this->max_bytes) { - // Limit the length - $limited_length = ($this->max_bytes - $size); - $block = substr($block, 0, $limited_length); - } - } - - $size += strlen($block); - if ($download) { - fwrite($download, $block); - } - else { - $body .= $block; - } - } - } - $this->headers = $headers; - - if ($download) { - fclose($download); - } - else { - $this->headers .= "\r\n\r\n" . $body; - } - fclose($socket); - - $options['hooks']->dispatch('fsockopen.after_request', array(&$this->headers, &$this->info)); - return $this->headers; - } - - /** - * Send multiple requests simultaneously - * - * @param array $requests Request data (array of 'url', 'headers', 'data', 'options') as per {@see Requests_Transport::request} - * @param array $options Global options, see {@see Requests::response()} for documentation - * @return array Array of Requests_Response objects (may contain Requests_Exception or string responses as well) - */ - public function request_multiple($requests, $options) { - $responses = array(); - $class = get_class($this); - foreach ($requests as $id => $request) { - try { - $handler = new $class(); - $responses[$id] = $handler->request($request['url'], $request['headers'], $request['data'], $request['options']); - - $request['options']['hooks']->dispatch('transport.internal.parse_response', array(&$responses[$id], $request)); - } - catch (Requests_Exception $e) { - $responses[$id] = $e; - } - - if (!is_string($responses[$id])) { - $request['options']['hooks']->dispatch('multiple.request.complete', array(&$responses[$id], $id)); - } - } - - return $responses; - } - - /** - * Retrieve the encodings we can accept - * - * @return string Accept-Encoding header value - */ - protected static function accept_encoding() { - $type = array(); - if (function_exists('gzinflate')) { - $type[] = 'deflate;q=1.0'; - } - - if (function_exists('gzuncompress')) { - $type[] = 'compress;q=0.5'; - } - - $type[] = 'gzip;q=0.5'; - - return implode(', ', $type); - } - - /** - * Format a URL given GET data - * - * @param array $url_parts - * @param array|object $data Data to build query using, see {@see https://secure.php.net/http_build_query} - * @return string URL with data - */ - protected static function format_get($url_parts, $data) { - if (!empty($data)) { - if (empty($url_parts['query'])) { - $url_parts['query'] = ''; - } - - $url_parts['query'] .= '&' . http_build_query($data, null, '&'); - $url_parts['query'] = trim($url_parts['query'], '&'); - } - if (isset($url_parts['path'])) { - if (isset($url_parts['query'])) { - $get = $url_parts['path'] . '?' . $url_parts['query']; - } - else { - $get = $url_parts['path']; - } - } - else { - $get = '/'; - } - return $get; - } - - /** - * Error handler for stream_socket_client() - * - * @param int $errno Error number (e.g. E_WARNING) - * @param string $errstr Error message - */ - public function connect_error_handler($errno, $errstr) { - // Double-check we can handle it - if (($errno & E_WARNING) === 0 && ($errno & E_NOTICE) === 0) { - // Return false to indicate the default error handler should engage - return false; - } - - $this->connect_error .= $errstr . "\n"; - return true; - } - - /** - * Verify the certificate against common name and subject alternative names - * - * Unfortunately, PHP doesn't check the certificate against the alternative - * names, leading things like 'https://www.github.com/' to be invalid. - * Instead - * - * @see https://tools.ietf.org/html/rfc2818#section-3.1 RFC2818, Section 3.1 - * - * @throws Requests_Exception On failure to connect via TLS (`fsockopen.ssl.connect_error`) - * @throws Requests_Exception On not obtaining a match for the host (`fsockopen.ssl.no_match`) - * @param string $host Host name to verify against - * @param resource $context Stream context - * @return bool - */ - public function verify_certificate_from_context($host, $context) { - $meta = stream_context_get_options($context); - - // If we don't have SSL options, then we couldn't make the connection at - // all - if (empty($meta) || empty($meta['ssl']) || empty($meta['ssl']['peer_certificate'])) { - throw new Requests_Exception(rtrim($this->connect_error), 'ssl.connect_error'); - } - - $cert = openssl_x509_parse($meta['ssl']['peer_certificate']); - - return Requests_SSL::verify_certificate($host, $cert); - } - - /** - * Whether this transport is valid - * - * @codeCoverageIgnore - * @return boolean True if the transport is valid, false otherwise. - */ - public static function test($capabilities = array()) { - if (!function_exists('fsockopen')) { - return false; - } - - // If needed, check that streams support SSL - if (isset($capabilities['ssl']) && $capabilities['ssl']) { - if (!extension_loaded('openssl') || !function_exists('openssl_x509_parse')) { - return false; - } - - // Currently broken, thanks to https://github.com/facebook/hhvm/issues/2156 - if (defined('HHVM_VERSION')) { - return false; - } - } - - return true; - } -} diff --git a/wp/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php b/wp/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php deleted file mode 100644 index 2c97893a..00000000 --- a/wp/wp-includes/Requests/Utility/CaseInsensitiveDictionary.php +++ /dev/null @@ -1,103 +0,0 @@ - $value) { - $this->offsetSet($key, $value); - } - } - - /** - * Check if the given item exists - * - * @param string $key Item key - * @return boolean Does the item exist? - */ - public function offsetExists($key) { - $key = strtolower($key); - return isset($this->data[$key]); - } - - /** - * Get the value for the item - * - * @param string $key Item key - * @return string Item value - */ - public function offsetGet($key) { - $key = strtolower($key); - if (!isset($this->data[$key])) { - return null; - } - - return $this->data[$key]; - } - - /** - * Set the given item - * - * @throws Requests_Exception On attempting to use dictionary as list (`invalidset`) - * - * @param string $key Item name - * @param string $value Item value - */ - public function offsetSet($key, $value) { - if ($key === null) { - throw new Requests_Exception('Object is a dictionary, not a list', 'invalidset'); - } - - $key = strtolower($key); - $this->data[$key] = $value; - } - - /** - * Unset the given header - * - * @param string $key - */ - public function offsetUnset($key) { - unset($this->data[strtolower($key)]); - } - - /** - * Get an iterator for the data - * - * @return ArrayIterator - */ - public function getIterator() { - return new ArrayIterator($this->data); - } - - /** - * Get the headers as an array - * - * @return array Header data - */ - public function getAll() { - return $this->data; - } -} diff --git a/wp/wp-includes/Requests/Utility/FilteredIterator.php b/wp/wp-includes/Requests/Utility/FilteredIterator.php deleted file mode 100644 index 76a29e72..00000000 --- a/wp/wp-includes/Requests/Utility/FilteredIterator.php +++ /dev/null @@ -1,45 +0,0 @@ -callback = $callback; - } - - /** - * Get the current item's value after filtering - * - * @return string - */ - public function current() { - $value = parent::current(); - $value = call_user_func($this->callback, $value); - return $value; - } -} diff --git a/wp/wp-includes/SimplePie/Author.php b/wp/wp-includes/SimplePie/Author.php deleted file mode 100644 index bbf3812f..00000000 --- a/wp/wp-includes/SimplePie/Author.php +++ /dev/null @@ -1,157 +0,0 @@ -name = $name; - $this->link = $link; - $this->email = $email; - } - - /** - * String-ified version - * - * @return string - */ - public function __toString() - { - // There is no $this->data here - return md5(serialize($this)); - } - - /** - * Author's name - * - * @return string|null - */ - public function get_name() - { - if ($this->name !== null) - { - return $this->name; - } - else - { - return null; - } - } - - /** - * Author's link - * - * @return string|null - */ - public function get_link() - { - if ($this->link !== null) - { - return $this->link; - } - else - { - return null; - } - } - - /** - * Author's email address - * - * @return string|null - */ - public function get_email() - { - if ($this->email !== null) - { - return $this->email; - } - else - { - return null; - } - } -} - diff --git a/wp/wp-includes/SimplePie/Cache.php b/wp/wp-includes/SimplePie/Cache.php deleted file mode 100644 index 75586d74..00000000 --- a/wp/wp-includes/SimplePie/Cache.php +++ /dev/null @@ -1,133 +0,0 @@ - 'SimplePie_Cache_MySQL', - 'memcache' => 'SimplePie_Cache_Memcache', - ); - - /** - * Don't call the constructor. Please. - */ - private function __construct() { } - - /** - * Create a new SimplePie_Cache object - * - * @param string $location URL location (scheme is used to determine handler) - * @param string $filename Unique identifier for cache object - * @param string $extension 'spi' or 'spc' - * @return SimplePie_Cache_Base Type of object depends on scheme of `$location` - */ - public static function get_handler($location, $filename, $extension) - { - $type = explode(':', $location, 2); - $type = $type[0]; - if (!empty(self::$handlers[$type])) - { - $class = self::$handlers[$type]; - return new $class($location, $filename, $extension); - } - - return new SimplePie_Cache_File($location, $filename, $extension); - } - - /** - * Create a new SimplePie_Cache object - * - * @deprecated Use {@see get_handler} instead - */ - public function create($location, $filename, $extension) - { - trigger_error('Cache::create() has been replaced with Cache::get_handler(). Switch to the registry system to use this.', E_USER_DEPRECATED); - return self::get_handler($location, $filename, $extension); - } - - /** - * Register a handler - * - * @param string $type DSN type to register for - * @param string $class Name of handler class. Must implement SimplePie_Cache_Base - */ - public static function register($type, $class) - { - self::$handlers[$type] = $class; - } - - /** - * Parse a URL into an array - * - * @param string $url - * @return array - */ - public static function parse_URL($url) - { - $params = parse_url($url); - $params['extras'] = array(); - if (isset($params['query'])) - { - parse_str($params['query'], $params['extras']); - } - return $params; - } -} diff --git a/wp/wp-includes/SimplePie/Cache/Base.php b/wp/wp-includes/SimplePie/Cache/Base.php deleted file mode 100644 index 937e3463..00000000 --- a/wp/wp-includes/SimplePie/Cache/Base.php +++ /dev/null @@ -1,114 +0,0 @@ -get_items(); - $items_by_id = array(); - - if (!empty($items)) - { - foreach ($items as $item) - { - $items_by_id[$item->get_id()] = $item; - } - - if (count($items_by_id) !== count($items)) - { - $items_by_id = array(); - foreach ($items as $item) - { - $items_by_id[$item->get_id(true)] = $item; - } - } - - if (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0])) - { - $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]; - } - elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0])) - { - $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]; - } - elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0])) - { - $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]; - } - elseif (isset($data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0])) - { - $channel =& $data->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['channel'][0]; - } - else - { - $channel = null; - } - - if ($channel !== null) - { - if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'])) - { - unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry']); - } - if (isset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry'])) - { - unset($channel['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['entry']); - } - if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item'])) - { - unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']); - } - if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item'])) - { - unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']); - } - if (isset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item'])) - { - unset($channel['child'][SIMPLEPIE_NAMESPACE_RSS_20]['item']); - } - } - if (isset($data->data['items'])) - { - unset($data->data['items']); - } - if (isset($data->data['ordered_items'])) - { - unset($data->data['ordered_items']); - } - } - return array(serialize($data->data), $items_by_id); - } -} diff --git a/wp/wp-includes/SimplePie/Cache/File.php b/wp/wp-includes/SimplePie/Cache/File.php deleted file mode 100644 index 5797b3ae..00000000 --- a/wp/wp-includes/SimplePie/Cache/File.php +++ /dev/null @@ -1,173 +0,0 @@ -location = $location; - $this->filename = $name; - $this->extension = $type; - $this->name = "$this->location/$this->filename.$this->extension"; - } - - /** - * Save data to the cache - * - * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property - * @return bool Successfulness - */ - public function save($data) - { - if (file_exists($this->name) && is_writeable($this->name) || file_exists($this->location) && is_writeable($this->location)) - { - if ($data instanceof SimplePie) - { - $data = $data->data; - } - - $data = serialize($data); - return (bool) file_put_contents($this->name, $data); - } - return false; - } - - /** - * Retrieve the data saved to the cache - * - * @return array Data for SimplePie::$data - */ - public function load() - { - if (file_exists($this->name) && is_readable($this->name)) - { - return unserialize(file_get_contents($this->name)); - } - return false; - } - - /** - * Retrieve the last modified time for the cache - * - * @return int Timestamp - */ - public function mtime() - { - if (file_exists($this->name)) - { - return filemtime($this->name); - } - return false; - } - - /** - * Set the last modified time to the current time - * - * @return bool Success status - */ - public function touch() - { - if (file_exists($this->name)) - { - return touch($this->name); - } - return false; - } - - /** - * Remove the cache - * - * @return bool Success status - */ - public function unlink() - { - if (file_exists($this->name)) - { - return unlink($this->name); - } - return false; - } -} diff --git a/wp/wp-includes/SimplePie/Cache/Memcache.php b/wp/wp-includes/SimplePie/Cache/Memcache.php deleted file mode 100644 index fd447806..00000000 --- a/wp/wp-includes/SimplePie/Cache/Memcache.php +++ /dev/null @@ -1,183 +0,0 @@ -options = array( - 'host' => '127.0.0.1', - 'port' => 11211, - 'extras' => array( - 'timeout' => 3600, // one hour - 'prefix' => 'simplepie_', - ), - ); - $parsed = SimplePie_Cache::parse_URL($location); - $this->options['host'] = empty($parsed['host']) ? $this->options['host'] : $parsed['host']; - $this->options['port'] = empty($parsed['port']) ? $this->options['port'] : $parsed['port']; - $this->options['extras'] = array_merge($this->options['extras'], $parsed['extras']); - $this->name = $this->options['extras']['prefix'] . md5("$name:$type"); - - $this->cache = new Memcache(); - $this->cache->addServer($this->options['host'], (int) $this->options['port']); - } - - /** - * Save data to the cache - * - * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property - * @return bool Successfulness - */ - public function save($data) - { - if ($data instanceof SimplePie) - { - $data = $data->data; - } - return $this->cache->set($this->name, serialize($data), MEMCACHE_COMPRESSED, (int) $this->options['extras']['timeout']); - } - - /** - * Retrieve the data saved to the cache - * - * @return array Data for SimplePie::$data - */ - public function load() - { - $data = $this->cache->get($this->name); - - if ($data !== false) - { - return unserialize($data); - } - return false; - } - - /** - * Retrieve the last modified time for the cache - * - * @return int Timestamp - */ - public function mtime() - { - $data = $this->cache->get($this->name); - - if ($data !== false) - { - // essentially ignore the mtime because Memcache expires on it's own - return time(); - } - - return false; - } - - /** - * Set the last modified time to the current time - * - * @return bool Success status - */ - public function touch() - { - $data = $this->cache->get($this->name); - - if ($data !== false) - { - return $this->cache->set($this->name, $data, MEMCACHE_COMPRESSED, (int) $this->duration); - } - - return false; - } - - /** - * Remove the cache - * - * @return bool Success status - */ - public function unlink() - { - return $this->cache->delete($this->name, 0); - } -} diff --git a/wp/wp-includes/SimplePie/Cache/MySQL.php b/wp/wp-includes/SimplePie/Cache/MySQL.php deleted file mode 100644 index d53ebc11..00000000 --- a/wp/wp-includes/SimplePie/Cache/MySQL.php +++ /dev/null @@ -1,438 +0,0 @@ -options = array( - 'user' => null, - 'pass' => null, - 'host' => '127.0.0.1', - 'port' => '3306', - 'path' => '', - 'extras' => array( - 'prefix' => '', - ), - ); - $this->options = array_merge_recursive($this->options, SimplePie_Cache::parse_URL($location)); - - // Path is prefixed with a "/" - $this->options['dbname'] = substr($this->options['path'], 1); - - try - { - $this->mysql = new PDO("mysql:dbname={$this->options['dbname']};host={$this->options['host']};port={$this->options['port']}", $this->options['user'], $this->options['pass'], array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')); - } - catch (PDOException $e) - { - $this->mysql = null; - return; - } - - $this->id = $name . $type; - - if (!$query = $this->mysql->query('SHOW TABLES')) - { - $this->mysql = null; - return; - } - - $db = array(); - while ($row = $query->fetchColumn()) - { - $db[] = $row; - } - - if (!in_array($this->options['extras']['prefix'] . 'cache_data', $db)) - { - $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'cache_data` (`id` TEXT CHARACTER SET utf8 NOT NULL, `items` SMALLINT NOT NULL DEFAULT 0, `data` BLOB NOT NULL, `mtime` INT UNSIGNED NOT NULL, UNIQUE (`id`(125)))'); - if ($query === false) - { - $this->mysql = null; - } - } - - if (!in_array($this->options['extras']['prefix'] . 'items', $db)) - { - $query = $this->mysql->exec('CREATE TABLE `' . $this->options['extras']['prefix'] . 'items` (`feed_id` TEXT CHARACTER SET utf8 NOT NULL, `id` TEXT CHARACTER SET utf8 NOT NULL, `data` TEXT CHARACTER SET utf8 NOT NULL, `posted` INT UNSIGNED NOT NULL, INDEX `feed_id` (`feed_id`(125)))'); - if ($query === false) - { - $this->mysql = null; - } - } - } - - /** - * Save data to the cache - * - * @param array|SimplePie $data Data to store in the cache. If passed a SimplePie object, only cache the $data property - * @return bool Successfulness - */ - public function save($data) - { - if ($this->mysql === null) - { - return false; - } - - if ($data instanceof SimplePie) - { - $data = clone $data; - - $prepared = self::prepare_simplepie_object_for_cache($data); - - $query = $this->mysql->prepare('SELECT COUNT(*) FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed'); - $query->bindValue(':feed', $this->id); - if ($query->execute()) - { - if ($query->fetchColumn() > 0) - { - $items = count($prepared[1]); - if ($items) - { - $sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = :items, `data` = :data, `mtime` = :time WHERE `id` = :feed'; - $query = $this->mysql->prepare($sql); - $query->bindValue(':items', $items); - } - else - { - $sql = 'UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `data` = :data, `mtime` = :time WHERE `id` = :feed'; - $query = $this->mysql->prepare($sql); - } - - $query->bindValue(':data', $prepared[0]); - $query->bindValue(':time', time()); - $query->bindValue(':feed', $this->id); - if (!$query->execute()) - { - return false; - } - } - else - { - $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:feed, :count, :data, :time)'); - $query->bindValue(':feed', $this->id); - $query->bindValue(':count', count($prepared[1])); - $query->bindValue(':data', $prepared[0]); - $query->bindValue(':time', time()); - if (!$query->execute()) - { - return false; - } - } - - $ids = array_keys($prepared[1]); - if (!empty($ids)) - { - foreach ($ids as $id) - { - $database_ids[] = $this->mysql->quote($id); - } - - $query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `id` = ' . implode(' OR `id` = ', $database_ids) . ' AND `feed_id` = :feed'); - $query->bindValue(':feed', $this->id); - - if ($query->execute()) - { - $existing_ids = array(); - while ($row = $query->fetchColumn()) - { - $existing_ids[] = $row; - } - - $new_ids = array_diff($ids, $existing_ids); - - foreach ($new_ids as $new_id) - { - if (!($date = $prepared[1][$new_id]->get_date('U'))) - { - $date = time(); - } - - $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'items` (`feed_id`, `id`, `data`, `posted`) VALUES(:feed, :id, :data, :date)'); - $query->bindValue(':feed', $this->id); - $query->bindValue(':id', $new_id); - $query->bindValue(':data', serialize($prepared[1][$new_id]->data)); - $query->bindValue(':date', $date); - if (!$query->execute()) - { - return false; - } - } - return true; - } - } - else - { - return true; - } - } - } - else - { - $query = $this->mysql->prepare('SELECT `id` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :feed'); - $query->bindValue(':feed', $this->id); - if ($query->execute()) - { - if ($query->rowCount() > 0) - { - $query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `items` = 0, `data` = :data, `mtime` = :time WHERE `id` = :feed'); - $query->bindValue(':data', serialize($data)); - $query->bindValue(':time', time()); - $query->bindValue(':feed', $this->id); - if ($this->execute()) - { - return true; - } - } - else - { - $query = $this->mysql->prepare('INSERT INTO `' . $this->options['extras']['prefix'] . 'cache_data` (`id`, `items`, `data`, `mtime`) VALUES(:id, 0, :data, :time)'); - $query->bindValue(':id', $this->id); - $query->bindValue(':data', serialize($data)); - $query->bindValue(':time', time()); - if ($query->execute()) - { - return true; - } - } - } - } - return false; - } - - /** - * Retrieve the data saved to the cache - * - * @return array Data for SimplePie::$data - */ - public function load() - { - if ($this->mysql === null) - { - return false; - } - - $query = $this->mysql->prepare('SELECT `items`, `data` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id'); - $query->bindValue(':id', $this->id); - if ($query->execute() && ($row = $query->fetch())) - { - $data = unserialize($row[1]); - - if (isset($this->options['items'][0])) - { - $items = (int) $this->options['items'][0]; - } - else - { - $items = (int) $row[0]; - } - - if ($items !== 0) - { - if (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0])) - { - $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]; - } - elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0])) - { - $feed =& $data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]; - } - elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0])) - { - $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]; - } - elseif (isset($data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0])) - { - $feed =& $data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]; - } - else - { - $feed = null; - } - - if ($feed !== null) - { - $sql = 'SELECT `data` FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :feed ORDER BY `posted` DESC'; - if ($items > 0) - { - $sql .= ' LIMIT ' . $items; - } - - $query = $this->mysql->prepare($sql); - $query->bindValue(':feed', $this->id); - if ($query->execute()) - { - while ($row = $query->fetchColumn()) - { - $feed['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['entry'][] = unserialize($row); - } - } - else - { - return false; - } - } - } - return $data; - } - return false; - } - - /** - * Retrieve the last modified time for the cache - * - * @return int Timestamp - */ - public function mtime() - { - if ($this->mysql === null) - { - return false; - } - - $query = $this->mysql->prepare('SELECT `mtime` FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id'); - $query->bindValue(':id', $this->id); - if ($query->execute() && ($time = $query->fetchColumn())) - { - return $time; - } - else - { - return false; - } - } - - /** - * Set the last modified time to the current time - * - * @return bool Success status - */ - public function touch() - { - if ($this->mysql === null) - { - return false; - } - - $query = $this->mysql->prepare('UPDATE `' . $this->options['extras']['prefix'] . 'cache_data` SET `mtime` = :time WHERE `id` = :id'); - $query->bindValue(':time', time()); - $query->bindValue(':id', $this->id); - if ($query->execute() && $query->rowCount() > 0) - { - return true; - } - else - { - return false; - } - } - - /** - * Remove the cache - * - * @return bool Success status - */ - public function unlink() - { - if ($this->mysql === null) - { - return false; - } - - $query = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'cache_data` WHERE `id` = :id'); - $query->bindValue(':id', $this->id); - $query2 = $this->mysql->prepare('DELETE FROM `' . $this->options['extras']['prefix'] . 'items` WHERE `feed_id` = :id'); - $query2->bindValue(':id', $this->id); - if ($query->execute() && $query2->execute()) - { - return true; - } - else - { - return false; - } - } -} diff --git a/wp/wp-includes/SimplePie/Caption.php b/wp/wp-includes/SimplePie/Caption.php deleted file mode 100644 index 52922c5d..00000000 --- a/wp/wp-includes/SimplePie/Caption.php +++ /dev/null @@ -1,210 +0,0 @@ -` captions as defined in Media RSS. - * - * Used by {@see SimplePie_Enclosure::get_caption()} and {@see SimplePie_Enclosure::get_captions()} - * - * This class can be overloaded with {@see SimplePie::set_caption_class()} - * - * @package SimplePie - * @subpackage API - */ -class SimplePie_Caption -{ - /** - * Content type - * - * @var string - * @see get_type() - */ - var $type; - - /** - * Language - * - * @var string - * @see get_language() - */ - var $lang; - - /** - * Start time - * - * @var string - * @see get_starttime() - */ - var $startTime; - - /** - * End time - * - * @var string - * @see get_endtime() - */ - var $endTime; - - /** - * Caption text - * - * @var string - * @see get_text() - */ - var $text; - - /** - * Constructor, used to input the data - * - * For documentation on all the parameters, see the corresponding - * properties and their accessors - */ - public function __construct($type = null, $lang = null, $startTime = null, $endTime = null, $text = null) - { - $this->type = $type; - $this->lang = $lang; - $this->startTime = $startTime; - $this->endTime = $endTime; - $this->text = $text; - } - - /** - * String-ified version - * - * @return string - */ - public function __toString() - { - // There is no $this->data here - return md5(serialize($this)); - } - - /** - * Get the end time - * - * @return string|null Time in the format 'hh:mm:ss.SSS' - */ - public function get_endtime() - { - if ($this->endTime !== null) - { - return $this->endTime; - } - else - { - return null; - } - } - - /** - * Get the language - * - * @link http://tools.ietf.org/html/rfc3066 - * @return string|null Language code as per RFC 3066 - */ - public function get_language() - { - if ($this->lang !== null) - { - return $this->lang; - } - else - { - return null; - } - } - - /** - * Get the start time - * - * @return string|null Time in the format 'hh:mm:ss.SSS' - */ - public function get_starttime() - { - if ($this->startTime !== null) - { - return $this->startTime; - } - else - { - return null; - } - } - - /** - * Get the text of the caption - * - * @return string|null - */ - public function get_text() - { - if ($this->text !== null) - { - return $this->text; - } - else - { - return null; - } - } - - /** - * Get the content type (not MIME type) - * - * @return string|null Either 'text' or 'html' - */ - public function get_type() - { - if ($this->type !== null) - { - return $this->type; - } - else - { - return null; - } - } -} - diff --git a/wp/wp-includes/SimplePie/Category.php b/wp/wp-includes/SimplePie/Category.php deleted file mode 100644 index ad0407b4..00000000 --- a/wp/wp-includes/SimplePie/Category.php +++ /dev/null @@ -1,157 +0,0 @@ -term = $term; - $this->scheme = $scheme; - $this->label = $label; - } - - /** - * String-ified version - * - * @return string - */ - public function __toString() - { - // There is no $this->data here - return md5(serialize($this)); - } - - /** - * Get the category identifier - * - * @return string|null - */ - public function get_term() - { - if ($this->term !== null) - { - return $this->term; - } - else - { - return null; - } - } - - /** - * Get the categorization scheme identifier - * - * @return string|null - */ - public function get_scheme() - { - if ($this->scheme !== null) - { - return $this->scheme; - } - else - { - return null; - } - } - - /** - * Get the human readable label - * - * @return string|null - */ - public function get_label() - { - if ($this->label !== null) - { - return $this->label; - } - else - { - return $this->get_term(); - } - } -} - diff --git a/wp/wp-includes/SimplePie/Content/Type/Sniffer.php b/wp/wp-includes/SimplePie/Content/Type/Sniffer.php deleted file mode 100644 index 20d053dc..00000000 --- a/wp/wp-includes/SimplePie/Content/Type/Sniffer.php +++ /dev/null @@ -1,332 +0,0 @@ -file = $file; - } - - /** - * Get the Content-Type of the specified file - * - * @return string Actual Content-Type - */ - public function get_type() - { - if (isset($this->file->headers['content-type'])) - { - if (!isset($this->file->headers['content-encoding']) - && ($this->file->headers['content-type'] === 'text/plain' - || $this->file->headers['content-type'] === 'text/plain; charset=ISO-8859-1' - || $this->file->headers['content-type'] === 'text/plain; charset=iso-8859-1' - || $this->file->headers['content-type'] === 'text/plain; charset=UTF-8')) - { - return $this->text_or_binary(); - } - - if (($pos = strpos($this->file->headers['content-type'], ';')) !== false) - { - $official = substr($this->file->headers['content-type'], 0, $pos); - } - else - { - $official = $this->file->headers['content-type']; - } - $official = trim(strtolower($official)); - - if ($official === 'unknown/unknown' - || $official === 'application/unknown') - { - return $this->unknown(); - } - elseif (substr($official, -4) === '+xml' - || $official === 'text/xml' - || $official === 'application/xml') - { - return $official; - } - elseif (substr($official, 0, 6) === 'image/') - { - if ($return = $this->image()) - { - return $return; - } - else - { - return $official; - } - } - elseif ($official === 'text/html') - { - return $this->feed_or_html(); - } - else - { - return $official; - } - } - else - { - return $this->unknown(); - } - } - - /** - * Sniff text or binary - * - * @return string Actual Content-Type - */ - public function text_or_binary() - { - if (substr($this->file->body, 0, 2) === "\xFE\xFF" - || substr($this->file->body, 0, 2) === "\xFF\xFE" - || substr($this->file->body, 0, 4) === "\x00\x00\xFE\xFF" - || substr($this->file->body, 0, 3) === "\xEF\xBB\xBF") - { - return 'text/plain'; - } - elseif (preg_match('/[\x00-\x08\x0E-\x1A\x1C-\x1F]/', $this->file->body)) - { - return 'application/octect-stream'; - } - else - { - return 'text/plain'; - } - } - - /** - * Sniff unknown - * - * @return string Actual Content-Type - */ - public function unknown() - { - $ws = strspn($this->file->body, "\x09\x0A\x0B\x0C\x0D\x20"); - if (strtolower(substr($this->file->body, $ws, 14)) === 'file->body, $ws, 5)) === 'file->body, $ws, 7)) === 'file->body, 0, 5) === '%PDF-') - { - return 'application/pdf'; - } - elseif (substr($this->file->body, 0, 11) === '%!PS-Adobe-') - { - return 'application/postscript'; - } - elseif (substr($this->file->body, 0, 6) === 'GIF87a' - || substr($this->file->body, 0, 6) === 'GIF89a') - { - return 'image/gif'; - } - elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") - { - return 'image/png'; - } - elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF") - { - return 'image/jpeg'; - } - elseif (substr($this->file->body, 0, 2) === "\x42\x4D") - { - return 'image/bmp'; - } - elseif (substr($this->file->body, 0, 4) === "\x00\x00\x01\x00") - { - return 'image/vnd.microsoft.icon'; - } - else - { - return $this->text_or_binary(); - } - } - - /** - * Sniff images - * - * @return string Actual Content-Type - */ - public function image() - { - if (substr($this->file->body, 0, 6) === 'GIF87a' - || substr($this->file->body, 0, 6) === 'GIF89a') - { - return 'image/gif'; - } - elseif (substr($this->file->body, 0, 8) === "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A") - { - return 'image/png'; - } - elseif (substr($this->file->body, 0, 3) === "\xFF\xD8\xFF") - { - return 'image/jpeg'; - } - elseif (substr($this->file->body, 0, 2) === "\x42\x4D") - { - return 'image/bmp'; - } - elseif (substr($this->file->body, 0, 4) === "\x00\x00\x01\x00") - { - return 'image/vnd.microsoft.icon'; - } - else - { - return false; - } - } - - /** - * Sniff HTML - * - * @return string Actual Content-Type - */ - public function feed_or_html() - { - $len = strlen($this->file->body); - $pos = strspn($this->file->body, "\x09\x0A\x0D\x20"); - - while ($pos < $len) - { - switch ($this->file->body[$pos]) - { - case "\x09": - case "\x0A": - case "\x0D": - case "\x20": - $pos += strspn($this->file->body, "\x09\x0A\x0D\x20", $pos); - continue 2; - - case '<': - $pos++; - break; - - default: - return 'text/html'; - } - - if (substr($this->file->body, $pos, 3) === '!--') - { - $pos += 3; - if ($pos < $len && ($pos = strpos($this->file->body, '-->', $pos)) !== false) - { - $pos += 3; - } - else - { - return 'text/html'; - } - } - elseif (substr($this->file->body, $pos, 1) === '!') - { - if ($pos < $len && ($pos = strpos($this->file->body, '>', $pos)) !== false) - { - $pos++; - } - else - { - return 'text/html'; - } - } - elseif (substr($this->file->body, $pos, 1) === '?') - { - if ($pos < $len && ($pos = strpos($this->file->body, '?>', $pos)) !== false) - { - $pos += 2; - } - else - { - return 'text/html'; - } - } - elseif (substr($this->file->body, $pos, 3) === 'rss' - || substr($this->file->body, $pos, 7) === 'rdf:RDF') - { - return 'application/rss+xml'; - } - elseif (substr($this->file->body, $pos, 4) === 'feed') - { - return 'application/atom+xml'; - } - else - { - return 'text/html'; - } - } - - return 'text/html'; - } -} - diff --git a/wp/wp-includes/SimplePie/Copyright.php b/wp/wp-includes/SimplePie/Copyright.php deleted file mode 100644 index 57c535a6..00000000 --- a/wp/wp-includes/SimplePie/Copyright.php +++ /dev/null @@ -1,130 +0,0 @@ -` copyright tags as defined in Media RSS - * - * Used by {@see SimplePie_Enclosure::get_copyright()} - * - * This class can be overloaded with {@see SimplePie::set_copyright_class()} - * - * @package SimplePie - * @subpackage API - */ -class SimplePie_Copyright -{ - /** - * Copyright URL - * - * @var string - * @see get_url() - */ - var $url; - - /** - * Attribution - * - * @var string - * @see get_attribution() - */ - var $label; - - /** - * Constructor, used to input the data - * - * For documentation on all the parameters, see the corresponding - * properties and their accessors - */ - public function __construct($url = null, $label = null) - { - $this->url = $url; - $this->label = $label; - } - - /** - * String-ified version - * - * @return string - */ - public function __toString() - { - // There is no $this->data here - return md5(serialize($this)); - } - - /** - * Get the copyright URL - * - * @return string|null URL to copyright information - */ - public function get_url() - { - if ($this->url !== null) - { - return $this->url; - } - else - { - return null; - } - } - - /** - * Get the attribution text - * - * @return string|null - */ - public function get_attribution() - { - if ($this->label !== null) - { - return $this->label; - } - else - { - return null; - } - } -} - diff --git a/wp/wp-includes/SimplePie/Core.php b/wp/wp-includes/SimplePie/Core.php deleted file mode 100644 index 46d99662..00000000 --- a/wp/wp-includes/SimplePie/Core.php +++ /dev/null @@ -1,57 +0,0 @@ -` as defined in Media RSS - * - * Used by {@see SimplePie_Enclosure::get_credit()} and {@see SimplePie_Enclosure::get_credits()} - * - * This class can be overloaded with {@see SimplePie::set_credit_class()} - * - * @package SimplePie - * @subpackage API - */ -class SimplePie_Credit -{ - /** - * Credited role - * - * @var string - * @see get_role() - */ - var $role; - - /** - * Organizational scheme - * - * @var string - * @see get_scheme() - */ - var $scheme; - - /** - * Credited name - * - * @var string - * @see get_name() - */ - var $name; - - /** - * Constructor, used to input the data - * - * For documentation on all the parameters, see the corresponding - * properties and their accessors - */ - public function __construct($role = null, $scheme = null, $name = null) - { - $this->role = $role; - $this->scheme = $scheme; - $this->name = $name; - } - - /** - * String-ified version - * - * @return string - */ - public function __toString() - { - // There is no $this->data here - return md5(serialize($this)); - } - - /** - * Get the role of the person receiving credit - * - * @return string|null - */ - public function get_role() - { - if ($this->role !== null) - { - return $this->role; - } - else - { - return null; - } - } - - /** - * Get the organizational scheme - * - * @return string|null - */ - public function get_scheme() - { - if ($this->scheme !== null) - { - return $this->scheme; - } - else - { - return null; - } - } - - /** - * Get the credited person/entity's name - * - * @return string|null - */ - public function get_name() - { - if ($this->name !== null) - { - return $this->name; - } - else - { - return null; - } - } -} - diff --git a/wp/wp-includes/SimplePie/Decode/HTML/Entities.php b/wp/wp-includes/SimplePie/Decode/HTML/Entities.php deleted file mode 100644 index 069e8d8e..00000000 --- a/wp/wp-includes/SimplePie/Decode/HTML/Entities.php +++ /dev/null @@ -1,617 +0,0 @@ -data = $data; - } - - /** - * Parse the input data - * - * @access public - * @return string Output data - */ - public function parse() - { - while (($this->position = strpos($this->data, '&', $this->position)) !== false) - { - $this->consume(); - $this->entity(); - $this->consumed = ''; - } - return $this->data; - } - - /** - * Consume the next byte - * - * @access private - * @return mixed The next byte, or false, if there is no more data - */ - public function consume() - { - if (isset($this->data[$this->position])) - { - $this->consumed .= $this->data[$this->position]; - return $this->data[$this->position++]; - } - else - { - return false; - } - } - - /** - * Consume a range of characters - * - * @access private - * @param string $chars Characters to consume - * @return mixed A series of characters that match the range, or false - */ - public function consume_range($chars) - { - if ($len = strspn($this->data, $chars, $this->position)) - { - $data = substr($this->data, $this->position, $len); - $this->consumed .= $data; - $this->position += $len; - return $data; - } - else - { - return false; - } - } - - /** - * Unconsume one byte - * - * @access private - */ - public function unconsume() - { - $this->consumed = substr($this->consumed, 0, -1); - $this->position--; - } - - /** - * Decode an entity - * - * @access private - */ - public function entity() - { - switch ($this->consume()) - { - case "\x09": - case "\x0A": - case "\x0B": - case "\x0B": - case "\x0C": - case "\x20": - case "\x3C": - case "\x26": - case false: - break; - - case "\x23": - switch ($this->consume()) - { - case "\x78": - case "\x58": - $range = '0123456789ABCDEFabcdef'; - $hex = true; - break; - - default: - $range = '0123456789'; - $hex = false; - $this->unconsume(); - break; - } - - if ($codepoint = $this->consume_range($range)) - { - static $windows_1252_specials = array(0x0D => "\x0A", 0x80 => "\xE2\x82\xAC", 0x81 => "\xEF\xBF\xBD", 0x82 => "\xE2\x80\x9A", 0x83 => "\xC6\x92", 0x84 => "\xE2\x80\x9E", 0x85 => "\xE2\x80\xA6", 0x86 => "\xE2\x80\xA0", 0x87 => "\xE2\x80\xA1", 0x88 => "\xCB\x86", 0x89 => "\xE2\x80\xB0", 0x8A => "\xC5\xA0", 0x8B => "\xE2\x80\xB9", 0x8C => "\xC5\x92", 0x8D => "\xEF\xBF\xBD", 0x8E => "\xC5\xBD", 0x8F => "\xEF\xBF\xBD", 0x90 => "\xEF\xBF\xBD", 0x91 => "\xE2\x80\x98", 0x92 => "\xE2\x80\x99", 0x93 => "\xE2\x80\x9C", 0x94 => "\xE2\x80\x9D", 0x95 => "\xE2\x80\xA2", 0x96 => "\xE2\x80\x93", 0x97 => "\xE2\x80\x94", 0x98 => "\xCB\x9C", 0x99 => "\xE2\x84\xA2", 0x9A => "\xC5\xA1", 0x9B => "\xE2\x80\xBA", 0x9C => "\xC5\x93", 0x9D => "\xEF\xBF\xBD", 0x9E => "\xC5\xBE", 0x9F => "\xC5\xB8"); - - if ($hex) - { - $codepoint = hexdec($codepoint); - } - else - { - $codepoint = intval($codepoint); - } - - if (isset($windows_1252_specials[$codepoint])) - { - $replacement = $windows_1252_specials[$codepoint]; - } - else - { - $replacement = SimplePie_Misc::codepoint_to_utf8($codepoint); - } - - if (!in_array($this->consume(), array(';', false), true)) - { - $this->unconsume(); - } - - $consumed_length = strlen($this->consumed); - $this->data = substr_replace($this->data, $replacement, $this->position - $consumed_length, $consumed_length); - $this->position += strlen($replacement) - $consumed_length; - } - break; - - default: - static $entities = array( - 'Aacute' => "\xC3\x81", - 'aacute' => "\xC3\xA1", - 'Aacute;' => "\xC3\x81", - 'aacute;' => "\xC3\xA1", - 'Acirc' => "\xC3\x82", - 'acirc' => "\xC3\xA2", - 'Acirc;' => "\xC3\x82", - 'acirc;' => "\xC3\xA2", - 'acute' => "\xC2\xB4", - 'acute;' => "\xC2\xB4", - 'AElig' => "\xC3\x86", - 'aelig' => "\xC3\xA6", - 'AElig;' => "\xC3\x86", - 'aelig;' => "\xC3\xA6", - 'Agrave' => "\xC3\x80", - 'agrave' => "\xC3\xA0", - 'Agrave;' => "\xC3\x80", - 'agrave;' => "\xC3\xA0", - 'alefsym;' => "\xE2\x84\xB5", - 'Alpha;' => "\xCE\x91", - 'alpha;' => "\xCE\xB1", - 'AMP' => "\x26", - 'amp' => "\x26", - 'AMP;' => "\x26", - 'amp;' => "\x26", - 'and;' => "\xE2\x88\xA7", - 'ang;' => "\xE2\x88\xA0", - 'apos;' => "\x27", - 'Aring' => "\xC3\x85", - 'aring' => "\xC3\xA5", - 'Aring;' => "\xC3\x85", - 'aring;' => "\xC3\xA5", - 'asymp;' => "\xE2\x89\x88", - 'Atilde' => "\xC3\x83", - 'atilde' => "\xC3\xA3", - 'Atilde;' => "\xC3\x83", - 'atilde;' => "\xC3\xA3", - 'Auml' => "\xC3\x84", - 'auml' => "\xC3\xA4", - 'Auml;' => "\xC3\x84", - 'auml;' => "\xC3\xA4", - 'bdquo;' => "\xE2\x80\x9E", - 'Beta;' => "\xCE\x92", - 'beta;' => "\xCE\xB2", - 'brvbar' => "\xC2\xA6", - 'brvbar;' => "\xC2\xA6", - 'bull;' => "\xE2\x80\xA2", - 'cap;' => "\xE2\x88\xA9", - 'Ccedil' => "\xC3\x87", - 'ccedil' => "\xC3\xA7", - 'Ccedil;' => "\xC3\x87", - 'ccedil;' => "\xC3\xA7", - 'cedil' => "\xC2\xB8", - 'cedil;' => "\xC2\xB8", - 'cent' => "\xC2\xA2", - 'cent;' => "\xC2\xA2", - 'Chi;' => "\xCE\xA7", - 'chi;' => "\xCF\x87", - 'circ;' => "\xCB\x86", - 'clubs;' => "\xE2\x99\xA3", - 'cong;' => "\xE2\x89\x85", - 'COPY' => "\xC2\xA9", - 'copy' => "\xC2\xA9", - 'COPY;' => "\xC2\xA9", - 'copy;' => "\xC2\xA9", - 'crarr;' => "\xE2\x86\xB5", - 'cup;' => "\xE2\x88\xAA", - 'curren' => "\xC2\xA4", - 'curren;' => "\xC2\xA4", - 'Dagger;' => "\xE2\x80\xA1", - 'dagger;' => "\xE2\x80\xA0", - 'dArr;' => "\xE2\x87\x93", - 'darr;' => "\xE2\x86\x93", - 'deg' => "\xC2\xB0", - 'deg;' => "\xC2\xB0", - 'Delta;' => "\xCE\x94", - 'delta;' => "\xCE\xB4", - 'diams;' => "\xE2\x99\xA6", - 'divide' => "\xC3\xB7", - 'divide;' => "\xC3\xB7", - 'Eacute' => "\xC3\x89", - 'eacute' => "\xC3\xA9", - 'Eacute;' => "\xC3\x89", - 'eacute;' => "\xC3\xA9", - 'Ecirc' => "\xC3\x8A", - 'ecirc' => "\xC3\xAA", - 'Ecirc;' => "\xC3\x8A", - 'ecirc;' => "\xC3\xAA", - 'Egrave' => "\xC3\x88", - 'egrave' => "\xC3\xA8", - 'Egrave;' => "\xC3\x88", - 'egrave;' => "\xC3\xA8", - 'empty;' => "\xE2\x88\x85", - 'emsp;' => "\xE2\x80\x83", - 'ensp;' => "\xE2\x80\x82", - 'Epsilon;' => "\xCE\x95", - 'epsilon;' => "\xCE\xB5", - 'equiv;' => "\xE2\x89\xA1", - 'Eta;' => "\xCE\x97", - 'eta;' => "\xCE\xB7", - 'ETH' => "\xC3\x90", - 'eth' => "\xC3\xB0", - 'ETH;' => "\xC3\x90", - 'eth;' => "\xC3\xB0", - 'Euml' => "\xC3\x8B", - 'euml' => "\xC3\xAB", - 'Euml;' => "\xC3\x8B", - 'euml;' => "\xC3\xAB", - 'euro;' => "\xE2\x82\xAC", - 'exist;' => "\xE2\x88\x83", - 'fnof;' => "\xC6\x92", - 'forall;' => "\xE2\x88\x80", - 'frac12' => "\xC2\xBD", - 'frac12;' => "\xC2\xBD", - 'frac14' => "\xC2\xBC", - 'frac14;' => "\xC2\xBC", - 'frac34' => "\xC2\xBE", - 'frac34;' => "\xC2\xBE", - 'frasl;' => "\xE2\x81\x84", - 'Gamma;' => "\xCE\x93", - 'gamma;' => "\xCE\xB3", - 'ge;' => "\xE2\x89\xA5", - 'GT' => "\x3E", - 'gt' => "\x3E", - 'GT;' => "\x3E", - 'gt;' => "\x3E", - 'hArr;' => "\xE2\x87\x94", - 'harr;' => "\xE2\x86\x94", - 'hearts;' => "\xE2\x99\xA5", - 'hellip;' => "\xE2\x80\xA6", - 'Iacute' => "\xC3\x8D", - 'iacute' => "\xC3\xAD", - 'Iacute;' => "\xC3\x8D", - 'iacute;' => "\xC3\xAD", - 'Icirc' => "\xC3\x8E", - 'icirc' => "\xC3\xAE", - 'Icirc;' => "\xC3\x8E", - 'icirc;' => "\xC3\xAE", - 'iexcl' => "\xC2\xA1", - 'iexcl;' => "\xC2\xA1", - 'Igrave' => "\xC3\x8C", - 'igrave' => "\xC3\xAC", - 'Igrave;' => "\xC3\x8C", - 'igrave;' => "\xC3\xAC", - 'image;' => "\xE2\x84\x91", - 'infin;' => "\xE2\x88\x9E", - 'int;' => "\xE2\x88\xAB", - 'Iota;' => "\xCE\x99", - 'iota;' => "\xCE\xB9", - 'iquest' => "\xC2\xBF", - 'iquest;' => "\xC2\xBF", - 'isin;' => "\xE2\x88\x88", - 'Iuml' => "\xC3\x8F", - 'iuml' => "\xC3\xAF", - 'Iuml;' => "\xC3\x8F", - 'iuml;' => "\xC3\xAF", - 'Kappa;' => "\xCE\x9A", - 'kappa;' => "\xCE\xBA", - 'Lambda;' => "\xCE\x9B", - 'lambda;' => "\xCE\xBB", - 'lang;' => "\xE3\x80\x88", - 'laquo' => "\xC2\xAB", - 'laquo;' => "\xC2\xAB", - 'lArr;' => "\xE2\x87\x90", - 'larr;' => "\xE2\x86\x90", - 'lceil;' => "\xE2\x8C\x88", - 'ldquo;' => "\xE2\x80\x9C", - 'le;' => "\xE2\x89\xA4", - 'lfloor;' => "\xE2\x8C\x8A", - 'lowast;' => "\xE2\x88\x97", - 'loz;' => "\xE2\x97\x8A", - 'lrm;' => "\xE2\x80\x8E", - 'lsaquo;' => "\xE2\x80\xB9", - 'lsquo;' => "\xE2\x80\x98", - 'LT' => "\x3C", - 'lt' => "\x3C", - 'LT;' => "\x3C", - 'lt;' => "\x3C", - 'macr' => "\xC2\xAF", - 'macr;' => "\xC2\xAF", - 'mdash;' => "\xE2\x80\x94", - 'micro' => "\xC2\xB5", - 'micro;' => "\xC2\xB5", - 'middot' => "\xC2\xB7", - 'middot;' => "\xC2\xB7", - 'minus;' => "\xE2\x88\x92", - 'Mu;' => "\xCE\x9C", - 'mu;' => "\xCE\xBC", - 'nabla;' => "\xE2\x88\x87", - 'nbsp' => "\xC2\xA0", - 'nbsp;' => "\xC2\xA0", - 'ndash;' => "\xE2\x80\x93", - 'ne;' => "\xE2\x89\xA0", - 'ni;' => "\xE2\x88\x8B", - 'not' => "\xC2\xAC", - 'not;' => "\xC2\xAC", - 'notin;' => "\xE2\x88\x89", - 'nsub;' => "\xE2\x8A\x84", - 'Ntilde' => "\xC3\x91", - 'ntilde' => "\xC3\xB1", - 'Ntilde;' => "\xC3\x91", - 'ntilde;' => "\xC3\xB1", - 'Nu;' => "\xCE\x9D", - 'nu;' => "\xCE\xBD", - 'Oacute' => "\xC3\x93", - 'oacute' => "\xC3\xB3", - 'Oacute;' => "\xC3\x93", - 'oacute;' => "\xC3\xB3", - 'Ocirc' => "\xC3\x94", - 'ocirc' => "\xC3\xB4", - 'Ocirc;' => "\xC3\x94", - 'ocirc;' => "\xC3\xB4", - 'OElig;' => "\xC5\x92", - 'oelig;' => "\xC5\x93", - 'Ograve' => "\xC3\x92", - 'ograve' => "\xC3\xB2", - 'Ograve;' => "\xC3\x92", - 'ograve;' => "\xC3\xB2", - 'oline;' => "\xE2\x80\xBE", - 'Omega;' => "\xCE\xA9", - 'omega;' => "\xCF\x89", - 'Omicron;' => "\xCE\x9F", - 'omicron;' => "\xCE\xBF", - 'oplus;' => "\xE2\x8A\x95", - 'or;' => "\xE2\x88\xA8", - 'ordf' => "\xC2\xAA", - 'ordf;' => "\xC2\xAA", - 'ordm' => "\xC2\xBA", - 'ordm;' => "\xC2\xBA", - 'Oslash' => "\xC3\x98", - 'oslash' => "\xC3\xB8", - 'Oslash;' => "\xC3\x98", - 'oslash;' => "\xC3\xB8", - 'Otilde' => "\xC3\x95", - 'otilde' => "\xC3\xB5", - 'Otilde;' => "\xC3\x95", - 'otilde;' => "\xC3\xB5", - 'otimes;' => "\xE2\x8A\x97", - 'Ouml' => "\xC3\x96", - 'ouml' => "\xC3\xB6", - 'Ouml;' => "\xC3\x96", - 'ouml;' => "\xC3\xB6", - 'para' => "\xC2\xB6", - 'para;' => "\xC2\xB6", - 'part;' => "\xE2\x88\x82", - 'permil;' => "\xE2\x80\xB0", - 'perp;' => "\xE2\x8A\xA5", - 'Phi;' => "\xCE\xA6", - 'phi;' => "\xCF\x86", - 'Pi;' => "\xCE\xA0", - 'pi;' => "\xCF\x80", - 'piv;' => "\xCF\x96", - 'plusmn' => "\xC2\xB1", - 'plusmn;' => "\xC2\xB1", - 'pound' => "\xC2\xA3", - 'pound;' => "\xC2\xA3", - 'Prime;' => "\xE2\x80\xB3", - 'prime;' => "\xE2\x80\xB2", - 'prod;' => "\xE2\x88\x8F", - 'prop;' => "\xE2\x88\x9D", - 'Psi;' => "\xCE\xA8", - 'psi;' => "\xCF\x88", - 'QUOT' => "\x22", - 'quot' => "\x22", - 'QUOT;' => "\x22", - 'quot;' => "\x22", - 'radic;' => "\xE2\x88\x9A", - 'rang;' => "\xE3\x80\x89", - 'raquo' => "\xC2\xBB", - 'raquo;' => "\xC2\xBB", - 'rArr;' => "\xE2\x87\x92", - 'rarr;' => "\xE2\x86\x92", - 'rceil;' => "\xE2\x8C\x89", - 'rdquo;' => "\xE2\x80\x9D", - 'real;' => "\xE2\x84\x9C", - 'REG' => "\xC2\xAE", - 'reg' => "\xC2\xAE", - 'REG;' => "\xC2\xAE", - 'reg;' => "\xC2\xAE", - 'rfloor;' => "\xE2\x8C\x8B", - 'Rho;' => "\xCE\xA1", - 'rho;' => "\xCF\x81", - 'rlm;' => "\xE2\x80\x8F", - 'rsaquo;' => "\xE2\x80\xBA", - 'rsquo;' => "\xE2\x80\x99", - 'sbquo;' => "\xE2\x80\x9A", - 'Scaron;' => "\xC5\xA0", - 'scaron;' => "\xC5\xA1", - 'sdot;' => "\xE2\x8B\x85", - 'sect' => "\xC2\xA7", - 'sect;' => "\xC2\xA7", - 'shy' => "\xC2\xAD", - 'shy;' => "\xC2\xAD", - 'Sigma;' => "\xCE\xA3", - 'sigma;' => "\xCF\x83", - 'sigmaf;' => "\xCF\x82", - 'sim;' => "\xE2\x88\xBC", - 'spades;' => "\xE2\x99\xA0", - 'sub;' => "\xE2\x8A\x82", - 'sube;' => "\xE2\x8A\x86", - 'sum;' => "\xE2\x88\x91", - 'sup;' => "\xE2\x8A\x83", - 'sup1' => "\xC2\xB9", - 'sup1;' => "\xC2\xB9", - 'sup2' => "\xC2\xB2", - 'sup2;' => "\xC2\xB2", - 'sup3' => "\xC2\xB3", - 'sup3;' => "\xC2\xB3", - 'supe;' => "\xE2\x8A\x87", - 'szlig' => "\xC3\x9F", - 'szlig;' => "\xC3\x9F", - 'Tau;' => "\xCE\xA4", - 'tau;' => "\xCF\x84", - 'there4;' => "\xE2\x88\xB4", - 'Theta;' => "\xCE\x98", - 'theta;' => "\xCE\xB8", - 'thetasym;' => "\xCF\x91", - 'thinsp;' => "\xE2\x80\x89", - 'THORN' => "\xC3\x9E", - 'thorn' => "\xC3\xBE", - 'THORN;' => "\xC3\x9E", - 'thorn;' => "\xC3\xBE", - 'tilde;' => "\xCB\x9C", - 'times' => "\xC3\x97", - 'times;' => "\xC3\x97", - 'TRADE;' => "\xE2\x84\xA2", - 'trade;' => "\xE2\x84\xA2", - 'Uacute' => "\xC3\x9A", - 'uacute' => "\xC3\xBA", - 'Uacute;' => "\xC3\x9A", - 'uacute;' => "\xC3\xBA", - 'uArr;' => "\xE2\x87\x91", - 'uarr;' => "\xE2\x86\x91", - 'Ucirc' => "\xC3\x9B", - 'ucirc' => "\xC3\xBB", - 'Ucirc;' => "\xC3\x9B", - 'ucirc;' => "\xC3\xBB", - 'Ugrave' => "\xC3\x99", - 'ugrave' => "\xC3\xB9", - 'Ugrave;' => "\xC3\x99", - 'ugrave;' => "\xC3\xB9", - 'uml' => "\xC2\xA8", - 'uml;' => "\xC2\xA8", - 'upsih;' => "\xCF\x92", - 'Upsilon;' => "\xCE\xA5", - 'upsilon;' => "\xCF\x85", - 'Uuml' => "\xC3\x9C", - 'uuml' => "\xC3\xBC", - 'Uuml;' => "\xC3\x9C", - 'uuml;' => "\xC3\xBC", - 'weierp;' => "\xE2\x84\x98", - 'Xi;' => "\xCE\x9E", - 'xi;' => "\xCE\xBE", - 'Yacute' => "\xC3\x9D", - 'yacute' => "\xC3\xBD", - 'Yacute;' => "\xC3\x9D", - 'yacute;' => "\xC3\xBD", - 'yen' => "\xC2\xA5", - 'yen;' => "\xC2\xA5", - 'yuml' => "\xC3\xBF", - 'Yuml;' => "\xC5\xB8", - 'yuml;' => "\xC3\xBF", - 'Zeta;' => "\xCE\x96", - 'zeta;' => "\xCE\xB6", - 'zwj;' => "\xE2\x80\x8D", - 'zwnj;' => "\xE2\x80\x8C" - ); - - for ($i = 0, $match = null; $i < 9 && $this->consume() !== false; $i++) - { - $consumed = substr($this->consumed, 1); - if (isset($entities[$consumed])) - { - $match = $consumed; - } - } - - if ($match !== null) - { - $this->data = substr_replace($this->data, $entities[$match], $this->position - strlen($consumed) - 1, strlen($match) + 1); - $this->position += strlen($entities[$match]) - strlen($consumed) - 1; - } - break; - } - } -} - diff --git a/wp/wp-includes/SimplePie/Enclosure.php b/wp/wp-includes/SimplePie/Enclosure.php deleted file mode 100644 index 55674379..00000000 --- a/wp/wp-includes/SimplePie/Enclosure.php +++ /dev/null @@ -1,1380 +0,0 @@ -bitrate = $bitrate; - $this->captions = $captions; - $this->categories = $categories; - $this->channels = $channels; - $this->copyright = $copyright; - $this->credits = $credits; - $this->description = $description; - $this->duration = $duration; - $this->expression = $expression; - $this->framerate = $framerate; - $this->hashes = $hashes; - $this->height = $height; - $this->keywords = $keywords; - $this->lang = $lang; - $this->length = $length; - $this->link = $link; - $this->medium = $medium; - $this->player = $player; - $this->ratings = $ratings; - $this->restrictions = $restrictions; - $this->samplingrate = $samplingrate; - $this->thumbnails = $thumbnails; - $this->title = $title; - $this->type = $type; - $this->width = $width; - - if (class_exists('idna_convert')) - { - $idn = new idna_convert(); - $parsed = SimplePie_Misc::parse_url($link); - $this->link = SimplePie_Misc::compress_parse_url($parsed['scheme'], $idn->encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']); - } - $this->handler = $this->get_handler(); // Needs to load last - } - - /** - * String-ified version - * - * @return string - */ - public function __toString() - { - // There is no $this->data here - return md5(serialize($this)); - } - - /** - * Get the bitrate - * - * @return string|null - */ - public function get_bitrate() - { - if ($this->bitrate !== null) - { - return $this->bitrate; - } - else - { - return null; - } - } - - /** - * Get a single caption - * - * @param int $key - * @return SimplePie_Caption|null - */ - public function get_caption($key = 0) - { - $captions = $this->get_captions(); - if (isset($captions[$key])) - { - return $captions[$key]; - } - else - { - return null; - } - } - - /** - * Get all captions - * - * @return array|null Array of {@see SimplePie_Caption} objects - */ - public function get_captions() - { - if ($this->captions !== null) - { - return $this->captions; - } - else - { - return null; - } - } - - /** - * Get a single category - * - * @param int $key - * @return SimplePie_Category|null - */ - public function get_category($key = 0) - { - $categories = $this->get_categories(); - if (isset($categories[$key])) - { - return $categories[$key]; - } - else - { - return null; - } - } - - /** - * Get all categories - * - * @return array|null Array of {@see SimplePie_Category} objects - */ - public function get_categories() - { - if ($this->categories !== null) - { - return $this->categories; - } - else - { - return null; - } - } - - /** - * Get the number of audio channels - * - * @return int|null - */ - public function get_channels() - { - if ($this->channels !== null) - { - return $this->channels; - } - else - { - return null; - } - } - - /** - * Get the copyright information - * - * @return SimplePie_Copyright|null - */ - public function get_copyright() - { - if ($this->copyright !== null) - { - return $this->copyright; - } - else - { - return null; - } - } - - /** - * Get a single credit - * - * @param int $key - * @return SimplePie_Credit|null - */ - public function get_credit($key = 0) - { - $credits = $this->get_credits(); - if (isset($credits[$key])) - { - return $credits[$key]; - } - else - { - return null; - } - } - - /** - * Get all credits - * - * @return array|null Array of {@see SimplePie_Credit} objects - */ - public function get_credits() - { - if ($this->credits !== null) - { - return $this->credits; - } - else - { - return null; - } - } - - /** - * Get the description of the enclosure - * - * @return string|null - */ - public function get_description() - { - if ($this->description !== null) - { - return $this->description; - } - else - { - return null; - } - } - - /** - * Get the duration of the enclosure - * - * @param string $convert Convert seconds into hh:mm:ss - * @return string|int|null 'hh:mm:ss' string if `$convert` was specified, otherwise integer (or null if none found) - */ - public function get_duration($convert = false) - { - if ($this->duration !== null) - { - if ($convert) - { - $time = SimplePie_Misc::time_hms($this->duration); - return $time; - } - else - { - return $this->duration; - } - } - else - { - return null; - } - } - - /** - * Get the expression - * - * @return string Probably one of 'sample', 'full', 'nonstop', 'clip'. Defaults to 'full' - */ - public function get_expression() - { - if ($this->expression !== null) - { - return $this->expression; - } - else - { - return 'full'; - } - } - - /** - * Get the file extension - * - * @return string|null - */ - public function get_extension() - { - if ($this->link !== null) - { - $url = SimplePie_Misc::parse_url($this->link); - if ($url['path'] !== '') - { - return pathinfo($url['path'], PATHINFO_EXTENSION); - } - } - return null; - } - - /** - * Get the framerate (in frames-per-second) - * - * @return string|null - */ - public function get_framerate() - { - if ($this->framerate !== null) - { - return $this->framerate; - } - else - { - return null; - } - } - - /** - * Get the preferred handler - * - * @return string|null One of 'flash', 'fmedia', 'quicktime', 'wmedia', 'mp3' - */ - public function get_handler() - { - return $this->get_real_type(true); - } - - /** - * Get a single hash - * - * @link http://www.rssboard.org/media-rss#media-hash - * @param int $key - * @return string|null Hash as per `media:hash`, prefixed with "$algo:" - */ - public function get_hash($key = 0) - { - $hashes = $this->get_hashes(); - if (isset($hashes[$key])) - { - return $hashes[$key]; - } - else - { - return null; - } - } - - /** - * Get all credits - * - * @return array|null Array of strings, see {@see get_hash()} - */ - public function get_hashes() - { - if ($this->hashes !== null) - { - return $this->hashes; - } - else - { - return null; - } - } - - /** - * Get the height - * - * @return string|null - */ - public function get_height() - { - if ($this->height !== null) - { - return $this->height; - } - else - { - return null; - } - } - - /** - * Get the language - * - * @link http://tools.ietf.org/html/rfc3066 - * @return string|null Language code as per RFC 3066 - */ - public function get_language() - { - if ($this->lang !== null) - { - return $this->lang; - } - else - { - return null; - } - } - - /** - * Get a single keyword - * - * @param int $key - * @return string|null - */ - public function get_keyword($key = 0) - { - $keywords = $this->get_keywords(); - if (isset($keywords[$key])) - { - return $keywords[$key]; - } - else - { - return null; - } - } - - /** - * Get all keywords - * - * @return array|null Array of strings - */ - public function get_keywords() - { - if ($this->keywords !== null) - { - return $this->keywords; - } - else - { - return null; - } - } - - /** - * Get length - * - * @return float Length in bytes - */ - public function get_length() - { - if ($this->length !== null) - { - return $this->length; - } - else - { - return null; - } - } - - /** - * Get the URL - * - * @return string|null - */ - public function get_link() - { - if ($this->link !== null) - { - return urldecode($this->link); - } - else - { - return null; - } - } - - /** - * Get the medium - * - * @link http://www.rssboard.org/media-rss#media-content - * @return string|null Should be one of 'image', 'audio', 'video', 'document', 'executable' - */ - public function get_medium() - { - if ($this->medium !== null) - { - return $this->medium; - } - else - { - return null; - } - } - - /** - * Get the player URL - * - * Typically the same as {@see get_permalink()} - * @return string|null Player URL - */ - public function get_player() - { - if ($this->player !== null) - { - return $this->player; - } - else - { - return null; - } - } - - /** - * Get a single rating - * - * @param int $key - * @return SimplePie_Rating|null - */ - public function get_rating($key = 0) - { - $ratings = $this->get_ratings(); - if (isset($ratings[$key])) - { - return $ratings[$key]; - } - else - { - return null; - } - } - - /** - * Get all ratings - * - * @return array|null Array of {@see SimplePie_Rating} objects - */ - public function get_ratings() - { - if ($this->ratings !== null) - { - return $this->ratings; - } - else - { - return null; - } - } - - /** - * Get a single restriction - * - * @param int $key - * @return SimplePie_Restriction|null - */ - public function get_restriction($key = 0) - { - $restrictions = $this->get_restrictions(); - if (isset($restrictions[$key])) - { - return $restrictions[$key]; - } - else - { - return null; - } - } - - /** - * Get all restrictions - * - * @return array|null Array of {@see SimplePie_Restriction} objects - */ - public function get_restrictions() - { - if ($this->restrictions !== null) - { - return $this->restrictions; - } - else - { - return null; - } - } - - /** - * Get the sampling rate (in kHz) - * - * @return string|null - */ - public function get_sampling_rate() - { - if ($this->samplingrate !== null) - { - return $this->samplingrate; - } - else - { - return null; - } - } - - /** - * Get the file size (in MiB) - * - * @return float|null File size in mebibytes (1048 bytes) - */ - public function get_size() - { - $length = $this->get_length(); - if ($length !== null) - { - return round($length/1048576, 2); - } - else - { - return null; - } - } - - /** - * Get a single thumbnail - * - * @param int $key - * @return string|null Thumbnail URL - */ - public function get_thumbnail($key = 0) - { - $thumbnails = $this->get_thumbnails(); - if (isset($thumbnails[$key])) - { - return $thumbnails[$key]; - } - else - { - return null; - } - } - - /** - * Get all thumbnails - * - * @return array|null Array of thumbnail URLs - */ - public function get_thumbnails() - { - if ($this->thumbnails !== null) - { - return $this->thumbnails; - } - else - { - return null; - } - } - - /** - * Get the title - * - * @return string|null - */ - public function get_title() - { - if ($this->title !== null) - { - return $this->title; - } - else - { - return null; - } - } - - /** - * Get mimetype of the enclosure - * - * @see get_real_type() - * @return string|null MIME type - */ - public function get_type() - { - if ($this->type !== null) - { - return $this->type; - } - else - { - return null; - } - } - - /** - * Get the width - * - * @return string|null - */ - public function get_width() - { - if ($this->width !== null) - { - return $this->width; - } - else - { - return null; - } - } - - /** - * Embed the enclosure using `` - * - * @deprecated Use the second parameter to {@see embed} instead - * - * @param array|string $options See first paramter to {@see embed} - * @return string HTML string to output - */ - public function native_embed($options='') - { - return $this->embed($options, true); - } - - /** - * Embed the enclosure using Javascript - * - * `$options` is an array or comma-separated key:value string, with the - * following properties: - * - * - `alt` (string): Alternate content for when an end-user does not have - * the appropriate handler installed or when a file type is - * unsupported. Can be any text or HTML. Defaults to blank. - * - `altclass` (string): If a file type is unsupported, the end-user will - * see the alt text (above) linked directly to the content. That link - * will have this value as its class name. Defaults to blank. - * - `audio` (string): This is an image that should be used as a - * placeholder for audio files before they're loaded (QuickTime-only). - * Can be any relative or absolute URL. Defaults to blank. - * - `bgcolor` (string): The background color for the media, if not - * already transparent. Defaults to `#ffffff`. - * - `height` (integer): The height of the embedded media. Accepts any - * numeric pixel value (such as `360`) or `auto`. Defaults to `auto`, - * and it is recommended that you use this default. - * - `loop` (boolean): Do you want the media to loop when its done? - * Defaults to `false`. - * - `mediaplayer` (string): The location of the included - * `mediaplayer.swf` file. This allows for the playback of Flash Video - * (`.flv`) files, and is the default handler for non-Odeo MP3's. - * Defaults to blank. - * - `video` (string): This is an image that should be used as a - * placeholder for video files before they're loaded (QuickTime-only). - * Can be any relative or absolute URL. Defaults to blank. - * - `width` (integer): The width of the embedded media. Accepts any - * numeric pixel value (such as `480`) or `auto`. Defaults to `auto`, - * and it is recommended that you use this default. - * - `widescreen` (boolean): Is the enclosure widescreen or standard? - * This applies only to video enclosures, and will automatically resize - * the content appropriately. Defaults to `false`, implying 4:3 mode. - * - * Note: Non-widescreen (4:3) mode with `width` and `height` set to `auto` - * will default to 480x360 video resolution. Widescreen (16:9) mode with - * `width` and `height` set to `auto` will default to 480x270 video resolution. - * - * @todo If the dimensions for media:content are defined, use them when width/height are set to 'auto'. - * @param array|string $options Comma-separated key:value list, or array - * @param bool $native Use `` - * @return string HTML string to output - */ - public function embed($options = '', $native = false) - { - // Set up defaults - $audio = ''; - $video = ''; - $alt = ''; - $altclass = ''; - $loop = 'false'; - $width = 'auto'; - $height = 'auto'; - $bgcolor = '#ffffff'; - $mediaplayer = ''; - $widescreen = false; - $handler = $this->get_handler(); - $type = $this->get_real_type(); - - // Process options and reassign values as necessary - if (is_array($options)) - { - extract($options); - } - else - { - $options = explode(',', $options); - foreach($options as $option) - { - $opt = explode(':', $option, 2); - if (isset($opt[0], $opt[1])) - { - $opt[0] = trim($opt[0]); - $opt[1] = trim($opt[1]); - switch ($opt[0]) - { - case 'audio': - $audio = $opt[1]; - break; - - case 'video': - $video = $opt[1]; - break; - - case 'alt': - $alt = $opt[1]; - break; - - case 'altclass': - $altclass = $opt[1]; - break; - - case 'loop': - $loop = $opt[1]; - break; - - case 'width': - $width = $opt[1]; - break; - - case 'height': - $height = $opt[1]; - break; - - case 'bgcolor': - $bgcolor = $opt[1]; - break; - - case 'mediaplayer': - $mediaplayer = $opt[1]; - break; - - case 'widescreen': - $widescreen = $opt[1]; - break; - } - } - } - } - - $mime = explode('/', $type, 2); - $mime = $mime[0]; - - // Process values for 'auto' - if ($width === 'auto') - { - if ($mime === 'video') - { - if ($height === 'auto') - { - $width = 480; - } - elseif ($widescreen) - { - $width = round((intval($height)/9)*16); - } - else - { - $width = round((intval($height)/3)*4); - } - } - else - { - $width = '100%'; - } - } - - if ($height === 'auto') - { - if ($mime === 'audio') - { - $height = 0; - } - elseif ($mime === 'video') - { - if ($width === 'auto') - { - if ($widescreen) - { - $height = 270; - } - else - { - $height = 360; - } - } - elseif ($widescreen) - { - $height = round((intval($width)/16)*9); - } - else - { - $height = round((intval($width)/4)*3); - } - } - else - { - $height = 376; - } - } - elseif ($mime === 'audio') - { - $height = 0; - } - - // Set proper placeholder value - if ($mime === 'audio') - { - $placeholder = $audio; - } - elseif ($mime === 'video') - { - $placeholder = $video; - } - - $embed = ''; - - // Flash - if ($handler === 'flash') - { - if ($native) - { - $embed .= "get_link() . "\" pluginspage=\"http://adobe.com/go/getflashplayer\" type=\"$type\" quality=\"high\" width=\"$width\" height=\"$height\" bgcolor=\"$bgcolor\" loop=\"$loop\">"; - } - else - { - $embed .= ""; - } - } - - // Flash Media Player file types. - // Preferred handler for MP3 file types. - elseif ($handler === 'fmedia' || ($handler === 'mp3' && $mediaplayer !== '')) - { - $height += 20; - if ($native) - { - $embed .= "get_link().'?file_extension=.'.$this->get_extension()) . "&autostart=false&repeat=$loop&showdigits=true&showfsbutton=false\">"; - } - else - { - $embed .= ""; - } - } - - // QuickTime 7 file types. Need to test with QuickTime 6. - // Only handle MP3's if the Flash Media Player is not present. - elseif ($handler === 'quicktime' || ($handler === 'mp3' && $mediaplayer === '')) - { - $height += 16; - if ($native) - { - if ($placeholder !== '') - { - $embed .= "get_link() . "\" src=\"$placeholder\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"false\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\">"; - } - else - { - $embed .= "get_link() . "\" width=\"$width\" height=\"$height\" autoplay=\"false\" target=\"myself\" controller=\"true\" loop=\"$loop\" scale=\"aspect\" bgcolor=\"$bgcolor\" pluginspage=\"http://apple.com/quicktime/download/\">"; - } - } - else - { - $embed .= ""; - } - } - - // Windows Media - elseif ($handler === 'wmedia') - { - $height += 45; - if ($native) - { - $embed .= "get_link() . "\" autosize=\"1\" width=\"$width\" height=\"$height\" showcontrols=\"1\" showstatusbar=\"0\" showdisplay=\"0\" autostart=\"0\">"; - } - else - { - $embed .= ""; - } - } - - // Everything else - else $embed .= '' . $alt . ''; - - return $embed; - } - - /** - * Get the real media type - * - * Often, feeds lie to us, necessitating a bit of deeper inspection. This - * converts types to their canonical representations based on the file - * extension - * - * @see get_type() - * @param bool $find_handler Internal use only, use {@see get_handler()} instead - * @return string MIME type - */ - public function get_real_type($find_handler = false) - { - // Mime-types by handler. - $types_flash = array('application/x-shockwave-flash', 'application/futuresplash'); // Flash - $types_fmedia = array('video/flv', 'video/x-flv','flv-application/octet-stream'); // Flash Media Player - $types_quicktime = array('audio/3gpp', 'audio/3gpp2', 'audio/aac', 'audio/x-aac', 'audio/aiff', 'audio/x-aiff', 'audio/mid', 'audio/midi', 'audio/x-midi', 'audio/mp4', 'audio/m4a', 'audio/x-m4a', 'audio/wav', 'audio/x-wav', 'video/3gpp', 'video/3gpp2', 'video/m4v', 'video/x-m4v', 'video/mp4', 'video/mpeg', 'video/x-mpeg', 'video/quicktime', 'video/sd-video'); // QuickTime - $types_wmedia = array('application/asx', 'application/x-mplayer2', 'audio/x-ms-wma', 'audio/x-ms-wax', 'video/x-ms-asf-plugin', 'video/x-ms-asf', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-ms-wvx'); // Windows Media - $types_mp3 = array('audio/mp3', 'audio/x-mp3', 'audio/mpeg', 'audio/x-mpeg'); // MP3 - - if ($this->get_type() !== null) - { - $type = strtolower($this->type); - } - else - { - $type = null; - } - - // If we encounter an unsupported mime-type, check the file extension and guess intelligently. - if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3))) - { - switch (strtolower($this->get_extension())) - { - // Audio mime-types - case 'aac': - case 'adts': - $type = 'audio/acc'; - break; - - case 'aif': - case 'aifc': - case 'aiff': - case 'cdda': - $type = 'audio/aiff'; - break; - - case 'bwf': - $type = 'audio/wav'; - break; - - case 'kar': - case 'mid': - case 'midi': - case 'smf': - $type = 'audio/midi'; - break; - - case 'm4a': - $type = 'audio/x-m4a'; - break; - - case 'mp3': - case 'swa': - $type = 'audio/mp3'; - break; - - case 'wav': - $type = 'audio/wav'; - break; - - case 'wax': - $type = 'audio/x-ms-wax'; - break; - - case 'wma': - $type = 'audio/x-ms-wma'; - break; - - // Video mime-types - case '3gp': - case '3gpp': - $type = 'video/3gpp'; - break; - - case '3g2': - case '3gp2': - $type = 'video/3gpp2'; - break; - - case 'asf': - $type = 'video/x-ms-asf'; - break; - - case 'flv': - $type = 'video/x-flv'; - break; - - case 'm1a': - case 'm1s': - case 'm1v': - case 'm15': - case 'm75': - case 'mp2': - case 'mpa': - case 'mpeg': - case 'mpg': - case 'mpm': - case 'mpv': - $type = 'video/mpeg'; - break; - - case 'm4v': - $type = 'video/x-m4v'; - break; - - case 'mov': - case 'qt': - $type = 'video/quicktime'; - break; - - case 'mp4': - case 'mpg4': - $type = 'video/mp4'; - break; - - case 'sdv': - $type = 'video/sd-video'; - break; - - case 'wm': - $type = 'video/x-ms-wm'; - break; - - case 'wmv': - $type = 'video/x-ms-wmv'; - break; - - case 'wvx': - $type = 'video/x-ms-wvx'; - break; - - // Flash mime-types - case 'spl': - $type = 'application/futuresplash'; - break; - - case 'swf': - $type = 'application/x-shockwave-flash'; - break; - } - } - - if ($find_handler) - { - if (in_array($type, $types_flash)) - { - return 'flash'; - } - elseif (in_array($type, $types_fmedia)) - { - return 'fmedia'; - } - elseif (in_array($type, $types_quicktime)) - { - return 'quicktime'; - } - elseif (in_array($type, $types_wmedia)) - { - return 'wmedia'; - } - elseif (in_array($type, $types_mp3)) - { - return 'mp3'; - } - else - { - return null; - } - } - else - { - return $type; - } - } -} - diff --git a/wp/wp-includes/SimplePie/Exception.php b/wp/wp-includes/SimplePie/Exception.php deleted file mode 100644 index 73e104d6..00000000 --- a/wp/wp-includes/SimplePie/Exception.php +++ /dev/null @@ -1,52 +0,0 @@ -encode($parsed['authority']), $parsed['path'], $parsed['query'], $parsed['fragment']); - } - $this->url = $url; - $this->useragent = $useragent; - if (preg_match('/^http(s)?:\/\//i', $url)) - { - if ($useragent === null) - { - $useragent = ini_get('user_agent'); - $this->useragent = $useragent; - } - if (!is_array($headers)) - { - $headers = array(); - } - if (!$force_fsockopen && function_exists('curl_exec')) - { - $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_CURL; - $fp = curl_init(); - $headers2 = array(); - foreach ($headers as $key => $value) - { - $headers2[] = "$key: $value"; - } - if (version_compare(SimplePie_Misc::get_curl_version(), '7.10.5', '>=')) - { - curl_setopt($fp, CURLOPT_ENCODING, ''); - } - curl_setopt($fp, CURLOPT_URL, $url); - curl_setopt($fp, CURLOPT_HEADER, 1); - curl_setopt($fp, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($fp, CURLOPT_TIMEOUT, $timeout); - curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout); - curl_setopt($fp, CURLOPT_REFERER, $url); - curl_setopt($fp, CURLOPT_USERAGENT, $useragent); - curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2); - if (!ini_get('open_basedir') && !ini_get('safe_mode') && version_compare(SimplePie_Misc::get_curl_version(), '7.15.2', '>=')) - { - curl_setopt($fp, CURLOPT_FOLLOWLOCATION, 1); - curl_setopt($fp, CURLOPT_MAXREDIRS, $redirects); - } - - $this->headers = curl_exec($fp); - if (curl_errno($fp) === 23 || curl_errno($fp) === 61) - { - curl_setopt($fp, CURLOPT_ENCODING, 'none'); - $this->headers = curl_exec($fp); - } - if (curl_errno($fp)) - { - $this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp); - $this->success = false; - } - else - { - $info = curl_getinfo($fp); - curl_close($fp); - $this->headers = explode("\r\n\r\n", $this->headers, $info['redirect_count'] + 1); - $this->headers = array_pop($this->headers); - $parser = new SimplePie_HTTP_Parser($this->headers); - if ($parser->parse()) - { - $this->headers = $parser->headers; - $this->body = $parser->body; - $this->status_code = $parser->status_code; - if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) - { - $this->redirects++; - $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url); - return $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen); - } - } - } - } - else - { - $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE | SIMPLEPIE_FILE_SOURCE_FSOCKOPEN; - $url_parts = parse_url($url); - $socket_host = $url_parts['host']; - if (isset($url_parts['scheme']) && strtolower($url_parts['scheme']) === 'https') - { - $socket_host = "ssl://$url_parts[host]"; - $url_parts['port'] = 443; - } - if (!isset($url_parts['port'])) - { - $url_parts['port'] = 80; - } - $fp = @fsockopen($socket_host, $url_parts['port'], $errno, $errstr, $timeout); - if (!$fp) - { - $this->error = 'fsockopen error: ' . $errstr; - $this->success = false; - } - else - { - stream_set_timeout($fp, $timeout); - if (isset($url_parts['path'])) - { - if (isset($url_parts['query'])) - { - $get = "$url_parts[path]?$url_parts[query]"; - } - else - { - $get = $url_parts['path']; - } - } - else - { - $get = '/'; - } - $out = "GET $get HTTP/1.1\r\n"; - $out .= "Host: $url_parts[host]\r\n"; - $out .= "User-Agent: $useragent\r\n"; - if (extension_loaded('zlib')) - { - $out .= "Accept-Encoding: x-gzip,gzip,deflate\r\n"; - } - - if (isset($url_parts['user']) && isset($url_parts['pass'])) - { - $out .= "Authorization: Basic " . base64_encode("$url_parts[user]:$url_parts[pass]") . "\r\n"; - } - foreach ($headers as $key => $value) - { - $out .= "$key: $value\r\n"; - } - $out .= "Connection: Close\r\n\r\n"; - fwrite($fp, $out); - - $info = stream_get_meta_data($fp); - - $this->headers = ''; - while (!$info['eof'] && !$info['timed_out']) - { - $this->headers .= fread($fp, 1160); - $info = stream_get_meta_data($fp); - } - if (!$info['timed_out']) - { - $parser = new SimplePie_HTTP_Parser($this->headers); - if ($parser->parse()) - { - $this->headers = $parser->headers; - $this->body = $parser->body; - $this->status_code = $parser->status_code; - if ((in_array($this->status_code, array(300, 301, 302, 303, 307)) || $this->status_code > 307 && $this->status_code < 400) && isset($this->headers['location']) && $this->redirects < $redirects) - { - $this->redirects++; - $location = SimplePie_Misc::absolutize_url($this->headers['location'], $url); - return $this->__construct($location, $timeout, $redirects, $headers, $useragent, $force_fsockopen); - } - if (isset($this->headers['content-encoding'])) - { - // Hey, we act dumb elsewhere, so let's do that here too - switch (strtolower(trim($this->headers['content-encoding'], "\x09\x0A\x0D\x20"))) - { - case 'gzip': - case 'x-gzip': - $decoder = new SimplePie_gzdecode($this->body); - if (!$decoder->parse()) - { - $this->error = 'Unable to decode HTTP "gzip" stream'; - $this->success = false; - } - else - { - $this->body = $decoder->data; - } - break; - - case 'deflate': - if (($decompressed = gzinflate($this->body)) !== false) - { - $this->body = $decompressed; - } - else if (($decompressed = gzuncompress($this->body)) !== false) - { - $this->body = $decompressed; - } - else if (function_exists('gzdecode') && ($decompressed = gzdecode($this->body)) !== false) - { - $this->body = $decompressed; - } - else - { - $this->error = 'Unable to decode HTTP "deflate" stream'; - $this->success = false; - } - break; - - default: - $this->error = 'Unknown content coding'; - $this->success = false; - } - } - } - } - else - { - $this->error = 'fsocket timed out'; - $this->success = false; - } - fclose($fp); - } - } - } - else - { - $this->method = SIMPLEPIE_FILE_SOURCE_LOCAL | SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS; - if (!$this->body = file_get_contents($url)) - { - $this->error = 'file_get_contents could not read the file'; - $this->success = false; - } - } - } -} diff --git a/wp/wp-includes/SimplePie/HTTP/Parser.php b/wp/wp-includes/SimplePie/HTTP/Parser.php deleted file mode 100644 index bff2222b..00000000 --- a/wp/wp-includes/SimplePie/HTTP/Parser.php +++ /dev/null @@ -1,500 +0,0 @@ -data = $data; - $this->data_length = strlen($this->data); - } - - /** - * Parse the input data - * - * @return bool true on success, false on failure - */ - public function parse() - { - while ($this->state && $this->state !== 'emit' && $this->has_data()) - { - $state = $this->state; - $this->$state(); - } - $this->data = ''; - if ($this->state === 'emit' || $this->state === 'body') - { - return true; - } - else - { - $this->http_version = ''; - $this->status_code = ''; - $this->reason = ''; - $this->headers = array(); - $this->body = ''; - return false; - } - } - - /** - * Check whether there is data beyond the pointer - * - * @return bool true if there is further data, false if not - */ - protected function has_data() - { - return (bool) ($this->position < $this->data_length); - } - - /** - * See if the next character is LWS - * - * @return bool true if the next character is LWS, false if not - */ - protected function is_linear_whitespace() - { - return (bool) ($this->data[$this->position] === "\x09" - || $this->data[$this->position] === "\x20" - || ($this->data[$this->position] === "\x0A" - && isset($this->data[$this->position + 1]) - && ($this->data[$this->position + 1] === "\x09" || $this->data[$this->position + 1] === "\x20"))); - } - - /** - * Parse the HTTP version - */ - protected function http_version() - { - if (strpos($this->data, "\x0A") !== false && strtoupper(substr($this->data, 0, 5)) === 'HTTP/') - { - $len = strspn($this->data, '0123456789.', 5); - $this->http_version = substr($this->data, 5, $len); - $this->position += 5 + $len; - if (substr_count($this->http_version, '.') <= 1) - { - $this->http_version = (float) $this->http_version; - $this->position += strspn($this->data, "\x09\x20", $this->position); - $this->state = 'status'; - } - else - { - $this->state = false; - } - } - else - { - $this->state = false; - } - } - - /** - * Parse the status code - */ - protected function status() - { - if ($len = strspn($this->data, '0123456789', $this->position)) - { - $this->status_code = (int) substr($this->data, $this->position, $len); - $this->position += $len; - $this->state = 'reason'; - } - else - { - $this->state = false; - } - } - - /** - * Parse the reason phrase - */ - protected function reason() - { - $len = strcspn($this->data, "\x0A", $this->position); - $this->reason = trim(substr($this->data, $this->position, $len), "\x09\x0D\x20"); - $this->position += $len + 1; - $this->state = 'new_line'; - } - - /** - * Deal with a new line, shifting data around as needed - */ - protected function new_line() - { - $this->value = trim($this->value, "\x0D\x20"); - if ($this->name !== '' && $this->value !== '') - { - $this->name = strtolower($this->name); - // We should only use the last Content-Type header. c.f. issue #1 - if (isset($this->headers[$this->name]) && $this->name !== 'content-type') - { - $this->headers[$this->name] .= ', ' . $this->value; - } - else - { - $this->headers[$this->name] = $this->value; - } - } - $this->name = ''; - $this->value = ''; - if (substr($this->data[$this->position], 0, 2) === "\x0D\x0A") - { - $this->position += 2; - $this->state = 'body'; - } - elseif ($this->data[$this->position] === "\x0A") - { - $this->position++; - $this->state = 'body'; - } - else - { - $this->state = 'name'; - } - } - - /** - * Parse a header name - */ - protected function name() - { - $len = strcspn($this->data, "\x0A:", $this->position); - if (isset($this->data[$this->position + $len])) - { - if ($this->data[$this->position + $len] === "\x0A") - { - $this->position += $len; - $this->state = 'new_line'; - } - else - { - $this->name = substr($this->data, $this->position, $len); - $this->position += $len + 1; - $this->state = 'value'; - } - } - else - { - $this->state = false; - } - } - - /** - * Parse LWS, replacing consecutive LWS characters with a single space - */ - protected function linear_whitespace() - { - do - { - if (substr($this->data, $this->position, 2) === "\x0D\x0A") - { - $this->position += 2; - } - elseif ($this->data[$this->position] === "\x0A") - { - $this->position++; - } - $this->position += strspn($this->data, "\x09\x20", $this->position); - } while ($this->has_data() && $this->is_linear_whitespace()); - $this->value .= "\x20"; - } - - /** - * See what state to move to while within non-quoted header values - */ - protected function value() - { - if ($this->is_linear_whitespace()) - { - $this->linear_whitespace(); - } - else - { - switch ($this->data[$this->position]) - { - case '"': - // Workaround for ETags: we have to include the quotes as - // part of the tag. - if (strtolower($this->name) === 'etag') - { - $this->value .= '"'; - $this->position++; - $this->state = 'value_char'; - break; - } - $this->position++; - $this->state = 'quote'; - break; - - case "\x0A": - $this->position++; - $this->state = 'new_line'; - break; - - default: - $this->state = 'value_char'; - break; - } - } - } - - /** - * Parse a header value while outside quotes - */ - protected function value_char() - { - $len = strcspn($this->data, "\x09\x20\x0A\"", $this->position); - $this->value .= substr($this->data, $this->position, $len); - $this->position += $len; - $this->state = 'value'; - } - - /** - * See what state to move to while within quoted header values - */ - protected function quote() - { - if ($this->is_linear_whitespace()) - { - $this->linear_whitespace(); - } - else - { - switch ($this->data[$this->position]) - { - case '"': - $this->position++; - $this->state = 'value'; - break; - - case "\x0A": - $this->position++; - $this->state = 'new_line'; - break; - - case '\\': - $this->position++; - $this->state = 'quote_escaped'; - break; - - default: - $this->state = 'quote_char'; - break; - } - } - } - - /** - * Parse a header value while within quotes - */ - protected function quote_char() - { - $len = strcspn($this->data, "\x09\x20\x0A\"\\", $this->position); - $this->value .= substr($this->data, $this->position, $len); - $this->position += $len; - $this->state = 'value'; - } - - /** - * Parse an escaped character within quotes - */ - protected function quote_escaped() - { - $this->value .= $this->data[$this->position]; - $this->position++; - $this->state = 'quote'; - } - - /** - * Parse the body - */ - protected function body() - { - $this->body = substr($this->data, $this->position); - if (!empty($this->headers['transfer-encoding'])) - { - unset($this->headers['transfer-encoding']); - $this->state = 'chunked'; - } - else - { - $this->state = 'emit'; - } - } - - /** - * Parsed a "Transfer-Encoding: chunked" body - */ - protected function chunked() - { - if (!preg_match('/^([0-9a-f]+)[^\r\n]*\r\n/i', trim($this->body))) - { - $this->state = 'emit'; - return; - } - - $decoded = ''; - $encoded = $this->body; - - while (true) - { - $is_chunked = (bool) preg_match( '/^([0-9a-f]+)[^\r\n]*\r\n/i', $encoded, $matches ); - if (!$is_chunked) - { - // Looks like it's not chunked after all - $this->state = 'emit'; - return; - } - - $length = hexdec(trim($matches[1])); - if ($length === 0) - { - // Ignore trailer headers - $this->state = 'emit'; - $this->body = $decoded; - return; - } - - $chunk_length = strlen($matches[0]); - $decoded .= $part = substr($encoded, $chunk_length, $length); - $encoded = substr($encoded, $chunk_length + $length + 2); - - if (trim($encoded) === '0' || empty($encoded)) - { - $this->state = 'emit'; - $this->body = $decoded; - return; - } - } - } -} diff --git a/wp/wp-includes/SimplePie/IRI.php b/wp/wp-includes/SimplePie/IRI.php deleted file mode 100644 index d3198c04..00000000 --- a/wp/wp-includes/SimplePie/IRI.php +++ /dev/null @@ -1,1238 +0,0 @@ - array( - 'port' => 674 - ), - 'dict' => array( - 'port' => 2628 - ), - 'file' => array( - 'ihost' => 'localhost' - ), - 'http' => array( - 'port' => 80, - 'ipath' => '/' - ), - 'https' => array( - 'port' => 443, - 'ipath' => '/' - ), - ); - - /** - * Return the entire IRI when you try and read the object as a string - * - * @return string - */ - public function __toString() - { - return $this->get_iri(); - } - - /** - * Overload __set() to provide access via properties - * - * @param string $name Property name - * @param mixed $value Property value - */ - public function __set($name, $value) - { - if (method_exists($this, 'set_' . $name)) - { - call_user_func(array($this, 'set_' . $name), $value); - } - elseif ( - $name === 'iauthority' - || $name === 'iuserinfo' - || $name === 'ihost' - || $name === 'ipath' - || $name === 'iquery' - || $name === 'ifragment' - ) - { - call_user_func(array($this, 'set_' . substr($name, 1)), $value); - } - } - - /** - * Overload __get() to provide access via properties - * - * @param string $name Property name - * @return mixed - */ - public function __get($name) - { - // isset() returns false for null, we don't want to do that - // Also why we use array_key_exists below instead of isset() - $props = get_object_vars($this); - - if ( - $name === 'iri' || - $name === 'uri' || - $name === 'iauthority' || - $name === 'authority' - ) - { - $return = $this->{"get_$name"}(); - } - elseif (array_key_exists($name, $props)) - { - $return = $this->$name; - } - // host -> ihost - elseif (($prop = 'i' . $name) && array_key_exists($prop, $props)) - { - $name = $prop; - $return = $this->$prop; - } - // ischeme -> scheme - elseif (($prop = substr($name, 1)) && array_key_exists($prop, $props)) - { - $name = $prop; - $return = $this->$prop; - } - else - { - trigger_error('Undefined property: ' . get_class($this) . '::' . $name, E_USER_NOTICE); - $return = null; - } - - if ($return === null && isset($this->normalization[$this->scheme][$name])) - { - return $this->normalization[$this->scheme][$name]; - } - else - { - return $return; - } - } - - /** - * Overload __isset() to provide access via properties - * - * @param string $name Property name - * @return bool - */ - public function __isset($name) - { - if (method_exists($this, 'get_' . $name) || isset($this->$name)) - { - return true; - } - else - { - return false; - } - } - - /** - * Overload __unset() to provide access via properties - * - * @param string $name Property name - */ - public function __unset($name) - { - if (method_exists($this, 'set_' . $name)) - { - call_user_func(array($this, 'set_' . $name), ''); - } - } - - /** - * Create a new IRI object, from a specified string - * - * @param string $iri - */ - public function __construct($iri = null) - { - $this->set_iri($iri); - } - - /** - * Create a new IRI object by resolving a relative IRI - * - * Returns false if $base is not absolute, otherwise an IRI. - * - * @param IRI|string $base (Absolute) Base IRI - * @param IRI|string $relative Relative IRI - * @return IRI|false - */ - public static function absolutize($base, $relative) - { - if (!($relative instanceof SimplePie_IRI)) - { - $relative = new SimplePie_IRI($relative); - } - if (!$relative->is_valid()) - { - return false; - } - elseif ($relative->scheme !== null) - { - return clone $relative; - } - else - { - if (!($base instanceof SimplePie_IRI)) - { - $base = new SimplePie_IRI($base); - } - if ($base->scheme !== null && $base->is_valid()) - { - if ($relative->get_iri() !== '') - { - if ($relative->iuserinfo !== null || $relative->ihost !== null || $relative->port !== null) - { - $target = clone $relative; - $target->scheme = $base->scheme; - } - else - { - $target = new SimplePie_IRI; - $target->scheme = $base->scheme; - $target->iuserinfo = $base->iuserinfo; - $target->ihost = $base->ihost; - $target->port = $base->port; - if ($relative->ipath !== '') - { - if ($relative->ipath[0] === '/') - { - $target->ipath = $relative->ipath; - } - elseif (($base->iuserinfo !== null || $base->ihost !== null || $base->port !== null) && $base->ipath === '') - { - $target->ipath = '/' . $relative->ipath; - } - elseif (($last_segment = strrpos($base->ipath, '/')) !== false) - { - $target->ipath = substr($base->ipath, 0, $last_segment + 1) . $relative->ipath; - } - else - { - $target->ipath = $relative->ipath; - } - $target->ipath = $target->remove_dot_segments($target->ipath); - $target->iquery = $relative->iquery; - } - else - { - $target->ipath = $base->ipath; - if ($relative->iquery !== null) - { - $target->iquery = $relative->iquery; - } - elseif ($base->iquery !== null) - { - $target->iquery = $base->iquery; - } - } - $target->ifragment = $relative->ifragment; - } - } - else - { - $target = clone $base; - $target->ifragment = null; - } - $target->scheme_normalization(); - return $target; - } - else - { - return false; - } - } - } - - /** - * Parse an IRI into scheme/authority/path/query/fragment segments - * - * @param string $iri - * @return array - */ - protected function parse_iri($iri) - { - $iri = trim($iri, "\x20\x09\x0A\x0C\x0D"); - if (preg_match('/^((?P[^:\/?#]+):)?(\/\/(?P[^\/?#]*))?(?P[^?#]*)(\?(?P[^#]*))?(#(?P.*))?$/', $iri, $match)) - { - if ($match[1] === '') - { - $match['scheme'] = null; - } - if (!isset($match[3]) || $match[3] === '') - { - $match['authority'] = null; - } - if (!isset($match[5])) - { - $match['path'] = ''; - } - if (!isset($match[6]) || $match[6] === '') - { - $match['query'] = null; - } - if (!isset($match[8]) || $match[8] === '') - { - $match['fragment'] = null; - } - return $match; - } - else - { - // This can occur when a paragraph is accidentally parsed as a URI - return false; - } - } - - /** - * Remove dot segments from a path - * - * @param string $input - * @return string - */ - protected function remove_dot_segments($input) - { - $output = ''; - while (strpos($input, './') !== false || strpos($input, '/.') !== false || $input === '.' || $input === '..') - { - // A: If the input buffer begins with a prefix of "../" or "./", then remove that prefix from the input buffer; otherwise, - if (strpos($input, '../') === 0) - { - $input = substr($input, 3); - } - elseif (strpos($input, './') === 0) - { - $input = substr($input, 2); - } - // B: if the input buffer begins with a prefix of "/./" or "/.", where "." is a complete path segment, then replace that prefix with "/" in the input buffer; otherwise, - elseif (strpos($input, '/./') === 0) - { - $input = substr($input, 2); - } - elseif ($input === '/.') - { - $input = '/'; - } - // C: if the input buffer begins with a prefix of "/../" or "/..", where ".." is a complete path segment, then replace that prefix with "/" in the input buffer and remove the last segment and its preceding "/" (if any) from the output buffer; otherwise, - elseif (strpos($input, '/../') === 0) - { - $input = substr($input, 3); - $output = substr_replace($output, '', strrpos($output, '/')); - } - elseif ($input === '/..') - { - $input = '/'; - $output = substr_replace($output, '', strrpos($output, '/')); - } - // D: if the input buffer consists only of "." or "..", then remove that from the input buffer; otherwise, - elseif ($input === '.' || $input === '..') - { - $input = ''; - } - // E: move the first path segment in the input buffer to the end of the output buffer, including the initial "/" character (if any) and any subsequent characters up to, but not including, the next "/" character or the end of the input buffer - elseif (($pos = strpos($input, '/', 1)) !== false) - { - $output .= substr($input, 0, $pos); - $input = substr_replace($input, '', 0, $pos); - } - else - { - $output .= $input; - $input = ''; - } - } - return $output . $input; - } - - /** - * Replace invalid character with percent encoding - * - * @param string $string Input string - * @param string $extra_chars Valid characters not in iunreserved or - * iprivate (this is ASCII-only) - * @param bool $iprivate Allow iprivate - * @return string - */ - protected function replace_invalid_with_pct_encoding($string, $extra_chars, $iprivate = false) - { - // Normalize as many pct-encoded sections as possible - $string = preg_replace_callback('/(?:%[A-Fa-f0-9]{2})+/', array($this, 'remove_iunreserved_percent_encoded'), $string); - - // Replace invalid percent characters - $string = preg_replace('/%(?![A-Fa-f0-9]{2})/', '%25', $string); - - // Add unreserved and % to $extra_chars (the latter is safe because all - // pct-encoded sections are now valid). - $extra_chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~%'; - - // Now replace any bytes that aren't allowed with their pct-encoded versions - $position = 0; - $strlen = strlen($string); - while (($position += strspn($string, $extra_chars, $position)) < $strlen) - { - $value = ord($string[$position]); - - // Start position - $start = $position; - - // By default we are valid - $valid = true; - - // No one byte sequences are valid due to the while. - // Two byte sequence: - if (($value & 0xE0) === 0xC0) - { - $character = ($value & 0x1F) << 6; - $length = 2; - $remaining = 1; - } - // Three byte sequence: - elseif (($value & 0xF0) === 0xE0) - { - $character = ($value & 0x0F) << 12; - $length = 3; - $remaining = 2; - } - // Four byte sequence: - elseif (($value & 0xF8) === 0xF0) - { - $character = ($value & 0x07) << 18; - $length = 4; - $remaining = 3; - } - // Invalid byte: - else - { - $valid = false; - $length = 1; - $remaining = 0; - } - - if ($remaining) - { - if ($position + $length <= $strlen) - { - for ($position++; $remaining; $position++) - { - $value = ord($string[$position]); - - // Check that the byte is valid, then add it to the character: - if (($value & 0xC0) === 0x80) - { - $character |= ($value & 0x3F) << (--$remaining * 6); - } - // If it is invalid, count the sequence as invalid and reprocess the current byte: - else - { - $valid = false; - $position--; - break; - } - } - } - else - { - $position = $strlen - 1; - $valid = false; - } - } - - // Percent encode anything invalid or not in ucschar - if ( - // Invalid sequences - !$valid - // Non-shortest form sequences are invalid - || $length > 1 && $character <= 0x7F - || $length > 2 && $character <= 0x7FF - || $length > 3 && $character <= 0xFFFF - // Outside of range of ucschar codepoints - // Noncharacters - || ($character & 0xFFFE) === 0xFFFE - || $character >= 0xFDD0 && $character <= 0xFDEF - || ( - // Everything else not in ucschar - $character > 0xD7FF && $character < 0xF900 - || $character < 0xA0 - || $character > 0xEFFFD - ) - && ( - // Everything not in iprivate, if it applies - !$iprivate - || $character < 0xE000 - || $character > 0x10FFFD - ) - ) - { - // If we were a character, pretend we weren't, but rather an error. - if ($valid) - $position--; - - for ($j = $start; $j <= $position; $j++) - { - $string = substr_replace($string, sprintf('%%%02X', ord($string[$j])), $j, 1); - $j += 2; - $position += 2; - $strlen += 2; - } - } - } - - return $string; - } - - /** - * Callback function for preg_replace_callback. - * - * Removes sequences of percent encoded bytes that represent UTF-8 - * encoded characters in iunreserved - * - * @param array $match PCRE match - * @return string Replacement - */ - protected function remove_iunreserved_percent_encoded($match) - { - // As we just have valid percent encoded sequences we can just explode - // and ignore the first member of the returned array (an empty string). - $bytes = explode('%', $match[0]); - - // Initialize the new string (this is what will be returned) and that - // there are no bytes remaining in the current sequence (unsurprising - // at the first byte!). - $string = ''; - $remaining = 0; - - // Loop over each and every byte, and set $value to its value - for ($i = 1, $len = count($bytes); $i < $len; $i++) - { - $value = hexdec($bytes[$i]); - - // If we're the first byte of sequence: - if (!$remaining) - { - // Start position - $start = $i; - - // By default we are valid - $valid = true; - - // One byte sequence: - if ($value <= 0x7F) - { - $character = $value; - $length = 1; - } - // Two byte sequence: - elseif (($value & 0xE0) === 0xC0) - { - $character = ($value & 0x1F) << 6; - $length = 2; - $remaining = 1; - } - // Three byte sequence: - elseif (($value & 0xF0) === 0xE0) - { - $character = ($value & 0x0F) << 12; - $length = 3; - $remaining = 2; - } - // Four byte sequence: - elseif (($value & 0xF8) === 0xF0) - { - $character = ($value & 0x07) << 18; - $length = 4; - $remaining = 3; - } - // Invalid byte: - else - { - $valid = false; - $remaining = 0; - } - } - // Continuation byte: - else - { - // Check that the byte is valid, then add it to the character: - if (($value & 0xC0) === 0x80) - { - $remaining--; - $character |= ($value & 0x3F) << ($remaining * 6); - } - // If it is invalid, count the sequence as invalid and reprocess the current byte as the start of a sequence: - else - { - $valid = false; - $remaining = 0; - $i--; - } - } - - // If we've reached the end of the current byte sequence, append it to Unicode::$data - if (!$remaining) - { - // Percent encode anything invalid or not in iunreserved - if ( - // Invalid sequences - !$valid - // Non-shortest form sequences are invalid - || $length > 1 && $character <= 0x7F - || $length > 2 && $character <= 0x7FF - || $length > 3 && $character <= 0xFFFF - // Outside of range of iunreserved codepoints - || $character < 0x2D - || $character > 0xEFFFD - // Noncharacters - || ($character & 0xFFFE) === 0xFFFE - || $character >= 0xFDD0 && $character <= 0xFDEF - // Everything else not in iunreserved (this is all BMP) - || $character === 0x2F - || $character > 0x39 && $character < 0x41 - || $character > 0x5A && $character < 0x61 - || $character > 0x7A && $character < 0x7E - || $character > 0x7E && $character < 0xA0 - || $character > 0xD7FF && $character < 0xF900 - ) - { - for ($j = $start; $j <= $i; $j++) - { - $string .= '%' . strtoupper($bytes[$j]); - } - } - else - { - for ($j = $start; $j <= $i; $j++) - { - $string .= chr(hexdec($bytes[$j])); - } - } - } - } - - // If we have any bytes left over they are invalid (i.e., we are - // mid-way through a multi-byte sequence) - if ($remaining) - { - for ($j = $start; $j < $len; $j++) - { - $string .= '%' . strtoupper($bytes[$j]); - } - } - - return $string; - } - - protected function scheme_normalization() - { - if (isset($this->normalization[$this->scheme]['iuserinfo']) && $this->iuserinfo === $this->normalization[$this->scheme]['iuserinfo']) - { - $this->iuserinfo = null; - } - if (isset($this->normalization[$this->scheme]['ihost']) && $this->ihost === $this->normalization[$this->scheme]['ihost']) - { - $this->ihost = null; - } - if (isset($this->normalization[$this->scheme]['port']) && $this->port === $this->normalization[$this->scheme]['port']) - { - $this->port = null; - } - if (isset($this->normalization[$this->scheme]['ipath']) && $this->ipath === $this->normalization[$this->scheme]['ipath']) - { - $this->ipath = ''; - } - if (isset($this->normalization[$this->scheme]['iquery']) && $this->iquery === $this->normalization[$this->scheme]['iquery']) - { - $this->iquery = null; - } - if (isset($this->normalization[$this->scheme]['ifragment']) && $this->ifragment === $this->normalization[$this->scheme]['ifragment']) - { - $this->ifragment = null; - } - } - - /** - * Check if the object represents a valid IRI. This needs to be done on each - * call as some things change depending on another part of the IRI. - * - * @return bool - */ - public function is_valid() - { - $isauthority = $this->iuserinfo !== null || $this->ihost !== null || $this->port !== null; - if ($this->ipath !== '' && - ( - $isauthority && ( - $this->ipath[0] !== '/' || - substr($this->ipath, 0, 2) === '//' - ) || - ( - $this->scheme === null && - !$isauthority && - strpos($this->ipath, ':') !== false && - (strpos($this->ipath, '/') === false ? true : strpos($this->ipath, ':') < strpos($this->ipath, '/')) - ) - ) - ) - { - return false; - } - - return true; - } - - /** - * Set the entire IRI. Returns true on success, false on failure (if there - * are any invalid characters). - * - * @param string $iri - * @return bool - */ - public function set_iri($iri) - { - static $cache; - if (!$cache) - { - $cache = array(); - } - - if ($iri === null) - { - return true; - } - elseif (isset($cache[$iri])) - { - list($this->scheme, - $this->iuserinfo, - $this->ihost, - $this->port, - $this->ipath, - $this->iquery, - $this->ifragment, - $return) = $cache[$iri]; - return $return; - } - else - { - $parsed = $this->parse_iri((string) $iri); - if (!$parsed) - { - return false; - } - - $return = $this->set_scheme($parsed['scheme']) - && $this->set_authority($parsed['authority']) - && $this->set_path($parsed['path']) - && $this->set_query($parsed['query']) - && $this->set_fragment($parsed['fragment']); - - $cache[$iri] = array($this->scheme, - $this->iuserinfo, - $this->ihost, - $this->port, - $this->ipath, - $this->iquery, - $this->ifragment, - $return); - return $return; - } - } - - /** - * Set the scheme. Returns true on success, false on failure (if there are - * any invalid characters). - * - * @param string $scheme - * @return bool - */ - public function set_scheme($scheme) - { - if ($scheme === null) - { - $this->scheme = null; - } - elseif (!preg_match('/^[A-Za-z][0-9A-Za-z+\-.]*$/', $scheme)) - { - $this->scheme = null; - return false; - } - else - { - $this->scheme = strtolower($scheme); - } - return true; - } - - /** - * Set the authority. Returns true on success, false on failure (if there are - * any invalid characters). - * - * @param string $authority - * @return bool - */ - public function set_authority($authority) - { - static $cache; - if (!$cache) - $cache = array(); - - if ($authority === null) - { - $this->iuserinfo = null; - $this->ihost = null; - $this->port = null; - return true; - } - elseif (isset($cache[$authority])) - { - list($this->iuserinfo, - $this->ihost, - $this->port, - $return) = $cache[$authority]; - - return $return; - } - else - { - $remaining = $authority; - if (($iuserinfo_end = strrpos($remaining, '@')) !== false) - { - $iuserinfo = substr($remaining, 0, $iuserinfo_end); - $remaining = substr($remaining, $iuserinfo_end + 1); - } - else - { - $iuserinfo = null; - } - if (($port_start = strpos($remaining, ':', strpos($remaining, ']'))) !== false) - { - if (($port = substr($remaining, $port_start + 1)) === false) - { - $port = null; - } - $remaining = substr($remaining, 0, $port_start); - } - else - { - $port = null; - } - - $return = $this->set_userinfo($iuserinfo) && - $this->set_host($remaining) && - $this->set_port($port); - - $cache[$authority] = array($this->iuserinfo, - $this->ihost, - $this->port, - $return); - - return $return; - } - } - - /** - * Set the iuserinfo. - * - * @param string $iuserinfo - * @return bool - */ - public function set_userinfo($iuserinfo) - { - if ($iuserinfo === null) - { - $this->iuserinfo = null; - } - else - { - $this->iuserinfo = $this->replace_invalid_with_pct_encoding($iuserinfo, '!$&\'()*+,;=:'); - $this->scheme_normalization(); - } - - return true; - } - - /** - * Set the ihost. Returns true on success, false on failure (if there are - * any invalid characters). - * - * @param string $ihost - * @return bool - */ - public function set_host($ihost) - { - if ($ihost === null) - { - $this->ihost = null; - return true; - } - elseif (substr($ihost, 0, 1) === '[' && substr($ihost, -1) === ']') - { - if (SimplePie_Net_IPv6::check_ipv6(substr($ihost, 1, -1))) - { - $this->ihost = '[' . SimplePie_Net_IPv6::compress(substr($ihost, 1, -1)) . ']'; - } - else - { - $this->ihost = null; - return false; - } - } - else - { - $ihost = $this->replace_invalid_with_pct_encoding($ihost, '!$&\'()*+,;='); - - // Lowercase, but ignore pct-encoded sections (as they should - // remain uppercase). This must be done after the previous step - // as that can add unescaped characters. - $position = 0; - $strlen = strlen($ihost); - while (($position += strcspn($ihost, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ%', $position)) < $strlen) - { - if ($ihost[$position] === '%') - { - $position += 3; - } - else - { - $ihost[$position] = strtolower($ihost[$position]); - $position++; - } - } - - $this->ihost = $ihost; - } - - $this->scheme_normalization(); - - return true; - } - - /** - * Set the port. Returns true on success, false on failure (if there are - * any invalid characters). - * - * @param string $port - * @return bool - */ - public function set_port($port) - { - if ($port === null) - { - $this->port = null; - return true; - } - elseif (strspn($port, '0123456789') === strlen($port)) - { - $this->port = (int) $port; - $this->scheme_normalization(); - return true; - } - else - { - $this->port = null; - return false; - } - } - - /** - * Set the ipath. - * - * @param string $ipath - * @return bool - */ - public function set_path($ipath) - { - static $cache; - if (!$cache) - { - $cache = array(); - } - - $ipath = (string) $ipath; - - if (isset($cache[$ipath])) - { - $this->ipath = $cache[$ipath][(int) ($this->scheme !== null)]; - } - else - { - $valid = $this->replace_invalid_with_pct_encoding($ipath, '!$&\'()*+,;=@:/'); - $removed = $this->remove_dot_segments($valid); - - $cache[$ipath] = array($valid, $removed); - $this->ipath = ($this->scheme !== null) ? $removed : $valid; - } - - $this->scheme_normalization(); - return true; - } - - /** - * Set the iquery. - * - * @param string $iquery - * @return bool - */ - public function set_query($iquery) - { - if ($iquery === null) - { - $this->iquery = null; - } - else - { - $this->iquery = $this->replace_invalid_with_pct_encoding($iquery, '!$&\'()*+,;=:@/?', true); - $this->scheme_normalization(); - } - return true; - } - - /** - * Set the ifragment. - * - * @param string $ifragment - * @return bool - */ - public function set_fragment($ifragment) - { - if ($ifragment === null) - { - $this->ifragment = null; - } - else - { - $this->ifragment = $this->replace_invalid_with_pct_encoding($ifragment, '!$&\'()*+,;=:@/?'); - $this->scheme_normalization(); - } - return true; - } - - /** - * Convert an IRI to a URI (or parts thereof) - * - * @return string - */ - public function to_uri($string) - { - static $non_ascii; - if (!$non_ascii) - { - $non_ascii = implode('', range("\x80", "\xFF")); - } - - $position = 0; - $strlen = strlen($string); - while (($position += strcspn($string, $non_ascii, $position)) < $strlen) - { - $string = substr_replace($string, sprintf('%%%02X', ord($string[$position])), $position, 1); - $position += 3; - $strlen += 2; - } - - return $string; - } - - /** - * Get the complete IRI - * - * @return string - */ - public function get_iri() - { - if (!$this->is_valid()) - { - return false; - } - - $iri = ''; - if ($this->scheme !== null) - { - $iri .= $this->scheme . ':'; - } - if (($iauthority = $this->get_iauthority()) !== null) - { - $iri .= '//' . $iauthority; - } - if ($this->ipath !== '') - { - $iri .= $this->ipath; - } - elseif (!empty($this->normalization[$this->scheme]['ipath']) && $iauthority !== null && $iauthority !== '') - { - $iri .= $this->normalization[$this->scheme]['ipath']; - } - if ($this->iquery !== null) - { - $iri .= '?' . $this->iquery; - } - if ($this->ifragment !== null) - { - $iri .= '#' . $this->ifragment; - } - - return $iri; - } - - /** - * Get the complete URI - * - * @return string - */ - public function get_uri() - { - return $this->to_uri($this->get_iri()); - } - - /** - * Get the complete iauthority - * - * @return string - */ - protected function get_iauthority() - { - if ($this->iuserinfo !== null || $this->ihost !== null || $this->port !== null) - { - $iauthority = ''; - if ($this->iuserinfo !== null) - { - $iauthority .= $this->iuserinfo . '@'; - } - if ($this->ihost !== null) - { - $iauthority .= $this->ihost; - } - if ($this->port !== null) - { - $iauthority .= ':' . $this->port; - } - return $iauthority; - } - else - { - return null; - } - } - - /** - * Get the complete authority - * - * @return string - */ - protected function get_authority() - { - $iauthority = $this->get_iauthority(); - if (is_string($iauthority)) - return $this->to_uri($iauthority); - else - return $iauthority; - } -} diff --git a/wp/wp-includes/SimplePie/Item.php b/wp/wp-includes/SimplePie/Item.php deleted file mode 100644 index a77574b3..00000000 --- a/wp/wp-includes/SimplePie/Item.php +++ /dev/null @@ -1,2964 +0,0 @@ -feed = $feed; - $this->data = $data; - } - - /** - * Set the registry handler - * - * This is usually used by {@see SimplePie_Registry::create} - * - * @since 1.3 - * @param SimplePie_Registry $registry - */ - public function set_registry(SimplePie_Registry $registry) - { - $this->registry = $registry; - } - - /** - * Get a string representation of the item - * - * @return string - */ - public function __toString() - { - return md5(serialize($this->data)); - } - - /** - * Remove items that link back to this before destroying this object - */ - public function __destruct() - { - if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode')) - { - unset($this->feed); - } - } - - /** - * Get data for an item-level element - * - * This method allows you to get access to ANY element/attribute that is a - * sub-element of the item/entry tag. - * - * See {@see SimplePie::get_feed_tags()} for a description of the return value - * - * @since 1.0 - * @see http://simplepie.org/wiki/faq/supported_xml_namespaces - * @param string $namespace The URL of the XML namespace of the elements you're trying to access - * @param string $tag Tag name - * @return array - */ - public function get_item_tags($namespace, $tag) - { - if (isset($this->data['child'][$namespace][$tag])) - { - return $this->data['child'][$namespace][$tag]; - } - else - { - return null; - } - } - - /** - * Get the base URL value from the parent feed - * - * Uses `` - * - * @param array $element - * @return string - */ - public function get_base($element = array()) - { - return $this->feed->get_base($element); - } - - /** - * Sanitize feed data - * - * @access private - * @see SimplePie::sanitize() - * @param string $data Data to sanitize - * @param int $type One of the SIMPLEPIE_CONSTRUCT_* constants - * @param string $base Base URL to resolve URLs against - * @return string Sanitized data - */ - public function sanitize($data, $type, $base = '') - { - return $this->feed->sanitize($data, $type, $base); - } - - /** - * Get the parent feed - * - * Note: this may not work as you think for multifeeds! - * - * @link http://simplepie.org/faq/typical_multifeed_gotchas#missing_data_from_feed - * @since 1.0 - * @return SimplePie - */ - public function get_feed() - { - return $this->feed; - } - - /** - * Get the unique identifier for the item - * - * This is usually used when writing code to check for new items in a feed. - * - * Uses ``, ``, `` or the `about` attribute - * for RDF. If none of these are supplied (or `$hash` is true), creates an - * MD5 hash based on the permalink and title. If either of those are not - * supplied, creates a hash based on the full feed data. - * - * @since Beta 2 - * @param boolean $hash Should we force using a hash instead of the supplied ID? - * @return string - */ - public function get_id($hash = false) - { - if (!$hash) - { - if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'id')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'id')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'identifier')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'identifier')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif (isset($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about'])) - { - return $this->sanitize($this->data['attribs'][SIMPLEPIE_NAMESPACE_RDF]['about'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif (($return = $this->get_permalink()) !== null) - { - return $return; - } - elseif (($return = $this->get_title()) !== null) - { - return $return; - } - } - if ($this->get_permalink() !== null || $this->get_title() !== null) - { - return md5($this->get_permalink() . $this->get_title()); - } - else - { - return md5(serialize($this->data)); - } - } - - /** - * Get the title of the item - * - * Uses ``, `` or `<dc:title>` - * - * @since Beta 2 (previously called `get_item_title` since 0.8) - * @return string|null - */ - public function get_title() - { - if (!isset($this->data['title'])) - { - if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) - { - $this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) - { - $this->data['title'] = $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) - { - $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) - { - $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) - { - $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) - { - $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) - { - $this->data['title'] = $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $this->data['title'] = null; - } - } - return $this->data['title']; - } - - /** - * Get the content for the item - * - * Prefers summaries over full content , but will return full content if a - * summary does not exist. - * - * To prefer full content instead, use {@see get_content} - * - * Uses `<atom:summary>`, `<description>`, `<dc:description>` or - * `<itunes:subtitle>` - * - * @since 0.8 - * @param boolean $description_only Should we avoid falling back to the content? - * @return string|null - */ - public function get_description($description_only = false) - { - if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'summary')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'summary')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML); - } - - elseif (!$description_only) - { - return $this->get_content(true); - } - else - { - return null; - } - } - - /** - * Get the content for the item - * - * Prefers full content over summaries, but will return a summary if full - * content does not exist. - * - * To prefer summaries instead, use {@see get_description} - * - * Uses `<atom:content>` or `<content:encoded>` (RSS 1.0 Content Module) - * - * @since 1.0 - * @param boolean $content_only Should we avoid falling back to the description? - * @return string|null - */ - public function get_content($content_only = false) - { - if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'content')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_content_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'content')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT, 'encoded')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); - } - elseif (!$content_only) - { - return $this->get_description(true); - } - else - { - return null; - } - } - - /** - * Get a category for the item - * - * @since Beta 3 (previously called `get_categories()` since Beta 2) - * @param int $key The category that you want to return. Remember that arrays begin with 0, not 1 - * @return SimplePie_Category|null - */ - public function get_category($key = 0) - { - $categories = $this->get_categories(); - if (isset($categories[$key])) - { - return $categories[$key]; - } - else - { - return null; - } - } - - /** - * Get all categories for the item - * - * Uses `<atom:category>`, `<category>` or `<dc:subject>` - * - * @since Beta 3 - * @return array|null List of {@see SimplePie_Category} objects - */ - public function get_categories() - { - $categories = array(); - - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) - { - $term = null; - $scheme = null; - $label = null; - if (isset($category['attribs']['']['term'])) - { - $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($category['attribs']['']['scheme'])) - { - $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($category['attribs']['']['label'])) - { - $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); - } - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) - { - // This is really the label, but keep this as the term also for BC. - // Label will also work on retrieving because that falls back to term. - $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); - if (isset($category['attribs']['']['domain'])) - { - $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $scheme = null; - } - $categories[] = $this->registry->create('Category', array($term, $scheme, null)); - } - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) - { - $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) - { - $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - - if (!empty($categories)) - { - return array_unique($categories); - } - else - { - return null; - } - } - - /** - * Get an author for the item - * - * @since Beta 2 - * @param int $key The author that you want to return. Remember that arrays begin with 0, not 1 - * @return SimplePie_Author|null - */ - public function get_author($key = 0) - { - $authors = $this->get_authors(); - if (isset($authors[$key])) - { - return $authors[$key]; - } - else - { - return null; - } - } - - /** - * Get a contributor for the item - * - * @since 1.1 - * @param int $key The contrbutor that you want to return. Remember that arrays begin with 0, not 1 - * @return SimplePie_Author|null - */ - public function get_contributor($key = 0) - { - $contributors = $this->get_contributors(); - if (isset($contributors[$key])) - { - return $contributors[$key]; - } - else - { - return null; - } - } - - /** - * Get all contributors for the item - * - * Uses `<atom:contributor>` - * - * @since 1.1 - * @return array|null List of {@see SimplePie_Author} objects - */ - public function get_contributors() - { - $contributors = array(); - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) - { - $name = null; - $uri = null; - $email = null; - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) - { - $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) - { - $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); - } - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) - { - $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if ($name !== null || $email !== null || $uri !== null) - { - $contributors[] = $this->registry->create('Author', array($name, $uri, $email)); - } - } - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) - { - $name = null; - $url = null; - $email = null; - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) - { - $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) - { - $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); - } - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) - { - $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if ($name !== null || $email !== null || $url !== null) - { - $contributors[] = $this->registry->create('Author', array($name, $url, $email)); - } - } - - if (!empty($contributors)) - { - return array_unique($contributors); - } - else - { - return null; - } - } - - /** - * Get all authors for the item - * - * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>` - * - * @since Beta 2 - * @return array|null List of {@see SimplePie_Author} objects - */ - public function get_authors() - { - $authors = array(); - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) - { - $name = null; - $uri = null; - $email = null; - if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) - { - $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) - { - $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); - } - if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) - { - $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if ($name !== null || $email !== null || $uri !== null) - { - $authors[] = $this->registry->create('Author', array($name, $uri, $email)); - } - } - if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) - { - $name = null; - $url = null; - $email = null; - if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) - { - $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) - { - $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); - } - if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) - { - $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if ($name !== null || $email !== null || $url !== null) - { - $authors[] = $this->registry->create('Author', array($name, $url, $email)); - } - } - if ($author = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'author')) - { - $authors[] = $this->registry->create('Author', array(null, null, $this->sanitize($author[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT))); - } - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) - { - $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) - { - $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) - { - $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - - if (!empty($authors)) - { - return array_unique($authors); - } - elseif (($source = $this->get_source()) && ($authors = $source->get_authors())) - { - return $authors; - } - elseif ($authors = $this->feed->get_authors()) - { - return $authors; - } - else - { - return null; - } - } - - /** - * Get the copyright info for the item - * - * Uses `<atom:rights>` or `<dc:rights>` - * - * @since 1.1 - * @return string - */ - public function get_copyright() - { - if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - return null; - } - } - - /** - * Get the posting date/time for the item - * - * Uses `<atom:published>`, `<atom:updated>`, `<atom:issued>`, - * `<atom:modified>`, `<pubDate>` or `<dc:date>` - * - * Note: obeys PHP's timezone setting. To get a UTC date/time, use - * {@see get_gmdate} - * - * @since Beta 2 (previously called `get_item_date` since 0.8) - * - * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data) - * @return int|string|null - */ - public function get_date($date_format = 'j F Y, g:i a') - { - if (!isset($this->data['date'])) - { - if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'published')) - { - $this->data['date']['raw'] = $return[0]['data']; - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated')) - { - $this->data['date']['raw'] = $return[0]['data']; - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'issued')) - { - $this->data['date']['raw'] = $return[0]['data']; - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'created')) - { - $this->data['date']['raw'] = $return[0]['data']; - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'modified')) - { - $this->data['date']['raw'] = $return[0]['data']; - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'pubDate')) - { - $this->data['date']['raw'] = $return[0]['data']; - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_11, 'date')) - { - $this->data['date']['raw'] = $return[0]['data']; - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_DC_10, 'date')) - { - $this->data['date']['raw'] = $return[0]['data']; - } - - if (!empty($this->data['date']['raw'])) - { - $parser = $this->registry->call('Parse_Date', 'get'); - $this->data['date']['parsed'] = $parser->parse($this->data['date']['raw']); - } - else - { - $this->data['date'] = null; - } - } - if ($this->data['date']) - { - $date_format = (string) $date_format; - switch ($date_format) - { - case '': - return $this->sanitize($this->data['date']['raw'], SIMPLEPIE_CONSTRUCT_TEXT); - - case 'U': - return $this->data['date']['parsed']; - - default: - return date($date_format, $this->data['date']['parsed']); - } - } - else - { - return null; - } - } - - /** - * Get the update date/time for the item - * - * Uses `<atom:updated>` - * - * Note: obeys PHP's timezone setting. To get a UTC date/time, use - * {@see get_gmdate} - * - * @param string $date_format Supports any PHP date format from {@see http://php.net/date} (empty for the raw data) - * @return int|string|null - */ - public function get_updated_date($date_format = 'j F Y, g:i a') - { - if (!isset($this->data['updated'])) - { - if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'updated')) - { - $this->data['updated']['raw'] = $return[0]['data']; - } - - if (!empty($this->data['updated']['raw'])) - { - $parser = $this->registry->call('Parse_Date', 'get'); - $this->data['updated']['parsed'] = $parser->parse($this->data['date']['raw']); - } - else - { - $this->data['updated'] = null; - } - } - if ($this->data['updated']) - { - $date_format = (string) $date_format; - switch ($date_format) - { - case '': - return $this->sanitize($this->data['updated']['raw'], SIMPLEPIE_CONSTRUCT_TEXT); - - case 'U': - return $this->data['updated']['parsed']; - - default: - return date($date_format, $this->data['updated']['parsed']); - } - } - else - { - return null; - } - } - - /** - * Get the localized posting date/time for the item - * - * Returns the date formatted in the localized language. To display in - * languages other than the server's default, you need to change the locale - * with {@link http://php.net/setlocale setlocale()}. The available - * localizations depend on which ones are installed on your web server. - * - * @since 1.0 - * - * @param string $date_format Supports any PHP date format from {@see http://php.net/strftime} (empty for the raw data) - * @return int|string|null - */ - public function get_local_date($date_format = '%c') - { - if (!$date_format) - { - return $this->sanitize($this->get_date(''), SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif (($date = $this->get_date('U')) !== null && $date !== false) - { - return strftime($date_format, $date); - } - else - { - return null; - } - } - - /** - * Get the posting date/time for the item (UTC time) - * - * @see get_date - * @param string $date_format Supports any PHP date format from {@see http://php.net/date} - * @return int|string|null - */ - public function get_gmdate($date_format = 'j F Y, g:i a') - { - $date = $this->get_date('U'); - if ($date === null) - { - return null; - } - - return gmdate($date_format, $date); - } - - /** - * Get the update date/time for the item (UTC time) - * - * @see get_updated_date - * @param string $date_format Supports any PHP date format from {@see http://php.net/date} - * @return int|string|null - */ - public function get_updated_gmdate($date_format = 'j F Y, g:i a') - { - $date = $this->get_updated_date('U'); - if ($date === null) - { - return null; - } - - return gmdate($date_format, $date); - } - - /** - * Get the permalink for the item - * - * Returns the first link available with a relationship of "alternate". - * Identical to {@see get_link()} with key 0 - * - * @see get_link - * @since 0.8 - * @return string|null Permalink URL - */ - public function get_permalink() - { - $link = $this->get_link(); - $enclosure = $this->get_enclosure(0); - if ($link !== null) - { - return $link; - } - elseif ($enclosure !== null) - { - return $enclosure->get_link(); - } - else - { - return null; - } - } - - /** - * Get a single link for the item - * - * @since Beta 3 - * @param int $key The link that you want to return. Remember that arrays begin with 0, not 1 - * @param string $rel The relationship of the link to return - * @return string|null Link URL - */ - public function get_link($key = 0, $rel = 'alternate') - { - $links = $this->get_links($rel); - if ($links[$key] !== null) - { - return $links[$key]; - } - else - { - return null; - } - } - - /** - * Get all links for the item - * - * Uses `<atom:link>`, `<link>` or `<guid>` - * - * @since Beta 2 - * @param string $rel The relationship of links to return - * @return array|null Links found for the item (strings) - */ - public function get_links($rel = 'alternate') - { - if (!isset($this->data['links'])) - { - $this->data['links'] = array(); - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link) - { - if (isset($link['attribs']['']['href'])) - { - $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; - $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); - - } - } - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link) - { - if (isset($link['attribs']['']['href'])) - { - $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; - $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); - } - } - if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) - { - $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); - } - if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) - { - $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); - } - if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) - { - $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); - } - if ($links = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'guid')) - { - if (!isset($links[0]['attribs']['']['isPermaLink']) || strtolower(trim($links[0]['attribs']['']['isPermaLink'])) === 'true') - { - $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); - } - } - - $keys = array_keys($this->data['links']); - foreach ($keys as $key) - { - if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key))) - { - if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) - { - $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); - $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; - } - else - { - $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; - } - } - elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) - { - $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; - } - $this->data['links'][$key] = array_unique($this->data['links'][$key]); - } - } - if (isset($this->data['links'][$rel])) - { - return $this->data['links'][$rel]; - } - else - { - return null; - } - } - - /** - * Get an enclosure from the item - * - * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS. - * - * @since Beta 2 - * @todo Add ability to prefer one type of content over another (in a media group). - * @param int $key The enclosure that you want to return. Remember that arrays begin with 0, not 1 - * @return SimplePie_Enclosure|null - */ - public function get_enclosure($key = 0, $prefer = null) - { - $enclosures = $this->get_enclosures(); - if (isset($enclosures[$key])) - { - return $enclosures[$key]; - } - else - { - return null; - } - } - - /** - * Get all available enclosures (podcasts, etc.) - * - * Supports the <enclosure> RSS tag, as well as Media RSS and iTunes RSS. - * - * At this point, we're pretty much assuming that all enclosures for an item - * are the same content. Anything else is too complicated to - * properly support. - * - * @since Beta 2 - * @todo Add support for end-user defined sorting of enclosures by type/handler (so we can prefer the faster-loading FLV over MP4). - * @todo If an element exists at a level, but it's value is empty, we should fall back to the value from the parent (if it exists). - * @return array|null List of SimplePie_Enclosure items - */ - public function get_enclosures() - { - if (!isset($this->data['enclosures'])) - { - $this->data['enclosures'] = array(); - - // Elements - $captions_parent = null; - $categories_parent = null; - $copyrights_parent = null; - $credits_parent = null; - $description_parent = null; - $duration_parent = null; - $hashes_parent = null; - $keywords_parent = null; - $player_parent = null; - $ratings_parent = null; - $restrictions_parent = null; - $thumbnails_parent = null; - $title_parent = null; - - // Let's do the channel and item-level ones first, and just re-use them if we need to. - $parent = $this->get_feed(); - - // CAPTIONS - if ($captions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text')) - { - foreach ($captions as $caption) - { - $caption_type = null; - $caption_lang = null; - $caption_startTime = null; - $caption_endTime = null; - $caption_text = null; - if (isset($caption['attribs']['']['type'])) - { - $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['lang'])) - { - $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['start'])) - { - $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['end'])) - { - $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['data'])) - { - $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); - } - } - elseif ($captions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'text')) - { - foreach ($captions as $caption) - { - $caption_type = null; - $caption_lang = null; - $caption_startTime = null; - $caption_endTime = null; - $caption_text = null; - if (isset($caption['attribs']['']['type'])) - { - $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['lang'])) - { - $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['start'])) - { - $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['end'])) - { - $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['data'])) - { - $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $captions_parent[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); - } - } - if (is_array($captions_parent)) - { - $captions_parent = array_values(array_unique($captions_parent)); - } - - // CATEGORIES - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category) - { - $term = null; - $scheme = null; - $label = null; - if (isset($category['data'])) - { - $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($category['attribs']['']['scheme'])) - { - $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $scheme = 'http://search.yahoo.com/mrss/category_schema'; - } - if (isset($category['attribs']['']['label'])) - { - $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label)); - } - foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'category') as $category) - { - $term = null; - $scheme = null; - $label = null; - if (isset($category['data'])) - { - $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($category['attribs']['']['scheme'])) - { - $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $scheme = 'http://search.yahoo.com/mrss/category_schema'; - } - if (isset($category['attribs']['']['label'])) - { - $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label)); - } - foreach ((array) $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'category') as $category) - { - $term = null; - $scheme = 'http://www.itunes.com/dtds/podcast-1.0.dtd'; - $label = null; - if (isset($category['attribs']['']['text'])) - { - $label = $this->sanitize($category['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label)); - - if (isset($category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'])) - { - foreach ((array) $category['child'][SIMPLEPIE_NAMESPACE_ITUNES]['category'] as $subcategory) - { - if (isset($subcategory['attribs']['']['text'])) - { - $label = $this->sanitize($subcategory['attribs']['']['text'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $categories_parent[] = $this->registry->create('Category', array($term, $scheme, $label)); - } - } - } - if (is_array($categories_parent)) - { - $categories_parent = array_values(array_unique($categories_parent)); - } - - // COPYRIGHT - if ($copyright = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright')) - { - $copyright_url = null; - $copyright_label = null; - if (isset($copyright[0]['attribs']['']['url'])) - { - $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($copyright[0]['data'])) - { - $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); - } - elseif ($copyright = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'copyright')) - { - $copyright_url = null; - $copyright_label = null; - if (isset($copyright[0]['attribs']['']['url'])) - { - $copyright_url = $this->sanitize($copyright[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($copyright[0]['data'])) - { - $copyright_label = $this->sanitize($copyright[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $copyrights_parent = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); - } - - // CREDITS - if ($credits = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit')) - { - foreach ($credits as $credit) - { - $credit_role = null; - $credit_scheme = null; - $credit_name = null; - if (isset($credit['attribs']['']['role'])) - { - $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($credit['attribs']['']['scheme'])) - { - $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $credit_scheme = 'urn:ebu'; - } - if (isset($credit['data'])) - { - $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); - } - } - elseif ($credits = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'credit')) - { - foreach ($credits as $credit) - { - $credit_role = null; - $credit_scheme = null; - $credit_name = null; - if (isset($credit['attribs']['']['role'])) - { - $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($credit['attribs']['']['scheme'])) - { - $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $credit_scheme = 'urn:ebu'; - } - if (isset($credit['data'])) - { - $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $credits_parent[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); - } - } - if (is_array($credits_parent)) - { - $credits_parent = array_values(array_unique($credits_parent)); - } - - // DESCRIPTION - if ($description_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description')) - { - if (isset($description_parent[0]['data'])) - { - $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - } - elseif ($description_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'description')) - { - if (isset($description_parent[0]['data'])) - { - $description_parent = $this->sanitize($description_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - } - - // DURATION - if ($duration_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'duration')) - { - $seconds = null; - $minutes = null; - $hours = null; - if (isset($duration_parent[0]['data'])) - { - $temp = explode(':', $this->sanitize($duration_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); - if (sizeof($temp) > 0) - { - $seconds = (int) array_pop($temp); - } - if (sizeof($temp) > 0) - { - $minutes = (int) array_pop($temp); - $seconds += $minutes * 60; - } - if (sizeof($temp) > 0) - { - $hours = (int) array_pop($temp); - $seconds += $hours * 3600; - } - unset($temp); - $duration_parent = $seconds; - } - } - - // HASHES - if ($hashes_iterator = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash')) - { - foreach ($hashes_iterator as $hash) - { - $value = null; - $algo = null; - if (isset($hash['data'])) - { - $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($hash['attribs']['']['algo'])) - { - $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $algo = 'md5'; - } - $hashes_parent[] = $algo.':'.$value; - } - } - elseif ($hashes_iterator = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'hash')) - { - foreach ($hashes_iterator as $hash) - { - $value = null; - $algo = null; - if (isset($hash['data'])) - { - $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($hash['attribs']['']['algo'])) - { - $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $algo = 'md5'; - } - $hashes_parent[] = $algo.':'.$value; - } - } - if (is_array($hashes_parent)) - { - $hashes_parent = array_values(array_unique($hashes_parent)); - } - - // KEYWORDS - if ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords')) - { - if (isset($keywords[0]['data'])) - { - $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); - foreach ($temp as $word) - { - $keywords_parent[] = trim($word); - } - } - unset($temp); - } - elseif ($keywords = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords')) - { - if (isset($keywords[0]['data'])) - { - $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); - foreach ($temp as $word) - { - $keywords_parent[] = trim($word); - } - } - unset($temp); - } - elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'keywords')) - { - if (isset($keywords[0]['data'])) - { - $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); - foreach ($temp as $word) - { - $keywords_parent[] = trim($word); - } - } - unset($temp); - } - elseif ($keywords = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'keywords')) - { - if (isset($keywords[0]['data'])) - { - $temp = explode(',', $this->sanitize($keywords[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); - foreach ($temp as $word) - { - $keywords_parent[] = trim($word); - } - } - unset($temp); - } - if (is_array($keywords_parent)) - { - $keywords_parent = array_values(array_unique($keywords_parent)); - } - - // PLAYER - if ($player_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player')) - { - if (isset($player_parent[0]['attribs']['']['url'])) - { - $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - } - } - elseif ($player_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'player')) - { - if (isset($player_parent[0]['attribs']['']['url'])) - { - $player_parent = $this->sanitize($player_parent[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - } - } - - // RATINGS - if ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating')) - { - foreach ($ratings as $rating) - { - $rating_scheme = null; - $rating_value = null; - if (isset($rating['attribs']['']['scheme'])) - { - $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $rating_scheme = 'urn:simple'; - } - if (isset($rating['data'])) - { - $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); - } - } - elseif ($ratings = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit')) - { - foreach ($ratings as $rating) - { - $rating_scheme = 'urn:itunes'; - $rating_value = null; - if (isset($rating['data'])) - { - $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); - } - } - elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'rating')) - { - foreach ($ratings as $rating) - { - $rating_scheme = null; - $rating_value = null; - if (isset($rating['attribs']['']['scheme'])) - { - $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $rating_scheme = 'urn:simple'; - } - if (isset($rating['data'])) - { - $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); - } - } - elseif ($ratings = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'explicit')) - { - foreach ($ratings as $rating) - { - $rating_scheme = 'urn:itunes'; - $rating_value = null; - if (isset($rating['data'])) - { - $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $ratings_parent[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); - } - } - if (is_array($ratings_parent)) - { - $ratings_parent = array_values(array_unique($ratings_parent)); - } - - // RESTRICTIONS - if ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction')) - { - foreach ($restrictions as $restriction) - { - $restriction_relationship = null; - $restriction_type = null; - $restriction_value = null; - if (isset($restriction['attribs']['']['relationship'])) - { - $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($restriction['attribs']['']['type'])) - { - $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($restriction['data'])) - { - $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); - } - } - elseif ($restrictions = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block')) - { - foreach ($restrictions as $restriction) - { - $restriction_relationship = 'allow'; - $restriction_type = null; - $restriction_value = 'itunes'; - if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') - { - $restriction_relationship = 'deny'; - } - $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); - } - } - elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'restriction')) - { - foreach ($restrictions as $restriction) - { - $restriction_relationship = null; - $restriction_type = null; - $restriction_value = null; - if (isset($restriction['attribs']['']['relationship'])) - { - $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($restriction['attribs']['']['type'])) - { - $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($restriction['data'])) - { - $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); - } - } - elseif ($restrictions = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'block')) - { - foreach ($restrictions as $restriction) - { - $restriction_relationship = 'allow'; - $restriction_type = null; - $restriction_value = 'itunes'; - if (isset($restriction['data']) && strtolower($restriction['data']) === 'yes') - { - $restriction_relationship = 'deny'; - } - $restrictions_parent[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); - } - } - if (is_array($restrictions_parent)) - { - $restrictions_parent = array_values(array_unique($restrictions_parent)); - } - else - { - $restrictions_parent = array(new SimplePie_Restriction('allow', null, 'default')); - } - - // THUMBNAILS - if ($thumbnails = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail')) - { - foreach ($thumbnails as $thumbnail) - { - if (isset($thumbnail['attribs']['']['url'])) - { - $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - } - } - } - elseif ($thumbnails = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'thumbnail')) - { - foreach ($thumbnails as $thumbnail) - { - if (isset($thumbnail['attribs']['']['url'])) - { - $thumbnails_parent[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - } - } - } - - // TITLES - if ($title_parent = $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title')) - { - if (isset($title_parent[0]['data'])) - { - $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - } - elseif ($title_parent = $parent->get_channel_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'title')) - { - if (isset($title_parent[0]['data'])) - { - $title_parent = $this->sanitize($title_parent[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - } - - // Clear the memory - unset($parent); - - // Attributes - $bitrate = null; - $channels = null; - $duration = null; - $expression = null; - $framerate = null; - $height = null; - $javascript = null; - $lang = null; - $length = null; - $medium = null; - $samplingrate = null; - $type = null; - $url = null; - $width = null; - - // Elements - $captions = null; - $categories = null; - $copyrights = null; - $credits = null; - $description = null; - $hashes = null; - $keywords = null; - $player = null; - $ratings = null; - $restrictions = null; - $thumbnails = null; - $title = null; - - // If we have media:group tags, loop through them. - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group') as $group) - { - if(isset($group['child']) && isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'])) - { - // If we have media:content tags, loop through them. - foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content) - { - if (isset($content['attribs']['']['url'])) - { - // Attributes - $bitrate = null; - $channels = null; - $duration = null; - $expression = null; - $framerate = null; - $height = null; - $javascript = null; - $lang = null; - $length = null; - $medium = null; - $samplingrate = null; - $type = null; - $url = null; - $width = null; - - // Elements - $captions = null; - $categories = null; - $copyrights = null; - $credits = null; - $description = null; - $hashes = null; - $keywords = null; - $player = null; - $ratings = null; - $restrictions = null; - $thumbnails = null; - $title = null; - - // Start checking the attributes of media:content - if (isset($content['attribs']['']['bitrate'])) - { - $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['channels'])) - { - $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['duration'])) - { - $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $duration = $duration_parent; - } - if (isset($content['attribs']['']['expression'])) - { - $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['framerate'])) - { - $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['height'])) - { - $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['lang'])) - { - $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['fileSize'])) - { - $length = ceil($content['attribs']['']['fileSize']); - } - if (isset($content['attribs']['']['medium'])) - { - $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['samplingrate'])) - { - $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['type'])) - { - $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['width'])) - { - $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - - // Checking the other optional media: elements. Priority: media:content, media:group, item, channel - - // CAPTIONS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) - { - $caption_type = null; - $caption_lang = null; - $caption_startTime = null; - $caption_endTime = null; - $caption_text = null; - if (isset($caption['attribs']['']['type'])) - { - $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['lang'])) - { - $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['start'])) - { - $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['end'])) - { - $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['data'])) - { - $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); - } - if (is_array($captions)) - { - $captions = array_values(array_unique($captions)); - } - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) - { - foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) - { - $caption_type = null; - $caption_lang = null; - $caption_startTime = null; - $caption_endTime = null; - $caption_text = null; - if (isset($caption['attribs']['']['type'])) - { - $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['lang'])) - { - $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['start'])) - { - $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['end'])) - { - $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['data'])) - { - $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); - } - if (is_array($captions)) - { - $captions = array_values(array_unique($captions)); - } - } - else - { - $captions = $captions_parent; - } - - // CATEGORIES - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) - { - foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) - { - $term = null; - $scheme = null; - $label = null; - if (isset($category['data'])) - { - $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($category['attribs']['']['scheme'])) - { - $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $scheme = 'http://search.yahoo.com/mrss/category_schema'; - } - if (isset($category['attribs']['']['label'])) - { - $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); - } - } - if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) - { - foreach ((array) $group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) - { - $term = null; - $scheme = null; - $label = null; - if (isset($category['data'])) - { - $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($category['attribs']['']['scheme'])) - { - $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $scheme = 'http://search.yahoo.com/mrss/category_schema'; - } - if (isset($category['attribs']['']['label'])) - { - $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); - } - } - if (is_array($categories) && is_array($categories_parent)) - { - $categories = array_values(array_unique(array_merge($categories, $categories_parent))); - } - elseif (is_array($categories)) - { - $categories = array_values(array_unique($categories)); - } - elseif (is_array($categories_parent)) - { - $categories = array_values(array_unique($categories_parent)); - } - - // COPYRIGHTS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) - { - $copyright_url = null; - $copyright_label = null; - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) - { - $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) - { - $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) - { - $copyright_url = null; - $copyright_label = null; - if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) - { - $copyright_url = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) - { - $copyright_label = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); - } - else - { - $copyrights = $copyrights_parent; - } - - // CREDITS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) - { - $credit_role = null; - $credit_scheme = null; - $credit_name = null; - if (isset($credit['attribs']['']['role'])) - { - $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($credit['attribs']['']['scheme'])) - { - $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $credit_scheme = 'urn:ebu'; - } - if (isset($credit['data'])) - { - $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); - } - if (is_array($credits)) - { - $credits = array_values(array_unique($credits)); - } - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) - { - foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) - { - $credit_role = null; - $credit_scheme = null; - $credit_name = null; - if (isset($credit['attribs']['']['role'])) - { - $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($credit['attribs']['']['scheme'])) - { - $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $credit_scheme = 'urn:ebu'; - } - if (isset($credit['data'])) - { - $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); - } - if (is_array($credits)) - { - $credits = array_values(array_unique($credits)); - } - } - else - { - $credits = $credits_parent; - } - - // DESCRIPTION - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) - { - $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) - { - $description = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $description = $description_parent; - } - - // HASHES - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) - { - $value = null; - $algo = null; - if (isset($hash['data'])) - { - $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($hash['attribs']['']['algo'])) - { - $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $algo = 'md5'; - } - $hashes[] = $algo.':'.$value; - } - if (is_array($hashes)) - { - $hashes = array_values(array_unique($hashes)); - } - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) - { - foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) - { - $value = null; - $algo = null; - if (isset($hash['data'])) - { - $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($hash['attribs']['']['algo'])) - { - $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $algo = 'md5'; - } - $hashes[] = $algo.':'.$value; - } - if (is_array($hashes)) - { - $hashes = array_values(array_unique($hashes)); - } - } - else - { - $hashes = $hashes_parent; - } - - // KEYWORDS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) - { - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) - { - $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); - foreach ($temp as $word) - { - $keywords[] = trim($word); - } - unset($temp); - } - if (is_array($keywords)) - { - $keywords = array_values(array_unique($keywords)); - } - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) - { - if (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) - { - $temp = explode(',', $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); - foreach ($temp as $word) - { - $keywords[] = trim($word); - } - unset($temp); - } - if (is_array($keywords)) - { - $keywords = array_values(array_unique($keywords)); - } - } - else - { - $keywords = $keywords_parent; - } - - // PLAYER - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) - { - $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) - { - $player = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - } - else - { - $player = $player_parent; - } - - // RATINGS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) - { - $rating_scheme = null; - $rating_value = null; - if (isset($rating['attribs']['']['scheme'])) - { - $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $rating_scheme = 'urn:simple'; - } - if (isset($rating['data'])) - { - $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); - } - if (is_array($ratings)) - { - $ratings = array_values(array_unique($ratings)); - } - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) - { - foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) - { - $rating_scheme = null; - $rating_value = null; - if (isset($rating['attribs']['']['scheme'])) - { - $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $rating_scheme = 'urn:simple'; - } - if (isset($rating['data'])) - { - $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); - } - if (is_array($ratings)) - { - $ratings = array_values(array_unique($ratings)); - } - } - else - { - $ratings = $ratings_parent; - } - - // RESTRICTIONS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) - { - $restriction_relationship = null; - $restriction_type = null; - $restriction_value = null; - if (isset($restriction['attribs']['']['relationship'])) - { - $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($restriction['attribs']['']['type'])) - { - $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($restriction['data'])) - { - $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); - } - if (is_array($restrictions)) - { - $restrictions = array_values(array_unique($restrictions)); - } - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) - { - foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) - { - $restriction_relationship = null; - $restriction_type = null; - $restriction_value = null; - if (isset($restriction['attribs']['']['relationship'])) - { - $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($restriction['attribs']['']['type'])) - { - $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($restriction['data'])) - { - $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); - } - if (is_array($restrictions)) - { - $restrictions = array_values(array_unique($restrictions)); - } - } - else - { - $restrictions = $restrictions_parent; - } - - // THUMBNAILS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) - { - $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - } - if (is_array($thumbnails)) - { - $thumbnails = array_values(array_unique($thumbnails)); - } - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) - { - foreach ($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) - { - $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - } - if (is_array($thumbnails)) - { - $thumbnails = array_values(array_unique($thumbnails)); - } - } - else - { - $thumbnails = $thumbnails_parent; - } - - // TITLES - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) - { - $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif (isset($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) - { - $title = $this->sanitize($group['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $title = $title_parent; - } - - $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width)); - } - } - } - } - - // If we have standalone media:content tags, loop through them. - if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'])) - { - foreach ((array) $this->data['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content'] as $content) - { - if (isset($content['attribs']['']['url']) || isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) - { - // Attributes - $bitrate = null; - $channels = null; - $duration = null; - $expression = null; - $framerate = null; - $height = null; - $javascript = null; - $lang = null; - $length = null; - $medium = null; - $samplingrate = null; - $type = null; - $url = null; - $width = null; - - // Elements - $captions = null; - $categories = null; - $copyrights = null; - $credits = null; - $description = null; - $hashes = null; - $keywords = null; - $player = null; - $ratings = null; - $restrictions = null; - $thumbnails = null; - $title = null; - - // Start checking the attributes of media:content - if (isset($content['attribs']['']['bitrate'])) - { - $bitrate = $this->sanitize($content['attribs']['']['bitrate'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['channels'])) - { - $channels = $this->sanitize($content['attribs']['']['channels'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['duration'])) - { - $duration = $this->sanitize($content['attribs']['']['duration'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $duration = $duration_parent; - } - if (isset($content['attribs']['']['expression'])) - { - $expression = $this->sanitize($content['attribs']['']['expression'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['framerate'])) - { - $framerate = $this->sanitize($content['attribs']['']['framerate'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['height'])) - { - $height = $this->sanitize($content['attribs']['']['height'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['lang'])) - { - $lang = $this->sanitize($content['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['fileSize'])) - { - $length = ceil($content['attribs']['']['fileSize']); - } - if (isset($content['attribs']['']['medium'])) - { - $medium = $this->sanitize($content['attribs']['']['medium'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['samplingrate'])) - { - $samplingrate = $this->sanitize($content['attribs']['']['samplingrate'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['type'])) - { - $type = $this->sanitize($content['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['width'])) - { - $width = $this->sanitize($content['attribs']['']['width'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['attribs']['']['url'])) - { - $url = $this->sanitize($content['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - } - // Checking the other optional media: elements. Priority: media:content, media:group, item, channel - - // CAPTIONS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['text'] as $caption) - { - $caption_type = null; - $caption_lang = null; - $caption_startTime = null; - $caption_endTime = null; - $caption_text = null; - if (isset($caption['attribs']['']['type'])) - { - $caption_type = $this->sanitize($caption['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['lang'])) - { - $caption_lang = $this->sanitize($caption['attribs']['']['lang'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['start'])) - { - $caption_startTime = $this->sanitize($caption['attribs']['']['start'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['attribs']['']['end'])) - { - $caption_endTime = $this->sanitize($caption['attribs']['']['end'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($caption['data'])) - { - $caption_text = $this->sanitize($caption['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $captions[] = $this->registry->create('Caption', array($caption_type, $caption_lang, $caption_startTime, $caption_endTime, $caption_text)); - } - if (is_array($captions)) - { - $captions = array_values(array_unique($captions)); - } - } - else - { - $captions = $captions_parent; - } - - // CATEGORIES - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'])) - { - foreach ((array) $content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['category'] as $category) - { - $term = null; - $scheme = null; - $label = null; - if (isset($category['data'])) - { - $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($category['attribs']['']['scheme'])) - { - $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $scheme = 'http://search.yahoo.com/mrss/category_schema'; - } - if (isset($category['attribs']['']['label'])) - { - $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); - } - } - if (is_array($categories) && is_array($categories_parent)) - { - $categories = array_values(array_unique(array_merge($categories, $categories_parent))); - } - elseif (is_array($categories)) - { - $categories = array_values(array_unique($categories)); - } - elseif (is_array($categories_parent)) - { - $categories = array_values(array_unique($categories_parent)); - } - else - { - $categories = null; - } - - // COPYRIGHTS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'])) - { - $copyright_url = null; - $copyright_label = null; - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'])) - { - $copyright_url = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'])) - { - $copyright_label = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['copyright'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $copyrights = $this->registry->create('Copyright', array($copyright_url, $copyright_label)); - } - else - { - $copyrights = $copyrights_parent; - } - - // CREDITS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['credit'] as $credit) - { - $credit_role = null; - $credit_scheme = null; - $credit_name = null; - if (isset($credit['attribs']['']['role'])) - { - $credit_role = $this->sanitize($credit['attribs']['']['role'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($credit['attribs']['']['scheme'])) - { - $credit_scheme = $this->sanitize($credit['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $credit_scheme = 'urn:ebu'; - } - if (isset($credit['data'])) - { - $credit_name = $this->sanitize($credit['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $credits[] = $this->registry->create('Credit', array($credit_role, $credit_scheme, $credit_name)); - } - if (is_array($credits)) - { - $credits = array_values(array_unique($credits)); - } - } - else - { - $credits = $credits_parent; - } - - // DESCRIPTION - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'])) - { - $description = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['description'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $description = $description_parent; - } - - // HASHES - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['hash'] as $hash) - { - $value = null; - $algo = null; - if (isset($hash['data'])) - { - $value = $this->sanitize($hash['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($hash['attribs']['']['algo'])) - { - $algo = $this->sanitize($hash['attribs']['']['algo'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $algo = 'md5'; - } - $hashes[] = $algo.':'.$value; - } - if (is_array($hashes)) - { - $hashes = array_values(array_unique($hashes)); - } - } - else - { - $hashes = $hashes_parent; - } - - // KEYWORDS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'])) - { - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'])) - { - $temp = explode(',', $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['keywords'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT)); - foreach ($temp as $word) - { - $keywords[] = trim($word); - } - unset($temp); - } - if (is_array($keywords)) - { - $keywords = array_values(array_unique($keywords)); - } - } - else - { - $keywords = $keywords_parent; - } - - // PLAYER - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'])) - { - $player = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['player'][0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - } - else - { - $player = $player_parent; - } - - // RATINGS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['rating'] as $rating) - { - $rating_scheme = null; - $rating_value = null; - if (isset($rating['attribs']['']['scheme'])) - { - $rating_scheme = $this->sanitize($rating['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $rating_scheme = 'urn:simple'; - } - if (isset($rating['data'])) - { - $rating_value = $this->sanitize($rating['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $ratings[] = $this->registry->create('Rating', array($rating_scheme, $rating_value)); - } - if (is_array($ratings)) - { - $ratings = array_values(array_unique($ratings)); - } - } - else - { - $ratings = $ratings_parent; - } - - // RESTRICTIONS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['restriction'] as $restriction) - { - $restriction_relationship = null; - $restriction_type = null; - $restriction_value = null; - if (isset($restriction['attribs']['']['relationship'])) - { - $restriction_relationship = $this->sanitize($restriction['attribs']['']['relationship'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($restriction['attribs']['']['type'])) - { - $restriction_type = $this->sanitize($restriction['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($restriction['data'])) - { - $restriction_value = $this->sanitize($restriction['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $restrictions[] = $this->registry->create('Restriction', array($restriction_relationship, $restriction_type, $restriction_value)); - } - if (is_array($restrictions)) - { - $restrictions = array_values(array_unique($restrictions)); - } - } - else - { - $restrictions = $restrictions_parent; - } - - // THUMBNAILS - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'])) - { - foreach ($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['thumbnail'] as $thumbnail) - { - $thumbnails[] = $this->sanitize($thumbnail['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI); - } - if (is_array($thumbnails)) - { - $thumbnails = array_values(array_unique($thumbnails)); - } - } - else - { - $thumbnails = $thumbnails_parent; - } - - // TITLES - if (isset($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'])) - { - $title = $this->sanitize($content['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['title'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $title = $title_parent; - } - - $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions, $categories, $channels, $copyrights, $credits, $description, $duration, $expression, $framerate, $hashes, $height, $keywords, $lang, $medium, $player, $ratings, $restrictions, $samplingrate, $thumbnails, $title, $width)); - } - } - } - - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link') as $link) - { - if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') - { - // Attributes - $bitrate = null; - $channels = null; - $duration = null; - $expression = null; - $framerate = null; - $height = null; - $javascript = null; - $lang = null; - $length = null; - $medium = null; - $samplingrate = null; - $type = null; - $url = null; - $width = null; - - $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); - if (isset($link['attribs']['']['type'])) - { - $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($link['attribs']['']['length'])) - { - $length = ceil($link['attribs']['']['length']); - } - - // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor - $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width)); - } - } - - foreach ((array) $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link') as $link) - { - if (isset($link['attribs']['']['href']) && !empty($link['attribs']['']['rel']) && $link['attribs']['']['rel'] === 'enclosure') - { - // Attributes - $bitrate = null; - $channels = null; - $duration = null; - $expression = null; - $framerate = null; - $height = null; - $javascript = null; - $lang = null; - $length = null; - $medium = null; - $samplingrate = null; - $type = null; - $url = null; - $width = null; - - $url = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); - if (isset($link['attribs']['']['type'])) - { - $type = $this->sanitize($link['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($link['attribs']['']['length'])) - { - $length = ceil($link['attribs']['']['length']); - } - - // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor - $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width)); - } - } - - if ($enclosure = $this->get_item_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'enclosure')) - { - if (isset($enclosure[0]['attribs']['']['url'])) - { - // Attributes - $bitrate = null; - $channels = null; - $duration = null; - $expression = null; - $framerate = null; - $height = null; - $javascript = null; - $lang = null; - $length = null; - $medium = null; - $samplingrate = null; - $type = null; - $url = null; - $width = null; - - $url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0])); - if (isset($enclosure[0]['attribs']['']['type'])) - { - $type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($enclosure[0]['attribs']['']['length'])) - { - $length = ceil($enclosure[0]['attribs']['']['length']); - } - - // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor - $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width)); - } - } - - if (sizeof($this->data['enclosures']) === 0 && ($url || $type || $length || $bitrate || $captions_parent || $categories_parent || $channels || $copyrights_parent || $credits_parent || $description_parent || $duration_parent || $expression || $framerate || $hashes_parent || $height || $keywords_parent || $lang || $medium || $player_parent || $ratings_parent || $restrictions_parent || $samplingrate || $thumbnails_parent || $title_parent || $width)) - { - // Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor - $this->data['enclosures'][] = $this->registry->create('Enclosure', array($url, $type, $length, null, $bitrate, $captions_parent, $categories_parent, $channels, $copyrights_parent, $credits_parent, $description_parent, $duration_parent, $expression, $framerate, $hashes_parent, $height, $keywords_parent, $lang, $medium, $player_parent, $ratings_parent, $restrictions_parent, $samplingrate, $thumbnails_parent, $title_parent, $width)); - } - - $this->data['enclosures'] = array_values(array_unique($this->data['enclosures'])); - } - if (!empty($this->data['enclosures'])) - { - return $this->data['enclosures']; - } - else - { - return null; - } - } - - /** - * Get the latitude coordinates for the item - * - * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications - * - * Uses `<geo:lat>` or `<georss:point>` - * - * @since 1.0 - * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo - * @link http://www.georss.org/ GeoRSS - * @return string|null - */ - public function get_latitude() - { - if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) - { - return (float) $return[0]['data']; - } - elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) - { - return (float) $match[1]; - } - else - { - return null; - } - } - - /** - * Get the longitude coordinates for the item - * - * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications - * - * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>` - * - * @since 1.0 - * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo - * @link http://www.georss.org/ GeoRSS - * @return string|null - */ - public function get_longitude() - { - if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) - { - return (float) $return[0]['data']; - } - elseif ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) - { - return (float) $return[0]['data']; - } - elseif (($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) - { - return (float) $match[2]; - } - else - { - return null; - } - } - - /** - * Get the `<atom:source>` for the item - * - * @since 1.1 - * @return SimplePie_Source|null - */ - public function get_source() - { - if ($return = $this->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'source')) - { - return $this->registry->create('Source', array($this, $return[0])); - } - else - { - return null; - } - } -} - diff --git a/wp/wp-includes/SimplePie/Locator.php b/wp/wp-includes/SimplePie/Locator.php deleted file mode 100644 index da895146..00000000 --- a/wp/wp-includes/SimplePie/Locator.php +++ /dev/null @@ -1,372 +0,0 @@ -<?php -/** - * SimplePie - * - * A PHP-Based RSS and Atom Feed Framework. - * Takes the hard work out of managing a complete RSS/Atom solution. - * - * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * * Neither the name of the SimplePie Team nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS - * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package SimplePie - * @version 1.3.1 - * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue - * @author Ryan Parman - * @author Geoffrey Sneddon - * @author Ryan McCue - * @link http://simplepie.org/ SimplePie - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -/** - * Used for feed auto-discovery - * - * - * This class can be overloaded with {@see SimplePie::set_locator_class()} - * - * @package SimplePie - */ -class SimplePie_Locator -{ - var $useragent; - var $timeout; - var $file; - var $local = array(); - var $elsewhere = array(); - var $cached_entities = array(); - var $http_base; - var $base; - var $base_location = 0; - var $checked_feeds = 0; - var $max_checked_feeds = 10; - protected $registry; - - public function __construct(SimplePie_File $file, $timeout = 10, $useragent = null, $max_checked_feeds = 10) - { - $this->file = $file; - $this->useragent = $useragent; - $this->timeout = $timeout; - $this->max_checked_feeds = $max_checked_feeds; - - if (class_exists('DOMDocument')) - { - $this->dom = new DOMDocument(); - - set_error_handler(array('SimplePie_Misc', 'silence_errors')); - $this->dom->loadHTML($this->file->body); - restore_error_handler(); - } - else - { - $this->dom = null; - } - } - - public function set_registry(SimplePie_Registry $registry) - { - $this->registry = $registry; - } - - public function find($type = SIMPLEPIE_LOCATOR_ALL, &$working) - { - if ($this->is_feed($this->file)) - { - return $this->file; - } - - if ($this->file->method & SIMPLEPIE_FILE_SOURCE_REMOTE) - { - $sniffer = $this->registry->create('Content_Type_Sniffer', array($this->file)); - if ($sniffer->get_type() !== 'text/html') - { - return null; - } - } - - if ($type & ~SIMPLEPIE_LOCATOR_NONE) - { - $this->get_base(); - } - - if ($type & SIMPLEPIE_LOCATOR_AUTODISCOVERY && $working = $this->autodiscovery()) - { - return $working[0]; - } - - if ($type & (SIMPLEPIE_LOCATOR_LOCAL_EXTENSION | SIMPLEPIE_LOCATOR_LOCAL_BODY | SIMPLEPIE_LOCATOR_REMOTE_EXTENSION | SIMPLEPIE_LOCATOR_REMOTE_BODY) && $this->get_links()) - { - if ($type & SIMPLEPIE_LOCATOR_LOCAL_EXTENSION && $working = $this->extension($this->local)) - { - return $working; - } - - if ($type & SIMPLEPIE_LOCATOR_LOCAL_BODY && $working = $this->body($this->local)) - { - return $working; - } - - if ($type & SIMPLEPIE_LOCATOR_REMOTE_EXTENSION && $working = $this->extension($this->elsewhere)) - { - return $working; - } - - if ($type & SIMPLEPIE_LOCATOR_REMOTE_BODY && $working = $this->body($this->elsewhere)) - { - return $working; - } - } - return null; - } - - public function is_feed($file) - { - if ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE) - { - $sniffer = $this->registry->create('Content_Type_Sniffer', array($file)); - $sniffed = $sniffer->get_type(); - if (in_array($sniffed, array('application/rss+xml', 'application/rdf+xml', 'text/rdf', 'application/atom+xml', 'text/xml', 'application/xml'))) - { - return true; - } - else - { - return false; - } - } - elseif ($file->method & SIMPLEPIE_FILE_SOURCE_LOCAL) - { - return true; - } - else - { - return false; - } - } - - public function get_base() - { - if ($this->dom === null) - { - throw new SimplePie_Exception('DOMDocument not found, unable to use locator'); - } - $this->http_base = $this->file->url; - $this->base = $this->http_base; - $elements = $this->dom->getElementsByTagName('base'); - foreach ($elements as $element) - { - if ($element->hasAttribute('href')) - { - $base = $this->registry->call('Misc', 'absolutize_url', array(trim($element->getAttribute('href')), $this->http_base)); - if ($base === false) - { - continue; - } - $this->base = $base; - $this->base_location = method_exists($element, 'getLineNo') ? $element->getLineNo() : 0; - break; - } - } - } - - public function autodiscovery() - { - $done = array(); - $feeds = array(); - $feeds = array_merge($feeds, $this->search_elements_by_tag('link', $done, $feeds)); - $feeds = array_merge($feeds, $this->search_elements_by_tag('a', $done, $feeds)); - $feeds = array_merge($feeds, $this->search_elements_by_tag('area', $done, $feeds)); - - if (!empty($feeds)) - { - return array_values($feeds); - } - else - { - return null; - } - } - - protected function search_elements_by_tag($name, &$done, $feeds) - { - if ($this->dom === null) - { - throw new SimplePie_Exception('DOMDocument not found, unable to use locator'); - } - - $links = $this->dom->getElementsByTagName($name); - foreach ($links as $link) - { - if ($this->checked_feeds === $this->max_checked_feeds) - { - break; - } - if ($link->hasAttribute('href') && $link->hasAttribute('rel')) - { - $rel = array_unique($this->registry->call('Misc', 'space_seperated_tokens', array(strtolower($link->getAttribute('rel'))))); - $line = method_exists($link, 'getLineNo') ? $link->getLineNo() : 1; - - if ($this->base_location < $line) - { - $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base)); - } - else - { - $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base)); - } - if ($href === false) - { - continue; - } - - if (!in_array($href, $done) && in_array('feed', $rel) || (in_array('alternate', $rel) && !in_array('stylesheet', $rel) && $link->hasAttribute('type') && in_array(strtolower($this->registry->call('Misc', 'parse_mime', array($link->getAttribute('type')))), array('application/rss+xml', 'application/atom+xml'))) && !isset($feeds[$href])) - { - $this->checked_feeds++; - $headers = array( - 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', - ); - $feed = $this->registry->create('File', array($href, $this->timeout, 5, $headers, $this->useragent)); - if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) - { - $feeds[$href] = $feed; - } - } - $done[] = $href; - } - } - - return $feeds; - } - - public function get_links() - { - if ($this->dom === null) - { - throw new SimplePie_Exception('DOMDocument not found, unable to use locator'); - } - - $links = $this->dom->getElementsByTagName('a'); - foreach ($links as $link) - { - if ($link->hasAttribute('href')) - { - $href = trim($link->getAttribute('href')); - $parsed = $this->registry->call('Misc', 'parse_url', array($href)); - if ($parsed['scheme'] === '' || preg_match('/^(http(s)|feed)?$/i', $parsed['scheme'])) - { - if (method_exists($link, 'getLineNo') && $this->base_location < $link->getLineNo()) - { - $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->base)); - } - else - { - $href = $this->registry->call('Misc', 'absolutize_url', array(trim($link->getAttribute('href')), $this->http_base)); - } - if ($href === false) - { - continue; - } - - $current = $this->registry->call('Misc', 'parse_url', array($this->file->url)); - - if ($parsed['authority'] === '' || $parsed['authority'] === $current['authority']) - { - $this->local[] = $href; - } - else - { - $this->elsewhere[] = $href; - } - } - } - } - $this->local = array_unique($this->local); - $this->elsewhere = array_unique($this->elsewhere); - if (!empty($this->local) || !empty($this->elsewhere)) - { - return true; - } - return null; - } - - public function extension(&$array) - { - foreach ($array as $key => $value) - { - if ($this->checked_feeds === $this->max_checked_feeds) - { - break; - } - if (in_array(strtolower(strrchr($value, '.')), array('.rss', '.rdf', '.atom', '.xml'))) - { - $this->checked_feeds++; - - $headers = array( - 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', - ); - $feed = $this->registry->create('File', array($value, $this->timeout, 5, $headers, $this->useragent)); - if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) - { - return $feed; - } - else - { - unset($array[$key]); - } - } - } - return null; - } - - public function body(&$array) - { - foreach ($array as $key => $value) - { - if ($this->checked_feeds === $this->max_checked_feeds) - { - break; - } - if (preg_match('/(rss|rdf|atom|xml)/i', $value)) - { - $this->checked_feeds++; - $headers = array( - 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', - ); - $feed = $this->registry->create('File', array($value, $this->timeout, 5, null, $this->useragent)); - if ($feed->success && ($feed->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($feed->status_code === 200 || $feed->status_code > 206 && $feed->status_code < 300)) && $this->is_feed($feed)) - { - return $feed; - } - else - { - unset($array[$key]); - } - } - } - return null; - } -} - diff --git a/wp/wp-includes/SimplePie/Misc.php b/wp/wp-includes/SimplePie/Misc.php deleted file mode 100644 index 1c1b6184..00000000 --- a/wp/wp-includes/SimplePie/Misc.php +++ /dev/null @@ -1,2247 +0,0 @@ -<?php -/** - * SimplePie - * - * A PHP-Based RSS and Atom Feed Framework. - * Takes the hard work out of managing a complete RSS/Atom solution. - * - * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * * Neither the name of the SimplePie Team nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS - * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package SimplePie - * @version 1.3.1 - * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue - * @author Ryan Parman - * @author Geoffrey Sneddon - * @author Ryan McCue - * @link http://simplepie.org/ SimplePie - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -/** - * Miscellanous utilities - * - * @package SimplePie - */ -class SimplePie_Misc -{ - public static function time_hms($seconds) - { - $time = ''; - - $hours = floor($seconds / 3600); - $remainder = $seconds % 3600; - if ($hours > 0) - { - $time .= $hours.':'; - } - - $minutes = floor($remainder / 60); - $seconds = $remainder % 60; - if ($minutes < 10 && $hours > 0) - { - $minutes = '0' . $minutes; - } - if ($seconds < 10) - { - $seconds = '0' . $seconds; - } - - $time .= $minutes.':'; - $time .= $seconds; - - return $time; - } - - public static function absolutize_url($relative, $base) - { - $iri = SimplePie_IRI::absolutize(new SimplePie_IRI($base), $relative); - if ($iri === false) - { - return false; - } - return $iri->get_uri(); - } - - /** - * Get a HTML/XML element from a HTML string - * - * @deprecated Use DOMDocument instead (parsing HTML with regex is bad!) - * @param string $realname Element name (including namespace prefix if applicable) - * @param string $string HTML document - * @return array - */ - public static function get_element($realname, $string) - { - $return = array(); - $name = preg_quote($realname, '/'); - if (preg_match_all("/<($name)" . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . "(>(.*)<\/$name>|(\/)?>)/siU", $string, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) - { - for ($i = 0, $total_matches = count($matches); $i < $total_matches; $i++) - { - $return[$i]['tag'] = $realname; - $return[$i]['full'] = $matches[$i][0][0]; - $return[$i]['offset'] = $matches[$i][0][1]; - if (strlen($matches[$i][3][0]) <= 2) - { - $return[$i]['self_closing'] = true; - } - else - { - $return[$i]['self_closing'] = false; - $return[$i]['content'] = $matches[$i][4][0]; - } - $return[$i]['attribs'] = array(); - if (isset($matches[$i][2][0]) && preg_match_all('/[\x09\x0A\x0B\x0C\x0D\x20]+([^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*)(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"([^"]*)"|\'([^\']*)\'|([^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?/', ' ' . $matches[$i][2][0] . ' ', $attribs, PREG_SET_ORDER)) - { - for ($j = 0, $total_attribs = count($attribs); $j < $total_attribs; $j++) - { - if (count($attribs[$j]) === 2) - { - $attribs[$j][2] = $attribs[$j][1]; - } - $return[$i]['attribs'][strtolower($attribs[$j][1])]['data'] = SimplePie_Misc::entities_decode(end($attribs[$j])); - } - } - } - } - return $return; - } - - public static function element_implode($element) - { - $full = "<$element[tag]"; - foreach ($element['attribs'] as $key => $value) - { - $key = strtolower($key); - $full .= " $key=\"" . htmlspecialchars($value['data']) . '"'; - } - if ($element['self_closing']) - { - $full .= ' />'; - } - else - { - $full .= ">$element[content]</$element[tag]>"; - } - return $full; - } - - public static function error($message, $level, $file, $line) - { - if ((ini_get('error_reporting') & $level) > 0) - { - switch ($level) - { - case E_USER_ERROR: - $note = 'PHP Error'; - break; - case E_USER_WARNING: - $note = 'PHP Warning'; - break; - case E_USER_NOTICE: - $note = 'PHP Notice'; - break; - default: - $note = 'Unknown Error'; - break; - } - - $log_error = true; - if (!function_exists('error_log')) - { - $log_error = false; - } - - $log_file = @ini_get('error_log'); - if (!empty($log_file) && ('syslog' !== $log_file) && !@is_writable($log_file)) - { - $log_error = false; - } - - if ($log_error) - { - @error_log("$note: $message in $file on line $line", 0); - } - } - - return $message; - } - - public static function fix_protocol($url, $http = 1) - { - $url = SimplePie_Misc::normalize_url($url); - $parsed = SimplePie_Misc::parse_url($url); - if ($parsed['scheme'] !== '' && $parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https') - { - return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['authority'], $parsed['path'], $parsed['query'], $parsed['fragment']), $http); - } - - if ($parsed['scheme'] === '' && $parsed['authority'] === '' && !file_exists($url)) - { - return SimplePie_Misc::fix_protocol(SimplePie_Misc::compress_parse_url('http', $parsed['path'], '', $parsed['query'], $parsed['fragment']), $http); - } - - if ($http === 2 && $parsed['scheme'] !== '') - { - return "feed:$url"; - } - elseif ($http === 3 && strtolower($parsed['scheme']) === 'http') - { - return substr_replace($url, 'podcast', 0, 4); - } - elseif ($http === 4 && strtolower($parsed['scheme']) === 'http') - { - return substr_replace($url, 'itpc', 0, 4); - } - else - { - return $url; - } - } - - public static function parse_url($url) - { - $iri = new SimplePie_IRI($url); - return array( - 'scheme' => (string) $iri->scheme, - 'authority' => (string) $iri->authority, - 'path' => (string) $iri->path, - 'query' => (string) $iri->query, - 'fragment' => (string) $iri->fragment - ); - } - - public static function compress_parse_url($scheme = '', $authority = '', $path = '', $query = '', $fragment = '') - { - $iri = new SimplePie_IRI(''); - $iri->scheme = $scheme; - $iri->authority = $authority; - $iri->path = $path; - $iri->query = $query; - $iri->fragment = $fragment; - return $iri->get_uri(); - } - - public static function normalize_url($url) - { - $iri = new SimplePie_IRI($url); - return $iri->get_uri(); - } - - public static function percent_encoding_normalization($match) - { - $integer = hexdec($match[1]); - if ($integer >= 0x41 && $integer <= 0x5A || $integer >= 0x61 && $integer <= 0x7A || $integer >= 0x30 && $integer <= 0x39 || $integer === 0x2D || $integer === 0x2E || $integer === 0x5F || $integer === 0x7E) - { - return chr($integer); - } - else - { - return strtoupper($match[0]); - } - } - - /** - * Converts a Windows-1252 encoded string to a UTF-8 encoded string - * - * @static - * @param string $string Windows-1252 encoded string - * @return string UTF-8 encoded string - */ - public static function windows_1252_to_utf8($string) - { - static $convert_table = array("\x80" => "\xE2\x82\xAC", "\x81" => "\xEF\xBF\xBD", "\x82" => "\xE2\x80\x9A", "\x83" => "\xC6\x92", "\x84" => "\xE2\x80\x9E", "\x85" => "\xE2\x80\xA6", "\x86" => "\xE2\x80\xA0", "\x87" => "\xE2\x80\xA1", "\x88" => "\xCB\x86", "\x89" => "\xE2\x80\xB0", "\x8A" => "\xC5\xA0", "\x8B" => "\xE2\x80\xB9", "\x8C" => "\xC5\x92", "\x8D" => "\xEF\xBF\xBD", "\x8E" => "\xC5\xBD", "\x8F" => "\xEF\xBF\xBD", "\x90" => "\xEF\xBF\xBD", "\x91" => "\xE2\x80\x98", "\x92" => "\xE2\x80\x99", "\x93" => "\xE2\x80\x9C", "\x94" => "\xE2\x80\x9D", "\x95" => "\xE2\x80\xA2", "\x96" => "\xE2\x80\x93", "\x97" => "\xE2\x80\x94", "\x98" => "\xCB\x9C", "\x99" => "\xE2\x84\xA2", "\x9A" => "\xC5\xA1", "\x9B" => "\xE2\x80\xBA", "\x9C" => "\xC5\x93", "\x9D" => "\xEF\xBF\xBD", "\x9E" => "\xC5\xBE", "\x9F" => "\xC5\xB8", "\xA0" => "\xC2\xA0", "\xA1" => "\xC2\xA1", "\xA2" => "\xC2\xA2", "\xA3" => "\xC2\xA3", "\xA4" => "\xC2\xA4", "\xA5" => "\xC2\xA5", "\xA6" => "\xC2\xA6", "\xA7" => "\xC2\xA7", "\xA8" => "\xC2\xA8", "\xA9" => "\xC2\xA9", "\xAA" => "\xC2\xAA", "\xAB" => "\xC2\xAB", "\xAC" => "\xC2\xAC", "\xAD" => "\xC2\xAD", "\xAE" => "\xC2\xAE", "\xAF" => "\xC2\xAF", "\xB0" => "\xC2\xB0", "\xB1" => "\xC2\xB1", "\xB2" => "\xC2\xB2", "\xB3" => "\xC2\xB3", "\xB4" => "\xC2\xB4", "\xB5" => "\xC2\xB5", "\xB6" => "\xC2\xB6", "\xB7" => "\xC2\xB7", "\xB8" => "\xC2\xB8", "\xB9" => "\xC2\xB9", "\xBA" => "\xC2\xBA", "\xBB" => "\xC2\xBB", "\xBC" => "\xC2\xBC", "\xBD" => "\xC2\xBD", "\xBE" => "\xC2\xBE", "\xBF" => "\xC2\xBF", "\xC0" => "\xC3\x80", "\xC1" => "\xC3\x81", "\xC2" => "\xC3\x82", "\xC3" => "\xC3\x83", "\xC4" => "\xC3\x84", "\xC5" => "\xC3\x85", "\xC6" => "\xC3\x86", "\xC7" => "\xC3\x87", "\xC8" => "\xC3\x88", "\xC9" => "\xC3\x89", "\xCA" => "\xC3\x8A", "\xCB" => "\xC3\x8B", "\xCC" => "\xC3\x8C", "\xCD" => "\xC3\x8D", "\xCE" => "\xC3\x8E", "\xCF" => "\xC3\x8F", "\xD0" => "\xC3\x90", "\xD1" => "\xC3\x91", "\xD2" => "\xC3\x92", "\xD3" => "\xC3\x93", "\xD4" => "\xC3\x94", "\xD5" => "\xC3\x95", "\xD6" => "\xC3\x96", "\xD7" => "\xC3\x97", "\xD8" => "\xC3\x98", "\xD9" => "\xC3\x99", "\xDA" => "\xC3\x9A", "\xDB" => "\xC3\x9B", "\xDC" => "\xC3\x9C", "\xDD" => "\xC3\x9D", "\xDE" => "\xC3\x9E", "\xDF" => "\xC3\x9F", "\xE0" => "\xC3\xA0", "\xE1" => "\xC3\xA1", "\xE2" => "\xC3\xA2", "\xE3" => "\xC3\xA3", "\xE4" => "\xC3\xA4", "\xE5" => "\xC3\xA5", "\xE6" => "\xC3\xA6", "\xE7" => "\xC3\xA7", "\xE8" => "\xC3\xA8", "\xE9" => "\xC3\xA9", "\xEA" => "\xC3\xAA", "\xEB" => "\xC3\xAB", "\xEC" => "\xC3\xAC", "\xED" => "\xC3\xAD", "\xEE" => "\xC3\xAE", "\xEF" => "\xC3\xAF", "\xF0" => "\xC3\xB0", "\xF1" => "\xC3\xB1", "\xF2" => "\xC3\xB2", "\xF3" => "\xC3\xB3", "\xF4" => "\xC3\xB4", "\xF5" => "\xC3\xB5", "\xF6" => "\xC3\xB6", "\xF7" => "\xC3\xB7", "\xF8" => "\xC3\xB8", "\xF9" => "\xC3\xB9", "\xFA" => "\xC3\xBA", "\xFB" => "\xC3\xBB", "\xFC" => "\xC3\xBC", "\xFD" => "\xC3\xBD", "\xFE" => "\xC3\xBE", "\xFF" => "\xC3\xBF"); - - return strtr($string, $convert_table); - } - - /** - * Change a string from one encoding to another - * - * @param string $data Raw data in $input encoding - * @param string $input Encoding of $data - * @param string $output Encoding you want - * @return string|boolean False if we can't convert it - */ - public static function change_encoding($data, $input, $output) - { - $input = SimplePie_Misc::encoding($input); - $output = SimplePie_Misc::encoding($output); - - // We fail to fail on non US-ASCII bytes - if ($input === 'US-ASCII') - { - static $non_ascii_octects = ''; - if (!$non_ascii_octects) - { - for ($i = 0x80; $i <= 0xFF; $i++) - { - $non_ascii_octects .= chr($i); - } - } - $data = substr($data, 0, strcspn($data, $non_ascii_octects)); - } - - // This is first, as behaviour of this is completely predictable - if ($input === 'windows-1252' && $output === 'UTF-8') - { - return SimplePie_Misc::windows_1252_to_utf8($data); - } - // This is second, as behaviour of this varies only with PHP version (the middle part of this expression checks the encoding is supported). - elseif (function_exists('mb_convert_encoding') && ($return = SimplePie_Misc::change_encoding_mbstring($data, $input, $output))) - { - return $return; - } - // This is last, as behaviour of this varies with OS userland and PHP version - elseif (function_exists('iconv') && ($return = SimplePie_Misc::change_encoding_iconv($data, $input, $output))) - { - return $return; - } - // If we can't do anything, just fail - else - { - return false; - } - } - - protected static function change_encoding_mbstring($data, $input, $output) - { - if ($input === 'windows-949') - { - $input = 'EUC-KR'; - } - if ($output === 'windows-949') - { - $output = 'EUC-KR'; - } - if ($input === 'Windows-31J') - { - $input = 'SJIS'; - } - if ($output === 'Windows-31J') - { - $output = 'SJIS'; - } - - // Check that the encoding is supported - if (@mb_convert_encoding("\x80", 'UTF-16BE', $input) === "\x00\x80") - { - return false; - } - if (!in_array($input, mb_list_encodings())) - { - return false; - } - - // Let's do some conversion - if ($return = @mb_convert_encoding($data, $output, $input)) - { - return $return; - } - - return false; - } - - protected static function change_encoding_iconv($data, $input, $output) - { - return @iconv($input, $output, $data); - } - - /** - * Normalize an encoding name - * - * This is automatically generated by create.php - * - * To generate it, run `php create.php` on the command line, and copy the - * output to replace this function. - * - * @param string $charset Character set to standardise - * @return string Standardised name - */ - public static function encoding($charset) - { - // Normalization from UTS #22 - switch (strtolower(preg_replace('/(?:[^a-zA-Z0-9]+|([^0-9])0+)/', '\1', $charset))) - { - case 'adobestandardencoding': - case 'csadobestandardencoding': - return 'Adobe-Standard-Encoding'; - - case 'adobesymbolencoding': - case 'cshppsmath': - return 'Adobe-Symbol-Encoding'; - - case 'ami1251': - case 'amiga1251': - return 'Amiga-1251'; - - case 'ansix31101983': - case 'csat5001983': - case 'csiso99naplps': - case 'isoir99': - case 'naplps': - return 'ANSI_X3.110-1983'; - - case 'arabic7': - case 'asmo449': - case 'csiso89asmo449': - case 'iso9036': - case 'isoir89': - return 'ASMO_449'; - - case 'big5': - case 'csbig5': - return 'Big5'; - - case 'big5hkscs': - return 'Big5-HKSCS'; - - case 'bocu1': - case 'csbocu1': - return 'BOCU-1'; - - case 'brf': - case 'csbrf': - return 'BRF'; - - case 'bs4730': - case 'csiso4unitedkingdom': - case 'gb': - case 'iso646gb': - case 'isoir4': - case 'uk': - return 'BS_4730'; - - case 'bsviewdata': - case 'csiso47bsviewdata': - case 'isoir47': - return 'BS_viewdata'; - - case 'cesu8': - case 'cscesu8': - return 'CESU-8'; - - case 'ca': - case 'csa71': - case 'csaz243419851': - case 'csiso121canadian1': - case 'iso646ca': - case 'isoir121': - return 'CSA_Z243.4-1985-1'; - - case 'csa72': - case 'csaz243419852': - case 'csiso122canadian2': - case 'iso646ca2': - case 'isoir122': - return 'CSA_Z243.4-1985-2'; - - case 'csaz24341985gr': - case 'csiso123csaz24341985gr': - case 'isoir123': - return 'CSA_Z243.4-1985-gr'; - - case 'csiso139csn369103': - case 'csn369103': - case 'isoir139': - return 'CSN_369103'; - - case 'csdecmcs': - case 'dec': - case 'decmcs': - return 'DEC-MCS'; - - case 'csiso21german': - case 'de': - case 'din66003': - case 'iso646de': - case 'isoir21': - return 'DIN_66003'; - - case 'csdkus': - case 'dkus': - return 'dk-us'; - - case 'csiso646danish': - case 'dk': - case 'ds2089': - case 'iso646dk': - return 'DS_2089'; - - case 'csibmebcdicatde': - case 'ebcdicatde': - return 'EBCDIC-AT-DE'; - - case 'csebcdicatdea': - case 'ebcdicatdea': - return 'EBCDIC-AT-DE-A'; - - case 'csebcdiccafr': - case 'ebcdiccafr': - return 'EBCDIC-CA-FR'; - - case 'csebcdicdkno': - case 'ebcdicdkno': - return 'EBCDIC-DK-NO'; - - case 'csebcdicdknoa': - case 'ebcdicdknoa': - return 'EBCDIC-DK-NO-A'; - - case 'csebcdices': - case 'ebcdices': - return 'EBCDIC-ES'; - - case 'csebcdicesa': - case 'ebcdicesa': - return 'EBCDIC-ES-A'; - - case 'csebcdicess': - case 'ebcdicess': - return 'EBCDIC-ES-S'; - - case 'csebcdicfise': - case 'ebcdicfise': - return 'EBCDIC-FI-SE'; - - case 'csebcdicfisea': - case 'ebcdicfisea': - return 'EBCDIC-FI-SE-A'; - - case 'csebcdicfr': - case 'ebcdicfr': - return 'EBCDIC-FR'; - - case 'csebcdicit': - case 'ebcdicit': - return 'EBCDIC-IT'; - - case 'csebcdicpt': - case 'ebcdicpt': - return 'EBCDIC-PT'; - - case 'csebcdicuk': - case 'ebcdicuk': - return 'EBCDIC-UK'; - - case 'csebcdicus': - case 'ebcdicus': - return 'EBCDIC-US'; - - case 'csiso111ecmacyrillic': - case 'ecmacyrillic': - case 'isoir111': - case 'koi8e': - return 'ECMA-cyrillic'; - - case 'csiso17spanish': - case 'es': - case 'iso646es': - case 'isoir17': - return 'ES'; - - case 'csiso85spanish2': - case 'es2': - case 'iso646es2': - case 'isoir85': - return 'ES2'; - - case 'cseucpkdfmtjapanese': - case 'eucjp': - case 'extendedunixcodepackedformatforjapanese': - return 'EUC-JP'; - - case 'cseucfixwidjapanese': - case 'extendedunixcodefixedwidthforjapanese': - return 'Extended_UNIX_Code_Fixed_Width_for_Japanese'; - - case 'gb18030': - return 'GB18030'; - - case 'chinese': - case 'cp936': - case 'csgb2312': - case 'csiso58gb231280': - case 'gb2312': - case 'gb231280': - case 'gbk': - case 'isoir58': - case 'ms936': - case 'windows936': - return 'GBK'; - - case 'cn': - case 'csiso57gb1988': - case 'gb198880': - case 'iso646cn': - case 'isoir57': - return 'GB_1988-80'; - - case 'csiso153gost1976874': - case 'gost1976874': - case 'isoir153': - case 'stsev35888': - return 'GOST_19768-74'; - - case 'csiso150': - case 'csiso150greekccitt': - case 'greekccitt': - case 'isoir150': - return 'greek-ccitt'; - - case 'csiso88greek7': - case 'greek7': - case 'isoir88': - return 'greek7'; - - case 'csiso18greek7old': - case 'greek7old': - case 'isoir18': - return 'greek7-old'; - - case 'cshpdesktop': - case 'hpdesktop': - return 'HP-DeskTop'; - - case 'cshplegal': - case 'hplegal': - return 'HP-Legal'; - - case 'cshpmath8': - case 'hpmath8': - return 'HP-Math8'; - - case 'cshppifont': - case 'hppifont': - return 'HP-Pi-font'; - - case 'cshproman8': - case 'hproman8': - case 'r8': - case 'roman8': - return 'hp-roman8'; - - case 'hzgb2312': - return 'HZ-GB-2312'; - - case 'csibmsymbols': - case 'ibmsymbols': - return 'IBM-Symbols'; - - case 'csibmthai': - case 'ibmthai': - return 'IBM-Thai'; - - case 'cp37': - case 'csibm37': - case 'ebcdiccpca': - case 'ebcdiccpnl': - case 'ebcdiccpus': - case 'ebcdiccpwt': - case 'ibm37': - return 'IBM037'; - - case 'cp38': - case 'csibm38': - case 'ebcdicint': - case 'ibm38': - return 'IBM038'; - - case 'cp273': - case 'csibm273': - case 'ibm273': - return 'IBM273'; - - case 'cp274': - case 'csibm274': - case 'ebcdicbe': - case 'ibm274': - return 'IBM274'; - - case 'cp275': - case 'csibm275': - case 'ebcdicbr': - case 'ibm275': - return 'IBM275'; - - case 'csibm277': - case 'ebcdiccpdk': - case 'ebcdiccpno': - case 'ibm277': - return 'IBM277'; - - case 'cp278': - case 'csibm278': - case 'ebcdiccpfi': - case 'ebcdiccpse': - case 'ibm278': - return 'IBM278'; - - case 'cp280': - case 'csibm280': - case 'ebcdiccpit': - case 'ibm280': - return 'IBM280'; - - case 'cp281': - case 'csibm281': - case 'ebcdicjpe': - case 'ibm281': - return 'IBM281'; - - case 'cp284': - case 'csibm284': - case 'ebcdiccpes': - case 'ibm284': - return 'IBM284'; - - case 'cp285': - case 'csibm285': - case 'ebcdiccpgb': - case 'ibm285': - return 'IBM285'; - - case 'cp290': - case 'csibm290': - case 'ebcdicjpkana': - case 'ibm290': - return 'IBM290'; - - case 'cp297': - case 'csibm297': - case 'ebcdiccpfr': - case 'ibm297': - return 'IBM297'; - - case 'cp420': - case 'csibm420': - case 'ebcdiccpar1': - case 'ibm420': - return 'IBM420'; - - case 'cp423': - case 'csibm423': - case 'ebcdiccpgr': - case 'ibm423': - return 'IBM423'; - - case 'cp424': - case 'csibm424': - case 'ebcdiccphe': - case 'ibm424': - return 'IBM424'; - - case '437': - case 'cp437': - case 'cspc8codepage437': - case 'ibm437': - return 'IBM437'; - - case 'cp500': - case 'csibm500': - case 'ebcdiccpbe': - case 'ebcdiccpch': - case 'ibm500': - return 'IBM500'; - - case 'cp775': - case 'cspc775baltic': - case 'ibm775': - return 'IBM775'; - - case '850': - case 'cp850': - case 'cspc850multilingual': - case 'ibm850': - return 'IBM850'; - - case '851': - case 'cp851': - case 'csibm851': - case 'ibm851': - return 'IBM851'; - - case '852': - case 'cp852': - case 'cspcp852': - case 'ibm852': - return 'IBM852'; - - case '855': - case 'cp855': - case 'csibm855': - case 'ibm855': - return 'IBM855'; - - case '857': - case 'cp857': - case 'csibm857': - case 'ibm857': - return 'IBM857'; - - case 'ccsid858': - case 'cp858': - case 'ibm858': - case 'pcmultilingual850euro': - return 'IBM00858'; - - case '860': - case 'cp860': - case 'csibm860': - case 'ibm860': - return 'IBM860'; - - case '861': - case 'cp861': - case 'cpis': - case 'csibm861': - case 'ibm861': - return 'IBM861'; - - case '862': - case 'cp862': - case 'cspc862latinhebrew': - case 'ibm862': - return 'IBM862'; - - case '863': - case 'cp863': - case 'csibm863': - case 'ibm863': - return 'IBM863'; - - case 'cp864': - case 'csibm864': - case 'ibm864': - return 'IBM864'; - - case '865': - case 'cp865': - case 'csibm865': - case 'ibm865': - return 'IBM865'; - - case '866': - case 'cp866': - case 'csibm866': - case 'ibm866': - return 'IBM866'; - - case 'cp868': - case 'cpar': - case 'csibm868': - case 'ibm868': - return 'IBM868'; - - case '869': - case 'cp869': - case 'cpgr': - case 'csibm869': - case 'ibm869': - return 'IBM869'; - - case 'cp870': - case 'csibm870': - case 'ebcdiccproece': - case 'ebcdiccpyu': - case 'ibm870': - return 'IBM870'; - - case 'cp871': - case 'csibm871': - case 'ebcdiccpis': - case 'ibm871': - return 'IBM871'; - - case 'cp880': - case 'csibm880': - case 'ebcdiccyrillic': - case 'ibm880': - return 'IBM880'; - - case 'cp891': - case 'csibm891': - case 'ibm891': - return 'IBM891'; - - case 'cp903': - case 'csibm903': - case 'ibm903': - return 'IBM903'; - - case '904': - case 'cp904': - case 'csibbm904': - case 'ibm904': - return 'IBM904'; - - case 'cp905': - case 'csibm905': - case 'ebcdiccptr': - case 'ibm905': - return 'IBM905'; - - case 'cp918': - case 'csibm918': - case 'ebcdiccpar2': - case 'ibm918': - return 'IBM918'; - - case 'ccsid924': - case 'cp924': - case 'ebcdiclatin9euro': - case 'ibm924': - return 'IBM00924'; - - case 'cp1026': - case 'csibm1026': - case 'ibm1026': - return 'IBM1026'; - - case 'ibm1047': - return 'IBM1047'; - - case 'ccsid1140': - case 'cp1140': - case 'ebcdicus37euro': - case 'ibm1140': - return 'IBM01140'; - - case 'ccsid1141': - case 'cp1141': - case 'ebcdicde273euro': - case 'ibm1141': - return 'IBM01141'; - - case 'ccsid1142': - case 'cp1142': - case 'ebcdicdk277euro': - case 'ebcdicno277euro': - case 'ibm1142': - return 'IBM01142'; - - case 'ccsid1143': - case 'cp1143': - case 'ebcdicfi278euro': - case 'ebcdicse278euro': - case 'ibm1143': - return 'IBM01143'; - - case 'ccsid1144': - case 'cp1144': - case 'ebcdicit280euro': - case 'ibm1144': - return 'IBM01144'; - - case 'ccsid1145': - case 'cp1145': - case 'ebcdices284euro': - case 'ibm1145': - return 'IBM01145'; - - case 'ccsid1146': - case 'cp1146': - case 'ebcdicgb285euro': - case 'ibm1146': - return 'IBM01146'; - - case 'ccsid1147': - case 'cp1147': - case 'ebcdicfr297euro': - case 'ibm1147': - return 'IBM01147'; - - case 'ccsid1148': - case 'cp1148': - case 'ebcdicinternational500euro': - case 'ibm1148': - return 'IBM01148'; - - case 'ccsid1149': - case 'cp1149': - case 'ebcdicis871euro': - case 'ibm1149': - return 'IBM01149'; - - case 'csiso143iecp271': - case 'iecp271': - case 'isoir143': - return 'IEC_P27-1'; - - case 'csiso49inis': - case 'inis': - case 'isoir49': - return 'INIS'; - - case 'csiso50inis8': - case 'inis8': - case 'isoir50': - return 'INIS-8'; - - case 'csiso51iniscyrillic': - case 'iniscyrillic': - case 'isoir51': - return 'INIS-cyrillic'; - - case 'csinvariant': - case 'invariant': - return 'INVARIANT'; - - case 'iso2022cn': - return 'ISO-2022-CN'; - - case 'iso2022cnext': - return 'ISO-2022-CN-EXT'; - - case 'csiso2022jp': - case 'iso2022jp': - return 'ISO-2022-JP'; - - case 'csiso2022jp2': - case 'iso2022jp2': - return 'ISO-2022-JP-2'; - - case 'csiso2022kr': - case 'iso2022kr': - return 'ISO-2022-KR'; - - case 'cswindows30latin1': - case 'iso88591windows30latin1': - return 'ISO-8859-1-Windows-3.0-Latin-1'; - - case 'cswindows31latin1': - case 'iso88591windows31latin1': - return 'ISO-8859-1-Windows-3.1-Latin-1'; - - case 'csisolatin2': - case 'iso88592': - case 'iso885921987': - case 'isoir101': - case 'l2': - case 'latin2': - return 'ISO-8859-2'; - - case 'cswindows31latin2': - case 'iso88592windowslatin2': - return 'ISO-8859-2-Windows-Latin-2'; - - case 'csisolatin3': - case 'iso88593': - case 'iso885931988': - case 'isoir109': - case 'l3': - case 'latin3': - return 'ISO-8859-3'; - - case 'csisolatin4': - case 'iso88594': - case 'iso885941988': - case 'isoir110': - case 'l4': - case 'latin4': - return 'ISO-8859-4'; - - case 'csisolatincyrillic': - case 'cyrillic': - case 'iso88595': - case 'iso885951988': - case 'isoir144': - return 'ISO-8859-5'; - - case 'arabic': - case 'asmo708': - case 'csisolatinarabic': - case 'ecma114': - case 'iso88596': - case 'iso885961987': - case 'isoir127': - return 'ISO-8859-6'; - - case 'csiso88596e': - case 'iso88596e': - return 'ISO-8859-6-E'; - - case 'csiso88596i': - case 'iso88596i': - return 'ISO-8859-6-I'; - - case 'csisolatingreek': - case 'ecma118': - case 'elot928': - case 'greek': - case 'greek8': - case 'iso88597': - case 'iso885971987': - case 'isoir126': - return 'ISO-8859-7'; - - case 'csisolatinhebrew': - case 'hebrew': - case 'iso88598': - case 'iso885981988': - case 'isoir138': - return 'ISO-8859-8'; - - case 'csiso88598e': - case 'iso88598e': - return 'ISO-8859-8-E'; - - case 'csiso88598i': - case 'iso88598i': - return 'ISO-8859-8-I'; - - case 'cswindows31latin5': - case 'iso88599windowslatin5': - return 'ISO-8859-9-Windows-Latin-5'; - - case 'csisolatin6': - case 'iso885910': - case 'iso8859101992': - case 'isoir157': - case 'l6': - case 'latin6': - return 'ISO-8859-10'; - - case 'iso885913': - return 'ISO-8859-13'; - - case 'iso885914': - case 'iso8859141998': - case 'isoceltic': - case 'isoir199': - case 'l8': - case 'latin8': - return 'ISO-8859-14'; - - case 'iso885915': - case 'latin9': - return 'ISO-8859-15'; - - case 'iso885916': - case 'iso8859162001': - case 'isoir226': - case 'l10': - case 'latin10': - return 'ISO-8859-16'; - - case 'iso10646j1': - return 'ISO-10646-J-1'; - - case 'csunicode': - case 'iso10646ucs2': - return 'ISO-10646-UCS-2'; - - case 'csucs4': - case 'iso10646ucs4': - return 'ISO-10646-UCS-4'; - - case 'csunicodeascii': - case 'iso10646ucsbasic': - return 'ISO-10646-UCS-Basic'; - - case 'csunicodelatin1': - case 'iso10646': - case 'iso10646unicodelatin1': - return 'ISO-10646-Unicode-Latin1'; - - case 'csiso10646utf1': - case 'iso10646utf1': - return 'ISO-10646-UTF-1'; - - case 'csiso115481': - case 'iso115481': - case 'isotr115481': - return 'ISO-11548-1'; - - case 'csiso90': - case 'isoir90': - return 'iso-ir-90'; - - case 'csunicodeibm1261': - case 'isounicodeibm1261': - return 'ISO-Unicode-IBM-1261'; - - case 'csunicodeibm1264': - case 'isounicodeibm1264': - return 'ISO-Unicode-IBM-1264'; - - case 'csunicodeibm1265': - case 'isounicodeibm1265': - return 'ISO-Unicode-IBM-1265'; - - case 'csunicodeibm1268': - case 'isounicodeibm1268': - return 'ISO-Unicode-IBM-1268'; - - case 'csunicodeibm1276': - case 'isounicodeibm1276': - return 'ISO-Unicode-IBM-1276'; - - case 'csiso646basic1983': - case 'iso646basic1983': - case 'ref': - return 'ISO_646.basic:1983'; - - case 'csiso2intlrefversion': - case 'irv': - case 'iso646irv1983': - case 'isoir2': - return 'ISO_646.irv:1983'; - - case 'csiso2033': - case 'e13b': - case 'iso20331983': - case 'isoir98': - return 'ISO_2033-1983'; - - case 'csiso5427cyrillic': - case 'iso5427': - case 'isoir37': - return 'ISO_5427'; - - case 'iso5427cyrillic1981': - case 'iso54271981': - case 'isoir54': - return 'ISO_5427:1981'; - - case 'csiso5428greek': - case 'iso54281980': - case 'isoir55': - return 'ISO_5428:1980'; - - case 'csiso6937add': - case 'iso6937225': - case 'isoir152': - return 'ISO_6937-2-25'; - - case 'csisotextcomm': - case 'iso69372add': - case 'isoir142': - return 'ISO_6937-2-add'; - - case 'csiso8859supp': - case 'iso8859supp': - case 'isoir154': - case 'latin125': - return 'ISO_8859-supp'; - - case 'csiso10367box': - case 'iso10367box': - case 'isoir155': - return 'ISO_10367-box'; - - case 'csiso15italian': - case 'iso646it': - case 'isoir15': - case 'it': - return 'IT'; - - case 'csiso13jisc6220jp': - case 'isoir13': - case 'jisc62201969': - case 'jisc62201969jp': - case 'katakana': - case 'x2017': - return 'JIS_C6220-1969-jp'; - - case 'csiso14jisc6220ro': - case 'iso646jp': - case 'isoir14': - case 'jisc62201969ro': - case 'jp': - return 'JIS_C6220-1969-ro'; - - case 'csiso42jisc62261978': - case 'isoir42': - case 'jisc62261978': - return 'JIS_C6226-1978'; - - case 'csiso87jisx208': - case 'isoir87': - case 'jisc62261983': - case 'jisx2081983': - case 'x208': - return 'JIS_C6226-1983'; - - case 'csiso91jisc62291984a': - case 'isoir91': - case 'jisc62291984a': - case 'jpocra': - return 'JIS_C6229-1984-a'; - - case 'csiso92jisc62991984b': - case 'iso646jpocrb': - case 'isoir92': - case 'jisc62291984b': - case 'jpocrb': - return 'JIS_C6229-1984-b'; - - case 'csiso93jis62291984badd': - case 'isoir93': - case 'jisc62291984badd': - case 'jpocrbadd': - return 'JIS_C6229-1984-b-add'; - - case 'csiso94jis62291984hand': - case 'isoir94': - case 'jisc62291984hand': - case 'jpocrhand': - return 'JIS_C6229-1984-hand'; - - case 'csiso95jis62291984handadd': - case 'isoir95': - case 'jisc62291984handadd': - case 'jpocrhandadd': - return 'JIS_C6229-1984-hand-add'; - - case 'csiso96jisc62291984kana': - case 'isoir96': - case 'jisc62291984kana': - return 'JIS_C6229-1984-kana'; - - case 'csjisencoding': - case 'jisencoding': - return 'JIS_Encoding'; - - case 'cshalfwidthkatakana': - case 'jisx201': - case 'x201': - return 'JIS_X0201'; - - case 'csiso159jisx2121990': - case 'isoir159': - case 'jisx2121990': - case 'x212': - return 'JIS_X0212-1990'; - - case 'csiso141jusib1002': - case 'iso646yu': - case 'isoir141': - case 'js': - case 'jusib1002': - case 'yu': - return 'JUS_I.B1.002'; - - case 'csiso147macedonian': - case 'isoir147': - case 'jusib1003mac': - case 'macedonian': - return 'JUS_I.B1.003-mac'; - - case 'csiso146serbian': - case 'isoir146': - case 'jusib1003serb': - case 'serbian': - return 'JUS_I.B1.003-serb'; - - case 'koi7switched': - return 'KOI7-switched'; - - case 'cskoi8r': - case 'koi8r': - return 'KOI8-R'; - - case 'koi8u': - return 'KOI8-U'; - - case 'csksc5636': - case 'iso646kr': - case 'ksc5636': - return 'KSC5636'; - - case 'cskz1048': - case 'kz1048': - case 'rk1048': - case 'strk10482002': - return 'KZ-1048'; - - case 'csiso19latingreek': - case 'isoir19': - case 'latingreek': - return 'latin-greek'; - - case 'csiso27latingreek1': - case 'isoir27': - case 'latingreek1': - return 'Latin-greek-1'; - - case 'csiso158lap': - case 'isoir158': - case 'lap': - case 'latinlap': - return 'latin-lap'; - - case 'csmacintosh': - case 'mac': - case 'macintosh': - return 'macintosh'; - - case 'csmicrosoftpublishing': - case 'microsoftpublishing': - return 'Microsoft-Publishing'; - - case 'csmnem': - case 'mnem': - return 'MNEM'; - - case 'csmnemonic': - case 'mnemonic': - return 'MNEMONIC'; - - case 'csiso86hungarian': - case 'hu': - case 'iso646hu': - case 'isoir86': - case 'msz77953': - return 'MSZ_7795.3'; - - case 'csnatsdano': - case 'isoir91': - case 'natsdano': - return 'NATS-DANO'; - - case 'csnatsdanoadd': - case 'isoir92': - case 'natsdanoadd': - return 'NATS-DANO-ADD'; - - case 'csnatssefi': - case 'isoir81': - case 'natssefi': - return 'NATS-SEFI'; - - case 'csnatssefiadd': - case 'isoir82': - case 'natssefiadd': - return 'NATS-SEFI-ADD'; - - case 'csiso151cuba': - case 'cuba': - case 'iso646cu': - case 'isoir151': - case 'ncnc1081': - return 'NC_NC00-10:81'; - - case 'csiso69french': - case 'fr': - case 'iso646fr': - case 'isoir69': - case 'nfz62010': - return 'NF_Z_62-010'; - - case 'csiso25french': - case 'iso646fr1': - case 'isoir25': - case 'nfz620101973': - return 'NF_Z_62-010_(1973)'; - - case 'csiso60danishnorwegian': - case 'csiso60norwegian1': - case 'iso646no': - case 'isoir60': - case 'no': - case 'ns45511': - return 'NS_4551-1'; - - case 'csiso61norwegian2': - case 'iso646no2': - case 'isoir61': - case 'no2': - case 'ns45512': - return 'NS_4551-2'; - - case 'osdebcdicdf3irv': - return 'OSD_EBCDIC_DF03_IRV'; - - case 'osdebcdicdf41': - return 'OSD_EBCDIC_DF04_1'; - - case 'osdebcdicdf415': - return 'OSD_EBCDIC_DF04_15'; - - case 'cspc8danishnorwegian': - case 'pc8danishnorwegian': - return 'PC8-Danish-Norwegian'; - - case 'cspc8turkish': - case 'pc8turkish': - return 'PC8-Turkish'; - - case 'csiso16portuguese': - case 'iso646pt': - case 'isoir16': - case 'pt': - return 'PT'; - - case 'csiso84portuguese2': - case 'iso646pt2': - case 'isoir84': - case 'pt2': - return 'PT2'; - - case 'cp154': - case 'csptcp154': - case 'cyrillicasian': - case 'pt154': - case 'ptcp154': - return 'PTCP154'; - - case 'scsu': - return 'SCSU'; - - case 'csiso10swedish': - case 'fi': - case 'iso646fi': - case 'iso646se': - case 'isoir10': - case 'se': - case 'sen850200b': - return 'SEN_850200_B'; - - case 'csiso11swedishfornames': - case 'iso646se2': - case 'isoir11': - case 'se2': - case 'sen850200c': - return 'SEN_850200_C'; - - case 'csiso102t617bit': - case 'isoir102': - case 't617bit': - return 'T.61-7bit'; - - case 'csiso103t618bit': - case 'isoir103': - case 't61': - case 't618bit': - return 'T.61-8bit'; - - case 'csiso128t101g2': - case 'isoir128': - case 't101g2': - return 'T.101-G2'; - - case 'cstscii': - case 'tscii': - return 'TSCII'; - - case 'csunicode11': - case 'unicode11': - return 'UNICODE-1-1'; - - case 'csunicode11utf7': - case 'unicode11utf7': - return 'UNICODE-1-1-UTF-7'; - - case 'csunknown8bit': - case 'unknown8bit': - return 'UNKNOWN-8BIT'; - - case 'ansix341968': - case 'ansix341986': - case 'ascii': - case 'cp367': - case 'csascii': - case 'ibm367': - case 'iso646irv1991': - case 'iso646us': - case 'isoir6': - case 'us': - case 'usascii': - return 'US-ASCII'; - - case 'csusdk': - case 'usdk': - return 'us-dk'; - - case 'utf7': - return 'UTF-7'; - - case 'utf8': - return 'UTF-8'; - - case 'utf16': - return 'UTF-16'; - - case 'utf16be': - return 'UTF-16BE'; - - case 'utf16le': - return 'UTF-16LE'; - - case 'utf32': - return 'UTF-32'; - - case 'utf32be': - return 'UTF-32BE'; - - case 'utf32le': - return 'UTF-32LE'; - - case 'csventurainternational': - case 'venturainternational': - return 'Ventura-International'; - - case 'csventuramath': - case 'venturamath': - return 'Ventura-Math'; - - case 'csventuraus': - case 'venturaus': - return 'Ventura-US'; - - case 'csiso70videotexsupp1': - case 'isoir70': - case 'videotexsuppl': - return 'videotex-suppl'; - - case 'csviqr': - case 'viqr': - return 'VIQR'; - - case 'csviscii': - case 'viscii': - return 'VISCII'; - - case 'csshiftjis': - case 'cswindows31j': - case 'mskanji': - case 'shiftjis': - case 'windows31j': - return 'Windows-31J'; - - case 'iso885911': - case 'tis620': - return 'windows-874'; - - case 'cseuckr': - case 'csksc56011987': - case 'euckr': - case 'isoir149': - case 'korean': - case 'ksc5601': - case 'ksc56011987': - case 'ksc56011989': - case 'windows949': - return 'windows-949'; - - case 'windows1250': - return 'windows-1250'; - - case 'windows1251': - return 'windows-1251'; - - case 'cp819': - case 'csisolatin1': - case 'ibm819': - case 'iso88591': - case 'iso885911987': - case 'isoir100': - case 'l1': - case 'latin1': - case 'windows1252': - return 'windows-1252'; - - case 'windows1253': - return 'windows-1253'; - - case 'csisolatin5': - case 'iso88599': - case 'iso885991989': - case 'isoir148': - case 'l5': - case 'latin5': - case 'windows1254': - return 'windows-1254'; - - case 'windows1255': - return 'windows-1255'; - - case 'windows1256': - return 'windows-1256'; - - case 'windows1257': - return 'windows-1257'; - - case 'windows1258': - return 'windows-1258'; - - default: - return $charset; - } - } - - public static function get_curl_version() - { - if (is_array($curl = curl_version())) - { - $curl = $curl['version']; - } - elseif (substr($curl, 0, 5) === 'curl/') - { - $curl = substr($curl, 5, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 5)); - } - elseif (substr($curl, 0, 8) === 'libcurl/') - { - $curl = substr($curl, 8, strcspn($curl, "\x09\x0A\x0B\x0C\x0D", 8)); - } - else - { - $curl = 0; - } - return $curl; - } - - /** - * Strip HTML comments - * - * @param string $data Data to strip comments from - * @return string Comment stripped string - */ - public static function strip_comments($data) - { - $output = ''; - while (($start = strpos($data, '<!--')) !== false) - { - $output .= substr($data, 0, $start); - if (($end = strpos($data, '-->', $start)) !== false) - { - $data = substr_replace($data, '', 0, $end + 3); - } - else - { - $data = ''; - } - } - return $output . $data; - } - - public static function parse_date($dt) - { - $parser = SimplePie_Parse_Date::get(); - return $parser->parse($dt); - } - - /** - * Decode HTML entities - * - * @deprecated Use DOMDocument instead - * @param string $data Input data - * @return string Output data - */ - public static function entities_decode($data) - { - $decoder = new SimplePie_Decode_HTML_Entities($data); - return $decoder->parse(); - } - - /** - * Remove RFC822 comments - * - * @param string $data Data to strip comments from - * @return string Comment stripped string - */ - public static function uncomment_rfc822($string) - { - $string = (string) $string; - $position = 0; - $length = strlen($string); - $depth = 0; - - $output = ''; - - while ($position < $length && ($pos = strpos($string, '(', $position)) !== false) - { - $output .= substr($string, $position, $pos - $position); - $position = $pos + 1; - if ($string[$pos - 1] !== '\\') - { - $depth++; - while ($depth && $position < $length) - { - $position += strcspn($string, '()', $position); - if ($string[$position - 1] === '\\') - { - $position++; - continue; - } - elseif (isset($string[$position])) - { - switch ($string[$position]) - { - case '(': - $depth++; - break; - - case ')': - $depth--; - break; - } - $position++; - } - else - { - break; - } - } - } - else - { - $output .= '('; - } - } - $output .= substr($string, $position); - - return $output; - } - - public static function parse_mime($mime) - { - if (($pos = strpos($mime, ';')) === false) - { - return trim($mime); - } - else - { - return trim(substr($mime, 0, $pos)); - } - } - - public static function atom_03_construct_type($attribs) - { - if (isset($attribs['']['mode']) && strtolower(trim($attribs['']['mode']) === 'base64')) - { - $mode = SIMPLEPIE_CONSTRUCT_BASE64; - } - else - { - $mode = SIMPLEPIE_CONSTRUCT_NONE; - } - if (isset($attribs['']['type'])) - { - switch (strtolower(trim($attribs['']['type']))) - { - case 'text': - case 'text/plain': - return SIMPLEPIE_CONSTRUCT_TEXT | $mode; - - case 'html': - case 'text/html': - return SIMPLEPIE_CONSTRUCT_HTML | $mode; - - case 'xhtml': - case 'application/xhtml+xml': - return SIMPLEPIE_CONSTRUCT_XHTML | $mode; - - default: - return SIMPLEPIE_CONSTRUCT_NONE | $mode; - } - } - else - { - return SIMPLEPIE_CONSTRUCT_TEXT | $mode; - } - } - - public static function atom_10_construct_type($attribs) - { - if (isset($attribs['']['type'])) - { - switch (strtolower(trim($attribs['']['type']))) - { - case 'text': - return SIMPLEPIE_CONSTRUCT_TEXT; - - case 'html': - return SIMPLEPIE_CONSTRUCT_HTML; - - case 'xhtml': - return SIMPLEPIE_CONSTRUCT_XHTML; - - default: - return SIMPLEPIE_CONSTRUCT_NONE; - } - } - return SIMPLEPIE_CONSTRUCT_TEXT; - } - - public static function atom_10_content_construct_type($attribs) - { - if (isset($attribs['']['type'])) - { - $type = strtolower(trim($attribs['']['type'])); - switch ($type) - { - case 'text': - return SIMPLEPIE_CONSTRUCT_TEXT; - - case 'html': - return SIMPLEPIE_CONSTRUCT_HTML; - - case 'xhtml': - return SIMPLEPIE_CONSTRUCT_XHTML; - } - if (in_array(substr($type, -4), array('+xml', '/xml')) || substr($type, 0, 5) === 'text/') - { - return SIMPLEPIE_CONSTRUCT_NONE; - } - else - { - return SIMPLEPIE_CONSTRUCT_BASE64; - } - } - else - { - return SIMPLEPIE_CONSTRUCT_TEXT; - } - } - - public static function is_isegment_nz_nc($string) - { - return (bool) preg_match('/^([A-Za-z0-9\-._~\x{A0}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFEF}\x{10000}-\x{1FFFD}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}\x{40000}-\x{4FFFD}\x{50000}-\x{5FFFD}\x{60000}-\x{6FFFD}\x{70000}-\x{7FFFD}\x{80000}-\x{8FFFD}\x{90000}-\x{9FFFD}\x{A0000}-\x{AFFFD}\x{B0000}-\x{BFFFD}\x{C0000}-\x{CFFFD}\x{D0000}-\x{DFFFD}\x{E1000}-\x{EFFFD}!$&\'()*+,;=@]|(%[0-9ABCDEF]{2}))+$/u', $string); - } - - public static function space_seperated_tokens($string) - { - $space_characters = "\x20\x09\x0A\x0B\x0C\x0D"; - $string_length = strlen($string); - - $position = strspn($string, $space_characters); - $tokens = array(); - - while ($position < $string_length) - { - $len = strcspn($string, $space_characters, $position); - $tokens[] = substr($string, $position, $len); - $position += $len; - $position += strspn($string, $space_characters, $position); - } - - return $tokens; - } - - /** - * Converts a unicode codepoint to a UTF-8 character - * - * @static - * @param int $codepoint Unicode codepoint - * @return string UTF-8 character - */ - public static function codepoint_to_utf8($codepoint) - { - $codepoint = (int) $codepoint; - if ($codepoint < 0) - { - return false; - } - else if ($codepoint <= 0x7f) - { - return chr($codepoint); - } - else if ($codepoint <= 0x7ff) - { - return chr(0xc0 | ($codepoint >> 6)) . chr(0x80 | ($codepoint & 0x3f)); - } - else if ($codepoint <= 0xffff) - { - return chr(0xe0 | ($codepoint >> 12)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f)); - } - else if ($codepoint <= 0x10ffff) - { - return chr(0xf0 | ($codepoint >> 18)) . chr(0x80 | (($codepoint >> 12) & 0x3f)) . chr(0x80 | (($codepoint >> 6) & 0x3f)) . chr(0x80 | ($codepoint & 0x3f)); - } - else - { - // U+FFFD REPLACEMENT CHARACTER - return "\xEF\xBF\xBD"; - } - } - - /** - * Similar to parse_str() - * - * Returns an associative array of name/value pairs, where the value is an - * array of values that have used the same name - * - * @static - * @param string $str The input string. - * @return array - */ - public static function parse_str($str) - { - $return = array(); - $str = explode('&', $str); - - foreach ($str as $section) - { - if (strpos($section, '=') !== false) - { - list($name, $value) = explode('=', $section, 2); - $return[urldecode($name)][] = urldecode($value); - } - else - { - $return[urldecode($section)][] = null; - } - } - - return $return; - } - - /** - * Detect XML encoding, as per XML 1.0 Appendix F.1 - * - * @todo Add support for EBCDIC - * @param string $data XML data - * @param SimplePie_Registry $registry Class registry - * @return array Possible encodings - */ - public static function xml_encoding($data, $registry) - { - // UTF-32 Big Endian BOM - if (substr($data, 0, 4) === "\x00\x00\xFE\xFF") - { - $encoding[] = 'UTF-32BE'; - } - // UTF-32 Little Endian BOM - elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00") - { - $encoding[] = 'UTF-32LE'; - } - // UTF-16 Big Endian BOM - elseif (substr($data, 0, 2) === "\xFE\xFF") - { - $encoding[] = 'UTF-16BE'; - } - // UTF-16 Little Endian BOM - elseif (substr($data, 0, 2) === "\xFF\xFE") - { - $encoding[] = 'UTF-16LE'; - } - // UTF-8 BOM - elseif (substr($data, 0, 3) === "\xEF\xBB\xBF") - { - $encoding[] = 'UTF-8'; - } - // UTF-32 Big Endian Without BOM - elseif (substr($data, 0, 20) === "\x00\x00\x00\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C") - { - if ($pos = strpos($data, "\x00\x00\x00\x3F\x00\x00\x00\x3E")) - { - $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32BE', 'UTF-8'))); - if ($parser->parse()) - { - $encoding[] = $parser->encoding; - } - } - $encoding[] = 'UTF-32BE'; - } - // UTF-32 Little Endian Without BOM - elseif (substr($data, 0, 20) === "\x3C\x00\x00\x00\x3F\x00\x00\x00\x78\x00\x00\x00\x6D\x00\x00\x00\x6C\x00\x00\x00") - { - if ($pos = strpos($data, "\x3F\x00\x00\x00\x3E\x00\x00\x00")) - { - $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 20), 'UTF-32LE', 'UTF-8'))); - if ($parser->parse()) - { - $encoding[] = $parser->encoding; - } - } - $encoding[] = 'UTF-32LE'; - } - // UTF-16 Big Endian Without BOM - elseif (substr($data, 0, 10) === "\x00\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C") - { - if ($pos = strpos($data, "\x00\x3F\x00\x3E")) - { - $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16BE', 'UTF-8'))); - if ($parser->parse()) - { - $encoding[] = $parser->encoding; - } - } - $encoding[] = 'UTF-16BE'; - } - // UTF-16 Little Endian Without BOM - elseif (substr($data, 0, 10) === "\x3C\x00\x3F\x00\x78\x00\x6D\x00\x6C\x00") - { - if ($pos = strpos($data, "\x3F\x00\x3E\x00")) - { - $parser = $registry->create('XML_Declaration_Parser', array(SimplePie_Misc::change_encoding(substr($data, 20, $pos - 10), 'UTF-16LE', 'UTF-8'))); - if ($parser->parse()) - { - $encoding[] = $parser->encoding; - } - } - $encoding[] = 'UTF-16LE'; - } - // US-ASCII (or superset) - elseif (substr($data, 0, 5) === "\x3C\x3F\x78\x6D\x6C") - { - if ($pos = strpos($data, "\x3F\x3E")) - { - $parser = $registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5))); - if ($parser->parse()) - { - $encoding[] = $parser->encoding; - } - } - $encoding[] = 'UTF-8'; - } - // Fallback to UTF-8 - else - { - $encoding[] = 'UTF-8'; - } - return $encoding; - } - - public static function output_javascript() - { - if (function_exists('ob_gzhandler')) - { - ob_start('ob_gzhandler'); - } - header('Content-type: text/javascript; charset: UTF-8'); - header('Cache-Control: must-revalidate'); - header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 604800) . ' GMT'); // 7 days - ?> -function embed_quicktime(type, bgcolor, width, height, link, placeholder, loop) { - if (placeholder != '') { - document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" href="'+link+'" src="'+placeholder+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="false" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>'); - } - else { - document.writeln('<embed type="'+type+'" style="cursor:hand; cursor:pointer;" src="'+link+'" width="'+width+'" height="'+height+'" autoplay="false" target="myself" controller="true" loop="'+loop+'" scale="aspect" bgcolor="'+bgcolor+'" pluginspage="http://www.apple.com/quicktime/download/"></embed>'); - } -} - -function embed_flash(bgcolor, width, height, link, loop, type) { - document.writeln('<embed src="'+link+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="'+type+'" quality="high" width="'+width+'" height="'+height+'" bgcolor="'+bgcolor+'" loop="'+loop+'"></embed>'); -} - -function embed_flv(width, height, link, placeholder, loop, player) { - document.writeln('<embed src="'+player+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" quality="high" width="'+width+'" height="'+height+'" wmode="transparent" flashvars="file='+link+'&autostart=false&repeat='+loop+'&showdigits=true&showfsbutton=false"></embed>'); -} - -function embed_wmedia(width, height, link) { - document.writeln('<embed type="application/x-mplayer2" src="'+link+'" autosize="1" width="'+width+'" height="'+height+'" showcontrols="1" showstatusbar="0" showdisplay="0" autostart="0"></embed>'); -} - <?php - } - - /** - * Get the SimplePie build timestamp - * - * Uses the git index if it exists, otherwise uses the modification time - * of the newest file. - */ - public static function get_build() - { - $root = dirname(dirname(__FILE__)); - if (file_exists($root . '/.git/index')) - { - return filemtime($root . '/.git/index'); - } - elseif (file_exists($root . '/SimplePie')) - { - $time = 0; - foreach (glob($root . '/SimplePie/*.php') as $file) - { - if (($mtime = filemtime($file)) > $time) - { - $time = $mtime; - } - } - return $time; - } - elseif (file_exists(dirname(__FILE__) . '/Core.php')) - { - return filemtime(dirname(__FILE__) . '/Core.php'); - } - else - { - return filemtime(__FILE__); - } - } - - /** - * Format debugging information - */ - public static function debug(&$sp) - { - $info = 'SimplePie ' . SIMPLEPIE_VERSION . ' Build ' . SIMPLEPIE_BUILD . "\n"; - $info .= 'PHP ' . PHP_VERSION . "\n"; - if ($sp->error() !== null) - { - $info .= 'Error occurred: ' . $sp->error() . "\n"; - } - else - { - $info .= "No error found.\n"; - } - $info .= "Extensions:\n"; - $extensions = array('pcre', 'curl', 'zlib', 'mbstring', 'iconv', 'xmlreader', 'xml'); - foreach ($extensions as $ext) - { - if (extension_loaded($ext)) - { - $info .= " $ext loaded\n"; - switch ($ext) - { - case 'pcre': - $info .= ' Version ' . PCRE_VERSION . "\n"; - break; - case 'curl': - $version = curl_version(); - $info .= ' Version ' . $version['version'] . "\n"; - break; - case 'mbstring': - $info .= ' Overloading: ' . mb_get_info('func_overload') . "\n"; - break; - case 'iconv': - $info .= ' Version ' . ICONV_VERSION . "\n"; - break; - case 'xml': - $info .= ' Version ' . LIBXML_DOTTED_VERSION . "\n"; - break; - } - } - else - { - $info .= " $ext not loaded\n"; - } - } - return $info; - } - - public static function silence_errors($num, $str) - { - // No-op - } -} - diff --git a/wp/wp-includes/SimplePie/Net/IPv6.php b/wp/wp-includes/SimplePie/Net/IPv6.php deleted file mode 100644 index da80d8ac..00000000 --- a/wp/wp-includes/SimplePie/Net/IPv6.php +++ /dev/null @@ -1,276 +0,0 @@ -<?php -/** - * SimplePie - * - * A PHP-Based RSS and Atom Feed Framework. - * Takes the hard work out of managing a complete RSS/Atom solution. - * - * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * * Neither the name of the SimplePie Team nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS - * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package SimplePie - * @version 1.3.1 - * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue - * @author Ryan Parman - * @author Geoffrey Sneddon - * @author Ryan McCue - * @link http://simplepie.org/ SimplePie - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - - -/** - * Class to validate and to work with IPv6 addresses. - * - * @package SimplePie - * @subpackage HTTP - * @copyright 2003-2005 The PHP Group - * @license http://www.opensource.org/licenses/bsd-license.php - * @link http://pear.php.net/package/Net_IPv6 - * @author Alexander Merz <alexander.merz@web.de> - * @author elfrink at introweb dot nl - * @author Josh Peck <jmp at joshpeck dot org> - * @author Geoffrey Sneddon <geoffers@gmail.com> - */ -class SimplePie_Net_IPv6 -{ - /** - * Uncompresses an IPv6 address - * - * RFC 4291 allows you to compress concecutive zero pieces in an address to - * '::'. This method expects a valid IPv6 address and expands the '::' to - * the required number of zero pieces. - * - * Example: FF01::101 -> FF01:0:0:0:0:0:0:101 - * ::1 -> 0:0:0:0:0:0:0:1 - * - * @author Alexander Merz <alexander.merz@web.de> - * @author elfrink at introweb dot nl - * @author Josh Peck <jmp at joshpeck dot org> - * @copyright 2003-2005 The PHP Group - * @license http://www.opensource.org/licenses/bsd-license.php - * @param string $ip An IPv6 address - * @return string The uncompressed IPv6 address - */ - public static function uncompress($ip) - { - $c1 = -1; - $c2 = -1; - if (substr_count($ip, '::') === 1) - { - list($ip1, $ip2) = explode('::', $ip); - if ($ip1 === '') - { - $c1 = -1; - } - else - { - $c1 = substr_count($ip1, ':'); - } - if ($ip2 === '') - { - $c2 = -1; - } - else - { - $c2 = substr_count($ip2, ':'); - } - if (strpos($ip2, '.') !== false) - { - $c2++; - } - // :: - if ($c1 === -1 && $c2 === -1) - { - $ip = '0:0:0:0:0:0:0:0'; - } - // ::xxx - else if ($c1 === -1) - { - $fill = str_repeat('0:', 7 - $c2); - $ip = str_replace('::', $fill, $ip); - } - // xxx:: - else if ($c2 === -1) - { - $fill = str_repeat(':0', 7 - $c1); - $ip = str_replace('::', $fill, $ip); - } - // xxx::xxx - else - { - $fill = ':' . str_repeat('0:', 6 - $c2 - $c1); - $ip = str_replace('::', $fill, $ip); - } - } - return $ip; - } - - /** - * Compresses an IPv6 address - * - * RFC 4291 allows you to compress concecutive zero pieces in an address to - * '::'. This method expects a valid IPv6 address and compresses consecutive - * zero pieces to '::'. - * - * Example: FF01:0:0:0:0:0:0:101 -> FF01::101 - * 0:0:0:0:0:0:0:1 -> ::1 - * - * @see uncompress() - * @param string $ip An IPv6 address - * @return string The compressed IPv6 address - */ - public static function compress($ip) - { - // Prepare the IP to be compressed - $ip = self::uncompress($ip); - $ip_parts = self::split_v6_v4($ip); - - // Replace all leading zeros - $ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]); - - // Find bunches of zeros - if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE)) - { - $max = 0; - $pos = null; - foreach ($matches[0] as $match) - { - if (strlen($match[0]) > $max) - { - $max = strlen($match[0]); - $pos = $match[1]; - } - } - - $ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max); - } - - if ($ip_parts[1] !== '') - { - return implode(':', $ip_parts); - } - else - { - return $ip_parts[0]; - } - } - - /** - * Splits an IPv6 address into the IPv6 and IPv4 representation parts - * - * RFC 4291 allows you to represent the last two parts of an IPv6 address - * using the standard IPv4 representation - * - * Example: 0:0:0:0:0:0:13.1.68.3 - * 0:0:0:0:0:FFFF:129.144.52.38 - * - * @param string $ip An IPv6 address - * @return array [0] contains the IPv6 represented part, and [1] the IPv4 represented part - */ - private static function split_v6_v4($ip) - { - if (strpos($ip, '.') !== false) - { - $pos = strrpos($ip, ':'); - $ipv6_part = substr($ip, 0, $pos); - $ipv4_part = substr($ip, $pos + 1); - return array($ipv6_part, $ipv4_part); - } - else - { - return array($ip, ''); - } - } - - /** - * Checks an IPv6 address - * - * Checks if the given IP is a valid IPv6 address - * - * @param string $ip An IPv6 address - * @return bool true if $ip is a valid IPv6 address - */ - public static function check_ipv6($ip) - { - $ip = self::uncompress($ip); - list($ipv6, $ipv4) = self::split_v6_v4($ip); - $ipv6 = explode(':', $ipv6); - $ipv4 = explode('.', $ipv4); - if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4) - { - foreach ($ipv6 as $ipv6_part) - { - // The section can't be empty - if ($ipv6_part === '') - return false; - - // Nor can it be over four characters - if (strlen($ipv6_part) > 4) - return false; - - // Remove leading zeros (this is safe because of the above) - $ipv6_part = ltrim($ipv6_part, '0'); - if ($ipv6_part === '') - $ipv6_part = '0'; - - // Check the value is valid - $value = hexdec($ipv6_part); - if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF) - return false; - } - if (count($ipv4) === 4) - { - foreach ($ipv4 as $ipv4_part) - { - $value = (int) $ipv4_part; - if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF) - return false; - } - } - return true; - } - else - { - return false; - } - } - - /** - * Checks if the given IP is a valid IPv6 address - * - * @codeCoverageIgnore - * @deprecated Use {@see SimplePie_Net_IPv6::check_ipv6()} instead - * @see check_ipv6 - * @param string $ip An IPv6 address - * @return bool true if $ip is a valid IPv6 address - */ - public static function checkIPv6($ip) - { - return self::check_ipv6($ip); - } -} diff --git a/wp/wp-includes/SimplePie/Parse/Date.php b/wp/wp-includes/SimplePie/Parse/Date.php deleted file mode 100644 index 88e46e03..00000000 --- a/wp/wp-includes/SimplePie/Parse/Date.php +++ /dev/null @@ -1,984 +0,0 @@ -<?php -/** - * SimplePie - * - * A PHP-Based RSS and Atom Feed Framework. - * Takes the hard work out of managing a complete RSS/Atom solution. - * - * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * * Neither the name of the SimplePie Team nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS - * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package SimplePie - * @version 1.3.1 - * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue - * @author Ryan Parman - * @author Geoffrey Sneddon - * @author Ryan McCue - * @link http://simplepie.org/ SimplePie - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - - -/** - * Date Parser - * - * @package SimplePie - * @subpackage Parsing - */ -class SimplePie_Parse_Date -{ - /** - * Input data - * - * @access protected - * @var string - */ - var $date; - - /** - * List of days, calendar day name => ordinal day number in the week - * - * @access protected - * @var array - */ - var $day = array( - // English - 'mon' => 1, - 'monday' => 1, - 'tue' => 2, - 'tuesday' => 2, - 'wed' => 3, - 'wednesday' => 3, - 'thu' => 4, - 'thursday' => 4, - 'fri' => 5, - 'friday' => 5, - 'sat' => 6, - 'saturday' => 6, - 'sun' => 7, - 'sunday' => 7, - // Dutch - 'maandag' => 1, - 'dinsdag' => 2, - 'woensdag' => 3, - 'donderdag' => 4, - 'vrijdag' => 5, - 'zaterdag' => 6, - 'zondag' => 7, - // French - 'lundi' => 1, - 'mardi' => 2, - 'mercredi' => 3, - 'jeudi' => 4, - 'vendredi' => 5, - 'samedi' => 6, - 'dimanche' => 7, - // German - 'montag' => 1, - 'dienstag' => 2, - 'mittwoch' => 3, - 'donnerstag' => 4, - 'freitag' => 5, - 'samstag' => 6, - 'sonnabend' => 6, - 'sonntag' => 7, - // Italian - 'lunedì' => 1, - 'martedì' => 2, - 'mercoledì' => 3, - 'giovedì' => 4, - 'venerdì' => 5, - 'sabato' => 6, - 'domenica' => 7, - // Spanish - 'lunes' => 1, - 'martes' => 2, - 'miércoles' => 3, - 'jueves' => 4, - 'viernes' => 5, - 'sábado' => 6, - 'domingo' => 7, - // Finnish - 'maanantai' => 1, - 'tiistai' => 2, - 'keskiviikko' => 3, - 'torstai' => 4, - 'perjantai' => 5, - 'lauantai' => 6, - 'sunnuntai' => 7, - // Hungarian - 'hétfő' => 1, - 'kedd' => 2, - 'szerda' => 3, - 'csütörtok' => 4, - 'péntek' => 5, - 'szombat' => 6, - 'vasárnap' => 7, - // Greek - 'Δευ' => 1, - 'Τρι' => 2, - 'Τετ' => 3, - 'Πεμ' => 4, - 'Παρ' => 5, - 'Σαβ' => 6, - 'Κυρ' => 7, - ); - - /** - * List of months, calendar month name => calendar month number - * - * @access protected - * @var array - */ - var $month = array( - // English - 'jan' => 1, - 'january' => 1, - 'feb' => 2, - 'february' => 2, - 'mar' => 3, - 'march' => 3, - 'apr' => 4, - 'april' => 4, - 'may' => 5, - // No long form of May - 'jun' => 6, - 'june' => 6, - 'jul' => 7, - 'july' => 7, - 'aug' => 8, - 'august' => 8, - 'sep' => 9, - 'september' => 8, - 'oct' => 10, - 'october' => 10, - 'nov' => 11, - 'november' => 11, - 'dec' => 12, - 'december' => 12, - // Dutch - 'januari' => 1, - 'februari' => 2, - 'maart' => 3, - 'april' => 4, - 'mei' => 5, - 'juni' => 6, - 'juli' => 7, - 'augustus' => 8, - 'september' => 9, - 'oktober' => 10, - 'november' => 11, - 'december' => 12, - // French - 'janvier' => 1, - 'février' => 2, - 'mars' => 3, - 'avril' => 4, - 'mai' => 5, - 'juin' => 6, - 'juillet' => 7, - 'août' => 8, - 'septembre' => 9, - 'octobre' => 10, - 'novembre' => 11, - 'décembre' => 12, - // German - 'januar' => 1, - 'februar' => 2, - 'märz' => 3, - 'april' => 4, - 'mai' => 5, - 'juni' => 6, - 'juli' => 7, - 'august' => 8, - 'september' => 9, - 'oktober' => 10, - 'november' => 11, - 'dezember' => 12, - // Italian - 'gennaio' => 1, - 'febbraio' => 2, - 'marzo' => 3, - 'aprile' => 4, - 'maggio' => 5, - 'giugno' => 6, - 'luglio' => 7, - 'agosto' => 8, - 'settembre' => 9, - 'ottobre' => 10, - 'novembre' => 11, - 'dicembre' => 12, - // Spanish - 'enero' => 1, - 'febrero' => 2, - 'marzo' => 3, - 'abril' => 4, - 'mayo' => 5, - 'junio' => 6, - 'julio' => 7, - 'agosto' => 8, - 'septiembre' => 9, - 'setiembre' => 9, - 'octubre' => 10, - 'noviembre' => 11, - 'diciembre' => 12, - // Finnish - 'tammikuu' => 1, - 'helmikuu' => 2, - 'maaliskuu' => 3, - 'huhtikuu' => 4, - 'toukokuu' => 5, - 'kesäkuu' => 6, - 'heinäkuu' => 7, - 'elokuu' => 8, - 'suuskuu' => 9, - 'lokakuu' => 10, - 'marras' => 11, - 'joulukuu' => 12, - // Hungarian - 'január' => 1, - 'február' => 2, - 'március' => 3, - 'április' => 4, - 'május' => 5, - 'június' => 6, - 'július' => 7, - 'augusztus' => 8, - 'szeptember' => 9, - 'október' => 10, - 'november' => 11, - 'december' => 12, - // Greek - 'Ιαν' => 1, - 'Φεβ' => 2, - 'Μάώ' => 3, - 'Μαώ' => 3, - 'Απρ' => 4, - 'Μάι' => 5, - 'Μαϊ' => 5, - 'Μαι' => 5, - 'Ιούν' => 6, - 'Ιον' => 6, - 'Ιούλ' => 7, - 'Ιολ' => 7, - 'Αύγ' => 8, - 'Αυγ' => 8, - 'Σεπ' => 9, - 'Οκτ' => 10, - 'Νοέ' => 11, - 'Δεκ' => 12, - ); - - /** - * List of timezones, abbreviation => offset from UTC - * - * @access protected - * @var array - */ - var $timezone = array( - 'ACDT' => 37800, - 'ACIT' => 28800, - 'ACST' => 34200, - 'ACT' => -18000, - 'ACWDT' => 35100, - 'ACWST' => 31500, - 'AEDT' => 39600, - 'AEST' => 36000, - 'AFT' => 16200, - 'AKDT' => -28800, - 'AKST' => -32400, - 'AMDT' => 18000, - 'AMT' => -14400, - 'ANAST' => 46800, - 'ANAT' => 43200, - 'ART' => -10800, - 'AZOST' => -3600, - 'AZST' => 18000, - 'AZT' => 14400, - 'BIOT' => 21600, - 'BIT' => -43200, - 'BOT' => -14400, - 'BRST' => -7200, - 'BRT' => -10800, - 'BST' => 3600, - 'BTT' => 21600, - 'CAST' => 18000, - 'CAT' => 7200, - 'CCT' => 23400, - 'CDT' => -18000, - 'CEDT' => 7200, - 'CEST' => 7200, - 'CET' => 3600, - 'CGST' => -7200, - 'CGT' => -10800, - 'CHADT' => 49500, - 'CHAST' => 45900, - 'CIST' => -28800, - 'CKT' => -36000, - 'CLDT' => -10800, - 'CLST' => -14400, - 'COT' => -18000, - 'CST' => -21600, - 'CVT' => -3600, - 'CXT' => 25200, - 'DAVT' => 25200, - 'DTAT' => 36000, - 'EADT' => -18000, - 'EAST' => -21600, - 'EAT' => 10800, - 'ECT' => -18000, - 'EDT' => -14400, - 'EEST' => 10800, - 'EET' => 7200, - 'EGT' => -3600, - 'EKST' => 21600, - 'EST' => -18000, - 'FJT' => 43200, - 'FKDT' => -10800, - 'FKST' => -14400, - 'FNT' => -7200, - 'GALT' => -21600, - 'GEDT' => 14400, - 'GEST' => 10800, - 'GFT' => -10800, - 'GILT' => 43200, - 'GIT' => -32400, - 'GST' => 14400, - 'GST' => -7200, - 'GYT' => -14400, - 'HAA' => -10800, - 'HAC' => -18000, - 'HADT' => -32400, - 'HAE' => -14400, - 'HAP' => -25200, - 'HAR' => -21600, - 'HAST' => -36000, - 'HAT' => -9000, - 'HAY' => -28800, - 'HKST' => 28800, - 'HMT' => 18000, - 'HNA' => -14400, - 'HNC' => -21600, - 'HNE' => -18000, - 'HNP' => -28800, - 'HNR' => -25200, - 'HNT' => -12600, - 'HNY' => -32400, - 'IRDT' => 16200, - 'IRKST' => 32400, - 'IRKT' => 28800, - 'IRST' => 12600, - 'JFDT' => -10800, - 'JFST' => -14400, - 'JST' => 32400, - 'KGST' => 21600, - 'KGT' => 18000, - 'KOST' => 39600, - 'KOVST' => 28800, - 'KOVT' => 25200, - 'KRAST' => 28800, - 'KRAT' => 25200, - 'KST' => 32400, - 'LHDT' => 39600, - 'LHST' => 37800, - 'LINT' => 50400, - 'LKT' => 21600, - 'MAGST' => 43200, - 'MAGT' => 39600, - 'MAWT' => 21600, - 'MDT' => -21600, - 'MESZ' => 7200, - 'MEZ' => 3600, - 'MHT' => 43200, - 'MIT' => -34200, - 'MNST' => 32400, - 'MSDT' => 14400, - 'MSST' => 10800, - 'MST' => -25200, - 'MUT' => 14400, - 'MVT' => 18000, - 'MYT' => 28800, - 'NCT' => 39600, - 'NDT' => -9000, - 'NFT' => 41400, - 'NMIT' => 36000, - 'NOVST' => 25200, - 'NOVT' => 21600, - 'NPT' => 20700, - 'NRT' => 43200, - 'NST' => -12600, - 'NUT' => -39600, - 'NZDT' => 46800, - 'NZST' => 43200, - 'OMSST' => 25200, - 'OMST' => 21600, - 'PDT' => -25200, - 'PET' => -18000, - 'PETST' => 46800, - 'PETT' => 43200, - 'PGT' => 36000, - 'PHOT' => 46800, - 'PHT' => 28800, - 'PKT' => 18000, - 'PMDT' => -7200, - 'PMST' => -10800, - 'PONT' => 39600, - 'PST' => -28800, - 'PWT' => 32400, - 'PYST' => -10800, - 'PYT' => -14400, - 'RET' => 14400, - 'ROTT' => -10800, - 'SAMST' => 18000, - 'SAMT' => 14400, - 'SAST' => 7200, - 'SBT' => 39600, - 'SCDT' => 46800, - 'SCST' => 43200, - 'SCT' => 14400, - 'SEST' => 3600, - 'SGT' => 28800, - 'SIT' => 28800, - 'SRT' => -10800, - 'SST' => -39600, - 'SYST' => 10800, - 'SYT' => 7200, - 'TFT' => 18000, - 'THAT' => -36000, - 'TJT' => 18000, - 'TKT' => -36000, - 'TMT' => 18000, - 'TOT' => 46800, - 'TPT' => 32400, - 'TRUT' => 36000, - 'TVT' => 43200, - 'TWT' => 28800, - 'UYST' => -7200, - 'UYT' => -10800, - 'UZT' => 18000, - 'VET' => -14400, - 'VLAST' => 39600, - 'VLAT' => 36000, - 'VOST' => 21600, - 'VUT' => 39600, - 'WAST' => 7200, - 'WAT' => 3600, - 'WDT' => 32400, - 'WEST' => 3600, - 'WFT' => 43200, - 'WIB' => 25200, - 'WIT' => 32400, - 'WITA' => 28800, - 'WKST' => 18000, - 'WST' => 28800, - 'YAKST' => 36000, - 'YAKT' => 32400, - 'YAPT' => 36000, - 'YEKST' => 21600, - 'YEKT' => 18000, - ); - - /** - * Cached PCRE for SimplePie_Parse_Date::$day - * - * @access protected - * @var string - */ - var $day_pcre; - - /** - * Cached PCRE for SimplePie_Parse_Date::$month - * - * @access protected - * @var string - */ - var $month_pcre; - - /** - * Array of user-added callback methods - * - * @access private - * @var array - */ - var $built_in = array(); - - /** - * Array of user-added callback methods - * - * @access private - * @var array - */ - var $user = array(); - - /** - * Create new SimplePie_Parse_Date object, and set self::day_pcre, - * self::month_pcre, and self::built_in - * - * @access private - */ - public function __construct() - { - $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')'; - $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')'; - - static $cache; - if (!isset($cache[get_class($this)])) - { - $all_methods = get_class_methods($this); - - foreach ($all_methods as $method) - { - if (strtolower(substr($method, 0, 5)) === 'date_') - { - $cache[get_class($this)][] = $method; - } - } - } - - foreach ($cache[get_class($this)] as $method) - { - $this->built_in[] = $method; - } - } - - /** - * Get the object - * - * @access public - */ - public static function get() - { - static $object; - if (!$object) - { - $object = new SimplePie_Parse_Date; - } - return $object; - } - - /** - * Parse a date - * - * @final - * @access public - * @param string $date Date to parse - * @return int Timestamp corresponding to date string, or false on failure - */ - public function parse($date) - { - foreach ($this->user as $method) - { - if (($returned = call_user_func($method, $date)) !== false) - { - return $returned; - } - } - - foreach ($this->built_in as $method) - { - if (($returned = call_user_func(array($this, $method), $date)) !== false) - { - return $returned; - } - } - - return false; - } - - /** - * Add a callback method to parse a date - * - * @final - * @access public - * @param callable $callback - */ - public function add_callback($callback) - { - if (is_callable($callback)) - { - $this->user[] = $callback; - } - else - { - trigger_error('User-supplied function must be a valid callback', E_USER_WARNING); - } - } - - /** - * Parse a superset of W3C-DTF (allows hyphens and colons to be omitted, as - * well as allowing any of upper or lower case "T", horizontal tabs, or - * spaces to be used as the time seperator (including more than one)) - * - * @access protected - * @return int Timestamp - */ - public function date_w3cdtf($date) - { - static $pcre; - if (!$pcre) - { - $year = '([0-9]{4})'; - $month = $day = $hour = $minute = $second = '([0-9]{2})'; - $decimal = '([0-9]*)'; - $zone = '(?:(Z)|([+\-])([0-9]{1,2}):?([0-9]{1,2}))'; - $pcre = '/^' . $year . '(?:-?' . $month . '(?:-?' . $day . '(?:[Tt\x09\x20]+' . $hour . '(?::?' . $minute . '(?::?' . $second . '(?:.' . $decimal . ')?)?)?' . $zone . ')?)?)?$/'; - } - if (preg_match($pcre, $date, $match)) - { - /* - Capturing subpatterns: - 1: Year - 2: Month - 3: Day - 4: Hour - 5: Minute - 6: Second - 7: Decimal fraction of a second - 8: Zulu - 9: Timezone ± - 10: Timezone hours - 11: Timezone minutes - */ - - // Fill in empty matches - for ($i = count($match); $i <= 3; $i++) - { - $match[$i] = '1'; - } - - for ($i = count($match); $i <= 7; $i++) - { - $match[$i] = '0'; - } - - // Numeric timezone - if (isset($match[9]) && $match[9] !== '') - { - $timezone = $match[10] * 3600; - $timezone += $match[11] * 60; - if ($match[9] === '-') - { - $timezone = 0 - $timezone; - } - } - else - { - $timezone = 0; - } - - // Convert the number of seconds to an integer, taking decimals into account - $second = round($match[6] + $match[7] / pow(10, strlen($match[7]))); - - return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone; - } - else - { - return false; - } - } - - /** - * Remove RFC822 comments - * - * @access protected - * @param string $data Data to strip comments from - * @return string Comment stripped string - */ - public function remove_rfc2822_comments($string) - { - $string = (string) $string; - $position = 0; - $length = strlen($string); - $depth = 0; - - $output = ''; - - while ($position < $length && ($pos = strpos($string, '(', $position)) !== false) - { - $output .= substr($string, $position, $pos - $position); - $position = $pos + 1; - if ($string[$pos - 1] !== '\\') - { - $depth++; - while ($depth && $position < $length) - { - $position += strcspn($string, '()', $position); - if ($string[$position - 1] === '\\') - { - $position++; - continue; - } - elseif (isset($string[$position])) - { - switch ($string[$position]) - { - case '(': - $depth++; - break; - - case ')': - $depth--; - break; - } - $position++; - } - else - { - break; - } - } - } - else - { - $output .= '('; - } - } - $output .= substr($string, $position); - - return $output; - } - - /** - * Parse RFC2822's date format - * - * @access protected - * @return int Timestamp - */ - public function date_rfc2822($date) - { - static $pcre; - if (!$pcre) - { - $wsp = '[\x09\x20]'; - $fws = '(?:' . $wsp . '+|' . $wsp . '*(?:\x0D\x0A' . $wsp . '+)+)'; - $optional_fws = $fws . '?'; - $day_name = $this->day_pcre; - $month = $this->month_pcre; - $day = '([0-9]{1,2})'; - $hour = $minute = $second = '([0-9]{2})'; - $year = '([0-9]{2,4})'; - $num_zone = '([+\-])([0-9]{2})([0-9]{2})'; - $character_zone = '([A-Z]{1,5})'; - $zone = '(?:' . $num_zone . '|' . $character_zone . ')'; - $pcre = '/(?:' . $optional_fws . $day_name . $optional_fws . ',)?' . $optional_fws . $day . $fws . $month . $fws . $year . $fws . $hour . $optional_fws . ':' . $optional_fws . $minute . '(?:' . $optional_fws . ':' . $optional_fws . $second . ')?' . $fws . $zone . '/i'; - } - if (preg_match($pcre, $this->remove_rfc2822_comments($date), $match)) - { - /* - Capturing subpatterns: - 1: Day name - 2: Day - 3: Month - 4: Year - 5: Hour - 6: Minute - 7: Second - 8: Timezone ± - 9: Timezone hours - 10: Timezone minutes - 11: Alphabetic timezone - */ - - // Find the month number - $month = $this->month[strtolower($match[3])]; - - // Numeric timezone - if ($match[8] !== '') - { - $timezone = $match[9] * 3600; - $timezone += $match[10] * 60; - if ($match[8] === '-') - { - $timezone = 0 - $timezone; - } - } - // Character timezone - elseif (isset($this->timezone[strtoupper($match[11])])) - { - $timezone = $this->timezone[strtoupper($match[11])]; - } - // Assume everything else to be -0000 - else - { - $timezone = 0; - } - - // Deal with 2/3 digit years - if ($match[4] < 50) - { - $match[4] += 2000; - } - elseif ($match[4] < 1000) - { - $match[4] += 1900; - } - - // Second is optional, if it is empty set it to zero - if ($match[7] !== '') - { - $second = $match[7]; - } - else - { - $second = 0; - } - - return gmmktime($match[5], $match[6], $second, $month, $match[2], $match[4]) - $timezone; - } - else - { - return false; - } - } - - /** - * Parse RFC850's date format - * - * @access protected - * @return int Timestamp - */ - public function date_rfc850($date) - { - static $pcre; - if (!$pcre) - { - $space = '[\x09\x20]+'; - $day_name = $this->day_pcre; - $month = $this->month_pcre; - $day = '([0-9]{1,2})'; - $year = $hour = $minute = $second = '([0-9]{2})'; - $zone = '([A-Z]{1,5})'; - $pcre = '/^' . $day_name . ',' . $space . $day . '-' . $month . '-' . $year . $space . $hour . ':' . $minute . ':' . $second . $space . $zone . '$/i'; - } - if (preg_match($pcre, $date, $match)) - { - /* - Capturing subpatterns: - 1: Day name - 2: Day - 3: Month - 4: Year - 5: Hour - 6: Minute - 7: Second - 8: Timezone - */ - - // Month - $month = $this->month[strtolower($match[3])]; - - // Character timezone - if (isset($this->timezone[strtoupper($match[8])])) - { - $timezone = $this->timezone[strtoupper($match[8])]; - } - // Assume everything else to be -0000 - else - { - $timezone = 0; - } - - // Deal with 2 digit year - if ($match[4] < 50) - { - $match[4] += 2000; - } - else - { - $match[4] += 1900; - } - - return gmmktime($match[5], $match[6], $match[7], $month, $match[2], $match[4]) - $timezone; - } - else - { - return false; - } - } - - /** - * Parse C99's asctime()'s date format - * - * @access protected - * @return int Timestamp - */ - public function date_asctime($date) - { - static $pcre; - if (!$pcre) - { - $space = '[\x09\x20]+'; - $wday_name = $this->day_pcre; - $mon_name = $this->month_pcre; - $day = '([0-9]{1,2})'; - $hour = $sec = $min = '([0-9]{2})'; - $year = '([0-9]{4})'; - $terminator = '\x0A?\x00?'; - $pcre = '/^' . $wday_name . $space . $mon_name . $space . $day . $space . $hour . ':' . $min . ':' . $sec . $space . $year . $terminator . '$/i'; - } - if (preg_match($pcre, $date, $match)) - { - /* - Capturing subpatterns: - 1: Day name - 2: Month - 3: Day - 4: Hour - 5: Minute - 6: Second - 7: Year - */ - - $month = $this->month[strtolower($match[2])]; - return gmmktime($match[4], $match[5], $match[6], $month, $match[3], $match[7]); - } - else - { - return false; - } - } - - /** - * Parse dates using strtotime() - * - * @access protected - * @return int Timestamp - */ - public function date_strtotime($date) - { - $strtotime = strtotime($date); - if ($strtotime === -1 || $strtotime === false) - { - return false; - } - else - { - return $strtotime; - } - } -} - diff --git a/wp/wp-includes/SimplePie/Parser.php b/wp/wp-includes/SimplePie/Parser.php deleted file mode 100644 index d698552c..00000000 --- a/wp/wp-includes/SimplePie/Parser.php +++ /dev/null @@ -1,407 +0,0 @@ -<?php -/** - * SimplePie - * - * A PHP-Based RSS and Atom Feed Framework. - * Takes the hard work out of managing a complete RSS/Atom solution. - * - * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * * Neither the name of the SimplePie Team nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS - * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package SimplePie - * @version 1.3.1 - * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue - * @author Ryan Parman - * @author Geoffrey Sneddon - * @author Ryan McCue - * @link http://simplepie.org/ SimplePie - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -/** - * Parses XML into something sane - * - * - * This class can be overloaded with {@see SimplePie::set_parser_class()} - * - * @package SimplePie - * @subpackage Parsing - */ -class SimplePie_Parser -{ - var $error_code; - var $error_string; - var $current_line; - var $current_column; - var $current_byte; - var $separator = ' '; - var $namespace = array(''); - var $element = array(''); - var $xml_base = array(''); - var $xml_base_explicit = array(false); - var $xml_lang = array(''); - var $data = array(); - var $datas = array(array()); - var $current_xhtml_construct = -1; - var $encoding; - protected $registry; - - public function set_registry(SimplePie_Registry $registry) - { - $this->registry = $registry; - } - - public function parse(&$data, $encoding) - { - // Use UTF-8 if we get passed US-ASCII, as every US-ASCII character is a UTF-8 character - if (strtoupper($encoding) === 'US-ASCII') - { - $this->encoding = 'UTF-8'; - } - else - { - $this->encoding = $encoding; - } - - // Strip BOM: - // UTF-32 Big Endian BOM - if (substr($data, 0, 4) === "\x00\x00\xFE\xFF") - { - $data = substr($data, 4); - } - // UTF-32 Little Endian BOM - elseif (substr($data, 0, 4) === "\xFF\xFE\x00\x00") - { - $data = substr($data, 4); - } - // UTF-16 Big Endian BOM - elseif (substr($data, 0, 2) === "\xFE\xFF") - { - $data = substr($data, 2); - } - // UTF-16 Little Endian BOM - elseif (substr($data, 0, 2) === "\xFF\xFE") - { - $data = substr($data, 2); - } - // UTF-8 BOM - elseif (substr($data, 0, 3) === "\xEF\xBB\xBF") - { - $data = substr($data, 3); - } - - if (substr($data, 0, 5) === '<?xml' && strspn(substr($data, 5, 1), "\x09\x0A\x0D\x20") && ($pos = strpos($data, '?>')) !== false) - { - $declaration = $this->registry->create('XML_Declaration_Parser', array(substr($data, 5, $pos - 5))); - if ($declaration->parse()) - { - $data = substr($data, $pos + 2); - $data = '<?xml version="' . $declaration->version . '" encoding="' . $encoding . '" standalone="' . (($declaration->standalone) ? 'yes' : 'no') . '"?>' . $data; - } - else - { - $this->error_string = 'SimplePie bug! Please report this!'; - return false; - } - } - - $return = true; - - static $xml_is_sane = null; - if ($xml_is_sane === null) - { - $parser_check = xml_parser_create(); - xml_parse_into_struct($parser_check, '<foo>&</foo>', $values); - xml_parser_free($parser_check); - $xml_is_sane = isset($values[0]['value']); - } - - // Create the parser - if ($xml_is_sane) - { - $xml = xml_parser_create_ns($this->encoding, $this->separator); - xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1); - xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0); - xml_set_object($xml, $this); - xml_set_character_data_handler($xml, 'cdata'); - xml_set_element_handler($xml, 'tag_open', 'tag_close'); - - // Parse! - if (!xml_parse($xml, $data, true)) - { - $this->error_code = xml_get_error_code($xml); - $this->error_string = xml_error_string($this->error_code); - $return = false; - } - $this->current_line = xml_get_current_line_number($xml); - $this->current_column = xml_get_current_column_number($xml); - $this->current_byte = xml_get_current_byte_index($xml); - xml_parser_free($xml); - return $return; - } - else - { - libxml_clear_errors(); - $xml = new XMLReader(); - $xml->xml($data); - while (@$xml->read()) - { - switch ($xml->nodeType) - { - - case constant('XMLReader::END_ELEMENT'): - if ($xml->namespaceURI !== '') - { - $tagName = $xml->namespaceURI . $this->separator . $xml->localName; - } - else - { - $tagName = $xml->localName; - } - $this->tag_close(null, $tagName); - break; - case constant('XMLReader::ELEMENT'): - $empty = $xml->isEmptyElement; - if ($xml->namespaceURI !== '') - { - $tagName = $xml->namespaceURI . $this->separator . $xml->localName; - } - else - { - $tagName = $xml->localName; - } - $attributes = array(); - while ($xml->moveToNextAttribute()) - { - if ($xml->namespaceURI !== '') - { - $attrName = $xml->namespaceURI . $this->separator . $xml->localName; - } - else - { - $attrName = $xml->localName; - } - $attributes[$attrName] = $xml->value; - } - $this->tag_open(null, $tagName, $attributes); - if ($empty) - { - $this->tag_close(null, $tagName); - } - break; - case constant('XMLReader::TEXT'): - - case constant('XMLReader::CDATA'): - $this->cdata(null, $xml->value); - break; - } - } - if ($error = libxml_get_last_error()) - { - $this->error_code = $error->code; - $this->error_string = $error->message; - $this->current_line = $error->line; - $this->current_column = $error->column; - return false; - } - else - { - return true; - } - } - } - - public function get_error_code() - { - return $this->error_code; - } - - public function get_error_string() - { - return $this->error_string; - } - - public function get_current_line() - { - return $this->current_line; - } - - public function get_current_column() - { - return $this->current_column; - } - - public function get_current_byte() - { - return $this->current_byte; - } - - public function get_data() - { - return $this->data; - } - - public function tag_open($parser, $tag, $attributes) - { - list($this->namespace[], $this->element[]) = $this->split_ns($tag); - - $attribs = array(); - foreach ($attributes as $name => $value) - { - list($attrib_namespace, $attribute) = $this->split_ns($name); - $attribs[$attrib_namespace][$attribute] = $value; - } - - if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['base'])) - { - $base = $this->registry->call('Misc', 'absolutize_url', array($attribs[SIMPLEPIE_NAMESPACE_XML]['base'], end($this->xml_base))); - if ($base !== false) - { - $this->xml_base[] = $base; - $this->xml_base_explicit[] = true; - } - } - else - { - $this->xml_base[] = end($this->xml_base); - $this->xml_base_explicit[] = end($this->xml_base_explicit); - } - - if (isset($attribs[SIMPLEPIE_NAMESPACE_XML]['lang'])) - { - $this->xml_lang[] = $attribs[SIMPLEPIE_NAMESPACE_XML]['lang']; - } - else - { - $this->xml_lang[] = end($this->xml_lang); - } - - if ($this->current_xhtml_construct >= 0) - { - $this->current_xhtml_construct++; - if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML) - { - $this->data['data'] .= '<' . end($this->element); - if (isset($attribs[''])) - { - foreach ($attribs[''] as $name => $value) - { - $this->data['data'] .= ' ' . $name . '="' . htmlspecialchars($value, ENT_COMPAT, $this->encoding) . '"'; - } - } - $this->data['data'] .= '>'; - } - } - else - { - $this->datas[] =& $this->data; - $this->data =& $this->data['child'][end($this->namespace)][end($this->element)][]; - $this->data = array('data' => '', 'attribs' => $attribs, 'xml_base' => end($this->xml_base), 'xml_base_explicit' => end($this->xml_base_explicit), 'xml_lang' => end($this->xml_lang)); - if ((end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_03 && in_array(end($this->element), array('title', 'tagline', 'copyright', 'info', 'summary', 'content')) && isset($attribs['']['mode']) && $attribs['']['mode'] === 'xml') - || (end($this->namespace) === SIMPLEPIE_NAMESPACE_ATOM_10 && in_array(end($this->element), array('rights', 'subtitle', 'summary', 'info', 'title', 'content')) && isset($attribs['']['type']) && $attribs['']['type'] === 'xhtml') - || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_20 && in_array(end($this->element), array('title'))) - || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_090 && in_array(end($this->element), array('title'))) - || (end($this->namespace) === SIMPLEPIE_NAMESPACE_RSS_10 && in_array(end($this->element), array('title')))) - { - $this->current_xhtml_construct = 0; - } - } - } - - public function cdata($parser, $cdata) - { - if ($this->current_xhtml_construct >= 0) - { - $this->data['data'] .= htmlspecialchars($cdata, ENT_QUOTES, $this->encoding); - } - else - { - $this->data['data'] .= $cdata; - } - } - - public function tag_close($parser, $tag) - { - if ($this->current_xhtml_construct >= 0) - { - $this->current_xhtml_construct--; - if (end($this->namespace) === SIMPLEPIE_NAMESPACE_XHTML && !in_array(end($this->element), array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param'))) - { - $this->data['data'] .= '</' . end($this->element) . '>'; - } - } - if ($this->current_xhtml_construct === -1) - { - $this->data =& $this->datas[count($this->datas) - 1]; - array_pop($this->datas); - } - - array_pop($this->element); - array_pop($this->namespace); - array_pop($this->xml_base); - array_pop($this->xml_base_explicit); - array_pop($this->xml_lang); - } - - public function split_ns($string) - { - static $cache = array(); - if (!isset($cache[$string])) - { - if ($pos = strpos($string, $this->separator)) - { - static $separator_length; - if (!$separator_length) - { - $separator_length = strlen($this->separator); - } - $namespace = substr($string, 0, $pos); - $local_name = substr($string, $pos + $separator_length); - if (strtolower($namespace) === SIMPLEPIE_NAMESPACE_ITUNES) - { - $namespace = SIMPLEPIE_NAMESPACE_ITUNES; - } - - // Normalize the Media RSS namespaces - if ($namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG || - $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2 || - $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3 || - $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4 || - $namespace === SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5 ) - { - $namespace = SIMPLEPIE_NAMESPACE_MEDIARSS; - } - $cache[$string] = array($namespace, $local_name); - } - else - { - $cache[$string] = array('', $string); - } - } - return $cache[$string]; - } -} diff --git a/wp/wp-includes/SimplePie/Rating.php b/wp/wp-includes/SimplePie/Rating.php deleted file mode 100644 index 8689e5df..00000000 --- a/wp/wp-includes/SimplePie/Rating.php +++ /dev/null @@ -1,129 +0,0 @@ -<?php -/** - * SimplePie - * - * A PHP-Based RSS and Atom Feed Framework. - * Takes the hard work out of managing a complete RSS/Atom solution. - * - * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * * Neither the name of the SimplePie Team nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS - * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package SimplePie - * @version 1.3.1 - * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue - * @author Ryan Parman - * @author Geoffrey Sneddon - * @author Ryan McCue - * @link http://simplepie.org/ SimplePie - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -/** - * Handles `<media:rating>` or `<itunes:explicit>` tags as defined in Media RSS and iTunes RSS respectively - * - * Used by {@see SimplePie_Enclosure::get_rating()} and {@see SimplePie_Enclosure::get_ratings()} - * - * This class can be overloaded with {@see SimplePie::set_rating_class()} - * - * @package SimplePie - * @subpackage API - */ -class SimplePie_Rating -{ - /** - * Rating scheme - * - * @var string - * @see get_scheme() - */ - var $scheme; - - /** - * Rating value - * - * @var string - * @see get_value() - */ - var $value; - - /** - * Constructor, used to input the data - * - * For documentation on all the parameters, see the corresponding - * properties and their accessors - */ - public function __construct($scheme = null, $value = null) - { - $this->scheme = $scheme; - $this->value = $value; - } - - /** - * String-ified version - * - * @return string - */ - public function __toString() - { - // There is no $this->data here - return md5(serialize($this)); - } - - /** - * Get the organizational scheme for the rating - * - * @return string|null - */ - public function get_scheme() - { - if ($this->scheme !== null) - { - return $this->scheme; - } - else - { - return null; - } - } - - /** - * Get the value of the rating - * - * @return string|null - */ - public function get_value() - { - if ($this->value !== null) - { - return $this->value; - } - else - { - return null; - } - } -} diff --git a/wp/wp-includes/SimplePie/Registry.php b/wp/wp-includes/SimplePie/Registry.php deleted file mode 100644 index 1072cdeb..00000000 --- a/wp/wp-includes/SimplePie/Registry.php +++ /dev/null @@ -1,225 +0,0 @@ -<?php -/** - * SimplePie - * - * A PHP-Based RSS and Atom Feed Framework. - * Takes the hard work out of managing a complete RSS/Atom solution. - * - * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * * Neither the name of the SimplePie Team nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS - * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package SimplePie - * @version 1.3.1 - * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue - * @author Ryan Parman - * @author Geoffrey Sneddon - * @author Ryan McCue - * @link http://simplepie.org/ SimplePie - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -/** - * Handles creating objects and calling methods - * - * Access this via {@see SimplePie::get_registry()} - * - * @package SimplePie - */ -class SimplePie_Registry -{ - /** - * Default class mapping - * - * Overriding classes *must* subclass these. - * - * @var array - */ - protected $default = array( - 'Cache' => 'SimplePie_Cache', - 'Locator' => 'SimplePie_Locator', - 'Parser' => 'SimplePie_Parser', - 'File' => 'SimplePie_File', - 'Sanitize' => 'SimplePie_Sanitize', - 'Item' => 'SimplePie_Item', - 'Author' => 'SimplePie_Author', - 'Category' => 'SimplePie_Category', - 'Enclosure' => 'SimplePie_Enclosure', - 'Caption' => 'SimplePie_Caption', - 'Copyright' => 'SimplePie_Copyright', - 'Credit' => 'SimplePie_Credit', - 'Rating' => 'SimplePie_Rating', - 'Restriction' => 'SimplePie_Restriction', - 'Content_Type_Sniffer' => 'SimplePie_Content_Type_Sniffer', - 'Source' => 'SimplePie_Source', - 'Misc' => 'SimplePie_Misc', - 'XML_Declaration_Parser' => 'SimplePie_XML_Declaration_Parser', - 'Parse_Date' => 'SimplePie_Parse_Date', - ); - - /** - * Class mapping - * - * @see register() - * @var array - */ - protected $classes = array(); - - /** - * Legacy classes - * - * @see register() - * @var array - */ - protected $legacy = array(); - - /** - * Constructor - * - * No-op - */ - public function __construct() { } - - /** - * Register a class - * - * @param string $type See {@see $default} for names - * @param string $class Class name, must subclass the corresponding default - * @param bool $legacy Whether to enable legacy support for this class - * @return bool Successfulness - */ - public function register($type, $class, $legacy = false) - { - if (!is_subclass_of($class, $this->default[$type])) - { - return false; - } - - $this->classes[$type] = $class; - - if ($legacy) - { - $this->legacy[] = $class; - } - - return true; - } - - /** - * Get the class registered for a type - * - * Where possible, use {@see create()} or {@see call()} instead - * - * @param string $type - * @return string|null - */ - public function get_class($type) - { - if (!empty($this->classes[$type])) - { - return $this->classes[$type]; - } - if (!empty($this->default[$type])) - { - return $this->default[$type]; - } - - return null; - } - - /** - * Create a new instance of a given type - * - * @param string $type - * @param array $parameters Parameters to pass to the constructor - * @return object Instance of class - */ - public function &create($type, $parameters = array()) - { - $class = $this->get_class($type); - - if (in_array($class, $this->legacy)) - { - switch ($type) - { - case 'locator': - // Legacy: file, timeout, useragent, file_class, max_checked_feeds, content_type_sniffer_class - // Specified: file, timeout, useragent, max_checked_feeds - $replacement = array($this->get_class('file'), $parameters[3], $this->get_class('content_type_sniffer')); - array_splice($parameters, 3, 1, $replacement); - break; - } - } - - if (!method_exists($class, '__construct')) - { - $instance = new $class; - } - else - { - $reflector = new ReflectionClass($class); - $instance = $reflector->newInstanceArgs($parameters); - } - - if (method_exists($instance, 'set_registry')) - { - $instance->set_registry($this); - } - return $instance; - } - - /** - * Call a static method for a type - * - * @param string $type - * @param string $method - * @param array $parameters - * @return mixed - */ - public function &call($type, $method, $parameters = array()) - { - $class = $this->get_class($type); - - if (in_array($class, $this->legacy)) - { - switch ($type) - { - case 'Cache': - // For backwards compatibility with old non-static - // Cache::create() methods - if ($method === 'get_handler') - { - $result = @call_user_func_array(array($class, 'create'), $parameters); - return $result; - } - break; - } - } - - $result = call_user_func_array(array($class, $method), $parameters); - return $result; - } -} \ No newline at end of file diff --git a/wp/wp-includes/SimplePie/Restriction.php b/wp/wp-includes/SimplePie/Restriction.php deleted file mode 100644 index 4ba371bf..00000000 --- a/wp/wp-includes/SimplePie/Restriction.php +++ /dev/null @@ -1,155 +0,0 @@ -<?php -/** - * SimplePie - * - * A PHP-Based RSS and Atom Feed Framework. - * Takes the hard work out of managing a complete RSS/Atom solution. - * - * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * * Neither the name of the SimplePie Team nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS - * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package SimplePie - * @version 1.3.1 - * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue - * @author Ryan Parman - * @author Geoffrey Sneddon - * @author Ryan McCue - * @link http://simplepie.org/ SimplePie - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -/** - * Handles `<media:restriction>` as defined in Media RSS - * - * Used by {@see SimplePie_Enclosure::get_restriction()} and {@see SimplePie_Enclosure::get_restrictions()} - * - * This class can be overloaded with {@see SimplePie::set_restriction_class()} - * - * @package SimplePie - * @subpackage API - */ -class SimplePie_Restriction -{ - /** - * Relationship ('allow'/'deny') - * - * @var string - * @see get_relationship() - */ - var $relationship; - - /** - * Type of restriction - * - * @var string - * @see get_type() - */ - var $type; - - /** - * Restricted values - * - * @var string - * @see get_value() - */ - var $value; - - /** - * Constructor, used to input the data - * - * For documentation on all the parameters, see the corresponding - * properties and their accessors - */ - public function __construct($relationship = null, $type = null, $value = null) - { - $this->relationship = $relationship; - $this->type = $type; - $this->value = $value; - } - - /** - * String-ified version - * - * @return string - */ - public function __toString() - { - // There is no $this->data here - return md5(serialize($this)); - } - - /** - * Get the relationship - * - * @return string|null Either 'allow' or 'deny' - */ - public function get_relationship() - { - if ($this->relationship !== null) - { - return $this->relationship; - } - else - { - return null; - } - } - - /** - * Get the type - * - * @return string|null - */ - public function get_type() - { - if ($this->type !== null) - { - return $this->type; - } - else - { - return null; - } - } - - /** - * Get the list of restricted things - * - * @return string|null - */ - public function get_value() - { - if ($this->value !== null) - { - return $this->value; - } - else - { - return null; - } - } -} diff --git a/wp/wp-includes/SimplePie/Sanitize.php b/wp/wp-includes/SimplePie/Sanitize.php deleted file mode 100644 index 1ce047a3..00000000 --- a/wp/wp-includes/SimplePie/Sanitize.php +++ /dev/null @@ -1,554 +0,0 @@ -<?php -/** - * SimplePie - * - * A PHP-Based RSS and Atom Feed Framework. - * Takes the hard work out of managing a complete RSS/Atom solution. - * - * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * * Neither the name of the SimplePie Team nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS - * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package SimplePie - * @version 1.3.1 - * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue - * @author Ryan Parman - * @author Geoffrey Sneddon - * @author Ryan McCue - * @link http://simplepie.org/ SimplePie - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -/** - * Used for data cleanup and post-processing - * - * - * This class can be overloaded with {@see SimplePie::set_sanitize_class()} - * - * @package SimplePie - * @todo Move to using an actual HTML parser (this will allow tags to be properly stripped, and to switch between HTML and XHTML), this will also make it easier to shorten a string while preserving HTML tags - */ -class SimplePie_Sanitize -{ - // Private vars - var $base; - - // Options - var $remove_div = true; - var $image_handler = ''; - var $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'); - var $encode_instead_of_strip = false; - var $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'); - var $strip_comments = false; - var $output_encoding = 'UTF-8'; - var $enable_cache = true; - var $cache_location = './cache'; - var $cache_name_function = 'md5'; - var $timeout = 10; - var $useragent = ''; - var $force_fsockopen = false; - var $replace_url_attributes = null; - - public function __construct() - { - // Set defaults - $this->set_url_replacements(null); - } - - public function remove_div($enable = true) - { - $this->remove_div = (bool) $enable; - } - - public function set_image_handler($page = false) - { - if ($page) - { - $this->image_handler = (string) $page; - } - else - { - $this->image_handler = false; - } - } - - public function set_registry(SimplePie_Registry $registry) - { - $this->registry = $registry; - } - - public function pass_cache_data($enable_cache = true, $cache_location = './cache', $cache_name_function = 'md5', $cache_class = 'SimplePie_Cache') - { - if (isset($enable_cache)) - { - $this->enable_cache = (bool) $enable_cache; - } - - if ($cache_location) - { - $this->cache_location = (string) $cache_location; - } - - if ($cache_name_function) - { - $this->cache_name_function = (string) $cache_name_function; - } - } - - public function pass_file_data($file_class = 'SimplePie_File', $timeout = 10, $useragent = '', $force_fsockopen = false) - { - if ($timeout) - { - $this->timeout = (string) $timeout; - } - - if ($useragent) - { - $this->useragent = (string) $useragent; - } - - if ($force_fsockopen) - { - $this->force_fsockopen = (string) $force_fsockopen; - } - } - - public function strip_htmltags($tags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style')) - { - if ($tags) - { - if (is_array($tags)) - { - $this->strip_htmltags = $tags; - } - else - { - $this->strip_htmltags = explode(',', $tags); - } - } - else - { - $this->strip_htmltags = false; - } - } - - public function encode_instead_of_strip($encode = false) - { - $this->encode_instead_of_strip = (bool) $encode; - } - - public function strip_attributes($attribs = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc')) - { - if ($attribs) - { - if (is_array($attribs)) - { - $this->strip_attributes = $attribs; - } - else - { - $this->strip_attributes = explode(',', $attribs); - } - } - else - { - $this->strip_attributes = false; - } - } - - public function strip_comments($strip = false) - { - $this->strip_comments = (bool) $strip; - } - - public function set_output_encoding($encoding = 'UTF-8') - { - $this->output_encoding = (string) $encoding; - } - - /** - * Set element/attribute key/value pairs of HTML attributes - * containing URLs that need to be resolved relative to the feed - * - * Defaults to |a|@href, |area|@href, |blockquote|@cite, |del|@cite, - * |form|@action, |img|@longdesc, |img|@src, |input|@src, |ins|@cite, - * |q|@cite - * - * @since 1.0 - * @param array|null $element_attribute Element/attribute key/value pairs, null for default - */ - public function set_url_replacements($element_attribute = null) - { - if ($element_attribute === null) - { - $element_attribute = array( - 'a' => 'href', - 'area' => 'href', - 'blockquote' => 'cite', - 'del' => 'cite', - 'form' => 'action', - 'img' => array( - 'longdesc', - 'src' - ), - 'input' => 'src', - 'ins' => 'cite', - 'q' => 'cite' - ); - } - $this->replace_url_attributes = (array) $element_attribute; - } - - public function sanitize($data, $type, $base = '') - { - $data = trim($data); - if ($data !== '' || $type & SIMPLEPIE_CONSTRUCT_IRI) - { - if ($type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML) - { - if (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data)) - { - $type |= SIMPLEPIE_CONSTRUCT_HTML; - } - else - { - $type |= SIMPLEPIE_CONSTRUCT_TEXT; - } - } - - if ($type & SIMPLEPIE_CONSTRUCT_BASE64) - { - $data = base64_decode($data); - } - - if ($type & (SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML)) - { - - if (!class_exists('DOMDocument')) - { - $this->registry->call('Misc', 'error', array('DOMDocument not found, unable to use sanitizer', E_USER_WARNING, __FILE__, __LINE__)); - return ''; - } - $document = new DOMDocument(); - $document->encoding = 'UTF-8'; - $data = $this->preprocess($data, $type); - - set_error_handler(array('SimplePie_Misc', 'silence_errors')); - $document->loadHTML($data); - restore_error_handler(); - - // Strip comments - if ($this->strip_comments) - { - $xpath = new DOMXPath($document); - $comments = $xpath->query('//comment()'); - - foreach ($comments as $comment) - { - $comment->parentNode->removeChild($comment); - } - } - - // Strip out HTML tags and attributes that might cause various security problems. - // Based on recommendations by Mark Pilgrim at: - // http://diveintomark.org/archives/2003/06/12/how_to_consume_rss_safely - if ($this->strip_htmltags) - { - foreach ($this->strip_htmltags as $tag) - { - $this->strip_tag($tag, $document, $type); - } - } - - if ($this->strip_attributes) - { - foreach ($this->strip_attributes as $attrib) - { - $this->strip_attr($attrib, $document); - } - } - - // Replace relative URLs - $this->base = $base; - foreach ($this->replace_url_attributes as $element => $attributes) - { - $this->replace_urls($document, $element, $attributes); - } - - // If image handling (caching, etc.) is enabled, cache and rewrite all the image tags. - if (isset($this->image_handler) && ((string) $this->image_handler) !== '' && $this->enable_cache) - { - $images = $document->getElementsByTagName('img'); - foreach ($images as $img) - { - if ($img->hasAttribute('src')) - { - $image_url = call_user_func($this->cache_name_function, $img->getAttribute('src')); - $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, $image_url, 'spi')); - - if ($cache->load()) - { - $img->setAttribute('src', $this->image_handler . $image_url); - } - else - { - $file = $this->registry->create('File', array($img->getAttribute('src'), $this->timeout, 5, array('X-FORWARDED-FOR' => $_SERVER['REMOTE_ADDR']), $this->useragent, $this->force_fsockopen)); - $headers = $file->headers; - - if ($file->success && ($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) - { - if ($cache->save(array('headers' => $file->headers, 'body' => $file->body))) - { - $img->setAttribute('src', $this->image_handler . $image_url); - } - else - { - trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); - } - } - } - } - } - } - - // Remove the DOCTYPE - // Seems to cause segfaulting if we don't do this - if ($document->firstChild instanceof DOMDocumentType) - { - $document->removeChild($document->firstChild); - } - - // Move everything from the body to the root - $real_body = $document->getElementsByTagName('body')->item(0)->childNodes->item(0); - $document->replaceChild($real_body, $document->firstChild); - - // Finally, convert to a HTML string - $data = trim($document->saveHTML()); - - if ($this->remove_div) - { - $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '', $data); - $data = preg_replace('/<\/div>$/', '', $data); - } - else - { - $data = preg_replace('/^<div' . SIMPLEPIE_PCRE_XML_ATTRIBUTE . '>/', '<div>', $data); - } - } - - if ($type & SIMPLEPIE_CONSTRUCT_IRI) - { - $absolute = $this->registry->call('Misc', 'absolutize_url', array($data, $base)); - if ($absolute !== false) - { - $data = $absolute; - } - } - - if ($type & (SIMPLEPIE_CONSTRUCT_TEXT | SIMPLEPIE_CONSTRUCT_IRI)) - { - $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8'); - } - - if ($this->output_encoding !== 'UTF-8') - { - $data = $this->registry->call('Misc', 'change_encoding', array($data, 'UTF-8', $this->output_encoding)); - } - } - return $data; - } - - protected function preprocess($html, $type) - { - $ret = ''; - if ($type & ~SIMPLEPIE_CONSTRUCT_XHTML) - { - // Atom XHTML constructs are wrapped with a div by default - // Note: No protection if $html contains a stray </div>! - $html = '<div>' . $html . '</div>'; - $ret .= '<!DOCTYPE html>'; - $content_type = 'text/html'; - } - else - { - $ret .= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'; - $content_type = 'application/xhtml+xml'; - } - - $ret .= '<html><head>'; - $ret .= '<meta http-equiv="Content-Type" content="' . $content_type . '; charset=utf-8" />'; - $ret .= '</head><body>' . $html . '</body></html>'; - return $ret; - } - - public function replace_urls($document, $tag, $attributes) - { - if (!is_array($attributes)) - { - $attributes = array($attributes); - } - - if (!is_array($this->strip_htmltags) || !in_array($tag, $this->strip_htmltags)) - { - $elements = $document->getElementsByTagName($tag); - foreach ($elements as $element) - { - foreach ($attributes as $attribute) - { - if ($element->hasAttribute($attribute)) - { - $value = $this->registry->call('Misc', 'absolutize_url', array($element->getAttribute($attribute), $this->base)); - if ($value !== false) - { - $element->setAttribute($attribute, $value); - } - } - } - } - } - } - - public function do_strip_htmltags($match) - { - if ($this->encode_instead_of_strip) - { - if (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style'))) - { - $match[1] = htmlspecialchars($match[1], ENT_COMPAT, 'UTF-8'); - $match[2] = htmlspecialchars($match[2], ENT_COMPAT, 'UTF-8'); - return "<$match[1]$match[2]>$match[3]</$match[1]>"; - } - else - { - return htmlspecialchars($match[0], ENT_COMPAT, 'UTF-8'); - } - } - elseif (isset($match[4]) && !in_array(strtolower($match[1]), array('script', 'style'))) - { - return $match[4]; - } - else - { - return ''; - } - } - - protected function strip_tag($tag, $document, $type) - { - $xpath = new DOMXPath($document); - $elements = $xpath->query('body//' . $tag); - if ($this->encode_instead_of_strip) - { - foreach ($elements as $element) - { - $fragment = $document->createDocumentFragment(); - - // For elements which aren't script or style, include the tag itself - if (!in_array($tag, array('script', 'style'))) - { - $text = '<' . $tag; - if ($element->hasAttributes()) - { - $attrs = array(); - foreach ($element->attributes as $name => $attr) - { - $value = $attr->value; - - // In XHTML, empty values should never exist, so we repeat the value - if (empty($value) && ($type & SIMPLEPIE_CONSTRUCT_XHTML)) - { - $value = $name; - } - // For HTML, empty is fine - elseif (empty($value) && ($type & SIMPLEPIE_CONSTRUCT_HTML)) - { - $attrs[] = $name; - continue; - } - - // Standard attribute text - $attrs[] = $name . '="' . $attr->value . '"'; - } - $text .= ' ' . implode(' ', $attrs); - } - $text .= '>'; - $fragment->appendChild(new DOMText($text)); - } - - $number = $element->childNodes->length; - for ($i = $number; $i > 0; $i--) - { - $child = $element->childNodes->item(0); - $fragment->appendChild($child); - } - - if (!in_array($tag, array('script', 'style'))) - { - $fragment->appendChild(new DOMText('</' . $tag . '>')); - } - - $element->parentNode->replaceChild($fragment, $element); - } - - return; - } - elseif (in_array($tag, array('script', 'style'))) - { - foreach ($elements as $element) - { - $element->parentNode->removeChild($element); - } - - return; - } - else - { - foreach ($elements as $element) - { - $fragment = $document->createDocumentFragment(); - $number = $element->childNodes->length; - for ($i = $number; $i > 0; $i--) - { - $child = $element->childNodes->item(0); - $fragment->appendChild($child); - } - - $element->parentNode->replaceChild($fragment, $element); - } - } - } - - protected function strip_attr($attrib, $document) - { - $xpath = new DOMXPath($document); - $elements = $xpath->query('//*[@' . $attrib . ']'); - - foreach ($elements as $element) - { - $element->removeAttribute($attrib); - } - } -} diff --git a/wp/wp-includes/SimplePie/Source.php b/wp/wp-includes/SimplePie/Source.php deleted file mode 100644 index 51d8e6c2..00000000 --- a/wp/wp-includes/SimplePie/Source.php +++ /dev/null @@ -1,611 +0,0 @@ -<?php -/** - * SimplePie - * - * A PHP-Based RSS and Atom Feed Framework. - * Takes the hard work out of managing a complete RSS/Atom solution. - * - * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * * Neither the name of the SimplePie Team nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS - * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package SimplePie - * @version 1.3.1 - * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue - * @author Ryan Parman - * @author Geoffrey Sneddon - * @author Ryan McCue - * @link http://simplepie.org/ SimplePie - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -/** - * Handles `<atom:source>` - * - * Used by {@see SimplePie_Item::get_source()} - * - * This class can be overloaded with {@see SimplePie::set_source_class()} - * - * @package SimplePie - * @subpackage API - */ -class SimplePie_Source -{ - var $item; - var $data = array(); - protected $registry; - - public function __construct($item, $data) - { - $this->item = $item; - $this->data = $data; - } - - public function set_registry(SimplePie_Registry $registry) - { - $this->registry = $registry; - } - - public function __toString() - { - return md5(serialize($this->data)); - } - - public function get_source_tags($namespace, $tag) - { - if (isset($this->data['child'][$namespace][$tag])) - { - return $this->data['child'][$namespace][$tag]; - } - else - { - return null; - } - } - - public function get_base($element = array()) - { - return $this->item->get_base($element); - } - - public function sanitize($data, $type, $base = '') - { - return $this->item->sanitize($data, $type, $base); - } - - public function get_item() - { - return $this->item; - } - - public function get_title() - { - if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - return null; - } - } - - public function get_category($key = 0) - { - $categories = $this->get_categories(); - if (isset($categories[$key])) - { - return $categories[$key]; - } - else - { - return null; - } - } - - public function get_categories() - { - $categories = array(); - - foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) - { - $term = null; - $scheme = null; - $label = null; - if (isset($category['attribs']['']['term'])) - { - $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($category['attribs']['']['scheme'])) - { - $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($category['attribs']['']['label'])) - { - $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); - } - foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) - { - // This is really the label, but keep this as the term also for BC. - // Label will also work on retrieving because that falls back to term. - $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); - if (isset($category['attribs']['']['domain'])) - { - $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $scheme = null; - } - $categories[] = $this->registry->create('Category', array($term, $scheme, null)); - } - foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) - { - $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) - { - $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - - if (!empty($categories)) - { - return array_unique($categories); - } - else - { - return null; - } - } - - public function get_author($key = 0) - { - $authors = $this->get_authors(); - if (isset($authors[$key])) - { - return $authors[$key]; - } - else - { - return null; - } - } - - public function get_authors() - { - $authors = array(); - foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) - { - $name = null; - $uri = null; - $email = null; - if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) - { - $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) - { - $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); - } - if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) - { - $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if ($name !== null || $email !== null || $uri !== null) - { - $authors[] = $this->registry->create('Author', array($name, $uri, $email)); - } - } - if ($author = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) - { - $name = null; - $url = null; - $email = null; - if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) - { - $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) - { - $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); - } - if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) - { - $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if ($name !== null || $email !== null || $url !== null) - { - $authors[] = $this->registry->create('Author', array($name, $url, $email)); - } - } - foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) - { - $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) - { - $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) - { - $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - - if (!empty($authors)) - { - return array_unique($authors); - } - else - { - return null; - } - } - - public function get_contributor($key = 0) - { - $contributors = $this->get_contributors(); - if (isset($contributors[$key])) - { - return $contributors[$key]; - } - else - { - return null; - } - } - - public function get_contributors() - { - $contributors = array(); - foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) - { - $name = null; - $uri = null; - $email = null; - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) - { - $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) - { - $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); - } - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) - { - $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if ($name !== null || $email !== null || $uri !== null) - { - $contributors[] = $this->registry->create('Author', array($name, $uri, $email)); - } - } - foreach ((array) $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) - { - $name = null; - $url = null; - $email = null; - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) - { - $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) - { - $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); - } - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) - { - $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if ($name !== null || $email !== null || $url !== null) - { - $contributors[] = $this->registry->create('Author', array($name, $url, $email)); - } - } - - if (!empty($contributors)) - { - return array_unique($contributors); - } - else - { - return null; - } - } - - public function get_link($key = 0, $rel = 'alternate') - { - $links = $this->get_links($rel); - if (isset($links[$key])) - { - return $links[$key]; - } - else - { - return null; - } - } - - /** - * Added for parity between the parent-level and the item/entry-level. - */ - public function get_permalink() - { - return $this->get_link(0); - } - - public function get_links($rel = 'alternate') - { - if (!isset($this->data['links'])) - { - $this->data['links'] = array(); - if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link')) - { - foreach ($links as $link) - { - if (isset($link['attribs']['']['href'])) - { - $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; - $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); - } - } - } - if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link')) - { - foreach ($links as $link) - { - if (isset($link['attribs']['']['href'])) - { - $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; - $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); - - } - } - } - if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) - { - $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); - } - if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) - { - $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); - } - if ($links = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) - { - $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); - } - - $keys = array_keys($this->data['links']); - foreach ($keys as $key) - { - if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key))) - { - if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) - { - $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); - $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; - } - else - { - $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; - } - } - elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) - { - $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; - } - $this->data['links'][$key] = array_unique($this->data['links'][$key]); - } - } - - if (isset($this->data['links'][$rel])) - { - return $this->data['links'][$rel]; - } - else - { - return null; - } - } - - public function get_description() - { - if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); - } - else - { - return null; - } - } - - public function get_copyright() - { - if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - return null; - } - } - - public function get_language() - { - if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif (isset($this->data['xml_lang'])) - { - return $this->sanitize($this->data['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - return null; - } - } - - public function get_latitude() - { - if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) - { - return (float) $return[0]['data']; - } - elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) - { - return (float) $match[1]; - } - else - { - return null; - } - } - - public function get_longitude() - { - if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) - { - return (float) $return[0]['data']; - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) - { - return (float) $return[0]['data']; - } - elseif (($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) - { - return (float) $match[2]; - } - else - { - return null; - } - } - - public function get_image_url() - { - if ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image')) - { - return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); - } - elseif ($return = $this->get_source_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); - } - else - { - return null; - } - } -} - diff --git a/wp/wp-includes/SimplePie/XML/Declaration/Parser.php b/wp/wp-includes/SimplePie/XML/Declaration/Parser.php deleted file mode 100644 index aec19f10..00000000 --- a/wp/wp-includes/SimplePie/XML/Declaration/Parser.php +++ /dev/null @@ -1,362 +0,0 @@ -<?php -/** - * SimplePie - * - * A PHP-Based RSS and Atom Feed Framework. - * Takes the hard work out of managing a complete RSS/Atom solution. - * - * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * * Neither the name of the SimplePie Team nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS - * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package SimplePie - * @version 1.3.1 - * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue - * @author Ryan Parman - * @author Geoffrey Sneddon - * @author Ryan McCue - * @link http://simplepie.org/ SimplePie - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - - -/** - * Parses the XML Declaration - * - * @package SimplePie - * @subpackage Parsing - */ -class SimplePie_XML_Declaration_Parser -{ - /** - * XML Version - * - * @access public - * @var string - */ - var $version = '1.0'; - - /** - * Encoding - * - * @access public - * @var string - */ - var $encoding = 'UTF-8'; - - /** - * Standalone - * - * @access public - * @var bool - */ - var $standalone = false; - - /** - * Current state of the state machine - * - * @access private - * @var string - */ - var $state = 'before_version_name'; - - /** - * Input data - * - * @access private - * @var string - */ - var $data = ''; - - /** - * Input data length (to avoid calling strlen() everytime this is needed) - * - * @access private - * @var int - */ - var $data_length = 0; - - /** - * Current position of the pointer - * - * @var int - * @access private - */ - var $position = 0; - - /** - * Create an instance of the class with the input data - * - * @access public - * @param string $data Input data - */ - public function __construct($data) - { - $this->data = $data; - $this->data_length = strlen($this->data); - } - - /** - * Parse the input data - * - * @access public - * @return bool true on success, false on failure - */ - public function parse() - { - while ($this->state && $this->state !== 'emit' && $this->has_data()) - { - $state = $this->state; - $this->$state(); - } - $this->data = ''; - if ($this->state === 'emit') - { - return true; - } - else - { - $this->version = ''; - $this->encoding = ''; - $this->standalone = ''; - return false; - } - } - - /** - * Check whether there is data beyond the pointer - * - * @access private - * @return bool true if there is further data, false if not - */ - public function has_data() - { - return (bool) ($this->position < $this->data_length); - } - - /** - * Advance past any whitespace - * - * @return int Number of whitespace characters passed - */ - public function skip_whitespace() - { - $whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position); - $this->position += $whitespace; - return $whitespace; - } - - /** - * Read value - */ - public function get_value() - { - $quote = substr($this->data, $this->position, 1); - if ($quote === '"' || $quote === "'") - { - $this->position++; - $len = strcspn($this->data, $quote, $this->position); - if ($this->has_data()) - { - $value = substr($this->data, $this->position, $len); - $this->position += $len + 1; - return $value; - } - } - return false; - } - - public function before_version_name() - { - if ($this->skip_whitespace()) - { - $this->state = 'version_name'; - } - else - { - $this->state = false; - } - } - - public function version_name() - { - if (substr($this->data, $this->position, 7) === 'version') - { - $this->position += 7; - $this->skip_whitespace(); - $this->state = 'version_equals'; - } - else - { - $this->state = false; - } - } - - public function version_equals() - { - if (substr($this->data, $this->position, 1) === '=') - { - $this->position++; - $this->skip_whitespace(); - $this->state = 'version_value'; - } - else - { - $this->state = false; - } - } - - public function version_value() - { - if ($this->version = $this->get_value()) - { - $this->skip_whitespace(); - if ($this->has_data()) - { - $this->state = 'encoding_name'; - } - else - { - $this->state = 'emit'; - } - } - else - { - $this->state = false; - } - } - - public function encoding_name() - { - if (substr($this->data, $this->position, 8) === 'encoding') - { - $this->position += 8; - $this->skip_whitespace(); - $this->state = 'encoding_equals'; - } - else - { - $this->state = 'standalone_name'; - } - } - - public function encoding_equals() - { - if (substr($this->data, $this->position, 1) === '=') - { - $this->position++; - $this->skip_whitespace(); - $this->state = 'encoding_value'; - } - else - { - $this->state = false; - } - } - - public function encoding_value() - { - if ($this->encoding = $this->get_value()) - { - $this->skip_whitespace(); - if ($this->has_data()) - { - $this->state = 'standalone_name'; - } - else - { - $this->state = 'emit'; - } - } - else - { - $this->state = false; - } - } - - public function standalone_name() - { - if (substr($this->data, $this->position, 10) === 'standalone') - { - $this->position += 10; - $this->skip_whitespace(); - $this->state = 'standalone_equals'; - } - else - { - $this->state = false; - } - } - - public function standalone_equals() - { - if (substr($this->data, $this->position, 1) === '=') - { - $this->position++; - $this->skip_whitespace(); - $this->state = 'standalone_value'; - } - else - { - $this->state = false; - } - } - - public function standalone_value() - { - if ($standalone = $this->get_value()) - { - switch ($standalone) - { - case 'yes': - $this->standalone = true; - break; - - case 'no': - $this->standalone = false; - break; - - default: - $this->state = false; - return; - } - - $this->skip_whitespace(); - if ($this->has_data()) - { - $this->state = false; - } - else - { - $this->state = 'emit'; - } - } - else - { - $this->state = false; - } - } -} diff --git a/wp/wp-includes/SimplePie/gzdecode.php b/wp/wp-includes/SimplePie/gzdecode.php deleted file mode 100644 index 52e024ea..00000000 --- a/wp/wp-includes/SimplePie/gzdecode.php +++ /dev/null @@ -1,371 +0,0 @@ -<?php -/** - * SimplePie - * - * A PHP-Based RSS and Atom Feed Framework. - * Takes the hard work out of managing a complete RSS/Atom solution. - * - * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * * Neither the name of the SimplePie Team nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS - * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package SimplePie - * @version 1.3.1 - * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue - * @author Ryan Parman - * @author Geoffrey Sneddon - * @author Ryan McCue - * @link http://simplepie.org/ SimplePie - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - - -/** - * Decode 'gzip' encoded HTTP data - * - * @package SimplePie - * @subpackage HTTP - * @link http://www.gzip.org/format.txt - */ -class SimplePie_gzdecode -{ - /** - * Compressed data - * - * @access private - * @var string - * @see gzdecode::$data - */ - var $compressed_data; - - /** - * Size of compressed data - * - * @access private - * @var int - */ - var $compressed_size; - - /** - * Minimum size of a valid gzip string - * - * @access private - * @var int - */ - var $min_compressed_size = 18; - - /** - * Current position of pointer - * - * @access private - * @var int - */ - var $position = 0; - - /** - * Flags (FLG) - * - * @access private - * @var int - */ - var $flags; - - /** - * Uncompressed data - * - * @access public - * @see gzdecode::$compressed_data - * @var string - */ - var $data; - - /** - * Modified time - * - * @access public - * @var int - */ - var $MTIME; - - /** - * Extra Flags - * - * @access public - * @var int - */ - var $XFL; - - /** - * Operating System - * - * @access public - * @var int - */ - var $OS; - - /** - * Subfield ID 1 - * - * @access public - * @see gzdecode::$extra_field - * @see gzdecode::$SI2 - * @var string - */ - var $SI1; - - /** - * Subfield ID 2 - * - * @access public - * @see gzdecode::$extra_field - * @see gzdecode::$SI1 - * @var string - */ - var $SI2; - - /** - * Extra field content - * - * @access public - * @see gzdecode::$SI1 - * @see gzdecode::$SI2 - * @var string - */ - var $extra_field; - - /** - * Original filename - * - * @access public - * @var string - */ - var $filename; - - /** - * Human readable comment - * - * @access public - * @var string - */ - var $comment; - - /** - * Don't allow anything to be set - * - * @param string $name - * @param mixed $value - */ - public function __set($name, $value) - { - trigger_error("Cannot write property $name", E_USER_ERROR); - } - - /** - * Set the compressed string and related properties - * - * @param string $data - */ - public function __construct($data) - { - $this->compressed_data = $data; - $this->compressed_size = strlen($data); - } - - /** - * Decode the GZIP stream - * - * @return bool Successfulness - */ - public function parse() - { - if ($this->compressed_size >= $this->min_compressed_size) - { - // Check ID1, ID2, and CM - if (substr($this->compressed_data, 0, 3) !== "\x1F\x8B\x08") - { - return false; - } - - // Get the FLG (FLaGs) - $this->flags = ord($this->compressed_data[3]); - - // FLG bits above (1 << 4) are reserved - if ($this->flags > 0x1F) - { - return false; - } - - // Advance the pointer after the above - $this->position += 4; - - // MTIME - $mtime = substr($this->compressed_data, $this->position, 4); - // Reverse the string if we're on a big-endian arch because l is the only signed long and is machine endianness - if (current(unpack('S', "\x00\x01")) === 1) - { - $mtime = strrev($mtime); - } - $this->MTIME = current(unpack('l', $mtime)); - $this->position += 4; - - // Get the XFL (eXtra FLags) - $this->XFL = ord($this->compressed_data[$this->position++]); - - // Get the OS (Operating System) - $this->OS = ord($this->compressed_data[$this->position++]); - - // Parse the FEXTRA - if ($this->flags & 4) - { - // Read subfield IDs - $this->SI1 = $this->compressed_data[$this->position++]; - $this->SI2 = $this->compressed_data[$this->position++]; - - // SI2 set to zero is reserved for future use - if ($this->SI2 === "\x00") - { - return false; - } - - // Get the length of the extra field - $len = current(unpack('v', substr($this->compressed_data, $this->position, 2))); - $this->position += 2; - - // Check the length of the string is still valid - $this->min_compressed_size += $len + 4; - if ($this->compressed_size >= $this->min_compressed_size) - { - // Set the extra field to the given data - $this->extra_field = substr($this->compressed_data, $this->position, $len); - $this->position += $len; - } - else - { - return false; - } - } - - // Parse the FNAME - if ($this->flags & 8) - { - // Get the length of the filename - $len = strcspn($this->compressed_data, "\x00", $this->position); - - // Check the length of the string is still valid - $this->min_compressed_size += $len + 1; - if ($this->compressed_size >= $this->min_compressed_size) - { - // Set the original filename to the given string - $this->filename = substr($this->compressed_data, $this->position, $len); - $this->position += $len + 1; - } - else - { - return false; - } - } - - // Parse the FCOMMENT - if ($this->flags & 16) - { - // Get the length of the comment - $len = strcspn($this->compressed_data, "\x00", $this->position); - - // Check the length of the string is still valid - $this->min_compressed_size += $len + 1; - if ($this->compressed_size >= $this->min_compressed_size) - { - // Set the original comment to the given string - $this->comment = substr($this->compressed_data, $this->position, $len); - $this->position += $len + 1; - } - else - { - return false; - } - } - - // Parse the FHCRC - if ($this->flags & 2) - { - // Check the length of the string is still valid - $this->min_compressed_size += $len + 2; - if ($this->compressed_size >= $this->min_compressed_size) - { - // Read the CRC - $crc = current(unpack('v', substr($this->compressed_data, $this->position, 2))); - - // Check the CRC matches - if ((crc32(substr($this->compressed_data, 0, $this->position)) & 0xFFFF) === $crc) - { - $this->position += 2; - } - else - { - return false; - } - } - else - { - return false; - } - } - - // Decompress the actual data - if (($this->data = gzinflate(substr($this->compressed_data, $this->position, -8))) === false) - { - return false; - } - else - { - $this->position = $this->compressed_size - 8; - } - - // Check CRC of data - $crc = current(unpack('V', substr($this->compressed_data, $this->position, 4))); - $this->position += 4; - /*if (extension_loaded('hash') && sprintf('%u', current(unpack('V', hash('crc32b', $this->data)))) !== sprintf('%u', $crc)) - { - return false; - }*/ - - // Check ISIZE of data - $isize = current(unpack('V', substr($this->compressed_data, $this->position, 4))); - $this->position += 4; - if (sprintf('%u', strlen($this->data) & 0xFFFFFFFF) !== sprintf('%u', $isize)) - { - return false; - } - - // Wow, against all odds, we've actually got a valid gzip string - return true; - } - else - { - return false; - } - } -} diff --git a/wp/wp-includes/Text/Diff.php b/wp/wp-includes/Text/Diff.php deleted file mode 100644 index edcdd3ac..00000000 --- a/wp/wp-includes/Text/Diff.php +++ /dev/null @@ -1,506 +0,0 @@ -<?php -/** - * General API for generating and formatting diffs - the differences between - * two sequences of strings. - * - * The original PHP version of this code was written by Geoffrey T. Dairiki - * <dairiki@dairiki.org>, and is used/adapted with his permission. - * - * Copyright 2004 Geoffrey T. Dairiki <dairiki@dairiki.org> - * Copyright 2004-2010 The Horde Project (http://www.horde.org/) - * - * See the enclosed file COPYING for license information (LGPL). If you did - * not receive this file, see http://opensource.org/licenses/lgpl-license.php. - * - * @package Text_Diff - * @author Geoffrey T. Dairiki <dairiki@dairiki.org> - */ -class Text_Diff { - - /** - * Array of changes. - * - * @var array - */ - var $_edits; - - /** - * Computes diffs between sequences of strings. - * - * @param string $engine Name of the diffing engine to use. 'auto' - * will automatically select the best. - * @param array $params Parameters to pass to the diffing engine. - * Normally an array of two arrays, each - * containing the lines from a file. - */ - function __construct( $engine, $params ) - { - // Backward compatibility workaround. - if (!is_string($engine)) { - $params = array($engine, $params); - $engine = 'auto'; - } - - if ($engine == 'auto') { - $engine = extension_loaded('xdiff') ? 'xdiff' : 'native'; - } else { - $engine = basename($engine); - } - - // WP #7391 - require_once dirname(__FILE__).'/Diff/Engine/' . $engine . '.php'; - $class = 'Text_Diff_Engine_' . $engine; - $diff_engine = new $class(); - - $this->_edits = call_user_func_array(array($diff_engine, 'diff'), $params); - } - - /** - * PHP4 constructor. - */ - public function Text_Diff( $engine, $params ) { - self::__construct( $engine, $params ); - } - - /** - * Returns the array of differences. - */ - function getDiff() - { - return $this->_edits; - } - - /** - * returns the number of new (added) lines in a given diff. - * - * @since Text_Diff 1.1.0 - * - * @return integer The number of new lines - */ - function countAddedLines() - { - $count = 0; - foreach ($this->_edits as $edit) { - if (is_a($edit, 'Text_Diff_Op_add') || - is_a($edit, 'Text_Diff_Op_change')) { - $count += $edit->nfinal(); - } - } - return $count; - } - - /** - * Returns the number of deleted (removed) lines in a given diff. - * - * @since Text_Diff 1.1.0 - * - * @return integer The number of deleted lines - */ - function countDeletedLines() - { - $count = 0; - foreach ($this->_edits as $edit) { - if (is_a($edit, 'Text_Diff_Op_delete') || - is_a($edit, 'Text_Diff_Op_change')) { - $count += $edit->norig(); - } - } - return $count; - } - - /** - * Computes a reversed diff. - * - * Example: - * <code> - * $diff = new Text_Diff($lines1, $lines2); - * $rev = $diff->reverse(); - * </code> - * - * @return Text_Diff A Diff object representing the inverse of the - * original diff. Note that we purposely don't return a - * reference here, since this essentially is a clone() - * method. - */ - function reverse() - { - if (version_compare(zend_version(), '2', '>')) { - $rev = clone($this); - } else { - $rev = $this; - } - $rev->_edits = array(); - foreach ($this->_edits as $edit) { - $rev->_edits[] = $edit->reverse(); - } - return $rev; - } - - /** - * Checks for an empty diff. - * - * @return boolean True if two sequences were identical. - */ - function isEmpty() - { - foreach ($this->_edits as $edit) { - if (!is_a($edit, 'Text_Diff_Op_copy')) { - return false; - } - } - return true; - } - - /** - * Computes the length of the Longest Common Subsequence (LCS). - * - * This is mostly for diagnostic purposes. - * - * @return integer The length of the LCS. - */ - function lcs() - { - $lcs = 0; - foreach ($this->_edits as $edit) { - if (is_a($edit, 'Text_Diff_Op_copy')) { - $lcs += count($edit->orig); - } - } - return $lcs; - } - - /** - * Gets the original set of lines. - * - * This reconstructs the $from_lines parameter passed to the constructor. - * - * @return array The original sequence of strings. - */ - function getOriginal() - { - $lines = array(); - foreach ($this->_edits as $edit) { - if ($edit->orig) { - array_splice($lines, count($lines), 0, $edit->orig); - } - } - return $lines; - } - - /** - * Gets the final set of lines. - * - * This reconstructs the $to_lines parameter passed to the constructor. - * - * @return array The sequence of strings. - */ - function getFinal() - { - $lines = array(); - foreach ($this->_edits as $edit) { - if ($edit->final) { - array_splice($lines, count($lines), 0, $edit->final); - } - } - return $lines; - } - - /** - * Removes trailing newlines from a line of text. This is meant to be used - * with array_walk(). - * - * @param string $line The line to trim. - * @param integer $key The index of the line in the array. Not used. - */ - static function trimNewlines(&$line, $key) - { - $line = str_replace(array("\n", "\r"), '', $line); - } - - /** - * Determines the location of the system temporary directory. - * - * @static - * - * @access protected - * - * @return string A directory name which can be used for temp files. - * Returns false if one could not be found. - */ - function _getTempDir() - { - $tmp_locations = array('/tmp', '/var/tmp', 'c:\WUTemp', 'c:\temp', - 'c:\windows\temp', 'c:\winnt\temp'); - - /* Try PHP's upload_tmp_dir directive. */ - $tmp = ini_get('upload_tmp_dir'); - - /* Otherwise, try to determine the TMPDIR environment variable. */ - if (!strlen($tmp)) { - $tmp = getenv('TMPDIR'); - } - - /* If we still cannot determine a value, then cycle through a list of - * preset possibilities. */ - while (!strlen($tmp) && count($tmp_locations)) { - $tmp_check = array_shift($tmp_locations); - if (@is_dir($tmp_check)) { - $tmp = $tmp_check; - } - } - - /* If it is still empty, we have failed, so return false; otherwise - * return the directory determined. */ - return strlen($tmp) ? $tmp : false; - } - - /** - * Checks a diff for validity. - * - * This is here only for debugging purposes. - */ - function _check($from_lines, $to_lines) - { - if (serialize($from_lines) != serialize($this->getOriginal())) { - trigger_error("Reconstructed original doesn't match", E_USER_ERROR); - } - if (serialize($to_lines) != serialize($this->getFinal())) { - trigger_error("Reconstructed final doesn't match", E_USER_ERROR); - } - - $rev = $this->reverse(); - if (serialize($to_lines) != serialize($rev->getOriginal())) { - trigger_error("Reversed original doesn't match", E_USER_ERROR); - } - if (serialize($from_lines) != serialize($rev->getFinal())) { - trigger_error("Reversed final doesn't match", E_USER_ERROR); - } - - $prevtype = null; - foreach ($this->_edits as $edit) { - if ($prevtype == get_class($edit)) { - trigger_error("Edit sequence is non-optimal", E_USER_ERROR); - } - $prevtype = get_class($edit); - } - - return true; - } - -} - -/** - * @package Text_Diff - * @author Geoffrey T. Dairiki <dairiki@dairiki.org> - */ -class Text_MappedDiff extends Text_Diff { - - /** - * Computes a diff between sequences of strings. - * - * This can be used to compute things like case-insensitve diffs, or diffs - * which ignore changes in white-space. - * - * @param array $from_lines An array of strings. - * @param array $to_lines An array of strings. - * @param array $mapped_from_lines This array should have the same size - * number of elements as $from_lines. The - * elements in $mapped_from_lines and - * $mapped_to_lines are what is actually - * compared when computing the diff. - * @param array $mapped_to_lines This array should have the same number - * of elements as $to_lines. - */ - function __construct($from_lines, $to_lines, - $mapped_from_lines, $mapped_to_lines) - { - assert(count($from_lines) == count($mapped_from_lines)); - assert(count($to_lines) == count($mapped_to_lines)); - - parent::Text_Diff($mapped_from_lines, $mapped_to_lines); - - $xi = $yi = 0; - for ($i = 0; $i < count($this->_edits); $i++) { - $orig = &$this->_edits[$i]->orig; - if (is_array($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, count($final)); - $yi += count($final); - } - } - } - - /** - * PHP4 constructor. - */ - public function Text_MappedDiff( $from_lines, $to_lines, - $mapped_from_lines, $mapped_to_lines ) { - self::__construct( $from_lines, $to_lines, - $mapped_from_lines, $mapped_to_lines ); - } - -} - -/** - * @package Text_Diff - * @author Geoffrey T. Dairiki <dairiki@dairiki.org> - * - * @access private - */ -class Text_Diff_Op { - - var $orig; - var $final; - - function &reverse() - { - trigger_error('Abstract method', E_USER_ERROR); - } - - function norig() - { - return $this->orig ? count($this->orig) : 0; - } - - function nfinal() - { - return $this->final ? count($this->final) : 0; - } - -} - -/** - * @package Text_Diff - * @author Geoffrey T. Dairiki <dairiki@dairiki.org> - * - * @access private - */ -class Text_Diff_Op_copy extends Text_Diff_Op { - - /** - * PHP5 constructor. - */ - function __construct( $orig, $final = false ) - { - if (!is_array($final)) { - $final = $orig; - } - $this->orig = $orig; - $this->final = $final; - } - - /** - * PHP4 constructor. - */ - public function Text_Diff_Op_copy( $orig, $final = false ) { - self::__construct( $orig, $final ); - } - - function &reverse() - { - $reverse = new Text_Diff_Op_copy($this->final, $this->orig); - return $reverse; - } - -} - -/** - * @package Text_Diff - * @author Geoffrey T. Dairiki <dairiki@dairiki.org> - * - * @access private - */ -class Text_Diff_Op_delete extends Text_Diff_Op { - - /** - * PHP5 constructor. - */ - function __construct( $lines ) - { - $this->orig = $lines; - $this->final = false; - } - - /** - * PHP4 constructor. - */ - public function Text_Diff_Op_delete( $lines ) { - self::__construct( $lines ); - } - - function &reverse() - { - $reverse = new Text_Diff_Op_add($this->orig); - return $reverse; - } - -} - -/** - * @package Text_Diff - * @author Geoffrey T. Dairiki <dairiki@dairiki.org> - * - * @access private - */ -class Text_Diff_Op_add extends Text_Diff_Op { - - /** - * PHP5 constructor. - */ - function __construct( $lines ) - { - $this->final = $lines; - $this->orig = false; - } - - /** - * PHP4 constructor. - */ - public function Text_Diff_Op_add( $lines ) { - self::__construct( $lines ); - } - - function &reverse() - { - $reverse = new Text_Diff_Op_delete($this->final); - return $reverse; - } - -} - -/** - * @package Text_Diff - * @author Geoffrey T. Dairiki <dairiki@dairiki.org> - * - * @access private - */ -class Text_Diff_Op_change extends Text_Diff_Op { - - /** - * PHP5 constructor. - */ - function __construct( $orig, $final ) - { - $this->orig = $orig; - $this->final = $final; - } - - /** - * PHP4 constructor. - */ - public function Text_Diff_Op_change( $orig, $final ) { - self::__construct( $orig, $final ); - } - - function &reverse() - { - $reverse = new Text_Diff_Op_change($this->final, $this->orig); - return $reverse; - } - -} diff --git a/wp/wp-includes/Text/Diff/Engine/native.php b/wp/wp-includes/Text/Diff/Engine/native.php deleted file mode 100644 index e908cfec..00000000 --- a/wp/wp-includes/Text/Diff/Engine/native.php +++ /dev/null @@ -1,436 +0,0 @@ -<?php -/** - * Class used internally by Text_Diff to actually compute the diffs. - * - * This class is implemented using native PHP code. - * - * The algorithm used here is mostly lifted from the perl module - * Algorithm::Diff (version 1.06) by Ned Konz, which is available at: - * http://www.perl.com/CPAN/authors/id/N/NE/NEDKONZ/Algorithm-Diff-1.06.zip - * - * More ideas are taken from: http://www.ics.uci.edu/~eppstein/161/960229.html - * - * Some ideas (and a bit of code) are taken from analyze.c, of GNU - * diffutils-2.7, which can be found at: - * ftp://gnudist.gnu.org/pub/gnu/diffutils/diffutils-2.7.tar.gz - * - * Some ideas (subdivision by NCHUNKS > 2, and some optimizations) are from - * Geoffrey T. Dairiki <dairiki@dairiki.org>. The original PHP version of this - * code was written by him, and is used/adapted with his permission. - * - * Copyright 2004-2010 The Horde Project (http://www.horde.org/) - * - * See the enclosed file COPYING for license information (LGPL). If you did - * not receive this file, see http://opensource.org/licenses/lgpl-license.php. - * - * @author Geoffrey T. Dairiki <dairiki@dairiki.org> - * @package Text_Diff - */ -class Text_Diff_Engine_native { - - function diff($from_lines, $to_lines) - { - array_walk($from_lines, array('Text_Diff', 'trimNewlines')); - array_walk($to_lines, array('Text_Diff', 'trimNewlines')); - - $n_from = count($from_lines); - $n_to = count($to_lines); - - $this->xchanged = $this->ychanged = array(); - $this->xv = $this->yv = array(); - $this->xind = $this->yind = array(); - unset($this->seq); - unset($this->in_seq); - unset($this->lcs); - - // Skip leading common lines. - for ($skip = 0; $skip < $n_from && $skip < $n_to; $skip++) { - if ($from_lines[$skip] !== $to_lines[$skip]) { - break; - } - $this->xchanged[$skip] = $this->ychanged[$skip] = false; - } - - // Skip trailing common lines. - $xi = $n_from; $yi = $n_to; - for ($endskip = 0; --$xi > $skip && --$yi > $skip; $endskip++) { - if ($from_lines[$xi] !== $to_lines[$yi]) { - break; - } - $this->xchanged[$xi] = $this->ychanged[$yi] = false; - } - - // Ignore lines which do not exist in both files. - for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { - $xhash[$from_lines[$xi]] = 1; - } - for ($yi = $skip; $yi < $n_to - $endskip; $yi++) { - $line = $to_lines[$yi]; - if (($this->ychanged[$yi] = empty($xhash[$line]))) { - continue; - } - $yhash[$line] = 1; - $this->yv[] = $line; - $this->yind[] = $yi; - } - for ($xi = $skip; $xi < $n_from - $endskip; $xi++) { - $line = $from_lines[$xi]; - if (($this->xchanged[$xi] = empty($yhash[$line]))) { - continue; - } - $this->xv[] = $line; - $this->xind[] = $xi; - } - - // Find the LCS. - $this->_compareseq(0, count($this->xv), 0, count($this->yv)); - - // Merge edits when possible. - $this->_shiftBoundaries($from_lines, $this->xchanged, $this->ychanged); - $this->_shiftBoundaries($to_lines, $this->ychanged, $this->xchanged); - - // Compute the edit operations. - $edits = array(); - $xi = $yi = 0; - while ($xi < $n_from || $yi < $n_to) { - assert($yi < $n_to || $this->xchanged[$xi]); - assert($xi < $n_from || $this->ychanged[$yi]); - - // Skip matching "snake". - $copy = array(); - while ($xi < $n_from && $yi < $n_to - && !$this->xchanged[$xi] && !$this->ychanged[$yi]) { - $copy[] = $from_lines[$xi++]; - ++$yi; - } - if ($copy) { - $edits[] = new Text_Diff_Op_copy($copy); - } - - // Find deletes & adds. - $delete = array(); - while ($xi < $n_from && $this->xchanged[$xi]) { - $delete[] = $from_lines[$xi++]; - } - - $add = array(); - while ($yi < $n_to && $this->ychanged[$yi]) { - $add[] = $to_lines[$yi++]; - } - - if ($delete && $add) { - $edits[] = new Text_Diff_Op_change($delete, $add); - } elseif ($delete) { - $edits[] = new Text_Diff_Op_delete($delete); - } elseif ($add) { - $edits[] = new Text_Diff_Op_add($add); - } - } - - return $edits; - } - - /** - * Divides the Largest Common Subsequence (LCS) of the sequences (XOFF, - * XLIM) and (YOFF, YLIM) into NCHUNKS approximately equally sized - * segments. - * - * Returns (LCS, PTS). LCS is the length of the LCS. PTS is an array of - * NCHUNKS+1 (X, Y) indexes giving the diving points between sub - * sequences. The first sub-sequence is contained in (X0, X1), (Y0, Y1), - * the second in (X1, X2), (Y1, Y2) and so on. Note that (X0, Y0) == - * (XOFF, YOFF) and (X[NCHUNKS], Y[NCHUNKS]) == (XLIM, YLIM). - * - * This function assumes that the first lines of the specified portions of - * the two files do not match, and likewise that the last lines do not - * match. The caller must trim matching lines from the beginning and end - * of the portions it is going to specify. - */ - function _diag ($xoff, $xlim, $yoff, $ylim, $nchunks) - { - $flip = false; - - if ($xlim - $xoff > $ylim - $yoff) { - /* Things seems faster (I'm not sure I understand why) when the - * shortest sequence is in X. */ - $flip = true; - list ($xoff, $xlim, $yoff, $ylim) - = array($yoff, $ylim, $xoff, $xlim); - } - - if ($flip) { - for ($i = $ylim - 1; $i >= $yoff; $i--) { - $ymatches[$this->xv[$i]][] = $i; - } - } else { - for ($i = $ylim - 1; $i >= $yoff; $i--) { - $ymatches[$this->yv[$i]][] = $i; - } - } - - $this->lcs = 0; - $this->seq[0]= $yoff - 1; - $this->in_seq = array(); - $ymids[0] = array(); - - $numer = $xlim - $xoff + $nchunks - 1; - $x = $xoff; - for ($chunk = 0; $chunk < $nchunks; $chunk++) { - if ($chunk > 0) { - for ($i = 0; $i <= $this->lcs; $i++) { - $ymids[$i][$chunk - 1] = $this->seq[$i]; - } - } - - $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $chunk) / $nchunks); - for (; $x < $x1; $x++) { - $line = $flip ? $this->yv[$x] : $this->xv[$x]; - if (empty($ymatches[$line])) { - continue; - } - $matches = $ymatches[$line]; - reset($matches); - while (list(, $y) = each($matches)) { - if (empty($this->in_seq[$y])) { - $k = $this->_lcsPos($y); - assert($k > 0); - $ymids[$k] = $ymids[$k - 1]; - break; - } - } - while (list(, $y) = each($matches)) { - if ($y > $this->seq[$k - 1]) { - assert($y <= $this->seq[$k]); - /* Optimization: this is a common case: next match is - * just replacing previous match. */ - $this->in_seq[$this->seq[$k]] = false; - $this->seq[$k] = $y; - $this->in_seq[$y] = 1; - } elseif (empty($this->in_seq[$y])) { - $k = $this->_lcsPos($y); - assert($k > 0); - $ymids[$k] = $ymids[$k - 1]; - } - } - } - } - - $seps[] = $flip ? array($yoff, $xoff) : array($xoff, $yoff); - $ymid = $ymids[$this->lcs]; - for ($n = 0; $n < $nchunks - 1; $n++) { - $x1 = $xoff + (int)(($numer + ($xlim - $xoff) * $n) / $nchunks); - $y1 = $ymid[$n] + 1; - $seps[] = $flip ? array($y1, $x1) : array($x1, $y1); - } - $seps[] = $flip ? array($ylim, $xlim) : array($xlim, $ylim); - - return array($this->lcs, $seps); - } - - function _lcsPos($ypos) - { - $end = $this->lcs; - if ($end == 0 || $ypos > $this->seq[$end]) { - $this->seq[++$this->lcs] = $ypos; - $this->in_seq[$ypos] = 1; - return $this->lcs; - } - - $beg = 1; - while ($beg < $end) { - $mid = (int)(($beg + $end) / 2); - if ($ypos > $this->seq[$mid]) { - $beg = $mid + 1; - } else { - $end = $mid; - } - } - - assert($ypos != $this->seq[$end]); - - $this->in_seq[$this->seq[$end]] = false; - $this->seq[$end] = $ypos; - $this->in_seq[$ypos] = 1; - return $end; - } - - /** - * Finds LCS of two sequences. - * - * The results are recorded in the vectors $this->{x,y}changed[], by - * storing a 1 in the element for each line that is an insertion or - * deletion (ie. is not in the LCS). - * - * The subsequence of file 0 is (XOFF, XLIM) and likewise for file 1. - * - * Note that XLIM, YLIM are exclusive bounds. All line numbers are - * origin-0 and discarded lines are not counted. - */ - function _compareseq ($xoff, $xlim, $yoff, $ylim) - { - /* Slide down the bottom initial diagonal. */ - while ($xoff < $xlim && $yoff < $ylim - && $this->xv[$xoff] == $this->yv[$yoff]) { - ++$xoff; - ++$yoff; - } - - /* Slide up the top initial diagonal. */ - while ($xlim > $xoff && $ylim > $yoff - && $this->xv[$xlim - 1] == $this->yv[$ylim - 1]) { - --$xlim; - --$ylim; - } - - if ($xoff == $xlim || $yoff == $ylim) { - $lcs = 0; - } else { - /* This is ad hoc but seems to work well. $nchunks = - * sqrt(min($xlim - $xoff, $ylim - $yoff) / 2.5); $nchunks = - * max(2,min(8,(int)$nchunks)); */ - $nchunks = min(7, $xlim - $xoff, $ylim - $yoff) + 1; - list($lcs, $seps) - = $this->_diag($xoff, $xlim, $yoff, $ylim, $nchunks); - } - - if ($lcs == 0) { - /* X and Y sequences have no common subsequence: mark all - * changed. */ - while ($yoff < $ylim) { - $this->ychanged[$this->yind[$yoff++]] = 1; - } - while ($xoff < $xlim) { - $this->xchanged[$this->xind[$xoff++]] = 1; - } - } else { - /* Use the partitions to split this problem into subproblems. */ - reset($seps); - $pt1 = $seps[0]; - while ($pt2 = next($seps)) { - $this->_compareseq ($pt1[0], $pt2[0], $pt1[1], $pt2[1]); - $pt1 = $pt2; - } - } - } - - /** - * Adjusts inserts/deletes of identical lines to join changes as much as - * possible. - * - * We do something when a run of changed lines include a line at one end - * and has an excluded, identical line at the other. We are free to - * choose which identical line is included. `compareseq' usually chooses - * the one at the beginning, but usually it is cleaner to consider the - * following identical line to be the "change". - * - * This is extracted verbatim from analyze.c (GNU diffutils-2.7). - */ - function _shiftBoundaries($lines, &$changed, $other_changed) - { - $i = 0; - $j = 0; - - assert('count($lines) == count($changed)'); - $len = count($lines); - $other_len = count($other_changed); - - while (1) { - /* Scan forward to find the beginning of another run of - * changes. Also keep track of the corresponding point in the - * other file. - * - * Throughout this code, $i and $j are adjusted together so that - * the first $i elements of $changed and the first $j elements of - * $other_changed both contain the same number of zeros (unchanged - * lines). - * - * Furthermore, $j is always kept so that $j == $other_len or - * $other_changed[$j] == false. */ - while ($j < $other_len && $other_changed[$j]) { - $j++; - } - - while ($i < $len && ! $changed[$i]) { - assert('$j < $other_len && ! $other_changed[$j]'); - $i++; $j++; - while ($j < $other_len && $other_changed[$j]) { - $j++; - } - } - - if ($i == $len) { - break; - } - - $start = $i; - - /* Find the end of this run of changes. */ - while (++$i < $len && $changed[$i]) { - continue; - } - - do { - /* Record the length of this run of changes, so that we can - * later determine whether the run has grown. */ - $runlength = $i - $start; - - /* Move the changed region back, so long as the previous - * unchanged line matches the last changed one. This merges - * with previous changed regions. */ - while ($start > 0 && $lines[$start - 1] == $lines[$i - 1]) { - $changed[--$start] = 1; - $changed[--$i] = false; - while ($start > 0 && $changed[$start - 1]) { - $start--; - } - assert('$j > 0'); - while ($other_changed[--$j]) { - continue; - } - assert('$j >= 0 && !$other_changed[$j]'); - } - - /* Set CORRESPONDING to the end of the changed run, at the - * last point where it corresponds to a changed run in the - * other file. CORRESPONDING == LEN means no such point has - * been found. */ - $corresponding = $j < $other_len ? $i : $len; - - /* Move the changed region forward, so long as the first - * changed line matches the following unchanged one. This - * merges with following changed regions. Do this second, so - * that if there are no merges, the changed region is moved - * forward as far as possible. */ - while ($i < $len && $lines[$start] == $lines[$i]) { - $changed[$start++] = false; - $changed[$i++] = 1; - while ($i < $len && $changed[$i]) { - $i++; - } - - assert('$j < $other_len && ! $other_changed[$j]'); - $j++; - if ($j < $other_len && $other_changed[$j]) { - $corresponding = $i; - while ($j < $other_len && $other_changed[$j]) { - $j++; - } - } - } - } while ($runlength != $i - $start); - - /* If possible, move the fully-merged run of changes back to a - * corresponding run in the other file. */ - while ($corresponding < $i) { - $changed[--$start] = 1; - $changed[--$i] = 0; - assert('$j > 0'); - while ($other_changed[--$j]) { - continue; - } - assert('$j >= 0 && !$other_changed[$j]'); - } - } - } - -} diff --git a/wp/wp-includes/Text/Diff/Engine/shell.php b/wp/wp-includes/Text/Diff/Engine/shell.php deleted file mode 100644 index faf38703..00000000 --- a/wp/wp-includes/Text/Diff/Engine/shell.php +++ /dev/null @@ -1,162 +0,0 @@ -<?php -/** - * Class used internally by Diff to actually compute the diffs. - * - * This class uses the Unix `diff` program via shell_exec to compute the - * differences between the two input arrays. - * - * Copyright 2007-2010 The Horde Project (http://www.horde.org/) - * - * See the enclosed file COPYING for license information (LGPL). If you did - * not receive this file, see http://opensource.org/licenses/lgpl-license.php. - * - * @author Milian Wolff <mail@milianw.de> - * @package Text_Diff - * @since 0.3.0 - */ -class Text_Diff_Engine_shell { - - /** - * Path to the diff executable - * - * @var string - */ - var $_diffCommand = 'diff'; - - /** - * Returns the array of differences. - * - * @param array $from_lines lines of text from old file - * @param array $to_lines lines of text from new file - * - * @return array all changes made (array with Text_Diff_Op_* objects) - */ - function diff($from_lines, $to_lines) - { - array_walk($from_lines, array('Text_Diff', 'trimNewlines')); - array_walk($to_lines, array('Text_Diff', 'trimNewlines')); - - $temp_dir = Text_Diff::_getTempDir(); - - // Execute gnu diff or similar to get a standard diff file. - $from_file = tempnam($temp_dir, 'Text_Diff'); - $to_file = tempnam($temp_dir, 'Text_Diff'); - $fp = fopen($from_file, 'w'); - fwrite($fp, implode("\n", $from_lines)); - fclose($fp); - $fp = fopen($to_file, 'w'); - fwrite($fp, implode("\n", $to_lines)); - fclose($fp); - $diff = shell_exec($this->_diffCommand . ' ' . $from_file . ' ' . $to_file); - unlink($from_file); - unlink($to_file); - - if (is_null($diff)) { - // No changes were made - return array(new Text_Diff_Op_copy($from_lines)); - } - - $from_line_no = 1; - $to_line_no = 1; - $edits = array(); - - // Get changed lines by parsing something like: - // 0a1,2 - // 1,2c4,6 - // 1,5d6 - preg_match_all('#^(\d+)(?:,(\d+))?([adc])(\d+)(?:,(\d+))?$#m', $diff, - $matches, PREG_SET_ORDER); - - foreach ($matches as $match) { - if (!isset($match[5])) { - // This paren is not set every time (see regex). - $match[5] = false; - } - - if ($match[3] == 'a') { - $from_line_no--; - } - - if ($match[3] == 'd') { - $to_line_no--; - } - - if ($from_line_no < $match[1] || $to_line_no < $match[4]) { - // copied lines - assert('$match[1] - $from_line_no == $match[4] - $to_line_no'); - array_push($edits, - new Text_Diff_Op_copy( - $this->_getLines($from_lines, $from_line_no, $match[1] - 1), - $this->_getLines($to_lines, $to_line_no, $match[4] - 1))); - } - - switch ($match[3]) { - case 'd': - // deleted lines - array_push($edits, - new Text_Diff_Op_delete( - $this->_getLines($from_lines, $from_line_no, $match[2]))); - $to_line_no++; - break; - - case 'c': - // changed lines - array_push($edits, - new Text_Diff_Op_change( - $this->_getLines($from_lines, $from_line_no, $match[2]), - $this->_getLines($to_lines, $to_line_no, $match[5]))); - break; - - case 'a': - // added lines - array_push($edits, - new Text_Diff_Op_add( - $this->_getLines($to_lines, $to_line_no, $match[5]))); - $from_line_no++; - break; - } - } - - if (!empty($from_lines)) { - // Some lines might still be pending. Add them as copied - array_push($edits, - new Text_Diff_Op_copy( - $this->_getLines($from_lines, $from_line_no, - $from_line_no + count($from_lines) - 1), - $this->_getLines($to_lines, $to_line_no, - $to_line_no + count($to_lines) - 1))); - } - - return $edits; - } - - /** - * Get lines from either the old or new text - * - * @access private - * - * @param array &$text_lines Either $from_lines or $to_lines - * @param int &$line_no Current line number - * @param int $end Optional end line, when we want to chop more - * than one line. - * - * @return array The chopped lines - */ - function _getLines(&$text_lines, &$line_no, $end = false) - { - if (!empty($end)) { - $lines = array(); - // We can shift even more - while ($line_no <= $end) { - array_push($lines, array_shift($text_lines)); - $line_no++; - } - } else { - $lines = array(array_shift($text_lines)); - $line_no++; - } - - return $lines; - } - -} diff --git a/wp/wp-includes/Text/Diff/Engine/string.php b/wp/wp-includes/Text/Diff/Engine/string.php deleted file mode 100644 index 76a11115..00000000 --- a/wp/wp-includes/Text/Diff/Engine/string.php +++ /dev/null @@ -1,248 +0,0 @@ -<?php -/** - * Parses unified or context diffs output from eg. the diff utility. - * - * Example: - * <code> - * $patch = file_get_contents('example.patch'); - * $diff = new Text_Diff('string', array($patch)); - * $renderer = new Text_Diff_Renderer_inline(); - * echo $renderer->render($diff); - * </code> - * - * Copyright 2005 Örjan Persson <o@42mm.org> - * Copyright 2005-2010 The Horde Project (http://www.horde.org/) - * - * See the enclosed file COPYING for license information (LGPL). If you did - * not receive this file, see http://opensource.org/licenses/lgpl-license.php. - * - * @author Örjan Persson <o@42mm.org> - * @package Text_Diff - * @since 0.2.0 - */ -class Text_Diff_Engine_string { - - /** - * Parses a unified or context diff. - * - * First param contains the whole diff and the second can be used to force - * a specific diff type. If the second parameter is 'autodetect', the - * diff will be examined to find out which type of diff this is. - * - * @param string $diff The diff content. - * @param string $mode The diff mode of the content in $diff. One of - * 'context', 'unified', or 'autodetect'. - * - * @return array List of all diff operations. - */ - function diff($diff, $mode = 'autodetect') - { - // Detect line breaks. - $lnbr = "\n"; - if (strpos($diff, "\r\n") !== false) { - $lnbr = "\r\n"; - } elseif (strpos($diff, "\r") !== false) { - $lnbr = "\r"; - } - - // Make sure we have a line break at the EOF. - if (substr($diff, -strlen($lnbr)) != $lnbr) { - $diff .= $lnbr; - } - - if ($mode != 'autodetect' && $mode != 'context' && $mode != 'unified') { - return PEAR::raiseError('Type of diff is unsupported'); - } - - if ($mode == 'autodetect') { - $context = strpos($diff, '***'); - $unified = strpos($diff, '---'); - if ($context === $unified) { - return PEAR::raiseError('Type of diff could not be detected'); - } elseif ($context === false || $unified === false) { - $mode = $context !== false ? 'context' : 'unified'; - } else { - $mode = $context < $unified ? 'context' : 'unified'; - } - } - - // Split by new line and remove the diff header, if there is one. - $diff = explode($lnbr, $diff); - if (($mode == 'context' && strpos($diff[0], '***') === 0) || - ($mode == 'unified' && strpos($diff[0], '---') === 0)) { - array_shift($diff); - array_shift($diff); - } - - if ($mode == 'context') { - return $this->parseContextDiff($diff); - } else { - return $this->parseUnifiedDiff($diff); - } - } - - /** - * Parses an array containing the unified diff. - * - * @param array $diff Array of lines. - * - * @return array List of all diff operations. - */ - function parseUnifiedDiff($diff) - { - $edits = array(); - $end = count($diff) - 1; - for ($i = 0; $i < $end;) { - $diff1 = array(); - switch (substr($diff[$i], 0, 1)) { - case ' ': - do { - $diff1[] = substr($diff[$i], 1); - } while (++$i < $end && substr($diff[$i], 0, 1) == ' '); - $edits[] = new Text_Diff_Op_copy($diff1); - break; - - case '+': - // get all new lines - do { - $diff1[] = substr($diff[$i], 1); - } while (++$i < $end && substr($diff[$i], 0, 1) == '+'); - $edits[] = new Text_Diff_Op_add($diff1); - break; - - case '-': - // get changed or removed lines - $diff2 = array(); - do { - $diff1[] = substr($diff[$i], 1); - } while (++$i < $end && substr($diff[$i], 0, 1) == '-'); - - while ($i < $end && substr($diff[$i], 0, 1) == '+') { - $diff2[] = substr($diff[$i++], 1); - } - if (count($diff2) == 0) { - $edits[] = new Text_Diff_Op_delete($diff1); - } else { - $edits[] = new Text_Diff_Op_change($diff1, $diff2); - } - break; - - default: - $i++; - break; - } - } - - return $edits; - } - - /** - * Parses an array containing the context diff. - * - * @param array $diff Array of lines. - * - * @return array List of all diff operations. - */ - function parseContextDiff(&$diff) - { - $edits = array(); - $i = $max_i = $j = $max_j = 0; - $end = count($diff) - 1; - while ($i < $end && $j < $end) { - while ($i >= $max_i && $j >= $max_j) { - // Find the boundaries of the diff output of the two files - for ($i = $j; - $i < $end && substr($diff[$i], 0, 3) == '***'; - $i++); - for ($max_i = $i; - $max_i < $end && substr($diff[$max_i], 0, 3) != '---'; - $max_i++); - for ($j = $max_i; - $j < $end && substr($diff[$j], 0, 3) == '---'; - $j++); - for ($max_j = $j; - $max_j < $end && substr($diff[$max_j], 0, 3) != '***'; - $max_j++); - } - - // find what hasn't been changed - $array = array(); - while ($i < $max_i && - $j < $max_j && - strcmp($diff[$i], $diff[$j]) == 0) { - $array[] = substr($diff[$i], 2); - $i++; - $j++; - } - - while ($i < $max_i && ($max_j-$j) <= 1) { - if ($diff[$i] != '' && substr($diff[$i], 0, 1) != ' ') { - break; - } - $array[] = substr($diff[$i++], 2); - } - - while ($j < $max_j && ($max_i-$i) <= 1) { - if ($diff[$j] != '' && substr($diff[$j], 0, 1) != ' ') { - break; - } - $array[] = substr($diff[$j++], 2); - } - if (count($array) > 0) { - $edits[] = new Text_Diff_Op_copy($array); - } - - if ($i < $max_i) { - $diff1 = array(); - switch (substr($diff[$i], 0, 1)) { - case '!': - $diff2 = array(); - do { - $diff1[] = substr($diff[$i], 2); - if ($j < $max_j && substr($diff[$j], 0, 1) == '!') { - $diff2[] = substr($diff[$j++], 2); - } - } while (++$i < $max_i && substr($diff[$i], 0, 1) == '!'); - $edits[] = new Text_Diff_Op_change($diff1, $diff2); - break; - - case '+': - do { - $diff1[] = substr($diff[$i], 2); - } while (++$i < $max_i && substr($diff[$i], 0, 1) == '+'); - $edits[] = new Text_Diff_Op_add($diff1); - break; - - case '-': - do { - $diff1[] = substr($diff[$i], 2); - } while (++$i < $max_i && substr($diff[$i], 0, 1) == '-'); - $edits[] = new Text_Diff_Op_delete($diff1); - break; - } - } - - if ($j < $max_j) { - $diff2 = array(); - switch (substr($diff[$j], 0, 1)) { - case '+': - do { - $diff2[] = substr($diff[$j++], 2); - } while ($j < $max_j && substr($diff[$j], 0, 1) == '+'); - $edits[] = new Text_Diff_Op_add($diff2); - break; - - case '-': - do { - $diff2[] = substr($diff[$j++], 2); - } while ($j < $max_j && substr($diff[$j], 0, 1) == '-'); - $edits[] = new Text_Diff_Op_delete($diff2); - break; - } - } - } - - return $edits; - } - -} diff --git a/wp/wp-includes/Text/Diff/Engine/xdiff.php b/wp/wp-includes/Text/Diff/Engine/xdiff.php deleted file mode 100644 index 02ce8480..00000000 --- a/wp/wp-includes/Text/Diff/Engine/xdiff.php +++ /dev/null @@ -1,64 +0,0 @@ -<?php -/** - * Class used internally by Diff to actually compute the diffs. - * - * This class uses the xdiff PECL package (http://pecl.php.net/package/xdiff) - * to compute the differences between the two input arrays. - * - * Copyright 2004-2010 The Horde Project (http://www.horde.org/) - * - * See the enclosed file COPYING for license information (LGPL). If you did - * not receive this file, see http://opensource.org/licenses/lgpl-license.php. - * - * @author Jon Parise <jon@horde.org> - * @package Text_Diff - */ -class Text_Diff_Engine_xdiff { - - /** - */ - function diff($from_lines, $to_lines) - { - array_walk($from_lines, array('Text_Diff', 'trimNewlines')); - array_walk($to_lines, array('Text_Diff', 'trimNewlines')); - - /* Convert the two input arrays into strings for xdiff processing. */ - $from_string = implode("\n", $from_lines); - $to_string = implode("\n", $to_lines); - - /* Diff the two strings and convert the result to an array. */ - $diff = xdiff_string_diff($from_string, $to_string, count($to_lines)); - $diff = explode("\n", $diff); - - /* Walk through the diff one line at a time. We build the $edits - * array of diff operations by reading the first character of the - * xdiff output (which is in the "unified diff" format). - * - * Note that we don't have enough information to detect "changed" - * lines using this approach, so we can't add Text_Diff_Op_changed - * instances to the $edits array. The result is still perfectly - * valid, albeit a little less descriptive and efficient. */ - $edits = array(); - foreach ($diff as $line) { - if (!strlen($line)) { - continue; - } - switch ($line[0]) { - case ' ': - $edits[] = new Text_Diff_Op_copy(array(substr($line, 1))); - break; - - case '+': - $edits[] = new Text_Diff_Op_add(array(substr($line, 1))); - break; - - case '-': - $edits[] = new Text_Diff_Op_delete(array(substr($line, 1))); - break; - } - } - - return $edits; - } - -} diff --git a/wp/wp-includes/Text/Diff/Renderer.php b/wp/wp-includes/Text/Diff/Renderer.php deleted file mode 100644 index 712d985a..00000000 --- a/wp/wp-includes/Text/Diff/Renderer.php +++ /dev/null @@ -1,242 +0,0 @@ -<?php -/** - * A class to render Diffs in different formats. - * - * This class renders the diff in classic diff format. It is intended that - * this class be customized via inheritance, to obtain fancier outputs. - * - * Copyright 2004-2010 The Horde Project (http://www.horde.org/) - * - * See the enclosed file COPYING for license information (LGPL). If you did - * not receive this file, see http://opensource.org/licenses/lgpl-license.php. - * - * @package Text_Diff - */ -class Text_Diff_Renderer { - - /** - * Number of leading context "lines" to preserve. - * - * This should be left at zero for this class, but subclasses may want to - * set this to other values. - */ - var $_leading_context_lines = 0; - - /** - * Number of trailing context "lines" to preserve. - * - * This should be left at zero for this class, but subclasses may want to - * set this to other values. - */ - var $_trailing_context_lines = 0; - - /** - * Constructor. - */ - function __construct( $params = array() ) - { - foreach ($params as $param => $value) { - $v = '_' . $param; - if (isset($this->$v)) { - $this->$v = $value; - } - } - } - - /** - * PHP4 constructor. - */ - public function Text_Diff_Renderer( $params = array() ) { - self::__construct( $params ); - } - - /** - * Get any renderer parameters. - * - * @return array All parameters of this renderer object. - */ - function getParams() - { - $params = array(); - foreach (get_object_vars($this) as $k => $v) { - if ($k[0] == '_') { - $params[substr($k, 1)] = $v; - } - } - - return $params; - } - - /** - * Renders a diff. - * - * @param Text_Diff $diff A Text_Diff object. - * - * @return string The formatted output. - */ - function render($diff) - { - $xi = $yi = 1; - $block = false; - $context = array(); - - $nlead = $this->_leading_context_lines; - $ntrail = $this->_trailing_context_lines; - - $output = $this->_startDiff(); - - $diffs = $diff->getDiff(); - foreach ($diffs as $i => $edit) { - /* If these are unchanged (copied) lines, and we want to keep - * leading or trailing context lines, extract them from the copy - * block. */ - if (is_a($edit, 'Text_Diff_Op_copy')) { - /* Do we have any diff blocks yet? */ - if (is_array($block)) { - /* How many lines to keep as context from the copy - * block. */ - $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; - } else { - if ($ntrail) { - /* Create a new block with as many lines as we need - * for the trailing context. */ - $context = array_slice($edit->orig, 0, $ntrail); - $block[] = new Text_Diff_Op_copy($context); - } - /* @todo */ - $output .= $this->_block($x0, $ntrail + $xi - $x0, - $y0, $ntrail + $yi - $y0, - $block); - $block = false; - } - } - /* Keep the copy block as the context for the next block. */ - $context = $edit->orig; - } else { - /* Don't we have any diff blocks yet? */ - if (!is_array($block)) { - /* Extract context lines from the preceding copy block. */ - $context = array_slice($context, count($context) - $nlead); - $x0 = $xi - count($context); - $y0 = $yi - count($context); - $block = array(); - if ($context) { - $block[] = new Text_Diff_Op_copy($context); - } - } - $block[] = $edit; - } - - if ($edit->orig) { - $xi += count($edit->orig); - } - if ($edit->final) { - $yi += count($edit->final); - } - } - - if (is_array($block)) { - $output .= $this->_block($x0, $xi - $x0, - $y0, $yi - $y0, - $block); - } - - return $output . $this->_endDiff(); - } - - function _block($xbeg, $xlen, $ybeg, $ylen, &$edits) - { - $output = $this->_startBlock($this->_blockHeader($xbeg, $xlen, $ybeg, $ylen)); - - foreach ($edits as $edit) { - switch (strtolower(get_class($edit))) { - case 'text_diff_op_copy': - $output .= $this->_context($edit->orig); - break; - - case 'text_diff_op_add': - $output .= $this->_added($edit->final); - break; - - case 'text_diff_op_delete': - $output .= $this->_deleted($edit->orig); - break; - - case 'text_diff_op_change': - $output .= $this->_changed($edit->orig, $edit->final); - break; - } - } - - return $output . $this->_endBlock(); - } - - function _startDiff() - { - return ''; - } - - function _endDiff() - { - return ''; - } - - function _blockHeader($xbeg, $xlen, $ybeg, $ylen) - { - if ($xlen > 1) { - $xbeg .= ',' . ($xbeg + $xlen - 1); - } - if ($ylen > 1) { - $ybeg .= ',' . ($ybeg + $ylen - 1); - } - - // this matches the GNU Diff behaviour - if ($xlen && !$ylen) { - $ybeg--; - } elseif (!$xlen) { - $xbeg--; - } - - return $xbeg . ($xlen ? ($ylen ? 'c' : 'd') : 'a') . $ybeg; - } - - function _startBlock($header) - { - return $header . "\n"; - } - - function _endBlock() - { - return ''; - } - - function _lines($lines, $prefix = ' ') - { - return $prefix . implode("\n$prefix", $lines) . "\n"; - } - - function _context($lines) - { - return $this->_lines($lines, ' '); - } - - function _added($lines) - { - return $this->_lines($lines, '> '); - } - - function _deleted($lines) - { - return $this->_lines($lines, '< '); - } - - function _changed($orig, $final) - { - return $this->_deleted($orig) . "---\n" . $this->_added($final); - } - -} diff --git a/wp/wp-includes/Text/Diff/Renderer/inline.php b/wp/wp-includes/Text/Diff/Renderer/inline.php deleted file mode 100644 index 392bd57c..00000000 --- a/wp/wp-includes/Text/Diff/Renderer/inline.php +++ /dev/null @@ -1,206 +0,0 @@ -<?php -/** - * "Inline" diff renderer. - * - * Copyright 2004-2010 The Horde Project (http://www.horde.org/) - * - * See the enclosed file COPYING for license information (LGPL). If you did - * not receive this file, see http://opensource.org/licenses/lgpl-license.php. - * - * @author Ciprian Popovici - * @package Text_Diff - */ - -/** Text_Diff_Renderer */ - -// WP #7391 -require_once dirname(dirname(__FILE__)) . '/Renderer.php'; - -/** - * "Inline" diff renderer. - * - * This class renders diffs in the Wiki-style "inline" format. - * - * @author Ciprian Popovici - * @package Text_Diff - */ -class Text_Diff_Renderer_inline extends Text_Diff_Renderer { - - /** - * Number of leading context "lines" to preserve. - * - * @var integer - */ - var $_leading_context_lines = 10000; - - /** - * Number of trailing context "lines" to preserve. - * - * @var integer - */ - var $_trailing_context_lines = 10000; - - /** - * Prefix for inserted text. - * - * @var string - */ - var $_ins_prefix = '<ins>'; - - /** - * Suffix for inserted text. - * - * @var string - */ - var $_ins_suffix = '</ins>'; - - /** - * Prefix for deleted text. - * - * @var string - */ - var $_del_prefix = '<del>'; - - /** - * Suffix for deleted text. - * - * @var string - */ - var $_del_suffix = '</del>'; - - /** - * Header for each change block. - * - * @var string - */ - var $_block_header = ''; - - /** - * Whether to split down to character-level. - * - * @var boolean - */ - var $_split_characters = false; - - /** - * What are we currently splitting on? Used to recurse to show word-level - * or character-level changes. - * - * @var string - */ - var $_split_level = 'lines'; - - function _blockHeader($xbeg, $xlen, $ybeg, $ylen) - { - return $this->_block_header; - } - - function _startBlock($header) - { - return $header; - } - - function _lines($lines, $prefix = ' ', $encode = true) - { - if ($encode) { - array_walk($lines, array(&$this, '_encode')); - } - - if ($this->_split_level == 'lines') { - return implode("\n", $lines) . "\n"; - } else { - return implode('', $lines); - } - } - - function _added($lines) - { - array_walk($lines, array(&$this, '_encode')); - $lines[0] = $this->_ins_prefix . $lines[0]; - $lines[count($lines) - 1] .= $this->_ins_suffix; - return $this->_lines($lines, ' ', false); - } - - function _deleted($lines, $words = false) - { - array_walk($lines, array(&$this, '_encode')); - $lines[0] = $this->_del_prefix . $lines[0]; - $lines[count($lines) - 1] .= $this->_del_suffix; - return $this->_lines($lines, ' ', false); - } - - function _changed($orig, $final) - { - /* If we've already split on characters, just display. */ - if ($this->_split_level == 'characters') { - return $this->_deleted($orig) - . $this->_added($final); - } - - /* If we've already split on words, just display. */ - if ($this->_split_level == 'words') { - $prefix = ''; - while ($orig[0] !== false && $final[0] !== false && - substr($orig[0], 0, 1) == ' ' && - substr($final[0], 0, 1) == ' ') { - $prefix .= substr($orig[0], 0, 1); - $orig[0] = substr($orig[0], 1); - $final[0] = substr($final[0], 1); - } - return $prefix . $this->_deleted($orig) . $this->_added($final); - } - - $text1 = implode("\n", $orig); - $text2 = implode("\n", $final); - - /* Non-printing newline marker. */ - $nl = "\0"; - - if ($this->_split_characters) { - $diff = new Text_Diff('native', - array(preg_split('//', $text1), - preg_split('//', $text2))); - } else { - /* We want to split on word boundaries, but we need to preserve - * whitespace as well. Therefore we split on words, but include - * all blocks of whitespace in the wordlist. */ - $diff = new Text_Diff('native', - array($this->_splitOnWords($text1, $nl), - $this->_splitOnWords($text2, $nl))); - } - - /* Get the diff in inline format. */ - $renderer = new Text_Diff_Renderer_inline - (array_merge($this->getParams(), - array('split_level' => $this->_split_characters ? 'characters' : 'words'))); - - /* Run the diff and get the output. */ - return str_replace($nl, "\n", $renderer->render($diff)) . "\n"; - } - - function _splitOnWords($string, $newlineEscape = "\n") - { - // Ignore \0; otherwise the while loop will never finish. - $string = str_replace("\0", '', $string); - - $words = array(); - $length = strlen($string); - $pos = 0; - - while ($pos < $length) { - // Eat a word with any preceding whitespace. - $spaces = strspn(substr($string, $pos), " \n"); - $nextpos = strcspn(substr($string, $pos + $spaces), " \n"); - $words[] = str_replace("\n", $newlineEscape, substr($string, $pos, $spaces + $nextpos)); - $pos += $spaces + $nextpos; - } - - return $words; - } - - function _encode(&$string) - { - $string = htmlspecialchars($string); - } - -} diff --git a/wp/wp-includes/admin-bar.php b/wp/wp-includes/admin-bar.php deleted file mode 100644 index 83deb960..00000000 --- a/wp/wp-includes/admin-bar.php +++ /dev/null @@ -1,1005 +0,0 @@ -<?php -/** - * Toolbar API: Top-level Toolbar functionality - * - * @package WordPress - * @subpackage Toolbar - * @since 3.1.0 - */ - -/** - * Instantiate the admin bar object and set it up as a global for access elsewhere. - * - * UNHOOKING THIS FUNCTION WILL NOT PROPERLY REMOVE THE ADMIN BAR. - * For that, use show_admin_bar(false) or the {@see 'show_admin_bar'} filter. - * - * @since 3.1.0 - * @access private - * - * @global WP_Admin_Bar $wp_admin_bar - * - * @return bool Whether the admin bar was successfully initialized. - */ -function _wp_admin_bar_init() { - global $wp_admin_bar; - - if ( ! is_admin_bar_showing() ) - return false; - - /* Load the admin bar class code ready for instantiation */ - require_once( ABSPATH . WPINC . '/class-wp-admin-bar.php' ); - - /* Instantiate the admin bar */ - - /** - * Filters the admin bar class to instantiate. - * - * @since 3.1.0 - * - * @param string $wp_admin_bar_class Admin bar class to use. Default 'WP_Admin_Bar'. - */ - $admin_bar_class = apply_filters( 'wp_admin_bar_class', 'WP_Admin_Bar' ); - if ( class_exists( $admin_bar_class ) ) - $wp_admin_bar = new $admin_bar_class; - else - return false; - - $wp_admin_bar->initialize(); - $wp_admin_bar->add_menus(); - - return true; -} - -/** - * Renders the admin bar to the page based on the $wp_admin_bar->menu member var. - * - * This is called very late on the footer actions so that it will render after - * anything else being added to the footer. - * - * It includes the {@see 'admin_bar_menu'} action which should be used to hook in and - * add new menus to the admin bar. That way you can be sure that you are adding at most - * optimal point, right before the admin bar is rendered. This also gives you access to - * the `$post` global, among others. - * - * @since 3.1.0 - * - * @global WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_render() { - global $wp_admin_bar; - - if ( ! is_admin_bar_showing() || ! is_object( $wp_admin_bar ) ) - return; - - /** - * Load all necessary admin bar items. - * - * This is the hook used to add, remove, or manipulate admin bar items. - * - * @since 3.1.0 - * - * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance, passed by reference - */ - do_action_ref_array( 'admin_bar_menu', array( &$wp_admin_bar ) ); - - /** - * Fires before the admin bar is rendered. - * - * @since 3.1.0 - */ - do_action( 'wp_before_admin_bar_render' ); - - $wp_admin_bar->render(); - - /** - * Fires after the admin bar is rendered. - * - * @since 3.1.0 - */ - do_action( 'wp_after_admin_bar_render' ); -} - -/** - * Add the WordPress logo menu. - * - * @since 3.3.0 - * - * @param WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_wp_menu( $wp_admin_bar ) { - if ( current_user_can( 'read' ) ) { - $about_url = self_admin_url( 'about.php' ); - } elseif ( is_multisite() ) { - $about_url = get_dashboard_url( get_current_user_id(), 'about.php' ); - } else { - $about_url = false; - } - - $wp_logo_menu_args = array( - 'id' => 'wp-logo', - 'title' => '<span class="ab-icon"></span><span class="screen-reader-text">' . __( 'About WordPress' ) . '</span>', - 'href' => $about_url, - ); - - // Set tabindex="0" to make sub menus accessible when no URL is available. - if ( ! $about_url ) { - $wp_logo_menu_args['meta'] = array( - 'tabindex' => 0, - ); - } - - $wp_admin_bar->add_menu( $wp_logo_menu_args ); - - if ( $about_url ) { - // Add "About WordPress" link - $wp_admin_bar->add_menu( array( - 'parent' => 'wp-logo', - 'id' => 'about', - 'title' => __('About WordPress'), - 'href' => $about_url, - ) ); - } - - // Add WordPress.org link - $wp_admin_bar->add_menu( array( - 'parent' => 'wp-logo-external', - 'id' => 'wporg', - 'title' => __('WordPress.org'), - 'href' => __('https://wordpress.org/'), - ) ); - - // Add codex link - $wp_admin_bar->add_menu( array( - 'parent' => 'wp-logo-external', - 'id' => 'documentation', - 'title' => __('Documentation'), - 'href' => __('https://codex.wordpress.org/'), - ) ); - - // Add forums link - $wp_admin_bar->add_menu( array( - 'parent' => 'wp-logo-external', - 'id' => 'support-forums', - 'title' => __('Support Forums'), - 'href' => __('https://wordpress.org/support/'), - ) ); - - // Add feedback link - $wp_admin_bar->add_menu( array( - 'parent' => 'wp-logo-external', - 'id' => 'feedback', - 'title' => __('Feedback'), - 'href' => __('https://wordpress.org/support/forum/requests-and-feedback'), - ) ); -} - -/** - * Add the sidebar toggle button. - * - * @since 3.8.0 - * - * @param WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_sidebar_toggle( $wp_admin_bar ) { - if ( is_admin() ) { - $wp_admin_bar->add_menu( array( - 'id' => 'menu-toggle', - 'title' => '<span class="ab-icon"></span><span class="screen-reader-text">' . __( 'Menu' ) . '</span>', - 'href' => '#', - ) ); - } -} - -/** - * Add the "My Account" item. - * - * @since 3.3.0 - * - * @param WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_my_account_item( $wp_admin_bar ) { - $user_id = get_current_user_id(); - $current_user = wp_get_current_user(); - - if ( ! $user_id ) - return; - - if ( current_user_can( 'read' ) ) { - $profile_url = get_edit_profile_url( $user_id ); - } elseif ( is_multisite() ) { - $profile_url = get_dashboard_url( $user_id, 'profile.php' ); - } else { - $profile_url = false; - } - - $avatar = get_avatar( $user_id, 26 ); - /* translators: %s: current user's display name */ - $howdy = sprintf( __( 'Howdy, %s' ), $current_user->display_name ); - $class = empty( $avatar ) ? '' : 'with-avatar'; - - $wp_admin_bar->add_menu( array( - 'id' => 'my-account', - 'parent' => 'top-secondary', - 'title' => $howdy . $avatar, - 'href' => $profile_url, - 'meta' => array( - 'class' => $class, - ), - ) ); -} - -/** - * Add the "My Account" submenu items. - * - * @since 3.1.0 - * - * @param WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_my_account_menu( $wp_admin_bar ) { - $user_id = get_current_user_id(); - $current_user = wp_get_current_user(); - - if ( ! $user_id ) - return; - - if ( current_user_can( 'read' ) ) { - $profile_url = get_edit_profile_url( $user_id ); - } elseif ( is_multisite() ) { - $profile_url = get_dashboard_url( $user_id, 'profile.php' ); - } else { - $profile_url = false; - } - - $wp_admin_bar->add_group( array( - 'parent' => 'my-account', - 'id' => 'user-actions', - ) ); - - $user_info = get_avatar( $user_id, 64 ); - $user_info .= "<span class='display-name'>{$current_user->display_name}</span>"; - - if ( $current_user->display_name !== $current_user->user_login ) - $user_info .= "<span class='username'>{$current_user->user_login}</span>"; - - $wp_admin_bar->add_menu( array( - 'parent' => 'user-actions', - 'id' => 'user-info', - 'title' => $user_info, - 'href' => $profile_url, - 'meta' => array( - 'tabindex' => -1, - ), - ) ); - - if ( false !== $profile_url ) { - $wp_admin_bar->add_menu( array( - 'parent' => 'user-actions', - 'id' => 'edit-profile', - 'title' => __( 'Edit My Profile' ), - 'href' => $profile_url, - ) ); - } - - $wp_admin_bar->add_menu( array( - 'parent' => 'user-actions', - 'id' => 'logout', - 'title' => __( 'Log Out' ), - 'href' => wp_logout_url(), - ) ); -} - -/** - * Add the "Site Name" menu. - * - * @since 3.3.0 - * - * @param WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_site_menu( $wp_admin_bar ) { - // Don't show for logged out users. - if ( ! is_user_logged_in() ) - return; - - // Show only when the user is a member of this site, or they're a super admin. - if ( ! is_user_member_of_blog() && ! is_super_admin() ) - return; - - $blogname = get_bloginfo('name'); - - if ( ! $blogname ) { - $blogname = preg_replace( '#^(https?://)?(www.)?#', '', get_home_url() ); - } - - if ( is_network_admin() ) { - /* translators: %s: site name */ - $blogname = sprintf( __( 'Network Admin: %s' ), esc_html( get_network()->site_name ) ); - } elseif ( is_user_admin() ) { - /* translators: %s: site name */ - $blogname = sprintf( __( 'User Dashboard: %s' ), esc_html( get_network()->site_name ) ); - } - - $title = wp_html_excerpt( $blogname, 40, '…' ); - - $wp_admin_bar->add_menu( array( - 'id' => 'site-name', - 'title' => $title, - 'href' => ( is_admin() || ! current_user_can( 'read' ) ) ? home_url( '/' ) : admin_url(), - ) ); - - // Create submenu items. - - if ( is_admin() ) { - // Add an option to visit the site. - $wp_admin_bar->add_menu( array( - 'parent' => 'site-name', - 'id' => 'view-site', - 'title' => __( 'Visit Site' ), - 'href' => home_url( '/' ), - ) ); - - if ( is_blog_admin() && is_multisite() && current_user_can( 'manage_sites' ) ) { - $wp_admin_bar->add_menu( array( - 'parent' => 'site-name', - 'id' => 'edit-site', - 'title' => __( 'Edit Site' ), - 'href' => network_admin_url( 'site-info.php?id=' . get_current_blog_id() ), - ) ); - } - - } else if ( current_user_can( 'read' ) ) { - // We're on the front end, link to the Dashboard. - $wp_admin_bar->add_menu( array( - 'parent' => 'site-name', - 'id' => 'dashboard', - 'title' => __( 'Dashboard' ), - 'href' => admin_url(), - ) ); - - // Add the appearance submenu items. - wp_admin_bar_appearance_menu( $wp_admin_bar ); - } -} - -/** - * Adds the "Customize" link to the Toolbar. - * - * @since 4.3.0 - * - * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance. - * @global WP_Customize_Manager $wp_customize - */ -function wp_admin_bar_customize_menu( $wp_admin_bar ) { - global $wp_customize; - - // Don't show for users who can't access the customizer or when in the admin. - if ( ! current_user_can( 'customize' ) || is_admin() ) { - return; - } - - // Don't show if the user cannot edit a given customize_changeset post currently being previewed. - if ( is_customize_preview() && $wp_customize->changeset_post_id() && ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $wp_customize->changeset_post_id() ) ) { - return; - } - - $current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; - if ( is_customize_preview() && $wp_customize->changeset_uuid() ) { - $current_url = remove_query_arg( 'customize_changeset_uuid', $current_url ); - } - - $customize_url = add_query_arg( 'url', urlencode( $current_url ), wp_customize_url() ); - if ( is_customize_preview() ) { - $customize_url = add_query_arg( array( 'changeset_uuid' => $wp_customize->changeset_uuid() ), $customize_url ); - } - - $wp_admin_bar->add_menu( array( - 'id' => 'customize', - 'title' => __( 'Customize' ), - 'href' => $customize_url, - 'meta' => array( - 'class' => 'hide-if-no-customize', - ), - ) ); - add_action( 'wp_before_admin_bar_render', 'wp_customize_support_script' ); -} - -/** - * Add the "My Sites/[Site Name]" menu and all submenus. - * - * @since 3.1.0 - * - * @param WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_my_sites_menu( $wp_admin_bar ) { - // Don't show for logged out users or single site mode. - if ( ! is_user_logged_in() || ! is_multisite() ) - return; - - // Show only when the user has at least one site, or they're a super admin. - if ( count( $wp_admin_bar->user->blogs ) < 1 && ! is_super_admin() ) - return; - - if ( $wp_admin_bar->user->active_blog ) { - $my_sites_url = get_admin_url( $wp_admin_bar->user->active_blog->blog_id, 'my-sites.php' ); - } else { - $my_sites_url = admin_url( 'my-sites.php' ); - } - - $wp_admin_bar->add_menu( array( - 'id' => 'my-sites', - 'title' => __( 'My Sites' ), - 'href' => $my_sites_url, - ) ); - - if ( is_super_admin() ) { - $wp_admin_bar->add_group( array( - 'parent' => 'my-sites', - 'id' => 'my-sites-super-admin', - ) ); - - $wp_admin_bar->add_menu( array( - 'parent' => 'my-sites-super-admin', - 'id' => 'network-admin', - 'title' => __('Network Admin'), - 'href' => network_admin_url(), - ) ); - - $wp_admin_bar->add_menu( array( - 'parent' => 'network-admin', - 'id' => 'network-admin-d', - 'title' => __( 'Dashboard' ), - 'href' => network_admin_url(), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'network-admin', - 'id' => 'network-admin-s', - 'title' => __( 'Sites' ), - 'href' => network_admin_url( 'sites.php' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'network-admin', - 'id' => 'network-admin-u', - 'title' => __( 'Users' ), - 'href' => network_admin_url( 'users.php' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'network-admin', - 'id' => 'network-admin-t', - 'title' => __( 'Themes' ), - 'href' => network_admin_url( 'themes.php' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'network-admin', - 'id' => 'network-admin-p', - 'title' => __( 'Plugins' ), - 'href' => network_admin_url( 'plugins.php' ), - ) ); - $wp_admin_bar->add_menu( array( - 'parent' => 'network-admin', - 'id' => 'network-admin-o', - 'title' => __( 'Settings' ), - 'href' => network_admin_url( 'settings.php' ), - ) ); - } - - // Add site links - $wp_admin_bar->add_group( array( - 'parent' => 'my-sites', - 'id' => 'my-sites-list', - 'meta' => array( - 'class' => is_super_admin() ? 'ab-sub-secondary' : '', - ), - ) ); - - foreach ( (array) $wp_admin_bar->user->blogs as $blog ) { - switch_to_blog( $blog->userblog_id ); - - $blavatar = '<div class="blavatar"></div>'; - - $blogname = $blog->blogname; - - if ( ! $blogname ) { - $blogname = preg_replace( '#^(https?://)?(www.)?#', '', get_home_url() ); - } - - $menu_id = 'blog-' . $blog->userblog_id; - - $wp_admin_bar->add_menu( array( - 'parent' => 'my-sites-list', - 'id' => $menu_id, - 'title' => $blavatar . $blogname, - 'href' => admin_url(), - ) ); - - $wp_admin_bar->add_menu( array( - 'parent' => $menu_id, - 'id' => $menu_id . '-d', - 'title' => __( 'Dashboard' ), - 'href' => admin_url(), - ) ); - - if ( current_user_can( get_post_type_object( 'post' )->cap->create_posts ) ) { - $wp_admin_bar->add_menu( array( - 'parent' => $menu_id, - 'id' => $menu_id . '-n', - 'title' => __( 'New Post' ), - 'href' => admin_url( 'post-new.php' ), - ) ); - } - - if ( current_user_can( 'edit_posts' ) ) { - $wp_admin_bar->add_menu( array( - 'parent' => $menu_id, - 'id' => $menu_id . '-c', - 'title' => __( 'Manage Comments' ), - 'href' => admin_url( 'edit-comments.php' ), - ) ); - } - - $wp_admin_bar->add_menu( array( - 'parent' => $menu_id, - 'id' => $menu_id . '-v', - 'title' => __( 'Visit Site' ), - 'href' => home_url( '/' ), - ) ); - - restore_current_blog(); - } -} - -/** - * Provide a shortlink. - * - * @since 3.1.0 - * - * @param WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_shortlink_menu( $wp_admin_bar ) { - $short = wp_get_shortlink( 0, 'query' ); - $id = 'get-shortlink'; - - if ( empty( $short ) ) - return; - - $html = '<input class="shortlink-input" type="text" readonly="readonly" value="' . esc_attr( $short ) . '" />'; - - $wp_admin_bar->add_menu( array( - 'id' => $id, - 'title' => __( 'Shortlink' ), - 'href' => $short, - 'meta' => array( 'html' => $html ), - ) ); -} - -/** - * Provide an edit link for posts and terms. - * - * @since 3.1.0 - * - * @global WP_Term $tag - * @global WP_Query $wp_the_query - * - * @param WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_edit_menu( $wp_admin_bar ) { - global $tag, $wp_the_query; - - if ( is_admin() ) { - $current_screen = get_current_screen(); - $post = get_post(); - - if ( 'post' == $current_screen->base - && 'add' != $current_screen->action - && ( $post_type_object = get_post_type_object( $post->post_type ) ) - && current_user_can( 'read_post', $post->ID ) - && ( $post_type_object->public ) - && ( $post_type_object->show_in_admin_bar ) ) - { - if ( 'draft' == $post->post_status ) { - $preview_link = get_preview_post_link( $post ); - $wp_admin_bar->add_menu( array( - 'id' => 'preview', - 'title' => $post_type_object->labels->view_item, - 'href' => esc_url( $preview_link ), - 'meta' => array( 'target' => 'wp-preview-' . $post->ID ), - ) ); - } else { - $wp_admin_bar->add_menu( array( - 'id' => 'view', - 'title' => $post_type_object->labels->view_item, - 'href' => get_permalink( $post->ID ) - ) ); - } - } elseif ( 'edit' == $current_screen->base - && ( $post_type_object = get_post_type_object( $current_screen->post_type ) ) - && ( $post_type_object->public ) - && ( $post_type_object->show_in_admin_bar ) - && ( get_post_type_archive_link( $post_type_object->name ) ) - && ! ( 'post' === $post_type_object->name && 'posts' === get_option( 'show_on_front' ) ) ) - { - $wp_admin_bar->add_node( array( - 'id' => 'archive', - 'title' => $post_type_object->labels->view_items, - 'href' => get_post_type_archive_link( $current_screen->post_type ) - ) ); - } elseif ( 'term' == $current_screen->base - && isset( $tag ) && is_object( $tag ) && ! is_wp_error( $tag ) - && ( $tax = get_taxonomy( $tag->taxonomy ) ) - && $tax->public ) - { - $wp_admin_bar->add_menu( array( - 'id' => 'view', - 'title' => $tax->labels->view_item, - 'href' => get_term_link( $tag ) - ) ); - } - } else { - $current_object = $wp_the_query->get_queried_object(); - - if ( empty( $current_object ) ) - return; - - if ( ! empty( $current_object->post_type ) - && ( $post_type_object = get_post_type_object( $current_object->post_type ) ) - && current_user_can( 'edit_post', $current_object->ID ) - && $post_type_object->show_in_admin_bar - && $edit_post_link = get_edit_post_link( $current_object->ID ) ) - { - $wp_admin_bar->add_menu( array( - 'id' => 'edit', - 'title' => $post_type_object->labels->edit_item, - 'href' => $edit_post_link - ) ); - } elseif ( ! empty( $current_object->taxonomy ) - && ( $tax = get_taxonomy( $current_object->taxonomy ) ) - && current_user_can( 'edit_term', $current_object->term_id ) - && $edit_term_link = get_edit_term_link( $current_object->term_id, $current_object->taxonomy ) ) - { - $wp_admin_bar->add_menu( array( - 'id' => 'edit', - 'title' => $tax->labels->edit_item, - 'href' => $edit_term_link - ) ); - } - } -} - -/** - * Add "Add New" menu. - * - * @since 3.1.0 - * - * @param WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_new_content_menu( $wp_admin_bar ) { - $actions = array(); - - $cpts = (array) get_post_types( array( 'show_in_admin_bar' => true ), 'objects' ); - - if ( isset( $cpts['post'] ) && current_user_can( $cpts['post']->cap->create_posts ) ) - $actions[ 'post-new.php' ] = array( $cpts['post']->labels->name_admin_bar, 'new-post' ); - - if ( isset( $cpts['attachment'] ) && current_user_can( 'upload_files' ) ) - $actions[ 'media-new.php' ] = array( $cpts['attachment']->labels->name_admin_bar, 'new-media' ); - - if ( current_user_can( 'manage_links' ) ) - $actions[ 'link-add.php' ] = array( _x( 'Link', 'add new from admin bar' ), 'new-link' ); - - if ( isset( $cpts['page'] ) && current_user_can( $cpts['page']->cap->create_posts ) ) - $actions[ 'post-new.php?post_type=page' ] = array( $cpts['page']->labels->name_admin_bar, 'new-page' ); - - unset( $cpts['post'], $cpts['page'], $cpts['attachment'] ); - - // Add any additional custom post types. - foreach ( $cpts as $cpt ) { - if ( ! current_user_can( $cpt->cap->create_posts ) ) - continue; - - $key = 'post-new.php?post_type=' . $cpt->name; - $actions[ $key ] = array( $cpt->labels->name_admin_bar, 'new-' . $cpt->name ); - } - // Avoid clash with parent node and a 'content' post type. - if ( isset( $actions['post-new.php?post_type=content'] ) ) - $actions['post-new.php?post_type=content'][1] = 'add-new-content'; - - if ( current_user_can( 'create_users' ) || current_user_can( 'promote_users' ) ) - $actions[ 'user-new.php' ] = array( _x( 'User', 'add new from admin bar' ), 'new-user' ); - - if ( ! $actions ) - return; - - $title = '<span class="ab-icon"></span><span class="ab-label">' . _x( 'New', 'admin bar menu group label' ) . '</span>'; - - $wp_admin_bar->add_menu( array( - 'id' => 'new-content', - 'title' => $title, - 'href' => admin_url( current( array_keys( $actions ) ) ), - ) ); - - foreach ( $actions as $link => $action ) { - list( $title, $id ) = $action; - - $wp_admin_bar->add_menu( array( - 'parent' => 'new-content', - 'id' => $id, - 'title' => $title, - 'href' => admin_url( $link ) - ) ); - } -} - -/** - * Add edit comments link with awaiting moderation count bubble. - * - * @since 3.1.0 - * - * @param WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_comments_menu( $wp_admin_bar ) { - if ( !current_user_can('edit_posts') ) - return; - - $awaiting_mod = wp_count_comments(); - $awaiting_mod = $awaiting_mod->moderated; - $awaiting_text = sprintf( _n( '%s comment awaiting moderation', '%s comments awaiting moderation', $awaiting_mod ), number_format_i18n( $awaiting_mod ) ); - - $icon = '<span class="ab-icon"></span>'; - $title = '<span class="ab-label awaiting-mod pending-count count-' . $awaiting_mod . '" aria-hidden="true">' . number_format_i18n( $awaiting_mod ) . '</span>'; - $title .= '<span class="screen-reader-text">' . $awaiting_text . '</span>'; - - $wp_admin_bar->add_menu( array( - 'id' => 'comments', - 'title' => $icon . $title, - 'href' => admin_url('edit-comments.php'), - ) ); -} - -/** - * Add appearance submenu items to the "Site Name" menu. - * - * @since 3.1.0 - * - * @param WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_appearance_menu( $wp_admin_bar ) { - $wp_admin_bar->add_group( array( 'parent' => 'site-name', 'id' => 'appearance' ) ); - - if ( current_user_can( 'switch_themes' ) ) { - $wp_admin_bar->add_menu( array( - 'parent' => 'appearance', - 'id' => 'themes', - 'title' => __( 'Themes' ), - 'href' => admin_url( 'themes.php' ), - ) ); - } - - if ( ! current_user_can( 'edit_theme_options' ) ) { - return; - } - - if ( current_theme_supports( 'widgets' ) ) { - $wp_admin_bar->add_menu( array( - 'parent' => 'appearance', - 'id' => 'widgets', - 'title' => __( 'Widgets' ), - 'href' => admin_url( 'widgets.php' ), - ) ); - } - - if ( current_theme_supports( 'menus' ) || current_theme_supports( 'widgets' ) ) - $wp_admin_bar->add_menu( array( 'parent' => 'appearance', 'id' => 'menus', 'title' => __('Menus'), 'href' => admin_url('nav-menus.php') ) ); - - if ( current_theme_supports( 'custom-background' ) ) { - $wp_admin_bar->add_menu( array( - 'parent' => 'appearance', - 'id' => 'background', - 'title' => __( 'Background' ), - 'href' => admin_url( 'themes.php?page=custom-background' ), - 'meta' => array( - 'class' => 'hide-if-customize', - ), - ) ); - } - - if ( current_theme_supports( 'custom-header' ) ) { - $wp_admin_bar->add_menu( array( - 'parent' => 'appearance', - 'id' => 'header', - 'title' => __( 'Header' ), - 'href' => admin_url( 'themes.php?page=custom-header' ), - 'meta' => array( - 'class' => 'hide-if-customize', - ), - ) ); - } - -} - -/** - * Provide an update link if theme/plugin/core updates are available. - * - * @since 3.1.0 - * - * @param WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_updates_menu( $wp_admin_bar ) { - - $update_data = wp_get_update_data(); - - if ( !$update_data['counts']['total'] ) - return; - - $title = '<span class="ab-icon"></span><span class="ab-label">' . number_format_i18n( $update_data['counts']['total'] ) . '</span>'; - $title .= '<span class="screen-reader-text">' . $update_data['title'] . '</span>'; - - $wp_admin_bar->add_menu( array( - 'id' => 'updates', - 'title' => $title, - 'href' => network_admin_url( 'update-core.php' ), - 'meta' => array( - 'title' => $update_data['title'], - ), - ) ); -} - -/** - * Add search form. - * - * @since 3.3.0 - * - * @param WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_search_menu( $wp_admin_bar ) { - if ( is_admin() ) - return; - - $form = '<form action="' . esc_url( home_url( '/' ) ) . '" method="get" id="adminbarsearch">'; - $form .= '<input class="adminbar-input" name="s" id="adminbar-search" type="text" value="" maxlength="150" />'; - $form .= '<label for="adminbar-search" class="screen-reader-text">' . __( 'Search' ) . '</label>'; - $form .= '<input type="submit" class="adminbar-button" value="' . __('Search') . '"/>'; - $form .= '</form>'; - - $wp_admin_bar->add_menu( array( - 'parent' => 'top-secondary', - 'id' => 'search', - 'title' => $form, - 'meta' => array( - 'class' => 'admin-bar-search', - 'tabindex' => -1, - ) - ) ); -} - -/** - * Add secondary menus. - * - * @since 3.3.0 - * - * @param WP_Admin_Bar $wp_admin_bar - */ -function wp_admin_bar_add_secondary_groups( $wp_admin_bar ) { - $wp_admin_bar->add_group( array( - 'id' => 'top-secondary', - 'meta' => array( - 'class' => 'ab-top-secondary', - ), - ) ); - - $wp_admin_bar->add_group( array( - 'parent' => 'wp-logo', - 'id' => 'wp-logo-external', - 'meta' => array( - 'class' => 'ab-sub-secondary', - ), - ) ); -} - -/** - * Style and scripts for the admin bar. - * - * @since 3.1.0 - */ -function wp_admin_bar_header() { ?> -<style type="text/css" media="print">#wpadminbar { display:none; }</style> -<?php -} - -/** - * Default admin bar callback. - * - * @since 3.1.0 - */ -function _admin_bar_bump_cb() { ?> -<style type="text/css" media="screen"> - html { margin-top: 32px !important; } - * html body { margin-top: 32px !important; } - @media screen and ( max-width: 782px ) { - html { margin-top: 46px !important; } - * html body { margin-top: 46px !important; } - } -</style> -<?php -} - -/** - * Sets the display status of the admin bar. - * - * This can be called immediately upon plugin load. It does not need to be called - * from a function hooked to the {@see 'init'} action. - * - * @since 3.1.0 - * - * @global bool $show_admin_bar - * - * @param bool $show Whether to allow the admin bar to show. - */ -function show_admin_bar( $show ) { - global $show_admin_bar; - $show_admin_bar = (bool) $show; -} - -/** - * Determine whether the admin bar should be showing. - * - * @since 3.1.0 - * - * @global bool $show_admin_bar - * @global string $pagenow - * - * @return bool Whether the admin bar should be showing. - */ -function is_admin_bar_showing() { - global $show_admin_bar, $pagenow; - - // For all these types of requests, we never want an admin bar. - if ( defined('XMLRPC_REQUEST') || defined('DOING_AJAX') || defined('IFRAME_REQUEST') ) - return false; - - if ( is_embed() ) { - return false; - } - - // Integrated into the admin. - if ( is_admin() ) - return true; - - if ( ! isset( $show_admin_bar ) ) { - if ( ! is_user_logged_in() || 'wp-login.php' == $pagenow ) { - $show_admin_bar = false; - } else { - $show_admin_bar = _get_admin_bar_pref(); - } - } - - /** - * Filters whether to show the admin bar. - * - * Returning false to this hook is the recommended way to hide the admin bar. - * The user's display preference is used for logged in users. - * - * @since 3.1.0 - * - * @param bool $show_admin_bar Whether the admin bar should be shown. Default false. - */ - $show_admin_bar = apply_filters( 'show_admin_bar', $show_admin_bar ); - - return $show_admin_bar; -} - -/** - * Retrieve the admin bar display preference of a user. - * - * @since 3.1.0 - * @access private - * - * @param string $context Context of this preference check. Defaults to 'front'. The 'admin' - * preference is no longer used. - * @param int $user Optional. ID of the user to check, defaults to 0 for current user. - * @return bool Whether the admin bar should be showing for this user. - */ -function _get_admin_bar_pref( $context = 'front', $user = 0 ) { - $pref = get_user_option( "show_admin_bar_{$context}", $user ); - if ( false === $pref ) - return true; - - return 'true' === $pref; -} diff --git a/wp/wp-includes/atomlib.php b/wp/wp-includes/atomlib.php deleted file mode 100644 index f2cba563..00000000 --- a/wp/wp-includes/atomlib.php +++ /dev/null @@ -1,368 +0,0 @@ -<?php -/** - * Atom Syndication Format PHP Library - * - * @package AtomLib - * @link http://code.google.com/p/phpatomlib/ - * - * @author Elias Torres <elias@torrez.us> - * @version 0.4 - * @since 2.3.0 - */ - -/** - * Structure that store common Atom Feed Properties - * - * @package AtomLib - */ -class AtomFeed { - /** - * Stores Links - * @var array - * @access public - */ - var $links = array(); - /** - * Stores Categories - * @var array - * @access public - */ - var $categories = array(); - /** - * Stores Entries - * - * @var array - * @access public - */ - var $entries = array(); -} - -/** - * Structure that store Atom Entry Properties - * - * @package AtomLib - */ -class AtomEntry { - /** - * Stores Links - * @var array - * @access public - */ - var $links = array(); - /** - * Stores Categories - * @var array - * @access public - */ - var $categories = array(); -} - -/** - * AtomLib Atom Parser API - * - * @package AtomLib - */ -class AtomParser { - - var $NS = 'http://www.w3.org/2005/Atom'; - var $ATOM_CONTENT_ELEMENTS = array('content','summary','title','subtitle','rights'); - var $ATOM_SIMPLE_ELEMENTS = array('id','updated','published','draft'); - - var $debug = false; - - var $depth = 0; - var $indent = 2; - var $in_content; - var $ns_contexts = array(); - var $ns_decls = array(); - var $content_ns_decls = array(); - var $content_ns_contexts = array(); - var $is_xhtml = false; - var $is_html = false; - var $is_text = true; - var $skipped_div = false; - - var $FILE = "php://input"; - - var $feed; - var $current; - - /** - * PHP5 constructor. - */ - function __construct() { - - $this->feed = new AtomFeed(); - $this->current = null; - $this->map_attrs_func = create_function('$k,$v', 'return "$k=\"$v\"";'); - $this->map_xmlns_func = create_function('$p,$n', '$xd = "xmlns"; if(strlen($n[0])>0) $xd .= ":{$n[0]}"; return "{$xd}=\"{$n[1]}\"";'); - } - - /** - * PHP4 constructor. - */ - public function AtomParser() { - self::__construct(); - } - - function _p($msg) { - if($this->debug) { - print str_repeat(" ", $this->depth * $this->indent) . $msg ."\n"; - } - } - - function error_handler($log_level, $log_text, $error_file, $error_line) { - $this->error = $log_text; - } - - function parse() { - - set_error_handler(array(&$this, 'error_handler')); - - array_unshift($this->ns_contexts, array()); - - if ( ! function_exists( 'xml_parser_create_ns' ) ) { - trigger_error( __( "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." ) ); - return false; - } - - $parser = xml_parser_create_ns(); - xml_set_object($parser, $this); - xml_set_element_handler($parser, "start_element", "end_element"); - xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0); - xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,0); - xml_set_character_data_handler($parser, "cdata"); - xml_set_default_handler($parser, "_default"); - xml_set_start_namespace_decl_handler($parser, "start_ns"); - xml_set_end_namespace_decl_handler($parser, "end_ns"); - - $this->content = ''; - - $ret = true; - - $fp = fopen($this->FILE, "r"); - while ($data = fread($fp, 4096)) { - if($this->debug) $this->content .= $data; - - if(!xml_parse($parser, $data, feof($fp))) { - /* translators: 1: error message, 2: line number */ - trigger_error(sprintf(__('XML Error: %1$s at line %2$s')."\n", - xml_error_string(xml_get_error_code($parser)), - xml_get_current_line_number($parser))); - $ret = false; - break; - } - } - fclose($fp); - - xml_parser_free($parser); - - restore_error_handler(); - - return $ret; - } - - function start_element($parser, $name, $attrs) { - - $tag = array_pop(explode(":", $name)); - - switch($name) { - case $this->NS . ':feed': - $this->current = $this->feed; - break; - case $this->NS . ':entry': - $this->current = new AtomEntry(); - break; - }; - - $this->_p("start_element('$name')"); - #$this->_p(print_r($this->ns_contexts,true)); - #$this->_p('current(' . $this->current . ')'); - - array_unshift($this->ns_contexts, $this->ns_decls); - - $this->depth++; - - if(!empty($this->in_content)) { - - $this->content_ns_decls = array(); - - if($this->is_html || $this->is_text) - trigger_error("Invalid content in element found. Content must not be of type text or html if it contains markup."); - - $attrs_prefix = array(); - - // resolve prefixes for attributes - foreach($attrs as $key => $value) { - $with_prefix = $this->ns_to_prefix($key, true); - $attrs_prefix[$with_prefix[1]] = $this->xml_escape($value); - } - - $attrs_str = join(' ', array_map($this->map_attrs_func, array_keys($attrs_prefix), array_values($attrs_prefix))); - if(strlen($attrs_str) > 0) { - $attrs_str = " " . $attrs_str; - } - - $with_prefix = $this->ns_to_prefix($name); - - if(!$this->is_declared_content_ns($with_prefix[0])) { - array_push($this->content_ns_decls, $with_prefix[0]); - } - - $xmlns_str = ''; - if(count($this->content_ns_decls) > 0) { - array_unshift($this->content_ns_contexts, $this->content_ns_decls); - $xmlns_str .= join(' ', array_map($this->map_xmlns_func, array_keys($this->content_ns_contexts[0]), array_values($this->content_ns_contexts[0]))); - if(strlen($xmlns_str) > 0) { - $xmlns_str = " " . $xmlns_str; - } - } - - array_push($this->in_content, array($tag, $this->depth, "<". $with_prefix[1] ."{$xmlns_str}{$attrs_str}" . ">")); - - } else if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS) || in_array($tag, $this->ATOM_SIMPLE_ELEMENTS)) { - $this->in_content = array(); - $this->is_xhtml = $attrs['type'] == 'xhtml'; - $this->is_html = $attrs['type'] == 'html' || $attrs['type'] == 'text/html'; - $this->is_text = !in_array('type',array_keys($attrs)) || $attrs['type'] == 'text'; - $type = $this->is_xhtml ? 'XHTML' : ($this->is_html ? 'HTML' : ($this->is_text ? 'TEXT' : $attrs['type'])); - - if(in_array('src',array_keys($attrs))) { - $this->current->$tag = $attrs; - } else { - array_push($this->in_content, array($tag,$this->depth, $type)); - } - } else if($tag == 'link') { - array_push($this->current->links, $attrs); - } else if($tag == 'category') { - array_push($this->current->categories, $attrs); - } - - $this->ns_decls = array(); - } - - function end_element($parser, $name) { - - $tag = array_pop(explode(":", $name)); - - $ccount = count($this->in_content); - - # if we are *in* content, then let's proceed to serialize it - if(!empty($this->in_content)) { - # if we are ending the original content element - # then let's finalize the content - if($this->in_content[0][0] == $tag && - $this->in_content[0][1] == $this->depth) { - $origtype = $this->in_content[0][2]; - array_shift($this->in_content); - $newcontent = array(); - foreach($this->in_content as $c) { - if(count($c) == 3) { - array_push($newcontent, $c[2]); - } else { - if($this->is_xhtml || $this->is_text) { - array_push($newcontent, $this->xml_escape($c)); - } else { - array_push($newcontent, $c); - } - } - } - if(in_array($tag, $this->ATOM_CONTENT_ELEMENTS)) { - $this->current->$tag = array($origtype, join('',$newcontent)); - } else { - $this->current->$tag = join('',$newcontent); - } - $this->in_content = array(); - } else if($this->in_content[$ccount-1][0] == $tag && - $this->in_content[$ccount-1][1] == $this->depth) { - $this->in_content[$ccount-1][2] = substr($this->in_content[$ccount-1][2],0,-1) . "/>"; - } else { - # else, just finalize the current element's content - $endtag = $this->ns_to_prefix($name); - array_push($this->in_content, array($tag, $this->depth, "</$endtag[1]>")); - } - } - - array_shift($this->ns_contexts); - - $this->depth--; - - if($name == ($this->NS . ':entry')) { - array_push($this->feed->entries, $this->current); - $this->current = null; - } - - $this->_p("end_element('$name')"); - } - - function start_ns($parser, $prefix, $uri) { - $this->_p("starting: " . $prefix . ":" . $uri); - array_push($this->ns_decls, array($prefix,$uri)); - } - - function end_ns($parser, $prefix) { - $this->_p("ending: #" . $prefix . "#"); - } - - function cdata($parser, $data) { - $this->_p("data: #" . str_replace(array("\n"), array("\\n"), trim($data)) . "#"); - if(!empty($this->in_content)) { - array_push($this->in_content, $data); - } - } - - function _default($parser, $data) { - # when does this gets called? - } - - - function ns_to_prefix($qname, $attr=false) { - # split 'http://www.w3.org/1999/xhtml:div' into ('http','//www.w3.org/1999/xhtml','div') - $components = explode(":", $qname); - - # grab the last one (e.g 'div') - $name = array_pop($components); - - if(!empty($components)) { - # re-join back the namespace component - $ns = join(":",$components); - foreach($this->ns_contexts as $context) { - foreach($context as $mapping) { - if($mapping[1] == $ns && strlen($mapping[0]) > 0) { - return array($mapping, "$mapping[0]:$name"); - } - } - } - } - - if($attr) { - return array(null, $name); - } else { - foreach($this->ns_contexts as $context) { - foreach($context as $mapping) { - if(strlen($mapping[0]) == 0) { - return array($mapping, $name); - } - } - } - } - } - - function is_declared_content_ns($new_mapping) { - foreach($this->content_ns_contexts as $context) { - foreach($context as $mapping) { - if($new_mapping == $mapping) { - return true; - } - } - } - return false; - } - - function xml_escape($string) - { - return str_replace(array('&','"',"'",'<','>'), - array('&','"',''','<','>'), - $string ); - } -} diff --git a/wp/wp-includes/author-template.php b/wp/wp-includes/author-template.php deleted file mode 100644 index b2b6ea31..00000000 --- a/wp/wp-includes/author-template.php +++ /dev/null @@ -1,509 +0,0 @@ -<?php -/** - * Author Template functions for use in themes. - * - * These functions must be used within the WordPress Loop. - * - * @link https://codex.wordpress.org/Author_Templates - * - * @package WordPress - * @subpackage Template - */ - -/** - * Retrieve the author of the current post. - * - * @since 1.5.0 - * - * @global object $authordata The current author's DB object. - * - * @param string $deprecated Deprecated. - * @return string|null The author's display name. - */ -function get_the_author($deprecated = '') { - global $authordata; - - if ( !empty( $deprecated ) ) - _deprecated_argument( __FUNCTION__, '2.1.0' ); - - /** - * Filters the display name of the current post's author. - * - * @since 2.9.0 - * - * @param string $authordata->display_name The author's display name. - */ - return apply_filters('the_author', is_object($authordata) ? $authordata->display_name : null); -} - -/** - * Display the name of the author of the current post. - * - * The behavior of this function is based off of old functionality predating - * get_the_author(). This function is not deprecated, but is designed to echo - * the value from get_the_author() and as an result of any old theme that might - * still use the old behavior will also pass the value from get_the_author(). - * - * The normal, expected behavior of this function is to echo the author and not - * return it. However, backward compatibility has to be maintained. - * - * @since 0.71 - * @see get_the_author() - * @link https://codex.wordpress.org/Template_Tags/the_author - * - * @param string $deprecated Deprecated. - * @param string $deprecated_echo Deprecated. Use get_the_author(). Echo the string or return it. - * @return string|null The author's display name, from get_the_author(). - */ -function the_author( $deprecated = '', $deprecated_echo = true ) { - if ( ! empty( $deprecated ) ) { - _deprecated_argument( __FUNCTION__, '2.1.0' ); - } - - if ( true !== $deprecated_echo ) { - _deprecated_argument( __FUNCTION__, '1.5.0', - /* translators: %s: get_the_author() */ - sprintf( __( 'Use %s instead if you do not want the value echoed.' ), - '<code>get_the_author()</code>' - ) - ); - } - - if ( $deprecated_echo ) { - echo get_the_author(); - } - - return get_the_author(); -} - -/** - * Retrieve the author who last edited the current post. - * - * @since 2.8.0 - * - * @return string|void The author's display name. - */ -function get_the_modified_author() { - if ( $last_id = get_post_meta( get_post()->ID, '_edit_last', true) ) { - $last_user = get_userdata($last_id); - - /** - * Filters the display name of the author who last edited the current post. - * - * @since 2.8.0 - * - * @param string $last_user->display_name The author's display name. - */ - return apply_filters('the_modified_author', $last_user->display_name); - } -} - -/** - * Display the name of the author who last edited the current post, - * if the author's ID is available. - * - * @since 2.8.0 - * - * @see get_the_author() - */ -function the_modified_author() { - echo get_the_modified_author(); -} - -/** - * Retrieve the requested data of the author of the current post. - * @link https://codex.wordpress.org/Template_Tags/the_author_meta - * @since 2.8.0 - * - * @global object $authordata The current author's DB object. - * - * @param string $field selects the field of the users record. - * @param int $user_id Optional. User ID. - * @return string The author's field from the current author's DB object. - */ -function get_the_author_meta( $field = '', $user_id = false ) { - $original_user_id = $user_id; - - if ( ! $user_id ) { - global $authordata; - $user_id = isset( $authordata->ID ) ? $authordata->ID : 0; - } else { - $authordata = get_userdata( $user_id ); - } - - if ( in_array( $field, array( 'login', 'pass', 'nicename', 'email', 'url', 'registered', 'activation_key', 'status' ) ) ) - $field = 'user_' . $field; - - $value = isset( $authordata->$field ) ? $authordata->$field : ''; - - /** - * Filters the value of the requested user metadata. - * - * The filter name is dynamic and depends on the $field parameter of the function. - * - * @since 2.8.0 - * @since 4.3.0 The `$original_user_id` parameter was added. - * - * @param string $value The value of the metadata. - * @param int $user_id The user ID for the value. - * @param int|bool $original_user_id The original user ID, as passed to the function. - */ - return apply_filters( 'get_the_author_' . $field, $value, $user_id, $original_user_id ); -} - -/** - * Outputs the field from the user's DB object. Defaults to current post's author. - * - * @link https://codex.wordpress.org/Template_Tags/the_author_meta - * - * @since 2.8.0 - * - * @param string $field selects the field of the users record. - * @param int $user_id Optional. User ID. - */ -function the_author_meta( $field = '', $user_id = false ) { - $author_meta = get_the_author_meta( $field, $user_id ); - - /** - * The value of the requested user metadata. - * - * The filter name is dynamic and depends on the $field parameter of the function. - * - * @since 2.8.0 - * - * @param string $author_meta The value of the metadata. - * @param int $user_id The user ID. - */ - echo apply_filters( 'the_author_' . $field, $author_meta, $user_id ); -} - -/** - * Retrieve either author's link or author's name. - * - * If the author has a home page set, return an HTML link, otherwise just return the - * author's name. - * - * @return string|null An HTML link if the author's url exist in user meta, - * else the result of get_the_author(). - */ -function get_the_author_link() { - if ( get_the_author_meta('url') ) { - return sprintf( '<a href="%1$s" title="%2$s" rel="author external">%3$s</a>', - esc_url( get_the_author_meta('url') ), - /* translators: %s: author's display name */ - esc_attr( sprintf( __( 'Visit %s’s website' ), get_the_author() ) ), - get_the_author() - ); - } else { - return get_the_author(); - } -} - -/** - * Display either author's link or author's name. - * - * If the author has a home page set, echo an HTML link, otherwise just echo the - * author's name. - * - * @link https://codex.wordpress.org/Template_Tags/the_author_link - * - * @since 2.1.0 - */ -function the_author_link() { - echo get_the_author_link(); -} - -/** - * Retrieve the number of posts by the author of the current post. - * - * @since 1.5.0 - * - * @return int The number of posts by the author. - */ -function get_the_author_posts() { - $post = get_post(); - if ( ! $post ) { - return 0; - } - return count_user_posts( $post->post_author, $post->post_type ); -} - -/** - * Display the number of posts by the author of the current post. - * - * @link https://codex.wordpress.org/Template_Tags/the_author_posts - * @since 0.71 - */ -function the_author_posts() { - echo get_the_author_posts(); -} - -/** - * Retrieves an HTML link to the author page of the current post's author. - * - * Returns an HTML-formatted link using get_author_posts_url(). - * - * @since 4.4.0 - * - * @global object $authordata The current author's DB object. - * - * @return string An HTML link to the author page. - */ -function get_the_author_posts_link() { - global $authordata; - if ( ! is_object( $authordata ) ) { - return; - } - - $link = sprintf( '<a href="%1$s" title="%2$s" rel="author">%3$s</a>', - esc_url( get_author_posts_url( $authordata->ID, $authordata->user_nicename ) ), - /* translators: %s: author's display name */ - esc_attr( sprintf( __( 'Posts by %s' ), get_the_author() ) ), - get_the_author() - ); - - /** - * Filters the link to the author page of the author of the current post. - * - * @since 2.9.0 - * - * @param string $link HTML link. - */ - return apply_filters( 'the_author_posts_link', $link ); -} - -/** - * Displays an HTML link to the author page of the current post's author. - * - * @since 1.2.0 - * @since 4.4.0 Converted into a wrapper for get_the_author_posts_link() - * - * @param string $deprecated Unused. - */ -function the_author_posts_link( $deprecated = '' ) { - if ( ! empty( $deprecated ) ) { - _deprecated_argument( __FUNCTION__, '2.1.0' ); - } - echo get_the_author_posts_link(); -} - -/** - * Retrieve the URL to the author page for the user with the ID provided. - * - * @since 2.1.0 - * - * @global WP_Rewrite $wp_rewrite - * - * @param int $author_id Author ID. - * @param string $author_nicename Optional. The author's nicename (slug). Default empty. - * @return string The URL to the author's page. - */ -function get_author_posts_url( $author_id, $author_nicename = '' ) { - global $wp_rewrite; - $auth_ID = (int) $author_id; - $link = $wp_rewrite->get_author_permastruct(); - - if ( empty($link) ) { - $file = home_url( '/' ); - $link = $file . '?author=' . $auth_ID; - } else { - if ( '' == $author_nicename ) { - $user = get_userdata($author_id); - if ( !empty($user->user_nicename) ) - $author_nicename = $user->user_nicename; - } - $link = str_replace('%author%', $author_nicename, $link); - $link = home_url( user_trailingslashit( $link ) ); - } - - /** - * Filters the URL to the author's page. - * - * @since 2.1.0 - * - * @param string $link The URL to the author's page. - * @param int $author_id The author's id. - * @param string $author_nicename The author's nice name. - */ - $link = apply_filters( 'author_link', $link, $author_id, $author_nicename ); - - return $link; -} - -/** - * List all the authors of the site, with several options available. - * - * @link https://codex.wordpress.org/Template_Tags/wp_list_authors - * - * @since 1.2.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string|array $args { - * Optional. Array or string of default arguments. - * - * @type string $orderby How to sort the authors. Accepts 'nicename', 'email', 'url', 'registered', - * 'user_nicename', 'user_email', 'user_url', 'user_registered', 'name', - * 'display_name', 'post_count', 'ID', 'meta_value', 'user_login'. Default 'name'. - * @type string $order Sorting direction for $orderby. Accepts 'ASC', 'DESC'. Default 'ASC'. - * @type int $number Maximum authors to return or display. Default empty (all authors). - * @type bool $optioncount Show the count in parenthesis next to the author's name. Default false. - * @type bool $exclude_admin Whether to exclude the 'admin' account, if it exists. Default false. - * @type bool $show_fullname Whether to show the author's full name. Default false. - * @type bool $hide_empty Whether to hide any authors with no posts. Default true. - * @type string $feed If not empty, show a link to the author's feed and use this text as the alt - * parameter of the link. Default empty. - * @type string $feed_image If not empty, show a link to the author's feed and use this image URL as - * clickable anchor. Default empty. - * @type string $feed_type The feed type to link to, such as 'rss2'. Defaults to default feed type. - * @type bool $echo Whether to output the result or instead return it. Default true. - * @type string $style If 'list', each author is wrapped in an `<li>` element, otherwise the authors - * will be separated by commas. - * @type bool $html Whether to list the items in HTML form or plaintext. Default true. - * @type array|string $exclude Array or comma/space-separated list of author IDs to exclude. Default empty. - * @type array|string $include Array or comma/space-separated list of author IDs to include. Default empty. - * } - * @return string|void The output, if echo is set to false. - */ -function wp_list_authors( $args = '' ) { - global $wpdb; - - $defaults = array( - 'orderby' => 'name', 'order' => 'ASC', 'number' => '', - 'optioncount' => false, 'exclude_admin' => true, - 'show_fullname' => false, 'hide_empty' => true, - 'feed' => '', 'feed_image' => '', 'feed_type' => '', 'echo' => true, - 'style' => 'list', 'html' => true, 'exclude' => '', 'include' => '' - ); - - $args = wp_parse_args( $args, $defaults ); - - $return = ''; - - $query_args = wp_array_slice_assoc( $args, array( 'orderby', 'order', 'number', 'exclude', 'include' ) ); - $query_args['fields'] = 'ids'; - $authors = get_users( $query_args ); - - $author_count = array(); - foreach ( (array) $wpdb->get_results( "SELECT DISTINCT post_author, COUNT(ID) AS count FROM $wpdb->posts WHERE " . get_private_posts_cap_sql( 'post' ) . " GROUP BY post_author" ) as $row ) { - $author_count[$row->post_author] = $row->count; - } - foreach ( $authors as $author_id ) { - $author = get_userdata( $author_id ); - - if ( $args['exclude_admin'] && 'admin' == $author->display_name ) { - continue; - } - - $posts = isset( $author_count[$author->ID] ) ? $author_count[$author->ID] : 0; - - if ( ! $posts && $args['hide_empty'] ) { - continue; - } - - if ( $args['show_fullname'] && $author->first_name && $author->last_name ) { - $name = "$author->first_name $author->last_name"; - } else { - $name = $author->display_name; - } - - if ( ! $args['html'] ) { - $return .= $name . ', '; - - continue; // No need to go further to process HTML. - } - - if ( 'list' == $args['style'] ) { - $return .= '<li>'; - } - - $link = sprintf( '<a href="%1$s" title="%2$s">%3$s</a>', - get_author_posts_url( $author->ID, $author->user_nicename ), - /* translators: %s: author's display name */ - esc_attr( sprintf( __( 'Posts by %s' ), $author->display_name ) ), - $name - ); - - if ( ! empty( $args['feed_image'] ) || ! empty( $args['feed'] ) ) { - $link .= ' '; - if ( empty( $args['feed_image'] ) ) { - $link .= '('; - } - - $link .= '<a href="' . get_author_feed_link( $author->ID, $args['feed_type'] ) . '"'; - - $alt = ''; - if ( ! empty( $args['feed'] ) ) { - $alt = ' alt="' . esc_attr( $args['feed'] ) . '"'; - $name = $args['feed']; - } - - $link .= '>'; - - if ( ! empty( $args['feed_image'] ) ) { - $link .= '<img src="' . esc_url( $args['feed_image'] ) . '" style="border: none;"' . $alt . ' />'; - } else { - $link .= $name; - } - - $link .= '</a>'; - - if ( empty( $args['feed_image'] ) ) { - $link .= ')'; - } - } - - if ( $args['optioncount'] ) { - $link .= ' ('. $posts . ')'; - } - - $return .= $link; - $return .= ( 'list' == $args['style'] ) ? '</li>' : ', '; - } - - $return = rtrim( $return, ', ' ); - - if ( ! $args['echo'] ) { - return $return; - } - echo $return; -} - -/** - * Does this site have more than one author - * - * Checks to see if more than one author has published posts. - * - * @since 3.2.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @return bool Whether or not we have more than one author - */ -function is_multi_author() { - global $wpdb; - - if ( false === ( $is_multi_author = get_transient( 'is_multi_author' ) ) ) { - $rows = (array) $wpdb->get_col("SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish' LIMIT 2"); - $is_multi_author = 1 < count( $rows ) ? 1 : 0; - set_transient( 'is_multi_author', $is_multi_author ); - } - - /** - * Filters whether the site has more than one author with published posts. - * - * @since 3.2.0 - * - * @param bool $is_multi_author Whether $is_multi_author should evaluate as true. - */ - return apply_filters( 'is_multi_author', (bool) $is_multi_author ); -} - -/** - * Helper function to clear the cache for number of authors. - * - * @private - */ -function __clear_multi_author_cache() { - delete_transient( 'is_multi_author' ); -} diff --git a/wp/wp-includes/bookmark-template.php b/wp/wp-includes/bookmark-template.php deleted file mode 100644 index c6b7fd2b..00000000 --- a/wp/wp-includes/bookmark-template.php +++ /dev/null @@ -1,304 +0,0 @@ -<?php -/** - * Bookmark Template Functions for usage in Themes - * - * @package WordPress - * @subpackage Template - */ - -/** - * The formatted output of a list of bookmarks. - * - * The $bookmarks array must contain bookmark objects and will be iterated over - * to retrieve the bookmark to be used in the output. - * - * The output is formatted as HTML with no way to change that format. However, - * what is between, before, and after can be changed. The link itself will be - * HTML. - * - * This function is used internally by wp_list_bookmarks() and should not be - * used by themes. - * - * @since 2.1.0 - * @access private - * - * @param array $bookmarks List of bookmarks to traverse. - * @param string|array $args { - * Optional. Bookmarks arguments. - * - * @type int|bool $show_updated Whether to show the time the bookmark was last updated. - * Accepts 1|true or 0|false. Default 0|false. - * @type int|bool $show_description Whether to show the bookmakr description. Accepts 1|true, - * Accepts 1|true or 0|false. Default 0|false. - * @type int|bool $show_images Whether to show the link image if available. Accepts 1|true - * or 0|false. Default 1|true. - * @type int|bool $show_name Whether to show link name if available. Accepts 1|true or - * 0|false. Default 0|false. - * @type string $before The HTML or text to prepend to each bookmark. Default `<li>`. - * @type string $after The HTML or text to append to each bookmark. Default `</li>`. - * @type string $link_before The HTML or text to prepend to each bookmark inside the anchor - * tags. Default empty. - * @type string $link_after The HTML or text to append to each bookmark inside the anchor - * tags. Default empty. - * @type string $between The string for use in between the link, description, and image. - * Default "\n". - * @type int|bool $show_rating Whether to show the link rating. Accepts 1|true or 0|false. - * Default 0|false. - * - * } - * @return string Formatted output in HTML - */ -function _walk_bookmarks( $bookmarks, $args = '' ) { - $defaults = array( - 'show_updated' => 0, 'show_description' => 0, - 'show_images' => 1, 'show_name' => 0, - 'before' => '<li>', 'after' => '</li>', 'between' => "\n", - 'show_rating' => 0, 'link_before' => '', 'link_after' => '' - ); - - $r = wp_parse_args( $args, $defaults ); - - $output = ''; // Blank string to start with. - - foreach ( (array) $bookmarks as $bookmark ) { - if ( ! isset( $bookmark->recently_updated ) ) { - $bookmark->recently_updated = false; - } - $output .= $r['before']; - if ( $r['show_updated'] && $bookmark->recently_updated ) { - $output .= '<em>'; - } - $the_link = '#'; - if ( ! empty( $bookmark->link_url ) ) { - $the_link = esc_url( $bookmark->link_url ); - } - $desc = esc_attr( sanitize_bookmark_field( 'link_description', $bookmark->link_description, $bookmark->link_id, 'display' ) ); - $name = esc_attr( sanitize_bookmark_field( 'link_name', $bookmark->link_name, $bookmark->link_id, 'display' ) ); - $title = $desc; - - if ( $r['show_updated'] ) { - if ( '00' != substr( $bookmark->link_updated_f, 0, 2 ) ) { - $title .= ' ('; - $title .= sprintf( - __('Last updated: %s'), - date( - get_option( 'links_updated_date_format' ), - $bookmark->link_updated_f + ( get_option( 'gmt_offset' ) * HOUR_IN_SECONDS ) - ) - ); - $title .= ')'; - } - } - $alt = ' alt="' . $name . ( $r['show_description'] ? ' ' . $title : '' ) . '"'; - - if ( '' != $title ) { - $title = ' title="' . $title . '"'; - } - $rel = $bookmark->link_rel; - if ( '' != $rel ) { - $rel = ' rel="' . esc_attr($rel) . '"'; - } - $target = $bookmark->link_target; - if ( '' != $target ) { - $target = ' target="' . $target . '"'; - } - $output .= '<a href="' . $the_link . '"' . $rel . $title . $target . '>'; - - $output .= $r['link_before']; - - if ( $bookmark->link_image != null && $r['show_images'] ) { - if ( strpos( $bookmark->link_image, 'http' ) === 0 ) { - $output .= "<img src=\"$bookmark->link_image\" $alt $title />"; - } else { // If it's a relative path - $output .= "<img src=\"" . get_option('siteurl') . "$bookmark->link_image\" $alt $title />"; - } - if ( $r['show_name'] ) { - $output .= " $name"; - } - } else { - $output .= $name; - } - - $output .= $r['link_after']; - - $output .= '</a>'; - - if ( $r['show_updated'] && $bookmark->recently_updated ) { - $output .= '</em>'; - } - - if ( $r['show_description'] && '' != $desc ) { - $output .= $r['between'] . $desc; - } - - if ( $r['show_rating'] ) { - $output .= $r['between'] . sanitize_bookmark_field( - 'link_rating', - $bookmark->link_rating, - $bookmark->link_id, - 'display' - ); - } - $output .= $r['after'] . "\n"; - } // end while - - return $output; -} - -/** - * Retrieve or echo all of the bookmarks. - * - * List of default arguments are as follows: - * - * These options define how the Category name will appear before the category - * links are displayed, if 'categorize' is 1. If 'categorize' is 0, then it will - * display for only the 'title_li' string and only if 'title_li' is not empty. - * - * @since 2.1.0 - * - * @see _walk_bookmarks() - * - * @param string|array $args { - * Optional. String or array of arguments to list bookmarks. - * - * @type string $orderby How to order the links by. Accepts post fields. Default 'name'. - * @type string $order Whether to order bookmarks in ascending or descending order. - * Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'. - * @type int $limit Amount of bookmarks to display. Accepts 1+ or -1 for all. - * Default -1. - * @type string $category Comma-separated list of category ids to include links from. - * Default empty. - * @type string $category_name Category to retrieve links for by name. Default empty. - * @type int|bool $hide_invisible Whether to show or hide links marked as 'invisible'. Accepts - * 1|true or 0|false. Default 1|true. - * @type int|bool $show_updated Whether to display the time the bookmark was last updated. - * Accepts 1|true or 0|false. Default 0|false. - * @type int|bool $echo Whether to echo or return the formatted bookmarks. Accepts - * 1|true (echo) or 0|false (return). Default 1|true. - * @type int|bool $categorize Whether to show links listed by category or in a single column. - * Accepts 1|true (by category) or 0|false (one column). Default 1|true. - * @type int|bool $show_description Whether to show the bookmark descriptions. Accepts 1|true or 0|false. - * Default 0|false. - * @type string $title_li What to show before the links appear. Default 'Bookmarks'. - * @type string $title_before The HTML or text to prepend to the $title_li string. Default '<h2>'. - * @type string $title_after The HTML or text to append to the $title_li string. Default '</h2>'. - * @type string $class The CSS class to use for the $title_li. Default 'linkcat'. - * @type string $category_before The HTML or text to prepend to $title_before if $categorize is true. - * String must contain '%id' and '%class' to inherit the category ID and - * the $class argument used for formatting in themes. - * Default '<li id="%id" class="%class">'. - * @type string $category_after The HTML or text to append to $title_after if $categorize is true. - * Default '</li>'. - * @type string $category_orderby How to order the bookmark category based on term scheme if $categorize - * is true. Default 'name'. - * @type string $category_order Whether to order categories in ascending or descending order if - * $categorize is true. Accepts 'ASC' (ascending) or 'DESC' (descending). - * Default 'ASC'. - * } - * @return string|void Will only return if echo option is set to not echo. Default is not return anything. - */ -function wp_list_bookmarks( $args = '' ) { - $defaults = array( - 'orderby' => 'name', 'order' => 'ASC', - 'limit' => -1, 'category' => '', 'exclude_category' => '', - 'category_name' => '', 'hide_invisible' => 1, - 'show_updated' => 0, 'echo' => 1, - 'categorize' => 1, 'title_li' => __('Bookmarks'), - 'title_before' => '<h2>', 'title_after' => '</h2>', - 'category_orderby' => 'name', 'category_order' => 'ASC', - 'class' => 'linkcat', 'category_before' => '<li id="%id" class="%class">', - 'category_after' => '</li>' - ); - - $r = wp_parse_args( $args, $defaults ); - - $output = ''; - - if ( ! is_array( $r['class'] ) ) { - $r['class'] = explode( ' ', $r['class'] ); - } - $r['class'] = array_map( 'sanitize_html_class', $r['class'] ); - $r['class'] = trim( join( ' ', $r['class'] ) ); - - if ( $r['categorize'] ) { - $cats = get_terms( 'link_category', array( - 'name__like' => $r['category_name'], - 'include' => $r['category'], - 'exclude' => $r['exclude_category'], - 'orderby' => $r['category_orderby'], - 'order' => $r['category_order'], - 'hierarchical' => 0 - ) ); - if ( empty( $cats ) ) { - $r['categorize'] = false; - } - } - - if ( $r['categorize'] ) { - // Split the bookmarks into ul's for each category - foreach ( (array) $cats as $cat ) { - $params = array_merge( $r, array( 'category' => $cat->term_id ) ); - $bookmarks = get_bookmarks( $params ); - if ( empty( $bookmarks ) ) { - continue; - } - $output .= str_replace( - array( '%id', '%class' ), - array( "linkcat-$cat->term_id", $r['class'] ), - $r['category_before'] - ); - /** - * Filters the bookmarks category name. - * - * @since 2.2.0 - * - * @param string $cat_name The category name of bookmarks. - */ - $catname = apply_filters( 'link_category', $cat->name ); - - $output .= $r['title_before']; - $output .= $catname; - $output .= $r['title_after']; - $output .= "\n\t<ul class='xoxo blogroll'>\n"; - $output .= _walk_bookmarks( $bookmarks, $r ); - $output .= "\n\t</ul>\n"; - $output .= $r['category_after'] . "\n"; - } - } else { - //output one single list using title_li for the title - $bookmarks = get_bookmarks( $r ); - - if ( ! empty( $bookmarks ) ) { - if ( ! empty( $r['title_li'] ) ) { - $output .= str_replace( - array( '%id', '%class' ), - array( "linkcat-" . $r['category'], $r['class'] ), - $r['category_before'] - ); - $output .= $r['title_before']; - $output .= $r['title_li']; - $output .= $r['title_after']; - $output .= "\n\t<ul class='xoxo blogroll'>\n"; - $output .= _walk_bookmarks( $bookmarks, $r ); - $output .= "\n\t</ul>\n"; - $output .= $r['category_after'] . "\n"; - } else { - $output .= _walk_bookmarks( $bookmarks, $r ); - } - } - } - - /** - * Filters the bookmarks list before it is echoed or returned. - * - * @since 2.5.0 - * - * @param string $html The HTML list of bookmarks. - */ - $html = apply_filters( 'wp_list_bookmarks', $output ); - - if ( ! $r['echo'] ) { - return $html; - } - echo $html; -} diff --git a/wp/wp-includes/bookmark.php b/wp/wp-includes/bookmark.php deleted file mode 100644 index 718760be..00000000 --- a/wp/wp-includes/bookmark.php +++ /dev/null @@ -1,421 +0,0 @@ -<?php -/** - * Link/Bookmark API - * - * @package WordPress - * @subpackage Bookmark - */ - -/** - * Retrieve Bookmark data - * - * @since 2.1.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int|stdClass $bookmark - * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond to - * an stdClass object, an associative array, or a numeric array, respectively. Default OBJECT. - * @param string $filter Optional, default is 'raw'. - * @return array|object|null Type returned depends on $output value. - */ -function get_bookmark($bookmark, $output = OBJECT, $filter = 'raw') { - global $wpdb; - - if ( empty($bookmark) ) { - if ( isset($GLOBALS['link']) ) - $_bookmark = & $GLOBALS['link']; - else - $_bookmark = null; - } elseif ( is_object($bookmark) ) { - wp_cache_add($bookmark->link_id, $bookmark, 'bookmark'); - $_bookmark = $bookmark; - } else { - if ( isset($GLOBALS['link']) && ($GLOBALS['link']->link_id == $bookmark) ) { - $_bookmark = & $GLOBALS['link']; - } elseif ( ! $_bookmark = wp_cache_get($bookmark, 'bookmark') ) { - $_bookmark = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->links WHERE link_id = %d LIMIT 1", $bookmark)); - if ( $_bookmark ) { - $_bookmark->link_category = array_unique( wp_get_object_terms( $_bookmark->link_id, 'link_category', array( 'fields' => 'ids' ) ) ); - wp_cache_add( $_bookmark->link_id, $_bookmark, 'bookmark' ); - } - } - } - - if ( ! $_bookmark ) - return $_bookmark; - - $_bookmark = sanitize_bookmark($_bookmark, $filter); - - if ( $output == OBJECT ) { - return $_bookmark; - } elseif ( $output == ARRAY_A ) { - return get_object_vars($_bookmark); - } elseif ( $output == ARRAY_N ) { - return array_values(get_object_vars($_bookmark)); - } else { - return $_bookmark; - } -} - -/** - * Retrieve single bookmark data item or field. - * - * @since 2.3.0 - * - * @param string $field The name of the data field to return - * @param int $bookmark The bookmark ID to get field - * @param string $context Optional. The context of how the field will be used. - * @return string|WP_Error - */ -function get_bookmark_field( $field, $bookmark, $context = 'display' ) { - $bookmark = (int) $bookmark; - $bookmark = get_bookmark( $bookmark ); - - if ( is_wp_error($bookmark) ) - return $bookmark; - - if ( !is_object($bookmark) ) - return ''; - - if ( !isset($bookmark->$field) ) - return ''; - - return sanitize_bookmark_field($field, $bookmark->$field, $bookmark->link_id, $context); -} - -/** - * Retrieves the list of bookmarks - * - * Attempts to retrieve from the cache first based on MD5 hash of arguments. If - * that fails, then the query will be built from the arguments and executed. The - * results will be stored to the cache. - * - * @since 2.1.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string|array $args { - * Optional. String or array of arguments to retrieve bookmarks. - * - * @type string $orderby How to order the links by. Accepts post fields. Default 'name'. - * @type string $order Whether to order bookmarks in ascending or descending order. - * Accepts 'ASC' (ascending) or 'DESC' (descending). Default 'ASC'. - * @type int $limit Amount of bookmarks to display. Accepts 1+ or -1 for all. - * Default -1. - * @type string $category Comma-separated list of category ids to include links from. - * Default empty. - * @type string $category_name Category to retrieve links for by name. Default empty. - * @type int|bool $hide_invisible Whether to show or hide links marked as 'invisible'. Accepts - * 1|true or 0|false. Default 1|true. - * @type int|bool $show_updated Whether to display the time the bookmark was last updated. - * Accepts 1|true or 0|false. Default 0|false. - * @type string $include Comma-separated list of bookmark IDs to include. Default empty. - * @type string $exclude Comma-separated list of bookmark IDs to exclude. Default empty. - * } - * @return array List of bookmark row objects. - */ -function get_bookmarks( $args = '' ) { - global $wpdb; - - $defaults = array( - 'orderby' => 'name', 'order' => 'ASC', - 'limit' => -1, 'category' => '', - 'category_name' => '', 'hide_invisible' => 1, - 'show_updated' => 0, 'include' => '', - 'exclude' => '', 'search' => '' - ); - - $r = wp_parse_args( $args, $defaults ); - - $key = md5( serialize( $r ) ); - $cache = false; - if ( 'rand' !== $r['orderby'] && $cache = wp_cache_get( 'get_bookmarks', 'bookmark' ) ) { - if ( is_array( $cache ) && isset( $cache[ $key ] ) ) { - $bookmarks = $cache[ $key ]; - /** - * Filters the returned list of bookmarks. - * - * The first time the hook is evaluated in this file, it returns the cached - * bookmarks list. The second evaluation returns a cached bookmarks list if the - * link category is passed but does not exist. The third evaluation returns - * the full cached results. - * - * @since 2.1.0 - * - * @see get_bookmarks() - * - * @param array $bookmarks List of the cached bookmarks. - * @param array $r An array of bookmark query arguments. - */ - return apply_filters( 'get_bookmarks', $bookmarks, $r ); - } - } - - if ( ! is_array( $cache ) ) { - $cache = array(); - } - - $inclusions = ''; - if ( ! empty( $r['include'] ) ) { - $r['exclude'] = ''; //ignore exclude, category, and category_name params if using include - $r['category'] = ''; - $r['category_name'] = ''; - $inclinks = preg_split( '/[\s,]+/', $r['include'] ); - if ( count( $inclinks ) ) { - foreach ( $inclinks as $inclink ) { - if ( empty( $inclusions ) ) { - $inclusions = ' AND ( link_id = ' . intval( $inclink ) . ' '; - } else { - $inclusions .= ' OR link_id = ' . intval( $inclink ) . ' '; - } - } - } - } - if (! empty( $inclusions ) ) { - $inclusions .= ')'; - } - - $exclusions = ''; - if ( ! empty( $r['exclude'] ) ) { - $exlinks = preg_split( '/[\s,]+/', $r['exclude'] ); - if ( count( $exlinks ) ) { - foreach ( $exlinks as $exlink ) { - if ( empty( $exclusions ) ) { - $exclusions = ' AND ( link_id <> ' . intval( $exlink ) . ' '; - } else { - $exclusions .= ' AND link_id <> ' . intval( $exlink ) . ' '; - } - } - } - } - if ( ! empty( $exclusions ) ) { - $exclusions .= ')'; - } - - if ( ! empty( $r['category_name'] ) ) { - if ( $r['category'] = get_term_by('name', $r['category_name'], 'link_category') ) { - $r['category'] = $r['category']->term_id; - } else { - $cache[ $key ] = array(); - wp_cache_set( 'get_bookmarks', $cache, 'bookmark' ); - /** This filter is documented in wp-includes/bookmark.php */ - return apply_filters( 'get_bookmarks', array(), $r ); - } - } - - $search = ''; - if ( ! empty( $r['search'] ) ) { - $like = '%' . $wpdb->esc_like( $r['search'] ) . '%'; - $search = $wpdb->prepare(" AND ( (link_url LIKE %s) OR (link_name LIKE %s) OR (link_description LIKE %s) ) ", $like, $like, $like ); - } - - $category_query = ''; - $join = ''; - if ( ! empty( $r['category'] ) ) { - $incategories = preg_split( '/[\s,]+/', $r['category'] ); - if ( count($incategories) ) { - foreach ( $incategories as $incat ) { - if ( empty( $category_query ) ) { - $category_query = ' AND ( tt.term_id = ' . intval( $incat ) . ' '; - } else { - $category_query .= ' OR tt.term_id = ' . intval( $incat ) . ' '; - } - } - } - } - if ( ! empty( $category_query ) ) { - $category_query .= ") AND taxonomy = 'link_category'"; - $join = " INNER JOIN $wpdb->term_relationships AS tr ON ($wpdb->links.link_id = tr.object_id) INNER JOIN $wpdb->term_taxonomy as tt ON tt.term_taxonomy_id = tr.term_taxonomy_id"; - } - - if ( $r['show_updated'] ) { - $recently_updated_test = ", IF (DATE_ADD(link_updated, INTERVAL 120 MINUTE) >= NOW(), 1,0) as recently_updated "; - } else { - $recently_updated_test = ''; - } - - $get_updated = ( $r['show_updated'] ) ? ', UNIX_TIMESTAMP(link_updated) AS link_updated_f ' : ''; - - $orderby = strtolower( $r['orderby'] ); - $length = ''; - switch ( $orderby ) { - case 'length': - $length = ", CHAR_LENGTH(link_name) AS length"; - break; - case 'rand': - $orderby = 'rand()'; - break; - case 'link_id': - $orderby = "$wpdb->links.link_id"; - break; - default: - $orderparams = array(); - $keys = array( 'link_id', 'link_name', 'link_url', 'link_visible', 'link_rating', 'link_owner', 'link_updated', 'link_notes', 'link_description' ); - foreach ( explode( ',', $orderby ) as $ordparam ) { - $ordparam = trim( $ordparam ); - - if ( in_array( 'link_' . $ordparam, $keys ) ) { - $orderparams[] = 'link_' . $ordparam; - } elseif ( in_array( $ordparam, $keys ) ) { - $orderparams[] = $ordparam; - } - } - $orderby = implode( ',', $orderparams ); - } - - if ( empty( $orderby ) ) { - $orderby = 'link_name'; - } - - $order = strtoupper( $r['order'] ); - if ( '' !== $order && ! in_array( $order, array( 'ASC', 'DESC' ) ) ) { - $order = 'ASC'; - } - - $visible = ''; - if ( $r['hide_invisible'] ) { - $visible = "AND link_visible = 'Y'"; - } - - $query = "SELECT * $length $recently_updated_test $get_updated FROM $wpdb->links $join WHERE 1=1 $visible $category_query"; - $query .= " $exclusions $inclusions $search"; - $query .= " ORDER BY $orderby $order"; - if ( $r['limit'] != -1 ) { - $query .= ' LIMIT ' . $r['limit']; - } - - $results = $wpdb->get_results( $query ); - - if ( 'rand()' !== $orderby ) { - $cache[ $key ] = $results; - wp_cache_set( 'get_bookmarks', $cache, 'bookmark' ); - } - - /** This filter is documented in wp-includes/bookmark.php */ - return apply_filters( 'get_bookmarks', $results, $r ); -} - -/** - * Sanitizes all bookmark fields - * - * @since 2.3.0 - * - * @param stdClass|array $bookmark Bookmark row - * @param string $context Optional, default is 'display'. How to filter the - * fields - * @return stdClass|array Same type as $bookmark but with fields sanitized. - */ -function sanitize_bookmark($bookmark, $context = 'display') { - $fields = array('link_id', 'link_url', 'link_name', 'link_image', 'link_target', 'link_category', - 'link_description', 'link_visible', 'link_owner', 'link_rating', 'link_updated', - 'link_rel', 'link_notes', 'link_rss', ); - - if ( is_object($bookmark) ) { - $do_object = true; - $link_id = $bookmark->link_id; - } else { - $do_object = false; - $link_id = $bookmark['link_id']; - } - - foreach ( $fields as $field ) { - if ( $do_object ) { - if ( isset($bookmark->$field) ) - $bookmark->$field = sanitize_bookmark_field($field, $bookmark->$field, $link_id, $context); - } else { - if ( isset($bookmark[$field]) ) - $bookmark[$field] = sanitize_bookmark_field($field, $bookmark[$field], $link_id, $context); - } - } - - return $bookmark; -} - -/** - * Sanitizes a bookmark field. - * - * Sanitizes the bookmark fields based on what the field name is. If the field - * has a strict value set, then it will be tested for that, else a more generic - * filtering is applied. After the more strict filter is applied, if the `$context` - * is 'raw' then the value is immediately return. - * - * Hooks exist for the more generic cases. With the 'edit' context, the {@see 'edit_$field'} - * filter will be called and passed the `$value` and `$bookmark_id` respectively. - * - * With the 'db' context, the {@see 'pre_$field'} filter is called and passed the value. - * The 'display' context is the final context and has the `$field` has the filter name - * and is passed the `$value`, `$bookmark_id`, and `$context`, respectively. - * - * @since 2.3.0 - * - * @param string $field The bookmark field. - * @param mixed $value The bookmark field value. - * @param int $bookmark_id Bookmark ID. - * @param string $context How to filter the field value. Accepts 'raw', 'edit', 'attribute', - * 'js', 'db', or 'display' - * @return mixed The filtered value. - */ -function sanitize_bookmark_field( $field, $value, $bookmark_id, $context ) { - switch ( $field ) { - case 'link_id' : // ints - case 'link_rating' : - $value = (int) $value; - break; - case 'link_category' : // array( ints ) - $value = array_map('absint', (array) $value); - // We return here so that the categories aren't filtered. - // The 'link_category' filter is for the name of a link category, not an array of a link's link categories - return $value; - - case 'link_visible' : // bool stored as Y|N - $value = preg_replace('/[^YNyn]/', '', $value); - break; - case 'link_target' : // "enum" - $targets = array('_top', '_blank'); - if ( ! in_array($value, $targets) ) - $value = ''; - break; - } - - if ( 'raw' == $context ) - return $value; - - if ( 'edit' == $context ) { - /** This filter is documented in wp-includes/post.php */ - $value = apply_filters( "edit_$field", $value, $bookmark_id ); - - if ( 'link_notes' == $field ) { - $value = esc_html( $value ); // textarea_escaped - } else { - $value = esc_attr($value); - } - } elseif ( 'db' == $context ) { - /** This filter is documented in wp-includes/post.php */ - $value = apply_filters( "pre_$field", $value ); - } else { - /** This filter is documented in wp-includes/post.php */ - $value = apply_filters( $field, $value, $bookmark_id, $context ); - - if ( 'attribute' == $context ) { - $value = esc_attr( $value ); - } elseif ( 'js' == $context ) { - $value = esc_js( $value ); - } - } - - return $value; -} - -/** - * Deletes the bookmark cache. - * - * @since 2.7.0 - * - * @param int $bookmark_id Bookmark ID. - */ -function clean_bookmark_cache( $bookmark_id ) { - wp_cache_delete( $bookmark_id, 'bookmark' ); - wp_cache_delete( 'get_bookmarks', 'bookmark' ); - clean_object_term_cache( $bookmark_id, 'link'); -} diff --git a/wp/wp-includes/cache.php b/wp/wp-includes/cache.php deleted file mode 100644 index b9747569..00000000 --- a/wp/wp-includes/cache.php +++ /dev/null @@ -1,757 +0,0 @@ -<?php -/** - * Object Cache API - * - * @link https://codex.wordpress.org/Class_Reference/WP_Object_Cache - * - * @package WordPress - * @subpackage Cache - */ - -/** - * Adds data to the cache, if the cache key doesn't already exist. - * - * @since 2.0.0 - * - * @see WP_Object_Cache::add() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param int|string $key The cache key to use for retrieval later. - * @param mixed $data The data to add to the cache. - * @param string $group Optional. The group to add the cache to. Enables the same key - * to be used across groups. Default empty. - * @param int $expire Optional. When the cache data should expire, in seconds. - * Default 0 (no expiration). - * @return bool False if cache key and group already exist, true on success. - */ -function wp_cache_add( $key, $data, $group = '', $expire = 0 ) { - global $wp_object_cache; - - return $wp_object_cache->add( $key, $data, $group, (int) $expire ); -} - -/** - * Closes the cache. - * - * This function has ceased to do anything since WordPress 2.5. The - * functionality was removed along with the rest of the persistent cache. - * - * This does not mean that plugins can't implement this function when they need - * to make sure that the cache is cleaned up after WordPress no longer needs it. - * - * @since 2.0.0 - * - * @return true Always returns true. - */ -function wp_cache_close() { - return true; -} - -/** - * Decrements numeric cache item's value. - * - * @since 3.3.0 - * - * @see WP_Object_Cache::decr() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param int|string $key The cache key to decrement. - * @param int $offset Optional. The amount by which to decrement the item's value. Default 1. - * @param string $group Optional. The group the key is in. Default empty. - * @return false|int False on failure, the item's new value on success. - */ -function wp_cache_decr( $key, $offset = 1, $group = '' ) { - global $wp_object_cache; - - return $wp_object_cache->decr( $key, $offset, $group ); -} - -/** - * Removes the cache contents matching key and group. - * - * @since 2.0.0 - * - * @see WP_Object_Cache::delete() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param int|string $key What the contents in the cache are called. - * @param string $group Optional. Where the cache contents are grouped. Default empty. - * @return bool True on successful removal, false on failure. - */ -function wp_cache_delete( $key, $group = '' ) { - global $wp_object_cache; - - return $wp_object_cache->delete($key, $group); -} - -/** - * Removes all cache items. - * - * @since 2.0.0 - * - * @see WP_Object_Cache::flush() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @return bool False on failure, true on success - */ -function wp_cache_flush() { - global $wp_object_cache; - - return $wp_object_cache->flush(); -} - -/** - * Retrieves the cache contents from the cache by key and group. - * - * @since 2.0.0 - * - * @see WP_Object_Cache::get() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param int|string $key The key under which the cache contents are stored. - * @param string $group Optional. Where the cache contents are grouped. Default empty. - * @param bool $force Optional. Whether to force an update of the local cache from the persistent - * cache. Default false. - * @param bool $found Optional. Whether the key was found in the cache. Disambiguates a return of false, - * a storable value. Passed by reference. Default null. - * @return bool|mixed False on failure to retrieve contents or the cache - * contents on success - */ -function wp_cache_get( $key, $group = '', $force = false, &$found = null ) { - global $wp_object_cache; - - return $wp_object_cache->get( $key, $group, $force, $found ); -} - -/** - * Increment numeric cache item's value - * - * @since 3.3.0 - * - * @see WP_Object_Cache::incr() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param int|string $key The key for the cache contents that should be incremented. - * @param int $offset Optional. The amount by which to increment the item's value. Default 1. - * @param string $group Optional. The group the key is in. Default empty. - * @return false|int False on failure, the item's new value on success. - */ -function wp_cache_incr( $key, $offset = 1, $group = '' ) { - global $wp_object_cache; - - return $wp_object_cache->incr( $key, $offset, $group ); -} - -/** - * Sets up Object Cache Global and assigns it. - * - * @since 2.0.0 - * - * @global WP_Object_Cache $wp_object_cache - */ -function wp_cache_init() { - $GLOBALS['wp_object_cache'] = new WP_Object_Cache(); -} - -/** - * Replaces the contents of the cache with new data. - * - * @since 2.0.0 - * - * @see WP_Object_Cache::replace() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param int|string $key The key for the cache data that should be replaced. - * @param mixed $data The new data to store in the cache. - * @param string $group Optional. The group for the cache data that should be replaced. - * Default empty. - * @param int $expire Optional. When to expire the cache contents, in seconds. - * Default 0 (no expiration). - * @return bool False if original value does not exist, true if contents were replaced - */ -function wp_cache_replace( $key, $data, $group = '', $expire = 0 ) { - global $wp_object_cache; - - return $wp_object_cache->replace( $key, $data, $group, (int) $expire ); -} - -/** - * Saves the data to the cache. - * - * Differs from wp_cache_add() and wp_cache_replace() in that it will always write data. - * - * @since 2.0.0 - * - * @see WP_Object_Cache::set() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param int|string $key The cache key to use for retrieval later. - * @param mixed $data The contents to store in the cache. - * @param string $group Optional. Where to group the cache contents. Enables the same key - * to be used across groups. Default empty. - * @param int $expire Optional. When to expire the cache contents, in seconds. - * Default 0 (no expiration). - * @return bool False on failure, true on success - */ -function wp_cache_set( $key, $data, $group = '', $expire = 0 ) { - global $wp_object_cache; - - return $wp_object_cache->set( $key, $data, $group, (int) $expire ); -} - -/** - * Switches the internal blog ID. - * - * This changes the blog id used to create keys in blog specific groups. - * - * @since 3.5.0 - * - * @see WP_Object_Cache::switch_to_blog() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param int $blog_id Site ID. - */ -function wp_cache_switch_to_blog( $blog_id ) { - global $wp_object_cache; - - $wp_object_cache->switch_to_blog( $blog_id ); -} - -/** - * Adds a group or set of groups to the list of global groups. - * - * @since 2.6.0 - * - * @see WP_Object_Cache::add_global_groups() - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - * - * @param string|array $groups A group or an array of groups to add. - */ -function wp_cache_add_global_groups( $groups ) { - global $wp_object_cache; - - $wp_object_cache->add_global_groups( $groups ); -} - -/** - * Adds a group or set of groups to the list of non-persistent groups. - * - * @since 2.6.0 - * - * @param string|array $groups A group or an array of groups to add. - */ -function wp_cache_add_non_persistent_groups( $groups ) { - // Default cache doesn't persist so nothing to do here. -} - -/** - * Reset internal cache keys and structures. - * - * If the cache back end uses global blog or site IDs as part of its cache keys, - * this function instructs the back end to reset those keys and perform any cleanup - * since blog or site IDs have changed since cache init. - * - * This function is deprecated. Use wp_cache_switch_to_blog() instead of this - * function when preparing the cache for a blog switch. For clearing the cache - * during unit tests, consider using wp_cache_init(). wp_cache_init() is not - * recommended outside of unit tests as the performance penalty for using it is - * high. - * - * @since 2.6.0 - * @deprecated 3.5.0 WP_Object_Cache::reset() - * @see WP_Object_Cache::reset() - * - * @global WP_Object_Cache $wp_object_cache Object cache global instance. - */ -function wp_cache_reset() { - _deprecated_function( __FUNCTION__, '3.5.0' ); - - global $wp_object_cache; - - $wp_object_cache->reset(); -} - -/** - * Core class that implements an object cache. - * - * The WordPress Object Cache is used to save on trips to the database. The - * Object Cache stores all of the cache data to memory and makes the cache - * contents available by using a key, which is used to name and later retrieve - * the cache contents. - * - * The Object Cache can be replaced by other caching mechanisms by placing files - * in the wp-content folder which is looked at in wp-settings. If that file - * exists, then this file will not be included. - * - * @package WordPress - * @subpackage Cache - * @since 2.0.0 - */ -class WP_Object_Cache { - - /** - * Holds the cached objects. - * - * @since 2.0.0 - * @access private - * @var array - */ - private $cache = array(); - - /** - * The amount of times the cache data was already stored in the cache. - * - * @since 2.5.0 - * @access public - * @var int - */ - public $cache_hits = 0; - - /** - * Amount of times the cache did not have the request in cache. - * - * @since 2.0.0 - * @access public - * @var int - */ - public $cache_misses = 0; - - /** - * List of global cache groups. - * - * @since 3.0.0 - * @access protected - * @var array - */ - protected $global_groups = array(); - - /** - * The blog prefix to prepend to keys in non-global groups. - * - * @since 3.5.0 - * @access private - * @var int - */ - private $blog_prefix; - - /** - * Holds the value of is_multisite(). - * - * @since 3.5.0 - * @access private - * @var bool - */ - private $multisite; - - /** - * Makes private properties readable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param string $name Property to get. - * @return mixed Property. - */ - public function __get( $name ) { - return $this->$name; - } - - /** - * Makes private properties settable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param string $name Property to set. - * @param mixed $value Property value. - * @return mixed Newly-set property. - */ - public function __set( $name, $value ) { - return $this->$name = $value; - } - - /** - * Makes private properties checkable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param string $name Property to check if set. - * @return bool Whether the property is set. - */ - public function __isset( $name ) { - return isset( $this->$name ); - } - - /** - * Makes private properties un-settable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param string $name Property to unset. - */ - public function __unset( $name ) { - unset( $this->$name ); - } - - /** - * Adds data to the cache if it doesn't already exist. - * - * @since 2.0.0 - * @access public - * - * @uses WP_Object_Cache::_exists() Checks to see if the cache already has data. - * @uses WP_Object_Cache::set() Sets the data after the checking the cache - * contents existence. - * - * @param int|string $key What to call the contents in the cache. - * @param mixed $data The contents to store in the cache. - * @param string $group Optional. Where to group the cache contents. Default 'default'. - * @param int $expire Optional. When to expire the cache contents. Default 0 (no expiration). - * @return bool False if cache key and group already exist, true on success - */ - public function add( $key, $data, $group = 'default', $expire = 0 ) { - if ( wp_suspend_cache_addition() ) - return false; - - if ( empty( $group ) ) - $group = 'default'; - - $id = $key; - if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) - $id = $this->blog_prefix . $key; - - if ( $this->_exists( $id, $group ) ) - return false; - - return $this->set( $key, $data, $group, (int) $expire ); - } - - /** - * Sets the list of global cache groups. - * - * @since 3.0.0 - * @access public - * - * @param array $groups List of groups that are global. - */ - public function add_global_groups( $groups ) { - $groups = (array) $groups; - - $groups = array_fill_keys( $groups, true ); - $this->global_groups = array_merge( $this->global_groups, $groups ); - } - - /** - * Decrements numeric cache item's value. - * - * @since 3.3.0 - * @access public - * - * @param int|string $key The cache key to decrement. - * @param int $offset Optional. The amount by which to decrement the item's value. Default 1. - * @param string $group Optional. The group the key is in. Default 'default'. - * @return false|int False on failure, the item's new value on success. - */ - public function decr( $key, $offset = 1, $group = 'default' ) { - if ( empty( $group ) ) - $group = 'default'; - - if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) - $key = $this->blog_prefix . $key; - - if ( ! $this->_exists( $key, $group ) ) - return false; - - if ( ! is_numeric( $this->cache[ $group ][ $key ] ) ) - $this->cache[ $group ][ $key ] = 0; - - $offset = (int) $offset; - - $this->cache[ $group ][ $key ] -= $offset; - - if ( $this->cache[ $group ][ $key ] < 0 ) - $this->cache[ $group ][ $key ] = 0; - - return $this->cache[ $group ][ $key ]; - } - - /** - * Removes the contents of the cache key in the group. - * - * If the cache key does not exist in the group, then nothing will happen. - * - * @since 2.0.0 - * @access public - * - * @param int|string $key What the contents in the cache are called. - * @param string $group Optional. Where the cache contents are grouped. Default 'default'. - * @param bool $deprecated Optional. Unused. Default false. - * @return bool False if the contents weren't deleted and true on success. - */ - public function delete( $key, $group = 'default', $deprecated = false ) { - if ( empty( $group ) ) - $group = 'default'; - - if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) - $key = $this->blog_prefix . $key; - - if ( ! $this->_exists( $key, $group ) ) - return false; - - unset( $this->cache[$group][$key] ); - return true; - } - - /** - * Clears the object cache of all data. - * - * @since 2.0.0 - * @access public - * - * @return true Always returns true. - */ - public function flush() { - $this->cache = array(); - - return true; - } - - /** - * Retrieves the cache contents, if it exists. - * - * The contents will be first attempted to be retrieved by searching by the - * key in the cache group. If the cache is hit (success) then the contents - * are returned. - * - * On failure, the number of cache misses will be incremented. - * - * @since 2.0.0 - * @access public - * - * @param int|string $key What the contents in the cache are called. - * @param string $group Optional. Where the cache contents are grouped. Default 'default'. - * @param string $force Optional. Unused. Whether to force a refetch rather than relying on the local - * cache. Default false. - * @param bool $found Optional. Whether the key was found in the cache. Disambiguates a return of - * false, a storable value. Passed by reference. Default null. - * @return false|mixed False on failure to retrieve contents or the cache contents on success. - */ - public function get( $key, $group = 'default', $force = false, &$found = null ) { - if ( empty( $group ) ) - $group = 'default'; - - if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) - $key = $this->blog_prefix . $key; - - if ( $this->_exists( $key, $group ) ) { - $found = true; - $this->cache_hits += 1; - if ( is_object($this->cache[$group][$key]) ) - return clone $this->cache[$group][$key]; - else - return $this->cache[$group][$key]; - } - - $found = false; - $this->cache_misses += 1; - return false; - } - - /** - * Increments numeric cache item's value. - * - * @since 3.3.0 - * @access public - * - * @param int|string $key The cache key to increment - * @param int $offset Optional. The amount by which to increment the item's value. Default 1. - * @param string $group Optional. The group the key is in. Default 'default'. - * @return false|int False on failure, the item's new value on success. - */ - public function incr( $key, $offset = 1, $group = 'default' ) { - if ( empty( $group ) ) - $group = 'default'; - - if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) - $key = $this->blog_prefix . $key; - - if ( ! $this->_exists( $key, $group ) ) - return false; - - if ( ! is_numeric( $this->cache[ $group ][ $key ] ) ) - $this->cache[ $group ][ $key ] = 0; - - $offset = (int) $offset; - - $this->cache[ $group ][ $key ] += $offset; - - if ( $this->cache[ $group ][ $key ] < 0 ) - $this->cache[ $group ][ $key ] = 0; - - return $this->cache[ $group ][ $key ]; - } - - /** - * Replaces the contents in the cache, if contents already exist. - * - * @since 2.0.0 - * @access public - * - * @see WP_Object_Cache::set() - * - * @param int|string $key What to call the contents in the cache. - * @param mixed $data The contents to store in the cache. - * @param string $group Optional. Where to group the cache contents. Default 'default'. - * @param int $expire Optional. When to expire the cache contents. Default 0 (no expiration). - * @return bool False if not exists, true if contents were replaced. - */ - public function replace( $key, $data, $group = 'default', $expire = 0 ) { - if ( empty( $group ) ) - $group = 'default'; - - $id = $key; - if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) - $id = $this->blog_prefix . $key; - - if ( ! $this->_exists( $id, $group ) ) - return false; - - return $this->set( $key, $data, $group, (int) $expire ); - } - - /** - * Resets cache keys. - * - * @since 3.0.0 - * @access public - * - * @deprecated 3.5.0 Use switch_to_blog() - * @see switch_to_blog() - */ - public function reset() { - _deprecated_function( __FUNCTION__, '3.5.0', 'switch_to_blog()' ); - - // Clear out non-global caches since the blog ID has changed. - foreach ( array_keys( $this->cache ) as $group ) { - if ( ! isset( $this->global_groups[ $group ] ) ) - unset( $this->cache[ $group ] ); - } - } - - /** - * Sets the data contents into the cache. - * - * The cache contents is grouped by the $group parameter followed by the - * $key. This allows for duplicate ids in unique groups. Therefore, naming of - * the group should be used with care and should follow normal function - * naming guidelines outside of core WordPress usage. - * - * The $expire parameter is not used, because the cache will automatically - * expire for each time a page is accessed and PHP finishes. The method is - * more for cache plugins which use files. - * - * @since 2.0.0 - * @access public - * - * @param int|string $key What to call the contents in the cache. - * @param mixed $data The contents to store in the cache. - * @param string $group Optional. Where to group the cache contents. Default 'default'. - * @param int $expire Not Used. - * @return true Always returns true. - */ - public function set( $key, $data, $group = 'default', $expire = 0 ) { - if ( empty( $group ) ) - $group = 'default'; - - if ( $this->multisite && ! isset( $this->global_groups[ $group ] ) ) - $key = $this->blog_prefix . $key; - - if ( is_object( $data ) ) - $data = clone $data; - - $this->cache[$group][$key] = $data; - return true; - } - - /** - * Echoes the stats of the caching. - * - * Gives the cache hits, and cache misses. Also prints every cached group, - * key and the data. - * - * @since 2.0.0 - * @access public - */ - public function stats() { - echo "<p>"; - echo "<strong>Cache Hits:</strong> {$this->cache_hits}<br />"; - echo "<strong>Cache Misses:</strong> {$this->cache_misses}<br />"; - echo "</p>"; - echo '<ul>'; - foreach ($this->cache as $group => $cache) { - echo "<li><strong>Group:</strong> $group - ( " . number_format( strlen( serialize( $cache ) ) / KB_IN_BYTES, 2 ) . 'k )</li>'; - } - echo '</ul>'; - } - - /** - * Switches the internal blog ID. - * - * This changes the blog ID used to create keys in blog specific groups. - * - * @since 3.5.0 - * @access public - * - * @param int $blog_id Blog ID. - */ - public function switch_to_blog( $blog_id ) { - $blog_id = (int) $blog_id; - $this->blog_prefix = $this->multisite ? $blog_id . ':' : ''; - } - - /** - * Serves as a utility function to determine whether a key exists in the cache. - * - * @since 3.4.0 - * @access protected - * - * @param int|string $key Cache key to check for existence. - * @param string $group Cache group for the key existence check. - * @return bool Whether the key exists in the cache for the given group. - */ - protected function _exists( $key, $group ) { - return isset( $this->cache[ $group ] ) && ( isset( $this->cache[ $group ][ $key ] ) || array_key_exists( $key, $this->cache[ $group ] ) ); - } - - /** - * Sets up object properties; PHP 5 style constructor. - * - * @since 2.0.8 - */ - public function __construct() { - $this->multisite = is_multisite(); - $this->blog_prefix = $this->multisite ? get_current_blog_id() . ':' : ''; - - - /** - * @todo This should be moved to the PHP4 style constructor, PHP5 - * already calls __destruct() - */ - register_shutdown_function( array( $this, '__destruct' ) ); - } - - /** - * Saves the object cache before object is completely destroyed. - * - * Called upon object destruction, which should be when PHP ends. - * - * @since 2.0.8 - * - * @return true Always returns true. - */ - public function __destruct() { - return true; - } -} diff --git a/wp/wp-includes/canonical.php b/wp/wp-includes/canonical.php deleted file mode 100644 index 11c513d3..00000000 --- a/wp/wp-includes/canonical.php +++ /dev/null @@ -1,657 +0,0 @@ -<?php -/** - * Canonical API to handle WordPress Redirecting - * - * Based on "Permalink Redirect" from Scott Yang and "Enforce www. Preference" - * by Mark Jaquith - * - * @package WordPress - * @since 2.3.0 - */ - -/** - * Redirects incoming links to the proper URL based on the site url. - * - * Search engines consider www.somedomain.com and somedomain.com to be two - * different URLs when they both go to the same location. This SEO enhancement - * prevents penalty for duplicate content by redirecting all incoming links to - * one or the other. - * - * Prevents redirection for feeds, trackbacks, searches, and - * admin URLs. Does not redirect on non-pretty-permalink-supporting IIS 7+, - * page/post previews, WP admin, Trackbacks, robots.txt, searches, or on POST - * requests. - * - * Will also attempt to find the correct link when a user enters a URL that does - * not exist based on exact WordPress query. Will instead try to parse the URL - * or query in an attempt to figure the correct page to go to. - * - * @since 2.3.0 - * - * @global WP_Rewrite $wp_rewrite - * @global bool $is_IIS - * @global WP_Query $wp_query - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $requested_url Optional. The URL that was requested, used to - * figure if redirect is needed. - * @param bool $do_redirect Optional. Redirect to the new URL. - * @return string|void The string of the URL, if redirect needed. - */ -function redirect_canonical( $requested_url = null, $do_redirect = true ) { - global $wp_rewrite, $is_IIS, $wp_query, $wpdb, $wp; - - if ( isset( $_SERVER['REQUEST_METHOD'] ) && ! in_array( strtoupper( $_SERVER['REQUEST_METHOD'] ), array( 'GET', 'HEAD' ) ) ) { - return; - } - - // If we're not in wp-admin and the post has been published and preview nonce - // is non-existent or invalid then no need for preview in query - if ( is_preview() && get_query_var( 'p' ) && 'publish' == get_post_status( get_query_var( 'p' ) ) ) { - if ( ! isset( $_GET['preview_id'] ) - || ! isset( $_GET['preview_nonce'] ) - || ! wp_verify_nonce( $_GET['preview_nonce'], 'post_preview_' . (int) $_GET['preview_id'] ) ) { - $wp_query->is_preview = false; - } - } - - if ( is_trackback() || is_search() || is_admin() || is_preview() || is_robots() || ( $is_IIS && !iis7_supports_permalinks() ) ) { - return; - } - - if ( ! $requested_url && isset( $_SERVER['HTTP_HOST'] ) ) { - // build the URL in the address bar - $requested_url = is_ssl() ? 'https://' : 'http://'; - $requested_url .= $_SERVER['HTTP_HOST']; - $requested_url .= $_SERVER['REQUEST_URI']; - } - - $original = @parse_url($requested_url); - if ( false === $original ) { - return; - } - - $redirect = $original; - $redirect_url = false; - - // Notice fixing - if ( !isset($redirect['path']) ) - $redirect['path'] = ''; - if ( !isset($redirect['query']) ) - $redirect['query'] = ''; - - // If the original URL ended with non-breaking spaces, they were almost - // certainly inserted by accident. Let's remove them, so the reader doesn't - // see a 404 error with no obvious cause. - $redirect['path'] = preg_replace( '|(%C2%A0)+$|i', '', $redirect['path'] ); - - // It's not a preview, so remove it from URL - if ( get_query_var( 'preview' ) ) { - $redirect['query'] = remove_query_arg( 'preview', $redirect['query'] ); - } - - if ( is_feed() && ( $id = get_query_var( 'p' ) ) ) { - if ( $redirect_url = get_post_comments_feed_link( $id, get_query_var( 'feed' ) ) ) { - $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type', 'feed'), $redirect_url ); - $redirect['path'] = parse_url( $redirect_url, PHP_URL_PATH ); - } - } - - if ( is_singular() && 1 > $wp_query->post_count && ($id = get_query_var('p')) ) { - - $vars = $wpdb->get_results( $wpdb->prepare("SELECT post_type, post_parent FROM $wpdb->posts WHERE ID = %d", $id) ); - - if ( isset($vars[0]) && $vars = $vars[0] ) { - if ( 'revision' == $vars->post_type && $vars->post_parent > 0 ) - $id = $vars->post_parent; - - if ( $redirect_url = get_permalink($id) ) - $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url ); - } - } - - // These tests give us a WP-generated permalink - if ( is_404() ) { - - // Redirect ?page_id, ?p=, ?attachment_id= to their respective url's - $id = max( get_query_var('p'), get_query_var('page_id'), get_query_var('attachment_id') ); - if ( $id && $redirect_post = get_post($id) ) { - $post_type_obj = get_post_type_object($redirect_post->post_type); - if ( $post_type_obj->public && 'auto-draft' != $redirect_post->post_status ) { - $redirect_url = get_permalink($redirect_post); - $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url ); - } - } - - if ( get_query_var( 'day' ) && get_query_var( 'monthnum' ) && get_query_var( 'year' ) ) { - $year = get_query_var( 'year' ); - $month = get_query_var( 'monthnum' ); - $day = get_query_var( 'day' ); - $date = sprintf( '%04d-%02d-%02d', $year, $month, $day ); - if ( ! wp_checkdate( $month, $day, $year, $date ) ) { - $redirect_url = get_month_link( $year, $month ); - $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'year', 'monthnum', 'day' ), $redirect_url ); - } - } elseif ( get_query_var( 'monthnum' ) && get_query_var( 'year' ) && 12 < get_query_var( 'monthnum' ) ) { - $redirect_url = get_year_link( get_query_var( 'year' ) ); - $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'year', 'monthnum' ), $redirect_url ); - } - - if ( ! $redirect_url ) { - if ( $redirect_url = redirect_guess_404_permalink() ) { - $redirect['query'] = _remove_qs_args_if_not_in_url( $redirect['query'], array( 'page', 'feed', 'p', 'page_id', 'attachment_id', 'pagename', 'name', 'post_type' ), $redirect_url ); - } - } - - if ( get_query_var( 'page' ) && $wp_query->post && - false !== strpos( $wp_query->post->post_content, '<!--nextpage-->' ) ) { - $redirect['path'] = rtrim( $redirect['path'], (int) get_query_var( 'page' ) . '/' ); - $redirect['query'] = remove_query_arg( 'page', $redirect['query'] ); - $redirect_url = get_permalink( $wp_query->post->ID ); - } - - } elseif ( is_object($wp_rewrite) && $wp_rewrite->using_permalinks() ) { - // rewriting of old ?p=X, ?m=2004, ?m=200401, ?m=20040101 - if ( is_attachment() && - ! array_diff( array_keys( $wp->query_vars ), array( 'attachment', 'attachment_id' ) ) && - ! $redirect_url ) { - if ( ! empty( $_GET['attachment_id'] ) ) { - $redirect_url = get_attachment_link( get_query_var( 'attachment_id' ) ); - if ( $redirect_url ) { - $redirect['query'] = remove_query_arg( 'attachment_id', $redirect['query'] ); - } - } else { - $redirect_url = get_attachment_link(); - } - } elseif ( is_single() && !empty($_GET['p']) && ! $redirect_url ) { - if ( $redirect_url = get_permalink(get_query_var('p')) ) - $redirect['query'] = remove_query_arg(array('p', 'post_type'), $redirect['query']); - } elseif ( is_single() && !empty($_GET['name']) && ! $redirect_url ) { - if ( $redirect_url = get_permalink( $wp_query->get_queried_object_id() ) ) - $redirect['query'] = remove_query_arg('name', $redirect['query']); - } elseif ( is_page() && !empty($_GET['page_id']) && ! $redirect_url ) { - if ( $redirect_url = get_permalink(get_query_var('page_id')) ) - $redirect['query'] = remove_query_arg('page_id', $redirect['query']); - } elseif ( is_page() && !is_feed() && 'page' == get_option('show_on_front') && get_queried_object_id() == get_option('page_on_front') && ! $redirect_url ) { - $redirect_url = home_url('/'); - } elseif ( is_home() && !empty($_GET['page_id']) && 'page' == get_option('show_on_front') && get_query_var('page_id') == get_option('page_for_posts') && ! $redirect_url ) { - if ( $redirect_url = get_permalink(get_option('page_for_posts')) ) - $redirect['query'] = remove_query_arg('page_id', $redirect['query']); - } elseif ( !empty($_GET['m']) && ( is_year() || is_month() || is_day() ) ) { - $m = get_query_var('m'); - switch ( strlen($m) ) { - case 4: // Yearly - $redirect_url = get_year_link($m); - break; - case 6: // Monthly - $redirect_url = get_month_link( substr($m, 0, 4), substr($m, 4, 2) ); - break; - case 8: // Daily - $redirect_url = get_day_link(substr($m, 0, 4), substr($m, 4, 2), substr($m, 6, 2)); - break; - } - if ( $redirect_url ) - $redirect['query'] = remove_query_arg('m', $redirect['query']); - // now moving on to non ?m=X year/month/day links - } elseif ( is_day() && get_query_var('year') && get_query_var('monthnum') && !empty($_GET['day']) ) { - if ( $redirect_url = get_day_link(get_query_var('year'), get_query_var('monthnum'), get_query_var('day')) ) - $redirect['query'] = remove_query_arg(array('year', 'monthnum', 'day'), $redirect['query']); - } elseif ( is_month() && get_query_var('year') && !empty($_GET['monthnum']) ) { - if ( $redirect_url = get_month_link(get_query_var('year'), get_query_var('monthnum')) ) - $redirect['query'] = remove_query_arg(array('year', 'monthnum'), $redirect['query']); - } elseif ( is_year() && !empty($_GET['year']) ) { - if ( $redirect_url = get_year_link(get_query_var('year')) ) - $redirect['query'] = remove_query_arg('year', $redirect['query']); - } elseif ( is_author() && !empty($_GET['author']) && preg_match( '|^[0-9]+$|', $_GET['author'] ) ) { - $author = get_userdata(get_query_var('author')); - if ( ( false !== $author ) && $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE $wpdb->posts.post_author = %d AND $wpdb->posts.post_status = 'publish' LIMIT 1", $author->ID ) ) ) { - if ( $redirect_url = get_author_posts_url($author->ID, $author->user_nicename) ) - $redirect['query'] = remove_query_arg('author', $redirect['query']); - } - } elseif ( is_category() || is_tag() || is_tax() ) { // Terms (Tags/categories) - - $term_count = 0; - foreach ( $wp_query->tax_query->queried_terms as $tax_query ) - $term_count += count( $tax_query['terms'] ); - - $obj = $wp_query->get_queried_object(); - if ( $term_count <= 1 && !empty($obj->term_id) && ( $tax_url = get_term_link((int)$obj->term_id, $obj->taxonomy) ) && !is_wp_error($tax_url) ) { - if ( !empty($redirect['query']) ) { - // Strip taxonomy query vars off the url. - $qv_remove = array( 'term', 'taxonomy'); - if ( is_category() ) { - $qv_remove[] = 'category_name'; - $qv_remove[] = 'cat'; - } elseif ( is_tag() ) { - $qv_remove[] = 'tag'; - $qv_remove[] = 'tag_id'; - } else { // Custom taxonomies will have a custom query var, remove those too: - $tax_obj = get_taxonomy( $obj->taxonomy ); - if ( false !== $tax_obj->query_var ) - $qv_remove[] = $tax_obj->query_var; - } - - $rewrite_vars = array_diff( array_keys($wp_query->query), array_keys($_GET) ); - - if ( !array_diff($rewrite_vars, array_keys($_GET)) ) { // Check to see if all the Query vars are coming from the rewrite, none are set via $_GET - $redirect['query'] = remove_query_arg($qv_remove, $redirect['query']); //Remove all of the per-tax qv's - - // Create the destination url for this taxonomy - $tax_url = parse_url($tax_url); - if ( ! empty($tax_url['query']) ) { // Taxonomy accessible via ?taxonomy=..&term=.. or any custom qv.. - parse_str($tax_url['query'], $query_vars); - $redirect['query'] = add_query_arg($query_vars, $redirect['query']); - } else { // Taxonomy is accessible via a "pretty-URL" - $redirect['path'] = $tax_url['path']; - } - - } else { // Some query vars are set via $_GET. Unset those from $_GET that exist via the rewrite - foreach ( $qv_remove as $_qv ) { - if ( isset($rewrite_vars[$_qv]) ) - $redirect['query'] = remove_query_arg($_qv, $redirect['query']); - } - } - } - - } - } elseif ( is_single() && strpos($wp_rewrite->permalink_structure, '%category%') !== false && $cat = get_query_var( 'category_name' ) ) { - $category = get_category_by_path( $cat ); - if ( ( ! $category || is_wp_error( $category ) ) || ! has_term( $category->term_id, 'category', $wp_query->get_queried_object_id() ) ) { - $redirect_url = get_permalink($wp_query->get_queried_object_id()); - } - } - - // Post Paging - if ( is_singular() && get_query_var('page') ) { - if ( !$redirect_url ) - $redirect_url = get_permalink( get_queried_object_id() ); - - $page = get_query_var( 'page' ); - if ( $page > 1 ) { - if ( is_front_page() ) { - $redirect_url = trailingslashit( $redirect_url ) . user_trailingslashit( "$wp_rewrite->pagination_base/$page", 'paged' ); - } else { - $redirect_url = trailingslashit( $redirect_url ) . user_trailingslashit( $page, 'single_paged' ); - } - } - $redirect['query'] = remove_query_arg( 'page', $redirect['query'] ); - } - - // paging and feeds - if ( get_query_var('paged') || is_feed() || get_query_var('cpage') ) { - while ( preg_match( "#/$wp_rewrite->pagination_base/?[0-9]+?(/+)?$#", $redirect['path'] ) || preg_match( '#/(comments/?)?(feed|rss|rdf|atom|rss2)(/+)?$#', $redirect['path'] ) || preg_match( "#/{$wp_rewrite->comments_pagination_base}-[0-9]+(/+)?$#", $redirect['path'] ) ) { - // Strip off paging and feed - $redirect['path'] = preg_replace("#/$wp_rewrite->pagination_base/?[0-9]+?(/+)?$#", '/', $redirect['path']); // strip off any existing paging - $redirect['path'] = preg_replace('#/(comments/?)?(feed|rss2?|rdf|atom)(/+|$)#', '/', $redirect['path']); // strip off feed endings - $redirect['path'] = preg_replace("#/{$wp_rewrite->comments_pagination_base}-[0-9]+?(/+)?$#", '/', $redirect['path']); // strip off any existing comment paging - } - - $addl_path = ''; - if ( is_feed() && in_array( get_query_var('feed'), $wp_rewrite->feeds ) ) { - $addl_path = !empty( $addl_path ) ? trailingslashit($addl_path) : ''; - if ( !is_singular() && get_query_var( 'withcomments' ) ) - $addl_path .= 'comments/'; - if ( ( 'rss' == get_default_feed() && 'feed' == get_query_var('feed') ) || 'rss' == get_query_var('feed') ) - $addl_path .= user_trailingslashit( 'feed/' . ( ( get_default_feed() == 'rss2' ) ? '' : 'rss2' ), 'feed' ); - else - $addl_path .= user_trailingslashit( 'feed/' . ( ( get_default_feed() == get_query_var('feed') || 'feed' == get_query_var('feed') ) ? '' : get_query_var('feed') ), 'feed' ); - $redirect['query'] = remove_query_arg( 'feed', $redirect['query'] ); - } elseif ( is_feed() && 'old' == get_query_var('feed') ) { - $old_feed_files = array( - 'wp-atom.php' => 'atom', - 'wp-commentsrss2.php' => 'comments_rss2', - 'wp-feed.php' => get_default_feed(), - 'wp-rdf.php' => 'rdf', - 'wp-rss.php' => 'rss2', - 'wp-rss2.php' => 'rss2', - ); - if ( isset( $old_feed_files[ basename( $redirect['path'] ) ] ) ) { - $redirect_url = get_feed_link( $old_feed_files[ basename( $redirect['path'] ) ] ); - wp_redirect( $redirect_url, 301 ); - die(); - } - } - - if ( get_query_var('paged') > 0 ) { - $paged = get_query_var('paged'); - $redirect['query'] = remove_query_arg( 'paged', $redirect['query'] ); - if ( !is_feed() ) { - if ( $paged > 1 && !is_single() ) { - $addl_path = ( !empty( $addl_path ) ? trailingslashit($addl_path) : '' ) . user_trailingslashit("$wp_rewrite->pagination_base/$paged", 'paged'); - } elseif ( !is_single() ) { - $addl_path = !empty( $addl_path ) ? trailingslashit($addl_path) : ''; - } - } elseif ( $paged > 1 ) { - $redirect['query'] = add_query_arg( 'paged', $paged, $redirect['query'] ); - } - } - - if ( get_option( 'page_comments' ) && ( - ( 'newest' == get_option( 'default_comments_page' ) && get_query_var( 'cpage' ) > 0 ) || - ( 'newest' != get_option( 'default_comments_page' ) && get_query_var( 'cpage' ) > 1 ) - ) ) { - $addl_path = ( !empty( $addl_path ) ? trailingslashit($addl_path) : '' ) . user_trailingslashit( $wp_rewrite->comments_pagination_base . '-' . get_query_var('cpage'), 'commentpaged' ); - $redirect['query'] = remove_query_arg( 'cpage', $redirect['query'] ); - } - - $redirect['path'] = user_trailingslashit( preg_replace('|/' . preg_quote( $wp_rewrite->index, '|' ) . '/?$|', '/', $redirect['path']) ); // strip off trailing /index.php/ - if ( !empty( $addl_path ) && $wp_rewrite->using_index_permalinks() && strpos($redirect['path'], '/' . $wp_rewrite->index . '/') === false ) - $redirect['path'] = trailingslashit($redirect['path']) . $wp_rewrite->index . '/'; - if ( !empty( $addl_path ) ) - $redirect['path'] = trailingslashit($redirect['path']) . $addl_path; - $redirect_url = $redirect['scheme'] . '://' . $redirect['host'] . $redirect['path']; - } - - if ( 'wp-register.php' == basename( $redirect['path'] ) ) { - if ( is_multisite() ) { - /** This filter is documented in wp-login.php */ - $redirect_url = apply_filters( 'wp_signup_location', network_site_url( 'wp-signup.php' ) ); - } else { - $redirect_url = wp_registration_url(); - } - - wp_redirect( $redirect_url, 301 ); - die(); - } - } - - // tack on any additional query vars - $redirect['query'] = preg_replace( '#^\??&*?#', '', $redirect['query'] ); - if ( $redirect_url && !empty($redirect['query']) ) { - parse_str( $redirect['query'], $_parsed_query ); - $redirect = @parse_url($redirect_url); - - if ( ! empty( $_parsed_query['name'] ) && ! empty( $redirect['query'] ) ) { - parse_str( $redirect['query'], $_parsed_redirect_query ); - - if ( empty( $_parsed_redirect_query['name'] ) ) - unset( $_parsed_query['name'] ); - } - - $_parsed_query = rawurlencode_deep( $_parsed_query ); - $redirect_url = add_query_arg( $_parsed_query, $redirect_url ); - } - - if ( $redirect_url ) - $redirect = @parse_url($redirect_url); - - // www.example.com vs example.com - $user_home = @parse_url(home_url()); - if ( !empty($user_home['host']) ) - $redirect['host'] = $user_home['host']; - if ( empty($user_home['path']) ) - $user_home['path'] = '/'; - - // Handle ports - if ( !empty($user_home['port']) ) - $redirect['port'] = $user_home['port']; - else - unset($redirect['port']); - - // trailing /index.php - $redirect['path'] = preg_replace('|/' . preg_quote( $wp_rewrite->index, '|' ) . '/*?$|', '/', $redirect['path']); - - // Remove trailing spaces from the path - $redirect['path'] = preg_replace( '#(%20| )+$#', '', $redirect['path'] ); - - if ( !empty( $redirect['query'] ) ) { - // Remove trailing spaces from certain terminating query string args - $redirect['query'] = preg_replace( '#((p|page_id|cat|tag)=[^&]*?)(%20| )+$#', '$1', $redirect['query'] ); - - // Clean up empty query strings - $redirect['query'] = trim(preg_replace( '#(^|&)(p|page_id|cat|tag)=?(&|$)#', '&', $redirect['query']), '&'); - - // Redirect obsolete feeds - $redirect['query'] = preg_replace( '#(^|&)feed=rss(&|$)#', '$1feed=rss2$2', $redirect['query'] ); - - // Remove redundant leading ampersands - $redirect['query'] = preg_replace( '#^\??&*?#', '', $redirect['query'] ); - } - - // strip /index.php/ when we're not using PATHINFO permalinks - if ( !$wp_rewrite->using_index_permalinks() ) - $redirect['path'] = str_replace( '/' . $wp_rewrite->index . '/', '/', $redirect['path'] ); - - // trailing slashes - if ( is_object($wp_rewrite) && $wp_rewrite->using_permalinks() && !is_404() && (!is_front_page() || ( is_front_page() && (get_query_var('paged') > 1) ) ) ) { - $user_ts_type = ''; - if ( get_query_var('paged') > 0 ) { - $user_ts_type = 'paged'; - } else { - foreach ( array('single', 'category', 'page', 'day', 'month', 'year', 'home') as $type ) { - $func = 'is_' . $type; - if ( call_user_func($func) ) { - $user_ts_type = $type; - break; - } - } - } - $redirect['path'] = user_trailingslashit($redirect['path'], $user_ts_type); - } elseif ( is_front_page() ) { - $redirect['path'] = trailingslashit($redirect['path']); - } - - // Strip multiple slashes out of the URL - if ( strpos($redirect['path'], '//') > -1 ) - $redirect['path'] = preg_replace('|/+|', '/', $redirect['path']); - - // Always trailing slash the Front Page URL - if ( trailingslashit( $redirect['path'] ) == trailingslashit( $user_home['path'] ) ) - $redirect['path'] = trailingslashit($redirect['path']); - - // Ignore differences in host capitalization, as this can lead to infinite redirects - // Only redirect no-www <=> yes-www - if ( strtolower($original['host']) == strtolower($redirect['host']) || - ( strtolower($original['host']) != 'www.' . strtolower($redirect['host']) && 'www.' . strtolower($original['host']) != strtolower($redirect['host']) ) ) - $redirect['host'] = $original['host']; - - $compare_original = array( $original['host'], $original['path'] ); - - if ( !empty( $original['port'] ) ) - $compare_original[] = $original['port']; - - if ( !empty( $original['query'] ) ) - $compare_original[] = $original['query']; - - $compare_redirect = array( $redirect['host'], $redirect['path'] ); - - if ( !empty( $redirect['port'] ) ) - $compare_redirect[] = $redirect['port']; - - if ( !empty( $redirect['query'] ) ) - $compare_redirect[] = $redirect['query']; - - if ( $compare_original !== $compare_redirect ) { - $redirect_url = $redirect['scheme'] . '://' . $redirect['host']; - if ( !empty($redirect['port']) ) - $redirect_url .= ':' . $redirect['port']; - $redirect_url .= $redirect['path']; - if ( !empty($redirect['query']) ) - $redirect_url .= '?' . $redirect['query']; - } - - if ( ! $redirect_url || $redirect_url == $requested_url ) { - return; - } - - // Hex encoded octets are case-insensitive. - if ( false !== strpos($requested_url, '%') ) { - if ( !function_exists('lowercase_octets') ) { - /** - * Converts the first hex-encoded octet match to lowercase. - * - * @since 3.1.0 - * @ignore - * - * @param array $matches Hex-encoded octet matches for the requested URL. - * @return string Lowercased version of the first match. - */ - function lowercase_octets($matches) { - return strtolower( $matches[0] ); - } - } - $requested_url = preg_replace_callback('|%[a-fA-F0-9][a-fA-F0-9]|', 'lowercase_octets', $requested_url); - } - - /** - * Filters the canonical redirect URL. - * - * Returning false to this filter will cancel the redirect. - * - * @since 2.3.0 - * - * @param string $redirect_url The redirect URL. - * @param string $requested_url The requested URL. - */ - $redirect_url = apply_filters( 'redirect_canonical', $redirect_url, $requested_url ); - - // yes, again -- in case the filter aborted the request - if ( ! $redirect_url || strip_fragment_from_url( $redirect_url ) == strip_fragment_from_url( $requested_url ) ) { - return; - } - - if ( $do_redirect ) { - // protect against chained redirects - if ( !redirect_canonical($redirect_url, false) ) { - wp_redirect($redirect_url, 301); - exit(); - } else { - // Debug - // die("1: $redirect_url<br />2: " . redirect_canonical( $redirect_url, false ) ); - return; - } - } else { - return $redirect_url; - } -} - -/** - * Removes arguments from a query string if they are not present in a URL - * DO NOT use this in plugin code. - * - * @since 3.4.0 - * @access private - * - * @param string $query_string - * @param array $args_to_check - * @param string $url - * @return string The altered query string - */ -function _remove_qs_args_if_not_in_url( $query_string, Array $args_to_check, $url ) { - $parsed_url = @parse_url( $url ); - if ( ! empty( $parsed_url['query'] ) ) { - parse_str( $parsed_url['query'], $parsed_query ); - foreach ( $args_to_check as $qv ) { - if ( !isset( $parsed_query[$qv] ) ) - $query_string = remove_query_arg( $qv, $query_string ); - } - } else { - $query_string = remove_query_arg( $args_to_check, $query_string ); - } - return $query_string; -} - -/** - * Strips the #fragment from a URL, if one is present. - * - * @since 4.4.0 - * - * @param string $url The URL to strip. - * @return string The altered URL. - */ -function strip_fragment_from_url( $url ) { - $parsed_url = @parse_url( $url ); - if ( ! empty( $parsed_url['host'] ) ) { - // This mirrors code in redirect_canonical(). It does not handle every case. - $url = $parsed_url['scheme'] . '://' . $parsed_url['host']; - if ( ! empty( $parsed_url['port'] ) ) { - $url .= ':' . $parsed_url['port']; - } - $url .= $parsed_url['path']; - if ( ! empty( $parsed_url['query'] ) ) { - $url .= '?' . $parsed_url['query']; - } - } - - return $url; -} - -/** - * Attempts to guess the correct URL based on query vars - * - * @since 2.3.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @return false|string The correct URL if one is found. False on failure. - */ -function redirect_guess_404_permalink() { - global $wpdb; - - if ( get_query_var('name') ) { - $where = $wpdb->prepare("post_name LIKE %s", $wpdb->esc_like( get_query_var('name') ) . '%'); - - // if any of post_type, year, monthnum, or day are set, use them to refine the query - if ( get_query_var('post_type') ) - $where .= $wpdb->prepare(" AND post_type = %s", get_query_var('post_type')); - else - $where .= " AND post_type IN ('" . implode( "', '", get_post_types( array( 'public' => true ) ) ) . "')"; - - if ( get_query_var('year') ) - $where .= $wpdb->prepare(" AND YEAR(post_date) = %d", get_query_var('year')); - if ( get_query_var('monthnum') ) - $where .= $wpdb->prepare(" AND MONTH(post_date) = %d", get_query_var('monthnum')); - if ( get_query_var('day') ) - $where .= $wpdb->prepare(" AND DAYOFMONTH(post_date) = %d", get_query_var('day')); - - $post_id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE $where AND post_status = 'publish'"); - if ( ! $post_id ) - return false; - if ( get_query_var( 'feed' ) ) - return get_post_comments_feed_link( $post_id, get_query_var( 'feed' ) ); - elseif ( get_query_var( 'page' ) && 1 < get_query_var( 'page' ) ) - return trailingslashit( get_permalink( $post_id ) ) . user_trailingslashit( get_query_var( 'page' ), 'single_paged' ); - else - return get_permalink( $post_id ); - } - - return false; -} - -/** - * Redirects a variety of shorthand URLs to the admin. - * - * If a user visits example.com/admin, they'll be redirected to /wp-admin. - * Visiting /login redirects to /wp-login.php, and so on. - * - * @since 3.4.0 - * - * @global WP_Rewrite $wp_rewrite - */ -function wp_redirect_admin_locations() { - global $wp_rewrite; - if ( ! ( is_404() && $wp_rewrite->using_permalinks() ) ) - return; - - $admins = array( - home_url( 'wp-admin', 'relative' ), - home_url( 'dashboard', 'relative' ), - home_url( 'admin', 'relative' ), - site_url( 'dashboard', 'relative' ), - site_url( 'admin', 'relative' ), - ); - if ( in_array( untrailingslashit( $_SERVER['REQUEST_URI'] ), $admins ) ) { - wp_redirect( admin_url() ); - exit; - } - - $logins = array( - home_url( 'wp-login.php', 'relative' ), - home_url( 'login', 'relative' ), - site_url( 'login', 'relative' ), - ); - if ( in_array( untrailingslashit( $_SERVER['REQUEST_URI'] ), $logins ) ) { - wp_redirect( wp_login_url() ); - exit; - } -} diff --git a/wp/wp-includes/capabilities.php b/wp/wp-includes/capabilities.php deleted file mode 100644 index c1e644a8..00000000 --- a/wp/wp-includes/capabilities.php +++ /dev/null @@ -1,811 +0,0 @@ -<?php -/** - * Core User Role & Capabilities API - * - * @package WordPress - * @subpackage Users - */ - -/** - * Map meta capabilities to primitive capabilities. - * - * This does not actually compare whether the user ID has the actual capability, - * just what the capability or capabilities are. Meta capability list value can - * be 'delete_user', 'edit_user', 'remove_user', 'promote_user', 'delete_post', - * 'delete_page', 'edit_post', 'edit_page', 'read_post', or 'read_page'. - * - * @since 2.0.0 - * - * @global array $post_type_meta_caps Used to get post type meta capabilities. - * - * @param string $cap Capability name. - * @param int $user_id User ID. - * @param int $object_id Optional. ID of the specific object to check against if `$cap` is a "meta" cap. - * "Meta" capabilities, e.g. 'edit_post', 'edit_user', etc., are capabilities used - * by map_meta_cap() to map to other "primitive" capabilities, e.g. 'edit_posts', - * 'edit_others_posts', etc. The parameter is accessed via func_get_args(). - * @return array Actual capabilities for meta capability. - */ -function map_meta_cap( $cap, $user_id ) { - $args = array_slice( func_get_args(), 2 ); - $caps = array(); - - switch ( $cap ) { - case 'remove_user': - $caps[] = 'remove_users'; - break; - case 'promote_user': - case 'add_users': - $caps[] = 'promote_users'; - break; - case 'edit_user': - case 'edit_users': - // Allow user to edit itself - if ( 'edit_user' == $cap && isset( $args[0] ) && $user_id == $args[0] ) - break; - - // In multisite the user must have manage_network_users caps. If editing a super admin, the user must be a super admin. - if ( is_multisite() && ( ( ! is_super_admin( $user_id ) && 'edit_user' === $cap && is_super_admin( $args[0] ) ) || ! user_can( $user_id, 'manage_network_users' ) ) ) { - $caps[] = 'do_not_allow'; - } else { - $caps[] = 'edit_users'; // edit_user maps to edit_users. - } - break; - case 'delete_post': - case 'delete_page': - $post = get_post( $args[0] ); - if ( ! $post ) { - $caps[] = 'do_not_allow'; - break; - } - - if ( 'revision' == $post->post_type ) { - $post = get_post( $post->post_parent ); - if ( ! $post ) { - $caps[] = 'do_not_allow'; - break; - } - } - - if ( ( get_option( 'page_for_posts' ) == $post->ID ) || ( get_option( 'page_on_front' ) == $post->ID ) ) { - $caps[] = 'manage_options'; - break; - } - - $post_type = get_post_type_object( $post->post_type ); - if ( ! $post_type ) { - /* translators: 1: post type, 2: capability name */ - _doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability "%2$s" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' ); - $caps[] = 'edit_others_posts'; - break; - } - - if ( ! $post_type->map_meta_cap ) { - $caps[] = $post_type->cap->$cap; - // Prior to 3.1 we would re-call map_meta_cap here. - if ( 'delete_post' == $cap ) - $cap = $post_type->cap->$cap; - break; - } - - // If the post author is set and the user is the author... - if ( $post->post_author && $user_id == $post->post_author ) { - // If the post is published or scheduled... - if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { - $caps[] = $post_type->cap->delete_published_posts; - } elseif ( 'trash' == $post->post_status ) { - $status = get_post_meta( $post->ID, '_wp_trash_meta_status', true ); - if ( in_array( $status, array( 'publish', 'future' ), true ) ) { - $caps[] = $post_type->cap->delete_published_posts; - } else { - $caps[] = $post_type->cap->delete_posts; - } - } else { - // If the post is draft... - $caps[] = $post_type->cap->delete_posts; - } - } else { - // The user is trying to edit someone else's post. - $caps[] = $post_type->cap->delete_others_posts; - // The post is published or scheduled, extra cap required. - if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { - $caps[] = $post_type->cap->delete_published_posts; - } elseif ( 'private' == $post->post_status ) { - $caps[] = $post_type->cap->delete_private_posts; - } - } - break; - // edit_post breaks down to edit_posts, edit_published_posts, or - // edit_others_posts - case 'edit_post': - case 'edit_page': - $post = get_post( $args[0] ); - if ( ! $post ) { - $caps[] = 'do_not_allow'; - break; - } - - if ( 'revision' == $post->post_type ) { - $post = get_post( $post->post_parent ); - if ( ! $post ) { - $caps[] = 'do_not_allow'; - break; - } - } - - $post_type = get_post_type_object( $post->post_type ); - if ( ! $post_type ) { - /* translators: 1: post type, 2: capability name */ - _doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability "%2$s" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' ); - $caps[] = 'edit_others_posts'; - break; - } - - if ( ! $post_type->map_meta_cap ) { - $caps[] = $post_type->cap->$cap; - // Prior to 3.1 we would re-call map_meta_cap here. - if ( 'edit_post' == $cap ) - $cap = $post_type->cap->$cap; - break; - } - - // If the post author is set and the user is the author... - if ( $post->post_author && $user_id == $post->post_author ) { - // If the post is published or scheduled... - if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { - $caps[] = $post_type->cap->edit_published_posts; - } elseif ( 'trash' == $post->post_status ) { - $status = get_post_meta( $post->ID, '_wp_trash_meta_status', true ); - if ( in_array( $status, array( 'publish', 'future' ), true ) ) { - $caps[] = $post_type->cap->edit_published_posts; - } else { - $caps[] = $post_type->cap->edit_posts; - } - } else { - // If the post is draft... - $caps[] = $post_type->cap->edit_posts; - } - } else { - // The user is trying to edit someone else's post. - $caps[] = $post_type->cap->edit_others_posts; - // The post is published or scheduled, extra cap required. - if ( in_array( $post->post_status, array( 'publish', 'future' ), true ) ) { - $caps[] = $post_type->cap->edit_published_posts; - } elseif ( 'private' == $post->post_status ) { - $caps[] = $post_type->cap->edit_private_posts; - } - } - break; - case 'read_post': - case 'read_page': - $post = get_post( $args[0] ); - if ( ! $post ) { - $caps[] = 'do_not_allow'; - break; - } - - if ( 'revision' == $post->post_type ) { - $post = get_post( $post->post_parent ); - if ( ! $post ) { - $caps[] = 'do_not_allow'; - break; - } - } - - $post_type = get_post_type_object( $post->post_type ); - if ( ! $post_type ) { - /* translators: 1: post type, 2: capability name */ - _doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability "%2$s" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' ); - $caps[] = 'edit_others_posts'; - break; - } - - if ( ! $post_type->map_meta_cap ) { - $caps[] = $post_type->cap->$cap; - // Prior to 3.1 we would re-call map_meta_cap here. - if ( 'read_post' == $cap ) - $cap = $post_type->cap->$cap; - break; - } - - $status_obj = get_post_status_object( $post->post_status ); - if ( $status_obj->public ) { - $caps[] = $post_type->cap->read; - break; - } - - if ( $post->post_author && $user_id == $post->post_author ) { - $caps[] = $post_type->cap->read; - } elseif ( $status_obj->private ) { - $caps[] = $post_type->cap->read_private_posts; - } else { - $caps = map_meta_cap( 'edit_post', $user_id, $post->ID ); - } - break; - case 'publish_post': - $post = get_post( $args[0] ); - if ( ! $post ) { - $caps[] = 'do_not_allow'; - break; - } - - $post_type = get_post_type_object( $post->post_type ); - if ( ! $post_type ) { - /* translators: 1: post type, 2: capability name */ - _doing_it_wrong( __FUNCTION__, sprintf( __( 'The post type %1$s is not registered, so it may not be reliable to check the capability "%2$s" against a post of that type.' ), $post->post_type, $cap ), '4.4.0' ); - $caps[] = 'edit_others_posts'; - break; - } - - $caps[] = $post_type->cap->publish_posts; - break; - case 'edit_post_meta': - case 'delete_post_meta': - case 'add_post_meta': - case 'edit_comment_meta': - case 'delete_comment_meta': - case 'add_comment_meta': - case 'edit_term_meta': - case 'delete_term_meta': - case 'add_term_meta': - case 'edit_user_meta': - case 'delete_user_meta': - case 'add_user_meta': - list( $_, $object_type, $_ ) = explode( '_', $cap ); - $object_id = (int) $args[0]; - - switch ( $object_type ) { - case 'post': - $post = get_post( $object_id ); - if ( ! $post ) { - break; - } - - $sub_type = get_post_type( $post ); - break; - - case 'comment': - $comment = get_comment( $object_id ); - if ( ! $comment ) { - break; - } - - $sub_type = empty( $comment->comment_type ) ? 'comment' : $comment->comment_type; - break; - - case 'term': - $term = get_term( $object_id ); - if ( ! $term ) { - break; - } - - $sub_type = $term->taxonomy; - break; - - case 'user': - $user = get_user_by( 'id', $object_id ); - if ( ! $user ) { - break; - } - - $sub_type = 'user'; - break; - } - - if ( empty( $sub_type ) ) { - $caps[] = 'do_not_allow'; - break; - } - - $caps = map_meta_cap( "edit_{$object_type}", $user_id, $object_id ); - - $meta_key = isset( $args[1] ) ? $args[1] : false; - - $has_filter = has_filter( "auth_{$object_type}_meta_{$meta_key}" ) || has_filter( "auth_{$object_type}_{$sub_type}_meta_{$meta_key}" ); - if ( $meta_key && $has_filter ) { - /** This filter is documented in wp-includes/meta.php */ - $allowed = apply_filters( "auth_{$object_type}_meta_{$meta_key}", false, $meta_key, $object_id, $user_id, $cap, $caps ); - - /** This filter is documented in wp-includes/meta.php */ - $allowed = apply_filters( "auth_{$object_type}_{$sub_type}_meta_{$meta_key}", $allowed, $meta_key, $object_id, $user_id, $cap, $caps ); - - if ( ! $allowed ) { - $caps[] = $cap; - } - } elseif ( $meta_key && is_protected_meta( $meta_key, $object_type ) ) { - $caps[] = $cap; - } - break; - case 'edit_comment': - $comment = get_comment( $args[0] ); - if ( ! $comment ) { - $caps[] = 'do_not_allow'; - break; - } - - $post = get_post( $comment->comment_post_ID ); - - /* - * If the post doesn't exist, we have an orphaned comment. - * Fall back to the edit_posts capability, instead. - */ - if ( $post ) { - $caps = map_meta_cap( 'edit_post', $user_id, $post->ID ); - } else { - $caps = map_meta_cap( 'edit_posts', $user_id ); - } - break; - case 'unfiltered_upload': - if ( defined('ALLOW_UNFILTERED_UPLOADS') && ALLOW_UNFILTERED_UPLOADS && ( !is_multisite() || is_super_admin( $user_id ) ) ) - $caps[] = $cap; - else - $caps[] = 'do_not_allow'; - break; - case 'edit_css' : - case 'unfiltered_html' : - // Disallow unfiltered_html for all users, even admins and super admins. - if ( defined( 'DISALLOW_UNFILTERED_HTML' ) && DISALLOW_UNFILTERED_HTML ) - $caps[] = 'do_not_allow'; - elseif ( is_multisite() && ! is_super_admin( $user_id ) ) - $caps[] = 'do_not_allow'; - else - $caps[] = 'unfiltered_html'; - break; - case 'edit_files': - case 'edit_plugins': - case 'edit_themes': - // Disallow the file editors. - if ( defined( 'DISALLOW_FILE_EDIT' ) && DISALLOW_FILE_EDIT ) - $caps[] = 'do_not_allow'; - elseif ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS ) - $caps[] = 'do_not_allow'; - elseif ( is_multisite() && ! is_super_admin( $user_id ) ) - $caps[] = 'do_not_allow'; - else - $caps[] = $cap; - break; - case 'update_plugins': - case 'delete_plugins': - case 'install_plugins': - case 'upload_plugins': - case 'update_themes': - case 'delete_themes': - case 'install_themes': - case 'upload_themes': - case 'update_core': - // Disallow anything that creates, deletes, or updates core, plugin, or theme files. - // Files in uploads are excepted. - if ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS ) { - $caps[] = 'do_not_allow'; - } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) { - $caps[] = 'do_not_allow'; - } elseif ( 'upload_themes' === $cap ) { - $caps[] = 'install_themes'; - } elseif ( 'upload_plugins' === $cap ) { - $caps[] = 'install_plugins'; - } else { - $caps[] = $cap; - } - break; - case 'activate_plugins': - $caps[] = $cap; - if ( is_multisite() ) { - // update_, install_, and delete_ are handled above with is_super_admin(). - $menu_perms = get_site_option( 'menu_items', array() ); - if ( empty( $menu_perms['plugins'] ) ) - $caps[] = 'manage_network_plugins'; - } - break; - case 'delete_user': - case 'delete_users': - // If multisite only super admins can delete users. - if ( is_multisite() && ! is_super_admin( $user_id ) ) - $caps[] = 'do_not_allow'; - else - $caps[] = 'delete_users'; // delete_user maps to delete_users. - break; - case 'create_users': - if ( !is_multisite() ) - $caps[] = $cap; - elseif ( is_super_admin( $user_id ) || get_site_option( 'add_new_users' ) ) - $caps[] = $cap; - else - $caps[] = 'do_not_allow'; - break; - case 'manage_links' : - if ( get_option( 'link_manager_enabled' ) ) - $caps[] = $cap; - else - $caps[] = 'do_not_allow'; - break; - case 'customize' : - $caps[] = 'edit_theme_options'; - break; - case 'delete_site': - $caps[] = 'manage_options'; - break; - case 'edit_term': - case 'delete_term': - case 'assign_term': - $term_id = (int) $args[0]; - $term = get_term( $term_id ); - if ( ! $term || is_wp_error( $term ) ) { - $caps[] = 'do_not_allow'; - break; - } - - $tax = get_taxonomy( $term->taxonomy ); - if ( ! $tax ) { - $caps[] = 'do_not_allow'; - break; - } - - if ( 'delete_term' === $cap && ( $term->term_id == get_option( 'default_' . $term->taxonomy ) ) ) { - $caps[] = 'do_not_allow'; - break; - } - - $taxo_cap = $cap . 's'; - - $caps = map_meta_cap( $tax->cap->$taxo_cap, $user_id, $term_id ); - - break; - case 'manage_post_tags': - case 'edit_categories': - case 'edit_post_tags': - case 'delete_categories': - case 'delete_post_tags': - $caps[] = 'manage_categories'; - break; - case 'assign_categories': - case 'assign_post_tags': - $caps[] = 'edit_posts'; - break; - case 'create_sites': - case 'delete_sites': - case 'manage_network': - case 'manage_sites': - case 'manage_network_users': - case 'manage_network_plugins': - case 'manage_network_themes': - case 'manage_network_options': - $caps[] = $cap; - break; - default: - // Handle meta capabilities for custom post types. - global $post_type_meta_caps; - if ( isset( $post_type_meta_caps[ $cap ] ) ) { - $args = array_merge( array( $post_type_meta_caps[ $cap ], $user_id ), $args ); - return call_user_func_array( 'map_meta_cap', $args ); - } - - // If no meta caps match, return the original cap. - $caps[] = $cap; - } - - /** - * Filters a user's capabilities depending on specific context and/or privilege. - * - * @since 2.8.0 - * - * @param array $caps Returns the user's actual capabilities. - * @param string $cap Capability name. - * @param int $user_id The user ID. - * @param array $args Adds the context to the cap. Typically the object ID. - */ - return apply_filters( 'map_meta_cap', $caps, $cap, $user_id, $args ); -} - -/** - * Whether the current user has a specific capability. - * - * While checking against particular roles in place of a capability is supported - * in part, this practice is discouraged as it may produce unreliable results. - * - * Note: Will always return true if the current user is a super admin, unless specifically denied. - * - * @since 2.0.0 - * - * @see WP_User::has_cap() - * @see map_meta_cap() - * - * @param string $capability Capability name. - * @param int $object_id Optional. ID of the specific object to check against if `$capability` is a "meta" cap. - * "Meta" capabilities, e.g. 'edit_post', 'edit_user', etc., are capabilities used - * by map_meta_cap() to map to other "primitive" capabilities, e.g. 'edit_posts', - * 'edit_others_posts', etc. Accessed via func_get_args() and passed to WP_User::has_cap(), - * then map_meta_cap(). - * @return bool Whether the current user has the given capability. If `$capability` is a meta cap and `$object_id` is - * passed, whether the current user has the given meta capability for the given object. - */ -function current_user_can( $capability ) { - $current_user = wp_get_current_user(); - - if ( empty( $current_user ) ) - return false; - - $args = array_slice( func_get_args(), 1 ); - $args = array_merge( array( $capability ), $args ); - - return call_user_func_array( array( $current_user, 'has_cap' ), $args ); -} - -/** - * Whether current user has a capability or role for a given site. - * - * @since 3.0.0 - * - * @param int $blog_id Site ID. - * @param string $capability Capability or role name. - * @return bool - */ -function current_user_can_for_blog( $blog_id, $capability ) { - $switched = is_multisite() ? switch_to_blog( $blog_id ) : false; - - $current_user = wp_get_current_user(); - - if ( empty( $current_user ) ) { - if ( $switched ) { - restore_current_blog(); - } - return false; - } - - $args = array_slice( func_get_args(), 2 ); - $args = array_merge( array( $capability ), $args ); - - $can = call_user_func_array( array( $current_user, 'has_cap' ), $args ); - - if ( $switched ) { - restore_current_blog(); - } - - return $can; -} - -/** - * Whether author of supplied post has capability or role. - * - * @since 2.9.0 - * - * @param int|object $post Post ID or post object. - * @param string $capability Capability or role name. - * @return bool - */ -function author_can( $post, $capability ) { - if ( !$post = get_post($post) ) - return false; - - $author = get_userdata( $post->post_author ); - - if ( ! $author ) - return false; - - $args = array_slice( func_get_args(), 2 ); - $args = array_merge( array( $capability ), $args ); - - return call_user_func_array( array( $author, 'has_cap' ), $args ); -} - -/** - * Whether a particular user has capability or role. - * - * @since 3.1.0 - * - * @param int|object $user User ID or object. - * @param string $capability Capability or role name. - * @return bool - */ -function user_can( $user, $capability ) { - if ( ! is_object( $user ) ) - $user = get_userdata( $user ); - - if ( ! $user || ! $user->exists() ) - return false; - - $args = array_slice( func_get_args(), 2 ); - $args = array_merge( array( $capability ), $args ); - - return call_user_func_array( array( $user, 'has_cap' ), $args ); -} - -/** - * Retrieves the global WP_Roles instance and instantiates it if necessary. - * - * @since 4.3.0 - * - * @global WP_Roles $wp_roles WP_Roles global instance. - * - * @return WP_Roles WP_Roles global instance if not already instantiated. - */ -function wp_roles() { - global $wp_roles; - - if ( ! isset( $wp_roles ) ) { - $wp_roles = new WP_Roles(); - } - return $wp_roles; -} - -/** - * Retrieve role object. - * - * @since 2.0.0 - * - * @param string $role Role name. - * @return WP_Role|null WP_Role object if found, null if the role does not exist. - */ -function get_role( $role ) { - return wp_roles()->get_role( $role ); -} - -/** - * Add role, if it does not exist. - * - * @since 2.0.0 - * - * @param string $role Role name. - * @param string $display_name Display name for role. - * @param array $capabilities List of capabilities, e.g. array( 'edit_posts' => true, 'delete_posts' => false ); - * @return WP_Role|null WP_Role object if role is added, null if already exists. - */ -function add_role( $role, $display_name, $capabilities = array() ) { - if ( empty( $role ) ) { - return; - } - return wp_roles()->add_role( $role, $display_name, $capabilities ); -} - -/** - * Remove role, if it exists. - * - * @since 2.0.0 - * - * @param string $role Role name. - */ -function remove_role( $role ) { - wp_roles()->remove_role( $role ); -} - -/** - * Retrieve a list of super admins. - * - * @since 3.0.0 - * - * @global array $super_admins - * - * @return array List of super admin logins - */ -function get_super_admins() { - global $super_admins; - - if ( isset($super_admins) ) - return $super_admins; - else - return get_site_option( 'site_admins', array('admin') ); -} - -/** - * Determine if user is a site admin. - * - * @since 3.0.0 - * - * @param int $user_id (Optional) The ID of a user. Defaults to the current user. - * @return bool True if the user is a site admin. - */ -function is_super_admin( $user_id = false ) { - if ( ! $user_id || $user_id == get_current_user_id() ) - $user = wp_get_current_user(); - else - $user = get_userdata( $user_id ); - - if ( ! $user || ! $user->exists() ) - return false; - - if ( is_multisite() ) { - $super_admins = get_super_admins(); - if ( is_array( $super_admins ) && in_array( $user->user_login, $super_admins ) ) - return true; - } else { - if ( $user->has_cap('delete_users') ) - return true; - } - - return false; -} - -/** - * Grants Super Admin privileges. - * - * @since 3.0.0 - * - * @global array $super_admins - * - * @param int $user_id ID of the user to be granted Super Admin privileges. - * @return bool True on success, false on failure. This can fail when the user is - * already a super admin or when the `$super_admins` global is defined. - */ -function grant_super_admin( $user_id ) { - // If global super_admins override is defined, there is nothing to do here. - if ( isset( $GLOBALS['super_admins'] ) || ! is_multisite() ) { - return false; - } - - /** - * Fires before the user is granted Super Admin privileges. - * - * @since 3.0.0 - * - * @param int $user_id ID of the user that is about to be granted Super Admin privileges. - */ - do_action( 'grant_super_admin', $user_id ); - - // Directly fetch site_admins instead of using get_super_admins() - $super_admins = get_site_option( 'site_admins', array( 'admin' ) ); - - $user = get_userdata( $user_id ); - if ( $user && ! in_array( $user->user_login, $super_admins ) ) { - $super_admins[] = $user->user_login; - update_site_option( 'site_admins' , $super_admins ); - - /** - * Fires after the user is granted Super Admin privileges. - * - * @since 3.0.0 - * - * @param int $user_id ID of the user that was granted Super Admin privileges. - */ - do_action( 'granted_super_admin', $user_id ); - return true; - } - return false; -} - -/** - * Revokes Super Admin privileges. - * - * @since 3.0.0 - * - * @global array $super_admins - * - * @param int $user_id ID of the user Super Admin privileges to be revoked from. - * @return bool True on success, false on failure. This can fail when the user's email - * is the network admin email or when the `$super_admins` global is defined. - */ -function revoke_super_admin( $user_id ) { - // If global super_admins override is defined, there is nothing to do here. - if ( isset( $GLOBALS['super_admins'] ) || ! is_multisite() ) { - return false; - } - - /** - * Fires before the user's Super Admin privileges are revoked. - * - * @since 3.0.0 - * - * @param int $user_id ID of the user Super Admin privileges are being revoked from. - */ - do_action( 'revoke_super_admin', $user_id ); - - // Directly fetch site_admins instead of using get_super_admins() - $super_admins = get_site_option( 'site_admins', array( 'admin' ) ); - - $user = get_userdata( $user_id ); - if ( $user && 0 !== strcasecmp( $user->user_email, get_site_option( 'admin_email' ) ) ) { - if ( false !== ( $key = array_search( $user->user_login, $super_admins ) ) ) { - unset( $super_admins[$key] ); - update_site_option( 'site_admins', $super_admins ); - - /** - * Fires after the user's Super Admin privileges are revoked. - * - * @since 3.0.0 - * - * @param int $user_id ID of the user Super Admin privileges were revoked from. - */ - do_action( 'revoked_super_admin', $user_id ); - return true; - } - } - return false; -} diff --git a/wp/wp-includes/category-template.php b/wp/wp-includes/category-template.php deleted file mode 100644 index ac992d6b..00000000 --- a/wp/wp-includes/category-template.php +++ /dev/null @@ -1,1326 +0,0 @@ -<?php -/** - * Taxonomy API: Core category-specific template tags - * - * @package WordPress - * @subpackage Template - * @since 1.2.0 - */ - -/** - * Retrieve category link URL. - * - * @since 1.0.0 - * @see get_term_link() - * - * @param int|object $category Category ID or object. - * @return string Link on success, empty string if category does not exist. - */ -function get_category_link( $category ) { - if ( ! is_object( $category ) ) - $category = (int) $category; - - $category = get_term_link( $category, 'category' ); - - if ( is_wp_error( $category ) ) - return ''; - - return $category; -} - -/** - * Retrieve category parents with separator. - * - * @since 1.2.0 - * - * @param int $id Category ID. - * @param bool $link Optional, default is false. Whether to format with link. - * @param string $separator Optional, default is '/'. How to separate categories. - * @param bool $nicename Optional, default is false. Whether to use nice name for display. - * @param array $visited Optional. Already linked to categories to prevent duplicates. - * @return string|WP_Error A list of category parents on success, WP_Error on failure. - */ -function get_category_parents( $id, $link = false, $separator = '/', $nicename = false, $visited = array() ) { - $chain = ''; - $parent = get_term( $id, 'category' ); - if ( is_wp_error( $parent ) ) - return $parent; - - if ( $nicename ) - $name = $parent->slug; - else - $name = $parent->name; - - if ( $parent->parent && ( $parent->parent != $parent->term_id ) && !in_array( $parent->parent, $visited ) ) { - $visited[] = $parent->parent; - $chain .= get_category_parents( $parent->parent, $link, $separator, $nicename, $visited ); - } - - if ( $link ) - $chain .= '<a href="' . esc_url( get_category_link( $parent->term_id ) ) . '">'.$name.'</a>' . $separator; - else - $chain .= $name.$separator; - return $chain; -} - -/** - * Retrieve post categories. - * - * This tag may be used outside The Loop by passing a post id as the parameter. - * - * Note: This function only returns results from the default "category" taxonomy. - * For custom taxonomies use get_the_terms(). - * - * @since 0.71 - * - * @param int $id Optional, default to current post ID. The post ID. - * @return array Array of WP_Term objects, one for each category assigned to the post. - */ -function get_the_category( $id = false ) { - $categories = get_the_terms( $id, 'category' ); - if ( ! $categories || is_wp_error( $categories ) ) - $categories = array(); - - $categories = array_values( $categories ); - - foreach ( array_keys( $categories ) as $key ) { - _make_cat_compat( $categories[$key] ); - } - - /** - * Filters the array of categories to return for a post. - * - * @since 3.1.0 - * @since 4.4.0 Added `$id` parameter. - * - * @param array $categories An array of categories to return for the post. - * @param int $id ID of the post. - */ - return apply_filters( 'get_the_categories', $categories, $id ); -} - -/** - * Retrieve category name based on category ID. - * - * @since 0.71 - * - * @param int $cat_ID Category ID. - * @return string|WP_Error Category name on success, WP_Error on failure. - */ -function get_the_category_by_ID( $cat_ID ) { - $cat_ID = (int) $cat_ID; - $category = get_term( $cat_ID, 'category' ); - - if ( is_wp_error( $category ) ) - return $category; - - return ( $category ) ? $category->name : ''; -} - -/** - * Retrieve category list in either HTML list or custom format. - * - * @since 1.5.1 - * - * @global WP_Rewrite $wp_rewrite - * - * @param string $separator Optional, default is empty string. Separator for between the categories. - * @param string $parents Optional. How to display the parents. - * @param int $post_id Optional. Post ID to retrieve categories. - * @return string - */ -function get_the_category_list( $separator = '', $parents='', $post_id = false ) { - global $wp_rewrite; - if ( ! is_object_in_taxonomy( get_post_type( $post_id ), 'category' ) ) { - /** This filter is documented in wp-includes/category-template.php */ - return apply_filters( 'the_category', '', $separator, $parents ); - } - - /** - * Filters the categories before building the category list. - * - * @since 4.4.0 - * - * @param array $categories An array of the post's categories. - * @param int|bool $post_id ID of the post we're retrieving categories for. When `false`, we assume the - * current post in the loop. - */ - $categories = apply_filters( 'the_category_list', get_the_category( $post_id ), $post_id ); - - if ( empty( $categories ) ) { - /** This filter is documented in wp-includes/category-template.php */ - return apply_filters( 'the_category', __( 'Uncategorized' ), $separator, $parents ); - } - - $rel = ( is_object( $wp_rewrite ) && $wp_rewrite->using_permalinks() ) ? 'rel="category tag"' : 'rel="category"'; - - $thelist = ''; - if ( '' == $separator ) { - $thelist .= '<ul class="post-categories">'; - foreach ( $categories as $category ) { - $thelist .= "\n\t<li>"; - switch ( strtolower( $parents ) ) { - case 'multiple': - if ( $category->parent ) - $thelist .= get_category_parents( $category->parent, true, $separator ); - $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name.'</a></li>'; - break; - case 'single': - $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>'; - if ( $category->parent ) - $thelist .= get_category_parents( $category->parent, false, $separator ); - $thelist .= $category->name.'</a></li>'; - break; - case '': - default: - $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name.'</a></li>'; - } - } - $thelist .= '</ul>'; - } else { - $i = 0; - foreach ( $categories as $category ) { - if ( 0 < $i ) - $thelist .= $separator; - switch ( strtolower( $parents ) ) { - case 'multiple': - if ( $category->parent ) - $thelist .= get_category_parents( $category->parent, true, $separator ); - $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name.'</a>'; - break; - case 'single': - $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>'; - if ( $category->parent ) - $thelist .= get_category_parents( $category->parent, false, $separator ); - $thelist .= "$category->name</a>"; - break; - case '': - default: - $thelist .= '<a href="' . esc_url( get_category_link( $category->term_id ) ) . '" ' . $rel . '>' . $category->name.'</a>'; - } - ++$i; - } - } - - /** - * Filters the category or list of categories. - * - * @since 1.2.0 - * - * @param array $thelist List of categories for the current post. - * @param string $separator Separator used between the categories. - * @param string $parents How to display the category parents. Accepts 'multiple', - * 'single', or empty. - */ - return apply_filters( 'the_category', $thelist, $separator, $parents ); -} - -/** - * Check if the current post is within any of the given categories. - * - * The given categories are checked against the post's categories' term_ids, names and slugs. - * Categories given as integers will only be checked against the post's categories' term_ids. - * - * Prior to v2.5 of WordPress, category names were not supported. - * Prior to v2.7, category slugs were not supported. - * Prior to v2.7, only one category could be compared: in_category( $single_category ). - * Prior to v2.7, this function could only be used in the WordPress Loop. - * As of 2.7, the function can be used anywhere if it is provided a post ID or post object. - * - * @since 1.2.0 - * - * @param int|string|array $category Category ID, name or slug, or array of said. - * @param int|object $post Optional. Post to check instead of the current post. (since 2.7.0) - * @return bool True if the current post is in any of the given categories. - */ -function in_category( $category, $post = null ) { - if ( empty( $category ) ) - return false; - - return has_category( $category, $post ); -} - -/** - * Display the category list for the post. - * - * @since 0.71 - * - * @param string $separator Optional, default is empty string. Separator for between the categories. - * @param string $parents Optional. How to display the parents. - * @param int $post_id Optional. Post ID to retrieve categories. - */ -function the_category( $separator = '', $parents='', $post_id = false ) { - echo get_the_category_list( $separator, $parents, $post_id ); -} - -/** - * Retrieve category description. - * - * @since 1.0.0 - * - * @param int $category Optional. Category ID. Will use global category ID by default. - * @return string Category description, available. - */ -function category_description( $category = 0 ) { - return term_description( $category, 'category' ); -} - -/** - * Display or retrieve the HTML dropdown list of categories. - * - * The 'hierarchical' argument, which is disabled by default, will override the - * depth argument, unless it is true. When the argument is false, it will - * display all of the categories. When it is enabled it will use the value in - * the 'depth' argument. - * - * @since 2.1.0 - * @since 4.2.0 Introduced the `value_field` argument. - * @since 4.6.0 Introduced the `required` argument. - * - * @param string|array $args { - * Optional. Array or string of arguments to generate a categories drop-down element. - * - * @type string $show_option_all Text to display for showing all categories. Default empty. - * @type string $show_option_none Text to display for showing no categories. Default empty. - * @type string $option_none_value Value to use when no category is selected. Default empty. - * @type string $orderby Which column to use for ordering categories. See get_terms() for a list - * of accepted values. Default 'id' (term_id). - * @type string $order Whether to order terms in ascending or descending order. Accepts 'ASC' - * or 'DESC'. Default 'ASC'. - * @type bool $pad_counts See get_terms() for an argument description. Default false. - * @type bool|int $show_count Whether to include post counts. Accepts 0, 1, or their bool equivalents. - * Default 0. - * @type bool|int $hide_empty Whether to hide categories that don't have any posts. Accepts 0, 1, or - * their bool equivalents. Default 1. - * @type int $child_of Term ID to retrieve child terms of. See get_terms(). Default 0. - * @type array|string $exclude Array or comma/space-separated string of term ids to exclude. - * If `$include` is non-empty, `$exclude` is ignored. Default empty array. - * @type bool|int $echo Whether to echo or return the generated markup. Accepts 0, 1, or their - * bool equivalents. Default 1. - * @type bool|int $hierarchical Whether to traverse the taxonomy hierarchy. Accepts 0, 1, or their bool - * equivalents. Default 0. - * @type int $depth Maximum depth. Default 0. - * @type int $tab_index Tab index for the select element. Default 0 (no tabindex). - * @type string $name Value for the 'name' attribute of the select element. Default 'cat'. - * @type string $id Value for the 'id' attribute of the select element. Defaults to the value - * of `$name`. - * @type string $class Value for the 'class' attribute of the select element. Default 'postform'. - * @type int|string $selected Value of the option that should be selected. Default 0. - * @type string $value_field Term field that should be used to populate the 'value' attribute - * of the option elements. Accepts any valid term field: 'term_id', 'name', - * 'slug', 'term_group', 'term_taxonomy_id', 'taxonomy', 'description', - * 'parent', 'count'. Default 'term_id'. - * @type string|array $taxonomy Name of the category or categories to retrieve. Default 'category'. - * @type bool $hide_if_empty True to skip generating markup if no categories are found. - * Default false (create select element even if no categories are found). - * @type bool $required Whether the `<select>` element should have the HTML5 'required' attribute. - * Default false. - * } - * @return string HTML content only if 'echo' argument is 0. - */ -function wp_dropdown_categories( $args = '' ) { - $defaults = array( - 'show_option_all' => '', - 'show_option_none' => '', - 'orderby' => 'id', - 'order' => 'ASC', - 'show_count' => 0, - 'hide_empty' => 1, - 'child_of' => 0, - 'exclude' => '', - 'echo' => 1, - 'selected' => 0, - 'hierarchical' => 0, - 'name' => 'cat', - 'id' => '', - 'class' => 'postform', - 'depth' => 0, - 'tab_index' => 0, - 'taxonomy' => 'category', - 'hide_if_empty' => false, - 'option_none_value' => -1, - 'value_field' => 'term_id', - 'required' => false, - ); - - $defaults['selected'] = ( is_category() ) ? get_query_var( 'cat' ) : 0; - - // Back compat. - if ( isset( $args['type'] ) && 'link' == $args['type'] ) { - /* translators: 1: "type => link", 2: "taxonomy => link_category" alternative */ - _deprecated_argument( __FUNCTION__, '3.0.0', - sprintf( __( '%1$s is deprecated. Use %2$s instead.' ), - '<code>type => link</code>', - '<code>taxonomy => link_category</code>' - ) - ); - $args['taxonomy'] = 'link_category'; - } - - $r = wp_parse_args( $args, $defaults ); - $option_none_value = $r['option_none_value']; - - if ( ! isset( $r['pad_counts'] ) && $r['show_count'] && $r['hierarchical'] ) { - $r['pad_counts'] = true; - } - - $tab_index = $r['tab_index']; - - $tab_index_attribute = ''; - if ( (int) $tab_index > 0 ) { - $tab_index_attribute = " tabindex=\"$tab_index\""; - } - - // Avoid clashes with the 'name' param of get_terms(). - $get_terms_args = $r; - unset( $get_terms_args['name'] ); - $categories = get_terms( $r['taxonomy'], $get_terms_args ); - - $name = esc_attr( $r['name'] ); - $class = esc_attr( $r['class'] ); - $id = $r['id'] ? esc_attr( $r['id'] ) : $name; - $required = $r['required'] ? 'required' : ''; - - if ( ! $r['hide_if_empty'] || ! empty( $categories ) ) { - $output = "<select $required name='$name' id='$id' class='$class' $tab_index_attribute>\n"; - } else { - $output = ''; - } - if ( empty( $categories ) && ! $r['hide_if_empty'] && ! empty( $r['show_option_none'] ) ) { - - /** - * Filters a taxonomy drop-down display element. - * - * A variety of taxonomy drop-down display elements can be modified - * just prior to display via this filter. Filterable arguments include - * 'show_option_none', 'show_option_all', and various forms of the - * term name. - * - * @since 1.2.0 - * - * @see wp_dropdown_categories() - * - * @param string $element Taxonomy element to list. - */ - $show_option_none = apply_filters( 'list_cats', $r['show_option_none'] ); - $output .= "\t<option value='" . esc_attr( $option_none_value ) . "' selected='selected'>$show_option_none</option>\n"; - } - - if ( ! empty( $categories ) ) { - - if ( $r['show_option_all'] ) { - - /** This filter is documented in wp-includes/category-template.php */ - $show_option_all = apply_filters( 'list_cats', $r['show_option_all'] ); - $selected = ( '0' === strval($r['selected']) ) ? " selected='selected'" : ''; - $output .= "\t<option value='0'$selected>$show_option_all</option>\n"; - } - - if ( $r['show_option_none'] ) { - - /** This filter is documented in wp-includes/category-template.php */ - $show_option_none = apply_filters( 'list_cats', $r['show_option_none'] ); - $selected = selected( $option_none_value, $r['selected'], false ); - $output .= "\t<option value='" . esc_attr( $option_none_value ) . "'$selected>$show_option_none</option>\n"; - } - - if ( $r['hierarchical'] ) { - $depth = $r['depth']; // Walk the full depth. - } else { - $depth = -1; // Flat. - } - $output .= walk_category_dropdown_tree( $categories, $depth, $r ); - } - - if ( ! $r['hide_if_empty'] || ! empty( $categories ) ) { - $output .= "</select>\n"; - } - /** - * Filters the taxonomy drop-down output. - * - * @since 2.1.0 - * - * @param string $output HTML output. - * @param array $r Arguments used to build the drop-down. - */ - $output = apply_filters( 'wp_dropdown_cats', $output, $r ); - - if ( $r['echo'] ) { - echo $output; - } - return $output; -} - -/** - * Display or retrieve the HTML list of categories. - * - * @since 2.1.0 - * @since 4.4.0 Introduced the `hide_title_if_empty` and `separator` arguments. The `current_category` argument was modified to - * optionally accept an array of values. - * - * @param string|array $args { - * Array of optional arguments. - * - * @type int $child_of Term ID to retrieve child terms of. See get_terms(). Default 0. - * @type int|array $current_category ID of category, or array of IDs of categories, that should get the - * 'current-cat' class. Default 0. - * @type int $depth Category depth. Used for tab indentation. Default 0. - * @type bool|int $echo True to echo markup, false to return it. Default 1. - * @type array|string $exclude Array or comma/space-separated string of term IDs to exclude. - * If `$hierarchical` is true, descendants of `$exclude` terms will also - * be excluded; see `$exclude_tree`. See get_terms(). - * Default empty string. - * @type array|string $exclude_tree Array or comma/space-separated string of term IDs to exclude, along - * with their descendants. See get_terms(). Default empty string. - * @type string $feed Text to use for the feed link. Default 'Feed for all posts filed - * under [cat name]'. - * @type string $feed_image URL of an image to use for the feed link. Default empty string. - * @type string $feed_type Feed type. Used to build feed link. See get_term_feed_link(). - * Default empty string (default feed). - * @type bool|int $hide_empty Whether to hide categories that don't have any posts attached to them. - * Default 1. - * @type bool $hide_title_if_empty Whether to hide the `$title_li` element if there are no terms in - * the list. Default false (title will always be shown). - * @type bool $hierarchical Whether to include terms that have non-empty descendants. - * See get_terms(). Default true. - * @type string $order Which direction to order categories. Accepts 'ASC' or 'DESC'. - * Default 'ASC'. - * @type string $orderby The column to use for ordering categories. Default 'ID'. - * @type string $separator Separator between links. Default '<br />'. - * @type bool|int $show_count Whether to show how many posts are in the category. Default 0. - * @type string $show_option_all Text to display for showing all categories. Default empty string. - * @type string $show_option_none Text to display for the 'no categories' option. - * Default 'No categories'. - * @type string $style The style used to display the categories list. If 'list', categories - * will be output as an unordered list. If left empty or another value, - * categories will be output separated by `<br>` tags. Default 'list'. - * @type string $taxonomy Taxonomy name. Default 'category'. - * @type string $title_li Text to use for the list title `<li>` element. Pass an empty string - * to disable. Default 'Categories'. - * @type bool|int $use_desc_for_title Whether to use the category description as the title attribute. - * Default 1. - * } - * @return false|string HTML content only if 'echo' argument is 0. - */ -function wp_list_categories( $args = '' ) { - $defaults = array( - 'child_of' => 0, - 'current_category' => 0, - 'depth' => 0, - 'echo' => 1, - 'exclude' => '', - 'exclude_tree' => '', - 'feed' => '', - 'feed_image' => '', - 'feed_type' => '', - 'hide_empty' => 1, - 'hide_title_if_empty' => false, - 'hierarchical' => true, - 'order' => 'ASC', - 'orderby' => 'name', - 'separator' => '<br />', - 'show_count' => 0, - 'show_option_all' => '', - 'show_option_none' => __( 'No categories' ), - 'style' => 'list', - 'taxonomy' => 'category', - 'title_li' => __( 'Categories' ), - 'use_desc_for_title' => 1, - ); - - $r = wp_parse_args( $args, $defaults ); - - if ( !isset( $r['pad_counts'] ) && $r['show_count'] && $r['hierarchical'] ) - $r['pad_counts'] = true; - - // Descendants of exclusions should be excluded too. - if ( true == $r['hierarchical'] ) { - $exclude_tree = array(); - - if ( $r['exclude_tree'] ) { - $exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $r['exclude_tree'] ) ); - } - - if ( $r['exclude'] ) { - $exclude_tree = array_merge( $exclude_tree, wp_parse_id_list( $r['exclude'] ) ); - } - - $r['exclude_tree'] = $exclude_tree; - $r['exclude'] = ''; - } - - if ( ! isset( $r['class'] ) ) - $r['class'] = ( 'category' == $r['taxonomy'] ) ? 'categories' : $r['taxonomy']; - - if ( ! taxonomy_exists( $r['taxonomy'] ) ) { - return false; - } - - $show_option_all = $r['show_option_all']; - $show_option_none = $r['show_option_none']; - - $categories = get_categories( $r ); - - $output = ''; - if ( $r['title_li'] && 'list' == $r['style'] && ( ! empty( $categories ) || ! $r['hide_title_if_empty'] ) ) { - $output = '<li class="' . esc_attr( $r['class'] ) . '">' . $r['title_li'] . '<ul>'; - } - if ( empty( $categories ) ) { - if ( ! empty( $show_option_none ) ) { - if ( 'list' == $r['style'] ) { - $output .= '<li class="cat-item-none">' . $show_option_none . '</li>'; - } else { - $output .= $show_option_none; - } - } - } else { - if ( ! empty( $show_option_all ) ) { - - $posts_page = ''; - - // For taxonomies that belong only to custom post types, point to a valid archive. - $taxonomy_object = get_taxonomy( $r['taxonomy'] ); - if ( ! in_array( 'post', $taxonomy_object->object_type ) && ! in_array( 'page', $taxonomy_object->object_type ) ) { - foreach ( $taxonomy_object->object_type as $object_type ) { - $_object_type = get_post_type_object( $object_type ); - - // Grab the first one. - if ( ! empty( $_object_type->has_archive ) ) { - $posts_page = get_post_type_archive_link( $object_type ); - break; - } - } - } - - // Fallback for the 'All' link is the posts page. - if ( ! $posts_page ) { - if ( 'page' == get_option( 'show_on_front' ) && get_option( 'page_for_posts' ) ) { - $posts_page = get_permalink( get_option( 'page_for_posts' ) ); - } else { - $posts_page = home_url( '/' ); - } - } - - $posts_page = esc_url( $posts_page ); - if ( 'list' == $r['style'] ) { - $output .= "<li class='cat-item-all'><a href='$posts_page'>$show_option_all</a></li>"; - } else { - $output .= "<a href='$posts_page'>$show_option_all</a>"; - } - } - - if ( empty( $r['current_category'] ) && ( is_category() || is_tax() || is_tag() ) ) { - $current_term_object = get_queried_object(); - if ( $current_term_object && $r['taxonomy'] === $current_term_object->taxonomy ) { - $r['current_category'] = get_queried_object_id(); - } - } - - if ( $r['hierarchical'] ) { - $depth = $r['depth']; - } else { - $depth = -1; // Flat. - } - $output .= walk_category_tree( $categories, $depth, $r ); - } - - if ( $r['title_li'] && 'list' == $r['style'] && ( ! empty( $categories ) || ! $r['hide_title_if_empty'] ) ) { - $output .= '</ul></li>'; - } - - /** - * Filters the HTML output of a taxonomy list. - * - * @since 2.1.0 - * - * @param string $output HTML output. - * @param array $args An array of taxonomy-listing arguments. - */ - $html = apply_filters( 'wp_list_categories', $output, $args ); - - if ( $r['echo'] ) { - echo $html; - } else { - return $html; - } -} - -/** - * Display tag cloud. - * - * The text size is set by the 'smallest' and 'largest' arguments, which will - * use the 'unit' argument value for the CSS text size unit. The 'format' - * argument can be 'flat' (default), 'list', or 'array'. The flat value for the - * 'format' argument will separate tags with spaces. The list value for the - * 'format' argument will format the tags in a UL HTML list. The array value for - * the 'format' argument will return in PHP array type format. - * - * The 'orderby' argument will accept 'name' or 'count' and defaults to 'name'. - * The 'order' is the direction to sort, defaults to 'ASC' and can be 'DESC'. - * - * The 'number' argument is how many tags to return. By default, the limit will - * be to return the top 45 tags in the tag cloud list. - * - * The 'topic_count_text' argument is a nooped plural from _n_noop() to generate the - * text for the tooltip of the tag link. - * - * The 'topic_count_text_callback' argument is a function, which given the count - * of the posts with that tag returns a text for the tooltip of the tag link. - * - * The 'post_type' argument is used only when 'link' is set to 'edit'. It determines the post_type - * passed to edit.php for the popular tags edit links. - * - * The 'exclude' and 'include' arguments are used for the get_tags() function. Only one - * should be used, because only one will be used and the other ignored, if they are both set. - * - * @since 2.3.0 - * - * @param array|string|null $args Optional. Override default arguments. - * @return void|array Generated tag cloud, only if no failures and 'array' is set for the 'format' argument. - * Otherwise, this function outputs the tag cloud. - */ -function wp_tag_cloud( $args = '' ) { - $defaults = array( - 'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 45, - 'format' => 'flat', 'separator' => "\n", 'orderby' => 'name', 'order' => 'ASC', - 'exclude' => '', 'include' => '', 'link' => 'view', 'taxonomy' => 'post_tag', 'post_type' => '', 'echo' => true - ); - $args = wp_parse_args( $args, $defaults ); - - $tags = get_terms( $args['taxonomy'], array_merge( $args, array( 'orderby' => 'count', 'order' => 'DESC' ) ) ); // Always query top tags - - if ( empty( $tags ) || is_wp_error( $tags ) ) - return; - - foreach ( $tags as $key => $tag ) { - if ( 'edit' == $args['link'] ) - $link = get_edit_term_link( $tag->term_id, $tag->taxonomy, $args['post_type'] ); - else - $link = get_term_link( intval($tag->term_id), $tag->taxonomy ); - if ( is_wp_error( $link ) ) - return; - - $tags[ $key ]->link = $link; - $tags[ $key ]->id = $tag->term_id; - } - - $return = wp_generate_tag_cloud( $tags, $args ); // Here's where those top tags get sorted according to $args - - /** - * Filters the tag cloud output. - * - * @since 2.3.0 - * - * @param string $return HTML output of the tag cloud. - * @param array $args An array of tag cloud arguments. - */ - $return = apply_filters( 'wp_tag_cloud', $return, $args ); - - if ( 'array' == $args['format'] || empty($args['echo']) ) - return $return; - - echo $return; -} - -/** - * Default topic count scaling for tag links - * - * @param int $count number of posts with that tag - * @return int scaled count - */ -function default_topic_count_scale( $count ) { - return round(log10($count + 1) * 100); -} - -/** - * Generates a tag cloud (heatmap) from provided data. - * - * @todo Complete functionality. - * @since 2.3.0 - * - * @param array $tags List of tags. - * @param string|array $args { - * Optional. Array of string of arguments for generating a tag cloud. - * - * @type int $smallest Smallest font size used to display tags. Paired - * with the value of `$unit`, to determine CSS text - * size unit. Default 8 (pt). - * @type int $largest Largest font size used to display tags. Paired - * with the value of `$unit`, to determine CSS text - * size unit. Default 22 (pt). - * @type string $unit CSS text size unit to use with the `$smallest` - * and `$largest` values. Accepts any valid CSS text - * size unit. Default 'pt'. - * @type int $number The number of tags to return. Accepts any - * positive integer or zero to return all. - * Default 0. - * @type string $format Format to display the tag cloud in. Accepts 'flat' - * (tags separated with spaces), 'list' (tags displayed - * in an unordered list), or 'array' (returns an array). - * Default 'flat'. - * @type string $separator HTML or text to separate the tags. Default "\n" (newline). - * @type string $orderby Value to order tags by. Accepts 'name' or 'count'. - * Default 'name'. The {@see 'tag_cloud_sort'} filter - * can also affect how tags are sorted. - * @type string $order How to order the tags. Accepts 'ASC' (ascending), - * 'DESC' (descending), or 'RAND' (random). Default 'ASC'. - * @type int|bool $filter Whether to enable filtering of the final output - * via {@see 'wp_generate_tag_cloud'}. Default 1|true. - * @type string $topic_count_text Nooped plural text from _n_noop() to supply to - * tag tooltips. Default null. - * @type callable $topic_count_text_callback Callback used to generate nooped plural text for - * tag tooltips based on the count. Default null. - * @type callable $topic_count_scale_callback Callback used to determine the tag count scaling - * value. Default default_topic_count_scale(). - * } - * @return string|array Tag cloud as a string or an array, depending on 'format' argument. - */ -function wp_generate_tag_cloud( $tags, $args = '' ) { - $defaults = array( - 'smallest' => 8, 'largest' => 22, 'unit' => 'pt', 'number' => 0, - 'format' => 'flat', 'separator' => "\n", 'orderby' => 'name', 'order' => 'ASC', - 'topic_count_text' => null, 'topic_count_text_callback' => null, - 'topic_count_scale_callback' => 'default_topic_count_scale', 'filter' => 1, - ); - - $args = wp_parse_args( $args, $defaults ); - - $return = ( 'array' === $args['format'] ) ? array() : ''; - - if ( empty( $tags ) ) { - return $return; - } - - // Juggle topic count tooltips: - if ( isset( $args['topic_count_text'] ) ) { - // First look for nooped plural support via topic_count_text. - $translate_nooped_plural = $args['topic_count_text']; - } elseif ( ! empty( $args['topic_count_text_callback'] ) ) { - // Look for the alternative callback style. Ignore the previous default. - if ( $args['topic_count_text_callback'] === 'default_topic_count_text' ) { - $translate_nooped_plural = _n_noop( '%s topic', '%s topics' ); - } else { - $translate_nooped_plural = false; - } - } elseif ( isset( $args['single_text'] ) && isset( $args['multiple_text'] ) ) { - // If no callback exists, look for the old-style single_text and multiple_text arguments. - $translate_nooped_plural = _n_noop( $args['single_text'], $args['multiple_text'] ); - } else { - // This is the default for when no callback, plural, or argument is passed in. - $translate_nooped_plural = _n_noop( '%s topic', '%s topics' ); - } - - /** - * Filters how the items in a tag cloud are sorted. - * - * @since 2.8.0 - * - * @param array $tags Ordered array of terms. - * @param array $args An array of tag cloud arguments. - */ - $tags_sorted = apply_filters( 'tag_cloud_sort', $tags, $args ); - if ( empty( $tags_sorted ) ) { - return $return; - } - - if ( $tags_sorted !== $tags ) { - $tags = $tags_sorted; - unset( $tags_sorted ); - } else { - if ( 'RAND' === $args['order'] ) { - shuffle( $tags ); - } else { - // SQL cannot save you; this is a second (potentially different) sort on a subset of data. - if ( 'name' === $args['orderby'] ) { - uasort( $tags, '_wp_object_name_sort_cb' ); - } else { - uasort( $tags, '_wp_object_count_sort_cb' ); - } - - if ( 'DESC' === $args['order'] ) { - $tags = array_reverse( $tags, true ); - } - } - } - - if ( $args['number'] > 0 ) - $tags = array_slice( $tags, 0, $args['number'] ); - - $counts = array(); - $real_counts = array(); // For the alt tag - foreach ( (array) $tags as $key => $tag ) { - $real_counts[ $key ] = $tag->count; - $counts[ $key ] = call_user_func( $args['topic_count_scale_callback'], $tag->count ); - } - - $min_count = min( $counts ); - $spread = max( $counts ) - $min_count; - if ( $spread <= 0 ) - $spread = 1; - $font_spread = $args['largest'] - $args['smallest']; - if ( $font_spread < 0 ) - $font_spread = 1; - $font_step = $font_spread / $spread; - - // Assemble the data that will be used to generate the tag cloud markup. - $tags_data = array(); - foreach ( $tags as $key => $tag ) { - $tag_id = isset( $tag->id ) ? $tag->id : $key; - - $count = $counts[ $key ]; - $real_count = $real_counts[ $key ]; - - if ( $translate_nooped_plural ) { - $title = sprintf( translate_nooped_plural( $translate_nooped_plural, $real_count ), number_format_i18n( $real_count ) ); - } else { - $title = call_user_func( $args['topic_count_text_callback'], $real_count, $tag, $args ); - } - - $tags_data[] = array( - 'id' => $tag_id, - 'url' => '#' != $tag->link ? $tag->link : '#', - 'role' => '#' != $tag->link ? '' : ' role="button"', - 'name' => $tag->name, - 'title' => $title, - 'slug' => $tag->slug, - 'real_count' => $real_count, - 'class' => 'tag-link-' . $tag_id, - 'font_size' => $args['smallest'] + ( $count - $min_count ) * $font_step, - ); - } - - /** - * Filters the data used to generate the tag cloud. - * - * @since 4.3.0 - * - * @param array $tags_data An array of term data for term used to generate the tag cloud. - */ - $tags_data = apply_filters( 'wp_generate_tag_cloud_data', $tags_data ); - - $a = array(); - - // generate the output links array - foreach ( $tags_data as $key => $tag_data ) { - $class = $tag_data['class'] . ' tag-link-position-' . ( $key + 1 ); - $a[] = "<a href='" . esc_url( $tag_data['url'] ) . "'" . $tag_data['role'] . " class='" . esc_attr( $class ) . "' title='" . esc_attr( $tag_data['title'] ) . "' style='font-size: " . esc_attr( str_replace( ',', '.', $tag_data['font_size'] ) . $args['unit'] ) . ";'>" . esc_html( $tag_data['name'] ) . "</a>"; - } - - switch ( $args['format'] ) { - case 'array' : - $return =& $a; - break; - case 'list' : - $return = "<ul class='wp-tag-cloud'>\n\t<li>"; - $return .= join( "</li>\n\t<li>", $a ); - $return .= "</li>\n</ul>\n"; - break; - default : - $return = join( $args['separator'], $a ); - break; - } - - if ( $args['filter'] ) { - /** - * Filters the generated output of a tag cloud. - * - * The filter is only evaluated if a true value is passed - * to the $filter argument in wp_generate_tag_cloud(). - * - * @since 2.3.0 - * - * @see wp_generate_tag_cloud() - * - * @param array|string $return String containing the generated HTML tag cloud output - * or an array of tag links if the 'format' argument - * equals 'array'. - * @param array $tags An array of terms used in the tag cloud. - * @param array $args An array of wp_generate_tag_cloud() arguments. - */ - return apply_filters( 'wp_generate_tag_cloud', $return, $tags, $args ); - } - - else - return $return; -} - -/** - * Serves as a callback for comparing objects based on name. - * - * Used with `uasort()`. - * - * @since 3.1.0 - * @access private - * - * @param object $a The first object to compare. - * @param object $b The second object to compare. - * @return int Negative number if `$a->name` is less than `$b->name`, zero if they are equal, - * or greater than zero if `$a->name` is greater than `$b->name`. - */ -function _wp_object_name_sort_cb( $a, $b ) { - return strnatcasecmp( $a->name, $b->name ); -} - -/** - * Serves as a callback for comparing objects based on count. - * - * Used with `uasort()`. - * - * @since 3.1.0 - * @access private - * - * @param object $a The first object to compare. - * @param object $b The second object to compare. - * @return bool Whether the count value for `$a` is greater than the count value for `$b`. - */ -function _wp_object_count_sort_cb( $a, $b ) { - return ( $a->count > $b->count ); -} - -// -// Helper functions -// - -/** - * Retrieve HTML list content for category list. - * - * @uses Walker_Category to create HTML list content. - * @since 2.1.0 - * @see Walker_Category::walk() for parameters and return description. - * @return string - */ -function walk_category_tree() { - $args = func_get_args(); - // the user's options are the third parameter - if ( empty( $args[2]['walker'] ) || ! ( $args[2]['walker'] instanceof Walker ) ) { - $walker = new Walker_Category; - } else { - $walker = $args[2]['walker']; - } - return call_user_func_array( array( $walker, 'walk' ), $args ); -} - -/** - * Retrieve HTML dropdown (select) content for category list. - * - * @uses Walker_CategoryDropdown to create HTML dropdown content. - * @since 2.1.0 - * @see Walker_CategoryDropdown::walk() for parameters and return description. - * @return string - */ -function walk_category_dropdown_tree() { - $args = func_get_args(); - // the user's options are the third parameter - if ( empty( $args[2]['walker'] ) || ! ( $args[2]['walker'] instanceof Walker ) ) { - $walker = new Walker_CategoryDropdown; - } else { - $walker = $args[2]['walker']; - } - return call_user_func_array( array( $walker, 'walk' ), $args ); -} - -// -// Tags -// - -/** - * Retrieve the link to the tag. - * - * @since 2.3.0 - * @see get_term_link() - * - * @param int|object $tag Tag ID or object. - * @return string Link on success, empty string if tag does not exist. - */ -function get_tag_link( $tag ) { - if ( ! is_object( $tag ) ) - $tag = (int) $tag; - - $tag = get_term_link( $tag, 'post_tag' ); - - if ( is_wp_error( $tag ) ) - return ''; - - return $tag; -} - -/** - * Retrieve the tags for a post. - * - * @since 2.3.0 - * - * @param int $id Post ID. - * @return array|false|WP_Error Array of tag objects on success, false on failure. - */ -function get_the_tags( $id = 0 ) { - - /** - * Filters the array of tags for the given post. - * - * @since 2.3.0 - * - * @see get_the_terms() - * - * @param array $terms An array of tags for the given post. - */ - return apply_filters( 'get_the_tags', get_the_terms( $id, 'post_tag' ) ); -} - -/** - * Retrieve the tags for a post formatted as a string. - * - * @since 2.3.0 - * - * @param string $before Optional. Before tags. - * @param string $sep Optional. Between tags. - * @param string $after Optional. After tags. - * @param int $id Optional. Post ID. Defaults to the current post. - * @return string|false|WP_Error A list of tags on success, false if there are no terms, WP_Error on failure. - */ -function get_the_tag_list( $before = '', $sep = '', $after = '', $id = 0 ) { - - /** - * Filters the tags list for a given post. - * - * @since 2.3.0 - * - * @param string $tag_list List of tags. - * @param string $before String to use before tags. - * @param string $sep String to use between the tags. - * @param string $after String to use after tags. - * @param int $id Post ID. - */ - return apply_filters( 'the_tags', get_the_term_list( $id, 'post_tag', $before, $sep, $after ), $before, $sep, $after, $id ); -} - -/** - * Retrieve the tags for a post. - * - * @since 2.3.0 - * - * @param string $before Optional. Before list. - * @param string $sep Optional. Separate items using this. - * @param string $after Optional. After list. - */ -function the_tags( $before = null, $sep = ', ', $after = '' ) { - if ( null === $before ) - $before = __('Tags: '); - - $the_tags = get_the_tag_list( $before, $sep, $after ); - - if ( ! is_wp_error( $the_tags ) ) { - echo $the_tags; - } -} - -/** - * Retrieve tag description. - * - * @since 2.8.0 - * - * @param int $tag Optional. Tag ID. Will use global tag ID by default. - * @return string Tag description, available. - */ -function tag_description( $tag = 0 ) { - return term_description( $tag ); -} - -/** - * Retrieve term description. - * - * @since 2.8.0 - * - * @param int $term Optional. Term ID. Will use global term ID by default. - * @param string $taxonomy Optional taxonomy name. Defaults to 'post_tag'. - * @return string Term description, available. - */ -function term_description( $term = 0, $taxonomy = 'post_tag' ) { - if ( ! $term && ( is_tax() || is_tag() || is_category() ) ) { - $term = get_queried_object(); - if ( $term ) { - $taxonomy = $term->taxonomy; - $term = $term->term_id; - } - } - $description = get_term_field( 'description', $term, $taxonomy ); - return is_wp_error( $description ) ? '' : $description; -} - -/** - * Retrieve the terms of the taxonomy that are attached to the post. - * - * @since 2.5.0 - * - * @param int|object $post Post ID or object. - * @param string $taxonomy Taxonomy name. - * @return array|false|WP_Error Array of WP_Term objects on success, false if there are no terms - * or the post does not exist, WP_Error on failure. - */ -function get_the_terms( $post, $taxonomy ) { - if ( ! $post = get_post( $post ) ) - return false; - - $terms = get_object_term_cache( $post->ID, $taxonomy ); - if ( false === $terms ) { - $terms = wp_get_object_terms( $post->ID, $taxonomy ); - if ( ! is_wp_error( $terms ) ) { - $term_ids = wp_list_pluck( $terms, 'term_id' ); - wp_cache_add( $post->ID, $term_ids, $taxonomy . '_relationships' ); - } - } - - /** - * Filters the list of terms attached to the given post. - * - * @since 3.1.0 - * - * @param array|WP_Error $terms List of attached terms, or WP_Error on failure. - * @param int $post_id Post ID. - * @param string $taxonomy Name of the taxonomy. - */ - $terms = apply_filters( 'get_the_terms', $terms, $post->ID, $taxonomy ); - - if ( empty( $terms ) ) - return false; - - return $terms; -} - -/** - * Retrieve a post's terms as a list with specified format. - * - * @since 2.5.0 - * - * @param int $id Post ID. - * @param string $taxonomy Taxonomy name. - * @param string $before Optional. Before list. - * @param string $sep Optional. Separate items using this. - * @param string $after Optional. After list. - * @return string|false|WP_Error A list of terms on success, false if there are no terms, WP_Error on failure. - */ -function get_the_term_list( $id, $taxonomy, $before = '', $sep = '', $after = '' ) { - $terms = get_the_terms( $id, $taxonomy ); - - if ( is_wp_error( $terms ) ) - return $terms; - - if ( empty( $terms ) ) - return false; - - $links = array(); - - foreach ( $terms as $term ) { - $link = get_term_link( $term, $taxonomy ); - if ( is_wp_error( $link ) ) { - return $link; - } - $links[] = '<a href="' . esc_url( $link ) . '" rel="tag">' . $term->name . '</a>'; - } - - /** - * Filters the term links for a given taxonomy. - * - * The dynamic portion of the filter name, `$taxonomy`, refers - * to the taxonomy slug. - * - * @since 2.5.0 - * - * @param array $links An array of term links. - */ - $term_links = apply_filters( "term_links-{$taxonomy}", $links ); - - return $before . join( $sep, $term_links ) . $after; -} - -/** - * Display the terms in a list. - * - * @since 2.5.0 - * - * @param int $id Post ID. - * @param string $taxonomy Taxonomy name. - * @param string $before Optional. Before list. - * @param string $sep Optional. Separate items using this. - * @param string $after Optional. After list. - * @return false|void False on WordPress error. - */ -function the_terms( $id, $taxonomy, $before = '', $sep = ', ', $after = '' ) { - $term_list = get_the_term_list( $id, $taxonomy, $before, $sep, $after ); - - if ( is_wp_error( $term_list ) ) - return false; - - /** - * Filters the list of terms to display. - * - * @since 2.9.0 - * - * @param array $term_list List of terms to display. - * @param string $taxonomy The taxonomy name. - * @param string $before String to use before the terms. - * @param string $sep String to use between the terms. - * @param string $after String to use after the terms. - */ - echo apply_filters( 'the_terms', $term_list, $taxonomy, $before, $sep, $after ); -} - -/** - * Check if the current post has any of given category. - * - * @since 3.1.0 - * - * @param string|int|array $category Optional. The category name/term_id/slug or array of them to check for. - * @param int|object $post Optional. Post to check instead of the current post. - * @return bool True if the current post has any of the given categories (or any category, if no category specified). - */ -function has_category( $category = '', $post = null ) { - return has_term( $category, 'category', $post ); -} - -/** - * Check if the current post has any of given tags. - * - * The given tags are checked against the post's tags' term_ids, names and slugs. - * Tags given as integers will only be checked against the post's tags' term_ids. - * If no tags are given, determines if post has any tags. - * - * Prior to v2.7 of WordPress, tags given as integers would also be checked against the post's tags' names and slugs (in addition to term_ids) - * Prior to v2.7, this function could only be used in the WordPress Loop. - * As of 2.7, the function can be used anywhere if it is provided a post ID or post object. - * - * @since 2.6.0 - * - * @param string|int|array $tag Optional. The tag name/term_id/slug or array of them to check for. - * @param int|object $post Optional. Post to check instead of the current post. (since 2.7.0) - * @return bool True if the current post has any of the given tags (or any tag, if no tag specified). - */ -function has_tag( $tag = '', $post = null ) { - return has_term( $tag, 'post_tag', $post ); -} - -/** - * Check if the current post has any of given terms. - * - * The given terms are checked against the post's terms' term_ids, names and slugs. - * Terms given as integers will only be checked against the post's terms' term_ids. - * If no terms are given, determines if post has any terms. - * - * @since 3.1.0 - * - * @param string|int|array $term Optional. The term name/term_id/slug or array of them to check for. - * @param string $taxonomy Taxonomy name - * @param int|object $post Optional. Post to check instead of the current post. - * @return bool True if the current post has any of the given tags (or any tag, if no tag specified). - */ -function has_term( $term = '', $taxonomy = '', $post = null ) { - $post = get_post($post); - - if ( !$post ) - return false; - - $r = is_object_in_term( $post->ID, $taxonomy, $term ); - if ( is_wp_error( $r ) ) - return false; - - return $r; -} diff --git a/wp/wp-includes/category.php b/wp/wp-includes/category.php deleted file mode 100644 index 2ab54a5a..00000000 --- a/wp/wp-includes/category.php +++ /dev/null @@ -1,360 +0,0 @@ -<?php -/** - * Taxonomy API: Core category-specific functionality - * - * @package WordPress - * @subpackage Taxonomy - */ - -/** - * Retrieve list of category objects. - * - * If you change the type to 'link' in the arguments, then the link categories - * will be returned instead. Also all categories will be updated to be backward - * compatible with pre-2.3 plugins and themes. - * - * @since 2.1.0 - * @see get_terms() Type of arguments that can be changed. - * - * @param string|array $args { - * Optional. Arguments to retrieve categories. See get_terms() for additional options. - * - * @type string $taxonomy Taxonomy to retrieve terms for. In this case, default 'category'. - * } - * @return array List of categories. - */ -function get_categories( $args = '' ) { - $defaults = array( 'taxonomy' => 'category' ); - $args = wp_parse_args( $args, $defaults ); - - $taxonomy = $args['taxonomy']; - - /** - * Filters the taxonomy used to retrieve terms when calling get_categories(). - * - * @since 2.7.0 - * - * @param string $taxonomy Taxonomy to retrieve terms from. - * @param array $args An array of arguments. See get_terms(). - */ - $taxonomy = apply_filters( 'get_categories_taxonomy', $taxonomy, $args ); - - // Back compat - if ( isset($args['type']) && 'link' == $args['type'] ) { - /* translators: 1: "type => link", 2: "taxonomy => link_category" alternative */ - _deprecated_argument( __FUNCTION__, '3.0.0', - sprintf( __( '%1$s is deprecated. Use %2$s instead.' ), - '<code>type => link</code>', - '<code>taxonomy => link_category</code>' - ) - ); - $taxonomy = $args['taxonomy'] = 'link_category'; - } - - $categories = get_terms( $taxonomy, $args ); - - if ( is_wp_error( $categories ) ) { - $categories = array(); - } else { - $categories = (array) $categories; - foreach ( array_keys( $categories ) as $k ) { - _make_cat_compat( $categories[ $k ] ); - } - } - - return $categories; -} - -/** - * Retrieves category data given a category ID or category object. - * - * If you pass the $category parameter an object, which is assumed to be the - * category row object retrieved the database. It will cache the category data. - * - * If you pass $category an integer of the category ID, then that category will - * be retrieved from the database, if it isn't already cached, and pass it back. - * - * If you look at get_term(), then both types will be passed through several - * filters and finally sanitized based on the $filter parameter value. - * - * The category will converted to maintain backward compatibility. - * - * @since 1.5.1 - * - * @param int|object $category Category ID or Category row object - * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond to a - * WP_Term object, an associative array, or a numeric array, respectively. Default OBJECT. - * @param string $filter Optional. Default is raw or no WordPress defined filter will applied. - * @return object|array|WP_Error|null Category data in type defined by $output parameter. - * WP_Error if $category is empty, null if it does not exist. - */ -function get_category( $category, $output = OBJECT, $filter = 'raw' ) { - $category = get_term( $category, 'category', $output, $filter ); - - if ( is_wp_error( $category ) ) - return $category; - - _make_cat_compat( $category ); - - return $category; -} - -/** - * Retrieve category based on URL containing the category slug. - * - * Breaks the $category_path parameter up to get the category slug. - * - * Tries to find the child path and will return it. If it doesn't find a - * match, then it will return the first category matching slug, if $full_match, - * is set to false. If it does not, then it will return null. - * - * It is also possible that it will return a WP_Error object on failure. Check - * for it when using this function. - * - * @since 2.1.0 - * - * @param string $category_path URL containing category slugs. - * @param bool $full_match Optional. Whether full path should be matched. - * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond to - * a WP_Term object, an associative array, or a numeric array, respectively. Default OBJECT. - * @return WP_Term|array|WP_Error|null Type is based on $output value. - */ -function get_category_by_path( $category_path, $full_match = true, $output = OBJECT ) { - $category_path = rawurlencode( urldecode( $category_path ) ); - $category_path = str_replace( '%2F', '/', $category_path ); - $category_path = str_replace( '%20', ' ', $category_path ); - $category_paths = '/' . trim( $category_path, '/' ); - $leaf_path = sanitize_title( basename( $category_paths ) ); - $category_paths = explode( '/', $category_paths ); - $full_path = ''; - foreach ( (array) $category_paths as $pathdir ) { - $full_path .= ( $pathdir != '' ? '/' : '' ) . sanitize_title( $pathdir ); - } - $categories = get_terms( 'category', array('get' => 'all', 'slug' => $leaf_path) ); - - if ( empty( $categories ) ) { - return; - } - - foreach ( $categories as $category ) { - $path = '/' . $leaf_path; - $curcategory = $category; - while ( ( $curcategory->parent != 0 ) && ( $curcategory->parent != $curcategory->term_id ) ) { - $curcategory = get_term( $curcategory->parent, 'category' ); - if ( is_wp_error( $curcategory ) ) { - return $curcategory; - } - $path = '/' . $curcategory->slug . $path; - } - - if ( $path == $full_path ) { - $category = get_term( $category->term_id, 'category', $output ); - _make_cat_compat( $category ); - return $category; - } - } - - // If full matching is not required, return the first cat that matches the leaf. - if ( ! $full_match ) { - $category = get_term( reset( $categories )->term_id, 'category', $output ); - _make_cat_compat( $category ); - return $category; - } -} - -/** - * Retrieve category object by category slug. - * - * @since 2.3.0 - * - * @param string $slug The category slug. - * @return object Category data object - */ -function get_category_by_slug( $slug ) { - $category = get_term_by( 'slug', $slug, 'category' ); - if ( $category ) - _make_cat_compat( $category ); - - return $category; -} - -/** - * Retrieve the ID of a category from its name. - * - * @since 1.0.0 - * - * @param string $cat_name Category name. - * @return int 0, if failure and ID of category on success. - */ -function get_cat_ID( $cat_name ) { - $cat = get_term_by( 'name', $cat_name, 'category' ); - if ( $cat ) - return $cat->term_id; - return 0; -} - -/** - * Retrieve the name of a category from its ID. - * - * @since 1.0.0 - * - * @param int $cat_id Category ID - * @return string Category name, or an empty string if category doesn't exist. - */ -function get_cat_name( $cat_id ) { - $cat_id = (int) $cat_id; - $category = get_term( $cat_id, 'category' ); - if ( ! $category || is_wp_error( $category ) ) - return ''; - return $category->name; -} - -/** - * Check if a category is an ancestor of another category. - * - * You can use either an id or the category object for both parameters. If you - * use an integer the category will be retrieved. - * - * @since 2.1.0 - * - * @param int|object $cat1 ID or object to check if this is the parent category. - * @param int|object $cat2 The child category. - * @return bool Whether $cat2 is child of $cat1 - */ -function cat_is_ancestor_of( $cat1, $cat2 ) { - return term_is_ancestor_of( $cat1, $cat2, 'category' ); -} - -/** - * Sanitizes category data based on context. - * - * @since 2.3.0 - * - * @param object|array $category Category data - * @param string $context Optional. Default is 'display'. - * @return object|array Same type as $category with sanitized data for safe use. - */ -function sanitize_category( $category, $context = 'display' ) { - return sanitize_term( $category, 'category', $context ); -} - -/** - * Sanitizes data in single category key field. - * - * @since 2.3.0 - * - * @param string $field Category key to sanitize - * @param mixed $value Category value to sanitize - * @param int $cat_id Category ID - * @param string $context What filter to use, 'raw', 'display', etc. - * @return mixed Same type as $value after $value has been sanitized. - */ -function sanitize_category_field( $field, $value, $cat_id, $context ) { - return sanitize_term_field( $field, $value, $cat_id, 'category', $context ); -} - -/* Tags */ - -/** - * Retrieves all post tags. - * - * @since 2.3.0 - * @see get_terms() For list of arguments to pass. - * - * @param string|array $args Tag arguments to use when retrieving tags. - * @return array List of tags. - */ -function get_tags( $args = '' ) { - $tags = get_terms( 'post_tag', $args ); - - if ( empty( $tags ) ) { - $return = array(); - return $return; - } - - /** - * Filters the array of term objects returned for the 'post_tag' taxonomy. - * - * @since 2.3.0 - * - * @param array $tags Array of 'post_tag' term objects. - * @param array $args An array of arguments. @see get_terms() - */ - $tags = apply_filters( 'get_tags', $tags, $args ); - return $tags; -} - -/** - * Retrieve post tag by tag ID or tag object. - * - * If you pass the $tag parameter an object, which is assumed to be the tag row - * object retrieved the database. It will cache the tag data. - * - * If you pass $tag an integer of the tag ID, then that tag will - * be retrieved from the database, if it isn't already cached, and pass it back. - * - * If you look at get_term(), then both types will be passed through several - * filters and finally sanitized based on the $filter parameter value. - * - * @since 2.3.0 - * - * @param int|WP_Term|object $tag A tag ID or object. - * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond to - * a WP_Term object, an associative array, or a numeric array, respectively. Default OBJECT. - * @param string $filter Optional. Default is raw or no WordPress defined filter will applied. - * @return WP_Term|array|WP_Error|null Tag data in type defined by $output parameter. WP_Error if $tag is empty, null if it does not exist. - */ -function get_tag( $tag, $output = OBJECT, $filter = 'raw' ) { - return get_term( $tag, 'post_tag', $output, $filter ); -} - -/* Cache */ - -/** - * Remove the category cache data based on ID. - * - * @since 2.1.0 - * - * @param int $id Category ID - */ -function clean_category_cache( $id ) { - clean_term_cache( $id, 'category' ); -} - -/** - * Update category structure to old pre 2.3 from new taxonomy structure. - * - * This function was added for the taxonomy support to update the new category - * structure with the old category one. This will maintain compatibility with - * plugins and themes which depend on the old key or property names. - * - * The parameter should only be passed a variable and not create the array or - * object inline to the parameter. The reason for this is that parameter is - * passed by reference and PHP will fail unless it has the variable. - * - * There is no return value, because everything is updated on the variable you - * pass to it. This is one of the features with using pass by reference in PHP. - * - * @since 2.3.0 - * @since 4.4.0 The `$category` parameter now also accepts a WP_Term object. - * @access private - * - * @param array|object|WP_Term $category Category Row object or array - */ -function _make_cat_compat( &$category ) { - if ( is_object( $category ) && ! is_wp_error( $category ) ) { - $category->cat_ID = $category->term_id; - $category->category_count = $category->count; - $category->category_description = $category->description; - $category->cat_name = $category->name; - $category->category_nicename = $category->slug; - $category->category_parent = $category->parent; - } elseif ( is_array( $category ) && isset( $category['term_id'] ) ) { - $category['cat_ID'] = &$category['term_id']; - $category['category_count'] = &$category['count']; - $category['category_description'] = &$category['description']; - $category['cat_name'] = &$category['name']; - $category['category_nicename'] = &$category['slug']; - $category['category_parent'] = &$category['parent']; - } -} diff --git a/wp/wp-includes/certificates/ca-bundle.crt b/wp/wp-includes/certificates/ca-bundle.crt deleted file mode 100644 index 2ae3a97f..00000000 --- a/wp/wp-includes/certificates/ca-bundle.crt +++ /dev/null @@ -1,4327 +0,0 @@ -## -## Bundle of CA Root Certificates -## -## Certificate data from Mozilla as of: Wed Sep 16 08:58:11 2015 -## Includes a WordPress Modification - We include the 'legacy' 1024bit certificates -## for backward compatibility. See https://core.trac.wordpress.org/ticket/34935#comment:10 -## -## This is a bundle of X.509 certificates of public Certificate Authorities -## (CA). These were automatically extracted from Mozilla's root certificates -## file (certdata.txt). This file can be found in the mozilla source tree: -## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt -## -## It contains the certificates in PEM format and therefore -## can be directly used with curl / libcurl / php_curl, or with -## an Apache+mod_ssl webserver for SSL client authentication. -## Just configure this file as the SSLCACertificateFile. -## -## Conversion done with mk-ca-bundle.pl version 1.25. -## SHA1: ed3c0bbfb7912bcc00cd2033b0cb85c98d10559c -## - -GTE CyberTrust Global Root -========================== ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg -Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG -A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz -MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL -Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0 -IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u -sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql -HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID -AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW -M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF -NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -Thawte Server CA -================ ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE -AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j -b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV -BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u -c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG -A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0 -ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl -/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7 -1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR -MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J -GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ -GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -Thawte Premium Server CA -======================== ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs -dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE -AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl -ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU -VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2 -aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ -cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2 -aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh -Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/ -qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm -SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf -8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t -UCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- - -Equifax Secure CA -================= ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE -ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT -B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB -nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR -fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW -8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG -A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE -CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG -A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS -spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB -Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961 -zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB -BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95 -70+sB3c4 ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA -TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah -WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf -Tqj/ZA1k ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G2 -============================================================ ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT -MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz -dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO -FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71 -lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB -MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT -1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD -Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9 ------END CERTIFICATE----- - -GlobalSign Root CA -================== ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx -GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds -b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV -BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD -VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa -DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc -THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb -Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP -c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX -gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF -AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj -Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG -j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH -hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC -X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- - -GlobalSign Root CA - R2 -======================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 -ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp -s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN -S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL -TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C -ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E -FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i -YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN -BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp -9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu -01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 -9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- - - -ValiCert Class 1 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy -MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi -GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm -DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG -lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX -icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP -Orf1LXLI ------END CERTIFICATE----- - -ValiCert Class 2 VA -=================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC -CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf -ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ -SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV -UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8 -W9ViH0Pd ------END CERTIFICATE----- - -RSA Root Certificate 1 -====================== ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp -b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh -bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw -MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0 -d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg -UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0 -LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td -3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H -BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs -3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF -V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r -on+jjBXu ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 -EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc -cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw -EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj -055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f -j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 -xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa -t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- - -Verisign Class 4 Public Primary Certification Authority - G3 -============================================================ ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy -dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS -tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM -8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW -Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX -Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA -j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt -mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd -RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG -UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- - -Entrust.net Secure Server CA -============================ ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV -BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg -cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl -ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv -cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG -A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi -eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p -dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ -aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5 -gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw -ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw -CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l -dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw -NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow -HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN -Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9 -n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - -Entrust.net Premium 2048 Secure Server CA -========================================= ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u -ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp -bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx -NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 -d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u -ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL -Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr -hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW -nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi -VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ -KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy -T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf -zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT -J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e -nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= ------END CERTIFICATE----- - -Baltimore CyberTrust Root -========================= ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE -ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li -ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC -SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs -dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME -uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB -UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C -G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 -XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr -l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI -VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB -BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh -cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 -hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa -Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H -RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- - -Equifax Secure Global eBusiness CA -================================== ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp -bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx -HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds -b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV -PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN -qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn -hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j -BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs -MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN -I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY -NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -Equifax Secure eBusiness CA 1 -============================= ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB -LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE -ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz -IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ -1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a -IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk -MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW -Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF -AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5 -lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+ -KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - -AddTrust Low-Value Services Root -================================ ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU -cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw -CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO -ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 -54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr -oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 -Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui -GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w -HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD -AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT -RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw -HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt -ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph -iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr -mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj -ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- - -AddTrust External Root -====================== ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD -VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw -NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU -cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg -Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 -+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw -Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo -aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy -2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 -7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL -VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk -VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl -j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 -e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u -G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- - -AddTrust Public Services Root -============================= ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU -cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ -BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l -dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu -nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i -d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG -Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw -HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G -A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G -A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 -JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL -+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 -Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H -EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- - -AddTrust Qualified Certificates Root -==================================== ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU -cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx -CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ -IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx -64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 -KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o -L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR -wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU -MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE -BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y -azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG -GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze -RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB -iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= ------END CERTIFICATE----- - -Entrust Root Certification Authority -==================================== ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw -b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG -A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 -MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu -MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu -Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz -A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww -Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 -j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN -rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 -MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH -hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM -Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa -v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS -W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 -tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- - -RSA Security 2048 v3 -==================== ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK -ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy -MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb -BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 -Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb -WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH -KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP -+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ -MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E -FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY -v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj -0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj -VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 -nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA -pKnXwiJPZ9d37CAFYd4= ------END CERTIFICATE----- - -GeoTrust Global CA -================== ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw -MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo -BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet -8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc -T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU -vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD -AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk -DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q -zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 -d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 -mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p -XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm -Mw== ------END CERTIFICATE----- - -GeoTrust Global CA 2 -==================== ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw -MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j -LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ -NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k -LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA -Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b -HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH -K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 -srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh -ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL -OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC -x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF -H4z1Ir+rzoPz4iIprn2DQKi6bA== ------END CERTIFICATE----- - -GeoTrust Universal CA -===================== ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 -MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu -Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t -JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e -RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs -7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d -8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V -qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga -Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB -Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu -KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 -ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 -XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB -hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 -qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL -oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK -xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF -KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 -DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK -xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU -p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI -P/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- - -GeoTrust Universal CA 2 -======================= ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN -R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 -MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg -SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 -DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 -j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q -JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a -QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 -WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP -20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn -ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC -SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG -8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 -+/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E -BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ -4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ -mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq -A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg -Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP -pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d -FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp -gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm -X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- - - -America Online Root Certification Authority 1 -============================================= ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG -v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z -DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh -sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP -8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T -AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z -o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf -GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF -VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft -3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g -Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -America Online Root Certification Authority 2 -============================================= ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT -QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG -A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg -T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en -fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8 -f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO -qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN -RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0 -gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn -6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid -FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6 -Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj -B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op -aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY -T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p -+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg -JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy -zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO -ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh -1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf -GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff -Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP -cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk= ------END CERTIFICATE----- - -Visa eCommerce Root -=================== ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG -EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug -QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 -WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm -VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL -F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b -RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 -TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI -/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs -GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc -CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW -YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz -zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu -YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- - -Certum Root CA -============== ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK -ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla -Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u -by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x -wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL -kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ -89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K -Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P -NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq -hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ -GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg -GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ -0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS -qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- - -Comodo AAA Services root -======================== ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw -MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl -c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV -BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG -C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs -i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW -Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH -Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK -Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f -BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl -cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz -LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm -7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z -8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C -12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- - -Comodo Secure Services root -=========================== ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw -MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu -Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi -BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP -9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc -rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC -oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V -p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E -FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w -gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj -YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm -aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm -4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL -DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw -pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H -RR3B7Hzs/Sk= ------END CERTIFICATE----- - -Comodo Trusted Services root -============================ ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS -R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg -TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw -MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h -bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw -IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 -3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y -/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 -juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS -ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud -DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB -/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp -ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl -cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw -uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA -BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l -R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O -9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- - -QuoVadis Root CA -================ ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE -ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz -MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp -cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD -EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk -J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL -F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL -YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen -AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w -PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y -ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 -MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj -YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs -ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW -Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu -BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw -FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 -tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo -fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul -LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x -gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi -5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi -5nrQNiOKSnQ2+Q== ------END CERTIFICATE----- - -QuoVadis Root CA 2 -================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -QuoVadis Root CA 3 -================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - -Sonera Class 2 Root CA -====================== ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG -U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw -NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh -IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 -/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT -dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG -f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P -tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH -nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT -XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt -0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI -cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph -Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx -EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH -llpwrN9M ------END CERTIFICATE----- - -Staat der Nederlanden Root CA -============================= ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE -ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w -HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh -bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt -vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P -jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca -C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth -vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 -22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV -HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v -dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN -BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR -EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw -MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y -nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- - -UTN DATACorp SGC Root CA -======================== ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ -BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa -MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w -HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy -dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys -raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo -wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA -9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv -33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud -DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9 -BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD -LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3 -DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0 -I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx -EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP -DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- - -UTN USERFirst Hardware Root CA -============================== ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE -BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl -IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd -BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx -OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 -eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz -ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI -wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd -tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 -i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf -Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw -gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF -lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF -UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF -BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW -XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 -lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn -iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 -nfhmqA== ------END CERTIFICATE----- - -Camerfirma Chambers of Commerce Root -==================================== ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx -NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp -cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn -MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC -AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU -xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH -NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW -DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV -d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud -EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v -cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P -AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh -bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD -VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi -fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD -L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN -UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n -ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 -erfutGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- - -Camerfirma Global Chambersign Root -================================== ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe -QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i -ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx -NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt -YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg -MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw -ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J -1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O -by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl -6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c -8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ -BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j -aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B -Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj -aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y -ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA -PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y -gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ -PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 -IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes -t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- - -NetLock Notary (Class A) Root -============================= ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI -EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j -ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX -DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH -EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD -VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz -cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM -D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ -z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC -/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 -tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 -4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG -A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC -Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv -bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn -LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 -ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz -IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh -IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu -b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg -Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp -bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 -ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP -ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB -CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr -KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM -8CgHrTwXZoi1/baI ------END CERTIFICATE----- - - -NetLock Business (Class B) Root -=============================== ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg -VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD -VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv -bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg -VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB -iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S -o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr -1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV -HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ -RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh -dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0 -ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv -c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg -YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz -Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA -bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl -IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2 -YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj -cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM -43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR -stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -NetLock Express (Class C) Root -============================== ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT -CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV -BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ -BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 -dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j -ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z -W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63 -euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw -DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN -RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn -YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB -IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i -aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0 -ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y -emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k -IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ -UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg -YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2 -xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW -gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - -XRamp Global CA Root -==================== ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE -BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj -dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx -HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg -U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu -IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx -foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE -zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs -AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry -xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap -oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC -AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc -/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n -nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz -8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- - -Go Daddy Class 2 CA -=================== ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY -VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG -A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g -RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD -ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv -2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 -qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j -YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY -vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O -BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o -atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu -MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim -PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt -I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI -Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b -vZ8= ------END CERTIFICATE----- - -Starfield Class 2 CA -==================== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc -U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo -MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG -A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG -SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY -bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ -JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm -epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN -F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF -MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f -hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo -bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs -afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM -PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD -KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 -QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj -YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH -AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw -Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg -U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 -LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl -cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh -cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT -dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC -AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh -3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm -vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk -fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 -fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ -EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl -1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ -lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro -g14= ------END CERTIFICATE----- - -Taiwan GRCA -=========== ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG -EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X -DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv -dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN -w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 -BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O -1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO -htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov -J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 -Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t -B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB -O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 -lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV -HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 -09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj -Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 -Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU -D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz -DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk -Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk -7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ -CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy -+fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS ------END CERTIFICATE----- - -Swisscom Root CA 1 -================== ------BEGIN CERTIFICATE----- -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 -NY6E0F/6MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- - -DigiCert Assured ID Root CA -=========================== ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx -MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO -9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy -UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW -/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy -oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf -GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF -66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq -hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc -EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn -SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i -8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- - -DigiCert Global Root CA -======================= ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw -MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn -TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 -BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H -4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y -7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB -o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm -8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF -BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr -EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt -tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 -UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- - -DigiCert High Assurance EV Root CA -================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw -KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw -MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ -MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu -Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t -Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS -OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 -MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ -NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe -h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB -Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY -JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ -V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp -myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK -mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K ------END CERTIFICATE----- - -Certplus Class 2 Primary CA -=========================== ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE -BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN -OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy -dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR -5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ -Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO -YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e -e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME -CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ -YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t -L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD -P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R -TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ -7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW -//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- - -DST Root CA X3 -============== ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK -ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X -DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 -cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT -rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 -UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy -xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d -utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ -MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug -dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE -GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw -RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS -fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- - -DST ACES CA X6 -============== ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT -MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha -MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE -CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI -DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa -pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow -GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy -MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu -Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy -dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU -CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 -5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t -Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs -vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 -oKfN5XozNmr6mis= ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 1 -============================================== ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP -MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0 -acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx -MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB -TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC -aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX -yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i -Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ -8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4 -W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME -BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46 -sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE -q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY -nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2 -============================================== ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN -MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr -dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G -A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls -acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe -LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI -x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g -QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr -5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB -AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G -A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt -Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+ -hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P -9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5 -UrbnBEI= ------END CERTIFICATE----- - -SwissSign Gold CA - G2 -====================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -SwissSign Silver CA - G2 -======================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority -======================================== ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx -CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ -cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN -b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 -nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge -RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt -tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI -hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K -Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN -NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa -Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG -1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- - -thawte Primary Root CA -====================== ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 -MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg -SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv -KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT -FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs -oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ -1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc -q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K -aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p -afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD -VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF -AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE -uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 -jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH -z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G5 -============================================================ ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln -biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh -dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz -j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD -Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ -Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r -fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv -Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG -SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ -X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE -KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC -Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE -ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- - -SecureTrust CA -============== ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy -dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe -BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC -ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX -OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t -DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH -GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b -01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH -ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ -BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj -aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu -SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf -mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ -nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- - -Secure Global CA -================ ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG -EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH -bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg -MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg -Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx -YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ -bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g -8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV -HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi -0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn -oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA -MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ -OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn -CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 -3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- - -COMODO Certification Authority -============================== ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE -BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG -A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 -dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb -MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD -T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH -+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww -xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV -4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA -1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI -rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k -b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC -AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP -OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc -IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN -+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== ------END CERTIFICATE----- - -Network Solutions Certificate Authority -======================================= ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG -EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr -IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx -MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx -jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT -aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT -crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc -/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB -AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv -bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA -A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q -4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ -GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD -ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- - -WellsSecure Public Root Certificate Authority -============================================= ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM -F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw -NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN -MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl -bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD -VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 -iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 -i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 -bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB -K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB -AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu -cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm -lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB -i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww -GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI -K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 -bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj -qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es -E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ -tylv2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- - -COMODO ECC Certification Authority -================================== ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC -R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE -ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix -GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo -b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X -4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni -wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E -BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG -FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA -U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- - -IGC/A -===== ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD -VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE -Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy -MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI -EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT -STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 -TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW -So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy -HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd -frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ -tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB -egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC -iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK -q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q -MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI -lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF -0mBWWg== ------END CERTIFICATE----- - -Security Communication EV RootCA1 -================================= ------BEGIN CERTIFICATE----- -MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE -BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl -Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO -/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX -WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z -ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 -bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK -9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm -iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG -Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW -mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW -T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 ------END CERTIFICATE----- - -OISTE WISeKey Global Root GA CA -=============================== ------BEGIN CERTIFICATE----- -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE -BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG -A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH -bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD -VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw -IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 -IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 -Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg -Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD -d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ -/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R -LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ -KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm -MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 -+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY -okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= ------END CERTIFICATE----- - -Microsec e-Szigno Root CA -========================= ------BEGIN CERTIFICATE----- -MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE -BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL -EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 -MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz -dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT -GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG -d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N -oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc -QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ -PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb -MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG -IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD -VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 -LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A -dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn -AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA -4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg -AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA -egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 -Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO -PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv -c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h -cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw -IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT -WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV -MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER -MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp -Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal -HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT -nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE -aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a -86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK -yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB -S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= ------END CERTIFICATE----- - -Certigna -======== ------BEGIN CERTIFICATE----- -MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw -EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 -MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI -Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q -XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH -GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p -ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg -DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf -Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ -tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ -BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J -SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA -hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ -ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu -PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY -1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw -WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== ------END CERTIFICATE----- - -TC TrustCenter Class 2 CA II -============================ ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy -IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw -MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1 -c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE -AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw -IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2 -xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ -Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u -SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB -7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90 -Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU -cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i -SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G -dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ -KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj -TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP -JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk -vQ== ------END CERTIFICATE----- - -TC TrustCenter Universal CA I -============================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC -REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy -IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN -MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg -VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw -JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC -qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv -xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw -ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O -gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j -BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG -1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy -vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3 -ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a -7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- - -Deutsche Telekom Root CA 2 -========================== ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT -RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG -A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 -MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G -A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS -b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 -bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI -KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY -AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK -Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV -jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV -HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr -E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy -zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 -rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G -dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - -ComSign Secured CA -================== ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE -AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w -NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD -QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs -49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH -7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB -kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1 -9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw -AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t -U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA -j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC -AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a -BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp -FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP -51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- - -Cybertrust Global Root -====================== ------BEGIN CERTIFICATE----- -MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li -ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 -MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD -ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -+Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW -0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL -AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin -89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT -8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 -MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G -A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO -lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi -5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 -hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T -X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW -WL1WMRJOEcgh4LMRkWXbtKaIOM5V ------END CERTIFICATE----- - -ePKI Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG -EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg -Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx -MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq -MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B -AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs -IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi -lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv -qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX -12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O -WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ -ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao -lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ -vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi -Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi -MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH -ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 -1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq -KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV -xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP -NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r -GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE -xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx -gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy -sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD -BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= ------END CERTIFICATE----- - -T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 -============================================================================================================================= ------BEGIN CERTIFICATE----- -MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH -DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q -aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry -b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV -BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg -S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 -MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl -IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF -n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl -IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft -dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl -cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO -Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 -xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR -6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL -hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd -BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 -N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT -y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh -LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M -dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= ------END CERTIFICATE----- - -Buypass Class 2 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 -MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M -cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 -0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 -0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R -uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV -1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt -7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 -fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w -wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho ------END CERTIFICATE----- - -Buypass Class 3 CA 1 -==================== ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1 -MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh -c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx -ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0 -n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia -AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c -1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P -AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7 -pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA -EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5 -htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj -el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- - -EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 -========================================================================== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -certSIGN ROOT CA -================ ------BEGIN CERTIFICATE----- -MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD -VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa -Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE -CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I -JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH -rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 -ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD -0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 -AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B -Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB -AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 -SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 -x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt -vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz -TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD ------END CERTIFICATE----- - -CNNIC ROOT -========== ------BEGIN CERTIFICATE----- -MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE -ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw -OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD -o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz -VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT -VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or -czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK -y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC -wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S -lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 -Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM -O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 -BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 -G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m -mxE= ------END CERTIFICATE----- - -ApplicationCA - Japanese Government -=================================== ------BEGIN CERTIFICATE----- -MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT -SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw -MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl -cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB -CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 -fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN -wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE -jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu -nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU -WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV -BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD -vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs -o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g -/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD -io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW -dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL -rosot4LKGAfmt1t06SAZf7IbiVQ= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G3 -============================================= ------BEGIN CERTIFICATE----- -MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy -eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz -NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo -YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT -LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j -K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE -c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C -IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu -dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr -2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 -cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE -Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD -AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s -t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt ------END CERTIFICATE----- - -thawte Primary Root CA - G2 -=========================== ------BEGIN CERTIFICATE----- -MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC -VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu -IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg -Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV -MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG -b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt -IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS -LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 -8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU -mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN -G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K -rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== ------END CERTIFICATE----- - -thawte Primary Root CA - G3 -=========================== ------BEGIN CERTIFICATE----- -MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE -BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 -aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv -cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w -ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh -d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD -VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG -A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At -P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC -+BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY -7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW -vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ -KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK -A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu -t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC -8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm -er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= ------END CERTIFICATE----- - -GeoTrust Primary Certification Authority - G2 -============================================= ------BEGIN CERTIFICATE----- -MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 -OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg -MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl -b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG -BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc -KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD -VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ -EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m -ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 -npaqBA+K ------END CERTIFICATE----- - -VeriSign Universal Root Certification Authority -=============================================== ------BEGIN CERTIFICATE----- -MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE -BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO -ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk -IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u -IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV -UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj -1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP -MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 -9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I -AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR -tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G -CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O -a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud -DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 -Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx -Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx -P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P -wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 -mJO37M2CYfE45k+XmCpajQ== ------END CERTIFICATE----- - -VeriSign Class 3 Public Primary Certification Authority - G4 -============================================================ ------BEGIN CERTIFICATE----- -MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC -VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 -b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz -ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU -cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo -b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 -Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz -rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB -/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw -HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u -Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD -A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx -AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== ------END CERTIFICATE----- - -NetLock Arany (Class Gold) Főtanúsítvány -============================================ ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G -A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 -dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB -cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx -MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO -ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 -c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu -0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw -/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk -H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw -fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 -neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB -BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW -qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta -YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC -bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna -NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu -dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= ------END CERTIFICATE----- - -Staat der Nederlanden Root CA - G2 -================================== ------BEGIN CERTIFICATE----- -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 -66+KAQ== ------END CERTIFICATE----- - -CA Disig -======== ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK -QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw -MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz -bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm -GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD -Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo -hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt -ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w -gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P -AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz -aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff -ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa -BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t -WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 -mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ -CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K -ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA -4Z7CRneC9VkGjCFMhwnN5ag= ------END CERTIFICATE----- - -Juur-SK -======= ------BEGIN CERTIFICATE----- -MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA -c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw -DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG -SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy -aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf -TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC -+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw -UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa -Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF -MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD -HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh -AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA -cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr -AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw -cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE -FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G -A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo -ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL -abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 -IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh -Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 -yyqcjg== ------END CERTIFICATE----- - -Hongkong Post Root CA 1 -======================= ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT -DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx -NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n -IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 -ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr -auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh -qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY -V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV -HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i -h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio -l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei -IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps -T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT -c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== ------END CERTIFICATE----- - -SecureSign RootCA11 -=================== ------BEGIN CERTIFICATE----- -MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi -SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS -b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw -KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 -cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL -TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO -wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq -g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP -O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA -bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX -t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh -OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r -bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ -Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 -y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 -lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= ------END CERTIFICATE----- - -ACEDICOM Root -============= ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Verisign Class 3 Public Primary Certification Authority -======================================================= ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx -FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5 -IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow -XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz -IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA -A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94 -f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol -hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky -CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX -bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ -D/xwzoiQ ------END CERTIFICATE----- - -Microsec e-Szigno Root CA 2009 -============================== ------BEGIN CERTIFICATE----- -MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER -MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv -c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o -dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE -BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt -U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA -fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG -0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA -pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm -1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC -AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf -QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE -FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o -lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX -I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 -tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 -yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi -LXpUq3DDfSJlgnCW ------END CERTIFICATE----- - -GlobalSign Root CA - R3 -======================= ------BEGIN CERTIFICATE----- -MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv -YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh -bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT -aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln -bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt -iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ -0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 -rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl -OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 -xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 -lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 -EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E -bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 -YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r -kpeDMdmztcpHWD9f ------END CERTIFICATE----- - -Autoridad de Certificacion Firmaprofesional CIF A62634068 -========================================================= ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA -BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw -QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB -NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD -Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P -B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY -7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH -ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI -plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX -MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX -LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK -bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU -vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud -EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH -DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA -bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx -ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx -51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk -R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP -T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f -Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl -osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR -crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR -saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD -KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi -6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - -Izenpe.com -========== ------BEGIN CERTIFICATE----- -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 ------END CERTIFICATE----- - -Chambers of Commerce Root - 2008 -================================ ------BEGIN CERTIFICATE----- -MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy -Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl -ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF -EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl -cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA -XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj -h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ -ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk -NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g -D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 -lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ -0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj -ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 -EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI -G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ -BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh -bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh -bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC -CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH -AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 -wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH -3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU -RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 -M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 -YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF -9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK -zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG -nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg -OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ ------END CERTIFICATE----- - -Global Chambersign Root - 2008 -============================== ------BEGIN CERTIFICATE----- -MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD -MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv -bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu -QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx -NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg -Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ -QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD -aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf -VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf -XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 -ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB -/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA -TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M -H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe -Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF -HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh -wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB -AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT -BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE -BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm -aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm -aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp -1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 -dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG -/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 -ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s -dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg -9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH -foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du -qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr -P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq -c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z -09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B ------END CERTIFICATE----- - -Go Daddy Root Certificate Authority - G2 -======================================== ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu -MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 -MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 -b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G -A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq -9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD -+qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd -fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl -NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 -BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac -vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r -5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV -N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO -LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 ------END CERTIFICATE----- - -Starfield Root Certificate Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 -eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw -DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg -VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB -dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv -W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs -bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk -N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf -ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU -JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol -TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx -4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw -F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K -pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ -c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 ------END CERTIFICATE----- - -Starfield Services Root Certificate Authority - G2 -================================================== ------BEGIN CERTIFICATE----- -MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s -b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl -IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV -BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT -dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 -h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa -hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP -LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB -rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG -SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP -E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy -xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd -iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza -YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 ------END CERTIFICATE----- - -AffirmTrust Commercial -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw -MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb -DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV -C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 -BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww -MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV -HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG -hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi -qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv -0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh -sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= ------END CERTIFICATE----- - -AffirmTrust Networking -====================== ------BEGIN CERTIFICATE----- -MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw -MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly -bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF -AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE -Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI -dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 -/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb -h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV -HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC -AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu -UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 -12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 -WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 -/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= ------END CERTIFICATE----- - -AffirmTrust Premium -=================== ------BEGIN CERTIFICATE----- -MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS -BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy -OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy -dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn -BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV -5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs -+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd -GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R -p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI -S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 -6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 -/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo -+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv -MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg -Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC -6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S -L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK -+4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV -BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg -IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 -g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb -zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== ------END CERTIFICATE----- - -AffirmTrust Premium ECC -======================= ------BEGIN CERTIFICATE----- -MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV -BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx -MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U -cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA -IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ -N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW -BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK -BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X -57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM -eQ== ------END CERTIFICATE----- - -Certum Trusted Network CA -========================= ------BEGIN CERTIFICATE----- -MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK -ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy -MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU -ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC -l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J -J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 -fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 -cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB -Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw -DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj -jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 -mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj -Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI -03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= ------END CERTIFICATE----- - -Certinomis - Autorité Racine -============================= ------BEGIN CERTIFICATE----- -MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK -Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg -LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG -A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw -JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa -wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly -Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw -2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N -jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q -c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC -lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb -xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g -530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna -4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G -A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ -KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x -WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva -R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 -nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B -CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv -JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE -qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b -WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE -wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ -vgt2Fl43N+bYdJeimUV5 ------END CERTIFICATE----- - -Root CA Generalitat Valenciana -============================== ------BEGIN CERTIFICATE----- -MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE -ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 -IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 -WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE -CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G -CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 -F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B -ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ -D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte -JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB -AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n -dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB -ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl -AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA -YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy -AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA -aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt -AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA -YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu -AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA -OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 -dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV -BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G -A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S -b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh -TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz -Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 -NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH -iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt -+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= ------END CERTIFICATE----- - -A-Trust-nQual-03 -================ ------BEGIN CERTIFICATE----- -MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE -Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy -a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R -dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw -RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0 -ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1 -c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA -zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n -yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE -SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4 -iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V -cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV -eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40 -ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr -sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd -JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS -mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6 -ahq97BvIxYSazQ== ------END CERTIFICATE----- - -TWCA Root Certification Authority -================================= ------BEGIN CERTIFICATE----- -MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ -VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG -EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB -IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK -AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx -QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC -oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP -4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r -y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG -9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC -mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW -QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY -T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny -Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== ------END CERTIFICATE----- - -Security Communication RootCA2 -============================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc -U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh -dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC -SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy -aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ -+T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R -3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV -spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K -EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 -QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB -CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj -u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk -3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q -tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 -mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 ------END CERTIFICATE----- - -EC-ACC -====== ------BEGIN CERTIFICATE----- -MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE -BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w -ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD -VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE -CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT -BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 -MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt -SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl -Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh -cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK -w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT -ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 -HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a -E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw -0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD -VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 -Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l -dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ -lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa -Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe -l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 -E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D -5EI= ------END CERTIFICATE----- - -Hellenic Academic and Research Institutions RootCA 2011 -======================================================= ------BEGIN CERTIFICATE----- -MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT -O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y -aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT -AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z -IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo -IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI -1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa -71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u -8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH -3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ -MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 -MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu -b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt -XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 -TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD -/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N -7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 ------END CERTIFICATE----- - -Actalis Authentication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM -BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE -AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky -MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz -IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 -IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ -wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa -by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 -zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f -YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 -oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l -EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 -hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 -EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 -jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY -iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt -ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI -WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 -JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx -K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ -Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC -4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo -2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz -lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem -OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 -vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== ------END CERTIFICATE----- - -Trustis FPS Root CA -=================== ------BEGIN CERTIFICATE----- -MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG -EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 -IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV -BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ -RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk -H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa -cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt -o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA -AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd -BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c -GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC -yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P -8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV -l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl -iB6XzCGcKQENZetX2fNXlrtIzYE= ------END CERTIFICATE----- - -StartCom Certification Authority -================================ ------BEGIN CERTIFICATE----- -MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu -ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 -NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk -LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg -U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw -ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y -o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ -Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d -eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt -2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z -6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ -osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ -untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc -UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT -37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD -VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ -Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 -dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu -c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv -bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 -aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 -aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t -L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG -cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 -fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm -N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN -Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T -tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX -e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA -2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs -HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE -JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib -D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= ------END CERTIFICATE----- - -StartCom Certification Authority G2 -=================================== ------BEGIN CERTIFICATE----- -MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN -U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE -ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O -o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG -4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi -Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul -Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs -O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H -vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L -nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS -FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa -z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E -BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ -KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K -2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk -J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ -JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG -/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc -nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld -blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc -l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm -7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm -obp573PYtlNXLfbQ4ddI ------END CERTIFICATE----- - -Buypass Class 2 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X -DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 -g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn -9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b -/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU -CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff -awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI -zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn -Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX -Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs -M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s -A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI -osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S -aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd -DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD -LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 -oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC -wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS -CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN -rJgWVqA= ------END CERTIFICATE----- - -Buypass Class 3 Root CA -======================= ------BEGIN CERTIFICATE----- -MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU -QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X -DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 -eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH -sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR -5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh -7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ -ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH -2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV -/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ -RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA -Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq -j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF -AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV -cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G -uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG -Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 -ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 -KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz -6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug -UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe -eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi -Cp/HuZc= ------END CERTIFICATE----- - -T-TeleSec GlobalRoot Class 3 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx -MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK -9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU -NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF -iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W -0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr -AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb -fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT -ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h -P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml -e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== ------END CERTIFICATE----- - -TURKTRUST Certificate Services Provider Root 2007 -================================================= ------BEGIN CERTIFICATE----- -MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF -bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP -MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg -QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X -DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl -a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN -BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp -bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N -YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv -KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya -KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT -rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC -AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP -BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s -Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I -aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO -Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb -BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK -poRq0Tl9 ------END CERTIFICATE----- - -D-TRUST Root Class 3 CA 2 2009 -============================== ------BEGIN CERTIFICATE----- -MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe -Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE -LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD -ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA -BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv -KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z -p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC -AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ -4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y -eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw -MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G -PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw -OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm -2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 -o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV -dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph -X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= ------END CERTIFICATE----- - -D-TRUST Root Class 3 CA 2 EV 2009 -================================= ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw -OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK -DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw -OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS -egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh -zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T -7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 -sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 -11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv -cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v -ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El -MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp -b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh -c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ -PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 -nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX -ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA -NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv -w9y4AyHqnxbxLFS1 ------END CERTIFICATE----- - -PSCProcert -========== ------BEGIN CERTIFICATE----- -MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk -ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ -MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz -dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl -cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw -IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw -MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w -DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD -ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp -Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC -wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA -3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh -RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO -EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 -0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH -0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU -td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw -Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp -r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ -AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz -Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId -xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp -ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH -EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h -Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k -ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG -9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG -MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG -LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 -ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy -YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v -Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o -dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq -T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN -g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q -uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 -n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn -FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo -5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq -3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 -poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y -eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km ------END CERTIFICATE----- - -China Internet Network Information Center EV Certificates Root -============================================================== ------BEGIN CERTIFICATE----- -MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV -BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D -aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg -Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG -A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM -PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl -cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y -jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV -98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H -klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 -KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC -7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD -glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 -0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM -7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws -ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 -5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= ------END CERTIFICATE----- - -Swisscom Root CA 2 -================== ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG -EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy -dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2 -MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln -aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC -IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM -LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo -ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ -wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH -Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a -SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS -NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab -mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY -Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3 -qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw -HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O -BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu -MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO -v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ -82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz -o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs -a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx -OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW -mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o -+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC -rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX -5OfNeOI5wSsSnqaeG8XmDtkx2Q== ------END CERTIFICATE----- - -Swisscom Root EV CA 2 -===================== ------BEGIN CERTIFICATE----- -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 -l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= ------END CERTIFICATE----- - -CA Disig Root R1 -================ ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw -EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp -ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx -EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp -c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy -3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 -u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 -m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk -CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa -YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 -vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL -LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX -ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is -XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ -04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR -xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B -LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM -CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb -VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 -YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS -ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix -lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N -UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ -a7+h89n07eLw4+1knj0vllJPgFOL ------END CERTIFICATE----- - -CA Disig Root R2 -================ ------BEGIN CERTIFICATE----- -MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw -EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp -ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx -EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp -c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC -w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia -xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 -A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S -GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV -g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa -5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE -koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A -Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i -Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV -HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u -Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM -tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV -sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je -dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 -1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx -mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 -utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 -sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg -UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV -7+ZtsH8tZ/3zbBt1RqPlShfppNcL ------END CERTIFICATE----- - -ACCVRAIZ1 -========= ------BEGIN CERTIFICATE----- -MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB -SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 -MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH -UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC -DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM -jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 -RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD -aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ -0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG -WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 -8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR -5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J -9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK -Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw -Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu -Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 -VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM -Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA -QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh -AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA -YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj -AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA -IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk -aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 -dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 -MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI -hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E -R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN -YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 -nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ -TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 -sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h -I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg -Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd -3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p -EfbRD0tVNEYqi4Y7 ------END CERTIFICATE----- - -TWCA Global Root CA -=================== ------BEGIN CERTIFICATE----- -MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT -CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD -QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK -EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg -Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C -nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV -r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR -Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV -tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W -KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 -sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p -yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn -kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI -zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC -AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g -cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn -LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M -8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg -/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg -lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP -A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m -i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 -EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 -zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= ------END CERTIFICATE----- - -TeliaSonera Root CA v1 -====================== ------BEGIN CERTIFICATE----- -MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE -CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 -MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW -VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ -6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA -3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k -B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn -Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH -oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 -F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ -oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 -gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc -TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB -AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW -DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm -zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx -0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW -pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV -G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc -c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT -JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 -qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 -Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems -WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= ------END CERTIFICATE----- - -EE Certification Centre Root CA -=============================== ------BEGIN CERTIFICATE----- -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG -EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy -dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw -MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB -UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy -ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM -TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 -rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw -93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN -P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ -MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF -BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj -xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM -lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU -3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM -dcGWxZ0= ------END CERTIFICATE----- - -E-Tugra Certification Authority -=============================== ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w -DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls -ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw -NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx -QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl -cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD -DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd -hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K -CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g -ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ -BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 -E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz -rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq -jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 -dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB -/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG -MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK -kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO -XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 -VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo -a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc -dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV -KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT -Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 -8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G -C7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - -T-TeleSec GlobalRoot Class 2 -============================ ------BEGIN CERTIFICATE----- -MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM -IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU -cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx -MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz -dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD -ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ -SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F -vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 -2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV -WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy -YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 -r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf -vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR -3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN -9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== ------END CERTIFICATE----- - -Atos TrustedRoot 2011 -===================== ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU -cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 -MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG -A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV -hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr -54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ -DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 -HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR -z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R -l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ -bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h -k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh -TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 -61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G -3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed ------END CERTIFICATE----- - -QuoVadis Root CA 1 G3 -===================== ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG -A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv -b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN -MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg -RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE -PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm -PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 -Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN -ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l -g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV -7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX -9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f -iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg -t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI -hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC -MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 -GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct -Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP -+V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh -3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa -wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 -O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 -FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV -hMJKzRwuJIczYOXD ------END CERTIFICATE----- - -QuoVadis Root CA 2 G3 -===================== ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG -A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv -b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN -MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg -RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh -ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY -NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t -oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o -MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l -V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo -L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ -sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD -6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh -lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI -hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 -AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K -pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 -x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz -dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X -U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw -mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD -zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN -JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr -O3jtZsSOeWmD3n+M ------END CERTIFICATE----- - -QuoVadis Root CA 3 G3 -===================== ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG -A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv -b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN -MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg -RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 -IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL -Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe -6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 -I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U -VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 -5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi -Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM -dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt -rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD -AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI -hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px -KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS -t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ -TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du -DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib -Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD -hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX -0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW -dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 -PpxxVJkES/1Y+Zj0 ------END CERTIFICATE----- - -DigiCert Assured ID Root G2 -=========================== ------BEGIN CERTIFICATE----- -MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw -IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw -MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL -ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH -35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq -bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw -VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP -YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn -lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO -w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv -0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz -d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW -hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M -jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo -IhNzbM8m9Yop5w== ------END CERTIFICATE----- - -DigiCert Assured ID Root G3 -=========================== ------BEGIN CERTIFICATE----- -MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD -VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 -MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ -BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb -RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs -KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF -UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy -YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy -1vUhZscv6pZjamVFkpUBtA== ------END CERTIFICATE----- - -DigiCert Global Root G2 -======================= ------BEGIN CERTIFICATE----- -MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw -HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx -MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 -dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ -kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO -3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV -BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM -UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB -o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu -5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr -F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U -WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH -QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ -iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl -MrY= ------END CERTIFICATE----- - -DigiCert Global Root G3 -======================= ------BEGIN CERTIFICATE----- -MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV -UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD -VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw -MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k -aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C -AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O -YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP -BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp -Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y -3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 -VOKa5Vt8sycX ------END CERTIFICATE----- - -DigiCert Trusted Root G4 -======================== ------BEGIN CERTIFICATE----- -MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw -HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 -MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G -CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp -pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o -k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa -vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY -QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 -MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm -mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 -f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH -dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 -oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud -DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD -ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY -ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr -yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy -7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah -ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN -5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb -/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa -5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK -G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP -82Z+ ------END CERTIFICATE----- - -WoSign -====== ------BEGIN CERTIFICATE----- -MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG -EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g -QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ -BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA -vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO -CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX -2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5 -KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR -+ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez -EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk -lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2 -8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY -yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C -AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R -8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 -LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq -T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj -y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC -2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes -5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/ -EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh -mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx -kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi -kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w== ------END CERTIFICATE----- - -WoSign China -============ ------BEGIN CERTIFICATE----- -MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG -EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv -geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD -VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k -8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5 -uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85 -dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5 -Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy -b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc -76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m -+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6 -yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX -GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud -EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA -A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 -yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY -r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115 -j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A -kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97 -qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y -jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB -ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv -T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO -kI26oQ== ------END CERTIFICATE----- - -COMODO RSA Certification Authority -================================== ------BEGIN CERTIFICATE----- -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 -LaZRfyHBNVOFBkpdn627G190 ------END CERTIFICATE----- - -USERTrust RSA Certification Authority -===================================== ------BEGIN CERTIFICATE----- -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 -Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 ------END CERTIFICATE----- - -USERTrust ECC Certification Authority -===================================== ------BEGIN CERTIFICATE----- -MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC -VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC -VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU -aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 -0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez -nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV -HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB -HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu -9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= ------END CERTIFICATE----- - -GlobalSign ECC Root CA - R4 -=========================== ------BEGIN CERTIFICATE----- -MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb -R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD -EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb -R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD -EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl -OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P -AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV -MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF -JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= ------END CERTIFICATE----- - -GlobalSign ECC Root CA - R5 -=========================== ------BEGIN CERTIFICATE----- -MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb -R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD -EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb -R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD -EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 -SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS -h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd -BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx -uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 -yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 ------END CERTIFICATE----- - -Staat der Nederlanden Root CA - G3 -================================== ------BEGIN CERTIFICATE----- -MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC -TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l -ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y -olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t -x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy -EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K -Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur -mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 -1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp -07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo -FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE -41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu -yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD -U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq -KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 -v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA -8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b -8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r -mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq -1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI -JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV -tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= ------END CERTIFICATE----- - -Staat der Nederlanden EV Root CA -================================ ------BEGIN CERTIFICATE----- -MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE -CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g -RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M -MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl -cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk -SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW -O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r -0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 -Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV -XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr -08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV -0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd -74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx -fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC -MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa -ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI -eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu -c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq -5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN -b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN -f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi -5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 -WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK -DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy -eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== ------END CERTIFICATE----- - -IdenTrust Commercial Root CA 1 -============================== ------BEGIN CERTIFICATE----- -MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG -EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS -b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES -MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB -IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld -hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ -mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi -1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C -XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl -3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy -NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV -WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg -xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix -uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC -AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI -hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH -6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg -ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt -ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV -YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX -feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro -kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe -2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz -Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R -cGzM7vRX+Bi6hG6H ------END CERTIFICATE----- - -IdenTrust Public Sector Root CA 1 -================================= ------BEGIN CERTIFICATE----- -MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG -EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv -ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV -UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS -b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy -P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 -Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI -rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf -qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS -mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn -ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh -LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v -iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL -4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B -Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw -DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj -t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A -mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt -GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt -m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx -NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 -Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI -ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC -ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ -3Wl9af0AVqW3rLatt8o+Ae+c ------END CERTIFICATE----- - -Entrust Root Certification Authority - G2 -========================================= ------BEGIN CERTIFICATE----- -MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV -BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy -bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug -b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw -HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT -DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx -OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP -/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz -HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU -s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y -TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx -AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 -0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z -iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ -Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi -nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ -vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO -e4pIb4tF9g== ------END CERTIFICATE----- - -Entrust Root Certification Authority - EC1 -========================================== ------BEGIN CERTIFICATE----- -MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx -FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn -YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl -ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw -FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs -LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg -dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt -IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy -AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef -9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h -vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 -kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G ------END CERTIFICATE----- - -CFCA EV ROOT -============ ------BEGIN CERTIFICATE----- -MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE -CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB -IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw -MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD -DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV -BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD -7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN -uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW -ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 -xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f -py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K -gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol -hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ -tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf -BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB -/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB -ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q -ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua -4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG -E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX -BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn -aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy -PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX -kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C -ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su ------END CERTIFICATE----- diff --git a/wp/wp-includes/class-IXR.php b/wp/wp-includes/class-IXR.php deleted file mode 100644 index 706e5e32..00000000 --- a/wp/wp-includes/class-IXR.php +++ /dev/null @@ -1,60 +0,0 @@ -<?php -/** - * IXR - The Incutio XML-RPC Library - * - * Copyright (c) 2010, Incutio Ltd. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - Neither the name of Incutio Ltd. nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @package IXR - * @since 1.5.0 - * - * @copyright Incutio Ltd 2010 (http://www.incutio.com) - * @version 1.7.4 7th September 2010 - * @author Simon Willison - * @link http://scripts.incutio.com/xmlrpc/ Site/manual - * @license http://www.opensource.org/licenses/bsd-license.php BSD - */ - -require_once( ABSPATH . WPINC . '/IXR/class-IXR-server.php' ); - -require_once( ABSPATH . WPINC . '/IXR/class-IXR-base64.php' ); - -require_once( ABSPATH . WPINC . '/IXR/class-IXR-client.php' ); - -require_once( ABSPATH . WPINC . '/IXR/class-IXR-clientmulticall.php' ); - -require_once( ABSPATH . WPINC . '/IXR/class-IXR-date.php' ); - -require_once( ABSPATH . WPINC . '/IXR/class-IXR-error.php' ); - -require_once( ABSPATH . WPINC . '/IXR/class-IXR-introspectionserver.php' ); - -require_once( ABSPATH . WPINC . '/IXR/class-IXR-message.php' ); - -require_once( ABSPATH . WPINC . '/IXR/class-IXR-request.php' ); - -require_once( ABSPATH . WPINC . '/IXR/class-IXR-value.php' ); \ No newline at end of file diff --git a/wp/wp-includes/class-feed.php b/wp/wp-includes/class-feed.php deleted file mode 100644 index 62dd1195..00000000 --- a/wp/wp-includes/class-feed.php +++ /dev/null @@ -1,18 +0,0 @@ -<?php -/** - * Feed API - * - * @package WordPress - * @subpackage Feed - */ - -_deprecated_file( basename( __FILE__ ), '4.7.0', 'fetch_feed()' ); - -if ( ! class_exists( 'SimplePie', false ) ) { - require_once( ABSPATH . WPINC . '/class-simplepie.php' ); -} - -require_once( ABSPATH . WPINC . '/class-wp-feed-cache.php' ); -require_once( ABSPATH . WPINC . '/class-wp-feed-cache-transient.php' ); -require_once( ABSPATH . WPINC . '/class-wp-simplepie-file.php' ); -require_once( ABSPATH . WPINC . '/class-wp-simplepie-sanitize-kses.php' ); \ No newline at end of file diff --git a/wp/wp-includes/class-http.php b/wp/wp-includes/class-http.php deleted file mode 100644 index b9f5ab50..00000000 --- a/wp/wp-includes/class-http.php +++ /dev/null @@ -1,1018 +0,0 @@ -<?php -/** - * HTTP API: WP_Http class - * - * @package WordPress - * @subpackage HTTP - * @since 2.7.0 - */ - -if ( ! class_exists( 'Requests' ) ) { - require( ABSPATH . WPINC . '/class-requests.php' ); - - Requests::register_autoloader(); - Requests::set_certificate_path( ABSPATH . WPINC . '/certificates/ca-bundle.crt' ); -} - -/** - * Core class used for managing HTTP transports and making HTTP requests. - * - * This class is used to consistently make outgoing HTTP requests easy for developers - * while still being compatible with the many PHP configurations under which - * WordPress runs. - * - * Debugging includes several actions, which pass different variables for debugging the HTTP API. - * - * @since 2.7.0 - */ -class WP_Http { - - // Aliases for HTTP response codes. - const HTTP_CONTINUE = 100; - const SWITCHING_PROTOCOLS = 101; - const PROCESSING = 102; - - const OK = 200; - const CREATED = 201; - const ACCEPTED = 202; - const NON_AUTHORITATIVE_INFORMATION = 203; - const NO_CONTENT = 204; - const RESET_CONTENT = 205; - const PARTIAL_CONTENT = 206; - const MULTI_STATUS = 207; - const IM_USED = 226; - - const MULTIPLE_CHOICES = 300; - const MOVED_PERMANENTLY = 301; - const FOUND = 302; - const SEE_OTHER = 303; - const NOT_MODIFIED = 304; - const USE_PROXY = 305; - const RESERVED = 306; - const TEMPORARY_REDIRECT = 307; - const PERMANENT_REDIRECT = 308; - - const BAD_REQUEST = 400; - const UNAUTHORIZED = 401; - const PAYMENT_REQUIRED = 402; - const FORBIDDEN = 403; - const NOT_FOUND = 404; - const METHOD_NOT_ALLOWED = 405; - const NOT_ACCEPTABLE = 406; - const PROXY_AUTHENTICATION_REQUIRED = 407; - const REQUEST_TIMEOUT = 408; - const CONFLICT = 409; - const GONE = 410; - const LENGTH_REQUIRED = 411; - const PRECONDITION_FAILED = 412; - const REQUEST_ENTITY_TOO_LARGE = 413; - const REQUEST_URI_TOO_LONG = 414; - const UNSUPPORTED_MEDIA_TYPE = 415; - const REQUESTED_RANGE_NOT_SATISFIABLE = 416; - const EXPECTATION_FAILED = 417; - const IM_A_TEAPOT = 418; - const MISDIRECTED_REQUEST = 421; - const UNPROCESSABLE_ENTITY = 422; - const LOCKED = 423; - const FAILED_DEPENDENCY = 424; - const UPGRADE_REQUIRED = 426; - const PRECONDITION_REQUIRED = 428; - const TOO_MANY_REQUESTS = 429; - const REQUEST_HEADER_FIELDS_TOO_LARGE = 431; - const UNAVAILABLE_FOR_LEGAL_REASONS = 451; - - const INTERNAL_SERVER_ERROR = 500; - const NOT_IMPLEMENTED = 501; - const BAD_GATEWAY = 502; - const SERVICE_UNAVAILABLE = 503; - const GATEWAY_TIMEOUT = 504; - const HTTP_VERSION_NOT_SUPPORTED = 505; - const VARIANT_ALSO_NEGOTIATES = 506; - const INSUFFICIENT_STORAGE = 507; - const NOT_EXTENDED = 510; - const NETWORK_AUTHENTICATION_REQUIRED = 511; - - /** - * Send an HTTP request to a URI. - * - * Please note: The only URI that are supported in the HTTP Transport implementation - * are the HTTP and HTTPS protocols. - * - * @access public - * @since 2.7.0 - * - * @param string $url The request URL. - * @param string|array $args { - * Optional. Array or string of HTTP request arguments. - * - * @type string $method Request method. Accepts 'GET', 'POST', 'HEAD', or 'PUT'. - * Some transports technically allow others, but should not be - * assumed. Default 'GET'. - * @type int $timeout How long the connection should stay open in seconds. Default 5. - * @type int $redirection Number of allowed redirects. Not supported by all transports - * Default 5. - * @type string $httpversion Version of the HTTP protocol to use. Accepts '1.0' and '1.1'. - * Default '1.0'. - * @type string $user-agent User-agent value sent. - * Default WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ). - * @type bool $reject_unsafe_urls Whether to pass URLs through wp_http_validate_url(). - * Default false. - * @type bool $blocking Whether the calling code requires the result of the request. - * If set to false, the request will be sent to the remote server, - * and processing returned to the calling code immediately, the caller - * will know if the request succeeded or failed, but will not receive - * any response from the remote server. Default true. - * @type string|array $headers Array or string of headers to send with the request. - * Default empty array. - * @type array $cookies List of cookies to send with the request. Default empty array. - * @type string|array $body Body to send with the request. Default null. - * @type bool $compress Whether to compress the $body when sending the request. - * Default false. - * @type bool $decompress Whether to decompress a compressed response. If set to false and - * compressed content is returned in the response anyway, it will - * need to be separately decompressed. Default true. - * @type bool $sslverify Whether to verify SSL for the request. Default true. - * @type string sslcertificates Absolute path to an SSL certificate .crt file. - * Default ABSPATH . WPINC . '/certificates/ca-bundle.crt'. - * @type bool $stream Whether to stream to a file. If set to true and no filename was - * given, it will be droped it in the WP temp dir and its name will - * be set using the basename of the URL. Default false. - * @type string $filename Filename of the file to write to when streaming. $stream must be - * set to true. Default null. - * @type int $limit_response_size Size in bytes to limit the response to. Default null. - * - * } - * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. - * A WP_Error instance upon error. - */ - public function request( $url, $args = array() ) { - $defaults = array( - 'method' => 'GET', - /** - * Filters the timeout value for an HTTP request. - * - * @since 2.7.0 - * - * @param int $timeout_value Time in seconds until a request times out. - * Default 5. - */ - 'timeout' => apply_filters( 'http_request_timeout', 5 ), - /** - * Filters the number of redirects allowed during an HTTP request. - * - * @since 2.7.0 - * - * @param int $redirect_count Number of redirects allowed. Default 5. - */ - 'redirection' => apply_filters( 'http_request_redirection_count', 5 ), - /** - * Filters the version of the HTTP protocol used in a request. - * - * @since 2.7.0 - * - * @param string $version Version of HTTP used. Accepts '1.0' and '1.1'. - * Default '1.0'. - */ - 'httpversion' => apply_filters( 'http_request_version', '1.0' ), - /** - * Filters the user agent value sent with an HTTP request. - * - * @since 2.7.0 - * - * @param string $user_agent WordPress user agent string. - */ - 'user-agent' => apply_filters( 'http_headers_useragent', 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ) ), - /** - * Filters whether to pass URLs through wp_http_validate_url() in an HTTP request. - * - * @since 3.6.0 - * - * @param bool $pass_url Whether to pass URLs through wp_http_validate_url(). - * Default false. - */ - 'reject_unsafe_urls' => apply_filters( 'http_request_reject_unsafe_urls', false ), - 'blocking' => true, - 'headers' => array(), - 'cookies' => array(), - 'body' => null, - 'compress' => false, - 'decompress' => true, - 'sslverify' => true, - 'sslcertificates' => ABSPATH . WPINC . '/certificates/ca-bundle.crt', - 'stream' => false, - 'filename' => null, - 'limit_response_size' => null, - ); - - // Pre-parse for the HEAD checks. - $args = wp_parse_args( $args ); - - // By default, Head requests do not cause redirections. - if ( isset($args['method']) && 'HEAD' == $args['method'] ) - $defaults['redirection'] = 0; - - $r = wp_parse_args( $args, $defaults ); - /** - * Filters the arguments used in an HTTP request. - * - * @since 2.7.0 - * - * @param array $r An array of HTTP request arguments. - * @param string $url The request URL. - */ - $r = apply_filters( 'http_request_args', $r, $url ); - - // The transports decrement this, store a copy of the original value for loop purposes. - if ( ! isset( $r['_redirection'] ) ) - $r['_redirection'] = $r['redirection']; - - /** - * Filters whether to preempt an HTTP request's return value. - * - * Returning a non-false value from the filter will short-circuit the HTTP request and return - * early with that value. A filter should return either: - * - * - An array containing 'headers', 'body', 'response', 'cookies', and 'filename' elements - * - A WP_Error instance - * - boolean false (to avoid short-circuiting the response) - * - * Returning any other value may result in unexpected behaviour. - * - * @since 2.9.0 - * - * @param false|array|WP_Error $preempt Whether to preempt an HTTP request's return value. Default false. - * @param array $r HTTP request arguments. - * @param string $url The request URL. - */ - $pre = apply_filters( 'pre_http_request', false, $r, $url ); - - if ( false !== $pre ) - return $pre; - - if ( function_exists( 'wp_kses_bad_protocol' ) ) { - if ( $r['reject_unsafe_urls'] ) { - $url = wp_http_validate_url( $url ); - } - if ( $url ) { - $url = wp_kses_bad_protocol( $url, array( 'http', 'https', 'ssl' ) ); - } - } - - $arrURL = @parse_url( $url ); - - if ( empty( $url ) || empty( $arrURL['scheme'] ) ) { - return new WP_Error('http_request_failed', __('A valid URL was not provided.')); - } - - if ( $this->block_request( $url ) ) { - return new WP_Error( 'http_request_failed', __( 'User has blocked requests through HTTP.' ) ); - } - - // If we are streaming to a file but no filename was given drop it in the WP temp dir - // and pick its name using the basename of the $url - if ( $r['stream'] ) { - if ( empty( $r['filename'] ) ) { - $r['filename'] = get_temp_dir() . basename( $url ); - } - - // Force some settings if we are streaming to a file and check for existence and perms of destination directory - $r['blocking'] = true; - if ( ! wp_is_writable( dirname( $r['filename'] ) ) ) { - return new WP_Error( 'http_request_failed', __( 'Destination directory for file streaming does not exist or is not writable.' ) ); - } - } - - if ( is_null( $r['headers'] ) ) { - $r['headers'] = array(); - } - - // WP allows passing in headers as a string, weirdly. - if ( ! is_array( $r['headers'] ) ) { - $processedHeaders = WP_Http::processHeaders( $r['headers'] ); - $r['headers'] = $processedHeaders['headers']; - } - - // Setup arguments - $headers = $r['headers']; - $data = $r['body']; - $type = $r['method']; - $options = array( - 'timeout' => $r['timeout'], - 'useragent' => $r['user-agent'], - 'blocking' => $r['blocking'], - 'hooks' => new WP_HTTP_Requests_Hooks( $url, $r ), - ); - - // Ensure redirects follow browser behaviour. - $options['hooks']->register( 'requests.before_redirect', array( get_class(), 'browser_redirect_compatibility' ) ); - - if ( $r['stream'] ) { - $options['filename'] = $r['filename']; - } - if ( empty( $r['redirection'] ) ) { - $options['follow_redirects'] = false; - } else { - $options['redirects'] = $r['redirection']; - } - - // Use byte limit, if we can - if ( isset( $r['limit_response_size'] ) ) { - $options['max_bytes'] = $r['limit_response_size']; - } - - // If we've got cookies, use and convert them to Requests_Cookie. - if ( ! empty( $r['cookies'] ) ) { - $options['cookies'] = WP_Http::normalize_cookies( $r['cookies'] ); - } - - // SSL certificate handling - if ( ! $r['sslverify'] ) { - $options['verify'] = false; - $options['verifyname'] = false; - } else { - $options['verify'] = $r['sslcertificates']; - } - - // All non-GET/HEAD requests should put the arguments in the form body. - if ( 'HEAD' !== $type && 'GET' !== $type ) { - $options['data_format'] = 'body'; - } - - /** - * Filters whether SSL should be verified for non-local requests. - * - * @since 2.8.0 - * - * @param bool $ssl_verify Whether to verify the SSL connection. Default true. - */ - $options['verify'] = apply_filters( 'https_ssl_verify', $options['verify'] ); - - // Check for proxies. - $proxy = new WP_HTTP_Proxy(); - if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { - $options['proxy'] = new Requests_Proxy_HTTP( $proxy->host() . ':' . $proxy->port() ); - - if ( $proxy->use_authentication() ) { - $options['proxy']->use_authentication = true; - $options['proxy']->user = $proxy->username(); - $options['proxy']->pass = $proxy->password(); - } - } - - // Avoid issues where mbstring.func_overload is enabled - mbstring_binary_safe_encoding(); - - try { - $requests_response = Requests::request( $url, $headers, $data, $type, $options ); - - // Convert the response into an array - $http_response = new WP_HTTP_Requests_Response( $requests_response, $r['filename'] ); - $response = $http_response->to_array(); - - // Add the original object to the array. - $response['http_response'] = $http_response; - } - catch ( Requests_Exception $e ) { - $response = new WP_Error( 'http_request_failed', $e->getMessage() ); - } - - reset_mbstring_encoding(); - - /** - * Fires after an HTTP API response is received and before the response is returned. - * - * @since 2.8.0 - * - * @param array|WP_Error $response HTTP response or WP_Error object. - * @param string $context Context under which the hook is fired. - * @param string $class HTTP transport used. - * @param array $args HTTP request arguments. - * @param string $url The request URL. - */ - do_action( 'http_api_debug', $response, 'response', 'Requests', $r, $url ); - if ( is_wp_error( $response ) ) { - return $response; - } - - if ( ! $r['blocking'] ) { - return array( - 'headers' => array(), - 'body' => '', - 'response' => array( - 'code' => false, - 'message' => false, - ), - 'cookies' => array(), - 'http_response' => null, - ); - } - - /** - * Filters the HTTP API response immediately before the response is returned. - * - * @since 2.9.0 - * - * @param array $response HTTP response. - * @param array $r HTTP request arguments. - * @param string $url The request URL. - */ - return apply_filters( 'http_response', $response, $r, $url ); - } - - /** - * Normalizes cookies for using in Requests. - * - * @since 4.6.0 - * @access public - * @static - * - * @param array $cookies List of cookies to send with the request. - * @return Requests_Cookie_Jar Cookie holder object. - */ - public static function normalize_cookies( $cookies ) { - $cookie_jar = new Requests_Cookie_Jar(); - - foreach ( $cookies as $name => $value ) { - if ( $value instanceof WP_Http_Cookie ) { - $cookie_jar[ $value->name ] = new Requests_Cookie( $value->name, $value->value, $value->get_attributes() ); - } elseif ( is_scalar( $value ) ) { - $cookie_jar[ $name ] = new Requests_Cookie( $name, $value ); - } - } - - return $cookie_jar; - } - - /** - * Match redirect behaviour to browser handling. - * - * Changes 302 redirects from POST to GET to match browser handling. Per - * RFC 7231, user agents can deviate from the strict reading of the - * specification for compatibility purposes. - * - * @since 4.6.0 - * @access public - * @static - * - * @param string $location URL to redirect to. - * @param array $headers Headers for the redirect. - * @param array $options Redirect request options. - * @param Requests_Response $original Response object. - */ - public static function browser_redirect_compatibility( $location, $headers, $data, &$options, $original ) { - // Browser compat - if ( $original->status_code === 302 ) { - $options['type'] = Requests::GET; - } - } - - /** - * Tests which transports are capable of supporting the request. - * - * @since 3.2.0 - * @access public - * - * @param array $args Request arguments - * @param string $url URL to Request - * - * @return string|false Class name for the first transport that claims to support the request. False if no transport claims to support the request. - */ - public function _get_first_available_transport( $args, $url = null ) { - $transports = array( 'curl', 'streams' ); - - /** - * Filters which HTTP transports are available and in what order. - * - * @since 3.7.0 - * - * @param array $transports Array of HTTP transports to check. Default array contains - * 'curl', and 'streams', in that order. - * @param array $args HTTP request arguments. - * @param string $url The URL to request. - */ - $request_order = apply_filters( 'http_api_transports', $transports, $args, $url ); - - // Loop over each transport on each HTTP request looking for one which will serve this request's needs. - foreach ( $request_order as $transport ) { - if ( in_array( $transport, $transports ) ) { - $transport = ucfirst( $transport ); - } - $class = 'WP_Http_' . $transport; - - // Check to see if this transport is a possibility, calls the transport statically. - if ( !call_user_func( array( $class, 'test' ), $args, $url ) ) - continue; - - return $class; - } - - return false; - } - - /** - * Dispatches a HTTP request to a supporting transport. - * - * Tests each transport in order to find a transport which matches the request arguments. - * Also caches the transport instance to be used later. - * - * The order for requests is cURL, and then PHP Streams. - * - * @since 3.2.0 - * - * @static - * @access private - * - * @param string $url URL to Request - * @param array $args Request arguments - * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error - */ - private function _dispatch_request( $url, $args ) { - static $transports = array(); - - $class = $this->_get_first_available_transport( $args, $url ); - if ( !$class ) - return new WP_Error( 'http_failure', __( 'There are no HTTP transports available which can complete the requested request.' ) ); - - // Transport claims to support request, instantiate it and give it a whirl. - if ( empty( $transports[$class] ) ) - $transports[$class] = new $class; - - $response = $transports[$class]->request( $url, $args ); - - /** This action is documented in wp-includes/class-http.php */ - do_action( 'http_api_debug', $response, 'response', $class, $args, $url ); - - if ( is_wp_error( $response ) ) - return $response; - - /** - * Filters the HTTP API response immediately before the response is returned. - * - * @since 2.9.0 - * - * @param array $response HTTP response. - * @param array $args HTTP request arguments. - * @param string $url The request URL. - */ - return apply_filters( 'http_response', $response, $args, $url ); - } - - /** - * Uses the POST HTTP method. - * - * Used for sending data that is expected to be in the body. - * - * @access public - * @since 2.7.0 - * - * @param string $url The request URL. - * @param string|array $args Optional. Override the defaults. - * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error - */ - public function post($url, $args = array()) { - $defaults = array('method' => 'POST'); - $r = wp_parse_args( $args, $defaults ); - return $this->request($url, $r); - } - - /** - * Uses the GET HTTP method. - * - * Used for sending data that is expected to be in the body. - * - * @access public - * @since 2.7.0 - * - * @param string $url The request URL. - * @param string|array $args Optional. Override the defaults. - * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error - */ - public function get($url, $args = array()) { - $defaults = array('method' => 'GET'); - $r = wp_parse_args( $args, $defaults ); - return $this->request($url, $r); - } - - /** - * Uses the HEAD HTTP method. - * - * Used for sending data that is expected to be in the body. - * - * @access public - * @since 2.7.0 - * - * @param string $url The request URL. - * @param string|array $args Optional. Override the defaults. - * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error - */ - public function head($url, $args = array()) { - $defaults = array('method' => 'HEAD'); - $r = wp_parse_args( $args, $defaults ); - return $this->request($url, $r); - } - - /** - * Parses the responses and splits the parts into headers and body. - * - * @access public - * @static - * @since 2.7.0 - * - * @param string $strResponse The full response string - * @return array Array with 'headers' and 'body' keys. - */ - public static function processResponse($strResponse) { - $res = explode("\r\n\r\n", $strResponse, 2); - - return array('headers' => $res[0], 'body' => isset($res[1]) ? $res[1] : ''); - } - - /** - * Transform header string into an array. - * - * If an array is given then it is assumed to be raw header data with numeric keys with the - * headers as the values. No headers must be passed that were already processed. - * - * @access public - * @static - * @since 2.7.0 - * - * @param string|array $headers - * @param string $url The URL that was requested - * @return array Processed string headers. If duplicate headers are encountered, - * Then a numbered array is returned as the value of that header-key. - */ - public static function processHeaders( $headers, $url = '' ) { - // Split headers, one per array element. - if ( is_string($headers) ) { - // Tolerate line terminator: CRLF = LF (RFC 2616 19.3). - $headers = str_replace("\r\n", "\n", $headers); - /* - * Unfold folded header fields. LWS = [CRLF] 1*( SP | HT ) <US-ASCII SP, space (32)>, - * <US-ASCII HT, horizontal-tab (9)> (RFC 2616 2.2). - */ - $headers = preg_replace('/\n[ \t]/', ' ', $headers); - // Create the headers array. - $headers = explode("\n", $headers); - } - - $response = array('code' => 0, 'message' => ''); - - /* - * If a redirection has taken place, The headers for each page request may have been passed. - * In this case, determine the final HTTP header and parse from there. - */ - for ( $i = count($headers)-1; $i >= 0; $i-- ) { - if ( !empty($headers[$i]) && false === strpos($headers[$i], ':') ) { - $headers = array_splice($headers, $i); - break; - } - } - - $cookies = array(); - $newheaders = array(); - foreach ( (array) $headers as $tempheader ) { - if ( empty($tempheader) ) - continue; - - if ( false === strpos($tempheader, ':') ) { - $stack = explode(' ', $tempheader, 3); - $stack[] = ''; - list( , $response['code'], $response['message']) = $stack; - continue; - } - - list($key, $value) = explode(':', $tempheader, 2); - - $key = strtolower( $key ); - $value = trim( $value ); - - if ( isset( $newheaders[ $key ] ) ) { - if ( ! is_array( $newheaders[ $key ] ) ) - $newheaders[$key] = array( $newheaders[ $key ] ); - $newheaders[ $key ][] = $value; - } else { - $newheaders[ $key ] = $value; - } - if ( 'set-cookie' == $key ) - $cookies[] = new WP_Http_Cookie( $value, $url ); - } - - // Cast the Response Code to an int - $response['code'] = intval( $response['code'] ); - - return array('response' => $response, 'headers' => $newheaders, 'cookies' => $cookies); - } - - /** - * Takes the arguments for a ::request() and checks for the cookie array. - * - * If it's found, then it upgrades any basic name => value pairs to WP_Http_Cookie instances, - * which are each parsed into strings and added to the Cookie: header (within the arguments array). - * Edits the array by reference. - * - * @access public - * @version 2.8.0 - * @static - * - * @param array $r Full array of args passed into ::request() - */ - public static function buildCookieHeader( &$r ) { - if ( ! empty($r['cookies']) ) { - // Upgrade any name => value cookie pairs to WP_HTTP_Cookie instances. - foreach ( $r['cookies'] as $name => $value ) { - if ( ! is_object( $value ) ) - $r['cookies'][ $name ] = new WP_Http_Cookie( array( 'name' => $name, 'value' => $value ) ); - } - - $cookies_header = ''; - foreach ( (array) $r['cookies'] as $cookie ) { - $cookies_header .= $cookie->getHeaderValue() . '; '; - } - - $cookies_header = substr( $cookies_header, 0, -2 ); - $r['headers']['cookie'] = $cookies_header; - } - } - - /** - * Decodes chunk transfer-encoding, based off the HTTP 1.1 specification. - * - * Based off the HTTP http_encoding_dechunk function. - * - * @link https://tools.ietf.org/html/rfc2616#section-19.4.6 Process for chunked decoding. - * - * @access public - * @since 2.7.0 - * @static - * - * @param string $body Body content - * @return string Chunked decoded body on success or raw body on failure. - */ - public static function chunkTransferDecode( $body ) { - // The body is not chunked encoded or is malformed. - if ( ! preg_match( '/^([0-9a-f]+)[^\r\n]*\r\n/i', trim( $body ) ) ) - return $body; - - $parsed_body = ''; - - // We'll be altering $body, so need a backup in case of error. - $body_original = $body; - - while ( true ) { - $has_chunk = (bool) preg_match( '/^([0-9a-f]+)[^\r\n]*\r\n/i', $body, $match ); - if ( ! $has_chunk || empty( $match[1] ) ) - return $body_original; - - $length = hexdec( $match[1] ); - $chunk_length = strlen( $match[0] ); - - // Parse out the chunk of data. - $parsed_body .= substr( $body, $chunk_length, $length ); - - // Remove the chunk from the raw data. - $body = substr( $body, $length + $chunk_length ); - - // End of the document. - if ( '0' === trim( $body ) ) - return $parsed_body; - } - } - - /** - * Block requests through the proxy. - * - * Those who are behind a proxy and want to prevent access to certain hosts may do so. This will - * prevent plugins from working and core functionality, if you don't include api.wordpress.org. - * - * You block external URL requests by defining WP_HTTP_BLOCK_EXTERNAL as true in your wp-config.php - * file and this will only allow localhost and your site to make requests. The constant - * WP_ACCESSIBLE_HOSTS will allow additional hosts to go through for requests. The format of the - * WP_ACCESSIBLE_HOSTS constant is a comma separated list of hostnames to allow, wildcard domains - * are supported, eg *.wordpress.org will allow for all subdomains of wordpress.org to be contacted. - * - * @since 2.8.0 - * @link https://core.trac.wordpress.org/ticket/8927 Allow preventing external requests. - * @link https://core.trac.wordpress.org/ticket/14636 Allow wildcard domains in WP_ACCESSIBLE_HOSTS - * - * @staticvar array|null $accessible_hosts - * @staticvar array $wildcard_regex - * - * @param string $uri URI of url. - * @return bool True to block, false to allow. - */ - public function block_request($uri) { - // We don't need to block requests, because nothing is blocked. - if ( ! defined( 'WP_HTTP_BLOCK_EXTERNAL' ) || ! WP_HTTP_BLOCK_EXTERNAL ) - return false; - - $check = parse_url($uri); - if ( ! $check ) - return true; - - $home = parse_url( get_option('siteurl') ); - - // Don't block requests back to ourselves by default. - if ( 'localhost' == $check['host'] || ( isset( $home['host'] ) && $home['host'] == $check['host'] ) ) { - /** - * Filters whether to block local requests through the proxy. - * - * @since 2.8.0 - * - * @param bool $block Whether to block local requests through proxy. - * Default false. - */ - return apply_filters( 'block_local_requests', false ); - } - - if ( !defined('WP_ACCESSIBLE_HOSTS') ) - return true; - - static $accessible_hosts = null; - static $wildcard_regex = array(); - if ( null === $accessible_hosts ) { - $accessible_hosts = preg_split('|,\s*|', WP_ACCESSIBLE_HOSTS); - - if ( false !== strpos(WP_ACCESSIBLE_HOSTS, '*') ) { - $wildcard_regex = array(); - foreach ( $accessible_hosts as $host ) - $wildcard_regex[] = str_replace( '\*', '.+', preg_quote( $host, '/' ) ); - $wildcard_regex = '/^(' . implode('|', $wildcard_regex) . ')$/i'; - } - } - - if ( !empty($wildcard_regex) ) - return !preg_match($wildcard_regex, $check['host']); - else - return !in_array( $check['host'], $accessible_hosts ); //Inverse logic, If it's in the array, then we can't access it. - - } - - /** - * Used as a wrapper for PHP's parse_url() function that handles edgecases in < PHP 5.4.7. - * - * @access protected - * @deprecated 4.4.0 Use wp_parse_url() - * @see wp_parse_url() - * - * @param string $url The URL to parse. - * @return bool|array False on failure; Array of URL components on success; - * See parse_url()'s return values. - */ - protected static function parse_url( $url ) { - _deprecated_function( __METHOD__, '4.4.0', 'wp_parse_url()' ); - return wp_parse_url( $url ); - } - - /** - * Converts a relative URL to an absolute URL relative to a given URL. - * - * If an Absolute URL is provided, no processing of that URL is done. - * - * @since 3.4.0 - * - * @static - * @access public - * - * @param string $maybe_relative_path The URL which might be relative - * @param string $url The URL which $maybe_relative_path is relative to - * @return string An Absolute URL, in a failure condition where the URL cannot be parsed, the relative URL will be returned. - */ - public static function make_absolute_url( $maybe_relative_path, $url ) { - if ( empty( $url ) ) - return $maybe_relative_path; - - if ( ! $url_parts = wp_parse_url( $url ) ) { - return $maybe_relative_path; - } - - if ( ! $relative_url_parts = wp_parse_url( $maybe_relative_path ) ) { - return $maybe_relative_path; - } - - // Check for a scheme on the 'relative' url - if ( ! empty( $relative_url_parts['scheme'] ) ) { - return $maybe_relative_path; - } - - $absolute_path = $url_parts['scheme'] . '://'; - - // Schemeless URL's will make it this far, so we check for a host in the relative url and convert it to a protocol-url - if ( isset( $relative_url_parts['host'] ) ) { - $absolute_path .= $relative_url_parts['host']; - if ( isset( $relative_url_parts['port'] ) ) - $absolute_path .= ':' . $relative_url_parts['port']; - } else { - $absolute_path .= $url_parts['host']; - if ( isset( $url_parts['port'] ) ) - $absolute_path .= ':' . $url_parts['port']; - } - - // Start off with the Absolute URL path. - $path = ! empty( $url_parts['path'] ) ? $url_parts['path'] : '/'; - - // If it's a root-relative path, then great. - if ( ! empty( $relative_url_parts['path'] ) && '/' == $relative_url_parts['path'][0] ) { - $path = $relative_url_parts['path']; - - // Else it's a relative path. - } elseif ( ! empty( $relative_url_parts['path'] ) ) { - // Strip off any file components from the absolute path. - $path = substr( $path, 0, strrpos( $path, '/' ) + 1 ); - - // Build the new path. - $path .= $relative_url_parts['path']; - - // Strip all /path/../ out of the path. - while ( strpos( $path, '../' ) > 1 ) { - $path = preg_replace( '![^/]+/\.\./!', '', $path ); - } - - // Strip any final leading ../ from the path. - $path = preg_replace( '!^/(\.\./)+!', '', $path ); - } - - // Add the Query string. - if ( ! empty( $relative_url_parts['query'] ) ) - $path .= '?' . $relative_url_parts['query']; - - return $absolute_path . '/' . ltrim( $path, '/' ); - } - - /** - * Handles HTTP Redirects and follows them if appropriate. - * - * @since 3.7.0 - * - * @static - * - * @param string $url The URL which was requested. - * @param array $args The Arguments which were used to make the request. - * @param array $response The Response of the HTTP request. - * @return false|object False if no redirect is present, a WP_HTTP or WP_Error result otherwise. - */ - public static function handle_redirects( $url, $args, $response ) { - // If no redirects are present, or, redirects were not requested, perform no action. - if ( ! isset( $response['headers']['location'] ) || 0 === $args['_redirection'] ) - return false; - - // Only perform redirections on redirection http codes. - if ( $response['response']['code'] > 399 || $response['response']['code'] < 300 ) - return false; - - // Don't redirect if we've run out of redirects. - if ( $args['redirection']-- <= 0 ) - return new WP_Error( 'http_request_failed', __('Too many redirects.') ); - - $redirect_location = $response['headers']['location']; - - // If there were multiple Location headers, use the last header specified. - if ( is_array( $redirect_location ) ) - $redirect_location = array_pop( $redirect_location ); - - $redirect_location = WP_Http::make_absolute_url( $redirect_location, $url ); - - // POST requests should not POST to a redirected location. - if ( 'POST' == $args['method'] ) { - if ( in_array( $response['response']['code'], array( 302, 303 ) ) ) - $args['method'] = 'GET'; - } - - // Include valid cookies in the redirect process. - if ( ! empty( $response['cookies'] ) ) { - foreach ( $response['cookies'] as $cookie ) { - if ( $cookie->test( $redirect_location ) ) - $args['cookies'][] = $cookie; - } - } - - return wp_remote_request( $redirect_location, $args ); - } - - /** - * Determines if a specified string represents an IP address or not. - * - * This function also detects the type of the IP address, returning either - * '4' or '6' to represent a IPv4 and IPv6 address respectively. - * This does not verify if the IP is a valid IP, only that it appears to be - * an IP address. - * - * @link http://home.deds.nl/~aeron/regex/ for IPv6 regex - * - * @since 3.7.0 - * @static - * - * @param string $maybe_ip A suspected IP address - * @return integer|bool Upon success, '4' or '6' to represent a IPv4 or IPv6 address, false upon failure - */ - public static function is_ip_address( $maybe_ip ) { - if ( preg_match( '/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/', $maybe_ip ) ) - return 4; - - if ( false !== strpos( $maybe_ip, ':' ) && preg_match( '/^(((?=.*(::))(?!.*\3.+\3))\3?|([\dA-F]{1,4}(\3|:\b|$)|\2))(?4){5}((?4){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i', trim( $maybe_ip, ' []' ) ) ) - return 6; - - return false; - } - -} diff --git a/wp/wp-includes/class-json.php b/wp/wp-includes/class-json.php deleted file mode 100644 index 7f34d3fc..00000000 --- a/wp/wp-includes/class-json.php +++ /dev/null @@ -1,960 +0,0 @@ -<?php -if ( ! class_exists( 'Services_JSON' ) ) : -/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ -/** - * Converts to and from JSON format. - * - * JSON (JavaScript Object Notation) is a lightweight data-interchange - * format. It is easy for humans to read and write. It is easy for machines - * to parse and generate. It is based on a subset of the JavaScript - * Programming Language, Standard ECMA-262 3rd Edition - December 1999. - * This feature can also be found in Python. JSON is a text format that is - * completely language independent but uses conventions that are familiar - * to programmers of the C-family of languages, including C, C++, C#, Java, - * JavaScript, Perl, TCL, and many others. These properties make JSON an - * ideal data-interchange language. - * - * This package provides a simple encoder and decoder for JSON notation. It - * is intended for use with client-side Javascript applications that make - * use of HTTPRequest to perform server communication functions - data can - * be encoded into JSON notation for use in a client-side javascript, or - * decoded from incoming Javascript requests. JSON format is native to - * Javascript, and can be directly eval()'ed with no further parsing - * overhead - * - * All strings should be in ASCII or UTF-8 format! - * - * LICENSE: Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: Redistributions of source code must retain the - * above copyright notice, this list of conditions and the following - * disclaimer. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * @category - * @package Services_JSON - * @author Michal Migurski <mike-json@teczno.com> - * @author Matt Knapp <mdknapp[at]gmail[dot]com> - * @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com> - * @copyright 2005 Michal Migurski - * @version CVS: $Id: JSON.php 305040 2010-11-02 23:19:03Z alan_k $ - * @license http://www.opensource.org/licenses/bsd-license.php - * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 - */ - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_SLICE', 1); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_STR', 2); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_ARR', 3); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_OBJ', 4); - -/** - * Marker constant for Services_JSON::decode(), used to flag stack state - */ -define('SERVICES_JSON_IN_CMT', 5); - -/** - * Behavior switch for Services_JSON::decode() - */ -define('SERVICES_JSON_LOOSE_TYPE', 16); - -/** - * Behavior switch for Services_JSON::decode() - */ -define('SERVICES_JSON_SUPPRESS_ERRORS', 32); - -/** - * Behavior switch for Services_JSON::decode() - */ -define('SERVICES_JSON_USE_TO_JSON', 64); - -/** - * Converts to and from JSON format. - * - * Brief example of use: - * - * <code> - * // create a new instance of Services_JSON - * $json = new Services_JSON(); - * - * // convert a complexe value to JSON notation, and send it to the browser - * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); - * $output = $json->encode($value); - * - * print($output); - * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] - * - * // accept incoming POST data, assumed to be in JSON notation - * $input = file_get_contents('php://input', 1000000); - * $value = $json->decode($input); - * </code> - */ -class Services_JSON -{ - /** - * constructs a new JSON instance - * - * @param int $use object behavior flags; combine with boolean-OR - * - * possible values: - * - SERVICES_JSON_LOOSE_TYPE: loose typing. - * "{...}" syntax creates associative arrays - * instead of objects in decode(). - * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. - * Values which can't be encoded (e.g. resources) - * appear as NULL instead of throwing errors. - * By default, a deeply-nested resource will - * bubble up with an error, so all return values - * from encode() should be checked with isError() - * - SERVICES_JSON_USE_TO_JSON: call toJSON when serializing objects - * It serializes the return value from the toJSON call rather - * than the object itself, toJSON can return associative arrays, - * strings or numbers, if you return an object, make sure it does - * not have a toJSON method, otherwise an error will occur. - */ - function __construct( $use = 0 ) - { - $this->use = $use; - $this->_mb_strlen = function_exists('mb_strlen'); - $this->_mb_convert_encoding = function_exists('mb_convert_encoding'); - $this->_mb_substr = function_exists('mb_substr'); - } - - /** - * PHP4 constructor. - */ - public function Services_JSON( $use = 0 ) { - self::__construct( $use ); - } - // private - cache the mbstring lookup results.. - var $_mb_strlen = false; - var $_mb_substr = false; - var $_mb_convert_encoding = false; - - /** - * convert a string from one UTF-16 char to one UTF-8 char - * - * Normally should be handled by mb_convert_encoding, but - * provides a slower PHP-only method for installations - * that lack the multibye string extension. - * - * @param string $utf16 UTF-16 character - * @return string UTF-8 character - * @access private - */ - function utf162utf8($utf16) - { - // oh please oh please oh please oh please oh please - if($this->_mb_convert_encoding) { - return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); - } - - $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); - - switch(true) { - case ((0x7F & $bytes) == $bytes): - // this case should never be reached, because we are in ASCII range - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0x7F & $bytes); - - case (0x07FF & $bytes) == $bytes: - // return a 2-byte UTF-8 character - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0xC0 | (($bytes >> 6) & 0x1F)) - . chr(0x80 | ($bytes & 0x3F)); - - case (0xFFFF & $bytes) == $bytes: - // return a 3-byte UTF-8 character - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0xE0 | (($bytes >> 12) & 0x0F)) - . chr(0x80 | (($bytes >> 6) & 0x3F)) - . chr(0x80 | ($bytes & 0x3F)); - } - - // ignoring UTF-32 for now, sorry - return ''; - } - - /** - * convert a string from one UTF-8 char to one UTF-16 char - * - * Normally should be handled by mb_convert_encoding, but - * provides a slower PHP-only method for installations - * that lack the multibye string extension. - * - * @param string $utf8 UTF-8 character - * @return string UTF-16 character - * @access private - */ - function utf82utf16($utf8) - { - // oh please oh please oh please oh please oh please - if($this->_mb_convert_encoding) { - return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); - } - - switch($this->strlen8($utf8)) { - case 1: - // this case should never be reached, because we are in ASCII range - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return $utf8; - - case 2: - // return a UTF-16 character from a 2-byte UTF-8 char - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0x07 & (ord($utf8{0}) >> 2)) - . chr((0xC0 & (ord($utf8{0}) << 6)) - | (0x3F & ord($utf8{1}))); - - case 3: - // return a UTF-16 character from a 3-byte UTF-8 char - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr((0xF0 & (ord($utf8{0}) << 4)) - | (0x0F & (ord($utf8{1}) >> 2))) - . chr((0xC0 & (ord($utf8{1}) << 6)) - | (0x7F & ord($utf8{2}))); - } - - // ignoring UTF-32 for now, sorry - return ''; - } - - /** - * encodes an arbitrary variable into JSON format (and sends JSON Header) - * - * @param mixed $var any number, boolean, string, array, or object to be encoded. - * see argument 1 to Services_JSON() above for array-parsing behavior. - * if var is a strng, note that encode() always expects it - * to be in ASCII or UTF-8 format! - * - * @return mixed JSON string representation of input var or an error if a problem occurs - * @access public - */ - function encode($var) - { - header('Content-type: application/json'); - return $this->encodeUnsafe($var); - } - /** - * encodes an arbitrary variable into JSON format without JSON Header - warning - may allow XSS!!!!) - * - * @param mixed $var any number, boolean, string, array, or object to be encoded. - * see argument 1 to Services_JSON() above for array-parsing behavior. - * if var is a strng, note that encode() always expects it - * to be in ASCII or UTF-8 format! - * - * @return mixed JSON string representation of input var or an error if a problem occurs - * @access public - */ - function encodeUnsafe($var) - { - // see bug #16908 - regarding numeric locale printing - $lc = setlocale(LC_NUMERIC, 0); - setlocale(LC_NUMERIC, 'C'); - $ret = $this->_encode($var); - setlocale(LC_NUMERIC, $lc); - return $ret; - - } - /** - * PRIVATE CODE that does the work of encodes an arbitrary variable into JSON format - * - * @param mixed $var any number, boolean, string, array, or object to be encoded. - * see argument 1 to Services_JSON() above for array-parsing behavior. - * if var is a strng, note that encode() always expects it - * to be in ASCII or UTF-8 format! - * - * @return mixed JSON string representation of input var or an error if a problem occurs - * @access public - */ - function _encode($var) - { - - switch (gettype($var)) { - case 'boolean': - return $var ? 'true' : 'false'; - - case 'NULL': - return 'null'; - - case 'integer': - return (int) $var; - - case 'double': - case 'float': - return (float) $var; - - case 'string': - // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT - $ascii = ''; - $strlen_var = $this->strlen8($var); - - /* - * Iterate over every character in the string, - * escaping with a slash or encoding to UTF-8 where necessary - */ - for ($c = 0; $c < $strlen_var; ++$c) { - - $ord_var_c = ord($var{$c}); - - switch (true) { - case $ord_var_c == 0x08: - $ascii .= '\b'; - break; - case $ord_var_c == 0x09: - $ascii .= '\t'; - break; - case $ord_var_c == 0x0A: - $ascii .= '\n'; - break; - case $ord_var_c == 0x0C: - $ascii .= '\f'; - break; - case $ord_var_c == 0x0D: - $ascii .= '\r'; - break; - - case $ord_var_c == 0x22: - case $ord_var_c == 0x2F: - case $ord_var_c == 0x5C: - // double quote, slash, slosh - $ascii .= '\\'.$var{$c}; - break; - - case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): - // characters U-00000000 - U-0000007F (same as ASCII) - $ascii .= $var{$c}; - break; - - case (($ord_var_c & 0xE0) == 0xC0): - // characters U-00000080 - U-000007FF, mask 110XXXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - if ($c+1 >= $strlen_var) { - $c += 1; - $ascii .= '?'; - break; - } - - $char = pack('C*', $ord_var_c, ord($var{$c + 1})); - $c += 1; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xF0) == 0xE0): - if ($c+2 >= $strlen_var) { - $c += 2; - $ascii .= '?'; - break; - } - // characters U-00000800 - U-0000FFFF, mask 1110XXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - @ord($var{$c + 1}), - @ord($var{$c + 2})); - $c += 2; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xF8) == 0xF0): - if ($c+3 >= $strlen_var) { - $c += 3; - $ascii .= '?'; - break; - } - // characters U-00010000 - U-001FFFFF, mask 11110XXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3})); - $c += 3; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xFC) == 0xF8): - // characters U-00200000 - U-03FFFFFF, mask 111110XX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - if ($c+4 >= $strlen_var) { - $c += 4; - $ascii .= '?'; - break; - } - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3}), - ord($var{$c + 4})); - $c += 4; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xFE) == 0xFC): - if ($c+5 >= $strlen_var) { - $c += 5; - $ascii .= '?'; - break; - } - // characters U-04000000 - U-7FFFFFFF, mask 1111110X - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3}), - ord($var{$c + 4}), - ord($var{$c + 5})); - $c += 5; - $utf16 = $this->utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - } - } - return '"'.$ascii.'"'; - - case 'array': - /* - * As per JSON spec if any array key is not an integer - * we must treat the whole array as an object. We - * also try to catch a sparsely populated associative - * array with numeric keys here because some JS engines - * will create an array with empty indexes up to - * max_index which can cause memory issues and because - * the keys, which may be relevant, will be remapped - * otherwise. - * - * As per the ECMA and JSON specification an object may - * have any string as a property. Unfortunately due to - * a hole in the ECMA specification if the key is a - * ECMA reserved word or starts with a digit the - * parameter is only accessible using ECMAScript's - * bracket notation. - */ - - // treat as a JSON object - if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { - $properties = array_map(array($this, 'name_value'), - array_keys($var), - array_values($var)); - - foreach($properties as $property) { - if(Services_JSON::isError($property)) { - return $property; - } - } - - return '{' . join(',', $properties) . '}'; - } - - // treat it like a regular array - $elements = array_map(array($this, '_encode'), $var); - - foreach($elements as $element) { - if(Services_JSON::isError($element)) { - return $element; - } - } - - return '[' . join(',', $elements) . ']'; - - case 'object': - - // support toJSON methods. - if (($this->use & SERVICES_JSON_USE_TO_JSON) && method_exists($var, 'toJSON')) { - // this may end up allowing unlimited recursion - // so we check the return value to make sure it's not got the same method. - $recode = $var->toJSON(); - - if (method_exists($recode, 'toJSON')) { - - return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) - ? 'null' - : new Services_JSON_Error(get_class($var). - " toJSON returned an object with a toJSON method."); - - } - - return $this->_encode( $recode ); - } - - $vars = get_object_vars($var); - - $properties = array_map(array($this, 'name_value'), - array_keys($vars), - array_values($vars)); - - foreach($properties as $property) { - if(Services_JSON::isError($property)) { - return $property; - } - } - - return '{' . join(',', $properties) . '}'; - - default: - return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS) - ? 'null' - : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string"); - } - } - - /** - * array-walking function for use in generating JSON-formatted name-value pairs - * - * @param string $name name of key to use - * @param mixed $value reference to an array element to be encoded - * - * @return string JSON-formatted name-value pair, like '"name":value' - * @access private - */ - function name_value($name, $value) - { - $encoded_value = $this->_encode($value); - - if(Services_JSON::isError($encoded_value)) { - return $encoded_value; - } - - return $this->_encode(strval($name)) . ':' . $encoded_value; - } - - /** - * reduce a string by removing leading and trailing comments and whitespace - * - * @param $str string string value to strip of comments and whitespace - * - * @return string string value stripped of comments and whitespace - * @access private - */ - function reduce_string($str) - { - $str = preg_replace(array( - - // eliminate single line comments in '// ...' form - '#^\s*//(.+)$#m', - - // eliminate multi-line comments in '/* ... */' form, at start of string - '#^\s*/\*(.+)\*/#Us', - - // eliminate multi-line comments in '/* ... */' form, at end of string - '#/\*(.+)\*/\s*$#Us' - - ), '', $str); - - // eliminate extraneous space - return trim($str); - } - - /** - * decodes a JSON string into appropriate variable - * - * @param string $str JSON-formatted string - * - * @return mixed number, boolean, string, array, or object - * corresponding to given JSON input string. - * See argument 1 to Services_JSON() above for object-output behavior. - * Note that decode() always returns strings - * in ASCII or UTF-8 format! - * @access public - */ - function decode($str) - { - $str = $this->reduce_string($str); - - switch (strtolower($str)) { - case 'true': - return true; - - case 'false': - return false; - - case 'null': - return null; - - default: - $m = array(); - - if (is_numeric($str)) { - // Lookie-loo, it's a number - - // This would work on its own, but I'm trying to be - // good about returning integers where appropriate: - // return (float)$str; - - // Return float or int, as appropriate - return ((float)$str == (integer)$str) - ? (integer)$str - : (float)$str; - - } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { - // STRINGS RETURNED IN UTF-8 FORMAT - $delim = $this->substr8($str, 0, 1); - $chrs = $this->substr8($str, 1, -1); - $utf8 = ''; - $strlen_chrs = $this->strlen8($chrs); - - for ($c = 0; $c < $strlen_chrs; ++$c) { - - $substr_chrs_c_2 = $this->substr8($chrs, $c, 2); - $ord_chrs_c = ord($chrs{$c}); - - switch (true) { - case $substr_chrs_c_2 == '\b': - $utf8 .= chr(0x08); - ++$c; - break; - case $substr_chrs_c_2 == '\t': - $utf8 .= chr(0x09); - ++$c; - break; - case $substr_chrs_c_2 == '\n': - $utf8 .= chr(0x0A); - ++$c; - break; - case $substr_chrs_c_2 == '\f': - $utf8 .= chr(0x0C); - ++$c; - break; - case $substr_chrs_c_2 == '\r': - $utf8 .= chr(0x0D); - ++$c; - break; - - case $substr_chrs_c_2 == '\\"': - case $substr_chrs_c_2 == '\\\'': - case $substr_chrs_c_2 == '\\\\': - case $substr_chrs_c_2 == '\\/': - if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || - ($delim == "'" && $substr_chrs_c_2 != '\\"')) { - $utf8 .= $chrs{++$c}; - } - break; - - case preg_match('/\\\u[0-9A-F]{4}/i', $this->substr8($chrs, $c, 6)): - // single, escaped unicode character - $utf16 = chr(hexdec($this->substr8($chrs, ($c + 2), 2))) - . chr(hexdec($this->substr8($chrs, ($c + 4), 2))); - $utf8 .= $this->utf162utf8($utf16); - $c += 5; - break; - - case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): - $utf8 .= $chrs{$c}; - break; - - case ($ord_chrs_c & 0xE0) == 0xC0: - // characters U-00000080 - U-000007FF, mask 110XXXXX - //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= $this->substr8($chrs, $c, 2); - ++$c; - break; - - case ($ord_chrs_c & 0xF0) == 0xE0: - // characters U-00000800 - U-0000FFFF, mask 1110XXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= $this->substr8($chrs, $c, 3); - $c += 2; - break; - - case ($ord_chrs_c & 0xF8) == 0xF0: - // characters U-00010000 - U-001FFFFF, mask 11110XXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= $this->substr8($chrs, $c, 4); - $c += 3; - break; - - case ($ord_chrs_c & 0xFC) == 0xF8: - // characters U-00200000 - U-03FFFFFF, mask 111110XX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= $this->substr8($chrs, $c, 5); - $c += 4; - break; - - case ($ord_chrs_c & 0xFE) == 0xFC: - // characters U-04000000 - U-7FFFFFFF, mask 1111110X - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $utf8 .= $this->substr8($chrs, $c, 6); - $c += 5; - break; - - } - - } - - return $utf8; - - } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { - // array, or object notation - - if ($str{0} == '[') { - $stk = array(SERVICES_JSON_IN_ARR); - $arr = array(); - } else { - if ($this->use & SERVICES_JSON_LOOSE_TYPE) { - $stk = array(SERVICES_JSON_IN_OBJ); - $obj = array(); - } else { - $stk = array(SERVICES_JSON_IN_OBJ); - $obj = new stdClass(); - } - } - - array_push($stk, array('what' => SERVICES_JSON_SLICE, - 'where' => 0, - 'delim' => false)); - - $chrs = $this->substr8($str, 1, -1); - $chrs = $this->reduce_string($chrs); - - if ($chrs == '') { - if (reset($stk) == SERVICES_JSON_IN_ARR) { - return $arr; - - } else { - return $obj; - - } - } - - //print("\nparsing {$chrs}\n"); - - $strlen_chrs = $this->strlen8($chrs); - - for ($c = 0; $c <= $strlen_chrs; ++$c) { - - $top = end($stk); - $substr_chrs_c_2 = $this->substr8($chrs, $c, 2); - - if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) { - // found a comma that is not inside a string, array, etc., - // OR we've reached the end of the character list - $slice = $this->substr8($chrs, $top['where'], ($c - $top['where'])); - array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); - //print("Found split at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - if (reset($stk) == SERVICES_JSON_IN_ARR) { - // we are in an array, so just push an element onto the stack - array_push($arr, $this->decode($slice)); - - } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { - // we are in an object, so figure - // out the property name and set an - // element in an associative array, - // for now - $parts = array(); - - if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:/Uis', $slice, $parts)) { - // "name":value pair - $key = $this->decode($parts[1]); - $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B")); - if ($this->use & SERVICES_JSON_LOOSE_TYPE) { - $obj[$key] = $val; - } else { - $obj->$key = $val; - } - } elseif (preg_match('/^\s*(\w+)\s*:/Uis', $slice, $parts)) { - // name:value pair, where name is unquoted - $key = $parts[1]; - $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B")); - - if ($this->use & SERVICES_JSON_LOOSE_TYPE) { - $obj[$key] = $val; - } else { - $obj->$key = $val; - } - } - - } - - } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) { - // found a quote, and we are not inside a string - array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c})); - //print("Found start of string at {$c}\n"); - - } elseif (($chrs{$c} == $top['delim']) && - ($top['what'] == SERVICES_JSON_IN_STR) && - (($this->strlen8($this->substr8($chrs, 0, $c)) - $this->strlen8(rtrim($this->substr8($chrs, 0, $c), '\\'))) % 2 != 1)) { - // found a quote, we're in a string, and it's not escaped - // we know that it's not escaped becase there is _not_ an - // odd number of backslashes at the end of the string so far - array_pop($stk); - //print("Found end of string at {$c}: ".$this->substr8($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); - - } elseif (($chrs{$c} == '[') && - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { - // found a left-bracket, and we are in an array, object, or slice - array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); - //print("Found start of array at {$c}\n"); - - } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) { - // found a right-bracket, and we're in an array - array_pop($stk); - //print("Found end of array at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } elseif (($chrs{$c} == '{') && - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { - // found a left-brace, and we are in an array, object, or slice - array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); - //print("Found start of object at {$c}\n"); - - } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) { - // found a right-brace, and we're in an object - array_pop($stk); - //print("Found end of object at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } elseif (($substr_chrs_c_2 == '/*') && - in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) { - // found a comment start, and we are in an array, object, or slice - array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); - $c++; - //print("Found start of comment at {$c}\n"); - - } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) { - // found a comment end, and we're in one now - array_pop($stk); - $c++; - - for ($i = $top['where']; $i <= $c; ++$i) - $chrs = substr_replace($chrs, ' ', $i, 1); - - //print("Found end of comment at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); - - } - - } - - if (reset($stk) == SERVICES_JSON_IN_ARR) { - return $arr; - - } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) { - return $obj; - - } - - } - } - } - - /** - * @todo Ultimately, this should just call PEAR::isError() - */ - function isError($data, $code = null) - { - if (class_exists('pear')) { - return PEAR::isError($data, $code); - } elseif (is_object($data) && (get_class($data) == 'services_json_error' || - is_subclass_of($data, 'services_json_error'))) { - return true; - } - - return false; - } - - /** - * Calculates length of string in bytes - * @param string - * @return integer length - */ - function strlen8( $str ) - { - if ( $this->_mb_strlen ) { - return mb_strlen( $str, "8bit" ); - } - return strlen( $str ); - } - - /** - * Returns part of a string, interpreting $start and $length as number of bytes. - * @param string - * @param integer start - * @param integer length - * @return integer length - */ - function substr8( $string, $start, $length=false ) - { - if ( $length === false ) { - $length = $this->strlen8( $string ) - $start; - } - if ( $this->_mb_substr ) { - return mb_substr( $string, $start, $length, "8bit" ); - } - return substr( $string, $start, $length ); - } - -} - -if (class_exists('PEAR_Error')) { - - class Services_JSON_Error extends PEAR_Error - { - function __construct($message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null) - { - parent::PEAR_Error($message, $code, $mode, $options, $userinfo); - } - - public function Services_JSON_Error($message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null) { - self::__construct($message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null); - } - } - -} else { - - /** - * @todo Ultimately, this class shall be descended from PEAR_Error - */ - class Services_JSON_Error - { - /** - * PHP5 constructor. - */ - function __construct( $message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null ) - { - - } - - /** - * PHP4 constructor. - */ - public function Services_JSON_Error( $message = 'unknown error', $code = null, - $mode = null, $options = null, $userinfo = null ) { - self::__construct( $message, $code, $mode, $options, $userinfo ); - } - } - -} - -endif; diff --git a/wp/wp-includes/class-oembed.php b/wp/wp-includes/class-oembed.php deleted file mode 100644 index b1b72119..00000000 --- a/wp/wp-includes/class-oembed.php +++ /dev/null @@ -1,693 +0,0 @@ -<?php -/** - * API for fetching the HTML to embed remote content based on a provided URL - * - * Used internally by the WP_Embed class, but is designed to be generic. - * - * @link https://codex.wordpress.org/oEmbed oEmbed Codex Article - * @link http://oembed.com/ oEmbed Homepage - * - * @package WordPress - * @subpackage oEmbed - */ - -/** - * Core class used to implement oEmbed functionality. - * - * @since 2.9.0 - */ -class WP_oEmbed { - - /** - * A list of oEmbed providers. - * - * @since 2.9.0 - * @access public - * @var array - */ - public $providers = array(); - - /** - * A list of an early oEmbed providers. - * - * @since 4.0.0 - * @access public - * @static - * @var array - */ - public static $early_providers = array(); - - /** - * A list of private/protected methods, used for backward compatibility. - * - * @since 4.2.0 - * @access private - * @var array - */ - private $compat_methods = array( '_fetch_with_format', '_parse_json', '_parse_xml', '_parse_body' ); - - /** - * Constructor. - * - * @since 2.9.0 - * @access public - */ - public function __construct() { - $host = urlencode( home_url() ); - $providers = array( - '#https?://((m|www)\.)?youtube\.com/watch.*#i' => array( 'https://www.youtube.com/oembed', true ), - '#https?://((m|www)\.)?youtube\.com/playlist.*#i' => array( 'https://www.youtube.com/oembed', true ), - '#https?://youtu\.be/.*#i' => array( 'https://www.youtube.com/oembed', true ), - '#https?://(.+\.)?vimeo\.com/.*#i' => array( 'https://vimeo.com/api/oembed.{format}', true ), - '#https?://(www\.)?dailymotion\.com/.*#i' => array( 'https://www.dailymotion.com/services/oembed', true ), - '#https?://dai\.ly/.*#i' => array( 'https://www.dailymotion.com/services/oembed', true ), - '#https?://(www\.)?flickr\.com/.*#i' => array( 'https://www.flickr.com/services/oembed/', true ), - '#https?://flic\.kr/.*#i' => array( 'https://www.flickr.com/services/oembed/', true ), - '#https?://(.+\.)?smugmug\.com/.*#i' => array( 'https://api.smugmug.com/services/oembed/', true ), - '#https?://(www\.)?hulu\.com/watch/.*#i' => array( 'http://www.hulu.com/api/oembed.{format}', true ), - 'http://i*.photobucket.com/albums/*' => array( 'http://api.photobucket.com/oembed', false ), - 'http://gi*.photobucket.com/groups/*' => array( 'http://api.photobucket.com/oembed', false ), - '#https?://(www\.)?scribd\.com/doc/.*#i' => array( 'https://www.scribd.com/services/oembed', true ), - '#https?://wordpress\.tv/.*#i' => array( 'https://wordpress.tv/oembed/', true ), - '#https?://(.+\.)?polldaddy\.com/.*#i' => array( 'https://polldaddy.com/oembed/', true ), - '#https?://poll\.fm/.*#i' => array( 'https://polldaddy.com/oembed/', true ), - '#https?://(www\.)?funnyordie\.com/videos/.*#i' => array( 'http://www.funnyordie.com/oembed', true ), - '#https?://(www\.)?twitter\.com/\w{1,15}/status(es)?/.*#i' => array( 'https://publish.twitter.com/oembed', true ), - '#https?://(www\.)?twitter\.com/\w{1,15}$#i' => array( 'https://publish.twitter.com/oembed', true ), - '#https?://(www\.)?twitter\.com/\w{1,15}/likes$#i' => array( 'https://publish.twitter.com/oembed', true ), - '#https?://(www\.)?twitter\.com/\w{1,15}/lists/.*#i' => array( 'https://publish.twitter.com/oembed', true ), - '#https?://(www\.)?twitter\.com/\w{1,15}/timelines/.*#i' => array( 'https://publish.twitter.com/oembed', true ), - '#https?://(www\.)?twitter\.com/i/moments/.*#i' => array( 'https://publish.twitter.com/oembed', true ), - '#https?://vine\.co/v/.*#i' => array( 'https://vine.co/oembed.{format}', true ), - '#https?://(www\.)?soundcloud\.com/.*#i' => array( 'https://soundcloud.com/oembed', true ), - '#https?://(.+?\.)?slideshare\.net/.*#i' => array( 'https://www.slideshare.net/api/oembed/2', true ), - '#https?://(www\.)?instagr(\.am|am\.com)/p/.*#i' => array( 'https://api.instagram.com/oembed', true ), - '#https?://(open|play)\.spotify\.com/.*#i' => array( 'https://embed.spotify.com/oembed/', true ), - '#https?://(.+\.)?imgur\.com/.*#i' => array( 'http://api.imgur.com/oembed', true ), - '#https?://(www\.)?meetu(\.ps|p\.com)/.*#i' => array( 'https://api.meetup.com/oembed', true ), - '#https?://(www\.)?issuu\.com/.+/docs/.+#i' => array( 'https://issuu.com/oembed_wp', true ), - '#https?://(www\.)?collegehumor\.com/video/.*#i' => array( 'http://www.collegehumor.com/oembed.{format}', true ), - '#https?://(www\.)?mixcloud\.com/.*#i' => array( 'https://www.mixcloud.com/oembed', true ), - '#https?://(www\.|embed\.)?ted\.com/talks/.*#i' => array( 'https://www.ted.com/services/v1/oembed.{format}', true ), - '#https?://(www\.)?(animoto|video214)\.com/play/.*#i' => array( 'https://animoto.com/oembeds/create', true ), - '#https?://(.+)\.tumblr\.com/post/.*#i' => array( 'https://www.tumblr.com/oembed/1.0', true ), - '#https?://(www\.)?kickstarter\.com/projects/.*#i' => array( 'https://www.kickstarter.com/services/oembed', true ), - '#https?://kck\.st/.*#i' => array( 'https://www.kickstarter.com/services/oembed', true ), - '#https?://cloudup\.com/.*#i' => array( 'https://cloudup.com/oembed', true ), - '#https?://(www\.)?reverbnation\.com/.*#i' => array( 'https://www.reverbnation.com/oembed', true ), - '#https?://videopress\.com/v/.*#' => array( 'https://public-api.wordpress.com/oembed/1.0/?for=' . $host, true ), - '#https?://(www\.)?reddit\.com/r/[^/]+/comments/.*#i' => array( 'https://www.reddit.com/oembed', true ), - '#https?://(www\.)?speakerdeck\.com/.*#i' => array( 'https://speakerdeck.com/oembed.{format}', true ), - '#https?://www\.facebook\.com/.*/posts/.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), - '#https?://www\.facebook\.com/.*/activity/.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), - '#https?://www\.facebook\.com/.*/photos/.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), - '#https?://www\.facebook\.com/photo(s/|\.php).*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), - '#https?://www\.facebook\.com/permalink\.php.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), - '#https?://www\.facebook\.com/media/.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), - '#https?://www\.facebook\.com/questions/.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), - '#https?://www\.facebook\.com/notes/.*#i' => array( 'https://www.facebook.com/plugins/post/oembed.json/', true ), - '#https?://www\.facebook\.com/.*/videos/.*#i' => array( 'https://www.facebook.com/plugins/video/oembed.json/', true ), - '#https?://www\.facebook\.com/video\.php.*#i' => array( 'https://www.facebook.com/plugins/video/oembed.json/', true ), - ); - - if ( ! empty( self::$early_providers['add'] ) ) { - foreach ( self::$early_providers['add'] as $format => $data ) { - $providers[ $format ] = $data; - } - } - - if ( ! empty( self::$early_providers['remove'] ) ) { - foreach ( self::$early_providers['remove'] as $format ) { - unset( $providers[ $format ] ); - } - } - - self::$early_providers = array(); - - /** - * Filters the list of whitelisted oEmbed providers. - * - * Since WordPress 4.4, oEmbed discovery is enabled for all users and allows embedding of sanitized - * iframes. The providers in this list are whitelisted, meaning they are trusted and allowed to - * embed any content, such as iframes, videos, JavaScript, and arbitrary HTML. - * - * Supported providers: - * - * | Provider | Flavor | Supports HTTPS | Since | - * | ------------ | --------------------- | :------------: | --------- | - * | Dailymotion | dailymotion.com | Yes | 2.9.0 | - * | Flickr | flickr.com | Yes | 2.9.0 | - * | Hulu | hulu.com | Yes | 2.9.0 | - * | Photobucket | photobucket.com | No | 2.9.0 | - * | Scribd | scribd.com | Yes | 2.9.0 | - * | Vimeo | vimeo.com | Yes | 2.9.0 | - * | WordPress.tv | wordpress.tv | Yes | 2.9.0 | - * | YouTube | youtube.com/watch | Yes | 2.9.0 | - * | Funny or Die | funnyordie.com | Yes | 3.0.0 | - * | Polldaddy | polldaddy.com | Yes | 3.0.0 | - * | SmugMug | smugmug.com | Yes | 3.0.0 | - * | YouTube | youtu.be | Yes | 3.0.0 | - * | Twitter | twitter.com | Yes | 3.4.0 | - * | Instagram | instagram.com | Yes | 3.5.0 | - * | Instagram | instagr.am | Yes | 3.5.0 | - * | Slideshare | slideshare.net | Yes | 3.5.0 | - * | SoundCloud | soundcloud.com | Yes | 3.5.0 | - * | Dailymotion | dai.ly | Yes | 3.6.0 | - * | Flickr | flic.kr | Yes | 3.6.0 | - * | Spotify | spotify.com | Yes | 3.6.0 | - * | Imgur | imgur.com | Yes | 3.9.0 | - * | Meetup.com | meetup.com | Yes | 3.9.0 | - * | Meetup.com | meetu.ps | Yes | 3.9.0 | - * | Animoto | animoto.com | Yes | 4.0.0 | - * | Animoto | video214.com | Yes | 4.0.0 | - * | CollegeHumor | collegehumor.com | Yes | 4.0.0 | - * | Issuu | issuu.com | Yes | 4.0.0 | - * | Mixcloud | mixcloud.com | Yes | 4.0.0 | - * | Polldaddy | poll.fm | Yes | 4.0.0 | - * | TED | ted.com | Yes | 4.0.0 | - * | YouTube | youtube.com/playlist | Yes | 4.0.0 | - * | Vine | vine.co | Yes | 4.1.0 | - * | Tumblr | tumblr.com | Yes | 4.2.0 | - * | Kickstarter | kickstarter.com | Yes | 4.2.0 | - * | Kickstarter | kck.st | Yes | 4.2.0 | - * | Cloudup | cloudup.com | Yes | 4.3.0 | - * | ReverbNation | reverbnation.com | Yes | 4.4.0 | - * | VideoPress | videopress.com | Yes | 4.4.0 | - * | Reddit | reddit.com | Yes | 4.4.0 | - * | Speaker Deck | speakerdeck.com | Yes | 4.4.0 | - * | Twitter | twitter.com/timelines | Yes | 4.5.0 | - * | Twitter | twitter.com/moments | Yes | 4.5.0 | - * | Facebook | facebook.com | Yes | 4.7.0 | - * | Twitter | twitter.com/user | Yes | 4.7.0 | - * | Twitter | twitter.com/likes | Yes | 4.7.0 | - * | Twitter | twitter.com/lists | Yes | 4.7.0 | - * - * No longer supported providers: - * - * | Provider | Flavor | Supports HTTPS | Since | Removed | - * | ------------ | -------------------- | :------------: | --------- | --------- | - * | Qik | qik.com | Yes | 2.9.0 | 3.9.0 | - * | Viddler | viddler.com | Yes | 2.9.0 | 4.0.0 | - * | Revision3 | revision3.com | No | 2.9.0 | 4.2.0 | - * | Blip | blip.tv | No | 2.9.0 | 4.4.0 | - * | Rdio | rdio.com | Yes | 3.6.0 | 4.4.1 | - * | Rdio | rd.io | Yes | 3.6.0 | 4.4.1 | - * - * @see wp_oembed_add_provider() - * - * @since 2.9.0 - * - * @param array $providers An array of popular oEmbed providers. - */ - $this->providers = apply_filters( 'oembed_providers', $providers ); - - // Fix any embeds that contain new lines in the middle of the HTML which breaks wpautop(). - add_filter( 'oembed_dataparse', array($this, '_strip_newlines'), 10, 3 ); - } - - /** - * Exposes private/protected methods for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param callable $name Method to call. - * @param array $arguments Arguments to pass when calling. - * @return mixed|bool Return value of the callback, false otherwise. - */ - public function __call( $name, $arguments ) { - if ( in_array( $name, $this->compat_methods ) ) { - return call_user_func_array( array( $this, $name ), $arguments ); - } - return false; - } - - /** - * Takes a URL and returns the corresponding oEmbed provider's URL, if there is one. - * - * @since 4.0.0 - * @access public - * - * @see WP_oEmbed::discover() - * - * @param string $url The URL to the content. - * @param string|array $args Optional provider arguments. - * @return false|string False on failure, otherwise the oEmbed provider URL. - */ - public function get_provider( $url, $args = '' ) { - $args = wp_parse_args( $args ); - - $provider = false; - - if ( !isset($args['discover']) ) - $args['discover'] = true; - - foreach ( $this->providers as $matchmask => $data ) { - list( $providerurl, $regex ) = $data; - - // Turn the asterisk-type provider URLs into regex - if ( !$regex ) { - $matchmask = '#' . str_replace( '___wildcard___', '(.+)', preg_quote( str_replace( '*', '___wildcard___', $matchmask ), '#' ) ) . '#i'; - $matchmask = preg_replace( '|^#http\\\://|', '#https?\://', $matchmask ); - } - - if ( preg_match( $matchmask, $url ) ) { - $provider = str_replace( '{format}', 'json', $providerurl ); // JSON is easier to deal with than XML - break; - } - } - - if ( !$provider && $args['discover'] ) - $provider = $this->discover( $url ); - - return $provider; - } - - /** - * Adds an oEmbed provider. - * - * The provider is added just-in-time when wp_oembed_add_provider() is called before - * the {@see 'plugins_loaded'} hook. - * - * The just-in-time addition is for the benefit of the {@see 'oembed_providers'} filter. - * - * @static - * @since 4.0.0 - * @access public - * - * @see wp_oembed_add_provider() - * - * @param string $format Format of URL that this provider can handle. You can use - * asterisks as wildcards. - * @param string $provider The URL to the oEmbed provider.. - * @param bool $regex Optional. Whether the $format parameter is in a regex format. - * Default false. - */ - public static function _add_provider_early( $format, $provider, $regex = false ) { - if ( empty( self::$early_providers['add'] ) ) { - self::$early_providers['add'] = array(); - } - - self::$early_providers['add'][ $format ] = array( $provider, $regex ); - } - - /** - * Removes an oEmbed provider. - * - * The provider is removed just-in-time when wp_oembed_remove_provider() is called before - * the {@see 'plugins_loaded'} hook. - * - * The just-in-time removal is for the benefit of the {@see 'oembed_providers'} filter. - * - * @since 4.0.0 - * @access public - * @static - * - * @see wp_oembed_remove_provider() - * - * @param string $format The format of URL that this provider can handle. You can use - * asterisks as wildcards. - */ - public static function _remove_provider_early( $format ) { - if ( empty( self::$early_providers['remove'] ) ) { - self::$early_providers['remove'] = array(); - } - - self::$early_providers['remove'][] = $format; - } - - /** - * The do-it-all function that takes a URL and attempts to return the HTML. - * - * @see WP_oEmbed::fetch() - * @see WP_oEmbed::data2html() - * - * @since 2.9.0 - * @access public - * - * @param string $url The URL to the content that should be attempted to be embedded. - * @param array|string $args Optional. Arguments, usually passed from a shortcode. Default empty. - * @return false|string False on failure, otherwise the UNSANITIZED (and potentially unsafe) HTML that should be used to embed. - */ - public function get_html( $url, $args = '' ) { - $args = wp_parse_args( $args ); - - /** - * Filters the oEmbed result before any HTTP requests are made. - * - * This allows one to short-circuit the default logic, perhaps by - * replacing it with a routine that is more optimal for your setup. - * - * Passing a non-null value to the filter will effectively short-circuit retrieval, - * returning the passed value instead. - * - * @since 4.5.3 - * - * @param null|string $result The UNSANITIZED (and potentially unsafe) HTML that should be used to embed. Default null. - * @param string $url The URL to the content that should be attempted to be embedded. - * @param array $args Optional. Arguments, usually passed from a shortcode. Default empty. - */ - $pre = apply_filters( 'pre_oembed_result', null, $url, $args ); - - if ( null !== $pre ) { - return $pre; - } - - $provider = $this->get_provider( $url, $args ); - - if ( ! $provider || false === $data = $this->fetch( $provider, $url, $args ) ) { - return false; - } - - /** - * Filters the HTML returned by the oEmbed provider. - * - * @since 2.9.0 - * - * @param string $data The returned oEmbed HTML. - * @param string $url URL of the content to be embedded. - * @param array $args Optional arguments, usually passed from a shortcode. - */ - return apply_filters( 'oembed_result', $this->data2html( $data, $url ), $url, $args ); - } - - /** - * Attempts to discover link tags at the given URL for an oEmbed provider. - * - * @since 2.9.0 - * @access public - * - * @param string $url The URL that should be inspected for discovery `<link>` tags. - * @return false|string False on failure, otherwise the oEmbed provider URL. - */ - public function discover( $url ) { - $providers = array(); - $args = array( - 'limit_response_size' => 153600, // 150 KB - ); - - /** - * Filters oEmbed remote get arguments. - * - * @since 4.0.0 - * - * @see WP_Http::request() - * - * @param array $args oEmbed remote get arguments. - * @param string $url URL to be inspected. - */ - $args = apply_filters( 'oembed_remote_get_args', $args, $url ); - - // Fetch URL content - $request = wp_safe_remote_get( $url, $args ); - if ( $html = wp_remote_retrieve_body( $request ) ) { - - /** - * Filters the link types that contain oEmbed provider URLs. - * - * @since 2.9.0 - * - * @param array $format Array of oEmbed link types. Accepts 'application/json+oembed', - * 'text/xml+oembed', and 'application/xml+oembed' (incorrect, - * used by at least Vimeo). - */ - $linktypes = apply_filters( 'oembed_linktypes', array( - 'application/json+oembed' => 'json', - 'text/xml+oembed' => 'xml', - 'application/xml+oembed' => 'xml', - ) ); - - // Strip <body> - if ( $html_head_end = stripos( $html, '</head>' ) ) { - $html = substr( $html, 0, $html_head_end ); - } - - // Do a quick check - $tagfound = false; - foreach ( $linktypes as $linktype => $format ) { - if ( stripos($html, $linktype) ) { - $tagfound = true; - break; - } - } - - if ( $tagfound && preg_match_all( '#<link([^<>]+)/?>#iU', $html, $links ) ) { - foreach ( $links[1] as $link ) { - $atts = shortcode_parse_atts( $link ); - - if ( !empty($atts['type']) && !empty($linktypes[$atts['type']]) && !empty($atts['href']) ) { - $providers[$linktypes[$atts['type']]] = htmlspecialchars_decode( $atts['href'] ); - - // Stop here if it's JSON (that's all we need) - if ( 'json' == $linktypes[$atts['type']] ) - break; - } - } - } - } - - // JSON is preferred to XML - if ( !empty($providers['json']) ) - return $providers['json']; - elseif ( !empty($providers['xml']) ) - return $providers['xml']; - else - return false; - } - - /** - * Connects to a oEmbed provider and returns the result. - * - * @since 2.9.0 - * @access public - * - * @param string $provider The URL to the oEmbed provider. - * @param string $url The URL to the content that is desired to be embedded. - * @param array|string $args Optional. Arguments, usually passed from a shortcode. Default empty. - * @return false|object False on failure, otherwise the result in the form of an object. - */ - public function fetch( $provider, $url, $args = '' ) { - $args = wp_parse_args( $args, wp_embed_defaults( $url ) ); - - $provider = add_query_arg( 'maxwidth', (int) $args['width'], $provider ); - $provider = add_query_arg( 'maxheight', (int) $args['height'], $provider ); - $provider = add_query_arg( 'url', urlencode($url), $provider ); - - /** - * Filters the oEmbed URL to be fetched. - * - * @since 2.9.0 - * - * @param string $provider URL of the oEmbed provider. - * @param string $url URL of the content to be embedded. - * @param array $args Optional arguments, usually passed from a shortcode. - */ - $provider = apply_filters( 'oembed_fetch_url', $provider, $url, $args ); - - foreach ( array( 'json', 'xml' ) as $format ) { - $result = $this->_fetch_with_format( $provider, $format ); - if ( is_wp_error( $result ) && 'not-implemented' == $result->get_error_code() ) - continue; - return ( $result && ! is_wp_error( $result ) ) ? $result : false; - } - return false; - } - - /** - * Fetches result from an oEmbed provider for a specific format and complete provider URL - * - * @since 3.0.0 - * @access private - * - * @param string $provider_url_with_args URL to the provider with full arguments list (url, maxheight, etc.) - * @param string $format Format to use - * @return false|object|WP_Error False on failure, otherwise the result in the form of an object. - */ - private function _fetch_with_format( $provider_url_with_args, $format ) { - $provider_url_with_args = add_query_arg( 'format', $format, $provider_url_with_args ); - - /** This filter is documented in wp-includes/class-oembed.php */ - $args = apply_filters( 'oembed_remote_get_args', array(), $provider_url_with_args ); - - $response = wp_safe_remote_get( $provider_url_with_args, $args ); - if ( 501 == wp_remote_retrieve_response_code( $response ) ) - return new WP_Error( 'not-implemented' ); - if ( ! $body = wp_remote_retrieve_body( $response ) ) - return false; - $parse_method = "_parse_$format"; - return $this->$parse_method( $body ); - } - - /** - * Parses a json response body. - * - * @since 3.0.0 - * @access private - * - * @param string $response_body - * @return object|false - */ - private function _parse_json( $response_body ) { - $data = json_decode( trim( $response_body ) ); - return ( $data && is_object( $data ) ) ? $data : false; - } - - /** - * Parses an XML response body. - * - * @since 3.0.0 - * @access private - * - * @param string $response_body - * @return object|false - */ - private function _parse_xml( $response_body ) { - if ( ! function_exists( 'libxml_disable_entity_loader' ) ) - return false; - - $loader = libxml_disable_entity_loader( true ); - $errors = libxml_use_internal_errors( true ); - - $return = $this->_parse_xml_body( $response_body ); - - libxml_use_internal_errors( $errors ); - libxml_disable_entity_loader( $loader ); - - return $return; - } - - /** - * Serves as a helper function for parsing an XML response body. - * - * @since 3.6.0 - * @access private - * - * @param string $response_body - * @return stdClass|false - */ - private function _parse_xml_body( $response_body ) { - if ( ! function_exists( 'simplexml_import_dom' ) || ! class_exists( 'DOMDocument', false ) ) - return false; - - $dom = new DOMDocument; - $success = $dom->loadXML( $response_body ); - if ( ! $success ) - return false; - - if ( isset( $dom->doctype ) ) - return false; - - foreach ( $dom->childNodes as $child ) { - if ( XML_DOCUMENT_TYPE_NODE === $child->nodeType ) - return false; - } - - $xml = simplexml_import_dom( $dom ); - if ( ! $xml ) - return false; - - $return = new stdClass; - foreach ( $xml as $key => $value ) { - $return->$key = (string) $value; - } - - return $return; - } - - /** - * Converts a data object from WP_oEmbed::fetch() and returns the HTML. - * - * @since 2.9.0 - * @access public - * - * @param object $data A data object result from an oEmbed provider. - * @param string $url The URL to the content that is desired to be embedded. - * @return false|string False on error, otherwise the HTML needed to embed. - */ - public function data2html( $data, $url ) { - if ( ! is_object( $data ) || empty( $data->type ) ) - return false; - - $return = false; - - switch ( $data->type ) { - case 'photo': - if ( empty( $data->url ) || empty( $data->width ) || empty( $data->height ) ) - break; - if ( ! is_string( $data->url ) || ! is_numeric( $data->width ) || ! is_numeric( $data->height ) ) - break; - - $title = ! empty( $data->title ) && is_string( $data->title ) ? $data->title : ''; - $return = '<a href="' . esc_url( $url ) . '"><img src="' . esc_url( $data->url ) . '" alt="' . esc_attr($title) . '" width="' . esc_attr($data->width) . '" height="' . esc_attr($data->height) . '" /></a>'; - break; - - case 'video': - case 'rich': - if ( ! empty( $data->html ) && is_string( $data->html ) ) - $return = $data->html; - break; - - case 'link': - if ( ! empty( $data->title ) && is_string( $data->title ) ) - $return = '<a href="' . esc_url( $url ) . '">' . esc_html( $data->title ) . '</a>'; - break; - - default: - $return = false; - } - - /** - * Filters the returned oEmbed HTML. - * - * Use this filter to add support for custom data types, or to filter the result. - * - * @since 2.9.0 - * - * @param string $return The returned oEmbed HTML. - * @param object $data A data object result from an oEmbed provider. - * @param string $url The URL of the content to be embedded. - */ - return apply_filters( 'oembed_dataparse', $return, $data, $url ); - } - - /** - * Strips any new lines from the HTML. - * - * @since 2.9.0 as strip_scribd_newlines() - * @since 3.0.0 - * @access public - * - * @param string $html Existing HTML. - * @param object $data Data object from WP_oEmbed::data2html() - * @param string $url The original URL passed to oEmbed. - * @return string Possibly modified $html - */ - public function _strip_newlines( $html, $data, $url ) { - if ( false === strpos( $html, "\n" ) ) { - return $html; - } - - $count = 1; - $found = array(); - $token = '__PRE__'; - $search = array( "\t", "\n", "\r", ' ' ); - $replace = array( '__TAB__', '__NL__', '__CR__', '__SPACE__' ); - $tokenized = str_replace( $search, $replace, $html ); - - preg_match_all( '#(<pre[^>]*>.+?</pre>)#i', $tokenized, $matches, PREG_SET_ORDER ); - foreach ( $matches as $i => $match ) { - $tag_html = str_replace( $replace, $search, $match[0] ); - $tag_token = $token . $i; - - $found[ $tag_token ] = $tag_html; - $html = str_replace( $tag_html, $tag_token, $html, $count ); - } - - $replaced = str_replace( $replace, $search, $html ); - $stripped = str_replace( array( "\r\n", "\n" ), '', $replaced ); - $pre = array_values( $found ); - $tokens = array_keys( $found ); - - return str_replace( $tokens, $pre, $stripped ); - } -} diff --git a/wp/wp-includes/class-phpass.php b/wp/wp-includes/class-phpass.php deleted file mode 100644 index 8b8b1131..00000000 --- a/wp/wp-includes/class-phpass.php +++ /dev/null @@ -1,276 +0,0 @@ -<?php -/** - * Portable PHP password hashing framework. - * @package phpass - * @since 2.5.0 - * @version 0.3 / WordPress - * @link http://www.openwall.com/phpass/ - */ - -# -# Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in -# the public domain. Revised in subsequent years, still public domain. -# -# There's absolutely no warranty. -# -# Please be sure to update the Version line if you edit this file in any way. -# It is suggested that you leave the main version number intact, but indicate -# your project name (after the slash) and add your own revision information. -# -# Please do not change the "private" password hashing method implemented in -# here, thereby making your hashes incompatible. However, if you must, please -# change the hash type identifier (the "$P$") to something different. -# -# Obviously, since this code is in the public domain, the above are not -# requirements (there can be none), but merely suggestions. -# - -/** - * Portable PHP password hashing framework. - * - * @package phpass - * @version 0.3 / WordPress - * @link http://www.openwall.com/phpass/ - * @since 2.5.0 - */ -class PasswordHash { - var $itoa64; - var $iteration_count_log2; - var $portable_hashes; - var $random_state; - - /** - * PHP5 constructor. - */ - function __construct( $iteration_count_log2, $portable_hashes ) - { - $this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; - - if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31) - $iteration_count_log2 = 8; - $this->iteration_count_log2 = $iteration_count_log2; - - $this->portable_hashes = $portable_hashes; - - $this->random_state = microtime() . uniqid(rand(), TRUE); // removed getmypid() for compatibility reasons - } - - /** - * PHP4 constructor. - */ - public function PasswordHash( $iteration_count_log2, $portable_hashes ) { - self::__construct( $iteration_count_log2, $portable_hashes ); - } - - function get_random_bytes($count) - { - $output = ''; - if ( @is_readable('/dev/urandom') && - ($fh = @fopen('/dev/urandom', 'rb'))) { - $output = fread($fh, $count); - fclose($fh); - } - - if (strlen($output) < $count) { - $output = ''; - for ($i = 0; $i < $count; $i += 16) { - $this->random_state = - md5(microtime() . $this->random_state); - $output .= - pack('H*', md5($this->random_state)); - } - $output = substr($output, 0, $count); - } - - return $output; - } - - function encode64($input, $count) - { - $output = ''; - $i = 0; - do { - $value = ord($input[$i++]); - $output .= $this->itoa64[$value & 0x3f]; - if ($i < $count) - $value |= ord($input[$i]) << 8; - $output .= $this->itoa64[($value >> 6) & 0x3f]; - if ($i++ >= $count) - break; - if ($i < $count) - $value |= ord($input[$i]) << 16; - $output .= $this->itoa64[($value >> 12) & 0x3f]; - if ($i++ >= $count) - break; - $output .= $this->itoa64[($value >> 18) & 0x3f]; - } while ($i < $count); - - return $output; - } - - function gensalt_private($input) - { - $output = '$P$'; - $output .= $this->itoa64[min($this->iteration_count_log2 + - ((PHP_VERSION >= '5') ? 5 : 3), 30)]; - $output .= $this->encode64($input, 6); - - return $output; - } - - function crypt_private($password, $setting) - { - $output = '*0'; - if (substr($setting, 0, 2) == $output) - $output = '*1'; - - $id = substr($setting, 0, 3); - # We use "$P$", phpBB3 uses "$H$" for the same thing - if ($id != '$P$' && $id != '$H$') - return $output; - - $count_log2 = strpos($this->itoa64, $setting[3]); - if ($count_log2 < 7 || $count_log2 > 30) - return $output; - - $count = 1 << $count_log2; - - $salt = substr($setting, 4, 8); - if (strlen($salt) != 8) - return $output; - - # We're kind of forced to use MD5 here since it's the only - # cryptographic primitive available in all versions of PHP - # currently in use. To implement our own low-level crypto - # in PHP would result in much worse performance and - # consequently in lower iteration counts and hashes that are - # quicker to crack (by non-PHP code). - if (PHP_VERSION >= '5') { - $hash = md5($salt . $password, TRUE); - do { - $hash = md5($hash . $password, TRUE); - } while (--$count); - } else { - $hash = pack('H*', md5($salt . $password)); - do { - $hash = pack('H*', md5($hash . $password)); - } while (--$count); - } - - $output = substr($setting, 0, 12); - $output .= $this->encode64($hash, 16); - - return $output; - } - - function gensalt_extended($input) - { - $count_log2 = min($this->iteration_count_log2 + 8, 24); - # This should be odd to not reveal weak DES keys, and the - # maximum valid value is (2**24 - 1) which is odd anyway. - $count = (1 << $count_log2) - 1; - - $output = '_'; - $output .= $this->itoa64[$count & 0x3f]; - $output .= $this->itoa64[($count >> 6) & 0x3f]; - $output .= $this->itoa64[($count >> 12) & 0x3f]; - $output .= $this->itoa64[($count >> 18) & 0x3f]; - - $output .= $this->encode64($input, 3); - - return $output; - } - - function gensalt_blowfish($input) - { - # This one needs to use a different order of characters and a - # different encoding scheme from the one in encode64() above. - # We care because the last character in our encoded string will - # only represent 2 bits. While two known implementations of - # bcrypt will happily accept and correct a salt string which - # has the 4 unused bits set to non-zero, we do not want to take - # chances and we also do not want to waste an additional byte - # of entropy. - $itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - - $output = '$2a$'; - $output .= chr(ord('0') + $this->iteration_count_log2 / 10); - $output .= chr(ord('0') + $this->iteration_count_log2 % 10); - $output .= '$'; - - $i = 0; - do { - $c1 = ord($input[$i++]); - $output .= $itoa64[$c1 >> 2]; - $c1 = ($c1 & 0x03) << 4; - if ($i >= 16) { - $output .= $itoa64[$c1]; - break; - } - - $c2 = ord($input[$i++]); - $c1 |= $c2 >> 4; - $output .= $itoa64[$c1]; - $c1 = ($c2 & 0x0f) << 2; - - $c2 = ord($input[$i++]); - $c1 |= $c2 >> 6; - $output .= $itoa64[$c1]; - $output .= $itoa64[$c2 & 0x3f]; - } while (1); - - return $output; - } - - function HashPassword($password) - { - if ( strlen( $password ) > 4096 ) { - return '*'; - } - - $random = ''; - - if (CRYPT_BLOWFISH == 1 && !$this->portable_hashes) { - $random = $this->get_random_bytes(16); - $hash = - crypt($password, $this->gensalt_blowfish($random)); - if (strlen($hash) == 60) - return $hash; - } - - if (CRYPT_EXT_DES == 1 && !$this->portable_hashes) { - if (strlen($random) < 3) - $random = $this->get_random_bytes(3); - $hash = - crypt($password, $this->gensalt_extended($random)); - if (strlen($hash) == 20) - return $hash; - } - - if (strlen($random) < 6) - $random = $this->get_random_bytes(6); - $hash = - $this->crypt_private($password, - $this->gensalt_private($random)); - if (strlen($hash) == 34) - return $hash; - - # Returning '*' on error is safe here, but would _not_ be safe - # in a crypt(3)-like function used _both_ for generating new - # hashes and for validating passwords against existing hashes. - return '*'; - } - - function CheckPassword($password, $stored_hash) - { - if ( strlen( $password ) > 4096 ) { - return false; - } - - $hash = $this->crypt_private($password, $stored_hash); - if ($hash[0] == '*') - $hash = crypt($password, $stored_hash); - - return $hash === $stored_hash; - } -} \ No newline at end of file diff --git a/wp/wp-includes/class-phpmailer.php b/wp/wp-includes/class-phpmailer.php deleted file mode 100644 index 7f5e3535..00000000 --- a/wp/wp-includes/class-phpmailer.php +++ /dev/null @@ -1,4040 +0,0 @@ -<?php -/** - * PHPMailer - PHP email creation and transport class. - * PHP Version 5 - * @package PHPMailer - * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project - * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk> - * @author Jim Jagielski (jimjag) <jimjag@gmail.com> - * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net> - * @author Brent R. Matzelle (original founder) - * @copyright 2012 - 2014 Marcus Bointon - * @copyright 2010 - 2012 Jim Jagielski - * @copyright 2004 - 2009 Andy Prevost - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - * @note This program is distributed in the hope that it will be useful - WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - */ - -/** - * PHPMailer - PHP email creation and transport class. - * @package PHPMailer - * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk> - * @author Jim Jagielski (jimjag) <jimjag@gmail.com> - * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net> - * @author Brent R. Matzelle (original founder) - */ -class PHPMailer -{ - /** - * The PHPMailer Version number. - * @var string - */ - public $Version = '5.2.22'; - - /** - * Email priority. - * Options: null (default), 1 = High, 3 = Normal, 5 = low. - * When null, the header is not set at all. - * @var integer - */ - public $Priority = null; - - /** - * The character set of the message. - * @var string - */ - public $CharSet = 'iso-8859-1'; - - /** - * The MIME Content-type of the message. - * @var string - */ - public $ContentType = 'text/plain'; - - /** - * The message encoding. - * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable". - * @var string - */ - public $Encoding = '8bit'; - - /** - * Holds the most recent mailer error message. - * @var string - */ - public $ErrorInfo = ''; - - /** - * The From email address for the message. - * @var string - */ - public $From = 'root@localhost'; - - /** - * The From name of the message. - * @var string - */ - public $FromName = 'Root User'; - - /** - * The Sender email (Return-Path) of the message. - * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode. - * @var string - */ - public $Sender = ''; - - /** - * The Return-Path of the message. - * If empty, it will be set to either From or Sender. - * @var string - * @deprecated Email senders should never set a return-path header; - * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything. - * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference - */ - public $ReturnPath = ''; - - /** - * The Subject of the message. - * @var string - */ - public $Subject = ''; - - /** - * An HTML or plain text message body. - * If HTML then call isHTML(true). - * @var string - */ - public $Body = ''; - - /** - * The plain-text message body. - * This body can be read by mail clients that do not have HTML email - * capability such as mutt & Eudora. - * Clients that can read HTML will view the normal Body. - * @var string - */ - public $AltBody = ''; - - /** - * An iCal message part body. - * Only supported in simple alt or alt_inline message types - * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator - * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/ - * @link http://kigkonsult.se/iCalcreator/ - * @var string - */ - public $Ical = ''; - - /** - * The complete compiled MIME message body. - * @access protected - * @var string - */ - protected $MIMEBody = ''; - - /** - * The complete compiled MIME message headers. - * @var string - * @access protected - */ - protected $MIMEHeader = ''; - - /** - * Extra headers that createHeader() doesn't fold in. - * @var string - * @access protected - */ - protected $mailHeader = ''; - - /** - * Word-wrap the message body to this number of chars. - * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance. - * @var integer - */ - public $WordWrap = 0; - - /** - * Which method to use to send mail. - * Options: "mail", "sendmail", or "smtp". - * @var string - */ - public $Mailer = 'mail'; - - /** - * The path to the sendmail program. - * @var string - */ - public $Sendmail = '/usr/sbin/sendmail'; - - /** - * Whether mail() uses a fully sendmail-compatible MTA. - * One which supports sendmail's "-oi -f" options. - * @var boolean - */ - public $UseSendmailOptions = true; - - /** - * Path to PHPMailer plugins. - * Useful if the SMTP class is not in the PHP include path. - * @var string - * @deprecated Should not be needed now there is an autoloader. - */ - public $PluginDir = ''; - - /** - * The email address that a reading confirmation should be sent to, also known as read receipt. - * @var string - */ - public $ConfirmReadingTo = ''; - - /** - * The hostname to use in the Message-ID header and as default HELO string. - * If empty, PHPMailer attempts to find one with, in order, - * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value - * 'localhost.localdomain'. - * @var string - */ - public $Hostname = ''; - - /** - * An ID to be used in the Message-ID header. - * If empty, a unique id will be generated. - * You can set your own, but it must be in the format "<id@domain>", - * as defined in RFC5322 section 3.6.4 or it will be ignored. - * @see https://tools.ietf.org/html/rfc5322#section-3.6.4 - * @var string - */ - public $MessageID = ''; - - /** - * The message Date to be used in the Date header. - * If empty, the current date will be added. - * @var string - */ - public $MessageDate = ''; - - /** - * SMTP hosts. - * Either a single hostname or multiple semicolon-delimited hostnames. - * You can also specify a different port - * for each host by using this format: [hostname:port] - * (e.g. "smtp1.example.com:25;smtp2.example.com"). - * You can also specify encryption type, for example: - * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465"). - * Hosts will be tried in order. - * @var string - */ - public $Host = 'localhost'; - - /** - * The default SMTP server port. - * @var integer - * @TODO Why is this needed when the SMTP class takes care of it? - */ - public $Port = 25; - - /** - * The SMTP HELO of the message. - * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find - * one with the same method described above for $Hostname. - * @var string - * @see PHPMailer::$Hostname - */ - public $Helo = ''; - - /** - * What kind of encryption to use on the SMTP connection. - * Options: '', 'ssl' or 'tls' - * @var string - */ - public $SMTPSecure = ''; - - /** - * Whether to enable TLS encryption automatically if a server supports it, - * even if `SMTPSecure` is not set to 'tls'. - * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid. - * @var boolean - */ - public $SMTPAutoTLS = true; - - /** - * Whether to use SMTP authentication. - * Uses the Username and Password properties. - * @var boolean - * @see PHPMailer::$Username - * @see PHPMailer::$Password - */ - public $SMTPAuth = false; - - /** - * Options array passed to stream_context_create when connecting via SMTP. - * @var array - */ - public $SMTPOptions = array(); - - /** - * SMTP username. - * @var string - */ - public $Username = ''; - - /** - * SMTP password. - * @var string - */ - public $Password = ''; - - /** - * SMTP auth type. - * Options are CRAM-MD5, LOGIN, PLAIN, attempted in that order if not specified - * @var string - */ - public $AuthType = ''; - - /** - * SMTP realm. - * Used for NTLM auth - * @var string - */ - public $Realm = ''; - - /** - * SMTP workstation. - * Used for NTLM auth - * @var string - */ - public $Workstation = ''; - - /** - * The SMTP server timeout in seconds. - * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 - * @var integer - */ - public $Timeout = 300; - - /** - * SMTP class debug output mode. - * Debug output level. - * Options: - * * `0` No output - * * `1` Commands - * * `2` Data and commands - * * `3` As 2 plus connection status - * * `4` Low-level data output - * @var integer - * @see SMTP::$do_debug - */ - public $SMTPDebug = 0; - - /** - * How to handle debug output. - * Options: - * * `echo` Output plain-text as-is, appropriate for CLI - * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output - * * `error_log` Output to error log as configured in php.ini - * - * Alternatively, you can provide a callable expecting two params: a message string and the debug level: - * <code> - * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; - * </code> - * @var string|callable - * @see SMTP::$Debugoutput - */ - public $Debugoutput = 'echo'; - - /** - * Whether to keep SMTP connection open after each message. - * If this is set to true then to close the connection - * requires an explicit call to smtpClose(). - * @var boolean - */ - public $SMTPKeepAlive = false; - - /** - * Whether to split multiple to addresses into multiple messages - * or send them all in one message. - * Only supported in `mail` and `sendmail` transports, not in SMTP. - * @var boolean - */ - public $SingleTo = false; - - /** - * Storage for addresses when SingleTo is enabled. - * @var array - * @TODO This should really not be public - */ - public $SingleToArray = array(); - - /** - * Whether to generate VERP addresses on send. - * Only applicable when sending via SMTP. - * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path - * @link http://www.postfix.org/VERP_README.html Postfix VERP info - * @var boolean - */ - public $do_verp = false; - - /** - * Whether to allow sending messages with an empty body. - * @var boolean - */ - public $AllowEmpty = false; - - /** - * The default line ending. - * @note The default remains "\n". We force CRLF where we know - * it must be used via self::CRLF. - * @var string - */ - public $LE = "\n"; - - /** - * DKIM selector. - * @var string - */ - public $DKIM_selector = ''; - - /** - * DKIM Identity. - * Usually the email address used as the source of the email. - * @var string - */ - public $DKIM_identity = ''; - - /** - * DKIM passphrase. - * Used if your key is encrypted. - * @var string - */ - public $DKIM_passphrase = ''; - - /** - * DKIM signing domain name. - * @example 'example.com' - * @var string - */ - public $DKIM_domain = ''; - - /** - * DKIM private key file path. - * @var string - */ - public $DKIM_private = ''; - - /** - * DKIM private key string. - * If set, takes precedence over `$DKIM_private`. - * @var string - */ - public $DKIM_private_string = ''; - - /** - * Callback Action function name. - * - * The function that handles the result of the send email action. - * It is called out by send() for each email sent. - * - * Value can be any php callable: http://www.php.net/is_callable - * - * Parameters: - * boolean $result result of the send action - * string $to email address of the recipient - * string $cc cc email addresses - * string $bcc bcc email addresses - * string $subject the subject - * string $body the email body - * string $from email address of sender - * @var string - */ - public $action_function = ''; - - /** - * What to put in the X-Mailer header. - * Options: An empty string for PHPMailer default, whitespace for none, or a string to use - * @var string - */ - public $XMailer = ''; - - /** - * Which validator to use by default when validating email addresses. - * May be a callable to inject your own validator, but there are several built-in validators. - * @see PHPMailer::validateAddress() - * @var string|callable - * @static - */ - public static $validator = 'auto'; - - /** - * An instance of the SMTP sender class. - * @var SMTP - * @access protected - */ - protected $smtp = null; - - /** - * The array of 'to' names and addresses. - * @var array - * @access protected - */ - protected $to = array(); - - /** - * The array of 'cc' names and addresses. - * @var array - * @access protected - */ - protected $cc = array(); - - /** - * The array of 'bcc' names and addresses. - * @var array - * @access protected - */ - protected $bcc = array(); - - /** - * The array of reply-to names and addresses. - * @var array - * @access protected - */ - protected $ReplyTo = array(); - - /** - * An array of all kinds of addresses. - * Includes all of $to, $cc, $bcc - * @var array - * @access protected - * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc - */ - protected $all_recipients = array(); - - /** - * An array of names and addresses queued for validation. - * In send(), valid and non duplicate entries are moved to $all_recipients - * and one of $to, $cc, or $bcc. - * This array is used only for addresses with IDN. - * @var array - * @access protected - * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc - * @see PHPMailer::$all_recipients - */ - protected $RecipientsQueue = array(); - - /** - * An array of reply-to names and addresses queued for validation. - * In send(), valid and non duplicate entries are moved to $ReplyTo. - * This array is used only for addresses with IDN. - * @var array - * @access protected - * @see PHPMailer::$ReplyTo - */ - protected $ReplyToQueue = array(); - - /** - * The array of attachments. - * @var array - * @access protected - */ - protected $attachment = array(); - - /** - * The array of custom headers. - * @var array - * @access protected - */ - protected $CustomHeader = array(); - - /** - * The most recent Message-ID (including angular brackets). - * @var string - * @access protected - */ - protected $lastMessageID = ''; - - /** - * The message's MIME type. - * @var string - * @access protected - */ - protected $message_type = ''; - - /** - * The array of MIME boundary strings. - * @var array - * @access protected - */ - protected $boundary = array(); - - /** - * The array of available languages. - * @var array - * @access protected - */ - protected $language = array(); - - /** - * The number of errors encountered. - * @var integer - * @access protected - */ - protected $error_count = 0; - - /** - * The S/MIME certificate file path. - * @var string - * @access protected - */ - protected $sign_cert_file = ''; - - /** - * The S/MIME key file path. - * @var string - * @access protected - */ - protected $sign_key_file = ''; - - /** - * The optional S/MIME extra certificates ("CA Chain") file path. - * @var string - * @access protected - */ - protected $sign_extracerts_file = ''; - - /** - * The S/MIME password for the key. - * Used only if the key is encrypted. - * @var string - * @access protected - */ - protected $sign_key_pass = ''; - - /** - * Whether to throw exceptions for errors. - * @var boolean - * @access protected - */ - protected $exceptions = false; - - /** - * Unique ID used for message ID and boundaries. - * @var string - * @access protected - */ - protected $uniqueid = ''; - - /** - * Error severity: message only, continue processing. - */ - const STOP_MESSAGE = 0; - - /** - * Error severity: message, likely ok to continue processing. - */ - const STOP_CONTINUE = 1; - - /** - * Error severity: message, plus full stop, critical error reached. - */ - const STOP_CRITICAL = 2; - - /** - * SMTP RFC standard line ending. - */ - const CRLF = "\r\n"; - - /** - * The maximum line length allowed by RFC 2822 section 2.1.1 - * @var integer - */ - const MAX_LINE_LENGTH = 998; - - /** - * Constructor. - * @param boolean $exceptions Should we throw external exceptions? - */ - public function __construct($exceptions = null) - { - if ($exceptions !== null) { - $this->exceptions = (boolean)$exceptions; - } - } - - /** - * Destructor. - */ - public function __destruct() - { - //Close any open SMTP connection nicely - $this->smtpClose(); - } - - /** - * Call mail() in a safe_mode-aware fashion. - * Also, unless sendmail_path points to sendmail (or something that - * claims to be sendmail), don't pass params (not a perfect fix, - * but it will do) - * @param string $to To - * @param string $subject Subject - * @param string $body Message Body - * @param string $header Additional Header(s) - * @param string $params Params - * @access private - * @return boolean - */ - private function mailPassthru($to, $subject, $body, $header, $params) - { - //Check overloading of mail function to avoid double-encoding - if (ini_get('mbstring.func_overload') & 1) { - $subject = $this->secureHeader($subject); - } else { - $subject = $this->encodeHeader($this->secureHeader($subject)); - } - - //Can't use additional_parameters in safe_mode, calling mail() with null params breaks - //@link http://php.net/manual/en/function.mail.php - if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) { - $result = @mail($to, $subject, $body, $header); - } else { - $result = @mail($to, $subject, $body, $header, $params); - } - return $result; - } - /** - * Output debugging info via user-defined method. - * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug). - * @see PHPMailer::$Debugoutput - * @see PHPMailer::$SMTPDebug - * @param string $str - */ - protected function edebug($str) - { - if ($this->SMTPDebug <= 0) { - return; - } - //Avoid clash with built-in function names - if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) { - call_user_func($this->Debugoutput, $str, $this->SMTPDebug); - return; - } - switch ($this->Debugoutput) { - case 'error_log': - //Don't output, just log - error_log($str); - break; - case 'html': - //Cleans up output a bit for a better looking, HTML-safe output - echo htmlentities( - preg_replace('/[\r\n]+/', '', $str), - ENT_QUOTES, - 'UTF-8' - ) - . "<br>\n"; - break; - case 'echo': - default: - //Normalize line breaks - $str = preg_replace('/\r\n?/ms', "\n", $str); - echo gmdate('Y-m-d H:i:s') . "\t" . str_replace( - "\n", - "\n \t ", - trim($str) - ) . "\n"; - } - } - - /** - * Sets message type to HTML or plain. - * @param boolean $isHtml True for HTML mode. - * @return void - */ - public function isHTML($isHtml = true) - { - if ($isHtml) { - $this->ContentType = 'text/html'; - } else { - $this->ContentType = 'text/plain'; - } - } - - /** - * Send messages using SMTP. - * @return void - */ - public function isSMTP() - { - $this->Mailer = 'smtp'; - } - - /** - * Send messages using PHP's mail() function. - * @return void - */ - public function isMail() - { - $this->Mailer = 'mail'; - } - - /** - * Send messages using $Sendmail. - * @return void - */ - public function isSendmail() - { - $ini_sendmail_path = ini_get('sendmail_path'); - - if (!stristr($ini_sendmail_path, 'sendmail')) { - $this->Sendmail = '/usr/sbin/sendmail'; - } else { - $this->Sendmail = $ini_sendmail_path; - } - $this->Mailer = 'sendmail'; - } - - /** - * Send messages using qmail. - * @return void - */ - public function isQmail() - { - $ini_sendmail_path = ini_get('sendmail_path'); - - if (!stristr($ini_sendmail_path, 'qmail')) { - $this->Sendmail = '/var/qmail/bin/qmail-inject'; - } else { - $this->Sendmail = $ini_sendmail_path; - } - $this->Mailer = 'qmail'; - } - - /** - * Add a "To" address. - * @param string $address The email address to send to - * @param string $name - * @return boolean true on success, false if address already used or invalid in some way - */ - public function addAddress($address, $name = '') - { - return $this->addOrEnqueueAnAddress('to', $address, $name); - } - - /** - * Add a "CC" address. - * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer. - * @param string $address The email address to send to - * @param string $name - * @return boolean true on success, false if address already used or invalid in some way - */ - public function addCC($address, $name = '') - { - return $this->addOrEnqueueAnAddress('cc', $address, $name); - } - - /** - * Add a "BCC" address. - * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer. - * @param string $address The email address to send to - * @param string $name - * @return boolean true on success, false if address already used or invalid in some way - */ - public function addBCC($address, $name = '') - { - return $this->addOrEnqueueAnAddress('bcc', $address, $name); - } - - /** - * Add a "Reply-To" address. - * @param string $address The email address to reply to - * @param string $name - * @return boolean true on success, false if address already used or invalid in some way - */ - public function addReplyTo($address, $name = '') - { - return $this->addOrEnqueueAnAddress('Reply-To', $address, $name); - } - - /** - * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer - * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still - * be modified after calling this function), addition of such addresses is delayed until send(). - * Addresses that have been added already return false, but do not throw exceptions. - * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' - * @param string $address The email address to send, resp. to reply to - * @param string $name - * @throws phpmailerException - * @return boolean true on success, false if address already used or invalid in some way - * @access protected - */ - protected function addOrEnqueueAnAddress($kind, $address, $name) - { - $address = trim($address); - $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim - if (($pos = strrpos($address, '@')) === false) { - // At-sign is misssing. - $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address"; - $this->setError($error_message); - $this->edebug($error_message); - if ($this->exceptions) { - throw new phpmailerException($error_message); - } - return false; - } - $params = array($kind, $address, $name); - // Enqueue addresses with IDN until we know the PHPMailer::$CharSet. - if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) { - if ($kind != 'Reply-To') { - if (!array_key_exists($address, $this->RecipientsQueue)) { - $this->RecipientsQueue[$address] = $params; - return true; - } - } else { - if (!array_key_exists($address, $this->ReplyToQueue)) { - $this->ReplyToQueue[$address] = $params; - return true; - } - } - return false; - } - // Immediately add standard addresses without IDN. - return call_user_func_array(array($this, 'addAnAddress'), $params); - } - - /** - * Add an address to one of the recipient arrays or to the ReplyTo array. - * Addresses that have been added already return false, but do not throw exceptions. - * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo' - * @param string $address The email address to send, resp. to reply to - * @param string $name - * @throws phpmailerException - * @return boolean true on success, false if address already used or invalid in some way - * @access protected - */ - protected function addAnAddress($kind, $address, $name = '') - { - if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) { - $error_message = $this->lang('Invalid recipient kind: ') . $kind; - $this->setError($error_message); - $this->edebug($error_message); - if ($this->exceptions) { - throw new phpmailerException($error_message); - } - return false; - } - if (!$this->validateAddress($address)) { - $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address"; - $this->setError($error_message); - $this->edebug($error_message); - if ($this->exceptions) { - throw new phpmailerException($error_message); - } - return false; - } - if ($kind != 'Reply-To') { - if (!array_key_exists(strtolower($address), $this->all_recipients)) { - array_push($this->$kind, array($address, $name)); - $this->all_recipients[strtolower($address)] = true; - return true; - } - } else { - if (!array_key_exists(strtolower($address), $this->ReplyTo)) { - $this->ReplyTo[strtolower($address)] = array($address, $name); - return true; - } - } - return false; - } - - /** - * Parse and validate a string containing one or more RFC822-style comma-separated email addresses - * of the form "display name <address>" into an array of name/address pairs. - * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available. - * Note that quotes in the name part are removed. - * @param string $addrstr The address list string - * @param bool $useimap Whether to use the IMAP extension to parse the list - * @return array - * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation - */ - public function parseAddresses($addrstr, $useimap = true) - { - $addresses = array(); - if ($useimap and function_exists('imap_rfc822_parse_adrlist')) { - //Use this built-in parser if it's available - $list = imap_rfc822_parse_adrlist($addrstr, ''); - foreach ($list as $address) { - if ($address->host != '.SYNTAX-ERROR.') { - if ($this->validateAddress($address->mailbox . '@' . $address->host)) { - $addresses[] = array( - 'name' => (property_exists($address, 'personal') ? $address->personal : ''), - 'address' => $address->mailbox . '@' . $address->host - ); - } - } - } - } else { - //Use this simpler parser - $list = explode(',', $addrstr); - foreach ($list as $address) { - $address = trim($address); - //Is there a separate name part? - if (strpos($address, '<') === false) { - //No separate name, just use the whole thing - if ($this->validateAddress($address)) { - $addresses[] = array( - 'name' => '', - 'address' => $address - ); - } - } else { - list($name, $email) = explode('<', $address); - $email = trim(str_replace('>', '', $email)); - if ($this->validateAddress($email)) { - $addresses[] = array( - 'name' => trim(str_replace(array('"', "'"), '', $name)), - 'address' => $email - ); - } - } - } - } - return $addresses; - } - - /** - * Set the From and FromName properties. - * @param string $address - * @param string $name - * @param boolean $auto Whether to also set the Sender address, defaults to true - * @throws phpmailerException - * @return boolean - */ - public function setFrom($address, $name = '', $auto = true) - { - $address = trim($address); - $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim - // Don't validate now addresses with IDN. Will be done in send(). - if (($pos = strrpos($address, '@')) === false or - (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and - !$this->validateAddress($address)) { - $error_message = $this->lang('invalid_address') . " (setFrom) $address"; - $this->setError($error_message); - $this->edebug($error_message); - if ($this->exceptions) { - throw new phpmailerException($error_message); - } - return false; - } - $this->From = $address; - $this->FromName = $name; - if ($auto) { - if (empty($this->Sender)) { - $this->Sender = $address; - } - } - return true; - } - - /** - * Return the Message-ID header of the last email. - * Technically this is the value from the last time the headers were created, - * but it's also the message ID of the last sent message except in - * pathological cases. - * @return string - */ - public function getLastMessageID() - { - return $this->lastMessageID; - } - - /** - * Check that a string looks like an email address. - * @param string $address The email address to check - * @param string|callable $patternselect A selector for the validation pattern to use : - * * `auto` Pick best pattern automatically; - * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14; - * * `pcre` Use old PCRE implementation; - * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; - * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements. - * * `noregex` Don't use a regex: super fast, really dumb. - * Alternatively you may pass in a callable to inject your own validator, for example: - * PHPMailer::validateAddress('user@example.com', function($address) { - * return (strpos($address, '@') !== false); - * }); - * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator. - * @return boolean - * @static - * @access public - */ - public static function validateAddress($address, $patternselect = null) - { - if (is_null($patternselect)) { - $patternselect = self::$validator; - } - if (is_callable($patternselect)) { - return call_user_func($patternselect, $address); - } - //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321 - if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) { - return false; - } - if (!$patternselect or $patternselect == 'auto') { - //Check this constant first so it works when extension_loaded() is disabled by safe mode - //Constant was added in PHP 5.2.4 - if (defined('PCRE_VERSION')) { - //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2 - if (version_compare(PCRE_VERSION, '8.0.3') >= 0) { - $patternselect = 'pcre8'; - } else { - $patternselect = 'pcre'; - } - } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) { - //Fall back to older PCRE - $patternselect = 'pcre'; - } else { - //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension - if (version_compare(PHP_VERSION, '5.2.0') >= 0) { - $patternselect = 'php'; - } else { - $patternselect = 'noregex'; - } - } - } - switch ($patternselect) { - case 'pcre8': - /** - * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains. - * @link http://squiloople.com/2009/12/20/email-address-validation/ - * @copyright 2009-2010 Michael Rushton - * Feel free to use and redistribute this code. But please keep this copyright notice. - */ - return (boolean)preg_match( - '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' . - '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' . - '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' . - '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' . - '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' . - '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' . - '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' . - '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' . - '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD', - $address - ); - case 'pcre': - //An older regex that doesn't need a recent PCRE - return (boolean)preg_match( - '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' . - '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' . - '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' . - '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' . - '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' . - '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' . - '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' . - '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' . - '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' . - '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD', - $address - ); - case 'html5': - /** - * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements. - * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email) - */ - return (boolean)preg_match( - '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' . - '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD', - $address - ); - case 'noregex': - //No PCRE! Do something _very_ approximate! - //Check the address is 3 chars or longer and contains an @ that's not the first or last char - return (strlen($address) >= 3 - and strpos($address, '@') >= 1 - and strpos($address, '@') != strlen($address) - 1); - case 'php': - default: - return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL); - } - } - - /** - * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the - * "intl" and "mbstring" PHP extensions. - * @return bool "true" if required functions for IDN support are present - */ - public function idnSupported() - { - // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2. - return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding'); - } - - /** - * Converts IDN in given email address to its ASCII form, also known as punycode, if possible. - * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet. - * This function silently returns unmodified address if: - * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form) - * - Conversion to punycode is impossible (e.g. required PHP functions are not available) - * or fails for any reason (e.g. domain has characters not allowed in an IDN) - * @see PHPMailer::$CharSet - * @param string $address The email address to convert - * @return string The encoded address in ASCII form - */ - public function punyencodeAddress($address) - { - // Verify we have required functions, CharSet, and at-sign. - if ($this->idnSupported() and - !empty($this->CharSet) and - ($pos = strrpos($address, '@')) !== false) { - $domain = substr($address, ++$pos); - // Verify CharSet string is a valid one, and domain properly encoded in this CharSet. - if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) { - $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet); - if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ? - idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) : - idn_to_ascii($domain)) !== false) { - return substr($address, 0, $pos) . $punycode; - } - } - } - return $address; - } - - /** - * Create a message and send it. - * Uses the sending method specified by $Mailer. - * @throws phpmailerException - * @return boolean false on error - See the ErrorInfo property for details of the error. - */ - public function send() - { - try { - if (!$this->preSend()) { - return false; - } - return $this->postSend(); - } catch (phpmailerException $exc) { - $this->mailHeader = ''; - $this->setError($exc->getMessage()); - if ($this->exceptions) { - throw $exc; - } - return false; - } - } - - /** - * Prepare a message for sending. - * @throws phpmailerException - * @return boolean - */ - public function preSend() - { - try { - $this->error_count = 0; // Reset errors - $this->mailHeader = ''; - - // Dequeue recipient and Reply-To addresses with IDN - foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) { - $params[1] = $this->punyencodeAddress($params[1]); - call_user_func_array(array($this, 'addAnAddress'), $params); - } - if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) { - throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL); - } - - // Validate From, Sender, and ConfirmReadingTo addresses - foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) { - $this->$address_kind = trim($this->$address_kind); - if (empty($this->$address_kind)) { - continue; - } - $this->$address_kind = $this->punyencodeAddress($this->$address_kind); - if (!$this->validateAddress($this->$address_kind)) { - $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind; - $this->setError($error_message); - $this->edebug($error_message); - if ($this->exceptions) { - throw new phpmailerException($error_message); - } - return false; - } - } - - // Set whether the message is multipart/alternative - if ($this->alternativeExists()) { - $this->ContentType = 'multipart/alternative'; - } - - $this->setMessageType(); - // Refuse to send an empty message unless we are specifically allowing it - if (!$this->AllowEmpty and empty($this->Body)) { - throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL); - } - - // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding) - $this->MIMEHeader = ''; - $this->MIMEBody = $this->createBody(); - // createBody may have added some headers, so retain them - $tempheaders = $this->MIMEHeader; - $this->MIMEHeader = $this->createHeader(); - $this->MIMEHeader .= $tempheaders; - - // To capture the complete message when using mail(), create - // an extra header list which createHeader() doesn't fold in - if ($this->Mailer == 'mail') { - if (count($this->to) > 0) { - $this->mailHeader .= $this->addrAppend('To', $this->to); - } else { - $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;'); - } - $this->mailHeader .= $this->headerLine( - 'Subject', - $this->encodeHeader($this->secureHeader(trim($this->Subject))) - ); - } - - // Sign with DKIM if enabled - if (!empty($this->DKIM_domain) - && !empty($this->DKIM_selector) - && (!empty($this->DKIM_private_string) - || (!empty($this->DKIM_private) && file_exists($this->DKIM_private)) - ) - ) { - $header_dkim = $this->DKIM_Add( - $this->MIMEHeader . $this->mailHeader, - $this->encodeHeader($this->secureHeader($this->Subject)), - $this->MIMEBody - ); - $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF . - str_replace("\r\n", "\n", $header_dkim) . self::CRLF; - } - return true; - } catch (phpmailerException $exc) { - $this->setError($exc->getMessage()); - if ($this->exceptions) { - throw $exc; - } - return false; - } - } - - /** - * Actually send a message. - * Send the email via the selected mechanism - * @throws phpmailerException - * @return boolean - */ - public function postSend() - { - try { - // Choose the mailer and send through it - switch ($this->Mailer) { - case 'sendmail': - case 'qmail': - return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody); - case 'smtp': - return $this->smtpSend($this->MIMEHeader, $this->MIMEBody); - case 'mail': - return $this->mailSend($this->MIMEHeader, $this->MIMEBody); - default: - $sendMethod = $this->Mailer.'Send'; - if (method_exists($this, $sendMethod)) { - return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody); - } - - return $this->mailSend($this->MIMEHeader, $this->MIMEBody); - } - } catch (phpmailerException $exc) { - $this->setError($exc->getMessage()); - $this->edebug($exc->getMessage()); - if ($this->exceptions) { - throw $exc; - } - } - return false; - } - - /** - * Send mail using the $Sendmail program. - * @param string $header The message headers - * @param string $body The message body - * @see PHPMailer::$Sendmail - * @throws phpmailerException - * @access protected - * @return boolean - */ - protected function sendmailSend($header, $body) - { - // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. - if (!empty($this->Sender) and self::isShellSafe($this->Sender)) { - if ($this->Mailer == 'qmail') { - $sendmailFmt = '%s -f%s'; - } else { - $sendmailFmt = '%s -oi -f%s -t'; - } - } else { - if ($this->Mailer == 'qmail') { - $sendmailFmt = '%s'; - } else { - $sendmailFmt = '%s -oi -t'; - } - } - - // TODO: If possible, this should be changed to escapeshellarg. Needs thorough testing. - $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail), $this->Sender); - - if ($this->SingleTo) { - foreach ($this->SingleToArray as $toAddr) { - if (!@$mail = popen($sendmail, 'w')) { - throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - fputs($mail, 'To: ' . $toAddr . "\n"); - fputs($mail, $header); - fputs($mail, $body); - $result = pclose($mail); - $this->doCallback( - ($result == 0), - array($toAddr), - $this->cc, - $this->bcc, - $this->Subject, - $body, - $this->From - ); - if ($result != 0) { - throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - } - } else { - if (!@$mail = popen($sendmail, 'w')) { - throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - fputs($mail, $header); - fputs($mail, $body); - $result = pclose($mail); - $this->doCallback( - ($result == 0), - $this->to, - $this->cc, - $this->bcc, - $this->Subject, - $body, - $this->From - ); - if ($result != 0) { - throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL); - } - } - return true; - } - - /** - * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe shell characters. - * - * Note that escapeshellarg and escapeshellcmd are inadequate for our purposes, especially on Windows. - * @param string $string The string to be validated - * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045 bug report - * @access protected - * @return boolean - */ - protected static function isShellSafe($string) - { - // Future-proof - if (escapeshellcmd($string) !== $string - or !in_array(escapeshellarg($string), array("'$string'", "\"$string\"")) - ) { - return false; - } - - $length = strlen($string); - - for ($i = 0; $i < $length; $i++) { - $c = $string[$i]; - - // All other characters have a special meaning in at least one common shell, including = and +. - // Full stop (.) has a special meaning in cmd.exe, but its impact should be negligible here. - // Note that this does permit non-Latin alphanumeric characters based on the current locale. - if (!ctype_alnum($c) && strpos('@_-.', $c) === false) { - return false; - } - } - - return true; - } - - /** - * Send mail using the PHP mail() function. - * @param string $header The message headers - * @param string $body The message body - * @link http://www.php.net/manual/en/book.mail.php - * @throws phpmailerException - * @access protected - * @return boolean - */ - protected function mailSend($header, $body) - { - $toArr = array(); - foreach ($this->to as $toaddr) { - $toArr[] = $this->addrFormat($toaddr); - } - $to = implode(', ', $toArr); - - $params = null; - //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver - if (!empty($this->Sender) and $this->validateAddress($this->Sender)) { - // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped. - if (self::isShellSafe($this->Sender)) { - $params = sprintf('-f%s', $this->Sender); - } - } - if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) { - $old_from = ini_get('sendmail_from'); - ini_set('sendmail_from', $this->Sender); - } - $result = false; - if ($this->SingleTo and count($toArr) > 1) { - foreach ($toArr as $toAddr) { - $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params); - $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From); - } - } else { - $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params); - $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From); - } - if (isset($old_from)) { - ini_set('sendmail_from', $old_from); - } - if (!$result) { - throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL); - } - return true; - } - - /** - * Get an instance to use for SMTP operations. - * Override this function to load your own SMTP implementation - * @return SMTP - */ - public function getSMTPInstance() - { - if (!is_object($this->smtp)) { - require_once( 'class-smtp.php' ); - $this->smtp = new SMTP; - } - return $this->smtp; - } - - /** - * Send mail via SMTP. - * Returns false if there is a bad MAIL FROM, RCPT, or DATA input. - * Uses the PHPMailerSMTP class by default. - * @see PHPMailer::getSMTPInstance() to use a different class. - * @param string $header The message headers - * @param string $body The message body - * @throws phpmailerException - * @uses SMTP - * @access protected - * @return boolean - */ - protected function smtpSend($header, $body) - { - $bad_rcpt = array(); - if (!$this->smtpConnect($this->SMTPOptions)) { - throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL); - } - if (!empty($this->Sender) and $this->validateAddress($this->Sender)) { - $smtp_from = $this->Sender; - } else { - $smtp_from = $this->From; - } - if (!$this->smtp->mail($smtp_from)) { - $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError())); - throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL); - } - - // Attempt to send to all recipients - foreach (array($this->to, $this->cc, $this->bcc) as $togroup) { - foreach ($togroup as $to) { - if (!$this->smtp->recipient($to[0])) { - $error = $this->smtp->getError(); - $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']); - $isSent = false; - } else { - $isSent = true; - } - $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From); - } - } - - // Only send the DATA command if we have viable recipients - if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) { - throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL); - } - if ($this->SMTPKeepAlive) { - $this->smtp->reset(); - } else { - $this->smtp->quit(); - $this->smtp->close(); - } - //Create error message for any bad addresses - if (count($bad_rcpt) > 0) { - $errstr = ''; - foreach ($bad_rcpt as $bad) { - $errstr .= $bad['to'] . ': ' . $bad['error']; - } - throw new phpmailerException( - $this->lang('recipients_failed') . $errstr, - self::STOP_CONTINUE - ); - } - return true; - } - - /** - * Initiate a connection to an SMTP server. - * Returns false if the operation failed. - * @param array $options An array of options compatible with stream_context_create() - * @uses SMTP - * @access public - * @throws phpmailerException - * @return boolean - */ - public function smtpConnect($options = null) - { - if (is_null($this->smtp)) { - $this->smtp = $this->getSMTPInstance(); - } - - //If no options are provided, use whatever is set in the instance - if (is_null($options)) { - $options = $this->SMTPOptions; - } - - // Already connected? - if ($this->smtp->connected()) { - return true; - } - - $this->smtp->setTimeout($this->Timeout); - $this->smtp->setDebugLevel($this->SMTPDebug); - $this->smtp->setDebugOutput($this->Debugoutput); - $this->smtp->setVerp($this->do_verp); - $hosts = explode(';', $this->Host); - $lastexception = null; - - foreach ($hosts as $hostentry) { - $hostinfo = array(); - if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) { - // Not a valid host entry - continue; - } - // $hostinfo[2]: optional ssl or tls prefix - // $hostinfo[3]: the hostname - // $hostinfo[4]: optional port number - // The host string prefix can temporarily override the current setting for SMTPSecure - // If it's not specified, the default value is used - $prefix = ''; - $secure = $this->SMTPSecure; - $tls = ($this->SMTPSecure == 'tls'); - if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) { - $prefix = 'ssl://'; - $tls = false; // Can't have SSL and TLS at the same time - $secure = 'ssl'; - } elseif ($hostinfo[2] == 'tls') { - $tls = true; - // tls doesn't use a prefix - $secure = 'tls'; - } - //Do we need the OpenSSL extension? - $sslext = defined('OPENSSL_ALGO_SHA1'); - if ('tls' === $secure or 'ssl' === $secure) { - //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled - if (!$sslext) { - throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL); - } - } - $host = $hostinfo[3]; - $port = $this->Port; - $tport = (integer)$hostinfo[4]; - if ($tport > 0 and $tport < 65536) { - $port = $tport; - } - if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) { - try { - if ($this->Helo) { - $hello = $this->Helo; - } else { - $hello = $this->serverHostname(); - } - $this->smtp->hello($hello); - //Automatically enable TLS encryption if: - // * it's not disabled - // * we have openssl extension - // * we are not already using SSL - // * the server offers STARTTLS - if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) { - $tls = true; - } - if ($tls) { - if (!$this->smtp->startTLS()) { - throw new phpmailerException($this->lang('connect_host')); - } - // We must resend EHLO after TLS negotiation - $this->smtp->hello($hello); - } - if ($this->SMTPAuth) { - if (!$this->smtp->authenticate( - $this->Username, - $this->Password, - $this->AuthType, - $this->Realm, - $this->Workstation - ) - ) { - throw new phpmailerException($this->lang('authenticate')); - } - } - return true; - } catch (phpmailerException $exc) { - $lastexception = $exc; - $this->edebug($exc->getMessage()); - // We must have connected, but then failed TLS or Auth, so close connection nicely - $this->smtp->quit(); - } - } - } - // If we get here, all connection attempts have failed, so close connection hard - $this->smtp->close(); - // As we've caught all exceptions, just report whatever the last one was - if ($this->exceptions and !is_null($lastexception)) { - throw $lastexception; - } - return false; - } - - /** - * Close the active SMTP session if one exists. - * @return void - */ - public function smtpClose() - { - if (is_a($this->smtp, 'SMTP')) { - if ($this->smtp->connected()) { - $this->smtp->quit(); - $this->smtp->close(); - } - } - } - - /** - * Set the language for error messages. - * Returns false if it cannot load the language file. - * The default language is English. - * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr") - * @param string $lang_path Path to the language file directory, with trailing separator (slash) - * @return boolean - * @access public - */ - public function setLanguage($langcode = 'en', $lang_path = '') - { - // Backwards compatibility for renamed language codes - $renamed_langcodes = array( - 'br' => 'pt_br', - 'cz' => 'cs', - 'dk' => 'da', - 'no' => 'nb', - 'se' => 'sv', - ); - - if (isset($renamed_langcodes[$langcode])) { - $langcode = $renamed_langcodes[$langcode]; - } - - // Define full set of translatable strings in English - $PHPMAILER_LANG = array( - 'authenticate' => 'SMTP Error: Could not authenticate.', - 'connect_host' => 'SMTP Error: Could not connect to SMTP host.', - 'data_not_accepted' => 'SMTP Error: data not accepted.', - 'empty_message' => 'Message body empty', - 'encoding' => 'Unknown encoding: ', - 'execute' => 'Could not execute: ', - 'file_access' => 'Could not access file: ', - 'file_open' => 'File Error: Could not open file: ', - 'from_failed' => 'The following From address failed: ', - 'instantiate' => 'Could not instantiate mail function.', - 'invalid_address' => 'Invalid address: ', - 'mailer_not_supported' => ' mailer is not supported.', - 'provide_address' => 'You must provide at least one recipient email address.', - 'recipients_failed' => 'SMTP Error: The following recipients failed: ', - 'signing' => 'Signing Error: ', - 'smtp_connect_failed' => 'SMTP connect() failed.', - 'smtp_error' => 'SMTP server error: ', - 'variable_set' => 'Cannot set or reset variable: ', - 'extension_missing' => 'Extension missing: ' - ); - if (empty($lang_path)) { - // Calculate an absolute path so it can work if CWD is not here - $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR; - } - //Validate $langcode - if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) { - $langcode = 'en'; - } - $foundlang = true; - $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php'; - // There is no English translation file - if ($langcode != 'en') { - // Make sure language file path is readable - if (!is_readable($lang_file)) { - $foundlang = false; - } else { - // Overwrite language-specific strings. - // This way we'll never have missing translation keys. - $foundlang = include $lang_file; - } - } - $this->language = $PHPMAILER_LANG; - return (boolean)$foundlang; // Returns false if language not found - } - - /** - * Get the array of strings for the current language. - * @return array - */ - public function getTranslations() - { - return $this->language; - } - - /** - * Create recipient headers. - * @access public - * @param string $type - * @param array $addr An array of recipient, - * where each recipient is a 2-element indexed array with element 0 containing an address - * and element 1 containing a name, like: - * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User')) - * @return string - */ - public function addrAppend($type, $addr) - { - $addresses = array(); - foreach ($addr as $address) { - $addresses[] = $this->addrFormat($address); - } - return $type . ': ' . implode(', ', $addresses) . $this->LE; - } - - /** - * Format an address for use in a message header. - * @access public - * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name - * like array('joe@example.com', 'Joe User') - * @return string - */ - public function addrFormat($addr) - { - if (empty($addr[1])) { // No name provided - return $this->secureHeader($addr[0]); - } else { - return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader( - $addr[0] - ) . '>'; - } - } - - /** - * Word-wrap message. - * For use with mailers that do not automatically perform wrapping - * and for quoted-printable encoded messages. - * Original written by philippe. - * @param string $message The message to wrap - * @param integer $length The line length to wrap to - * @param boolean $qp_mode Whether to run in Quoted-Printable mode - * @access public - * @return string - */ - public function wrapText($message, $length, $qp_mode = false) - { - if ($qp_mode) { - $soft_break = sprintf(' =%s', $this->LE); - } else { - $soft_break = $this->LE; - } - // If utf-8 encoding is used, we will need to make sure we don't - // split multibyte characters when we wrap - $is_utf8 = (strtolower($this->CharSet) == 'utf-8'); - $lelen = strlen($this->LE); - $crlflen = strlen(self::CRLF); - - $message = $this->fixEOL($message); - //Remove a trailing line break - if (substr($message, -$lelen) == $this->LE) { - $message = substr($message, 0, -$lelen); - } - - //Split message into lines - $lines = explode($this->LE, $message); - //Message will be rebuilt in here - $message = ''; - foreach ($lines as $line) { - $words = explode(' ', $line); - $buf = ''; - $firstword = true; - foreach ($words as $word) { - if ($qp_mode and (strlen($word) > $length)) { - $space_left = $length - strlen($buf) - $crlflen; - if (!$firstword) { - if ($space_left > 20) { - $len = $space_left; - if ($is_utf8) { - $len = $this->utf8CharBoundary($word, $len); - } elseif (substr($word, $len - 1, 1) == '=') { - $len--; - } elseif (substr($word, $len - 2, 1) == '=') { - $len -= 2; - } - $part = substr($word, 0, $len); - $word = substr($word, $len); - $buf .= ' ' . $part; - $message .= $buf . sprintf('=%s', self::CRLF); - } else { - $message .= $buf . $soft_break; - } - $buf = ''; - } - while (strlen($word) > 0) { - if ($length <= 0) { - break; - } - $len = $length; - if ($is_utf8) { - $len = $this->utf8CharBoundary($word, $len); - } elseif (substr($word, $len - 1, 1) == '=') { - $len--; - } elseif (substr($word, $len - 2, 1) == '=') { - $len -= 2; - } - $part = substr($word, 0, $len); - $word = substr($word, $len); - - if (strlen($word) > 0) { - $message .= $part . sprintf('=%s', self::CRLF); - } else { - $buf = $part; - } - } - } else { - $buf_o = $buf; - if (!$firstword) { - $buf .= ' '; - } - $buf .= $word; - - if (strlen($buf) > $length and $buf_o != '') { - $message .= $buf_o . $soft_break; - $buf = $word; - } - } - $firstword = false; - } - $message .= $buf . self::CRLF; - } - - return $message; - } - - /** - * Find the last character boundary prior to $maxLength in a utf-8 - * quoted-printable encoded string. - * Original written by Colin Brown. - * @access public - * @param string $encodedText utf-8 QP text - * @param integer $maxLength Find the last character boundary prior to this length - * @return integer - */ - public function utf8CharBoundary($encodedText, $maxLength) - { - $foundSplitPos = false; - $lookBack = 3; - while (!$foundSplitPos) { - $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack); - $encodedCharPos = strpos($lastChunk, '='); - if (false !== $encodedCharPos) { - // Found start of encoded character byte within $lookBack block. - // Check the encoded byte value (the 2 chars after the '=') - $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2); - $dec = hexdec($hex); - if ($dec < 128) { - // Single byte character. - // If the encoded char was found at pos 0, it will fit - // otherwise reduce maxLength to start of the encoded char - if ($encodedCharPos > 0) { - $maxLength = $maxLength - ($lookBack - $encodedCharPos); - } - $foundSplitPos = true; - } elseif ($dec >= 192) { - // First byte of a multi byte character - // Reduce maxLength to split at start of character - $maxLength = $maxLength - ($lookBack - $encodedCharPos); - $foundSplitPos = true; - } elseif ($dec < 192) { - // Middle byte of a multi byte character, look further back - $lookBack += 3; - } - } else { - // No encoded character found - $foundSplitPos = true; - } - } - return $maxLength; - } - - /** - * Apply word wrapping to the message body. - * Wraps the message body to the number of chars set in the WordWrap property. - * You should only do this to plain-text bodies as wrapping HTML tags may break them. - * This is called automatically by createBody(), so you don't need to call it yourself. - * @access public - * @return void - */ - public function setWordWrap() - { - if ($this->WordWrap < 1) { - return; - } - - switch ($this->message_type) { - case 'alt': - case 'alt_inline': - case 'alt_attach': - case 'alt_inline_attach': - $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap); - break; - default: - $this->Body = $this->wrapText($this->Body, $this->WordWrap); - break; - } - } - - /** - * Assemble message headers. - * @access public - * @return string The assembled headers - */ - public function createHeader() - { - $result = ''; - - if ($this->MessageDate == '') { - $this->MessageDate = self::rfcDate(); - } - $result .= $this->headerLine('Date', $this->MessageDate); - - // To be created automatically by mail() - if ($this->SingleTo) { - if ($this->Mailer != 'mail') { - foreach ($this->to as $toaddr) { - $this->SingleToArray[] = $this->addrFormat($toaddr); - } - } - } else { - if (count($this->to) > 0) { - if ($this->Mailer != 'mail') { - $result .= $this->addrAppend('To', $this->to); - } - } elseif (count($this->cc) == 0) { - $result .= $this->headerLine('To', 'undisclosed-recipients:;'); - } - } - - $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName))); - - // sendmail and mail() extract Cc from the header before sending - if (count($this->cc) > 0) { - $result .= $this->addrAppend('Cc', $this->cc); - } - - // sendmail and mail() extract Bcc from the header before sending - if (( - $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail' - ) - and count($this->bcc) > 0 - ) { - $result .= $this->addrAppend('Bcc', $this->bcc); - } - - if (count($this->ReplyTo) > 0) { - $result .= $this->addrAppend('Reply-To', $this->ReplyTo); - } - - // mail() sets the subject itself - if ($this->Mailer != 'mail') { - $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject))); - } - - // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4 - // https://tools.ietf.org/html/rfc5322#section-3.6.4 - if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) { - $this->lastMessageID = $this->MessageID; - } else { - $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname()); - } - $result .= $this->headerLine('Message-ID', $this->lastMessageID); - if (!is_null($this->Priority)) { - $result .= $this->headerLine('X-Priority', $this->Priority); - } - if ($this->XMailer == '') { - $result .= $this->headerLine( - 'X-Mailer', - 'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)' - ); - } else { - $myXmailer = trim($this->XMailer); - if ($myXmailer) { - $result .= $this->headerLine('X-Mailer', $myXmailer); - } - } - - if ($this->ConfirmReadingTo != '') { - $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>'); - } - - // Add custom headers - foreach ($this->CustomHeader as $header) { - $result .= $this->headerLine( - trim($header[0]), - $this->encodeHeader(trim($header[1])) - ); - } - if (!$this->sign_key_file) { - $result .= $this->headerLine('MIME-Version', '1.0'); - $result .= $this->getMailMIME(); - } - - return $result; - } - - /** - * Get the message MIME type headers. - * @access public - * @return string - */ - public function getMailMIME() - { - $result = ''; - $ismultipart = true; - switch ($this->message_type) { - case 'inline': - $result .= $this->headerLine('Content-Type', 'multipart/related;'); - $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); - break; - case 'attach': - case 'inline_attach': - case 'alt_attach': - case 'alt_inline_attach': - $result .= $this->headerLine('Content-Type', 'multipart/mixed;'); - $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); - break; - case 'alt': - case 'alt_inline': - $result .= $this->headerLine('Content-Type', 'multipart/alternative;'); - $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"'); - break; - default: - // Catches case 'plain': and case '': - $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet); - $ismultipart = false; - break; - } - // RFC1341 part 5 says 7bit is assumed if not specified - if ($this->Encoding != '7bit') { - // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE - if ($ismultipart) { - if ($this->Encoding == '8bit') { - $result .= $this->headerLine('Content-Transfer-Encoding', '8bit'); - } - // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible - } else { - $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding); - } - } - - if ($this->Mailer != 'mail') { - $result .= $this->LE; - } - - return $result; - } - - /** - * Returns the whole MIME message. - * Includes complete headers and body. - * Only valid post preSend(). - * @see PHPMailer::preSend() - * @access public - * @return string - */ - public function getSentMIMEMessage() - { - return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody; - } - - /** - * Create unique ID - * @return string - */ - protected function generateId() { - return md5(uniqid(time())); - } - - /** - * Assemble the message body. - * Returns an empty string on failure. - * @access public - * @throws phpmailerException - * @return string The assembled message body - */ - public function createBody() - { - $body = ''; - //Create unique IDs and preset boundaries - $this->uniqueid = $this->generateId(); - $this->boundary[1] = 'b1_' . $this->uniqueid; - $this->boundary[2] = 'b2_' . $this->uniqueid; - $this->boundary[3] = 'b3_' . $this->uniqueid; - - if ($this->sign_key_file) { - $body .= $this->getMailMIME() . $this->LE; - } - - $this->setWordWrap(); - - $bodyEncoding = $this->Encoding; - $bodyCharSet = $this->CharSet; - //Can we do a 7-bit downgrade? - if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) { - $bodyEncoding = '7bit'; - //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit - $bodyCharSet = 'us-ascii'; - } - //If lines are too long, and we're not already using an encoding that will shorten them, - //change to quoted-printable transfer encoding for the body part only - if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) { - $bodyEncoding = 'quoted-printable'; - } - - $altBodyEncoding = $this->Encoding; - $altBodyCharSet = $this->CharSet; - //Can we do a 7-bit downgrade? - if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) { - $altBodyEncoding = '7bit'; - //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit - $altBodyCharSet = 'us-ascii'; - } - //If lines are too long, and we're not already using an encoding that will shorten them, - //change to quoted-printable transfer encoding for the alt body part only - if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) { - $altBodyEncoding = 'quoted-printable'; - } - //Use this as a preamble in all multipart message types - $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE; - switch ($this->message_type) { - case 'inline': - $body .= $mimepre; - $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding); - $body .= $this->encodeString($this->Body, $bodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->attachAll('inline', $this->boundary[1]); - break; - case 'attach': - $body .= $mimepre; - $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding); - $body .= $this->encodeString($this->Body, $bodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->attachAll('attachment', $this->boundary[1]); - break; - case 'inline_attach': - $body .= $mimepre; - $body .= $this->textLine('--' . $this->boundary[1]); - $body .= $this->headerLine('Content-Type', 'multipart/related;'); - $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); - $body .= $this->LE; - $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding); - $body .= $this->encodeString($this->Body, $bodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->attachAll('inline', $this->boundary[2]); - $body .= $this->LE; - $body .= $this->attachAll('attachment', $this->boundary[1]); - break; - case 'alt': - $body .= $mimepre; - $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding); - $body .= $this->encodeString($this->AltBody, $altBodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding); - $body .= $this->encodeString($this->Body, $bodyEncoding); - $body .= $this->LE . $this->LE; - if (!empty($this->Ical)) { - $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', ''); - $body .= $this->encodeString($this->Ical, $this->Encoding); - $body .= $this->LE . $this->LE; - } - $body .= $this->endBoundary($this->boundary[1]); - break; - case 'alt_inline': - $body .= $mimepre; - $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding); - $body .= $this->encodeString($this->AltBody, $altBodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->textLine('--' . $this->boundary[1]); - $body .= $this->headerLine('Content-Type', 'multipart/related;'); - $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); - $body .= $this->LE; - $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding); - $body .= $this->encodeString($this->Body, $bodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->attachAll('inline', $this->boundary[2]); - $body .= $this->LE; - $body .= $this->endBoundary($this->boundary[1]); - break; - case 'alt_attach': - $body .= $mimepre; - $body .= $this->textLine('--' . $this->boundary[1]); - $body .= $this->headerLine('Content-Type', 'multipart/alternative;'); - $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); - $body .= $this->LE; - $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding); - $body .= $this->encodeString($this->AltBody, $altBodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding); - $body .= $this->encodeString($this->Body, $bodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->endBoundary($this->boundary[2]); - $body .= $this->LE; - $body .= $this->attachAll('attachment', $this->boundary[1]); - break; - case 'alt_inline_attach': - $body .= $mimepre; - $body .= $this->textLine('--' . $this->boundary[1]); - $body .= $this->headerLine('Content-Type', 'multipart/alternative;'); - $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"'); - $body .= $this->LE; - $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding); - $body .= $this->encodeString($this->AltBody, $altBodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->textLine('--' . $this->boundary[2]); - $body .= $this->headerLine('Content-Type', 'multipart/related;'); - $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"'); - $body .= $this->LE; - $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding); - $body .= $this->encodeString($this->Body, $bodyEncoding); - $body .= $this->LE . $this->LE; - $body .= $this->attachAll('inline', $this->boundary[3]); - $body .= $this->LE; - $body .= $this->endBoundary($this->boundary[2]); - $body .= $this->LE; - $body .= $this->attachAll('attachment', $this->boundary[1]); - break; - default: - // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types - //Reset the `Encoding` property in case we changed it for line length reasons - $this->Encoding = $bodyEncoding; - $body .= $this->encodeString($this->Body, $this->Encoding); - break; - } - - if ($this->isError()) { - $body = ''; - } elseif ($this->sign_key_file) { - try { - if (!defined('PKCS7_TEXT')) { - throw new phpmailerException($this->lang('extension_missing') . 'openssl'); - } - // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1 - $file = tempnam(sys_get_temp_dir(), 'mail'); - if (false === file_put_contents($file, $body)) { - throw new phpmailerException($this->lang('signing') . ' Could not write temp file'); - } - $signed = tempnam(sys_get_temp_dir(), 'signed'); - //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197 - if (empty($this->sign_extracerts_file)) { - $sign = @openssl_pkcs7_sign( - $file, - $signed, - 'file://' . realpath($this->sign_cert_file), - array('file://' . realpath($this->sign_key_file), $this->sign_key_pass), - null - ); - } else { - $sign = @openssl_pkcs7_sign( - $file, - $signed, - 'file://' . realpath($this->sign_cert_file), - array('file://' . realpath($this->sign_key_file), $this->sign_key_pass), - null, - PKCS7_DETACHED, - $this->sign_extracerts_file - ); - } - if ($sign) { - @unlink($file); - $body = file_get_contents($signed); - @unlink($signed); - //The message returned by openssl contains both headers and body, so need to split them up - $parts = explode("\n\n", $body, 2); - $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE; - $body = $parts[1]; - } else { - @unlink($file); - @unlink($signed); - throw new phpmailerException($this->lang('signing') . openssl_error_string()); - } - } catch (phpmailerException $exc) { - $body = ''; - if ($this->exceptions) { - throw $exc; - } - } - } - return $body; - } - - /** - * Return the start of a message boundary. - * @access protected - * @param string $boundary - * @param string $charSet - * @param string $contentType - * @param string $encoding - * @return string - */ - protected function getBoundary($boundary, $charSet, $contentType, $encoding) - { - $result = ''; - if ($charSet == '') { - $charSet = $this->CharSet; - } - if ($contentType == '') { - $contentType = $this->ContentType; - } - if ($encoding == '') { - $encoding = $this->Encoding; - } - $result .= $this->textLine('--' . $boundary); - $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet); - $result .= $this->LE; - // RFC1341 part 5 says 7bit is assumed if not specified - if ($encoding != '7bit') { - $result .= $this->headerLine('Content-Transfer-Encoding', $encoding); - } - $result .= $this->LE; - - return $result; - } - - /** - * Return the end of a message boundary. - * @access protected - * @param string $boundary - * @return string - */ - protected function endBoundary($boundary) - { - return $this->LE . '--' . $boundary . '--' . $this->LE; - } - - /** - * Set the message type. - * PHPMailer only supports some preset message types, not arbitrary MIME structures. - * @access protected - * @return void - */ - protected function setMessageType() - { - $type = array(); - if ($this->alternativeExists()) { - $type[] = 'alt'; - } - if ($this->inlineImageExists()) { - $type[] = 'inline'; - } - if ($this->attachmentExists()) { - $type[] = 'attach'; - } - $this->message_type = implode('_', $type); - if ($this->message_type == '') { - //The 'plain' message_type refers to the message having a single body element, not that it is plain-text - $this->message_type = 'plain'; - } - } - - /** - * Format a header line. - * @access public - * @param string $name - * @param string $value - * @return string - */ - public function headerLine($name, $value) - { - return $name . ': ' . $value . $this->LE; - } - - /** - * Return a formatted mail line. - * @access public - * @param string $value - * @return string - */ - public function textLine($value) - { - return $value . $this->LE; - } - - /** - * Add an attachment from a path on the filesystem. - * Never use a user-supplied path to a file! - * Returns false if the file could not be found or read. - * @param string $path Path to the attachment. - * @param string $name Overrides the attachment name. - * @param string $encoding File encoding (see $Encoding). - * @param string $type File extension (MIME) type. - * @param string $disposition Disposition to use - * @throws phpmailerException - * @return boolean - */ - public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment') - { - try { - if (!@is_file($path)) { - throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE); - } - - // If a MIME type is not specified, try to work it out from the file name - if ($type == '') { - $type = self::filenameToType($path); - } - - $filename = basename($path); - if ($name == '') { - $name = $filename; - } - - $this->attachment[] = array( - 0 => $path, - 1 => $filename, - 2 => $name, - 3 => $encoding, - 4 => $type, - 5 => false, // isStringAttachment - 6 => $disposition, - 7 => 0 - ); - - } catch (phpmailerException $exc) { - $this->setError($exc->getMessage()); - $this->edebug($exc->getMessage()); - if ($this->exceptions) { - throw $exc; - } - return false; - } - return true; - } - - /** - * Return the array of attachments. - * @return array - */ - public function getAttachments() - { - return $this->attachment; - } - - /** - * Attach all file, string, and binary attachments to the message. - * Returns an empty string on failure. - * @access protected - * @param string $disposition_type - * @param string $boundary - * @return string - */ - protected function attachAll($disposition_type, $boundary) - { - // Return text of body - $mime = array(); - $cidUniq = array(); - $incl = array(); - - // Add all attachments - foreach ($this->attachment as $attachment) { - // Check if it is a valid disposition_filter - if ($attachment[6] == $disposition_type) { - // Check for string attachment - $string = ''; - $path = ''; - $bString = $attachment[5]; - if ($bString) { - $string = $attachment[0]; - } else { - $path = $attachment[0]; - } - - $inclhash = md5(serialize($attachment)); - if (in_array($inclhash, $incl)) { - continue; - } - $incl[] = $inclhash; - $name = $attachment[2]; - $encoding = $attachment[3]; - $type = $attachment[4]; - $disposition = $attachment[6]; - $cid = $attachment[7]; - if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) { - continue; - } - $cidUniq[$cid] = true; - - $mime[] = sprintf('--%s%s', $boundary, $this->LE); - //Only include a filename property if we have one - if (!empty($name)) { - $mime[] = sprintf( - 'Content-Type: %s; name="%s"%s', - $type, - $this->encodeHeader($this->secureHeader($name)), - $this->LE - ); - } else { - $mime[] = sprintf( - 'Content-Type: %s%s', - $type, - $this->LE - ); - } - // RFC1341 part 5 says 7bit is assumed if not specified - if ($encoding != '7bit') { - $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE); - } - - if ($disposition == 'inline') { - $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE); - } - - // If a filename contains any of these chars, it should be quoted, - // but not otherwise: RFC2183 & RFC2045 5.1 - // Fixes a warning in IETF's msglint MIME checker - // Allow for bypassing the Content-Disposition header totally - if (!(empty($disposition))) { - $encoded_name = $this->encodeHeader($this->secureHeader($name)); - if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) { - $mime[] = sprintf( - 'Content-Disposition: %s; filename="%s"%s', - $disposition, - $encoded_name, - $this->LE . $this->LE - ); - } else { - if (!empty($encoded_name)) { - $mime[] = sprintf( - 'Content-Disposition: %s; filename=%s%s', - $disposition, - $encoded_name, - $this->LE . $this->LE - ); - } else { - $mime[] = sprintf( - 'Content-Disposition: %s%s', - $disposition, - $this->LE . $this->LE - ); - } - } - } else { - $mime[] = $this->LE; - } - - // Encode as string attachment - if ($bString) { - $mime[] = $this->encodeString($string, $encoding); - if ($this->isError()) { - return ''; - } - $mime[] = $this->LE . $this->LE; - } else { - $mime[] = $this->encodeFile($path, $encoding); - if ($this->isError()) { - return ''; - } - $mime[] = $this->LE . $this->LE; - } - } - } - - $mime[] = sprintf('--%s--%s', $boundary, $this->LE); - - return implode('', $mime); - } - - /** - * Encode a file attachment in requested format. - * Returns an empty string on failure. - * @param string $path The full path to the file - * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' - * @throws phpmailerException - * @access protected - * @return string - */ - protected function encodeFile($path, $encoding = 'base64') - { - try { - if (!is_readable($path)) { - throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE); - } - $magic_quotes = get_magic_quotes_runtime(); - if ($magic_quotes) { - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - set_magic_quotes_runtime(false); - } else { - //Doesn't exist in PHP 5.4, but we don't need to check because - //get_magic_quotes_runtime always returns false in 5.4+ - //so it will never get here - ini_set('magic_quotes_runtime', false); - } - } - $file_buffer = file_get_contents($path); - $file_buffer = $this->encodeString($file_buffer, $encoding); - if ($magic_quotes) { - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - set_magic_quotes_runtime($magic_quotes); - } else { - ini_set('magic_quotes_runtime', $magic_quotes); - } - } - return $file_buffer; - } catch (Exception $exc) { - $this->setError($exc->getMessage()); - return ''; - } - } - - /** - * Encode a string in requested format. - * Returns an empty string on failure. - * @param string $str The text to encode - * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable' - * @access public - * @return string - */ - public function encodeString($str, $encoding = 'base64') - { - $encoded = ''; - switch (strtolower($encoding)) { - case 'base64': - $encoded = chunk_split(base64_encode($str), 76, $this->LE); - break; - case '7bit': - case '8bit': - $encoded = $this->fixEOL($str); - // Make sure it ends with a line break - if (substr($encoded, -(strlen($this->LE))) != $this->LE) { - $encoded .= $this->LE; - } - break; - case 'binary': - $encoded = $str; - break; - case 'quoted-printable': - $encoded = $this->encodeQP($str); - break; - default: - $this->setError($this->lang('encoding') . $encoding); - break; - } - return $encoded; - } - - /** - * Encode a header string optimally. - * Picks shortest of Q, B, quoted-printable or none. - * @access public - * @param string $str - * @param string $position - * @return string - */ - public function encodeHeader($str, $position = 'text') - { - $matchcount = 0; - switch (strtolower($position)) { - case 'phrase': - if (!preg_match('/[\200-\377]/', $str)) { - // Can't use addslashes as we don't know the value of magic_quotes_sybase - $encoded = addcslashes($str, "\0..\37\177\\\""); - if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) { - return ($encoded); - } else { - return ("\"$encoded\""); - } - } - $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches); - break; - /** @noinspection PhpMissingBreakStatementInspection */ - case 'comment': - $matchcount = preg_match_all('/[()"]/', $str, $matches); - // Intentional fall-through - case 'text': - default: - $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches); - break; - } - - //There are no chars that need encoding - if ($matchcount == 0) { - return ($str); - } - - $maxlen = 75 - 7 - strlen($this->CharSet); - // Try to select the encoding which should produce the shortest output - if ($matchcount > strlen($str) / 3) { - // More than a third of the content will need encoding, so B encoding will be most efficient - $encoding = 'B'; - if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) { - // Use a custom function which correctly encodes and wraps long - // multibyte strings without breaking lines within a character - $encoded = $this->base64EncodeWrapMB($str, "\n"); - } else { - $encoded = base64_encode($str); - $maxlen -= $maxlen % 4; - $encoded = trim(chunk_split($encoded, $maxlen, "\n")); - } - } else { - $encoding = 'Q'; - $encoded = $this->encodeQ($str, $position); - $encoded = $this->wrapText($encoded, $maxlen, true); - $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded)); - } - - $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded); - $encoded = trim(str_replace("\n", $this->LE, $encoded)); - - return $encoded; - } - - /** - * Check if a string contains multi-byte characters. - * @access public - * @param string $str multi-byte text to wrap encode - * @return boolean - */ - public function hasMultiBytes($str) - { - if (function_exists('mb_strlen')) { - return (strlen($str) > mb_strlen($str, $this->CharSet)); - } else { // Assume no multibytes (we can't handle without mbstring functions anyway) - return false; - } - } - - /** - * Does a string contain any 8-bit chars (in any charset)? - * @param string $text - * @return boolean - */ - public function has8bitChars($text) - { - return (boolean)preg_match('/[\x80-\xFF]/', $text); - } - - /** - * Encode and wrap long multibyte strings for mail headers - * without breaking lines within a character. - * Adapted from a function by paravoid - * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283 - * @access public - * @param string $str multi-byte text to wrap encode - * @param string $linebreak string to use as linefeed/end-of-line - * @return string - */ - public function base64EncodeWrapMB($str, $linebreak = null) - { - $start = '=?' . $this->CharSet . '?B?'; - $end = '?='; - $encoded = ''; - if ($linebreak === null) { - $linebreak = $this->LE; - } - - $mb_length = mb_strlen($str, $this->CharSet); - // Each line must have length <= 75, including $start and $end - $length = 75 - strlen($start) - strlen($end); - // Average multi-byte ratio - $ratio = $mb_length / strlen($str); - // Base64 has a 4:3 ratio - $avgLength = floor($length * $ratio * .75); - - for ($i = 0; $i < $mb_length; $i += $offset) { - $lookBack = 0; - do { - $offset = $avgLength - $lookBack; - $chunk = mb_substr($str, $i, $offset, $this->CharSet); - $chunk = base64_encode($chunk); - $lookBack++; - } while (strlen($chunk) > $length); - $encoded .= $chunk . $linebreak; - } - - // Chomp the last linefeed - $encoded = substr($encoded, 0, -strlen($linebreak)); - return $encoded; - } - - /** - * Encode a string in quoted-printable format. - * According to RFC2045 section 6.7. - * @access public - * @param string $string The text to encode - * @param integer $line_max Number of chars allowed on a line before wrapping - * @return string - * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment - */ - public function encodeQP($string, $line_max = 76) - { - // Use native function if it's available (>= PHP5.3) - if (function_exists('quoted_printable_encode')) { - return quoted_printable_encode($string); - } - // Fall back to a pure PHP implementation - $string = str_replace( - array('%20', '%0D%0A.', '%0D%0A', '%'), - array(' ', "\r\n=2E", "\r\n", '='), - rawurlencode($string) - ); - return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string); - } - - /** - * Backward compatibility wrapper for an old QP encoding function that was removed. - * @see PHPMailer::encodeQP() - * @access public - * @param string $string - * @param integer $line_max - * @param boolean $space_conv - * @return string - * @deprecated Use encodeQP instead. - */ - public function encodeQPphp( - $string, - $line_max = 76, - /** @noinspection PhpUnusedParameterInspection */ $space_conv = false - ) { - return $this->encodeQP($string, $line_max); - } - - /** - * Encode a string using Q encoding. - * @link http://tools.ietf.org/html/rfc2047 - * @param string $str the text to encode - * @param string $position Where the text is going to be used, see the RFC for what that means - * @access public - * @return string - */ - public function encodeQ($str, $position = 'text') - { - // There should not be any EOL in the string - $pattern = ''; - $encoded = str_replace(array("\r", "\n"), '', $str); - switch (strtolower($position)) { - case 'phrase': - // RFC 2047 section 5.3 - $pattern = '^A-Za-z0-9!*+\/ -'; - break; - /** @noinspection PhpMissingBreakStatementInspection */ - case 'comment': - // RFC 2047 section 5.2 - $pattern = '\(\)"'; - // intentional fall-through - // for this reason we build the $pattern without including delimiters and [] - case 'text': - default: - // RFC 2047 section 5.1 - // Replace every high ascii, control, =, ? and _ characters - $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern; - break; - } - $matches = array(); - if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) { - // If the string contains an '=', make sure it's the first thing we replace - // so as to avoid double-encoding - $eqkey = array_search('=', $matches[0]); - if (false !== $eqkey) { - unset($matches[0][$eqkey]); - array_unshift($matches[0], '='); - } - foreach (array_unique($matches[0]) as $char) { - $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded); - } - } - // Replace every spaces to _ (more readable than =20) - return str_replace(' ', '_', $encoded); - } - - /** - * Add a string or binary attachment (non-filesystem). - * This method can be used to attach ascii or binary data, - * such as a BLOB record from a database. - * @param string $string String attachment data. - * @param string $filename Name of the attachment. - * @param string $encoding File encoding (see $Encoding). - * @param string $type File extension (MIME) type. - * @param string $disposition Disposition to use - * @return void - */ - public function addStringAttachment( - $string, - $filename, - $encoding = 'base64', - $type = '', - $disposition = 'attachment' - ) { - // If a MIME type is not specified, try to work it out from the file name - if ($type == '') { - $type = self::filenameToType($filename); - } - // Append to $attachment array - $this->attachment[] = array( - 0 => $string, - 1 => $filename, - 2 => basename($filename), - 3 => $encoding, - 4 => $type, - 5 => true, // isStringAttachment - 6 => $disposition, - 7 => 0 - ); - } - - /** - * Add an embedded (inline) attachment from a file. - * This can include images, sounds, and just about any other document type. - * These differ from 'regular' attachments in that they are intended to be - * displayed inline with the message, not just attached for download. - * This is used in HTML messages that embed the images - * the HTML refers to using the $cid value. - * Never use a user-supplied path to a file! - * @param string $path Path to the attachment. - * @param string $cid Content ID of the attachment; Use this to reference - * the content when using an embedded image in HTML. - * @param string $name Overrides the attachment name. - * @param string $encoding File encoding (see $Encoding). - * @param string $type File MIME type. - * @param string $disposition Disposition to use - * @return boolean True on successfully adding an attachment - */ - public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline') - { - if (!@is_file($path)) { - $this->setError($this->lang('file_access') . $path); - return false; - } - - // If a MIME type is not specified, try to work it out from the file name - if ($type == '') { - $type = self::filenameToType($path); - } - - $filename = basename($path); - if ($name == '') { - $name = $filename; - } - - // Append to $attachment array - $this->attachment[] = array( - 0 => $path, - 1 => $filename, - 2 => $name, - 3 => $encoding, - 4 => $type, - 5 => false, // isStringAttachment - 6 => $disposition, - 7 => $cid - ); - return true; - } - - /** - * Add an embedded stringified attachment. - * This can include images, sounds, and just about any other document type. - * Be sure to set the $type to an image type for images: - * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'. - * @param string $string The attachment binary data. - * @param string $cid Content ID of the attachment; Use this to reference - * the content when using an embedded image in HTML. - * @param string $name - * @param string $encoding File encoding (see $Encoding). - * @param string $type MIME type. - * @param string $disposition Disposition to use - * @return boolean True on successfully adding an attachment - */ - public function addStringEmbeddedImage( - $string, - $cid, - $name = '', - $encoding = 'base64', - $type = '', - $disposition = 'inline' - ) { - // If a MIME type is not specified, try to work it out from the name - if ($type == '' and !empty($name)) { - $type = self::filenameToType($name); - } - - // Append to $attachment array - $this->attachment[] = array( - 0 => $string, - 1 => $name, - 2 => $name, - 3 => $encoding, - 4 => $type, - 5 => true, // isStringAttachment - 6 => $disposition, - 7 => $cid - ); - return true; - } - - /** - * Check if an inline attachment is present. - * @access public - * @return boolean - */ - public function inlineImageExists() - { - foreach ($this->attachment as $attachment) { - if ($attachment[6] == 'inline') { - return true; - } - } - return false; - } - - /** - * Check if an attachment (non-inline) is present. - * @return boolean - */ - public function attachmentExists() - { - foreach ($this->attachment as $attachment) { - if ($attachment[6] == 'attachment') { - return true; - } - } - return false; - } - - /** - * Check if this message has an alternative body set. - * @return boolean - */ - public function alternativeExists() - { - return !empty($this->AltBody); - } - - /** - * Clear queued addresses of given kind. - * @access protected - * @param string $kind 'to', 'cc', or 'bcc' - * @return void - */ - public function clearQueuedAddresses($kind) - { - $RecipientsQueue = $this->RecipientsQueue; - foreach ($RecipientsQueue as $address => $params) { - if ($params[0] == $kind) { - unset($this->RecipientsQueue[$address]); - } - } - } - - /** - * Clear all To recipients. - * @return void - */ - public function clearAddresses() - { - foreach ($this->to as $to) { - unset($this->all_recipients[strtolower($to[0])]); - } - $this->to = array(); - $this->clearQueuedAddresses('to'); - } - - /** - * Clear all CC recipients. - * @return void - */ - public function clearCCs() - { - foreach ($this->cc as $cc) { - unset($this->all_recipients[strtolower($cc[0])]); - } - $this->cc = array(); - $this->clearQueuedAddresses('cc'); - } - - /** - * Clear all BCC recipients. - * @return void - */ - public function clearBCCs() - { - foreach ($this->bcc as $bcc) { - unset($this->all_recipients[strtolower($bcc[0])]); - } - $this->bcc = array(); - $this->clearQueuedAddresses('bcc'); - } - - /** - * Clear all ReplyTo recipients. - * @return void - */ - public function clearReplyTos() - { - $this->ReplyTo = array(); - $this->ReplyToQueue = array(); - } - - /** - * Clear all recipient types. - * @return void - */ - public function clearAllRecipients() - { - $this->to = array(); - $this->cc = array(); - $this->bcc = array(); - $this->all_recipients = array(); - $this->RecipientsQueue = array(); - } - - /** - * Clear all filesystem, string, and binary attachments. - * @return void - */ - public function clearAttachments() - { - $this->attachment = array(); - } - - /** - * Clear all custom headers. - * @return void - */ - public function clearCustomHeaders() - { - $this->CustomHeader = array(); - } - - /** - * Add an error message to the error container. - * @access protected - * @param string $msg - * @return void - */ - protected function setError($msg) - { - $this->error_count++; - if ($this->Mailer == 'smtp' and !is_null($this->smtp)) { - $lasterror = $this->smtp->getError(); - if (!empty($lasterror['error'])) { - $msg .= $this->lang('smtp_error') . $lasterror['error']; - if (!empty($lasterror['detail'])) { - $msg .= ' Detail: '. $lasterror['detail']; - } - if (!empty($lasterror['smtp_code'])) { - $msg .= ' SMTP code: ' . $lasterror['smtp_code']; - } - if (!empty($lasterror['smtp_code_ex'])) { - $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex']; - } - } - } - $this->ErrorInfo = $msg; - } - - /** - * Return an RFC 822 formatted date. - * @access public - * @return string - * @static - */ - public static function rfcDate() - { - // Set the time zone to whatever the default is to avoid 500 errors - // Will default to UTC if it's not set properly in php.ini - date_default_timezone_set(@date_default_timezone_get()); - return date('D, j M Y H:i:s O'); - } - - /** - * Get the server hostname. - * Returns 'localhost.localdomain' if unknown. - * @access protected - * @return string - */ - protected function serverHostname() - { - $result = 'localhost.localdomain'; - if (!empty($this->Hostname)) { - $result = $this->Hostname; - } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) { - $result = $_SERVER['SERVER_NAME']; - } elseif (function_exists('gethostname') && gethostname() !== false) { - $result = gethostname(); - } elseif (php_uname('n') !== false) { - $result = php_uname('n'); - } - return $result; - } - - /** - * Get an error message in the current language. - * @access protected - * @param string $key - * @return string - */ - protected function lang($key) - { - if (count($this->language) < 1) { - $this->setLanguage('en'); // set the default language - } - - if (array_key_exists($key, $this->language)) { - if ($key == 'smtp_connect_failed') { - //Include a link to troubleshooting docs on SMTP connection failure - //this is by far the biggest cause of support questions - //but it's usually not PHPMailer's fault. - return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting'; - } - return $this->language[$key]; - } else { - //Return the key as a fallback - return $key; - } - } - - /** - * Check if an error occurred. - * @access public - * @return boolean True if an error did occur. - */ - public function isError() - { - return ($this->error_count > 0); - } - - /** - * Ensure consistent line endings in a string. - * Changes every end of line from CRLF, CR or LF to $this->LE. - * @access public - * @param string $str String to fixEOL - * @return string - */ - public function fixEOL($str) - { - // Normalise to \n - $nstr = str_replace(array("\r\n", "\r"), "\n", $str); - // Now convert LE as needed - if ($this->LE !== "\n") { - $nstr = str_replace("\n", $this->LE, $nstr); - } - return $nstr; - } - - /** - * Add a custom header. - * $name value can be overloaded to contain - * both header name and value (name:value) - * @access public - * @param string $name Custom header name - * @param string $value Header value - * @return void - */ - public function addCustomHeader($name, $value = null) - { - if ($value === null) { - // Value passed in as name:value - $this->CustomHeader[] = explode(':', $name, 2); - } else { - $this->CustomHeader[] = array($name, $value); - } - } - - /** - * Returns all custom headers. - * @return array - */ - public function getCustomHeaders() - { - return $this->CustomHeader; - } - - /** - * Create a message body from an HTML string. - * Automatically inlines images and creates a plain-text version by converting the HTML, - * overwriting any existing values in Body and AltBody. - * Do not source $message content from user input! - * $basedir is prepended when handling relative URLs, e.g. <img src="/images/a.png"> and must not be empty - * will look for an image file in $basedir/images/a.png and convert it to inline. - * If you don't provide a $basedir, relative paths will be left untouched (and thus probably break in email) - * If you don't want to apply these transformations to your HTML, just set Body and AltBody directly. - * @access public - * @param string $message HTML message string - * @param string $basedir Absolute path to a base directory to prepend to relative paths to images - * @param boolean|callable $advanced Whether to use the internal HTML to text converter - * or your own custom converter @see PHPMailer::html2text() - * @return string $message The transformed message Body - */ - public function msgHTML($message, $basedir = '', $advanced = false) - { - preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images); - if (array_key_exists(2, $images)) { - if (strlen($basedir) > 1 && substr($basedir, -1) != '/') { - // Ensure $basedir has a trailing / - $basedir .= '/'; - } - foreach ($images[2] as $imgindex => $url) { - // Convert data URIs into embedded images - if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) { - $data = substr($url, strpos($url, ',')); - if ($match[2]) { - $data = base64_decode($data); - } else { - $data = rawurldecode($data); - } - $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2 - if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) { - $message = str_replace( - $images[0][$imgindex], - $images[1][$imgindex] . '="cid:' . $cid . '"', - $message - ); - } - continue; - } - if ( - // Only process relative URLs if a basedir is provided (i.e. no absolute local paths) - !empty($basedir) - // Ignore URLs containing parent dir traversal (..) - && (strpos($url, '..') === false) - // Do not change urls that are already inline images - && substr($url, 0, 4) !== 'cid:' - // Do not change absolute URLs, including anonymous protocol - && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url) - ) { - $filename = basename($url); - $directory = dirname($url); - if ($directory == '.') { - $directory = ''; - } - $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2 - if (strlen($directory) > 1 && substr($directory, -1) != '/') { - $directory .= '/'; - } - if ($this->addEmbeddedImage( - $basedir . $directory . $filename, - $cid, - $filename, - 'base64', - self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION)) - ) - ) { - $message = preg_replace( - '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui', - $images[1][$imgindex] . '="cid:' . $cid . '"', - $message - ); - } - } - } - } - $this->isHTML(true); - // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better - $this->Body = $this->normalizeBreaks($message); - $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced)); - if (!$this->alternativeExists()) { - $this->AltBody = 'To view this email message, open it in a program that understands HTML!' . - self::CRLF . self::CRLF; - } - return $this->Body; - } - - /** - * Convert an HTML string into plain text. - * This is used by msgHTML(). - * Note - older versions of this function used a bundled advanced converter - * which was been removed for license reasons in #232. - * Example usage: - * <code> - * // Use default conversion - * $plain = $mail->html2text($html); - * // Use your own custom converter - * $plain = $mail->html2text($html, function($html) { - * $converter = new MyHtml2text($html); - * return $converter->get_text(); - * }); - * </code> - * @param string $html The HTML text to convert - * @param boolean|callable $advanced Any boolean value to use the internal converter, - * or provide your own callable for custom conversion. - * @return string - */ - public function html2text($html, $advanced = false) - { - if (is_callable($advanced)) { - return call_user_func($advanced, $html); - } - return html_entity_decode( - trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))), - ENT_QUOTES, - $this->CharSet - ); - } - - /** - * Get the MIME type for a file extension. - * @param string $ext File extension - * @access public - * @return string MIME type of file. - * @static - */ - public static function _mime_types($ext = '') - { - $mimes = array( - 'xl' => 'application/excel', - 'js' => 'application/javascript', - 'hqx' => 'application/mac-binhex40', - 'cpt' => 'application/mac-compactpro', - 'bin' => 'application/macbinary', - 'doc' => 'application/msword', - 'word' => 'application/msword', - 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'xltx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', - 'potx' => 'application/vnd.openxmlformats-officedocument.presentationml.template', - 'ppsx' => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', - 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', - 'sldx' => 'application/vnd.openxmlformats-officedocument.presentationml.slide', - 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', - 'dotx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', - 'xlam' => 'application/vnd.ms-excel.addin.macroEnabled.12', - 'xlsb' => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', - 'class' => 'application/octet-stream', - 'dll' => 'application/octet-stream', - 'dms' => 'application/octet-stream', - 'exe' => 'application/octet-stream', - 'lha' => 'application/octet-stream', - 'lzh' => 'application/octet-stream', - 'psd' => 'application/octet-stream', - 'sea' => 'application/octet-stream', - 'so' => 'application/octet-stream', - 'oda' => 'application/oda', - 'pdf' => 'application/pdf', - 'ai' => 'application/postscript', - 'eps' => 'application/postscript', - 'ps' => 'application/postscript', - 'smi' => 'application/smil', - 'smil' => 'application/smil', - 'mif' => 'application/vnd.mif', - 'xls' => 'application/vnd.ms-excel', - 'ppt' => 'application/vnd.ms-powerpoint', - 'wbxml' => 'application/vnd.wap.wbxml', - 'wmlc' => 'application/vnd.wap.wmlc', - 'dcr' => 'application/x-director', - 'dir' => 'application/x-director', - 'dxr' => 'application/x-director', - 'dvi' => 'application/x-dvi', - 'gtar' => 'application/x-gtar', - 'php3' => 'application/x-httpd-php', - 'php4' => 'application/x-httpd-php', - 'php' => 'application/x-httpd-php', - 'phtml' => 'application/x-httpd-php', - 'phps' => 'application/x-httpd-php-source', - 'swf' => 'application/x-shockwave-flash', - 'sit' => 'application/x-stuffit', - 'tar' => 'application/x-tar', - 'tgz' => 'application/x-tar', - 'xht' => 'application/xhtml+xml', - 'xhtml' => 'application/xhtml+xml', - 'zip' => 'application/zip', - 'mid' => 'audio/midi', - 'midi' => 'audio/midi', - 'mp2' => 'audio/mpeg', - 'mp3' => 'audio/mpeg', - 'mpga' => 'audio/mpeg', - 'aif' => 'audio/x-aiff', - 'aifc' => 'audio/x-aiff', - 'aiff' => 'audio/x-aiff', - 'ram' => 'audio/x-pn-realaudio', - 'rm' => 'audio/x-pn-realaudio', - 'rpm' => 'audio/x-pn-realaudio-plugin', - 'ra' => 'audio/x-realaudio', - 'wav' => 'audio/x-wav', - 'bmp' => 'image/bmp', - 'gif' => 'image/gif', - 'jpeg' => 'image/jpeg', - 'jpe' => 'image/jpeg', - 'jpg' => 'image/jpeg', - 'png' => 'image/png', - 'tiff' => 'image/tiff', - 'tif' => 'image/tiff', - 'eml' => 'message/rfc822', - 'css' => 'text/css', - 'html' => 'text/html', - 'htm' => 'text/html', - 'shtml' => 'text/html', - 'log' => 'text/plain', - 'text' => 'text/plain', - 'txt' => 'text/plain', - 'rtx' => 'text/richtext', - 'rtf' => 'text/rtf', - 'vcf' => 'text/vcard', - 'vcard' => 'text/vcard', - 'xml' => 'text/xml', - 'xsl' => 'text/xml', - 'mpeg' => 'video/mpeg', - 'mpe' => 'video/mpeg', - 'mpg' => 'video/mpeg', - 'mov' => 'video/quicktime', - 'qt' => 'video/quicktime', - 'rv' => 'video/vnd.rn-realvideo', - 'avi' => 'video/x-msvideo', - 'movie' => 'video/x-sgi-movie' - ); - if (array_key_exists(strtolower($ext), $mimes)) { - return $mimes[strtolower($ext)]; - } - return 'application/octet-stream'; - } - - /** - * Map a file name to a MIME type. - * Defaults to 'application/octet-stream', i.e.. arbitrary binary data. - * @param string $filename A file name or full path, does not need to exist as a file - * @return string - * @static - */ - public static function filenameToType($filename) - { - // In case the path is a URL, strip any query string before getting extension - $qpos = strpos($filename, '?'); - if (false !== $qpos) { - $filename = substr($filename, 0, $qpos); - } - $pathinfo = self::mb_pathinfo($filename); - return self::_mime_types($pathinfo['extension']); - } - - /** - * Multi-byte-safe pathinfo replacement. - * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe. - * Works similarly to the one in PHP >= 5.2.0 - * @link http://www.php.net/manual/en/function.pathinfo.php#107461 - * @param string $path A filename or path, does not need to exist as a file - * @param integer|string $options Either a PATHINFO_* constant, - * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2 - * @return string|array - * @static - */ - public static function mb_pathinfo($path, $options = null) - { - $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => ''); - $pathinfo = array(); - if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) { - if (array_key_exists(1, $pathinfo)) { - $ret['dirname'] = $pathinfo[1]; - } - if (array_key_exists(2, $pathinfo)) { - $ret['basename'] = $pathinfo[2]; - } - if (array_key_exists(5, $pathinfo)) { - $ret['extension'] = $pathinfo[5]; - } - if (array_key_exists(3, $pathinfo)) { - $ret['filename'] = $pathinfo[3]; - } - } - switch ($options) { - case PATHINFO_DIRNAME: - case 'dirname': - return $ret['dirname']; - case PATHINFO_BASENAME: - case 'basename': - return $ret['basename']; - case PATHINFO_EXTENSION: - case 'extension': - return $ret['extension']; - case PATHINFO_FILENAME: - case 'filename': - return $ret['filename']; - default: - return $ret; - } - } - - /** - * Set or reset instance properties. - * You should avoid this function - it's more verbose, less efficient, more error-prone and - * harder to debug than setting properties directly. - * Usage Example: - * `$mail->set('SMTPSecure', 'tls');` - * is the same as: - * `$mail->SMTPSecure = 'tls';` - * @access public - * @param string $name The property name to set - * @param mixed $value The value to set the property to - * @return boolean - * @TODO Should this not be using the __set() magic function? - */ - public function set($name, $value = '') - { - if (property_exists($this, $name)) { - $this->$name = $value; - return true; - } else { - $this->setError($this->lang('variable_set') . $name); - return false; - } - } - - /** - * Strip newlines to prevent header injection. - * @access public - * @param string $str - * @return string - */ - public function secureHeader($str) - { - return trim(str_replace(array("\r", "\n"), '', $str)); - } - - /** - * Normalize line breaks in a string. - * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format. - * Defaults to CRLF (for message bodies) and preserves consecutive breaks. - * @param string $text - * @param string $breaktype What kind of line break to use, defaults to CRLF - * @return string - * @access public - * @static - */ - public static function normalizeBreaks($text, $breaktype = "\r\n") - { - return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text); - } - - /** - * Set the public and private key files and password for S/MIME signing. - * @access public - * @param string $cert_filename - * @param string $key_filename - * @param string $key_pass Password for private key - * @param string $extracerts_filename Optional path to chain certificate - */ - public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '') - { - $this->sign_cert_file = $cert_filename; - $this->sign_key_file = $key_filename; - $this->sign_key_pass = $key_pass; - $this->sign_extracerts_file = $extracerts_filename; - } - - /** - * Quoted-Printable-encode a DKIM header. - * @access public - * @param string $txt - * @return string - */ - public function DKIM_QP($txt) - { - $line = ''; - for ($i = 0; $i < strlen($txt); $i++) { - $ord = ord($txt[$i]); - if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) { - $line .= $txt[$i]; - } else { - $line .= '=' . sprintf('%02X', $ord); - } - } - return $line; - } - - /** - * Generate a DKIM signature. - * @access public - * @param string $signHeader - * @throws phpmailerException - * @return string The DKIM signature value - */ - public function DKIM_Sign($signHeader) - { - if (!defined('PKCS7_TEXT')) { - if ($this->exceptions) { - throw new phpmailerException($this->lang('extension_missing') . 'openssl'); - } - return ''; - } - $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private); - if ('' != $this->DKIM_passphrase) { - $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase); - } else { - $privKey = openssl_pkey_get_private($privKeyStr); - } - //Workaround for missing digest algorithms in old PHP & OpenSSL versions - //@link http://stackoverflow.com/a/11117338/333340 - if (version_compare(PHP_VERSION, '5.3.0') >= 0 and - in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) { - if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) { - openssl_pkey_free($privKey); - return base64_encode($signature); - } - } else { - $pinfo = openssl_pkey_get_details($privKey); - $hash = hash('sha256', $signHeader); - //'Magic' constant for SHA256 from RFC3447 - //@link https://tools.ietf.org/html/rfc3447#page-43 - $t = '3031300d060960864801650304020105000420' . $hash; - $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3); - $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t); - - if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) { - openssl_pkey_free($privKey); - return base64_encode($signature); - } - } - openssl_pkey_free($privKey); - return ''; - } - - /** - * Generate a DKIM canonicalization header. - * @access public - * @param string $signHeader Header - * @return string - */ - public function DKIM_HeaderC($signHeader) - { - $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader); - $lines = explode("\r\n", $signHeader); - foreach ($lines as $key => $line) { - list($heading, $value) = explode(':', $line, 2); - $heading = strtolower($heading); - $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces - $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value - } - $signHeader = implode("\r\n", $lines); - return $signHeader; - } - - /** - * Generate a DKIM canonicalization body. - * @access public - * @param string $body Message Body - * @return string - */ - public function DKIM_BodyC($body) - { - if ($body == '') { - return "\r\n"; - } - // stabilize line endings - $body = str_replace("\r\n", "\n", $body); - $body = str_replace("\n", "\r\n", $body); - // END stabilize line endings - while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") { - $body = substr($body, 0, strlen($body) - 2); - } - return $body; - } - - /** - * Create the DKIM header and body in a new message header. - * @access public - * @param string $headers_line Header lines - * @param string $subject Subject - * @param string $body Body - * @return string - */ - public function DKIM_Add($headers_line, $subject, $body) - { - $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms - $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body - $DKIMquery = 'dns/txt'; // Query method - $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone) - $subject_header = "Subject: $subject"; - $headers = explode($this->LE, $headers_line); - $from_header = ''; - $to_header = ''; - $date_header = ''; - $current = ''; - foreach ($headers as $header) { - if (strpos($header, 'From:') === 0) { - $from_header = $header; - $current = 'from_header'; - } elseif (strpos($header, 'To:') === 0) { - $to_header = $header; - $current = 'to_header'; - } elseif (strpos($header, 'Date:') === 0) { - $date_header = $header; - $current = 'date_header'; - } else { - if (!empty($$current) && strpos($header, ' =?') === 0) { - $$current .= $header; - } else { - $current = ''; - } - } - } - $from = str_replace('|', '=7C', $this->DKIM_QP($from_header)); - $to = str_replace('|', '=7C', $this->DKIM_QP($to_header)); - $date = str_replace('|', '=7C', $this->DKIM_QP($date_header)); - $subject = str_replace( - '|', - '=7C', - $this->DKIM_QP($subject_header) - ); // Copied header fields (dkim-quoted-printable) - $body = $this->DKIM_BodyC($body); - $DKIMlen = strlen($body); // Length of body - $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body - if ('' == $this->DKIM_identity) { - $ident = ''; - } else { - $ident = ' i=' . $this->DKIM_identity . ';'; - } - $dkimhdrs = 'DKIM-Signature: v=1; a=' . - $DKIMsignatureType . '; q=' . - $DKIMquery . '; l=' . - $DKIMlen . '; s=' . - $this->DKIM_selector . - ";\r\n" . - "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" . - "\th=From:To:Date:Subject;\r\n" . - "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" . - "\tz=$from\r\n" . - "\t|$to\r\n" . - "\t|$date\r\n" . - "\t|$subject;\r\n" . - "\tbh=" . $DKIMb64 . ";\r\n" . - "\tb="; - $toSign = $this->DKIM_HeaderC( - $from_header . "\r\n" . - $to_header . "\r\n" . - $date_header . "\r\n" . - $subject_header . "\r\n" . - $dkimhdrs - ); - $signed = $this->DKIM_Sign($toSign); - return $dkimhdrs . $signed . "\r\n"; - } - - /** - * Detect if a string contains a line longer than the maximum line length allowed. - * @param string $str - * @return boolean - * @static - */ - public static function hasLineLongerThanMax($str) - { - //+2 to include CRLF line break for a 1000 total - return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str); - } - - /** - * Allows for public read access to 'to' property. - * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included. - * @access public - * @return array - */ - public function getToAddresses() - { - return $this->to; - } - - /** - * Allows for public read access to 'cc' property. - * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included. - * @access public - * @return array - */ - public function getCcAddresses() - { - return $this->cc; - } - - /** - * Allows for public read access to 'bcc' property. - * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included. - * @access public - * @return array - */ - public function getBccAddresses() - { - return $this->bcc; - } - - /** - * Allows for public read access to 'ReplyTo' property. - * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included. - * @access public - * @return array - */ - public function getReplyToAddresses() - { - return $this->ReplyTo; - } - - /** - * Allows for public read access to 'all_recipients' property. - * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included. - * @access public - * @return array - */ - public function getAllRecipientAddresses() - { - return $this->all_recipients; - } - - /** - * Perform a callback. - * @param boolean $isSent - * @param array $to - * @param array $cc - * @param array $bcc - * @param string $subject - * @param string $body - * @param string $from - */ - protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from) - { - if (!empty($this->action_function) && is_callable($this->action_function)) { - $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from); - call_user_func_array($this->action_function, $params); - } - } -} - -/** - * PHPMailer exception handler - * @package PHPMailer - */ -class phpmailerException extends Exception -{ - /** - * Prettify error message output - * @return string - */ - public function errorMessage() - { - $errorMsg = '<strong>' . $this->getMessage() . "</strong><br />\n"; - return $errorMsg; - } -} diff --git a/wp/wp-includes/class-pop3.php b/wp/wp-includes/class-pop3.php deleted file mode 100644 index 7416dd70..00000000 --- a/wp/wp-includes/class-pop3.php +++ /dev/null @@ -1,662 +0,0 @@ -<?php -/** - * mail_fetch/setup.php - * - * Copyright (c) 1999-2011 CDI (cdi@thewebmasters.net) All Rights Reserved - * Modified by Philippe Mingo 2001-2009 mingo@rotedic.com - * An RFC 1939 compliant wrapper class for the POP3 protocol. - * - * Licensed under the GNU GPL. For full terms see the file COPYING. - * - * POP3 class - * - * @copyright 1999-2011 The SquirrelMail Project Team - * @license http://opensource.org/licenses/gpl-license.php GNU Public License - * @package plugins - * @subpackage mail_fetch - */ - -class POP3 { - var $ERROR = ''; // Error string. - - var $TIMEOUT = 60; // Default timeout before giving up on a - // network operation. - - var $COUNT = -1; // Mailbox msg count - - var $BUFFER = 512; // Socket buffer for socket fgets() calls. - // Per RFC 1939 the returned line a POP3 - // server can send is 512 bytes. - - var $FP = ''; // The connection to the server's - // file descriptor - - var $MAILSERVER = ''; // Set this to hard code the server name - - var $DEBUG = FALSE; // set to true to echo pop3 - // commands and responses to error_log - // this WILL log passwords! - - var $BANNER = ''; // Holds the banner returned by the - // pop server - used for apop() - - var $ALLOWAPOP = FALSE; // Allow or disallow apop() - // This must be set to true - // manually - - /** - * PHP5 constructor. - */ - function __construct ( $server = '', $timeout = '' ) { - settype($this->BUFFER,"integer"); - if( !empty($server) ) { - // Do not allow programs to alter MAILSERVER - // if it is already specified. They can get around - // this if they -really- want to, so don't count on it. - if(empty($this->MAILSERVER)) - $this->MAILSERVER = $server; - } - if(!empty($timeout)) { - settype($timeout,"integer"); - $this->TIMEOUT = $timeout; - if (!ini_get('safe_mode')) - set_time_limit($timeout); - } - return true; - } - - /** - * PHP4 constructor. - */ - public function POP3( $server = '', $timeout = '' ) { - self::__construct( $server, $timeout ); - } - - function update_timer () { - if (!ini_get('safe_mode')) - set_time_limit($this->TIMEOUT); - return true; - } - - function connect ($server, $port = 110) { - // Opens a socket to the specified server. Unless overridden, - // port defaults to 110. Returns true on success, false on fail - - // If MAILSERVER is set, override $server with its value. - - if (!isset($port) || !$port) {$port = 110;} - if(!empty($this->MAILSERVER)) - $server = $this->MAILSERVER; - - if(empty($server)){ - $this->ERROR = "POP3 connect: " . _("No server specified"); - unset($this->FP); - return false; - } - - $fp = @fsockopen("$server", $port, $errno, $errstr); - - if(!$fp) { - $this->ERROR = "POP3 connect: " . _("Error ") . "[$errno] [$errstr]"; - unset($this->FP); - return false; - } - - socket_set_blocking($fp,-1); - $this->update_timer(); - $reply = fgets($fp,$this->BUFFER); - $reply = $this->strip_clf($reply); - if($this->DEBUG) - error_log("POP3 SEND [connect: $server] GOT [$reply]",0); - if(!$this->is_ok($reply)) { - $this->ERROR = "POP3 connect: " . _("Error ") . "[$reply]"; - unset($this->FP); - return false; - } - $this->FP = $fp; - $this->BANNER = $this->parse_banner($reply); - return true; - } - - function user ($user = "") { - // Sends the USER command, returns true or false - - if( empty($user) ) { - $this->ERROR = "POP3 user: " . _("no login ID submitted"); - return false; - } elseif(!isset($this->FP)) { - $this->ERROR = "POP3 user: " . _("connection not established"); - return false; - } else { - $reply = $this->send_cmd("USER $user"); - if(!$this->is_ok($reply)) { - $this->ERROR = "POP3 user: " . _("Error ") . "[$reply]"; - return false; - } else - return true; - } - } - - function pass ($pass = "") { - // Sends the PASS command, returns # of msgs in mailbox, - // returns false (undef) on Auth failure - - if(empty($pass)) { - $this->ERROR = "POP3 pass: " . _("No password submitted"); - return false; - } elseif(!isset($this->FP)) { - $this->ERROR = "POP3 pass: " . _("connection not established"); - return false; - } else { - $reply = $this->send_cmd("PASS $pass"); - if(!$this->is_ok($reply)) { - $this->ERROR = "POP3 pass: " . _("Authentication failed") . " [$reply]"; - $this->quit(); - return false; - } else { - // Auth successful. - $count = $this->last("count"); - $this->COUNT = $count; - return $count; - } - } - } - - function apop ($login,$pass) { - // Attempts an APOP login. If this fails, it'll - // try a standard login. YOUR SERVER MUST SUPPORT - // THE USE OF THE APOP COMMAND! - // (apop is optional per rfc1939) - - if(!isset($this->FP)) { - $this->ERROR = "POP3 apop: " . _("No connection to server"); - return false; - } elseif(!$this->ALLOWAPOP) { - $retVal = $this->login($login,$pass); - return $retVal; - } elseif(empty($login)) { - $this->ERROR = "POP3 apop: " . _("No login ID submitted"); - return false; - } elseif(empty($pass)) { - $this->ERROR = "POP3 apop: " . _("No password submitted"); - return false; - } else { - $banner = $this->BANNER; - if( (!$banner) or (empty($banner)) ) { - $this->ERROR = "POP3 apop: " . _("No server banner") . ' - ' . _("abort"); - $retVal = $this->login($login,$pass); - return $retVal; - } else { - $AuthString = $banner; - $AuthString .= $pass; - $APOPString = md5($AuthString); - $cmd = "APOP $login $APOPString"; - $reply = $this->send_cmd($cmd); - if(!$this->is_ok($reply)) { - $this->ERROR = "POP3 apop: " . _("apop authentication failed") . ' - ' . _("abort"); - $retVal = $this->login($login,$pass); - return $retVal; - } else { - // Auth successful. - $count = $this->last("count"); - $this->COUNT = $count; - return $count; - } - } - } - } - - function login ($login = "", $pass = "") { - // Sends both user and pass. Returns # of msgs in mailbox or - // false on failure (or -1, if the error occurs while getting - // the number of messages.) - - if( !isset($this->FP) ) { - $this->ERROR = "POP3 login: " . _("No connection to server"); - return false; - } else { - $fp = $this->FP; - if( !$this->user( $login ) ) { - // Preserve the error generated by user() - return false; - } else { - $count = $this->pass($pass); - if( (!$count) || ($count == -1) ) { - // Preserve the error generated by last() and pass() - return false; - } else - return $count; - } - } - } - - function top ($msgNum, $numLines = "0") { - // Gets the header and first $numLines of the msg body - // returns data in an array with each returned line being - // an array element. If $numLines is empty, returns - // only the header information, and none of the body. - - if(!isset($this->FP)) { - $this->ERROR = "POP3 top: " . _("No connection to server"); - return false; - } - $this->update_timer(); - - $fp = $this->FP; - $buffer = $this->BUFFER; - $cmd = "TOP $msgNum $numLines"; - fwrite($fp, "TOP $msgNum $numLines\r\n"); - $reply = fgets($fp, $buffer); - $reply = $this->strip_clf($reply); - if($this->DEBUG) { - @error_log("POP3 SEND [$cmd] GOT [$reply]",0); - } - if(!$this->is_ok($reply)) - { - $this->ERROR = "POP3 top: " . _("Error ") . "[$reply]"; - return false; - } - - $count = 0; - $MsgArray = array(); - - $line = fgets($fp,$buffer); - while ( !preg_match('/^\.\r\n/',$line)) - { - $MsgArray[$count] = $line; - $count++; - $line = fgets($fp,$buffer); - if(empty($line)) { break; } - } - - return $MsgArray; - } - - function pop_list ($msgNum = "") { - // If called with an argument, returns that msgs' size in octets - // No argument returns an associative array of undeleted - // msg numbers and their sizes in octets - - if(!isset($this->FP)) - { - $this->ERROR = "POP3 pop_list: " . _("No connection to server"); - return false; - } - $fp = $this->FP; - $Total = $this->COUNT; - if( (!$Total) or ($Total == -1) ) - { - return false; - } - if($Total == 0) - { - return array("0","0"); - // return -1; // mailbox empty - } - - $this->update_timer(); - - if(!empty($msgNum)) - { - $cmd = "LIST $msgNum"; - fwrite($fp,"$cmd\r\n"); - $reply = fgets($fp,$this->BUFFER); - $reply = $this->strip_clf($reply); - if($this->DEBUG) { - @error_log("POP3 SEND [$cmd] GOT [$reply]",0); - } - if(!$this->is_ok($reply)) - { - $this->ERROR = "POP3 pop_list: " . _("Error ") . "[$reply]"; - return false; - } - list($junk,$num,$size) = preg_split('/\s+/',$reply); - return $size; - } - $cmd = "LIST"; - $reply = $this->send_cmd($cmd); - if(!$this->is_ok($reply)) - { - $reply = $this->strip_clf($reply); - $this->ERROR = "POP3 pop_list: " . _("Error ") . "[$reply]"; - return false; - } - $MsgArray = array(); - $MsgArray[0] = $Total; - for($msgC=1;$msgC <= $Total; $msgC++) - { - if($msgC > $Total) { break; } - $line = fgets($fp,$this->BUFFER); - $line = $this->strip_clf($line); - if(strpos($line, '.') === 0) - { - $this->ERROR = "POP3 pop_list: " . _("Premature end of list"); - return false; - } - list($thisMsg,$msgSize) = preg_split('/\s+/',$line); - settype($thisMsg,"integer"); - if($thisMsg != $msgC) - { - $MsgArray[$msgC] = "deleted"; - } - else - { - $MsgArray[$msgC] = $msgSize; - } - } - return $MsgArray; - } - - function get ($msgNum) { - // Retrieve the specified msg number. Returns an array - // where each line of the msg is an array element. - - if(!isset($this->FP)) - { - $this->ERROR = "POP3 get: " . _("No connection to server"); - return false; - } - - $this->update_timer(); - - $fp = $this->FP; - $buffer = $this->BUFFER; - $cmd = "RETR $msgNum"; - $reply = $this->send_cmd($cmd); - - if(!$this->is_ok($reply)) - { - $this->ERROR = "POP3 get: " . _("Error ") . "[$reply]"; - return false; - } - - $count = 0; - $MsgArray = array(); - - $line = fgets($fp,$buffer); - while ( !preg_match('/^\.\r\n/',$line)) - { - if ( $line{0} == '.' ) { $line = substr($line,1); } - $MsgArray[$count] = $line; - $count++; - $line = fgets($fp,$buffer); - if(empty($line)) { break; } - } - return $MsgArray; - } - - function last ( $type = "count" ) { - // Returns the highest msg number in the mailbox. - // returns -1 on error, 0+ on success, if type != count - // results in a popstat() call (2 element array returned) - - $last = -1; - if(!isset($this->FP)) - { - $this->ERROR = "POP3 last: " . _("No connection to server"); - return $last; - } - - $reply = $this->send_cmd("STAT"); - if(!$this->is_ok($reply)) - { - $this->ERROR = "POP3 last: " . _("Error ") . "[$reply]"; - return $last; - } - - $Vars = preg_split('/\s+/',$reply); - $count = $Vars[1]; - $size = $Vars[2]; - settype($count,"integer"); - settype($size,"integer"); - if($type != "count") - { - return array($count,$size); - } - return $count; - } - - function reset () { - // Resets the status of the remote server. This includes - // resetting the status of ALL msgs to not be deleted. - // This method automatically closes the connection to the server. - - if(!isset($this->FP)) - { - $this->ERROR = "POP3 reset: " . _("No connection to server"); - return false; - } - $reply = $this->send_cmd("RSET"); - if(!$this->is_ok($reply)) - { - // The POP3 RSET command -never- gives a -ERR - // response - if it ever does, something truly - // wild is going on. - - $this->ERROR = "POP3 reset: " . _("Error ") . "[$reply]"; - @error_log("POP3 reset: ERROR [$reply]",0); - } - $this->quit(); - return true; - } - - function send_cmd ( $cmd = "" ) - { - // Sends a user defined command string to the - // POP server and returns the results. Useful for - // non-compliant or custom POP servers. - // Do NOT includ the \r\n as part of your command - // string - it will be appended automatically. - - // The return value is a standard fgets() call, which - // will read up to $this->BUFFER bytes of data, until it - // encounters a new line, or EOF, whichever happens first. - - // This method works best if $cmd responds with only - // one line of data. - - if(!isset($this->FP)) - { - $this->ERROR = "POP3 send_cmd: " . _("No connection to server"); - return false; - } - - if(empty($cmd)) - { - $this->ERROR = "POP3 send_cmd: " . _("Empty command string"); - return ""; - } - - $fp = $this->FP; - $buffer = $this->BUFFER; - $this->update_timer(); - fwrite($fp,"$cmd\r\n"); - $reply = fgets($fp,$buffer); - $reply = $this->strip_clf($reply); - if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } - return $reply; - } - - function quit() { - // Closes the connection to the POP3 server, deleting - // any msgs marked as deleted. - - if(!isset($this->FP)) - { - $this->ERROR = "POP3 quit: " . _("connection does not exist"); - return false; - } - $fp = $this->FP; - $cmd = "QUIT"; - fwrite($fp,"$cmd\r\n"); - $reply = fgets($fp,$this->BUFFER); - $reply = $this->strip_clf($reply); - if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } - fclose($fp); - unset($this->FP); - return true; - } - - function popstat () { - // Returns an array of 2 elements. The number of undeleted - // msgs in the mailbox, and the size of the mbox in octets. - - $PopArray = $this->last("array"); - - if($PopArray == -1) { return false; } - - if( (!$PopArray) or (empty($PopArray)) ) - { - return false; - } - return $PopArray; - } - - function uidl ($msgNum = "") - { - // Returns the UIDL of the msg specified. If called with - // no arguments, returns an associative array where each - // undeleted msg num is a key, and the msg's uidl is the element - // Array element 0 will contain the total number of msgs - - if(!isset($this->FP)) { - $this->ERROR = "POP3 uidl: " . _("No connection to server"); - return false; - } - - $fp = $this->FP; - $buffer = $this->BUFFER; - - if(!empty($msgNum)) { - $cmd = "UIDL $msgNum"; - $reply = $this->send_cmd($cmd); - if(!$this->is_ok($reply)) - { - $this->ERROR = "POP3 uidl: " . _("Error ") . "[$reply]"; - return false; - } - list ($ok,$num,$myUidl) = preg_split('/\s+/',$reply); - return $myUidl; - } else { - $this->update_timer(); - - $UIDLArray = array(); - $Total = $this->COUNT; - $UIDLArray[0] = $Total; - - if ($Total < 1) - { - return $UIDLArray; - } - $cmd = "UIDL"; - fwrite($fp, "UIDL\r\n"); - $reply = fgets($fp, $buffer); - $reply = $this->strip_clf($reply); - if($this->DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); } - if(!$this->is_ok($reply)) - { - $this->ERROR = "POP3 uidl: " . _("Error ") . "[$reply]"; - return false; - } - - $line = ""; - $count = 1; - $line = fgets($fp,$buffer); - while ( !preg_match('/^\.\r\n/',$line)) { - list ($msg,$msgUidl) = preg_split('/\s+/',$line); - $msgUidl = $this->strip_clf($msgUidl); - if($count == $msg) { - $UIDLArray[$msg] = $msgUidl; - } - else - { - $UIDLArray[$count] = 'deleted'; - } - $count++; - $line = fgets($fp,$buffer); - } - } - return $UIDLArray; - } - - function delete ($msgNum = "") { - // Flags a specified msg as deleted. The msg will not - // be deleted until a quit() method is called. - - if(!isset($this->FP)) - { - $this->ERROR = "POP3 delete: " . _("No connection to server"); - return false; - } - if(empty($msgNum)) - { - $this->ERROR = "POP3 delete: " . _("No msg number submitted"); - return false; - } - $reply = $this->send_cmd("DELE $msgNum"); - if(!$this->is_ok($reply)) - { - $this->ERROR = "POP3 delete: " . _("Command failed ") . "[$reply]"; - return false; - } - return true; - } - - // ********************************************************* - - // The following methods are internal to the class. - - function is_ok ($cmd = "") { - // Return true or false on +OK or -ERR - - if( empty($cmd) ) - return false; - else - return( stripos($cmd, '+OK') !== false ); - } - - function strip_clf ($text = "") { - // Strips \r\n from server responses - - if(empty($text)) - return $text; - else { - $stripped = str_replace(array("\r","\n"),'',$text); - return $stripped; - } - } - - function parse_banner ( $server_text ) { - $outside = true; - $banner = ""; - $length = strlen($server_text); - for($count =0; $count < $length; $count++) - { - $digit = substr($server_text,$count,1); - if(!empty($digit)) { - if( (!$outside) && ($digit != '<') && ($digit != '>') ) - { - $banner .= $digit; - } - if ($digit == '<') - { - $outside = false; - } - if($digit == '>') - { - $outside = true; - } - } - } - $banner = $this->strip_clf($banner); // Just in case - return "<$banner>"; - } - -} // End class - -// For php4 compatibility -if (!function_exists("stripos")) { - function stripos($haystack, $needle){ - return strpos($haystack, stristr( $haystack, $needle )); - } -} diff --git a/wp/wp-includes/class-requests.php b/wp/wp-includes/class-requests.php deleted file mode 100644 index bb266189..00000000 --- a/wp/wp-includes/class-requests.php +++ /dev/null @@ -1,980 +0,0 @@ -<?php -/** - * Requests for PHP - * - * Inspired by Requests for Python. - * - * Based on concepts from SimplePie_File, RequestCore and WP_Http. - * - * @package Requests - */ - -/** - * Requests for PHP - * - * Inspired by Requests for Python. - * - * Based on concepts from SimplePie_File, RequestCore and WP_Http. - * - * @package Requests - */ -class Requests { - /** - * POST method - * - * @var string - */ - const POST = 'POST'; - - /** - * PUT method - * - * @var string - */ - const PUT = 'PUT'; - - /** - * GET method - * - * @var string - */ - const GET = 'GET'; - - /** - * HEAD method - * - * @var string - */ - const HEAD = 'HEAD'; - - /** - * DELETE method - * - * @var string - */ - const DELETE = 'DELETE'; - - /** - * OPTIONS method - * - * @var string - */ - const OPTIONS = 'OPTIONS'; - - /** - * TRACE method - * - * @var string - */ - const TRACE = 'TRACE'; - - /** - * PATCH method - * - * @link https://tools.ietf.org/html/rfc5789 - * @var string - */ - const PATCH = 'PATCH'; - - /** - * Default size of buffer size to read streams - * - * @var integer - */ - const BUFFER_SIZE = 1160; - - /** - * Current version of Requests - * - * @var string - */ - const VERSION = '1.7'; - - /** - * Registered transport classes - * - * @var array - */ - protected static $transports = array(); - - /** - * Selected transport name - * - * Use {@see get_transport()} instead - * - * @var array - */ - public static $transport = array(); - - /** - * Default certificate path. - * - * @see Requests::get_certificate_path() - * @see Requests::set_certificate_path() - * - * @var string - */ - protected static $certificate_path; - - /** - * This is a static class, do not instantiate it - * - * @codeCoverageIgnore - */ - private function __construct() {} - - /** - * Autoloader for Requests - * - * Register this with {@see register_autoloader()} if you'd like to avoid - * having to create your own. - * - * (You can also use `spl_autoload_register` directly if you'd prefer.) - * - * @codeCoverageIgnore - * - * @param string $class Class name to load - */ - public static function autoloader($class) { - // Check that the class starts with "Requests" - if (strpos($class, 'Requests') !== 0) { - return; - } - - $file = str_replace('_', '/', $class); - if (file_exists(dirname(__FILE__) . '/' . $file . '.php')) { - require_once(dirname(__FILE__) . '/' . $file . '.php'); - } - } - - /** - * Register the built-in autoloader - * - * @codeCoverageIgnore - */ - public static function register_autoloader() { - spl_autoload_register(array('Requests', 'autoloader')); - } - - /** - * Register a transport - * - * @param string $transport Transport class to add, must support the Requests_Transport interface - */ - public static function add_transport($transport) { - if (empty(self::$transports)) { - self::$transports = array( - 'Requests_Transport_cURL', - 'Requests_Transport_fsockopen', - ); - } - - self::$transports = array_merge(self::$transports, array($transport)); - } - - /** - * Get a working transport - * - * @throws Requests_Exception If no valid transport is found (`notransport`) - * @return Requests_Transport - */ - protected static function get_transport($capabilities = array()) { - // Caching code, don't bother testing coverage - // @codeCoverageIgnoreStart - // array of capabilities as a string to be used as an array key - ksort($capabilities); - $cap_string = serialize($capabilities); - - // Don't search for a transport if it's already been done for these $capabilities - if (isset(self::$transport[$cap_string]) && self::$transport[$cap_string] !== null) { - return new self::$transport[$cap_string](); - } - // @codeCoverageIgnoreEnd - - if (empty(self::$transports)) { - self::$transports = array( - 'Requests_Transport_cURL', - 'Requests_Transport_fsockopen', - ); - } - - // Find us a working transport - foreach (self::$transports as $class) { - if (!class_exists($class)) { - continue; - } - - $result = call_user_func(array($class, 'test'), $capabilities); - if ($result) { - self::$transport[$cap_string] = $class; - break; - } - } - if (self::$transport[$cap_string] === null) { - throw new Requests_Exception('No working transports found', 'notransport', self::$transports); - } - - return new self::$transport[$cap_string](); - } - - /**#@+ - * @see request() - * @param string $url - * @param array $headers - * @param array $options - * @return Requests_Response - */ - /** - * Send a GET request - */ - public static function get($url, $headers = array(), $options = array()) { - return self::request($url, $headers, null, self::GET, $options); - } - - /** - * Send a HEAD request - */ - public static function head($url, $headers = array(), $options = array()) { - return self::request($url, $headers, null, self::HEAD, $options); - } - - /** - * Send a DELETE request - */ - public static function delete($url, $headers = array(), $options = array()) { - return self::request($url, $headers, null, self::DELETE, $options); - } - - /** - * Send a TRACE request - */ - public static function trace($url, $headers = array(), $options = array()) { - return self::request($url, $headers, null, self::TRACE, $options); - } - /**#@-*/ - - /**#@+ - * @see request() - * @param string $url - * @param array $headers - * @param array $data - * @param array $options - * @return Requests_Response - */ - /** - * Send a POST request - */ - public static function post($url, $headers = array(), $data = array(), $options = array()) { - return self::request($url, $headers, $data, self::POST, $options); - } - /** - * Send a PUT request - */ - public static function put($url, $headers = array(), $data = array(), $options = array()) { - return self::request($url, $headers, $data, self::PUT, $options); - } - - /** - * Send an OPTIONS request - */ - public static function options($url, $headers = array(), $data = array(), $options = array()) { - return self::request($url, $headers, $data, self::OPTIONS, $options); - } - - /** - * Send a PATCH request - * - * Note: Unlike {@see post} and {@see put}, `$headers` is required, as the - * specification recommends that should send an ETag - * - * @link https://tools.ietf.org/html/rfc5789 - */ - public static function patch($url, $headers, $data = array(), $options = array()) { - return self::request($url, $headers, $data, self::PATCH, $options); - } - /**#@-*/ - - /** - * Main interface for HTTP requests - * - * This method initiates a request and sends it via a transport before - * parsing. - * - * The `$options` parameter takes an associative array with the following - * options: - * - * - `timeout`: How long should we wait for a response? - * Note: for cURL, a minimum of 1 second applies, as DNS resolution - * operates at second-resolution only. - * (float, seconds with a millisecond precision, default: 10, example: 0.01) - * - `connect_timeout`: How long should we wait while trying to connect? - * (float, seconds with a millisecond precision, default: 10, example: 0.01) - * - `useragent`: Useragent to send to the server - * (string, default: php-requests/$version) - * - `follow_redirects`: Should we follow 3xx redirects? - * (boolean, default: true) - * - `redirects`: How many times should we redirect before erroring? - * (integer, default: 10) - * - `blocking`: Should we block processing on this request? - * (boolean, default: true) - * - `filename`: File to stream the body to instead. - * (string|boolean, default: false) - * - `auth`: Authentication handler or array of user/password details to use - * for Basic authentication - * (Requests_Auth|array|boolean, default: false) - * - `proxy`: Proxy details to use for proxy by-passing and authentication - * (Requests_Proxy|array|string|boolean, default: false) - * - `max_bytes`: Limit for the response body size. - * (integer|boolean, default: false) - * - `idn`: Enable IDN parsing - * (boolean, default: true) - * - `transport`: Custom transport. Either a class name, or a - * transport object. Defaults to the first working transport from - * {@see getTransport()} - * (string|Requests_Transport, default: {@see getTransport()}) - * - `hooks`: Hooks handler. - * (Requests_Hooker, default: new Requests_Hooks()) - * - `verify`: Should we verify SSL certificates? Allows passing in a custom - * certificate file as a string. (Using true uses the system-wide root - * certificate store instead, but this may have different behaviour - * across transports.) - * (string|boolean, default: library/Requests/Transport/cacert.pem) - * - `verifyname`: Should we verify the common name in the SSL certificate? - * (boolean: default, true) - * - `data_format`: How should we send the `$data` parameter? - * (string, one of 'query' or 'body', default: 'query' for - * HEAD/GET/DELETE, 'body' for POST/PUT/OPTIONS/PATCH) - * - * @throws Requests_Exception On invalid URLs (`nonhttp`) - * - * @param string $url URL to request - * @param array $headers Extra headers to send with the request - * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests - * @param string $type HTTP request type (use Requests constants) - * @param array $options Options for the request (see description for more information) - * @return Requests_Response - */ - public static function request($url, $headers = array(), $data = array(), $type = self::GET, $options = array()) { - if (empty($options['type'])) { - $options['type'] = $type; - } - $options = array_merge(self::get_default_options(), $options); - - self::set_defaults($url, $headers, $data, $type, $options); - - $options['hooks']->dispatch('requests.before_request', array(&$url, &$headers, &$data, &$type, &$options)); - - if (!empty($options['transport'])) { - $transport = $options['transport']; - - if (is_string($options['transport'])) { - $transport = new $transport(); - } - } - else { - $need_ssl = (0 === stripos($url, 'https://')); - $capabilities = array('ssl' => $need_ssl); - $transport = self::get_transport($capabilities); - } - $response = $transport->request($url, $headers, $data, $options); - - $options['hooks']->dispatch('requests.before_parse', array(&$response, $url, $headers, $data, $type, $options)); - - return self::parse_response($response, $url, $headers, $data, $options); - } - - /** - * Send multiple HTTP requests simultaneously - * - * The `$requests` parameter takes an associative or indexed array of - * request fields. The key of each request can be used to match up the - * request with the returned data, or with the request passed into your - * `multiple.request.complete` callback. - * - * The request fields value is an associative array with the following keys: - * - * - `url`: Request URL Same as the `$url` parameter to - * {@see Requests::request} - * (string, required) - * - `headers`: Associative array of header fields. Same as the `$headers` - * parameter to {@see Requests::request} - * (array, default: `array()`) - * - `data`: Associative array of data fields or a string. Same as the - * `$data` parameter to {@see Requests::request} - * (array|string, default: `array()`) - * - `type`: HTTP request type (use Requests constants). Same as the `$type` - * parameter to {@see Requests::request} - * (string, default: `Requests::GET`) - * - `cookies`: Associative array of cookie name to value, or cookie jar. - * (array|Requests_Cookie_Jar) - * - * If the `$options` parameter is specified, individual requests will - * inherit options from it. This can be used to use a single hooking system, - * or set all the types to `Requests::POST`, for example. - * - * In addition, the `$options` parameter takes the following global options: - * - * - `complete`: A callback for when a request is complete. Takes two - * parameters, a Requests_Response/Requests_Exception reference, and the - * ID from the request array (Note: this can also be overridden on a - * per-request basis, although that's a little silly) - * (callback) - * - * @param array $requests Requests data (see description for more information) - * @param array $options Global and default options (see {@see Requests::request}) - * @return array Responses (either Requests_Response or a Requests_Exception object) - */ - public static function request_multiple($requests, $options = array()) { - $options = array_merge(self::get_default_options(true), $options); - - if (!empty($options['hooks'])) { - $options['hooks']->register('transport.internal.parse_response', array('Requests', 'parse_multiple')); - if (!empty($options['complete'])) { - $options['hooks']->register('multiple.request.complete', $options['complete']); - } - } - - foreach ($requests as $id => &$request) { - if (!isset($request['headers'])) { - $request['headers'] = array(); - } - if (!isset($request['data'])) { - $request['data'] = array(); - } - if (!isset($request['type'])) { - $request['type'] = self::GET; - } - if (!isset($request['options'])) { - $request['options'] = $options; - $request['options']['type'] = $request['type']; - } - else { - if (empty($request['options']['type'])) { - $request['options']['type'] = $request['type']; - } - $request['options'] = array_merge($options, $request['options']); - } - - self::set_defaults($request['url'], $request['headers'], $request['data'], $request['type'], $request['options']); - - // Ensure we only hook in once - if ($request['options']['hooks'] !== $options['hooks']) { - $request['options']['hooks']->register('transport.internal.parse_response', array('Requests', 'parse_multiple')); - if (!empty($request['options']['complete'])) { - $request['options']['hooks']->register('multiple.request.complete', $request['options']['complete']); - } - } - } - unset($request); - - if (!empty($options['transport'])) { - $transport = $options['transport']; - - if (is_string($options['transport'])) { - $transport = new $transport(); - } - } - else { - $transport = self::get_transport(); - } - $responses = $transport->request_multiple($requests, $options); - - foreach ($responses as $id => &$response) { - // If our hook got messed with somehow, ensure we end up with the - // correct response - if (is_string($response)) { - $request = $requests[$id]; - self::parse_multiple($response, $request); - $request['options']['hooks']->dispatch('multiple.request.complete', array(&$response, $id)); - } - } - - return $responses; - } - - /** - * Get the default options - * - * @see Requests::request() for values returned by this method - * @param boolean $multirequest Is this a multirequest? - * @return array Default option values - */ - protected static function get_default_options($multirequest = false) { - $defaults = array( - 'timeout' => 10, - 'connect_timeout' => 10, - 'useragent' => 'php-requests/' . self::VERSION, - 'protocol_version' => 1.1, - 'redirected' => 0, - 'redirects' => 10, - 'follow_redirects' => true, - 'blocking' => true, - 'type' => self::GET, - 'filename' => false, - 'auth' => false, - 'proxy' => false, - 'cookies' => false, - 'max_bytes' => false, - 'idn' => true, - 'hooks' => null, - 'transport' => null, - 'verify' => Requests::get_certificate_path(), - 'verifyname' => true, - ); - if ($multirequest !== false) { - $defaults['complete'] = null; - } - return $defaults; - } - - /** - * Get default certificate path. - * - * @return string Default certificate path. - */ - public static function get_certificate_path() { - if ( ! empty( Requests::$certificate_path ) ) { - return Requests::$certificate_path; - } - - return dirname(__FILE__) . '/Requests/Transport/cacert.pem'; - } - - /** - * Set default certificate path. - * - * @param string $path Certificate path, pointing to a PEM file. - */ - public static function set_certificate_path( $path ) { - Requests::$certificate_path = $path; - } - - /** - * Set the default values - * - * @param string $url URL to request - * @param array $headers Extra headers to send with the request - * @param array|null $data Data to send either as a query string for GET/HEAD requests, or in the body for POST requests - * @param string $type HTTP request type - * @param array $options Options for the request - * @return array $options - */ - protected static function set_defaults(&$url, &$headers, &$data, &$type, &$options) { - if (!preg_match('/^http(s)?:\/\//i', $url, $matches)) { - throw new Requests_Exception('Only HTTP(S) requests are handled.', 'nonhttp', $url); - } - - if (empty($options['hooks'])) { - $options['hooks'] = new Requests_Hooks(); - } - - if (is_array($options['auth'])) { - $options['auth'] = new Requests_Auth_Basic($options['auth']); - } - if ($options['auth'] !== false) { - $options['auth']->register($options['hooks']); - } - - if (is_string($options['proxy']) || is_array($options['proxy'])) { - $options['proxy'] = new Requests_Proxy_HTTP($options['proxy']); - } - if ($options['proxy'] !== false) { - $options['proxy']->register($options['hooks']); - } - - if (is_array($options['cookies'])) { - $options['cookies'] = new Requests_Cookie_Jar($options['cookies']); - } - elseif (empty($options['cookies'])) { - $options['cookies'] = new Requests_Cookie_Jar(); - } - if ($options['cookies'] !== false) { - $options['cookies']->register($options['hooks']); - } - - if ($options['idn'] !== false) { - $iri = new Requests_IRI($url); - $iri->host = Requests_IDNAEncoder::encode($iri->ihost); - $url = $iri->uri; - } - - // Massage the type to ensure we support it. - $type = strtoupper($type); - - if (!isset($options['data_format'])) { - if (in_array($type, array(self::HEAD, self::GET, self::DELETE))) { - $options['data_format'] = 'query'; - } - else { - $options['data_format'] = 'body'; - } - } - } - - /** - * HTTP response parser - * - * @throws Requests_Exception On missing head/body separator (`requests.no_crlf_separator`) - * @throws Requests_Exception On missing head/body separator (`noversion`) - * @throws Requests_Exception On missing head/body separator (`toomanyredirects`) - * - * @param string $headers Full response text including headers and body - * @param string $url Original request URL - * @param array $req_headers Original $headers array passed to {@link request()}, in case we need to follow redirects - * @param array $req_data Original $data array passed to {@link request()}, in case we need to follow redirects - * @param array $options Original $options array passed to {@link request()}, in case we need to follow redirects - * @return Requests_Response - */ - protected static function parse_response($headers, $url, $req_headers, $req_data, $options) { - $return = new Requests_Response(); - if (!$options['blocking']) { - return $return; - } - - $return->raw = $headers; - $return->url = $url; - - if (!$options['filename']) { - if (($pos = strpos($headers, "\r\n\r\n")) === false) { - // Crap! - throw new Requests_Exception('Missing header/body separator', 'requests.no_crlf_separator'); - } - - $headers = substr($return->raw, 0, $pos); - $return->body = substr($return->raw, $pos + strlen("\n\r\n\r")); - } - else { - $return->body = ''; - } - // Pretend CRLF = LF for compatibility (RFC 2616, section 19.3) - $headers = str_replace("\r\n", "\n", $headers); - // Unfold headers (replace [CRLF] 1*( SP | HT ) with SP) as per RFC 2616 (section 2.2) - $headers = preg_replace('/\n[ \t]/', ' ', $headers); - $headers = explode("\n", $headers); - preg_match('#^HTTP/(1\.\d)[ \t]+(\d+)#i', array_shift($headers), $matches); - if (empty($matches)) { - throw new Requests_Exception('Response could not be parsed', 'noversion', $headers); - } - $return->protocol_version = (float) $matches[1]; - $return->status_code = (int) $matches[2]; - if ($return->status_code >= 200 && $return->status_code < 300) { - $return->success = true; - } - - foreach ($headers as $header) { - list($key, $value) = explode(':', $header, 2); - $value = trim($value); - preg_replace('#(\s+)#i', ' ', $value); - $return->headers[$key] = $value; - } - if (isset($return->headers['transfer-encoding'])) { - $return->body = self::decode_chunked($return->body); - unset($return->headers['transfer-encoding']); - } - if (isset($return->headers['content-encoding'])) { - $return->body = self::decompress($return->body); - } - - //fsockopen and cURL compatibility - if (isset($return->headers['connection'])) { - unset($return->headers['connection']); - } - - $options['hooks']->dispatch('requests.before_redirect_check', array(&$return, $req_headers, $req_data, $options)); - - if ($return->is_redirect() && $options['follow_redirects'] === true) { - if (isset($return->headers['location']) && $options['redirected'] < $options['redirects']) { - if ($return->status_code === 303) { - $options['type'] = self::GET; - } - $options['redirected']++; - $location = $return->headers['location']; - if (strpos($location, 'http://') !== 0 && strpos($location, 'https://') !== 0) { - // relative redirect, for compatibility make it absolute - $location = Requests_IRI::absolutize($url, $location); - $location = $location->uri; - } - - $hook_args = array( - &$location, - &$req_headers, - &$req_data, - &$options, - $return - ); - $options['hooks']->dispatch('requests.before_redirect', $hook_args); - $redirected = self::request($location, $req_headers, $req_data, $options['type'], $options); - $redirected->history[] = $return; - return $redirected; - } - elseif ($options['redirected'] >= $options['redirects']) { - throw new Requests_Exception('Too many redirects', 'toomanyredirects', $return); - } - } - - $return->redirects = $options['redirected']; - - $options['hooks']->dispatch('requests.after_request', array(&$return, $req_headers, $req_data, $options)); - return $return; - } - - /** - * Callback for `transport.internal.parse_response` - * - * Internal use only. Converts a raw HTTP response to a Requests_Response - * while still executing a multiple request. - * - * @param string $response Full response text including headers and body (will be overwritten with Response instance) - * @param array $request Request data as passed into {@see Requests::request_multiple()} - * @return null `$response` is either set to a Requests_Response instance, or a Requests_Exception object - */ - public static function parse_multiple(&$response, $request) { - try { - $url = $request['url']; - $headers = $request['headers']; - $data = $request['data']; - $options = $request['options']; - $response = self::parse_response($response, $url, $headers, $data, $options); - } - catch (Requests_Exception $e) { - $response = $e; - } - } - - /** - * Decoded a chunked body as per RFC 2616 - * - * @see https://tools.ietf.org/html/rfc2616#section-3.6.1 - * @param string $data Chunked body - * @return string Decoded body - */ - protected static function decode_chunked($data) { - if (!preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', trim($data))) { - return $data; - } - - - - $decoded = ''; - $encoded = $data; - - while (true) { - $is_chunked = (bool) preg_match('/^([0-9a-f]+)(?:;(?:[\w-]*)(?:=(?:(?:[\w-]*)*|"(?:[^\r\n])*"))?)*\r\n/i', $encoded, $matches); - if (!$is_chunked) { - // Looks like it's not chunked after all - return $data; - } - - $length = hexdec(trim($matches[1])); - if ($length === 0) { - // Ignore trailer headers - return $decoded; - } - - $chunk_length = strlen($matches[0]); - $decoded .= substr($encoded, $chunk_length, $length); - $encoded = substr($encoded, $chunk_length + $length + 2); - - if (trim($encoded) === '0' || empty($encoded)) { - return $decoded; - } - } - - // We'll never actually get down here - // @codeCoverageIgnoreStart - } - // @codeCoverageIgnoreEnd - - /** - * Convert a key => value array to a 'key: value' array for headers - * - * @param array $array Dictionary of header values - * @return array List of headers - */ - public static function flatten($array) { - $return = array(); - foreach ($array as $key => $value) { - $return[] = sprintf('%s: %s', $key, $value); - } - return $return; - } - - /** - * Convert a key => value array to a 'key: value' array for headers - * - * @codeCoverageIgnore - * @deprecated Misspelling of {@see Requests::flatten} - * @param array $array Dictionary of header values - * @return array List of headers - */ - public static function flattern($array) { - return self::flatten($array); - } - - /** - * Decompress an encoded body - * - * Implements gzip, compress and deflate. Guesses which it is by attempting - * to decode. - * - * @param string $data Compressed data in one of the above formats - * @return string Decompressed string - */ - public static function decompress($data) { - if (substr($data, 0, 2) !== "\x1f\x8b" && substr($data, 0, 2) !== "\x78\x9c") { - // Not actually compressed. Probably cURL ruining this for us. - return $data; - } - - if (function_exists('gzdecode') && ($decoded = @gzdecode($data)) !== false) { - return $decoded; - } - elseif (function_exists('gzinflate') && ($decoded = @gzinflate($data)) !== false) { - return $decoded; - } - elseif (($decoded = self::compatible_gzinflate($data)) !== false) { - return $decoded; - } - elseif (function_exists('gzuncompress') && ($decoded = @gzuncompress($data)) !== false) { - return $decoded; - } - - return $data; - } - - /** - * Decompression of deflated string while staying compatible with the majority of servers. - * - * Certain Servers will return deflated data with headers which PHP's gzinflate() - * function cannot handle out of the box. The following function has been created from - * various snippets on the gzinflate() PHP documentation. - * - * Warning: Magic numbers within. Due to the potential different formats that the compressed - * data may be returned in, some "magic offsets" are needed to ensure proper decompression - * takes place. For a simple progmatic way to determine the magic offset in use, see: - * https://core.trac.wordpress.org/ticket/18273 - * - * @since 2.8.1 - * @link https://core.trac.wordpress.org/ticket/18273 - * @link https://secure.php.net/manual/en/function.gzinflate.php#70875 - * @link https://secure.php.net/manual/en/function.gzinflate.php#77336 - * - * @param string $gzData String to decompress. - * @return string|bool False on failure. - */ - public static function compatible_gzinflate($gzData) { - // Compressed data might contain a full zlib header, if so strip it for - // gzinflate() - if (substr($gzData, 0, 3) == "\x1f\x8b\x08") { - $i = 10; - $flg = ord(substr($gzData, 3, 1)); - if ($flg > 0) { - if ($flg & 4) { - list($xlen) = unpack('v', substr($gzData, $i, 2)); - $i = $i + 2 + $xlen; - } - if ($flg & 8) { - $i = strpos($gzData, "\0", $i) + 1; - } - if ($flg & 16) { - $i = strpos($gzData, "\0", $i) + 1; - } - if ($flg & 2) { - $i = $i + 2; - } - } - $decompressed = self::compatible_gzinflate(substr($gzData, $i)); - if (false !== $decompressed) { - return $decompressed; - } - } - - // If the data is Huffman Encoded, we must first strip the leading 2 - // byte Huffman marker for gzinflate() - // The response is Huffman coded by many compressors such as - // java.util.zip.Deflater, Ruby’s Zlib::Deflate, and .NET's - // System.IO.Compression.DeflateStream. - // - // See https://decompres.blogspot.com/ for a quick explanation of this - // data type - $huffman_encoded = false; - - // low nibble of first byte should be 0x08 - list(, $first_nibble) = unpack('h', $gzData); - - // First 2 bytes should be divisible by 0x1F - list(, $first_two_bytes) = unpack('n', $gzData); - - if (0x08 == $first_nibble && 0 == ($first_two_bytes % 0x1F)) { - $huffman_encoded = true; - } - - if ($huffman_encoded) { - if (false !== ($decompressed = @gzinflate(substr($gzData, 2)))) { - return $decompressed; - } - } - - if ("\x50\x4b\x03\x04" == substr($gzData, 0, 4)) { - // ZIP file format header - // Offset 6: 2 bytes, General-purpose field - // Offset 26: 2 bytes, filename length - // Offset 28: 2 bytes, optional field length - // Offset 30: Filename field, followed by optional field, followed - // immediately by data - list(, $general_purpose_flag) = unpack('v', substr($gzData, 6, 2)); - - // If the file has been compressed on the fly, 0x08 bit is set of - // the general purpose field. We can use this to differentiate - // between a compressed document, and a ZIP file - $zip_compressed_on_the_fly = (0x08 == (0x08 & $general_purpose_flag)); - - if (!$zip_compressed_on_the_fly) { - // Don't attempt to decode a compressed zip file - return $gzData; - } - - // Determine the first byte of data, based on the above ZIP header - // offsets: - $first_file_start = array_sum(unpack('v2', substr($gzData, 26, 4))); - if (false !== ($decompressed = @gzinflate(substr($gzData, 30 + $first_file_start)))) { - return $decompressed; - } - return false; - } - - // Finally fall back to straight gzinflate - if (false !== ($decompressed = @gzinflate($gzData))) { - return $decompressed; - } - - // Fallback for all above failing, not expected, but included for - // debugging and preventing regressions and to track stats - if (false !== ($decompressed = @gzinflate(substr($gzData, 2)))) { - return $decompressed; - } - - return false; - } - - public static function match_domain($host, $reference) { - // Check for a direct match - if ($host === $reference) { - return true; - } - - // Calculate the valid wildcard match if the host is not an IP address - // Also validates that the host has 3 parts or more, as per Firefox's - // ruleset. - $parts = explode('.', $host); - if (ip2long($host) === false && count($parts) >= 3) { - $parts[0] = '*'; - $wildcard = implode('.', $parts); - if ($wildcard === $reference) { - return true; - } - } - - return false; - } -} diff --git a/wp/wp-includes/class-simplepie.php b/wp/wp-includes/class-simplepie.php deleted file mode 100644 index 61104137..00000000 --- a/wp/wp-includes/class-simplepie.php +++ /dev/null @@ -1,3094 +0,0 @@ -<?php -if ( ! class_exists( 'SimplePie', false ) ) : - -// Load classes we will need. -require ABSPATH . WPINC . '/SimplePie/Misc.php'; -require ABSPATH . WPINC . '/SimplePie/Cache.php'; -require ABSPATH . WPINC . '/SimplePie/File.php'; -require ABSPATH . WPINC . '/SimplePie/Sanitize.php'; -require ABSPATH . WPINC . '/SimplePie/Registry.php'; -require ABSPATH . WPINC . '/SimplePie/IRI.php'; -require ABSPATH . WPINC . '/SimplePie/Locator.php'; -require ABSPATH . WPINC . '/SimplePie/Content/Type/Sniffer.php'; -require ABSPATH . WPINC . '/SimplePie/XML/Declaration/Parser.php'; -require ABSPATH . WPINC . '/SimplePie/Parser.php'; -require ABSPATH . WPINC . '/SimplePie/Item.php'; -require ABSPATH . WPINC . '/SimplePie/Parse/Date.php'; -require ABSPATH . WPINC . '/SimplePie/Author.php'; - -/** - * WordPress autoloader for SimplePie. - * - * @since 3.5.0 - */ -function wp_simplepie_autoload( $class ) { - if ( 0 !== strpos( $class, 'SimplePie_' ) ) - return; - - $file = ABSPATH . WPINC . '/' . str_replace( '_', '/', $class ) . '.php'; - include( $file ); -} - -/** - * We autoload classes we may not need. - */ -spl_autoload_register( 'wp_simplepie_autoload' ); - -/** - * SimplePie - * - * A PHP-Based RSS and Atom Feed Framework. - * Takes the hard work out of managing a complete RSS/Atom solution. - * - * Copyright (c) 2004-2012, Ryan Parman, Geoffrey Sneddon, Ryan McCue, and contributors - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * * Neither the name of the SimplePie Team nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS - * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS - * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * @package SimplePie - * @version 1.3.1 - * @copyright 2004-2012 Ryan Parman, Geoffrey Sneddon, Ryan McCue - * @author Ryan Parman - * @author Geoffrey Sneddon - * @author Ryan McCue - * @link http://simplepie.org/ SimplePie - * @license http://www.opensource.org/licenses/bsd-license.php BSD License - */ - -/** - * SimplePie Name - */ -define('SIMPLEPIE_NAME', 'SimplePie'); - -/** - * SimplePie Version - */ -define('SIMPLEPIE_VERSION', '1.3.1'); - -/** - * SimplePie Build - * @todo Hardcode for release (there's no need to have to call SimplePie_Misc::get_build() only every load of simplepie.inc) - */ -define('SIMPLEPIE_BUILD', gmdate('YmdHis', SimplePie_Misc::get_build())); - -/** - * SimplePie Website URL - */ -define('SIMPLEPIE_URL', 'http://simplepie.org'); - -/** - * SimplePie Useragent - * @see SimplePie::set_useragent() - */ -define('SIMPLEPIE_USERAGENT', SIMPLEPIE_NAME . '/' . SIMPLEPIE_VERSION . ' (Feed Parser; ' . SIMPLEPIE_URL . '; Allow like Gecko) Build/' . SIMPLEPIE_BUILD); - -/** - * SimplePie Linkback - */ -define('SIMPLEPIE_LINKBACK', '<a href="' . SIMPLEPIE_URL . '" title="' . SIMPLEPIE_NAME . ' ' . SIMPLEPIE_VERSION . '">' . SIMPLEPIE_NAME . '</a>'); - -/** - * No Autodiscovery - * @see SimplePie::set_autodiscovery_level() - */ -define('SIMPLEPIE_LOCATOR_NONE', 0); - -/** - * Feed Link Element Autodiscovery - * @see SimplePie::set_autodiscovery_level() - */ -define('SIMPLEPIE_LOCATOR_AUTODISCOVERY', 1); - -/** - * Local Feed Extension Autodiscovery - * @see SimplePie::set_autodiscovery_level() - */ -define('SIMPLEPIE_LOCATOR_LOCAL_EXTENSION', 2); - -/** - * Local Feed Body Autodiscovery - * @see SimplePie::set_autodiscovery_level() - */ -define('SIMPLEPIE_LOCATOR_LOCAL_BODY', 4); - -/** - * Remote Feed Extension Autodiscovery - * @see SimplePie::set_autodiscovery_level() - */ -define('SIMPLEPIE_LOCATOR_REMOTE_EXTENSION', 8); - -/** - * Remote Feed Body Autodiscovery - * @see SimplePie::set_autodiscovery_level() - */ -define('SIMPLEPIE_LOCATOR_REMOTE_BODY', 16); - -/** - * All Feed Autodiscovery - * @see SimplePie::set_autodiscovery_level() - */ -define('SIMPLEPIE_LOCATOR_ALL', 31); - -/** - * No known feed type - */ -define('SIMPLEPIE_TYPE_NONE', 0); - -/** - * RSS 0.90 - */ -define('SIMPLEPIE_TYPE_RSS_090', 1); - -/** - * RSS 0.91 (Netscape) - */ -define('SIMPLEPIE_TYPE_RSS_091_NETSCAPE', 2); - -/** - * RSS 0.91 (Userland) - */ -define('SIMPLEPIE_TYPE_RSS_091_USERLAND', 4); - -/** - * RSS 0.91 (both Netscape and Userland) - */ -define('SIMPLEPIE_TYPE_RSS_091', 6); - -/** - * RSS 0.92 - */ -define('SIMPLEPIE_TYPE_RSS_092', 8); - -/** - * RSS 0.93 - */ -define('SIMPLEPIE_TYPE_RSS_093', 16); - -/** - * RSS 0.94 - */ -define('SIMPLEPIE_TYPE_RSS_094', 32); - -/** - * RSS 1.0 - */ -define('SIMPLEPIE_TYPE_RSS_10', 64); - -/** - * RSS 2.0 - */ -define('SIMPLEPIE_TYPE_RSS_20', 128); - -/** - * RDF-based RSS - */ -define('SIMPLEPIE_TYPE_RSS_RDF', 65); - -/** - * Non-RDF-based RSS (truly intended as syndication format) - */ -define('SIMPLEPIE_TYPE_RSS_SYNDICATION', 190); - -/** - * All RSS - */ -define('SIMPLEPIE_TYPE_RSS_ALL', 255); - -/** - * Atom 0.3 - */ -define('SIMPLEPIE_TYPE_ATOM_03', 256); - -/** - * Atom 1.0 - */ -define('SIMPLEPIE_TYPE_ATOM_10', 512); - -/** - * All Atom - */ -define('SIMPLEPIE_TYPE_ATOM_ALL', 768); - -/** - * All feed types - */ -define('SIMPLEPIE_TYPE_ALL', 1023); - -/** - * No construct - */ -define('SIMPLEPIE_CONSTRUCT_NONE', 0); - -/** - * Text construct - */ -define('SIMPLEPIE_CONSTRUCT_TEXT', 1); - -/** - * HTML construct - */ -define('SIMPLEPIE_CONSTRUCT_HTML', 2); - -/** - * XHTML construct - */ -define('SIMPLEPIE_CONSTRUCT_XHTML', 4); - -/** - * base64-encoded construct - */ -define('SIMPLEPIE_CONSTRUCT_BASE64', 8); - -/** - * IRI construct - */ -define('SIMPLEPIE_CONSTRUCT_IRI', 16); - -/** - * A construct that might be HTML - */ -define('SIMPLEPIE_CONSTRUCT_MAYBE_HTML', 32); - -/** - * All constructs - */ -define('SIMPLEPIE_CONSTRUCT_ALL', 63); - -/** - * Don't change case - */ -define('SIMPLEPIE_SAME_CASE', 1); - -/** - * Change to lowercase - */ -define('SIMPLEPIE_LOWERCASE', 2); - -/** - * Change to uppercase - */ -define('SIMPLEPIE_UPPERCASE', 4); - -/** - * PCRE for HTML attributes - */ -define('SIMPLEPIE_PCRE_HTML_ATTRIBUTE', '((?:[\x09\x0A\x0B\x0C\x0D\x20]+[^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3D\x3E]*(?:[\x09\x0A\x0B\x0C\x0D\x20]*=[\x09\x0A\x0B\x0C\x0D\x20]*(?:"(?:[^"]*)"|\'(?:[^\']*)\'|(?:[^\x09\x0A\x0B\x0C\x0D\x20\x22\x27\x3E][^\x09\x0A\x0B\x0C\x0D\x20\x3E]*)?))?)*)[\x09\x0A\x0B\x0C\x0D\x20]*'); - -/** - * PCRE for XML attributes - */ -define('SIMPLEPIE_PCRE_XML_ATTRIBUTE', '((?:\s+(?:(?:[^\s:]+:)?[^\s:]+)\s*=\s*(?:"(?:[^"]*)"|\'(?:[^\']*)\'))*)\s*'); - -/** - * XML Namespace - */ -define('SIMPLEPIE_NAMESPACE_XML', 'http://www.w3.org/XML/1998/namespace'); - -/** - * Atom 1.0 Namespace - */ -define('SIMPLEPIE_NAMESPACE_ATOM_10', 'http://www.w3.org/2005/Atom'); - -/** - * Atom 0.3 Namespace - */ -define('SIMPLEPIE_NAMESPACE_ATOM_03', 'http://purl.org/atom/ns#'); - -/** - * RDF Namespace - */ -define('SIMPLEPIE_NAMESPACE_RDF', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'); - -/** - * RSS 0.90 Namespace - */ -define('SIMPLEPIE_NAMESPACE_RSS_090', 'http://my.netscape.com/rdf/simple/0.9/'); - -/** - * RSS 1.0 Namespace - */ -define('SIMPLEPIE_NAMESPACE_RSS_10', 'http://purl.org/rss/1.0/'); - -/** - * RSS 1.0 Content Module Namespace - */ -define('SIMPLEPIE_NAMESPACE_RSS_10_MODULES_CONTENT', 'http://purl.org/rss/1.0/modules/content/'); - -/** - * RSS 2.0 Namespace - * (Stupid, I know, but I'm certain it will confuse people less with support.) - */ -define('SIMPLEPIE_NAMESPACE_RSS_20', ''); - -/** - * DC 1.0 Namespace - */ -define('SIMPLEPIE_NAMESPACE_DC_10', 'http://purl.org/dc/elements/1.0/'); - -/** - * DC 1.1 Namespace - */ -define('SIMPLEPIE_NAMESPACE_DC_11', 'http://purl.org/dc/elements/1.1/'); - -/** - * W3C Basic Geo (WGS84 lat/long) Vocabulary Namespace - */ -define('SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO', 'http://www.w3.org/2003/01/geo/wgs84_pos#'); - -/** - * GeoRSS Namespace - */ -define('SIMPLEPIE_NAMESPACE_GEORSS', 'http://www.georss.org/georss'); - -/** - * Media RSS Namespace - */ -define('SIMPLEPIE_NAMESPACE_MEDIARSS', 'http://search.yahoo.com/mrss/'); - -/** - * Wrong Media RSS Namespace. Caused by a long-standing typo in the spec. - */ -define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG', 'http://search.yahoo.com/mrss'); - -/** - * Wrong Media RSS Namespace #2. New namespace introduced in Media RSS 1.5. - */ -define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG2', 'http://video.search.yahoo.com/mrss'); - -/** - * Wrong Media RSS Namespace #3. A possible typo of the Media RSS 1.5 namespace. - */ -define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG3', 'http://video.search.yahoo.com/mrss/'); - -/** - * Wrong Media RSS Namespace #4. New spec location after the RSS Advisory Board takes it over, but not a valid namespace. - */ -define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG4', 'http://www.rssboard.org/media-rss'); - -/** - * Wrong Media RSS Namespace #5. A possible typo of the RSS Advisory Board URL. - */ -define('SIMPLEPIE_NAMESPACE_MEDIARSS_WRONG5', 'http://www.rssboard.org/media-rss/'); - -/** - * iTunes RSS Namespace - */ -define('SIMPLEPIE_NAMESPACE_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd'); - -/** - * XHTML Namespace - */ -define('SIMPLEPIE_NAMESPACE_XHTML', 'http://www.w3.org/1999/xhtml'); - -/** - * IANA Link Relations Registry - */ -define('SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY', 'http://www.iana.org/assignments/relation/'); - -/** - * No file source - */ -define('SIMPLEPIE_FILE_SOURCE_NONE', 0); - -/** - * Remote file source - */ -define('SIMPLEPIE_FILE_SOURCE_REMOTE', 1); - -/** - * Local file source - */ -define('SIMPLEPIE_FILE_SOURCE_LOCAL', 2); - -/** - * fsockopen() file source - */ -define('SIMPLEPIE_FILE_SOURCE_FSOCKOPEN', 4); - -/** - * cURL file source - */ -define('SIMPLEPIE_FILE_SOURCE_CURL', 8); - -/** - * file_get_contents() file source - */ -define('SIMPLEPIE_FILE_SOURCE_FILE_GET_CONTENTS', 16); - - - -/** - * SimplePie - * - * @package SimplePie - * @subpackage API - */ -class SimplePie -{ - /** - * @var array Raw data - * @access private - */ - public $data = array(); - - /** - * @var mixed Error string - * @access private - */ - public $error; - - /** - * @var object Instance of SimplePie_Sanitize (or other class) - * @see SimplePie::set_sanitize_class() - * @access private - */ - public $sanitize; - - /** - * @var string SimplePie Useragent - * @see SimplePie::set_useragent() - * @access private - */ - public $useragent = SIMPLEPIE_USERAGENT; - - /** - * @var string Feed URL - * @see SimplePie::set_feed_url() - * @access private - */ - public $feed_url; - - /** - * @var object Instance of SimplePie_File to use as a feed - * @see SimplePie::set_file() - * @access private - */ - public $file; - - /** - * @var string Raw feed data - * @see SimplePie::set_raw_data() - * @access private - */ - public $raw_data; - - /** - * @var int Timeout for fetching remote files - * @see SimplePie::set_timeout() - * @access private - */ - public $timeout = 10; - - /** - * @var bool Forces fsockopen() to be used for remote files instead - * of cURL, even if a new enough version is installed - * @see SimplePie::force_fsockopen() - * @access private - */ - public $force_fsockopen = false; - - /** - * @var bool Force the given data/URL to be treated as a feed no matter what - * it appears like - * @see SimplePie::force_feed() - * @access private - */ - public $force_feed = false; - - /** - * @var bool Enable/Disable Caching - * @see SimplePie::enable_cache() - * @access private - */ - public $cache = true; - - /** - * @var int Cache duration (in seconds) - * @see SimplePie::set_cache_duration() - * @access private - */ - public $cache_duration = 3600; - - /** - * @var int Auto-discovery cache duration (in seconds) - * @see SimplePie::set_autodiscovery_cache_duration() - * @access private - */ - public $autodiscovery_cache_duration = 604800; // 7 Days. - - /** - * @var string Cache location (relative to executing script) - * @see SimplePie::set_cache_location() - * @access private - */ - public $cache_location = './cache'; - - /** - * @var string Function that creates the cache filename - * @see SimplePie::set_cache_name_function() - * @access private - */ - public $cache_name_function = 'md5'; - - /** - * @var bool Reorder feed by date descending - * @see SimplePie::enable_order_by_date() - * @access private - */ - public $order_by_date = true; - - /** - * @var mixed Force input encoding to be set to the follow value - * (false, or anything type-cast to false, disables this feature) - * @see SimplePie::set_input_encoding() - * @access private - */ - public $input_encoding = false; - - /** - * @var int Feed Autodiscovery Level - * @see SimplePie::set_autodiscovery_level() - * @access private - */ - public $autodiscovery = SIMPLEPIE_LOCATOR_ALL; - - /** - * Class registry object - * - * @var SimplePie_Registry - */ - public $registry; - - /** - * @var int Maximum number of feeds to check with autodiscovery - * @see SimplePie::set_max_checked_feeds() - * @access private - */ - public $max_checked_feeds = 10; - - /** - * @var array All the feeds found during the autodiscovery process - * @see SimplePie::get_all_discovered_feeds() - * @access private - */ - public $all_discovered_feeds = array(); - - /** - * @var string Web-accessible path to the handler_image.php file. - * @see SimplePie::set_image_handler() - * @access private - */ - public $image_handler = ''; - - /** - * @var array Stores the URLs when multiple feeds are being initialized. - * @see SimplePie::set_feed_url() - * @access private - */ - public $multifeed_url = array(); - - /** - * @var array Stores SimplePie objects when multiple feeds initialized. - * @access private - */ - public $multifeed_objects = array(); - - /** - * @var array Stores the get_object_vars() array for use with multifeeds. - * @see SimplePie::set_feed_url() - * @access private - */ - public $config_settings = null; - - /** - * @var integer Stores the number of items to return per-feed with multifeeds. - * @see SimplePie::set_item_limit() - * @access private - */ - public $item_limit = 0; - - /** - * @var array Stores the default attributes to be stripped by strip_attributes(). - * @see SimplePie::strip_attributes() - * @access private - */ - public $strip_attributes = array('bgsound', 'class', 'expr', 'id', 'style', 'onclick', 'onerror', 'onfinish', 'onmouseover', 'onmouseout', 'onfocus', 'onblur', 'lowsrc', 'dynsrc'); - - /** - * @var array Stores the default tags to be stripped by strip_htmltags(). - * @see SimplePie::strip_htmltags() - * @access private - */ - public $strip_htmltags = array('base', 'blink', 'body', 'doctype', 'embed', 'font', 'form', 'frame', 'frameset', 'html', 'iframe', 'input', 'marquee', 'meta', 'noscript', 'object', 'param', 'script', 'style'); - - /** - * The SimplePie class contains feed level data and options - * - * To use SimplePie, create the SimplePie object with no parameters. You can - * then set configuration options using the provided methods. After setting - * them, you must initialise the feed using $feed->init(). At that point the - * object's methods and properties will be available to you. - * - * Previously, it was possible to pass in the feed URL along with cache - * options directly into the constructor. This has been removed as of 1.3 as - * it caused a lot of confusion. - * - * @since 1.0 Preview Release - */ - public function __construct() - { - if (version_compare(PHP_VERSION, '5.2', '<')) - { - trigger_error('PHP 4.x, 5.0 and 5.1 are no longer supported. Please upgrade to PHP 5.2 or newer.'); - die(); - } - - // Other objects, instances created here so we can set options on them - $this->sanitize = new SimplePie_Sanitize(); - $this->registry = new SimplePie_Registry(); - - if (func_num_args() > 0) - { - $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; - trigger_error('Passing parameters to the constructor is no longer supported. Please use set_feed_url(), set_cache_location(), and set_cache_location() directly.', $level); - - $args = func_get_args(); - switch (count($args)) { - case 3: - $this->set_cache_duration($args[2]); - case 2: - $this->set_cache_location($args[1]); - case 1: - $this->set_feed_url($args[0]); - $this->init(); - } - } - } - - /** - * Used for converting object to a string - */ - public function __toString() - { - return md5(serialize($this->data)); - } - - /** - * Remove items that link back to this before destroying this object - */ - public function __destruct() - { - if ((version_compare(PHP_VERSION, '5.3', '<') || !gc_enabled()) && !ini_get('zend.ze1_compatibility_mode')) - { - if (!empty($this->data['items'])) - { - foreach ($this->data['items'] as $item) - { - $item->__destruct(); - } - unset($item, $this->data['items']); - } - if (!empty($this->data['ordered_items'])) - { - foreach ($this->data['ordered_items'] as $item) - { - $item->__destruct(); - } - unset($item, $this->data['ordered_items']); - } - } - } - - /** - * Force the given data/URL to be treated as a feed - * - * This tells SimplePie to ignore the content-type provided by the server. - * Be careful when using this option, as it will also disable autodiscovery. - * - * @since 1.1 - * @param bool $enable Force the given data/URL to be treated as a feed - */ - public function force_feed($enable = false) - { - $this->force_feed = (bool) $enable; - } - - /** - * Set the URL of the feed you want to parse - * - * This allows you to enter the URL of the feed you want to parse, or the - * website you want to try to use auto-discovery on. This takes priority - * over any set raw data. - * - * You can set multiple feeds to mash together by passing an array instead - * of a string for the $url. Remember that with each additional feed comes - * additional processing and resources. - * - * @since 1.0 Preview Release - * @see set_raw_data() - * @param string|array $url This is the URL (or array of URLs) that you want to parse. - */ - public function set_feed_url($url) - { - $this->multifeed_url = array(); - if (is_array($url)) - { - foreach ($url as $value) - { - $this->multifeed_url[] = $this->registry->call('Misc', 'fix_protocol', array($value, 1)); - } - } - else - { - $this->feed_url = $this->registry->call('Misc', 'fix_protocol', array($url, 1)); - } - } - - /** - * Set an instance of {@see SimplePie_File} to use as a feed - * - * @param SimplePie_File &$file - * @return bool True on success, false on failure - */ - public function set_file(&$file) - { - if ($file instanceof SimplePie_File) - { - $this->feed_url = $file->url; - $this->file =& $file; - return true; - } - return false; - } - - /** - * Set the raw XML data to parse - * - * Allows you to use a string of RSS/Atom data instead of a remote feed. - * - * If you have a feed available as a string in PHP, you can tell SimplePie - * to parse that data string instead of a remote feed. Any set feed URL - * takes precedence. - * - * @since 1.0 Beta 3 - * @param string $data RSS or Atom data as a string. - * @see set_feed_url() - */ - public function set_raw_data($data) - { - $this->raw_data = $data; - } - - /** - * Set the the default timeout for fetching remote feeds - * - * This allows you to change the maximum time the feed's server to respond - * and send the feed back. - * - * @since 1.0 Beta 3 - * @param int $timeout The maximum number of seconds to spend waiting to retrieve a feed. - */ - public function set_timeout($timeout = 10) - { - $this->timeout = (int) $timeout; - } - - /** - * Force SimplePie to use fsockopen() instead of cURL - * - * @since 1.0 Beta 3 - * @param bool $enable Force fsockopen() to be used - */ - public function force_fsockopen($enable = false) - { - $this->force_fsockopen = (bool) $enable; - } - - /** - * Enable/disable caching in SimplePie. - * - * This option allows you to disable caching all-together in SimplePie. - * However, disabling the cache can lead to longer load times. - * - * @since 1.0 Preview Release - * @param bool $enable Enable caching - */ - public function enable_cache($enable = true) - { - $this->cache = (bool) $enable; - } - - /** - * Set the length of time (in seconds) that the contents of a feed will be - * cached - * - * @param int $seconds The feed content cache duration - */ - public function set_cache_duration($seconds = 3600) - { - $this->cache_duration = (int) $seconds; - } - - /** - * Set the length of time (in seconds) that the autodiscovered feed URL will - * be cached - * - * @param int $seconds The autodiscovered feed URL cache duration. - */ - public function set_autodiscovery_cache_duration($seconds = 604800) - { - $this->autodiscovery_cache_duration = (int) $seconds; - } - - /** - * Set the file system location where the cached files should be stored - * - * @param string $location The file system location. - */ - public function set_cache_location($location = './cache') - { - $this->cache_location = (string) $location; - } - - /** - * Set whether feed items should be sorted into reverse chronological order - * - * @param bool $enable Sort as reverse chronological order. - */ - public function enable_order_by_date($enable = true) - { - $this->order_by_date = (bool) $enable; - } - - /** - * Set the character encoding used to parse the feed - * - * This overrides the encoding reported by the feed, however it will fall - * back to the normal encoding detection if the override fails - * - * @param string $encoding Character encoding - */ - public function set_input_encoding($encoding = false) - { - if ($encoding) - { - $this->input_encoding = (string) $encoding; - } - else - { - $this->input_encoding = false; - } - } - - /** - * Set how much feed autodiscovery to do - * - * @see SIMPLEPIE_LOCATOR_NONE - * @see SIMPLEPIE_LOCATOR_AUTODISCOVERY - * @see SIMPLEPIE_LOCATOR_LOCAL_EXTENSION - * @see SIMPLEPIE_LOCATOR_LOCAL_BODY - * @see SIMPLEPIE_LOCATOR_REMOTE_EXTENSION - * @see SIMPLEPIE_LOCATOR_REMOTE_BODY - * @see SIMPLEPIE_LOCATOR_ALL - * @param int $level Feed Autodiscovery Level (level can be a combination of the above constants, see bitwise OR operator) - */ - public function set_autodiscovery_level($level = SIMPLEPIE_LOCATOR_ALL) - { - $this->autodiscovery = (int) $level; - } - - /** - * Get the class registry - * - * Use this to override SimplePie's default classes - * @see SimplePie_Registry - * @return SimplePie_Registry - */ - public function &get_registry() - { - return $this->registry; - } - - /**#@+ - * Useful when you are overloading or extending SimplePie's default classes. - * - * @deprecated Use {@see get_registry()} instead - * @link http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.extends PHP5 extends documentation - * @param string $class Name of custom class - * @return boolean True on success, false otherwise - */ - /** - * Set which class SimplePie uses for caching - */ - public function set_cache_class($class = 'SimplePie_Cache') - { - return $this->registry->register('Cache', $class, true); - } - - /** - * Set which class SimplePie uses for auto-discovery - */ - public function set_locator_class($class = 'SimplePie_Locator') - { - return $this->registry->register('Locator', $class, true); - } - - /** - * Set which class SimplePie uses for XML parsing - */ - public function set_parser_class($class = 'SimplePie_Parser') - { - return $this->registry->register('Parser', $class, true); - } - - /** - * Set which class SimplePie uses for remote file fetching - */ - public function set_file_class($class = 'SimplePie_File') - { - return $this->registry->register('File', $class, true); - } - - /** - * Set which class SimplePie uses for data sanitization - */ - public function set_sanitize_class($class = 'SimplePie_Sanitize') - { - return $this->registry->register('Sanitize', $class, true); - } - - /** - * Set which class SimplePie uses for handling feed items - */ - public function set_item_class($class = 'SimplePie_Item') - { - return $this->registry->register('Item', $class, true); - } - - /** - * Set which class SimplePie uses for handling author data - */ - public function set_author_class($class = 'SimplePie_Author') - { - return $this->registry->register('Author', $class, true); - } - - /** - * Set which class SimplePie uses for handling category data - */ - public function set_category_class($class = 'SimplePie_Category') - { - return $this->registry->register('Category', $class, true); - } - - /** - * Set which class SimplePie uses for feed enclosures - */ - public function set_enclosure_class($class = 'SimplePie_Enclosure') - { - return $this->registry->register('Enclosure', $class, true); - } - - /** - * Set which class SimplePie uses for `<media:text>` captions - */ - public function set_caption_class($class = 'SimplePie_Caption') - { - return $this->registry->register('Caption', $class, true); - } - - /** - * Set which class SimplePie uses for `<media:copyright>` - */ - public function set_copyright_class($class = 'SimplePie_Copyright') - { - return $this->registry->register('Copyright', $class, true); - } - - /** - * Set which class SimplePie uses for `<media:credit>` - */ - public function set_credit_class($class = 'SimplePie_Credit') - { - return $this->registry->register('Credit', $class, true); - } - - /** - * Set which class SimplePie uses for `<media:rating>` - */ - public function set_rating_class($class = 'SimplePie_Rating') - { - return $this->registry->register('Rating', $class, true); - } - - /** - * Set which class SimplePie uses for `<media:restriction>` - */ - public function set_restriction_class($class = 'SimplePie_Restriction') - { - return $this->registry->register('Restriction', $class, true); - } - - /** - * Set which class SimplePie uses for content-type sniffing - */ - public function set_content_type_sniffer_class($class = 'SimplePie_Content_Type_Sniffer') - { - return $this->registry->register('Content_Type_Sniffer', $class, true); - } - - /** - * Set which class SimplePie uses item sources - */ - public function set_source_class($class = 'SimplePie_Source') - { - return $this->registry->register('Source', $class, true); - } - /**#@-*/ - - /** - * Set the user agent string - * - * @param string $ua New user agent string. - */ - public function set_useragent($ua = SIMPLEPIE_USERAGENT) - { - $this->useragent = (string) $ua; - } - - /** - * Set callback function to create cache filename with - * - * @param mixed $function Callback function - */ - public function set_cache_name_function($function = 'md5') - { - if (is_callable($function)) - { - $this->cache_name_function = $function; - } - } - - /** - * Set options to make SP as fast as possible - * - * Forgoes a substantial amount of data sanitization in favor of speed. This - * turns SimplePie into a dumb parser of feeds. - * - * @param bool $set Whether to set them or not - */ - public function set_stupidly_fast($set = false) - { - if ($set) - { - $this->enable_order_by_date(false); - $this->remove_div(false); - $this->strip_comments(false); - $this->strip_htmltags(false); - $this->strip_attributes(false); - $this->set_image_handler(false); - } - } - - /** - * Set maximum number of feeds to check with autodiscovery - * - * @param int $max Maximum number of feeds to check - */ - public function set_max_checked_feeds($max = 10) - { - $this->max_checked_feeds = (int) $max; - } - - public function remove_div($enable = true) - { - $this->sanitize->remove_div($enable); - } - - public function strip_htmltags($tags = '', $encode = null) - { - if ($tags === '') - { - $tags = $this->strip_htmltags; - } - $this->sanitize->strip_htmltags($tags); - if ($encode !== null) - { - $this->sanitize->encode_instead_of_strip($tags); - } - } - - public function encode_instead_of_strip($enable = true) - { - $this->sanitize->encode_instead_of_strip($enable); - } - - public function strip_attributes($attribs = '') - { - if ($attribs === '') - { - $attribs = $this->strip_attributes; - } - $this->sanitize->strip_attributes($attribs); - } - - /** - * Set the output encoding - * - * Allows you to override SimplePie's output to match that of your webpage. - * This is useful for times when your webpages are not being served as - * UTF-8. This setting will be obeyed by {@see handle_content_type()}, and - * is similar to {@see set_input_encoding()}. - * - * It should be noted, however, that not all character encodings can support - * all characters. If your page is being served as ISO-8859-1 and you try - * to display a Japanese feed, you'll likely see garbled characters. - * Because of this, it is highly recommended to ensure that your webpages - * are served as UTF-8. - * - * The number of supported character encodings depends on whether your web - * host supports {@link http://php.net/mbstring mbstring}, - * {@link http://php.net/iconv iconv}, or both. See - * {@link http://simplepie.org/wiki/faq/Supported_Character_Encodings} for - * more information. - * - * @param string $encoding - */ - public function set_output_encoding($encoding = 'UTF-8') - { - $this->sanitize->set_output_encoding($encoding); - } - - public function strip_comments($strip = false) - { - $this->sanitize->strip_comments($strip); - } - - /** - * Set element/attribute key/value pairs of HTML attributes - * containing URLs that need to be resolved relative to the feed - * - * Defaults to |a|@href, |area|@href, |blockquote|@cite, |del|@cite, - * |form|@action, |img|@longdesc, |img|@src, |input|@src, |ins|@cite, - * |q|@cite - * - * @since 1.0 - * @param array|null $element_attribute Element/attribute key/value pairs, null for default - */ - public function set_url_replacements($element_attribute = null) - { - $this->sanitize->set_url_replacements($element_attribute); - } - - /** - * Set the handler to enable the display of cached images. - * - * @param str $page Web-accessible path to the handler_image.php file. - * @param str $qs The query string that the value should be passed to. - */ - public function set_image_handler($page = false, $qs = 'i') - { - if ($page !== false) - { - $this->sanitize->set_image_handler($page . '?' . $qs . '='); - } - else - { - $this->image_handler = ''; - } - } - - /** - * Set the limit for items returned per-feed with multifeeds - * - * @param integer $limit The maximum number of items to return. - */ - public function set_item_limit($limit = 0) - { - $this->item_limit = (int) $limit; - } - - /** - * Initialize the feed object - * - * This is what makes everything happen. Period. This is where all of the - * configuration options get processed, feeds are fetched, cached, and - * parsed, and all of that other good stuff. - * - * @return boolean True if successful, false otherwise - */ - public function init() - { - // Check absolute bare minimum requirements. - if (!extension_loaded('xml') || !extension_loaded('pcre')) - { - return false; - } - // Then check the xml extension is sane (i.e., libxml 2.7.x issue on PHP < 5.2.9 and libxml 2.7.0 to 2.7.2 on any version) if we don't have xmlreader. - elseif (!extension_loaded('xmlreader')) - { - static $xml_is_sane = null; - if ($xml_is_sane === null) - { - $parser_check = xml_parser_create(); - xml_parse_into_struct($parser_check, '<foo>&</foo>', $values); - xml_parser_free($parser_check); - $xml_is_sane = isset($values[0]['value']); - } - if (!$xml_is_sane) - { - return false; - } - } - - if (method_exists($this->sanitize, 'set_registry')) - { - $this->sanitize->set_registry($this->registry); - } - - // Pass whatever was set with config options over to the sanitizer. - // Pass the classes in for legacy support; new classes should use the registry instead - $this->sanitize->pass_cache_data($this->cache, $this->cache_location, $this->cache_name_function, $this->registry->get_class('Cache')); - $this->sanitize->pass_file_data($this->registry->get_class('File'), $this->timeout, $this->useragent, $this->force_fsockopen); - - if (!empty($this->multifeed_url)) - { - $i = 0; - $success = 0; - $this->multifeed_objects = array(); - $this->error = array(); - foreach ($this->multifeed_url as $url) - { - $this->multifeed_objects[$i] = clone $this; - $this->multifeed_objects[$i]->set_feed_url($url); - $single_success = $this->multifeed_objects[$i]->init(); - $success |= $single_success; - if (!$single_success) - { - $this->error[$i] = $this->multifeed_objects[$i]->error(); - } - $i++; - } - return (bool) $success; - } - elseif ($this->feed_url === null && $this->raw_data === null) - { - return false; - } - - $this->error = null; - $this->data = array(); - $this->multifeed_objects = array(); - $cache = false; - - if ($this->feed_url !== null) - { - $parsed_feed_url = $this->registry->call('Misc', 'parse_url', array($this->feed_url)); - - // Decide whether to enable caching - if ($this->cache && $parsed_feed_url['scheme'] !== '') - { - $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $this->feed_url), 'spc')); - } - - // Fetch the data via SimplePie_File into $this->raw_data - if (($fetched = $this->fetch_data($cache)) === true) - { - return true; - } - elseif ($fetched === false) { - return false; - } - - list($headers, $sniffed) = $fetched; - } - - // Set up array of possible encodings - $encodings = array(); - - // First check to see if input has been overridden. - if ($this->input_encoding !== false) - { - $encodings[] = $this->input_encoding; - } - - $application_types = array('application/xml', 'application/xml-dtd', 'application/xml-external-parsed-entity'); - $text_types = array('text/xml', 'text/xml-external-parsed-entity'); - - // RFC 3023 (only applies to sniffed content) - if (isset($sniffed)) - { - if (in_array($sniffed, $application_types) || substr($sniffed, 0, 12) === 'application/' && substr($sniffed, -4) === '+xml') - { - if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) - { - $encodings[] = strtoupper($charset[1]); - } - $encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', array($this->raw_data, &$this->registry))); - $encodings[] = 'UTF-8'; - } - elseif (in_array($sniffed, $text_types) || substr($sniffed, 0, 5) === 'text/' && substr($sniffed, -4) === '+xml') - { - if (isset($headers['content-type']) && preg_match('/;\x20?charset=([^;]*)/i', $headers['content-type'], $charset)) - { - $encodings[] = $charset[1]; - } - $encodings[] = 'US-ASCII'; - } - // Text MIME-type default - elseif (substr($sniffed, 0, 5) === 'text/') - { - $encodings[] = 'US-ASCII'; - } - } - - // Fallback to XML 1.0 Appendix F.1/UTF-8/ISO-8859-1 - $encodings = array_merge($encodings, $this->registry->call('Misc', 'xml_encoding', array($this->raw_data, &$this->registry))); - $encodings[] = 'UTF-8'; - $encodings[] = 'ISO-8859-1'; - - // There's no point in trying an encoding twice - $encodings = array_unique($encodings); - - // Loop through each possible encoding, till we return something, or run out of possibilities - foreach ($encodings as $encoding) - { - // Change the encoding to UTF-8 (as we always use UTF-8 internally) - if ($utf8_data = $this->registry->call('Misc', 'change_encoding', array($this->raw_data, $encoding, 'UTF-8'))) - { - // Create new parser - $parser = $this->registry->create('Parser'); - - // If it's parsed fine - if ($parser->parse($utf8_data, 'UTF-8')) - { - $this->data = $parser->get_data(); - if (!($this->get_type() & ~SIMPLEPIE_TYPE_NONE)) - { - $this->error = "A feed could not be found at $this->feed_url. This does not appear to be a valid RSS or Atom feed."; - $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__)); - return false; - } - - if (isset($headers)) - { - $this->data['headers'] = $headers; - } - $this->data['build'] = SIMPLEPIE_BUILD; - - // Cache the file if caching is enabled - if ($cache && !$cache->save($this)) - { - trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); - } - return true; - } - } - } - - if (isset($parser)) - { - // We have an error, just set SimplePie_Misc::error to it and quit - $this->error = sprintf('This XML document is invalid, likely due to invalid characters. XML error: %s at line %d, column %d', $parser->get_error_string(), $parser->get_current_line(), $parser->get_current_column()); - } - else - { - $this->error = 'The data could not be converted to UTF-8. You MUST have either the iconv or mbstring extension installed. Upgrading to PHP 5.x (which includes iconv) is highly recommended.'; - } - - $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__)); - - return false; - } - - /** - * Fetch the data via SimplePie_File - * - * If the data is already cached, attempt to fetch it from there instead - * @param SimplePie_Cache|false $cache Cache handler, or false to not load from the cache - * @return array|true Returns true if the data was loaded from the cache, or an array of HTTP headers and sniffed type - */ - protected function fetch_data(&$cache) - { - // If it's enabled, use the cache - if ($cache) - { - // Load the Cache - $this->data = $cache->load(); - if (!empty($this->data)) - { - // If the cache is for an outdated build of SimplePie - if (!isset($this->data['build']) || $this->data['build'] !== SIMPLEPIE_BUILD) - { - $cache->unlink(); - $this->data = array(); - } - // If we've hit a collision just rerun it with caching disabled - elseif (isset($this->data['url']) && $this->data['url'] !== $this->feed_url) - { - $cache = false; - $this->data = array(); - } - // If we've got a non feed_url stored (if the page isn't actually a feed, or is a redirect) use that URL. - elseif (isset($this->data['feed_url'])) - { - // If the autodiscovery cache is still valid use it. - if ($cache->mtime() + $this->autodiscovery_cache_duration > time()) - { - // Do not need to do feed autodiscovery yet. - if ($this->data['feed_url'] !== $this->data['url']) - { - $this->set_feed_url($this->data['feed_url']); - return $this->init(); - } - - $cache->unlink(); - $this->data = array(); - } - } - // Check if the cache has been updated - elseif ($cache->mtime() + $this->cache_duration < time()) - { - // If we have last-modified and/or etag set - if (isset($this->data['headers']['last-modified']) || isset($this->data['headers']['etag'])) - { - $headers = array( - 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', - ); - if (isset($this->data['headers']['last-modified'])) - { - $headers['if-modified-since'] = $this->data['headers']['last-modified']; - } - if (isset($this->data['headers']['etag'])) - { - $headers['if-none-match'] = $this->data['headers']['etag']; - } - - $file = $this->registry->create('File', array($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen)); - - if ($file->success) - { - if ($file->status_code === 304) - { - $cache->touch(); - return true; - } - } - else - { - unset($file); - } - } - } - // If the cache is still valid, just return true - else - { - $this->raw_data = false; - return true; - } - } - // If the cache is empty, delete it - else - { - $cache->unlink(); - $this->data = array(); - } - } - // If we don't already have the file (it'll only exist if we've opened it to check if the cache has been modified), open it. - if (!isset($file)) - { - if ($this->file instanceof SimplePie_File && $this->file->url === $this->feed_url) - { - $file =& $this->file; - } - else - { - $headers = array( - 'Accept' => 'application/atom+xml, application/rss+xml, application/rdf+xml;q=0.9, application/xml;q=0.8, text/xml;q=0.8, text/html;q=0.7, unknown/unknown;q=0.1, application/unknown;q=0.1, */*;q=0.1', - ); - $file = $this->registry->create('File', array($this->feed_url, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen)); - } - } - // If the file connection has an error, set SimplePie::error to that and quit - if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300))) - { - $this->error = $file->error; - return !empty($this->data); - } - - if (!$this->force_feed) - { - // Check if the supplied URL is a feed, if it isn't, look for it. - $locate = $this->registry->create('Locator', array(&$file, $this->timeout, $this->useragent, $this->max_checked_feeds)); - - if (!$locate->is_feed($file)) - { - // We need to unset this so that if SimplePie::set_file() has been called that object is untouched - unset($file); - try - { - if (!($file = $locate->find($this->autodiscovery, $this->all_discovered_feeds))) - { - $this->error = "A feed could not be found at $this->feed_url. A feed with an invalid mime type may fall victim to this error, or " . SIMPLEPIE_NAME . " was unable to auto-discover it.. Use force_feed() if you are certain this URL is a real feed."; - $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, __FILE__, __LINE__)); - return false; - } - } - catch (SimplePie_Exception $e) - { - // This is usually because DOMDocument doesn't exist - $this->error = $e->getMessage(); - $this->registry->call('Misc', 'error', array($this->error, E_USER_NOTICE, $e->getFile(), $e->getLine())); - return false; - } - if ($cache) - { - $this->data = array('url' => $this->feed_url, 'feed_url' => $file->url, 'build' => SIMPLEPIE_BUILD); - if (!$cache->save($this)) - { - trigger_error("$this->cache_location is not writeable. Make sure you've set the correct relative or absolute path, and that the location is server-writable.", E_USER_WARNING); - } - $cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $file->url), 'spc')); - } - $this->feed_url = $file->url; - } - $locate = null; - } - - $this->raw_data = $file->body; - - $headers = $file->headers; - $sniffer = $this->registry->create('Content_Type_Sniffer', array(&$file)); - $sniffed = $sniffer->get_type(); - - return array($headers, $sniffed); - } - - /** - * Get the error message for the occurred error. - * - * @return string|array Error message, or array of messages for multifeeds - */ - public function error() - { - return $this->error; - } - - /** - * Get the raw XML - * - * This is the same as the old `$feed->enable_xml_dump(true)`, but returns - * the data instead of printing it. - * - * @return string|boolean Raw XML data, false if the cache is used - */ - public function get_raw_data() - { - return $this->raw_data; - } - - /** - * Get the character encoding used for output - * - * @since Preview Release - * @return string - */ - public function get_encoding() - { - return $this->sanitize->output_encoding; - } - - /** - * Send the content-type header with correct encoding - * - * This method ensures that the SimplePie-enabled page is being served with - * the correct {@link http://www.iana.org/assignments/media-types/ mime-type} - * and character encoding HTTP headers (character encoding determined by the - * {@see set_output_encoding} config option). - * - * This won't work properly if any content or whitespace has already been - * sent to the browser, because it relies on PHP's - * {@link http://php.net/header header()} function, and these are the - * circumstances under which the function works. - * - * Because it's setting these settings for the entire page (as is the nature - * of HTTP headers), this should only be used once per page (again, at the - * top). - * - * @param string $mime MIME type to serve the page as - */ - public function handle_content_type($mime = 'text/html') - { - if (!headers_sent()) - { - $header = "Content-type: $mime;"; - if ($this->get_encoding()) - { - $header .= ' charset=' . $this->get_encoding(); - } - else - { - $header .= ' charset=UTF-8'; - } - header($header); - } - } - - /** - * Get the type of the feed - * - * This returns a SIMPLEPIE_TYPE_* constant, which can be tested against - * using {@link http://php.net/language.operators.bitwise bitwise operators} - * - * @since 0.8 (usage changed to using constants in 1.0) - * @see SIMPLEPIE_TYPE_NONE Unknown. - * @see SIMPLEPIE_TYPE_RSS_090 RSS 0.90. - * @see SIMPLEPIE_TYPE_RSS_091_NETSCAPE RSS 0.91 (Netscape). - * @see SIMPLEPIE_TYPE_RSS_091_USERLAND RSS 0.91 (Userland). - * @see SIMPLEPIE_TYPE_RSS_091 RSS 0.91. - * @see SIMPLEPIE_TYPE_RSS_092 RSS 0.92. - * @see SIMPLEPIE_TYPE_RSS_093 RSS 0.93. - * @see SIMPLEPIE_TYPE_RSS_094 RSS 0.94. - * @see SIMPLEPIE_TYPE_RSS_10 RSS 1.0. - * @see SIMPLEPIE_TYPE_RSS_20 RSS 2.0.x. - * @see SIMPLEPIE_TYPE_RSS_RDF RDF-based RSS. - * @see SIMPLEPIE_TYPE_RSS_SYNDICATION Non-RDF-based RSS (truly intended as syndication format). - * @see SIMPLEPIE_TYPE_RSS_ALL Any version of RSS. - * @see SIMPLEPIE_TYPE_ATOM_03 Atom 0.3. - * @see SIMPLEPIE_TYPE_ATOM_10 Atom 1.0. - * @see SIMPLEPIE_TYPE_ATOM_ALL Any version of Atom. - * @see SIMPLEPIE_TYPE_ALL Any known/supported feed type. - * @return int SIMPLEPIE_TYPE_* constant - */ - public function get_type() - { - if (!isset($this->data['type'])) - { - $this->data['type'] = SIMPLEPIE_TYPE_ALL; - if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'])) - { - $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_10; - } - elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'])) - { - $this->data['type'] &= SIMPLEPIE_TYPE_ATOM_03; - } - elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'])) - { - if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['channel']) - || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['image']) - || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['item']) - || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_10]['textinput'])) - { - $this->data['type'] &= SIMPLEPIE_TYPE_RSS_10; - } - if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['channel']) - || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['image']) - || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['item']) - || isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_090]['textinput'])) - { - $this->data['type'] &= SIMPLEPIE_TYPE_RSS_090; - } - } - elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'])) - { - $this->data['type'] &= SIMPLEPIE_TYPE_RSS_ALL; - if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version'])) - { - switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['attribs']['']['version'])) - { - case '0.91': - $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091; - if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) - { - switch (trim($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][SIMPLEPIE_NAMESPACE_RSS_20]['skiphours']['hour'][0]['data'])) - { - case '0': - $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_NETSCAPE; - break; - - case '24': - $this->data['type'] &= SIMPLEPIE_TYPE_RSS_091_USERLAND; - break; - } - } - break; - - case '0.92': - $this->data['type'] &= SIMPLEPIE_TYPE_RSS_092; - break; - - case '0.93': - $this->data['type'] &= SIMPLEPIE_TYPE_RSS_093; - break; - - case '0.94': - $this->data['type'] &= SIMPLEPIE_TYPE_RSS_094; - break; - - case '2.0': - $this->data['type'] &= SIMPLEPIE_TYPE_RSS_20; - break; - } - } - } - else - { - $this->data['type'] = SIMPLEPIE_TYPE_NONE; - } - } - return $this->data['type']; - } - - /** - * Get the URL for the feed - * - * May or may not be different from the URL passed to {@see set_feed_url()}, - * depending on whether auto-discovery was used. - * - * @since Preview Release (previously called `get_feed_url()` since SimplePie 0.8.) - * @todo If we have a perm redirect we should return the new URL - * @todo When we make the above change, let's support <itunes:new-feed-url> as well - * @todo Also, |atom:link|@rel=self - * @return string|null - */ - public function subscribe_url() - { - if ($this->feed_url !== null) - { - return $this->sanitize($this->feed_url, SIMPLEPIE_CONSTRUCT_IRI); - } - else - { - return null; - } - } - - /** - * Get data for an feed-level element - * - * This method allows you to get access to ANY element/attribute that is a - * sub-element of the opening feed tag. - * - * The return value is an indexed array of elements matching the given - * namespace and tag name. Each element has `attribs`, `data` and `child` - * subkeys. For `attribs` and `child`, these contain namespace subkeys. - * `attribs` then has one level of associative name => value data (where - * `value` is a string) after the namespace. `child` has tag-indexed keys - * after the namespace, each member of which is an indexed array matching - * this same format. - * - * For example: - * <pre> - * // This is probably a bad example because we already support - * // <media:content> natively, but it shows you how to parse through - * // the nodes. - * $group = $item->get_item_tags(SIMPLEPIE_NAMESPACE_MEDIARSS, 'group'); - * $content = $group[0]['child'][SIMPLEPIE_NAMESPACE_MEDIARSS]['content']; - * $file = $content[0]['attribs']['']['url']; - * echo $file; - * </pre> - * - * @since 1.0 - * @see http://simplepie.org/wiki/faq/supported_xml_namespaces - * @param string $namespace The URL of the XML namespace of the elements you're trying to access - * @param string $tag Tag name - * @return array - */ - public function get_feed_tags($namespace, $tag) - { - $type = $this->get_type(); - if ($type & SIMPLEPIE_TYPE_ATOM_10) - { - if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag])) - { - return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['child'][$namespace][$tag]; - } - } - if ($type & SIMPLEPIE_TYPE_ATOM_03) - { - if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag])) - { - return $this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['child'][$namespace][$tag]; - } - } - if ($type & SIMPLEPIE_TYPE_RSS_RDF) - { - if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag])) - { - return $this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['child'][$namespace][$tag]; - } - } - if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) - { - if (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag])) - { - return $this->data['child'][SIMPLEPIE_NAMESPACE_RSS_20]['rss'][0]['child'][$namespace][$tag]; - } - } - return null; - } - - /** - * Get data for an channel-level element - * - * This method allows you to get access to ANY element/attribute in the - * channel/header section of the feed. - * - * See {@see SimplePie::get_feed_tags()} for a description of the return value - * - * @since 1.0 - * @see http://simplepie.org/wiki/faq/supported_xml_namespaces - * @param string $namespace The URL of the XML namespace of the elements you're trying to access - * @param string $tag Tag name - * @return array - */ - public function get_channel_tags($namespace, $tag) - { - $type = $this->get_type(); - if ($type & SIMPLEPIE_TYPE_ATOM_ALL) - { - if ($return = $this->get_feed_tags($namespace, $tag)) - { - return $return; - } - } - if ($type & SIMPLEPIE_TYPE_RSS_10) - { - if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'channel')) - { - if (isset($channel[0]['child'][$namespace][$tag])) - { - return $channel[0]['child'][$namespace][$tag]; - } - } - } - if ($type & SIMPLEPIE_TYPE_RSS_090) - { - if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'channel')) - { - if (isset($channel[0]['child'][$namespace][$tag])) - { - return $channel[0]['child'][$namespace][$tag]; - } - } - } - if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) - { - if ($channel = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'channel')) - { - if (isset($channel[0]['child'][$namespace][$tag])) - { - return $channel[0]['child'][$namespace][$tag]; - } - } - } - return null; - } - - /** - * Get data for an channel-level element - * - * This method allows you to get access to ANY element/attribute in the - * image/logo section of the feed. - * - * See {@see SimplePie::get_feed_tags()} for a description of the return value - * - * @since 1.0 - * @see http://simplepie.org/wiki/faq/supported_xml_namespaces - * @param string $namespace The URL of the XML namespace of the elements you're trying to access - * @param string $tag Tag name - * @return array - */ - public function get_image_tags($namespace, $tag) - { - $type = $this->get_type(); - if ($type & SIMPLEPIE_TYPE_RSS_10) - { - if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'image')) - { - if (isset($image[0]['child'][$namespace][$tag])) - { - return $image[0]['child'][$namespace][$tag]; - } - } - } - if ($type & SIMPLEPIE_TYPE_RSS_090) - { - if ($image = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'image')) - { - if (isset($image[0]['child'][$namespace][$tag])) - { - return $image[0]['child'][$namespace][$tag]; - } - } - } - if ($type & SIMPLEPIE_TYPE_RSS_SYNDICATION) - { - if ($image = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'image')) - { - if (isset($image[0]['child'][$namespace][$tag])) - { - return $image[0]['child'][$namespace][$tag]; - } - } - } - return null; - } - - /** - * Get the base URL value from the feed - * - * Uses `<xml:base>` if available, otherwise uses the first link in the - * feed, or failing that, the URL of the feed itself. - * - * @see get_link - * @see subscribe_url - * - * @param array $element - * @return string - */ - public function get_base($element = array()) - { - if (!($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION) && !empty($element['xml_base_explicit']) && isset($element['xml_base'])) - { - return $element['xml_base']; - } - elseif ($this->get_link() !== null) - { - return $this->get_link(); - } - else - { - return $this->subscribe_url(); - } - } - - /** - * Sanitize feed data - * - * @access private - * @see SimplePie_Sanitize::sanitize() - * @param string $data Data to sanitize - * @param int $type One of the SIMPLEPIE_CONSTRUCT_* constants - * @param string $base Base URL to resolve URLs against - * @return string Sanitized data - */ - public function sanitize($data, $type, $base = '') - { - return $this->sanitize->sanitize($data, $type, $base); - } - - /** - * Get the title of the feed - * - * Uses `<atom:title>`, `<title>` or `<dc:title>` - * - * @since 1.0 (previously called `get_feed_title` since 0.8) - * @return string|null - */ - public function get_title() - { - if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'title')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'title')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - return null; - } - } - - /** - * Get a category for the feed - * - * @since Unknown - * @param int $key The category that you want to return. Remember that arrays begin with 0, not 1 - * @return SimplePie_Category|null - */ - public function get_category($key = 0) - { - $categories = $this->get_categories(); - if (isset($categories[$key])) - { - return $categories[$key]; - } - else - { - return null; - } - } - - /** - * Get all categories for the feed - * - * Uses `<atom:category>`, `<category>` or `<dc:subject>` - * - * @since Unknown - * @return array|null List of {@see SimplePie_Category} objects - */ - public function get_categories() - { - $categories = array(); - - foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'category') as $category) - { - $term = null; - $scheme = null; - $label = null; - if (isset($category['attribs']['']['term'])) - { - $term = $this->sanitize($category['attribs']['']['term'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($category['attribs']['']['scheme'])) - { - $scheme = $this->sanitize($category['attribs']['']['scheme'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($category['attribs']['']['label'])) - { - $label = $this->sanitize($category['attribs']['']['label'], SIMPLEPIE_CONSTRUCT_TEXT); - } - $categories[] = $this->registry->create('Category', array($term, $scheme, $label)); - } - foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'category') as $category) - { - // This is really the label, but keep this as the term also for BC. - // Label will also work on retrieving because that falls back to term. - $term = $this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT); - if (isset($category['attribs']['']['domain'])) - { - $scheme = $this->sanitize($category['attribs']['']['domain'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - $scheme = null; - } - $categories[] = $this->registry->create('Category', array($term, $scheme, null)); - } - foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'subject') as $category) - { - $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'subject') as $category) - { - $categories[] = $this->registry->create('Category', array($this->sanitize($category['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - - if (!empty($categories)) - { - return array_unique($categories); - } - else - { - return null; - } - } - - /** - * Get an author for the feed - * - * @since 1.1 - * @param int $key The author that you want to return. Remember that arrays begin with 0, not 1 - * @return SimplePie_Author|null - */ - public function get_author($key = 0) - { - $authors = $this->get_authors(); - if (isset($authors[$key])) - { - return $authors[$key]; - } - else - { - return null; - } - } - - /** - * Get all authors for the feed - * - * Uses `<atom:author>`, `<author>`, `<dc:creator>` or `<itunes:author>` - * - * @since 1.1 - * @return array|null List of {@see SimplePie_Author} objects - */ - public function get_authors() - { - $authors = array(); - foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'author') as $author) - { - $name = null; - $uri = null; - $email = null; - if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) - { - $name = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) - { - $uri = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); - } - if (isset($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) - { - $email = $this->sanitize($author['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if ($name !== null || $email !== null || $uri !== null) - { - $authors[] = $this->registry->create('Author', array($name, $uri, $email)); - } - } - if ($author = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'author')) - { - $name = null; - $url = null; - $email = null; - if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) - { - $name = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) - { - $url = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); - } - if (isset($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) - { - $email = $this->sanitize($author[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if ($name !== null || $email !== null || $url !== null) - { - $authors[] = $this->registry->create('Author', array($name, $url, $email)); - } - } - foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'creator') as $author) - { - $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'creator') as $author) - { - $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'author') as $author) - { - $authors[] = $this->registry->create('Author', array($this->sanitize($author['data'], SIMPLEPIE_CONSTRUCT_TEXT), null, null)); - } - - if (!empty($authors)) - { - return array_unique($authors); - } - else - { - return null; - } - } - - /** - * Get a contributor for the feed - * - * @since 1.1 - * @param int $key The contrbutor that you want to return. Remember that arrays begin with 0, not 1 - * @return SimplePie_Author|null - */ - public function get_contributor($key = 0) - { - $contributors = $this->get_contributors(); - if (isset($contributors[$key])) - { - return $contributors[$key]; - } - else - { - return null; - } - } - - /** - * Get all contributors for the feed - * - * Uses `<atom:contributor>` - * - * @since 1.1 - * @return array|null List of {@see SimplePie_Author} objects - */ - public function get_contributors() - { - $contributors = array(); - foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'contributor') as $contributor) - { - $name = null; - $uri = null; - $email = null; - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'])) - { - $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'])) - { - $uri = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['uri'][0])); - } - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'])) - { - $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if ($name !== null || $email !== null || $uri !== null) - { - $contributors[] = $this->registry->create('Author', array($name, $uri, $email)); - } - } - foreach ((array) $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'contributor') as $contributor) - { - $name = null; - $url = null; - $email = null; - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'])) - { - $name = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['name'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'])) - { - $url = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['url'][0])); - } - if (isset($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'])) - { - $email = $this->sanitize($contributor['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['email'][0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - if ($name !== null || $email !== null || $url !== null) - { - $contributors[] = $this->registry->create('Author', array($name, $url, $email)); - } - } - - if (!empty($contributors)) - { - return array_unique($contributors); - } - else - { - return null; - } - } - - /** - * Get a single link for the feed - * - * @since 1.0 (previously called `get_feed_link` since Preview Release, `get_feed_permalink()` since 0.8) - * @param int $key The link that you want to return. Remember that arrays begin with 0, not 1 - * @param string $rel The relationship of the link to return - * @return string|null Link URL - */ - public function get_link($key = 0, $rel = 'alternate') - { - $links = $this->get_links($rel); - if (isset($links[$key])) - { - return $links[$key]; - } - else - { - return null; - } - } - - /** - * Get the permalink for the item - * - * Returns the first link available with a relationship of "alternate". - * Identical to {@see get_link()} with key 0 - * - * @see get_link - * @since 1.0 (previously called `get_feed_link` since Preview Release, `get_feed_permalink()` since 0.8) - * @internal Added for parity between the parent-level and the item/entry-level. - * @return string|null Link URL - */ - public function get_permalink() - { - return $this->get_link(0); - } - - /** - * Get all links for the feed - * - * Uses `<atom:link>` or `<link>` - * - * @since Beta 2 - * @param string $rel The relationship of links to return - * @return array|null Links found for the feed (strings) - */ - public function get_links($rel = 'alternate') - { - if (!isset($this->data['links'])) - { - $this->data['links'] = array(); - if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'link')) - { - foreach ($links as $link) - { - if (isset($link['attribs']['']['href'])) - { - $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; - $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); - } - } - } - if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'link')) - { - foreach ($links as $link) - { - if (isset($link['attribs']['']['href'])) - { - $link_rel = (isset($link['attribs']['']['rel'])) ? $link['attribs']['']['rel'] : 'alternate'; - $this->data['links'][$link_rel][] = $this->sanitize($link['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($link)); - - } - } - } - if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) - { - $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); - } - if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) - { - $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); - } - if ($links = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) - { - $this->data['links']['alternate'][] = $this->sanitize($links[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($links[0])); - } - - $keys = array_keys($this->data['links']); - foreach ($keys as $key) - { - if ($this->registry->call('Misc', 'is_isegment_nz_nc', array($key))) - { - if (isset($this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key])) - { - $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] = array_merge($this->data['links'][$key], $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]); - $this->data['links'][$key] =& $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key]; - } - else - { - $this->data['links'][SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY . $key] =& $this->data['links'][$key]; - } - } - elseif (substr($key, 0, 41) === SIMPLEPIE_IANA_LINK_RELATIONS_REGISTRY) - { - $this->data['links'][substr($key, 41)] =& $this->data['links'][$key]; - } - $this->data['links'][$key] = array_unique($this->data['links'][$key]); - } - } - - if (isset($this->data['links'][$rel])) - { - return $this->data['links'][$rel]; - } - else - { - return null; - } - } - - public function get_all_discovered_feeds() - { - return $this->all_discovered_feeds; - } - - /** - * Get the content for the item - * - * Uses `<atom:subtitle>`, `<atom:tagline>`, `<description>`, - * `<dc:description>`, `<itunes:summary>` or `<itunes:subtitle>` - * - * @since 1.0 (previously called `get_feed_description()` since 0.8) - * @return string|null - */ - public function get_description() - { - if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'subtitle')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'tagline')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_MAYBE_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'description')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'summary')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'subtitle')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_HTML, $this->get_base($return[0])); - } - else - { - return null; - } - } - - /** - * Get the copyright info for the feed - * - * Uses `<atom:rights>`, `<atom:copyright>` or `<dc:rights>` - * - * @since 1.0 (previously called `get_feed_copyright()` since 0.8) - * @return string|null - */ - public function get_copyright() - { - if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'rights')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_10_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'copyright')) - { - return $this->sanitize($return[0]['data'], $this->registry->call('Misc', 'atom_03_construct_type', array($return[0]['attribs'])), $this->get_base($return[0])); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'copyright')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'rights')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'rights')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - return null; - } - } - - /** - * Get the language for the feed - * - * Uses `<language>`, `<dc:language>`, or @xml_lang - * - * @since 1.0 (previously called `get_feed_language()` since 0.8) - * @return string|null - */ - public function get_language() - { - if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'language')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_11, 'language')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_DC_10, 'language')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'])) - { - return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'])) - { - return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_ATOM_03]['feed'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif (isset($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'])) - { - return $this->sanitize($this->data['child'][SIMPLEPIE_NAMESPACE_RDF]['RDF'][0]['xml_lang'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif (isset($this->data['headers']['content-language'])) - { - return $this->sanitize($this->data['headers']['content-language'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - return null; - } - } - - /** - * Get the latitude coordinates for the item - * - * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications - * - * Uses `<geo:lat>` or `<georss:point>` - * - * @since 1.0 - * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo - * @link http://www.georss.org/ GeoRSS - * @return string|null - */ - public function get_latitude() - { - - if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lat')) - { - return (float) $return[0]['data']; - } - elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) - { - return (float) $match[1]; - } - else - { - return null; - } - } - - /** - * Get the longitude coordinates for the feed - * - * Compatible with the W3C WGS84 Basic Geo and GeoRSS specifications - * - * Uses `<geo:long>`, `<geo:lon>` or `<georss:point>` - * - * @since 1.0 - * @link http://www.w3.org/2003/01/geo/ W3C WGS84 Basic Geo - * @link http://www.georss.org/ GeoRSS - * @return string|null - */ - public function get_longitude() - { - if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'long')) - { - return (float) $return[0]['data']; - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_W3C_BASIC_GEO, 'lon')) - { - return (float) $return[0]['data']; - } - elseif (($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_GEORSS, 'point')) && preg_match('/^((?:-)?[0-9]+(?:\.[0-9]+)) ((?:-)?[0-9]+(?:\.[0-9]+))$/', trim($return[0]['data']), $match)) - { - return (float) $match[2]; - } - else - { - return null; - } - } - - /** - * Get the feed logo's title - * - * RSS 0.9.0, 1.0 and 2.0 feeds are allowed to have a "feed logo" title. - * - * Uses `<image><title>` or `<image><dc:title>` - * - * @return string|null - */ - public function get_image_title() - { - if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_11, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_DC_10, 'title')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_TEXT); - } - else - { - return null; - } - } - - /** - * Get the feed logo's URL - * - * RSS 0.9.0, 2.0, Atom 1.0, and feeds with iTunes RSS tags are allowed to - * have a "feed logo" URL. This points directly to the image itself. - * - * Uses `<itunes:image>`, `<atom:logo>`, `<atom:icon>`, - * `<image><title>` or `<image><dc:title>` - * - * @return string|null - */ - public function get_image_url() - { - if ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ITUNES, 'image')) - { - return $this->sanitize($return[0]['attribs']['']['href'], SIMPLEPIE_CONSTRUCT_IRI); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'logo')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); - } - elseif ($return = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'icon')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); - } - elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'url')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); - } - elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'url')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); - } - elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); - } - else - { - return null; - } - } - - - /** - * Get the feed logo's link - * - * RSS 0.9.0, 1.0 and 2.0 feeds are allowed to have a "feed logo" link. This - * points to a human-readable page that the image should link to. - * - * Uses `<itunes:image>`, `<atom:logo>`, `<atom:icon>`, - * `<image><title>` or `<image><dc:title>` - * - * @return string|null - */ - public function get_image_link() - { - if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'link')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); - } - elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'link')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); - } - elseif ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'link')) - { - return $this->sanitize($return[0]['data'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($return[0])); - } - else - { - return null; - } - } - - /** - * Get the feed logo's link - * - * RSS 2.0 feeds are allowed to have a "feed logo" width. - * - * Uses `<image><width>` or defaults to 88.0 if no width is specified and - * the feed is an RSS 2.0 feed. - * - * @return int|float|null - */ - public function get_image_width() - { - if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'width')) - { - return round($return[0]['data']); - } - elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) - { - return 88.0; - } - else - { - return null; - } - } - - /** - * Get the feed logo's height - * - * RSS 2.0 feeds are allowed to have a "feed logo" height. - * - * Uses `<image><height>` or defaults to 31.0 if no height is specified and - * the feed is an RSS 2.0 feed. - * - * @return int|float|null - */ - public function get_image_height() - { - if ($return = $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'height')) - { - return round($return[0]['data']); - } - elseif ($this->get_type() & SIMPLEPIE_TYPE_RSS_SYNDICATION && $this->get_image_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'url')) - { - return 31.0; - } - else - { - return null; - } - } - - /** - * Get the number of items in the feed - * - * This is well-suited for {@link http://php.net/for for()} loops with - * {@see get_item()} - * - * @param int $max Maximum value to return. 0 for no limit - * @return int Number of items in the feed - */ - public function get_item_quantity($max = 0) - { - $max = (int) $max; - $qty = count($this->get_items()); - if ($max === 0) - { - return $qty; - } - else - { - return ($qty > $max) ? $max : $qty; - } - } - - /** - * Get a single item from the feed - * - * This is better suited for {@link http://php.net/for for()} loops, whereas - * {@see get_items()} is better suited for - * {@link http://php.net/foreach foreach()} loops. - * - * @see get_item_quantity() - * @since Beta 2 - * @param int $key The item that you want to return. Remember that arrays begin with 0, not 1 - * @return SimplePie_Item|null - */ - public function get_item($key = 0) - { - $items = $this->get_items(); - if (isset($items[$key])) - { - return $items[$key]; - } - else - { - return null; - } - } - - /** - * Get all items from the feed - * - * This is better suited for {@link http://php.net/for for()} loops, whereas - * {@see get_items()} is better suited for - * {@link http://php.net/foreach foreach()} loops. - * - * @see get_item_quantity - * @since Beta 2 - * @param int $start Index to start at - * @param int $end Number of items to return. 0 for all items after `$start` - * @return array|null List of {@see SimplePie_Item} objects - */ - public function get_items($start = 0, $end = 0) - { - if (!isset($this->data['items'])) - { - if (!empty($this->multifeed_objects)) - { - $this->data['items'] = SimplePie::merge_items($this->multifeed_objects, $start, $end, $this->item_limit); - } - else - { - $this->data['items'] = array(); - if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_10, 'entry')) - { - $keys = array_keys($items); - foreach ($keys as $key) - { - $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); - } - } - if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_ATOM_03, 'entry')) - { - $keys = array_keys($items); - foreach ($keys as $key) - { - $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); - } - } - if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_10, 'item')) - { - $keys = array_keys($items); - foreach ($keys as $key) - { - $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); - } - } - if ($items = $this->get_feed_tags(SIMPLEPIE_NAMESPACE_RSS_090, 'item')) - { - $keys = array_keys($items); - foreach ($keys as $key) - { - $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); - } - } - if ($items = $this->get_channel_tags(SIMPLEPIE_NAMESPACE_RSS_20, 'item')) - { - $keys = array_keys($items); - foreach ($keys as $key) - { - $this->data['items'][] = $this->registry->create('Item', array($this, $items[$key])); - } - } - } - } - - if (!empty($this->data['items'])) - { - // If we want to order it by date, check if all items have a date, and then sort it - if ($this->order_by_date && empty($this->multifeed_objects)) - { - if (!isset($this->data['ordered_items'])) - { - $do_sort = true; - foreach ($this->data['items'] as $item) - { - if (!$item->get_date('U')) - { - $do_sort = false; - break; - } - } - $item = null; - $this->data['ordered_items'] = $this->data['items']; - if ($do_sort) - { - usort($this->data['ordered_items'], array(get_class($this), 'sort_items')); - } - } - $items = $this->data['ordered_items']; - } - else - { - $items = $this->data['items']; - } - - // Slice the data as desired - if ($end === 0) - { - return array_slice($items, $start); - } - else - { - return array_slice($items, $start, $end); - } - } - else - { - return array(); - } - } - - /** - * Set the favicon handler - * - * @deprecated Use your own favicon handling instead - */ - public function set_favicon_handler($page = false, $qs = 'i') - { - $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; - trigger_error('Favicon handling has been removed, please use your own handling', $level); - return false; - } - - /** - * Get the favicon for the current feed - * - * @deprecated Use your own favicon handling instead - */ - public function get_favicon() - { - $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; - trigger_error('Favicon handling has been removed, please use your own handling', $level); - - if (($url = $this->get_link()) !== null) - { - return 'http://g.etfv.co/' . urlencode($url); - } - - return false; - } - - /** - * Magic method handler - * - * @param string $method Method name - * @param array $args Arguments to the method - * @return mixed - */ - public function __call($method, $args) - { - if (strpos($method, 'subscribe_') === 0) - { - $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; - trigger_error('subscribe_*() has been deprecated, implement the callback yourself', $level); - return ''; - } - if ($method === 'enable_xml_dump') - { - $level = defined('E_USER_DEPRECATED') ? E_USER_DEPRECATED : E_USER_WARNING; - trigger_error('enable_xml_dump() has been deprecated, use get_raw_data() instead', $level); - return false; - } - - $class = get_class($this); - $trace = debug_backtrace(); - $file = $trace[0]['file']; - $line = $trace[0]['line']; - trigger_error("Call to undefined method $class::$method() in $file on line $line", E_USER_ERROR); - } - - /** - * Sorting callback for items - * - * @access private - * @param SimplePie $a - * @param SimplePie $b - * @return boolean - */ - public static function sort_items($a, $b) - { - return $a->get_date('U') <= $b->get_date('U'); - } - - /** - * Merge items from several feeds into one - * - * If you're merging multiple feeds together, they need to all have dates - * for the items or else SimplePie will refuse to sort them. - * - * @link http://simplepie.org/wiki/tutorial/sort_multiple_feeds_by_time_and_date#if_feeds_require_separate_per-feed_settings - * @param array $urls List of SimplePie feed objects to merge - * @param int $start Starting item - * @param int $end Number of items to return - * @param int $limit Maximum number of items per feed - * @return array - */ - public static function merge_items($urls, $start = 0, $end = 0, $limit = 0) - { - if (is_array($urls) && sizeof($urls) > 0) - { - $items = array(); - foreach ($urls as $arg) - { - if ($arg instanceof SimplePie) - { - $items = array_merge($items, $arg->get_items(0, $limit)); - } - else - { - trigger_error('Arguments must be SimplePie objects', E_USER_WARNING); - } - } - - $do_sort = true; - foreach ($items as $item) - { - if (!$item->get_date('U')) - { - $do_sort = false; - break; - } - } - $item = null; - if ($do_sort) - { - usort($items, array(get_class($urls[0]), 'sort_items')); - } - - if ($end === 0) - { - return array_slice($items, $start); - } - else - { - return array_slice($items, $start, $end); - } - } - else - { - trigger_error('Cannot merge zero SimplePie objects', E_USER_WARNING); - return array(); - } - } -} -endif; \ No newline at end of file diff --git a/wp/wp-includes/class-smtp.php b/wp/wp-includes/class-smtp.php deleted file mode 100644 index 3ad08192..00000000 --- a/wp/wp-includes/class-smtp.php +++ /dev/null @@ -1,1186 +0,0 @@ -<?php -/** - * PHPMailer RFC821 SMTP email transport class. - * PHP Version 5 - * @package PHPMailer - * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project - * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk> - * @author Jim Jagielski (jimjag) <jimjag@gmail.com> - * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net> - * @author Brent R. Matzelle (original founder) - * @copyright 2014 Marcus Bointon - * @copyright 2010 - 2012 Jim Jagielski - * @copyright 2004 - 2009 Andy Prevost - * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License - * @note This program is distributed in the hope that it will be useful - WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. - */ - -/** - * PHPMailer RFC821 SMTP email transport class. - * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server. - * @package PHPMailer - * @author Chris Ryan - * @author Marcus Bointon <phpmailer@synchromedia.co.uk> - */ -class SMTP -{ - /** - * The PHPMailer SMTP version number. - * @var string - */ - const VERSION = '5.2.22'; - - /** - * SMTP line break constant. - * @var string - */ - const CRLF = "\r\n"; - - /** - * The SMTP port to use if one is not specified. - * @var integer - */ - const DEFAULT_SMTP_PORT = 25; - - /** - * The maximum line length allowed by RFC 2822 section 2.1.1 - * @var integer - */ - const MAX_LINE_LENGTH = 998; - - /** - * Debug level for no output - */ - const DEBUG_OFF = 0; - - /** - * Debug level to show client -> server messages - */ - const DEBUG_CLIENT = 1; - - /** - * Debug level to show client -> server and server -> client messages - */ - const DEBUG_SERVER = 2; - - /** - * Debug level to show connection status, client -> server and server -> client messages - */ - const DEBUG_CONNECTION = 3; - - /** - * Debug level to show all messages - */ - const DEBUG_LOWLEVEL = 4; - - /** - * The PHPMailer SMTP Version number. - * @var string - * @deprecated Use the `VERSION` constant instead - * @see SMTP::VERSION - */ - public $Version = '5.2.22'; - - /** - * SMTP server port number. - * @var integer - * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead - * @see SMTP::DEFAULT_SMTP_PORT - */ - public $SMTP_PORT = 25; - - /** - * SMTP reply line ending. - * @var string - * @deprecated Use the `CRLF` constant instead - * @see SMTP::CRLF - */ - public $CRLF = "\r\n"; - - /** - * Debug output level. - * Options: - * * self::DEBUG_OFF (`0`) No debug output, default - * * self::DEBUG_CLIENT (`1`) Client commands - * * self::DEBUG_SERVER (`2`) Client commands and server responses - * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status - * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages - * @var integer - */ - public $do_debug = self::DEBUG_OFF; - - /** - * How to handle debug output. - * Options: - * * `echo` Output plain-text as-is, appropriate for CLI - * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output - * * `error_log` Output to error log as configured in php.ini - * - * Alternatively, you can provide a callable expecting two params: a message string and the debug level: - * <code> - * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; - * </code> - * @var string|callable - */ - public $Debugoutput = 'echo'; - - /** - * Whether to use VERP. - * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path - * @link http://www.postfix.org/VERP_README.html Info on VERP - * @var boolean - */ - public $do_verp = false; - - /** - * The timeout value for connection, in seconds. - * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 - * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure. - * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2 - * @var integer - */ - public $Timeout = 300; - - /** - * How long to wait for commands to complete, in seconds. - * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2 - * @var integer - */ - public $Timelimit = 300; - - /** - * @var array patterns to extract smtp transaction id from smtp reply - * Only first capture group will be use, use non-capturing group to deal with it - * Extend this class to override this property to fulfil your needs. - */ - protected $smtp_transaction_id_patterns = array( - 'exim' => '/[0-9]{3} OK id=(.*)/', - 'sendmail' => '/[0-9]{3} 2.0.0 (.*) Message/', - 'postfix' => '/[0-9]{3} 2.0.0 Ok: queued as (.*)/' - ); - - /** - * The socket for the server connection. - * @var resource - */ - protected $smtp_conn; - - /** - * Error information, if any, for the last SMTP command. - * @var array - */ - protected $error = array( - 'error' => '', - 'detail' => '', - 'smtp_code' => '', - 'smtp_code_ex' => '' - ); - - /** - * The reply the server sent to us for HELO. - * If null, no HELO string has yet been received. - * @var string|null - */ - protected $helo_rply = null; - - /** - * The set of SMTP extensions sent in reply to EHLO command. - * Indexes of the array are extension names. - * Value at index 'HELO' or 'EHLO' (according to command that was sent) - * represents the server name. In case of HELO it is the only element of the array. - * Other values can be boolean TRUE or an array containing extension options. - * If null, no HELO/EHLO string has yet been received. - * @var array|null - */ - protected $server_caps = null; - - /** - * The most recent reply received from the server. - * @var string - */ - protected $last_reply = ''; - - /** - * Output debugging info via a user-selected method. - * @see SMTP::$Debugoutput - * @see SMTP::$do_debug - * @param string $str Debug string to output - * @param integer $level The debug level of this message; see DEBUG_* constants - * @return void - */ - protected function edebug($str, $level = 0) - { - if ($level > $this->do_debug) { - return; - } - //Avoid clash with built-in function names - if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) { - call_user_func($this->Debugoutput, $str, $level); - return; - } - switch ($this->Debugoutput) { - case 'error_log': - //Don't output, just log - error_log($str); - break; - case 'html': - //Cleans up output a bit for a better looking, HTML-safe output - echo htmlentities( - preg_replace('/[\r\n]+/', '', $str), - ENT_QUOTES, - 'UTF-8' - ) - . "<br>\n"; - break; - case 'echo': - default: - //Normalize line breaks - $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str); - echo gmdate('Y-m-d H:i:s') . "\t" . str_replace( - "\n", - "\n \t ", - trim($str) - )."\n"; - } - } - - /** - * Connect to an SMTP server. - * @param string $host SMTP server IP or host name - * @param integer $port The port number to connect to - * @param integer $timeout How long to wait for the connection to open - * @param array $options An array of options for stream_context_create() - * @access public - * @return boolean - */ - public function connect($host, $port = null, $timeout = 30, $options = array()) - { - static $streamok; - //This is enabled by default since 5.0.0 but some providers disable it - //Check this once and cache the result - if (is_null($streamok)) { - $streamok = function_exists('stream_socket_client'); - } - // Clear errors to avoid confusion - $this->setError(''); - // Make sure we are __not__ connected - if ($this->connected()) { - // Already connected, generate error - $this->setError('Already connected to a server'); - return false; - } - if (empty($port)) { - $port = self::DEFAULT_SMTP_PORT; - } - // Connect to the SMTP server - $this->edebug( - "Connection: opening to $host:$port, timeout=$timeout, options=".var_export($options, true), - self::DEBUG_CONNECTION - ); - $errno = 0; - $errstr = ''; - if ($streamok) { - $socket_context = stream_context_create($options); - set_error_handler(array($this, 'errorHandler')); - $this->smtp_conn = stream_socket_client( - $host . ":" . $port, - $errno, - $errstr, - $timeout, - STREAM_CLIENT_CONNECT, - $socket_context - ); - restore_error_handler(); - } else { - //Fall back to fsockopen which should work in more places, but is missing some features - $this->edebug( - "Connection: stream_socket_client not available, falling back to fsockopen", - self::DEBUG_CONNECTION - ); - set_error_handler(array($this, 'errorHandler')); - $this->smtp_conn = fsockopen( - $host, - $port, - $errno, - $errstr, - $timeout - ); - restore_error_handler(); - } - // Verify we connected properly - if (!is_resource($this->smtp_conn)) { - $this->setError( - 'Failed to connect to server', - $errno, - $errstr - ); - $this->edebug( - 'SMTP ERROR: ' . $this->error['error'] - . ": $errstr ($errno)", - self::DEBUG_CLIENT - ); - return false; - } - $this->edebug('Connection: opened', self::DEBUG_CONNECTION); - // SMTP server can take longer to respond, give longer timeout for first read - // Windows does not have support for this timeout function - if (substr(PHP_OS, 0, 3) != 'WIN') { - $max = ini_get('max_execution_time'); - // Don't bother if unlimited - if ($max != 0 && $timeout > $max) { - @set_time_limit($timeout); - } - stream_set_timeout($this->smtp_conn, $timeout, 0); - } - // Get any announcement - $announce = $this->get_lines(); - $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER); - return true; - } - - /** - * Initiate a TLS (encrypted) session. - * @access public - * @return boolean - */ - public function startTLS() - { - if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) { - return false; - } - - //Allow the best TLS version(s) we can - $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT; - - //PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in STREAM_CRYPTO_METHOD_TLS_CLIENT - //so add them back in manually if we can - if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) { - $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; - $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT; - } - - // Begin encrypted connection - if (!stream_socket_enable_crypto( - $this->smtp_conn, - true, - $crypto_method - )) { - return false; - } - return true; - } - - /** - * Perform SMTP authentication. - * Must be run after hello(). - * @see hello() - * @param string $username The user name - * @param string $password The password - * @param string $authtype The auth type (PLAIN, LOGIN, CRAM-MD5) - * @param string $realm The auth realm for NTLM - * @param string $workstation The auth workstation for NTLM - * @param null|OAuth $OAuth An optional OAuth instance (@see PHPMailerOAuth) - * @return bool True if successfully authenticated.* @access public - */ - public function authenticate( - $username, - $password, - $authtype = null, - $realm = '', - $workstation = '', - $OAuth = null - ) { - if (!$this->server_caps) { - $this->setError('Authentication is not allowed before HELO/EHLO'); - return false; - } - - if (array_key_exists('EHLO', $this->server_caps)) { - // SMTP extensions are available. Let's try to find a proper authentication method - - if (!array_key_exists('AUTH', $this->server_caps)) { - $this->setError('Authentication is not allowed at this stage'); - // 'at this stage' means that auth may be allowed after the stage changes - // e.g. after STARTTLS - return false; - } - - self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL); - self::edebug( - 'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']), - self::DEBUG_LOWLEVEL - ); - - if (empty($authtype)) { - foreach (array('CRAM-MD5', 'LOGIN', 'PLAIN') as $method) { - if (in_array($method, $this->server_caps['AUTH'])) { - $authtype = $method; - break; - } - } - if (empty($authtype)) { - $this->setError('No supported authentication methods found'); - return false; - } - self::edebug('Auth method selected: '.$authtype, self::DEBUG_LOWLEVEL); - } - - if (!in_array($authtype, $this->server_caps['AUTH'])) { - $this->setError("The requested authentication method \"$authtype\" is not supported by the server"); - return false; - } - } elseif (empty($authtype)) { - $authtype = 'LOGIN'; - } - switch ($authtype) { - case 'PLAIN': - // Start authentication - if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) { - return false; - } - // Send encoded username and password - if (!$this->sendCommand( - 'User & Password', - base64_encode("\0" . $username . "\0" . $password), - 235 - ) - ) { - return false; - } - break; - case 'LOGIN': - // Start authentication - if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) { - return false; - } - if (!$this->sendCommand("Username", base64_encode($username), 334)) { - return false; - } - if (!$this->sendCommand("Password", base64_encode($password), 235)) { - return false; - } - break; - case 'CRAM-MD5': - // Start authentication - if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) { - return false; - } - // Get the challenge - $challenge = base64_decode(substr($this->last_reply, 4)); - - // Build the response - $response = $username . ' ' . $this->hmac($challenge, $password); - - // send encoded credentials - return $this->sendCommand('Username', base64_encode($response), 235); - default: - $this->setError("Authentication method \"$authtype\" is not supported"); - return false; - } - return true; - } - - /** - * Calculate an MD5 HMAC hash. - * Works like hash_hmac('md5', $data, $key) - * in case that function is not available - * @param string $data The data to hash - * @param string $key The key to hash with - * @access protected - * @return string - */ - protected function hmac($data, $key) - { - if (function_exists('hash_hmac')) { - return hash_hmac('md5', $data, $key); - } - - // The following borrowed from - // http://php.net/manual/en/function.mhash.php#27225 - - // RFC 2104 HMAC implementation for php. - // Creates an md5 HMAC. - // Eliminates the need to install mhash to compute a HMAC - // by Lance Rushing - - $bytelen = 64; // byte length for md5 - if (strlen($key) > $bytelen) { - $key = pack('H*', md5($key)); - } - $key = str_pad($key, $bytelen, chr(0x00)); - $ipad = str_pad('', $bytelen, chr(0x36)); - $opad = str_pad('', $bytelen, chr(0x5c)); - $k_ipad = $key ^ $ipad; - $k_opad = $key ^ $opad; - - return md5($k_opad . pack('H*', md5($k_ipad . $data))); - } - - /** - * Check connection state. - * @access public - * @return boolean True if connected. - */ - public function connected() - { - if (is_resource($this->smtp_conn)) { - $sock_status = stream_get_meta_data($this->smtp_conn); - if ($sock_status['eof']) { - // The socket is valid but we are not connected - $this->edebug( - 'SMTP NOTICE: EOF caught while checking if connected', - self::DEBUG_CLIENT - ); - $this->close(); - return false; - } - return true; // everything looks good - } - return false; - } - - /** - * Close the socket and clean up the state of the class. - * Don't use this function without first trying to use QUIT. - * @see quit() - * @access public - * @return void - */ - public function close() - { - $this->setError(''); - $this->server_caps = null; - $this->helo_rply = null; - if (is_resource($this->smtp_conn)) { - // close the connection and cleanup - fclose($this->smtp_conn); - $this->smtp_conn = null; //Makes for cleaner serialization - $this->edebug('Connection: closed', self::DEBUG_CONNECTION); - } - } - - /** - * Send an SMTP DATA command. - * Issues a data command and sends the msg_data to the server, - * finializing the mail transaction. $msg_data is the message - * that is to be send with the headers. Each header needs to be - * on a single line followed by a <CRLF> with the message headers - * and the message body being separated by and additional <CRLF>. - * Implements rfc 821: DATA <CRLF> - * @param string $msg_data Message data to send - * @access public - * @return boolean - */ - public function data($msg_data) - { - //This will use the standard timelimit - if (!$this->sendCommand('DATA', 'DATA', 354)) { - return false; - } - - /* The server is ready to accept data! - * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF) - * so we will break the data up into lines by \r and/or \n then if needed we will break each of those into - * smaller lines to fit within the limit. - * We will also look for lines that start with a '.' and prepend an additional '.'. - * NOTE: this does not count towards line-length limit. - */ - - // Normalize line breaks before exploding - $lines = explode("\n", str_replace(array("\r\n", "\r"), "\n", $msg_data)); - - /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field - * of the first line (':' separated) does not contain a space then it _should_ be a header and we will - * process all lines before a blank line as headers. - */ - - $field = substr($lines[0], 0, strpos($lines[0], ':')); - $in_headers = false; - if (!empty($field) && strpos($field, ' ') === false) { - $in_headers = true; - } - - foreach ($lines as $line) { - $lines_out = array(); - if ($in_headers and $line == '') { - $in_headers = false; - } - //Break this line up into several smaller lines if it's too long - //Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len), - while (isset($line[self::MAX_LINE_LENGTH])) { - //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on - //so as to avoid breaking in the middle of a word - $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' '); - //Deliberately matches both false and 0 - if (!$pos) { - //No nice break found, add a hard break - $pos = self::MAX_LINE_LENGTH - 1; - $lines_out[] = substr($line, 0, $pos); - $line = substr($line, $pos); - } else { - //Break at the found point - $lines_out[] = substr($line, 0, $pos); - //Move along by the amount we dealt with - $line = substr($line, $pos + 1); - } - //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1 - if ($in_headers) { - $line = "\t" . $line; - } - } - $lines_out[] = $line; - - //Send the lines to the server - foreach ($lines_out as $line_out) { - //RFC2821 section 4.5.2 - if (!empty($line_out) and $line_out[0] == '.') { - $line_out = '.' . $line_out; - } - $this->client_send($line_out . self::CRLF); - } - } - - //Message data has been sent, complete the command - //Increase timelimit for end of DATA command - $savetimelimit = $this->Timelimit; - $this->Timelimit = $this->Timelimit * 2; - $result = $this->sendCommand('DATA END', '.', 250); - //Restore timelimit - $this->Timelimit = $savetimelimit; - return $result; - } - - /** - * Send an SMTP HELO or EHLO command. - * Used to identify the sending server to the receiving server. - * This makes sure that client and server are in a known state. - * Implements RFC 821: HELO <SP> <domain> <CRLF> - * and RFC 2821 EHLO. - * @param string $host The host name or IP to connect to - * @access public - * @return boolean - */ - public function hello($host = '') - { - //Try extended hello first (RFC 2821) - return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host)); - } - - /** - * Send an SMTP HELO or EHLO command. - * Low-level implementation used by hello() - * @see hello() - * @param string $hello The HELO string - * @param string $host The hostname to say we are - * @access protected - * @return boolean - */ - protected function sendHello($hello, $host) - { - $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250); - $this->helo_rply = $this->last_reply; - if ($noerror) { - $this->parseHelloFields($hello); - } else { - $this->server_caps = null; - } - return $noerror; - } - - /** - * Parse a reply to HELO/EHLO command to discover server extensions. - * In case of HELO, the only parameter that can be discovered is a server name. - * @access protected - * @param string $type - 'HELO' or 'EHLO' - */ - protected function parseHelloFields($type) - { - $this->server_caps = array(); - $lines = explode("\n", $this->helo_rply); - - foreach ($lines as $n => $s) { - //First 4 chars contain response code followed by - or space - $s = trim(substr($s, 4)); - if (empty($s)) { - continue; - } - $fields = explode(' ', $s); - if (!empty($fields)) { - if (!$n) { - $name = $type; - $fields = $fields[0]; - } else { - $name = array_shift($fields); - switch ($name) { - case 'SIZE': - $fields = ($fields ? $fields[0] : 0); - break; - case 'AUTH': - if (!is_array($fields)) { - $fields = array(); - } - break; - default: - $fields = true; - } - } - $this->server_caps[$name] = $fields; - } - } - } - - /** - * Send an SMTP MAIL command. - * Starts a mail transaction from the email address specified in - * $from. Returns true if successful or false otherwise. If True - * the mail transaction is started and then one or more recipient - * commands may be called followed by a data command. - * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF> - * @param string $from Source address of this message - * @access public - * @return boolean - */ - public function mail($from) - { - $useVerp = ($this->do_verp ? ' XVERP' : ''); - return $this->sendCommand( - 'MAIL FROM', - 'MAIL FROM:<' . $from . '>' . $useVerp, - 250 - ); - } - - /** - * Send an SMTP QUIT command. - * Closes the socket if there is no error or the $close_on_error argument is true. - * Implements from rfc 821: QUIT <CRLF> - * @param boolean $close_on_error Should the connection close if an error occurs? - * @access public - * @return boolean - */ - public function quit($close_on_error = true) - { - $noerror = $this->sendCommand('QUIT', 'QUIT', 221); - $err = $this->error; //Save any error - if ($noerror or $close_on_error) { - $this->close(); - $this->error = $err; //Restore any error from the quit command - } - return $noerror; - } - - /** - * Send an SMTP RCPT command. - * Sets the TO argument to $toaddr. - * Returns true if the recipient was accepted false if it was rejected. - * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF> - * @param string $address The address the message is being sent to - * @access public - * @return boolean - */ - public function recipient($address) - { - return $this->sendCommand( - 'RCPT TO', - 'RCPT TO:<' . $address . '>', - array(250, 251) - ); - } - - /** - * Send an SMTP RSET command. - * Abort any transaction that is currently in progress. - * Implements rfc 821: RSET <CRLF> - * @access public - * @return boolean True on success. - */ - public function reset() - { - return $this->sendCommand('RSET', 'RSET', 250); - } - - /** - * Send a command to an SMTP server and check its return code. - * @param string $command The command name - not sent to the server - * @param string $commandstring The actual command to send - * @param integer|array $expect One or more expected integer success codes - * @access protected - * @return boolean True on success. - */ - protected function sendCommand($command, $commandstring, $expect) - { - if (!$this->connected()) { - $this->setError("Called $command without being connected"); - return false; - } - //Reject line breaks in all commands - if (strpos($commandstring, "\n") !== false or strpos($commandstring, "\r") !== false) { - $this->setError("Command '$command' contained line breaks"); - return false; - } - $this->client_send($commandstring . self::CRLF); - - $this->last_reply = $this->get_lines(); - // Fetch SMTP code and possible error code explanation - $matches = array(); - if (preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/", $this->last_reply, $matches)) { - $code = $matches[1]; - $code_ex = (count($matches) > 2 ? $matches[2] : null); - // Cut off error code from each response line - $detail = preg_replace( - "/{$code}[ -]".($code_ex ? str_replace('.', '\\.', $code_ex).' ' : '')."/m", - '', - $this->last_reply - ); - } else { - // Fall back to simple parsing if regex fails - $code = substr($this->last_reply, 0, 3); - $code_ex = null; - $detail = substr($this->last_reply, 4); - } - - $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER); - - if (!in_array($code, (array)$expect)) { - $this->setError( - "$command command failed", - $detail, - $code, - $code_ex - ); - $this->edebug( - 'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply, - self::DEBUG_CLIENT - ); - return false; - } - - $this->setError(''); - return true; - } - - /** - * Send an SMTP SAML command. - * Starts a mail transaction from the email address specified in $from. - * Returns true if successful or false otherwise. If True - * the mail transaction is started and then one or more recipient - * commands may be called followed by a data command. This command - * will send the message to the users terminal if they are logged - * in and send them an email. - * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF> - * @param string $from The address the message is from - * @access public - * @return boolean - */ - public function sendAndMail($from) - { - return $this->sendCommand('SAML', "SAML FROM:$from", 250); - } - - /** - * Send an SMTP VRFY command. - * @param string $name The name to verify - * @access public - * @return boolean - */ - public function verify($name) - { - return $this->sendCommand('VRFY', "VRFY $name", array(250, 251)); - } - - /** - * Send an SMTP NOOP command. - * Used to keep keep-alives alive, doesn't actually do anything - * @access public - * @return boolean - */ - public function noop() - { - return $this->sendCommand('NOOP', 'NOOP', 250); - } - - /** - * Send an SMTP TURN command. - * This is an optional command for SMTP that this class does not support. - * This method is here to make the RFC821 Definition complete for this class - * and _may_ be implemented in future - * Implements from rfc 821: TURN <CRLF> - * @access public - * @return boolean - */ - public function turn() - { - $this->setError('The SMTP TURN command is not implemented'); - $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT); - return false; - } - - /** - * Send raw data to the server. - * @param string $data The data to send - * @access public - * @return integer|boolean The number of bytes sent to the server or false on error - */ - public function client_send($data) - { - $this->edebug("CLIENT -> SERVER: $data", self::DEBUG_CLIENT); - return fwrite($this->smtp_conn, $data); - } - - /** - * Get the latest error. - * @access public - * @return array - */ - public function getError() - { - return $this->error; - } - - /** - * Get SMTP extensions available on the server - * @access public - * @return array|null - */ - public function getServerExtList() - { - return $this->server_caps; - } - - /** - * A multipurpose method - * The method works in three ways, dependent on argument value and current state - * 1. HELO/EHLO was not sent - returns null and set up $this->error - * 2. HELO was sent - * $name = 'HELO': returns server name - * $name = 'EHLO': returns boolean false - * $name = any string: returns null and set up $this->error - * 3. EHLO was sent - * $name = 'HELO'|'EHLO': returns server name - * $name = any string: if extension $name exists, returns boolean True - * or its options. Otherwise returns boolean False - * In other words, one can use this method to detect 3 conditions: - * - null returned: handshake was not or we don't know about ext (refer to $this->error) - * - false returned: the requested feature exactly not exists - * - positive value returned: the requested feature exists - * @param string $name Name of SMTP extension or 'HELO'|'EHLO' - * @return mixed - */ - public function getServerExt($name) - { - if (!$this->server_caps) { - $this->setError('No HELO/EHLO was sent'); - return null; - } - - // the tight logic knot ;) - if (!array_key_exists($name, $this->server_caps)) { - if ($name == 'HELO') { - return $this->server_caps['EHLO']; - } - if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) { - return false; - } - $this->setError('HELO handshake was used. Client knows nothing about server extensions'); - return null; - } - - return $this->server_caps[$name]; - } - - /** - * Get the last reply from the server. - * @access public - * @return string - */ - public function getLastReply() - { - return $this->last_reply; - } - - /** - * Read the SMTP server's response. - * Either before eof or socket timeout occurs on the operation. - * With SMTP we can tell if we have more lines to read if the - * 4th character is '-' symbol. If it is a space then we don't - * need to read anything else. - * @access protected - * @return string - */ - protected function get_lines() - { - // If the connection is bad, give up straight away - if (!is_resource($this->smtp_conn)) { - return ''; - } - $data = ''; - $endtime = 0; - stream_set_timeout($this->smtp_conn, $this->Timeout); - if ($this->Timelimit > 0) { - $endtime = time() + $this->Timelimit; - } - while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) { - $str = @fgets($this->smtp_conn, 515); - $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL); - $this->edebug("SMTP -> get_lines(): \$str is \"$str\"", self::DEBUG_LOWLEVEL); - $data .= $str; - // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen - if ((isset($str[3]) and $str[3] == ' ')) { - break; - } - // Timed-out? Log and break - $info = stream_get_meta_data($this->smtp_conn); - if ($info['timed_out']) { - $this->edebug( - 'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)', - self::DEBUG_LOWLEVEL - ); - break; - } - // Now check if reads took too long - if ($endtime and time() > $endtime) { - $this->edebug( - 'SMTP -> get_lines(): timelimit reached ('. - $this->Timelimit . ' sec)', - self::DEBUG_LOWLEVEL - ); - break; - } - } - return $data; - } - - /** - * Enable or disable VERP address generation. - * @param boolean $enabled - */ - public function setVerp($enabled = false) - { - $this->do_verp = $enabled; - } - - /** - * Get VERP address generation mode. - * @return boolean - */ - public function getVerp() - { - return $this->do_verp; - } - - /** - * Set error messages and codes. - * @param string $message The error message - * @param string $detail Further detail on the error - * @param string $smtp_code An associated SMTP error code - * @param string $smtp_code_ex Extended SMTP code - */ - protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '') - { - $this->error = array( - 'error' => $message, - 'detail' => $detail, - 'smtp_code' => $smtp_code, - 'smtp_code_ex' => $smtp_code_ex - ); - } - - /** - * Set debug output method. - * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it. - */ - public function setDebugOutput($method = 'echo') - { - $this->Debugoutput = $method; - } - - /** - * Get debug output method. - * @return string - */ - public function getDebugOutput() - { - return $this->Debugoutput; - } - - /** - * Set debug output level. - * @param integer $level - */ - public function setDebugLevel($level = 0) - { - $this->do_debug = $level; - } - - /** - * Get debug output level. - * @return integer - */ - public function getDebugLevel() - { - return $this->do_debug; - } - - /** - * Set SMTP timeout. - * @param integer $timeout - */ - public function setTimeout($timeout = 0) - { - $this->Timeout = $timeout; - } - - /** - * Get SMTP timeout. - * @return integer - */ - public function getTimeout() - { - return $this->Timeout; - } - - /** - * Reports an error number and string. - * @param integer $errno The error number returned by PHP. - * @param string $errmsg The error message returned by PHP. - */ - protected function errorHandler($errno, $errmsg) - { - $notice = 'Connection: Failed to connect to server.'; - $this->setError( - $notice, - $errno, - $errmsg - ); - $this->edebug( - $notice . ' Error number ' . $errno . '. "Error notice: ' . $errmsg, - self::DEBUG_CONNECTION - ); - } - - /** - * Will return the ID of the last smtp transaction based on a list of patterns provided - * in SMTP::$smtp_transaction_id_patterns. - * If no reply has been received yet, it will return null. - * If no pattern has been matched, it will return false. - * @return bool|null|string - */ - public function getLastTransactionID() - { - $reply = $this->getLastReply(); - - if (empty($reply)) { - return null; - } - - foreach($this->smtp_transaction_id_patterns as $smtp_transaction_id_pattern) { - if(preg_match($smtp_transaction_id_pattern, $reply, $matches)) { - return $matches[1]; - } - } - - return false; - } -} diff --git a/wp/wp-includes/class-snoopy.php b/wp/wp-includes/class-snoopy.php deleted file mode 100644 index f26eb0e2..00000000 --- a/wp/wp-includes/class-snoopy.php +++ /dev/null @@ -1,1259 +0,0 @@ -<?php - -/** - * Deprecated. Use WP_HTTP (http.php) instead. - */ -_deprecated_file( basename( __FILE__ ), '3.0.0', WPINC . '/http.php' ); - -if ( ! class_exists( 'Snoopy', false ) ) : -/************************************************* - -Snoopy - the PHP net client -Author: Monte Ohrt <monte@ispi.net> -Copyright (c): 1999-2008 New Digital Group, all rights reserved -Version: 1.2.4 - - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -You may contact the author of Snoopy by e-mail at: -monte@ohrt.com - -The latest version of Snoopy can be obtained from: -http://snoopy.sourceforge.net/ - -*************************************************/ - -class Snoopy -{ - /**** Public variables ****/ - - /* user definable vars */ - - var $host = "www.php.net"; // host name we are connecting to - var $port = 80; // port we are connecting to - var $proxy_host = ""; // proxy host to use - var $proxy_port = ""; // proxy port to use - var $proxy_user = ""; // proxy user to use - var $proxy_pass = ""; // proxy password to use - - var $agent = "Snoopy v1.2.4"; // agent we masquerade as - var $referer = ""; // referer info to pass - var $cookies = array(); // array of cookies to pass - // $cookies["username"]="joe"; - var $rawheaders = array(); // array of raw headers to send - // $rawheaders["Content-type"]="text/html"; - - var $maxredirs = 5; // http redirection depth maximum. 0 = disallow - var $lastredirectaddr = ""; // contains address of last redirected address - var $offsiteok = true; // allows redirection off-site - var $maxframes = 0; // frame content depth maximum. 0 = disallow - var $expandlinks = true; // expand links to fully qualified URLs. - // this only applies to fetchlinks() - // submitlinks(), and submittext() - var $passcookies = true; // pass set cookies back through redirects - // NOTE: this currently does not respect - // dates, domains or paths. - - var $user = ""; // user for http authentication - var $pass = ""; // password for http authentication - - // http accept types - var $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; - - var $results = ""; // where the content is put - - var $error = ""; // error messages sent here - var $response_code = ""; // response code returned from server - var $headers = array(); // headers returned from server sent here - var $maxlength = 500000; // max return data length (body) - var $read_timeout = 0; // timeout on read operations, in seconds - // supported only since PHP 4 Beta 4 - // set to 0 to disallow timeouts - var $timed_out = false; // if a read operation timed out - var $status = 0; // http request status - - var $temp_dir = "/tmp"; // temporary directory that the webserver - // has permission to write to. - // under Windows, this should be C:\temp - - var $curl_path = "/usr/local/bin/curl"; - // Snoopy will use cURL for fetching - // SSL content if a full system path to - // the cURL binary is supplied here. - // set to false if you do not have - // cURL installed. See http://curl.haxx.se - // for details on installing cURL. - // Snoopy does *not* use the cURL - // library functions built into php, - // as these functions are not stable - // as of this Snoopy release. - - /**** Private variables ****/ - - var $_maxlinelen = 4096; // max line length (headers) - - var $_httpmethod = "GET"; // default http request method - var $_httpversion = "HTTP/1.0"; // default http request version - var $_submit_method = "POST"; // default submit method - var $_submit_type = "application/x-www-form-urlencoded"; // default submit type - var $_mime_boundary = ""; // MIME boundary for multipart/form-data submit type - var $_redirectaddr = false; // will be set if page fetched is a redirect - var $_redirectdepth = 0; // increments on an http redirect - var $_frameurls = array(); // frame src urls - var $_framedepth = 0; // increments on frame depth - - var $_isproxy = false; // set if using a proxy server - var $_fp_timeout = 30; // timeout for socket connection - -/*======================================================================*\ - Function: fetch - Purpose: fetch the contents of a web page - (and possibly other protocols in the - future like ftp, nntp, gopher, etc.) - Input: $URI the location of the page to fetch - Output: $this->results the output text from the fetch -\*======================================================================*/ - - function fetch($URI) - { - - //preg_match("|^([^:]+)://([^:/]+)(:[\d]+)*(.*)|",$URI,$URI_PARTS); - $URI_PARTS = parse_url($URI); - if (!empty($URI_PARTS["user"])) - $this->user = $URI_PARTS["user"]; - if (!empty($URI_PARTS["pass"])) - $this->pass = $URI_PARTS["pass"]; - if (empty($URI_PARTS["query"])) - $URI_PARTS["query"] = ''; - if (empty($URI_PARTS["path"])) - $URI_PARTS["path"] = ''; - - switch(strtolower($URI_PARTS["scheme"])) - { - case "http": - $this->host = $URI_PARTS["host"]; - if(!empty($URI_PARTS["port"])) - $this->port = $URI_PARTS["port"]; - if($this->_connect($fp)) - { - if($this->_isproxy) - { - // using proxy, send entire URI - $this->_httprequest($URI,$fp,$URI,$this->_httpmethod); - } - else - { - $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); - // no proxy, send only the path - $this->_httprequest($path, $fp, $URI, $this->_httpmethod); - } - - $this->_disconnect($fp); - - if($this->_redirectaddr) - { - /* url was redirected, check if we've hit the max depth */ - if($this->maxredirs > $this->_redirectdepth) - { - // only follow redirect if it's on this site, or offsiteok is true - if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) - { - /* follow the redirect */ - $this->_redirectdepth++; - $this->lastredirectaddr=$this->_redirectaddr; - $this->fetch($this->_redirectaddr); - } - } - } - - if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) - { - $frameurls = $this->_frameurls; - $this->_frameurls = array(); - - while(list(,$frameurl) = each($frameurls)) - { - if($this->_framedepth < $this->maxframes) - { - $this->fetch($frameurl); - $this->_framedepth++; - } - else - break; - } - } - } - else - { - return false; - } - return true; - break; - case "https": - if(!$this->curl_path) - return false; - if(function_exists("is_executable")) - if (!is_executable($this->curl_path)) - return false; - $this->host = $URI_PARTS["host"]; - if(!empty($URI_PARTS["port"])) - $this->port = $URI_PARTS["port"]; - if($this->_isproxy) - { - // using proxy, send entire URI - $this->_httpsrequest($URI,$URI,$this->_httpmethod); - } - else - { - $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); - // no proxy, send only the path - $this->_httpsrequest($path, $URI, $this->_httpmethod); - } - - if($this->_redirectaddr) - { - /* url was redirected, check if we've hit the max depth */ - if($this->maxredirs > $this->_redirectdepth) - { - // only follow redirect if it's on this site, or offsiteok is true - if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) - { - /* follow the redirect */ - $this->_redirectdepth++; - $this->lastredirectaddr=$this->_redirectaddr; - $this->fetch($this->_redirectaddr); - } - } - } - - if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) - { - $frameurls = $this->_frameurls; - $this->_frameurls = array(); - - while(list(,$frameurl) = each($frameurls)) - { - if($this->_framedepth < $this->maxframes) - { - $this->fetch($frameurl); - $this->_framedepth++; - } - else - break; - } - } - return true; - break; - default: - // not a valid protocol - $this->error = 'Invalid protocol "'.$URI_PARTS["scheme"].'"\n'; - return false; - break; - } - return true; - } - -/*======================================================================*\ - Function: submit - Purpose: submit an http form - Input: $URI the location to post the data - $formvars the formvars to use. - format: $formvars["var"] = "val"; - $formfiles an array of files to submit - format: $formfiles["var"] = "/dir/filename.ext"; - Output: $this->results the text output from the post -\*======================================================================*/ - - function submit($URI, $formvars="", $formfiles="") - { - unset($postdata); - - $postdata = $this->_prepare_post_body($formvars, $formfiles); - - $URI_PARTS = parse_url($URI); - if (!empty($URI_PARTS["user"])) - $this->user = $URI_PARTS["user"]; - if (!empty($URI_PARTS["pass"])) - $this->pass = $URI_PARTS["pass"]; - if (empty($URI_PARTS["query"])) - $URI_PARTS["query"] = ''; - if (empty($URI_PARTS["path"])) - $URI_PARTS["path"] = ''; - - switch(strtolower($URI_PARTS["scheme"])) - { - case "http": - $this->host = $URI_PARTS["host"]; - if(!empty($URI_PARTS["port"])) - $this->port = $URI_PARTS["port"]; - if($this->_connect($fp)) - { - if($this->_isproxy) - { - // using proxy, send entire URI - $this->_httprequest($URI,$fp,$URI,$this->_submit_method,$this->_submit_type,$postdata); - } - else - { - $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); - // no proxy, send only the path - $this->_httprequest($path, $fp, $URI, $this->_submit_method, $this->_submit_type, $postdata); - } - - $this->_disconnect($fp); - - if($this->_redirectaddr) - { - /* url was redirected, check if we've hit the max depth */ - if($this->maxredirs > $this->_redirectdepth) - { - if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr)) - $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]); - - // only follow redirect if it's on this site, or offsiteok is true - if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) - { - /* follow the redirect */ - $this->_redirectdepth++; - $this->lastredirectaddr=$this->_redirectaddr; - if( strpos( $this->_redirectaddr, "?" ) > 0 ) - $this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get - else - $this->submit($this->_redirectaddr,$formvars, $formfiles); - } - } - } - - if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) - { - $frameurls = $this->_frameurls; - $this->_frameurls = array(); - - while(list(,$frameurl) = each($frameurls)) - { - if($this->_framedepth < $this->maxframes) - { - $this->fetch($frameurl); - $this->_framedepth++; - } - else - break; - } - } - - } - else - { - return false; - } - return true; - break; - case "https": - if(!$this->curl_path) - return false; - if(function_exists("is_executable")) - if (!is_executable($this->curl_path)) - return false; - $this->host = $URI_PARTS["host"]; - if(!empty($URI_PARTS["port"])) - $this->port = $URI_PARTS["port"]; - if($this->_isproxy) - { - // using proxy, send entire URI - $this->_httpsrequest($URI, $URI, $this->_submit_method, $this->_submit_type, $postdata); - } - else - { - $path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : ""); - // no proxy, send only the path - $this->_httpsrequest($path, $URI, $this->_submit_method, $this->_submit_type, $postdata); - } - - if($this->_redirectaddr) - { - /* url was redirected, check if we've hit the max depth */ - if($this->maxredirs > $this->_redirectdepth) - { - if(!preg_match("|^".$URI_PARTS["scheme"]."://|", $this->_redirectaddr)) - $this->_redirectaddr = $this->_expandlinks($this->_redirectaddr,$URI_PARTS["scheme"]."://".$URI_PARTS["host"]); - - // only follow redirect if it's on this site, or offsiteok is true - if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok) - { - /* follow the redirect */ - $this->_redirectdepth++; - $this->lastredirectaddr=$this->_redirectaddr; - if( strpos( $this->_redirectaddr, "?" ) > 0 ) - $this->fetch($this->_redirectaddr); // the redirect has changed the request method from post to get - else - $this->submit($this->_redirectaddr,$formvars, $formfiles); - } - } - } - - if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0) - { - $frameurls = $this->_frameurls; - $this->_frameurls = array(); - - while(list(,$frameurl) = each($frameurls)) - { - if($this->_framedepth < $this->maxframes) - { - $this->fetch($frameurl); - $this->_framedepth++; - } - else - break; - } - } - return true; - break; - - default: - // not a valid protocol - $this->error = 'Invalid protocol "'.$URI_PARTS["scheme"].'"\n'; - return false; - break; - } - return true; - } - -/*======================================================================*\ - Function: fetchlinks - Purpose: fetch the links from a web page - Input: $URI where you are fetching from - Output: $this->results an array of the URLs -\*======================================================================*/ - - function fetchlinks($URI) - { - if ($this->fetch($URI)) - { - if($this->lastredirectaddr) - $URI = $this->lastredirectaddr; - if(is_array($this->results)) - { - for($x=0;$x<count($this->results);$x++) - $this->results[$x] = $this->_striplinks($this->results[$x]); - } - else - $this->results = $this->_striplinks($this->results); - - if($this->expandlinks) - $this->results = $this->_expandlinks($this->results, $URI); - return true; - } - else - return false; - } - -/*======================================================================*\ - Function: fetchform - Purpose: fetch the form elements from a web page - Input: $URI where you are fetching from - Output: $this->results the resulting html form -\*======================================================================*/ - - function fetchform($URI) - { - - if ($this->fetch($URI)) - { - - if(is_array($this->results)) - { - for($x=0;$x<count($this->results);$x++) - $this->results[$x] = $this->_stripform($this->results[$x]); - } - else - $this->results = $this->_stripform($this->results); - - return true; - } - else - return false; - } - - -/*======================================================================*\ - Function: fetchtext - Purpose: fetch the text from a web page, stripping the links - Input: $URI where you are fetching from - Output: $this->results the text from the web page -\*======================================================================*/ - - function fetchtext($URI) - { - if($this->fetch($URI)) - { - if(is_array($this->results)) - { - for($x=0;$x<count($this->results);$x++) - $this->results[$x] = $this->_striptext($this->results[$x]); - } - else - $this->results = $this->_striptext($this->results); - return true; - } - else - return false; - } - -/*======================================================================*\ - Function: submitlinks - Purpose: grab links from a form submission - Input: $URI where you are submitting from - Output: $this->results an array of the links from the post -\*======================================================================*/ - - function submitlinks($URI, $formvars="", $formfiles="") - { - if($this->submit($URI,$formvars, $formfiles)) - { - if($this->lastredirectaddr) - $URI = $this->lastredirectaddr; - if(is_array($this->results)) - { - for($x=0;$x<count($this->results);$x++) - { - $this->results[$x] = $this->_striplinks($this->results[$x]); - if($this->expandlinks) - $this->results[$x] = $this->_expandlinks($this->results[$x],$URI); - } - } - else - { - $this->results = $this->_striplinks($this->results); - if($this->expandlinks) - $this->results = $this->_expandlinks($this->results,$URI); - } - return true; - } - else - return false; - } - -/*======================================================================*\ - Function: submittext - Purpose: grab text from a form submission - Input: $URI where you are submitting from - Output: $this->results the text from the web page -\*======================================================================*/ - - function submittext($URI, $formvars = "", $formfiles = "") - { - if($this->submit($URI,$formvars, $formfiles)) - { - if($this->lastredirectaddr) - $URI = $this->lastredirectaddr; - if(is_array($this->results)) - { - for($x=0;$x<count($this->results);$x++) - { - $this->results[$x] = $this->_striptext($this->results[$x]); - if($this->expandlinks) - $this->results[$x] = $this->_expandlinks($this->results[$x],$URI); - } - } - else - { - $this->results = $this->_striptext($this->results); - if($this->expandlinks) - $this->results = $this->_expandlinks($this->results,$URI); - } - return true; - } - else - return false; - } - - - -/*======================================================================*\ - Function: set_submit_multipart - Purpose: Set the form submission content type to - multipart/form-data -\*======================================================================*/ - function set_submit_multipart() - { - $this->_submit_type = "multipart/form-data"; - } - - -/*======================================================================*\ - Function: set_submit_normal - Purpose: Set the form submission content type to - application/x-www-form-urlencoded -\*======================================================================*/ - function set_submit_normal() - { - $this->_submit_type = "application/x-www-form-urlencoded"; - } - - - - -/*======================================================================*\ - Private functions -\*======================================================================*/ - - -/*======================================================================*\ - Function: _striplinks - Purpose: strip the hyperlinks from an html document - Input: $document document to strip. - Output: $match an array of the links -\*======================================================================*/ - - function _striplinks($document) - { - preg_match_all("'<\s*a\s.*?href\s*=\s* # find <a href= - ([\"\'])? # find single or double quote - (?(1) (.*?)\\1 | ([^\s\>]+)) # if quote found, match up to next matching - # quote, otherwise match up to next space - 'isx",$document,$links); - - - // catenate the non-empty matches from the conditional subpattern - - while(list($key,$val) = each($links[2])) - { - if(!empty($val)) - $match[] = $val; - } - - while(list($key,$val) = each($links[3])) - { - if(!empty($val)) - $match[] = $val; - } - - // return the links - return $match; - } - -/*======================================================================*\ - Function: _stripform - Purpose: strip the form elements from an html document - Input: $document document to strip. - Output: $match an array of the links -\*======================================================================*/ - - function _stripform($document) - { - preg_match_all("'<\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\/?(option|select)[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$document,$elements); - - // catenate the matches - $match = implode("\r\n",$elements[0]); - - // return the links - return $match; - } - - - -/*======================================================================*\ - Function: _striptext - Purpose: strip the text from an html document - Input: $document document to strip. - Output: $text the resulting text -\*======================================================================*/ - - function _striptext($document) - { - - // I didn't use preg eval (//e) since that is only available in PHP 4.0. - // so, list your entities one by one here. I included some of the - // more common ones. - - $search = array("'<script[^>]*?>.*?</script>'si", // strip out javascript - "'<[\/\!]*?[^<>]*?>'si", // strip out html tags - "'([\r\n])[\s]+'", // strip out white space - "'&(quot|#34|#034|#x22);'i", // replace html entities - "'&(amp|#38|#038|#x26);'i", // added hexadecimal values - "'&(lt|#60|#060|#x3c);'i", - "'&(gt|#62|#062|#x3e);'i", - "'&(nbsp|#160|#xa0);'i", - "'&(iexcl|#161);'i", - "'&(cent|#162);'i", - "'&(pound|#163);'i", - "'&(copy|#169);'i", - "'&(reg|#174);'i", - "'&(deg|#176);'i", - "'&(#39|#039|#x27);'", - "'&(euro|#8364);'i", // europe - "'&a(uml|UML);'", // german - "'&o(uml|UML);'", - "'&u(uml|UML);'", - "'&A(uml|UML);'", - "'&O(uml|UML);'", - "'&U(uml|UML);'", - "'ß'i", - ); - $replace = array( "", - "", - "\\1", - "\"", - "&", - "<", - ">", - " ", - chr(161), - chr(162), - chr(163), - chr(169), - chr(174), - chr(176), - chr(39), - chr(128), - chr(0xE4), // ANSI ä - chr(0xF6), // ANSI ö - chr(0xFC), // ANSI ü - chr(0xC4), // ANSI Ä - chr(0xD6), // ANSI Ö - chr(0xDC), // ANSI Ü - chr(0xDF), // ANSI ß - ); - - $text = preg_replace($search,$replace,$document); - - return $text; - } - -/*======================================================================*\ - Function: _expandlinks - Purpose: expand each link into a fully qualified URL - Input: $links the links to qualify - $URI the full URI to get the base from - Output: $expandedLinks the expanded links -\*======================================================================*/ - - function _expandlinks($links,$URI) - { - - preg_match("/^[^\?]+/",$URI,$match); - - $match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]); - $match = preg_replace("|/$|","",$match); - $match_part = parse_url($match); - $match_root = - $match_part["scheme"]."://".$match_part["host"]; - - $search = array( "|^http://".preg_quote($this->host)."|i", - "|^(\/)|i", - "|^(?!http://)(?!mailto:)|i", - "|/\./|", - "|/[^\/]+/\.\./|" - ); - - $replace = array( "", - $match_root."/", - $match."/", - "/", - "/" - ); - - $expandedLinks = preg_replace($search,$replace,$links); - - return $expandedLinks; - } - -/*======================================================================*\ - Function: _httprequest - Purpose: go get the http data from the server - Input: $url the url to fetch - $fp the current open file pointer - $URI the full URI - $body body contents to send if any (POST) - Output: -\*======================================================================*/ - - function _httprequest($url,$fp,$URI,$http_method,$content_type="",$body="") - { - $cookie_headers = ''; - if($this->passcookies && $this->_redirectaddr) - $this->setcookies(); - - $URI_PARTS = parse_url($URI); - if(empty($url)) - $url = "/"; - $headers = $http_method." ".$url." ".$this->_httpversion."\r\n"; - if(!empty($this->agent)) - $headers .= "User-Agent: ".$this->agent."\r\n"; - if(!empty($this->host) && !isset($this->rawheaders['Host'])) { - $headers .= "Host: ".$this->host; - if(!empty($this->port) && $this->port != 80) - $headers .= ":".$this->port; - $headers .= "\r\n"; - } - if(!empty($this->accept)) - $headers .= "Accept: ".$this->accept."\r\n"; - if(!empty($this->referer)) - $headers .= "Referer: ".$this->referer."\r\n"; - if(!empty($this->cookies)) - { - if(!is_array($this->cookies)) - $this->cookies = (array)$this->cookies; - - reset($this->cookies); - if ( count($this->cookies) > 0 ) { - $cookie_headers .= 'Cookie: '; - foreach ( $this->cookies as $cookieKey => $cookieVal ) { - $cookie_headers .= $cookieKey."=".urlencode($cookieVal)."; "; - } - $headers .= substr($cookie_headers,0,-2) . "\r\n"; - } - } - if(!empty($this->rawheaders)) - { - if(!is_array($this->rawheaders)) - $this->rawheaders = (array)$this->rawheaders; - while(list($headerKey,$headerVal) = each($this->rawheaders)) - $headers .= $headerKey.": ".$headerVal."\r\n"; - } - if(!empty($content_type)) { - $headers .= "Content-type: $content_type"; - if ($content_type == "multipart/form-data") - $headers .= "; boundary=".$this->_mime_boundary; - $headers .= "\r\n"; - } - if(!empty($body)) - $headers .= "Content-length: ".strlen($body)."\r\n"; - if(!empty($this->user) || !empty($this->pass)) - $headers .= "Authorization: Basic ".base64_encode($this->user.":".$this->pass)."\r\n"; - - //add proxy auth headers - if(!empty($this->proxy_user)) - $headers .= 'Proxy-Authorization: ' . 'Basic ' . base64_encode($this->proxy_user . ':' . $this->proxy_pass)."\r\n"; - - - $headers .= "\r\n"; - - // set the read timeout if needed - if ($this->read_timeout > 0) - socket_set_timeout($fp, $this->read_timeout); - $this->timed_out = false; - - fwrite($fp,$headers.$body,strlen($headers.$body)); - - $this->_redirectaddr = false; - unset($this->headers); - - while($currentHeader = fgets($fp,$this->_maxlinelen)) - { - if ($this->read_timeout > 0 && $this->_check_timeout($fp)) - { - $this->status=-100; - return false; - } - - if($currentHeader == "\r\n") - break; - - // if a header begins with Location: or URI:, set the redirect - if(preg_match("/^(Location:|URI:)/i",$currentHeader)) - { - // get URL portion of the redirect - preg_match("/^(Location:|URI:)[ ]+(.*)/i",chop($currentHeader),$matches); - // look for :// in the Location header to see if hostname is included - if(!preg_match("|\:\/\/|",$matches[2])) - { - // no host in the path, so prepend - $this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port; - // eliminate double slash - if(!preg_match("|^/|",$matches[2])) - $this->_redirectaddr .= "/".$matches[2]; - else - $this->_redirectaddr .= $matches[2]; - } - else - $this->_redirectaddr = $matches[2]; - } - - if(preg_match("|^HTTP/|",$currentHeader)) - { - if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$currentHeader, $status)) - { - $this->status= $status[1]; - } - $this->response_code = $currentHeader; - } - - $this->headers[] = $currentHeader; - } - - $results = ''; - do { - $_data = fread($fp, $this->maxlength); - if (strlen($_data) == 0) { - break; - } - $results .= $_data; - } while(true); - - if ($this->read_timeout > 0 && $this->_check_timeout($fp)) - { - $this->status=-100; - return false; - } - - // check if there is a redirect meta tag - - if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match)) - - { - $this->_redirectaddr = $this->_expandlinks($match[1],$URI); - } - - // have we hit our frame depth and is there frame src to fetch? - if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match)) - { - $this->results[] = $results; - for($x=0; $x<count($match[1]); $x++) - $this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host); - } - // have we already fetched framed content? - elseif(is_array($this->results)) - $this->results[] = $results; - // no framed content - else - $this->results = $results; - - return true; - } - -/*======================================================================*\ - Function: _httpsrequest - Purpose: go get the https data from the server using curl - Input: $url the url to fetch - $URI the full URI - $body body contents to send if any (POST) - Output: -\*======================================================================*/ - - function _httpsrequest($url,$URI,$http_method,$content_type="",$body="") - { - if($this->passcookies && $this->_redirectaddr) - $this->setcookies(); - - $headers = array(); - - $URI_PARTS = parse_url($URI); - if(empty($url)) - $url = "/"; - // GET ... header not needed for curl - //$headers[] = $http_method." ".$url." ".$this->_httpversion; - if(!empty($this->agent)) - $headers[] = "User-Agent: ".$this->agent; - if(!empty($this->host)) - if(!empty($this->port)) - $headers[] = "Host: ".$this->host.":".$this->port; - else - $headers[] = "Host: ".$this->host; - if(!empty($this->accept)) - $headers[] = "Accept: ".$this->accept; - if(!empty($this->referer)) - $headers[] = "Referer: ".$this->referer; - if(!empty($this->cookies)) - { - if(!is_array($this->cookies)) - $this->cookies = (array)$this->cookies; - - reset($this->cookies); - if ( count($this->cookies) > 0 ) { - $cookie_str = 'Cookie: '; - foreach ( $this->cookies as $cookieKey => $cookieVal ) { - $cookie_str .= $cookieKey."=".urlencode($cookieVal)."; "; - } - $headers[] = substr($cookie_str,0,-2); - } - } - if(!empty($this->rawheaders)) - { - if(!is_array($this->rawheaders)) - $this->rawheaders = (array)$this->rawheaders; - while(list($headerKey,$headerVal) = each($this->rawheaders)) - $headers[] = $headerKey.": ".$headerVal; - } - if(!empty($content_type)) { - if ($content_type == "multipart/form-data") - $headers[] = "Content-type: $content_type; boundary=".$this->_mime_boundary; - else - $headers[] = "Content-type: $content_type"; - } - if(!empty($body)) - $headers[] = "Content-length: ".strlen($body); - if(!empty($this->user) || !empty($this->pass)) - $headers[] = "Authorization: BASIC ".base64_encode($this->user.":".$this->pass); - - $headerfile = tempnam( $this->temp_dir, "sno" ); - $cmdline_params = '-k -D ' . escapeshellarg( $headerfile ); - - foreach ( $headers as $header ) { - $cmdline_params .= ' -H ' . escapeshellarg( $header ); - } - - if ( ! empty( $body ) ) { - $cmdline_params .= ' -d ' . escapeshellarg( $body ); - } - - if ( $this->read_timeout > 0 ) { - $cmdline_params .= ' -m ' . escapeshellarg( $this->read_timeout ); - } - - - exec( $this->curl_path . ' ' . $cmdline_params . ' ' . escapeshellarg( $URI ), $results, $return ); - - if($return) - { - $this->error = "Error: cURL could not retrieve the document, error $return."; - return false; - } - - - $results = implode("\r\n",$results); - - $result_headers = file("$headerfile"); - - $this->_redirectaddr = false; - unset($this->headers); - - for($currentHeader = 0; $currentHeader < count($result_headers); $currentHeader++) - { - - // if a header begins with Location: or URI:, set the redirect - if(preg_match("/^(Location: |URI: )/i",$result_headers[$currentHeader])) - { - // get URL portion of the redirect - preg_match("/^(Location: |URI:)\s+(.*)/",chop($result_headers[$currentHeader]),$matches); - // look for :// in the Location header to see if hostname is included - if(!preg_match("|\:\/\/|",$matches[2])) - { - // no host in the path, so prepend - $this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port; - // eliminate double slash - if(!preg_match("|^/|",$matches[2])) - $this->_redirectaddr .= "/".$matches[2]; - else - $this->_redirectaddr .= $matches[2]; - } - else - $this->_redirectaddr = $matches[2]; - } - - if(preg_match("|^HTTP/|",$result_headers[$currentHeader])) - $this->response_code = $result_headers[$currentHeader]; - - $this->headers[] = $result_headers[$currentHeader]; - } - - // check if there is a redirect meta tag - - if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]*URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match)) - { - $this->_redirectaddr = $this->_expandlinks($match[1],$URI); - } - - // have we hit our frame depth and is there frame src to fetch? - if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match)) - { - $this->results[] = $results; - for($x=0; $x<count($match[1]); $x++) - $this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host); - } - // have we already fetched framed content? - elseif(is_array($this->results)) - $this->results[] = $results; - // no framed content - else - $this->results = $results; - - unlink("$headerfile"); - - return true; - } - -/*======================================================================*\ - Function: setcookies() - Purpose: set cookies for a redirection -\*======================================================================*/ - - function setcookies() - { - for($x=0; $x<count($this->headers); $x++) - { - if(preg_match('/^set-cookie:[\s]+([^=]+)=([^;]+)/i', $this->headers[$x],$match)) - $this->cookies[$match[1]] = urldecode($match[2]); - } - } - - -/*======================================================================*\ - Function: _check_timeout - Purpose: checks whether timeout has occurred - Input: $fp file pointer -\*======================================================================*/ - - function _check_timeout($fp) - { - if ($this->read_timeout > 0) { - $fp_status = socket_get_status($fp); - if ($fp_status["timed_out"]) { - $this->timed_out = true; - return true; - } - } - return false; - } - -/*======================================================================*\ - Function: _connect - Purpose: make a socket connection - Input: $fp file pointer -\*======================================================================*/ - - function _connect(&$fp) - { - if(!empty($this->proxy_host) && !empty($this->proxy_port)) - { - $this->_isproxy = true; - - $host = $this->proxy_host; - $port = $this->proxy_port; - } - else - { - $host = $this->host; - $port = $this->port; - } - - $this->status = 0; - - if($fp = fsockopen( - $host, - $port, - $errno, - $errstr, - $this->_fp_timeout - )) - { - // socket connection succeeded - - return true; - } - else - { - // socket connection failed - $this->status = $errno; - switch($errno) - { - case -3: - $this->error="socket creation failed (-3)"; - case -4: - $this->error="dns lookup failure (-4)"; - case -5: - $this->error="connection refused or timed out (-5)"; - default: - $this->error="connection failed (".$errno.")"; - } - return false; - } - } -/*======================================================================*\ - Function: _disconnect - Purpose: disconnect a socket connection - Input: $fp file pointer -\*======================================================================*/ - - function _disconnect($fp) - { - return(fclose($fp)); - } - - -/*======================================================================*\ - Function: _prepare_post_body - Purpose: Prepare post body according to encoding type - Input: $formvars - form variables - $formfiles - form upload files - Output: post body -\*======================================================================*/ - - function _prepare_post_body($formvars, $formfiles) - { - settype($formvars, "array"); - settype($formfiles, "array"); - $postdata = ''; - - if (count($formvars) == 0 && count($formfiles) == 0) - return; - - switch ($this->_submit_type) { - case "application/x-www-form-urlencoded": - reset($formvars); - while(list($key,$val) = each($formvars)) { - if (is_array($val) || is_object($val)) { - while (list($cur_key, $cur_val) = each($val)) { - $postdata .= urlencode($key)."[]=".urlencode($cur_val)."&"; - } - } else - $postdata .= urlencode($key)."=".urlencode($val)."&"; - } - break; - - case "multipart/form-data": - $this->_mime_boundary = "Snoopy".md5(uniqid(microtime())); - - reset($formvars); - while(list($key,$val) = each($formvars)) { - if (is_array($val) || is_object($val)) { - while (list($cur_key, $cur_val) = each($val)) { - $postdata .= "--".$this->_mime_boundary."\r\n"; - $postdata .= "Content-Disposition: form-data; name=\"$key\[\]\"\r\n\r\n"; - $postdata .= "$cur_val\r\n"; - } - } else { - $postdata .= "--".$this->_mime_boundary."\r\n"; - $postdata .= "Content-Disposition: form-data; name=\"$key\"\r\n\r\n"; - $postdata .= "$val\r\n"; - } - } - - reset($formfiles); - while (list($field_name, $file_names) = each($formfiles)) { - settype($file_names, "array"); - while (list(, $file_name) = each($file_names)) { - if (!is_readable($file_name)) continue; - - $fp = fopen($file_name, "r"); - $file_content = fread($fp, filesize($file_name)); - fclose($fp); - $base_name = basename($file_name); - - $postdata .= "--".$this->_mime_boundary."\r\n"; - $postdata .= "Content-Disposition: form-data; name=\"$field_name\"; filename=\"$base_name\"\r\n\r\n"; - $postdata .= "$file_content\r\n"; - } - } - $postdata .= "--".$this->_mime_boundary."--\r\n"; - break; - } - - return $postdata; - } -} -endif; -?> diff --git a/wp/wp-includes/class-walker-category-dropdown.php b/wp/wp-includes/class-walker-category-dropdown.php deleted file mode 100644 index 7d89dc8b..00000000 --- a/wp/wp-includes/class-walker-category-dropdown.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php -/** - * Taxonomy API: Walker_CategoryDropdown class - * - * @package WordPress - * @subpackage Template - * @since 4.4.0 - */ - -/** - * Core class used to create an HTML dropdown list of Categories. - * - * @since 2.1.0 - * - * @see Walker - */ -class Walker_CategoryDropdown extends Walker { - - /** - * What the class handles. - * - * @since 2.1.0 - * @access private - * @var string - * - * @see Walker::$tree_type - */ - public $tree_type = 'category'; - - /** - * Database fields to use. - * - * @since 2.1.0 - * @access public - * @todo Decouple this - * @var array - * - * @see Walker::$db_fields - */ - public $db_fields = array ('parent' => 'parent', 'id' => 'term_id'); - - /** - * Starts the element output. - * - * @since 2.1.0 - * @access public - * - * @see Walker::start_el() - * - * @param string $output Passed by reference. Used to append additional content. - * @param object $category Category data object. - * @param int $depth Depth of category. Used for padding. - * @param array $args Uses 'selected', 'show_count', and 'value_field' keys, if they exist. - * See wp_dropdown_categories(). - * @param int $id Optional. ID of the current category. Default 0 (unused). - */ - public function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) { - $pad = str_repeat(' ', $depth * 3); - - /** This filter is documented in wp-includes/category-template.php */ - $cat_name = apply_filters( 'list_cats', $category->name, $category ); - - if ( isset( $args['value_field'] ) && isset( $category->{$args['value_field']} ) ) { - $value_field = $args['value_field']; - } else { - $value_field = 'term_id'; - } - - $output .= "\t<option class=\"level-$depth\" value=\"" . esc_attr( $category->{$value_field} ) . "\""; - - // Type-juggling causes false matches, so we force everything to a string. - if ( (string) $category->{$value_field} === (string) $args['selected'] ) - $output .= ' selected="selected"'; - $output .= '>'; - $output .= $pad.$cat_name; - if ( $args['show_count'] ) - $output .= '  ('. number_format_i18n( $category->count ) .')'; - $output .= "</option>\n"; - } -} diff --git a/wp/wp-includes/class-walker-category.php b/wp/wp-includes/class-walker-category.php deleted file mode 100644 index 01b7264f..00000000 --- a/wp/wp-includes/class-walker-category.php +++ /dev/null @@ -1,235 +0,0 @@ -<?php -/** - * Taxonomy API: Walker_Category class - * - * @package WordPress - * @subpackage Template - * @since 4.4.0 - */ - -/** - * Core class used to create an HTML list of categories. - * - * @since 2.1.0 - * - * @see Walker - */ -class Walker_Category extends Walker { - - /** - * What the class handles. - * - * @since 2.1.0 - * @access public - * @var string - * - * @see Walker::$tree_type - */ - public $tree_type = 'category'; - - /** - * Database fields to use. - * - * @since 2.1.0 - * @access public - * @var array - * - * @see Walker::$db_fields - * @todo Decouple this - */ - public $db_fields = array ('parent' => 'parent', 'id' => 'term_id'); - - /** - * Starts the list before the elements are added. - * - * @since 2.1.0 - * @access public - * - * @see Walker::start_lvl() - * - * @param string $output Used to append additional content. Passed by reference. - * @param int $depth Optional. Depth of category. Used for tab indentation. Default 0. - * @param array $args Optional. An array of arguments. Will only append content if style argument - * value is 'list'. See wp_list_categories(). Default empty array. - */ - public function start_lvl( &$output, $depth = 0, $args = array() ) { - if ( 'list' != $args['style'] ) - return; - - $indent = str_repeat("\t", $depth); - $output .= "$indent<ul class='children'>\n"; - } - - /** - * Ends the list of after the elements are added. - * - * @since 2.1.0 - * @access public - * - * @see Walker::end_lvl() - * - * @param string $output Used to append additional content. Passed by reference. - * @param int $depth Optional. Depth of category. Used for tab indentation. Default 0. - * @param array $args Optional. An array of arguments. Will only append content if style argument - * value is 'list'. See wp_list_categories(). Default empty array. - */ - public function end_lvl( &$output, $depth = 0, $args = array() ) { - if ( 'list' != $args['style'] ) - return; - - $indent = str_repeat("\t", $depth); - $output .= "$indent</ul>\n"; - } - - /** - * Starts the element output. - * - * @since 2.1.0 - * @access public - * - * @see Walker::start_el() - * - * @param string $output Passed by reference. Used to append additional content. - * @param object $category Category data object. - * @param int $depth Optional. Depth of category in reference to parents. Default 0. - * @param array $args Optional. An array of arguments. See wp_list_categories(). Default empty array. - * @param int $id Optional. ID of the current category. Default 0. - */ - public function start_el( &$output, $category, $depth = 0, $args = array(), $id = 0 ) { - /** This filter is documented in wp-includes/category-template.php */ - $cat_name = apply_filters( - 'list_cats', - esc_attr( $category->name ), - $category - ); - - // Don't generate an element if the category name is empty. - if ( ! $cat_name ) { - return; - } - - $link = '<a href="' . esc_url( get_term_link( $category ) ) . '" '; - if ( $args['use_desc_for_title'] && ! empty( $category->description ) ) { - /** - * Filters the category description for display. - * - * @since 1.2.0 - * - * @param string $description Category description. - * @param object $category Category object. - */ - $link .= 'title="' . esc_attr( strip_tags( apply_filters( 'category_description', $category->description, $category ) ) ) . '"'; - } - - $link .= '>'; - $link .= $cat_name . '</a>'; - - if ( ! empty( $args['feed_image'] ) || ! empty( $args['feed'] ) ) { - $link .= ' '; - - if ( empty( $args['feed_image'] ) ) { - $link .= '('; - } - - $link .= '<a href="' . esc_url( get_term_feed_link( $category->term_id, $category->taxonomy, $args['feed_type'] ) ) . '"'; - - if ( empty( $args['feed'] ) ) { - $alt = ' alt="' . sprintf(__( 'Feed for all posts filed under %s' ), $cat_name ) . '"'; - } else { - $alt = ' alt="' . $args['feed'] . '"'; - $name = $args['feed']; - $link .= empty( $args['title'] ) ? '' : $args['title']; - } - - $link .= '>'; - - if ( empty( $args['feed_image'] ) ) { - $link .= $name; - } else { - $link .= "<img src='" . $args['feed_image'] . "'$alt" . ' />'; - } - $link .= '</a>'; - - if ( empty( $args['feed_image'] ) ) { - $link .= ')'; - } - } - - if ( ! empty( $args['show_count'] ) ) { - $link .= ' (' . number_format_i18n( $category->count ) . ')'; - } - if ( 'list' == $args['style'] ) { - $output .= "\t<li"; - $css_classes = array( - 'cat-item', - 'cat-item-' . $category->term_id, - ); - - if ( ! empty( $args['current_category'] ) ) { - // 'current_category' can be an array, so we use `get_terms()`. - $_current_terms = get_terms( $category->taxonomy, array( - 'include' => $args['current_category'], - 'hide_empty' => false, - ) ); - - foreach ( $_current_terms as $_current_term ) { - if ( $category->term_id == $_current_term->term_id ) { - $css_classes[] = 'current-cat'; - } elseif ( $category->term_id == $_current_term->parent ) { - $css_classes[] = 'current-cat-parent'; - } - while ( $_current_term->parent ) { - if ( $category->term_id == $_current_term->parent ) { - $css_classes[] = 'current-cat-ancestor'; - break; - } - $_current_term = get_term( $_current_term->parent, $category->taxonomy ); - } - } - } - - /** - * Filters the list of CSS classes to include with each category in the list. - * - * @since 4.2.0 - * - * @see wp_list_categories() - * - * @param array $css_classes An array of CSS classes to be applied to each list item. - * @param object $category Category data object. - * @param int $depth Depth of page, used for padding. - * @param array $args An array of wp_list_categories() arguments. - */ - $css_classes = implode( ' ', apply_filters( 'category_css_class', $css_classes, $category, $depth, $args ) ); - - $output .= ' class="' . $css_classes . '"'; - $output .= ">$link\n"; - } elseif ( isset( $args['separator'] ) ) { - $output .= "\t$link" . $args['separator'] . "\n"; - } else { - $output .= "\t$link<br />\n"; - } - } - - /** - * Ends the element output, if needed. - * - * @since 2.1.0 - * @access public - * - * @see Walker::end_el() - * - * @param string $output Passed by reference. Used to append additional content. - * @param object $page Not used. - * @param int $depth Optional. Depth of category. Not used. - * @param array $args Optional. An array of arguments. Only uses 'list' for whether should append - * to output. See wp_list_categories(). Default empty array. - */ - public function end_el( &$output, $page, $depth = 0, $args = array() ) { - if ( 'list' != $args['style'] ) - return; - - $output .= "</li>\n"; - } - -} diff --git a/wp/wp-includes/class-walker-comment.php b/wp/wp-includes/class-walker-comment.php deleted file mode 100644 index 8383740b..00000000 --- a/wp/wp-includes/class-walker-comment.php +++ /dev/null @@ -1,374 +0,0 @@ -<?php -/** - * Comment API: Walker_Comment class - * - * @package WordPress - * @subpackage Comments - * @since 4.4.0 - */ - -/** - * Core walker class used to create an HTML list of comments. - * - * @since 2.7.0 - * - * @see Walker - */ -class Walker_Comment extends Walker { - - /** - * What the class handles. - * - * @since 2.7.0 - * @access public - * @var string - * - * @see Walker::$tree_type - */ - public $tree_type = 'comment'; - - /** - * Database fields to use. - * - * @since 2.7.0 - * @access public - * @var array - * - * @see Walker::$db_fields - * @todo Decouple this - */ - public $db_fields = array ('parent' => 'comment_parent', 'id' => 'comment_ID'); - - /** - * Starts the list before the elements are added. - * - * @since 2.7.0 - * @access public - * - * @see Walker::start_lvl() - * @global int $comment_depth - * - * @param string $output Passed by reference. Used to append additional content. - * @param int $depth Optional. Depth of the current comment. Default 0. - * @param array $args Optional. Uses 'style' argument for type of HTML list. Default empty array. - */ - public function start_lvl( &$output, $depth = 0, $args = array() ) { - $GLOBALS['comment_depth'] = $depth + 1; - - switch ( $args['style'] ) { - case 'div': - break; - case 'ol': - $output .= '<ol class="children">' . "\n"; - break; - case 'ul': - default: - $output .= '<ul class="children">' . "\n"; - break; - } - } - - /** - * Ends the list of items after the elements are added. - * - * @since 2.7.0 - * @access public - * - * @see Walker::end_lvl() - * @global int $comment_depth - * - * @param string $output Passed by reference. Used to append additional content. - * @param int $depth Optional. Depth of the current comment. Default 0. - * @param array $args Optional. Will only append content if style argument value is 'ol' or 'ul'. - * Default empty array. - */ - public function end_lvl( &$output, $depth = 0, $args = array() ) { - $GLOBALS['comment_depth'] = $depth + 1; - - switch ( $args['style'] ) { - case 'div': - break; - case 'ol': - $output .= "</ol><!-- .children -->\n"; - break; - case 'ul': - default: - $output .= "</ul><!-- .children -->\n"; - break; - } - } - - /** - * Traverses elements to create list from elements. - * - * This function is designed to enhance Walker::display_element() to - * display children of higher nesting levels than selected inline on - * the highest depth level displayed. This prevents them being orphaned - * at the end of the comment list. - * - * Example: max_depth = 2, with 5 levels of nested content. - * 1 - * 1.1 - * 1.1.1 - * 1.1.1.1 - * 1.1.1.1.1 - * 1.1.2 - * 1.1.2.1 - * 2 - * 2.2 - * - * @since 2.7.0 - * @access public - * - * @see Walker::display_element() - * @see wp_list_comments() - * - * @param WP_Comment $element Comment data object. - * @param array $children_elements List of elements to continue traversing. Passed by reference. - * @param int $max_depth Max depth to traverse. - * @param int $depth Depth of the current element. - * @param array $args An array of arguments. - * @param string $output Used to append additional content. Passed by reference. - */ - public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) { - if ( !$element ) - return; - - $id_field = $this->db_fields['id']; - $id = $element->$id_field; - - parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output ); - - /* - * If at the max depth, and the current element still has children, loop over those - * and display them at this level. This is to prevent them being orphaned to the end - * of the list. - */ - if ( $max_depth <= $depth + 1 && isset( $children_elements[$id]) ) { - foreach ( $children_elements[ $id ] as $child ) - $this->display_element( $child, $children_elements, $max_depth, $depth, $args, $output ); - - unset( $children_elements[ $id ] ); - } - - } - - /** - * Starts the element output. - * - * @since 2.7.0 - * @access public - * - * @see Walker::start_el() - * @see wp_list_comments() - * @global int $comment_depth - * @global WP_Comment $comment - * - * @param string $output Used to append additional content. Passed by reference. - * @param WP_Comment $comment Comment data object. - * @param int $depth Optional. Depth of the current comment in reference to parents. Default 0. - * @param array $args Optional. An array of arguments. Default empty array. - * @param int $id Optional. ID of the current comment. Default 0 (unused). - */ - public function start_el( &$output, $comment, $depth = 0, $args = array(), $id = 0 ) { - $depth++; - $GLOBALS['comment_depth'] = $depth; - $GLOBALS['comment'] = $comment; - - if ( !empty( $args['callback'] ) ) { - ob_start(); - call_user_func( $args['callback'], $comment, $args, $depth ); - $output .= ob_get_clean(); - return; - } - - if ( ( 'pingback' == $comment->comment_type || 'trackback' == $comment->comment_type ) && $args['short_ping'] ) { - ob_start(); - $this->ping( $comment, $depth, $args ); - $output .= ob_get_clean(); - } elseif ( 'html5' === $args['format'] ) { - ob_start(); - $this->html5_comment( $comment, $depth, $args ); - $output .= ob_get_clean(); - } else { - ob_start(); - $this->comment( $comment, $depth, $args ); - $output .= ob_get_clean(); - } - } - - /** - * Ends the element output, if needed. - * - * @since 2.7.0 - * @access public - * - * @see Walker::end_el() - * @see wp_list_comments() - * - * @param string $output Used to append additional content. Passed by reference. - * @param WP_Comment $comment The current comment object. Default current comment. - * @param int $depth Optional. Depth of the current comment. Default 0. - * @param array $args Optional. An array of arguments. Default empty array. - */ - public function end_el( &$output, $comment, $depth = 0, $args = array() ) { - if ( !empty( $args['end-callback'] ) ) { - ob_start(); - call_user_func( $args['end-callback'], $comment, $args, $depth ); - $output .= ob_get_clean(); - return; - } - if ( 'div' == $args['style'] ) - $output .= "</div><!-- #comment-## -->\n"; - else - $output .= "</li><!-- #comment-## -->\n"; - } - - /** - * Outputs a pingback comment. - * - * @since 3.6.0 - * @access protected - * - * @see wp_list_comments() - * - * @param WP_Comment $comment The comment object. - * @param int $depth Depth of the current comment. - * @param array $args An array of arguments. - */ - protected function ping( $comment, $depth, $args ) { - $tag = ( 'div' == $args['style'] ) ? 'div' : 'li'; -?> - <<?php echo $tag; ?> id="comment-<?php comment_ID(); ?>" <?php comment_class( '', $comment ); ?>> - <div class="comment-body"> - <?php _e( 'Pingback:' ); ?> <?php comment_author_link( $comment ); ?> <?php edit_comment_link( __( 'Edit' ), '<span class="edit-link">', '</span>' ); ?> - </div> -<?php - } - - /** - * Outputs a single comment. - * - * @since 3.6.0 - * @access protected - * - * @see wp_list_comments() - * - * @param WP_Comment $comment Comment to display. - * @param int $depth Depth of the current comment. - * @param array $args An array of arguments. - */ - protected function comment( $comment, $depth, $args ) { - if ( 'div' == $args['style'] ) { - $tag = 'div'; - $add_below = 'comment'; - } else { - $tag = 'li'; - $add_below = 'div-comment'; - } -?> - <<?php echo $tag; ?> <?php comment_class( $this->has_children ? 'parent' : '', $comment ); ?> id="comment-<?php comment_ID(); ?>"> - <?php if ( 'div' != $args['style'] ) : ?> - <div id="div-comment-<?php comment_ID(); ?>" class="comment-body"> - <?php endif; ?> - <div class="comment-author vcard"> - <?php if ( 0 != $args['avatar_size'] ) echo get_avatar( $comment, $args['avatar_size'] ); ?> - <?php - /* translators: %s: comment author link */ - printf( __( '%s <span class="says">says:</span>' ), - sprintf( '<cite class="fn">%s</cite>', get_comment_author_link( $comment ) ) - ); - ?> - </div> - <?php if ( '0' == $comment->comment_approved ) : ?> - <em class="comment-awaiting-moderation"><?php _e( 'Your comment is awaiting moderation.' ) ?></em> - <br /> - <?php endif; ?> - - <div class="comment-meta commentmetadata"><a href="<?php echo esc_url( get_comment_link( $comment, $args ) ); ?>"> - <?php - /* translators: 1: comment date, 2: comment time */ - printf( __( '%1$s at %2$s' ), get_comment_date( '', $comment ), get_comment_time() ); ?></a><?php edit_comment_link( __( '(Edit)' ), '  ', '' ); - ?> - </div> - - <?php comment_text( $comment, array_merge( $args, array( 'add_below' => $add_below, 'depth' => $depth, 'max_depth' => $args['max_depth'] ) ) ); ?> - - <?php - comment_reply_link( array_merge( $args, array( - 'add_below' => $add_below, - 'depth' => $depth, - 'max_depth' => $args['max_depth'], - 'before' => '<div class="reply">', - 'after' => '</div>' - ) ) ); - ?> - - <?php if ( 'div' != $args['style'] ) : ?> - </div> - <?php endif; ?> -<?php - } - - /** - * Outputs a comment in the HTML5 format. - * - * @since 3.6.0 - * @access protected - * - * @see wp_list_comments() - * - * @param WP_Comment $comment Comment to display. - * @param int $depth Depth of the current comment. - * @param array $args An array of arguments. - */ - protected function html5_comment( $comment, $depth, $args ) { - $tag = ( 'div' === $args['style'] ) ? 'div' : 'li'; -?> - <<?php echo $tag; ?> id="comment-<?php comment_ID(); ?>" <?php comment_class( $this->has_children ? 'parent' : '', $comment ); ?>> - <article id="div-comment-<?php comment_ID(); ?>" class="comment-body"> - <footer class="comment-meta"> - <div class="comment-author vcard"> - <?php if ( 0 != $args['avatar_size'] ) echo get_avatar( $comment, $args['avatar_size'] ); ?> - <?php - /* translators: %s: comment author link */ - printf( __( '%s <span class="says">says:</span>' ), - sprintf( '<b class="fn">%s</b>', get_comment_author_link( $comment ) ) - ); - ?> - </div><!-- .comment-author --> - - <div class="comment-metadata"> - <a href="<?php echo esc_url( get_comment_link( $comment, $args ) ); ?>"> - <time datetime="<?php comment_time( 'c' ); ?>"> - <?php - /* translators: 1: comment date, 2: comment time */ - printf( __( '%1$s at %2$s' ), get_comment_date( '', $comment ), get_comment_time() ); - ?> - </time> - </a> - <?php edit_comment_link( __( 'Edit' ), '<span class="edit-link">', '</span>' ); ?> - </div><!-- .comment-metadata --> - - <?php if ( '0' == $comment->comment_approved ) : ?> - <p class="comment-awaiting-moderation"><?php _e( 'Your comment is awaiting moderation.' ); ?></p> - <?php endif; ?> - </footer><!-- .comment-meta --> - - <div class="comment-content"> - <?php comment_text(); ?> - </div><!-- .comment-content --> - - <?php - comment_reply_link( array_merge( $args, array( - 'add_below' => 'div-comment', - 'depth' => $depth, - 'max_depth' => $args['max_depth'], - 'before' => '<div class="reply">', - 'after' => '</div>' - ) ) ); - ?> - </article><!-- .comment-body --> -<?php - } -} diff --git a/wp/wp-includes/class-walker-nav-menu.php b/wp/wp-includes/class-walker-nav-menu.php deleted file mode 100644 index 4c1a1f2c..00000000 --- a/wp/wp-includes/class-walker-nav-menu.php +++ /dev/null @@ -1,250 +0,0 @@ -<?php -/** - * Nav Menu API: Walker_Nav_Menu class - * - * @package WordPress - * @subpackage Nav_Menus - * @since 4.6.0 - */ - -/** - * Core class used to implement an HTML list of nav menu items. - * - * @since 3.0.0 - * - * @see Walker - */ -class Walker_Nav_Menu extends Walker { - /** - * What the class handles. - * - * @since 3.0.0 - * @access public - * @var string - * - * @see Walker::$tree_type - */ - public $tree_type = array( 'post_type', 'taxonomy', 'custom' ); - - /** - * Database fields to use. - * - * @since 3.0.0 - * @access public - * @todo Decouple this. - * @var array - * - * @see Walker::$db_fields - */ - public $db_fields = array( 'parent' => 'menu_item_parent', 'id' => 'db_id' ); - - /** - * Starts the list before the elements are added. - * - * @since 3.0.0 - * - * @see Walker::start_lvl() - * - * @param string $output Passed by reference. Used to append additional content. - * @param int $depth Depth of menu item. Used for padding. - * @param stdClass $args An object of wp_nav_menu() arguments. - */ - public function start_lvl( &$output, $depth = 0, $args = array() ) { - if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) { - $t = ''; - $n = ''; - } else { - $t = "\t"; - $n = "\n"; - } - $indent = str_repeat( $t, $depth ); - $output .= "{$n}{$indent}<ul class=\"sub-menu\">{$n}"; - } - - /** - * Ends the list of after the elements are added. - * - * @since 3.0.0 - * - * @see Walker::end_lvl() - * - * @param string $output Passed by reference. Used to append additional content. - * @param int $depth Depth of menu item. Used for padding. - * @param stdClass $args An object of wp_nav_menu() arguments. - */ - public function end_lvl( &$output, $depth = 0, $args = array() ) { - if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) { - $t = ''; - $n = ''; - } else { - $t = "\t"; - $n = "\n"; - } - $indent = str_repeat( $t, $depth ); - $output .= "$indent</ul>{$n}"; - } - - /** - * Starts the element output. - * - * @since 3.0.0 - * @since 4.4.0 The {@see 'nav_menu_item_args'} filter was added. - * - * @see Walker::start_el() - * - * @param string $output Passed by reference. Used to append additional content. - * @param WP_Post $item Menu item data object. - * @param int $depth Depth of menu item. Used for padding. - * @param stdClass $args An object of wp_nav_menu() arguments. - * @param int $id Current item ID. - */ - public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) { - if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) { - $t = ''; - $n = ''; - } else { - $t = "\t"; - $n = "\n"; - } - $indent = ( $depth ) ? str_repeat( $t, $depth ) : ''; - - $classes = empty( $item->classes ) ? array() : (array) $item->classes; - $classes[] = 'menu-item-' . $item->ID; - - /** - * Filters the arguments for a single nav menu item. - * - * @since 4.4.0 - * - * @param stdClass $args An object of wp_nav_menu() arguments. - * @param WP_Post $item Menu item data object. - * @param int $depth Depth of menu item. Used for padding. - */ - $args = apply_filters( 'nav_menu_item_args', $args, $item, $depth ); - - /** - * Filters the CSS class(es) applied to a menu item's list item element. - * - * @since 3.0.0 - * @since 4.1.0 The `$depth` parameter was added. - * - * @param array $classes The CSS classes that are applied to the menu item's `<li>` element. - * @param WP_Post $item The current menu item. - * @param stdClass $args An object of wp_nav_menu() arguments. - * @param int $depth Depth of menu item. Used for padding. - */ - $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) ); - $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : ''; - - /** - * Filters the ID applied to a menu item's list item element. - * - * @since 3.0.1 - * @since 4.1.0 The `$depth` parameter was added. - * - * @param string $menu_id The ID that is applied to the menu item's `<li>` element. - * @param WP_Post $item The current menu item. - * @param stdClass $args An object of wp_nav_menu() arguments. - * @param int $depth Depth of menu item. Used for padding. - */ - $id = apply_filters( 'nav_menu_item_id', 'menu-item-'. $item->ID, $item, $args, $depth ); - $id = $id ? ' id="' . esc_attr( $id ) . '"' : ''; - - $output .= $indent . '<li' . $id . $class_names .'>'; - - $atts = array(); - $atts['title'] = ! empty( $item->attr_title ) ? $item->attr_title : ''; - $atts['target'] = ! empty( $item->target ) ? $item->target : ''; - $atts['rel'] = ! empty( $item->xfn ) ? $item->xfn : ''; - $atts['href'] = ! empty( $item->url ) ? $item->url : ''; - - /** - * Filters the HTML attributes applied to a menu item's anchor element. - * - * @since 3.6.0 - * @since 4.1.0 The `$depth` parameter was added. - * - * @param array $atts { - * The HTML attributes applied to the menu item's `<a>` element, empty strings are ignored. - * - * @type string $title Title attribute. - * @type string $target Target attribute. - * @type string $rel The rel attribute. - * @type string $href The href attribute. - * } - * @param WP_Post $item The current menu item. - * @param stdClass $args An object of wp_nav_menu() arguments. - * @param int $depth Depth of menu item. Used for padding. - */ - $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth ); - - $attributes = ''; - foreach ( $atts as $attr => $value ) { - if ( ! empty( $value ) ) { - $value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value ); - $attributes .= ' ' . $attr . '="' . $value . '"'; - } - } - - /** This filter is documented in wp-includes/post-template.php */ - $title = apply_filters( 'the_title', $item->title, $item->ID ); - - /** - * Filters a menu item's title. - * - * @since 4.4.0 - * - * @param string $title The menu item's title. - * @param WP_Post $item The current menu item. - * @param stdClass $args An object of wp_nav_menu() arguments. - * @param int $depth Depth of menu item. Used for padding. - */ - $title = apply_filters( 'nav_menu_item_title', $title, $item, $args, $depth ); - - $item_output = $args->before; - $item_output .= '<a'. $attributes .'>'; - $item_output .= $args->link_before . $title . $args->link_after; - $item_output .= '</a>'; - $item_output .= $args->after; - - /** - * Filters a menu item's starting output. - * - * The menu item's starting output only includes `$args->before`, the opening `<a>`, - * the menu item's title, the closing `</a>`, and `$args->after`. Currently, there is - * no filter for modifying the opening and closing `<li>` for a menu item. - * - * @since 3.0.0 - * - * @param string $item_output The menu item's starting HTML output. - * @param WP_Post $item Menu item data object. - * @param int $depth Depth of menu item. Used for padding. - * @param stdClass $args An object of wp_nav_menu() arguments. - */ - $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args ); - } - - /** - * Ends the element output, if needed. - * - * @since 3.0.0 - * - * @see Walker::end_el() - * - * @param string $output Passed by reference. Used to append additional content. - * @param WP_Post $item Page data object. Not used. - * @param int $depth Depth of page. Not Used. - * @param stdClass $args An object of wp_nav_menu() arguments. - */ - public function end_el( &$output, $item, $depth = 0, $args = array() ) { - if ( isset( $args->item_spacing ) && 'discard' === $args->item_spacing ) { - $t = ''; - $n = ''; - } else { - $t = "\t"; - $n = "\n"; - } - $output .= "</li>{$n}"; - } - -} // Walker_Nav_Menu diff --git a/wp/wp-includes/class-walker-page-dropdown.php b/wp/wp-includes/class-walker-page-dropdown.php deleted file mode 100644 index 047098b2..00000000 --- a/wp/wp-includes/class-walker-page-dropdown.php +++ /dev/null @@ -1,90 +0,0 @@ -<?php -/** - * Post API: Walker_PageDropdown class - * - * @package WordPress - * @subpackage Post - * @since 4.4.0 - */ - -/** - * Core class used to create an HTML drop-down list of pages. - * - * @since 2.1.0 - * - * @see Walker - */ -class Walker_PageDropdown extends Walker { - - /** - * What the class handles. - * - * @since 2.1.0 - * @access public - * @var string - * - * @see Walker::$tree_type - */ - public $tree_type = 'page'; - - /** - * Database fields to use. - * - * @since 2.1.0 - * @access public - * @var array - * - * @see Walker::$db_fields - * @todo Decouple this - */ - public $db_fields = array( 'parent' => 'post_parent', 'id' => 'ID' ); - - /** - * Starts the element output. - * - * @since 2.1.0 - * @access public - * - * @see Walker::start_el() - * - * @param string $output Used to append additional content. Passed by reference. - * @param WP_Post $page Page data object. - * @param int $depth Optional. Depth of page in reference to parent pages. Used for padding. - * Default 0. - * @param array $args Optional. Uses 'selected' argument for selected page to set selected HTML - * attribute for option element. Uses 'value_field' argument to fill "value" - * attribute. See wp_dropdown_pages(). Default empty array. - * @param int $id Optional. ID of the current page. Default 0 (unused). - */ - public function start_el( &$output, $page, $depth = 0, $args = array(), $id = 0 ) { - $pad = str_repeat(' ', $depth * 3); - - if ( ! isset( $args['value_field'] ) || ! isset( $page->{$args['value_field']} ) ) { - $args['value_field'] = 'ID'; - } - - $output .= "\t<option class=\"level-$depth\" value=\"" . esc_attr( $page->{$args['value_field']} ) . "\""; - if ( $page->ID == $args['selected'] ) - $output .= ' selected="selected"'; - $output .= '>'; - - $title = $page->post_title; - if ( '' === $title ) { - /* translators: %d: ID of a post */ - $title = sprintf( __( '#%d (no title)' ), $page->ID ); - } - - /** - * Filters the page title when creating an HTML drop-down list of pages. - * - * @since 3.1.0 - * - * @param string $title Page title. - * @param object $page Page data object. - */ - $title = apply_filters( 'list_pages', $title, $page ); - - $output .= $pad . esc_html( $title ); - $output .= "</option>\n"; - } -} diff --git a/wp/wp-includes/class-walker-page.php b/wp/wp-includes/class-walker-page.php deleted file mode 100644 index 30831bbc..00000000 --- a/wp/wp-includes/class-walker-page.php +++ /dev/null @@ -1,209 +0,0 @@ -<?php -/** - * Post API: Walker_Page class - * - * @package WordPress - * @subpackage Template - * @since 4.4.0 - */ - -/** - * Core walker class used to create an HTML list of pages. - * - * @since 2.1.0 - * - * @see Walker - */ -class Walker_Page extends Walker { - - /** - * What the class handles. - * - * @since 2.1.0 - * @access public - * @var string - * - * @see Walker::$tree_type - */ - public $tree_type = 'page'; - - /** - * Database fields to use. - * - * @since 2.1.0 - * @access private - * @var array - * - * @see Walker::$db_fields - * @todo Decouple this. - */ - public $db_fields = array( 'parent' => 'post_parent', 'id' => 'ID' ); - - /** - * Outputs the beginning of the current level in the tree before elements are output. - * - * @since 2.1.0 - * @access public - * - * @see Walker::start_lvl() - * - * @param string $output Passed by reference. Used to append additional content. - * @param int $depth Optional. Depth of page. Used for padding. Default 0. - * @param array $args Optional. Arguments for outputting the next level. - * Default empty array. - */ - public function start_lvl( &$output, $depth = 0, $args = array() ) { - if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) { - $t = "\t"; - $n = "\n"; - } else { - $t = ''; - $n = ''; - } - $indent = str_repeat( $t, $depth ); - $output .= "{$n}{$indent}<ul class='children'>{$n}"; - } - - /** - * Outputs the end of the current level in the tree after elements are output. - * - * @since 2.1.0 - * @access public - * - * @see Walker::end_lvl() - * - * @param string $output Passed by reference. Used to append additional content. - * @param int $depth Optional. Depth of page. Used for padding. Default 0. - * @param array $args Optional. Arguments for outputting the end of the current level. - * Default empty array. - */ - public function end_lvl( &$output, $depth = 0, $args = array() ) { - if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) { - $t = "\t"; - $n = "\n"; - } else { - $t = ''; - $n = ''; - } - $indent = str_repeat( $t, $depth ); - $output .= "{$indent}</ul>{$n}"; - } - - /** - * Outputs the beginning of the current element in the tree. - * - * @see Walker::start_el() - * @since 2.1.0 - * @access public - * - * @param string $output Used to append additional content. Passed by reference. - * @param WP_Post $page Page data object. - * @param int $depth Optional. Depth of page. Used for padding. Default 0. - * @param array $args Optional. Array of arguments. Default empty array. - * @param int $current_page Optional. Page ID. Default 0. - */ - public function start_el( &$output, $page, $depth = 0, $args = array(), $current_page = 0 ) { - if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) { - $t = "\t"; - $n = "\n"; - } else { - $t = ''; - $n = ''; - } - if ( $depth ) { - $indent = str_repeat( $t, $depth ); - } else { - $indent = ''; - } - - $css_class = array( 'page_item', 'page-item-' . $page->ID ); - - if ( isset( $args['pages_with_children'][ $page->ID ] ) ) { - $css_class[] = 'page_item_has_children'; - } - - if ( ! empty( $current_page ) ) { - $_current_page = get_post( $current_page ); - if ( $_current_page && in_array( $page->ID, $_current_page->ancestors ) ) { - $css_class[] = 'current_page_ancestor'; - } - if ( $page->ID == $current_page ) { - $css_class[] = 'current_page_item'; - } elseif ( $_current_page && $page->ID == $_current_page->post_parent ) { - $css_class[] = 'current_page_parent'; - } - } elseif ( $page->ID == get_option('page_for_posts') ) { - $css_class[] = 'current_page_parent'; - } - - /** - * Filters the list of CSS classes to include with each page item in the list. - * - * @since 2.8.0 - * - * @see wp_list_pages() - * - * @param array $css_class An array of CSS classes to be applied - * to each list item. - * @param WP_Post $page Page data object. - * @param int $depth Depth of page, used for padding. - * @param array $args An array of arguments. - * @param int $current_page ID of the current page. - */ - $css_classes = implode( ' ', apply_filters( 'page_css_class', $css_class, $page, $depth, $args, $current_page ) ); - - if ( '' === $page->post_title ) { - /* translators: %d: ID of a post */ - $page->post_title = sprintf( __( '#%d (no title)' ), $page->ID ); - } - - $args['link_before'] = empty( $args['link_before'] ) ? '' : $args['link_before']; - $args['link_after'] = empty( $args['link_after'] ) ? '' : $args['link_after']; - - $output .= $indent . sprintf( - '<li class="%s"><a href="%s">%s%s%s</a>', - $css_classes, - get_permalink( $page->ID ), - $args['link_before'], - /** This filter is documented in wp-includes/post-template.php */ - apply_filters( 'the_title', $page->post_title, $page->ID ), - $args['link_after'] - ); - - if ( ! empty( $args['show_date'] ) ) { - if ( 'modified' == $args['show_date'] ) { - $time = $page->post_modified; - } else { - $time = $page->post_date; - } - - $date_format = empty( $args['date_format'] ) ? '' : $args['date_format']; - $output .= " " . mysql2date( $date_format, $time ); - } - } - - /** - * Outputs the end of the current element in the tree. - * - * @since 2.1.0 - * @access public - * - * @see Walker::end_el() - * - * @param string $output Used to append additional content. Passed by reference. - * @param WP_Post $page Page data object. Not used. - * @param int $depth Optional. Depth of page. Default 0 (unused). - * @param array $args Optional. Array of arguments. Default empty array. - */ - public function end_el( &$output, $page, $depth = 0, $args = array() ) { - if ( isset( $args['item_spacing'] ) && 'preserve' === $args['item_spacing'] ) { - $t = "\t"; - $n = "\n"; - } else { - $t = ''; - $n = ''; - } - $output .= "</li>{$n}"; - } - -} diff --git a/wp/wp-includes/class-wp-admin-bar.php b/wp/wp-includes/class-wp-admin-bar.php deleted file mode 100644 index 49986ac2..00000000 --- a/wp/wp-includes/class-wp-admin-bar.php +++ /dev/null @@ -1,600 +0,0 @@ -<?php -/** - * Toolbar API: WP_Admin_Bar class - * - * @package WordPress - * @subpackage Toolbar - * @since 3.1.0 - */ - -/** - * Core class used to implement the Toolbar API. - * - * @since 3.1.0 - */ -class WP_Admin_Bar { - private $nodes = array(); - private $bound = false; - public $user; - - /** - * @param string $name - * @return string|array|void - */ - public function __get( $name ) { - switch ( $name ) { - case 'proto' : - return is_ssl() ? 'https://' : 'http://'; - - case 'menu' : - _deprecated_argument( 'WP_Admin_Bar', '3.3.0', 'Modify admin bar nodes with WP_Admin_Bar::get_node(), WP_Admin_Bar::add_node(), and WP_Admin_Bar::remove_node(), not the <code>menu</code> property.' ); - return array(); // Sorry, folks. - } - } - - /** - * @access public - */ - public function initialize() { - $this->user = new stdClass; - - if ( is_user_logged_in() ) { - /* Populate settings we need for the menu based on the current user. */ - $this->user->blogs = get_blogs_of_user( get_current_user_id() ); - if ( is_multisite() ) { - $this->user->active_blog = get_active_blog_for_user( get_current_user_id() ); - $this->user->domain = empty( $this->user->active_blog ) ? user_admin_url() : trailingslashit( get_home_url( $this->user->active_blog->blog_id ) ); - $this->user->account_domain = $this->user->domain; - } else { - $this->user->active_blog = $this->user->blogs[get_current_blog_id()]; - $this->user->domain = trailingslashit( home_url() ); - $this->user->account_domain = $this->user->domain; - } - } - - add_action( 'wp_head', 'wp_admin_bar_header' ); - - add_action( 'admin_head', 'wp_admin_bar_header' ); - - if ( current_theme_supports( 'admin-bar' ) ) { - /** - * To remove the default padding styles from WordPress for the Toolbar, use the following code: - * add_theme_support( 'admin-bar', array( 'callback' => '__return_false' ) ); - */ - $admin_bar_args = get_theme_support( 'admin-bar' ); - $header_callback = $admin_bar_args[0]['callback']; - } - - if ( empty($header_callback) ) - $header_callback = '_admin_bar_bump_cb'; - - add_action('wp_head', $header_callback); - - wp_enqueue_script( 'admin-bar' ); - wp_enqueue_style( 'admin-bar' ); - - /** - * Fires after WP_Admin_Bar is initialized. - * - * @since 3.1.0 - */ - do_action( 'admin_bar_init' ); - } - - /** - * @param array $node - */ - public function add_menu( $node ) { - $this->add_node( $node ); - } - - /** - * @param string $id - */ - public function remove_menu( $id ) { - $this->remove_node( $id ); - } - - /** - * Adds a node to the menu. - * - * @since 3.1.0 - * @since 4.5.0 Added the ability to pass 'lang' and 'dir' meta data. - * @access public - * - * @param array $args { - * Arguments for adding a node. - * - * @type string $id ID of the item. - * @type string $title Title of the node. - * @type string $parent Optional. ID of the parent node. - * @type string $href Optional. Link for the item. - * @type bool $group Optional. Whether or not the node is a group. Default false. - * @type array $meta Meta data including the following keys: 'html', 'class', 'rel', 'lang', 'dir', - * 'onclick', 'target', 'title', 'tabindex'. Default empty. - * } - */ - public function add_node( $args ) { - // Shim for old method signature: add_node( $parent_id, $menu_obj, $args ) - if ( func_num_args() >= 3 && is_string( func_get_arg(0) ) ) - $args = array_merge( array( 'parent' => func_get_arg(0) ), func_get_arg(2) ); - - if ( is_object( $args ) ) - $args = get_object_vars( $args ); - - // Ensure we have a valid title. - if ( empty( $args['id'] ) ) { - if ( empty( $args['title'] ) ) - return; - - _doing_it_wrong( __METHOD__, __( 'The menu ID should not be empty.' ), '3.3.0' ); - // Deprecated: Generate an ID from the title. - $args['id'] = esc_attr( sanitize_title( trim( $args['title'] ) ) ); - } - - $defaults = array( - 'id' => false, - 'title' => false, - 'parent' => false, - 'href' => false, - 'group' => false, - 'meta' => array(), - ); - - // If the node already exists, keep any data that isn't provided. - if ( $maybe_defaults = $this->get_node( $args['id'] ) ) - $defaults = get_object_vars( $maybe_defaults ); - - // Do the same for 'meta' items. - if ( ! empty( $defaults['meta'] ) && ! empty( $args['meta'] ) ) - $args['meta'] = wp_parse_args( $args['meta'], $defaults['meta'] ); - - $args = wp_parse_args( $args, $defaults ); - - $back_compat_parents = array( - 'my-account-with-avatar' => array( 'my-account', '3.3' ), - 'my-blogs' => array( 'my-sites', '3.3' ), - ); - - if ( isset( $back_compat_parents[ $args['parent'] ] ) ) { - list( $new_parent, $version ) = $back_compat_parents[ $args['parent'] ]; - _deprecated_argument( __METHOD__, $version, sprintf( 'Use <code>%s</code> as the parent for the <code>%s</code> admin bar node instead of <code>%s</code>.', $new_parent, $args['id'], $args['parent'] ) ); - $args['parent'] = $new_parent; - } - - $this->_set_node( $args ); - } - - /** - * @param array $args - */ - final protected function _set_node( $args ) { - $this->nodes[ $args['id'] ] = (object) $args; - } - - /** - * Gets a node. - * - * @param string $id - * @return object Node. - */ - final public function get_node( $id ) { - if ( $node = $this->_get_node( $id ) ) - return clone $node; - } - - /** - * @param string $id - * @return object|void - */ - final protected function _get_node( $id ) { - if ( $this->bound ) - return; - - if ( empty( $id ) ) - $id = 'root'; - - if ( isset( $this->nodes[ $id ] ) ) - return $this->nodes[ $id ]; - } - - /** - * @return array|void - */ - final public function get_nodes() { - if ( ! $nodes = $this->_get_nodes() ) - return; - - foreach ( $nodes as &$node ) { - $node = clone $node; - } - return $nodes; - } - - /** - * @return array|void - */ - final protected function _get_nodes() { - if ( $this->bound ) - return; - - return $this->nodes; - } - - /** - * Add a group to a menu node. - * - * @since 3.3.0 - * - * @param array $args { - * Array of arguments for adding a group. - * - * @type string $id ID of the item. - * @type string $parent Optional. ID of the parent node. Default 'root'. - * @type array $meta Meta data for the group including the following keys: - * 'class', 'onclick', 'target', and 'title'. - * } - */ - final public function add_group( $args ) { - $args['group'] = true; - - $this->add_node( $args ); - } - - /** - * Remove a node. - * - * @param string $id The ID of the item. - */ - public function remove_node( $id ) { - $this->_unset_node( $id ); - } - - /** - * @param string $id - */ - final protected function _unset_node( $id ) { - unset( $this->nodes[ $id ] ); - } - - /** - * @access public - */ - public function render() { - $root = $this->_bind(); - if ( $root ) - $this->_render( $root ); - } - - /** - * @return object|void - */ - final protected function _bind() { - if ( $this->bound ) - return; - - // Add the root node. - // Clear it first, just in case. Don't mess with The Root. - $this->remove_node( 'root' ); - $this->add_node( array( - 'id' => 'root', - 'group' => false, - ) ); - - // Normalize nodes: define internal 'children' and 'type' properties. - foreach ( $this->_get_nodes() as $node ) { - $node->children = array(); - $node->type = ( $node->group ) ? 'group' : 'item'; - unset( $node->group ); - - // The Root wants your orphans. No lonely items allowed. - if ( ! $node->parent ) - $node->parent = 'root'; - } - - foreach ( $this->_get_nodes() as $node ) { - if ( 'root' == $node->id ) - continue; - - // Fetch the parent node. If it isn't registered, ignore the node. - if ( ! $parent = $this->_get_node( $node->parent ) ) { - continue; - } - - // Generate the group class (we distinguish between top level and other level groups). - $group_class = ( $node->parent == 'root' ) ? 'ab-top-menu' : 'ab-submenu'; - - if ( $node->type == 'group' ) { - if ( empty( $node->meta['class'] ) ) - $node->meta['class'] = $group_class; - else - $node->meta['class'] .= ' ' . $group_class; - } - - // Items in items aren't allowed. Wrap nested items in 'default' groups. - if ( $parent->type == 'item' && $node->type == 'item' ) { - $default_id = $parent->id . '-default'; - $default = $this->_get_node( $default_id ); - - // The default group is added here to allow groups that are - // added before standard menu items to render first. - if ( ! $default ) { - // Use _set_node because add_node can be overloaded. - // Make sure to specify default settings for all properties. - $this->_set_node( array( - 'id' => $default_id, - 'parent' => $parent->id, - 'type' => 'group', - 'children' => array(), - 'meta' => array( - 'class' => $group_class, - ), - 'title' => false, - 'href' => false, - ) ); - $default = $this->_get_node( $default_id ); - $parent->children[] = $default; - } - $parent = $default; - - // Groups in groups aren't allowed. Add a special 'container' node. - // The container will invisibly wrap both groups. - } elseif ( $parent->type == 'group' && $node->type == 'group' ) { - $container_id = $parent->id . '-container'; - $container = $this->_get_node( $container_id ); - - // We need to create a container for this group, life is sad. - if ( ! $container ) { - // Use _set_node because add_node can be overloaded. - // Make sure to specify default settings for all properties. - $this->_set_node( array( - 'id' => $container_id, - 'type' => 'container', - 'children' => array( $parent ), - 'parent' => false, - 'title' => false, - 'href' => false, - 'meta' => array(), - ) ); - - $container = $this->_get_node( $container_id ); - - // Link the container node if a grandparent node exists. - $grandparent = $this->_get_node( $parent->parent ); - - if ( $grandparent ) { - $container->parent = $grandparent->id; - - $index = array_search( $parent, $grandparent->children, true ); - if ( $index === false ) - $grandparent->children[] = $container; - else - array_splice( $grandparent->children, $index, 1, array( $container ) ); - } - - $parent->parent = $container->id; - } - - $parent = $container; - } - - // Update the parent ID (it might have changed). - $node->parent = $parent->id; - - // Add the node to the tree. - $parent->children[] = $node; - } - - $root = $this->_get_node( 'root' ); - $this->bound = true; - return $root; - } - - /** - * - * @global bool $is_IE - * @param object $root - */ - final protected function _render( $root ) { - global $is_IE; - - // Add browser classes. - // We have to do this here since admin bar shows on the front end. - $class = 'nojq nojs'; - if ( $is_IE ) { - if ( strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE 7' ) ) - $class .= ' ie7'; - elseif ( strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE 8' ) ) - $class .= ' ie8'; - elseif ( strpos( $_SERVER['HTTP_USER_AGENT'], 'MSIE 9' ) ) - $class .= ' ie9'; - } elseif ( wp_is_mobile() ) { - $class .= ' mobile'; - } - - ?> - <div id="wpadminbar" class="<?php echo $class; ?>"> - <?php if ( ! is_admin() ) { ?> - <a class="screen-reader-shortcut" href="#wp-toolbar" tabindex="1"><?php _e( 'Skip to toolbar' ); ?></a> - <?php } ?> - <div class="quicklinks" id="wp-toolbar" role="navigation" aria-label="<?php esc_attr_e( 'Toolbar' ); ?>" tabindex="0"> - <?php foreach ( $root->children as $group ) { - $this->_render_group( $group ); - } ?> - </div> - <?php if ( is_user_logged_in() ) : ?> - <a class="screen-reader-shortcut" href="<?php echo esc_url( wp_logout_url() ); ?>"><?php _e('Log Out'); ?></a> - <?php endif; ?> - </div> - - <?php - } - - /** - * @param object $node - */ - final protected function _render_container( $node ) { - if ( $node->type != 'container' || empty( $node->children ) ) - return; - - ?><div id="<?php echo esc_attr( 'wp-admin-bar-' . $node->id ); ?>" class="ab-group-container"><?php - foreach ( $node->children as $group ) { - $this->_render_group( $group ); - } - ?></div><?php - } - - /** - * @param object $node - */ - final protected function _render_group( $node ) { - if ( $node->type == 'container' ) { - $this->_render_container( $node ); - return; - } - if ( $node->type != 'group' || empty( $node->children ) ) - return; - - if ( ! empty( $node->meta['class'] ) ) - $class = ' class="' . esc_attr( trim( $node->meta['class'] ) ) . '"'; - else - $class = ''; - - ?><ul id="<?php echo esc_attr( 'wp-admin-bar-' . $node->id ); ?>"<?php echo $class; ?>><?php - foreach ( $node->children as $item ) { - $this->_render_item( $item ); - } - ?></ul><?php - } - - /** - * @param object $node - */ - final protected function _render_item( $node ) { - if ( $node->type != 'item' ) - return; - - $is_parent = ! empty( $node->children ); - $has_link = ! empty( $node->href ); - - // Allow only numeric values, then casted to integers, and allow a tabindex value of `0` for a11y. - $tabindex = ( isset( $node->meta['tabindex'] ) && is_numeric( $node->meta['tabindex'] ) ) ? (int) $node->meta['tabindex'] : ''; - $aria_attributes = ( '' !== $tabindex ) ? ' tabindex="' . $tabindex . '"' : ''; - - $menuclass = ''; - - if ( $is_parent ) { - $menuclass = 'menupop '; - $aria_attributes .= ' aria-haspopup="true"'; - } - - if ( ! empty( $node->meta['class'] ) ) - $menuclass .= $node->meta['class']; - - if ( $menuclass ) - $menuclass = ' class="' . esc_attr( trim( $menuclass ) ) . '"'; - - ?> - - <li id="<?php echo esc_attr( 'wp-admin-bar-' . $node->id ); ?>"<?php echo $menuclass; ?>><?php - if ( $has_link ): - ?><a class="ab-item"<?php echo $aria_attributes; ?> href="<?php echo esc_url( $node->href ) ?>"<?php - if ( ! empty( $node->meta['onclick'] ) ) : - ?> onclick="<?php echo esc_js( $node->meta['onclick'] ); ?>"<?php - endif; - if ( ! empty( $node->meta['target'] ) ) : - ?> target="<?php echo esc_attr( $node->meta['target'] ); ?>"<?php - endif; - if ( ! empty( $node->meta['title'] ) ) : - ?> title="<?php echo esc_attr( $node->meta['title'] ); ?>"<?php - endif; - if ( ! empty( $node->meta['rel'] ) ) : - ?> rel="<?php echo esc_attr( $node->meta['rel'] ); ?>"<?php - endif; - if ( ! empty( $node->meta['lang'] ) ) : - ?> lang="<?php echo esc_attr( $node->meta['lang'] ); ?>"<?php - endif; - if ( ! empty( $node->meta['dir'] ) ) : - ?> dir="<?php echo esc_attr( $node->meta['dir'] ); ?>"<?php - endif; - ?>><?php - else: - ?><div class="ab-item ab-empty-item"<?php echo $aria_attributes; - if ( ! empty( $node->meta['title'] ) ) : - ?> title="<?php echo esc_attr( $node->meta['title'] ); ?>"<?php - endif; - if ( ! empty( $node->meta['lang'] ) ) : - ?> lang="<?php echo esc_attr( $node->meta['lang'] ); ?>"<?php - endif; - if ( ! empty( $node->meta['dir'] ) ) : - ?> dir="<?php echo esc_attr( $node->meta['dir'] ); ?>"<?php - endif; - ?>><?php - endif; - - echo $node->title; - - if ( $has_link ) : - ?></a><?php - else: - ?></div><?php - endif; - - if ( $is_parent ) : - ?><div class="ab-sub-wrapper"><?php - foreach ( $node->children as $group ) { - $this->_render_group( $group ); - } - ?></div><?php - endif; - - if ( ! empty( $node->meta['html'] ) ) - echo $node->meta['html']; - - ?> - </li><?php - } - - /** - * @param string $id Unused. - * @param object $node - */ - public function recursive_render( $id, $node ) { - _deprecated_function( __METHOD__, '3.3.0', 'WP_Admin_bar::render(), WP_Admin_Bar::_render_item()' ); - $this->_render_item( $node ); - } - - /** - * @access public - */ - public function add_menus() { - // User related, aligned right. - add_action( 'admin_bar_menu', 'wp_admin_bar_my_account_menu', 0 ); - add_action( 'admin_bar_menu', 'wp_admin_bar_search_menu', 4 ); - add_action( 'admin_bar_menu', 'wp_admin_bar_my_account_item', 7 ); - - // Site related. - add_action( 'admin_bar_menu', 'wp_admin_bar_sidebar_toggle', 0 ); - add_action( 'admin_bar_menu', 'wp_admin_bar_wp_menu', 10 ); - add_action( 'admin_bar_menu', 'wp_admin_bar_my_sites_menu', 20 ); - add_action( 'admin_bar_menu', 'wp_admin_bar_site_menu', 30 ); - add_action( 'admin_bar_menu', 'wp_admin_bar_customize_menu', 40 ); - add_action( 'admin_bar_menu', 'wp_admin_bar_updates_menu', 50 ); - - // Content related. - if ( ! is_network_admin() && ! is_user_admin() ) { - add_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 60 ); - add_action( 'admin_bar_menu', 'wp_admin_bar_new_content_menu', 70 ); - } - add_action( 'admin_bar_menu', 'wp_admin_bar_edit_menu', 80 ); - - add_action( 'admin_bar_menu', 'wp_admin_bar_add_secondary_groups', 200 ); - - /** - * Fires after menus are added to the menu bar. - * - * @since 3.1.0 - */ - do_action( 'add_admin_bar_menus' ); - } -} diff --git a/wp/wp-includes/class-wp-ajax-response.php b/wp/wp-includes/class-wp-ajax-response.php deleted file mode 100644 index a86d8dd5..00000000 --- a/wp/wp-includes/class-wp-ajax-response.php +++ /dev/null @@ -1,157 +0,0 @@ -<?php -/** - * Send XML response back to Ajax request. - * - * @package WordPress - * @since 2.1.0 - */ -class WP_Ajax_Response { - /** - * Store XML responses to send. - * - * @since 2.1.0 - * @var array - */ - public $responses = array(); - - /** - * Constructor - Passes args to WP_Ajax_Response::add(). - * - * @since 2.1.0 - * @see WP_Ajax_Response::add() - * - * @param string|array $args Optional. Will be passed to add() method. - */ - public function __construct( $args = '' ) { - if ( !empty($args) ) - $this->add($args); - } - - /** - * Appends data to an XML response based on given arguments. - * - * With `$args` defaults, extra data output would be: - * - * <response action='{$action}_$id'> - * <$what id='$id' position='$position'> - * <response_data><![CDATA[$data]]></response_data> - * </$what> - * </response> - * - * @since 2.1.0 - * @access public - * - * @param string|array $args { - * Optional. An array or string of XML response arguments. - * - * @type string $what XML-RPC response type. Used as a child element of `<response>`. - * Default 'object' (`<object>`). - * @type string|false $action Value to use for the `action` attribute in `<response>`. Will be - * appended with `_$id` on output. If false, `$action` will default to - * the value of `$_POST['action']`. Default false. - * @type int|WP_Error $id The response ID, used as the response type `id` attribute. Also - * accepts a `WP_Error` object if the ID does not exist. Default 0. - * @type int|false $old_id The previous response ID. Used as the value for the response type - * `old_id` attribute. False hides the attribute. Default false. - * @type string $position Value of the response type `position` attribute. Accepts 1 (bottom), - * -1 (top), html ID (after), or -html ID (before). Default 1 (bottom). - * @type string|WP_Error $data The response content/message. Also accepts a WP_Error object if the - * ID does not exist. Default empty. - * @type array $supplemental An array of extra strings that will be output within a `<supplemental>` - * element as CDATA. Default empty array. - * } - * @return string XML response. - */ - public function add( $args = '' ) { - $defaults = array( - 'what' => 'object', 'action' => false, - 'id' => '0', 'old_id' => false, - 'position' => 1, - 'data' => '', 'supplemental' => array() - ); - - $r = wp_parse_args( $args, $defaults ); - - $position = preg_replace( '/[^a-z0-9:_-]/i', '', $r['position'] ); - $id = $r['id']; - $what = $r['what']; - $action = $r['action']; - $old_id = $r['old_id']; - $data = $r['data']; - - if ( is_wp_error( $id ) ) { - $data = $id; - $id = 0; - } - - $response = ''; - if ( is_wp_error( $data ) ) { - foreach ( (array) $data->get_error_codes() as $code ) { - $response .= "<wp_error code='$code'><![CDATA[" . $data->get_error_message( $code ) . "]]></wp_error>"; - if ( ! $error_data = $data->get_error_data( $code ) ) { - continue; - } - $class = ''; - if ( is_object( $error_data ) ) { - $class = ' class="' . get_class( $error_data ) . '"'; - $error_data = get_object_vars( $error_data ); - } - - $response .= "<wp_error_data code='$code'$class>"; - - if ( is_scalar( $error_data ) ) { - $response .= "<![CDATA[$error_data]]>"; - } elseif ( is_array( $error_data ) ) { - foreach ( $error_data as $k => $v ) { - $response .= "<$k><![CDATA[$v]]></$k>"; - } - } - - $response .= "</wp_error_data>"; - } - } else { - $response = "<response_data><![CDATA[$data]]></response_data>"; - } - - $s = ''; - if ( is_array( $r['supplemental'] ) ) { - foreach ( $r['supplemental'] as $k => $v ) { - $s .= "<$k><![CDATA[$v]]></$k>"; - } - $s = "<supplemental>$s</supplemental>"; - } - - if ( false === $action ) { - $action = $_POST['action']; - } - $x = ''; - $x .= "<response action='{$action}_$id'>"; // The action attribute in the xml output is formatted like a nonce action - $x .= "<$what id='$id' " . ( false === $old_id ? '' : "old_id='$old_id' " ) . "position='$position'>"; - $x .= $response; - $x .= $s; - $x .= "</$what>"; - $x .= "</response>"; - - $this->responses[] = $x; - return $x; - } - - /** - * Display XML formatted responses. - * - * Sets the content type header to text/xml. - * - * @since 2.1.0 - */ - public function send() { - header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ) ); - echo "<?xml version='1.0' encoding='" . get_option( 'blog_charset' ) . "' standalone='yes'?><wp_ajax>"; - foreach ( (array) $this->responses as $response ) - echo $response; - echo '</wp_ajax>'; - if ( wp_doing_ajax() ) - wp_die(); - else - die(); - } -} diff --git a/wp/wp-includes/class-wp-comment-query.php b/wp/wp-includes/class-wp-comment-query.php deleted file mode 100644 index ef8b6d54..00000000 --- a/wp/wp-includes/class-wp-comment-query.php +++ /dev/null @@ -1,1176 +0,0 @@ -<?php -/** - * Comment API: WP_Comment_Query class - * - * @package WordPress - * @subpackage Comments - * @since 4.4.0 - */ - -/** - * Core class used for querying comments. - * - * @since 3.1.0 - * - * @see WP_Comment_Query::__construct() for accepted arguments. - */ -class WP_Comment_Query { - - /** - * SQL for database query. - * - * @since 4.0.1 - * @access public - * @var string - */ - public $request; - - /** - * Metadata query container - * - * @since 3.5.0 - * @access public - * @var object WP_Meta_Query - */ - public $meta_query = false; - - /** - * Metadata query clauses. - * - * @since 4.4.0 - * @access protected - * @var array - */ - protected $meta_query_clauses; - - /** - * SQL query clauses. - * - * @since 4.4.0 - * @access protected - * @var array - */ - protected $sql_clauses = array( - 'select' => '', - 'from' => '', - 'where' => array(), - 'groupby' => '', - 'orderby' => '', - 'limits' => '', - ); - - /** - * SQL WHERE clause. - * - * Stored after the {@see 'comments_clauses'} filter is run on the compiled WHERE sub-clauses. - * - * @since 4.4.2 - * @access protected - * @var string - */ - protected $filtered_where_clause; - - /** - * Date query container - * - * @since 3.7.0 - * @access public - * @var object WP_Date_Query - */ - public $date_query = false; - - /** - * Query vars set by the user. - * - * @since 3.1.0 - * @access public - * @var array - */ - public $query_vars; - - /** - * Default values for query vars. - * - * @since 4.2.0 - * @access public - * @var array - */ - public $query_var_defaults; - - /** - * List of comments located by the query. - * - * @since 4.0.0 - * @access public - * @var array - */ - public $comments; - - /** - * The amount of found comments for the current query. - * - * @since 4.4.0 - * @access public - * @var int - */ - public $found_comments = 0; - - /** - * The number of pages. - * - * @since 4.4.0 - * @access public - * @var int - */ - public $max_num_pages = 0; - - /** - * Make private/protected methods readable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param callable $name Method to call. - * @param array $arguments Arguments to pass when calling. - * @return mixed|false Return value of the callback, false otherwise. - */ - public function __call( $name, $arguments ) { - if ( 'get_search_sql' === $name ) { - return call_user_func_array( array( $this, $name ), $arguments ); - } - return false; - } - - /** - * Constructor. - * - * Sets up the comment query, based on the query vars passed. - * - * @since 4.2.0 - * @since 4.4.0 `$parent__in` and `$parent__not_in` were added. - * @since 4.4.0 Order by `comment__in` was added. `$update_comment_meta_cache`, `$no_found_rows`, - * `$hierarchical`, and `$update_comment_post_cache` were added. - * @since 4.5.0 Introduced the `$author_url` argument. - * @since 4.6.0 Introduced the `$cache_domain` argument. - * @access public - * - * @param string|array $query { - * Optional. Array or query string of comment query parameters. Default empty. - * - * @type string $author_email Comment author email address. Default empty. - * @type string $author_url Comment author URL. Default empty. - * @type array $author__in Array of author IDs to include comments for. Default empty. - * @type array $author__not_in Array of author IDs to exclude comments for. Default empty. - * @type array $comment__in Array of comment IDs to include. Default empty. - * @type array $comment__not_in Array of comment IDs to exclude. Default empty. - * @type bool $count Whether to return a comment count (true) or array of - * comment objects (false). Default false. - * @type array $date_query Date query clauses to limit comments by. See WP_Date_Query. - * Default null. - * @type string $fields Comment fields to return. Accepts 'ids' for comment IDs - * only or empty for all fields. Default empty. - * @type int $ID Currently unused. - * @type array $include_unapproved Array of IDs or email addresses of users whose unapproved - * comments will be returned by the query regardless of - * `$status`. Default empty. - * @type int $karma Karma score to retrieve matching comments for. - * Default empty. - * @type string $meta_key Include comments with a matching comment meta key. - * Default empty. - * @type string $meta_value Include comments with a matching comment meta value. - * Requires `$meta_key` to be set. Default empty. - * @type array $meta_query Meta query clauses to limit retrieved comments by. - * See WP_Meta_Query. Default empty. - * @type int $number Maximum number of comments to retrieve. - * Default empty (no limit). - * @type int $offset Number of comments to offset the query. Used to build - * LIMIT clause. Default 0. - * @type bool $no_found_rows Whether to disable the `SQL_CALC_FOUND_ROWS` query. - * Default: true. - * @type string|array $orderby Comment status or array of statuses. To use 'meta_value' - * or 'meta_value_num', `$meta_key` must also be defined. - * To sort by a specific `$meta_query` clause, use that - * clause's array key. Accepts 'comment_agent', - * 'comment_approved', 'comment_author', - * 'comment_author_email', 'comment_author_IP', - * 'comment_author_url', 'comment_content', 'comment_date', - * 'comment_date_gmt', 'comment_ID', 'comment_karma', - * 'comment_parent', 'comment_post_ID', 'comment_type', - * 'user_id', 'comment__in', 'meta_value', 'meta_value_num', - * the value of $meta_key, and the array keys of - * `$meta_query`. Also accepts false, an empty array, or - * 'none' to disable `ORDER BY` clause. - * Default: 'comment_date_gmt'. - * @type string $order How to order retrieved comments. Accepts 'ASC', 'DESC'. - * Default: 'DESC'. - * @type int $parent Parent ID of comment to retrieve children of. - * Default empty. - * @type array $parent__in Array of parent IDs of comments to retrieve children for. - * Default empty. - * @type array $parent__not_in Array of parent IDs of comments *not* to retrieve - * children for. Default empty. - * @type array $post_author__in Array of author IDs to retrieve comments for. - * Default empty. - * @type array $post_author__not_in Array of author IDs *not* to retrieve comments for. - * Default empty. - * @type int $post_ID Currently unused. - * @type int $post_id Limit results to those affiliated with a given post ID. - * Default 0. - * @type array $post__in Array of post IDs to include affiliated comments for. - * Default empty. - * @type array $post__not_in Array of post IDs to exclude affiliated comments for. - * Default empty. - * @type int $post_author Post author ID to limit results by. Default empty. - * @type string|array $post_status Post status or array of post statuses to retrieve - * affiliated comments for. Pass 'any' to match any value. - * Default empty. - * @type string $post_type Post type or array of post types to retrieve affiliated - * comments for. Pass 'any' to match any value. Default empty. - * @type string $post_name Post name to retrieve affiliated comments for. - * Default empty. - * @type int $post_parent Post parent ID to retrieve affiliated comments for. - * Default empty. - * @type string $search Search term(s) to retrieve matching comments for. - * Default empty. - * @type string $status Comment status to limit results by. Accepts 'hold' - * (`comment_status=0`), 'approve' (`comment_status=1`), - * 'all', or a custom comment status. Default 'all'. - * @type string|array $type Include comments of a given type, or array of types. - * Accepts 'comment', 'pings' (includes 'pingback' and - * 'trackback'), or anycustom type string. Default empty. - * @type array $type__in Include comments from a given array of comment types. - * Default empty. - * @type array $type__not_in Exclude comments from a given array of comment types. - * Default empty. - * @type int $user_id Include comments for a specific user ID. Default empty. - * @type bool|string $hierarchical Whether to include comment descendants in the results. - * 'threaded' returns a tree, with each comment's children - * stored in a `children` property on the `WP_Comment` - * object. 'flat' returns a flat array of found comments plus - * their children. Pass `false` to leave out descendants. - * The parameter is ignored (forced to `false`) when - * `$fields` is 'ids' or 'counts'. Accepts 'threaded', - * 'flat', or false. Default: false. - * @type string $cache_domain Unique cache key to be produced when this query is stored in - * an object cache. Default is 'core'. - * @type bool $update_comment_meta_cache Whether to prime the metadata cache for found comments. - * Default true. - * @type bool $update_comment_post_cache Whether to prime the cache for comment posts. - * Default false. - * } - */ - public function __construct( $query = '' ) { - $this->query_var_defaults = array( - 'author_email' => '', - 'author_url' => '', - 'author__in' => '', - 'author__not_in' => '', - 'include_unapproved' => '', - 'fields' => '', - 'ID' => '', - 'comment__in' => '', - 'comment__not_in' => '', - 'karma' => '', - 'number' => '', - 'offset' => '', - 'no_found_rows' => true, - 'orderby' => '', - 'order' => 'DESC', - 'parent' => '', - 'parent__in' => '', - 'parent__not_in' => '', - 'post_author__in' => '', - 'post_author__not_in' => '', - 'post_ID' => '', - 'post_id' => 0, - 'post__in' => '', - 'post__not_in' => '', - 'post_author' => '', - 'post_name' => '', - 'post_parent' => '', - 'post_status' => '', - 'post_type' => '', - 'status' => 'all', - 'type' => '', - 'type__in' => '', - 'type__not_in' => '', - 'user_id' => '', - 'search' => '', - 'count' => false, - 'meta_key' => '', - 'meta_value' => '', - 'meta_query' => '', - 'date_query' => null, // See WP_Date_Query - 'hierarchical' => false, - 'cache_domain' => 'core', - 'update_comment_meta_cache' => true, - 'update_comment_post_cache' => false, - ); - - if ( ! empty( $query ) ) { - $this->query( $query ); - } - } - - /** - * Parse arguments passed to the comment query with default query parameters. - * - * @since 4.2.0 Extracted from WP_Comment_Query::query(). - * - * @access public - * - * @param string|array $query WP_Comment_Query arguments. See WP_Comment_Query::__construct() - */ - public function parse_query( $query = '' ) { - if ( empty( $query ) ) { - $query = $this->query_vars; - } - - $this->query_vars = wp_parse_args( $query, $this->query_var_defaults ); - - /** - * Fires after the comment query vars have been parsed. - * - * @since 4.2.0 - * - * @param WP_Comment_Query &$this The WP_Comment_Query instance (passed by reference). - */ - do_action_ref_array( 'parse_comment_query', array( &$this ) ); - } - - /** - * Sets up the WordPress query for retrieving comments. - * - * @since 3.1.0 - * @since 4.1.0 Introduced 'comment__in', 'comment__not_in', 'post_author__in', - * 'post_author__not_in', 'author__in', 'author__not_in', 'post__in', - * 'post__not_in', 'include_unapproved', 'type__in', and 'type__not_in' - * arguments to $query_vars. - * @since 4.2.0 Moved parsing to WP_Comment_Query::parse_query(). - * @access public - * - * @param string|array $query Array or URL query string of parameters. - * @return array|int List of comments, or number of comments when 'count' is passed as a query var. - */ - public function query( $query ) { - $this->query_vars = wp_parse_args( $query ); - return $this->get_comments(); - } - - /** - * Get a list of comments matching the query vars. - * - * @since 4.2.0 - * @access public - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @return int|array List of comments or number of found comments if `$count` argument is true. - */ - public function get_comments() { - global $wpdb; - - $this->parse_query(); - - // Parse meta query - $this->meta_query = new WP_Meta_Query(); - $this->meta_query->parse_query_vars( $this->query_vars ); - - /** - * Fires before comments are retrieved. - * - * @since 3.1.0 - * - * @param WP_Comment_Query &$this Current instance of WP_Comment_Query, passed by reference. - */ - do_action_ref_array( 'pre_get_comments', array( &$this ) ); - - // Reparse query vars, in case they were modified in a 'pre_get_comments' callback. - $this->meta_query->parse_query_vars( $this->query_vars ); - if ( ! empty( $this->meta_query->queries ) ) { - $this->meta_query_clauses = $this->meta_query->get_sql( 'comment', $wpdb->comments, 'comment_ID', $this ); - } - - // $args can include anything. Only use the args defined in the query_var_defaults to compute the key. - $key = md5( serialize( wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ) ) ); - $last_changed = wp_cache_get_last_changed( 'comment' ); - - - $cache_key = "get_comments:$key:$last_changed"; - $cache_value = wp_cache_get( $cache_key, 'comment' ); - if ( false === $cache_value ) { - $comment_ids = $this->get_comment_ids(); - if ( $comment_ids ) { - $this->set_found_comments(); - } - - $cache_value = array( - 'comment_ids' => $comment_ids, - 'found_comments' => $this->found_comments, - ); - wp_cache_add( $cache_key, $cache_value, 'comment' ); - } else { - $comment_ids = $cache_value['comment_ids']; - $this->found_comments = $cache_value['found_comments']; - } - - if ( $this->found_comments && $this->query_vars['number'] ) { - $this->max_num_pages = ceil( $this->found_comments / $this->query_vars['number'] ); - } - - // If querying for a count only, there's nothing more to do. - if ( $this->query_vars['count'] ) { - // $comment_ids is actually a count in this case. - return intval( $comment_ids ); - } - - $comment_ids = array_map( 'intval', $comment_ids ); - - if ( 'ids' == $this->query_vars['fields'] ) { - $this->comments = $comment_ids; - return $this->comments; - } - - _prime_comment_caches( $comment_ids, $this->query_vars['update_comment_meta_cache'] ); - - // Fetch full comment objects from the primed cache. - $_comments = array(); - foreach ( $comment_ids as $comment_id ) { - if ( $_comment = get_comment( $comment_id ) ) { - $_comments[] = $_comment; - } - } - - // Prime comment post caches. - if ( $this->query_vars['update_comment_post_cache'] ) { - $comment_post_ids = array(); - foreach ( $_comments as $_comment ) { - $comment_post_ids[] = $_comment->comment_post_ID; - } - - _prime_post_caches( $comment_post_ids, false, false ); - } - - /** - * Filters the comment query results. - * - * @since 3.1.0 - * - * @param array $results An array of comments. - * @param WP_Comment_Query &$this Current instance of WP_Comment_Query, passed by reference. - */ - $_comments = apply_filters_ref_array( 'the_comments', array( $_comments, &$this ) ); - - // Convert to WP_Comment instances - $comments = array_map( 'get_comment', $_comments ); - - if ( $this->query_vars['hierarchical'] ) { - $comments = $this->fill_descendants( $comments ); - } - - $this->comments = $comments; - return $this->comments; - } - - /** - * Used internally to get a list of comment IDs matching the query vars. - * - * @since 4.4.0 - * @access protected - * - * @global wpdb $wpdb WordPress database abstraction object. - */ - protected function get_comment_ids() { - global $wpdb; - - // Assemble clauses related to 'comment_approved'. - $approved_clauses = array(); - - // 'status' accepts an array or a comma-separated string. - $status_clauses = array(); - $statuses = $this->query_vars['status']; - if ( ! is_array( $statuses ) ) { - $statuses = preg_split( '/[\s,]+/', $statuses ); - } - - // 'any' overrides other statuses. - if ( ! in_array( 'any', $statuses ) ) { - foreach ( $statuses as $status ) { - switch ( $status ) { - case 'hold' : - $status_clauses[] = "comment_approved = '0'"; - break; - - case 'approve' : - $status_clauses[] = "comment_approved = '1'"; - break; - - case 'all' : - case '' : - $status_clauses[] = "( comment_approved = '0' OR comment_approved = '1' )"; - break; - - default : - $status_clauses[] = $wpdb->prepare( "comment_approved = %s", $status ); - break; - } - } - - if ( ! empty( $status_clauses ) ) { - $approved_clauses[] = '( ' . implode( ' OR ', $status_clauses ) . ' )'; - } - } - - // User IDs or emails whose unapproved comments are included, regardless of $status. - if ( ! empty( $this->query_vars['include_unapproved'] ) ) { - $include_unapproved = $this->query_vars['include_unapproved']; - - // Accepts arrays or comma-separated strings. - if ( ! is_array( $include_unapproved ) ) { - $include_unapproved = preg_split( '/[\s,]+/', $include_unapproved ); - } - - $unapproved_ids = $unapproved_emails = array(); - foreach ( $include_unapproved as $unapproved_identifier ) { - // Numeric values are assumed to be user ids. - if ( is_numeric( $unapproved_identifier ) ) { - $approved_clauses[] = $wpdb->prepare( "( user_id = %d AND comment_approved = '0' )", $unapproved_identifier ); - - // Otherwise we match against email addresses. - } else { - $approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' )", $unapproved_identifier ); - } - } - } - - // Collapse comment_approved clauses into a single OR-separated clause. - if ( ! empty( $approved_clauses ) ) { - if ( 1 === count( $approved_clauses ) ) { - $this->sql_clauses['where']['approved'] = $approved_clauses[0]; - } else { - $this->sql_clauses['where']['approved'] = '( ' . implode( ' OR ', $approved_clauses ) . ' )'; - } - } - - $order = ( 'ASC' == strtoupper( $this->query_vars['order'] ) ) ? 'ASC' : 'DESC'; - - // Disable ORDER BY with 'none', an empty array, or boolean false. - if ( in_array( $this->query_vars['orderby'], array( 'none', array(), false ), true ) ) { - $orderby = ''; - } elseif ( ! empty( $this->query_vars['orderby'] ) ) { - $ordersby = is_array( $this->query_vars['orderby'] ) ? - $this->query_vars['orderby'] : - preg_split( '/[,\s]/', $this->query_vars['orderby'] ); - - $orderby_array = array(); - $found_orderby_comment_ID = false; - foreach ( $ordersby as $_key => $_value ) { - if ( ! $_value ) { - continue; - } - - if ( is_int( $_key ) ) { - $_orderby = $_value; - $_order = $order; - } else { - $_orderby = $_key; - $_order = $_value; - } - - if ( ! $found_orderby_comment_ID && in_array( $_orderby, array( 'comment_ID', 'comment__in' ) ) ) { - $found_orderby_comment_ID = true; - } - - $parsed = $this->parse_orderby( $_orderby ); - - if ( ! $parsed ) { - continue; - } - - if ( 'comment__in' === $_orderby ) { - $orderby_array[] = $parsed; - continue; - } - - $orderby_array[] = $parsed . ' ' . $this->parse_order( $_order ); - } - - // If no valid clauses were found, order by comment_date_gmt. - if ( empty( $orderby_array ) ) { - $orderby_array[] = "$wpdb->comments.comment_date_gmt $order"; - } - - // To ensure determinate sorting, always include a comment_ID clause. - if ( ! $found_orderby_comment_ID ) { - $comment_ID_order = ''; - - // Inherit order from comment_date or comment_date_gmt, if available. - foreach ( $orderby_array as $orderby_clause ) { - if ( preg_match( '/comment_date(?:_gmt)*\ (ASC|DESC)/', $orderby_clause, $match ) ) { - $comment_ID_order = $match[1]; - break; - } - } - - // If no date-related order is available, use the date from the first available clause. - if ( ! $comment_ID_order ) { - foreach ( $orderby_array as $orderby_clause ) { - if ( false !== strpos( 'ASC', $orderby_clause ) ) { - $comment_ID_order = 'ASC'; - } else { - $comment_ID_order = 'DESC'; - } - - break; - } - } - - // Default to DESC. - if ( ! $comment_ID_order ) { - $comment_ID_order = 'DESC'; - } - - $orderby_array[] = "$wpdb->comments.comment_ID $comment_ID_order"; - } - - $orderby = implode( ', ', $orderby_array ); - } else { - $orderby = "$wpdb->comments.comment_date_gmt $order"; - } - - $number = absint( $this->query_vars['number'] ); - $offset = absint( $this->query_vars['offset'] ); - - if ( ! empty( $number ) ) { - if ( $offset ) { - $limits = 'LIMIT ' . $offset . ',' . $number; - } else { - $limits = 'LIMIT ' . $number; - } - } - - if ( $this->query_vars['count'] ) { - $fields = 'COUNT(*)'; - } else { - $fields = "$wpdb->comments.comment_ID"; - } - - $post_id = absint( $this->query_vars['post_id'] ); - if ( ! empty( $post_id ) ) { - $this->sql_clauses['where']['post_id'] = $wpdb->prepare( 'comment_post_ID = %d', $post_id ); - } - - // Parse comment IDs for an IN clause. - if ( ! empty( $this->query_vars['comment__in'] ) ) { - $this->sql_clauses['where']['comment__in'] = "$wpdb->comments.comment_ID IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['comment__in'] ) ) . ' )'; - } - - // Parse comment IDs for a NOT IN clause. - if ( ! empty( $this->query_vars['comment__not_in'] ) ) { - $this->sql_clauses['where']['comment__not_in'] = "$wpdb->comments.comment_ID NOT IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['comment__not_in'] ) ) . ' )'; - } - - // Parse comment parent IDs for an IN clause. - if ( ! empty( $this->query_vars['parent__in'] ) ) { - $this->sql_clauses['where']['parent__in'] = 'comment_parent IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['parent__in'] ) ) . ' )'; - } - - // Parse comment parent IDs for a NOT IN clause. - if ( ! empty( $this->query_vars['parent__not_in'] ) ) { - $this->sql_clauses['where']['parent__not_in'] = 'comment_parent NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['parent__not_in'] ) ) . ' )'; - } - - // Parse comment post IDs for an IN clause. - if ( ! empty( $this->query_vars['post__in'] ) ) { - $this->sql_clauses['where']['post__in'] = 'comment_post_ID IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post__in'] ) ) . ' )'; - } - - // Parse comment post IDs for a NOT IN clause. - if ( ! empty( $this->query_vars['post__not_in'] ) ) { - $this->sql_clauses['where']['post__not_in'] = 'comment_post_ID NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post__not_in'] ) ) . ' )'; - } - - if ( '' !== $this->query_vars['author_email'] ) { - $this->sql_clauses['where']['author_email'] = $wpdb->prepare( 'comment_author_email = %s', $this->query_vars['author_email'] ); - } - - if ( '' !== $this->query_vars['author_url'] ) { - $this->sql_clauses['where']['author_url'] = $wpdb->prepare( 'comment_author_url = %s', $this->query_vars['author_url'] ); - } - - if ( '' !== $this->query_vars['karma'] ) { - $this->sql_clauses['where']['karma'] = $wpdb->prepare( 'comment_karma = %d', $this->query_vars['karma'] ); - } - - // Filtering by comment_type: 'type', 'type__in', 'type__not_in'. - $raw_types = array( - 'IN' => array_merge( (array) $this->query_vars['type'], (array) $this->query_vars['type__in'] ), - 'NOT IN' => (array) $this->query_vars['type__not_in'], - ); - - $comment_types = array(); - foreach ( $raw_types as $operator => $_raw_types ) { - $_raw_types = array_unique( $_raw_types ); - - foreach ( $_raw_types as $type ) { - switch ( $type ) { - // An empty translates to 'all', for backward compatibility - case '': - case 'all' : - break; - - case 'comment': - case 'comments': - $comment_types[ $operator ][] = "''"; - break; - - case 'pings': - $comment_types[ $operator ][] = "'pingback'"; - $comment_types[ $operator ][] = "'trackback'"; - break; - - default: - $comment_types[ $operator ][] = $wpdb->prepare( '%s', $type ); - break; - } - } - - if ( ! empty( $comment_types[ $operator ] ) ) { - $types_sql = implode( ', ', $comment_types[ $operator ] ); - $this->sql_clauses['where']['comment_type__' . strtolower( str_replace( ' ', '_', $operator ) ) ] = "comment_type $operator ($types_sql)"; - } - } - - $parent = $this->query_vars['parent']; - if ( $this->query_vars['hierarchical'] && ! $parent ) { - $parent = 0; - } - - if ( '' !== $parent ) { - $this->sql_clauses['where']['parent'] = $wpdb->prepare( 'comment_parent = %d', $parent ); - } - - if ( is_array( $this->query_vars['user_id'] ) ) { - $this->sql_clauses['where']['user_id'] = 'user_id IN (' . implode( ',', array_map( 'absint', $this->query_vars['user_id'] ) ) . ')'; - } elseif ( '' !== $this->query_vars['user_id'] ) { - $this->sql_clauses['where']['user_id'] = $wpdb->prepare( 'user_id = %d', $this->query_vars['user_id'] ); - } - - // Falsy search strings are ignored. - if ( strlen( $this->query_vars['search'] ) ) { - $search_sql = $this->get_search_sql( - $this->query_vars['search'], - array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_content' ) - ); - - // Strip leading 'AND'. - $this->sql_clauses['where']['search'] = preg_replace( '/^\s*AND\s*/', '', $search_sql ); - } - - // If any post-related query vars are passed, join the posts table. - $join_posts_table = false; - $plucked = wp_array_slice_assoc( $this->query_vars, array( 'post_author', 'post_name', 'post_parent' ) ); - $post_fields = array_filter( $plucked ); - - if ( ! empty( $post_fields ) ) { - $join_posts_table = true; - foreach ( $post_fields as $field_name => $field_value ) { - // $field_value may be an array. - $esses = array_fill( 0, count( (array) $field_value ), '%s' ); - $this->sql_clauses['where'][ $field_name ] = $wpdb->prepare( " {$wpdb->posts}.{$field_name} IN (" . implode( ',', $esses ) . ')', $field_value ); - } - } - - // 'post_status' and 'post_type' are handled separately, due to the specialized behavior of 'any'. - foreach ( array( 'post_status', 'post_type' ) as $field_name ) { - $q_values = array(); - if ( ! empty( $this->query_vars[ $field_name ] ) ) { - $q_values = $this->query_vars[ $field_name ]; - if ( ! is_array( $q_values ) ) { - $q_values = explode( ',', $q_values ); - } - - // 'any' will cause the query var to be ignored. - if ( in_array( 'any', $q_values, true ) || empty( $q_values ) ) { - continue; - } - - $join_posts_table = true; - - $esses = array_fill( 0, count( $q_values ), '%s' ); - $this->sql_clauses['where'][ $field_name ] = $wpdb->prepare( " {$wpdb->posts}.{$field_name} IN (" . implode( ',', $esses ) . ")", $q_values ); - } - } - - // Comment author IDs for an IN clause. - if ( ! empty( $this->query_vars['author__in'] ) ) { - $this->sql_clauses['where']['author__in'] = 'user_id IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['author__in'] ) ) . ' )'; - } - - // Comment author IDs for a NOT IN clause. - if ( ! empty( $this->query_vars['author__not_in'] ) ) { - $this->sql_clauses['where']['author__not_in'] = 'user_id NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['author__not_in'] ) ) . ' )'; - } - - // Post author IDs for an IN clause. - if ( ! empty( $this->query_vars['post_author__in'] ) ) { - $join_posts_table = true; - $this->sql_clauses['where']['post_author__in'] = 'post_author IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post_author__in'] ) ) . ' )'; - } - - // Post author IDs for a NOT IN clause. - if ( ! empty( $this->query_vars['post_author__not_in'] ) ) { - $join_posts_table = true; - $this->sql_clauses['where']['post_author__not_in'] = 'post_author NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['post_author__not_in'] ) ) . ' )'; - } - - $join = ''; - - if ( $join_posts_table ) { - $join .= "JOIN $wpdb->posts ON $wpdb->posts.ID = $wpdb->comments.comment_post_ID"; - } - - if ( ! empty( $this->meta_query_clauses ) ) { - $join .= $this->meta_query_clauses['join']; - - // Strip leading 'AND'. - $this->sql_clauses['where']['meta_query'] = preg_replace( '/^\s*AND\s*/', '', $this->meta_query_clauses['where'] ); - - if ( ! $this->query_vars['count'] ) { - $groupby = "{$wpdb->comments}.comment_ID"; - } - } - - if ( ! empty( $this->query_vars['date_query'] ) && is_array( $this->query_vars['date_query'] ) ) { - $this->date_query = new WP_Date_Query( $this->query_vars['date_query'], 'comment_date' ); - $this->sql_clauses['where']['date_query'] = preg_replace( '/^\s*AND\s*/', '', $this->date_query->get_sql() ); - } - - $where = implode( ' AND ', $this->sql_clauses['where'] ); - - $pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); - /** - * Filters the comment query clauses. - * - * @since 3.1.0 - * - * @param array $pieces A compacted array of comment query clauses. - * @param WP_Comment_Query &$this Current instance of WP_Comment_Query, passed by reference. - */ - $clauses = apply_filters_ref_array( 'comments_clauses', array( compact( $pieces ), &$this ) ); - - $fields = isset( $clauses[ 'fields' ] ) ? $clauses[ 'fields' ] : ''; - $join = isset( $clauses[ 'join' ] ) ? $clauses[ 'join' ] : ''; - $where = isset( $clauses[ 'where' ] ) ? $clauses[ 'where' ] : ''; - $orderby = isset( $clauses[ 'orderby' ] ) ? $clauses[ 'orderby' ] : ''; - $limits = isset( $clauses[ 'limits' ] ) ? $clauses[ 'limits' ] : ''; - $groupby = isset( $clauses[ 'groupby' ] ) ? $clauses[ 'groupby' ] : ''; - - $this->filtered_where_clause = $where; - - if ( $where ) { - $where = 'WHERE ' . $where; - } - - if ( $groupby ) { - $groupby = 'GROUP BY ' . $groupby; - } - - if ( $orderby ) { - $orderby = "ORDER BY $orderby"; - } - - $found_rows = ''; - if ( ! $this->query_vars['no_found_rows'] ) { - $found_rows = 'SQL_CALC_FOUND_ROWS'; - } - - $this->sql_clauses['select'] = "SELECT $found_rows $fields"; - $this->sql_clauses['from'] = "FROM $wpdb->comments $join"; - $this->sql_clauses['groupby'] = $groupby; - $this->sql_clauses['orderby'] = $orderby; - $this->sql_clauses['limits'] = $limits; - - $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['groupby']} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}"; - - if ( $this->query_vars['count'] ) { - return intval( $wpdb->get_var( $this->request ) ); - } else { - $comment_ids = $wpdb->get_col( $this->request ); - return array_map( 'intval', $comment_ids ); - } - } - - /** - * Populates found_comments and max_num_pages properties for the current - * query if the limit clause was used. - * - * @since 4.6.0 - * @access private - * - * @global wpdb $wpdb WordPress database abstraction object. - */ - private function set_found_comments() { - global $wpdb; - - if ( $this->query_vars['number'] && ! $this->query_vars['no_found_rows'] ) { - /** - * Filters the query used to retrieve found comment count. - * - * @since 4.4.0 - * - * @param string $found_comments_query SQL query. Default 'SELECT FOUND_ROWS()'. - * @param WP_Comment_Query $comment_query The `WP_Comment_Query` instance. - */ - $found_comments_query = apply_filters( 'found_comments_query', 'SELECT FOUND_ROWS()', $this ); - - $this->found_comments = (int) $wpdb->get_var( $found_comments_query ); - } - } - - /** - * Fetch descendants for located comments. - * - * Instead of calling `get_children()` separately on each child comment, we do a single set of queries to fetch - * the descendant trees for all matched top-level comments. - * - * @since 4.4.0 - * - * @param array $comments Array of top-level comments whose descendants should be filled in. - * @return array - */ - protected function fill_descendants( $comments ) { - global $wpdb; - - $levels = array( - 0 => wp_list_pluck( $comments, 'comment_ID' ), - ); - - /* - * The WHERE clause for the descendant query is the same as for the top-level - * query, minus the `parent`, `parent__in`, and `parent__not_in` sub-clauses. - */ - $_where = $this->filtered_where_clause; - $exclude_keys = array( 'parent', 'parent__in', 'parent__not_in' ); - foreach ( $exclude_keys as $exclude_key ) { - if ( isset( $this->sql_clauses['where'][ $exclude_key ] ) ) { - $clause = $this->sql_clauses['where'][ $exclude_key ]; - - // Strip the clause as well as any adjacent ANDs. - $pattern = '|(?:AND)?\s*' . $clause . '\s*(?:AND)?|'; - $_where_parts = preg_split( $pattern, $_where ); - - // Remove empties. - $_where_parts = array_filter( array_map( 'trim', $_where_parts ) ); - - // Reassemble with an AND. - $_where = implode( ' AND ', $_where_parts ); - } - } - - $key = md5( serialize( wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ) ) ); - $last_changed = wp_cache_get_last_changed( 'comment' ); - - // Fetch an entire level of the descendant tree at a time. - $level = 0; - do { - // Parent-child relationships may be cached. Only query for those that are not. - $child_ids = $uncached_parent_ids = array(); - $_parent_ids = $levels[ $level ]; - foreach ( $_parent_ids as $parent_id ) { - $cache_key = "get_comment_child_ids:$parent_id:$key:$last_changed"; - $parent_child_ids = wp_cache_get( $cache_key, 'comment' ); - if ( false !== $parent_child_ids ) { - $child_ids = array_merge( $child_ids, $parent_child_ids ); - } else { - $uncached_parent_ids[] = $parent_id; - } - } - - if ( $uncached_parent_ids ) { - // Fetch this level of comments. - $parent_query_args = $this->query_vars; - foreach ( $exclude_keys as $exclude_key ) { - $parent_query_args[ $exclude_key ] = ''; - } - $parent_query_args['parent__in'] = $uncached_parent_ids; - $parent_query_args['no_found_rows'] = true; - $parent_query_args['hierarchical'] = false; - $parent_query_args['offset'] = 0; - $parent_query_args['number'] = 0; - - $level_comments = get_comments( $parent_query_args ); - - // Cache parent-child relationships. - $parent_map = array_fill_keys( $uncached_parent_ids, array() ); - foreach ( $level_comments as $level_comment ) { - $parent_map[ $level_comment->comment_parent ][] = $level_comment->comment_ID; - $child_ids[] = $level_comment->comment_ID; - } - - foreach ( $parent_map as $parent_id => $children ) { - $cache_key = "get_comment_child_ids:$parent_id:$key:$last_changed"; - wp_cache_set( $cache_key, $children, 'comment' ); - } - } - - $level++; - $levels[ $level ] = $child_ids; - } while ( $child_ids ); - - // Prime comment caches for non-top-level comments. - $descendant_ids = array(); - for ( $i = 1, $c = count( $levels ); $i < $c; $i++ ) { - $descendant_ids = array_merge( $descendant_ids, $levels[ $i ] ); - } - - _prime_comment_caches( $descendant_ids, $this->query_vars['update_comment_meta_cache'] ); - - // Assemble a flat array of all comments + descendants. - $all_comments = $comments; - foreach ( $descendant_ids as $descendant_id ) { - $all_comments[] = get_comment( $descendant_id ); - } - - // If a threaded representation was requested, build the tree. - if ( 'threaded' === $this->query_vars['hierarchical'] ) { - $threaded_comments = $ref = array(); - foreach ( $all_comments as $k => $c ) { - $_c = get_comment( $c->comment_ID ); - - // If the comment isn't in the reference array, it goes in the top level of the thread. - if ( ! isset( $ref[ $c->comment_parent ] ) ) { - $threaded_comments[ $_c->comment_ID ] = $_c; - $ref[ $_c->comment_ID ] = $threaded_comments[ $_c->comment_ID ]; - - // Otherwise, set it as a child of its parent. - } else { - - $ref[ $_c->comment_parent ]->add_child( $_c ); - $ref[ $_c->comment_ID ] = $ref[ $_c->comment_parent ]->get_child( $_c->comment_ID ); - } - } - - // Set the 'populated_children' flag, to ensure additional database queries aren't run. - foreach ( $ref as $_ref ) { - $_ref->populated_children( true ); - } - - $comments = $threaded_comments; - } else { - $comments = $all_comments; - } - - return $comments; - } - - /** - * Used internally to generate an SQL string for searching across multiple columns - * - * @since 3.1.0 - * @access protected - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $string - * @param array $cols - * @return string - */ - protected function get_search_sql( $string, $cols ) { - global $wpdb; - - $like = '%' . $wpdb->esc_like( $string ) . '%'; - - $searches = array(); - foreach ( $cols as $col ) { - $searches[] = $wpdb->prepare( "$col LIKE %s", $like ); - } - - return ' AND (' . implode(' OR ', $searches) . ')'; - } - - /** - * Parse and sanitize 'orderby' keys passed to the comment query. - * - * @since 4.2.0 - * @access protected - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $orderby Alias for the field to order by. - * @return string|false Value to used in the ORDER clause. False otherwise. - */ - protected function parse_orderby( $orderby ) { - global $wpdb; - - $allowed_keys = array( - 'comment_agent', - 'comment_approved', - 'comment_author', - 'comment_author_email', - 'comment_author_IP', - 'comment_author_url', - 'comment_content', - 'comment_date', - 'comment_date_gmt', - 'comment_ID', - 'comment_karma', - 'comment_parent', - 'comment_post_ID', - 'comment_type', - 'user_id', - ); - - if ( ! empty( $this->query_vars['meta_key'] ) ) { - $allowed_keys[] = $this->query_vars['meta_key']; - $allowed_keys[] = 'meta_value'; - $allowed_keys[] = 'meta_value_num'; - } - - $meta_query_clauses = $this->meta_query->get_clauses(); - if ( $meta_query_clauses ) { - $allowed_keys = array_merge( $allowed_keys, array_keys( $meta_query_clauses ) ); - } - - $parsed = false; - if ( $orderby == $this->query_vars['meta_key'] || $orderby == 'meta_value' ) { - $parsed = "$wpdb->commentmeta.meta_value"; - } elseif ( $orderby == 'meta_value_num' ) { - $parsed = "$wpdb->commentmeta.meta_value+0"; - } elseif ( $orderby == 'comment__in' ) { - $comment__in = implode( ',', array_map( 'absint', $this->query_vars['comment__in'] ) ); - $parsed = "FIELD( {$wpdb->comments}.comment_ID, $comment__in )"; - } elseif ( in_array( $orderby, $allowed_keys ) ) { - - if ( isset( $meta_query_clauses[ $orderby ] ) ) { - $meta_clause = $meta_query_clauses[ $orderby ]; - $parsed = sprintf( "CAST(%s.meta_value AS %s)", esc_sql( $meta_clause['alias'] ), esc_sql( $meta_clause['cast'] ) ); - } else { - $parsed = "$wpdb->comments.$orderby"; - } - } - - return $parsed; - } - - /** - * Parse an 'order' query variable and cast it to ASC or DESC as necessary. - * - * @since 4.2.0 - * @access protected - * - * @param string $order The 'order' query variable. - * @return string The sanitized 'order' query variable. - */ - protected function parse_order( $order ) { - if ( ! is_string( $order ) || empty( $order ) ) { - return 'DESC'; - } - - if ( 'ASC' === strtoupper( $order ) ) { - return 'ASC'; - } else { - return 'DESC'; - } - } -} diff --git a/wp/wp-includes/class-wp-comment.php b/wp/wp-includes/class-wp-comment.php deleted file mode 100644 index 0e9f88a3..00000000 --- a/wp/wp-includes/class-wp-comment.php +++ /dev/null @@ -1,395 +0,0 @@ -<?php -/** - * Comment API: WP_Comment class - * - * @package WordPress - * @subpackage Comments - * @since 4.4.0 - */ - -/** - * Core class used to organize comments as instantiated objects with defined members. - * - * @since 4.4.0 - */ -final class WP_Comment { - - /** - * Comment ID. - * - * @since 4.4.0 - * @access public - * @var int - */ - public $comment_ID; - - /** - * ID of the post the comment is associated with. - * - * @since 4.4.0 - * @access public - * @var int - */ - public $comment_post_ID = 0; - - /** - * Comment author name. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $comment_author = ''; - - /** - * Comment author email address. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $comment_author_email = ''; - - /** - * Comment author URL. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $comment_author_url = ''; - - /** - * Comment author IP address (IPv4 format). - * - * @since 4.4.0 - * @access public - * @var string - */ - public $comment_author_IP = ''; - - /** - * Comment date in YYYY-MM-DD HH:MM:SS format. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $comment_date = '0000-00-00 00:00:00'; - - /** - * Comment GMT date in YYYY-MM-DD HH::MM:SS format. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $comment_date_gmt = '0000-00-00 00:00:00'; - - /** - * Comment content. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $comment_content; - - /** - * Comment karma count. - * - * @since 4.4.0 - * @access public - * @var int - */ - public $comment_karma = 0; - - /** - * Comment approval status. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $comment_approved = '1'; - - /** - * Comment author HTTP user agent. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $comment_agent = ''; - - /** - * Comment type. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $comment_type = ''; - - /** - * Parent comment ID. - * - * @since 4.4.0 - * @access public - * @var int - */ - public $comment_parent = 0; - - /** - * Comment author ID. - * - * @since 4.4.0 - * @access public - * @var int - */ - public $user_id = 0; - - /** - * Comment children. - * - * @since 4.4.0 - * @access protected - * @var array - */ - protected $children; - - /** - * Whether children have been populated for this comment object. - * - * @since 4.4.0 - * @access protected - * @var bool - */ - protected $populated_children = false; - - /** - * Post fields. - * - * @since 4.4.0 - * @access protected - * @var array - */ - protected $post_fields = array( 'post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_excerpt', 'post_status', 'comment_status', 'ping_status', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt', 'post_content_filtered', 'post_parent', 'guid', 'menu_order', 'post_type', 'post_mime_type', 'comment_count' ); - - /** - * Retrieves a WP_Comment instance. - * - * @since 4.4.0 - * @access public - * @static - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $id Comment ID. - * @return WP_Comment|false Comment object, otherwise false. - */ - public static function get_instance( $id ) { - global $wpdb; - - $comment_id = (int) $id; - if ( ! $comment_id ) { - return false; - } - - $_comment = wp_cache_get( $comment_id, 'comment' ); - - if ( ! $_comment ) { - $_comment = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_ID = %d LIMIT 1", $comment_id ) ); - - if ( ! $_comment ) { - return false; - } - - wp_cache_add( $_comment->comment_ID, $_comment, 'comment' ); - } - - return new WP_Comment( $_comment ); - } - - /** - * Constructor. - * - * Populates properties with object vars. - * - * @since 4.4.0 - * @access public - * - * @param WP_Comment $comment Comment object. - */ - public function __construct( $comment ) { - foreach ( get_object_vars( $comment ) as $key => $value ) { - $this->$key = $value; - } - } - - /** - * Convert object to array. - * - * @since 4.4.0 - * @access public - * - * @return array Object as array. - */ - public function to_array() { - return get_object_vars( $this ); - } - - /** - * Get the children of a comment. - * - * @since 4.4.0 - * @access public - * - * @param array $args { - * Array of arguments used to pass to get_comments() and determine format. - * - * @type string $format Return value format. 'tree' for a hierarchical tree, 'flat' for a flattened array. - * Default 'tree'. - * @type string $status Comment status to limit results by. Accepts 'hold' (`comment_status=0`), - * 'approve' (`comment_status=1`), 'all', or a custom comment status. - * Default 'all'. - * @type string $hierarchical Whether to include comment descendants in the results. - * 'threaded' returns a tree, with each comment's children - * stored in a `children` property on the `WP_Comment` object. - * 'flat' returns a flat array of found comments plus their children. - * Pass `false` to leave out descendants. - * The parameter is ignored (forced to `false`) when `$fields` is 'ids' or 'counts'. - * Accepts 'threaded', 'flat', or false. Default: 'threaded'. - * @type string|array $orderby Comment status or array of statuses. To use 'meta_value' - * or 'meta_value_num', `$meta_key` must also be defined. - * To sort by a specific `$meta_query` clause, use that - * clause's array key. Accepts 'comment_agent', - * 'comment_approved', 'comment_author', - * 'comment_author_email', 'comment_author_IP', - * 'comment_author_url', 'comment_content', 'comment_date', - * 'comment_date_gmt', 'comment_ID', 'comment_karma', - * 'comment_parent', 'comment_post_ID', 'comment_type', - * 'user_id', 'comment__in', 'meta_value', 'meta_value_num', - * the value of $meta_key, and the array keys of - * `$meta_query`. Also accepts false, an empty array, or - * 'none' to disable `ORDER BY` clause. - * } - * @return array Array of `WP_Comment` objects. - */ - public function get_children( $args = array() ) { - $defaults = array( - 'format' => 'tree', - 'status' => 'all', - 'hierarchical' => 'threaded', - 'orderby' => '', - ); - - $_args = wp_parse_args( $args, $defaults ); - $_args['parent'] = $this->comment_ID; - - if ( is_null( $this->children ) ) { - if ( $this->populated_children ) { - $this->children = array(); - } else { - $this->children = get_comments( $_args ); - } - } - - if ( 'flat' === $_args['format'] ) { - $children = array(); - foreach ( $this->children as $child ) { - $child_args = $_args; - $child_args['format'] = 'flat'; - // get_children() resets this value automatically. - unset( $child_args['parent'] ); - - $children = array_merge( $children, array( $child ), $child->get_children( $child_args ) ); - } - } else { - $children = $this->children; - } - - return $children; - } - - /** - * Add a child to the comment. - * - * Used by `WP_Comment_Query` when bulk-filling descendants. - * - * @since 4.4.0 - * @access public - * - * @param WP_Comment $child Child comment. - */ - public function add_child( WP_Comment $child ) { - $this->children[ $child->comment_ID ] = $child; - } - - /** - * Get a child comment by ID. - * - * @since 4.4.0 - * @access public - * - * @param int $child_id ID of the child. - * @return WP_Comment|bool Returns the comment object if found, otherwise false. - */ - public function get_child( $child_id ) { - if ( isset( $this->children[ $child_id ] ) ) { - return $this->children[ $child_id ]; - } - - return false; - } - - /** - * Set the 'populated_children' flag. - * - * This flag is important for ensuring that calling `get_children()` on a childless comment will not trigger - * unneeded database queries. - * - * @since 4.4.0 - * - * @param bool $set Whether the comment's children have already been populated. - */ - public function populated_children( $set ) { - $this->populated_children = (bool) $set; - } - - /** - * Check whether a non-public property is set. - * - * If `$name` matches a post field, the comment post will be loaded and the post's value checked. - * - * @since 4.4.0 - * @access public - * - * @param string $name Property name. - * @return bool - */ - public function __isset( $name ) { - if ( in_array( $name, $this->post_fields ) && 0 !== (int) $this->comment_post_ID ) { - $post = get_post( $this->comment_post_ID ); - return property_exists( $post, $name ); - } - } - - /** - * Magic getter. - * - * If `$name` matches a post field, the comment post will be loaded and the post's value returned. - * - * @since 4.4.0 - * @access public - * - * @param string $name - * @return mixed - */ - public function __get( $name ) { - if ( in_array( $name, $this->post_fields ) ) { - $post = get_post( $this->comment_post_ID ); - return $post->$name; - } - } -} diff --git a/wp/wp-includes/class-wp-customize-control.php b/wp/wp-includes/class-wp-customize-control.php deleted file mode 100644 index 07c6dcfc..00000000 --- a/wp/wp-includes/class-wp-customize-control.php +++ /dev/null @@ -1,703 +0,0 @@ -<?php -/** - * WordPress Customize Control classes - * - * @package WordPress - * @subpackage Customize - * @since 3.4.0 - */ - -/** - * Customize Control class. - * - * @since 3.4.0 - */ -class WP_Customize_Control { - - /** - * Incremented with each new class instantiation, then stored in $instance_number. - * - * Used when sorting two instances whose priorities are equal. - * - * @since 4.1.0 - * - * @static - * @access protected - * @var int - */ - protected static $instance_count = 0; - - /** - * Order in which this instance was created in relation to other instances. - * - * @since 4.1.0 - * @access public - * @var int - */ - public $instance_number; - - /** - * @access public - * @var WP_Customize_Manager - */ - public $manager; - - /** - * @access public - * @var string - */ - public $id; - - /** - * All settings tied to the control. - * - * @access public - * @var array - */ - public $settings; - - /** - * The primary setting for the control (if there is one). - * - * @access public - * @var string - */ - public $setting = 'default'; - - /** - * Capability required to use this control. - * - * Normally this is empty and the capability is derived from the capabilities - * of the associated `$settings`. - * - * @since 4.5.0 - * @access public - * @var string - */ - public $capability; - - /** - * @access public - * @var int - */ - public $priority = 10; - - /** - * @access public - * @var string - */ - public $section = ''; - - /** - * @access public - * @var string - */ - public $label = ''; - - /** - * @access public - * @var string - */ - public $description = ''; - - /** - * @todo: Remove choices - * - * @access public - * @var array - */ - public $choices = array(); - - /** - * @access public - * @var array - */ - public $input_attrs = array(); - - /** - * Show UI for adding new content, currently only used for the dropdown-pages control. - * - * @since 4.7.0 - * @access public - * @var bool - */ - public $allow_addition = false; - - /** - * @deprecated It is better to just call the json() method - * @access public - * @var array - */ - public $json = array(); - - /** - * @access public - * @var string - */ - public $type = 'text'; - - /** - * Callback. - * - * @since 4.0.0 - * @access public - * - * @see WP_Customize_Control::active() - * - * @var callable Callback is called with one argument, the instance of - * WP_Customize_Control, and returns bool to indicate whether - * the control is active (such as it relates to the URL - * currently being previewed). - */ - public $active_callback = ''; - - /** - * Constructor. - * - * Supplied `$args` override class property defaults. - * - * If `$args['settings']` is not defined, use the $id as the setting ID. - * - * @since 3.4.0 - * - * @param WP_Customize_Manager $manager Customizer bootstrap instance. - * @param string $id Control ID. - * @param array $args { - * Optional. Arguments to override class property defaults. - * - * @type int $instance_number Order in which this instance was created in relation - * to other instances. - * @type WP_Customize_Manager $manager Customizer bootstrap instance. - * @type string $id Control ID. - * @type array $settings All settings tied to the control. If undefined, `$id` will - * be used. - * @type string $setting The primary setting for the control (if there is one). - * Default 'default'. - * @type int $priority Order priority to load the control. Default 10. - * @type string $section Section the control belongs to. Default empty. - * @type string $label Label for the control. Default empty. - * @type string $description Description for the control. Default empty. - * @type array $choices List of choices for 'radio' or 'select' type controls, where - * values are the keys, and labels are the values. - * Default empty array. - * @type array $input_attrs List of custom input attributes for control output, where - * attribute names are the keys and values are the values. Not - * used for 'checkbox', 'radio', 'select', 'textarea', or - * 'dropdown-pages' control types. Default empty array. - * @type array $json Deprecated. Use WP_Customize_Control::json() instead. - * @type string $type Control type. Core controls include 'text', 'checkbox', - * 'textarea', 'radio', 'select', and 'dropdown-pages'. Additional - * input types such as 'email', 'url', 'number', 'hidden', and - * 'date' are supported implicitly. Default 'text'. - * } - */ - public function __construct( $manager, $id, $args = array() ) { - $keys = array_keys( get_object_vars( $this ) ); - foreach ( $keys as $key ) { - if ( isset( $args[ $key ] ) ) { - $this->$key = $args[ $key ]; - } - } - - $this->manager = $manager; - $this->id = $id; - if ( empty( $this->active_callback ) ) { - $this->active_callback = array( $this, 'active_callback' ); - } - self::$instance_count += 1; - $this->instance_number = self::$instance_count; - - // Process settings. - if ( ! isset( $this->settings ) ) { - $this->settings = $id; - } - - $settings = array(); - if ( is_array( $this->settings ) ) { - foreach ( $this->settings as $key => $setting ) { - $settings[ $key ] = $this->manager->get_setting( $setting ); - } - } else if ( is_string( $this->settings ) ) { - $this->setting = $this->manager->get_setting( $this->settings ); - $settings['default'] = $this->setting; - } - $this->settings = $settings; - } - - /** - * Enqueue control related scripts/styles. - * - * @since 3.4.0 - */ - public function enqueue() {} - - /** - * Check whether control is active to current Customizer preview. - * - * @since 4.0.0 - * @access public - * - * @return bool Whether the control is active to the current preview. - */ - final public function active() { - $control = $this; - $active = call_user_func( $this->active_callback, $this ); - - /** - * Filters response of WP_Customize_Control::active(). - * - * @since 4.0.0 - * - * @param bool $active Whether the Customizer control is active. - * @param WP_Customize_Control $control WP_Customize_Control instance. - */ - $active = apply_filters( 'customize_control_active', $active, $control ); - - return $active; - } - - /** - * Default callback used when invoking WP_Customize_Control::active(). - * - * Subclasses can override this with their specific logic, or they may - * provide an 'active_callback' argument to the constructor. - * - * @since 4.0.0 - * @access public - * - * @return true Always true. - */ - public function active_callback() { - return true; - } - - /** - * Fetch a setting's value. - * Grabs the main setting by default. - * - * @since 3.4.0 - * - * @param string $setting_key - * @return mixed The requested setting's value, if the setting exists. - */ - final public function value( $setting_key = 'default' ) { - if ( isset( $this->settings[ $setting_key ] ) ) { - return $this->settings[ $setting_key ]->value(); - } - } - - /** - * Refresh the parameters passed to the JavaScript via JSON. - * - * @since 3.4.0 - */ - public function to_json() { - $this->json['settings'] = array(); - foreach ( $this->settings as $key => $setting ) { - $this->json['settings'][ $key ] = $setting->id; - } - - $this->json['type'] = $this->type; - $this->json['priority'] = $this->priority; - $this->json['active'] = $this->active(); - $this->json['section'] = $this->section; - $this->json['content'] = $this->get_content(); - $this->json['label'] = $this->label; - $this->json['description'] = $this->description; - $this->json['instanceNumber'] = $this->instance_number; - - if ( 'dropdown-pages' === $this->type ) { - $this->json['allow_addition'] = $this->allow_addition; - } - } - - /** - * Get the data to export to the client via JSON. - * - * @since 4.1.0 - * - * @return array Array of parameters passed to the JavaScript. - */ - public function json() { - $this->to_json(); - return $this->json; - } - - /** - * Checks if the user can use this control. - * - * Returns false if the user cannot manipulate one of the associated settings, - * or if one of the associated settings does not exist. Also returns false if - * the associated section does not exist or if its capability check returns - * false. - * - * @since 3.4.0 - * - * @return bool False if theme doesn't support the control or user doesn't have the required permissions, otherwise true. - */ - final public function check_capabilities() { - if ( ! empty( $this->capability ) && ! current_user_can( $this->capability ) ) { - return false; - } - - foreach ( $this->settings as $setting ) { - if ( ! $setting || ! $setting->check_capabilities() ) { - return false; - } - } - - $section = $this->manager->get_section( $this->section ); - if ( isset( $section ) && ! $section->check_capabilities() ) { - return false; - } - - return true; - } - - /** - * Get the control's content for insertion into the Customizer pane. - * - * @since 4.1.0 - * - * @return string Contents of the control. - */ - final public function get_content() { - ob_start(); - $this->maybe_render(); - return trim( ob_get_clean() ); - } - - /** - * Check capabilities and render the control. - * - * @since 3.4.0 - * @uses WP_Customize_Control::render() - */ - final public function maybe_render() { - if ( ! $this->check_capabilities() ) - return; - - /** - * Fires just before the current Customizer control is rendered. - * - * @since 3.4.0 - * - * @param WP_Customize_Control $this WP_Customize_Control instance. - */ - do_action( 'customize_render_control', $this ); - - /** - * Fires just before a specific Customizer control is rendered. - * - * The dynamic portion of the hook name, `$this->id`, refers to - * the control ID. - * - * @since 3.4.0 - * - * @param WP_Customize_Control $this WP_Customize_Control instance. - */ - do_action( "customize_render_control_{$this->id}", $this ); - - $this->render(); - } - - /** - * Renders the control wrapper and calls $this->render_content() for the internals. - * - * @since 3.4.0 - */ - protected function render() { - $id = 'customize-control-' . str_replace( array( '[', ']' ), array( '-', '' ), $this->id ); - $class = 'customize-control customize-control-' . $this->type; - - ?><li id="<?php echo esc_attr( $id ); ?>" class="<?php echo esc_attr( $class ); ?>"> - <?php $this->render_content(); ?> - </li><?php - } - - /** - * Get the data link attribute for a setting. - * - * @since 3.4.0 - * - * @param string $setting_key - * @return string Data link parameter, if $setting_key is a valid setting, empty string otherwise. - */ - public function get_link( $setting_key = 'default' ) { - if ( ! isset( $this->settings[ $setting_key ] ) ) - return ''; - - return 'data-customize-setting-link="' . esc_attr( $this->settings[ $setting_key ]->id ) . '"'; - } - - /** - * Render the data link attribute for the control's input element. - * - * @since 3.4.0 - * @uses WP_Customize_Control::get_link() - * - * @param string $setting_key - */ - public function link( $setting_key = 'default' ) { - echo $this->get_link( $setting_key ); - } - - /** - * Render the custom attributes for the control's input element. - * - * @since 4.0.0 - * @access public - */ - public function input_attrs() { - foreach ( $this->input_attrs as $attr => $value ) { - echo $attr . '="' . esc_attr( $value ) . '" '; - } - } - - /** - * Render the control's content. - * - * Allows the content to be overridden without having to rewrite the wrapper in `$this::render()`. - * - * Supports basic input types `text`, `checkbox`, `textarea`, `radio`, `select` and `dropdown-pages`. - * Additional input types such as `email`, `url`, `number`, `hidden` and `date` are supported implicitly. - * - * Control content can alternately be rendered in JS. See WP_Customize_Control::print_template(). - * - * @since 3.4.0 - */ - protected function render_content() { - switch( $this->type ) { - case 'checkbox': - ?> - <label> - <input type="checkbox" value="<?php echo esc_attr( $this->value() ); ?>" <?php $this->link(); checked( $this->value() ); ?> /> - <?php echo esc_html( $this->label ); ?> - <?php if ( ! empty( $this->description ) ) : ?> - <span class="description customize-control-description"><?php echo $this->description; ?></span> - <?php endif; ?> - </label> - <?php - break; - case 'radio': - if ( empty( $this->choices ) ) - return; - - $name = '_customize-radio-' . $this->id; - - if ( ! empty( $this->label ) ) : ?> - <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span> - <?php endif; - if ( ! empty( $this->description ) ) : ?> - <span class="description customize-control-description"><?php echo $this->description ; ?></span> - <?php endif; - - foreach ( $this->choices as $value => $label ) : - ?> - <label> - <input type="radio" value="<?php echo esc_attr( $value ); ?>" name="<?php echo esc_attr( $name ); ?>" <?php $this->link(); checked( $this->value(), $value ); ?> /> - <?php echo esc_html( $label ); ?><br/> - </label> - <?php - endforeach; - break; - case 'select': - if ( empty( $this->choices ) ) - return; - - ?> - <label> - <?php if ( ! empty( $this->label ) ) : ?> - <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span> - <?php endif; - if ( ! empty( $this->description ) ) : ?> - <span class="description customize-control-description"><?php echo $this->description; ?></span> - <?php endif; ?> - - <select <?php $this->link(); ?>> - <?php - foreach ( $this->choices as $value => $label ) - echo '<option value="' . esc_attr( $value ) . '"' . selected( $this->value(), $value, false ) . '>' . $label . '</option>'; - ?> - </select> - </label> - <?php - break; - case 'textarea': - ?> - <label> - <?php if ( ! empty( $this->label ) ) : ?> - <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span> - <?php endif; - if ( ! empty( $this->description ) ) : ?> - <span class="description customize-control-description"><?php echo $this->description; ?></span> - <?php endif; ?> - <textarea rows="5" <?php $this->input_attrs(); ?> <?php $this->link(); ?>><?php echo esc_textarea( $this->value() ); ?></textarea> - </label> - <?php - break; - case 'dropdown-pages': - ?> - <label> - <?php if ( ! empty( $this->label ) ) : ?> - <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span> - <?php endif; - if ( ! empty( $this->description ) ) : ?> - <span class="description customize-control-description"><?php echo $this->description; ?></span> - <?php endif; ?> - - <?php - $dropdown_name = '_customize-dropdown-pages-' . $this->id; - $show_option_none = __( '— Select —' ); - $option_none_value = '0'; - $dropdown = wp_dropdown_pages( - array( - 'name' => $dropdown_name, - 'echo' => 0, - 'show_option_none' => $show_option_none, - 'option_none_value' => $option_none_value, - 'selected' => $this->value(), - ) - ); - if ( empty( $dropdown ) ) { - $dropdown = sprintf( '<select id="%1$s" name="%1$s">', esc_attr( $dropdown_name ) ); - $dropdown .= sprintf( '<option value="%1$s">%2$s</option>', esc_attr( $option_none_value ), esc_html( $show_option_none ) ); - $dropdown .= '</select>'; - } - - // Hackily add in the data link parameter. - $dropdown = str_replace( '<select', '<select ' . $this->get_link(), $dropdown ); - - // Even more hacikly add auto-draft page stubs. - // @todo Eventually this should be removed in favor of the pages being injected into the underlying get_pages() call. See <https://github.com/xwp/wp-customize-posts/pull/250>. - $nav_menus_created_posts_setting = $this->manager->get_setting( 'nav_menus_created_posts' ); - if ( $nav_menus_created_posts_setting && current_user_can( 'publish_pages' ) ) { - $auto_draft_page_options = ''; - foreach ( $nav_menus_created_posts_setting->value() as $auto_draft_page_id ) { - $post = get_post( $auto_draft_page_id ); - if ( $post && 'page' === $post->post_type ) { - $auto_draft_page_options .= sprintf( '<option value="%1$s">%2$s</option>', esc_attr( $post->ID ), esc_html( $post->post_title ) ); - } - } - if ( $auto_draft_page_options ) { - $dropdown = str_replace( '</select>', $auto_draft_page_options . '</select>', $dropdown ); - } - } - - echo $dropdown; - ?> - </label> - <?php if ( $this->allow_addition && current_user_can( 'publish_pages' ) && current_user_can( 'edit_theme_options' ) ) : // Currently tied to menus functionality. ?> - <button type="button" class="button-link add-new-toggle"><?php - /* translators: %s: add new page label */ - printf( __( '+ %s' ), get_post_type_object( 'page' )->labels->add_new_item ); - ?></button> - <div class="new-content-item"> - <label for="create-input-<?php echo $this->id; ?>"><span class="screen-reader-text"><?php _e( 'New page title' ); ?></span></label> - <input type="text" id="create-input-<?php echo $this->id; ?>" class="create-item-input" placeholder="<?php esc_attr_e( 'New page title…' ); ?>"> - <button type="button" class="button add-content"><?php _e( 'Add' ); ?></button> - </div> - <?php endif; - break; - default: - ?> - <label> - <?php if ( ! empty( $this->label ) ) : ?> - <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span> - <?php endif; - if ( ! empty( $this->description ) ) : ?> - <span class="description customize-control-description"><?php echo $this->description; ?></span> - <?php endif; ?> - <input type="<?php echo esc_attr( $this->type ); ?>" <?php $this->input_attrs(); ?> value="<?php echo esc_attr( $this->value() ); ?>" <?php $this->link(); ?> /> - </label> - <?php - break; - } - } - - /** - * Render the control's JS template. - * - * This function is only run for control types that have been registered with - * WP_Customize_Manager::register_control_type(). - * - * In the future, this will also print the template for the control's container - * element and be override-able. - * - * @since 4.1.0 - */ - final public function print_template() { - ?> - <script type="text/html" id="tmpl-customize-control-<?php echo $this->type; ?>-content"> - <?php $this->content_template(); ?> - </script> - <?php - } - - /** - * An Underscore (JS) template for this control's content (but not its container). - * - * Class variables for this control class are available in the `data` JS object; - * export custom variables by overriding WP_Customize_Control::to_json(). - * - * @see WP_Customize_Control::print_template() - * - * @since 4.1.0 - */ - protected function content_template() {} - -} - -/** WP_Customize_Color_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-color-control.php' ); - -/** WP_Customize_Media_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-media-control.php' ); - -/** WP_Customize_Upload_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-upload-control.php' ); - -/** WP_Customize_Image_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-image-control.php' ); - -/** WP_Customize_Background_Image_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-background-image-control.php' ); - -/** WP_Customize_Background_Position_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-background-position-control.php' ); - -/** WP_Customize_Cropped_Image_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-cropped-image-control.php' ); - -/** WP_Customize_Site_Icon_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-site-icon-control.php' ); - -/** WP_Customize_Header_Image_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-header-image-control.php' ); - -/** WP_Customize_Theme_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-theme-control.php' ); - -/** WP_Widget_Area_Customize_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-widget-area-customize-control.php' ); - -/** WP_Widget_Form_Customize_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-widget-form-customize-control.php' ); - -/** WP_Customize_Nav_Menu_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-control.php' ); - -/** WP_Customize_Nav_Menu_Item_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-control.php' ); - -/** WP_Customize_Nav_Menu_Location_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-location-control.php' ); - -/** WP_Customize_Nav_Menu_Name_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-name-control.php' ); - -/** WP_Customize_Nav_Menu_Auto_Add_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-auto-add-control.php' ); - -/** WP_Customize_New_Menu_Control class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-new-menu-control.php' ); diff --git a/wp/wp-includes/class-wp-customize-manager.php b/wp/wp-includes/class-wp-customize-manager.php deleted file mode 100644 index e055ae90..00000000 --- a/wp/wp-includes/class-wp-customize-manager.php +++ /dev/null @@ -1,4368 +0,0 @@ -<?php -/** - * WordPress Customize Manager classes - * - * @package WordPress - * @subpackage Customize - * @since 3.4.0 - */ - -/** - * Customize Manager class. - * - * Bootstraps the Customize experience on the server-side. - * - * Sets up the theme-switching process if a theme other than the active one is - * being previewed and customized. - * - * Serves as a factory for Customize Controls and Settings, and - * instantiates default Customize Controls and Settings. - * - * @since 3.4.0 - */ -final class WP_Customize_Manager { - /** - * An instance of the theme being previewed. - * - * @since 3.4.0 - * @access protected - * @var WP_Theme - */ - protected $theme; - - /** - * The directory name of the previously active theme (within the theme_root). - * - * @since 3.4.0 - * @access protected - * @var string - */ - protected $original_stylesheet; - - /** - * Whether this is a Customizer pageload. - * - * @since 3.4.0 - * @access protected - * @var bool - */ - protected $previewing = false; - - /** - * Methods and properties dealing with managing widgets in the Customizer. - * - * @since 3.9.0 - * @access public - * @var WP_Customize_Widgets - */ - public $widgets; - - /** - * Methods and properties dealing with managing nav menus in the Customizer. - * - * @since 4.3.0 - * @access public - * @var WP_Customize_Nav_Menus - */ - public $nav_menus; - - /** - * Methods and properties dealing with selective refresh in the Customizer preview. - * - * @since 4.5.0 - * @access public - * @var WP_Customize_Selective_Refresh - */ - public $selective_refresh; - - /** - * Registered instances of WP_Customize_Setting. - * - * @since 3.4.0 - * @access protected - * @var array - */ - protected $settings = array(); - - /** - * Sorted top-level instances of WP_Customize_Panel and WP_Customize_Section. - * - * @since 4.0.0 - * @access protected - * @var array - */ - protected $containers = array(); - - /** - * Registered instances of WP_Customize_Panel. - * - * @since 4.0.0 - * @access protected - * @var array - */ - protected $panels = array(); - - /** - * List of core components. - * - * @since 4.5.0 - * @access protected - * @var array - */ - protected $components = array( 'widgets', 'nav_menus' ); - - /** - * Registered instances of WP_Customize_Section. - * - * @since 3.4.0 - * @access protected - * @var array - */ - protected $sections = array(); - - /** - * Registered instances of WP_Customize_Control. - * - * @since 3.4.0 - * @access protected - * @var array - */ - protected $controls = array(); - - /** - * Panel types that may be rendered from JS templates. - * - * @since 4.3.0 - * @access protected - * @var array - */ - protected $registered_panel_types = array(); - - /** - * Section types that may be rendered from JS templates. - * - * @since 4.3.0 - * @access protected - * @var array - */ - protected $registered_section_types = array(); - - /** - * Control types that may be rendered from JS templates. - * - * @since 4.1.0 - * @access protected - * @var array - */ - protected $registered_control_types = array(); - - /** - * Initial URL being previewed. - * - * @since 4.4.0 - * @access protected - * @var string - */ - protected $preview_url; - - /** - * URL to link the user to when closing the Customizer. - * - * @since 4.4.0 - * @access protected - * @var string - */ - protected $return_url; - - /** - * Mapping of 'panel', 'section', 'control' to the ID which should be autofocused. - * - * @since 4.4.0 - * @access protected - * @var array - */ - protected $autofocus = array(); - - /** - * Messenger channel. - * - * @since 4.7.0 - * @access protected - * @var string - */ - protected $messenger_channel; - - /** - * Unsanitized values for Customize Settings parsed from $_POST['customized']. - * - * @var array - */ - private $_post_values; - - /** - * Changeset UUID. - * - * @since 4.7.0 - * @access private - * @var string - */ - private $_changeset_uuid; - - /** - * Changeset post ID. - * - * @since 4.7.0 - * @access private - * @var int|false - */ - private $_changeset_post_id; - - /** - * Changeset data loaded from a customize_changeset post. - * - * @since 4.7.0 - * @access private - * @var array - */ - private $_changeset_data; - - /** - * Constructor. - * - * @since 3.4.0 - * @since 4.7.0 Added $args param. - * - * @param array $args { - * Args. - * - * @type string $changeset_uuid Changeset UUID, the post_name for the customize_changeset post containing the customized state. Defaults to new UUID. - * @type string $theme Theme to be previewed (for theme switch). Defaults to customize_theme or theme query params. - * @type string $messenger_channel Messenger channel. Defaults to customize_messenger_channel query param. - * } - */ - public function __construct( $args = array() ) { - - $args = array_merge( - array_fill_keys( array( 'changeset_uuid', 'theme', 'messenger_channel' ), null ), - $args - ); - - // Note that the UUID format will be validated in the setup_theme() method. - if ( ! isset( $args['changeset_uuid'] ) ) { - $args['changeset_uuid'] = wp_generate_uuid4(); - } - - // The theme and messenger_channel should be supplied via $args, but they are also looked at in the $_REQUEST global here for back-compat. - if ( ! isset( $args['theme'] ) ) { - if ( isset( $_REQUEST['customize_theme'] ) ) { - $args['theme'] = wp_unslash( $_REQUEST['customize_theme'] ); - } elseif ( isset( $_REQUEST['theme'] ) ) { // Deprecated. - $args['theme'] = wp_unslash( $_REQUEST['theme'] ); - } - } - if ( ! isset( $args['messenger_channel'] ) && isset( $_REQUEST['customize_messenger_channel'] ) ) { - $args['messenger_channel'] = sanitize_key( wp_unslash( $_REQUEST['customize_messenger_channel'] ) ); - } - - $this->original_stylesheet = get_stylesheet(); - $this->theme = wp_get_theme( $args['theme'] ); - $this->messenger_channel = $args['messenger_channel']; - $this->_changeset_uuid = $args['changeset_uuid']; - - require_once( ABSPATH . WPINC . '/class-wp-customize-setting.php' ); - require_once( ABSPATH . WPINC . '/class-wp-customize-panel.php' ); - require_once( ABSPATH . WPINC . '/class-wp-customize-section.php' ); - require_once( ABSPATH . WPINC . '/class-wp-customize-control.php' ); - - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-color-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-media-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-upload-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-image-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-background-image-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-background-position-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-cropped-image-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-site-icon-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-header-image-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-theme-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-widget-area-customize-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-widget-form-customize-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-location-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-name-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-auto-add-control.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-new-menu-control.php' ); - - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menus-panel.php' ); - - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-themes-section.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-sidebar-section.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-section.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-new-menu-section.php' ); - - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-custom-css-setting.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-filter-setting.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-header-image-setting.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-background-image-setting.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-setting.php' ); - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-setting.php' ); - - /** - * Filters the core Customizer components to load. - * - * This allows Core components to be excluded from being instantiated by - * filtering them out of the array. Note that this filter generally runs - * during the {@see 'plugins_loaded'} action, so it cannot be added - * in a theme. - * - * @since 4.4.0 - * - * @see WP_Customize_Manager::__construct() - * - * @param array $components List of core components to load. - * @param WP_Customize_Manager $this WP_Customize_Manager instance. - */ - $components = apply_filters( 'customize_loaded_components', $this->components, $this ); - - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-selective-refresh.php' ); - $this->selective_refresh = new WP_Customize_Selective_Refresh( $this ); - - if ( in_array( 'widgets', $components, true ) ) { - require_once( ABSPATH . WPINC . '/class-wp-customize-widgets.php' ); - $this->widgets = new WP_Customize_Widgets( $this ); - } - - if ( in_array( 'nav_menus', $components, true ) ) { - require_once( ABSPATH . WPINC . '/class-wp-customize-nav-menus.php' ); - $this->nav_menus = new WP_Customize_Nav_Menus( $this ); - } - - add_action( 'setup_theme', array( $this, 'setup_theme' ) ); - add_action( 'wp_loaded', array( $this, 'wp_loaded' ) ); - - // Do not spawn cron (especially the alternate cron) while running the Customizer. - remove_action( 'init', 'wp_cron' ); - - // Do not run update checks when rendering the controls. - remove_action( 'admin_init', '_maybe_update_core' ); - remove_action( 'admin_init', '_maybe_update_plugins' ); - remove_action( 'admin_init', '_maybe_update_themes' ); - - add_action( 'wp_ajax_customize_save', array( $this, 'save' ) ); - add_action( 'wp_ajax_customize_refresh_nonces', array( $this, 'refresh_nonces' ) ); - - add_action( 'customize_register', array( $this, 'register_controls' ) ); - add_action( 'customize_register', array( $this, 'register_dynamic_settings' ), 11 ); // allow code to create settings first - add_action( 'customize_controls_init', array( $this, 'prepare_controls' ) ); - add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_control_scripts' ) ); - - // Render Panel, Section, and Control templates. - add_action( 'customize_controls_print_footer_scripts', array( $this, 'render_panel_templates' ), 1 ); - add_action( 'customize_controls_print_footer_scripts', array( $this, 'render_section_templates' ), 1 ); - add_action( 'customize_controls_print_footer_scripts', array( $this, 'render_control_templates' ), 1 ); - - // Export header video settings with the partial response. - add_filter( 'customize_render_partials_response', array( $this, 'export_header_video_settings' ), 10, 3 ); - - // Export the settings to JS via the _wpCustomizeSettings variable. - add_action( 'customize_controls_print_footer_scripts', array( $this, 'customize_pane_settings' ), 1000 ); - } - - /** - * Return true if it's an Ajax request. - * - * @since 3.4.0 - * @since 4.2.0 Added `$action` param. - * @access public - * - * @param string|null $action Whether the supplied Ajax action is being run. - * @return bool True if it's an Ajax request, false otherwise. - */ - public function doing_ajax( $action = null ) { - if ( ! wp_doing_ajax() ) { - return false; - } - - if ( ! $action ) { - return true; - } else { - /* - * Note: we can't just use doing_action( "wp_ajax_{$action}" ) because we need - * to check before admin-ajax.php gets to that point. - */ - return isset( $_REQUEST['action'] ) && wp_unslash( $_REQUEST['action'] ) === $action; - } - } - - /** - * Custom wp_die wrapper. Returns either the standard message for UI - * or the Ajax message. - * - * @since 3.4.0 - * - * @param mixed $ajax_message Ajax return - * @param mixed $message UI message - */ - protected function wp_die( $ajax_message, $message = null ) { - if ( $this->doing_ajax() ) { - wp_die( $ajax_message ); - } - - if ( ! $message ) { - $message = __( 'Cheatin’ uh?' ); - } - - if ( $this->messenger_channel ) { - ob_start(); - wp_enqueue_scripts(); - wp_print_scripts( array( 'customize-base' ) ); - - $settings = array( - 'messengerArgs' => array( - 'channel' => $this->messenger_channel, - 'url' => wp_customize_url(), - ), - 'error' => $ajax_message, - ); - ?> - <script> - ( function( api, settings ) { - var preview = new api.Messenger( settings.messengerArgs ); - preview.send( 'iframe-loading-error', settings.error ); - } )( wp.customize, <?php echo wp_json_encode( $settings ) ?> ); - </script> - <?php - $message .= ob_get_clean(); - } - - wp_die( $message ); - } - - /** - * Return the Ajax wp_die() handler if it's a customized request. - * - * @since 3.4.0 - * @deprecated 4.7.0 - * - * @return callable Die handler. - */ - public function wp_die_handler() { - _deprecated_function( __METHOD__, '4.7.0' ); - - if ( $this->doing_ajax() || isset( $_POST['customized'] ) ) { - return '_ajax_wp_die_handler'; - } - - return '_default_wp_die_handler'; - } - - /** - * Start preview and customize theme. - * - * Check if customize query variable exist. Init filters to filter the current theme. - * - * @since 3.4.0 - */ - public function setup_theme() { - global $pagenow; - - // Check permissions for customize.php access since this method is called before customize.php can run any code, - if ( 'customize.php' === $pagenow && ! current_user_can( 'customize' ) ) { - if ( ! is_user_logged_in() ) { - auth_redirect(); - } else { - wp_die( - '<h1>' . __( 'Cheatin’ uh?' ) . '</h1>' . - '<p>' . __( 'Sorry, you are not allowed to customize this site.' ) . '</p>', - 403 - ); - } - return; - } - - if ( ! preg_match( '/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/', $this->_changeset_uuid ) ) { - $this->wp_die( -1, __( 'Invalid changeset UUID' ) ); - } - - /* - * If unauthenticated then require a valid changeset UUID to load the preview. - * In this way, the UUID serves as a secret key. If the messenger channel is present, - * then send unauthenticated code to prompt re-auth. - */ - if ( ! current_user_can( 'customize' ) && ! $this->changeset_post_id() ) { - $this->wp_die( $this->messenger_channel ? 0 : -1, __( 'Non-existent changeset UUID.' ) ); - } - - if ( ! headers_sent() ) { - send_origin_headers(); - } - - // Hide the admin bar if we're embedded in the customizer iframe. - if ( $this->messenger_channel ) { - show_admin_bar( false ); - } - - if ( $this->is_theme_active() ) { - // Once the theme is loaded, we'll validate it. - add_action( 'after_setup_theme', array( $this, 'after_setup_theme' ) ); - } else { - // If the requested theme is not the active theme and the user doesn't have the - // switch_themes cap, bail. - if ( ! current_user_can( 'switch_themes' ) ) { - $this->wp_die( -1, __( 'Sorry, you are not allowed to edit theme options on this site.' ) ); - } - - // If the theme has errors while loading, bail. - if ( $this->theme()->errors() ) { - $this->wp_die( -1, $this->theme()->errors()->get_error_message() ); - } - - // If the theme isn't allowed per multisite settings, bail. - if ( ! $this->theme()->is_allowed() ) { - $this->wp_die( -1, __( 'The requested theme does not exist.' ) ); - } - } - - /* - * Import theme starter content for fresh installs when landing in the customizer. - * Import starter content at after_setup_theme:100 so that any - * add_theme_support( 'starter-content' ) calls will have been made. - */ - if ( get_option( 'fresh_site' ) && 'customize.php' === $pagenow ) { - add_action( 'after_setup_theme', array( $this, 'import_theme_starter_content' ), 100 ); - } - - $this->start_previewing_theme(); - } - - /** - * Callback to validate a theme once it is loaded - * - * @since 3.4.0 - */ - public function after_setup_theme() { - $doing_ajax_or_is_customized = ( $this->doing_ajax() || isset( $_POST['customized'] ) ); - if ( ! $doing_ajax_or_is_customized && ! validate_current_theme() ) { - wp_redirect( 'themes.php?broken=true' ); - exit; - } - } - - /** - * If the theme to be previewed isn't the active theme, add filter callbacks - * to swap it out at runtime. - * - * @since 3.4.0 - */ - public function start_previewing_theme() { - // Bail if we're already previewing. - if ( $this->is_preview() ) { - return; - } - - $this->previewing = true; - - if ( ! $this->is_theme_active() ) { - add_filter( 'template', array( $this, 'get_template' ) ); - add_filter( 'stylesheet', array( $this, 'get_stylesheet' ) ); - add_filter( 'pre_option_current_theme', array( $this, 'current_theme' ) ); - - // @link: https://core.trac.wordpress.org/ticket/20027 - add_filter( 'pre_option_stylesheet', array( $this, 'get_stylesheet' ) ); - add_filter( 'pre_option_template', array( $this, 'get_template' ) ); - - // Handle custom theme roots. - add_filter( 'pre_option_stylesheet_root', array( $this, 'get_stylesheet_root' ) ); - add_filter( 'pre_option_template_root', array( $this, 'get_template_root' ) ); - } - - /** - * Fires once the Customizer theme preview has started. - * - * @since 3.4.0 - * - * @param WP_Customize_Manager $this WP_Customize_Manager instance. - */ - do_action( 'start_previewing_theme', $this ); - } - - /** - * Stop previewing the selected theme. - * - * Removes filters to change the current theme. - * - * @since 3.4.0 - */ - public function stop_previewing_theme() { - if ( ! $this->is_preview() ) { - return; - } - - $this->previewing = false; - - if ( ! $this->is_theme_active() ) { - remove_filter( 'template', array( $this, 'get_template' ) ); - remove_filter( 'stylesheet', array( $this, 'get_stylesheet' ) ); - remove_filter( 'pre_option_current_theme', array( $this, 'current_theme' ) ); - - // @link: https://core.trac.wordpress.org/ticket/20027 - remove_filter( 'pre_option_stylesheet', array( $this, 'get_stylesheet' ) ); - remove_filter( 'pre_option_template', array( $this, 'get_template' ) ); - - // Handle custom theme roots. - remove_filter( 'pre_option_stylesheet_root', array( $this, 'get_stylesheet_root' ) ); - remove_filter( 'pre_option_template_root', array( $this, 'get_template_root' ) ); - } - - /** - * Fires once the Customizer theme preview has stopped. - * - * @since 3.4.0 - * - * @param WP_Customize_Manager $this WP_Customize_Manager instance. - */ - do_action( 'stop_previewing_theme', $this ); - } - - /** - * Get the changeset UUID. - * - * @since 4.7.0 - * @access public - * - * @return string UUID. - */ - public function changeset_uuid() { - return $this->_changeset_uuid; - } - - /** - * Get the theme being customized. - * - * @since 3.4.0 - * - * @return WP_Theme - */ - public function theme() { - if ( ! $this->theme ) { - $this->theme = wp_get_theme(); - } - return $this->theme; - } - - /** - * Get the registered settings. - * - * @since 3.4.0 - * - * @return array - */ - public function settings() { - return $this->settings; - } - - /** - * Get the registered controls. - * - * @since 3.4.0 - * - * @return array - */ - public function controls() { - return $this->controls; - } - - /** - * Get the registered containers. - * - * @since 4.0.0 - * - * @return array - */ - public function containers() { - return $this->containers; - } - - /** - * Get the registered sections. - * - * @since 3.4.0 - * - * @return array - */ - public function sections() { - return $this->sections; - } - - /** - * Get the registered panels. - * - * @since 4.0.0 - * @access public - * - * @return array Panels. - */ - public function panels() { - return $this->panels; - } - - /** - * Checks if the current theme is active. - * - * @since 3.4.0 - * - * @return bool - */ - public function is_theme_active() { - return $this->get_stylesheet() == $this->original_stylesheet; - } - - /** - * Register styles/scripts and initialize the preview of each setting - * - * @since 3.4.0 - */ - public function wp_loaded() { - - /** - * Fires once WordPress has loaded, allowing scripts and styles to be initialized. - * - * @since 3.4.0 - * - * @param WP_Customize_Manager $this WP_Customize_Manager instance. - */ - do_action( 'customize_register', $this ); - - /* - * Note that settings must be previewed here even outside the customizer preview - * and also in the customizer pane itself. This is to enable loading an existing - * changeset into the customizer. Previewing the settings only has to be prevented - * in the case of a customize_save action because then update_option() - * may short-circuit because it will detect that there are no changes to - * make. - */ - if ( ! $this->doing_ajax( 'customize_save' ) ) { - foreach ( $this->settings as $setting ) { - $setting->preview(); - } - } - - if ( $this->is_preview() && ! is_admin() ) { - $this->customize_preview_init(); - } - } - - /** - * Prevents Ajax requests from following redirects when previewing a theme - * by issuing a 200 response instead of a 30x. - * - * Instead, the JS will sniff out the location header. - * - * @since 3.4.0 - * @deprecated 4.7.0 - * - * @param int $status Status. - * @return int - */ - public function wp_redirect_status( $status ) { - _deprecated_function( __FUNCTION__, '4.7.0' ); - - if ( $this->is_preview() && ! is_admin() ) { - return 200; - } - - return $status; - } - - /** - * Find the changeset post ID for a given changeset UUID. - * - * @since 4.7.0 - * @access public - * - * @param string $uuid Changeset UUID. - * @return int|null Returns post ID on success and null on failure. - */ - public function find_changeset_post_id( $uuid ) { - $cache_group = 'customize_changeset_post'; - $changeset_post_id = wp_cache_get( $uuid, $cache_group ); - if ( $changeset_post_id && 'customize_changeset' === get_post_type( $changeset_post_id ) ) { - return $changeset_post_id; - } - - $changeset_post_query = new WP_Query( array( - 'post_type' => 'customize_changeset', - 'post_status' => get_post_stati(), - 'name' => $uuid, - 'posts_per_page' => 1, - 'no_found_rows' => true, - 'cache_results' => true, - 'update_post_meta_cache' => false, - 'update_post_term_cache' => false, - 'lazy_load_term_meta' => false, - ) ); - if ( ! empty( $changeset_post_query->posts ) ) { - // Note: 'fields'=>'ids' is not being used in order to cache the post object as it will be needed. - $changeset_post_id = $changeset_post_query->posts[0]->ID; - wp_cache_set( $this->_changeset_uuid, $changeset_post_id, $cache_group ); - return $changeset_post_id; - } - - return null; - } - - /** - * Get the changeset post id for the loaded changeset. - * - * @since 4.7.0 - * @access public - * - * @return int|null Post ID on success or null if there is no post yet saved. - */ - public function changeset_post_id() { - if ( ! isset( $this->_changeset_post_id ) ) { - $post_id = $this->find_changeset_post_id( $this->_changeset_uuid ); - if ( ! $post_id ) { - $post_id = false; - } - $this->_changeset_post_id = $post_id; - } - if ( false === $this->_changeset_post_id ) { - return null; - } - return $this->_changeset_post_id; - } - - /** - * Get the data stored in a changeset post. - * - * @since 4.7.0 - * @access protected - * - * @param int $post_id Changeset post ID. - * @return array|WP_Error Changeset data or WP_Error on error. - */ - protected function get_changeset_post_data( $post_id ) { - if ( ! $post_id ) { - return new WP_Error( 'empty_post_id' ); - } - $changeset_post = get_post( $post_id ); - if ( ! $changeset_post ) { - return new WP_Error( 'missing_post' ); - } - if ( 'customize_changeset' !== $changeset_post->post_type ) { - return new WP_Error( 'wrong_post_type' ); - } - $changeset_data = json_decode( $changeset_post->post_content, true ); - if ( function_exists( 'json_last_error' ) && json_last_error() ) { - return new WP_Error( 'json_parse_error', '', json_last_error() ); - } - if ( ! is_array( $changeset_data ) ) { - return new WP_Error( 'expected_array' ); - } - return $changeset_data; - } - - /** - * Get changeset data. - * - * @since 4.7.0 - * @access public - * - * @return array Changeset data. - */ - public function changeset_data() { - if ( isset( $this->_changeset_data ) ) { - return $this->_changeset_data; - } - $changeset_post_id = $this->changeset_post_id(); - if ( ! $changeset_post_id ) { - $this->_changeset_data = array(); - } else { - $data = $this->get_changeset_post_data( $changeset_post_id ); - if ( ! is_wp_error( $data ) ) { - $this->_changeset_data = $data; - } else { - $this->_changeset_data = array(); - } - } - return $this->_changeset_data; - } - - /** - * Starter content setting IDs. - * - * @since 4.7.0 - * @access private - * @var array - */ - protected $pending_starter_content_settings_ids = array(); - - /** - * Import theme starter content into the customized state. - * - * @since 4.7.0 - * @access public - * - * @param array $starter_content Starter content. Defaults to `get_theme_starter_content()`. - */ - function import_theme_starter_content( $starter_content = array() ) { - if ( empty( $starter_content ) ) { - $starter_content = get_theme_starter_content(); - } - - $changeset_data = array(); - if ( $this->changeset_post_id() ) { - $changeset_data = $this->get_changeset_post_data( $this->changeset_post_id() ); - } - - $sidebars_widgets = isset( $starter_content['widgets'] ) && ! empty( $this->widgets ) ? $starter_content['widgets'] : array(); - $attachments = isset( $starter_content['attachments'] ) && ! empty( $this->nav_menus ) ? $starter_content['attachments'] : array(); - $posts = isset( $starter_content['posts'] ) && ! empty( $this->nav_menus ) ? $starter_content['posts'] : array(); - $options = isset( $starter_content['options'] ) ? $starter_content['options'] : array(); - $nav_menus = isset( $starter_content['nav_menus'] ) && ! empty( $this->nav_menus ) ? $starter_content['nav_menus'] : array(); - $theme_mods = isset( $starter_content['theme_mods'] ) ? $starter_content['theme_mods'] : array(); - - // Widgets. - $max_widget_numbers = array(); - foreach ( $sidebars_widgets as $sidebar_id => $widgets ) { - $sidebar_widget_ids = array(); - foreach ( $widgets as $widget ) { - list( $id_base, $instance ) = $widget; - - if ( ! isset( $max_widget_numbers[ $id_base ] ) ) { - - // When $settings is an array-like object, get an intrinsic array for use with array_keys(). - $settings = get_option( "widget_{$id_base}", array() ); - if ( $settings instanceof ArrayObject || $settings instanceof ArrayIterator ) { - $settings = $settings->getArrayCopy(); - } - - // Find the max widget number for this type. - $widget_numbers = array_keys( $settings ); - if ( count( $widget_numbers ) > 0 ) { - $widget_numbers[] = 1; - $max_widget_numbers[ $id_base ] = call_user_func_array( 'max', $widget_numbers ); - } else { - $max_widget_numbers[ $id_base ] = 1; - } - } - $max_widget_numbers[ $id_base ] += 1; - - $widget_id = sprintf( '%s-%d', $id_base, $max_widget_numbers[ $id_base ] ); - $setting_id = sprintf( 'widget_%s[%d]', $id_base, $max_widget_numbers[ $id_base ] ); - - $setting_value = $this->widgets->sanitize_widget_js_instance( $instance ); - if ( empty( $changeset_data[ $setting_id ] ) || ! empty( $changeset_data[ $setting_id ]['starter_content'] ) ) { - $this->set_post_value( $setting_id, $setting_value ); - $this->pending_starter_content_settings_ids[] = $setting_id; - } - $sidebar_widget_ids[] = $widget_id; - } - - $setting_id = sprintf( 'sidebars_widgets[%s]', $sidebar_id ); - if ( empty( $changeset_data[ $setting_id ] ) || ! empty( $changeset_data[ $setting_id ]['starter_content'] ) ) { - $this->set_post_value( $setting_id, $sidebar_widget_ids ); - $this->pending_starter_content_settings_ids[] = $setting_id; - } - } - - $starter_content_auto_draft_post_ids = array(); - if ( ! empty( $changeset_data['nav_menus_created_posts']['value'] ) ) { - $starter_content_auto_draft_post_ids = array_merge( $starter_content_auto_draft_post_ids, $changeset_data['nav_menus_created_posts']['value'] ); - } - - // Make an index of all the posts needed and what their slugs are. - $needed_posts = array(); - $attachments = $this->prepare_starter_content_attachments( $attachments ); - foreach ( $attachments as $attachment ) { - $key = 'attachment:' . $attachment['post_name']; - $needed_posts[ $key ] = true; - } - foreach ( array_keys( $posts ) as $post_symbol ) { - if ( empty( $posts[ $post_symbol ]['post_name'] ) && empty( $posts[ $post_symbol ]['post_title'] ) ) { - unset( $posts[ $post_symbol ] ); - continue; - } - if ( empty( $posts[ $post_symbol ]['post_name'] ) ) { - $posts[ $post_symbol ]['post_name'] = sanitize_title( $posts[ $post_symbol ]['post_title'] ); - } - if ( empty( $posts[ $post_symbol ]['post_type'] ) ) { - $posts[ $post_symbol ]['post_type'] = 'post'; - } - $needed_posts[ $posts[ $post_symbol ]['post_type'] . ':' . $posts[ $post_symbol ]['post_name'] ] = true; - } - $all_post_slugs = array_merge( - wp_list_pluck( $attachments, 'post_name' ), - wp_list_pluck( $posts, 'post_name' ) - ); - - /* - * Obtain all post types referenced in starter content to use in query. - * This is needed because 'any' will not account for post types not yet registered. - */ - $post_types = array_filter( array_merge( array( 'attachment' ), wp_list_pluck( $posts, 'post_type' ) ) ); - - // Re-use auto-draft starter content posts referenced in the current customized state. - $existing_starter_content_posts = array(); - if ( ! empty( $starter_content_auto_draft_post_ids ) ) { - $existing_posts_query = new WP_Query( array( - 'post__in' => $starter_content_auto_draft_post_ids, - 'post_status' => 'auto-draft', - 'post_type' => $post_types, - 'posts_per_page' => -1, - ) ); - foreach ( $existing_posts_query->posts as $existing_post ) { - $post_name = $existing_post->post_name; - if ( empty( $post_name ) ) { - $post_name = get_post_meta( $existing_post->ID, '_customize_draft_post_name', true ); - } - $existing_starter_content_posts[ $existing_post->post_type . ':' . $post_name ] = $existing_post; - } - } - - // Re-use non-auto-draft posts. - if ( ! empty( $all_post_slugs ) ) { - $existing_posts_query = new WP_Query( array( - 'post_name__in' => $all_post_slugs, - 'post_status' => array_diff( get_post_stati(), array( 'auto-draft' ) ), - 'post_type' => 'any', - 'posts_per_page' => -1, - ) ); - foreach ( $existing_posts_query->posts as $existing_post ) { - $key = $existing_post->post_type . ':' . $existing_post->post_name; - if ( isset( $needed_posts[ $key ] ) && ! isset( $existing_starter_content_posts[ $key ] ) ) { - $existing_starter_content_posts[ $key ] = $existing_post; - } - } - } - - // Attachments are technically posts but handled differently. - if ( ! empty( $attachments ) ) { - - $attachment_ids = array(); - - foreach ( $attachments as $symbol => $attachment ) { - $file_array = array( - 'name' => $attachment['file_name'], - ); - $file_path = $attachment['file_path']; - $attachment_id = null; - $attached_file = null; - if ( isset( $existing_starter_content_posts[ 'attachment:' . $attachment['post_name'] ] ) ) { - $attachment_post = $existing_starter_content_posts[ 'attachment:' . $attachment['post_name'] ]; - $attachment_id = $attachment_post->ID; - $attached_file = get_attached_file( $attachment_id ); - if ( empty( $attached_file ) || ! file_exists( $attached_file ) ) { - $attachment_id = null; - $attached_file = null; - } elseif ( $this->get_stylesheet() !== get_post_meta( $attachment_post->ID, '_starter_content_theme', true ) ) { - - // Re-generate attachment metadata since it was previously generated for a different theme. - $metadata = wp_generate_attachment_metadata( $attachment_post->ID, $attached_file ); - wp_update_attachment_metadata( $attachment_id, $metadata ); - update_post_meta( $attachment_id, '_starter_content_theme', $this->get_stylesheet() ); - } - } - - // Insert the attachment auto-draft because it doesn't yet exist or the attached file is gone. - if ( ! $attachment_id ) { - - // Copy file to temp location so that original file won't get deleted from theme after sideloading. - $temp_file_name = wp_tempnam( basename( $file_path ) ); - if ( $temp_file_name && copy( $file_path, $temp_file_name ) ) { - $file_array['tmp_name'] = $temp_file_name; - } - if ( empty( $file_array['tmp_name'] ) ) { - continue; - } - - $attachment_post_data = array_merge( - wp_array_slice_assoc( $attachment, array( 'post_title', 'post_content', 'post_excerpt' ) ), - array( - 'post_status' => 'auto-draft', // So attachment will be garbage collected in a week if changeset is never published. - ) - ); - - // In PHP < 5.6 filesize() returns 0 for the temp files unless we clear the file status cache. - // Technically, PHP < 5.6.0 || < 5.5.13 || < 5.4.29 but no need to be so targeted. - // See https://bugs.php.net/bug.php?id=65701 - if ( version_compare( PHP_VERSION, '5.6', '<' ) ) { - clearstatcache(); - } - - $attachment_id = media_handle_sideload( $file_array, 0, null, $attachment_post_data ); - if ( is_wp_error( $attachment_id ) ) { - continue; - } - update_post_meta( $attachment_id, '_starter_content_theme', $this->get_stylesheet() ); - update_post_meta( $attachment_id, '_customize_draft_post_name', $attachment['post_name'] ); - } - - $attachment_ids[ $symbol ] = $attachment_id; - } - $starter_content_auto_draft_post_ids = array_merge( $starter_content_auto_draft_post_ids, array_values( $attachment_ids ) ); - } - - // Posts & pages. - if ( ! empty( $posts ) ) { - foreach ( array_keys( $posts ) as $post_symbol ) { - if ( empty( $posts[ $post_symbol ]['post_type'] ) || empty( $posts[ $post_symbol ]['post_name'] ) ) { - continue; - } - $post_type = $posts[ $post_symbol ]['post_type']; - if ( ! empty( $posts[ $post_symbol ]['post_name'] ) ) { - $post_name = $posts[ $post_symbol ]['post_name']; - } elseif ( ! empty( $posts[ $post_symbol ]['post_title'] ) ) { - $post_name = sanitize_title( $posts[ $post_symbol ]['post_title'] ); - } else { - continue; - } - - // Use existing auto-draft post if one already exists with the same type and name. - if ( isset( $existing_starter_content_posts[ $post_type . ':' . $post_name ] ) ) { - $posts[ $post_symbol ]['ID'] = $existing_starter_content_posts[ $post_type . ':' . $post_name ]->ID; - continue; - } - - // Translate the featured image symbol. - if ( ! empty( $posts[ $post_symbol ]['thumbnail'] ) - && preg_match( '/^{{(?P<symbol>.+)}}$/', $posts[ $post_symbol ]['thumbnail'], $matches ) - && isset( $attachment_ids[ $matches['symbol'] ] ) ) { - $posts[ $post_symbol ]['meta_input']['_thumbnail_id'] = $attachment_ids[ $matches['symbol'] ]; - } - - if ( ! empty( $posts[ $post_symbol ]['template'] ) ) { - $posts[ $post_symbol ]['meta_input']['_wp_page_template'] = $posts[ $post_symbol ]['template']; - } - - $r = $this->nav_menus->insert_auto_draft_post( $posts[ $post_symbol ] ); - if ( $r instanceof WP_Post ) { - $posts[ $post_symbol ]['ID'] = $r->ID; - } - } - - $starter_content_auto_draft_post_ids = array_merge( $starter_content_auto_draft_post_ids, wp_list_pluck( $posts, 'ID' ) ); - } - - // The nav_menus_created_posts setting is why nav_menus component is dependency for adding posts. - if ( ! empty( $this->nav_menus ) && ! empty( $starter_content_auto_draft_post_ids ) ) { - $setting_id = 'nav_menus_created_posts'; - $this->set_post_value( $setting_id, array_unique( array_values( $starter_content_auto_draft_post_ids ) ) ); - $this->pending_starter_content_settings_ids[] = $setting_id; - } - - // Nav menus. - $placeholder_id = -1; - $reused_nav_menu_setting_ids = array(); - foreach ( $nav_menus as $nav_menu_location => $nav_menu ) { - - $nav_menu_term_id = null; - $nav_menu_setting_id = null; - $matches = array(); - - // Look for an existing placeholder menu with starter content to re-use. - foreach ( $changeset_data as $setting_id => $setting_params ) { - $can_reuse = ( - ! empty( $setting_params['starter_content'] ) - && - ! in_array( $setting_id, $reused_nav_menu_setting_ids, true ) - && - preg_match( '#^nav_menu\[(?P<nav_menu_id>-?\d+)\]$#', $setting_id, $matches ) - ); - if ( $can_reuse ) { - $nav_menu_term_id = intval( $matches['nav_menu_id'] ); - $nav_menu_setting_id = $setting_id; - $reused_nav_menu_setting_ids[] = $setting_id; - break; - } - } - - if ( ! $nav_menu_term_id ) { - while ( isset( $changeset_data[ sprintf( 'nav_menu[%d]', $placeholder_id ) ] ) ) { - $placeholder_id--; - } - $nav_menu_term_id = $placeholder_id; - $nav_menu_setting_id = sprintf( 'nav_menu[%d]', $placeholder_id ); - } - - $this->set_post_value( $nav_menu_setting_id, array( - 'name' => isset( $nav_menu['name'] ) ? $nav_menu['name'] : $nav_menu_location, - ) ); - $this->pending_starter_content_settings_ids[] = $nav_menu_setting_id; - - // @todo Add support for menu_item_parent. - $position = 0; - foreach ( $nav_menu['items'] as $nav_menu_item ) { - $nav_menu_item_setting_id = sprintf( 'nav_menu_item[%d]', $placeholder_id-- ); - if ( ! isset( $nav_menu_item['position'] ) ) { - $nav_menu_item['position'] = $position++; - } - $nav_menu_item['nav_menu_term_id'] = $nav_menu_term_id; - - if ( isset( $nav_menu_item['object_id'] ) ) { - if ( 'post_type' === $nav_menu_item['type'] && preg_match( '/^{{(?P<symbol>.+)}}$/', $nav_menu_item['object_id'], $matches ) && isset( $posts[ $matches['symbol'] ] ) ) { - $nav_menu_item['object_id'] = $posts[ $matches['symbol'] ]['ID']; - if ( empty( $nav_menu_item['title'] ) ) { - $original_object = get_post( $nav_menu_item['object_id'] ); - $nav_menu_item['title'] = $original_object->post_title; - } - } else { - continue; - } - } else { - $nav_menu_item['object_id'] = 0; - } - - if ( empty( $changeset_data[ $nav_menu_item_setting_id ] ) || ! empty( $changeset_data[ $nav_menu_item_setting_id ]['starter_content'] ) ) { - $this->set_post_value( $nav_menu_item_setting_id, $nav_menu_item ); - $this->pending_starter_content_settings_ids[] = $nav_menu_item_setting_id; - } - } - - $setting_id = sprintf( 'nav_menu_locations[%s]', $nav_menu_location ); - if ( empty( $changeset_data[ $setting_id ] ) || ! empty( $changeset_data[ $setting_id ]['starter_content'] ) ) { - $this->set_post_value( $setting_id, $nav_menu_term_id ); - $this->pending_starter_content_settings_ids[] = $setting_id; - } - } - - // Options. - foreach ( $options as $name => $value ) { - if ( preg_match( '/^{{(?P<symbol>.+)}}$/', $value, $matches ) ) { - if ( isset( $posts[ $matches['symbol'] ] ) ) { - $value = $posts[ $matches['symbol'] ]['ID']; - } elseif ( isset( $attachment_ids[ $matches['symbol'] ] ) ) { - $value = $attachment_ids[ $matches['symbol'] ]; - } else { - continue; - } - } - - if ( empty( $changeset_data[ $name ] ) || ! empty( $changeset_data[ $name ]['starter_content'] ) ) { - $this->set_post_value( $name, $value ); - $this->pending_starter_content_settings_ids[] = $name; - } - } - - // Theme mods. - foreach ( $theme_mods as $name => $value ) { - if ( preg_match( '/^{{(?P<symbol>.+)}}$/', $value, $matches ) ) { - if ( isset( $posts[ $matches['symbol'] ] ) ) { - $value = $posts[ $matches['symbol'] ]['ID']; - } elseif ( isset( $attachment_ids[ $matches['symbol'] ] ) ) { - $value = $attachment_ids[ $matches['symbol'] ]; - } else { - continue; - } - } - - // Handle header image as special case since setting has a legacy format. - if ( 'header_image' === $name ) { - $name = 'header_image_data'; - $metadata = wp_get_attachment_metadata( $value ); - if ( empty( $metadata ) ) { - continue; - } - $value = array( - 'attachment_id' => $value, - 'url' => wp_get_attachment_url( $value ), - 'height' => $metadata['height'], - 'width' => $metadata['width'], - ); - } elseif ( 'background_image' === $name ) { - $value = wp_get_attachment_url( $value ); - } - - if ( empty( $changeset_data[ $name ] ) || ! empty( $changeset_data[ $name ]['starter_content'] ) ) { - $this->set_post_value( $name, $value ); - $this->pending_starter_content_settings_ids[] = $name; - } - } - - if ( ! empty( $this->pending_starter_content_settings_ids ) ) { - if ( did_action( 'customize_register' ) ) { - $this->_save_starter_content_changeset(); - } else { - add_action( 'customize_register', array( $this, '_save_starter_content_changeset' ), 1000 ); - } - } - } - - /** - * Prepare starter content attachments. - * - * Ensure that the attachments are valid and that they have slugs and file name/path. - * - * @since 4.7.0 - * @access private - * - * @param array $attachments Attachments. - * @return array Prepared attachments. - */ - protected function prepare_starter_content_attachments( $attachments ) { - $prepared_attachments = array(); - if ( empty( $attachments ) ) { - return $prepared_attachments; - } - - // Such is The WordPress Way. - require_once( ABSPATH . 'wp-admin/includes/file.php' ); - require_once( ABSPATH . 'wp-admin/includes/media.php' ); - require_once( ABSPATH . 'wp-admin/includes/image.php' ); - - foreach ( $attachments as $symbol => $attachment ) { - - // A file is required and URLs to files are not currently allowed. - if ( empty( $attachment['file'] ) || preg_match( '#^https?://$#', $attachment['file'] ) ) { - continue; - } - - $file_path = null; - if ( file_exists( $attachment['file'] ) ) { - $file_path = $attachment['file']; // Could be absolute path to file in plugin. - } elseif ( is_child_theme() && file_exists( get_stylesheet_directory() . '/' . $attachment['file'] ) ) { - $file_path = get_stylesheet_directory() . '/' . $attachment['file']; - } elseif ( file_exists( get_template_directory() . '/' . $attachment['file'] ) ) { - $file_path = get_template_directory() . '/' . $attachment['file']; - } else { - continue; - } - $file_name = basename( $attachment['file'] ); - - // Skip file types that are not recognized. - $checked_filetype = wp_check_filetype( $file_name ); - if ( empty( $checked_filetype['type'] ) ) { - continue; - } - - // Ensure post_name is set since not automatically derived from post_title for new auto-draft posts. - if ( empty( $attachment['post_name'] ) ) { - if ( ! empty( $attachment['post_title'] ) ) { - $attachment['post_name'] = sanitize_title( $attachment['post_title'] ); - } else { - $attachment['post_name'] = sanitize_title( preg_replace( '/\.\w+$/', '', $file_name ) ); - } - } - - $attachment['file_name'] = $file_name; - $attachment['file_path'] = $file_path; - $prepared_attachments[ $symbol ] = $attachment; - } - return $prepared_attachments; - } - - /** - * Save starter content changeset. - * - * @since 4.7.0 - * @access private - */ - public function _save_starter_content_changeset() { - - if ( empty( $this->pending_starter_content_settings_ids ) ) { - return; - } - - $this->save_changeset_post( array( - 'data' => array_fill_keys( $this->pending_starter_content_settings_ids, array( 'starter_content' => true ) ), - 'starter_content' => true, - ) ); - - $this->pending_starter_content_settings_ids = array(); - } - - /** - * Get dirty pre-sanitized setting values in the current customized state. - * - * The returned array consists of a merge of three sources: - * 1. If the theme is not currently active, then the base array is any stashed - * theme mods that were modified previously but never published. - * 2. The values from the current changeset, if it exists. - * 3. If the user can customize, the values parsed from the incoming - * `$_POST['customized']` JSON data. - * 4. Any programmatically-set post values via `WP_Customize_Manager::set_post_value()`. - * - * The name "unsanitized_post_values" is a carry-over from when the customized - * state was exclusively sourced from `$_POST['customized']`. Nevertheless, - * the value returned will come from the current changeset post and from the - * incoming post data. - * - * @since 4.1.1 - * @since 4.7.0 Added $args param and merging with changeset values and stashed theme mods. - * - * @param array $args { - * Args. - * - * @type bool $exclude_changeset Whether the changeset values should also be excluded. Defaults to false. - * @type bool $exclude_post_data Whether the post input values should also be excluded. Defaults to false when lacking the customize capability. - * } - * @return array - */ - public function unsanitized_post_values( $args = array() ) { - $args = array_merge( - array( - 'exclude_changeset' => false, - 'exclude_post_data' => ! current_user_can( 'customize' ), - ), - $args - ); - - $values = array(); - - // Let default values be from the stashed theme mods if doing a theme switch and if no changeset is present. - if ( ! $this->is_theme_active() ) { - $stashed_theme_mods = get_option( 'customize_stashed_theme_mods' ); - $stylesheet = $this->get_stylesheet(); - if ( isset( $stashed_theme_mods[ $stylesheet ] ) ) { - $values = array_merge( $values, wp_list_pluck( $stashed_theme_mods[ $stylesheet ], 'value' ) ); - } - } - - if ( ! $args['exclude_changeset'] ) { - foreach ( $this->changeset_data() as $setting_id => $setting_params ) { - if ( ! array_key_exists( 'value', $setting_params ) ) { - continue; - } - if ( isset( $setting_params['type'] ) && 'theme_mod' === $setting_params['type'] ) { - - // Ensure that theme mods values are only used if they were saved under the current theme. - $namespace_pattern = '/^(?P<stylesheet>.+?)::(?P<setting_id>.+)$/'; - if ( preg_match( $namespace_pattern, $setting_id, $matches ) && $this->get_stylesheet() === $matches['stylesheet'] ) { - $values[ $matches['setting_id'] ] = $setting_params['value']; - } - } else { - $values[ $setting_id ] = $setting_params['value']; - } - } - } - - if ( ! $args['exclude_post_data'] ) { - if ( ! isset( $this->_post_values ) ) { - if ( isset( $_POST['customized'] ) ) { - $post_values = json_decode( wp_unslash( $_POST['customized'] ), true ); - } else { - $post_values = array(); - } - if ( is_array( $post_values ) ) { - $this->_post_values = $post_values; - } else { - $this->_post_values = array(); - } - } - $values = array_merge( $values, $this->_post_values ); - } - return $values; - } - - /** - * Returns the sanitized value for a given setting from the current customized state. - * - * The name "post_value" is a carry-over from when the customized state was exclusively - * sourced from `$_POST['customized']`. Nevertheless, the value returned will come - * from the current changeset post and from the incoming post data. - * - * @since 3.4.0 - * @since 4.1.1 Introduced the `$default` parameter. - * @since 4.6.0 `$default` is now returned early when the setting post value is invalid. - * @access public - * - * @see WP_REST_Server::dispatch() - * @see WP_Rest_Request::sanitize_params() - * @see WP_Rest_Request::has_valid_params() - * - * @param WP_Customize_Setting $setting A WP_Customize_Setting derived object. - * @param mixed $default Value returned $setting has no post value (added in 4.2.0) - * or the post value is invalid (added in 4.6.0). - * @return string|mixed $post_value Sanitized value or the $default provided. - */ - public function post_value( $setting, $default = null ) { - $post_values = $this->unsanitized_post_values(); - if ( ! array_key_exists( $setting->id, $post_values ) ) { - return $default; - } - $value = $post_values[ $setting->id ]; - $valid = $setting->validate( $value ); - if ( is_wp_error( $valid ) ) { - return $default; - } - $value = $setting->sanitize( $value ); - if ( is_null( $value ) || is_wp_error( $value ) ) { - return $default; - } - return $value; - } - - /** - * Override a setting's value in the current customized state. - * - * The name "post_value" is a carry-over from when the customized state was - * exclusively sourced from `$_POST['customized']`. - * - * @since 4.2.0 - * @access public - * - * @param string $setting_id ID for the WP_Customize_Setting instance. - * @param mixed $value Post value. - */ - public function set_post_value( $setting_id, $value ) { - $this->unsanitized_post_values(); // Populate _post_values from $_POST['customized']. - $this->_post_values[ $setting_id ] = $value; - - /** - * Announce when a specific setting's unsanitized post value has been set. - * - * Fires when the WP_Customize_Manager::set_post_value() method is called. - * - * The dynamic portion of the hook name, `$setting_id`, refers to the setting ID. - * - * @since 4.4.0 - * - * @param mixed $value Unsanitized setting post value. - * @param WP_Customize_Manager $this WP_Customize_Manager instance. - */ - do_action( "customize_post_value_set_{$setting_id}", $value, $this ); - - /** - * Announce when any setting's unsanitized post value has been set. - * - * Fires when the WP_Customize_Manager::set_post_value() method is called. - * - * This is useful for `WP_Customize_Setting` instances to watch - * in order to update a cached previewed value. - * - * @since 4.4.0 - * - * @param string $setting_id Setting ID. - * @param mixed $value Unsanitized setting post value. - * @param WP_Customize_Manager $this WP_Customize_Manager instance. - */ - do_action( 'customize_post_value_set', $setting_id, $value, $this ); - } - - /** - * Print JavaScript settings. - * - * @since 3.4.0 - */ - public function customize_preview_init() { - - /* - * Now that Customizer previews are loaded into iframes via GET requests - * and natural URLs with transaction UUIDs added, we need to ensure that - * the responses are never cached by proxies. In practice, this will not - * be needed if the user is logged-in anyway. But if anonymous access is - * allowed then the auth cookies would not be sent and WordPress would - * not send no-cache headers by default. - */ - if ( ! headers_sent() ) { - nocache_headers(); - header( 'X-Robots: noindex, nofollow, noarchive' ); - } - add_action( 'wp_head', 'wp_no_robots' ); - add_filter( 'wp_headers', array( $this, 'filter_iframe_security_headers' ) ); - - /* - * If preview is being served inside the customizer preview iframe, and - * if the user doesn't have customize capability, then it is assumed - * that the user's session has expired and they need to re-authenticate. - */ - if ( $this->messenger_channel && ! current_user_can( 'customize' ) ) { - $this->wp_die( -1, __( 'Unauthorized. You may remove the customize_messenger_channel param to preview as frontend.' ) ); - return; - } - - $this->prepare_controls(); - - add_filter( 'wp_redirect', array( $this, 'add_state_query_params' ) ); - - wp_enqueue_script( 'customize-preview' ); - wp_enqueue_style( 'customize-preview' ); - add_action( 'wp_head', array( $this, 'customize_preview_loading_style' ) ); - add_action( 'wp_head', array( $this, 'remove_frameless_preview_messenger_channel' ) ); - add_action( 'wp_footer', array( $this, 'customize_preview_settings' ), 20 ); - add_filter( 'get_edit_post_link', '__return_empty_string' ); - - /** - * Fires once the Customizer preview has initialized and JavaScript - * settings have been printed. - * - * @since 3.4.0 - * - * @param WP_Customize_Manager $this WP_Customize_Manager instance. - */ - do_action( 'customize_preview_init', $this ); - } - - /** - * Filter the X-Frame-Options and Content-Security-Policy headers to ensure frontend can load in customizer. - * - * @since 4.7.0 - * @access public - * - * @param array $headers Headers. - * @return array Headers. - */ - public function filter_iframe_security_headers( $headers ) { - $customize_url = admin_url( 'customize.php' ); - $headers['X-Frame-Options'] = 'ALLOW-FROM ' . $customize_url; - $headers['Content-Security-Policy'] = 'frame-ancestors ' . preg_replace( '#^(\w+://[^/]+).+?$#', '$1', $customize_url ); - return $headers; - } - - /** - * Add customize state query params to a given URL if preview is allowed. - * - * @since 4.7.0 - * @access public - * @see wp_redirect() - * @see WP_Customize_Manager::get_allowed_url() - * - * @param string $url URL. - * @return string URL. - */ - public function add_state_query_params( $url ) { - $parsed_original_url = wp_parse_url( $url ); - $is_allowed = false; - foreach ( $this->get_allowed_urls() as $allowed_url ) { - $parsed_allowed_url = wp_parse_url( $allowed_url ); - $is_allowed = ( - $parsed_allowed_url['scheme'] === $parsed_original_url['scheme'] - && - $parsed_allowed_url['host'] === $parsed_original_url['host'] - && - 0 === strpos( $parsed_original_url['path'], $parsed_allowed_url['path'] ) - ); - if ( $is_allowed ) { - break; - } - } - - if ( $is_allowed ) { - $query_params = array( - 'customize_changeset_uuid' => $this->changeset_uuid(), - ); - if ( ! $this->is_theme_active() ) { - $query_params['customize_theme'] = $this->get_stylesheet(); - } - if ( $this->messenger_channel ) { - $query_params['customize_messenger_channel'] = $this->messenger_channel; - } - $url = add_query_arg( $query_params, $url ); - } - - return $url; - } - - /** - * Prevent sending a 404 status when returning the response for the customize - * preview, since it causes the jQuery Ajax to fail. Send 200 instead. - * - * @since 4.0.0 - * @deprecated 4.7.0 - * @access public - */ - public function customize_preview_override_404_status() { - _deprecated_function( __METHOD__, '4.7.0' ); - } - - /** - * Print base element for preview frame. - * - * @since 3.4.0 - * @deprecated 4.7.0 - */ - public function customize_preview_base() { - _deprecated_function( __METHOD__, '4.7.0' ); - } - - /** - * Print a workaround to handle HTML5 tags in IE < 9. - * - * @since 3.4.0 - * @deprecated 4.7.0 Customizer no longer supports IE8, so all supported browsers recognize HTML5. - */ - public function customize_preview_html5() { - _deprecated_function( __FUNCTION__, '4.7.0' ); - } - - /** - * Print CSS for loading indicators for the Customizer preview. - * - * @since 4.2.0 - * @access public - */ - public function customize_preview_loading_style() { - ?><style> - body.wp-customizer-unloading { - opacity: 0.25; - cursor: progress !important; - -webkit-transition: opacity 0.5s; - transition: opacity 0.5s; - } - body.wp-customizer-unloading * { - pointer-events: none !important; - } - form.customize-unpreviewable, - form.customize-unpreviewable input, - form.customize-unpreviewable select, - form.customize-unpreviewable button, - a.customize-unpreviewable, - area.customize-unpreviewable { - cursor: not-allowed !important; - } - </style><?php - } - - /** - * Remove customize_messenger_channel query parameter from the preview window when it is not in an iframe. - * - * This ensures that the admin bar will be shown. It also ensures that link navigation will - * work as expected since the parent frame is not being sent the URL to navigate to. - * - * @since 4.7.0 - * @access public - */ - public function remove_frameless_preview_messenger_channel() { - if ( ! $this->messenger_channel ) { - return; - } - ?> - <script> - ( function() { - var urlParser, oldQueryParams, newQueryParams, i; - if ( parent !== window ) { - return; - } - urlParser = document.createElement( 'a' ); - urlParser.href = location.href; - oldQueryParams = urlParser.search.substr( 1 ).split( /&/ ); - newQueryParams = []; - for ( i = 0; i < oldQueryParams.length; i += 1 ) { - if ( ! /^customize_messenger_channel=/.test( oldQueryParams[ i ] ) ) { - newQueryParams.push( oldQueryParams[ i ] ); - } - } - urlParser.search = newQueryParams.join( '&' ); - if ( urlParser.search !== location.search ) { - location.replace( urlParser.href ); - } - } )(); - </script> - <?php - } - - /** - * Print JavaScript settings for preview frame. - * - * @since 3.4.0 - */ - public function customize_preview_settings() { - $post_values = $this->unsanitized_post_values( array( 'exclude_changeset' => true ) ); - $setting_validities = $this->validate_setting_values( $post_values ); - $exported_setting_validities = array_map( array( $this, 'prepare_setting_validity_for_js' ), $setting_validities ); - - // Note that the REQUEST_URI is not passed into home_url() since this breaks subdirectory installs. - $self_url = empty( $_SERVER['REQUEST_URI'] ) ? home_url( '/' ) : esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ); - $state_query_params = array( - 'customize_theme', - 'customize_changeset_uuid', - 'customize_messenger_channel', - ); - $self_url = remove_query_arg( $state_query_params, $self_url ); - - $allowed_urls = $this->get_allowed_urls(); - $allowed_hosts = array(); - foreach ( $allowed_urls as $allowed_url ) { - $parsed = wp_parse_url( $allowed_url ); - if ( empty( $parsed['host'] ) ) { - continue; - } - $host = $parsed['host']; - if ( ! empty( $parsed['port'] ) ) { - $host .= ':' . $parsed['port']; - } - $allowed_hosts[] = $host; - } - - $switched_locale = switch_to_locale( get_user_locale() ); - $l10n = array( - 'shiftClickToEdit' => __( 'Shift-click to edit this element.' ), - 'linkUnpreviewable' => __( 'This link is not live-previewable.' ), - 'formUnpreviewable' => __( 'This form is not live-previewable.' ), - ); - if ( $switched_locale ) { - restore_previous_locale(); - } - - $settings = array( - 'changeset' => array( - 'uuid' => $this->_changeset_uuid, - ), - 'timeouts' => array( - 'selectiveRefresh' => 250, - 'keepAliveSend' => 1000, - ), - 'theme' => array( - 'stylesheet' => $this->get_stylesheet(), - 'active' => $this->is_theme_active(), - ), - 'url' => array( - 'self' => $self_url, - 'allowed' => array_map( 'esc_url_raw', $this->get_allowed_urls() ), - 'allowedHosts' => array_unique( $allowed_hosts ), - 'isCrossDomain' => $this->is_cross_domain(), - ), - 'channel' => $this->messenger_channel, - 'activePanels' => array(), - 'activeSections' => array(), - 'activeControls' => array(), - 'settingValidities' => $exported_setting_validities, - 'nonce' => current_user_can( 'customize' ) ? $this->get_nonces() : array(), - 'l10n' => $l10n, - '_dirty' => array_keys( $post_values ), - ); - - foreach ( $this->panels as $panel_id => $panel ) { - if ( $panel->check_capabilities() ) { - $settings['activePanels'][ $panel_id ] = $panel->active(); - foreach ( $panel->sections as $section_id => $section ) { - if ( $section->check_capabilities() ) { - $settings['activeSections'][ $section_id ] = $section->active(); - } - } - } - } - foreach ( $this->sections as $id => $section ) { - if ( $section->check_capabilities() ) { - $settings['activeSections'][ $id ] = $section->active(); - } - } - foreach ( $this->controls as $id => $control ) { - if ( $control->check_capabilities() ) { - $settings['activeControls'][ $id ] = $control->active(); - } - } - - ?> - <script type="text/javascript"> - var _wpCustomizeSettings = <?php echo wp_json_encode( $settings ); ?>; - _wpCustomizeSettings.values = {}; - (function( v ) { - <?php - /* - * Serialize settings separately from the initial _wpCustomizeSettings - * serialization in order to avoid a peak memory usage spike. - * @todo We may not even need to export the values at all since the pane syncs them anyway. - */ - foreach ( $this->settings as $id => $setting ) { - if ( $setting->check_capabilities() ) { - printf( - "v[%s] = %s;\n", - wp_json_encode( $id ), - wp_json_encode( $setting->js_value() ) - ); - } - } - ?> - })( _wpCustomizeSettings.values ); - </script> - <?php - } - - /** - * Prints a signature so we can ensure the Customizer was properly executed. - * - * @since 3.4.0 - * @deprecated 4.7.0 - */ - public function customize_preview_signature() { - _deprecated_function( __METHOD__, '4.7.0' ); - } - - /** - * Removes the signature in case we experience a case where the Customizer was not properly executed. - * - * @since 3.4.0 - * @deprecated 4.7.0 - * - * @param mixed $return Value passed through for {@see 'wp_die_handler'} filter. - * @return mixed Value passed through for {@see 'wp_die_handler'} filter. - */ - public function remove_preview_signature( $return = null ) { - _deprecated_function( __METHOD__, '4.7.0' ); - - return $return; - } - - /** - * Is it a theme preview? - * - * @since 3.4.0 - * - * @return bool True if it's a preview, false if not. - */ - public function is_preview() { - return (bool) $this->previewing; - } - - /** - * Retrieve the template name of the previewed theme. - * - * @since 3.4.0 - * - * @return string Template name. - */ - public function get_template() { - return $this->theme()->get_template(); - } - - /** - * Retrieve the stylesheet name of the previewed theme. - * - * @since 3.4.0 - * - * @return string Stylesheet name. - */ - public function get_stylesheet() { - return $this->theme()->get_stylesheet(); - } - - /** - * Retrieve the template root of the previewed theme. - * - * @since 3.4.0 - * - * @return string Theme root. - */ - public function get_template_root() { - return get_raw_theme_root( $this->get_template(), true ); - } - - /** - * Retrieve the stylesheet root of the previewed theme. - * - * @since 3.4.0 - * - * @return string Theme root. - */ - public function get_stylesheet_root() { - return get_raw_theme_root( $this->get_stylesheet(), true ); - } - - /** - * Filters the current theme and return the name of the previewed theme. - * - * @since 3.4.0 - * - * @param $current_theme {@internal Parameter is not used} - * @return string Theme name. - */ - public function current_theme( $current_theme ) { - return $this->theme()->display('Name'); - } - - /** - * Validates setting values. - * - * Validation is skipped for unregistered settings or for values that are - * already null since they will be skipped anyway. Sanitization is applied - * to values that pass validation, and values that become null or `WP_Error` - * after sanitizing are marked invalid. - * - * @since 4.6.0 - * @access public - * - * @see WP_REST_Request::has_valid_params() - * @see WP_Customize_Setting::validate() - * - * @param array $setting_values Mapping of setting IDs to values to validate and sanitize. - * @param array $options { - * Options. - * - * @type bool $validate_existence Whether a setting's existence will be checked. - * @type bool $validate_capability Whether the setting capability will be checked. - * } - * @return array Mapping of setting IDs to return value of validate method calls, either `true` or `WP_Error`. - */ - public function validate_setting_values( $setting_values, $options = array() ) { - $options = wp_parse_args( $options, array( - 'validate_capability' => false, - 'validate_existence' => false, - ) ); - - $validities = array(); - foreach ( $setting_values as $setting_id => $unsanitized_value ) { - $setting = $this->get_setting( $setting_id ); - if ( ! $setting ) { - if ( $options['validate_existence'] ) { - $validities[ $setting_id ] = new WP_Error( 'unrecognized', __( 'Setting does not exist or is unrecognized.' ) ); - } - continue; - } - if ( $options['validate_capability'] && ! current_user_can( $setting->capability ) ) { - $validity = new WP_Error( 'unauthorized', __( 'Unauthorized to modify setting due to capability.' ) ); - } else { - if ( is_null( $unsanitized_value ) ) { - continue; - } - $validity = $setting->validate( $unsanitized_value ); - } - if ( ! is_wp_error( $validity ) ) { - /** This filter is documented in wp-includes/class-wp-customize-setting.php */ - $late_validity = apply_filters( "customize_validate_{$setting->id}", new WP_Error(), $unsanitized_value, $setting ); - if ( ! empty( $late_validity->errors ) ) { - $validity = $late_validity; - } - } - if ( ! is_wp_error( $validity ) ) { - $value = $setting->sanitize( $unsanitized_value ); - if ( is_null( $value ) ) { - $validity = false; - } elseif ( is_wp_error( $value ) ) { - $validity = $value; - } - } - if ( false === $validity ) { - $validity = new WP_Error( 'invalid_value', __( 'Invalid value.' ) ); - } - $validities[ $setting_id ] = $validity; - } - return $validities; - } - - /** - * Prepares setting validity for exporting to the client (JS). - * - * Converts `WP_Error` instance into array suitable for passing into the - * `wp.customize.Notification` JS model. - * - * @since 4.6.0 - * @access public - * - * @param true|WP_Error $validity Setting validity. - * @return true|array If `$validity` was a WP_Error, the error codes will be array-mapped - * to their respective `message` and `data` to pass into the - * `wp.customize.Notification` JS model. - */ - public function prepare_setting_validity_for_js( $validity ) { - if ( is_wp_error( $validity ) ) { - $notification = array(); - foreach ( $validity->errors as $error_code => $error_messages ) { - $notification[ $error_code ] = array( - 'message' => join( ' ', $error_messages ), - 'data' => $validity->get_error_data( $error_code ), - ); - } - return $notification; - } else { - return true; - } - } - - /** - * Handle customize_save WP Ajax request to save/update a changeset. - * - * @since 3.4.0 - * @since 4.7.0 The semantics of this method have changed to update a changeset, optionally to also change the status and other attributes. - */ - public function save() { - if ( ! is_user_logged_in() ) { - wp_send_json_error( 'unauthenticated' ); - } - - if ( ! $this->is_preview() ) { - wp_send_json_error( 'not_preview' ); - } - - $action = 'save-customize_' . $this->get_stylesheet(); - if ( ! check_ajax_referer( $action, 'nonce', false ) ) { - wp_send_json_error( 'invalid_nonce' ); - } - - $changeset_post_id = $this->changeset_post_id(); - if ( empty( $changeset_post_id ) ) { - if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->create_posts ) ) { - wp_send_json_error( 'cannot_create_changeset_post' ); - } - } else { - if ( ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->edit_post, $changeset_post_id ) ) { - wp_send_json_error( 'cannot_edit_changeset_post' ); - } - } - - if ( ! empty( $_POST['customize_changeset_data'] ) ) { - $input_changeset_data = json_decode( wp_unslash( $_POST['customize_changeset_data'] ), true ); - if ( ! is_array( $input_changeset_data ) ) { - wp_send_json_error( 'invalid_customize_changeset_data' ); - } - } else { - $input_changeset_data = array(); - } - - // Validate title. - $changeset_title = null; - if ( isset( $_POST['customize_changeset_title'] ) ) { - $changeset_title = sanitize_text_field( wp_unslash( $_POST['customize_changeset_title'] ) ); - } - - // Validate changeset status param. - $is_publish = null; - $changeset_status = null; - if ( isset( $_POST['customize_changeset_status'] ) ) { - $changeset_status = wp_unslash( $_POST['customize_changeset_status'] ); - if ( ! get_post_status_object( $changeset_status ) || ! in_array( $changeset_status, array( 'draft', 'pending', 'publish', 'future' ), true ) ) { - wp_send_json_error( 'bad_customize_changeset_status', 400 ); - } - $is_publish = ( 'publish' === $changeset_status || 'future' === $changeset_status ); - if ( $is_publish && ! current_user_can( get_post_type_object( 'customize_changeset' )->cap->publish_posts ) ) { - wp_send_json_error( 'changeset_publish_unauthorized', 403 ); - } - } - - /* - * Validate changeset date param. Date is assumed to be in local time for - * the WP if in MySQL format (YYYY-MM-DD HH:MM:SS). Otherwise, the date - * is parsed with strtotime() so that ISO date format may be supplied - * or a string like "+10 minutes". - */ - $changeset_date_gmt = null; - if ( isset( $_POST['customize_changeset_date'] ) ) { - $changeset_date = wp_unslash( $_POST['customize_changeset_date'] ); - if ( preg_match( '/^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d$/', $changeset_date ) ) { - $mm = substr( $changeset_date, 5, 2 ); - $jj = substr( $changeset_date, 8, 2 ); - $aa = substr( $changeset_date, 0, 4 ); - $valid_date = wp_checkdate( $mm, $jj, $aa, $changeset_date ); - if ( ! $valid_date ) { - wp_send_json_error( 'bad_customize_changeset_date', 400 ); - } - $changeset_date_gmt = get_gmt_from_date( $changeset_date ); - } else { - $timestamp = strtotime( $changeset_date ); - if ( ! $timestamp ) { - wp_send_json_error( 'bad_customize_changeset_date', 400 ); - } - $changeset_date_gmt = gmdate( 'Y-m-d H:i:s', $timestamp ); - } - } - - $r = $this->save_changeset_post( array( - 'status' => $changeset_status, - 'title' => $changeset_title, - 'date_gmt' => $changeset_date_gmt, - 'data' => $input_changeset_data, - ) ); - if ( is_wp_error( $r ) ) { - $response = array( - 'message' => $r->get_error_message(), - 'code' => $r->get_error_code(), - ); - if ( is_array( $r->get_error_data() ) ) { - $response = array_merge( $response, $r->get_error_data() ); - } else { - $response['data'] = $r->get_error_data(); - } - } else { - $response = $r; - - // Note that if the changeset status was publish, then it will get set to trash if revisions are not supported. - $response['changeset_status'] = get_post_status( $this->changeset_post_id() ); - if ( $is_publish && 'trash' === $response['changeset_status'] ) { - $response['changeset_status'] = 'publish'; - } - - if ( 'publish' === $response['changeset_status'] ) { - $response['next_changeset_uuid'] = wp_generate_uuid4(); - } - } - - if ( isset( $response['setting_validities'] ) ) { - $response['setting_validities'] = array_map( array( $this, 'prepare_setting_validity_for_js' ), $response['setting_validities'] ); - } - - /** - * Filters response data for a successful customize_save Ajax request. - * - * This filter does not apply if there was a nonce or authentication failure. - * - * @since 4.2.0 - * - * @param array $response Additional information passed back to the 'saved' - * event on `wp.customize`. - * @param WP_Customize_Manager $this WP_Customize_Manager instance. - */ - $response = apply_filters( 'customize_save_response', $response, $this ); - - if ( is_wp_error( $r ) ) { - wp_send_json_error( $response ); - } else { - wp_send_json_success( $response ); - } - } - - /** - * Save the post for the loaded changeset. - * - * @since 4.7.0 - * @access public - * - * @param array $args { - * Args for changeset post. - * - * @type array $data Optional additional changeset data. Values will be merged on top of any existing post values. - * @type string $status Post status. Optional. If supplied, the save will be transactional and a post revision will be allowed. - * @type string $title Post title. Optional. - * @type string $date_gmt Date in GMT. Optional. - * @type int $user_id ID for user who is saving the changeset. Optional, defaults to the current user ID. - * @type bool $starter_content Whether the data is starter content. If false (default), then $starter_content will be cleared for any $data being saved. - * } - * - * @return array|WP_Error Returns array on success and WP_Error with array data on error. - */ - function save_changeset_post( $args = array() ) { - - $args = array_merge( - array( - 'status' => null, - 'title' => null, - 'data' => array(), - 'date_gmt' => null, - 'user_id' => get_current_user_id(), - 'starter_content' => false, - ), - $args - ); - - $changeset_post_id = $this->changeset_post_id(); - $existing_changeset_data = array(); - if ( $changeset_post_id ) { - $existing_status = get_post_status( $changeset_post_id ); - if ( 'publish' === $existing_status || 'trash' === $existing_status ) { - return new WP_Error( 'changeset_already_published' ); - } - - $existing_changeset_data = $this->get_changeset_post_data( $changeset_post_id ); - } - - // Fail if attempting to publish but publish hook is missing. - if ( 'publish' === $args['status'] && false === has_action( 'transition_post_status', '_wp_customize_publish_changeset' ) ) { - return new WP_Error( 'missing_publish_callback' ); - } - - // Validate date. - $now = gmdate( 'Y-m-d H:i:59' ); - if ( $args['date_gmt'] ) { - $is_future_dated = ( mysql2date( 'U', $args['date_gmt'], false ) > mysql2date( 'U', $now, false ) ); - if ( ! $is_future_dated ) { - return new WP_Error( 'not_future_date' ); // Only future dates are allowed. - } - - if ( ! $this->is_theme_active() && ( 'future' === $args['status'] || $is_future_dated ) ) { - return new WP_Error( 'cannot_schedule_theme_switches' ); // This should be allowed in the future, when theme is a regular setting. - } - $will_remain_auto_draft = ( ! $args['status'] && ( ! $changeset_post_id || 'auto-draft' === get_post_status( $changeset_post_id ) ) ); - if ( $will_remain_auto_draft ) { - return new WP_Error( 'cannot_supply_date_for_auto_draft_changeset' ); - } - } elseif ( $changeset_post_id && 'future' === $args['status'] ) { - - // Fail if the new status is future but the existing post's date is not in the future. - $changeset_post = get_post( $changeset_post_id ); - if ( mysql2date( 'U', $changeset_post->post_date_gmt, false ) <= mysql2date( 'U', $now, false ) ) { - return new WP_Error( 'not_future_date' ); - } - } - - // The request was made via wp.customize.previewer.save(). - $update_transactionally = (bool) $args['status']; - $allow_revision = (bool) $args['status']; - - // Amend post values with any supplied data. - foreach ( $args['data'] as $setting_id => $setting_params ) { - if ( array_key_exists( 'value', $setting_params ) ) { - $this->set_post_value( $setting_id, $setting_params['value'] ); // Add to post values so that they can be validated and sanitized. - } - } - - // Note that in addition to post data, this will include any stashed theme mods. - $post_values = $this->unsanitized_post_values( array( - 'exclude_changeset' => true, - 'exclude_post_data' => false, - ) ); - $this->add_dynamic_settings( array_keys( $post_values ) ); // Ensure settings get created even if they lack an input value. - - /* - * Get list of IDs for settings that have values different from what is currently - * saved in the changeset. By skipping any values that are already the same, the - * subset of changed settings can be passed into validate_setting_values to prevent - * an underprivileged modifying a single setting for which they have the capability - * from being blocked from saving. This also prevents a user from touching of the - * previous saved settings and overriding the associated user_id if they made no change. - */ - $changed_setting_ids = array(); - foreach ( $post_values as $setting_id => $setting_value ) { - $setting = $this->get_setting( $setting_id ); - - if ( $setting && 'theme_mod' === $setting->type ) { - $prefixed_setting_id = $this->get_stylesheet() . '::' . $setting->id; - } else { - $prefixed_setting_id = $setting_id; - } - - $is_value_changed = ( - ! isset( $existing_changeset_data[ $prefixed_setting_id ] ) - || - ! array_key_exists( 'value', $existing_changeset_data[ $prefixed_setting_id ] ) - || - $existing_changeset_data[ $prefixed_setting_id ]['value'] !== $setting_value - ); - if ( $is_value_changed ) { - $changed_setting_ids[] = $setting_id; - } - } - - /** - * Fires before save validation happens. - * - * Plugins can add just-in-time {@see 'customize_validate_{$this->ID}'} filters - * at this point to catch any settings registered after `customize_register`. - * The dynamic portion of the hook name, `$this->ID` refers to the setting ID. - * - * @since 4.6.0 - * - * @param WP_Customize_Manager $this WP_Customize_Manager instance. - */ - do_action( 'customize_save_validation_before', $this ); - - // Validate settings. - $validated_values = array_merge( - array_fill_keys( array_keys( $args['data'] ), null ), // Make sure existence/capability checks are done on value-less setting updates. - $post_values - ); - $setting_validities = $this->validate_setting_values( $validated_values, array( - 'validate_capability' => true, - 'validate_existence' => true, - ) ); - $invalid_setting_count = count( array_filter( $setting_validities, 'is_wp_error' ) ); - - /* - * Short-circuit if there are invalid settings the update is transactional. - * A changeset update is transactional when a status is supplied in the request. - */ - if ( $update_transactionally && $invalid_setting_count > 0 ) { - $response = array( - 'setting_validities' => $setting_validities, - 'message' => sprintf( _n( 'There is %s invalid setting.', 'There are %s invalid settings.', $invalid_setting_count ), number_format_i18n( $invalid_setting_count ) ), - ); - return new WP_Error( 'transaction_fail', '', $response ); - } - - // Obtain/merge data for changeset. - $original_changeset_data = $this->get_changeset_post_data( $changeset_post_id ); - $data = $original_changeset_data; - if ( is_wp_error( $data ) ) { - $data = array(); - } - - // Ensure that all post values are included in the changeset data. - foreach ( $post_values as $setting_id => $post_value ) { - if ( ! isset( $args['data'][ $setting_id ] ) ) { - $args['data'][ $setting_id ] = array(); - } - if ( ! isset( $args['data'][ $setting_id ]['value'] ) ) { - $args['data'][ $setting_id ]['value'] = $post_value; - } - } - - foreach ( $args['data'] as $setting_id => $setting_params ) { - $setting = $this->get_setting( $setting_id ); - if ( ! $setting || ! $setting->check_capabilities() ) { - continue; - } - - // Skip updating changeset for invalid setting values. - if ( isset( $setting_validities[ $setting_id ] ) && is_wp_error( $setting_validities[ $setting_id ] ) ) { - continue; - } - - $changeset_setting_id = $setting_id; - if ( 'theme_mod' === $setting->type ) { - $changeset_setting_id = sprintf( '%s::%s', $this->get_stylesheet(), $setting_id ); - } - - if ( null === $setting_params ) { - // Remove setting from changeset entirely. - unset( $data[ $changeset_setting_id ] ); - } else { - - if ( ! isset( $data[ $changeset_setting_id ] ) ) { - $data[ $changeset_setting_id ] = array(); - } - - // Merge any additional setting params that have been supplied with the existing params. - $merged_setting_params = array_merge( $data[ $changeset_setting_id ], $setting_params ); - - // Skip updating setting params if unchanged (ensuring the user_id is not overwritten). - if ( $data[ $changeset_setting_id ] === $merged_setting_params ) { - continue; - } - - $data[ $changeset_setting_id ] = array_merge( - $merged_setting_params, - array( - 'type' => $setting->type, - 'user_id' => $args['user_id'], - ) - ); - - // Clear starter_content flag in data if changeset is not explicitly being updated for starter content. - if ( empty( $args['starter_content'] ) ) { - unset( $data[ $changeset_setting_id ]['starter_content'] ); - } - } - } - - $filter_context = array( - 'uuid' => $this->changeset_uuid(), - 'title' => $args['title'], - 'status' => $args['status'], - 'date_gmt' => $args['date_gmt'], - 'post_id' => $changeset_post_id, - 'previous_data' => is_wp_error( $original_changeset_data ) ? array() : $original_changeset_data, - 'manager' => $this, - ); - - /** - * Filters the settings' data that will be persisted into the changeset. - * - * Plugins may amend additional data (such as additional meta for settings) into the changeset with this filter. - * - * @since 4.7.0 - * - * @param array $data Updated changeset data, mapping setting IDs to arrays containing a $value item and optionally other metadata. - * @param array $context { - * Filter context. - * - * @type string $uuid Changeset UUID. - * @type string $title Requested title for the changeset post. - * @type string $status Requested status for the changeset post. - * @type string $date_gmt Requested date for the changeset post in MySQL format and GMT timezone. - * @type int|false $post_id Post ID for the changeset, or false if it doesn't exist yet. - * @type array $previous_data Previous data contained in the changeset. - * @type WP_Customize_Manager $manager Manager instance. - * } - */ - $data = apply_filters( 'customize_changeset_save_data', $data, $filter_context ); - - // Switch theme if publishing changes now. - if ( 'publish' === $args['status'] && ! $this->is_theme_active() ) { - // Temporarily stop previewing the theme to allow switch_themes() to operate properly. - $this->stop_previewing_theme(); - switch_theme( $this->get_stylesheet() ); - update_option( 'theme_switched_via_customizer', true ); - $this->start_previewing_theme(); - } - - // Gather the data for wp_insert_post()/wp_update_post(). - $json_options = 0; - if ( defined( 'JSON_UNESCAPED_SLASHES' ) ) { - $json_options |= JSON_UNESCAPED_SLASHES; // Introduced in PHP 5.4. This is only to improve readability as slashes needn't be escaped in storage. - } - $json_options |= JSON_PRETTY_PRINT; // Also introduced in PHP 5.4, but WP defines constant for back compat. See WP Trac #30139. - $post_array = array( - 'post_content' => wp_json_encode( $data, $json_options ), - ); - if ( $args['title'] ) { - $post_array['post_title'] = $args['title']; - } - if ( $changeset_post_id ) { - $post_array['ID'] = $changeset_post_id; - } else { - $post_array['post_type'] = 'customize_changeset'; - $post_array['post_name'] = $this->changeset_uuid(); - $post_array['post_status'] = 'auto-draft'; - } - if ( $args['status'] ) { - $post_array['post_status'] = $args['status']; - } - - // Reset post date to now if we are publishing, otherwise pass post_date_gmt and translate for post_date. - if ( 'publish' === $args['status'] ) { - $post_array['post_date_gmt'] = '0000-00-00 00:00:00'; - $post_array['post_date'] = '0000-00-00 00:00:00'; - } elseif ( $args['date_gmt'] ) { - $post_array['post_date_gmt'] = $args['date_gmt']; - $post_array['post_date'] = get_date_from_gmt( $args['date_gmt'] ); - } elseif ( $changeset_post_id && 'auto-draft' === get_post_status( $changeset_post_id ) ) { - /* - * Keep bumping the date for the auto-draft whenever it is modified; - * this extends its life, preserving it from garbage-collection via - * wp_delete_auto_drafts(). - */ - $post_array['post_date'] = current_time( 'mysql' ); - $post_array['post_date_gmt'] = ''; - } - - $this->store_changeset_revision = $allow_revision; - add_filter( 'wp_save_post_revision_post_has_changed', array( $this, '_filter_revision_post_has_changed' ), 5, 3 ); - - // Update the changeset post. The publish_customize_changeset action will cause the settings in the changeset to be saved via WP_Customize_Setting::save(). - $has_kses = ( false !== has_filter( 'content_save_pre', 'wp_filter_post_kses' ) ); - if ( $has_kses ) { - kses_remove_filters(); // Prevent KSES from corrupting JSON in post_content. - } - - // Note that updating a post with publish status will trigger WP_Customize_Manager::publish_changeset_values(). - if ( $changeset_post_id ) { - $post_array['edit_date'] = true; // Prevent date clearing. - $r = wp_update_post( wp_slash( $post_array ), true ); - } else { - $r = wp_insert_post( wp_slash( $post_array ), true ); - if ( ! is_wp_error( $r ) ) { - $this->_changeset_post_id = $r; // Update cached post ID for the loaded changeset. - } - } - if ( $has_kses ) { - kses_init_filters(); - } - $this->_changeset_data = null; // Reset so WP_Customize_Manager::changeset_data() will re-populate with updated contents. - - remove_filter( 'wp_save_post_revision_post_has_changed', array( $this, '_filter_revision_post_has_changed' ) ); - - $response = array( - 'setting_validities' => $setting_validities, - ); - - if ( is_wp_error( $r ) ) { - $response['changeset_post_save_failure'] = $r->get_error_code(); - return new WP_Error( 'changeset_post_save_failure', '', $response ); - } - - return $response; - } - - /** - * Whether a changeset revision should be made. - * - * @since 4.7.0 - * @access private - * @var bool - */ - protected $store_changeset_revision; - - /** - * Filters whether a changeset has changed to create a new revision. - * - * Note that this will not be called while a changeset post remains in auto-draft status. - * - * @since 4.7.0 - * @access private - * - * @param bool $post_has_changed Whether the post has changed. - * @param WP_Post $last_revision The last revision post object. - * @param WP_Post $post The post object. - * - * @return bool Whether a revision should be made. - */ - public function _filter_revision_post_has_changed( $post_has_changed, $last_revision, $post ) { - unset( $last_revision ); - if ( 'customize_changeset' === $post->post_type ) { - $post_has_changed = $this->store_changeset_revision; - } - return $post_has_changed; - } - - /** - * Publish changeset values. - * - * This will the values contained in a changeset, even changesets that do not - * correspond to current manager instance. This is called by - * `_wp_customize_publish_changeset()` when a customize_changeset post is - * transitioned to the `publish` status. As such, this method should not be - * called directly and instead `wp_publish_post()` should be used. - * - * Please note that if the settings in the changeset are for a non-activated - * theme, the theme must first be switched to (via `switch_theme()`) before - * invoking this method. - * - * @since 4.7.0 - * @access private - * @see _wp_customize_publish_changeset() - * - * @param int $changeset_post_id ID for customize_changeset post. Defaults to the changeset for the current manager instance. - * @return true|WP_Error True or error info. - */ - public function _publish_changeset_values( $changeset_post_id ) { - $publishing_changeset_data = $this->get_changeset_post_data( $changeset_post_id ); - if ( is_wp_error( $publishing_changeset_data ) ) { - return $publishing_changeset_data; - } - - $changeset_post = get_post( $changeset_post_id ); - - /* - * Temporarily override the changeset context so that it will be read - * in calls to unsanitized_post_values() and so that it will be available - * on the $wp_customize object passed to hooks during the save logic. - */ - $previous_changeset_post_id = $this->_changeset_post_id; - $this->_changeset_post_id = $changeset_post_id; - $previous_changeset_uuid = $this->_changeset_uuid; - $this->_changeset_uuid = $changeset_post->post_name; - $previous_changeset_data = $this->_changeset_data; - $this->_changeset_data = $publishing_changeset_data; - - // Parse changeset data to identify theme mod settings and user IDs associated with settings to be saved. - $setting_user_ids = array(); - $theme_mod_settings = array(); - $namespace_pattern = '/^(?P<stylesheet>.+?)::(?P<setting_id>.+)$/'; - $matches = array(); - foreach ( $this->_changeset_data as $raw_setting_id => $setting_params ) { - $actual_setting_id = null; - $is_theme_mod_setting = ( - isset( $setting_params['value'] ) - && - isset( $setting_params['type'] ) - && - 'theme_mod' === $setting_params['type'] - && - preg_match( $namespace_pattern, $raw_setting_id, $matches ) - ); - if ( $is_theme_mod_setting ) { - if ( ! isset( $theme_mod_settings[ $matches['stylesheet'] ] ) ) { - $theme_mod_settings[ $matches['stylesheet'] ] = array(); - } - $theme_mod_settings[ $matches['stylesheet'] ][ $matches['setting_id'] ] = $setting_params; - - if ( $this->get_stylesheet() === $matches['stylesheet'] ) { - $actual_setting_id = $matches['setting_id']; - } - } else { - $actual_setting_id = $raw_setting_id; - } - - // Keep track of the user IDs for settings actually for this theme. - if ( $actual_setting_id && isset( $setting_params['user_id'] ) ) { - $setting_user_ids[ $actual_setting_id ] = $setting_params['user_id']; - } - } - - $changeset_setting_values = $this->unsanitized_post_values( array( - 'exclude_post_data' => true, - 'exclude_changeset' => false, - ) ); - $changeset_setting_ids = array_keys( $changeset_setting_values ); - $this->add_dynamic_settings( $changeset_setting_ids ); - - /** - * Fires once the theme has switched in the Customizer, but before settings - * have been saved. - * - * @since 3.4.0 - * - * @param WP_Customize_Manager $manager WP_Customize_Manager instance. - */ - do_action( 'customize_save', $this ); - - /* - * Ensure that all settings will allow themselves to be saved. Note that - * this is safe because the setting would have checked the capability - * when the setting value was written into the changeset. So this is why - * an additional capability check is not required here. - */ - $original_setting_capabilities = array(); - foreach ( $changeset_setting_ids as $setting_id ) { - $setting = $this->get_setting( $setting_id ); - if ( $setting && ! isset( $setting_user_ids[ $setting_id ] ) ) { - $original_setting_capabilities[ $setting->id ] = $setting->capability; - $setting->capability = 'exist'; - } - } - - $original_user_id = get_current_user_id(); - foreach ( $changeset_setting_ids as $setting_id ) { - $setting = $this->get_setting( $setting_id ); - if ( $setting ) { - /* - * Set the current user to match the user who saved the value into - * the changeset so that any filters that apply during the save - * process will respect the original user's capabilities. This - * will ensure, for example, that KSES won't strip unsafe HTML - * when a scheduled changeset publishes via WP Cron. - */ - if ( isset( $setting_user_ids[ $setting_id ] ) ) { - wp_set_current_user( $setting_user_ids[ $setting_id ] ); - } else { - wp_set_current_user( $original_user_id ); - } - - $setting->save(); - } - } - wp_set_current_user( $original_user_id ); - - // Update the stashed theme mod settings, removing the active theme's stashed settings, if activated. - if ( did_action( 'switch_theme' ) ) { - $other_theme_mod_settings = $theme_mod_settings; - unset( $other_theme_mod_settings[ $this->get_stylesheet() ] ); - $this->update_stashed_theme_mod_settings( $other_theme_mod_settings ); - } - - /** - * Fires after Customize settings have been saved. - * - * @since 3.6.0 - * - * @param WP_Customize_Manager $manager WP_Customize_Manager instance. - */ - do_action( 'customize_save_after', $this ); - - // Restore original capabilities. - foreach ( $original_setting_capabilities as $setting_id => $capability ) { - $setting = $this->get_setting( $setting_id ); - if ( $setting ) { - $setting->capability = $capability; - } - } - - // Restore original changeset data. - $this->_changeset_data = $previous_changeset_data; - $this->_changeset_post_id = $previous_changeset_post_id; - $this->_changeset_uuid = $previous_changeset_uuid; - - return true; - } - - /** - * Update stashed theme mod settings. - * - * @since 4.7.0 - * @access private - * - * @param array $inactive_theme_mod_settings Mapping of stylesheet to arrays of theme mod settings. - * @return array|false Returns array of updated stashed theme mods or false if the update failed or there were no changes. - */ - protected function update_stashed_theme_mod_settings( $inactive_theme_mod_settings ) { - $stashed_theme_mod_settings = get_option( 'customize_stashed_theme_mods' ); - if ( empty( $stashed_theme_mod_settings ) ) { - $stashed_theme_mod_settings = array(); - } - - // Delete any stashed theme mods for the active theme since since they would have been loaded and saved upon activation. - unset( $stashed_theme_mod_settings[ $this->get_stylesheet() ] ); - - // Merge inactive theme mods with the stashed theme mod settings. - foreach ( $inactive_theme_mod_settings as $stylesheet => $theme_mod_settings ) { - if ( ! isset( $stashed_theme_mod_settings[ $stylesheet ] ) ) { - $stashed_theme_mod_settings[ $stylesheet ] = array(); - } - - $stashed_theme_mod_settings[ $stylesheet ] = array_merge( - $stashed_theme_mod_settings[ $stylesheet ], - $theme_mod_settings - ); - } - - $autoload = false; - $result = update_option( 'customize_stashed_theme_mods', $stashed_theme_mod_settings, $autoload ); - if ( ! $result ) { - return false; - } - return $stashed_theme_mod_settings; - } - - /** - * Refresh nonces for the current preview. - * - * @since 4.2.0 - */ - public function refresh_nonces() { - if ( ! $this->is_preview() ) { - wp_send_json_error( 'not_preview' ); - } - - wp_send_json_success( $this->get_nonces() ); - } - - /** - * Add a customize setting. - * - * @since 3.4.0 - * @since 4.5.0 Return added WP_Customize_Setting instance. - * @access public - * - * @param WP_Customize_Setting|string $id Customize Setting object, or ID. - * @param array $args Setting arguments; passed to WP_Customize_Setting - * constructor. - * @return WP_Customize_Setting The instance of the setting that was added. - */ - public function add_setting( $id, $args = array() ) { - if ( $id instanceof WP_Customize_Setting ) { - $setting = $id; - } else { - $class = 'WP_Customize_Setting'; - - /** This filter is documented in wp-includes/class-wp-customize-manager.php */ - $args = apply_filters( 'customize_dynamic_setting_args', $args, $id ); - - /** This filter is documented in wp-includes/class-wp-customize-manager.php */ - $class = apply_filters( 'customize_dynamic_setting_class', $class, $id, $args ); - - $setting = new $class( $this, $id, $args ); - } - - $this->settings[ $setting->id ] = $setting; - return $setting; - } - - /** - * Register any dynamically-created settings, such as those from $_POST['customized'] - * that have no corresponding setting created. - * - * This is a mechanism to "wake up" settings that have been dynamically created - * on the front end and have been sent to WordPress in `$_POST['customized']`. When WP - * loads, the dynamically-created settings then will get created and previewed - * even though they are not directly created statically with code. - * - * @since 4.2.0 - * @access public - * - * @param array $setting_ids The setting IDs to add. - * @return array The WP_Customize_Setting objects added. - */ - public function add_dynamic_settings( $setting_ids ) { - $new_settings = array(); - foreach ( $setting_ids as $setting_id ) { - // Skip settings already created - if ( $this->get_setting( $setting_id ) ) { - continue; - } - - $setting_args = false; - $setting_class = 'WP_Customize_Setting'; - - /** - * Filters a dynamic setting's constructor args. - * - * For a dynamic setting to be registered, this filter must be employed - * to override the default false value with an array of args to pass to - * the WP_Customize_Setting constructor. - * - * @since 4.2.0 - * - * @param false|array $setting_args The arguments to the WP_Customize_Setting constructor. - * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. - */ - $setting_args = apply_filters( 'customize_dynamic_setting_args', $setting_args, $setting_id ); - if ( false === $setting_args ) { - continue; - } - - /** - * Allow non-statically created settings to be constructed with custom WP_Customize_Setting subclass. - * - * @since 4.2.0 - * - * @param string $setting_class WP_Customize_Setting or a subclass. - * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. - * @param array $setting_args WP_Customize_Setting or a subclass. - */ - $setting_class = apply_filters( 'customize_dynamic_setting_class', $setting_class, $setting_id, $setting_args ); - - $setting = new $setting_class( $this, $setting_id, $setting_args ); - - $this->add_setting( $setting ); - $new_settings[] = $setting; - } - return $new_settings; - } - - /** - * Retrieve a customize setting. - * - * @since 3.4.0 - * - * @param string $id Customize Setting ID. - * @return WP_Customize_Setting|void The setting, if set. - */ - public function get_setting( $id ) { - if ( isset( $this->settings[ $id ] ) ) { - return $this->settings[ $id ]; - } - } - - /** - * Remove a customize setting. - * - * @since 3.4.0 - * - * @param string $id Customize Setting ID. - */ - public function remove_setting( $id ) { - unset( $this->settings[ $id ] ); - } - - /** - * Add a customize panel. - * - * @since 4.0.0 - * @since 4.5.0 Return added WP_Customize_Panel instance. - * @access public - * - * @param WP_Customize_Panel|string $id Customize Panel object, or Panel ID. - * @param array $args Optional. Panel arguments. Default empty array. - * - * @return WP_Customize_Panel The instance of the panel that was added. - */ - public function add_panel( $id, $args = array() ) { - if ( $id instanceof WP_Customize_Panel ) { - $panel = $id; - } else { - $panel = new WP_Customize_Panel( $this, $id, $args ); - } - - $this->panels[ $panel->id ] = $panel; - return $panel; - } - - /** - * Retrieve a customize panel. - * - * @since 4.0.0 - * @access public - * - * @param string $id Panel ID to get. - * @return WP_Customize_Panel|void Requested panel instance, if set. - */ - public function get_panel( $id ) { - if ( isset( $this->panels[ $id ] ) ) { - return $this->panels[ $id ]; - } - } - - /** - * Remove a customize panel. - * - * @since 4.0.0 - * @access public - * - * @param string $id Panel ID to remove. - */ - public function remove_panel( $id ) { - // Removing core components this way is _doing_it_wrong(). - if ( in_array( $id, $this->components, true ) ) { - /* translators: 1: panel id, 2: link to 'customize_loaded_components' filter reference */ - $message = sprintf( __( 'Removing %1$s manually will cause PHP warnings. Use the %2$s filter instead.' ), - $id, - '<a href="' . esc_url( 'https://developer.wordpress.org/reference/hooks/customize_loaded_components/' ) . '"><code>customize_loaded_components</code></a>' - ); - - _doing_it_wrong( __METHOD__, $message, '4.5.0' ); - } - unset( $this->panels[ $id ] ); - } - - /** - * Register a customize panel type. - * - * Registered types are eligible to be rendered via JS and created dynamically. - * - * @since 4.3.0 - * @access public - * - * @see WP_Customize_Panel - * - * @param string $panel Name of a custom panel which is a subclass of WP_Customize_Panel. - */ - public function register_panel_type( $panel ) { - $this->registered_panel_types[] = $panel; - } - - /** - * Render JS templates for all registered panel types. - * - * @since 4.3.0 - * @access public - */ - public function render_panel_templates() { - foreach ( $this->registered_panel_types as $panel_type ) { - $panel = new $panel_type( $this, 'temp', array() ); - $panel->print_template(); - } - } - - /** - * Add a customize section. - * - * @since 3.4.0 - * @since 4.5.0 Return added WP_Customize_Section instance. - * @access public - * - * @param WP_Customize_Section|string $id Customize Section object, or Section ID. - * @param array $args Section arguments. - * - * @return WP_Customize_Section The instance of the section that was added. - */ - public function add_section( $id, $args = array() ) { - if ( $id instanceof WP_Customize_Section ) { - $section = $id; - } else { - $section = new WP_Customize_Section( $this, $id, $args ); - } - - $this->sections[ $section->id ] = $section; - return $section; - } - - /** - * Retrieve a customize section. - * - * @since 3.4.0 - * - * @param string $id Section ID. - * @return WP_Customize_Section|void The section, if set. - */ - public function get_section( $id ) { - if ( isset( $this->sections[ $id ] ) ) - return $this->sections[ $id ]; - } - - /** - * Remove a customize section. - * - * @since 3.4.0 - * - * @param string $id Section ID. - */ - public function remove_section( $id ) { - unset( $this->sections[ $id ] ); - } - - /** - * Register a customize section type. - * - * Registered types are eligible to be rendered via JS and created dynamically. - * - * @since 4.3.0 - * @access public - * - * @see WP_Customize_Section - * - * @param string $section Name of a custom section which is a subclass of WP_Customize_Section. - */ - public function register_section_type( $section ) { - $this->registered_section_types[] = $section; - } - - /** - * Render JS templates for all registered section types. - * - * @since 4.3.0 - * @access public - */ - public function render_section_templates() { - foreach ( $this->registered_section_types as $section_type ) { - $section = new $section_type( $this, 'temp', array() ); - $section->print_template(); - } - } - - /** - * Add a customize control. - * - * @since 3.4.0 - * @since 4.5.0 Return added WP_Customize_Control instance. - * @access public - * - * @param WP_Customize_Control|string $id Customize Control object, or ID. - * @param array $args Control arguments; passed to WP_Customize_Control - * constructor. - * @return WP_Customize_Control The instance of the control that was added. - */ - public function add_control( $id, $args = array() ) { - if ( $id instanceof WP_Customize_Control ) { - $control = $id; - } else { - $control = new WP_Customize_Control( $this, $id, $args ); - } - - $this->controls[ $control->id ] = $control; - return $control; - } - - /** - * Retrieve a customize control. - * - * @since 3.4.0 - * - * @param string $id ID of the control. - * @return WP_Customize_Control|void The control object, if set. - */ - public function get_control( $id ) { - if ( isset( $this->controls[ $id ] ) ) - return $this->controls[ $id ]; - } - - /** - * Remove a customize control. - * - * @since 3.4.0 - * - * @param string $id ID of the control. - */ - public function remove_control( $id ) { - unset( $this->controls[ $id ] ); - } - - /** - * Register a customize control type. - * - * Registered types are eligible to be rendered via JS and created dynamically. - * - * @since 4.1.0 - * @access public - * - * @param string $control Name of a custom control which is a subclass of - * WP_Customize_Control. - */ - public function register_control_type( $control ) { - $this->registered_control_types[] = $control; - } - - /** - * Render JS templates for all registered control types. - * - * @since 4.1.0 - * @access public - */ - public function render_control_templates() { - foreach ( $this->registered_control_types as $control_type ) { - $control = new $control_type( $this, 'temp', array( - 'settings' => array(), - ) ); - $control->print_template(); - } - ?> - <script type="text/html" id="tmpl-customize-control-notifications"> - <ul> - <# _.each( data.notifications, function( notification ) { #> - <li class="notice notice-{{ notification.type || 'info' }} {{ data.altNotice ? 'notice-alt' : '' }}" data-code="{{ notification.code }}" data-type="{{ notification.type }}">{{{ notification.message || notification.code }}}</li> - <# } ); #> - </ul> - </script> - <?php - } - - /** - * Helper function to compare two objects by priority, ensuring sort stability via instance_number. - * - * @since 3.4.0 - * @deprecated 4.7.0 Use wp_list_sort() - * - * @param WP_Customize_Panel|WP_Customize_Section|WP_Customize_Control $a Object A. - * @param WP_Customize_Panel|WP_Customize_Section|WP_Customize_Control $b Object B. - * @return int - */ - protected function _cmp_priority( $a, $b ) { - _deprecated_function( __METHOD__, '4.7.0', 'wp_list_sort' ); - - if ( $a->priority === $b->priority ) { - return $a->instance_number - $b->instance_number; - } else { - return $a->priority - $b->priority; - } - } - - /** - * Prepare panels, sections, and controls. - * - * For each, check if required related components exist, - * whether the user has the necessary capabilities, - * and sort by priority. - * - * @since 3.4.0 - */ - public function prepare_controls() { - - $controls = array(); - $this->controls = wp_list_sort( $this->controls, array( - 'priority' => 'ASC', - 'instance_number' => 'ASC', - ), 'ASC', true ); - - foreach ( $this->controls as $id => $control ) { - if ( ! isset( $this->sections[ $control->section ] ) || ! $control->check_capabilities() ) { - continue; - } - - $this->sections[ $control->section ]->controls[] = $control; - $controls[ $id ] = $control; - } - $this->controls = $controls; - - // Prepare sections. - $this->sections = wp_list_sort( $this->sections, array( - 'priority' => 'ASC', - 'instance_number' => 'ASC', - ), 'ASC', true ); - $sections = array(); - - foreach ( $this->sections as $section ) { - if ( ! $section->check_capabilities() ) { - continue; - } - - - $section->controls = wp_list_sort( $section->controls, array( - 'priority' => 'ASC', - 'instance_number' => 'ASC', - ) ); - - if ( ! $section->panel ) { - // Top-level section. - $sections[ $section->id ] = $section; - } else { - // This section belongs to a panel. - if ( isset( $this->panels [ $section->panel ] ) ) { - $this->panels[ $section->panel ]->sections[ $section->id ] = $section; - } - } - } - $this->sections = $sections; - - // Prepare panels. - $this->panels = wp_list_sort( $this->panels, array( - 'priority' => 'ASC', - 'instance_number' => 'ASC', - ), 'ASC', true ); - $panels = array(); - - foreach ( $this->panels as $panel ) { - if ( ! $panel->check_capabilities() ) { - continue; - } - - $panel->sections = wp_list_sort( $panel->sections, array( - 'priority' => 'ASC', - 'instance_number' => 'ASC', - ), 'ASC', true ); - $panels[ $panel->id ] = $panel; - } - $this->panels = $panels; - - // Sort panels and top-level sections together. - $this->containers = array_merge( $this->panels, $this->sections ); - $this->containers = wp_list_sort( $this->containers, array( - 'priority' => 'ASC', - 'instance_number' => 'ASC', - ), 'ASC', true ); - } - - /** - * Enqueue scripts for customize controls. - * - * @since 3.4.0 - */ - public function enqueue_control_scripts() { - foreach ( $this->controls as $control ) { - $control->enqueue(); - } - } - - /** - * Determine whether the user agent is iOS. - * - * @since 4.4.0 - * @access public - * - * @return bool Whether the user agent is iOS. - */ - public function is_ios() { - return wp_is_mobile() && preg_match( '/iPad|iPod|iPhone/', $_SERVER['HTTP_USER_AGENT'] ); - } - - /** - * Get the template string for the Customizer pane document title. - * - * @since 4.4.0 - * @access public - * - * @return string The template string for the document title. - */ - public function get_document_title_template() { - if ( $this->is_theme_active() ) { - /* translators: %s: document title from the preview */ - $document_title_tmpl = __( 'Customize: %s' ); - } else { - /* translators: %s: document title from the preview */ - $document_title_tmpl = __( 'Live Preview: %s' ); - } - $document_title_tmpl = html_entity_decode( $document_title_tmpl, ENT_QUOTES, 'UTF-8' ); // Because exported to JS and assigned to document.title. - return $document_title_tmpl; - } - - /** - * Set the initial URL to be previewed. - * - * URL is validated. - * - * @since 4.4.0 - * @access public - * - * @param string $preview_url URL to be previewed. - */ - public function set_preview_url( $preview_url ) { - $preview_url = esc_url_raw( $preview_url ); - $this->preview_url = wp_validate_redirect( $preview_url, home_url( '/' ) ); - } - - /** - * Get the initial URL to be previewed. - * - * @since 4.4.0 - * @access public - * - * @return string URL being previewed. - */ - public function get_preview_url() { - if ( empty( $this->preview_url ) ) { - $preview_url = home_url( '/' ); - } else { - $preview_url = $this->preview_url; - } - return $preview_url; - } - - /** - * Determines whether the admin and the frontend are on different domains. - * - * @since 4.7.0 - * @access public - * - * @return bool Whether cross-domain. - */ - public function is_cross_domain() { - $admin_origin = wp_parse_url( admin_url() ); - $home_origin = wp_parse_url( home_url() ); - $cross_domain = ( strtolower( $admin_origin['host'] ) !== strtolower( $home_origin['host'] ) ); - return $cross_domain; - } - - /** - * Get URLs allowed to be previewed. - * - * If the front end and the admin are served from the same domain, load the - * preview over ssl if the Customizer is being loaded over ssl. This avoids - * insecure content warnings. This is not attempted if the admin and front end - * are on different domains to avoid the case where the front end doesn't have - * ssl certs. Domain mapping plugins can allow other urls in these conditions - * using the customize_allowed_urls filter. - * - * @since 4.7.0 - * @access public - * - * @returns array Allowed URLs. - */ - public function get_allowed_urls() { - $allowed_urls = array( home_url( '/' ) ); - - if ( is_ssl() && ! $this->is_cross_domain() ) { - $allowed_urls[] = home_url( '/', 'https' ); - } - - /** - * Filters the list of URLs allowed to be clicked and followed in the Customizer preview. - * - * @since 3.4.0 - * - * @param array $allowed_urls An array of allowed URLs. - */ - $allowed_urls = array_unique( apply_filters( 'customize_allowed_urls', $allowed_urls ) ); - - return $allowed_urls; - } - - /** - * Get messenger channel. - * - * @since 4.7.0 - * @access public - * - * @return string Messenger channel. - */ - public function get_messenger_channel() { - return $this->messenger_channel; - } - - /** - * Set URL to link the user to when closing the Customizer. - * - * URL is validated. - * - * @since 4.4.0 - * @access public - * - * @param string $return_url URL for return link. - */ - public function set_return_url( $return_url ) { - $return_url = esc_url_raw( $return_url ); - $return_url = remove_query_arg( wp_removable_query_args(), $return_url ); - $return_url = wp_validate_redirect( $return_url ); - $this->return_url = $return_url; - } - - /** - * Get URL to link the user to when closing the Customizer. - * - * @since 4.4.0 - * @access public - * - * @return string URL for link to close Customizer. - */ - public function get_return_url() { - $referer = wp_get_referer(); - $excluded_referer_basenames = array( 'customize.php', 'wp-login.php' ); - - if ( $this->return_url ) { - $return_url = $this->return_url; - } else if ( $referer && ! in_array( basename( parse_url( $referer, PHP_URL_PATH ) ), $excluded_referer_basenames, true ) ) { - $return_url = $referer; - } else if ( $this->preview_url ) { - $return_url = $this->preview_url; - } else { - $return_url = home_url( '/' ); - } - return $return_url; - } - - /** - * Set the autofocused constructs. - * - * @since 4.4.0 - * @access public - * - * @param array $autofocus { - * Mapping of 'panel', 'section', 'control' to the ID which should be autofocused. - * - * @type string [$control] ID for control to be autofocused. - * @type string [$section] ID for section to be autofocused. - * @type string [$panel] ID for panel to be autofocused. - * } - */ - public function set_autofocus( $autofocus ) { - $this->autofocus = array_filter( wp_array_slice_assoc( $autofocus, array( 'panel', 'section', 'control' ) ), 'is_string' ); - } - - /** - * Get the autofocused constructs. - * - * @since 4.4.0 - * @access public - * - * @return array { - * Mapping of 'panel', 'section', 'control' to the ID which should be autofocused. - * - * @type string [$control] ID for control to be autofocused. - * @type string [$section] ID for section to be autofocused. - * @type string [$panel] ID for panel to be autofocused. - * } - */ - public function get_autofocus() { - return $this->autofocus; - } - - /** - * Get nonces for the Customizer. - * - * @since 4.5.0 - * @return array Nonces. - */ - public function get_nonces() { - $nonces = array( - 'save' => wp_create_nonce( 'save-customize_' . $this->get_stylesheet() ), - 'preview' => wp_create_nonce( 'preview-customize_' . $this->get_stylesheet() ), - ); - - /** - * Filters nonces for Customizer. - * - * @since 4.2.0 - * - * @param array $nonces Array of refreshed nonces for save and - * preview actions. - * @param WP_Customize_Manager $this WP_Customize_Manager instance. - */ - $nonces = apply_filters( 'customize_refresh_nonces', $nonces, $this ); - - return $nonces; - } - - /** - * Print JavaScript settings for parent window. - * - * @since 4.4.0 - */ - public function customize_pane_settings() { - - $login_url = add_query_arg( array( - 'interim-login' => 1, - 'customize-login' => 1, - ), wp_login_url() ); - - // Ensure dirty flags are set for modified settings. - foreach ( array_keys( $this->unsanitized_post_values() ) as $setting_id ) { - $setting = $this->get_setting( $setting_id ); - if ( $setting ) { - $setting->dirty = true; - } - } - - // Prepare Customizer settings to pass to JavaScript. - $settings = array( - 'changeset' => array( - 'uuid' => $this->changeset_uuid(), - 'status' => $this->changeset_post_id() ? get_post_status( $this->changeset_post_id() ) : '', - ), - 'timeouts' => array( - 'windowRefresh' => 250, - 'changesetAutoSave' => AUTOSAVE_INTERVAL * 1000, - 'keepAliveCheck' => 2500, - 'reflowPaneContents' => 100, - 'previewFrameSensitivity' => 2000, - ), - 'theme' => array( - 'stylesheet' => $this->get_stylesheet(), - 'active' => $this->is_theme_active(), - ), - 'url' => array( - 'preview' => esc_url_raw( $this->get_preview_url() ), - 'parent' => esc_url_raw( admin_url() ), - 'activated' => esc_url_raw( home_url( '/' ) ), - 'ajax' => esc_url_raw( admin_url( 'admin-ajax.php', 'relative' ) ), - 'allowed' => array_map( 'esc_url_raw', $this->get_allowed_urls() ), - 'isCrossDomain' => $this->is_cross_domain(), - 'home' => esc_url_raw( home_url( '/' ) ), - 'login' => esc_url_raw( $login_url ), - ), - 'browser' => array( - 'mobile' => wp_is_mobile(), - 'ios' => $this->is_ios(), - ), - 'panels' => array(), - 'sections' => array(), - 'nonce' => $this->get_nonces(), - 'autofocus' => $this->get_autofocus(), - 'documentTitleTmpl' => $this->get_document_title_template(), - 'previewableDevices' => $this->get_previewable_devices(), - ); - - // Prepare Customize Section objects to pass to JavaScript. - foreach ( $this->sections() as $id => $section ) { - if ( $section->check_capabilities() ) { - $settings['sections'][ $id ] = $section->json(); - } - } - - // Prepare Customize Panel objects to pass to JavaScript. - foreach ( $this->panels() as $panel_id => $panel ) { - if ( $panel->check_capabilities() ) { - $settings['panels'][ $panel_id ] = $panel->json(); - foreach ( $panel->sections as $section_id => $section ) { - if ( $section->check_capabilities() ) { - $settings['sections'][ $section_id ] = $section->json(); - } - } - } - } - - ?> - <script type="text/javascript"> - var _wpCustomizeSettings = <?php echo wp_json_encode( $settings ); ?>; - _wpCustomizeSettings.controls = {}; - _wpCustomizeSettings.settings = {}; - <?php - - // Serialize settings one by one to improve memory usage. - echo "(function ( s ){\n"; - foreach ( $this->settings() as $setting ) { - if ( $setting->check_capabilities() ) { - printf( - "s[%s] = %s;\n", - wp_json_encode( $setting->id ), - wp_json_encode( $setting->json() ) - ); - } - } - echo "})( _wpCustomizeSettings.settings );\n"; - - // Serialize controls one by one to improve memory usage. - echo "(function ( c ){\n"; - foreach ( $this->controls() as $control ) { - if ( $control->check_capabilities() ) { - printf( - "c[%s] = %s;\n", - wp_json_encode( $control->id ), - wp_json_encode( $control->json() ) - ); - } - } - echo "})( _wpCustomizeSettings.controls );\n"; - ?> - </script> - <?php - } - - /** - * Returns a list of devices to allow previewing. - * - * @access public - * @since 4.5.0 - * - * @return array List of devices with labels and default setting. - */ - public function get_previewable_devices() { - $devices = array( - 'desktop' => array( - 'label' => __( 'Enter desktop preview mode' ), - 'default' => true, - ), - 'tablet' => array( - 'label' => __( 'Enter tablet preview mode' ), - ), - 'mobile' => array( - 'label' => __( 'Enter mobile preview mode' ), - ), - ); - - /** - * Filters the available devices to allow previewing in the Customizer. - * - * @since 4.5.0 - * - * @see WP_Customize_Manager::get_previewable_devices() - * - * @param array $devices List of devices with labels and default setting. - */ - $devices = apply_filters( 'customize_previewable_devices', $devices ); - - return $devices; - } - - /** - * Register some default controls. - * - * @since 3.4.0 - */ - public function register_controls() { - - /* Panel, Section, and Control Types */ - $this->register_panel_type( 'WP_Customize_Panel' ); - $this->register_section_type( 'WP_Customize_Section' ); - $this->register_section_type( 'WP_Customize_Sidebar_Section' ); - $this->register_control_type( 'WP_Customize_Color_Control' ); - $this->register_control_type( 'WP_Customize_Media_Control' ); - $this->register_control_type( 'WP_Customize_Upload_Control' ); - $this->register_control_type( 'WP_Customize_Image_Control' ); - $this->register_control_type( 'WP_Customize_Background_Image_Control' ); - $this->register_control_type( 'WP_Customize_Background_Position_Control' ); - $this->register_control_type( 'WP_Customize_Cropped_Image_Control' ); - $this->register_control_type( 'WP_Customize_Site_Icon_Control' ); - $this->register_control_type( 'WP_Customize_Theme_Control' ); - - /* Themes */ - - $this->add_section( new WP_Customize_Themes_Section( $this, 'themes', array( - 'title' => $this->theme()->display( 'Name' ), - 'capability' => 'switch_themes', - 'priority' => 0, - ) ) ); - - // Themes Setting (unused - the theme is considerably more fundamental to the Customizer experience). - $this->add_setting( new WP_Customize_Filter_Setting( $this, 'active_theme', array( - 'capability' => 'switch_themes', - ) ) ); - - require_once( ABSPATH . 'wp-admin/includes/theme.php' ); - - // Theme Controls. - - // Add a control for the active/original theme. - if ( ! $this->is_theme_active() ) { - $themes = wp_prepare_themes_for_js( array( wp_get_theme( $this->original_stylesheet ) ) ); - $active_theme = current( $themes ); - $active_theme['isActiveTheme'] = true; - $this->add_control( new WP_Customize_Theme_Control( $this, $active_theme['id'], array( - 'theme' => $active_theme, - 'section' => 'themes', - 'settings' => 'active_theme', - ) ) ); - } - - $themes = wp_prepare_themes_for_js(); - foreach ( $themes as $theme ) { - if ( $theme['active'] || $theme['id'] === $this->original_stylesheet ) { - continue; - } - - $theme_id = 'theme_' . $theme['id']; - $theme['isActiveTheme'] = false; - $this->add_control( new WP_Customize_Theme_Control( $this, $theme_id, array( - 'theme' => $theme, - 'section' => 'themes', - 'settings' => 'active_theme', - ) ) ); - } - - /* Site Identity */ - - $this->add_section( 'title_tagline', array( - 'title' => __( 'Site Identity' ), - 'priority' => 20, - ) ); - - $this->add_setting( 'blogname', array( - 'default' => get_option( 'blogname' ), - 'type' => 'option', - 'capability' => 'manage_options', - ) ); - - $this->add_control( 'blogname', array( - 'label' => __( 'Site Title' ), - 'section' => 'title_tagline', - ) ); - - $this->add_setting( 'blogdescription', array( - 'default' => get_option( 'blogdescription' ), - 'type' => 'option', - 'capability' => 'manage_options', - ) ); - - $this->add_control( 'blogdescription', array( - 'label' => __( 'Tagline' ), - 'section' => 'title_tagline', - ) ); - - // Add a setting to hide header text if the theme doesn't support custom headers. - if ( ! current_theme_supports( 'custom-header', 'header-text' ) ) { - $this->add_setting( 'header_text', array( - 'theme_supports' => array( 'custom-logo', 'header-text' ), - 'default' => 1, - 'sanitize_callback' => 'absint', - ) ); - - $this->add_control( 'header_text', array( - 'label' => __( 'Display Site Title and Tagline' ), - 'section' => 'title_tagline', - 'settings' => 'header_text', - 'type' => 'checkbox', - ) ); - } - - $this->add_setting( 'site_icon', array( - 'type' => 'option', - 'capability' => 'manage_options', - 'transport' => 'postMessage', // Previewed with JS in the Customizer controls window. - ) ); - - $this->add_control( new WP_Customize_Site_Icon_Control( $this, 'site_icon', array( - 'label' => __( 'Site Icon' ), - 'description' => sprintf( - /* translators: %s: site icon size in pixels */ - __( 'The Site Icon is used as a browser and app icon for your site. Icons must be square, and at least %s pixels wide and tall.' ), - '<strong>512</strong>' - ), - 'section' => 'title_tagline', - 'priority' => 60, - 'height' => 512, - 'width' => 512, - ) ) ); - - $this->add_setting( 'custom_logo', array( - 'theme_supports' => array( 'custom-logo' ), - 'transport' => 'postMessage', - ) ); - - $custom_logo_args = get_theme_support( 'custom-logo' ); - $this->add_control( new WP_Customize_Cropped_Image_Control( $this, 'custom_logo', array( - 'label' => __( 'Logo' ), - 'section' => 'title_tagline', - 'priority' => 8, - 'height' => $custom_logo_args[0]['height'], - 'width' => $custom_logo_args[0]['width'], - 'flex_height' => $custom_logo_args[0]['flex-height'], - 'flex_width' => $custom_logo_args[0]['flex-width'], - 'button_labels' => array( - 'select' => __( 'Select logo' ), - 'change' => __( 'Change logo' ), - 'remove' => __( 'Remove' ), - 'default' => __( 'Default' ), - 'placeholder' => __( 'No logo selected' ), - 'frame_title' => __( 'Select logo' ), - 'frame_button' => __( 'Choose logo' ), - ), - ) ) ); - - $this->selective_refresh->add_partial( 'custom_logo', array( - 'settings' => array( 'custom_logo' ), - 'selector' => '.custom-logo-link', - 'render_callback' => array( $this, '_render_custom_logo_partial' ), - 'container_inclusive' => true, - ) ); - - /* Colors */ - - $this->add_section( 'colors', array( - 'title' => __( 'Colors' ), - 'priority' => 40, - ) ); - - $this->add_setting( 'header_textcolor', array( - 'theme_supports' => array( 'custom-header', 'header-text' ), - 'default' => get_theme_support( 'custom-header', 'default-text-color' ), - - 'sanitize_callback' => array( $this, '_sanitize_header_textcolor' ), - 'sanitize_js_callback' => 'maybe_hash_hex_color', - ) ); - - // Input type: checkbox - // With custom value - $this->add_control( 'display_header_text', array( - 'settings' => 'header_textcolor', - 'label' => __( 'Display Site Title and Tagline' ), - 'section' => 'title_tagline', - 'type' => 'checkbox', - 'priority' => 40, - ) ); - - $this->add_control( new WP_Customize_Color_Control( $this, 'header_textcolor', array( - 'label' => __( 'Header Text Color' ), - 'section' => 'colors', - ) ) ); - - // Input type: Color - // With sanitize_callback - $this->add_setting( 'background_color', array( - 'default' => get_theme_support( 'custom-background', 'default-color' ), - 'theme_supports' => 'custom-background', - - 'sanitize_callback' => 'sanitize_hex_color_no_hash', - 'sanitize_js_callback' => 'maybe_hash_hex_color', - ) ); - - $this->add_control( new WP_Customize_Color_Control( $this, 'background_color', array( - 'label' => __( 'Background Color' ), - 'section' => 'colors', - ) ) ); - - /* Custom Header */ - - if ( current_theme_supports( 'custom-header', 'video' ) ) { - $title = __( 'Header Media' ); - $description = '<p>' . __( 'If you add a video, the image will be used as a fallback while the video loads.' ) . '</p>'; - - // @todo Customizer sections should support having notifications just like controls do. See <https://core.trac.wordpress.org/ticket/38794>. - $description .= '<div class="customize-control-notifications-container header-video-not-currently-previewable" style="display: none"><ul>'; - $description .= '<li class="notice notice-info">' . __( 'This theme doesn\'t support video headers on this page. Navigate to the front page or another page that supports video headers.' ) . '</li>'; - $description .= '</ul></div>'; - $width = absint( get_theme_support( 'custom-header', 'width' ) ); - $height = absint( get_theme_support( 'custom-header', 'height' ) ); - if ( $width && $height ) { - $control_description = sprintf( - /* translators: 1: .mp4, 2: header size in pixels */ - __( 'Upload your video in %1$s format and minimize its file size for best results. Your theme recommends dimensions of %2$s pixels.' ), - '<code>.mp4</code>', - sprintf( '<strong>%s × %s</strong>', $width, $height ) - ); - } elseif ( $width ) { - $control_description = sprintf( - /* translators: 1: .mp4, 2: header width in pixels */ - __( 'Upload your video in %1$s format and minimize its file size for best results. Your theme recommends a width of %2$s pixels.' ), - '<code>.mp4</code>', - sprintf( '<strong>%s</strong>', $width ) - ); - } else { - $control_description = sprintf( - /* translators: 1: .mp4, 2: header height in pixels */ - __( 'Upload your video in %1$s format and minimize its file size for best results. Your theme recommends a height of %2$s pixels.' ), - '<code>.mp4</code>', - sprintf( '<strong>%s</strong>', $height ) - ); - } - } else { - $title = __( 'Header Image' ); - $description = ''; - $control_description = ''; - } - - $this->add_section( 'header_image', array( - 'title' => $title, - 'description' => $description, - 'theme_supports' => 'custom-header', - 'priority' => 60, - ) ); - - $this->add_setting( 'header_video', array( - 'theme_supports' => array( 'custom-header', 'video' ), - 'transport' => 'postMessage', - 'sanitize_callback' => 'absint', - 'validate_callback' => array( $this, '_validate_header_video' ), - ) ); - - $this->add_setting( 'external_header_video', array( - 'theme_supports' => array( 'custom-header', 'video' ), - 'transport' => 'postMessage', - 'sanitize_callback' => array( $this, '_sanitize_external_header_video' ), - 'validate_callback' => array( $this, '_validate_external_header_video' ), - ) ); - - $this->add_setting( new WP_Customize_Filter_Setting( $this, 'header_image', array( - 'default' => sprintf( get_theme_support( 'custom-header', 'default-image' ), get_template_directory_uri(), get_stylesheet_directory_uri() ), - 'theme_supports' => 'custom-header', - ) ) ); - - $this->add_setting( new WP_Customize_Header_Image_Setting( $this, 'header_image_data', array( - 'theme_supports' => 'custom-header', - ) ) ); - - /* - * Switch image settings to postMessage when video support is enabled since - * it entails that the_custom_header_markup() will be used, and thus selective - * refresh can be utilized. - */ - if ( current_theme_supports( 'custom-header', 'video' ) ) { - $this->get_setting( 'header_image' )->transport = 'postMessage'; - $this->get_setting( 'header_image_data' )->transport = 'postMessage'; - } - - $this->add_control( new WP_Customize_Media_Control( $this, 'header_video', array( - 'theme_supports' => array( 'custom-header', 'video' ), - 'label' => __( 'Header Video' ), - 'description' => $control_description, - 'section' => 'header_image', - 'mime_type' => 'video', - // @todo These button_labels can be removed once WP_Customize_Media_Control provides mime_type-specific labels automatically. See <https://core.trac.wordpress.org/ticket/38796>. - 'button_labels' => array( - 'select' => __( 'Select Video' ), - 'change' => __( 'Change Video' ), - 'placeholder' => __( 'No video selected' ), - 'frame_title' => __( 'Select Video' ), - 'frame_button' => __( 'Choose Video' ), - ), - 'active_callback' => 'is_header_video_active', - ) ) ); - - $this->add_control( 'external_header_video', array( - 'theme_supports' => array( 'custom-header', 'video' ), - 'type' => 'url', - 'description' => __( 'Or, enter a YouTube URL:' ), - 'section' => 'header_image', - 'active_callback' => 'is_header_video_active', - ) ); - - $this->add_control( new WP_Customize_Header_Image_Control( $this ) ); - - $this->selective_refresh->add_partial( 'custom_header', array( - 'selector' => '#wp-custom-header', - 'render_callback' => 'the_custom_header_markup', - 'settings' => array( 'header_video', 'external_header_video', 'header_image' ), // The image is used as a video fallback here. - 'container_inclusive' => true, - ) ); - - /* Custom Background */ - - $this->add_section( 'background_image', array( - 'title' => __( 'Background Image' ), - 'theme_supports' => 'custom-background', - 'priority' => 80, - ) ); - - $this->add_setting( 'background_image', array( - 'default' => get_theme_support( 'custom-background', 'default-image' ), - 'theme_supports' => 'custom-background', - 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), - ) ); - - $this->add_setting( new WP_Customize_Background_Image_Setting( $this, 'background_image_thumb', array( - 'theme_supports' => 'custom-background', - 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), - ) ) ); - - $this->add_control( new WP_Customize_Background_Image_Control( $this ) ); - - $this->add_setting( 'background_preset', array( - 'default' => get_theme_support( 'custom-background', 'default-preset' ), - 'theme_supports' => 'custom-background', - 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), - ) ); - - $this->add_control( 'background_preset', array( - 'label' => _x( 'Preset', 'Background Preset' ), - 'section' => 'background_image', - 'type' => 'select', - 'choices' => array( - 'default' => _x( 'Default', 'Default Preset' ), - 'fill' => __( 'Fill Screen' ), - 'fit' => __( 'Fit to Screen' ), - 'repeat' => _x( 'Repeat', 'Repeat Image' ), - 'custom' => _x( 'Custom', 'Custom Preset' ), - ), - ) ); - - $this->add_setting( 'background_position_x', array( - 'default' => get_theme_support( 'custom-background', 'default-position-x' ), - 'theme_supports' => 'custom-background', - 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), - ) ); - - $this->add_setting( 'background_position_y', array( - 'default' => get_theme_support( 'custom-background', 'default-position-y' ), - 'theme_supports' => 'custom-background', - 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), - ) ); - - $this->add_control( new WP_Customize_Background_Position_Control( $this, 'background_position', array( - 'label' => __( 'Image Position' ), - 'section' => 'background_image', - 'settings' => array( - 'x' => 'background_position_x', - 'y' => 'background_position_y', - ), - ) ) ); - - $this->add_setting( 'background_size', array( - 'default' => get_theme_support( 'custom-background', 'default-size' ), - 'theme_supports' => 'custom-background', - 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), - ) ); - - $this->add_control( 'background_size', array( - 'label' => __( 'Image Size' ), - 'section' => 'background_image', - 'type' => 'select', - 'choices' => array( - 'auto' => __( 'Original' ), - 'contain' => __( 'Fit to Screen' ), - 'cover' => __( 'Fill Screen' ), - ), - ) ); - - $this->add_setting( 'background_repeat', array( - 'default' => get_theme_support( 'custom-background', 'default-repeat' ), - 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), - 'theme_supports' => 'custom-background', - ) ); - - $this->add_control( 'background_repeat', array( - 'label' => __( 'Repeat Background Image' ), - 'section' => 'background_image', - 'type' => 'checkbox', - ) ); - - $this->add_setting( 'background_attachment', array( - 'default' => get_theme_support( 'custom-background', 'default-attachment' ), - 'sanitize_callback' => array( $this, '_sanitize_background_setting' ), - 'theme_supports' => 'custom-background', - ) ); - - $this->add_control( 'background_attachment', array( - 'label' => __( 'Scroll with Page' ), - 'section' => 'background_image', - 'type' => 'checkbox', - ) ); - - - // If the theme is using the default background callback, we can update - // the background CSS using postMessage. - if ( get_theme_support( 'custom-background', 'wp-head-callback' ) === '_custom_background_cb' ) { - foreach ( array( 'color', 'image', 'preset', 'position_x', 'position_y', 'size', 'repeat', 'attachment' ) as $prop ) { - $this->get_setting( 'background_' . $prop )->transport = 'postMessage'; - } - } - - /* - * Static Front Page - * See also https://core.trac.wordpress.org/ticket/19627 which introduces the the static-front-page theme_support. - * The following replicates behavior from options-reading.php. - */ - - $this->add_section( 'static_front_page', array( - 'title' => __( 'Static Front Page' ), - 'priority' => 120, - 'description' => __( 'Your theme supports a static front page.' ), - 'active_callback' => array( $this, 'has_published_pages' ), - ) ); - - $this->add_setting( 'show_on_front', array( - 'default' => get_option( 'show_on_front' ), - 'capability' => 'manage_options', - 'type' => 'option', - ) ); - - $this->add_control( 'show_on_front', array( - 'label' => __( 'Front page displays' ), - 'section' => 'static_front_page', - 'type' => 'radio', - 'choices' => array( - 'posts' => __( 'Your latest posts' ), - 'page' => __( 'A static page' ), - ), - ) ); - - $this->add_setting( 'page_on_front', array( - 'type' => 'option', - 'capability' => 'manage_options', - ) ); - - $this->add_control( 'page_on_front', array( - 'label' => __( 'Front page' ), - 'section' => 'static_front_page', - 'type' => 'dropdown-pages', - 'allow_addition' => true, - ) ); - - $this->add_setting( 'page_for_posts', array( - 'type' => 'option', - 'capability' => 'manage_options', - ) ); - - $this->add_control( 'page_for_posts', array( - 'label' => __( 'Posts page' ), - 'section' => 'static_front_page', - 'type' => 'dropdown-pages', - 'allow_addition' => true, - ) ); - - /* Custom CSS */ - $this->add_section( 'custom_css', array( - 'title' => __( 'Additional CSS' ), - 'priority' => 200, - 'description_hidden' => true, - 'description' => sprintf( '%s<br /><a href="%s" class="external-link" target="_blank">%s<span class="screen-reader-text">%s</span></a>', - __( 'CSS allows you to customize the appearance and layout of your site with code. Separate CSS is saved for each of your themes. In the editing area the Tab key enters a tab character. To move below this area by pressing Tab, press the Esc key followed by the Tab key.' ), - esc_url( __( 'https://codex.wordpress.org/CSS' ) ), - __( 'Learn more about CSS' ), - __( '(link opens in a new window)' ) - ), - ) ); - - $custom_css_setting = new WP_Customize_Custom_CSS_Setting( $this, sprintf( 'custom_css[%s]', get_stylesheet() ), array( - 'capability' => 'edit_css', - 'default' => sprintf( "/*\n%s\n*/", __( "You can add your own CSS here.\n\nClick the help icon above to learn more." ) ), - ) ); - $this->add_setting( $custom_css_setting ); - - $this->add_control( 'custom_css', array( - 'type' => 'textarea', - 'section' => 'custom_css', - 'settings' => array( 'default' => $custom_css_setting->id ), - 'input_attrs' => array( - 'class' => 'code', // Ensures contents displayed as LTR instead of RTL. - ), - ) ); - } - - /** - * Return whether there are published pages. - * - * Used as active callback for static front page section and controls. - * - * @access private - * @since 4.7.0 - * - * @returns bool Whether there are published (or to be published) pages. - */ - public function has_published_pages() { - - $setting = $this->get_setting( 'nav_menus_created_posts' ); - if ( $setting ) { - foreach ( $setting->value() as $post_id ) { - if ( 'page' === get_post_type( $post_id ) ) { - return true; - } - } - } - return 0 !== count( get_pages() ); - } - - /** - * Add settings from the POST data that were not added with code, e.g. dynamically-created settings for Widgets - * - * @since 4.2.0 - * @access public - * - * @see add_dynamic_settings() - */ - public function register_dynamic_settings() { - $setting_ids = array_keys( $this->unsanitized_post_values() ); - $this->add_dynamic_settings( $setting_ids ); - } - - /** - * Callback for validating the header_textcolor value. - * - * Accepts 'blank', and otherwise uses sanitize_hex_color_no_hash(). - * Returns default text color if hex color is empty. - * - * @since 3.4.0 - * - * @param string $color - * @return mixed - */ - public function _sanitize_header_textcolor( $color ) { - if ( 'blank' === $color ) - return 'blank'; - - $color = sanitize_hex_color_no_hash( $color ); - if ( empty( $color ) ) - $color = get_theme_support( 'custom-header', 'default-text-color' ); - - return $color; - } - - /** - * Callback for validating a background setting value. - * - * @since 4.7.0 - * @access private - * - * @param string $value Repeat value. - * @param WP_Customize_Setting $setting Setting. - * @return string|WP_Error Background value or validation error. - */ - public function _sanitize_background_setting( $value, $setting ) { - if ( 'background_repeat' === $setting->id ) { - if ( ! in_array( $value, array( 'repeat-x', 'repeat-y', 'repeat', 'no-repeat' ) ) ) { - return new WP_Error( 'invalid_value', __( 'Invalid value for background repeat.' ) ); - } - } elseif ( 'background_attachment' === $setting->id ) { - if ( ! in_array( $value, array( 'fixed', 'scroll' ) ) ) { - return new WP_Error( 'invalid_value', __( 'Invalid value for background attachment.' ) ); - } - } elseif ( 'background_position_x' === $setting->id ) { - if ( ! in_array( $value, array( 'left', 'center', 'right' ), true ) ) { - return new WP_Error( 'invalid_value', __( 'Invalid value for background position X.' ) ); - } - } elseif ( 'background_position_y' === $setting->id ) { - if ( ! in_array( $value, array( 'top', 'center', 'bottom' ), true ) ) { - return new WP_Error( 'invalid_value', __( 'Invalid value for background position Y.' ) ); - } - } elseif ( 'background_size' === $setting->id ) { - if ( ! in_array( $value, array( 'auto', 'contain', 'cover' ), true ) ) { - return new WP_Error( 'invalid_value', __( 'Invalid value for background size.' ) ); - } - } elseif ( 'background_preset' === $setting->id ) { - if ( ! in_array( $value, array( 'default', 'fill', 'fit', 'repeat', 'custom' ), true ) ) { - return new WP_Error( 'invalid_value', __( 'Invalid value for background size.' ) ); - } - } elseif ( 'background_image' === $setting->id || 'background_image_thumb' === $setting->id ) { - $value = empty( $value ) ? '' : esc_url_raw( $value ); - } else { - return new WP_Error( 'unrecognized_setting', __( 'Unrecognized background setting.' ) ); - } - return $value; - } - - /** - * Export header video settings to facilitate selective refresh. - * - * @since 4.7.0 - * - * @param array $response Response. - * @param WP_Customize_Selective_Refresh $selective_refresh Selective refresh component. - * @param array $partials Array of partials. - * @return array - */ - public function export_header_video_settings( $response, $selective_refresh, $partials ) { - if ( isset( $partials['custom_header'] ) ) { - $response['custom_header_settings'] = get_header_video_settings(); - } - - return $response; - } - - /** - * Callback for validating the header_video value. - * - * Ensures that the selected video is less than 8MB and provides an error message. - * - * @since 4.7.0 - * - * @param WP_Error $validity - * @param mixed $value - * @return mixed - */ - public function _validate_header_video( $validity, $value ) { - $video = get_attached_file( absint( $value ) ); - if ( $video ) { - $size = filesize( $video ); - if ( 8 < $size / pow( 1024, 2 ) ) { // Check whether the size is larger than 8MB. - $validity->add( 'size_too_large', - __( 'This video file is too large to use as a header video. Try a shorter video or optimize the compression settings and re-upload a file that is less than 8MB. Or, upload your video to YouTube and link it with the option below.' ) - ); - } - if ( '.mp4' !== substr( $video, -4 ) && '.mov' !== substr( $video, -4 ) ) { // Check for .mp4 or .mov format, which (assuming h.264 encoding) are the only cross-browser-supported formats. - $validity->add( 'invalid_file_type', sprintf( - /* translators: 1: .mp4, 2: .mov */ - __( 'Only %1$s or %2$s files may be used for header video. Please convert your video file and try again, or, upload your video to YouTube and link it with the option below.' ), - '<code>.mp4</code>', - '<code>.mov</code>' - ) ); - } - } - return $validity; - } - - /** - * Callback for validating the external_header_video value. - * - * Ensures that the provided URL is supported. - * - * @since 4.7.0 - * - * @param WP_Error $validity - * @param mixed $value - * @return mixed - */ - public function _validate_external_header_video( $validity, $value ) { - $video = esc_url_raw( $value ); - if ( $video ) { - if ( ! preg_match( '#^https?://(?:www\.)?(?:youtube\.com/watch|youtu\.be/)#', $video ) ) { - $validity->add( 'invalid_url', __( 'Please enter a valid YouTube URL.' ) ); - } - } - return $validity; - } - - /** - * Callback for sanitizing the external_header_video value. - * - * @since 4.7.1 - * - * @param string $value URL. - * @return string Sanitized URL. - */ - public function _sanitize_external_header_video( $value ) { - return esc_url_raw( trim( $value ) ); - } - - /** - * Callback for rendering the custom logo, used in the custom_logo partial. - * - * This method exists because the partial object and context data are passed - * into a partial's render_callback so we cannot use get_custom_logo() as - * the render_callback directly since it expects a blog ID as the first - * argument. When WP no longer supports PHP 5.3, this method can be removed - * in favor of an anonymous function. - * - * @see WP_Customize_Manager::register_controls() - * - * @since 4.5.0 - * @access private - * - * @return string Custom logo. - */ - public function _render_custom_logo_partial() { - return get_custom_logo(); - } -} diff --git a/wp/wp-includes/class-wp-customize-nav-menus.php b/wp/wp-includes/class-wp-customize-nav-menus.php deleted file mode 100644 index dc5db7d5..00000000 --- a/wp/wp-includes/class-wp-customize-nav-menus.php +++ /dev/null @@ -1,1396 +0,0 @@ -<?php -/** - * WordPress Customize Nav Menus classes - * - * @package WordPress - * @subpackage Customize - * @since 4.3.0 - */ - -/** - * Customize Nav Menus class. - * - * Implements menu management in the Customizer. - * - * @since 4.3.0 - * - * @see WP_Customize_Manager - */ -final class WP_Customize_Nav_Menus { - - /** - * WP_Customize_Manager instance. - * - * @since 4.3.0 - * @access public - * @var WP_Customize_Manager - */ - public $manager; - - /** - * Previewed Menus. - * - * @since 4.3.0 - * @access public - * @var array - */ - public $previewed_menus; - - /** - * Constructor. - * - * @since 4.3.0 - * @access public - * - * @param object $manager An instance of the WP_Customize_Manager class. - */ - public function __construct( $manager ) { - $this->previewed_menus = array(); - $this->manager = $manager; - - // See https://github.com/xwp/wp-customize-snapshots/blob/962586659688a5b1fd9ae93618b7ce2d4e7a421c/php/class-customize-snapshot-manager.php#L469-L499 - add_action( 'customize_register', array( $this, 'customize_register' ), 11 ); - add_filter( 'customize_dynamic_setting_args', array( $this, 'filter_dynamic_setting_args' ), 10, 2 ); - add_filter( 'customize_dynamic_setting_class', array( $this, 'filter_dynamic_setting_class' ), 10, 3 ); - - // Skip remaining hooks when the user can't manage nav menus anyway. - if ( ! current_user_can( 'edit_theme_options' ) ) { - return; - } - - add_filter( 'customize_refresh_nonces', array( $this, 'filter_nonces' ) ); - add_action( 'wp_ajax_load-available-menu-items-customizer', array( $this, 'ajax_load_available_items' ) ); - add_action( 'wp_ajax_search-available-menu-items-customizer', array( $this, 'ajax_search_available_items' ) ); - add_action( 'wp_ajax_customize-nav-menus-insert-auto-draft', array( $this, 'ajax_insert_auto_draft_post' ) ); - add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); - add_action( 'customize_controls_print_footer_scripts', array( $this, 'print_templates' ) ); - add_action( 'customize_controls_print_footer_scripts', array( $this, 'available_items_template' ) ); - add_action( 'customize_preview_init', array( $this, 'customize_preview_init' ) ); - add_action( 'customize_preview_init', array( $this, 'make_auto_draft_status_previewable' ) ); - add_action( 'customize_save_nav_menus_created_posts', array( $this, 'save_nav_menus_created_posts' ) ); - - // Selective Refresh partials. - add_filter( 'customize_dynamic_partial_args', array( $this, 'customize_dynamic_partial_args' ), 10, 2 ); - } - - /** - * Adds a nonce for customizing menus. - * - * @since 4.5.0 - * @access public - * - * @param array $nonces Array of nonces. - * @return array $nonces Modified array of nonces. - */ - public function filter_nonces( $nonces ) { - $nonces['customize-menus'] = wp_create_nonce( 'customize-menus' ); - return $nonces; - } - - /** - * Ajax handler for loading available menu items. - * - * @since 4.3.0 - * @access public - */ - public function ajax_load_available_items() { - check_ajax_referer( 'customize-menus', 'customize-menus-nonce' ); - - if ( ! current_user_can( 'edit_theme_options' ) ) { - wp_die( -1 ); - } - - $all_items = array(); - $item_types = array(); - if ( isset( $_POST['item_types'] ) && is_array( $_POST['item_types'] ) ) { - $item_types = wp_unslash( $_POST['item_types'] ); - } elseif ( isset( $_POST['type'] ) && isset( $_POST['object'] ) ) { // Back compat. - $item_types[] = array( - 'type' => wp_unslash( $_POST['type'] ), - 'object' => wp_unslash( $_POST['object'] ), - 'page' => empty( $_POST['page'] ) ? 0 : absint( $_POST['page'] ), - ); - } else { - wp_send_json_error( 'nav_menus_missing_type_or_object_parameter' ); - } - - foreach ( $item_types as $item_type ) { - if ( empty( $item_type['type'] ) || empty( $item_type['object'] ) ) { - wp_send_json_error( 'nav_menus_missing_type_or_object_parameter' ); - } - $type = sanitize_key( $item_type['type'] ); - $object = sanitize_key( $item_type['object'] ); - $page = empty( $item_type['page'] ) ? 0 : absint( $item_type['page'] ); - $items = $this->load_available_items_query( $type, $object, $page ); - if ( is_wp_error( $items ) ) { - wp_send_json_error( $items->get_error_code() ); - } - $all_items[ $item_type['type'] . ':' . $item_type['object'] ] = $items; - } - - wp_send_json_success( array( 'items' => $all_items ) ); - } - - /** - * Performs the post_type and taxonomy queries for loading available menu items. - * - * @since 4.3.0 - * @access public - * - * @param string $type Optional. Accepts any custom object type and has built-in support for - * 'post_type' and 'taxonomy'. Default is 'post_type'. - * @param string $object Optional. Accepts any registered taxonomy or post type name. Default is 'page'. - * @param int $page Optional. The page number used to generate the query offset. Default is '0'. - * @return WP_Error|array Returns either a WP_Error object or an array of menu items. - */ - public function load_available_items_query( $type = 'post_type', $object = 'page', $page = 0 ) { - $items = array(); - - if ( 'post_type' === $type ) { - $post_type = get_post_type_object( $object ); - if ( ! $post_type ) { - return new WP_Error( 'nav_menus_invalid_post_type' ); - } - - if ( 0 === $page && 'page' === $object ) { - // Add "Home" link. Treat as a page, but switch to custom on add. - $items[] = array( - 'id' => 'home', - 'title' => _x( 'Home', 'nav menu home label' ), - 'type' => 'custom', - 'type_label' => __( 'Custom Link' ), - 'object' => '', - 'url' => home_url(), - ); - } elseif ( 'post' !== $object && 0 === $page && $post_type->has_archive ) { - // Add a post type archive link. - $items[] = array( - 'id' => $object . '-archive', - 'title' => $post_type->labels->archives, - 'type' => 'post_type_archive', - 'type_label' => __( 'Post Type Archive' ), - 'object' => $object, - 'url' => get_post_type_archive_link( $object ), - ); - } - - // Prepend posts with nav_menus_created_posts on first page. - $posts = array(); - if ( 0 === $page && $this->manager->get_setting( 'nav_menus_created_posts' ) ) { - foreach ( $this->manager->get_setting( 'nav_menus_created_posts' )->value() as $post_id ) { - $auto_draft_post = get_post( $post_id ); - if ( $post_type->name === $auto_draft_post->post_type ) { - $posts[] = $auto_draft_post; - } - } - } - - $posts = array_merge( $posts, get_posts( array( - 'numberposts' => 10, - 'offset' => 10 * $page, - 'orderby' => 'date', - 'order' => 'DESC', - 'post_type' => $object, - ) ) ); - - foreach ( $posts as $post ) { - $post_title = $post->post_title; - if ( '' === $post_title ) { - /* translators: %d: ID of a post */ - $post_title = sprintf( __( '#%d (no title)' ), $post->ID ); - } - $items[] = array( - 'id' => "post-{$post->ID}", - 'title' => html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ), - 'type' => 'post_type', - 'type_label' => get_post_type_object( $post->post_type )->labels->singular_name, - 'object' => $post->post_type, - 'object_id' => intval( $post->ID ), - 'url' => get_permalink( intval( $post->ID ) ), - ); - } - } elseif ( 'taxonomy' === $type ) { - $terms = get_terms( $object, array( - 'child_of' => 0, - 'exclude' => '', - 'hide_empty' => false, - 'hierarchical' => 1, - 'include' => '', - 'number' => 10, - 'offset' => 10 * $page, - 'order' => 'DESC', - 'orderby' => 'count', - 'pad_counts' => false, - ) ); - if ( is_wp_error( $terms ) ) { - return $terms; - } - - foreach ( $terms as $term ) { - $items[] = array( - 'id' => "term-{$term->term_id}", - 'title' => html_entity_decode( $term->name, ENT_QUOTES, get_bloginfo( 'charset' ) ), - 'type' => 'taxonomy', - 'type_label' => get_taxonomy( $term->taxonomy )->labels->singular_name, - 'object' => $term->taxonomy, - 'object_id' => intval( $term->term_id ), - 'url' => get_term_link( intval( $term->term_id ), $term->taxonomy ), - ); - } - } - - /** - * Filters the available menu items. - * - * @since 4.3.0 - * - * @param array $items The array of menu items. - * @param string $type The object type. - * @param string $object The object name. - * @param int $page The current page number. - */ - $items = apply_filters( 'customize_nav_menu_available_items', $items, $type, $object, $page ); - - return $items; - } - - /** - * Ajax handler for searching available menu items. - * - * @since 4.3.0 - * @access public - */ - public function ajax_search_available_items() { - check_ajax_referer( 'customize-menus', 'customize-menus-nonce' ); - - if ( ! current_user_can( 'edit_theme_options' ) ) { - wp_die( -1 ); - } - - if ( empty( $_POST['search'] ) ) { - wp_send_json_error( 'nav_menus_missing_search_parameter' ); - } - - $p = isset( $_POST['page'] ) ? absint( $_POST['page'] ) : 0; - if ( $p < 1 ) { - $p = 1; - } - - $s = sanitize_text_field( wp_unslash( $_POST['search'] ) ); - $items = $this->search_available_items_query( array( 'pagenum' => $p, 's' => $s ) ); - - if ( empty( $items ) ) { - wp_send_json_error( array( 'message' => __( 'No results found.' ) ) ); - } else { - wp_send_json_success( array( 'items' => $items ) ); - } - } - - /** - * Performs post queries for available-item searching. - * - * Based on WP_Editor::wp_link_query(). - * - * @since 4.3.0 - * @access public - * - * @param array $args Optional. Accepts 'pagenum' and 's' (search) arguments. - * @return array Menu items. - */ - public function search_available_items_query( $args = array() ) { - $items = array(); - - $post_type_objects = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' ); - $query = array( - 'post_type' => array_keys( $post_type_objects ), - 'suppress_filters' => true, - 'update_post_term_cache' => false, - 'update_post_meta_cache' => false, - 'post_status' => 'publish', - 'posts_per_page' => 20, - ); - - $args['pagenum'] = isset( $args['pagenum'] ) ? absint( $args['pagenum'] ) : 1; - $query['offset'] = $args['pagenum'] > 1 ? $query['posts_per_page'] * ( $args['pagenum'] - 1 ) : 0; - - if ( isset( $args['s'] ) ) { - $query['s'] = $args['s']; - } - - $posts = array(); - - // Prepend list of posts with nav_menus_created_posts search results on first page. - $nav_menus_created_posts_setting = $this->manager->get_setting( 'nav_menus_created_posts' ); - if ( 1 === $args['pagenum'] && $nav_menus_created_posts_setting && count( $nav_menus_created_posts_setting ) > 0 ) { - $stub_post_query = new WP_Query( array_merge( - $query, - array( - 'post_status' => 'auto-draft', - 'post__in' => $nav_menus_created_posts_setting->value(), - 'posts_per_page' => -1, - ) - ) ); - $posts = array_merge( $posts, $stub_post_query->posts ); - } - - // Query posts. - $get_posts = new WP_Query( $query ); - $posts = array_merge( $posts, $get_posts->posts ); - - // Create items for posts. - foreach ( $posts as $post ) { - $post_title = $post->post_title; - if ( '' === $post_title ) { - /* translators: %d: ID of a post */ - $post_title = sprintf( __( '#%d (no title)' ), $post->ID ); - } - $items[] = array( - 'id' => 'post-' . $post->ID, - 'title' => html_entity_decode( $post_title, ENT_QUOTES, get_bloginfo( 'charset' ) ), - 'type' => 'post_type', - 'type_label' => $post_type_objects[ $post->post_type ]->labels->singular_name, - 'object' => $post->post_type, - 'object_id' => intval( $post->ID ), - 'url' => get_permalink( intval( $post->ID ) ), - ); - } - - // Query taxonomy terms. - $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'names' ); - $terms = get_terms( $taxonomies, array( - 'name__like' => $args['s'], - 'number' => 20, - 'offset' => 20 * ($args['pagenum'] - 1), - ) ); - - // Check if any taxonomies were found. - if ( ! empty( $terms ) ) { - foreach ( $terms as $term ) { - $items[] = array( - 'id' => 'term-' . $term->term_id, - 'title' => html_entity_decode( $term->name, ENT_QUOTES, get_bloginfo( 'charset' ) ), - 'type' => 'taxonomy', - 'type_label' => get_taxonomy( $term->taxonomy )->labels->singular_name, - 'object' => $term->taxonomy, - 'object_id' => intval( $term->term_id ), - 'url' => get_term_link( intval( $term->term_id ), $term->taxonomy ), - ); - } - } - - /** - * Filters the available menu items during a search request. - * - * @since 4.5.0 - * - * @param array $items The array of menu items. - * @param array $args Includes 'pagenum' and 's' (search) arguments. - */ - $items = apply_filters( 'customize_nav_menu_searched_items', $items, $args ); - - return $items; - } - - /** - * Enqueue scripts and styles for Customizer pane. - * - * @since 4.3.0 - * @access public - */ - public function enqueue_scripts() { - wp_enqueue_style( 'customize-nav-menus' ); - wp_enqueue_script( 'customize-nav-menus' ); - - $temp_nav_menu_setting = new WP_Customize_Nav_Menu_Setting( $this->manager, 'nav_menu[-1]' ); - $temp_nav_menu_item_setting = new WP_Customize_Nav_Menu_Item_Setting( $this->manager, 'nav_menu_item[-1]' ); - - // Pass data to JS. - $settings = array( - 'allMenus' => wp_get_nav_menus(), - 'itemTypes' => $this->available_item_types(), - 'l10n' => array( - 'untitled' => _x( '(no label)', 'missing menu item navigation label' ), - 'unnamed' => _x( '(unnamed)', 'Missing menu name.' ), - 'custom_label' => __( 'Custom Link' ), - 'page_label' => get_post_type_object( 'page' )->labels->singular_name, - /* translators: %s: menu location */ - 'menuLocation' => _x( '(Currently set to: %s)', 'menu' ), - 'menuNameLabel' => __( 'Menu Name' ), - 'itemAdded' => __( 'Menu item added' ), - 'itemDeleted' => __( 'Menu item deleted' ), - 'menuAdded' => __( 'Menu created' ), - 'menuDeleted' => __( 'Menu deleted' ), - 'movedUp' => __( 'Menu item moved up' ), - 'movedDown' => __( 'Menu item moved down' ), - 'movedLeft' => __( 'Menu item moved out of submenu' ), - 'movedRight' => __( 'Menu item is now a sub-item' ), - /* translators: ▸ is the unicode right-pointing triangle, and %s is the section title in the Customizer */ - 'customizingMenus' => sprintf( __( 'Customizing ▸ %s' ), esc_html( $this->manager->get_panel( 'nav_menus' )->title ) ), - /* translators: %s: title of menu item which is invalid */ - 'invalidTitleTpl' => __( '%s (Invalid)' ), - /* translators: %s: title of menu item in draft status */ - 'pendingTitleTpl' => __( '%s (Pending)' ), - 'itemsFound' => __( 'Number of items found: %d' ), - 'itemsFoundMore' => __( 'Additional items found: %d' ), - 'itemsLoadingMore' => __( 'Loading more results... please wait.' ), - 'reorderModeOn' => __( 'Reorder mode enabled' ), - 'reorderModeOff' => __( 'Reorder mode closed' ), - 'reorderLabelOn' => esc_attr__( 'Reorder menu items' ), - 'reorderLabelOff' => esc_attr__( 'Close reorder mode' ), - ), - 'settingTransport' => 'postMessage', - 'phpIntMax' => PHP_INT_MAX, - 'defaultSettingValues' => array( - 'nav_menu' => $temp_nav_menu_setting->default, - 'nav_menu_item' => $temp_nav_menu_item_setting->default, - ), - 'locationSlugMappedToName' => get_registered_nav_menus(), - ); - - $data = sprintf( 'var _wpCustomizeNavMenusSettings = %s;', wp_json_encode( $settings ) ); - wp_scripts()->add_data( 'customize-nav-menus', 'data', $data ); - - // This is copied from nav-menus.php, and it has an unfortunate object name of `menus`. - $nav_menus_l10n = array( - 'oneThemeLocationNoMenus' => null, - 'moveUp' => __( 'Move up one' ), - 'moveDown' => __( 'Move down one' ), - 'moveToTop' => __( 'Move to the top' ), - /* translators: %s: previous item name */ - 'moveUnder' => __( 'Move under %s' ), - /* translators: %s: previous item name */ - 'moveOutFrom' => __( 'Move out from under %s' ), - /* translators: %s: previous item name */ - 'under' => __( 'Under %s' ), - /* translators: %s: previous item name */ - 'outFrom' => __( 'Out from under %s' ), - /* translators: 1: item name, 2: item position, 3: total number of items */ - 'menuFocus' => __( '%1$s. Menu item %2$d of %3$d.' ), - /* translators: 1: item name, 2: item position, 3: parent item name */ - 'subMenuFocus' => __( '%1$s. Sub item number %2$d under %3$s.' ), - ); - wp_localize_script( 'nav-menu', 'menus', $nav_menus_l10n ); - } - - /** - * Filters a dynamic setting's constructor args. - * - * For a dynamic setting to be registered, this filter must be employed - * to override the default false value with an array of args to pass to - * the WP_Customize_Setting constructor. - * - * @since 4.3.0 - * @access public - * - * @param false|array $setting_args The arguments to the WP_Customize_Setting constructor. - * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. - * @return array|false - */ - public function filter_dynamic_setting_args( $setting_args, $setting_id ) { - if ( preg_match( WP_Customize_Nav_Menu_Setting::ID_PATTERN, $setting_id ) ) { - $setting_args = array( - 'type' => WP_Customize_Nav_Menu_Setting::TYPE, - 'transport' => 'postMessage', - ); - } elseif ( preg_match( WP_Customize_Nav_Menu_Item_Setting::ID_PATTERN, $setting_id ) ) { - $setting_args = array( - 'type' => WP_Customize_Nav_Menu_Item_Setting::TYPE, - 'transport' => 'postMessage', - ); - } - return $setting_args; - } - - /** - * Allow non-statically created settings to be constructed with custom WP_Customize_Setting subclass. - * - * @since 4.3.0 - * @access public - * - * @param string $setting_class WP_Customize_Setting or a subclass. - * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. - * @param array $setting_args WP_Customize_Setting or a subclass. - * @return string - */ - public function filter_dynamic_setting_class( $setting_class, $setting_id, $setting_args ) { - unset( $setting_id ); - - if ( ! empty( $setting_args['type'] ) && WP_Customize_Nav_Menu_Setting::TYPE === $setting_args['type'] ) { - $setting_class = 'WP_Customize_Nav_Menu_Setting'; - } elseif ( ! empty( $setting_args['type'] ) && WP_Customize_Nav_Menu_Item_Setting::TYPE === $setting_args['type'] ) { - $setting_class = 'WP_Customize_Nav_Menu_Item_Setting'; - } - return $setting_class; - } - - /** - * Add the customizer settings and controls. - * - * @since 4.3.0 - * @access public - */ - public function customize_register() { - - // Preview settings for nav menus early so that the sections and controls will be added properly. - $nav_menus_setting_ids = array(); - foreach ( array_keys( $this->manager->unsanitized_post_values() ) as $setting_id ) { - if ( preg_match( '/^(nav_menu_locations|nav_menu|nav_menu_item)\[/', $setting_id ) ) { - $nav_menus_setting_ids[] = $setting_id; - } - } - $this->manager->add_dynamic_settings( $nav_menus_setting_ids ); - if ( ! $this->manager->doing_ajax( 'customize_save' ) ) { - foreach ( $nav_menus_setting_ids as $setting_id ) { - $setting = $this->manager->get_setting( $setting_id ); - if ( $setting ) { - $setting->preview(); - } - } - } - - // Require JS-rendered control types. - $this->manager->register_panel_type( 'WP_Customize_Nav_Menus_Panel' ); - $this->manager->register_control_type( 'WP_Customize_Nav_Menu_Control' ); - $this->manager->register_control_type( 'WP_Customize_Nav_Menu_Name_Control' ); - $this->manager->register_control_type( 'WP_Customize_Nav_Menu_Auto_Add_Control' ); - $this->manager->register_control_type( 'WP_Customize_Nav_Menu_Item_Control' ); - - // Create a panel for Menus. - $description = '<p>' . __( 'This panel is used for managing navigation menus for content you have already published on your site. You can create menus and add items for existing content such as pages, posts, categories, tags, formats, or custom links.' ) . '</p>'; - if ( current_theme_supports( 'widgets' ) ) { - /* translators: URL to the widgets panel of the customizer */ - $description .= '<p>' . sprintf( __( 'Menus can be displayed in locations defined by your theme or in <a href="%s">widget areas</a> by adding a “Custom Menu” widget.' ), "javascript:wp.customize.panel( 'widgets' ).focus();" ) . '</p>'; - } else { - $description .= '<p>' . __( 'Menus can be displayed in locations defined by your theme.' ) . '</p>'; - } - $this->manager->add_panel( new WP_Customize_Nav_Menus_Panel( $this->manager, 'nav_menus', array( - 'title' => __( 'Menus' ), - 'description' => $description, - 'priority' => 100, - // 'theme_supports' => 'menus|widgets', @todo allow multiple theme supports - ) ) ); - $menus = wp_get_nav_menus(); - - // Menu locations. - $locations = get_registered_nav_menus(); - $num_locations = count( array_keys( $locations ) ); - if ( 1 == $num_locations ) { - $description = '<p>' . __( 'Your theme supports one menu. Select which menu you would like to use.' ) . '</p>'; - } else { - /* translators: %s: number of menu locations */ - $description = '<p>' . sprintf( _n( 'Your theme supports %s menu. Select which menu appears in each location.', 'Your theme supports %s menus. Select which menu appears in each location.', $num_locations ), number_format_i18n( $num_locations ) ) . '</p>'; - } - if ( current_theme_supports( 'widgets' ) ) { - /* translators: URL to the widgets panel of the customizer */ - $description .= '<p>' . sprintf( __( 'You can also place menus in <a href="%s">widget areas</a> with the “Custom Menu” widget.' ), "javascript:wp.customize.panel( 'widgets' ).focus();" ) . '</p>'; - } - - $this->manager->add_section( 'menu_locations', array( - 'title' => __( 'Menu Locations' ), - 'panel' => 'nav_menus', - 'priority' => 5, - 'description' => $description, - ) ); - - $choices = array( '0' => __( '— Select —' ) ); - foreach ( $menus as $menu ) { - $choices[ $menu->term_id ] = wp_html_excerpt( $menu->name, 40, '…' ); - } - - foreach ( $locations as $location => $description ) { - $setting_id = "nav_menu_locations[{$location}]"; - - $setting = $this->manager->get_setting( $setting_id ); - if ( $setting ) { - $setting->transport = 'postMessage'; - remove_filter( "customize_sanitize_{$setting_id}", 'absint' ); - add_filter( "customize_sanitize_{$setting_id}", array( $this, 'intval_base10' ) ); - } else { - $this->manager->add_setting( $setting_id, array( - 'sanitize_callback' => array( $this, 'intval_base10' ), - 'theme_supports' => 'menus', - 'type' => 'theme_mod', - 'transport' => 'postMessage', - 'default' => 0, - ) ); - } - - $this->manager->add_control( new WP_Customize_Nav_Menu_Location_Control( $this->manager, $setting_id, array( - 'label' => $description, - 'location_id' => $location, - 'section' => 'menu_locations', - 'choices' => $choices, - ) ) ); - } - - // Register each menu as a Customizer section, and add each menu item to each menu. - foreach ( $menus as $menu ) { - $menu_id = $menu->term_id; - - // Create a section for each menu. - $section_id = 'nav_menu[' . $menu_id . ']'; - $this->manager->add_section( new WP_Customize_Nav_Menu_Section( $this->manager, $section_id, array( - 'title' => html_entity_decode( $menu->name, ENT_QUOTES, get_bloginfo( 'charset' ) ), - 'priority' => 10, - 'panel' => 'nav_menus', - ) ) ); - - $nav_menu_setting_id = 'nav_menu[' . $menu_id . ']'; - $this->manager->add_setting( new WP_Customize_Nav_Menu_Setting( $this->manager, $nav_menu_setting_id, array( - 'transport' => 'postMessage', - ) ) ); - - // Add the menu contents. - $menu_items = (array) wp_get_nav_menu_items( $menu_id ); - - foreach ( array_values( $menu_items ) as $i => $item ) { - - // Create a setting for each menu item (which doesn't actually manage data, currently). - $menu_item_setting_id = 'nav_menu_item[' . $item->ID . ']'; - - $value = (array) $item; - if ( empty( $value['post_title'] ) ) { - $value['title'] = ''; - } - - $value['nav_menu_term_id'] = $menu_id; - $this->manager->add_setting( new WP_Customize_Nav_Menu_Item_Setting( $this->manager, $menu_item_setting_id, array( - 'value' => $value, - 'transport' => 'postMessage', - ) ) ); - - // Create a control for each menu item. - $this->manager->add_control( new WP_Customize_Nav_Menu_Item_Control( $this->manager, $menu_item_setting_id, array( - 'label' => $item->title, - 'section' => $section_id, - 'priority' => 10 + $i, - ) ) ); - } - - // Note: other controls inside of this section get added dynamically in JS via the MenuSection.ready() function. - } - - // Add the add-new-menu section and controls. - $this->manager->add_section( new WP_Customize_New_Menu_Section( $this->manager, 'add_menu', array( - 'title' => __( 'Add a Menu' ), - 'panel' => 'nav_menus', - 'priority' => 999, - ) ) ); - - $this->manager->add_control( 'new_menu_name', array( - 'label' => '', - 'section' => 'add_menu', - 'type' => 'text', - 'settings' => array(), - 'input_attrs' => array( - 'class' => 'menu-name-field', - 'placeholder' => __( 'New menu name' ), - ), - ) ); - - $this->manager->add_control( new WP_Customize_New_Menu_Control( $this->manager, 'create_new_menu', array( - 'section' => 'add_menu', - 'settings' => array(), - ) ) ); - - $this->manager->add_setting( new WP_Customize_Filter_Setting( $this->manager, 'nav_menus_created_posts', array( - 'transport' => 'postMessage', - 'type' => 'option', // To prevent theme prefix in changeset. - 'default' => array(), - 'sanitize_callback' => array( $this, 'sanitize_nav_menus_created_posts' ), - ) ) ); - } - - /** - * Get the base10 intval. - * - * This is used as a setting's sanitize_callback; we can't use just plain - * intval because the second argument is not what intval() expects. - * - * @since 4.3.0 - * @access public - * - * @param mixed $value Number to convert. - * @return int Integer. - */ - public function intval_base10( $value ) { - return intval( $value, 10 ); - } - - /** - * Return an array of all the available item types. - * - * @since 4.3.0 - * @since 4.7.0 Each array item now includes a `$type_label` in in addition to `$title`, `$type`, and `$object`. - * @access public - * - * @return array The available menu item types. - */ - public function available_item_types() { - $item_types = array(); - - $post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' ); - if ( $post_types ) { - foreach ( $post_types as $slug => $post_type ) { - $item_types[] = array( - 'title' => $post_type->labels->name, - 'type_label' => $post_type->labels->singular_name, - 'type' => 'post_type', - 'object' => $post_type->name, - ); - } - } - - $taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'objects' ); - if ( $taxonomies ) { - foreach ( $taxonomies as $slug => $taxonomy ) { - if ( 'post_format' === $taxonomy && ! current_theme_supports( 'post-formats' ) ) { - continue; - } - $item_types[] = array( - 'title' => $taxonomy->labels->name, - 'type_label' => $taxonomy->labels->singular_name, - 'type' => 'taxonomy', - 'object' => $taxonomy->name, - ); - } - } - - /** - * Filters the available menu item types. - * - * @since 4.3.0 - * @since 4.7.0 Each array item now includes a `$type_label` in in addition to `$title`, `$type`, and `$object`. - * - * @param array $item_types Custom menu item types. - */ - $item_types = apply_filters( 'customize_nav_menu_available_item_types', $item_types ); - - return $item_types; - } - - /** - * Add a new `auto-draft` post. - * - * @access public - * @since 4.7.0 - * - * @param array $postarr { - * Post array. Note that post_status is overridden to be `auto-draft`. - * - * @var string $post_title Post title. Required. - * @var string $post_type Post type. Required. - * @var string $post_name Post name. - * @var string $post_content Post content. - * } - * @return WP_Post|WP_Error Inserted auto-draft post object or error. - */ - public function insert_auto_draft_post( $postarr ) { - if ( ! isset( $postarr['post_type'] ) ) { - return new WP_Error( 'unknown_post_type', __( 'Unknown post type' ) ); - } - if ( empty( $postarr['post_title'] ) ) { - return new WP_Error( 'empty_title', __( 'Empty title' ) ); - } - if ( ! empty( $postarr['post_status'] ) ) { - return new WP_Error( 'status_forbidden', __( 'Status is forbidden' ) ); - } - - $postarr['post_status'] = 'auto-draft'; - - // Auto-drafts are allowed to have empty post_names, so it has to be explicitly set. - if ( empty( $postarr['post_name'] ) ) { - $postarr['post_name'] = sanitize_title( $postarr['post_title'] ); - } - if ( ! isset( $postarr['meta_input'] ) ) { - $postarr['meta_input'] = array(); - } - $postarr['meta_input']['_customize_draft_post_name'] = $postarr['post_name']; - unset( $postarr['post_name'] ); - - add_filter( 'wp_insert_post_empty_content', '__return_false', 1000 ); - $r = wp_insert_post( wp_slash( $postarr ), true ); - remove_filter( 'wp_insert_post_empty_content', '__return_false', 1000 ); - - if ( is_wp_error( $r ) ) { - return $r; - } else { - return get_post( $r ); - } - } - - /** - * Ajax handler for adding a new auto-draft post. - * - * @access public - * @since 4.7.0 - */ - public function ajax_insert_auto_draft_post() { - if ( ! check_ajax_referer( 'customize-menus', 'customize-menus-nonce', false ) ) { - wp_send_json_error( 'bad_nonce', 400 ); - } - - if ( ! current_user_can( 'customize' ) ) { - wp_send_json_error( 'customize_not_allowed', 403 ); - } - - if ( empty( $_POST['params'] ) || ! is_array( $_POST['params'] ) ) { - wp_send_json_error( 'missing_params', 400 ); - } - - $params = wp_unslash( $_POST['params'] ); - $illegal_params = array_diff( array_keys( $params ), array( 'post_type', 'post_title' ) ); - if ( ! empty( $illegal_params ) ) { - wp_send_json_error( 'illegal_params', 400 ); - } - - $params = array_merge( - array( - 'post_type' => '', - 'post_title' => '', - ), - $params - ); - - if ( empty( $params['post_type'] ) || ! post_type_exists( $params['post_type'] ) ) { - status_header( 400 ); - wp_send_json_error( 'missing_post_type_param' ); - } - - $post_type_object = get_post_type_object( $params['post_type'] ); - if ( ! current_user_can( $post_type_object->cap->create_posts ) || ! current_user_can( $post_type_object->cap->publish_posts ) ) { - status_header( 403 ); - wp_send_json_error( 'insufficient_post_permissions' ); - } - - $params['post_title'] = trim( $params['post_title'] ); - if ( '' === $params['post_title'] ) { - status_header( 400 ); - wp_send_json_error( 'missing_post_title' ); - } - - $r = $this->insert_auto_draft_post( $params ); - if ( is_wp_error( $r ) ) { - $error = $r; - if ( ! empty( $post_type_object->labels->singular_name ) ) { - $singular_name = $post_type_object->labels->singular_name; - } else { - $singular_name = __( 'Post' ); - } - - $data = array( - /* translators: %1$s is the post type name and %2$s is the error message. */ - 'message' => sprintf( __( '%1$s could not be created: %2$s' ), $singular_name, $error->get_error_message() ), - ); - wp_send_json_error( $data ); - } else { - $post = $r; - $data = array( - 'post_id' => $post->ID, - 'url' => get_permalink( $post->ID ), - ); - wp_send_json_success( $data ); - } - } - - /** - * Print the JavaScript templates used to render Menu Customizer components. - * - * Templates are imported into the JS use wp.template. - * - * @since 4.3.0 - * @access public - */ - public function print_templates() { - ?> - <script type="text/html" id="tmpl-available-menu-item"> - <li id="menu-item-tpl-{{ data.id }}" class="menu-item-tpl" data-menu-item-id="{{ data.id }}"> - <div class="menu-item-bar"> - <div class="menu-item-handle"> - <span class="item-type" aria-hidden="true">{{ data.type_label }}</span> - <span class="item-title" aria-hidden="true"> - <span class="menu-item-title<# if ( ! data.title ) { #> no-title<# } #>">{{ data.title || wp.customize.Menus.data.l10n.untitled }}</span> - </span> - <button type="button" class="button-link item-add"> - <span class="screen-reader-text"><?php - /* translators: 1: Title of a menu item, 2: Type of a menu item */ - printf( __( 'Add to menu: %1$s (%2$s)' ), '{{ data.title || wp.customize.Menus.data.l10n.untitled }}', '{{ data.type_label }}' ); - ?></span> - </button> - </div> - </div> - </li> - </script> - - <script type="text/html" id="tmpl-menu-item-reorder-nav"> - <div class="menu-item-reorder-nav"> - <?php - printf( - '<button type="button" class="menus-move-up">%1$s</button><button type="button" class="menus-move-down">%2$s</button><button type="button" class="menus-move-left">%3$s</button><button type="button" class="menus-move-right">%4$s</button>', - __( 'Move up' ), - __( 'Move down' ), - __( 'Move one level up' ), - __( 'Move one level down' ) - ); - ?> - </div> - </script> - <?php - } - - /** - * Print the html template used to render the add-menu-item frame. - * - * @since 4.3.0 - * @access public - */ - public function available_items_template() { - ?> - <div id="available-menu-items" class="accordion-container"> - <div class="customize-section-title"> - <button type="button" class="customize-section-back" tabindex="-1"> - <span class="screen-reader-text"><?php _e( 'Back' ); ?></span> - </button> - <h3> - <span class="customize-action"> - <?php - /* translators: ▸ is the unicode right-pointing triangle, and %s is the section title in the Customizer */ - printf( __( 'Customizing ▸ %s' ), esc_html( $this->manager->get_panel( 'nav_menus' )->title ) ); - ?> - </span> - <?php _e( 'Add Menu Items' ); ?> - </h3> - </div> - <div id="available-menu-items-search" class="accordion-section cannot-expand"> - <div class="accordion-section-title"> - <label class="screen-reader-text" for="menu-items-search"><?php _e( 'Search Menu Items' ); ?></label> - <input type="text" id="menu-items-search" placeholder="<?php esc_attr_e( 'Search menu items…' ) ?>" aria-describedby="menu-items-search-desc" /> - <p class="screen-reader-text" id="menu-items-search-desc"><?php _e( 'The search results will be updated as you type.' ); ?></p> - <span class="spinner"></span> - </div> - <div class="search-icon" aria-hidden="true"></div> - <button type="button" class="clear-results"><span class="screen-reader-text"><?php _e( 'Clear Results' ); ?></span></button> - <ul class="accordion-section-content available-menu-items-list" data-type="search"></ul> - </div> - <?php - - // Ensure the page post type comes first in the list. - $item_types = $this->available_item_types(); - $page_item_type = null; - foreach ( $item_types as $i => $item_type ) { - if ( isset( $item_type['object'] ) && 'page' === $item_type['object'] ) { - $page_item_type = $item_type; - unset( $item_types[ $i ] ); - } - } - - $this->print_custom_links_available_menu_item(); - if ( $page_item_type ) { - $this->print_post_type_container( $page_item_type ); - } - // Containers for per-post-type item browsing; items are added with JS. - foreach ( $item_types as $item_type ) { - $this->print_post_type_container( $item_type ); - } - ?> - </div><!-- #available-menu-items --> - <?php - } - - /** - * Print the markup for new menu items. - * - * To be used in the template #available-menu-items. - * - * @since 4.7.0 - * @access private - * - * @param array $available_item_type Menu item data to output, including title, type, and label. - * @return void - */ - protected function print_post_type_container( $available_item_type ) { - $id = sprintf( 'available-menu-items-%s-%s', $available_item_type['type'], $available_item_type['object'] ); - ?> - <div id="<?php echo esc_attr( $id ); ?>" class="accordion-section"> - <h4 class="accordion-section-title" role="presentation"> - <?php echo esc_html( $available_item_type['title'] ); ?> - <span class="spinner"></span> - <span class="no-items"><?php _e( 'No items' ); ?></span> - <button type="button" class="button-link" aria-expanded="false"> - <span class="screen-reader-text"><?php - /* translators: %s: Title of a section with menu items */ - printf( __( 'Toggle section: %s' ), esc_html( $available_item_type['title'] ) ); ?></span> - <span class="toggle-indicator" aria-hidden="true"></span> - </button> - </h4> - <div class="accordion-section-content"> - <?php if ( 'post_type' === $available_item_type['type'] ) : ?> - <?php $post_type_obj = get_post_type_object( $available_item_type['object'] ); ?> - <?php if ( current_user_can( $post_type_obj->cap->create_posts ) && current_user_can( $post_type_obj->cap->publish_posts ) ) : ?> - <div class="new-content-item"> - <input type="text" class="create-item-input" placeholder="<?php echo esc_attr( $post_type_obj->labels->add_new_item ); ?>"> - <button type="button" class="button add-content"><?php _e( 'Add' ); ?></button> - </div> - <?php endif; ?> - <?php endif; ?> - <ul class="available-menu-items-list" data-type="<?php echo esc_attr( $available_item_type['type'] ); ?>" data-object="<?php echo esc_attr( $available_item_type['object'] ); ?>" data-type_label="<?php echo esc_attr( isset( $available_item_type['type_label'] ) ? $available_item_type['type_label'] : $available_item_type['type'] ); ?>"></ul> - </div> - </div> - <?php - } - - /** - * Print the markup for available menu item custom links. - * - * @since 4.7.0 - * @access private - * - * @return void - */ - protected function print_custom_links_available_menu_item() { - ?> - <div id="new-custom-menu-item" class="accordion-section"> - <h4 class="accordion-section-title" role="presentation"> - <?php _e( 'Custom Links' ); ?> - <button type="button" class="button-link" aria-expanded="false"> - <span class="screen-reader-text"><?php _e( 'Toggle section: Custom Links' ); ?></span> - <span class="toggle-indicator" aria-hidden="true"></span> - </button> - </h4> - <div class="accordion-section-content customlinkdiv"> - <input type="hidden" value="custom" id="custom-menu-item-type" name="menu-item[-1][menu-item-type]" /> - <p id="menu-item-url-wrap" class="wp-clearfix"> - <label class="howto" for="custom-menu-item-url"><?php _e( 'URL' ); ?></label> - <input id="custom-menu-item-url" name="menu-item[-1][menu-item-url]" type="text" class="code menu-item-textbox" value="http://"> - </p> - <p id="menu-item-name-wrap" class="wp-clearfix"> - <label class="howto" for="custom-menu-item-name"><?php _e( 'Link Text' ); ?></label> - <input id="custom-menu-item-name" name="menu-item[-1][menu-item-title]" type="text" class="regular-text menu-item-textbox"> - </p> - <p class="button-controls"> - <span class="add-to-menu"> - <input type="submit" class="button submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>" name="add-custom-menu-item" id="custom-menu-item-submit"> - <span class="spinner"></span> - </span> - </p> - </div> - </div> - <?php - } - - // - // Start functionality specific to partial-refresh of menu changes in Customizer preview. - // - - /** - * Nav menu args used for each instance, keyed by the args HMAC. - * - * @since 4.3.0 - * @access public - * @var array - */ - public $preview_nav_menu_instance_args = array(); - - /** - * Filters arguments for dynamic nav_menu selective refresh partials. - * - * @since 4.5.0 - * @access public - * - * @param array|false $partial_args Partial args. - * @param string $partial_id Partial ID. - * @return array Partial args. - */ - public function customize_dynamic_partial_args( $partial_args, $partial_id ) { - - if ( preg_match( '/^nav_menu_instance\[[0-9a-f]{32}\]$/', $partial_id ) ) { - if ( false === $partial_args ) { - $partial_args = array(); - } - $partial_args = array_merge( - $partial_args, - array( - 'type' => 'nav_menu_instance', - 'render_callback' => array( $this, 'render_nav_menu_partial' ), - 'container_inclusive' => true, - 'settings' => array(), // Empty because the nav menu instance may relate to a menu or a location. - 'capability' => 'edit_theme_options', - ) - ); - } - - return $partial_args; - } - - /** - * Add hooks for the Customizer preview. - * - * @since 4.3.0 - * @access public - */ - public function customize_preview_init() { - add_action( 'wp_enqueue_scripts', array( $this, 'customize_preview_enqueue_deps' ) ); - add_filter( 'wp_nav_menu_args', array( $this, 'filter_wp_nav_menu_args' ), 1000 ); - add_filter( 'wp_nav_menu', array( $this, 'filter_wp_nav_menu' ), 10, 2 ); - add_filter( 'wp_footer', array( $this, 'export_preview_data' ), 1 ); - add_filter( 'customize_render_partials_response', array( $this, 'export_partial_rendered_nav_menu_instances' ) ); - } - - /** - * Make the auto-draft status protected so that it can be queried. - * - * @since 4.7.0 - * @access public - */ - public function make_auto_draft_status_previewable() { - global $wp_post_statuses; - $wp_post_statuses['auto-draft']->protected = true; - } - - /** - * Sanitize post IDs for auto-draft posts created for nav menu items to be published. - * - * @since 4.7.0 - * @access public - * - * @param array $value Post IDs. - * @returns array Post IDs. - */ - public function sanitize_nav_menus_created_posts( $value ) { - $post_ids = array(); - foreach ( wp_parse_id_list( $value ) as $post_id ) { - if ( empty( $post_id ) ) { - continue; - } - $post = get_post( $post_id ); - if ( 'auto-draft' !== $post->post_status ) { - continue; - } - $post_type_obj = get_post_type_object( $post->post_type ); - if ( ! $post_type_obj ) { - continue; - } - if ( ! current_user_can( $post_type_obj->cap->publish_posts ) || ! current_user_can( $post_type_obj->cap->edit_post, $post_id ) ) { - continue; - } - $post_ids[] = $post->ID; - } - return $post_ids; - } - - /** - * Publish the auto-draft posts that were created for nav menu items. - * - * The post IDs will have been sanitized by already by - * `WP_Customize_Nav_Menu_Items::sanitize_nav_menus_created_posts()` to - * remove any post IDs for which the user cannot publish or for which the - * post is not an auto-draft. - * - * @since 4.7.0 - * @access public - * - * @param WP_Customize_Setting $setting Customizer setting object. - */ - public function save_nav_menus_created_posts( $setting ) { - $post_ids = $setting->post_value(); - if ( ! empty( $post_ids ) ) { - foreach ( $post_ids as $post_id ) { - $target_status = 'attachment' === get_post_type( $post_id ) ? 'inherit' : 'publish'; - $args = array( - 'ID' => $post_id, - 'post_status' => $target_status, - ); - $post_name = get_post_meta( $post_id, '_customize_draft_post_name', true ); - if ( $post_name ) { - $args['post_name'] = $post_name; - } - - // Note that wp_publish_post() cannot be used because unique slugs need to be assigned. - wp_update_post( wp_slash( $args ) ); - - delete_post_meta( $post_id, '_customize_draft_post_name' ); - } - } - } - - /** - * Keep track of the arguments that are being passed to wp_nav_menu(). - * - * @since 4.3.0 - * @access public - * @see wp_nav_menu() - * @see WP_Customize_Widgets_Partial_Refresh::filter_dynamic_sidebar_params() - * - * @param array $args An array containing wp_nav_menu() arguments. - * @return array Arguments. - */ - public function filter_wp_nav_menu_args( $args ) { - /* - * The following conditions determine whether or not this instance of - * wp_nav_menu() can use selective refreshed. A wp_nav_menu() can be - * selective refreshed if... - */ - $can_partial_refresh = ( - // ...if wp_nav_menu() is directly echoing out the menu (and thus isn't manipulating the string after generated), - ! empty( $args['echo'] ) - && - // ...and if the fallback_cb can be serialized to JSON, since it will be included in the placement context data, - ( empty( $args['fallback_cb'] ) || is_string( $args['fallback_cb'] ) ) - && - // ...and if the walker can also be serialized to JSON, since it will be included in the placement context data as well, - ( empty( $args['walker'] ) || is_string( $args['walker'] ) ) - // ...and if it has a theme location assigned or an assigned menu to display, - && ( - ! empty( $args['theme_location'] ) - || - ( ! empty( $args['menu'] ) && ( is_numeric( $args['menu'] ) || is_object( $args['menu'] ) ) ) - ) - && - // ...and if the nav menu would be rendered with a wrapper container element (upon which to attach data-* attributes). - ( - ! empty( $args['container'] ) - || - ( isset( $args['items_wrap'] ) && '<' === substr( $args['items_wrap'], 0, 1 ) ) - ) - ); - $args['can_partial_refresh'] = $can_partial_refresh; - - $exported_args = $args; - - // Empty out args which may not be JSON-serializable. - if ( ! $can_partial_refresh ) { - $exported_args['fallback_cb'] = ''; - $exported_args['walker'] = ''; - } - - /* - * Replace object menu arg with a term_id menu arg, as this exports better - * to JS and is easier to compare hashes. - */ - if ( ! empty( $exported_args['menu'] ) && is_object( $exported_args['menu'] ) ) { - $exported_args['menu'] = $exported_args['menu']->term_id; - } - - ksort( $exported_args ); - $exported_args['args_hmac'] = $this->hash_nav_menu_args( $exported_args ); - - $args['customize_preview_nav_menus_args'] = $exported_args; - $this->preview_nav_menu_instance_args[ $exported_args['args_hmac'] ] = $exported_args; - return $args; - } - - /** - * Prepares wp_nav_menu() calls for partial refresh. - * - * Injects attributes into container element. - * - * @since 4.3.0 - * @access public - * - * @see wp_nav_menu() - * - * @param string $nav_menu_content The HTML content for the navigation menu. - * @param object $args An object containing wp_nav_menu() arguments. - * @return null - */ - public function filter_wp_nav_menu( $nav_menu_content, $args ) { - if ( isset( $args->customize_preview_nav_menus_args['can_partial_refresh'] ) && $args->customize_preview_nav_menus_args['can_partial_refresh'] ) { - $attributes = sprintf( ' data-customize-partial-id="%s"', esc_attr( 'nav_menu_instance[' . $args->customize_preview_nav_menus_args['args_hmac'] . ']' ) ); - $attributes .= ' data-customize-partial-type="nav_menu_instance"'; - $attributes .= sprintf( ' data-customize-partial-placement-context="%s"', esc_attr( wp_json_encode( $args->customize_preview_nav_menus_args ) ) ); - $nav_menu_content = preg_replace( '#^(<\w+)#', '$1 ' . $attributes, $nav_menu_content, 1 ); - } - return $nav_menu_content; - } - - /** - * Hashes (hmac) the nav menu arguments to ensure they are not tampered with when - * submitted in the Ajax request. - * - * Note that the array is expected to be pre-sorted. - * - * @since 4.3.0 - * @access public - * - * @param array $args The arguments to hash. - * @return string Hashed nav menu arguments. - */ - public function hash_nav_menu_args( $args ) { - return wp_hash( serialize( $args ) ); - } - - /** - * Enqueue scripts for the Customizer preview. - * - * @since 4.3.0 - * @access public - */ - public function customize_preview_enqueue_deps() { - wp_enqueue_script( 'customize-preview-nav-menus' ); // Note that we have overridden this. - } - - /** - * Exports data from PHP to JS. - * - * @since 4.3.0 - * @access public - */ - public function export_preview_data() { - - // Why not wp_localize_script? Because we're not localizing, and it forces values into strings. - $exports = array( - 'navMenuInstanceArgs' => $this->preview_nav_menu_instance_args, - ); - printf( '<script>var _wpCustomizePreviewNavMenusExports = %s;</script>', wp_json_encode( $exports ) ); - } - - /** - * Export any wp_nav_menu() calls during the rendering of any partials. - * - * @since 4.5.0 - * @access public - * - * @param array $response Response. - * @return array Response. - */ - public function export_partial_rendered_nav_menu_instances( $response ) { - $response['nav_menu_instance_args'] = $this->preview_nav_menu_instance_args; - return $response; - } - - /** - * Render a specific menu via wp_nav_menu() using the supplied arguments. - * - * @since 4.3.0 - * @access public - * - * @see wp_nav_menu() - * - * @param WP_Customize_Partial $partial Partial. - * @param array $nav_menu_args Nav menu args supplied as container context. - * @return string|false - */ - public function render_nav_menu_partial( $partial, $nav_menu_args ) { - unset( $partial ); - - if ( ! isset( $nav_menu_args['args_hmac'] ) ) { - // Error: missing_args_hmac. - return false; - } - - $nav_menu_args_hmac = $nav_menu_args['args_hmac']; - unset( $nav_menu_args['args_hmac'] ); - - ksort( $nav_menu_args ); - if ( ! hash_equals( $this->hash_nav_menu_args( $nav_menu_args ), $nav_menu_args_hmac ) ) { - // Error: args_hmac_mismatch. - return false; - } - - ob_start(); - wp_nav_menu( $nav_menu_args ); - $content = ob_get_clean(); - - return $content; - } -} diff --git a/wp/wp-includes/class-wp-customize-panel.php b/wp/wp-includes/class-wp-customize-panel.php deleted file mode 100644 index 87ae392e..00000000 --- a/wp/wp-includes/class-wp-customize-panel.php +++ /dev/null @@ -1,399 +0,0 @@ -<?php -/** - * WordPress Customize Panel classes - * - * @package WordPress - * @subpackage Customize - * @since 4.0.0 - */ - -/** - * Customize Panel class. - * - * A UI container for sections, managed by the WP_Customize_Manager. - * - * @since 4.0.0 - * - * @see WP_Customize_Manager - */ -class WP_Customize_Panel { - - /** - * Incremented with each new class instantiation, then stored in $instance_number. - * - * Used when sorting two instances whose priorities are equal. - * - * @since 4.1.0 - * - * @static - * @access protected - * @var int - */ - protected static $instance_count = 0; - - /** - * Order in which this instance was created in relation to other instances. - * - * @since 4.1.0 - * @access public - * @var int - */ - public $instance_number; - - /** - * WP_Customize_Manager instance. - * - * @since 4.0.0 - * @access public - * @var WP_Customize_Manager - */ - public $manager; - - /** - * Unique identifier. - * - * @since 4.0.0 - * @access public - * @var string - */ - public $id; - - /** - * Priority of the panel, defining the display order of panels and sections. - * - * @since 4.0.0 - * @access public - * @var integer - */ - public $priority = 160; - - /** - * Capability required for the panel. - * - * @since 4.0.0 - * @access public - * @var string - */ - public $capability = 'edit_theme_options'; - - /** - * Theme feature support for the panel. - * - * @since 4.0.0 - * @access public - * @var string|array - */ - public $theme_supports = ''; - - /** - * Title of the panel to show in UI. - * - * @since 4.0.0 - * @access public - * @var string - */ - public $title = ''; - - /** - * Description to show in the UI. - * - * @since 4.0.0 - * @access public - * @var string - */ - public $description = ''; - - /** - * Auto-expand a section in a panel when the panel is expanded when the panel only has the one section. - * - * @since 4.7.4 - * @access public - * @var bool - */ - public $auto_expand_sole_section = false; - - /** - * Customizer sections for this panel. - * - * @since 4.0.0 - * @access public - * @var array - */ - public $sections; - - /** - * Type of this panel. - * - * @since 4.1.0 - * @access public - * @var string - */ - public $type = 'default'; - - /** - * Active callback. - * - * @since 4.1.0 - * @access public - * - * @see WP_Customize_Section::active() - * - * @var callable Callback is called with one argument, the instance of - * WP_Customize_Section, and returns bool to indicate whether - * the section is active (such as it relates to the URL currently - * being previewed). - */ - public $active_callback = ''; - - /** - * Constructor. - * - * Any supplied $args override class property defaults. - * - * @since 4.0.0 - * - * @param WP_Customize_Manager $manager Customizer bootstrap instance. - * @param string $id An specific ID for the panel. - * @param array $args Panel arguments. - */ - public function __construct( $manager, $id, $args = array() ) { - $keys = array_keys( get_object_vars( $this ) ); - foreach ( $keys as $key ) { - if ( isset( $args[ $key ] ) ) { - $this->$key = $args[ $key ]; - } - } - - $this->manager = $manager; - $this->id = $id; - if ( empty( $this->active_callback ) ) { - $this->active_callback = array( $this, 'active_callback' ); - } - self::$instance_count += 1; - $this->instance_number = self::$instance_count; - - $this->sections = array(); // Users cannot customize the $sections array. - } - - /** - * Check whether panel is active to current Customizer preview. - * - * @since 4.1.0 - * @access public - * - * @return bool Whether the panel is active to the current preview. - */ - final public function active() { - $panel = $this; - $active = call_user_func( $this->active_callback, $this ); - - /** - * Filters response of WP_Customize_Panel::active(). - * - * @since 4.1.0 - * - * @param bool $active Whether the Customizer panel is active. - * @param WP_Customize_Panel $panel WP_Customize_Panel instance. - */ - $active = apply_filters( 'customize_panel_active', $active, $panel ); - - return $active; - } - - /** - * Default callback used when invoking WP_Customize_Panel::active(). - * - * Subclasses can override this with their specific logic, or they may - * provide an 'active_callback' argument to the constructor. - * - * @since 4.1.0 - * @access public - * - * @return bool Always true. - */ - public function active_callback() { - return true; - } - - /** - * Gather the parameters passed to client JavaScript via JSON. - * - * @since 4.1.0 - * - * @return array The array to be exported to the client as JSON. - */ - public function json() { - $array = wp_array_slice_assoc( (array) $this, array( 'id', 'description', 'priority', 'type' ) ); - $array['title'] = html_entity_decode( $this->title, ENT_QUOTES, get_bloginfo( 'charset' ) ); - $array['content'] = $this->get_content(); - $array['active'] = $this->active(); - $array['instanceNumber'] = $this->instance_number; - $array['autoExpandSoleSection'] = $this->auto_expand_sole_section; - return $array; - } - - /** - * Checks required user capabilities and whether the theme has the - * feature support required by the panel. - * - * @since 4.0.0 - * - * @return bool False if theme doesn't support the panel or the user doesn't have the capability. - */ - final public function check_capabilities() { - if ( $this->capability && ! call_user_func_array( 'current_user_can', (array) $this->capability ) ) { - return false; - } - - if ( $this->theme_supports && ! call_user_func_array( 'current_theme_supports', (array) $this->theme_supports ) ) { - return false; - } - - return true; - } - - /** - * Get the panel's content template for insertion into the Customizer pane. - * - * @since 4.1.0 - * - * @return string Content for the panel. - */ - final public function get_content() { - ob_start(); - $this->maybe_render(); - return trim( ob_get_clean() ); - } - - /** - * Check capabilities and render the panel. - * - * @since 4.0.0 - */ - final public function maybe_render() { - if ( ! $this->check_capabilities() ) { - return; - } - - /** - * Fires before rendering a Customizer panel. - * - * @since 4.0.0 - * - * @param WP_Customize_Panel $this WP_Customize_Panel instance. - */ - do_action( 'customize_render_panel', $this ); - - /** - * Fires before rendering a specific Customizer panel. - * - * The dynamic portion of the hook name, `$this->id`, refers to - * the ID of the specific Customizer panel to be rendered. - * - * @since 4.0.0 - */ - do_action( "customize_render_panel_{$this->id}" ); - - $this->render(); - } - - /** - * Render the panel container, and then its contents (via `this->render_content()`) in a subclass. - * - * Panel containers are now rendered in JS by default, see WP_Customize_Panel::print_template(). - * - * @since 4.0.0 - * @access protected - */ - protected function render() {} - - /** - * Render the panel UI in a subclass. - * - * Panel contents are now rendered in JS by default, see WP_Customize_Panel::print_template(). - * - * @since 4.1.0 - * @access protected - */ - protected function render_content() {} - - /** - * Render the panel's JS templates. - * - * This function is only run for panel types that have been registered with - * WP_Customize_Manager::register_panel_type(). - * - * @since 4.3.0 - * - * @see WP_Customize_Manager::register_panel_type() - */ - public function print_template() { - ?> - <script type="text/html" id="tmpl-customize-panel-<?php echo esc_attr( $this->type ); ?>-content"> - <?php $this->content_template(); ?> - </script> - <script type="text/html" id="tmpl-customize-panel-<?php echo esc_attr( $this->type ); ?>"> - <?php $this->render_template(); ?> - </script> - <?php - } - - /** - * An Underscore (JS) template for rendering this panel's container. - * - * Class variables for this panel class are available in the `data` JS object; - * export custom variables by overriding WP_Customize_Panel::json(). - * - * @see WP_Customize_Panel::print_template() - * - * @since 4.3.0 - * @access protected - */ - protected function render_template() { - ?> - <li id="accordion-panel-{{ data.id }}" class="accordion-section control-section control-panel control-panel-{{ data.type }}"> - <h3 class="accordion-section-title" tabindex="0"> - {{ data.title }} - <span class="screen-reader-text"><?php _e( 'Press return or enter to open this panel' ); ?></span> - </h3> - <ul class="accordion-sub-container control-panel-content"></ul> - </li> - <?php - } - - /** - * An Underscore (JS) template for this panel's content (but not its container). - * - * Class variables for this panel class are available in the `data` JS object; - * export custom variables by overriding WP_Customize_Panel::json(). - * - * @see WP_Customize_Panel::print_template() - * - * @since 4.3.0 - * @access protected - */ - protected function content_template() { - ?> - <li class="panel-meta customize-info accordion-section <# if ( ! data.description ) { #> cannot-expand<# } #>"> - <button class="customize-panel-back" tabindex="-1"><span class="screen-reader-text"><?php _e( 'Back' ); ?></span></button> - <div class="accordion-section-title"> - <span class="preview-notice"><?php - /* translators: %s: the site/panel title in the Customizer */ - echo sprintf( __( 'You are customizing %s' ), '<strong class="panel-title">{{ data.title }}</strong>' ); - ?></span> - <# if ( data.description ) { #> - <button class="customize-help-toggle dashicons dashicons-editor-help" tabindex="0" aria-expanded="false"><span class="screen-reader-text"><?php _e( 'Help' ); ?></span></button> - <# } #> - </div> - <# if ( data.description ) { #> - <div class="description customize-panel-description"> - {{{ data.description }}} - </div> - <# } #> - </li> - <?php - } -} - -/** WP_Customize_Nav_Menus_Panel class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menus-panel.php' ); diff --git a/wp/wp-includes/class-wp-customize-section.php b/wp/wp-includes/class-wp-customize-section.php deleted file mode 100644 index 68d67713..00000000 --- a/wp/wp-includes/class-wp-customize-section.php +++ /dev/null @@ -1,406 +0,0 @@ -<?php -/** - * WordPress Customize Section classes - * - * @package WordPress - * @subpackage Customize - * @since 3.4.0 - */ - -/** - * Customize Section class. - * - * A UI container for controls, managed by the WP_Customize_Manager class. - * - * @since 3.4.0 - * - * @see WP_Customize_Manager - */ -class WP_Customize_Section { - - /** - * Incremented with each new class instantiation, then stored in $instance_number. - * - * Used when sorting two instances whose priorities are equal. - * - * @since 4.1.0 - * - * @static - * @access protected - * @var int - */ - protected static $instance_count = 0; - - /** - * Order in which this instance was created in relation to other instances. - * - * @since 4.1.0 - * @access public - * @var int - */ - public $instance_number; - - /** - * WP_Customize_Manager instance. - * - * @since 3.4.0 - * @access public - * @var WP_Customize_Manager - */ - public $manager; - - /** - * Unique identifier. - * - * @since 3.4.0 - * @access public - * @var string - */ - public $id; - - /** - * Priority of the section which informs load order of sections. - * - * @since 3.4.0 - * @access public - * @var integer - */ - public $priority = 160; - - /** - * Panel in which to show the section, making it a sub-section. - * - * @since 4.0.0 - * @access public - * @var string - */ - public $panel = ''; - - /** - * Capability required for the section. - * - * @since 3.4.0 - * @access public - * @var string - */ - public $capability = 'edit_theme_options'; - - /** - * Theme feature support for the section. - * - * @since 3.4.0 - * @access public - * @var string|array - */ - public $theme_supports = ''; - - /** - * Title of the section to show in UI. - * - * @since 3.4.0 - * @access public - * @var string - */ - public $title = ''; - - /** - * Description to show in the UI. - * - * @since 3.4.0 - * @access public - * @var string - */ - public $description = ''; - - /** - * Customizer controls for this section. - * - * @since 3.4.0 - * @access public - * @var array - */ - public $controls; - - /** - * Type of this section. - * - * @since 4.1.0 - * @access public - * @var string - */ - public $type = 'default'; - - /** - * Active callback. - * - * @since 4.1.0 - * @access public - * - * @see WP_Customize_Section::active() - * - * @var callable Callback is called with one argument, the instance of - * WP_Customize_Section, and returns bool to indicate whether - * the section is active (such as it relates to the URL currently - * being previewed). - */ - public $active_callback = ''; - - /** - * Show the description or hide it behind the help icon. - * - * @since 4.7.0 - * @access public - * - * @var bool Indicates whether the Section's description should be - * hidden behind a help icon ("?") in the Section header, - * similar to how help icons are displayed on Panels. - */ - public $description_hidden = false; - - /** - * Constructor. - * - * Any supplied $args override class property defaults. - * - * @since 3.4.0 - * - * @param WP_Customize_Manager $manager Customizer bootstrap instance. - * @param string $id An specific ID of the section. - * @param array $args Section arguments. - */ - public function __construct( $manager, $id, $args = array() ) { - $keys = array_keys( get_object_vars( $this ) ); - foreach ( $keys as $key ) { - if ( isset( $args[ $key ] ) ) { - $this->$key = $args[ $key ]; - } - } - - $this->manager = $manager; - $this->id = $id; - if ( empty( $this->active_callback ) ) { - $this->active_callback = array( $this, 'active_callback' ); - } - self::$instance_count += 1; - $this->instance_number = self::$instance_count; - - $this->controls = array(); // Users cannot customize the $controls array. - } - - /** - * Check whether section is active to current Customizer preview. - * - * @since 4.1.0 - * @access public - * - * @return bool Whether the section is active to the current preview. - */ - final public function active() { - $section = $this; - $active = call_user_func( $this->active_callback, $this ); - - /** - * Filters response of WP_Customize_Section::active(). - * - * @since 4.1.0 - * - * @param bool $active Whether the Customizer section is active. - * @param WP_Customize_Section $section WP_Customize_Section instance. - */ - $active = apply_filters( 'customize_section_active', $active, $section ); - - return $active; - } - - /** - * Default callback used when invoking WP_Customize_Section::active(). - * - * Subclasses can override this with their specific logic, or they may provide - * an 'active_callback' argument to the constructor. - * - * @since 4.1.0 - * @access public - * - * @return true Always true. - */ - public function active_callback() { - return true; - } - - /** - * Gather the parameters passed to client JavaScript via JSON. - * - * @since 4.1.0 - * - * @return array The array to be exported to the client as JSON. - */ - public function json() { - $array = wp_array_slice_assoc( (array) $this, array( 'id', 'description', 'priority', 'panel', 'type', 'description_hidden' ) ); - $array['title'] = html_entity_decode( $this->title, ENT_QUOTES, get_bloginfo( 'charset' ) ); - $array['content'] = $this->get_content(); - $array['active'] = $this->active(); - $array['instanceNumber'] = $this->instance_number; - - if ( $this->panel ) { - /* translators: ▸ is the unicode right-pointing triangle, and %s is the section title in the Customizer */ - $array['customizeAction'] = sprintf( __( 'Customizing ▸ %s' ), esc_html( $this->manager->get_panel( $this->panel )->title ) ); - } else { - $array['customizeAction'] = __( 'Customizing' ); - } - - return $array; - } - - /** - * Checks required user capabilities and whether the theme has the - * feature support required by the section. - * - * @since 3.4.0 - * - * @return bool False if theme doesn't support the section or user doesn't have the capability. - */ - final public function check_capabilities() { - if ( $this->capability && ! call_user_func_array( 'current_user_can', (array) $this->capability ) ) { - return false; - } - - if ( $this->theme_supports && ! call_user_func_array( 'current_theme_supports', (array) $this->theme_supports ) ) { - return false; - } - - return true; - } - - /** - * Get the section's content for insertion into the Customizer pane. - * - * @since 4.1.0 - * - * @return string Contents of the section. - */ - final public function get_content() { - ob_start(); - $this->maybe_render(); - return trim( ob_get_clean() ); - } - - /** - * Check capabilities and render the section. - * - * @since 3.4.0 - */ - final public function maybe_render() { - if ( ! $this->check_capabilities() ) { - return; - } - - /** - * Fires before rendering a Customizer section. - * - * @since 3.4.0 - * - * @param WP_Customize_Section $this WP_Customize_Section instance. - */ - do_action( 'customize_render_section', $this ); - /** - * Fires before rendering a specific Customizer section. - * - * The dynamic portion of the hook name, `$this->id`, refers to the ID - * of the specific Customizer section to be rendered. - * - * @since 3.4.0 - */ - do_action( "customize_render_section_{$this->id}" ); - - $this->render(); - } - - /** - * Render the section UI in a subclass. - * - * Sections are now rendered in JS by default, see WP_Customize_Section::print_template(). - * - * @since 3.4.0 - */ - protected function render() {} - - /** - * Render the section's JS template. - * - * This function is only run for section types that have been registered with - * WP_Customize_Manager::register_section_type(). - * - * @since 4.3.0 - * @access public - * - * @see WP_Customize_Manager::render_template() - */ - public function print_template() { - ?> - <script type="text/html" id="tmpl-customize-section-<?php echo $this->type; ?>"> - <?php $this->render_template(); ?> - </script> - <?php - } - - /** - * An Underscore (JS) template for rendering this section. - * - * Class variables for this section class are available in the `data` JS object; - * export custom variables by overriding WP_Customize_Section::json(). - * - * @since 4.3.0 - * @access protected - * - * @see WP_Customize_Section::print_template() - */ - protected function render_template() { - ?> - <li id="accordion-section-{{ data.id }}" class="accordion-section control-section control-section-{{ data.type }}"> - <h3 class="accordion-section-title" tabindex="0"> - {{ data.title }} - <span class="screen-reader-text"><?php _e( 'Press return or enter to open this section' ); ?></span> - </h3> - <ul class="accordion-section-content"> - <li class="customize-section-description-container section-meta <# if ( data.description_hidden ) { #>customize-info<# } #>"> - <div class="customize-section-title"> - <button class="customize-section-back" tabindex="-1"> - <span class="screen-reader-text"><?php _e( 'Back' ); ?></span> - </button> - <h3> - <span class="customize-action"> - {{{ data.customizeAction }}} - </span> - {{ data.title }} - </h3> - <# if ( data.description && data.description_hidden ) { #> - <button type="button" class="customize-help-toggle dashicons dashicons-editor-help" aria-expanded="false"><span class="screen-reader-text"><?php _e( 'Help' ); ?></span></button> - <div class="description customize-section-description"> - {{{ data.description }}} - </div> - <# } #> - </div> - - <# if ( data.description && ! data.description_hidden ) { #> - <div class="description customize-section-description"> - {{{ data.description }}} - </div> - <# } #> - </li> - </ul> - </li> - <?php - } -} - -/** WP_Customize_Themes_Section class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-themes-section.php' ); - -/** WP_Customize_Sidebar_Section class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-sidebar-section.php' ); - -/** WP_Customize_Nav_Menu_Section class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-section.php' ); - -/** WP_Customize_New_Menu_Section class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-new-menu-section.php' ); diff --git a/wp/wp-includes/class-wp-customize-setting.php b/wp/wp-includes/class-wp-customize-setting.php deleted file mode 100644 index 357836af..00000000 --- a/wp/wp-includes/class-wp-customize-setting.php +++ /dev/null @@ -1,921 +0,0 @@ -<?php -/** - * WordPress Customize Setting classes - * - * @package WordPress - * @subpackage Customize - * @since 3.4.0 - */ - -/** - * Customize Setting class. - * - * Handles saving and sanitizing of settings. - * - * @since 3.4.0 - * - * @see WP_Customize_Manager - */ -class WP_Customize_Setting { - /** - * @access public - * @var WP_Customize_Manager - */ - public $manager; - - /** - * Unique string identifier for the setting. - * - * @access public - * @var string - */ - public $id; - - /** - * @access public - * @var string - */ - public $type = 'theme_mod'; - - /** - * Capability required to edit this setting. - * - * @var string - */ - public $capability = 'edit_theme_options'; - - /** - * Feature a theme is required to support to enable this setting. - * - * @access public - * @var string - */ - public $theme_supports = ''; - public $default = ''; - public $transport = 'refresh'; - - /** - * Server-side sanitization callback for the setting's value. - * - * @var callback - */ - public $validate_callback = ''; - public $sanitize_callback = ''; - public $sanitize_js_callback = ''; - - /** - * Whether or not the setting is initially dirty when created. - * - * This is used to ensure that a setting will be sent from the pane to the - * preview when loading the Customizer. Normally a setting only is synced to - * the preview if it has been changed. This allows the setting to be sent - * from the start. - * - * @since 4.2.0 - * @access public - * @var bool - */ - public $dirty = false; - - /** - * @var array - */ - protected $id_data = array(); - - /** - * Whether or not preview() was called. - * - * @since 4.4.0 - * @access protected - * @var bool - */ - protected $is_previewed = false; - - /** - * Cache of multidimensional values to improve performance. - * - * @since 4.4.0 - * @access protected - * @var array - * @static - */ - protected static $aggregated_multidimensionals = array(); - - /** - * Whether the multidimensional setting is aggregated. - * - * @since 4.4.0 - * @access protected - * @var bool - */ - protected $is_multidimensional_aggregated = false; - - /** - * Constructor. - * - * Any supplied $args override class property defaults. - * - * @since 3.4.0 - * - * @param WP_Customize_Manager $manager - * @param string $id An specific ID of the setting. Can be a - * theme mod or option name. - * @param array $args Setting arguments. - */ - public function __construct( $manager, $id, $args = array() ) { - $keys = array_keys( get_object_vars( $this ) ); - foreach ( $keys as $key ) { - if ( isset( $args[ $key ] ) ) { - $this->$key = $args[ $key ]; - } - } - - $this->manager = $manager; - $this->id = $id; - - // Parse the ID for array keys. - $this->id_data['keys'] = preg_split( '/\[/', str_replace( ']', '', $this->id ) ); - $this->id_data['base'] = array_shift( $this->id_data['keys'] ); - - // Rebuild the ID. - $this->id = $this->id_data[ 'base' ]; - if ( ! empty( $this->id_data[ 'keys' ] ) ) { - $this->id .= '[' . implode( '][', $this->id_data['keys'] ) . ']'; - } - - if ( $this->validate_callback ) { - add_filter( "customize_validate_{$this->id}", $this->validate_callback, 10, 3 ); - } - if ( $this->sanitize_callback ) { - add_filter( "customize_sanitize_{$this->id}", $this->sanitize_callback, 10, 2 ); - } - if ( $this->sanitize_js_callback ) { - add_filter( "customize_sanitize_js_{$this->id}", $this->sanitize_js_callback, 10, 2 ); - } - - if ( 'option' === $this->type || 'theme_mod' === $this->type ) { - // Other setting types can opt-in to aggregate multidimensional explicitly. - $this->aggregate_multidimensional(); - - // Allow option settings to indicate whether they should be autoloaded. - if ( 'option' === $this->type && isset( $args['autoload'] ) ) { - self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload'] = $args['autoload']; - } - } - } - - /** - * Get parsed ID data for multidimensional setting. - * - * @since 4.4.0 - * @access public - * - * @return array { - * ID data for multidimensional setting. - * - * @type string $base ID base - * @type array $keys Keys for multidimensional array. - * } - */ - final public function id_data() { - return $this->id_data; - } - - /** - * Set up the setting for aggregated multidimensional values. - * - * When a multidimensional setting gets aggregated, all of its preview and update - * calls get combined into one call, greatly improving performance. - * - * @since 4.4.0 - * @access protected - */ - protected function aggregate_multidimensional() { - $id_base = $this->id_data['base']; - if ( ! isset( self::$aggregated_multidimensionals[ $this->type ] ) ) { - self::$aggregated_multidimensionals[ $this->type ] = array(); - } - if ( ! isset( self::$aggregated_multidimensionals[ $this->type ][ $id_base ] ) ) { - self::$aggregated_multidimensionals[ $this->type ][ $id_base ] = array( - 'previewed_instances' => array(), // Calling preview() will add the $setting to the array. - 'preview_applied_instances' => array(), // Flags for which settings have had their values applied. - 'root_value' => $this->get_root_value( array() ), // Root value for initial state, manipulated by preview and update calls. - ); - } - - if ( ! empty( $this->id_data['keys'] ) ) { - // Note the preview-applied flag is cleared at priority 9 to ensure it is cleared before a deferred-preview runs. - add_action( "customize_post_value_set_{$this->id}", array( $this, '_clear_aggregated_multidimensional_preview_applied_flag' ), 9 ); - $this->is_multidimensional_aggregated = true; - } - } - - /** - * Reset `$aggregated_multidimensionals` static variable. - * - * This is intended only for use by unit tests. - * - * @since 4.5.0 - * @access public - * @ignore - */ - static public function reset_aggregated_multidimensionals() { - self::$aggregated_multidimensionals = array(); - } - - /** - * The ID for the current site when the preview() method was called. - * - * @since 4.2.0 - * @access protected - * @var int - */ - protected $_previewed_blog_id; - - /** - * Return true if the current site is not the same as the previewed site. - * - * @since 4.2.0 - * @access public - * - * @return bool If preview() has been called. - */ - public function is_current_blog_previewed() { - if ( ! isset( $this->_previewed_blog_id ) ) { - return false; - } - return ( get_current_blog_id() === $this->_previewed_blog_id ); - } - - /** - * Original non-previewed value stored by the preview method. - * - * @see WP_Customize_Setting::preview() - * @since 4.1.1 - * @var mixed - */ - protected $_original_value; - - /** - * Add filters to supply the setting's value when accessed. - * - * If the setting already has a pre-existing value and there is no incoming - * post value for the setting, then this method will short-circuit since - * there is no change to preview. - * - * @since 3.4.0 - * @since 4.4.0 Added boolean return value. - * @access public - * - * @return bool False when preview short-circuits due no change needing to be previewed. - */ - public function preview() { - if ( ! isset( $this->_previewed_blog_id ) ) { - $this->_previewed_blog_id = get_current_blog_id(); - } - - // Prevent re-previewing an already-previewed setting. - if ( $this->is_previewed ) { - return true; - } - - $id_base = $this->id_data['base']; - $is_multidimensional = ! empty( $this->id_data['keys'] ); - $multidimensional_filter = array( $this, '_multidimensional_preview_filter' ); - - /* - * Check if the setting has a pre-existing value (an isset check), - * and if doesn't have any incoming post value. If both checks are true, - * then the preview short-circuits because there is nothing that needs - * to be previewed. - */ - $undefined = new stdClass(); - $needs_preview = ( $undefined !== $this->post_value( $undefined ) ); - $value = null; - - // Since no post value was defined, check if we have an initial value set. - if ( ! $needs_preview ) { - if ( $this->is_multidimensional_aggregated ) { - $root = self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value']; - $value = $this->multidimensional_get( $root, $this->id_data['keys'], $undefined ); - } else { - $default = $this->default; - $this->default = $undefined; // Temporarily set default to undefined so we can detect if existing value is set. - $value = $this->value(); - $this->default = $default; - } - $needs_preview = ( $undefined === $value ); // Because the default needs to be supplied. - } - - // If the setting does not need previewing now, defer to when it has a value to preview. - if ( ! $needs_preview ) { - if ( ! has_action( "customize_post_value_set_{$this->id}", array( $this, 'preview' ) ) ) { - add_action( "customize_post_value_set_{$this->id}", array( $this, 'preview' ) ); - } - return false; - } - - switch ( $this->type ) { - case 'theme_mod' : - if ( ! $is_multidimensional ) { - add_filter( "theme_mod_{$id_base}", array( $this, '_preview_filter' ) ); - } else { - if ( empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] ) ) { - // Only add this filter once for this ID base. - add_filter( "theme_mod_{$id_base}", $multidimensional_filter ); - } - self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'][ $this->id ] = $this; - } - break; - case 'option' : - if ( ! $is_multidimensional ) { - add_filter( "pre_option_{$id_base}", array( $this, '_preview_filter' ) ); - } else { - if ( empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] ) ) { - // Only add these filters once for this ID base. - add_filter( "option_{$id_base}", $multidimensional_filter ); - add_filter( "default_option_{$id_base}", $multidimensional_filter ); - } - self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'][ $this->id ] = $this; - } - break; - default : - - /** - * Fires when the WP_Customize_Setting::preview() method is called for settings - * not handled as theme_mods or options. - * - * The dynamic portion of the hook name, `$this->id`, refers to the setting ID. - * - * @since 3.4.0 - * - * @param WP_Customize_Setting $this WP_Customize_Setting instance. - */ - do_action( "customize_preview_{$this->id}", $this ); - - /** - * Fires when the WP_Customize_Setting::preview() method is called for settings - * not handled as theme_mods or options. - * - * The dynamic portion of the hook name, `$this->type`, refers to the setting type. - * - * @since 4.1.0 - * - * @param WP_Customize_Setting $this WP_Customize_Setting instance. - */ - do_action( "customize_preview_{$this->type}", $this ); - } - - $this->is_previewed = true; - - return true; - } - - /** - * Clear out the previewed-applied flag for a multidimensional-aggregated value whenever its post value is updated. - * - * This ensures that the new value will get sanitized and used the next time - * that `WP_Customize_Setting::_multidimensional_preview_filter()` - * is called for this setting. - * - * @since 4.4.0 - * @access private - * @see WP_Customize_Manager::set_post_value() - * @see WP_Customize_Setting::_multidimensional_preview_filter() - */ - final public function _clear_aggregated_multidimensional_preview_applied_flag() { - unset( self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['preview_applied_instances'][ $this->id ] ); - } - - /** - * Callback function to filter non-multidimensional theme mods and options. - * - * If switch_to_blog() was called after the preview() method, and the current - * site is now not the same site, then this method does a no-op and returns - * the original value. - * - * @since 3.4.0 - * - * @param mixed $original Old value. - * @return mixed New or old value. - */ - public function _preview_filter( $original ) { - if ( ! $this->is_current_blog_previewed() ) { - return $original; - } - - $undefined = new stdClass(); // Symbol hack. - $post_value = $this->post_value( $undefined ); - if ( $undefined !== $post_value ) { - $value = $post_value; - } else { - /* - * Note that we don't use $original here because preview() will - * not add the filter in the first place if it has an initial value - * and there is no post value. - */ - $value = $this->default; - } - return $value; - } - - /** - * Callback function to filter multidimensional theme mods and options. - * - * For all multidimensional settings of a given type, the preview filter for - * the first setting previewed will be used to apply the values for the others. - * - * @since 4.4.0 - * @access private - * - * @see WP_Customize_Setting::$aggregated_multidimensionals - * @param mixed $original Original root value. - * @return mixed New or old value. - */ - final public function _multidimensional_preview_filter( $original ) { - if ( ! $this->is_current_blog_previewed() ) { - return $original; - } - - $id_base = $this->id_data['base']; - - // If no settings have been previewed yet (which should not be the case, since $this is), just pass through the original value. - if ( empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] ) ) { - return $original; - } - - foreach ( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['previewed_instances'] as $previewed_setting ) { - // Skip applying previewed value for any settings that have already been applied. - if ( ! empty( self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['preview_applied_instances'][ $previewed_setting->id ] ) ) { - continue; - } - - // Do the replacements of the posted/default sub value into the root value. - $value = $previewed_setting->post_value( $previewed_setting->default ); - $root = self::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['root_value']; - $root = $previewed_setting->multidimensional_replace( $root, $previewed_setting->id_data['keys'], $value ); - self::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['root_value'] = $root; - - // Mark this setting having been applied so that it will be skipped when the filter is called again. - self::$aggregated_multidimensionals[ $previewed_setting->type ][ $id_base ]['preview_applied_instances'][ $previewed_setting->id ] = true; - } - - return self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value']; - } - - /** - * Checks user capabilities and theme supports, and then saves - * the value of the setting. - * - * @since 3.4.0 - * - * @access public - * - * @return false|void False if cap check fails or value isn't set or is invalid. - */ - final public function save() { - $value = $this->post_value(); - - if ( ! $this->check_capabilities() || ! isset( $value ) ) { - return false; - } - - /** - * Fires when the WP_Customize_Setting::save() method is called. - * - * The dynamic portion of the hook name, `$this->id_data['base']` refers to - * the base slug of the setting name. - * - * @since 3.4.0 - * - * @param WP_Customize_Setting $this WP_Customize_Setting instance. - */ - do_action( 'customize_save_' . $this->id_data['base'], $this ); - - $this->update( $value ); - } - - /** - * Fetch and sanitize the $_POST value for the setting. - * - * During a save request prior to save, post_value() provides the new value while value() does not. - * - * @since 3.4.0 - * - * @param mixed $default A default value which is used as a fallback. Default is null. - * @return mixed The default value on failure, otherwise the sanitized and validated value. - */ - final public function post_value( $default = null ) { - return $this->manager->post_value( $this, $default ); - } - - /** - * Sanitize an input. - * - * @since 3.4.0 - * - * @param string|array $value The value to sanitize. - * @return string|array|null|WP_Error Sanitized value, or `null`/`WP_Error` if invalid. - */ - public function sanitize( $value ) { - - /** - * Filters a Customize setting value in un-slashed form. - * - * @since 3.4.0 - * - * @param mixed $value Value of the setting. - * @param WP_Customize_Setting $this WP_Customize_Setting instance. - */ - return apply_filters( "customize_sanitize_{$this->id}", $value, $this ); - } - - /** - * Validates an input. - * - * @since 4.6.0 - * @access public - * - * @see WP_REST_Request::has_valid_params() - * - * @param mixed $value Value to validate. - * @return true|WP_Error True if the input was validated, otherwise WP_Error. - */ - public function validate( $value ) { - if ( is_wp_error( $value ) ) { - return $value; - } - if ( is_null( $value ) ) { - return new WP_Error( 'invalid_value', __( 'Invalid value.' ) ); - } - - $validity = new WP_Error(); - - /** - * Validates a Customize setting value. - * - * Plugins should amend the `$validity` object via its `WP_Error::add()` method. - * - * The dynamic portion of the hook name, `$this->ID`, refers to the setting ID. - * - * @since 4.6.0 - * - * @param WP_Error $validity Filtered from `true` to `WP_Error` when invalid. - * @param mixed $value Value of the setting. - * @param WP_Customize_Setting $this WP_Customize_Setting instance. - */ - $validity = apply_filters( "customize_validate_{$this->id}", $validity, $value, $this ); - - if ( is_wp_error( $validity ) && empty( $validity->errors ) ) { - $validity = true; - } - return $validity; - } - - /** - * Get the root value for a setting, especially for multidimensional ones. - * - * @since 4.4.0 - * @access protected - * - * @param mixed $default Value to return if root does not exist. - * @return mixed - */ - protected function get_root_value( $default = null ) { - $id_base = $this->id_data['base']; - if ( 'option' === $this->type ) { - return get_option( $id_base, $default ); - } elseif ( 'theme_mod' === $this->type ) { - return get_theme_mod( $id_base, $default ); - } else { - /* - * Any WP_Customize_Setting subclass implementing aggregate multidimensional - * will need to override this method to obtain the data from the appropriate - * location. - */ - return $default; - } - } - - /** - * Set the root value for a setting, especially for multidimensional ones. - * - * @since 4.4.0 - * @access protected - * - * @param mixed $value Value to set as root of multidimensional setting. - * @return bool Whether the multidimensional root was updated successfully. - */ - protected function set_root_value( $value ) { - $id_base = $this->id_data['base']; - if ( 'option' === $this->type ) { - $autoload = true; - if ( isset( self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload'] ) ) { - $autoload = self::$aggregated_multidimensionals[ $this->type ][ $this->id_data['base'] ]['autoload']; - } - return update_option( $id_base, $value, $autoload ); - } elseif ( 'theme_mod' === $this->type ) { - set_theme_mod( $id_base, $value ); - return true; - } else { - /* - * Any WP_Customize_Setting subclass implementing aggregate multidimensional - * will need to override this method to obtain the data from the appropriate - * location. - */ - return false; - } - } - - /** - * Save the value of the setting, using the related API. - * - * @since 3.4.0 - * - * @param mixed $value The value to update. - * @return bool The result of saving the value. - */ - protected function update( $value ) { - $id_base = $this->id_data['base']; - if ( 'option' === $this->type || 'theme_mod' === $this->type ) { - if ( ! $this->is_multidimensional_aggregated ) { - return $this->set_root_value( $value ); - } else { - $root = self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value']; - $root = $this->multidimensional_replace( $root, $this->id_data['keys'], $value ); - self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value'] = $root; - return $this->set_root_value( $root ); - } - } else { - /** - * Fires when the WP_Customize_Setting::update() method is called for settings - * not handled as theme_mods or options. - * - * The dynamic portion of the hook name, `$this->type`, refers to the type of setting. - * - * @since 3.4.0 - * - * @param mixed $value Value of the setting. - * @param WP_Customize_Setting $this WP_Customize_Setting instance. - */ - do_action( "customize_update_{$this->type}", $value, $this ); - - return has_action( "customize_update_{$this->type}" ); - } - } - - /** - * Deprecated method. - * - * @since 3.4.0 - * @deprecated 4.4.0 Deprecated in favor of update() method. - */ - protected function _update_theme_mod() { - _deprecated_function( __METHOD__, '4.4.0', __CLASS__ . '::update()' ); - } - - /** - * Deprecated method. - * - * @since 3.4.0 - * @deprecated 4.4.0 Deprecated in favor of update() method. - */ - protected function _update_option() { - _deprecated_function( __METHOD__, '4.4.0', __CLASS__ . '::update()' ); - } - - /** - * Fetch the value of the setting. - * - * @since 3.4.0 - * - * @return mixed The value. - */ - public function value() { - $id_base = $this->id_data['base']; - $is_core_type = ( 'option' === $this->type || 'theme_mod' === $this->type ); - - if ( ! $is_core_type && ! $this->is_multidimensional_aggregated ) { - - // Use post value if previewed and a post value is present. - if ( $this->is_previewed ) { - $value = $this->post_value( null ); - if ( null !== $value ) { - return $value; - } - } - - $value = $this->get_root_value( $this->default ); - - /** - * Filters a Customize setting value not handled as a theme_mod or option. - * - * The dynamic portion of the hook name, `$id_base`, refers to - * the base slug of the setting name, initialized from `$this->id_data['base']`. - * - * For settings handled as theme_mods or options, see those corresponding - * functions for available hooks. - * - * @since 3.4.0 - * @since 4.6.0 Added the `$this` setting instance as the second parameter. - * - * @param mixed $default The setting default value. Default empty. - * @param WP_Customize_Setting $this The setting instance. - */ - $value = apply_filters( "customize_value_{$id_base}", $value, $this ); - } elseif ( $this->is_multidimensional_aggregated ) { - $root_value = self::$aggregated_multidimensionals[ $this->type ][ $id_base ]['root_value']; - $value = $this->multidimensional_get( $root_value, $this->id_data['keys'], $this->default ); - - // Ensure that the post value is used if the setting is previewed, since preview filters aren't applying on cached $root_value. - if ( $this->is_previewed ) { - $value = $this->post_value( $value ); - } - } else { - $value = $this->get_root_value( $this->default ); - } - return $value; - } - - /** - * Sanitize the setting's value for use in JavaScript. - * - * @since 3.4.0 - * - * @return mixed The requested escaped value. - */ - public function js_value() { - - /** - * Filters a Customize setting value for use in JavaScript. - * - * The dynamic portion of the hook name, `$this->id`, refers to the setting ID. - * - * @since 3.4.0 - * - * @param mixed $value The setting value. - * @param WP_Customize_Setting $this WP_Customize_Setting instance. - */ - $value = apply_filters( "customize_sanitize_js_{$this->id}", $this->value(), $this ); - - if ( is_string( $value ) ) - return html_entity_decode( $value, ENT_QUOTES, 'UTF-8'); - - return $value; - } - - /** - * Retrieves the data to export to the client via JSON. - * - * @since 4.6.0 - * @access public - * - * @return array Array of parameters passed to JavaScript. - */ - public function json() { - return array( - 'value' => $this->js_value(), - 'transport' => $this->transport, - 'dirty' => $this->dirty, - 'type' => $this->type, - ); - } - - /** - * Validate user capabilities whether the theme supports the setting. - * - * @since 3.4.0 - * - * @return bool False if theme doesn't support the setting or user can't change setting, otherwise true. - */ - final public function check_capabilities() { - if ( $this->capability && ! call_user_func_array( 'current_user_can', (array) $this->capability ) ) - return false; - - if ( $this->theme_supports && ! call_user_func_array( 'current_theme_supports', (array) $this->theme_supports ) ) - return false; - - return true; - } - - /** - * Multidimensional helper function. - * - * @since 3.4.0 - * - * @param $root - * @param $keys - * @param bool $create Default is false. - * @return array|void Keys are 'root', 'node', and 'key'. - */ - final protected function multidimensional( &$root, $keys, $create = false ) { - if ( $create && empty( $root ) ) - $root = array(); - - if ( ! isset( $root ) || empty( $keys ) ) - return; - - $last = array_pop( $keys ); - $node = &$root; - - foreach ( $keys as $key ) { - if ( $create && ! isset( $node[ $key ] ) ) - $node[ $key ] = array(); - - if ( ! is_array( $node ) || ! isset( $node[ $key ] ) ) - return; - - $node = &$node[ $key ]; - } - - if ( $create ) { - if ( ! is_array( $node ) ) { - // account for an array overriding a string or object value - $node = array(); - } - if ( ! isset( $node[ $last ] ) ) { - $node[ $last ] = array(); - } - } - - if ( ! isset( $node[ $last ] ) ) - return; - - return array( - 'root' => &$root, - 'node' => &$node, - 'key' => $last, - ); - } - - /** - * Will attempt to replace a specific value in a multidimensional array. - * - * @since 3.4.0 - * - * @param $root - * @param $keys - * @param mixed $value The value to update. - * @return mixed - */ - final protected function multidimensional_replace( $root, $keys, $value ) { - if ( ! isset( $value ) ) - return $root; - elseif ( empty( $keys ) ) // If there are no keys, we're replacing the root. - return $value; - - $result = $this->multidimensional( $root, $keys, true ); - - if ( isset( $result ) ) - $result['node'][ $result['key'] ] = $value; - - return $root; - } - - /** - * Will attempt to fetch a specific value from a multidimensional array. - * - * @since 3.4.0 - * - * @param $root - * @param $keys - * @param mixed $default A default value which is used as a fallback. Default is null. - * @return mixed The requested value or the default value. - */ - final protected function multidimensional_get( $root, $keys, $default = null ) { - if ( empty( $keys ) ) // If there are no keys, test the root. - return isset( $root ) ? $root : $default; - - $result = $this->multidimensional( $root, $keys ); - return isset( $result ) ? $result['node'][ $result['key'] ] : $default; - } - - /** - * Will attempt to check if a specific value in a multidimensional array is set. - * - * @since 3.4.0 - * - * @param $root - * @param $keys - * @return bool True if value is set, false if not. - */ - final protected function multidimensional_isset( $root, $keys ) { - $result = $this->multidimensional_get( $root, $keys ); - return isset( $result ); - } -} - -/** WP_Customize_Filter_Setting class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-filter-setting.php' ); - -/** WP_Customize_Header_Image_Setting class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-header-image-setting.php' ); - -/** WP_Customize_Background_Image_Setting class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-background-image-setting.php' ); - -/** WP_Customize_Nav_Menu_Item_Setting class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-item-setting.php' ); - -/** WP_Customize_Nav_Menu_Setting class */ -require_once( ABSPATH . WPINC . '/customize/class-wp-customize-nav-menu-setting.php' ); diff --git a/wp/wp-includes/class-wp-customize-widgets.php b/wp/wp-includes/class-wp-customize-widgets.php deleted file mode 100644 index 8ffa2c07..00000000 --- a/wp/wp-includes/class-wp-customize-widgets.php +++ /dev/null @@ -1,2052 +0,0 @@ -<?php -/** - * WordPress Customize Widgets classes - * - * @package WordPress - * @subpackage Customize - * @since 3.9.0 - */ - -/** - * Customize Widgets class. - * - * Implements widget management in the Customizer. - * - * @since 3.9.0 - * - * @see WP_Customize_Manager - */ -final class WP_Customize_Widgets { - - /** - * WP_Customize_Manager instance. - * - * @since 3.9.0 - * @access public - * @var WP_Customize_Manager - */ - public $manager; - - /** - * All id_bases for widgets defined in core. - * - * @since 3.9.0 - * @access protected - * @var array - */ - protected $core_widget_id_bases = array( - 'archives', 'calendar', 'categories', 'links', 'meta', - 'nav_menu', 'pages', 'recent-comments', 'recent-posts', - 'rss', 'search', 'tag_cloud', 'text', - ); - - /** - * @since 3.9.0 - * @access protected - * @var array - */ - protected $rendered_sidebars = array(); - - /** - * @since 3.9.0 - * @access protected - * @var array - */ - protected $rendered_widgets = array(); - - /** - * @since 3.9.0 - * @access protected - * @var array - */ - protected $old_sidebars_widgets = array(); - - /** - * Mapping of widget ID base to whether it supports selective refresh. - * - * @since 4.5.0 - * @access protected - * @var array - */ - protected $selective_refreshable_widgets; - - /** - * Mapping of setting type to setting ID pattern. - * - * @since 4.2.0 - * @access protected - * @var array - */ - protected $setting_id_patterns = array( - 'widget_instance' => '/^widget_(?P<id_base>.+?)(?:\[(?P<widget_number>\d+)\])?$/', - 'sidebar_widgets' => '/^sidebars_widgets\[(?P<sidebar_id>.+?)\]$/', - ); - - /** - * Initial loader. - * - * @since 3.9.0 - * @access public - * - * @param WP_Customize_Manager $manager Customize manager bootstrap instance. - */ - public function __construct( $manager ) { - $this->manager = $manager; - - // See https://github.com/xwp/wp-customize-snapshots/blob/962586659688a5b1fd9ae93618b7ce2d4e7a421c/php/class-customize-snapshot-manager.php#L420-L449 - add_filter( 'customize_dynamic_setting_args', array( $this, 'filter_customize_dynamic_setting_args' ), 10, 2 ); - add_action( 'widgets_init', array( $this, 'register_settings' ), 95 ); - add_action( 'customize_register', array( $this, 'schedule_customize_register' ), 1 ); - - // Skip remaining hooks when the user can't manage widgets anyway. - if ( ! current_user_can( 'edit_theme_options' ) ) { - return; - } - - add_action( 'wp_loaded', array( $this, 'override_sidebars_widgets_for_theme_switch' ) ); - add_action( 'customize_controls_init', array( $this, 'customize_controls_init' ) ); - add_action( 'customize_controls_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); - add_action( 'customize_controls_print_styles', array( $this, 'print_styles' ) ); - add_action( 'customize_controls_print_scripts', array( $this, 'print_scripts' ) ); - add_action( 'customize_controls_print_footer_scripts', array( $this, 'print_footer_scripts' ) ); - add_action( 'customize_controls_print_footer_scripts', array( $this, 'output_widget_control_templates' ) ); - add_action( 'customize_preview_init', array( $this, 'customize_preview_init' ) ); - add_filter( 'customize_refresh_nonces', array( $this, 'refresh_nonces' ) ); - - add_action( 'dynamic_sidebar', array( $this, 'tally_rendered_widgets' ) ); - add_filter( 'is_active_sidebar', array( $this, 'tally_sidebars_via_is_active_sidebar_calls' ), 10, 2 ); - add_filter( 'dynamic_sidebar_has_widgets', array( $this, 'tally_sidebars_via_dynamic_sidebar_calls' ), 10, 2 ); - - // Selective Refresh. - add_filter( 'customize_dynamic_partial_args', array( $this, 'customize_dynamic_partial_args' ), 10, 2 ); - add_action( 'customize_preview_init', array( $this, 'selective_refresh_init' ) ); - } - - /** - * List whether each registered widget can be use selective refresh. - * - * If the theme does not support the customize-selective-refresh-widgets feature, - * then this will always return an empty array. - * - * @since 4.5.0 - * @access public - * - * @return array Mapping of id_base to support. If theme doesn't support - * selective refresh, an empty array is returned. - */ - public function get_selective_refreshable_widgets() { - global $wp_widget_factory; - if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) { - return array(); - } - if ( ! isset( $this->selective_refreshable_widgets ) ) { - $this->selective_refreshable_widgets = array(); - foreach ( $wp_widget_factory->widgets as $wp_widget ) { - $this->selective_refreshable_widgets[ $wp_widget->id_base ] = ! empty( $wp_widget->widget_options['customize_selective_refresh'] ); - } - } - return $this->selective_refreshable_widgets; - } - - /** - * Determines if a widget supports selective refresh. - * - * @since 4.5.0 - * @access public - * - * @param string $id_base Widget ID Base. - * @return bool Whether the widget can be selective refreshed. - */ - public function is_widget_selective_refreshable( $id_base ) { - $selective_refreshable_widgets = $this->get_selective_refreshable_widgets(); - return ! empty( $selective_refreshable_widgets[ $id_base ] ); - } - - /** - * Retrieves the widget setting type given a setting ID. - * - * @since 4.2.0 - * @access protected - * - * @staticvar array $cache - * - * @param string $setting_id Setting ID. - * @return string|void Setting type. - */ - protected function get_setting_type( $setting_id ) { - static $cache = array(); - if ( isset( $cache[ $setting_id ] ) ) { - return $cache[ $setting_id ]; - } - foreach ( $this->setting_id_patterns as $type => $pattern ) { - if ( preg_match( $pattern, $setting_id ) ) { - $cache[ $setting_id ] = $type; - return $type; - } - } - } - - /** - * Inspects the incoming customized data for any widget settings, and dynamically adds - * them up-front so widgets will be initialized properly. - * - * @since 4.2.0 - * @access public - */ - public function register_settings() { - $widget_setting_ids = array(); - $incoming_setting_ids = array_keys( $this->manager->unsanitized_post_values() ); - foreach ( $incoming_setting_ids as $setting_id ) { - if ( ! is_null( $this->get_setting_type( $setting_id ) ) ) { - $widget_setting_ids[] = $setting_id; - } - } - if ( $this->manager->doing_ajax( 'update-widget' ) && isset( $_REQUEST['widget-id'] ) ) { - $widget_setting_ids[] = $this->get_setting_id( wp_unslash( $_REQUEST['widget-id'] ) ); - } - - $settings = $this->manager->add_dynamic_settings( array_unique( $widget_setting_ids ) ); - - /* - * Preview settings right away so that widgets and sidebars will get registered properly. - * But don't do this if a customize_save because this will cause WP to think there is nothing - * changed that needs to be saved. - */ - if ( ! $this->manager->doing_ajax( 'customize_save' ) ) { - foreach ( $settings as $setting ) { - $setting->preview(); - } - } - } - - /** - * Determines the arguments for a dynamically-created setting. - * - * @since 4.2.0 - * @access public - * - * @param false|array $args The arguments to the WP_Customize_Setting constructor. - * @param string $setting_id ID for dynamic setting, usually coming from `$_POST['customized']`. - * @return false|array Setting arguments, false otherwise. - */ - public function filter_customize_dynamic_setting_args( $args, $setting_id ) { - if ( $this->get_setting_type( $setting_id ) ) { - $args = $this->get_setting_args( $setting_id ); - } - return $args; - } - - /** - * Retrieves an unslashed post value or return a default. - * - * @since 3.9.0 - * @access protected - * - * @param string $name Post value. - * @param mixed $default Default post value. - * @return mixed Unslashed post value or default value. - */ - protected function get_post_value( $name, $default = null ) { - if ( ! isset( $_POST[ $name ] ) ) { - return $default; - } - - return wp_unslash( $_POST[ $name ] ); - } - - /** - * Override sidebars_widgets for theme switch. - * - * When switching a theme via the Customizer, supply any previously-configured - * sidebars_widgets from the target theme as the initial sidebars_widgets - * setting. Also store the old theme's existing settings so that they can - * be passed along for storing in the sidebars_widgets theme_mod when the - * theme gets switched. - * - * @since 3.9.0 - * @access public - * - * @global array $sidebars_widgets - * @global array $_wp_sidebars_widgets - */ - public function override_sidebars_widgets_for_theme_switch() { - global $sidebars_widgets; - - if ( $this->manager->doing_ajax() || $this->manager->is_theme_active() ) { - return; - } - - $this->old_sidebars_widgets = wp_get_sidebars_widgets(); - add_filter( 'customize_value_old_sidebars_widgets_data', array( $this, 'filter_customize_value_old_sidebars_widgets_data' ) ); - $this->manager->set_post_value( 'old_sidebars_widgets_data', $this->old_sidebars_widgets ); // Override any value cached in changeset. - - // retrieve_widgets() looks at the global $sidebars_widgets - $sidebars_widgets = $this->old_sidebars_widgets; - $sidebars_widgets = retrieve_widgets( 'customize' ); - add_filter( 'option_sidebars_widgets', array( $this, 'filter_option_sidebars_widgets_for_theme_switch' ), 1 ); - // reset global cache var used by wp_get_sidebars_widgets() - unset( $GLOBALS['_wp_sidebars_widgets'] ); - } - - /** - * Filters old_sidebars_widgets_data Customizer setting. - * - * When switching themes, filter the Customizer setting old_sidebars_widgets_data - * to supply initial $sidebars_widgets before they were overridden by retrieve_widgets(). - * The value for old_sidebars_widgets_data gets set in the old theme's sidebars_widgets - * theme_mod. - * - * @since 3.9.0 - * @access public - * - * @see WP_Customize_Widgets::handle_theme_switch() - * - * @param array $old_sidebars_widgets - * @return array - */ - public function filter_customize_value_old_sidebars_widgets_data( $old_sidebars_widgets ) { - return $this->old_sidebars_widgets; - } - - /** - * Filters sidebars_widgets option for theme switch. - * - * When switching themes, the retrieve_widgets() function is run when the Customizer initializes, - * and then the new sidebars_widgets here get supplied as the default value for the sidebars_widgets - * option. - * - * @since 3.9.0 - * @access public - * - * @see WP_Customize_Widgets::handle_theme_switch() - * @global array $sidebars_widgets - * - * @param array $sidebars_widgets - * @return array - */ - public function filter_option_sidebars_widgets_for_theme_switch( $sidebars_widgets ) { - $sidebars_widgets = $GLOBALS['sidebars_widgets']; - $sidebars_widgets['array_version'] = 3; - return $sidebars_widgets; - } - - /** - * Ensures all widgets get loaded into the Customizer. - * - * Note: these actions are also fired in wp_ajax_update_widget(). - * - * @since 3.9.0 - * @access public - */ - public function customize_controls_init() { - /** This action is documented in wp-admin/includes/ajax-actions.php */ - do_action( 'load-widgets.php' ); - - /** This action is documented in wp-admin/includes/ajax-actions.php */ - do_action( 'widgets.php' ); - - /** This action is documented in wp-admin/widgets.php */ - do_action( 'sidebar_admin_setup' ); - } - - /** - * Ensures widgets are available for all types of previews. - * - * When in preview, hook to {@see 'customize_register'} for settings after WordPress is loaded - * so that all filters have been initialized (e.g. Widget Visibility). - * - * @since 3.9.0 - * @access public - */ - public function schedule_customize_register() { - if ( is_admin() ) { - $this->customize_register(); - } else { - add_action( 'wp', array( $this, 'customize_register' ) ); - } - } - - /** - * Registers Customizer settings and controls for all sidebars and widgets. - * - * @since 3.9.0 - * @access public - * - * @global array $wp_registered_widgets - * @global array $wp_registered_widget_controls - * @global array $wp_registered_sidebars - */ - public function customize_register() { - global $wp_registered_widgets, $wp_registered_widget_controls, $wp_registered_sidebars; - - add_filter( 'sidebars_widgets', array( $this, 'preview_sidebars_widgets' ), 1 ); - - $sidebars_widgets = array_merge( - array( 'wp_inactive_widgets' => array() ), - array_fill_keys( array_keys( $wp_registered_sidebars ), array() ), - wp_get_sidebars_widgets() - ); - - $new_setting_ids = array(); - - /* - * Register a setting for all widgets, including those which are active, - * inactive, and orphaned since a widget may get suppressed from a sidebar - * via a plugin (like Widget Visibility). - */ - foreach ( array_keys( $wp_registered_widgets ) as $widget_id ) { - $setting_id = $this->get_setting_id( $widget_id ); - $setting_args = $this->get_setting_args( $setting_id ); - if ( ! $this->manager->get_setting( $setting_id ) ) { - $this->manager->add_setting( $setting_id, $setting_args ); - } - $new_setting_ids[] = $setting_id; - } - - /* - * Add a setting which will be supplied for the theme's sidebars_widgets - * theme_mod when the theme is switched. - */ - if ( ! $this->manager->is_theme_active() ) { - $setting_id = 'old_sidebars_widgets_data'; - $setting_args = $this->get_setting_args( $setting_id, array( - 'type' => 'global_variable', - 'dirty' => true, - ) ); - $this->manager->add_setting( $setting_id, $setting_args ); - } - - $this->manager->add_panel( 'widgets', array( - 'type' => 'widgets', - 'title' => __( 'Widgets' ), - 'description' => __( 'Widgets are independent sections of content that can be placed into widgetized areas provided by your theme (commonly called sidebars).' ), - 'priority' => 110, - 'active_callback' => array( $this, 'is_panel_active' ), - 'auto_expand_sole_section' => true, - ) ); - - foreach ( $sidebars_widgets as $sidebar_id => $sidebar_widget_ids ) { - if ( empty( $sidebar_widget_ids ) ) { - $sidebar_widget_ids = array(); - } - - $is_registered_sidebar = is_registered_sidebar( $sidebar_id ); - $is_inactive_widgets = ( 'wp_inactive_widgets' === $sidebar_id ); - $is_active_sidebar = ( $is_registered_sidebar && ! $is_inactive_widgets ); - - // Add setting for managing the sidebar's widgets. - if ( $is_registered_sidebar || $is_inactive_widgets ) { - $setting_id = sprintf( 'sidebars_widgets[%s]', $sidebar_id ); - $setting_args = $this->get_setting_args( $setting_id ); - if ( ! $this->manager->get_setting( $setting_id ) ) { - if ( ! $this->manager->is_theme_active() ) { - $setting_args['dirty'] = true; - } - $this->manager->add_setting( $setting_id, $setting_args ); - } - $new_setting_ids[] = $setting_id; - - // Add section to contain controls. - $section_id = sprintf( 'sidebar-widgets-%s', $sidebar_id ); - if ( $is_active_sidebar ) { - - $section_args = array( - 'title' => $wp_registered_sidebars[ $sidebar_id ]['name'], - 'description' => $wp_registered_sidebars[ $sidebar_id ]['description'], - 'priority' => array_search( $sidebar_id, array_keys( $wp_registered_sidebars ) ), - 'panel' => 'widgets', - 'sidebar_id' => $sidebar_id, - ); - - /** - * Filters Customizer widget section arguments for a given sidebar. - * - * @since 3.9.0 - * - * @param array $section_args Array of Customizer widget section arguments. - * @param string $section_id Customizer section ID. - * @param int|string $sidebar_id Sidebar ID. - */ - $section_args = apply_filters( 'customizer_widgets_section_args', $section_args, $section_id, $sidebar_id ); - - $section = new WP_Customize_Sidebar_Section( $this->manager, $section_id, $section_args ); - $this->manager->add_section( $section ); - - $control = new WP_Widget_Area_Customize_Control( $this->manager, $setting_id, array( - 'section' => $section_id, - 'sidebar_id' => $sidebar_id, - 'priority' => count( $sidebar_widget_ids ), // place 'Add Widget' and 'Reorder' buttons at end. - ) ); - $new_setting_ids[] = $setting_id; - - $this->manager->add_control( $control ); - } - } - - // Add a control for each active widget (located in a sidebar). - foreach ( $sidebar_widget_ids as $i => $widget_id ) { - - // Skip widgets that may have gone away due to a plugin being deactivated. - if ( ! $is_active_sidebar || ! isset( $wp_registered_widgets[$widget_id] ) ) { - continue; - } - - $registered_widget = $wp_registered_widgets[$widget_id]; - $setting_id = $this->get_setting_id( $widget_id ); - $id_base = $wp_registered_widget_controls[$widget_id]['id_base']; - - $control = new WP_Widget_Form_Customize_Control( $this->manager, $setting_id, array( - 'label' => $registered_widget['name'], - 'section' => $section_id, - 'sidebar_id' => $sidebar_id, - 'widget_id' => $widget_id, - 'widget_id_base' => $id_base, - 'priority' => $i, - 'width' => $wp_registered_widget_controls[$widget_id]['width'], - 'height' => $wp_registered_widget_controls[$widget_id]['height'], - 'is_wide' => $this->is_wide_widget( $widget_id ), - ) ); - $this->manager->add_control( $control ); - } - } - - if ( ! $this->manager->doing_ajax( 'customize_save' ) ) { - foreach ( $new_setting_ids as $new_setting_id ) { - $this->manager->get_setting( $new_setting_id )->preview(); - } - } - } - - /** - * Determines whether the widgets panel is active, based on whether there are sidebars registered. - * - * @since 4.4.0 - * @access public - * - * @see WP_Customize_Panel::$active_callback - * - * @global array $wp_registered_sidebars - * @return bool Active. - */ - public function is_panel_active() { - global $wp_registered_sidebars; - return ! empty( $wp_registered_sidebars ); - } - - /** - * Converts a widget_id into its corresponding Customizer setting ID (option name). - * - * @since 3.9.0 - * @access public - * - * @param string $widget_id Widget ID. - * @return string Maybe-parsed widget ID. - */ - public function get_setting_id( $widget_id ) { - $parsed_widget_id = $this->parse_widget_id( $widget_id ); - $setting_id = sprintf( 'widget_%s', $parsed_widget_id['id_base'] ); - - if ( ! is_null( $parsed_widget_id['number'] ) ) { - $setting_id .= sprintf( '[%d]', $parsed_widget_id['number'] ); - } - return $setting_id; - } - - /** - * Determines whether the widget is considered "wide". - * - * Core widgets which may have controls wider than 250, but can still be shown - * in the narrow Customizer panel. The RSS and Text widgets in Core, for example, - * have widths of 400 and yet they still render fine in the Customizer panel. - * - * This method will return all Core widgets as being not wide, but this can be - * overridden with the {@see 'is_wide_widget_in_customizer'} filter. - * - * @since 3.9.0 - * @access public - * - * @global $wp_registered_widget_controls - * - * @param string $widget_id Widget ID. - * @return bool Whether or not the widget is a "wide" widget. - */ - public function is_wide_widget( $widget_id ) { - global $wp_registered_widget_controls; - - $parsed_widget_id = $this->parse_widget_id( $widget_id ); - $width = $wp_registered_widget_controls[$widget_id]['width']; - $is_core = in_array( $parsed_widget_id['id_base'], $this->core_widget_id_bases ); - $is_wide = ( $width > 250 && ! $is_core ); - - /** - * Filters whether the given widget is considered "wide". - * - * @since 3.9.0 - * - * @param bool $is_wide Whether the widget is wide, Default false. - * @param string $widget_id Widget ID. - */ - return apply_filters( 'is_wide_widget_in_customizer', $is_wide, $widget_id ); - } - - /** - * Converts a widget ID into its id_base and number components. - * - * @since 3.9.0 - * @access public - * - * @param string $widget_id Widget ID. - * @return array Array containing a widget's id_base and number components. - */ - public function parse_widget_id( $widget_id ) { - $parsed = array( - 'number' => null, - 'id_base' => null, - ); - - if ( preg_match( '/^(.+)-(\d+)$/', $widget_id, $matches ) ) { - $parsed['id_base'] = $matches[1]; - $parsed['number'] = intval( $matches[2] ); - } else { - // likely an old single widget - $parsed['id_base'] = $widget_id; - } - return $parsed; - } - - /** - * Converts a widget setting ID (option path) to its id_base and number components. - * - * @since 3.9.0 - * @access public - * - * @param string $setting_id Widget setting ID. - * @return WP_Error|array Array containing a widget's id_base and number components, - * or a WP_Error object. - */ - public function parse_widget_setting_id( $setting_id ) { - if ( ! preg_match( '/^(widget_(.+?))(?:\[(\d+)\])?$/', $setting_id, $matches ) ) { - return new WP_Error( 'widget_setting_invalid_id' ); - } - - $id_base = $matches[2]; - $number = isset( $matches[3] ) ? intval( $matches[3] ) : null; - - return compact( 'id_base', 'number' ); - } - - /** - * Calls admin_print_styles-widgets.php and admin_print_styles hooks to - * allow custom styles from plugins. - * - * @since 3.9.0 - * @access public - */ - public function print_styles() { - /** This action is documented in wp-admin/admin-header.php */ - do_action( 'admin_print_styles-widgets.php' ); - - /** This action is documented in wp-admin/admin-header.php */ - do_action( 'admin_print_styles' ); - } - - /** - * Calls admin_print_scripts-widgets.php and admin_print_scripts hooks to - * allow custom scripts from plugins. - * - * @since 3.9.0 - * @access public - */ - public function print_scripts() { - /** This action is documented in wp-admin/admin-header.php */ - do_action( 'admin_print_scripts-widgets.php' ); - - /** This action is documented in wp-admin/admin-header.php */ - do_action( 'admin_print_scripts' ); - } - - /** - * Enqueues scripts and styles for Customizer panel and export data to JavaScript. - * - * @since 3.9.0 - * @access public - * - * @global WP_Scripts $wp_scripts - * @global array $wp_registered_sidebars - * @global array $wp_registered_widgets - */ - public function enqueue_scripts() { - global $wp_scripts, $wp_registered_sidebars, $wp_registered_widgets; - - wp_enqueue_style( 'customize-widgets' ); - wp_enqueue_script( 'customize-widgets' ); - - /** This action is documented in wp-admin/admin-header.php */ - do_action( 'admin_enqueue_scripts', 'widgets.php' ); - - /* - * Export available widgets with control_tpl removed from model - * since plugins need templates to be in the DOM. - */ - $available_widgets = array(); - - foreach ( $this->get_available_widgets() as $available_widget ) { - unset( $available_widget['control_tpl'] ); - $available_widgets[] = $available_widget; - } - - $widget_reorder_nav_tpl = sprintf( - '<div class="widget-reorder-nav"><span class="move-widget" tabindex="0">%1$s</span><span class="move-widget-down" tabindex="0">%2$s</span><span class="move-widget-up" tabindex="0">%3$s</span></div>', - __( 'Move to another area…' ), - __( 'Move down' ), - __( 'Move up' ) - ); - - $move_widget_area_tpl = str_replace( - array( '{description}', '{btn}' ), - array( - __( 'Select an area to move this widget into:' ), - _x( 'Move', 'Move widget' ), - ), - '<div class="move-widget-area"> - <p class="description">{description}</p> - <ul class="widget-area-select"> - <% _.each( sidebars, function ( sidebar ){ %> - <li class="" data-id="<%- sidebar.id %>" title="<%- sidebar.description %>" tabindex="0"><%- sidebar.name %></li> - <% }); %> - </ul> - <div class="move-widget-actions"> - <button class="move-widget-btn button" type="button">{btn}</button> - </div> - </div>' - ); - - $settings = array( - 'registeredSidebars' => array_values( $wp_registered_sidebars ), - 'registeredWidgets' => $wp_registered_widgets, - 'availableWidgets' => $available_widgets, // @todo Merge this with registered_widgets - 'l10n' => array( - 'saveBtnLabel' => __( 'Apply' ), - 'saveBtnTooltip' => __( 'Save and preview changes before publishing them.' ), - 'removeBtnLabel' => __( 'Remove' ), - 'removeBtnTooltip' => __( 'Trash widget by moving it to the inactive widgets sidebar.' ), - 'error' => __( 'An error has occurred. Please reload the page and try again.' ), - 'widgetMovedUp' => __( 'Widget moved up' ), - 'widgetMovedDown' => __( 'Widget moved down' ), - 'noAreasRendered' => __( 'There are no widget areas on the page shown, however other pages in this theme do have them.' ), - 'reorderModeOn' => __( 'Reorder mode enabled' ), - 'reorderModeOff' => __( 'Reorder mode closed' ), - 'reorderLabelOn' => esc_attr__( 'Reorder widgets' ), - 'widgetsFound' => __( 'Number of widgets found: %d' ), - 'noWidgetsFound' => __( 'No widgets found.' ), - ), - 'tpl' => array( - 'widgetReorderNav' => $widget_reorder_nav_tpl, - 'moveWidgetArea' => $move_widget_area_tpl, - ), - 'selectiveRefreshableWidgets' => $this->get_selective_refreshable_widgets(), - ); - - foreach ( $settings['registeredWidgets'] as &$registered_widget ) { - unset( $registered_widget['callback'] ); // may not be JSON-serializeable - } - - $wp_scripts->add_data( - 'customize-widgets', - 'data', - sprintf( 'var _wpCustomizeWidgetsSettings = %s;', wp_json_encode( $settings ) ) - ); - } - - /** - * Renders the widget form control templates into the DOM. - * - * @since 3.9.0 - * @access public - */ - public function output_widget_control_templates() { - ?> - <div id="widgets-left"><!-- compatibility with JS which looks for widget templates here --> - <div id="available-widgets"> - <div class="customize-section-title"> - <button class="customize-section-back" tabindex="-1"> - <span class="screen-reader-text"><?php _e( 'Back' ); ?></span> - </button> - <h3> - <span class="customize-action"><?php - /* translators: ▸ is the unicode right-pointing triangle, and %s is the section title in the Customizer */ - echo sprintf( __( 'Customizing ▸ %s' ), esc_html( $this->manager->get_panel( 'widgets' )->title ) ); - ?></span> - <?php _e( 'Add a Widget' ); ?> - </h3> - </div> - <div id="available-widgets-filter"> - <label class="screen-reader-text" for="widgets-search"><?php _e( 'Search Widgets' ); ?></label> - <input type="text" id="widgets-search" placeholder="<?php esc_attr_e( 'Search widgets…' ) ?>" aria-describedby="widgets-search-desc" /> - <div class="search-icon" aria-hidden="true"></div> - <button type="button" class="clear-results"><span class="screen-reader-text"><?php _e( 'Clear Results' ); ?></span></button> - <p class="screen-reader-text" id="widgets-search-desc"><?php _e( 'The search results will be updated as you type.' ); ?></p> - </div> - <div id="available-widgets-list"> - <?php foreach ( $this->get_available_widgets() as $available_widget ): ?> - <div id="widget-tpl-<?php echo esc_attr( $available_widget['id'] ) ?>" data-widget-id="<?php echo esc_attr( $available_widget['id'] ) ?>" class="widget-tpl <?php echo esc_attr( $available_widget['id'] ) ?>" tabindex="0"> - <?php echo $available_widget['control_tpl']; ?> - </div> - <?php endforeach; ?> - <p class="no-widgets-found-message"><?php _e( 'No widgets found.' ); ?></p> - </div><!-- #available-widgets-list --> - </div><!-- #available-widgets --> - </div><!-- #widgets-left --> - <?php - } - - /** - * Calls admin_print_footer_scripts and admin_print_scripts hooks to - * allow custom scripts from plugins. - * - * @since 3.9.0 - * @access public - */ - public function print_footer_scripts() { - /** This action is documented in wp-admin/admin-footer.php */ - do_action( 'admin_print_footer_scripts-widgets.php' ); - - /** This action is documented in wp-admin/admin-footer.php */ - do_action( 'admin_print_footer_scripts' ); - - /** This action is documented in wp-admin/admin-footer.php */ - do_action( 'admin_footer-widgets.php' ); - } - - /** - * Retrieves common arguments to supply when constructing a Customizer setting. - * - * @since 3.9.0 - * @access public - * - * @param string $id Widget setting ID. - * @param array $overrides Array of setting overrides. - * @return array Possibly modified setting arguments. - */ - public function get_setting_args( $id, $overrides = array() ) { - $args = array( - 'type' => 'option', - 'capability' => 'edit_theme_options', - 'default' => array(), - ); - - if ( preg_match( $this->setting_id_patterns['sidebar_widgets'], $id, $matches ) ) { - $args['sanitize_callback'] = array( $this, 'sanitize_sidebar_widgets' ); - $args['sanitize_js_callback'] = array( $this, 'sanitize_sidebar_widgets_js_instance' ); - $args['transport'] = current_theme_supports( 'customize-selective-refresh-widgets' ) ? 'postMessage' : 'refresh'; - } elseif ( preg_match( $this->setting_id_patterns['widget_instance'], $id, $matches ) ) { - $args['sanitize_callback'] = array( $this, 'sanitize_widget_instance' ); - $args['sanitize_js_callback'] = array( $this, 'sanitize_widget_js_instance' ); - $args['transport'] = $this->is_widget_selective_refreshable( $matches['id_base'] ) ? 'postMessage' : 'refresh'; - } - - $args = array_merge( $args, $overrides ); - - /** - * Filters the common arguments supplied when constructing a Customizer setting. - * - * @since 3.9.0 - * - * @see WP_Customize_Setting - * - * @param array $args Array of Customizer setting arguments. - * @param string $id Widget setting ID. - */ - return apply_filters( 'widget_customizer_setting_args', $args, $id ); - } - - /** - * Ensures sidebar widget arrays only ever contain widget IDS. - * - * Used as the 'sanitize_callback' for each $sidebars_widgets setting. - * - * @since 3.9.0 - * @access public - * - * @param array $widget_ids Array of widget IDs. - * @return array Array of sanitized widget IDs. - */ - public function sanitize_sidebar_widgets( $widget_ids ) { - $widget_ids = array_map( 'strval', (array) $widget_ids ); - $sanitized_widget_ids = array(); - foreach ( $widget_ids as $widget_id ) { - $sanitized_widget_ids[] = preg_replace( '/[^a-z0-9_\-]/', '', $widget_id ); - } - return $sanitized_widget_ids; - } - - /** - * Builds up an index of all available widgets for use in Backbone models. - * - * @since 3.9.0 - * @access public - * - * @global array $wp_registered_widgets - * @global array $wp_registered_widget_controls - * @staticvar array $available_widgets - * - * @see wp_list_widgets() - * - * @return array List of available widgets. - */ - public function get_available_widgets() { - static $available_widgets = array(); - if ( ! empty( $available_widgets ) ) { - return $available_widgets; - } - - global $wp_registered_widgets, $wp_registered_widget_controls; - require_once ABSPATH . '/wp-admin/includes/widgets.php'; // for next_widget_id_number() - - $sort = $wp_registered_widgets; - usort( $sort, array( $this, '_sort_name_callback' ) ); - $done = array(); - - foreach ( $sort as $widget ) { - if ( in_array( $widget['callback'], $done, true ) ) { // We already showed this multi-widget - continue; - } - - $sidebar = is_active_widget( $widget['callback'], $widget['id'], false, false ); - $done[] = $widget['callback']; - - if ( ! isset( $widget['params'][0] ) ) { - $widget['params'][0] = array(); - } - - $available_widget = $widget; - unset( $available_widget['callback'] ); // not serializable to JSON - - $args = array( - 'widget_id' => $widget['id'], - 'widget_name' => $widget['name'], - '_display' => 'template', - ); - - $is_disabled = false; - $is_multi_widget = ( isset( $wp_registered_widget_controls[$widget['id']]['id_base'] ) && isset( $widget['params'][0]['number'] ) ); - if ( $is_multi_widget ) { - $id_base = $wp_registered_widget_controls[$widget['id']]['id_base']; - $args['_temp_id'] = "$id_base-__i__"; - $args['_multi_num'] = next_widget_id_number( $id_base ); - $args['_add'] = 'multi'; - } else { - $args['_add'] = 'single'; - - if ( $sidebar && 'wp_inactive_widgets' !== $sidebar ) { - $is_disabled = true; - } - $id_base = $widget['id']; - } - - $list_widget_controls_args = wp_list_widget_controls_dynamic_sidebar( array( 0 => $args, 1 => $widget['params'][0] ) ); - $control_tpl = $this->get_widget_control( $list_widget_controls_args ); - - // The properties here are mapped to the Backbone Widget model. - $available_widget = array_merge( $available_widget, array( - 'temp_id' => isset( $args['_temp_id'] ) ? $args['_temp_id'] : null, - 'is_multi' => $is_multi_widget, - 'control_tpl' => $control_tpl, - 'multi_number' => ( $args['_add'] === 'multi' ) ? $args['_multi_num'] : false, - 'is_disabled' => $is_disabled, - 'id_base' => $id_base, - 'transport' => $this->is_widget_selective_refreshable( $id_base ) ? 'postMessage' : 'refresh', - 'width' => $wp_registered_widget_controls[$widget['id']]['width'], - 'height' => $wp_registered_widget_controls[$widget['id']]['height'], - 'is_wide' => $this->is_wide_widget( $widget['id'] ), - ) ); - - $available_widgets[] = $available_widget; - } - - return $available_widgets; - } - - /** - * Naturally orders available widgets by name. - * - * @since 3.9.0 - * @access protected - * - * @param array $widget_a The first widget to compare. - * @param array $widget_b The second widget to compare. - * @return int Reorder position for the current widget comparison. - */ - protected function _sort_name_callback( $widget_a, $widget_b ) { - return strnatcasecmp( $widget_a['name'], $widget_b['name'] ); - } - - /** - * Retrieves the widget control markup. - * - * @since 3.9.0 - * @access public - * - * @param array $args Widget control arguments. - * @return string Widget control form HTML markup. - */ - public function get_widget_control( $args ) { - $args[0]['before_form'] = '<div class="form">'; - $args[0]['after_form'] = '</div><!-- .form -->'; - $args[0]['before_widget_content'] = '<div class="widget-content">'; - $args[0]['after_widget_content'] = '</div><!-- .widget-content -->'; - ob_start(); - call_user_func_array( 'wp_widget_control', $args ); - $control_tpl = ob_get_clean(); - return $control_tpl; - } - - /** - * Retrieves the widget control markup parts. - * - * @since 4.4.0 - * @access public - * - * @param array $args Widget control arguments. - * @return array { - * @type string $control Markup for widget control wrapping form. - * @type string $content The contents of the widget form itself. - * } - */ - public function get_widget_control_parts( $args ) { - $args[0]['before_widget_content'] = '<div class="widget-content">'; - $args[0]['after_widget_content'] = '</div><!-- .widget-content -->'; - $control_markup = $this->get_widget_control( $args ); - - $content_start_pos = strpos( $control_markup, $args[0]['before_widget_content'] ); - $content_end_pos = strrpos( $control_markup, $args[0]['after_widget_content'] ); - - $control = substr( $control_markup, 0, $content_start_pos + strlen( $args[0]['before_widget_content'] ) ); - $control .= substr( $control_markup, $content_end_pos ); - $content = trim( substr( - $control_markup, - $content_start_pos + strlen( $args[0]['before_widget_content'] ), - $content_end_pos - $content_start_pos - strlen( $args[0]['before_widget_content'] ) - ) ); - - return compact( 'control', 'content' ); - } - - /** - * Adds hooks for the Customizer preview. - * - * @since 3.9.0 - * @access public - */ - public function customize_preview_init() { - add_action( 'wp_enqueue_scripts', array( $this, 'customize_preview_enqueue' ) ); - add_action( 'wp_print_styles', array( $this, 'print_preview_css' ), 1 ); - add_action( 'wp_footer', array( $this, 'export_preview_data' ), 20 ); - } - - /** - * Refreshes the nonce for widget updates. - * - * @since 4.2.0 - * @access public - * - * @param array $nonces Array of nonces. - * @return array $nonces Array of nonces. - */ - public function refresh_nonces( $nonces ) { - $nonces['update-widget'] = wp_create_nonce( 'update-widget' ); - return $nonces; - } - - /** - * When previewing, ensures the proper previewing widgets are used. - * - * Because wp_get_sidebars_widgets() gets called early at {@see 'init' } (via - * wp_convert_widget_settings()) and can set global variable `$_wp_sidebars_widgets` - * to the value of `get_option( 'sidebars_widgets' )` before the Customizer preview - * filter is added, it has to be reset after the filter has been added. - * - * @since 3.9.0 - * @access public - * - * @param array $sidebars_widgets List of widgets for the current sidebar. - * @return array - */ - public function preview_sidebars_widgets( $sidebars_widgets ) { - $sidebars_widgets = get_option( 'sidebars_widgets', array() ); - - unset( $sidebars_widgets['array_version'] ); - return $sidebars_widgets; - } - - /** - * Enqueues scripts for the Customizer preview. - * - * @since 3.9.0 - * @access public - */ - public function customize_preview_enqueue() { - wp_enqueue_script( 'customize-preview-widgets' ); - } - - /** - * Inserts default style for highlighted widget at early point so theme - * stylesheet can override. - * - * @since 3.9.0 - * @access public - */ - public function print_preview_css() { - ?> - <style> - .widget-customizer-highlighted-widget { - outline: none; - -webkit-box-shadow: 0 0 2px rgba(30,140,190,0.8); - box-shadow: 0 0 2px rgba(30,140,190,0.8); - position: relative; - z-index: 1; - } - </style> - <?php - } - - /** - * Communicates the sidebars that appeared on the page at the very end of the page, - * and at the very end of the wp_footer, - * - * @since 3.9.0 - * @access public - * - * @global array $wp_registered_sidebars - * @global array $wp_registered_widgets - */ - public function export_preview_data() { - global $wp_registered_sidebars, $wp_registered_widgets; - - $switched_locale = switch_to_locale( get_user_locale() ); - $l10n = array( - 'widgetTooltip' => __( 'Shift-click to edit this widget.' ), - ); - if ( $switched_locale ) { - restore_previous_locale(); - } - - // Prepare Customizer settings to pass to JavaScript. - $settings = array( - 'renderedSidebars' => array_fill_keys( array_unique( $this->rendered_sidebars ), true ), - 'renderedWidgets' => array_fill_keys( array_keys( $this->rendered_widgets ), true ), - 'registeredSidebars' => array_values( $wp_registered_sidebars ), - 'registeredWidgets' => $wp_registered_widgets, - 'l10n' => $l10n, - 'selectiveRefreshableWidgets' => $this->get_selective_refreshable_widgets(), - ); - foreach ( $settings['registeredWidgets'] as &$registered_widget ) { - unset( $registered_widget['callback'] ); // may not be JSON-serializeable - } - - ?> - <script type="text/javascript"> - var _wpWidgetCustomizerPreviewSettings = <?php echo wp_json_encode( $settings ); ?>; - </script> - <?php - } - - /** - * Tracks the widgets that were rendered. - * - * @since 3.9.0 - * @access public - * - * @param array $widget Rendered widget to tally. - */ - public function tally_rendered_widgets( $widget ) { - $this->rendered_widgets[ $widget['id'] ] = true; - } - - /** - * Determine if a widget is rendered on the page. - * - * @since 4.0.0 - * @access public - * - * @param string $widget_id Widget ID to check. - * @return bool Whether the widget is rendered. - */ - public function is_widget_rendered( $widget_id ) { - return in_array( $widget_id, $this->rendered_widgets ); - } - - /** - * Determines if a sidebar is rendered on the page. - * - * @since 4.0.0 - * @access public - * - * @param string $sidebar_id Sidebar ID to check. - * @return bool Whether the sidebar is rendered. - */ - public function is_sidebar_rendered( $sidebar_id ) { - return in_array( $sidebar_id, $this->rendered_sidebars ); - } - - /** - * Tallies the sidebars rendered via is_active_sidebar(). - * - * Keep track of the times that is_active_sidebar() is called in the template, - * and assume that this means that the sidebar would be rendered on the template - * if there were widgets populating it. - * - * @since 3.9.0 - * @access public - * - * @param bool $is_active Whether the sidebar is active. - * @param string $sidebar_id Sidebar ID. - * @return bool Whether the sidebar is active. - */ - public function tally_sidebars_via_is_active_sidebar_calls( $is_active, $sidebar_id ) { - if ( is_registered_sidebar( $sidebar_id ) ) { - $this->rendered_sidebars[] = $sidebar_id; - } - /* - * We may need to force this to true, and also force-true the value - * for 'dynamic_sidebar_has_widgets' if we want to ensure that there - * is an area to drop widgets into, if the sidebar is empty. - */ - return $is_active; - } - - /** - * Tallies the sidebars rendered via dynamic_sidebar(). - * - * Keep track of the times that dynamic_sidebar() is called in the template, - * and assume this means the sidebar would be rendered on the template if - * there were widgets populating it. - * - * @since 3.9.0 - * @access public - * - * @param bool $has_widgets Whether the current sidebar has widgets. - * @param string $sidebar_id Sidebar ID. - * @return bool Whether the current sidebar has widgets. - */ - public function tally_sidebars_via_dynamic_sidebar_calls( $has_widgets, $sidebar_id ) { - if ( is_registered_sidebar( $sidebar_id ) ) { - $this->rendered_sidebars[] = $sidebar_id; - } - - /* - * We may need to force this to true, and also force-true the value - * for 'is_active_sidebar' if we want to ensure there is an area to - * drop widgets into, if the sidebar is empty. - */ - return $has_widgets; - } - - /** - * Retrieves MAC for a serialized widget instance string. - * - * Allows values posted back from JS to be rejected if any tampering of the - * data has occurred. - * - * @since 3.9.0 - * @access protected - * - * @param string $serialized_instance Widget instance. - * @return string MAC for serialized widget instance. - */ - protected function get_instance_hash_key( $serialized_instance ) { - return wp_hash( $serialized_instance ); - } - - /** - * Sanitizes a widget instance. - * - * Unserialize the JS-instance for storing in the options. It's important that this filter - * only get applied to an instance *once*. - * - * @since 3.9.0 - * @access public - * - * @param array $value Widget instance to sanitize. - * @return array|void Sanitized widget instance. - */ - public function sanitize_widget_instance( $value ) { - if ( $value === array() ) { - return $value; - } - - if ( empty( $value['is_widget_customizer_js_value'] ) - || empty( $value['instance_hash_key'] ) - || empty( $value['encoded_serialized_instance'] ) ) - { - return; - } - - $decoded = base64_decode( $value['encoded_serialized_instance'], true ); - if ( false === $decoded ) { - return; - } - - if ( ! hash_equals( $this->get_instance_hash_key( $decoded ), $value['instance_hash_key'] ) ) { - return; - } - - $instance = unserialize( $decoded ); - if ( false === $instance ) { - return; - } - - return $instance; - } - - /** - * Converts a widget instance into JSON-representable format. - * - * @since 3.9.0 - * @access public - * - * @param array $value Widget instance to convert to JSON. - * @return array JSON-converted widget instance. - */ - public function sanitize_widget_js_instance( $value ) { - if ( empty( $value['is_widget_customizer_js_value'] ) ) { - $serialized = serialize( $value ); - - $value = array( - 'encoded_serialized_instance' => base64_encode( $serialized ), - 'title' => empty( $value['title'] ) ? '' : $value['title'], - 'is_widget_customizer_js_value' => true, - 'instance_hash_key' => $this->get_instance_hash_key( $serialized ), - ); - } - return $value; - } - - /** - * Strips out widget IDs for widgets which are no longer registered. - * - * One example where this might happen is when a plugin orphans a widget - * in a sidebar upon deactivation. - * - * @since 3.9.0 - * @access public - * - * @global array $wp_registered_widgets - * - * @param array $widget_ids List of widget IDs. - * @return array Parsed list of widget IDs. - */ - public function sanitize_sidebar_widgets_js_instance( $widget_ids ) { - global $wp_registered_widgets; - $widget_ids = array_values( array_intersect( $widget_ids, array_keys( $wp_registered_widgets ) ) ); - return $widget_ids; - } - - /** - * Finds and invokes the widget update and control callbacks. - * - * Requires that `$_POST` be populated with the instance data. - * - * @since 3.9.0 - * @access public - * - * @global array $wp_registered_widget_updates - * @global array $wp_registered_widget_controls - * - * @param string $widget_id Widget ID. - * @return WP_Error|array Array containing the updated widget information. - * A WP_Error object, otherwise. - */ - public function call_widget_update( $widget_id ) { - global $wp_registered_widget_updates, $wp_registered_widget_controls; - - $setting_id = $this->get_setting_id( $widget_id ); - - /* - * Make sure that other setting changes have previewed since this widget - * may depend on them (e.g. Menus being present for Custom Menu widget). - */ - if ( ! did_action( 'customize_preview_init' ) ) { - foreach ( $this->manager->settings() as $setting ) { - if ( $setting->id !== $setting_id ) { - $setting->preview(); - } - } - } - - $this->start_capturing_option_updates(); - $parsed_id = $this->parse_widget_id( $widget_id ); - $option_name = 'widget_' . $parsed_id['id_base']; - - /* - * If a previously-sanitized instance is provided, populate the input vars - * with its values so that the widget update callback will read this instance - */ - $added_input_vars = array(); - if ( ! empty( $_POST['sanitized_widget_setting'] ) ) { - $sanitized_widget_setting = json_decode( $this->get_post_value( 'sanitized_widget_setting' ), true ); - if ( false === $sanitized_widget_setting ) { - $this->stop_capturing_option_updates(); - return new WP_Error( 'widget_setting_malformed' ); - } - - $instance = $this->sanitize_widget_instance( $sanitized_widget_setting ); - if ( is_null( $instance ) ) { - $this->stop_capturing_option_updates(); - return new WP_Error( 'widget_setting_unsanitized' ); - } - - if ( ! is_null( $parsed_id['number'] ) ) { - $value = array(); - $value[$parsed_id['number']] = $instance; - $key = 'widget-' . $parsed_id['id_base']; - $_REQUEST[$key] = $_POST[$key] = wp_slash( $value ); - $added_input_vars[] = $key; - } else { - foreach ( $instance as $key => $value ) { - $_REQUEST[$key] = $_POST[$key] = wp_slash( $value ); - $added_input_vars[] = $key; - } - } - } - - // Invoke the widget update callback. - foreach ( (array) $wp_registered_widget_updates as $name => $control ) { - if ( $name === $parsed_id['id_base'] && is_callable( $control['callback'] ) ) { - ob_start(); - call_user_func_array( $control['callback'], $control['params'] ); - ob_end_clean(); - break; - } - } - - // Clean up any input vars that were manually added - foreach ( $added_input_vars as $key ) { - unset( $_POST[ $key ] ); - unset( $_REQUEST[ $key ] ); - } - - // Make sure the expected option was updated. - if ( 0 !== $this->count_captured_options() ) { - if ( $this->count_captured_options() > 1 ) { - $this->stop_capturing_option_updates(); - return new WP_Error( 'widget_setting_too_many_options' ); - } - - $updated_option_name = key( $this->get_captured_options() ); - if ( $updated_option_name !== $option_name ) { - $this->stop_capturing_option_updates(); - return new WP_Error( 'widget_setting_unexpected_option' ); - } - } - - // Obtain the widget instance. - $option = $this->get_captured_option( $option_name ); - if ( null !== $parsed_id['number'] ) { - $instance = $option[ $parsed_id['number'] ]; - } else { - $instance = $option; - } - - /* - * Override the incoming $_POST['customized'] for a newly-created widget's - * setting with the new $instance so that the preview filter currently - * in place from WP_Customize_Setting::preview() will use this value - * instead of the default widget instance value (an empty array). - */ - $this->manager->set_post_value( $setting_id, $this->sanitize_widget_js_instance( $instance ) ); - - // Obtain the widget control with the updated instance in place. - ob_start(); - $form = $wp_registered_widget_controls[ $widget_id ]; - if ( $form ) { - call_user_func_array( $form['callback'], $form['params'] ); - } - $form = ob_get_clean(); - - $this->stop_capturing_option_updates(); - - return compact( 'instance', 'form' ); - } - - /** - * Updates widget settings asynchronously. - * - * Allows the Customizer to update a widget using its form, but return the new - * instance info via Ajax instead of saving it to the options table. - * - * Most code here copied from wp_ajax_save_widget(). - * - * @since 3.9.0 - * @access public - * - * @see wp_ajax_save_widget() - */ - public function wp_ajax_update_widget() { - - if ( ! is_user_logged_in() ) { - wp_die( 0 ); - } - - check_ajax_referer( 'update-widget', 'nonce' ); - - if ( ! current_user_can( 'edit_theme_options' ) ) { - wp_die( -1 ); - } - - if ( empty( $_POST['widget-id'] ) ) { - wp_send_json_error( 'missing_widget-id' ); - } - - /** This action is documented in wp-admin/includes/ajax-actions.php */ - do_action( 'load-widgets.php' ); - - /** This action is documented in wp-admin/includes/ajax-actions.php */ - do_action( 'widgets.php' ); - - /** This action is documented in wp-admin/widgets.php */ - do_action( 'sidebar_admin_setup' ); - - $widget_id = $this->get_post_value( 'widget-id' ); - $parsed_id = $this->parse_widget_id( $widget_id ); - $id_base = $parsed_id['id_base']; - - $is_updating_widget_template = ( - isset( $_POST[ 'widget-' . $id_base ] ) - && - is_array( $_POST[ 'widget-' . $id_base ] ) - && - preg_match( '/__i__|%i%/', key( $_POST[ 'widget-' . $id_base ] ) ) - ); - if ( $is_updating_widget_template ) { - wp_send_json_error( 'template_widget_not_updatable' ); - } - - $updated_widget = $this->call_widget_update( $widget_id ); // => {instance,form} - if ( is_wp_error( $updated_widget ) ) { - wp_send_json_error( $updated_widget->get_error_code() ); - } - - $form = $updated_widget['form']; - $instance = $this->sanitize_widget_js_instance( $updated_widget['instance'] ); - - wp_send_json_success( compact( 'form', 'instance' ) ); - } - - /* - * Selective Refresh Methods - */ - - /** - * Filters arguments for dynamic widget partials. - * - * @since 4.5.0 - * @access public - * - * @param array|false $partial_args Partial arguments. - * @param string $partial_id Partial ID. - * @return array (Maybe) modified partial arguments. - */ - public function customize_dynamic_partial_args( $partial_args, $partial_id ) { - if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) { - return $partial_args; - } - - if ( preg_match( '/^widget\[(?P<widget_id>.+)\]$/', $partial_id, $matches ) ) { - if ( false === $partial_args ) { - $partial_args = array(); - } - $partial_args = array_merge( - $partial_args, - array( - 'type' => 'widget', - 'render_callback' => array( $this, 'render_widget_partial' ), - 'container_inclusive' => true, - 'settings' => array( $this->get_setting_id( $matches['widget_id'] ) ), - 'capability' => 'edit_theme_options', - ) - ); - } - - return $partial_args; - } - - /** - * Adds hooks for selective refresh. - * - * @since 4.5.0 - * @access public - */ - public function selective_refresh_init() { - if ( ! current_theme_supports( 'customize-selective-refresh-widgets' ) ) { - return; - } - add_filter( 'dynamic_sidebar_params', array( $this, 'filter_dynamic_sidebar_params' ) ); - add_filter( 'wp_kses_allowed_html', array( $this, 'filter_wp_kses_allowed_data_attributes' ) ); - add_action( 'dynamic_sidebar_before', array( $this, 'start_dynamic_sidebar' ) ); - add_action( 'dynamic_sidebar_after', array( $this, 'end_dynamic_sidebar' ) ); - } - - /** - * Inject selective refresh data attributes into widget container elements. - * - * @param array $params { - * Dynamic sidebar params. - * - * @type array $args Sidebar args. - * @type array $widget_args Widget args. - * } - * @see WP_Customize_Nav_Menus_Partial_Refresh::filter_wp_nav_menu_args() - * - * @return array Params. - */ - public function filter_dynamic_sidebar_params( $params ) { - $sidebar_args = array_merge( - array( - 'before_widget' => '', - 'after_widget' => '', - ), - $params[0] - ); - - // Skip widgets not in a registered sidebar or ones which lack a proper wrapper element to attach the data-* attributes to. - $matches = array(); - $is_valid = ( - isset( $sidebar_args['id'] ) - && - is_registered_sidebar( $sidebar_args['id'] ) - && - ( isset( $this->current_dynamic_sidebar_id_stack[0] ) && $this->current_dynamic_sidebar_id_stack[0] === $sidebar_args['id'] ) - && - preg_match( '#^<(?P<tag_name>\w+)#', $sidebar_args['before_widget'], $matches ) - ); - if ( ! $is_valid ) { - return $params; - } - $this->before_widget_tags_seen[ $matches['tag_name'] ] = true; - - $context = array( - 'sidebar_id' => $sidebar_args['id'], - ); - if ( isset( $this->context_sidebar_instance_number ) ) { - $context['sidebar_instance_number'] = $this->context_sidebar_instance_number; - } else if ( isset( $sidebar_args['id'] ) && isset( $this->sidebar_instance_count[ $sidebar_args['id'] ] ) ) { - $context['sidebar_instance_number'] = $this->sidebar_instance_count[ $sidebar_args['id'] ]; - } - - $attributes = sprintf( ' data-customize-partial-id="%s"', esc_attr( 'widget[' . $sidebar_args['widget_id'] . ']' ) ); - $attributes .= ' data-customize-partial-type="widget"'; - $attributes .= sprintf( ' data-customize-partial-placement-context="%s"', esc_attr( wp_json_encode( $context ) ) ); - $attributes .= sprintf( ' data-customize-widget-id="%s"', esc_attr( $sidebar_args['widget_id'] ) ); - $sidebar_args['before_widget'] = preg_replace( '#^(<\w+)#', '$1 ' . $attributes, $sidebar_args['before_widget'] ); - - $params[0] = $sidebar_args; - return $params; - } - - /** - * List of the tag names seen for before_widget strings. - * - * This is used in the {@see 'filter_wp_kses_allowed_html'} filter to ensure that the - * data-* attributes can be whitelisted. - * - * @since 4.5.0 - * @access protected - * @var array - */ - protected $before_widget_tags_seen = array(); - - /** - * Ensures the HTML data-* attributes for selective refresh are allowed by kses. - * - * This is needed in case the `$before_widget` is run through wp_kses() when printed. - * - * @since 4.5.0 - * @access public - * - * @param array $allowed_html Allowed HTML. - * @return array (Maybe) modified allowed HTML. - */ - public function filter_wp_kses_allowed_data_attributes( $allowed_html ) { - foreach ( array_keys( $this->before_widget_tags_seen ) as $tag_name ) { - if ( ! isset( $allowed_html[ $tag_name ] ) ) { - $allowed_html[ $tag_name ] = array(); - } - $allowed_html[ $tag_name ] = array_merge( - $allowed_html[ $tag_name ], - array_fill_keys( array( - 'data-customize-partial-id', - 'data-customize-partial-type', - 'data-customize-partial-placement-context', - 'data-customize-partial-widget-id', - 'data-customize-partial-options', - ), true ) - ); - } - return $allowed_html; - } - - /** - * Keep track of the number of times that dynamic_sidebar() was called for a given sidebar index. - * - * This helps facilitate the uncommon scenario where a single sidebar is rendered multiple times on a template. - * - * @since 4.5.0 - * @access protected - * @var array - */ - protected $sidebar_instance_count = array(); - - /** - * The current request's sidebar_instance_number context. - * - * @since 4.5.0 - * @access protected - * @var int - */ - protected $context_sidebar_instance_number; - - /** - * Current sidebar ID being rendered. - * - * @since 4.5.0 - * @access protected - * @var array - */ - protected $current_dynamic_sidebar_id_stack = array(); - - /** - * Begins keeping track of the current sidebar being rendered. - * - * Insert marker before widgets are rendered in a dynamic sidebar. - * - * @since 4.5.0 - * @access public - * - * @param int|string $index Index, name, or ID of the dynamic sidebar. - */ - public function start_dynamic_sidebar( $index ) { - array_unshift( $this->current_dynamic_sidebar_id_stack, $index ); - if ( ! isset( $this->sidebar_instance_count[ $index ] ) ) { - $this->sidebar_instance_count[ $index ] = 0; - } - $this->sidebar_instance_count[ $index ] += 1; - if ( ! $this->manager->selective_refresh->is_render_partials_request() ) { - printf( "\n<!--dynamic_sidebar_before:%s:%d-->\n", esc_html( $index ), intval( $this->sidebar_instance_count[ $index ] ) ); - } - } - - /** - * Finishes keeping track of the current sidebar being rendered. - * - * Inserts a marker after widgets are rendered in a dynamic sidebar. - * - * @since 4.5.0 - * @access public - * - * @param int|string $index Index, name, or ID of the dynamic sidebar. - */ - public function end_dynamic_sidebar( $index ) { - array_shift( $this->current_dynamic_sidebar_id_stack ); - if ( ! $this->manager->selective_refresh->is_render_partials_request() ) { - printf( "\n<!--dynamic_sidebar_after:%s:%d-->\n", esc_html( $index ), intval( $this->sidebar_instance_count[ $index ] ) ); - } - } - - /** - * Current sidebar being rendered. - * - * @since 4.5.0 - * @access protected - * @var string - */ - protected $rendering_widget_id; - - /** - * Current widget being rendered. - * - * @since 4.5.0 - * @access protected - * @var string - */ - protected $rendering_sidebar_id; - - /** - * Filters sidebars_widgets to ensure the currently-rendered widget is the only widget in the current sidebar. - * - * @since 4.5.0 - * @access protected - * - * @param array $sidebars_widgets Sidebars widgets. - * @return array Filtered sidebars widgets. - */ - public function filter_sidebars_widgets_for_rendering_widget( $sidebars_widgets ) { - $sidebars_widgets[ $this->rendering_sidebar_id ] = array( $this->rendering_widget_id ); - return $sidebars_widgets; - } - - /** - * Renders a specific widget using the supplied sidebar arguments. - * - * @since 4.5.0 - * @access public - * - * @see dynamic_sidebar() - * - * @param WP_Customize_Partial $partial Partial. - * @param array $context { - * Sidebar args supplied as container context. - * - * @type string $sidebar_id ID for sidebar for widget to render into. - * @type int $sidebar_instance_number Disambiguating instance number. - * } - * @return string|false - */ - public function render_widget_partial( $partial, $context ) { - $id_data = $partial->id_data(); - $widget_id = array_shift( $id_data['keys'] ); - - if ( ! is_array( $context ) - || empty( $context['sidebar_id'] ) - || ! is_registered_sidebar( $context['sidebar_id'] ) - ) { - return false; - } - - $this->rendering_sidebar_id = $context['sidebar_id']; - - if ( isset( $context['sidebar_instance_number'] ) ) { - $this->context_sidebar_instance_number = intval( $context['sidebar_instance_number'] ); - } - - // Filter sidebars_widgets so that only the queried widget is in the sidebar. - $this->rendering_widget_id = $widget_id; - - $filter_callback = array( $this, 'filter_sidebars_widgets_for_rendering_widget' ); - add_filter( 'sidebars_widgets', $filter_callback, 1000 ); - - // Render the widget. - ob_start(); - dynamic_sidebar( $this->rendering_sidebar_id = $context['sidebar_id'] ); - $container = ob_get_clean(); - - // Reset variables for next partial render. - remove_filter( 'sidebars_widgets', $filter_callback, 1000 ); - - $this->context_sidebar_instance_number = null; - $this->rendering_sidebar_id = null; - $this->rendering_widget_id = null; - - return $container; - } - - // - // Option Update Capturing - // - - /** - * List of captured widget option updates. - * - * @since 3.9.0 - * @access protected - * @var array $_captured_options Values updated while option capture is happening. - */ - protected $_captured_options = array(); - - /** - * Whether option capture is currently happening. - * - * @since 3.9.0 - * @access protected - * @var bool $_is_current Whether option capture is currently happening or not. - */ - protected $_is_capturing_option_updates = false; - - /** - * Determines whether the captured option update should be ignored. - * - * @since 3.9.0 - * @access protected - * - * @param string $option_name Option name. - * @return bool Whether the option capture is ignored. - */ - protected function is_option_capture_ignored( $option_name ) { - return ( 0 === strpos( $option_name, '_transient_' ) ); - } - - /** - * Retrieves captured widget option updates. - * - * @since 3.9.0 - * @access protected - * - * @return array Array of captured options. - */ - protected function get_captured_options() { - return $this->_captured_options; - } - - /** - * Retrieves the option that was captured from being saved. - * - * @since 4.2.0 - * @access protected - * - * @param string $option_name Option name. - * @param mixed $default Optional. Default value to return if the option does not exist. Default false. - * @return mixed Value set for the option. - */ - protected function get_captured_option( $option_name, $default = false ) { - if ( array_key_exists( $option_name, $this->_captured_options ) ) { - $value = $this->_captured_options[ $option_name ]; - } else { - $value = $default; - } - return $value; - } - - /** - * Retrieves the number of captured widget option updates. - * - * @since 3.9.0 - * @access protected - * - * @return int Number of updated options. - */ - protected function count_captured_options() { - return count( $this->_captured_options ); - } - - /** - * Begins keeping track of changes to widget options, caching new values. - * - * @since 3.9.0 - * @access protected - */ - protected function start_capturing_option_updates() { - if ( $this->_is_capturing_option_updates ) { - return; - } - - $this->_is_capturing_option_updates = true; - - add_filter( 'pre_update_option', array( $this, 'capture_filter_pre_update_option' ), 10, 3 ); - } - - /** - * Pre-filters captured option values before updating. - * - * @since 3.9.0 - * @access public - * - * @param mixed $new_value The new option value. - * @param string $option_name Name of the option. - * @param mixed $old_value The old option value. - * @return mixed Filtered option value. - */ - public function capture_filter_pre_update_option( $new_value, $option_name, $old_value ) { - if ( $this->is_option_capture_ignored( $option_name ) ) { - return; - } - - if ( ! isset( $this->_captured_options[ $option_name ] ) ) { - add_filter( "pre_option_{$option_name}", array( $this, 'capture_filter_pre_get_option' ) ); - } - - $this->_captured_options[ $option_name ] = $new_value; - - return $old_value; - } - - /** - * Pre-filters captured option values before retrieving. - * - * @since 3.9.0 - * @access public - * - * @param mixed $value Value to return instead of the option value. - * @return mixed Filtered option value. - */ - public function capture_filter_pre_get_option( $value ) { - $option_name = preg_replace( '/^pre_option_/', '', current_filter() ); - - if ( isset( $this->_captured_options[ $option_name ] ) ) { - $value = $this->_captured_options[ $option_name ]; - - /** This filter is documented in wp-includes/option.php */ - $value = apply_filters( 'option_' . $option_name, $value ); - } - - return $value; - } - - /** - * Undoes any changes to the options since options capture began. - * - * @since 3.9.0 - * @access protected - */ - protected function stop_capturing_option_updates() { - if ( ! $this->_is_capturing_option_updates ) { - return; - } - - remove_filter( 'pre_update_option', array( $this, 'capture_filter_pre_update_option' ), 10 ); - - foreach ( array_keys( $this->_captured_options ) as $option_name ) { - remove_filter( "pre_option_{$option_name}", array( $this, 'capture_filter_pre_get_option' ) ); - } - - $this->_captured_options = array(); - $this->_is_capturing_option_updates = false; - } - - /** - * {@internal Missing Summary} - * - * See the {@see 'customize_dynamic_setting_args'} filter. - * - * @since 3.9.0 - * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter. - */ - public function setup_widget_addition_previews() { - _deprecated_function( __METHOD__, '4.2.0' ); - } - - /** - * {@internal Missing Summary} - * - * See the {@see 'customize_dynamic_setting_args'} filter. - * - * @since 3.9.0 - * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter. - */ - public function prepreview_added_sidebars_widgets() { - _deprecated_function( __METHOD__, '4.2.0' ); - } - - /** - * {@internal Missing Summary} - * - * See the {@see 'customize_dynamic_setting_args'} filter. - * - * @since 3.9.0 - * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter. - */ - public function prepreview_added_widget_instance() { - _deprecated_function( __METHOD__, '4.2.0' ); - } - - /** - * {@internal Missing Summary} - * - * See the {@see 'customize_dynamic_setting_args'} filter. - * - * @since 3.9.0 - * @deprecated 4.2.0 Deprecated in favor of the {@see 'customize_dynamic_setting_args'} filter. - */ - public function remove_prepreview_filters() { - _deprecated_function( __METHOD__, '4.2.0' ); - } -} diff --git a/wp/wp-includes/class-wp-dependency.php b/wp/wp-includes/class-wp-dependency.php deleted file mode 100644 index 92c54561..00000000 --- a/wp/wp-includes/class-wp-dependency.php +++ /dev/null @@ -1,104 +0,0 @@ -<?php -/** - * Dependencies API: _WP_Dependency class - * - * @since 4.7.0 - * - * @package WordPress - * @subpackage Dependencies - */ - -/** - * Class _WP_Dependency - * - * Helper class to register a handle and associated data. - * - * @access private - * @since 2.6.0 - */ -class _WP_Dependency { - /** - * The handle name. - * - * @access public - * @since 2.6.0 - * @var null - */ - public $handle; - - /** - * The handle source. - * - * @access public - * @since 2.6.0 - * @var null - */ - public $src; - - /** - * An array of handle dependencies. - * - * @access public - * @since 2.6.0 - * @var array - */ - public $deps = array(); - - /** - * The handle version. - * - * Used for cache-busting. - * - * @access public - * @since 2.6.0 - * @var bool|string - */ - public $ver = false; - - /** - * Additional arguments for the handle. - * - * @access public - * @since 2.6.0 - * @var null - */ - public $args = null; // Custom property, such as $in_footer or $media. - - /** - * Extra data to supply to the handle. - * - * @access public - * @since 2.6.0 - * @var array - */ - public $extra = array(); - - /** - * Setup dependencies. - * - * @since 2.6.0 - */ - public function __construct() { - @list( $this->handle, $this->src, $this->deps, $this->ver, $this->args ) = func_get_args(); - if ( ! is_array($this->deps) ) - $this->deps = array(); - } - - /** - * Add handle data. - * - * @access public - * @since 2.6.0 - * - * @param string $name The data key to add. - * @param mixed $data The data value to add. - * @return bool False if not scalar, true otherwise. - */ - public function add_data( $name, $data ) { - if ( !is_scalar($name) ) - return false; - $this->extra[$name] = $data; - return true; - } - -} diff --git a/wp/wp-includes/class-wp-editor.php b/wp/wp-includes/class-wp-editor.php deleted file mode 100644 index 1d2c75c1..00000000 --- a/wp/wp-includes/class-wp-editor.php +++ /dev/null @@ -1,1501 +0,0 @@ -<?php -/** - * Facilitates adding of the WordPress editor as used on the Write and Edit screens. - * - * @package WordPress - * @since 3.3.0 - * - * Private, not included by default. See wp_editor() in wp-includes/general-template.php. - */ - -final class _WP_Editors { - public static $mce_locale; - - private static $mce_settings = array(); - private static $qt_settings = array(); - private static $plugins = array(); - private static $qt_buttons = array(); - private static $ext_plugins; - private static $baseurl; - private static $first_init; - private static $this_tinymce = false; - private static $this_quicktags = false; - private static $has_tinymce = false; - private static $has_quicktags = false; - private static $has_medialib = false; - private static $editor_buttons_css = true; - private static $drag_drop_upload = false; - private static $old_dfw_compat = false; - private static $translation; - - private function __construct() {} - - /** - * Parse default arguments for the editor instance. - * - * @static - * @param string $editor_id ID for the current editor instance. - * @param array $settings { - * Array of editor arguments. - * - * @type bool $wpautop Whether to use wpautop(). Default true. - * @type bool $media_buttons Whether to show the Add Media/other media buttons. - * @type string $default_editor When both TinyMCE and Quicktags are used, set which - * editor is shown on page load. Default empty. - * @type bool $drag_drop_upload Whether to enable drag & drop on the editor uploading. Default false. - * Requires the media modal. - * @type string $textarea_name Give the textarea a unique name here. Square brackets - * can be used here. Default $editor_id. - * @type int $textarea_rows Number rows in the editor textarea. Default 20. - * @type string|int $tabindex Tabindex value to use. Default empty. - * @type string $tabfocus_elements The previous and next element ID to move the focus to - * when pressing the Tab key in TinyMCE. Default ':prev,:next'. - * @type string $editor_css Intended for extra styles for both Visual and Text editors. - * Should include `<style>` tags, and can use "scoped". Default empty. - * @type string $editor_class Extra classes to add to the editor textarea element. Default empty. - * @type bool $teeny Whether to output the minimal editor config. Examples include - * Press This and the Comment editor. Default false. - * @type bool $dfw Deprecated in 4.1. Since 4.3 used only to enqueue wp-fullscreen-stub.js - * for backward compatibility. - * @type bool|array $tinymce Whether to load TinyMCE. Can be used to pass settings directly to - * TinyMCE using an array. Default true. - * @type bool|array $quicktags Whether to load Quicktags. Can be used to pass settings directly to - * Quicktags using an array. Default true. - * } - * @return array Parsed arguments array. - */ - public static function parse_settings( $editor_id, $settings ) { - - /** - * Filters the wp_editor() settings. - * - * @since 4.0.0 - * - * @see _WP_Editors()::parse_settings() - * - * @param array $settings Array of editor arguments. - * @param string $editor_id ID for the current editor instance. - */ - $settings = apply_filters( 'wp_editor_settings', $settings, $editor_id ); - - $set = wp_parse_args( $settings, array( - 'wpautop' => true, - 'media_buttons' => true, - 'default_editor' => '', - 'drag_drop_upload' => false, - 'textarea_name' => $editor_id, - 'textarea_rows' => 20, - 'tabindex' => '', - 'tabfocus_elements' => ':prev,:next', - 'editor_css' => '', - 'editor_class' => '', - 'teeny' => false, - 'dfw' => false, - '_content_editor_dfw' => false, - 'tinymce' => true, - 'quicktags' => true - ) ); - - self::$this_tinymce = ( $set['tinymce'] && user_can_richedit() ); - - if ( self::$this_tinymce ) { - if ( false !== strpos( $editor_id, '[' ) ) { - self::$this_tinymce = false; - _deprecated_argument( 'wp_editor()', '3.9.0', 'TinyMCE editor IDs cannot have brackets.' ); - } - } - - self::$this_quicktags = (bool) $set['quicktags']; - - if ( self::$this_tinymce ) - self::$has_tinymce = true; - - if ( self::$this_quicktags ) - self::$has_quicktags = true; - - if ( $set['dfw'] ) { - self::$old_dfw_compat = true; - } - - if ( empty( $set['editor_height'] ) ) - return $set; - - if ( 'content' === $editor_id && empty( $set['tinymce']['wp_autoresize_on'] ) ) { - // A cookie (set when a user resizes the editor) overrides the height. - $cookie = (int) get_user_setting( 'ed_size' ); - - if ( $cookie ) - $set['editor_height'] = $cookie; - } - - if ( $set['editor_height'] < 50 ) - $set['editor_height'] = 50; - elseif ( $set['editor_height'] > 5000 ) - $set['editor_height'] = 5000; - - return $set; - } - - /** - * Outputs the HTML for a single instance of the editor. - * - * @static - * @param string $content The initial content of the editor. - * @param string $editor_id ID for the textarea and TinyMCE and Quicktags instances (can contain only ASCII letters and numbers). - * @param array $settings See the _parse_settings() method for description. - */ - public static function editor( $content, $editor_id, $settings = array() ) { - $set = self::parse_settings( $editor_id, $settings ); - $editor_class = ' class="' . trim( esc_attr( $set['editor_class'] ) . ' wp-editor-area' ) . '"'; - $tabindex = $set['tabindex'] ? ' tabindex="' . (int) $set['tabindex'] . '"' : ''; - $default_editor = 'html'; - $buttons = $autocomplete = ''; - $editor_id_attr = esc_attr( $editor_id ); - - if ( $set['drag_drop_upload'] ) { - self::$drag_drop_upload = true; - } - - if ( ! empty( $set['editor_height'] ) ) { - $height = ' style="height: ' . (int) $set['editor_height'] . 'px"'; - } else { - $height = ' rows="' . (int) $set['textarea_rows'] . '"'; - } - - if ( ! current_user_can( 'upload_files' ) ) { - $set['media_buttons'] = false; - } - - if ( self::$this_tinymce ) { - $autocomplete = ' autocomplete="off"'; - - if ( self::$this_quicktags ) { - $default_editor = $set['default_editor'] ? $set['default_editor'] : wp_default_editor(); - // 'html' is used for the "Text" editor tab. - if ( 'html' !== $default_editor ) { - $default_editor = 'tinymce'; - } - - $buttons .= '<button type="button" id="' . $editor_id_attr . '-tmce" class="wp-switch-editor switch-tmce"' . - ' data-wp-editor-id="' . $editor_id_attr . '">' . __('Visual') . "</button>\n"; - $buttons .= '<button type="button" id="' . $editor_id_attr . '-html" class="wp-switch-editor switch-html"' . - ' data-wp-editor-id="' . $editor_id_attr . '">' . _x( 'Text', 'Name for the Text editor tab (formerly HTML)' ) . "</button>\n"; - } else { - $default_editor = 'tinymce'; - } - } - - $switch_class = 'html' === $default_editor ? 'html-active' : 'tmce-active'; - $wrap_class = 'wp-core-ui wp-editor-wrap ' . $switch_class; - - if ( $set['_content_editor_dfw'] ) { - $wrap_class .= ' has-dfw'; - } - - echo '<div id="wp-' . $editor_id_attr . '-wrap" class="' . $wrap_class . '">'; - - if ( self::$editor_buttons_css ) { - wp_print_styles( 'editor-buttons' ); - self::$editor_buttons_css = false; - } - - if ( ! empty( $set['editor_css'] ) ) { - echo $set['editor_css'] . "\n"; - } - - if ( ! empty( $buttons ) || $set['media_buttons'] ) { - echo '<div id="wp-' . $editor_id_attr . '-editor-tools" class="wp-editor-tools hide-if-no-js">'; - - if ( $set['media_buttons'] ) { - self::$has_medialib = true; - - if ( ! function_exists( 'media_buttons' ) ) - include( ABSPATH . 'wp-admin/includes/media.php' ); - - echo '<div id="wp-' . $editor_id_attr . '-media-buttons" class="wp-media-buttons">'; - - /** - * Fires after the default media button(s) are displayed. - * - * @since 2.5.0 - * - * @param string $editor_id Unique editor identifier, e.g. 'content'. - */ - do_action( 'media_buttons', $editor_id ); - echo "</div>\n"; - } - - echo '<div class="wp-editor-tabs">' . $buttons . "</div>\n"; - echo "</div>\n"; - } - - $quicktags_toolbar = ''; - - if ( self::$this_quicktags ) { - if ( 'content' === $editor_id && ! empty( $GLOBALS['current_screen'] ) && $GLOBALS['current_screen']->base === 'post' ) { - $toolbar_id = 'ed_toolbar'; - } else { - $toolbar_id = 'qt_' . $editor_id_attr . '_toolbar'; - } - - $quicktags_toolbar = '<div id="' . $toolbar_id . '" class="quicktags-toolbar"></div>'; - } - - /** - * Filters the HTML markup output that displays the editor. - * - * @since 2.1.0 - * - * @param string $output Editor's HTML markup. - */ - $the_editor = apply_filters( 'the_editor', '<div id="wp-' . $editor_id_attr . '-editor-container" class="wp-editor-container">' . - $quicktags_toolbar . - '<textarea' . $editor_class . $height . $tabindex . $autocomplete . ' cols="40" name="' . esc_attr( $set['textarea_name'] ) . '" ' . - 'id="' . $editor_id_attr . '">%s</textarea></div>' ); - - // Prepare the content for the Visual or Text editor, only when TinyMCE is used (back-compat). - if ( self::$this_tinymce ) { - add_filter( 'the_editor_content', 'format_for_editor', 10, 2 ); - } - - /** - * Filters the default editor content. - * - * @since 2.1.0 - * - * @param string $content Default editor content. - * @param string $default_editor The default editor for the current user. - * Either 'html' or 'tinymce'. - */ - $content = apply_filters( 'the_editor_content', $content, $default_editor ); - - // Remove the filter as the next editor on the same page may not need it. - if ( self::$this_tinymce ) { - remove_filter( 'the_editor_content', 'format_for_editor' ); - } - - // Back-compat for the `htmledit_pre` and `richedit_pre` filters - if ( 'html' === $default_editor && has_filter( 'htmledit_pre' ) ) { - // TODO: needs _deprecated_filter(), use _deprecated_function() as substitute for now - _deprecated_function( 'add_filter( htmledit_pre )', '4.3.0', 'add_filter( format_for_editor )' ); - $content = apply_filters( 'htmledit_pre', $content ); - } elseif ( 'tinymce' === $default_editor && has_filter( 'richedit_pre' ) ) { - _deprecated_function( 'add_filter( richedit_pre )', '4.3.0', 'add_filter( format_for_editor )' ); - $content = apply_filters( 'richedit_pre', $content ); - } - - if ( false !== stripos( $content, 'textarea' ) ) { - $content = preg_replace( '%</textarea%i', '</textarea', $content ); - } - - printf( $the_editor, $content ); - echo "\n</div>\n\n"; - - self::editor_settings( $editor_id, $set ); - } - - /** - * @static - * - * @global string $tinymce_version - * - * @param string $editor_id - * @param array $set - */ - public static function editor_settings($editor_id, $set) { - global $tinymce_version; - - if ( empty(self::$first_init) ) { - if ( is_admin() ) { - add_action( 'admin_print_footer_scripts', array( __CLASS__, 'editor_js' ), 50 ); - add_action( 'admin_print_footer_scripts', array( __CLASS__, 'enqueue_scripts' ), 1 ); - } else { - add_action( 'wp_print_footer_scripts', array( __CLASS__, 'editor_js' ), 50 ); - add_action( 'wp_print_footer_scripts', array( __CLASS__, 'enqueue_scripts' ), 1 ); - } - } - - if ( self::$this_quicktags ) { - - $qtInit = array( - 'id' => $editor_id, - 'buttons' => '' - ); - - if ( is_array($set['quicktags']) ) - $qtInit = array_merge($qtInit, $set['quicktags']); - - if ( empty($qtInit['buttons']) ) - $qtInit['buttons'] = 'strong,em,link,block,del,ins,img,ul,ol,li,code,more,close'; - - if ( $set['_content_editor_dfw'] ) { - $qtInit['buttons'] .= ',dfw'; - } - - /** - * Filters the Quicktags settings. - * - * @since 3.3.0 - * - * @param array $qtInit Quicktags settings. - * @param string $editor_id The unique editor ID, e.g. 'content'. - */ - $qtInit = apply_filters( 'quicktags_settings', $qtInit, $editor_id ); - - self::$qt_settings[$editor_id] = $qtInit; - - self::$qt_buttons = array_merge( self::$qt_buttons, explode(',', $qtInit['buttons']) ); - } - - if ( self::$this_tinymce ) { - - if ( empty( self::$first_init ) ) { - self::$baseurl = includes_url( 'js/tinymce' ); - - $mce_locale = get_user_locale(); - self::$mce_locale = $mce_locale = empty( $mce_locale ) ? 'en' : strtolower( substr( $mce_locale, 0, 2 ) ); // ISO 639-1 - - /** This filter is documented in wp-admin/includes/media.php */ - $no_captions = (bool) apply_filters( 'disable_captions', '' ); - $ext_plugins = ''; - $shortcut_labels = array(); - - foreach ( self::get_translation() as $name => $value ) { - if ( is_array( $value ) ) { - $shortcut_labels[$name] = $value[1]; - } - } - - if ( $set['teeny'] ) { - - /** - * Filters the list of teenyMCE plugins. - * - * @since 2.7.0 - * - * @param array $plugins An array of teenyMCE plugins. - * @param string $editor_id Unique editor identifier, e.g. 'content'. - */ - self::$plugins = $plugins = apply_filters( 'teeny_mce_plugins', array( 'colorpicker', 'lists', 'fullscreen', 'image', 'wordpress', 'wpeditimage', 'wplink' ), $editor_id ); - } else { - - /** - * Filters the list of TinyMCE external plugins. - * - * The filter takes an associative array of external plugins for - * TinyMCE in the form 'plugin_name' => 'url'. - * - * The url should be absolute, and should include the js filename - * to be loaded. For example: - * 'myplugin' => 'http://mysite.com/wp-content/plugins/myfolder/mce_plugin.js'. - * - * If the external plugin adds a button, it should be added with - * one of the 'mce_buttons' filters. - * - * @since 2.5.0 - * - * @param array $external_plugins An array of external TinyMCE plugins. - */ - $mce_external_plugins = apply_filters( 'mce_external_plugins', array() ); - - $plugins = array( - 'charmap', - 'colorpicker', - 'hr', - 'lists', - 'media', - 'paste', - 'tabfocus', - 'textcolor', - 'fullscreen', - 'wordpress', - 'wpautoresize', - 'wpeditimage', - 'wpemoji', - 'wpgallery', - 'wplink', - 'wpdialogs', - 'wptextpattern', - 'wpview', - 'wpembed', - ); - - if ( ! self::$has_medialib ) { - $plugins[] = 'image'; - } - - /** - * Filters the list of default TinyMCE plugins. - * - * The filter specifies which of the default plugins included - * in WordPress should be added to the TinyMCE instance. - * - * @since 3.3.0 - * - * @param array $plugins An array of default TinyMCE plugins. - */ - $plugins = array_unique( apply_filters( 'tiny_mce_plugins', $plugins ) ); - - if ( ( $key = array_search( 'spellchecker', $plugins ) ) !== false ) { - // Remove 'spellchecker' from the internal plugins if added with 'tiny_mce_plugins' filter to prevent errors. - // It can be added with 'mce_external_plugins'. - unset( $plugins[$key] ); - } - - if ( ! empty( $mce_external_plugins ) ) { - - /** - * Filters the translations loaded for external TinyMCE 3.x plugins. - * - * The filter takes an associative array ('plugin_name' => 'path') - * where 'path' is the include path to the file. - * - * The language file should follow the same format as wp_mce_translation(), - * and should define a variable ($strings) that holds all translated strings. - * - * @since 2.5.0 - * - * @param array $translations Translations for external TinyMCE plugins. - */ - $mce_external_languages = apply_filters( 'mce_external_languages', array() ); - - $loaded_langs = array(); - $strings = ''; - - if ( ! empty( $mce_external_languages ) ) { - foreach ( $mce_external_languages as $name => $path ) { - if ( @is_file( $path ) && @is_readable( $path ) ) { - include_once( $path ); - $ext_plugins .= $strings . "\n"; - $loaded_langs[] = $name; - } - } - } - - foreach ( $mce_external_plugins as $name => $url ) { - if ( in_array( $name, $plugins, true ) ) { - unset( $mce_external_plugins[ $name ] ); - continue; - } - - $url = set_url_scheme( $url ); - $mce_external_plugins[ $name ] = $url; - $plugurl = dirname( $url ); - $strings = ''; - - // Try to load langs/[locale].js and langs/[locale]_dlg.js - if ( ! in_array( $name, $loaded_langs, true ) ) { - $path = str_replace( content_url(), '', $plugurl ); - $path = WP_CONTENT_DIR . $path . '/langs/'; - - if ( function_exists('realpath') ) - $path = trailingslashit( realpath($path) ); - - if ( @is_file( $path . $mce_locale . '.js' ) ) - $strings .= @file_get_contents( $path . $mce_locale . '.js' ) . "\n"; - - if ( @is_file( $path . $mce_locale . '_dlg.js' ) ) - $strings .= @file_get_contents( $path . $mce_locale . '_dlg.js' ) . "\n"; - - if ( 'en' != $mce_locale && empty( $strings ) ) { - if ( @is_file( $path . 'en.js' ) ) { - $str1 = @file_get_contents( $path . 'en.js' ); - $strings .= preg_replace( '/([\'"])en\./', '$1' . $mce_locale . '.', $str1, 1 ) . "\n"; - } - - if ( @is_file( $path . 'en_dlg.js' ) ) { - $str2 = @file_get_contents( $path . 'en_dlg.js' ); - $strings .= preg_replace( '/([\'"])en\./', '$1' . $mce_locale . '.', $str2, 1 ) . "\n"; - } - } - - if ( ! empty( $strings ) ) - $ext_plugins .= "\n" . $strings . "\n"; - } - - $ext_plugins .= 'tinyMCEPreInit.load_ext("' . $plugurl . '", "' . $mce_locale . '");' . "\n"; - $ext_plugins .= 'tinymce.PluginManager.load("' . $name . '", "' . $url . '");' . "\n"; - } - } - } - - self::$plugins = $plugins; - self::$ext_plugins = $ext_plugins; - - self::$first_init = array( - 'theme' => 'modern', - 'skin' => 'lightgray', - 'language' => self::$mce_locale, - 'formats' => '{' . - 'alignleft: [' . - '{selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", styles: {textAlign:"left"}},' . - '{selector: "img,table,dl.wp-caption", classes: "alignleft"}' . - '],' . - 'aligncenter: [' . - '{selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", styles: {textAlign:"center"}},' . - '{selector: "img,table,dl.wp-caption", classes: "aligncenter"}' . - '],' . - 'alignright: [' . - '{selector: "p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li", styles: {textAlign:"right"}},' . - '{selector: "img,table,dl.wp-caption", classes: "alignright"}' . - '],' . - 'strikethrough: {inline: "del"}' . - '}', - 'relative_urls' => false, - 'remove_script_host' => false, - 'convert_urls' => false, - 'browser_spellcheck' => true, - 'fix_list_elements' => true, - 'entities' => '38,amp,60,lt,62,gt', - 'entity_encoding' => 'raw', - 'keep_styles' => false, - 'cache_suffix' => 'wp-mce-' . $tinymce_version, - - // Limit the preview styles in the menu/toolbar - 'preview_styles' => 'font-family font-size font-weight font-style text-decoration text-transform', - - 'end_container_on_empty_block' => true, - 'wpeditimage_disable_captions' => $no_captions, - 'wpeditimage_html5_captions' => current_theme_supports( 'html5', 'caption' ), - 'plugins' => implode( ',', $plugins ), - 'wp_lang_attr' => get_bloginfo( 'language' ), - 'wp_shortcut_labels' => wp_json_encode( $shortcut_labels ), - ); - - if ( ! empty( $mce_external_plugins ) ) { - self::$first_init['external_plugins'] = wp_json_encode( $mce_external_plugins ); - } - - $suffix = SCRIPT_DEBUG ? '' : '.min'; - $version = 'ver=' . get_bloginfo( 'version' ); - $dashicons = includes_url( "css/dashicons$suffix.css?$version" ); - - // WordPress default stylesheet and dashicons - $mce_css = array( - $dashicons, - self::$baseurl . '/skins/wordpress/wp-content.css?' . $version - ); - - $editor_styles = get_editor_stylesheets(); - if ( ! empty( $editor_styles ) ) { - foreach ( $editor_styles as $style ) { - $mce_css[] = $style; - } - } - - /** - * Filters the comma-delimited list of stylesheets to load in TinyMCE. - * - * @since 2.1.0 - * - * @param string $stylesheets Comma-delimited list of stylesheets. - */ - $mce_css = trim( apply_filters( 'mce_css', implode( ',', $mce_css ) ), ' ,' ); - - if ( ! empty($mce_css) ) - self::$first_init['content_css'] = $mce_css; - } - - if ( $set['teeny'] ) { - - /** - * Filters the list of teenyMCE buttons (Text tab). - * - * @since 2.7.0 - * - * @param array $buttons An array of teenyMCE buttons. - * @param string $editor_id Unique editor identifier, e.g. 'content'. - */ - $mce_buttons = apply_filters( 'teeny_mce_buttons', array('bold', 'italic', 'underline', 'blockquote', 'strikethrough', 'bullist', 'numlist', 'alignleft', 'aligncenter', 'alignright', 'undo', 'redo', 'link', 'unlink', 'fullscreen'), $editor_id ); - $mce_buttons_2 = $mce_buttons_3 = $mce_buttons_4 = array(); - } else { - $mce_buttons = array( 'formatselect', 'bold', 'italic', 'bullist', 'numlist', 'blockquote', 'alignleft', 'aligncenter', 'alignright', 'link', 'unlink', 'wp_more', 'spellchecker' ); - - if ( ! wp_is_mobile() ) { - if ( $set['_content_editor_dfw'] ) { - $mce_buttons[] = 'dfw'; - } else { - $mce_buttons[] = 'fullscreen'; - } - } - - $mce_buttons[] = 'wp_adv'; - - /** - * Filters the first-row list of TinyMCE buttons (Visual tab). - * - * @since 2.0.0 - * - * @param array $buttons First-row list of buttons. - * @param string $editor_id Unique editor identifier, e.g. 'content'. - */ - $mce_buttons = apply_filters( 'mce_buttons', $mce_buttons, $editor_id ); - - $mce_buttons_2 = array( 'strikethrough', 'hr', 'forecolor', 'pastetext', 'removeformat', 'charmap', 'outdent', 'indent', 'undo', 'redo' ); - - if ( ! wp_is_mobile() ) { - $mce_buttons_2[] = 'wp_help'; - } - - /** - * Filters the second-row list of TinyMCE buttons (Visual tab). - * - * @since 2.0.0 - * - * @param array $buttons Second-row list of buttons. - * @param string $editor_id Unique editor identifier, e.g. 'content'. - */ - $mce_buttons_2 = apply_filters( 'mce_buttons_2', $mce_buttons_2, $editor_id ); - - /** - * Filters the third-row list of TinyMCE buttons (Visual tab). - * - * @since 2.0.0 - * - * @param array $buttons Third-row list of buttons. - * @param string $editor_id Unique editor identifier, e.g. 'content'. - */ - $mce_buttons_3 = apply_filters( 'mce_buttons_3', array(), $editor_id ); - - /** - * Filters the fourth-row list of TinyMCE buttons (Visual tab). - * - * @since 2.5.0 - * - * @param array $buttons Fourth-row list of buttons. - * @param string $editor_id Unique editor identifier, e.g. 'content'. - */ - $mce_buttons_4 = apply_filters( 'mce_buttons_4', array(), $editor_id ); - } - - $body_class = $editor_id; - - if ( $post = get_post() ) { - $body_class .= ' post-type-' . sanitize_html_class( $post->post_type ) . ' post-status-' . sanitize_html_class( $post->post_status ); - - if ( post_type_supports( $post->post_type, 'post-formats' ) ) { - $post_format = get_post_format( $post ); - if ( $post_format && ! is_wp_error( $post_format ) ) - $body_class .= ' post-format-' . sanitize_html_class( $post_format ); - else - $body_class .= ' post-format-standard'; - } - - $page_template = get_page_template_slug( $post ); - - if ( $page_template !== false ) { - $page_template = empty( $page_template ) ? 'default' : str_replace( '.', '-', basename( $page_template, '.php' ) ); - $body_class .= ' page-template-' . sanitize_html_class( $page_template ); - } - } - - $body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) ); - - if ( !empty($set['tinymce']['body_class']) ) { - $body_class .= ' ' . $set['tinymce']['body_class']; - unset($set['tinymce']['body_class']); - } - - $mceInit = array ( - 'selector' => "#$editor_id", - 'resize' => 'vertical', - 'menubar' => false, - 'wpautop' => (bool) $set['wpautop'], - 'indent' => ! $set['wpautop'], - 'toolbar1' => implode($mce_buttons, ','), - 'toolbar2' => implode($mce_buttons_2, ','), - 'toolbar3' => implode($mce_buttons_3, ','), - 'toolbar4' => implode($mce_buttons_4, ','), - 'tabfocus_elements' => $set['tabfocus_elements'], - 'body_class' => $body_class - ); - - // Merge with the first part of the init array - $mceInit = array_merge( self::$first_init, $mceInit ); - - if ( is_array( $set['tinymce'] ) ) - $mceInit = array_merge( $mceInit, $set['tinymce'] ); - - /* - * For people who really REALLY know what they're doing with TinyMCE - * You can modify $mceInit to add, remove, change elements of the config - * before tinyMCE.init. Setting "valid_elements", "invalid_elements" - * and "extended_valid_elements" can be done through this filter. Best - * is to use the default cleanup by not specifying valid_elements, - * as TinyMCE checks against the full set of HTML 5.0 elements and attributes. - */ - if ( $set['teeny'] ) { - - /** - * Filters the teenyMCE config before init. - * - * @since 2.7.0 - * - * @param array $mceInit An array with teenyMCE config. - * @param string $editor_id Unique editor identifier, e.g. 'content'. - */ - $mceInit = apply_filters( 'teeny_mce_before_init', $mceInit, $editor_id ); - } else { - - /** - * Filters the TinyMCE config before init. - * - * @since 2.5.0 - * - * @param array $mceInit An array with TinyMCE config. - * @param string $editor_id Unique editor identifier, e.g. 'content'. - */ - $mceInit = apply_filters( 'tiny_mce_before_init', $mceInit, $editor_id ); - } - - if ( empty( $mceInit['toolbar3'] ) && ! empty( $mceInit['toolbar4'] ) ) { - $mceInit['toolbar3'] = $mceInit['toolbar4']; - $mceInit['toolbar4'] = ''; - } - - self::$mce_settings[$editor_id] = $mceInit; - } // end if self::$this_tinymce - } - - /** - * - * @static - * @param array $init - * @return string - */ - private static function _parse_init($init) { - $options = ''; - - foreach ( $init as $k => $v ) { - if ( is_bool($v) ) { - $val = $v ? 'true' : 'false'; - $options .= $k . ':' . $val . ','; - continue; - } elseif ( !empty($v) && is_string($v) && ( ('{' == $v{0} && '}' == $v{strlen($v) - 1}) || ('[' == $v{0} && ']' == $v{strlen($v) - 1}) || preg_match('/^\(?function ?\(/', $v) ) ) { - $options .= $k . ':' . $v . ','; - continue; - } - $options .= $k . ':"' . $v . '",'; - } - - return '{' . trim( $options, ' ,' ) . '}'; - } - - /** - * - * @static - */ - public static function enqueue_scripts() { - if ( self::$has_tinymce ) - wp_enqueue_script('editor'); - - if ( self::$has_quicktags ) { - wp_enqueue_script( 'quicktags' ); - wp_enqueue_style( 'buttons' ); - } - - if ( in_array('wplink', self::$plugins, true) || in_array('link', self::$qt_buttons, true) ) { - wp_enqueue_script('wplink'); - wp_enqueue_script( 'jquery-ui-autocomplete' ); - } - - if ( self::$old_dfw_compat ) { - wp_enqueue_script('wp-fullscreen-stub'); - } - - if ( self::$has_medialib ) { - add_thickbox(); - wp_enqueue_script( 'media-upload' ); - wp_enqueue_script( 'wp-embed' ); - } - - /** - * Fires when scripts and styles are enqueued for the editor. - * - * @since 3.9.0 - * - * @param array $to_load An array containing boolean values whether TinyMCE - * and Quicktags are being loaded. - */ - do_action( 'wp_enqueue_editor', array( - 'tinymce' => self::$has_tinymce, - 'quicktags' => self::$has_quicktags, - ) ); - } - - private static function get_translation() { - if ( empty( self::$translation ) ) { - self::$translation = array( - // Default TinyMCE strings - 'New document' => __( 'New document' ), - 'Formats' => _x( 'Formats', 'TinyMCE' ), - - 'Headings' => _x( 'Headings', 'TinyMCE' ), - 'Heading 1' => array( __( 'Heading 1' ), 'access1' ), - 'Heading 2' => array( __( 'Heading 2' ), 'access2' ), - 'Heading 3' => array( __( 'Heading 3' ), 'access3' ), - 'Heading 4' => array( __( 'Heading 4' ), 'access4' ), - 'Heading 5' => array( __( 'Heading 5' ), 'access5' ), - 'Heading 6' => array( __( 'Heading 6' ), 'access6' ), - - /* translators: block tags */ - 'Blocks' => _x( 'Blocks', 'TinyMCE' ), - 'Paragraph' => array( __( 'Paragraph' ), 'access7' ), - 'Blockquote' => array( __( 'Blockquote' ), 'accessQ' ), - 'Div' => _x( 'Div', 'HTML tag' ), - 'Pre' => _x( 'Pre', 'HTML tag' ), - 'Preformatted' => _x( 'Preformatted', 'HTML tag' ), - 'Address' => _x( 'Address', 'HTML tag' ), - - 'Inline' => _x( 'Inline', 'HTML elements' ), - 'Underline' => array( __( 'Underline' ), 'metaU' ), - 'Strikethrough' => array( __( 'Strikethrough' ), 'accessD' ), - 'Subscript' => __( 'Subscript' ), - 'Superscript' => __( 'Superscript' ), - 'Clear formatting' => __( 'Clear formatting' ), - 'Bold' => array( __( 'Bold' ), 'metaB' ), - 'Italic' => array( __( 'Italic' ), 'metaI' ), - 'Code' => array( __( 'Code' ), 'accessX' ), - 'Source code' => __( 'Source code' ), - 'Font Family' => __( 'Font Family' ), - 'Font Sizes' => __( 'Font Sizes' ), - - 'Align center' => array( __( 'Align center' ), 'accessC' ), - 'Align right' => array( __( 'Align right' ), 'accessR' ), - 'Align left' => array( __( 'Align left' ), 'accessL' ), - 'Justify' => array( __( 'Justify' ), 'accessJ' ), - 'Increase indent' => __( 'Increase indent' ), - 'Decrease indent' => __( 'Decrease indent' ), - - 'Cut' => array( __( 'Cut' ), 'metaX' ), - 'Copy' => array( __( 'Copy' ), 'metaC' ), - 'Paste' => array( __( 'Paste' ), 'metaV' ), - 'Select all' => array( __( 'Select all' ), 'metaA' ), - 'Undo' => array( __( 'Undo' ), 'metaZ' ), - 'Redo' => array( __( 'Redo' ), 'metaY' ), - - 'Ok' => __( 'OK' ), - 'Cancel' => __( 'Cancel' ), - 'Close' => __( 'Close' ), - 'Visual aids' => __( 'Visual aids' ), - - 'Bullet list' => array( __( 'Bulleted list' ), 'accessU' ), - 'Numbered list' => array( __( 'Numbered list' ), 'accessO' ), - 'Square' => _x( 'Square', 'list style' ), - 'Default' => _x( 'Default', 'list style' ), - 'Circle' => _x( 'Circle', 'list style' ), - 'Disc' => _x('Disc', 'list style' ), - 'Lower Greek' => _x( 'Lower Greek', 'list style' ), - 'Lower Alpha' => _x( 'Lower Alpha', 'list style' ), - 'Upper Alpha' => _x( 'Upper Alpha', 'list style' ), - 'Upper Roman' => _x( 'Upper Roman', 'list style' ), - 'Lower Roman' => _x( 'Lower Roman', 'list style' ), - - // Anchor plugin - 'Name' => _x( 'Name', 'Name of link anchor (TinyMCE)' ), - 'Anchor' => _x( 'Anchor', 'Link anchor (TinyMCE)' ), - 'Anchors' => _x( 'Anchors', 'Link anchors (TinyMCE)' ), - - // Fullpage plugin - 'Document properties' => __( 'Document properties' ), - 'Robots' => __( 'Robots' ), - 'Title' => __( 'Title' ), - 'Keywords' => __( 'Keywords' ), - 'Encoding' => __( 'Encoding' ), - 'Description' => __( 'Description' ), - 'Author' => __( 'Author' ), - - // Media, image plugins - 'Insert/edit image' => array( __( 'Insert/edit image' ), 'accessM' ), - 'General' => __( 'General' ), - 'Advanced' => __( 'Advanced' ), - 'Source' => __( 'Source' ), - 'Border' => __( 'Border' ), - 'Constrain proportions' => __( 'Constrain proportions' ), - 'Vertical space' => __( 'Vertical space' ), - 'Image description' => __( 'Image description' ), - 'Style' => __( 'Style' ), - 'Dimensions' => __( 'Dimensions' ), - 'Insert image' => __( 'Insert image' ), - 'Insert date/time' => __( 'Insert date/time' ), - 'Insert/edit video' => __( 'Insert/edit video' ), - 'Poster' => __( 'Poster' ), - 'Alternative source' => __( 'Alternative source' ), - 'Paste your embed code below:' => __( 'Paste your embed code below:' ), - 'Insert video' => __( 'Insert video' ), - 'Embed' => __( 'Embed' ), - - // Each of these have a corresponding plugin - 'Special character' => __( 'Special character' ), - 'Right to left' => _x( 'Right to left', 'editor button' ), - 'Left to right' => _x( 'Left to right', 'editor button' ), - 'Emoticons' => __( 'Emoticons' ), - 'Nonbreaking space' => __( 'Nonbreaking space' ), - 'Page break' => __( 'Page break' ), - 'Paste as text' => __( 'Paste as text' ), - 'Preview' => __( 'Preview' ), - 'Print' => __( 'Print' ), - 'Save' => __( 'Save' ), - 'Fullscreen' => __( 'Fullscreen' ), - 'Horizontal line' => __( 'Horizontal line' ), - 'Horizontal space' => __( 'Horizontal space' ), - 'Restore last draft' => __( 'Restore last draft' ), - 'Insert/edit link' => array( __( 'Insert/edit link' ), 'metaK' ), - 'Remove link' => array( __( 'Remove link' ), 'accessS' ), - - 'Color' => __( 'Color' ), - 'Custom color' => __( 'Custom color' ), - 'Custom...' => _x( 'Custom...', 'label for custom color' ), // no ellipsis - 'No color' => __( 'No color' ), - - // Spelling, search/replace plugins - 'Could not find the specified string.' => __( 'Could not find the specified string.' ), - 'Replace' => _x( 'Replace', 'find/replace' ), - 'Next' => _x( 'Next', 'find/replace' ), - /* translators: previous */ - 'Prev' => _x( 'Prev', 'find/replace' ), - 'Whole words' => _x( 'Whole words', 'find/replace' ), - 'Find and replace' => __( 'Find and replace' ), - 'Replace with' => _x('Replace with', 'find/replace' ), - 'Find' => _x( 'Find', 'find/replace' ), - 'Replace all' => _x( 'Replace all', 'find/replace' ), - 'Match case' => __( 'Match case' ), - 'Spellcheck' => __( 'Check Spelling' ), - 'Finish' => _x( 'Finish', 'spellcheck' ), - 'Ignore all' => _x( 'Ignore all', 'spellcheck' ), - 'Ignore' => _x( 'Ignore', 'spellcheck' ), - 'Add to Dictionary' => __( 'Add to Dictionary' ), - - // TinyMCE tables - 'Insert table' => __( 'Insert table' ), - 'Delete table' => __( 'Delete table' ), - 'Table properties' => __( 'Table properties' ), - 'Row properties' => __( 'Table row properties' ), - 'Cell properties' => __( 'Table cell properties' ), - 'Border color' => __( 'Border color' ), - - 'Row' => __( 'Row' ), - 'Rows' => __( 'Rows' ), - 'Column' => _x( 'Column', 'table column' ), - 'Cols' => _x( 'Cols', 'table columns' ), - 'Cell' => _x( 'Cell', 'table cell' ), - 'Header cell' => __( 'Header cell' ), - 'Header' => _x( 'Header', 'table header' ), - 'Body' => _x( 'Body', 'table body' ), - 'Footer' => _x( 'Footer', 'table footer' ), - - 'Insert row before' => __( 'Insert row before' ), - 'Insert row after' => __( 'Insert row after' ), - 'Insert column before' => __( 'Insert column before' ), - 'Insert column after' => __( 'Insert column after' ), - 'Paste row before' => __( 'Paste table row before' ), - 'Paste row after' => __( 'Paste table row after' ), - 'Delete row' => __( 'Delete row' ), - 'Delete column' => __( 'Delete column' ), - 'Cut row' => __( 'Cut table row' ), - 'Copy row' => __( 'Copy table row' ), - 'Merge cells' => __( 'Merge table cells' ), - 'Split cell' => __( 'Split table cell' ), - - 'Height' => __( 'Height' ), - 'Width' => __( 'Width' ), - 'Caption' => __( 'Caption' ), - 'Alignment' => __( 'Alignment' ), - 'H Align' => _x( 'H Align', 'horizontal table cell alignment' ), - 'Left' => __( 'Left' ), - 'Center' => __( 'Center' ), - 'Right' => __( 'Right' ), - 'None' => _x( 'None', 'table cell alignment attribute' ), - 'V Align' => _x( 'V Align', 'vertical table cell alignment' ), - 'Top' => __( 'Top' ), - 'Middle' => __( 'Middle' ), - 'Bottom' => __( 'Bottom' ), - - 'Row group' => __( 'Row group' ), - 'Column group' => __( 'Column group' ), - 'Row type' => __( 'Row type' ), - 'Cell type' => __( 'Cell type' ), - 'Cell padding' => __( 'Cell padding' ), - 'Cell spacing' => __( 'Cell spacing' ), - 'Scope' => _x( 'Scope', 'table cell scope attribute' ), - - 'Insert template' => _x( 'Insert template', 'TinyMCE' ), - 'Templates' => _x( 'Templates', 'TinyMCE' ), - - 'Background color' => __( 'Background color' ), - 'Text color' => __( 'Text color' ), - 'Show blocks' => _x( 'Show blocks', 'editor button' ), - 'Show invisible characters' => __( 'Show invisible characters' ), - - /* translators: word count */ - 'Words: {0}' => sprintf( __( 'Words: %s' ), '{0}' ), - 'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.' => __( 'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.' ) . "\n\n" . __( 'If you’re looking to paste rich content from Microsoft Word, try turning this option off. The editor will clean up text pasted from Word automatically.' ), - 'Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help' => __( 'Rich Text Area. Press Alt-Shift-H for help.' ), - 'Rich Text Area. Press Control-Option-H for help.' => __( 'Rich Text Area. Press Control-Option-H for help.' ), - 'You have unsaved changes are you sure you want to navigate away?' => __( 'The changes you made will be lost if you navigate away from this page.' ), - 'Your browser doesn\'t support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.' => __( 'Your browser does not support direct access to the clipboard. Please use keyboard shortcuts or your browser’s edit menu instead.' ), - - // TinyMCE menus - 'Insert' => _x( 'Insert', 'TinyMCE menu' ), - 'File' => _x( 'File', 'TinyMCE menu' ), - 'Edit' => _x( 'Edit', 'TinyMCE menu' ), - 'Tools' => _x( 'Tools', 'TinyMCE menu' ), - 'View' => _x( 'View', 'TinyMCE menu' ), - 'Table' => _x( 'Table', 'TinyMCE menu' ), - 'Format' => _x( 'Format', 'TinyMCE menu' ), - - // WordPress strings - 'Toolbar Toggle' => array( __( 'Toolbar Toggle' ), 'accessZ' ), - 'Insert Read More tag' => array( __( 'Insert Read More tag' ), 'accessT' ), - 'Insert Page Break tag' => array( __( 'Insert Page Break tag' ), 'accessP' ), - 'Read more...' => __( 'Read more...' ), // Title on the placeholder inside the editor (no ellipsis) - 'Distraction-free writing mode' => array( __( 'Distraction-free writing mode' ), 'accessW' ), - 'No alignment' => __( 'No alignment' ), // Tooltip for the 'alignnone' button in the image toolbar - 'Remove' => __( 'Remove' ), // Tooltip for the 'remove' button in the image toolbar - 'Edit ' => __( 'Edit' ), // Tooltip for the 'edit' button in the image toolbar - 'Paste URL or type to search' => __( 'Paste URL or type to search' ), // Placeholder for the inline link dialog - 'Apply' => __( 'Apply' ), // Tooltip for the 'apply' button in the inline link dialog - 'Link options' => __( 'Link options' ), // Tooltip for the 'link options' button in the inline link dialog - - // Shortcuts help modal - 'Keyboard Shortcuts' => array( __( 'Keyboard Shortcuts' ), 'accessH' ), - 'Default shortcuts,' => __( 'Default shortcuts,' ), - 'Additional shortcuts,' => __( 'Additional shortcuts,' ), - 'Focus shortcuts:' => __( 'Focus shortcuts:' ), - 'Inline toolbar (when an image, link or preview is selected)' => __( 'Inline toolbar (when an image, link or preview is selected)' ), - 'Editor menu (when enabled)' => __( 'Editor menu (when enabled)' ), - 'Editor toolbar' => __( 'Editor toolbar' ), - 'Elements path' => __( 'Elements path' ), - 'Ctrl + Alt + letter:' => __( 'Ctrl + Alt + letter:' ), - 'Shift + Alt + letter:' => __( 'Shift + Alt + letter:' ), - 'Cmd + letter:' => __( 'Cmd + letter:' ), - 'Ctrl + letter:' => __( 'Ctrl + letter:' ), - 'Letter' => __( 'Letter' ), - 'Action' => __( 'Action' ), - 'Warning: the link has been inserted but may have errors. Please test it.' => __( 'Warning: the link has been inserted but may have errors. Please test it.' ), - 'To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.' => - __( 'To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.' ), - 'When starting a new paragraph with one of these formatting shortcuts followed by a space, the formatting will be applied automatically. Press Backspace or Escape to undo.' => - __( 'When starting a new paragraph with one of these formatting shortcuts followed by a space, the formatting will be applied automatically. Press Backspace or Escape to undo.' ), - 'The following formatting shortcuts are replaced when pressing Enter. Press Escape or the Undo button to undo.' => - __( 'The following formatting shortcuts are replaced when pressing Enter. Press Escape or the Undo button to undo.' ), - 'The next group of formatting shortcuts are applied as you type or when you insert them around plain text in the same paragraph. Press Escape or the Undo button to undo.' => - __( 'The next group of formatting shortcuts are applied as you type or when you insert them around plain text in the same paragraph. Press Escape or the Undo button to undo.' ), - ); - } - - /** - * Link plugin (not included): - * Insert link - * Target - * New window - * Text to display - * The URL you entered seems to be an email address. Do you want to add the required mailto: prefix? - * The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix? - * Url - */ - - return self::$translation; - } - - /** - * Translates the default TinyMCE strings and returns them as JSON encoded object ready to be loaded with tinymce.addI18n(). - * Can be used directly (_WP_Editors::wp_mce_translation()) by passing the same locale as set in the TinyMCE init object. - * - * @static - * @param string $mce_locale The locale used for the editor. - * @param bool $json_only optional Whether to include the JavaScript calls to tinymce.addI18n() and tinymce.ScriptLoader.markDone(). - * @return string Translation object, JSON encoded. - */ - public static function wp_mce_translation( $mce_locale = '', $json_only = false ) { - if ( ! $mce_locale ) { - $mce_locale = self::$mce_locale; - } - - $mce_translation = self::get_translation(); - - foreach ( $mce_translation as $name => $value ) { - if ( is_array( $value ) ) { - $mce_translation[$name] = $value[0]; - } - } - - /** - * Filters translated strings prepared for TinyMCE. - * - * @since 3.9.0 - * - * @param array $mce_translation Key/value pairs of strings. - * @param string $mce_locale Locale. - */ - $mce_translation = apply_filters( 'wp_mce_translation', $mce_translation, $mce_locale ); - - foreach ( $mce_translation as $key => $value ) { - // Remove strings that are not translated. - if ( $key === $value ) { - unset( $mce_translation[$key] ); - continue; - } - - if ( false !== strpos( $value, '&' ) ) { - $mce_translation[$key] = html_entity_decode( $value, ENT_QUOTES, 'UTF-8' ); - } - } - - // Set direction - if ( is_rtl() ) { - $mce_translation['_dir'] = 'rtl'; - } - - if ( $json_only ) { - return wp_json_encode( $mce_translation ); - } - - $baseurl = self::$baseurl ? self::$baseurl : includes_url( 'js/tinymce' ); - - return "tinymce.addI18n( '$mce_locale', " . wp_json_encode( $mce_translation ) . ");\n" . - "tinymce.ScriptLoader.markDone( '$baseurl/langs/$mce_locale.js' );\n"; - } - - /** - * - * @static - * @global string $tinymce_version - * @global bool $concatenate_scripts - * @global bool $compress_scripts - */ - public static function editor_js() { - global $tinymce_version, $concatenate_scripts, $compress_scripts; - - /** - * Filters "tiny_mce_version" is deprecated - * - * The tiny_mce_version filter is not needed since external plugins are loaded directly by TinyMCE. - * These plugins can be refreshed by appending query string to the URL passed to "mce_external_plugins" filter. - * If the plugin has a popup dialog, a query string can be added to the button action that opens it (in the plugin's code). - */ - $version = 'ver=' . $tinymce_version; - $tmce_on = !empty(self::$mce_settings); - - if ( ! isset($concatenate_scripts) ) - script_concat_settings(); - - $compressed = $compress_scripts && $concatenate_scripts && isset($_SERVER['HTTP_ACCEPT_ENCODING']) - && false !== stripos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip'); - - $mceInit = $qtInit = ''; - if ( $tmce_on ) { - foreach ( self::$mce_settings as $editor_id => $init ) { - $options = self::_parse_init( $init ); - $mceInit .= "'$editor_id':{$options},"; - } - $mceInit = '{' . trim($mceInit, ',') . '}'; - } else { - $mceInit = '{}'; - } - - if ( !empty(self::$qt_settings) ) { - foreach ( self::$qt_settings as $editor_id => $init ) { - $options = self::_parse_init( $init ); - $qtInit .= "'$editor_id':{$options},"; - } - $qtInit = '{' . trim($qtInit, ',') . '}'; - } else { - $qtInit = '{}'; - } - - $ref = array( - 'plugins' => implode( ',', self::$plugins ), - 'theme' => 'modern', - 'language' => self::$mce_locale - ); - - $suffix = SCRIPT_DEBUG ? '' : '.min'; - - /** - * Fires immediately before the TinyMCE settings are printed. - * - * @since 3.2.0 - * - * @param array $mce_settings TinyMCE settings array. - */ - do_action( 'before_wp_tiny_mce', self::$mce_settings ); - ?> - - <script type="text/javascript"> - tinyMCEPreInit = { - baseURL: "<?php echo self::$baseurl; ?>", - suffix: "<?php echo $suffix; ?>", - <?php - - if ( self::$drag_drop_upload ) { - echo 'dragDropUpload: true,'; - } - - ?> - mceInit: <?php echo $mceInit; ?>, - qtInit: <?php echo $qtInit; ?>, - ref: <?php echo self::_parse_init( $ref ); ?>, - load_ext: function(url,lang){var sl=tinymce.ScriptLoader;sl.markDone(url+'/langs/'+lang+'.js');sl.markDone(url+'/langs/'+lang+'_dlg.js');} - }; - </script> - <?php - - $baseurl = self::$baseurl; - // Load tinymce.js when running from /src, else load wp-tinymce.js.gz (production) or tinymce.min.js (SCRIPT_DEBUG) - $mce_suffix = false !== strpos( get_bloginfo( 'version' ), '-src' ) ? '' : '.min'; - - if ( $tmce_on ) { - if ( $compressed ) { - echo "<script type='text/javascript' src='{$baseurl}/wp-tinymce.php?c=1&$version'></script>\n"; - } else { - echo "<script type='text/javascript' src='{$baseurl}/tinymce{$mce_suffix}.js?$version'></script>\n"; - echo "<script type='text/javascript' src='{$baseurl}/plugins/compat3x/plugin{$suffix}.js?$version'></script>\n"; - } - - echo "<script type='text/javascript'>\n" . self::wp_mce_translation() . "</script>\n"; - - if ( self::$ext_plugins ) { - // Load the old-format English strings to prevent unsightly labels in old style popups - echo "<script type='text/javascript' src='{$baseurl}/langs/wp-langs-en.js?$version'></script>\n"; - } - } - - /** - * Fires after tinymce.js is loaded, but before any TinyMCE editor - * instances are created. - * - * @since 3.9.0 - * - * @param array $mce_settings TinyMCE settings array. - */ - do_action( 'wp_tiny_mce_init', self::$mce_settings ); - - ?> - <script type="text/javascript"> - <?php - - if ( self::$ext_plugins ) - echo self::$ext_plugins . "\n"; - - if ( ! is_admin() ) - echo 'var ajaxurl = "' . admin_url( 'admin-ajax.php', 'relative' ) . '";'; - - ?> - - ( function() { - var init, id, $wrap; - - if ( typeof tinymce !== 'undefined' ) { - for ( id in tinyMCEPreInit.mceInit ) { - init = tinyMCEPreInit.mceInit[id]; - $wrap = tinymce.$( '#wp-' + id + '-wrap' ); - - if ( ( $wrap.hasClass( 'tmce-active' ) || ! tinyMCEPreInit.qtInit.hasOwnProperty( id ) ) && ! init.wp_skip_init ) { - tinymce.init( init ); - - if ( ! window.wpActiveEditor ) { - window.wpActiveEditor = id; - } - } - } - } - - if ( typeof quicktags !== 'undefined' ) { - for ( id in tinyMCEPreInit.qtInit ) { - quicktags( tinyMCEPreInit.qtInit[id] ); - - if ( ! window.wpActiveEditor ) { - window.wpActiveEditor = id; - } - } - } - }()); - </script> - <?php - - if ( in_array( 'wplink', self::$plugins, true ) || in_array( 'link', self::$qt_buttons, true ) ) { - self::wp_link_dialog(); - } - - /** - * Fires after any core TinyMCE editor instances are created. - * - * @since 3.2.0 - * - * @param array $mce_settings TinyMCE settings array. - */ - do_action( 'after_wp_tiny_mce', self::$mce_settings ); - } - - /** - * - * @static - * @global int $content_width - */ - public static function wp_fullscreen_html() { - _deprecated_function( __FUNCTION__, '4.3.0' ); - } - - /** - * Performs post queries for internal linking. - * - * @since 3.1.0 - * - * @static - * @param array $args Optional. Accepts 'pagenum' and 's' (search) arguments. - * @return false|array Results. - */ - public static function wp_link_query( $args = array() ) { - $pts = get_post_types( array( 'public' => true ), 'objects' ); - $pt_names = array_keys( $pts ); - - $query = array( - 'post_type' => $pt_names, - 'suppress_filters' => true, - 'update_post_term_cache' => false, - 'update_post_meta_cache' => false, - 'post_status' => 'publish', - 'posts_per_page' => 20, - ); - - $args['pagenum'] = isset( $args['pagenum'] ) ? absint( $args['pagenum'] ) : 1; - - if ( isset( $args['s'] ) ) - $query['s'] = $args['s']; - - $query['offset'] = $args['pagenum'] > 1 ? $query['posts_per_page'] * ( $args['pagenum'] - 1 ) : 0; - - /** - * Filters the link query arguments. - * - * Allows modification of the link query arguments before querying. - * - * @see WP_Query for a full list of arguments - * - * @since 3.7.0 - * - * @param array $query An array of WP_Query arguments. - */ - $query = apply_filters( 'wp_link_query_args', $query ); - - // Do main query. - $get_posts = new WP_Query; - $posts = $get_posts->query( $query ); - // Check if any posts were found. - if ( ! $get_posts->post_count ) - return false; - - // Build results. - $results = array(); - foreach ( $posts as $post ) { - if ( 'post' == $post->post_type ) - $info = mysql2date( __( 'Y/m/d' ), $post->post_date ); - else - $info = $pts[ $post->post_type ]->labels->singular_name; - - $results[] = array( - 'ID' => $post->ID, - 'title' => trim( esc_html( strip_tags( get_the_title( $post ) ) ) ), - 'permalink' => get_permalink( $post->ID ), - 'info' => $info, - ); - } - - /** - * Filters the link query results. - * - * Allows modification of the returned link query results. - * - * @since 3.7.0 - * - * @see 'wp_link_query_args' filter - * - * @param array $results { - * An associative array of query results. - * - * @type array { - * @type int $ID Post ID. - * @type string $title The trimmed, escaped post title. - * @type string $permalink Post permalink. - * @type string $info A 'Y/m/d'-formatted date for 'post' post type, - * the 'singular_name' post type label otherwise. - * } - * } - * @param array $query An array of WP_Query arguments. - */ - return apply_filters( 'wp_link_query', $results, $query ); - } - - /** - * Dialog for internal linking. - * - * @since 3.1.0 - * - * @static - */ - public static function wp_link_dialog() { - // display: none is required here, see #WP27605 - ?> - <div id="wp-link-backdrop" style="display: none"></div> - <div id="wp-link-wrap" class="wp-core-ui" style="display: none" role="dialog" aria-labelledby="link-modal-title"> - <form id="wp-link" tabindex="-1"> - <?php wp_nonce_field( 'internal-linking', '_ajax_linking_nonce', false ); ?> - <h1 id="link-modal-title"><?php _e( 'Insert/edit link' ) ?></h1> - <button type="button" id="wp-link-close"><span class="screen-reader-text"><?php _e( 'Close' ); ?></span></button> - <div id="link-selector"> - <div id="link-options"> - <p class="howto" id="wplink-enter-url"><?php _e( 'Enter the destination URL' ); ?></p> - <div> - <label><span><?php _e( 'URL' ); ?></span> - <input id="wp-link-url" type="text" aria-describedby="wplink-enter-url" /></label> - </div> - <div class="wp-link-text-field"> - <label><span><?php _e( 'Link Text' ); ?></span> - <input id="wp-link-text" type="text" /></label> - </div> - <div class="link-target"> - <label><span></span> - <input type="checkbox" id="wp-link-target" /> <?php _e( 'Open link in a new tab' ); ?></label> - </div> - </div> - <p class="howto" id="wplink-link-existing-content"><?php _e( 'Or link to existing content' ); ?></p> - <div id="search-panel"> - <div class="link-search-wrapper"> - <label> - <span class="search-label"><?php _e( 'Search' ); ?></span> - <input type="search" id="wp-link-search" class="link-search-field" autocomplete="off" aria-describedby="wplink-link-existing-content" /> - <span class="spinner"></span> - </label> - </div> - <div id="search-results" class="query-results" tabindex="0"> - <ul></ul> - <div class="river-waiting"> - <span class="spinner"></span> - </div> - </div> - <div id="most-recent-results" class="query-results" tabindex="0"> - <div class="query-notice" id="query-notice-message"> - <em class="query-notice-default"><?php _e( 'No search term specified. Showing recent items.' ); ?></em> - <em class="query-notice-hint screen-reader-text"><?php _e( 'Search or use up and down arrow keys to select an item.' ); ?></em> - </div> - <ul></ul> - <div class="river-waiting"> - <span class="spinner"></span> - </div> - </div> - </div> - </div> - <div class="submitbox"> - <div id="wp-link-cancel"> - <button type="button" class="button"><?php _e( 'Cancel' ); ?></button> - </div> - <div id="wp-link-update"> - <input type="submit" value="<?php esc_attr_e( 'Add Link' ); ?>" class="button button-primary" id="wp-link-submit" name="wp-link-submit"> - </div> - </div> - </form> - </div> - <?php - } -} diff --git a/wp/wp-includes/class-wp-embed.php b/wp/wp-includes/class-wp-embed.php deleted file mode 100644 index a8ce4d6c..00000000 --- a/wp/wp-includes/class-wp-embed.php +++ /dev/null @@ -1,386 +0,0 @@ -<?php -/** - * API for easily embedding rich media such as videos and images into content. - * - * @package WordPress - * @subpackage Embed - * @since 2.9.0 - */ -class WP_Embed { - public $handlers = array(); - public $post_ID; - public $usecache = true; - public $linkifunknown = true; - public $last_attr = array(); - public $last_url = ''; - - /** - * When a URL cannot be embedded, return false instead of returning a link - * or the URL. - * - * Bypasses the {@see 'embed_maybe_make_link'} filter. - * - * @access public - * @var bool - */ - public $return_false_on_fail = false; - - /** - * Constructor - */ - public function __construct() { - // Hack to get the [embed] shortcode to run before wpautop() - add_filter( 'the_content', array( $this, 'run_shortcode' ), 8 ); - - // Shortcode placeholder for strip_shortcodes() - add_shortcode( 'embed', '__return_false' ); - - // Attempts to embed all URLs in a post - add_filter( 'the_content', array( $this, 'autoembed' ), 8 ); - - // After a post is saved, cache oEmbed items via Ajax - add_action( 'edit_form_advanced', array( $this, 'maybe_run_ajax_cache' ) ); - add_action( 'edit_page_form', array( $this, 'maybe_run_ajax_cache' ) ); - } - - /** - * Process the [embed] shortcode. - * - * Since the [embed] shortcode needs to be run earlier than other shortcodes, - * this function removes all existing shortcodes, registers the [embed] shortcode, - * calls do_shortcode(), and then re-registers the old shortcodes. - * - * @global array $shortcode_tags - * - * @param string $content Content to parse - * @return string Content with shortcode parsed - */ - public function run_shortcode( $content ) { - global $shortcode_tags; - - // Back up current registered shortcodes and clear them all out - $orig_shortcode_tags = $shortcode_tags; - remove_all_shortcodes(); - - add_shortcode( 'embed', array( $this, 'shortcode' ) ); - - // Do the shortcode (only the [embed] one is registered) - $content = do_shortcode( $content, true ); - - // Put the original shortcodes back - $shortcode_tags = $orig_shortcode_tags; - - return $content; - } - - /** - * If a post/page was saved, then output JavaScript to make - * an Ajax request that will call WP_Embed::cache_oembed(). - */ - public function maybe_run_ajax_cache() { - $post = get_post(); - - if ( ! $post || empty( $_GET['message'] ) ) - return; - -?> -<script type="text/javascript"> - jQuery(document).ready(function($){ - $.get("<?php echo admin_url( 'admin-ajax.php?action=oembed-cache&post=' . $post->ID, 'relative' ); ?>"); - }); -</script> -<?php - } - - /** - * Registers an embed handler. - * - * Do not use this function directly, use wp_embed_register_handler() instead. - * - * This function should probably also only be used for sites that do not support oEmbed. - * - * @param string $id An internal ID/name for the handler. Needs to be unique. - * @param string $regex The regex that will be used to see if this handler should be used for a URL. - * @param callable $callback The callback function that will be called if the regex is matched. - * @param int $priority Optional. Used to specify the order in which the registered handlers will be tested (default: 10). Lower numbers correspond with earlier testing, and handlers with the same priority are tested in the order in which they were added to the action. - */ - public function register_handler( $id, $regex, $callback, $priority = 10 ) { - $this->handlers[$priority][$id] = array( - 'regex' => $regex, - 'callback' => $callback, - ); - } - - /** - * Unregisters a previously-registered embed handler. - * - * Do not use this function directly, use wp_embed_unregister_handler() instead. - * - * @param string $id The handler ID that should be removed. - * @param int $priority Optional. The priority of the handler to be removed (default: 10). - */ - public function unregister_handler( $id, $priority = 10 ) { - unset( $this->handlers[ $priority ][ $id ] ); - } - - /** - * The do_shortcode() callback function. - * - * Attempts to convert a URL into embed HTML. Starts by checking the URL against the regex of - * the registered embed handlers. If none of the regex matches and it's enabled, then the URL - * will be given to the WP_oEmbed class. - * - * @param array $attr { - * Shortcode attributes. Optional. - * - * @type int $width Width of the embed in pixels. - * @type int $height Height of the embed in pixels. - * } - * @param string $url The URL attempting to be embedded. - * @return string|false The embed HTML on success, otherwise the original URL. - * `->maybe_make_link()` can return false on failure. - */ - public function shortcode( $attr, $url = '' ) { - $post = get_post(); - - if ( empty( $url ) && ! empty( $attr['src'] ) ) { - $url = $attr['src']; - } - - $this->last_url = $url; - - if ( empty( $url ) ) { - $this->last_attr = $attr; - return ''; - } - - $rawattr = $attr; - $attr = wp_parse_args( $attr, wp_embed_defaults( $url ) ); - - $this->last_attr = $attr; - - // kses converts & into & and we need to undo this - // See https://core.trac.wordpress.org/ticket/11311 - $url = str_replace( '&', '&', $url ); - - // Look for known internal handlers - ksort( $this->handlers ); - foreach ( $this->handlers as $priority => $handlers ) { - foreach ( $handlers as $id => $handler ) { - if ( preg_match( $handler['regex'], $url, $matches ) && is_callable( $handler['callback'] ) ) { - if ( false !== $return = call_user_func( $handler['callback'], $matches, $attr, $url, $rawattr ) ) - /** - * Filters the returned embed handler. - * - * @since 2.9.0 - * - * @see WP_Embed::shortcode() - * - * @param mixed $return The shortcode callback function to call. - * @param string $url The attempted embed URL. - * @param array $attr An array of shortcode attributes. - */ - return apply_filters( 'embed_handler_html', $return, $url, $attr ); - } - } - } - - $post_ID = ( ! empty( $post->ID ) ) ? $post->ID : null; - if ( ! empty( $this->post_ID ) ) // Potentially set by WP_Embed::cache_oembed() - $post_ID = $this->post_ID; - - // Unknown URL format. Let oEmbed have a go. - if ( $post_ID ) { - - // Check for a cached result (stored in the post meta) - $key_suffix = md5( $url . serialize( $attr ) ); - $cachekey = '_oembed_' . $key_suffix; - $cachekey_time = '_oembed_time_' . $key_suffix; - - /** - * Filters the oEmbed TTL value (time to live). - * - * @since 4.0.0 - * - * @param int $time Time to live (in seconds). - * @param string $url The attempted embed URL. - * @param array $attr An array of shortcode attributes. - * @param int $post_ID Post ID. - */ - $ttl = apply_filters( 'oembed_ttl', DAY_IN_SECONDS, $url, $attr, $post_ID ); - - $cache = get_post_meta( $post_ID, $cachekey, true ); - $cache_time = get_post_meta( $post_ID, $cachekey_time, true ); - - if ( ! $cache_time ) { - $cache_time = 0; - } - - $cached_recently = ( time() - $cache_time ) < $ttl; - - if ( $this->usecache || $cached_recently ) { - // Failures are cached. Serve one if we're using the cache. - if ( '{{unknown}}' === $cache ) - return $this->maybe_make_link( $url ); - - if ( ! empty( $cache ) ) { - /** - * Filters the cached oEmbed HTML. - * - * @since 2.9.0 - * - * @see WP_Embed::shortcode() - * - * @param mixed $cache The cached HTML result, stored in post meta. - * @param string $url The attempted embed URL. - * @param array $attr An array of shortcode attributes. - * @param int $post_ID Post ID. - */ - return apply_filters( 'embed_oembed_html', $cache, $url, $attr, $post_ID ); - } - } - - /** - * Filters whether to inspect the given URL for discoverable link tags. - * - * @since 2.9.0 - * @since 4.4.0 The default value changed to true. - * - * @see WP_oEmbed::discover() - * - * @param bool $enable Whether to enable `<link>` tag discovery. Default true. - */ - $attr['discover'] = ( apply_filters( 'embed_oembed_discover', true ) ); - - // Use oEmbed to get the HTML - $html = wp_oembed_get( $url, $attr ); - - // Maybe cache the result - if ( $html ) { - update_post_meta( $post_ID, $cachekey, $html ); - update_post_meta( $post_ID, $cachekey_time, time() ); - } elseif ( ! $cache ) { - update_post_meta( $post_ID, $cachekey, '{{unknown}}' ); - } - - // If there was a result, return it - if ( $html ) { - /** This filter is documented in wp-includes/class-wp-embed.php */ - return apply_filters( 'embed_oembed_html', $html, $url, $attr, $post_ID ); - } - } - - // Still unknown - return $this->maybe_make_link( $url ); - } - - /** - * Delete all oEmbed caches. Unused by core as of 4.0.0. - * - * @param int $post_ID Post ID to delete the caches for. - */ - public function delete_oembed_caches( $post_ID ) { - $post_metas = get_post_custom_keys( $post_ID ); - if ( empty($post_metas) ) - return; - - foreach ( $post_metas as $post_meta_key ) { - if ( '_oembed_' == substr( $post_meta_key, 0, 8 ) ) - delete_post_meta( $post_ID, $post_meta_key ); - } - } - - /** - * Triggers a caching of all oEmbed results. - * - * @param int $post_ID Post ID to do the caching for. - */ - public function cache_oembed( $post_ID ) { - $post = get_post( $post_ID ); - - $post_types = get_post_types( array( 'show_ui' => true ) ); - /** - * Filters the array of post types to cache oEmbed results for. - * - * @since 2.9.0 - * - * @param array $post_types Array of post types to cache oEmbed results for. Defaults to post types with `show_ui` set to true. - */ - if ( empty( $post->ID ) || ! in_array( $post->post_type, apply_filters( 'embed_cache_oembed_types', $post_types ) ) ){ - return; - } - - // Trigger a caching - if ( ! empty( $post->post_content ) ) { - $this->post_ID = $post->ID; - $this->usecache = false; - - $content = $this->run_shortcode( $post->post_content ); - $this->autoembed( $content ); - - $this->usecache = true; - } - } - - /** - * Passes any unlinked URLs that are on their own line to WP_Embed::shortcode() for potential embedding. - * - * @see WP_Embed::autoembed_callback() - * - * @param string $content The content to be searched. - * @return string Potentially modified $content. - */ - public function autoembed( $content ) { - // Replace line breaks from all HTML elements with placeholders. - $content = wp_replace_in_html_tags( $content, array( "\n" => '<!-- wp-line-break -->' ) ); - - if ( preg_match( '#(^|\s|>)https?://#i', $content ) ) { - // Find URLs on their own line. - $content = preg_replace_callback( '|^(\s*)(https?://[^\s<>"]+)(\s*)$|im', array( $this, 'autoembed_callback' ), $content ); - // Find URLs in their own paragraph. - $content = preg_replace_callback( '|(<p(?: [^>]*)?>\s*)(https?://[^\s<>"]+)(\s*<\/p>)|i', array( $this, 'autoembed_callback' ), $content ); - } - - // Put the line breaks back. - return str_replace( '<!-- wp-line-break -->', "\n", $content ); - } - - /** - * Callback function for WP_Embed::autoembed(). - * - * @param array $match A regex match array. - * @return string The embed HTML on success, otherwise the original URL. - */ - public function autoembed_callback( $match ) { - $oldval = $this->linkifunknown; - $this->linkifunknown = false; - $return = $this->shortcode( array(), $match[2] ); - $this->linkifunknown = $oldval; - - return $match[1] . $return . $match[3]; - } - - /** - * Conditionally makes a hyperlink based on an internal class variable. - * - * @param string $url URL to potentially be linked. - * @return false|string Linked URL or the original URL. False if 'return_false_on_fail' is true. - */ - public function maybe_make_link( $url ) { - if ( $this->return_false_on_fail ) { - return false; - } - - $output = ( $this->linkifunknown ) ? '<a href="' . esc_url($url) . '">' . esc_html($url) . '</a>' : $url; - - /** - * Filters the returned, maybe-linked embed URL. - * - * @since 2.9.0 - * - * @param string $output The linked or original URL. - * @param string $url The original URL. - */ - return apply_filters( 'embed_maybe_make_link', $output, $url ); - } -} diff --git a/wp/wp-includes/class-wp-error.php b/wp/wp-includes/class-wp-error.php deleted file mode 100644 index 22273f89..00000000 --- a/wp/wp-includes/class-wp-error.php +++ /dev/null @@ -1,204 +0,0 @@ -<?php -/** - * WordPress Error API. - * - * Contains the WP_Error class and the is_wp_error() function. - * - * @package WordPress - */ - -/** - * WordPress Error class. - * - * Container for checking for WordPress errors and error messages. Return - * WP_Error and use is_wp_error() to check if this class is returned. Many - * core WordPress functions pass this class in the event of an error and - * if not handled properly will result in code errors. - * - * @package WordPress - * @since 2.1.0 - */ -class WP_Error { - /** - * Stores the list of errors. - * - * @since 2.1.0 - * @var array - */ - public $errors = array(); - - /** - * Stores the list of data for error codes. - * - * @since 2.1.0 - * @var array - */ - public $error_data = array(); - - /** - * Initialize the error. - * - * If `$code` is empty, the other parameters will be ignored. - * When `$code` is not empty, `$message` will be used even if - * it is empty. The `$data` parameter will be used only if it - * is not empty. - * - * Though the class is constructed with a single error code and - * message, multiple codes can be added using the `add()` method. - * - * @since 2.1.0 - * - * @param string|int $code Error code - * @param string $message Error message - * @param mixed $data Optional. Error data. - */ - public function __construct( $code = '', $message = '', $data = '' ) { - if ( empty($code) ) - return; - - $this->errors[$code][] = $message; - - if ( ! empty($data) ) - $this->error_data[$code] = $data; - } - - /** - * Retrieve all error codes. - * - * @since 2.1.0 - * @access public - * - * @return array List of error codes, if available. - */ - public function get_error_codes() { - if ( empty($this->errors) ) - return array(); - - return array_keys($this->errors); - } - - /** - * Retrieve first error code available. - * - * @since 2.1.0 - * @access public - * - * @return string|int Empty string, if no error codes. - */ - public function get_error_code() { - $codes = $this->get_error_codes(); - - if ( empty($codes) ) - return ''; - - return $codes[0]; - } - - /** - * Retrieve all error messages or error messages matching code. - * - * @since 2.1.0 - * - * @param string|int $code Optional. Retrieve messages matching code, if exists. - * @return array Error strings on success, or empty array on failure (if using code parameter). - */ - public function get_error_messages($code = '') { - // Return all messages if no code specified. - if ( empty($code) ) { - $all_messages = array(); - foreach ( (array) $this->errors as $code => $messages ) - $all_messages = array_merge($all_messages, $messages); - - return $all_messages; - } - - if ( isset($this->errors[$code]) ) - return $this->errors[$code]; - else - return array(); - } - - /** - * Get single error message. - * - * This will get the first message available for the code. If no code is - * given then the first code available will be used. - * - * @since 2.1.0 - * - * @param string|int $code Optional. Error code to retrieve message. - * @return string - */ - public function get_error_message($code = '') { - if ( empty($code) ) - $code = $this->get_error_code(); - $messages = $this->get_error_messages($code); - if ( empty($messages) ) - return ''; - return $messages[0]; - } - - /** - * Retrieve error data for error code. - * - * @since 2.1.0 - * - * @param string|int $code Optional. Error code. - * @return mixed Error data, if it exists. - */ - public function get_error_data($code = '') { - if ( empty($code) ) - $code = $this->get_error_code(); - - if ( isset($this->error_data[$code]) ) - return $this->error_data[$code]; - } - - /** - * Add an error or append additional message to an existing error. - * - * @since 2.1.0 - * @access public - * - * @param string|int $code Error code. - * @param string $message Error message. - * @param mixed $data Optional. Error data. - */ - public function add($code, $message, $data = '') { - $this->errors[$code][] = $message; - if ( ! empty($data) ) - $this->error_data[$code] = $data; - } - - /** - * Add data for error code. - * - * The error code can only contain one error data. - * - * @since 2.1.0 - * - * @param mixed $data Error data. - * @param string|int $code Error code. - */ - public function add_data($data, $code = '') { - if ( empty($code) ) - $code = $this->get_error_code(); - - $this->error_data[$code] = $data; - } - - /** - * Removes the specified error. - * - * This function removes all error messages associated with the specified - * error code, along with any error data for that code. - * - * @since 4.1.0 - * - * @param string|int $code Error code. - */ - public function remove( $code ) { - unset( $this->errors[ $code ] ); - unset( $this->error_data[ $code ] ); - } -} diff --git a/wp/wp-includes/class-wp-feed-cache-transient.php b/wp/wp-includes/class-wp-feed-cache-transient.php deleted file mode 100644 index 1b5be477..00000000 --- a/wp/wp-includes/class-wp-feed-cache-transient.php +++ /dev/null @@ -1,141 +0,0 @@ -<?php -/** - * Feed API: WP_Feed_Cache_Transient class - * - * @package WordPress - * @subpackage Feed - * @since 4.7.0 - */ - -/** - * Core class used to implement feed cache transients. - * - * @since 2.8.0 - */ -class WP_Feed_Cache_Transient { - - /** - * Holds the transient name. - * - * @since 2.8.0 - * @access public - * @var string - */ - public $name; - - /** - * Holds the transient mod name. - * - * @since 2.8.0 - * @access public - * @var string - */ - public $mod_name; - - /** - * Holds the cache duration in seconds. - * - * Defaults to 43200 seconds (12 hours). - * - * @since 2.8.0 - * @access public - * @var int - */ - public $lifetime = 43200; - - /** - * Constructor. - * - * @since 2.8.0 - * @since 3.2.0 Updated to use a PHP5 constructor. - * @access public - * - * @param string $location URL location (scheme is used to determine handler). - * @param string $filename Unique identifier for cache object. - * @param string $extension 'spi' or 'spc'. - */ - public function __construct($location, $filename, $extension) { - $this->name = 'feed_' . $filename; - $this->mod_name = 'feed_mod_' . $filename; - - $lifetime = $this->lifetime; - /** - * Filters the transient lifetime of the feed cache. - * - * @since 2.8.0 - * - * @param int $lifetime Cache duration in seconds. Default is 43200 seconds (12 hours). - * @param string $filename Unique identifier for the cache object. - */ - $this->lifetime = apply_filters( 'wp_feed_cache_transient_lifetime', $lifetime, $filename); - } - - /** - * Sets the transient. - * - * @since 2.8.0 - * @access public - * - * @param SimplePie $data Data to save. - * @return true Always true. - */ - public function save($data) { - if ( $data instanceof SimplePie ) { - $data = $data->data; - } - - set_transient($this->name, $data, $this->lifetime); - set_transient($this->mod_name, time(), $this->lifetime); - return true; - } - - /** - * Gets the transient. - * - * @since 2.8.0 - * @access public - * - * @return mixed Transient value. - */ - public function load() { - return get_transient($this->name); - } - - /** - * Gets mod transient. - * - * @since 2.8.0 - * @access public - * - * @return mixed Transient value. - */ - public function mtime() { - return get_transient($this->mod_name); - } - - /** - * Sets mod transient. - * - * @since 2.8.0 - * @access public - * - * @return bool False if value was not set and true if value was set. - */ - public function touch() { - return set_transient($this->mod_name, time(), $this->lifetime); - } - - /** - * Deletes transients. - * - * @since 2.8.0 - * @access public - * - * @return true Always true. - */ - public function unlink() { - delete_transient($this->name); - delete_transient($this->mod_name); - return true; - } -} diff --git a/wp/wp-includes/class-wp-feed-cache.php b/wp/wp-includes/class-wp-feed-cache.php deleted file mode 100644 index 337d3f3e..00000000 --- a/wp/wp-includes/class-wp-feed-cache.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php -/** - * Feed API: WP_Feed_Cache class - * - * @package WordPress - * @subpackage Feed - * @since 4.7.0 - */ - -/** - * Core class used to implement a feed cache. - * - * @since 2.8.0 - * - * @see SimplePie_Cache - */ -class WP_Feed_Cache extends SimplePie_Cache { - - /** - * Creates a new SimplePie_Cache object. - * - * @since 2.8.0 - * @access public - * - * @param string $location URL location (scheme is used to determine handler). - * @param string $filename Unique identifier for cache object. - * @param string $extension 'spi' or 'spc'. - * @return WP_Feed_Cache_Transient Feed cache handler object that uses transients. - */ - public function create($location, $filename, $extension) { - return new WP_Feed_Cache_Transient($location, $filename, $extension); - } -} diff --git a/wp/wp-includes/class-wp-hook.php b/wp/wp-includes/class-wp-hook.php deleted file mode 100644 index 80b93ef1..00000000 --- a/wp/wp-includes/class-wp-hook.php +++ /dev/null @@ -1,535 +0,0 @@ -<?php -/** - * Plugin API: WP_Hook class - * - * @package WordPress - * @subpackage Plugin - * @since 4.7.0 - */ - -/** - * Core class used to implement action and filter hook functionality. - * - * @since 4.7.0 - * - * @see Iterator - * @see ArrayAccess - */ -final class WP_Hook implements Iterator, ArrayAccess { - - /** - * Hook callbacks. - * - * @since 4.7.0 - * @access public - * @var array - */ - public $callbacks = array(); - - /** - * The priority keys of actively running iterations of a hook. - * - * @since 4.7.0 - * @access private - * @var array - */ - private $iterations = array(); - - /** - * The current priority of actively running iterations of a hook. - * - * @since 4.7.0 - * @access private - * @var array - */ - private $current_priority = array(); - - /** - * Number of levels this hook can be recursively called. - * - * @since 4.7.0 - * @access private - * @var int - */ - private $nesting_level = 0; - - /** - * Flag for if we're current doing an action, rather than a filter. - * - * @since 4.7.0 - * @access private - * @var bool - */ - private $doing_action = false; - - /** - * Hooks a function or method to a specific filter action. - * - * @since 4.7.0 - * @access public - * - * @param string $tag The name of the filter to hook the $function_to_add callback to. - * @param callable $function_to_add The callback to be run when the filter is applied. - * @param int $priority The order in which the functions associated with a - * particular action are executed. Lower numbers correspond with - * earlier execution, and functions with the same priority are executed - * in the order in which they were added to the action. - * @param int $accepted_args The number of arguments the function accepts. - */ - public function add_filter( $tag, $function_to_add, $priority, $accepted_args ) { - $idx = _wp_filter_build_unique_id( $tag, $function_to_add, $priority ); - $priority_existed = isset( $this->callbacks[ $priority ] ); - - $this->callbacks[ $priority ][ $idx ] = array( - 'function' => $function_to_add, - 'accepted_args' => $accepted_args - ); - - // if we're adding a new priority to the list, put them back in sorted order - if ( ! $priority_existed && count( $this->callbacks ) > 1 ) { - ksort( $this->callbacks, SORT_NUMERIC ); - } - - if ( $this->nesting_level > 0 ) { - $this->resort_active_iterations( $priority, $priority_existed ); - } - } - - /** - * Handles reseting callback priority keys mid-iteration. - * - * @since 4.7.0 - * @access private - * - * @param bool|int $new_priority Optional. The priority of the new filter being added. Default false, - * for no priority being added. - * @param bool $priority_existed Optional. Flag for whether the priority already existed before the new - * filter was added. Default false. - */ - private function resort_active_iterations( $new_priority = false, $priority_existed = false ) { - $new_priorities = array_keys( $this->callbacks ); - - // If there are no remaining hooks, clear out all running iterations. - if ( ! $new_priorities ) { - foreach ( $this->iterations as $index => $iteration ) { - $this->iterations[ $index ] = $new_priorities; - } - return; - } - - $min = min( $new_priorities ); - foreach ( $this->iterations as $index => &$iteration ) { - $current = current( $iteration ); - // If we're already at the end of this iteration, just leave the array pointer where it is. - if ( false === $current ) { - continue; - } - - $iteration = $new_priorities; - - if ( $current < $min ) { - array_unshift( $iteration, $current ); - continue; - } - - while ( current( $iteration ) < $current ) { - if ( false === next( $iteration ) ) { - break; - } - } - - // If we have a new priority that didn't exist, but ::apply_filters() or ::do_action() thinks it's the current priority... - if ( $new_priority === $this->current_priority[ $index ] && ! $priority_existed ) { - /* - * ... and the new priority is the same as what $this->iterations thinks is the previous - * priority, we need to move back to it. - */ - - if ( false === current( $iteration ) ) { - // If we've already moved off the end of the array, go back to the last element. - $prev = end( $iteration ); - } else { - // Otherwise, just go back to the previous element. - $prev = prev( $iteration ); - } - if ( false === $prev ) { - // Start of the array. Reset, and go about our day. - reset( $iteration ); - } elseif ( $new_priority !== $prev ) { - // Previous wasn't the same. Move forward again. - next( $iteration ); - } - } - } - unset( $iteration ); - } - - /** - * Unhooks a function or method from a specific filter action. - * - * @since 4.7.0 - * @access public - * - * @param string $tag The filter hook to which the function to be removed is hooked. Used - * for building the callback ID when SPL is not available. - * @param callable $function_to_remove The callback to be removed from running when the filter is applied. - * @param int $priority The exact priority used when adding the original filter callback. - * @return bool Whether the callback existed before it was removed. - */ - public function remove_filter( $tag, $function_to_remove, $priority ) { - $function_key = _wp_filter_build_unique_id( $tag, $function_to_remove, $priority ); - - $exists = isset( $this->callbacks[ $priority ][ $function_key ] ); - if ( $exists ) { - unset( $this->callbacks[ $priority ][ $function_key ] ); - if ( ! $this->callbacks[ $priority ] ) { - unset( $this->callbacks[ $priority ] ); - if ( $this->nesting_level > 0 ) { - $this->resort_active_iterations(); - } - } - } - return $exists; - } - - /** - * Checks if a specific action has been registered for this hook. - * - * @since 4.7.0 - * @access public - * - * @param callable|bool $function_to_check Optional. The callback to check for. Default false. - * @param string $tag Optional. The name of the filter hook. Used for building - * the callback ID when SPL is not available. Default empty. - * @return bool|int The priority of that hook is returned, or false if the function is not attached. - */ - public function has_filter( $tag = '', $function_to_check = false ) { - if ( false === $function_to_check ) { - return $this->has_filters(); - } - - $function_key = _wp_filter_build_unique_id( $tag, $function_to_check, false ); - if ( ! $function_key ) { - return false; - } - - foreach ( $this->callbacks as $priority => $callbacks ) { - if ( isset( $callbacks[ $function_key ] ) ) { - return $priority; - } - } - - return false; - } - - /** - * Checks if any callbacks have been registered for this hook. - * - * @since 4.7.0 - * @access public - * - * @return bool True if callbacks have been registered for the current hook, otherwise false. - */ - public function has_filters() { - foreach ( $this->callbacks as $callbacks ) { - if ( $callbacks ) { - return true; - } - } - return false; - } - - /** - * Removes all callbacks from the current filter. - * - * @since 4.7.0 - * @access public - * - * @param int|bool $priority Optional. The priority number to remove. Default false. - */ - public function remove_all_filters( $priority = false ) { - if ( ! $this->callbacks ) { - return; - } - - if ( false === $priority ) { - $this->callbacks = array(); - } else if ( isset( $this->callbacks[ $priority ] ) ) { - unset( $this->callbacks[ $priority ] ); - } - - if ( $this->nesting_level > 0 ) { - $this->resort_active_iterations(); - } - } - - /** - * Calls the callback functions added to a filter hook. - * - * @since 4.7.0 - * @access public - * - * @param mixed $value The value to filter. - * @param array $args Arguments to pass to callbacks. - * @return mixed The filtered value after all hooked functions are applied to it. - */ - public function apply_filters( $value, $args ) { - if ( ! $this->callbacks ) { - return $value; - } - - $nesting_level = $this->nesting_level++; - - $this->iterations[ $nesting_level ] = array_keys( $this->callbacks ); - $num_args = count( $args ); - - do { - $this->current_priority[ $nesting_level ] = $priority = current( $this->iterations[ $nesting_level ] ); - - foreach ( $this->callbacks[ $priority ] as $the_ ) { - if( ! $this->doing_action ) { - $args[ 0 ] = $value; - } - - // Avoid the array_slice if possible. - if ( $the_['accepted_args'] == 0 ) { - $value = call_user_func_array( $the_['function'], array() ); - } elseif ( $the_['accepted_args'] >= $num_args ) { - $value = call_user_func_array( $the_['function'], $args ); - } else { - $value = call_user_func_array( $the_['function'], array_slice( $args, 0, (int)$the_['accepted_args'] ) ); - } - } - } while ( false !== next( $this->iterations[ $nesting_level ] ) ); - - unset( $this->iterations[ $nesting_level ] ); - unset( $this->current_priority[ $nesting_level ] ); - - $this->nesting_level--; - - return $value; - } - - /** - * Executes the callback functions hooked on a specific action hook. - * - * @since 4.7.0 - * @access public - * - * @param mixed $args Arguments to pass to the hook callbacks. - */ - public function do_action( $args ) { - $this->doing_action = true; - $this->apply_filters( '', $args ); - - // If there are recursive calls to the current action, we haven't finished it until we get to the last one. - if ( ! $this->nesting_level ) { - $this->doing_action = false; - } - } - - /** - * Processes the functions hooked into the 'all' hook. - * - * @since 4.7.0 - * @access public - * - * @param array $args Arguments to pass to the hook callbacks. Passed by reference. - */ - public function do_all_hook( &$args ) { - $nesting_level = $this->nesting_level++; - $this->iterations[ $nesting_level ] = array_keys( $this->callbacks ); - - do { - $priority = current( $this->iterations[ $nesting_level ] ); - foreach ( $this->callbacks[ $priority ] as $the_ ) { - call_user_func_array( $the_['function'], $args ); - } - } while ( false !== next( $this->iterations[ $nesting_level ] ) ); - - unset( $this->iterations[ $nesting_level ] ); - $this->nesting_level--; - } - - /** - * Return the current priority level of the currently running iteration of the hook. - * - * @since 4.7.0 - * @access public - * - * @return int|false If the hook is running, return the current priority level. If it isn't running, return false. - */ - public function current_priority() { - if ( false === current( $this->iterations ) ) { - return false; - } - - return current( current( $this->iterations ) ); - } - - /** - * Normalizes filters set up before WordPress has initialized to WP_Hook objects. - * - * @since 4.7.0 - * @access public - * @static - * - * @param array $filters Filters to normalize. - * @return WP_Hook[] Array of normalized filters. - */ - public static function build_preinitialized_hooks( $filters ) { - /** @var WP_Hook[] $normalized */ - $normalized = array(); - - foreach ( $filters as $tag => $callback_groups ) { - if ( is_object( $callback_groups ) && $callback_groups instanceof WP_Hook ) { - $normalized[ $tag ] = $callback_groups; - continue; - } - $hook = new WP_Hook(); - - // Loop through callback groups. - foreach ( $callback_groups as $priority => $callbacks ) { - - // Loop through callbacks. - foreach ( $callbacks as $cb ) { - $hook->add_filter( $tag, $cb['function'], $priority, $cb['accepted_args'] ); - } - } - $normalized[ $tag ] = $hook; - } - return $normalized; - } - - /** - * Determines whether an offset value exists. - * - * @since 4.7.0 - * @access public - * - * @link http://php.net/manual/en/arrayaccess.offsetexists.php - * - * @param mixed $offset An offset to check for. - * @return bool True if the offset exists, false otherwise. - */ - public function offsetExists( $offset ) { - return isset( $this->callbacks[ $offset ] ); - } - - /** - * Retrieves a value at a specified offset. - * - * @since 4.7.0 - * @access public - * - * @link http://php.net/manual/en/arrayaccess.offsetget.php - * - * @param mixed $offset The offset to retrieve. - * @return mixed If set, the value at the specified offset, null otherwise. - */ - public function offsetGet( $offset ) { - return isset( $this->callbacks[ $offset ] ) ? $this->callbacks[ $offset ] : null; - } - - /** - * Sets a value at a specified offset. - * - * @since 4.7.0 - * @access public - * - * @link http://php.net/manual/en/arrayaccess.offsetset.php - * - * @param mixed $offset The offset to assign the value to. - * @param mixed $value The value to set. - */ - public function offsetSet( $offset, $value ) { - if ( is_null( $offset ) ) { - $this->callbacks[] = $value; - } else { - $this->callbacks[ $offset ] = $value; - } - } - - /** - * Unsets a specified offset. - * - * @since 4.7.0 - * @access public - * - * @link http://php.net/manual/en/arrayaccess.offsetunset.php - * - * @param mixed $offset The offset to unset. - */ - public function offsetUnset( $offset ) { - unset( $this->callbacks[ $offset ] ); - } - - /** - * Returns the current element. - * - * @since 4.7.0 - * @access public - * - * @link http://php.net/manual/en/iterator.current.php - * - * @return array Of callbacks at current priority. - */ - public function current() { - return current( $this->callbacks ); - } - - /** - * Moves forward to the next element. - * - * @since 4.7.0 - * @access public - * - * @link http://php.net/manual/en/iterator.next.php - * - * @return array Of callbacks at next priority. - */ - public function next() { - return next( $this->callbacks ); - } - - /** - * Returns the key of the current element. - * - * @since 4.7.0 - * @access public - * - * @link http://php.net/manual/en/iterator.key.php - * - * @return mixed Returns current priority on success, or NULL on failure - */ - public function key() { - return key( $this->callbacks ); - } - - /** - * Checks if current position is valid. - * - * @since 4.7.0 - * @access public - * - * @link http://php.net/manual/en/iterator.valid.php - * - * @return boolean - */ - public function valid() { - return key( $this->callbacks ) !== null; - } - - /** - * Rewinds the Iterator to the first element. - * - * @since 4.7.0 - * @access public - * - * @link http://php.net/manual/en/iterator.rewind.php - */ - public function rewind() { - reset( $this->callbacks ); - } - -} diff --git a/wp/wp-includes/class-wp-http-cookie.php b/wp/wp-includes/class-wp-http-cookie.php deleted file mode 100644 index d2affc2c..00000000 --- a/wp/wp-includes/class-wp-http-cookie.php +++ /dev/null @@ -1,241 +0,0 @@ -<?php -/** - * HTTP API: WP_Http_Cookie class - * - * @package WordPress - * @subpackage HTTP - * @since 4.4.0 - */ - -/** - * Core class used to encapsulate a single cookie object for internal use. - * - * Returned cookies are represented using this class, and when cookies are set, if they are not - * already a WP_Http_Cookie() object, then they are turned into one. - * - * @todo The WordPress convention is to use underscores instead of camelCase for function and method - * names. Need to switch to use underscores instead for the methods. - * - * @since 2.8.0 - */ -class WP_Http_Cookie { - - /** - * Cookie name. - * - * @since 2.8.0 - * @var string - */ - public $name; - - /** - * Cookie value. - * - * @since 2.8.0 - * @var string - */ - public $value; - - /** - * When the cookie expires. - * - * @since 2.8.0 - * @var string - */ - public $expires; - - /** - * Cookie URL path. - * - * @since 2.8.0 - * @var string - */ - public $path; - - /** - * Cookie Domain. - * - * @since 2.8.0 - * @var string - */ - public $domain; - - /** - * Sets up this cookie object. - * - * The parameter $data should be either an associative array containing the indices names below - * or a header string detailing it. - * - * @since 2.8.0 - * @access public - * - * @param string|array $data { - * Raw cookie data as header string or data array. - * - * @type string $name Cookie name. - * @type mixed $value Value. Should NOT already be urlencoded. - * @type string|int $expires Optional. Unix timestamp or formatted date. Default null. - * @type string $path Optional. Path. Default '/'. - * @type string $domain Optional. Domain. Default host of parsed $requested_url. - * @type int $port Optional. Port. Default null. - * } - * @param string $requested_url The URL which the cookie was set on, used for default $domain - * and $port values. - */ - public function __construct( $data, $requested_url = '' ) { - if ( $requested_url ) - $arrURL = @parse_url( $requested_url ); - if ( isset( $arrURL['host'] ) ) - $this->domain = $arrURL['host']; - $this->path = isset( $arrURL['path'] ) ? $arrURL['path'] : '/'; - if ( '/' != substr( $this->path, -1 ) ) - $this->path = dirname( $this->path ) . '/'; - - if ( is_string( $data ) ) { - // Assume it's a header string direct from a previous request. - $pairs = explode( ';', $data ); - - // Special handling for first pair; name=value. Also be careful of "=" in value. - $name = trim( substr( $pairs[0], 0, strpos( $pairs[0], '=' ) ) ); - $value = substr( $pairs[0], strpos( $pairs[0], '=' ) + 1 ); - $this->name = $name; - $this->value = urldecode( $value ); - - // Removes name=value from items. - array_shift( $pairs ); - - // Set everything else as a property. - foreach ( $pairs as $pair ) { - $pair = rtrim($pair); - - // Handle the cookie ending in ; which results in a empty final pair. - if ( empty($pair) ) - continue; - - list( $key, $val ) = strpos( $pair, '=' ) ? explode( '=', $pair ) : array( $pair, '' ); - $key = strtolower( trim( $key ) ); - if ( 'expires' == $key ) - $val = strtotime( $val ); - $this->$key = $val; - } - } else { - if ( !isset( $data['name'] ) ) - return; - - // Set properties based directly on parameters. - foreach ( array( 'name', 'value', 'path', 'domain', 'port' ) as $field ) { - if ( isset( $data[ $field ] ) ) - $this->$field = $data[ $field ]; - } - - if ( isset( $data['expires'] ) ) - $this->expires = is_int( $data['expires'] ) ? $data['expires'] : strtotime( $data['expires'] ); - else - $this->expires = null; - } - } - - /** - * Confirms that it's OK to send this cookie to the URL checked against. - * - * Decision is based on RFC 2109/2965, so look there for details on validity. - * - * @access public - * @since 2.8.0 - * - * @param string $url URL you intend to send this cookie to - * @return bool true if allowed, false otherwise. - */ - public function test( $url ) { - if ( is_null( $this->name ) ) - return false; - - // Expires - if expired then nothing else matters. - if ( isset( $this->expires ) && time() > $this->expires ) - return false; - - // Get details on the URL we're thinking about sending to. - $url = parse_url( $url ); - $url['port'] = isset( $url['port'] ) ? $url['port'] : ( 'https' == $url['scheme'] ? 443 : 80 ); - $url['path'] = isset( $url['path'] ) ? $url['path'] : '/'; - - // Values to use for comparison against the URL. - $path = isset( $this->path ) ? $this->path : '/'; - $port = isset( $this->port ) ? $this->port : null; - $domain = isset( $this->domain ) ? strtolower( $this->domain ) : strtolower( $url['host'] ); - if ( false === stripos( $domain, '.' ) ) - $domain .= '.local'; - - // Host - very basic check that the request URL ends with the domain restriction (minus leading dot). - $domain = substr( $domain, 0, 1 ) == '.' ? substr( $domain, 1 ) : $domain; - if ( substr( $url['host'], -strlen( $domain ) ) != $domain ) - return false; - - // Port - supports "port-lists" in the format: "80,8000,8080". - if ( !empty( $port ) && !in_array( $url['port'], explode( ',', $port) ) ) - return false; - - // Path - request path must start with path restriction. - if ( substr( $url['path'], 0, strlen( $path ) ) != $path ) - return false; - - return true; - } - - /** - * Convert cookie name and value back to header string. - * - * @access public - * @since 2.8.0 - * - * @return string Header encoded cookie name and value. - */ - public function getHeaderValue() { - if ( ! isset( $this->name ) || ! isset( $this->value ) ) - return ''; - - /** - * Filters the header-encoded cookie value. - * - * @since 3.4.0 - * - * @param string $value The cookie value. - * @param string $name The cookie name. - */ - return $this->name . '=' . apply_filters( 'wp_http_cookie_value', $this->value, $this->name ); - } - - /** - * Retrieve cookie header for usage in the rest of the WordPress HTTP API. - * - * @access public - * @since 2.8.0 - * - * @return string - */ - public function getFullHeader() { - return 'Cookie: ' . $this->getHeaderValue(); - } - - /** - * Retrieves cookie attributes. - * - * @since 4.6.0 - * @access public - * - * @return array { - * List of attributes. - * - * @type string $expires When the cookie expires. - * @type string $path Cookie URL path. - * @type string $domain Cookie domain. - * } - */ - public function get_attributes() { - return array( - 'expires' => $this->expires, - 'path' => $this->path, - 'domain' => $this->domain, - ); - } -} diff --git a/wp/wp-includes/class-wp-http-curl.php b/wp/wp-includes/class-wp-http-curl.php deleted file mode 100644 index 790e93cf..00000000 --- a/wp/wp-includes/class-wp-http-curl.php +++ /dev/null @@ -1,385 +0,0 @@ -<?php -/** - * HTTP API: WP_Http_Curl class - * - * @package WordPress - * @subpackage HTTP - * @since 4.4.0 - */ - -/** - * Core class used to integrate Curl as an HTTP transport. - * - * HTTP request method uses Curl extension to retrieve the url. - * - * Requires the Curl extension to be installed. - * - * @since 2.7.0 - */ -class WP_Http_Curl { - - /** - * Temporary header storage for during requests. - * - * @since 3.2.0 - * @access private - * @var string - */ - private $headers = ''; - - /** - * Temporary body storage for during requests. - * - * @since 3.6.0 - * @access private - * @var string - */ - private $body = ''; - - /** - * The maximum amount of data to receive from the remote server. - * - * @since 3.6.0 - * @access private - * @var int - */ - private $max_body_length = false; - - /** - * The file resource used for streaming to file. - * - * @since 3.6.0 - * @access private - * @var resource - */ - private $stream_handle = false; - - /** - * The total bytes written in the current request. - * - * @since 4.1.0 - * @access private - * @var int - */ - private $bytes_written_total = 0; - - /** - * Send a HTTP request to a URI using cURL extension. - * - * @access public - * @since 2.7.0 - * - * @param string $url The request URL. - * @param string|array $args Optional. Override the defaults. - * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error - */ - public function request($url, $args = array()) { - $defaults = array( - 'method' => 'GET', 'timeout' => 5, - 'redirection' => 5, 'httpversion' => '1.0', - 'blocking' => true, - 'headers' => array(), 'body' => null, 'cookies' => array() - ); - - $r = wp_parse_args( $args, $defaults ); - - if ( isset( $r['headers']['User-Agent'] ) ) { - $r['user-agent'] = $r['headers']['User-Agent']; - unset( $r['headers']['User-Agent'] ); - } elseif ( isset( $r['headers']['user-agent'] ) ) { - $r['user-agent'] = $r['headers']['user-agent']; - unset( $r['headers']['user-agent'] ); - } - - // Construct Cookie: header if any cookies are set. - WP_Http::buildCookieHeader( $r ); - - $handle = curl_init(); - - // cURL offers really easy proxy support. - $proxy = new WP_HTTP_Proxy(); - - if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) { - - curl_setopt( $handle, CURLOPT_PROXYTYPE, CURLPROXY_HTTP ); - curl_setopt( $handle, CURLOPT_PROXY, $proxy->host() ); - curl_setopt( $handle, CURLOPT_PROXYPORT, $proxy->port() ); - - if ( $proxy->use_authentication() ) { - curl_setopt( $handle, CURLOPT_PROXYAUTH, CURLAUTH_ANY ); - curl_setopt( $handle, CURLOPT_PROXYUSERPWD, $proxy->authentication() ); - } - } - - $is_local = isset($r['local']) && $r['local']; - $ssl_verify = isset($r['sslverify']) && $r['sslverify']; - if ( $is_local ) { - /** This filter is documented in wp-includes/class-wp-http-streams.php */ - $ssl_verify = apply_filters( 'https_local_ssl_verify', $ssl_verify ); - } elseif ( ! $is_local ) { - /** This filter is documented in wp-includes/class-wp-http-streams.php */ - $ssl_verify = apply_filters( 'https_ssl_verify', $ssl_verify ); - } - - /* - * CURLOPT_TIMEOUT and CURLOPT_CONNECTTIMEOUT expect integers. Have to use ceil since. - * a value of 0 will allow an unlimited timeout. - */ - $timeout = (int) ceil( $r['timeout'] ); - curl_setopt( $handle, CURLOPT_CONNECTTIMEOUT, $timeout ); - curl_setopt( $handle, CURLOPT_TIMEOUT, $timeout ); - - curl_setopt( $handle, CURLOPT_URL, $url); - curl_setopt( $handle, CURLOPT_RETURNTRANSFER, true ); - curl_setopt( $handle, CURLOPT_SSL_VERIFYHOST, ( $ssl_verify === true ) ? 2 : false ); - curl_setopt( $handle, CURLOPT_SSL_VERIFYPEER, $ssl_verify ); - - if ( $ssl_verify ) { - curl_setopt( $handle, CURLOPT_CAINFO, $r['sslcertificates'] ); - } - - curl_setopt( $handle, CURLOPT_USERAGENT, $r['user-agent'] ); - - /* - * The option doesn't work with safe mode or when open_basedir is set, and there's - * a bug #17490 with redirected POST requests, so handle redirections outside Curl. - */ - curl_setopt( $handle, CURLOPT_FOLLOWLOCATION, false ); - if ( defined( 'CURLOPT_PROTOCOLS' ) ) // PHP 5.2.10 / cURL 7.19.4 - curl_setopt( $handle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS ); - - switch ( $r['method'] ) { - case 'HEAD': - curl_setopt( $handle, CURLOPT_NOBODY, true ); - break; - case 'POST': - curl_setopt( $handle, CURLOPT_POST, true ); - curl_setopt( $handle, CURLOPT_POSTFIELDS, $r['body'] ); - break; - case 'PUT': - curl_setopt( $handle, CURLOPT_CUSTOMREQUEST, 'PUT' ); - curl_setopt( $handle, CURLOPT_POSTFIELDS, $r['body'] ); - break; - default: - curl_setopt( $handle, CURLOPT_CUSTOMREQUEST, $r['method'] ); - if ( ! is_null( $r['body'] ) ) - curl_setopt( $handle, CURLOPT_POSTFIELDS, $r['body'] ); - break; - } - - if ( true === $r['blocking'] ) { - curl_setopt( $handle, CURLOPT_HEADERFUNCTION, array( $this, 'stream_headers' ) ); - curl_setopt( $handle, CURLOPT_WRITEFUNCTION, array( $this, 'stream_body' ) ); - } - - curl_setopt( $handle, CURLOPT_HEADER, false ); - - if ( isset( $r['limit_response_size'] ) ) - $this->max_body_length = intval( $r['limit_response_size'] ); - else - $this->max_body_length = false; - - // If streaming to a file open a file handle, and setup our curl streaming handler. - if ( $r['stream'] ) { - if ( ! WP_DEBUG ) - $this->stream_handle = @fopen( $r['filename'], 'w+' ); - else - $this->stream_handle = fopen( $r['filename'], 'w+' ); - if ( ! $this->stream_handle ) - return new WP_Error( 'http_request_failed', sprintf( __( 'Could not open handle for fopen() to %s' ), $r['filename'] ) ); - } else { - $this->stream_handle = false; - } - - if ( !empty( $r['headers'] ) ) { - // cURL expects full header strings in each element. - $headers = array(); - foreach ( $r['headers'] as $name => $value ) { - $headers[] = "{$name}: $value"; - } - curl_setopt( $handle, CURLOPT_HTTPHEADER, $headers ); - } - - if ( $r['httpversion'] == '1.0' ) - curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0 ); - else - curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 ); - - /** - * Fires before the cURL request is executed. - * - * Cookies are not currently handled by the HTTP API. This action allows - * plugins to handle cookies themselves. - * - * @since 2.8.0 - * - * @param resource &$handle The cURL handle returned by curl_init(). - * @param array $r The HTTP request arguments. - * @param string $url The request URL. - */ - do_action_ref_array( 'http_api_curl', array( &$handle, $r, $url ) ); - - // We don't need to return the body, so don't. Just execute request and return. - if ( ! $r['blocking'] ) { - curl_exec( $handle ); - - if ( $curl_error = curl_error( $handle ) ) { - curl_close( $handle ); - return new WP_Error( 'http_request_failed', $curl_error ); - } - if ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array( 301, 302 ) ) ) { - curl_close( $handle ); - return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) ); - } - - curl_close( $handle ); - return array( 'headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array() ); - } - - curl_exec( $handle ); - $theHeaders = WP_Http::processHeaders( $this->headers, $url ); - $theBody = $this->body; - $bytes_written_total = $this->bytes_written_total; - - $this->headers = ''; - $this->body = ''; - $this->bytes_written_total = 0; - - $curl_error = curl_errno( $handle ); - - // If an error occurred, or, no response. - if ( $curl_error || ( 0 == strlen( $theBody ) && empty( $theHeaders['headers'] ) ) ) { - if ( CURLE_WRITE_ERROR /* 23 */ == $curl_error ) { - if ( ! $this->max_body_length || $this->max_body_length != $bytes_written_total ) { - if ( $r['stream'] ) { - curl_close( $handle ); - fclose( $this->stream_handle ); - return new WP_Error( 'http_request_failed', __( 'Failed to write request to temporary file.' ) ); - } else { - curl_close( $handle ); - return new WP_Error( 'http_request_failed', curl_error( $handle ) ); - } - } - } else { - if ( $curl_error = curl_error( $handle ) ) { - curl_close( $handle ); - return new WP_Error( 'http_request_failed', $curl_error ); - } - } - if ( in_array( curl_getinfo( $handle, CURLINFO_HTTP_CODE ), array( 301, 302 ) ) ) { - curl_close( $handle ); - return new WP_Error( 'http_request_failed', __( 'Too many redirects.' ) ); - } - } - - curl_close( $handle ); - - if ( $r['stream'] ) - fclose( $this->stream_handle ); - - $response = array( - 'headers' => $theHeaders['headers'], - 'body' => null, - 'response' => $theHeaders['response'], - 'cookies' => $theHeaders['cookies'], - 'filename' => $r['filename'] - ); - - // Handle redirects. - if ( false !== ( $redirect_response = WP_HTTP::handle_redirects( $url, $r, $response ) ) ) - return $redirect_response; - - if ( true === $r['decompress'] && true === WP_Http_Encoding::should_decode($theHeaders['headers']) ) - $theBody = WP_Http_Encoding::decompress( $theBody ); - - $response['body'] = $theBody; - - return $response; - } - - /** - * Grabs the headers of the cURL request. - * - * Each header is sent individually to this callback, so we append to the `$header` property - * for temporary storage - * - * @since 3.2.0 - * @access private - * - * @param resource $handle cURL handle. - * @param string $headers cURL request headers. - * @return int Length of the request headers. - */ - private function stream_headers( $handle, $headers ) { - $this->headers .= $headers; - return strlen( $headers ); - } - - /** - * Grabs the body of the cURL request. - * - * The contents of the document are passed in chunks, so we append to the `$body` - * property for temporary storage. Returning a length shorter than the length of - * `$data` passed in will cause cURL to abort the request with `CURLE_WRITE_ERROR`. - * - * @since 3.6.0 - * @access private - * - * @param resource $handle cURL handle. - * @param string $data cURL request body. - * @return int Total bytes of data written. - */ - private function stream_body( $handle, $data ) { - $data_length = strlen( $data ); - - if ( $this->max_body_length && ( $this->bytes_written_total + $data_length ) > $this->max_body_length ) { - $data_length = ( $this->max_body_length - $this->bytes_written_total ); - $data = substr( $data, 0, $data_length ); - } - - if ( $this->stream_handle ) { - $bytes_written = fwrite( $this->stream_handle, $data ); - } else { - $this->body .= $data; - $bytes_written = $data_length; - } - - $this->bytes_written_total += $bytes_written; - - // Upon event of this function returning less than strlen( $data ) curl will error with CURLE_WRITE_ERROR. - return $bytes_written; - } - - /** - * Determines whether this class can be used for retrieving a URL. - * - * @static - * @since 2.7.0 - * - * @param array $args Optional. Array of request arguments. Default empty array. - * @return bool False means this class can not be used, true means it can. - */ - public static function test( $args = array() ) { - if ( ! function_exists( 'curl_init' ) || ! function_exists( 'curl_exec' ) ) - return false; - - $is_ssl = isset( $args['ssl'] ) && $args['ssl']; - - if ( $is_ssl ) { - $curl_version = curl_version(); - // Check whether this cURL version support SSL requests. - if ( ! (CURL_VERSION_SSL & $curl_version['features']) ) - return false; - } - - /** - * Filters whether cURL can be used as a transport for retrieving a URL. - * - * @since 2.7.0 - * - * @param bool $use_class Whether the class can be used. Default true. - * @param array $args An array of request arguments. - */ - return apply_filters( 'use_curl_transport', true, $args ); - } -} diff --git a/wp/wp-includes/class-wp-http-encoding.php b/wp/wp-includes/class-wp-http-encoding.php deleted file mode 100644 index 81cfba85..00000000 --- a/wp/wp-includes/class-wp-http-encoding.php +++ /dev/null @@ -1,228 +0,0 @@ -<?php -/** - * HTTP API: WP_Http_Encoding class - * - * @package WordPress - * @subpackage HTTP - * @since 4.4.0 - */ - -/** - * Core class used to implement deflate and gzip transfer encoding support for HTTP requests. - * - * Includes RFC 1950, RFC 1951, and RFC 1952. - * - * @since 2.8.0 - */ -class WP_Http_Encoding { - - /** - * Compress raw string using the deflate format. - * - * Supports the RFC 1951 standard. - * - * @since 2.8.0 - * - * @static - * - * @param string $raw String to compress. - * @param int $level Optional, default is 9. Compression level, 9 is highest. - * @param string $supports Optional, not used. When implemented it will choose the right compression based on what the server supports. - * @return string|false False on failure. - */ - public static function compress( $raw, $level = 9, $supports = null ) { - return gzdeflate( $raw, $level ); - } - - /** - * Decompression of deflated string. - * - * Will attempt to decompress using the RFC 1950 standard, and if that fails - * then the RFC 1951 standard deflate will be attempted. Finally, the RFC - * 1952 standard gzip decode will be attempted. If all fail, then the - * original compressed string will be returned. - * - * @since 2.8.0 - * - * @static - * - * @param string $compressed String to decompress. - * @param int $length The optional length of the compressed data. - * @return string|bool False on failure. - */ - public static function decompress( $compressed, $length = null ) { - - if ( empty($compressed) ) - return $compressed; - - if ( false !== ( $decompressed = @gzinflate( $compressed ) ) ) - return $decompressed; - - if ( false !== ( $decompressed = self::compatible_gzinflate( $compressed ) ) ) - return $decompressed; - - if ( false !== ( $decompressed = @gzuncompress( $compressed ) ) ) - return $decompressed; - - if ( function_exists('gzdecode') ) { - $decompressed = @gzdecode( $compressed ); - - if ( false !== $decompressed ) - return $decompressed; - } - - return $compressed; - } - - /** - * Decompression of deflated string while staying compatible with the majority of servers. - * - * Certain Servers will return deflated data with headers which PHP's gzinflate() - * function cannot handle out of the box. The following function has been created from - * various snippets on the gzinflate() PHP documentation. - * - * Warning: Magic numbers within. Due to the potential different formats that the compressed - * data may be returned in, some "magic offsets" are needed to ensure proper decompression - * takes place. For a simple progmatic way to determine the magic offset in use, see: - * https://core.trac.wordpress.org/ticket/18273 - * - * @since 2.8.1 - * @link https://core.trac.wordpress.org/ticket/18273 - * @link https://secure.php.net/manual/en/function.gzinflate.php#70875 - * @link https://secure.php.net/manual/en/function.gzinflate.php#77336 - * - * @static - * - * @param string $gzData String to decompress. - * @return string|bool False on failure. - */ - public static function compatible_gzinflate($gzData) { - - // Compressed data might contain a full header, if so strip it for gzinflate(). - if ( substr($gzData, 0, 3) == "\x1f\x8b\x08" ) { - $i = 10; - $flg = ord( substr($gzData, 3, 1) ); - if ( $flg > 0 ) { - if ( $flg & 4 ) { - list($xlen) = unpack('v', substr($gzData, $i, 2) ); - $i = $i + 2 + $xlen; - } - if ( $flg & 8 ) - $i = strpos($gzData, "\0", $i) + 1; - if ( $flg & 16 ) - $i = strpos($gzData, "\0", $i) + 1; - if ( $flg & 2 ) - $i = $i + 2; - } - $decompressed = @gzinflate( substr($gzData, $i, -8) ); - if ( false !== $decompressed ) - return $decompressed; - } - - // Compressed data from java.util.zip.Deflater amongst others. - $decompressed = @gzinflate( substr($gzData, 2) ); - if ( false !== $decompressed ) - return $decompressed; - - return false; - } - - /** - * What encoding types to accept and their priority values. - * - * @since 2.8.0 - * - * @static - * - * @param string $url - * @param array $args - * @return string Types of encoding to accept. - */ - public static function accept_encoding( $url, $args ) { - $type = array(); - $compression_enabled = self::is_available(); - - if ( ! $args['decompress'] ) // Decompression specifically disabled. - $compression_enabled = false; - elseif ( $args['stream'] ) // Disable when streaming to file. - $compression_enabled = false; - elseif ( isset( $args['limit_response_size'] ) ) // If only partial content is being requested, we won't be able to decompress it. - $compression_enabled = false; - - if ( $compression_enabled ) { - if ( function_exists( 'gzinflate' ) ) - $type[] = 'deflate;q=1.0'; - - if ( function_exists( 'gzuncompress' ) ) - $type[] = 'compress;q=0.5'; - - if ( function_exists( 'gzdecode' ) ) - $type[] = 'gzip;q=0.5'; - } - - /** - * Filters the allowed encoding types. - * - * @since 3.6.0 - * - * @param array $type Encoding types allowed. Accepts 'gzinflate', - * 'gzuncompress', 'gzdecode'. - * @param string $url URL of the HTTP request. - * @param array $args HTTP request arguments. - */ - $type = apply_filters( 'wp_http_accept_encoding', $type, $url, $args ); - - return implode(', ', $type); - } - - /** - * What encoding the content used when it was compressed to send in the headers. - * - * @since 2.8.0 - * - * @static - * - * @return string Content-Encoding string to send in the header. - */ - public static function content_encoding() { - return 'deflate'; - } - - /** - * Whether the content be decoded based on the headers. - * - * @since 2.8.0 - * - * @static - * - * @param array|string $headers All of the available headers. - * @return bool - */ - public static function should_decode($headers) { - if ( is_array( $headers ) ) { - if ( array_key_exists('content-encoding', $headers) && ! empty( $headers['content-encoding'] ) ) - return true; - } elseif ( is_string( $headers ) ) { - return ( stripos($headers, 'content-encoding:') !== false ); - } - - return false; - } - - /** - * Whether decompression and compression are supported by the PHP version. - * - * Each function is tested instead of checking for the zlib extension, to - * ensure that the functions all exist in the PHP version and aren't - * disabled. - * - * @since 2.8.0 - * - * @static - * - * @return bool - */ - public static function is_available() { - return ( function_exists('gzuncompress') || function_exists('gzdeflate') || function_exists('gzinflate') ); - } -} diff --git a/wp/wp-includes/class-wp-http-ixr-client.php b/wp/wp-includes/class-wp-http-ixr-client.php deleted file mode 100644 index e4ed5502..00000000 --- a/wp/wp-includes/class-wp-http-ixr-client.php +++ /dev/null @@ -1,124 +0,0 @@ -<?php -/** - * WP_HTTP_IXR_Client - * - * @package WordPress - * @since 3.1.0 - * - */ -class WP_HTTP_IXR_Client extends IXR_Client { - public $scheme; - /** - * @var IXR_Error - */ - public $error; - - /** - * @param string $server - * @param string|bool $path - * @param int|bool $port - * @param int $timeout - */ - public function __construct($server, $path = false, $port = false, $timeout = 15) { - if ( ! $path ) { - // Assume we have been given a URL instead - $bits = parse_url($server); - $this->scheme = $bits['scheme']; - $this->server = $bits['host']; - $this->port = isset($bits['port']) ? $bits['port'] : $port; - $this->path = !empty($bits['path']) ? $bits['path'] : '/'; - - // Make absolutely sure we have a path - if ( ! $this->path ) { - $this->path = '/'; - } - - if ( ! empty( $bits['query'] ) ) { - $this->path .= '?' . $bits['query']; - } - } else { - $this->scheme = 'http'; - $this->server = $server; - $this->path = $path; - $this->port = $port; - } - $this->useragent = 'The Incutio XML-RPC PHP Library'; - $this->timeout = $timeout; - } - - /** - * @return bool - */ - public function query() { - $args = func_get_args(); - $method = array_shift($args); - $request = new IXR_Request($method, $args); - $xml = $request->getXml(); - - $port = $this->port ? ":$this->port" : ''; - $url = $this->scheme . '://' . $this->server . $port . $this->path; - $args = array( - 'headers' => array('Content-Type' => 'text/xml'), - 'user-agent' => $this->useragent, - 'body' => $xml, - ); - - // Merge Custom headers ala #8145 - foreach ( $this->headers as $header => $value ) { - $args['headers'][$header] = $value; - } - - /** - * Filters the headers collection to be sent to the XML-RPC server. - * - * @since 4.4.0 - * - * @param array $headers Array of headers to be sent. - */ - $args['headers'] = apply_filters( 'wp_http_ixr_client_headers', $args['headers'] ); - - if ( $this->timeout !== false ) { - $args['timeout'] = $this->timeout; - } - - // Now send the request - if ( $this->debug ) { - echo '<pre class="ixr_request">' . htmlspecialchars($xml) . "\n</pre>\n\n"; - } - - $response = wp_remote_post($url, $args); - - if ( is_wp_error($response) ) { - $errno = $response->get_error_code(); - $errorstr = $response->get_error_message(); - $this->error = new IXR_Error(-32300, "transport error: $errno $errorstr"); - return false; - } - - if ( 200 != wp_remote_retrieve_response_code( $response ) ) { - $this->error = new IXR_Error(-32301, 'transport error - HTTP status code was not 200 (' . wp_remote_retrieve_response_code( $response ) . ')'); - return false; - } - - if ( $this->debug ) { - echo '<pre class="ixr_response">' . htmlspecialchars( wp_remote_retrieve_body( $response ) ) . "\n</pre>\n\n"; - } - - // Now parse what we've got back - $this->message = new IXR_Message( wp_remote_retrieve_body( $response ) ); - if ( ! $this->message->parse() ) { - // XML error - $this->error = new IXR_Error(-32700, 'parse error. not well formed'); - return false; - } - - // Is the message a fault? - if ( $this->message->messageType == 'fault' ) { - $this->error = new IXR_Error($this->message->faultCode, $this->message->faultString); - return false; - } - - // Message must be OK - return true; - } -} diff --git a/wp/wp-includes/class-wp-http-proxy.php b/wp/wp-includes/class-wp-http-proxy.php deleted file mode 100644 index 7ae3d4e2..00000000 --- a/wp/wp-includes/class-wp-http-proxy.php +++ /dev/null @@ -1,219 +0,0 @@ -<?php -/** - * HTTP API: WP_HTTP_Proxy class - * - * @package WordPress - * @subpackage HTTP - * @since 4.4.0 - */ - -/** - * Core class used to implement HTTP API proxy support. - * - * There are caveats to proxy support. It requires that defines be made in the wp-config.php file to - * enable proxy support. There are also a few filters that plugins can hook into for some of the - * constants. - * - * Please note that only BASIC authentication is supported by most transports. - * cURL MAY support more methods (such as NTLM authentication) depending on your environment. - * - * The constants are as follows: - * <ol> - * <li>WP_PROXY_HOST - Enable proxy support and host for connecting.</li> - * <li>WP_PROXY_PORT - Proxy port for connection. No default, must be defined.</li> - * <li>WP_PROXY_USERNAME - Proxy username, if it requires authentication.</li> - * <li>WP_PROXY_PASSWORD - Proxy password, if it requires authentication.</li> - * <li>WP_PROXY_BYPASS_HOSTS - Will prevent the hosts in this list from going through the proxy. - * You do not need to have localhost and the site host in this list, because they will not be passed - * through the proxy. The list should be presented in a comma separated list, wildcards using * are supported, eg. *.wordpress.org</li> - * </ol> - * - * An example can be as seen below. - * - * define('WP_PROXY_HOST', '192.168.84.101'); - * define('WP_PROXY_PORT', '8080'); - * define('WP_PROXY_BYPASS_HOSTS', 'localhost, www.example.com, *.wordpress.org'); - * - * @link https://core.trac.wordpress.org/ticket/4011 Proxy support ticket in WordPress. - * @link https://core.trac.wordpress.org/ticket/14636 Allow wildcard domains in WP_PROXY_BYPASS_HOSTS - * - * @since 2.8.0 - */ -class WP_HTTP_Proxy { - - /** - * Whether proxy connection should be used. - * - * @since 2.8.0 - * - * @use WP_PROXY_HOST - * @use WP_PROXY_PORT - * - * @return bool - */ - public function is_enabled() { - return defined('WP_PROXY_HOST') && defined('WP_PROXY_PORT'); - } - - /** - * Whether authentication should be used. - * - * @since 2.8.0 - * - * @use WP_PROXY_USERNAME - * @use WP_PROXY_PASSWORD - * - * @return bool - */ - public function use_authentication() { - return defined('WP_PROXY_USERNAME') && defined('WP_PROXY_PASSWORD'); - } - - /** - * Retrieve the host for the proxy server. - * - * @since 2.8.0 - * - * @return string - */ - public function host() { - if ( defined('WP_PROXY_HOST') ) - return WP_PROXY_HOST; - - return ''; - } - - /** - * Retrieve the port for the proxy server. - * - * @since 2.8.0 - * - * @return string - */ - public function port() { - if ( defined('WP_PROXY_PORT') ) - return WP_PROXY_PORT; - - return ''; - } - - /** - * Retrieve the username for proxy authentication. - * - * @since 2.8.0 - * - * @return string - */ - public function username() { - if ( defined('WP_PROXY_USERNAME') ) - return WP_PROXY_USERNAME; - - return ''; - } - - /** - * Retrieve the password for proxy authentication. - * - * @since 2.8.0 - * - * @return string - */ - public function password() { - if ( defined('WP_PROXY_PASSWORD') ) - return WP_PROXY_PASSWORD; - - return ''; - } - - /** - * Retrieve authentication string for proxy authentication. - * - * @since 2.8.0 - * - * @return string - */ - public function authentication() { - return $this->username() . ':' . $this->password(); - } - - /** - * Retrieve header string for proxy authentication. - * - * @since 2.8.0 - * - * @return string - */ - public function authentication_header() { - return 'Proxy-Authorization: Basic ' . base64_encode( $this->authentication() ); - } - - /** - * Whether URL should be sent through the proxy server. - * - * We want to keep localhost and the site URL from being sent through the proxy server, because - * some proxies can not handle this. We also have the constant available for defining other - * hosts that won't be sent through the proxy. - * - * @since 2.8.0 - * - * @staticvar array|null $bypass_hosts - * @staticvar array $wildcard_regex - * - * @param string $uri URI to check. - * @return bool True, to send through the proxy and false if, the proxy should not be used. - */ - public function send_through_proxy( $uri ) { - /* - * parse_url() only handles http, https type URLs, and will emit E_WARNING on failure. - * This will be displayed on sites, which is not reasonable. - */ - $check = @parse_url($uri); - - // Malformed URL, can not process, but this could mean ssl, so let through anyway. - if ( $check === false ) - return true; - - $home = parse_url( get_option('siteurl') ); - - /** - * Filters whether to preempt sending the request through the proxy server. - * - * Returning false will bypass the proxy; returning true will send - * the request through the proxy. Returning null bypasses the filter. - * - * @since 3.5.0 - * - * @param null $override Whether to override the request result. Default null. - * @param string $uri URL to check. - * @param array $check Associative array result of parsing the URI. - * @param array $home Associative array result of parsing the site URL. - */ - $result = apply_filters( 'pre_http_send_through_proxy', null, $uri, $check, $home ); - if ( ! is_null( $result ) ) - return $result; - - if ( 'localhost' == $check['host'] || ( isset( $home['host'] ) && $home['host'] == $check['host'] ) ) - return false; - - if ( !defined('WP_PROXY_BYPASS_HOSTS') ) - return true; - - static $bypass_hosts = null; - static $wildcard_regex = array(); - if ( null === $bypass_hosts ) { - $bypass_hosts = preg_split('|,\s*|', WP_PROXY_BYPASS_HOSTS); - - if ( false !== strpos(WP_PROXY_BYPASS_HOSTS, '*') ) { - $wildcard_regex = array(); - foreach ( $bypass_hosts as $host ) - $wildcard_regex[] = str_replace( '\*', '.+', preg_quote( $host, '/' ) ); - $wildcard_regex = '/^(' . implode('|', $wildcard_regex) . ')$/i'; - } - } - - if ( !empty($wildcard_regex) ) - return !preg_match($wildcard_regex, $check['host']); - else - return !in_array( $check['host'], $bypass_hosts ); - } -} diff --git a/wp/wp-includes/class-wp-http-requests-hooks.php b/wp/wp-includes/class-wp-http-requests-hooks.php deleted file mode 100644 index 6650d586..00000000 --- a/wp/wp-includes/class-wp-http-requests-hooks.php +++ /dev/null @@ -1,76 +0,0 @@ -<?php -/** - * HTTP API: Requests hook bridge class - * - * @package WordPress - * @subpackage HTTP - * @since 4.7.0 - */ - -/** - * Bridge to connect Requests internal hooks to WordPress actions. - * - * @package WordPress - * @subpackage HTTP - * @since 4.7.0 - */ -class WP_HTTP_Requests_Hooks extends Requests_Hooks { - /** - * Requested URL. - * - * @var string Requested URL. - */ - protected $url; - - /** - * WordPress WP_HTTP request data. - * - * @var array Request data in WP_Http format. - */ - protected $request = array(); - - /** - * Constructor. - * - * @param string $url URL to request. - * @param array $request Request data in WP_Http format. - */ - public function __construct( $url, $request ) { - $this->url = $url; - $this->request = $request; - } - - /** - * Dispatch a Requests hook to a native WordPress action. - * - * @param string $hook Hook name. - * @param array $parameters Parameters to pass to callbacks. - * @return boolean True if hooks were run, false if nothing was hooked. - */ - public function dispatch( $hook, $parameters = array() ) { - $result = parent::dispatch( $hook, $parameters ); - - // Handle back-compat actions - switch ( $hook ) { - case 'curl.before_send': - /** This action is documented in wp-includes/class-wp-http-curl.php */ - do_action_ref_array( 'http_api_curl', array( &$parameters[0], $this->request, $this->url ) ); - break; - } - - /** - * Transforms a native Request hook to a WordPress actions. - * - * This action maps Requests internal hook to a native WordPress action. - * - * @see https://github.com/rmccue/Requests/blob/master/docs/hooks.md - * - * @param array $parameters Parameters from Requests internal hook. - * @param array $request Request data in WP_Http format. - * @param string $url URL to request. - */ - do_action_ref_array( "requests-{$hook}", $parameters, $this->request, $this->url ); - - return $result; - } -} diff --git a/wp/wp-includes/class-wp-http-requests-response.php b/wp/wp-includes/class-wp-http-requests-response.php deleted file mode 100644 index 66083191..00000000 --- a/wp/wp-includes/class-wp-http-requests-response.php +++ /dev/null @@ -1,209 +0,0 @@ -<?php -/** - * HTTP API: WP_HTTP_Requests_Response class - * - * @package WordPress - * @subpackage HTTP - * @since 4.6.0 - */ - -/** - * Core wrapper object for a Requests_Response for standardisation. - * - * @since 4.6.0 - * - * @see WP_HTTP_Response - */ -class WP_HTTP_Requests_Response extends WP_HTTP_Response { - /** - * Requests Response object. - * - * @since 4.6.0 - * @access protected - * @var Requests_Response - */ - protected $response; - - /** - * Filename the response was saved to. - * - * @since 4.6.0 - * @access protected - * @var string|null - */ - protected $filename; - - /** - * Constructor. - * - * @since 4.6.0 - * @access public - * - * @param Requests_Response $response HTTP response. - * @param string $filename Optional. File name. Default empty. - */ - public function __construct( Requests_Response $response, $filename = '' ) { - $this->response = $response; - $this->filename = $filename; - } - - /** - * Retrieves the response object for the request. - * - * @since 4.6.0 - * @access public - * - * @return Requests_Response HTTP response. - */ - public function get_response_object() { - return $this->response; - } - - /** - * Retrieves headers associated with the response. - * - * @since 4.6.0 - * @access public - * - * @see \Requests_Utility_CaseInsensitiveDictionary - * - * @return \Requests_Utility_CaseInsensitiveDictionary Map of header name to header value. - */ - public function get_headers() { - // Ensure headers remain case-insensitive. - $converted = new Requests_Utility_CaseInsensitiveDictionary(); - - foreach ( $this->response->headers->getAll() as $key => $value ) { - if ( count( $value ) === 1 ) { - $converted[ $key ] = $value[0]; - } else { - $converted[ $key ] = $value; - } - } - - return $converted; - } - - /** - * Sets all header values. - * - * @since 4.6.0 - * @access public - * - * @param array $headers Map of header name to header value. - */ - public function set_headers( $headers ) { - $this->response->headers = new Requests_Response_Headers( $headers ); - } - - /** - * Sets a single HTTP header. - * - * @since 4.6.0 - * @access public - * - * @param string $key Header name. - * @param string $value Header value. - * @param bool $replace Optional. Whether to replace an existing header of the same name. - * Default true. - */ - public function header( $key, $value, $replace = true ) { - if ( $replace ) { - unset( $this->response->headers[ $key ] ); - } - - $this->response->headers[ $key ] = $value; - } - - /** - * Retrieves the HTTP return code for the response. - * - * @since 4.6.0 - * @access public - * - * @return int The 3-digit HTTP status code. - */ - public function get_status() { - return $this->response->status_code; - } - - /** - * Sets the 3-digit HTTP status code. - * - * @since 4.6.0 - * @access public - * - * @param int $code HTTP status. - */ - public function set_status( $code ) { - $this->response->status_code = absint( $code ); - } - - /** - * Retrieves the response data. - * - * @since 4.6.0 - * @access public - * - * @return mixed Response data. - */ - public function get_data() { - return $this->response->body; - } - - /** - * Sets the response data. - * - * @since 4.6.0 - * @access public - * - * @param mixed $data Response data. - */ - public function set_data( $data ) { - $this->response->body = $data; - } - - /** - * Retrieves cookies from the response. - * - * @since 4.6.0 - * @access public - * - * @return WP_HTTP_Cookie[] List of cookie objects. - */ - public function get_cookies() { - $cookies = array(); - foreach ( $this->response->cookies as $cookie ) { - $cookies[] = new WP_Http_Cookie( array( - 'name' => $cookie->name, - 'value' => urldecode( $cookie->value ), - 'expires' => isset( $cookie->attributes['expires'] ) ? $cookie->attributes['expires'] : null, - 'path' => isset( $cookie->attributes['path'] ) ? $cookie->attributes['path'] : null, - 'domain' => isset( $cookie->attributes['domain'] ) ? $cookie->attributes['domain'] : null, - )); - } - - return $cookies; - } - - /** - * Converts the object to a WP_Http response array. - * - * @since 4.6.0 - * @access public - * - * @return array WP_Http response array, per WP_Http::request(). - */ - public function to_array() { - return array( - 'headers' => $this->get_headers(), - 'body' => $this->get_data(), - 'response' => array( - 'code' => $this->get_status(), - 'message' => get_status_header_desc( $this->get_status() ), - ), - 'cookies' => $this->get_cookies(), - 'filename' => $this->filename, - ); - } -} diff --git a/wp/wp-includes/class-wp-http-response.php b/wp/wp-includes/class-wp-http-response.php deleted file mode 100644 index da83de1d..00000000 --- a/wp/wp-includes/class-wp-http-response.php +++ /dev/null @@ -1,165 +0,0 @@ -<?php -/** - * HTTP API: WP_HTTP_Response class - * - * @package WordPress - * @subpackage HTTP - * @since 4.4.0 - */ - -/** - * Core class used to prepare HTTP responses. - * - * @since 4.4.0 - */ -class WP_HTTP_Response { - - /** - * Response data. - * - * @since 4.4.0 - * @access public - * @var mixed - */ - public $data; - - /** - * Response headers. - * - * @since 4.4.0 - * @access public - * @var array - */ - public $headers; - - /** - * Response status. - * - * @since 4.4.0 - * @access public - * @var int - */ - public $status; - - /** - * Constructor. - * - * @since 4.4.0 - * @access public - * - * @param mixed $data Response data. Default null. - * @param int $status Optional. HTTP status code. Default 200. - * @param array $headers Optional. HTTP header map. Default empty array. - */ - public function __construct( $data = null, $status = 200, $headers = array() ) { - $this->data = $data; - $this->set_status( $status ); - $this->set_headers( $headers ); - } - - /** - * Retrieves headers associated with the response. - * - * @since 4.4.0 - * @access public - * - * @return array Map of header name to header value. - */ - public function get_headers() { - return $this->headers; - } - - /** - * Sets all header values. - * - * @since 4.4.0 - * @access public - * - * @param array $headers Map of header name to header value. - */ - public function set_headers( $headers ) { - $this->headers = $headers; - } - - /** - * Sets a single HTTP header. - * - * @since 4.4.0 - * @access public - * - * @param string $key Header name. - * @param string $value Header value. - * @param bool $replace Optional. Whether to replace an existing header of the same name. - * Default true. - */ - public function header( $key, $value, $replace = true ) { - if ( $replace || ! isset( $this->headers[ $key ] ) ) { - $this->headers[ $key ] = $value; - } else { - $this->headers[ $key ] .= ', ' . $value; - } - } - - /** - * Retrieves the HTTP return code for the response. - * - * @since 4.4.0 - * @access public - * - * @return int The 3-digit HTTP status code. - */ - public function get_status() { - return $this->status; - } - - /** - * Sets the 3-digit HTTP status code. - * - * @since 4.4.0 - * @access public - * - * @param int $code HTTP status. - */ - public function set_status( $code ) { - $this->status = absint( $code ); - } - - /** - * Retrieves the response data. - * - * @since 4.4.0 - * @access public - * - * @return mixed Response data. - */ - public function get_data() { - return $this->data; - } - - /** - * Sets the response data. - * - * @since 4.4.0 - * @access public - * - * @param mixed $data Response data. - */ - public function set_data( $data ) { - $this->data = $data; - } - - /** - * Retrieves the response data for JSON serialization. - * - * It is expected that in most implementations, this will return the same as get_data(), - * however this may be different if you want to do custom JSON data handling. - * - * @since 4.4.0 - * @access public - * - * @return mixed Any JSON-serializable value. - */ - public function jsonSerialize() { - return $this->get_data(); - } -} diff --git a/wp/wp-includes/class-wp-http-streams.php b/wp/wp-includes/class-wp-http-streams.php deleted file mode 100644 index 2f10c675..00000000 --- a/wp/wp-includes/class-wp-http-streams.php +++ /dev/null @@ -1,428 +0,0 @@ -<?php -/** - * HTTP API: WP_Http_Streams class - * - * @package WordPress - * @subpackage HTTP - * @since 4.4.0 - */ - -/** - * Core class used to integrate PHP Streams as an HTTP transport. - * - * @since 2.7.0 - * @since 3.7.0 Combined with the fsockopen transport and switched to `stream_socket_client()`. - */ -class WP_Http_Streams { - /** - * Send a HTTP request to a URI using PHP Streams. - * - * @see WP_Http::request For default options descriptions. - * - * @since 2.7.0 - * @since 3.7.0 Combined with the fsockopen transport and switched to stream_socket_client(). - * - * @access public - * @param string $url The request URL. - * @param string|array $args Optional. Override the defaults. - * @return array|WP_Error Array containing 'headers', 'body', 'response', 'cookies', 'filename'. A WP_Error instance upon error - */ - public function request($url, $args = array()) { - $defaults = array( - 'method' => 'GET', 'timeout' => 5, - 'redirection' => 5, 'httpversion' => '1.0', - 'blocking' => true, - 'headers' => array(), 'body' => null, 'cookies' => array() - ); - - $r = wp_parse_args( $args, $defaults ); - - if ( isset( $r['headers']['User-Agent'] ) ) { - $r['user-agent'] = $r['headers']['User-Agent']; - unset( $r['headers']['User-Agent'] ); - } elseif ( isset( $r['headers']['user-agent'] ) ) { - $r['user-agent'] = $r['headers']['user-agent']; - unset( $r['headers']['user-agent'] ); - } - - // Construct Cookie: header if any cookies are set. - WP_Http::buildCookieHeader( $r ); - - $arrURL = parse_url($url); - - $connect_host = $arrURL['host']; - - $secure_transport = ( $arrURL['scheme'] == 'ssl' || $arrURL['scheme'] == 'https' ); - if ( ! isset( $arrURL['port'] ) ) { - if ( $arrURL['scheme'] == 'ssl' || $arrURL['scheme'] == 'https' ) { - $arrURL['port'] = 443; - $secure_transport = true; - } else { - $arrURL['port'] = 80; - } - } - - // Always pass a Path, defaulting to the root in cases such as http://example.com - if ( ! isset( $arrURL['path'] ) ) { - $arrURL['path'] = '/'; - } - - if ( isset( $r['headers']['Host'] ) || isset( $r['headers']['host'] ) ) { - if ( isset( $r['headers']['Host'] ) ) - $arrURL['host'] = $r['headers']['Host']; - else - $arrURL['host'] = $r['headers']['host']; - unset( $r['headers']['Host'], $r['headers']['host'] ); - } - - /* - * Certain versions of PHP have issues with 'localhost' and IPv6, It attempts to connect - * to ::1, which fails when the server is not set up for it. For compatibility, always - * connect to the IPv4 address. - */ - if ( 'localhost' == strtolower( $connect_host ) ) - $connect_host = '127.0.0.1'; - - $connect_host = $secure_transport ? 'ssl://' . $connect_host : 'tcp://' . $connect_host; - - $is_local = isset( $r['local'] ) && $r['local']; - $ssl_verify = isset( $r['sslverify'] ) && $r['sslverify']; - if ( $is_local ) { - /** - * Filters whether SSL should be verified for local requests. - * - * @since 2.8.0 - * - * @param bool $ssl_verify Whether to verify the SSL connection. Default true. - */ - $ssl_verify = apply_filters( 'https_local_ssl_verify', $ssl_verify ); - } elseif ( ! $is_local ) { - /** - * Filters whether SSL should be verified for non-local requests. - * - * @since 2.8.0 - * - * @param bool $ssl_verify Whether to verify the SSL connection. Default true. - */ - $ssl_verify = apply_filters( 'https_ssl_verify', $ssl_verify ); - } - - $proxy = new WP_HTTP_Proxy(); - - $context = stream_context_create( array( - 'ssl' => array( - 'verify_peer' => $ssl_verify, - //'CN_match' => $arrURL['host'], // This is handled by self::verify_ssl_certificate() - 'capture_peer_cert' => $ssl_verify, - 'SNI_enabled' => true, - 'cafile' => $r['sslcertificates'], - 'allow_self_signed' => ! $ssl_verify, - ) - ) ); - - $timeout = (int) floor( $r['timeout'] ); - $utimeout = $timeout == $r['timeout'] ? 0 : 1000000 * $r['timeout'] % 1000000; - $connect_timeout = max( $timeout, 1 ); - - // Store error number. - $connection_error = null; - - // Store error string. - $connection_error_str = null; - - if ( !WP_DEBUG ) { - // In the event that the SSL connection fails, silence the many PHP Warnings. - if ( $secure_transport ) - $error_reporting = error_reporting(0); - - if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) - $handle = @stream_socket_client( 'tcp://' . $proxy->host() . ':' . $proxy->port(), $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); - else - $handle = @stream_socket_client( $connect_host . ':' . $arrURL['port'], $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); - - if ( $secure_transport ) - error_reporting( $error_reporting ); - - } else { - if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) - $handle = stream_socket_client( 'tcp://' . $proxy->host() . ':' . $proxy->port(), $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); - else - $handle = stream_socket_client( $connect_host . ':' . $arrURL['port'], $connection_error, $connection_error_str, $connect_timeout, STREAM_CLIENT_CONNECT, $context ); - } - - if ( false === $handle ) { - // SSL connection failed due to expired/invalid cert, or, OpenSSL configuration is broken. - if ( $secure_transport && 0 === $connection_error && '' === $connection_error_str ) - return new WP_Error( 'http_request_failed', __( 'The SSL certificate for the host could not be verified.' ) ); - - return new WP_Error('http_request_failed', $connection_error . ': ' . $connection_error_str ); - } - - // Verify that the SSL certificate is valid for this request. - if ( $secure_transport && $ssl_verify && ! $proxy->is_enabled() ) { - if ( ! self::verify_ssl_certificate( $handle, $arrURL['host'] ) ) - return new WP_Error( 'http_request_failed', __( 'The SSL certificate for the host could not be verified.' ) ); - } - - stream_set_timeout( $handle, $timeout, $utimeout ); - - if ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) //Some proxies require full URL in this field. - $requestPath = $url; - else - $requestPath = $arrURL['path'] . ( isset($arrURL['query']) ? '?' . $arrURL['query'] : '' ); - - $strHeaders = strtoupper($r['method']) . ' ' . $requestPath . ' HTTP/' . $r['httpversion'] . "\r\n"; - - $include_port_in_host_header = ( - ( $proxy->is_enabled() && $proxy->send_through_proxy( $url ) ) || - ( 'http' == $arrURL['scheme'] && 80 != $arrURL['port'] ) || - ( 'https' == $arrURL['scheme'] && 443 != $arrURL['port'] ) - ); - - if ( $include_port_in_host_header ) { - $strHeaders .= 'Host: ' . $arrURL['host'] . ':' . $arrURL['port'] . "\r\n"; - } else { - $strHeaders .= 'Host: ' . $arrURL['host'] . "\r\n"; - } - - if ( isset($r['user-agent']) ) - $strHeaders .= 'User-agent: ' . $r['user-agent'] . "\r\n"; - - if ( is_array($r['headers']) ) { - foreach ( (array) $r['headers'] as $header => $headerValue ) - $strHeaders .= $header . ': ' . $headerValue . "\r\n"; - } else { - $strHeaders .= $r['headers']; - } - - if ( $proxy->use_authentication() ) - $strHeaders .= $proxy->authentication_header() . "\r\n"; - - $strHeaders .= "\r\n"; - - if ( ! is_null($r['body']) ) - $strHeaders .= $r['body']; - - fwrite($handle, $strHeaders); - - if ( ! $r['blocking'] ) { - stream_set_blocking( $handle, 0 ); - fclose( $handle ); - return array( 'headers' => array(), 'body' => '', 'response' => array('code' => false, 'message' => false), 'cookies' => array() ); - } - - $strResponse = ''; - $bodyStarted = false; - $keep_reading = true; - $block_size = 4096; - if ( isset( $r['limit_response_size'] ) ) - $block_size = min( $block_size, $r['limit_response_size'] ); - - // If streaming to a file setup the file handle. - if ( $r['stream'] ) { - if ( ! WP_DEBUG ) - $stream_handle = @fopen( $r['filename'], 'w+' ); - else - $stream_handle = fopen( $r['filename'], 'w+' ); - if ( ! $stream_handle ) - return new WP_Error( 'http_request_failed', sprintf( __( 'Could not open handle for fopen() to %s' ), $r['filename'] ) ); - - $bytes_written = 0; - while ( ! feof($handle) && $keep_reading ) { - $block = fread( $handle, $block_size ); - if ( ! $bodyStarted ) { - $strResponse .= $block; - if ( strpos( $strResponse, "\r\n\r\n" ) ) { - $process = WP_Http::processResponse( $strResponse ); - $bodyStarted = true; - $block = $process['body']; - unset( $strResponse ); - $process['body'] = ''; - } - } - - $this_block_size = strlen( $block ); - - if ( isset( $r['limit_response_size'] ) && ( $bytes_written + $this_block_size ) > $r['limit_response_size'] ) { - $this_block_size = ( $r['limit_response_size'] - $bytes_written ); - $block = substr( $block, 0, $this_block_size ); - } - - $bytes_written_to_file = fwrite( $stream_handle, $block ); - - if ( $bytes_written_to_file != $this_block_size ) { - fclose( $handle ); - fclose( $stream_handle ); - return new WP_Error( 'http_request_failed', __( 'Failed to write request to temporary file.' ) ); - } - - $bytes_written += $bytes_written_to_file; - - $keep_reading = !isset( $r['limit_response_size'] ) || $bytes_written < $r['limit_response_size']; - } - - fclose( $stream_handle ); - - } else { - $header_length = 0; - while ( ! feof( $handle ) && $keep_reading ) { - $block = fread( $handle, $block_size ); - $strResponse .= $block; - if ( ! $bodyStarted && strpos( $strResponse, "\r\n\r\n" ) ) { - $header_length = strpos( $strResponse, "\r\n\r\n" ) + 4; - $bodyStarted = true; - } - $keep_reading = ( ! $bodyStarted || !isset( $r['limit_response_size'] ) || strlen( $strResponse ) < ( $header_length + $r['limit_response_size'] ) ); - } - - $process = WP_Http::processResponse( $strResponse ); - unset( $strResponse ); - - } - - fclose( $handle ); - - $arrHeaders = WP_Http::processHeaders( $process['headers'], $url ); - - $response = array( - 'headers' => $arrHeaders['headers'], - // Not yet processed. - 'body' => null, - 'response' => $arrHeaders['response'], - 'cookies' => $arrHeaders['cookies'], - 'filename' => $r['filename'] - ); - - // Handle redirects. - if ( false !== ( $redirect_response = WP_Http::handle_redirects( $url, $r, $response ) ) ) - return $redirect_response; - - // If the body was chunk encoded, then decode it. - if ( ! empty( $process['body'] ) && isset( $arrHeaders['headers']['transfer-encoding'] ) && 'chunked' == $arrHeaders['headers']['transfer-encoding'] ) - $process['body'] = WP_Http::chunkTransferDecode($process['body']); - - if ( true === $r['decompress'] && true === WP_Http_Encoding::should_decode($arrHeaders['headers']) ) - $process['body'] = WP_Http_Encoding::decompress( $process['body'] ); - - if ( isset( $r['limit_response_size'] ) && strlen( $process['body'] ) > $r['limit_response_size'] ) - $process['body'] = substr( $process['body'], 0, $r['limit_response_size'] ); - - $response['body'] = $process['body']; - - return $response; - } - - /** - * Verifies the received SSL certificate against its Common Names and subjectAltName fields. - * - * PHP's SSL verifications only verify that it's a valid Certificate, it doesn't verify if - * the certificate is valid for the hostname which was requested. - * This function verifies the requested hostname against certificate's subjectAltName field, - * if that is empty, or contains no DNS entries, a fallback to the Common Name field is used. - * - * IP Address support is included if the request is being made to an IP address. - * - * @since 3.7.0 - * @static - * - * @param stream $stream The PHP Stream which the SSL request is being made over - * @param string $host The hostname being requested - * @return bool If the cerficiate presented in $stream is valid for $host - */ - public static function verify_ssl_certificate( $stream, $host ) { - $context_options = stream_context_get_options( $stream ); - - if ( empty( $context_options['ssl']['peer_certificate'] ) ) - return false; - - $cert = openssl_x509_parse( $context_options['ssl']['peer_certificate'] ); - if ( ! $cert ) - return false; - - /* - * If the request is being made to an IP address, we'll validate against IP fields - * in the cert (if they exist) - */ - $host_type = ( WP_Http::is_ip_address( $host ) ? 'ip' : 'dns' ); - - $certificate_hostnames = array(); - if ( ! empty( $cert['extensions']['subjectAltName'] ) ) { - $match_against = preg_split( '/,\s*/', $cert['extensions']['subjectAltName'] ); - foreach ( $match_against as $match ) { - list( $match_type, $match_host ) = explode( ':', $match ); - if ( $host_type == strtolower( trim( $match_type ) ) ) // IP: or DNS: - $certificate_hostnames[] = strtolower( trim( $match_host ) ); - } - } elseif ( !empty( $cert['subject']['CN'] ) ) { - // Only use the CN when the certificate includes no subjectAltName extension. - $certificate_hostnames[] = strtolower( $cert['subject']['CN'] ); - } - - // Exact hostname/IP matches. - if ( in_array( strtolower( $host ), $certificate_hostnames ) ) - return true; - - // IP's can't be wildcards, Stop processing. - if ( 'ip' == $host_type ) - return false; - - // Test to see if the domain is at least 2 deep for wildcard support. - if ( substr_count( $host, '.' ) < 2 ) - return false; - - // Wildcard subdomains certs (*.example.com) are valid for a.example.com but not a.b.example.com. - $wildcard_host = preg_replace( '/^[^.]+\./', '*.', $host ); - - return in_array( strtolower( $wildcard_host ), $certificate_hostnames ); - } - - /** - * Determines whether this class can be used for retrieving a URL. - * - * @static - * @access public - * @since 2.7.0 - * @since 3.7.0 Combined with the fsockopen transport and switched to stream_socket_client(). - * - * @param array $args Optional. Array of request arguments. Default empty array. - * @return bool False means this class can not be used, true means it can. - */ - public static function test( $args = array() ) { - if ( ! function_exists( 'stream_socket_client' ) ) - return false; - - $is_ssl = isset( $args['ssl'] ) && $args['ssl']; - - if ( $is_ssl ) { - if ( ! extension_loaded( 'openssl' ) ) - return false; - if ( ! function_exists( 'openssl_x509_parse' ) ) - return false; - } - - /** - * Filters whether streams can be used as a transport for retrieving a URL. - * - * @since 2.7.0 - * - * @param bool $use_class Whether the class can be used. Default true. - * @param array $args Request arguments. - */ - return apply_filters( 'use_streams_transport', true, $args ); - } -} - -/** - * Deprecated HTTP Transport method which used fsockopen. - * - * This class is not used, and is included for backward compatibility only. - * All code should make use of WP_Http directly through its API. - * - * @see WP_HTTP::request - * - * @since 2.7.0 - * @deprecated 3.7.0 Please use WP_HTTP::request() directly - */ -class WP_HTTP_Fsockopen extends WP_HTTP_Streams { - // For backward compatibility for users who are using the class directly. -} diff --git a/wp/wp-includes/class-wp-image-editor-gd.php b/wp/wp-includes/class-wp-image-editor-gd.php deleted file mode 100644 index d7823ebb..00000000 --- a/wp/wp-includes/class-wp-image-editor-gd.php +++ /dev/null @@ -1,481 +0,0 @@ -<?php -/** - * WordPress GD Image Editor - * - * @package WordPress - * @subpackage Image_Editor - */ - -/** - * WordPress Image Editor Class for Image Manipulation through GD - * - * @since 3.5.0 - * @package WordPress - * @subpackage Image_Editor - * @uses WP_Image_Editor Extends class - */ -class WP_Image_Editor_GD extends WP_Image_Editor { - /** - * GD Resource. - * - * @access protected - * @var resource - */ - protected $image; - - public function __destruct() { - if ( $this->image ) { - // we don't need the original in memory anymore - imagedestroy( $this->image ); - } - } - - /** - * Checks to see if current environment supports GD. - * - * @since 3.5.0 - * - * @static - * @access public - * - * @param array $args - * @return bool - */ - public static function test( $args = array() ) { - if ( ! extension_loaded('gd') || ! function_exists('gd_info') ) - return false; - - // On some setups GD library does not provide imagerotate() - Ticket #11536 - if ( isset( $args['methods'] ) && - in_array( 'rotate', $args['methods'] ) && - ! function_exists('imagerotate') ){ - - return false; - } - - return true; - } - - /** - * Checks to see if editor supports the mime-type specified. - * - * @since 3.5.0 - * - * @static - * @access public - * - * @param string $mime_type - * @return bool - */ - public static function supports_mime_type( $mime_type ) { - $image_types = imagetypes(); - switch( $mime_type ) { - case 'image/jpeg': - return ($image_types & IMG_JPG) != 0; - case 'image/png': - return ($image_types & IMG_PNG) != 0; - case 'image/gif': - return ($image_types & IMG_GIF) != 0; - } - - return false; - } - - /** - * Loads image from $this->file into new GD Resource. - * - * @since 3.5.0 - * @access protected - * - * @return bool|WP_Error True if loaded successfully; WP_Error on failure. - */ - public function load() { - if ( $this->image ) - return true; - - if ( ! is_file( $this->file ) && ! preg_match( '|^https?://|', $this->file ) ) - return new WP_Error( 'error_loading_image', __('File doesn’t exist?'), $this->file ); - - // Set artificially high because GD uses uncompressed images in memory. - wp_raise_memory_limit( 'image' ); - - $this->image = @imagecreatefromstring( file_get_contents( $this->file ) ); - - if ( ! is_resource( $this->image ) ) - return new WP_Error( 'invalid_image', __('File is not an image.'), $this->file ); - - $size = @getimagesize( $this->file ); - if ( ! $size ) - return new WP_Error( 'invalid_image', __('Could not read image size.'), $this->file ); - - if ( function_exists( 'imagealphablending' ) && function_exists( 'imagesavealpha' ) ) { - imagealphablending( $this->image, false ); - imagesavealpha( $this->image, true ); - } - - $this->update_size( $size[0], $size[1] ); - $this->mime_type = $size['mime']; - - return $this->set_quality(); - } - - /** - * Sets or updates current image size. - * - * @since 3.5.0 - * @access protected - * - * @param int $width - * @param int $height - * @return true - */ - protected function update_size( $width = false, $height = false ) { - if ( ! $width ) - $width = imagesx( $this->image ); - - if ( ! $height ) - $height = imagesy( $this->image ); - - return parent::update_size( $width, $height ); - } - - /** - * Resizes current image. - * Wraps _resize, since _resize returns a GD Resource. - * - * At minimum, either a height or width must be provided. - * If one of the two is set to null, the resize will - * maintain aspect ratio according to the provided dimension. - * - * @since 3.5.0 - * @access public - * - * @param int|null $max_w Image width. - * @param int|null $max_h Image height. - * @param bool $crop - * @return true|WP_Error - */ - public function resize( $max_w, $max_h, $crop = false ) { - if ( ( $this->size['width'] == $max_w ) && ( $this->size['height'] == $max_h ) ) - return true; - - $resized = $this->_resize( $max_w, $max_h, $crop ); - - if ( is_resource( $resized ) ) { - imagedestroy( $this->image ); - $this->image = $resized; - return true; - - } elseif ( is_wp_error( $resized ) ) - return $resized; - - return new WP_Error( 'image_resize_error', __('Image resize failed.'), $this->file ); - } - - /** - * - * @param int $max_w - * @param int $max_h - * @param bool|array $crop - * @return resource|WP_Error - */ - protected function _resize( $max_w, $max_h, $crop = false ) { - $dims = image_resize_dimensions( $this->size['width'], $this->size['height'], $max_w, $max_h, $crop ); - if ( ! $dims ) { - return new WP_Error( 'error_getting_dimensions', __('Could not calculate resized image dimensions'), $this->file ); - } - list( $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ) = $dims; - - $resized = wp_imagecreatetruecolor( $dst_w, $dst_h ); - imagecopyresampled( $resized, $this->image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ); - - if ( is_resource( $resized ) ) { - $this->update_size( $dst_w, $dst_h ); - return $resized; - } - - return new WP_Error( 'image_resize_error', __('Image resize failed.'), $this->file ); - } - - /** - * Resize multiple images from a single source. - * - * @since 3.5.0 - * @access public - * - * @param array $sizes { - * An array of image size arrays. Default sizes are 'small', 'medium', 'medium_large', 'large'. - * - * Either a height or width must be provided. - * If one of the two is set to null, the resize will - * maintain aspect ratio according to the provided dimension. - * - * @type array $size { - * Array of height, width values, and whether to crop. - * - * @type int $width Image width. Optional if `$height` is specified. - * @type int $height Image height. Optional if `$width` is specified. - * @type bool $crop Optional. Whether to crop the image. Default false. - * } - * } - * @return array An array of resized images' metadata by size. - */ - public function multi_resize( $sizes ) { - $metadata = array(); - $orig_size = $this->size; - - foreach ( $sizes as $size => $size_data ) { - if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) { - continue; - } - - if ( ! isset( $size_data['width'] ) ) { - $size_data['width'] = null; - } - if ( ! isset( $size_data['height'] ) ) { - $size_data['height'] = null; - } - - if ( ! isset( $size_data['crop'] ) ) { - $size_data['crop'] = false; - } - - $image = $this->_resize( $size_data['width'], $size_data['height'], $size_data['crop'] ); - $duplicate = ( ( $orig_size['width'] == $size_data['width'] ) && ( $orig_size['height'] == $size_data['height'] ) ); - - if ( ! is_wp_error( $image ) && ! $duplicate ) { - $resized = $this->_save( $image ); - - imagedestroy( $image ); - - if ( ! is_wp_error( $resized ) && $resized ) { - unset( $resized['path'] ); - $metadata[$size] = $resized; - } - } - - $this->size = $orig_size; - } - - return $metadata; - } - - /** - * Crops Image. - * - * @since 3.5.0 - * @access public - * - * @param int $src_x The start x position to crop from. - * @param int $src_y The start y position to crop from. - * @param int $src_w The width to crop. - * @param int $src_h The height to crop. - * @param int $dst_w Optional. The destination width. - * @param int $dst_h Optional. The destination height. - * @param bool $src_abs Optional. If the source crop points are absolute. - * @return bool|WP_Error - */ - public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false ) { - // If destination width/height isn't specified, use same as - // width/height from source. - if ( ! $dst_w ) - $dst_w = $src_w; - if ( ! $dst_h ) - $dst_h = $src_h; - - $dst = wp_imagecreatetruecolor( $dst_w, $dst_h ); - - if ( $src_abs ) { - $src_w -= $src_x; - $src_h -= $src_y; - } - - if ( function_exists( 'imageantialias' ) ) - imageantialias( $dst, true ); - - imagecopyresampled( $dst, $this->image, 0, 0, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ); - - if ( is_resource( $dst ) ) { - imagedestroy( $this->image ); - $this->image = $dst; - $this->update_size(); - return true; - } - - return new WP_Error( 'image_crop_error', __('Image crop failed.'), $this->file ); - } - - /** - * Rotates current image counter-clockwise by $angle. - * Ported from image-edit.php - * - * @since 3.5.0 - * @access public - * - * @param float $angle - * @return true|WP_Error - */ - public function rotate( $angle ) { - if ( function_exists('imagerotate') ) { - $transparency = imagecolorallocatealpha( $this->image, 255, 255, 255, 127 ); - $rotated = imagerotate( $this->image, $angle, $transparency ); - - if ( is_resource( $rotated ) ) { - imagealphablending( $rotated, true ); - imagesavealpha( $rotated, true ); - imagedestroy( $this->image ); - $this->image = $rotated; - $this->update_size(); - return true; - } - } - return new WP_Error( 'image_rotate_error', __('Image rotate failed.'), $this->file ); - } - - /** - * Flips current image. - * - * @since 3.5.0 - * @access public - * - * @param bool $horz Flip along Horizontal Axis - * @param bool $vert Flip along Vertical Axis - * @return true|WP_Error - */ - public function flip( $horz, $vert ) { - $w = $this->size['width']; - $h = $this->size['height']; - $dst = wp_imagecreatetruecolor( $w, $h ); - - if ( is_resource( $dst ) ) { - $sx = $vert ? ($w - 1) : 0; - $sy = $horz ? ($h - 1) : 0; - $sw = $vert ? -$w : $w; - $sh = $horz ? -$h : $h; - - if ( imagecopyresampled( $dst, $this->image, 0, 0, $sx, $sy, $w, $h, $sw, $sh ) ) { - imagedestroy( $this->image ); - $this->image = $dst; - return true; - } - } - return new WP_Error( 'image_flip_error', __('Image flip failed.'), $this->file ); - } - - /** - * Saves current in-memory image to file. - * - * @since 3.5.0 - * @access public - * - * @param string|null $filename - * @param string|null $mime_type - * @return array|WP_Error {'path'=>string, 'file'=>string, 'width'=>int, 'height'=>int, 'mime-type'=>string} - */ - public function save( $filename = null, $mime_type = null ) { - $saved = $this->_save( $this->image, $filename, $mime_type ); - - if ( ! is_wp_error( $saved ) ) { - $this->file = $saved['path']; - $this->mime_type = $saved['mime-type']; - } - - return $saved; - } - - /** - * @param resource $image - * @param string|null $filename - * @param string|null $mime_type - * @return WP_Error|array - */ - protected function _save( $image, $filename = null, $mime_type = null ) { - list( $filename, $extension, $mime_type ) = $this->get_output_format( $filename, $mime_type ); - - if ( ! $filename ) - $filename = $this->generate_filename( null, null, $extension ); - - if ( 'image/gif' == $mime_type ) { - if ( ! $this->make_image( $filename, 'imagegif', array( $image, $filename ) ) ) - return new WP_Error( 'image_save_error', __('Image Editor Save Failed') ); - } - elseif ( 'image/png' == $mime_type ) { - // convert from full colors to index colors, like original PNG. - if ( function_exists('imageistruecolor') && ! imageistruecolor( $image ) ) - imagetruecolortopalette( $image, false, imagecolorstotal( $image ) ); - - if ( ! $this->make_image( $filename, 'imagepng', array( $image, $filename ) ) ) - return new WP_Error( 'image_save_error', __('Image Editor Save Failed') ); - } - elseif ( 'image/jpeg' == $mime_type ) { - if ( ! $this->make_image( $filename, 'imagejpeg', array( $image, $filename, $this->get_quality() ) ) ) - return new WP_Error( 'image_save_error', __('Image Editor Save Failed') ); - } - else { - return new WP_Error( 'image_save_error', __('Image Editor Save Failed') ); - } - - // Set correct file permissions - $stat = stat( dirname( $filename ) ); - $perms = $stat['mode'] & 0000666; //same permissions as parent folder, strip off the executable bits - @ chmod( $filename, $perms ); - - /** - * Filters the name of the saved image file. - * - * @since 2.6.0 - * - * @param string $filename Name of the file. - */ - return array( - 'path' => $filename, - 'file' => wp_basename( apply_filters( 'image_make_intermediate_size', $filename ) ), - 'width' => $this->size['width'], - 'height' => $this->size['height'], - 'mime-type' => $mime_type, - ); - } - - /** - * Returns stream of current image. - * - * @since 3.5.0 - * @access public - * - * @param string $mime_type - * @return bool - */ - public function stream( $mime_type = null ) { - list( $filename, $extension, $mime_type ) = $this->get_output_format( null, $mime_type ); - - switch ( $mime_type ) { - case 'image/png': - header( 'Content-Type: image/png' ); - return imagepng( $this->image ); - case 'image/gif': - header( 'Content-Type: image/gif' ); - return imagegif( $this->image ); - default: - header( 'Content-Type: image/jpeg' ); - return imagejpeg( $this->image, null, $this->get_quality() ); - } - } - - /** - * Either calls editor's save function or handles file as a stream. - * - * @since 3.5.0 - * @access protected - * - * @param string|stream $filename - * @param callable $function - * @param array $arguments - * @return bool - */ - protected function make_image( $filename, $function, $arguments ) { - if ( wp_is_stream( $filename ) ) - $arguments[1] = null; - - return parent::make_image( $filename, $function, $arguments ); - } -} diff --git a/wp/wp-includes/class-wp-image-editor-imagick.php b/wp/wp-includes/class-wp-image-editor-imagick.php deleted file mode 100644 index 3589cc22..00000000 --- a/wp/wp-includes/class-wp-image-editor-imagick.php +++ /dev/null @@ -1,769 +0,0 @@ -<?php -/** - * WordPress Imagick Image Editor - * - * @package WordPress - * @subpackage Image_Editor - */ - -/** - * WordPress Image Editor Class for Image Manipulation through Imagick PHP Module - * - * @since 3.5.0 - * @package WordPress - * @subpackage Image_Editor - * @uses WP_Image_Editor Extends class - */ -class WP_Image_Editor_Imagick extends WP_Image_Editor { - /** - * Imagick object. - * - * @access protected - * @var Imagick - */ - protected $image; - - public function __destruct() { - if ( $this->image instanceof Imagick ) { - // we don't need the original in memory anymore - $this->image->clear(); - $this->image->destroy(); - } - } - - /** - * Checks to see if current environment supports Imagick. - * - * We require Imagick 2.2.0 or greater, based on whether the queryFormats() - * method can be called statically. - * - * @since 3.5.0 - * - * @static - * @access public - * - * @param array $args - * @return bool - */ - public static function test( $args = array() ) { - - // First, test Imagick's extension and classes. - if ( ! extension_loaded( 'imagick' ) || ! class_exists( 'Imagick', false ) || ! class_exists( 'ImagickPixel', false ) ) - return false; - - if ( version_compare( phpversion( 'imagick' ), '2.2.0', '<' ) ) - return false; - - $required_methods = array( - 'clear', - 'destroy', - 'valid', - 'getimage', - 'writeimage', - 'getimageblob', - 'getimagegeometry', - 'getimageformat', - 'setimageformat', - 'setimagecompression', - 'setimagecompressionquality', - 'setimagepage', - 'setoption', - 'scaleimage', - 'cropimage', - 'rotateimage', - 'flipimage', - 'flopimage', - 'readimage', - ); - - // Now, test for deep requirements within Imagick. - if ( ! defined( 'imagick::COMPRESSION_JPEG' ) ) - return false; - - $class_methods = array_map( 'strtolower', get_class_methods( 'Imagick' ) ); - if ( array_diff( $required_methods, $class_methods ) ) { - return false; - } - - // HHVM Imagick does not support loading from URL, so fail to allow fallback to GD. - if ( defined( 'HHVM_VERSION' ) && isset( $args['path'] ) && preg_match( '|^https?://|', $args['path'] ) ) { - return false; - } - - return true; - } - - /** - * Checks to see if editor supports the mime-type specified. - * - * @since 3.5.0 - * - * @static - * @access public - * - * @param string $mime_type - * @return bool - */ - public static function supports_mime_type( $mime_type ) { - $imagick_extension = strtoupper( self::get_extension( $mime_type ) ); - - if ( ! $imagick_extension ) - return false; - - // setIteratorIndex is optional unless mime is an animated format. - // Here, we just say no if you are missing it and aren't loading a jpeg. - if ( ! method_exists( 'Imagick', 'setIteratorIndex' ) && $mime_type != 'image/jpeg' ) - return false; - - try { - return ( (bool) @Imagick::queryFormats( $imagick_extension ) ); - } - catch ( Exception $e ) { - return false; - } - } - - /** - * Loads image from $this->file into new Imagick Object. - * - * @since 3.5.0 - * @access protected - * - * @return true|WP_Error True if loaded; WP_Error on failure. - */ - public function load() { - if ( $this->image instanceof Imagick ) - return true; - - if ( ! is_file( $this->file ) && ! preg_match( '|^https?://|', $this->file ) ) - return new WP_Error( 'error_loading_image', __('File doesn’t exist?'), $this->file ); - - /* - * Even though Imagick uses less PHP memory than GD, set higher limit - * for users that have low PHP.ini limits. - */ - wp_raise_memory_limit( 'image' ); - - try { - $this->image = new Imagick(); - $file_extension = strtolower( pathinfo( $this->file, PATHINFO_EXTENSION ) ); - $filename = $this->file; - - if ( 'pdf' == $file_extension ) { - $filename = $this->pdf_setup(); - } - - // Reading image after Imagick instantiation because `setResolution` - // only applies correctly before the image is read. - $this->image->readImage( $filename ); - - if ( ! $this->image->valid() ) - return new WP_Error( 'invalid_image', __('File is not an image.'), $this->file); - - // Select the first frame to handle animated images properly - if ( is_callable( array( $this->image, 'setIteratorIndex' ) ) ) - $this->image->setIteratorIndex(0); - - $this->mime_type = $this->get_mime_type( $this->image->getImageFormat() ); - } - catch ( Exception $e ) { - return new WP_Error( 'invalid_image', $e->getMessage(), $this->file ); - } - - $updated_size = $this->update_size(); - if ( is_wp_error( $updated_size ) ) { - return $updated_size; - } - - return $this->set_quality(); - } - - /** - * Sets Image Compression quality on a 1-100% scale. - * - * @since 3.5.0 - * @access public - * - * @param int $quality Compression Quality. Range: [1,100] - * @return true|WP_Error True if set successfully; WP_Error on failure. - */ - public function set_quality( $quality = null ) { - $quality_result = parent::set_quality( $quality ); - if ( is_wp_error( $quality_result ) ) { - return $quality_result; - } else { - $quality = $this->get_quality(); - } - - try { - if ( 'image/jpeg' == $this->mime_type ) { - $this->image->setImageCompressionQuality( $quality ); - $this->image->setImageCompression( imagick::COMPRESSION_JPEG ); - } - else { - $this->image->setImageCompressionQuality( $quality ); - } - } - catch ( Exception $e ) { - return new WP_Error( 'image_quality_error', $e->getMessage() ); - } - - return true; - } - - /** - * Sets or updates current image size. - * - * @since 3.5.0 - * @access protected - * - * @param int $width - * @param int $height - * - * @return true|WP_Error - */ - protected function update_size( $width = null, $height = null ) { - $size = null; - if ( !$width || !$height ) { - try { - $size = $this->image->getImageGeometry(); - } - catch ( Exception $e ) { - return new WP_Error( 'invalid_image', __( 'Could not read image size.' ), $this->file ); - } - } - - if ( ! $width ) - $width = $size['width']; - - if ( ! $height ) - $height = $size['height']; - - return parent::update_size( $width, $height ); - } - - /** - * Resizes current image. - * - * At minimum, either a height or width must be provided. - * If one of the two is set to null, the resize will - * maintain aspect ratio according to the provided dimension. - * - * @since 3.5.0 - * @access public - * - * @param int|null $max_w Image width. - * @param int|null $max_h Image height. - * @param bool $crop - * @return bool|WP_Error - */ - public function resize( $max_w, $max_h, $crop = false ) { - if ( ( $this->size['width'] == $max_w ) && ( $this->size['height'] == $max_h ) ) - return true; - - $dims = image_resize_dimensions( $this->size['width'], $this->size['height'], $max_w, $max_h, $crop ); - if ( ! $dims ) - return new WP_Error( 'error_getting_dimensions', __('Could not calculate resized image dimensions') ); - list( $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h ) = $dims; - - if ( $crop ) { - return $this->crop( $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h ); - } - - // Execute the resize - $thumb_result = $this->thumbnail_image( $dst_w, $dst_h ); - if ( is_wp_error( $thumb_result ) ) { - return $thumb_result; - } - - return $this->update_size( $dst_w, $dst_h ); - } - - /** - * Efficiently resize the current image - * - * This is a WordPress specific implementation of Imagick::thumbnailImage(), - * which resizes an image to given dimensions and removes any associated profiles. - * - * @since 4.5.0 - * @access protected - * - * @param int $dst_w The destination width. - * @param int $dst_h The destination height. - * @param string $filter_name Optional. The Imagick filter to use when resizing. Default 'FILTER_TRIANGLE'. - * @param bool $strip_meta Optional. Strip all profiles, excluding color profiles, from the image. Default true. - * @return bool|WP_Error - */ - protected function thumbnail_image( $dst_w, $dst_h, $filter_name = 'FILTER_TRIANGLE', $strip_meta = true ) { - $allowed_filters = array( - 'FILTER_POINT', - 'FILTER_BOX', - 'FILTER_TRIANGLE', - 'FILTER_HERMITE', - 'FILTER_HANNING', - 'FILTER_HAMMING', - 'FILTER_BLACKMAN', - 'FILTER_GAUSSIAN', - 'FILTER_QUADRATIC', - 'FILTER_CUBIC', - 'FILTER_CATROM', - 'FILTER_MITCHELL', - 'FILTER_LANCZOS', - 'FILTER_BESSEL', - 'FILTER_SINC', - ); - - /** - * Set the filter value if '$filter_name' name is in our whitelist and the related - * Imagick constant is defined or fall back to our default filter. - */ - if ( in_array( $filter_name, $allowed_filters ) && defined( 'Imagick::' . $filter_name ) ) { - $filter = constant( 'Imagick::' . $filter_name ); - } else { - $filter = defined( 'Imagick::FILTER_TRIANGLE' ) ? Imagick::FILTER_TRIANGLE : false; - } - - /** - * Filters whether to strip metadata from images when they're resized. - * - * This filter only applies when resizing using the Imagick editor since GD - * always strips profiles by default. - * - * @since 4.5.0 - * - * @param bool $strip_meta Whether to strip image metadata during resizing. Default true. - */ - if ( apply_filters( 'image_strip_meta', $strip_meta ) ) { - $this->strip_meta(); // Fail silently if not supported. - } - - try { - /* - * To be more efficient, resample large images to 5x the destination size before resizing - * whenever the output size is less that 1/3 of the original image size (1/3^2 ~= .111), - * unless we would be resampling to a scale smaller than 128x128. - */ - if ( is_callable( array( $this->image, 'sampleImage' ) ) ) { - $resize_ratio = ( $dst_w / $this->size['width'] ) * ( $dst_h / $this->size['height'] ); - $sample_factor = 5; - - if ( $resize_ratio < .111 && ( $dst_w * $sample_factor > 128 && $dst_h * $sample_factor > 128 ) ) { - $this->image->sampleImage( $dst_w * $sample_factor, $dst_h * $sample_factor ); - } - } - - /* - * Use resizeImage() when it's available and a valid filter value is set. - * Otherwise, fall back to the scaleImage() method for resizing, which - * results in better image quality over resizeImage() with default filter - * settings and retains backward compatibility with pre 4.5 functionality. - */ - if ( is_callable( array( $this->image, 'resizeImage' ) ) && $filter ) { - $this->image->setOption( 'filter:support', '2.0' ); - $this->image->resizeImage( $dst_w, $dst_h, $filter, 1 ); - } else { - $this->image->scaleImage( $dst_w, $dst_h ); - } - - // Set appropriate quality settings after resizing. - if ( 'image/jpeg' == $this->mime_type ) { - if ( is_callable( array( $this->image, 'unsharpMaskImage' ) ) ) { - $this->image->unsharpMaskImage( 0.25, 0.25, 8, 0.065 ); - } - - $this->image->setOption( 'jpeg:fancy-upsampling', 'off' ); - } - - if ( 'image/png' === $this->mime_type ) { - $this->image->setOption( 'png:compression-filter', '5' ); - $this->image->setOption( 'png:compression-level', '9' ); - $this->image->setOption( 'png:compression-strategy', '1' ); - $this->image->setOption( 'png:exclude-chunk', 'all' ); - } - - /* - * If alpha channel is not defined, set it opaque. - * - * Note that Imagick::getImageAlphaChannel() is only available if Imagick - * has been compiled against ImageMagick version 6.4.0 or newer. - */ - if ( is_callable( array( $this->image, 'getImageAlphaChannel' ) ) - && is_callable( array( $this->image, 'setImageAlphaChannel' ) ) - && defined( 'Imagick::ALPHACHANNEL_UNDEFINED' ) - && defined( 'Imagick::ALPHACHANNEL_OPAQUE' ) - ) { - if ( $this->image->getImageAlphaChannel() === Imagick::ALPHACHANNEL_UNDEFINED ) { - $this->image->setImageAlphaChannel( Imagick::ALPHACHANNEL_OPAQUE ); - } - } - - // Limit the bit depth of resized images to 8 bits per channel. - if ( is_callable( array( $this->image, 'getImageDepth' ) ) && is_callable( array( $this->image, 'setImageDepth' ) ) ) { - if ( 8 < $this->image->getImageDepth() ) { - $this->image->setImageDepth( 8 ); - } - } - - if ( is_callable( array( $this->image, 'setInterlaceScheme' ) ) && defined( 'Imagick::INTERLACE_NO' ) ) { - $this->image->setInterlaceScheme( Imagick::INTERLACE_NO ); - } - - } - catch ( Exception $e ) { - return new WP_Error( 'image_resize_error', $e->getMessage() ); - } - } - - /** - * Resize multiple images from a single source. - * - * @since 3.5.0 - * @access public - * - * @param array $sizes { - * An array of image size arrays. Default sizes are 'small', 'medium', 'medium_large', 'large'. - * - * Either a height or width must be provided. - * If one of the two is set to null, the resize will - * maintain aspect ratio according to the provided dimension. - * - * @type array $size { - * Array of height, width values, and whether to crop. - * - * @type int $width Image width. Optional if `$height` is specified. - * @type int $height Image height. Optional if `$width` is specified. - * @type bool $crop Optional. Whether to crop the image. Default false. - * } - * } - * @return array An array of resized images' metadata by size. - */ - public function multi_resize( $sizes ) { - $metadata = array(); - $orig_size = $this->size; - $orig_image = $this->image->getImage(); - - foreach ( $sizes as $size => $size_data ) { - if ( ! $this->image ) - $this->image = $orig_image->getImage(); - - if ( ! isset( $size_data['width'] ) && ! isset( $size_data['height'] ) ) { - continue; - } - - if ( ! isset( $size_data['width'] ) ) { - $size_data['width'] = null; - } - if ( ! isset( $size_data['height'] ) ) { - $size_data['height'] = null; - } - - if ( ! isset( $size_data['crop'] ) ) { - $size_data['crop'] = false; - } - - $resize_result = $this->resize( $size_data['width'], $size_data['height'], $size_data['crop'] ); - $duplicate = ( ( $orig_size['width'] == $size_data['width'] ) && ( $orig_size['height'] == $size_data['height'] ) ); - - if ( ! is_wp_error( $resize_result ) && ! $duplicate ) { - $resized = $this->_save( $this->image ); - - $this->image->clear(); - $this->image->destroy(); - $this->image = null; - - if ( ! is_wp_error( $resized ) && $resized ) { - unset( $resized['path'] ); - $metadata[$size] = $resized; - } - } - - $this->size = $orig_size; - } - - $this->image = $orig_image; - - return $metadata; - } - - /** - * Crops Image. - * - * @since 3.5.0 - * @access public - * - * @param int $src_x The start x position to crop from. - * @param int $src_y The start y position to crop from. - * @param int $src_w The width to crop. - * @param int $src_h The height to crop. - * @param int $dst_w Optional. The destination width. - * @param int $dst_h Optional. The destination height. - * @param bool $src_abs Optional. If the source crop points are absolute. - * @return bool|WP_Error - */ - public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false ) { - if ( $src_abs ) { - $src_w -= $src_x; - $src_h -= $src_y; - } - - try { - $this->image->cropImage( $src_w, $src_h, $src_x, $src_y ); - $this->image->setImagePage( $src_w, $src_h, 0, 0); - - if ( $dst_w || $dst_h ) { - // If destination width/height isn't specified, use same as - // width/height from source. - if ( ! $dst_w ) - $dst_w = $src_w; - if ( ! $dst_h ) - $dst_h = $src_h; - - $thumb_result = $this->thumbnail_image( $dst_w, $dst_h ); - if ( is_wp_error( $thumb_result ) ) { - return $thumb_result; - } - - return $this->update_size(); - } - } - catch ( Exception $e ) { - return new WP_Error( 'image_crop_error', $e->getMessage() ); - } - return $this->update_size(); - } - - /** - * Rotates current image counter-clockwise by $angle. - * - * @since 3.5.0 - * @access public - * - * @param float $angle - * @return true|WP_Error - */ - public function rotate( $angle ) { - /** - * $angle is 360-$angle because Imagick rotates clockwise - * (GD rotates counter-clockwise) - */ - try { - $this->image->rotateImage( new ImagickPixel('none'), 360-$angle ); - - // Normalise Exif orientation data so that display is consistent across devices. - if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) { - $this->image->setImageOrientation( Imagick::ORIENTATION_TOPLEFT ); - } - - // Since this changes the dimensions of the image, update the size. - $result = $this->update_size(); - if ( is_wp_error( $result ) ) - return $result; - - $this->image->setImagePage( $this->size['width'], $this->size['height'], 0, 0 ); - } - catch ( Exception $e ) { - return new WP_Error( 'image_rotate_error', $e->getMessage() ); - } - return true; - } - - /** - * Flips current image. - * - * @since 3.5.0 - * @access public - * - * @param bool $horz Flip along Horizontal Axis - * @param bool $vert Flip along Vertical Axis - * @return true|WP_Error - */ - public function flip( $horz, $vert ) { - try { - if ( $horz ) - $this->image->flipImage(); - - if ( $vert ) - $this->image->flopImage(); - } - catch ( Exception $e ) { - return new WP_Error( 'image_flip_error', $e->getMessage() ); - } - return true; - } - - /** - * Saves current image to file. - * - * @since 3.5.0 - * @access public - * - * @param string $destfilename - * @param string $mime_type - * @return array|WP_Error {'path'=>string, 'file'=>string, 'width'=>int, 'height'=>int, 'mime-type'=>string} - */ - public function save( $destfilename = null, $mime_type = null ) { - $saved = $this->_save( $this->image, $destfilename, $mime_type ); - - if ( ! is_wp_error( $saved ) ) { - $this->file = $saved['path']; - $this->mime_type = $saved['mime-type']; - - try { - $this->image->setImageFormat( strtoupper( $this->get_extension( $this->mime_type ) ) ); - } - catch ( Exception $e ) { - return new WP_Error( 'image_save_error', $e->getMessage(), $this->file ); - } - } - - return $saved; - } - - /** - * - * @param Imagick $image - * @param string $filename - * @param string $mime_type - * @return array|WP_Error - */ - protected function _save( $image, $filename = null, $mime_type = null ) { - list( $filename, $extension, $mime_type ) = $this->get_output_format( $filename, $mime_type ); - - if ( ! $filename ) - $filename = $this->generate_filename( null, null, $extension ); - - try { - // Store initial Format - $orig_format = $this->image->getImageFormat(); - - $this->image->setImageFormat( strtoupper( $this->get_extension( $mime_type ) ) ); - $this->make_image( $filename, array( $image, 'writeImage' ), array( $filename ) ); - - // Reset original Format - $this->image->setImageFormat( $orig_format ); - } - catch ( Exception $e ) { - return new WP_Error( 'image_save_error', $e->getMessage(), $filename ); - } - - // Set correct file permissions - $stat = stat( dirname( $filename ) ); - $perms = $stat['mode'] & 0000666; //same permissions as parent folder, strip off the executable bits - @ chmod( $filename, $perms ); - - /** This filter is documented in wp-includes/class-wp-image-editor-gd.php */ - return array( - 'path' => $filename, - 'file' => wp_basename( apply_filters( 'image_make_intermediate_size', $filename ) ), - 'width' => $this->size['width'], - 'height' => $this->size['height'], - 'mime-type' => $mime_type, - ); - } - - /** - * Streams current image to browser. - * - * @since 3.5.0 - * @access public - * - * @param string $mime_type - * @return true|WP_Error - */ - public function stream( $mime_type = null ) { - list( $filename, $extension, $mime_type ) = $this->get_output_format( null, $mime_type ); - - try { - // Temporarily change format for stream - $this->image->setImageFormat( strtoupper( $extension ) ); - - // Output stream of image content - header( "Content-Type: $mime_type" ); - print $this->image->getImageBlob(); - - // Reset Image to original Format - $this->image->setImageFormat( $this->get_extension( $this->mime_type ) ); - } - catch ( Exception $e ) { - return new WP_Error( 'image_stream_error', $e->getMessage() ); - } - - return true; - } - - /** - * Strips all image meta except color profiles from an image. - * - * @since 4.5.0 - * @access protected - * - * @return true|WP_Error True if stripping metadata was successful. WP_Error object on error. - */ - protected function strip_meta() { - - if ( ! is_callable( array( $this->image, 'getImageProfiles' ) ) ) { - /* translators: %s: ImageMagick method name */ - return new WP_Error( 'image_strip_meta_error', sprintf( __( '%s is required to strip image meta.' ), '<code>Imagick::getImageProfiles()</code>' ) ); - } - - if ( ! is_callable( array( $this->image, 'removeImageProfile' ) ) ) { - /* translators: %s: ImageMagick method name */ - return new WP_Error( 'image_strip_meta_error', sprintf( __( '%s is required to strip image meta.' ), '<code>Imagick::removeImageProfile()</code>' ) ); - } - - /* - * Protect a few profiles from being stripped for the following reasons: - * - * - icc: Color profile information - * - icm: Color profile information - * - iptc: Copyright data - * - exif: Orientation data - * - xmp: Rights usage data - */ - $protected_profiles = array( - 'icc', - 'icm', - 'iptc', - 'exif', - 'xmp', - ); - - try { - // Strip profiles. - foreach ( $this->image->getImageProfiles( '*', true ) as $key => $value ) { - if ( ! in_array( $key, $protected_profiles ) ) { - $this->image->removeImageProfile( $key ); - } - } - - } catch ( Exception $e ) { - return new WP_Error( 'image_strip_meta_error', $e->getMessage() ); - } - - return true; - } - - /** - * Sets up Imagick for PDF processing. - * Increases rendering DPI and only loads first page. - * - * @since 4.7.0 - * @access protected - * - * @return string|WP_Error File to load or WP_Error on failure. - */ - protected function pdf_setup() { - try { - // By default, PDFs are rendered in a very low resolution. - // We want the thumbnail to be readable, so increase the rendering DPI. - $this->image->setResolution( 128, 128 ); - - // Only load the first page. - return $this->file . '[0]'; - } - catch ( Exception $e ) { - return new WP_Error( 'pdf_setup_failed', $e->getMessage(), $this->file ); - } - } - -} diff --git a/wp/wp-includes/class-wp-image-editor.php b/wp/wp-includes/class-wp-image-editor.php deleted file mode 100644 index cc991eb8..00000000 --- a/wp/wp-includes/class-wp-image-editor.php +++ /dev/null @@ -1,490 +0,0 @@ -<?php -/** - * Base WordPress Image Editor - * - * @package WordPress - * @subpackage Image_Editor - */ - -/** - * Base image editor class from which implementations extend - * - * @since 3.5.0 - */ -abstract class WP_Image_Editor { - protected $file = null; - protected $size = null; - protected $mime_type = null; - protected $default_mime_type = 'image/jpeg'; - protected $quality = false; - protected $default_quality = 82; - - /** - * Each instance handles a single file. - * - * @param string $file Path to the file to load. - */ - public function __construct( $file ) { - $this->file = $file; - } - - /** - * Checks to see if current environment supports the editor chosen. - * Must be overridden in a sub-class. - * - * @since 3.5.0 - * - * @static - * @access public - * @abstract - * - * @param array $args - * @return bool - */ - public static function test( $args = array() ) { - return false; - } - - /** - * Checks to see if editor supports the mime-type specified. - * Must be overridden in a sub-class. - * - * @since 3.5.0 - * - * @static - * @access public - * @abstract - * - * @param string $mime_type - * @return bool - */ - public static function supports_mime_type( $mime_type ) { - return false; - } - - /** - * Loads image from $this->file into editor. - * - * @since 3.5.0 - * @access protected - * @abstract - * - * @return bool|WP_Error True if loaded; WP_Error on failure. - */ - abstract public function load(); - - /** - * Saves current image to file. - * - * @since 3.5.0 - * @access public - * @abstract - * - * @param string $destfilename - * @param string $mime_type - * @return array|WP_Error {'path'=>string, 'file'=>string, 'width'=>int, 'height'=>int, 'mime-type'=>string} - */ - abstract public function save( $destfilename = null, $mime_type = null ); - - /** - * Resizes current image. - * - * At minimum, either a height or width must be provided. - * If one of the two is set to null, the resize will - * maintain aspect ratio according to the provided dimension. - * - * @since 3.5.0 - * @access public - * @abstract - * - * @param int|null $max_w Image width. - * @param int|null $max_h Image height. - * @param bool $crop - * @return bool|WP_Error - */ - abstract public function resize( $max_w, $max_h, $crop = false ); - - /** - * Resize multiple images from a single source. - * - * @since 3.5.0 - * @access public - * @abstract - * - * @param array $sizes { - * An array of image size arrays. Default sizes are 'small', 'medium', 'large'. - * - * @type array $size { - * @type int $width Image width. - * @type int $height Image height. - * @type bool $crop Optional. Whether to crop the image. Default false. - * } - * } - * @return array An array of resized images metadata by size. - */ - abstract public function multi_resize( $sizes ); - - /** - * Crops Image. - * - * @since 3.5.0 - * @access public - * @abstract - * - * @param int $src_x The start x position to crop from. - * @param int $src_y The start y position to crop from. - * @param int $src_w The width to crop. - * @param int $src_h The height to crop. - * @param int $dst_w Optional. The destination width. - * @param int $dst_h Optional. The destination height. - * @param bool $src_abs Optional. If the source crop points are absolute. - * @return bool|WP_Error - */ - abstract public function crop( $src_x, $src_y, $src_w, $src_h, $dst_w = null, $dst_h = null, $src_abs = false ); - - /** - * Rotates current image counter-clockwise by $angle. - * - * @since 3.5.0 - * @access public - * @abstract - * - * @param float $angle - * @return bool|WP_Error - */ - abstract public function rotate( $angle ); - - /** - * Flips current image. - * - * @since 3.5.0 - * @access public - * @abstract - * - * @param bool $horz Flip along Horizontal Axis - * @param bool $vert Flip along Vertical Axis - * @return bool|WP_Error - */ - abstract public function flip( $horz, $vert ); - - /** - * Streams current image to browser. - * - * @since 3.5.0 - * @access public - * @abstract - * - * @param string $mime_type - * @return bool|WP_Error - */ - abstract public function stream( $mime_type = null ); - - /** - * Gets dimensions of image. - * - * @since 3.5.0 - * @access public - * - * @return array {'width'=>int, 'height'=>int} - */ - public function get_size() { - return $this->size; - } - - /** - * Sets current image size. - * - * @since 3.5.0 - * @access protected - * - * @param int $width - * @param int $height - * @return true - */ - protected function update_size( $width = null, $height = null ) { - $this->size = array( - 'width' => (int) $width, - 'height' => (int) $height - ); - return true; - } - - /** - * Gets the Image Compression quality on a 1-100% scale. - * - * @since 4.0.0 - * @access public - * - * @return int $quality Compression Quality. Range: [1,100] - */ - public function get_quality() { - if ( ! $this->quality ) { - $this->set_quality(); - } - - return $this->quality; - } - - /** - * Sets Image Compression quality on a 1-100% scale. - * - * @since 3.5.0 - * @access public - * - * @param int $quality Compression Quality. Range: [1,100] - * @return true|WP_Error True if set successfully; WP_Error on failure. - */ - public function set_quality( $quality = null ) { - if ( null === $quality ) { - /** - * Filters the default image compression quality setting. - * - * Applies only during initial editor instantiation, or when set_quality() is run - * manually without the `$quality` argument. - * - * set_quality() has priority over the filter. - * - * @since 3.5.0 - * - * @param int $quality Quality level between 1 (low) and 100 (high). - * @param string $mime_type Image mime type. - */ - $quality = apply_filters( 'wp_editor_set_quality', $this->default_quality, $this->mime_type ); - - if ( 'image/jpeg' == $this->mime_type ) { - /** - * Filters the JPEG compression quality for backward-compatibility. - * - * Applies only during initial editor instantiation, or when set_quality() is run - * manually without the `$quality` argument. - * - * set_quality() has priority over the filter. - * - * The filter is evaluated under two contexts: 'image_resize', and 'edit_image', - * (when a JPEG image is saved to file). - * - * @since 2.5.0 - * - * @param int $quality Quality level between 0 (low) and 100 (high) of the JPEG. - * @param string $context Context of the filter. - */ - $quality = apply_filters( 'jpeg_quality', $quality, 'image_resize' ); - } - - if ( $quality < 0 || $quality > 100 ) { - $quality = $this->default_quality; - } - } - - // Allow 0, but squash to 1 due to identical images in GD, and for backward compatibility. - if ( 0 === $quality ) { - $quality = 1; - } - - if ( ( $quality >= 1 ) && ( $quality <= 100 ) ) { - $this->quality = $quality; - return true; - } else { - return new WP_Error( 'invalid_image_quality', __('Attempted to set image quality outside of the range [1,100].') ); - } - } - - /** - * Returns preferred mime-type and extension based on provided - * file's extension and mime, or current file's extension and mime. - * - * Will default to $this->default_mime_type if requested is not supported. - * - * Provides corrected filename only if filename is provided. - * - * @since 3.5.0 - * @access protected - * - * @param string $filename - * @param string $mime_type - * @return array { filename|null, extension, mime-type } - */ - protected function get_output_format( $filename = null, $mime_type = null ) { - $new_ext = null; - - // By default, assume specified type takes priority - if ( $mime_type ) { - $new_ext = $this->get_extension( $mime_type ); - } - - if ( $filename ) { - $file_ext = strtolower( pathinfo( $filename, PATHINFO_EXTENSION ) ); - $file_mime = $this->get_mime_type( $file_ext ); - } - else { - // If no file specified, grab editor's current extension and mime-type. - $file_ext = strtolower( pathinfo( $this->file, PATHINFO_EXTENSION ) ); - $file_mime = $this->mime_type; - } - - // Check to see if specified mime-type is the same as type implied by - // file extension. If so, prefer extension from file. - if ( ! $mime_type || ( $file_mime == $mime_type ) ) { - $mime_type = $file_mime; - $new_ext = $file_ext; - } - - // Double-check that the mime-type selected is supported by the editor. - // If not, choose a default instead. - if ( ! $this->supports_mime_type( $mime_type ) ) { - /** - * Filters default mime type prior to getting the file extension. - * - * @see wp_get_mime_types() - * - * @since 3.5.0 - * - * @param string $mime_type Mime type string. - */ - $mime_type = apply_filters( 'image_editor_default_mime_type', $this->default_mime_type ); - $new_ext = $this->get_extension( $mime_type ); - } - - if ( $filename ) { - $dir = pathinfo( $filename, PATHINFO_DIRNAME ); - $ext = pathinfo( $filename, PATHINFO_EXTENSION ); - - $filename = trailingslashit( $dir ) . wp_basename( $filename, ".$ext" ) . ".{$new_ext}"; - } - - return array( $filename, $new_ext, $mime_type ); - } - - /** - * Builds an output filename based on current file, and adding proper suffix - * - * @since 3.5.0 - * @access public - * - * @param string $suffix - * @param string $dest_path - * @param string $extension - * @return string filename - */ - public function generate_filename( $suffix = null, $dest_path = null, $extension = null ) { - // $suffix will be appended to the destination filename, just before the extension - if ( ! $suffix ) - $suffix = $this->get_suffix(); - - $dir = pathinfo( $this->file, PATHINFO_DIRNAME ); - $ext = pathinfo( $this->file, PATHINFO_EXTENSION ); - - $name = wp_basename( $this->file, ".$ext" ); - $new_ext = strtolower( $extension ? $extension : $ext ); - - if ( ! is_null( $dest_path ) && $_dest_path = realpath( $dest_path ) ) - $dir = $_dest_path; - - return trailingslashit( $dir ) . "{$name}-{$suffix}.{$new_ext}"; - } - - /** - * Builds and returns proper suffix for file based on height and width. - * - * @since 3.5.0 - * @access public - * - * @return false|string suffix - */ - public function get_suffix() { - if ( ! $this->get_size() ) - return false; - - return "{$this->size['width']}x{$this->size['height']}"; - } - - /** - * Either calls editor's save function or handles file as a stream. - * - * @since 3.5.0 - * @access protected - * - * @param string|stream $filename - * @param callable $function - * @param array $arguments - * @return bool - */ - protected function make_image( $filename, $function, $arguments ) { - if ( $stream = wp_is_stream( $filename ) ) { - ob_start(); - } else { - // The directory containing the original file may no longer exist when using a replication plugin. - wp_mkdir_p( dirname( $filename ) ); - } - - $result = call_user_func_array( $function, $arguments ); - - if ( $result && $stream ) { - $contents = ob_get_contents(); - - $fp = fopen( $filename, 'w' ); - - if ( ! $fp ) - return false; - - fwrite( $fp, $contents ); - fclose( $fp ); - } - - if ( $stream ) { - ob_end_clean(); - } - - return $result; - } - - /** - * Returns first matched mime-type from extension, - * as mapped from wp_get_mime_types() - * - * @since 3.5.0 - * - * @static - * @access protected - * - * @param string $extension - * @return string|false - */ - protected static function get_mime_type( $extension = null ) { - if ( ! $extension ) - return false; - - $mime_types = wp_get_mime_types(); - $extensions = array_keys( $mime_types ); - - foreach ( $extensions as $_extension ) { - if ( preg_match( "/{$extension}/i", $_extension ) ) { - return $mime_types[$_extension]; - } - } - - return false; - } - - /** - * Returns first matched extension from Mime-type, - * as mapped from wp_get_mime_types() - * - * @since 3.5.0 - * - * @static - * @access protected - * - * @param string $mime_type - * @return string|false - */ - protected static function get_extension( $mime_type = null ) { - $extensions = explode( '|', array_search( $mime_type, wp_get_mime_types() ) ); - - if ( empty( $extensions[0] ) ) - return false; - - return $extensions[0]; - } -} - diff --git a/wp/wp-includes/class-wp-list-util.php b/wp/wp-includes/class-wp-list-util.php deleted file mode 100644 index 4af814d5..00000000 --- a/wp/wp-includes/class-wp-list-util.php +++ /dev/null @@ -1,267 +0,0 @@ -<?php -/** - * WordPress List utility class - * - * @package WordPress - * @since 4.7.0 - */ - -/** - * List utility. - * - * Utility class to handle operations on an array of objects. - * - * @since 4.7.0 - */ -class WP_List_Util { - /** - * The input array. - * - * @since 4.7.0 - * @access private - * @var array - */ - private $input = array(); - - /** - * The output array. - * - * @since 4.7.0 - * @access private - * @var array - */ - private $output = array(); - - /** - * Temporary arguments for sorting. - * - * @since 4.7.0 - * @access private - * @var array - */ - private $orderby = array(); - - /** - * Constructor. - * - * Sets the input array. - * - * @since 4.7.0 - * - * @param array $input Array to perform operations on. - */ - public function __construct( $input ) { - $this->output = $this->input = $input; - } - - /** - * Returns the original input array. - * - * @since 4.7.0 - * @access public - * - * @return array The input array. - */ - public function get_input() { - return $this->input; - } - - /** - * Returns the output array. - * - * @since 4.7.0 - * @access public - * - * @return array The output array. - */ - public function get_output() { - return $this->output; - } - - /** - * Filters the list, based on a set of key => value arguments. - * - * @since 4.7.0 - * - * @param array $args Optional. An array of key => value arguments to match - * against each object. Default empty array. - * @param string $operator Optional. The logical operation to perform. 'AND' means - * all elements from the array must match. 'OR' means only - * one element needs to match. 'NOT' means no elements may - * match. Default 'AND'. - * @return array Array of found values. - */ - public function filter( $args = array(), $operator = 'AND' ) { - if ( empty( $args ) ) { - return $this->output; - } - - $operator = strtoupper( $operator ); - - if ( ! in_array( $operator, array( 'AND', 'OR', 'NOT' ), true ) ) { - return array(); - } - - $count = count( $args ); - $filtered = array(); - - foreach ( $this->output as $key => $obj ) { - $to_match = (array) $obj; - - $matched = 0; - foreach ( $args as $m_key => $m_value ) { - if ( array_key_exists( $m_key, $to_match ) && $m_value == $to_match[ $m_key ] ) { - $matched++; - } - } - - if ( - ( 'AND' == $operator && $matched == $count ) || - ( 'OR' == $operator && $matched > 0 ) || - ( 'NOT' == $operator && 0 == $matched ) - ) { - $filtered[$key] = $obj; - } - } - - $this->output = $filtered; - - return $this->output; - } - - /** - * Plucks a certain field out of each object in the list. - * - * This has the same functionality and prototype of - * array_column() (PHP 5.5) but also supports objects. - * - * @since 4.7.0 - * - * @param int|string $field Field from the object to place instead of the entire object - * @param int|string $index_key Optional. Field from the object to use as keys for the new array. - * Default null. - * @return array Array of found values. If `$index_key` is set, an array of found values with keys - * corresponding to `$index_key`. If `$index_key` is null, array keys from the original - * `$list` will be preserved in the results. - */ - public function pluck( $field, $index_key = null ) { - if ( ! $index_key ) { - /* - * This is simple. Could at some point wrap array_column() - * if we knew we had an array of arrays. - */ - foreach ( $this->output as $key => $value ) { - if ( is_object( $value ) ) { - $this->output[ $key ] = $value->$field; - } else { - $this->output[ $key ] = $value[ $field ]; - } - } - return $this->output; - } - - /* - * When index_key is not set for a particular item, push the value - * to the end of the stack. This is how array_column() behaves. - */ - $newlist = array(); - foreach ( $this->output as $value ) { - if ( is_object( $value ) ) { - if ( isset( $value->$index_key ) ) { - $newlist[ $value->$index_key ] = $value->$field; - } else { - $newlist[] = $value->$field; - } - } else { - if ( isset( $value[ $index_key ] ) ) { - $newlist[ $value[ $index_key ] ] = $value[ $field ]; - } else { - $newlist[] = $value[ $field ]; - } - } - } - - $this->output = $newlist; - - return $this->output; - } - - /** - * Sorts the list, based on one or more orderby arguments. - * - * @since 4.7.0 - * - * @param string|array $orderby Optional. Either the field name to order by or an array - * of multiple orderby fields as $orderby => $order. - * @param string $order Optional. Either 'ASC' or 'DESC'. Only used if $orderby - * is a string. - * @param bool $preserve_keys Optional. Whether to preserve keys. Default false. - * @return array The sorted array. - */ - public function sort( $orderby = array(), $order = 'ASC', $preserve_keys = false ) { - if ( empty( $orderby ) ) { - return $this->output; - } - - if ( is_string( $orderby ) ) { - $orderby = array( $orderby => $order ); - } - - foreach ( $orderby as $field => $direction ) { - $orderby[ $field ] = 'DESC' === strtoupper( $direction ) ? 'DESC' : 'ASC'; - } - - $this->orderby = $orderby; - - if ( $preserve_keys ) { - uasort( $this->output, array( $this, 'sort_callback' ) ); - } else { - usort( $this->output, array( $this, 'sort_callback' ) ); - } - - $this->orderby = array(); - - return $this->output; - } - - /** - * Callback to sort the list by specific fields. - * - * @since 4.7.0 - * @access private - * - * @see WP_List_Util::sort() - * - * @param object|array $a One object to compare. - * @param object|array $b The other object to compare. - * @return int 0 if both objects equal. -1 if second object should come first, 1 otherwise. - */ - private function sort_callback( $a, $b ) { - if ( empty( $this->orderby ) ) { - return 0; - } - - $a = (array) $a; - $b = (array) $b; - - foreach ( $this->orderby as $field => $direction ) { - if ( ! isset( $a[ $field ] ) || ! isset( $b[ $field ] ) ) { - continue; - } - - if ( $a[ $field ] == $b[ $field ] ) { - continue; - } - - $results = 'DESC' === $direction ? array( 1, -1 ) : array( -1, 1 ); - - if ( is_numeric( $a[ $field ] ) && is_numeric( $b[ $field ] ) ) { - return ( $a[ $field ] < $b[ $field ] ) ? $results[0] : $results[1]; - } - - return 0 > strcmp( $a[ $field ], $b[ $field ] ) ? $results[0] : $results[1]; - } - - return 0; - } -} diff --git a/wp/wp-includes/class-wp-locale-switcher.php b/wp/wp-includes/class-wp-locale-switcher.php deleted file mode 100644 index 2b0638d2..00000000 --- a/wp/wp-includes/class-wp-locale-switcher.php +++ /dev/null @@ -1,240 +0,0 @@ -<?php -/** - * Locale API: WP_Locale_Switcher class - * - * @package WordPress - * @subpackage i18n - * @since 4.7.0 - */ - -/** - * Core class used for switching locales. - * - * @since 4.7.0 - */ -class WP_Locale_Switcher { - /** - * Locale stack. - * - * @since 4.7.0 - * @access private - * @var string[] - */ - private $locales = array(); - - /** - * Original locale. - * - * @since 4.7.0 - * @access private - * @var string - */ - private $original_locale; - - /** - * Holds all available languages. - * - * @since 4.7.0 - * @access private - * @var array An array of language codes (file names without the .mo extension). - */ - private $available_languages = array(); - - /** - * Constructor. - * - * Stores the original locale as well as a list of all available languages. - * - * @since 4.7.0 - */ - public function __construct() { - $this->original_locale = is_admin() ? get_user_locale() : get_locale(); - $this->available_languages = array_merge( array( 'en_US' ), get_available_languages() ); - } - - /** - * Initializes the locale switcher. - * - * Hooks into the {@see 'locale'} filter to change the locale on the fly. - */ - public function init() { - add_filter( 'locale', array( $this, 'filter_locale' ) ); - } - - /** - * Switches the translations according to the given locale. - * - * @since 4.7.0 - * - * @param string $locale The locale to switch to. - * @return bool True on success, false on failure. - */ - public function switch_to_locale( $locale ) { - $current_locale = is_admin() ? get_user_locale() : get_locale(); - if ( $current_locale === $locale ) { - return false; - } - - if ( ! in_array( $locale, $this->available_languages, true ) ) { - return false; - } - - $this->locales[] = $locale; - - $this->change_locale( $locale ); - - /** - * Fires when the locale is switched. - * - * @since 4.7.0 - * - * @param string $locale The new locale. - */ - do_action( 'switch_locale', $locale ); - - return true; - } - - /** - * Restores the translations according to the previous locale. - * - * @since 4.7.0 - * - * @return string|false Locale on success, false on failure. - */ - public function restore_previous_locale() { - $previous_locale = array_pop( $this->locales ); - - if ( null === $previous_locale ) { - // The stack is empty, bail. - return false; - } - - $locale = end( $this->locales ); - - if ( ! $locale ) { - // There's nothing left in the stack: go back to the original locale. - $locale = $this->original_locale; - } - - $this->change_locale( $locale ); - - /** - * Fires when the locale is restored to the previous one. - * - * @since 4.7.0 - * - * @param string $locale The new locale. - * @param string $previous_locale The previous locale. - */ - do_action( 'restore_previous_locale', $locale, $previous_locale ); - - return $locale; - } - - /** - * Restores the translations according to the original locale. - * - * @since 4.7.0 - * - * @return string|false Locale on success, false on failure. - */ - public function restore_current_locale() { - if ( empty( $this->locales ) ) { - return false; - } - - $this->locales = array( $this->original_locale ); - - return $this->restore_previous_locale(); - } - - /** - * Whether switch_to_locale() is in effect. - * - * @since 4.7.0 - * - * @return bool True if the locale has been switched, false otherwise. - */ - public function is_switched() { - return ! empty( $this->locales ); - } - - /** - * Filters the WordPress install's locale. - * - * @since 4.7.0 - * - * @param string $locale The WordPress install's locale. - * @return string The locale currently being switched to. - */ - public function filter_locale( $locale ) { - $switched_locale = end( $this->locales ); - - if ( $switched_locale ) { - return $switched_locale; - } - - return $locale; - } - - /** - * Load translations for a given locale. - * - * When switching to a locale, translations for this locale must be loaded from scratch. - * - * @since 4.7.0 - * @access private - * - * @global Mo[] $l10n An array of all currently loaded text domains. - * - * @param string $locale The locale to load translations for. - */ - private function load_translations( $locale ) { - global $l10n; - - $domains = $l10n ? array_keys( $l10n ) : array(); - - load_default_textdomain( $locale ); - - foreach ( $domains as $domain ) { - if ( 'default' === $domain ) { - continue; - } - - unload_textdomain( $domain ); - get_translations_for_domain( $domain ); - } - } - - /** - * Changes the site's locale to the given one. - * - * Loads the translations, changes the global `$wp_locale` object and updates - * all post type labels. - * - * @since 4.7.0 - * @access private - * - * @global WP_Locale $wp_locale The WordPress date and time locale object. - * - * @param string $locale The locale to change to. - */ - private function change_locale( $locale ) { - // Reset translation availability information. - _get_path_to_translation( null, true ); - - $this->load_translations( $locale ); - - $GLOBALS['wp_locale'] = new WP_Locale(); - - /** - * Fires when the locale is switched to or restored. - * - * @since 4.7.0 - * - * @param string $locale The new locale. - */ - do_action( 'change_locale', $locale ); - } -} diff --git a/wp/wp-includes/class-wp-locale.php b/wp/wp-includes/class-wp-locale.php deleted file mode 100644 index 2cc6afaa..00000000 --- a/wp/wp-includes/class-wp-locale.php +++ /dev/null @@ -1,404 +0,0 @@ -<?php -/** - * Locale API: WP_Locale class - * - * @package WordPress - * @subpackage i18n - * @since 4.6.0 - */ - -/** - * Core class used to store translated data for a locale. - * - * @since 2.1.0 - * @since 4.6.0 Moved to its own file from wp-includes/locale.php. - */ -class WP_Locale { - /** - * Stores the translated strings for the full weekday names. - * - * @since 2.1.0 - * @var array - */ - public $weekday; - - /** - * Stores the translated strings for the one character weekday names. - * - * There is a hack to make sure that Tuesday and Thursday, as well - * as Sunday and Saturday, don't conflict. See init() method for more. - * - * @see WP_Locale::init() for how to handle the hack. - * - * @since 2.1.0 - * @var array - */ - public $weekday_initial; - - /** - * Stores the translated strings for the abbreviated weekday names. - * - * @since 2.1.0 - * @var array - */ - public $weekday_abbrev; - - /** - * Stores the default start of the week. - * - * @since 4.4.0 - * @var string - */ - public $start_of_week; - - /** - * Stores the translated strings for the full month names. - * - * @since 2.1.0 - * @var array - */ - public $month; - - /** - * Stores the translated strings for the month names in genitive case, if the locale specifies. - * - * @since 4.4.0 - * @var array - */ - public $month_genitive; - - /** - * Stores the translated strings for the abbreviated month names. - * - * @since 2.1.0 - * @var array - */ - public $month_abbrev; - - /** - * Stores the translated strings for 'am' and 'pm'. - * - * Also the capitalized versions. - * - * @since 2.1.0 - * @var array - */ - public $meridiem; - - /** - * The text direction of the locale language. - * - * Default is left to right 'ltr'. - * - * @since 2.1.0 - * @var string - */ - public $text_direction = 'ltr'; - - /** - * The thousands separator and decimal point values used for localizing numbers. - * - * @since 2.3.0 - * @access public - * @var array - */ - public $number_format; - - /** - * Constructor which calls helper methods to set up object variables. - * - * @since 2.1.0 - */ - public function __construct() { - $this->init(); - $this->register_globals(); - } - - /** - * Sets up the translated strings and object properties. - * - * The method creates the translatable strings for various - * calendar elements. Which allows for specifying locale - * specific calendar names and text direction. - * - * @since 2.1.0 - * @access private - * - * @global string $text_direction - */ - public function init() { - // The Weekdays - $this->weekday[0] = /* translators: weekday */ __('Sunday'); - $this->weekday[1] = /* translators: weekday */ __('Monday'); - $this->weekday[2] = /* translators: weekday */ __('Tuesday'); - $this->weekday[3] = /* translators: weekday */ __('Wednesday'); - $this->weekday[4] = /* translators: weekday */ __('Thursday'); - $this->weekday[5] = /* translators: weekday */ __('Friday'); - $this->weekday[6] = /* translators: weekday */ __('Saturday'); - - // The first letter of each day. - $this->weekday_initial[ __( 'Sunday' ) ] = /* translators: one-letter abbreviation of the weekday */ _x( 'S', 'Sunday initial' ); - $this->weekday_initial[ __( 'Monday' ) ] = /* translators: one-letter abbreviation of the weekday */ _x( 'M', 'Monday initial' ); - $this->weekday_initial[ __( 'Tuesday' ) ] = /* translators: one-letter abbreviation of the weekday */ _x( 'T', 'Tuesday initial' ); - $this->weekday_initial[ __( 'Wednesday' ) ] = /* translators: one-letter abbreviation of the weekday */ _x( 'W', 'Wednesday initial' ); - $this->weekday_initial[ __( 'Thursday' ) ] = /* translators: one-letter abbreviation of the weekday */ _x( 'T', 'Thursday initial' ); - $this->weekday_initial[ __( 'Friday' ) ] = /* translators: one-letter abbreviation of the weekday */ _x( 'F', 'Friday initial' ); - $this->weekday_initial[ __( 'Saturday' ) ] = /* translators: one-letter abbreviation of the weekday */ _x( 'S', 'Saturday initial' ); - - // Abbreviations for each day. - $this->weekday_abbrev[__('Sunday')] = /* translators: three-letter abbreviation of the weekday */ __('Sun'); - $this->weekday_abbrev[__('Monday')] = /* translators: three-letter abbreviation of the weekday */ __('Mon'); - $this->weekday_abbrev[__('Tuesday')] = /* translators: three-letter abbreviation of the weekday */ __('Tue'); - $this->weekday_abbrev[__('Wednesday')] = /* translators: three-letter abbreviation of the weekday */ __('Wed'); - $this->weekday_abbrev[__('Thursday')] = /* translators: three-letter abbreviation of the weekday */ __('Thu'); - $this->weekday_abbrev[__('Friday')] = /* translators: three-letter abbreviation of the weekday */ __('Fri'); - $this->weekday_abbrev[__('Saturday')] = /* translators: three-letter abbreviation of the weekday */ __('Sat'); - - // The Months - $this->month['01'] = /* translators: month name */ __( 'January' ); - $this->month['02'] = /* translators: month name */ __( 'February' ); - $this->month['03'] = /* translators: month name */ __( 'March' ); - $this->month['04'] = /* translators: month name */ __( 'April' ); - $this->month['05'] = /* translators: month name */ __( 'May' ); - $this->month['06'] = /* translators: month name */ __( 'June' ); - $this->month['07'] = /* translators: month name */ __( 'July' ); - $this->month['08'] = /* translators: month name */ __( 'August' ); - $this->month['09'] = /* translators: month name */ __( 'September' ); - $this->month['10'] = /* translators: month name */ __( 'October' ); - $this->month['11'] = /* translators: month name */ __( 'November' ); - $this->month['12'] = /* translators: month name */ __( 'December' ); - - // The Months, genitive - $this->month_genitive['01'] = /* translators: month name, genitive */ _x( 'January', 'genitive' ); - $this->month_genitive['02'] = /* translators: month name, genitive */ _x( 'February', 'genitive' ); - $this->month_genitive['03'] = /* translators: month name, genitive */ _x( 'March', 'genitive' ); - $this->month_genitive['04'] = /* translators: month name, genitive */ _x( 'April', 'genitive' ); - $this->month_genitive['05'] = /* translators: month name, genitive */ _x( 'May', 'genitive' ); - $this->month_genitive['06'] = /* translators: month name, genitive */ _x( 'June', 'genitive' ); - $this->month_genitive['07'] = /* translators: month name, genitive */ _x( 'July', 'genitive' ); - $this->month_genitive['08'] = /* translators: month name, genitive */ _x( 'August', 'genitive' ); - $this->month_genitive['09'] = /* translators: month name, genitive */ _x( 'September', 'genitive' ); - $this->month_genitive['10'] = /* translators: month name, genitive */ _x( 'October', 'genitive' ); - $this->month_genitive['11'] = /* translators: month name, genitive */ _x( 'November', 'genitive' ); - $this->month_genitive['12'] = /* translators: month name, genitive */ _x( 'December', 'genitive' ); - - // Abbreviations for each month. - $this->month_abbrev[ __( 'January' ) ] = /* translators: three-letter abbreviation of the month */ _x( 'Jan', 'January abbreviation' ); - $this->month_abbrev[ __( 'February' ) ] = /* translators: three-letter abbreviation of the month */ _x( 'Feb', 'February abbreviation' ); - $this->month_abbrev[ __( 'March' ) ] = /* translators: three-letter abbreviation of the month */ _x( 'Mar', 'March abbreviation' ); - $this->month_abbrev[ __( 'April' ) ] = /* translators: three-letter abbreviation of the month */ _x( 'Apr', 'April abbreviation' ); - $this->month_abbrev[ __( 'May' ) ] = /* translators: three-letter abbreviation of the month */ _x( 'May', 'May abbreviation' ); - $this->month_abbrev[ __( 'June' ) ] = /* translators: three-letter abbreviation of the month */ _x( 'Jun', 'June abbreviation' ); - $this->month_abbrev[ __( 'July' ) ] = /* translators: three-letter abbreviation of the month */ _x( 'Jul', 'July abbreviation' ); - $this->month_abbrev[ __( 'August' ) ] = /* translators: three-letter abbreviation of the month */ _x( 'Aug', 'August abbreviation' ); - $this->month_abbrev[ __( 'September' ) ] = /* translators: three-letter abbreviation of the month */ _x( 'Sep', 'September abbreviation' ); - $this->month_abbrev[ __( 'October' ) ] = /* translators: three-letter abbreviation of the month */ _x( 'Oct', 'October abbreviation' ); - $this->month_abbrev[ __( 'November' ) ] = /* translators: three-letter abbreviation of the month */ _x( 'Nov', 'November abbreviation' ); - $this->month_abbrev[ __( 'December' ) ] = /* translators: three-letter abbreviation of the month */ _x( 'Dec', 'December abbreviation' ); - - // The Meridiems - $this->meridiem['am'] = __('am'); - $this->meridiem['pm'] = __('pm'); - $this->meridiem['AM'] = __('AM'); - $this->meridiem['PM'] = __('PM'); - - // Numbers formatting - // See https://secure.php.net/number_format - - /* translators: $thousands_sep argument for https://secure.php.net/number_format, default is , */ - $thousands_sep = __( 'number_format_thousands_sep' ); - - if ( version_compare( PHP_VERSION, '5.4', '>=' ) ) { - // Replace space with a non-breaking space to avoid wrapping. - $thousands_sep = str_replace( ' ', ' ', $thousands_sep ); - } else { - // PHP < 5.4.0 does not support multiple bytes in thousands separator. - $thousands_sep = str_replace( array( ' ', ' ' ), ' ', $thousands_sep ); - } - - $this->number_format['thousands_sep'] = ( 'number_format_thousands_sep' === $thousands_sep ) ? ',' : $thousands_sep; - - /* translators: $dec_point argument for https://secure.php.net/number_format, default is . */ - $decimal_point = __( 'number_format_decimal_point' ); - - $this->number_format['decimal_point'] = ( 'number_format_decimal_point' === $decimal_point ) ? '.' : $decimal_point; - - // Set text direction. - if ( isset( $GLOBALS['text_direction'] ) ) - $this->text_direction = $GLOBALS['text_direction']; - /* translators: 'rtl' or 'ltr'. This sets the text direction for WordPress. */ - elseif ( 'rtl' == _x( 'ltr', 'text direction' ) ) - $this->text_direction = 'rtl'; - - if ( 'rtl' === $this->text_direction && strpos( get_bloginfo( 'version' ), '-src' ) ) { - $this->text_direction = 'ltr'; - add_action( 'all_admin_notices', array( $this, 'rtl_src_admin_notice' ) ); - } - } - - /** - * Outputs an admin notice if the /build directory must be used for RTL. - * - * @since 3.8.0 - * @access public - */ - public function rtl_src_admin_notice() { - /* translators: %s: Name of the directory (build) */ - echo '<div class="error"><p>' . sprintf( __( 'The %s directory of the develop repository must be used for RTL.' ), '<code>build</code>' ) . '</p></div>'; - } - - /** - * Retrieve the full translated weekday word. - * - * Week starts on translated Sunday and can be fetched - * by using 0 (zero). So the week starts with 0 (zero) - * and ends on Saturday with is fetched by using 6 (six). - * - * @since 2.1.0 - * @access public - * - * @param int $weekday_number 0 for Sunday through 6 Saturday - * @return string Full translated weekday - */ - public function get_weekday($weekday_number) { - return $this->weekday[$weekday_number]; - } - - /** - * Retrieve the translated weekday initial. - * - * The weekday initial is retrieved by the translated - * full weekday word. When translating the weekday initial - * pay attention to make sure that the starting letter does - * not conflict. - * - * @since 2.1.0 - * @access public - * - * @param string $weekday_name - * @return string - */ - public function get_weekday_initial($weekday_name) { - return $this->weekday_initial[$weekday_name]; - } - - /** - * Retrieve the translated weekday abbreviation. - * - * The weekday abbreviation is retrieved by the translated - * full weekday word. - * - * @since 2.1.0 - * @access public - * - * @param string $weekday_name Full translated weekday word - * @return string Translated weekday abbreviation - */ - public function get_weekday_abbrev($weekday_name) { - return $this->weekday_abbrev[$weekday_name]; - } - - /** - * Retrieve the full translated month by month number. - * - * The $month_number parameter has to be a string - * because it must have the '0' in front of any number - * that is less than 10. Starts from '01' and ends at - * '12'. - * - * You can use an integer instead and it will add the - * '0' before the numbers less than 10 for you. - * - * @since 2.1.0 - * @access public - * - * @param string|int $month_number '01' through '12' - * @return string Translated full month name - */ - public function get_month($month_number) { - return $this->month[zeroise($month_number, 2)]; - } - - /** - * Retrieve translated version of month abbreviation string. - * - * The $month_name parameter is expected to be the translated or - * translatable version of the month. - * - * @since 2.1.0 - * @access public - * - * @param string $month_name Translated month to get abbreviated version - * @return string Translated abbreviated month - */ - public function get_month_abbrev($month_name) { - return $this->month_abbrev[$month_name]; - } - - /** - * Retrieve translated version of meridiem string. - * - * The $meridiem parameter is expected to not be translated. - * - * @since 2.1.0 - * @access public - * - * @param string $meridiem Either 'am', 'pm', 'AM', or 'PM'. Not translated version. - * @return string Translated version - */ - public function get_meridiem($meridiem) { - return $this->meridiem[$meridiem]; - } - - /** - * Global variables are deprecated. - * - * For backward compatibility only. - * - * @deprecated For backward compatibility only. - * @access private - * - * @global array $weekday - * @global array $weekday_initial - * @global array $weekday_abbrev - * @global array $month - * @global array $month_abbrev - * - * @since 2.1.0 - */ - public function register_globals() { - $GLOBALS['weekday'] = $this->weekday; - $GLOBALS['weekday_initial'] = $this->weekday_initial; - $GLOBALS['weekday_abbrev'] = $this->weekday_abbrev; - $GLOBALS['month'] = $this->month; - $GLOBALS['month_abbrev'] = $this->month_abbrev; - } - - /** - * Checks if current locale is RTL. - * - * @since 3.0.0 - * @return bool Whether locale is RTL. - */ - public function is_rtl() { - return 'rtl' == $this->text_direction; - } - - /** - * Register date/time format strings for general POT. - * - * Private, unused method to add some date/time formats translated - * on wp-admin/options-general.php to the general POT that would - * otherwise be added to the admin POT. - * - * @since 3.6.0 - */ - public function _strings_for_pot() { - /* translators: localized date format, see https://secure.php.net/date */ - __( 'F j, Y' ); - /* translators: localized time format, see https://secure.php.net/date */ - __( 'g:i a' ); - /* translators: localized date and time format, see https://secure.php.net/date */ - __( 'F j, Y g:i a' ); - } -} diff --git a/wp/wp-includes/class-wp-matchesmapregex.php b/wp/wp-includes/class-wp-matchesmapregex.php deleted file mode 100644 index 86ebb252..00000000 --- a/wp/wp-includes/class-wp-matchesmapregex.php +++ /dev/null @@ -1,97 +0,0 @@ -<?php -/** - * WP_MatchesMapRegex helper class - * - * @package WordPress - * @since 4.7.0 - */ - -/** - * Helper class to remove the need to use eval to replace $matches[] in query strings. - * - * @since 2.9.0 - */ -class WP_MatchesMapRegex { - /** - * store for matches - * - * @access private - * @var array - */ - private $_matches; - - /** - * store for mapping result - * - * @access public - * @var string - */ - public $output; - - /** - * subject to perform mapping on (query string containing $matches[] references - * - * @access private - * @var string - */ - private $_subject; - - /** - * regexp pattern to match $matches[] references - * - * @var string - */ - public $_pattern = '(\$matches\[[1-9]+[0-9]*\])'; // magic number - - /** - * constructor - * - * @param string $subject subject if regex - * @param array $matches data to use in map - */ - public function __construct($subject, $matches) { - $this->_subject = $subject; - $this->_matches = $matches; - $this->output = $this->_map(); - } - - /** - * Substitute substring matches in subject. - * - * static helper function to ease use - * - * @static - * @access public - * - * @param string $subject subject - * @param array $matches data used for substitution - * @return string - */ - public static function apply($subject, $matches) { - $oSelf = new WP_MatchesMapRegex($subject, $matches); - return $oSelf->output; - } - - /** - * do the actual mapping - * - * @access private - * @return string - */ - private function _map() { - $callback = array($this, 'callback'); - return preg_replace_callback($this->_pattern, $callback, $this->_subject); - } - - /** - * preg_replace_callback hook - * - * @access public - * @param array $matches preg_replace regexp matches - * @return string - */ - public function callback($matches) { - $index = intval(substr($matches[0], 9, -1)); - return ( isset( $this->_matches[$index] ) ? urlencode($this->_matches[$index]) : '' ); - } -} diff --git a/wp/wp-includes/class-wp-meta-query.php b/wp/wp-includes/class-wp-meta-query.php deleted file mode 100644 index 40199120..00000000 --- a/wp/wp-includes/class-wp-meta-query.php +++ /dev/null @@ -1,752 +0,0 @@ -<?php -/** - * Meta API: WP_Meta_Query class - * - * @package WordPress - * @subpackage Meta - * @since 4.4.0 - */ - -/** - * Core class used to implement meta queries for the Meta API. - * - * Used for generating SQL clauses that filter a primary query according to metadata keys and values. - * - * WP_Meta_Query is a helper that allows primary query classes, such as WP_Query and WP_User_Query, - * - * to filter their results by object metadata, by generating `JOIN` and `WHERE` subclauses to be attached - * to the primary SQL query string. - * - * @since 3.2.0 - * @package WordPress - * @subpackage Meta - */ -class WP_Meta_Query { - /** - * Array of metadata queries. - * - * See WP_Meta_Query::__construct() for information on meta query arguments. - * - * @since 3.2.0 - * @access public - * @var array - */ - public $queries = array(); - - /** - * The relation between the queries. Can be one of 'AND' or 'OR'. - * - * @since 3.2.0 - * @access public - * @var string - */ - public $relation; - - /** - * Database table to query for the metadata. - * - * @since 4.1.0 - * @access public - * @var string - */ - public $meta_table; - - /** - * Column in meta_table that represents the ID of the object the metadata belongs to. - * - * @since 4.1.0 - * @access public - * @var string - */ - public $meta_id_column; - - /** - * Database table that where the metadata's objects are stored (eg $wpdb->users). - * - * @since 4.1.0 - * @access public - * @var string - */ - public $primary_table; - - /** - * Column in primary_table that represents the ID of the object. - * - * @since 4.1.0 - * @access public - * @var string - */ - public $primary_id_column; - - /** - * A flat list of table aliases used in JOIN clauses. - * - * @since 4.1.0 - * @access protected - * @var array - */ - protected $table_aliases = array(); - - /** - * A flat list of clauses, keyed by clause 'name'. - * - * @since 4.2.0 - * @access protected - * @var array - */ - protected $clauses = array(); - - /** - * Whether the query contains any OR relations. - * - * @since 4.3.0 - * @access protected - * @var bool - */ - protected $has_or_relation = false; - - /** - * Constructor. - * - * @since 3.2.0 - * @since 4.2.0 Introduced support for naming query clauses by associative array keys. - * - * @access public - * - * @param array $meta_query { - * Array of meta query clauses. When first-order clauses or sub-clauses use strings as - * their array keys, they may be referenced in the 'orderby' parameter of the parent query. - * - * @type string $relation Optional. The MySQL keyword used to join - * the clauses of the query. Accepts 'AND', or 'OR'. Default 'AND'. - * @type array { - * Optional. An array of first-order clause parameters, or another fully-formed meta query. - * - * @type string $key Meta key to filter by. - * @type string $value Meta value to filter by. - * @type string $compare MySQL operator used for comparing the $value. Accepts '=', - * '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', - * 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'REGEXP', - * 'NOT REGEXP', 'RLIKE', 'EXISTS' or 'NOT EXISTS'. - * Default is 'IN' when `$value` is an array, '=' otherwise. - * @type string $type MySQL data type that the meta_value column will be CAST to for - * comparisons. Accepts 'NUMERIC', 'BINARY', 'CHAR', 'DATE', - * 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', or 'UNSIGNED'. - * Default is 'CHAR'. - * } - * } - */ - public function __construct( $meta_query = false ) { - if ( !$meta_query ) - return; - - if ( isset( $meta_query['relation'] ) && strtoupper( $meta_query['relation'] ) == 'OR' ) { - $this->relation = 'OR'; - } else { - $this->relation = 'AND'; - } - - $this->queries = $this->sanitize_query( $meta_query ); - } - - /** - * Ensure the 'meta_query' argument passed to the class constructor is well-formed. - * - * Eliminates empty items and ensures that a 'relation' is set. - * - * @since 4.1.0 - * @access public - * - * @param array $queries Array of query clauses. - * @return array Sanitized array of query clauses. - */ - public function sanitize_query( $queries ) { - $clean_queries = array(); - - if ( ! is_array( $queries ) ) { - return $clean_queries; - } - - foreach ( $queries as $key => $query ) { - if ( 'relation' === $key ) { - $relation = $query; - - } elseif ( ! is_array( $query ) ) { - continue; - - // First-order clause. - } elseif ( $this->is_first_order_clause( $query ) ) { - if ( isset( $query['value'] ) && array() === $query['value'] ) { - unset( $query['value'] ); - } - - $clean_queries[ $key ] = $query; - - // Otherwise, it's a nested query, so we recurse. - } else { - $cleaned_query = $this->sanitize_query( $query ); - - if ( ! empty( $cleaned_query ) ) { - $clean_queries[ $key ] = $cleaned_query; - } - } - } - - if ( empty( $clean_queries ) ) { - return $clean_queries; - } - - // Sanitize the 'relation' key provided in the query. - if ( isset( $relation ) && 'OR' === strtoupper( $relation ) ) { - $clean_queries['relation'] = 'OR'; - $this->has_or_relation = true; - - /* - * If there is only a single clause, call the relation 'OR'. - * This value will not actually be used to join clauses, but it - * simplifies the logic around combining key-only queries. - */ - } elseif ( 1 === count( $clean_queries ) ) { - $clean_queries['relation'] = 'OR'; - - // Default to AND. - } else { - $clean_queries['relation'] = 'AND'; - } - - return $clean_queries; - } - - /** - * Determine whether a query clause is first-order. - * - * A first-order meta query clause is one that has either a 'key' or - * a 'value' array key. - * - * @since 4.1.0 - * @access protected - * - * @param array $query Meta query arguments. - * @return bool Whether the query clause is a first-order clause. - */ - protected function is_first_order_clause( $query ) { - return isset( $query['key'] ) || isset( $query['value'] ); - } - - /** - * Constructs a meta query based on 'meta_*' query vars - * - * @since 3.2.0 - * @access public - * - * @param array $qv The query variables - */ - public function parse_query_vars( $qv ) { - $meta_query = array(); - - /* - * For orderby=meta_value to work correctly, simple query needs to be - * first (so that its table join is against an unaliased meta table) and - * needs to be its own clause (so it doesn't interfere with the logic of - * the rest of the meta_query). - */ - $primary_meta_query = array(); - foreach ( array( 'key', 'compare', 'type' ) as $key ) { - if ( ! empty( $qv[ "meta_$key" ] ) ) { - $primary_meta_query[ $key ] = $qv[ "meta_$key" ]; - } - } - - // WP_Query sets 'meta_value' = '' by default. - if ( isset( $qv['meta_value'] ) && '' !== $qv['meta_value'] && ( ! is_array( $qv['meta_value'] ) || $qv['meta_value'] ) ) { - $primary_meta_query['value'] = $qv['meta_value']; - } - - $existing_meta_query = isset( $qv['meta_query'] ) && is_array( $qv['meta_query'] ) ? $qv['meta_query'] : array(); - - if ( ! empty( $primary_meta_query ) && ! empty( $existing_meta_query ) ) { - $meta_query = array( - 'relation' => 'AND', - $primary_meta_query, - $existing_meta_query, - ); - } elseif ( ! empty( $primary_meta_query ) ) { - $meta_query = array( - $primary_meta_query, - ); - } elseif ( ! empty( $existing_meta_query ) ) { - $meta_query = $existing_meta_query; - } - - $this->__construct( $meta_query ); - } - - /** - * Return the appropriate alias for the given meta type if applicable. - * - * @since 3.7.0 - * @access public - * - * @param string $type MySQL type to cast meta_value. - * @return string MySQL type. - */ - public function get_cast_for_type( $type = '' ) { - if ( empty( $type ) ) - return 'CHAR'; - - $meta_type = strtoupper( $type ); - - if ( ! preg_match( '/^(?:BINARY|CHAR|DATE|DATETIME|SIGNED|UNSIGNED|TIME|NUMERIC(?:\(\d+(?:,\s?\d+)?\))?|DECIMAL(?:\(\d+(?:,\s?\d+)?\))?)$/', $meta_type ) ) - return 'CHAR'; - - if ( 'NUMERIC' == $meta_type ) - $meta_type = 'SIGNED'; - - return $meta_type; - } - - /** - * Generates SQL clauses to be appended to a main query. - * - * @since 3.2.0 - * @access public - * - * @param string $type Type of meta, eg 'user', 'post'. - * @param string $primary_table Database table where the object being filtered is stored (eg wp_users). - * @param string $primary_id_column ID column for the filtered object in $primary_table. - * @param object $context Optional. The main query object. - * @return false|array { - * Array containing JOIN and WHERE SQL clauses to append to the main query. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - public function get_sql( $type, $primary_table, $primary_id_column, $context = null ) { - if ( ! $meta_table = _get_meta_table( $type ) ) { - return false; - } - - $this->table_aliases = array(); - - $this->meta_table = $meta_table; - $this->meta_id_column = sanitize_key( $type . '_id' ); - - $this->primary_table = $primary_table; - $this->primary_id_column = $primary_id_column; - - $sql = $this->get_sql_clauses(); - - /* - * If any JOINs are LEFT JOINs (as in the case of NOT EXISTS), then all JOINs should - * be LEFT. Otherwise posts with no metadata will be excluded from results. - */ - if ( false !== strpos( $sql['join'], 'LEFT JOIN' ) ) { - $sql['join'] = str_replace( 'INNER JOIN', 'LEFT JOIN', $sql['join'] ); - } - - /** - * Filters the meta query's generated SQL. - * - * @since 3.1.0 - * - * @param array $clauses Array containing the query's JOIN and WHERE clauses. - * @param array $queries Array of meta queries. - * @param string $type Type of meta. - * @param string $primary_table Primary table. - * @param string $primary_id_column Primary column ID. - * @param object $context The main query object. - */ - return apply_filters_ref_array( 'get_meta_sql', array( $sql, $this->queries, $type, $primary_table, $primary_id_column, $context ) ); - } - - /** - * Generate SQL clauses to be appended to a main query. - * - * Called by the public WP_Meta_Query::get_sql(), this method is abstracted - * out to maintain parity with the other Query classes. - * - * @since 4.1.0 - * @access protected - * - * @return array { - * Array containing JOIN and WHERE SQL clauses to append to the main query. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - protected function get_sql_clauses() { - /* - * $queries are passed by reference to get_sql_for_query() for recursion. - * To keep $this->queries unaltered, pass a copy. - */ - $queries = $this->queries; - $sql = $this->get_sql_for_query( $queries ); - - if ( ! empty( $sql['where'] ) ) { - $sql['where'] = ' AND ' . $sql['where']; - } - - return $sql; - } - - /** - * Generate SQL clauses for a single query array. - * - * If nested subqueries are found, this method recurses the tree to - * produce the properly nested SQL. - * - * @since 4.1.0 - * @access protected - * - * @param array $query Query to parse, passed by reference. - * @param int $depth Optional. Number of tree levels deep we currently are. - * Used to calculate indentation. Default 0. - * @return array { - * Array containing JOIN and WHERE SQL clauses to append to a single query array. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - protected function get_sql_for_query( &$query, $depth = 0 ) { - $sql_chunks = array( - 'join' => array(), - 'where' => array(), - ); - - $sql = array( - 'join' => '', - 'where' => '', - ); - - $indent = ''; - for ( $i = 0; $i < $depth; $i++ ) { - $indent .= " "; - } - - foreach ( $query as $key => &$clause ) { - if ( 'relation' === $key ) { - $relation = $query['relation']; - } elseif ( is_array( $clause ) ) { - - // This is a first-order clause. - if ( $this->is_first_order_clause( $clause ) ) { - $clause_sql = $this->get_sql_for_clause( $clause, $query, $key ); - - $where_count = count( $clause_sql['where'] ); - if ( ! $where_count ) { - $sql_chunks['where'][] = ''; - } elseif ( 1 === $where_count ) { - $sql_chunks['where'][] = $clause_sql['where'][0]; - } else { - $sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )'; - } - - $sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] ); - // This is a subquery, so we recurse. - } else { - $clause_sql = $this->get_sql_for_query( $clause, $depth + 1 ); - - $sql_chunks['where'][] = $clause_sql['where']; - $sql_chunks['join'][] = $clause_sql['join']; - } - } - } - - // Filter to remove empties. - $sql_chunks['join'] = array_filter( $sql_chunks['join'] ); - $sql_chunks['where'] = array_filter( $sql_chunks['where'] ); - - if ( empty( $relation ) ) { - $relation = 'AND'; - } - - // Filter duplicate JOIN clauses and combine into a single string. - if ( ! empty( $sql_chunks['join'] ) ) { - $sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) ); - } - - // Generate a single WHERE clause with proper brackets and indentation. - if ( ! empty( $sql_chunks['where'] ) ) { - $sql['where'] = '( ' . "\n " . $indent . implode( ' ' . "\n " . $indent . $relation . ' ' . "\n " . $indent, $sql_chunks['where'] ) . "\n" . $indent . ')'; - } - - return $sql; - } - - /** - * Generate SQL JOIN and WHERE clauses for a first-order query clause. - * - * "First-order" means that it's an array with a 'key' or 'value'. - * - * @since 4.1.0 - * @access public - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param array $clause Query clause, passed by reference. - * @param array $parent_query Parent query array. - * @param string $clause_key Optional. The array key used to name the clause in the original `$meta_query` - * parameters. If not provided, a key will be generated automatically. - * @return array { - * Array containing JOIN and WHERE SQL clauses to append to a first-order query. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - public function get_sql_for_clause( &$clause, $parent_query, $clause_key = '' ) { - global $wpdb; - - $sql_chunks = array( - 'where' => array(), - 'join' => array(), - ); - - if ( isset( $clause['compare'] ) ) { - $clause['compare'] = strtoupper( $clause['compare'] ); - } else { - $clause['compare'] = isset( $clause['value'] ) && is_array( $clause['value'] ) ? 'IN' : '='; - } - - if ( ! in_array( $clause['compare'], array( - '=', '!=', '>', '>=', '<', '<=', - 'LIKE', 'NOT LIKE', - 'IN', 'NOT IN', - 'BETWEEN', 'NOT BETWEEN', - 'EXISTS', 'NOT EXISTS', - 'REGEXP', 'NOT REGEXP', 'RLIKE' - ) ) ) { - $clause['compare'] = '='; - } - - $meta_compare = $clause['compare']; - - // First build the JOIN clause, if one is required. - $join = ''; - - // We prefer to avoid joins if possible. Look for an existing join compatible with this clause. - $alias = $this->find_compatible_table_alias( $clause, $parent_query ); - if ( false === $alias ) { - $i = count( $this->table_aliases ); - $alias = $i ? 'mt' . $i : $this->meta_table; - - // JOIN clauses for NOT EXISTS have their own syntax. - if ( 'NOT EXISTS' === $meta_compare ) { - $join .= " LEFT JOIN $this->meta_table"; - $join .= $i ? " AS $alias" : ''; - $join .= $wpdb->prepare( " ON ($this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column AND $alias.meta_key = %s )", $clause['key'] ); - - // All other JOIN clauses. - } else { - $join .= " INNER JOIN $this->meta_table"; - $join .= $i ? " AS $alias" : ''; - $join .= " ON ( $this->primary_table.$this->primary_id_column = $alias.$this->meta_id_column )"; - } - - $this->table_aliases[] = $alias; - $sql_chunks['join'][] = $join; - } - - // Save the alias to this clause, for future siblings to find. - $clause['alias'] = $alias; - - // Determine the data type. - $_meta_type = isset( $clause['type'] ) ? $clause['type'] : ''; - $meta_type = $this->get_cast_for_type( $_meta_type ); - $clause['cast'] = $meta_type; - - // Fallback for clause keys is the table alias. Key must be a string. - if ( is_int( $clause_key ) || ! $clause_key ) { - $clause_key = $clause['alias']; - } - - // Ensure unique clause keys, so none are overwritten. - $iterator = 1; - $clause_key_base = $clause_key; - while ( isset( $this->clauses[ $clause_key ] ) ) { - $clause_key = $clause_key_base . '-' . $iterator; - $iterator++; - } - - // Store the clause in our flat array. - $this->clauses[ $clause_key ] =& $clause; - - // Next, build the WHERE clause. - - // meta_key. - if ( array_key_exists( 'key', $clause ) ) { - if ( 'NOT EXISTS' === $meta_compare ) { - $sql_chunks['where'][] = $alias . '.' . $this->meta_id_column . ' IS NULL'; - } else { - $sql_chunks['where'][] = $wpdb->prepare( "$alias.meta_key = %s", trim( $clause['key'] ) ); - } - } - - // meta_value. - if ( array_key_exists( 'value', $clause ) ) { - $meta_value = $clause['value']; - - if ( in_array( $meta_compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) { - if ( ! is_array( $meta_value ) ) { - $meta_value = preg_split( '/[,\s]+/', $meta_value ); - } - } else { - $meta_value = trim( $meta_value ); - } - - switch ( $meta_compare ) { - case 'IN' : - case 'NOT IN' : - $meta_compare_string = '(' . substr( str_repeat( ',%s', count( $meta_value ) ), 1 ) . ')'; - $where = $wpdb->prepare( $meta_compare_string, $meta_value ); - break; - - case 'BETWEEN' : - case 'NOT BETWEEN' : - $meta_value = array_slice( $meta_value, 0, 2 ); - $where = $wpdb->prepare( '%s AND %s', $meta_value ); - break; - - case 'LIKE' : - case 'NOT LIKE' : - $meta_value = '%' . $wpdb->esc_like( $meta_value ) . '%'; - $where = $wpdb->prepare( '%s', $meta_value ); - break; - - // EXISTS with a value is interpreted as '='. - case 'EXISTS' : - $meta_compare = '='; - $where = $wpdb->prepare( '%s', $meta_value ); - break; - - // 'value' is ignored for NOT EXISTS. - case 'NOT EXISTS' : - $where = ''; - break; - - default : - $where = $wpdb->prepare( '%s', $meta_value ); - break; - - } - - if ( $where ) { - if ( 'CHAR' === $meta_type ) { - $sql_chunks['where'][] = "$alias.meta_value {$meta_compare} {$where}"; - } else { - $sql_chunks['where'][] = "CAST($alias.meta_value AS {$meta_type}) {$meta_compare} {$where}"; - } - } - } - - /* - * Multiple WHERE clauses (for meta_key and meta_value) should - * be joined in parentheses. - */ - if ( 1 < count( $sql_chunks['where'] ) ) { - $sql_chunks['where'] = array( '( ' . implode( ' AND ', $sql_chunks['where'] ) . ' )' ); - } - - return $sql_chunks; - } - - /** - * Get a flattened list of sanitized meta clauses. - * - * This array should be used for clause lookup, as when the table alias and CAST type must be determined for - * a value of 'orderby' corresponding to a meta clause. - * - * @since 4.2.0 - * @access public - * - * @return array Meta clauses. - */ - public function get_clauses() { - return $this->clauses; - } - - /** - * Identify an existing table alias that is compatible with the current - * query clause. - * - * We avoid unnecessary table joins by allowing each clause to look for - * an existing table alias that is compatible with the query that it - * needs to perform. - * - * An existing alias is compatible if (a) it is a sibling of `$clause` - * (ie, it's under the scope of the same relation), and (b) the combination - * of operator and relation between the clauses allows for a shared table join. - * In the case of WP_Meta_Query, this only applies to 'IN' clauses that are - * connected by the relation 'OR'. - * - * @since 4.1.0 - * @access protected - * - * @param array $clause Query clause. - * @param array $parent_query Parent query of $clause. - * @return string|bool Table alias if found, otherwise false. - */ - protected function find_compatible_table_alias( $clause, $parent_query ) { - $alias = false; - - foreach ( $parent_query as $sibling ) { - // If the sibling has no alias yet, there's nothing to check. - if ( empty( $sibling['alias'] ) ) { - continue; - } - - // We're only interested in siblings that are first-order clauses. - if ( ! is_array( $sibling ) || ! $this->is_first_order_clause( $sibling ) ) { - continue; - } - - $compatible_compares = array(); - - // Clauses connected by OR can share joins as long as they have "positive" operators. - if ( 'OR' === $parent_query['relation'] ) { - $compatible_compares = array( '=', 'IN', 'BETWEEN', 'LIKE', 'REGEXP', 'RLIKE', '>', '>=', '<', '<=' ); - - // Clauses joined by AND with "negative" operators share a join only if they also share a key. - } elseif ( isset( $sibling['key'] ) && isset( $clause['key'] ) && $sibling['key'] === $clause['key'] ) { - $compatible_compares = array( '!=', 'NOT IN', 'NOT LIKE' ); - } - - $clause_compare = strtoupper( $clause['compare'] ); - $sibling_compare = strtoupper( $sibling['compare'] ); - if ( in_array( $clause_compare, $compatible_compares ) && in_array( $sibling_compare, $compatible_compares ) ) { - $alias = $sibling['alias']; - break; - } - } - - /** - * Filters the table alias identified as compatible with the current clause. - * - * @since 4.1.0 - * - * @param string|bool $alias Table alias, or false if none was found. - * @param array $clause First-order query clause. - * @param array $parent_query Parent of $clause. - * @param object $this WP_Meta_Query object. - */ - return apply_filters( 'meta_query_find_compatible_table_alias', $alias, $clause, $parent_query, $this ) ; - } - - /** - * Checks whether the current query has any OR relations. - * - * In some cases, the presence of an OR relation somewhere in the query will require - * the use of a `DISTINCT` or `GROUP BY` keyword in the `SELECT` clause. The current - * method can be used in these cases to determine whether such a clause is necessary. - * - * @since 4.3.0 - * - * @return bool True if the query contains any `OR` relations, otherwise false. - */ - public function has_or_relation() { - return $this->has_or_relation; - } -} diff --git a/wp/wp-includes/class-wp-metadata-lazyloader.php b/wp/wp-includes/class-wp-metadata-lazyloader.php deleted file mode 100644 index beaf249f..00000000 --- a/wp/wp-includes/class-wp-metadata-lazyloader.php +++ /dev/null @@ -1,176 +0,0 @@ -<?php -/** - * Meta API: WP_Metadata_Lazyloader class - * - * @package WordPress - * @subpackage Meta - * @since 4.5.0 - */ - -/** - * Core class used for lazy-loading object metadata. - * - * When loading many objects of a given type, such as posts in a WP_Query loop, it often makes - * sense to prime various metadata caches at the beginning of the loop. This means fetching all - * relevant metadata with a single database query, a technique that has the potential to improve - * performance dramatically in some cases. - * - * In cases where the given metadata may not even be used in the loop, we can improve performance - * even more by only priming the metadata cache for affected items the first time a piece of metadata - * is requested - ie, by lazy-loading it. So, for example, comment meta may not be loaded into the - * cache in the comments section of a post until the first time get_comment_meta() is called in the - * context of the comment loop. - * - * WP uses the WP_Metadata_Lazyloader class to queue objects for metadata cache priming. The class - * then detects the relevant get_*_meta() function call, and queries the metadata of all queued objects. - * - * Do not access this class directly. Use the wp_metadata_lazyloader() function. - * - * @since 4.5.0 - */ -class WP_Metadata_Lazyloader { - /** - * Pending objects queue. - * - * @since 4.5.0 - * @access protected - * @var array - */ - protected $pending_objects; - - /** - * Settings for supported object types. - * - * @since 4.5.0 - * @access protected - * @var array - */ - protected $settings = array(); - - /** - * Constructor. - * - * @since 4.5.0 - * @access public - */ - public function __construct() { - $this->settings = array( - 'term' => array( - 'filter' => 'get_term_metadata', - 'callback' => array( $this, 'lazyload_term_meta' ), - ), - 'comment' => array( - 'filter' => 'get_comment_metadata', - 'callback' => array( $this, 'lazyload_comment_meta' ), - ), - ); - } - - /** - * Adds objects to the metadata lazy-load queue. - * - * @since 4.5.0 - * @access public - * - * @param string $object_type Type of object whose meta is to be lazy-loaded. Accepts 'term' or 'comment'. - * @param array $object_ids Array of object IDs. - * @return bool|WP_Error True on success, WP_Error on failure. - */ - public function queue_objects( $object_type, $object_ids ) { - if ( ! isset( $this->settings[ $object_type ] ) ) { - return new WP_Error( 'invalid_object_type', __( 'Invalid object type' ) ); - } - - $type_settings = $this->settings[ $object_type ]; - - if ( ! isset( $this->pending_objects[ $object_type ] ) ) { - $this->pending_objects[ $object_type ] = array(); - } - - foreach ( $object_ids as $object_id ) { - // Keyed by ID for faster lookup. - if ( ! isset( $this->pending_objects[ $object_type ][ $object_id ] ) ) { - $this->pending_objects[ $object_type ][ $object_id ] = 1; - } - } - - add_filter( $type_settings['filter'], $type_settings['callback'] ); - - /** - * Fires after objects are added to the metadata lazy-load queue. - * - * @since 4.5.0 - * - * @param array $object_ids Object IDs. - * @param string $object_type Type of object being queued. - * @param WP_Metadata_Lazyloader $lazyloader The lazy-loader object. - */ - do_action( 'metadata_lazyloader_queued_objects', $object_ids, $object_type, $this ); - } - - /** - * Resets lazy-load queue for a given object type. - * - * @since 4.5.0 - * @access public - * - * @param string $object_type Object type. Accepts 'comment' or 'term'. - * @return bool|WP_Error True on success, WP_Error on failure. - */ - public function reset_queue( $object_type ) { - if ( ! isset( $this->settings[ $object_type ] ) ) { - return new WP_Error( 'invalid_object_type', __( 'Invalid object type' ) ); - } - - $type_settings = $this->settings[ $object_type ]; - - $this->pending_objects[ $object_type ] = array(); - remove_filter( $type_settings['filter'], $type_settings['callback'] ); - } - - /** - * Lazy-loads term meta for queued terms. - * - * This method is public so that it can be used as a filter callback. As a rule, there - * is no need to invoke it directly. - * - * @since 4.5.0 - * @access public - * - * @param mixed $check The `$check` param passed from the 'get_term_metadata' hook. - * @return mixed In order not to short-circuit `get_metadata()`. Generally, this is `null`, but it could be - * another value if filtered by a plugin. - */ - public function lazyload_term_meta( $check ) { - if ( ! empty( $this->pending_objects['term'] ) ) { - update_termmeta_cache( array_keys( $this->pending_objects['term'] ) ); - - // No need to run again for this set of terms. - $this->reset_queue( 'term' ); - } - - return $check; - } - - /** - * Lazy-loads comment meta for queued comments. - * - * This method is public so that it can be used as a filter callback. As a rule, there is no need to invoke it - * directly, from either inside or outside the `WP_Query` object. - * - * @since 4.5.0 - * - * @param mixed $check The `$check` param passed from the {@see 'get_comment_metadata'} hook. - * @return mixed The original value of `$check`, so as not to short-circuit `get_comment_metadata()`. - */ - public function lazyload_comment_meta( $check ) { - if ( ! empty( $this->pending_objects['comment'] ) ) { - update_meta_cache( 'comment', array_keys( $this->pending_objects['comment'] ) ); - - // No need to run again for this set of comments. - $this->reset_queue( 'comment' ); - } - - return $check; - } -} diff --git a/wp/wp-includes/class-wp-network-query.php b/wp/wp-includes/class-wp-network-query.php deleted file mode 100644 index 1bf38ad7..00000000 --- a/wp/wp-includes/class-wp-network-query.php +++ /dev/null @@ -1,559 +0,0 @@ -<?php -/** - * Network API: WP_Network_Query class - * - * @package WordPress - * @subpackage Multisite - * @since 4.6.0 - */ - -/** - * Core class used for querying networks. - * - * @since 4.6.0 - * - * @see WP_Network_Query::__construct() for accepted arguments. - */ -class WP_Network_Query { - - /** - * SQL for database query. - * - * @since 4.6.0 - * @access public - * @var string - */ - public $request; - - /** - * SQL query clauses. - * - * @since 4.6.0 - * @access protected - * @var array - */ - protected $sql_clauses = array( - 'select' => '', - 'from' => '', - 'where' => array(), - 'groupby' => '', - 'orderby' => '', - 'limits' => '', - ); - - /** - * Query vars set by the user. - * - * @since 4.6.0 - * @access public - * @var array - */ - public $query_vars; - - /** - * Default values for query vars. - * - * @since 4.6.0 - * @access public - * @var array - */ - public $query_var_defaults; - - /** - * List of networks located by the query. - * - * @since 4.6.0 - * @access public - * @var array - */ - public $networks; - - /** - * The amount of found networks for the current query. - * - * @since 4.6.0 - * @access public - * @var int - */ - public $found_networks = 0; - - /** - * The number of pages. - * - * @since 4.6.0 - * @access public - * @var int - */ - public $max_num_pages = 0; - - /** - * Constructor. - * - * Sets up the network query, based on the query vars passed. - * - * @since 4.6.0 - * @access public - * - * @param string|array $query { - * Optional. Array or query string of network query parameters. Default empty. - * - * @type array $network__in Array of network IDs to include. Default empty. - * @type array $network__not_in Array of network IDs to exclude. Default empty. - * @type bool $count Whether to return a network count (true) or array of network objects. - * Default false. - * @type string $fields Network fields to return. Accepts 'ids' (returns an array of network IDs) - * or empty (returns an array of complete network objects). Default empty. - * @type int $number Maximum number of networks to retrieve. Default empty (no limit). - * @type int $offset Number of networks to offset the query. Used to build LIMIT clause. - * Default 0. - * @type bool $no_found_rows Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true. - * @type string|array $orderby Network status or array of statuses. Accepts 'id', 'domain', 'path', - * 'domain_length', 'path_length' and 'network__in'. Also accepts false, - * an empty array, or 'none' to disable `ORDER BY` clause. Default 'id'. - * @type string $order How to order retrieved networks. Accepts 'ASC', 'DESC'. Default 'ASC'. - * @type string $domain Limit results to those affiliated with a given domain. Default empty. - * @type array $domain__in Array of domains to include affiliated networks for. Default empty. - * @type array $domain__not_in Array of domains to exclude affiliated networks for. Default empty. - * @type string $path Limit results to those affiliated with a given path. Default empty. - * @type array $path__in Array of paths to include affiliated networks for. Default empty. - * @type array $path__not_in Array of paths to exclude affiliated networks for. Default empty. - * @type string $search Search term(s) to retrieve matching networks for. Default empty. - * @type bool $update_network_cache Whether to prime the cache for found networks. Default true. - * } - */ - public function __construct( $query = '' ) { - $this->query_var_defaults = array( - 'network__in' => '', - 'network__not_in' => '', - 'count' => false, - 'fields' => '', - 'number' => '', - 'offset' => '', - 'no_found_rows' => true, - 'orderby' => 'id', - 'order' => 'ASC', - 'domain' => '', - 'domain__in' => '', - 'domain__not_in' => '', - 'path' => '', - 'path__in' => '', - 'path__not_in' => '', - 'search' => '', - 'update_network_cache' => true, - ); - - if ( ! empty( $query ) ) { - $this->query( $query ); - } - } - - /** - * Parses arguments passed to the network query with default query parameters. - * - * @since 4.6.0 - * - * @access public - * - * @param string|array $query WP_Network_Query arguments. See WP_Network_Query::__construct() - */ - public function parse_query( $query = '' ) { - if ( empty( $query ) ) { - $query = $this->query_vars; - } - - $this->query_vars = wp_parse_args( $query, $this->query_var_defaults ); - - /** - * Fires after the network query vars have been parsed. - * - * @since 4.6.0 - * - * @param WP_Network_Query &$this The WP_Network_Query instance (passed by reference). - */ - do_action_ref_array( 'parse_network_query', array( &$this ) ); - } - - /** - * Sets up the WordPress query for retrieving networks. - * - * @since 4.6.0 - * @access public - * - * @param string|array $query Array or URL query string of parameters. - * @return array|int List of networks, or number of networks when 'count' is passed as a query var. - */ - public function query( $query ) { - $this->query_vars = wp_parse_args( $query ); - return $this->get_networks(); - } - - /** - * Gets a list of networks matching the query vars. - * - * @since 4.6.0 - * @access public - * - * @return int|array The list of networks. - */ - public function get_networks() { - $this->parse_query(); - - /** - * Fires before networks are retrieved. - * - * @since 4.6.0 - * - * @param WP_Network_Query &$this Current instance of WP_Network_Query, passed by reference. - */ - do_action_ref_array( 'pre_get_networks', array( &$this ) ); - - // $args can include anything. Only use the args defined in the query_var_defaults to compute the key. - $key = md5( serialize( wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ) ) ); - $last_changed = wp_cache_get_last_changed( 'networks' ); - - $cache_key = "get_network_ids:$key:$last_changed"; - $cache_value = wp_cache_get( $cache_key, 'networks' ); - - if ( false === $cache_value ) { - $network_ids = $this->get_network_ids(); - if ( $network_ids ) { - $this->set_found_networks(); - } - - $cache_value = array( - 'network_ids' => $network_ids, - 'found_networks' => $this->found_networks, - ); - wp_cache_add( $cache_key, $cache_value, 'networks' ); - } else { - $network_ids = $cache_value['network_ids']; - $this->found_networks = $cache_value['found_networks']; - } - - if ( $this->found_networks && $this->query_vars['number'] ) { - $this->max_num_pages = ceil( $this->found_networks / $this->query_vars['number'] ); - } - - // If querying for a count only, there's nothing more to do. - if ( $this->query_vars['count'] ) { - // $network_ids is actually a count in this case. - return intval( $network_ids ); - } - - $network_ids = array_map( 'intval', $network_ids ); - - if ( 'ids' == $this->query_vars['fields'] ) { - $this->networks = $network_ids; - return $this->networks; - } - - if ( $this->query_vars['update_network_cache'] ) { - _prime_network_caches( $network_ids ); - } - - // Fetch full network objects from the primed cache. - $_networks = array(); - foreach ( $network_ids as $network_id ) { - if ( $_network = get_network( $network_id ) ) { - $_networks[] = $_network; - } - } - - /** - * Filters the network query results. - * - * @since 4.6.0 - * - * @param array $results An array of networks. - * @param WP_Network_Query &$this Current instance of WP_Network_Query, passed by reference. - */ - $_networks = apply_filters_ref_array( 'the_networks', array( $_networks, &$this ) ); - - // Convert to WP_Network instances - $this->networks = array_map( 'get_network', $_networks ); - - return $this->networks; - } - - /** - * Used internally to get a list of network IDs matching the query vars. - * - * @since 4.6.0 - * @access protected - * - * @return int|array A single count of network IDs if a count query. An array of network IDs if a full query. - */ - protected function get_network_ids() { - global $wpdb; - - $order = $this->parse_order( $this->query_vars['order'] ); - - // Disable ORDER BY with 'none', an empty array, or boolean false. - if ( in_array( $this->query_vars['orderby'], array( 'none', array(), false ), true ) ) { - $orderby = ''; - } elseif ( ! empty( $this->query_vars['orderby'] ) ) { - $ordersby = is_array( $this->query_vars['orderby'] ) ? - $this->query_vars['orderby'] : - preg_split( '/[,\s]/', $this->query_vars['orderby'] ); - - $orderby_array = array(); - foreach ( $ordersby as $_key => $_value ) { - if ( ! $_value ) { - continue; - } - - if ( is_int( $_key ) ) { - $_orderby = $_value; - $_order = $order; - } else { - $_orderby = $_key; - $_order = $_value; - } - - $parsed = $this->parse_orderby( $_orderby ); - - if ( ! $parsed ) { - continue; - } - - if ( 'network__in' === $_orderby ) { - $orderby_array[] = $parsed; - continue; - } - - $orderby_array[] = $parsed . ' ' . $this->parse_order( $_order ); - } - - $orderby = implode( ', ', $orderby_array ); - } else { - $orderby = "$wpdb->site.id $order"; - } - - $number = absint( $this->query_vars['number'] ); - $offset = absint( $this->query_vars['offset'] ); - - if ( ! empty( $number ) ) { - if ( $offset ) { - $limits = 'LIMIT ' . $offset . ',' . $number; - } else { - $limits = 'LIMIT ' . $number; - } - } - - if ( $this->query_vars['count'] ) { - $fields = 'COUNT(*)'; - } else { - $fields = "$wpdb->site.id"; - } - - // Parse network IDs for an IN clause. - if ( ! empty( $this->query_vars['network__in'] ) ) { - $this->sql_clauses['where']['network__in'] = "$wpdb->site.id IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['network__in'] ) ) . ' )'; - } - - // Parse network IDs for a NOT IN clause. - if ( ! empty( $this->query_vars['network__not_in'] ) ) { - $this->sql_clauses['where']['network__not_in'] = "$wpdb->site.id NOT IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['network__not_in'] ) ) . ' )'; - } - - if ( ! empty( $this->query_vars['domain'] ) ) { - $this->sql_clauses['where']['domain'] = $wpdb->prepare( "$wpdb->site.domain = %s", $this->query_vars['domain'] ); - } - - // Parse network domain for an IN clause. - if ( is_array( $this->query_vars['domain__in'] ) ) { - $this->sql_clauses['where']['domain__in'] = "$wpdb->site.domain IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__in'] ) ) . "' )"; - } - - // Parse network domain for a NOT IN clause. - if ( is_array( $this->query_vars['domain__not_in'] ) ) { - $this->sql_clauses['where']['domain__not_in'] = "$wpdb->site.domain NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__not_in'] ) ) . "' )"; - } - - if ( ! empty( $this->query_vars['path'] ) ) { - $this->sql_clauses['where']['path'] = $wpdb->prepare( "$wpdb->site.path = %s", $this->query_vars['path'] ); - } - - // Parse network path for an IN clause. - if ( is_array( $this->query_vars['path__in'] ) ) { - $this->sql_clauses['where']['path__in'] = "$wpdb->site.path IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__in'] ) ) . "' )"; - } - - // Parse network path for a NOT IN clause. - if ( is_array( $this->query_vars['path__not_in'] ) ) { - $this->sql_clauses['where']['path__not_in'] = "$wpdb->site.path NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__not_in'] ) ) . "' )"; - } - - // Falsey search strings are ignored. - if ( strlen( $this->query_vars['search'] ) ) { - $this->sql_clauses['where']['search'] = $this->get_search_sql( - $this->query_vars['search'], - array( "$wpdb->site.domain", "$wpdb->site.path" ) - ); - } - - $join = ''; - - $where = implode( ' AND ', $this->sql_clauses['where'] ); - - $pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); - - /** - * Filters the network query clauses. - * - * @since 4.6.0 - * - * @param array $pieces A compacted array of network query clauses. - * @param WP_Network_Query &$this Current instance of WP_Network_Query, passed by reference. - */ - $clauses = apply_filters_ref_array( 'networks_clauses', array( compact( $pieces ), &$this ) ); - - $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; - $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; - $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; - $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; - $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; - $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; - - if ( $where ) { - $where = 'WHERE ' . $where; - } - - if ( $groupby ) { - $groupby = 'GROUP BY ' . $groupby; - } - - if ( $orderby ) { - $orderby = "ORDER BY $orderby"; - } - - $found_rows = ''; - if ( ! $this->query_vars['no_found_rows'] ) { - $found_rows = 'SQL_CALC_FOUND_ROWS'; - } - - $this->sql_clauses['select'] = "SELECT $found_rows $fields"; - $this->sql_clauses['from'] = "FROM $wpdb->site $join"; - $this->sql_clauses['groupby'] = $groupby; - $this->sql_clauses['orderby'] = $orderby; - $this->sql_clauses['limits'] = $limits; - - $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['groupby']} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}"; - - if ( $this->query_vars['count'] ) { - return intval( $wpdb->get_var( $this->request ) ); - } - - $network_ids = $wpdb->get_col( $this->request ); - - return array_map( 'intval', $network_ids ); - } - - /** - * Populates found_networks and max_num_pages properties for the current query - * if the limit clause was used. - * - * @since 4.6.0 - * @access private - * - * @global wpdb $wpdb WordPress database abstraction object. - */ - private function set_found_networks() { - global $wpdb; - - if ( $this->query_vars['number'] && ! $this->query_vars['no_found_rows'] ) { - /** - * Filters the query used to retrieve found network count. - * - * @since 4.6.0 - * - * @param string $found_networks_query SQL query. Default 'SELECT FOUND_ROWS()'. - * @param WP_Network_Query $network_query The `WP_Network_Query` instance. - */ - $found_networks_query = apply_filters( 'found_networks_query', 'SELECT FOUND_ROWS()', $this ); - - $this->found_networks = (int) $wpdb->get_var( $found_networks_query ); - } - } - - /** - * Used internally to generate an SQL string for searching across multiple columns. - * - * @since 4.6.0 - * @access protected - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $string Search string. - * @param array $columns Columns to search. - * - * @return string Search SQL. - */ - protected function get_search_sql( $string, $columns ) { - global $wpdb; - - $like = '%' . $wpdb->esc_like( $string ) . '%'; - - $searches = array(); - foreach ( $columns as $column ) { - $searches[] = $wpdb->prepare( "$column LIKE %s", $like ); - } - - return '(' . implode( ' OR ', $searches ) . ')'; - } - - /** - * Parses and sanitizes 'orderby' keys passed to the network query. - * - * @since 4.6.0 - * @access protected - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $orderby Alias for the field to order by. - * @return string|false Value to used in the ORDER clause. False otherwise. - */ - protected function parse_orderby( $orderby ) { - global $wpdb; - - $allowed_keys = array( - 'id', - 'domain', - 'path', - ); - - $parsed = false; - if ( $orderby == 'network__in' ) { - $network__in = implode( ',', array_map( 'absint', $this->query_vars['network__in'] ) ); - $parsed = "FIELD( {$wpdb->site}.id, $network__in )"; - } elseif ( $orderby == 'domain_length' || $orderby == 'path_length' ) { - $field = substr( $orderby, 0, -7 ); - $parsed = "CHAR_LENGTH($wpdb->site.$field)"; - } elseif ( in_array( $orderby, $allowed_keys ) ) { - $parsed = "$wpdb->site.$orderby"; - } - - return $parsed; - } - - /** - * Parses an 'order' query variable and cast it to 'ASC' or 'DESC' as necessary. - * - * @since 4.6.0 - * @access protected - * - * @param string $order The 'order' query variable. - * @return string The sanitized 'order' query variable. - */ - protected function parse_order( $order ) { - if ( ! is_string( $order ) || empty( $order ) ) { - return 'ASC'; - } - - if ( 'ASC' === strtoupper( $order ) ) { - return 'ASC'; - } else { - return 'DESC'; - } - } -} diff --git a/wp/wp-includes/class-wp-network.php b/wp/wp-includes/class-wp-network.php deleted file mode 100644 index 5ab29c2c..00000000 --- a/wp/wp-includes/class-wp-network.php +++ /dev/null @@ -1,410 +0,0 @@ -<?php -/** - * Network API: WP_Network class - * - * @package WordPress - * @subpackage Multisite - * @since 4.4.0 - */ - -/** - * Core class used for interacting with a multisite network. - * - * This class is used during load to populate the `$current_site` global and - * setup the current network. - * - * This class is most useful in WordPress multi-network installations where the - * ability to interact with any network of sites is required. - * - * @since 4.4.0 - * - * @property int $id - * @property int $site_id - */ -class WP_Network { - - /** - * Network ID. - * - * @since 4.4.0 - * @since 4.6.0 Converted from public to private to explicitly enable more intuitive - * access via magic methods. As part of the access change, the type was - * also changed from `string` to `int`. - * @access private - * @var int - */ - private $id; - - /** - * Domain of the network. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $domain = ''; - - /** - * Path of the network. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $path = ''; - - /** - * The ID of the network's main site. - * - * Named "blog" vs. "site" for legacy reasons. A main site is mapped to - * the network when the network is created. - * - * A numeric string, for compatibility reasons. - * - * @since 4.4.0 - * @access private - * @var string - */ - private $blog_id = '0'; - - /** - * Domain used to set cookies for this network. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $cookie_domain = ''; - - /** - * Name of this network. - * - * Named "site" vs. "network" for legacy reasons. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $site_name = ''; - - /** - * Retrieve a network from the database by its ID. - * - * @since 4.4.0 - * @access public - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $network_id The ID of the network to retrieve. - * @return WP_Network|bool The network's object if found. False if not. - */ - public static function get_instance( $network_id ) { - global $wpdb; - - $network_id = (int) $network_id; - if ( ! $network_id ) { - return false; - } - - $_network = wp_cache_get( $network_id, 'networks' ); - - if ( ! $_network ) { - $_network = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->site} WHERE id = %d LIMIT 1", $network_id ) ); - - if ( empty( $_network ) || is_wp_error( $_network ) ) { - return false; - } - - wp_cache_add( $network_id, $_network, 'networks' ); - } - - return new WP_Network( $_network ); - } - - /** - * Create a new WP_Network object. - * - * Will populate object properties from the object provided and assign other - * default properties based on that information. - * - * @since 4.4.0 - * @access public - * - * @param WP_Network|object $network A network object. - */ - public function __construct( $network ) { - foreach( get_object_vars( $network ) as $key => $value ) { - $this->$key = $value; - } - - $this->_set_site_name(); - $this->_set_cookie_domain(); - } - - /** - * Getter. - * - * Allows current multisite naming conventions when getting properties. - * - * @since 4.6.0 - * @access public - * - * @param string $key Property to get. - * @return mixed Value of the property. Null if not available. - */ - public function __get( $key ) { - switch ( $key ) { - case 'id'; - return (int) $this->id; - case 'blog_id': - return $this->blog_id; - case 'site_id': - return (int) $this->blog_id; - } - - return null; - } - - /** - * Isset-er. - * - * Allows current multisite naming conventions when checking for properties. - * - * @since 4.6.0 - * @access public - * - * @param string $key Property to check if set. - * @return bool Whether the property is set. - */ - public function __isset( $key ) { - switch ( $key ) { - case 'id': - case 'blog_id': - case 'site_id': - return true; - } - - return false; - } - - /** - * Setter. - * - * Allows current multisite naming conventions while setting properties. - * - * @since 4.6.0 - * @access public - * - * @param string $key Property to set. - * @param mixed $value Value to assign to the property. - */ - public function __set( $key, $value ) { - switch ( $key ) { - case 'id': - $this->id = (int) $value; - break; - case 'blog_id': - case 'site_id': - $this->blog_id = (string) $value; - break; - default: - $this->$key = $value; - } - } - - /** - * Set the site name assigned to the network if one has not been populated. - * - * @since 4.4.0 - * @access private - */ - private function _set_site_name() { - if ( ! empty( $this->site_name ) ) { - return; - } - - $default = ucfirst( $this->domain ); - $this->site_name = get_network_option( $this->id, 'site_name', $default ); - } - - /** - * Set the cookie domain based on the network domain if one has - * not been populated. - * - * @todo What if the domain of the network doesn't match the current site? - * - * @since 4.4.0 - * @access private - */ - private function _set_cookie_domain() { - if ( ! empty( $this->cookie_domain ) ) { - return; - } - - $this->cookie_domain = $this->domain; - if ( 'www.' === substr( $this->cookie_domain, 0, 4 ) ) { - $this->cookie_domain = substr( $this->cookie_domain, 4 ); - } - } - - /** - * Retrieve the closest matching network for a domain and path. - * - * This will not necessarily return an exact match for a domain and path. Instead, it - * breaks the domain and path into pieces that are then used to match the closest - * possibility from a query. - * - * The intent of this method is to match a network during bootstrap for a - * requested site address. - * - * @since 4.4.0 - * @access public - * @static - * - * @param string $domain Domain to check. - * @param string $path Path to check. - * @param int|null $segments Path segments to use. Defaults to null, or the full path. - * @return WP_Network|bool Network object if successful. False when no network is found. - */ - public static function get_by_path( $domain = '', $path = '', $segments = null ) { - global $wpdb; - - $domains = array( $domain ); - $pieces = explode( '.', $domain ); - - /* - * It's possible one domain to search is 'com', but it might as well - * be 'localhost' or some other locally mapped domain. - */ - while ( array_shift( $pieces ) ) { - if ( ! empty( $pieces ) ) { - $domains[] = implode( '.', $pieces ); - } - } - - /* - * If we've gotten to this function during normal execution, there is - * more than one network installed. At this point, who knows how many - * we have. Attempt to optimize for the situation where networks are - * only domains, thus meaning paths never need to be considered. - * - * This is a very basic optimization; anything further could have - * drawbacks depending on the setup, so this is best done per-install. - */ - $using_paths = true; - if ( wp_using_ext_object_cache() ) { - $using_paths = wp_cache_get( 'networks_have_paths', 'site-options' ); - if ( false === $using_paths ) { - $using_paths = (int) $wpdb->get_var( "SELECT id FROM {$wpdb->site} WHERE path <> '/' LIMIT 1" ); - wp_cache_add( 'networks_have_paths', $using_paths, 'site-options' ); - } - } - - $paths = array(); - if ( $using_paths ) { - $path_segments = array_filter( explode( '/', trim( $path, '/' ) ) ); - - /** - * Filters the number of path segments to consider when searching for a site. - * - * @since 3.9.0 - * - * @param int|null $segments The number of path segments to consider. WordPress by default looks at - * one path segment. The function default of null only makes sense when you - * know the requested path should match a network. - * @param string $domain The requested domain. - * @param string $path The requested path, in full. - */ - $segments = apply_filters( 'network_by_path_segments_count', $segments, $domain, $path ); - - if ( ( null !== $segments ) && count( $path_segments ) > $segments ) { - $path_segments = array_slice( $path_segments, 0, $segments ); - } - - while ( count( $path_segments ) ) { - $paths[] = '/' . implode( '/', $path_segments ) . '/'; - array_pop( $path_segments ); - } - - $paths[] = '/'; - } - - /** - * Determine a network by its domain and path. - * - * This allows one to short-circuit the default logic, perhaps by - * replacing it with a routine that is more optimal for your setup. - * - * Return null to avoid the short-circuit. Return false if no network - * can be found at the requested domain and path. Otherwise, return - * an object from wp_get_network(). - * - * @since 3.9.0 - * - * @param null|bool|object $network Network value to return by path. - * @param string $domain The requested domain. - * @param string $path The requested path, in full. - * @param int|null $segments The suggested number of paths to consult. - * Default null, meaning the entire path was to be consulted. - * @param array $paths The paths to search for, based on $path and $segments. - */ - $pre = apply_filters( 'pre_get_network_by_path', null, $domain, $path, $segments, $paths ); - if ( null !== $pre ) { - return $pre; - } - - // @todo Consider additional optimization routes, perhaps as an opt-in for plugins. - // We already have paths covered. What about how far domains should be drilled down (including www)? - - $search_domains = "'" . implode( "', '", $wpdb->_escape( $domains ) ) . "'"; - - if ( ! $using_paths ) { - $network = $wpdb->get_row( " - SELECT * FROM {$wpdb->site} - WHERE domain IN ({$search_domains}) - ORDER BY CHAR_LENGTH(domain) - DESC LIMIT 1 - " ); - - if ( ! empty( $network ) && ! is_wp_error( $network ) ) { - return new WP_Network( $network ); - } - - return false; - - } else { - $search_paths = "'" . implode( "', '", $wpdb->_escape( $paths ) ) . "'"; - $networks = $wpdb->get_results( " - SELECT * FROM {$wpdb->site} - WHERE domain IN ({$search_domains}) - AND path IN ({$search_paths}) - ORDER BY CHAR_LENGTH(domain) DESC, CHAR_LENGTH(path) DESC - " ); - } - - /* - * Domains are sorted by length of domain, then by length of path. - * The domain must match for the path to be considered. Otherwise, - * a network with the path of / will suffice. - */ - $found = false; - foreach ( $networks as $network ) { - if ( ( $network->domain === $domain ) || ( "www.{$network->domain}" === $domain ) ) { - if ( in_array( $network->path, $paths, true ) ) { - $found = true; - break; - } - } - if ( $network->path === '/' ) { - $found = true; - break; - } - } - - if ( true === $found ) { - return new WP_Network( $network ); - } - - return false; - } -} diff --git a/wp/wp-includes/class-wp-oembed-controller.php b/wp/wp-includes/class-wp-oembed-controller.php deleted file mode 100644 index 13fed836..00000000 --- a/wp/wp-includes/class-wp-oembed-controller.php +++ /dev/null @@ -1,89 +0,0 @@ -<?php -/** - * WP_oEmbed_Controller class, used to provide an oEmbed endpoint. - * - * @package WordPress - * @subpackage Embeds - * @since 4.4.0 - */ - -/** - * oEmbed API endpoint controller. - * - * Registers the API route and delivers the response data. - * The output format (XML or JSON) is handled by the REST API. - * - * @since 4.4.0 - */ -final class WP_oEmbed_Controller { - /** - * Register the oEmbed REST API route. - * - * @since 4.4.0 - * @access public - */ - public function register_routes() { - /** - * Filters the maxwidth oEmbed parameter. - * - * @since 4.4.0 - * - * @param int $maxwidth Maximum allowed width. Default 600. - */ - $maxwidth = apply_filters( 'oembed_default_width', 600 ); - - register_rest_route( 'oembed/1.0', '/embed', array( - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_item' ), - 'args' => array( - 'url' => array( - 'required' => true, - 'sanitize_callback' => 'esc_url_raw', - ), - 'format' => array( - 'default' => 'json', - 'sanitize_callback' => 'wp_oembed_ensure_format', - ), - 'maxwidth' => array( - 'default' => $maxwidth, - 'sanitize_callback' => 'absint', - ), - ), - ), - ) ); - } - - /** - * Callback for the API endpoint. - * - * Returns the JSON object for the post. - * - * @since 4.4.0 - * @access public - * - * @param WP_REST_Request $request Full data about the request. - * @return WP_Error|array oEmbed response data or WP_Error on failure. - */ - public function get_item( $request ) { - $post_id = url_to_postid( $request['url'] ); - - /** - * Filters the determined post ID. - * - * @since 4.4.0 - * - * @param int $post_id The post ID. - * @param string $url The requested URL. - */ - $post_id = apply_filters( 'oembed_request_post_id', $post_id, $request['url'] ); - - $data = get_oembed_response_data( $post_id, $request['maxwidth'] ); - - if ( ! $data ) { - return new WP_Error( 'oembed_invalid_url', get_status_header_desc( 404 ), array( 'status' => 404 ) ); - } - - return $data; - } -} diff --git a/wp/wp-includes/class-wp-post-type.php b/wp/wp-includes/class-wp-post-type.php deleted file mode 100644 index 69b9834d..00000000 --- a/wp/wp-includes/class-wp-post-type.php +++ /dev/null @@ -1,721 +0,0 @@ -<?php -/** - * Post API: WP_Post_Type class - * - * @package WordPress - * @subpackage Post - * @since 4.6.0 - */ - -/** - * Core class used for interacting with post types. - * - * @since 4.6.0 - * - * @see register_post_type() - */ -final class WP_Post_Type { - /** - * Post type key. - * - * @since 4.6.0 - * @access public - * @var string $name - */ - public $name; - - /** - * Name of the post type shown in the menu. Usually plural. - * - * @since 4.6.0 - * @access public - * @var string $label - */ - public $label; - - /** - * Labels object for this post type. - * - * If not set, post labels are inherited for non-hierarchical types - * and page labels for hierarchical ones. - * - * @see get_post_type_labels() - * - * @since 4.6.0 - * @access public - * @var object $labels - */ - public $labels; - - /** - * A short descriptive summary of what the post type is. - * - * Default empty. - * - * @since 4.6.0 - * @access public - * @var string $description - */ - public $description = ''; - - /** - * Whether a post type is intended for use publicly either via the admin interface or by front-end users. - * - * While the default settings of $exclude_from_search, $publicly_queryable, $show_ui, and $show_in_nav_menus - * are inherited from public, each does not rely on this relationship and controls a very specific intention. - * - * Default false. - * - * @since 4.6.0 - * @access public - * @var bool $public - */ - public $public = false; - - /** - * Whether the post type is hierarchical (e.g. page). - * - * Default false. - * - * @since 4.6.0 - * @access public - * @var bool $hierarchical - */ - public $hierarchical = false; - - /** - * Whether to exclude posts with this post type from front end search - * results. - * - * Default is the opposite value of $public. - * - * @since 4.6.0 - * @access public - * @var bool $exclude_from_search - */ - public $exclude_from_search = null; - - /** - * Whether queries can be performed on the front end for the post type as part of `parse_request()`. - * - * Endpoints would include: - * - `?post_type={post_type_key}` - * - `?{post_type_key}={single_post_slug}` - * - `?{post_type_query_var}={single_post_slug}` - * - * Default is the value of $public. - * - * @since 4.6.0 - * @access public - * @var bool $publicly_queryable - */ - public $publicly_queryable = null; - - /** - * Whether to generate and allow a UI for managing this post type in the admin. - * - * Default is the value of $public. - * - * @since 4.6.0 - * @access public - * @var bool $show_ui - */ - public $show_ui = null; - - /** - * Where to show the post type in the admin menu. - * - * To work, $show_ui must be true. If true, the post type is shown in its own top level menu. If false, no menu is - * shown. If a string of an existing top level menu (eg. 'tools.php' or 'edit.php?post_type=page'), the post type - * will be placed as a sub-menu of that. - * - * Default is the value of $show_ui. - * - * @since 4.6.0 - * @access public - * @var bool $show_in_menu - */ - public $show_in_menu = null; - - /** - * Makes this post type available for selection in navigation menus. - * - * Default is the value $public. - * - * @since 4.6.0 - * @access public - * @var bool $show_in_nav_menus - */ - public $show_in_nav_menus = null; - - /** - * Makes this post type available via the admin bar. - * - * Default is the value of $show_in_menu. - * - * @since 4.6.0 - * @access public - * @var bool $show_in_admin_bar - */ - public $show_in_admin_bar = null; - - /** - * The position in the menu order the post type should appear. - * - * To work, $show_in_menu must be true. Default null (at the bottom). - * - * @since 4.6.0 - * @access public - * @var int $menu_position - */ - public $menu_position = null; - - /** - * The URL to the icon to be used for this menu. - * - * Pass a base64-encoded SVG using a data URI, which will be colored to match the color scheme. - * This should begin with 'data:image/svg+xml;base64,'. Pass the name of a Dashicons helper class - * to use a font icon, e.g. 'dashicons-chart-pie'. Pass 'none' to leave div.wp-menu-image empty - * so an icon can be added via CSS. - * - * Defaults to use the posts icon. - * - * @since 4.6.0 - * @access public - * @var string $menu_icon - */ - public $menu_icon = null; - - /** - * The string to use to build the read, edit, and delete capabilities. - * - * May be passed as an array to allow for alternative plurals when using - * this argument as a base to construct the capabilities, e.g. - * array( 'story', 'stories' ). Default 'post'. - * - * @since 4.6.0 - * @access public - * @var string $capability_type - */ - public $capability_type = 'post'; - - /** - * Whether to use the internal default meta capability handling. - * - * Default false. - * - * @since 4.6.0 - * @access public - * @var bool $map_meta_cap - */ - public $map_meta_cap = false; - - /** - * Provide a callback function that sets up the meta boxes for the edit form. - * - * Do `remove_meta_box()` and `add_meta_box()` calls in the callback. Default null. - * - * @since 4.6.0 - * @access public - * @var string $register_meta_box_cb - */ - public $register_meta_box_cb = null; - - /** - * An array of taxonomy identifiers that will be registered for the post type. - * - * Taxonomies can be registered later with `register_taxonomy()` or `register_taxonomy_for_object_type()`. - * - * Default empty array. - * - * @since 4.6.0 - * @access public - * @var array $taxonomies - */ - public $taxonomies = array(); - - /** - * Whether there should be post type archives, or if a string, the archive slug to use. - * - * Will generate the proper rewrite rules if $rewrite is enabled. Default false. - * - * @since 4.6.0 - * @access public - * @var bool|string $has_archive - */ - public $has_archive = false; - - /** - * Sets the query_var key for this post type. - * - * Defaults to $post_type key. If false, a post type cannot be loaded at `?{query_var}={post_slug}`. - * If specified as a string, the query `?{query_var_string}={post_slug}` will be valid. - * - * @since 4.6.0 - * @access public - * @var string|bool $query_var - */ - public $query_var; - - /** - * Whether to allow this post type to be exported. - * - * Default true. - * - * @since 4.6.0 - * @access public - * @var bool $can_export - */ - public $can_export = true; - - /** - * Whether to delete posts of this type when deleting a user. - * - * If true, posts of this type belonging to the user will be moved to trash when then user is deleted. - * If false, posts of this type belonging to the user will *not* be trashed or deleted. - * If not set (the default), posts are trashed if post_type_supports( 'author' ). - * Otherwise posts are not trashed or deleted. Default null. - * - * @since 4.6.0 - * @access public - * @var bool $delete_with_user - */ - public $delete_with_user = null; - - /** - * Whether this post type is a native or "built-in" post_type. - * - * Default false. - * - * @since 4.6.0 - * @access public - * @var bool $_builtin - */ - public $_builtin = false; - - /** - * URL segment to use for edit link of this post type. - * - * Default 'post.php?post=%d'. - * - * @since 4.6.0 - * @access public - * @var string $_edit_link - */ - public $_edit_link = 'post.php?post=%d'; - - /** - * Post type capabilities. - * - * @since 4.6.0 - * @access public - * @var object $cap - */ - public $cap; - - /** - * Triggers the handling of rewrites for this post type. - * - * Defaults to true, using $post_type as slug. - * - * @since 4.6.0 - * @access public - * @var array|false $rewrite - */ - public $rewrite; - - /** - * The features supported by the post type. - * - * @since 4.6.0 - * @access public - * @var array|bool $supports - */ - public $supports; - - /** - * Whether this post type should appear in the REST API. - * - * Default false. If true, standard endpoints will be registered with - * respect to $rest_base and $rest_controller_class. - * - * @since 4.7.4 - * @access public - * @var bool $show_in_rest - */ - public $show_in_rest; - - /** - * The base path for this post type's REST API endpoints. - * - * @since 4.7.4 - * @access public - * @var string|bool $rest_base - */ - public $rest_base; - - /** - * The controller for this post type's REST API endpoints. - * - * Custom controllers must extend WP_REST_Controller. - * - * @since 4.7.4 - * @access public - * @var string|bool $rest_controller_class - */ - public $rest_controller_class; - - /** - * Constructor. - * - * Will populate object properties from the provided arguments and assign other - * default properties based on that information. - * - * @since 4.6.0 - * @access public - * - * @see register_post_type() - * - * @param string $post_type Post type key. - * @param array|string $args Optional. Array or string of arguments for registering a post type. - * Default empty array. - */ - public function __construct( $post_type, $args = array() ) { - $this->name = $post_type; - - $this->set_props( $args ); - } - - /** - * Sets post type properties. - * - * @since 4.6.0 - * @access public - * - * @param array|string $args Array or string of arguments for registering a post type. - */ - public function set_props( $args ) { - $args = wp_parse_args( $args ); - - /** - * Filters the arguments for registering a post type. - * - * @since 4.4.0 - * - * @param array $args Array of arguments for registering a post type. - * @param string $post_type Post type key. - */ - $args = apply_filters( 'register_post_type_args', $args, $this->name ); - - $has_edit_link = ! empty( $args['_edit_link'] ); - - // Args prefixed with an underscore are reserved for internal use. - $defaults = array( - 'labels' => array(), - 'description' => '', - 'public' => false, - 'hierarchical' => false, - 'exclude_from_search' => null, - 'publicly_queryable' => null, - 'show_ui' => null, - 'show_in_menu' => null, - 'show_in_nav_menus' => null, - 'show_in_admin_bar' => null, - 'menu_position' => null, - 'menu_icon' => null, - 'capability_type' => 'post', - 'capabilities' => array(), - 'map_meta_cap' => null, - 'supports' => array(), - 'register_meta_box_cb' => null, - 'taxonomies' => array(), - 'has_archive' => false, - 'rewrite' => true, - 'query_var' => true, - 'can_export' => true, - 'delete_with_user' => null, - 'show_in_rest' => false, - 'rest_base' => false, - 'rest_controller_class' => false, - '_builtin' => false, - '_edit_link' => 'post.php?post=%d', - ); - - $args = array_merge( $defaults, $args ); - - $args['name'] = $this->name; - - // If not set, default to the setting for public. - if ( null === $args['publicly_queryable'] ) { - $args['publicly_queryable'] = $args['public']; - } - - // If not set, default to the setting for public. - if ( null === $args['show_ui'] ) { - $args['show_ui'] = $args['public']; - } - - // If not set, default to the setting for show_ui. - if ( null === $args['show_in_menu'] || ! $args['show_ui'] ) { - $args['show_in_menu'] = $args['show_ui']; - } - - // If not set, default to the whether the full UI is shown. - if ( null === $args['show_in_admin_bar'] ) { - $args['show_in_admin_bar'] = (bool) $args['show_in_menu']; - } - - // If not set, default to the setting for public. - if ( null === $args['show_in_nav_menus'] ) { - $args['show_in_nav_menus'] = $args['public']; - } - - // If not set, default to true if not public, false if public. - if ( null === $args['exclude_from_search'] ) { - $args['exclude_from_search'] = ! $args['public']; - } - - // Back compat with quirky handling in version 3.0. #14122. - if ( empty( $args['capabilities'] ) && null === $args['map_meta_cap'] && in_array( $args['capability_type'], array( 'post', 'page' ) ) ) { - $args['map_meta_cap'] = true; - } - - // If not set, default to false. - if ( null === $args['map_meta_cap'] ) { - $args['map_meta_cap'] = false; - } - - // If there's no specified edit link and no UI, remove the edit link. - if ( ! $args['show_ui'] && ! $has_edit_link ) { - $args['_edit_link'] = ''; - } - - $this->cap = get_post_type_capabilities( (object) $args ); - unset( $args['capabilities'] ); - - if ( is_array( $args['capability_type'] ) ) { - $args['capability_type'] = $args['capability_type'][0]; - } - - if ( false !== $args['query_var'] ) { - if ( true === $args['query_var'] ) { - $args['query_var'] = $this->name; - } else { - $args['query_var'] = sanitize_title_with_dashes( $args['query_var'] ); - } - } - - if ( false !== $args['rewrite'] && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) { - if ( ! is_array( $args['rewrite'] ) ) { - $args['rewrite'] = array(); - } - if ( empty( $args['rewrite']['slug'] ) ) { - $args['rewrite']['slug'] = $this->name; - } - if ( ! isset( $args['rewrite']['with_front'] ) ) { - $args['rewrite']['with_front'] = true; - } - if ( ! isset( $args['rewrite']['pages'] ) ) { - $args['rewrite']['pages'] = true; - } - if ( ! isset( $args['rewrite']['feeds'] ) || ! $args['has_archive'] ) { - $args['rewrite']['feeds'] = (bool) $args['has_archive']; - } - if ( ! isset( $args['rewrite']['ep_mask'] ) ) { - if ( isset( $args['permalink_epmask'] ) ) { - $args['rewrite']['ep_mask'] = $args['permalink_epmask']; - } else { - $args['rewrite']['ep_mask'] = EP_PERMALINK; - } - } - } - - foreach ( $args as $property_name => $property_value ) { - $this->$property_name = $property_value; - } - - $this->labels = get_post_type_labels( $this ); - $this->label = $this->labels->name; - } - - /** - * Sets the features support for the post type. - * - * @since 4.6.0 - * @access public - */ - public function add_supports() { - if ( ! empty( $this->supports ) ) { - add_post_type_support( $this->name, $this->supports ); - unset( $this->supports ); - } elseif ( false !== $this->supports ) { - // Add default features. - add_post_type_support( $this->name, array( 'title', 'editor' ) ); - } - } - - /** - * Adds the necessary rewrite rules for the post type. - * - * @since 4.6.0 - * @access public - * - * @global WP_Rewrite $wp_rewrite WordPress Rewrite Component. - * @global WP $wp Current WordPress environment instance. - */ - public function add_rewrite_rules() { - global $wp_rewrite, $wp; - - if ( false !== $this->query_var && $wp && is_post_type_viewable( $this ) ) { - $wp->add_query_var( $this->query_var ); - } - - if ( false !== $this->rewrite && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) { - if ( $this->hierarchical ) { - add_rewrite_tag( "%$this->name%", '(.+?)', $this->query_var ? "{$this->query_var}=" : "post_type=$this->name&pagename=" ); - } else { - add_rewrite_tag( "%$this->name%", '([^/]+)', $this->query_var ? "{$this->query_var}=" : "post_type=$this->name&name=" ); - } - - if ( $this->has_archive ) { - $archive_slug = true === $this->has_archive ? $this->rewrite['slug'] : $this->has_archive; - if ( $this->rewrite['with_front'] ) { - $archive_slug = substr( $wp_rewrite->front, 1 ) . $archive_slug; - } else { - $archive_slug = $wp_rewrite->root . $archive_slug; - } - - add_rewrite_rule( "{$archive_slug}/?$", "index.php?post_type=$this->name", 'top' ); - if ( $this->rewrite['feeds'] && $wp_rewrite->feeds ) { - $feeds = '(' . trim( implode( '|', $wp_rewrite->feeds ) ) . ')'; - add_rewrite_rule( "{$archive_slug}/feed/$feeds/?$", "index.php?post_type=$this->name" . '&feed=$matches[1]', 'top' ); - add_rewrite_rule( "{$archive_slug}/$feeds/?$", "index.php?post_type=$this->name" . '&feed=$matches[1]', 'top' ); - } - if ( $this->rewrite['pages'] ) { - add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$this->name" . '&paged=$matches[1]', 'top' ); - } - } - - $permastruct_args = $this->rewrite; - $permastruct_args['feed'] = $permastruct_args['feeds']; - add_permastruct( $this->name, "{$this->rewrite['slug']}/%$this->name%", $permastruct_args ); - } - } - - /** - * Registers the post type meta box if a custom callback was specified. - * - * @since 4.6.0 - * @access public - */ - public function register_meta_boxes() { - if ( $this->register_meta_box_cb ) { - add_action( 'add_meta_boxes_' . $this->name, $this->register_meta_box_cb, 10, 1 ); - } - } - - /** - * Adds the future post hook action for the post type. - * - * @since 4.6.0 - * @access public - */ - public function add_hooks() { - add_action( 'future_' . $this->name, '_future_post_hook', 5, 2 ); - } - - /** - * Registers the taxonomies for the post type. - * - * @since 4.6.0 - * @access public - */ - public function register_taxonomies() { - foreach ( $this->taxonomies as $taxonomy ) { - register_taxonomy_for_object_type( $taxonomy, $this->name ); - } - } - - /** - * Removes the features support for the post type. - * - * @since 4.6.0 - * @access public - * - * @global array $_wp_post_type_features Post type features. - */ - public function remove_supports() { - global $_wp_post_type_features; - - unset( $_wp_post_type_features[ $this->name ] ); - } - - /** - * Removes any rewrite rules, permastructs, and rules for the post type. - * - * @since 4.6.0 - * @access public - * - * @global WP_Rewrite $wp_rewrite WordPress rewrite component. - * @global WP $wp Current WordPress environment instance. - * @global array $post_type_meta_caps Used to remove meta capabilities. - */ - public function remove_rewrite_rules() { - global $wp, $wp_rewrite, $post_type_meta_caps; - - // Remove query var. - if ( false !== $this->query_var ) { - $wp->remove_query_var( $this->query_var ); - } - - // Remove any rewrite rules, permastructs, and rules. - if ( false !== $this->rewrite ) { - remove_rewrite_tag( "%$this->name%" ); - remove_permastruct( $this->name ); - foreach ( $wp_rewrite->extra_rules_top as $regex => $query ) { - if ( false !== strpos( $query, "index.php?post_type=$this->name" ) ) { - unset( $wp_rewrite->extra_rules_top[ $regex ] ); - } - } - } - - // Remove registered custom meta capabilities. - foreach ( $this->cap as $cap ) { - unset( $post_type_meta_caps[ $cap ] ); - } - } - - /** - * Unregisters the post type meta box if a custom callback was specified. - * - * @since 4.6.0 - * @access public - */ - public function unregister_meta_boxes() { - if ( $this->register_meta_box_cb ) { - remove_action( 'add_meta_boxes_' . $this->name, $this->register_meta_box_cb, 10 ); - } - } - - /** - * Removes the post type from all taxonomies. - * - * @since 4.6.0 - * @access public - */ - public function unregister_taxonomies() { - foreach ( get_object_taxonomies( $this->name ) as $taxonomy ) { - unregister_taxonomy_for_object_type( $taxonomy, $this->name ); - } - } - - /** - * Removes the future post hook action for the post type. - * - * @since 4.6.0 - * @access public - */ - public function remove_hooks() { - remove_action( 'future_' . $this->name, '_future_post_hook', 5 ); - } -} diff --git a/wp/wp-includes/class-wp-post.php b/wp/wp-includes/class-wp-post.php deleted file mode 100644 index edaf149a..00000000 --- a/wp/wp-includes/class-wp-post.php +++ /dev/null @@ -1,341 +0,0 @@ -<?php -/** - * Post API: WP_Post class - * - * @package WordPress - * @subpackage Post - * @since 4.4.0 - */ - -/** - * Core class used to implement the WP_Post object. - * - * @since 3.5.0 - * - * @property string $page_template - * - * @property-read array $ancestors - * @property-read int $post_category - * @property-read string $tag_input - * - */ -final class WP_Post { - - /** - * Post ID. - * - * @var int - */ - public $ID; - - /** - * ID of post author. - * - * A numeric string, for compatibility reasons. - * - * @var string - */ - public $post_author = 0; - - /** - * The post's local publication time. - * - * @var string - */ - public $post_date = '0000-00-00 00:00:00'; - - /** - * The post's GMT publication time. - * - * @var string - */ - public $post_date_gmt = '0000-00-00 00:00:00'; - - /** - * The post's content. - * - * @var string - */ - public $post_content = ''; - - /** - * The post's title. - * - * @var string - */ - public $post_title = ''; - - /** - * The post's excerpt. - * - * @var string - */ - public $post_excerpt = ''; - - /** - * The post's status. - * - * @var string - */ - public $post_status = 'publish'; - - /** - * Whether comments are allowed. - * - * @var string - */ - public $comment_status = 'open'; - - /** - * Whether pings are allowed. - * - * @var string - */ - public $ping_status = 'open'; - - /** - * The post's password in plain text. - * - * @var string - */ - public $post_password = ''; - - /** - * The post's slug. - * - * @var string - */ - public $post_name = ''; - - /** - * URLs queued to be pinged. - * - * @var string - */ - public $to_ping = ''; - - /** - * URLs that have been pinged. - * - * @var string - */ - public $pinged = ''; - - /** - * The post's local modified time. - * - * @var string - */ - public $post_modified = '0000-00-00 00:00:00'; - - /** - * The post's GMT modified time. - * - * @var string - */ - public $post_modified_gmt = '0000-00-00 00:00:00'; - - /** - * A utility DB field for post content. - * - * - * @var string - */ - public $post_content_filtered = ''; - - /** - * ID of a post's parent post. - * - * @var int - */ - public $post_parent = 0; - - /** - * The unique identifier for a post, not necessarily a URL, used as the feed GUID. - * - * @var string - */ - public $guid = ''; - - /** - * A field used for ordering posts. - * - * @var int - */ - public $menu_order = 0; - - /** - * The post's type, like post or page. - * - * @var string - */ - public $post_type = 'post'; - - /** - * An attachment's mime type. - * - * @var string - */ - public $post_mime_type = ''; - - /** - * Cached comment count. - * - * A numeric string, for compatibility reasons. - * - * @var string - */ - public $comment_count = 0; - - /** - * Stores the post object's sanitization level. - * - * Does not correspond to a DB field. - * - * @var string - */ - public $filter; - - /** - * Retrieve WP_Post instance. - * - * @static - * @access public - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $post_id Post ID. - * @return WP_Post|false Post object, false otherwise. - */ - public static function get_instance( $post_id ) { - global $wpdb; - - $post_id = (int) $post_id; - if ( ! $post_id ) { - return false; - } - - $_post = wp_cache_get( $post_id, 'posts' ); - - if ( ! $_post ) { - $_post = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = %d LIMIT 1", $post_id ) ); - - if ( ! $_post ) - return false; - - $_post = sanitize_post( $_post, 'raw' ); - wp_cache_add( $_post->ID, $_post, 'posts' ); - } elseif ( empty( $_post->filter ) ) { - $_post = sanitize_post( $_post, 'raw' ); - } - - return new WP_Post( $_post ); - } - - /** - * Constructor. - * - * @param WP_Post|object $post Post object. - */ - public function __construct( $post ) { - foreach ( get_object_vars( $post ) as $key => $value ) - $this->$key = $value; - } - - /** - * Isset-er. - * - * @param string $key Property to check if set. - * @return bool - */ - public function __isset( $key ) { - if ( 'ancestors' == $key ) - return true; - - if ( 'page_template' == $key ) - return true; - - if ( 'post_category' == $key ) - return true; - - if ( 'tags_input' == $key ) - return true; - - return metadata_exists( 'post', $this->ID, $key ); - } - - /** - * Getter. - * - * @param string $key Key to get. - * @return mixed - */ - public function __get( $key ) { - if ( 'page_template' == $key && $this->__isset( $key ) ) { - return get_post_meta( $this->ID, '_wp_page_template', true ); - } - - if ( 'post_category' == $key ) { - if ( is_object_in_taxonomy( $this->post_type, 'category' ) ) - $terms = get_the_terms( $this, 'category' ); - - if ( empty( $terms ) ) - return array(); - - return wp_list_pluck( $terms, 'term_id' ); - } - - if ( 'tags_input' == $key ) { - if ( is_object_in_taxonomy( $this->post_type, 'post_tag' ) ) - $terms = get_the_terms( $this, 'post_tag' ); - - if ( empty( $terms ) ) - return array(); - - return wp_list_pluck( $terms, 'name' ); - } - - // Rest of the values need filtering. - if ( 'ancestors' == $key ) - $value = get_post_ancestors( $this ); - else - $value = get_post_meta( $this->ID, $key, true ); - - if ( $this->filter ) - $value = sanitize_post_field( $key, $value, $this->ID, $this->filter ); - - return $value; - } - - /** - * {@Missing Summary} - * - * @param string $filter Filter. - * @return self|array|bool|object|WP_Post - */ - public function filter( $filter ) { - if ( $this->filter == $filter ) - return $this; - - if ( $filter == 'raw' ) - return self::get_instance( $this->ID ); - - return sanitize_post( $this, $filter ); - } - - /** - * Convert object to array. - * - * @return array Object as array. - */ - public function to_array() { - $post = get_object_vars( $this ); - - foreach ( array( 'ancestors', 'page_template', 'post_category', 'tags_input' ) as $key ) { - if ( $this->__isset( $key ) ) - $post[ $key ] = $this->__get( $key ); - } - - return $post; - } -} diff --git a/wp/wp-includes/class-wp-query.php b/wp/wp-includes/class-wp-query.php deleted file mode 100644 index c0de352c..00000000 --- a/wp/wp-includes/class-wp-query.php +++ /dev/null @@ -1,4107 +0,0 @@ -<?php -/** - * Query API: WP_Query class - * - * @package WordPress - * @subpackage Query - * @since 4.7.0 - */ - -/** - * The WordPress Query class. - * - * @link https://codex.wordpress.org/Function_Reference/WP_Query Codex page. - * - * @since 1.5.0 - * @since 4.5.0 Removed the `$comments_popup` property. - */ -class WP_Query { - - /** - * Query vars set by the user - * - * @since 1.5.0 - * @access public - * @var array - */ - public $query; - - /** - * Query vars, after parsing - * - * @since 1.5.0 - * @access public - * @var array - */ - public $query_vars = array(); - - /** - * Taxonomy query, as passed to get_tax_sql() - * - * @since 3.1.0 - * @access public - * @var object WP_Tax_Query - */ - public $tax_query; - - /** - * Metadata query container - * - * @since 3.2.0 - * @access public - * @var object WP_Meta_Query - */ - public $meta_query = false; - - /** - * Date query container - * - * @since 3.7.0 - * @access public - * @var object WP_Date_Query - */ - public $date_query = false; - - /** - * Holds the data for a single object that is queried. - * - * Holds the contents of a post, page, category, attachment. - * - * @since 1.5.0 - * @access public - * @var object|array - */ - public $queried_object; - - /** - * The ID of the queried object. - * - * @since 1.5.0 - * @access public - * @var int - */ - public $queried_object_id; - - /** - * Get post database query. - * - * @since 2.0.1 - * @access public - * @var string - */ - public $request; - - /** - * List of posts. - * - * @since 1.5.0 - * @access public - * @var array - */ - public $posts; - - /** - * The amount of posts for the current query. - * - * @since 1.5.0 - * @access public - * @var int - */ - public $post_count = 0; - - /** - * Index of the current item in the loop. - * - * @since 1.5.0 - * @access public - * @var int - */ - public $current_post = -1; - - /** - * Whether the loop has started and the caller is in the loop. - * - * @since 2.0.0 - * @access public - * @var bool - */ - public $in_the_loop = false; - - /** - * The current post. - * - * @since 1.5.0 - * @access public - * @var WP_Post - */ - public $post; - - /** - * The list of comments for current post. - * - * @since 2.2.0 - * @access public - * @var array - */ - public $comments; - - /** - * The amount of comments for the posts. - * - * @since 2.2.0 - * @access public - * @var int - */ - public $comment_count = 0; - - /** - * The index of the comment in the comment loop. - * - * @since 2.2.0 - * @access public - * @var int - */ - public $current_comment = -1; - - /** - * Current comment ID. - * - * @since 2.2.0 - * @access public - * @var int - */ - public $comment; - - /** - * The amount of found posts for the current query. - * - * If limit clause was not used, equals $post_count. - * - * @since 2.1.0 - * @access public - * @var int - */ - public $found_posts = 0; - - /** - * The amount of pages. - * - * @since 2.1.0 - * @access public - * @var int - */ - public $max_num_pages = 0; - - /** - * The amount of comment pages. - * - * @since 2.7.0 - * @access public - * @var int - */ - public $max_num_comment_pages = 0; - - /** - * Set if query is single post. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_single = false; - - /** - * Set if query is preview of blog. - * - * @since 2.0.0 - * @access public - * @var bool - */ - public $is_preview = false; - - /** - * Set if query returns a page. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_page = false; - - /** - * Set if query is an archive list. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_archive = false; - - /** - * Set if query is part of a date. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_date = false; - - /** - * Set if query contains a year. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_year = false; - - /** - * Set if query contains a month. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_month = false; - - /** - * Set if query contains a day. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_day = false; - - /** - * Set if query contains time. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_time = false; - - /** - * Set if query contains an author. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_author = false; - - /** - * Set if query contains category. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_category = false; - - /** - * Set if query contains tag. - * - * @since 2.3.0 - * @access public - * @var bool - */ - public $is_tag = false; - - /** - * Set if query contains taxonomy. - * - * @since 2.5.0 - * @access public - * @var bool - */ - public $is_tax = false; - - /** - * Set if query was part of a search result. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_search = false; - - /** - * Set if query is feed display. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_feed = false; - - /** - * Set if query is comment feed display. - * - * @since 2.2.0 - * @access public - * @var bool - */ - public $is_comment_feed = false; - - /** - * Set if query is trackback. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_trackback = false; - - /** - * Set if query is blog homepage. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_home = false; - - /** - * Set if query couldn't found anything. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_404 = false; - - /** - * Set if query is embed. - * - * @since 4.4.0 - * @access public - * @var bool - */ - public $is_embed = false; - - /** - * Set if query is paged - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_paged = false; - - /** - * Set if query is part of administration page. - * - * @since 1.5.0 - * @access public - * @var bool - */ - public $is_admin = false; - - /** - * Set if query is an attachment. - * - * @since 2.0.0 - * @access public - * @var bool - */ - public $is_attachment = false; - - /** - * Set if is single, is a page, or is an attachment. - * - * @since 2.1.0 - * @access public - * @var bool - */ - public $is_singular = false; - - /** - * Set if query is for robots. - * - * @since 2.1.0 - * @access public - * @var bool - */ - public $is_robots = false; - - /** - * Set if query contains posts. - * - * Basically, the homepage if the option isn't set for the static homepage. - * - * @since 2.1.0 - * @access public - * @var bool - */ - public $is_posts_page = false; - - /** - * Set if query is for a post type archive. - * - * @since 3.1.0 - * @access public - * @var bool - */ - public $is_post_type_archive = false; - - /** - * Stores the ->query_vars state like md5(serialize( $this->query_vars ) ) so we know - * whether we have to re-parse because something has changed - * - * @since 3.1.0 - * @access private - * @var bool|string - */ - private $query_vars_hash = false; - - /** - * Whether query vars have changed since the initial parse_query() call. Used to catch modifications to query vars made - * via pre_get_posts hooks. - * - * @since 3.1.1 - * @access private - */ - private $query_vars_changed = true; - - /** - * Set if post thumbnails are cached - * - * @since 3.2.0 - * @access public - * @var bool - */ - public $thumbnails_cached = false; - - /** - * Cached list of search stopwords. - * - * @since 3.7.0 - * @var array - */ - private $stopwords; - - private $compat_fields = array( 'query_vars_hash', 'query_vars_changed' ); - - private $compat_methods = array( 'init_query_flags', 'parse_tax_query' ); - - /** - * Resets query flags to false. - * - * The query flags are what page info WordPress was able to figure out. - * - * @since 2.0.0 - * @access private - */ - private function init_query_flags() { - $this->is_single = false; - $this->is_preview = false; - $this->is_page = false; - $this->is_archive = false; - $this->is_date = false; - $this->is_year = false; - $this->is_month = false; - $this->is_day = false; - $this->is_time = false; - $this->is_author = false; - $this->is_category = false; - $this->is_tag = false; - $this->is_tax = false; - $this->is_search = false; - $this->is_feed = false; - $this->is_comment_feed = false; - $this->is_trackback = false; - $this->is_home = false; - $this->is_404 = false; - $this->is_paged = false; - $this->is_admin = false; - $this->is_attachment = false; - $this->is_singular = false; - $this->is_robots = false; - $this->is_posts_page = false; - $this->is_post_type_archive = false; - } - - /** - * Initiates object properties and sets default values. - * - * @since 1.5.0 - * @access public - */ - public function init() { - unset($this->posts); - unset($this->query); - $this->query_vars = array(); - unset($this->queried_object); - unset($this->queried_object_id); - $this->post_count = 0; - $this->current_post = -1; - $this->in_the_loop = false; - unset( $this->request ); - unset( $this->post ); - unset( $this->comments ); - unset( $this->comment ); - $this->comment_count = 0; - $this->current_comment = -1; - $this->found_posts = 0; - $this->max_num_pages = 0; - $this->max_num_comment_pages = 0; - - $this->init_query_flags(); - } - - /** - * Reparse the query vars. - * - * @since 1.5.0 - * @access public - */ - public function parse_query_vars() { - $this->parse_query(); - } - - /** - * Fills in the query variables, which do not exist within the parameter. - * - * @since 2.1.0 - * @since 4.4.0 Removed the `comments_popup` public query variable. - * @access public - * - * @param array $array Defined query variables. - * @return array Complete query variables with undefined ones filled in empty. - */ - public function fill_query_vars($array) { - $keys = array( - 'error' - , 'm' - , 'p' - , 'post_parent' - , 'subpost' - , 'subpost_id' - , 'attachment' - , 'attachment_id' - , 'name' - , 'static' - , 'pagename' - , 'page_id' - , 'second' - , 'minute' - , 'hour' - , 'day' - , 'monthnum' - , 'year' - , 'w' - , 'category_name' - , 'tag' - , 'cat' - , 'tag_id' - , 'author' - , 'author_name' - , 'feed' - , 'tb' - , 'paged' - , 'meta_key' - , 'meta_value' - , 'preview' - , 's' - , 'sentence' - , 'title' - , 'fields' - , 'menu_order' - , 'embed' - ); - - foreach ( $keys as $key ) { - if ( !isset($array[$key]) ) - $array[$key] = ''; - } - - $array_keys = array( 'category__in', 'category__not_in', 'category__and', 'post__in', 'post__not_in', 'post_name__in', - 'tag__in', 'tag__not_in', 'tag__and', 'tag_slug__in', 'tag_slug__and', 'post_parent__in', 'post_parent__not_in', - 'author__in', 'author__not_in' ); - - foreach ( $array_keys as $key ) { - if ( !isset($array[$key]) ) - $array[$key] = array(); - } - return $array; - } - - /** - * Parse a query string and set query type booleans. - * - * @since 1.5.0 - * @since 4.2.0 Introduced the ability to order by specific clauses of a `$meta_query`, by passing the clause's - * array key to `$orderby`. - * @since 4.4.0 Introduced `$post_name__in` and `$title` parameters. `$s` was updated to support excluded - * search terms, by prepending a hyphen. - * @since 4.5.0 Removed the `$comments_popup` parameter. - * Introduced the `$comment_status` and `$ping_status` parameters. - * Introduced `RAND(x)` syntax for `$orderby`, which allows an integer seed value to random sorts. - * @since 4.6.0 Added 'post_name__in' support for `$orderby`. Introduced the `$lazy_load_term_meta` argument. - * @access public - * - * @param string|array $query { - * Optional. Array or string of Query parameters. - * - * @type int $attachment_id Attachment post ID. Used for 'attachment' post_type. - * @type int|string $author Author ID, or comma-separated list of IDs. - * @type string $author_name User 'user_nicename'. - * @type array $author__in An array of author IDs to query from. - * @type array $author__not_in An array of author IDs not to query from. - * @type bool $cache_results Whether to cache post information. Default true. - * @type int|string $cat Category ID or comma-separated list of IDs (this or any children). - * @type array $category__and An array of category IDs (AND in). - * @type array $category__in An array of category IDs (OR in, no children). - * @type array $category__not_in An array of category IDs (NOT in). - * @type string $category_name Use category slug (not name, this or any children). - * @type string $comment_status Comment status. - * @type int $comments_per_page The number of comments to return per page. - * Default 'comments_per_page' option. - * @type array $date_query An associative array of WP_Date_Query arguments. - * See WP_Date_Query::__construct(). - * @type int $day Day of the month. Default empty. Accepts numbers 1-31. - * @type bool $exact Whether to search by exact keyword. Default false. - * @type string|array $fields Which fields to return. Single field or all fields (string), - * or array of fields. 'id=>parent' uses 'id' and 'post_parent'. - * Default all fields. Accepts 'ids', 'id=>parent'. - * @type int $hour Hour of the day. Default empty. Accepts numbers 0-23. - * @type int|bool $ignore_sticky_posts Whether to ignore sticky posts or not. Setting this to false - * excludes stickies from 'post__in'. Accepts 1|true, 0|false. - * Default 0|false. - * @type int $m Combination YearMonth. Accepts any four-digit year and month - * numbers 1-12. Default empty. - * @type string $meta_compare Comparison operator to test the 'meta_value'. - * @type string $meta_key Custom field key. - * @type array $meta_query An associative array of WP_Meta_Query arguments. See WP_Meta_Query. - * @type string $meta_value Custom field value. - * @type int $meta_value_num Custom field value number. - * @type int $menu_order The menu order of the posts. - * @type int $monthnum The two-digit month. Default empty. Accepts numbers 1-12. - * @type string $name Post slug. - * @type bool $nopaging Show all posts (true) or paginate (false). Default false. - * @type bool $no_found_rows Whether to skip counting the total rows found. Enabling can improve - * performance. Default false. - * @type int $offset The number of posts to offset before retrieval. - * @type string $order Designates ascending or descending order of posts. Default 'DESC'. - * Accepts 'ASC', 'DESC'. - * @type string|array $orderby Sort retrieved posts by parameter. One or more options may be - * passed. To use 'meta_value', or 'meta_value_num', - * 'meta_key=keyname' must be also be defined. To sort by a - * specific `$meta_query` clause, use that clause's array key. - * Default 'date'. Accepts 'none', 'name', 'author', 'date', - * 'title', 'modified', 'menu_order', 'parent', 'ID', 'rand', - * 'RAND(x)' (where 'x' is an integer seed value), - * 'comment_count', 'meta_value', 'meta_value_num', 'post__in', - * 'post_name__in', 'post_parent__in', and the array keys - * of `$meta_query`. - * @type int $p Post ID. - * @type int $page Show the number of posts that would show up on page X of a - * static front page. - * @type int $paged The number of the current page. - * @type int $page_id Page ID. - * @type string $pagename Page slug. - * @type string $perm Show posts if user has the appropriate capability. - * @type string $ping_status Ping status. - * @type array $post__in An array of post IDs to retrieve, sticky posts will be included - * @type string $post_mime_type The mime type of the post. Used for 'attachment' post_type. - * @type array $post__not_in An array of post IDs not to retrieve. Note: a string of comma- - * separated IDs will NOT work. - * @type int $post_parent Page ID to retrieve child pages for. Use 0 to only retrieve - * top-level pages. - * @type array $post_parent__in An array containing parent page IDs to query child pages from. - * @type array $post_parent__not_in An array containing parent page IDs not to query child pages from. - * @type string|array $post_type A post type slug (string) or array of post type slugs. - * Default 'any' if using 'tax_query'. - * @type string|array $post_status A post status (string) or array of post statuses. - * @type int $posts_per_page The number of posts to query for. Use -1 to request all posts. - * @type int $posts_per_archive_page The number of posts to query for by archive page. Overrides - * 'posts_per_page' when is_archive(), or is_search() are true. - * @type array $post_name__in An array of post slugs that results must match. - * @type string $s Search keyword(s). Prepending a term with a hyphen will - * exclude posts matching that term. Eg, 'pillow -sofa' will - * return posts containing 'pillow' but not 'sofa'. The - * character used for exclusion can be modified using the - * the 'wp_query_search_exclusion_prefix' filter. - * @type int $second Second of the minute. Default empty. Accepts numbers 0-60. - * @type bool $sentence Whether to search by phrase. Default false. - * @type bool $suppress_filters Whether to suppress filters. Default false. - * @type string $tag Tag slug. Comma-separated (either), Plus-separated (all). - * @type array $tag__and An array of tag ids (AND in). - * @type array $tag__in An array of tag ids (OR in). - * @type array $tag__not_in An array of tag ids (NOT in). - * @type int $tag_id Tag id or comma-separated list of IDs. - * @type array $tag_slug__and An array of tag slugs (AND in). - * @type array $tag_slug__in An array of tag slugs (OR in). unless 'ignore_sticky_posts' is - * true. Note: a string of comma-separated IDs will NOT work. - * @type array $tax_query An associative array of WP_Tax_Query arguments. - * See WP_Tax_Query->queries. - * @type string $title Post title. - * @type bool $update_post_meta_cache Whether to update the post meta cache. Default true. - * @type bool $update_post_term_cache Whether to update the post term cache. Default true. - * @type bool $lazy_load_term_meta Whether to lazy-load term meta. Setting to false will - * disable cache priming for term meta, so that each - * get_term_meta() call will hit the database. - * Defaults to the value of `$update_post_term_cache`. - * @type int $w The week number of the year. Default empty. Accepts numbers 0-53. - * @type int $year The four-digit year. Default empty. Accepts any four-digit year. - * } - */ - public function parse_query( $query = '' ) { - if ( ! empty( $query ) ) { - $this->init(); - $this->query = $this->query_vars = wp_parse_args( $query ); - } elseif ( ! isset( $this->query ) ) { - $this->query = $this->query_vars; - } - - $this->query_vars = $this->fill_query_vars($this->query_vars); - $qv = &$this->query_vars; - $this->query_vars_changed = true; - - if ( ! empty($qv['robots']) ) - $this->is_robots = true; - - if ( ! is_scalar( $qv['p'] ) || $qv['p'] < 0 ) { - $qv['p'] = 0; - $qv['error'] = '404'; - } else { - $qv['p'] = intval( $qv['p'] ); - } - - $qv['page_id'] = absint($qv['page_id']); - $qv['year'] = absint($qv['year']); - $qv['monthnum'] = absint($qv['monthnum']); - $qv['day'] = absint($qv['day']); - $qv['w'] = absint($qv['w']); - $qv['m'] = is_scalar( $qv['m'] ) ? preg_replace( '|[^0-9]|', '', $qv['m'] ) : ''; - $qv['paged'] = absint($qv['paged']); - $qv['cat'] = preg_replace( '|[^0-9,-]|', '', $qv['cat'] ); // comma separated list of positive or negative integers - $qv['author'] = preg_replace( '|[^0-9,-]|', '', $qv['author'] ); // comma separated list of positive or negative integers - $qv['pagename'] = trim( $qv['pagename'] ); - $qv['name'] = trim( $qv['name'] ); - $qv['title'] = trim( $qv['title'] ); - if ( '' !== $qv['hour'] ) $qv['hour'] = absint($qv['hour']); - if ( '' !== $qv['minute'] ) $qv['minute'] = absint($qv['minute']); - if ( '' !== $qv['second'] ) $qv['second'] = absint($qv['second']); - if ( '' !== $qv['menu_order'] ) $qv['menu_order'] = absint($qv['menu_order']); - - // Fairly insane upper bound for search string lengths. - if ( ! is_scalar( $qv['s'] ) || ( ! empty( $qv['s'] ) && strlen( $qv['s'] ) > 1600 ) ) { - $qv['s'] = ''; - } - - // Compat. Map subpost to attachment. - if ( '' != $qv['subpost'] ) - $qv['attachment'] = $qv['subpost']; - if ( '' != $qv['subpost_id'] ) - $qv['attachment_id'] = $qv['subpost_id']; - - $qv['attachment_id'] = absint($qv['attachment_id']); - - if ( ('' != $qv['attachment']) || !empty($qv['attachment_id']) ) { - $this->is_single = true; - $this->is_attachment = true; - } elseif ( '' != $qv['name'] ) { - $this->is_single = true; - } elseif ( $qv['p'] ) { - $this->is_single = true; - } elseif ( ('' !== $qv['hour']) && ('' !== $qv['minute']) &&('' !== $qv['second']) && ('' != $qv['year']) && ('' != $qv['monthnum']) && ('' != $qv['day']) ) { - // If year, month, day, hour, minute, and second are set, a single - // post is being queried. - $this->is_single = true; - } elseif ( '' != $qv['static'] || '' != $qv['pagename'] || !empty($qv['page_id']) ) { - $this->is_page = true; - $this->is_single = false; - } else { - // Look for archive queries. Dates, categories, authors, search, post type archives. - - if ( isset( $this->query['s'] ) ) { - $this->is_search = true; - } - - if ( '' !== $qv['second'] ) { - $this->is_time = true; - $this->is_date = true; - } - - if ( '' !== $qv['minute'] ) { - $this->is_time = true; - $this->is_date = true; - } - - if ( '' !== $qv['hour'] ) { - $this->is_time = true; - $this->is_date = true; - } - - if ( $qv['day'] ) { - if ( ! $this->is_date ) { - $date = sprintf( '%04d-%02d-%02d', $qv['year'], $qv['monthnum'], $qv['day'] ); - if ( $qv['monthnum'] && $qv['year'] && ! wp_checkdate( $qv['monthnum'], $qv['day'], $qv['year'], $date ) ) { - $qv['error'] = '404'; - } else { - $this->is_day = true; - $this->is_date = true; - } - } - } - - if ( $qv['monthnum'] ) { - if ( ! $this->is_date ) { - if ( 12 < $qv['monthnum'] ) { - $qv['error'] = '404'; - } else { - $this->is_month = true; - $this->is_date = true; - } - } - } - - if ( $qv['year'] ) { - if ( ! $this->is_date ) { - $this->is_year = true; - $this->is_date = true; - } - } - - if ( $qv['m'] ) { - $this->is_date = true; - if ( strlen($qv['m']) > 9 ) { - $this->is_time = true; - } elseif ( strlen( $qv['m'] ) > 7 ) { - $this->is_day = true; - } elseif ( strlen( $qv['m'] ) > 5 ) { - $this->is_month = true; - } else { - $this->is_year = true; - } - } - - if ( '' != $qv['w'] ) { - $this->is_date = true; - } - - $this->query_vars_hash = false; - $this->parse_tax_query( $qv ); - - foreach ( $this->tax_query->queries as $tax_query ) { - if ( ! is_array( $tax_query ) ) { - continue; - } - - if ( isset( $tax_query['operator'] ) && 'NOT IN' != $tax_query['operator'] ) { - switch ( $tax_query['taxonomy'] ) { - case 'category': - $this->is_category = true; - break; - case 'post_tag': - $this->is_tag = true; - break; - default: - $this->is_tax = true; - } - } - } - unset( $tax_query ); - - if ( empty($qv['author']) || ($qv['author'] == '0') ) { - $this->is_author = false; - } else { - $this->is_author = true; - } - - if ( '' != $qv['author_name'] ) - $this->is_author = true; - - if ( !empty( $qv['post_type'] ) && ! is_array( $qv['post_type'] ) ) { - $post_type_obj = get_post_type_object( $qv['post_type'] ); - if ( ! empty( $post_type_obj->has_archive ) ) - $this->is_post_type_archive = true; - } - - if ( $this->is_post_type_archive || $this->is_date || $this->is_author || $this->is_category || $this->is_tag || $this->is_tax ) - $this->is_archive = true; - } - - if ( '' != $qv['feed'] ) - $this->is_feed = true; - - if ( '' != $qv['embed'] ) { - $this->is_embed = true; - } - - if ( '' != $qv['tb'] ) - $this->is_trackback = true; - - if ( '' != $qv['paged'] && ( intval($qv['paged']) > 1 ) ) - $this->is_paged = true; - - // if we're previewing inside the write screen - if ( '' != $qv['preview'] ) - $this->is_preview = true; - - if ( is_admin() ) - $this->is_admin = true; - - if ( false !== strpos($qv['feed'], 'comments-') ) { - $qv['feed'] = str_replace('comments-', '', $qv['feed']); - $qv['withcomments'] = 1; - } - - $this->is_singular = $this->is_single || $this->is_page || $this->is_attachment; - - if ( $this->is_feed && ( !empty($qv['withcomments']) || ( empty($qv['withoutcomments']) && $this->is_singular ) ) ) - $this->is_comment_feed = true; - - if ( !( $this->is_singular || $this->is_archive || $this->is_search || $this->is_feed || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) || $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_robots ) ) - $this->is_home = true; - - // Correct is_* for page_on_front and page_for_posts - if ( $this->is_home && 'page' == get_option('show_on_front') && get_option('page_on_front') ) { - $_query = wp_parse_args($this->query); - // pagename can be set and empty depending on matched rewrite rules. Ignore an empty pagename. - if ( isset($_query['pagename']) && '' == $_query['pagename'] ) - unset($_query['pagename']); - - unset( $_query['embed'] ); - - if ( empty($_query) || !array_diff( array_keys($_query), array('preview', 'page', 'paged', 'cpage') ) ) { - $this->is_page = true; - $this->is_home = false; - $qv['page_id'] = get_option('page_on_front'); - // Correct <!--nextpage--> for page_on_front - if ( !empty($qv['paged']) ) { - $qv['page'] = $qv['paged']; - unset($qv['paged']); - } - } - } - - if ( '' != $qv['pagename'] ) { - $this->queried_object = get_page_by_path( $qv['pagename'] ); - - if ( $this->queried_object && 'attachment' == $this->queried_object->post_type ) { - if ( preg_match( "/^[^%]*%(?:postname)%/", get_option( 'permalink_structure' ) ) ) { - // See if we also have a post with the same slug - $post = get_page_by_path( $qv['pagename'], OBJECT, 'post' ); - if ( $post ) { - $this->queried_object = $post; - $this->is_page = false; - $this->is_single = true; - } - } - } - - if ( ! empty( $this->queried_object ) ) { - $this->queried_object_id = (int) $this->queried_object->ID; - } else { - unset( $this->queried_object ); - } - - if ( 'page' == get_option('show_on_front') && isset($this->queried_object_id) && $this->queried_object_id == get_option('page_for_posts') ) { - $this->is_page = false; - $this->is_home = true; - $this->is_posts_page = true; - } - } - - if ( $qv['page_id'] ) { - if ( 'page' == get_option('show_on_front') && $qv['page_id'] == get_option('page_for_posts') ) { - $this->is_page = false; - $this->is_home = true; - $this->is_posts_page = true; - } - } - - if ( !empty($qv['post_type']) ) { - if ( is_array($qv['post_type']) ) - $qv['post_type'] = array_map('sanitize_key', $qv['post_type']); - else - $qv['post_type'] = sanitize_key($qv['post_type']); - } - - if ( ! empty( $qv['post_status'] ) ) { - if ( is_array( $qv['post_status'] ) ) - $qv['post_status'] = array_map('sanitize_key', $qv['post_status']); - else - $qv['post_status'] = preg_replace('|[^a-z0-9_,-]|', '', $qv['post_status']); - } - - if ( $this->is_posts_page && ( ! isset($qv['withcomments']) || ! $qv['withcomments'] ) ) - $this->is_comment_feed = false; - - $this->is_singular = $this->is_single || $this->is_page || $this->is_attachment; - // Done correcting is_* for page_on_front and page_for_posts - - if ( '404' == $qv['error'] ) - $this->set_404(); - - $this->is_embed = $this->is_embed && ( $this->is_singular || $this->is_404 ); - - $this->query_vars_hash = md5( serialize( $this->query_vars ) ); - $this->query_vars_changed = false; - - /** - * Fires after the main query vars have been parsed. - * - * @since 1.5.0 - * - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - do_action_ref_array( 'parse_query', array( &$this ) ); - } - - /** - * Parses various taxonomy related query vars. - * - * For BC, this method is not marked as protected. See [28987]. - * - * @access protected - * @since 3.1.0 - * - * @param array $q The query variables. Passed by reference. - */ - public function parse_tax_query( &$q ) { - if ( ! empty( $q['tax_query'] ) && is_array( $q['tax_query'] ) ) { - $tax_query = $q['tax_query']; - } else { - $tax_query = array(); - } - - if ( !empty($q['taxonomy']) && !empty($q['term']) ) { - $tax_query[] = array( - 'taxonomy' => $q['taxonomy'], - 'terms' => array( $q['term'] ), - 'field' => 'slug', - ); - } - - foreach ( get_taxonomies( array() , 'objects' ) as $taxonomy => $t ) { - if ( 'post_tag' == $taxonomy ) - continue; // Handled further down in the $q['tag'] block - - if ( $t->query_var && !empty( $q[$t->query_var] ) ) { - $tax_query_defaults = array( - 'taxonomy' => $taxonomy, - 'field' => 'slug', - ); - - if ( isset( $t->rewrite['hierarchical'] ) && $t->rewrite['hierarchical'] ) { - $q[$t->query_var] = wp_basename( $q[$t->query_var] ); - } - - $term = $q[$t->query_var]; - - if ( is_array( $term ) ) { - $term = implode( ',', $term ); - } - - if ( strpos($term, '+') !== false ) { - $terms = preg_split( '/[+]+/', $term ); - foreach ( $terms as $term ) { - $tax_query[] = array_merge( $tax_query_defaults, array( - 'terms' => array( $term ) - ) ); - } - } else { - $tax_query[] = array_merge( $tax_query_defaults, array( - 'terms' => preg_split( '/[,]+/', $term ) - ) ); - } - } - } - - // If querystring 'cat' is an array, implode it. - if ( is_array( $q['cat'] ) ) { - $q['cat'] = implode( ',', $q['cat'] ); - } - - // Category stuff - if ( ! empty( $q['cat'] ) && ! $this->is_singular ) { - $cat_in = $cat_not_in = array(); - - $cat_array = preg_split( '/[,\s]+/', urldecode( $q['cat'] ) ); - $cat_array = array_map( 'intval', $cat_array ); - $q['cat'] = implode( ',', $cat_array ); - - foreach ( $cat_array as $cat ) { - if ( $cat > 0 ) - $cat_in[] = $cat; - elseif ( $cat < 0 ) - $cat_not_in[] = abs( $cat ); - } - - if ( ! empty( $cat_in ) ) { - $tax_query[] = array( - 'taxonomy' => 'category', - 'terms' => $cat_in, - 'field' => 'term_id', - 'include_children' => true - ); - } - - if ( ! empty( $cat_not_in ) ) { - $tax_query[] = array( - 'taxonomy' => 'category', - 'terms' => $cat_not_in, - 'field' => 'term_id', - 'operator' => 'NOT IN', - 'include_children' => true - ); - } - unset( $cat_array, $cat_in, $cat_not_in ); - } - - if ( ! empty( $q['category__and'] ) && 1 === count( (array) $q['category__and'] ) ) { - $q['category__and'] = (array) $q['category__and']; - if ( ! isset( $q['category__in'] ) ) - $q['category__in'] = array(); - $q['category__in'][] = absint( reset( $q['category__and'] ) ); - unset( $q['category__and'] ); - } - - if ( ! empty( $q['category__in'] ) ) { - $q['category__in'] = array_map( 'absint', array_unique( (array) $q['category__in'] ) ); - $tax_query[] = array( - 'taxonomy' => 'category', - 'terms' => $q['category__in'], - 'field' => 'term_id', - 'include_children' => false - ); - } - - if ( ! empty($q['category__not_in']) ) { - $q['category__not_in'] = array_map( 'absint', array_unique( (array) $q['category__not_in'] ) ); - $tax_query[] = array( - 'taxonomy' => 'category', - 'terms' => $q['category__not_in'], - 'operator' => 'NOT IN', - 'include_children' => false - ); - } - - if ( ! empty($q['category__and']) ) { - $q['category__and'] = array_map( 'absint', array_unique( (array) $q['category__and'] ) ); - $tax_query[] = array( - 'taxonomy' => 'category', - 'terms' => $q['category__and'], - 'field' => 'term_id', - 'operator' => 'AND', - 'include_children' => false - ); - } - - // If querystring 'tag' is array, implode it. - if ( is_array( $q['tag'] ) ) { - $q['tag'] = implode( ',', $q['tag'] ); - } - - // Tag stuff - if ( '' != $q['tag'] && !$this->is_singular && $this->query_vars_changed ) { - if ( strpos($q['tag'], ',') !== false ) { - $tags = preg_split('/[,\r\n\t ]+/', $q['tag']); - foreach ( (array) $tags as $tag ) { - $tag = sanitize_term_field('slug', $tag, 0, 'post_tag', 'db'); - $q['tag_slug__in'][] = $tag; - } - } elseif ( preg_match('/[+\r\n\t ]+/', $q['tag'] ) || ! empty( $q['cat'] ) ) { - $tags = preg_split('/[+\r\n\t ]+/', $q['tag']); - foreach ( (array) $tags as $tag ) { - $tag = sanitize_term_field('slug', $tag, 0, 'post_tag', 'db'); - $q['tag_slug__and'][] = $tag; - } - } else { - $q['tag'] = sanitize_term_field('slug', $q['tag'], 0, 'post_tag', 'db'); - $q['tag_slug__in'][] = $q['tag']; - } - } - - if ( !empty($q['tag_id']) ) { - $q['tag_id'] = absint( $q['tag_id'] ); - $tax_query[] = array( - 'taxonomy' => 'post_tag', - 'terms' => $q['tag_id'] - ); - } - - if ( !empty($q['tag__in']) ) { - $q['tag__in'] = array_map('absint', array_unique( (array) $q['tag__in'] ) ); - $tax_query[] = array( - 'taxonomy' => 'post_tag', - 'terms' => $q['tag__in'] - ); - } - - if ( !empty($q['tag__not_in']) ) { - $q['tag__not_in'] = array_map('absint', array_unique( (array) $q['tag__not_in'] ) ); - $tax_query[] = array( - 'taxonomy' => 'post_tag', - 'terms' => $q['tag__not_in'], - 'operator' => 'NOT IN' - ); - } - - if ( !empty($q['tag__and']) ) { - $q['tag__and'] = array_map('absint', array_unique( (array) $q['tag__and'] ) ); - $tax_query[] = array( - 'taxonomy' => 'post_tag', - 'terms' => $q['tag__and'], - 'operator' => 'AND' - ); - } - - if ( !empty($q['tag_slug__in']) ) { - $q['tag_slug__in'] = array_map('sanitize_title_for_query', array_unique( (array) $q['tag_slug__in'] ) ); - $tax_query[] = array( - 'taxonomy' => 'post_tag', - 'terms' => $q['tag_slug__in'], - 'field' => 'slug' - ); - } - - if ( !empty($q['tag_slug__and']) ) { - $q['tag_slug__and'] = array_map('sanitize_title_for_query', array_unique( (array) $q['tag_slug__and'] ) ); - $tax_query[] = array( - 'taxonomy' => 'post_tag', - 'terms' => $q['tag_slug__and'], - 'field' => 'slug', - 'operator' => 'AND' - ); - } - - $this->tax_query = new WP_Tax_Query( $tax_query ); - - /** - * Fires after taxonomy-related query vars have been parsed. - * - * @since 3.7.0 - * - * @param WP_Query $this The WP_Query instance. - */ - do_action( 'parse_tax_query', $this ); - } - - /** - * Generate SQL for the WHERE clause based on passed search terms. - * - * @since 3.7.0 - * - * @param array $q Query variables. - * @return string WHERE clause. - */ - protected function parse_search( &$q ) { - global $wpdb; - - $search = ''; - - // added slashes screw with quote grouping when done early, so done later - $q['s'] = stripslashes( $q['s'] ); - if ( empty( $_GET['s'] ) && $this->is_main_query() ) - $q['s'] = urldecode( $q['s'] ); - // there are no line breaks in <input /> fields - $q['s'] = str_replace( array( "\r", "\n" ), '', $q['s'] ); - $q['search_terms_count'] = 1; - if ( ! empty( $q['sentence'] ) ) { - $q['search_terms'] = array( $q['s'] ); - } else { - if ( preg_match_all( '/".*?("|$)|((?<=[\t ",+])|^)[^\t ",+]+/', $q['s'], $matches ) ) { - $q['search_terms_count'] = count( $matches[0] ); - $q['search_terms'] = $this->parse_search_terms( $matches[0] ); - // if the search string has only short terms or stopwords, or is 10+ terms long, match it as sentence - if ( empty( $q['search_terms'] ) || count( $q['search_terms'] ) > 9 ) - $q['search_terms'] = array( $q['s'] ); - } else { - $q['search_terms'] = array( $q['s'] ); - } - } - - $n = ! empty( $q['exact'] ) ? '' : '%'; - $searchand = ''; - $q['search_orderby_title'] = array(); - - /** - * Filters the prefix that indicates that a search term should be excluded from results. - * - * @since 4.7.0 - * - * @param string $exclusion_prefix The prefix. Default '-'. Returning - * an empty value disables exclusions. - */ - $exclusion_prefix = apply_filters( 'wp_query_search_exclusion_prefix', '-' ); - - foreach ( $q['search_terms'] as $term ) { - // If there is an $exclusion_prefix, terms prefixed with it should be excluded. - $exclude = $exclusion_prefix && ( $exclusion_prefix === substr( $term, 0, 1 ) ); - if ( $exclude ) { - $like_op = 'NOT LIKE'; - $andor_op = 'AND'; - $term = substr( $term, 1 ); - } else { - $like_op = 'LIKE'; - $andor_op = 'OR'; - } - - if ( $n && ! $exclude ) { - $like = '%' . $wpdb->esc_like( $term ) . '%'; - $q['search_orderby_title'][] = $wpdb->prepare( "{$wpdb->posts}.post_title LIKE %s", $like ); - } - - $like = $n . $wpdb->esc_like( $term ) . $n; - $search .= $wpdb->prepare( "{$searchand}(({$wpdb->posts}.post_title $like_op %s) $andor_op ({$wpdb->posts}.post_excerpt $like_op %s) $andor_op ({$wpdb->posts}.post_content $like_op %s))", $like, $like, $like ); - $searchand = ' AND '; - } - - if ( ! empty( $search ) ) { - $search = " AND ({$search}) "; - if ( ! is_user_logged_in() ) { - $search .= " AND ({$wpdb->posts}.post_password = '') "; - } - } - - return $search; - } - - /** - * Check if the terms are suitable for searching. - * - * Uses an array of stopwords (terms) that are excluded from the separate - * term matching when searching for posts. The list of English stopwords is - * the approximate search engines list, and is translatable. - * - * @since 3.7.0 - * - * @param array $terms Terms to check. - * @return array Terms that are not stopwords. - */ - protected function parse_search_terms( $terms ) { - $strtolower = function_exists( 'mb_strtolower' ) ? 'mb_strtolower' : 'strtolower'; - $checked = array(); - - $stopwords = $this->get_search_stopwords(); - - foreach ( $terms as $term ) { - // keep before/after spaces when term is for exact match - if ( preg_match( '/^".+"$/', $term ) ) - $term = trim( $term, "\"'" ); - else - $term = trim( $term, "\"' " ); - - // Avoid single A-Z and single dashes. - if ( ! $term || ( 1 === strlen( $term ) && preg_match( '/^[a-z\-]$/i', $term ) ) ) - continue; - - if ( in_array( call_user_func( $strtolower, $term ), $stopwords, true ) ) - continue; - - $checked[] = $term; - } - - return $checked; - } - - /** - * Retrieve stopwords used when parsing search terms. - * - * @since 3.7.0 - * - * @return array Stopwords. - */ - protected function get_search_stopwords() { - if ( isset( $this->stopwords ) ) - return $this->stopwords; - - /* translators: This is a comma-separated list of very common words that should be excluded from a search, - * like a, an, and the. These are usually called "stopwords". You should not simply translate these individual - * words into your language. Instead, look for and provide commonly accepted stopwords in your language. - */ - $words = explode( ',', _x( 'about,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,was,what,when,where,who,will,with,www', - 'Comma-separated list of search stopwords in your language' ) ); - - $stopwords = array(); - foreach ( $words as $word ) { - $word = trim( $word, "\r\n\t " ); - if ( $word ) - $stopwords[] = $word; - } - - /** - * Filters stopwords used when parsing search terms. - * - * @since 3.7.0 - * - * @param array $stopwords Stopwords. - */ - $this->stopwords = apply_filters( 'wp_search_stopwords', $stopwords ); - return $this->stopwords; - } - - /** - * Generate SQL for the ORDER BY condition based on passed search terms. - * - * @param array $q Query variables. - * @return string ORDER BY clause. - */ - protected function parse_search_order( &$q ) { - global $wpdb; - - if ( $q['search_terms_count'] > 1 ) { - $num_terms = count( $q['search_orderby_title'] ); - - // If the search terms contain negative queries, don't bother ordering by sentence matches. - $like = ''; - if ( ! preg_match( '/(?:\s|^)\-/', $q['s'] ) ) { - $like = '%' . $wpdb->esc_like( $q['s'] ) . '%'; - } - - $search_orderby = ''; - - // sentence match in 'post_title' - if ( $like ) { - $search_orderby .= $wpdb->prepare( "WHEN {$wpdb->posts}.post_title LIKE %s THEN 1 ", $like ); - } - - // sanity limit, sort as sentence when more than 6 terms - // (few searches are longer than 6 terms and most titles are not) - if ( $num_terms < 7 ) { - // all words in title - $search_orderby .= 'WHEN ' . implode( ' AND ', $q['search_orderby_title'] ) . ' THEN 2 '; - // any word in title, not needed when $num_terms == 1 - if ( $num_terms > 1 ) - $search_orderby .= 'WHEN ' . implode( ' OR ', $q['search_orderby_title'] ) . ' THEN 3 '; - } - - // Sentence match in 'post_content' and 'post_excerpt'. - if ( $like ) { - $search_orderby .= $wpdb->prepare( "WHEN {$wpdb->posts}.post_excerpt LIKE %s THEN 4 ", $like ); - $search_orderby .= $wpdb->prepare( "WHEN {$wpdb->posts}.post_content LIKE %s THEN 5 ", $like ); - } - - if ( $search_orderby ) { - $search_orderby = '(CASE ' . $search_orderby . 'ELSE 6 END)'; - } - } else { - // single word or sentence search - $search_orderby = reset( $q['search_orderby_title'] ) . ' DESC'; - } - - return $search_orderby; - } - - /** - * If the passed orderby value is allowed, convert the alias to a - * properly-prefixed orderby value. - * - * @since 4.0.0 - * @access protected - * - * @param string $orderby Alias for the field to order by. - * @return string|false Table-prefixed value to used in the ORDER clause. False otherwise. - */ - protected function parse_orderby( $orderby ) { - global $wpdb; - - // Used to filter values. - $allowed_keys = array( - 'post_name', 'post_author', 'post_date', 'post_title', 'post_modified', - 'post_parent', 'post_type', 'name', 'author', 'date', 'title', 'modified', - 'parent', 'type', 'ID', 'menu_order', 'comment_count', 'rand', - ); - - $primary_meta_key = ''; - $primary_meta_query = false; - $meta_clauses = $this->meta_query->get_clauses(); - if ( ! empty( $meta_clauses ) ) { - $primary_meta_query = reset( $meta_clauses ); - - if ( ! empty( $primary_meta_query['key'] ) ) { - $primary_meta_key = $primary_meta_query['key']; - $allowed_keys[] = $primary_meta_key; - } - - $allowed_keys[] = 'meta_value'; - $allowed_keys[] = 'meta_value_num'; - $allowed_keys = array_merge( $allowed_keys, array_keys( $meta_clauses ) ); - } - - // If RAND() contains a seed value, sanitize and add to allowed keys. - $rand_with_seed = false; - if ( preg_match( '/RAND\(([0-9]+)\)/i', $orderby, $matches ) ) { - $orderby = sprintf( 'RAND(%s)', intval( $matches[1] ) ); - $allowed_keys[] = $orderby; - $rand_with_seed = true; - } - - if ( ! in_array( $orderby, $allowed_keys, true ) ) { - return false; - } - - switch ( $orderby ) { - case 'post_name': - case 'post_author': - case 'post_date': - case 'post_title': - case 'post_modified': - case 'post_parent': - case 'post_type': - case 'ID': - case 'menu_order': - case 'comment_count': - $orderby_clause = "{$wpdb->posts}.{$orderby}"; - break; - case 'rand': - $orderby_clause = 'RAND()'; - break; - case $primary_meta_key: - case 'meta_value': - if ( ! empty( $primary_meta_query['type'] ) ) { - $orderby_clause = "CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})"; - } else { - $orderby_clause = "{$primary_meta_query['alias']}.meta_value"; - } - break; - case 'meta_value_num': - $orderby_clause = "{$primary_meta_query['alias']}.meta_value+0"; - break; - default: - if ( array_key_exists( $orderby, $meta_clauses ) ) { - // $orderby corresponds to a meta_query clause. - $meta_clause = $meta_clauses[ $orderby ]; - $orderby_clause = "CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})"; - } elseif ( $rand_with_seed ) { - $orderby_clause = $orderby; - } else { - // Default: order by post field. - $orderby_clause = "{$wpdb->posts}.post_" . sanitize_key( $orderby ); - } - - break; - } - - return $orderby_clause; - } - - /** - * Parse an 'order' query variable and cast it to ASC or DESC as necessary. - * - * @since 4.0.0 - * @access protected - * - * @param string $order The 'order' query variable. - * @return string The sanitized 'order' query variable. - */ - protected function parse_order( $order ) { - if ( ! is_string( $order ) || empty( $order ) ) { - return 'DESC'; - } - - if ( 'ASC' === strtoupper( $order ) ) { - return 'ASC'; - } else { - return 'DESC'; - } - } - - /** - * Sets the 404 property and saves whether query is feed. - * - * @since 2.0.0 - * @access public - */ - public function set_404() { - $is_feed = $this->is_feed; - - $this->init_query_flags(); - $this->is_404 = true; - - $this->is_feed = $is_feed; - } - - /** - * Retrieve query variable. - * - * @since 1.5.0 - * @since 3.9.0 The `$default` argument was introduced. - * - * @access public - * - * @param string $query_var Query variable key. - * @param mixed $default Optional. Value to return if the query variable is not set. Default empty. - * @return mixed Contents of the query variable. - */ - public function get( $query_var, $default = '' ) { - if ( isset( $this->query_vars[ $query_var ] ) ) { - return $this->query_vars[ $query_var ]; - } - - return $default; - } - - /** - * Set query variable. - * - * @since 1.5.0 - * @access public - * - * @param string $query_var Query variable key. - * @param mixed $value Query variable value. - */ - public function set($query_var, $value) { - $this->query_vars[$query_var] = $value; - } - - /** - * Retrieve the posts based on query variables. - * - * There are a few filters and actions that can be used to modify the post - * database query. - * - * @since 1.5.0 - * @access public - * - * @return array List of posts. - */ - public function get_posts() { - global $wpdb; - - $this->parse_query(); - - /** - * Fires after the query variable object is created, but before the actual query is run. - * - * Note: If using conditional tags, use the method versions within the passed instance - * (e.g. $this->is_main_query() instead of is_main_query()). This is because the functions - * like is_main_query() test against the global $wp_query instance, not the passed one. - * - * @since 2.0.0 - * - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - do_action_ref_array( 'pre_get_posts', array( &$this ) ); - - // Shorthand. - $q = &$this->query_vars; - - // Fill again in case pre_get_posts unset some vars. - $q = $this->fill_query_vars($q); - - // Parse meta query - $this->meta_query = new WP_Meta_Query(); - $this->meta_query->parse_query_vars( $q ); - - // Set a flag if a pre_get_posts hook changed the query vars. - $hash = md5( serialize( $this->query_vars ) ); - if ( $hash != $this->query_vars_hash ) { - $this->query_vars_changed = true; - $this->query_vars_hash = $hash; - } - unset($hash); - - // First let's clear some variables - $distinct = ''; - $whichauthor = ''; - $whichmimetype = ''; - $where = ''; - $limits = ''; - $join = ''; - $search = ''; - $groupby = ''; - $post_status_join = false; - $page = 1; - - if ( isset( $q['caller_get_posts'] ) ) { - _deprecated_argument( 'WP_Query', '3.1.0', __( '"caller_get_posts" is deprecated. Use "ignore_sticky_posts" instead.' ) ); - if ( !isset( $q['ignore_sticky_posts'] ) ) - $q['ignore_sticky_posts'] = $q['caller_get_posts']; - } - - if ( !isset( $q['ignore_sticky_posts'] ) ) - $q['ignore_sticky_posts'] = false; - - if ( !isset($q['suppress_filters']) ) - $q['suppress_filters'] = false; - - if ( !isset($q['cache_results']) ) { - if ( wp_using_ext_object_cache() ) - $q['cache_results'] = false; - else - $q['cache_results'] = true; - } - - if ( !isset($q['update_post_term_cache']) ) - $q['update_post_term_cache'] = true; - - if ( ! isset( $q['lazy_load_term_meta'] ) ) { - $q['lazy_load_term_meta'] = $q['update_post_term_cache']; - } - - if ( !isset($q['update_post_meta_cache']) ) - $q['update_post_meta_cache'] = true; - - if ( !isset($q['post_type']) ) { - if ( $this->is_search ) - $q['post_type'] = 'any'; - else - $q['post_type'] = ''; - } - $post_type = $q['post_type']; - if ( empty( $q['posts_per_page'] ) ) { - $q['posts_per_page'] = get_option( 'posts_per_page' ); - } - if ( isset($q['showposts']) && $q['showposts'] ) { - $q['showposts'] = (int) $q['showposts']; - $q['posts_per_page'] = $q['showposts']; - } - if ( (isset($q['posts_per_archive_page']) && $q['posts_per_archive_page'] != 0) && ($this->is_archive || $this->is_search) ) - $q['posts_per_page'] = $q['posts_per_archive_page']; - if ( !isset($q['nopaging']) ) { - if ( $q['posts_per_page'] == -1 ) { - $q['nopaging'] = true; - } else { - $q['nopaging'] = false; - } - } - - if ( $this->is_feed ) { - // This overrides posts_per_page. - if ( ! empty( $q['posts_per_rss'] ) ) { - $q['posts_per_page'] = $q['posts_per_rss']; - } else { - $q['posts_per_page'] = get_option( 'posts_per_rss' ); - } - $q['nopaging'] = false; - } - $q['posts_per_page'] = (int) $q['posts_per_page']; - if ( $q['posts_per_page'] < -1 ) - $q['posts_per_page'] = abs($q['posts_per_page']); - elseif ( $q['posts_per_page'] == 0 ) - $q['posts_per_page'] = 1; - - if ( !isset($q['comments_per_page']) || $q['comments_per_page'] == 0 ) - $q['comments_per_page'] = get_option('comments_per_page'); - - if ( $this->is_home && (empty($this->query) || $q['preview'] == 'true') && ( 'page' == get_option('show_on_front') ) && get_option('page_on_front') ) { - $this->is_page = true; - $this->is_home = false; - $q['page_id'] = get_option('page_on_front'); - } - - if ( isset($q['page']) ) { - $q['page'] = trim($q['page'], '/'); - $q['page'] = absint($q['page']); - } - - // If true, forcibly turns off SQL_CALC_FOUND_ROWS even when limits are present. - if ( isset($q['no_found_rows']) ) - $q['no_found_rows'] = (bool) $q['no_found_rows']; - else - $q['no_found_rows'] = false; - - switch ( $q['fields'] ) { - case 'ids': - $fields = "{$wpdb->posts}.ID"; - break; - case 'id=>parent': - $fields = "{$wpdb->posts}.ID, {$wpdb->posts}.post_parent"; - break; - default: - $fields = "{$wpdb->posts}.*"; - } - - if ( '' !== $q['menu_order'] ) { - $where .= " AND {$wpdb->posts}.menu_order = " . $q['menu_order']; - } - // The "m" parameter is meant for months but accepts datetimes of varying specificity - if ( $q['m'] ) { - $where .= " AND YEAR({$wpdb->posts}.post_date)=" . substr($q['m'], 0, 4); - if ( strlen($q['m']) > 5 ) { - $where .= " AND MONTH({$wpdb->posts}.post_date)=" . substr($q['m'], 4, 2); - } - if ( strlen($q['m']) > 7 ) { - $where .= " AND DAYOFMONTH({$wpdb->posts}.post_date)=" . substr($q['m'], 6, 2); - } - if ( strlen($q['m']) > 9 ) { - $where .= " AND HOUR({$wpdb->posts}.post_date)=" . substr($q['m'], 8, 2); - } - if ( strlen($q['m']) > 11 ) { - $where .= " AND MINUTE({$wpdb->posts}.post_date)=" . substr($q['m'], 10, 2); - } - if ( strlen($q['m']) > 13 ) { - $where .= " AND SECOND({$wpdb->posts}.post_date)=" . substr($q['m'], 12, 2); - } - } - - // Handle the other individual date parameters - $date_parameters = array(); - - if ( '' !== $q['hour'] ) - $date_parameters['hour'] = $q['hour']; - - if ( '' !== $q['minute'] ) - $date_parameters['minute'] = $q['minute']; - - if ( '' !== $q['second'] ) - $date_parameters['second'] = $q['second']; - - if ( $q['year'] ) - $date_parameters['year'] = $q['year']; - - if ( $q['monthnum'] ) - $date_parameters['monthnum'] = $q['monthnum']; - - if ( $q['w'] ) - $date_parameters['week'] = $q['w']; - - if ( $q['day'] ) - $date_parameters['day'] = $q['day']; - - if ( $date_parameters ) { - $date_query = new WP_Date_Query( array( $date_parameters ) ); - $where .= $date_query->get_sql(); - } - unset( $date_parameters, $date_query ); - - // Handle complex date queries - if ( ! empty( $q['date_query'] ) ) { - $this->date_query = new WP_Date_Query( $q['date_query'] ); - $where .= $this->date_query->get_sql(); - } - - - // If we've got a post_type AND it's not "any" post_type. - if ( !empty($q['post_type']) && 'any' != $q['post_type'] ) { - foreach ( (array)$q['post_type'] as $_post_type ) { - $ptype_obj = get_post_type_object($_post_type); - if ( !$ptype_obj || !$ptype_obj->query_var || empty($q[ $ptype_obj->query_var ]) ) - continue; - - if ( ! $ptype_obj->hierarchical ) { - // Non-hierarchical post types can directly use 'name'. - $q['name'] = $q[ $ptype_obj->query_var ]; - } else { - // Hierarchical post types will operate through 'pagename'. - $q['pagename'] = $q[ $ptype_obj->query_var ]; - $q['name'] = ''; - } - - // Only one request for a slug is possible, this is why name & pagename are overwritten above. - break; - } //end foreach - unset($ptype_obj); - } - - if ( '' !== $q['title'] ) { - $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_title = %s", stripslashes( $q['title'] ) ); - } - - // Parameters related to 'post_name'. - if ( '' != $q['name'] ) { - $q['name'] = sanitize_title_for_query( $q['name'] ); - $where .= " AND {$wpdb->posts}.post_name = '" . $q['name'] . "'"; - } elseif ( '' != $q['pagename'] ) { - if ( isset($this->queried_object_id) ) { - $reqpage = $this->queried_object_id; - } else { - if ( 'page' != $q['post_type'] ) { - foreach ( (array)$q['post_type'] as $_post_type ) { - $ptype_obj = get_post_type_object($_post_type); - if ( !$ptype_obj || !$ptype_obj->hierarchical ) - continue; - - $reqpage = get_page_by_path($q['pagename'], OBJECT, $_post_type); - if ( $reqpage ) - break; - } - unset($ptype_obj); - } else { - $reqpage = get_page_by_path($q['pagename']); - } - if ( !empty($reqpage) ) - $reqpage = $reqpage->ID; - else - $reqpage = 0; - } - - $page_for_posts = get_option('page_for_posts'); - if ( ('page' != get_option('show_on_front') ) || empty($page_for_posts) || ( $reqpage != $page_for_posts ) ) { - $q['pagename'] = sanitize_title_for_query( wp_basename( $q['pagename'] ) ); - $q['name'] = $q['pagename']; - $where .= " AND ({$wpdb->posts}.ID = '$reqpage')"; - $reqpage_obj = get_post( $reqpage ); - if ( is_object($reqpage_obj) && 'attachment' == $reqpage_obj->post_type ) { - $this->is_attachment = true; - $post_type = $q['post_type'] = 'attachment'; - $this->is_page = true; - $q['attachment_id'] = $reqpage; - } - } - } elseif ( '' != $q['attachment'] ) { - $q['attachment'] = sanitize_title_for_query( wp_basename( $q['attachment'] ) ); - $q['name'] = $q['attachment']; - $where .= " AND {$wpdb->posts}.post_name = '" . $q['attachment'] . "'"; - } elseif ( is_array( $q['post_name__in'] ) && ! empty( $q['post_name__in'] ) ) { - $q['post_name__in'] = array_map( 'sanitize_title_for_query', $q['post_name__in'] ); - $post_name__in = "'" . implode( "','", $q['post_name__in'] ) . "'"; - $where .= " AND {$wpdb->posts}.post_name IN ($post_name__in)"; - } - - // If an attachment is requested by number, let it supersede any post number. - if ( $q['attachment_id'] ) - $q['p'] = absint($q['attachment_id']); - - // If a post number is specified, load that post - if ( $q['p'] ) { - $where .= " AND {$wpdb->posts}.ID = " . $q['p']; - } elseif ( $q['post__in'] ) { - $post__in = implode(',', array_map( 'absint', $q['post__in'] )); - $where .= " AND {$wpdb->posts}.ID IN ($post__in)"; - } elseif ( $q['post__not_in'] ) { - $post__not_in = implode(',', array_map( 'absint', $q['post__not_in'] )); - $where .= " AND {$wpdb->posts}.ID NOT IN ($post__not_in)"; - } - - if ( is_numeric( $q['post_parent'] ) ) { - $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_parent = %d ", $q['post_parent'] ); - } elseif ( $q['post_parent__in'] ) { - $post_parent__in = implode( ',', array_map( 'absint', $q['post_parent__in'] ) ); - $where .= " AND {$wpdb->posts}.post_parent IN ($post_parent__in)"; - } elseif ( $q['post_parent__not_in'] ) { - $post_parent__not_in = implode( ',', array_map( 'absint', $q['post_parent__not_in'] ) ); - $where .= " AND {$wpdb->posts}.post_parent NOT IN ($post_parent__not_in)"; - } - - if ( $q['page_id'] ) { - if ( ('page' != get_option('show_on_front') ) || ( $q['page_id'] != get_option('page_for_posts') ) ) { - $q['p'] = $q['page_id']; - $where = " AND {$wpdb->posts}.ID = " . $q['page_id']; - } - } - - // If a search pattern is specified, load the posts that match. - if ( strlen( $q['s'] ) ) { - $search = $this->parse_search( $q ); - } - - if ( ! $q['suppress_filters'] ) { - /** - * Filters the search SQL that is used in the WHERE clause of WP_Query. - * - * @since 3.0.0 - * - * @param string $search Search SQL for WHERE clause. - * @param WP_Query $this The current WP_Query object. - */ - $search = apply_filters_ref_array( 'posts_search', array( $search, &$this ) ); - } - - // Taxonomies - if ( !$this->is_singular ) { - $this->parse_tax_query( $q ); - - $clauses = $this->tax_query->get_sql( $wpdb->posts, 'ID' ); - - $join .= $clauses['join']; - $where .= $clauses['where']; - } - - if ( $this->is_tax ) { - if ( empty($post_type) ) { - // Do a fully inclusive search for currently registered post types of queried taxonomies - $post_type = array(); - $taxonomies = array_keys( $this->tax_query->queried_terms ); - foreach ( get_post_types( array( 'exclude_from_search' => false ) ) as $pt ) { - $object_taxonomies = $pt === 'attachment' ? get_taxonomies_for_attachments() : get_object_taxonomies( $pt ); - if ( array_intersect( $taxonomies, $object_taxonomies ) ) - $post_type[] = $pt; - } - if ( ! $post_type ) - $post_type = 'any'; - elseif ( count( $post_type ) == 1 ) - $post_type = $post_type[0]; - - $post_status_join = true; - } elseif ( in_array('attachment', (array) $post_type) ) { - $post_status_join = true; - } - } - - /* - * Ensure that 'taxonomy', 'term', 'term_id', 'cat', and - * 'category_name' vars are set for backward compatibility. - */ - if ( ! empty( $this->tax_query->queried_terms ) ) { - - /* - * Set 'taxonomy', 'term', and 'term_id' to the - * first taxonomy other than 'post_tag' or 'category'. - */ - if ( ! isset( $q['taxonomy'] ) ) { - foreach ( $this->tax_query->queried_terms as $queried_taxonomy => $queried_items ) { - if ( empty( $queried_items['terms'][0] ) ) { - continue; - } - - if ( ! in_array( $queried_taxonomy, array( 'category', 'post_tag' ) ) ) { - $q['taxonomy'] = $queried_taxonomy; - - if ( 'slug' === $queried_items['field'] ) { - $q['term'] = $queried_items['terms'][0]; - } else { - $q['term_id'] = $queried_items['terms'][0]; - } - - // Take the first one we find. - break; - } - } - } - - // 'cat', 'category_name', 'tag_id' - foreach ( $this->tax_query->queried_terms as $queried_taxonomy => $queried_items ) { - if ( empty( $queried_items['terms'][0] ) ) { - continue; - } - - if ( 'category' === $queried_taxonomy ) { - $the_cat = get_term_by( $queried_items['field'], $queried_items['terms'][0], 'category' ); - if ( $the_cat ) { - $this->set( 'cat', $the_cat->term_id ); - $this->set( 'category_name', $the_cat->slug ); - } - unset( $the_cat ); - } - - if ( 'post_tag' === $queried_taxonomy ) { - $the_tag = get_term_by( $queried_items['field'], $queried_items['terms'][0], 'post_tag' ); - if ( $the_tag ) { - $this->set( 'tag_id', $the_tag->term_id ); - } - unset( $the_tag ); - } - } - } - - if ( !empty( $this->tax_query->queries ) || !empty( $this->meta_query->queries ) ) { - $groupby = "{$wpdb->posts}.ID"; - } - - // Author/user stuff - - if ( ! empty( $q['author'] ) && $q['author'] != '0' ) { - $q['author'] = addslashes_gpc( '' . urldecode( $q['author'] ) ); - $authors = array_unique( array_map( 'intval', preg_split( '/[,\s]+/', $q['author'] ) ) ); - foreach ( $authors as $author ) { - $key = $author > 0 ? 'author__in' : 'author__not_in'; - $q[$key][] = abs( $author ); - } - $q['author'] = implode( ',', $authors ); - } - - if ( ! empty( $q['author__not_in'] ) ) { - $author__not_in = implode( ',', array_map( 'absint', array_unique( (array) $q['author__not_in'] ) ) ); - $where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) "; - } elseif ( ! empty( $q['author__in'] ) ) { - $author__in = implode( ',', array_map( 'absint', array_unique( (array) $q['author__in'] ) ) ); - $where .= " AND {$wpdb->posts}.post_author IN ($author__in) "; - } - - // Author stuff for nice URLs - - if ( '' != $q['author_name'] ) { - if ( strpos($q['author_name'], '/') !== false ) { - $q['author_name'] = explode('/', $q['author_name']); - if ( $q['author_name'][ count($q['author_name'])-1 ] ) { - $q['author_name'] = $q['author_name'][count($q['author_name'])-1]; // no trailing slash - } else { - $q['author_name'] = $q['author_name'][count($q['author_name'])-2]; // there was a trailing slash - } - } - $q['author_name'] = sanitize_title_for_query( $q['author_name'] ); - $q['author'] = get_user_by('slug', $q['author_name']); - if ( $q['author'] ) - $q['author'] = $q['author']->ID; - $whichauthor .= " AND ({$wpdb->posts}.post_author = " . absint($q['author']) . ')'; - } - - // MIME-Type stuff for attachment browsing - - if ( isset( $q['post_mime_type'] ) && '' != $q['post_mime_type'] ) { - $whichmimetype = wp_post_mime_type_where( $q['post_mime_type'], $wpdb->posts ); - } - $where .= $search . $whichauthor . $whichmimetype; - - if ( ! empty( $this->meta_query->queries ) ) { - $clauses = $this->meta_query->get_sql( 'post', $wpdb->posts, 'ID', $this ); - $join .= $clauses['join']; - $where .= $clauses['where']; - } - - $rand = ( isset( $q['orderby'] ) && 'rand' === $q['orderby'] ); - if ( ! isset( $q['order'] ) ) { - $q['order'] = $rand ? '' : 'DESC'; - } else { - $q['order'] = $rand ? '' : $this->parse_order( $q['order'] ); - } - - // Order by. - if ( empty( $q['orderby'] ) ) { - /* - * Boolean false or empty array blanks out ORDER BY, - * while leaving the value unset or otherwise empty sets the default. - */ - if ( isset( $q['orderby'] ) && ( is_array( $q['orderby'] ) || false === $q['orderby'] ) ) { - $orderby = ''; - } else { - $orderby = "{$wpdb->posts}.post_date " . $q['order']; - } - } elseif ( 'none' == $q['orderby'] ) { - $orderby = ''; - } elseif ( $q['orderby'] == 'post__in' && ! empty( $post__in ) ) { - $orderby = "FIELD( {$wpdb->posts}.ID, $post__in )"; - } elseif ( $q['orderby'] == 'post_parent__in' && ! empty( $post_parent__in ) ) { - $orderby = "FIELD( {$wpdb->posts}.post_parent, $post_parent__in )"; - } elseif ( $q['orderby'] == 'post_name__in' && ! empty( $post_name__in ) ) { - $orderby = "FIELD( {$wpdb->posts}.post_name, $post_name__in )"; - } else { - $orderby_array = array(); - if ( is_array( $q['orderby'] ) ) { - foreach ( $q['orderby'] as $_orderby => $order ) { - $orderby = addslashes_gpc( urldecode( $_orderby ) ); - $parsed = $this->parse_orderby( $orderby ); - - if ( ! $parsed ) { - continue; - } - - $orderby_array[] = $parsed . ' ' . $this->parse_order( $order ); - } - $orderby = implode( ', ', $orderby_array ); - - } else { - $q['orderby'] = urldecode( $q['orderby'] ); - $q['orderby'] = addslashes_gpc( $q['orderby'] ); - - foreach ( explode( ' ', $q['orderby'] ) as $i => $orderby ) { - $parsed = $this->parse_orderby( $orderby ); - // Only allow certain values for safety. - if ( ! $parsed ) { - continue; - } - - $orderby_array[] = $parsed; - } - $orderby = implode( ' ' . $q['order'] . ', ', $orderby_array ); - - if ( empty( $orderby ) ) { - $orderby = "{$wpdb->posts}.post_date " . $q['order']; - } elseif ( ! empty( $q['order'] ) ) { - $orderby .= " {$q['order']}"; - } - } - } - - // Order search results by relevance only when another "orderby" is not specified in the query. - if ( ! empty( $q['s'] ) ) { - $search_orderby = ''; - if ( ! empty( $q['search_orderby_title'] ) && ( empty( $q['orderby'] ) && ! $this->is_feed ) || ( isset( $q['orderby'] ) && 'relevance' === $q['orderby'] ) ) - $search_orderby = $this->parse_search_order( $q ); - - if ( ! $q['suppress_filters'] ) { - /** - * Filters the ORDER BY used when ordering search results. - * - * @since 3.7.0 - * - * @param string $search_orderby The ORDER BY clause. - * @param WP_Query $this The current WP_Query instance. - */ - $search_orderby = apply_filters( 'posts_search_orderby', $search_orderby, $this ); - } - - if ( $search_orderby ) - $orderby = $orderby ? $search_orderby . ', ' . $orderby : $search_orderby; - } - - if ( is_array( $post_type ) && count( $post_type ) > 1 ) { - $post_type_cap = 'multiple_post_type'; - } else { - if ( is_array( $post_type ) ) - $post_type = reset( $post_type ); - $post_type_object = get_post_type_object( $post_type ); - if ( empty( $post_type_object ) ) - $post_type_cap = $post_type; - } - - if ( isset( $q['post_password'] ) ) { - $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_password = %s", $q['post_password'] ); - if ( empty( $q['perm'] ) ) { - $q['perm'] = 'readable'; - } - } elseif ( isset( $q['has_password'] ) ) { - $where .= sprintf( " AND {$wpdb->posts}.post_password %s ''", $q['has_password'] ? '!=' : '=' ); - } - - if ( ! empty( $q['comment_status'] ) ) { - $where .= $wpdb->prepare( " AND {$wpdb->posts}.comment_status = %s ", $q['comment_status'] ); - } - - if ( ! empty( $q['ping_status'] ) ) { - $where .= $wpdb->prepare( " AND {$wpdb->posts}.ping_status = %s ", $q['ping_status'] ); - } - - if ( 'any' == $post_type ) { - $in_search_post_types = get_post_types( array('exclude_from_search' => false) ); - if ( empty( $in_search_post_types ) ) { - $where .= ' AND 1=0 '; - } else { - $where .= " AND {$wpdb->posts}.post_type IN ('" . join( "', '", array_map( 'esc_sql', $in_search_post_types ) ) . "')"; - } - } elseif ( !empty( $post_type ) && is_array( $post_type ) ) { - $where .= " AND {$wpdb->posts}.post_type IN ('" . join("', '", esc_sql( $post_type ) ) . "')"; - } elseif ( ! empty( $post_type ) ) { - $where .= $wpdb->prepare( " AND {$wpdb->posts}.post_type = %s", $post_type ); - $post_type_object = get_post_type_object ( $post_type ); - } elseif ( $this->is_attachment ) { - $where .= " AND {$wpdb->posts}.post_type = 'attachment'"; - $post_type_object = get_post_type_object ( 'attachment' ); - } elseif ( $this->is_page ) { - $where .= " AND {$wpdb->posts}.post_type = 'page'"; - $post_type_object = get_post_type_object ( 'page' ); - } else { - $where .= " AND {$wpdb->posts}.post_type = 'post'"; - $post_type_object = get_post_type_object ( 'post' ); - } - - $edit_cap = 'edit_post'; - $read_cap = 'read_post'; - - if ( ! empty( $post_type_object ) ) { - $edit_others_cap = $post_type_object->cap->edit_others_posts; - $read_private_cap = $post_type_object->cap->read_private_posts; - } else { - $edit_others_cap = 'edit_others_' . $post_type_cap . 's'; - $read_private_cap = 'read_private_' . $post_type_cap . 's'; - } - - $user_id = get_current_user_id(); - - $q_status = array(); - if ( ! empty( $q['post_status'] ) ) { - $statuswheres = array(); - $q_status = $q['post_status']; - if ( ! is_array( $q_status ) ) - $q_status = explode(',', $q_status); - $r_status = array(); - $p_status = array(); - $e_status = array(); - if ( in_array( 'any', $q_status ) ) { - foreach ( get_post_stati( array( 'exclude_from_search' => true ) ) as $status ) { - if ( ! in_array( $status, $q_status ) ) { - $e_status[] = "{$wpdb->posts}.post_status <> '$status'"; - } - } - } else { - foreach ( get_post_stati() as $status ) { - if ( in_array( $status, $q_status ) ) { - if ( 'private' == $status ) { - $p_status[] = "{$wpdb->posts}.post_status = '$status'"; - } else { - $r_status[] = "{$wpdb->posts}.post_status = '$status'"; - } - } - } - } - - if ( empty($q['perm'] ) || 'readable' != $q['perm'] ) { - $r_status = array_merge($r_status, $p_status); - unset($p_status); - } - - if ( !empty($e_status) ) { - $statuswheres[] = "(" . join( ' AND ', $e_status ) . ")"; - } - if ( !empty($r_status) ) { - if ( !empty($q['perm'] ) && 'editable' == $q['perm'] && !current_user_can($edit_others_cap) ) { - $statuswheres[] = "({$wpdb->posts}.post_author = $user_id " . "AND (" . join( ' OR ', $r_status ) . "))"; - } else { - $statuswheres[] = "(" . join( ' OR ', $r_status ) . ")"; - } - } - if ( !empty($p_status) ) { - if ( !empty($q['perm'] ) && 'readable' == $q['perm'] && !current_user_can($read_private_cap) ) { - $statuswheres[] = "({$wpdb->posts}.post_author = $user_id " . "AND (" . join( ' OR ', $p_status ) . "))"; - } else { - $statuswheres[] = "(" . join( ' OR ', $p_status ) . ")"; - } - } - if ( $post_status_join ) { - $join .= " LEFT JOIN {$wpdb->posts} AS p2 ON ({$wpdb->posts}.post_parent = p2.ID) "; - foreach ( $statuswheres as $index => $statuswhere ) { - $statuswheres[$index] = "($statuswhere OR ({$wpdb->posts}.post_status = 'inherit' AND " . str_replace( $wpdb->posts, 'p2', $statuswhere ) . "))"; - } - } - $where_status = implode( ' OR ', $statuswheres ); - if ( ! empty( $where_status ) ) { - $where .= " AND ($where_status)"; - } - } elseif ( !$this->is_singular ) { - $where .= " AND ({$wpdb->posts}.post_status = 'publish'"; - - // Add public states. - $public_states = get_post_stati( array('public' => true) ); - foreach ( (array) $public_states as $state ) { - if ( 'publish' == $state ) // Publish is hard-coded above. - continue; - $where .= " OR {$wpdb->posts}.post_status = '$state'"; - } - - if ( $this->is_admin ) { - // Add protected states that should show in the admin all list. - $admin_all_states = get_post_stati( array('protected' => true, 'show_in_admin_all_list' => true) ); - foreach ( (array) $admin_all_states as $state ) { - $where .= " OR {$wpdb->posts}.post_status = '$state'"; - } - } - - if ( is_user_logged_in() ) { - // Add private states that are limited to viewing by the author of a post or someone who has caps to read private states. - $private_states = get_post_stati( array('private' => true) ); - foreach ( (array) $private_states as $state ) { - $where .= current_user_can( $read_private_cap ) ? " OR {$wpdb->posts}.post_status = '$state'" : " OR {$wpdb->posts}.post_author = $user_id AND {$wpdb->posts}.post_status = '$state'"; - } - } - - $where .= ')'; - } - - /* - * Apply filters on where and join prior to paging so that any - * manipulations to them are reflected in the paging by day queries. - */ - if ( !$q['suppress_filters'] ) { - /** - * Filters the WHERE clause of the query. - * - * @since 1.5.0 - * - * @param string $where The WHERE clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $where = apply_filters_ref_array( 'posts_where', array( $where, &$this ) ); - - /** - * Filters the JOIN clause of the query. - * - * @since 1.5.0 - * - * @param string $where The JOIN clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $join = apply_filters_ref_array( 'posts_join', array( $join, &$this ) ); - } - - // Paging - if ( empty($q['nopaging']) && !$this->is_singular ) { - $page = absint($q['paged']); - if ( !$page ) - $page = 1; - - // If 'offset' is provided, it takes precedence over 'paged'. - if ( isset( $q['offset'] ) && is_numeric( $q['offset'] ) ) { - $q['offset'] = absint( $q['offset'] ); - $pgstrt = $q['offset'] . ', '; - } else { - $pgstrt = absint( ( $page - 1 ) * $q['posts_per_page'] ) . ', '; - } - $limits = 'LIMIT ' . $pgstrt . $q['posts_per_page']; - } - - // Comments feeds - if ( $this->is_comment_feed && ! $this->is_singular ) { - if ( $this->is_archive || $this->is_search ) { - $cjoin = "JOIN {$wpdb->posts} ON ({$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID) $join "; - $cwhere = "WHERE comment_approved = '1' $where"; - $cgroupby = "{$wpdb->comments}.comment_id"; - } else { // Other non singular e.g. front - $cjoin = "JOIN {$wpdb->posts} ON ( {$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID )"; - $cwhere = "WHERE ( post_status = 'publish' OR ( post_status = 'inherit' AND post_type = 'attachment' ) ) AND comment_approved = '1'"; - $cgroupby = ''; - } - - if ( !$q['suppress_filters'] ) { - /** - * Filters the JOIN clause of the comments feed query before sending. - * - * @since 2.2.0 - * - * @param string $cjoin The JOIN clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $cjoin = apply_filters_ref_array( 'comment_feed_join', array( $cjoin, &$this ) ); - - /** - * Filters the WHERE clause of the comments feed query before sending. - * - * @since 2.2.0 - * - * @param string $cwhere The WHERE clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $cwhere = apply_filters_ref_array( 'comment_feed_where', array( $cwhere, &$this ) ); - - /** - * Filters the GROUP BY clause of the comments feed query before sending. - * - * @since 2.2.0 - * - * @param string $cgroupby The GROUP BY clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $cgroupby = apply_filters_ref_array( 'comment_feed_groupby', array( $cgroupby, &$this ) ); - - /** - * Filters the ORDER BY clause of the comments feed query before sending. - * - * @since 2.8.0 - * - * @param string $corderby The ORDER BY clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $corderby = apply_filters_ref_array( 'comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) ); - - /** - * Filters the LIMIT clause of the comments feed query before sending. - * - * @since 2.8.0 - * - * @param string $climits The JOIN clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $climits = apply_filters_ref_array( 'comment_feed_limits', array( 'LIMIT ' . get_option('posts_per_rss'), &$this ) ); - } - $cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : ''; - $corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : ''; - - $comments = (array) $wpdb->get_results("SELECT $distinct {$wpdb->comments}.* FROM {$wpdb->comments} $cjoin $cwhere $cgroupby $corderby $climits"); - // Convert to WP_Comment - $this->comments = array_map( 'get_comment', $comments ); - $this->comment_count = count($this->comments); - - $post_ids = array(); - - foreach ( $this->comments as $comment ) - $post_ids[] = (int) $comment->comment_post_ID; - - $post_ids = join(',', $post_ids); - $join = ''; - if ( $post_ids ) { - $where = "AND {$wpdb->posts}.ID IN ($post_ids) "; - } else { - $where = "AND 0"; - } - } - - $pieces = array( 'where', 'groupby', 'join', 'orderby', 'distinct', 'fields', 'limits' ); - - /* - * Apply post-paging filters on where and join. Only plugins that - * manipulate paging queries should use these hooks. - */ - if ( !$q['suppress_filters'] ) { - /** - * Filters the WHERE clause of the query. - * - * Specifically for manipulating paging queries. - * - * @since 1.5.0 - * - * @param string $where The WHERE clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $where = apply_filters_ref_array( 'posts_where_paged', array( $where, &$this ) ); - - /** - * Filters the GROUP BY clause of the query. - * - * @since 2.0.0 - * - * @param string $groupby The GROUP BY clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $groupby = apply_filters_ref_array( 'posts_groupby', array( $groupby, &$this ) ); - - /** - * Filters the JOIN clause of the query. - * - * Specifically for manipulating paging queries. - * - * @since 1.5.0 - * - * @param string $join The JOIN clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $join = apply_filters_ref_array( 'posts_join_paged', array( $join, &$this ) ); - - /** - * Filters the ORDER BY clause of the query. - * - * @since 1.5.1 - * - * @param string $orderby The ORDER BY clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $orderby = apply_filters_ref_array( 'posts_orderby', array( $orderby, &$this ) ); - - /** - * Filters the DISTINCT clause of the query. - * - * @since 2.1.0 - * - * @param string $distinct The DISTINCT clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $distinct = apply_filters_ref_array( 'posts_distinct', array( $distinct, &$this ) ); - - /** - * Filters the LIMIT clause of the query. - * - * @since 2.1.0 - * - * @param string $limits The LIMIT clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $limits = apply_filters_ref_array( 'post_limits', array( $limits, &$this ) ); - - /** - * Filters the SELECT clause of the query. - * - * @since 2.1.0 - * - * @param string $fields The SELECT clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $fields = apply_filters_ref_array( 'posts_fields', array( $fields, &$this ) ); - - /** - * Filters all query clauses at once, for convenience. - * - * Covers the WHERE, GROUP BY, JOIN, ORDER BY, DISTINCT, - * fields (SELECT), and LIMITS clauses. - * - * @since 3.1.0 - * - * @param array $clauses The list of clauses for the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $clauses = (array) apply_filters_ref_array( 'posts_clauses', array( compact( $pieces ), &$this ) ); - - $where = isset( $clauses[ 'where' ] ) ? $clauses[ 'where' ] : ''; - $groupby = isset( $clauses[ 'groupby' ] ) ? $clauses[ 'groupby' ] : ''; - $join = isset( $clauses[ 'join' ] ) ? $clauses[ 'join' ] : ''; - $orderby = isset( $clauses[ 'orderby' ] ) ? $clauses[ 'orderby' ] : ''; - $distinct = isset( $clauses[ 'distinct' ] ) ? $clauses[ 'distinct' ] : ''; - $fields = isset( $clauses[ 'fields' ] ) ? $clauses[ 'fields' ] : ''; - $limits = isset( $clauses[ 'limits' ] ) ? $clauses[ 'limits' ] : ''; - } - - /** - * Fires to announce the query's current selection parameters. - * - * For use by caching plugins. - * - * @since 2.3.0 - * - * @param string $selection The assembled selection query. - */ - do_action( 'posts_selection', $where . $groupby . $orderby . $limits . $join ); - - /* - * Filters again for the benefit of caching plugins. - * Regular plugins should use the hooks above. - */ - if ( !$q['suppress_filters'] ) { - /** - * Filters the WHERE clause of the query. - * - * For use by caching plugins. - * - * @since 2.5.0 - * - * @param string $where The WHERE clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $where = apply_filters_ref_array( 'posts_where_request', array( $where, &$this ) ); - - /** - * Filters the GROUP BY clause of the query. - * - * For use by caching plugins. - * - * @since 2.5.0 - * - * @param string $groupby The GROUP BY clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $groupby = apply_filters_ref_array( 'posts_groupby_request', array( $groupby, &$this ) ); - - /** - * Filters the JOIN clause of the query. - * - * For use by caching plugins. - * - * @since 2.5.0 - * - * @param string $join The JOIN clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $join = apply_filters_ref_array( 'posts_join_request', array( $join, &$this ) ); - - /** - * Filters the ORDER BY clause of the query. - * - * For use by caching plugins. - * - * @since 2.5.0 - * - * @param string $orderby The ORDER BY clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $orderby = apply_filters_ref_array( 'posts_orderby_request', array( $orderby, &$this ) ); - - /** - * Filters the DISTINCT clause of the query. - * - * For use by caching plugins. - * - * @since 2.5.0 - * - * @param string $distinct The DISTINCT clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $distinct = apply_filters_ref_array( 'posts_distinct_request', array( $distinct, &$this ) ); - - /** - * Filters the SELECT clause of the query. - * - * For use by caching plugins. - * - * @since 2.5.0 - * - * @param string $fields The SELECT clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $fields = apply_filters_ref_array( 'posts_fields_request', array( $fields, &$this ) ); - - /** - * Filters the LIMIT clause of the query. - * - * For use by caching plugins. - * - * @since 2.5.0 - * - * @param string $limits The LIMIT clause of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $limits = apply_filters_ref_array( 'post_limits_request', array( $limits, &$this ) ); - - /** - * Filters all query clauses at once, for convenience. - * - * For use by caching plugins. - * - * Covers the WHERE, GROUP BY, JOIN, ORDER BY, DISTINCT, - * fields (SELECT), and LIMITS clauses. - * - * @since 3.1.0 - * - * @param array $pieces The pieces of the query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) ); - - $where = isset( $clauses[ 'where' ] ) ? $clauses[ 'where' ] : ''; - $groupby = isset( $clauses[ 'groupby' ] ) ? $clauses[ 'groupby' ] : ''; - $join = isset( $clauses[ 'join' ] ) ? $clauses[ 'join' ] : ''; - $orderby = isset( $clauses[ 'orderby' ] ) ? $clauses[ 'orderby' ] : ''; - $distinct = isset( $clauses[ 'distinct' ] ) ? $clauses[ 'distinct' ] : ''; - $fields = isset( $clauses[ 'fields' ] ) ? $clauses[ 'fields' ] : ''; - $limits = isset( $clauses[ 'limits' ] ) ? $clauses[ 'limits' ] : ''; - } - - if ( ! empty($groupby) ) - $groupby = 'GROUP BY ' . $groupby; - if ( !empty( $orderby ) ) - $orderby = 'ORDER BY ' . $orderby; - - $found_rows = ''; - if ( !$q['no_found_rows'] && !empty($limits) ) - $found_rows = 'SQL_CALC_FOUND_ROWS'; - - $this->request = $old_request = "SELECT $found_rows $distinct $fields FROM {$wpdb->posts} $join WHERE 1=1 $where $groupby $orderby $limits"; - - if ( !$q['suppress_filters'] ) { - /** - * Filters the completed SQL query before sending. - * - * @since 2.0.0 - * - * @param string $request The complete SQL query. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $this->request = apply_filters_ref_array( 'posts_request', array( $this->request, &$this ) ); - } - - /** - * Filters the posts array before the query takes place. - * - * Return a non-null value to bypass WordPress's default post queries. - * - * Filtering functions that require pagination information are encouraged to set - * the `found_posts` and `max_num_pages` properties of the WP_Query object, - * passed to the filter by reference. If WP_Query does not perform a database - * query, it will not have enough information to generate these values itself. - * - * @since 4.6.0 - * - * @param array|null $posts Return an array of post data to short-circuit WP's query, - * or null to allow WP to run its normal queries. - * @param WP_Query $this The WP_Query instance, passed by reference. - */ - $this->posts = apply_filters_ref_array( 'posts_pre_query', array( null, &$this ) ); - - if ( 'ids' == $q['fields'] ) { - if ( null === $this->posts ) { - $this->posts = $wpdb->get_col( $this->request ); - } - - $this->posts = array_map( 'intval', $this->posts ); - $this->post_count = count( $this->posts ); - $this->set_found_posts( $q, $limits ); - - return $this->posts; - } - - if ( 'id=>parent' == $q['fields'] ) { - if ( null === $this->posts ) { - $this->posts = $wpdb->get_results( $this->request ); - } - - $this->post_count = count( $this->posts ); - $this->set_found_posts( $q, $limits ); - - $r = array(); - foreach ( $this->posts as $key => $post ) { - $this->posts[ $key ]->ID = (int) $post->ID; - $this->posts[ $key ]->post_parent = (int) $post->post_parent; - - $r[ (int) $post->ID ] = (int) $post->post_parent; - } - - return $r; - } - - if ( null === $this->posts ) { - $split_the_query = ( $old_request == $this->request && "{$wpdb->posts}.*" == $fields && !empty( $limits ) && $q['posts_per_page'] < 500 ); - - /** - * Filters whether to split the query. - * - * Splitting the query will cause it to fetch just the IDs of the found posts - * (and then individually fetch each post by ID), rather than fetching every - * complete row at once. One massive result vs. many small results. - * - * @since 3.4.0 - * - * @param bool $split_the_query Whether or not to split the query. - * @param WP_Query $this The WP_Query instance. - */ - $split_the_query = apply_filters( 'split_the_query', $split_the_query, $this ); - - if ( $split_the_query ) { - // First get the IDs and then fill in the objects - - $this->request = "SELECT $found_rows $distinct {$wpdb->posts}.ID FROM {$wpdb->posts} $join WHERE 1=1 $where $groupby $orderby $limits"; - - /** - * Filters the Post IDs SQL request before sending. - * - * @since 3.4.0 - * - * @param string $request The post ID request. - * @param WP_Query $this The WP_Query instance. - */ - $this->request = apply_filters( 'posts_request_ids', $this->request, $this ); - - $ids = $wpdb->get_col( $this->request ); - - if ( $ids ) { - $this->posts = $ids; - $this->set_found_posts( $q, $limits ); - _prime_post_caches( $ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] ); - } else { - $this->posts = array(); - } - } else { - $this->posts = $wpdb->get_results( $this->request ); - $this->set_found_posts( $q, $limits ); - } - } - - // Convert to WP_Post objects. - if ( $this->posts ) { - $this->posts = array_map( 'get_post', $this->posts ); - } - - if ( ! $q['suppress_filters'] ) { - /** - * Filters the raw post results array, prior to status checks. - * - * @since 2.3.0 - * - * @param array $posts The post results array. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $this->posts = apply_filters_ref_array( 'posts_results', array( $this->posts, &$this ) ); - } - - if ( !empty($this->posts) && $this->is_comment_feed && $this->is_singular ) { - /** This filter is documented in wp-includes/query.php */ - $cjoin = apply_filters_ref_array( 'comment_feed_join', array( '', &$this ) ); - - /** This filter is documented in wp-includes/query.php */ - $cwhere = apply_filters_ref_array( 'comment_feed_where', array( "WHERE comment_post_ID = '{$this->posts[0]->ID}' AND comment_approved = '1'", &$this ) ); - - /** This filter is documented in wp-includes/query.php */ - $cgroupby = apply_filters_ref_array( 'comment_feed_groupby', array( '', &$this ) ); - $cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : ''; - - /** This filter is documented in wp-includes/query.php */ - $corderby = apply_filters_ref_array( 'comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) ); - $corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : ''; - - /** This filter is documented in wp-includes/query.php */ - $climits = apply_filters_ref_array( 'comment_feed_limits', array( 'LIMIT ' . get_option('posts_per_rss'), &$this ) ); - - $comments_request = "SELECT {$wpdb->comments}.* FROM {$wpdb->comments} $cjoin $cwhere $cgroupby $corderby $climits"; - $comments = $wpdb->get_results($comments_request); - // Convert to WP_Comment - $this->comments = array_map( 'get_comment', $comments ); - $this->comment_count = count($this->comments); - } - - // Check post status to determine if post should be displayed. - if ( !empty($this->posts) && ($this->is_single || $this->is_page) ) { - $status = get_post_status($this->posts[0]); - if ( 'attachment' === $this->posts[0]->post_type && 0 === (int) $this->posts[0]->post_parent ) { - $this->is_page = false; - $this->is_single = true; - $this->is_attachment = true; - } - $post_status_obj = get_post_status_object($status); - - // If the post_status was specifically requested, let it pass through. - if ( !$post_status_obj->public && ! in_array( $status, $q_status ) ) { - - if ( ! is_user_logged_in() ) { - // User must be logged in to view unpublished posts. - $this->posts = array(); - } else { - if ( $post_status_obj->protected ) { - // User must have edit permissions on the draft to preview. - if ( ! current_user_can($edit_cap, $this->posts[0]->ID) ) { - $this->posts = array(); - } else { - $this->is_preview = true; - if ( 'future' != $status ) - $this->posts[0]->post_date = current_time('mysql'); - } - } elseif ( $post_status_obj->private ) { - if ( ! current_user_can($read_cap, $this->posts[0]->ID) ) - $this->posts = array(); - } else { - $this->posts = array(); - } - } - } - - if ( $this->is_preview && $this->posts && current_user_can( $edit_cap, $this->posts[0]->ID ) ) { - /** - * Filters the single post for preview mode. - * - * @since 2.7.0 - * - * @param WP_Post $post_preview The Post object. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $this->posts[0] = get_post( apply_filters_ref_array( 'the_preview', array( $this->posts[0], &$this ) ) ); - } - } - - // Put sticky posts at the top of the posts array - $sticky_posts = get_option('sticky_posts'); - if ( $this->is_home && $page <= 1 && is_array($sticky_posts) && !empty($sticky_posts) && !$q['ignore_sticky_posts'] ) { - $num_posts = count($this->posts); - $sticky_offset = 0; - // Loop over posts and relocate stickies to the front. - for ( $i = 0; $i < $num_posts; $i++ ) { - if ( in_array($this->posts[$i]->ID, $sticky_posts) ) { - $sticky_post = $this->posts[$i]; - // Remove sticky from current position - array_splice($this->posts, $i, 1); - // Move to front, after other stickies - array_splice($this->posts, $sticky_offset, 0, array($sticky_post)); - // Increment the sticky offset. The next sticky will be placed at this offset. - $sticky_offset++; - // Remove post from sticky posts array - $offset = array_search($sticky_post->ID, $sticky_posts); - unset( $sticky_posts[$offset] ); - } - } - - // If any posts have been excluded specifically, Ignore those that are sticky. - if ( !empty($sticky_posts) && !empty($q['post__not_in']) ) - $sticky_posts = array_diff($sticky_posts, $q['post__not_in']); - - // Fetch sticky posts that weren't in the query results - if ( !empty($sticky_posts) ) { - $stickies = get_posts( array( - 'post__in' => $sticky_posts, - 'post_type' => $post_type, - 'post_status' => 'publish', - 'nopaging' => true - ) ); - - foreach ( $stickies as $sticky_post ) { - array_splice( $this->posts, $sticky_offset, 0, array( $sticky_post ) ); - $sticky_offset++; - } - } - } - - // If comments have been fetched as part of the query, make sure comment meta lazy-loading is set up. - if ( ! empty( $this->comments ) ) { - wp_queue_comments_for_comment_meta_lazyload( $this->comments ); - } - - if ( ! $q['suppress_filters'] ) { - /** - * Filters the array of retrieved posts after they've been fetched and - * internally processed. - * - * @since 1.5.0 - * - * @param array $posts The array of retrieved posts. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $this->posts = apply_filters_ref_array( 'the_posts', array( $this->posts, &$this ) ); - } - - // Ensure that any posts added/modified via one of the filters above are - // of the type WP_Post and are filtered. - if ( $this->posts ) { - $this->post_count = count( $this->posts ); - - $this->posts = array_map( 'get_post', $this->posts ); - - if ( $q['cache_results'] ) - update_post_caches($this->posts, $post_type, $q['update_post_term_cache'], $q['update_post_meta_cache']); - - $this->post = reset( $this->posts ); - } else { - $this->post_count = 0; - $this->posts = array(); - } - - if ( $q['lazy_load_term_meta'] ) { - wp_queue_posts_for_term_meta_lazyload( $this->posts ); - } - - return $this->posts; - } - - /** - * Set up the amount of found posts and the number of pages (if limit clause was used) - * for the current query. - * - * @since 3.5.0 - * @access private - * - * @param array $q Query variables. - * @param string $limits LIMIT clauses of the query. - */ - private function set_found_posts( $q, $limits ) { - global $wpdb; - // Bail if posts is an empty array. Continue if posts is an empty string, - // null, or false to accommodate caching plugins that fill posts later. - if ( $q['no_found_rows'] || ( is_array( $this->posts ) && ! $this->posts ) ) - return; - - if ( ! empty( $limits ) ) { - /** - * Filters the query to run for retrieving the found posts. - * - * @since 2.1.0 - * - * @param string $found_posts The query to run to find the found posts. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $this->found_posts = $wpdb->get_var( apply_filters_ref_array( 'found_posts_query', array( 'SELECT FOUND_ROWS()', &$this ) ) ); - } else { - $this->found_posts = count( $this->posts ); - } - - /** - * Filters the number of found posts for the query. - * - * @since 2.1.0 - * - * @param int $found_posts The number of posts found. - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - $this->found_posts = apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) ); - - if ( ! empty( $limits ) ) - $this->max_num_pages = ceil( $this->found_posts / $q['posts_per_page'] ); - } - - /** - * Set up the next post and iterate current post index. - * - * @since 1.5.0 - * @access public - * - * @return WP_Post Next post. - */ - public function next_post() { - - $this->current_post++; - - $this->post = $this->posts[$this->current_post]; - return $this->post; - } - - /** - * Sets up the current post. - * - * Retrieves the next post, sets up the post, sets the 'in the loop' - * property to true. - * - * @since 1.5.0 - * @access public - * - * @global WP_Post $post - */ - public function the_post() { - global $post; - $this->in_the_loop = true; - - if ( $this->current_post == -1 ) // loop has just started - /** - * Fires once the loop is started. - * - * @since 2.0.0 - * - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - do_action_ref_array( 'loop_start', array( &$this ) ); - - $post = $this->next_post(); - $this->setup_postdata( $post ); - } - - /** - * Determines whether there are more posts available in the loop. - * - * Calls the {@see 'loop_end'} action when the loop is complete. - * - * @since 1.5.0 - * @access public - * - * @return bool True if posts are available, false if end of loop. - */ - public function have_posts() { - if ( $this->current_post + 1 < $this->post_count ) { - return true; - } elseif ( $this->current_post + 1 == $this->post_count && $this->post_count > 0 ) { - /** - * Fires once the loop has ended. - * - * @since 2.0.0 - * - * @param WP_Query &$this The WP_Query instance (passed by reference). - */ - do_action_ref_array( 'loop_end', array( &$this ) ); - // Do some cleaning up after the loop - $this->rewind_posts(); - } - - $this->in_the_loop = false; - return false; - } - - /** - * Rewind the posts and reset post index. - * - * @since 1.5.0 - * @access public - */ - public function rewind_posts() { - $this->current_post = -1; - if ( $this->post_count > 0 ) { - $this->post = $this->posts[0]; - } - } - - /** - * Iterate current comment index and return WP_Comment object. - * - * @since 2.2.0 - * @access public - * - * @return WP_Comment Comment object. - */ - public function next_comment() { - $this->current_comment++; - - $this->comment = $this->comments[$this->current_comment]; - return $this->comment; - } - - /** - * Sets up the current comment. - * - * @since 2.2.0 - * @access public - * @global WP_Comment $comment Current comment. - */ - public function the_comment() { - global $comment; - - $comment = $this->next_comment(); - - if ( $this->current_comment == 0 ) { - /** - * Fires once the comment loop is started. - * - * @since 2.2.0 - */ - do_action( 'comment_loop_start' ); - } - } - - /** - * Whether there are more comments available. - * - * Automatically rewinds comments when finished. - * - * @since 2.2.0 - * @access public - * - * @return bool True, if more comments. False, if no more posts. - */ - public function have_comments() { - if ( $this->current_comment + 1 < $this->comment_count ) { - return true; - } elseif ( $this->current_comment + 1 == $this->comment_count ) { - $this->rewind_comments(); - } - - return false; - } - - /** - * Rewind the comments, resets the comment index and comment to first. - * - * @since 2.2.0 - * @access public - */ - public function rewind_comments() { - $this->current_comment = -1; - if ( $this->comment_count > 0 ) { - $this->comment = $this->comments[0]; - } - } - - /** - * Sets up the WordPress query by parsing query string. - * - * @since 1.5.0 - * @access public - * - * @param string $query URL query string. - * @return array List of posts. - */ - public function query( $query ) { - $this->init(); - $this->query = $this->query_vars = wp_parse_args( $query ); - return $this->get_posts(); - } - - /** - * Retrieve queried object. - * - * If queried object is not set, then the queried object will be set from - * the category, tag, taxonomy, posts page, single post, page, or author - * query variable. After it is set up, it will be returned. - * - * @since 1.5.0 - * @access public - * - * @return object - */ - public function get_queried_object() { - if ( isset($this->queried_object) ) - return $this->queried_object; - - $this->queried_object = null; - $this->queried_object_id = null; - - if ( $this->is_category || $this->is_tag || $this->is_tax ) { - if ( $this->is_category ) { - if ( $this->get( 'cat' ) ) { - $term = get_term( $this->get( 'cat' ), 'category' ); - } elseif ( $this->get( 'category_name' ) ) { - $term = get_term_by( 'slug', $this->get( 'category_name' ), 'category' ); - } - } elseif ( $this->is_tag ) { - if ( $this->get( 'tag_id' ) ) { - $term = get_term( $this->get( 'tag_id' ), 'post_tag' ); - } elseif ( $this->get( 'tag' ) ) { - $term = get_term_by( 'slug', $this->get( 'tag' ), 'post_tag' ); - } - } else { - // For other tax queries, grab the first term from the first clause. - if ( ! empty( $this->tax_query->queried_terms ) ) { - $queried_taxonomies = array_keys( $this->tax_query->queried_terms ); - $matched_taxonomy = reset( $queried_taxonomies ); - $query = $this->tax_query->queried_terms[ $matched_taxonomy ]; - - if ( ! empty( $query['terms'] ) ) { - if ( 'term_id' == $query['field'] ) { - $term = get_term( reset( $query['terms'] ), $matched_taxonomy ); - } else { - $term = get_term_by( $query['field'], reset( $query['terms'] ), $matched_taxonomy ); - } - } - } - } - - if ( ! empty( $term ) && ! is_wp_error( $term ) ) { - $this->queried_object = $term; - $this->queried_object_id = (int) $term->term_id; - - if ( $this->is_category && 'category' === $this->queried_object->taxonomy ) - _make_cat_compat( $this->queried_object ); - } - } elseif ( $this->is_post_type_archive ) { - $post_type = $this->get( 'post_type' ); - if ( is_array( $post_type ) ) - $post_type = reset( $post_type ); - $this->queried_object = get_post_type_object( $post_type ); - } elseif ( $this->is_posts_page ) { - $page_for_posts = get_option('page_for_posts'); - $this->queried_object = get_post( $page_for_posts ); - $this->queried_object_id = (int) $this->queried_object->ID; - } elseif ( $this->is_singular && ! empty( $this->post ) ) { - $this->queried_object = $this->post; - $this->queried_object_id = (int) $this->post->ID; - } elseif ( $this->is_author ) { - $this->queried_object_id = (int) $this->get('author'); - $this->queried_object = get_userdata( $this->queried_object_id ); - } - - return $this->queried_object; - } - - /** - * Retrieve ID of the current queried object. - * - * @since 1.5.0 - * @access public - * - * @return int - */ - public function get_queried_object_id() { - $this->get_queried_object(); - - if ( isset($this->queried_object_id) ) { - return $this->queried_object_id; - } - - return 0; - } - - /** - * Constructor. - * - * Sets up the WordPress query, if parameter is not empty. - * - * @since 1.5.0 - * @access public - * - * @param string|array $query URL query string or array of vars. - */ - public function __construct( $query = '' ) { - if ( ! empty( $query ) ) { - $this->query( $query ); - } - } - - /** - * Make private properties readable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param string $name Property to get. - * @return mixed Property. - */ - public function __get( $name ) { - if ( in_array( $name, $this->compat_fields ) ) { - return $this->$name; - } - } - - /** - * Make private properties checkable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param string $name Property to check if set. - * @return bool Whether the property is set. - */ - public function __isset( $name ) { - if ( in_array( $name, $this->compat_fields ) ) { - return isset( $this->$name ); - } - } - - /** - * Make private/protected methods readable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param callable $name Method to call. - * @param array $arguments Arguments to pass when calling. - * @return mixed|false Return value of the callback, false otherwise. - */ - public function __call( $name, $arguments ) { - if ( in_array( $name, $this->compat_methods ) ) { - return call_user_func_array( array( $this, $name ), $arguments ); - } - return false; - } - - /** - * Is the query for an existing archive page? - * - * Month, Year, Category, Author, Post Type archive... - * - * @since 3.1.0 - * - * @return bool - */ - public function is_archive() { - return (bool) $this->is_archive; - } - - /** - * Is the query for an existing post type archive page? - * - * @since 3.1.0 - * - * @param mixed $post_types Optional. Post type or array of posts types to check against. - * @return bool - */ - public function is_post_type_archive( $post_types = '' ) { - if ( empty( $post_types ) || ! $this->is_post_type_archive ) - return (bool) $this->is_post_type_archive; - - $post_type = $this->get( 'post_type' ); - if ( is_array( $post_type ) ) - $post_type = reset( $post_type ); - $post_type_object = get_post_type_object( $post_type ); - - return in_array( $post_type_object->name, (array) $post_types ); - } - - /** - * Is the query for an existing attachment page? - * - * @since 3.1.0 - * - * @param mixed $attachment Attachment ID, title, slug, or array of such. - * @return bool - */ - public function is_attachment( $attachment = '' ) { - if ( ! $this->is_attachment ) { - return false; - } - - if ( empty( $attachment ) ) { - return true; - } - - $attachment = array_map( 'strval', (array) $attachment ); - - $post_obj = $this->get_queried_object(); - - if ( in_array( (string) $post_obj->ID, $attachment ) ) { - return true; - } elseif ( in_array( $post_obj->post_title, $attachment ) ) { - return true; - } elseif ( in_array( $post_obj->post_name, $attachment ) ) { - return true; - } - return false; - } - - /** - * Is the query for an existing author archive page? - * - * If the $author parameter is specified, this function will additionally - * check if the query is for one of the authors specified. - * - * @since 3.1.0 - * - * @param mixed $author Optional. User ID, nickname, nicename, or array of User IDs, nicknames, and nicenames - * @return bool - */ - public function is_author( $author = '' ) { - if ( !$this->is_author ) - return false; - - if ( empty($author) ) - return true; - - $author_obj = $this->get_queried_object(); - - $author = array_map( 'strval', (array) $author ); - - if ( in_array( (string) $author_obj->ID, $author ) ) - return true; - elseif ( in_array( $author_obj->nickname, $author ) ) - return true; - elseif ( in_array( $author_obj->user_nicename, $author ) ) - return true; - - return false; - } - - /** - * Is the query for an existing category archive page? - * - * If the $category parameter is specified, this function will additionally - * check if the query is for one of the categories specified. - * - * @since 3.1.0 - * - * @param mixed $category Optional. Category ID, name, slug, or array of Category IDs, names, and slugs. - * @return bool - */ - public function is_category( $category = '' ) { - if ( !$this->is_category ) - return false; - - if ( empty($category) ) - return true; - - $cat_obj = $this->get_queried_object(); - - $category = array_map( 'strval', (array) $category ); - - if ( in_array( (string) $cat_obj->term_id, $category ) ) - return true; - elseif ( in_array( $cat_obj->name, $category ) ) - return true; - elseif ( in_array( $cat_obj->slug, $category ) ) - return true; - - return false; - } - - /** - * Is the query for an existing tag archive page? - * - * If the $tag parameter is specified, this function will additionally - * check if the query is for one of the tags specified. - * - * @since 3.1.0 - * - * @param mixed $tag Optional. Tag ID, name, slug, or array of Tag IDs, names, and slugs. - * @return bool - */ - public function is_tag( $tag = '' ) { - if ( ! $this->is_tag ) - return false; - - if ( empty( $tag ) ) - return true; - - $tag_obj = $this->get_queried_object(); - - $tag = array_map( 'strval', (array) $tag ); - - if ( in_array( (string) $tag_obj->term_id, $tag ) ) - return true; - elseif ( in_array( $tag_obj->name, $tag ) ) - return true; - elseif ( in_array( $tag_obj->slug, $tag ) ) - return true; - - return false; - } - - /** - * Is the query for an existing custom taxonomy archive page? - * - * If the $taxonomy parameter is specified, this function will additionally - * check if the query is for that specific $taxonomy. - * - * If the $term parameter is specified in addition to the $taxonomy parameter, - * this function will additionally check if the query is for one of the terms - * specified. - * - * @since 3.1.0 - * - * @global array $wp_taxonomies - * - * @param mixed $taxonomy Optional. Taxonomy slug or slugs. - * @param mixed $term Optional. Term ID, name, slug or array of Term IDs, names, and slugs. - * @return bool True for custom taxonomy archive pages, false for built-in taxonomies (category and tag archives). - */ - public function is_tax( $taxonomy = '', $term = '' ) { - global $wp_taxonomies; - - if ( !$this->is_tax ) - return false; - - if ( empty( $taxonomy ) ) - return true; - - $queried_object = $this->get_queried_object(); - $tax_array = array_intersect( array_keys( $wp_taxonomies ), (array) $taxonomy ); - $term_array = (array) $term; - - // Check that the taxonomy matches. - if ( ! ( isset( $queried_object->taxonomy ) && count( $tax_array ) && in_array( $queried_object->taxonomy, $tax_array ) ) ) - return false; - - // Only a Taxonomy provided. - if ( empty( $term ) ) - return true; - - return isset( $queried_object->term_id ) && - count( array_intersect( - array( $queried_object->term_id, $queried_object->name, $queried_object->slug ), - $term_array - ) ); - } - - /** - * Whether the current URL is within the comments popup window. - * - * @since 3.1.0 - * @deprecated 4.5.0 - * - * @return bool - */ - public function is_comments_popup() { - _deprecated_function( __FUNCTION__, '4.5.0' ); - - return false; - } - - /** - * Is the query for an existing date archive? - * - * @since 3.1.0 - * - * @return bool - */ - public function is_date() { - return (bool) $this->is_date; - } - - /** - * Is the query for an existing day archive? - * - * @since 3.1.0 - * - * @return bool - */ - public function is_day() { - return (bool) $this->is_day; - } - - /** - * Is the query for a feed? - * - * @since 3.1.0 - * - * @param string|array $feeds Optional feed types to check. - * @return bool - */ - public function is_feed( $feeds = '' ) { - if ( empty( $feeds ) || ! $this->is_feed ) - return (bool) $this->is_feed; - $qv = $this->get( 'feed' ); - if ( 'feed' == $qv ) - $qv = get_default_feed(); - return in_array( $qv, (array) $feeds ); - } - - /** - * Is the query for a comments feed? - * - * @since 3.1.0 - * - * @return bool - */ - public function is_comment_feed() { - return (bool) $this->is_comment_feed; - } - - /** - * Is the query for the front page of the site? - * - * This is for what is displayed at your site's main URL. - * - * Depends on the site's "Front page displays" Reading Settings 'show_on_front' and 'page_on_front'. - * - * If you set a static page for the front page of your site, this function will return - * true when viewing that page. - * - * Otherwise the same as @see WP_Query::is_home() - * - * @since 3.1.0 - * - * @return bool True, if front of site. - */ - public function is_front_page() { - // most likely case - if ( 'posts' == get_option( 'show_on_front') && $this->is_home() ) - return true; - elseif ( 'page' == get_option( 'show_on_front') && get_option( 'page_on_front' ) && $this->is_page( get_option( 'page_on_front' ) ) ) - return true; - else - return false; - } - - /** - * Is the query for the blog homepage? - * - * This is the page which shows the time based blog content of your site. - * - * Depends on the site's "Front page displays" Reading Settings 'show_on_front' and 'page_for_posts'. - * - * If you set a static page for the front page of your site, this function will return - * true only on the page you set as the "Posts page". - * - * @see WP_Query::is_front_page() - * - * @since 3.1.0 - * - * @return bool True if blog view homepage. - */ - public function is_home() { - return (bool) $this->is_home; - } - - /** - * Is the query for an existing month archive? - * - * @since 3.1.0 - * - * @return bool - */ - public function is_month() { - return (bool) $this->is_month; - } - - /** - * Is the query for an existing single page? - * - * If the $page parameter is specified, this function will additionally - * check if the query is for one of the pages specified. - * - * @see WP_Query::is_single() - * @see WP_Query::is_singular() - * - * @since 3.1.0 - * - * @param int|string|array $page Optional. Page ID, title, slug, path, or array of such. Default empty. - * @return bool Whether the query is for an existing single page. - */ - public function is_page( $page = '' ) { - if ( !$this->is_page ) - return false; - - if ( empty( $page ) ) - return true; - - $page_obj = $this->get_queried_object(); - - $page = array_map( 'strval', (array) $page ); - - if ( in_array( (string) $page_obj->ID, $page ) ) { - return true; - } elseif ( in_array( $page_obj->post_title, $page ) ) { - return true; - } elseif ( in_array( $page_obj->post_name, $page ) ) { - return true; - } else { - foreach ( $page as $pagepath ) { - if ( ! strpos( $pagepath, '/' ) ) { - continue; - } - $pagepath_obj = get_page_by_path( $pagepath ); - - if ( $pagepath_obj && ( $pagepath_obj->ID == $page_obj->ID ) ) { - return true; - } - } - } - - return false; - } - - /** - * Is the query for paged result and not for the first page? - * - * @since 3.1.0 - * - * @return bool - */ - public function is_paged() { - return (bool) $this->is_paged; - } - - /** - * Is the query for a post or page preview? - * - * @since 3.1.0 - * - * @return bool - */ - public function is_preview() { - return (bool) $this->is_preview; - } - - /** - * Is the query for the robots file? - * - * @since 3.1.0 - * - * @return bool - */ - public function is_robots() { - return (bool) $this->is_robots; - } - - /** - * Is the query for a search? - * - * @since 3.1.0 - * - * @return bool - */ - public function is_search() { - return (bool) $this->is_search; - } - - /** - * Is the query for an existing single post? - * - * Works for any post type excluding pages. - * - * If the $post parameter is specified, this function will additionally - * check if the query is for one of the Posts specified. - * - * @see WP_Query::is_page() - * @see WP_Query::is_singular() - * - * @since 3.1.0 - * - * @param int|string|array $post Optional. Post ID, title, slug, path, or array of such. Default empty. - * @return bool Whether the query is for an existing single post. - */ - public function is_single( $post = '' ) { - if ( !$this->is_single ) - return false; - - if ( empty($post) ) - return true; - - $post_obj = $this->get_queried_object(); - - $post = array_map( 'strval', (array) $post ); - - if ( in_array( (string) $post_obj->ID, $post ) ) { - return true; - } elseif ( in_array( $post_obj->post_title, $post ) ) { - return true; - } elseif ( in_array( $post_obj->post_name, $post ) ) { - return true; - } else { - foreach ( $post as $postpath ) { - if ( ! strpos( $postpath, '/' ) ) { - continue; - } - $postpath_obj = get_page_by_path( $postpath, OBJECT, $post_obj->post_type ); - - if ( $postpath_obj && ( $postpath_obj->ID == $post_obj->ID ) ) { - return true; - } - } - } - return false; - } - - /** - * Is the query for an existing single post of any post type (post, attachment, page, ... )? - * - * If the $post_types parameter is specified, this function will additionally - * check if the query is for one of the Posts Types specified. - * - * @see WP_Query::is_page() - * @see WP_Query::is_single() - * - * @since 3.1.0 - * - * @param string|array $post_types Optional. Post type or array of post types. Default empty. - * @return bool Whether the query is for an existing single post of any of the given post types. - */ - public function is_singular( $post_types = '' ) { - if ( empty( $post_types ) || !$this->is_singular ) - return (bool) $this->is_singular; - - $post_obj = $this->get_queried_object(); - - return in_array( $post_obj->post_type, (array) $post_types ); - } - - /** - * Is the query for a specific time? - * - * @since 3.1.0 - * - * @return bool - */ - public function is_time() { - return (bool) $this->is_time; - } - - /** - * Is the query for a trackback endpoint call? - * - * @since 3.1.0 - * - * @return bool - */ - public function is_trackback() { - return (bool) $this->is_trackback; - } - - /** - * Is the query for an existing year archive? - * - * @since 3.1.0 - * - * @return bool - */ - public function is_year() { - return (bool) $this->is_year; - } - - /** - * Is the query a 404 (returns no results)? - * - * @since 3.1.0 - * - * @return bool - */ - public function is_404() { - return (bool) $this->is_404; - } - - /** - * Is the query for an embedded post? - * - * @since 4.4.0 - * - * @return bool - */ - public function is_embed() { - return (bool) $this->is_embed; - } - - /** - * Is the query the main query? - * - * @since 3.3.0 - * - * @global WP_Query $wp_query Global WP_Query instance. - * - * @return bool - */ - public function is_main_query() { - global $wp_the_query; - return $wp_the_query === $this; - } - - /** - * Set up global post data. - * - * @since 4.1.0 - * @since 4.4.0 Added the ability to pass a post ID to `$post`. - * - * @global int $id - * @global WP_User $authordata - * @global string|int|bool $currentday - * @global string|int|bool $currentmonth - * @global int $page - * @global array $pages - * @global int $multipage - * @global int $more - * @global int $numpages - * - * @param WP_Post|object|int $post WP_Post instance or Post ID/object. - * @return true True when finished. - */ - public function setup_postdata( $post ) { - global $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages; - - if ( ! ( $post instanceof WP_Post ) ) { - $post = get_post( $post ); - } - - if ( ! $post ) { - return; - } - - $id = (int) $post->ID; - - $authordata = get_userdata($post->post_author); - - $currentday = mysql2date('d.m.y', $post->post_date, false); - $currentmonth = mysql2date('m', $post->post_date, false); - $numpages = 1; - $multipage = 0; - $page = $this->get( 'page' ); - if ( ! $page ) - $page = 1; - - /* - * Force full post content when viewing the permalink for the $post, - * or when on an RSS feed. Otherwise respect the 'more' tag. - */ - if ( $post->ID === get_queried_object_id() && ( $this->is_page() || $this->is_single() ) ) { - $more = 1; - } elseif ( $this->is_feed() ) { - $more = 1; - } else { - $more = 0; - } - - $content = $post->post_content; - if ( false !== strpos( $content, '<!--nextpage-->' ) ) { - $content = str_replace( "\n<!--nextpage-->\n", '<!--nextpage-->', $content ); - $content = str_replace( "\n<!--nextpage-->", '<!--nextpage-->', $content ); - $content = str_replace( "<!--nextpage-->\n", '<!--nextpage-->', $content ); - - // Ignore nextpage at the beginning of the content. - if ( 0 === strpos( $content, '<!--nextpage-->' ) ) - $content = substr( $content, 15 ); - - $pages = explode('<!--nextpage-->', $content); - } else { - $pages = array( $post->post_content ); - } - - /** - * Filters the "pages" derived from splitting the post content. - * - * "Pages" are determined by splitting the post content based on the presence - * of `<!-- nextpage -->` tags. - * - * @since 4.4.0 - * - * @param array $pages Array of "pages" derived from the post content. - * of `<!-- nextpage -->` tags.. - * @param WP_Post $post Current post object. - */ - $pages = apply_filters( 'content_pagination', $pages, $post ); - - $numpages = count( $pages ); - - if ( $numpages > 1 ) { - if ( $page > 1 ) { - $more = 1; - } - $multipage = 1; - } else { - $multipage = 0; - } - - /** - * Fires once the post data has been setup. - * - * @since 2.8.0 - * @since 4.1.0 Introduced `$this` parameter. - * - * @param WP_Post &$post The Post object (passed by reference). - * @param WP_Query &$this The current Query object (passed by reference). - */ - do_action_ref_array( 'the_post', array( &$post, &$this ) ); - - return true; - } - /** - * After looping through a nested query, this function - * restores the $post global to the current post in this query. - * - * @since 3.7.0 - * - * @global WP_Post $post - */ - public function reset_postdata() { - if ( ! empty( $this->post ) ) { - $GLOBALS['post'] = $this->post; - $this->setup_postdata( $this->post ); - } - } - - /** - * Lazyload term meta for posts in the loop. - * - * @since 4.4.0 - * @deprecated 4.5.0 See wp_queue_posts_for_term_meta_lazyload(). - * - * @param mixed $check - * @param int $term_id - * @return mixed - */ - public function lazyload_term_meta( $check, $term_id ) { - _deprecated_function( __METHOD__, '4.5.0' ); - return $check; - } - - /** - * Lazyload comment meta for comments in the loop. - * - * @since 4.4.0 - * @deprecated 4.5.0 See wp_queue_comments_for_comment_meta_lazyload(). - * - * @param mixed $check - * @param int $comment_id - * @return mixed - */ - public function lazyload_comment_meta( $check, $comment_id ) { - _deprecated_function( __METHOD__, '4.5.0' ); - return $check; - } -} diff --git a/wp/wp-includes/class-wp-rewrite.php b/wp/wp-includes/class-wp-rewrite.php deleted file mode 100644 index 17c58b90..00000000 --- a/wp/wp-includes/class-wp-rewrite.php +++ /dev/null @@ -1,1954 +0,0 @@ -<?php -/** - * Rewrite API: WP_Rewrite class - * - * @package WordPress - * @subpackage Rewrite - * @since 1.5.0 - */ - -/** - * Core class used to implement a rewrite component API. - * - * The WordPress Rewrite class writes the rewrite module rules to the .htaccess - * file. It also handles parsing the request to get the correct setup for the - * WordPress Query class. - * - * The Rewrite along with WP class function as a front controller for WordPress. - * You can add rules to trigger your page view and processing using this - * component. The full functionality of a front controller does not exist, - * meaning you can't define how the template files load based on the rewrite - * rules. - * - * @since 1.5.0 - */ -class WP_Rewrite { - /** - * Permalink structure for posts. - * - * @since 1.5.0 - * @var string - */ - public $permalink_structure; - - /** - * Whether to add trailing slashes. - * - * @since 2.2.0 - * @var bool - */ - public $use_trailing_slashes; - - /** - * Base for the author permalink structure (example.com/$author_base/authorname). - * - * @since 1.5.0 - * @access private - * @var string - */ - var $author_base = 'author'; - - /** - * Permalink structure for author archives. - * - * @since 1.5.0 - * @access private - * @var string - */ - var $author_structure; - - /** - * Permalink structure for date archives. - * - * @since 1.5.0 - * @access private - * @var string - */ - var $date_structure; - - /** - * Permalink structure for pages. - * - * @since 1.5.0 - * @access private - * @var string - */ - var $page_structure; - - /** - * Base of the search permalink structure (example.com/$search_base/query). - * - * @since 1.5.0 - * @access private - * @var string - */ - var $search_base = 'search'; - - /** - * Permalink structure for searches. - * - * @since 1.5.0 - * @access private - * @var string - */ - var $search_structure; - - /** - * Comments permalink base. - * - * @since 1.5.0 - * @access private - * @var string - */ - var $comments_base = 'comments'; - - /** - * Pagination permalink base. - * - * @since 3.1.0 - * @var string - */ - public $pagination_base = 'page'; - - /** - * Comments pagination permalink base. - * - * @since 4.2.0 - * @access private - * @var string - */ - var $comments_pagination_base = 'comment-page'; - - /** - * Feed permalink base. - * - * @since 1.5.0 - * @access private - * @var string - */ - var $feed_base = 'feed'; - - /** - * Comments feed permalink structure. - * - * @since 1.5.0 - * @access private - * @var string - */ - var $comment_feed_structure; - - /** - * Feed request permalink structure. - * - * @since 1.5.0 - * @access private - * @var string - */ - var $feed_structure; - - /** - * The static portion of the post permalink structure. - * - * If the permalink structure is "/archive/%post_id%" then the front - * is "/archive/". If the permalink structure is "/%year%/%postname%/" - * then the front is "/". - * - * @since 1.5.0 - * @access public - * @var string - * - * @see WP_Rewrite::init() - */ - public $front; - - /** - * The prefix for all permalink structures. - * - * If PATHINFO/index permalinks are in use then the root is the value of - * `WP_Rewrite::$index` with a trailing slash appended. Otherwise the root - * will be empty. - * - * @since 1.5.0 - * @access public - * @var string - * - * @see WP_Rewrite::init() - * @see WP_Rewrite::using_index_permalinks() - */ - public $root = ''; - - /** - * The name of the index file which is the entry point to all requests. - * - * @since 1.5.0 - * @access public - * @var string - */ - public $index = 'index.php'; - - /** - * Variable name to use for regex matches in the rewritten query. - * - * @since 1.5.0 - * @access private - * @var string - */ - var $matches = ''; - - /** - * Rewrite rules to match against the request to find the redirect or query. - * - * @since 1.5.0 - * @access private - * @var array - */ - var $rules; - - /** - * Additional rules added external to the rewrite class. - * - * Those not generated by the class, see add_rewrite_rule(). - * - * @since 2.1.0 - * @access private - * @var array - */ - var $extra_rules = array(); - - /** - * Additional rules that belong at the beginning to match first. - * - * Those not generated by the class, see add_rewrite_rule(). - * - * @since 2.3.0 - * @access private - * @var array - */ - var $extra_rules_top = array(); - - /** - * Rules that don't redirect to WordPress' index.php. - * - * These rules are written to the mod_rewrite portion of the .htaccess, - * and are added by add_external_rule(). - * - * @since 2.1.0 - * @access private - * @var array - */ - var $non_wp_rules = array(); - - /** - * Extra permalink structures, e.g. categories, added by add_permastruct(). - * - * @since 2.1.0 - * @access private - * @var array - */ - var $extra_permastructs = array(); - - /** - * Endpoints (like /trackback/) added by add_rewrite_endpoint(). - * - * @since 2.1.0 - * @access private - * @var array - */ - var $endpoints; - - /** - * Whether to write every mod_rewrite rule for WordPress into the .htaccess file. - * - * This is off by default, turning it on might print a lot of rewrite rules - * to the .htaccess file. - * - * @since 2.0.0 - * @access public - * @var bool - * - * @see WP_Rewrite::mod_rewrite_rules() - */ - public $use_verbose_rules = false; - - /** - * Could post permalinks be confused with those of pages? - * - * If the first rewrite tag in the post permalink structure is one that could - * also match a page name (e.g. %postname% or %author%) then this flag is - * set to true. Prior to WordPress 3.3 this flag indicated that every page - * would have a set of rules added to the top of the rewrite rules array. - * Now it tells WP::parse_request() to check if a URL matching the page - * permastruct is actually a page before accepting it. - * - * @since 2.5.0 - * @access public - * @var bool - * - * @see WP_Rewrite::init() - */ - public $use_verbose_page_rules = true; - - /** - * Rewrite tags that can be used in permalink structures. - * - * These are translated into the regular expressions stored in - * `WP_Rewrite::$rewritereplace` and are rewritten to the query - * variables listed in WP_Rewrite::$queryreplace. - * - * Additional tags can be added with add_rewrite_tag(). - * - * @since 1.5.0 - * @access private - * @var array - */ - var $rewritecode = array( - '%year%', - '%monthnum%', - '%day%', - '%hour%', - '%minute%', - '%second%', - '%postname%', - '%post_id%', - '%author%', - '%pagename%', - '%search%' - ); - - /** - * Regular expressions to be substituted into rewrite rules in place - * of rewrite tags, see WP_Rewrite::$rewritecode. - * - * @since 1.5.0 - * @access private - * @var array - */ - var $rewritereplace = array( - '([0-9]{4})', - '([0-9]{1,2})', - '([0-9]{1,2})', - '([0-9]{1,2})', - '([0-9]{1,2})', - '([0-9]{1,2})', - '([^/]+)', - '([0-9]+)', - '([^/]+)', - '([^/]+?)', - '(.+)' - ); - - /** - * Query variables that rewrite tags map to, see WP_Rewrite::$rewritecode. - * - * @since 1.5.0 - * @access private - * @var array - */ - var $queryreplace = array( - 'year=', - 'monthnum=', - 'day=', - 'hour=', - 'minute=', - 'second=', - 'name=', - 'p=', - 'author_name=', - 'pagename=', - 's=' - ); - - /** - * Supported default feeds. - * - * @since 1.5.0 - * @var array - */ - public $feeds = array( 'feed', 'rdf', 'rss', 'rss2', 'atom' ); - - /** - * Determines whether permalinks are being used. - * - * This can be either rewrite module or permalink in the HTTP query string. - * - * @since 1.5.0 - * @access public - * - * @return bool True, if permalinks are enabled. - */ - public function using_permalinks() { - return ! empty($this->permalink_structure); - } - - /** - * Determines whether permalinks are being used and rewrite module is not enabled. - * - * Means that permalink links are enabled and index.php is in the URL. - * - * @since 1.5.0 - * @access public - * - * @return bool Whether permalink links are enabled and index.php is in the URL. - */ - public function using_index_permalinks() { - if ( empty( $this->permalink_structure ) ) { - return false; - } - - // If the index is not in the permalink, we're using mod_rewrite. - return preg_match( '#^/*' . $this->index . '#', $this->permalink_structure ); - } - - /** - * Determines whether permalinks are being used and rewrite module is enabled. - * - * Using permalinks and index.php is not in the URL. - * - * @since 1.5.0 - * @access public - * - * @return bool Whether permalink links are enabled and index.php is NOT in the URL. - */ - public function using_mod_rewrite_permalinks() { - return $this->using_permalinks() && ! $this->using_index_permalinks(); - } - - /** - * Indexes for matches for usage in preg_*() functions. - * - * The format of the string is, with empty matches property value, '$NUM'. - * The 'NUM' will be replaced with the value in the $number parameter. With - * the matches property not empty, the value of the returned string will - * contain that value of the matches property. The format then will be - * '$MATCHES[NUM]', with MATCHES as the value in the property and NUM the - * value of the $number parameter. - * - * @since 1.5.0 - * @access public - * - * @param int $number Index number. - * @return string - */ - public function preg_index($number) { - $match_prefix = '$'; - $match_suffix = ''; - - if ( ! empty($this->matches) ) { - $match_prefix = '$' . $this->matches . '['; - $match_suffix = ']'; - } - - return "$match_prefix$number$match_suffix"; - } - - /** - * Retrieves all page and attachments for pages URIs. - * - * The attachments are for those that have pages as parents and will be - * retrieved. - * - * @since 2.5.0 - * @access public - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @return array Array of page URIs as first element and attachment URIs as second element. - */ - public function page_uri_index() { - global $wpdb; - - // Get pages in order of hierarchy, i.e. children after parents. - $pages = $wpdb->get_results("SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'page' AND post_status != 'auto-draft'"); - $posts = get_page_hierarchy( $pages ); - - // If we have no pages get out quick. - if ( !$posts ) - return array( array(), array() ); - - // Now reverse it, because we need parents after children for rewrite rules to work properly. - $posts = array_reverse($posts, true); - - $page_uris = array(); - $page_attachment_uris = array(); - - foreach ( $posts as $id => $post ) { - // URL => page name - $uri = get_page_uri($id); - $attachments = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_name, post_parent FROM $wpdb->posts WHERE post_type = 'attachment' AND post_parent = %d", $id )); - if ( !empty($attachments) ) { - foreach ( $attachments as $attachment ) { - $attach_uri = get_page_uri($attachment->ID); - $page_attachment_uris[$attach_uri] = $attachment->ID; - } - } - - $page_uris[$uri] = $id; - } - - return array( $page_uris, $page_attachment_uris ); - } - - /** - * Retrieves all of the rewrite rules for pages. - * - * @since 1.5.0 - * @access public - * - * @return array Page rewrite rules. - */ - public function page_rewrite_rules() { - // The extra .? at the beginning prevents clashes with other regular expressions in the rules array. - $this->add_rewrite_tag( '%pagename%', '(.?.+?)', 'pagename=' ); - - return $this->generate_rewrite_rules( $this->get_page_permastruct(), EP_PAGES, true, true, false, false ); - } - - /** - * Retrieves date permalink structure, with year, month, and day. - * - * The permalink structure for the date, if not set already depends on the - * permalink structure. It can be one of three formats. The first is year, - * month, day; the second is day, month, year; and the last format is month, - * day, year. These are matched against the permalink structure for which - * one is used. If none matches, then the default will be used, which is - * year, month, day. - * - * Prevents post ID and date permalinks from overlapping. In the case of - * post_id, the date permalink will be prepended with front permalink with - * 'date/' before the actual permalink to form the complete date permalink - * structure. - * - * @since 1.5.0 - * @access public - * - * @return string|false False on no permalink structure. Date permalink structure. - */ - public function get_date_permastruct() { - if ( isset($this->date_structure) ) - return $this->date_structure; - - if ( empty($this->permalink_structure) ) { - $this->date_structure = ''; - return false; - } - - // The date permalink must have year, month, and day separated by slashes. - $endians = array('%year%/%monthnum%/%day%', '%day%/%monthnum%/%year%', '%monthnum%/%day%/%year%'); - - $this->date_structure = ''; - $date_endian = ''; - - foreach ( $endians as $endian ) { - if ( false !== strpos($this->permalink_structure, $endian) ) { - $date_endian= $endian; - break; - } - } - - if ( empty($date_endian) ) - $date_endian = '%year%/%monthnum%/%day%'; - - /* - * Do not allow the date tags and %post_id% to overlap in the permalink - * structure. If they do, move the date tags to $front/date/. - */ - $front = $this->front; - preg_match_all('/%.+?%/', $this->permalink_structure, $tokens); - $tok_index = 1; - foreach ( (array) $tokens[0] as $token) { - if ( '%post_id%' == $token && ($tok_index <= 3) ) { - $front = $front . 'date/'; - break; - } - $tok_index++; - } - - $this->date_structure = $front . $date_endian; - - return $this->date_structure; - } - - /** - * Retrieves the year permalink structure without month and day. - * - * Gets the date permalink structure and strips out the month and day - * permalink structures. - * - * @since 1.5.0 - * @access public - * - * @return false|string False on failure. Year structure on success. - */ - public function get_year_permastruct() { - $structure = $this->get_date_permastruct(); - - if ( empty($structure) ) - return false; - - $structure = str_replace('%monthnum%', '', $structure); - $structure = str_replace('%day%', '', $structure); - $structure = preg_replace('#/+#', '/', $structure); - - return $structure; - } - - /** - * Retrieves the month permalink structure without day and with year. - * - * Gets the date permalink structure and strips out the day permalink - * structures. Keeps the year permalink structure. - * - * @since 1.5.0 - * @access public - * - * @return false|string False on failure. Year/Month structure on success. - */ - public function get_month_permastruct() { - $structure = $this->get_date_permastruct(); - - if ( empty($structure) ) - return false; - - $structure = str_replace('%day%', '', $structure); - $structure = preg_replace('#/+#', '/', $structure); - - return $structure; - } - - /** - * Retrieves the day permalink structure with month and year. - * - * Keeps date permalink structure with all year, month, and day. - * - * @since 1.5.0 - * @access public - * - * @return string|false False on failure. Year/Month/Day structure on success. - */ - public function get_day_permastruct() { - return $this->get_date_permastruct(); - } - - /** - * Retrieves the permalink structure for categories. - * - * If the category_base property has no value, then the category structure - * will have the front property value, followed by 'category', and finally - * '%category%'. If it does, then the root property will be used, along with - * the category_base property value. - * - * @since 1.5.0 - * @access public - * - * @return string|false False on failure. Category permalink structure. - */ - public function get_category_permastruct() { - return $this->get_extra_permastruct('category'); - } - - /** - * Retrieve the permalink structure for tags. - * - * If the tag_base property has no value, then the tag structure will have - * the front property value, followed by 'tag', and finally '%tag%'. If it - * does, then the root property will be used, along with the tag_base - * property value. - * - * @since 2.3.0 - * @access public - * - * @return string|false False on failure. Tag permalink structure. - */ - public function get_tag_permastruct() { - return $this->get_extra_permastruct('post_tag'); - } - - /** - * Retrieves an extra permalink structure by name. - * - * @since 2.5.0 - * @access public - * - * @param string $name Permalink structure name. - * @return string|false False if not found. Permalink structure string. - */ - public function get_extra_permastruct($name) { - if ( empty($this->permalink_structure) ) - return false; - - if ( isset($this->extra_permastructs[$name]) ) - return $this->extra_permastructs[$name]['struct']; - - return false; - } - - /** - * Retrieves the author permalink structure. - * - * The permalink structure is front property, author base, and finally - * '/%author%'. Will set the author_structure property and then return it - * without attempting to set the value again. - * - * @since 1.5.0 - * @access public - * - * @return string|false False if not found. Permalink structure string. - */ - public function get_author_permastruct() { - if ( isset($this->author_structure) ) - return $this->author_structure; - - if ( empty($this->permalink_structure) ) { - $this->author_structure = ''; - return false; - } - - $this->author_structure = $this->front . $this->author_base . '/%author%'; - - return $this->author_structure; - } - - /** - * Retrieves the search permalink structure. - * - * The permalink structure is root property, search base, and finally - * '/%search%'. Will set the search_structure property and then return it - * without attempting to set the value again. - * - * @since 1.5.0 - * @access public - * - * @return string|false False if not found. Permalink structure string. - */ - public function get_search_permastruct() { - if ( isset($this->search_structure) ) - return $this->search_structure; - - if ( empty($this->permalink_structure) ) { - $this->search_structure = ''; - return false; - } - - $this->search_structure = $this->root . $this->search_base . '/%search%'; - - return $this->search_structure; - } - - /** - * Retrieves the page permalink structure. - * - * The permalink structure is root property, and '%pagename%'. Will set the - * page_structure property and then return it without attempting to set the - * value again. - * - * @since 1.5.0 - * @access public - * - * @return string|false False if not found. Permalink structure string. - */ - public function get_page_permastruct() { - if ( isset($this->page_structure) ) - return $this->page_structure; - - if (empty($this->permalink_structure)) { - $this->page_structure = ''; - return false; - } - - $this->page_structure = $this->root . '%pagename%'; - - return $this->page_structure; - } - - /** - * Retrieves the feed permalink structure. - * - * The permalink structure is root property, feed base, and finally - * '/%feed%'. Will set the feed_structure property and then return it - * without attempting to set the value again. - * - * @since 1.5.0 - * @access public - * - * @return string|false False if not found. Permalink structure string. - */ - public function get_feed_permastruct() { - if ( isset($this->feed_structure) ) - return $this->feed_structure; - - if ( empty($this->permalink_structure) ) { - $this->feed_structure = ''; - return false; - } - - $this->feed_structure = $this->root . $this->feed_base . '/%feed%'; - - return $this->feed_structure; - } - - /** - * Retrieves the comment feed permalink structure. - * - * The permalink structure is root property, comment base property, feed - * base and finally '/%feed%'. Will set the comment_feed_structure property - * and then return it without attempting to set the value again. - * - * @since 1.5.0 - * @access public - * - * @return string|false False if not found. Permalink structure string. - */ - public function get_comment_feed_permastruct() { - if ( isset($this->comment_feed_structure) ) - return $this->comment_feed_structure; - - if (empty($this->permalink_structure)) { - $this->comment_feed_structure = ''; - return false; - } - - $this->comment_feed_structure = $this->root . $this->comments_base . '/' . $this->feed_base . '/%feed%'; - - return $this->comment_feed_structure; - } - - /** - * Adds or updates existing rewrite tags (e.g. %postname%). - * - * If the tag already exists, replace the existing pattern and query for - * that tag, otherwise add the new tag. - * - * @since 1.5.0 - * @access public - * - * @see WP_Rewrite::$rewritecode - * @see WP_Rewrite::$rewritereplace - * @see WP_Rewrite::$queryreplace - * - * @param string $tag Name of the rewrite tag to add or update. - * @param string $regex Regular expression to substitute the tag for in rewrite rules. - * @param string $query String to append to the rewritten query. Must end in '='. - */ - public function add_rewrite_tag( $tag, $regex, $query ) { - $position = array_search( $tag, $this->rewritecode ); - if ( false !== $position && null !== $position ) { - $this->rewritereplace[ $position ] = $regex; - $this->queryreplace[ $position ] = $query; - } else { - $this->rewritecode[] = $tag; - $this->rewritereplace[] = $regex; - $this->queryreplace[] = $query; - } - } - - - /** - * Removes an existing rewrite tag. - * - * @since 4.5.0 - * @access public - * - * @see WP_Rewrite::$rewritecode - * @see WP_Rewrite::$rewritereplace - * @see WP_Rewrite::$queryreplace - * - * @param string $tag Name of the rewrite tag to remove. - */ - public function remove_rewrite_tag( $tag ) { - $position = array_search( $tag, $this->rewritecode ); - if ( false !== $position && null !== $position ) { - unset( $this->rewritecode[ $position ] ); - unset( $this->rewritereplace[ $position ] ); - unset( $this->queryreplace[ $position ] ); - } - } - - /** - * Generates rewrite rules from a permalink structure. - * - * The main WP_Rewrite function for building the rewrite rule list. The - * contents of the function is a mix of black magic and regular expressions, - * so best just ignore the contents and move to the parameters. - * - * @since 1.5.0 - * @access public - * - * @param string $permalink_structure The permalink structure. - * @param int $ep_mask Optional. Endpoint mask defining what endpoints are added to the structure. - * Accepts `EP_NONE`, `EP_PERMALINK`, `EP_ATTACHMENT`, `EP_DATE`, `EP_YEAR`, - * `EP_MONTH`, `EP_DAY`, `EP_ROOT`, `EP_COMMENTS`, `EP_SEARCH`, `EP_CATEGORIES`, - * `EP_TAGS`, `EP_AUTHORS`, `EP_PAGES`, `EP_ALL_ARCHIVES`, and `EP_ALL`. - * Default `EP_NONE`. - * @param bool $paged Optional. Whether archive pagination rules should be added for the structure. - * Default true. - * @param bool $feed Optional Whether feed rewrite rules should be added for the structure. - * Default true. - * @param bool $forcomments Optional. Whether the feed rules should be a query for a comments feed. - * Default false. - * @param bool $walk_dirs Optional. Whether the 'directories' making up the structure should be walked - * over and rewrite rules built for each in-turn. Default true. - * @param bool $endpoints Optional. Whether endpoints should be applied to the generated rewrite rules. - * Default true. - * @return array Rewrite rule list. - */ - public function generate_rewrite_rules($permalink_structure, $ep_mask = EP_NONE, $paged = true, $feed = true, $forcomments = false, $walk_dirs = true, $endpoints = true) { - // Build a regex to match the feed section of URLs, something like (feed|atom|rss|rss2)/? - $feedregex2 = ''; - foreach ( (array) $this->feeds as $feed_name) - $feedregex2 .= $feed_name . '|'; - $feedregex2 = '(' . trim($feedregex2, '|') . ')/?$'; - - /* - * $feedregex is identical but with /feed/ added on as well, so URLs like <permalink>/feed/atom - * and <permalink>/atom are both possible - */ - $feedregex = $this->feed_base . '/' . $feedregex2; - - // Build a regex to match the trackback and page/xx parts of URLs. - $trackbackregex = 'trackback/?$'; - $pageregex = $this->pagination_base . '/?([0-9]{1,})/?$'; - $commentregex = $this->comments_pagination_base . '-([0-9]{1,})/?$'; - $embedregex = 'embed/?$'; - - // Build up an array of endpoint regexes to append => queries to append. - if ( $endpoints ) { - $ep_query_append = array (); - foreach ( (array) $this->endpoints as $endpoint) { - // Match everything after the endpoint name, but allow for nothing to appear there. - $epmatch = $endpoint[1] . '(/(.*))?/?$'; - - // This will be appended on to the rest of the query for each dir. - $epquery = '&' . $endpoint[2] . '='; - $ep_query_append[$epmatch] = array ( $endpoint[0], $epquery ); - } - } - - // Get everything up to the first rewrite tag. - $front = substr($permalink_structure, 0, strpos($permalink_structure, '%')); - - // Build an array of the tags (note that said array ends up being in $tokens[0]). - preg_match_all('/%.+?%/', $permalink_structure, $tokens); - - $num_tokens = count($tokens[0]); - - $index = $this->index; //probably 'index.php' - $feedindex = $index; - $trackbackindex = $index; - $embedindex = $index; - - /* - * Build a list from the rewritecode and queryreplace arrays, that will look something - * like tagname=$matches[i] where i is the current $i. - */ - $queries = array(); - for ( $i = 0; $i < $num_tokens; ++$i ) { - if ( 0 < $i ) - $queries[$i] = $queries[$i - 1] . '&'; - else - $queries[$i] = ''; - - $query_token = str_replace($this->rewritecode, $this->queryreplace, $tokens[0][$i]) . $this->preg_index($i+1); - $queries[$i] .= $query_token; - } - - // Get the structure, minus any cruft (stuff that isn't tags) at the front. - $structure = $permalink_structure; - if ( $front != '/' ) - $structure = str_replace($front, '', $structure); - - /* - * Create a list of dirs to walk over, making rewrite rules for each level - * so for example, a $structure of /%year%/%monthnum%/%postname% would create - * rewrite rules for /%year%/, /%year%/%monthnum%/ and /%year%/%monthnum%/%postname% - */ - $structure = trim($structure, '/'); - $dirs = $walk_dirs ? explode('/', $structure) : array( $structure ); - $num_dirs = count($dirs); - - // Strip slashes from the front of $front. - $front = preg_replace('|^/+|', '', $front); - - // The main workhorse loop. - $post_rewrite = array(); - $struct = $front; - for ( $j = 0; $j < $num_dirs; ++$j ) { - // Get the struct for this dir, and trim slashes off the front. - $struct .= $dirs[$j] . '/'; // Accumulate. see comment near explode('/', $structure) above. - $struct = ltrim($struct, '/'); - - // Replace tags with regexes. - $match = str_replace($this->rewritecode, $this->rewritereplace, $struct); - - // Make a list of tags, and store how many there are in $num_toks. - $num_toks = preg_match_all('/%.+?%/', $struct, $toks); - - // Get the 'tagname=$matches[i]'. - $query = ( ! empty( $num_toks ) && isset( $queries[$num_toks - 1] ) ) ? $queries[$num_toks - 1] : ''; - - // Set up $ep_mask_specific which is used to match more specific URL types. - switch ( $dirs[$j] ) { - case '%year%': - $ep_mask_specific = EP_YEAR; - break; - case '%monthnum%': - $ep_mask_specific = EP_MONTH; - break; - case '%day%': - $ep_mask_specific = EP_DAY; - break; - default: - $ep_mask_specific = EP_NONE; - } - - // Create query for /page/xx. - $pagematch = $match . $pageregex; - $pagequery = $index . '?' . $query . '&paged=' . $this->preg_index($num_toks + 1); - - // Create query for /comment-page-xx. - $commentmatch = $match . $commentregex; - $commentquery = $index . '?' . $query . '&cpage=' . $this->preg_index($num_toks + 1); - - if ( get_option('page_on_front') ) { - // Create query for Root /comment-page-xx. - $rootcommentmatch = $match . $commentregex; - $rootcommentquery = $index . '?' . $query . '&page_id=' . get_option('page_on_front') . '&cpage=' . $this->preg_index($num_toks + 1); - } - - // Create query for /feed/(feed|atom|rss|rss2|rdf). - $feedmatch = $match . $feedregex; - $feedquery = $feedindex . '?' . $query . '&feed=' . $this->preg_index($num_toks + 1); - - // Create query for /(feed|atom|rss|rss2|rdf) (see comment near creation of $feedregex). - $feedmatch2 = $match . $feedregex2; - $feedquery2 = $feedindex . '?' . $query . '&feed=' . $this->preg_index($num_toks + 1); - - // Create query and regex for embeds. - $embedmatch = $match . $embedregex; - $embedquery = $embedindex . '?' . $query . '&embed=true'; - - // If asked to, turn the feed queries into comment feed ones. - if ( $forcomments ) { - $feedquery .= '&withcomments=1'; - $feedquery2 .= '&withcomments=1'; - } - - // Start creating the array of rewrites for this dir. - $rewrite = array(); - - // ...adding on /feed/ regexes => queries - if ( $feed ) { - $rewrite = array( $feedmatch => $feedquery, $feedmatch2 => $feedquery2, $embedmatch => $embedquery ); - } - - //...and /page/xx ones - if ( $paged ) { - $rewrite = array_merge( $rewrite, array( $pagematch => $pagequery ) ); - } - - // Only on pages with comments add ../comment-page-xx/. - if ( EP_PAGES & $ep_mask || EP_PERMALINK & $ep_mask ) { - $rewrite = array_merge($rewrite, array($commentmatch => $commentquery)); - } elseif ( EP_ROOT & $ep_mask && get_option('page_on_front') ) { - $rewrite = array_merge($rewrite, array($rootcommentmatch => $rootcommentquery)); - } - - // Do endpoints. - if ( $endpoints ) { - foreach ( (array) $ep_query_append as $regex => $ep) { - // Add the endpoints on if the mask fits. - if ( $ep[0] & $ep_mask || $ep[0] & $ep_mask_specific ) - $rewrite[$match . $regex] = $index . '?' . $query . $ep[1] . $this->preg_index($num_toks + 2); - } - } - - // If we've got some tags in this dir. - if ( $num_toks ) { - $post = false; - $page = false; - - /* - * Check to see if this dir is permalink-level: i.e. the structure specifies an - * individual post. Do this by checking it contains at least one of 1) post name, - * 2) post ID, 3) page name, 4) timestamp (year, month, day, hour, second and - * minute all present). Set these flags now as we need them for the endpoints. - */ - if ( strpos($struct, '%postname%') !== false - || strpos($struct, '%post_id%') !== false - || strpos($struct, '%pagename%') !== false - || (strpos($struct, '%year%') !== false && strpos($struct, '%monthnum%') !== false && strpos($struct, '%day%') !== false && strpos($struct, '%hour%') !== false && strpos($struct, '%minute%') !== false && strpos($struct, '%second%') !== false) - ) { - $post = true; - if ( strpos($struct, '%pagename%') !== false ) - $page = true; - } - - if ( ! $post ) { - // For custom post types, we need to add on endpoints as well. - foreach ( get_post_types( array('_builtin' => false ) ) as $ptype ) { - if ( strpos($struct, "%$ptype%") !== false ) { - $post = true; - - // This is for page style attachment URLs. - $page = is_post_type_hierarchical( $ptype ); - break; - } - } - } - - // If creating rules for a permalink, do all the endpoints like attachments etc. - if ( $post ) { - // Create query and regex for trackback. - $trackbackmatch = $match . $trackbackregex; - $trackbackquery = $trackbackindex . '?' . $query . '&tb=1'; - - // Create query and regex for embeds. - $embedmatch = $match . $embedregex; - $embedquery = $embedindex . '?' . $query . '&embed=true'; - - // Trim slashes from the end of the regex for this dir. - $match = rtrim($match, '/'); - - // Get rid of brackets. - $submatchbase = str_replace( array('(', ')'), '', $match); - - // Add a rule for at attachments, which take the form of <permalink>/some-text. - $sub1 = $submatchbase . '/([^/]+)/'; - - // Add trackback regex <permalink>/trackback/... - $sub1tb = $sub1 . $trackbackregex; - - // And <permalink>/feed/(atom|...) - $sub1feed = $sub1 . $feedregex; - - // And <permalink>/(feed|atom...) - $sub1feed2 = $sub1 . $feedregex2; - - // And <permalink>/comment-page-xx - $sub1comment = $sub1 . $commentregex; - - // And <permalink>/embed/... - $sub1embed = $sub1 . $embedregex; - - /* - * Add another rule to match attachments in the explicit form: - * <permalink>/attachment/some-text - */ - $sub2 = $submatchbase . '/attachment/([^/]+)/'; - - // And add trackbacks <permalink>/attachment/trackback. - $sub2tb = $sub2 . $trackbackregex; - - // Feeds, <permalink>/attachment/feed/(atom|...) - $sub2feed = $sub2 . $feedregex; - - // And feeds again on to this <permalink>/attachment/(feed|atom...) - $sub2feed2 = $sub2 . $feedregex2; - - // And <permalink>/comment-page-xx - $sub2comment = $sub2 . $commentregex; - - // And <permalink>/embed/... - $sub2embed = $sub2 . $embedregex; - - // Create queries for these extra tag-ons we've just dealt with. - $subquery = $index . '?attachment=' . $this->preg_index(1); - $subtbquery = $subquery . '&tb=1'; - $subfeedquery = $subquery . '&feed=' . $this->preg_index(2); - $subcommentquery = $subquery . '&cpage=' . $this->preg_index(2); - $subembedquery = $subquery . '&embed=true'; - - // Do endpoints for attachments. - if ( !empty($endpoints) ) { - foreach ( (array) $ep_query_append as $regex => $ep ) { - if ( $ep[0] & EP_ATTACHMENT ) { - $rewrite[$sub1 . $regex] = $subquery . $ep[1] . $this->preg_index(3); - $rewrite[$sub2 . $regex] = $subquery . $ep[1] . $this->preg_index(3); - } - } - } - - /* - * Now we've finished with endpoints, finish off the $sub1 and $sub2 matches - * add a ? as we don't have to match that last slash, and finally a $ so we - * match to the end of the URL - */ - $sub1 .= '?$'; - $sub2 .= '?$'; - - /* - * Post pagination, e.g. <permalink>/2/ - * Previously: '(/[0-9]+)?/?$', which produced '/2' for page. - * When cast to int, returned 0. - */ - $match = $match . '(?:/([0-9]+))?/?$'; - $query = $index . '?' . $query . '&page=' . $this->preg_index($num_toks + 1); - - // Not matching a permalink so this is a lot simpler. - } else { - // Close the match and finalise the query. - $match .= '?$'; - $query = $index . '?' . $query; - } - - /* - * Create the final array for this dir by joining the $rewrite array (which currently - * only contains rules/queries for trackback, pages etc) to the main regex/query for - * this dir - */ - $rewrite = array_merge($rewrite, array($match => $query)); - - // If we're matching a permalink, add those extras (attachments etc) on. - if ( $post ) { - // Add trackback. - $rewrite = array_merge(array($trackbackmatch => $trackbackquery), $rewrite); - - // Add embed. - $rewrite = array_merge( array( $embedmatch => $embedquery ), $rewrite ); - - // Add regexes/queries for attachments, attachment trackbacks and so on. - if ( ! $page ) { - // Require <permalink>/attachment/stuff form for pages because of confusion with subpages. - $rewrite = array_merge( $rewrite, array( - $sub1 => $subquery, - $sub1tb => $subtbquery, - $sub1feed => $subfeedquery, - $sub1feed2 => $subfeedquery, - $sub1comment => $subcommentquery, - $sub1embed => $subembedquery - ) ); - } - - $rewrite = array_merge( array( $sub2 => $subquery, $sub2tb => $subtbquery, $sub2feed => $subfeedquery, $sub2feed2 => $subfeedquery, $sub2comment => $subcommentquery, $sub2embed => $subembedquery ), $rewrite ); - } - } - // Add the rules for this dir to the accumulating $post_rewrite. - $post_rewrite = array_merge($rewrite, $post_rewrite); - } - - // The finished rules. phew! - return $post_rewrite; - } - - /** - * Generates rewrite rules with permalink structure and walking directory only. - * - * Shorten version of WP_Rewrite::generate_rewrite_rules() that allows for shorter - * list of parameters. See the method for longer description of what generating - * rewrite rules does. - * - * @since 1.5.0 - * @access public - * - * @see WP_Rewrite::generate_rewrite_rules() See for long description and rest of parameters. - * - * @param string $permalink_structure The permalink structure to generate rules. - * @param bool $walk_dirs Optional, default is false. Whether to create list of directories to walk over. - * @return array - */ - public function generate_rewrite_rule($permalink_structure, $walk_dirs = false) { - return $this->generate_rewrite_rules($permalink_structure, EP_NONE, false, false, false, $walk_dirs); - } - - /** - * Constructs rewrite matches and queries from permalink structure. - * - * Runs the action {@see 'generate_rewrite_rules'} with the parameter that is an - * reference to the current WP_Rewrite instance to further manipulate the - * permalink structures and rewrite rules. Runs the {@see 'rewrite_rules_array'} - * filter on the full rewrite rule array. - * - * There are two ways to manipulate the rewrite rules, one by hooking into - * the {@see 'generate_rewrite_rules'} action and gaining full control of the - * object or just manipulating the rewrite rule array before it is passed - * from the function. - * - * @since 1.5.0 - * @access public - * - * @return array An associate array of matches and queries. - */ - public function rewrite_rules() { - $rewrite = array(); - - if ( empty($this->permalink_structure) ) - return $rewrite; - - // robots.txt -only if installed at the root - $home_path = parse_url( home_url() ); - $robots_rewrite = ( empty( $home_path['path'] ) || '/' == $home_path['path'] ) ? array( 'robots\.txt$' => $this->index . '?robots=1' ) : array(); - - // Old feed and service files. - $deprecated_files = array( - '.*wp-(atom|rdf|rss|rss2|feed|commentsrss2)\.php$' => $this->index . '?feed=old', - '.*wp-app\.php(/.*)?$' => $this->index . '?error=403', - ); - - // Registration rules. - $registration_pages = array(); - if ( is_multisite() && is_main_site() ) { - $registration_pages['.*wp-signup.php$'] = $this->index . '?signup=true'; - $registration_pages['.*wp-activate.php$'] = $this->index . '?activate=true'; - } - - // Deprecated. - $registration_pages['.*wp-register.php$'] = $this->index . '?register=true'; - - // Post rewrite rules. - $post_rewrite = $this->generate_rewrite_rules( $this->permalink_structure, EP_PERMALINK ); - - /** - * Filters rewrite rules used for "post" archives. - * - * @since 1.5.0 - * - * @param array $post_rewrite The rewrite rules for posts. - */ - $post_rewrite = apply_filters( 'post_rewrite_rules', $post_rewrite ); - - // Date rewrite rules. - $date_rewrite = $this->generate_rewrite_rules($this->get_date_permastruct(), EP_DATE); - - /** - * Filters rewrite rules used for date archives. - * - * Likely date archives would include /yyyy/, /yyyy/mm/, and /yyyy/mm/dd/. - * - * @since 1.5.0 - * - * @param array $date_rewrite The rewrite rules for date archives. - */ - $date_rewrite = apply_filters( 'date_rewrite_rules', $date_rewrite ); - - // Root-level rewrite rules. - $root_rewrite = $this->generate_rewrite_rules($this->root . '/', EP_ROOT); - - /** - * Filters rewrite rules used for root-level archives. - * - * Likely root-level archives would include pagination rules for the homepage - * as well as site-wide post feeds (e.g. /feed/, and /feed/atom/). - * - * @since 1.5.0 - * - * @param array $root_rewrite The root-level rewrite rules. - */ - $root_rewrite = apply_filters( 'root_rewrite_rules', $root_rewrite ); - - // Comments rewrite rules. - $comments_rewrite = $this->generate_rewrite_rules($this->root . $this->comments_base, EP_COMMENTS, false, true, true, false); - - /** - * Filters rewrite rules used for comment feed archives. - * - * Likely comments feed archives include /comments/feed/, and /comments/feed/atom/. - * - * @since 1.5.0 - * - * @param array $comments_rewrite The rewrite rules for the site-wide comments feeds. - */ - $comments_rewrite = apply_filters( 'comments_rewrite_rules', $comments_rewrite ); - - // Search rewrite rules. - $search_structure = $this->get_search_permastruct(); - $search_rewrite = $this->generate_rewrite_rules($search_structure, EP_SEARCH); - - /** - * Filters rewrite rules used for search archives. - * - * Likely search-related archives include /search/search+query/ as well as - * pagination and feed paths for a search. - * - * @since 1.5.0 - * - * @param array $search_rewrite The rewrite rules for search queries. - */ - $search_rewrite = apply_filters( 'search_rewrite_rules', $search_rewrite ); - - // Author rewrite rules. - $author_rewrite = $this->generate_rewrite_rules($this->get_author_permastruct(), EP_AUTHORS); - - /** - * Filters rewrite rules used for author archives. - * - * Likely author archives would include /author/author-name/, as well as - * pagination and feed paths for author archives. - * - * @since 1.5.0 - * - * @param array $author_rewrite The rewrite rules for author archives. - */ - $author_rewrite = apply_filters( 'author_rewrite_rules', $author_rewrite ); - - // Pages rewrite rules. - $page_rewrite = $this->page_rewrite_rules(); - - /** - * Filters rewrite rules used for "page" post type archives. - * - * @since 1.5.0 - * - * @param array $page_rewrite The rewrite rules for the "page" post type. - */ - $page_rewrite = apply_filters( 'page_rewrite_rules', $page_rewrite ); - - // Extra permastructs. - foreach ( $this->extra_permastructs as $permastructname => $struct ) { - if ( is_array( $struct ) ) { - if ( count( $struct ) == 2 ) - $rules = $this->generate_rewrite_rules( $struct[0], $struct[1] ); - else - $rules = $this->generate_rewrite_rules( $struct['struct'], $struct['ep_mask'], $struct['paged'], $struct['feed'], $struct['forcomments'], $struct['walk_dirs'], $struct['endpoints'] ); - } else { - $rules = $this->generate_rewrite_rules( $struct ); - } - - /** - * Filters rewrite rules used for individual permastructs. - * - * The dynamic portion of the hook name, `$permastructname`, refers - * to the name of the registered permastruct, e.g. 'post_tag' (tags), - * 'category' (categories), etc. - * - * @since 3.1.0 - * - * @param array $rules The rewrite rules generated for the current permastruct. - */ - $rules = apply_filters( "{$permastructname}_rewrite_rules", $rules ); - if ( 'post_tag' == $permastructname ) { - - /** - * Filters rewrite rules used specifically for Tags. - * - * @since 2.3.0 - * @deprecated 3.1.0 Use 'post_tag_rewrite_rules' instead - * - * @param array $rules The rewrite rules generated for tags. - */ - $rules = apply_filters( 'tag_rewrite_rules', $rules ); - } - - $this->extra_rules_top = array_merge($this->extra_rules_top, $rules); - } - - // Put them together. - if ( $this->use_verbose_page_rules ) - $this->rules = array_merge($this->extra_rules_top, $robots_rewrite, $deprecated_files, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite, $author_rewrite, $date_rewrite, $page_rewrite, $post_rewrite, $this->extra_rules); - else - $this->rules = array_merge($this->extra_rules_top, $robots_rewrite, $deprecated_files, $registration_pages, $root_rewrite, $comments_rewrite, $search_rewrite, $author_rewrite, $date_rewrite, $post_rewrite, $page_rewrite, $this->extra_rules); - - /** - * Fires after the rewrite rules are generated. - * - * @since 1.5.0 - * - * @param WP_Rewrite $this Current WP_Rewrite instance, passed by reference. - */ - do_action_ref_array( 'generate_rewrite_rules', array( &$this ) ); - - /** - * Filters the full set of generated rewrite rules. - * - * @since 1.5.0 - * - * @param array $this->rules The compiled array of rewrite rules. - */ - $this->rules = apply_filters( 'rewrite_rules_array', $this->rules ); - - return $this->rules; - } - - /** - * Retrieves the rewrite rules. - * - * The difference between this method and WP_Rewrite::rewrite_rules() is that - * this method stores the rewrite rules in the 'rewrite_rules' option and retrieves - * it. This prevents having to process all of the permalinks to get the rewrite rules - * in the form of caching. - * - * @since 1.5.0 - * @access public - * - * @return array Rewrite rules. - */ - public function wp_rewrite_rules() { - $this->rules = get_option('rewrite_rules'); - if ( empty($this->rules) ) { - $this->matches = 'matches'; - $this->rewrite_rules(); - if ( ! did_action( 'wp_loaded' ) ) { - add_action( 'wp_loaded', array( $this, 'flush_rules' ) ); - return $this->rules; - } - update_option('rewrite_rules', $this->rules); - } - - return $this->rules; - } - - /** - * Retrieves mod_rewrite-formatted rewrite rules to write to .htaccess. - * - * Does not actually write to the .htaccess file, but creates the rules for - * the process that will. - * - * Will add the non_wp_rules property rules to the .htaccess file before - * the WordPress rewrite rules one. - * - * @since 1.5.0 - * @access public - * - * @return string - */ - public function mod_rewrite_rules() { - if ( ! $this->using_permalinks() ) - return ''; - - $site_root = parse_url( site_url() ); - if ( isset( $site_root['path'] ) ) - $site_root = trailingslashit($site_root['path']); - - $home_root = parse_url(home_url()); - if ( isset( $home_root['path'] ) ) - $home_root = trailingslashit($home_root['path']); - else - $home_root = '/'; - - $rules = "<IfModule mod_rewrite.c>\n"; - $rules .= "RewriteEngine On\n"; - $rules .= "RewriteBase $home_root\n"; - - // Prevent -f checks on index.php. - $rules .= "RewriteRule ^index\.php$ - [L]\n"; - - // Add in the rules that don't redirect to WP's index.php (and thus shouldn't be handled by WP at all). - foreach ( (array) $this->non_wp_rules as $match => $query) { - // Apache 1.3 does not support the reluctant (non-greedy) modifier. - $match = str_replace('.+?', '.+', $match); - - $rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n"; - } - - if ( $this->use_verbose_rules ) { - $this->matches = ''; - $rewrite = $this->rewrite_rules(); - $num_rules = count($rewrite); - $rules .= "RewriteCond %{REQUEST_FILENAME} -f [OR]\n" . - "RewriteCond %{REQUEST_FILENAME} -d\n" . - "RewriteRule ^.*$ - [S=$num_rules]\n"; - - foreach ( (array) $rewrite as $match => $query) { - // Apache 1.3 does not support the reluctant (non-greedy) modifier. - $match = str_replace('.+?', '.+', $match); - - if ( strpos($query, $this->index) !== false ) - $rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n"; - else - $rules .= 'RewriteRule ^' . $match . ' ' . $site_root . $query . " [QSA,L]\n"; - } - } else { - $rules .= "RewriteCond %{REQUEST_FILENAME} !-f\n" . - "RewriteCond %{REQUEST_FILENAME} !-d\n" . - "RewriteRule . {$home_root}{$this->index} [L]\n"; - } - - $rules .= "</IfModule>\n"; - - /** - * Filters the list of rewrite rules formatted for output to an .htaccess file. - * - * @since 1.5.0 - * - * @param string $rules mod_rewrite Rewrite rules formatted for .htaccess. - */ - $rules = apply_filters( 'mod_rewrite_rules', $rules ); - - /** - * Filters the list of rewrite rules formatted for output to an .htaccess file. - * - * @since 1.5.0 - * @deprecated 1.5.0 Use the mod_rewrite_rules filter instead. - * - * @param string $rules mod_rewrite Rewrite rules formatted for .htaccess. - */ - return apply_filters( 'rewrite_rules', $rules ); - } - - /** - * Retrieves IIS7 URL Rewrite formatted rewrite rules to write to web.config file. - * - * Does not actually write to the web.config file, but creates the rules for - * the process that will. - * - * @since 2.8.0 - * @access public - * - * @param bool $add_parent_tags Optional. Whether to add parent tags to the rewrite rule sets. - * Default false. - * @return string IIS7 URL rewrite rule sets. - */ - public function iis7_url_rewrite_rules( $add_parent_tags = false ) { - if ( ! $this->using_permalinks() ) - return ''; - $rules = ''; - if ( $add_parent_tags ) { - $rules .= '<configuration> - <system.webServer> - <rewrite> - <rules>'; - } - - $rules .= ' - <rule name="WordPress: ' . esc_attr( home_url() ) . '" patternSyntax="Wildcard"> - <match url="*" /> - <conditions> - <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> - <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> - </conditions> - <action type="Rewrite" url="index.php" /> - </rule>'; - - if ( $add_parent_tags ) { - $rules .= ' - </rules> - </rewrite> - </system.webServer> -</configuration>'; - } - - /** - * Filters the list of rewrite rules formatted for output to a web.config. - * - * @since 2.8.0 - * - * @param string $rules Rewrite rules formatted for IIS web.config. - */ - return apply_filters( 'iis7_url_rewrite_rules', $rules ); - } - - /** - * Adds a rewrite rule that transforms a URL structure to a set of query vars. - * - * Any value in the $after parameter that isn't 'bottom' will result in the rule - * being placed at the top of the rewrite rules. - * - * @since 2.1.0 - * @since 4.4.0 Array support was added to the `$query` parameter. - * @access public - * - * @param string $regex Regular expression to match request against. - * @param string|array $query The corresponding query vars for this rewrite rule. - * @param string $after Optional. Priority of the new rule. Accepts 'top' - * or 'bottom'. Default 'bottom'. - */ - public function add_rule( $regex, $query, $after = 'bottom' ) { - if ( is_array( $query ) ) { - $external = false; - $query = add_query_arg( $query, 'index.php' ); - } else { - $index = false === strpos( $query, '?' ) ? strlen( $query ) : strpos( $query, '?' ); - $front = substr( $query, 0, $index ); - - $external = $front != $this->index; - } - - // "external" = it doesn't correspond to index.php. - if ( $external ) { - $this->add_external_rule( $regex, $query ); - } else { - if ( 'bottom' == $after ) { - $this->extra_rules = array_merge( $this->extra_rules, array( $regex => $query ) ); - } else { - $this->extra_rules_top = array_merge( $this->extra_rules_top, array( $regex => $query ) ); - } - } - } - - /** - * Adds a rewrite rule that doesn't correspond to index.php. - * - * @since 2.1.0 - * @access public - * - * @param string $regex Regular expression to match request against. - * @param string $query The corresponding query vars for this rewrite rule. - */ - public function add_external_rule( $regex, $query ) { - $this->non_wp_rules[ $regex ] = $query; - } - - /** - * Adds an endpoint, like /trackback/. - * - * @since 2.1.0 - * @since 3.9.0 $query_var parameter added. - * @since 4.3.0 Added support for skipping query var registration by passing `false` to `$query_var`. - * @access public - * - * @see add_rewrite_endpoint() for full documentation. - * @global WP $wp - * - * @param string $name Name of the endpoint. - * @param int $places Endpoint mask describing the places the endpoint should be added. - * @param string|bool $query_var Optional. Name of the corresponding query variable. Pass `false` to - * skip registering a query_var for this endpoint. Defaults to the - * value of `$name`. - */ - public function add_endpoint( $name, $places, $query_var = true ) { - global $wp; - - // For backward compatibility, if null has explicitly been passed as `$query_var`, assume `true`. - if ( true === $query_var || null === func_get_arg( 2 ) ) { - $query_var = $name; - } - $this->endpoints[] = array( $places, $name, $query_var ); - - if ( $query_var ) { - $wp->add_query_var( $query_var ); - } - } - - /** - * Adds a new permalink structure. - * - * A permalink structure (permastruct) is an abstract definition of a set of rewrite rules; - * it is an easy way of expressing a set of regular expressions that rewrite to a set of - * query strings. The new permastruct is added to the WP_Rewrite::$extra_permastructs array. - * - * When the rewrite rules are built by WP_Rewrite::rewrite_rules(), all of these extra - * permastructs are passed to WP_Rewrite::generate_rewrite_rules() which transforms them - * into the regular expressions that many love to hate. - * - * The `$args` parameter gives you control over how WP_Rewrite::generate_rewrite_rules() - * works on the new permastruct. - * - * @since 2.5.0 - * @access public - * - * @param string $name Name for permalink structure. - * @param string $struct Permalink structure (e.g. category/%category%) - * @param array $args { - * Optional. Arguments for building rewrite rules based on the permalink structure. - * Default empty array. - * - * @type bool $with_front Whether the structure should be prepended with `WP_Rewrite::$front`. - * Default true. - * @type int $ep_mask The endpoint mask defining which endpoints are added to the structure. - * Accepts `EP_NONE`, `EP_PERMALINK`, `EP_ATTACHMENT`, `EP_DATE`, `EP_YEAR`, - * `EP_MONTH`, `EP_DAY`, `EP_ROOT`, `EP_COMMENTS`, `EP_SEARCH`, `EP_CATEGORIES`, - * `EP_TAGS`, `EP_AUTHORS`, `EP_PAGES`, `EP_ALL_ARCHIVES`, and `EP_ALL`. - * Default `EP_NONE`. - * @type bool $paged Whether archive pagination rules should be added for the structure. - * Default true. - * @type bool $feed Whether feed rewrite rules should be added for the structure. Default true. - * @type bool $forcomments Whether the feed rules should be a query for a comments feed. Default false. - * @type bool $walk_dirs Whether the 'directories' making up the structure should be walked over - * and rewrite rules built for each in-turn. Default true. - * @type bool $endpoints Whether endpoints should be applied to the generated rules. Default true. - * } - */ - public function add_permastruct( $name, $struct, $args = array() ) { - // Back-compat for the old parameters: $with_front and $ep_mask. - if ( ! is_array( $args ) ) - $args = array( 'with_front' => $args ); - if ( func_num_args() == 4 ) - $args['ep_mask'] = func_get_arg( 3 ); - - $defaults = array( - 'with_front' => true, - 'ep_mask' => EP_NONE, - 'paged' => true, - 'feed' => true, - 'forcomments' => false, - 'walk_dirs' => true, - 'endpoints' => true, - ); - $args = array_intersect_key( $args, $defaults ); - $args = wp_parse_args( $args, $defaults ); - - if ( $args['with_front'] ) - $struct = $this->front . $struct; - else - $struct = $this->root . $struct; - $args['struct'] = $struct; - - $this->extra_permastructs[ $name ] = $args; - } - - /** - * Removes a permalink structure. - * - * @since 4.5.0 - * @access public - * - * @param string $name Name for permalink structure. - */ - public function remove_permastruct( $name ) { - unset( $this->extra_permastructs[ $name ] ); - } - - /** - * Removes rewrite rules and then recreate rewrite rules. - * - * Calls WP_Rewrite::wp_rewrite_rules() after removing the 'rewrite_rules' option. - * If the function named 'save_mod_rewrite_rules' exists, it will be called. - * - * @since 2.0.1 - * @access public - * - * @staticvar bool $do_hard_later - * - * @param bool $hard Whether to update .htaccess (hard flush) or just update rewrite_rules option (soft flush). Default is true (hard). - */ - public function flush_rules( $hard = true ) { - static $do_hard_later = null; - - // Prevent this action from running before everyone has registered their rewrites. - if ( ! did_action( 'wp_loaded' ) ) { - add_action( 'wp_loaded', array( $this, 'flush_rules' ) ); - $do_hard_later = ( isset( $do_hard_later ) ) ? $do_hard_later || $hard : $hard; - return; - } - - if ( isset( $do_hard_later ) ) { - $hard = $do_hard_later; - unset( $do_hard_later ); - } - - update_option( 'rewrite_rules', '' ); - $this->wp_rewrite_rules(); - - /** - * Filters whether a "hard" rewrite rule flush should be performed when requested. - * - * A "hard" flush updates .htaccess (Apache) or web.config (IIS). - * - * @since 3.7.0 - * - * @param bool $hard Whether to flush rewrite rules "hard". Default true. - */ - if ( ! $hard || ! apply_filters( 'flush_rewrite_rules_hard', true ) ) { - return; - } - if ( function_exists( 'save_mod_rewrite_rules' ) ) - save_mod_rewrite_rules(); - if ( function_exists( 'iis7_save_url_rewrite_rules' ) ) - iis7_save_url_rewrite_rules(); - } - - /** - * Sets up the object's properties. - * - * The 'use_verbose_page_rules' object property will be set to true if the - * permalink structure begins with one of the following: '%postname%', '%category%', - * '%tag%', or '%author%'. - * - * @since 1.5.0 - * @access public - */ - public function init() { - $this->extra_rules = $this->non_wp_rules = $this->endpoints = array(); - $this->permalink_structure = get_option('permalink_structure'); - $this->front = substr($this->permalink_structure, 0, strpos($this->permalink_structure, '%')); - $this->root = ''; - - if ( $this->using_index_permalinks() ) - $this->root = $this->index . '/'; - - unset($this->author_structure); - unset($this->date_structure); - unset($this->page_structure); - unset($this->search_structure); - unset($this->feed_structure); - unset($this->comment_feed_structure); - $this->use_trailing_slashes = ( '/' == substr($this->permalink_structure, -1, 1) ); - - // Enable generic rules for pages if permalink structure doesn't begin with a wildcard. - if ( preg_match("/^[^%]*%(?:postname|category|tag|author)%/", $this->permalink_structure) ) - $this->use_verbose_page_rules = true; - else - $this->use_verbose_page_rules = false; - } - - /** - * Sets the main permalink structure for the site. - * - * Will update the 'permalink_structure' option, if there is a difference - * between the current permalink structure and the parameter value. Calls - * WP_Rewrite::init() after the option is updated. - * - * Fires the {@see 'permalink_structure_changed'} action once the init call has - * processed passing the old and new values - * - * @since 1.5.0 - * @access public - * - * @param string $permalink_structure Permalink structure. - */ - public function set_permalink_structure($permalink_structure) { - if ( $permalink_structure != $this->permalink_structure ) { - $old_permalink_structure = $this->permalink_structure; - update_option('permalink_structure', $permalink_structure); - - $this->init(); - - /** - * Fires after the permalink structure is updated. - * - * @since 2.8.0 - * - * @param string $old_permalink_structure The previous permalink structure. - * @param string $permalink_structure The new permalink structure. - */ - do_action( 'permalink_structure_changed', $old_permalink_structure, $permalink_structure ); - } - } - - /** - * Sets the category base for the category permalink. - * - * Will update the 'category_base' option, if there is a difference between - * the current category base and the parameter value. Calls WP_Rewrite::init() - * after the option is updated. - * - * @since 1.5.0 - * @access public - * - * @param string $category_base Category permalink structure base. - */ - public function set_category_base($category_base) { - if ( $category_base != get_option('category_base') ) { - update_option('category_base', $category_base); - $this->init(); - } - } - - /** - * Sets the tag base for the tag permalink. - * - * Will update the 'tag_base' option, if there is a difference between the - * current tag base and the parameter value. Calls WP_Rewrite::init() after - * the option is updated. - * - * @since 2.3.0 - * @access public - * - * @param string $tag_base Tag permalink structure base. - */ - public function set_tag_base( $tag_base ) { - if ( $tag_base != get_option( 'tag_base') ) { - update_option( 'tag_base', $tag_base ); - $this->init(); - } - } - - /** - * Constructor - Calls init(), which runs setup. - * - * @since 1.5.0 - * @access public - * - */ - public function __construct() { - $this->init(); - } -} diff --git a/wp/wp-includes/class-wp-role.php b/wp/wp-includes/class-wp-role.php deleted file mode 100644 index 6c9702de..00000000 --- a/wp/wp-includes/class-wp-role.php +++ /dev/null @@ -1,115 +0,0 @@ -<?php -/** - * User API: WP_Role class - * - * @package WordPress - * @subpackage Users - * @since 4.4.0 - */ - -/** - * Core class used to extend the user roles API. - * - * @since 2.0.0 - */ -class WP_Role { - /** - * Role name. - * - * @since 2.0.0 - * @access public - * @var string - */ - public $name; - - /** - * List of capabilities the role contains. - * - * @since 2.0.0 - * @access public - * @var array - */ - public $capabilities; - - /** - * Constructor - Set up object properties. - * - * The list of capabilities, must have the key as the name of the capability - * and the value a boolean of whether it is granted to the role. - * - * @since 2.0.0 - * @access public - * - * @param string $role Role name. - * @param array $capabilities List of capabilities. - */ - public function __construct( $role, $capabilities ) { - $this->name = $role; - $this->capabilities = $capabilities; - } - - /** - * Assign role a capability. - * - * @since 2.0.0 - * @access public - * - * @param string $cap Capability name. - * @param bool $grant Whether role has capability privilege. - */ - public function add_cap( $cap, $grant = true ) { - $this->capabilities[$cap] = $grant; - wp_roles()->add_cap( $this->name, $cap, $grant ); - } - - /** - * Removes a capability from a role. - * - * This is a container for WP_Roles::remove_cap() to remove the - * capability from the role. That is to say, that WP_Roles::remove_cap() - * implements the functionality, but it also makes sense to use this class, - * because you don't need to enter the role name. - * - * @since 2.0.0 - * @access public - * - * @param string $cap Capability name. - */ - public function remove_cap( $cap ) { - unset( $this->capabilities[$cap] ); - wp_roles()->remove_cap( $this->name, $cap ); - } - - /** - * Determines whether the role has the given capability. - * - * The capabilities is passed through the {@see 'role_has_cap'} filter. - * The first parameter for the hook is the list of capabilities the class - * has assigned. The second parameter is the capability name to look for. - * The third and final parameter for the hook is the role name. - * - * @since 2.0.0 - * @access public - * - * @param string $cap Capability name. - * @return bool True if the role has the given capability. False otherwise. - */ - public function has_cap( $cap ) { - /** - * Filters which capabilities a role has. - * - * @since 2.0.0 - * - * @param array $capabilities Array of role capabilities. - * @param string $cap Capability name. - * @param string $name Role name. - */ - $capabilities = apply_filters( 'role_has_cap', $this->capabilities, $cap, $this->name ); - - if ( !empty( $capabilities[$cap] ) ) - return $capabilities[$cap]; - else - return false; - } - -} diff --git a/wp/wp-includes/class-wp-roles.php b/wp/wp-includes/class-wp-roles.php deleted file mode 100644 index 23e05d7b..00000000 --- a/wp/wp-includes/class-wp-roles.php +++ /dev/null @@ -1,288 +0,0 @@ -<?php -/** - * User API: WP_Roles class - * - * @package WordPress - * @subpackage Users - * @since 4.4.0 - */ - -/** - * Core class used to implement a user roles API. - * - * The role option is simple, the structure is organized by role name that store - * the name in value of the 'name' key. The capabilities are stored as an array - * in the value of the 'capability' key. - * - * array ( - * 'rolename' => array ( - * 'name' => 'rolename', - * 'capabilities' => array() - * ) - * ) - * - * @since 2.0.0 - */ -class WP_Roles { - /** - * List of roles and capabilities. - * - * @since 2.0.0 - * @access public - * @var array - */ - public $roles; - - /** - * List of the role objects. - * - * @since 2.0.0 - * @access public - * @var array - */ - public $role_objects = array(); - - /** - * List of role names. - * - * @since 2.0.0 - * @access public - * @var array - */ - public $role_names = array(); - - /** - * Option name for storing role list. - * - * @since 2.0.0 - * @access public - * @var string - */ - public $role_key; - - /** - * Whether to use the database for retrieval and storage. - * - * @since 2.1.0 - * @access public - * @var bool - */ - public $use_db = true; - - /** - * Constructor - * - * @since 2.0.0 - */ - public function __construct() { - $this->_init(); - } - - /** - * Make private/protected methods readable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param callable $name Method to call. - * @param array $arguments Arguments to pass when calling. - * @return mixed|false Return value of the callback, false otherwise. - */ - public function __call( $name, $arguments ) { - if ( '_init' === $name ) { - return call_user_func_array( array( $this, $name ), $arguments ); - } - return false; - } - - /** - * Set up the object properties. - * - * The role key is set to the current prefix for the $wpdb object with - * 'user_roles' appended. If the $wp_user_roles global is set, then it will - * be used and the role option will not be updated or used. - * - * @since 2.1.0 - * @access protected - * - * @global array $wp_user_roles Used to set the 'roles' property value. - */ - protected function _init() { - global $wp_user_roles, $wpdb; - - $this->role_key = $wpdb->get_blog_prefix() . 'user_roles'; - if ( ! empty( $wp_user_roles ) ) { - $this->roles = $wp_user_roles; - $this->use_db = false; - } else { - $this->roles = get_option( $this->role_key ); - } - - if ( empty( $this->roles ) ) - return; - - $this->role_objects = array(); - $this->role_names = array(); - foreach ( array_keys( $this->roles ) as $role ) { - $this->role_objects[$role] = new WP_Role( $role, $this->roles[$role]['capabilities'] ); - $this->role_names[$role] = $this->roles[$role]['name']; - } - - /** - * After the roles have been initialized, allow plugins to add their own roles. - * - * @since 4.7.0 - * - * @param WP_Roles $this A reference to the WP_Roles object. - */ - do_action( 'wp_roles_init', $this ); - } - - /** - * Reinitialize the object - * - * Recreates the role objects. This is typically called only by switch_to_blog() - * after switching wpdb to a new site ID. - * - * @since 3.5.0 - * @deprecated 4.7.0 Use new WP_Roles() - * @access public - */ - public function reinit() { - _deprecated_function( __METHOD__, '4.7.0', 'new WP_Roles()' ); - $this->_init(); - } - - /** - * Add role name with capabilities to list. - * - * Updates the list of roles, if the role doesn't already exist. - * - * The capabilities are defined in the following format `array( 'read' => true );` - * To explicitly deny a role a capability you set the value for that capability to false. - * - * @since 2.0.0 - * @access public - * - * @param string $role Role name. - * @param string $display_name Role display name. - * @param array $capabilities List of role capabilities in the above format. - * @return WP_Role|void WP_Role object, if role is added. - */ - public function add_role( $role, $display_name, $capabilities = array() ) { - if ( empty( $role ) || isset( $this->roles[ $role ] ) ) { - return; - } - - $this->roles[$role] = array( - 'name' => $display_name, - 'capabilities' => $capabilities - ); - if ( $this->use_db ) - update_option( $this->role_key, $this->roles ); - $this->role_objects[$role] = new WP_Role( $role, $capabilities ); - $this->role_names[$role] = $display_name; - return $this->role_objects[$role]; - } - - /** - * Remove role by name. - * - * @since 2.0.0 - * @access public - * - * @param string $role Role name. - */ - public function remove_role( $role ) { - if ( ! isset( $this->role_objects[$role] ) ) - return; - - unset( $this->role_objects[$role] ); - unset( $this->role_names[$role] ); - unset( $this->roles[$role] ); - - if ( $this->use_db ) - update_option( $this->role_key, $this->roles ); - - if ( get_option( 'default_role' ) == $role ) - update_option( 'default_role', 'subscriber' ); - } - - /** - * Add capability to role. - * - * @since 2.0.0 - * @access public - * - * @param string $role Role name. - * @param string $cap Capability name. - * @param bool $grant Optional, default is true. Whether role is capable of performing capability. - */ - public function add_cap( $role, $cap, $grant = true ) { - if ( ! isset( $this->roles[$role] ) ) - return; - - $this->roles[$role]['capabilities'][$cap] = $grant; - if ( $this->use_db ) - update_option( $this->role_key, $this->roles ); - } - - /** - * Remove capability from role. - * - * @since 2.0.0 - * @access public - * - * @param string $role Role name. - * @param string $cap Capability name. - */ - public function remove_cap( $role, $cap ) { - if ( ! isset( $this->roles[$role] ) ) - return; - - unset( $this->roles[$role]['capabilities'][$cap] ); - if ( $this->use_db ) - update_option( $this->role_key, $this->roles ); - } - - /** - * Retrieve role object by name. - * - * @since 2.0.0 - * @access public - * - * @param string $role Role name. - * @return WP_Role|null WP_Role object if found, null if the role does not exist. - */ - public function get_role( $role ) { - if ( isset( $this->role_objects[$role] ) ) - return $this->role_objects[$role]; - else - return null; - } - - /** - * Retrieve list of role names. - * - * @since 2.0.0 - * @access public - * - * @return array List of role names. - */ - public function get_names() { - return $this->role_names; - } - - /** - * Whether role name is currently in the list of available roles. - * - * @since 2.0.0 - * @access public - * - * @param string $role Role name to look up. - * @return bool - */ - public function is_role( $role ) { - return isset( $this->role_names[$role] ); - } -} diff --git a/wp/wp-includes/class-wp-session-tokens.php b/wp/wp-includes/class-wp-session-tokens.php deleted file mode 100644 index 2f498b84..00000000 --- a/wp/wp-includes/class-wp-session-tokens.php +++ /dev/null @@ -1,317 +0,0 @@ -<?php -/** - * Session API: WP_Session_Tokens class - * - * @package WordPress - * @subpackage Session - * @since 4.7.0 - */ - -/** - * Abstract class for managing user session tokens. - * - * @since 4.0.0 - */ -abstract class WP_Session_Tokens { - - /** - * User ID. - * - * @since 4.0.0 - * @access protected - * @var int User ID. - */ - protected $user_id; - - /** - * Protected constructor. - * - * @since 4.0.0 - * - * @param int $user_id User whose session to manage. - */ - protected function __construct( $user_id ) { - $this->user_id = $user_id; - } - - /** - * Get a session token manager instance for a user. - * - * This method contains a filter that allows a plugin to swap out - * the session manager for a subclass of WP_Session_Tokens. - * - * @since 4.0.0 - * @access public - * @static - * - * @param int $user_id User whose session to manage. - */ - final public static function get_instance( $user_id ) { - /** - * Filters the session token manager used. - * - * @since 4.0.0 - * - * @param string $session Name of class to use as the manager. - * Default 'WP_User_Meta_Session_Tokens'. - */ - $manager = apply_filters( 'session_token_manager', 'WP_User_Meta_Session_Tokens' ); - return new $manager( $user_id ); - } - - /** - * Hashes a session token for storage. - * - * @since 4.0.0 - * @access private - * - * @param string $token Session token to hash. - * @return string A hash of the session token (a verifier). - */ - final private function hash_token( $token ) { - // If ext/hash is not present, use sha1() instead. - if ( function_exists( 'hash' ) ) { - return hash( 'sha256', $token ); - } else { - return sha1( $token ); - } - } - - /** - * Get a user's session. - * - * @since 4.0.0 - * @access public - * - * @param string $token Session token - * @return array User session - */ - final public function get( $token ) { - $verifier = $this->hash_token( $token ); - return $this->get_session( $verifier ); - } - - /** - * Validate a user's session token as authentic. - * - * Checks that the given token is present and hasn't expired. - * - * @since 4.0.0 - * @access public - * - * @param string $token Token to verify. - * @return bool Whether the token is valid for the user. - */ - final public function verify( $token ) { - $verifier = $this->hash_token( $token ); - return (bool) $this->get_session( $verifier ); - } - - /** - * Generate a session token and attach session information to it. - * - * A session token is a long, random string. It is used in a cookie - * link that cookie to an expiration time and to ensure the cookie - * becomes invalidated upon logout. - * - * This function generates a token and stores it with the associated - * expiration time (and potentially other session information via the - * {@see 'attach_session_information'} filter). - * - * @since 4.0.0 - * @access public - * - * @param int $expiration Session expiration timestamp. - * @return string Session token. - */ - final public function create( $expiration ) { - /** - * Filters the information attached to the newly created session. - * - * Could be used in the future to attach information such as - * IP address or user agent to a session. - * - * @since 4.0.0 - * - * @param array $session Array of extra data. - * @param int $user_id User ID. - */ - $session = apply_filters( 'attach_session_information', array(), $this->user_id ); - $session['expiration'] = $expiration; - - // IP address. - if ( !empty( $_SERVER['REMOTE_ADDR'] ) ) { - $session['ip'] = $_SERVER['REMOTE_ADDR']; - } - - // User-agent. - if ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) { - $session['ua'] = wp_unslash( $_SERVER['HTTP_USER_AGENT'] ); - } - - // Timestamp - $session['login'] = time(); - - $token = wp_generate_password( 43, false, false ); - - $this->update( $token, $session ); - - return $token; - } - - /** - * Update a session token. - * - * @since 4.0.0 - * @access public - * - * @param string $token Session token to update. - * @param array $session Session information. - */ - final public function update( $token, $session ) { - $verifier = $this->hash_token( $token ); - $this->update_session( $verifier, $session ); - } - - /** - * Destroy a session token. - * - * @since 4.0.0 - * @access public - * - * @param string $token Session token to destroy. - */ - final public function destroy( $token ) { - $verifier = $this->hash_token( $token ); - $this->update_session( $verifier, null ); - } - - /** - * Destroy all session tokens for this user, - * except a single token, presumably the one in use. - * - * @since 4.0.0 - * @access public - * - * @param string $token_to_keep Session token to keep. - */ - final public function destroy_others( $token_to_keep ) { - $verifier = $this->hash_token( $token_to_keep ); - $session = $this->get_session( $verifier ); - if ( $session ) { - $this->destroy_other_sessions( $verifier ); - } else { - $this->destroy_all_sessions(); - } - } - - /** - * Determine whether a session token is still valid, - * based on expiration. - * - * @since 4.0.0 - * @access protected - * - * @param array $session Session to check. - * @return bool Whether session is valid. - */ - final protected function is_still_valid( $session ) { - return $session['expiration'] >= time(); - } - - /** - * Destroy all session tokens for a user. - * - * @since 4.0.0 - * @access public - */ - final public function destroy_all() { - $this->destroy_all_sessions(); - } - - /** - * Destroy all session tokens for all users. - * - * @since 4.0.0 - * @access public - * @static - */ - final public static function destroy_all_for_all_users() { - $manager = apply_filters( 'session_token_manager', 'WP_User_Meta_Session_Tokens' ); - call_user_func( array( $manager, 'drop_sessions' ) ); - } - - /** - * Retrieve all sessions of a user. - * - * @since 4.0.0 - * @access public - * - * @return array Sessions of a user. - */ - final public function get_all() { - return array_values( $this->get_sessions() ); - } - - /** - * This method should retrieve all sessions of a user, keyed by verifier. - * - * @since 4.0.0 - * @access protected - * - * @return array Sessions of a user, keyed by verifier. - */ - abstract protected function get_sessions(); - - /** - * This method should look up a session by its verifier (token hash). - * - * @since 4.0.0 - * @access protected - * - * @param string $verifier Verifier of the session to retrieve. - * @return array|null The session, or null if it does not exist. - */ - abstract protected function get_session( $verifier ); - - /** - * This method should update a session by its verifier. - * - * Omitting the second argument should destroy the session. - * - * @since 4.0.0 - * @access protected - * - * @param string $verifier Verifier of the session to update. - * @param array $session Optional. Session. Omitting this argument destroys the session. - */ - abstract protected function update_session( $verifier, $session = null ); - - /** - * This method should destroy all session tokens for this user, - * except a single session passed. - * - * @since 4.0.0 - * @access protected - * - * @param string $verifier Verifier of the session to keep. - */ - abstract protected function destroy_other_sessions( $verifier ); - - /** - * This method should destroy all sessions for a user. - * - * @since 4.0.0 - * @access protected - */ - abstract protected function destroy_all_sessions(); - - /** - * This static method should destroy all session tokens for all users. - * - * @since 4.0.0 - * @access public - * @static - */ - public static function drop_sessions() {} -} diff --git a/wp/wp-includes/class-wp-simplepie-file.php b/wp/wp-includes/class-wp-simplepie-file.php deleted file mode 100644 index b87df7d9..00000000 --- a/wp/wp-includes/class-wp-simplepie-file.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php -/** - * Feed API: WP_SimplePie_File class - * - * @package WordPress - * @subpackage Feed - * @since 4.7.0 - */ - -/** - * Core class for fetching remote files and reading local files with SimplePie. - * - * @since 2.8.0 - * - * @see SimplePie_File - */ -class WP_SimplePie_File extends SimplePie_File { - - /** - * Constructor. - * - * @since 2.8.0 - * @since 3.2.0 Updated to use a PHP5 constructor. - * @access public - * - * @param string $url Remote file URL. - * @param integer $timeout Optional. How long the connection should stay open in seconds. - * Default 10. - * @param integer $redirects Optional. The number of allowed redirects. Default 5. - * @param string|array $headers Optional. Array or string of headers to send with the request. - * Default null. - * @param string $useragent Optional. User-agent value sent. Default null. - * @param boolean $force_fsockopen Optional. Whether to force opening internet or unix domain socket - * connection or not. Default false. - */ - public function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false) { - $this->url = $url; - $this->timeout = $timeout; - $this->redirects = $redirects; - $this->headers = $headers; - $this->useragent = $useragent; - - $this->method = SIMPLEPIE_FILE_SOURCE_REMOTE; - - if ( preg_match('/^http(s)?:\/\//i', $url) ) { - $args = array( - 'timeout' => $this->timeout, - 'redirection' => $this->redirects, - ); - - if ( !empty($this->headers) ) - $args['headers'] = $this->headers; - - if ( SIMPLEPIE_USERAGENT != $this->useragent ) //Use default WP user agent unless custom has been specified - $args['user-agent'] = $this->useragent; - - $res = wp_safe_remote_request($url, $args); - - if ( is_wp_error($res) ) { - $this->error = 'WP HTTP Error: ' . $res->get_error_message(); - $this->success = false; - } else { - $this->headers = wp_remote_retrieve_headers( $res ); - $this->body = wp_remote_retrieve_body( $res ); - $this->status_code = wp_remote_retrieve_response_code( $res ); - } - } else { - $this->error = ''; - $this->success = false; - } - } -} diff --git a/wp/wp-includes/class-wp-simplepie-sanitize-kses.php b/wp/wp-includes/class-wp-simplepie-sanitize-kses.php deleted file mode 100644 index dce5edce..00000000 --- a/wp/wp-includes/class-wp-simplepie-sanitize-kses.php +++ /dev/null @@ -1,59 +0,0 @@ -<?php -/** - * Feed API: WP_SimplePie_Sanitize_KSES class - * - * @package WordPress - * @subpackage Feed - * @since 4.7.0 - */ - -/** - * Core class used to implement SimpliePie feed sanitization. - * - * Extends the SimplePie_Sanitize class to use KSES, because - * we cannot universally count on DOMDocument being available. - * - * @since 3.5.0 - * - * @see SimplePie_Sanitize - */ -class WP_SimplePie_Sanitize_KSES extends SimplePie_Sanitize { - - /** - * WordPress SimplePie sanitization using KSES. - * - * Sanitizes the incoming data, to ensure that it matches the type of data expected, using KSES. - * - * @since 3.5.0 - * @access public - * - * @param mixed $data The data that needs to be sanitized. - * @param integer $type The type of data that it's supposed to be. - * @param string $base Optional. The `xml:base` value to use when converting relative - * URLs to absolute ones. Default empty. - * @return mixed Sanitized data. - */ - public function sanitize( $data, $type, $base = '' ) { - $data = trim( $data ); - if ( $type & SIMPLEPIE_CONSTRUCT_MAYBE_HTML ) { - if (preg_match('/(&(#(x[0-9a-fA-F]+|[0-9]+)|[a-zA-Z0-9]+)|<\/[A-Za-z][^\x09\x0A\x0B\x0C\x0D\x20\x2F\x3E]*' . SIMPLEPIE_PCRE_HTML_ATTRIBUTE . '>)/', $data)) { - $type |= SIMPLEPIE_CONSTRUCT_HTML; - } - else { - $type |= SIMPLEPIE_CONSTRUCT_TEXT; - } - } - if ( $type & SIMPLEPIE_CONSTRUCT_BASE64 ) { - $data = base64_decode( $data ); - } - if ( $type & ( SIMPLEPIE_CONSTRUCT_HTML | SIMPLEPIE_CONSTRUCT_XHTML ) ) { - $data = wp_kses_post( $data ); - if ( $this->output_encoding !== 'UTF-8' ) { - $data = $this->registry->call( 'Misc', 'change_encoding', array( $data, 'UTF-8', $this->output_encoding ) ); - } - return $data; - } else { - return parent::sanitize( $data, $type, $base ); - } - } -} diff --git a/wp/wp-includes/class-wp-site-query.php b/wp/wp-includes/class-wp-site-query.php deleted file mode 100644 index 8f52372d..00000000 --- a/wp/wp-includes/class-wp-site-query.php +++ /dev/null @@ -1,689 +0,0 @@ -<?php -/** - * Site API: WP_Site_Query class - * - * @package WordPress - * @subpackage Sites - * @since 4.6.0 - */ - -/** - * Core class used for querying sites. - * - * @since 4.6.0 - * - * @see WP_Site_Query::__construct() for accepted arguments. - */ -class WP_Site_Query { - - /** - * SQL for database query. - * - * @since 4.6.0 - * @access public - * @var string - */ - public $request; - - /** - * SQL query clauses. - * - * @since 4.6.0 - * @access protected - * @var array - */ - protected $sql_clauses = array( - 'select' => '', - 'from' => '', - 'where' => array(), - 'groupby' => '', - 'orderby' => '', - 'limits' => '', - ); - - /** - * Date query container. - * - * @since 4.6.0 - * @access public - * @var object WP_Date_Query - */ - public $date_query = false; - - /** - * Query vars set by the user. - * - * @since 4.6.0 - * @access public - * @var array - */ - public $query_vars; - - /** - * Default values for query vars. - * - * @since 4.6.0 - * @access public - * @var array - */ - public $query_var_defaults; - - /** - * List of sites located by the query. - * - * @since 4.6.0 - * @access public - * @var array - */ - public $sites; - - /** - * The amount of found sites for the current query. - * - * @since 4.6.0 - * @access public - * @var int - */ - public $found_sites = 0; - - /** - * The number of pages. - * - * @since 4.6.0 - * @access public - * @var int - */ - public $max_num_pages = 0; - - /** - * Sets up the site query, based on the query vars passed. - * - * @since 4.6.0 - * @access public - * - * @param string|array $query { - * Optional. Array or query string of site query parameters. Default empty. - * - * @type array $site__in Array of site IDs to include. Default empty. - * @type array $site__not_in Array of site IDs to exclude. Default empty. - * @type bool $count Whether to return a site count (true) or array of site objects. - * Default false. - * @type array $date_query Date query clauses to limit sites by. See WP_Date_Query. - * Default null. - * @type string $fields Site fields to return. Accepts 'ids' (returns an array of site IDs) - * or empty (returns an array of complete site objects). Default empty. - * @type int $ID A site ID to only return that site. Default empty. - * @type int $number Maximum number of sites to retrieve. Default 100. - * @type int $offset Number of sites to offset the query. Used to build LIMIT clause. - * Default 0. - * @type bool $no_found_rows Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true. - * @type string|array $orderby Site status or array of statuses. Accepts 'id', 'domain', 'path', - * 'network_id', 'last_updated', 'registered', 'domain_length', - * 'path_length', 'site__in' and 'network__in'. Also accepts false, - * an empty array, or 'none' to disable `ORDER BY` clause. - * Default 'id'. - * @type string $order How to order retrieved sites. Accepts 'ASC', 'DESC'. Default 'ASC'. - * @type int $network_id Limit results to those affiliated with a given network ID. If 0, - * include all networks. Default 0. - * @type array $network__in Array of network IDs to include affiliated sites for. Default empty. - * @type array $network__not_in Array of network IDs to exclude affiliated sites for. Default empty. - * @type string $domain Limit results to those affiliated with a given domain. Default empty. - * @type array $domain__in Array of domains to include affiliated sites for. Default empty. - * @type array $domain__not_in Array of domains to exclude affiliated sites for. Default empty. - * @type string $path Limit results to those affiliated with a given path. Default empty. - * @type array $path__in Array of paths to include affiliated sites for. Default empty. - * @type array $path__not_in Array of paths to exclude affiliated sites for. Default empty. - * @type int $public Limit results to public sites. Accepts '1' or '0'. Default empty. - * @type int $archived Limit results to archived sites. Accepts '1' or '0'. Default empty. - * @type int $mature Limit results to mature sites. Accepts '1' or '0'. Default empty. - * @type int $spam Limit results to spam sites. Accepts '1' or '0'. Default empty. - * @type int $deleted Limit results to deleted sites. Accepts '1' or '0'. Default empty. - * @type string $search Search term(s) to retrieve matching sites for. Default empty. - * @type array $search_columns Array of column names to be searched. Accepts 'domain' and 'path'. - * Default empty array. - * @type bool $update_site_cache Whether to prime the cache for found sites. Default false. - * } - */ - public function __construct( $query = '' ) { - $this->query_var_defaults = array( - 'fields' => '', - 'ID' => '', - 'site__in' => '', - 'site__not_in' => '', - 'number' => 100, - 'offset' => '', - 'no_found_rows' => true, - 'orderby' => 'id', - 'order' => 'ASC', - 'network_id' => 0, - 'network__in' => '', - 'network__not_in' => '', - 'domain' => '', - 'domain__in' => '', - 'domain__not_in' => '', - 'path' => '', - 'path__in' => '', - 'path__not_in' => '', - 'public' => null, - 'archived' => null, - 'mature' => null, - 'spam' => null, - 'deleted' => null, - 'search' => '', - 'search_columns' => array(), - 'count' => false, - 'date_query' => null, // See WP_Date_Query - 'update_site_cache' => true, - ); - - if ( ! empty( $query ) ) { - $this->query( $query ); - } - } - - /** - * Parses arguments passed to the site query with default query parameters. - * - * @since 4.6.0 - * @access public - * - * @see WP_Site_Query::__construct() - * - * @param string|array $query Array or string of WP_Site_Query arguments. See WP_Site_Query::__construct(). - */ - public function parse_query( $query = '' ) { - if ( empty( $query ) ) { - $query = $this->query_vars; - } - - $this->query_vars = wp_parse_args( $query, $this->query_var_defaults ); - - /** - * Fires after the site query vars have been parsed. - * - * @since 4.6.0 - * - * @param WP_Site_Query &$this The WP_Site_Query instance (passed by reference). - */ - do_action_ref_array( 'parse_site_query', array( &$this ) ); - } - - /** - * Sets up the WordPress query for retrieving sites. - * - * @since 4.6.0 - * @access public - * - * @param string|array $query Array or URL query string of parameters. - * @return array|int List of sites, or number of sites when 'count' is passed as a query var. - */ - public function query( $query ) { - $this->query_vars = wp_parse_args( $query ); - - return $this->get_sites(); - } - - /** - * Retrieves a list of sites matching the query vars. - * - * @since 4.6.0 - * @access public - * - * @return array|int List of sites, or number of sites when 'count' is passed as a query var. - */ - public function get_sites() { - $this->parse_query(); - - /** - * Fires before sites are retrieved. - * - * @since 4.6.0 - * - * @param WP_Site_Query &$this Current instance of WP_Site_Query, passed by reference. - */ - do_action_ref_array( 'pre_get_sites', array( &$this ) ); - - // $args can include anything. Only use the args defined in the query_var_defaults to compute the key. - $key = md5( serialize( wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ) ) ); - $last_changed = wp_cache_get_last_changed( 'sites' ); - - $cache_key = "get_sites:$key:$last_changed"; - $cache_value = wp_cache_get( $cache_key, 'sites' ); - - if ( false === $cache_value ) { - $site_ids = $this->get_site_ids(); - if ( $site_ids ) { - $this->set_found_sites(); - } - - $cache_value = array( - 'site_ids' => $site_ids, - 'found_sites' => $this->found_sites, - ); - wp_cache_add( $cache_key, $cache_value, 'sites' ); - } else { - $site_ids = $cache_value['site_ids']; - $this->found_sites = $cache_value['found_sites']; - } - - if ( $this->found_sites && $this->query_vars['number'] ) { - $this->max_num_pages = ceil( $this->found_sites / $this->query_vars['number'] ); - } - - // If querying for a count only, there's nothing more to do. - if ( $this->query_vars['count'] ) { - // $site_ids is actually a count in this case. - return intval( $site_ids ); - } - - $site_ids = array_map( 'intval', $site_ids ); - - if ( 'ids' == $this->query_vars['fields'] ) { - $this->sites = $site_ids; - - return $this->sites; - } - - // Prime site network caches. - if ( $this->query_vars['update_site_cache'] ) { - _prime_site_caches( $site_ids ); - } - - // Fetch full site objects from the primed cache. - $_sites = array(); - foreach ( $site_ids as $site_id ) { - if ( $_site = get_site( $site_id ) ) { - $_sites[] = $_site; - } - } - - /** - * Filters the site query results. - * - * @since 4.6.0 - * - * @param array $results An array of sites. - * @param WP_Site_Query &$this Current instance of WP_Site_Query, passed by reference. - */ - $_sites = apply_filters_ref_array( 'the_sites', array( $_sites, &$this ) ); - - // Convert to WP_Site instances. - $this->sites = array_map( 'get_site', $_sites ); - - return $this->sites; - } - - /** - * Used internally to get a list of site IDs matching the query vars. - * - * @since 4.6.0 - * @access protected - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @return int|array A single count of site IDs if a count query. An array of site IDs if a full query. - */ - protected function get_site_ids() { - global $wpdb; - - $order = $this->parse_order( $this->query_vars['order'] ); - - // Disable ORDER BY with 'none', an empty array, or boolean false. - if ( in_array( $this->query_vars['orderby'], array( 'none', array(), false ), true ) ) { - $orderby = ''; - } elseif ( ! empty( $this->query_vars['orderby'] ) ) { - $ordersby = is_array( $this->query_vars['orderby'] ) ? - $this->query_vars['orderby'] : - preg_split( '/[,\s]/', $this->query_vars['orderby'] ); - - $orderby_array = array(); - foreach ( $ordersby as $_key => $_value ) { - if ( ! $_value ) { - continue; - } - - if ( is_int( $_key ) ) { - $_orderby = $_value; - $_order = $order; - } else { - $_orderby = $_key; - $_order = $_value; - } - - $parsed = $this->parse_orderby( $_orderby ); - - if ( ! $parsed ) { - continue; - } - - if ( 'site__in' === $_orderby || 'network__in' === $_orderby ) { - $orderby_array[] = $parsed; - continue; - } - - $orderby_array[] = $parsed . ' ' . $this->parse_order( $_order ); - } - - $orderby = implode( ', ', $orderby_array ); - } else { - $orderby = "blog_id $order"; - } - - $number = absint( $this->query_vars['number'] ); - $offset = absint( $this->query_vars['offset'] ); - - if ( ! empty( $number ) ) { - if ( $offset ) { - $limits = 'LIMIT ' . $offset . ',' . $number; - } else { - $limits = 'LIMIT ' . $number; - } - } - - if ( $this->query_vars['count'] ) { - $fields = 'COUNT(*)'; - } else { - $fields = 'blog_id'; - } - - // Parse site IDs for an IN clause. - $site_id = absint( $this->query_vars['ID'] ); - if ( ! empty( $site_id ) ) { - $this->sql_clauses['where']['ID'] = $wpdb->prepare( 'blog_id = %d', $site_id ); - } - - // Parse site IDs for an IN clause. - if ( ! empty( $this->query_vars['site__in'] ) ) { - $this->sql_clauses['where']['site__in'] = "blog_id IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['site__in'] ) ) . ' )'; - } - - // Parse site IDs for a NOT IN clause. - if ( ! empty( $this->query_vars['site__not_in'] ) ) { - $this->sql_clauses['where']['site__not_in'] = "blog_id NOT IN ( " . implode( ',', wp_parse_id_list( $this->query_vars['site__not_in'] ) ) . ' )'; - } - - $network_id = absint( $this->query_vars['network_id'] ); - - if ( ! empty( $network_id ) ) { - $this->sql_clauses['where']['network_id'] = $wpdb->prepare( 'site_id = %d', $network_id ); - } - - // Parse site network IDs for an IN clause. - if ( ! empty( $this->query_vars['network__in'] ) ) { - $this->sql_clauses['where']['network__in'] = 'site_id IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['network__in'] ) ) . ' )'; - } - - // Parse site network IDs for a NOT IN clause. - if ( ! empty( $this->query_vars['network__not_in'] ) ) { - $this->sql_clauses['where']['network__not_in'] = 'site_id NOT IN ( ' . implode( ',', wp_parse_id_list( $this->query_vars['network__not_in'] ) ) . ' )'; - } - - if ( ! empty( $this->query_vars['domain'] ) ) { - $this->sql_clauses['where']['domain'] = $wpdb->prepare( 'domain = %s', $this->query_vars['domain'] ); - } - - // Parse site domain for an IN clause. - if ( is_array( $this->query_vars['domain__in'] ) ) { - $this->sql_clauses['where']['domain__in'] = "domain IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__in'] ) ) . "' )"; - } - - // Parse site domain for a NOT IN clause. - if ( is_array( $this->query_vars['domain__not_in'] ) ) { - $this->sql_clauses['where']['domain__not_in'] = "domain NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['domain__not_in'] ) ) . "' )"; - } - - if ( ! empty( $this->query_vars['path'] ) ) { - $this->sql_clauses['where']['path'] = $wpdb->prepare( 'path = %s', $this->query_vars['path'] ); - } - - // Parse site path for an IN clause. - if ( is_array( $this->query_vars['path__in'] ) ) { - $this->sql_clauses['where']['path__in'] = "path IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__in'] ) ) . "' )"; - } - - // Parse site path for a NOT IN clause. - if ( is_array( $this->query_vars['path__not_in'] ) ) { - $this->sql_clauses['where']['path__not_in'] = "path NOT IN ( '" . implode( "', '", $wpdb->_escape( $this->query_vars['path__not_in'] ) ) . "' )"; - } - - if ( is_numeric( $this->query_vars['archived'] ) ) { - $archived = absint( $this->query_vars['archived'] ); - $this->sql_clauses['where']['archived'] = $wpdb->prepare( "archived = %d ", $archived ); - } - - if ( is_numeric( $this->query_vars['mature'] ) ) { - $mature = absint( $this->query_vars['mature'] ); - $this->sql_clauses['where']['mature'] = $wpdb->prepare( "mature = %d ", $mature ); - } - - if ( is_numeric( $this->query_vars['spam'] ) ) { - $spam = absint( $this->query_vars['spam'] ); - $this->sql_clauses['where']['spam'] = $wpdb->prepare( "spam = %d ", $spam ); - } - - if ( is_numeric( $this->query_vars['deleted'] ) ) { - $deleted = absint( $this->query_vars['deleted'] ); - $this->sql_clauses['where']['deleted'] = $wpdb->prepare( "deleted = %d ", $deleted ); - } - - if ( is_numeric( $this->query_vars['public'] ) ) { - $public = absint( $this->query_vars['public'] ); - $this->sql_clauses['where']['public'] = $wpdb->prepare( "public = %d ", $public ); - } - - // Falsey search strings are ignored. - if ( strlen( $this->query_vars['search'] ) ) { - $search_columns = array(); - - if ( $this->query_vars['search_columns'] ) { - $search_columns = array_intersect( $this->query_vars['search_columns'], array( 'domain', 'path' ) ); - } - - if ( ! $search_columns ) { - $search_columns = array( 'domain', 'path' ); - } - - /** - * Filters the columns to search in a WP_Site_Query search. - * - * The default columns include 'domain' and 'path. - * - * @since 4.6.0 - * - * @param array $search_columns Array of column names to be searched. - * @param string $search Text being searched. - * @param WP_Site_Query $this The current WP_Site_Query instance. - */ - $search_columns = apply_filters( 'site_search_columns', $search_columns, $this->query_vars['search'], $this ); - - $this->sql_clauses['where']['search'] = $this->get_search_sql( $this->query_vars['search'], $search_columns ); - } - - $date_query = $this->query_vars['date_query']; - if ( ! empty( $date_query ) && is_array( $date_query ) ) { - $this->date_query = new WP_Date_Query( $date_query, 'registered' ); - $this->sql_clauses['where']['date_query'] = preg_replace( '/^\s*AND\s*/', '', $this->date_query->get_sql() ); - } - - $join = ''; - - $where = implode( ' AND ', $this->sql_clauses['where'] ); - - $pieces = array( 'fields', 'join', 'where', 'orderby', 'limits', 'groupby' ); - - /** - * Filters the site query clauses. - * - * @since 4.6.0 - * - * @param array $pieces A compacted array of site query clauses. - * @param WP_Site_Query &$this Current instance of WP_Site_Query, passed by reference. - */ - $clauses = apply_filters_ref_array( 'sites_clauses', array( compact( $pieces ), &$this ) ); - - $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; - $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; - $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; - $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; - $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : ''; - $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; - - if ( $where ) { - $where = 'WHERE ' . $where; - } - - if ( $groupby ) { - $groupby = 'GROUP BY ' . $groupby; - } - - if ( $orderby ) { - $orderby = "ORDER BY $orderby"; - } - - $found_rows = ''; - if ( ! $this->query_vars['no_found_rows'] ) { - $found_rows = 'SQL_CALC_FOUND_ROWS'; - } - - $this->sql_clauses['select'] = "SELECT $found_rows $fields"; - $this->sql_clauses['from'] = "FROM $wpdb->blogs $join"; - $this->sql_clauses['groupby'] = $groupby; - $this->sql_clauses['orderby'] = $orderby; - $this->sql_clauses['limits'] = $limits; - - $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['groupby']} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}"; - - if ( $this->query_vars['count'] ) { - return intval( $wpdb->get_var( $this->request ) ); - } - - $site_ids = $wpdb->get_col( $this->request ); - - return array_map( 'intval', $site_ids ); - } - - /** - * Populates found_sites and max_num_pages properties for the current query - * if the limit clause was used. - * - * @since 4.6.0 - * @access private - * - * @global wpdb $wpdb WordPress database abstraction object. - */ - private function set_found_sites() { - global $wpdb; - - if ( $this->query_vars['number'] && ! $this->query_vars['no_found_rows'] ) { - /** - * Filters the query used to retrieve found site count. - * - * @since 4.6.0 - * - * @param string $found_sites_query SQL query. Default 'SELECT FOUND_ROWS()'. - * @param WP_Site_Query $site_query The `WP_Site_Query` instance. - */ - $found_sites_query = apply_filters( 'found_sites_query', 'SELECT FOUND_ROWS()', $this ); - - $this->found_sites = (int) $wpdb->get_var( $found_sites_query ); - } - } - - /** - * Used internally to generate an SQL string for searching across multiple columns. - * - * @since 4.6.0 - * @access protected - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $string Search string. - * @param array $columns Columns to search. - * @return string Search SQL. - */ - protected function get_search_sql( $string, $columns ) { - global $wpdb; - - if ( false !== strpos( $string, '*' ) ) { - $like = '%' . implode( '%', array_map( array( $wpdb, 'esc_like' ), explode( '*', $string ) ) ) . '%'; - } else { - $like = '%' . $wpdb->esc_like( $string ) . '%'; - } - - $searches = array(); - foreach ( $columns as $column ) { - $searches[] = $wpdb->prepare( "$column LIKE %s", $like ); - } - - return '(' . implode( ' OR ', $searches ) . ')'; - } - - /** - * Parses and sanitizes 'orderby' keys passed to the site query. - * - * @since 4.6.0 - * @access protected - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $orderby Alias for the field to order by. - * @return string|false Value to used in the ORDER clause. False otherwise. - */ - protected function parse_orderby( $orderby ) { - global $wpdb; - - $parsed = false; - - switch ( $orderby ) { - case 'site__in': - $site__in = implode( ',', array_map( 'absint', $this->query_vars['site__in'] ) ); - $parsed = "FIELD( {$wpdb->blogs}.blog_id, $site__in )"; - break; - case 'network__in': - $network__in = implode( ',', array_map( 'absint', $this->query_vars['network__in'] ) ); - $parsed = "FIELD( {$wpdb->blogs}.site_id, $network__in )"; - break; - case 'domain': - case 'last_updated': - case 'path': - case 'registered': - $parsed = $orderby; - break; - case 'network_id': - $parsed = 'site_id'; - break; - case 'domain_length': - $parsed = 'CHAR_LENGTH(domain)'; - break; - case 'path_length': - $parsed = 'CHAR_LENGTH(path)'; - break; - case 'id': - $parsed = 'blog_id'; - break; - } - - return $parsed; - } - - /** - * Parses an 'order' query variable and cast it to 'ASC' or 'DESC' as necessary. - * - * @since 4.6.0 - * @access protected - * - * @param string $order The 'order' query variable. - * @return string The sanitized 'order' query variable. - */ - protected function parse_order( $order ) { - if ( ! is_string( $order ) || empty( $order ) ) { - return 'ASC'; - } - - if ( 'ASC' === strtoupper( $order ) ) { - return 'ASC'; - } else { - return 'DESC'; - } - } -} diff --git a/wp/wp-includes/class-wp-site.php b/wp/wp-includes/class-wp-site.php deleted file mode 100644 index 53529fe9..00000000 --- a/wp/wp-includes/class-wp-site.php +++ /dev/null @@ -1,363 +0,0 @@ -<?php -/** - * Site API: WP_Site class - * - * @package WordPress - * @subpackage Multisite - * @since 4.5.0 - */ - -/** - * Core class used for interacting with a multisite site. - * - * This class is used during load to populate the `$current_blog` global and - * setup the current site. - * - * @since 4.5.0 - * - * @property int $id - * @property int $network_id - * @property string $blogname - * @property string $siteurl - * @property int $post_count - * @property string $home - */ -final class WP_Site { - - /** - * Site ID. - * - * A numeric string, for compatibility reasons. - * - * @since 4.5.0 - * @access public - * @var string - */ - public $blog_id; - - /** - * Domain of the site. - * - * @since 4.5.0 - * @access public - * @var string - */ - public $domain = ''; - - /** - * Path of the site. - * - * @since 4.5.0 - * @access public - * @var string - */ - public $path = ''; - - /** - * The ID of the site's parent network. - * - * Named "site" vs. "network" for legacy reasons. An individual site's "site" is - * its network. - * - * A numeric string, for compatibility reasons. - * - * @since 4.5.0 - * @access public - * @var string - */ - public $site_id = '0'; - - /** - * The date on which the site was created or registered. - * - * @since 4.5.0 - * @access public - * @var string Date in MySQL's datetime format. - */ - public $registered = '0000-00-00 00:00:00'; - - /** - * The date and time on which site settings were last updated. - * - * @since 4.5.0 - * @access public - * @var string Date in MySQL's datetime format. - */ - public $last_updated = '0000-00-00 00:00:00'; - - /** - * Whether the site should be treated as public. - * - * A numeric string, for compatibility reasons. - * - * @since 4.5.0 - * @access public - * @var string - */ - public $public = '1'; - - /** - * Whether the site should be treated as archived. - * - * A numeric string, for compatibility reasons. - * - * @since 4.5.0 - * @access public - * @var string - */ - public $archived = '0'; - - /** - * Whether the site should be treated as mature. - * - * Handling for this does not exist throughout WordPress core, but custom - * implementations exist that require the property to be present. - * - * A numeric string, for compatibility reasons. - * - * @since 4.5.0 - * @access public - * @var string - */ - public $mature = '0'; - - /** - * Whether the site should be treated as spam. - * - * A numeric string, for compatibility reasons. - * - * @since 4.5.0 - * @access public - * @var string - */ - public $spam = '0'; - - /** - * Whether the site should be treated as deleted. - * - * A numeric string, for compatibility reasons. - * - * @since 4.5.0 - * @access public - * @var string - */ - public $deleted = '0'; - - /** - * The language pack associated with this site. - * - * A numeric string, for compatibility reasons. - * - * @since 4.5.0 - * @access public - * @var string - */ - public $lang_id = '0'; - - /** - * Retrieves a site from the database by its ID. - * - * @static - * @since 4.5.0 - * @access public - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $site_id The ID of the site to retrieve. - * @return WP_Site|false The site's object if found. False if not. - */ - public static function get_instance( $site_id ) { - global $wpdb; - - $site_id = (int) $site_id; - if ( ! $site_id ) { - return false; - } - - $_site = wp_cache_get( $site_id, 'sites' ); - - if ( ! $_site ) { - $_site = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->blogs} WHERE blog_id = %d LIMIT 1", $site_id ) ); - - if ( empty( $_site ) || is_wp_error( $_site ) ) { - return false; - } - - wp_cache_add( $site_id, $_site, 'sites' ); - } - - return new WP_Site( $_site ); - } - - /** - * Creates a new WP_Site object. - * - * Will populate object properties from the object provided and assign other - * default properties based on that information. - * - * @since 4.5.0 - * @access public - * - * @param WP_Site|object $site A site object. - */ - public function __construct( $site ) { - foreach( get_object_vars( $site ) as $key => $value ) { - $this->$key = $value; - } - } - - /** - * Converts an object to array. - * - * @since 4.6.0 - * @access public - * - * @return array Object as array. - */ - public function to_array() { - return get_object_vars( $this ); - } - - /** - * Getter. - * - * Allows current multisite naming conventions when getting properties. - * Allows access to extended site properties. - * - * @since 4.6.0 - * @access public - * - * @param string $key Property to get. - * @return mixed Value of the property. Null if not available. - */ - public function __get( $key ) { - switch ( $key ) { - case 'id': - return (int) $this->blog_id; - case 'network_id': - return (int) $this->site_id; - case 'blogname': - case 'siteurl': - case 'post_count': - case 'home': - if ( ! did_action( 'ms_loaded' ) ) { - return null; - } - $details = $this->get_details(); - return $details->$key; - } - - return null; - } - - /** - * Isset-er. - * - * Allows current multisite naming conventions when checking for properties. - * Checks for extended site properties. - * - * @since 4.6.0 - * @access public - * - * @param string $key Property to check if set. - * @return bool Whether the property is set. - */ - public function __isset( $key ) { - switch ( $key ) { - case 'id': - case 'network_id': - return true; - case 'blogname': - case 'siteurl': - case 'post_count': - case 'home': - if ( ! did_action( 'ms_loaded' ) ) { - return false; - } - return true; - } - - return false; - } - - /** - * Setter. - * - * Allows current multisite naming conventions while setting properties. - * - * @since 4.6.0 - * @access public - * - * @param string $key Property to set. - * @param mixed $value Value to assign to the property. - */ - public function __set( $key, $value ) { - switch ( $key ) { - case 'id': - $this->blog_id = (string) $value; - break; - case 'network_id': - $this->site_id = (string) $value; - break; - default: - $this->$key = $value; - } - } - - /** - * Retrieves the details for this site. - * - * This method is used internally to lazy-load the extended properties of a site. - * - * @since 4.6.0 - * @access private - * - * @see WP_Site::__get() - * - * @return stdClass A raw site object with all details included. - */ - private function get_details() { - $details = wp_cache_get( $this->blog_id, 'site-details' ); - - if ( false === $details ) { - - switch_to_blog( $this->blog_id ); - // Create a raw copy of the object for backwards compatibility with the filter below. - $details = new stdClass(); - foreach ( get_object_vars( $this ) as $key => $value ) { - $details->$key = $value; - } - $details->blogname = get_option( 'blogname' ); - $details->siteurl = get_option( 'siteurl' ); - $details->post_count = get_option( 'post_count' ); - $details->home = get_option( 'home' ); - restore_current_blog(); - - $cache_details = true; - foreach ( array( 'blogname', 'siteurl', 'post_count', 'home' ) as $field ) { - if ( false === $details->$field ) { - $cache_details = false; - break; - } - } - - if ( $cache_details ) { - wp_cache_set( $this->blog_id, $details, 'site-details' ); - } - } - - /** This filter is documented in wp-includes/ms-blogs.php */ - $details = apply_filters_deprecated( 'blog_details', array( $details ), '4.7.0', 'site_details' ); - - /** - * Filters a site's extended properties. - * - * @since 4.6.0 - * - * @param stdClass $details The site details. - */ - $details = apply_filters( 'site_details', $details ); - - return $details; - } -} diff --git a/wp/wp-includes/class-wp-tax-query.php b/wp/wp-includes/class-wp-tax-query.php deleted file mode 100644 index 9bff196f..00000000 --- a/wp/wp-includes/class-wp-tax-query.php +++ /dev/null @@ -1,665 +0,0 @@ -<?php -/** - * Taxonomy API: WP_Tax_Query class - * - * @package WordPress - * @subpackage Taxonomy - * @since 4.4.0 - */ - -/** - * Core class used to implement taxonomy queries for the Taxonomy API. - * - * Used for generating SQL clauses that filter a primary query according to object - * taxonomy terms. - * - * WP_Tax_Query is a helper that allows primary query classes, such as WP_Query, to filter - * their results by object metadata, by generating `JOIN` and `WHERE` subclauses to be - * attached to the primary SQL query string. - * - * @since 3.1.0 - */ -class WP_Tax_Query { - - /** - * Array of taxonomy queries. - * - * See WP_Tax_Query::__construct() for information on tax query arguments. - * - * @since 3.1.0 - * @access public - * @var array - */ - public $queries = array(); - - /** - * The relation between the queries. Can be one of 'AND' or 'OR'. - * - * @since 3.1.0 - * @access public - * @var string - */ - public $relation; - - /** - * Standard response when the query should not return any rows. - * - * @since 3.2.0 - * - * @static - * @access private - * @var string - */ - private static $no_results = array( 'join' => array( '' ), 'where' => array( '0 = 1' ) ); - - /** - * A flat list of table aliases used in the JOIN clauses. - * - * @since 4.1.0 - * @access protected - * @var array - */ - protected $table_aliases = array(); - - /** - * Terms and taxonomies fetched by this query. - * - * We store this data in a flat array because they are referenced in a - * number of places by WP_Query. - * - * @since 4.1.0 - * @access public - * @var array - */ - public $queried_terms = array(); - - /** - * Database table that where the metadata's objects are stored (eg $wpdb->users). - * - * @since 4.1.0 - * @access public - * @var string - */ - public $primary_table; - - /** - * Column in 'primary_table' that represents the ID of the object. - * - * @since 4.1.0 - * @access public - * @var string - */ - public $primary_id_column; - - /** - * Constructor. - * - * @since 3.1.0 - * @since 4.1.0 Added support for `$operator` 'NOT EXISTS' and 'EXISTS' values. - * @access public - * - * @param array $tax_query { - * Array of taxonomy query clauses. - * - * @type string $relation Optional. The MySQL keyword used to join - * the clauses of the query. Accepts 'AND', or 'OR'. Default 'AND'. - * @type array { - * Optional. An array of first-order clause parameters, or another fully-formed tax query. - * - * @type string $taxonomy Taxonomy being queried. Optional when field=term_taxonomy_id. - * @type string|int|array $terms Term or terms to filter by. - * @type string $field Field to match $terms against. Accepts 'term_id', 'slug', - * 'name', or 'term_taxonomy_id'. Default: 'term_id'. - * @type string $operator MySQL operator to be used with $terms in the WHERE clause. - * Accepts 'AND', 'IN', 'NOT IN', 'EXISTS', 'NOT EXISTS'. - * Default: 'IN'. - * @type bool $include_children Optional. Whether to include child terms. - * Requires a $taxonomy. Default: true. - * } - * } - */ - public function __construct( $tax_query ) { - if ( isset( $tax_query['relation'] ) ) { - $this->relation = $this->sanitize_relation( $tax_query['relation'] ); - } else { - $this->relation = 'AND'; - } - - $this->queries = $this->sanitize_query( $tax_query ); - } - - /** - * Ensure the 'tax_query' argument passed to the class constructor is well-formed. - * - * Ensures that each query-level clause has a 'relation' key, and that - * each first-order clause contains all the necessary keys from `$defaults`. - * - * @since 4.1.0 - * @access public - * - * @param array $queries Array of queries clauses. - * @return array Sanitized array of query clauses. - */ - public function sanitize_query( $queries ) { - $cleaned_query = array(); - - $defaults = array( - 'taxonomy' => '', - 'terms' => array(), - 'field' => 'term_id', - 'operator' => 'IN', - 'include_children' => true, - ); - - foreach ( $queries as $key => $query ) { - if ( 'relation' === $key ) { - $cleaned_query['relation'] = $this->sanitize_relation( $query ); - - // First-order clause. - } elseif ( self::is_first_order_clause( $query ) ) { - - $cleaned_clause = array_merge( $defaults, $query ); - $cleaned_clause['terms'] = (array) $cleaned_clause['terms']; - $cleaned_query[] = $cleaned_clause; - - /* - * Keep a copy of the clause in the flate - * $queried_terms array, for use in WP_Query. - */ - if ( ! empty( $cleaned_clause['taxonomy'] ) && 'NOT IN' !== $cleaned_clause['operator'] ) { - $taxonomy = $cleaned_clause['taxonomy']; - if ( ! isset( $this->queried_terms[ $taxonomy ] ) ) { - $this->queried_terms[ $taxonomy ] = array(); - } - - /* - * Backward compatibility: Only store the first - * 'terms' and 'field' found for a given taxonomy. - */ - if ( ! empty( $cleaned_clause['terms'] ) && ! isset( $this->queried_terms[ $taxonomy ]['terms'] ) ) { - $this->queried_terms[ $taxonomy ]['terms'] = $cleaned_clause['terms']; - } - - if ( ! empty( $cleaned_clause['field'] ) && ! isset( $this->queried_terms[ $taxonomy ]['field'] ) ) { - $this->queried_terms[ $taxonomy ]['field'] = $cleaned_clause['field']; - } - } - - // Otherwise, it's a nested query, so we recurse. - } elseif ( is_array( $query ) ) { - $cleaned_subquery = $this->sanitize_query( $query ); - - if ( ! empty( $cleaned_subquery ) ) { - // All queries with children must have a relation. - if ( ! isset( $cleaned_subquery['relation'] ) ) { - $cleaned_subquery['relation'] = 'AND'; - } - - $cleaned_query[] = $cleaned_subquery; - } - } - } - - return $cleaned_query; - } - - /** - * Sanitize a 'relation' operator. - * - * @since 4.1.0 - * @access public - * - * @param string $relation Raw relation key from the query argument. - * @return string Sanitized relation ('AND' or 'OR'). - */ - public function sanitize_relation( $relation ) { - if ( 'OR' === strtoupper( $relation ) ) { - return 'OR'; - } else { - return 'AND'; - } - } - - /** - * Determine whether a clause is first-order. - * - * A "first-order" clause is one that contains any of the first-order - * clause keys ('terms', 'taxonomy', 'include_children', 'field', - * 'operator'). An empty clause also counts as a first-order clause, - * for backward compatibility. Any clause that doesn't meet this is - * determined, by process of elimination, to be a higher-order query. - * - * @since 4.1.0 - * - * @static - * @access protected - * - * @param array $query Tax query arguments. - * @return bool Whether the query clause is a first-order clause. - */ - protected static function is_first_order_clause( $query ) { - return is_array( $query ) && ( empty( $query ) || array_key_exists( 'terms', $query ) || array_key_exists( 'taxonomy', $query ) || array_key_exists( 'include_children', $query ) || array_key_exists( 'field', $query ) || array_key_exists( 'operator', $query ) ); - } - - /** - * Generates SQL clauses to be appended to a main query. - * - * @since 3.1.0 - * - * @static - * @access public - * - * @param string $primary_table Database table where the object being filtered is stored (eg wp_users). - * @param string $primary_id_column ID column for the filtered object in $primary_table. - * @return array { - * Array containing JOIN and WHERE SQL clauses to append to the main query. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - public function get_sql( $primary_table, $primary_id_column ) { - $this->primary_table = $primary_table; - $this->primary_id_column = $primary_id_column; - - return $this->get_sql_clauses(); - } - - /** - * Generate SQL clauses to be appended to a main query. - * - * Called by the public WP_Tax_Query::get_sql(), this method - * is abstracted out to maintain parity with the other Query classes. - * - * @since 4.1.0 - * @access protected - * - * @return array { - * Array containing JOIN and WHERE SQL clauses to append to the main query. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - protected function get_sql_clauses() { - /* - * $queries are passed by reference to get_sql_for_query() for recursion. - * To keep $this->queries unaltered, pass a copy. - */ - $queries = $this->queries; - $sql = $this->get_sql_for_query( $queries ); - - if ( ! empty( $sql['where'] ) ) { - $sql['where'] = ' AND ' . $sql['where']; - } - - return $sql; - } - - /** - * Generate SQL clauses for a single query array. - * - * If nested subqueries are found, this method recurses the tree to - * produce the properly nested SQL. - * - * @since 4.1.0 - * @access protected - * - * @param array $query Query to parse, passed by reference. - * @param int $depth Optional. Number of tree levels deep we currently are. - * Used to calculate indentation. Default 0. - * @return array { - * Array containing JOIN and WHERE SQL clauses to append to a single query array. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - protected function get_sql_for_query( &$query, $depth = 0 ) { - $sql_chunks = array( - 'join' => array(), - 'where' => array(), - ); - - $sql = array( - 'join' => '', - 'where' => '', - ); - - $indent = ''; - for ( $i = 0; $i < $depth; $i++ ) { - $indent .= " "; - } - - foreach ( $query as $key => &$clause ) { - if ( 'relation' === $key ) { - $relation = $query['relation']; - } elseif ( is_array( $clause ) ) { - - // This is a first-order clause. - if ( $this->is_first_order_clause( $clause ) ) { - $clause_sql = $this->get_sql_for_clause( $clause, $query ); - - $where_count = count( $clause_sql['where'] ); - if ( ! $where_count ) { - $sql_chunks['where'][] = ''; - } elseif ( 1 === $where_count ) { - $sql_chunks['where'][] = $clause_sql['where'][0]; - } else { - $sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )'; - } - - $sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] ); - // This is a subquery, so we recurse. - } else { - $clause_sql = $this->get_sql_for_query( $clause, $depth + 1 ); - - $sql_chunks['where'][] = $clause_sql['where']; - $sql_chunks['join'][] = $clause_sql['join']; - } - } - } - - // Filter to remove empties. - $sql_chunks['join'] = array_filter( $sql_chunks['join'] ); - $sql_chunks['where'] = array_filter( $sql_chunks['where'] ); - - if ( empty( $relation ) ) { - $relation = 'AND'; - } - - // Filter duplicate JOIN clauses and combine into a single string. - if ( ! empty( $sql_chunks['join'] ) ) { - $sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) ); - } - - // Generate a single WHERE clause with proper brackets and indentation. - if ( ! empty( $sql_chunks['where'] ) ) { - $sql['where'] = '( ' . "\n " . $indent . implode( ' ' . "\n " . $indent . $relation . ' ' . "\n " . $indent, $sql_chunks['where'] ) . "\n" . $indent . ')'; - } - - return $sql; - } - - /** - * Generate SQL JOIN and WHERE clauses for a "first-order" query clause. - * - * @since 4.1.0 - * @access public - * - * @global wpdb $wpdb The WordPress database abstraction object. - * - * @param array $clause Query clause, passed by reference. - * @param array $parent_query Parent query array. - * @return array { - * Array containing JOIN and WHERE SQL clauses to append to a first-order query. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - public function get_sql_for_clause( &$clause, $parent_query ) { - global $wpdb; - - $sql = array( - 'where' => array(), - 'join' => array(), - ); - - $join = $where = ''; - - $this->clean_query( $clause ); - - if ( is_wp_error( $clause ) ) { - return self::$no_results; - } - - $terms = $clause['terms']; - $operator = strtoupper( $clause['operator'] ); - - if ( 'IN' == $operator ) { - - if ( empty( $terms ) ) { - return self::$no_results; - } - - $terms = implode( ',', $terms ); - - /* - * Before creating another table join, see if this clause has a - * sibling with an existing join that can be shared. - */ - $alias = $this->find_compatible_table_alias( $clause, $parent_query ); - if ( false === $alias ) { - $i = count( $this->table_aliases ); - $alias = $i ? 'tt' . $i : $wpdb->term_relationships; - - // Store the alias as part of a flat array to build future iterators. - $this->table_aliases[] = $alias; - - // Store the alias with this clause, so later siblings can use it. - $clause['alias'] = $alias; - - $join .= " LEFT JOIN $wpdb->term_relationships"; - $join .= $i ? " AS $alias" : ''; - $join .= " ON ($this->primary_table.$this->primary_id_column = $alias.object_id)"; - } - - - $where = "$alias.term_taxonomy_id $operator ($terms)"; - - } elseif ( 'NOT IN' == $operator ) { - - if ( empty( $terms ) ) { - return $sql; - } - - $terms = implode( ',', $terms ); - - $where = "$this->primary_table.$this->primary_id_column NOT IN ( - SELECT object_id - FROM $wpdb->term_relationships - WHERE term_taxonomy_id IN ($terms) - )"; - - } elseif ( 'AND' == $operator ) { - - if ( empty( $terms ) ) { - return $sql; - } - - $num_terms = count( $terms ); - - $terms = implode( ',', $terms ); - - $where = "( - SELECT COUNT(1) - FROM $wpdb->term_relationships - WHERE term_taxonomy_id IN ($terms) - AND object_id = $this->primary_table.$this->primary_id_column - ) = $num_terms"; - - } elseif ( 'NOT EXISTS' === $operator || 'EXISTS' === $operator ) { - - $where = $wpdb->prepare( "$operator ( - SELECT 1 - FROM $wpdb->term_relationships - INNER JOIN $wpdb->term_taxonomy - ON $wpdb->term_taxonomy.term_taxonomy_id = $wpdb->term_relationships.term_taxonomy_id - WHERE $wpdb->term_taxonomy.taxonomy = %s - AND $wpdb->term_relationships.object_id = $this->primary_table.$this->primary_id_column - )", $clause['taxonomy'] ); - - } - - $sql['join'][] = $join; - $sql['where'][] = $where; - return $sql; - } - - /** - * Identify an existing table alias that is compatible with the current query clause. - * - * We avoid unnecessary table joins by allowing each clause to look for - * an existing table alias that is compatible with the query that it - * needs to perform. - * - * An existing alias is compatible if (a) it is a sibling of `$clause` - * (ie, it's under the scope of the same relation), and (b) the combination - * of operator and relation between the clauses allows for a shared table - * join. In the case of WP_Tax_Query, this only applies to 'IN' - * clauses that are connected by the relation 'OR'. - * - * @since 4.1.0 - * @access protected - * - * @param array $clause Query clause. - * @param array $parent_query Parent query of $clause. - * @return string|false Table alias if found, otherwise false. - */ - protected function find_compatible_table_alias( $clause, $parent_query ) { - $alias = false; - - // Sanity check. Only IN queries use the JOIN syntax . - if ( ! isset( $clause['operator'] ) || 'IN' !== $clause['operator'] ) { - return $alias; - } - - // Since we're only checking IN queries, we're only concerned with OR relations. - if ( ! isset( $parent_query['relation'] ) || 'OR' !== $parent_query['relation'] ) { - return $alias; - } - - $compatible_operators = array( 'IN' ); - - foreach ( $parent_query as $sibling ) { - if ( ! is_array( $sibling ) || ! $this->is_first_order_clause( $sibling ) ) { - continue; - } - - if ( empty( $sibling['alias'] ) || empty( $sibling['operator'] ) ) { - continue; - } - - // The sibling must both have compatible operator to share its alias. - if ( in_array( strtoupper( $sibling['operator'] ), $compatible_operators ) ) { - $alias = $sibling['alias']; - break; - } - } - - return $alias; - } - - /** - * Validates a single query. - * - * @since 3.2.0 - * @access private - * - * @param array $query The single query. Passed by reference. - */ - private function clean_query( &$query ) { - if ( empty( $query['taxonomy'] ) ) { - if ( 'term_taxonomy_id' !== $query['field'] ) { - $query = new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); - return; - } - - // so long as there are shared terms, include_children requires that a taxonomy is set - $query['include_children'] = false; - } elseif ( ! taxonomy_exists( $query['taxonomy'] ) ) { - $query = new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); - return; - } - - $query['terms'] = array_unique( (array) $query['terms'] ); - - if ( is_taxonomy_hierarchical( $query['taxonomy'] ) && $query['include_children'] ) { - $this->transform_query( $query, 'term_id' ); - - if ( is_wp_error( $query ) ) - return; - - $children = array(); - foreach ( $query['terms'] as $term ) { - $children = array_merge( $children, get_term_children( $term, $query['taxonomy'] ) ); - $children[] = $term; - } - $query['terms'] = $children; - } - - $this->transform_query( $query, 'term_taxonomy_id' ); - } - - /** - * Transforms a single query, from one field to another. - * - * @since 3.2.0 - * - * @global wpdb $wpdb The WordPress database abstraction object. - * - * @param array $query The single query. Passed by reference. - * @param string $resulting_field The resulting field. Accepts 'slug', 'name', 'term_taxonomy_id', - * or 'term_id'. Default 'term_id'. - */ - public function transform_query( &$query, $resulting_field ) { - global $wpdb; - - if ( empty( $query['terms'] ) ) - return; - - if ( $query['field'] == $resulting_field ) - return; - - $resulting_field = sanitize_key( $resulting_field ); - - switch ( $query['field'] ) { - case 'slug': - case 'name': - foreach ( $query['terms'] as &$term ) { - /* - * 0 is the $term_id parameter. We don't have a term ID yet, but it doesn't - * matter because `sanitize_term_field()` ignores the $term_id param when the - * context is 'db'. - */ - $term = "'" . esc_sql( sanitize_term_field( $query['field'], $term, 0, $query['taxonomy'], 'db' ) ) . "'"; - } - - $terms = implode( ",", $query['terms'] ); - - $terms = $wpdb->get_col( " - SELECT $wpdb->term_taxonomy.$resulting_field - FROM $wpdb->term_taxonomy - INNER JOIN $wpdb->terms USING (term_id) - WHERE taxonomy = '{$query['taxonomy']}' - AND $wpdb->terms.{$query['field']} IN ($terms) - " ); - break; - case 'term_taxonomy_id': - $terms = implode( ',', array_map( 'intval', $query['terms'] ) ); - $terms = $wpdb->get_col( " - SELECT $resulting_field - FROM $wpdb->term_taxonomy - WHERE term_taxonomy_id IN ($terms) - " ); - break; - default: - $terms = implode( ',', array_map( 'intval', $query['terms'] ) ); - $terms = $wpdb->get_col( " - SELECT $resulting_field - FROM $wpdb->term_taxonomy - WHERE taxonomy = '{$query['taxonomy']}' - AND term_id IN ($terms) - " ); - } - - if ( 'AND' == $query['operator'] && count( $terms ) < count( $query['terms'] ) ) { - $query = new WP_Error( 'inexistent_terms', __( 'Inexistent terms.' ) ); - return; - } - - $query['terms'] = $terms; - $query['field'] = $resulting_field; - } -} diff --git a/wp/wp-includes/class-wp-taxonomy.php b/wp/wp-includes/class-wp-taxonomy.php deleted file mode 100644 index 12ed5987..00000000 --- a/wp/wp-includes/class-wp-taxonomy.php +++ /dev/null @@ -1,453 +0,0 @@ -<?php -/** - * Taxonomy API: WP_Taxonomy class - * - * @package WordPress - * @subpackage Taxonomy - * @since 4.7.0 - */ - -/** - * Core class used for interacting with taxonomies. - * - * @since 4.7.0 - */ -final class WP_Taxonomy { - /** - * Taxonomy key. - * - * @since 4.7.0 - * @access public - * @var string - */ - public $name; - - /** - * Name of the taxonomy shown in the menu. Usually plural. - * - * @since 4.7.0 - * @access public - * @var string - */ - public $label; - - /** - * An array of labels for this taxonomy. - * - * @since 4.7.0 - * @access public - * @var object - */ - public $labels = array(); - - /** - * A short descriptive summary of what the taxonomy is for. - * - * @since 4.7.0 - * @access public - * @var string - */ - public $description = ''; - - /** - * Whether a taxonomy is intended for use publicly either via the admin interface or by front-end users. - * - * @since 4.7.0 - * @access public - * @var bool - */ - public $public = true; - - /** - * Whether the taxonomy is publicly queryable. - * - * @since 4.7.0 - * @access public - * @var bool - */ - public $publicly_queryable = true; - - /** - * Whether the taxonomy is hierarchical. - * - * @since 4.7.0 - * @access public - * @var bool - */ - public $hierarchical = false; - - /** - * Whether to generate and allow a UI for managing terms in this taxonomy in the admin. - * - * @since 4.7.0 - * @access public - * @var bool - */ - public $show_ui = true; - - /** - * Whether to show the taxonomy in the admin menu. - * - * If true, the taxonomy is shown as a submenu of the object type menu. If false, no menu is shown. - * - * @since 4.7.0 - * @access public - * @var bool - */ - public $show_in_menu = true; - - /** - * Whether the taxonomy is available for selection in navigation menus. - * - * @since 4.7.0 - * @access public - * @var bool - */ - public $show_in_nav_menus = true; - - /** - * Whether to list the taxonomy in the tag cloud widget controls. - * - * @since 4.7.0 - * @access public - * @var bool - */ - public $show_tagcloud = true; - - /** - * Whether to show the taxonomy in the quick/bulk edit panel. - * - * @since 4.7.0 - * @access public - * @var bool - */ - public $show_in_quick_edit = true; - - /** - * Whether to display a column for the taxonomy on its post type listing screens. - * - * @since 4.7.0 - * @access public - * @var bool - */ - public $show_admin_column = false; - - /** - * The callback function for the meta box display. - * - * @since 4.7.0 - * @access public - * @var bool|callable - */ - public $meta_box_cb = null; - - /** - * An array of object types this taxonomy is registered for. - * - * @since 4.7.0 - * @access public - * @var array - */ - public $object_type = null; - - /** - * Capabilities for this taxonomy. - * - * @since 4.7.0 - * @access public - * @var array - */ - public $cap; - - /** - * Rewrites information for this taxonomy. - * - * @since 4.7.0 - * @access public - * @var array|false - */ - public $rewrite; - - /** - * Query var string for this taxonomy. - * - * @since 4.7.0 - * @access public - * @var string|false - */ - public $query_var; - - /** - * Function that will be called when the count is updated. - * - * @since 4.7.0 - * @access public - * @var callable - */ - public $update_count_callback; - - /** - * Whether this taxonomy should appear in the REST API. - * - * Default false. If true, standard endpoints will be registered with - * respect to $rest_base and $rest_controller_class. - * - * @since 4.7.4 - * @access public - * @var bool $show_in_rest - */ - public $show_in_rest; - - /** - * The base path for this taxonomy's REST API endpoints. - * - * @since 4.7.4 - * @access public - * @var string|bool $rest_base - */ - public $rest_base; - - /** - * The controller for this taxonomy's REST API endpoints. - * - * Custom controllers must extend WP_REST_Controller. - * - * @since 4.7.4 - * @access public - * @var string|bool $rest_controller_class - */ - public $rest_controller_class; - - /** - * Whether it is a built-in taxonomy. - * - * @since 4.7.0 - * @access public - * @var bool - */ - public $_builtin; - - /** - * Constructor. - * - * @since 4.7.0 - * @access public - * - * @global WP $wp WP instance. - * - * @param string $taxonomy Taxonomy key, must not exceed 32 characters. - * @param array|string $object_type Name of the object type for the taxonomy object. - * @param array|string $args Optional. Array or query string of arguments for registering a taxonomy. - * Default empty array. - */ - public function __construct( $taxonomy, $object_type, $args = array() ) { - $this->name = $taxonomy; - - $this->set_props( $object_type, $args ); - } - - /** - * Sets taxonomy properties. - * - * @since 4.7.0 - * @access public - * - * @param array|string $object_type Name of the object type for the taxonomy object. - * @param array|string $args Array or query string of arguments for registering a taxonomy. - */ - public function set_props( $object_type, $args ) { - $args = wp_parse_args( $args ); - - /** - * Filters the arguments for registering a taxonomy. - * - * @since 4.4.0 - * - * @param array $args Array of arguments for registering a taxonomy. - * @param string $taxonomy Taxonomy key. - * @param array $object_type Array of names of object types for the taxonomy. - */ - $args = apply_filters( 'register_taxonomy_args', $args, $this->name, (array) $object_type ); - - $defaults = array( - 'labels' => array(), - 'description' => '', - 'public' => true, - 'publicly_queryable' => null, - 'hierarchical' => false, - 'show_ui' => null, - 'show_in_menu' => null, - 'show_in_nav_menus' => null, - 'show_tagcloud' => null, - 'show_in_quick_edit' => null, - 'show_admin_column' => false, - 'meta_box_cb' => null, - 'capabilities' => array(), - 'rewrite' => true, - 'query_var' => $this->name, - 'update_count_callback' => '', - 'show_in_rest' => false, - 'rest_base' => false, - 'rest_controller_class' => false, - '_builtin' => false, - ); - - $args = array_merge( $defaults, $args ); - - // If not set, default to the setting for public. - if ( null === $args['publicly_queryable'] ) { - $args['publicly_queryable'] = $args['public']; - } - - if ( false !== $args['query_var'] && ( is_admin() || false !== $args['publicly_queryable'] ) ) { - if ( true === $args['query_var'] ) { - $args['query_var'] = $this->name; - } else { - $args['query_var'] = sanitize_title_with_dashes( $args['query_var'] ); - } - } else { - // Force query_var to false for non-public taxonomies. - $args['query_var'] = false; - } - - if ( false !== $args['rewrite'] && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) { - $args['rewrite'] = wp_parse_args( $args['rewrite'], array( - 'with_front' => true, - 'hierarchical' => false, - 'ep_mask' => EP_NONE, - ) ); - - if ( empty( $args['rewrite']['slug'] ) ) { - $args['rewrite']['slug'] = sanitize_title_with_dashes( $this->name ); - } - } - - // If not set, default to the setting for public. - if ( null === $args['show_ui'] ) { - $args['show_ui'] = $args['public']; - } - - // If not set, default to the setting for show_ui. - if ( null === $args['show_in_menu'] || ! $args['show_ui'] ) { - $args['show_in_menu'] = $args['show_ui']; - } - - // If not set, default to the setting for public. - if ( null === $args['show_in_nav_menus'] ) { - $args['show_in_nav_menus'] = $args['public']; - } - - // If not set, default to the setting for show_ui. - if ( null === $args['show_tagcloud'] ) { - $args['show_tagcloud'] = $args['show_ui']; - } - - // If not set, default to the setting for show_ui. - if ( null === $args['show_in_quick_edit'] ) { - $args['show_in_quick_edit'] = $args['show_ui']; - } - - $default_caps = array( - 'manage_terms' => 'manage_categories', - 'edit_terms' => 'manage_categories', - 'delete_terms' => 'manage_categories', - 'assign_terms' => 'edit_posts', - ); - - $args['cap'] = (object) array_merge( $default_caps, $args['capabilities'] ); - unset( $args['capabilities'] ); - - $args['object_type'] = array_unique( (array) $object_type ); - - // If not set, use the default meta box - if ( null === $args['meta_box_cb'] ) { - if ( $args['hierarchical'] ) { - $args['meta_box_cb'] = 'post_categories_meta_box'; - } else { - $args['meta_box_cb'] = 'post_tags_meta_box'; - } - } - - $args['name'] = $this->name; - - foreach ( $args as $property_name => $property_value ) { - $this->$property_name = $property_value; - } - - $this->labels = get_taxonomy_labels( $this ); - $this->label = $this->labels->name; - } - - /** - * Adds the necessary rewrite rules for the taxonomy. - * - * @since 4.7.0 - * @access public - * - * @global WP $wp Current WordPress environment instance. - */ - public function add_rewrite_rules() { - /* @var WP $wp */ - global $wp; - - // Non-publicly queryable taxonomies should not register query vars, except in the admin. - if ( false !== $this->query_var && $wp ) { - $wp->add_query_var( $this->query_var ); - } - - if ( false !== $this->rewrite && ( is_admin() || '' != get_option( 'permalink_structure' ) ) ) { - if ( $this->hierarchical && $this->rewrite['hierarchical'] ) { - $tag = '(.+?)'; - } else { - $tag = '([^/]+)'; - } - - add_rewrite_tag( "%$this->name%", $tag, $this->query_var ? "{$this->query_var}=" : "taxonomy=$this->name&term=" ); - add_permastruct( $this->name, "{$this->rewrite['slug']}/%$this->name%", $this->rewrite ); - } - } - - /** - * Removes any rewrite rules, permastructs, and rules for the taxonomy. - * - * @since 4.7.0 - * @access public - * - * @global WP $wp Current WordPress environment instance. - */ - public function remove_rewrite_rules() { - /* @var WP $wp */ - global $wp; - - // Remove query var. - if ( false !== $this->query_var ) { - $wp->remove_query_var( $this->query_var ); - } - - // Remove rewrite tags and permastructs. - if ( false !== $this->rewrite ) { - remove_rewrite_tag( "%$this->name%" ); - remove_permastruct( $this->name ); - } - } - - /** - * Registers the ajax callback for the meta box. - * - * @since 4.7.0 - * @access public - */ - public function add_hooks() { - add_filter( 'wp_ajax_add-' . $this->name, '_wp_ajax_add_hierarchical_term' ); - } - - /** - * Removes the ajax callback for the meta box. - * - * @since 4.7.0 - * @access public - */ - public function remove_hooks() { - remove_filter( 'wp_ajax_add-' . $this->name, '_wp_ajax_add_hierarchical_term' ); - } -} diff --git a/wp/wp-includes/class-wp-term-query.php b/wp/wp-includes/class-wp-term-query.php deleted file mode 100644 index 434d810d..00000000 --- a/wp/wp-includes/class-wp-term-query.php +++ /dev/null @@ -1,968 +0,0 @@ -<?php - -/** - * Taxonomy API: WP_Term_Query class. - * - * @package WordPress - * @subpackage Taxonomy - * @since 4.6.0 - */ - -/** - * Class used for querying terms. - * - * @since 4.6.0 - * - * @see WP_Term_Query::__construct() for accepted arguments. - */ -class WP_Term_Query { - - /** - * SQL string used to perform database query. - * - * @since 4.6.0 - * @access public - * @var string - */ - public $request; - - /** - * Metadata query container. - * - * @since 4.6.0 - * @access public - * @var object WP_Meta_Query - */ - public $meta_query = false; - - /** - * Metadata query clauses. - * - * @since 4.6.0 - * @access protected - * @var array - */ - protected $meta_query_clauses; - - /** - * SQL query clauses. - * - * @since 4.6.0 - * @access protected - * @var array - */ - protected $sql_clauses = array( - 'select' => '', - 'from' => '', - 'where' => array(), - 'orderby' => '', - 'limits' => '', - ); - - /** - * Query vars set by the user. - * - * @since 4.6.0 - * @access public - * @var array - */ - public $query_vars; - - /** - * Default values for query vars. - * - * @since 4.6.0 - * @access public - * @var array - */ - public $query_var_defaults; - - /** - * List of terms located by the query. - * - * @since 4.6.0 - * @access public - * @var array - */ - public $terms; - - /** - * Constructor. - * - * Sets up the term query, based on the query vars passed. - * - * @since 4.6.0 - * @since 4.6.0 Introduced 'term_taxonomy_id' parameter. - * @since 4.7.0 Introduced 'object_ids' parameter. - * @access public - * - * @param string|array $query { - * Optional. Array or query string of term query parameters. Default empty. - * - * @type string|array $taxonomy Taxonomy name, or array of taxonomies, to which results should - * be limited. - * @type int|array $object_ids Optional. Object ID, or array of object IDs. Results will be - * limited to terms associated with these objects. - * @type string $orderby Field(s) to order terms by. Accepts term fields ('name', - * 'slug', 'term_group', 'term_id', 'id', 'description'), - * 'count' for term taxonomy count, 'include' to match the - * 'order' of the $include param, 'meta_value', 'meta_value_num', - * the value of `$meta_key`, the array keys of `$meta_query`, or - * 'none' to omit the ORDER BY clause. Defaults to 'name'. - * @type string $order Whether to order terms in ascending or descending order. - * Accepts 'ASC' (ascending) or 'DESC' (descending). - * Default 'ASC'. - * @type bool|int $hide_empty Whether to hide terms not assigned to any posts. Accepts - * 1|true or 0|false. Default 1|true. - * @type array|string $include Array or comma/space-separated string of term ids to include. - * Default empty array. - * @type array|string $exclude Array or comma/space-separated string of term ids to exclude. - * If $include is non-empty, $exclude is ignored. - * Default empty array. - * @type array|string $exclude_tree Array or comma/space-separated string of term ids to exclude - * along with all of their descendant terms. If $include is - * non-empty, $exclude_tree is ignored. Default empty array. - * @type int|string $number Maximum number of terms to return. Accepts ''|0 (all) or any - * positive number. Default ''|0 (all). - * @type int $offset The number by which to offset the terms query. Default empty. - * @type string $fields Term fields to query for. Accepts 'all' (returns an array of - * complete term objects), 'all_with_object_id' (returns an - * array of term objects with the 'object_id' param; only works - * when the `$fields` parameter is 'object_ids' ), 'ids' - * (returns an array of ids), 'tt_ids' (returns an array of - * term taxonomy ids), 'id=>parent' (returns an associative - * array with ids as keys, parent term IDs as values), 'names' - * (returns an array of term names), 'count' (returns the number - * of matching terms), 'id=>name' (returns an associative array - * with ids as keys, term names as values), or 'id=>slug' - * (returns an associative array with ids as keys, term slugs - * as values). Default 'all'. - * @type bool $count Whether to return a term count (true) or array of term objects - * (false). Will take precedence over `$fields` if true. - * Default false. - * @type string|array $name Optional. Name or array of names to return term(s) for. - * Default empty. - * @type string|array $slug Optional. Slug or array of slugs to return term(s) for. - * Default empty. - * @type int|array $term_taxonomy_id Optional. Term taxonomy ID, or array of term taxonomy IDs, - * to match when querying terms. - * @type bool $hierarchical Whether to include terms that have non-empty descendants (even - * if $hide_empty is set to true). Default true. - * @type string $search Search criteria to match terms. Will be SQL-formatted with - * wildcards before and after. Default empty. - * @type string $name__like Retrieve terms with criteria by which a term is LIKE - * `$name__like`. Default empty. - * @type string $description__like Retrieve terms where the description is LIKE - * `$description__like`. Default empty. - * @type bool $pad_counts Whether to pad the quantity of a term's children in the - * quantity of each term's "count" object variable. - * Default false. - * @type string $get Whether to return terms regardless of ancestry or whether the - * terms are empty. Accepts 'all' or empty (disabled). - * Default empty. - * @type int $child_of Term ID to retrieve child terms of. If multiple taxonomies - * are passed, $child_of is ignored. Default 0. - * @type int|string $parent Parent term ID to retrieve direct-child terms of. - * Default empty. - * @type bool $childless True to limit results to terms that have no children. - * This parameter has no effect on non-hierarchical taxonomies. - * Default false. - * @type string $cache_domain Unique cache key to be produced when this query is stored in - * an object cache. Default is 'core'. - * @type bool $update_term_meta_cache Whether to prime meta caches for matched terms. Default true. - * @type array $meta_query Optional. Meta query clauses to limit retrieved terms by. - * See `WP_Meta_Query`. Default empty. - * @type string $meta_key Limit terms to those matching a specific metadata key. - * Can be used in conjunction with `$meta_value`. - * @type string $meta_value Limit terms to those matching a specific metadata value. - * Usually used in conjunction with `$meta_key`. - * } - */ - public function __construct( $query = '' ) { - $this->query_var_defaults = array( - 'taxonomy' => null, - 'object_ids' => null, - 'orderby' => 'name', - 'order' => 'ASC', - 'hide_empty' => true, - 'include' => array(), - 'exclude' => array(), - 'exclude_tree' => array(), - 'number' => '', - 'offset' => '', - 'fields' => 'all', - 'count' => false, - 'name' => '', - 'slug' => '', - 'term_taxonomy_id' => '', - 'hierarchical' => true, - 'search' => '', - 'name__like' => '', - 'description__like' => '', - 'pad_counts' => false, - 'get' => '', - 'child_of' => 0, - 'parent' => '', - 'childless' => false, - 'cache_domain' => 'core', - 'update_term_meta_cache' => true, - 'meta_query' => '', - 'meta_key' => '', - 'meta_value' => '', - 'meta_type' => '', - 'meta_compare' => '', - ); - - if ( ! empty( $query ) ) { - $this->query( $query ); - } - } - - /** - * Parse arguments passed to the term query with default query parameters. - * - * @since 4.6.0 - * @access public - * - * @param string|array $query WP_Term_Query arguments. See WP_Term_Query::__construct() - */ - public function parse_query( $query = '' ) { - if ( empty( $query ) ) { - $query = $this->query_vars; - } - - $taxonomies = isset( $query['taxonomy'] ) ? (array) $query['taxonomy'] : null; - - /** - * Filters the terms query default arguments. - * - * Use {@see 'get_terms_args'} to filter the passed arguments. - * - * @since 4.4.0 - * - * @param array $defaults An array of default get_terms() arguments. - * @param array $taxonomies An array of taxonomies. - */ - $this->query_var_defaults = apply_filters( 'get_terms_defaults', $this->query_var_defaults, $taxonomies ); - - $query = wp_parse_args( $query, $this->query_var_defaults ); - - $query['number'] = absint( $query['number'] ); - $query['offset'] = absint( $query['offset'] ); - - // 'parent' overrides 'child_of'. - if ( 0 < intval( $query['parent'] ) ) { - $query['child_of'] = false; - } - - if ( 'all' == $query['get'] ) { - $query['childless'] = false; - $query['child_of'] = 0; - $query['hide_empty'] = 0; - $query['hierarchical'] = false; - $query['pad_counts'] = false; - } - - $query['taxonomy'] = $taxonomies; - - $this->query_vars = $query; - - /** - * Fires after term query vars have been parsed. - * - * @since 4.6.0 - * - * @param WP_Term_Query $this Current instance of WP_Term_Query. - */ - do_action( 'parse_term_query', $this ); - } - - /** - * Sets up the query for retrieving terms. - * - * @since 4.6.0 - * @access public - * - * @param string|array $query Array or URL query string of parameters. - * @return array|int List of terms, or number of terms when 'count' is passed as a query var. - */ - public function query( $query ) { - $this->query_vars = wp_parse_args( $query ); - return $this->get_terms(); - } - - /** - * Get terms, based on query_vars. - * - * @param 4.6.0 - * @access public - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @return array - */ - public function get_terms() { - global $wpdb; - - $this->parse_query( $this->query_vars ); - $args = $this->query_vars; - - // Set up meta_query so it's available to 'pre_get_terms'. - $this->meta_query = new WP_Meta_Query(); - $this->meta_query->parse_query_vars( $args ); - - /** - * Fires before terms are retrieved. - * - * @since 4.6.0 - * - * @param WP_Term_Query $this Current instance of WP_Term_Query. - */ - do_action( 'pre_get_terms', $this ); - - $taxonomies = $args['taxonomy']; - - // Save queries by not crawling the tree in the case of multiple taxes or a flat tax. - $has_hierarchical_tax = false; - if ( $taxonomies ) { - foreach ( $taxonomies as $_tax ) { - if ( is_taxonomy_hierarchical( $_tax ) ) { - $has_hierarchical_tax = true; - } - } - } - - if ( ! $has_hierarchical_tax ) { - $args['hierarchical'] = false; - $args['pad_counts'] = false; - } - - // 'parent' overrides 'child_of'. - if ( 0 < intval( $args['parent'] ) ) { - $args['child_of'] = false; - } - - if ( 'all' == $args['get'] ) { - $args['childless'] = false; - $args['child_of'] = 0; - $args['hide_empty'] = 0; - $args['hierarchical'] = false; - $args['pad_counts'] = false; - } - - /** - * Filters the terms query arguments. - * - * @since 3.1.0 - * - * @param array $args An array of get_terms() arguments. - * @param array $taxonomies An array of taxonomies. - */ - $args = apply_filters( 'get_terms_args', $args, $taxonomies ); - - // Avoid the query if the queried parent/child_of term has no descendants. - $child_of = $args['child_of']; - $parent = $args['parent']; - - if ( $child_of ) { - $_parent = $child_of; - } elseif ( $parent ) { - $_parent = $parent; - } else { - $_parent = false; - } - - if ( $_parent ) { - $in_hierarchy = false; - foreach ( $taxonomies as $_tax ) { - $hierarchy = _get_term_hierarchy( $_tax ); - - if ( isset( $hierarchy[ $_parent ] ) ) { - $in_hierarchy = true; - } - } - - if ( ! $in_hierarchy ) { - return array(); - } - } - - // 'term_order' is a legal sort order only when joining the relationship table. - $_orderby = $this->query_vars['orderby']; - if ( 'term_order' === $_orderby && empty( $this->query_vars['object_ids'] ) ) { - $_orderby = 'term_id'; - } - $orderby = $this->parse_orderby( $_orderby ); - - if ( $orderby ) { - $orderby = "ORDER BY $orderby"; - } - - $order = $this->parse_order( $this->query_vars['order'] ); - - if ( $taxonomies ) { - $this->sql_clauses['where']['taxonomy'] = "tt.taxonomy IN ('" . implode( "', '", array_map( 'esc_sql', $taxonomies ) ) . "')"; - } - - $exclude = $args['exclude']; - $exclude_tree = $args['exclude_tree']; - $include = $args['include']; - - $inclusions = ''; - if ( ! empty( $include ) ) { - $exclude = ''; - $exclude_tree = ''; - $inclusions = implode( ',', wp_parse_id_list( $include ) ); - } - - if ( ! empty( $inclusions ) ) { - $this->sql_clauses['where']['inclusions'] = 't.term_id IN ( ' . $inclusions . ' )'; - } - - $exclusions = array(); - if ( ! empty( $exclude_tree ) ) { - $exclude_tree = wp_parse_id_list( $exclude_tree ); - $excluded_children = $exclude_tree; - foreach ( $exclude_tree as $extrunk ) { - $excluded_children = array_merge( - $excluded_children, - (array) get_terms( $taxonomies[0], array( - 'child_of' => intval( $extrunk ), - 'fields' => 'ids', - 'hide_empty' => 0 - ) ) - ); - } - $exclusions = array_merge( $excluded_children, $exclusions ); - } - - if ( ! empty( $exclude ) ) { - $exclusions = array_merge( wp_parse_id_list( $exclude ), $exclusions ); - } - - // 'childless' terms are those without an entry in the flattened term hierarchy. - $childless = (bool) $args['childless']; - if ( $childless ) { - foreach ( $taxonomies as $_tax ) { - $term_hierarchy = _get_term_hierarchy( $_tax ); - $exclusions = array_merge( array_keys( $term_hierarchy ), $exclusions ); - } - } - - if ( ! empty( $exclusions ) ) { - $exclusions = 't.term_id NOT IN (' . implode( ',', array_map( 'intval', $exclusions ) ) . ')'; - } else { - $exclusions = ''; - } - - /** - * Filters the terms to exclude from the terms query. - * - * @since 2.3.0 - * - * @param string $exclusions `NOT IN` clause of the terms query. - * @param array $args An array of terms query arguments. - * @param array $taxonomies An array of taxonomies. - */ - $exclusions = apply_filters( 'list_terms_exclusions', $exclusions, $args, $taxonomies ); - - if ( ! empty( $exclusions ) ) { - // Must do string manipulation here for backward compatibility with filter. - $this->sql_clauses['where']['exclusions'] = preg_replace( '/^\s*AND\s*/', '', $exclusions ); - } - - if ( ! empty( $args['name'] ) ) { - $names = (array) $args['name']; - foreach ( $names as &$_name ) { - // `sanitize_term_field()` returns slashed data. - $_name = stripslashes( sanitize_term_field( 'name', $_name, 0, reset( $taxonomies ), 'db' ) ); - } - - $this->sql_clauses['where']['name'] = "t.name IN ('" . implode( "', '", array_map( 'esc_sql', $names ) ) . "')"; - } - - if ( ! empty( $args['slug'] ) ) { - if ( is_array( $args['slug'] ) ) { - $slug = array_map( 'sanitize_title', $args['slug'] ); - $this->sql_clauses['where']['slug'] = "t.slug IN ('" . implode( "', '", $slug ) . "')"; - } else { - $slug = sanitize_title( $args['slug'] ); - $this->sql_clauses['where']['slug'] = "t.slug = '$slug'"; - } - } - - if ( ! empty( $args['term_taxonomy_id'] ) ) { - if ( is_array( $args['term_taxonomy_id'] ) ) { - $tt_ids = implode( ',', array_map( 'intval', $args['term_taxonomy_id'] ) ); - $this->sql_clauses['where']['term_taxonomy_id'] = "tt.term_taxonomy_id IN ({$tt_ids})"; - } else { - $this->sql_clauses['where']['term_taxonomy_id'] = $wpdb->prepare( "tt.term_taxonomy_id = %d", $args['term_taxonomy_id'] ); - } - } - - if ( ! empty( $args['name__like'] ) ) { - $this->sql_clauses['where']['name__like'] = $wpdb->prepare( "t.name LIKE %s", '%' . $wpdb->esc_like( $args['name__like'] ) . '%' ); - } - - if ( ! empty( $args['description__like'] ) ) { - $this->sql_clauses['where']['description__like'] = $wpdb->prepare( "tt.description LIKE %s", '%' . $wpdb->esc_like( $args['description__like'] ) . '%' ); - } - - if ( ! empty( $args['object_ids'] ) ) { - $object_ids = $args['object_ids']; - if ( ! is_array( $object_ids ) ) { - $object_ids = array( $object_ids ); - } - - $object_ids = implode( ', ', array_map( 'intval', $object_ids ) ); - $this->sql_clauses['where']['object_ids'] = "tr.object_id IN ($object_ids)"; - } - - /* - * When querying for object relationships, the 'count > 0' check - * added by 'hide_empty' is superfluous. - */ - if ( ! empty( $args['object_ids'] ) ) { - $args['hide_empty'] = false; - } - - if ( '' !== $parent ) { - $parent = (int) $parent; - $this->sql_clauses['where']['parent'] = "tt.parent = '$parent'"; - } - - $hierarchical = $args['hierarchical']; - if ( 'count' == $args['fields'] ) { - $hierarchical = false; - } - if ( $args['hide_empty'] && !$hierarchical ) { - $this->sql_clauses['where']['count'] = 'tt.count > 0'; - } - - $number = $args['number']; - $offset = $args['offset']; - - // Don't limit the query results when we have to descend the family tree. - if ( $number && ! $hierarchical && ! $child_of && '' === $parent ) { - if ( $offset ) { - $limits = 'LIMIT ' . $offset . ',' . $number; - } else { - $limits = 'LIMIT ' . $number; - } - } else { - $limits = ''; - } - - - if ( ! empty( $args['search'] ) ) { - $this->sql_clauses['where']['search'] = $this->get_search_sql( $args['search'] ); - } - - // Meta query support. - $join = ''; - $distinct = ''; - - // Reparse meta_query query_vars, in case they were modified in a 'pre_get_terms' callback. - $this->meta_query->parse_query_vars( $this->query_vars ); - $mq_sql = $this->meta_query->get_sql( 'term', 't', 'term_id' ); - $meta_clauses = $this->meta_query->get_clauses(); - - if ( ! empty( $meta_clauses ) ) { - $join .= $mq_sql['join']; - $this->sql_clauses['where']['meta_query'] = preg_replace( '/^\s*AND\s*/', '', $mq_sql['where'] ); - $distinct .= "DISTINCT"; - - } - - $selects = array(); - switch ( $args['fields'] ) { - case 'all': - case 'all_with_object_id' : - case 'tt_ids' : - case 'slugs' : - $selects = array( 't.*', 'tt.*' ); - if ( 'all_with_object_id' === $args['fields'] && ! empty( $args['object_ids'] ) ) { - $selects[] = 'tr.object_id'; - } - break; - case 'ids': - case 'id=>parent': - $selects = array( 't.term_id', 'tt.parent', 'tt.count', 'tt.taxonomy' ); - break; - case 'names': - $selects = array( 't.term_id', 'tt.parent', 'tt.count', 't.name', 'tt.taxonomy' ); - break; - case 'count': - $orderby = ''; - $order = ''; - $selects = array( 'COUNT(*)' ); - break; - case 'id=>name': - $selects = array( 't.term_id', 't.name', 'tt.count', 'tt.taxonomy' ); - break; - case 'id=>slug': - $selects = array( 't.term_id', 't.slug', 'tt.count', 'tt.taxonomy' ); - break; - } - - $_fields = $args['fields']; - - /** - * Filters the fields to select in the terms query. - * - * Field lists modified using this filter will only modify the term fields returned - * by the function when the `$fields` parameter set to 'count' or 'all'. In all other - * cases, the term fields in the results array will be determined by the `$fields` - * parameter alone. - * - * Use of this filter can result in unpredictable behavior, and is not recommended. - * - * @since 2.8.0 - * - * @param array $selects An array of fields to select for the terms query. - * @param array $args An array of term query arguments. - * @param array $taxonomies An array of taxonomies. - */ - $fields = implode( ', ', apply_filters( 'get_terms_fields', $selects, $args, $taxonomies ) ); - - $join .= " INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id"; - - if ( ! empty( $this->query_vars['object_ids'] ) ) { - $join .= " INNER JOIN {$wpdb->term_relationships} AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id"; - } - - $where = implode( ' AND ', $this->sql_clauses['where'] ); - - /** - * Filters the terms query SQL clauses. - * - * @since 3.1.0 - * - * @param array $pieces Terms query SQL clauses. - * @param array $taxonomies An array of taxonomies. - * @param array $args An array of terms query arguments. - */ - $clauses = apply_filters( 'terms_clauses', compact( 'fields', 'join', 'where', 'distinct', 'orderby', 'order', 'limits' ), $taxonomies, $args ); - - $fields = isset( $clauses[ 'fields' ] ) ? $clauses[ 'fields' ] : ''; - $join = isset( $clauses[ 'join' ] ) ? $clauses[ 'join' ] : ''; - $where = isset( $clauses[ 'where' ] ) ? $clauses[ 'where' ] : ''; - $distinct = isset( $clauses[ 'distinct' ] ) ? $clauses[ 'distinct' ] : ''; - $orderby = isset( $clauses[ 'orderby' ] ) ? $clauses[ 'orderby' ] : ''; - $order = isset( $clauses[ 'order' ] ) ? $clauses[ 'order' ] : ''; - $limits = isset( $clauses[ 'limits' ] ) ? $clauses[ 'limits' ] : ''; - - if ( $where ) { - $where = "WHERE $where"; - } - - $this->sql_clauses['select'] = "SELECT $distinct $fields"; - $this->sql_clauses['from'] = "FROM $wpdb->terms AS t $join"; - $this->sql_clauses['orderby'] = $orderby ? "$orderby $order" : ''; - $this->sql_clauses['limits'] = $limits; - - $this->request = "{$this->sql_clauses['select']} {$this->sql_clauses['from']} {$where} {$this->sql_clauses['orderby']} {$this->sql_clauses['limits']}"; - - // $args can be anything. Only use the args defined in defaults to compute the key. - $key = md5( serialize( wp_array_slice_assoc( $args, array_keys( $this->query_var_defaults ) ) ) . serialize( $taxonomies ) . $this->request ); - $last_changed = wp_cache_get_last_changed( 'terms' ); - $cache_key = "get_terms:$key:$last_changed"; - $cache = wp_cache_get( $cache_key, 'terms' ); - if ( false !== $cache ) { - if ( 'all' === $_fields ) { - $cache = array_map( 'get_term', $cache ); - } - - $this->terms = $cache; - return $this->terms; - } - - if ( 'count' == $_fields ) { - $count = $wpdb->get_var( $this->request ); - wp_cache_set( $cache_key, $count, 'terms' ); - return $count; - } - - $terms = $wpdb->get_results( $this->request ); - if ( 'all' == $_fields || 'all_with_object_id' === $_fields ) { - update_term_cache( $terms ); - } - - // Prime termmeta cache. - if ( $args['update_term_meta_cache'] ) { - $term_ids = wp_list_pluck( $terms, 'term_id' ); - update_termmeta_cache( $term_ids ); - } - - if ( empty( $terms ) ) { - wp_cache_add( $cache_key, array(), 'terms', DAY_IN_SECONDS ); - return array(); - } - - if ( $child_of ) { - foreach ( $taxonomies as $_tax ) { - $children = _get_term_hierarchy( $_tax ); - if ( ! empty( $children ) ) { - $terms = _get_term_children( $child_of, $terms, $_tax ); - } - } - } - - // Update term counts to include children. - if ( $args['pad_counts'] && 'all' == $_fields ) { - foreach ( $taxonomies as $_tax ) { - _pad_term_counts( $terms, $_tax ); - } - } - - // Make sure we show empty categories that have children. - if ( $hierarchical && $args['hide_empty'] && is_array( $terms ) ) { - foreach ( $terms as $k => $term ) { - if ( ! $term->count ) { - $children = get_term_children( $term->term_id, $term->taxonomy ); - if ( is_array( $children ) ) { - foreach ( $children as $child_id ) { - $child = get_term( $child_id, $term->taxonomy ); - if ( $child->count ) { - continue 2; - } - } - } - - // It really is empty. - unset( $terms[ $k ] ); - } - } - } - - /* - * When querying for terms connected to objects, we may get - * duplicate results. The duplicates should be preserved if - * `$fields` is 'all_with_object_id', but should otherwise be - * removed. - */ - if ( ! empty( $args['object_ids'] ) && 'all_with_object_id' != $_fields ) { - $_tt_ids = $_terms = array(); - foreach ( $terms as $term ) { - if ( isset( $_tt_ids[ $term->term_id ] ) ) { - continue; - } - - $_tt_ids[ $term->term_id ] = 1; - $_terms[] = $term; - } - - $terms = $_terms; - } - - $_terms = array(); - if ( 'id=>parent' == $_fields ) { - foreach ( $terms as $term ) { - $_terms[ $term->term_id ] = $term->parent; - } - } elseif ( 'ids' == $_fields ) { - foreach ( $terms as $term ) { - $_terms[] = (int) $term->term_id; - } - } elseif ( 'tt_ids' == $_fields ) { - foreach ( $terms as $term ) { - $_terms[] = (int) $term->term_taxonomy_id; - } - } elseif ( 'names' == $_fields ) { - foreach ( $terms as $term ) { - $_terms[] = $term->name; - } - } elseif ( 'slugs' == $_fields ) { - foreach ( $terms as $term ) { - $_terms[] = $term->slug; - } - } elseif ( 'id=>name' == $_fields ) { - foreach ( $terms as $term ) { - $_terms[ $term->term_id ] = $term->name; - } - } elseif ( 'id=>slug' == $_fields ) { - foreach ( $terms as $term ) { - $_terms[ $term->term_id ] = $term->slug; - } - } - - if ( ! empty( $_terms ) ) { - $terms = $_terms; - } - - // Hierarchical queries are not limited, so 'offset' and 'number' must be handled now. - if ( $hierarchical && $number && is_array( $terms ) ) { - if ( $offset >= count( $terms ) ) { - $terms = array(); - } else { - $terms = array_slice( $terms, $offset, $number, true ); - } - } - - wp_cache_add( $cache_key, $terms, 'terms', DAY_IN_SECONDS ); - - if ( 'all' === $_fields || 'all_with_object_id' === $_fields ) { - $terms = array_map( 'get_term', $terms ); - } - - $this->terms = $terms; - return $this->terms; - } - - /** - * Parse and sanitize 'orderby' keys passed to the term query. - * - * @since 4.6.0 - * @access protected - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $orderby_raw Alias for the field to order by. - * @return string|false Value to used in the ORDER clause. False otherwise. - */ - protected function parse_orderby( $orderby_raw ) { - $_orderby = strtolower( $orderby_raw ); - $maybe_orderby_meta = false; - - if ( in_array( $_orderby, array( 'term_id', 'name', 'slug', 'term_group' ), true ) ) { - $orderby = "t.$_orderby"; - } elseif ( in_array( $_orderby, array( 'count', 'parent', 'taxonomy', 'term_taxonomy_id', 'description' ), true ) ) { - $orderby = "tt.$_orderby"; - } elseif ( 'term_order' === $_orderby ) { - $orderby = 'tr.term_order'; - } elseif ( 'include' == $_orderby && ! empty( $this->query_vars['include'] ) ) { - $include = implode( ',', wp_parse_id_list( $this->query_vars['include'] ) ); - $orderby = "FIELD( t.term_id, $include )"; - } elseif ( 'none' == $_orderby ) { - $orderby = ''; - } elseif ( empty( $_orderby ) || 'id' == $_orderby || 'term_id' === $_orderby ) { - $orderby = 't.term_id'; - } else { - $orderby = 't.name'; - - // This may be a value of orderby related to meta. - $maybe_orderby_meta = true; - } - - /** - * Filters the ORDERBY clause of the terms query. - * - * @since 2.8.0 - * - * @param string $orderby `ORDERBY` clause of the terms query. - * @param array $args An array of terms query arguments. - * @param array $taxonomies An array of taxonomies. - */ - $orderby = apply_filters( 'get_terms_orderby', $orderby, $this->query_vars, $this->query_vars['taxonomy'] ); - - // Run after the 'get_terms_orderby' filter for backward compatibility. - if ( $maybe_orderby_meta ) { - $maybe_orderby_meta = $this->parse_orderby_meta( $_orderby ); - if ( $maybe_orderby_meta ) { - $orderby = $maybe_orderby_meta; - } - } - - return $orderby; - } - - /** - * Generate the ORDER BY clause for an 'orderby' param that is potentially related to a meta query. - * - * @since 4.6.0 - * @access public - * - * @param string $orderby_raw Raw 'orderby' value passed to WP_Term_Query. - * @return string - */ - protected function parse_orderby_meta( $orderby_raw ) { - $orderby = ''; - - // Tell the meta query to generate its SQL, so we have access to table aliases. - $this->meta_query->get_sql( 'term', 't', 'term_id' ); - $meta_clauses = $this->meta_query->get_clauses(); - if ( ! $meta_clauses || ! $orderby_raw ) { - return $orderby; - } - - $allowed_keys = array(); - $primary_meta_key = null; - $primary_meta_query = reset( $meta_clauses ); - if ( ! empty( $primary_meta_query['key'] ) ) { - $primary_meta_key = $primary_meta_query['key']; - $allowed_keys[] = $primary_meta_key; - } - $allowed_keys[] = 'meta_value'; - $allowed_keys[] = 'meta_value_num'; - $allowed_keys = array_merge( $allowed_keys, array_keys( $meta_clauses ) ); - - if ( ! in_array( $orderby_raw, $allowed_keys, true ) ) { - return $orderby; - } - - switch( $orderby_raw ) { - case $primary_meta_key: - case 'meta_value': - if ( ! empty( $primary_meta_query['type'] ) ) { - $orderby = "CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})"; - } else { - $orderby = "{$primary_meta_query['alias']}.meta_value"; - } - break; - - case 'meta_value_num': - $orderby = "{$primary_meta_query['alias']}.meta_value+0"; - break; - - default: - if ( array_key_exists( $orderby_raw, $meta_clauses ) ) { - // $orderby corresponds to a meta_query clause. - $meta_clause = $meta_clauses[ $orderby_raw ]; - $orderby = "CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})"; - } - break; - } - - return $orderby; - } - - /** - * Parse an 'order' query variable and cast it to ASC or DESC as necessary. - * - * @since 4.6.0 - * @access protected - * - * @param string $order The 'order' query variable. - * @return string The sanitized 'order' query variable. - */ - protected function parse_order( $order ) { - if ( ! is_string( $order ) || empty( $order ) ) { - return 'DESC'; - } - - if ( 'ASC' === strtoupper( $order ) ) { - return 'ASC'; - } else { - return 'DESC'; - } - } - - /** - * Used internally to generate a SQL string related to the 'search' parameter. - * - * @since 4.6.0 - * @access protected - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $string - * @return string - */ - protected function get_search_sql( $string ) { - global $wpdb; - - $like = '%' . $wpdb->esc_like( $string ) . '%'; - - return $wpdb->prepare( '((t.name LIKE %s) OR (t.slug LIKE %s))', $like, $like ); - } -} diff --git a/wp/wp-includes/class-wp-term.php b/wp/wp-includes/class-wp-term.php deleted file mode 100644 index 8eb87efb..00000000 --- a/wp/wp-includes/class-wp-term.php +++ /dev/null @@ -1,255 +0,0 @@ -<?php -/** - * Taxonomy API: WP_Term class - * - * @package WordPress - * @subpackage Taxonomy - * @since 4.4.0 - */ - -/** - * Core class used to implement the WP_Term object. - * - * @since 4.4.0 - */ -final class WP_Term { - - /** - * Term ID. - * - * @since 4.4.0 - * @access public - * @var int - */ - public $term_id; - - /** - * The term's name. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $name = ''; - - /** - * The term's slug. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $slug = ''; - - /** - * The term's term_group. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $term_group = ''; - - /** - * Term Taxonomy ID. - * - * @since 4.4.0 - * @access public - * @var int - */ - public $term_taxonomy_id = 0; - - /** - * The term's taxonomy name. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $taxonomy = ''; - - /** - * The term's description. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $description = ''; - - /** - * ID of a term's parent term. - * - * @since 4.4.0 - * @access public - * @var int - */ - public $parent = 0; - - /** - * Cached object count for this term. - * - * @since 4.4.0 - * @access public - * @var int - */ - public $count = 0; - - /** - * Stores the term object's sanitization level. - * - * Does not correspond to a database field. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $filter = 'raw'; - - /** - * Retrieve WP_Term instance. - * - * @since 4.4.0 - * @access public - * @static - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $term_id Term ID. - * @param string $taxonomy Optional. Limit matched terms to those matching `$taxonomy`. Only used for - * disambiguating potentially shared terms. - * @return WP_Term|WP_Error|false Term object, if found. WP_Error if `$term_id` is shared between taxonomies and - * there's insufficient data to distinguish which term is intended. - * False for other failures. - */ - public static function get_instance( $term_id, $taxonomy = null ) { - global $wpdb; - - $term_id = (int) $term_id; - if ( ! $term_id ) { - return false; - } - - $_term = wp_cache_get( $term_id, 'terms' ); - - // If there isn't a cached version, hit the database. - if ( ! $_term || ( $taxonomy && $taxonomy !== $_term->taxonomy ) ) { - // Grab all matching terms, in case any are shared between taxonomies. - $terms = $wpdb->get_results( $wpdb->prepare( "SELECT t.*, tt.* FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON t.term_id = tt.term_id WHERE t.term_id = %d", $term_id ) ); - if ( ! $terms ) { - return false; - } - - // If a taxonomy was specified, find a match. - if ( $taxonomy ) { - foreach ( $terms as $match ) { - if ( $taxonomy === $match->taxonomy ) { - $_term = $match; - break; - } - } - - // If only one match was found, it's the one we want. - } elseif ( 1 === count( $terms ) ) { - $_term = reset( $terms ); - - // Otherwise, the term must be shared between taxonomies. - } else { - // If the term is shared only with invalid taxonomies, return the one valid term. - foreach ( $terms as $t ) { - if ( ! taxonomy_exists( $t->taxonomy ) ) { - continue; - } - - // Only hit if we've already identified a term in a valid taxonomy. - if ( $_term ) { - return new WP_Error( 'ambiguous_term_id', __( 'Term ID is shared between multiple taxonomies' ), $term_id ); - } - - $_term = $t; - } - } - - if ( ! $_term ) { - return false; - } - - // Don't return terms from invalid taxonomies. - if ( ! taxonomy_exists( $_term->taxonomy ) ) { - return new WP_Error( 'invalid_taxonomy', __( 'Invalid taxonomy.' ) ); - } - - $_term = sanitize_term( $_term, $_term->taxonomy, 'raw' ); - - // Don't cache terms that are shared between taxonomies. - if ( 1 === count( $terms ) ) { - wp_cache_add( $term_id, $_term, 'terms' ); - } - } - - $term_obj = new WP_Term( $_term ); - $term_obj->filter( $term_obj->filter ); - - return $term_obj; - } - - /** - * Constructor. - * - * @since 4.4.0 - * @access public - * - * @param WP_Term|object $term Term object. - */ - public function __construct( $term ) { - foreach ( get_object_vars( $term ) as $key => $value ) { - $this->$key = $value; - } - } - - /** - * Sanitizes term fields, according to the filter type provided. - * - * @since 4.4.0 - * @access public - * - * @param string $filter Filter context. Accepts 'edit', 'db', 'display', 'attribute', 'js', 'raw'. - */ - public function filter( $filter ) { - sanitize_term( $this, $this->taxonomy, $filter ); - } - - /** - * Converts an object to array. - * - * @since 4.4.0 - * @access public - * - * @return array Object as array. - */ - public function to_array() { - return get_object_vars( $this ); - } - - /** - * Getter. - * - * @since 4.4.0 - * @access public - * - * @param string $key Property to get. - * @return mixed Property value. - */ - public function __get( $key ) { - switch ( $key ) { - case 'data' : - $data = new stdClass(); - $columns = array( 'term_id', 'name', 'slug', 'term_group', 'term_taxonomy_id', 'taxonomy', 'description', 'parent', 'count' ); - foreach ( $columns as $column ) { - $data->{$column} = isset( $this->{$column} ) ? $this->{$column} : null; - } - - return sanitize_term( $data, $data->taxonomy, 'raw' ); - } - } -} diff --git a/wp/wp-includes/class-wp-text-diff-renderer-inline.php b/wp/wp-includes/class-wp-text-diff-renderer-inline.php deleted file mode 100644 index 236e388b..00000000 --- a/wp/wp-includes/class-wp-text-diff-renderer-inline.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php -/** - * Diff API: WP_Text_Diff_Renderer_inline class - * - * @package WordPress - * @subpackage Diff - * @since 4.7.0 - */ - -/** - * Better word splitting than the PEAR package provides. - * - * @since 2.6.0 - * @uses Text_Diff_Renderer_inline Extends - */ -class WP_Text_Diff_Renderer_inline extends Text_Diff_Renderer_inline { - - /** - * @ignore - * @since 2.6.0 - * - * @param string $string - * @param string $newlineEscape - * @return string - */ - public function _splitOnWords($string, $newlineEscape = "\n") { - $string = str_replace("\0", '', $string); - $words = preg_split( '/([^\w])/u', $string, -1, PREG_SPLIT_DELIM_CAPTURE ); - $words = str_replace( "\n", $newlineEscape, $words ); - return $words; - } - -} diff --git a/wp/wp-includes/class-wp-text-diff-renderer-table.php b/wp/wp-includes/class-wp-text-diff-renderer-table.php deleted file mode 100644 index 82131cff..00000000 --- a/wp/wp-includes/class-wp-text-diff-renderer-table.php +++ /dev/null @@ -1,509 +0,0 @@ -<?php -/** - * Diff API: WP_Text_Diff_Renderer_Table class - * - * @package WordPress - * @subpackage Diff - * @since 4.7.0 - */ - -/** - * Table renderer to display the diff lines. - * - * @since 2.6.0 - * @uses Text_Diff_Renderer Extends - */ -class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer { - - /** - * @see Text_Diff_Renderer::_leading_context_lines - * @var int - * @access public - * @since 2.6.0 - */ - public $_leading_context_lines = 10000; - - /** - * @see Text_Diff_Renderer::_trailing_context_lines - * @var int - * @access public - * @since 2.6.0 - */ - public $_trailing_context_lines = 10000; - - /** - * Threshold for when a diff should be saved or omitted. - * - * @var float - * @access protected - * @since 2.6.0 - */ - protected $_diff_threshold = 0.6; - - /** - * Inline display helper object name. - * - * @var string - * @access protected - * @since 2.6.0 - */ - protected $inline_diff_renderer = 'WP_Text_Diff_Renderer_inline'; - - /** - * Should we show the split view or not - * - * @var string - * @access protected - * @since 3.6.0 - */ - protected $_show_split_view = true; - - protected $compat_fields = array( '_show_split_view', 'inline_diff_renderer', '_diff_threshold' ); - - /** - * Constructor - Call parent constructor with params array. - * - * This will set class properties based on the key value pairs in the array. - * - * @since 2.6.0 - * - * @param array $params - */ - public function __construct( $params = array() ) { - parent::__construct( $params ); - if ( isset( $params[ 'show_split_view' ] ) ) - $this->_show_split_view = $params[ 'show_split_view' ]; - } - - /** - * @ignore - * - * @param string $header - * @return string - */ - public function _startBlock( $header ) { - return ''; - } - - /** - * @ignore - * - * @param array $lines - * @param string $prefix - */ - public function _lines( $lines, $prefix=' ' ) { - } - - /** - * @ignore - * - * @param string $line HTML-escape the value. - * @return string - */ - public function addedLine( $line ) { - return "<td class='diff-addedline'>{$line}</td>"; - - } - - /** - * @ignore - * - * @param string $line HTML-escape the value. - * @return string - */ - public function deletedLine( $line ) { - return "<td class='diff-deletedline'>{$line}</td>"; - } - - /** - * @ignore - * - * @param string $line HTML-escape the value. - * @return string - */ - public function contextLine( $line ) { - return "<td class='diff-context'>{$line}</td>"; - } - - /** - * @ignore - * - * @return string - */ - public function emptyLine() { - return '<td> </td>'; - } - - /** - * @ignore - * @access public - * - * @param array $lines - * @param bool $encode - * @return string - */ - public function _added( $lines, $encode = true ) { - $r = ''; - foreach ($lines as $line) { - if ( $encode ) { - $processed_line = htmlspecialchars( $line ); - - /** - * Contextually filters a diffed line. - * - * Filters TextDiff processing of diffed line. By default, diffs are processed with - * htmlspecialchars. Use this filter to remove or change the processing. Passes a context - * indicating if the line is added, deleted or unchanged. - * - * @since 4.1.0 - * - * @param String $processed_line The processed diffed line. - * @param String $line The unprocessed diffed line. - * @param string null The line context. Values are 'added', 'deleted' or 'unchanged'. - */ - $line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'added' ); - } - - if ( $this->_show_split_view ) { - $r .= '<tr>' . $this->emptyLine() . $this->emptyLine() . $this->addedLine( $line ) . "</tr>\n"; - } else { - $r .= '<tr>' . $this->addedLine( $line ) . "</tr>\n"; - } - } - return $r; - } - - /** - * @ignore - * @access public - * - * @param array $lines - * @param bool $encode - * @return string - */ - public function _deleted( $lines, $encode = true ) { - $r = ''; - foreach ($lines as $line) { - if ( $encode ) { - $processed_line = htmlspecialchars( $line ); - - /** This filter is documented in wp-includes/wp-diff.php */ - $line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'deleted' ); - } - if ( $this->_show_split_view ) { - $r .= '<tr>' . $this->deletedLine( $line ) . $this->emptyLine() . $this->emptyLine() . "</tr>\n"; - } else { - $r .= '<tr>' . $this->deletedLine( $line ) . "</tr>\n"; - } - - } - return $r; - } - - /** - * @ignore - * @access public - * - * @param array $lines - * @param bool $encode - * @return string - */ - public function _context( $lines, $encode = true ) { - $r = ''; - foreach ($lines as $line) { - if ( $encode ) { - $processed_line = htmlspecialchars( $line ); - - /** This filter is documented in wp-includes/wp-diff.php */ - $line = apply_filters( 'process_text_diff_html', $processed_line, $line, 'unchanged' ); - } - if ( $this->_show_split_view ) { - $r .= '<tr>' . $this->contextLine( $line ) . $this->emptyLine() . $this->contextLine( $line ) . "</tr>\n"; - } else { - $r .= '<tr>' . $this->contextLine( $line ) . "</tr>\n"; - } - } - return $r; - } - - /** - * Process changed lines to do word-by-word diffs for extra highlighting. - * - * (TRAC style) sometimes these lines can actually be deleted or added rows. - * We do additional processing to figure that out - * - * @access public - * @since 2.6.0 - * - * @param array $orig - * @param array $final - * @return string - */ - public function _changed( $orig, $final ) { - $r = ''; - - // Does the aforementioned additional processing - // *_matches tell what rows are "the same" in orig and final. Those pairs will be diffed to get word changes - // match is numeric: an index in other column - // match is 'X': no match. It is a new row - // *_rows are column vectors for the orig column and the final column. - // row >= 0: an indix of the $orig or $final array - // row < 0: a blank row for that column - list($orig_matches, $final_matches, $orig_rows, $final_rows) = $this->interleave_changed_lines( $orig, $final ); - - // These will hold the word changes as determined by an inline diff - $orig_diffs = array(); - $final_diffs = array(); - - // Compute word diffs for each matched pair using the inline diff - foreach ( $orig_matches as $o => $f ) { - if ( is_numeric($o) && is_numeric($f) ) { - $text_diff = new Text_Diff( 'auto', array( array($orig[$o]), array($final[$f]) ) ); - $renderer = new $this->inline_diff_renderer; - $diff = $renderer->render( $text_diff ); - - // If they're too different, don't include any <ins> or <dels> - if ( preg_match_all( '!(<ins>.*?</ins>|<del>.*?</del>)!', $diff, $diff_matches ) ) { - // length of all text between <ins> or <del> - $stripped_matches = strlen(strip_tags( join(' ', $diff_matches[0]) )); - // since we count lengith of text between <ins> or <del> (instead of picking just one), - // we double the length of chars not in those tags. - $stripped_diff = strlen(strip_tags( $diff )) * 2 - $stripped_matches; - $diff_ratio = $stripped_matches / $stripped_diff; - if ( $diff_ratio > $this->_diff_threshold ) - continue; // Too different. Don't save diffs. - } - - // Un-inline the diffs by removing del or ins - $orig_diffs[$o] = preg_replace( '|<ins>.*?</ins>|', '', $diff ); - $final_diffs[$f] = preg_replace( '|<del>.*?</del>|', '', $diff ); - } - } - - foreach ( array_keys($orig_rows) as $row ) { - // Both columns have blanks. Ignore them. - if ( $orig_rows[$row] < 0 && $final_rows[$row] < 0 ) - continue; - - // If we have a word based diff, use it. Otherwise, use the normal line. - if ( isset( $orig_diffs[$orig_rows[$row]] ) ) - $orig_line = $orig_diffs[$orig_rows[$row]]; - elseif ( isset( $orig[$orig_rows[$row]] ) ) - $orig_line = htmlspecialchars($orig[$orig_rows[$row]]); - else - $orig_line = ''; - - if ( isset( $final_diffs[$final_rows[$row]] ) ) - $final_line = $final_diffs[$final_rows[$row]]; - elseif ( isset( $final[$final_rows[$row]] ) ) - $final_line = htmlspecialchars($final[$final_rows[$row]]); - else - $final_line = ''; - - if ( $orig_rows[$row] < 0 ) { // Orig is blank. This is really an added row. - $r .= $this->_added( array($final_line), false ); - } elseif ( $final_rows[$row] < 0 ) { // Final is blank. This is really a deleted row. - $r .= $this->_deleted( array($orig_line), false ); - } else { // A true changed row. - if ( $this->_show_split_view ) { - $r .= '<tr>' . $this->deletedLine( $orig_line ) . $this->emptyLine() . $this->addedLine( $final_line ) . "</tr>\n"; - } else { - $r .= '<tr>' . $this->deletedLine( $orig_line ) . "</tr><tr>" . $this->addedLine( $final_line ) . "</tr>\n"; - } - } - } - - return $r; - } - - /** - * Takes changed blocks and matches which rows in orig turned into which rows in final. - * - * Returns - * *_matches ( which rows match with which ) - * *_rows ( order of rows in each column interleaved with blank rows as - * necessary ) - * - * @since 2.6.0 - * - * @param array $orig - * @param array $final - * @return array - */ - public function interleave_changed_lines( $orig, $final ) { - - // Contains all pairwise string comparisons. Keys are such that this need only be a one dimensional array. - $matches = array(); - foreach ( array_keys($orig) as $o ) { - foreach ( array_keys($final) as $f ) { - $matches["$o,$f"] = $this->compute_string_distance( $orig[$o], $final[$f] ); - } - } - asort($matches); // Order by string distance. - - $orig_matches = array(); - $final_matches = array(); - - foreach ( $matches as $keys => $difference ) { - list($o, $f) = explode(',', $keys); - $o = (int) $o; - $f = (int) $f; - - // Already have better matches for these guys - if ( isset($orig_matches[$o]) && isset($final_matches[$f]) ) - continue; - - // First match for these guys. Must be best match - if ( !isset($orig_matches[$o]) && !isset($final_matches[$f]) ) { - $orig_matches[$o] = $f; - $final_matches[$f] = $o; - continue; - } - - // Best match of this final is already taken? Must mean this final is a new row. - if ( isset($orig_matches[$o]) ) - $final_matches[$f] = 'x'; - - // Best match of this orig is already taken? Must mean this orig is a deleted row. - elseif ( isset($final_matches[$f]) ) - $orig_matches[$o] = 'x'; - } - - // We read the text in this order - ksort($orig_matches); - ksort($final_matches); - - // Stores rows and blanks for each column. - $orig_rows = $orig_rows_copy = array_keys($orig_matches); - $final_rows = array_keys($final_matches); - - // Interleaves rows with blanks to keep matches aligned. - // We may end up with some extraneous blank rows, but we'll just ignore them later. - foreach ( $orig_rows_copy as $orig_row ) { - $final_pos = array_search($orig_matches[$orig_row], $final_rows, true); - $orig_pos = (int) array_search($orig_row, $orig_rows, true); - - if ( false === $final_pos ) { // This orig is paired with a blank final. - array_splice( $final_rows, $orig_pos, 0, -1 ); - } elseif ( $final_pos < $orig_pos ) { // This orig's match is up a ways. Pad final with blank rows. - $diff_pos = $final_pos - $orig_pos; - while ( $diff_pos < 0 ) - array_splice( $final_rows, $orig_pos, 0, $diff_pos++ ); - } elseif ( $final_pos > $orig_pos ) { // This orig's match is down a ways. Pad orig with blank rows. - $diff_pos = $orig_pos - $final_pos; - while ( $diff_pos < 0 ) - array_splice( $orig_rows, $orig_pos, 0, $diff_pos++ ); - } - } - - // Pad the ends with blank rows if the columns aren't the same length - $diff_count = count($orig_rows) - count($final_rows); - if ( $diff_count < 0 ) { - while ( $diff_count < 0 ) - array_push($orig_rows, $diff_count++); - } elseif ( $diff_count > 0 ) { - $diff_count = -1 * $diff_count; - while ( $diff_count < 0 ) - array_push($final_rows, $diff_count++); - } - - return array($orig_matches, $final_matches, $orig_rows, $final_rows); - } - - /** - * Computes a number that is intended to reflect the "distance" between two strings. - * - * @since 2.6.0 - * - * @param string $string1 - * @param string $string2 - * @return int - */ - public function compute_string_distance( $string1, $string2 ) { - // Vectors containing character frequency for all chars in each string - $chars1 = count_chars($string1); - $chars2 = count_chars($string2); - - // L1-norm of difference vector. - $difference = array_sum( array_map( array($this, 'difference'), $chars1, $chars2 ) ); - - // $string1 has zero length? Odd. Give huge penalty by not dividing. - if ( !$string1 ) - return $difference; - - // Return distance per character (of string1). - return $difference / strlen($string1); - } - - /** - * @ignore - * @since 2.6.0 - * - * @param int $a - * @param int $b - * @return int - */ - public function difference( $a, $b ) { - return abs( $a - $b ); - } - - /** - * Make private properties readable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param string $name Property to get. - * @return mixed Property. - */ - public function __get( $name ) { - if ( in_array( $name, $this->compat_fields ) ) { - return $this->$name; - } - } - - /** - * Make private properties settable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param string $name Property to check if set. - * @param mixed $value Property value. - * @return mixed Newly-set property. - */ - public function __set( $name, $value ) { - if ( in_array( $name, $this->compat_fields ) ) { - return $this->$name = $value; - } - } - - /** - * Make private properties checkable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param string $name Property to check if set. - * @return bool Whether the property is set. - */ - public function __isset( $name ) { - if ( in_array( $name, $this->compat_fields ) ) { - return isset( $this->$name ); - } - } - - /** - * Make private properties un-settable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param string $name Property to unset. - */ - public function __unset( $name ) { - if ( in_array( $name, $this->compat_fields ) ) { - unset( $this->$name ); - } - } -} diff --git a/wp/wp-includes/class-wp-theme.php b/wp/wp-includes/class-wp-theme.php deleted file mode 100644 index 35baee00..00000000 --- a/wp/wp-includes/class-wp-theme.php +++ /dev/null @@ -1,1499 +0,0 @@ -<?php -/** - * WP_Theme Class - * - * @package WordPress - * @subpackage Theme - * @since 3.4.0 - */ -final class WP_Theme implements ArrayAccess { - - /** - * Whether the theme has been marked as updateable. - * - * @since 4.4.0 - * @access public - * @var bool - * - * @see WP_MS_Themes_List_Table - */ - public $update = false; - - /** - * Headers for style.css files. - * - * @static - * @access private - * @var array - */ - private static $file_headers = array( - 'Name' => 'Theme Name', - 'ThemeURI' => 'Theme URI', - 'Description' => 'Description', - 'Author' => 'Author', - 'AuthorURI' => 'Author URI', - 'Version' => 'Version', - 'Template' => 'Template', - 'Status' => 'Status', - 'Tags' => 'Tags', - 'TextDomain' => 'Text Domain', - 'DomainPath' => 'Domain Path', - ); - - /** - * Default themes. - * - * @static - * @access private - * @var array - */ - private static $default_themes = array( - 'classic' => 'WordPress Classic', - 'default' => 'WordPress Default', - 'twentyten' => 'Twenty Ten', - 'twentyeleven' => 'Twenty Eleven', - 'twentytwelve' => 'Twenty Twelve', - 'twentythirteen' => 'Twenty Thirteen', - 'twentyfourteen' => 'Twenty Fourteen', - 'twentyfifteen' => 'Twenty Fifteen', - 'twentysixteen' => 'Twenty Sixteen', - 'twentyseventeen' => 'Twenty Seventeen', - ); - - /** - * Renamed theme tags. - * - * @static - * @access private - * @var array - */ - private static $tag_map = array( - 'fixed-width' => 'fixed-layout', - 'flexible-width' => 'fluid-layout', - ); - - /** - * Absolute path to the theme root, usually wp-content/themes - * - * @access private - * @var string - */ - private $theme_root; - - /** - * Header data from the theme's style.css file. - * - * @access private - * @var array - */ - private $headers = array(); - - /** - * Header data from the theme's style.css file after being sanitized. - * - * @access private - * @var array - */ - private $headers_sanitized; - - /** - * Header name from the theme's style.css after being translated. - * - * Cached due to sorting functions running over the translated name. - * - * @access private - * @var string - */ - private $name_translated; - - /** - * Errors encountered when initializing the theme. - * - * @access private - * @var WP_Error - */ - private $errors; - - /** - * The directory name of the theme's files, inside the theme root. - * - * In the case of a child theme, this is directory name of the child theme. - * Otherwise, 'stylesheet' is the same as 'template'. - * - * @access private - * @var string - */ - private $stylesheet; - - /** - * The directory name of the theme's files, inside the theme root. - * - * In the case of a child theme, this is the directory name of the parent theme. - * Otherwise, 'template' is the same as 'stylesheet'. - * - * @access private - * @var string - */ - private $template; - - /** - * A reference to the parent theme, in the case of a child theme. - * - * @access private - * @var WP_Theme - */ - private $parent; - - /** - * URL to the theme root, usually an absolute URL to wp-content/themes - * - * @access private - * var string - */ - private $theme_root_uri; - - /** - * Flag for whether the theme's textdomain is loaded. - * - * @access private - * @var bool - */ - private $textdomain_loaded; - - /** - * Stores an md5 hash of the theme root, to function as the cache key. - * - * @access private - * @var string - */ - private $cache_hash; - - /** - * Flag for whether the themes cache bucket should be persistently cached. - * - * Default is false. Can be set with the {@see 'wp_cache_themes_persistently'} filter. - * - * @static - * @access private - * @var bool - */ - private static $persistently_cache; - - /** - * Expiration time for the themes cache bucket. - * - * By default the bucket is not cached, so this value is useless. - * - * @static - * @access private - * @var bool - */ - private static $cache_expiration = 1800; - - /** - * Constructor for WP_Theme. - * - * @global array $wp_theme_directories - * - * @param string $theme_dir Directory of the theme within the theme_root. - * @param string $theme_root Theme root. - * @param WP_Error|void $_child If this theme is a parent theme, the child may be passed for validation purposes. - */ - public function __construct( $theme_dir, $theme_root, $_child = null ) { - global $wp_theme_directories; - - // Initialize caching on first run. - if ( ! isset( self::$persistently_cache ) ) { - /** This action is documented in wp-includes/theme.php */ - self::$persistently_cache = apply_filters( 'wp_cache_themes_persistently', false, 'WP_Theme' ); - if ( self::$persistently_cache ) { - wp_cache_add_global_groups( 'themes' ); - if ( is_int( self::$persistently_cache ) ) - self::$cache_expiration = self::$persistently_cache; - } else { - wp_cache_add_non_persistent_groups( 'themes' ); - } - } - - $this->theme_root = $theme_root; - $this->stylesheet = $theme_dir; - - // Correct a situation where the theme is 'some-directory/some-theme' but 'some-directory' was passed in as part of the theme root instead. - if ( ! in_array( $theme_root, (array) $wp_theme_directories ) && in_array( dirname( $theme_root ), (array) $wp_theme_directories ) ) { - $this->stylesheet = basename( $this->theme_root ) . '/' . $this->stylesheet; - $this->theme_root = dirname( $theme_root ); - } - - $this->cache_hash = md5( $this->theme_root . '/' . $this->stylesheet ); - $theme_file = $this->stylesheet . '/style.css'; - - $cache = $this->cache_get( 'theme' ); - - if ( is_array( $cache ) ) { - foreach ( array( 'errors', 'headers', 'template' ) as $key ) { - if ( isset( $cache[ $key ] ) ) - $this->$key = $cache[ $key ]; - } - if ( $this->errors ) - return; - if ( isset( $cache['theme_root_template'] ) ) - $theme_root_template = $cache['theme_root_template']; - } elseif ( ! file_exists( $this->theme_root . '/' . $theme_file ) ) { - $this->headers['Name'] = $this->stylesheet; - if ( ! file_exists( $this->theme_root . '/' . $this->stylesheet ) ) - $this->errors = new WP_Error( 'theme_not_found', sprintf( __( 'The theme directory "%s" does not exist.' ), esc_html( $this->stylesheet ) ) ); - else - $this->errors = new WP_Error( 'theme_no_stylesheet', __( 'Stylesheet is missing.' ) ); - $this->template = $this->stylesheet; - $this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ) ); - if ( ! file_exists( $this->theme_root ) ) // Don't cache this one. - $this->errors->add( 'theme_root_missing', __( 'ERROR: The themes directory is either empty or doesn’t exist. Please check your installation.' ) ); - return; - } elseif ( ! is_readable( $this->theme_root . '/' . $theme_file ) ) { - $this->headers['Name'] = $this->stylesheet; - $this->errors = new WP_Error( 'theme_stylesheet_not_readable', __( 'Stylesheet is not readable.' ) ); - $this->template = $this->stylesheet; - $this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ) ); - return; - } else { - $this->headers = get_file_data( $this->theme_root . '/' . $theme_file, self::$file_headers, 'theme' ); - // Default themes always trump their pretenders. - // Properly identify default themes that are inside a directory within wp-content/themes. - if ( $default_theme_slug = array_search( $this->headers['Name'], self::$default_themes ) ) { - if ( basename( $this->stylesheet ) != $default_theme_slug ) - $this->headers['Name'] .= '/' . $this->stylesheet; - } - } - - // (If template is set from cache [and there are no errors], we know it's good.) - if ( ! $this->template && ! ( $this->template = $this->headers['Template'] ) ) { - $this->template = $this->stylesheet; - if ( ! file_exists( $this->theme_root . '/' . $this->stylesheet . '/index.php' ) ) { - $error_message = sprintf( - /* translators: 1: index.php, 2: Codex URL, 3: style.css */ - __( 'Template is missing. Standalone themes need to have a %1$s template file. <a href="%2$s">Child themes</a> need to have a Template header in the %3$s stylesheet.' ), - '<code>index.php</code>', - __( 'https://codex.wordpress.org/Child_Themes' ), - '<code>style.css</code>' - ); - $this->errors = new WP_Error( 'theme_no_index', $error_message ); - $this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ) ); - return; - } - } - - // If we got our data from cache, we can assume that 'template' is pointing to the right place. - if ( ! is_array( $cache ) && $this->template != $this->stylesheet && ! file_exists( $this->theme_root . '/' . $this->template . '/index.php' ) ) { - // If we're in a directory of themes inside /themes, look for the parent nearby. - // wp-content/themes/directory-of-themes/* - $parent_dir = dirname( $this->stylesheet ); - if ( '.' != $parent_dir && file_exists( $this->theme_root . '/' . $parent_dir . '/' . $this->template . '/index.php' ) ) { - $this->template = $parent_dir . '/' . $this->template; - } elseif ( ( $directories = search_theme_directories() ) && isset( $directories[ $this->template ] ) ) { - // Look for the template in the search_theme_directories() results, in case it is in another theme root. - // We don't look into directories of themes, just the theme root. - $theme_root_template = $directories[ $this->template ]['theme_root']; - } else { - // Parent theme is missing. - $this->errors = new WP_Error( 'theme_no_parent', sprintf( __( 'The parent theme is missing. Please install the "%s" parent theme.' ), esc_html( $this->template ) ) ); - $this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ) ); - $this->parent = new WP_Theme( $this->template, $this->theme_root, $this ); - return; - } - } - - // Set the parent, if we're a child theme. - if ( $this->template != $this->stylesheet ) { - // If we are a parent, then there is a problem. Only two generations allowed! Cancel things out. - if ( $_child instanceof WP_Theme && $_child->template == $this->stylesheet ) { - $_child->parent = null; - $_child->errors = new WP_Error( 'theme_parent_invalid', sprintf( __( 'The "%s" theme is not a valid parent theme.' ), esc_html( $_child->template ) ) ); - $_child->cache_add( 'theme', array( 'headers' => $_child->headers, 'errors' => $_child->errors, 'stylesheet' => $_child->stylesheet, 'template' => $_child->template ) ); - // The two themes actually reference each other with the Template header. - if ( $_child->stylesheet == $this->template ) { - $this->errors = new WP_Error( 'theme_parent_invalid', sprintf( __( 'The "%s" theme is not a valid parent theme.' ), esc_html( $this->template ) ) ); - $this->cache_add( 'theme', array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ) ); - } - return; - } - // Set the parent. Pass the current instance so we can do the crazy checks above and assess errors. - $this->parent = new WP_Theme( $this->template, isset( $theme_root_template ) ? $theme_root_template : $this->theme_root, $this ); - } - - // We're good. If we didn't retrieve from cache, set it. - if ( ! is_array( $cache ) ) { - $cache = array( 'headers' => $this->headers, 'errors' => $this->errors, 'stylesheet' => $this->stylesheet, 'template' => $this->template ); - // If the parent theme is in another root, we'll want to cache this. Avoids an entire branch of filesystem calls above. - if ( isset( $theme_root_template ) ) - $cache['theme_root_template'] = $theme_root_template; - $this->cache_add( 'theme', $cache ); - } - } - - /** - * When converting the object to a string, the theme name is returned. - * - * @return string Theme name, ready for display (translated) - */ - public function __toString() { - return (string) $this->display('Name'); - } - - /** - * __isset() magic method for properties formerly returned by current_theme_info() - * - * @staticvar array $properties - * - * @param string $offset Property to check if set. - * @return bool Whether the given property is set. - */ - public function __isset( $offset ) { - static $properties = array( - 'name', 'title', 'version', 'parent_theme', 'template_dir', 'stylesheet_dir', 'template', 'stylesheet', - 'screenshot', 'description', 'author', 'tags', 'theme_root', 'theme_root_uri', - ); - - return in_array( $offset, $properties ); - } - - /** - * __get() magic method for properties formerly returned by current_theme_info() - * - * @param string $offset Property to get. - * @return mixed Property value. - */ - public function __get( $offset ) { - switch ( $offset ) { - case 'name' : - case 'title' : - return $this->get('Name'); - case 'version' : - return $this->get('Version'); - case 'parent_theme' : - return $this->parent() ? $this->parent()->get('Name') : ''; - case 'template_dir' : - return $this->get_template_directory(); - case 'stylesheet_dir' : - return $this->get_stylesheet_directory(); - case 'template' : - return $this->get_template(); - case 'stylesheet' : - return $this->get_stylesheet(); - case 'screenshot' : - return $this->get_screenshot( 'relative' ); - // 'author' and 'description' did not previously return translated data. - case 'description' : - return $this->display('Description'); - case 'author' : - return $this->display('Author'); - case 'tags' : - return $this->get( 'Tags' ); - case 'theme_root' : - return $this->get_theme_root(); - case 'theme_root_uri' : - return $this->get_theme_root_uri(); - // For cases where the array was converted to an object. - default : - return $this->offsetGet( $offset ); - } - } - - /** - * Method to implement ArrayAccess for keys formerly returned by get_themes() - * - * @param mixed $offset - * @param mixed $value - */ - public function offsetSet( $offset, $value ) {} - - /** - * Method to implement ArrayAccess for keys formerly returned by get_themes() - * - * @param mixed $offset - */ - public function offsetUnset( $offset ) {} - - /** - * Method to implement ArrayAccess for keys formerly returned by get_themes() - * - * @staticvar array $keys - * - * @param mixed $offset - * @return bool - */ - public function offsetExists( $offset ) { - static $keys = array( - 'Name', 'Version', 'Status', 'Title', 'Author', 'Author Name', 'Author URI', 'Description', - 'Template', 'Stylesheet', 'Template Files', 'Stylesheet Files', 'Template Dir', 'Stylesheet Dir', - 'Screenshot', 'Tags', 'Theme Root', 'Theme Root URI', 'Parent Theme', - ); - - return in_array( $offset, $keys ); - } - - /** - * Method to implement ArrayAccess for keys formerly returned by get_themes(). - * - * Author, Author Name, Author URI, and Description did not previously return - * translated data. We are doing so now as it is safe to do. However, as - * Name and Title could have been used as the key for get_themes(), both remain - * untranslated for back compatibility. This means that ['Name'] is not ideal, - * and care should be taken to use `$theme::display( 'Name' )` to get a properly - * translated header. - * - * @param mixed $offset - * @return mixed - */ - public function offsetGet( $offset ) { - switch ( $offset ) { - case 'Name' : - case 'Title' : - /* - * See note above about using translated data. get() is not ideal. - * It is only for backward compatibility. Use display(). - */ - return $this->get('Name'); - case 'Author' : - return $this->display( 'Author'); - case 'Author Name' : - return $this->display( 'Author', false); - case 'Author URI' : - return $this->display('AuthorURI'); - case 'Description' : - return $this->display( 'Description'); - case 'Version' : - case 'Status' : - return $this->get( $offset ); - case 'Template' : - return $this->get_template(); - case 'Stylesheet' : - return $this->get_stylesheet(); - case 'Template Files' : - return $this->get_files( 'php', 1, true ); - case 'Stylesheet Files' : - return $this->get_files( 'css', 0, false ); - case 'Template Dir' : - return $this->get_template_directory(); - case 'Stylesheet Dir' : - return $this->get_stylesheet_directory(); - case 'Screenshot' : - return $this->get_screenshot( 'relative' ); - case 'Tags' : - return $this->get('Tags'); - case 'Theme Root' : - return $this->get_theme_root(); - case 'Theme Root URI' : - return $this->get_theme_root_uri(); - case 'Parent Theme' : - return $this->parent() ? $this->parent()->get('Name') : ''; - default : - return null; - } - } - - /** - * Returns errors property. - * - * @since 3.4.0 - * @access public - * - * @return WP_Error|false WP_Error if there are errors, or false. - */ - public function errors() { - return is_wp_error( $this->errors ) ? $this->errors : false; - } - - /** - * Whether the theme exists. - * - * A theme with errors exists. A theme with the error of 'theme_not_found', - * meaning that the theme's directory was not found, does not exist. - * - * @since 3.4.0 - * @access public - * - * @return bool Whether the theme exists. - */ - public function exists() { - return ! ( $this->errors() && in_array( 'theme_not_found', $this->errors()->get_error_codes() ) ); - } - - /** - * Returns reference to the parent theme. - * - * @since 3.4.0 - * @access public - * - * @return WP_Theme|false Parent theme, or false if the current theme is not a child theme. - */ - public function parent() { - return isset( $this->parent ) ? $this->parent : false; - } - - /** - * Adds theme data to cache. - * - * Cache entries keyed by the theme and the type of data. - * - * @since 3.4.0 - * @access private - * - * @param string $key Type of data to store (theme, screenshot, headers, post_templates) - * @param string $data Data to store - * @return bool Return value from wp_cache_add() - */ - private function cache_add( $key, $data ) { - return wp_cache_add( $key . '-' . $this->cache_hash, $data, 'themes', self::$cache_expiration ); - } - - /** - * Gets theme data from cache. - * - * Cache entries are keyed by the theme and the type of data. - * - * @since 3.4.0 - * @access private - * - * @param string $key Type of data to retrieve (theme, screenshot, headers, post_templates) - * @return mixed Retrieved data - */ - private function cache_get( $key ) { - return wp_cache_get( $key . '-' . $this->cache_hash, 'themes' ); - } - - /** - * Clears the cache for the theme. - * - * @since 3.4.0 - * @access public - */ - public function cache_delete() { - foreach ( array( 'theme', 'screenshot', 'headers', 'post_templates' ) as $key ) - wp_cache_delete( $key . '-' . $this->cache_hash, 'themes' ); - $this->template = $this->textdomain_loaded = $this->theme_root_uri = $this->parent = $this->errors = $this->headers_sanitized = $this->name_translated = null; - $this->headers = array(); - $this->__construct( $this->stylesheet, $this->theme_root ); - } - - /** - * Get a raw, unformatted theme header. - * - * The header is sanitized, but is not translated, and is not marked up for display. - * To get a theme header for display, use the display() method. - * - * Use the get_template() method, not the 'Template' header, for finding the template. - * The 'Template' header is only good for what was written in the style.css, while - * get_template() takes into account where WordPress actually located the theme and - * whether it is actually valid. - * - * @since 3.4.0 - * @access public - * - * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags. - * @return string|false String on success, false on failure. - */ - public function get( $header ) { - if ( ! isset( $this->headers[ $header ] ) ) - return false; - - if ( ! isset( $this->headers_sanitized ) ) { - $this->headers_sanitized = $this->cache_get( 'headers' ); - if ( ! is_array( $this->headers_sanitized ) ) - $this->headers_sanitized = array(); - } - - if ( isset( $this->headers_sanitized[ $header ] ) ) - return $this->headers_sanitized[ $header ]; - - // If themes are a persistent group, sanitize everything and cache it. One cache add is better than many cache sets. - if ( self::$persistently_cache ) { - foreach ( array_keys( $this->headers ) as $_header ) - $this->headers_sanitized[ $_header ] = $this->sanitize_header( $_header, $this->headers[ $_header ] ); - $this->cache_add( 'headers', $this->headers_sanitized ); - } else { - $this->headers_sanitized[ $header ] = $this->sanitize_header( $header, $this->headers[ $header ] ); - } - - return $this->headers_sanitized[ $header ]; - } - - /** - * Gets a theme header, formatted and translated for display. - * - * @since 3.4.0 - * @access public - * - * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags. - * @param bool $markup Optional. Whether to mark up the header. Defaults to true. - * @param bool $translate Optional. Whether to translate the header. Defaults to true. - * @return string|false Processed header, false on failure. - */ - public function display( $header, $markup = true, $translate = true ) { - $value = $this->get( $header ); - if ( false === $value ) { - return false; - } - - if ( $translate && ( empty( $value ) || ! $this->load_textdomain() ) ) - $translate = false; - - if ( $translate ) - $value = $this->translate_header( $header, $value ); - - if ( $markup ) - $value = $this->markup_header( $header, $value, $translate ); - - return $value; - } - - /** - * Sanitize a theme header. - * - * @since 3.4.0 - * @access private - * - * @staticvar array $header_tags - * @staticvar array $header_tags_with_a - * - * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags. - * @param string $value Value to sanitize. - * @return mixed - */ - private function sanitize_header( $header, $value ) { - switch ( $header ) { - case 'Status' : - if ( ! $value ) { - $value = 'publish'; - break; - } - // Fall through otherwise. - case 'Name' : - static $header_tags = array( - 'abbr' => array( 'title' => true ), - 'acronym' => array( 'title' => true ), - 'code' => true, - 'em' => true, - 'strong' => true, - ); - $value = wp_kses( $value, $header_tags ); - break; - case 'Author' : - // There shouldn't be anchor tags in Author, but some themes like to be challenging. - case 'Description' : - static $header_tags_with_a = array( - 'a' => array( 'href' => true, 'title' => true ), - 'abbr' => array( 'title' => true ), - 'acronym' => array( 'title' => true ), - 'code' => true, - 'em' => true, - 'strong' => true, - ); - $value = wp_kses( $value, $header_tags_with_a ); - break; - case 'ThemeURI' : - case 'AuthorURI' : - $value = esc_url_raw( $value ); - break; - case 'Tags' : - $value = array_filter( array_map( 'trim', explode( ',', strip_tags( $value ) ) ) ); - break; - case 'Version' : - $value = strip_tags( $value ); - break; - } - - return $value; - } - - /** - * Mark up a theme header. - * - * @since 3.4.0 - * @access private - * - * @staticvar string $comma - * - * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags. - * @param string $value Value to mark up. - * @param string $translate Whether the header has been translated. - * @return string Value, marked up. - */ - private function markup_header( $header, $value, $translate ) { - switch ( $header ) { - case 'Name' : - if ( empty( $value ) ) { - $value = esc_html( $this->get_stylesheet() ); - } - break; - case 'Description' : - $value = wptexturize( $value ); - break; - case 'Author' : - if ( $this->get('AuthorURI') ) { - $value = sprintf( '<a href="%1$s">%2$s</a>', $this->display( 'AuthorURI', true, $translate ), $value ); - } elseif ( ! $value ) { - $value = __( 'Anonymous' ); - } - break; - case 'Tags' : - static $comma = null; - if ( ! isset( $comma ) ) { - /* translators: used between list items, there is a space after the comma */ - $comma = __( ', ' ); - } - $value = implode( $comma, $value ); - break; - case 'ThemeURI' : - case 'AuthorURI' : - $value = esc_url( $value ); - break; - } - - return $value; - } - - /** - * Translate a theme header. - * - * @since 3.4.0 - * @access private - * - * @staticvar array $tags_list - * - * @param string $header Theme header. Name, Description, Author, Version, ThemeURI, AuthorURI, Status, Tags. - * @param string $value Value to translate. - * @return string Translated value. - */ - private function translate_header( $header, $value ) { - switch ( $header ) { - case 'Name' : - // Cached for sorting reasons. - if ( isset( $this->name_translated ) ) - return $this->name_translated; - $this->name_translated = translate( $value, $this->get('TextDomain' ) ); - return $this->name_translated; - case 'Tags' : - if ( empty( $value ) || ! function_exists( 'get_theme_feature_list' ) ) { - return $value; - } - - static $tags_list; - if ( ! isset( $tags_list ) ) { - $tags_list = array( - // As of 4.6, deprecated tags which are only used to provide translation for older themes. - 'black' => __( 'Black' ), 'blue' => __( 'Blue' ), 'brown' => __( 'Brown' ), - 'gray' => __( 'Gray' ), 'green' => __( 'Green' ), 'orange' => __( 'Orange' ), - 'pink' => __( 'Pink' ), 'purple' => __( 'Purple' ), 'red' => __( 'Red' ), - 'silver' => __( 'Silver' ), 'tan' => __( 'Tan' ), 'white' => __( 'White' ), - 'yellow' => __( 'Yellow' ), 'dark' => __( 'Dark' ), 'light' => __( 'Light' ), - 'fixed-layout' => __( 'Fixed Layout' ), 'fluid-layout' => __( 'Fluid Layout' ), - 'responsive-layout' => __( 'Responsive Layout' ), 'blavatar' => __( 'Blavatar' ), - 'photoblogging' => __( 'Photoblogging' ), 'seasonal' => __( 'Seasonal' ), - ); - - $feature_list = get_theme_feature_list( false ); // No API - foreach ( $feature_list as $tags ) { - $tags_list += $tags; - } - } - - foreach ( $value as &$tag ) { - if ( isset( $tags_list[ $tag ] ) ) { - $tag = $tags_list[ $tag ]; - } elseif ( isset( self::$tag_map[ $tag ] ) ) { - $tag = $tags_list[ self::$tag_map[ $tag ] ]; - } - } - - return $value; - - default : - $value = translate( $value, $this->get('TextDomain') ); - } - return $value; - } - - /** - * The directory name of the theme's "stylesheet" files, inside the theme root. - * - * In the case of a child theme, this is directory name of the child theme. - * Otherwise, get_stylesheet() is the same as get_template(). - * - * @since 3.4.0 - * @access public - * - * @return string Stylesheet - */ - public function get_stylesheet() { - return $this->stylesheet; - } - - /** - * The directory name of the theme's "template" files, inside the theme root. - * - * In the case of a child theme, this is the directory name of the parent theme. - * Otherwise, the get_template() is the same as get_stylesheet(). - * - * @since 3.4.0 - * @access public - * - * @return string Template - */ - public function get_template() { - return $this->template; - } - - /** - * Returns the absolute path to the directory of a theme's "stylesheet" files. - * - * In the case of a child theme, this is the absolute path to the directory - * of the child theme's files. - * - * @since 3.4.0 - * @access public - * - * @return string Absolute path of the stylesheet directory. - */ - public function get_stylesheet_directory() { - if ( $this->errors() && in_array( 'theme_root_missing', $this->errors()->get_error_codes() ) ) - return ''; - - return $this->theme_root . '/' . $this->stylesheet; - } - - /** - * Returns the absolute path to the directory of a theme's "template" files. - * - * In the case of a child theme, this is the absolute path to the directory - * of the parent theme's files. - * - * @since 3.4.0 - * @access public - * - * @return string Absolute path of the template directory. - */ - public function get_template_directory() { - if ( $this->parent() ) - $theme_root = $this->parent()->theme_root; - else - $theme_root = $this->theme_root; - - return $theme_root . '/' . $this->template; - } - - /** - * Returns the URL to the directory of a theme's "stylesheet" files. - * - * In the case of a child theme, this is the URL to the directory of the - * child theme's files. - * - * @since 3.4.0 - * @access public - * - * @return string URL to the stylesheet directory. - */ - public function get_stylesheet_directory_uri() { - return $this->get_theme_root_uri() . '/' . str_replace( '%2F', '/', rawurlencode( $this->stylesheet ) ); - } - - /** - * Returns the URL to the directory of a theme's "template" files. - * - * In the case of a child theme, this is the URL to the directory of the - * parent theme's files. - * - * @since 3.4.0 - * @access public - * - * @return string URL to the template directory. - */ - public function get_template_directory_uri() { - if ( $this->parent() ) - $theme_root_uri = $this->parent()->get_theme_root_uri(); - else - $theme_root_uri = $this->get_theme_root_uri(); - - return $theme_root_uri . '/' . str_replace( '%2F', '/', rawurlencode( $this->template ) ); - } - - /** - * The absolute path to the directory of the theme root. - * - * This is typically the absolute path to wp-content/themes. - * - * @since 3.4.0 - * @access public - * - * @return string Theme root. - */ - public function get_theme_root() { - return $this->theme_root; - } - - /** - * Returns the URL to the directory of the theme root. - * - * This is typically the absolute URL to wp-content/themes. This forms the basis - * for all other URLs returned by WP_Theme, so we pass it to the public function - * get_theme_root_uri() and allow it to run the {@see 'theme_root_uri'} filter. - * - * @since 3.4.0 - * @access public - * - * @return string Theme root URI. - */ - public function get_theme_root_uri() { - if ( ! isset( $this->theme_root_uri ) ) - $this->theme_root_uri = get_theme_root_uri( $this->stylesheet, $this->theme_root ); - return $this->theme_root_uri; - } - - /** - * Returns the main screenshot file for the theme. - * - * The main screenshot is called screenshot.png. gif and jpg extensions are also allowed. - * - * Screenshots for a theme must be in the stylesheet directory. (In the case of child - * themes, parent theme screenshots are not inherited.) - * - * @since 3.4.0 - * @access public - * - * @param string $uri Type of URL to return, either 'relative' or an absolute URI. Defaults to absolute URI. - * @return string|false Screenshot file. False if the theme does not have a screenshot. - */ - public function get_screenshot( $uri = 'uri' ) { - $screenshot = $this->cache_get( 'screenshot' ); - if ( $screenshot ) { - if ( 'relative' == $uri ) - return $screenshot; - return $this->get_stylesheet_directory_uri() . '/' . $screenshot; - } elseif ( 0 === $screenshot ) { - return false; - } - - foreach ( array( 'png', 'gif', 'jpg', 'jpeg' ) as $ext ) { - if ( file_exists( $this->get_stylesheet_directory() . "/screenshot.$ext" ) ) { - $this->cache_add( 'screenshot', 'screenshot.' . $ext ); - if ( 'relative' == $uri ) - return 'screenshot.' . $ext; - return $this->get_stylesheet_directory_uri() . '/' . 'screenshot.' . $ext; - } - } - - $this->cache_add( 'screenshot', 0 ); - return false; - } - - /** - * Return files in the theme's directory. - * - * @since 3.4.0 - * @access public - * - * @param mixed $type Optional. Array of extensions to return. Defaults to all files (null). - * @param int $depth Optional. How deep to search for files. Defaults to a flat scan (0 depth). -1 depth is infinite. - * @param bool $search_parent Optional. Whether to return parent files. Defaults to false. - * @return array Array of files, keyed by the path to the file relative to the theme's directory, with the values - * being absolute paths. - */ - public function get_files( $type = null, $depth = 0, $search_parent = false ) { - $files = (array) self::scandir( $this->get_stylesheet_directory(), $type, $depth ); - - if ( $search_parent && $this->parent() ) - $files += (array) self::scandir( $this->get_template_directory(), $type, $depth ); - - return $files; - } - - /** - * Returns the theme's post templates. - * - * @since 4.7.0 - * @access public - * - * @return array Array of page templates, keyed by filename and post type, - * with the value of the translated header name. - */ - public function get_post_templates() { - // If you screw up your current theme and we invalidate your parent, most things still work. Let it slide. - if ( $this->errors() && $this->errors()->get_error_codes() !== array( 'theme_parent_invalid' ) ) { - return array(); - } - - $post_templates = $this->cache_get( 'post_templates' ); - - if ( ! is_array( $post_templates ) ) { - $post_templates = array(); - - $files = (array) $this->get_files( 'php', 1 ); - - foreach ( $files as $file => $full_path ) { - if ( ! preg_match( '|Template Name:(.*)$|mi', file_get_contents( $full_path ), $header ) ) { - continue; - } - - $types = array( 'page' ); - if ( preg_match( '|Template Post Type:(.*)$|mi', file_get_contents( $full_path ), $type ) ) { - $types = explode( ',', _cleanup_header_comment( $type[1] ) ); - } - - foreach ( $types as $type ) { - $type = sanitize_key( $type ); - if ( ! isset( $post_templates[ $type ] ) ) { - $post_templates[ $type ] = array(); - } - - $post_templates[ $type ][ $file ] = _cleanup_header_comment( $header[1] ); - } - } - - $this->cache_add( 'post_templates', $post_templates ); - } - - if ( $this->load_textdomain() ) { - foreach ( $post_templates as &$post_type ) { - foreach ( $post_type as &$post_template ) { - $post_template = $this->translate_header( 'Template Name', $post_template ); - } - } - } - - return $post_templates; - } - - /** - * Returns the theme's post templates for a given post type. - * - * @since 3.4.0 - * @since 4.7.0 Added the `$post_type` parameter. - * @access public - * - * @param WP_Post|null $post Optional. The post being edited, provided for context. - * @param string $post_type Optional. Post type to get the templates for. Default 'page'. - * If a post is provided, its post type is used. - * @return array Array of page templates, keyed by filename, with the value of the translated header name. - */ - public function get_page_templates( $post = null, $post_type = 'page' ) { - if ( $post ) { - $post_type = get_post_type( $post ); - } - - $post_templates = $this->get_post_templates(); - $post_templates = isset( $post_templates[ $post_type ] ) ? $post_templates[ $post_type ] : array(); - - if ( $this->parent() ) { - $post_templates += $this->parent()->get_page_templates( $post, $post_type ); - } - - /** - * Filters list of page templates for a theme. - * - * The dynamic portion of the hook name, `$post_type`, refers to the post type. - * - * @since 3.9.0 - * @since 4.4.0 Converted to allow complete control over the `$page_templates` array. - * @since 4.7.0 Added the `$post_type` parameter. - * - * @param array $post_templates Array of page templates. Keys are filenames, - * values are translated names. - * @param WP_Theme $this The theme object. - * @param WP_Post|null $post The post being edited, provided for context, or null. - * @param string $post_type Post type to get the templates for. - */ - return (array) apply_filters( "theme_{$post_type}_templates", $post_templates, $this, $post, $post_type ); - } - - /** - * Scans a directory for files of a certain extension. - * - * @since 3.4.0 - * - * @static - * @access private - * - * @param string $path Absolute path to search. - * @param array|string|null $extensions Optional. Array of extensions to find, string of a single extension, - * or null for all extensions. Default null. - * @param int $depth Optional. How many levels deep to search for files. Accepts 0, 1+, or - * -1 (infinite depth). Default 0. - * @param string $relative_path Optional. The basename of the absolute path. Used to control the - * returned path for the found files, particularly when this function - * recurses to lower depths. Default empty. - * @return array|false Array of files, keyed by the path to the file relative to the `$path` directory prepended - * with `$relative_path`, with the values being absolute paths. False otherwise. - */ - private static function scandir( $path, $extensions = null, $depth = 0, $relative_path = '' ) { - if ( ! is_dir( $path ) ) - return false; - - if ( $extensions ) { - $extensions = (array) $extensions; - $_extensions = implode( '|', $extensions ); - } - - $relative_path = trailingslashit( $relative_path ); - if ( '/' == $relative_path ) - $relative_path = ''; - - $results = scandir( $path ); - $files = array(); - - /** - * Filters the array of excluded directories and files while scanning theme folder. - * - * @since 4.7.4 - * - * @param array $exclusions Array of excluded directories and files. - */ - $exclusions = (array) apply_filters( 'theme_scandir_exclusions', array( 'CVS', 'node_modules' ) ); - - foreach ( $results as $result ) { - if ( '.' == $result[0] || in_array( $result, $exclusions, true ) ) { - continue; - } - if ( is_dir( $path . '/' . $result ) ) { - if ( ! $depth ) - continue; - $found = self::scandir( $path . '/' . $result, $extensions, $depth - 1 , $relative_path . $result ); - $files = array_merge_recursive( $files, $found ); - } elseif ( ! $extensions || preg_match( '~\.(' . $_extensions . ')$~', $result ) ) { - $files[ $relative_path . $result ] = $path . '/' . $result; - } - } - - return $files; - } - - /** - * Loads the theme's textdomain. - * - * Translation files are not inherited from the parent theme. Todo: if this fails for the - * child theme, it should probably try to load the parent theme's translations. - * - * @since 3.4.0 - * @access public - * - * @return bool True if the textdomain was successfully loaded or has already been loaded. - * False if no textdomain was specified in the file headers, or if the domain could not be loaded. - */ - public function load_textdomain() { - if ( isset( $this->textdomain_loaded ) ) - return $this->textdomain_loaded; - - $textdomain = $this->get('TextDomain'); - if ( ! $textdomain ) { - $this->textdomain_loaded = false; - return false; - } - - if ( is_textdomain_loaded( $textdomain ) ) { - $this->textdomain_loaded = true; - return true; - } - - $path = $this->get_stylesheet_directory(); - if ( $domainpath = $this->get('DomainPath') ) - $path .= $domainpath; - else - $path .= '/languages'; - - $this->textdomain_loaded = load_theme_textdomain( $textdomain, $path ); - return $this->textdomain_loaded; - } - - /** - * Whether the theme is allowed (multisite only). - * - * @since 3.4.0 - * @access public - * - * @param string $check Optional. Whether to check only the 'network'-wide settings, the 'site' - * settings, or 'both'. Defaults to 'both'. - * @param int $blog_id Optional. Ignored if only network-wide settings are checked. Defaults to current site. - * @return bool Whether the theme is allowed for the network. Returns true in single-site. - */ - public function is_allowed( $check = 'both', $blog_id = null ) { - if ( ! is_multisite() ) - return true; - - if ( 'both' == $check || 'network' == $check ) { - $allowed = self::get_allowed_on_network(); - if ( ! empty( $allowed[ $this->get_stylesheet() ] ) ) - return true; - } - - if ( 'both' == $check || 'site' == $check ) { - $allowed = self::get_allowed_on_site( $blog_id ); - if ( ! empty( $allowed[ $this->get_stylesheet() ] ) ) - return true; - } - - return false; - } - - /** - * Determines the latest WordPress default theme that is installed. - * - * This hits the filesystem. - * - * @return WP_Theme|false Object, or false if no theme is installed, which would be bad. - */ - public static function get_core_default_theme() { - foreach ( array_reverse( self::$default_themes ) as $slug => $name ) { - $theme = wp_get_theme( $slug ); - if ( $theme->exists() ) { - return $theme; - } - } - return false; - } - - /** - * Returns array of stylesheet names of themes allowed on the site or network. - * - * @since 3.4.0 - * - * @static - * @access public - * - * @param int $blog_id Optional. ID of the site. Defaults to the current site. - * @return array Array of stylesheet names. - */ - public static function get_allowed( $blog_id = null ) { - /** - * Filters the array of themes allowed on the network. - * - * Site is provided as context so that a list of network allowed themes can - * be filtered further. - * - * @since 4.5.0 - * - * @param array $allowed_themes An array of theme stylesheet names. - * @param int $blog_id ID of the site. - */ - $network = (array) apply_filters( 'network_allowed_themes', self::get_allowed_on_network(), $blog_id ); - return $network + self::get_allowed_on_site( $blog_id ); - } - - /** - * Returns array of stylesheet names of themes allowed on the network. - * - * @since 3.4.0 - * - * @static - * @access public - * - * @staticvar array $allowed_themes - * - * @return array Array of stylesheet names. - */ - public static function get_allowed_on_network() { - static $allowed_themes; - if ( ! isset( $allowed_themes ) ) { - $allowed_themes = (array) get_site_option( 'allowedthemes' ); - } - - /** - * Filters the array of themes allowed on the network. - * - * @since MU - * - * @param array $allowed_themes An array of theme stylesheet names. - */ - $allowed_themes = apply_filters( 'allowed_themes', $allowed_themes ); - - return $allowed_themes; - } - - /** - * Returns array of stylesheet names of themes allowed on the site. - * - * @since 3.4.0 - * - * @static - * @access public - * - * @staticvar array $allowed_themes - * - * @param int $blog_id Optional. ID of the site. Defaults to the current site. - * @return array Array of stylesheet names. - */ - public static function get_allowed_on_site( $blog_id = null ) { - static $allowed_themes = array(); - - if ( ! $blog_id || ! is_multisite() ) - $blog_id = get_current_blog_id(); - - if ( isset( $allowed_themes[ $blog_id ] ) ) { - /** - * Filters the array of themes allowed on the site. - * - * @since 4.5.0 - * - * @param array $allowed_themes An array of theme stylesheet names. - * @param int $blog_id ID of the site. Defaults to current site. - */ - return (array) apply_filters( 'site_allowed_themes', $allowed_themes[ $blog_id ], $blog_id ); - } - - $current = $blog_id == get_current_blog_id(); - - if ( $current ) { - $allowed_themes[ $blog_id ] = get_option( 'allowedthemes' ); - } else { - switch_to_blog( $blog_id ); - $allowed_themes[ $blog_id ] = get_option( 'allowedthemes' ); - restore_current_blog(); - } - - // This is all super old MU back compat joy. - // 'allowedthemes' keys things by stylesheet. 'allowed_themes' keyed things by name. - if ( false === $allowed_themes[ $blog_id ] ) { - if ( $current ) { - $allowed_themes[ $blog_id ] = get_option( 'allowed_themes' ); - } else { - switch_to_blog( $blog_id ); - $allowed_themes[ $blog_id ] = get_option( 'allowed_themes' ); - restore_current_blog(); - } - - if ( ! is_array( $allowed_themes[ $blog_id ] ) || empty( $allowed_themes[ $blog_id ] ) ) { - $allowed_themes[ $blog_id ] = array(); - } else { - $converted = array(); - $themes = wp_get_themes(); - foreach ( $themes as $stylesheet => $theme_data ) { - if ( isset( $allowed_themes[ $blog_id ][ $theme_data->get('Name') ] ) ) - $converted[ $stylesheet ] = true; - } - $allowed_themes[ $blog_id ] = $converted; - } - // Set the option so we never have to go through this pain again. - if ( is_admin() && $allowed_themes[ $blog_id ] ) { - if ( $current ) { - update_option( 'allowedthemes', $allowed_themes[ $blog_id ] ); - delete_option( 'allowed_themes' ); - } else { - switch_to_blog( $blog_id ); - update_option( 'allowedthemes', $allowed_themes[ $blog_id ] ); - delete_option( 'allowed_themes' ); - restore_current_blog(); - } - } - } - - /** This filter is documented in wp-includes/class-wp-theme.php */ - return (array) apply_filters( 'site_allowed_themes', $allowed_themes[ $blog_id ], $blog_id ); - } - - /** - * Enables a theme for all sites on the current network. - * - * @since 4.6.0 - * @access public - * @static - * - * @param string|array $stylesheets Stylesheet name or array of stylesheet names. - */ - public static function network_enable_theme( $stylesheets ) { - if ( ! is_multisite() ) { - return; - } - - if ( ! is_array( $stylesheets ) ) { - $stylesheets = array( $stylesheets ); - } - - $allowed_themes = get_site_option( 'allowedthemes' ); - foreach ( $stylesheets as $stylesheet ) { - $allowed_themes[ $stylesheet ] = true; - } - - update_site_option( 'allowedthemes', $allowed_themes ); - } - - /** - * Disables a theme for all sites on the current network. - * - * @since 4.6.0 - * @access public - * @static - * - * @param string|array $stylesheets Stylesheet name or array of stylesheet names. - */ - public static function network_disable_theme( $stylesheets ) { - if ( ! is_multisite() ) { - return; - } - - if ( ! is_array( $stylesheets ) ) { - $stylesheets = array( $stylesheets ); - } - - $allowed_themes = get_site_option( 'allowedthemes' ); - foreach ( $stylesheets as $stylesheet ) { - if ( isset( $allowed_themes[ $stylesheet ] ) ) { - unset( $allowed_themes[ $stylesheet ] ); - } - } - - update_site_option( 'allowedthemes', $allowed_themes ); - } - - /** - * Sorts themes by name. - * - * @since 3.4.0 - * - * @static - * @access public - * - * @param array $themes Array of themes to sort, passed by reference. - */ - public static function sort_by_name( &$themes ) { - if ( 0 === strpos( get_user_locale(), 'en_' ) ) { - uasort( $themes, array( 'WP_Theme', '_name_sort' ) ); - } else { - uasort( $themes, array( 'WP_Theme', '_name_sort_i18n' ) ); - } - } - - /** - * Callback function for usort() to naturally sort themes by name. - * - * Accesses the Name header directly from the class for maximum speed. - * Would choke on HTML but we don't care enough to slow it down with strip_tags(). - * - * @since 3.4.0 - * - * @static - * @access private - * - * @param string $a First name. - * @param string $b Second name. - * @return int Negative if `$a` falls lower in the natural order than `$b`. Zero if they fall equally. - * Greater than 0 if `$a` falls higher in the natural order than `$b`. Used with usort(). - */ - private static function _name_sort( $a, $b ) { - return strnatcasecmp( $a->headers['Name'], $b->headers['Name'] ); - } - - /** - * Name sort (with translation). - * - * @since 3.4.0 - * - * @static - * @access private - * - * @param string $a First name. - * @param string $b Second name. - * @return int Negative if `$a` falls lower in the natural order than `$b`. Zero if they fall equally. - * Greater than 0 if `$a` falls higher in the natural order than `$b`. Used with usort(). - */ - private static function _name_sort_i18n( $a, $b ) { - // Don't mark up; Do translate. - return strnatcasecmp( $a->display( 'Name', false, true ), $b->display( 'Name', false, true ) ); - } -} diff --git a/wp/wp-includes/class-wp-user-meta-session-tokens.php b/wp/wp-includes/class-wp-user-meta-session-tokens.php deleted file mode 100644 index a01ebff6..00000000 --- a/wp/wp-includes/class-wp-user-meta-session-tokens.php +++ /dev/null @@ -1,139 +0,0 @@ -<?php -/** - * Session API: WP_User_Meta_Session_Tokens class - * - * @package WordPress - * @subpackage Session - * @since 4.7.0 - */ - -/** - * Meta-based user sessions token manager. - * - * @since 4.0.0 - */ -class WP_User_Meta_Session_Tokens extends WP_Session_Tokens { - - /** - * Get all sessions of a user. - * - * @since 4.0.0 - * @access protected - * - * @return array Sessions of a user. - */ - protected function get_sessions() { - $sessions = get_user_meta( $this->user_id, 'session_tokens', true ); - - if ( ! is_array( $sessions ) ) { - return array(); - } - - $sessions = array_map( array( $this, 'prepare_session' ), $sessions ); - return array_filter( $sessions, array( $this, 'is_still_valid' ) ); - } - - /** - * Converts an expiration to an array of session information. - * - * @param mixed $session Session or expiration. - * @return array Session. - */ - protected function prepare_session( $session ) { - if ( is_int( $session ) ) { - return array( 'expiration' => $session ); - } - - return $session; - } - - /** - * Retrieve a session by its verifier (token hash). - * - * @since 4.0.0 - * @access protected - * - * @param string $verifier Verifier of the session to retrieve. - * @return array|null The session, or null if it does not exist - */ - protected function get_session( $verifier ) { - $sessions = $this->get_sessions(); - - if ( isset( $sessions[ $verifier ] ) ) { - return $sessions[ $verifier ]; - } - - return null; - } - - /** - * Update a session by its verifier. - * - * @since 4.0.0 - * @access protected - * - * @param string $verifier Verifier of the session to update. - * @param array $session Optional. Session. Omitting this argument destroys the session. - */ - protected function update_session( $verifier, $session = null ) { - $sessions = $this->get_sessions(); - - if ( $session ) { - $sessions[ $verifier ] = $session; - } else { - unset( $sessions[ $verifier ] ); - } - - $this->update_sessions( $sessions ); - } - - /** - * Update a user's sessions in the usermeta table. - * - * @since 4.0.0 - * @access protected - * - * @param array $sessions Sessions. - */ - protected function update_sessions( $sessions ) { - if ( $sessions ) { - update_user_meta( $this->user_id, 'session_tokens', $sessions ); - } else { - delete_user_meta( $this->user_id, 'session_tokens' ); - } - } - - /** - * Destroy all session tokens for a user, except a single session passed. - * - * @since 4.0.0 - * @access protected - * - * @param string $verifier Verifier of the session to keep. - */ - protected function destroy_other_sessions( $verifier ) { - $session = $this->get_session( $verifier ); - $this->update_sessions( array( $verifier => $session ) ); - } - - /** - * Destroy all session tokens for a user. - * - * @since 4.0.0 - * @access protected - */ - protected function destroy_all_sessions() { - $this->update_sessions( array() ); - } - - /** - * Destroy all session tokens for all users. - * - * @since 4.0.0 - * @access public - * @static - */ - public static function drop_sessions() { - delete_metadata( 'user', 0, 'session_tokens', false, true ); - } -} diff --git a/wp/wp-includes/class-wp-user-query.php b/wp/wp-includes/class-wp-user-query.php deleted file mode 100644 index 0c3e1052..00000000 --- a/wp/wp-includes/class-wp-user-query.php +++ /dev/null @@ -1,878 +0,0 @@ -<?php -/** - * User API: WP_User_Query class - * - * @package WordPress - * @subpackage Users - * @since 4.4.0 - */ - -/** - * Core class used for querying users. - * - * @since 3.1.0 - * - * @see WP_User_Query::prepare_query() for information on accepted arguments. - */ -class WP_User_Query { - - /** - * Query vars, after parsing - * - * @since 3.5.0 - * @access public - * @var array - */ - public $query_vars = array(); - - /** - * List of found user ids - * - * @since 3.1.0 - * @access private - * @var array - */ - private $results; - - /** - * Total number of found users for the current query - * - * @since 3.1.0 - * @access private - * @var int - */ - private $total_users = 0; - - /** - * Metadata query container. - * - * @since 4.2.0 - * @access public - * @var WP_Meta_Query - */ - public $meta_query = false; - - /** - * The SQL query used to fetch matching users. - * - * @since 4.4.0 - * @access public - * @var string - */ - public $request; - - private $compat_fields = array( 'results', 'total_users' ); - - // SQL clauses - public $query_fields; - public $query_from; - public $query_where; - public $query_orderby; - public $query_limit; - - /** - * PHP5 constructor. - * - * @since 3.1.0 - * - * @param null|string|array $query Optional. The query variables. - */ - public function __construct( $query = null ) { - if ( ! empty( $query ) ) { - $this->prepare_query( $query ); - $this->query(); - } - } - - /** - * Fills in missing query variables with default values. - * - * @since 4.4.0 - * @access public - * - * @param array $args Query vars, as passed to `WP_User_Query`. - * @return array Complete query variables with undefined ones filled in with defaults. - */ - public static function fill_query_vars( $args ) { - $defaults = array( - 'blog_id' => get_current_blog_id(), - 'role' => '', - 'role__in' => array(), - 'role__not_in' => array(), - 'meta_key' => '', - 'meta_value' => '', - 'meta_compare' => '', - 'include' => array(), - 'exclude' => array(), - 'search' => '', - 'search_columns' => array(), - 'orderby' => 'login', - 'order' => 'ASC', - 'offset' => '', - 'number' => '', - 'paged' => 1, - 'count_total' => true, - 'fields' => 'all', - 'who' => '', - 'has_published_posts' => null, - 'nicename' => '', - 'nicename__in' => array(), - 'nicename__not_in' => array(), - 'login' => '', - 'login__in' => array(), - 'login__not_in' => array() - ); - - return wp_parse_args( $args, $defaults ); - } - - /** - * Prepare the query variables. - * - * @since 3.1.0 - * @since 4.1.0 Added the ability to order by the `include` value. - * @since 4.2.0 Added 'meta_value_num' support for `$orderby` parameter. Added multi-dimensional array syntax - * for `$orderby` parameter. - * @since 4.3.0 Added 'has_published_posts' parameter. - * @since 4.4.0 Added 'paged', 'role__in', and 'role__not_in' parameters. The 'role' parameter was updated to - * permit an array or comma-separated list of values. The 'number' parameter was updated to support - * querying for all users with using -1. - * @since 4.7.0 Added 'nicename', 'nicename__in', 'nicename__not_in', 'login', 'login__in', - * and 'login__not_in' parameters. - * - * @access public - * - * @global wpdb $wpdb WordPress database abstraction object. - * @global int $blog_id - * - * @param string|array $query { - * Optional. Array or string of Query parameters. - * - * @type int $blog_id The site ID. Default is the current site. - * @type string|array $role An array or a comma-separated list of role names that users must match - * to be included in results. Note that this is an inclusive list: users - * must match *each* role. Default empty. - * @type array $role__in An array of role names. Matched users must have at least one of these - * roles. Default empty array. - * @type array $role__not_in An array of role names to exclude. Users matching one or more of these - * roles will not be included in results. Default empty array. - * @type string $meta_key User meta key. Default empty. - * @type string $meta_value User meta value. Default empty. - * @type string $meta_compare Comparison operator to test the `$meta_value`. Accepts '=', '!=', - * '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', - * 'BETWEEN', 'NOT BETWEEN', 'EXISTS', 'NOT EXISTS', 'REGEXP', - * 'NOT REGEXP', or 'RLIKE'. Default '='. - * @type array $include An array of user IDs to include. Default empty array. - * @type array $exclude An array of user IDs to exclude. Default empty array. - * @type string $search Search keyword. Searches for possible string matches on columns. - * When `$search_columns` is left empty, it tries to determine which - * column to search in based on search string. Default empty. - * @type array $search_columns Array of column names to be searched. Accepts 'ID', 'login', - * 'nicename', 'email', 'url'. Default empty array. - * @type string|array $orderby Field(s) to sort the retrieved users by. May be a single value, - * an array of values, or a multi-dimensional array with fields as - * keys and orders ('ASC' or 'DESC') as values. Accepted values are - * 'ID', 'display_name' (or 'name'), 'include', 'user_login' - * (or 'login'), 'login__in', 'user_nicename' (or 'nicename'), - * 'nicename__in', 'user_email (or 'email'), 'user_url' (or 'url'), - * 'user_registered' (or 'registered'), 'post_count', 'meta_value', - * 'meta_value_num', the value of `$meta_key`, or an array key of - * `$meta_query`. To use 'meta_value' or 'meta_value_num', `$meta_key` - * must be also be defined. Default 'user_login'. - * @type string $order Designates ascending or descending order of users. Order values - * passed as part of an `$orderby` array take precedence over this - * parameter. Accepts 'ASC', 'DESC'. Default 'ASC'. - * @type int $offset Number of users to offset in retrieved results. Can be used in - * conjunction with pagination. Default 0. - * @type int $number Number of users to limit the query for. Can be used in - * conjunction with pagination. Value -1 (all) is supported, but - * should be used with caution on larger sites. - * Default empty (all users). - * @type int $paged When used with number, defines the page of results to return. - * Default 1. - * @type bool $count_total Whether to count the total number of users found. If pagination - * is not needed, setting this to false can improve performance. - * Default true. - * @type string|array $fields Which fields to return. Single or all fields (string), or array - * of fields. Accepts 'ID', 'display_name', 'user_login', - * 'user_nicename', 'user_email', 'user_url', 'user_registered'. - * Use 'all' for all fields and 'all_with_meta' to include - * meta fields. Default 'all'. - * @type string $who Type of users to query. Accepts 'authors'. - * Default empty (all users). - * @type bool|array $has_published_posts Pass an array of post types to filter results to users who have - * published posts in those post types. `true` is an alias for all - * public post types. - * @type string $nicename The user nicename. Default empty. - * @type array $nicename__in An array of nicenames to include. Users matching one of these - * nicenames will be included in results. Default empty array. - * @type array $nicename__not_in An array of nicenames to exclude. Users matching one of these - * nicenames will not be included in results. Default empty array. - * @type string $login The user login. Default empty. - * @type array $login__in An array of logins to include. Users matching one of these - * logins will be included in results. Default empty array. - * @type array $login__not_in An array of logins to exclude. Users matching one of these - * logins will not be included in results. Default empty array. - * } - */ - public function prepare_query( $query = array() ) { - global $wpdb; - - if ( empty( $this->query_vars ) || ! empty( $query ) ) { - $this->query_limit = null; - $this->query_vars = $this->fill_query_vars( $query ); - } - - /** - * Fires before the WP_User_Query has been parsed. - * - * The passed WP_User_Query object contains the query variables, not - * yet passed into SQL. - * - * @since 4.0.0 - * - * @param WP_User_Query $this The current WP_User_Query instance, - * passed by reference. - */ - do_action( 'pre_get_users', $this ); - - // Ensure that query vars are filled after 'pre_get_users'. - $qv =& $this->query_vars; - $qv = $this->fill_query_vars( $qv ); - - if ( is_array( $qv['fields'] ) ) { - $qv['fields'] = array_unique( $qv['fields'] ); - - $this->query_fields = array(); - foreach ( $qv['fields'] as $field ) { - $field = 'ID' === $field ? 'ID' : sanitize_key( $field ); - $this->query_fields[] = "$wpdb->users.$field"; - } - $this->query_fields = implode( ',', $this->query_fields ); - } elseif ( 'all' == $qv['fields'] ) { - $this->query_fields = "$wpdb->users.*"; - } else { - $this->query_fields = "$wpdb->users.ID"; - } - - if ( isset( $qv['count_total'] ) && $qv['count_total'] ) - $this->query_fields = 'SQL_CALC_FOUND_ROWS ' . $this->query_fields; - - $this->query_from = "FROM $wpdb->users"; - $this->query_where = "WHERE 1=1"; - - // Parse and sanitize 'include', for use by 'orderby' as well as 'include' below. - if ( ! empty( $qv['include'] ) ) { - $include = wp_parse_id_list( $qv['include'] ); - } else { - $include = false; - } - - $blog_id = 0; - if ( isset( $qv['blog_id'] ) ) { - $blog_id = absint( $qv['blog_id'] ); - } - - if ( $qv['has_published_posts'] && $blog_id ) { - if ( true === $qv['has_published_posts'] ) { - $post_types = get_post_types( array( 'public' => true ) ); - } else { - $post_types = (array) $qv['has_published_posts']; - } - - foreach ( $post_types as &$post_type ) { - $post_type = $wpdb->prepare( '%s', $post_type ); - } - - $posts_table = $wpdb->get_blog_prefix( $blog_id ) . 'posts'; - $this->query_where .= " AND $wpdb->users.ID IN ( SELECT DISTINCT $posts_table.post_author FROM $posts_table WHERE $posts_table.post_status = 'publish' AND $posts_table.post_type IN ( " . join( ", ", $post_types ) . " ) )"; - } - - // nicename - if ( '' !== $qv['nicename']) { - $this->query_where .= $wpdb->prepare( ' AND user_nicename = %s', $qv['nicename'] ); - } - - if ( ! empty( $qv['nicename__in'] ) ) { - $sanitized_nicename__in = array_map( 'esc_sql', $qv['nicename__in'] ); - $nicename__in = implode( "','", $sanitized_nicename__in ); - $this->query_where .= " AND user_nicename IN ( '$nicename__in' )"; - } - - if ( ! empty( $qv['nicename__not_in'] ) ) { - $sanitized_nicename__not_in = array_map( 'esc_sql', $qv['nicename__not_in'] ); - $nicename__not_in = implode( "','", $sanitized_nicename__not_in ); - $this->query_where .= " AND user_nicename NOT IN ( '$nicename__not_in' )"; - } - - // login - if ( '' !== $qv['login']) { - $this->query_where .= $wpdb->prepare( ' AND user_login = %s', $qv['login'] ); - } - - if ( ! empty( $qv['login__in'] ) ) { - $sanitized_login__in = array_map( 'esc_sql', $qv['login__in'] ); - $login__in = implode( "','", $sanitized_login__in ); - $this->query_where .= " AND user_login IN ( '$login__in' )"; - } - - if ( ! empty( $qv['login__not_in'] ) ) { - $sanitized_login__not_in = array_map( 'esc_sql', $qv['login__not_in'] ); - $login__not_in = implode( "','", $sanitized_login__not_in ); - $this->query_where .= " AND user_login NOT IN ( '$login__not_in' )"; - } - - // Meta query. - $this->meta_query = new WP_Meta_Query(); - $this->meta_query->parse_query_vars( $qv ); - - if ( isset( $qv['who'] ) && 'authors' == $qv['who'] && $blog_id ) { - $who_query = array( - 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'user_level', - 'value' => 0, - 'compare' => '!=', - ); - - // Prevent extra meta query. - $qv['blog_id'] = $blog_id = 0; - - if ( empty( $this->meta_query->queries ) ) { - $this->meta_query->queries = array( $who_query ); - } else { - // Append the cap query to the original queries and reparse the query. - $this->meta_query->queries = array( - 'relation' => 'AND', - array( $this->meta_query->queries, $who_query ), - ); - } - - $this->meta_query->parse_query_vars( $this->meta_query->queries ); - } - - $roles = array(); - if ( isset( $qv['role'] ) ) { - if ( is_array( $qv['role'] ) ) { - $roles = $qv['role']; - } elseif ( is_string( $qv['role'] ) && ! empty( $qv['role'] ) ) { - $roles = array_map( 'trim', explode( ',', $qv['role'] ) ); - } - } - - $role__in = array(); - if ( isset( $qv['role__in'] ) ) { - $role__in = (array) $qv['role__in']; - } - - $role__not_in = array(); - if ( isset( $qv['role__not_in'] ) ) { - $role__not_in = (array) $qv['role__not_in']; - } - - if ( $blog_id && ( ! empty( $roles ) || ! empty( $role__in ) || ! empty( $role__not_in ) || is_multisite() ) ) { - $role_queries = array(); - - $roles_clauses = array( 'relation' => 'AND' ); - if ( ! empty( $roles ) ) { - foreach ( $roles as $role ) { - $roles_clauses[] = array( - 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities', - 'value' => '"' . $role . '"', - 'compare' => 'LIKE', - ); - } - - $role_queries[] = $roles_clauses; - } - - $role__in_clauses = array( 'relation' => 'OR' ); - if ( ! empty( $role__in ) ) { - foreach ( $role__in as $role ) { - $role__in_clauses[] = array( - 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities', - 'value' => '"' . $role . '"', - 'compare' => 'LIKE', - ); - } - - $role_queries[] = $role__in_clauses; - } - - $role__not_in_clauses = array( 'relation' => 'AND' ); - if ( ! empty( $role__not_in ) ) { - foreach ( $role__not_in as $role ) { - $role__not_in_clauses[] = array( - 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities', - 'value' => '"' . $role . '"', - 'compare' => 'NOT LIKE', - ); - } - - $role_queries[] = $role__not_in_clauses; - } - - // If there are no specific roles named, make sure the user is a member of the site. - if ( empty( $role_queries ) ) { - $role_queries[] = array( - 'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities', - 'compare' => 'EXISTS', - ); - } - - // Specify that role queries should be joined with AND. - $role_queries['relation'] = 'AND'; - - if ( empty( $this->meta_query->queries ) ) { - $this->meta_query->queries = $role_queries; - } else { - // Append the cap query to the original queries and reparse the query. - $this->meta_query->queries = array( - 'relation' => 'AND', - array( $this->meta_query->queries, $role_queries ), - ); - } - - $this->meta_query->parse_query_vars( $this->meta_query->queries ); - } - - if ( ! empty( $this->meta_query->queries ) ) { - $clauses = $this->meta_query->get_sql( 'user', $wpdb->users, 'ID', $this ); - $this->query_from .= $clauses['join']; - $this->query_where .= $clauses['where']; - - if ( $this->meta_query->has_or_relation() ) { - $this->query_fields = 'DISTINCT ' . $this->query_fields; - } - } - - // sorting - $qv['order'] = isset( $qv['order'] ) ? strtoupper( $qv['order'] ) : ''; - $order = $this->parse_order( $qv['order'] ); - - if ( empty( $qv['orderby'] ) ) { - // Default order is by 'user_login'. - $ordersby = array( 'user_login' => $order ); - } elseif ( is_array( $qv['orderby'] ) ) { - $ordersby = $qv['orderby']; - } else { - // 'orderby' values may be a comma- or space-separated list. - $ordersby = preg_split( '/[,\s]+/', $qv['orderby'] ); - } - - $orderby_array = array(); - foreach ( $ordersby as $_key => $_value ) { - if ( ! $_value ) { - continue; - } - - if ( is_int( $_key ) ) { - // Integer key means this is a flat array of 'orderby' fields. - $_orderby = $_value; - $_order = $order; - } else { - // Non-integer key means this the key is the field and the value is ASC/DESC. - $_orderby = $_key; - $_order = $_value; - } - - $parsed = $this->parse_orderby( $_orderby ); - - if ( ! $parsed ) { - continue; - } - - if ( 'nicename__in' === $_orderby || 'login__in' === $_orderby ) { - $orderby_array[] = $parsed; - } else { - $orderby_array[] = $parsed . ' ' . $this->parse_order( $_order ); - } - } - - // If no valid clauses were found, order by user_login. - if ( empty( $orderby_array ) ) { - $orderby_array[] = "user_login $order"; - } - - $this->query_orderby = 'ORDER BY ' . implode( ', ', $orderby_array ); - - // limit - if ( isset( $qv['number'] ) && $qv['number'] > 0 ) { - if ( $qv['offset'] ) { - $this->query_limit = $wpdb->prepare("LIMIT %d, %d", $qv['offset'], $qv['number']); - } else { - $this->query_limit = $wpdb->prepare( "LIMIT %d, %d", $qv['number'] * ( $qv['paged'] - 1 ), $qv['number'] ); - } - } - - $search = ''; - if ( isset( $qv['search'] ) ) - $search = trim( $qv['search'] ); - - if ( $search ) { - $leading_wild = ( ltrim($search, '*') != $search ); - $trailing_wild = ( rtrim($search, '*') != $search ); - if ( $leading_wild && $trailing_wild ) - $wild = 'both'; - elseif ( $leading_wild ) - $wild = 'leading'; - elseif ( $trailing_wild ) - $wild = 'trailing'; - else - $wild = false; - if ( $wild ) - $search = trim($search, '*'); - - $search_columns = array(); - if ( $qv['search_columns'] ) - $search_columns = array_intersect( $qv['search_columns'], array( 'ID', 'user_login', 'user_email', 'user_url', 'user_nicename' ) ); - if ( ! $search_columns ) { - if ( false !== strpos( $search, '@') ) - $search_columns = array('user_email'); - elseif ( is_numeric($search) ) - $search_columns = array('user_login', 'ID'); - elseif ( preg_match('|^https?://|', $search) && ! ( is_multisite() && wp_is_large_network( 'users' ) ) ) - $search_columns = array('user_url'); - else - $search_columns = array('user_login', 'user_url', 'user_email', 'user_nicename', 'display_name'); - } - - /** - * Filters the columns to search in a WP_User_Query search. - * - * The default columns depend on the search term, and include 'user_email', - * 'user_login', 'ID', 'user_url', 'display_name', and 'user_nicename'. - * - * @since 3.6.0 - * - * @param array $search_columns Array of column names to be searched. - * @param string $search Text being searched. - * @param WP_User_Query $this The current WP_User_Query instance. - */ - $search_columns = apply_filters( 'user_search_columns', $search_columns, $search, $this ); - - $this->query_where .= $this->get_search_sql( $search, $search_columns, $wild ); - } - - if ( ! empty( $include ) ) { - // Sanitized earlier. - $ids = implode( ',', $include ); - $this->query_where .= " AND $wpdb->users.ID IN ($ids)"; - } elseif ( ! empty( $qv['exclude'] ) ) { - $ids = implode( ',', wp_parse_id_list( $qv['exclude'] ) ); - $this->query_where .= " AND $wpdb->users.ID NOT IN ($ids)"; - } - - // Date queries are allowed for the user_registered field. - if ( ! empty( $qv['date_query'] ) && is_array( $qv['date_query'] ) ) { - $date_query = new WP_Date_Query( $qv['date_query'], 'user_registered' ); - $this->query_where .= $date_query->get_sql(); - } - - /** - * Fires after the WP_User_Query has been parsed, and before - * the query is executed. - * - * The passed WP_User_Query object contains SQL parts formed - * from parsing the given query. - * - * @since 3.1.0 - * - * @param WP_User_Query $this The current WP_User_Query instance, - * passed by reference. - */ - do_action_ref_array( 'pre_user_query', array( &$this ) ); - } - - /** - * Execute the query, with the current variables. - * - * @since 3.1.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - */ - public function query() { - global $wpdb; - - $qv =& $this->query_vars; - - $this->request = "SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit"; - - if ( is_array( $qv['fields'] ) || 'all' == $qv['fields'] ) { - $this->results = $wpdb->get_results( $this->request ); - } else { - $this->results = $wpdb->get_col( $this->request ); - } - - /** - * Filters SELECT FOUND_ROWS() query for the current WP_User_Query instance. - * - * @since 3.2.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $sql The SELECT FOUND_ROWS() query for the current WP_User_Query. - */ - if ( isset( $qv['count_total'] ) && $qv['count_total'] ) - $this->total_users = $wpdb->get_var( apply_filters( 'found_users_query', 'SELECT FOUND_ROWS()' ) ); - - if ( !$this->results ) - return; - - if ( 'all_with_meta' == $qv['fields'] ) { - cache_users( $this->results ); - - $r = array(); - foreach ( $this->results as $userid ) - $r[ $userid ] = new WP_User( $userid, '', $qv['blog_id'] ); - - $this->results = $r; - } elseif ( 'all' == $qv['fields'] ) { - foreach ( $this->results as $key => $user ) { - $this->results[ $key ] = new WP_User( $user, '', $qv['blog_id'] ); - } - } - } - - /** - * Retrieve query variable. - * - * @since 3.5.0 - * @access public - * - * @param string $query_var Query variable key. - * @return mixed - */ - public function get( $query_var ) { - if ( isset( $this->query_vars[$query_var] ) ) - return $this->query_vars[$query_var]; - - return null; - } - - /** - * Set query variable. - * - * @since 3.5.0 - * @access public - * - * @param string $query_var Query variable key. - * @param mixed $value Query variable value. - */ - public function set( $query_var, $value ) { - $this->query_vars[$query_var] = $value; - } - - /** - * Used internally to generate an SQL string for searching across multiple columns - * - * @access protected - * @since 3.1.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $string - * @param array $cols - * @param bool $wild Whether to allow wildcard searches. Default is false for Network Admin, true for single site. - * Single site allows leading and trailing wildcards, Network Admin only trailing. - * @return string - */ - protected function get_search_sql( $string, $cols, $wild = false ) { - global $wpdb; - - $searches = array(); - $leading_wild = ( 'leading' == $wild || 'both' == $wild ) ? '%' : ''; - $trailing_wild = ( 'trailing' == $wild || 'both' == $wild ) ? '%' : ''; - $like = $leading_wild . $wpdb->esc_like( $string ) . $trailing_wild; - - foreach ( $cols as $col ) { - if ( 'ID' == $col ) { - $searches[] = $wpdb->prepare( "$col = %s", $string ); - } else { - $searches[] = $wpdb->prepare( "$col LIKE %s", $like ); - } - } - - return ' AND (' . implode(' OR ', $searches) . ')'; - } - - /** - * Return the list of users. - * - * @since 3.1.0 - * @access public - * - * @return array Array of results. - */ - public function get_results() { - return $this->results; - } - - /** - * Return the total number of users for the current query. - * - * @since 3.1.0 - * @access public - * - * @return int Number of total users. - */ - public function get_total() { - return $this->total_users; - } - - /** - * Parse and sanitize 'orderby' keys passed to the user query. - * - * @since 4.2.0 - * @access protected - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $orderby Alias for the field to order by. - * @return string Value to used in the ORDER clause, if `$orderby` is valid. - */ - protected function parse_orderby( $orderby ) { - global $wpdb; - - $meta_query_clauses = $this->meta_query->get_clauses(); - - $_orderby = ''; - if ( in_array( $orderby, array( 'login', 'nicename', 'email', 'url', 'registered' ) ) ) { - $_orderby = 'user_' . $orderby; - } elseif ( in_array( $orderby, array( 'user_login', 'user_nicename', 'user_email', 'user_url', 'user_registered' ) ) ) { - $_orderby = $orderby; - } elseif ( 'name' == $orderby || 'display_name' == $orderby ) { - $_orderby = 'display_name'; - } elseif ( 'post_count' == $orderby ) { - // todo: avoid the JOIN - $where = get_posts_by_author_sql( 'post' ); - $this->query_from .= " LEFT OUTER JOIN ( - SELECT post_author, COUNT(*) as post_count - FROM $wpdb->posts - $where - GROUP BY post_author - ) p ON ({$wpdb->users}.ID = p.post_author) - "; - $_orderby = 'post_count'; - } elseif ( 'ID' == $orderby || 'id' == $orderby ) { - $_orderby = 'ID'; - } elseif ( 'meta_value' == $orderby || $this->get( 'meta_key' ) == $orderby ) { - $_orderby = "$wpdb->usermeta.meta_value"; - } elseif ( 'meta_value_num' == $orderby ) { - $_orderby = "$wpdb->usermeta.meta_value+0"; - } elseif ( 'include' === $orderby && ! empty( $this->query_vars['include'] ) ) { - $include = wp_parse_id_list( $this->query_vars['include'] ); - $include_sql = implode( ',', $include ); - $_orderby = "FIELD( $wpdb->users.ID, $include_sql )"; - } elseif ( 'nicename__in' === $orderby ) { - $sanitized_nicename__in = array_map( 'esc_sql', $this->query_vars['nicename__in'] ); - $nicename__in = implode( "','", $sanitized_nicename__in ); - $_orderby = "FIELD( user_nicename, '$nicename__in' )"; - } elseif ( 'login__in' === $orderby ) { - $sanitized_login__in = array_map( 'esc_sql', $this->query_vars['login__in'] ); - $login__in = implode( "','", $sanitized_login__in ); - $_orderby = "FIELD( user_login, '$login__in' )"; - } elseif ( isset( $meta_query_clauses[ $orderby ] ) ) { - $meta_clause = $meta_query_clauses[ $orderby ]; - $_orderby = sprintf( "CAST(%s.meta_value AS %s)", esc_sql( $meta_clause['alias'] ), esc_sql( $meta_clause['cast'] ) ); - } - - return $_orderby; - } - - /** - * Parse an 'order' query variable and cast it to ASC or DESC as necessary. - * - * @since 4.2.0 - * @access protected - * - * @param string $order The 'order' query variable. - * @return string The sanitized 'order' query variable. - */ - protected function parse_order( $order ) { - if ( ! is_string( $order ) || empty( $order ) ) { - return 'DESC'; - } - - if ( 'ASC' === strtoupper( $order ) ) { - return 'ASC'; - } else { - return 'DESC'; - } - } - - /** - * Make private properties readable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param string $name Property to get. - * @return mixed Property. - */ - public function __get( $name ) { - if ( in_array( $name, $this->compat_fields ) ) { - return $this->$name; - } - } - - /** - * Make private properties settable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param string $name Property to check if set. - * @param mixed $value Property value. - * @return mixed Newly-set property. - */ - public function __set( $name, $value ) { - if ( in_array( $name, $this->compat_fields ) ) { - return $this->$name = $value; - } - } - - /** - * Make private properties checkable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param string $name Property to check if set. - * @return bool Whether the property is set. - */ - public function __isset( $name ) { - if ( in_array( $name, $this->compat_fields ) ) { - return isset( $this->$name ); - } - } - - /** - * Make private properties un-settable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param string $name Property to unset. - */ - public function __unset( $name ) { - if ( in_array( $name, $this->compat_fields ) ) { - unset( $this->$name ); - } - } - - /** - * Make private/protected methods readable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param callable $name Method to call. - * @param array $arguments Arguments to pass when calling. - * @return mixed Return value of the callback, false otherwise. - */ - public function __call( $name, $arguments ) { - if ( 'get_search_sql' === $name ) { - return call_user_func_array( array( $this, $name ), $arguments ); - } - return false; - } -} diff --git a/wp/wp-includes/class-wp-user.php b/wp/wp-includes/class-wp-user.php deleted file mode 100644 index 328fb6a5..00000000 --- a/wp/wp-includes/class-wp-user.php +++ /dev/null @@ -1,789 +0,0 @@ -<?php -/** - * User API: WP_User class - * - * @package WordPress - * @subpackage Users - * @since 4.4.0 - */ - -/** - * Core class used to implement the WP_User object. - * - * @since 2.0.0 - * - * @property string $nickname - * @property string $description - * @property string $user_description - * @property string $first_name - * @property string $user_firstname - * @property string $last_name - * @property string $user_lastname - * @property string $user_login - * @property string $user_pass - * @property string $user_nicename - * @property string $user_email - * @property string $user_url - * @property string $user_registered - * @property string $user_activation_key - * @property string $user_status - * @property int $user_level - * @property string $display_name - * @property string $spam - * @property string $deleted - * @property string $locale - */ -class WP_User { - /** - * User data container. - * - * @since 2.0.0 - * @var object - */ - public $data; - - /** - * The user's ID. - * - * @since 2.1.0 - * @access public - * @var int - */ - public $ID = 0; - - /** - * The individual capabilities the user has been given. - * - * @since 2.0.0 - * @access public - * @var array - */ - public $caps = array(); - - /** - * User metadata option name. - * - * @since 2.0.0 - * @access public - * @var string - */ - public $cap_key; - - /** - * The roles the user is part of. - * - * @since 2.0.0 - * @access public - * @var array - */ - public $roles = array(); - - /** - * All capabilities the user has, including individual and role based. - * - * @since 2.0.0 - * @access public - * @var array - */ - public $allcaps = array(); - - /** - * The filter context applied to user data fields. - * - * @since 2.9.0 - * @access private - * @var string - */ - var $filter = null; - - /** - * @static - * @access private - * @var array - */ - private static $back_compat_keys; - - /** - * Constructor. - * - * Retrieves the userdata and passes it to WP_User::init(). - * - * @since 2.0.0 - * @access public - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int|string|stdClass|WP_User $id User's ID, a WP_User object, or a user object from the DB. - * @param string $name Optional. User's username - * @param int $blog_id Optional Site ID, defaults to current site. - */ - public function __construct( $id = 0, $name = '', $blog_id = '' ) { - if ( ! isset( self::$back_compat_keys ) ) { - $prefix = $GLOBALS['wpdb']->prefix; - self::$back_compat_keys = array( - 'user_firstname' => 'first_name', - 'user_lastname' => 'last_name', - 'user_description' => 'description', - 'user_level' => $prefix . 'user_level', - $prefix . 'usersettings' => $prefix . 'user-settings', - $prefix . 'usersettingstime' => $prefix . 'user-settings-time', - ); - } - - if ( $id instanceof WP_User ) { - $this->init( $id->data, $blog_id ); - return; - } elseif ( is_object( $id ) ) { - $this->init( $id, $blog_id ); - return; - } - - if ( ! empty( $id ) && ! is_numeric( $id ) ) { - $name = $id; - $id = 0; - } - - if ( $id ) { - $data = self::get_data_by( 'id', $id ); - } else { - $data = self::get_data_by( 'login', $name ); - } - - if ( $data ) { - $this->init( $data, $blog_id ); - } else { - $this->data = new stdClass; - } - } - - /** - * Sets up object properties, including capabilities. - * - * @param object $data User DB row object. - * @param int $blog_id Optional. The site ID to initialize for. - */ - public function init( $data, $blog_id = '' ) { - $this->data = $data; - $this->ID = (int) $data->ID; - - $this->for_blog( $blog_id ); - } - - /** - * Return only the main user fields - * - * @since 3.3.0 - * @since 4.4.0 Added 'ID' as an alias of 'id' for the `$field` parameter. - * - * @static - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $field The field to query against: 'id', 'ID', 'slug', 'email' or 'login'. - * @param string|int $value The field value - * @return object|false Raw user object - */ - public static function get_data_by( $field, $value ) { - global $wpdb; - - // 'ID' is an alias of 'id'. - if ( 'ID' === $field ) { - $field = 'id'; - } - - if ( 'id' == $field ) { - // Make sure the value is numeric to avoid casting objects, for example, - // to int 1. - if ( ! is_numeric( $value ) ) - return false; - $value = intval( $value ); - if ( $value < 1 ) - return false; - } else { - $value = trim( $value ); - } - - if ( !$value ) - return false; - - switch ( $field ) { - case 'id': - $user_id = $value; - $db_field = 'ID'; - break; - case 'slug': - $user_id = wp_cache_get($value, 'userslugs'); - $db_field = 'user_nicename'; - break; - case 'email': - $user_id = wp_cache_get($value, 'useremail'); - $db_field = 'user_email'; - break; - case 'login': - $value = sanitize_user( $value ); - $user_id = wp_cache_get($value, 'userlogins'); - $db_field = 'user_login'; - break; - default: - return false; - } - - if ( false !== $user_id ) { - if ( $user = wp_cache_get( $user_id, 'users' ) ) - return $user; - } - - if ( !$user = $wpdb->get_row( $wpdb->prepare( - "SELECT * FROM $wpdb->users WHERE $db_field = %s", $value - ) ) ) - return false; - - update_user_caches( $user ); - - return $user; - } - - /** - * Makes private/protected methods readable for backward compatibility. - * - * @since 4.3.0 - * @access public - * - * @param callable $name Method to call. - * @param array $arguments Arguments to pass when calling. - * @return mixed|false Return value of the callback, false otherwise. - */ - public function __call( $name, $arguments ) { - if ( '_init_caps' === $name ) { - return call_user_func_array( array( $this, $name ), $arguments ); - } - return false; - } - - /** - * Magic method for checking the existence of a certain custom field. - * - * @since 3.3.0 - * @access public - * - * @param string $key User meta key to check if set. - * @return bool Whether the given user meta key is set. - */ - public function __isset( $key ) { - if ( 'id' == $key ) { - _deprecated_argument( 'WP_User->id', '2.1.0', - sprintf( - /* translators: %s: WP_User->ID */ - __( 'Use %s instead.' ), - '<code>WP_User->ID</code>' - ) - ); - $key = 'ID'; - } - - if ( isset( $this->data->$key ) ) - return true; - - if ( isset( self::$back_compat_keys[ $key ] ) ) - $key = self::$back_compat_keys[ $key ]; - - return metadata_exists( 'user', $this->ID, $key ); - } - - /** - * Magic method for accessing custom fields. - * - * @since 3.3.0 - * @access public - * - * @param string $key User meta key to retrieve. - * @return mixed Value of the given user meta key (if set). If `$key` is 'id', the user ID. - */ - public function __get( $key ) { - if ( 'id' == $key ) { - _deprecated_argument( 'WP_User->id', '2.1.0', - sprintf( - /* translators: %s: WP_User->ID */ - __( 'Use %s instead.' ), - '<code>WP_User->ID</code>' - ) - ); - return $this->ID; - } - - if ( isset( $this->data->$key ) ) { - $value = $this->data->$key; - } else { - if ( isset( self::$back_compat_keys[ $key ] ) ) - $key = self::$back_compat_keys[ $key ]; - $value = get_user_meta( $this->ID, $key, true ); - } - - if ( $this->filter ) { - $value = sanitize_user_field( $key, $value, $this->ID, $this->filter ); - } - - return $value; - } - - /** - * Magic method for setting custom user fields. - * - * This method does not update custom fields in the database. It only stores - * the value on the WP_User instance. - * - * @since 3.3.0 - * @access public - * - * @param string $key User meta key. - * @param mixed $value User meta value. - */ - public function __set( $key, $value ) { - if ( 'id' == $key ) { - _deprecated_argument( 'WP_User->id', '2.1.0', - sprintf( - /* translators: %s: WP_User->ID */ - __( 'Use %s instead.' ), - '<code>WP_User->ID</code>' - ) - ); - $this->ID = $value; - return; - } - - $this->data->$key = $value; - } - - /** - * Magic method for unsetting a certain custom field. - * - * @since 4.4.0 - * @access public - * - * @param string $key User meta key to unset. - */ - public function __unset( $key ) { - if ( 'id' == $key ) { - _deprecated_argument( 'WP_User->id', '2.1.0', - sprintf( - /* translators: %s: WP_User->ID */ - __( 'Use %s instead.' ), - '<code>WP_User->ID</code>' - ) - ); - } - - if ( isset( $this->data->$key ) ) { - unset( $this->data->$key ); - } - - if ( isset( self::$back_compat_keys[ $key ] ) ) { - unset( self::$back_compat_keys[ $key ] ); - } - } - - /** - * Determine whether the user exists in the database. - * - * @since 3.4.0 - * @access public - * - * @return bool True if user exists in the database, false if not. - */ - public function exists() { - return ! empty( $this->ID ); - } - - /** - * Retrieve the value of a property or meta key. - * - * Retrieves from the users and usermeta table. - * - * @since 3.3.0 - * - * @param string $key Property - * @return mixed - */ - public function get( $key ) { - return $this->__get( $key ); - } - - /** - * Determine whether a property or meta key is set - * - * Consults the users and usermeta tables. - * - * @since 3.3.0 - * - * @param string $key Property - * @return bool - */ - public function has_prop( $key ) { - return $this->__isset( $key ); - } - - /** - * Return an array representation. - * - * @since 3.5.0 - * - * @return array Array representation. - */ - public function to_array() { - return get_object_vars( $this->data ); - } - - /** - * Set up capability object properties. - * - * Will set the value for the 'cap_key' property to current database table - * prefix, followed by 'capabilities'. Will then check to see if the - * property matching the 'cap_key' exists and is an array. If so, it will be - * used. - * - * @access protected - * @since 2.1.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $cap_key Optional capability key - */ - protected function _init_caps( $cap_key = '' ) { - global $wpdb; - - if ( empty($cap_key) ) - $this->cap_key = $wpdb->get_blog_prefix() . 'capabilities'; - else - $this->cap_key = $cap_key; - - $this->caps = get_user_meta( $this->ID, $this->cap_key, true ); - - if ( ! is_array( $this->caps ) ) - $this->caps = array(); - - $this->get_role_caps(); - } - - /** - * Retrieve all of the role capabilities and merge with individual capabilities. - * - * All of the capabilities of the roles the user belongs to are merged with - * the users individual roles. This also means that the user can be denied - * specific roles that their role might have, but the specific user isn't - * granted permission to. - * - * @since 2.0.0 - * @access public - * - * @return array List of all capabilities for the user. - */ - public function get_role_caps() { - $wp_roles = wp_roles(); - - //Filter out caps that are not role names and assign to $this->roles - if ( is_array( $this->caps ) ) - $this->roles = array_filter( array_keys( $this->caps ), array( $wp_roles, 'is_role' ) ); - - //Build $allcaps from role caps, overlay user's $caps - $this->allcaps = array(); - foreach ( (array) $this->roles as $role ) { - $the_role = $wp_roles->get_role( $role ); - $this->allcaps = array_merge( (array) $this->allcaps, (array) $the_role->capabilities ); - } - $this->allcaps = array_merge( (array) $this->allcaps, (array) $this->caps ); - - return $this->allcaps; - } - - /** - * Add role to user. - * - * Updates the user's meta data option with capabilities and roles. - * - * @since 2.0.0 - * @access public - * - * @param string $role Role name. - */ - public function add_role( $role ) { - if ( empty( $role ) ) { - return; - } - - $this->caps[$role] = true; - update_user_meta( $this->ID, $this->cap_key, $this->caps ); - $this->get_role_caps(); - $this->update_user_level_from_caps(); - - /** - * Fires immediately after the user has been given a new role. - * - * @since 4.3.0 - * - * @param int $user_id The user ID. - * @param string $role The new role. - */ - do_action( 'add_user_role', $this->ID, $role ); - } - - /** - * Remove role from user. - * - * @since 2.0.0 - * @access public - * - * @param string $role Role name. - */ - public function remove_role( $role ) { - if ( !in_array($role, $this->roles) ) - return; - unset( $this->caps[$role] ); - update_user_meta( $this->ID, $this->cap_key, $this->caps ); - $this->get_role_caps(); - $this->update_user_level_from_caps(); - - /** - * Fires immediately after a role as been removed from a user. - * - * @since 4.3.0 - * - * @param int $user_id The user ID. - * @param string $role The removed role. - */ - do_action( 'remove_user_role', $this->ID, $role ); - } - - /** - * Set the role of the user. - * - * This will remove the previous roles of the user and assign the user the - * new one. You can set the role to an empty string and it will remove all - * of the roles from the user. - * - * @since 2.0.0 - * @access public - * - * @param string $role Role name. - */ - public function set_role( $role ) { - if ( 1 == count( $this->roles ) && $role == current( $this->roles ) ) - return; - - foreach ( (array) $this->roles as $oldrole ) - unset( $this->caps[$oldrole] ); - - $old_roles = $this->roles; - if ( !empty( $role ) ) { - $this->caps[$role] = true; - $this->roles = array( $role => true ); - } else { - $this->roles = false; - } - update_user_meta( $this->ID, $this->cap_key, $this->caps ); - $this->get_role_caps(); - $this->update_user_level_from_caps(); - - /** - * Fires after the user's role has changed. - * - * @since 2.9.0 - * @since 3.6.0 Added $old_roles to include an array of the user's previous roles. - * - * @param int $user_id The user ID. - * @param string $role The new role. - * @param array $old_roles An array of the user's previous roles. - */ - do_action( 'set_user_role', $this->ID, $role, $old_roles ); - } - - /** - * Choose the maximum level the user has. - * - * Will compare the level from the $item parameter against the $max - * parameter. If the item is incorrect, then just the $max parameter value - * will be returned. - * - * Used to get the max level based on the capabilities the user has. This - * is also based on roles, so if the user is assigned the Administrator role - * then the capability 'level_10' will exist and the user will get that - * value. - * - * @since 2.0.0 - * @access public - * - * @param int $max Max level of user. - * @param string $item Level capability name. - * @return int Max Level. - */ - public function level_reduction( $max, $item ) { - if ( preg_match( '/^level_(10|[0-9])$/i', $item, $matches ) ) { - $level = intval( $matches[1] ); - return max( $max, $level ); - } else { - return $max; - } - } - - /** - * Update the maximum user level for the user. - * - * Updates the 'user_level' user metadata (includes prefix that is the - * database table prefix) with the maximum user level. Gets the value from - * the all of the capabilities that the user has. - * - * @since 2.0.0 - * @access public - * - * @global wpdb $wpdb WordPress database abstraction object. - */ - public function update_user_level_from_caps() { - global $wpdb; - $this->user_level = array_reduce( array_keys( $this->allcaps ), array( $this, 'level_reduction' ), 0 ); - update_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level', $this->user_level ); - } - - /** - * Add capability and grant or deny access to capability. - * - * @since 2.0.0 - * @access public - * - * @param string $cap Capability name. - * @param bool $grant Whether to grant capability to user. - */ - public function add_cap( $cap, $grant = true ) { - $this->caps[$cap] = $grant; - update_user_meta( $this->ID, $this->cap_key, $this->caps ); - $this->get_role_caps(); - $this->update_user_level_from_caps(); - } - - /** - * Remove capability from user. - * - * @since 2.0.0 - * @access public - * - * @param string $cap Capability name. - */ - public function remove_cap( $cap ) { - if ( ! isset( $this->caps[ $cap ] ) ) { - return; - } - unset( $this->caps[ $cap ] ); - update_user_meta( $this->ID, $this->cap_key, $this->caps ); - $this->get_role_caps(); - $this->update_user_level_from_caps(); - } - - /** - * Remove all of the capabilities of the user. - * - * @since 2.1.0 - * @access public - * - * @global wpdb $wpdb WordPress database abstraction object. - */ - public function remove_all_caps() { - global $wpdb; - $this->caps = array(); - delete_user_meta( $this->ID, $this->cap_key ); - delete_user_meta( $this->ID, $wpdb->get_blog_prefix() . 'user_level' ); - $this->get_role_caps(); - } - - /** - * Whether user has capability or role name. - * - * While checking against particular roles in place of a capability is supported - * in part, this practice is discouraged as it may produce unreliable results. - * - * @since 2.0.0 - * @access public - * - * @see map_meta_cap() - * - * @param string $cap Capability name. - * @param int $object_id,... Optional. ID of the specific object to check against if `$cap` is a "meta" cap. - * "Meta" capabilities, e.g. 'edit_post', 'edit_user', etc., are capabilities used - * by map_meta_cap() to map to other "primitive" capabilities, e.g. 'edit_posts', - * 'edit_others_posts', etc. The parameter is accessed via func_get_args() and passed - * to map_meta_cap(). - * @return bool Whether the current user has the given capability. If `$cap` is a meta cap and `$object_id` is - * passed, whether the current user has the given meta capability for the given object. - */ - public function has_cap( $cap ) { - if ( is_numeric( $cap ) ) { - _deprecated_argument( __FUNCTION__, '2.0.0', __('Usage of user levels by plugins and themes is deprecated. Use roles and capabilities instead.') ); - $cap = $this->translate_level_to_cap( $cap ); - } - - $args = array_slice( func_get_args(), 1 ); - $args = array_merge( array( $cap, $this->ID ), $args ); - $caps = call_user_func_array( 'map_meta_cap', $args ); - - // Multisite super admin has all caps by definition, Unless specifically denied. - if ( is_multisite() && is_super_admin( $this->ID ) ) { - if ( in_array('do_not_allow', $caps) ) - return false; - return true; - } - - /** - * Dynamically filter a user's capabilities. - * - * @since 2.0.0 - * @since 3.7.0 Added the user object. - * - * @param array $allcaps An array of all the user's capabilities. - * @param array $caps Actual capabilities for meta capability. - * @param array $args Optional parameters passed to has_cap(), typically object ID. - * @param WP_User $user The user object. - */ - $capabilities = apply_filters( 'user_has_cap', $this->allcaps, $caps, $args, $this ); - - // Everyone is allowed to exist. - $capabilities['exist'] = true; - - // Must have ALL requested caps. - foreach ( (array) $caps as $cap ) { - if ( empty( $capabilities[ $cap ] ) ) - return false; - } - - return true; - } - - /** - * Convert numeric level to level capability name. - * - * Prepends 'level_' to level number. - * - * @since 2.0.0 - * @access public - * - * @param int $level Level number, 1 to 10. - * @return string - */ - public function translate_level_to_cap( $level ) { - return 'level_' . $level; - } - - /** - * Set the site to operate on. Defaults to the current site. - * - * @since 3.0.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $blog_id Optional. Site ID, defaults to current site. - */ - public function for_blog( $blog_id = '' ) { - global $wpdb; - if ( ! empty( $blog_id ) ) - $cap_key = $wpdb->get_blog_prefix( $blog_id ) . 'capabilities'; - else - $cap_key = ''; - $this->_init_caps( $cap_key ); - } -} diff --git a/wp/wp-includes/class-wp-walker.php b/wp/wp-includes/class-wp-walker.php deleted file mode 100644 index 57bd90bf..00000000 --- a/wp/wp-includes/class-wp-walker.php +++ /dev/null @@ -1,425 +0,0 @@ -<?php -/** - * A class for displaying various tree-like structures. - * - * Extend the Walker class to use it, see examples below. Child classes - * do not need to implement all of the abstract methods in the class. The child - * only needs to implement the methods that are needed. - * - * @since 2.1.0 - * - * @package WordPress - * @abstract - */ -class Walker { - /** - * What the class handles. - * - * @since 2.1.0 - * @access public - * @var string - */ - public $tree_type; - - /** - * DB fields to use. - * - * @since 2.1.0 - * @var array - */ - public $db_fields; - - /** - * Max number of pages walked by the paged walker - * - * @since 2.7.0 - * @var int - */ - public $max_pages = 1; - - /** - * Whether the current element has children or not. - * - * To be used in start_el(). - * - * @since 4.0.0 - * @var bool - */ - public $has_children; - - /** - * Starts the list before the elements are added. - * - * The $args parameter holds additional values that may be used with the child - * class methods. This method is called at the start of the output list. - * - * @since 2.1.0 - * @abstract - * - * @param string $output Passed by reference. Used to append additional content. - * @param int $depth Depth of the item. - * @param array $args An array of additional arguments. - */ - public function start_lvl( &$output, $depth = 0, $args = array() ) {} - - /** - * Ends the list of after the elements are added. - * - * The $args parameter holds additional values that may be used with the child - * class methods. This method finishes the list at the end of output of the elements. - * - * @since 2.1.0 - * @abstract - * - * @param string $output Passed by reference. Used to append additional content. - * @param int $depth Depth of the item. - * @param array $args An array of additional arguments. - */ - public function end_lvl( &$output, $depth = 0, $args = array() ) {} - - /** - * Start the element output. - * - * The $args parameter holds additional values that may be used with the child - * class methods. Includes the element output also. - * - * @since 2.1.0 - * @abstract - * - * @param string $output Passed by reference. Used to append additional content. - * @param object $object The data object. - * @param int $depth Depth of the item. - * @param array $args An array of additional arguments. - * @param int $current_object_id ID of the current item. - */ - public function start_el( &$output, $object, $depth = 0, $args = array(), $current_object_id = 0 ) {} - - /** - * Ends the element output, if needed. - * - * The $args parameter holds additional values that may be used with the child class methods. - * - * @since 2.1.0 - * @abstract - * - * @param string $output Passed by reference. Used to append additional content. - * @param object $object The data object. - * @param int $depth Depth of the item. - * @param array $args An array of additional arguments. - */ - public function end_el( &$output, $object, $depth = 0, $args = array() ) {} - - /** - * Traverse elements to create list from elements. - * - * Display one element if the element doesn't have any children otherwise, - * display the element and its children. Will only traverse up to the max - * depth and no ignore elements under that depth. It is possible to set the - * max depth to include all depths, see walk() method. - * - * This method should not be called directly, use the walk() method instead. - * - * @since 2.5.0 - * - * @param object $element Data object. - * @param array $children_elements List of elements to continue traversing. - * @param int $max_depth Max depth to traverse. - * @param int $depth Depth of current element. - * @param array $args An array of arguments. - * @param string $output Passed by reference. Used to append additional content. - */ - public function display_element( $element, &$children_elements, $max_depth, $depth, $args, &$output ) { - if ( ! $element ) { - return; - } - - $id_field = $this->db_fields['id']; - $id = $element->$id_field; - - //display this element - $this->has_children = ! empty( $children_elements[ $id ] ); - if ( isset( $args[0] ) && is_array( $args[0] ) ) { - $args[0]['has_children'] = $this->has_children; // Back-compat. - } - - $cb_args = array_merge( array(&$output, $element, $depth), $args); - call_user_func_array(array($this, 'start_el'), $cb_args); - - // descend only when the depth is right and there are childrens for this element - if ( ($max_depth == 0 || $max_depth > $depth+1 ) && isset( $children_elements[$id]) ) { - - foreach ( $children_elements[ $id ] as $child ){ - - if ( !isset($newlevel) ) { - $newlevel = true; - //start the child delimiter - $cb_args = array_merge( array(&$output, $depth), $args); - call_user_func_array(array($this, 'start_lvl'), $cb_args); - } - $this->display_element( $child, $children_elements, $max_depth, $depth + 1, $args, $output ); - } - unset( $children_elements[ $id ] ); - } - - if ( isset($newlevel) && $newlevel ){ - //end the child delimiter - $cb_args = array_merge( array(&$output, $depth), $args); - call_user_func_array(array($this, 'end_lvl'), $cb_args); - } - - //end this element - $cb_args = array_merge( array(&$output, $element, $depth), $args); - call_user_func_array(array($this, 'end_el'), $cb_args); - } - - /** - * Display array of elements hierarchically. - * - * Does not assume any existing order of elements. - * - * $max_depth = -1 means flatly display every element. - * $max_depth = 0 means display all levels. - * $max_depth > 0 specifies the number of display levels. - * - * @since 2.1.0 - * - * @param array $elements An array of elements. - * @param int $max_depth The maximum hierarchical depth. - * @return string The hierarchical item output. - */ - public function walk( $elements, $max_depth ) { - $args = array_slice(func_get_args(), 2); - $output = ''; - - //invalid parameter or nothing to walk - if ( $max_depth < -1 || empty( $elements ) ) { - return $output; - } - - $parent_field = $this->db_fields['parent']; - - // flat display - if ( -1 == $max_depth ) { - $empty_array = array(); - foreach ( $elements as $e ) - $this->display_element( $e, $empty_array, 1, 0, $args, $output ); - return $output; - } - - /* - * Need to display in hierarchical order. - * Separate elements into two buckets: top level and children elements. - * Children_elements is two dimensional array, eg. - * Children_elements[10][] contains all sub-elements whose parent is 10. - */ - $top_level_elements = array(); - $children_elements = array(); - foreach ( $elements as $e) { - if ( empty( $e->$parent_field ) ) - $top_level_elements[] = $e; - else - $children_elements[ $e->$parent_field ][] = $e; - } - - /* - * When none of the elements is top level. - * Assume the first one must be root of the sub elements. - */ - if ( empty($top_level_elements) ) { - - $first = array_slice( $elements, 0, 1 ); - $root = $first[0]; - - $top_level_elements = array(); - $children_elements = array(); - foreach ( $elements as $e) { - if ( $root->$parent_field == $e->$parent_field ) - $top_level_elements[] = $e; - else - $children_elements[ $e->$parent_field ][] = $e; - } - } - - foreach ( $top_level_elements as $e ) - $this->display_element( $e, $children_elements, $max_depth, 0, $args, $output ); - - /* - * If we are displaying all levels, and remaining children_elements is not empty, - * then we got orphans, which should be displayed regardless. - */ - if ( ( $max_depth == 0 ) && count( $children_elements ) > 0 ) { - $empty_array = array(); - foreach ( $children_elements as $orphans ) - foreach ( $orphans as $op ) - $this->display_element( $op, $empty_array, 1, 0, $args, $output ); - } - - return $output; - } - - /** - * paged_walk() - produce a page of nested elements - * - * Given an array of hierarchical elements, the maximum depth, a specific page number, - * and number of elements per page, this function first determines all top level root elements - * belonging to that page, then lists them and all of their children in hierarchical order. - * - * $max_depth = 0 means display all levels. - * $max_depth > 0 specifies the number of display levels. - * - * @since 2.7.0 - * - * @param array $elements - * @param int $max_depth The maximum hierarchical depth. - * @param int $page_num The specific page number, beginning with 1. - * @param int $per_page - * @return string XHTML of the specified page of elements - */ - public function paged_walk( $elements, $max_depth, $page_num, $per_page ) { - if ( empty( $elements ) || $max_depth < -1 ) { - return ''; - } - - $args = array_slice( func_get_args(), 4 ); - $output = ''; - - $parent_field = $this->db_fields['parent']; - - $count = -1; - if ( -1 == $max_depth ) - $total_top = count( $elements ); - if ( $page_num < 1 || $per_page < 0 ) { - // No paging - $paging = false; - $start = 0; - if ( -1 == $max_depth ) - $end = $total_top; - $this->max_pages = 1; - } else { - $paging = true; - $start = ( (int)$page_num - 1 ) * (int)$per_page; - $end = $start + $per_page; - if ( -1 == $max_depth ) - $this->max_pages = ceil($total_top / $per_page); - } - - // flat display - if ( -1 == $max_depth ) { - if ( !empty($args[0]['reverse_top_level']) ) { - $elements = array_reverse( $elements ); - $oldstart = $start; - $start = $total_top - $end; - $end = $total_top - $oldstart; - } - - $empty_array = array(); - foreach ( $elements as $e ) { - $count++; - if ( $count < $start ) - continue; - if ( $count >= $end ) - break; - $this->display_element( $e, $empty_array, 1, 0, $args, $output ); - } - return $output; - } - - /* - * Separate elements into two buckets: top level and children elements. - * Children_elements is two dimensional array, e.g. - * $children_elements[10][] contains all sub-elements whose parent is 10. - */ - $top_level_elements = array(); - $children_elements = array(); - foreach ( $elements as $e) { - if ( 0 == $e->$parent_field ) - $top_level_elements[] = $e; - else - $children_elements[ $e->$parent_field ][] = $e; - } - - $total_top = count( $top_level_elements ); - if ( $paging ) - $this->max_pages = ceil($total_top / $per_page); - else - $end = $total_top; - - if ( !empty($args[0]['reverse_top_level']) ) { - $top_level_elements = array_reverse( $top_level_elements ); - $oldstart = $start; - $start = $total_top - $end; - $end = $total_top - $oldstart; - } - if ( !empty($args[0]['reverse_children']) ) { - foreach ( $children_elements as $parent => $children ) - $children_elements[$parent] = array_reverse( $children ); - } - - foreach ( $top_level_elements as $e ) { - $count++; - - // For the last page, need to unset earlier children in order to keep track of orphans. - if ( $end >= $total_top && $count < $start ) - $this->unset_children( $e, $children_elements ); - - if ( $count < $start ) - continue; - - if ( $count >= $end ) - break; - - $this->display_element( $e, $children_elements, $max_depth, 0, $args, $output ); - } - - if ( $end >= $total_top && count( $children_elements ) > 0 ) { - $empty_array = array(); - foreach ( $children_elements as $orphans ) - foreach ( $orphans as $op ) - $this->display_element( $op, $empty_array, 1, 0, $args, $output ); - } - - return $output; - } - - /** - * Calculates the total number of root elements. - * - * @since 2.7.0 - * @access public - * - * @param array $elements Elements to list. - * @return int Number of root elements. - */ - public function get_number_of_root_elements( $elements ){ - $num = 0; - $parent_field = $this->db_fields['parent']; - - foreach ( $elements as $e) { - if ( 0 == $e->$parent_field ) - $num++; - } - return $num; - } - - /** - * Unset all the children for a given top level element. - * - * @param object $e - * @param array $children_elements - */ - public function unset_children( $e, &$children_elements ){ - if ( ! $e || ! $children_elements ) { - return; - } - - $id_field = $this->db_fields['id']; - $id = $e->$id_field; - - if ( !empty($children_elements[$id]) && is_array($children_elements[$id]) ) - foreach ( (array) $children_elements[$id] as $child ) - $this->unset_children( $child, $children_elements ); - - unset( $children_elements[ $id ] ); - } - -} // Walker diff --git a/wp/wp-includes/class-wp-widget-factory.php b/wp/wp-includes/class-wp-widget-factory.php deleted file mode 100644 index 06162581..00000000 --- a/wp/wp-includes/class-wp-widget-factory.php +++ /dev/null @@ -1,152 +0,0 @@ -<?php -/** - * Widget API: WP_Widget_Factory class - * - * @package WordPress - * @subpackage Widgets - * @since 4.4.0 - */ - -/** - * Singleton that registers and instantiates WP_Widget classes. - * - * @since 2.8.0 - * @since 4.4.0 Moved to its own file from wp-includes/widgets.php - */ -class WP_Widget_Factory { - - /** - * Widgets array. - * - * @since 2.8.0 - * @access public - * @var array - */ - public $widgets = array(); - - /** - * PHP5 constructor. - * - * @since 4.3.0 - * @access public - */ - public function __construct() { - add_action( 'widgets_init', array( $this, '_register_widgets' ), 100 ); - } - - /** - * PHP4 constructor. - * - * @since 2.8.0 - * @access public - */ - public function WP_Widget_Factory() { - _deprecated_constructor( 'WP_Widget_Factory', '4.2.0' ); - self::__construct(); - } - - /** - * Memory for the number of times unique class instances have been hashed. - * - * This can be eliminated in favor of straight spl_object_hash() when 5.3 - * is the minimum requirement for PHP. - * - * @since 4.6.0 - * @access private - * @var array - * - * @see WP_Widget_Factory::hash_object() - */ - private $hashed_class_counts = array(); - - /** - * Hashes an object, doing fallback of `spl_object_hash()` if not available. - * - * This can be eliminated in favor of straight spl_object_hash() when 5.3 - * is the minimum requirement for PHP. - * - * @since 4.6.0 - * @access private - * - * @param WP_Widget $widget Widget. - * @return string Object hash. - */ - private function hash_object( $widget ) { - if ( function_exists( 'spl_object_hash' ) ) { - return spl_object_hash( $widget ); - } else { - $class_name = get_class( $widget ); - $hash = $class_name; - if ( ! isset( $widget->_wp_widget_factory_hash_id ) ) { - if ( ! isset( $this->hashed_class_counts[ $class_name ] ) ) { - $this->hashed_class_counts[ $class_name ] = 0; - } - $this->hashed_class_counts[ $class_name ] += 1; - $widget->_wp_widget_factory_hash_id = $this->hashed_class_counts[ $class_name ]; - } - $hash .= ':' . $widget->_wp_widget_factory_hash_id; - return $hash; - } - } - - /** - * Registers a widget subclass. - * - * @since 2.8.0 - * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object - * instead of simply a `WP_Widget` subclass name. - * @access public - * - * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass. - */ - public function register( $widget ) { - if ( $widget instanceof WP_Widget ) { - $this->widgets[ $this->hash_object( $widget ) ] = $widget; - } else { - $this->widgets[ $widget ] = new $widget(); - } - } - - /** - * Un-registers a widget subclass. - * - * @since 2.8.0 - * @since 4.6.0 Updated the `$widget` parameter to also accept a WP_Widget instance object - * instead of simply a `WP_Widget` subclass name. - * @access public - * - * @param string|WP_Widget $widget Either the name of a `WP_Widget` subclass or an instance of a `WP_Widget` subclass. - */ - public function unregister( $widget ) { - if ( $widget instanceof WP_Widget ) { - unset( $this->widgets[ $this->hash_object( $widget ) ] ); - } else { - unset( $this->widgets[ $widget ] ); - } - } - - /** - * Serves as a utility method for adding widgets to the registered widgets global. - * - * @since 2.8.0 - * @access public - * - * @global array $wp_registered_widgets - */ - public function _register_widgets() { - global $wp_registered_widgets; - $keys = array_keys($this->widgets); - $registered = array_keys($wp_registered_widgets); - $registered = array_map('_get_widget_id_base', $registered); - - foreach ( $keys as $key ) { - // don't register new widget if old widget with the same id is already registered - if ( in_array($this->widgets[$key]->id_base, $registered, true) ) { - unset($this->widgets[$key]); - continue; - } - - $this->widgets[$key]->_register(); - } - } -} diff --git a/wp/wp-includes/class-wp-widget.php b/wp/wp-includes/class-wp-widget.php deleted file mode 100644 index b69b219c..00000000 --- a/wp/wp-includes/class-wp-widget.php +++ /dev/null @@ -1,616 +0,0 @@ -<?php -/** - * Widget API: WP_Widget base class - * - * @package WordPress - * @subpackage Widgets - * @since 4.4.0 - */ - -/** - * Core base class extended to register widgets. - * - * This class must be extended for each widget, and WP_Widget::widget() must be overridden. - * - * If adding widget options, WP_Widget::update() and WP_Widget::form() should also be overridden. - * - * @since 2.8.0 - * @since 4.4.0 Moved to its own file from wp-includes/widgets.php - */ -class WP_Widget { - - /** - * Root ID for all widgets of this type. - * - * @since 2.8.0 - * @access public - * @var mixed|string - */ - public $id_base; - - /** - * Name for this widget type. - * - * @since 2.8.0 - * @access public - * @var string - */ - public $name; - - /** - * Option name for this widget type. - * - * @since 2.8.0 - * @access public - * @var string - */ - public $option_name; - - /** - * Alt option name for this widget type. - * - * @since 2.8.0 - * @access public - * @var string - */ - public $alt_option_name; - - /** - * Option array passed to wp_register_sidebar_widget(). - * - * @since 2.8.0 - * @access public - * @var array - */ - public $widget_options; - - /** - * Option array passed to wp_register_widget_control(). - * - * @since 2.8.0 - * @access public - * @var array - */ - public $control_options; - - /** - * Unique ID number of the current instance. - * - * @since 2.8.0 - * @access public - * @var bool|int - */ - public $number = false; - - /** - * Unique ID string of the current instance (id_base-number). - * - * @since 2.8.0 - * @access public - * @var bool|string - */ - public $id = false; - - /** - * Whether the widget data has been updated. - * - * Set to true when the data is updated after a POST submit - ensures it does - * not happen twice. - * - * @since 2.8.0 - * @access public - * @var bool - */ - public $updated = false; - - // - // Member functions that must be overridden by subclasses. - // - - /** - * Echoes the widget content. - * - * Sub-classes should over-ride this function to generate their widget code. - * - * @since 2.8.0 - * @access public - * - * @param array $args Display arguments including 'before_title', 'after_title', - * 'before_widget', and 'after_widget'. - * @param array $instance The settings for the particular instance of the widget. - */ - public function widget( $args, $instance ) { - die('function WP_Widget::widget() must be over-ridden in a sub-class.'); - } - - /** - * Updates a particular instance of a widget. - * - * This function should check that `$new_instance` is set correctly. The newly-calculated - * value of `$instance` should be returned. If false is returned, the instance won't be - * saved/updated. - * - * @since 2.8.0 - * @access public - * - * @param array $new_instance New settings for this instance as input by the user via - * WP_Widget::form(). - * @param array $old_instance Old settings for this instance. - * @return array Settings to save or bool false to cancel saving. - */ - public function update( $new_instance, $old_instance ) { - return $new_instance; - } - - /** - * Outputs the settings update form. - * - * @since 2.8.0 - * @access public - * - * @param array $instance Current settings. - * @return string Default return is 'noform'. - */ - public function form( $instance ) { - echo '<p class="no-options-widget">' . __('There are no options for this widget.') . '</p>'; - return 'noform'; - } - - // Functions you'll need to call. - - /** - * PHP5 constructor. - * - * @since 2.8.0 - * @access public - * - * @param string $id_base Optional Base ID for the widget, lowercase and unique. If left empty, - * a portion of the widget's class name will be used Has to be unique. - * @param string $name Name for the widget displayed on the configuration page. - * @param array $widget_options Optional. Widget options. See wp_register_sidebar_widget() for information - * on accepted arguments. Default empty array. - * @param array $control_options Optional. Widget control options. See wp_register_widget_control() for - * information on accepted arguments. Default empty array. - */ - public function __construct( $id_base, $name, $widget_options = array(), $control_options = array() ) { - $this->id_base = empty($id_base) ? preg_replace( '/(wp_)?widget_/', '', strtolower(get_class($this)) ) : strtolower($id_base); - $this->name = $name; - $this->option_name = 'widget_' . $this->id_base; - $this->widget_options = wp_parse_args( $widget_options, array( 'classname' => $this->option_name, 'customize_selective_refresh' => false ) ); - $this->control_options = wp_parse_args( $control_options, array( 'id_base' => $this->id_base ) ); - } - - /** - * PHP4 constructor. - * - * @since 2.8.0 - * @access public - * - * @see __construct() - * - * @param string $id_base Optional Base ID for the widget, lowercase and unique. If left empty, - * a portion of the widget's class name will be used Has to be unique. - * @param string $name Name for the widget displayed on the configuration page. - * @param array $widget_options Optional. Widget options. See wp_register_sidebar_widget() for information - * on accepted arguments. Default empty array. - * @param array $control_options Optional. Widget control options. See wp_register_widget_control() for - * information on accepted arguments. Default empty array. - */ - public function WP_Widget( $id_base, $name, $widget_options = array(), $control_options = array() ) { - _deprecated_constructor( 'WP_Widget', '4.3.0', get_class( $this ) ); - WP_Widget::__construct( $id_base, $name, $widget_options, $control_options ); - } - - /** - * Constructs name attributes for use in form() fields - * - * This function should be used in form() methods to create name attributes for fields - * to be saved by update() - * - * @since 2.8.0 - * @since 4.4.0 Array format field names are now accepted. - * @access public - * - * @param string $field_name Field name - * @return string Name attribute for $field_name - */ - public function get_field_name($field_name) { - if ( false === $pos = strpos( $field_name, '[' ) ) { - return 'widget-' . $this->id_base . '[' . $this->number . '][' . $field_name . ']'; - } else { - return 'widget-' . $this->id_base . '[' . $this->number . '][' . substr_replace( $field_name, '][', $pos, strlen( '[' ) ); - } - } - - /** - * Constructs id attributes for use in WP_Widget::form() fields. - * - * This function should be used in form() methods to create id attributes - * for fields to be saved by WP_Widget::update(). - * - * @since 2.8.0 - * @since 4.4.0 Array format field IDs are now accepted. - * @access public - * - * @param string $field_name Field name. - * @return string ID attribute for `$field_name`. - */ - public function get_field_id( $field_name ) { - return 'widget-' . $this->id_base . '-' . $this->number . '-' . trim( str_replace( array( '[]', '[', ']' ), array( '', '-', '' ), $field_name ), '-' ); - } - - /** - * Register all widget instances of this widget class. - * - * @since 2.8.0 - * @access public - */ - public function _register() { - $settings = $this->get_settings(); - $empty = true; - - // When $settings is an array-like object, get an intrinsic array for use with array_keys(). - if ( $settings instanceof ArrayObject || $settings instanceof ArrayIterator ) { - $settings = $settings->getArrayCopy(); - } - - if ( is_array( $settings ) ) { - foreach ( array_keys( $settings ) as $number ) { - if ( is_numeric( $number ) ) { - $this->_set( $number ); - $this->_register_one( $number ); - $empty = false; - } - } - } - - if ( $empty ) { - // If there are none, we register the widget's existence with a generic template. - $this->_set( 1 ); - $this->_register_one(); - } - } - - /** - * Sets the internal order number for the widget instance. - * - * @since 2.8.0 - * @access public - * - * @param int $number The unique order number of this widget instance compared to other - * instances of the same class. - */ - public function _set($number) { - $this->number = $number; - $this->id = $this->id_base . '-' . $number; - } - - /** - * Retrieves the widget display callback. - * - * @since 2.8.0 - * @access public - * - * @return callable Display callback. - */ - public function _get_display_callback() { - return array($this, 'display_callback'); - } - - /** - * Retrieves the widget update callback. - * - * @since 2.8.0 - * @access public - * - * @return callable Update callback. - */ - public function _get_update_callback() { - return array($this, 'update_callback'); - } - - /** - * Retrieves the form callback. - * - * @since 2.8.0 - * @access public - * - * @return callable Form callback. - */ - public function _get_form_callback() { - return array($this, 'form_callback'); - } - - /** - * Determines whether the current request is inside the Customizer preview. - * - * If true -- the current request is inside the Customizer preview, then - * the object cache gets suspended and widgets should check this to decide - * whether they should store anything persistently to the object cache, - * to transients, or anywhere else. - * - * @since 3.9.0 - * @access public - * - * @global WP_Customize_Manager $wp_customize - * - * @return bool True if within the Customizer preview, false if not. - */ - public function is_preview() { - global $wp_customize; - return ( isset( $wp_customize ) && $wp_customize->is_preview() ) ; - } - - /** - * Generates the actual widget content (Do NOT override). - * - * Finds the instance and calls WP_Widget::widget(). - * - * @since 2.8.0 - * @access public - * - * @param array $args Display arguments. See WP_Widget::widget() for information - * on accepted arguments. - * @param int|array $widget_args { - * Optional. Internal order number of the widget instance, or array of multi-widget arguments. - * Default 1. - * - * @type int $number Number increment used for multiples of the same widget. - * } - */ - public function display_callback( $args, $widget_args = 1 ) { - if ( is_numeric( $widget_args ) ) { - $widget_args = array( 'number' => $widget_args ); - } - - $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) ); - $this->_set( $widget_args['number'] ); - $instances = $this->get_settings(); - - if ( array_key_exists( $this->number, $instances ) ) { - $instance = $instances[ $this->number ]; - - /** - * Filters the settings for a particular widget instance. - * - * Returning false will effectively short-circuit display of the widget. - * - * @since 2.8.0 - * - * @param array $instance The current widget instance's settings. - * @param WP_Widget $this The current widget instance. - * @param array $args An array of default widget arguments. - */ - $instance = apply_filters( 'widget_display_callback', $instance, $this, $args ); - - if ( false === $instance ) { - return; - } - - $was_cache_addition_suspended = wp_suspend_cache_addition(); - if ( $this->is_preview() && ! $was_cache_addition_suspended ) { - wp_suspend_cache_addition( true ); - } - - $this->widget( $args, $instance ); - - if ( $this->is_preview() ) { - wp_suspend_cache_addition( $was_cache_addition_suspended ); - } - } - } - - /** - * Handles changed settings (Do NOT override). - * - * @since 2.8.0 - * @access public - * - * @global array $wp_registered_widgets - * - * @param int $deprecated Not used. - */ - public function update_callback( $deprecated = 1 ) { - global $wp_registered_widgets; - - $all_instances = $this->get_settings(); - - // We need to update the data - if ( $this->updated ) - return; - - if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) { - // Delete the settings for this instance of the widget - if ( isset($_POST['the-widget-id']) ) - $del_id = $_POST['the-widget-id']; - else - return; - - if ( isset($wp_registered_widgets[$del_id]['params'][0]['number']) ) { - $number = $wp_registered_widgets[$del_id]['params'][0]['number']; - - if ( $this->id_base . '-' . $number == $del_id ) - unset($all_instances[$number]); - } - } else { - if ( isset($_POST['widget-' . $this->id_base]) && is_array($_POST['widget-' . $this->id_base]) ) { - $settings = $_POST['widget-' . $this->id_base]; - } elseif ( isset($_POST['id_base']) && $_POST['id_base'] == $this->id_base ) { - $num = $_POST['multi_number'] ? (int) $_POST['multi_number'] : (int) $_POST['widget_number']; - $settings = array( $num => array() ); - } else { - return; - } - - foreach ( $settings as $number => $new_instance ) { - $new_instance = stripslashes_deep($new_instance); - $this->_set($number); - - $old_instance = isset($all_instances[$number]) ? $all_instances[$number] : array(); - - $was_cache_addition_suspended = wp_suspend_cache_addition(); - if ( $this->is_preview() && ! $was_cache_addition_suspended ) { - wp_suspend_cache_addition( true ); - } - - $instance = $this->update( $new_instance, $old_instance ); - - if ( $this->is_preview() ) { - wp_suspend_cache_addition( $was_cache_addition_suspended ); - } - - /** - * Filters a widget's settings before saving. - * - * Returning false will effectively short-circuit the widget's ability - * to update settings. - * - * @since 2.8.0 - * - * @param array $instance The current widget instance's settings. - * @param array $new_instance Array of new widget settings. - * @param array $old_instance Array of old widget settings. - * @param WP_Widget $this The current widget instance. - */ - $instance = apply_filters( 'widget_update_callback', $instance, $new_instance, $old_instance, $this ); - if ( false !== $instance ) { - $all_instances[$number] = $instance; - } - - break; // run only once - } - } - - $this->save_settings($all_instances); - $this->updated = true; - } - - /** - * Generates the widget control form (Do NOT override). - * - * @since 2.8.0 - * @access public - * - * @param int|array $widget_args { - * Optional. Internal order number of the widget instance, or array of multi-widget arguments. - * Default 1. - * - * @type int $number Number increment used for multiples of the same widget. - * } - * @return string|null - */ - public function form_callback( $widget_args = 1 ) { - if ( is_numeric($widget_args) ) - $widget_args = array( 'number' => $widget_args ); - - $widget_args = wp_parse_args( $widget_args, array( 'number' => -1 ) ); - $all_instances = $this->get_settings(); - - if ( -1 == $widget_args['number'] ) { - // We echo out a form where 'number' can be set later - $this->_set('__i__'); - $instance = array(); - } else { - $this->_set($widget_args['number']); - $instance = $all_instances[ $widget_args['number'] ]; - } - - /** - * Filters the widget instance's settings before displaying the control form. - * - * Returning false effectively short-circuits display of the control form. - * - * @since 2.8.0 - * - * @param array $instance The current widget instance's settings. - * @param WP_Widget $this The current widget instance. - */ - $instance = apply_filters( 'widget_form_callback', $instance, $this ); - - $return = null; - if ( false !== $instance ) { - $return = $this->form($instance); - - /** - * Fires at the end of the widget control form. - * - * Use this hook to add extra fields to the widget form. The hook - * is only fired if the value passed to the 'widget_form_callback' - * hook is not false. - * - * Note: If the widget has no form, the text echoed from the default - * form method can be hidden using CSS. - * - * @since 2.8.0 - * - * @param WP_Widget $this The widget instance, passed by reference. - * @param null $return Return null if new fields are added. - * @param array $instance An array of the widget's settings. - */ - do_action_ref_array( 'in_widget_form', array( &$this, &$return, $instance ) ); - } - return $return; - } - - /** - * Registers an instance of the widget class. - * - * @since 2.8.0 - * @access public - * - * @param integer $number Optional. The unique order number of this widget instance - * compared to other instances of the same class. Default -1. - */ - public function _register_one( $number = -1 ) { - wp_register_sidebar_widget( $this->id, $this->name, $this->_get_display_callback(), $this->widget_options, array( 'number' => $number ) ); - _register_widget_update_callback( $this->id_base, $this->_get_update_callback(), $this->control_options, array( 'number' => -1 ) ); - _register_widget_form_callback( $this->id, $this->name, $this->_get_form_callback(), $this->control_options, array( 'number' => $number ) ); - } - - /** - * Saves the settings for all instances of the widget class. - * - * @since 2.8.0 - * @access public - * - * @param array $settings Multi-dimensional array of widget instance settings. - */ - public function save_settings( $settings ) { - $settings['_multiwidget'] = 1; - update_option( $this->option_name, $settings ); - } - - /** - * Retrieves the settings for all instances of the widget class. - * - * @since 2.8.0 - * @access public - * - * @return array Multi-dimensional array of widget instance settings. - */ - public function get_settings() { - - $settings = get_option( $this->option_name ); - - if ( false === $settings ) { - if ( isset( $this->alt_option_name ) ) { - $settings = get_option( $this->alt_option_name ); - } else { - // Save an option so it can be autoloaded next time. - $this->save_settings( array() ); - } - } - - if ( ! is_array( $settings ) && ! ( $settings instanceof ArrayObject || $settings instanceof ArrayIterator ) ) { - $settings = array(); - } - - if ( ! empty( $settings ) && ! isset( $settings['_multiwidget'] ) ) { - // Old format, convert if single widget. - $settings = wp_convert_widget_settings( $this->id_base, $this->option_name, $settings ); - } - - unset( $settings['_multiwidget'], $settings['__i__'] ); - return $settings; - } -} diff --git a/wp/wp-includes/class-wp-xmlrpc-server.php b/wp/wp-includes/class-wp-xmlrpc-server.php deleted file mode 100644 index 5084da65..00000000 --- a/wp/wp-includes/class-wp-xmlrpc-server.php +++ /dev/null @@ -1,6489 +0,0 @@ -<?php -/** - * XML-RPC protocol support for WordPress - * - * @package WordPress - * @subpackage Publishing - */ - -/** - * WordPress XMLRPC server implementation. - * - * Implements compatibility for Blogger API, MetaWeblog API, MovableType, and - * pingback. Additional WordPress API for managing comments, pages, posts, - * options, etc. - * - * As of WordPress 3.5.0, XML-RPC is enabled by default. It can be disabled - * via the {@see 'xmlrpc_enabled'} filter found in wp_xmlrpc_server::login(). - * - * @package WordPress - * @subpackage Publishing - * @since 1.5.0 - */ -class wp_xmlrpc_server extends IXR_Server { - /** - * Methods. - * - * @access public - * @var array - */ - public $methods; - - /** - * Blog options. - * - * @access public - * @var array - */ - public $blog_options; - - /** - * IXR_Error instance. - * - * @access public - * @var IXR_Error - */ - public $error; - - /** - * Flags that the user authentication has failed in this instance of wp_xmlrpc_server. - * - * @access protected - * @var bool - */ - protected $auth_failed = false; - - /** - * Registers all of the XMLRPC methods that XMLRPC server understands. - * - * Sets up server and method property. Passes XMLRPC - * methods through the {@see 'xmlrpc_methods'} filter to allow plugins to extend - * or replace XML-RPC methods. - * - * @since 1.5.0 - */ - public function __construct() { - $this->methods = array( - // WordPress API - 'wp.getUsersBlogs' => 'this:wp_getUsersBlogs', - 'wp.newPost' => 'this:wp_newPost', - 'wp.editPost' => 'this:wp_editPost', - 'wp.deletePost' => 'this:wp_deletePost', - 'wp.getPost' => 'this:wp_getPost', - 'wp.getPosts' => 'this:wp_getPosts', - 'wp.newTerm' => 'this:wp_newTerm', - 'wp.editTerm' => 'this:wp_editTerm', - 'wp.deleteTerm' => 'this:wp_deleteTerm', - 'wp.getTerm' => 'this:wp_getTerm', - 'wp.getTerms' => 'this:wp_getTerms', - 'wp.getTaxonomy' => 'this:wp_getTaxonomy', - 'wp.getTaxonomies' => 'this:wp_getTaxonomies', - 'wp.getUser' => 'this:wp_getUser', - 'wp.getUsers' => 'this:wp_getUsers', - 'wp.getProfile' => 'this:wp_getProfile', - 'wp.editProfile' => 'this:wp_editProfile', - 'wp.getPage' => 'this:wp_getPage', - 'wp.getPages' => 'this:wp_getPages', - 'wp.newPage' => 'this:wp_newPage', - 'wp.deletePage' => 'this:wp_deletePage', - 'wp.editPage' => 'this:wp_editPage', - 'wp.getPageList' => 'this:wp_getPageList', - 'wp.getAuthors' => 'this:wp_getAuthors', - 'wp.getCategories' => 'this:mw_getCategories', // Alias - 'wp.getTags' => 'this:wp_getTags', - 'wp.newCategory' => 'this:wp_newCategory', - 'wp.deleteCategory' => 'this:wp_deleteCategory', - 'wp.suggestCategories' => 'this:wp_suggestCategories', - 'wp.uploadFile' => 'this:mw_newMediaObject', // Alias - 'wp.deleteFile' => 'this:wp_deletePost', // Alias - 'wp.getCommentCount' => 'this:wp_getCommentCount', - 'wp.getPostStatusList' => 'this:wp_getPostStatusList', - 'wp.getPageStatusList' => 'this:wp_getPageStatusList', - 'wp.getPageTemplates' => 'this:wp_getPageTemplates', - 'wp.getOptions' => 'this:wp_getOptions', - 'wp.setOptions' => 'this:wp_setOptions', - 'wp.getComment' => 'this:wp_getComment', - 'wp.getComments' => 'this:wp_getComments', - 'wp.deleteComment' => 'this:wp_deleteComment', - 'wp.editComment' => 'this:wp_editComment', - 'wp.newComment' => 'this:wp_newComment', - 'wp.getCommentStatusList' => 'this:wp_getCommentStatusList', - 'wp.getMediaItem' => 'this:wp_getMediaItem', - 'wp.getMediaLibrary' => 'this:wp_getMediaLibrary', - 'wp.getPostFormats' => 'this:wp_getPostFormats', - 'wp.getPostType' => 'this:wp_getPostType', - 'wp.getPostTypes' => 'this:wp_getPostTypes', - 'wp.getRevisions' => 'this:wp_getRevisions', - 'wp.restoreRevision' => 'this:wp_restoreRevision', - - // Blogger API - 'blogger.getUsersBlogs' => 'this:blogger_getUsersBlogs', - 'blogger.getUserInfo' => 'this:blogger_getUserInfo', - 'blogger.getPost' => 'this:blogger_getPost', - 'blogger.getRecentPosts' => 'this:blogger_getRecentPosts', - 'blogger.newPost' => 'this:blogger_newPost', - 'blogger.editPost' => 'this:blogger_editPost', - 'blogger.deletePost' => 'this:blogger_deletePost', - - // MetaWeblog API (with MT extensions to structs) - 'metaWeblog.newPost' => 'this:mw_newPost', - 'metaWeblog.editPost' => 'this:mw_editPost', - 'metaWeblog.getPost' => 'this:mw_getPost', - 'metaWeblog.getRecentPosts' => 'this:mw_getRecentPosts', - 'metaWeblog.getCategories' => 'this:mw_getCategories', - 'metaWeblog.newMediaObject' => 'this:mw_newMediaObject', - - // MetaWeblog API aliases for Blogger API - // see http://www.xmlrpc.com/stories/storyReader$2460 - 'metaWeblog.deletePost' => 'this:blogger_deletePost', - 'metaWeblog.getUsersBlogs' => 'this:blogger_getUsersBlogs', - - // MovableType API - 'mt.getCategoryList' => 'this:mt_getCategoryList', - 'mt.getRecentPostTitles' => 'this:mt_getRecentPostTitles', - 'mt.getPostCategories' => 'this:mt_getPostCategories', - 'mt.setPostCategories' => 'this:mt_setPostCategories', - 'mt.supportedMethods' => 'this:mt_supportedMethods', - 'mt.supportedTextFilters' => 'this:mt_supportedTextFilters', - 'mt.getTrackbackPings' => 'this:mt_getTrackbackPings', - 'mt.publishPost' => 'this:mt_publishPost', - - // PingBack - 'pingback.ping' => 'this:pingback_ping', - 'pingback.extensions.getPingbacks' => 'this:pingback_extensions_getPingbacks', - - 'demo.sayHello' => 'this:sayHello', - 'demo.addTwoNumbers' => 'this:addTwoNumbers' - ); - - $this->initialise_blog_option_info(); - - /** - * Filters the methods exposed by the XML-RPC server. - * - * This filter can be used to add new methods, and remove built-in methods. - * - * @since 1.5.0 - * - * @param array $methods An array of XML-RPC methods. - */ - $this->methods = apply_filters( 'xmlrpc_methods', $this->methods ); - } - - /** - * Make private/protected methods readable for backward compatibility. - * - * @since 4.0.0 - * @access public - * - * @param callable $name Method to call. - * @param array $arguments Arguments to pass when calling. - * @return array|IXR_Error|false Return value of the callback, false otherwise. - */ - public function __call( $name, $arguments ) { - if ( '_multisite_getUsersBlogs' === $name ) { - return call_user_func_array( array( $this, $name ), $arguments ); - } - return false; - } - - /** - * Serves the XML-RPC request. - * - * @since 2.9.0 - * @access public - */ - public function serve_request() { - $this->IXR_Server($this->methods); - } - - /** - * Test XMLRPC API by saying, "Hello!" to client. - * - * @since 1.5.0 - * - * @return string Hello string response. - */ - public function sayHello() { - return 'Hello!'; - } - - /** - * Test XMLRPC API by adding two numbers for client. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $number1 A number to add. - * @type int $number2 A second number to add. - * } - * @return int Sum of the two given numbers. - */ - public function addTwoNumbers( $args ) { - $number1 = $args[0]; - $number2 = $args[1]; - return $number1 + $number2; - } - - /** - * Log user in. - * - * @since 2.8.0 - * - * @param string $username User's username. - * @param string $password User's password. - * @return WP_User|bool WP_User object if authentication passed, false otherwise - */ - public function login( $username, $password ) { - /* - * Respect old get_option() filters left for back-compat when the 'enable_xmlrpc' - * option was deprecated in 3.5.0. Use the 'xmlrpc_enabled' hook instead. - */ - $enabled = apply_filters( 'pre_option_enable_xmlrpc', false ); - if ( false === $enabled ) { - $enabled = apply_filters( 'option_enable_xmlrpc', true ); - } - - /** - * Filters whether XML-RPC methods requiring authentication are enabled. - * - * Contrary to the way it's named, this filter does not control whether XML-RPC is *fully* - * enabled, rather, it only controls whether XML-RPC methods requiring authentication - such - * as for publishing purposes - are enabled. - * - * Further, the filter does not control whether pingbacks or other custom endpoints that don't - * require authentication are enabled. This behavior is expected, and due to how parity was matched - * with the `enable_xmlrpc` UI option the filter replaced when it was introduced in 3.5. - * - * To disable XML-RPC methods that require authentication, use: - * - * add_filter( 'xmlrpc_enabled', '__return_false' ); - * - * For more granular control over all XML-RPC methods and requests, see the {@see 'xmlrpc_methods'} - * and {@see 'xmlrpc_element_limit'} hooks. - * - * @since 3.5.0 - * - * @param bool $enabled Whether XML-RPC is enabled. Default true. - */ - $enabled = apply_filters( 'xmlrpc_enabled', $enabled ); - - if ( ! $enabled ) { - $this->error = new IXR_Error( 405, sprintf( __( 'XML-RPC services are disabled on this site.' ) ) ); - return false; - } - - if ( $this->auth_failed ) { - $user = new WP_Error( 'login_prevented' ); - } else { - $user = wp_authenticate( $username, $password ); - } - - if ( is_wp_error( $user ) ) { - $this->error = new IXR_Error( 403, __( 'Incorrect username or password.' ) ); - - // Flag that authentication has failed once on this wp_xmlrpc_server instance - $this->auth_failed = true; - - /** - * Filters the XML-RPC user login error message. - * - * @since 3.5.0 - * - * @param string $error The XML-RPC error message. - * @param WP_User $user WP_User object. - */ - $this->error = apply_filters( 'xmlrpc_login_error', $this->error, $user ); - return false; - } - - wp_set_current_user( $user->ID ); - return $user; - } - - /** - * Check user's credentials. Deprecated. - * - * @since 1.5.0 - * @deprecated 2.8.0 Use wp_xmlrpc_server::login() - * @see wp_xmlrpc_server::login() - * - * @param string $username User's username. - * @param string $password User's password. - * @return bool Whether authentication passed. - */ - public function login_pass_ok( $username, $password ) { - return (bool) $this->login( $username, $password ); - } - - /** - * Escape string or array of strings for database. - * - * @since 1.5.2 - * - * @param string|array $data Escape single string or array of strings. - * @return string|void Returns with string is passed, alters by-reference - * when array is passed. - */ - public function escape( &$data ) { - if ( ! is_array( $data ) ) - return wp_slash( $data ); - - foreach ( $data as &$v ) { - if ( is_array( $v ) ) - $this->escape( $v ); - elseif ( ! is_object( $v ) ) - $v = wp_slash( $v ); - } - } - - /** - * Retrieve custom fields for post. - * - * @since 2.5.0 - * - * @param int $post_id Post ID. - * @return array Custom fields, if exist. - */ - public function get_custom_fields($post_id) { - $post_id = (int) $post_id; - - $custom_fields = array(); - - foreach ( (array) has_meta($post_id) as $meta ) { - // Don't expose protected fields. - if ( ! current_user_can( 'edit_post_meta', $post_id , $meta['meta_key'] ) ) - continue; - - $custom_fields[] = array( - "id" => $meta['meta_id'], - "key" => $meta['meta_key'], - "value" => $meta['meta_value'] - ); - } - - return $custom_fields; - } - - /** - * Set custom fields for post. - * - * @since 2.5.0 - * - * @param int $post_id Post ID. - * @param array $fields Custom fields. - */ - public function set_custom_fields($post_id, $fields) { - $post_id = (int) $post_id; - - foreach ( (array) $fields as $meta ) { - if ( isset($meta['id']) ) { - $meta['id'] = (int) $meta['id']; - $pmeta = get_metadata_by_mid( 'post', $meta['id'] ); - if ( isset($meta['key']) ) { - $meta['key'] = wp_unslash( $meta['key'] ); - if ( $meta['key'] !== $pmeta->meta_key ) - continue; - $meta['value'] = wp_unslash( $meta['value'] ); - if ( current_user_can( 'edit_post_meta', $post_id, $meta['key'] ) ) - update_metadata_by_mid( 'post', $meta['id'], $meta['value'] ); - } elseif ( current_user_can( 'delete_post_meta', $post_id, $pmeta->meta_key ) ) { - delete_metadata_by_mid( 'post', $meta['id'] ); - } - } elseif ( current_user_can( 'add_post_meta', $post_id, wp_unslash( $meta['key'] ) ) ) { - add_post_meta( $post_id, $meta['key'], $meta['value'] ); - } - } - } - - /** - * Set up blog options property. - * - * Passes property through {@see 'xmlrpc_blog_options'} filter. - * - * @since 2.6.0 - */ - public function initialise_blog_option_info() { - $this->blog_options = array( - // Read only options - 'software_name' => array( - 'desc' => __( 'Software Name' ), - 'readonly' => true, - 'value' => 'WordPress' - ), - 'software_version' => array( - 'desc' => __( 'Software Version' ), - 'readonly' => true, - 'value' => get_bloginfo( 'version' ) - ), - 'blog_url' => array( - 'desc' => __( 'WordPress Address (URL)' ), - 'readonly' => true, - 'option' => 'siteurl' - ), - 'home_url' => array( - 'desc' => __( 'Site Address (URL)' ), - 'readonly' => true, - 'option' => 'home' - ), - 'login_url' => array( - 'desc' => __( 'Login Address (URL)' ), - 'readonly' => true, - 'value' => wp_login_url( ) - ), - 'admin_url' => array( - 'desc' => __( 'The URL to the admin area' ), - 'readonly' => true, - 'value' => get_admin_url( ) - ), - 'image_default_link_type' => array( - 'desc' => __( 'Image default link type' ), - 'readonly' => true, - 'option' => 'image_default_link_type' - ), - 'image_default_size' => array( - 'desc' => __( 'Image default size' ), - 'readonly' => true, - 'option' => 'image_default_size' - ), - 'image_default_align' => array( - 'desc' => __( 'Image default align' ), - 'readonly' => true, - 'option' => 'image_default_align' - ), - 'template' => array( - 'desc' => __( 'Template' ), - 'readonly' => true, - 'option' => 'template' - ), - 'stylesheet' => array( - 'desc' => __( 'Stylesheet' ), - 'readonly' => true, - 'option' => 'stylesheet' - ), - 'post_thumbnail' => array( - 'desc' => __('Post Thumbnail'), - 'readonly' => true, - 'value' => current_theme_supports( 'post-thumbnails' ) - ), - - // Updatable options - 'time_zone' => array( - 'desc' => __( 'Time Zone' ), - 'readonly' => false, - 'option' => 'gmt_offset' - ), - 'blog_title' => array( - 'desc' => __( 'Site Title' ), - 'readonly' => false, - 'option' => 'blogname' - ), - 'blog_tagline' => array( - 'desc' => __( 'Site Tagline' ), - 'readonly' => false, - 'option' => 'blogdescription' - ), - 'date_format' => array( - 'desc' => __( 'Date Format' ), - 'readonly' => false, - 'option' => 'date_format' - ), - 'time_format' => array( - 'desc' => __( 'Time Format' ), - 'readonly' => false, - 'option' => 'time_format' - ), - 'users_can_register' => array( - 'desc' => __( 'Allow new users to sign up' ), - 'readonly' => false, - 'option' => 'users_can_register' - ), - 'thumbnail_size_w' => array( - 'desc' => __( 'Thumbnail Width' ), - 'readonly' => false, - 'option' => 'thumbnail_size_w' - ), - 'thumbnail_size_h' => array( - 'desc' => __( 'Thumbnail Height' ), - 'readonly' => false, - 'option' => 'thumbnail_size_h' - ), - 'thumbnail_crop' => array( - 'desc' => __( 'Crop thumbnail to exact dimensions' ), - 'readonly' => false, - 'option' => 'thumbnail_crop' - ), - 'medium_size_w' => array( - 'desc' => __( 'Medium size image width' ), - 'readonly' => false, - 'option' => 'medium_size_w' - ), - 'medium_size_h' => array( - 'desc' => __( 'Medium size image height' ), - 'readonly' => false, - 'option' => 'medium_size_h' - ), - 'medium_large_size_w' => array( - 'desc' => __( 'Medium-Large size image width' ), - 'readonly' => false, - 'option' => 'medium_large_size_w' - ), - 'medium_large_size_h' => array( - 'desc' => __( 'Medium-Large size image height' ), - 'readonly' => false, - 'option' => 'medium_large_size_h' - ), - 'large_size_w' => array( - 'desc' => __( 'Large size image width' ), - 'readonly' => false, - 'option' => 'large_size_w' - ), - 'large_size_h' => array( - 'desc' => __( 'Large size image height' ), - 'readonly' => false, - 'option' => 'large_size_h' - ), - 'default_comment_status' => array( - 'desc' => __( 'Allow people to post comments on new articles' ), - 'readonly' => false, - 'option' => 'default_comment_status' - ), - 'default_ping_status' => array( - 'desc' => __( 'Allow link notifications from other blogs (pingbacks and trackbacks) on new articles' ), - 'readonly' => false, - 'option' => 'default_ping_status' - ) - ); - - /** - * Filters the XML-RPC blog options property. - * - * @since 2.6.0 - * - * @param array $blog_options An array of XML-RPC blog options. - */ - $this->blog_options = apply_filters( 'xmlrpc_blog_options', $this->blog_options ); - } - - /** - * Retrieve the blogs of the user. - * - * @since 2.6.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type string $username Username. - * @type string $password Password. - * } - * @return array|IXR_Error Array contains: - * - 'isAdmin' - * - 'isPrimary' - whether the blog is the user's primary blog - * - 'url' - * - 'blogid' - * - 'blogName' - * - 'xmlrpc' - url of xmlrpc endpoint - */ - public function wp_getUsersBlogs( $args ) { - if ( ! $this->minimum_args( $args, 2 ) ) { - return $this->error; - } - - // If this isn't on WPMU then just use blogger_getUsersBlogs - if ( !is_multisite() ) { - array_unshift( $args, 1 ); - return $this->blogger_getUsersBlogs( $args ); - } - - $this->escape( $args ); - - $username = $args[0]; - $password = $args[1]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - /** - * Fires after the XML-RPC user has been authenticated but before the rest of - * the method logic begins. - * - * All built-in XML-RPC methods use the action xmlrpc_call, with a parameter - * equal to the method's name, e.g., wp.getUsersBlogs, wp.newPost, etc. - * - * @since 2.5.0 - * - * @param string $name The method name. - */ - do_action( 'xmlrpc_call', 'wp.getUsersBlogs' ); - - $blogs = (array) get_blogs_of_user( $user->ID ); - $struct = array(); - $primary_blog_id = 0; - $active_blog = get_active_blog_for_user( $user->ID ); - if ( $active_blog ) { - $primary_blog_id = (int) $active_blog->blog_id; - } - - foreach ( $blogs as $blog ) { - // Don't include blogs that aren't hosted at this site. - if ( $blog->site_id != get_current_network_id() ) - continue; - - $blog_id = $blog->userblog_id; - - switch_to_blog( $blog_id ); - - $is_admin = current_user_can( 'manage_options' ); - $is_primary = ( (int) $blog_id === $primary_blog_id ); - - $struct[] = array( - 'isAdmin' => $is_admin, - 'isPrimary' => $is_primary, - 'url' => home_url( '/' ), - 'blogid' => (string) $blog_id, - 'blogName' => get_option( 'blogname' ), - 'xmlrpc' => site_url( 'xmlrpc.php', 'rpc' ), - ); - - restore_current_blog(); - } - - return $struct; - } - - /** - * Checks if the method received at least the minimum number of arguments. - * - * @since 3.4.0 - * @access protected - * - * @param string|array $args Sanitize single string or array of strings. - * @param int $count Minimum number of arguments. - * @return bool if `$args` contains at least $count arguments. - */ - protected function minimum_args( $args, $count ) { - if ( count( $args ) < $count ) { - $this->error = new IXR_Error( 400, __( 'Insufficient arguments passed to this XML-RPC method.' ) ); - return false; - } - - return true; - } - - /** - * Prepares taxonomy data for return in an XML-RPC object. - * - * @access protected - * - * @param object $taxonomy The unprepared taxonomy data. - * @param array $fields The subset of taxonomy fields to return. - * @return array The prepared taxonomy data. - */ - protected function _prepare_taxonomy( $taxonomy, $fields ) { - $_taxonomy = array( - 'name' => $taxonomy->name, - 'label' => $taxonomy->label, - 'hierarchical' => (bool) $taxonomy->hierarchical, - 'public' => (bool) $taxonomy->public, - 'show_ui' => (bool) $taxonomy->show_ui, - '_builtin' => (bool) $taxonomy->_builtin, - ); - - if ( in_array( 'labels', $fields ) ) - $_taxonomy['labels'] = (array) $taxonomy->labels; - - if ( in_array( 'cap', $fields ) ) - $_taxonomy['cap'] = (array) $taxonomy->cap; - - if ( in_array( 'menu', $fields ) ) - $_taxonomy['show_in_menu'] = (bool) $_taxonomy->show_in_menu; - - if ( in_array( 'object_type', $fields ) ) - $_taxonomy['object_type'] = array_unique( (array) $taxonomy->object_type ); - - /** - * Filters XML-RPC-prepared data for the given taxonomy. - * - * @since 3.4.0 - * - * @param array $_taxonomy An array of taxonomy data. - * @param WP_Taxonomy $taxonomy Taxonomy object. - * @param array $fields The subset of taxonomy fields to return. - */ - return apply_filters( 'xmlrpc_prepare_taxonomy', $_taxonomy, $taxonomy, $fields ); - } - - /** - * Prepares term data for return in an XML-RPC object. - * - * @access protected - * - * @param array|object $term The unprepared term data. - * @return array The prepared term data. - */ - protected function _prepare_term( $term ) { - $_term = $term; - if ( ! is_array( $_term ) ) - $_term = get_object_vars( $_term ); - - // For integers which may be larger than XML-RPC supports ensure we return strings. - $_term['term_id'] = strval( $_term['term_id'] ); - $_term['term_group'] = strval( $_term['term_group'] ); - $_term['term_taxonomy_id'] = strval( $_term['term_taxonomy_id'] ); - $_term['parent'] = strval( $_term['parent'] ); - - // Count we are happy to return as an integer because people really shouldn't use terms that much. - $_term['count'] = intval( $_term['count'] ); - - /** - * Filters XML-RPC-prepared data for the given term. - * - * @since 3.4.0 - * - * @param array $_term An array of term data. - * @param array|object $term Term object or array. - */ - return apply_filters( 'xmlrpc_prepare_term', $_term, $term ); - } - - /** - * Convert a WordPress date string to an IXR_Date object. - * - * @access protected - * - * @param string $date Date string to convert. - * @return IXR_Date IXR_Date object. - */ - protected function _convert_date( $date ) { - if ( $date === '0000-00-00 00:00:00' ) { - return new IXR_Date( '00000000T00:00:00Z' ); - } - return new IXR_Date( mysql2date( 'Ymd\TH:i:s', $date, false ) ); - } - - /** - * Convert a WordPress GMT date string to an IXR_Date object. - * - * @access protected - * - * @param string $date_gmt WordPress GMT date string. - * @param string $date Date string. - * @return IXR_Date IXR_Date object. - */ - protected function _convert_date_gmt( $date_gmt, $date ) { - if ( $date !== '0000-00-00 00:00:00' && $date_gmt === '0000-00-00 00:00:00' ) { - return new IXR_Date( get_gmt_from_date( mysql2date( 'Y-m-d H:i:s', $date, false ), 'Ymd\TH:i:s' ) ); - } - return $this->_convert_date( $date_gmt ); - } - - /** - * Prepares post data for return in an XML-RPC object. - * - * @access protected - * - * @param array $post The unprepared post data. - * @param array $fields The subset of post type fields to return. - * @return array The prepared post data. - */ - protected function _prepare_post( $post, $fields ) { - // Holds the data for this post. built up based on $fields. - $_post = array( 'post_id' => strval( $post['ID'] ) ); - - // Prepare common post fields. - $post_fields = array( - 'post_title' => $post['post_title'], - 'post_date' => $this->_convert_date( $post['post_date'] ), - 'post_date_gmt' => $this->_convert_date_gmt( $post['post_date_gmt'], $post['post_date'] ), - 'post_modified' => $this->_convert_date( $post['post_modified'] ), - 'post_modified_gmt' => $this->_convert_date_gmt( $post['post_modified_gmt'], $post['post_modified'] ), - 'post_status' => $post['post_status'], - 'post_type' => $post['post_type'], - 'post_name' => $post['post_name'], - 'post_author' => $post['post_author'], - 'post_password' => $post['post_password'], - 'post_excerpt' => $post['post_excerpt'], - 'post_content' => $post['post_content'], - 'post_parent' => strval( $post['post_parent'] ), - 'post_mime_type' => $post['post_mime_type'], - 'link' => get_permalink( $post['ID'] ), - 'guid' => $post['guid'], - 'menu_order' => intval( $post['menu_order'] ), - 'comment_status' => $post['comment_status'], - 'ping_status' => $post['ping_status'], - 'sticky' => ( $post['post_type'] === 'post' && is_sticky( $post['ID'] ) ), - ); - - // Thumbnail. - $post_fields['post_thumbnail'] = array(); - $thumbnail_id = get_post_thumbnail_id( $post['ID'] ); - if ( $thumbnail_id ) { - $thumbnail_size = current_theme_supports('post-thumbnail') ? 'post-thumbnail' : 'thumbnail'; - $post_fields['post_thumbnail'] = $this->_prepare_media_item( get_post( $thumbnail_id ), $thumbnail_size ); - } - - // Consider future posts as published. - if ( $post_fields['post_status'] === 'future' ) - $post_fields['post_status'] = 'publish'; - - // Fill in blank post format. - $post_fields['post_format'] = get_post_format( $post['ID'] ); - if ( empty( $post_fields['post_format'] ) ) - $post_fields['post_format'] = 'standard'; - - // Merge requested $post_fields fields into $_post. - if ( in_array( 'post', $fields ) ) { - $_post = array_merge( $_post, $post_fields ); - } else { - $requested_fields = array_intersect_key( $post_fields, array_flip( $fields ) ); - $_post = array_merge( $_post, $requested_fields ); - } - - $all_taxonomy_fields = in_array( 'taxonomies', $fields ); - - if ( $all_taxonomy_fields || in_array( 'terms', $fields ) ) { - $post_type_taxonomies = get_object_taxonomies( $post['post_type'], 'names' ); - $terms = wp_get_object_terms( $post['ID'], $post_type_taxonomies ); - $_post['terms'] = array(); - foreach ( $terms as $term ) { - $_post['terms'][] = $this->_prepare_term( $term ); - } - } - - if ( in_array( 'custom_fields', $fields ) ) - $_post['custom_fields'] = $this->get_custom_fields( $post['ID'] ); - - if ( in_array( 'enclosure', $fields ) ) { - $_post['enclosure'] = array(); - $enclosures = (array) get_post_meta( $post['ID'], 'enclosure' ); - if ( ! empty( $enclosures ) ) { - $encdata = explode( "\n", $enclosures[0] ); - $_post['enclosure']['url'] = trim( htmlspecialchars( $encdata[0] ) ); - $_post['enclosure']['length'] = (int) trim( $encdata[1] ); - $_post['enclosure']['type'] = trim( $encdata[2] ); - } - } - - /** - * Filters XML-RPC-prepared date for the given post. - * - * @since 3.4.0 - * - * @param array $_post An array of modified post data. - * @param array $post An array of post data. - * @param array $fields An array of post fields. - */ - return apply_filters( 'xmlrpc_prepare_post', $_post, $post, $fields ); - } - - /** - * Prepares post data for return in an XML-RPC object. - * - * @since 3.4.0 - * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object. - * @access protected - * - * @param WP_Post_Type $post_type Post type object. - * @param array $fields The subset of post fields to return. - * @return array The prepared post type data. - */ - protected function _prepare_post_type( $post_type, $fields ) { - $_post_type = array( - 'name' => $post_type->name, - 'label' => $post_type->label, - 'hierarchical' => (bool) $post_type->hierarchical, - 'public' => (bool) $post_type->public, - 'show_ui' => (bool) $post_type->show_ui, - '_builtin' => (bool) $post_type->_builtin, - 'has_archive' => (bool) $post_type->has_archive, - 'supports' => get_all_post_type_supports( $post_type->name ), - ); - - if ( in_array( 'labels', $fields ) ) { - $_post_type['labels'] = (array) $post_type->labels; - } - - if ( in_array( 'cap', $fields ) ) { - $_post_type['cap'] = (array) $post_type->cap; - $_post_type['map_meta_cap'] = (bool) $post_type->map_meta_cap; - } - - if ( in_array( 'menu', $fields ) ) { - $_post_type['menu_position'] = (int) $post_type->menu_position; - $_post_type['menu_icon'] = $post_type->menu_icon; - $_post_type['show_in_menu'] = (bool) $post_type->show_in_menu; - } - - if ( in_array( 'taxonomies', $fields ) ) - $_post_type['taxonomies'] = get_object_taxonomies( $post_type->name, 'names' ); - - /** - * Filters XML-RPC-prepared date for the given post type. - * - * @since 3.4.0 - * @since 4.6.0 Converted the `$post_type` parameter to accept a WP_Post_Type object. - * - * @param array $_post_type An array of post type data. - * @param WP_Post_Type $post_type Post type object. - */ - return apply_filters( 'xmlrpc_prepare_post_type', $_post_type, $post_type ); - } - - /** - * Prepares media item data for return in an XML-RPC object. - * - * @access protected - * - * @param object $media_item The unprepared media item data. - * @param string $thumbnail_size The image size to use for the thumbnail URL. - * @return array The prepared media item data. - */ - protected function _prepare_media_item( $media_item, $thumbnail_size = 'thumbnail' ) { - $_media_item = array( - 'attachment_id' => strval( $media_item->ID ), - 'date_created_gmt' => $this->_convert_date_gmt( $media_item->post_date_gmt, $media_item->post_date ), - 'parent' => $media_item->post_parent, - 'link' => wp_get_attachment_url( $media_item->ID ), - 'title' => $media_item->post_title, - 'caption' => $media_item->post_excerpt, - 'description' => $media_item->post_content, - 'metadata' => wp_get_attachment_metadata( $media_item->ID ), - 'type' => $media_item->post_mime_type - ); - - $thumbnail_src = image_downsize( $media_item->ID, $thumbnail_size ); - if ( $thumbnail_src ) - $_media_item['thumbnail'] = $thumbnail_src[0]; - else - $_media_item['thumbnail'] = $_media_item['link']; - - /** - * Filters XML-RPC-prepared data for the given media item. - * - * @since 3.4.0 - * - * @param array $_media_item An array of media item data. - * @param object $media_item Media item object. - * @param string $thumbnail_size Image size. - */ - return apply_filters( 'xmlrpc_prepare_media_item', $_media_item, $media_item, $thumbnail_size ); - } - - /** - * Prepares page data for return in an XML-RPC object. - * - * @access protected - * - * @param object $page The unprepared page data. - * @return array The prepared page data. - */ - protected function _prepare_page( $page ) { - // Get all of the page content and link. - $full_page = get_extended( $page->post_content ); - $link = get_permalink( $page->ID ); - - // Get info the page parent if there is one. - $parent_title = ""; - if ( ! empty( $page->post_parent ) ) { - $parent = get_post( $page->post_parent ); - $parent_title = $parent->post_title; - } - - // Determine comment and ping settings. - $allow_comments = comments_open( $page->ID ) ? 1 : 0; - $allow_pings = pings_open( $page->ID ) ? 1 : 0; - - // Format page date. - $page_date = $this->_convert_date( $page->post_date ); - $page_date_gmt = $this->_convert_date_gmt( $page->post_date_gmt, $page->post_date ); - - // Pull the categories info together. - $categories = array(); - if ( is_object_in_taxonomy( 'page', 'category' ) ) { - foreach ( wp_get_post_categories( $page->ID ) as $cat_id ) { - $categories[] = get_cat_name( $cat_id ); - } - } - - // Get the author info. - $author = get_userdata( $page->post_author ); - - $page_template = get_page_template_slug( $page->ID ); - if ( empty( $page_template ) ) - $page_template = 'default'; - - $_page = array( - 'dateCreated' => $page_date, - 'userid' => $page->post_author, - 'page_id' => $page->ID, - 'page_status' => $page->post_status, - 'description' => $full_page['main'], - 'title' => $page->post_title, - 'link' => $link, - 'permaLink' => $link, - 'categories' => $categories, - 'excerpt' => $page->post_excerpt, - 'text_more' => $full_page['extended'], - 'mt_allow_comments' => $allow_comments, - 'mt_allow_pings' => $allow_pings, - 'wp_slug' => $page->post_name, - 'wp_password' => $page->post_password, - 'wp_author' => $author->display_name, - 'wp_page_parent_id' => $page->post_parent, - 'wp_page_parent_title' => $parent_title, - 'wp_page_order' => $page->menu_order, - 'wp_author_id' => (string) $author->ID, - 'wp_author_display_name' => $author->display_name, - 'date_created_gmt' => $page_date_gmt, - 'custom_fields' => $this->get_custom_fields( $page->ID ), - 'wp_page_template' => $page_template - ); - - /** - * Filters XML-RPC-prepared data for the given page. - * - * @since 3.4.0 - * - * @param array $_page An array of page data. - * @param WP_Post $page Page object. - */ - return apply_filters( 'xmlrpc_prepare_page', $_page, $page ); - } - - /** - * Prepares comment data for return in an XML-RPC object. - * - * @access protected - * - * @param object $comment The unprepared comment data. - * @return array The prepared comment data. - */ - protected function _prepare_comment( $comment ) { - // Format page date. - $comment_date_gmt = $this->_convert_date_gmt( $comment->comment_date_gmt, $comment->comment_date ); - - if ( '0' == $comment->comment_approved ) { - $comment_status = 'hold'; - } elseif ( 'spam' == $comment->comment_approved ) { - $comment_status = 'spam'; - } elseif ( '1' == $comment->comment_approved ) { - $comment_status = 'approve'; - } else { - $comment_status = $comment->comment_approved; - } - $_comment = array( - 'date_created_gmt' => $comment_date_gmt, - 'user_id' => $comment->user_id, - 'comment_id' => $comment->comment_ID, - 'parent' => $comment->comment_parent, - 'status' => $comment_status, - 'content' => $comment->comment_content, - 'link' => get_comment_link($comment), - 'post_id' => $comment->comment_post_ID, - 'post_title' => get_the_title($comment->comment_post_ID), - 'author' => $comment->comment_author, - 'author_url' => $comment->comment_author_url, - 'author_email' => $comment->comment_author_email, - 'author_ip' => $comment->comment_author_IP, - 'type' => $comment->comment_type, - ); - - /** - * Filters XML-RPC-prepared data for the given comment. - * - * @since 3.4.0 - * - * @param array $_comment An array of prepared comment data. - * @param WP_Comment $comment Comment object. - */ - return apply_filters( 'xmlrpc_prepare_comment', $_comment, $comment ); - } - - /** - * Prepares user data for return in an XML-RPC object. - * - * @access protected - * - * @param WP_User $user The unprepared user object. - * @param array $fields The subset of user fields to return. - * @return array The prepared user data. - */ - protected function _prepare_user( $user, $fields ) { - $_user = array( 'user_id' => strval( $user->ID ) ); - - $user_fields = array( - 'username' => $user->user_login, - 'first_name' => $user->user_firstname, - 'last_name' => $user->user_lastname, - 'registered' => $this->_convert_date( $user->user_registered ), - 'bio' => $user->user_description, - 'email' => $user->user_email, - 'nickname' => $user->nickname, - 'nicename' => $user->user_nicename, - 'url' => $user->user_url, - 'display_name' => $user->display_name, - 'roles' => $user->roles, - ); - - if ( in_array( 'all', $fields ) ) { - $_user = array_merge( $_user, $user_fields ); - } else { - if ( in_array( 'basic', $fields ) ) { - $basic_fields = array( 'username', 'email', 'registered', 'display_name', 'nicename' ); - $fields = array_merge( $fields, $basic_fields ); - } - $requested_fields = array_intersect_key( $user_fields, array_flip( $fields ) ); - $_user = array_merge( $_user, $requested_fields ); - } - - /** - * Filters XML-RPC-prepared data for the given user. - * - * @since 3.5.0 - * - * @param array $_user An array of user data. - * @param WP_User $user User object. - * @param array $fields An array of user fields. - */ - return apply_filters( 'xmlrpc_prepare_user', $_user, $user, $fields ); - } - - /** - * Create a new post for any registered post type. - * - * @since 3.4.0 - * - * @link https://en.wikipedia.org/wiki/RSS_enclosure for information on RSS enclosures. - * - * @param array $args { - * Method arguments. Note: top-level arguments must be ordered as documented. - * - * @type int $blog_id Blog ID (unused). - * @type string $username Username. - * @type string $password Password. - * @type array $content_struct { - * Content struct for adding a new post. See wp_insert_post() for information on - * additional post fields - * - * @type string $post_type Post type. Default 'post'. - * @type string $post_status Post status. Default 'draft' - * @type string $post_title Post title. - * @type int $post_author Post author ID. - * @type string $post_excerpt Post excerpt. - * @type string $post_content Post content. - * @type string $post_date_gmt Post date in GMT. - * @type string $post_date Post date. - * @type string $post_password Post password (20-character limit). - * @type string $comment_status Post comment enabled status. Accepts 'open' or 'closed'. - * @type string $ping_status Post ping status. Accepts 'open' or 'closed'. - * @type bool $sticky Whether the post should be sticky. Automatically false if - * `$post_status` is 'private'. - * @type int $post_thumbnail ID of an image to use as the post thumbnail/featured image. - * @type array $custom_fields Array of meta key/value pairs to add to the post. - * @type array $terms Associative array with taxonomy names as keys and arrays - * of term IDs as values. - * @type array $terms_names Associative array with taxonomy names as keys and arrays - * of term names as values. - * @type array $enclosure { - * Array of feed enclosure data to add to post meta. - * - * @type string $url URL for the feed enclosure. - * @type int $length Size in bytes of the enclosure. - * @type string $type Mime-type for the enclosure. - * } - * } - * } - * @return int|IXR_Error Post ID on success, IXR_Error instance otherwise. - */ - public function wp_newPost( $args ) { - if ( ! $this->minimum_args( $args, 4 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $content_struct = $args[3]; - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - // convert the date field back to IXR form - if ( isset( $content_struct['post_date'] ) && ! ( $content_struct['post_date'] instanceof IXR_Date ) ) { - $content_struct['post_date'] = $this->_convert_date( $content_struct['post_date'] ); - } - - // ignore the existing GMT date if it is empty or a non-GMT date was supplied in $content_struct, - // since _insert_post will ignore the non-GMT date if the GMT date is set - if ( isset( $content_struct['post_date_gmt'] ) && ! ( $content_struct['post_date_gmt'] instanceof IXR_Date ) ) { - if ( $content_struct['post_date_gmt'] == '0000-00-00 00:00:00' || isset( $content_struct['post_date'] ) ) { - unset( $content_struct['post_date_gmt'] ); - } else { - $content_struct['post_date_gmt'] = $this->_convert_date( $content_struct['post_date_gmt'] ); - } - } - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.newPost' ); - - unset( $content_struct['ID'] ); - - return $this->_insert_post( $user, $content_struct ); - } - - /** - * Helper method for filtering out elements from an array. - * - * @since 3.4.0 - * - * @param int $count Number to compare to one. - */ - private function _is_greater_than_one( $count ) { - return $count > 1; - } - - /** - * Encapsulate the logic for sticking a post - * and determining if the user has permission to do so - * - * @since 4.3.0 - * @access private - * - * @param array $post_data - * @param bool $update - * @return void|IXR_Error - */ - private function _toggle_sticky( $post_data, $update = false ) { - $post_type = get_post_type_object( $post_data['post_type'] ); - - // Private and password-protected posts cannot be stickied. - if ( 'private' === $post_data['post_status'] || ! empty( $post_data['post_password'] ) ) { - // Error if the client tried to stick the post, otherwise, silently unstick. - if ( ! empty( $post_data['sticky'] ) ) { - return new IXR_Error( 401, __( 'Sorry, you cannot stick a private post.' ) ); - } - - if ( $update ) { - unstick_post( $post_data['ID'] ); - } - } elseif ( isset( $post_data['sticky'] ) ) { - if ( ! current_user_can( $post_type->cap->edit_others_posts ) ) { - return new IXR_Error( 401, __( 'Sorry, you are not allowed to make posts sticky.' ) ); - } - - $sticky = wp_validate_boolean( $post_data['sticky'] ); - if ( $sticky ) { - stick_post( $post_data['ID'] ); - } else { - unstick_post( $post_data['ID'] ); - } - } - } - - /** - * Helper method for wp_newPost() and wp_editPost(), containing shared logic. - * - * @since 3.4.0 - * @access protected - * - * @see wp_insert_post() - * - * @param WP_User $user The post author if post_author isn't set in $content_struct. - * @param array|IXR_Error $content_struct Post data to insert. - * @return IXR_Error|string - */ - protected function _insert_post( $user, $content_struct ) { - $defaults = array( 'post_status' => 'draft', 'post_type' => 'post', 'post_author' => 0, - 'post_password' => '', 'post_excerpt' => '', 'post_content' => '', 'post_title' => '' ); - - $post_data = wp_parse_args( $content_struct, $defaults ); - - $post_type = get_post_type_object( $post_data['post_type'] ); - if ( ! $post_type ) - return new IXR_Error( 403, __( 'Invalid post type.' ) ); - - $update = ! empty( $post_data['ID'] ); - - if ( $update ) { - if ( ! get_post( $post_data['ID'] ) ) - return new IXR_Error( 401, __( 'Invalid post ID.' ) ); - if ( ! current_user_can( 'edit_post', $post_data['ID'] ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); - if ( $post_data['post_type'] != get_post_type( $post_data['ID'] ) ) - return new IXR_Error( 401, __( 'The post type may not be changed.' ) ); - } else { - if ( ! current_user_can( $post_type->cap->create_posts ) || ! current_user_can( $post_type->cap->edit_posts ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to post on this site.' ) ); - } - - switch ( $post_data['post_status'] ) { - case 'draft': - case 'pending': - break; - case 'private': - if ( ! current_user_can( $post_type->cap->publish_posts ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to create private posts in this post type.' ) ); - break; - case 'publish': - case 'future': - if ( ! current_user_can( $post_type->cap->publish_posts ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish posts in this post type.' ) ); - break; - default: - if ( ! get_post_status_object( $post_data['post_status'] ) ) - $post_data['post_status'] = 'draft'; - break; - } - - if ( ! empty( $post_data['post_password'] ) && ! current_user_can( $post_type->cap->publish_posts ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to create password protected posts in this post type.' ) ); - - $post_data['post_author'] = absint( $post_data['post_author'] ); - if ( ! empty( $post_data['post_author'] ) && $post_data['post_author'] != $user->ID ) { - if ( ! current_user_can( $post_type->cap->edit_others_posts ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to create posts as this user.' ) ); - - $author = get_userdata( $post_data['post_author'] ); - - if ( ! $author ) - return new IXR_Error( 404, __( 'Invalid author ID.' ) ); - } else { - $post_data['post_author'] = $user->ID; - } - - if ( isset( $post_data['comment_status'] ) && $post_data['comment_status'] != 'open' && $post_data['comment_status'] != 'closed' ) - unset( $post_data['comment_status'] ); - - if ( isset( $post_data['ping_status'] ) && $post_data['ping_status'] != 'open' && $post_data['ping_status'] != 'closed' ) - unset( $post_data['ping_status'] ); - - // Do some timestamp voodoo. - if ( ! empty( $post_data['post_date_gmt'] ) ) { - // We know this is supposed to be GMT, so we're going to slap that Z on there by force. - $dateCreated = rtrim( $post_data['post_date_gmt']->getIso(), 'Z' ) . 'Z'; - } elseif ( ! empty( $post_data['post_date'] ) ) { - $dateCreated = $post_data['post_date']->getIso(); - } - - // Default to not flagging the post date to be edited unless it's intentional. - $post_data['edit_date'] = false; - - if ( ! empty( $dateCreated ) ) { - $post_data['post_date'] = get_date_from_gmt( iso8601_to_datetime( $dateCreated ) ); - $post_data['post_date_gmt'] = iso8601_to_datetime( $dateCreated, 'GMT' ); - - // Flag the post date to be edited. - $post_data['edit_date'] = true; - } - - if ( ! isset( $post_data['ID'] ) ) - $post_data['ID'] = get_default_post_to_edit( $post_data['post_type'], true )->ID; - $post_ID = $post_data['ID']; - - if ( $post_data['post_type'] == 'post' ) { - $error = $this->_toggle_sticky( $post_data, $update ); - if ( $error ) { - return $error; - } - } - - if ( isset( $post_data['post_thumbnail'] ) ) { - // empty value deletes, non-empty value adds/updates. - if ( ! $post_data['post_thumbnail'] ) - delete_post_thumbnail( $post_ID ); - elseif ( ! get_post( absint( $post_data['post_thumbnail'] ) ) ) - return new IXR_Error( 404, __( 'Invalid attachment ID.' ) ); - set_post_thumbnail( $post_ID, $post_data['post_thumbnail'] ); - unset( $content_struct['post_thumbnail'] ); - } - - if ( isset( $post_data['custom_fields'] ) ) - $this->set_custom_fields( $post_ID, $post_data['custom_fields'] ); - - if ( isset( $post_data['terms'] ) || isset( $post_data['terms_names'] ) ) { - $post_type_taxonomies = get_object_taxonomies( $post_data['post_type'], 'objects' ); - - // Accumulate term IDs from terms and terms_names. - $terms = array(); - - // First validate the terms specified by ID. - if ( isset( $post_data['terms'] ) && is_array( $post_data['terms'] ) ) { - $taxonomies = array_keys( $post_data['terms'] ); - - // Validating term ids. - foreach ( $taxonomies as $taxonomy ) { - if ( ! array_key_exists( $taxonomy , $post_type_taxonomies ) ) - return new IXR_Error( 401, __( 'Sorry, one of the given taxonomies is not supported by the post type.' ) ); - - if ( ! current_user_can( $post_type_taxonomies[$taxonomy]->cap->assign_terms ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign a term to one of the given taxonomies.' ) ); - - $term_ids = $post_data['terms'][$taxonomy]; - $terms[ $taxonomy ] = array(); - foreach ( $term_ids as $term_id ) { - $term = get_term_by( 'id', $term_id, $taxonomy ); - - if ( ! $term ) - return new IXR_Error( 403, __( 'Invalid term ID.' ) ); - - $terms[$taxonomy][] = (int) $term_id; - } - } - } - - // Now validate terms specified by name. - if ( isset( $post_data['terms_names'] ) && is_array( $post_data['terms_names'] ) ) { - $taxonomies = array_keys( $post_data['terms_names'] ); - - foreach ( $taxonomies as $taxonomy ) { - if ( ! array_key_exists( $taxonomy , $post_type_taxonomies ) ) - return new IXR_Error( 401, __( 'Sorry, one of the given taxonomies is not supported by the post type.' ) ); - - if ( ! current_user_can( $post_type_taxonomies[$taxonomy]->cap->assign_terms ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign a term to one of the given taxonomies.' ) ); - - /* - * For hierarchical taxonomies, we can't assign a term when multiple terms - * in the hierarchy share the same name. - */ - $ambiguous_terms = array(); - if ( is_taxonomy_hierarchical( $taxonomy ) ) { - $tax_term_names = get_terms( $taxonomy, array( 'fields' => 'names', 'hide_empty' => false ) ); - - // Count the number of terms with the same name. - $tax_term_names_count = array_count_values( $tax_term_names ); - - // Filter out non-ambiguous term names. - $ambiguous_tax_term_counts = array_filter( $tax_term_names_count, array( $this, '_is_greater_than_one') ); - - $ambiguous_terms = array_keys( $ambiguous_tax_term_counts ); - } - - $term_names = $post_data['terms_names'][$taxonomy]; - foreach ( $term_names as $term_name ) { - if ( in_array( $term_name, $ambiguous_terms ) ) - return new IXR_Error( 401, __( 'Ambiguous term name used in a hierarchical taxonomy. Please use term ID instead.' ) ); - - $term = get_term_by( 'name', $term_name, $taxonomy ); - - if ( ! $term ) { - // Term doesn't exist, so check that the user is allowed to create new terms. - if ( ! current_user_can( $post_type_taxonomies[$taxonomy]->cap->edit_terms ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to add a term to one of the given taxonomies.' ) ); - - // Create the new term. - $term_info = wp_insert_term( $term_name, $taxonomy ); - if ( is_wp_error( $term_info ) ) - return new IXR_Error( 500, $term_info->get_error_message() ); - - $terms[$taxonomy][] = (int) $term_info['term_id']; - } else { - $terms[$taxonomy][] = (int) $term->term_id; - } - } - } - } - - $post_data['tax_input'] = $terms; - unset( $post_data['terms'], $post_data['terms_names'] ); - } else { - // Do not allow direct submission of 'tax_input', clients must use 'terms' and/or 'terms_names'. - unset( $post_data['tax_input'], $post_data['post_category'], $post_data['tags_input'] ); - } - - if ( isset( $post_data['post_format'] ) ) { - $format = set_post_format( $post_ID, $post_data['post_format'] ); - - if ( is_wp_error( $format ) ) - return new IXR_Error( 500, $format->get_error_message() ); - - unset( $post_data['post_format'] ); - } - - // Handle enclosures. - $enclosure = isset( $post_data['enclosure'] ) ? $post_data['enclosure'] : null; - $this->add_enclosure_if_new( $post_ID, $enclosure ); - - $this->attach_uploads( $post_ID, $post_data['post_content'] ); - - /** - * Filters post data array to be inserted via XML-RPC. - * - * @since 3.4.0 - * - * @param array $post_data Parsed array of post data. - * @param array $content_struct Post data array. - */ - $post_data = apply_filters( 'xmlrpc_wp_insert_post_data', $post_data, $content_struct ); - - $post_ID = $update ? wp_update_post( $post_data, true ) : wp_insert_post( $post_data, true ); - if ( is_wp_error( $post_ID ) ) - return new IXR_Error( 500, $post_ID->get_error_message() ); - - if ( ! $post_ID ) - return new IXR_Error( 401, __( 'Sorry, your entry could not be posted.' ) ); - - return strval( $post_ID ); - } - - /** - * Edit a post for any registered post type. - * - * The $content_struct parameter only needs to contain fields that - * should be changed. All other fields will retain their existing values. - * - * @since 3.4.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id Blog ID (unused). - * @type string $username Username. - * @type string $password Password. - * @type int $post_id Post ID. - * @type array $content_struct Extra content arguments. - * } - * @return true|IXR_Error True on success, IXR_Error on failure. - */ - public function wp_editPost( $args ) { - if ( ! $this->minimum_args( $args, 5 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $post_id = (int) $args[3]; - $content_struct = $args[4]; - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.editPost' ); - - $post = get_post( $post_id, ARRAY_A ); - - if ( empty( $post['ID'] ) ) - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - - if ( isset( $content_struct['if_not_modified_since'] ) ) { - // If the post has been modified since the date provided, return an error. - if ( mysql2date( 'U', $post['post_modified_gmt'] ) > $content_struct['if_not_modified_since']->getTimestamp() ) { - return new IXR_Error( 409, __( 'There is a revision of this post that is more recent.' ) ); - } - } - - // Convert the date field back to IXR form. - $post['post_date'] = $this->_convert_date( $post['post_date'] ); - - /* - * Ignore the existing GMT date if it is empty or a non-GMT date was supplied in $content_struct, - * since _insert_post() will ignore the non-GMT date if the GMT date is set. - */ - if ( $post['post_date_gmt'] == '0000-00-00 00:00:00' || isset( $content_struct['post_date'] ) ) - unset( $post['post_date_gmt'] ); - else - $post['post_date_gmt'] = $this->_convert_date( $post['post_date_gmt'] ); - - $this->escape( $post ); - $merged_content_struct = array_merge( $post, $content_struct ); - - $retval = $this->_insert_post( $user, $merged_content_struct ); - if ( $retval instanceof IXR_Error ) - return $retval; - - return true; - } - - /** - * Delete a post for any registered post type. - * - * @since 3.4.0 - * - * @see wp_delete_post() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id Blog ID (unused). - * @type string $username Username. - * @type string $password Password. - * @type int $post_id Post ID. - * } - * @return true|IXR_Error True on success, IXR_Error instance on failure. - */ - public function wp_deletePost( $args ) { - if ( ! $this->minimum_args( $args, 4 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $post_id = (int) $args[3]; - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.deletePost' ); - - $post = get_post( $post_id, ARRAY_A ); - if ( empty( $post['ID'] ) ) { - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - } - - if ( ! current_user_can( 'delete_post', $post_id ) ) { - return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this post.' ) ); - } - - $result = wp_delete_post( $post_id ); - - if ( ! $result ) { - return new IXR_Error( 500, __( 'The post cannot be deleted.' ) ); - } - - return true; - } - - /** - * Retrieve a post. - * - * @since 3.4.0 - * - * The optional $fields parameter specifies what fields will be included - * in the response array. This should be a list of field names. 'post_id' will - * always be included in the response regardless of the value of $fields. - * - * Instead of, or in addition to, individual field names, conceptual group - * names can be used to specify multiple fields. The available conceptual - * groups are 'post' (all basic fields), 'taxonomies', 'custom_fields', - * and 'enclosure'. - * - * @see get_post() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id Blog ID (unused). - * @type string $username Username. - * @type string $password Password. - * @type int $post_id Post ID. - * @type array $fields The subset of post type fields to return. - * } - * @return array|IXR_Error Array contains (based on $fields parameter): - * - 'post_id' - * - 'post_title' - * - 'post_date' - * - 'post_date_gmt' - * - 'post_modified' - * - 'post_modified_gmt' - * - 'post_status' - * - 'post_type' - * - 'post_name' - * - 'post_author' - * - 'post_password' - * - 'post_excerpt' - * - 'post_content' - * - 'link' - * - 'comment_status' - * - 'ping_status' - * - 'sticky' - * - 'custom_fields' - * - 'terms' - * - 'categories' - * - 'tags' - * - 'enclosure' - */ - public function wp_getPost( $args ) { - if ( ! $this->minimum_args( $args, 4 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $post_id = (int) $args[3]; - - if ( isset( $args[4] ) ) { - $fields = $args[4]; - } else { - /** - * Filters the list of post query fields used by the given XML-RPC method. - * - * @since 3.4.0 - * - * @param array $fields Array of post fields. Default array contains 'post', 'terms', and 'custom_fields'. - * @param string $method Method name. - */ - $fields = apply_filters( 'xmlrpc_default_post_fields', array( 'post', 'terms', 'custom_fields' ), 'wp.getPost' ); - } - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getPost' ); - - $post = get_post( $post_id, ARRAY_A ); - - if ( empty( $post['ID'] ) ) - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - - if ( ! current_user_can( 'edit_post', $post_id ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); - - return $this->_prepare_post( $post, $fields ); - } - - /** - * Retrieve posts. - * - * @since 3.4.0 - * - * @see wp_get_recent_posts() - * @see wp_getPost() for more on `$fields` - * @see get_posts() for more on `$filter` values - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id Blog ID (unused). - * @type string $username Username. - * @type string $password Password. - * @type array $filter Optional. Modifies the query used to retrieve posts. Accepts 'post_type', - * 'post_status', 'number', 'offset', 'orderby', 's', and 'order'. - * Default empty array. - * @type array $fields Optional. The subset of post type fields to return in the response array. - * } - * @return array|IXR_Error Array contains a collection of posts. - */ - public function wp_getPosts( $args ) { - if ( ! $this->minimum_args( $args, 3 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $filter = isset( $args[3] ) ? $args[3] : array(); - - if ( isset( $args[4] ) ) { - $fields = $args[4]; - } else { - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - $fields = apply_filters( 'xmlrpc_default_post_fields', array( 'post', 'terms', 'custom_fields' ), 'wp.getPosts' ); - } - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getPosts' ); - - $query = array(); - - if ( isset( $filter['post_type'] ) ) { - $post_type = get_post_type_object( $filter['post_type'] ); - if ( ! ( (bool) $post_type ) ) - return new IXR_Error( 403, __( 'Invalid post type.' ) ); - } else { - $post_type = get_post_type_object( 'post' ); - } - - if ( ! current_user_can( $post_type->cap->edit_posts ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts in this post type.' ) ); - - $query['post_type'] = $post_type->name; - - if ( isset( $filter['post_status'] ) ) - $query['post_status'] = $filter['post_status']; - - if ( isset( $filter['number'] ) ) - $query['numberposts'] = absint( $filter['number'] ); - - if ( isset( $filter['offset'] ) ) - $query['offset'] = absint( $filter['offset'] ); - - if ( isset( $filter['orderby'] ) ) { - $query['orderby'] = $filter['orderby']; - - if ( isset( $filter['order'] ) ) - $query['order'] = $filter['order']; - } - - if ( isset( $filter['s'] ) ) { - $query['s'] = $filter['s']; - } - - $posts_list = wp_get_recent_posts( $query ); - - if ( ! $posts_list ) - return array(); - - // Holds all the posts data. - $struct = array(); - - foreach ( $posts_list as $post ) { - if ( ! current_user_can( 'edit_post', $post['ID'] ) ) - continue; - - $struct[] = $this->_prepare_post( $post, $fields ); - } - - return $struct; - } - - /** - * Create a new term. - * - * @since 3.4.0 - * - * @see wp_insert_term() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id Blog ID (unused). - * @type string $username Username. - * @type string $password Password. - * @type array $content_struct Content struct for adding a new term. The struct must contain - * the term 'name' and 'taxonomy'. Optional accepted values include - * 'parent', 'description', and 'slug'. - * } - * @return int|IXR_Error The term ID on success, or an IXR_Error object on failure. - */ - public function wp_newTerm( $args ) { - if ( ! $this->minimum_args( $args, 4 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $content_struct = $args[3]; - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.newTerm' ); - - if ( ! taxonomy_exists( $content_struct['taxonomy'] ) ) - return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); - - $taxonomy = get_taxonomy( $content_struct['taxonomy'] ); - - if ( ! current_user_can( $taxonomy->cap->edit_terms ) ) { - return new IXR_Error( 401, __( 'Sorry, you are not allowed to create terms in this taxonomy.' ) ); - } - - $taxonomy = (array) $taxonomy; - - // hold the data of the term - $term_data = array(); - - $term_data['name'] = trim( $content_struct['name'] ); - if ( empty( $term_data['name'] ) ) - return new IXR_Error( 403, __( 'The term name cannot be empty.' ) ); - - if ( isset( $content_struct['parent'] ) ) { - if ( ! $taxonomy['hierarchical'] ) - return new IXR_Error( 403, __( 'This taxonomy is not hierarchical.' ) ); - - $parent_term_id = (int) $content_struct['parent']; - $parent_term = get_term( $parent_term_id , $taxonomy['name'] ); - - if ( is_wp_error( $parent_term ) ) - return new IXR_Error( 500, $parent_term->get_error_message() ); - - if ( ! $parent_term ) - return new IXR_Error( 403, __( 'Parent term does not exist.' ) ); - - $term_data['parent'] = $content_struct['parent']; - } - - if ( isset( $content_struct['description'] ) ) - $term_data['description'] = $content_struct['description']; - - if ( isset( $content_struct['slug'] ) ) - $term_data['slug'] = $content_struct['slug']; - - $term = wp_insert_term( $term_data['name'] , $taxonomy['name'] , $term_data ); - - if ( is_wp_error( $term ) ) - return new IXR_Error( 500, $term->get_error_message() ); - - if ( ! $term ) - return new IXR_Error( 500, __( 'Sorry, your term could not be created.' ) ); - - return strval( $term['term_id'] ); - } - - /** - * Edit a term. - * - * @since 3.4.0 - * - * @see wp_update_term() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id Blog ID (unused). - * @type string $username Username. - * @type string $password Password. - * @type int $term_id Term ID. - * @type array $content_struct Content struct for editing a term. The struct must contain the - * term ''taxonomy'. Optional accepted values include 'name', 'parent', - * 'description', and 'slug'. - * } - * @return true|IXR_Error True on success, IXR_Error instance on failure. - */ - public function wp_editTerm( $args ) { - if ( ! $this->minimum_args( $args, 5 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $term_id = (int) $args[3]; - $content_struct = $args[4]; - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.editTerm' ); - - if ( ! taxonomy_exists( $content_struct['taxonomy'] ) ) - return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); - - $taxonomy = get_taxonomy( $content_struct['taxonomy'] ); - - $taxonomy = (array) $taxonomy; - - // hold the data of the term - $term_data = array(); - - $term = get_term( $term_id , $content_struct['taxonomy'] ); - - if ( is_wp_error( $term ) ) - return new IXR_Error( 500, $term->get_error_message() ); - - if ( ! $term ) - return new IXR_Error( 404, __( 'Invalid term ID.' ) ); - - if ( ! current_user_can( 'edit_term', $term_id ) ) { - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this term.' ) ); - } - - if ( isset( $content_struct['name'] ) ) { - $term_data['name'] = trim( $content_struct['name'] ); - - if ( empty( $term_data['name'] ) ) - return new IXR_Error( 403, __( 'The term name cannot be empty.' ) ); - } - - if ( ! empty( $content_struct['parent'] ) ) { - if ( ! $taxonomy['hierarchical'] ) - return new IXR_Error( 403, __( "This taxonomy is not hierarchical so you can't set a parent." ) ); - - $parent_term_id = (int) $content_struct['parent']; - $parent_term = get_term( $parent_term_id , $taxonomy['name'] ); - - if ( is_wp_error( $parent_term ) ) - return new IXR_Error( 500, $parent_term->get_error_message() ); - - if ( ! $parent_term ) - return new IXR_Error( 403, __( 'Parent term does not exist.' ) ); - - $term_data['parent'] = $content_struct['parent']; - } - - if ( isset( $content_struct['description'] ) ) - $term_data['description'] = $content_struct['description']; - - if ( isset( $content_struct['slug'] ) ) - $term_data['slug'] = $content_struct['slug']; - - $term = wp_update_term( $term_id , $taxonomy['name'] , $term_data ); - - if ( is_wp_error( $term ) ) - return new IXR_Error( 500, $term->get_error_message() ); - - if ( ! $term ) - return new IXR_Error( 500, __( 'Sorry, editing the term failed.' ) ); - - return true; - } - - /** - * Delete a term. - * - * @since 3.4.0 - * - * @see wp_delete_term() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id Blog ID (unused). - * @type string $username Username. - * @type string $password Password. - * @type string $taxnomy_name Taxonomy name. - * @type int $term_id Term ID. - * } - * @return bool|IXR_Error True on success, IXR_Error instance on failure. - */ - public function wp_deleteTerm( $args ) { - if ( ! $this->minimum_args( $args, 5 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $taxonomy = $args[3]; - $term_id = (int) $args[4]; - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.deleteTerm' ); - - if ( ! taxonomy_exists( $taxonomy ) ) - return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); - - $taxonomy = get_taxonomy( $taxonomy ); - $term = get_term( $term_id, $taxonomy->name ); - - if ( is_wp_error( $term ) ) - return new IXR_Error( 500, $term->get_error_message() ); - - if ( ! $term ) - return new IXR_Error( 404, __( 'Invalid term ID.' ) ); - - if ( ! current_user_can( 'delete_term', $term_id ) ) { - return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this term.' ) ); - } - - $result = wp_delete_term( $term_id, $taxonomy->name ); - - if ( is_wp_error( $result ) ) - return new IXR_Error( 500, $term->get_error_message() ); - - if ( ! $result ) - return new IXR_Error( 500, __( 'Sorry, deleting the term failed.' ) ); - - return $result; - } - - /** - * Retrieve a term. - * - * @since 3.4.0 - * - * @see get_term() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id Blog ID (unused). - * @type string $username Username. - * @type string $password Password. - * @type string $taxnomy Taxonomy name. - * @type string $term_id Term ID. - * } - * @return array|IXR_Error IXR_Error on failure, array on success, containing: - * - 'term_id' - * - 'name' - * - 'slug' - * - 'term_group' - * - 'term_taxonomy_id' - * - 'taxonomy' - * - 'description' - * - 'parent' - * - 'count' - */ - public function wp_getTerm( $args ) { - if ( ! $this->minimum_args( $args, 5 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $taxonomy = $args[3]; - $term_id = (int) $args[4]; - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getTerm' ); - - if ( ! taxonomy_exists( $taxonomy ) ) - return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); - - $taxonomy = get_taxonomy( $taxonomy ); - - $term = get_term( $term_id , $taxonomy->name, ARRAY_A ); - - if ( is_wp_error( $term ) ) - return new IXR_Error( 500, $term->get_error_message() ); - - if ( ! $term ) - return new IXR_Error( 404, __( 'Invalid term ID.' ) ); - - if ( ! current_user_can( 'assign_term', $term_id ) ) { - return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign this term.' ) ); - } - - return $this->_prepare_term( $term ); - } - - /** - * Retrieve all terms for a taxonomy. - * - * @since 3.4.0 - * - * The optional $filter parameter modifies the query used to retrieve terms. - * Accepted keys are 'number', 'offset', 'orderby', 'order', 'hide_empty', and 'search'. - * - * @see get_terms() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id Blog ID (unused). - * @type string $username Username. - * @type string $password Password. - * @type string $taxnomy Taxonomy name. - * @type array $filter Optional. Modifies the query used to retrieve posts. Accepts 'number', - * 'offset', 'orderby', 'order', 'hide_empty', and 'search'. Default empty array. - * } - * @return array|IXR_Error An associative array of terms data on success, IXR_Error instance otherwise. - */ - public function wp_getTerms( $args ) { - if ( ! $this->minimum_args( $args, 4 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $taxonomy = $args[3]; - $filter = isset( $args[4] ) ? $args[4] : array(); - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getTerms' ); - - if ( ! taxonomy_exists( $taxonomy ) ) - return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); - - $taxonomy = get_taxonomy( $taxonomy ); - - if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) ); - - $query = array(); - - if ( isset( $filter['number'] ) ) - $query['number'] = absint( $filter['number'] ); - - if ( isset( $filter['offset'] ) ) - $query['offset'] = absint( $filter['offset'] ); - - if ( isset( $filter['orderby'] ) ) { - $query['orderby'] = $filter['orderby']; - - if ( isset( $filter['order'] ) ) - $query['order'] = $filter['order']; - } - - if ( isset( $filter['hide_empty'] ) ) - $query['hide_empty'] = $filter['hide_empty']; - else - $query['get'] = 'all'; - - if ( isset( $filter['search'] ) ) - $query['search'] = $filter['search']; - - $terms = get_terms( $taxonomy->name, $query ); - - if ( is_wp_error( $terms ) ) - return new IXR_Error( 500, $terms->get_error_message() ); - - $struct = array(); - - foreach ( $terms as $term ) { - $struct[] = $this->_prepare_term( $term ); - } - - return $struct; - } - - /** - * Retrieve a taxonomy. - * - * @since 3.4.0 - * - * @see get_taxonomy() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id Blog ID (unused). - * @type string $username Username. - * @type string $password Password. - * @type string $taxnomy Taxonomy name. - * @type array $fields Optional. Array of taxonomy fields to limit to in the return. - * Accepts 'labels', 'cap', 'menu', and 'object_type'. - * Default empty array. - * } - * @return array|IXR_Error An array of taxonomy data on success, IXR_Error instance otherwise. - */ - public function wp_getTaxonomy( $args ) { - if ( ! $this->minimum_args( $args, 4 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $taxonomy = $args[3]; - - if ( isset( $args[4] ) ) { - $fields = $args[4]; - } else { - /** - * Filters the taxonomy query fields used by the given XML-RPC method. - * - * @since 3.4.0 - * - * @param array $fields An array of taxonomy fields to retrieve. - * @param string $method The method name. - */ - $fields = apply_filters( 'xmlrpc_default_taxonomy_fields', array( 'labels', 'cap', 'object_type' ), 'wp.getTaxonomy' ); - } - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getTaxonomy' ); - - if ( ! taxonomy_exists( $taxonomy ) ) - return new IXR_Error( 403, __( 'Invalid taxonomy.' ) ); - - $taxonomy = get_taxonomy( $taxonomy ); - - if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to assign terms in this taxonomy.' ) ); - - return $this->_prepare_taxonomy( $taxonomy, $fields ); - } - - /** - * Retrieve all taxonomies. - * - * @since 3.4.0 - * - * @see get_taxonomies() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id Blog ID (unused). - * @type string $username Username. - * @type string $password Password. - * @type array $filter Optional. An array of arguments for retrieving taxonomies. - * @type array $fields Optional. The subset of taxonomy fields to return. - * } - * @return array|IXR_Error An associative array of taxonomy data with returned fields determined - * by `$fields`, or an IXR_Error instance on failure. - */ - public function wp_getTaxonomies( $args ) { - if ( ! $this->minimum_args( $args, 3 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $filter = isset( $args[3] ) ? $args[3] : array( 'public' => true ); - - if ( isset( $args[4] ) ) { - $fields = $args[4]; - } else { - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - $fields = apply_filters( 'xmlrpc_default_taxonomy_fields', array( 'labels', 'cap', 'object_type' ), 'wp.getTaxonomies' ); - } - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getTaxonomies' ); - - $taxonomies = get_taxonomies( $filter, 'objects' ); - - // holds all the taxonomy data - $struct = array(); - - foreach ( $taxonomies as $taxonomy ) { - // capability check for post_types - if ( ! current_user_can( $taxonomy->cap->assign_terms ) ) - continue; - - $struct[] = $this->_prepare_taxonomy( $taxonomy, $fields ); - } - - return $struct; - } - - /** - * Retrieve a user. - * - * The optional $fields parameter specifies what fields will be included - * in the response array. This should be a list of field names. 'user_id' will - * always be included in the response regardless of the value of $fields. - * - * Instead of, or in addition to, individual field names, conceptual group - * names can be used to specify multiple fields. The available conceptual - * groups are 'basic' and 'all'. - * - * @uses get_userdata() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type int $user_id - * @type array $fields (optional) - * } - * @return array|IXR_Error Array contains (based on $fields parameter): - * - 'user_id' - * - 'username' - * - 'first_name' - * - 'last_name' - * - 'registered' - * - 'bio' - * - 'email' - * - 'nickname' - * - 'nicename' - * - 'url' - * - 'display_name' - * - 'roles' - */ - public function wp_getUser( $args ) { - if ( ! $this->minimum_args( $args, 4 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $user_id = (int) $args[3]; - - if ( isset( $args[4] ) ) { - $fields = $args[4]; - } else { - /** - * Filters the default user query fields used by the given XML-RPC method. - * - * @since 3.5.0 - * - * @param array $fields User query fields for given method. Default 'all'. - * @param string $method The method name. - */ - $fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getUser' ); - } - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getUser' ); - - if ( ! current_user_can( 'edit_user', $user_id ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this user.' ) ); - - $user_data = get_userdata( $user_id ); - - if ( ! $user_data ) - return new IXR_Error( 404, __( 'Invalid user ID.' ) ); - - return $this->_prepare_user( $user_data, $fields ); - } - - /** - * Retrieve users. - * - * The optional $filter parameter modifies the query used to retrieve users. - * Accepted keys are 'number' (default: 50), 'offset' (default: 0), 'role', - * 'who', 'orderby', and 'order'. - * - * The optional $fields parameter specifies what fields will be included - * in the response array. - * - * @uses get_users() - * @see wp_getUser() for more on $fields and return values - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type array $filter (optional) - * @type array $fields (optional) - * } - * @return array|IXR_Error users data - */ - public function wp_getUsers( $args ) { - if ( ! $this->minimum_args( $args, 3 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $filter = isset( $args[3] ) ? $args[3] : array(); - - if ( isset( $args[4] ) ) { - $fields = $args[4]; - } else { - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - $fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getUsers' ); - } - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getUsers' ); - - if ( ! current_user_can( 'list_users' ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to list users.' ) ); - - $query = array( 'fields' => 'all_with_meta' ); - - $query['number'] = ( isset( $filter['number'] ) ) ? absint( $filter['number'] ) : 50; - $query['offset'] = ( isset( $filter['offset'] ) ) ? absint( $filter['offset'] ) : 0; - - if ( isset( $filter['orderby'] ) ) { - $query['orderby'] = $filter['orderby']; - - if ( isset( $filter['order'] ) ) - $query['order'] = $filter['order']; - } - - if ( isset( $filter['role'] ) ) { - if ( get_role( $filter['role'] ) === null ) - return new IXR_Error( 403, __( 'Invalid role.' ) ); - - $query['role'] = $filter['role']; - } - - if ( isset( $filter['who'] ) ) { - $query['who'] = $filter['who']; - } - - $users = get_users( $query ); - - $_users = array(); - foreach ( $users as $user_data ) { - if ( current_user_can( 'edit_user', $user_data->ID ) ) - $_users[] = $this->_prepare_user( $user_data, $fields ); - } - return $_users; - } - - /** - * Retrieve information about the requesting user. - * - * @uses get_userdata() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type array $fields (optional) - * } - * @return array|IXR_Error (@see wp_getUser) - */ - public function wp_getProfile( $args ) { - if ( ! $this->minimum_args( $args, 3 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - - if ( isset( $args[3] ) ) { - $fields = $args[3]; - } else { - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - $fields = apply_filters( 'xmlrpc_default_user_fields', array( 'all' ), 'wp.getProfile' ); - } - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getProfile' ); - - if ( ! current_user_can( 'edit_user', $user->ID ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit your profile.' ) ); - - $user_data = get_userdata( $user->ID ); - - return $this->_prepare_user( $user_data, $fields ); - } - - /** - * Edit user's profile. - * - * @uses wp_update_user() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type array $content_struct It can optionally contain: - * - 'first_name' - * - 'last_name' - * - 'website' - * - 'display_name' - * - 'nickname' - * - 'nicename' - * - 'bio' - * } - * @return true|IXR_Error True, on success. - */ - public function wp_editProfile( $args ) { - if ( ! $this->minimum_args( $args, 4 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $content_struct = $args[3]; - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.editProfile' ); - - if ( ! current_user_can( 'edit_user', $user->ID ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit your profile.' ) ); - - // holds data of the user - $user_data = array(); - $user_data['ID'] = $user->ID; - - // only set the user details if it was given - if ( isset( $content_struct['first_name'] ) ) - $user_data['first_name'] = $content_struct['first_name']; - - if ( isset( $content_struct['last_name'] ) ) - $user_data['last_name'] = $content_struct['last_name']; - - if ( isset( $content_struct['url'] ) ) - $user_data['user_url'] = $content_struct['url']; - - if ( isset( $content_struct['display_name'] ) ) - $user_data['display_name'] = $content_struct['display_name']; - - if ( isset( $content_struct['nickname'] ) ) - $user_data['nickname'] = $content_struct['nickname']; - - if ( isset( $content_struct['nicename'] ) ) - $user_data['user_nicename'] = $content_struct['nicename']; - - if ( isset( $content_struct['bio'] ) ) - $user_data['description'] = $content_struct['bio']; - - $result = wp_update_user( $user_data ); - - if ( is_wp_error( $result ) ) - return new IXR_Error( 500, $result->get_error_message() ); - - if ( ! $result ) - return new IXR_Error( 500, __( 'Sorry, the user cannot be updated.' ) ); - - return true; - } - - /** - * Retrieve page. - * - * @since 2.2.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type int $page_id - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function wp_getPage( $args ) { - $this->escape( $args ); - - $page_id = (int) $args[1]; - $username = $args[2]; - $password = $args[3]; - - if ( !$user = $this->login($username, $password) ) { - return $this->error; - } - - $page = get_post($page_id); - if ( ! $page ) - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - - if ( !current_user_can( 'edit_page', $page_id ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this page.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getPage' ); - - // If we found the page then format the data. - if ( $page->ID && ($page->post_type == 'page') ) { - return $this->_prepare_page( $page ); - } - // If the page doesn't exist indicate that. - else { - return new IXR_Error( 404, __( 'Sorry, no such page.' ) ); - } - } - - /** - * Retrieve Pages. - * - * @since 2.2.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type int $num_pages - * } - * @return array|IXR_Error - */ - public function wp_getPages( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $num_pages = isset($args[3]) ? (int) $args[3] : 10; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( !current_user_can( 'edit_pages' ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit pages.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getPages' ); - - $pages = get_posts( array('post_type' => 'page', 'post_status' => 'any', 'numberposts' => $num_pages) ); - $num_pages = count($pages); - - // If we have pages, put together their info. - if ( $num_pages >= 1 ) { - $pages_struct = array(); - - foreach ($pages as $page) { - if ( current_user_can( 'edit_page', $page->ID ) ) - $pages_struct[] = $this->_prepare_page( $page ); - } - - return $pages_struct; - } - - return array(); - } - - /** - * Create new page. - * - * @since 2.2.0 - * - * @see wp_xmlrpc_server::mw_newPost() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type array $content_struct - * } - * @return int|IXR_Error - */ - public function wp_newPage( $args ) { - // Items not escaped here will be escaped in newPost. - $username = $this->escape( $args[1] ); - $password = $this->escape( $args[2] ); - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.newPage' ); - - // Mark this as content for a page. - $args[3]["post_type"] = 'page'; - - // Let mw_newPost do all of the heavy lifting. - return $this->mw_newPost( $args ); - } - - /** - * Delete page. - * - * @since 2.2.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type int $page_id - * } - * @return true|IXR_Error True, if success. - */ - public function wp_deletePage( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $page_id = (int) $args[3]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.deletePage' ); - - // Get the current page based on the page_id and - // make sure it is a page and not a post. - $actual_page = get_post($page_id, ARRAY_A); - if ( !$actual_page || ($actual_page['post_type'] != 'page') ) - return new IXR_Error( 404, __( 'Sorry, no such page.' ) ); - - // Make sure the user can delete pages. - if ( !current_user_can('delete_page', $page_id) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this page.' ) ); - - // Attempt to delete the page. - $result = wp_delete_post($page_id); - if ( !$result ) - return new IXR_Error( 500, __( 'Failed to delete the page.' ) ); - - /** - * Fires after a page has been successfully deleted via XML-RPC. - * - * @since 3.4.0 - * - * @param int $page_id ID of the deleted page. - * @param array $args An array of arguments to delete the page. - */ - do_action( 'xmlrpc_call_success_wp_deletePage', $page_id, $args ); - - return true; - } - - /** - * Edit page. - * - * @since 2.2.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type int $page_id - * @type string $username - * @type string $password - * @type string $content - * @type string $publish - * } - * @return array|IXR_Error - */ - public function wp_editPage( $args ) { - // Items will be escaped in mw_editPost. - $page_id = (int) $args[1]; - $username = $args[2]; - $password = $args[3]; - $content = $args[4]; - $publish = $args[5]; - - $escaped_username = $this->escape( $username ); - $escaped_password = $this->escape( $password ); - - if ( !$user = $this->login( $escaped_username, $escaped_password ) ) { - return $this->error; - } - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.editPage' ); - - // Get the page data and make sure it is a page. - $actual_page = get_post($page_id, ARRAY_A); - if ( !$actual_page || ($actual_page['post_type'] != 'page') ) - return new IXR_Error( 404, __( 'Sorry, no such page.' ) ); - - // Make sure the user is allowed to edit pages. - if ( !current_user_can('edit_page', $page_id) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this page.' ) ); - - // Mark this as content for a page. - $content['post_type'] = 'page'; - - // Arrange args in the way mw_editPost understands. - $args = array( - $page_id, - $username, - $password, - $content, - $publish - ); - - // Let mw_editPost do all of the heavy lifting. - return $this->mw_editPost( $args ); - } - - /** - * Retrieve page list. - * - * @since 2.2.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function wp_getPageList( $args ) { - global $wpdb; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( !current_user_can( 'edit_pages' ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit pages.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getPageList' ); - - // Get list of pages ids and titles - $page_list = $wpdb->get_results(" - SELECT ID page_id, - post_title page_title, - post_parent page_parent_id, - post_date_gmt, - post_date, - post_status - FROM {$wpdb->posts} - WHERE post_type = 'page' - ORDER BY ID - "); - - // The date needs to be formatted properly. - $num_pages = count($page_list); - for ( $i = 0; $i < $num_pages; $i++ ) { - $page_list[$i]->dateCreated = $this->_convert_date( $page_list[$i]->post_date ); - $page_list[$i]->date_created_gmt = $this->_convert_date_gmt( $page_list[$i]->post_date_gmt, $page_list[$i]->post_date ); - - unset($page_list[$i]->post_date_gmt); - unset($page_list[$i]->post_date); - unset($page_list[$i]->post_status); - } - - return $page_list; - } - - /** - * Retrieve authors list. - * - * @since 2.2.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function wp_getAuthors( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( !current_user_can('edit_posts') ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getAuthors' ); - - $authors = array(); - foreach ( get_users( array( 'fields' => array('ID','user_login','display_name') ) ) as $user ) { - $authors[] = array( - 'user_id' => $user->ID, - 'user_login' => $user->user_login, - 'display_name' => $user->display_name - ); - } - - return $authors; - } - - /** - * Get list of all tags - * - * @since 2.7.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function wp_getTags( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( !current_user_can( 'edit_posts' ) ) - return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view tags.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getKeywords' ); - - $tags = array(); - - if ( $all_tags = get_tags() ) { - foreach ( (array) $all_tags as $tag ) { - $struct = array(); - $struct['tag_id'] = $tag->term_id; - $struct['name'] = $tag->name; - $struct['count'] = $tag->count; - $struct['slug'] = $tag->slug; - $struct['html_url'] = esc_html( get_tag_link( $tag->term_id ) ); - $struct['rss_url'] = esc_html( get_tag_feed_link( $tag->term_id ) ); - - $tags[] = $struct; - } - } - - return $tags; - } - - /** - * Create new category. - * - * @since 2.2.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type array $category - * } - * @return int|IXR_Error Category ID. - */ - public function wp_newCategory( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $category = $args[3]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.newCategory' ); - - // Make sure the user is allowed to add a category. - if ( !current_user_can('manage_categories') ) - return new IXR_Error(401, __('Sorry, you are not allowed to add a category.')); - - // If no slug was provided make it empty so that - // WordPress will generate one. - if ( empty($category['slug']) ) - $category['slug'] = ''; - - // If no parent_id was provided make it empty - // so that it will be a top level page (no parent). - if ( !isset($category['parent_id']) ) - $category['parent_id'] = ''; - - // If no description was provided make it empty. - if ( empty($category["description"]) ) - $category["description"] = ""; - - $new_category = array( - 'cat_name' => $category['name'], - 'category_nicename' => $category['slug'], - 'category_parent' => $category['parent_id'], - 'category_description' => $category['description'] - ); - - $cat_id = wp_insert_category($new_category, true); - if ( is_wp_error( $cat_id ) ) { - if ( 'term_exists' == $cat_id->get_error_code() ) - return (int) $cat_id->get_error_data(); - else - return new IXR_Error(500, __('Sorry, the new category failed.')); - } elseif ( ! $cat_id ) { - return new IXR_Error(500, __('Sorry, the new category failed.')); - } - - /** - * Fires after a new category has been successfully created via XML-RPC. - * - * @since 3.4.0 - * - * @param int $cat_id ID of the new category. - * @param array $args An array of new category arguments. - */ - do_action( 'xmlrpc_call_success_wp_newCategory', $cat_id, $args ); - - return $cat_id; - } - - /** - * Remove category. - * - * @since 2.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type int $category_id - * } - * @return bool|IXR_Error See wp_delete_term() for return info. - */ - public function wp_deleteCategory( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $category_id = (int) $args[3]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.deleteCategory' ); - - if ( !current_user_can('manage_categories') ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete a category.' ) ); - - $status = wp_delete_term( $category_id, 'category' ); - - if ( true == $status ) { - /** - * Fires after a category has been successfully deleted via XML-RPC. - * - * @since 3.4.0 - * - * @param int $category_id ID of the deleted category. - * @param array $args An array of arguments to delete the category. - */ - do_action( 'xmlrpc_call_success_wp_deleteCategory', $category_id, $args ); - } - - return $status; - } - - /** - * Retrieve category list. - * - * @since 2.2.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type array $category - * @type int $max_results - * } - * @return array|IXR_Error - */ - public function wp_suggestCategories( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $category = $args[3]; - $max_results = (int) $args[4]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( !current_user_can( 'edit_posts' ) ) - return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.suggestCategories' ); - - $category_suggestions = array(); - $args = array('get' => 'all', 'number' => $max_results, 'name__like' => $category); - foreach ( (array) get_categories($args) as $cat ) { - $category_suggestions[] = array( - 'category_id' => $cat->term_id, - 'category_name' => $cat->name - ); - } - - return $category_suggestions; - } - - /** - * Retrieve comment. - * - * @since 2.7.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type int $comment_id - * } - * @return array|IXR_Error - */ - public function wp_getComment($args) { - $this->escape($args); - - $username = $args[1]; - $password = $args[2]; - $comment_id = (int) $args[3]; - - if ( ! $user = $this->login( $username, $password ) ) { - return $this->error; - } - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getComment' ); - - if ( ! $comment = get_comment( $comment_id ) ) { - return new IXR_Error( 404, __( 'Invalid comment ID.' ) ); - } - - if ( ! current_user_can( 'edit_comment', $comment_id ) ) { - return new IXR_Error( 403, __( 'Sorry, you are not allowed to moderate or edit this comment.' ) ); - } - - return $this->_prepare_comment( $comment ); - } - - /** - * Retrieve comments. - * - * Besides the common blog_id (unused), username, and password arguments, it takes a filter - * array as last argument. - * - * Accepted 'filter' keys are 'status', 'post_id', 'offset', and 'number'. - * - * The defaults are as follows: - * - 'status' - Default is ''. Filter by status (e.g., 'approve', 'hold') - * - 'post_id' - Default is ''. The post where the comment is posted. Empty string shows all comments. - * - 'number' - Default is 10. Total number of media items to retrieve. - * - 'offset' - Default is 0. See WP_Query::query() for more. - * - * @since 2.7.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type array $struct - * } - * @return array|IXR_Error Contains a collection of comments. See wp_xmlrpc_server::wp_getComment() for a description of each item contents - */ - public function wp_getComments( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $struct = isset( $args[3] ) ? $args[3] : array(); - - if ( ! $user = $this->login( $username, $password ) ) { - return $this->error; - } - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getComments' ); - - if ( isset( $struct['status'] ) ) { - $status = $struct['status']; - } else { - $status = ''; - } - - if ( ! current_user_can( 'moderate_comments' ) && 'approve' !== $status ) { - return new IXR_Error( 401, __( 'Invalid comment status.' ) ); - } - - $post_id = ''; - if ( isset( $struct['post_id'] ) ) { - $post_id = absint( $struct['post_id'] ); - } - - $post_type = ''; - if ( isset( $struct['post_type'] ) ) { - $post_type_object = get_post_type_object( $struct['post_type'] ); - if ( ! $post_type_object || ! post_type_supports( $post_type_object->name, 'comments' ) ) { - return new IXR_Error( 404, __( 'Invalid post type.' ) ); - } - $post_type = $struct['post_type']; - } - - $offset = 0; - if ( isset( $struct['offset'] ) ) { - $offset = absint( $struct['offset'] ); - } - - $number = 10; - if ( isset( $struct['number'] ) ) { - $number = absint( $struct['number'] ); - } - - $comments = get_comments( array( - 'status' => $status, - 'post_id' => $post_id, - 'offset' => $offset, - 'number' => $number, - 'post_type' => $post_type, - ) ); - - $comments_struct = array(); - if ( is_array( $comments ) ) { - foreach ( $comments as $comment ) { - $comments_struct[] = $this->_prepare_comment( $comment ); - } - } - - return $comments_struct; - } - - /** - * Delete a comment. - * - * By default, the comment will be moved to the trash instead of deleted. - * See wp_delete_comment() for more information on this behavior. - * - * @since 2.7.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type int $comment_ID - * } - * @return bool|IXR_Error See wp_delete_comment(). - */ - public function wp_deleteComment( $args ) { - $this->escape($args); - - $username = $args[1]; - $password = $args[2]; - $comment_ID = (int) $args[3]; - - if ( ! $user = $this->login( $username, $password ) ) { - return $this->error; - } - - if ( ! get_comment( $comment_ID ) ) { - return new IXR_Error( 404, __( 'Invalid comment ID.' ) ); - } - - if ( !current_user_can( 'edit_comment', $comment_ID ) ) { - return new IXR_Error( 403, __( 'Sorry, you are not allowed to moderate or edit this comment.' ) ); - } - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.deleteComment' ); - - $status = wp_delete_comment( $comment_ID ); - - if ( $status ) { - /** - * Fires after a comment has been successfully deleted via XML-RPC. - * - * @since 3.4.0 - * - * @param int $comment_ID ID of the deleted comment. - * @param array $args An array of arguments to delete the comment. - */ - do_action( 'xmlrpc_call_success_wp_deleteComment', $comment_ID, $args ); - } - - return $status; - } - - /** - * Edit comment. - * - * Besides the common blog_id (unused), username, and password arguments, it takes a - * comment_id integer and a content_struct array as last argument. - * - * The allowed keys in the content_struct array are: - * - 'author' - * - 'author_url' - * - 'author_email' - * - 'content' - * - 'date_created_gmt' - * - 'status'. Common statuses are 'approve', 'hold', 'spam'. See get_comment_statuses() for more details - * - * @since 2.7.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type int $comment_ID - * @type array $content_struct - * } - * @return true|IXR_Error True, on success. - */ - public function wp_editComment( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $comment_ID = (int) $args[3]; - $content_struct = $args[4]; - - if ( !$user = $this->login( $username, $password ) ) { - return $this->error; - } - - if ( ! get_comment( $comment_ID ) ) { - return new IXR_Error( 404, __( 'Invalid comment ID.' ) ); - } - - if ( ! current_user_can( 'edit_comment', $comment_ID ) ) { - return new IXR_Error( 403, __( 'Sorry, you are not allowed to moderate or edit this comment.' ) ); - } - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.editComment' ); - - if ( isset($content_struct['status']) ) { - $statuses = get_comment_statuses(); - $statuses = array_keys($statuses); - - if ( ! in_array($content_struct['status'], $statuses) ) - return new IXR_Error( 401, __( 'Invalid comment status.' ) ); - $comment_approved = $content_struct['status']; - } - - // Do some timestamp voodoo - if ( !empty( $content_struct['date_created_gmt'] ) ) { - // We know this is supposed to be GMT, so we're going to slap that Z on there by force - $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; - $comment_date = get_date_from_gmt(iso8601_to_datetime($dateCreated)); - $comment_date_gmt = iso8601_to_datetime($dateCreated, 'GMT'); - } - - if ( isset($content_struct['content']) ) - $comment_content = $content_struct['content']; - - if ( isset($content_struct['author']) ) - $comment_author = $content_struct['author']; - - if ( isset($content_struct['author_url']) ) - $comment_author_url = $content_struct['author_url']; - - if ( isset($content_struct['author_email']) ) - $comment_author_email = $content_struct['author_email']; - - // We've got all the data -- post it: - $comment = compact('comment_ID', 'comment_content', 'comment_approved', 'comment_date', 'comment_date_gmt', 'comment_author', 'comment_author_email', 'comment_author_url'); - - $result = wp_update_comment($comment); - if ( is_wp_error( $result ) ) - return new IXR_Error(500, $result->get_error_message()); - - if ( !$result ) - return new IXR_Error(500, __('Sorry, the comment could not be edited.')); - - /** - * Fires after a comment has been successfully updated via XML-RPC. - * - * @since 3.4.0 - * - * @param int $comment_ID ID of the updated comment. - * @param array $args An array of arguments to update the comment. - */ - do_action( 'xmlrpc_call_success_wp_editComment', $comment_ID, $args ); - - return true; - } - - /** - * Create new comment. - * - * @since 2.7.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type string|int $post - * @type array $content_struct - * } - * @return int|IXR_Error See wp_new_comment(). - */ - public function wp_newComment($args) { - $this->escape($args); - - $username = $args[1]; - $password = $args[2]; - $post = $args[3]; - $content_struct = $args[4]; - - /** - * Filters whether to allow anonymous comments over XML-RPC. - * - * @since 2.7.0 - * - * @param bool $allow Whether to allow anonymous commenting via XML-RPC. - * Default false. - */ - $allow_anon = apply_filters( 'xmlrpc_allow_anonymous_comments', false ); - - $user = $this->login($username, $password); - - if ( !$user ) { - $logged_in = false; - if ( $allow_anon && get_option('comment_registration') ) { - return new IXR_Error( 403, __( 'You must be registered to comment.' ) ); - } elseif ( ! $allow_anon ) { - return $this->error; - } - } else { - $logged_in = true; - } - - if ( is_numeric($post) ) - $post_id = absint($post); - else - $post_id = url_to_postid($post); - - if ( ! $post_id ) { - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - } - - if ( ! get_post( $post_id ) ) { - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - } - - if ( ! comments_open( $post_id ) ) { - return new IXR_Error( 403, __( 'Sorry, comments are closed for this item.' ) ); - } - - if ( empty( $content_struct['content'] ) ) { - return new IXR_Error( 403, __( 'Comment is required.' ) ); - } - - $comment = array( - 'comment_post_ID' => $post_id, - 'comment_content' => $content_struct['content'], - ); - - if ( $logged_in ) { - $display_name = $user->display_name; - $user_email = $user->user_email; - $user_url = $user->user_url; - - $comment['comment_author'] = $this->escape( $display_name ); - $comment['comment_author_email'] = $this->escape( $user_email ); - $comment['comment_author_url'] = $this->escape( $user_url ); - $comment['user_ID'] = $user->ID; - } else { - $comment['comment_author'] = ''; - if ( isset($content_struct['author']) ) - $comment['comment_author'] = $content_struct['author']; - - $comment['comment_author_email'] = ''; - if ( isset($content_struct['author_email']) ) - $comment['comment_author_email'] = $content_struct['author_email']; - - $comment['comment_author_url'] = ''; - if ( isset($content_struct['author_url']) ) - $comment['comment_author_url'] = $content_struct['author_url']; - - $comment['user_ID'] = 0; - - if ( get_option('require_name_email') ) { - if ( 6 > strlen($comment['comment_author_email']) || '' == $comment['comment_author'] ) - return new IXR_Error( 403, __( 'Comment author name and email are required.' ) ); - elseif ( !is_email($comment['comment_author_email']) ) - return new IXR_Error( 403, __( 'A valid email address is required.' ) ); - } - } - - $comment['comment_parent'] = isset($content_struct['comment_parent']) ? absint($content_struct['comment_parent']) : 0; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.newComment' ); - - $comment_ID = wp_new_comment( $comment, true ); - if ( is_wp_error( $comment_ID ) ) { - return new IXR_Error( 403, $comment_ID->get_error_message() ); - } - - if ( ! $comment_ID ) { - return new IXR_Error( 403, __( 'An unknown error occurred' ) ); - } - - /** - * Fires after a new comment has been successfully created via XML-RPC. - * - * @since 3.4.0 - * - * @param int $comment_ID ID of the new comment. - * @param array $args An array of new comment arguments. - */ - do_action( 'xmlrpc_call_success_wp_newComment', $comment_ID, $args ); - - return $comment_ID; - } - - /** - * Retrieve all of the comment status. - * - * @since 2.7.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function wp_getCommentStatusList( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - - if ( ! $user = $this->login( $username, $password ) ) { - return $this->error; - } - - if ( ! current_user_can( 'publish_posts' ) ) { - return new IXR_Error( 403, __( 'Sorry, you are not allowed access to details about this site.' ) ); - } - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getCommentStatusList' ); - - return get_comment_statuses(); - } - - /** - * Retrieve comment count. - * - * @since 2.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type int $post_id - * } - * @return array|IXR_Error - */ - public function wp_getCommentCount( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $post_id = (int) $args[3]; - - if ( ! $user = $this->login( $username, $password ) ) { - return $this->error; - } - - $post = get_post( $post_id, ARRAY_A ); - if ( empty( $post['ID'] ) ) { - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - } - - if ( ! current_user_can( 'edit_post', $post_id ) ) { - return new IXR_Error( 403, __( 'Sorry, you are not allowed access to details of this post.' ) ); - } - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getCommentCount' ); - - $count = wp_count_comments( $post_id ); - - return array( - 'approved' => $count->approved, - 'awaiting_moderation' => $count->moderated, - 'spam' => $count->spam, - 'total_comments' => $count->total_comments - ); - } - - /** - * Retrieve post statuses. - * - * @since 2.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function wp_getPostStatusList( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( !current_user_can( 'edit_posts' ) ) - return new IXR_Error( 403, __( 'Sorry, you are not allowed access to details about this site.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getPostStatusList' ); - - return get_post_statuses(); - } - - /** - * Retrieve page statuses. - * - * @since 2.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function wp_getPageStatusList( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( !current_user_can( 'edit_pages' ) ) - return new IXR_Error( 403, __( 'Sorry, you are not allowed access to details about this site.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getPageStatusList' ); - - return get_page_statuses(); - } - - /** - * Retrieve page templates. - * - * @since 2.6.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function wp_getPageTemplates( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( !current_user_can( 'edit_pages' ) ) - return new IXR_Error( 403, __( 'Sorry, you are not allowed access to details about this site.' ) ); - - $templates = get_page_templates(); - $templates['Default'] = 'default'; - - return $templates; - } - - /** - * Retrieve blog options. - * - * @since 2.6.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type array $options - * } - * @return array|IXR_Error - */ - public function wp_getOptions( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $options = isset( $args[3] ) ? (array) $args[3] : array(); - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - // If no specific options where asked for, return all of them - if ( count( $options ) == 0 ) - $options = array_keys($this->blog_options); - - return $this->_getOptions($options); - } - - /** - * Retrieve blog options value from list. - * - * @since 2.6.0 - * - * @param array $options Options to retrieve. - * @return array - */ - public function _getOptions($options) { - $data = array(); - $can_manage = current_user_can( 'manage_options' ); - foreach ( $options as $option ) { - if ( array_key_exists( $option, $this->blog_options ) ) { - $data[$option] = $this->blog_options[$option]; - //Is the value static or dynamic? - if ( isset( $data[$option]['option'] ) ) { - $data[$option]['value'] = get_option( $data[$option]['option'] ); - unset($data[$option]['option']); - } - - if ( ! $can_manage ) - $data[$option]['readonly'] = true; - } - } - - return $data; - } - - /** - * Update blog options. - * - * @since 2.6.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type array $options - * } - * @return array|IXR_Error - */ - public function wp_setOptions( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $options = (array) $args[3]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( !current_user_can( 'manage_options' ) ) - return new IXR_Error( 403, __( 'Sorry, you are not allowed to update options.' ) ); - - $option_names = array(); - foreach ( $options as $o_name => $o_value ) { - $option_names[] = $o_name; - if ( !array_key_exists( $o_name, $this->blog_options ) ) - continue; - - if ( $this->blog_options[$o_name]['readonly'] == true ) - continue; - - update_option( $this->blog_options[$o_name]['option'], wp_unslash( $o_value ) ); - } - - //Now return the updated values - return $this->_getOptions($option_names); - } - - /** - * Retrieve a media item by ID - * - * @since 3.1.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type int $attachment_id - * } - * @return array|IXR_Error Associative array contains: - * - 'date_created_gmt' - * - 'parent' - * - 'link' - * - 'thumbnail' - * - 'title' - * - 'caption' - * - 'description' - * - 'metadata' - */ - public function wp_getMediaItem( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $attachment_id = (int) $args[3]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( !current_user_can( 'upload_files' ) ) - return new IXR_Error( 403, __( 'Sorry, you are not allowed to upload files.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getMediaItem' ); - - if ( ! $attachment = get_post($attachment_id) ) - return new IXR_Error( 404, __( 'Invalid attachment ID.' ) ); - - return $this->_prepare_media_item( $attachment ); - } - - /** - * Retrieves a collection of media library items (or attachments) - * - * Besides the common blog_id (unused), username, and password arguments, it takes a filter - * array as last argument. - * - * Accepted 'filter' keys are 'parent_id', 'mime_type', 'offset', and 'number'. - * - * The defaults are as follows: - * - 'number' - Default is 5. Total number of media items to retrieve. - * - 'offset' - Default is 0. See WP_Query::query() for more. - * - 'parent_id' - Default is ''. The post where the media item is attached. Empty string shows all media items. 0 shows unattached media items. - * - 'mime_type' - Default is ''. Filter by mime type (e.g., 'image/jpeg', 'application/pdf') - * - * @since 3.1.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type array $struct - * } - * @return array|IXR_Error Contains a collection of media items. See wp_xmlrpc_server::wp_getMediaItem() for a description of each item contents - */ - public function wp_getMediaLibrary($args) { - $this->escape($args); - - $username = $args[1]; - $password = $args[2]; - $struct = isset( $args[3] ) ? $args[3] : array() ; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( !current_user_can( 'upload_files' ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to upload files.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getMediaLibrary' ); - - $parent_id = ( isset($struct['parent_id']) ) ? absint($struct['parent_id']) : '' ; - $mime_type = ( isset($struct['mime_type']) ) ? $struct['mime_type'] : '' ; - $offset = ( isset($struct['offset']) ) ? absint($struct['offset']) : 0 ; - $number = ( isset($struct['number']) ) ? absint($struct['number']) : -1 ; - - $attachments = get_posts( array('post_type' => 'attachment', 'post_parent' => $parent_id, 'offset' => $offset, 'numberposts' => $number, 'post_mime_type' => $mime_type ) ); - - $attachments_struct = array(); - - foreach ($attachments as $attachment ) - $attachments_struct[] = $this->_prepare_media_item( $attachment ); - - return $attachments_struct; - } - - /** - * Retrieves a list of post formats used by the site. - * - * @since 3.1.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * } - * @return array|IXR_Error List of post formats, otherwise IXR_Error object. - */ - public function wp_getPostFormats( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - - if ( !$user = $this->login( $username, $password ) ) - return $this->error; - - if ( !current_user_can( 'edit_posts' ) ) - return new IXR_Error( 403, __( 'Sorry, you are not allowed access to details about this site.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getPostFormats' ); - - $formats = get_post_format_strings(); - - // find out if they want a list of currently supports formats - if ( isset( $args[3] ) && is_array( $args[3] ) ) { - if ( $args[3]['show-supported'] ) { - if ( current_theme_supports( 'post-formats' ) ) { - $supported = get_theme_support( 'post-formats' ); - - $data = array(); - $data['all'] = $formats; - $data['supported'] = $supported[0]; - - $formats = $data; - } - } - } - - return $formats; - } - - /** - * Retrieves a post type - * - * @since 3.4.0 - * - * @see get_post_type_object() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type string $post_type_name - * @type array $fields (optional) - * } - * @return array|IXR_Error Array contains: - * - 'labels' - * - 'description' - * - 'capability_type' - * - 'cap' - * - 'map_meta_cap' - * - 'hierarchical' - * - 'menu_position' - * - 'taxonomies' - * - 'supports' - */ - public function wp_getPostType( $args ) { - if ( ! $this->minimum_args( $args, 4 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $post_type_name = $args[3]; - - if ( isset( $args[4] ) ) { - $fields = $args[4]; - } else { - /** - * Filters the default query fields used by the given XML-RPC method. - * - * @since 3.4.0 - * - * @param array $fields An array of post type query fields for the given method. - * @param string $method The method name. - */ - $fields = apply_filters( 'xmlrpc_default_posttype_fields', array( 'labels', 'cap', 'taxonomies' ), 'wp.getPostType' ); - } - - if ( !$user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getPostType' ); - - if ( ! post_type_exists( $post_type_name ) ) - return new IXR_Error( 403, __( 'Invalid post type.' ) ); - - $post_type = get_post_type_object( $post_type_name ); - - if ( ! current_user_can( $post_type->cap->edit_posts ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts in this post type.' ) ); - - return $this->_prepare_post_type( $post_type, $fields ); - } - - /** - * Retrieves a post types - * - * @since 3.4.0 - * - * @see get_post_types() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type array $filter (optional) - * @type array $fields (optional) - * } - * @return array|IXR_Error - */ - public function wp_getPostTypes( $args ) { - if ( ! $this->minimum_args( $args, 3 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $filter = isset( $args[3] ) ? $args[3] : array( 'public' => true ); - - if ( isset( $args[4] ) ) { - $fields = $args[4]; - } else { - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - $fields = apply_filters( 'xmlrpc_default_posttype_fields', array( 'labels', 'cap', 'taxonomies' ), 'wp.getPostTypes' ); - } - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getPostTypes' ); - - $post_types = get_post_types( $filter, 'objects' ); - - $struct = array(); - - foreach ( $post_types as $post_type ) { - if ( ! current_user_can( $post_type->cap->edit_posts ) ) - continue; - - $struct[$post_type->name] = $this->_prepare_post_type( $post_type, $fields ); - } - - return $struct; - } - - /** - * Retrieve revisions for a specific post. - * - * @since 3.5.0 - * - * The optional $fields parameter specifies what fields will be included - * in the response array. - * - * @uses wp_get_post_revisions() - * @see wp_getPost() for more on $fields - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type int $post_id - * @type array $fields (optional) - * } - * @return array|IXR_Error contains a collection of posts. - */ - public function wp_getRevisions( $args ) { - if ( ! $this->minimum_args( $args, 4 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $post_id = (int) $args[3]; - - if ( isset( $args[4] ) ) { - $fields = $args[4]; - } else { - /** - * Filters the default revision query fields used by the given XML-RPC method. - * - * @since 3.5.0 - * - * @param array $field An array of revision query fields. - * @param string $method The method name. - */ - $fields = apply_filters( 'xmlrpc_default_revision_fields', array( 'post_date', 'post_date_gmt' ), 'wp.getRevisions' ); - } - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.getRevisions' ); - - if ( ! $post = get_post( $post_id ) ) - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - - if ( ! current_user_can( 'edit_post', $post_id ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) ); - - // Check if revisions are enabled. - if ( ! wp_revisions_enabled( $post ) ) - return new IXR_Error( 401, __( 'Sorry, revisions are disabled.' ) ); - - $revisions = wp_get_post_revisions( $post_id ); - - if ( ! $revisions ) - return array(); - - $struct = array(); - - foreach ( $revisions as $revision ) { - if ( ! current_user_can( 'read_post', $revision->ID ) ) - continue; - - // Skip autosaves - if ( wp_is_post_autosave( $revision ) ) - continue; - - $struct[] = $this->_prepare_post( get_object_vars( $revision ), $fields ); - } - - return $struct; - } - - /** - * Restore a post revision - * - * @since 3.5.0 - * - * @uses wp_restore_post_revision() - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type int $revision_id - * } - * @return bool|IXR_Error false if there was an error restoring, true if success. - */ - public function wp_restoreRevision( $args ) { - if ( ! $this->minimum_args( $args, 3 ) ) - return $this->error; - - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - $revision_id = (int) $args[3]; - - if ( ! $user = $this->login( $username, $password ) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'wp.restoreRevision' ); - - if ( ! $revision = wp_get_post_revision( $revision_id ) ) - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - - if ( wp_is_post_autosave( $revision ) ) - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - - if ( ! $post = get_post( $revision->post_parent ) ) - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - - if ( ! current_user_can( 'edit_post', $revision->post_parent ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); - - // Check if revisions are disabled. - if ( ! wp_revisions_enabled( $post ) ) - return new IXR_Error( 401, __( 'Sorry, revisions are disabled.' ) ); - - $post = wp_restore_post_revision( $revision_id ); - - return (bool) $post; - } - - /* Blogger API functions. - * specs on http://plant.blogger.com/api and https://groups.yahoo.com/group/bloggerDev/ - */ - - /** - * Retrieve blogs that user owns. - * - * Will make more sense once we support multiple blogs. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function blogger_getUsersBlogs($args) { - if ( ! $this->minimum_args( $args, 3 ) ) { - return $this->error; - } - - if ( is_multisite() ) { - return $this->_multisite_getUsersBlogs($args); - } - - $this->escape($args); - - $username = $args[1]; - $password = $args[2]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'blogger.getUsersBlogs' ); - - $is_admin = current_user_can('manage_options'); - - $struct = array( - 'isAdmin' => $is_admin, - 'url' => get_option('home') . '/', - 'blogid' => '1', - 'blogName' => get_option('blogname'), - 'xmlrpc' => site_url( 'xmlrpc.php', 'rpc' ), - ); - - return array($struct); - } - - /** - * Private function for retrieving a users blogs for multisite setups - * - * @since 3.0.0 - * @access protected - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type string $username Username. - * @type string $password Password. - * } - * @return array|IXR_Error - */ - protected function _multisite_getUsersBlogs( $args ) { - $current_blog = get_site(); - - $domain = $current_blog->domain; - $path = $current_blog->path . 'xmlrpc.php'; - - $rpc = new IXR_Client( set_url_scheme( "http://{$domain}{$path}" ) ); - $rpc->query('wp.getUsersBlogs', $args[1], $args[2]); - $blogs = $rpc->getResponse(); - - if ( isset($blogs['faultCode']) ) - return new IXR_Error($blogs['faultCode'], $blogs['faultString']); - - if ( $_SERVER['HTTP_HOST'] == $domain && $_SERVER['REQUEST_URI'] == $path ) { - return $blogs; - } else { - foreach ( (array) $blogs as $blog ) { - if ( strpos($blog['url'], $_SERVER['HTTP_HOST']) ) - return array($blog); - } - return array(); - } - } - - /** - * Retrieve user's data. - * - * Gives your client some info about you, so you don't have to. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function blogger_getUserInfo( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( !current_user_can( 'edit_posts' ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to access user data on this site.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'blogger.getUserInfo' ); - - $struct = array( - 'nickname' => $user->nickname, - 'userid' => $user->ID, - 'url' => $user->user_url, - 'lastname' => $user->last_name, - 'firstname' => $user->first_name - ); - - return $struct; - } - - /** - * Retrieve post. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type int $post_ID - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function blogger_getPost( $args ) { - $this->escape( $args ); - - $post_ID = (int) $args[1]; - $username = $args[2]; - $password = $args[3]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - $post_data = get_post($post_ID, ARRAY_A); - if ( ! $post_data ) - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - - if ( !current_user_can( 'edit_post', $post_ID ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'blogger.getPost' ); - - $categories = implode(',', wp_get_post_categories($post_ID)); - - $content = '<title>'.wp_unslash($post_data['post_title']).''; - $content .= ''.$categories.''; - $content .= wp_unslash($post_data['post_content']); - - $struct = array( - 'userid' => $post_data['post_author'], - 'dateCreated' => $this->_convert_date( $post_data['post_date'] ), - 'content' => $content, - 'postid' => (string) $post_data['ID'] - ); - - return $struct; - } - - /** - * Retrieve list of recent posts. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type string $appkey (unused) - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type int $numberposts (optional) - * } - * @return array|IXR_Error - */ - public function blogger_getRecentPosts( $args ) { - - $this->escape($args); - - // $args[0] = appkey - ignored - $username = $args[2]; - $password = $args[3]; - if ( isset( $args[4] ) ) - $query = array( 'numberposts' => absint( $args[4] ) ); - else - $query = array(); - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( ! current_user_can( 'edit_posts' ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'blogger.getRecentPosts' ); - - $posts_list = wp_get_recent_posts( $query ); - - if ( !$posts_list ) { - $this->error = new IXR_Error(500, __('Either there are no posts, or something went wrong.')); - return $this->error; - } - - $recent_posts = array(); - foreach ($posts_list as $entry) { - if ( !current_user_can( 'edit_post', $entry['ID'] ) ) - continue; - - $post_date = $this->_convert_date( $entry['post_date'] ); - $categories = implode(',', wp_get_post_categories($entry['ID'])); - - $content = ''.wp_unslash($entry['post_title']).''; - $content .= ''.$categories.''; - $content .= wp_unslash($entry['post_content']); - - $recent_posts[] = array( - 'userid' => $entry['post_author'], - 'dateCreated' => $post_date, - 'content' => $content, - 'postid' => (string) $entry['ID'], - ); - } - - return $recent_posts; - } - - /** - * Deprecated. - * - * @since 1.5.0 - * @deprecated 3.5.0 - * - * @param array $args Unused. - * @return IXR_Error Error object. - */ - public function blogger_getTemplate($args) { - return new IXR_Error( 403, __('Sorry, that file cannot be edited.' ) ); - } - - /** - * Deprecated. - * - * @since 1.5.0 - * @deprecated 3.5.0 - * - * @param array $args Unused. - * @return IXR_Error Error object. - */ - public function blogger_setTemplate($args) { - return new IXR_Error( 403, __('Sorry, that file cannot be edited.' ) ); - } - - /** - * Creates new post. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type string $appkey (unused) - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type string $content - * @type string $publish - * } - * @return int|IXR_Error - */ - public function blogger_newPost( $args ) { - $this->escape( $args ); - - $username = $args[2]; - $password = $args[3]; - $content = $args[4]; - $publish = $args[5]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'blogger.newPost' ); - - $cap = ($publish) ? 'publish_posts' : 'edit_posts'; - if ( ! current_user_can( get_post_type_object( 'post' )->cap->create_posts ) || !current_user_can($cap) ) - return new IXR_Error(401, __('Sorry, you are not allowed to post on this site.')); - - $post_status = ($publish) ? 'publish' : 'draft'; - - $post_author = $user->ID; - - $post_title = xmlrpc_getposttitle($content); - $post_category = xmlrpc_getpostcategory($content); - $post_content = xmlrpc_removepostdata($content); - - $post_date = current_time('mysql'); - $post_date_gmt = current_time('mysql', 1); - - $post_data = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status'); - - $post_ID = wp_insert_post($post_data); - if ( is_wp_error( $post_ID ) ) - return new IXR_Error(500, $post_ID->get_error_message()); - - if ( !$post_ID ) - return new IXR_Error(500, __('Sorry, your entry could not be posted.')); - - $this->attach_uploads( $post_ID, $post_content ); - - /** - * Fires after a new post has been successfully created via the XML-RPC Blogger API. - * - * @since 3.4.0 - * - * @param int $post_ID ID of the new post. - * @param array $args An array of new post arguments. - */ - do_action( 'xmlrpc_call_success_blogger_newPost', $post_ID, $args ); - - return $post_ID; - } - - /** - * Edit a post. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type int $post_ID - * @type string $username - * @type string $password - * @type string $content - * @type bool $publish - * } - * @return true|IXR_Error true when done. - */ - public function blogger_editPost( $args ) { - - $this->escape($args); - - $post_ID = (int) $args[1]; - $username = $args[2]; - $password = $args[3]; - $content = $args[4]; - $publish = $args[5]; - - if ( ! $user = $this->login( $username, $password ) ) { - return $this->error; - } - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'blogger.editPost' ); - - $actual_post = get_post( $post_ID, ARRAY_A ); - - if ( ! $actual_post || $actual_post['post_type'] != 'post' ) { - return new IXR_Error( 404, __( 'Sorry, no such post.' ) ); - } - - $this->escape($actual_post); - - if ( ! current_user_can( 'edit_post', $post_ID ) ) { - return new IXR_Error(401, __('Sorry, you are not allowed to edit this post.')); - } - if ( 'publish' == $actual_post['post_status'] && ! current_user_can( 'publish_posts' ) ) { - return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) ); - } - - $postdata = array(); - $postdata['ID'] = $actual_post['ID']; - $postdata['post_content'] = xmlrpc_removepostdata( $content ); - $postdata['post_title'] = xmlrpc_getposttitle( $content ); - $postdata['post_category'] = xmlrpc_getpostcategory( $content ); - $postdata['post_status'] = $actual_post['post_status']; - $postdata['post_excerpt'] = $actual_post['post_excerpt']; - $postdata['post_status'] = $publish ? 'publish' : 'draft'; - - $result = wp_update_post( $postdata ); - - if ( ! $result ) { - return new IXR_Error(500, __('For some strange yet very annoying reason, this post could not be edited.')); - } - $this->attach_uploads( $actual_post['ID'], $postdata['post_content'] ); - - /** - * Fires after a post has been successfully updated via the XML-RPC Blogger API. - * - * @since 3.4.0 - * - * @param int $post_ID ID of the updated post. - * @param array $args An array of arguments for the post to edit. - */ - do_action( 'xmlrpc_call_success_blogger_editPost', $post_ID, $args ); - - return true; - } - - /** - * Remove a post. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type int $post_ID - * @type string $username - * @type string $password - * } - * @return true|IXR_Error True when post is deleted. - */ - public function blogger_deletePost( $args ) { - $this->escape( $args ); - - $post_ID = (int) $args[1]; - $username = $args[2]; - $password = $args[3]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'blogger.deletePost' ); - - $actual_post = get_post( $post_ID, ARRAY_A ); - - if ( ! $actual_post || $actual_post['post_type'] != 'post' ) { - return new IXR_Error( 404, __( 'Sorry, no such post.' ) ); - } - - if ( ! current_user_can( 'delete_post', $post_ID ) ) { - return new IXR_Error( 401, __( 'Sorry, you are not allowed to delete this post.' ) ); - } - - $result = wp_delete_post( $post_ID ); - - if ( ! $result ) { - return new IXR_Error( 500, __( 'The post cannot be deleted.' ) ); - } - - /** - * Fires after a post has been successfully deleted via the XML-RPC Blogger API. - * - * @since 3.4.0 - * - * @param int $post_ID ID of the deleted post. - * @param array $args An array of arguments to delete the post. - */ - do_action( 'xmlrpc_call_success_blogger_deletePost', $post_ID, $args ); - - return true; - } - - /* MetaWeblog API functions - * specs on wherever Dave Winer wants them to be - */ - - /** - * Create a new post. - * - * The 'content_struct' argument must contain: - * - title - * - description - * - mt_excerpt - * - mt_text_more - * - mt_keywords - * - mt_tb_ping_urls - * - categories - * - * Also, it can optionally contain: - * - wp_slug - * - wp_password - * - wp_page_parent_id - * - wp_page_order - * - wp_author_id - * - post_status | page_status - can be 'draft', 'private', 'publish', or 'pending' - * - mt_allow_comments - can be 'open' or 'closed' - * - mt_allow_pings - can be 'open' or 'closed' - * - date_created_gmt - * - dateCreated - * - wp_post_thumbnail - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type array $content_struct - * @type int $publish - * } - * @return int|IXR_Error - */ - public function mw_newPost($args) { - $this->escape($args); - - $username = $args[1]; - $password = $args[2]; - $content_struct = $args[3]; - $publish = isset( $args[4] ) ? $args[4] : 0; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'metaWeblog.newPost' ); - - $page_template = ''; - if ( !empty( $content_struct['post_type'] ) ) { - if ( $content_struct['post_type'] == 'page' ) { - if ( $publish ) - $cap = 'publish_pages'; - elseif ( isset( $content_struct['page_status'] ) && 'publish' == $content_struct['page_status'] ) - $cap = 'publish_pages'; - else - $cap = 'edit_pages'; - $error_message = __( 'Sorry, you are not allowed to publish pages on this site.' ); - $post_type = 'page'; - if ( !empty( $content_struct['wp_page_template'] ) ) - $page_template = $content_struct['wp_page_template']; - } elseif ( $content_struct['post_type'] == 'post' ) { - if ( $publish ) - $cap = 'publish_posts'; - elseif ( isset( $content_struct['post_status'] ) && 'publish' == $content_struct['post_status'] ) - $cap = 'publish_posts'; - else - $cap = 'edit_posts'; - $error_message = __( 'Sorry, you are not allowed to publish posts on this site.' ); - $post_type = 'post'; - } else { - // No other post_type values are allowed here - return new IXR_Error( 401, __( 'Invalid post type.' ) ); - } - } else { - if ( $publish ) - $cap = 'publish_posts'; - elseif ( isset( $content_struct['post_status'] ) && 'publish' == $content_struct['post_status']) - $cap = 'publish_posts'; - else - $cap = 'edit_posts'; - $error_message = __( 'Sorry, you are not allowed to publish posts on this site.' ); - $post_type = 'post'; - } - - if ( ! current_user_can( get_post_type_object( $post_type )->cap->create_posts ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish posts on this site.' ) ); - if ( !current_user_can( $cap ) ) - return new IXR_Error( 401, $error_message ); - - // Check for a valid post format if one was given - if ( isset( $content_struct['wp_post_format'] ) ) { - $content_struct['wp_post_format'] = sanitize_key( $content_struct['wp_post_format'] ); - if ( !array_key_exists( $content_struct['wp_post_format'], get_post_format_strings() ) ) { - return new IXR_Error( 404, __( 'Invalid post format.' ) ); - } - } - - // Let WordPress generate the post_name (slug) unless - // one has been provided. - $post_name = ""; - if ( isset($content_struct['wp_slug']) ) - $post_name = $content_struct['wp_slug']; - - // Only use a password if one was given. - if ( isset($content_struct['wp_password']) ) - $post_password = $content_struct['wp_password']; - - // Only set a post parent if one was provided. - if ( isset($content_struct['wp_page_parent_id']) ) - $post_parent = $content_struct['wp_page_parent_id']; - - // Only set the menu_order if it was provided. - if ( isset($content_struct['wp_page_order']) ) - $menu_order = $content_struct['wp_page_order']; - - $post_author = $user->ID; - - // If an author id was provided then use it instead. - if ( isset( $content_struct['wp_author_id'] ) && ( $user->ID != $content_struct['wp_author_id'] ) ) { - switch ( $post_type ) { - case "post": - if ( !current_user_can( 'edit_others_posts' ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to create posts as this user.' ) ); - break; - case "page": - if ( !current_user_can( 'edit_others_pages' ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to create pages as this user.' ) ); - break; - default: - return new IXR_Error( 401, __( 'Invalid post type.' ) ); - } - $author = get_userdata( $content_struct['wp_author_id'] ); - if ( ! $author ) - return new IXR_Error( 404, __( 'Invalid author ID.' ) ); - $post_author = $content_struct['wp_author_id']; - } - - $post_title = isset( $content_struct['title'] ) ? $content_struct['title'] : null; - $post_content = isset( $content_struct['description'] ) ? $content_struct['description'] : null; - - $post_status = $publish ? 'publish' : 'draft'; - - if ( isset( $content_struct["{$post_type}_status"] ) ) { - switch ( $content_struct["{$post_type}_status"] ) { - case 'draft': - case 'pending': - case 'private': - case 'publish': - $post_status = $content_struct["{$post_type}_status"]; - break; - default: - $post_status = $publish ? 'publish' : 'draft'; - break; - } - } - - $post_excerpt = isset($content_struct['mt_excerpt']) ? $content_struct['mt_excerpt'] : null; - $post_more = isset($content_struct['mt_text_more']) ? $content_struct['mt_text_more'] : null; - - $tags_input = isset($content_struct['mt_keywords']) ? $content_struct['mt_keywords'] : null; - - if ( isset($content_struct['mt_allow_comments']) ) { - if ( !is_numeric($content_struct['mt_allow_comments']) ) { - switch ( $content_struct['mt_allow_comments'] ) { - case 'closed': - $comment_status = 'closed'; - break; - case 'open': - $comment_status = 'open'; - break; - default: - $comment_status = get_default_comment_status( $post_type ); - break; - } - } else { - switch ( (int) $content_struct['mt_allow_comments'] ) { - case 0: - case 2: - $comment_status = 'closed'; - break; - case 1: - $comment_status = 'open'; - break; - default: - $comment_status = get_default_comment_status( $post_type ); - break; - } - } - } else { - $comment_status = get_default_comment_status( $post_type ); - } - - if ( isset($content_struct['mt_allow_pings']) ) { - if ( !is_numeric($content_struct['mt_allow_pings']) ) { - switch ( $content_struct['mt_allow_pings'] ) { - case 'closed': - $ping_status = 'closed'; - break; - case 'open': - $ping_status = 'open'; - break; - default: - $ping_status = get_default_comment_status( $post_type, 'pingback' ); - break; - } - } else { - switch ( (int) $content_struct['mt_allow_pings'] ) { - case 0: - $ping_status = 'closed'; - break; - case 1: - $ping_status = 'open'; - break; - default: - $ping_status = get_default_comment_status( $post_type, 'pingback' ); - break; - } - } - } else { - $ping_status = get_default_comment_status( $post_type, 'pingback' ); - } - - if ( $post_more ) - $post_content = $post_content . '' . $post_more; - - $to_ping = null; - if ( isset( $content_struct['mt_tb_ping_urls'] ) ) { - $to_ping = $content_struct['mt_tb_ping_urls']; - if ( is_array($to_ping) ) - $to_ping = implode(' ', $to_ping); - } - - // Do some timestamp voodoo - if ( !empty( $content_struct['date_created_gmt'] ) ) - // We know this is supposed to be GMT, so we're going to slap that Z on there by force - $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; - elseif ( !empty( $content_struct['dateCreated']) ) - $dateCreated = $content_struct['dateCreated']->getIso(); - - if ( !empty( $dateCreated ) ) { - $post_date = get_date_from_gmt(iso8601_to_datetime($dateCreated)); - $post_date_gmt = iso8601_to_datetime($dateCreated, 'GMT'); - } else { - $post_date = ''; - $post_date_gmt = ''; - } - - $post_category = array(); - if ( isset( $content_struct['categories'] ) ) { - $catnames = $content_struct['categories']; - - if ( is_array($catnames) ) { - foreach ($catnames as $cat) { - $post_category[] = get_cat_ID($cat); - } - } - } - - $postdata = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'to_ping', 'post_type', 'post_name', 'post_password', 'post_parent', 'menu_order', 'tags_input', 'page_template'); - - $post_ID = $postdata['ID'] = get_default_post_to_edit( $post_type, true )->ID; - - // Only posts can be sticky - if ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) { - $data = $postdata; - $data['sticky'] = $content_struct['sticky']; - $error = $this->_toggle_sticky( $data ); - if ( $error ) { - return $error; - } - } - - if ( isset($content_struct['custom_fields']) ) - $this->set_custom_fields($post_ID, $content_struct['custom_fields']); - - if ( isset ( $content_struct['wp_post_thumbnail'] ) ) { - if ( set_post_thumbnail( $post_ID, $content_struct['wp_post_thumbnail'] ) === false ) - return new IXR_Error( 404, __( 'Invalid attachment ID.' ) ); - - unset( $content_struct['wp_post_thumbnail'] ); - } - - // Handle enclosures - $thisEnclosure = isset($content_struct['enclosure']) ? $content_struct['enclosure'] : null; - $this->add_enclosure_if_new($post_ID, $thisEnclosure); - - $this->attach_uploads( $post_ID, $post_content ); - - // Handle post formats if assigned, value is validated earlier - // in this function - if ( isset( $content_struct['wp_post_format'] ) ) - set_post_format( $post_ID, $content_struct['wp_post_format'] ); - - $post_ID = wp_insert_post( $postdata, true ); - if ( is_wp_error( $post_ID ) ) - return new IXR_Error(500, $post_ID->get_error_message()); - - if ( !$post_ID ) - return new IXR_Error(500, __('Sorry, your entry could not be posted.')); - - /** - * Fires after a new post has been successfully created via the XML-RPC MovableType API. - * - * @since 3.4.0 - * - * @param int $post_ID ID of the new post. - * @param array $args An array of arguments to create the new post. - */ - do_action( 'xmlrpc_call_success_mw_newPost', $post_ID, $args ); - - return strval($post_ID); - } - - /** - * Adds an enclosure to a post if it's new. - * - * @since 2.8.0 - * - * @param integer $post_ID Post ID. - * @param array $enclosure Enclosure data. - */ - public function add_enclosure_if_new( $post_ID, $enclosure ) { - if ( is_array( $enclosure ) && isset( $enclosure['url'] ) && isset( $enclosure['length'] ) && isset( $enclosure['type'] ) ) { - $encstring = $enclosure['url'] . "\n" . $enclosure['length'] . "\n" . $enclosure['type'] . "\n"; - $found = false; - if ( $enclosures = get_post_meta( $post_ID, 'enclosure' ) ) { - foreach ( $enclosures as $enc ) { - // This method used to omit the trailing new line. #23219 - if ( rtrim( $enc, "\n" ) == rtrim( $encstring, "\n" ) ) { - $found = true; - break; - } - } - } - if ( ! $found ) - add_post_meta( $post_ID, 'enclosure', $encstring ); - } - } - - /** - * Attach upload to a post. - * - * @since 2.1.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $post_ID Post ID. - * @param string $post_content Post Content for attachment. - */ - public function attach_uploads( $post_ID, $post_content ) { - global $wpdb; - - // find any unattached files - $attachments = $wpdb->get_results( "SELECT ID, guid FROM {$wpdb->posts} WHERE post_parent = '0' AND post_type = 'attachment'" ); - if ( is_array( $attachments ) ) { - foreach ( $attachments as $file ) { - if ( ! empty( $file->guid ) && strpos( $post_content, $file->guid ) !== false ) - $wpdb->update($wpdb->posts, array('post_parent' => $post_ID), array('ID' => $file->ID) ); - } - } - } - - /** - * Edit a post. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type array $content_struct - * @type int $publish - * } - * @return bool|IXR_Error True on success. - */ - public function mw_editPost( $args ) { - $this->escape( $args ); - - $post_ID = (int) $args[0]; - $username = $args[1]; - $password = $args[2]; - $content_struct = $args[3]; - $publish = isset( $args[4] ) ? $args[4] : 0; - - if ( ! $user = $this->login($username, $password) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'metaWeblog.editPost' ); - - $postdata = get_post( $post_ID, ARRAY_A ); - - /* - * If there is no post data for the give post id, stop now and return an error. - * Otherwise a new post will be created (which was the old behavior). - */ - if ( ! $postdata || empty( $postdata[ 'ID' ] ) ) - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - - if ( ! current_user_can( 'edit_post', $post_ID ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); - - // Use wp.editPost to edit post types other than post and page. - if ( ! in_array( $postdata[ 'post_type' ], array( 'post', 'page' ) ) ) - return new IXR_Error( 401, __( 'Invalid post type.' ) ); - - // Thwart attempt to change the post type. - if ( ! empty( $content_struct[ 'post_type' ] ) && ( $content_struct['post_type'] != $postdata[ 'post_type' ] ) ) - return new IXR_Error( 401, __( 'The post type may not be changed.' ) ); - - // Check for a valid post format if one was given - if ( isset( $content_struct['wp_post_format'] ) ) { - $content_struct['wp_post_format'] = sanitize_key( $content_struct['wp_post_format'] ); - if ( !array_key_exists( $content_struct['wp_post_format'], get_post_format_strings() ) ) { - return new IXR_Error( 404, __( 'Invalid post format.' ) ); - } - } - - $this->escape($postdata); - - $ID = $postdata['ID']; - $post_content = $postdata['post_content']; - $post_title = $postdata['post_title']; - $post_excerpt = $postdata['post_excerpt']; - $post_password = $postdata['post_password']; - $post_parent = $postdata['post_parent']; - $post_type = $postdata['post_type']; - $menu_order = $postdata['menu_order']; - - // Let WordPress manage slug if none was provided. - $post_name = $postdata['post_name']; - if ( isset($content_struct['wp_slug']) ) - $post_name = $content_struct['wp_slug']; - - // Only use a password if one was given. - if ( isset($content_struct['wp_password']) ) - $post_password = $content_struct['wp_password']; - - // Only set a post parent if one was given. - if ( isset($content_struct['wp_page_parent_id']) ) - $post_parent = $content_struct['wp_page_parent_id']; - - // Only set the menu_order if it was given. - if ( isset($content_struct['wp_page_order']) ) - $menu_order = $content_struct['wp_page_order']; - - $page_template = null; - if ( ! empty( $content_struct['wp_page_template'] ) && 'page' == $post_type ) - $page_template = $content_struct['wp_page_template']; - - $post_author = $postdata['post_author']; - - // Only set the post_author if one is set. - if ( isset( $content_struct['wp_author_id'] ) ) { - // Check permissions if attempting to switch author to or from another user. - if ( $user->ID != $content_struct['wp_author_id'] || $user->ID != $post_author ) { - switch ( $post_type ) { - case 'post': - if ( ! current_user_can( 'edit_others_posts' ) ) { - return new IXR_Error( 401, __( 'Sorry, you are not allowed to change the post author as this user.' ) ); - } - break; - case 'page': - if ( ! current_user_can( 'edit_others_pages' ) ) { - return new IXR_Error( 401, __( 'Sorry, you are not allowed to change the page author as this user.' ) ); - } - break; - default: - return new IXR_Error( 401, __( 'Invalid post type.' ) ); - } - $post_author = $content_struct['wp_author_id']; - } - } - - if ( isset($content_struct['mt_allow_comments']) ) { - if ( !is_numeric($content_struct['mt_allow_comments']) ) { - switch ( $content_struct['mt_allow_comments'] ) { - case 'closed': - $comment_status = 'closed'; - break; - case 'open': - $comment_status = 'open'; - break; - default: - $comment_status = get_default_comment_status( $post_type ); - break; - } - } else { - switch ( (int) $content_struct['mt_allow_comments'] ) { - case 0: - case 2: - $comment_status = 'closed'; - break; - case 1: - $comment_status = 'open'; - break; - default: - $comment_status = get_default_comment_status( $post_type ); - break; - } - } - } - - if ( isset($content_struct['mt_allow_pings']) ) { - if ( !is_numeric($content_struct['mt_allow_pings']) ) { - switch ( $content_struct['mt_allow_pings'] ) { - case 'closed': - $ping_status = 'closed'; - break; - case 'open': - $ping_status = 'open'; - break; - default: - $ping_status = get_default_comment_status( $post_type, 'pingback' ); - break; - } - } else { - switch ( (int) $content_struct["mt_allow_pings"] ) { - case 0: - $ping_status = 'closed'; - break; - case 1: - $ping_status = 'open'; - break; - default: - $ping_status = get_default_comment_status( $post_type, 'pingback' ); - break; - } - } - } - - if ( isset( $content_struct['title'] ) ) - $post_title = $content_struct['title']; - - if ( isset( $content_struct['description'] ) ) - $post_content = $content_struct['description']; - - $post_category = array(); - if ( isset( $content_struct['categories'] ) ) { - $catnames = $content_struct['categories']; - if ( is_array($catnames) ) { - foreach ($catnames as $cat) { - $post_category[] = get_cat_ID($cat); - } - } - } - - if ( isset( $content_struct['mt_excerpt'] ) ) - $post_excerpt = $content_struct['mt_excerpt']; - - $post_more = isset( $content_struct['mt_text_more'] ) ? $content_struct['mt_text_more'] : null; - - $post_status = $publish ? 'publish' : 'draft'; - if ( isset( $content_struct["{$post_type}_status"] ) ) { - switch( $content_struct["{$post_type}_status"] ) { - case 'draft': - case 'pending': - case 'private': - case 'publish': - $post_status = $content_struct["{$post_type}_status"]; - break; - default: - $post_status = $publish ? 'publish' : 'draft'; - break; - } - } - - $tags_input = isset( $content_struct['mt_keywords'] ) ? $content_struct['mt_keywords'] : null; - - if ( 'publish' == $post_status || 'private' == $post_status ) { - if ( 'page' == $post_type && ! current_user_can( 'publish_pages' ) ) { - return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this page.' ) ); - } elseif ( ! current_user_can( 'publish_posts' ) ) { - return new IXR_Error( 401, __( 'Sorry, you are not allowed to publish this post.' ) ); - } - } - - if ( $post_more ) - $post_content = $post_content . "" . $post_more; - - $to_ping = null; - if ( isset( $content_struct['mt_tb_ping_urls'] ) ) { - $to_ping = $content_struct['mt_tb_ping_urls']; - if ( is_array($to_ping) ) - $to_ping = implode(' ', $to_ping); - } - - // Do some timestamp voodoo. - if ( !empty( $content_struct['date_created_gmt'] ) ) - // We know this is supposed to be GMT, so we're going to slap that Z on there by force. - $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; - elseif ( !empty( $content_struct['dateCreated']) ) - $dateCreated = $content_struct['dateCreated']->getIso(); - - // Default to not flagging the post date to be edited unless it's intentional. - $edit_date = false; - - if ( !empty( $dateCreated ) ) { - $post_date = get_date_from_gmt(iso8601_to_datetime($dateCreated)); - $post_date_gmt = iso8601_to_datetime($dateCreated, 'GMT'); - - // Flag the post date to be edited. - $edit_date = true; - } else { - $post_date = $postdata['post_date']; - $post_date_gmt = $postdata['post_date_gmt']; - } - - // We've got all the data -- post it. - $newpost = compact('ID', 'post_content', 'post_title', 'post_category', 'post_status', 'post_excerpt', 'comment_status', 'ping_status', 'edit_date', 'post_date', 'post_date_gmt', 'to_ping', 'post_name', 'post_password', 'post_parent', 'menu_order', 'post_author', 'tags_input', 'page_template'); - - $result = wp_update_post($newpost, true); - if ( is_wp_error( $result ) ) - return new IXR_Error(500, $result->get_error_message()); - - if ( !$result ) - return new IXR_Error(500, __('Sorry, your entry could not be edited.')); - - // Only posts can be sticky - if ( $post_type == 'post' && isset( $content_struct['sticky'] ) ) { - $data = $newpost; - $data['sticky'] = $content_struct['sticky']; - $data['post_type'] = 'post'; - $error = $this->_toggle_sticky( $data, true ); - if ( $error ) { - return $error; - } - } - - if ( isset($content_struct['custom_fields']) ) - $this->set_custom_fields($post_ID, $content_struct['custom_fields']); - - if ( isset ( $content_struct['wp_post_thumbnail'] ) ) { - - // Empty value deletes, non-empty value adds/updates. - if ( empty( $content_struct['wp_post_thumbnail'] ) ) { - delete_post_thumbnail( $post_ID ); - } else { - if ( set_post_thumbnail( $post_ID, $content_struct['wp_post_thumbnail'] ) === false ) - return new IXR_Error( 404, __( 'Invalid attachment ID.' ) ); - } - unset( $content_struct['wp_post_thumbnail'] ); - } - - // Handle enclosures. - $thisEnclosure = isset($content_struct['enclosure']) ? $content_struct['enclosure'] : null; - $this->add_enclosure_if_new($post_ID, $thisEnclosure); - - $this->attach_uploads( $ID, $post_content ); - - // Handle post formats if assigned, validation is handled earlier in this function. - if ( isset( $content_struct['wp_post_format'] ) ) - set_post_format( $post_ID, $content_struct['wp_post_format'] ); - - /** - * Fires after a post has been successfully updated via the XML-RPC MovableType API. - * - * @since 3.4.0 - * - * @param int $post_ID ID of the updated post. - * @param array $args An array of arguments to update the post. - */ - do_action( 'xmlrpc_call_success_mw_editPost', $post_ID, $args ); - - return true; - } - - /** - * Retrieve post. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type int $post_ID - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function mw_getPost( $args ) { - $this->escape( $args ); - - $post_ID = (int) $args[0]; - $username = $args[1]; - $password = $args[2]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - $postdata = get_post($post_ID, ARRAY_A); - if ( ! $postdata ) - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - - if ( !current_user_can( 'edit_post', $post_ID ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'metaWeblog.getPost' ); - - if ($postdata['post_date'] != '') { - $post_date = $this->_convert_date( $postdata['post_date'] ); - $post_date_gmt = $this->_convert_date_gmt( $postdata['post_date_gmt'], $postdata['post_date'] ); - $post_modified = $this->_convert_date( $postdata['post_modified'] ); - $post_modified_gmt = $this->_convert_date_gmt( $postdata['post_modified_gmt'], $postdata['post_modified'] ); - - $categories = array(); - $catids = wp_get_post_categories($post_ID); - foreach ($catids as $catid) - $categories[] = get_cat_name($catid); - - $tagnames = array(); - $tags = wp_get_post_tags( $post_ID ); - if ( !empty( $tags ) ) { - foreach ( $tags as $tag ) - $tagnames[] = $tag->name; - $tagnames = implode( ', ', $tagnames ); - } else { - $tagnames = ''; - } - - $post = get_extended($postdata['post_content']); - $link = get_permalink($postdata['ID']); - - // Get the author info. - $author = get_userdata($postdata['post_author']); - - $allow_comments = ('open' == $postdata['comment_status']) ? 1 : 0; - $allow_pings = ('open' == $postdata['ping_status']) ? 1 : 0; - - // Consider future posts as published - if ( $postdata['post_status'] === 'future' ) - $postdata['post_status'] = 'publish'; - - // Get post format - $post_format = get_post_format( $post_ID ); - if ( empty( $post_format ) ) - $post_format = 'standard'; - - $sticky = false; - if ( is_sticky( $post_ID ) ) - $sticky = true; - - $enclosure = array(); - foreach ( (array) get_post_custom($post_ID) as $key => $val) { - if ($key == 'enclosure') { - foreach ( (array) $val as $enc ) { - $encdata = explode("\n", $enc); - $enclosure['url'] = trim(htmlspecialchars($encdata[0])); - $enclosure['length'] = (int) trim($encdata[1]); - $enclosure['type'] = trim($encdata[2]); - break 2; - } - } - } - - $resp = array( - 'dateCreated' => $post_date, - 'userid' => $postdata['post_author'], - 'postid' => $postdata['ID'], - 'description' => $post['main'], - 'title' => $postdata['post_title'], - 'link' => $link, - 'permaLink' => $link, - // commented out because no other tool seems to use this - // 'content' => $entry['post_content'], - 'categories' => $categories, - 'mt_excerpt' => $postdata['post_excerpt'], - 'mt_text_more' => $post['extended'], - 'wp_more_text' => $post['more_text'], - 'mt_allow_comments' => $allow_comments, - 'mt_allow_pings' => $allow_pings, - 'mt_keywords' => $tagnames, - 'wp_slug' => $postdata['post_name'], - 'wp_password' => $postdata['post_password'], - 'wp_author_id' => (string) $author->ID, - 'wp_author_display_name' => $author->display_name, - 'date_created_gmt' => $post_date_gmt, - 'post_status' => $postdata['post_status'], - 'custom_fields' => $this->get_custom_fields($post_ID), - 'wp_post_format' => $post_format, - 'sticky' => $sticky, - 'date_modified' => $post_modified, - 'date_modified_gmt' => $post_modified_gmt - ); - - if ( !empty($enclosure) ) $resp['enclosure'] = $enclosure; - - $resp['wp_post_thumbnail'] = get_post_thumbnail_id( $postdata['ID'] ); - - return $resp; - } else { - return new IXR_Error(404, __('Sorry, no such post.')); - } - } - - /** - * Retrieve list of recent posts. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type int $numberposts - * } - * @return array|IXR_Error - */ - public function mw_getRecentPosts( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - if ( isset( $args[3] ) ) - $query = array( 'numberposts' => absint( $args[3] ) ); - else - $query = array(); - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( ! current_user_can( 'edit_posts' ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit posts.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'metaWeblog.getRecentPosts' ); - - $posts_list = wp_get_recent_posts( $query ); - - if ( !$posts_list ) - return array(); - - $recent_posts = array(); - foreach ($posts_list as $entry) { - if ( !current_user_can( 'edit_post', $entry['ID'] ) ) - continue; - - $post_date = $this->_convert_date( $entry['post_date'] ); - $post_date_gmt = $this->_convert_date_gmt( $entry['post_date_gmt'], $entry['post_date'] ); - $post_modified = $this->_convert_date( $entry['post_modified'] ); - $post_modified_gmt = $this->_convert_date_gmt( $entry['post_modified_gmt'], $entry['post_modified'] ); - - $categories = array(); - $catids = wp_get_post_categories($entry['ID']); - foreach ( $catids as $catid ) - $categories[] = get_cat_name($catid); - - $tagnames = array(); - $tags = wp_get_post_tags( $entry['ID'] ); - if ( !empty( $tags ) ) { - foreach ( $tags as $tag ) { - $tagnames[] = $tag->name; - } - $tagnames = implode( ', ', $tagnames ); - } else { - $tagnames = ''; - } - - $post = get_extended($entry['post_content']); - $link = get_permalink($entry['ID']); - - // Get the post author info. - $author = get_userdata($entry['post_author']); - - $allow_comments = ('open' == $entry['comment_status']) ? 1 : 0; - $allow_pings = ('open' == $entry['ping_status']) ? 1 : 0; - - // Consider future posts as published - if ( $entry['post_status'] === 'future' ) - $entry['post_status'] = 'publish'; - - // Get post format - $post_format = get_post_format( $entry['ID'] ); - if ( empty( $post_format ) ) - $post_format = 'standard'; - - $recent_posts[] = array( - 'dateCreated' => $post_date, - 'userid' => $entry['post_author'], - 'postid' => (string) $entry['ID'], - 'description' => $post['main'], - 'title' => $entry['post_title'], - 'link' => $link, - 'permaLink' => $link, - // commented out because no other tool seems to use this - // 'content' => $entry['post_content'], - 'categories' => $categories, - 'mt_excerpt' => $entry['post_excerpt'], - 'mt_text_more' => $post['extended'], - 'wp_more_text' => $post['more_text'], - 'mt_allow_comments' => $allow_comments, - 'mt_allow_pings' => $allow_pings, - 'mt_keywords' => $tagnames, - 'wp_slug' => $entry['post_name'], - 'wp_password' => $entry['post_password'], - 'wp_author_id' => (string) $author->ID, - 'wp_author_display_name' => $author->display_name, - 'date_created_gmt' => $post_date_gmt, - 'post_status' => $entry['post_status'], - 'custom_fields' => $this->get_custom_fields($entry['ID']), - 'wp_post_format' => $post_format, - 'date_modified' => $post_modified, - 'date_modified_gmt' => $post_modified_gmt, - 'sticky' => ( $entry['post_type'] === 'post' && is_sticky( $entry['ID'] ) ), - 'wp_post_thumbnail' => get_post_thumbnail_id( $entry['ID'] ) - ); - } - - return $recent_posts; - } - - /** - * Retrieve the list of categories on a given blog. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function mw_getCategories( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( !current_user_can( 'edit_posts' ) ) - return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'metaWeblog.getCategories' ); - - $categories_struct = array(); - - if ( $cats = get_categories(array('get' => 'all')) ) { - foreach ( $cats as $cat ) { - $struct = array(); - $struct['categoryId'] = $cat->term_id; - $struct['parentId'] = $cat->parent; - $struct['description'] = $cat->name; - $struct['categoryDescription'] = $cat->description; - $struct['categoryName'] = $cat->name; - $struct['htmlUrl'] = esc_html(get_category_link($cat->term_id)); - $struct['rssUrl'] = esc_html(get_category_feed_link($cat->term_id, 'rss2')); - - $categories_struct[] = $struct; - } - } - - return $categories_struct; - } - - /** - * Uploads a file, following your settings. - * - * Adapted from a patch by Johann Richard. - * - * @link http://mycvs.org/archives/2004/06/30/file-upload-to-wordpress-in-ecto/ - * - * @since 1.5.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type array $data - * } - * @return array|IXR_Error - */ - public function mw_newMediaObject( $args ) { - global $wpdb; - - $username = $this->escape( $args[1] ); - $password = $this->escape( $args[2] ); - $data = $args[3]; - - $name = sanitize_file_name( $data['name'] ); - $type = $data['type']; - $bits = $data['bits']; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'metaWeblog.newMediaObject' ); - - if ( !current_user_can('upload_files') ) { - $this->error = new IXR_Error( 401, __( 'Sorry, you are not allowed to upload files.' ) ); - return $this->error; - } - - if ( is_multisite() && upload_is_user_over_quota( false ) ) { - $this->error = new IXR_Error( 401, __( 'Sorry, you have used your space allocation.' ) ); - return $this->error; - } - - /** - * Filters whether to preempt the XML-RPC media upload. - * - * Passing a truthy value will effectively short-circuit the media upload, - * returning that value as a 500 error instead. - * - * @since 2.1.0 - * - * @param bool $error Whether to pre-empt the media upload. Default false. - */ - if ( $upload_err = apply_filters( 'pre_upload_error', false ) ) { - return new IXR_Error( 500, $upload_err ); - } - - $upload = wp_upload_bits($name, null, $bits); - if ( ! empty($upload['error']) ) { - /* translators: 1: file name, 2: error message */ - $errorString = sprintf( __( 'Could not write file %1$s (%2$s).' ), $name, $upload['error'] ); - return new IXR_Error( 500, $errorString ); - } - // Construct the attachment array - $post_id = 0; - if ( ! empty( $data['post_id'] ) ) { - $post_id = (int) $data['post_id']; - - if ( ! current_user_can( 'edit_post', $post_id ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); - } - $attachment = array( - 'post_title' => $name, - 'post_content' => '', - 'post_type' => 'attachment', - 'post_parent' => $post_id, - 'post_mime_type' => $type, - 'guid' => $upload[ 'url' ] - ); - - // Save the data - $id = wp_insert_attachment( $attachment, $upload[ 'file' ], $post_id ); - wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $upload['file'] ) ); - - /** - * Fires after a new attachment has been added via the XML-RPC MovableType API. - * - * @since 3.4.0 - * - * @param int $id ID of the new attachment. - * @param array $args An array of arguments to add the attachment. - */ - do_action( 'xmlrpc_call_success_mw_newMediaObject', $id, $args ); - - $struct = $this->_prepare_media_item( get_post( $id ) ); - - // Deprecated values - $struct['id'] = $struct['attachment_id']; - $struct['file'] = $struct['title']; - $struct['url'] = $struct['link']; - - return $struct; - } - - /* MovableType API functions - * specs on http://www.movabletype.org/docs/mtmanual_programmatic.html - */ - - /** - * Retrieve the post titles of recent posts. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * @type int $numberposts - * } - * @return array|IXR_Error - */ - public function mt_getRecentPostTitles( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - if ( isset( $args[3] ) ) - $query = array( 'numberposts' => absint( $args[3] ) ); - else - $query = array(); - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'mt.getRecentPostTitles' ); - - $posts_list = wp_get_recent_posts( $query ); - - if ( !$posts_list ) { - $this->error = new IXR_Error(500, __('Either there are no posts, or something went wrong.')); - return $this->error; - } - - $recent_posts = array(); - - foreach ($posts_list as $entry) { - if ( !current_user_can( 'edit_post', $entry['ID'] ) ) - continue; - - $post_date = $this->_convert_date( $entry['post_date'] ); - $post_date_gmt = $this->_convert_date_gmt( $entry['post_date_gmt'], $entry['post_date'] ); - - $recent_posts[] = array( - 'dateCreated' => $post_date, - 'userid' => $entry['post_author'], - 'postid' => (string) $entry['ID'], - 'title' => $entry['post_title'], - 'post_status' => $entry['post_status'], - 'date_created_gmt' => $post_date_gmt - ); - } - - return $recent_posts; - } - - /** - * Retrieve list of all categories on blog. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $blog_id (unused) - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function mt_getCategoryList( $args ) { - $this->escape( $args ); - - $username = $args[1]; - $password = $args[2]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( !current_user_can( 'edit_posts' ) ) - return new IXR_Error( 401, __( 'Sorry, you must be able to edit posts on this site in order to view categories.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'mt.getCategoryList' ); - - $categories_struct = array(); - - if ( $cats = get_categories(array('hide_empty' => 0, 'hierarchical' => 0)) ) { - foreach ( $cats as $cat ) { - $struct = array(); - $struct['categoryId'] = $cat->term_id; - $struct['categoryName'] = $cat->name; - - $categories_struct[] = $struct; - } - } - - return $categories_struct; - } - - /** - * Retrieve post categories. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $post_ID - * @type string $username - * @type string $password - * } - * @return array|IXR_Error - */ - public function mt_getPostCategories( $args ) { - $this->escape( $args ); - - $post_ID = (int) $args[0]; - $username = $args[1]; - $password = $args[2]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - if ( ! get_post( $post_ID ) ) - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - - if ( !current_user_can( 'edit_post', $post_ID ) ) - return new IXR_Error( 401, __( 'Sorry, you are not allowed to edit this post.' ) ); - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'mt.getPostCategories' ); - - $categories = array(); - $catids = wp_get_post_categories(intval($post_ID)); - // first listed category will be the primary category - $isPrimary = true; - foreach ( $catids as $catid ) { - $categories[] = array( - 'categoryName' => get_cat_name($catid), - 'categoryId' => (string) $catid, - 'isPrimary' => $isPrimary - ); - $isPrimary = false; - } - - return $categories; - } - - /** - * Sets categories for a post. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $post_ID - * @type string $username - * @type string $password - * @type array $categories - * } - * @return true|IXR_Error True on success. - */ - public function mt_setPostCategories( $args ) { - $this->escape( $args ); - - $post_ID = (int) $args[0]; - $username = $args[1]; - $password = $args[2]; - $categories = $args[3]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'mt.setPostCategories' ); - - if ( ! get_post( $post_ID ) ) - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - - if ( !current_user_can('edit_post', $post_ID) ) - return new IXR_Error(401, __('Sorry, you are not allowed to edit this post.')); - - $catids = array(); - foreach ( $categories as $cat ) { - $catids[] = $cat['categoryId']; - } - - wp_set_post_categories($post_ID, $catids); - - return true; - } - - /** - * Retrieve an array of methods supported by this server. - * - * @since 1.5.0 - * - * @return array - */ - public function mt_supportedMethods() { - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'mt.supportedMethods' ); - - return array_keys( $this->methods ); - } - - /** - * Retrieve an empty array because we don't support per-post text filters. - * - * @since 1.5.0 - */ - public function mt_supportedTextFilters() { - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'mt.supportedTextFilters' ); - - /** - * Filters the MoveableType text filters list for XML-RPC. - * - * @since 2.2.0 - * - * @param array $filters An array of text filters. - */ - return apply_filters( 'xmlrpc_text_filters', array() ); - } - - /** - * Retrieve trackbacks sent to a given post. - * - * @since 1.5.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $post_ID - * @return array|IXR_Error - */ - public function mt_getTrackbackPings( $post_ID ) { - global $wpdb; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'mt.getTrackbackPings' ); - - $actual_post = get_post($post_ID, ARRAY_A); - - if ( !$actual_post ) - return new IXR_Error(404, __('Sorry, no such post.')); - - $comments = $wpdb->get_results( $wpdb->prepare("SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d", $post_ID) ); - - if ( !$comments ) - return array(); - - $trackback_pings = array(); - foreach ( $comments as $comment ) { - if ( 'trackback' == $comment->comment_type ) { - $content = $comment->comment_content; - $title = substr($content, 8, (strpos($content, '') - 8)); - $trackback_pings[] = array( - 'pingTitle' => $title, - 'pingURL' => $comment->comment_author_url, - 'pingIP' => $comment->comment_author_IP - ); - } - } - - return $trackback_pings; - } - - /** - * Sets a post's publish status to 'publish'. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type int $post_ID - * @type string $username - * @type string $password - * } - * @return int|IXR_Error - */ - public function mt_publishPost( $args ) { - $this->escape( $args ); - - $post_ID = (int) $args[0]; - $username = $args[1]; - $password = $args[2]; - - if ( !$user = $this->login($username, $password) ) - return $this->error; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'mt.publishPost' ); - - $postdata = get_post($post_ID, ARRAY_A); - if ( ! $postdata ) - return new IXR_Error( 404, __( 'Invalid post ID.' ) ); - - if ( !current_user_can('publish_posts') || !current_user_can('edit_post', $post_ID) ) - return new IXR_Error(401, __('Sorry, you are not allowed to publish this post.')); - - $postdata['post_status'] = 'publish'; - - // retain old cats - $cats = wp_get_post_categories($post_ID); - $postdata['post_category'] = $cats; - $this->escape($postdata); - - return wp_update_post( $postdata ); - } - - /* PingBack functions - * specs on www.hixie.ch/specs/pingback/pingback - */ - - /** - * Retrieves a pingback and registers it. - * - * @since 1.5.0 - * - * @param array $args { - * Method arguments. Note: arguments must be ordered as documented. - * - * @type string $pagelinkedfrom - * @type string $pagelinkedto - * } - * @return string|IXR_Error - */ - public function pingback_ping( $args ) { - global $wpdb; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'pingback.ping' ); - - $this->escape( $args ); - - $pagelinkedfrom = str_replace( '&', '&', $args[0] ); - $pagelinkedto = str_replace( '&', '&', $args[1] ); - $pagelinkedto = str_replace( '&', '&', $pagelinkedto ); - - /** - * Filters the pingback source URI. - * - * @since 3.6.0 - * - * @param string $pagelinkedfrom URI of the page linked from. - * @param string $pagelinkedto URI of the page linked to. - */ - $pagelinkedfrom = apply_filters( 'pingback_ping_source_uri', $pagelinkedfrom, $pagelinkedto ); - - if ( ! $pagelinkedfrom ) - return $this->pingback_error( 0, __( 'A valid URL was not provided.' ) ); - - // Check if the page linked to is in our site - $pos1 = strpos($pagelinkedto, str_replace(array('http://www.','http://','https://www.','https://'), '', get_option('home'))); - if ( !$pos1 ) - return $this->pingback_error( 0, __( 'Is there no link to us?' ) ); - - // let's find which post is linked to - // FIXME: does url_to_postid() cover all these cases already? - // if so, then let's use it and drop the old code. - $urltest = parse_url($pagelinkedto); - if ( $post_ID = url_to_postid($pagelinkedto) ) { - // $way - } elseif ( isset( $urltest['path'] ) && preg_match('#p/[0-9]{1,}#', $urltest['path'], $match) ) { - // the path defines the post_ID (archives/p/XXXX) - $blah = explode('/', $match[0]); - $post_ID = (int) $blah[1]; - } elseif ( isset( $urltest['query'] ) && preg_match('#p=[0-9]{1,}#', $urltest['query'], $match) ) { - // the querystring defines the post_ID (?p=XXXX) - $blah = explode('=', $match[0]); - $post_ID = (int) $blah[1]; - } elseif ( isset($urltest['fragment']) ) { - // an #anchor is there, it's either... - if ( intval($urltest['fragment']) ) { - // ...an integer #XXXX (simplest case) - $post_ID = (int) $urltest['fragment']; - } elseif ( preg_match('/post-[0-9]+/',$urltest['fragment']) ) { - // ...a post id in the form 'post-###' - $post_ID = preg_replace('/[^0-9]+/', '', $urltest['fragment']); - } elseif ( is_string($urltest['fragment']) ) { - // ...or a string #title, a little more complicated - $title = preg_replace('/[^a-z0-9]/i', '.', $urltest['fragment']); - $sql = $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_title RLIKE %s", $title ); - if (! ($post_ID = $wpdb->get_var($sql)) ) { - // returning unknown error '0' is better than die()ing - return $this->pingback_error( 0, '' ); - } - } - } else { - // TODO: Attempt to extract a post ID from the given URL - return $this->pingback_error( 33, __('The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) ); - } - $post_ID = (int) $post_ID; - - $post = get_post($post_ID); - - if ( !$post ) // Post_ID not found - return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) ); - - if ( $post_ID == url_to_postid($pagelinkedfrom) ) - return $this->pingback_error( 0, __( 'The source URL and the target URL cannot both point to the same resource.' ) ); - - // Check if pings are on - if ( !pings_open($post) ) - return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) ); - - // Let's check that the remote site didn't already pingback this entry - if ( $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_author_url = %s", $post_ID, $pagelinkedfrom) ) ) - return $this->pingback_error( 48, __( 'The pingback has already been registered.' ) ); - - // very stupid, but gives time to the 'from' server to publish ! - sleep(1); - - $remote_ip = preg_replace( '/[^0-9a-fA-F:., ]/', '', $_SERVER['REMOTE_ADDR'] ); - - /** This filter is documented in wp-includes/class-http.php */ - $user_agent = apply_filters( 'http_headers_useragent', 'WordPress/' . get_bloginfo( 'version' ) . '; ' . get_bloginfo( 'url' ) ); - - // Let's check the remote site - $http_api_args = array( - 'timeout' => 10, - 'redirection' => 0, - 'limit_response_size' => 153600, // 150 KB - 'user-agent' => "$user_agent; verifying pingback from $remote_ip", - 'headers' => array( - 'X-Pingback-Forwarded-For' => $remote_ip, - ), - ); - - $request = wp_safe_remote_get( $pagelinkedfrom, $http_api_args ); - $remote_source = $remote_source_original = wp_remote_retrieve_body( $request ); - - if ( ! $remote_source ) { - return $this->pingback_error( 16, __( 'The source URL does not exist.' ) ); - } - - /** - * Filters the pingback remote source. - * - * @since 2.5.0 - * - * @param string $remote_source Response source for the page linked from. - * @param string $pagelinkedto URL of the page linked to. - */ - $remote_source = apply_filters( 'pre_remote_source', $remote_source, $pagelinkedto ); - - // Work around bug in strip_tags(): - $remote_source = str_replace( ']*>/", "\n\n", $remote_source ); - - preg_match( '|([^<]*?)|is', $remote_source, $matchtitle ); - $title = isset( $matchtitle[1] ) ? $matchtitle[1] : ''; - if ( empty( $title ) ) { - return $this->pingback_error( 32, __( 'We cannot find a title on that page.' ) ); - } - - $remote_source = strip_tags( $remote_source, '' ); // just keep the tag we need - - $p = explode( "\n\n", $remote_source ); - - $preg_target = preg_quote($pagelinkedto, '|'); - - foreach ( $p as $para ) { - if ( strpos($para, $pagelinkedto) !== false ) { // it exists, but is it a link? - preg_match("|]+?".$preg_target."[^>]*>([^>]+?)|", $para, $context); - - // If the URL isn't in a link context, keep looking - if ( empty($context) ) - continue; - - // We're going to use this fake tag to mark the context in a bit - // the marker is needed in case the link text appears more than once in the paragraph - $excerpt = preg_replace('|\|', '', $para); - - // prevent really long link text - if ( strlen($context[1]) > 100 ) - $context[1] = substr($context[1], 0, 100) . '…'; - - $marker = ''.$context[1].''; // set up our marker - $excerpt= str_replace($context[0], $marker, $excerpt); // swap out the link for our marker - $excerpt = strip_tags($excerpt, ''); // strip all tags but our context marker - $excerpt = trim($excerpt); - $preg_marker = preg_quote($marker, '|'); - $excerpt = preg_replace("|.*?\s(.{0,100}$preg_marker.{0,100})\s.*|s", '$1', $excerpt); - $excerpt = strip_tags($excerpt); // YES, again, to remove the marker wrapper - break; - } - } - - if ( empty($context) ) // Link to target not found - return $this->pingback_error( 17, __( 'The source URL does not contain a link to the target URL, and so cannot be used as a source.' ) ); - - $pagelinkedfrom = str_replace('&', '&', $pagelinkedfrom); - - $context = '[…] ' . esc_html( $excerpt ) . ' […]'; - $pagelinkedfrom = $this->escape( $pagelinkedfrom ); - - $comment_post_ID = (int) $post_ID; - $comment_author = $title; - $comment_author_email = ''; - $this->escape($comment_author); - $comment_author_url = $pagelinkedfrom; - $comment_content = $context; - $this->escape($comment_content); - $comment_type = 'pingback'; - - $commentdata = compact( - 'comment_post_ID', 'comment_author', 'comment_author_url', 'comment_author_email', - 'comment_content', 'comment_type', 'remote_source', 'remote_source_original' - ); - - $comment_ID = wp_new_comment($commentdata); - - /** - * Fires after a post pingback has been sent. - * - * @since 0.71 - * - * @param int $comment_ID Comment ID. - */ - do_action( 'pingback_post', $comment_ID ); - - /* translators: 1: URL of the page linked from, 2: URL of the page linked to */ - return sprintf( __( 'Pingback from %1$s to %2$s registered. Keep the web talking! :-)' ), $pagelinkedfrom, $pagelinkedto ); - } - - /** - * Retrieve array of URLs that pingbacked the given URL. - * - * Specs on http://www.aquarionics.com/misc/archives/blogite/0198.html - * - * @since 1.5.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $url - * @return array|IXR_Error - */ - public function pingback_extensions_getPingbacks( $url ) { - global $wpdb; - - /** This action is documented in wp-includes/class-wp-xmlrpc-server.php */ - do_action( 'xmlrpc_call', 'pingback.extensions.getPingbacks' ); - - $url = $this->escape( $url ); - - $post_ID = url_to_postid($url); - if ( !$post_ID ) { - // We aren't sure that the resource is available and/or pingback enabled - return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either doesn’t exist, or it is not a pingback-enabled resource.' ) ); - } - - $actual_post = get_post($post_ID, ARRAY_A); - - if ( !$actual_post ) { - // No such post = resource not found - return $this->pingback_error( 32, __('The specified target URL does not exist.' ) ); - } - - $comments = $wpdb->get_results( $wpdb->prepare("SELECT comment_author_url, comment_content, comment_author_IP, comment_type FROM $wpdb->comments WHERE comment_post_ID = %d", $post_ID) ); - - if ( !$comments ) - return array(); - - $pingbacks = array(); - foreach ( $comments as $comment ) { - if ( 'pingback' == $comment->comment_type ) - $pingbacks[] = $comment->comment_author_url; - } - - return $pingbacks; - } - - /** - * Sends a pingback error based on the given error code and message. - * - * @since 3.6.0 - * - * @param int $code Error code. - * @param string $message Error message. - * @return IXR_Error Error object. - */ - protected function pingback_error( $code, $message ) { - /** - * Filters the XML-RPC pingback error return. - * - * @since 3.5.1 - * - * @param IXR_Error $error An IXR_Error object containing the error code and message. - */ - return apply_filters( 'xmlrpc_pingback_error', new IXR_Error( $code, $message ) ); - } -} diff --git a/wp/wp-includes/class-wp.php b/wp/wp-includes/class-wp.php deleted file mode 100644 index c62d7908..00000000 --- a/wp/wp-includes/class-wp.php +++ /dev/null @@ -1,748 +0,0 @@ -public_query_vars) ) - $this->public_query_vars[] = $qv; - } - - /** - * Removes a query variable from a list of public query variables. - * - * @since 4.5.0 - * @access public - * - * @param string $name Query variable name. - */ - public function remove_query_var( $name ) { - $this->public_query_vars = array_diff( $this->public_query_vars, array( $name ) ); - } - - /** - * Set the value of a query variable. - * - * @since 2.3.0 - * @access public - * - * @param string $key Query variable name. - * @param mixed $value Query variable value. - */ - public function set_query_var($key, $value) { - $this->query_vars[$key] = $value; - } - - /** - * Parse request to find correct WordPress query. - * - * Sets up the query variables based on the request. There are also many - * filters and actions that can be used to further manipulate the result. - * - * @since 2.0.0 - * @access public - * - * @global WP_Rewrite $wp_rewrite - * - * @param array|string $extra_query_vars Set the extra query variables. - */ - public function parse_request($extra_query_vars = '') { - global $wp_rewrite; - - /** - * Filters whether to parse the request. - * - * @since 3.5.0 - * - * @param bool $bool Whether or not to parse the request. Default true. - * @param WP $this Current WordPress environment instance. - * @param array|string $extra_query_vars Extra passed query variables. - */ - if ( ! apply_filters( 'do_parse_request', true, $this, $extra_query_vars ) ) - return; - - $this->query_vars = array(); - $post_type_query_vars = array(); - - if ( is_array( $extra_query_vars ) ) { - $this->extra_query_vars = & $extra_query_vars; - } elseif ( ! empty( $extra_query_vars ) ) { - parse_str( $extra_query_vars, $this->extra_query_vars ); - } - // Process PATH_INFO, REQUEST_URI, and 404 for permalinks. - - // Fetch the rewrite rules. - $rewrite = $wp_rewrite->wp_rewrite_rules(); - - if ( ! empty($rewrite) ) { - // If we match a rewrite rule, this will be cleared. - $error = '404'; - $this->did_permalink = true; - - $pathinfo = isset( $_SERVER['PATH_INFO'] ) ? $_SERVER['PATH_INFO'] : ''; - list( $pathinfo ) = explode( '?', $pathinfo ); - $pathinfo = str_replace( "%", "%25", $pathinfo ); - - list( $req_uri ) = explode( '?', $_SERVER['REQUEST_URI'] ); - $self = $_SERVER['PHP_SELF']; - $home_path = trim( parse_url( home_url(), PHP_URL_PATH ), '/' ); - $home_path_regex = sprintf( '|^%s|i', preg_quote( $home_path, '|' ) ); - - // Trim path info from the end and the leading home path from the - // front. For path info requests, this leaves us with the requesting - // filename, if any. For 404 requests, this leaves us with the - // requested permalink. - $req_uri = str_replace($pathinfo, '', $req_uri); - $req_uri = trim($req_uri, '/'); - $req_uri = preg_replace( $home_path_regex, '', $req_uri ); - $req_uri = trim($req_uri, '/'); - $pathinfo = trim($pathinfo, '/'); - $pathinfo = preg_replace( $home_path_regex, '', $pathinfo ); - $pathinfo = trim($pathinfo, '/'); - $self = trim($self, '/'); - $self = preg_replace( $home_path_regex, '', $self ); - $self = trim($self, '/'); - - // The requested permalink is in $pathinfo for path info requests and - // $req_uri for other requests. - if ( ! empty($pathinfo) && !preg_match('|^.*' . $wp_rewrite->index . '$|', $pathinfo) ) { - $requested_path = $pathinfo; - } else { - // If the request uri is the index, blank it out so that we don't try to match it against a rule. - if ( $req_uri == $wp_rewrite->index ) - $req_uri = ''; - $requested_path = $req_uri; - } - $requested_file = $req_uri; - - $this->request = $requested_path; - - // Look for matches. - $request_match = $requested_path; - if ( empty( $request_match ) ) { - // An empty request could only match against ^$ regex - if ( isset( $rewrite['$'] ) ) { - $this->matched_rule = '$'; - $query = $rewrite['$']; - $matches = array(''); - } - } else { - foreach ( (array) $rewrite as $match => $query ) { - // If the requested file is the anchor of the match, prepend it to the path info. - if ( ! empty($requested_file) && strpos($match, $requested_file) === 0 && $requested_file != $requested_path ) - $request_match = $requested_file . '/' . $requested_path; - - if ( preg_match("#^$match#", $request_match, $matches) || - preg_match("#^$match#", urldecode($request_match), $matches) ) { - - if ( $wp_rewrite->use_verbose_page_rules && preg_match( '/pagename=\$matches\[([0-9]+)\]/', $query, $varmatch ) ) { - // This is a verbose page match, let's check to be sure about it. - $page = get_page_by_path( $matches[ $varmatch[1] ] ); - if ( ! $page ) { - continue; - } - - $post_status_obj = get_post_status_object( $page->post_status ); - if ( ! $post_status_obj->public && ! $post_status_obj->protected - && ! $post_status_obj->private && $post_status_obj->exclude_from_search ) { - continue; - } - } - - // Got a match. - $this->matched_rule = $match; - break; - } - } - } - - if ( isset( $this->matched_rule ) ) { - // Trim the query of everything up to the '?'. - $query = preg_replace("!^.+\?!", '', $query); - - // Substitute the substring matches into the query. - $query = addslashes(WP_MatchesMapRegex::apply($query, $matches)); - - $this->matched_query = $query; - - // Parse the query. - parse_str($query, $perma_query_vars); - - // If we're processing a 404 request, clear the error var since we found something. - if ( '404' == $error ) - unset( $error, $_GET['error'] ); - } - - // If req_uri is empty or if it is a request for ourself, unset error. - if ( empty($requested_path) || $requested_file == $self || strpos($_SERVER['PHP_SELF'], 'wp-admin/') !== false ) { - unset( $error, $_GET['error'] ); - - if ( isset($perma_query_vars) && strpos($_SERVER['PHP_SELF'], 'wp-admin/') !== false ) - unset( $perma_query_vars ); - - $this->did_permalink = false; - } - } - - /** - * Filters the query variables whitelist before processing. - * - * Allows (publicly allowed) query vars to be added, removed, or changed prior - * to executing the query. Needed to allow custom rewrite rules using your own arguments - * to work, or any other custom query variables you want to be publicly available. - * - * @since 1.5.0 - * - * @param array $public_query_vars The array of whitelisted query variables. - */ - $this->public_query_vars = apply_filters( 'query_vars', $this->public_query_vars ); - - foreach ( get_post_types( array(), 'objects' ) as $post_type => $t ) { - if ( is_post_type_viewable( $t ) && $t->query_var ) { - $post_type_query_vars[$t->query_var] = $post_type; - } - } - - foreach ( $this->public_query_vars as $wpvar ) { - if ( isset( $this->extra_query_vars[$wpvar] ) ) - $this->query_vars[$wpvar] = $this->extra_query_vars[$wpvar]; - elseif ( isset( $_POST[$wpvar] ) ) - $this->query_vars[$wpvar] = $_POST[$wpvar]; - elseif ( isset( $_GET[$wpvar] ) ) - $this->query_vars[$wpvar] = $_GET[$wpvar]; - elseif ( isset( $perma_query_vars[$wpvar] ) ) - $this->query_vars[$wpvar] = $perma_query_vars[$wpvar]; - - if ( !empty( $this->query_vars[$wpvar] ) ) { - if ( ! is_array( $this->query_vars[$wpvar] ) ) { - $this->query_vars[$wpvar] = (string) $this->query_vars[$wpvar]; - } else { - foreach ( $this->query_vars[$wpvar] as $vkey => $v ) { - if ( !is_object( $v ) ) { - $this->query_vars[$wpvar][$vkey] = (string) $v; - } - } - } - - if ( isset($post_type_query_vars[$wpvar] ) ) { - $this->query_vars['post_type'] = $post_type_query_vars[$wpvar]; - $this->query_vars['name'] = $this->query_vars[$wpvar]; - } - } - } - - // Convert urldecoded spaces back into + - foreach ( get_taxonomies( array() , 'objects' ) as $taxonomy => $t ) - if ( $t->query_var && isset( $this->query_vars[$t->query_var] ) ) - $this->query_vars[$t->query_var] = str_replace( ' ', '+', $this->query_vars[$t->query_var] ); - - // Don't allow non-publicly queryable taxonomies to be queried from the front end. - if ( ! is_admin() ) { - foreach ( get_taxonomies( array( 'publicly_queryable' => false ), 'objects' ) as $taxonomy => $t ) { - /* - * Disallow when set to the 'taxonomy' query var. - * Non-publicly queryable taxonomies cannot register custom query vars. See register_taxonomy(). - */ - if ( isset( $this->query_vars['taxonomy'] ) && $taxonomy === $this->query_vars['taxonomy'] ) { - unset( $this->query_vars['taxonomy'], $this->query_vars['term'] ); - } - } - } - - // Limit publicly queried post_types to those that are publicly_queryable - if ( isset( $this->query_vars['post_type']) ) { - $queryable_post_types = get_post_types( array('publicly_queryable' => true) ); - if ( ! is_array( $this->query_vars['post_type'] ) ) { - if ( ! in_array( $this->query_vars['post_type'], $queryable_post_types ) ) - unset( $this->query_vars['post_type'] ); - } else { - $this->query_vars['post_type'] = array_intersect( $this->query_vars['post_type'], $queryable_post_types ); - } - } - - // Resolve conflicts between posts with numeric slugs and date archive queries. - $this->query_vars = wp_resolve_numeric_slug_conflicts( $this->query_vars ); - - foreach ( (array) $this->private_query_vars as $var) { - if ( isset($this->extra_query_vars[$var]) ) - $this->query_vars[$var] = $this->extra_query_vars[$var]; - } - - if ( isset($error) ) - $this->query_vars['error'] = $error; - - /** - * Filters the array of parsed query variables. - * - * @since 2.1.0 - * - * @param array $query_vars The array of requested query variables. - */ - $this->query_vars = apply_filters( 'request', $this->query_vars ); - - /** - * Fires once all query variables for the current request have been parsed. - * - * @since 2.1.0 - * - * @param WP &$this Current WordPress environment instance (passed by reference). - */ - do_action_ref_array( 'parse_request', array( &$this ) ); - } - - /** - * Sends additional HTTP headers for caching, content type, etc. - * - * Sets the Content-Type header. Sets the 'error' status (if passed) and optionally exits. - * If showing a feed, it will also send Last-Modified, ETag, and 304 status if needed. - * - * @since 2.0.0 - * @since 4.4.0 `X-Pingback` header is added conditionally after posts have been queried in handle_404(). - * @access public - */ - public function send_headers() { - $headers = array(); - $status = null; - $exit_required = false; - - if ( is_user_logged_in() ) - $headers = array_merge($headers, wp_get_nocache_headers()); - if ( ! empty( $this->query_vars['error'] ) ) { - $status = (int) $this->query_vars['error']; - if ( 404 === $status ) { - if ( ! is_user_logged_in() ) - $headers = array_merge($headers, wp_get_nocache_headers()); - $headers['Content-Type'] = get_option('html_type') . '; charset=' . get_option('blog_charset'); - } elseif ( in_array( $status, array( 403, 500, 502, 503 ) ) ) { - $exit_required = true; - } - } elseif ( empty( $this->query_vars['feed'] ) ) { - $headers['Content-Type'] = get_option('html_type') . '; charset=' . get_option('blog_charset'); - } else { - // Set the correct content type for feeds - $type = $this->query_vars['feed']; - if ( 'feed' == $this->query_vars['feed'] ) { - $type = get_default_feed(); - } - $headers['Content-Type'] = feed_content_type( $type ) . '; charset=' . get_option( 'blog_charset' ); - - // We're showing a feed, so WP is indeed the only thing that last changed. - if ( ! empty( $this->query_vars['withcomments'] ) - || false !== strpos( $this->query_vars['feed'], 'comments-' ) - || ( empty( $this->query_vars['withoutcomments'] ) - && ( ! empty( $this->query_vars['p'] ) - || ! empty( $this->query_vars['name'] ) - || ! empty( $this->query_vars['page_id'] ) - || ! empty( $this->query_vars['pagename'] ) - || ! empty( $this->query_vars['attachment'] ) - || ! empty( $this->query_vars['attachment_id'] ) - ) - ) - ) { - $wp_last_modified = mysql2date( 'D, d M Y H:i:s', get_lastcommentmodified( 'GMT' ), false ); - } else { - $wp_last_modified = mysql2date( 'D, d M Y H:i:s', get_lastpostmodified( 'GMT' ), false ); - } - - if ( ! $wp_last_modified ) { - $wp_last_modified = date( 'D, d M Y H:i:s' ); - } - - $wp_last_modified .= ' GMT'; - - $wp_etag = '"' . md5($wp_last_modified) . '"'; - $headers['Last-Modified'] = $wp_last_modified; - $headers['ETag'] = $wp_etag; - - // Support for Conditional GET - if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) - $client_etag = wp_unslash( $_SERVER['HTTP_IF_NONE_MATCH'] ); - else $client_etag = false; - - $client_last_modified = empty($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? '' : trim($_SERVER['HTTP_IF_MODIFIED_SINCE']); - // If string is empty, return 0. If not, attempt to parse into a timestamp - $client_modified_timestamp = $client_last_modified ? strtotime($client_last_modified) : 0; - - // Make a timestamp for our most recent modification... - $wp_modified_timestamp = strtotime($wp_last_modified); - - if ( ($client_last_modified && $client_etag) ? - (($client_modified_timestamp >= $wp_modified_timestamp) && ($client_etag == $wp_etag)) : - (($client_modified_timestamp >= $wp_modified_timestamp) || ($client_etag == $wp_etag)) ) { - $status = 304; - $exit_required = true; - } - } - - /** - * Filters the HTTP headers before they're sent to the browser. - * - * @since 2.8.0 - * - * @param array $headers The list of headers to be sent. - * @param WP $this Current WordPress environment instance. - */ - $headers = apply_filters( 'wp_headers', $headers, $this ); - - if ( ! empty( $status ) ) - status_header( $status ); - - // If Last-Modified is set to false, it should not be sent (no-cache situation). - if ( isset( $headers['Last-Modified'] ) && false === $headers['Last-Modified'] ) { - unset( $headers['Last-Modified'] ); - - // In PHP 5.3+, make sure we are not sending a Last-Modified header. - if ( function_exists( 'header_remove' ) ) { - @header_remove( 'Last-Modified' ); - } else { - // In PHP 5.2, send an empty Last-Modified header, but only as a - // last resort to override a header already sent. #WP23021 - foreach ( headers_list() as $header ) { - if ( 0 === stripos( $header, 'Last-Modified' ) ) { - $headers['Last-Modified'] = ''; - break; - } - } - } - } - - foreach ( (array) $headers as $name => $field_value ) - @header("{$name}: {$field_value}"); - - if ( $exit_required ) - exit(); - - /** - * Fires once the requested HTTP headers for caching, content type, etc. have been sent. - * - * @since 2.1.0 - * - * @param WP &$this Current WordPress environment instance (passed by reference). - */ - do_action_ref_array( 'send_headers', array( &$this ) ); - } - - /** - * Sets the query string property based off of the query variable property. - * - * The {@see 'query_string'} filter is deprecated, but still works. Plugins should - * use the {@see 'request'} filter instead. - * - * @since 2.0.0 - * @access public - */ - public function build_query_string() { - $this->query_string = ''; - foreach ( (array) array_keys($this->query_vars) as $wpvar) { - if ( '' != $this->query_vars[$wpvar] ) { - $this->query_string .= (strlen($this->query_string) < 1) ? '' : '&'; - if ( !is_scalar($this->query_vars[$wpvar]) ) // Discard non-scalars. - continue; - $this->query_string .= $wpvar . '=' . rawurlencode($this->query_vars[$wpvar]); - } - } - - if ( has_filter( 'query_string' ) ) { // Don't bother filtering and parsing if no plugins are hooked in. - /** - * Filters the query string before parsing. - * - * @since 1.5.0 - * @deprecated 2.1.0 Use 'query_vars' or 'request' filters instead. - * - * @param string $query_string The query string to modify. - */ - $this->query_string = apply_filters( 'query_string', $this->query_string ); - parse_str($this->query_string, $this->query_vars); - } - } - - /** - * Set up the WordPress Globals. - * - * The query_vars property will be extracted to the GLOBALS. So care should - * be taken when naming global variables that might interfere with the - * WordPress environment. - * - * @since 2.0.0 - * @access public - * - * @global WP_Query $wp_query - * @global string $query_string Query string for the loop. - * @global array $posts The found posts. - * @global WP_Post|null $post The current post, if available. - * @global string $request The SQL statement for the request. - * @global int $more Only set, if single page or post. - * @global int $single If single page or post. Only set, if single page or post. - * @global WP_User $authordata Only set, if author archive. - */ - public function register_globals() { - global $wp_query; - - // Extract updated query vars back into global namespace. - foreach ( (array) $wp_query->query_vars as $key => $value ) { - $GLOBALS[ $key ] = $value; - } - - $GLOBALS['query_string'] = $this->query_string; - $GLOBALS['posts'] = & $wp_query->posts; - $GLOBALS['post'] = isset( $wp_query->post ) ? $wp_query->post : null; - $GLOBALS['request'] = $wp_query->request; - - if ( $wp_query->is_single() || $wp_query->is_page() ) { - $GLOBALS['more'] = 1; - $GLOBALS['single'] = 1; - } - - if ( $wp_query->is_author() && isset( $wp_query->post ) ) - $GLOBALS['authordata'] = get_userdata( $wp_query->post->post_author ); - } - - /** - * Set up the current user. - * - * @since 2.0.0 - * @access public - */ - public function init() { - wp_get_current_user(); - } - - /** - * Set up the Loop based on the query variables. - * - * @since 2.0.0 - * @access public - * - * @global WP_Query $wp_the_query - */ - public function query_posts() { - global $wp_the_query; - $this->build_query_string(); - $wp_the_query->query($this->query_vars); - } - - /** - * Set the Headers for 404, if nothing is found for requested URL. - * - * Issue a 404 if a request doesn't match any posts and doesn't match - * any object (e.g. an existing-but-empty category, tag, author) and a 404 was not already - * issued, and if the request was not a search or the homepage. - * - * Otherwise, issue a 200. - * - * This sets headers after posts have been queried. handle_404() really means "handle status." - * By inspecting the result of querying posts, seemingly successful requests can be switched to - * a 404 so that canonical redirection logic can kick in. - * - * @since 2.0.0 - * @access public - * - * @global WP_Query $wp_query - */ - public function handle_404() { - global $wp_query; - - /** - * Filters whether to short-circuit default header status handling. - * - * Returning a non-false value from the filter will short-circuit the handling - * and return early. - * - * @since 4.5.0 - * - * @param bool $preempt Whether to short-circuit default header status handling. Default false. - * @param WP_Query $wp_query WordPress Query object. - */ - if ( false !== apply_filters( 'pre_handle_404', false, $wp_query ) ) { - return; - } - - // If we've already issued a 404, bail. - if ( is_404() ) - return; - - // Never 404 for the admin, robots, or if we found posts. - if ( is_admin() || is_robots() || $wp_query->posts ) { - - $success = true; - if ( is_singular() ) { - $p = false; - - if ( $wp_query->post instanceof WP_Post ) { - $p = clone $wp_query->post; - } - - // Only set X-Pingback for single posts that allow pings. - if ( $p && pings_open( $p ) ) { - @header( 'X-Pingback: ' . get_bloginfo( 'pingback_url', 'display' ) ); - } - - // check for paged content that exceeds the max number of pages - $next = ''; - if ( $p && false !== strpos( $p->post_content, $next ) && ! empty( $this->query_vars['page'] ) ) { - $page = trim( $this->query_vars['page'], '/' ); - $success = (int) $page <= ( substr_count( $p->post_content, $next ) + 1 ); - } - } - - if ( $success ) { - status_header( 200 ); - return; - } - } - - // We will 404 for paged queries, as no posts were found. - if ( ! is_paged() ) { - - // Don't 404 for authors without posts as long as they matched an author on this site. - $author = get_query_var( 'author' ); - if ( is_author() && is_numeric( $author ) && $author > 0 && is_user_member_of_blog( $author ) ) { - status_header( 200 ); - return; - } - - // Don't 404 for these queries if they matched an object. - if ( ( is_tag() || is_category() || is_tax() || is_post_type_archive() ) && get_queried_object() ) { - status_header( 200 ); - return; - } - - // Don't 404 for these queries either. - if ( is_home() || is_search() || is_feed() ) { - status_header( 200 ); - return; - } - } - - // Guess it's time to 404. - $wp_query->set_404(); - status_header( 404 ); - nocache_headers(); - } - - /** - * Sets up all of the variables required by the WordPress environment. - * - * The action {@see 'wp'} has one parameter that references the WP object. It - * allows for accessing the properties and methods to further manipulate the - * object. - * - * @since 2.0.0 - * @access public - * - * @param string|array $query_args Passed to parse_request(). - */ - public function main($query_args = '') { - $this->init(); - $this->parse_request($query_args); - $this->send_headers(); - $this->query_posts(); - $this->handle_404(); - $this->register_globals(); - - /** - * Fires once the WordPress environment has been set up. - * - * @since 2.1.0 - * - * @param WP &$this Current WordPress environment instance (passed by reference). - */ - do_action_ref_array( 'wp', array( &$this ) ); - } -} diff --git a/wp/wp-includes/class.wp-dependencies.php b/wp/wp-includes/class.wp-dependencies.php deleted file mode 100644 index 13ff04fa..00000000 --- a/wp/wp-includes/class.wp-dependencies.php +++ /dev/null @@ -1,414 +0,0 @@ -queue : (array) $handles; - $this->all_deps( $handles ); - - foreach ( $this->to_do as $key => $handle ) { - if ( !in_array($handle, $this->done, true) && isset($this->registered[$handle]) ) { - /* - * Attempt to process the item. If successful, - * add the handle to the done array. - * - * Unset the item from the to_do array. - */ - if ( $this->do_item( $handle, $group ) ) - $this->done[] = $handle; - - unset( $this->to_do[$key] ); - } - } - - return $this->done; - } - - /** - * Processes a dependency. - * - * @access public - * @since 2.6.0 - * - * @param string $handle Name of the item. Should be unique. - * @return bool True on success, false if not set. - */ - public function do_item( $handle ) { - return isset($this->registered[$handle]); - } - - /** - * Determines dependencies. - * - * Recursively builds an array of items to process taking - * dependencies into account. Does NOT catch infinite loops. - * - * @access public - * @since 2.1.0 - * @since 2.6.0 Moved from `WP_Scripts`. - * @since 2.8.0 Added the `$group` parameter. - * - * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings). - * @param bool $recursion Internal flag that function is calling itself. - * @param int|false $group Group level: (int) level, (false) no groups. - * @return bool True on success, false on failure. - */ - public function all_deps( $handles, $recursion = false, $group = false ) { - if ( !$handles = (array) $handles ) - return false; - - foreach ( $handles as $handle ) { - $handle_parts = explode('?', $handle); - $handle = $handle_parts[0]; - $queued = in_array($handle, $this->to_do, true); - - if ( in_array($handle, $this->done, true) ) // Already done - continue; - - $moved = $this->set_group( $handle, $recursion, $group ); - $new_group = $this->groups[ $handle ]; - - if ( $queued && !$moved ) // already queued and in the right group - continue; - - $keep_going = true; - if ( !isset($this->registered[$handle]) ) - $keep_going = false; // Item doesn't exist. - elseif ( $this->registered[$handle]->deps && array_diff($this->registered[$handle]->deps, array_keys($this->registered)) ) - $keep_going = false; // Item requires dependencies that don't exist. - elseif ( $this->registered[$handle]->deps && !$this->all_deps( $this->registered[$handle]->deps, true, $new_group ) ) - $keep_going = false; // Item requires dependencies that don't exist. - - if ( ! $keep_going ) { // Either item or its dependencies don't exist. - if ( $recursion ) - return false; // Abort this branch. - else - continue; // We're at the top level. Move on to the next one. - } - - if ( $queued ) // Already grabbed it and its dependencies. - continue; - - if ( isset($handle_parts[1]) ) - $this->args[$handle] = $handle_parts[1]; - - $this->to_do[] = $handle; - } - - return true; - } - - /** - * Register an item. - * - * Registers the item if no item of that name already exists. - * - * @access public - * @since 2.1.0 - * @since 2.6.0 Moved from `WP_Scripts`. - * - * @param string $handle Name of the item. Should be unique. - * @param string $src Full URL of the item, or path of the item relative to the WordPress root directory. - * @param array $deps Optional. An array of registered item handles this item depends on. Default empty array. - * @param string|bool|null $ver Optional. String specifying item version number, if it has one, which is added to the URL - * as a query string for cache busting purposes. If version is set to false, a version - * number is automatically added equal to current installed WordPress version. - * If set to null, no version is added. - * @param mixed $args Optional. Custom property of the item. NOT the class property $args. Examples: $media, $in_footer. - * @return bool Whether the item has been registered. True on success, false on failure. - */ - public function add( $handle, $src, $deps = array(), $ver = false, $args = null ) { - if ( isset($this->registered[$handle]) ) - return false; - $this->registered[$handle] = new _WP_Dependency( $handle, $src, $deps, $ver, $args ); - return true; - } - - /** - * Add extra item data. - * - * Adds data to a registered item. - * - * @access public - * @since 2.6.0 - * - * @param string $handle Name of the item. Should be unique. - * @param string $key The data key. - * @param mixed $value The data value. - * @return bool True on success, false on failure. - */ - public function add_data( $handle, $key, $value ) { - if ( !isset( $this->registered[$handle] ) ) - return false; - - return $this->registered[$handle]->add_data( $key, $value ); - } - - /** - * Get extra item data. - * - * Gets data associated with a registered item. - * - * @access public - * @since 3.3.0 - * - * @param string $handle Name of the item. Should be unique. - * @param string $key The data key. - * @return mixed Extra item data (string), false otherwise. - */ - public function get_data( $handle, $key ) { - if ( !isset( $this->registered[$handle] ) ) - return false; - - if ( !isset( $this->registered[$handle]->extra[$key] ) ) - return false; - - return $this->registered[$handle]->extra[$key]; - } - - /** - * Un-register an item or items. - * - * @access public - * @since 2.1.0 - * @since 2.6.0 Moved from `WP_Scripts`. - * - * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings). - * @return void - */ - public function remove( $handles ) { - foreach ( (array) $handles as $handle ) - unset($this->registered[$handle]); - } - - /** - * Queue an item or items. - * - * Decodes handles and arguments, then queues handles and stores - * arguments in the class property $args. For example in extending - * classes, $args is appended to the item url as a query string. - * Note $args is NOT the $args property of items in the $registered array. - * - * @access public - * @since 2.1.0 - * @since 2.6.0 Moved from `WP_Scripts`. - * - * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings). - */ - public function enqueue( $handles ) { - foreach ( (array) $handles as $handle ) { - $handle = explode('?', $handle); - if ( !in_array($handle[0], $this->queue) && isset($this->registered[$handle[0]]) ) { - $this->queue[] = $handle[0]; - if ( isset($handle[1]) ) - $this->args[$handle[0]] = $handle[1]; - } - } - } - - /** - * Dequeue an item or items. - * - * Decodes handles and arguments, then dequeues handles - * and removes arguments from the class property $args. - * - * @access public - * @since 2.1.0 - * @since 2.6.0 Moved from `WP_Scripts`. - * - * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings). - */ - public function dequeue( $handles ) { - foreach ( (array) $handles as $handle ) { - $handle = explode('?', $handle); - $key = array_search($handle[0], $this->queue); - if ( false !== $key ) { - unset($this->queue[$key]); - unset($this->args[$handle[0]]); - } - } - } - - /** - * Recursively search the passed dependency tree for $handle - * - * @since 4.0.0 - * - * @param array $queue An array of queued _WP_Dependency handle objects. - * @param string $handle Name of the item. Should be unique. - * @return bool Whether the handle is found after recursively searching the dependency tree. - */ - protected function recurse_deps( $queue, $handle ) { - foreach ( $queue as $queued ) { - if ( ! isset( $this->registered[ $queued ] ) ) { - continue; - } - - if ( in_array( $handle, $this->registered[ $queued ]->deps ) ) { - return true; - } elseif ( $this->recurse_deps( $this->registered[ $queued ]->deps, $handle ) ) { - return true; - } - } - - return false; - } - - /** - * Query list for an item. - * - * @access public - * @since 2.1.0 - * @since 2.6.0 Moved from `WP_Scripts`. - * - * @param string $handle Name of the item. Should be unique. - * @param string $list Property name of list array. - * @return bool|_WP_Dependency Found, or object Item data. - */ - public function query( $handle, $list = 'registered' ) { - switch ( $list ) { - case 'registered' : - case 'scripts': // back compat - if ( isset( $this->registered[ $handle ] ) ) - return $this->registered[ $handle ]; - return false; - - case 'enqueued' : - case 'queue' : - if ( in_array( $handle, $this->queue ) ) { - return true; - } - return $this->recurse_deps( $this->queue, $handle ); - - case 'to_do' : - case 'to_print': // back compat - return in_array( $handle, $this->to_do ); - - case 'done' : - case 'printed': // back compat - return in_array( $handle, $this->done ); - } - return false; - } - - /** - * Set item group, unless already in a lower group. - * - * @access public - * @since 2.8.0 - * - * @param string $handle Name of the item. Should be unique. - * @param bool $recursion Internal flag that calling function was called recursively. - * @param mixed $group Group level. - * @return bool Not already in the group or a lower group - */ - public function set_group( $handle, $recursion, $group ) { - $group = (int) $group; - - if ( isset( $this->groups[ $handle ] ) && $this->groups[ $handle ] <= $group ) { - return false; - } - - $this->groups[ $handle ] = $group; - - return true; - } - -} diff --git a/wp/wp-includes/class.wp-scripts.php b/wp/wp-includes/class.wp-scripts.php deleted file mode 100644 index 81634ece..00000000 --- a/wp/wp-includes/class.wp-scripts.php +++ /dev/null @@ -1,587 +0,0 @@ -init(); - add_action( 'init', array( $this, 'init' ), 0 ); - } - - /** - * Initialize the class. - * - * @since 3.4.0 - * @access public - */ - public function init() { - /** - * Fires when the WP_Scripts instance is initialized. - * - * @since 2.6.0 - * - * @param WP_Scripts &$this WP_Scripts instance, passed by reference. - */ - do_action_ref_array( 'wp_default_scripts', array(&$this) ); - } - - /** - * Prints scripts. - * - * Prints the scripts passed to it or the print queue. Also prints all necessary dependencies. - * - * @since 2.1.0 - * @since 2.8.0 Added the `$group` parameter. - * @access public - * - * @param mixed $handles Optional. Scripts to be printed. (void) prints queue, (string) prints - * that script, (array of strings) prints those scripts. Default false. - * @param int $group Optional. If scripts were queued in groups prints this group number. - * Default false. - * @return array Scripts that have been printed. - */ - public function print_scripts( $handles = false, $group = false ) { - return $this->do_items( $handles, $group ); - } - - /** - * Prints extra scripts of a registered script. - * - * @since 2.1.0 - * @since 2.8.0 Added the `$echo` parameter. - * @deprecated 3.3.0 - * @access public - * - * @see print_extra_script() - * - * @param string $handle The script's registered handle. - * @param bool $echo Optional. Whether to echo the extra script instead of just returning it. - * Default true. - * @return bool|string|void Void if no data exists, extra scripts if `$echo` is true, true otherwise. - */ - public function print_scripts_l10n( $handle, $echo = true ) { - _deprecated_function( __FUNCTION__, '3.3.0', 'print_extra_script()' ); - return $this->print_extra_script( $handle, $echo ); - } - - /** - * Prints extra scripts of a registered script. - * - * @since 3.3.0 - * @access public - * - * @param string $handle The script's registered handle. - * @param bool $echo Optional. Whether to echo the extra script instead of just returning it. - * Default true. - * @return bool|string|void Void if no data exists, extra scripts if `$echo` is true, true otherwise. - */ - public function print_extra_script( $handle, $echo = true ) { - if ( !$output = $this->get_data( $handle, 'data' ) ) - return; - - if ( !$echo ) - return $output; - - echo "\n"; - - return true; - } - - /** - * Processes a script dependency. - * - * @since 2.6.0 - * @since 2.8.0 Added the `$group` parameter. - * @access public - * - * @see WP_Dependencies::do_item() - * - * @param string $handle The script's registered handle. - * @param int|false $group Optional. Group level: (int) level, (false) no groups. Default false. - * @return bool True on success, false on failure. - */ - public function do_item( $handle, $group = false ) { - if ( !parent::do_item($handle) ) - return false; - - if ( 0 === $group && $this->groups[$handle] > 0 ) { - $this->in_footer[] = $handle; - return false; - } - - if ( false === $group && in_array($handle, $this->in_footer, true) ) - $this->in_footer = array_diff( $this->in_footer, (array) $handle ); - - $obj = $this->registered[$handle]; - - if ( null === $obj->ver ) { - $ver = ''; - } else { - $ver = $obj->ver ? $obj->ver : $this->default_version; - } - - if ( isset($this->args[$handle]) ) - $ver = $ver ? $ver . '&' . $this->args[$handle] : $this->args[$handle]; - - $src = $obj->src; - $cond_before = $cond_after = ''; - $conditional = isset( $obj->extra['conditional'] ) ? $obj->extra['conditional'] : ''; - - if ( $conditional ) { - $cond_before = "\n"; - } - - $before_handle = $this->print_inline_script( $handle, 'before', false ); - $after_handle = $this->print_inline_script( $handle, 'after', false ); - - if ( $before_handle ) { - $before_handle = sprintf( "\n", $before_handle ); - } - - if ( $after_handle ) { - $after_handle = sprintf( "\n", $after_handle ); - } - - if ( $this->do_concat ) { - /** - * Filters the script loader source. - * - * @since 2.2.0 - * - * @param string $src Script loader source path. - * @param string $handle Script handle. - */ - $srce = apply_filters( 'script_loader_src', $src, $handle ); - - if ( $this->in_default_dir( $srce ) && ( $before_handle || $after_handle ) ) { - $this->do_concat = false; - - // Have to print the so-far concatenated scripts right away to maintain the right order. - _print_scripts(); - $this->reset(); - } elseif ( $this->in_default_dir( $srce ) && ! $conditional ) { - $this->print_code .= $this->print_extra_script( $handle, false ); - $this->concat .= "$handle,"; - $this->concat_version .= "$handle$ver"; - return true; - } else { - $this->ext_handles .= "$handle,"; - $this->ext_version .= "$handle$ver"; - } - } - - $has_conditional_data = $conditional && $this->get_data( $handle, 'data' ); - - if ( $has_conditional_data ) { - echo $cond_before; - } - - $this->print_extra_script( $handle ); - - if ( $has_conditional_data ) { - echo $cond_after; - } - - // A single item may alias a set of items, by having dependencies, but no source. - if ( ! $obj->src ) { - return true; - } - - if ( ! preg_match( '|^(https?:)?//|', $src ) && ! ( $this->content_url && 0 === strpos( $src, $this->content_url ) ) ) { - $src = $this->base_url . $src; - } - - if ( ! empty( $ver ) ) - $src = add_query_arg( 'ver', $ver, $src ); - - /** This filter is documented in wp-includes/class.wp-scripts.php */ - $src = esc_url( apply_filters( 'script_loader_src', $src, $handle ) ); - - if ( ! $src ) - return true; - - $tag = "{$cond_before}{$before_handle}\n{$after_handle}{$cond_after}"; - - /** - * Filters the HTML script tag of an enqueued script. - * - * @since 4.1.0 - * - * @param string $tag The `\n", $output ); - } - - return $output; - } - - /** - * Localizes a script, only if the script has already been added. - * - * @since 2.1.0 - * @access public - * - * @param string $handle - * @param string $object_name - * @param array $l10n - * @return bool - */ - public function localize( $handle, $object_name, $l10n ) { - if ( $handle === 'jquery' ) - $handle = 'jquery-core'; - - if ( is_array($l10n) && isset($l10n['l10n_print_after']) ) { // back compat, preserve the code in 'l10n_print_after' if present - $after = $l10n['l10n_print_after']; - unset($l10n['l10n_print_after']); - } - - foreach ( (array) $l10n as $key => $value ) { - if ( !is_scalar($value) ) - continue; - - $l10n[$key] = html_entity_decode( (string) $value, ENT_QUOTES, 'UTF-8'); - } - - $script = "var $object_name = " . wp_json_encode( $l10n ) . ';'; - - if ( !empty($after) ) - $script .= "\n$after;"; - - $data = $this->get_data( $handle, 'data' ); - - if ( !empty( $data ) ) - $script = "$data\n$script"; - - return $this->add_data( $handle, 'data', $script ); - } - - /** - * Sets handle group. - * - * @since 2.8.0 - * @access public - * - * @see WP_Dependencies::set_group() - * - * @param string $handle Name of the item. Should be unique. - * @param bool $recursion Internal flag that calling function was called recursively. - * @param int|false $group Optional. Group level: (int) level, (false) no groups. Default false. - * @return bool Not already in the group or a lower group - */ - public function set_group( $handle, $recursion, $group = false ) { - if ( isset( $this->registered[$handle]->args ) && $this->registered[$handle]->args === 1 ) - $grp = 1; - else - $grp = (int) $this->get_data( $handle, 'group' ); - - if ( false !== $group && $grp > $group ) - $grp = $group; - - return parent::set_group( $handle, $recursion, $grp ); - } - - /** - * Determines script dependencies. - * - * @since 2.1.0 - * @access public - * - * @see WP_Dependencies::all_deps() - * - * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings). - * @param bool $recursion Internal flag that function is calling itself. - * @param int|false $group Optional. Group level: (int) level, (false) no groups. Default false. - * @return bool True on success, false on failure. - */ - public function all_deps( $handles, $recursion = false, $group = false ) { - $r = parent::all_deps( $handles, $recursion, $group ); - if ( ! $recursion ) { - /** - * Filters the list of script dependencies left to print. - * - * @since 2.3.0 - * - * @param array $to_do An array of script dependencies. - */ - $this->to_do = apply_filters( 'print_scripts_array', $this->to_do ); - } - return $r; - } - - /** - * Processes items and dependencies for the head group. - * - * @since 2.8.0 - * @access public - * - * @see WP_Dependencies::do_items() - * - * @return array Handles of items that have been processed. - */ - public function do_head_items() { - $this->do_items(false, 0); - return $this->done; - } - - /** - * Processes items and dependencies for the footer group. - * - * @since 2.8.0 - * @access public - * - * @see WP_Dependencies::do_items() - * - * @return array Handles of items that have been processed. - */ - public function do_footer_items() { - $this->do_items(false, 1); - return $this->done; - } - - /** - * Whether a handle's source is in a default directory. - * - * @since 2.8.0 - * @access public - * - * @param string $src The source of the enqueued script. - * @return bool True if found, false if not. - */ - public function in_default_dir( $src ) { - if ( ! $this->default_dirs ) { - return true; - } - - if ( 0 === strpos( $src, '/' . WPINC . '/js/l10n' ) ) { - return false; - } - - foreach ( (array) $this->default_dirs as $test ) { - if ( 0 === strpos( $src, $test ) ) { - return true; - } - } - return false; - } - - /** - * Resets class properties. - * - * @since 2.8.0 - * @access public - */ - public function reset() { - $this->do_concat = false; - $this->print_code = ''; - $this->concat = ''; - $this->concat_version = ''; - $this->print_html = ''; - $this->ext_version = ''; - $this->ext_handles = ''; - } -} diff --git a/wp/wp-includes/class.wp-styles.php b/wp/wp-includes/class.wp-styles.php deleted file mode 100644 index 0b6c011d..00000000 --- a/wp/wp-includes/class.wp-styles.php +++ /dev/null @@ -1,407 +0,0 @@ -registered[$handle]; - if ( null === $obj->ver ) - $ver = ''; - else - $ver = $obj->ver ? $obj->ver : $this->default_version; - - if ( isset($this->args[$handle]) ) - $ver = $ver ? $ver . '&' . $this->args[$handle] : $this->args[$handle]; - - if ( $this->do_concat ) { - if ( $this->in_default_dir($obj->src) && !isset($obj->extra['conditional']) && !isset($obj->extra['alt']) ) { - $this->concat .= "$handle,"; - $this->concat_version .= "$handle$ver"; - - $this->print_code .= $this->print_inline_style( $handle, false ); - - return true; - } - } - - if ( isset($obj->args) ) - $media = esc_attr( $obj->args ); - else - $media = 'all'; - - // A single item may alias a set of items, by having dependencies, but no source. - if ( ! $obj->src ) { - if ( $inline_style = $this->print_inline_style( $handle, false ) ) { - $inline_style = sprintf( "\n", esc_attr( $handle ), $inline_style ); - if ( $this->do_concat ) { - $this->print_html .= $inline_style; - } else { - echo $inline_style; - } - } - return true; - } - - $href = $this->_css_href( $obj->src, $ver, $handle ); - if ( ! $href ) { - return true; - } - - $rel = isset($obj->extra['alt']) && $obj->extra['alt'] ? 'alternate stylesheet' : 'stylesheet'; - $title = isset($obj->extra['title']) ? "title='" . esc_attr( $obj->extra['title'] ) . "'" : ''; - - /** - * Filters the HTML link tag of an enqueued style. - * - * @since 2.6.0 - * @since 4.3.0 Introduced the `$href` parameter. - * @since 4.5.0 Introduced the `$media` parameter. - * - * @param string $html The link tag for the enqueued style. - * @param string $handle The style's registered handle. - * @param string $href The stylesheet's source URL. - * @param string $media The stylesheet's media attribute. - */ - $tag = apply_filters( 'style_loader_tag', "\n", $handle, $href, $media); - if ( 'rtl' === $this->text_direction && isset($obj->extra['rtl']) && $obj->extra['rtl'] ) { - if ( is_bool( $obj->extra['rtl'] ) || 'replace' === $obj->extra['rtl'] ) { - $suffix = isset( $obj->extra['suffix'] ) ? $obj->extra['suffix'] : ''; - $rtl_href = str_replace( "{$suffix}.css", "-rtl{$suffix}.css", $this->_css_href( $obj->src , $ver, "$handle-rtl" )); - } else { - $rtl_href = $this->_css_href( $obj->extra['rtl'], $ver, "$handle-rtl" ); - } - - /** This filter is documented in wp-includes/class.wp-styles.php */ - $rtl_tag = apply_filters( 'style_loader_tag', "\n", $handle, $rtl_href, $media ); - - if ( $obj->extra['rtl'] === 'replace' ) { - $tag = $rtl_tag; - } else { - $tag .= $rtl_tag; - } - } - - $conditional_pre = $conditional_post = ''; - if ( isset( $obj->extra['conditional'] ) && $obj->extra['conditional'] ) { - $conditional_pre = "\n"; - } - - if ( $this->do_concat ) { - $this->print_html .= $conditional_pre; - $this->print_html .= $tag; - if ( $inline_style = $this->print_inline_style( $handle, false ) ) { - $this->print_html .= sprintf( "\n", esc_attr( $handle ), $inline_style ); - } - $this->print_html .= $conditional_post; - } else { - echo $conditional_pre; - echo $tag; - $this->print_inline_style( $handle ); - echo $conditional_post; - } - - return true; - } - - /** - * Adds extra CSS styles to a registered stylesheet. - * - * @since 3.3.0 - * @access public - * - * @param string $handle The style's registered handle. - * @param string $code String containing the CSS styles to be added. - * @return bool True on success, false on failure. - */ - public function add_inline_style( $handle, $code ) { - if ( ! $code ) { - return false; - } - - $after = $this->get_data( $handle, 'after' ); - if ( ! $after ) { - $after = array(); - } - - $after[] = $code; - - return $this->add_data( $handle, 'after', $after ); - } - - /** - * Prints extra CSS styles of a registered stylesheet. - * - * @since 3.3.0 - * @access public - * - * @param string $handle The style's registered handle. - * @param bool $echo Optional. Whether to echo the inline style instead of just returning it. - * Default true. - * @return string|bool False if no data exists, inline styles if `$echo` is true, true otherwise. - */ - public function print_inline_style( $handle, $echo = true ) { - $output = $this->get_data( $handle, 'after' ); - - if ( empty( $output ) ) { - return false; - } - - $output = implode( "\n", $output ); - - if ( ! $echo ) { - return $output; - } - - printf( "\n", esc_attr( $handle ), $output ); - - return true; - } - - /** - * Determines style dependencies. - * - * @since 2.6.0 - * @access public - * - * @see WP_Dependencies::all_deps() - * - * @param mixed $handles Item handle and argument (string) or item handles and arguments (array of strings). - * @param bool $recursion Internal flag that function is calling itself. - * @param int|false $group Group level: (int) level, (false) no groups. - * @return bool True on success, false on failure. - */ - public function all_deps( $handles, $recursion = false, $group = false ) { - $r = parent::all_deps( $handles, $recursion, $group ); - if ( ! $recursion ) { - /** - * Filters the array of enqueued styles before processing for output. - * - * @since 2.6.0 - * - * @param array $to_do The list of enqueued styles about to be processed. - */ - $this->to_do = apply_filters( 'print_styles_array', $this->to_do ); - } - return $r; - } - - /** - * Generates an enqueued style's fully-qualified URL. - * - * @since 2.6.0 - * @access public - * - * @param string $src The source of the enqueued style. - * @param string $ver The version of the enqueued style. - * @param string $handle The style's registered handle. - * @return string Style's fully-qualified URL. - */ - public function _css_href( $src, $ver, $handle ) { - if ( !is_bool($src) && !preg_match('|^(https?:)?//|', $src) && ! ( $this->content_url && 0 === strpos($src, $this->content_url) ) ) { - $src = $this->base_url . $src; - } - - if ( !empty($ver) ) - $src = add_query_arg('ver', $ver, $src); - - /** - * Filters an enqueued style's fully-qualified URL. - * - * @since 2.6.0 - * - * @param string $src The source URL of the enqueued style. - * @param string $handle The style's registered handle. - */ - $src = apply_filters( 'style_loader_src', $src, $handle ); - return esc_url( $src ); - } - - /** - * Whether a handle's source is in a default directory. - * - * @since 2.8.0 - * @access public - * - * @param string $src The source of the enqueued style. - * @return bool True if found, false if not. - */ - public function in_default_dir( $src ) { - if ( ! $this->default_dirs ) - return true; - - foreach ( (array) $this->default_dirs as $test ) { - if ( 0 === strpos($src, $test) ) - return true; - } - return false; - } - - /** - * Processes items and dependencies for the footer group. - * - * HTML 5 allows styles in the body, grab late enqueued items and output them in the footer. - * - * @since 3.3.0 - * @access public - * - * @see WP_Dependencies::do_items() - * - * @return array Handles of items that have been processed. - */ - public function do_footer_items() { - $this->do_items(false, 1); - return $this->done; - } - - /** - * Resets class properties. - * - * @since 3.3.0 - * @access public - */ - public function reset() { - $this->do_concat = false; - $this->concat = ''; - $this->concat_version = ''; - $this->print_html = ''; - } -} diff --git a/wp/wp-includes/comment-template.php b/wp/wp-includes/comment-template.php deleted file mode 100644 index c914796c..00000000 --- a/wp/wp-includes/comment-template.php +++ /dev/null @@ -1,2464 +0,0 @@ -comment_author ) ) { - if ( $comment->user_id && $user = get_userdata( $comment->user_id ) ) - $author = $user->display_name; - else - $author = __('Anonymous'); - } else { - $author = $comment->comment_author; - } - - /** - * Filters the returned comment author name. - * - * @since 1.5.0 - * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. - * - * @param string $author The comment author's username. - * @param int $comment_ID The comment ID. - * @param WP_Comment $comment The comment object. - */ - return apply_filters( 'get_comment_author', $author, $comment->comment_ID, $comment ); -} - -/** - * Displays the author of the current comment. - * - * @since 0.71 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author. - * Default current comment. - */ -function comment_author( $comment_ID = 0 ) { - $comment = get_comment( $comment_ID ); - $author = get_comment_author( $comment ); - - /** - * Filters the comment author's name for display. - * - * @since 1.2.0 - * @since 4.1.0 The `$comment_ID` parameter was added. - * - * @param string $author The comment author's username. - * @param int $comment_ID The comment ID. - */ - echo apply_filters( 'comment_author', $author, $comment->comment_ID ); -} - -/** - * Retrieve the email of the author of the current comment. - * - * @since 1.5.0 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's email. - * Default current comment. - * @return string The current comment author's email - */ -function get_comment_author_email( $comment_ID = 0 ) { - $comment = get_comment( $comment_ID ); - - /** - * Filters the comment author's returned email address. - * - * @since 1.5.0 - * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. - * - * @param string $comment_author_email The comment author's email address. - * @param int $comment_ID The comment ID. - * @param WP_Comment $comment The comment object. - */ - return apply_filters( 'get_comment_author_email', $comment->comment_author_email, $comment->comment_ID, $comment ); -} - -/** - * Display the email of the author of the current global $comment. - * - * Care should be taken to protect the email address and assure that email - * harvesters do not capture your commentors' email address. Most assume that - * their email address will not appear in raw form on the site. Doing so will - * enable anyone, including those that people don't want to get the email - * address and use it for their own means good and bad. - * - * @since 0.71 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's email. - * Default current comment. - */ -function comment_author_email( $comment_ID = 0 ) { - $comment = get_comment( $comment_ID ); - $author_email = get_comment_author_email( $comment ); - - /** - * Filters the comment author's email for display. - * - * @since 1.2.0 - * @since 4.1.0 The `$comment_ID` parameter was added. - * - * @param string $author_email The comment author's email address. - * @param int $comment_ID The comment ID. - */ - echo apply_filters( 'author_email', $author_email, $comment->comment_ID ); -} - -/** - * Display the html email link to the author of the current comment. - * - * Care should be taken to protect the email address and assure that email - * harvesters do not capture your commentors' email address. Most assume that - * their email address will not appear in raw form on the site. Doing so will - * enable anyone, including those that people don't want to get the email - * address and use it for their own means good and bad. - * - * @since 0.71 - * @since 4.6.0 Added the `$comment` parameter. - * - * @param string $linktext Optional. Text to display instead of the comment author's email address. - * Default empty. - * @param string $before Optional. Text or HTML to display before the email link. Default empty. - * @param string $after Optional. Text or HTML to display after the email link. Default empty. - * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. Default is the current comment. - */ -function comment_author_email_link( $linktext = '', $before = '', $after = '', $comment = null ) { - if ( $link = get_comment_author_email_link( $linktext, $before, $after, $comment ) ) { - echo $link; - } -} - -/** - * Return the html email link to the author of the current comment. - * - * Care should be taken to protect the email address and assure that email - * harvesters do not capture your commentors' email address. Most assume that - * their email address will not appear in raw form on the site. Doing so will - * enable anyone, including those that people don't want to get the email - * address and use it for their own means good and bad. - * - * @since 2.7.0 - * @since 4.6.0 Added the `$comment` parameter. - * - * @param string $linktext Optional. Text to display instead of the comment author's email address. - * Default empty. - * @param string $before Optional. Text or HTML to display before the email link. Default empty. - * @param string $after Optional. Text or HTML to display after the email link. Default empty. - * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. Default is the current comment. - * @return string HTML markup for the comment author email link. By default, the email address is obfuscated - * via the {@see 'comment_email'} filter with antispambot(). - */ -function get_comment_author_email_link( $linktext = '', $before = '', $after = '', $comment = null ) { - $comment = get_comment( $comment ); - - /** - * Filters the comment author's email for display. - * - * Care should be taken to protect the email address and assure that email - * harvesters do not capture your commenter's email address. - * - * @since 1.2.0 - * @since 4.1.0 The `$comment` parameter was added. - * - * @param string $comment_author_email The comment author's email address. - * @param WP_Comment $comment The comment object. - */ - $email = apply_filters( 'comment_email', $comment->comment_author_email, $comment ); - - if ((!empty($email)) && ($email != '@')) { - $display = ($linktext != '') ? $linktext : $email; - $return = $before; - $return .= sprintf( '%2$s', esc_url( 'mailto:' . $email ), esc_html( $display ) ); - $return .= $after; - return $return; - } else { - return ''; - } -} - -/** - * Retrieve the HTML link to the URL of the author of the current comment. - * - * Both get_comment_author_url() and get_comment_author() rely on get_comment(), - * which falls back to the global comment variable if the $comment_ID argument is empty. - * - * @since 1.5.0 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's link. - * Default current comment. - * @return string The comment author name or HTML link for author's URL. - */ -function get_comment_author_link( $comment_ID = 0 ) { - $comment = get_comment( $comment_ID ); - $url = get_comment_author_url( $comment ); - $author = get_comment_author( $comment ); - - if ( empty( $url ) || 'http://' == $url ) - $return = $author; - else - $return = "$author"; - - /** - * Filters the comment author's link for display. - * - * @since 1.5.0 - * @since 4.1.0 The `$author` and `$comment_ID` parameters were added. - * - * @param string $return The HTML-formatted comment author link. - * Empty for an invalid URL. - * @param string $author The comment author's username. - * @param int $comment_ID The comment ID. - */ - return apply_filters( 'get_comment_author_link', $return, $author, $comment->comment_ID ); -} - -/** - * Display the html link to the url of the author of the current comment. - * - * @since 0.71 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's link. - * Default current comment. - */ -function comment_author_link( $comment_ID = 0 ) { - echo get_comment_author_link( $comment_ID ); -} - -/** - * Retrieve the IP address of the author of the current comment. - * - * @since 1.5.0 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's IP address. - * Default current comment. - * @return string Comment author's IP address. - */ -function get_comment_author_IP( $comment_ID = 0 ) { - $comment = get_comment( $comment_ID ); - - /** - * Filters the comment author's returned IP address. - * - * @since 1.5.0 - * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. - * - * @param string $comment_author_IP The comment author's IP address. - * @param int $comment_ID The comment ID. - * @param WP_Comment $comment The comment object. - */ - return apply_filters( 'get_comment_author_IP', $comment->comment_author_IP, $comment->comment_ID, $comment ); -} - -/** - * Display the IP address of the author of the current comment. - * - * @since 0.71 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's IP address. - * Default current comment. - */ -function comment_author_IP( $comment_ID = 0 ) { - echo esc_html( get_comment_author_IP( $comment_ID ) ); -} - -/** - * Retrieve the url of the author of the current comment. - * - * @since 1.5.0 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to get the author's URL. - * Default current comment. - * @return string Comment author URL. - */ -function get_comment_author_url( $comment_ID = 0 ) { - $comment = get_comment( $comment_ID ); - $url = ''; - $id = 0; - if ( ! empty( $comment ) ) { - $author_url = ( 'http://' == $comment->comment_author_url ) ? '' : $comment->comment_author_url; - $url = esc_url( $author_url, array( 'http', 'https' ) ); - $id = $comment->ID; - } - - /** - * Filters the comment author's URL. - * - * @since 1.5.0 - * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. - * - * @param string $url The comment author's URL. - * @param int $comment_ID The comment ID. - * @param WP_Comment $comment The comment object. - */ - return apply_filters( 'get_comment_author_url', $url, $id, $comment ); -} - -/** - * Display the url of the author of the current comment. - * - * @since 0.71 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @param int|WP_Comment $comment_ID Optional. WP_Comment or the ID of the comment for which to print the author's URL. - * Default current comment. - */ -function comment_author_url( $comment_ID = 0 ) { - $comment = get_comment( $comment_ID ); - $author_url = get_comment_author_url( $comment ); - - /** - * Filters the comment author's URL for display. - * - * @since 1.2.0 - * @since 4.1.0 The `$comment_ID` parameter was added. - * - * @param string $author_url The comment author's URL. - * @param int $comment_ID The comment ID. - */ - echo apply_filters( 'comment_url', $author_url, $comment->comment_ID ); -} - -/** - * Retrieves the HTML link of the url of the author of the current comment. - * - * $linktext parameter is only used if the URL does not exist for the comment - * author. If the URL does exist then the URL will be used and the $linktext - * will be ignored. - * - * Encapsulate the HTML link between the $before and $after. So it will appear - * in the order of $before, link, and finally $after. - * - * @since 1.5.0 - * @since 4.6.0 Added the `$comment` parameter. - * - * @param string $linktext Optional. The text to display instead of the comment - * author's email address. Default empty. - * @param string $before Optional. The text or HTML to display before the email link. - * Default empty. - * @param string $after Optional. The text or HTML to display after the email link. - * Default empty. - * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. - * Default is the current comment. - * @return string The HTML link between the $before and $after parameters. - */ -function get_comment_author_url_link( $linktext = '', $before = '', $after = '', $comment = 0 ) { - $url = get_comment_author_url( $comment ); - $display = ($linktext != '') ? $linktext : $url; - $display = str_replace( 'http://www.', '', $display ); - $display = str_replace( 'http://', '', $display ); - - if ( '/' == substr($display, -1) ) { - $display = substr($display, 0, -1); - } - - $return = "$before
      $display$after"; - - /** - * Filters the comment author's returned URL link. - * - * @since 1.5.0 - * - * @param string $return The HTML-formatted comment author URL link. - */ - return apply_filters( 'get_comment_author_url_link', $return ); -} - -/** - * Displays the HTML link of the url of the author of the current comment. - * - * @since 0.71 - * @since 4.6.0 Added the `$comment` parameter. - * - * @param string $linktext Optional. Text to display instead of the comment author's - * email address. Default empty. - * @param string $before Optional. Text or HTML to display before the email link. - * Default empty. - * @param string $after Optional. Text or HTML to display after the email link. - * Default empty. - * @param int|WP_Comment $comment Optional. Comment ID or WP_Comment object. - * Default is the current comment. - */ -function comment_author_url_link( $linktext = '', $before = '', $after = '', $comment = 0 ) { - echo get_comment_author_url_link( $linktext, $before, $after, $comment ); -} - -/** - * Generates semantic classes for each comment element. - * - * @since 2.7.0 - * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object. - * - * @param string|array $class Optional. One or more classes to add to the class list. - * Default empty. - * @param int|WP_Comment $comment Comment ID or WP_Comment object. Default current comment. - * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post. - * @param bool $echo Optional. Whether to cho or return the output. - * Default true. - * @return string If `$echo` is false, the class will be returned. Void otherwise. - */ -function comment_class( $class = '', $comment = null, $post_id = null, $echo = true ) { - // Separates classes with a single space, collates classes for comment DIV - $class = 'class="' . join( ' ', get_comment_class( $class, $comment, $post_id ) ) . '"'; - if ( $echo) - echo $class; - else - return $class; -} - -/** - * Returns the classes for the comment div as an array. - * - * @since 2.7.0 - * @since 4.4.0 Added the ability for `$comment_id` to also accept a WP_Comment object. - * - * @global int $comment_alt - * @global int $comment_depth - * @global int $comment_thread_alt - * - * @param string|array $class Optional. One or more classes to add to the class list. Default empty. - * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. Default current comment. - * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post. - * @return array An array of classes. - */ -function get_comment_class( $class = '', $comment_id = null, $post_id = null ) { - global $comment_alt, $comment_depth, $comment_thread_alt; - - $classes = array(); - - $comment = get_comment( $comment_id ); - if ( ! $comment ) { - return $classes; - } - - // Get the comment type (comment, trackback), - $classes[] = ( empty( $comment->comment_type ) ) ? 'comment' : $comment->comment_type; - - // Add classes for comment authors that are registered users. - if ( $comment->user_id > 0 && $user = get_userdata( $comment->user_id ) ) { - $classes[] = 'byuser'; - $classes[] = 'comment-author-' . sanitize_html_class( $user->user_nicename, $comment->user_id ); - // For comment authors who are the author of the post - if ( $post = get_post($post_id) ) { - if ( $comment->user_id === $post->post_author ) { - $classes[] = 'bypostauthor'; - } - } - } - - if ( empty($comment_alt) ) - $comment_alt = 0; - if ( empty($comment_depth) ) - $comment_depth = 1; - if ( empty($comment_thread_alt) ) - $comment_thread_alt = 0; - - if ( $comment_alt % 2 ) { - $classes[] = 'odd'; - $classes[] = 'alt'; - } else { - $classes[] = 'even'; - } - - $comment_alt++; - - // Alt for top-level comments - if ( 1 == $comment_depth ) { - if ( $comment_thread_alt % 2 ) { - $classes[] = 'thread-odd'; - $classes[] = 'thread-alt'; - } else { - $classes[] = 'thread-even'; - } - $comment_thread_alt++; - } - - $classes[] = "depth-$comment_depth"; - - if ( !empty($class) ) { - if ( !is_array( $class ) ) - $class = preg_split('#\s+#', $class); - $classes = array_merge($classes, $class); - } - - $classes = array_map('esc_attr', $classes); - - /** - * Filters the returned CSS classes for the current comment. - * - * @since 2.7.0 - * - * @param array $classes An array of comment classes. - * @param string $class A comma-separated list of additional classes added to the list. - * @param int $comment_id The comment id. - * @param WP_Comment $comment The comment object. - * @param int|WP_Post $post_id The post ID or WP_Post object. - */ - return apply_filters( 'comment_class', $classes, $class, $comment->comment_ID, $comment, $post_id ); -} - -/** - * Retrieve the comment date of the current comment. - * - * @since 1.5.0 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @param string $d Optional. The format of the date. Default user's setting. - * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to get the date. - * Default current comment. - * @return string The comment's date. - */ -function get_comment_date( $d = '', $comment_ID = 0 ) { - $comment = get_comment( $comment_ID ); - if ( '' == $d ) - $date = mysql2date(get_option('date_format'), $comment->comment_date); - else - $date = mysql2date($d, $comment->comment_date); - /** - * Filters the returned comment date. - * - * @since 1.5.0 - * - * @param string|int $date Formatted date string or Unix timestamp. - * @param string $d The format of the date. - * @param WP_Comment $comment The comment object. - */ - return apply_filters( 'get_comment_date', $date, $d, $comment ); -} - -/** - * Display the comment date of the current comment. - * - * @since 0.71 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @param string $d Optional. The format of the date. Default user's settings. - * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to print the date. - * Default current comment. - */ -function comment_date( $d = '', $comment_ID = 0 ) { - echo get_comment_date( $d, $comment_ID ); -} - -/** - * Retrieve the excerpt of the current comment. - * - * Will cut each word and only output the first 20 words with '…' at the end. - * If the word count is less than 20, then no truncating is done and no '…' - * will appear. - * - * @since 1.5.0 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to get the excerpt. - * Default current comment. - * @return string The maybe truncated comment with 20 words or less. - */ -function get_comment_excerpt( $comment_ID = 0 ) { - $comment = get_comment( $comment_ID ); - $comment_text = strip_tags( str_replace( array( "\n", "\r" ), ' ', $comment->comment_content ) ); - $words = explode( ' ', $comment_text ); - - /** - * Filters the amount of words used in the comment excerpt. - * - * @since 4.4.0 - * - * @param int $comment_excerpt_length The amount of words you want to display in the comment excerpt. - */ - $comment_excerpt_length = apply_filters( 'comment_excerpt_length', 20 ); - - $use_ellipsis = count( $words ) > $comment_excerpt_length; - if ( $use_ellipsis ) { - $words = array_slice( $words, 0, $comment_excerpt_length ); - } - - $excerpt = trim( join( ' ', $words ) ); - if ( $use_ellipsis ) { - $excerpt .= '…'; - } - /** - * Filters the retrieved comment excerpt. - * - * @since 1.5.0 - * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. - * - * @param string $excerpt The comment excerpt text. - * @param int $comment_ID The comment ID. - * @param WP_Comment $comment The comment object. - */ - return apply_filters( 'get_comment_excerpt', $excerpt, $comment->comment_ID, $comment ); -} - -/** - * Display the excerpt of the current comment. - * - * @since 1.2.0 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to print the excerpt. - * Default current comment. - */ -function comment_excerpt( $comment_ID = 0 ) { - $comment = get_comment( $comment_ID ); - $comment_excerpt = get_comment_excerpt( $comment ); - - /** - * Filters the comment excerpt for display. - * - * @since 1.2.0 - * @since 4.1.0 The `$comment_ID` parameter was added. - * - * @param string $comment_excerpt The comment excerpt text. - * @param int $comment_ID The comment ID. - */ - echo apply_filters( 'comment_excerpt', $comment_excerpt, $comment->comment_ID ); -} - -/** - * Retrieve the comment id of the current comment. - * - * @since 1.5.0 - * - * @return int The comment ID. - */ -function get_comment_ID() { - $comment = get_comment(); - - /** - * Filters the returned comment ID. - * - * @since 1.5.0 - * @since 4.1.0 The `$comment_ID` parameter was added. - * - * @param int $comment_ID The current comment ID. - * @param WP_Comment $comment The comment object. - */ - return apply_filters( 'get_comment_ID', $comment->comment_ID, $comment ); -} - -/** - * Display the comment id of the current comment. - * - * @since 0.71 - */ -function comment_ID() { - echo get_comment_ID(); -} - -/** - * Retrieve the link to a given comment. - * - * @since 1.5.0 - * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object. Added `$cpage` argument. - * - * @see get_page_of_comment() - * - * @global WP_Rewrite $wp_rewrite - * @global bool $in_comment_loop - * - * @param WP_Comment|int|null $comment Comment to retrieve. Default current comment. - * @param array $args { - * An array of optional arguments to override the defaults. - * - * @type string $type Passed to get_page_of_comment(). - * @type int $page Current page of comments, for calculating comment pagination. - * @type int $per_page Per-page value for comment pagination. - * @type int $max_depth Passed to get_page_of_comment(). - * @type int|string $cpage Value to use for the comment's "comment-page" or "cpage" value. - * If provided, this value overrides any value calculated from `$page` - * and `$per_page`. - * } - * @return string The permalink to the given comment. - */ -function get_comment_link( $comment = null, $args = array() ) { - global $wp_rewrite, $in_comment_loop; - - $comment = get_comment($comment); - - // Back-compat. - if ( ! is_array( $args ) ) { - $args = array( 'page' => $args ); - } - - $defaults = array( - 'type' => 'all', - 'page' => '', - 'per_page' => '', - 'max_depth' => '', - 'cpage' => null, - ); - $args = wp_parse_args( $args, $defaults ); - - $link = get_permalink( $comment->comment_post_ID ); - - // The 'cpage' param takes precedence. - if ( ! is_null( $args['cpage'] ) ) { - $cpage = $args['cpage']; - - // No 'cpage' is provided, so we calculate one. - } else { - if ( '' === $args['per_page'] && get_option( 'page_comments' ) ) { - $args['per_page'] = get_option('comments_per_page'); - } - - if ( empty( $args['per_page'] ) ) { - $args['per_page'] = 0; - $args['page'] = 0; - } - - $cpage = $args['page']; - - if ( '' == $cpage ) { - if ( ! empty( $in_comment_loop ) ) { - $cpage = get_query_var( 'cpage' ); - } else { - // Requires a database hit, so we only do it when we can't figure out from context. - $cpage = get_page_of_comment( $comment->comment_ID, $args ); - } - } - - /* - * If the default page displays the oldest comments, the permalinks for comments on the default page - * do not need a 'cpage' query var. - */ - if ( 'oldest' === get_option( 'default_comments_page' ) && 1 === $cpage ) { - $cpage = ''; - } - } - - if ( $cpage && get_option( 'page_comments' ) ) { - if ( $wp_rewrite->using_permalinks() ) { - if ( $cpage ) { - $link = trailingslashit( $link ) . $wp_rewrite->comments_pagination_base . '-' . $cpage; - } - - $link = user_trailingslashit( $link, 'comment' ); - } elseif ( $cpage ) { - $link = add_query_arg( 'cpage', $cpage, $link ); - } - - } - - if ( $wp_rewrite->using_permalinks() ) { - $link = user_trailingslashit( $link, 'comment' ); - } - - $link = $link . '#comment-' . $comment->comment_ID; - - /** - * Filters the returned single comment permalink. - * - * @since 2.8.0 - * @since 4.4.0 Added the `$cpage` parameter. - * - * @see get_page_of_comment() - * - * @param string $link The comment permalink with '#comment-$id' appended. - * @param WP_Comment $comment The current comment object. - * @param array $args An array of arguments to override the defaults. - * @param int $cpage The calculated 'cpage' value. - */ - return apply_filters( 'get_comment_link', $link, $comment, $args, $cpage ); -} - -/** - * Retrieves the link to the current post comments. - * - * @since 1.5.0 - * - * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is global $post. - * @return string The link to the comments. - */ -function get_comments_link( $post_id = 0 ) { - $hash = get_comments_number( $post_id ) ? '#comments' : '#respond'; - $comments_link = get_permalink( $post_id ) . $hash; - - /** - * Filters the returned post comments permalink. - * - * @since 3.6.0 - * - * @param string $comments_link Post comments permalink with '#comments' appended. - * @param int|WP_Post $post_id Post ID or WP_Post object. - */ - return apply_filters( 'get_comments_link', $comments_link, $post_id ); -} - -/** - * Display the link to the current post comments. - * - * @since 0.71 - * - * @param string $deprecated Not Used. - * @param string $deprecated_2 Not Used. - */ -function comments_link( $deprecated = '', $deprecated_2 = '' ) { - if ( !empty( $deprecated ) ) - _deprecated_argument( __FUNCTION__, '0.72' ); - if ( !empty( $deprecated_2 ) ) - _deprecated_argument( __FUNCTION__, '1.3.0' ); - echo esc_url( get_comments_link() ); -} - -/** - * Retrieve the amount of comments a post has. - * - * @since 1.5.0 - * - * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is global $post. - * @return int The number of comments a post has. - */ -function get_comments_number( $post_id = 0 ) { - $post = get_post( $post_id ); - - if ( ! $post ) { - $count = 0; - } else { - $count = $post->comment_count; - $post_id = $post->ID; - } - - /** - * Filters the returned comment count for a post. - * - * @since 1.5.0 - * - * @param int $count Number of comments a post has. - * @param int $post_id Post ID. - */ - return apply_filters( 'get_comments_number', $count, $post_id ); -} - -/** - * Display the language string for the number of comments the current post has. - * - * @since 0.71 - * - * @param string $zero Optional. Text for no comments. Default false. - * @param string $one Optional. Text for one comment. Default false. - * @param string $more Optional. Text for more than one comment. Default false. - * @param string $deprecated Not used. - */ -function comments_number( $zero = false, $one = false, $more = false, $deprecated = '' ) { - if ( ! empty( $deprecated ) ) { - _deprecated_argument( __FUNCTION__, '1.3.0' ); - } - echo get_comments_number_text( $zero, $one, $more ); -} - -/** - * Display the language string for the number of comments the current post has. - * - * @since 4.0.0 - * - * @param string $zero Optional. Text for no comments. Default false. - * @param string $one Optional. Text for one comment. Default false. - * @param string $more Optional. Text for more than one comment. Default false. - */ -function get_comments_number_text( $zero = false, $one = false, $more = false ) { - $number = get_comments_number(); - - if ( $number > 1 ) { - if ( false === $more ) { - /* translators: %s: number of comments */ - $output = sprintf( _n( '%s Comment', '%s Comments', $number ), number_format_i18n( $number ) ); - } else { - // % Comments - /* translators: If comment number in your language requires declension, - * translate this to 'on'. Do not translate into your own language. - */ - if ( 'on' === _x( 'off', 'Comment number declension: on or off' ) ) { - $text = preg_replace( '#.+?#', '', $more ); - $text = preg_replace( '/&.+?;/', '', $text ); // Kill entities - $text = trim( strip_tags( $text ), '% ' ); - - // Replace '% Comments' with a proper plural form - if ( $text && ! preg_match( '/[0-9]+/', $text ) && false !== strpos( $more, '%' ) ) { - /* translators: %s: number of comments */ - $new_text = _n( '%s Comment', '%s Comments', $number ); - $new_text = trim( sprintf( $new_text, '' ) ); - - $more = str_replace( $text, $new_text, $more ); - if ( false === strpos( $more, '%' ) ) { - $more = '% ' . $more; - } - } - } - - $output = str_replace( '%', number_format_i18n( $number ), $more ); - } - } elseif ( $number == 0 ) { - $output = ( false === $zero ) ? __( 'No Comments' ) : $zero; - } else { // must be one - $output = ( false === $one ) ? __( '1 Comment' ) : $one; - } - /** - * Filters the comments count for display. - * - * @since 1.5.0 - * - * @see _n() - * - * @param string $output A translatable string formatted based on whether the count - * is equal to 0, 1, or 1+. - * @param int $number The number of post comments. - */ - return apply_filters( 'comments_number', $output, $number ); -} - -/** - * Retrieve the text of the current comment. - * - * @since 1.5.0 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @see Walker_Comment::comment() - * - * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to get the text. - * Default current comment. - * @param array $args Optional. An array of arguments. Default empty. - * @return string The comment content. - */ -function get_comment_text( $comment_ID = 0, $args = array() ) { - $comment = get_comment( $comment_ID ); - - /** - * Filters the text of a comment. - * - * @since 1.5.0 - * - * @see Walker_Comment::comment() - * - * @param string $comment_content Text of the comment. - * @param WP_Comment $comment The comment object. - * @param array $args An array of arguments. - */ - return apply_filters( 'get_comment_text', $comment->comment_content, $comment, $args ); -} - -/** - * Display the text of the current comment. - * - * @since 0.71 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @see Walker_Comment::comment() - * - * @param int|WP_Comment $comment_ID WP_Comment or ID of the comment for which to print the text. - * Default current comment. - * @param array $args Optional. An array of arguments. Default empty array. Default empty. - */ -function comment_text( $comment_ID = 0, $args = array() ) { - $comment = get_comment( $comment_ID ); - - $comment_text = get_comment_text( $comment, $args ); - /** - * Filters the text of a comment to be displayed. - * - * @since 1.2.0 - * - * @see Walker_Comment::comment() - * - * @param string $comment_text Text of the current comment. - * @param WP_Comment $comment The comment object. - * @param array $args An array of arguments. - */ - echo apply_filters( 'comment_text', $comment_text, $comment, $args ); -} - -/** - * Retrieve the comment time of the current comment. - * - * @since 1.5.0 - * - * @param string $d Optional. The format of the time. Default user's settings. - * @param bool $gmt Optional. Whether to use the GMT date. Default false. - * @param bool $translate Optional. Whether to translate the time (for use in feeds). - * Default true. - * @return string The formatted time. - */ -function get_comment_time( $d = '', $gmt = false, $translate = true ) { - $comment = get_comment(); - - $comment_date = $gmt ? $comment->comment_date_gmt : $comment->comment_date; - if ( '' == $d ) - $date = mysql2date(get_option('time_format'), $comment_date, $translate); - else - $date = mysql2date($d, $comment_date, $translate); - - /** - * Filters the returned comment time. - * - * @since 1.5.0 - * - * @param string|int $date The comment time, formatted as a date string or Unix timestamp. - * @param string $d Date format. - * @param bool $gmt Whether the GMT date is in use. - * @param bool $translate Whether the time is translated. - * @param WP_Comment $comment The comment object. - */ - return apply_filters( 'get_comment_time', $date, $d, $gmt, $translate, $comment ); -} - -/** - * Display the comment time of the current comment. - * - * @since 0.71 - * - * @param string $d Optional. The format of the time. Default user's settings. - */ -function comment_time( $d = '' ) { - echo get_comment_time($d); -} - -/** - * Retrieve the comment type of the current comment. - * - * @since 1.5.0 - * @since 4.4.0 Added the ability for `$comment_ID` to also accept a WP_Comment object. - * - * @param int|WP_Comment $comment_ID Optional. WP_Comment or ID of the comment for which to get the type. - * Default current comment. - * @return string The comment type. - */ -function get_comment_type( $comment_ID = 0 ) { - $comment = get_comment( $comment_ID ); - if ( '' == $comment->comment_type ) - $comment->comment_type = 'comment'; - - /** - * Filters the returned comment type. - * - * @since 1.5.0 - * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added. - * - * @param string $comment_type The type of comment, such as 'comment', 'pingback', or 'trackback'. - * @param int $comment_ID The comment ID. - * @param WP_Comment $comment The comment object. - */ - return apply_filters( 'get_comment_type', $comment->comment_type, $comment->comment_ID, $comment ); -} - -/** - * Display the comment type of the current comment. - * - * @since 0.71 - * - * @param string $commenttxt Optional. String to display for comment type. Default false. - * @param string $trackbacktxt Optional. String to display for trackback type. Default false. - * @param string $pingbacktxt Optional. String to display for pingback type. Default false. - */ -function comment_type( $commenttxt = false, $trackbacktxt = false, $pingbacktxt = false ) { - if ( false === $commenttxt ) $commenttxt = _x( 'Comment', 'noun' ); - if ( false === $trackbacktxt ) $trackbacktxt = __( 'Trackback' ); - if ( false === $pingbacktxt ) $pingbacktxt = __( 'Pingback' ); - $type = get_comment_type(); - switch( $type ) { - case 'trackback' : - echo $trackbacktxt; - break; - case 'pingback' : - echo $pingbacktxt; - break; - default : - echo $commenttxt; - } -} - -/** - * Retrieve The current post's trackback URL. - * - * There is a check to see if permalink's have been enabled and if so, will - * retrieve the pretty path. If permalinks weren't enabled, the ID of the - * current post is used and appended to the correct page to go to. - * - * @since 1.5.0 - * - * @return string The trackback URL after being filtered. - */ -function get_trackback_url() { - if ( '' != get_option('permalink_structure') ) - $tb_url = trailingslashit(get_permalink()) . user_trailingslashit('trackback', 'single_trackback'); - else - $tb_url = get_option('siteurl') . '/wp-trackback.php?p=' . get_the_ID(); - - /** - * Filters the returned trackback URL. - * - * @since 2.2.0 - * - * @param string $tb_url The trackback URL. - */ - return apply_filters( 'trackback_url', $tb_url ); -} - -/** - * Display the current post's trackback URL. - * - * @since 0.71 - * - * @param bool $deprecated_echo Not used. - * @return void|string Should only be used to echo the trackback URL, use get_trackback_url() - * for the result instead. - */ -function trackback_url( $deprecated_echo = true ) { - if ( true !== $deprecated_echo ) { - _deprecated_argument( __FUNCTION__, '2.5.0', - /* translators: %s: get_trackback_url() */ - sprintf( __( 'Use %s instead if you do not want the value echoed.' ), - 'get_trackback_url()' - ) - ); - } - - if ( $deprecated_echo ) { - echo get_trackback_url(); - } else { - return get_trackback_url(); - } -} - -/** - * Generate and display the RDF for the trackback information of current post. - * - * Deprecated in 3.0.0, and restored in 3.0.1. - * - * @since 0.71 - * - * @param int $deprecated Not used (Was $timezone = 0). - */ -function trackback_rdf( $deprecated = '' ) { - if ( ! empty( $deprecated ) ) { - _deprecated_argument( __FUNCTION__, '2.5.0' ); - } - - if ( isset( $_SERVER['HTTP_USER_AGENT'] ) && false !== stripos( $_SERVER['HTTP_USER_AGENT'], 'W3C_Validator' ) ) { - return; - } - - echo ' - \n"; - echo ''; -} - -/** - * Whether the current post is open for comments. - * - * @since 1.5.0 - * - * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post. - * @return bool True if the comments are open. - */ -function comments_open( $post_id = null ) { - - $_post = get_post($post_id); - - $open = ( 'open' == $_post->comment_status ); - - /** - * Filters whether the current post is open for comments. - * - * @since 2.5.0 - * - * @param bool $open Whether the current post is open for comments. - * @param int|WP_Post $post_id The post ID or WP_Post object. - */ - return apply_filters( 'comments_open', $open, $post_id ); -} - -/** - * Whether the current post is open for pings. - * - * @since 1.5.0 - * - * @param int|WP_Post $post_id Post ID or WP_Post object. Default current post. - * @return bool True if pings are accepted - */ -function pings_open( $post_id = null ) { - - $_post = get_post($post_id); - - $open = ( 'open' == $_post->ping_status ); - - /** - * Filters whether the current post is open for pings. - * - * @since 2.5.0 - * - * @param bool $open Whether the current post is open for pings. - * @param int|WP_Post $post_id The post ID or WP_Post object. - */ - return apply_filters( 'pings_open', $open, $post_id ); -} - -/** - * Display form token for unfiltered comments. - * - * Will only display nonce token if the current user has permissions for - * unfiltered html. Won't display the token for other users. - * - * The function was backported to 2.0.10 and was added to versions 2.1.3 and - * above. Does not exist in versions prior to 2.0.10 in the 2.0 branch and in - * the 2.1 branch, prior to 2.1.3. Technically added in 2.2.0. - * - * Backported to 2.0.10. - * - * @since 2.1.3 - */ -function wp_comment_form_unfiltered_html_nonce() { - $post = get_post(); - $post_id = $post ? $post->ID : 0; - - if ( current_user_can( 'unfiltered_html' ) ) { - wp_nonce_field( 'unfiltered-html-comment_' . $post_id, '_wp_unfiltered_html_comment_disabled', false ); - echo "\n"; - } -} - -/** - * Load the comment template specified in $file. - * - * Will not display the comments template if not on single post or page, or if - * the post does not have comments. - * - * Uses the WordPress database object to query for the comments. The comments - * are passed through the {@see 'comments_array'} filter hook with the list of comments - * and the post ID respectively. - * - * The `$file` path is passed through a filter hook called {@see 'comments_template'}, - * which includes the TEMPLATEPATH and $file combined. Tries the $filtered path - * first and if it fails it will require the default comment template from the - * default theme. If either does not exist, then the WordPress process will be - * halted. It is advised for that reason, that the default theme is not deleted. - * - * Will not try to get the comments if the post has none. - * - * @since 1.5.0 - * - * @global WP_Query $wp_query - * @global WP_Post $post - * @global wpdb $wpdb - * @global int $id - * @global WP_Comment $comment - * @global string $user_login - * @global int $user_ID - * @global string $user_identity - * @global bool $overridden_cpage - * @global bool $withcomments - * - * @param string $file Optional. The file to load. Default '/comments.php'. - * @param bool $separate_comments Optional. Whether to separate the comments by comment type. - * Default false. - */ -function comments_template( $file = '/comments.php', $separate_comments = false ) { - global $wp_query, $withcomments, $post, $wpdb, $id, $comment, $user_login, $user_ID, $user_identity, $overridden_cpage; - - if ( !(is_single() || is_page() || $withcomments) || empty($post) ) - return; - - if ( empty($file) ) - $file = '/comments.php'; - - $req = get_option('require_name_email'); - - /* - * Comment author information fetched from the comment cookies. - */ - $commenter = wp_get_current_commenter(); - - /* - * The name of the current comment author escaped for use in attributes. - * Escaped by sanitize_comment_cookies(). - */ - $comment_author = $commenter['comment_author']; - - /* - * The email address of the current comment author escaped for use in attributes. - * Escaped by sanitize_comment_cookies(). - */ - $comment_author_email = $commenter['comment_author_email']; - - /* - * The url of the current comment author escaped for use in attributes. - */ - $comment_author_url = esc_url($commenter['comment_author_url']); - - $comment_args = array( - 'orderby' => 'comment_date_gmt', - 'order' => 'ASC', - 'status' => 'approve', - 'post_id' => $post->ID, - 'no_found_rows' => false, - 'update_comment_meta_cache' => false, // We lazy-load comment meta for performance. - ); - - if ( get_option('thread_comments') ) { - $comment_args['hierarchical'] = 'threaded'; - } else { - $comment_args['hierarchical'] = false; - } - - if ( $user_ID ) { - $comment_args['include_unapproved'] = array( $user_ID ); - } elseif ( ! empty( $comment_author_email ) ) { - $comment_args['include_unapproved'] = array( $comment_author_email ); - } - - $per_page = 0; - if ( get_option( 'page_comments' ) ) { - $per_page = (int) get_query_var( 'comments_per_page' ); - if ( 0 === $per_page ) { - $per_page = (int) get_option( 'comments_per_page' ); - } - - $comment_args['number'] = $per_page; - $page = (int) get_query_var( 'cpage' ); - - if ( $page ) { - $comment_args['offset'] = ( $page - 1 ) * $per_page; - } elseif ( 'oldest' === get_option( 'default_comments_page' ) ) { - $comment_args['offset'] = 0; - } else { - // If fetching the first page of 'newest', we need a top-level comment count. - $top_level_query = new WP_Comment_Query(); - $top_level_args = array( - 'count' => true, - 'orderby' => false, - 'post_id' => $post->ID, - 'status' => 'approve', - ); - - if ( $comment_args['hierarchical'] ) { - $top_level_args['parent'] = 0; - } - - if ( isset( $comment_args['include_unapproved'] ) ) { - $top_level_args['include_unapproved'] = $comment_args['include_unapproved']; - } - - $top_level_count = $top_level_query->query( $top_level_args ); - - $comment_args['offset'] = ( ceil( $top_level_count / $per_page ) - 1 ) * $per_page; - } - } - - /** - * Filters the arguments used to query comments in comments_template(). - * - * @since 4.5.0 - * - * @see WP_Comment_Query::__construct() - * - * @param array $comment_args { - * Array of WP_Comment_Query arguments. - * - * @type string|array $orderby Field(s) to order by. - * @type string $order Order of results. Accepts 'ASC' or 'DESC'. - * @type string $status Comment status. - * @type array $include_unapproved Array of IDs or email addresses whose unapproved comments - * will be included in results. - * @type int $post_id ID of the post. - * @type bool $no_found_rows Whether to refrain from querying for found rows. - * @type bool $update_comment_meta_cache Whether to prime cache for comment meta. - * @type bool|string $hierarchical Whether to query for comments hierarchically. - * @type int $offset Comment offset. - * @type int $number Number of comments to fetch. - * } - */ - $comment_args = apply_filters( 'comments_template_query_args', $comment_args ); - $comment_query = new WP_Comment_Query( $comment_args ); - $_comments = $comment_query->comments; - - // Trees must be flattened before they're passed to the walker. - if ( $comment_args['hierarchical'] ) { - $comments_flat = array(); - foreach ( $_comments as $_comment ) { - $comments_flat[] = $_comment; - $comment_children = $_comment->get_children( array( - 'format' => 'flat', - 'status' => $comment_args['status'], - 'orderby' => $comment_args['orderby'] - ) ); - - foreach ( $comment_children as $comment_child ) { - $comments_flat[] = $comment_child; - } - } - } else { - $comments_flat = $_comments; - } - - /** - * Filters the comments array. - * - * @since 2.1.0 - * - * @param array $comments Array of comments supplied to the comments template. - * @param int $post_ID Post ID. - */ - $wp_query->comments = apply_filters( 'comments_array', $comments_flat, $post->ID ); - - $comments = &$wp_query->comments; - $wp_query->comment_count = count($wp_query->comments); - $wp_query->max_num_comment_pages = $comment_query->max_num_pages; - - if ( $separate_comments ) { - $wp_query->comments_by_type = separate_comments($comments); - $comments_by_type = &$wp_query->comments_by_type; - } else { - $wp_query->comments_by_type = array(); - } - - $overridden_cpage = false; - if ( '' == get_query_var( 'cpage' ) && $wp_query->max_num_comment_pages > 1 ) { - set_query_var( 'cpage', 'newest' == get_option('default_comments_page') ? get_comment_pages_count() : 1 ); - $overridden_cpage = true; - } - - if ( !defined('COMMENTS_TEMPLATE') ) - define('COMMENTS_TEMPLATE', true); - - $theme_template = STYLESHEETPATH . $file; - /** - * Filters the path to the theme template file used for the comments template. - * - * @since 1.5.1 - * - * @param string $theme_template The path to the theme template file. - */ - $include = apply_filters( 'comments_template', $theme_template ); - if ( file_exists( $include ) ) - require( $include ); - elseif ( file_exists( TEMPLATEPATH . $file ) ) - require( TEMPLATEPATH . $file ); - else // Backward compat code will be removed in a future release - require( ABSPATH . WPINC . '/theme-compat/comments.php'); -} - -/** - * Displays the link to the comments for the current post ID. - * - * @since 0.71 - * - * @param string $zero Optional. String to display when no comments. Default false. - * @param string $one Optional. String to display when only one comment is available. - * Default false. - * @param string $more Optional. String to display when there are more than one comment. - * Default false. - * @param string $css_class Optional. CSS class to use for comments. Default empty. - * @param string $none Optional. String to display when comments have been turned off. - * Default false. - */ -function comments_popup_link( $zero = false, $one = false, $more = false, $css_class = '', $none = false ) { - $id = get_the_ID(); - $title = get_the_title(); - $number = get_comments_number( $id ); - - if ( false === $zero ) { - /* translators: %s: post title */ - $zero = sprintf( __( 'No Comments on %s' ), $title ); - } - - if ( false === $one ) { - /* translators: %s: post title */ - $one = sprintf( __( '1 Comment on %s' ), $title ); - } - - if ( false === $more ) { - /* translators: 1: Number of comments 2: post title */ - $more = _n( '%1$s Comment on %2$s', '%1$s Comments on %2$s', $number ); - $more = sprintf( $more, number_format_i18n( $number ), $title ); - } - - if ( false === $none ) { - /* translators: %s: post title */ - $none = sprintf( __( 'Comments Off on %s' ), $title ); - } - - if ( 0 == $number && !comments_open() && !pings_open() ) { - echo '' . $none . ''; - return; - } - - if ( post_password_required() ) { - _e( 'Enter your password to view comments.' ); - return; - } - - echo ''; - comments_number( $zero, $one, $more ); - echo ''; -} - -/** - * Retrieve HTML content for reply to comment link. - * - * @since 2.7.0 - * @since 4.4.0 Added the ability for `$comment` to also accept a WP_Comment object. - * - * @param array $args { - * Optional. Override default arguments. - * - * @type string $add_below The first part of the selector used to identify the comment to respond below. - * The resulting value is passed as the first parameter to addComment.moveForm(), - * concatenated as $add_below-$comment->comment_ID. Default 'comment'. - * @type string $respond_id The selector identifying the responding comment. Passed as the third parameter - * to addComment.moveForm(), and appended to the link URL as a hash value. - * Default 'respond'. - * @type string $reply_text The text of the Reply link. Default 'Reply'. - * @type string $login_text The text of the link to reply if logged out. Default 'Log in to Reply'. - * @type int $max_depth The max depth of the comment tree. Default 0. - * @type int $depth The depth of the new comment. Must be greater than 0 and less than the value - * of the 'thread_comments_depth' option set in Settings > Discussion. Default 0. - * @type string $before The text or HTML to add before the reply link. Default empty. - * @type string $after The text or HTML to add after the reply link. Default empty. - * } - * @param int|WP_Comment $comment Comment being replied to. Default current comment. - * @param int|WP_Post $post Post ID or WP_Post object the comment is going to be displayed on. - * Default current post. - * @return void|false|string Link to show comment form, if successful. False, if comments are closed. - */ -function get_comment_reply_link( $args = array(), $comment = null, $post = null ) { - $defaults = array( - 'add_below' => 'comment', - 'respond_id' => 'respond', - 'reply_text' => __( 'Reply' ), - /* translators: Comment reply button text. 1: Comment author name */ - 'reply_to_text' => __( 'Reply to %s' ), - 'login_text' => __( 'Log in to Reply' ), - 'max_depth' => 0, - 'depth' => 0, - 'before' => '', - 'after' => '' - ); - - $args = wp_parse_args( $args, $defaults ); - - if ( 0 == $args['depth'] || $args['max_depth'] <= $args['depth'] ) { - return; - } - - $comment = get_comment( $comment ); - - if ( empty( $post ) ) { - $post = $comment->comment_post_ID; - } - - $post = get_post( $post ); - - if ( ! comments_open( $post->ID ) ) { - return false; - } - - /** - * Filters the comment reply link arguments. - * - * @since 4.1.0 - * - * @param array $args Comment reply link arguments. See get_comment_reply_link() - * for more information on accepted arguments. - * @param WP_Comment $comment The object of the comment being replied to. - * @param WP_Post $post The WP_Post object. - */ - $args = apply_filters( 'comment_reply_link_args', $args, $comment, $post ); - - if ( get_option( 'comment_registration' ) && ! is_user_logged_in() ) { - $link = sprintf( '', - esc_url( wp_login_url( get_permalink() ) ), - $args['login_text'] - ); - } else { - $onclick = sprintf( 'return addComment.moveForm( "%1$s-%2$s", "%2$s", "%3$s", "%4$s" )', - $args['add_below'], $comment->comment_ID, $args['respond_id'], $post->ID - ); - - $link = sprintf( "%s", - esc_url( add_query_arg( 'replytocom', $comment->comment_ID, get_permalink( $post->ID ) ) ) . "#" . $args['respond_id'], - $onclick, - esc_attr( sprintf( $args['reply_to_text'], $comment->comment_author ) ), - $args['reply_text'] - ); - } - - /** - * Filters the comment reply link. - * - * @since 2.7.0 - * - * @param string $link The HTML markup for the comment reply link. - * @param array $args An array of arguments overriding the defaults. - * @param object $comment The object of the comment being replied. - * @param WP_Post $post The WP_Post object. - */ - return apply_filters( 'comment_reply_link', $args['before'] . $link . $args['after'], $args, $comment, $post ); -} - -/** - * Displays the HTML content for reply to comment link. - * - * @since 2.7.0 - * - * @see get_comment_reply_link() - * - * @param array $args Optional. Override default options. - * @param int $comment Comment being replied to. Default current comment. - * @param int|WP_Post $post Post ID or WP_Post object the comment is going to be displayed on. - * Default current post. - * @return mixed Link to show comment form, if successful. False, if comments are closed. - */ -function comment_reply_link($args = array(), $comment = null, $post = null) { - echo get_comment_reply_link($args, $comment, $post); -} - -/** - * Retrieve HTML content for reply to post link. - * - * @since 2.7.0 - * - * @param array $args { - * Optional. Override default arguments. - * - * @type string $add_below The first part of the selector used to identify the comment to respond below. - * The resulting value is passed as the first parameter to addComment.moveForm(), - * concatenated as $add_below-$comment->comment_ID. Default is 'post'. - * @type string $respond_id The selector identifying the responding comment. Passed as the third parameter - * to addComment.moveForm(), and appended to the link URL as a hash value. - * Default 'respond'. - * @type string $reply_text Text of the Reply link. Default is 'Leave a Comment'. - * @type string $login_text Text of the link to reply if logged out. Default is 'Log in to leave a Comment'. - * @type string $before Text or HTML to add before the reply link. Default empty. - * @type string $after Text or HTML to add after the reply link. Default empty. - * } - * @param int|WP_Post $post Optional. Post ID or WP_Post object the comment is going to be displayed on. - * Default current post. - * @return false|null|string Link to show comment form, if successful. False, if comments are closed. - */ -function get_post_reply_link($args = array(), $post = null) { - $defaults = array( - 'add_below' => 'post', - 'respond_id' => 'respond', - 'reply_text' => __('Leave a Comment'), - 'login_text' => __('Log in to leave a Comment'), - 'before' => '', - 'after' => '', - ); - - $args = wp_parse_args($args, $defaults); - - $post = get_post($post); - - if ( ! comments_open( $post->ID ) ) { - return false; - } - - if ( get_option('comment_registration') && ! is_user_logged_in() ) { - $link = sprintf( '', - wp_login_url( get_permalink() ), - $args['login_text'] - ); - } else { - $onclick = sprintf( 'return addComment.moveForm( "%1$s-%2$s", "0", "%3$s", "%2$s" )', - $args['add_below'], $post->ID, $args['respond_id'] - ); - - $link = sprintf( "%s", - get_permalink( $post->ID ) . '#' . $args['respond_id'], - $onclick, - $args['reply_text'] - ); - } - $formatted_link = $args['before'] . $link . $args['after']; - - /** - * Filters the formatted post comments link HTML. - * - * @since 2.7.0 - * - * @param string $formatted The HTML-formatted post comments link. - * @param int|WP_Post $post The post ID or WP_Post object. - */ - return apply_filters( 'post_comments_link', $formatted_link, $post ); -} - -/** - * Displays the HTML content for reply to post link. - * - * @since 2.7.0 - * - * @see get_post_reply_link() - * - * @param array $args Optional. Override default options, - * @param int|WP_Post $post Post ID or WP_Post object the comment is going to be displayed on. - * Default current post. - * @return string|bool|null Link to show comment form, if successful. False, if comments are closed. - */ -function post_reply_link($args = array(), $post = null) { - echo get_post_reply_link($args, $post); -} - -/** - * Retrieve HTML content for cancel comment reply link. - * - * @since 2.7.0 - * - * @param string $text Optional. Text to display for cancel reply link. Default empty. - * @return string - */ -function get_cancel_comment_reply_link( $text = '' ) { - if ( empty($text) ) - $text = __('Click here to cancel reply.'); - - $style = isset($_GET['replytocom']) ? '' : ' style="display:none;"'; - $link = esc_html( remove_query_arg('replytocom') ) . '#respond'; - - $formatted_link = '' . $text . ''; - - /** - * Filters the cancel comment reply link HTML. - * - * @since 2.7.0 - * - * @param string $formatted_link The HTML-formatted cancel comment reply link. - * @param string $link Cancel comment reply link URL. - * @param string $text Cancel comment reply link text. - */ - return apply_filters( 'cancel_comment_reply_link', $formatted_link, $link, $text ); -} - -/** - * Display HTML content for cancel comment reply link. - * - * @since 2.7.0 - * - * @param string $text Optional. Text to display for cancel reply link. Default empty. - */ -function cancel_comment_reply_link( $text = '' ) { - echo get_cancel_comment_reply_link($text); -} - -/** - * Retrieve hidden input HTML for replying to comments. - * - * @since 3.0.0 - * - * @param int $id Optional. Post ID. Default current post ID. - * @return string Hidden input HTML for replying to comments - */ -function get_comment_id_fields( $id = 0 ) { - if ( empty( $id ) ) - $id = get_the_ID(); - - $replytoid = isset($_GET['replytocom']) ? (int) $_GET['replytocom'] : 0; - $result = "\n"; - $result .= "\n"; - - /** - * Filters the returned comment id fields. - * - * @since 3.0.0 - * - * @param string $result The HTML-formatted hidden id field comment elements. - * @param int $id The post ID. - * @param int $replytoid The id of the comment being replied to. - */ - return apply_filters( 'comment_id_fields', $result, $id, $replytoid ); -} - -/** - * Output hidden input HTML for replying to comments. - * - * @since 2.7.0 - * - * @param int $id Optional. Post ID. Default current post ID. - */ -function comment_id_fields( $id = 0 ) { - echo get_comment_id_fields( $id ); -} - -/** - * Display text based on comment reply status. - * - * Only affects users with JavaScript disabled. - * - * @internal The $comment global must be present to allow template tags access to the current - * comment. See https://core.trac.wordpress.org/changeset/36512. - * - * @since 2.7.0 - * - * @global WP_Comment $comment Current comment. - * - * @param string $noreplytext Optional. Text to display when not replying to a comment. - * Default false. - * @param string $replytext Optional. Text to display when replying to a comment. - * Default false. Accepts "%s" for the author of the comment - * being replied to. - * @param string $linktoparent Optional. Boolean to control making the author's name a link - * to their comment. Default true. - */ -function comment_form_title( $noreplytext = false, $replytext = false, $linktoparent = true ) { - global $comment; - - if ( false === $noreplytext ) $noreplytext = __( 'Leave a Reply' ); - if ( false === $replytext ) $replytext = __( 'Leave a Reply to %s' ); - - $replytoid = isset($_GET['replytocom']) ? (int) $_GET['replytocom'] : 0; - - if ( 0 == $replytoid ) - echo $noreplytext; - else { - // Sets the global so that template tags can be used in the comment form. - $comment = get_comment($replytoid); - $author = ( $linktoparent ) ? '' . get_comment_author( $comment ) . '' : get_comment_author( $comment ); - printf( $replytext, $author ); - } -} - -/** - * List comments. - * - * Used in the comments.php template to list comments for a particular post. - * - * @since 2.7.0 - * - * @see WP_Query->comments - * - * @global WP_Query $wp_query - * @global int $comment_alt - * @global int $comment_depth - * @global int $comment_thread_alt - * @global bool $overridden_cpage - * @global bool $in_comment_loop - * - * @param string|array $args { - * Optional. Formatting options. - * - * @type object $walker Instance of a Walker class to list comments. Default null. - * @type int $max_depth The maximum comments depth. Default empty. - * @type string $style The style of list ordering. Default 'ul'. Accepts 'ul', 'ol'. - * @type string $callback Callback function to use. Default null. - * @type string $end-callback Callback function to use at the end. Default null. - * @type string $type Type of comments to list. - * Default 'all'. Accepts 'all', 'comment', 'pingback', 'trackback', 'pings'. - * @type int $page Page ID to list comments for. Default empty. - * @type int $per_page Number of comments to list per page. Default empty. - * @type int $avatar_size Height and width dimensions of the avatar size. Default 32. - * @type bool $reverse_top_level Ordering of the listed comments. If true, will display newest comments first. - * @type bool $reverse_children Whether to reverse child comments in the list. Default null. - * @type string $format How to format the comments list. - * Default 'html5' if the theme supports it. Accepts 'html5', 'xhtml'. - * @type bool $short_ping Whether to output short pings. Default false. - * @type bool $echo Whether to echo the output or return it. Default true. - * } - * @param array $comments Optional. Array of WP_Comment objects. - */ -function wp_list_comments( $args = array(), $comments = null ) { - global $wp_query, $comment_alt, $comment_depth, $comment_thread_alt, $overridden_cpage, $in_comment_loop; - - $in_comment_loop = true; - - $comment_alt = $comment_thread_alt = 0; - $comment_depth = 1; - - $defaults = array( - 'walker' => null, - 'max_depth' => '', - 'style' => 'ul', - 'callback' => null, - 'end-callback' => null, - 'type' => 'all', - 'page' => '', - 'per_page' => '', - 'avatar_size' => 32, - 'reverse_top_level' => null, - 'reverse_children' => '', - 'format' => current_theme_supports( 'html5', 'comment-list' ) ? 'html5' : 'xhtml', - 'short_ping' => false, - 'echo' => true, - ); - - $r = wp_parse_args( $args, $defaults ); - - /** - * Filters the arguments used in retrieving the comment list. - * - * @since 4.0.0 - * - * @see wp_list_comments() - * - * @param array $r An array of arguments for displaying comments. - */ - $r = apply_filters( 'wp_list_comments_args', $r ); - - // Figure out what comments we'll be looping through ($_comments) - if ( null !== $comments ) { - $comments = (array) $comments; - if ( empty($comments) ) - return; - if ( 'all' != $r['type'] ) { - $comments_by_type = separate_comments($comments); - if ( empty($comments_by_type[$r['type']]) ) - return; - $_comments = $comments_by_type[$r['type']]; - } else { - $_comments = $comments; - } - } else { - /* - * If 'page' or 'per_page' has been passed, and does not match what's in $wp_query, - * perform a separate comment query and allow Walker_Comment to paginate. - */ - if ( $r['page'] || $r['per_page'] ) { - $current_cpage = get_query_var( 'cpage' ); - if ( ! $current_cpage ) { - $current_cpage = 'newest' === get_option( 'default_comments_page' ) ? 1 : $wp_query->max_num_comment_pages; - } - - $current_per_page = get_query_var( 'comments_per_page' ); - if ( $r['page'] != $current_cpage || $r['per_page'] != $current_per_page ) { - $comment_args = array( - 'post_id' => get_the_ID(), - 'orderby' => 'comment_date_gmt', - 'order' => 'ASC', - 'status' => 'approve', - ); - - if ( is_user_logged_in() ) { - $comment_args['include_unapproved'] = get_current_user_id(); - } else { - $commenter = wp_get_current_commenter(); - if ( $commenter['comment_author_email'] ) { - $comment_args['include_unapproved'] = $commenter['comment_author_email']; - } - } - - $comments = get_comments( $comment_args ); - - if ( 'all' != $r['type'] ) { - $comments_by_type = separate_comments( $comments ); - if ( empty( $comments_by_type[ $r['type'] ] ) ) { - return; - } - - $_comments = $comments_by_type[ $r['type'] ]; - } else { - $_comments = $comments; - } - } - - // Otherwise, fall back on the comments from `$wp_query->comments`. - } else { - if ( empty($wp_query->comments) ) - return; - if ( 'all' != $r['type'] ) { - if ( empty($wp_query->comments_by_type) ) - $wp_query->comments_by_type = separate_comments($wp_query->comments); - if ( empty($wp_query->comments_by_type[$r['type']]) ) - return; - $_comments = $wp_query->comments_by_type[$r['type']]; - } else { - $_comments = $wp_query->comments; - } - - if ( $wp_query->max_num_comment_pages ) { - $default_comments_page = get_option( 'default_comments_page' ); - $cpage = get_query_var( 'cpage' ); - if ( 'newest' === $default_comments_page ) { - $r['cpage'] = $cpage; - - /* - * When first page shows oldest comments, post permalink is the same as - * the comment permalink. - */ - } elseif ( $cpage == 1 ) { - $r['cpage'] = ''; - } else { - $r['cpage'] = $cpage; - } - - $r['page'] = 0; - $r['per_page'] = 0; - } - } - } - - if ( '' === $r['per_page'] && get_option( 'page_comments' ) ) { - $r['per_page'] = get_query_var('comments_per_page'); - } - - if ( empty($r['per_page']) ) { - $r['per_page'] = 0; - $r['page'] = 0; - } - - if ( '' === $r['max_depth'] ) { - if ( get_option('thread_comments') ) - $r['max_depth'] = get_option('thread_comments_depth'); - else - $r['max_depth'] = -1; - } - - if ( '' === $r['page'] ) { - if ( empty($overridden_cpage) ) { - $r['page'] = get_query_var('cpage'); - } else { - $threaded = ( -1 != $r['max_depth'] ); - $r['page'] = ( 'newest' == get_option('default_comments_page') ) ? get_comment_pages_count($_comments, $r['per_page'], $threaded) : 1; - set_query_var( 'cpage', $r['page'] ); - } - } - // Validation check - $r['page'] = intval($r['page']); - if ( 0 == $r['page'] && 0 != $r['per_page'] ) - $r['page'] = 1; - - if ( null === $r['reverse_top_level'] ) - $r['reverse_top_level'] = ( 'desc' == get_option('comment_order') ); - - wp_queue_comments_for_comment_meta_lazyload( $_comments ); - - if ( empty( $r['walker'] ) ) { - $walker = new Walker_Comment; - } else { - $walker = $r['walker']; - } - - $output = $walker->paged_walk( $_comments, $r['max_depth'], $r['page'], $r['per_page'], $r ); - - $in_comment_loop = false; - - if ( $r['echo'] ) { - echo $output; - } else { - return $output; - } -} - -/** - * Outputs a complete commenting form for use within a template. - * - * Most strings and form fields may be controlled through the $args array passed - * into the function, while you may also choose to use the {@see 'comment_form_default_fields'} - * filter to modify the array of default fields if you'd just like to add a new - * one or remove a single field. All fields are also individually passed through - * a filter of the {@see 'comment_form_field_$name'} where $name is the key used - * in the array of fields. - * - * @since 3.0.0 - * @since 4.1.0 Introduced the 'class_submit' argument. - * @since 4.2.0 Introduced the 'submit_button' and 'submit_fields' arguments. - * @since 4.4.0 Introduced the 'class_form', 'title_reply_before', 'title_reply_after', - * 'cancel_reply_before', and 'cancel_reply_after' arguments. - * @since 4.5.0 The 'author', 'email', and 'url' form fields are limited to 245, 100, - * and 200 characters, respectively. - * @since 4.6.0 Introduced the 'action' argument. - * - * @param array $args { - * Optional. Default arguments and form fields to override. - * - * @type array $fields { - * Default comment fields, filterable by default via the {@see 'comment_form_default_fields'} hook. - * - * @type string $author Comment author field HTML. - * @type string $email Comment author email field HTML. - * @type string $url Comment author URL field HTML. - * } - * @type string $comment_field The comment textarea field HTML. - * @type string $must_log_in HTML element for a 'must be logged in to comment' message. - * @type string $logged_in_as HTML element for a 'logged in as [user]' message. - * @type string $comment_notes_before HTML element for a message displayed before the comment fields - * if the user is not logged in. - * Default 'Your email address will not be published.'. - * @type string $comment_notes_after HTML element for a message displayed after the textarea field. - * @type string $action The comment form element action attribute. Default '/wp-comments-post.php'. - * @type string $id_form The comment form element id attribute. Default 'commentform'. - * @type string $id_submit The comment submit element id attribute. Default 'submit'. - * @type string $class_form The comment form element class attribute. Default 'comment-form'. - * @type string $class_submit The comment submit element class attribute. Default 'submit'. - * @type string $name_submit The comment submit element name attribute. Default 'submit'. - * @type string $title_reply The translatable 'reply' button label. Default 'Leave a Reply'. - * @type string $title_reply_to The translatable 'reply-to' button label. Default 'Leave a Reply to %s', - * where %s is the author of the comment being replied to. - * @type string $title_reply_before HTML displayed before the comment form title. - * Default: '

      '. - * @type string $title_reply_after HTML displayed after the comment form title. - * Default: '

      '. - * @type string $cancel_reply_before HTML displayed before the cancel reply link. - * @type string $cancel_reply_after HTML displayed after the cancel reply link. - * @type string $cancel_reply_link The translatable 'cancel reply' button label. Default 'Cancel reply'. - * @type string $label_submit The translatable 'submit' button label. Default 'Post a comment'. - * @type string $submit_button HTML format for the Submit button. - * Default: ''. - * @type string $submit_field HTML format for the markup surrounding the Submit button and comment hidden - * fields. Default: '

      %1$s %2$s', where %1$s is the - * submit button markup and %2$s is the comment hidden fields. - * @type string $format The comment form format. Default 'xhtml'. Accepts 'xhtml', 'html5'. - * } - * @param int|WP_Post $post_id Post ID or WP_Post object to generate the form for. Default current post. - */ -function comment_form( $args = array(), $post_id = null ) { - if ( null === $post_id ) - $post_id = get_the_ID(); - - // Exit the function when comments for the post are closed. - if ( ! comments_open( $post_id ) ) { - /** - * Fires after the comment form if comments are closed. - * - * @since 3.0.0 - */ - do_action( 'comment_form_comments_closed' ); - - return; - } - - $commenter = wp_get_current_commenter(); - $user = wp_get_current_user(); - $user_identity = $user->exists() ? $user->display_name : ''; - - $args = wp_parse_args( $args ); - if ( ! isset( $args['format'] ) ) - $args['format'] = current_theme_supports( 'html5', 'comment-form' ) ? 'html5' : 'xhtml'; - - $req = get_option( 'require_name_email' ); - $aria_req = ( $req ? " aria-required='true'" : '' ); - $html_req = ( $req ? " required='required'" : '' ); - $html5 = 'html5' === $args['format']; - $fields = array( - 'author' => '

      ' . ' ' . - '

      ', - 'email' => '', - 'url' => '

      ' . - '

      ', - ); - - $required_text = sprintf( ' ' . __('Required fields are marked %s'), '*' ); - - /** - * Filters the default comment form fields. - * - * @since 3.0.0 - * - * @param array $fields The default comment fields. - */ - $fields = apply_filters( 'comment_form_default_fields', $fields ); - $defaults = array( - 'fields' => $fields, - 'comment_field' => '

      ', - /** This filter is documented in wp-includes/link-template.php */ - 'must_log_in' => '', - /** This filter is documented in wp-includes/link-template.php */ - 'logged_in_as' => '

      ' . sprintf( - /* translators: 1: edit user link, 2: accessibility text, 3: user name, 4: logout URL */ - __( 'Logged in as %3$s. Log out?' ), - get_edit_user_link(), - /* translators: %s: user name */ - esc_attr( sprintf( __( 'Logged in as %s. Edit your profile.' ), $user_identity ) ), - $user_identity, - wp_logout_url( apply_filters( 'the_permalink', get_permalink( $post_id ) ) ) - ) . '

      ', - 'comment_notes_before' => '

      ' . __( 'Your email address will not be published.' ) . ''. ( $req ? $required_text : '' ) . '

      ', - 'comment_notes_after' => '', - 'action' => site_url( '/wp-comments-post.php' ), - 'id_form' => 'commentform', - 'id_submit' => 'submit', - 'class_form' => 'comment-form', - 'class_submit' => 'submit', - 'name_submit' => 'submit', - 'title_reply' => __( 'Leave a Reply' ), - 'title_reply_to' => __( 'Leave a Reply to %s' ), - 'title_reply_before' => '

      ', - 'title_reply_after' => '

      ', - 'cancel_reply_before' => ' ', - 'cancel_reply_after' => '', - 'cancel_reply_link' => __( 'Cancel reply' ), - 'label_submit' => __( 'Post Comment' ), - 'submit_button' => '', - 'submit_field' => '

      %1$s %2$s

      ', - 'format' => 'xhtml', - ); - - /** - * Filters the comment form default arguments. - * - * Use {@see 'comment_form_default_fields'} to filter the comment fields. - * - * @since 3.0.0 - * - * @param array $defaults The default comment form arguments. - */ - $args = wp_parse_args( $args, apply_filters( 'comment_form_defaults', $defaults ) ); - - // Ensure that the filtered args contain all required default values. - $args = array_merge( $defaults, $args ); - - /** - * Fires before the comment form. - * - * @since 3.0.0 - */ - do_action( 'comment_form_before' ); - ?> -
      - -
      > - $args['comment_field'] ) + (array) $args['fields']; - - /** - * Filters the comment form fields, including the textarea. - * - * @since 4.4.0 - * - * @param array $comment_fields The comment fields. - */ - $comment_fields = apply_filters( 'comment_form_fields', $comment_fields ); - - // Get an array of field names, excluding the textarea - $comment_field_keys = array_diff( array_keys( $comment_fields ), array( 'comment' ) ); - - // Get the first and the last field name, excluding the textarea - $first_field = reset( $comment_field_keys ); - $last_field = end( $comment_field_keys ); - - foreach ( $comment_fields as $name => $field ) { - - if ( 'comment' === $name ) { - - /** - * Filters the content of the comment textarea field for display. - * - * @since 3.0.0 - * - * @param string $args_comment_field The content of the comment textarea field. - */ - echo apply_filters( 'comment_form_field_comment', $field ); - - echo $args['comment_notes_after']; - - } elseif ( ! is_user_logged_in() ) { - - if ( $first_field === $name ) { - /** - * Fires before the comment fields in the comment form, excluding the textarea. - * - * @since 3.0.0 - */ - do_action( 'comment_form_before_fields' ); - } - - /** - * Filters a comment form field for display. - * - * The dynamic portion of the filter hook, `$name`, refers to the name - * of the comment form field. Such as 'author', 'email', or 'url'. - * - * @since 3.0.0 - * - * @param string $field The HTML-formatted output of the comment form field. - */ - echo apply_filters( "comment_form_field_{$name}", $field ) . "\n"; - - if ( $last_field === $name ) { - /** - * Fires after the comment fields in the comment form, excluding the textarea. - * - * @since 3.0.0 - */ - do_action( 'comment_form_after_fields' ); - } - } - } - - $submit_button = sprintf( - $args['submit_button'], - esc_attr( $args['name_submit'] ), - esc_attr( $args['id_submit'] ), - esc_attr( $args['class_submit'] ), - esc_attr( $args['label_submit'] ) - ); - - /** - * Filters the submit button for the comment form to display. - * - * @since 4.2.0 - * - * @param string $submit_button HTML markup for the submit button. - * @param array $args Arguments passed to `comment_form()`. - */ - $submit_button = apply_filters( 'comment_form_submit_button', $submit_button, $args ); - - $submit_field = sprintf( - $args['submit_field'], - $submit_button, - get_comment_id_fields( $post_id ) - ); - - /** - * Filters the submit field for the comment form to display. - * - * The submit field includes the submit button, hidden fields for the - * comment form, and any wrapper markup. - * - * @since 4.2.0 - * - * @param string $submit_field HTML markup for the submit field. - * @param array $args Arguments passed to comment_form(). - */ - echo apply_filters( 'comment_form_submit_field', $submit_field, $args ); - - /** - * Fires at the bottom of the comment form, inside the closing
      tag. - * - * @since 1.5.0 - * - * @param int $post_id The post ID. - */ - do_action( 'comment_form', $post_id ); - ?> - - -
      - ]*href/i', $comment, $out ); - - /** - * Filters the number of links found in a comment. - * - * @since 3.0.0 - * @since 4.7.0 Added the `$comment` parameter. - * - * @param int $num_links The number of links found. - * @param string $url Comment author's URL. Included in allowed links total. - * @param string $comment Content of the comment. - */ - $num_links = apply_filters( 'comment_max_links_url', $num_links, $url, $comment ); - - /* - * If the number of links in the comment exceeds the allowed amount, - * fail the check by returning false. - */ - if ( $num_links >= $max_links ) - return false; - } - - $mod_keys = trim(get_option('moderation_keys')); - - // If moderation 'keys' (keywords) are set, process them. - if ( !empty($mod_keys) ) { - $words = explode("\n", $mod_keys ); - - foreach ( (array) $words as $word) { - $word = trim($word); - - // Skip empty lines. - if ( empty($word) ) - continue; - - /* - * Do some escaping magic so that '#' (number of) characters in the spam - * words don't break things: - */ - $word = preg_quote($word, '#'); - - /* - * Check the comment fields for moderation keywords. If any are found, - * fail the check for the given field by returning false. - */ - $pattern = "#$word#i"; - if ( preg_match($pattern, $author) ) return false; - if ( preg_match($pattern, $email) ) return false; - if ( preg_match($pattern, $url) ) return false; - if ( preg_match($pattern, $comment) ) return false; - if ( preg_match($pattern, $user_ip) ) return false; - if ( preg_match($pattern, $user_agent) ) return false; - } - } - - /* - * Check if the option to approve comments by previously-approved authors is enabled. - * - * If it is enabled, check whether the comment author has a previously-approved comment, - * as well as whether there are any moderation keywords (if set) present in the author - * email address. If both checks pass, return true. Otherwise, return false. - */ - if ( 1 == get_option('comment_whitelist')) { - if ( 'trackback' != $comment_type && 'pingback' != $comment_type && $author != '' && $email != '' ) { - $comment_user = get_user_by( 'email', wp_unslash( $email ) ); - if ( ! empty( $comment_user->ID ) ) { - $ok_to_comment = $wpdb->get_var( $wpdb->prepare( "SELECT comment_approved FROM $wpdb->comments WHERE user_id = %d AND comment_approved = '1' LIMIT 1", $comment_user->ID ) ); - } else { - // expected_slashed ($author, $email) - $ok_to_comment = $wpdb->get_var( $wpdb->prepare( "SELECT comment_approved FROM $wpdb->comments WHERE comment_author = %s AND comment_author_email = %s and comment_approved = '1' LIMIT 1", $author, $email ) ); - } - if ( ( 1 == $ok_to_comment ) && - ( empty($mod_keys) || false === strpos( $email, $mod_keys) ) ) - return true; - else - return false; - } else { - return false; - } - } - return true; -} - -/** - * Retrieve the approved comments for post $post_id. - * - * @since 2.0.0 - * @since 4.1.0 Refactored to leverage WP_Comment_Query over a direct query. - * - * @param int $post_id The ID of the post. - * @param array $args Optional. See WP_Comment_Query::query() for information on accepted arguments. - * @return int|array $comments The approved comments, or number of comments if `$count` - * argument is true. - */ -function get_approved_comments( $post_id, $args = array() ) { - if ( ! $post_id ) { - return array(); - } - - $defaults = array( - 'status' => 1, - 'post_id' => $post_id, - 'order' => 'ASC', - ); - $r = wp_parse_args( $args, $defaults ); - - $query = new WP_Comment_Query; - return $query->query( $r ); -} - -/** - * Retrieves comment data given a comment ID or comment object. - * - * If an object is passed then the comment data will be cached and then returned - * after being passed through a filter. If the comment is empty, then the global - * comment variable will be used, if it is set. - * - * @since 2.0.0 - * - * @global WP_Comment $comment - * - * @param WP_Comment|string|int $comment Comment to retrieve. - * @param string $output Optional. The required return type. One of OBJECT, ARRAY_A, or ARRAY_N, which correspond to - * a WP_Comment object, an associative array, or a numeric array, respectively. Default OBJECT. - * @return WP_Comment|array|null Depends on $output value. - */ -function get_comment( &$comment = null, $output = OBJECT ) { - if ( empty( $comment ) && isset( $GLOBALS['comment'] ) ) { - $comment = $GLOBALS['comment']; - } - - if ( $comment instanceof WP_Comment ) { - $_comment = $comment; - } elseif ( is_object( $comment ) ) { - $_comment = new WP_Comment( $comment ); - } else { - $_comment = WP_Comment::get_instance( $comment ); - } - - if ( ! $_comment ) { - return null; - } - - /** - * Fires after a comment is retrieved. - * - * @since 2.3.0 - * - * @param mixed $_comment Comment data. - */ - $_comment = apply_filters( 'get_comment', $_comment ); - - if ( $output == OBJECT ) { - return $_comment; - } elseif ( $output == ARRAY_A ) { - return $_comment->to_array(); - } elseif ( $output == ARRAY_N ) { - return array_values( $_comment->to_array() ); - } - return $_comment; -} - -/** - * Retrieve a list of comments. - * - * The comment list can be for the blog as a whole or for an individual post. - * - * @since 2.7.0 - * - * @param string|array $args Optional. Array or string of arguments. See WP_Comment_Query::parse_query() - * for information on accepted arguments. Default empty. - * @return int|array List of comments or number of found comments if `$count` argument is true. - */ -function get_comments( $args = '' ) { - $query = new WP_Comment_Query; - return $query->query( $args ); -} - -/** - * Retrieve all of the WordPress supported comment statuses. - * - * Comments have a limited set of valid status values, this provides the comment - * status values and descriptions. - * - * @since 2.7.0 - * - * @return array List of comment statuses. - */ -function get_comment_statuses() { - $status = array( - 'hold' => __( 'Unapproved' ), - 'approve' => _x( 'Approved', 'comment status' ), - 'spam' => _x( 'Spam', 'comment status' ), - 'trash' => _x( 'Trash', 'comment status' ), - ); - - return $status; -} - -/** - * Gets the default comment status for a post type. - * - * @since 4.3.0 - * - * @param string $post_type Optional. Post type. Default 'post'. - * @param string $comment_type Optional. Comment type. Default 'comment'. - * @return string Expected return value is 'open' or 'closed'. - */ -function get_default_comment_status( $post_type = 'post', $comment_type = 'comment' ) { - switch ( $comment_type ) { - case 'pingback' : - case 'trackback' : - $supports = 'trackbacks'; - $option = 'ping'; - break; - default : - $supports = 'comments'; - $option = 'comment'; - } - - // Set the status. - if ( 'page' === $post_type ) { - $status = 'closed'; - } elseif ( post_type_supports( $post_type, $supports ) ) { - $status = get_option( "default_{$option}_status" ); - } else { - $status = 'closed'; - } - - /** - * Filters the default comment status for the given post type. - * - * @since 4.3.0 - * - * @param string $status Default status for the given post type, - * either 'open' or 'closed'. - * @param string $post_type Post type. Default is `post`. - * @param string $comment_type Type of comment. Default is `comment`. - */ - return apply_filters( 'get_default_comment_status' , $status, $post_type, $comment_type ); -} - -/** - * The date the last comment was modified. - * - * @since 1.5.0 - * @since 4.7.0 Replaced caching the modified date in a local static variable - * with the Object Cache API. - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $timezone Which timezone to use in reference to 'gmt', 'blog', or 'server' locations. - * @return string|false Last comment modified date on success, false on failure. - */ -function get_lastcommentmodified( $timezone = 'server' ) { - global $wpdb; - - $timezone = strtolower( $timezone ); - $key = "lastcommentmodified:$timezone"; - - $comment_modified_date = wp_cache_get( $key, 'timeinfo' ); - if ( false !== $comment_modified_date ) { - return $comment_modified_date; - } - - switch ( $timezone ) { - case 'gmt': - $comment_modified_date = $wpdb->get_var( "SELECT comment_date_gmt FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1" ); - break; - case 'blog': - $comment_modified_date = $wpdb->get_var( "SELECT comment_date FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1" ); - break; - case 'server': - $add_seconds_server = date( 'Z' ); - - $comment_modified_date = $wpdb->get_var( $wpdb->prepare( "SELECT DATE_ADD(comment_date_gmt, INTERVAL %s SECOND) FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 1", $add_seconds_server ) ); - break; - } - - if ( $comment_modified_date ) { - wp_cache_set( $key, $comment_modified_date, 'timeinfo' ); - - return $comment_modified_date; - } - - return false; -} - -/** - * The amount of comments in a post or total comments. - * - * A lot like wp_count_comments(), in that they both return comment stats (albeit with different types). - * The wp_count_comments() actually caches, but this function does not. - * - * @since 2.0.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $post_id Optional. Comment amount in post if > 0, else total comments blog wide. - * @return array The amount of spam, approved, awaiting moderation, and total comments. - */ -function get_comment_count( $post_id = 0 ) { - global $wpdb; - - $post_id = (int) $post_id; - - $where = ''; - if ( $post_id > 0 ) { - $where = $wpdb->prepare("WHERE comment_post_ID = %d", $post_id); - } - - $totals = (array) $wpdb->get_results(" - SELECT comment_approved, COUNT( * ) AS total - FROM {$wpdb->comments} - {$where} - GROUP BY comment_approved - ", ARRAY_A); - - $comment_count = array( - 'approved' => 0, - 'awaiting_moderation' => 0, - 'spam' => 0, - 'trash' => 0, - 'post-trashed' => 0, - 'total_comments' => 0, - 'all' => 0, - ); - - foreach ( $totals as $row ) { - switch ( $row['comment_approved'] ) { - case 'trash': - $comment_count['trash'] = $row['total']; - break; - case 'post-trashed': - $comment_count['post-trashed'] = $row['total']; - break; - case 'spam': - $comment_count['spam'] = $row['total']; - $comment_count['total_comments'] += $row['total']; - break; - case '1': - $comment_count['approved'] = $row['total']; - $comment_count['total_comments'] += $row['total']; - $comment_count['all'] += $row['total']; - break; - case '0': - $comment_count['awaiting_moderation'] = $row['total']; - $comment_count['total_comments'] += $row['total']; - $comment_count['all'] += $row['total']; - break; - default: - break; - } - } - - return $comment_count; -} - -// -// Comment meta functions -// - -/** - * Add meta data field to a comment. - * - * @since 2.9.0 - * @link https://codex.wordpress.org/Function_Reference/add_comment_meta - * - * @param int $comment_id Comment ID. - * @param string $meta_key Metadata name. - * @param mixed $meta_value Metadata value. - * @param bool $unique Optional, default is false. Whether the same key should not be added. - * @return int|bool Meta ID on success, false on failure. - */ -function add_comment_meta($comment_id, $meta_key, $meta_value, $unique = false) { - return add_metadata('comment', $comment_id, $meta_key, $meta_value, $unique); -} - -/** - * Remove metadata matching criteria from a comment. - * - * You can match based on the key, or key and value. Removing based on key and - * value, will keep from removing duplicate metadata with the same key. It also - * allows removing all metadata matching key, if needed. - * - * @since 2.9.0 - * @link https://codex.wordpress.org/Function_Reference/delete_comment_meta - * - * @param int $comment_id comment ID - * @param string $meta_key Metadata name. - * @param mixed $meta_value Optional. Metadata value. - * @return bool True on success, false on failure. - */ -function delete_comment_meta($comment_id, $meta_key, $meta_value = '') { - return delete_metadata('comment', $comment_id, $meta_key, $meta_value); -} - -/** - * Retrieve comment meta field for a comment. - * - * @since 2.9.0 - * @link https://codex.wordpress.org/Function_Reference/get_comment_meta - * - * @param int $comment_id Comment ID. - * @param string $key Optional. The meta key to retrieve. By default, returns data for all keys. - * @param bool $single Whether to return a single value. - * @return mixed Will be an array if $single is false. Will be value of meta data field if $single - * is true. - */ -function get_comment_meta($comment_id, $key = '', $single = false) { - return get_metadata('comment', $comment_id, $key, $single); -} - -/** - * Update comment meta field based on comment ID. - * - * Use the $prev_value parameter to differentiate between meta fields with the - * same key and comment ID. - * - * If the meta field for the comment does not exist, it will be added. - * - * @since 2.9.0 - * @link https://codex.wordpress.org/Function_Reference/update_comment_meta - * - * @param int $comment_id Comment ID. - * @param string $meta_key Metadata key. - * @param mixed $meta_value Metadata value. - * @param mixed $prev_value Optional. Previous value to check before removing. - * @return int|bool Meta ID if the key didn't exist, true on successful update, false on failure. - */ -function update_comment_meta($comment_id, $meta_key, $meta_value, $prev_value = '') { - return update_metadata('comment', $comment_id, $meta_key, $meta_value, $prev_value); -} - -/** - * Queues comments for metadata lazy-loading. - * - * @since 4.5.0 - * - * @param array $comments Array of comment objects. - */ -function wp_queue_comments_for_comment_meta_lazyload( $comments ) { - // Don't use `wp_list_pluck()` to avoid by-reference manipulation. - $comment_ids = array(); - if ( is_array( $comments ) ) { - foreach ( $comments as $comment ) { - if ( $comment instanceof WP_Comment ) { - $comment_ids[] = $comment->comment_ID; - } - } - } - - if ( $comment_ids ) { - $lazyloader = wp_metadata_lazyloader(); - $lazyloader->queue_objects( 'comment', $comment_ids ); - } -} - -/** - * Sets the cookies used to store an unauthenticated commentator's identity. Typically used - * to recall previous comments by this commentator that are still held in moderation. - * - * @param WP_Comment $comment Comment object. - * @param object $user Comment author's object. - * - * @since 3.4.0 - */ -function wp_set_comment_cookies($comment, $user) { - if ( $user->exists() ) - return; - - /** - * Filters the lifetime of the comment cookie in seconds. - * - * @since 2.8.0 - * - * @param int $seconds Comment cookie lifetime. Default 30000000. - */ - $comment_cookie_lifetime = apply_filters( 'comment_cookie_lifetime', 30000000 ); - $secure = ( 'https' === parse_url( home_url(), PHP_URL_SCHEME ) ); - setcookie( 'comment_author_' . COOKIEHASH, $comment->comment_author, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure ); - setcookie( 'comment_author_email_' . COOKIEHASH, $comment->comment_author_email, time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure ); - setcookie( 'comment_author_url_' . COOKIEHASH, esc_url($comment->comment_author_url), time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN, $secure ); -} - -/** - * Sanitizes the cookies sent to the user already. - * - * Will only do anything if the cookies have already been created for the user. - * Mostly used after cookies had been sent to use elsewhere. - * - * @since 2.0.4 - */ -function sanitize_comment_cookies() { - if ( isset( $_COOKIE['comment_author_' . COOKIEHASH] ) ) { - /** - * Filters the comment author's name cookie before it is set. - * - * When this filter hook is evaluated in wp_filter_comment(), - * the comment author's name string is passed. - * - * @since 1.5.0 - * - * @param string $author_cookie The comment author name cookie. - */ - $comment_author = apply_filters( 'pre_comment_author_name', $_COOKIE['comment_author_' . COOKIEHASH] ); - $comment_author = wp_unslash($comment_author); - $comment_author = esc_attr($comment_author); - $_COOKIE['comment_author_' . COOKIEHASH] = $comment_author; - } - - if ( isset( $_COOKIE['comment_author_email_' . COOKIEHASH] ) ) { - /** - * Filters the comment author's email cookie before it is set. - * - * When this filter hook is evaluated in wp_filter_comment(), - * the comment author's email string is passed. - * - * @since 1.5.0 - * - * @param string $author_email_cookie The comment author email cookie. - */ - $comment_author_email = apply_filters( 'pre_comment_author_email', $_COOKIE['comment_author_email_' . COOKIEHASH] ); - $comment_author_email = wp_unslash($comment_author_email); - $comment_author_email = esc_attr($comment_author_email); - $_COOKIE['comment_author_email_'.COOKIEHASH] = $comment_author_email; - } - - if ( isset( $_COOKIE['comment_author_url_' . COOKIEHASH] ) ) { - /** - * Filters the comment author's URL cookie before it is set. - * - * When this filter hook is evaluated in wp_filter_comment(), - * the comment author's URL string is passed. - * - * @since 1.5.0 - * - * @param string $author_url_cookie The comment author URL cookie. - */ - $comment_author_url = apply_filters( 'pre_comment_author_url', $_COOKIE['comment_author_url_' . COOKIEHASH] ); - $comment_author_url = wp_unslash($comment_author_url); - $_COOKIE['comment_author_url_'.COOKIEHASH] = $comment_author_url; - } -} - -/** - * Validates whether this comment is allowed to be made. - * - * @since 2.0.0 - * @since 4.7.0 The `$avoid_die` parameter was added, allowing the function to - * return a WP_Error object instead of dying. - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param array $commentdata Contains information on the comment. - * @param bool $avoid_die When true, a disallowed comment will result in the function - * returning a WP_Error object, rather than executing wp_die(). - * Default false. - * @return int|string|WP_Error Allowed comments return the approval status (0|1|'spam'). - * If `$avoid_die` is true, disallowed comments return a WP_Error. - */ -function wp_allow_comment( $commentdata, $avoid_die = false ) { - global $wpdb; - - // Simple duplicate check - // expected_slashed ($comment_post_ID, $comment_author, $comment_author_email, $comment_content) - $dupe = $wpdb->prepare( - "SELECT comment_ID FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_parent = %s AND comment_approved != 'trash' AND ( comment_author = %s ", - wp_unslash( $commentdata['comment_post_ID'] ), - wp_unslash( $commentdata['comment_parent'] ), - wp_unslash( $commentdata['comment_author'] ) - ); - if ( $commentdata['comment_author_email'] ) { - $dupe .= $wpdb->prepare( - "AND comment_author_email = %s ", - wp_unslash( $commentdata['comment_author_email'] ) - ); - } - $dupe .= $wpdb->prepare( - ") AND comment_content = %s LIMIT 1", - wp_unslash( $commentdata['comment_content'] ) - ); - - $dupe_id = $wpdb->get_var( $dupe ); - - /** - * Filters the ID, if any, of the duplicate comment found when creating a new comment. - * - * Return an empty value from this filter to allow what WP considers a duplicate comment. - * - * @since 4.4.0 - * - * @param int $dupe_id ID of the comment identified as a duplicate. - * @param array $commentdata Data for the comment being created. - */ - $dupe_id = apply_filters( 'duplicate_comment_id', $dupe_id, $commentdata ); - - if ( $dupe_id ) { - /** - * Fires immediately after a duplicate comment is detected. - * - * @since 3.0.0 - * - * @param array $commentdata Comment data. - */ - do_action( 'comment_duplicate_trigger', $commentdata ); - if ( true === $avoid_die ) { - return new WP_Error( 'comment_duplicate', __( 'Duplicate comment detected; it looks as though you’ve already said that!' ), 409 ); - } else { - if ( wp_doing_ajax() ) { - die( __('Duplicate comment detected; it looks as though you’ve already said that!') ); - } - - wp_die( __( 'Duplicate comment detected; it looks as though you’ve already said that!' ), 409 ); - } - } - - /** - * Fires immediately before a comment is marked approved. - * - * Allows checking for comment flooding. - * - * @since 2.3.0 - * @since 4.7.0 The `$avoid_die` parameter was added. - * - * @param string $comment_author_IP Comment author's IP address. - * @param string $comment_author_email Comment author's email. - * @param string $comment_date_gmt GMT date the comment was posted. - * @param bool $avoid_die Whether to prevent executing wp_die() - * or die() if a comment flood is occurring. - */ - do_action( - 'check_comment_flood', - $commentdata['comment_author_IP'], - $commentdata['comment_author_email'], - $commentdata['comment_date_gmt'], - $avoid_die - ); - - /** - * Filters whether a comment is part of a comment flood. - * - * The default check is wp_check_comment_flood(). See check_comment_flood_db(). - * - * @since 4.7.0 - * - * @param bool $is_flood Is a comment flooding occurring? Default false. - * @param string $comment_author_IP Comment author's IP address. - * @param string $comment_author_email Comment author's email. - * @param string $comment_date_gmt GMT date the comment was posted. - * @param bool $avoid_die Whether to prevent executing wp_die() - * or die() if a comment flood is occurring. - */ - $is_flood = apply_filters( - 'wp_is_comment_flood', - false, - $commentdata['comment_author_IP'], - $commentdata['comment_author_email'], - $commentdata['comment_date_gmt'], - $avoid_die - ); - - if ( $is_flood ) { - return new WP_Error( 'comment_flood', __( 'You are posting comments too quickly. Slow down.' ), 429 ); - } - - if ( ! empty( $commentdata['user_id'] ) ) { - $user = get_userdata( $commentdata['user_id'] ); - $post_author = $wpdb->get_var( $wpdb->prepare( - "SELECT post_author FROM $wpdb->posts WHERE ID = %d LIMIT 1", - $commentdata['comment_post_ID'] - ) ); - } - - if ( isset( $user ) && ( $commentdata['user_id'] == $post_author || $user->has_cap( 'moderate_comments' ) ) ) { - // The author and the admins get respect. - $approved = 1; - } else { - // Everyone else's comments will be checked. - if ( check_comment( - $commentdata['comment_author'], - $commentdata['comment_author_email'], - $commentdata['comment_author_url'], - $commentdata['comment_content'], - $commentdata['comment_author_IP'], - $commentdata['comment_agent'], - $commentdata['comment_type'] - ) ) { - $approved = 1; - } else { - $approved = 0; - } - - if ( wp_blacklist_check( - $commentdata['comment_author'], - $commentdata['comment_author_email'], - $commentdata['comment_author_url'], - $commentdata['comment_content'], - $commentdata['comment_author_IP'], - $commentdata['comment_agent'] - ) ) { - $approved = EMPTY_TRASH_DAYS ? 'trash' : 'spam'; - } - } - - /** - * Filters a comment's approval status before it is set. - * - * @since 2.1.0 - * - * @param bool|string $approved The approval status. Accepts 1, 0, or 'spam'. - * @param array $commentdata Comment data. - */ - $approved = apply_filters( 'pre_comment_approved', $approved, $commentdata ); - return $approved; -} - -/** - * Hooks WP's native database-based comment-flood check. - * - * This wrapper maintains backward compatibility with plugins that expect to - * be able to unhook the legacy check_comment_flood_db() function from - * 'check_comment_flood' using remove_action(). - * - * @since 2.3.0 - * @since 4.7.0 Converted to be an add_filter() wrapper. - */ -function check_comment_flood_db() { - add_filter( 'wp_is_comment_flood', 'wp_check_comment_flood', 10, 5 ); -} - -/** - * Checks whether comment flooding is occurring. - * - * Won't run, if current user can manage options, so to not block - * administrators. - * - * @since 4.7.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param bool $is_flood Is a comment flooding occurring? - * @param string $ip Comment IP. - * @param string $email Comment author email address. - * @param string $date MySQL time string. - * @param bool $avoid_die When true, a disallowed comment will result in the function - * returning a WP_Error object, rather than executing wp_die(). - * Default false. - * @return bool Whether comment flooding is occurring. - */ -function wp_check_comment_flood( $is_flood, $ip, $email, $date, $avoid_die = false ) { - - global $wpdb; - - // Another callback has declared a flood. Trust it. - if ( true === $is_flood ) { - return $is_flood; - } - - // don't throttle admins or moderators - if ( current_user_can( 'manage_options' ) || current_user_can( 'moderate_comments' ) ) { - return false; - } - $hour_ago = gmdate( 'Y-m-d H:i:s', time() - HOUR_IN_SECONDS ); - - if ( is_user_logged_in() ) { - $user = get_current_user_id(); - $check_column = '`user_id`'; - } else { - $user = $ip; - $check_column = '`comment_author_IP`'; - } - - $sql = $wpdb->prepare( - "SELECT `comment_date_gmt` FROM `$wpdb->comments` WHERE `comment_date_gmt` >= %s AND ( $check_column = %s OR `comment_author_email` = %s ) ORDER BY `comment_date_gmt` DESC LIMIT 1", - $hour_ago, - $user, - $email - ); - $lasttime = $wpdb->get_var( $sql ); - if ( $lasttime ) { - $time_lastcomment = mysql2date('U', $lasttime, false); - $time_newcomment = mysql2date('U', $date, false); - /** - * Filters the comment flood status. - * - * @since 2.1.0 - * - * @param bool $bool Whether a comment flood is occurring. Default false. - * @param int $time_lastcomment Timestamp of when the last comment was posted. - * @param int $time_newcomment Timestamp of when the new comment was posted. - */ - $flood_die = apply_filters( 'comment_flood_filter', false, $time_lastcomment, $time_newcomment ); - if ( $flood_die ) { - /** - * Fires before the comment flood message is triggered. - * - * @since 1.5.0 - * - * @param int $time_lastcomment Timestamp of when the last comment was posted. - * @param int $time_newcomment Timestamp of when the new comment was posted. - */ - do_action( 'comment_flood_trigger', $time_lastcomment, $time_newcomment ); - if ( true === $avoid_die ) { - return true; - } else { - if ( wp_doing_ajax() ) { - die( __('You are posting comments too quickly. Slow down.') ); - } - - wp_die( __( 'You are posting comments too quickly. Slow down.' ), 429 ); - } - } - } - - return false; -} - -/** - * Separates an array of comments into an array keyed by comment_type. - * - * @since 2.7.0 - * - * @param array $comments Array of comments - * @return array Array of comments keyed by comment_type. - */ -function separate_comments(&$comments) { - $comments_by_type = array('comment' => array(), 'trackback' => array(), 'pingback' => array(), 'pings' => array()); - $count = count($comments); - for ( $i = 0; $i < $count; $i++ ) { - $type = $comments[$i]->comment_type; - if ( empty($type) ) - $type = 'comment'; - $comments_by_type[$type][] = &$comments[$i]; - if ( 'trackback' == $type || 'pingback' == $type ) - $comments_by_type['pings'][] = &$comments[$i]; - } - - return $comments_by_type; -} - -/** - * Calculate the total number of comment pages. - * - * @since 2.7.0 - * - * @uses Walker_Comment - * - * @global WP_Query $wp_query - * - * @param array $comments Optional array of WP_Comment objects. Defaults to $wp_query->comments - * @param int $per_page Optional comments per page. - * @param bool $threaded Optional control over flat or threaded comments. - * @return int Number of comment pages. - */ -function get_comment_pages_count( $comments = null, $per_page = null, $threaded = null ) { - global $wp_query; - - if ( null === $comments && null === $per_page && null === $threaded && !empty($wp_query->max_num_comment_pages) ) - return $wp_query->max_num_comment_pages; - - if ( ( ! $comments || ! is_array( $comments ) ) && ! empty( $wp_query->comments ) ) - $comments = $wp_query->comments; - - if ( empty($comments) ) - return 0; - - if ( ! get_option( 'page_comments' ) ) { - return 1; - } - - if ( !isset($per_page) ) - $per_page = (int) get_query_var('comments_per_page'); - if ( 0 === $per_page ) - $per_page = (int) get_option('comments_per_page'); - if ( 0 === $per_page ) - return 1; - - if ( !isset($threaded) ) - $threaded = get_option('thread_comments'); - - if ( $threaded ) { - $walker = new Walker_Comment; - $count = ceil( $walker->get_number_of_root_elements( $comments ) / $per_page ); - } else { - $count = ceil( count( $comments ) / $per_page ); - } - - return $count; -} - -/** - * Calculate what page number a comment will appear on for comment paging. - * - * @since 2.7.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $comment_ID Comment ID. - * @param array $args { - * Array of optional arguments. - * @type string $type Limit paginated comments to those matching a given type. Accepts 'comment', - * 'trackback', 'pingback', 'pings' (trackbacks and pingbacks), or 'all'. - * Default is 'all'. - * @type int $per_page Per-page count to use when calculating pagination. Defaults to the value of the - * 'comments_per_page' option. - * @type int|string $max_depth If greater than 1, comment page will be determined for the top-level parent of - * `$comment_ID`. Defaults to the value of the 'thread_comments_depth' option. - * } * - * @return int|null Comment page number or null on error. - */ -function get_page_of_comment( $comment_ID, $args = array() ) { - global $wpdb; - - $page = null; - - if ( !$comment = get_comment( $comment_ID ) ) - return; - - $defaults = array( 'type' => 'all', 'page' => '', 'per_page' => '', 'max_depth' => '' ); - $args = wp_parse_args( $args, $defaults ); - $original_args = $args; - - // Order of precedence: 1. `$args['per_page']`, 2. 'comments_per_page' query_var, 3. 'comments_per_page' option. - if ( get_option( 'page_comments' ) ) { - if ( '' === $args['per_page'] ) { - $args['per_page'] = get_query_var( 'comments_per_page' ); - } - - if ( '' === $args['per_page'] ) { - $args['per_page'] = get_option( 'comments_per_page' ); - } - } - - if ( empty($args['per_page']) ) { - $args['per_page'] = 0; - $args['page'] = 0; - } - - if ( $args['per_page'] < 1 ) { - $page = 1; - } - - if ( null === $page ) { - if ( '' === $args['max_depth'] ) { - if ( get_option('thread_comments') ) - $args['max_depth'] = get_option('thread_comments_depth'); - else - $args['max_depth'] = -1; - } - - // Find this comment's top level parent if threading is enabled - if ( $args['max_depth'] > 1 && 0 != $comment->comment_parent ) - return get_page_of_comment( $comment->comment_parent, $args ); - - $comment_args = array( - 'type' => $args['type'], - 'post_id' => $comment->comment_post_ID, - 'fields' => 'ids', - 'count' => true, - 'status' => 'approve', - 'parent' => 0, - 'date_query' => array( - array( - 'column' => "$wpdb->comments.comment_date_gmt", - 'before' => $comment->comment_date_gmt, - ) - ), - ); - - $comment_query = new WP_Comment_Query(); - $older_comment_count = $comment_query->query( $comment_args ); - - // No older comments? Then it's page #1. - if ( 0 == $older_comment_count ) { - $page = 1; - - // Divide comments older than this one by comments per page to get this comment's page number - } else { - $page = ceil( ( $older_comment_count + 1 ) / $args['per_page'] ); - } - } - - /** - * Filters the calculated page on which a comment appears. - * - * @since 4.4.0 - * @since 4.7.0 Introduced the `$comment_ID` parameter. - * - * @param int $page Comment page. - * @param array $args { - * Arguments used to calculate pagination. These include arguments auto-detected by the function, - * based on query vars, system settings, etc. For pristine arguments passed to the function, - * see `$original_args`. - * - * @type string $type Type of comments to count. - * @type int $page Calculated current page. - * @type int $per_page Calculated number of comments per page. - * @type int $max_depth Maximum comment threading depth allowed. - * } - * @param array $original_args { - * Array of arguments passed to the function. Some or all of these may not be set. - * - * @type string $type Type of comments to count. - * @type int $page Current comment page. - * @type int $per_page Number of comments per page. - * @type int $max_depth Maximum comment threading depth allowed. - * } - * @param int $comment_ID ID of the comment. - */ - return apply_filters( 'get_page_of_comment', (int) $page, $args, $original_args, $comment_ID ); -} - -/** - * Retrieves the maximum character lengths for the comment form fields. - * - * @since 4.5.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @return array Maximum character length for the comment form fields. - */ -function wp_get_comment_fields_max_lengths() { - global $wpdb; - - $lengths = array( - 'comment_author' => 245, - 'comment_author_email' => 100, - 'comment_author_url' => 200, - 'comment_content' => 65525, - ); - - if ( $wpdb->is_mysql ) { - foreach ( $lengths as $column => $length ) { - $col_length = $wpdb->get_col_length( $wpdb->comments, $column ); - $max_length = 0; - - // No point if we can't get the DB column lengths - if ( is_wp_error( $col_length ) ) { - break; - } - - if ( ! is_array( $col_length ) && (int) $col_length > 0 ) { - $max_length = (int) $col_length; - } elseif ( is_array( $col_length ) && isset( $col_length['length'] ) && intval( $col_length['length'] ) > 0 ) { - $max_length = (int) $col_length['length']; - - if ( ! empty( $col_length['type'] ) && 'byte' === $col_length['type'] ) { - $max_length = $max_length - 10; - } - } - - if ( $max_length > 0 ) { - $lengths[ $column ] = $max_length; - } - } - } - - /** - * Filters the lengths for the comment form fields. - * - * @since 4.5.0 - * - * @param array $lengths Associative array `'field_name' => 'maximum length'`. - */ - return apply_filters( 'wp_get_comment_fields_max_lengths', $lengths ); -} - -/** - * Compares the lengths of comment data against the maximum character limits. - * - * @since 4.7.0 - * - * @param array $comment_data Array of arguments for inserting a comment. - * @return WP_Error|true WP_Error when a comment field exceeds the limit, - * otherwise true. - */ -function wp_check_comment_data_max_lengths( $comment_data ) { - $max_lengths = wp_get_comment_fields_max_lengths(); - - if ( isset( $comment_data['comment_author'] ) && mb_strlen( $comment_data['comment_author'], '8bit' ) > $max_lengths['comment_author'] ) { - return new WP_Error( 'comment_author_column_length', __( 'ERROR: your name is too long.' ), 200 ); - } - - if ( isset( $comment_data['comment_author_email'] ) && strlen( $comment_data['comment_author_email'] ) > $max_lengths['comment_author_email'] ) { - return new WP_Error( 'comment_author_email_column_length', __( 'ERROR: your email address is too long.' ), 200 ); - } - - if ( isset( $comment_data['comment_author_url'] ) && strlen( $comment_data['comment_author_url'] ) > $max_lengths['comment_author_url'] ) { - return new WP_Error( 'comment_author_url_column_length', __( 'ERROR: your url is too long.' ), 200 ); - } - - if ( isset( $comment_data['comment_content'] ) && mb_strlen( $comment_data['comment_content'], '8bit' ) > $max_lengths['comment_content'] ) { - return new WP_Error( 'comment_content_column_length', __( 'ERROR: your comment is too long.' ), 200 ); - } - - return true; -} - -/** - * Does comment contain blacklisted characters or words. - * - * @since 1.5.0 - * - * @param string $author The author of the comment - * @param string $email The email of the comment - * @param string $url The url used in the comment - * @param string $comment The comment content - * @param string $user_ip The comment author IP address - * @param string $user_agent The author's browser user agent - * @return bool True if comment contains blacklisted content, false if comment does not - */ -function wp_blacklist_check($author, $email, $url, $comment, $user_ip, $user_agent) { - /** - * Fires before the comment is tested for blacklisted characters or words. - * - * @since 1.5.0 - * - * @param string $author Comment author. - * @param string $email Comment author's email. - * @param string $url Comment author's URL. - * @param string $comment Comment content. - * @param string $user_ip Comment author's IP address. - * @param string $user_agent Comment author's browser user agent. - */ - do_action( 'wp_blacklist_check', $author, $email, $url, $comment, $user_ip, $user_agent ); - - $mod_keys = trim( get_option('blacklist_keys') ); - if ( '' == $mod_keys ) - return false; // If moderation keys are empty - - // Ensure HTML tags are not being used to bypass the blacklist. - $comment_without_html = wp_strip_all_tags( $comment ); - - $words = explode("\n", $mod_keys ); - - foreach ( (array) $words as $word ) { - $word = trim($word); - - // Skip empty lines - if ( empty($word) ) { continue; } - - // Do some escaping magic so that '#' chars in the - // spam words don't break things: - $word = preg_quote($word, '#'); - - $pattern = "#$word#i"; - if ( - preg_match($pattern, $author) - || preg_match($pattern, $email) - || preg_match($pattern, $url) - || preg_match($pattern, $comment) - || preg_match($pattern, $comment_without_html) - || preg_match($pattern, $user_ip) - || preg_match($pattern, $user_agent) - ) - return true; - } - return false; -} - -/** - * Retrieve total comments for blog or single post. - * - * The properties of the returned object contain the 'moderated', 'approved', - * and spam comments for either the entire blog or single post. Those properties - * contain the amount of comments that match the status. The 'total_comments' - * property contains the integer of total comments. - * - * The comment stats are cached and then retrieved, if they already exist in the - * cache. - * - * @since 2.5.0 - * - * @param int $post_id Optional. Post ID. - * @return object|array Comment stats. - */ -function wp_count_comments( $post_id = 0 ) { - $post_id = (int) $post_id; - - /** - * Filters the comments count for a given post. - * - * @since 2.7.0 - * - * @param array $count An empty array. - * @param int $post_id The post ID. - */ - $filtered = apply_filters( 'wp_count_comments', array(), $post_id ); - if ( ! empty( $filtered ) ) { - return $filtered; - } - - $count = wp_cache_get( "comments-{$post_id}", 'counts' ); - if ( false !== $count ) { - return $count; - } - - $stats = get_comment_count( $post_id ); - $stats['moderated'] = $stats['awaiting_moderation']; - unset( $stats['awaiting_moderation'] ); - - $stats_object = (object) $stats; - wp_cache_set( "comments-{$post_id}", $stats_object, 'counts' ); - - return $stats_object; -} - -/** - * Trashes or deletes a comment. - * - * The comment is moved to trash instead of permanently deleted unless trash is - * disabled, item is already in the trash, or $force_delete is true. - * - * The post comment count will be updated if the comment was approved and has a - * post ID available. - * - * @since 2.0.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. - * @param bool $force_delete Whether to bypass trash and force deletion. Default is false. - * @return bool True on success, false on failure. - */ -function wp_delete_comment($comment_id, $force_delete = false) { - global $wpdb; - if (!$comment = get_comment($comment_id)) - return false; - - if ( !$force_delete && EMPTY_TRASH_DAYS && !in_array( wp_get_comment_status( $comment ), array( 'trash', 'spam' ) ) ) - return wp_trash_comment($comment_id); - - /** - * Fires immediately before a comment is deleted from the database. - * - * @since 1.2.0 - * - * @param int $comment_id The comment ID. - */ - do_action( 'delete_comment', $comment->comment_ID ); - - // Move children up a level. - $children = $wpdb->get_col( $wpdb->prepare("SELECT comment_ID FROM $wpdb->comments WHERE comment_parent = %d", $comment->comment_ID) ); - if ( !empty($children) ) { - $wpdb->update($wpdb->comments, array('comment_parent' => $comment->comment_parent), array('comment_parent' => $comment->comment_ID)); - clean_comment_cache($children); - } - - // Delete metadata - $meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT meta_id FROM $wpdb->commentmeta WHERE comment_id = %d", $comment->comment_ID ) ); - foreach ( $meta_ids as $mid ) - delete_metadata_by_mid( 'comment', $mid ); - - if ( ! $wpdb->delete( $wpdb->comments, array( 'comment_ID' => $comment->comment_ID ) ) ) - return false; - - /** - * Fires immediately after a comment is deleted from the database. - * - * @since 2.9.0 - * - * @param int $comment_id The comment ID. - */ - do_action( 'deleted_comment', $comment->comment_ID ); - - $post_id = $comment->comment_post_ID; - if ( $post_id && $comment->comment_approved == 1 ) - wp_update_comment_count($post_id); - - clean_comment_cache( $comment->comment_ID ); - - /** This action is documented in wp-includes/comment.php */ - do_action( 'wp_set_comment_status', $comment->comment_ID, 'delete' ); - - wp_transition_comment_status('delete', $comment->comment_approved, $comment); - return true; -} - -/** - * Moves a comment to the Trash - * - * If trash is disabled, comment is permanently deleted. - * - * @since 2.9.0 - * - * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. - * @return bool True on success, false on failure. - */ -function wp_trash_comment($comment_id) { - if ( !EMPTY_TRASH_DAYS ) - return wp_delete_comment($comment_id, true); - - if ( !$comment = get_comment($comment_id) ) - return false; - - /** - * Fires immediately before a comment is sent to the Trash. - * - * @since 2.9.0 - * - * @param int $comment_id The comment ID. - */ - do_action( 'trash_comment', $comment->comment_ID ); - - if ( wp_set_comment_status( $comment, 'trash' ) ) { - delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' ); - delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' ); - add_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', $comment->comment_approved ); - add_comment_meta( $comment->comment_ID, '_wp_trash_meta_time', time() ); - - /** - * Fires immediately after a comment is sent to Trash. - * - * @since 2.9.0 - * - * @param int $comment_id The comment ID. - */ - do_action( 'trashed_comment', $comment->comment_ID ); - return true; - } - - return false; -} - -/** - * Removes a comment from the Trash - * - * @since 2.9.0 - * - * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. - * @return bool True on success, false on failure. - */ -function wp_untrash_comment($comment_id) { - $comment = get_comment( $comment_id ); - if ( ! $comment ) { - return false; - } - - /** - * Fires immediately before a comment is restored from the Trash. - * - * @since 2.9.0 - * - * @param int $comment_id The comment ID. - */ - do_action( 'untrash_comment', $comment->comment_ID ); - - $status = (string) get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ); - if ( empty($status) ) - $status = '0'; - - if ( wp_set_comment_status( $comment, $status ) ) { - delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' ); - delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' ); - /** - * Fires immediately after a comment is restored from the Trash. - * - * @since 2.9.0 - * - * @param int $comment_id The comment ID. - */ - do_action( 'untrashed_comment', $comment->comment_ID ); - return true; - } - - return false; -} - -/** - * Marks a comment as Spam - * - * @since 2.9.0 - * - * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. - * @return bool True on success, false on failure. - */ -function wp_spam_comment( $comment_id ) { - $comment = get_comment( $comment_id ); - if ( ! $comment ) { - return false; - } - - /** - * Fires immediately before a comment is marked as Spam. - * - * @since 2.9.0 - * - * @param int $comment_id The comment ID. - */ - do_action( 'spam_comment', $comment->comment_ID ); - - if ( wp_set_comment_status( $comment, 'spam' ) ) { - delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' ); - delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' ); - add_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', $comment->comment_approved ); - add_comment_meta( $comment->comment_ID, '_wp_trash_meta_time', time() ); - /** - * Fires immediately after a comment is marked as Spam. - * - * @since 2.9.0 - * - * @param int $comment_id The comment ID. - */ - do_action( 'spammed_comment', $comment->comment_ID ); - return true; - } - - return false; -} - -/** - * Removes a comment from the Spam - * - * @since 2.9.0 - * - * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. - * @return bool True on success, false on failure. - */ -function wp_unspam_comment( $comment_id ) { - $comment = get_comment( $comment_id ); - if ( ! $comment ) { - return false; - } - - /** - * Fires immediately before a comment is unmarked as Spam. - * - * @since 2.9.0 - * - * @param int $comment_id The comment ID. - */ - do_action( 'unspam_comment', $comment->comment_ID ); - - $status = (string) get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ); - if ( empty($status) ) - $status = '0'; - - if ( wp_set_comment_status( $comment, $status ) ) { - delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_status' ); - delete_comment_meta( $comment->comment_ID, '_wp_trash_meta_time' ); - /** - * Fires immediately after a comment is unmarked as Spam. - * - * @since 2.9.0 - * - * @param int $comment_id The comment ID. - */ - do_action( 'unspammed_comment', $comment->comment_ID ); - return true; - } - - return false; -} - -/** - * The status of a comment by ID. - * - * @since 1.0.0 - * - * @param int|WP_Comment $comment_id Comment ID or WP_Comment object - * @return false|string Status might be 'trash', 'approved', 'unapproved', 'spam'. False on failure. - */ -function wp_get_comment_status($comment_id) { - $comment = get_comment($comment_id); - if ( !$comment ) - return false; - - $approved = $comment->comment_approved; - - if ( $approved == null ) - return false; - elseif ( $approved == '1' ) - return 'approved'; - elseif ( $approved == '0' ) - return 'unapproved'; - elseif ( $approved == 'spam' ) - return 'spam'; - elseif ( $approved == 'trash' ) - return 'trash'; - else - return false; -} - -/** - * Call hooks for when a comment status transition occurs. - * - * Calls hooks for comment status transitions. If the new comment status is not the same - * as the previous comment status, then two hooks will be ran, the first is - * {@see 'transition_comment_status'} with new status, old status, and comment data. The - * next action called is {@see comment_$old_status_to_$new_status'}. It has the - * comment data. - * - * The final action will run whether or not the comment statuses are the same. The - * action is named {@see 'comment_$new_status_$comment->comment_type'}. - * - * @since 2.7.0 - * - * @param string $new_status New comment status. - * @param string $old_status Previous comment status. - * @param object $comment Comment data. - */ -function wp_transition_comment_status($new_status, $old_status, $comment) { - /* - * Translate raw statuses to human readable formats for the hooks. - * This is not a complete list of comment status, it's only the ones - * that need to be renamed - */ - $comment_statuses = array( - 0 => 'unapproved', - 'hold' => 'unapproved', // wp_set_comment_status() uses "hold" - 1 => 'approved', - 'approve' => 'approved', // wp_set_comment_status() uses "approve" - ); - if ( isset($comment_statuses[$new_status]) ) $new_status = $comment_statuses[$new_status]; - if ( isset($comment_statuses[$old_status]) ) $old_status = $comment_statuses[$old_status]; - - // Call the hooks - if ( $new_status != $old_status ) { - /** - * Fires when the comment status is in transition. - * - * @since 2.7.0 - * - * @param int|string $new_status The new comment status. - * @param int|string $old_status The old comment status. - * @param object $comment The comment data. - */ - do_action( 'transition_comment_status', $new_status, $old_status, $comment ); - /** - * Fires when the comment status is in transition from one specific status to another. - * - * The dynamic portions of the hook name, `$old_status`, and `$new_status`, - * refer to the old and new comment statuses, respectively. - * - * @since 2.7.0 - * - * @param WP_Comment $comment Comment object. - */ - do_action( "comment_{$old_status}_to_{$new_status}", $comment ); - } - /** - * Fires when the status of a specific comment type is in transition. - * - * The dynamic portions of the hook name, `$new_status`, and `$comment->comment_type`, - * refer to the new comment status, and the type of comment, respectively. - * - * Typical comment types include an empty string (standard comment), 'pingback', - * or 'trackback'. - * - * @since 2.7.0 - * - * @param int $comment_ID The comment ID. - * @param WP_Comment $comment Comment object. - */ - do_action( "comment_{$new_status}_{$comment->comment_type}", $comment->comment_ID, $comment ); -} - -/** - * Clear the lastcommentmodified cached value when a comment status is changed. - * - * Deletes the lastcommentmodified cache key when a comment enters or leaves - * 'approved' status. - * - * @since 4.7.0 - * @access private - * - * @param string $new_status The new comment status. - * @param string $old_status The old comment status. - */ -function _clear_modified_cache_on_transition_comment_status( $new_status, $old_status ) { - if ( 'approved' === $new_status || 'approved' === $old_status ) { - foreach ( array( 'server', 'gmt', 'blog' ) as $timezone ) { - wp_cache_delete( "lastcommentmodified:$timezone", 'timeinfo' ); - } - } -} - -/** - * Get current commenter's name, email, and URL. - * - * Expects cookies content to already be sanitized. User of this function might - * wish to recheck the returned array for validity. - * - * @see sanitize_comment_cookies() Use to sanitize cookies - * - * @since 2.0.4 - * - * @return array Comment author, email, url respectively. - */ -function wp_get_current_commenter() { - // Cookies should already be sanitized. - - $comment_author = ''; - if ( isset($_COOKIE['comment_author_'.COOKIEHASH]) ) - $comment_author = $_COOKIE['comment_author_'.COOKIEHASH]; - - $comment_author_email = ''; - if ( isset($_COOKIE['comment_author_email_'.COOKIEHASH]) ) - $comment_author_email = $_COOKIE['comment_author_email_'.COOKIEHASH]; - - $comment_author_url = ''; - if ( isset($_COOKIE['comment_author_url_'.COOKIEHASH]) ) - $comment_author_url = $_COOKIE['comment_author_url_'.COOKIEHASH]; - - /** - * Filters the current commenter's name, email, and URL. - * - * @since 3.1.0 - * - * @param array $comment_author_data { - * An array of current commenter variables. - * - * @type string $comment_author The name of the author of the comment. Default empty. - * @type string $comment_author_email The email address of the `$comment_author`. Default empty. - * @type string $comment_author_url The URL address of the `$comment_author`. Default empty. - * } - */ - return apply_filters( 'wp_get_current_commenter', compact('comment_author', 'comment_author_email', 'comment_author_url') ); -} - -/** - * Inserts a comment into the database. - * - * @since 2.0.0 - * @since 4.4.0 Introduced `$comment_meta` argument. - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param array $commentdata { - * Array of arguments for inserting a new comment. - * - * @type string $comment_agent The HTTP user agent of the `$comment_author` when - * the comment was submitted. Default empty. - * @type int|string $comment_approved Whether the comment has been approved. Default 1. - * @type string $comment_author The name of the author of the comment. Default empty. - * @type string $comment_author_email The email address of the `$comment_author`. Default empty. - * @type string $comment_author_IP The IP address of the `$comment_author`. Default empty. - * @type string $comment_author_url The URL address of the `$comment_author`. Default empty. - * @type string $comment_content The content of the comment. Default empty. - * @type string $comment_date The date the comment was submitted. To set the date - * manually, `$comment_date_gmt` must also be specified. - * Default is the current time. - * @type string $comment_date_gmt The date the comment was submitted in the GMT timezone. - * Default is `$comment_date` in the site's GMT timezone. - * @type int $comment_karma The karma of the comment. Default 0. - * @type int $comment_parent ID of this comment's parent, if any. Default 0. - * @type int $comment_post_ID ID of the post that relates to the comment, if any. - * Default 0. - * @type string $comment_type Comment type. Default empty. - * @type array $comment_meta Optional. Array of key/value pairs to be stored in commentmeta for the - * new comment. - * @type int $user_id ID of the user who submitted the comment. Default 0. - * } - * @return int|false The new comment's ID on success, false on failure. - */ -function wp_insert_comment( $commentdata ) { - global $wpdb; - $data = wp_unslash( $commentdata ); - - $comment_author = ! isset( $data['comment_author'] ) ? '' : $data['comment_author']; - $comment_author_email = ! isset( $data['comment_author_email'] ) ? '' : $data['comment_author_email']; - $comment_author_url = ! isset( $data['comment_author_url'] ) ? '' : $data['comment_author_url']; - $comment_author_IP = ! isset( $data['comment_author_IP'] ) ? '' : $data['comment_author_IP']; - - $comment_date = ! isset( $data['comment_date'] ) ? current_time( 'mysql' ) : $data['comment_date']; - $comment_date_gmt = ! isset( $data['comment_date_gmt'] ) ? get_gmt_from_date( $comment_date ) : $data['comment_date_gmt']; - - $comment_post_ID = ! isset( $data['comment_post_ID'] ) ? 0 : $data['comment_post_ID']; - $comment_content = ! isset( $data['comment_content'] ) ? '' : $data['comment_content']; - $comment_karma = ! isset( $data['comment_karma'] ) ? 0 : $data['comment_karma']; - $comment_approved = ! isset( $data['comment_approved'] ) ? 1 : $data['comment_approved']; - $comment_agent = ! isset( $data['comment_agent'] ) ? '' : $data['comment_agent']; - $comment_type = ! isset( $data['comment_type'] ) ? '' : $data['comment_type']; - $comment_parent = ! isset( $data['comment_parent'] ) ? 0 : $data['comment_parent']; - - $user_id = ! isset( $data['user_id'] ) ? 0 : $data['user_id']; - - $compacted = compact( 'comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_author_IP', 'comment_date', 'comment_date_gmt', 'comment_content', 'comment_karma', 'comment_approved', 'comment_agent', 'comment_type', 'comment_parent', 'user_id' ); - if ( ! $wpdb->insert( $wpdb->comments, $compacted ) ) { - return false; - } - - $id = (int) $wpdb->insert_id; - - if ( $comment_approved == 1 ) { - wp_update_comment_count( $comment_post_ID ); - - foreach ( array( 'server', 'gmt', 'blog' ) as $timezone ) { - wp_cache_delete( "lastcommentmodified:$timezone", 'timeinfo' ); - } - } - - clean_comment_cache( $id ); - - $comment = get_comment( $id ); - - // If metadata is provided, store it. - if ( isset( $commentdata['comment_meta'] ) && is_array( $commentdata['comment_meta'] ) ) { - foreach ( $commentdata['comment_meta'] as $meta_key => $meta_value ) { - add_comment_meta( $comment->comment_ID, $meta_key, $meta_value, true ); - } - } - - /** - * Fires immediately after a comment is inserted into the database. - * - * @since 2.8.0 - * - * @param int $id The comment ID. - * @param WP_Comment $comment Comment object. - */ - do_action( 'wp_insert_comment', $id, $comment ); - - return $id; -} - -/** - * Filters and sanitizes comment data. - * - * Sets the comment data 'filtered' field to true when finished. This can be - * checked as to whether the comment should be filtered and to keep from - * filtering the same comment more than once. - * - * @since 2.0.0 - * - * @param array $commentdata Contains information on the comment. - * @return array Parsed comment information. - */ -function wp_filter_comment($commentdata) { - if ( isset( $commentdata['user_ID'] ) ) { - /** - * Filters the comment author's user id before it is set. - * - * The first time this filter is evaluated, 'user_ID' is checked - * (for back-compat), followed by the standard 'user_id' value. - * - * @since 1.5.0 - * - * @param int $user_ID The comment author's user ID. - */ - $commentdata['user_id'] = apply_filters( 'pre_user_id', $commentdata['user_ID'] ); - } elseif ( isset( $commentdata['user_id'] ) ) { - /** This filter is documented in wp-includes/comment.php */ - $commentdata['user_id'] = apply_filters( 'pre_user_id', $commentdata['user_id'] ); - } - - /** - * Filters the comment author's browser user agent before it is set. - * - * @since 1.5.0 - * - * @param string $comment_agent The comment author's browser user agent. - */ - $commentdata['comment_agent'] = apply_filters( 'pre_comment_user_agent', ( isset( $commentdata['comment_agent'] ) ? $commentdata['comment_agent'] : '' ) ); - /** This filter is documented in wp-includes/comment.php */ - $commentdata['comment_author'] = apply_filters( 'pre_comment_author_name', $commentdata['comment_author'] ); - /** - * Filters the comment content before it is set. - * - * @since 1.5.0 - * - * @param string $comment_content The comment content. - */ - $commentdata['comment_content'] = apply_filters( 'pre_comment_content', $commentdata['comment_content'] ); - /** - * Filters the comment author's IP before it is set. - * - * @since 1.5.0 - * - * @param string $comment_author_ip The comment author's IP. - */ - $commentdata['comment_author_IP'] = apply_filters( 'pre_comment_user_ip', $commentdata['comment_author_IP'] ); - /** This filter is documented in wp-includes/comment.php */ - $commentdata['comment_author_url'] = apply_filters( 'pre_comment_author_url', $commentdata['comment_author_url'] ); - /** This filter is documented in wp-includes/comment.php */ - $commentdata['comment_author_email'] = apply_filters( 'pre_comment_author_email', $commentdata['comment_author_email'] ); - $commentdata['filtered'] = true; - return $commentdata; -} - -/** - * Whether a comment should be blocked because of comment flood. - * - * @since 2.1.0 - * - * @param bool $block Whether plugin has already blocked comment. - * @param int $time_lastcomment Timestamp for last comment. - * @param int $time_newcomment Timestamp for new comment. - * @return bool Whether comment should be blocked. - */ -function wp_throttle_comment_flood($block, $time_lastcomment, $time_newcomment) { - if ( $block ) // a plugin has already blocked... we'll let that decision stand - return $block; - if ( ($time_newcomment - $time_lastcomment) < 15 ) - return true; - return false; -} - -/** - * Adds a new comment to the database. - * - * Filters new comment to ensure that the fields are sanitized and valid before - * inserting comment into database. Calls {@see 'comment_post'} action with comment ID - * and whether comment is approved by WordPress. Also has {@see 'preprocess_comment'} - * filter for processing the comment data before the function handles it. - * - * We use `REMOTE_ADDR` here directly. If you are behind a proxy, you should ensure - * that it is properly set, such as in wp-config.php, for your environment. - * - * See {@link https://core.trac.wordpress.org/ticket/9235} - * - * @since 1.5.0 - * @since 4.3.0 'comment_agent' and 'comment_author_IP' can be set via `$commentdata`. - * @since 4.7.0 The `$avoid_die` parameter was added, allowing the function to - * return a WP_Error object instead of dying. - * - * @see wp_insert_comment() - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param array $commentdata { - * Comment data. - * - * @type string $comment_author The name of the comment author. - * @type string $comment_author_email The comment author email address. - * @type string $comment_author_url The comment author URL. - * @type string $comment_content The content of the comment. - * @type string $comment_date The date the comment was submitted. Default is the current time. - * @type string $comment_date_gmt The date the comment was submitted in the GMT timezone. - * Default is `$comment_date` in the GMT timezone. - * @type int $comment_parent The ID of this comment's parent, if any. Default 0. - * @type int $comment_post_ID The ID of the post that relates to the comment. - * @type int $user_id The ID of the user who submitted the comment. Default 0. - * @type int $user_ID Kept for backward-compatibility. Use `$user_id` instead. - * @type string $comment_agent Comment author user agent. Default is the value of 'HTTP_USER_AGENT' - * in the `$_SERVER` superglobal sent in the original request. - * @type string $comment_author_IP Comment author IP address in IPv4 format. Default is the value of - * 'REMOTE_ADDR' in the `$_SERVER` superglobal sent in the original request. - * } - * @param bool $avoid_die Should errors be returned as WP_Error objects instead of - * executing wp_die()? Default false. - * @return int|false|WP_Error The ID of the comment on success, false or WP_Error on failure. - */ -function wp_new_comment( $commentdata, $avoid_die = false ) { - global $wpdb; - - if ( isset( $commentdata['user_ID'] ) ) { - $commentdata['user_id'] = $commentdata['user_ID'] = (int) $commentdata['user_ID']; - } - - $prefiltered_user_id = ( isset( $commentdata['user_id'] ) ) ? (int) $commentdata['user_id'] : 0; - - /** - * Filters a comment's data before it is sanitized and inserted into the database. - * - * @since 1.5.0 - * - * @param array $commentdata Comment data. - */ - $commentdata = apply_filters( 'preprocess_comment', $commentdata ); - - $commentdata['comment_post_ID'] = (int) $commentdata['comment_post_ID']; - if ( isset( $commentdata['user_ID'] ) && $prefiltered_user_id !== (int) $commentdata['user_ID'] ) { - $commentdata['user_id'] = $commentdata['user_ID'] = (int) $commentdata['user_ID']; - } elseif ( isset( $commentdata['user_id'] ) ) { - $commentdata['user_id'] = (int) $commentdata['user_id']; - } - - $commentdata['comment_parent'] = isset($commentdata['comment_parent']) ? absint($commentdata['comment_parent']) : 0; - $parent_status = ( 0 < $commentdata['comment_parent'] ) ? wp_get_comment_status($commentdata['comment_parent']) : ''; - $commentdata['comment_parent'] = ( 'approved' == $parent_status || 'unapproved' == $parent_status ) ? $commentdata['comment_parent'] : 0; - - if ( ! isset( $commentdata['comment_author_IP'] ) ) { - $commentdata['comment_author_IP'] = $_SERVER['REMOTE_ADDR']; - } - $commentdata['comment_author_IP'] = preg_replace( '/[^0-9a-fA-F:., ]/', '', $commentdata['comment_author_IP'] ); - - if ( ! isset( $commentdata['comment_agent'] ) ) { - $commentdata['comment_agent'] = isset( $_SERVER['HTTP_USER_AGENT'] ) ? $_SERVER['HTTP_USER_AGENT']: ''; - } - $commentdata['comment_agent'] = substr( $commentdata['comment_agent'], 0, 254 ); - - if ( empty( $commentdata['comment_date'] ) ) { - $commentdata['comment_date'] = current_time('mysql'); - } - - if ( empty( $commentdata['comment_date_gmt'] ) ) { - $commentdata['comment_date_gmt'] = current_time( 'mysql', 1 ); - } - - $commentdata = wp_filter_comment($commentdata); - - $commentdata['comment_approved'] = wp_allow_comment( $commentdata, $avoid_die ); - if ( is_wp_error( $commentdata['comment_approved'] ) ) { - return $commentdata['comment_approved']; - } - - $comment_ID = wp_insert_comment($commentdata); - if ( ! $comment_ID ) { - $fields = array( 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content' ); - - foreach ( $fields as $field ) { - if ( isset( $commentdata[ $field ] ) ) { - $commentdata[ $field ] = $wpdb->strip_invalid_text_for_column( $wpdb->comments, $field, $commentdata[ $field ] ); - } - } - - $commentdata = wp_filter_comment( $commentdata ); - - $commentdata['comment_approved'] = wp_allow_comment( $commentdata, $avoid_die ); - if ( is_wp_error( $commentdata['comment_approved'] ) ) { - return $commentdata['comment_approved']; - } - - $comment_ID = wp_insert_comment( $commentdata ); - if ( ! $comment_ID ) { - return false; - } - } - - /** - * Fires immediately after a comment is inserted into the database. - * - * @since 1.2.0 - * @since 4.5.0 The `$commentdata` parameter was added. - * - * @param int $comment_ID The comment ID. - * @param int|string $comment_approved 1 if the comment is approved, 0 if not, 'spam' if spam. - * @param array $commentdata Comment data. - */ - do_action( 'comment_post', $comment_ID, $commentdata['comment_approved'], $commentdata ); - - return $comment_ID; -} - -/** - * Send a comment moderation notification to the comment moderator. - * - * @since 4.4.0 - * - * @param int $comment_ID ID of the comment. - * @return bool True on success, false on failure. - */ -function wp_new_comment_notify_moderator( $comment_ID ) { - $comment = get_comment( $comment_ID ); - - // Only send notifications for pending comments. - $maybe_notify = ( '0' == $comment->comment_approved ); - - /** This filter is documented in wp-includes/comment.php */ - $maybe_notify = apply_filters( 'notify_moderator', $maybe_notify, $comment_ID ); - - if ( ! $maybe_notify ) { - return false; - } - - return wp_notify_moderator( $comment_ID ); -} - -/** - * Send a notification of a new comment to the post author. - * - * @since 4.4.0 - * - * Uses the {@see 'notify_post_author'} filter to determine whether the post author - * should be notified when a new comment is added, overriding site setting. - * - * @param int $comment_ID Comment ID. - * @return bool True on success, false on failure. - */ -function wp_new_comment_notify_postauthor( $comment_ID ) { - $comment = get_comment( $comment_ID ); - - $maybe_notify = get_option( 'comments_notify' ); - - /** - * Filters whether to send the post author new comment notification emails, - * overriding the site setting. - * - * @since 4.4.0 - * - * @param bool $maybe_notify Whether to notify the post author about the new comment. - * @param int $comment_ID The ID of the comment for the notification. - */ - $maybe_notify = apply_filters( 'notify_post_author', $maybe_notify, $comment_ID ); - - /* - * wp_notify_postauthor() checks if notifying the author of their own comment. - * By default, it won't, but filters can override this. - */ - if ( ! $maybe_notify ) { - return false; - } - - // Only send notifications for approved comments. - if ( ! isset( $comment->comment_approved ) || '1' != $comment->comment_approved ) { - return false; - } - - return wp_notify_postauthor( $comment_ID ); -} - -/** - * Sets the status of a comment. - * - * The {@see 'wp_set_comment_status'} action is called after the comment is handled. - * If the comment status is not in the list, then false is returned. - * - * @since 1.0.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int|WP_Comment $comment_id Comment ID or WP_Comment object. - * @param string $comment_status New comment status, either 'hold', 'approve', 'spam', or 'trash'. - * @param bool $wp_error Whether to return a WP_Error object if there is a failure. Default is false. - * @return bool|WP_Error True on success, false or WP_Error on failure. - */ -function wp_set_comment_status($comment_id, $comment_status, $wp_error = false) { - global $wpdb; - - switch ( $comment_status ) { - case 'hold': - case '0': - $status = '0'; - break; - case 'approve': - case '1': - $status = '1'; - add_action( 'wp_set_comment_status', 'wp_new_comment_notify_postauthor' ); - break; - case 'spam': - $status = 'spam'; - break; - case 'trash': - $status = 'trash'; - break; - default: - return false; - } - - $comment_old = clone get_comment($comment_id); - - if ( !$wpdb->update( $wpdb->comments, array('comment_approved' => $status), array( 'comment_ID' => $comment_old->comment_ID ) ) ) { - if ( $wp_error ) - return new WP_Error('db_update_error', __('Could not update comment status'), $wpdb->last_error); - else - return false; - } - - clean_comment_cache( $comment_old->comment_ID ); - - $comment = get_comment( $comment_old->comment_ID ); - - /** - * Fires immediately before transitioning a comment's status from one to another - * in the database. - * - * @since 1.5.0 - * - * @param int $comment_id Comment ID. - * @param string|bool $comment_status Current comment status. Possible values include - * 'hold', 'approve', 'spam', 'trash', or false. - */ - do_action( 'wp_set_comment_status', $comment->comment_ID, $comment_status ); - - wp_transition_comment_status($comment_status, $comment_old->comment_approved, $comment); - - wp_update_comment_count($comment->comment_post_ID); - - return true; -} - -/** - * Updates an existing comment in the database. - * - * Filters the comment and makes sure certain fields are valid before updating. - * - * @since 2.0.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param array $commentarr Contains information on the comment. - * @return int Comment was updated if value is 1, or was not updated if value is 0. - */ -function wp_update_comment($commentarr) { - global $wpdb; - - // First, get all of the original fields - $comment = get_comment($commentarr['comment_ID'], ARRAY_A); - if ( empty( $comment ) ) { - return 0; - } - - // Make sure that the comment post ID is valid (if specified). - if ( ! empty( $commentarr['comment_post_ID'] ) && ! get_post( $commentarr['comment_post_ID'] ) ) { - return 0; - } - - // Escape data pulled from DB. - $comment = wp_slash($comment); - - $old_status = $comment['comment_approved']; - - // Merge old and new fields with new fields overwriting old ones. - $commentarr = array_merge($comment, $commentarr); - - $commentarr = wp_filter_comment( $commentarr ); - - // Now extract the merged array. - $data = wp_unslash( $commentarr ); - - /** - * Filters the comment content before it is updated in the database. - * - * @since 1.5.0 - * - * @param string $comment_content The comment data. - */ - $data['comment_content'] = apply_filters( 'comment_save_pre', $data['comment_content'] ); - - $data['comment_date_gmt'] = get_gmt_from_date( $data['comment_date'] ); - - if ( ! isset( $data['comment_approved'] ) ) { - $data['comment_approved'] = 1; - } elseif ( 'hold' == $data['comment_approved'] ) { - $data['comment_approved'] = 0; - } elseif ( 'approve' == $data['comment_approved'] ) { - $data['comment_approved'] = 1; - } - - $comment_ID = $data['comment_ID']; - $comment_post_ID = $data['comment_post_ID']; - - /** - * Filters the comment data immediately before it is updated in the database. - * - * Note: data being passed to the filter is already unslashed. - * - * @since 4.7.0 - * - * @param array $data The new, processed comment data. - * @param array $comment The old, unslashed comment data. - * @param array $commentarr The new, raw comment data. - */ - $data = apply_filters( 'wp_update_comment_data', $data, $comment, $commentarr ); - - $keys = array( 'comment_post_ID', 'comment_content', 'comment_author', 'comment_author_email', 'comment_approved', 'comment_karma', 'comment_author_url', 'comment_date', 'comment_date_gmt', 'comment_type', 'comment_parent', 'user_id', 'comment_agent', 'comment_author_IP' ); - $data = wp_array_slice_assoc( $data, $keys ); - - $rval = $wpdb->update( $wpdb->comments, $data, compact( 'comment_ID' ) ); - - clean_comment_cache( $comment_ID ); - wp_update_comment_count( $comment_post_ID ); - /** - * Fires immediately after a comment is updated in the database. - * - * The hook also fires immediately before comment status transition hooks are fired. - * - * @since 1.2.0 - * @since 4.6.0 Added the `$data` parameter. - * - * @param int $comment_ID The comment ID. - * @param array $data Comment data. - */ - do_action( 'edit_comment', $comment_ID, $data ); - $comment = get_comment($comment_ID); - wp_transition_comment_status($comment->comment_approved, $old_status, $comment); - return $rval; -} - -/** - * Whether to defer comment counting. - * - * When setting $defer to true, all post comment counts will not be updated - * until $defer is set to false. When $defer is set to false, then all - * previously deferred updated post comment counts will then be automatically - * updated without having to call wp_update_comment_count() after. - * - * @since 2.5.0 - * @staticvar bool $_defer - * - * @param bool $defer - * @return bool - */ -function wp_defer_comment_counting($defer=null) { - static $_defer = false; - - if ( is_bool($defer) ) { - $_defer = $defer; - // flush any deferred counts - if ( !$defer ) - wp_update_comment_count( null, true ); - } - - return $_defer; -} - -/** - * Updates the comment count for post(s). - * - * When $do_deferred is false (is by default) and the comments have been set to - * be deferred, the post_id will be added to a queue, which will be updated at a - * later date and only updated once per post ID. - * - * If the comments have not be set up to be deferred, then the post will be - * updated. When $do_deferred is set to true, then all previous deferred post - * IDs will be updated along with the current $post_id. - * - * @since 2.1.0 - * @see wp_update_comment_count_now() For what could cause a false return value - * - * @staticvar array $_deferred - * - * @param int|null $post_id Post ID. - * @param bool $do_deferred Optional. Whether to process previously deferred - * post comment counts. Default false. - * @return bool|void True on success, false on failure or if post with ID does - * not exist. - */ -function wp_update_comment_count($post_id, $do_deferred=false) { - static $_deferred = array(); - - if ( empty( $post_id ) && ! $do_deferred ) { - return false; - } - - if ( $do_deferred ) { - $_deferred = array_unique($_deferred); - foreach ( $_deferred as $i => $_post_id ) { - wp_update_comment_count_now($_post_id); - unset( $_deferred[$i] ); /** @todo Move this outside of the foreach and reset $_deferred to an array instead */ - } - } - - if ( wp_defer_comment_counting() ) { - $_deferred[] = $post_id; - return true; - } - elseif ( $post_id ) { - return wp_update_comment_count_now($post_id); - } - -} - -/** - * Updates the comment count for the post. - * - * @since 2.5.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $post_id Post ID - * @return bool True on success, false on '0' $post_id or if post with ID does not exist. - */ -function wp_update_comment_count_now($post_id) { - global $wpdb; - $post_id = (int) $post_id; - if ( !$post_id ) - return false; - - wp_cache_delete( 'comments-0', 'counts' ); - wp_cache_delete( "comments-{$post_id}", 'counts' ); - - if ( !$post = get_post($post_id) ) - return false; - - $old = (int) $post->comment_count; - - /** - * Filters a post's comment count before it is updated in the database. - * - * @since 4.5.0 - * - * @param int $new The new comment count. Default null. - * @param int $old The old comment count. - * @param int $post_id Post ID. - */ - $new = apply_filters( 'pre_wp_update_comment_count_now', null, $old, $post_id ); - - if ( is_null( $new ) ) { - $new = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = '1'", $post_id ) ); - } else { - $new = (int) $new; - } - - $wpdb->update( $wpdb->posts, array('comment_count' => $new), array('ID' => $post_id) ); - - clean_post_cache( $post ); - - /** - * Fires immediately after a post's comment count is updated in the database. - * - * @since 2.3.0 - * - * @param int $post_id Post ID. - * @param int $new The new comment count. - * @param int $old The old comment count. - */ - do_action( 'wp_update_comment_count', $post_id, $new, $old ); - /** This action is documented in wp-includes/post.php */ - do_action( 'edit_post', $post_id, $post ); - - return true; -} - -// -// Ping and trackback functions. -// - -/** - * Finds a pingback server URI based on the given URL. - * - * Checks the HTML for the rel="pingback" link and x-pingback headers. It does - * a check for the x-pingback headers first and returns that, if available. The - * check for the rel="pingback" has more overhead than just the header. - * - * @since 1.5.0 - * - * @param string $url URL to ping. - * @param int $deprecated Not Used. - * @return false|string False on failure, string containing URI on success. - */ -function discover_pingback_server_uri( $url, $deprecated = '' ) { - if ( !empty( $deprecated ) ) - _deprecated_argument( __FUNCTION__, '2.7.0' ); - - $pingback_str_dquote = 'rel="pingback"'; - $pingback_str_squote = 'rel=\'pingback\''; - - /** @todo Should use Filter Extension or custom preg_match instead. */ - $parsed_url = parse_url($url); - - if ( ! isset( $parsed_url['host'] ) ) // Not a URL. This should never happen. - return false; - - //Do not search for a pingback server on our own uploads - $uploads_dir = wp_get_upload_dir(); - if ( 0 === strpos($url, $uploads_dir['baseurl']) ) - return false; - - $response = wp_safe_remote_head( $url, array( 'timeout' => 2, 'httpversion' => '1.0' ) ); - - if ( is_wp_error( $response ) ) - return false; - - if ( wp_remote_retrieve_header( $response, 'x-pingback' ) ) - return wp_remote_retrieve_header( $response, 'x-pingback' ); - - // Not an (x)html, sgml, or xml page, no use going further. - if ( preg_match('#(image|audio|video|model)/#is', wp_remote_retrieve_header( $response, 'content-type' )) ) - return false; - - // Now do a GET since we're going to look in the html headers (and we're sure it's not a binary file) - $response = wp_safe_remote_get( $url, array( 'timeout' => 2, 'httpversion' => '1.0' ) ); - - if ( is_wp_error( $response ) ) - return false; - - $contents = wp_remote_retrieve_body( $response ); - - $pingback_link_offset_dquote = strpos($contents, $pingback_str_dquote); - $pingback_link_offset_squote = strpos($contents, $pingback_str_squote); - if ( $pingback_link_offset_dquote || $pingback_link_offset_squote ) { - $quote = ($pingback_link_offset_dquote) ? '"' : '\''; - $pingback_link_offset = ($quote=='"') ? $pingback_link_offset_dquote : $pingback_link_offset_squote; - $pingback_href_pos = @strpos($contents, 'href=', $pingback_link_offset); - $pingback_href_start = $pingback_href_pos+6; - $pingback_href_end = @strpos($contents, $quote, $pingback_href_start); - $pingback_server_url_len = $pingback_href_end - $pingback_href_start; - $pingback_server_url = substr($contents, $pingback_href_start, $pingback_server_url_len); - - // We may find rel="pingback" but an incomplete pingback URL - if ( $pingback_server_url_len > 0 ) { // We got it! - return $pingback_server_url; - } - } - - return false; -} - -/** - * Perform all pingbacks, enclosures, trackbacks, and send to pingback services. - * - * @since 2.1.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - */ -function do_all_pings() { - global $wpdb; - - // Do pingbacks - while ($ping = $wpdb->get_row("SELECT ID, post_content, meta_id FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_pingme' LIMIT 1")) { - delete_metadata_by_mid( 'post', $ping->meta_id ); - pingback( $ping->post_content, $ping->ID ); - } - - // Do Enclosures - while ($enclosure = $wpdb->get_row("SELECT ID, post_content, meta_id FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_encloseme' LIMIT 1")) { - delete_metadata_by_mid( 'post', $enclosure->meta_id ); - do_enclose( $enclosure->post_content, $enclosure->ID ); - } - - // Do Trackbacks - $trackbacks = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE to_ping <> '' AND post_status = 'publish'"); - if ( is_array($trackbacks) ) - foreach ( $trackbacks as $trackback ) - do_trackbacks($trackback); - - //Do Update Services/Generic Pings - generic_ping(); -} - -/** - * Perform trackbacks. - * - * @since 1.5.0 - * @since 4.7.0 $post_id can be a WP_Post object. - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int|WP_Post $post_id Post object or ID to do trackbacks on. - */ -function do_trackbacks( $post_id ) { - global $wpdb; - $post = get_post( $post_id ); - if ( ! $post ) { - return false; - } - - $to_ping = get_to_ping( $post ); - $pinged = get_pung( $post ); - if ( empty( $to_ping ) ) { - $wpdb->update($wpdb->posts, array( 'to_ping' => '' ), array( 'ID' => $post->ID ) ); - return; - } - - if ( empty($post->post_excerpt) ) { - /** This filter is documented in wp-includes/post-template.php */ - $excerpt = apply_filters( 'the_content', $post->post_content, $post->ID ); - } else { - /** This filter is documented in wp-includes/post-template.php */ - $excerpt = apply_filters( 'the_excerpt', $post->post_excerpt ); - } - - $excerpt = str_replace(']]>', ']]>', $excerpt); - $excerpt = wp_html_excerpt($excerpt, 252, '…'); - - /** This filter is documented in wp-includes/post-template.php */ - $post_title = apply_filters( 'the_title', $post->post_title, $post->ID ); - $post_title = strip_tags($post_title); - - if ( $to_ping ) { - foreach ( (array) $to_ping as $tb_ping ) { - $tb_ping = trim($tb_ping); - if ( !in_array($tb_ping, $pinged) ) { - trackback( $tb_ping, $post_title, $excerpt, $post->ID ); - $pinged[] = $tb_ping; - } else { - $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, %s, - '')) WHERE ID = %d", $tb_ping, $post->ID ) ); - } - } - } -} - -/** - * Sends pings to all of the ping site services. - * - * @since 1.2.0 - * - * @param int $post_id Post ID. - * @return int Same as Post ID from parameter - */ -function generic_ping( $post_id = 0 ) { - $services = get_option('ping_sites'); - - $services = explode("\n", $services); - foreach ( (array) $services as $service ) { - $service = trim($service); - if ( '' != $service ) - weblog_ping($service); - } - - return $post_id; -} - -/** - * Pings back the links found in a post. - * - * @since 0.71 - * @since 4.7.0 $post_id can be a WP_Post object. - * - * @param string $content Post content to check for links. If empty will retrieve from post. - * @param int|WP_Post $post_id Post Object or ID. - */ -function pingback( $content, $post_id ) { - include_once( ABSPATH . WPINC . '/class-IXR.php' ); - include_once( ABSPATH . WPINC . '/class-wp-http-ixr-client.php' ); - - // original code by Mort (http://mort.mine.nu:8080) - $post_links = array(); - - $post = get_post( $post_id ); - if ( ! $post ) { - return; - } - - $pung = get_pung( $post ); - - if ( empty( $content ) ) { - $content = $post->post_content; - } - - // Step 1 - // Parsing the post, external links (if any) are stored in the $post_links array - $post_links_temp = wp_extract_urls( $content ); - - // Step 2. - // Walking thru the links array - // first we get rid of links pointing to sites, not to specific files - // Example: - // http://dummy-weblog.org - // http://dummy-weblog.org/ - // http://dummy-weblog.org/post.php - // We don't wanna ping first and second types, even if they have a valid - - foreach ( (array) $post_links_temp as $link_test ) : - if ( ! in_array( $link_test, $pung ) && ( url_to_postid( $link_test ) != $post->ID ) // If we haven't pung it already and it isn't a link to itself - && !is_local_attachment($link_test) ) : // Also, let's never ping local attachments. - if ( $test = @parse_url($link_test) ) { - if ( isset($test['query']) ) - $post_links[] = $link_test; - elseif ( isset( $test['path'] ) && ( $test['path'] != '/' ) && ( $test['path'] != '' ) ) - $post_links[] = $link_test; - } - endif; - endforeach; - - $post_links = array_unique( $post_links ); - /** - * Fires just before pinging back links found in a post. - * - * @since 2.0.0 - * - * @param array &$post_links An array of post links to be checked, passed by reference. - * @param array &$pung Whether a link has already been pinged, passed by reference. - * @param int $post_ID The post ID. - */ - do_action_ref_array( 'pre_ping', array( &$post_links, &$pung, $post->ID ) ); - - foreach ( (array) $post_links as $pagelinkedto ) { - $pingback_server_url = discover_pingback_server_uri( $pagelinkedto ); - - if ( $pingback_server_url ) { - @ set_time_limit( 60 ); - // Now, the RPC call - $pagelinkedfrom = get_permalink( $post ); - - // using a timeout of 3 seconds should be enough to cover slow servers - $client = new WP_HTTP_IXR_Client($pingback_server_url); - $client->timeout = 3; - /** - * Filters the user agent sent when pinging-back a URL. - * - * @since 2.9.0 - * - * @param string $concat_useragent The user agent concatenated with ' -- WordPress/' - * and the WordPress version. - * @param string $useragent The useragent. - * @param string $pingback_server_url The server URL being linked to. - * @param string $pagelinkedto URL of page linked to. - * @param string $pagelinkedfrom URL of page linked from. - */ - $client->useragent = apply_filters( 'pingback_useragent', $client->useragent . ' -- WordPress/' . get_bloginfo( 'version' ), $client->useragent, $pingback_server_url, $pagelinkedto, $pagelinkedfrom ); - // when set to true, this outputs debug messages by itself - $client->debug = false; - - if ( $client->query('pingback.ping', $pagelinkedfrom, $pagelinkedto) || ( isset($client->error->code) && 48 == $client->error->code ) ) // Already registered - add_ping( $post, $pagelinkedto ); - } - } -} - -/** - * Check whether blog is public before returning sites. - * - * @since 2.1.0 - * - * @param mixed $sites Will return if blog is public, will not return if not public. - * @return mixed Empty string if blog is not public, returns $sites, if site is public. - */ -function privacy_ping_filter($sites) { - if ( '0' != get_option('blog_public') ) - return $sites; - else - return ''; -} - -/** - * Send a Trackback. - * - * Updates database when sending trackback to prevent duplicates. - * - * @since 0.71 - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param string $trackback_url URL to send trackbacks. - * @param string $title Title of post. - * @param string $excerpt Excerpt of post. - * @param int $ID Post ID. - * @return int|false|void Database query from update. - */ -function trackback($trackback_url, $title, $excerpt, $ID) { - global $wpdb; - - if ( empty($trackback_url) ) - return; - - $options = array(); - $options['timeout'] = 10; - $options['body'] = array( - 'title' => $title, - 'url' => get_permalink($ID), - 'blog_name' => get_option('blogname'), - 'excerpt' => $excerpt - ); - - $response = wp_safe_remote_post( $trackback_url, $options ); - - if ( is_wp_error( $response ) ) - return; - - $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET pinged = CONCAT(pinged, '\n', %s) WHERE ID = %d", $trackback_url, $ID) ); - return $wpdb->query( $wpdb->prepare("UPDATE $wpdb->posts SET to_ping = TRIM(REPLACE(to_ping, %s, '')) WHERE ID = %d", $trackback_url, $ID) ); -} - -/** - * Send a pingback. - * - * @since 1.2.0 - * - * @param string $server Host of blog to connect to. - * @param string $path Path to send the ping. - */ -function weblog_ping($server = '', $path = '') { - include_once( ABSPATH . WPINC . '/class-IXR.php' ); - include_once( ABSPATH . WPINC . '/class-wp-http-ixr-client.php' ); - - // using a timeout of 3 seconds should be enough to cover slow servers - $client = new WP_HTTP_IXR_Client($server, ((!strlen(trim($path)) || ('/' == $path)) ? false : $path)); - $client->timeout = 3; - $client->useragent .= ' -- WordPress/' . get_bloginfo( 'version' ); - - // when set to true, this outputs debug messages by itself - $client->debug = false; - $home = trailingslashit( home_url() ); - if ( !$client->query('weblogUpdates.extendedPing', get_option('blogname'), $home, get_bloginfo('rss2_url') ) ) // then try a normal ping - $client->query('weblogUpdates.ping', get_option('blogname'), $home); -} - -/** - * Default filter attached to pingback_ping_source_uri to validate the pingback's Source URI - * - * @since 3.5.1 - * @see wp_http_validate_url() - * - * @param string $source_uri - * @return string - */ -function pingback_ping_source_uri( $source_uri ) { - return (string) wp_http_validate_url( $source_uri ); -} - -/** - * Default filter attached to xmlrpc_pingback_error. - * - * Returns a generic pingback error code unless the error code is 48, - * which reports that the pingback is already registered. - * - * @since 3.5.1 - * @link https://www.hixie.ch/specs/pingback/pingback#TOC3 - * - * @param IXR_Error $ixr_error - * @return IXR_Error - */ -function xmlrpc_pingback_error( $ixr_error ) { - if ( $ixr_error->code === 48 ) - return $ixr_error; - return new IXR_Error( 0, '' ); -} - -// -// Cache -// - -/** - * Removes a comment from the object cache. - * - * @since 2.3.0 - * - * @param int|array $ids Comment ID or an array of comment IDs to remove from cache. - */ -function clean_comment_cache($ids) { - foreach ( (array) $ids as $id ) { - wp_cache_delete( $id, 'comment' ); - - /** - * Fires immediately after a comment has been removed from the object cache. - * - * @since 4.5.0 - * - * @param int $id Comment ID. - */ - do_action( 'clean_comment_cache', $id ); - } - - wp_cache_set( 'last_changed', microtime(), 'comment' ); -} - -/** - * Updates the comment cache of given comments. - * - * Will add the comments in $comments to the cache. If comment ID already exists - * in the comment cache then it will not be updated. The comment is added to the - * cache using the comment group with the key using the ID of the comments. - * - * @since 2.3.0 - * @since 4.4.0 Introduced the `$update_meta_cache` parameter. - * - * @param array $comments Array of comment row objects - * @param bool $update_meta_cache Whether to update commentmeta cache. Default true. - */ -function update_comment_cache( $comments, $update_meta_cache = true ) { - foreach ( (array) $comments as $comment ) - wp_cache_add($comment->comment_ID, $comment, 'comment'); - - if ( $update_meta_cache ) { - // Avoid `wp_list_pluck()` in case `$comments` is passed by reference. - $comment_ids = array(); - foreach ( $comments as $comment ) { - $comment_ids[] = $comment->comment_ID; - } - update_meta_cache( 'comment', $comment_ids ); - } -} - -/** - * Adds any comments from the given IDs to the cache that do not already exist in cache. - * - * @since 4.4.0 - * @access private - * - * @see update_comment_cache() - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param array $comment_ids Array of comment IDs. - * @param bool $update_meta_cache Optional. Whether to update the meta cache. Default true. - */ -function _prime_comment_caches( $comment_ids, $update_meta_cache = true ) { - global $wpdb; - - $non_cached_ids = _get_non_cached_ids( $comment_ids, 'comment' ); - if ( !empty( $non_cached_ids ) ) { - $fresh_comments = $wpdb->get_results( sprintf( "SELECT $wpdb->comments.* FROM $wpdb->comments WHERE comment_ID IN (%s)", join( ",", array_map( 'intval', $non_cached_ids ) ) ) ); - - update_comment_cache( $fresh_comments, $update_meta_cache ); - } -} - -// -// Internal -// - -/** - * Close comments on old posts on the fly, without any extra DB queries. Hooked to the_posts. - * - * @access private - * @since 2.7.0 - * - * @param WP_Post $posts Post data object. - * @param WP_Query $query Query object. - * @return array - */ -function _close_comments_for_old_posts( $posts, $query ) { - if ( empty( $posts ) || ! $query->is_singular() || ! get_option( 'close_comments_for_old_posts' ) ) - return $posts; - - /** - * Filters the list of post types to automatically close comments for. - * - * @since 3.2.0 - * - * @param array $post_types An array of registered post types. Default array with 'post'. - */ - $post_types = apply_filters( 'close_comments_for_post_types', array( 'post' ) ); - if ( ! in_array( $posts[0]->post_type, $post_types ) ) - return $posts; - - $days_old = (int) get_option( 'close_comments_days_old' ); - if ( ! $days_old ) - return $posts; - - if ( time() - strtotime( $posts[0]->post_date_gmt ) > ( $days_old * DAY_IN_SECONDS ) ) { - $posts[0]->comment_status = 'closed'; - $posts[0]->ping_status = 'closed'; - } - - return $posts; -} - -/** - * Close comments on an old post. Hooked to comments_open and pings_open. - * - * @access private - * @since 2.7.0 - * - * @param bool $open Comments open or closed - * @param int $post_id Post ID - * @return bool $open - */ -function _close_comments_for_old_post( $open, $post_id ) { - if ( ! $open ) - return $open; - - if ( !get_option('close_comments_for_old_posts') ) - return $open; - - $days_old = (int) get_option('close_comments_days_old'); - if ( !$days_old ) - return $open; - - $post = get_post($post_id); - - /** This filter is documented in wp-includes/comment.php */ - $post_types = apply_filters( 'close_comments_for_post_types', array( 'post' ) ); - if ( ! in_array( $post->post_type, $post_types ) ) - return $open; - - // Undated drafts should not show up as comments closed. - if ( '0000-00-00 00:00:00' === $post->post_date_gmt ) { - return $open; - } - - if ( time() - strtotime( $post->post_date_gmt ) > ( $days_old * DAY_IN_SECONDS ) ) - return false; - - return $open; -} - -/** - * Handles the submission of a comment, usually posted to wp-comments-post.php via a comment form. - * - * This function expects unslashed data, as opposed to functions such as `wp_new_comment()` which - * expect slashed data. - * - * @since 4.4.0 - * - * @param array $comment_data { - * Comment data. - * - * @type string|int $comment_post_ID The ID of the post that relates to the comment. - * @type string $author The name of the comment author. - * @type string $email The comment author email address. - * @type string $url The comment author URL. - * @type string $comment The content of the comment. - * @type string|int $comment_parent The ID of this comment's parent, if any. Default 0. - * @type string $_wp_unfiltered_html_comment The nonce value for allowing unfiltered HTML. - * } - * @return WP_Comment|WP_Error A WP_Comment object on success, a WP_Error object on failure. - */ -function wp_handle_comment_submission( $comment_data ) { - - $comment_post_ID = $comment_parent = 0; - $comment_author = $comment_author_email = $comment_author_url = $comment_content = null; - - if ( isset( $comment_data['comment_post_ID'] ) ) { - $comment_post_ID = (int) $comment_data['comment_post_ID']; - } - if ( isset( $comment_data['author'] ) && is_string( $comment_data['author'] ) ) { - $comment_author = trim( strip_tags( $comment_data['author'] ) ); - } - if ( isset( $comment_data['email'] ) && is_string( $comment_data['email'] ) ) { - $comment_author_email = trim( $comment_data['email'] ); - } - if ( isset( $comment_data['url'] ) && is_string( $comment_data['url'] ) ) { - $comment_author_url = trim( $comment_data['url'] ); - } - if ( isset( $comment_data['comment'] ) && is_string( $comment_data['comment'] ) ) { - $comment_content = trim( $comment_data['comment'] ); - } - if ( isset( $comment_data['comment_parent'] ) ) { - $comment_parent = absint( $comment_data['comment_parent'] ); - } - - $post = get_post( $comment_post_ID ); - - if ( empty( $post->comment_status ) ) { - - /** - * Fires when a comment is attempted on a post that does not exist. - * - * @since 1.5.0 - * - * @param int $comment_post_ID Post ID. - */ - do_action( 'comment_id_not_found', $comment_post_ID ); - - return new WP_Error( 'comment_id_not_found' ); - - } - - // get_post_status() will get the parent status for attachments. - $status = get_post_status( $post ); - - if ( ( 'private' == $status ) && ! current_user_can( 'read_post', $comment_post_ID ) ) { - return new WP_Error( 'comment_id_not_found' ); - } - - $status_obj = get_post_status_object( $status ); - - if ( ! comments_open( $comment_post_ID ) ) { - - /** - * Fires when a comment is attempted on a post that has comments closed. - * - * @since 1.5.0 - * - * @param int $comment_post_ID Post ID. - */ - do_action( 'comment_closed', $comment_post_ID ); - - return new WP_Error( 'comment_closed', __( 'Sorry, comments are closed for this item.' ), 403 ); - - } elseif ( 'trash' == $status ) { - - /** - * Fires when a comment is attempted on a trashed post. - * - * @since 2.9.0 - * - * @param int $comment_post_ID Post ID. - */ - do_action( 'comment_on_trash', $comment_post_ID ); - - return new WP_Error( 'comment_on_trash' ); - - } elseif ( ! $status_obj->public && ! $status_obj->private ) { - - /** - * Fires when a comment is attempted on a post in draft mode. - * - * @since 1.5.1 - * - * @param int $comment_post_ID Post ID. - */ - do_action( 'comment_on_draft', $comment_post_ID ); - - return new WP_Error( 'comment_on_draft' ); - - } elseif ( post_password_required( $comment_post_ID ) ) { - - /** - * Fires when a comment is attempted on a password-protected post. - * - * @since 2.9.0 - * - * @param int $comment_post_ID Post ID. - */ - do_action( 'comment_on_password_protected', $comment_post_ID ); - - return new WP_Error( 'comment_on_password_protected' ); - - } else { - - /** - * Fires before a comment is posted. - * - * @since 2.8.0 - * - * @param int $comment_post_ID Post ID. - */ - do_action( 'pre_comment_on_post', $comment_post_ID ); - - } - - // If the user is logged in - $user = wp_get_current_user(); - if ( $user->exists() ) { - if ( empty( $user->display_name ) ) { - $user->display_name=$user->user_login; - } - $comment_author = $user->display_name; - $comment_author_email = $user->user_email; - $comment_author_url = $user->user_url; - $user_ID = $user->ID; - if ( current_user_can( 'unfiltered_html' ) ) { - if ( ! isset( $comment_data['_wp_unfiltered_html_comment'] ) - || ! wp_verify_nonce( $comment_data['_wp_unfiltered_html_comment'], 'unfiltered-html-comment_' . $comment_post_ID ) - ) { - kses_remove_filters(); // start with a clean slate - kses_init_filters(); // set up the filters - } - } - } else { - if ( get_option( 'comment_registration' ) ) { - return new WP_Error( 'not_logged_in', __( 'Sorry, you must be logged in to comment.' ), 403 ); - } - } - - $comment_type = ''; - - if ( get_option( 'require_name_email' ) && ! $user->exists() ) { - if ( 6 > strlen( $comment_author_email ) || '' == $comment_author ) { - return new WP_Error( 'require_name_email', __( 'ERROR: please fill the required fields (name, email).' ), 200 ); - } elseif ( ! is_email( $comment_author_email ) ) { - return new WP_Error( 'require_valid_email', __( 'ERROR: please enter a valid email address.' ), 200 ); - } - } - - if ( '' == $comment_content ) { - return new WP_Error( 'require_valid_comment', __( 'ERROR: please type a comment.' ), 200 ); - } - - $commentdata = compact( - 'comment_post_ID', - 'comment_author', - 'comment_author_email', - 'comment_author_url', - 'comment_content', - 'comment_type', - 'comment_parent', - 'user_ID' - ); - - $check_max_lengths = wp_check_comment_data_max_lengths( $commentdata ); - if ( is_wp_error( $check_max_lengths ) ) { - return $check_max_lengths; - } - - $comment_id = wp_new_comment( wp_slash( $commentdata ), true ); - if ( is_wp_error( $comment_id ) ) { - return $comment_id; - } - - if ( ! $comment_id ) { - return new WP_Error( 'comment_save_error', __( 'ERROR: The comment could not be saved. Please try again later.' ), 500 ); - } - - return get_comment( $comment_id ); -} diff --git a/wp/wp-includes/compat.php b/wp/wp-includes/compat.php deleted file mode 100644 index 0ccee2d4..00000000 --- a/wp/wp-includes/compat.php +++ /dev/null @@ -1,580 +0,0 @@ - 1 && $str = array_pop( $pieces ) ); - - return join( '', array_slice( $chars, $start, $length ) ); -} - -if ( ! function_exists( 'mb_strlen' ) ) : - /** - * Compat function to mimic mb_strlen(). - * - * @ignore - * @since 4.2.0 - * - * @see _mb_strlen() - * - * @param string $str The string to retrieve the character length from. - * @param string|null $encoding Optional. Character encoding to use. Default null. - * @return int String length of `$str`. - */ - function mb_strlen( $str, $encoding = null ) { - return _mb_strlen( $str, $encoding ); - } -endif; - -/** - * Internal compat function to mimic mb_strlen(). - * - * Only understands UTF-8 and 8bit. All other character sets will be treated as 8bit. - * For $encoding === UTF-8, the `$str` input is expected to be a valid UTF-8 byte - * sequence. The behavior of this function for invalid inputs is undefined. - * - * @ignore - * @since 4.2.0 - * - * @param string $str The string to retrieve the character length from. - * @param string|null $encoding Optional. Character encoding to use. Default null. - * @return int String length of `$str`. - */ -function _mb_strlen( $str, $encoding = null ) { - if ( null === $encoding ) { - $encoding = get_option( 'blog_charset' ); - } - - /* - * The solution below works only for UTF-8, so in case of a different charset - * just use built-in strlen(). - */ - if ( ! in_array( $encoding, array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ) ) ) { - return strlen( $str ); - } - - if ( _wp_can_use_pcre_u() ) { - // Use the regex unicode support to separate the UTF-8 characters into an array. - preg_match_all( '/./us', $str, $match ); - return count( $match[0] ); - } - - $regex = '/(?: - [\x00-\x7F] # single-byte sequences 0xxxxxxx - | [\xC2-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx - | \xE0[\xA0-\xBF][\x80-\xBF] # triple-byte sequences 1110xxxx 10xxxxxx * 2 - | [\xE1-\xEC][\x80-\xBF]{2} - | \xED[\x80-\x9F][\x80-\xBF] - | [\xEE-\xEF][\x80-\xBF]{2} - | \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences 11110xxx 10xxxxxx * 3 - | [\xF1-\xF3][\x80-\xBF]{3} - | \xF4[\x80-\x8F][\x80-\xBF]{2} - )/x'; - - // Start at 1 instead of 0 since the first thing we do is decrement. - $count = 1; - do { - // We had some string left over from the last round, but we counted it in that last round. - $count--; - - /* - * Split by UTF-8 character, limit to 1000 characters (last array element will contain - * the rest of the string). - */ - $pieces = preg_split( $regex, $str, 1000 ); - - // Increment. - $count += count( $pieces ); - - // If there's anything left over, repeat the loop. - } while ( $str = array_pop( $pieces ) ); - - // Fencepost: preg_split() always returns one extra item in the array. - return --$count; -} - -if ( !function_exists('hash_hmac') ): -/** - * Compat function to mimic hash_hmac(). - * - * @ignore - * @since 3.2.0 - * - * @see _hash_hmac() - * - * @param string $algo Hash algorithm. Accepts 'md5' or 'sha1'. - * @param string $data Data to be hashed. - * @param string $key Secret key to use for generating the hash. - * @param bool $raw_output Optional. Whether to output raw binary data (true), - * or lowercase hexits (false). Default false. - * @return string|false The hash in output determined by `$raw_output`. False if `$algo` - * is unknown or invalid. - */ -function hash_hmac($algo, $data, $key, $raw_output = false) { - return _hash_hmac($algo, $data, $key, $raw_output); -} -endif; - -/** - * Internal compat function to mimic hash_hmac(). - * - * @ignore - * @since 3.2.0 - * - * @param string $algo Hash algorithm. Accepts 'md5' or 'sha1'. - * @param string $data Data to be hashed. - * @param string $key Secret key to use for generating the hash. - * @param bool $raw_output Optional. Whether to output raw binary data (true), - * or lowercase hexits (false). Default false. - * @return string|false The hash in output determined by `$raw_output`. False if `$algo` - * is unknown or invalid. - */ -function _hash_hmac($algo, $data, $key, $raw_output = false) { - $packs = array('md5' => 'H32', 'sha1' => 'H40'); - - if ( !isset($packs[$algo]) ) - return false; - - $pack = $packs[$algo]; - - if (strlen($key) > 64) - $key = pack($pack, $algo($key)); - - $key = str_pad($key, 64, chr(0)); - - $ipad = (substr($key, 0, 64) ^ str_repeat(chr(0x36), 64)); - $opad = (substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64)); - - $hmac = $algo($opad . pack($pack, $algo($ipad . $data))); - - if ( $raw_output ) - return pack( $pack, $hmac ); - return $hmac; -} - -if ( !function_exists('json_encode') ) { - function json_encode( $string ) { - global $wp_json; - - if ( ! ( $wp_json instanceof Services_JSON ) ) { - require_once( ABSPATH . WPINC . '/class-json.php' ); - $wp_json = new Services_JSON(); - } - - return $wp_json->encodeUnsafe( $string ); - } -} - -if ( !function_exists('json_decode') ) { - /** - * @global Services_JSON $wp_json - * @param string $string - * @param bool $assoc_array - * @return object|array - */ - function json_decode( $string, $assoc_array = false ) { - global $wp_json; - - if ( ! ($wp_json instanceof Services_JSON ) ) { - require_once( ABSPATH . WPINC . '/class-json.php' ); - $wp_json = new Services_JSON(); - } - - $res = $wp_json->decode( $string ); - if ( $assoc_array ) - $res = _json_decode_object_helper( $res ); - return $res; - } - - /** - * @param object $data - * @return array - */ - function _json_decode_object_helper($data) { - if ( is_object($data) ) - $data = get_object_vars($data); - return is_array($data) ? array_map(__FUNCTION__, $data) : $data; - } -} - -if ( ! function_exists( 'hash_equals' ) ) : -/** - * Timing attack safe string comparison - * - * Compares two strings using the same time whether they're equal or not. - * - * This function was added in PHP 5.6. - * - * Note: It can leak the length of a string when arguments of differing length are supplied. - * - * @since 3.9.2 - * - * @param string $a Expected string. - * @param string $b Actual, user supplied, string. - * @return bool Whether strings are equal. - */ -function hash_equals( $a, $b ) { - $a_length = strlen( $a ); - if ( $a_length !== strlen( $b ) ) { - return false; - } - $result = 0; - - // Do not attempt to "optimize" this. - for ( $i = 0; $i < $a_length; $i++ ) { - $result |= ord( $a[ $i ] ) ^ ord( $b[ $i ] ); - } - - return $result === 0; -} -endif; - -// JSON_PRETTY_PRINT was introduced in PHP 5.4 -// Defined here to prevent a notice when using it with wp_json_encode() -if ( ! defined( 'JSON_PRETTY_PRINT' ) ) { - define( 'JSON_PRETTY_PRINT', 128 ); -} - -if ( ! function_exists( 'json_last_error_msg' ) ) : - /** - * Retrieves the error string of the last json_encode() or json_decode() call. - * - * @since 4.4.0 - * - * @internal This is a compatibility function for PHP <5.5 - * - * @return bool|string Returns the error message on success, "No Error" if no error has occurred, - * or false on failure. - */ - function json_last_error_msg() { - // See https://core.trac.wordpress.org/ticket/27799. - if ( ! function_exists( 'json_last_error' ) ) { - return false; - } - - $last_error_code = json_last_error(); - - // Just in case JSON_ERROR_NONE is not defined. - $error_code_none = defined( 'JSON_ERROR_NONE' ) ? JSON_ERROR_NONE : 0; - - switch ( true ) { - case $last_error_code === $error_code_none: - return 'No error'; - - case defined( 'JSON_ERROR_DEPTH' ) && JSON_ERROR_DEPTH === $last_error_code: - return 'Maximum stack depth exceeded'; - - case defined( 'JSON_ERROR_STATE_MISMATCH' ) && JSON_ERROR_STATE_MISMATCH === $last_error_code: - return 'State mismatch (invalid or malformed JSON)'; - - case defined( 'JSON_ERROR_CTRL_CHAR' ) && JSON_ERROR_CTRL_CHAR === $last_error_code: - return 'Control character error, possibly incorrectly encoded'; - - case defined( 'JSON_ERROR_SYNTAX' ) && JSON_ERROR_SYNTAX === $last_error_code: - return 'Syntax error'; - - case defined( 'JSON_ERROR_UTF8' ) && JSON_ERROR_UTF8 === $last_error_code: - return 'Malformed UTF-8 characters, possibly incorrectly encoded'; - - case defined( 'JSON_ERROR_RECURSION' ) && JSON_ERROR_RECURSION === $last_error_code: - return 'Recursion detected'; - - case defined( 'JSON_ERROR_INF_OR_NAN' ) && JSON_ERROR_INF_OR_NAN === $last_error_code: - return 'Inf and NaN cannot be JSON encoded'; - - case defined( 'JSON_ERROR_UNSUPPORTED_TYPE' ) && JSON_ERROR_UNSUPPORTED_TYPE === $last_error_code: - return 'Type is not supported'; - - default: - return 'An unknown error occurred'; - } - } -endif; - -if ( ! interface_exists( 'JsonSerializable' ) ) { - define( 'WP_JSON_SERIALIZE_COMPATIBLE', true ); - /** - * JsonSerializable interface. - * - * Compatibility shim for PHP <5.4 - * - * @link https://secure.php.net/jsonserializable - * - * @since 4.4.0 - */ - interface JsonSerializable { - public function jsonSerialize(); - } -} - -// random_int was introduced in PHP 7.0 -if ( ! function_exists( 'random_int' ) ) { - require ABSPATH . WPINC . '/random_compat/random.php'; -} - -if ( ! function_exists( 'array_replace_recursive' ) ) : - /** - * PHP-agnostic version of {@link array_replace_recursive()}. - * - * The array_replace_recursive() function is a PHP 5.3 function. WordPress - * currently supports down to PHP 5.2, so this method is a workaround - * for PHP 5.2. - * - * Note: array_replace_recursive() supports infinite arguments, but for our use- - * case, we only need to support two arguments. - * - * Subject to removal once WordPress makes PHP 5.3.0 the minimum requirement. - * - * @since 4.5.3 - * - * @see https://secure.php.net/manual/en/function.array-replace-recursive.php#109390 - * - * @param array $base Array with keys needing to be replaced. - * @param array $replacements Array with the replaced keys. - * - * @return array - */ - function array_replace_recursive( $base = array(), $replacements = array() ) { - foreach ( array_slice( func_get_args(), 1 ) as $replacements ) { - $bref_stack = array( &$base ); - $head_stack = array( $replacements ); - - do { - end( $bref_stack ); - - $bref = &$bref_stack[ key( $bref_stack ) ]; - $head = array_pop( $head_stack ); - - unset( $bref_stack[ key( $bref_stack ) ] ); - - foreach ( array_keys( $head ) as $key ) { - if ( isset( $key, $bref ) && - isset( $bref[ $key ] ) && is_array( $bref[ $key ] ) && - isset( $head[ $key ] ) && is_array( $head[ $key ] ) - ) { - $bref_stack[] = &$bref[ $key ]; - $head_stack[] = $head[ $key ]; - } else { - $bref[ $key ] = $head[ $key ]; - } - } - } while ( count( $head_stack ) ); - } - - return $base; - } -endif; - -// SPL can be disabled on PHP 5.2 -if ( ! function_exists( 'spl_autoload_register' ) ): - $_wp_spl_autoloaders = array(); - - /** - * Autoloader compatibility callback. - * - * @since 4.6.0 - * - * @param string $classname Class to attempt autoloading. - */ - function __autoload( $classname ) { - global $_wp_spl_autoloaders; - foreach ( $_wp_spl_autoloaders as $autoloader ) { - if ( ! is_callable( $autoloader ) ) { - // Avoid the extra warning if the autoloader isn't callable. - continue; - } - - call_user_func( $autoloader, $classname ); - - // If it has been autoloaded, stop processing. - if ( class_exists( $classname, false ) ) { - return; - } - } - } - - /** - * Registers a function to be autoloaded. - * - * @since 4.6.0 - * - * @param callable $autoload_function The function to register. - * @param bool $throw Optional. Whether the function should throw an exception - * if the function isn't callable. Default true. - * @param bool $prepend Whether the function should be prepended to the stack. - * Default false. - */ - function spl_autoload_register( $autoload_function, $throw = true, $prepend = false ) { - if ( $throw && ! is_callable( $autoload_function ) ) { - // String not translated to match PHP core. - throw new Exception( 'Function not callable' ); - } - - global $_wp_spl_autoloaders; - - // Don't allow multiple registration. - if ( in_array( $autoload_function, $_wp_spl_autoloaders ) ) { - return; - } - - if ( $prepend ) { - array_unshift( $_wp_spl_autoloaders, $autoload_function ); - } else { - $_wp_spl_autoloaders[] = $autoload_function; - } - } - - /** - * Unregisters an autoloader function. - * - * @since 4.6.0 - * - * @param callable $function The function to unregister. - * @return bool True if the function was unregistered, false if it could not be. - */ - function spl_autoload_unregister( $function ) { - global $_wp_spl_autoloaders; - foreach ( $_wp_spl_autoloaders as &$autoloader ) { - if ( $autoloader === $function ) { - unset( $autoloader ); - return true; - } - } - - return false; - } - - /** - * Retrieves the registered autoloader functions. - * - * @since 4.6.0 - * - * @return array List of autoloader functions. - */ - function spl_autoload_functions() { - return $GLOBALS['_wp_spl_autoloaders']; - } -endif; diff --git a/wp/wp-includes/cron.php b/wp/wp-includes/cron.php deleted file mode 100644 index f7e444b8..00000000 --- a/wp/wp-includes/cron.php +++ /dev/null @@ -1,507 +0,0 @@ - $hook, 'timestamp' => $timestamp, 'schedule' => false, 'args' => $args ); - /** - * Filters a single event before it is scheduled. - * - * @since 3.1.0 - * - * @param stdClass $event { - * An object containing an event's data. - * - * @type string $hook Action hook to execute when event is run. - * @type int $timestamp Unix timestamp (UTC) for when to run the event. - * @type string|false $schedule How often the event should recur. See `wp_get_schedules()`. - * @type array $args Arguments to pass to the hook's callback function. - * } - */ - $event = apply_filters( 'schedule_event', $event ); - - // A plugin disallowed this event - if ( ! $event ) - return false; - - $key = md5(serialize($event->args)); - - $crons[$event->timestamp][$event->hook][$key] = array( 'schedule' => $event->schedule, 'args' => $event->args ); - uksort( $crons, "strnatcasecmp" ); - _set_cron_array( $crons ); -} - -/** - * Schedule a recurring event. - * - * Schedules a hook which will be executed by the WordPress actions core on a - * specific interval, specified by you. The action will trigger when someone - * visits your WordPress site, if the scheduled time has passed. - * - * Valid values for the recurrence are hourly, daily, and twicedaily. These can - * be extended using the {@see 'cron_schedules'} filter in wp_get_schedules(). - * - * Use wp_next_scheduled() to prevent duplicates - * - * @since 2.1.0 - * - * @param int $timestamp Unix timestamp (UTC) for when to run the event. - * @param string $recurrence How often the event should recur. - * @param string $hook Action hook to execute when event is run. - * @param array $args Optional. Arguments to pass to the hook's callback function. - * @return false|void False if the event does not get scheduled. - */ -function wp_schedule_event( $timestamp, $recurrence, $hook, $args = array()) { - // Make sure timestamp is a positive integer - if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) { - return false; - } - - $crons = _get_cron_array(); - $schedules = wp_get_schedules(); - - if ( !isset( $schedules[$recurrence] ) ) - return false; - - $event = (object) array( 'hook' => $hook, 'timestamp' => $timestamp, 'schedule' => $recurrence, 'args' => $args, 'interval' => $schedules[$recurrence]['interval'] ); - /** This filter is documented in wp-includes/cron.php */ - $event = apply_filters( 'schedule_event', $event ); - - // A plugin disallowed this event - if ( ! $event ) - return false; - - $key = md5(serialize($event->args)); - - $crons[$event->timestamp][$event->hook][$key] = array( 'schedule' => $event->schedule, 'args' => $event->args, 'interval' => $event->interval ); - uksort( $crons, "strnatcasecmp" ); - _set_cron_array( $crons ); -} - -/** - * Reschedule a recurring event. - * - * @since 2.1.0 - * - * @param int $timestamp Unix timestamp (UTC) for when to run the event. - * @param string $recurrence How often the event should recur. - * @param string $hook Action hook to execute when event is run. - * @param array $args Optional. Arguments to pass to the hook's callback function. - * @return false|void False if the event does not get rescheduled. - */ -function wp_reschedule_event( $timestamp, $recurrence, $hook, $args = array() ) { - // Make sure timestamp is a positive integer - if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) { - return false; - } - - $crons = _get_cron_array(); - $schedules = wp_get_schedules(); - $key = md5( serialize( $args ) ); - $interval = 0; - - // First we try to get it from the schedule - if ( isset( $schedules[ $recurrence ] ) ) { - $interval = $schedules[ $recurrence ]['interval']; - } - // Now we try to get it from the saved interval in case the schedule disappears - if ( 0 == $interval ) { - $interval = $crons[ $timestamp ][ $hook ][ $key ]['interval']; - } - // Now we assume something is wrong and fail to schedule - if ( 0 == $interval ) { - return false; - } - - $now = time(); - - if ( $timestamp >= $now ) { - $timestamp = $now + $interval; - } else { - $timestamp = $now + ( $interval - ( ( $now - $timestamp ) % $interval ) ); - } - - wp_schedule_event( $timestamp, $recurrence, $hook, $args ); -} - -/** - * Unschedule a previously scheduled event. - * - * The $timestamp and $hook parameters are required so that the event can be - * identified. - * - * @since 2.1.0 - * - * @param int $timestamp Unix timestamp (UTC) for when to run the event. - * @param string $hook Action hook, the execution of which will be unscheduled. - * @param array $args Arguments to pass to the hook's callback function. - * Although not passed to a callback function, these arguments are used - * to uniquely identify the scheduled event, so they should be the same - * as those used when originally scheduling the event. - * @return false|void False if the event does not get unscheduled. - */ -function wp_unschedule_event( $timestamp, $hook, $args = array() ) { - // Make sure timestamp is a positive integer - if ( ! is_numeric( $timestamp ) || $timestamp <= 0 ) { - return false; - } - - $crons = _get_cron_array(); - $key = md5(serialize($args)); - unset( $crons[$timestamp][$hook][$key] ); - if ( empty($crons[$timestamp][$hook]) ) - unset( $crons[$timestamp][$hook] ); - if ( empty($crons[$timestamp]) ) - unset( $crons[$timestamp] ); - _set_cron_array( $crons ); -} - -/** - * Unschedule all events attached to the specified hook. - * - * @since 2.1.0 - * - * @param string $hook Action hook, the execution of which will be unscheduled. - * @param array $args Optional. Arguments that were to be passed to the hook's callback function. - */ -function wp_clear_scheduled_hook( $hook, $args = array() ) { - // Backward compatibility - // Previously this function took the arguments as discrete vars rather than an array like the rest of the API - if ( !is_array($args) ) { - _deprecated_argument( __FUNCTION__, '3.0.0', __('This argument has changed to an array to match the behavior of the other cron functions.') ); - $args = array_slice( func_get_args(), 1 ); - } - - // This logic duplicates wp_next_scheduled() - // It's required due to a scenario where wp_unschedule_event() fails due to update_option() failing, - // and, wp_next_scheduled() returns the same schedule in an infinite loop. - $crons = _get_cron_array(); - if ( empty( $crons ) ) - return; - - $key = md5( serialize( $args ) ); - foreach ( $crons as $timestamp => $cron ) { - if ( isset( $cron[ $hook ][ $key ] ) ) { - wp_unschedule_event( $timestamp, $hook, $args ); - } - } -} - -/** - * Retrieve the next timestamp for an event. - * - * @since 2.1.0 - * - * @param string $hook Action hook to execute when event is run. - * @param array $args Optional. Arguments to pass to the hook's callback function. - * @return false|int The Unix timestamp of the next time the scheduled event will occur. - */ -function wp_next_scheduled( $hook, $args = array() ) { - $crons = _get_cron_array(); - $key = md5(serialize($args)); - if ( empty($crons) ) - return false; - foreach ( $crons as $timestamp => $cron ) { - if ( isset( $cron[$hook][$key] ) ) - return $timestamp; - } - return false; -} - -/** - * Sends a request to run cron through HTTP request that doesn't halt page loading. - * - * @since 2.1.0 - * - * @param int $gmt_time Optional. Unix timestamp (UTC). Default 0 (current time is used). - */ -function spawn_cron( $gmt_time = 0 ) { - if ( ! $gmt_time ) - $gmt_time = microtime( true ); - - if ( defined('DOING_CRON') || isset($_GET['doing_wp_cron']) ) - return; - - /* - * Get the cron lock, which is a Unix timestamp of when the last cron was spawned - * and has not finished running. - * - * Multiple processes on multiple web servers can run this code concurrently, - * this lock attempts to make spawning as atomic as possible. - */ - $lock = get_transient('doing_cron'); - - if ( $lock > $gmt_time + 10 * MINUTE_IN_SECONDS ) - $lock = 0; - - // don't run if another process is currently running it or more than once every 60 sec. - if ( $lock + WP_CRON_LOCK_TIMEOUT > $gmt_time ) - return; - - //sanity check - $crons = _get_cron_array(); - if ( !is_array($crons) ) - return; - - $keys = array_keys( $crons ); - if ( isset($keys[0]) && $keys[0] > $gmt_time ) - return; - - if ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON ) { - if ( 'GET' !== $_SERVER['REQUEST_METHOD'] || defined( 'DOING_AJAX' ) || defined( 'XMLRPC_REQUEST' ) ) { - return; - } - - $doing_wp_cron = sprintf( '%.22F', $gmt_time ); - set_transient( 'doing_cron', $doing_wp_cron ); - - ob_start(); - wp_redirect( add_query_arg( 'doing_wp_cron', $doing_wp_cron, wp_unslash( $_SERVER['REQUEST_URI'] ) ) ); - echo ' '; - - // flush any buffers and send the headers - while ( @ob_end_flush() ); - flush(); - - WP_DEBUG ? include_once( ABSPATH . 'wp-cron.php' ) : @include_once( ABSPATH . 'wp-cron.php' ); - return; - } - - // Set the cron lock with the current unix timestamp, when the cron is being spawned. - $doing_wp_cron = sprintf( '%.22F', $gmt_time ); - set_transient( 'doing_cron', $doing_wp_cron ); - - /** - * Filters the cron request arguments. - * - * @since 3.5.0 - * @since 4.5.0 The `$doing_wp_cron` parameter was added. - * - * @param array $cron_request_array { - * An array of cron request URL arguments. - * - * @type string $url The cron request URL. - * @type int $key The 22 digit GMT microtime. - * @type array $args { - * An array of cron request arguments. - * - * @type int $timeout The request timeout in seconds. Default .01 seconds. - * @type bool $blocking Whether to set blocking for the request. Default false. - * @type bool $sslverify Whether SSL should be verified for the request. Default false. - * } - * } - * @param string $doing_wp_cron The unix timestamp of the cron lock. - */ - $cron_request = apply_filters( 'cron_request', array( - 'url' => add_query_arg( 'doing_wp_cron', $doing_wp_cron, site_url( 'wp-cron.php' ) ), - 'key' => $doing_wp_cron, - 'args' => array( - 'timeout' => 0.01, - 'blocking' => false, - /** This filter is documented in wp-includes/class-wp-http-streams.php */ - 'sslverify' => apply_filters( 'https_local_ssl_verify', false ) - ) - ), $doing_wp_cron ); - - wp_remote_post( $cron_request['url'], $cron_request['args'] ); -} - -/** - * Run scheduled callbacks or spawn cron for all scheduled events. - * - * @since 2.1.0 - */ -function wp_cron() { - // Prevent infinite loops caused by lack of wp-cron.php - if ( strpos($_SERVER['REQUEST_URI'], '/wp-cron.php') !== false || ( defined('DISABLE_WP_CRON') && DISABLE_WP_CRON ) ) - return; - - if ( false === $crons = _get_cron_array() ) - return; - - $gmt_time = microtime( true ); - $keys = array_keys( $crons ); - if ( isset($keys[0]) && $keys[0] > $gmt_time ) - return; - - $schedules = wp_get_schedules(); - foreach ( $crons as $timestamp => $cronhooks ) { - if ( $timestamp > $gmt_time ) break; - foreach ( (array) $cronhooks as $hook => $args ) { - if ( isset($schedules[$hook]['callback']) && !call_user_func( $schedules[$hook]['callback'] ) ) - continue; - spawn_cron( $gmt_time ); - break 2; - } - } -} - -/** - * Retrieve supported event recurrence schedules. - * - * The default supported recurrences are 'hourly', 'twicedaily', and 'daily'. A plugin may - * add more by hooking into the {@see 'cron_schedules'} filter. The filter accepts an array - * of arrays. The outer array has a key that is the name of the schedule or for - * example 'weekly'. The value is an array with two keys, one is 'interval' and - * the other is 'display'. - * - * The 'interval' is a number in seconds of when the cron job should run. So for - * 'hourly', the time is 3600 or 60*60. For weekly, the value would be - * 60*60*24*7 or 604800. The value of 'interval' would then be 604800. - * - * The 'display' is the description. For the 'weekly' key, the 'display' would - * be `__( 'Once Weekly' )`. - * - * For your plugin, you will be passed an array. you can easily add your - * schedule by doing the following. - * - * // Filter parameter variable name is 'array'. - * $array['weekly'] = array( - * 'interval' => 604800, - * 'display' => __( 'Once Weekly' ) - * ); - * - * - * @since 2.1.0 - * - * @return array - */ -function wp_get_schedules() { - $schedules = array( - 'hourly' => array( 'interval' => HOUR_IN_SECONDS, 'display' => __( 'Once Hourly' ) ), - 'twicedaily' => array( 'interval' => 12 * HOUR_IN_SECONDS, 'display' => __( 'Twice Daily' ) ), - 'daily' => array( 'interval' => DAY_IN_SECONDS, 'display' => __( 'Once Daily' ) ), - ); - /** - * Filters the non-default cron schedules. - * - * @since 2.1.0 - * - * @param array $new_schedules An array of non-default cron schedules. Default empty. - */ - return array_merge( apply_filters( 'cron_schedules', array() ), $schedules ); -} - -/** - * Retrieve the recurrence schedule for an event. - * - * @see wp_get_schedules() for available schedules. - * - * @since 2.1.0 - * - * @param string $hook Action hook to identify the event. - * @param array $args Optional. Arguments passed to the event's callback function. - * @return string|false False, if no schedule. Schedule name on success. - */ -function wp_get_schedule($hook, $args = array()) { - $crons = _get_cron_array(); - $key = md5(serialize($args)); - if ( empty($crons) ) - return false; - foreach ( $crons as $timestamp => $cron ) { - if ( isset( $cron[$hook][$key] ) ) - return $cron[$hook][$key]['schedule']; - } - return false; -} - -// -// Private functions -// - -/** - * Retrieve cron info array option. - * - * @since 2.1.0 - * @access private - * - * @return false|array CRON info array. - */ -function _get_cron_array() { - $cron = get_option('cron'); - if ( ! is_array($cron) ) - return false; - - if ( !isset($cron['version']) ) - $cron = _upgrade_cron_array($cron); - - unset($cron['version']); - - return $cron; -} - -/** - * Updates the CRON option with the new CRON array. - * - * @since 2.1.0 - * @access private - * - * @param array $cron Cron info array from _get_cron_array(). - */ -function _set_cron_array($cron) { - $cron['version'] = 2; - update_option( 'cron', $cron ); -} - -/** - * Upgrade a Cron info array. - * - * This function upgrades the Cron info array to version 2. - * - * @since 2.1.0 - * @access private - * - * @param array $cron Cron info array from _get_cron_array(). - * @return array An upgraded Cron info array. - */ -function _upgrade_cron_array($cron) { - if ( isset($cron['version']) && 2 == $cron['version']) - return $cron; - - $new_cron = array(); - - foreach ( (array) $cron as $timestamp => $hooks) { - foreach ( (array) $hooks as $hook => $args ) { - $key = md5(serialize($args['args'])); - $new_cron[$timestamp][$hook][$key] = $args; - } - } - - $new_cron['version'] = 2; - update_option( 'cron', $new_cron ); - return $new_cron; -} diff --git a/wp/wp-includes/css/admin-bar-rtl.css b/wp/wp-includes/css/admin-bar-rtl.css deleted file mode 100644 index 301459f5..00000000 --- a/wp/wp-includes/css/admin-bar-rtl.css +++ /dev/null @@ -1,1159 +0,0 @@ -#wpadminbar * { - height: auto; - width: auto; - margin: 0; - padding: 0; - position: static; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - font-size: 13px; - font-weight: 400; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - line-height: 32px; - -webkit-border-radius: 0; - border-radius: 0; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-transition: none; - transition: none; - -webkit-font-smoothing: subpixel-antialiased; /* Prevent Safari from switching to standard antialiasing on hover */ - -moz-osx-font-smoothing: auto; /* Prevent Firefox from inheriting from themes that use other values */ -} - -.rtl #wpadminbar * { - font-family: Tahoma, sans-serif; -} - -html:lang(he-il) .rtl #wpadminbar * { - font-family: Arial, sans-serif; -} - -#wpadminbar .ab-empty-item { - cursor: default; -} - -#wpadminbar .ab-empty-item, -#wpadminbar a.ab-item, -#wpadminbar > #wp-toolbar span.ab-label, -#wpadminbar > #wp-toolbar span.noticon { - color: #eee; -} - -#wpadminbar #wp-admin-bar-site-name a.ab-item, -#wpadminbar #wp-admin-bar-my-sites a.ab-item { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -#wpadminbar ul li:before, -#wpadminbar ul li:after { - content: normal; -} - -#wpadminbar a, -#wpadminbar a:hover, -#wpadminbar a img, -#wpadminbar a img:hover { - outline: none; - border: none; - text-decoration: none; - background: none; -} - -#wpadminbar a:focus, -#wpadminbar a:active, -#wpadminbar input[type="text"], -#wpadminbar input[type="password"], -#wpadminbar input[type="number"], -#wpadminbar input[type="search"], -#wpadminbar input[type="email"], -#wpadminbar input[type="url"], -#wpadminbar select, -#wpadminbar textarea, -#wpadminbar div { - -webkit-box-shadow: none; - box-shadow: none; - outline: none; -} - -#wpadminbar { - direction: rtl; - color: #ccc; - font-size: 13px; - font-weight: 400; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - line-height: 32px; - height: 32px; - position: fixed; - top: 0; - right: 0; - width: 100%; - min-width: 600px; /* match the min-width of the body in wp-admin.css */ - z-index: 99999; - background: #23282d; -} - -#wpadminbar .ab-sub-wrapper, -#wpadminbar ul, -#wpadminbar ul li { - background: none; - clear: none; - list-style: none; - margin: 0; - padding: 0; - position: relative; - text-indent: 0; - z-index: 99999; -} - -#wpadminbar ul#wp-admin-bar-root-default>li { - margin-left: 0; -} - -#wpadminbar .quicklinks ul { - text-align: right; -} - -#wpadminbar li { - float: right; -} - -#wpadminbar .ab-empty-item { - outline: none; -} - -#wpadminbar .quicklinks .ab-top-secondary > li { - float: left; -} - -#wpadminbar .quicklinks a, -#wpadminbar .quicklinks .ab-empty-item, -#wpadminbar .shortlink-input { - height: 32px; - display: block; - padding: 0 10px; - margin: 0; -} - -#wpadminbar .quicklinks > ul > li > a { - padding: 0 7px 0 8px; -} - -#wpadminbar .menupop .ab-sub-wrapper, -#wpadminbar .shortlink-input { - margin: 0; - padding: 0; - -webkit-box-shadow: 0 3px 5px rgba(0,0,0,0.2); - box-shadow: 0 3px 5px rgba(0,0,0,0.2); - background: #32373c; - display: none; - position: absolute; - float: none; -} - -#wpadminbar.ie7 .menupop .ab-sub-wrapper, -#wpadminbar.ie7 .shortlink-input { - top: 32px; - right: 0; -} - -#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { - min-width: 100%; -} - -#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper { - left: 0; - right: auto; -} - -#wpadminbar .ab-submenu { - padding: 6px 0; -} - -#wpadminbar .selected .shortlink-input { - display: block; -} - -#wpadminbar .quicklinks .menupop ul li { - float: none; -} - -#wpadminbar .quicklinks .menupop ul li a strong { - font-weight: 600; -} - -#wpadminbar .quicklinks .menupop ul li .ab-item, -#wpadminbar .quicklinks .menupop ul li a strong, -#wpadminbar .quicklinks .menupop.hover ul li .ab-item, -#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item, -#wpadminbar .shortlink-input { - line-height: 26px; - height: 26px; - white-space: nowrap; - min-width: 140px; -} - -#wpadminbar .shortlink-input { - width: 200px; -} - -#wpadminbar.nojs li:hover > .ab-sub-wrapper, -#wpadminbar li.hover > .ab-sub-wrapper { - display: block; -} - -#wpadminbar .menupop li:hover > .ab-sub-wrapper, -#wpadminbar .menupop li.hover > .ab-sub-wrapper { - margin-right: 100%; - margin-top: -32px; -} - -#wpadminbar .ab-top-secondary .menupop li:hover > .ab-sub-wrapper, -#wpadminbar .ab-top-secondary .menupop li.hover > .ab-sub-wrapper { - margin-right: 0; - right: inherit; - left: 100%; -} - -#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, -#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, -#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, -#wpadminbar .ab-top-menu > li.hover > .ab-item { - background: #32373c; - color: #00b9eb; -} - -#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, -#wpadminbar > #wp-toolbar li.hover span.ab-label, -#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { - color: #00b9eb; -} - -#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon, -#wpadminbar .ab-icon, -#wpadminbar .ab-item:before { - position: relative; - float: right; - font: normal 20px/1 dashicons; - speak: none; - padding: 4px 0; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - background-image: none !important; - margin-left: 6px; -} - -#wpadminbar .ab-icon:before, -#wpadminbar .ab-item:before, -#wpadminbar #adminbarsearch:before { - color: #a0a5aa; - color: rgba(240,245,250,0.6); -} - -#wpadminbar .ab-icon:before, -#wpadminbar .ab-item:before, -#wpadminbar #adminbarsearch:before { - position: relative; - -webkit-transition: all .1s ease-in-out; - transition: all .1s ease-in-out; -} - -#wpadminbar .ab-label { - display: inline-block; - height: 32px; -} - -#wpadminbar .ab-submenu .ab-item { - color: #b4b9be; - color: rgba(240,245,250,0.7); -} - -#wpadminbar .quicklinks .menupop ul li a, -#wpadminbar .quicklinks .menupop ul li a strong, -#wpadminbar .quicklinks .menupop.hover ul li a, -#wpadminbar.nojs .quicklinks .menupop:hover ul li a { - color: #b4b9be; - color: rgba(240,245,250,0.7); -} - -#wpadminbar .quicklinks .menupop ul li a:hover, -#wpadminbar .quicklinks .menupop ul li a:focus, -#wpadminbar .quicklinks .menupop ul li a:hover strong, -#wpadminbar .quicklinks .menupop ul li a:focus strong, -#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, -#wpadminbar .quicklinks .menupop.hover ul li a:hover, -#wpadminbar .quicklinks .menupop.hover ul li a:focus, -#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover, -#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus, -#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, -#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, -#wpadminbar li:hover .ab-icon:before, -#wpadminbar li:hover .ab-item:before, -#wpadminbar li a:focus .ab-icon:before, -#wpadminbar li .ab-item:focus:before, -#wpadminbar li .ab-item:focus .ab-icon:before, -#wpadminbar li.hover .ab-icon:before, -#wpadminbar li.hover .ab-item:before, -#wpadminbar li:hover #adminbarsearch:before, -#wpadminbar li #adminbarsearch.adminbar-focused:before { - color: #00b9eb; -} - -#wpadminbar.mobile .quicklinks .ab-icon:before, -#wpadminbar.mobile .quicklinks .ab-item:before { - color: #b4b9be; -} - -#wpadminbar.mobile .quicklinks .hover .ab-icon:before, -#wpadminbar.mobile .quicklinks .hover .ab-item:before { - color: #00b9eb; -} - -#wpadminbar .menupop .menupop > .ab-item:before, -#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before { - position: absolute; - font: normal 17px/1 dashicons; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -#wpadminbar .menupop .menupop > .ab-item { - display: block; - padding-left: 2em; -} - -#wpadminbar .menupop .menupop > .ab-item:before { - top: 1px; - left: 4px; - content: "\f141"; - color: inherit; -} - -#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item { - padding-right: 2em; - padding-left: 1em; -} - -#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before { - top: 1px; - right: 6px; - content: "\f139"; -} - -#wpadminbar .quicklinks .menupop ul.ab-sub-secondary { - display: block; - position: relative; - left: auto; - margin: 0; - -webkit-box-shadow: none; - box-shadow: none; -} - -#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, -#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { - background: #464b50; -} - -#wpadminbar .quicklinks .menupop .ab-sub-secondary > li > a:hover, -#wpadminbar .quicklinks .menupop .ab-sub-secondary > li .ab-item:focus a { - color: #00b9eb; -} - -#wpadminbar .quicklinks a span#ab-updates { - background: #eee; - color: #32373c; - display: inline; - padding: 2px 5px; - font-size: 10px; - font-weight: 600; - -webkit-border-radius: 10px; - border-radius: 10px; -} - -#wpadminbar .quicklinks a:hover span#ab-updates { - background: #fff; - color: #000; -} - -#wpadminbar .ab-top-secondary { - float: left; -} - -#wpadminbar ul li:last-child, -#wpadminbar ul li:last-child .ab-item { - -webkit-box-shadow: none; - box-shadow: none; -} - -/** - * My Account - */ -#wp-admin-bar-my-account > ul { - min-width: 198px; -} - -#wp-admin-bar-my-account > .ab-item:before { - content: "\f110"; - top: 2px; - float: left; - margin-right: 6px; - margin-left: 0; -} - -#wp-admin-bar-my-account.with-avatar > .ab-item:before { - display: none; - content: none; -} - -#wp-admin-bar-my-account.with-avatar > ul { - min-width: 270px; -} - -#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar .ab-item { - white-space: nowrap; -} - -#wpadminbar #wp-admin-bar-user-actions > li { - margin-right: 16px; - margin-left: 16px; -} - -#wpadminbar #wp-admin-bar-user-actions.ab-submenu { - padding: 6px 0 12px; -} - -#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li { - margin-right: 88px; -} - -#wpadminbar #wp-admin-bar-user-info { - margin-top: 6px; - margin-bottom: 15px; - height: auto; - background: none; -} - -#wp-admin-bar-user-info .avatar { - position: absolute; - right: -72px; - top: 4px; - width: 64px; - height: 64px; -} - -#wpadminbar #wp-admin-bar-user-info a { - background: none; - height: auto; -} - -#wpadminbar #wp-admin-bar-user-info span { - background: none; - padding: 0; - height: 18px; -} - -#wpadminbar #wp-admin-bar-user-info .display-name, -#wpadminbar #wp-admin-bar-user-info .username { - display: block; -} - -#wpadminbar #wp-admin-bar-user-info .username { - color: #a0a5aa; - font-size: 11px; -} - -#wpadminbar #wp-admin-bar-my-account.with-avatar > .ab-empty-item img, -#wpadminbar #wp-admin-bar-my-account.with-avatar > a img { - width: auto; - height: 16px; - padding: 0; - border: 1px solid #82878c; - background: #eee; - line-height: 24px; - vertical-align: middle; - margin: -4px 6px 0 0; - float: none; - display: inline; -} - -#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > .ab-empty-item img, -#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > a img { - width: auto; -} - -/** - * WP Logo - */ -#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon { - width: 15px; - height: 20px; - margin-left: 0; - padding: 6px 0 5px; -} - -#wpadminbar #wp-admin-bar-wp-logo > .ab-item { - padding: 0 7px; -} - -#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before { - content: "\f120"; - top: 2px; -} - -/* - * My Sites & Site Title - */ -#wpadminbar .quicklinks li .blavatar { - float: right; - font: normal 16px/1 dashicons !important; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color: #eee; -} - -#wpadminbar .quicklinks li a:hover .blavatar, -#wpadminbar .quicklinks li a:focus .blavatar, -#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar { - color: #00b9eb; -} - -#wpadminbar .quicklinks li .blavatar:before { - content: "\f120"; - height: 16px; - width: 16px; - display: inline-block; - margin: 6px -2px 0 8px; -} - -#wpadminbar #wp-admin-bar-appearance { - margin-top: -12px; -} - -#wpadminbar #wp-admin-bar-my-sites > .ab-item:before, -#wpadminbar #wp-admin-bar-site-name > .ab-item:before { - content: "\f541"; - top: 2px; -} - -#wpadminbar #wp-admin-bar-customize > .ab-item:before { - content: "\f540"; - top: 2px; -} - - -#wpadminbar #wp-admin-bar-edit > .ab-item:before { - content: "\f464"; - top: 2px; -} - -#wpadminbar #wp-admin-bar-site-name > .ab-item:before { - content: "\f226"; -} - -.wp-admin #wpadminbar #wp-admin-bar-site-name > .ab-item:before { - content: "\f102"; -} - - - -/** - * Comments - */ -#wpadminbar #wp-admin-bar-comments .ab-icon { - margin-left: 6px; -} - -#wpadminbar #wp-admin-bar-comments .ab-icon:before { - content: "\f101"; - top: 3px; -} - -#wpadminbar #wp-admin-bar-comments .count-0 { - opacity: .5; -} - -/** - * New Content - */ -#wpadminbar #wp-admin-bar-new-content .ab-icon:before { - content: "\f132"; - top: 4px; -} - -/** - * Updates - */ -#wpadminbar #wp-admin-bar-updates .ab-icon:before { - content: "\f463"; - top: 2px; -} - -/** - * Search - */ -#wpadminbar.ie8 #wp-admin-bar-search { - display: block; - min-width: 32px; -} -#wpadminbar #wp-admin-bar-search .ab-item { - padding: 0; - background: transparent; -} - -#wpadminbar #adminbarsearch { - position: relative; - height: 32px; - padding: 0 2px; - z-index: 1; -} - -#wpadminbar #adminbarsearch:before { - position: absolute; - top: 6px; - right: 5px; - z-index: 20; - font: normal 20px/1 dashicons !important; - content: "\f179"; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input { - position: relative; - z-index: 30; - font-size: 13px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - line-height: 24px; - height: 24px; - width: 24px; - max-width: none; - padding: 0 24px 0 3px; - margin: 0; - color: #ccc; - background-color: rgba( 255, 255, 255, 0 ); - border: none; - outline: none; - cursor: pointer; - -webkit-box-shadow: none; - box-shadow: none; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition-duration: 400ms; - transition-duration: 400ms; - -webkit-transition-property: width, background; - transition-property: width, background; - -webkit-transition-timing-function: ease; - transition-timing-function: ease; -} - -#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { - z-index: 10; - color: #000; - width: 200px; - background-color: rgba( 255, 255, 255, 0.9 ); - cursor: text; - border: 0; -} - -#wpadminbar.ie7 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input { - margin-top: 3px; - width: 120px; -} - -#wpadminbar.ie8 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input { - /* IE8 z-index bug with transparent / empty elements - fill in with an encoded transparent GIF */ - background: transparent 100% 0 repeat scroll url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBR‌​AA7"); -} - -/* IE8 doesn't redraw the pseudo elements unless you make a change to the content */ -#wpadminbar.ie8 #adminbarsearch.adminbar-focused:before { - content: "\f179 "; /* extra space */ -} - -#wpadminbar.ie8 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { - background: #fff; - z-index: -1; -} - -#wpadminbar #adminbarsearch .adminbar-button { - display: none; -} - -/** - * Customize support classes - */ -.no-customize-support .hide-if-no-customize, -.customize-support .hide-if-customize, -.no-customize-support #wpadminbar .hide-if-no-customize, -.no-customize-support.wp-core-ui .hide-if-no-customize, -.no-customize-support .wp-core-ui .hide-if-no-customize, -.customize-support #wpadminbar .hide-if-customize, -.customize-support.wp-core-ui .hide-if-customize, -.customize-support .wp-core-ui .hide-if-customize { - display: none; -} - -/* Skip link */ -#wpadminbar .screen-reader-text, -#wpadminbar .screen-reader-text span { - position: absolute; - right: -1000em; - top: -1000em; - height: 1px; - width: 1px; - overflow: hidden; -} - -#wpadminbar .screen-reader-shortcut { - position: absolute; - top: -1000em; -} - -#wpadminbar .screen-reader-shortcut:focus { - right: 6px; - top: 7px; - height: auto; - width: auto; - display: block; - font-size: 14px; - font-weight: 600; - padding: 15px 23px 14px; - background: #f1f1f1; - color: #0073aa; - z-index: 100000; - line-height: normal; - text-decoration: none; - -webkit-box-shadow: 0 0 2px 2px rgba(0,0,0,.6); - box-shadow: 0 0 2px 2px rgba(0,0,0,.6); -} - -/** - * IE 6-targeted rules - */ -* html #wpadminbar { - overflow: hidden; - position: absolute; -} - -* html #wpadminbar .quicklinks ul li a { - float: right; -} - -* html #wpadminbar .menupop a span { - background-image: none; -} - -/* No @font-face support */ -.no-font-face #wpadminbar ul.ab-top-menu > li > a.ab-item { - display: block; - width: 45px; - text-align: center; - overflow: hidden; - margin: 0 3px; -} - -.no-font-face #wpadminbar #wp-admin-bar-my-sites > .ab-item, -.no-font-face #wpadminbar #wp-admin-bar-site-name > .ab-item, -.no-font-face #wpadminbar #wp-admin-bar-edit > .ab-item { - text-indent: 0; -} - -.no-font-face #wpadminbar .ab-icon, -.no-font-face #wpadminbar .ab-icon:before, -.no-font-face #wpadminbar a.ab-item:before, -.no-font-face #wpadminbar #wp-admin-bar-wp-logo > .ab-item { - display: none !important; -} - -.no-font-face #wpadminbar ul.ab-top-menu > li > a > span.ab-label { - display: inline; -} - -.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon { - display: inline !important; -} - -.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon:before { - content: "Menu"; - font: 14px/45px sans-serif !important; - display: inline-block !important; - color: #fff; -} - -.no-font-face #wpadminbar #wp-admin-bar-site-name a.ab-item { - color: #fff; -} -/* End no @font-face */ - -@media screen and ( max-width: 782px ) { - /* Toolbar Touchification*/ - html #wpadminbar { - height: 46px; - min-width: 300px; - - /* These rules break dropdown tappability on Chrome/Android. - -webkit-transform: translate3d(0, 0, 0); - -webkit-backface-visibility: hidden; - -webkit-transition: 0; - transform: translate3d(0, 0, 0); - backface-visibility: hidden; - transition: 0; - */ - } - - #wpadminbar * { - font-size: 14px; - font-weight: 400; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - line-height: 32px; - } - - #wpadminbar .quicklinks > ul > li > a, - #wpadminbar .quicklinks .ab-empty-item { - padding: 0; - height: 46px; - line-height: 46px; - width: auto; - } - - #wpadminbar .ab-icon { - font: 40px/1 dashicons !important; - margin: 0; - padding: 0; - width: 52px; - height: 46px; - text-align: center; - } - - #wpadminbar .ab-icon:before { - text-align: center; - } - - #wpadminbar .ab-submenu { - padding: 0; - } - - #wpadminbar #wp-admin-bar-site-name a.ab-item, - #wpadminbar #wp-admin-bar-my-sites a.ab-item, - #wpadminbar #wp-admin-bar-my-account a.ab-item { - text-overflow: clip; - } - - #wpadminbar .ab-label { - display: none; - } - - #wpadminbar .menupop li:hover > .ab-sub-wrapper, - #wpadminbar .menupop li.hover > .ab-sub-wrapper { - margin-top: -46px; - } - - #wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop > .ab-item { - padding-left: 30px; - } - - #wpadminbar .menupop .menupop > .ab-item:before { - top: 10px; - left: 6px; - } - - #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper .ab-item { - font-size: 16px; - padding: 8px 16px; - } - - #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper a:empty { - display: none; - } - - /* WP logo */ - #wpadminbar #wp-admin-bar-wp-logo > .ab-item { - padding: 0; - } - - #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon { - padding: 0; - width: 52px; - height: 46px; - text-align: center; - vertical-align: top; - } - - #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before { - font: 28px/1 dashicons !important; - top: -3px; - } - - #wpadminbar .ab-icon, - #wpadminbar .ab-item:before { - padding: 0; - } - - /* My Sites and "Site Title" menu */ - #wpadminbar #wp-admin-bar-my-sites > .ab-item, - #wpadminbar #wp-admin-bar-site-name > .ab-item, - #wpadminbar #wp-admin-bar-customize > .ab-item, - #wpadminbar #wp-admin-bar-edit > .ab-item, - #wpadminbar #wp-admin-bar-my-account > .ab-item { - text-indent: 100%; - white-space: nowrap; - overflow: hidden; - width: 52px; - padding: 0; - color: #a0a5aa; /* @todo not needed? this text is hidden */ - position: relative; - } - - #wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon, - #wpadminbar .ab-icon, - #wpadminbar .ab-item:before { - padding: 0; - margin-left: 0; - } - - #wpadminbar #wp-admin-bar-edit > .ab-item:before, - #wpadminbar #wp-admin-bar-my-sites > .ab-item:before, - #wpadminbar #wp-admin-bar-site-name > .ab-item:before, - #wpadminbar #wp-admin-bar-customize > .ab-item:before, - #wpadminbar #wp-admin-bar-my-account > .ab-item:before { - display: block; - text-indent: 0; - font: normal 32px/1 dashicons; - speak: none; - top: 7px; - width: 52px; - text-align: center; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - } - - #wpadminbar #wp-admin-bar-appearance { - margin-top: 0; - } - - #wpadminbar .quicklinks li .blavatar:before { - display: none; - } - - /* Search */ - #wpadminbar #wp-admin-bar-search { - display: none; - } - - /* New Content */ - #wpadminbar #wp-admin-bar-new-content .ab-icon:before { - top: 0; - line-height: 53px; - height: 46px !important; - text-align: center; - width: 52px; - display: block; - } - - /* Updates */ - #wpadminbar #wp-admin-bar-updates { - text-align: center; - } - - #wpadminbar #wp-admin-bar-updates .ab-icon:before { - top: 3px; - } - - /* Comments */ - #wpadminbar #wp-admin-bar-comments .ab-icon { - margin: 0; - } - - #wpadminbar #wp-admin-bar-comments .ab-icon:before { - display: block; - font-size: 34px; - height: 46px; - line-height: 47px; - top: 0; - } - - /* My Account */ - #wpadminbar #wp-admin-bar-my-account > a { - position: relative; - white-space: nowrap; - text-indent: 150%; /* More than 100% indention is needed since this element has padding */ - width: 28px; - padding: 0 10px; - overflow: hidden; /* Prevent link text from forcing horizontal scrolling on mobile */ - } - - #wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { - position: absolute; - top: 13px; - left: 10px; - width: 26px; - height: 26px; - } - - #wpadminbar #wp-admin-bar-user-actions.ab-submenu { - padding: 0; - } - - #wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar { - display: none; - } - - #wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li { - margin: 0; - } - - #wpadminbar #wp-admin-bar-user-info .display-name { - height: auto; - font-size: 16px; - line-height: 24px; - color: #eee; - } - - #wpadminbar #wp-admin-bar-user-info a { - padding-top: 4px; - } - - #wpadminbar #wp-admin-bar-user-info .username { - line-height: 0.8 !important; - margin-bottom: -2px; - } - - /* Show only default top level items */ - #wp-toolbar > ul > li { - display: none; - } - - #wpadminbar li#wp-admin-bar-menu-toggle, - #wpadminbar li#wp-admin-bar-wp-logo, - #wpadminbar li#wp-admin-bar-my-sites, - #wpadminbar li#wp-admin-bar-updates, - #wpadminbar li#wp-admin-bar-site-name, - #wpadminbar li#wp-admin-bar-customize, - #wpadminbar li#wp-admin-bar-new-content, - #wpadminbar li#wp-admin-bar-edit, - #wpadminbar li#wp-admin-bar-comments, - #wpadminbar li#wp-admin-bar-my-account { - display: block; - } - - /* Allow dropdown list items to appear normally */ - #wpadminbar li:hover ul li, - #wpadminbar li.hover ul li, - #wpadminbar li:hover ul li:hover ul li { - display: list-item; - } - - /* Override default min-width so dropdown lists aren't stretched - to 100% viewport width at responsive sizes. */ - #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { - min-width: -webkit-fit-content; - min-width: -moz-fit-content; - min-width: fit-content; - } - - #wpadminbar ul#wp-admin-bar-root-default > li { - margin-left: 0; - } - - /* Experimental fix for touch toolbar dropdown positioning */ - #wpadminbar .ab-top-menu, - #wpadminbar .ab-top-secondary, - #wpadminbar #wp-admin-bar-wp-logo, - #wpadminbar #wp-admin-bar-my-sites, - #wpadminbar #wp-admin-bar-site-name, - #wpadminbar #wp-admin-bar-updates, - #wpadminbar #wp-admin-bar-comments, - #wpadminbar #wp-admin-bar-new-content, - #wpadminbar #wp-admin-bar-edit, - #wpadminbar #wp-admin-bar-my-account { - position: static; - } - - #wpadminbar #wp-admin-bar-my-account { - float: left; - } - - .network-admin #wpadminbar ul#wp-admin-bar-top-secondary > li#wp-admin-bar-my-account { - margin-left: 0; - } - - /* Realign arrows on taller responsive submenus */ - - #wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before { - top: 10px; - right: 0; - } -} - -/* Smartphone */ -@media screen and (max-width: 600px) { - #wpadminbar { - position: absolute; - } - - #wp-responsive-overlay { - position: fixed; - top: 0; - right: 0; - width: 100%; - height: 100%; - z-index: 400; - } - - #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { - width: 100%; - right: 0; - } - - #wpadminbar .menupop .menupop > .ab-item:before { - display: none; - } - - #wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper { - margin-right: 0; - } - - #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper { - margin: 0; - width: 100%; - top: auto; - right: auto; - position: relative; - } - - #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper .ab-item { - font-size: 16px; - padding: 6px 30px 19px 15px; - } - - #wpadminbar li:hover ul li ul li { - display: list-item; - } - - #wpadminbar li#wp-admin-bar-wp-logo, - #wpadminbar li#wp-admin-bar-updates { - display: none; - } - - /* Make submenus full-width at this size */ - - #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper { - position: static; - -webkit-box-shadow: none; - box-shadow: none; - } -} - -/* Very narrow screens */ -@media screen and (max-width: 400px) { - #wpadminbar li#wp-admin-bar-comments { - display: none; - } -} diff --git a/wp/wp-includes/css/admin-bar-rtl.min.css b/wp/wp-includes/css/admin-bar-rtl.min.css deleted file mode 100644 index 985002f5..00000000 --- a/wp/wp-includes/css/admin-bar-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -#wpadminbar,#wpadminbar *{font-size:13px;font-weight:400;line-height:32px}#wpadminbar *{height:auto;width:auto;margin:0;padding:0;position:static;text-shadow:none;text-transform:none;letter-spacing:normal;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;-webkit-border-radius:0;border-radius:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-transition:none;transition:none;-webkit-font-smoothing:subpixel-antialiased;-moz-osx-font-smoothing:auto}.rtl #wpadminbar *{font-family:Tahoma,sans-serif}html:lang(he-il) .rtl #wpadminbar *{font-family:Arial,sans-serif}#wpadminbar .ab-empty-item{cursor:default;outline:0}#wpadminbar .ab-empty-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#eee}#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#wpadminbar ul li:after,#wpadminbar ul li:before{content:normal}#wpadminbar a,#wpadminbar a img,#wpadminbar a img:hover,#wpadminbar a:hover{outline:0;border:none;text-decoration:none;background:0 0}#wpadminbar a:active,#wpadminbar a:focus,#wpadminbar div,#wpadminbar input[type=text],#wpadminbar input[type=password],#wpadminbar input[type=number],#wpadminbar input[type=search],#wpadminbar input[type=email],#wpadminbar input[type=url],#wpadminbar select,#wpadminbar textarea{-webkit-box-shadow:none;box-shadow:none;outline:0}#wpadminbar{direction:rtl;color:#ccc;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;height:32px;position:fixed;top:0;right:0;width:100%;min-width:600px;z-index:99999;background:#23282d}#wpadminbar .ab-sub-wrapper,#wpadminbar ul,#wpadminbar ul li{background:0 0;clear:none;list-style:none;margin:0;padding:0;position:relative;text-indent:0;z-index:99999}#wpadminbar ul#wp-admin-bar-root-default>li{margin-left:0}#wpadminbar .quicklinks ul{text-align:right}#wpadminbar li{float:right}#wpadminbar .quicklinks .ab-top-secondary>li{float:left}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks a,#wpadminbar .shortlink-input{height:32px;display:block;padding:0 10px;margin:0}#wpadminbar .quicklinks>ul>li>a{padding:0 7px 0 8px}#wpadminbar .menupop .ab-sub-wrapper,#wpadminbar .shortlink-input{margin:0;padding:0;-webkit-box-shadow:0 3px 5px rgba(0,0,0,.2);box-shadow:0 3px 5px rgba(0,0,0,.2);background:#32373c;display:none;position:absolute;float:none}#wpadminbar .selected .shortlink-input,#wpadminbar li.hover>.ab-sub-wrapper,#wpadminbar.nojs li:hover>.ab-sub-wrapper{display:block}#wpadminbar.ie7 .menupop .ab-sub-wrapper,#wpadminbar.ie7 .shortlink-input{top:32px;right:0}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:100%}#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper{left:0;right:auto}#wpadminbar .ab-submenu{padding:6px 0}#wpadminbar .quicklinks .menupop ul li{float:none}#wpadminbar .quicklinks .menupop ul li a strong{font-weight:600}#wpadminbar .quicklinks .menupop ul li .ab-item,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li .ab-item,#wpadminbar .shortlink-input,#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item{line-height:26px;height:26px;white-space:nowrap;min-width:140px}#wpadminbar .shortlink-input{width:200px}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-right:100%;margin-top:-32px}#wpadminbar .ab-top-secondary .menupop li.hover>.ab-sub-wrapper,#wpadminbar .ab-top-secondary .menupop li:hover>.ab-sub-wrapper{margin-right:0;right:inherit;left:100%}#wpadminbar .ab-top-menu>li.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{background:#32373c;color:#00b9eb}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label,#wpadminbar>#wp-toolbar li.hover span.ab-label{color:#00b9eb}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon{position:relative;float:right;font:400 20px/1 dashicons;speak:none;padding:4px 0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-image:none!important;margin-left:6px}#wpadminbar #adminbarsearch:before,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:before{color:#a0a5aa;color:rgba(240,245,250,.6);position:relative;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}#wpadminbar .ab-label{display:inline-block;height:32px}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#b4b9be;color:rgba(240,245,250,.7)}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#00b9eb}#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#b4b9be}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#00b9eb}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before,#wpadminbar .menupop .menupop>.ab-item:before{position:absolute;font:400 17px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar .menupop .menupop>.ab-item{display:block;padding-left:2em}#wpadminbar .menupop .menupop>.ab-item:before{top:1px;left:4px;content:"\f141";color:inherit}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item{padding-right:2em;padding-left:1em}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before{top:1px;right:6px;content:"\f139"}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary{display:block;position:relative;left:auto;margin:0;-webkit-box-shadow:none;box-shadow:none}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#464b50}#wpadminbar .quicklinks .menupop .ab-sub-secondary>li .ab-item:focus a,#wpadminbar .quicklinks .menupop .ab-sub-secondary>li>a:hover{color:#00b9eb}#wpadminbar .quicklinks a span#ab-updates{background:#eee;color:#32373c;display:inline;padding:2px 5px;font-size:10px;font-weight:600;-webkit-border-radius:10px;border-radius:10px}#wpadminbar .quicklinks a:hover span#ab-updates{background:#fff;color:#000}#wpadminbar .ab-top-secondary{float:left}#wpadminbar ul li:last-child,#wpadminbar ul li:last-child .ab-item{-webkit-box-shadow:none;box-shadow:none}#wp-admin-bar-my-account>ul{min-width:198px}#wp-admin-bar-my-account>.ab-item:before{content:"\f110";top:2px;float:left;margin-right:6px;margin-left:0}#wp-admin-bar-my-account.with-avatar>.ab-item:before{display:none;content:none}#wp-admin-bar-my-account.with-avatar>ul{min-width:270px}#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar .ab-item{white-space:nowrap}#wpadminbar #wp-admin-bar-user-actions>li{margin-right:16px;margin-left:16px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:6px 0 12px}#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin-right:88px}#wpadminbar #wp-admin-bar-user-info{margin-top:6px;margin-bottom:15px;height:auto;background:0 0}#wp-admin-bar-user-info .avatar{position:absolute;right:-72px;top:4px;width:64px;height:64px}#wpadminbar #wp-admin-bar-user-info a{background:0 0;height:auto}#wpadminbar #wp-admin-bar-user-info span{background:0 0;padding:0;height:18px}#wpadminbar #wp-admin-bar-user-info .display-name,#wpadminbar #wp-admin-bar-user-info .username{display:block}#wpadminbar #wp-admin-bar-user-info .username{color:#a0a5aa;font-size:11px}#wpadminbar #wp-admin-bar-my-account.with-avatar>.ab-empty-item img,#wpadminbar #wp-admin-bar-my-account.with-avatar>a img{width:auto;height:16px;padding:0;border:1px solid #82878c;background:#eee;line-height:24px;vertical-align:middle;margin:-4px 6px 0 0;float:none;display:inline}#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar>.ab-empty-item img,#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar>a img{width:auto}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{width:15px;height:20px;margin-left:0;padding:6px 0 5px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0 7px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{content:"\f120";top:2px}#wpadminbar .quicklinks li .blavatar{float:right;font:400 16px/1 dashicons!important;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#eee}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar{color:#00b9eb}#wpadminbar .quicklinks li .blavatar:before{content:"\f120";height:16px;width:16px;display:inline-block;margin:6px -2px 0 8px}#wpadminbar #wp-admin-bar-appearance{margin-top:-12px}#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f541";top:2px}#wpadminbar #wp-admin-bar-customize>.ab-item:before{content:"\f540";top:2px}#wpadminbar #wp-admin-bar-edit>.ab-item:before{content:"\f464";top:2px}#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f226"}.wp-admin #wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f102"}#wpadminbar #wp-admin-bar-comments .ab-icon{margin-left:6px}#wpadminbar #wp-admin-bar-comments .ab-icon:before{content:"\f101";top:3px}#wpadminbar #wp-admin-bar-comments .count-0{opacity:.5}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{content:"\f132";top:4px}#wpadminbar #wp-admin-bar-updates .ab-icon:before{content:"\f463";top:2px}#wpadminbar.ie8 #wp-admin-bar-search{display:block;min-width:32px}#wpadminbar #wp-admin-bar-search .ab-item{padding:0;background:0 0}#wpadminbar #adminbarsearch{position:relative;height:32px;padding:0 2px;z-index:1}#wpadminbar #adminbarsearch:before{position:absolute;top:6px;right:5px;z-index:20;font:400 20px/1 dashicons!important;content:"\f179";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{position:relative;z-index:30;font-size:13px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:24px;height:24px;width:24px;max-width:none;padding:0 24px 0 3px;margin:0;color:#ccc;background-color:rgba(255,255,255,0);border:none;outline:0;cursor:pointer;-webkit-box-shadow:none;box-shadow:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-property:width,background;transition-property:width,background;-webkit-transition-timing-function:ease;transition-timing-function:ease}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{z-index:10;color:#000;width:200px;background-color:rgba(255,255,255,.9);cursor:text;border:0}#wpadminbar.ie7>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{margin-top:3px;width:120px}#wpadminbar.ie8>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBR‌​AA7) 100% 0}#wpadminbar.ie8 #adminbarsearch.adminbar-focused:before{content:"\f179 "}#wpadminbar.ie8>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{background:#fff;z-index:-1}#wpadminbar #adminbarsearch .adminbar-button,.customize-support #wpadminbar .hide-if-customize,.customize-support .hide-if-customize,.customize-support .wp-core-ui .hide-if-customize,.customize-support.wp-core-ui .hide-if-customize,.no-customize-support #wpadminbar .hide-if-no-customize,.no-customize-support .hide-if-no-customize,.no-customize-support .wp-core-ui .hide-if-no-customize,.no-customize-support.wp-core-ui .hide-if-no-customize{display:none}#wpadminbar .screen-reader-text,#wpadminbar .screen-reader-text span{position:absolute;right:-1000em;top:-1000em;height:1px;width:1px;overflow:hidden}#wpadminbar .screen-reader-shortcut{position:absolute;top:-1000em}#wpadminbar .screen-reader-shortcut:focus{right:6px;top:7px;height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f1f1f1;color:#0073aa;z-index:100000;line-height:normal;text-decoration:none;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.6);box-shadow:0 0 2px 2px rgba(0,0,0,.6)}* html #wpadminbar{overflow:hidden;position:absolute}* html #wpadminbar .quicklinks ul li a{float:right}* html #wpadminbar .menupop a span{background-image:none}.no-font-face #wpadminbar ul.ab-top-menu>li>a.ab-item{display:block;width:45px;text-align:center;overflow:hidden;margin:0 3px}.no-font-face #wpadminbar #wp-admin-bar-edit>.ab-item,.no-font-face #wpadminbar #wp-admin-bar-my-sites>.ab-item,.no-font-face #wpadminbar #wp-admin-bar-site-name>.ab-item{text-indent:0}.no-font-face #wpadminbar #wp-admin-bar-wp-logo>.ab-item,.no-font-face #wpadminbar .ab-icon,.no-font-face #wpadminbar .ab-icon:before,.no-font-face #wpadminbar a.ab-item:before{display:none!important}.no-font-face #wpadminbar ul.ab-top-menu>li>a>span.ab-label{display:inline}.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon{display:inline!important}.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon:before{content:"Menu";font:14px/45px sans-serif!important;display:inline-block!important;color:#fff}.no-font-face #wpadminbar #wp-admin-bar-site-name a.ab-item{color:#fff}@media screen and (max-width:782px){#wpadminbar ul#wp-admin-bar-root-default>li,.network-admin #wpadminbar ul#wp-admin-bar-top-secondary>li#wp-admin-bar-my-account{margin-left:0}html #wpadminbar{height:46px;min-width:300px}#wpadminbar *{font-size:14px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:32px}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks>ul>li>a{padding:0;height:46px;line-height:46px;width:auto}#wpadminbar .ab-icon{font:40px/1 dashicons!important;margin:0;padding:0;width:52px;height:46px;text-align:center}#wpadminbar .ab-icon:before{text-align:center}#wpadminbar .ab-submenu{padding:0}#wpadminbar #wp-admin-bar-my-account a.ab-item,#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{text-overflow:clip}#wpadminbar .ab-label{display:none}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-top:-46px}#wpadminbar #wp-admin-bar-comments .ab-icon,#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin:0}#wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop>.ab-item{padding-left:30px}#wpadminbar .menupop .menupop>.ab-item:before{top:10px;left:6px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper .ab-item{font-size:16px;padding:8px 16px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper a:empty{display:none}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{padding:0;width:52px;height:46px;text-align:center;vertical-align:top}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{font:28px/1 dashicons!important;top:-3px}#wpadminbar .ab-icon,#wpadminbar .ab-item:before{padding:0}#wpadminbar #wp-admin-bar-customize>.ab-item,#wpadminbar #wp-admin-bar-edit>.ab-item,#wpadminbar #wp-admin-bar-my-account>.ab-item,#wpadminbar #wp-admin-bar-my-sites>.ab-item,#wpadminbar #wp-admin-bar-site-name>.ab-item{text-indent:100%;white-space:nowrap;overflow:hidden;width:52px;padding:0;color:#a0a5aa;position:relative}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon{padding:0;margin-left:0}#wpadminbar #wp-admin-bar-customize>.ab-item:before,#wpadminbar #wp-admin-bar-edit>.ab-item:before,#wpadminbar #wp-admin-bar-my-account>.ab-item:before,#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{display:block;text-indent:0;font:400 32px/1 dashicons;speak:none;top:7px;width:52px;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar #wp-admin-bar-appearance{margin-top:0}#wpadminbar .quicklinks li .blavatar:before{display:none}#wpadminbar #wp-admin-bar-search{display:none}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{top:0;line-height:53px;height:46px!important;text-align:center;width:52px;display:block}#wpadminbar #wp-admin-bar-updates{text-align:center}#wpadminbar #wp-admin-bar-updates .ab-icon:before{top:3px}#wpadminbar #wp-admin-bar-comments .ab-icon:before{display:block;font-size:34px;height:46px;line-height:47px;top:0}#wp-toolbar>ul>li,#wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar{display:none}#wpadminbar #wp-admin-bar-my-account>a{position:relative;white-space:nowrap;text-indent:150%;width:28px;padding:0 10px;overflow:hidden}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{position:absolute;top:13px;left:10px;width:26px;height:26px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:0}#wpadminbar #wp-admin-bar-user-info .display-name{height:auto;font-size:16px;line-height:24px;color:#eee}#wpadminbar #wp-admin-bar-user-info a{padding-top:4px}#wpadminbar #wp-admin-bar-user-info .username{line-height:.8!important;margin-bottom:-2px}#wpadminbar li#wp-admin-bar-comments,#wpadminbar li#wp-admin-bar-customize,#wpadminbar li#wp-admin-bar-edit,#wpadminbar li#wp-admin-bar-menu-toggle,#wpadminbar li#wp-admin-bar-my-account,#wpadminbar li#wp-admin-bar-my-sites,#wpadminbar li#wp-admin-bar-new-content,#wpadminbar li#wp-admin-bar-site-name,#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:block}#wpadminbar li.hover ul li,#wpadminbar li:hover ul li,#wpadminbar li:hover ul li:hover ul li{display:list-item}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content}#wpadminbar #wp-admin-bar-comments,#wpadminbar #wp-admin-bar-edit,#wpadminbar #wp-admin-bar-my-account,#wpadminbar #wp-admin-bar-my-sites,#wpadminbar #wp-admin-bar-new-content,#wpadminbar #wp-admin-bar-site-name,#wpadminbar #wp-admin-bar-updates,#wpadminbar #wp-admin-bar-wp-logo,#wpadminbar .ab-top-menu,#wpadminbar .ab-top-secondary{position:static}#wpadminbar #wp-admin-bar-my-account{float:left}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before{top:10px;right:0}}@media screen and (max-width:600px){#wpadminbar{position:absolute}#wp-responsive-overlay{position:fixed;top:0;right:0;width:100%;height:100%;z-index:400}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{width:100%;right:0}#wpadminbar .menupop .menupop>.ab-item:before{display:none}#wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper{margin-right:0}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper{margin:0;width:100%;top:auto;right:auto;position:static;-webkit-box-shadow:none;box-shadow:none}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper .ab-item{font-size:16px;padding:6px 30px 19px 15px}#wpadminbar li:hover ul li ul li{display:list-item}#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:none}}@media screen and (max-width:400px){#wpadminbar li#wp-admin-bar-comments{display:none}} \ No newline at end of file diff --git a/wp/wp-includes/css/admin-bar.css b/wp/wp-includes/css/admin-bar.css deleted file mode 100644 index e108a8e6..00000000 --- a/wp/wp-includes/css/admin-bar.css +++ /dev/null @@ -1,1159 +0,0 @@ -#wpadminbar * { - height: auto; - width: auto; - margin: 0; - padding: 0; - position: static; - text-shadow: none; - text-transform: none; - letter-spacing: normal; - font-size: 13px; - font-weight: 400; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - line-height: 32px; - -webkit-border-radius: 0; - border-radius: 0; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-transition: none; - transition: none; - -webkit-font-smoothing: subpixel-antialiased; /* Prevent Safari from switching to standard antialiasing on hover */ - -moz-osx-font-smoothing: auto; /* Prevent Firefox from inheriting from themes that use other values */ -} - -.rtl #wpadminbar * { - font-family: Tahoma, sans-serif; -} - -html:lang(he-il) .rtl #wpadminbar * { - font-family: Arial, sans-serif; -} - -#wpadminbar .ab-empty-item { - cursor: default; -} - -#wpadminbar .ab-empty-item, -#wpadminbar a.ab-item, -#wpadminbar > #wp-toolbar span.ab-label, -#wpadminbar > #wp-toolbar span.noticon { - color: #eee; -} - -#wpadminbar #wp-admin-bar-site-name a.ab-item, -#wpadminbar #wp-admin-bar-my-sites a.ab-item { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -#wpadminbar ul li:before, -#wpadminbar ul li:after { - content: normal; -} - -#wpadminbar a, -#wpadminbar a:hover, -#wpadminbar a img, -#wpadminbar a img:hover { - outline: none; - border: none; - text-decoration: none; - background: none; -} - -#wpadminbar a:focus, -#wpadminbar a:active, -#wpadminbar input[type="text"], -#wpadminbar input[type="password"], -#wpadminbar input[type="number"], -#wpadminbar input[type="search"], -#wpadminbar input[type="email"], -#wpadminbar input[type="url"], -#wpadminbar select, -#wpadminbar textarea, -#wpadminbar div { - -webkit-box-shadow: none; - box-shadow: none; - outline: none; -} - -#wpadminbar { - direction: ltr; - color: #ccc; - font-size: 13px; - font-weight: 400; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - line-height: 32px; - height: 32px; - position: fixed; - top: 0; - left: 0; - width: 100%; - min-width: 600px; /* match the min-width of the body in wp-admin.css */ - z-index: 99999; - background: #23282d; -} - -#wpadminbar .ab-sub-wrapper, -#wpadminbar ul, -#wpadminbar ul li { - background: none; - clear: none; - list-style: none; - margin: 0; - padding: 0; - position: relative; - text-indent: 0; - z-index: 99999; -} - -#wpadminbar ul#wp-admin-bar-root-default>li { - margin-right: 0; -} - -#wpadminbar .quicklinks ul { - text-align: left; -} - -#wpadminbar li { - float: left; -} - -#wpadminbar .ab-empty-item { - outline: none; -} - -#wpadminbar .quicklinks .ab-top-secondary > li { - float: right; -} - -#wpadminbar .quicklinks a, -#wpadminbar .quicklinks .ab-empty-item, -#wpadminbar .shortlink-input { - height: 32px; - display: block; - padding: 0 10px; - margin: 0; -} - -#wpadminbar .quicklinks > ul > li > a { - padding: 0 8px 0 7px; -} - -#wpadminbar .menupop .ab-sub-wrapper, -#wpadminbar .shortlink-input { - margin: 0; - padding: 0; - -webkit-box-shadow: 0 3px 5px rgba(0,0,0,0.2); - box-shadow: 0 3px 5px rgba(0,0,0,0.2); - background: #32373c; - display: none; - position: absolute; - float: none; -} - -#wpadminbar.ie7 .menupop .ab-sub-wrapper, -#wpadminbar.ie7 .shortlink-input { - top: 32px; - left: 0; -} - -#wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { - min-width: 100%; -} - -#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper { - right: 0; - left: auto; -} - -#wpadminbar .ab-submenu { - padding: 6px 0; -} - -#wpadminbar .selected .shortlink-input { - display: block; -} - -#wpadminbar .quicklinks .menupop ul li { - float: none; -} - -#wpadminbar .quicklinks .menupop ul li a strong { - font-weight: 600; -} - -#wpadminbar .quicklinks .menupop ul li .ab-item, -#wpadminbar .quicklinks .menupop ul li a strong, -#wpadminbar .quicklinks .menupop.hover ul li .ab-item, -#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item, -#wpadminbar .shortlink-input { - line-height: 26px; - height: 26px; - white-space: nowrap; - min-width: 140px; -} - -#wpadminbar .shortlink-input { - width: 200px; -} - -#wpadminbar.nojs li:hover > .ab-sub-wrapper, -#wpadminbar li.hover > .ab-sub-wrapper { - display: block; -} - -#wpadminbar .menupop li:hover > .ab-sub-wrapper, -#wpadminbar .menupop li.hover > .ab-sub-wrapper { - margin-left: 100%; - margin-top: -32px; -} - -#wpadminbar .ab-top-secondary .menupop li:hover > .ab-sub-wrapper, -#wpadminbar .ab-top-secondary .menupop li.hover > .ab-sub-wrapper { - margin-left: 0; - left: inherit; - right: 100%; -} - -#wpadminbar:not(.mobile) .ab-top-menu > li > .ab-item:focus, -#wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, -#wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, -#wpadminbar .ab-top-menu > li.hover > .ab-item { - background: #32373c; - color: #00b9eb; -} - -#wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, -#wpadminbar > #wp-toolbar li.hover span.ab-label, -#wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { - color: #00b9eb; -} - -#wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon, -#wpadminbar .ab-icon, -#wpadminbar .ab-item:before { - position: relative; - float: left; - font: normal 20px/1 dashicons; - speak: none; - padding: 4px 0; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - background-image: none !important; - margin-right: 6px; -} - -#wpadminbar .ab-icon:before, -#wpadminbar .ab-item:before, -#wpadminbar #adminbarsearch:before { - color: #a0a5aa; - color: rgba(240,245,250,0.6); -} - -#wpadminbar .ab-icon:before, -#wpadminbar .ab-item:before, -#wpadminbar #adminbarsearch:before { - position: relative; - -webkit-transition: all .1s ease-in-out; - transition: all .1s ease-in-out; -} - -#wpadminbar .ab-label { - display: inline-block; - height: 32px; -} - -#wpadminbar .ab-submenu .ab-item { - color: #b4b9be; - color: rgba(240,245,250,0.7); -} - -#wpadminbar .quicklinks .menupop ul li a, -#wpadminbar .quicklinks .menupop ul li a strong, -#wpadminbar .quicklinks .menupop.hover ul li a, -#wpadminbar.nojs .quicklinks .menupop:hover ul li a { - color: #b4b9be; - color: rgba(240,245,250,0.7); -} - -#wpadminbar .quicklinks .menupop ul li a:hover, -#wpadminbar .quicklinks .menupop ul li a:focus, -#wpadminbar .quicklinks .menupop ul li a:hover strong, -#wpadminbar .quicklinks .menupop ul li a:focus strong, -#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a, -#wpadminbar .quicklinks .menupop.hover ul li a:hover, -#wpadminbar .quicklinks .menupop.hover ul li a:focus, -#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover, -#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus, -#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover, -#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus, -#wpadminbar li:hover .ab-icon:before, -#wpadminbar li:hover .ab-item:before, -#wpadminbar li a:focus .ab-icon:before, -#wpadminbar li .ab-item:focus:before, -#wpadminbar li .ab-item:focus .ab-icon:before, -#wpadminbar li.hover .ab-icon:before, -#wpadminbar li.hover .ab-item:before, -#wpadminbar li:hover #adminbarsearch:before, -#wpadminbar li #adminbarsearch.adminbar-focused:before { - color: #00b9eb; -} - -#wpadminbar.mobile .quicklinks .ab-icon:before, -#wpadminbar.mobile .quicklinks .ab-item:before { - color: #b4b9be; -} - -#wpadminbar.mobile .quicklinks .hover .ab-icon:before, -#wpadminbar.mobile .quicklinks .hover .ab-item:before { - color: #00b9eb; -} - -#wpadminbar .menupop .menupop > .ab-item:before, -#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before { - position: absolute; - font: normal 17px/1 dashicons; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -#wpadminbar .menupop .menupop > .ab-item { - display: block; - padding-right: 2em; -} - -#wpadminbar .menupop .menupop > .ab-item:before { - top: 1px; - right: 4px; - content: "\f139"; - color: inherit; -} - -#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item { - padding-left: 2em; - padding-right: 1em; -} - -#wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before { - top: 1px; - left: 6px; - content: "\f141"; -} - -#wpadminbar .quicklinks .menupop ul.ab-sub-secondary { - display: block; - position: relative; - right: auto; - margin: 0; - -webkit-box-shadow: none; - box-shadow: none; -} - -#wpadminbar .quicklinks .menupop ul.ab-sub-secondary, -#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { - background: #464b50; -} - -#wpadminbar .quicklinks .menupop .ab-sub-secondary > li > a:hover, -#wpadminbar .quicklinks .menupop .ab-sub-secondary > li .ab-item:focus a { - color: #00b9eb; -} - -#wpadminbar .quicklinks a span#ab-updates { - background: #eee; - color: #32373c; - display: inline; - padding: 2px 5px; - font-size: 10px; - font-weight: 600; - -webkit-border-radius: 10px; - border-radius: 10px; -} - -#wpadminbar .quicklinks a:hover span#ab-updates { - background: #fff; - color: #000; -} - -#wpadminbar .ab-top-secondary { - float: right; -} - -#wpadminbar ul li:last-child, -#wpadminbar ul li:last-child .ab-item { - -webkit-box-shadow: none; - box-shadow: none; -} - -/** - * My Account - */ -#wp-admin-bar-my-account > ul { - min-width: 198px; -} - -#wp-admin-bar-my-account > .ab-item:before { - content: "\f110"; - top: 2px; - float: right; - margin-left: 6px; - margin-right: 0; -} - -#wp-admin-bar-my-account.with-avatar > .ab-item:before { - display: none; - content: none; -} - -#wp-admin-bar-my-account.with-avatar > ul { - min-width: 270px; -} - -#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar .ab-item { - white-space: nowrap; -} - -#wpadminbar #wp-admin-bar-user-actions > li { - margin-left: 16px; - margin-right: 16px; -} - -#wpadminbar #wp-admin-bar-user-actions.ab-submenu { - padding: 6px 0 12px; -} - -#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li { - margin-left: 88px; -} - -#wpadminbar #wp-admin-bar-user-info { - margin-top: 6px; - margin-bottom: 15px; - height: auto; - background: none; -} - -#wp-admin-bar-user-info .avatar { - position: absolute; - left: -72px; - top: 4px; - width: 64px; - height: 64px; -} - -#wpadminbar #wp-admin-bar-user-info a { - background: none; - height: auto; -} - -#wpadminbar #wp-admin-bar-user-info span { - background: none; - padding: 0; - height: 18px; -} - -#wpadminbar #wp-admin-bar-user-info .display-name, -#wpadminbar #wp-admin-bar-user-info .username { - display: block; -} - -#wpadminbar #wp-admin-bar-user-info .username { - color: #a0a5aa; - font-size: 11px; -} - -#wpadminbar #wp-admin-bar-my-account.with-avatar > .ab-empty-item img, -#wpadminbar #wp-admin-bar-my-account.with-avatar > a img { - width: auto; - height: 16px; - padding: 0; - border: 1px solid #82878c; - background: #eee; - line-height: 24px; - vertical-align: middle; - margin: -4px 0 0 6px; - float: none; - display: inline; -} - -#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > .ab-empty-item img, -#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar > a img { - width: auto; -} - -/** - * WP Logo - */ -#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon { - width: 15px; - height: 20px; - margin-right: 0; - padding: 6px 0 5px; -} - -#wpadminbar #wp-admin-bar-wp-logo > .ab-item { - padding: 0 7px; -} - -#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before { - content: "\f120"; - top: 2px; -} - -/* - * My Sites & Site Title - */ -#wpadminbar .quicklinks li .blavatar { - float: left; - font: normal 16px/1 dashicons !important; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - color: #eee; -} - -#wpadminbar .quicklinks li a:hover .blavatar, -#wpadminbar .quicklinks li a:focus .blavatar, -#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover > a .blavatar { - color: #00b9eb; -} - -#wpadminbar .quicklinks li .blavatar:before { - content: "\f120"; - height: 16px; - width: 16px; - display: inline-block; - margin: 6px 8px 0 -2px; -} - -#wpadminbar #wp-admin-bar-appearance { - margin-top: -12px; -} - -#wpadminbar #wp-admin-bar-my-sites > .ab-item:before, -#wpadminbar #wp-admin-bar-site-name > .ab-item:before { - content: "\f541"; - top: 2px; -} - -#wpadminbar #wp-admin-bar-customize > .ab-item:before { - content: "\f540"; - top: 2px; -} - - -#wpadminbar #wp-admin-bar-edit > .ab-item:before { - content: "\f464"; - top: 2px; -} - -#wpadminbar #wp-admin-bar-site-name > .ab-item:before { - content: "\f226"; -} - -.wp-admin #wpadminbar #wp-admin-bar-site-name > .ab-item:before { - content: "\f102"; -} - - - -/** - * Comments - */ -#wpadminbar #wp-admin-bar-comments .ab-icon { - margin-right: 6px; -} - -#wpadminbar #wp-admin-bar-comments .ab-icon:before { - content: "\f101"; - top: 3px; -} - -#wpadminbar #wp-admin-bar-comments .count-0 { - opacity: .5; -} - -/** - * New Content - */ -#wpadminbar #wp-admin-bar-new-content .ab-icon:before { - content: "\f132"; - top: 4px; -} - -/** - * Updates - */ -#wpadminbar #wp-admin-bar-updates .ab-icon:before { - content: "\f463"; - top: 2px; -} - -/** - * Search - */ -#wpadminbar.ie8 #wp-admin-bar-search { - display: block; - min-width: 32px; -} -#wpadminbar #wp-admin-bar-search .ab-item { - padding: 0; - background: transparent; -} - -#wpadminbar #adminbarsearch { - position: relative; - height: 32px; - padding: 0 2px; - z-index: 1; -} - -#wpadminbar #adminbarsearch:before { - position: absolute; - top: 6px; - left: 5px; - z-index: 20; - font: normal 20px/1 dashicons !important; - content: "\f179"; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input { - position: relative; - z-index: 30; - font-size: 13px; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - line-height: 24px; - height: 24px; - width: 24px; - max-width: none; - padding: 0 3px 0 24px; - margin: 0; - color: #ccc; - background-color: rgba( 255, 255, 255, 0 ); - border: none; - outline: none; - cursor: pointer; - -webkit-box-shadow: none; - box-shadow: none; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition-duration: 400ms; - transition-duration: 400ms; - -webkit-transition-property: width, background; - transition-property: width, background; - -webkit-transition-timing-function: ease; - transition-timing-function: ease; -} - -#wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { - z-index: 10; - color: #000; - width: 200px; - background-color: rgba( 255, 255, 255, 0.9 ); - cursor: text; - border: 0; -} - -#wpadminbar.ie7 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input { - margin-top: 3px; - width: 120px; -} - -#wpadminbar.ie8 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input { - /* IE8 z-index bug with transparent / empty elements - fill in with an encoded transparent GIF */ - background: transparent 0 0 repeat scroll url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBR‌​AA7"); -} - -/* IE8 doesn't redraw the pseudo elements unless you make a change to the content */ -#wpadminbar.ie8 #adminbarsearch.adminbar-focused:before { - content: "\f179 "; /* extra space */ -} - -#wpadminbar.ie8 > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { - background: #fff; - z-index: -1; -} - -#wpadminbar #adminbarsearch .adminbar-button { - display: none; -} - -/** - * Customize support classes - */ -.no-customize-support .hide-if-no-customize, -.customize-support .hide-if-customize, -.no-customize-support #wpadminbar .hide-if-no-customize, -.no-customize-support.wp-core-ui .hide-if-no-customize, -.no-customize-support .wp-core-ui .hide-if-no-customize, -.customize-support #wpadminbar .hide-if-customize, -.customize-support.wp-core-ui .hide-if-customize, -.customize-support .wp-core-ui .hide-if-customize { - display: none; -} - -/* Skip link */ -#wpadminbar .screen-reader-text, -#wpadminbar .screen-reader-text span { - position: absolute; - left: -1000em; - top: -1000em; - height: 1px; - width: 1px; - overflow: hidden; -} - -#wpadminbar .screen-reader-shortcut { - position: absolute; - top: -1000em; -} - -#wpadminbar .screen-reader-shortcut:focus { - left: 6px; - top: 7px; - height: auto; - width: auto; - display: block; - font-size: 14px; - font-weight: 600; - padding: 15px 23px 14px; - background: #f1f1f1; - color: #0073aa; - z-index: 100000; - line-height: normal; - text-decoration: none; - -webkit-box-shadow: 0 0 2px 2px rgba(0,0,0,.6); - box-shadow: 0 0 2px 2px rgba(0,0,0,.6); -} - -/** - * IE 6-targeted rules - */ -* html #wpadminbar { - overflow: hidden; - position: absolute; -} - -* html #wpadminbar .quicklinks ul li a { - float: left; -} - -* html #wpadminbar .menupop a span { - background-image: none; -} - -/* No @font-face support */ -.no-font-face #wpadminbar ul.ab-top-menu > li > a.ab-item { - display: block; - width: 45px; - text-align: center; - overflow: hidden; - margin: 0 3px; -} - -.no-font-face #wpadminbar #wp-admin-bar-my-sites > .ab-item, -.no-font-face #wpadminbar #wp-admin-bar-site-name > .ab-item, -.no-font-face #wpadminbar #wp-admin-bar-edit > .ab-item { - text-indent: 0; -} - -.no-font-face #wpadminbar .ab-icon, -.no-font-face #wpadminbar .ab-icon:before, -.no-font-face #wpadminbar a.ab-item:before, -.no-font-face #wpadminbar #wp-admin-bar-wp-logo > .ab-item { - display: none !important; -} - -.no-font-face #wpadminbar ul.ab-top-menu > li > a > span.ab-label { - display: inline; -} - -.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon { - display: inline !important; -} - -.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon:before { - content: "Menu"; - font: 14px/45px sans-serif !important; - display: inline-block !important; - color: #fff; -} - -.no-font-face #wpadminbar #wp-admin-bar-site-name a.ab-item { - color: #fff; -} -/* End no @font-face */ - -@media screen and ( max-width: 782px ) { - /* Toolbar Touchification*/ - html #wpadminbar { - height: 46px; - min-width: 300px; - - /* These rules break dropdown tappability on Chrome/Android. - -webkit-transform: translate3d(0, 0, 0); - -webkit-backface-visibility: hidden; - -webkit-transition: 0; - transform: translate3d(0, 0, 0); - backface-visibility: hidden; - transition: 0; - */ - } - - #wpadminbar * { - font-size: 14px; - font-weight: 400; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - line-height: 32px; - } - - #wpadminbar .quicklinks > ul > li > a, - #wpadminbar .quicklinks .ab-empty-item { - padding: 0; - height: 46px; - line-height: 46px; - width: auto; - } - - #wpadminbar .ab-icon { - font: 40px/1 dashicons !important; - margin: 0; - padding: 0; - width: 52px; - height: 46px; - text-align: center; - } - - #wpadminbar .ab-icon:before { - text-align: center; - } - - #wpadminbar .ab-submenu { - padding: 0; - } - - #wpadminbar #wp-admin-bar-site-name a.ab-item, - #wpadminbar #wp-admin-bar-my-sites a.ab-item, - #wpadminbar #wp-admin-bar-my-account a.ab-item { - text-overflow: clip; - } - - #wpadminbar .ab-label { - display: none; - } - - #wpadminbar .menupop li:hover > .ab-sub-wrapper, - #wpadminbar .menupop li.hover > .ab-sub-wrapper { - margin-top: -46px; - } - - #wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop > .ab-item { - padding-right: 30px; - } - - #wpadminbar .menupop .menupop > .ab-item:before { - top: 10px; - right: 6px; - } - - #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper .ab-item { - font-size: 16px; - padding: 8px 16px; - } - - #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper a:empty { - display: none; - } - - /* WP logo */ - #wpadminbar #wp-admin-bar-wp-logo > .ab-item { - padding: 0; - } - - #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon { - padding: 0; - width: 52px; - height: 46px; - text-align: center; - vertical-align: top; - } - - #wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon:before { - font: 28px/1 dashicons !important; - top: -3px; - } - - #wpadminbar .ab-icon, - #wpadminbar .ab-item:before { - padding: 0; - } - - /* My Sites and "Site Title" menu */ - #wpadminbar #wp-admin-bar-my-sites > .ab-item, - #wpadminbar #wp-admin-bar-site-name > .ab-item, - #wpadminbar #wp-admin-bar-customize > .ab-item, - #wpadminbar #wp-admin-bar-edit > .ab-item, - #wpadminbar #wp-admin-bar-my-account > .ab-item { - text-indent: 100%; - white-space: nowrap; - overflow: hidden; - width: 52px; - padding: 0; - color: #a0a5aa; /* @todo not needed? this text is hidden */ - position: relative; - } - - #wpadminbar > #wp-toolbar > #wp-admin-bar-root-default .ab-icon, - #wpadminbar .ab-icon, - #wpadminbar .ab-item:before { - padding: 0; - margin-right: 0; - } - - #wpadminbar #wp-admin-bar-edit > .ab-item:before, - #wpadminbar #wp-admin-bar-my-sites > .ab-item:before, - #wpadminbar #wp-admin-bar-site-name > .ab-item:before, - #wpadminbar #wp-admin-bar-customize > .ab-item:before, - #wpadminbar #wp-admin-bar-my-account > .ab-item:before { - display: block; - text-indent: 0; - font: normal 32px/1 dashicons; - speak: none; - top: 7px; - width: 52px; - text-align: center; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - } - - #wpadminbar #wp-admin-bar-appearance { - margin-top: 0; - } - - #wpadminbar .quicklinks li .blavatar:before { - display: none; - } - - /* Search */ - #wpadminbar #wp-admin-bar-search { - display: none; - } - - /* New Content */ - #wpadminbar #wp-admin-bar-new-content .ab-icon:before { - top: 0; - line-height: 53px; - height: 46px !important; - text-align: center; - width: 52px; - display: block; - } - - /* Updates */ - #wpadminbar #wp-admin-bar-updates { - text-align: center; - } - - #wpadminbar #wp-admin-bar-updates .ab-icon:before { - top: 3px; - } - - /* Comments */ - #wpadminbar #wp-admin-bar-comments .ab-icon { - margin: 0; - } - - #wpadminbar #wp-admin-bar-comments .ab-icon:before { - display: block; - font-size: 34px; - height: 46px; - line-height: 47px; - top: 0; - } - - /* My Account */ - #wpadminbar #wp-admin-bar-my-account > a { - position: relative; - white-space: nowrap; - text-indent: 150%; /* More than 100% indention is needed since this element has padding */ - width: 28px; - padding: 0 10px; - overflow: hidden; /* Prevent link text from forcing horizontal scrolling on mobile */ - } - - #wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { - position: absolute; - top: 13px; - right: 10px; - width: 26px; - height: 26px; - } - - #wpadminbar #wp-admin-bar-user-actions.ab-submenu { - padding: 0; - } - - #wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar { - display: none; - } - - #wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions > li { - margin: 0; - } - - #wpadminbar #wp-admin-bar-user-info .display-name { - height: auto; - font-size: 16px; - line-height: 24px; - color: #eee; - } - - #wpadminbar #wp-admin-bar-user-info a { - padding-top: 4px; - } - - #wpadminbar #wp-admin-bar-user-info .username { - line-height: 0.8 !important; - margin-bottom: -2px; - } - - /* Show only default top level items */ - #wp-toolbar > ul > li { - display: none; - } - - #wpadminbar li#wp-admin-bar-menu-toggle, - #wpadminbar li#wp-admin-bar-wp-logo, - #wpadminbar li#wp-admin-bar-my-sites, - #wpadminbar li#wp-admin-bar-updates, - #wpadminbar li#wp-admin-bar-site-name, - #wpadminbar li#wp-admin-bar-customize, - #wpadminbar li#wp-admin-bar-new-content, - #wpadminbar li#wp-admin-bar-edit, - #wpadminbar li#wp-admin-bar-comments, - #wpadminbar li#wp-admin-bar-my-account { - display: block; - } - - /* Allow dropdown list items to appear normally */ - #wpadminbar li:hover ul li, - #wpadminbar li.hover ul li, - #wpadminbar li:hover ul li:hover ul li { - display: list-item; - } - - /* Override default min-width so dropdown lists aren't stretched - to 100% viewport width at responsive sizes. */ - #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { - min-width: -webkit-fit-content; - min-width: -moz-fit-content; - min-width: fit-content; - } - - #wpadminbar ul#wp-admin-bar-root-default > li { - margin-right: 0; - } - - /* Experimental fix for touch toolbar dropdown positioning */ - #wpadminbar .ab-top-menu, - #wpadminbar .ab-top-secondary, - #wpadminbar #wp-admin-bar-wp-logo, - #wpadminbar #wp-admin-bar-my-sites, - #wpadminbar #wp-admin-bar-site-name, - #wpadminbar #wp-admin-bar-updates, - #wpadminbar #wp-admin-bar-comments, - #wpadminbar #wp-admin-bar-new-content, - #wpadminbar #wp-admin-bar-edit, - #wpadminbar #wp-admin-bar-my-account { - position: static; - } - - #wpadminbar #wp-admin-bar-my-account { - float: right; - } - - .network-admin #wpadminbar ul#wp-admin-bar-top-secondary > li#wp-admin-bar-my-account { - margin-right: 0; - } - - /* Realign arrows on taller responsive submenus */ - - #wpadminbar .ab-top-secondary .menupop .menupop > .ab-item:before { - top: 10px; - left: 0; - } -} - -/* Smartphone */ -@media screen and (max-width: 600px) { - #wpadminbar { - position: absolute; - } - - #wp-responsive-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 400; - } - - #wpadminbar .ab-top-menu > .menupop > .ab-sub-wrapper { - width: 100%; - left: 0; - } - - #wpadminbar .menupop .menupop > .ab-item:before { - display: none; - } - - #wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper { - margin-left: 0; - } - - #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper { - margin: 0; - width: 100%; - top: auto; - left: auto; - position: relative; - } - - #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper .ab-item { - font-size: 16px; - padding: 6px 15px 19px 30px; - } - - #wpadminbar li:hover ul li ul li { - display: list-item; - } - - #wpadminbar li#wp-admin-bar-wp-logo, - #wpadminbar li#wp-admin-bar-updates { - display: none; - } - - /* Make submenus full-width at this size */ - - #wpadminbar .ab-top-menu > .menupop li > .ab-sub-wrapper { - position: static; - -webkit-box-shadow: none; - box-shadow: none; - } -} - -/* Very narrow screens */ -@media screen and (max-width: 400px) { - #wpadminbar li#wp-admin-bar-comments { - display: none; - } -} diff --git a/wp/wp-includes/css/admin-bar.min.css b/wp/wp-includes/css/admin-bar.min.css deleted file mode 100644 index 68665fc6..00000000 --- a/wp/wp-includes/css/admin-bar.min.css +++ /dev/null @@ -1 +0,0 @@ -#wpadminbar,#wpadminbar *{font-size:13px;font-weight:400;line-height:32px}#wpadminbar *{height:auto;width:auto;margin:0;padding:0;position:static;text-shadow:none;text-transform:none;letter-spacing:normal;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;-webkit-border-radius:0;border-radius:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-transition:none;transition:none;-webkit-font-smoothing:subpixel-antialiased;-moz-osx-font-smoothing:auto}.rtl #wpadminbar *{font-family:Tahoma,sans-serif}html:lang(he-il) .rtl #wpadminbar *{font-family:Arial,sans-serif}#wpadminbar .ab-empty-item{cursor:default;outline:0}#wpadminbar .ab-empty-item,#wpadminbar a.ab-item,#wpadminbar>#wp-toolbar span.ab-label,#wpadminbar>#wp-toolbar span.noticon{color:#eee}#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#wpadminbar ul li:after,#wpadminbar ul li:before{content:normal}#wpadminbar a,#wpadminbar a img,#wpadminbar a img:hover,#wpadminbar a:hover{outline:0;border:none;text-decoration:none;background:0 0}#wpadminbar a:active,#wpadminbar a:focus,#wpadminbar div,#wpadminbar input[type=text],#wpadminbar input[type=password],#wpadminbar input[type=number],#wpadminbar input[type=search],#wpadminbar input[type=email],#wpadminbar input[type=url],#wpadminbar select,#wpadminbar textarea{-webkit-box-shadow:none;box-shadow:none;outline:0}#wpadminbar{direction:ltr;color:#ccc;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;height:32px;position:fixed;top:0;left:0;width:100%;min-width:600px;z-index:99999;background:#23282d}#wpadminbar .ab-sub-wrapper,#wpadminbar ul,#wpadminbar ul li{background:0 0;clear:none;list-style:none;margin:0;padding:0;position:relative;text-indent:0;z-index:99999}#wpadminbar ul#wp-admin-bar-root-default>li{margin-right:0}#wpadminbar .quicklinks ul{text-align:left}#wpadminbar li{float:left}#wpadminbar .quicklinks .ab-top-secondary>li{float:right}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks a,#wpadminbar .shortlink-input{height:32px;display:block;padding:0 10px;margin:0}#wpadminbar .quicklinks>ul>li>a{padding:0 8px 0 7px}#wpadminbar .menupop .ab-sub-wrapper,#wpadminbar .shortlink-input{margin:0;padding:0;-webkit-box-shadow:0 3px 5px rgba(0,0,0,.2);box-shadow:0 3px 5px rgba(0,0,0,.2);background:#32373c;display:none;position:absolute;float:none}#wpadminbar .selected .shortlink-input,#wpadminbar li.hover>.ab-sub-wrapper,#wpadminbar.nojs li:hover>.ab-sub-wrapper{display:block}#wpadminbar.ie7 .menupop .ab-sub-wrapper,#wpadminbar.ie7 .shortlink-input{top:32px;left:0}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:100%}#wpadminbar .ab-top-secondary .menupop .ab-sub-wrapper{right:0;left:auto}#wpadminbar .ab-submenu{padding:6px 0}#wpadminbar .quicklinks .menupop ul li{float:none}#wpadminbar .quicklinks .menupop ul li a strong{font-weight:600}#wpadminbar .quicklinks .menupop ul li .ab-item,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li .ab-item,#wpadminbar .shortlink-input,#wpadminbar.nojs .quicklinks .menupop:hover ul li .ab-item{line-height:26px;height:26px;white-space:nowrap;min-width:140px}#wpadminbar .shortlink-input{width:200px}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-left:100%;margin-top:-32px}#wpadminbar .ab-top-secondary .menupop li.hover>.ab-sub-wrapper,#wpadminbar .ab-top-secondary .menupop li:hover>.ab-sub-wrapper{margin-left:0;left:inherit;right:100%}#wpadminbar .ab-top-menu>li.hover>.ab-item,#wpadminbar.nojq .quicklinks .ab-top-menu>li>.ab-item:focus,#wpadminbar:not(.mobile) .ab-top-menu>li:hover>.ab-item,#wpadminbar:not(.mobile) .ab-top-menu>li>.ab-item:focus{background:#32373c;color:#00b9eb}#wpadminbar:not(.mobile)>#wp-toolbar a:focus span.ab-label,#wpadminbar:not(.mobile)>#wp-toolbar li:hover span.ab-label,#wpadminbar>#wp-toolbar li.hover span.ab-label{color:#00b9eb}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon{position:relative;float:left;font:400 20px/1 dashicons;speak:none;padding:4px 0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-image:none!important;margin-right:6px}#wpadminbar #adminbarsearch:before,#wpadminbar .ab-icon:before,#wpadminbar .ab-item:before{color:#a0a5aa;color:rgba(240,245,250,.6);position:relative;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}#wpadminbar .ab-label{display:inline-block;height:32px}#wpadminbar .ab-submenu .ab-item,#wpadminbar .quicklinks .menupop ul li a,#wpadminbar .quicklinks .menupop ul li a strong,#wpadminbar .quicklinks .menupop.hover ul li a,#wpadminbar.nojs .quicklinks .menupop:hover ul li a{color:#b4b9be;color:rgba(240,245,250,.7)}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a,#wpadminbar .quicklinks .menupop ul li a:focus,#wpadminbar .quicklinks .menupop ul li a:focus strong,#wpadminbar .quicklinks .menupop ul li a:hover,#wpadminbar .quicklinks .menupop ul li a:hover strong,#wpadminbar .quicklinks .menupop.hover ul li a:focus,#wpadminbar .quicklinks .menupop.hover ul li a:hover,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:focus,#wpadminbar .quicklinks .menupop.hover ul li div[tabindex]:hover,#wpadminbar li #adminbarsearch.adminbar-focused:before,#wpadminbar li .ab-item:focus .ab-icon:before,#wpadminbar li .ab-item:focus:before,#wpadminbar li a:focus .ab-icon:before,#wpadminbar li.hover .ab-icon:before,#wpadminbar li.hover .ab-item:before,#wpadminbar li:hover #adminbarsearch:before,#wpadminbar li:hover .ab-icon:before,#wpadminbar li:hover .ab-item:before,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:focus,#wpadminbar.nojs .quicklinks .menupop:hover ul li a:hover{color:#00b9eb}#wpadminbar.mobile .quicklinks .ab-icon:before,#wpadminbar.mobile .quicklinks .ab-item:before{color:#b4b9be}#wpadminbar.mobile .quicklinks .hover .ab-icon:before,#wpadminbar.mobile .quicklinks .hover .ab-item:before{color:#00b9eb}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before,#wpadminbar .menupop .menupop>.ab-item:before{position:absolute;font:400 17px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar .menupop .menupop>.ab-item{display:block;padding-right:2em}#wpadminbar .menupop .menupop>.ab-item:before{top:1px;right:4px;content:"\f139";color:inherit}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item{padding-left:2em;padding-right:1em}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before{top:1px;left:6px;content:"\f141"}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary{display:block;position:relative;right:auto;margin:0;-webkit-box-shadow:none;box-shadow:none}#wpadminbar .quicklinks .menupop ul.ab-sub-secondary,#wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu{background:#464b50}#wpadminbar .quicklinks .menupop .ab-sub-secondary>li .ab-item:focus a,#wpadminbar .quicklinks .menupop .ab-sub-secondary>li>a:hover{color:#00b9eb}#wpadminbar .quicklinks a span#ab-updates{background:#eee;color:#32373c;display:inline;padding:2px 5px;font-size:10px;font-weight:600;-webkit-border-radius:10px;border-radius:10px}#wpadminbar .quicklinks a:hover span#ab-updates{background:#fff;color:#000}#wpadminbar .ab-top-secondary{float:right}#wpadminbar ul li:last-child,#wpadminbar ul li:last-child .ab-item{-webkit-box-shadow:none;box-shadow:none}#wp-admin-bar-my-account>ul{min-width:198px}#wp-admin-bar-my-account>.ab-item:before{content:"\f110";top:2px;float:right;margin-left:6px;margin-right:0}#wp-admin-bar-my-account.with-avatar>.ab-item:before{display:none;content:none}#wp-admin-bar-my-account.with-avatar>ul{min-width:270px}#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar .ab-item{white-space:nowrap}#wpadminbar #wp-admin-bar-user-actions>li{margin-left:16px;margin-right:16px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:6px 0 12px}#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin-left:88px}#wpadminbar #wp-admin-bar-user-info{margin-top:6px;margin-bottom:15px;height:auto;background:0 0}#wp-admin-bar-user-info .avatar{position:absolute;left:-72px;top:4px;width:64px;height:64px}#wpadminbar #wp-admin-bar-user-info a{background:0 0;height:auto}#wpadminbar #wp-admin-bar-user-info span{background:0 0;padding:0;height:18px}#wpadminbar #wp-admin-bar-user-info .display-name,#wpadminbar #wp-admin-bar-user-info .username{display:block}#wpadminbar #wp-admin-bar-user-info .username{color:#a0a5aa;font-size:11px}#wpadminbar #wp-admin-bar-my-account.with-avatar>.ab-empty-item img,#wpadminbar #wp-admin-bar-my-account.with-avatar>a img{width:auto;height:16px;padding:0;border:1px solid #82878c;background:#eee;line-height:24px;vertical-align:middle;margin:-4px 0 0 6px;float:none;display:inline}#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar>.ab-empty-item img,#wpadminbar.ie8 #wp-admin-bar-my-account.with-avatar>a img{width:auto}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{width:15px;height:20px;margin-right:0;padding:6px 0 5px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0 7px}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{content:"\f120";top:2px}#wpadminbar .quicklinks li .blavatar{float:left;font:400 16px/1 dashicons!important;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#eee}#wpadminbar .quicklinks .ab-sub-wrapper .menupop.hover>a .blavatar,#wpadminbar .quicklinks li a:focus .blavatar,#wpadminbar .quicklinks li a:hover .blavatar{color:#00b9eb}#wpadminbar .quicklinks li .blavatar:before{content:"\f120";height:16px;width:16px;display:inline-block;margin:6px 8px 0 -2px}#wpadminbar #wp-admin-bar-appearance{margin-top:-12px}#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f541";top:2px}#wpadminbar #wp-admin-bar-customize>.ab-item:before{content:"\f540";top:2px}#wpadminbar #wp-admin-bar-edit>.ab-item:before{content:"\f464";top:2px}#wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f226"}.wp-admin #wpadminbar #wp-admin-bar-site-name>.ab-item:before{content:"\f102"}#wpadminbar #wp-admin-bar-comments .ab-icon{margin-right:6px}#wpadminbar #wp-admin-bar-comments .ab-icon:before{content:"\f101";top:3px}#wpadminbar #wp-admin-bar-comments .count-0{opacity:.5}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{content:"\f132";top:4px}#wpadminbar #wp-admin-bar-updates .ab-icon:before{content:"\f463";top:2px}#wpadminbar.ie8 #wp-admin-bar-search{display:block;min-width:32px}#wpadminbar #wp-admin-bar-search .ab-item{padding:0;background:0 0}#wpadminbar #adminbarsearch{position:relative;height:32px;padding:0 2px;z-index:1}#wpadminbar #adminbarsearch:before{position:absolute;top:6px;left:5px;z-index:20;font:400 20px/1 dashicons!important;content:"\f179";speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{position:relative;z-index:30;font-size:13px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:24px;height:24px;width:24px;max-width:none;padding:0 3px 0 24px;margin:0;color:#ccc;background-color:rgba(255,255,255,0);border:none;outline:0;cursor:pointer;-webkit-box-shadow:none;box-shadow:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition-duration:.4s;transition-duration:.4s;-webkit-transition-property:width,background;transition-property:width,background;-webkit-transition-timing-function:ease;transition-timing-function:ease}#wpadminbar>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{z-index:10;color:#000;width:200px;background-color:rgba(255,255,255,.9);cursor:text;border:0}#wpadminbar.ie7>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{margin-top:3px;width:120px}#wpadminbar.ie8>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input{background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBR‌​AA7)}#wpadminbar.ie8 #adminbarsearch.adminbar-focused:before{content:"\f179 "}#wpadminbar.ie8>#wp-toolbar>#wp-admin-bar-top-secondary>#wp-admin-bar-search #adminbarsearch input.adminbar-input:focus{background:#fff;z-index:-1}#wpadminbar #adminbarsearch .adminbar-button,.customize-support #wpadminbar .hide-if-customize,.customize-support .hide-if-customize,.customize-support .wp-core-ui .hide-if-customize,.customize-support.wp-core-ui .hide-if-customize,.no-customize-support #wpadminbar .hide-if-no-customize,.no-customize-support .hide-if-no-customize,.no-customize-support .wp-core-ui .hide-if-no-customize,.no-customize-support.wp-core-ui .hide-if-no-customize{display:none}#wpadminbar .screen-reader-text,#wpadminbar .screen-reader-text span{position:absolute;left:-1000em;top:-1000em;height:1px;width:1px;overflow:hidden}#wpadminbar .screen-reader-shortcut{position:absolute;top:-1000em}#wpadminbar .screen-reader-shortcut:focus{left:6px;top:7px;height:auto;width:auto;display:block;font-size:14px;font-weight:600;padding:15px 23px 14px;background:#f1f1f1;color:#0073aa;z-index:100000;line-height:normal;text-decoration:none;-webkit-box-shadow:0 0 2px 2px rgba(0,0,0,.6);box-shadow:0 0 2px 2px rgba(0,0,0,.6)}* html #wpadminbar{overflow:hidden;position:absolute}* html #wpadminbar .quicklinks ul li a{float:left}* html #wpadminbar .menupop a span{background-image:none}.no-font-face #wpadminbar ul.ab-top-menu>li>a.ab-item{display:block;width:45px;text-align:center;overflow:hidden;margin:0 3px}.no-font-face #wpadminbar #wp-admin-bar-edit>.ab-item,.no-font-face #wpadminbar #wp-admin-bar-my-sites>.ab-item,.no-font-face #wpadminbar #wp-admin-bar-site-name>.ab-item{text-indent:0}.no-font-face #wpadminbar #wp-admin-bar-wp-logo>.ab-item,.no-font-face #wpadminbar .ab-icon,.no-font-face #wpadminbar .ab-icon:before,.no-font-face #wpadminbar a.ab-item:before{display:none!important}.no-font-face #wpadminbar ul.ab-top-menu>li>a>span.ab-label{display:inline}.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon{display:inline!important}.no-font-face #wpadminbar #wp-admin-bar-menu-toggle span.ab-icon:before{content:"Menu";font:14px/45px sans-serif!important;display:inline-block!important;color:#fff}.no-font-face #wpadminbar #wp-admin-bar-site-name a.ab-item{color:#fff}@media screen and (max-width:782px){#wpadminbar ul#wp-admin-bar-root-default>li,.network-admin #wpadminbar ul#wp-admin-bar-top-secondary>li#wp-admin-bar-my-account{margin-right:0}html #wpadminbar{height:46px;min-width:300px}#wpadminbar *{font-size:14px;font-weight:400;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;line-height:32px}#wpadminbar .quicklinks .ab-empty-item,#wpadminbar .quicklinks>ul>li>a{padding:0;height:46px;line-height:46px;width:auto}#wpadminbar .ab-icon{font:40px/1 dashicons!important;margin:0;padding:0;width:52px;height:46px;text-align:center}#wpadminbar .ab-icon:before{text-align:center}#wpadminbar .ab-submenu{padding:0}#wpadminbar #wp-admin-bar-my-account a.ab-item,#wpadminbar #wp-admin-bar-my-sites a.ab-item,#wpadminbar #wp-admin-bar-site-name a.ab-item{text-overflow:clip}#wpadminbar .ab-label{display:none}#wpadminbar .menupop li.hover>.ab-sub-wrapper,#wpadminbar .menupop li:hover>.ab-sub-wrapper{margin-top:-46px}#wpadminbar #wp-admin-bar-comments .ab-icon,#wpadminbar #wp-admin-bar-my-account.with-avatar #wp-admin-bar-user-actions>li{margin:0}#wpadminbar .ab-top-menu .menupop .ab-sub-wrapper .menupop>.ab-item{padding-right:30px}#wpadminbar .menupop .menupop>.ab-item:before{top:10px;right:6px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper .ab-item{font-size:16px;padding:8px 16px}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper a:empty{display:none}#wpadminbar #wp-admin-bar-wp-logo>.ab-item{padding:0}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon{padding:0;width:52px;height:46px;text-align:center;vertical-align:top}#wpadminbar #wp-admin-bar-wp-logo>.ab-item .ab-icon:before{font:28px/1 dashicons!important;top:-3px}#wpadminbar .ab-icon,#wpadminbar .ab-item:before{padding:0}#wpadminbar #wp-admin-bar-customize>.ab-item,#wpadminbar #wp-admin-bar-edit>.ab-item,#wpadminbar #wp-admin-bar-my-account>.ab-item,#wpadminbar #wp-admin-bar-my-sites>.ab-item,#wpadminbar #wp-admin-bar-site-name>.ab-item{text-indent:100%;white-space:nowrap;overflow:hidden;width:52px;padding:0;color:#a0a5aa;position:relative}#wpadminbar .ab-icon,#wpadminbar .ab-item:before,#wpadminbar>#wp-toolbar>#wp-admin-bar-root-default .ab-icon{padding:0;margin-right:0}#wpadminbar #wp-admin-bar-customize>.ab-item:before,#wpadminbar #wp-admin-bar-edit>.ab-item:before,#wpadminbar #wp-admin-bar-my-account>.ab-item:before,#wpadminbar #wp-admin-bar-my-sites>.ab-item:before,#wpadminbar #wp-admin-bar-site-name>.ab-item:before{display:block;text-indent:0;font:400 32px/1 dashicons;speak:none;top:7px;width:52px;text-align:center;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#wpadminbar #wp-admin-bar-appearance{margin-top:0}#wpadminbar .quicklinks li .blavatar:before{display:none}#wpadminbar #wp-admin-bar-search{display:none}#wpadminbar #wp-admin-bar-new-content .ab-icon:before{top:0;line-height:53px;height:46px!important;text-align:center;width:52px;display:block}#wpadminbar #wp-admin-bar-updates{text-align:center}#wpadminbar #wp-admin-bar-updates .ab-icon:before{top:3px}#wpadminbar #wp-admin-bar-comments .ab-icon:before{display:block;font-size:34px;height:46px;line-height:47px;top:0}#wp-toolbar>ul>li,#wpadminbar #wp-admin-bar-user-actions.ab-submenu img.avatar{display:none}#wpadminbar #wp-admin-bar-my-account>a{position:relative;white-space:nowrap;text-indent:150%;width:28px;padding:0 10px;overflow:hidden}#wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar>a img{position:absolute;top:13px;right:10px;width:26px;height:26px}#wpadminbar #wp-admin-bar-user-actions.ab-submenu{padding:0}#wpadminbar #wp-admin-bar-user-info .display-name{height:auto;font-size:16px;line-height:24px;color:#eee}#wpadminbar #wp-admin-bar-user-info a{padding-top:4px}#wpadminbar #wp-admin-bar-user-info .username{line-height:.8!important;margin-bottom:-2px}#wpadminbar li#wp-admin-bar-comments,#wpadminbar li#wp-admin-bar-customize,#wpadminbar li#wp-admin-bar-edit,#wpadminbar li#wp-admin-bar-menu-toggle,#wpadminbar li#wp-admin-bar-my-account,#wpadminbar li#wp-admin-bar-my-sites,#wpadminbar li#wp-admin-bar-new-content,#wpadminbar li#wp-admin-bar-site-name,#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:block}#wpadminbar li.hover ul li,#wpadminbar li:hover ul li,#wpadminbar li:hover ul li:hover ul li{display:list-item}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content}#wpadminbar #wp-admin-bar-comments,#wpadminbar #wp-admin-bar-edit,#wpadminbar #wp-admin-bar-my-account,#wpadminbar #wp-admin-bar-my-sites,#wpadminbar #wp-admin-bar-new-content,#wpadminbar #wp-admin-bar-site-name,#wpadminbar #wp-admin-bar-updates,#wpadminbar #wp-admin-bar-wp-logo,#wpadminbar .ab-top-menu,#wpadminbar .ab-top-secondary{position:static}#wpadminbar #wp-admin-bar-my-account{float:right}#wpadminbar .ab-top-secondary .menupop .menupop>.ab-item:before{top:10px;left:0}}@media screen and (max-width:600px){#wpadminbar{position:absolute}#wp-responsive-overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:400}#wpadminbar .ab-top-menu>.menupop>.ab-sub-wrapper{width:100%;left:0}#wpadminbar .menupop .menupop>.ab-item:before{display:none}#wpadminbar #wp-admin-bar-wp-logo.menupop .ab-sub-wrapper{margin-left:0}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper{margin:0;width:100%;top:auto;left:auto;position:static;-webkit-box-shadow:none;box-shadow:none}#wpadminbar .ab-top-menu>.menupop li>.ab-sub-wrapper .ab-item{font-size:16px;padding:6px 15px 19px 30px}#wpadminbar li:hover ul li ul li{display:list-item}#wpadminbar li#wp-admin-bar-updates,#wpadminbar li#wp-admin-bar-wp-logo{display:none}}@media screen and (max-width:400px){#wpadminbar li#wp-admin-bar-comments{display:none}} \ No newline at end of file diff --git a/wp/wp-includes/css/buttons-rtl.css b/wp/wp-includes/css/buttons-rtl.css deleted file mode 100644 index 7a5027e0..00000000 --- a/wp/wp-includes/css/buttons-rtl.css +++ /dev/null @@ -1,394 +0,0 @@ -/* ---------------------------------------------------------------------------- - -NOTE: If you edit this file, you should make sure that the CSS rules for -buttons in the following files are updated. - -* jquery-ui-dialog.css -* editor.css - -WordPress-style Buttons -======================= -Create a button by adding the `.button` class to an element. For backward -compatibility, we support several other classes (such as `.button-secondary`), -but these will *not* work with the stackable classes described below. - -Button Styles -------------- -To display a primary button style, add the `.button-primary` class to a button. - -Button Sizes ------------- -Adjust a button's size by adding the `.button-large` or `.button-small` class. - -Button States -------------- -Lock the state of a button by adding the name of the pseudoclass as -an actual class (e.g. `.hover` for `:hover`). - - -TABLE OF CONTENTS: ------------------- - 1.0 - Button Layouts - 2.0 - Default Button Style - 3.0 - Primary Button Style - 4.0 - Button Groups - 5.0 - Responsive Button Styles - ----------------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------------- - 1.0 - Button Layouts ----------------------------------------------------------------------------- */ - -.wp-core-ui .button, -.wp-core-ui .button-primary, -.wp-core-ui .button-secondary { - display: inline-block; - text-decoration: none; - font-size: 13px; - line-height: 26px; - height: 28px; - margin: 0; - padding: 0 10px 1px; - cursor: pointer; - border-width: 1px; - border-style: solid; - -webkit-appearance: none; - -webkit-border-radius: 3px; - border-radius: 3px; - white-space: nowrap; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -/* Remove the dotted border on :focus and the extra padding in Firefox */ -.wp-core-ui button::-moz-focus-inner, -.wp-core-ui input[type="reset"]::-moz-focus-inner, -.wp-core-ui input[type="button"]::-moz-focus-inner, -.wp-core-ui input[type="submit"]::-moz-focus-inner { - border-width: 0; - border-style: none; - padding: 0; -} - -.wp-core-ui .button.button-large, -.wp-core-ui .button-group.button-large .button { - height: 30px; - line-height: 28px; - padding: 0 12px 2px; -} - -.wp-core-ui .button.button-small, -.wp-core-ui .button-group.button-small .button { - height: 24px; - line-height: 22px; - padding: 0 8px 1px; - font-size: 11px; -} - -.wp-core-ui .button.button-hero, -.wp-core-ui .button-group.button-hero .button { - font-size: 14px; - height: 46px; - line-height: 44px; - padding: 0 36px; -} - -.wp-core-ui .button:active, -.wp-core-ui .button:focus { - outline: none; -} - -.wp-core-ui .button.hidden { - display: none; -} - -/* Style Reset buttons as simple text links */ - -.wp-core-ui input[type="reset"], -.wp-core-ui input[type="reset"]:hover, -.wp-core-ui input[type="reset"]:active, -.wp-core-ui input[type="reset"]:focus { - background: none; - border: none; - -webkit-box-shadow: none; - box-shadow: none; - padding: 0 2px 1px; - width: auto; -} - -/* ---------------------------------------------------------------------------- - 2.0 - Default Button Style ----------------------------------------------------------------------------- */ - -.wp-core-ui .button, -.wp-core-ui .button-secondary { - color: #555; - border-color: #cccccc; - background: #f7f7f7; - -webkit-box-shadow: 0 1px 0 #cccccc; - box-shadow: 0 1px 0 #cccccc; - vertical-align: top; -} - -.wp-core-ui p .button { - vertical-align: baseline; -} - -.wp-core-ui .button.hover, -.wp-core-ui .button:hover, -.wp-core-ui .button-secondary:hover, -.wp-core-ui .button.focus, -.wp-core-ui .button:focus, -.wp-core-ui .button-secondary:focus { - background: #fafafa; - border-color: #999; - color: #23282d; -} - -.wp-core-ui .button.focus, -.wp-core-ui .button:focus, -.wp-core-ui .button-secondary:focus, -.wp-core-ui .button-link:focus { - border-color: #5b9dd9; - -webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); - box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); -} - -.wp-core-ui .button.active, -.wp-core-ui .button.active:hover, -.wp-core-ui .button:active, -.wp-core-ui .button-secondary:active { - background: #eee; - border-color: #999; - -webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); - box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); - -webkit-transform: translateY(1px); - -ms-transform: translateY(1px); - transform: translateY(1px); -} - -.wp-core-ui .button.active:focus { - border-color: #5b9dd9; - -webkit-box-shadow: - inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ), - 0 0 3px rgba( 0, 115, 170, .8 ); - box-shadow: - inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ), - 0 0 3px rgba( 0, 115, 170, .8 ); -} - -.wp-core-ui .button[disabled], -.wp-core-ui .button:disabled, -.wp-core-ui .button.disabled, -.wp-core-ui .button-secondary[disabled], -.wp-core-ui .button-secondary:disabled, -.wp-core-ui .button-secondary.disabled, -.wp-core-ui .button-disabled { - color: #a0a5aa !important; - border-color: #ddd !important; - background: #f7f7f7 !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - text-shadow: 0 1px 0 #fff !important; - cursor: default; - -webkit-transform: none !important; - -ms-transform: none !important; - transform: none !important; -} - -/* Buttons that look like links, for a cross of good semantics with the visual */ -.wp-core-ui .button-link { - margin: 0; - padding: 0; - -webkit-box-shadow: none; - box-shadow: none; - border: 0; - -webkit-border-radius: 0; - border-radius: 0; - background: none; - outline: none; - cursor: pointer; -} - -.wp-core-ui .button-link:focus { - outline: #5b9dd9 solid 1px; -} - -/* ---------------------------------------------------------------------------- - 3.0 - Primary Button Style ----------------------------------------------------------------------------- */ - -.wp-core-ui .button-primary { - background: #0085ba; - border-color: #0073aa #006799 #006799; - -webkit-box-shadow: 0 1px 0 #006799; - box-shadow: 0 1px 0 #006799; - color: #fff; - text-decoration: none; - text-shadow: 0 -1px 1px #006799, - -1px 0 1px #006799, - 0 1px 1px #006799, - 1px 0 1px #006799; -} - -.wp-core-ui .button-primary.hover, -.wp-core-ui .button-primary:hover, -.wp-core-ui .button-primary.focus, -.wp-core-ui .button-primary:focus { - background: #008ec2; - border-color: #006799; - color: #fff; -} - -.wp-core-ui .button-primary.focus, -.wp-core-ui .button-primary:focus { - -webkit-box-shadow: 0 1px 0 #0073aa, - 0 0 2px 1px #33b3db; - box-shadow: 0 1px 0 #0073aa, - 0 0 2px 1px #33b3db; -} - -.wp-core-ui .button-primary.active, -.wp-core-ui .button-primary.active:hover, -.wp-core-ui .button-primary.active:focus, -.wp-core-ui .button-primary:active { - background: #0073aa; - border-color: #006799; - -webkit-box-shadow: inset 0 2px 0 #006799; - box-shadow: inset 0 2px 0 #006799; - vertical-align: top; -} - -.wp-core-ui .button-primary[disabled], -.wp-core-ui .button-primary:disabled, -.wp-core-ui .button-primary-disabled, -.wp-core-ui .button-primary.disabled { - color: #66c6e4 !important; - background: #008ec2 !important; - border-color: #007cb2 !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - text-shadow: 0 -1px 0 rgba( 0, 0, 0, 0.1 ) !important; - cursor: default; -} - -.wp-core-ui .button.button-primary.button-hero { - -webkit-box-shadow: 0 2px 0 #006799; - box-shadow: 0 2px 0 #006799; -} - -.wp-core-ui .button.button-primary.button-hero.active, -.wp-core-ui .button.button-primary.button-hero.active:hover, -.wp-core-ui .button.button-primary.button-hero.active:focus, -.wp-core-ui .button.button-primary.button-hero:active { - -webkit-box-shadow: inset 0 3px 0 #006799; - box-shadow: inset 0 3px 0 #006799; -} - -/* ---------------------------------------------------------------------------- - 4.0 - Button Groups ----------------------------------------------------------------------------- */ - -.wp-core-ui .button-group { - position: relative; - display: inline-block; - white-space: nowrap; - font-size: 0; - vertical-align: middle; -} - -.wp-core-ui .button-group > .button { - display: inline-block; - -webkit-border-radius: 0; - border-radius: 0; - margin-left: -1px; - z-index: 10; -} - -.wp-core-ui .button-group > .button-primary { - z-index: 100; -} - -.wp-core-ui .button-group > .button:hover { - z-index: 20; -} - -.wp-core-ui .button-group > .button:first-child { - -webkit-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.wp-core-ui .button-group > .button:last-child { - -webkit-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.wp-core-ui .button-group > .button:focus { - position: relative; - z-index: 1; -} - -/* ---------------------------------------------------------------------------- - 5.0 - Responsive Button Styles ----------------------------------------------------------------------------- */ - -@media screen and ( max-width: 782px ) { - - .wp-core-ui .button, - .wp-core-ui .button.button-large, - .wp-core-ui .button.button-small, - input#publish, - input#save-post, - a.preview { - padding: 6px 14px; - line-height: normal; - font-size: 14px; - vertical-align: middle; - height: auto; - margin-bottom: 4px; - } - - #media-upload.wp-core-ui .button { - padding: 0 10px 1px; - height: 24px; - line-height: 22px; - font-size: 13px; - } - - .media-frame.mode-grid .bulk-select .button { - margin-bottom: 0; - } - - /* Publish Metabox Options */ - .wp-core-ui .save-post-status.button { - position: relative; - margin: 0 10px 0 14px; /* 14px right margin to match all other buttons */ - } - - /* Reset responsive styles in Press This, Customizer */ - - .wp-core-ui.wp-customizer .button { - padding: 0 10px 1px; - font-size: 13px; - line-height: 26px; - height: 28px; - margin: 0; - vertical-align: inherit; - } - - .media-modal-content .media-toolbar-primary .media-button { - margin-top: 10px; - margin-right: 5px; - } - - /* Reset responsive styles on Log in button on iframed login form */ - - .interim-login .button.button-large { - height: 30px; - line-height: 28px; - padding: 0 12px 2px; - } - -} diff --git a/wp/wp-includes/css/buttons-rtl.min.css b/wp/wp-includes/css/buttons-rtl.min.css deleted file mode 100644 index a36bf76b..00000000 --- a/wp/wp-includes/css/buttons-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.wp-core-ui .button,.wp-core-ui .button-primary,.wp-core-ui .button-secondary{display:inline-block;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;-webkit-border-radius:3px;border-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.wp-core-ui button::-moz-focus-inner,.wp-core-ui input[type=reset]::-moz-focus-inner,.wp-core-ui input[type=button]::-moz-focus-inner,.wp-core-ui input[type=submit]::-moz-focus-inner{border-width:0;border-style:none;padding:0}.wp-core-ui .button-group.button-large .button,.wp-core-ui .button.button-large{height:30px;line-height:28px;padding:0 12px 2px}.wp-core-ui .button-group.button-small .button,.wp-core-ui .button.button-small{height:24px;line-height:22px;padding:0 8px 1px;font-size:11px}.wp-core-ui .button-group.button-hero .button,.wp-core-ui .button.button-hero{font-size:14px;height:46px;line-height:44px;padding:0 36px}.wp-core-ui .button:active,.wp-core-ui .button:focus{outline:0}.wp-core-ui .button.hidden{display:none}.wp-core-ui input[type=reset],.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:focus,.wp-core-ui input[type=reset]:hover{background:0 0;border:none;-webkit-box-shadow:none;box-shadow:none;padding:0 2px 1px;width:auto}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:0 1px 0 #ccc;box-shadow:0 1px 0 #ccc;vertical-align:top}.wp-core-ui p .button{vertical-align:baseline}.wp-core-ui .button-secondary:focus,.wp-core-ui .button-secondary:hover,.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{background:#fafafa;border-color:#999;color:#23282d}.wp-core-ui .button-link:focus,.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#5b9dd9;-webkit-box-shadow:0 0 3px rgba(0,115,170,.8);box-shadow:0 0 3px rgba(0,115,170,.8)}.wp-core-ui .button-secondary:active,.wp-core-ui .button.active,.wp-core-ui .button.active:hover,.wp-core-ui .button:active{background:#eee;border-color:#999;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);-webkit-transform:translateY(1px);-ms-transform:translateY(1px);transform:translateY(1px)}.wp-core-ui .button.active:focus{border-color:#5b9dd9;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5),0 0 3px rgba(0,115,170,.8);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5),0 0 3px rgba(0,115,170,.8)}.wp-core-ui .button-disabled,.wp-core-ui .button-secondary.disabled,.wp-core-ui .button-secondary:disabled,.wp-core-ui .button-secondary[disabled],.wp-core-ui .button.disabled,.wp-core-ui .button:disabled,.wp-core-ui .button[disabled]{color:#a0a5aa!important;border-color:#ddd!important;background:#f7f7f7!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;-webkit-transform:none!important;-ms-transform:none!important;transform:none!important}.wp-core-ui .button-link{margin:0;padding:0;-webkit-box-shadow:none;box-shadow:none;border:0;-webkit-border-radius:0;border-radius:0;background:0 0;outline:0;cursor:pointer}.wp-core-ui .button-link:focus{outline:#5b9dd9 solid 1px}.wp-core-ui .button-primary{background:#0085ba;border-color:#0073aa #006799 #006799;-webkit-box-shadow:0 1px 0 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:0 -1px 1px #006799,-1px 0 1px #006799,0 1px 1px #006799,1px 0 1px #006799}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary.hover,.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#008ec2;border-color:#006799;color:#fff}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary:focus{-webkit-box-shadow:0 1px 0 #0073aa,0 0 2px 1px #33b3db;box-shadow:0 1px 0 #0073aa,0 0 2px 1px #33b3db}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover,.wp-core-ui .button-primary:active{background:#0073aa;border-color:#006799;-webkit-box-shadow:inset 0 2px 0 #006799;box-shadow:inset 0 2px 0 #006799;vertical-align:top}.wp-core-ui .button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#66c6e4!important;background:#008ec2!important;border-color:#007cb2!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:0 -1px 0 rgba(0,0,0,.1)!important;cursor:default}.wp-core-ui .button.button-primary.button-hero{-webkit-box-shadow:0 2px 0 #006799;box-shadow:0 2px 0 #006799}.wp-core-ui .button.button-primary.button-hero.active,.wp-core-ui .button.button-primary.button-hero.active:focus,.wp-core-ui .button.button-primary.button-hero.active:hover,.wp-core-ui .button.button-primary.button-hero:active{-webkit-box-shadow:inset 0 3px 0 #006799;box-shadow:inset 0 3px 0 #006799}.wp-core-ui .button-group{position:relative;display:inline-block;white-space:nowrap;font-size:0;vertical-align:middle}.wp-core-ui .button-group>.button{display:inline-block;-webkit-border-radius:0;border-radius:0;margin-left:-1px;z-index:10}.wp-core-ui .button-group>.button-primary{z-index:100}.wp-core-ui .button-group>.button:hover{z-index:20}.wp-core-ui .button-group>.button:first-child{-webkit-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.wp-core-ui .button-group>.button:last-child{-webkit-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.wp-core-ui .button-group>.button:focus{position:relative;z-index:1}@media screen and (max-width:782px){.wp-core-ui .button,.wp-core-ui .button.button-large,.wp-core-ui .button.button-small,a.preview,input#publish,input#save-post{padding:6px 14px;line-height:normal;font-size:14px;vertical-align:middle;height:auto;margin-bottom:4px}#media-upload.wp-core-ui .button{padding:0 10px 1px;height:24px;line-height:22px;font-size:13px}.media-frame.mode-grid .bulk-select .button{margin-bottom:0}.wp-core-ui .save-post-status.button{position:relative;margin:0 10px 0 14px}.wp-core-ui.wp-customizer .button{padding:0 10px 1px;font-size:13px;line-height:26px;height:28px;margin:0;vertical-align:inherit}.media-modal-content .media-toolbar-primary .media-button{margin-top:10px;margin-right:5px}.interim-login .button.button-large{height:30px;line-height:28px;padding:0 12px 2px}} \ No newline at end of file diff --git a/wp/wp-includes/css/buttons.css b/wp/wp-includes/css/buttons.css deleted file mode 100644 index 7c2b85e2..00000000 --- a/wp/wp-includes/css/buttons.css +++ /dev/null @@ -1,394 +0,0 @@ -/* ---------------------------------------------------------------------------- - -NOTE: If you edit this file, you should make sure that the CSS rules for -buttons in the following files are updated. - -* jquery-ui-dialog.css -* editor.css - -WordPress-style Buttons -======================= -Create a button by adding the `.button` class to an element. For backward -compatibility, we support several other classes (such as `.button-secondary`), -but these will *not* work with the stackable classes described below. - -Button Styles -------------- -To display a primary button style, add the `.button-primary` class to a button. - -Button Sizes ------------- -Adjust a button's size by adding the `.button-large` or `.button-small` class. - -Button States -------------- -Lock the state of a button by adding the name of the pseudoclass as -an actual class (e.g. `.hover` for `:hover`). - - -TABLE OF CONTENTS: ------------------- - 1.0 - Button Layouts - 2.0 - Default Button Style - 3.0 - Primary Button Style - 4.0 - Button Groups - 5.0 - Responsive Button Styles - ----------------------------------------------------------------------------- */ - -/* ---------------------------------------------------------------------------- - 1.0 - Button Layouts ----------------------------------------------------------------------------- */ - -.wp-core-ui .button, -.wp-core-ui .button-primary, -.wp-core-ui .button-secondary { - display: inline-block; - text-decoration: none; - font-size: 13px; - line-height: 26px; - height: 28px; - margin: 0; - padding: 0 10px 1px; - cursor: pointer; - border-width: 1px; - border-style: solid; - -webkit-appearance: none; - -webkit-border-radius: 3px; - border-radius: 3px; - white-space: nowrap; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -/* Remove the dotted border on :focus and the extra padding in Firefox */ -.wp-core-ui button::-moz-focus-inner, -.wp-core-ui input[type="reset"]::-moz-focus-inner, -.wp-core-ui input[type="button"]::-moz-focus-inner, -.wp-core-ui input[type="submit"]::-moz-focus-inner { - border-width: 0; - border-style: none; - padding: 0; -} - -.wp-core-ui .button.button-large, -.wp-core-ui .button-group.button-large .button { - height: 30px; - line-height: 28px; - padding: 0 12px 2px; -} - -.wp-core-ui .button.button-small, -.wp-core-ui .button-group.button-small .button { - height: 24px; - line-height: 22px; - padding: 0 8px 1px; - font-size: 11px; -} - -.wp-core-ui .button.button-hero, -.wp-core-ui .button-group.button-hero .button { - font-size: 14px; - height: 46px; - line-height: 44px; - padding: 0 36px; -} - -.wp-core-ui .button:active, -.wp-core-ui .button:focus { - outline: none; -} - -.wp-core-ui .button.hidden { - display: none; -} - -/* Style Reset buttons as simple text links */ - -.wp-core-ui input[type="reset"], -.wp-core-ui input[type="reset"]:hover, -.wp-core-ui input[type="reset"]:active, -.wp-core-ui input[type="reset"]:focus { - background: none; - border: none; - -webkit-box-shadow: none; - box-shadow: none; - padding: 0 2px 1px; - width: auto; -} - -/* ---------------------------------------------------------------------------- - 2.0 - Default Button Style ----------------------------------------------------------------------------- */ - -.wp-core-ui .button, -.wp-core-ui .button-secondary { - color: #555; - border-color: #cccccc; - background: #f7f7f7; - -webkit-box-shadow: 0 1px 0 #cccccc; - box-shadow: 0 1px 0 #cccccc; - vertical-align: top; -} - -.wp-core-ui p .button { - vertical-align: baseline; -} - -.wp-core-ui .button.hover, -.wp-core-ui .button:hover, -.wp-core-ui .button-secondary:hover, -.wp-core-ui .button.focus, -.wp-core-ui .button:focus, -.wp-core-ui .button-secondary:focus { - background: #fafafa; - border-color: #999; - color: #23282d; -} - -.wp-core-ui .button.focus, -.wp-core-ui .button:focus, -.wp-core-ui .button-secondary:focus, -.wp-core-ui .button-link:focus { - border-color: #5b9dd9; - -webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); - box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); -} - -.wp-core-ui .button.active, -.wp-core-ui .button.active:hover, -.wp-core-ui .button:active, -.wp-core-ui .button-secondary:active { - background: #eee; - border-color: #999; - -webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); - box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); - -webkit-transform: translateY(1px); - -ms-transform: translateY(1px); - transform: translateY(1px); -} - -.wp-core-ui .button.active:focus { - border-color: #5b9dd9; - -webkit-box-shadow: - inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ), - 0 0 3px rgba( 0, 115, 170, .8 ); - box-shadow: - inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ), - 0 0 3px rgba( 0, 115, 170, .8 ); -} - -.wp-core-ui .button[disabled], -.wp-core-ui .button:disabled, -.wp-core-ui .button.disabled, -.wp-core-ui .button-secondary[disabled], -.wp-core-ui .button-secondary:disabled, -.wp-core-ui .button-secondary.disabled, -.wp-core-ui .button-disabled { - color: #a0a5aa !important; - border-color: #ddd !important; - background: #f7f7f7 !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - text-shadow: 0 1px 0 #fff !important; - cursor: default; - -webkit-transform: none !important; - -ms-transform: none !important; - transform: none !important; -} - -/* Buttons that look like links, for a cross of good semantics with the visual */ -.wp-core-ui .button-link { - margin: 0; - padding: 0; - -webkit-box-shadow: none; - box-shadow: none; - border: 0; - -webkit-border-radius: 0; - border-radius: 0; - background: none; - outline: none; - cursor: pointer; -} - -.wp-core-ui .button-link:focus { - outline: #5b9dd9 solid 1px; -} - -/* ---------------------------------------------------------------------------- - 3.0 - Primary Button Style ----------------------------------------------------------------------------- */ - -.wp-core-ui .button-primary { - background: #0085ba; - border-color: #0073aa #006799 #006799; - -webkit-box-shadow: 0 1px 0 #006799; - box-shadow: 0 1px 0 #006799; - color: #fff; - text-decoration: none; - text-shadow: 0 -1px 1px #006799, - 1px 0 1px #006799, - 0 1px 1px #006799, - -1px 0 1px #006799; -} - -.wp-core-ui .button-primary.hover, -.wp-core-ui .button-primary:hover, -.wp-core-ui .button-primary.focus, -.wp-core-ui .button-primary:focus { - background: #008ec2; - border-color: #006799; - color: #fff; -} - -.wp-core-ui .button-primary.focus, -.wp-core-ui .button-primary:focus { - -webkit-box-shadow: 0 1px 0 #0073aa, - 0 0 2px 1px #33b3db; - box-shadow: 0 1px 0 #0073aa, - 0 0 2px 1px #33b3db; -} - -.wp-core-ui .button-primary.active, -.wp-core-ui .button-primary.active:hover, -.wp-core-ui .button-primary.active:focus, -.wp-core-ui .button-primary:active { - background: #0073aa; - border-color: #006799; - -webkit-box-shadow: inset 0 2px 0 #006799; - box-shadow: inset 0 2px 0 #006799; - vertical-align: top; -} - -.wp-core-ui .button-primary[disabled], -.wp-core-ui .button-primary:disabled, -.wp-core-ui .button-primary-disabled, -.wp-core-ui .button-primary.disabled { - color: #66c6e4 !important; - background: #008ec2 !important; - border-color: #007cb2 !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - text-shadow: 0 -1px 0 rgba( 0, 0, 0, 0.1 ) !important; - cursor: default; -} - -.wp-core-ui .button.button-primary.button-hero { - -webkit-box-shadow: 0 2px 0 #006799; - box-shadow: 0 2px 0 #006799; -} - -.wp-core-ui .button.button-primary.button-hero.active, -.wp-core-ui .button.button-primary.button-hero.active:hover, -.wp-core-ui .button.button-primary.button-hero.active:focus, -.wp-core-ui .button.button-primary.button-hero:active { - -webkit-box-shadow: inset 0 3px 0 #006799; - box-shadow: inset 0 3px 0 #006799; -} - -/* ---------------------------------------------------------------------------- - 4.0 - Button Groups ----------------------------------------------------------------------------- */ - -.wp-core-ui .button-group { - position: relative; - display: inline-block; - white-space: nowrap; - font-size: 0; - vertical-align: middle; -} - -.wp-core-ui .button-group > .button { - display: inline-block; - -webkit-border-radius: 0; - border-radius: 0; - margin-right: -1px; - z-index: 10; -} - -.wp-core-ui .button-group > .button-primary { - z-index: 100; -} - -.wp-core-ui .button-group > .button:hover { - z-index: 20; -} - -.wp-core-ui .button-group > .button:first-child { - -webkit-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.wp-core-ui .button-group > .button:last-child { - -webkit-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.wp-core-ui .button-group > .button:focus { - position: relative; - z-index: 1; -} - -/* ---------------------------------------------------------------------------- - 5.0 - Responsive Button Styles ----------------------------------------------------------------------------- */ - -@media screen and ( max-width: 782px ) { - - .wp-core-ui .button, - .wp-core-ui .button.button-large, - .wp-core-ui .button.button-small, - input#publish, - input#save-post, - a.preview { - padding: 6px 14px; - line-height: normal; - font-size: 14px; - vertical-align: middle; - height: auto; - margin-bottom: 4px; - } - - #media-upload.wp-core-ui .button { - padding: 0 10px 1px; - height: 24px; - line-height: 22px; - font-size: 13px; - } - - .media-frame.mode-grid .bulk-select .button { - margin-bottom: 0; - } - - /* Publish Metabox Options */ - .wp-core-ui .save-post-status.button { - position: relative; - margin: 0 14px 0 10px; /* 14px right margin to match all other buttons */ - } - - /* Reset responsive styles in Press This, Customizer */ - - .wp-core-ui.wp-customizer .button { - padding: 0 10px 1px; - font-size: 13px; - line-height: 26px; - height: 28px; - margin: 0; - vertical-align: inherit; - } - - .media-modal-content .media-toolbar-primary .media-button { - margin-top: 10px; - margin-left: 5px; - } - - /* Reset responsive styles on Log in button on iframed login form */ - - .interim-login .button.button-large { - height: 30px; - line-height: 28px; - padding: 0 12px 2px; - } - -} diff --git a/wp/wp-includes/css/buttons.min.css b/wp/wp-includes/css/buttons.min.css deleted file mode 100644 index 4bb9850a..00000000 --- a/wp/wp-includes/css/buttons.min.css +++ /dev/null @@ -1 +0,0 @@ -.wp-core-ui .button,.wp-core-ui .button-primary,.wp-core-ui .button-secondary{display:inline-block;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;-webkit-border-radius:3px;border-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.wp-core-ui button::-moz-focus-inner,.wp-core-ui input[type=reset]::-moz-focus-inner,.wp-core-ui input[type=button]::-moz-focus-inner,.wp-core-ui input[type=submit]::-moz-focus-inner{border-width:0;border-style:none;padding:0}.wp-core-ui .button-group.button-large .button,.wp-core-ui .button.button-large{height:30px;line-height:28px;padding:0 12px 2px}.wp-core-ui .button-group.button-small .button,.wp-core-ui .button.button-small{height:24px;line-height:22px;padding:0 8px 1px;font-size:11px}.wp-core-ui .button-group.button-hero .button,.wp-core-ui .button.button-hero{font-size:14px;height:46px;line-height:44px;padding:0 36px}.wp-core-ui .button:active,.wp-core-ui .button:focus{outline:0}.wp-core-ui .button.hidden{display:none}.wp-core-ui input[type=reset],.wp-core-ui input[type=reset]:active,.wp-core-ui input[type=reset]:focus,.wp-core-ui input[type=reset]:hover{background:0 0;border:none;-webkit-box-shadow:none;box-shadow:none;padding:0 2px 1px;width:auto}.wp-core-ui .button,.wp-core-ui .button-secondary{color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:0 1px 0 #ccc;box-shadow:0 1px 0 #ccc;vertical-align:top}.wp-core-ui p .button{vertical-align:baseline}.wp-core-ui .button-secondary:focus,.wp-core-ui .button-secondary:hover,.wp-core-ui .button.focus,.wp-core-ui .button.hover,.wp-core-ui .button:focus,.wp-core-ui .button:hover{background:#fafafa;border-color:#999;color:#23282d}.wp-core-ui .button-link:focus,.wp-core-ui .button-secondary:focus,.wp-core-ui .button.focus,.wp-core-ui .button:focus{border-color:#5b9dd9;-webkit-box-shadow:0 0 3px rgba(0,115,170,.8);box-shadow:0 0 3px rgba(0,115,170,.8)}.wp-core-ui .button-secondary:active,.wp-core-ui .button.active,.wp-core-ui .button.active:hover,.wp-core-ui .button:active{background:#eee;border-color:#999;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);-webkit-transform:translateY(1px);-ms-transform:translateY(1px);transform:translateY(1px)}.wp-core-ui .button.active:focus{border-color:#5b9dd9;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5),0 0 3px rgba(0,115,170,.8);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5),0 0 3px rgba(0,115,170,.8)}.wp-core-ui .button-disabled,.wp-core-ui .button-secondary.disabled,.wp-core-ui .button-secondary:disabled,.wp-core-ui .button-secondary[disabled],.wp-core-ui .button.disabled,.wp-core-ui .button:disabled,.wp-core-ui .button[disabled]{color:#a0a5aa!important;border-color:#ddd!important;background:#f7f7f7!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;-webkit-transform:none!important;-ms-transform:none!important;transform:none!important}.wp-core-ui .button-link{margin:0;padding:0;-webkit-box-shadow:none;box-shadow:none;border:0;-webkit-border-radius:0;border-radius:0;background:0 0;outline:0;cursor:pointer}.wp-core-ui .button-link:focus{outline:#5b9dd9 solid 1px}.wp-core-ui .button-primary{background:#0085ba;border-color:#0073aa #006799 #006799;-webkit-box-shadow:0 1px 0 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:0 -1px 1px #006799,1px 0 1px #006799,0 1px 1px #006799,-1px 0 1px #006799}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary.hover,.wp-core-ui .button-primary:focus,.wp-core-ui .button-primary:hover{background:#008ec2;border-color:#006799;color:#fff}.wp-core-ui .button-primary.focus,.wp-core-ui .button-primary:focus{-webkit-box-shadow:0 1px 0 #0073aa,0 0 2px 1px #33b3db;box-shadow:0 1px 0 #0073aa,0 0 2px 1px #33b3db}.wp-core-ui .button-primary.active,.wp-core-ui .button-primary.active:focus,.wp-core-ui .button-primary.active:hover,.wp-core-ui .button-primary:active{background:#0073aa;border-color:#006799;-webkit-box-shadow:inset 0 2px 0 #006799;box-shadow:inset 0 2px 0 #006799;vertical-align:top}.wp-core-ui .button-primary-disabled,.wp-core-ui .button-primary.disabled,.wp-core-ui .button-primary:disabled,.wp-core-ui .button-primary[disabled]{color:#66c6e4!important;background:#008ec2!important;border-color:#007cb2!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:0 -1px 0 rgba(0,0,0,.1)!important;cursor:default}.wp-core-ui .button.button-primary.button-hero{-webkit-box-shadow:0 2px 0 #006799;box-shadow:0 2px 0 #006799}.wp-core-ui .button.button-primary.button-hero.active,.wp-core-ui .button.button-primary.button-hero.active:focus,.wp-core-ui .button.button-primary.button-hero.active:hover,.wp-core-ui .button.button-primary.button-hero:active{-webkit-box-shadow:inset 0 3px 0 #006799;box-shadow:inset 0 3px 0 #006799}.wp-core-ui .button-group{position:relative;display:inline-block;white-space:nowrap;font-size:0;vertical-align:middle}.wp-core-ui .button-group>.button{display:inline-block;-webkit-border-radius:0;border-radius:0;margin-right:-1px;z-index:10}.wp-core-ui .button-group>.button-primary{z-index:100}.wp-core-ui .button-group>.button:hover{z-index:20}.wp-core-ui .button-group>.button:first-child{-webkit-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.wp-core-ui .button-group>.button:last-child{-webkit-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.wp-core-ui .button-group>.button:focus{position:relative;z-index:1}@media screen and (max-width:782px){.wp-core-ui .button,.wp-core-ui .button.button-large,.wp-core-ui .button.button-small,a.preview,input#publish,input#save-post{padding:6px 14px;line-height:normal;font-size:14px;vertical-align:middle;height:auto;margin-bottom:4px}#media-upload.wp-core-ui .button{padding:0 10px 1px;height:24px;line-height:22px;font-size:13px}.media-frame.mode-grid .bulk-select .button{margin-bottom:0}.wp-core-ui .save-post-status.button{position:relative;margin:0 14px 0 10px}.wp-core-ui.wp-customizer .button{padding:0 10px 1px;font-size:13px;line-height:26px;height:28px;margin:0;vertical-align:inherit}.media-modal-content .media-toolbar-primary .media-button{margin-top:10px;margin-left:5px}.interim-login .button.button-large{height:30px;line-height:28px;padding:0 12px 2px}} \ No newline at end of file diff --git a/wp/wp-includes/css/customize-preview-rtl.css b/wp/wp-includes/css/customize-preview-rtl.css deleted file mode 100644 index 20bfc26a..00000000 --- a/wp/wp-includes/css/customize-preview-rtl.css +++ /dev/null @@ -1,259 +0,0 @@ -.customize-partial-refreshing { - opacity: 0.25; - -webkit-transition: opacity 0.25s; - transition: opacity 0.25s; - cursor: progress; -} - -/* Override highlight when refreshing */ -.customize-partial-refreshing.widget-customizer-highlighted-widget { - -webkit-box-shadow: none; - box-shadow: none; -} - -/* Make shortcut buttons essentially invisible */ -.widget .customize-partial-edit-shortcut, -.customize-partial-edit-shortcut { - position: absolute; - float: right; - width: 1px; /* required to have a size to be focusable in Safari */ - height: 1px; - padding: 0; - margin: -1px -1px 0 0; - border: 0; - background: transparent; - color: transparent; - -webkit-box-shadow: none; - box-shadow: none; - outline: none; - z-index: 5; -} - -/** - * Styles for the actual shortcut - * - * Note that some properties are overly verbose to prevent theme interference. - */ -.widget .customize-partial-edit-shortcut button, -.customize-partial-edit-shortcut button { - position: absolute; - right: -30px; - top: 2px; - color: #fff; - width: 30px; - height: 30px; - min-width: 30px; - min-height: 30px; - line-height: 1em !important; - font-size: 18px; - z-index: 5; - background: #0085ba !important; - -webkit-border-radius: 50%; - border-radius: 50%; - border: 2px solid #fff; - -webkit-box-shadow: 0 2px 1px rgba(46,68,83,0.15); - box-shadow: 0 2px 1px rgba(46,68,83,0.15); - text-align: center; - cursor: pointer; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 3px; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-duration: .4s; - animation-duration: .4s; - opacity: 0; - pointer-events: none; - text-shadow: 0 -1px 1px #006799, - -1px 0 1px #006799, - 0 1px 1px #006799, - 1px 0 1px #006799; -} -.wp-custom-header .customize-partial-edit-shortcut button { - right: 2px -} - -.customize-partial-edit-shortcut button svg { - fill: #fff; - min-width: 20px; - min-height: 20px; - width: 20px; - height: 20px; - margin: auto; -} - -.customize-partial-edit-shortcut button:hover { - background: #008ec2 !important; /* matches primary buttons */ -} - -.customize-partial-edit-shortcut button:focus { - -webkit-box-shadow: 0 0 0 2px #008ec2; - box-shadow: 0 0 0 2px #008ec2; -} - -body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button { - -webkit-animation-name: customize-partial-edit-shortcut-bounce-appear; - animation-name: customize-partial-edit-shortcut-bounce-appear; - pointer-events: auto; -} -body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button { - -webkit-animation-name: customize-partial-edit-shortcut-bounce-disappear; - animation-name: customize-partial-edit-shortcut-bounce-disappear; - pointer-events: none; -} - -.page-sidebar-collapsed .customize-partial-edit-shortcut button, -.customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button { - visibility: hidden; -} - -@-webkit-keyframes customize-partial-edit-shortcut-bounce-appear { - from, 20%, 40%, 60%, 80%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - 0% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } - 20% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - 40% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - 80% { - -webkit-transform: scale3d(.97, .97, .97); - transform: scale3d(.97, .97, .97); - } - to { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -@keyframes customize-partial-edit-shortcut-bounce-appear { - from, 20%, 40%, 60%, 80%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - 0% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } - 20% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - 40% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - 80% { - -webkit-transform: scale3d(.97, .97, .97); - transform: scale3d(.97, .97, .97); - } - to { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -@-webkit-keyframes customize-partial-edit-shortcut-bounce-disappear { - from, 20%, 40%, 60%, 80%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - 0% { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - 20% { - -webkit-transform: scale3d(.97, .97, .97); - transform: scale3d(.97, .97, .97); - } - 40% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - 60% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9); - } - 80% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - to { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } -} - -@keyframes customize-partial-edit-shortcut-bounce-disappear { - from, 20%, 40%, 60%, 80%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - 0% { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - 20% { - -webkit-transform: scale3d(.97, .97, .97); - transform: scale3d(.97, .97, .97); - } - 40% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - 60% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9); - } - 80% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - to { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } -} - -@media screen and (max-width:800px) { - .widget .customize-partial-edit-shortcut button, - .customize-partial-edit-shortcut button { - right: -32px; - } -} - -@media screen and (max-width:320px) { - .widget .customize-partial-edit-shortcut button, - .customize-partial-edit-shortcut button { - right: -30px; - } -} diff --git a/wp/wp-includes/css/customize-preview-rtl.min.css b/wp/wp-includes/css/customize-preview-rtl.min.css deleted file mode 100644 index c3b4676c..00000000 --- a/wp/wp-includes/css/customize-preview-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.customize-partial-refreshing{opacity:.25;-webkit-transition:opacity .25s;transition:opacity .25s;cursor:progress}.customize-partial-refreshing.widget-customizer-highlighted-widget{-webkit-box-shadow:none;box-shadow:none}.customize-partial-edit-shortcut,.widget .customize-partial-edit-shortcut{position:absolute;float:right;width:1px;height:1px;padding:0;margin:-1px -1px 0 0;border:0;background:0 0;color:transparent;-webkit-box-shadow:none;box-shadow:none;outline:0;z-index:5}.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{position:absolute;right:-30px;top:2px;color:#fff;width:30px;height:30px;min-width:30px;min-height:30px;line-height:1em!important;font-size:18px;z-index:5;background:#0085ba!important;-webkit-border-radius:50%;border-radius:50%;border:2px solid #fff;-webkit-box-shadow:0 2px 1px rgba(46,68,83,.15);box-shadow:0 2px 1px rgba(46,68,83,.15);text-align:center;cursor:pointer;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:3px;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.4s;animation-duration:.4s;opacity:0;pointer-events:none;text-shadow:0 -1px 1px #006799,-1px 0 1px #006799,0 1px 1px #006799,1px 0 1px #006799}.wp-custom-header .customize-partial-edit-shortcut button{right:2px}.customize-partial-edit-shortcut button svg{fill:#fff;min-width:20px;min-height:20px;width:20px;height:20px;margin:auto}.customize-partial-edit-shortcut button:hover{background:#008ec2!important}.customize-partial-edit-shortcut button:focus{-webkit-box-shadow:0 0 0 2px #008ec2;box-shadow:0 0 0 2px #008ec2}body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button{-webkit-animation-name:customize-partial-edit-shortcut-bounce-appear;animation-name:customize-partial-edit-shortcut-bounce-appear;pointer-events:auto}body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button{-webkit-animation-name:customize-partial-edit-shortcut-bounce-disappear;animation-name:customize-partial-edit-shortcut-bounce-disappear;pointer-events:none}.customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button,.page-sidebar-collapsed .customize-partial-edit-shortcut button{visibility:hidden}@-webkit-keyframes customize-partial-edit-shortcut-bounce-appear{20%,40%,60%,80%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes customize-partial-edit-shortcut-bounce-appear{20%,40%,60%,80%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes customize-partial-edit-shortcut-bounce-disappear{20%,40%,60%,80%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}20%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}40%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}60%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}80%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes customize-partial-edit-shortcut-bounce-disappear{20%,40%,60%,80%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}20%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}40%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}60%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}80%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@media screen and (max-width:800px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{right:-32px}}@media screen and (max-width:320px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{right:-30px}} \ No newline at end of file diff --git a/wp/wp-includes/css/customize-preview.css b/wp/wp-includes/css/customize-preview.css deleted file mode 100644 index a4e24ea8..00000000 --- a/wp/wp-includes/css/customize-preview.css +++ /dev/null @@ -1,259 +0,0 @@ -.customize-partial-refreshing { - opacity: 0.25; - -webkit-transition: opacity 0.25s; - transition: opacity 0.25s; - cursor: progress; -} - -/* Override highlight when refreshing */ -.customize-partial-refreshing.widget-customizer-highlighted-widget { - -webkit-box-shadow: none; - box-shadow: none; -} - -/* Make shortcut buttons essentially invisible */ -.widget .customize-partial-edit-shortcut, -.customize-partial-edit-shortcut { - position: absolute; - float: left; - width: 1px; /* required to have a size to be focusable in Safari */ - height: 1px; - padding: 0; - margin: -1px 0 0 -1px; - border: 0; - background: transparent; - color: transparent; - -webkit-box-shadow: none; - box-shadow: none; - outline: none; - z-index: 5; -} - -/** - * Styles for the actual shortcut - * - * Note that some properties are overly verbose to prevent theme interference. - */ -.widget .customize-partial-edit-shortcut button, -.customize-partial-edit-shortcut button { - position: absolute; - left: -30px; - top: 2px; - color: #fff; - width: 30px; - height: 30px; - min-width: 30px; - min-height: 30px; - line-height: 1em !important; - font-size: 18px; - z-index: 5; - background: #0085ba !important; - -webkit-border-radius: 50%; - border-radius: 50%; - border: 2px solid #fff; - -webkit-box-shadow: 0 2px 1px rgba(46,68,83,0.15); - box-shadow: 0 2px 1px rgba(46,68,83,0.15); - text-align: center; - cursor: pointer; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 3px; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; - -webkit-animation-duration: .4s; - animation-duration: .4s; - opacity: 0; - pointer-events: none; - text-shadow: 0 -1px 1px #006799, - 1px 0 1px #006799, - 0 1px 1px #006799, - -1px 0 1px #006799; -} -.wp-custom-header .customize-partial-edit-shortcut button { - left: 2px -} - -.customize-partial-edit-shortcut button svg { - fill: #fff; - min-width: 20px; - min-height: 20px; - width: 20px; - height: 20px; - margin: auto; -} - -.customize-partial-edit-shortcut button:hover { - background: #008ec2 !important; /* matches primary buttons */ -} - -.customize-partial-edit-shortcut button:focus { - -webkit-box-shadow: 0 0 0 2px #008ec2; - box-shadow: 0 0 0 2px #008ec2; -} - -body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button { - -webkit-animation-name: customize-partial-edit-shortcut-bounce-appear; - animation-name: customize-partial-edit-shortcut-bounce-appear; - pointer-events: auto; -} -body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button { - -webkit-animation-name: customize-partial-edit-shortcut-bounce-disappear; - animation-name: customize-partial-edit-shortcut-bounce-disappear; - pointer-events: none; -} - -.page-sidebar-collapsed .customize-partial-edit-shortcut button, -.customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button { - visibility: hidden; -} - -@-webkit-keyframes customize-partial-edit-shortcut-bounce-appear { - from, 20%, 40%, 60%, 80%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - 0% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } - 20% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - 40% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - 80% { - -webkit-transform: scale3d(.97, .97, .97); - transform: scale3d(.97, .97, .97); - } - to { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -@keyframes customize-partial-edit-shortcut-bounce-appear { - from, 20%, 40%, 60%, 80%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - 0% { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } - 20% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - 40% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9); - } - 60% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - 80% { - -webkit-transform: scale3d(.97, .97, .97); - transform: scale3d(.97, .97, .97); - } - to { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } -} - -@-webkit-keyframes customize-partial-edit-shortcut-bounce-disappear { - from, 20%, 40%, 60%, 80%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - 0% { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - 20% { - -webkit-transform: scale3d(.97, .97, .97); - transform: scale3d(.97, .97, .97); - } - 40% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - 60% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9); - } - 80% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - to { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } -} - -@keyframes customize-partial-edit-shortcut-bounce-disappear { - from, 20%, 40%, 60%, 80%, to { - -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); - } - 0% { - opacity: 1; - -webkit-transform: scale3d(1, 1, 1); - transform: scale3d(1, 1, 1); - } - 20% { - -webkit-transform: scale3d(.97, .97, .97); - transform: scale3d(.97, .97, .97); - } - 40% { - opacity: 1; - -webkit-transform: scale3d(1.03, 1.03, 1.03); - transform: scale3d(1.03, 1.03, 1.03); - } - 60% { - -webkit-transform: scale3d(.9, .9, .9); - transform: scale3d(.9, .9, .9); - } - 80% { - -webkit-transform: scale3d(1.1, 1.1, 1.1); - transform: scale3d(1.1, 1.1, 1.1); - } - to { - opacity: 0; - -webkit-transform: scale3d(.3, .3, .3); - transform: scale3d(.3, .3, .3); - } -} - -@media screen and (max-width:800px) { - .widget .customize-partial-edit-shortcut button, - .customize-partial-edit-shortcut button { - left: -32px; - } -} - -@media screen and (max-width:320px) { - .widget .customize-partial-edit-shortcut button, - .customize-partial-edit-shortcut button { - left: -30px; - } -} diff --git a/wp/wp-includes/css/customize-preview.min.css b/wp/wp-includes/css/customize-preview.min.css deleted file mode 100644 index 6489da56..00000000 --- a/wp/wp-includes/css/customize-preview.min.css +++ /dev/null @@ -1 +0,0 @@ -.customize-partial-refreshing{opacity:.25;-webkit-transition:opacity .25s;transition:opacity .25s;cursor:progress}.customize-partial-refreshing.widget-customizer-highlighted-widget{-webkit-box-shadow:none;box-shadow:none}.customize-partial-edit-shortcut,.widget .customize-partial-edit-shortcut{position:absolute;float:left;width:1px;height:1px;padding:0;margin:-1px 0 0 -1px;border:0;background:0 0;color:transparent;-webkit-box-shadow:none;box-shadow:none;outline:0;z-index:5}.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{position:absolute;left:-30px;top:2px;color:#fff;width:30px;height:30px;min-width:30px;min-height:30px;line-height:1em!important;font-size:18px;z-index:5;background:#0085ba!important;-webkit-border-radius:50%;border-radius:50%;border:2px solid #fff;-webkit-box-shadow:0 2px 1px rgba(46,68,83,.15);box-shadow:0 2px 1px rgba(46,68,83,.15);text-align:center;cursor:pointer;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:3px;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.4s;animation-duration:.4s;opacity:0;pointer-events:none;text-shadow:0 -1px 1px #006799,1px 0 1px #006799,0 1px 1px #006799,-1px 0 1px #006799}.wp-custom-header .customize-partial-edit-shortcut button{left:2px}.customize-partial-edit-shortcut button svg{fill:#fff;min-width:20px;min-height:20px;width:20px;height:20px;margin:auto}.customize-partial-edit-shortcut button:hover{background:#008ec2!important}.customize-partial-edit-shortcut button:focus{-webkit-box-shadow:0 0 0 2px #008ec2;box-shadow:0 0 0 2px #008ec2}body.customize-partial-edit-shortcuts-shown .customize-partial-edit-shortcut button{-webkit-animation-name:customize-partial-edit-shortcut-bounce-appear;animation-name:customize-partial-edit-shortcut-bounce-appear;pointer-events:auto}body.customize-partial-edit-shortcuts-hidden .customize-partial-edit-shortcut button{-webkit-animation-name:customize-partial-edit-shortcut-bounce-disappear;animation-name:customize-partial-edit-shortcut-bounce-disappear;pointer-events:none}.customize-partial-edit-shortcut-hidden .customize-partial-edit-shortcut button,.page-sidebar-collapsed .customize-partial-edit-shortcut button{visibility:hidden}@-webkit-keyframes customize-partial-edit-shortcut-bounce-appear{20%,40%,60%,80%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes customize-partial-edit-shortcut-bounce-appear{20%,40%,60%,80%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes customize-partial-edit-shortcut-bounce-disappear{20%,40%,60%,80%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}20%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}40%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}60%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}80%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes customize-partial-edit-shortcut-bounce-disappear{20%,40%,60%,80%,from,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}20%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}40%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}60%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}80%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}to{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@media screen and (max-width:800px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{left:-32px}}@media screen and (max-width:320px){.customize-partial-edit-shortcut button,.widget .customize-partial-edit-shortcut button{left:-30px}} \ No newline at end of file diff --git a/wp/wp-includes/css/dashicons.css b/wp/wp-includes/css/dashicons.css deleted file mode 100644 index 65e6de03..00000000 --- a/wp/wp-includes/css/dashicons.css +++ /dev/null @@ -1,1027 +0,0 @@ -@font-face { - font-family: dashicons; - src: url(../fonts/dashicons.eot); -} - -@font-face { - font-family: dashicons; - src: url(data:application/font-woff;charset=utf-8;base64,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) format('woff'), - url(../fonts/dashicons.ttf) format("truetype"), - url(../fonts/dashicons.svg#dashicons) format("svg"); - font-weight: normal; - font-style: normal; -} - -.dashicons, -.dashicons-before:before { - display: inline-block; - width: 20px; - height: 20px; - font-size: 20px; - line-height: 1; - font-family: dashicons; - text-decoration: inherit; - font-weight: normal; - font-style: normal; - vertical-align: top; - text-align: center; - -webkit-transition: color .1s ease-in 0; - transition: color .1s ease-in 0; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -/* Admin Menu Icons */ - -.dashicons-menu:before { - content: "\f333"; -} - -.dashicons-admin-site:before { - content: "\f319"; -} - -.dashicons-dashboard:before { - content: "\f226"; -} - -.dashicons-admin-media:before { - content: "\f104"; -} - -.dashicons-admin-page:before { - content: "\f105"; -} - -.dashicons-admin-comments:before { - content: "\f101"; -} - -.dashicons-admin-appearance:before { - content: "\f100"; -} - -.dashicons-admin-plugins:before { - content: "\f106"; -} - -.dashicons-admin-users:before { - content: "\f110"; -} - -.dashicons-admin-tools:before { - content: "\f107"; -} - -.dashicons-admin-settings:before { - content: "\f108"; -} - -.dashicons-admin-network:before { - content: "\f112"; -} - -.dashicons-admin-generic:before { - content: "\f111"; -} - -.dashicons-admin-home:before { - content: "\f102"; -} - -.dashicons-admin-collapse:before { - content: "\f148"; -} - -.dashicons-filter:before { - content: "\f536"; -} - -.dashicons-admin-customizer:before { - content: "\f540"; -} - -.dashicons-admin-multisite:before { - content: "\f541"; -} - - -/* Both Admin Menu and Post Formats */ - -.dashicons-admin-links:before, -.dashicons-format-links:before { - content: "\f103"; -} - -.dashicons-admin-post:before, -.dashicons-format-standard:before { - content: "\f109"; -} - - -/* Post Format Icons */ - -.dashicons-format-image:before { - content: "\f128"; -} - -.dashicons-format-gallery:before { - content: "\f161"; -} - -.dashicons-format-audio:before { - content: "\f127"; -} - -.dashicons-format-video:before { - content: "\f126"; -} - -.dashicons-format-chat:before { - content: "\f125"; -} - -.dashicons-format-status:before { - content: "\f130"; -} - -.dashicons-format-aside:before { - content: "\f123"; -} - -.dashicons-format-quote:before { - content: "\f122"; -} - - -/* Welcome Screen Icons */ - -.dashicons-welcome-write-blog:before, -.dashicons-welcome-edit-page:before { - content: "\f119"; -} - -.dashicons-welcome-add-page:before { - content: "\f133"; -} - -.dashicons-welcome-view-site:before { - content: "\f115"; -} - -.dashicons-welcome-widgets-menus:before { - content: "\f116"; -} - -.dashicons-welcome-comments:before { - content: "\f117"; -} - -.dashicons-welcome-learn-more:before { - content: "\f118"; -} - - -/* Image Editing Icons */ - -.dashicons-image-crop:before { - content: "\f165"; -} - -.dashicons-image-rotate:before { - content: "\f531"; -} - - -.dashicons-image-rotate-left:before { - content: "\f166"; -} - -.dashicons-image-rotate-right:before { - content: "\f167"; -} - -.dashicons-image-flip-vertical:before { - content: "\f168"; -} - -.dashicons-image-flip-horizontal:before { - content: "\f169"; -} - -.dashicons-image-filter:before { - content: "\f533"; -} - - -/* Both Image Editing and TinyMCE */ - -.dashicons-undo:before { - content: "\f171"; -} - -.dashicons-redo:before { - content: "\f172"; -} - -/* TinyMCE Icons */ - -.dashicons-editor-bold:before { - content: "\f200"; -} - -.dashicons-editor-italic:before { - content: "\f201"; -} - -.dashicons-editor-ul:before { - content: "\f203"; -} - -.dashicons-editor-ol:before { - content: "\f204"; -} - -.dashicons-editor-quote:before { - content: "\f205"; -} - -.dashicons-editor-alignleft:before { - content: "\f206"; -} - -.dashicons-editor-aligncenter:before { - content: "\f207"; -} - -.dashicons-editor-alignright:before { - content: "\f208"; -} - -.dashicons-editor-insertmore:before { - content: "\f209"; -} - -.dashicons-editor-spellcheck:before { - content: "\f210"; -} - -.dashicons-editor-distractionfree:before, -.dashicons-editor-expand:before { - content: "\f211"; -} - -.dashicons-editor-contract:before { - content: "\f506"; -} - -.dashicons-editor-kitchensink:before { - content: "\f212"; -} - -.dashicons-editor-underline:before { - content: "\f213"; -} - -.dashicons-editor-justify:before { - content: "\f214"; -} - -.dashicons-editor-textcolor:before { - content: "\f215"; -} - -.dashicons-editor-paste-word:before { - content: "\f216"; -} - -.dashicons-editor-paste-text:before { - content: "\f217"; -} - -.dashicons-editor-removeformatting:before { - content: "\f218"; -} - -.dashicons-editor-video:before { - content: "\f219"; -} - -.dashicons-editor-customchar:before { - content: "\f220"; -} - -.dashicons-editor-outdent:before { - content: "\f221"; -} - -.dashicons-editor-indent:before { - content: "\f222"; -} - -.dashicons-editor-help:before { - content: "\f223"; -} - -.dashicons-editor-strikethrough:before { - content: "\f224"; -} - -.dashicons-editor-unlink:before { - content: "\f225"; -} - -.dashicons-editor-rtl:before { - content: "\f320"; -} - -.dashicons-editor-break:before { - content: "\f474"; -} - -.dashicons-editor-code:before { - content: "\f475"; -} - -.dashicons-editor-paragraph:before { - content: "\f476"; -} - -.dashicons-editor-table:before { - content: "\f535"; -} - -/* Post Icons */ - -.dashicons-align-left:before { - content: "\f135"; -} - -.dashicons-align-right:before { - content: "\f136"; -} - -.dashicons-align-center:before { - content: "\f134"; -} - -.dashicons-align-none:before { - content: "\f138"; -} - -.dashicons-lock:before { - content: "\f160"; -} - -.dashicons-unlock:before { - content: "\f528"; -} - -.dashicons-calendar:before { - content: "\f145"; -} - -.dashicons-calendar-alt:before { - content: "\f508"; -} - -.dashicons-visibility:before { - content: "\f177"; -} - -.dashicons-hidden:before { - content: "\f530"; -} - -.dashicons-post-status:before { - content: "\f173"; -} - -.dashicons-edit:before { - content: "\f464"; -} - -.dashicons-post-trash:before, -.dashicons-trash:before { - content: "\f182"; -} - -.dashicons-sticky:before { - content: "\f537"; -} - - -/* Sorting */ - -.dashicons-external:before { - content: "\f504"; -} - -.dashicons-arrow-up:before { - content: "\f142"; -} - -.dashicons-arrow-down:before { - content: "\f140"; -} - -.dashicons-arrow-left:before { - content: "\f141"; -} - -.dashicons-arrow-right:before { - content: "\f139"; -} - -.dashicons-arrow-up-alt:before { - content: "\f342"; -} - -.dashicons-arrow-down-alt:before { - content: "\f346"; -} - -.dashicons-arrow-left-alt:before { - content: "\f340"; -} - -.dashicons-arrow-right-alt:before { - content: "\f344"; -} - -.dashicons-arrow-up-alt2:before { - content: "\f343"; -} - -.dashicons-arrow-down-alt2:before { - content: "\f347"; -} - -.dashicons-arrow-left-alt2:before { - content: "\f341"; -} - -.dashicons-arrow-right-alt2:before { - content: "\f345"; -} - -.dashicons-leftright:before { - content: "\f229"; -} - -.dashicons-sort:before { - content: "\f156"; -} - -.dashicons-randomize:before { - content: "\f503"; -} - -.dashicons-list-view:before { - content: "\f163"; -} - -.dashicons-exerpt-view:before, /* Misspelled. Use .dashicons-excerpt-view instead. */ -.dashicons-excerpt-view:before { - content: "\f164"; -} - -.dashicons-grid-view:before { - content: "\f509"; -} - -.dashicons-move:before { - content: "\f545"; -} - - -/* WPorg specific icons: Jobs, Profiles, WordCamps */ - -.dashicons-hammer:before { - content: "\f308"; -} - -.dashicons-art:before { - content: "\f309"; -} - -.dashicons-migrate:before { - content: "\f310"; -} - -.dashicons-performance:before { - content: "\f311"; -} - -.dashicons-universal-access:before { - content: "\f483"; -} - -.dashicons-universal-access-alt:before { - content: "\f507"; -} - -.dashicons-tickets:before { - content: "\f486"; -} - -.dashicons-nametag:before { - content: "\f484"; -} - -.dashicons-clipboard:before { - content: "\f481"; -} - -.dashicons-heart:before { - content: "\f487"; -} - -.dashicons-megaphone:before { - content: "\f488"; -} - -.dashicons-schedule:before { - content: "\f489"; -} - - -/* Internal/Products */ - -.dashicons-wordpress:before { - content: "\f120"; -} - -.dashicons-wordpress-alt:before { - content: "\f324"; -} - -.dashicons-pressthis:before { - content: "\f157"; -} - -.dashicons-update:before { - content: "\f463"; -} - -.dashicons-screenoptions:before { - content: "\f180"; -} - -.dashicons-cart:before { - content: "\f174"; -} - -.dashicons-feedback:before { - content: "\f175"; -} - -.dashicons-cloud:before { - content: "\f176"; -} - -.dashicons-translation:before { - content: "\f326"; -} - - -/* Taxonomies */ - -.dashicons-tag:before { - content: "\f323"; -} - -.dashicons-category:before { - content: "\f318"; -} - - -/* Widget icons */ - -.dashicons-archive:before { - content: "\f480"; -} - -.dashicons-tagcloud:before { - content: "\f479"; -} - -.dashicons-text:before { - content: "\f478"; -} - - -/* Media icons */ - -.dashicons-media-archive:before { - content: "\f501"; -} - -.dashicons-media-audio:before { - content: "\f500"; -} - -.dashicons-media-code:before { - content: "\f499"; -} - -.dashicons-media-default:before { - content: "\f498"; -} - -.dashicons-media-document:before { - content: "\f497"; -} - -.dashicons-media-interactive:before { - content: "\f496"; -} - -.dashicons-media-spreadsheet:before { - content: "\f495"; -} - -.dashicons-media-text:before { - content: "\f491"; -} - -.dashicons-media-video:before { - content: "\f490"; -} - -.dashicons-playlist-audio:before { - content: "\f492"; -} - -.dashicons-playlist-video:before { - content: "\f493"; -} - -.dashicons-controls-play:before { - content: "\f522"; -} - -.dashicons-controls-pause:before { - content: "\f523"; -} - -.dashicons-controls-forward:before { - content: "\f519"; -} - -.dashicons-controls-skipforward:before { - content: "\f517"; -} - -.dashicons-controls-back:before { - content: "\f518"; -} - -.dashicons-controls-skipback:before { - content: "\f516"; -} - -.dashicons-controls-repeat:before { - content: "\f515"; -} - -.dashicons-controls-volumeon:before { - content: "\f521"; -} - -.dashicons-controls-volumeoff:before { - content: "\f520"; -} - - -/* Alerts/Notifications/Flags */ - -.dashicons-yes:before { - content: "\f147"; -} - -.dashicons-no:before { - content: "\f158"; -} - -.dashicons-no-alt:before { - content: "\f335"; -} - -.dashicons-plus:before { - content: "\f132"; -} - -.dashicons-plus-alt:before { - content: "\f502"; -} - -.dashicons-plus-alt2:before { - content: "\f543"; -} - -.dashicons-minus:before { - content: "\f460"; -} - -.dashicons-dismiss:before { - content: "\f153"; -} - -.dashicons-marker:before { - content: "\f159"; -} - -.dashicons-star-filled:before { - content: "\f155"; -} - -.dashicons-star-half:before { - content: "\f459"; -} - -.dashicons-star-empty:before { - content: "\f154"; -} - -.dashicons-flag:before { - content: "\f227"; -} - -.dashicons-info:before { - content: "\f348"; -} - -.dashicons-warning:before { - content: "\f534"; -} - - -/* Social Icons */ - -.dashicons-share:before { - content: "\f237"; -} - -.dashicons-share1:before { - content: "\f237"; -} - -.dashicons-share-alt:before { - content: "\f240"; -} - -.dashicons-share-alt2:before { - content: "\f242"; -} - -.dashicons-twitter:before { - content: "\f301"; -} - -.dashicons-rss:before { - content: "\f303"; -} - -.dashicons-email:before { - content: "\f465"; -} - -.dashicons-email-alt:before { - content: "\f466"; -} - -.dashicons-facebook:before { - content: "\f304"; -} - -.dashicons-facebook-alt:before { - content: "\f305"; -} - -.dashicons-networking:before { - content: "\f325"; -} - -.dashicons-googleplus:before { - content: "\f462"; -} - - -/* Misc/CPT */ - -.dashicons-location:before { - content: "\f230"; -} - -.dashicons-location-alt:before { - content: "\f231"; -} - -.dashicons-camera:before { - content: "\f306"; -} - -.dashicons-images-alt:before { - content: "\f232"; -} - -.dashicons-images-alt2:before { - content: "\f233"; -} - -.dashicons-video-alt:before { - content: "\f234"; -} - -.dashicons-video-alt2:before { - content: "\f235"; -} - -.dashicons-video-alt3:before { - content: "\f236"; -} - -.dashicons-vault:before { - content: "\f178"; -} - -.dashicons-shield:before { - content: "\f332"; -} - -.dashicons-shield-alt:before { - content: "\f334"; -} - -.dashicons-sos:before { - content: "\f468"; -} - -.dashicons-search:before { - content: "\f179"; -} - -.dashicons-slides:before { - content: "\f181"; -} - -.dashicons-analytics:before { - content: "\f183"; -} - -.dashicons-chart-pie:before { - content: "\f184"; -} - -.dashicons-chart-bar:before { - content: "\f185"; -} - -.dashicons-chart-line:before { - content: "\f238"; -} - -.dashicons-chart-area:before { - content: "\f239"; -} - -.dashicons-groups:before { - content: "\f307"; -} - -.dashicons-businessman:before { - content: "\f338"; -} - -.dashicons-id:before { - content: "\f336"; -} - -.dashicons-id-alt:before { - content: "\f337"; -} - -.dashicons-products:before { - content: "\f312"; -} - -.dashicons-awards:before { - content: "\f313"; -} - -.dashicons-forms:before { - content: "\f314"; -} - -.dashicons-testimonial:before { - content: "\f473"; -} - -.dashicons-portfolio:before { - content: "\f322"; -} - -.dashicons-book:before { - content: "\f330"; -} - -.dashicons-book-alt:before { - content: "\f331"; -} - -.dashicons-download:before { - content: "\f316"; -} - -.dashicons-upload:before { - content: "\f317"; -} - -.dashicons-backup:before { - content: "\f321"; -} - -.dashicons-clock:before { - content: "\f469"; -} - -.dashicons-lightbulb:before { - content: "\f339"; -} - -.dashicons-microphone:before { - content: "\f482"; -} - -.dashicons-desktop:before { - content: "\f472"; -} - -.dashicons-laptop:before { - content: "\f547"; -} - -.dashicons-tablet:before { - content: "\f471"; -} - -.dashicons-smartphone:before { - content: "\f470"; -} - -.dashicons-phone:before { - content: "\f525"; -} - -.dashicons-smiley:before { - content: "\f328"; -} - -.dashicons-index-card:before { - content: "\f510"; -} - -.dashicons-carrot:before { - content: "\f511"; -} - -.dashicons-building:before { - content: "\f512"; -} - -.dashicons-store:before { - content: "\f513"; -} - -.dashicons-album:before { - content: "\f514"; -} - -.dashicons-palmtree:before { - content: "\f527"; -} - -.dashicons-tickets-alt:before { - content: "\f524"; -} - -.dashicons-money:before { - content: "\f526"; -} - -.dashicons-thumbs-up:before { - content: "\f529"; -} - -.dashicons-thumbs-down:before { - content: "\f542"; -} - -.dashicons-layout:before { - content: "\f538"; -} - -.dashicons-paperclip:before { - content: "\f546"; -} \ No newline at end of file diff --git a/wp/wp-includes/css/dashicons.min.css b/wp/wp-includes/css/dashicons.min.css deleted file mode 100644 index 63017fc0..00000000 --- a/wp/wp-includes/css/dashicons.min.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:dashicons;src:url(../fonts/dashicons.eot)}@font-face{font-family:dashicons;src:url(data:application/font-woff;charset=utf-8;base64,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) format('woff'),url(../fonts/dashicons.ttf) format("truetype"),url(../fonts/dashicons.svg#dashicons) format("svg");font-weight:400;font-style:normal}.dashicons,.dashicons-before:before{display:inline-block;width:20px;height:20px;font-size:20px;line-height:1;font-family:dashicons;text-decoration:inherit;font-weight:400;font-style:normal;vertical-align:top;text-align:center;-webkit-transition:color .1s ease-in 0;transition:color .1s ease-in 0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.dashicons-menu:before{content:"\f333"}.dashicons-admin-site:before{content:"\f319"}.dashicons-dashboard:before{content:"\f226"}.dashicons-admin-media:before{content:"\f104"}.dashicons-admin-page:before{content:"\f105"}.dashicons-admin-comments:before{content:"\f101"}.dashicons-admin-appearance:before{content:"\f100"}.dashicons-admin-plugins:before{content:"\f106"}.dashicons-admin-users:before{content:"\f110"}.dashicons-admin-tools:before{content:"\f107"}.dashicons-admin-settings:before{content:"\f108"}.dashicons-admin-network:before{content:"\f112"}.dashicons-admin-generic:before{content:"\f111"}.dashicons-admin-home:before{content:"\f102"}.dashicons-admin-collapse:before{content:"\f148"}.dashicons-filter:before{content:"\f536"}.dashicons-admin-customizer:before{content:"\f540"}.dashicons-admin-multisite:before{content:"\f541"}.dashicons-admin-links:before,.dashicons-format-links:before{content:"\f103"}.dashicons-admin-post:before,.dashicons-format-standard:before{content:"\f109"}.dashicons-format-image:before{content:"\f128"}.dashicons-format-gallery:before{content:"\f161"}.dashicons-format-audio:before{content:"\f127"}.dashicons-format-video:before{content:"\f126"}.dashicons-format-chat:before{content:"\f125"}.dashicons-format-status:before{content:"\f130"}.dashicons-format-aside:before{content:"\f123"}.dashicons-format-quote:before{content:"\f122"}.dashicons-welcome-edit-page:before,.dashicons-welcome-write-blog:before{content:"\f119"}.dashicons-welcome-add-page:before{content:"\f133"}.dashicons-welcome-view-site:before{content:"\f115"}.dashicons-welcome-widgets-menus:before{content:"\f116"}.dashicons-welcome-comments:before{content:"\f117"}.dashicons-welcome-learn-more:before{content:"\f118"}.dashicons-image-crop:before{content:"\f165"}.dashicons-image-rotate:before{content:"\f531"}.dashicons-image-rotate-left:before{content:"\f166"}.dashicons-image-rotate-right:before{content:"\f167"}.dashicons-image-flip-vertical:before{content:"\f168"}.dashicons-image-flip-horizontal:before{content:"\f169"}.dashicons-image-filter:before{content:"\f533"}.dashicons-undo:before{content:"\f171"}.dashicons-redo:before{content:"\f172"}.dashicons-editor-bold:before{content:"\f200"}.dashicons-editor-italic:before{content:"\f201"}.dashicons-editor-ul:before{content:"\f203"}.dashicons-editor-ol:before{content:"\f204"}.dashicons-editor-quote:before{content:"\f205"}.dashicons-editor-alignleft:before{content:"\f206"}.dashicons-editor-aligncenter:before{content:"\f207"}.dashicons-editor-alignright:before{content:"\f208"}.dashicons-editor-insertmore:before{content:"\f209"}.dashicons-editor-spellcheck:before{content:"\f210"}.dashicons-editor-distractionfree:before,.dashicons-editor-expand:before{content:"\f211"}.dashicons-editor-contract:before{content:"\f506"}.dashicons-editor-kitchensink:before{content:"\f212"}.dashicons-editor-underline:before{content:"\f213"}.dashicons-editor-justify:before{content:"\f214"}.dashicons-editor-textcolor:before{content:"\f215"}.dashicons-editor-paste-word:before{content:"\f216"}.dashicons-editor-paste-text:before{content:"\f217"}.dashicons-editor-removeformatting:before{content:"\f218"}.dashicons-editor-video:before{content:"\f219"}.dashicons-editor-customchar:before{content:"\f220"}.dashicons-editor-outdent:before{content:"\f221"}.dashicons-editor-indent:before{content:"\f222"}.dashicons-editor-help:before{content:"\f223"}.dashicons-editor-strikethrough:before{content:"\f224"}.dashicons-editor-unlink:before{content:"\f225"}.dashicons-editor-rtl:before{content:"\f320"}.dashicons-editor-break:before{content:"\f474"}.dashicons-editor-code:before{content:"\f475"}.dashicons-editor-paragraph:before{content:"\f476"}.dashicons-editor-table:before{content:"\f535"}.dashicons-align-left:before{content:"\f135"}.dashicons-align-right:before{content:"\f136"}.dashicons-align-center:before{content:"\f134"}.dashicons-align-none:before{content:"\f138"}.dashicons-lock:before{content:"\f160"}.dashicons-unlock:before{content:"\f528"}.dashicons-calendar:before{content:"\f145"}.dashicons-calendar-alt:before{content:"\f508"}.dashicons-visibility:before{content:"\f177"}.dashicons-hidden:before{content:"\f530"}.dashicons-post-status:before{content:"\f173"}.dashicons-edit:before{content:"\f464"}.dashicons-post-trash:before,.dashicons-trash:before{content:"\f182"}.dashicons-sticky:before{content:"\f537"}.dashicons-external:before{content:"\f504"}.dashicons-arrow-up:before{content:"\f142"}.dashicons-arrow-down:before{content:"\f140"}.dashicons-arrow-left:before{content:"\f141"}.dashicons-arrow-right:before{content:"\f139"}.dashicons-arrow-up-alt:before{content:"\f342"}.dashicons-arrow-down-alt:before{content:"\f346"}.dashicons-arrow-left-alt:before{content:"\f340"}.dashicons-arrow-right-alt:before{content:"\f344"}.dashicons-arrow-up-alt2:before{content:"\f343"}.dashicons-arrow-down-alt2:before{content:"\f347"}.dashicons-arrow-left-alt2:before{content:"\f341"}.dashicons-arrow-right-alt2:before{content:"\f345"}.dashicons-leftright:before{content:"\f229"}.dashicons-sort:before{content:"\f156"}.dashicons-randomize:before{content:"\f503"}.dashicons-list-view:before{content:"\f163"}.dashicons-excerpt-view:before,.dashicons-exerpt-view:before{content:"\f164"}.dashicons-grid-view:before{content:"\f509"}.dashicons-move:before{content:"\f545"}.dashicons-hammer:before{content:"\f308"}.dashicons-art:before{content:"\f309"}.dashicons-migrate:before{content:"\f310"}.dashicons-performance:before{content:"\f311"}.dashicons-universal-access:before{content:"\f483"}.dashicons-universal-access-alt:before{content:"\f507"}.dashicons-tickets:before{content:"\f486"}.dashicons-nametag:before{content:"\f484"}.dashicons-clipboard:before{content:"\f481"}.dashicons-heart:before{content:"\f487"}.dashicons-megaphone:before{content:"\f488"}.dashicons-schedule:before{content:"\f489"}.dashicons-wordpress:before{content:"\f120"}.dashicons-wordpress-alt:before{content:"\f324"}.dashicons-pressthis:before{content:"\f157"}.dashicons-update:before{content:"\f463"}.dashicons-screenoptions:before{content:"\f180"}.dashicons-cart:before{content:"\f174"}.dashicons-feedback:before{content:"\f175"}.dashicons-cloud:before{content:"\f176"}.dashicons-translation:before{content:"\f326"}.dashicons-tag:before{content:"\f323"}.dashicons-category:before{content:"\f318"}.dashicons-archive:before{content:"\f480"}.dashicons-tagcloud:before{content:"\f479"}.dashicons-text:before{content:"\f478"}.dashicons-media-archive:before{content:"\f501"}.dashicons-media-audio:before{content:"\f500"}.dashicons-media-code:before{content:"\f499"}.dashicons-media-default:before{content:"\f498"}.dashicons-media-document:before{content:"\f497"}.dashicons-media-interactive:before{content:"\f496"}.dashicons-media-spreadsheet:before{content:"\f495"}.dashicons-media-text:before{content:"\f491"}.dashicons-media-video:before{content:"\f490"}.dashicons-playlist-audio:before{content:"\f492"}.dashicons-playlist-video:before{content:"\f493"}.dashicons-controls-play:before{content:"\f522"}.dashicons-controls-pause:before{content:"\f523"}.dashicons-controls-forward:before{content:"\f519"}.dashicons-controls-skipforward:before{content:"\f517"}.dashicons-controls-back:before{content:"\f518"}.dashicons-controls-skipback:before{content:"\f516"}.dashicons-controls-repeat:before{content:"\f515"}.dashicons-controls-volumeon:before{content:"\f521"}.dashicons-controls-volumeoff:before{content:"\f520"}.dashicons-yes:before{content:"\f147"}.dashicons-no:before{content:"\f158"}.dashicons-no-alt:before{content:"\f335"}.dashicons-plus:before{content:"\f132"}.dashicons-plus-alt:before{content:"\f502"}.dashicons-plus-alt2:before{content:"\f543"}.dashicons-minus:before{content:"\f460"}.dashicons-dismiss:before{content:"\f153"}.dashicons-marker:before{content:"\f159"}.dashicons-star-filled:before{content:"\f155"}.dashicons-star-half:before{content:"\f459"}.dashicons-star-empty:before{content:"\f154"}.dashicons-flag:before{content:"\f227"}.dashicons-info:before{content:"\f348"}.dashicons-warning:before{content:"\f534"}.dashicons-share:before{content:"\f237"}.dashicons-share1:before{content:"\f237"}.dashicons-share-alt:before{content:"\f240"}.dashicons-share-alt2:before{content:"\f242"}.dashicons-twitter:before{content:"\f301"}.dashicons-rss:before{content:"\f303"}.dashicons-email:before{content:"\f465"}.dashicons-email-alt:before{content:"\f466"}.dashicons-facebook:before{content:"\f304"}.dashicons-facebook-alt:before{content:"\f305"}.dashicons-networking:before{content:"\f325"}.dashicons-googleplus:before{content:"\f462"}.dashicons-location:before{content:"\f230"}.dashicons-location-alt:before{content:"\f231"}.dashicons-camera:before{content:"\f306"}.dashicons-images-alt:before{content:"\f232"}.dashicons-images-alt2:before{content:"\f233"}.dashicons-video-alt:before{content:"\f234"}.dashicons-video-alt2:before{content:"\f235"}.dashicons-video-alt3:before{content:"\f236"}.dashicons-vault:before{content:"\f178"}.dashicons-shield:before{content:"\f332"}.dashicons-shield-alt:before{content:"\f334"}.dashicons-sos:before{content:"\f468"}.dashicons-search:before{content:"\f179"}.dashicons-slides:before{content:"\f181"}.dashicons-analytics:before{content:"\f183"}.dashicons-chart-pie:before{content:"\f184"}.dashicons-chart-bar:before{content:"\f185"}.dashicons-chart-line:before{content:"\f238"}.dashicons-chart-area:before{content:"\f239"}.dashicons-groups:before{content:"\f307"}.dashicons-businessman:before{content:"\f338"}.dashicons-id:before{content:"\f336"}.dashicons-id-alt:before{content:"\f337"}.dashicons-products:before{content:"\f312"}.dashicons-awards:before{content:"\f313"}.dashicons-forms:before{content:"\f314"}.dashicons-testimonial:before{content:"\f473"}.dashicons-portfolio:before{content:"\f322"}.dashicons-book:before{content:"\f330"}.dashicons-book-alt:before{content:"\f331"}.dashicons-download:before{content:"\f316"}.dashicons-upload:before{content:"\f317"}.dashicons-backup:before{content:"\f321"}.dashicons-clock:before{content:"\f469"}.dashicons-lightbulb:before{content:"\f339"}.dashicons-microphone:before{content:"\f482"}.dashicons-desktop:before{content:"\f472"}.dashicons-laptop:before{content:"\f547"}.dashicons-tablet:before{content:"\f471"}.dashicons-smartphone:before{content:"\f470"}.dashicons-phone:before{content:"\f525"}.dashicons-smiley:before{content:"\f328"}.dashicons-index-card:before{content:"\f510"}.dashicons-carrot:before{content:"\f511"}.dashicons-building:before{content:"\f512"}.dashicons-store:before{content:"\f513"}.dashicons-album:before{content:"\f514"}.dashicons-palmtree:before{content:"\f527"}.dashicons-tickets-alt:before{content:"\f524"}.dashicons-money:before{content:"\f526"}.dashicons-thumbs-up:before{content:"\f529"}.dashicons-thumbs-down:before{content:"\f542"}.dashicons-layout:before{content:"\f538"}.dashicons-paperclip:before{content:"\f546"} \ No newline at end of file diff --git a/wp/wp-includes/css/editor-rtl.css b/wp/wp-includes/css/editor-rtl.css deleted file mode 100644 index 99dda5e7..00000000 --- a/wp/wp-includes/css/editor-rtl.css +++ /dev/null @@ -1,1905 +0,0 @@ -/*------------------------------------------------------------------------------ - TinyMCE and Quicklinks toolbars -------------------------------------------------------------------------------*/ - -/* TinyMCE widgets/containers */ - -.mce-container, -.mce-container *, -.mce-widget, -.mce-widget * { - color: inherit; - font-family: inherit; -} - -.mce-container .mce-monospace, -.mce-widget .mce-monospace { - font-family: Consolas, Monaco, monospace; - font-size: 13px; - line-height: 150%; -} - -/* TinyMCE windows */ -#mce-modal-block, -#mce-modal-block.mce-fade { - opacity: 0.7; - filter: alpha(opacity=70); - -webkit-transition: none; - transition: none; -} - -.mce-window { - -webkit-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); - box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); - -webkit-font-smoothing: subpixel-antialiased; - -webkit-transition: none; - transition: none; -} - -.mce-window .mce-container-body.mce-abs-layout { - overflow: visible; -} - -.mce-window .mce-window-head { - background: #fcfcfc; - border-bottom: 1px solid #ddd; - padding: 0; - min-height: 36px; -} - -.mce-window .mce-window-head .mce-title { - color: #444; - font-size: 18px; - font-weight: 600; - line-height: 36px; - margin: 0; - padding: 0 16px 0 36px; -} - -.mce-window .mce-window-head .mce-close, -.mce-window-head .mce-close .mce-i-remove { - color: transparent; - top: 0; - left: 0; - width: 36px; - height: 36px; - padding: 0; - line-height: 36px; - text-align: center; -} - -.mce-window-head .mce-close .mce-i-remove:before { - font: normal 20px/36px dashicons; - text-align: center; - color: #666; - width: 36px; - height: 36px; - display: block; -} - -.mce-window-head .mce-close:hover .mce-i-remove:before, -.mce-window-head .mce-close:focus .mce-i-remove:before { - color: #00a0d2; -} - -.mce-window-head .mce-close:focus .mce-i-remove, -div.mce-tab:focus { - -webkit-box-shadow: 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); -} - -.mce-window .mce-window-head .mce-dragh { - width: -webkit-calc( 100% - 36px ); - width: calc( 100% - 36px ); -} - -.mce-window .mce-foot { - border-top: 1px solid #ddd; -} - -.mce-textbox, -.mce-checkbox i.mce-i-checkbox, -#wp-link .query-results { - border: 1px solid #ddd; - -webkit-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.07); - box-shadow: inset 0 1px 2px rgba(0,0,0,0.07); - -webkit-transition: .05s all ease-in-out; - transition: .05s all ease-in-out; -} - -.mce-textbox:focus, -.mce-textbox.mce-focus, -.mce-checkbox:focus i.mce-i-checkbox, -#wp-link .query-results:focus { - border-color: #5b9dd9; - -webkit-box-shadow: 0 0 2px rgba(30,140,190,0.8); - box-shadow: 0 0 2px rgba(30,140,190,0.8); -} - -.mce-window .mce-wp-help { - height: 360px; - width: 460px; - overflow: auto; -} - -.mce-window .mce-wp-help * { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.mce-window .mce-wp-help > .mce-container-body { - width: auto !important; -} - -.mce-window .wp-editor-help { - padding: 10px 20px 0 10px; -} - -.mce-window .wp-editor-help h2, -.mce-window .wp-editor-help p { - margin: 8px 0; - white-space: normal; - font-size: 14px; - font-weight: 400; -} - -.mce-window .wp-editor-help table { - width: 100%; - margin-bottom: 20px; -} - -.mce-window .wp-editor-help table.wp-help-single { - margin: 0 8px 20px; -} - -.mce-window .wp-editor-help table.fixed { - table-layout: fixed; -} - -.mce-window .wp-editor-help table.fixed th:nth-child(odd), -.mce-window .wp-editor-help table.fixed td:nth-child(odd) { - width: 12%; -} - -.mce-window .wp-editor-help table.fixed th:nth-child(even), -.mce-window .wp-editor-help table.fixed td:nth-child(even) { - width: 38%; -} - -.mce-window .wp-editor-help table.fixed th:nth-child(odd) { - padding: 5px 0 0; -} - -.mce-window .wp-editor-help td, -.mce-window .wp-editor-help th { - font-size: 13px; - padding: 5px; - vertical-align: middle; - word-wrap: break-word; - white-space: normal; -} - -.mce-window .wp-editor-help th { - font-weight: 600; - padding-bottom: 0; -} - -.mce-window .wp-editor-help kbd { - font-family: monospace; - padding: 2px 7px 3px; - font-weight: 600; - margin: 0; - background: #eaeaea; - background: rgba(0,0,0,0.08); -} - -.mce-window .wp-help-th-center td:nth-child(odd), -.mce-window .wp-help-th-center th:nth-child(odd) { - text-align: center; -} - -/* TinyMCE menus */ -.mce-menu, -.mce-floatpanel.mce-popover { - border-color: rgba(0,0,0,0.15); - -webkit-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 ); - box-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 ); -} - -.mce-menu, -.mce-floatpanel.mce-popover.mce-bottom { - margin-top: 2px; -} - -.mce-floatpanel .mce-arrow { - display: none; -} - -.mce-menu .mce-container-body { - min-width: 160px; -} - -.mce-menu-item { - border: none; - margin-bottom: 2px; -} - -.mce-menu-has-icons i.mce-ico { - line-height: 20px; -} - -/* TinyMCE panel */ -div.mce-panel { - border: 0; - background: #fff; -} - -.mce-panel.mce-menu { - border: 1px solid #ddd; -} - -div.mce-tab { - line-height: 13px; -} - -/* TinyMCE toolbars */ -div.mce-toolbar-grp { - border-bottom: 1px solid #ddd; - background: #f5f5f5; - padding: 0; - position: relative; -} - -div.mce-inline-toolbar-grp { - border: 1px solid #a0a5aa; - -webkit-border-radius: 2px; - border-radius: 2px; - -webkit-box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.15 ); - box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.15 ); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-bottom: 8px; - position: absolute; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - max-width: 98%; - z-index: 100100; /* Same as the other TinyMCE "panels" */ -} - -div.mce-inline-toolbar-grp > div.mce-stack-layout { - padding: 1px; -} - -div.mce-inline-toolbar-grp.mce-arrow-up { - margin-bottom: 0; - margin-top: 8px; -} - -div.mce-inline-toolbar-grp:before, -div.mce-inline-toolbar-grp:after { - position: absolute; - right: 50%; - display: block; - width: 0; - height: 0; - border-style: solid; - border-color: transparent; - content: ""; -} - -div.mce-inline-toolbar-grp.mce-arrow-up:before { - top: -9px; - border-bottom-color: #a0a5aa; - border-width: 0 9px 9px; - margin-right: -9px; -} - -div.mce-inline-toolbar-grp.mce-arrow-down:before { - bottom: -9px; - border-top-color: #a0a5aa; - border-width: 9px 9px 0; - margin-right: -9px; -} - -div.mce-inline-toolbar-grp.mce-arrow-up:after { - top: -8px; - border-bottom-color: #f5f5f5; - border-width: 0 8px 8px; - margin-right: -8px; -} - -div.mce-inline-toolbar-grp.mce-arrow-down:after { - bottom: -8px; - border-top-color: #f5f5f5; - border-width: 8px 8px 0; - margin-right: -8px; -} - -div.mce-inline-toolbar-grp.mce-arrow-left:before, -div.mce-inline-toolbar-grp.mce-arrow-left:after { - margin: 0; -} - -div.mce-inline-toolbar-grp.mce-arrow-left:before { - right: 20px; -} -div.mce-inline-toolbar-grp.mce-arrow-left:after { - right: 21px; -} - -div.mce-inline-toolbar-grp.mce-arrow-right:before, -div.mce-inline-toolbar-grp.mce-arrow-right:after { - right: auto; - margin: 0; -} - -div.mce-inline-toolbar-grp.mce-arrow-right:before { - left: 20px; -} - -div.mce-inline-toolbar-grp.mce-arrow-right:after { - left: 21px; -} - -div.mce-inline-toolbar-grp.mce-arrow-full { - left: 0; -} - -div.mce-inline-toolbar-grp.mce-arrow-full > div { - width: 100%; - overflow-x: auto; -} - -div.mce-toolbar-grp > div { - padding: 3px; -} - -.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first { - padding-left: 32px; -} - -.mce-toolbar .mce-btn-group { - margin: 0; -} - -div.mce-statusbar { - border-top: 1px solid #e5e5e5; -} - -div.mce-path { - padding: 2px 10px; - margin: 0; -} - -.mce-path, -.mce-path-item, -.mce-path .mce-divider { - font-size: 12px; -} - -.mce-toolbar .mce-btn, -.qt-dfw { - border-color: transparent; - background: transparent; - -webkit-box-shadow: none; - box-shadow: none; - text-shadow: none; - cursor: pointer; -} - -.mce-btn .mce-txt { - direction: inherit; - text-align: inherit; -} - -.mce-toolbar .mce-btn-group .mce-btn, -.qt-dfw { - border: 1px solid transparent; - margin: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; -} - -.mce-toolbar .mce-btn-group .mce-btn:hover, -.mce-toolbar .mce-btn-group .mce-btn:focus, -.qt-dfw:hover, -.qt-dfw:focus { - background: #fafafa; - border-color: #555d66; - color: #23282d; - -webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 ); - box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 ); - outline: none; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-active, -.mce-toolbar .mce-btn-group .mce-btn:active, -.qt-dfw.active { - background: #ebebeb; - border-color: #555d66; - -webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.3 ); - box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.3 ); -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover, -.mce-toolbar .mce-btn-group .mce-btn.mce-active:focus { - border-color: #23282d; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover, -.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus { - color: #a0a5aa; - background: none; - border-color: #ddd; - text-shadow: 0 1px 0 #fff; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus { - border-color: #555d66; -} - -.mce-toolbar .mce-btn-group .mce-first, -.mce-toolbar .mce-btn-group .mce-last { - border-color: transparent; -} - -.mce-toolbar .mce-btn button, -.qt-dfw { - padding: 2px 3px; - line-height: normal; -} - -.mce-toolbar .mce-listbox button { - font-size: 13px; - line-height: 20px; - padding-right: 6px; - padding-left: 20px; -} - -.mce-toolbar .mce-btn i { - text-shadow: none; -} - -.mce-toolbar .mce-btn-group > div { - white-space: normal; -} - -.mce-toolbar .mce-colorbutton .mce-open { - border-left: 0; -} - -.mce-toolbar .mce-colorbutton .mce-preview { - margin: 0; - padding: 0; - top: auto; - bottom: 2px; - right: 3px; - height: 3px; - width: 20px; - background: #555d66; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-primary { - min-width: 0; - background: #0085ba; - border-color: #0073aa #006799 #006799; - -webkit-box-shadow: 0 1px 0 #006799; - box-shadow: 0 1px 0 #006799; - color: #fff; - text-decoration: none; - text-shadow: none; -} - -/* Compensate for the extra box shadow at the bottom of .mce-btn.mce-primary */ -.mce-toolbar .mce-btn-group .mce-btn.mce-primary button { - padding: 2px 3px 1px; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico { - color: #fff; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover, -.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus { - background: #008ec2; - border-color: #006799; - color: #fff; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus { - -webkit-box-shadow: 0 0 1px 1px #33b3db; - box-shadow: 0 0 1px 1px #33b3db; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-primary:active { - background: #0073aa; - border-color: #006799; - -webkit-box-shadow: inset 0 2px 0 #006799; - box-shadow: inset 0 2px 0 #006799; -} - -/* mce listbox */ -.mce-toolbar .mce-btn-group .mce-btn.mce-listbox { - -webkit-border-radius: 0; - border-radius: 0; - direction: rtl; - background: #fff; - border: 1px solid #ddd; - -webkit-box-shadow: inset 0 1px 1px -1px rgba(0, 0, 0, .2); - box-shadow: inset 0 1px 1px -1px rgba(0, 0, 0, .2); -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover, -.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:focus { - border-color: #b4b9be; -} - -.mce-panel .mce-btn i.mce-caret { - border-top: 6px solid #555d66; - margin-right: 2px; - margin-left: 2px; -} - -.mce-listbox i.mce-caret { - left: 4px; -} - -.mce-panel .mce-btn:hover i.mce-caret, -.mce-panel .mce-btn:focus i.mce-caret { - border-top-color: #23282d; -} - -.mce-panel .mce-active i.mce-caret { - border-top: 0; - border-bottom: 6px solid #23282d; - margin-top: 7px; -} - -.mce-listbox.mce-active i.mce-caret { - margin-top: -3px; -} - -.mce-toolbar .mce-splitbtn:hover .mce-open { - border-left-color: transparent; -} - -.mce-toolbar .mce-splitbtn .mce-open.mce-active { - background: transparent; - outline: none; -} - -.mce-menu .mce-menu-item:hover, -.mce-menu .mce-menu-item.mce-selected, -.mce-menu .mce-menu-item:focus, -.mce-menu .mce-menu-item-normal.mce-active, -.mce-menu .mce-menu-item-preview.mce-active { - background: #0073aa; /* See color scheme. */ - color: #fff; -} - -.mce-menu .mce-menu-item-preview.mce-active { - border-right: none; -} - -.mce-menu .mce-menu-item-preview.mce-active .mce-text { - color: #fff; -} - -.mce-menu .mce-menu-item.mce-disabled { - cursor: default; -} - -.mce-menu .mce-menu-item.mce-disabled:hover { - background: #ccc; -} - -/* Menubar */ -.mce-menubar { - border-color: #e5e5e5; - background: #fff; - border-width: 0px 0px 1px; -} - -.mce-menubar .mce-menubtn { - margin: 2px; -} - -.mce-menubar .mce-menubtn:hover, -.mce-menubar .mce-menubtn.mce-active, -.mce-menubar .mce-menubtn:focus { - border-color: transparent; - background: transparent; -} - -.mce-menubar .mce-menubtn:focus { - color: #124964; - -webkit-box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); -} - -div.mce-menu .mce-menu-item-sep, -.mce-menu-item-sep:hover { - border-bottom: 1px solid #ddd; - height: 0px; - margin: 5px 0; -} - -.mce-menubtn span { - margin-left: 0; - padding-right: 3px; -} - -.mce-menu-has-icons i.mce-ico:before { - margin-right: -2px; -} - -/* Keyboard shortcuts position */ -.mce-menu.mce-menu-align .mce-menu-item-normal { - position: relative; -} - -.mce-menu.mce-menu-align .mce-menu-shortcut { - bottom: 0.6em; - font-size: 0.9em; -} - -/* Buttons in modals */ -.mce-primary button, -.mce-primary button i { - text-align: center; - color: #fff; - text-shadow: none; - padding: 0; - line-height: 26px; -} - -.mce-window .mce-btn { - color: #555; - background: #f7f7f7; - text-decoration: none; - font-size: 13px; - line-height: 26px; - height: 28px; - margin: 0; - padding: 0; - cursor: pointer; - border: 1px solid #cccccc; - -webkit-appearance: none; - -webkit-border-radius: 3px; - border-radius: 3px; - white-space: nowrap; - -webkit-box-shadow: 0 1px 0 #cccccc; - box-shadow: 0 1px 0 #cccccc; -} - -/* Remove the dotted border on :focus and the extra padding in Firefox */ -.mce-window .mce-btn::-moz-focus-inner { - border-width: 0; - border-style: none; - padding: 0; -} - -.mce-window .mce-btn:hover, -.mce-window .mce-btn:focus { - background: #fafafa; - border-color: #999; - color: #23282d; -} - -.mce-window .mce-btn:focus { - border-color: #5b9dd9; - -webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); - box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); -} - -.mce-window .mce-btn:active { - background: #eee; - border-color: #999; - -webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); - box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); - -webkit-transform: translateY(1px); - -ms-transform: translateY(1px); - transform: translateY(1px); -} - -.mce-window .mce-btn.mce-disabled { - color: #a0a5aa !important; - border-color: #ddd !important; - background: #f7f7f7 !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - text-shadow: 0 1px 0 #fff !important; - cursor: default; - -webkit-transform: none !important; - -ms-transform: none !important; - transform: none !important; -} - -.mce-window .mce-btn.mce-primary { - background: #0085ba; - border-color: #0073aa #006799 #006799; - -webkit-box-shadow: 0 1px 0 #006799; - box-shadow: 0 1px 0 #006799; - color: #fff; - text-decoration: none; - text-shadow: 0 -1px 1px #006799, - -1px 0 1px #006799, - 0 1px 1px #006799, - 1px 0 1px #006799; -} - -.mce-window .mce-btn.mce-primary:hover, -.mce-window .mce-btn.mce-primary:focus { - background: #008ec2; - border-color: #006799; - color: #fff; -} - -.mce-window .mce-btn.mce-primary:focus { - -webkit-box-shadow: 0 1px 0 #0073aa, - 0 0 2px 1px #33b3db; - box-shadow: 0 1px 0 #0073aa, - 0 0 2px 1px #33b3db; -} - -.mce-window .mce-btn.mce-primary:active { - background: #0073aa; - border-color: #006799; - -webkit-box-shadow: inset 0 2px 0 #006799; - box-shadow: inset 0 2px 0 #006799; - vertical-align: top; -} - -.mce-window .mce-btn.mce-primary.mce-disabled { - color: #66c6e4 !important; - background: #008ec2 !important; - border-color: #007cb2 !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - text-shadow: 0 -1px 0 rgba( 0, 0, 0, 0.1 ) !important; - cursor: default; -} - -.mce-menubtn.mce-fixed-width button { - overflow-x: hidden; - text-overflow: ellipsis; - width: 110px; -} - -/* Charmap modal */ -.mce-charmap { - margin: 3px; -} - -.mce-charmap td { - padding: 0; - border-color: #ddd; - cursor: pointer; -} - -.mce-charmap td:hover { - background: #f3f3f3; -} - -.mce-charmap td div { - width: 18px; - height: 22px; - line-height: 22px; -} - -/* TinyMCE tooltips */ -.mce-tooltip { - margin-top: 2px; -} - -.mce-tooltip-inner { - -webkit-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 ); - box-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 ); - color: #fff; - font-size: 12px; -} - -/* TinyMCE icons */ -.mce-ico { - font-family: 'tinymce', Arial; -} - -.mce-btn-small .mce-ico { - font-family: 'tinymce-small', Arial; -} - -.mce-toolbar .mce-ico { - color: #555d66; - line-height: 20px; - width: 20px; - height: 20px; - text-align: center; - text-shadow: none; - margin: 0; - padding: 0; -} - -.qt-dfw { - color: #555d66; - line-height: 20px; - width: 28px; - height: 26px; - text-align: center; - text-shadow: none; -} - -.mce-toolbar .mce-btn .mce-open { - line-height: 20px; -} - -.mce-toolbar .mce-btn:hover .mce-open, -.mce-toolbar .mce-btn:focus .mce-open, -.mce-toolbar .mce-btn.mce-active .mce-open { - border-right-color: #23282d; -} - -div.mce-notification { - right: 10% !important; - left: 10%; -} - -.mce-notification button.mce-close { - left: 6px; - top: 3px; - font-weight: 400; - color: #555d66; -} - -.mce-notification button.mce-close:hover, -.mce-notification button.mce-close:focus { - color: #000; -} - -i.mce-i-bold, -i.mce-i-italic, -i.mce-i-bullist, -i.mce-i-numlist, -i.mce-i-blockquote, -i.mce-i-alignleft, -i.mce-i-aligncenter, -i.mce-i-alignright, -i.mce-i-link, -i.mce-i-unlink, -i.mce-i-wp_more, -i.mce-i-strikethrough, -i.mce-i-spellchecker, -i.mce-i-fullscreen, -i.mce-i-wp_fullscreen, -i.mce-i-dfw, -i.mce-i-wp_adv, -i.mce-i-underline, -i.mce-i-alignjustify, -i.mce-i-forecolor, -i.mce-i-backcolor, -i.mce-i-pastetext, -i.mce-i-pasteword, -i.mce-i-removeformat, -i.mce-i-charmap, -i.mce-i-outdent, -i.mce-i-indent, -i.mce-i-undo, -i.mce-i-redo, -i.mce-i-help, -i.mce-i-wp_help, -i.mce-i-wp-media-library, -i.mce-i-ltr, -i.mce-i-wp_page, -i.mce-i-hr, -i.mce-i-wp_code, -i.mce-i-dashicon, -i.mce-i-remove { - font: normal 20px/1 dashicons; - padding: 0; - vertical-align: top; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - margin-right: -2px; - padding-left: 2px; -} - -.qt-dfw { - font: normal 20px/1 dashicons; - vertical-align: top; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -i.mce-i-bold:before { - content: "\f200"; -} - -i.mce-i-italic:before { - content: "\f201"; -} - -i.mce-i-bullist:before { - content: "\f203"; -} - -i.mce-i-numlist:before { - content: "\f204"; -} - -i.mce-i-blockquote:before { - content: "\f205"; -} - -i.mce-i-alignleft:before { - content: "\f206"; -} - -i.mce-i-aligncenter:before { - content: "\f207"; -} - -i.mce-i-alignright:before { - content: "\f208"; -} - -i.mce-i-link:before { - content: "\f103"; -} - -i.mce-i-unlink:before { - content: "\f225"; -} - -i.mce-i-wp_more:before { - content: "\f209"; -} - -i.mce-i-strikethrough:before { - content: "\f224"; -} - -i.mce-i-spellchecker:before { - content: "\f210"; -} - -i.mce-i-fullscreen:before, -i.mce-i-wp_fullscreen:before, -i.mce-i-dfw:before, -.qt-dfw:before { - content: "\f211"; -} - -i.mce-i-wp_adv:before { - content: "\f212"; -} - -i.mce-i-underline:before { - content: "\f213"; -} - -i.mce-i-alignjustify:before { - content: "\f214"; -} - -i.mce-i-forecolor:before, -i.mce-i-backcolor:before { - content: "\f215"; -} - -i.mce-i-pastetext:before { - content: "\f217"; -} - -i.mce-i-removeformat:before { - content: "\f218"; -} - -i.mce-i-charmap:before { - content: "\f220"; -} - -i.mce-i-outdent:before { - content: "\f221"; -} - -i.mce-i-indent:before { - content: "\f222"; -} - -i.mce-i-undo:before { - content: "\f171"; -} - -i.mce-i-redo:before { - content: "\f172"; -} - -i.mce-i-help:before, -i.mce-i-wp_help:before { - content: "\f223"; -} - -i.mce-i-wp-media-library:before { - content: "\f104"; -} - -i.mce-i-ltr:before { - content: "\f320"; -} - -i.mce-i-wp_page:before { - content: "\f105"; -} - -i.mce-i-hr:before { - content: "\f460"; -} - -i.mce-i-remove:before { - content: "\f158"; -} - -i.mce-i-wp_code:before { - content: "\f475"; -} - -/* RTL button icons */ -.rtl i.mce-i-outdent:before { - content: "\f222"; -} - -.rtl i.mce-i-indent:before { - content: "\f221"; -} - -/* Editors */ -.wp-editor-wrap { - position: relative; -} - -.wp-editor-tools { - position: relative; - z-index: 1; -} - -.wp-editor-tools:after { - clear: both; - content: ""; - display: table; -} - -.wp-editor-container { - clear: both; -} - -.wp-editor-area { - font-family: Consolas, Monaco, monospace; - font-size: 13px; - padding: 10px; - margin: 1px 0 0; - line-height: 150%; - border: 0; - outline: none; - display: block; - resize: vertical; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.rtl .wp-editor-area { - font-family: Tahoma, Monaco, monospace; -} - -.locale-he-il .wp-editor-area { - font-family: Arial, Monaco, monospace; -} - -.wp-editor-container textarea.wp-editor-area { - width: 100%; - margin: 0; - -webkit-box-shadow: none; - box-shadow: none; -} - -.wp-editor-tabs { - float: left; -} - -.wp-switch-editor { - float: right; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - position: relative; - top: 1px; - background: #ebebeb; - color: #666; - cursor: pointer; - font-size: 13px; - line-height: 19px; - height: 20px; - margin: 5px 5px 0 0; - padding: 3px 8px 4px; - border: 1px solid #e5e5e5; -} - -.wp-switch-editor:focus { - -webkit-box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - outline: none; - color: #23282d; -} - -.wp-switch-editor:active, -.html-active .switch-html:focus, -.tmce-active .switch-tmce:focus { - -webkit-box-shadow: none; - box-shadow: none; -} - -.wp-switch-editor:active { - background-color: #f5f5f5; - -webkit-box-shadow: none; - box-shadow: none; -} - -.js .tmce-active .wp-editor-area { - color: #fff; -} - -.tmce-active .quicktags-toolbar { - display: none; -} - -.tmce-active .switch-tmce, -.html-active .switch-html { - background: #f5f5f5; - color: #555; - border-bottom-color: #f5f5f5; -} - -.wp-media-buttons { - float: right; -} - -.wp-media-buttons .button { - margin-left: 5px; - margin-bottom: 4px; - padding-right: 7px; - padding-left: 7px; -} - -.wp-media-buttons .button:active { - position: relative; - top: 1px; - margin-top: -1px; - margin-bottom: 1px; -} - -.wp-media-buttons .insert-media { - padding-right: 5px; -} - -.wp-media-buttons a { - text-decoration: none; - color: #444; - font-size: 12px; -} - -.wp-media-buttons img { - padding: 0 4px; - vertical-align: middle; -} - -.wp-media-buttons span.wp-media-buttons-icon { - display: inline-block; - width: 18px; - height: 18px; - vertical-align: text-top; - margin: 0 2px; -} - -.wp-media-buttons .add_media span.wp-media-buttons-icon { - background: none; -} - -.wp-media-buttons .add_media span.wp-media-buttons-icon:before { - font: normal 18px/1 dashicons; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.wp-media-buttons .add_media span.wp-media-buttons-icon:before { - content: "\f104"; -} - -/* Quicktags */ -.quicktags-toolbar { - padding: 3px; - position: relative; - border-bottom: 1px solid #ddd; - background: #f5f5f5; - min-height: 30px; -} - -.has-dfw .quicktags-toolbar { - padding-left: 35px; -} - -.wp-core-ui .quicktags-toolbar input.button.button-small { - margin: 2px; -} - -.quicktags-toolbar input[value="link"] { - text-decoration: underline; -} - -.quicktags-toolbar input[value="del"] { - text-decoration: line-through; -} - -.quicktags-toolbar input[value="i"] { - font-style: italic; -} - -.quicktags-toolbar input[value="b"] { - font-weight: 600; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw, -.qt-dfw { - position: absolute; - top: 0; - left: 0; - margin: 5px 0 0 5px; -} - -.qt-fullscreen { - position: static; - margin: 2px; -} - -@media screen and ( max-width: 782px ) { - .mce-toolbar .mce-btn button, - .qt-dfw { - padding: 6px 7px; - } - - /* Compensate for the extra box shadow at the bottom of .mce-btn.mce-primary */ - .mce-toolbar .mce-btn-group .mce-btn.mce-primary button { - padding: 6px 7px 5px; - } - - .mce-toolbar .mce-btn-group .mce-btn { - margin: 1px; - } - - .qt-dfw { - width: 36px; - height: 34px; - } - - .mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw { - margin: 4px 0 0 4px; - } - - .mce-toolbar .mce-colorbutton .mce-preview { - right: 8px; - bottom: 6px; - } - - .mce-window .mce-btn { - padding: 2px 0; - } - - .has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first, - .has-dfw .quicktags-toolbar { - padding-left: 40px; - } -} - -@media screen and ( min-width: 782px ) { - .wp-core-ui .quicktags-toolbar input.button.button-small { - /* .button-small is normally 11px, but a bit too small for these buttons. */ - font-size: 12px; - height: 26px; - line-height: 24px; - } -} - -#wp_editbtns, -#wp_gallerybtns { - padding: 2px; - position: absolute; - display: none; - z-index: 100020; -} - -#wp_editimgbtn, -#wp_delimgbtn, -#wp_editgallery, -#wp_delgallery { - border-color: #999; - background-color: #eee; - margin: 2px; - padding: 2px; - border-width: 1px; - border-style: solid; - -webkit-border-radius: 3px; - border-radius: 3px; -} - -#wp_editimgbtn:hover, -#wp_delimgbtn:hover, -#wp_editgallery:hover, -#wp_delgallery:hover { - border-color: #555; - background-color: #ccc; -} - -/*------------------------------------------------------------------------------ - wp-link -------------------------------------------------------------------------------*/ - -#wp-link-wrap { - display: none; - background-color: #fff; - -webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); - box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); - width: 500px; - overflow: hidden; - margin-right: -250px; - margin-top: -125px; - position: fixed; - top: 50%; - right: 50%; - z-index: 100105; - -webkit-transition: height 0.2s, margin-top 0.2s; - transition: height 0.2s, margin-top 0.2s; -} - -#wp-link-backdrop { - display: none; - position: fixed; - top: 0; - right: 0; - left: 0; - bottom: 0; - min-height: 360px; - background: #000; - opacity: 0.7; - filter: alpha(opacity=70); - z-index: 100100; -} - -#wp-link { - position: relative; - height: 100%; -} - -#wp-link-wrap { - height: 500px; - margin-top: -250px; -} - -#wp-link-wrap .wp-link-text-field { - display: none; -} - -#wp-link-wrap.has-text-field .wp-link-text-field { - display: block; -} - -#link-modal-title { - background: #fcfcfc; - border-bottom: 1px solid #ddd; - height: 36px; - font-size: 18px; - font-weight: 600; - line-height: 36px; - margin: 0; - padding: 0 16px 0 36px; -} - -#wp-link-close { - color: #666; - padding: 0; - position: absolute; - top: 0; - left: 0; - width: 36px; - height: 36px; - text-align: center; - background: none; - border: none; - cursor: pointer; -} - -#wp-link-close:before { - font: normal 20px/36px dashicons; - vertical-align: top; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - width: 36px; - height: 36px; - content: "\f158"; -} - -#wp-link-close:hover, -#wp-link-close:focus { - color: #00a0d2; -} - -#wp-link-close:focus { - outline: none; - -webkit-box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); -} - -#wp-link-wrap #link-selector { - -webkit-overflow-scrolling: touch; - padding: 0 16px; - position: absolute; - top: 37px; - right: 0; - left: 0; - bottom: 44px; -} - -#wp-link ol, -#wp-link ul { - list-style: none; - margin: 0; - padding: 0; -} - -#wp-link input[type="text"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -#wp-link #link-options { - padding: 8px 0 12px; -} - -#wp-link p.howto { - margin: 3px 0; -} - -#wp-link p.howto a { - text-decoration: none; - color: inherit; -} - -#wp-link label input[type="text"] { - margin-top: 5px; - width: 70%; -} - -#wp-link #link-options label span, -#wp-link #search-panel label span.search-label { - display: inline-block; - width: 80px; - text-align: left; - padding-left: 5px; - max-width: 24%; - vertical-align: middle; - word-wrap: break-word; -} - -#wp-link .link-search-field { - float: right; - width: 250px; - max-width: 70%; -} - -#wp-link .link-search-wrapper { - margin: 5px 0 9px; - display: block; - overflow: hidden; -} - -#wp-link .link-search-wrapper span { - float: right; - margin-top: 4px; -} - -#wp-link .link-search-wrapper .spinner { - margin-top: 5px; -} - -#wp-link .link-target { - padding: 3px 0 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -#wp-link .link-target label { - max-width: 70%; -} - -#wp-link .query-results { - border: 1px #dfdfdf solid; - margin: 0 0 12px; - background: #fff; - overflow: auto; - position: absolute; - right: 16px; - left: 16px; - bottom: 0; - top: 166px; -} - -.has-text-field #wp-link .query-results { - top: 200px; -} - -#wp-link li { - clear: both; - margin-bottom: 0; - border-bottom: 1px solid #f1f1f1; - color: #32373c; - padding: 4px 10px 4px 6px; - cursor: pointer; - position: relative; -} - -#wp-link .query-notice { - padding: 0; - border-bottom: 1px solid #dfdfdf; - background-color: #f7fcfe; - color: #000; -} - -#wp-link .query-notice .query-notice-default, -#wp-link .query-notice .query-notice-hint { - display: block; - padding: 6px; - border-right: 4px solid #00a0d2; -} - -#wp-link .unselectable.no-matches-found { - padding: 0; - border-bottom: 1px solid #dfdfdf; - background-color: #fef7f1; -} - -#wp-link .no-matches-found .item-title { - display: block; - padding: 6px; - border-right: 4px solid #d54e21; -} - -#wp-link .query-results em { - font-style: normal; -} - -#wp-link li:hover { - background: #eaf2fa; - color: #151515; -} - -#wp-link li.unselectable { - border-bottom: 1px solid #dfdfdf; -} - -#wp-link li.unselectable:hover { - background: #fff; - cursor: auto; - color: #32373c; -} - -#wp-link li.selected { - background: #ddd; - color: #32373c; -} - -#wp-link li.selected .item-title { - font-weight: 600; -} - -#wp-link li:last-child { - border: none; -} - -#wp-link .item-title { - display: inline-block; - width: 80%; - width: -webkit-calc(100% - 68px); - width: calc(100% - 68px); - word-wrap: break-word; -} - -#wp-link .item-info { - text-transform: uppercase; - color: #666; - font-size: 11px; - position: absolute; - left: 5px; - top: 5px; -} - -#wp-link .river-waiting { - display: none; - padding: 10px 0; -} - -#wp-link .submitbox { - padding: 8px 16px; - background: #fcfcfc; - border-top: 1px solid #ddd; - position: absolute; - bottom: 0; - right: 0; - left: 0; -} - -#wp-link-cancel { - line-height: 25px; - float: right; -} - -#wp-link-update { - line-height: 23px; - float: left; -} - -#wp-link-submit { - float: left; -} - -@media screen and ( max-width: 782px ) { - #wp-link-wrap { - margin-top: -140px; - } - - #wp-link-wrap .query-results { - top: 195px; - } - - #wp-link-wrap.has-text-field .query-results { - top: 235px; - } - - #link-selector { - padding: 0 16px 60px; - } - - #wp-link-wrap #link-selector { - bottom: 52px; - } - - #wp-link-cancel { - line-height: 32px; - } - - #wp-link .link-target { - padding-top: 10px; - } - - #wp-link .submitbox .button { - margin-bottom: 0; - } -} - -@media screen and ( max-width: 520px ) { - #wp-link-wrap { - width: auto; - margin-right: 0; - right: 10px; - left: 10px; - max-width: 500px; - } -} - -@media screen and ( max-height: 520px ) { - #wp-link-wrap { - -webkit-transition: none; - transition: none; - height: auto; - margin-top: 0; - top: 10px; - bottom: 10px; - } - - #link-selector { - overflow: auto; - } - - #search-panel .query-results { - position: static; - } -} - -@media screen and ( max-height: 290px ) { - #wp-link-wrap { - height: auto; - margin-top: 0; - top: 10px; - bottom: 10px; - } - - #link-selector { - overflow: auto; - height: -webkit-calc(100% - 92px); - height: calc(100% - 92px); - padding-bottom: 2px; - } - - #search-panel .query-results { - position: static; - } -} - -div.wp-link-preview { - float: right; - margin: 5px; - max-width: 694px; - overflow: hidden; - text-overflow: ellipsis; -} - -div.wp-link-preview a { - color: #0073aa; - text-decoration: underline; - -webkit-transition-property: border, background, color; - transition-property: border, background, color; - -webkit-transition-duration: .05s; - transition-duration: .05s; - -webkit-transition-timing-function: ease-in-out; - transition-timing-function: ease-in-out; - cursor: pointer; -} - -div.wp-link-preview a.wplink-url-error { - color: #dc3232; -} - -div.wp-link-input { - float: right; - margin: 2px; - max-width: 694px; -} - -div.wp-link-input input { - width: 300px; - padding: 3px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.mce-toolbar div.wp-link-preview ~ .mce-btn, -.mce-toolbar div.wp-link-input ~ .mce-btn { - margin: 2px 1px; -} - -.mce-inline-toolbar-grp .mce-btn-group .mce-btn:last-child { - margin-left: 2px; -} - -.ui-autocomplete.wplink-autocomplete { - z-index: 100110; - max-height: 200px; - overflow-y: auto; - padding: 0; - margin: 0; - list-style: none; - position: absolute; - border: 1px solid #5b9dd9; - -webkit-box-shadow: 0 1px 2px rgba( 30, 140, 190, 0.8 ); - box-shadow: 0 1px 2px rgba( 30, 140, 190, 0.8 ); - background-color: #fff; -} - -.ui-autocomplete.wplink-autocomplete li { - margin-bottom: 0; - padding: 4px 10px; - clear: both; - white-space: normal; - text-align: right; -} - -.ui-autocomplete.wplink-autocomplete li .wp-editor-float-right { - float: left; -} - -.ui-autocomplete.wplink-autocomplete li.ui-state-focus { - background-color: #ddd; - cursor: pointer; -} - -@media screen and ( max-width: 782px ) { - div.wp-link-preview, - div.wp-link-input { - max-width: 70%; - max-width: -webkit-calc(100% - 86px); - max-width: calc(100% - 86px); - } - - div.wp-link-preview { - margin: 8px 5px 8px 0; - } - - div.wp-link-input { - width: 300px; - } - - div.wp-link-input input { - width: 100%; - font-size: 16px; - padding: 5px; - } -} - -/* =Overlay Body --------------------------------------------------------------- */ - -.mce-fullscreen { - z-index: 100010; -} - -/* =Localization --------------------------------------------------------------- */ -.rtl .wp-switch-editor, -.rtl .quicktags-toolbar input { - font-family: Tahoma, sans-serif; -} - -/* rtl:ignore */ -.mce-rtl .mce-flow-layout .mce-flow-layout-item > div { - direction: rtl; -} - -/* rtl:ignore */ -.mce-rtl .mce-listbox i.mce-caret { - left: 6px; -} - -html:lang(he-il) .rtl .wp-switch-editor, -html:lang(he-il) .rtl .quicktags-toolbar input { - font-family: Arial, sans-serif; -} - -/* HiDPI */ -@media print, - (-webkit-min-device-pixel-ratio: 1.25), - (min-resolution: 120dpi) { - .wp-media-buttons .add_media span.wp-media-buttons-icon { - background: none; - } -} diff --git a/wp/wp-includes/css/editor-rtl.min.css b/wp/wp-includes/css/editor-rtl.min.css deleted file mode 100644 index 21b6a6ef..00000000 --- a/wp/wp-includes/css/editor-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -#wp-link-wrap,.mce-window{-webkit-box-shadow:0 3px 6px rgba(0,0,0,.3)}.mce-window .mce-wp-help *,div.mce-inline-toolbar-grp{-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.mce-container,.mce-container *,.mce-widget,.mce-widget *{color:inherit;font-family:inherit}.mce-container .mce-monospace,.mce-widget .mce-monospace{font-family:Consolas,Monaco,monospace;font-size:13px;line-height:150%}#mce-modal-block,#mce-modal-block.mce-fade{opacity:.7;filter:alpha(opacity=70);-webkit-transition:none;transition:none}.mce-window{-webkit-border-radius:0;border-radius:0;box-shadow:0 3px 6px rgba(0,0,0,.3);-webkit-font-smoothing:subpixel-antialiased;-webkit-transition:none;transition:none}.mce-window .mce-container-body.mce-abs-layout{overflow:visible}.mce-window .mce-window-head{background:#fcfcfc;border-bottom:1px solid #ddd;padding:0;min-height:36px}.mce-window .mce-window-head .mce-title{color:#444;font-size:18px;font-weight:600;line-height:36px;margin:0;padding:0 16px 0 36px}.mce-window .mce-window-head .mce-close,.mce-window-head .mce-close .mce-i-remove{color:transparent;top:0;left:0;width:36px;height:36px;padding:0;line-height:36px;text-align:center}.mce-window-head .mce-close .mce-i-remove:before{font:400 20px/36px dashicons;text-align:center;color:#666;width:36px;height:36px;display:block}.mce-window-head .mce-close:focus .mce-i-remove:before,.mce-window-head .mce-close:hover .mce-i-remove:before{color:#00a0d2}.mce-window-head .mce-close:focus .mce-i-remove,div.mce-tab:focus{-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.mce-window .mce-window-head .mce-dragh{width:-webkit-calc(100% - 36px);width:calc(100% - 36px)}.mce-window .mce-foot{border-top:1px solid #ddd}#wp-link .query-results,.mce-checkbox i.mce-i-checkbox,.mce-textbox{border:1px solid #ddd;-webkit-border-radius:0;border-radius:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.07);box-shadow:inset 0 1px 2px rgba(0,0,0,.07);-webkit-transition:.05s all ease-in-out;transition:.05s all ease-in-out}#wp-link .query-results:focus,.mce-checkbox:focus i.mce-i-checkbox,.mce-textbox.mce-focus,.mce-textbox:focus{border-color:#5b9dd9;-webkit-box-shadow:0 0 2px rgba(30,140,190,.8);box-shadow:0 0 2px rgba(30,140,190,.8)}.mce-window .mce-wp-help{height:360px;width:460px;overflow:auto}.mce-window .mce-wp-help *{box-sizing:border-box}.mce-window .mce-wp-help>.mce-container-body{width:auto!important}.mce-window .wp-editor-help{padding:10px 20px 0 10px}.mce-window .wp-editor-help h2,.mce-window .wp-editor-help p{margin:8px 0;white-space:normal;font-size:14px;font-weight:400}.mce-window .wp-editor-help table{width:100%;margin-bottom:20px}.mce-window .wp-editor-help table.wp-help-single{margin:0 8px 20px}.mce-window .wp-editor-help table.fixed{table-layout:fixed}.mce-window .wp-editor-help table.fixed td:nth-child(odd),.mce-window .wp-editor-help table.fixed th:nth-child(odd){width:12%}.mce-window .wp-editor-help table.fixed td:nth-child(even),.mce-window .wp-editor-help table.fixed th:nth-child(even){width:38%}.mce-window .wp-editor-help table.fixed th:nth-child(odd){padding:5px 0 0}.mce-window .wp-editor-help td,.mce-window .wp-editor-help th{font-size:13px;padding:5px;vertical-align:middle;word-wrap:break-word;white-space:normal}.mce-window .wp-editor-help th{font-weight:600;padding-bottom:0}.mce-window .wp-editor-help kbd{font-family:monospace;padding:2px 7px 3px;font-weight:600;margin:0;background:#eaeaea;background:rgba(0,0,0,.08)}.mce-window .wp-help-th-center td:nth-child(odd),.mce-window .wp-help-th-center th:nth-child(odd){text-align:center}.mce-floatpanel.mce-popover,.mce-menu{border-color:rgba(0,0,0,.15);-webkit-border-radius:0;border-radius:0;-webkit-box-shadow:0 3px 5px rgba(0,0,0,.2);box-shadow:0 3px 5px rgba(0,0,0,.2)}.mce-floatpanel.mce-popover.mce-bottom,.mce-menu{margin-top:2px}.mce-floatpanel .mce-arrow{display:none}.mce-menu .mce-container-body{min-width:160px}.mce-menu-item{border:none;margin-bottom:2px}.mce-menu-has-icons i.mce-ico{line-height:20px}div.mce-panel{border:0;background:#fff}.mce-panel.mce-menu{border:1px solid #ddd}div.mce-tab{line-height:13px}div.mce-toolbar-grp{border-bottom:1px solid #ddd;background:#f5f5f5;padding:0;position:relative}div.mce-inline-toolbar-grp{border:1px solid #a0a5aa;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.15);box-shadow:0 1px 3px rgba(0,0,0,.15);box-sizing:border-box;margin-bottom:8px;position:absolute;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;max-width:98%;z-index:100100}div.mce-inline-toolbar-grp>div.mce-stack-layout{padding:1px}div.mce-inline-toolbar-grp.mce-arrow-up{margin-bottom:0;margin-top:8px}div.mce-inline-toolbar-grp:after,div.mce-inline-toolbar-grp:before{position:absolute;right:50%;display:block;width:0;height:0;border-style:solid;border-color:transparent;content:""}.mce-menu.mce-menu-align .mce-menu-item-normal,.quicktags-toolbar,.wp-editor-tools,.wp-editor-wrap,.wp-switch-editor{position:relative}div.mce-inline-toolbar-grp.mce-arrow-up:before{top:-9px;border-bottom-color:#a0a5aa;border-width:0 9px 9px;margin-right:-9px}div.mce-inline-toolbar-grp.mce-arrow-down:before{bottom:-9px;border-top-color:#a0a5aa;border-width:9px 9px 0;margin-right:-9px}div.mce-inline-toolbar-grp.mce-arrow-up:after{top:-8px;border-bottom-color:#f5f5f5;border-width:0 8px 8px;margin-right:-8px}div.mce-inline-toolbar-grp.mce-arrow-down:after{bottom:-8px;border-top-color:#f5f5f5;border-width:8px 8px 0;margin-right:-8px}div.mce-inline-toolbar-grp.mce-arrow-left:after,div.mce-inline-toolbar-grp.mce-arrow-left:before{margin:0}div.mce-inline-toolbar-grp.mce-arrow-left:before{right:20px}div.mce-inline-toolbar-grp.mce-arrow-left:after{right:21px}div.mce-inline-toolbar-grp.mce-arrow-right:after,div.mce-inline-toolbar-grp.mce-arrow-right:before{right:auto;margin:0}div.mce-inline-toolbar-grp.mce-arrow-right:before{left:20px}div.mce-inline-toolbar-grp.mce-arrow-right:after{left:21px}div.mce-inline-toolbar-grp.mce-arrow-full{left:0}div.mce-inline-toolbar-grp.mce-arrow-full>div{width:100%;overflow-x:auto}div.mce-toolbar-grp>div{padding:3px}.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first{padding-left:32px}.mce-toolbar .mce-btn-group{margin:0}div.mce-statusbar{border-top:1px solid #e5e5e5}div.mce-path{padding:2px 10px;margin:0}.mce-path,.mce-path .mce-divider,.mce-path-item{font-size:12px}.mce-toolbar .mce-btn,.qt-dfw{border-color:transparent;background:0 0;-webkit-box-shadow:none;box-shadow:none;text-shadow:none;cursor:pointer}.mce-btn .mce-txt{direction:inherit;text-align:inherit}.mce-toolbar .mce-btn-group .mce-btn,.qt-dfw{border:1px solid transparent;margin:2px;-webkit-border-radius:2px;border-radius:2px}.mce-toolbar .mce-btn-group .mce-btn:focus,.mce-toolbar .mce-btn-group .mce-btn:hover,.qt-dfw:focus,.qt-dfw:hover{background:#fafafa;border-color:#555d66;color:#23282d;-webkit-box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);outline:0}.mce-toolbar .mce-btn-group .mce-btn.mce-active,.mce-toolbar .mce-btn-group .mce-btn:active,.qt-dfw.active{background:#ebebeb;border-color:#555d66;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.3);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.3)}.mce-toolbar .mce-btn-group .mce-btn.mce-active:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover{border-color:#23282d}.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover{color:#a0a5aa;background:0 0;border-color:#ddd;text-shadow:0 1px 0 #fff;-webkit-box-shadow:none;box-shadow:none}.mce-menu .mce-menu-item-preview.mce-active .mce-text,.mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico{color:#fff}.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus{border-color:#555d66}.mce-toolbar .mce-btn-group .mce-first,.mce-toolbar .mce-btn-group .mce-last{border-color:transparent}.mce-toolbar .mce-btn button,.qt-dfw{padding:2px 3px;line-height:normal}.mce-toolbar .mce-listbox button{font-size:13px;line-height:20px;padding-right:6px;padding-left:20px}.mce-toolbar .mce-btn i{text-shadow:none}.mce-toolbar .mce-btn-group>div{white-space:normal}.mce-toolbar .mce-colorbutton .mce-open{border-left:0}.mce-toolbar .mce-colorbutton .mce-preview{margin:0;padding:0;top:auto;bottom:2px;right:3px;height:3px;width:20px;background:#555d66}.mce-toolbar .mce-btn-group .mce-btn.mce-primary{min-width:0;background:#0085ba;border-color:#0073aa #006799 #006799;-webkit-box-shadow:0 1px 0 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:none}.mce-toolbar .mce-btn-group .mce-btn.mce-primary button{padding:2px 3px 1px}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover{background:#008ec2;border-color:#006799;color:#fff}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus{-webkit-box-shadow:0 0 1px 1px #33b3db;box-shadow:0 0 1px 1px #33b3db}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:active{background:#0073aa;border-color:#006799;-webkit-box-shadow:inset 0 2px 0 #006799;box-shadow:inset 0 2px 0 #006799}.mce-toolbar .mce-btn-group .mce-btn.mce-listbox{-webkit-border-radius:0;border-radius:0;direction:rtl;background:#fff;border:1px solid #ddd;-webkit-box-shadow:inset 0 1px 1px -1px rgba(0,0,0,.2);box-shadow:inset 0 1px 1px -1px rgba(0,0,0,.2)}.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover{border-color:#b4b9be}.mce-panel .mce-btn i.mce-caret{border-top:6px solid #555d66;margin-right:2px;margin-left:2px}.mce-listbox i.mce-caret{left:4px}.mce-panel .mce-btn:focus i.mce-caret,.mce-panel .mce-btn:hover i.mce-caret{border-top-color:#23282d}.mce-panel .mce-active i.mce-caret{border-top:0;border-bottom:6px solid #23282d;margin-top:7px}.mce-listbox.mce-active i.mce-caret{margin-top:-3px}.mce-toolbar .mce-splitbtn:hover .mce-open{border-left-color:transparent}.mce-toolbar .mce-splitbtn .mce-open.mce-active{background:0 0;outline:0}.mce-menu .mce-menu-item-normal.mce-active,.mce-menu .mce-menu-item-preview.mce-active,.mce-menu .mce-menu-item.mce-selected,.mce-menu .mce-menu-item:focus,.mce-menu .mce-menu-item:hover{background:#0073aa;color:#fff}.mce-menu .mce-menu-item-preview.mce-active{border-right:none}.mce-menu .mce-menu-item.mce-disabled{cursor:default}.mce-menu .mce-menu-item.mce-disabled:hover{background:#ccc}.mce-menubar{border-color:#e5e5e5;background:#fff;border-width:0 0 1px}.mce-menubar .mce-menubtn{margin:2px}.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus,.mce-menubar .mce-menubtn:hover{border-color:transparent;background:0 0}.mce-menubar .mce-menubtn:focus{color:#124964;-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.mce-menu-item-sep:hover,div.mce-menu .mce-menu-item-sep{border-bottom:1px solid #ddd;height:0;margin:5px 0}.mce-menubtn span{margin-left:0;padding-right:3px}.mce-menu-has-icons i.mce-ico:before{margin-right:-2px}.mce-menu.mce-menu-align .mce-menu-shortcut{bottom:.6em;font-size:.9em}.mce-primary button,.mce-primary button i{text-align:center;color:#fff;text-shadow:none;padding:0;line-height:26px}.mce-window .mce-btn{color:#555;background:#f7f7f7;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0;cursor:pointer;border:1px solid #ccc;-webkit-appearance:none;-webkit-border-radius:3px;border-radius:3px;white-space:nowrap;-webkit-box-shadow:0 1px 0 #ccc;box-shadow:0 1px 0 #ccc}.mce-window .mce-btn::-moz-focus-inner{border-width:0;border-style:none;padding:0}.mce-window .mce-btn:focus,.mce-window .mce-btn:hover{background:#fafafa;border-color:#999;color:#23282d}.mce-window .mce-btn:focus{border-color:#5b9dd9;-webkit-box-shadow:0 0 3px rgba(0,115,170,.8);box-shadow:0 0 3px rgba(0,115,170,.8)}.mce-window .mce-btn:active{background:#eee;border-color:#999;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);-webkit-transform:translateY(1px);-ms-transform:translateY(1px);transform:translateY(1px)}.mce-window .mce-btn.mce-disabled{color:#a0a5aa!important;border-color:#ddd!important;background:#f7f7f7!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;-webkit-transform:none!important;-ms-transform:none!important;transform:none!important}.mce-window .mce-btn.mce-primary{background:#0085ba;border-color:#0073aa #006799 #006799;-webkit-box-shadow:0 1px 0 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:0 -1px 1px #006799,-1px 0 1px #006799,0 1px 1px #006799,1px 0 1px #006799}.mce-window .mce-btn.mce-primary:focus,.mce-window .mce-btn.mce-primary:hover{background:#008ec2;border-color:#006799;color:#fff}.mce-window .mce-btn.mce-primary:focus{-webkit-box-shadow:0 1px 0 #0073aa,0 0 2px 1px #33b3db;box-shadow:0 1px 0 #0073aa,0 0 2px 1px #33b3db}.mce-window .mce-btn.mce-primary:active{background:#0073aa;border-color:#006799;-webkit-box-shadow:inset 0 2px 0 #006799;box-shadow:inset 0 2px 0 #006799;vertical-align:top}.mce-window .mce-btn.mce-primary.mce-disabled{color:#66c6e4!important;background:#008ec2!important;border-color:#007cb2!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:0 -1px 0 rgba(0,0,0,.1)!important;cursor:default}.mce-toolbar .mce-ico,.qt-dfw{text-shadow:none;text-align:center}.mce-menubtn.mce-fixed-width button{overflow-x:hidden;text-overflow:ellipsis;width:110px}.mce-charmap{margin:3px}.mce-charmap td{padding:0;border-color:#ddd;cursor:pointer}.mce-charmap td:hover{background:#f3f3f3}.mce-charmap td div{width:18px;height:22px;line-height:22px}.mce-toolbar .mce-btn .mce-open,.qt-dfw{line-height:20px}.mce-tooltip{margin-top:2px}.mce-tooltip-inner{-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 3px 5px rgba(0,0,0,.2);box-shadow:0 3px 5px rgba(0,0,0,.2);color:#fff;font-size:12px}.mce-ico{font-family:tinymce,Arial}.mce-btn-small .mce-ico{font-family:tinymce-small,Arial}.mce-toolbar .mce-ico{color:#555d66;line-height:20px;width:20px;height:20px;margin:0;padding:0}.qt-dfw{color:#555d66;width:28px;height:26px}.mce-toolbar .mce-btn.mce-active .mce-open,.mce-toolbar .mce-btn:focus .mce-open,.mce-toolbar .mce-btn:hover .mce-open{border-right-color:#23282d}div.mce-notification{right:10%!important;left:10%}.mce-notification button.mce-close{left:6px;top:3px;font-weight:400;color:#555d66}.mce-notification button.mce-close:focus,.mce-notification button.mce-close:hover{color:#000}i.mce-i-aligncenter,i.mce-i-alignjustify,i.mce-i-alignleft,i.mce-i-alignright,i.mce-i-backcolor,i.mce-i-blockquote,i.mce-i-bold,i.mce-i-bullist,i.mce-i-charmap,i.mce-i-dashicon,i.mce-i-dfw,i.mce-i-forecolor,i.mce-i-fullscreen,i.mce-i-help,i.mce-i-hr,i.mce-i-indent,i.mce-i-italic,i.mce-i-link,i.mce-i-ltr,i.mce-i-numlist,i.mce-i-outdent,i.mce-i-pastetext,i.mce-i-pasteword,i.mce-i-redo,i.mce-i-remove,i.mce-i-removeformat,i.mce-i-spellchecker,i.mce-i-strikethrough,i.mce-i-underline,i.mce-i-undo,i.mce-i-unlink,i.mce-i-wp-media-library,i.mce-i-wp_adv,i.mce-i-wp_code,i.mce-i-wp_fullscreen,i.mce-i-wp_help,i.mce-i-wp_more,i.mce-i-wp_page{font:400 20px/1 dashicons;padding:0 0 0 2px;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin-right:-2px}.qt-dfw{font:400 20px/1 dashicons;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}i.mce-i-bold:before{content:"\f200"}i.mce-i-italic:before{content:"\f201"}i.mce-i-bullist:before{content:"\f203"}i.mce-i-numlist:before{content:"\f204"}i.mce-i-blockquote:before{content:"\f205"}i.mce-i-alignleft:before{content:"\f206"}i.mce-i-aligncenter:before{content:"\f207"}i.mce-i-alignright:before{content:"\f208"}i.mce-i-link:before{content:"\f103"}i.mce-i-unlink:before{content:"\f225"}i.mce-i-wp_more:before{content:"\f209"}i.mce-i-strikethrough:before{content:"\f224"}i.mce-i-spellchecker:before{content:"\f210"}.qt-dfw:before,i.mce-i-dfw:before,i.mce-i-fullscreen:before,i.mce-i-wp_fullscreen:before{content:"\f211"}i.mce-i-wp_adv:before{content:"\f212"}i.mce-i-underline:before{content:"\f213"}i.mce-i-alignjustify:before{content:"\f214"}i.mce-i-backcolor:before,i.mce-i-forecolor:before{content:"\f215"}i.mce-i-pastetext:before{content:"\f217"}i.mce-i-removeformat:before{content:"\f218"}i.mce-i-charmap:before{content:"\f220"}i.mce-i-outdent:before{content:"\f221"}i.mce-i-indent:before{content:"\f222"}i.mce-i-undo:before{content:"\f171"}i.mce-i-redo:before{content:"\f172"}i.mce-i-help:before,i.mce-i-wp_help:before{content:"\f223"}i.mce-i-wp-media-library:before{content:"\f104"}i.mce-i-ltr:before{content:"\f320"}i.mce-i-wp_page:before{content:"\f105"}i.mce-i-hr:before{content:"\f460"}i.mce-i-remove:before{content:"\f158"}i.mce-i-wp_code:before{content:"\f475"}.rtl i.mce-i-outdent:before{content:"\f222"}.rtl i.mce-i-indent:before{content:"\f221"}.wp-editor-tools{z-index:1}.wp-editor-tools:after{clear:both;content:"";display:table}.wp-editor-container{clear:both}.wp-editor-area{font-family:Consolas,Monaco,monospace;font-size:13px;padding:10px;margin:1px 0 0;line-height:150%;border:0;outline:0;display:block;resize:vertical;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.rtl .wp-editor-area{font-family:Tahoma,Monaco,monospace}.locale-he-il .wp-editor-area{font-family:Arial,Monaco,monospace}.wp-editor-container textarea.wp-editor-area{width:100%;margin:0;-webkit-box-shadow:none;box-shadow:none}.wp-editor-tabs{float:left}.wp-switch-editor{float:right;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;top:1px;background:#ebebeb;color:#666;cursor:pointer;font-size:13px;line-height:19px;height:20px;margin:5px 5px 0 0;padding:3px 8px 4px;border:1px solid #e5e5e5}.wp-switch-editor:focus{-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:0;color:#23282d}.html-active .switch-html:focus,.tmce-active .switch-tmce:focus,.wp-switch-editor:active{-webkit-box-shadow:none;box-shadow:none}.wp-switch-editor:active{background-color:#f5f5f5;-webkit-box-shadow:none;box-shadow:none}.js .tmce-active .wp-editor-area{color:#fff}.tmce-active .quicktags-toolbar{display:none}.html-active .switch-html,.tmce-active .switch-tmce{background:#f5f5f5;color:#555;border-bottom-color:#f5f5f5}.wp-media-buttons{float:right}.wp-media-buttons .button{margin-left:5px;margin-bottom:4px;padding-right:7px;padding-left:7px}.wp-media-buttons .button:active{position:relative;top:1px;margin-top:-1px;margin-bottom:1px}.wp-media-buttons .insert-media{padding-right:5px}.wp-media-buttons a{text-decoration:none;color:#444;font-size:12px}.wp-media-buttons img{padding:0 4px;vertical-align:middle}.wp-media-buttons span.wp-media-buttons-icon{display:inline-block;width:18px;height:18px;vertical-align:text-top;margin:0 2px}.wp-media-buttons .add_media span.wp-media-buttons-icon{background:0 0}.wp-media-buttons .add_media span.wp-media-buttons-icon:before{font:400 18px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f104"}.quicktags-toolbar{padding:3px;border-bottom:1px solid #ddd;background:#f5f5f5;min-height:30px}.has-dfw .quicktags-toolbar{padding-left:35px}.wp-core-ui .quicktags-toolbar input.button.button-small{margin:2px}.quicktags-toolbar input[value=link]{text-decoration:underline}.quicktags-toolbar input[value=del]{text-decoration:line-through}.quicktags-toolbar input[value="i"]{font-style:italic}.quicktags-toolbar input[value="b"]{font-weight:600}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw,.qt-dfw{position:absolute;top:0;left:0;margin:5px 0 0 5px}.qt-fullscreen{position:static;margin:2px}@media screen and (max-width:782px){.mce-toolbar .mce-btn button,.qt-dfw{padding:6px 7px}.mce-toolbar .mce-btn-group .mce-btn.mce-primary button{padding:6px 7px 5px}.mce-toolbar .mce-btn-group .mce-btn{margin:1px}.qt-dfw{width:36px;height:34px}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw{margin:4px 0 0 4px}.mce-toolbar .mce-colorbutton .mce-preview{right:8px;bottom:6px}.mce-window .mce-btn{padding:2px 0}.has-dfw .quicktags-toolbar,.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first{padding-left:40px}}@media screen and (min-width:782px){.wp-core-ui .quicktags-toolbar input.button.button-small{font-size:12px;height:26px;line-height:24px}}#wp_editbtns,#wp_gallerybtns{padding:2px;position:absolute;display:none;z-index:100020}#wp_delgallery,#wp_delimgbtn,#wp_editgallery,#wp_editimgbtn{border-color:#999;background-color:#eee;margin:2px;padding:2px;border-width:1px;border-style:solid;-webkit-border-radius:3px;border-radius:3px}#wp_delgallery:hover,#wp_delimgbtn:hover,#wp_editgallery:hover,#wp_editimgbtn:hover{border-color:#555;background-color:#ccc}#wp-link-wrap{display:none;background-color:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);width:500px;overflow:hidden;margin-right:-250px;position:fixed;top:50%;right:50%;z-index:100105;-webkit-transition:height .2s,margin-top .2s;transition:height .2s,margin-top .2s;height:500px;margin-top:-250px}#wp-link-backdrop{display:none;position:fixed;top:0;right:0;left:0;bottom:0;min-height:360px;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:100100}#wp-link{position:relative;height:100%}#wp-link-wrap .wp-link-text-field{display:none}#wp-link-wrap.has-text-field .wp-link-text-field{display:block}#link-modal-title{background:#fcfcfc;border-bottom:1px solid #ddd;height:36px;font-size:18px;font-weight:600;line-height:36px;margin:0;padding:0 16px 0 36px}#wp-link-close{color:#666;padding:0;position:absolute;top:0;left:0;width:36px;height:36px;text-align:center;background:0 0;border:none;cursor:pointer}#wp-link-close:before{font:400 20px/36px dashicons;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:36px;height:36px;content:"\f158"}#wp-link-close:focus,#wp-link-close:hover{color:#00a0d2}#wp-link-close:focus{outline:0;-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}#wp-link-wrap #link-selector{-webkit-overflow-scrolling:touch;padding:0 16px;position:absolute;top:37px;right:0;left:0;bottom:44px}#wp-link ol,#wp-link ul{list-style:none;margin:0;padding:0}#wp-link input[type=text]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#wp-link #link-options{padding:8px 0 12px}#wp-link p.howto{margin:3px 0}#wp-link p.howto a{text-decoration:none;color:inherit}#wp-link label input[type=text]{margin-top:5px;width:70%}#wp-link #link-options label span,#wp-link #search-panel label span.search-label{display:inline-block;width:80px;text-align:left;padding-left:5px;max-width:24%;vertical-align:middle;word-wrap:break-word}#wp-link .link-search-field{float:right;width:250px;max-width:70%}#wp-link .link-search-wrapper{margin:5px 0 9px;display:block;overflow:hidden}#wp-link .link-search-wrapper span{float:right;margin-top:4px}#wp-link .link-search-wrapper .spinner{margin-top:5px}#wp-link .link-target{padding:3px 0 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#wp-link .link-target label{max-width:70%}#wp-link .query-results{border:1px solid #dfdfdf;margin:0 0 12px;background:#fff;overflow:auto;position:absolute;right:16px;left:16px;bottom:0;top:166px}.has-text-field #wp-link .query-results{top:200px}#wp-link li{clear:both;margin-bottom:0;border-bottom:1px solid #f1f1f1;color:#32373c;padding:4px 10px 4px 6px;cursor:pointer;position:relative}#wp-link .query-notice,#wp-link li.unselectable{border-bottom:1px solid #dfdfdf}#wp-link .query-notice{padding:0;background-color:#f7fcfe;color:#000}#wp-link .query-notice .query-notice-default,#wp-link .query-notice .query-notice-hint{display:block;padding:6px;border-right:4px solid #00a0d2}#wp-link .unselectable.no-matches-found{padding:0;border-bottom:1px solid #dfdfdf;background-color:#fef7f1}#wp-link .no-matches-found .item-title{display:block;padding:6px;border-right:4px solid #d54e21}#wp-link .query-results em{font-style:normal}#wp-link li:hover{background:#eaf2fa;color:#151515}#wp-link li.unselectable:hover{background:#fff;cursor:auto;color:#32373c}#wp-link li.selected{background:#ddd;color:#32373c}#wp-link li.selected .item-title{font-weight:600}#wp-link li:last-child{border:none}#wp-link .item-title{display:inline-block;width:80%;width:-webkit-calc(100% - 68px);width:calc(100% - 68px);word-wrap:break-word}#wp-link .item-info{text-transform:uppercase;color:#666;font-size:11px;position:absolute;left:5px;top:5px}#wp-link .river-waiting{display:none;padding:10px 0}#wp-link .submitbox{padding:8px 16px;background:#fcfcfc;border-top:1px solid #ddd;position:absolute;bottom:0;right:0;left:0}#wp-link-cancel{line-height:25px;float:right}#wp-link-update{line-height:23px;float:left}#wp-link-submit{float:left}@media screen and (max-width:782px){#wp-link-wrap{margin-top:-140px}#wp-link-wrap .query-results{top:195px}#wp-link-wrap.has-text-field .query-results{top:235px}#link-selector{padding:0 16px 60px}#wp-link-wrap #link-selector{bottom:52px}#wp-link-cancel{line-height:32px}#wp-link .link-target{padding-top:10px}#wp-link .submitbox .button{margin-bottom:0}}@media screen and (max-width:520px){#wp-link-wrap{width:auto;margin-right:0;right:10px;left:10px;max-width:500px}}@media screen and (max-height:520px){#wp-link-wrap{-webkit-transition:none;transition:none;height:auto;margin-top:0;top:10px;bottom:10px}#link-selector{overflow:auto}#search-panel .query-results{position:static}}@media screen and (max-height:290px){#wp-link-wrap{height:auto;margin-top:0;top:10px;bottom:10px}#link-selector{overflow:auto;height:-webkit-calc(100% - 92px);height:calc(100% - 92px);padding-bottom:2px}#search-panel .query-results{position:static}}div.wp-link-preview{float:right;margin:5px;max-width:694px;overflow:hidden;text-overflow:ellipsis}div.wp-link-preview a{color:#0073aa;text-decoration:underline;-webkit-transition-property:border,background,color;transition-property:border,background,color;-webkit-transition-duration:.05s;transition-duration:.05s;-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;cursor:pointer}div.wp-link-preview a.wplink-url-error{color:#dc3232}div.wp-link-input{float:right;margin:2px;max-width:694px}div.wp-link-input input{width:300px;padding:3px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mce-toolbar div.wp-link-input~.mce-btn,.mce-toolbar div.wp-link-preview~.mce-btn{margin:2px 1px}.mce-inline-toolbar-grp .mce-btn-group .mce-btn:last-child{margin-left:2px}.ui-autocomplete.wplink-autocomplete{z-index:100110;max-height:200px;overflow-y:auto;padding:0;margin:0;list-style:none;position:absolute;border:1px solid #5b9dd9;-webkit-box-shadow:0 1px 2px rgba(30,140,190,.8);box-shadow:0 1px 2px rgba(30,140,190,.8);background-color:#fff}.ui-autocomplete.wplink-autocomplete li{margin-bottom:0;padding:4px 10px;clear:both;white-space:normal;text-align:right}.ui-autocomplete.wplink-autocomplete li .wp-editor-float-right{float:left}.ui-autocomplete.wplink-autocomplete li.ui-state-focus{background-color:#ddd;cursor:pointer}@media screen and (max-width:782px){div.wp-link-input,div.wp-link-preview{max-width:70%;max-width:-webkit-calc(100% - 86px);max-width:calc(100% - 86px)}div.wp-link-preview{margin:8px 5px 8px 0}div.wp-link-input{width:300px}div.wp-link-input input{width:100%;font-size:16px;padding:5px}}.mce-fullscreen{z-index:100010}.rtl .quicktags-toolbar input,.rtl .wp-switch-editor{font-family:Tahoma,sans-serif}.mce-rtl .mce-flow-layout .mce-flow-layout-item>div{direction:rtl}.mce-rtl .mce-listbox i.mce-caret{left:6px}html:lang(he-il) .rtl .quicktags-toolbar input,html:lang(he-il) .rtl .wp-switch-editor{font-family:Arial,sans-serif}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.wp-media-buttons .add_media span.wp-media-buttons-icon{background:0 0}} \ No newline at end of file diff --git a/wp/wp-includes/css/editor.css b/wp/wp-includes/css/editor.css deleted file mode 100644 index e04317ec..00000000 --- a/wp/wp-includes/css/editor.css +++ /dev/null @@ -1,1905 +0,0 @@ -/*------------------------------------------------------------------------------ - TinyMCE and Quicklinks toolbars -------------------------------------------------------------------------------*/ - -/* TinyMCE widgets/containers */ - -.mce-container, -.mce-container *, -.mce-widget, -.mce-widget * { - color: inherit; - font-family: inherit; -} - -.mce-container .mce-monospace, -.mce-widget .mce-monospace { - font-family: Consolas, Monaco, monospace; - font-size: 13px; - line-height: 150%; -} - -/* TinyMCE windows */ -#mce-modal-block, -#mce-modal-block.mce-fade { - opacity: 0.7; - filter: alpha(opacity=70); - -webkit-transition: none; - transition: none; -} - -.mce-window { - -webkit-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); - box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); - -webkit-font-smoothing: subpixel-antialiased; - -webkit-transition: none; - transition: none; -} - -.mce-window .mce-container-body.mce-abs-layout { - overflow: visible; -} - -.mce-window .mce-window-head { - background: #fcfcfc; - border-bottom: 1px solid #ddd; - padding: 0; - min-height: 36px; -} - -.mce-window .mce-window-head .mce-title { - color: #444; - font-size: 18px; - font-weight: 600; - line-height: 36px; - margin: 0; - padding: 0 36px 0 16px; -} - -.mce-window .mce-window-head .mce-close, -.mce-window-head .mce-close .mce-i-remove { - color: transparent; - top: 0; - right: 0; - width: 36px; - height: 36px; - padding: 0; - line-height: 36px; - text-align: center; -} - -.mce-window-head .mce-close .mce-i-remove:before { - font: normal 20px/36px dashicons; - text-align: center; - color: #666; - width: 36px; - height: 36px; - display: block; -} - -.mce-window-head .mce-close:hover .mce-i-remove:before, -.mce-window-head .mce-close:focus .mce-i-remove:before { - color: #00a0d2; -} - -.mce-window-head .mce-close:focus .mce-i-remove, -div.mce-tab:focus { - -webkit-box-shadow: 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); -} - -.mce-window .mce-window-head .mce-dragh { - width: -webkit-calc( 100% - 36px ); - width: calc( 100% - 36px ); -} - -.mce-window .mce-foot { - border-top: 1px solid #ddd; -} - -.mce-textbox, -.mce-checkbox i.mce-i-checkbox, -#wp-link .query-results { - border: 1px solid #ddd; - -webkit-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.07); - box-shadow: inset 0 1px 2px rgba(0,0,0,0.07); - -webkit-transition: .05s all ease-in-out; - transition: .05s all ease-in-out; -} - -.mce-textbox:focus, -.mce-textbox.mce-focus, -.mce-checkbox:focus i.mce-i-checkbox, -#wp-link .query-results:focus { - border-color: #5b9dd9; - -webkit-box-shadow: 0 0 2px rgba(30,140,190,0.8); - box-shadow: 0 0 2px rgba(30,140,190,0.8); -} - -.mce-window .mce-wp-help { - height: 360px; - width: 460px; - overflow: auto; -} - -.mce-window .mce-wp-help * { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.mce-window .mce-wp-help > .mce-container-body { - width: auto !important; -} - -.mce-window .wp-editor-help { - padding: 10px 10px 0 20px; -} - -.mce-window .wp-editor-help h2, -.mce-window .wp-editor-help p { - margin: 8px 0; - white-space: normal; - font-size: 14px; - font-weight: 400; -} - -.mce-window .wp-editor-help table { - width: 100%; - margin-bottom: 20px; -} - -.mce-window .wp-editor-help table.wp-help-single { - margin: 0 8px 20px; -} - -.mce-window .wp-editor-help table.fixed { - table-layout: fixed; -} - -.mce-window .wp-editor-help table.fixed th:nth-child(odd), -.mce-window .wp-editor-help table.fixed td:nth-child(odd) { - width: 12%; -} - -.mce-window .wp-editor-help table.fixed th:nth-child(even), -.mce-window .wp-editor-help table.fixed td:nth-child(even) { - width: 38%; -} - -.mce-window .wp-editor-help table.fixed th:nth-child(odd) { - padding: 5px 0 0; -} - -.mce-window .wp-editor-help td, -.mce-window .wp-editor-help th { - font-size: 13px; - padding: 5px; - vertical-align: middle; - word-wrap: break-word; - white-space: normal; -} - -.mce-window .wp-editor-help th { - font-weight: 600; - padding-bottom: 0; -} - -.mce-window .wp-editor-help kbd { - font-family: monospace; - padding: 2px 7px 3px; - font-weight: 600; - margin: 0; - background: #eaeaea; - background: rgba(0,0,0,0.08); -} - -.mce-window .wp-help-th-center td:nth-child(odd), -.mce-window .wp-help-th-center th:nth-child(odd) { - text-align: center; -} - -/* TinyMCE menus */ -.mce-menu, -.mce-floatpanel.mce-popover { - border-color: rgba(0,0,0,0.15); - -webkit-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 ); - box-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 ); -} - -.mce-menu, -.mce-floatpanel.mce-popover.mce-bottom { - margin-top: 2px; -} - -.mce-floatpanel .mce-arrow { - display: none; -} - -.mce-menu .mce-container-body { - min-width: 160px; -} - -.mce-menu-item { - border: none; - margin-bottom: 2px; -} - -.mce-menu-has-icons i.mce-ico { - line-height: 20px; -} - -/* TinyMCE panel */ -div.mce-panel { - border: 0; - background: #fff; -} - -.mce-panel.mce-menu { - border: 1px solid #ddd; -} - -div.mce-tab { - line-height: 13px; -} - -/* TinyMCE toolbars */ -div.mce-toolbar-grp { - border-bottom: 1px solid #ddd; - background: #f5f5f5; - padding: 0; - position: relative; -} - -div.mce-inline-toolbar-grp { - border: 1px solid #a0a5aa; - -webkit-border-radius: 2px; - border-radius: 2px; - -webkit-box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.15 ); - box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.15 ); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-bottom: 8px; - position: absolute; - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - max-width: 98%; - z-index: 100100; /* Same as the other TinyMCE "panels" */ -} - -div.mce-inline-toolbar-grp > div.mce-stack-layout { - padding: 1px; -} - -div.mce-inline-toolbar-grp.mce-arrow-up { - margin-bottom: 0; - margin-top: 8px; -} - -div.mce-inline-toolbar-grp:before, -div.mce-inline-toolbar-grp:after { - position: absolute; - left: 50%; - display: block; - width: 0; - height: 0; - border-style: solid; - border-color: transparent; - content: ""; -} - -div.mce-inline-toolbar-grp.mce-arrow-up:before { - top: -9px; - border-bottom-color: #a0a5aa; - border-width: 0 9px 9px; - margin-left: -9px; -} - -div.mce-inline-toolbar-grp.mce-arrow-down:before { - bottom: -9px; - border-top-color: #a0a5aa; - border-width: 9px 9px 0; - margin-left: -9px; -} - -div.mce-inline-toolbar-grp.mce-arrow-up:after { - top: -8px; - border-bottom-color: #f5f5f5; - border-width: 0 8px 8px; - margin-left: -8px; -} - -div.mce-inline-toolbar-grp.mce-arrow-down:after { - bottom: -8px; - border-top-color: #f5f5f5; - border-width: 8px 8px 0; - margin-left: -8px; -} - -div.mce-inline-toolbar-grp.mce-arrow-left:before, -div.mce-inline-toolbar-grp.mce-arrow-left:after { - margin: 0; -} - -div.mce-inline-toolbar-grp.mce-arrow-left:before { - left: 20px; -} -div.mce-inline-toolbar-grp.mce-arrow-left:after { - left: 21px; -} - -div.mce-inline-toolbar-grp.mce-arrow-right:before, -div.mce-inline-toolbar-grp.mce-arrow-right:after { - left: auto; - margin: 0; -} - -div.mce-inline-toolbar-grp.mce-arrow-right:before { - right: 20px; -} - -div.mce-inline-toolbar-grp.mce-arrow-right:after { - right: 21px; -} - -div.mce-inline-toolbar-grp.mce-arrow-full { - right: 0; -} - -div.mce-inline-toolbar-grp.mce-arrow-full > div { - width: 100%; - overflow-x: auto; -} - -div.mce-toolbar-grp > div { - padding: 3px; -} - -.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first { - padding-right: 32px; -} - -.mce-toolbar .mce-btn-group { - margin: 0; -} - -div.mce-statusbar { - border-top: 1px solid #e5e5e5; -} - -div.mce-path { - padding: 2px 10px; - margin: 0; -} - -.mce-path, -.mce-path-item, -.mce-path .mce-divider { - font-size: 12px; -} - -.mce-toolbar .mce-btn, -.qt-dfw { - border-color: transparent; - background: transparent; - -webkit-box-shadow: none; - box-shadow: none; - text-shadow: none; - cursor: pointer; -} - -.mce-btn .mce-txt { - direction: inherit; - text-align: inherit; -} - -.mce-toolbar .mce-btn-group .mce-btn, -.qt-dfw { - border: 1px solid transparent; - margin: 2px; - -webkit-border-radius: 2px; - border-radius: 2px; -} - -.mce-toolbar .mce-btn-group .mce-btn:hover, -.mce-toolbar .mce-btn-group .mce-btn:focus, -.qt-dfw:hover, -.qt-dfw:focus { - background: #fafafa; - border-color: #555d66; - color: #23282d; - -webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 ); - box-shadow: inset 0 1px 0 #fff, 0 1px 0 rgba( 0, 0, 0, 0.08 ); - outline: none; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-active, -.mce-toolbar .mce-btn-group .mce-btn:active, -.qt-dfw.active { - background: #ebebeb; - border-color: #555d66; - -webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.3 ); - box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.3 ); -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover, -.mce-toolbar .mce-btn-group .mce-btn.mce-active:focus { - border-color: #23282d; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover, -.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus { - color: #a0a5aa; - background: none; - border-color: #ddd; - text-shadow: 0 1px 0 #fff; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus { - border-color: #555d66; -} - -.mce-toolbar .mce-btn-group .mce-first, -.mce-toolbar .mce-btn-group .mce-last { - border-color: transparent; -} - -.mce-toolbar .mce-btn button, -.qt-dfw { - padding: 2px 3px; - line-height: normal; -} - -.mce-toolbar .mce-listbox button { - font-size: 13px; - line-height: 20px; - padding-left: 6px; - padding-right: 20px; -} - -.mce-toolbar .mce-btn i { - text-shadow: none; -} - -.mce-toolbar .mce-btn-group > div { - white-space: normal; -} - -.mce-toolbar .mce-colorbutton .mce-open { - border-right: 0; -} - -.mce-toolbar .mce-colorbutton .mce-preview { - margin: 0; - padding: 0; - top: auto; - bottom: 2px; - left: 3px; - height: 3px; - width: 20px; - background: #555d66; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-primary { - min-width: 0; - background: #0085ba; - border-color: #0073aa #006799 #006799; - -webkit-box-shadow: 0 1px 0 #006799; - box-shadow: 0 1px 0 #006799; - color: #fff; - text-decoration: none; - text-shadow: none; -} - -/* Compensate for the extra box shadow at the bottom of .mce-btn.mce-primary */ -.mce-toolbar .mce-btn-group .mce-btn.mce-primary button { - padding: 2px 3px 1px; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico { - color: #fff; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover, -.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus { - background: #008ec2; - border-color: #006799; - color: #fff; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus { - -webkit-box-shadow: 0 0 1px 1px #33b3db; - box-shadow: 0 0 1px 1px #33b3db; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-primary:active { - background: #0073aa; - border-color: #006799; - -webkit-box-shadow: inset 0 2px 0 #006799; - box-shadow: inset 0 2px 0 #006799; -} - -/* mce listbox */ -.mce-toolbar .mce-btn-group .mce-btn.mce-listbox { - -webkit-border-radius: 0; - border-radius: 0; - direction: ltr; - background: #fff; - border: 1px solid #ddd; - -webkit-box-shadow: inset 0 1px 1px -1px rgba(0, 0, 0, .2); - box-shadow: inset 0 1px 1px -1px rgba(0, 0, 0, .2); -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover, -.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:focus { - border-color: #b4b9be; -} - -.mce-panel .mce-btn i.mce-caret { - border-top: 6px solid #555d66; - margin-left: 2px; - margin-right: 2px; -} - -.mce-listbox i.mce-caret { - right: 4px; -} - -.mce-panel .mce-btn:hover i.mce-caret, -.mce-panel .mce-btn:focus i.mce-caret { - border-top-color: #23282d; -} - -.mce-panel .mce-active i.mce-caret { - border-top: 0; - border-bottom: 6px solid #23282d; - margin-top: 7px; -} - -.mce-listbox.mce-active i.mce-caret { - margin-top: -3px; -} - -.mce-toolbar .mce-splitbtn:hover .mce-open { - border-right-color: transparent; -} - -.mce-toolbar .mce-splitbtn .mce-open.mce-active { - background: transparent; - outline: none; -} - -.mce-menu .mce-menu-item:hover, -.mce-menu .mce-menu-item.mce-selected, -.mce-menu .mce-menu-item:focus, -.mce-menu .mce-menu-item-normal.mce-active, -.mce-menu .mce-menu-item-preview.mce-active { - background: #0073aa; /* See color scheme. */ - color: #fff; -} - -.mce-menu .mce-menu-item-preview.mce-active { - border-left: none; -} - -.mce-menu .mce-menu-item-preview.mce-active .mce-text { - color: #fff; -} - -.mce-menu .mce-menu-item.mce-disabled { - cursor: default; -} - -.mce-menu .mce-menu-item.mce-disabled:hover { - background: #ccc; -} - -/* Menubar */ -.mce-menubar { - border-color: #e5e5e5; - background: #fff; - border-width: 0px 0px 1px; -} - -.mce-menubar .mce-menubtn { - margin: 2px; -} - -.mce-menubar .mce-menubtn:hover, -.mce-menubar .mce-menubtn.mce-active, -.mce-menubar .mce-menubtn:focus { - border-color: transparent; - background: transparent; -} - -.mce-menubar .mce-menubtn:focus { - color: #124964; - -webkit-box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); -} - -div.mce-menu .mce-menu-item-sep, -.mce-menu-item-sep:hover { - border-bottom: 1px solid #ddd; - height: 0px; - margin: 5px 0; -} - -.mce-menubtn span { - margin-right: 0; - padding-left: 3px; -} - -.mce-menu-has-icons i.mce-ico:before { - margin-left: -2px; -} - -/* Keyboard shortcuts position */ -.mce-menu.mce-menu-align .mce-menu-item-normal { - position: relative; -} - -.mce-menu.mce-menu-align .mce-menu-shortcut { - bottom: 0.6em; - font-size: 0.9em; -} - -/* Buttons in modals */ -.mce-primary button, -.mce-primary button i { - text-align: center; - color: #fff; - text-shadow: none; - padding: 0; - line-height: 26px; -} - -.mce-window .mce-btn { - color: #555; - background: #f7f7f7; - text-decoration: none; - font-size: 13px; - line-height: 26px; - height: 28px; - margin: 0; - padding: 0; - cursor: pointer; - border: 1px solid #cccccc; - -webkit-appearance: none; - -webkit-border-radius: 3px; - border-radius: 3px; - white-space: nowrap; - -webkit-box-shadow: 0 1px 0 #cccccc; - box-shadow: 0 1px 0 #cccccc; -} - -/* Remove the dotted border on :focus and the extra padding in Firefox */ -.mce-window .mce-btn::-moz-focus-inner { - border-width: 0; - border-style: none; - padding: 0; -} - -.mce-window .mce-btn:hover, -.mce-window .mce-btn:focus { - background: #fafafa; - border-color: #999; - color: #23282d; -} - -.mce-window .mce-btn:focus { - border-color: #5b9dd9; - -webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); - box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); -} - -.mce-window .mce-btn:active { - background: #eee; - border-color: #999; - -webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); - box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); - -webkit-transform: translateY(1px); - -ms-transform: translateY(1px); - transform: translateY(1px); -} - -.mce-window .mce-btn.mce-disabled { - color: #a0a5aa !important; - border-color: #ddd !important; - background: #f7f7f7 !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - text-shadow: 0 1px 0 #fff !important; - cursor: default; - -webkit-transform: none !important; - -ms-transform: none !important; - transform: none !important; -} - -.mce-window .mce-btn.mce-primary { - background: #0085ba; - border-color: #0073aa #006799 #006799; - -webkit-box-shadow: 0 1px 0 #006799; - box-shadow: 0 1px 0 #006799; - color: #fff; - text-decoration: none; - text-shadow: 0 -1px 1px #006799, - 1px 0 1px #006799, - 0 1px 1px #006799, - -1px 0 1px #006799; -} - -.mce-window .mce-btn.mce-primary:hover, -.mce-window .mce-btn.mce-primary:focus { - background: #008ec2; - border-color: #006799; - color: #fff; -} - -.mce-window .mce-btn.mce-primary:focus { - -webkit-box-shadow: 0 1px 0 #0073aa, - 0 0 2px 1px #33b3db; - box-shadow: 0 1px 0 #0073aa, - 0 0 2px 1px #33b3db; -} - -.mce-window .mce-btn.mce-primary:active { - background: #0073aa; - border-color: #006799; - -webkit-box-shadow: inset 0 2px 0 #006799; - box-shadow: inset 0 2px 0 #006799; - vertical-align: top; -} - -.mce-window .mce-btn.mce-primary.mce-disabled { - color: #66c6e4 !important; - background: #008ec2 !important; - border-color: #007cb2 !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - text-shadow: 0 -1px 0 rgba( 0, 0, 0, 0.1 ) !important; - cursor: default; -} - -.mce-menubtn.mce-fixed-width button { - overflow-x: hidden; - text-overflow: ellipsis; - width: 110px; -} - -/* Charmap modal */ -.mce-charmap { - margin: 3px; -} - -.mce-charmap td { - padding: 0; - border-color: #ddd; - cursor: pointer; -} - -.mce-charmap td:hover { - background: #f3f3f3; -} - -.mce-charmap td div { - width: 18px; - height: 22px; - line-height: 22px; -} - -/* TinyMCE tooltips */ -.mce-tooltip { - margin-top: 2px; -} - -.mce-tooltip-inner { - -webkit-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 ); - box-shadow: 0 3px 5px rgba( 0, 0, 0, 0.2 ); - color: #fff; - font-size: 12px; -} - -/* TinyMCE icons */ -.mce-ico { - font-family: 'tinymce', Arial; -} - -.mce-btn-small .mce-ico { - font-family: 'tinymce-small', Arial; -} - -.mce-toolbar .mce-ico { - color: #555d66; - line-height: 20px; - width: 20px; - height: 20px; - text-align: center; - text-shadow: none; - margin: 0; - padding: 0; -} - -.qt-dfw { - color: #555d66; - line-height: 20px; - width: 28px; - height: 26px; - text-align: center; - text-shadow: none; -} - -.mce-toolbar .mce-btn .mce-open { - line-height: 20px; -} - -.mce-toolbar .mce-btn:hover .mce-open, -.mce-toolbar .mce-btn:focus .mce-open, -.mce-toolbar .mce-btn.mce-active .mce-open { - border-left-color: #23282d; -} - -div.mce-notification { - left: 10% !important; - right: 10%; -} - -.mce-notification button.mce-close { - right: 6px; - top: 3px; - font-weight: 400; - color: #555d66; -} - -.mce-notification button.mce-close:hover, -.mce-notification button.mce-close:focus { - color: #000; -} - -i.mce-i-bold, -i.mce-i-italic, -i.mce-i-bullist, -i.mce-i-numlist, -i.mce-i-blockquote, -i.mce-i-alignleft, -i.mce-i-aligncenter, -i.mce-i-alignright, -i.mce-i-link, -i.mce-i-unlink, -i.mce-i-wp_more, -i.mce-i-strikethrough, -i.mce-i-spellchecker, -i.mce-i-fullscreen, -i.mce-i-wp_fullscreen, -i.mce-i-dfw, -i.mce-i-wp_adv, -i.mce-i-underline, -i.mce-i-alignjustify, -i.mce-i-forecolor, -i.mce-i-backcolor, -i.mce-i-pastetext, -i.mce-i-pasteword, -i.mce-i-removeformat, -i.mce-i-charmap, -i.mce-i-outdent, -i.mce-i-indent, -i.mce-i-undo, -i.mce-i-redo, -i.mce-i-help, -i.mce-i-wp_help, -i.mce-i-wp-media-library, -i.mce-i-ltr, -i.mce-i-wp_page, -i.mce-i-hr, -i.mce-i-wp_code, -i.mce-i-dashicon, -i.mce-i-remove { - font: normal 20px/1 dashicons; - padding: 0; - vertical-align: top; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - margin-left: -2px; - padding-right: 2px; -} - -.qt-dfw { - font: normal 20px/1 dashicons; - vertical-align: top; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -i.mce-i-bold:before { - content: "\f200"; -} - -i.mce-i-italic:before { - content: "\f201"; -} - -i.mce-i-bullist:before { - content: "\f203"; -} - -i.mce-i-numlist:before { - content: "\f204"; -} - -i.mce-i-blockquote:before { - content: "\f205"; -} - -i.mce-i-alignleft:before { - content: "\f206"; -} - -i.mce-i-aligncenter:before { - content: "\f207"; -} - -i.mce-i-alignright:before { - content: "\f208"; -} - -i.mce-i-link:before { - content: "\f103"; -} - -i.mce-i-unlink:before { - content: "\f225"; -} - -i.mce-i-wp_more:before { - content: "\f209"; -} - -i.mce-i-strikethrough:before { - content: "\f224"; -} - -i.mce-i-spellchecker:before { - content: "\f210"; -} - -i.mce-i-fullscreen:before, -i.mce-i-wp_fullscreen:before, -i.mce-i-dfw:before, -.qt-dfw:before { - content: "\f211"; -} - -i.mce-i-wp_adv:before { - content: "\f212"; -} - -i.mce-i-underline:before { - content: "\f213"; -} - -i.mce-i-alignjustify:before { - content: "\f214"; -} - -i.mce-i-forecolor:before, -i.mce-i-backcolor:before { - content: "\f215"; -} - -i.mce-i-pastetext:before { - content: "\f217"; -} - -i.mce-i-removeformat:before { - content: "\f218"; -} - -i.mce-i-charmap:before { - content: "\f220"; -} - -i.mce-i-outdent:before { - content: "\f221"; -} - -i.mce-i-indent:before { - content: "\f222"; -} - -i.mce-i-undo:before { - content: "\f171"; -} - -i.mce-i-redo:before { - content: "\f172"; -} - -i.mce-i-help:before, -i.mce-i-wp_help:before { - content: "\f223"; -} - -i.mce-i-wp-media-library:before { - content: "\f104"; -} - -i.mce-i-ltr:before { - content: "\f320"; -} - -i.mce-i-wp_page:before { - content: "\f105"; -} - -i.mce-i-hr:before { - content: "\f460"; -} - -i.mce-i-remove:before { - content: "\f158"; -} - -i.mce-i-wp_code:before { - content: "\f475"; -} - -/* RTL button icons */ -.rtl i.mce-i-outdent:before { - content: "\f222"; -} - -.rtl i.mce-i-indent:before { - content: "\f221"; -} - -/* Editors */ -.wp-editor-wrap { - position: relative; -} - -.wp-editor-tools { - position: relative; - z-index: 1; -} - -.wp-editor-tools:after { - clear: both; - content: ""; - display: table; -} - -.wp-editor-container { - clear: both; -} - -.wp-editor-area { - font-family: Consolas, Monaco, monospace; - font-size: 13px; - padding: 10px; - margin: 1px 0 0; - line-height: 150%; - border: 0; - outline: none; - display: block; - resize: vertical; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.rtl .wp-editor-area { - font-family: Tahoma, Monaco, monospace; -} - -.locale-he-il .wp-editor-area { - font-family: Arial, Monaco, monospace; -} - -.wp-editor-container textarea.wp-editor-area { - width: 100%; - margin: 0; - -webkit-box-shadow: none; - box-shadow: none; -} - -.wp-editor-tabs { - float: right; -} - -.wp-switch-editor { - float: left; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - position: relative; - top: 1px; - background: #ebebeb; - color: #666; - cursor: pointer; - font-size: 13px; - line-height: 19px; - height: 20px; - margin: 5px 0 0 5px; - padding: 3px 8px 4px; - border: 1px solid #e5e5e5; -} - -.wp-switch-editor:focus { - -webkit-box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - outline: none; - color: #23282d; -} - -.wp-switch-editor:active, -.html-active .switch-html:focus, -.tmce-active .switch-tmce:focus { - -webkit-box-shadow: none; - box-shadow: none; -} - -.wp-switch-editor:active { - background-color: #f5f5f5; - -webkit-box-shadow: none; - box-shadow: none; -} - -.js .tmce-active .wp-editor-area { - color: #fff; -} - -.tmce-active .quicktags-toolbar { - display: none; -} - -.tmce-active .switch-tmce, -.html-active .switch-html { - background: #f5f5f5; - color: #555; - border-bottom-color: #f5f5f5; -} - -.wp-media-buttons { - float: left; -} - -.wp-media-buttons .button { - margin-right: 5px; - margin-bottom: 4px; - padding-left: 7px; - padding-right: 7px; -} - -.wp-media-buttons .button:active { - position: relative; - top: 1px; - margin-top: -1px; - margin-bottom: 1px; -} - -.wp-media-buttons .insert-media { - padding-left: 5px; -} - -.wp-media-buttons a { - text-decoration: none; - color: #444; - font-size: 12px; -} - -.wp-media-buttons img { - padding: 0 4px; - vertical-align: middle; -} - -.wp-media-buttons span.wp-media-buttons-icon { - display: inline-block; - width: 18px; - height: 18px; - vertical-align: text-top; - margin: 0 2px; -} - -.wp-media-buttons .add_media span.wp-media-buttons-icon { - background: none; -} - -.wp-media-buttons .add_media span.wp-media-buttons-icon:before { - font: normal 18px/1 dashicons; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.wp-media-buttons .add_media span.wp-media-buttons-icon:before { - content: "\f104"; -} - -/* Quicktags */ -.quicktags-toolbar { - padding: 3px; - position: relative; - border-bottom: 1px solid #ddd; - background: #f5f5f5; - min-height: 30px; -} - -.has-dfw .quicktags-toolbar { - padding-right: 35px; -} - -.wp-core-ui .quicktags-toolbar input.button.button-small { - margin: 2px; -} - -.quicktags-toolbar input[value="link"] { - text-decoration: underline; -} - -.quicktags-toolbar input[value="del"] { - text-decoration: line-through; -} - -.quicktags-toolbar input[value="i"] { - font-style: italic; -} - -.quicktags-toolbar input[value="b"] { - font-weight: 600; -} - -.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw, -.qt-dfw { - position: absolute; - top: 0; - right: 0; - margin: 5px 5px 0 0; -} - -.qt-fullscreen { - position: static; - margin: 2px; -} - -@media screen and ( max-width: 782px ) { - .mce-toolbar .mce-btn button, - .qt-dfw { - padding: 6px 7px; - } - - /* Compensate for the extra box shadow at the bottom of .mce-btn.mce-primary */ - .mce-toolbar .mce-btn-group .mce-btn.mce-primary button { - padding: 6px 7px 5px; - } - - .mce-toolbar .mce-btn-group .mce-btn { - margin: 1px; - } - - .qt-dfw { - width: 36px; - height: 34px; - } - - .mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw { - margin: 4px 4px 0 0; - } - - .mce-toolbar .mce-colorbutton .mce-preview { - left: 8px; - bottom: 6px; - } - - .mce-window .mce-btn { - padding: 2px 0; - } - - .has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first, - .has-dfw .quicktags-toolbar { - padding-right: 40px; - } -} - -@media screen and ( min-width: 782px ) { - .wp-core-ui .quicktags-toolbar input.button.button-small { - /* .button-small is normally 11px, but a bit too small for these buttons. */ - font-size: 12px; - height: 26px; - line-height: 24px; - } -} - -#wp_editbtns, -#wp_gallerybtns { - padding: 2px; - position: absolute; - display: none; - z-index: 100020; -} - -#wp_editimgbtn, -#wp_delimgbtn, -#wp_editgallery, -#wp_delgallery { - border-color: #999; - background-color: #eee; - margin: 2px; - padding: 2px; - border-width: 1px; - border-style: solid; - -webkit-border-radius: 3px; - border-radius: 3px; -} - -#wp_editimgbtn:hover, -#wp_delimgbtn:hover, -#wp_editgallery:hover, -#wp_delgallery:hover { - border-color: #555; - background-color: #ccc; -} - -/*------------------------------------------------------------------------------ - wp-link -------------------------------------------------------------------------------*/ - -#wp-link-wrap { - display: none; - background-color: #fff; - -webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); - box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); - width: 500px; - overflow: hidden; - margin-left: -250px; - margin-top: -125px; - position: fixed; - top: 50%; - left: 50%; - z-index: 100105; - -webkit-transition: height 0.2s, margin-top 0.2s; - transition: height 0.2s, margin-top 0.2s; -} - -#wp-link-backdrop { - display: none; - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - min-height: 360px; - background: #000; - opacity: 0.7; - filter: alpha(opacity=70); - z-index: 100100; -} - -#wp-link { - position: relative; - height: 100%; -} - -#wp-link-wrap { - height: 500px; - margin-top: -250px; -} - -#wp-link-wrap .wp-link-text-field { - display: none; -} - -#wp-link-wrap.has-text-field .wp-link-text-field { - display: block; -} - -#link-modal-title { - background: #fcfcfc; - border-bottom: 1px solid #ddd; - height: 36px; - font-size: 18px; - font-weight: 600; - line-height: 36px; - margin: 0; - padding: 0 36px 0 16px; -} - -#wp-link-close { - color: #666; - padding: 0; - position: absolute; - top: 0; - right: 0; - width: 36px; - height: 36px; - text-align: center; - background: none; - border: none; - cursor: pointer; -} - -#wp-link-close:before { - font: normal 20px/36px dashicons; - vertical-align: top; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - width: 36px; - height: 36px; - content: "\f158"; -} - -#wp-link-close:hover, -#wp-link-close:focus { - color: #00a0d2; -} - -#wp-link-close:focus { - outline: none; - -webkit-box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); -} - -#wp-link-wrap #link-selector { - -webkit-overflow-scrolling: touch; - padding: 0 16px; - position: absolute; - top: 37px; - left: 0; - right: 0; - bottom: 44px; -} - -#wp-link ol, -#wp-link ul { - list-style: none; - margin: 0; - padding: 0; -} - -#wp-link input[type="text"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -#wp-link #link-options { - padding: 8px 0 12px; -} - -#wp-link p.howto { - margin: 3px 0; -} - -#wp-link p.howto a { - text-decoration: none; - color: inherit; -} - -#wp-link label input[type="text"] { - margin-top: 5px; - width: 70%; -} - -#wp-link #link-options label span, -#wp-link #search-panel label span.search-label { - display: inline-block; - width: 80px; - text-align: right; - padding-right: 5px; - max-width: 24%; - vertical-align: middle; - word-wrap: break-word; -} - -#wp-link .link-search-field { - float: left; - width: 250px; - max-width: 70%; -} - -#wp-link .link-search-wrapper { - margin: 5px 0 9px; - display: block; - overflow: hidden; -} - -#wp-link .link-search-wrapper span { - float: left; - margin-top: 4px; -} - -#wp-link .link-search-wrapper .spinner { - margin-top: 5px; -} - -#wp-link .link-target { - padding: 3px 0 0; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -#wp-link .link-target label { - max-width: 70%; -} - -#wp-link .query-results { - border: 1px #dfdfdf solid; - margin: 0 0 12px; - background: #fff; - overflow: auto; - position: absolute; - left: 16px; - right: 16px; - bottom: 0; - top: 166px; -} - -.has-text-field #wp-link .query-results { - top: 200px; -} - -#wp-link li { - clear: both; - margin-bottom: 0; - border-bottom: 1px solid #f1f1f1; - color: #32373c; - padding: 4px 6px 4px 10px; - cursor: pointer; - position: relative; -} - -#wp-link .query-notice { - padding: 0; - border-bottom: 1px solid #dfdfdf; - background-color: #f7fcfe; - color: #000; -} - -#wp-link .query-notice .query-notice-default, -#wp-link .query-notice .query-notice-hint { - display: block; - padding: 6px; - border-left: 4px solid #00a0d2; -} - -#wp-link .unselectable.no-matches-found { - padding: 0; - border-bottom: 1px solid #dfdfdf; - background-color: #fef7f1; -} - -#wp-link .no-matches-found .item-title { - display: block; - padding: 6px; - border-left: 4px solid #d54e21; -} - -#wp-link .query-results em { - font-style: normal; -} - -#wp-link li:hover { - background: #eaf2fa; - color: #151515; -} - -#wp-link li.unselectable { - border-bottom: 1px solid #dfdfdf; -} - -#wp-link li.unselectable:hover { - background: #fff; - cursor: auto; - color: #32373c; -} - -#wp-link li.selected { - background: #ddd; - color: #32373c; -} - -#wp-link li.selected .item-title { - font-weight: 600; -} - -#wp-link li:last-child { - border: none; -} - -#wp-link .item-title { - display: inline-block; - width: 80%; - width: -webkit-calc(100% - 68px); - width: calc(100% - 68px); - word-wrap: break-word; -} - -#wp-link .item-info { - text-transform: uppercase; - color: #666; - font-size: 11px; - position: absolute; - right: 5px; - top: 5px; -} - -#wp-link .river-waiting { - display: none; - padding: 10px 0; -} - -#wp-link .submitbox { - padding: 8px 16px; - background: #fcfcfc; - border-top: 1px solid #ddd; - position: absolute; - bottom: 0; - left: 0; - right: 0; -} - -#wp-link-cancel { - line-height: 25px; - float: left; -} - -#wp-link-update { - line-height: 23px; - float: right; -} - -#wp-link-submit { - float: right; -} - -@media screen and ( max-width: 782px ) { - #wp-link-wrap { - margin-top: -140px; - } - - #wp-link-wrap .query-results { - top: 195px; - } - - #wp-link-wrap.has-text-field .query-results { - top: 235px; - } - - #link-selector { - padding: 0 16px 60px; - } - - #wp-link-wrap #link-selector { - bottom: 52px; - } - - #wp-link-cancel { - line-height: 32px; - } - - #wp-link .link-target { - padding-top: 10px; - } - - #wp-link .submitbox .button { - margin-bottom: 0; - } -} - -@media screen and ( max-width: 520px ) { - #wp-link-wrap { - width: auto; - margin-left: 0; - left: 10px; - right: 10px; - max-width: 500px; - } -} - -@media screen and ( max-height: 520px ) { - #wp-link-wrap { - -webkit-transition: none; - transition: none; - height: auto; - margin-top: 0; - top: 10px; - bottom: 10px; - } - - #link-selector { - overflow: auto; - } - - #search-panel .query-results { - position: static; - } -} - -@media screen and ( max-height: 290px ) { - #wp-link-wrap { - height: auto; - margin-top: 0; - top: 10px; - bottom: 10px; - } - - #link-selector { - overflow: auto; - height: -webkit-calc(100% - 92px); - height: calc(100% - 92px); - padding-bottom: 2px; - } - - #search-panel .query-results { - position: static; - } -} - -div.wp-link-preview { - float: left; - margin: 5px; - max-width: 694px; - overflow: hidden; - text-overflow: ellipsis; -} - -div.wp-link-preview a { - color: #0073aa; - text-decoration: underline; - -webkit-transition-property: border, background, color; - transition-property: border, background, color; - -webkit-transition-duration: .05s; - transition-duration: .05s; - -webkit-transition-timing-function: ease-in-out; - transition-timing-function: ease-in-out; - cursor: pointer; -} - -div.wp-link-preview a.wplink-url-error { - color: #dc3232; -} - -div.wp-link-input { - float: left; - margin: 2px; - max-width: 694px; -} - -div.wp-link-input input { - width: 300px; - padding: 3px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.mce-toolbar div.wp-link-preview ~ .mce-btn, -.mce-toolbar div.wp-link-input ~ .mce-btn { - margin: 2px 1px; -} - -.mce-inline-toolbar-grp .mce-btn-group .mce-btn:last-child { - margin-right: 2px; -} - -.ui-autocomplete.wplink-autocomplete { - z-index: 100110; - max-height: 200px; - overflow-y: auto; - padding: 0; - margin: 0; - list-style: none; - position: absolute; - border: 1px solid #5b9dd9; - -webkit-box-shadow: 0 1px 2px rgba( 30, 140, 190, 0.8 ); - box-shadow: 0 1px 2px rgba( 30, 140, 190, 0.8 ); - background-color: #fff; -} - -.ui-autocomplete.wplink-autocomplete li { - margin-bottom: 0; - padding: 4px 10px; - clear: both; - white-space: normal; - text-align: left; -} - -.ui-autocomplete.wplink-autocomplete li .wp-editor-float-right { - float: right; -} - -.ui-autocomplete.wplink-autocomplete li.ui-state-focus { - background-color: #ddd; - cursor: pointer; -} - -@media screen and ( max-width: 782px ) { - div.wp-link-preview, - div.wp-link-input { - max-width: 70%; - max-width: -webkit-calc(100% - 86px); - max-width: calc(100% - 86px); - } - - div.wp-link-preview { - margin: 8px 0 8px 5px; - } - - div.wp-link-input { - width: 300px; - } - - div.wp-link-input input { - width: 100%; - font-size: 16px; - padding: 5px; - } -} - -/* =Overlay Body --------------------------------------------------------------- */ - -.mce-fullscreen { - z-index: 100010; -} - -/* =Localization --------------------------------------------------------------- */ -.rtl .wp-switch-editor, -.rtl .quicktags-toolbar input { - font-family: Tahoma, sans-serif; -} - -/* rtl:ignore */ -.mce-rtl .mce-flow-layout .mce-flow-layout-item > div { - direction: rtl; -} - -/* rtl:ignore */ -.mce-rtl .mce-listbox i.mce-caret { - left: 6px; -} - -html:lang(he-il) .rtl .wp-switch-editor, -html:lang(he-il) .rtl .quicktags-toolbar input { - font-family: Arial, sans-serif; -} - -/* HiDPI */ -@media print, - (-webkit-min-device-pixel-ratio: 1.25), - (min-resolution: 120dpi) { - .wp-media-buttons .add_media span.wp-media-buttons-icon { - background: none; - } -} diff --git a/wp/wp-includes/css/editor.min.css b/wp/wp-includes/css/editor.min.css deleted file mode 100644 index 396001be..00000000 --- a/wp/wp-includes/css/editor.min.css +++ /dev/null @@ -1 +0,0 @@ -#wp-link-wrap,.mce-window{-webkit-box-shadow:0 3px 6px rgba(0,0,0,.3)}.mce-window .mce-wp-help *,div.mce-inline-toolbar-grp{-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.mce-container,.mce-container *,.mce-widget,.mce-widget *{color:inherit;font-family:inherit}.mce-container .mce-monospace,.mce-widget .mce-monospace{font-family:Consolas,Monaco,monospace;font-size:13px;line-height:150%}#mce-modal-block,#mce-modal-block.mce-fade{opacity:.7;filter:alpha(opacity=70);-webkit-transition:none;transition:none}.mce-window{-webkit-border-radius:0;border-radius:0;box-shadow:0 3px 6px rgba(0,0,0,.3);-webkit-font-smoothing:subpixel-antialiased;-webkit-transition:none;transition:none}.mce-window .mce-container-body.mce-abs-layout{overflow:visible}.mce-window .mce-window-head{background:#fcfcfc;border-bottom:1px solid #ddd;padding:0;min-height:36px}.mce-window .mce-window-head .mce-title{color:#444;font-size:18px;font-weight:600;line-height:36px;margin:0;padding:0 36px 0 16px}.mce-window .mce-window-head .mce-close,.mce-window-head .mce-close .mce-i-remove{color:transparent;top:0;right:0;width:36px;height:36px;padding:0;line-height:36px;text-align:center}.mce-window-head .mce-close .mce-i-remove:before{font:400 20px/36px dashicons;text-align:center;color:#666;width:36px;height:36px;display:block}.mce-window-head .mce-close:focus .mce-i-remove:before,.mce-window-head .mce-close:hover .mce-i-remove:before{color:#00a0d2}.mce-window-head .mce-close:focus .mce-i-remove,div.mce-tab:focus{-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.mce-window .mce-window-head .mce-dragh{width:-webkit-calc(100% - 36px);width:calc(100% - 36px)}.mce-window .mce-foot{border-top:1px solid #ddd}#wp-link .query-results,.mce-checkbox i.mce-i-checkbox,.mce-textbox{border:1px solid #ddd;-webkit-border-radius:0;border-radius:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.07);box-shadow:inset 0 1px 2px rgba(0,0,0,.07);-webkit-transition:.05s all ease-in-out;transition:.05s all ease-in-out}#wp-link .query-results:focus,.mce-checkbox:focus i.mce-i-checkbox,.mce-textbox.mce-focus,.mce-textbox:focus{border-color:#5b9dd9;-webkit-box-shadow:0 0 2px rgba(30,140,190,.8);box-shadow:0 0 2px rgba(30,140,190,.8)}.mce-window .mce-wp-help{height:360px;width:460px;overflow:auto}.mce-window .mce-wp-help *{box-sizing:border-box}.mce-window .mce-wp-help>.mce-container-body{width:auto!important}.mce-window .wp-editor-help{padding:10px 10px 0 20px}.mce-window .wp-editor-help h2,.mce-window .wp-editor-help p{margin:8px 0;white-space:normal;font-size:14px;font-weight:400}.mce-window .wp-editor-help table{width:100%;margin-bottom:20px}.mce-window .wp-editor-help table.wp-help-single{margin:0 8px 20px}.mce-window .wp-editor-help table.fixed{table-layout:fixed}.mce-window .wp-editor-help table.fixed td:nth-child(odd),.mce-window .wp-editor-help table.fixed th:nth-child(odd){width:12%}.mce-window .wp-editor-help table.fixed td:nth-child(even),.mce-window .wp-editor-help table.fixed th:nth-child(even){width:38%}.mce-window .wp-editor-help table.fixed th:nth-child(odd){padding:5px 0 0}.mce-window .wp-editor-help td,.mce-window .wp-editor-help th{font-size:13px;padding:5px;vertical-align:middle;word-wrap:break-word;white-space:normal}.mce-window .wp-editor-help th{font-weight:600;padding-bottom:0}.mce-window .wp-editor-help kbd{font-family:monospace;padding:2px 7px 3px;font-weight:600;margin:0;background:#eaeaea;background:rgba(0,0,0,.08)}.mce-window .wp-help-th-center td:nth-child(odd),.mce-window .wp-help-th-center th:nth-child(odd){text-align:center}.mce-floatpanel.mce-popover,.mce-menu{border-color:rgba(0,0,0,.15);-webkit-border-radius:0;border-radius:0;-webkit-box-shadow:0 3px 5px rgba(0,0,0,.2);box-shadow:0 3px 5px rgba(0,0,0,.2)}.mce-floatpanel.mce-popover.mce-bottom,.mce-menu{margin-top:2px}.mce-floatpanel .mce-arrow{display:none}.mce-menu .mce-container-body{min-width:160px}.mce-menu-item{border:none;margin-bottom:2px}.mce-menu-has-icons i.mce-ico{line-height:20px}div.mce-panel{border:0;background:#fff}.mce-panel.mce-menu{border:1px solid #ddd}div.mce-tab{line-height:13px}div.mce-toolbar-grp{border-bottom:1px solid #ddd;background:#f5f5f5;padding:0;position:relative}div.mce-inline-toolbar-grp{border:1px solid #a0a5aa;-webkit-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.15);box-shadow:0 1px 3px rgba(0,0,0,.15);box-sizing:border-box;margin-bottom:8px;position:absolute;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;max-width:98%;z-index:100100}div.mce-inline-toolbar-grp>div.mce-stack-layout{padding:1px}div.mce-inline-toolbar-grp.mce-arrow-up{margin-bottom:0;margin-top:8px}div.mce-inline-toolbar-grp:after,div.mce-inline-toolbar-grp:before{position:absolute;left:50%;display:block;width:0;height:0;border-style:solid;border-color:transparent;content:""}.mce-menu.mce-menu-align .mce-menu-item-normal,.quicktags-toolbar,.wp-editor-tools,.wp-editor-wrap,.wp-switch-editor{position:relative}div.mce-inline-toolbar-grp.mce-arrow-up:before{top:-9px;border-bottom-color:#a0a5aa;border-width:0 9px 9px;margin-left:-9px}div.mce-inline-toolbar-grp.mce-arrow-down:before{bottom:-9px;border-top-color:#a0a5aa;border-width:9px 9px 0;margin-left:-9px}div.mce-inline-toolbar-grp.mce-arrow-up:after{top:-8px;border-bottom-color:#f5f5f5;border-width:0 8px 8px;margin-left:-8px}div.mce-inline-toolbar-grp.mce-arrow-down:after{bottom:-8px;border-top-color:#f5f5f5;border-width:8px 8px 0;margin-left:-8px}div.mce-inline-toolbar-grp.mce-arrow-left:after,div.mce-inline-toolbar-grp.mce-arrow-left:before{margin:0}div.mce-inline-toolbar-grp.mce-arrow-left:before{left:20px}div.mce-inline-toolbar-grp.mce-arrow-left:after{left:21px}div.mce-inline-toolbar-grp.mce-arrow-right:after,div.mce-inline-toolbar-grp.mce-arrow-right:before{left:auto;margin:0}div.mce-inline-toolbar-grp.mce-arrow-right:before{right:20px}div.mce-inline-toolbar-grp.mce-arrow-right:after{right:21px}div.mce-inline-toolbar-grp.mce-arrow-full{right:0}div.mce-inline-toolbar-grp.mce-arrow-full>div{width:100%;overflow-x:auto}div.mce-toolbar-grp>div{padding:3px}.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first{padding-right:32px}.mce-toolbar .mce-btn-group{margin:0}div.mce-statusbar{border-top:1px solid #e5e5e5}div.mce-path{padding:2px 10px;margin:0}.mce-path,.mce-path .mce-divider,.mce-path-item{font-size:12px}.mce-toolbar .mce-btn,.qt-dfw{border-color:transparent;background:0 0;-webkit-box-shadow:none;box-shadow:none;text-shadow:none;cursor:pointer}.mce-btn .mce-txt{direction:inherit;text-align:inherit}.mce-toolbar .mce-btn-group .mce-btn,.qt-dfw{border:1px solid transparent;margin:2px;-webkit-border-radius:2px;border-radius:2px}.mce-toolbar .mce-btn-group .mce-btn:focus,.mce-toolbar .mce-btn-group .mce-btn:hover,.qt-dfw:focus,.qt-dfw:hover{background:#fafafa;border-color:#555d66;color:#23282d;-webkit-box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);box-shadow:inset 0 1px 0 #fff,0 1px 0 rgba(0,0,0,.08);outline:0}.mce-toolbar .mce-btn-group .mce-btn.mce-active,.mce-toolbar .mce-btn-group .mce-btn:active,.qt-dfw.active{background:#ebebeb;border-color:#555d66;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.3);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.3)}.mce-toolbar .mce-btn-group .mce-btn.mce-active:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-active:hover{border-color:#23282d}.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:hover{color:#a0a5aa;background:0 0;border-color:#ddd;text-shadow:0 1px 0 #fff;-webkit-box-shadow:none;box-shadow:none}.mce-menu .mce-menu-item-preview.mce-active .mce-text,.mce-toolbar .mce-btn-group .mce-btn.mce-primary .mce-ico{color:#fff}.mce-toolbar .mce-btn-group .mce-btn.mce-disabled:focus{border-color:#555d66}.mce-toolbar .mce-btn-group .mce-first,.mce-toolbar .mce-btn-group .mce-last{border-color:transparent}.mce-toolbar .mce-btn button,.qt-dfw{padding:2px 3px;line-height:normal}.mce-toolbar .mce-listbox button{font-size:13px;line-height:20px;padding-left:6px;padding-right:20px}.mce-toolbar .mce-btn i{text-shadow:none}.mce-toolbar .mce-btn-group>div{white-space:normal}.mce-toolbar .mce-colorbutton .mce-open{border-right:0}.mce-toolbar .mce-colorbutton .mce-preview{margin:0;padding:0;top:auto;bottom:2px;left:3px;height:3px;width:20px;background:#555d66}.mce-toolbar .mce-btn-group .mce-btn.mce-primary{min-width:0;background:#0085ba;border-color:#0073aa #006799 #006799;-webkit-box-shadow:0 1px 0 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:none}.mce-toolbar .mce-btn-group .mce-btn.mce-primary button{padding:2px 3px 1px}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-primary:hover{background:#008ec2;border-color:#006799;color:#fff}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:focus{-webkit-box-shadow:0 0 1px 1px #33b3db;box-shadow:0 0 1px 1px #33b3db}.mce-toolbar .mce-btn-group .mce-btn.mce-primary:active{background:#0073aa;border-color:#006799;-webkit-box-shadow:inset 0 2px 0 #006799;box-shadow:inset 0 2px 0 #006799}.mce-toolbar .mce-btn-group .mce-btn.mce-listbox{-webkit-border-radius:0;border-radius:0;direction:ltr;background:#fff;border:1px solid #ddd;-webkit-box-shadow:inset 0 1px 1px -1px rgba(0,0,0,.2);box-shadow:inset 0 1px 1px -1px rgba(0,0,0,.2)}.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:focus,.mce-toolbar .mce-btn-group .mce-btn.mce-listbox:hover{border-color:#b4b9be}.mce-panel .mce-btn i.mce-caret{border-top:6px solid #555d66;margin-left:2px;margin-right:2px}.mce-listbox i.mce-caret{right:4px}.mce-panel .mce-btn:focus i.mce-caret,.mce-panel .mce-btn:hover i.mce-caret{border-top-color:#23282d}.mce-panel .mce-active i.mce-caret{border-top:0;border-bottom:6px solid #23282d;margin-top:7px}.mce-listbox.mce-active i.mce-caret{margin-top:-3px}.mce-toolbar .mce-splitbtn:hover .mce-open{border-right-color:transparent}.mce-toolbar .mce-splitbtn .mce-open.mce-active{background:0 0;outline:0}.mce-menu .mce-menu-item-normal.mce-active,.mce-menu .mce-menu-item-preview.mce-active,.mce-menu .mce-menu-item.mce-selected,.mce-menu .mce-menu-item:focus,.mce-menu .mce-menu-item:hover{background:#0073aa;color:#fff}.mce-menu .mce-menu-item-preview.mce-active{border-left:none}.mce-menu .mce-menu-item.mce-disabled{cursor:default}.mce-menu .mce-menu-item.mce-disabled:hover{background:#ccc}.mce-menubar{border-color:#e5e5e5;background:#fff;border-width:0 0 1px}.mce-menubar .mce-menubtn{margin:2px}.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus,.mce-menubar .mce-menubtn:hover{border-color:transparent;background:0 0}.mce-menubar .mce-menubtn:focus{color:#124964;-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}.mce-menu-item-sep:hover,div.mce-menu .mce-menu-item-sep{border-bottom:1px solid #ddd;height:0;margin:5px 0}.mce-menubtn span{margin-right:0;padding-left:3px}.mce-menu-has-icons i.mce-ico:before{margin-left:-2px}.mce-menu.mce-menu-align .mce-menu-shortcut{bottom:.6em;font-size:.9em}.mce-primary button,.mce-primary button i{text-align:center;color:#fff;text-shadow:none;padding:0;line-height:26px}.mce-window .mce-btn{color:#555;background:#f7f7f7;text-decoration:none;font-size:13px;line-height:26px;height:28px;margin:0;padding:0;cursor:pointer;border:1px solid #ccc;-webkit-appearance:none;-webkit-border-radius:3px;border-radius:3px;white-space:nowrap;-webkit-box-shadow:0 1px 0 #ccc;box-shadow:0 1px 0 #ccc}.mce-window .mce-btn::-moz-focus-inner{border-width:0;border-style:none;padding:0}.mce-window .mce-btn:focus,.mce-window .mce-btn:hover{background:#fafafa;border-color:#999;color:#23282d}.mce-window .mce-btn:focus{border-color:#5b9dd9;-webkit-box-shadow:0 0 3px rgba(0,115,170,.8);box-shadow:0 0 3px rgba(0,115,170,.8)}.mce-window .mce-btn:active{background:#eee;border-color:#999;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);-webkit-transform:translateY(1px);-ms-transform:translateY(1px);transform:translateY(1px)}.mce-window .mce-btn.mce-disabled{color:#a0a5aa!important;border-color:#ddd!important;background:#f7f7f7!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;-webkit-transform:none!important;-ms-transform:none!important;transform:none!important}.mce-window .mce-btn.mce-primary{background:#0085ba;border-color:#0073aa #006799 #006799;-webkit-box-shadow:0 1px 0 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:0 -1px 1px #006799,1px 0 1px #006799,0 1px 1px #006799,-1px 0 1px #006799}.mce-window .mce-btn.mce-primary:focus,.mce-window .mce-btn.mce-primary:hover{background:#008ec2;border-color:#006799;color:#fff}.mce-window .mce-btn.mce-primary:focus{-webkit-box-shadow:0 1px 0 #0073aa,0 0 2px 1px #33b3db;box-shadow:0 1px 0 #0073aa,0 0 2px 1px #33b3db}.mce-window .mce-btn.mce-primary:active{background:#0073aa;border-color:#006799;-webkit-box-shadow:inset 0 2px 0 #006799;box-shadow:inset 0 2px 0 #006799;vertical-align:top}.mce-window .mce-btn.mce-primary.mce-disabled{color:#66c6e4!important;background:#008ec2!important;border-color:#007cb2!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:0 -1px 0 rgba(0,0,0,.1)!important;cursor:default}.mce-toolbar .mce-ico,.qt-dfw{text-shadow:none;text-align:center}.mce-menubtn.mce-fixed-width button{overflow-x:hidden;text-overflow:ellipsis;width:110px}.mce-charmap{margin:3px}.mce-charmap td{padding:0;border-color:#ddd;cursor:pointer}.mce-charmap td:hover{background:#f3f3f3}.mce-charmap td div{width:18px;height:22px;line-height:22px}.mce-toolbar .mce-btn .mce-open,.qt-dfw{line-height:20px}.mce-tooltip{margin-top:2px}.mce-tooltip-inner{-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 3px 5px rgba(0,0,0,.2);box-shadow:0 3px 5px rgba(0,0,0,.2);color:#fff;font-size:12px}.mce-ico{font-family:tinymce,Arial}.mce-btn-small .mce-ico{font-family:tinymce-small,Arial}.mce-toolbar .mce-ico{color:#555d66;line-height:20px;width:20px;height:20px;margin:0;padding:0}.qt-dfw{color:#555d66;width:28px;height:26px}.mce-toolbar .mce-btn.mce-active .mce-open,.mce-toolbar .mce-btn:focus .mce-open,.mce-toolbar .mce-btn:hover .mce-open{border-left-color:#23282d}div.mce-notification{left:10%!important;right:10%}.mce-notification button.mce-close{right:6px;top:3px;font-weight:400;color:#555d66}.mce-notification button.mce-close:focus,.mce-notification button.mce-close:hover{color:#000}i.mce-i-aligncenter,i.mce-i-alignjustify,i.mce-i-alignleft,i.mce-i-alignright,i.mce-i-backcolor,i.mce-i-blockquote,i.mce-i-bold,i.mce-i-bullist,i.mce-i-charmap,i.mce-i-dashicon,i.mce-i-dfw,i.mce-i-forecolor,i.mce-i-fullscreen,i.mce-i-help,i.mce-i-hr,i.mce-i-indent,i.mce-i-italic,i.mce-i-link,i.mce-i-ltr,i.mce-i-numlist,i.mce-i-outdent,i.mce-i-pastetext,i.mce-i-pasteword,i.mce-i-redo,i.mce-i-remove,i.mce-i-removeformat,i.mce-i-spellchecker,i.mce-i-strikethrough,i.mce-i-underline,i.mce-i-undo,i.mce-i-unlink,i.mce-i-wp-media-library,i.mce-i-wp_adv,i.mce-i-wp_code,i.mce-i-wp_fullscreen,i.mce-i-wp_help,i.mce-i-wp_more,i.mce-i-wp_page{font:400 20px/1 dashicons;padding:0 2px 0 0;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;margin-left:-2px}.qt-dfw{font:400 20px/1 dashicons;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}i.mce-i-bold:before{content:"\f200"}i.mce-i-italic:before{content:"\f201"}i.mce-i-bullist:before{content:"\f203"}i.mce-i-numlist:before{content:"\f204"}i.mce-i-blockquote:before{content:"\f205"}i.mce-i-alignleft:before{content:"\f206"}i.mce-i-aligncenter:before{content:"\f207"}i.mce-i-alignright:before{content:"\f208"}i.mce-i-link:before{content:"\f103"}i.mce-i-unlink:before{content:"\f225"}i.mce-i-wp_more:before{content:"\f209"}i.mce-i-strikethrough:before{content:"\f224"}i.mce-i-spellchecker:before{content:"\f210"}.qt-dfw:before,i.mce-i-dfw:before,i.mce-i-fullscreen:before,i.mce-i-wp_fullscreen:before{content:"\f211"}i.mce-i-wp_adv:before{content:"\f212"}i.mce-i-underline:before{content:"\f213"}i.mce-i-alignjustify:before{content:"\f214"}i.mce-i-backcolor:before,i.mce-i-forecolor:before{content:"\f215"}i.mce-i-pastetext:before{content:"\f217"}i.mce-i-removeformat:before{content:"\f218"}i.mce-i-charmap:before{content:"\f220"}i.mce-i-outdent:before{content:"\f221"}i.mce-i-indent:before{content:"\f222"}i.mce-i-undo:before{content:"\f171"}i.mce-i-redo:before{content:"\f172"}i.mce-i-help:before,i.mce-i-wp_help:before{content:"\f223"}i.mce-i-wp-media-library:before{content:"\f104"}i.mce-i-ltr:before{content:"\f320"}i.mce-i-wp_page:before{content:"\f105"}i.mce-i-hr:before{content:"\f460"}i.mce-i-remove:before{content:"\f158"}i.mce-i-wp_code:before{content:"\f475"}.rtl i.mce-i-outdent:before{content:"\f222"}.rtl i.mce-i-indent:before{content:"\f221"}.wp-editor-tools{z-index:1}.wp-editor-tools:after{clear:both;content:"";display:table}.wp-editor-container{clear:both}.wp-editor-area{font-family:Consolas,Monaco,monospace;font-size:13px;padding:10px;margin:1px 0 0;line-height:150%;border:0;outline:0;display:block;resize:vertical;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.rtl .wp-editor-area{font-family:Tahoma,Monaco,monospace}.locale-he-il .wp-editor-area{font-family:Arial,Monaco,monospace}.wp-editor-container textarea.wp-editor-area{width:100%;margin:0;-webkit-box-shadow:none;box-shadow:none}.wp-editor-tabs{float:right}.wp-switch-editor{float:left;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;top:1px;background:#ebebeb;color:#666;cursor:pointer;font-size:13px;line-height:19px;height:20px;margin:5px 0 0 5px;padding:3px 8px 4px;border:1px solid #e5e5e5}.wp-switch-editor:focus{-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:0;color:#23282d}.html-active .switch-html:focus,.tmce-active .switch-tmce:focus,.wp-switch-editor:active{-webkit-box-shadow:none;box-shadow:none}.wp-switch-editor:active{background-color:#f5f5f5;-webkit-box-shadow:none;box-shadow:none}.js .tmce-active .wp-editor-area{color:#fff}.tmce-active .quicktags-toolbar{display:none}.html-active .switch-html,.tmce-active .switch-tmce{background:#f5f5f5;color:#555;border-bottom-color:#f5f5f5}.wp-media-buttons{float:left}.wp-media-buttons .button{margin-right:5px;margin-bottom:4px;padding-left:7px;padding-right:7px}.wp-media-buttons .button:active{position:relative;top:1px;margin-top:-1px;margin-bottom:1px}.wp-media-buttons .insert-media{padding-left:5px}.wp-media-buttons a{text-decoration:none;color:#444;font-size:12px}.wp-media-buttons img{padding:0 4px;vertical-align:middle}.wp-media-buttons span.wp-media-buttons-icon{display:inline-block;width:18px;height:18px;vertical-align:text-top;margin:0 2px}.wp-media-buttons .add_media span.wp-media-buttons-icon{background:0 0}.wp-media-buttons .add_media span.wp-media-buttons-icon:before{font:400 18px/1 dashicons;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f104"}.quicktags-toolbar{padding:3px;border-bottom:1px solid #ddd;background:#f5f5f5;min-height:30px}.has-dfw .quicktags-toolbar{padding-right:35px}.wp-core-ui .quicktags-toolbar input.button.button-small{margin:2px}.quicktags-toolbar input[value=link]{text-decoration:underline}.quicktags-toolbar input[value=del]{text-decoration:line-through}.quicktags-toolbar input[value="i"]{font-style:italic}.quicktags-toolbar input[value="b"]{font-weight:600}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw,.qt-dfw{position:absolute;top:0;right:0;margin:5px 5px 0 0}.qt-fullscreen{position:static;margin:2px}@media screen and (max-width:782px){.mce-toolbar .mce-btn button,.qt-dfw{padding:6px 7px}.mce-toolbar .mce-btn-group .mce-btn.mce-primary button{padding:6px 7px 5px}.mce-toolbar .mce-btn-group .mce-btn{margin:1px}.qt-dfw{width:36px;height:34px}.mce-toolbar .mce-btn-group .mce-btn.mce-wp-dfw{margin:4px 4px 0 0}.mce-toolbar .mce-colorbutton .mce-preview{left:8px;bottom:6px}.mce-window .mce-btn{padding:2px 0}.has-dfw .quicktags-toolbar,.has-dfw div.mce-toolbar-grp .mce-toolbar.mce-first{padding-right:40px}}@media screen and (min-width:782px){.wp-core-ui .quicktags-toolbar input.button.button-small{font-size:12px;height:26px;line-height:24px}}#wp_editbtns,#wp_gallerybtns{padding:2px;position:absolute;display:none;z-index:100020}#wp_delgallery,#wp_delimgbtn,#wp_editgallery,#wp_editimgbtn{border-color:#999;background-color:#eee;margin:2px;padding:2px;border-width:1px;border-style:solid;-webkit-border-radius:3px;border-radius:3px}#wp_delgallery:hover,#wp_delimgbtn:hover,#wp_editgallery:hover,#wp_editimgbtn:hover{border-color:#555;background-color:#ccc}#wp-link-wrap{display:none;background-color:#fff;box-shadow:0 3px 6px rgba(0,0,0,.3);width:500px;overflow:hidden;margin-left:-250px;position:fixed;top:50%;left:50%;z-index:100105;-webkit-transition:height .2s,margin-top .2s;transition:height .2s,margin-top .2s;height:500px;margin-top:-250px}#wp-link-backdrop{display:none;position:fixed;top:0;left:0;right:0;bottom:0;min-height:360px;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:100100}#wp-link{position:relative;height:100%}#wp-link-wrap .wp-link-text-field{display:none}#wp-link-wrap.has-text-field .wp-link-text-field{display:block}#link-modal-title{background:#fcfcfc;border-bottom:1px solid #ddd;height:36px;font-size:18px;font-weight:600;line-height:36px;margin:0;padding:0 36px 0 16px}#wp-link-close{color:#666;padding:0;position:absolute;top:0;right:0;width:36px;height:36px;text-align:center;background:0 0;border:none;cursor:pointer}#wp-link-close:before{font:400 20px/36px dashicons;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:36px;height:36px;content:"\f158"}#wp-link-close:focus,#wp-link-close:hover{color:#00a0d2}#wp-link-close:focus{outline:0;-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8)}#wp-link-wrap #link-selector{-webkit-overflow-scrolling:touch;padding:0 16px;position:absolute;top:37px;left:0;right:0;bottom:44px}#wp-link ol,#wp-link ul{list-style:none;margin:0;padding:0}#wp-link input[type=text]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#wp-link #link-options{padding:8px 0 12px}#wp-link p.howto{margin:3px 0}#wp-link p.howto a{text-decoration:none;color:inherit}#wp-link label input[type=text]{margin-top:5px;width:70%}#wp-link #link-options label span,#wp-link #search-panel label span.search-label{display:inline-block;width:80px;text-align:right;padding-right:5px;max-width:24%;vertical-align:middle;word-wrap:break-word}#wp-link .link-search-field{float:left;width:250px;max-width:70%}#wp-link .link-search-wrapper{margin:5px 0 9px;display:block;overflow:hidden}#wp-link .link-search-wrapper span{float:left;margin-top:4px}#wp-link .link-search-wrapper .spinner{margin-top:5px}#wp-link .link-target{padding:3px 0 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#wp-link .link-target label{max-width:70%}#wp-link .query-results{border:1px solid #dfdfdf;margin:0 0 12px;background:#fff;overflow:auto;position:absolute;left:16px;right:16px;bottom:0;top:166px}.has-text-field #wp-link .query-results{top:200px}#wp-link li{clear:both;margin-bottom:0;border-bottom:1px solid #f1f1f1;color:#32373c;padding:4px 6px 4px 10px;cursor:pointer;position:relative}#wp-link .query-notice,#wp-link li.unselectable{border-bottom:1px solid #dfdfdf}#wp-link .query-notice{padding:0;background-color:#f7fcfe;color:#000}#wp-link .query-notice .query-notice-default,#wp-link .query-notice .query-notice-hint{display:block;padding:6px;border-left:4px solid #00a0d2}#wp-link .unselectable.no-matches-found{padding:0;border-bottom:1px solid #dfdfdf;background-color:#fef7f1}#wp-link .no-matches-found .item-title{display:block;padding:6px;border-left:4px solid #d54e21}#wp-link .query-results em{font-style:normal}#wp-link li:hover{background:#eaf2fa;color:#151515}#wp-link li.unselectable:hover{background:#fff;cursor:auto;color:#32373c}#wp-link li.selected{background:#ddd;color:#32373c}#wp-link li.selected .item-title{font-weight:600}#wp-link li:last-child{border:none}#wp-link .item-title{display:inline-block;width:80%;width:-webkit-calc(100% - 68px);width:calc(100% - 68px);word-wrap:break-word}#wp-link .item-info{text-transform:uppercase;color:#666;font-size:11px;position:absolute;right:5px;top:5px}#wp-link .river-waiting{display:none;padding:10px 0}#wp-link .submitbox{padding:8px 16px;background:#fcfcfc;border-top:1px solid #ddd;position:absolute;bottom:0;left:0;right:0}#wp-link-cancel{line-height:25px;float:left}#wp-link-update{line-height:23px;float:right}#wp-link-submit{float:right}@media screen and (max-width:782px){#wp-link-wrap{margin-top:-140px}#wp-link-wrap .query-results{top:195px}#wp-link-wrap.has-text-field .query-results{top:235px}#link-selector{padding:0 16px 60px}#wp-link-wrap #link-selector{bottom:52px}#wp-link-cancel{line-height:32px}#wp-link .link-target{padding-top:10px}#wp-link .submitbox .button{margin-bottom:0}}@media screen and (max-width:520px){#wp-link-wrap{width:auto;margin-left:0;left:10px;right:10px;max-width:500px}}@media screen and (max-height:520px){#wp-link-wrap{-webkit-transition:none;transition:none;height:auto;margin-top:0;top:10px;bottom:10px}#link-selector{overflow:auto}#search-panel .query-results{position:static}}@media screen and (max-height:290px){#wp-link-wrap{height:auto;margin-top:0;top:10px;bottom:10px}#link-selector{overflow:auto;height:-webkit-calc(100% - 92px);height:calc(100% - 92px);padding-bottom:2px}#search-panel .query-results{position:static}}div.wp-link-preview{float:left;margin:5px;max-width:694px;overflow:hidden;text-overflow:ellipsis}div.wp-link-preview a{color:#0073aa;text-decoration:underline;-webkit-transition-property:border,background,color;transition-property:border,background,color;-webkit-transition-duration:.05s;transition-duration:.05s;-webkit-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;cursor:pointer}div.wp-link-preview a.wplink-url-error{color:#dc3232}div.wp-link-input{float:left;margin:2px;max-width:694px}div.wp-link-input input{width:300px;padding:3px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mce-toolbar div.wp-link-input~.mce-btn,.mce-toolbar div.wp-link-preview~.mce-btn{margin:2px 1px}.mce-inline-toolbar-grp .mce-btn-group .mce-btn:last-child{margin-right:2px}.ui-autocomplete.wplink-autocomplete{z-index:100110;max-height:200px;overflow-y:auto;padding:0;margin:0;list-style:none;position:absolute;border:1px solid #5b9dd9;-webkit-box-shadow:0 1px 2px rgba(30,140,190,.8);box-shadow:0 1px 2px rgba(30,140,190,.8);background-color:#fff}.ui-autocomplete.wplink-autocomplete li{margin-bottom:0;padding:4px 10px;clear:both;white-space:normal;text-align:left}.ui-autocomplete.wplink-autocomplete li .wp-editor-float-right{float:right}.ui-autocomplete.wplink-autocomplete li.ui-state-focus{background-color:#ddd;cursor:pointer}@media screen and (max-width:782px){div.wp-link-input,div.wp-link-preview{max-width:70%;max-width:-webkit-calc(100% - 86px);max-width:calc(100% - 86px)}div.wp-link-preview{margin:8px 0 8px 5px}div.wp-link-input{width:300px}div.wp-link-input input{width:100%;font-size:16px;padding:5px}}.mce-fullscreen{z-index:100010}.rtl .quicktags-toolbar input,.rtl .wp-switch-editor{font-family:Tahoma,sans-serif}.mce-rtl .mce-flow-layout .mce-flow-layout-item>div{direction:rtl}.mce-rtl .mce-listbox i.mce-caret{left:6px}html:lang(he-il) .rtl .quicktags-toolbar input,html:lang(he-il) .rtl .wp-switch-editor{font-family:Arial,sans-serif}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.wp-media-buttons .add_media span.wp-media-buttons-icon{background:0 0}} \ No newline at end of file diff --git a/wp/wp-includes/css/jquery-ui-dialog-rtl.css b/wp/wp-includes/css/jquery-ui-dialog-rtl.css deleted file mode 100644 index ccd57d18..00000000 --- a/wp/wp-includes/css/jquery-ui-dialog-rtl.css +++ /dev/null @@ -1,363 +0,0 @@ -/*! - * jQuery UI CSS Framework 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/category/theming/ - */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { - display: none; -} -.ui-helper-hidden-accessible { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} -.ui-helper-reset { - margin: 0; - padding: 0; - border: 0; - outline: 0; - line-height: 1.3; - text-decoration: none; - font-size: 100%; - list-style: none; -} -.ui-helper-clearfix:before, -.ui-helper-clearfix:after { - content: ""; - display: table; - border-collapse: collapse; -} -.ui-helper-clearfix:after { - clear: both; -} -.ui-helper-clearfix { - min-height: 0; /* support: IE7 */ -} -.ui-helper-zfix { - width: 100%; - height: 100%; - top: 0; - right: 0; - position: absolute; - opacity: 0; - filter:Alpha(Opacity=0); /* support: IE8 */ -} - -.ui-front { - z-index: 100; -} - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { - cursor: default !important; -} - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { - display: block; - text-indent: -99999px; - overflow: hidden; - background-repeat: no-repeat; -} - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { - position: fixed; - top: 0; - right: 0; - width: 100%; - height: 100%; -} - -/*! - * jQuery UI Resizable 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */ -.ui-resizable { - position: relative; -} -.ui-resizable-handle { - position: absolute; - font-size: 0.1px; - display: block; - -ms-touch-action: none; - touch-action: none; -} -.ui-resizable-disabled .ui-resizable-handle, -.ui-resizable-autohide .ui-resizable-handle { - display: none; -} -.ui-resizable-n { - cursor: n-resize; - height: 7px; - width: 100%; - top: -5px; - right: 0; -} -.ui-resizable-s { - cursor: s-resize; - height: 7px; - width: 100%; - bottom: -5px; - right: 0; -} -/* rtl:ignore */ -.ui-resizable-e { - cursor: e-resize; - width: 7px; - right: -5px; - top: 0; - height: 100%; -} -/* rtl:ignore */ -.ui-resizable-w { - cursor: w-resize; - width: 7px; - left: -5px; - top: 0; - height: 100%; -} -/* rtl:ignore */ -.ui-resizable-se { - cursor: se-resize; - width: 12px; - height: 12px; - right: 1px; - bottom: 1px; -} -/* rtl:ignore */ -.ui-resizable-sw { - cursor: sw-resize; - width: 9px; - height: 9px; - left: -5px; - bottom: -5px; -} -/* rtl:ignore */ -.ui-resizable-nw { - cursor: nw-resize; - width: 9px; - height: 9px; - left: -5px; - top: -5px; -} -/* rtl:ignore */ -.ui-resizable-ne { - cursor: ne-resize; - width: 9px; - height: 9px; - right: -5px; - top: -5px; -} - -/* WP buttons: see buttons.css. */ - -.ui-button { - display: inline-block; - text-decoration: none; - font-size: 13px; - line-height: 26px; - height: 28px; - margin: 0; - padding: 0 10px 1px; - cursor: pointer; - border-width: 1px; - border-style: solid; - -webkit-appearance: none; - -webkit-border-radius: 3px; - border-radius: 3px; - white-space: nowrap; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - color: #555; - border-color: #cccccc; - background: #f7f7f7; - -webkit-box-shadow: 0 1px 0 #cccccc; - box-shadow: 0 1px 0 #cccccc; - vertical-align: top; -} - -.ui-button:active, -.ui-button:focus { - outline: none; -} - -/* Remove the dotted border on :focus and the extra padding in Firefox */ -.ui-button::-moz-focus-inner { - border-width: 0; - border-style: none; - padding: 0; -} - -.ui-button:hover, -.ui-button:focus { - background: #fafafa; - border-color: #999; - color: #23282d; -} - -.ui-button:focus { - border-color: #5b9dd9; - -webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); - box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); -} - -.ui-button:active { - background: #eee; - border-color: #999; - -webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); - box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); - -webkit-transform: translateY(1px); - -ms-transform: translateY(1px); - transform: translateY(1px); -} - -.ui-button[disabled], -.ui-button:disabled { - color: #a0a5aa !important; - border-color: #ddd !important; - background: #f7f7f7 !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - text-shadow: 0 1px 0 #fff !important; - cursor: default; - -webkit-transform: none !important; - -ms-transform: none !important; - transform: none !important; -} - -@media screen and ( max-width: 782px ) { - - .ui-button { - padding: 6px 14px; - line-height: normal; - font-size: 14px; - vertical-align: middle; - height: auto; - margin-bottom: 4px; - } - -} - -/* WP Theme */ - -.ui-dialog { - position: absolute; - top: 0; - right: 0; - z-index: 100102; - background-color: #fff; - -webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); - box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); -} - -.ui-dialog-titlebar { - background: #fcfcfc; - border-bottom: 1px solid #dfdfdf; - height: 36px; - font-size: 18px; - font-weight: 600; - line-height: 36px; - padding: 0 16px 0 36px; -} - -.ui-button.ui-dialog-titlebar-close { - background: none; - border: none; - -webkit-box-shadow: none; - box-shadow: none; - color: #666; - cursor: pointer; - display: block; - padding: 0; - position: absolute; - top: 0; - left: 0; - width: 36px; - height: 36px; - text-align: center; -} - -.ui-dialog-titlebar-close:before { - font: normal 20px/1 dashicons; - vertical-align: top; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - line-height: 36px; - width: 36px; - height: 36px; - content: '\f158'; -} - -.ui-button.ui-dialog-titlebar-close:hover { - color: #00a0d2; -} - -.ui-dialog-titlebar-close .ui-button-text { - display: none; -} - -.ui-dialog-content { - padding: 16px; - overflow: auto; -} - -.ui-dialog-buttonpane { - background: #fcfcfc; - border-top: 1px solid #dfdfdf; - padding: 16px; -} - -.ui-dialog-buttonpane .ui-button { - margin-right: 16px; -} - -.ui-dialog-buttonpane .ui-dialog-buttonset { - float: left; -} - -.ui-draggable .ui-dialog-titlebar { - cursor: move; -} - -.ui-widget-overlay { - position: fixed; - top: 0; - right: 0; - left: 0; - bottom: 0; - min-height: 360px; - background: #000; - opacity: 0.7; - filter: alpha(opacity=70); - z-index: 100101; -} diff --git a/wp/wp-includes/css/jquery-ui-dialog-rtl.min.css b/wp/wp-includes/css/jquery-ui-dialog-rtl.min.css deleted file mode 100644 index 81b6e234..00000000 --- a/wp/wp-includes/css/jquery-ui-dialog-rtl.min.css +++ /dev/null @@ -1,17 +0,0 @@ -/*! - * jQuery UI CSS Framework 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/category/theming/ - */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-button,.ui-helper-reset{text-decoration:none;margin:0}.ui-helper-reset{padding:0;border:0;outline:0;line-height:1.3;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;right:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{width:100%;height:100%}/*! - * jQuery UI Resizable 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;right:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;right:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-button{display:inline-block;font-size:13px;line-height:26px;height:28px;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;-webkit-border-radius:3px;border-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:0 1px 0 #ccc;box-shadow:0 1px 0 #ccc;vertical-align:top}.ui-button:active,.ui-button:focus{outline:0}.ui-button::-moz-focus-inner{border-width:0;border-style:none;padding:0}.ui-button:focus,.ui-button:hover{background:#fafafa;border-color:#999;color:#23282d}.ui-button:focus{border-color:#5b9dd9;-webkit-box-shadow:0 0 3px rgba(0,115,170,.8);box-shadow:0 0 3px rgba(0,115,170,.8)}.ui-button:active{background:#eee;border-color:#999;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);-webkit-transform:translateY(1px);-ms-transform:translateY(1px);transform:translateY(1px)}.ui-button:disabled,.ui-button[disabled]{color:#a0a5aa!important;border-color:#ddd!important;background:#f7f7f7!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;-webkit-transform:none!important;-ms-transform:none!important;transform:none!important}@media screen and (max-width:782px){.ui-button{padding:6px 14px;line-height:normal;font-size:14px;vertical-align:middle;height:auto;margin-bottom:4px}}.ui-dialog{position:absolute;top:0;right:0;z-index:100102;background-color:#fff;-webkit-box-shadow:0 3px 6px rgba(0,0,0,.3);box-shadow:0 3px 6px rgba(0,0,0,.3)}.ui-dialog-titlebar{background:#fcfcfc;border-bottom:1px solid #dfdfdf;height:36px;font-size:18px;font-weight:600;line-height:36px;padding:0 16px 0 36px}.ui-button.ui-dialog-titlebar-close{background:0 0;border:none;-webkit-box-shadow:none;box-shadow:none;color:#666;cursor:pointer;display:block;padding:0;position:absolute;top:0;left:0;width:36px;height:36px;text-align:center}.ui-dialog-titlebar-close:before{font:400 20px/1 dashicons;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:36px;width:36px;height:36px;content:'\f158'}.ui-button.ui-dialog-titlebar-close:hover{color:#00a0d2}.ui-dialog-titlebar-close .ui-button-text{display:none}.ui-dialog-content{padding:16px;overflow:auto}.ui-dialog-buttonpane{background:#fcfcfc;border-top:1px solid #dfdfdf;padding:16px}.ui-dialog-buttonpane .ui-button{margin-right:16px}.ui-dialog-buttonpane .ui-dialog-buttonset{float:left}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-widget-overlay{position:fixed;top:0;right:0;left:0;bottom:0;min-height:360px;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:100101} \ No newline at end of file diff --git a/wp/wp-includes/css/jquery-ui-dialog.css b/wp/wp-includes/css/jquery-ui-dialog.css deleted file mode 100644 index 111fecd6..00000000 --- a/wp/wp-includes/css/jquery-ui-dialog.css +++ /dev/null @@ -1,363 +0,0 @@ -/*! - * jQuery UI CSS Framework 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/category/theming/ - */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { - display: none; -} -.ui-helper-hidden-accessible { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} -.ui-helper-reset { - margin: 0; - padding: 0; - border: 0; - outline: 0; - line-height: 1.3; - text-decoration: none; - font-size: 100%; - list-style: none; -} -.ui-helper-clearfix:before, -.ui-helper-clearfix:after { - content: ""; - display: table; - border-collapse: collapse; -} -.ui-helper-clearfix:after { - clear: both; -} -.ui-helper-clearfix { - min-height: 0; /* support: IE7 */ -} -.ui-helper-zfix { - width: 100%; - height: 100%; - top: 0; - left: 0; - position: absolute; - opacity: 0; - filter:Alpha(Opacity=0); /* support: IE8 */ -} - -.ui-front { - z-index: 100; -} - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { - cursor: default !important; -} - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { - display: block; - text-indent: -99999px; - overflow: hidden; - background-repeat: no-repeat; -} - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; -} - -/*! - * jQuery UI Resizable 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */ -.ui-resizable { - position: relative; -} -.ui-resizable-handle { - position: absolute; - font-size: 0.1px; - display: block; - -ms-touch-action: none; - touch-action: none; -} -.ui-resizable-disabled .ui-resizable-handle, -.ui-resizable-autohide .ui-resizable-handle { - display: none; -} -.ui-resizable-n { - cursor: n-resize; - height: 7px; - width: 100%; - top: -5px; - left: 0; -} -.ui-resizable-s { - cursor: s-resize; - height: 7px; - width: 100%; - bottom: -5px; - left: 0; -} -/* rtl:ignore */ -.ui-resizable-e { - cursor: e-resize; - width: 7px; - right: -5px; - top: 0; - height: 100%; -} -/* rtl:ignore */ -.ui-resizable-w { - cursor: w-resize; - width: 7px; - left: -5px; - top: 0; - height: 100%; -} -/* rtl:ignore */ -.ui-resizable-se { - cursor: se-resize; - width: 12px; - height: 12px; - right: 1px; - bottom: 1px; -} -/* rtl:ignore */ -.ui-resizable-sw { - cursor: sw-resize; - width: 9px; - height: 9px; - left: -5px; - bottom: -5px; -} -/* rtl:ignore */ -.ui-resizable-nw { - cursor: nw-resize; - width: 9px; - height: 9px; - left: -5px; - top: -5px; -} -/* rtl:ignore */ -.ui-resizable-ne { - cursor: ne-resize; - width: 9px; - height: 9px; - right: -5px; - top: -5px; -} - -/* WP buttons: see buttons.css. */ - -.ui-button { - display: inline-block; - text-decoration: none; - font-size: 13px; - line-height: 26px; - height: 28px; - margin: 0; - padding: 0 10px 1px; - cursor: pointer; - border-width: 1px; - border-style: solid; - -webkit-appearance: none; - -webkit-border-radius: 3px; - border-radius: 3px; - white-space: nowrap; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - color: #555; - border-color: #cccccc; - background: #f7f7f7; - -webkit-box-shadow: 0 1px 0 #cccccc; - box-shadow: 0 1px 0 #cccccc; - vertical-align: top; -} - -.ui-button:active, -.ui-button:focus { - outline: none; -} - -/* Remove the dotted border on :focus and the extra padding in Firefox */ -.ui-button::-moz-focus-inner { - border-width: 0; - border-style: none; - padding: 0; -} - -.ui-button:hover, -.ui-button:focus { - background: #fafafa; - border-color: #999; - color: #23282d; -} - -.ui-button:focus { - border-color: #5b9dd9; - -webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); - box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); -} - -.ui-button:active { - background: #eee; - border-color: #999; - -webkit-box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); - box-shadow: inset 0 2px 5px -3px rgba( 0, 0, 0, 0.5 ); - -webkit-transform: translateY(1px); - -ms-transform: translateY(1px); - transform: translateY(1px); -} - -.ui-button[disabled], -.ui-button:disabled { - color: #a0a5aa !important; - border-color: #ddd !important; - background: #f7f7f7 !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - text-shadow: 0 1px 0 #fff !important; - cursor: default; - -webkit-transform: none !important; - -ms-transform: none !important; - transform: none !important; -} - -@media screen and ( max-width: 782px ) { - - .ui-button { - padding: 6px 14px; - line-height: normal; - font-size: 14px; - vertical-align: middle; - height: auto; - margin-bottom: 4px; - } - -} - -/* WP Theme */ - -.ui-dialog { - position: absolute; - top: 0; - left: 0; - z-index: 100102; - background-color: #fff; - -webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); - box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); -} - -.ui-dialog-titlebar { - background: #fcfcfc; - border-bottom: 1px solid #dfdfdf; - height: 36px; - font-size: 18px; - font-weight: 600; - line-height: 36px; - padding: 0 36px 0 16px; -} - -.ui-button.ui-dialog-titlebar-close { - background: none; - border: none; - -webkit-box-shadow: none; - box-shadow: none; - color: #666; - cursor: pointer; - display: block; - padding: 0; - position: absolute; - top: 0; - right: 0; - width: 36px; - height: 36px; - text-align: center; -} - -.ui-dialog-titlebar-close:before { - font: normal 20px/1 dashicons; - vertical-align: top; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - line-height: 36px; - width: 36px; - height: 36px; - content: '\f158'; -} - -.ui-button.ui-dialog-titlebar-close:hover { - color: #00a0d2; -} - -.ui-dialog-titlebar-close .ui-button-text { - display: none; -} - -.ui-dialog-content { - padding: 16px; - overflow: auto; -} - -.ui-dialog-buttonpane { - background: #fcfcfc; - border-top: 1px solid #dfdfdf; - padding: 16px; -} - -.ui-dialog-buttonpane .ui-button { - margin-left: 16px; -} - -.ui-dialog-buttonpane .ui-dialog-buttonset { - float: right; -} - -.ui-draggable .ui-dialog-titlebar { - cursor: move; -} - -.ui-widget-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - min-height: 360px; - background: #000; - opacity: 0.7; - filter: alpha(opacity=70); - z-index: 100101; -} diff --git a/wp/wp-includes/css/jquery-ui-dialog.min.css b/wp/wp-includes/css/jquery-ui-dialog.min.css deleted file mode 100644 index 941d138f..00000000 --- a/wp/wp-includes/css/jquery-ui-dialog.min.css +++ /dev/null @@ -1,17 +0,0 @@ -/*! - * jQuery UI CSS Framework 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/category/theming/ - */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-button,.ui-helper-reset{text-decoration:none;margin:0}.ui-helper-reset{padding:0;border:0;outline:0;line-height:1.3;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{width:100%;height:100%}/*! - * jQuery UI Resizable 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-button{display:inline-block;font-size:13px;line-height:26px;height:28px;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;-webkit-border-radius:3px;border-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:0 1px 0 #ccc;box-shadow:0 1px 0 #ccc;vertical-align:top}.ui-button:active,.ui-button:focus{outline:0}.ui-button::-moz-focus-inner{border-width:0;border-style:none;padding:0}.ui-button:focus,.ui-button:hover{background:#fafafa;border-color:#999;color:#23282d}.ui-button:focus{border-color:#5b9dd9;-webkit-box-shadow:0 0 3px rgba(0,115,170,.8);box-shadow:0 0 3px rgba(0,115,170,.8)}.ui-button:active{background:#eee;border-color:#999;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,.5);-webkit-transform:translateY(1px);-ms-transform:translateY(1px);transform:translateY(1px)}.ui-button:disabled,.ui-button[disabled]{color:#a0a5aa!important;border-color:#ddd!important;background:#f7f7f7!important;-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:0 1px 0 #fff!important;cursor:default;-webkit-transform:none!important;-ms-transform:none!important;transform:none!important}@media screen and (max-width:782px){.ui-button{padding:6px 14px;line-height:normal;font-size:14px;vertical-align:middle;height:auto;margin-bottom:4px}}.ui-dialog{position:absolute;top:0;left:0;z-index:100102;background-color:#fff;-webkit-box-shadow:0 3px 6px rgba(0,0,0,.3);box-shadow:0 3px 6px rgba(0,0,0,.3)}.ui-dialog-titlebar{background:#fcfcfc;border-bottom:1px solid #dfdfdf;height:36px;font-size:18px;font-weight:600;line-height:36px;padding:0 36px 0 16px}.ui-button.ui-dialog-titlebar-close{background:0 0;border:none;-webkit-box-shadow:none;box-shadow:none;color:#666;cursor:pointer;display:block;padding:0;position:absolute;top:0;right:0;width:36px;height:36px;text-align:center}.ui-dialog-titlebar-close:before{font:400 20px/1 dashicons;vertical-align:top;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:36px;width:36px;height:36px;content:'\f158'}.ui-button.ui-dialog-titlebar-close:hover{color:#00a0d2}.ui-dialog-titlebar-close .ui-button-text{display:none}.ui-dialog-content{padding:16px;overflow:auto}.ui-dialog-buttonpane{background:#fcfcfc;border-top:1px solid #dfdfdf;padding:16px}.ui-dialog-buttonpane .ui-button{margin-left:16px}.ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-widget-overlay{position:fixed;top:0;left:0;right:0;bottom:0;min-height:360px;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:100101} \ No newline at end of file diff --git a/wp/wp-includes/css/media-views-rtl.css b/wp/wp-includes/css/media-views-rtl.css deleted file mode 100644 index c53a5307..00000000 --- a/wp/wp-includes/css/media-views-rtl.css +++ /dev/null @@ -1,2687 +0,0 @@ -/** - * Base Styles - */ -.media-modal * { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -.media-modal input, -.media-modal select, -.media-modal textarea { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.media-modal, -.media-frame { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - font-size: 12px; - -webkit-overflow-scrolling: touch; -} - -.media-modal legend, -.media-modal label { - font-size: 13px; -} - -.media-frame input, -.media-frame textarea { - padding: 6px 8px; -} - -.media-frame select, -.wp-admin .media-frame select { - line-height: 28px; - margin-top: 3px; -} - -.media-frame a { - border-bottom: none; - color: #0073aa; -} - -.media-frame a:hover, -.media-frame a:active { - color: #00a0d2; -} - -.media-frame a:focus { - -webkit-box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - outline: none; - color: #124964; -} - -.media-frame a.button { - color: #32373c; -} - -.media-frame a.button:hover { - color: #23282d; -} - -.media-frame a.button-primary, -.media-frame a.button-primary:hover { - color: #fff; -} - -.media-frame input[type="text"], -.media-frame input[type="password"], -.media-frame input[type="number"], -.media-frame input[type="search"], -.media-frame input[type="email"], -.media-frame input[type="url"], -.media-frame textarea, -.media-frame select { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - font-size: 12px; - border-width: 1px; - border-style: solid; - border-color: #ddd; -} - -.media-frame input[type="text"]:focus, -.media-frame input[type="password"]:focus, -.media-frame input[type="number"]:focus, -.media-frame input[type="search"]:focus, -.media-frame input[type="email"]:focus, -.media-frame input[type="url"]:focus, -.media-frame textarea:focus, -.media-frame select:focus { - border-color: #5b9dd9; -} - -.media-frame select { - height: 24px; - padding: 2px; -} - -.media-frame input:disabled, -.media-frame textarea:disabled, -.media-frame input[readonly], -.media-frame textarea[readonly] { - background-color: #eee; -} - -.media-frame input[type="search"] { - -webkit-appearance: textfield; -} - -.media-frame ::-webkit-input-placeholder { - color: #72777c; -} - -.media-frame ::-moz-placeholder { - color: #72777c; - opacity: 1; -} - -.media-frame :-ms-input-placeholder { - color: #72777c; -} - -.media-frame .hidden { - display: none; -} - -/*! - * jQuery UI Draggable/Sortable 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */ -.ui-draggable-handle, -.ui-sortable-handle { - -ms-touch-action: none; - touch-action: none; -} - -/** - * Modal - */ -.media-modal { - position: fixed; - top: 30px; - right: 30px; - left: 30px; - bottom: 30px; - z-index: 160000; -} - -.wp-customizer .media-modal { - z-index: 560000; -} - -.media-modal-backdrop { - position: fixed; - top: 0; - right: 0; - left: 0; - bottom: 0; - min-height: 360px; - background: #000; - opacity: 0.7; - z-index: 159900; -} - -.wp-customizer .media-modal-backdrop { - z-index: 559900; -} - -.media-modal-close { - position: absolute; - top: 0; - left: 0; - width: 50px; - height: 50px; - margin: 0; - padding: 0; - border: 1px solid transparent; - background: none; - color: #666; - z-index: 1000; - cursor: pointer; - outline: none; - -webkit-transition: color .1s ease-in-out, background .1s ease-in-out; - transition: color .1s ease-in-out, background .1s ease-in-out; -} - -.media-modal-close:hover, -.media-modal-close:active { - color: #00a0d2; -} - -.media-modal-close:focus { - color: #00a0d2; - border-color: #5b9dd9; - -webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); - box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); -} - -.media-modal-close span.media-modal-icon { - background-image: none; -} - -.media-modal-close .media-modal-icon:before { - content: "\f158"; - font: normal 20px/1 dashicons; - speak: none; - vertical-align: middle; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.media-modal-content { - position: absolute; - top: 0; - right: 0; - left: 0; - bottom: 0; - overflow: auto; - min-height: 300px; - -webkit-box-shadow: 0 5px 15px rgba(0,0,0,0.7); - box-shadow: 0 5px 15px rgba(0,0,0,0.7); - background: #fcfcfc; - -webkit-font-smoothing: subpixel-antialiased; -} - -.media-modal-content .media-frame select.attachment-filters { - margin-top: 11px; - margin-left: 2%; - width: 42%; - width: -webkit-calc(48% - 12px); - width: calc(48% - 12px); -} - -.media-modal-content .media-toolbar-primary .media-button { - float: left; -} - -.media-modal-content .attachments-browser .search { - width: 100%; -} - -/* higher specificity */ -.wp-core-ui .media-modal-icon { - background-image: url(../images/uploader-icons.png); - background-repeat: no-repeat; -} - -/** - * Toolbar - */ -.media-toolbar { - position: absolute; - top: 0; - right: 0; - left: 0; - z-index: 100; - height: 60px; - padding: 0 16px; - border: 0 solid #ddd; - overflow: hidden; -} - -.media-frame-toolbar .media-toolbar { - top: initial; - bottom: -45px; - height: auto; - overflow: initial; - border-top: 1px solid #ddd; -} - -@media screen and (max-width: 782px) { - .media-frame-toolbar .media-toolbar { - bottom: -48px; - } -} - -.media-toolbar-primary { - float: left; - height: 100%; -} - -.media-toolbar-secondary { - float: right; - height: 100%; -} - -.media-toolbar-primary > .media-button, -.media-toolbar-primary > .media-button-group { - margin-right: 10px; - float: right; - margin-top: 15px; -} - -.media-toolbar-secondary > .media-button, -.media-toolbar-secondary > .media-button-group { - margin-left: 10px; - margin-top: 15px; -} - -/** - * Sidebar - */ -.media-sidebar { - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: 267px; - padding: 0 16px 24px; - z-index: 75; - background: #f3f3f3; - border-right: 1px solid #ddd; - overflow: auto; - -webkit-overflow-scrolling: touch; -} - -.hide-toolbar .media-sidebar { - bottom: 0; -} - -.media-sidebar .sidebar-title { - font-size: 20px; - margin: 0; - padding: 12px 10px 10px; - line-height: 28px; -} - -.media-sidebar .sidebar-content { - padding: 0 10px; - margin-bottom: 130px; -} - -.media-sidebar .search { - display: block; - width: 100%; -} - -.media-sidebar h3, /* Back-compat for pre-4.4 */ -.image-details h3, /* Back-compat for pre-4.4 */ -.media-sidebar h2, -.image-details h2 { - position: relative; - font-weight: 600; - text-transform: uppercase; - font-size: 12px; - color: #666; - margin: 24px 0 8px; -} - -.media-sidebar .setting, -.attachment-details .setting { - display: block; - float: right; - width: 100%; - margin: 1px 0; -} - -.media-sidebar .setting label, -.attachment-details .setting label { - display: block; -} - -.media-sidebar .setting .link-to-custom, -.attachment-details .setting .link-to-custom { - margin: 3px 2px 0; -} - -.media-sidebar .setting span, -.attachment-details .setting span { - min-width: 30%; - margin-left: 4%; - font-size: 12px; - text-align: left; - word-wrap: break-word; -} - -.media-sidebar .setting .name { - max-width: 80px; -} - -.media-sidebar .setting select, -.attachment-details .setting select { - max-width: 65%; -} - -.media-sidebar .setting input[type="checkbox"], -.media-sidebar .field input[type="checkbox"], -.media-sidebar .setting input[type="radio"], -.media-sidebar .field input[type="radio"], -.attachment-details .setting input[type="checkbox"], -.attachment-details .field input[type="checkbox"], -.attachment-details .setting input[type="radio"], -.attachment-details .field input[type="radio"] { - float: none; - margin: 8px 3px 0; - padding: 0; -} - -.media-sidebar .setting span, -.attachment-details .setting span, -.compat-item label span { - float: right; - min-height: 22px; - padding-top: 8px; - line-height: 16px; - font-weight: 400; - color: #666; -} - -.compat-item label span { - text-align: left; -} - -.media-sidebar .setting input[type="text"], -.media-sidebar .setting input[type="password"], -.media-sidebar .setting input[type="email"], -.media-sidebar .setting input[type="number"], -.media-sidebar .setting input[type="search"], -.media-sidebar .setting input[type="tel"], -.media-sidebar .setting input[type="url"], -.media-sidebar .setting textarea, -.media-sidebar .setting .value, -.attachment-details .setting input[type="text"], -.attachment-details .setting input[type="password"], -.attachment-details .setting input[type="email"], -.attachment-details .setting input[type="number"], -.attachment-details .setting input[type="search"], -.attachment-details .setting input[type="tel"], -.attachment-details .setting input[type="url"], -.attachment-details .setting textarea, -.attachment-details .setting .value { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin: 1px; - width: 65%; - float: left; -} - -.media-sidebar .setting .value, -.attachment-details .setting .value { - margin: 0 1px; - text-align: right; -} - -.media-sidebar .setting textarea, -.attachment-details .setting textarea, -.compat-item .field textarea { - height: 62px; - resize: vertical; -} - -.media-sidebar select, -.attachment-details select { - margin-top: 3px; -} - -.compat-item { - float: right; - width: 100%; - overflow: hidden; -} - -.compat-item table { - width: 100%; - table-layout: fixed; - border-spacing: 0; - border: 0; -} - -.compat-item tr { - padding: 2px 0; - display: block; - overflow: hidden; -} - -.compat-item .label, -.compat-item .field { - display: block; - margin: 0; - padding: 0; -} - -.compat-item .label { - min-width: 30%; - margin-left: 4%; - float: right; - text-align: left; -} - -.compat-item .label span { - display: block; - width: 100%; -} - -.compat-item .field { - float: left; - width: 65%; - margin: 1px; -} - -.compat-item .field input[type="text"], -.compat-item .field input[type="password"], -.compat-item .field input[type="email"], -.compat-item .field input[type="number"], -.compat-item .field input[type="search"], -.compat-item .field input[type="tel"], -.compat-item .field input[type="url"], -.compat-item .field textarea { - width: 100%; - margin: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.sidebar-for-errors .attachment-details, -.sidebar-for-errors .compat-item, -.sidebar-for-errors .media-sidebar .media-progress-bar, -.sidebar-for-errors .upload-details { - display: none !important; -} - -/** - * Menu - */ -.media-menu { - position: absolute; - top: 0; - right: 0; - left: 0; - bottom: 0; - margin: 0; - padding: 10px 0; - background: #f3f3f3; - border-left-width: 1px; - border-left-style: solid; - border-left-color: #ccc; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.media-menu > a { - display: block; - position: relative; - padding: 8px 20px; - margin: 0; - line-height: 18px; - font-size: 14px; - color: #0073aa; - text-decoration: none; -} - -.media-menu > a:hover { - color: #0073aa; - background: rgba( 0, 0, 0, 0.04 ); -} - -.media-menu > a:active { - outline: none; -} - -.media-menu .active, -.media-menu .active:hover { - color: #23282d; - font-weight: 600; -} - -.media-menu .separator { - height: 0; - margin: 12px 20px; - padding: 0; - border-top: 1px solid #ddd; -} - -/** - * Menu - */ -.media-router { - position: relative; - padding: 0 6px; - margin: 0; - clear: both; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.media-router a { - -webkit-transition: none; - transition: none; -} - -.media-router > a { - position: relative; - float: right; - padding: 8px 10px 9px; - margin: 0; - height: 18px; - line-height: 18px; - font-size: 14px; - text-decoration: none; -} - -.media-router > a:last-child { - border-left: 0; -} - -.media-router > a:active { - outline: none; -} - -.media-router .active, -.media-router .active:hover { - color: #32373c; -} - -.media-router .active, -.media-router > a.active:last-child { - margin: -1px -1px 0; - background: #fff; - border: 1px solid #ddd; - border-bottom: none; -} - -.media-router .active:after { - display: none; -} - -/** - * Frame - */ -.media-frame { - overflow: hidden; - position: absolute; - top: 0; - right: 0; - left: 0; - bottom: 0; -} - -.media-frame-menu { - position: absolute; - top: 0; - right: 0; - bottom: 0; - width: 200px; - z-index: 150; -} - -.media-frame-title { - position: absolute; - top: 0; - right: 200px; - left: 0; - height: 50px; - z-index: 200; -} - -.media-frame-router { - position: absolute; - top: 50px; - right: 200px; - left: 0; - height: 36px; - z-index: 200; -} - -.media-frame-content { - position: absolute; - top: 84px; - right: 200px; - left: 0; - bottom: 61px; - height: auto; - width: auto; - margin: 0; - overflow: auto; - background: #fff; - border-top: 1px solid #ddd; -} - -.media-frame-toolbar { - position: absolute; - right: 200px; - left: 0; - bottom: 0; - height: 60px; - z-index: 100; - bottom: 60px; - height: auto; -} - -.media-frame.hide-menu .media-frame-title, -.media-frame.hide-menu .media-frame-router, -.media-frame.hide-menu .media-frame-toolbar, -.media-frame.hide-menu .media-frame-content { - right: 0; -} - -.media-frame.hide-menu .media-frame-menu { - right: -200px; -} - -.media-frame.hide-toolbar .media-frame-content { - bottom: 0; -} - -.media-frame.hide-toolbar .media-frame-toolbar { - bottom: -61px; -} - -.media-frame.hide-router .media-frame-content { - top: 50px; -} - -.media-frame.hide-router .media-frame-router { - display: none; -} - -.media-frame.hide-router .media-frame-title { - border-bottom: 1px solid #ddd; - -webkit-box-shadow: 0 4px 4px -4px rgba( 0, 0, 0, 0.1 ); - box-shadow: 0 4px 4px -4px rgba( 0, 0, 0, 0.1 ); -} - -.media-frame-title .dashicons { - display: none; -} - -.media-frame-title h1 { - padding: 0 16px; - font-size: 22px; - line-height: 50px; - margin: 0; -} - -.media-frame-title .suggested-dimensions { - font-size: 14px; - float: left; - margin-left: 20px; -} - -.media-frame-content .crop-content { - height: 100%; -} - -.wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon { - margin-left: 300px; -} - -.media-frame-content .crop-content .crop-image { - display: block; - margin: auto; - max-width: 100%; - max-height: 100%; -} - -.media-frame-content .crop-content .upload-errors -{ - position: absolute; - width: 300px; - top: 50%; - right: 50%; - margin-right: -150px; - margin-left: -150px; - z-index: 600000; -} - -/** - * Iframes - */ -.media-frame .media-iframe { - overflow: hidden; -} - -.media-frame .media-iframe, -.media-frame .media-iframe iframe { - height: 100%; - width: 100%; - border: 0; -} - -/** - * Attachment Browser Filters - */ -.media-frame select.attachment-filters { - margin-top: 11px; - margin-left: 2%; - max-width: 42%; - max-width: -webkit-calc(48% - 12px); - max-width: calc(48% - 12px); -} - -.media-frame select.attachment-filters:last-of-type { - margin-left: 0; -} - -/** - * Search - */ -.media-frame .search { - margin-top: 11px; - padding: 4px; - font-size: 13px; - color: #444; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - -webkit-appearance: none; -} - -.media-toolbar-primary .search { - max-width: 100%; -} - -/** - * Attachments - */ -.wp-core-ui .attachments { - margin: 0; - -webkit-overflow-scrolling: touch; -} - -/** - * Attachment - */ -.wp-core-ui .attachment { - position: relative; - float: right; - padding: 8px; - margin: 0; - color: #444; - cursor: pointer; - list-style: none; - text-align: center; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - width: 25%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.wp-core-ui .attachment:focus, -.wp-core-ui .selected.attachment:focus, -.wp-core-ui .attachment.details:focus { - -webkit-box-shadow: - inset 0 0 2px 3px #fff, - inset 0 0 0 7px #5b9dd9; - box-shadow: - inset 0 0 2px 3px #fff, - inset 0 0 0 7px #5b9dd9; - outline: none; -} - -.wp-core-ui .selected.attachment { - -webkit-box-shadow: - inset 0 0 0 5px #fff, - inset 0 0 0 7px #ccc; - box-shadow: - inset 0 0 0 5px #fff, - inset 0 0 0 7px #ccc; -} - -.wp-core-ui .attachment.details { - -webkit-box-shadow: - inset 0 0 0 3px #fff, - inset 0 0 0 7px #0073aa; - box-shadow: - inset 0 0 0 3px #fff, - inset 0 0 0 7px #0073aa; -} - -.wp-core-ui .attachment-preview { - position: relative; - -webkit-box-shadow: - inset 0 0 15px rgba( 0, 0, 0, 0.1 ), - inset 0 0 0 1px rgba( 0, 0, 0, 0.05 ); - box-shadow: - inset 0 0 15px rgba( 0, 0, 0, 0.1 ), - inset 0 0 0 1px rgba( 0, 0, 0, 0.05 ); - background: #eee; - cursor: pointer; -} - -.wp-core-ui .attachment-preview:before { - content: ""; - display: block; - padding-top: 100%; -} - -.wp-core-ui .attachment .icon { - margin: 0 auto; - overflow: hidden; -} - -.wp-core-ui .attachment .thumbnail { - overflow: hidden; - position: absolute; - top: 0; - left: 0; - bottom: 0; - right: 0; - opacity: 1; - -webkit-transition: opacity .1s; - transition: opacity .1s; -} - -.wp-core-ui .attachment .portrait img { - max-width: 100%; -} - -.wp-core-ui .attachment .landscape img { - max-height: 100%; -} - -.wp-core-ui .attachment .thumbnail:after { - content: ""; - display: block; - position: absolute; - top: 0; - right: 0; - left: 0; - bottom: 0; - -webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 ); - box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 ); - overflow: hidden; -} - -.wp-core-ui .attachment .thumbnail img { - top: 0; - right: 0; -} - -.wp-core-ui .attachment .thumbnail .centered { - position: absolute; - top: 0; - right: 0; - width: 100%; - height: 100%; - -webkit-transform: translate( -50%, 50% ); - -ms-transform: translate(-50%,50%); /* Fails with spaces?? Weird! */ - transform: translate( -50%, 50% ); -} - -.wp-core-ui .attachment .thumbnail .centered img { - -webkit-transform: translate( 50%, -50% ); - -ms-transform: translate(50%,-50%); - transform: translate( 50%, -50% ); -} - -.wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon { - -webkit-transform: translate( 50%, -70% ); - -ms-transform: translate(50%,-70%); - transform: translate( 50%, -70% ); -} - -.ie8 .wp-core-ui .attachment img.icon { - top: 20%; - position: relative; -} - -.wp-core-ui .attachment .filename { - position: absolute; - right: 0; - left: 0; - bottom: 0; - overflow: hidden; - max-height: 100%; - word-wrap: break-word; - text-align: center; - font-weight: 600; - background: rgba( 255, 255, 255, 0.8 ); - -webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 ); - box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 ); -} - -.wp-core-ui .attachment .filename div { - padding: 5px 10px; -} - -.wp-core-ui .attachment .thumbnail img { - position: absolute; -} - -.wp-core-ui .attachment-close { - display: block; - position: absolute; - top: 5px; - left: 5px; - height: 22px; - width: 22px; - padding: 0; - background-color: #fff; - background-position: -96px 4px; - -webkit-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: 0 0 0 1px rgba( 0, 0, 0, 0.3 ); - box-shadow: 0 0 0 1px rgba( 0, 0, 0, 0.3 ); -} - -.wp-core-ui .attachment-close:hover, -.wp-core-ui .attachment-close:focus { - background-position: -36px 4px; -} - -.wp-core-ui .attachment .check { - display: none; - height: 24px; - width: 24px; - padding: 0; - position: absolute; - z-index: 10; - top: 0; - left: 0; - outline: none; - background: #eee; - -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px rgba( 0, 0, 0, 0.15 ); - box-shadow: 0 0 0 1px #fff, 0 0 0 2px rgba( 0, 0, 0, 0.15 ); -} - -.wp-core-ui .attachment .check .media-modal-icon { - display: block; - background-position: -1px 0; - height: 15px; - width: 15px; - margin: 5px; -} - -.wp-core-ui .attachment .check:hover .media-modal-icon { - background-position: -40px 0; -} - -.wp-core-ui .attachment.selected .check { - display: block; -} - -.wp-core-ui .attachment.details .check, -.wp-core-ui .attachment.selected .check:focus, -.wp-core-ui .media-frame.mode-grid .attachment.selected .check { - background-color: #0073aa; - -webkit-box-shadow: - 0 0 0 1px #fff, - 0 0 0 2px #0073aa; - box-shadow: - 0 0 0 1px #fff, - 0 0 0 2px #0073aa; -} - -.wp-core-ui .attachment.details .check .media-modal-icon, -.wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon { - background-position: -21px 0; -} - -.wp-core-ui .attachment.details .check:hover .media-modal-icon, -.wp-core-ui .attachment.selected .check:focus .media-modal-icon, -.wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon { - background-position: -60px 0; -} - -.wp-core-ui .media-frame .attachment .describe { - position: relative; - display: block; - width: 100%; - margin: 0; - padding: 8px; - font-size: 12px; - -webkit-border-radius: 0; - border-radius: 0; -} - -/** - * Attachments Browser - */ -.media-frame .attachments-browser { - position: relative; - width: 100%; - height: 100%; - overflow: hidden; -} - -.attachments-browser .media-toolbar { - left: 300px; - height: 50px; -} - -.attachments-browser.hide-sidebar .media-toolbar { - left: 0; -} - -.attachments-browser .media-toolbar-primary > .media-button, -.attachments-browser .media-toolbar-primary > .media-button-group, -.attachments-browser .media-toolbar-secondary > .media-button, -.attachments-browser .media-toolbar-secondary > .media-button-group { - margin: 11px 0; -} - -.attachments-browser .attachments { - padding: 2px 8px 8px; -} - -.attachments-browser .attachments, -.attachments-browser .uploader-inline { - position: absolute; - top: 50px; - right: 0; - left: 300px; - bottom: 0; - overflow: auto; - outline: none; -} - -.attachments-browser .uploader-inline.hidden { - display: none; -} - -.attachments-browser .media-toolbar-primary { - max-width: 33%; -} - -.attachments-browser .media-toolbar-secondary { - max-width: 66%; -} - -.uploader-inline .close { - background-color: transparent; - border: 0; - cursor: pointer; - height: 48px; - position: absolute; - left: 0; - text-align: center; - top: 0; - width: 50px; - z-index: 1; -} - -.uploader-inline .close:before { - font: normal 30px/50px dashicons !important; - color: #72777c; - display: inline-block; - content: "\f335"; - font-weight: 300; -} - -.attachments-browser.hide-sidebar .attachments, -.attachments-browser.hide-sidebar .uploader-inline { - left: 0; - margin-left: 0; -} - -.attachments-browser .instructions { - display: inline-block; - margin-top: 16px; - line-height: 18px; - font-size: 13px; - color: #666; - margin-left: 0.5em; -} - -.attachments-browser .no-media { - padding: 2em 2em 0 0; -} - -/** - * Progress Bar - */ -.media-progress-bar { - position: relative; - height: 10px; - width: 70%; - margin: 10px auto; - -webkit-border-radius: 10px; - border-radius: 10px; - background: #ddd; - background: rgba( 0, 0, 0, 0.1 ); -} - -.media-progress-bar div { - height: 10px; - min-width: 20px; - width: 0; - background: #0073aa; - -webkit-border-radius: 10px; - border-radius: 10px; - -webkit-transition: width 300ms; - transition: width 300ms; -} - -.media-uploader-status .media-progress-bar { - display: none; - width: 100%; -} - -.uploading.media-uploader-status .media-progress-bar { - display: block; -} - -.attachment-preview .media-progress-bar { - position: absolute; - top: 50%; - right: 15%; - width: 70%; - margin: -5px 0 0 0; -} - -.media-uploader-status { - position: relative; - margin: 0 auto; - padding-bottom: 10px; - max-width: 400px; -} - -.uploader-inline .media-uploader-status h3, /* Back-compat for pre-4.4 */ -.uploader-inline .media-uploader-status h2 { - display: none; -} - -.media-uploader-status .upload-details { - display: none; - font-size: 12px; - color: #666; -} - -.uploading.media-uploader-status .upload-details { - display: block; -} - -.media-uploader-status .upload-detail-separator { - padding: 0 4px; -} - -.media-uploader-status .upload-count { - color: #444; -} - -.media-uploader-status .upload-dismiss-errors, -.media-uploader-status .upload-errors { - display: none; -} - -.errors.media-uploader-status .upload-dismiss-errors, -.errors.media-uploader-status .upload-errors { - display: block; -} - -.media-uploader-status .upload-dismiss-errors { - text-decoration: none; -} - -.media-sidebar .media-uploader-status .upload-dismiss-errors { - position: absolute; - top: 0; - left: 0; -} - -.upload-errors .upload-error { - padding: 12px; - margin-bottom: 12px; - background: #fff; - border-right: 4px solid #dc3232; - -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); -} - -.uploader-inline .upload-errors .upload-error { - background-color: #fbeaea; - -webkit-box-shadow: none; - box-shadow: none; -} - -.upload-errors .upload-error-filename { - font-weight: 600; -} - -.upload-errors .upload-error-message { - display: block; - padding-top: 8px; - word-wrap: break-word; -} - -.uploader-window { - position: fixed; - top: 0; - right: 0; - left: 0; - bottom: 0; - background: rgba( 0, 86, 132, 0.9 ); - z-index: 250000; - display: none; - text-align: center; - opacity: 0; - -webkit-transition: opacity 250ms; - transition: opacity 250ms; -} - -.uploader-window-content { - position: absolute; - top: 10px; - right: 10px; - left: 10px; - bottom: 10px; - border: 1px dashed #fff; -} - -.uploader-window h3, /* Back-compat for pre-4.4 */ -.uploader-window h1 { - margin: -0.5em 0 0; - position: absolute; - top: 50%; - right: 0; - left: 0; - -webkit-transform: translateY( -50% ); - -ms-transform: translateY(-50%); - transform: translateY( -50% ); - font-size: 40px; - color: #fff; - padding: 0; -} - -.uploader-window .media-progress-bar { - margin-top: 20px; - max-width: 300px; - background: transparent; - border-color: #fff; - display: none; -} - -.uploader-window .media-progress-bar div { - background: #fff; -} - -.uploading .uploader-window .media-progress-bar { - display: block; -} - -.media-frame .uploader-inline { - margin-bottom: 20px; - padding: 0; - text-align: center; -} - -.uploader-inline-content { - position: absolute; - top: 30%; - right: 0; - left: 0; -} - -.uploader-inline-content .upload-ui { - margin: 2em 0; -} - -.uploader-inline-content .post-upload-ui { - margin-bottom: 2em; -} - -.uploader-inline .has-upload-message .upload-ui { - margin: 0 0 4em; -} - -.uploader-inline h3, /* Back-compat for pre-4.4 */ -.uploader-inline h2 { - font-size: 20px; - line-height: 28px; - font-weight: 400; - margin: 0; -} - -.uploader-inline .has-upload-message .upload-instructions { - font-size: 14px; - color: #444; - font-weight: 400; -} - -.uploader-inline .drop-instructions { - display: none; -} - -.supports-drag-drop .uploader-inline .drop-instructions { - display: block; -} - -.uploader-inline p { - font-size: 12px; - margin: 0.5em 0; -} - -.uploader-inline .media-progress-bar { - display: none; -} - -.uploading.uploader-inline .media-progress-bar { - display: block; -} - -.uploader-inline .browser { - display: inline-block !important; -} - -/** - * Selection - */ -.media-selection { - position: absolute; - top: 0; - right: 0; - left: 350px; - height: 60px; - padding: 0 16px 0 0; - overflow: hidden; - white-space: nowrap; -} - -.media-selection .selection-info { - display: inline-block; - font-size: 12px; - height: 60px; - margin-left: 10px; - vertical-align: top; -} - -.media-selection.empty, -.media-selection.editing { - display: none; -} - -.media-selection.one .edit-selection { - display: none; -} - -.media-selection .count { - display: block; - padding-top: 12px; - font-size: 14px; - line-height: 20px; - font-weight: 600; -} - -.media-selection .button-link { - float: right; - padding: 1px 8px; - margin: 1px -8px 1px 8px; - line-height: 16px; - border-left: 1px solid #ddd; - color: #0073aa; -} - -.media-selection .button-link:hover, -.media-selection .button-link:focus { - color: #00a0d2; -} - -.media-selection .button-link:last-child { - border-left: 0; - margin-left: 0; -} - -.selection-info .clear-selection { - color: #bc0b0b; -} - -.selection-info .clear-selection:hover, -.selection-info .clear-selection:focus { - color: red; -} - -.media-selection .selection-view { - display: inline-block; - vertical-align: top; -} - -.media-selection .attachments { - display: inline-block; - height: 48px; - margin: 6px; - padding: 0; - overflow: hidden; - vertical-align: top; -} - -.media-selection .attachment { - width: 40px; - padding: 0; - margin: 4px; -} - -.media-selection .attachment .thumbnail { - top: 0; - left: 0; - bottom: 0; - right: 0; -} - -.media-selection .attachment .icon { - width: 50%; -} - -.media-selection .attachment-preview { - -webkit-box-shadow: none; - box-shadow: none; - background: none; -} - -.wp-core-ui .media-selection .attachment:focus, -.wp-core-ui .media-selection .selected.attachment:focus, -.wp-core-ui .media-selection .attachment.details:focus { - -webkit-box-shadow: - 0 0 0 1px #fff, - 0 0 2px 3px #5b9dd9; - box-shadow: - 0 0 0 1px #fff, - 0 0 2px 3px #5b9dd9; -} - -.wp-core-ui .media-selection .selected.attachment { - -webkit-box-shadow: none; - box-shadow: none; -} - -.wp-core-ui .media-selection .attachment.details { - -webkit-box-shadow: - 0 0 0 1px #fff, - 0 0 0 3px #0073aa; - box-shadow: - 0 0 0 1px #fff, - 0 0 0 3px #0073aa; -} - -.media-selection:after { - content: ""; - display: block; - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: 25px; - background-image: -webkit-gradient(linear, left top, right top, from(rgba( 255, 255, 255, 1 )), to(rgba( 255, 255, 255, 0 ))); - background-image: -webkit-linear-gradient(left, rgba( 255, 255, 255, 1 ), rgba( 255, 255, 255, 0 )); - background-image: linear-gradient(to right, rgba( 255, 255, 255, 1 ), rgba( 255, 255, 255, 0 )); -} - -.media-selection .attachment .filename { - display: none; -} - -/** - * Spinner - */ -.media-frame .spinner { - background: url(../images/spinner.gif) no-repeat; - -webkit-background-size: 20px 20px; - background-size: 20px 20px; - float: left; - display: inline-block; - visibility: hidden; - opacity: 0.7; - filter: alpha(opacity=70); - width: 20px; - height: 20px; - margin: 0; - vertical-align: middle; -} - -.media-frame .spinner.is-active { - visibility: visible; -} - -.media-toolbar .spinner { - margin-top: 14px; -} - -/** - * Attachment Details - */ -.attachment-details { - position: relative; - overflow: auto; -} - -.attachment-details .settings-save-status { - float: left; - text-transform: none; - z-index: 10; -} - -.attachment-details .settings-save-status .spinner { - margin-right: 5px; -} - -.attachment-details .settings-save-status .saved { - float: left; - display: none; -} - -.attachment-details.save-waiting .settings-save-status .spinner { - visibility: visible; -} - -.attachment-details.save-complete .settings-save-status .saved { - display: block; -} - -.attachment-info { - overflow: hidden; - min-height: 60px; - margin-bottom: 16px; - line-height: 18px; - color: #666; - border-bottom: 1px solid #ddd; - padding-bottom: 11px; -} - -.attachment-info .filename { - font-weight: 600; - color: #444; - word-wrap: break-word; -} - -.attachment-info .thumbnail { - position: relative; - float: right; - max-width: 120px; - max-height: 120px; - margin-top: 5px; - margin-left: 10px; - margin-bottom: 5px; -} - -.uploading .attachment-info .thumbnail { - width: 120px; - height: 80px; - -webkit-box-shadow: inset 0 0 15px rgba( 0, 0, 0, 0.1 ); - box-shadow: inset 0 0 15px rgba( 0, 0, 0, 0.1 ); -} - -.uploading .attachment-info .media-progress-bar { - margin-top: 35px; -} - -.attachment-info .thumbnail-image:after { - content: ""; - display: block; - position: absolute; - top: 0; - right: 0; - left: 0; - bottom: 0; - -webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 ); - box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 ); - overflow: hidden; -} - -.attachment-info .thumbnail img { - display: block; - max-width: 120px; - max-height: 120px; - margin: 0 auto; -} - -.attachment-info .details { - float: right; - font-size: 12px; - max-width: 100%; -} - -.attachment-info .edit-attachment, -.attachment-info .delete-attachment, -.attachment-info .trash-attachment, -.attachment-info .untrash-attachment { - display: block; - text-decoration: none; - white-space: nowrap; -} - -.attachment-details.needs-refresh .attachment-info .edit-attachment { - display: none; -} - -.attachment-info .edit-attachment { - display: block; -} - -.media-modal .delete-attachment, -.media-modal .trash-attachment, -.media-modal .untrash-attachment { - display: inline; - padding: 0; - color: #bc0b0b; -} - -.media-modal .delete-attachment:hover, -.media-modal .delete-attachment:focus, -.media-modal .trash-attachment:hover, -.media-modal .trash-attachment:focus, -.media-modal .untrash-attachment:hover, -.media-modal .untrash-attachment:focus { - color: red; -} - -/** - * Attachment Display Settings - */ -.attachment-display-settings { - width: 100%; - float: right; - overflow: hidden; -} - -.attachment-display-settings h4 { - margin: 1.4em 0 0.4em; -} - -.collection-settings { - overflow: hidden; -} - -.collection-settings .setting input[type="checkbox"] { - float: right; - margin-left: 8px; -} - -.collection-settings .setting span { - min-width: inherit; -} - -/** - * Image Editor - */ -.media-modal .imgedit-wrap { - position: static; -} - -.media-modal .imgedit-wrap .imgedit-panel-content { - padding: 16px; - position: absolute; - top: 0; - left: 282px; - bottom: 0; - right: 0; - overflow: auto; -} - -.media-modal .imgedit-wrap .imgedit-settings { - background: #f3f3f3; - border-right: 1px solid #ddd; - padding: 20px 16px 16px; - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: 250px; - overflow: auto; -} - -.media-modal .imgedit-group { - background: none; - border: none; - border-bottom: 1px solid #ddd; - -webkit-box-shadow: none; - box-shadow: none; - margin: 0; - margin-bottom: 16px; - padding: 0; - padding-bottom: 16px; - position: relative; /* RTL fix, #WP29352 */ -} - -.media-modal .imgedit-group:last-of-type { - border: none; - margin: 0; - padding: 0; -} - -.media-modal .imgedit-group-top { - margin: 0; -} - -.media-modal .imgedit-group-top h3, /* Back-compat for pre-4.4 */ -.media-modal .imgedit-group-top h2, -.media-modal .imgedit-group-top h2 .button-link { - display: inline-block; - text-transform: uppercase; - font-size: 12px; - color: #666; - margin: 0; - margin-top: 3px; -} - -.media-modal .imgedit-group-top h3 a, /* Back-compat for pre-4.4 */ -.media-modal .imgedit-group-top h2 a, -.media-modal .imgedit-group-top h2 .button-link { - text-decoration: none; - color: #666; -} - -/* higher specificity than media.css */ -.wp-core-ui.media-modal .image-editor .imgedit-help-toggle, -.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:hover, -.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:active { - border: 1px solid transparent; - margin: 0; - padding: 0; - background: transparent; - color: #0074a2; - font-size: 20px; - line-height: 1; - cursor: pointer; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-box-shadow: none; - box-shadow: none; -} - -.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:focus { - color: #0074a2; - border-color: #5b9dd9; - outline: none; - -webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); - box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); -} - -.wp-core-ui.media-modal .imgedit-group-top .dashicons-arrow-down.imgedit-help-toggle { - margin-top: -3px; -} - -.wp-core-ui.media-modal .image-editor h3 .imgedit-help-toggle { - margin-top: -2px; -} - -.media-modal .imgedit-help-toggled span.dashicons:before { - content: "\f142"; -} - -.media-modal .imgedit-thumbnail-preview { - margin: 10px 0 0 8px; -} - -.imgedit-thumbnail-preview-caption { - display: block; -} - -.media-modal .imgedit-wrap div.updated { - margin: 0; - margin-bottom: 16px; -} - - -/** - * Embed from URL and Image Details - */ -.embed-url { - display: block; - position: relative; - padding: 16px; - margin: 0; - z-index: 250; - background: #fff; - font-size: 18px; -} - -.media-frame .embed-url input { - font-size: 18px; - padding: 12px 14px; - width: 100%; - min-width: 200px; - -webkit-box-shadow: inset -2px 2px 4px -2px rgba( 0, 0, 0, 0.1 ); - box-shadow: inset -2px 2px 4px -2px rgba( 0, 0, 0, 0.1 ); -} - -.media-frame .embed-url .spinner { - position: absolute; - top: 32px; - left: 26px; -} - -.media-frame .embed-loading .embed-url .spinner { - visibility: visible; -} - -.embed-link-settings, -.embed-media-settings { - position: absolute; - top: 70px; - right: 0; - left: 0; - bottom: 0; - padding: 16px 16px 32px; - overflow: auto; -} - -.media-embed .embed-link-settings { - /* avoid Firefox to give focus to the embed preview container parent */ - overflow: visible; -} - -.embed-preview img, -.embed-preview iframe, -.embed-preview embed, -.mejs-container video { - max-width: 100%; - vertical-align: middle; -} - -.embed-preview a { - display: inline-block; -} - -.embed-preview img { - display: block; - height: auto; -} - -.mejs-container:focus { - outline: 1px solid #5b9dd9; - -webkit-box-shadow: 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: 0 0 2px 1px rgba(30, 140, 190, .8); -} - -.image-details .media-modal { - right: 140px; - left: 140px; -} - -.image-details .media-frame-title, -.image-details .media-frame-content, -.image-details .media-frame-router { - right: 0; -} - -.image-details .embed-media-settings { - top: 0; - overflow: visible; - padding: 0; -} - -.image-details .embed-media-settings, -.image-details .embed-media-settings div { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.image-details .column-settings { - background: #f3f3f3; - border-left: 1px solid #ddd; - min-height: 100%; - width: 55%; - position: absolute; - top: 0; - right: 0; -} - -.image-details .column-settings h3, /* Back-compat for pre-4.4 */ -.image-details .column-settings h2 { - margin: 20px; - padding-top: 20px; - border-top: 1px solid #ddd; - color: #23282d; -} - -.image-details .column-image { - width: 45%; - position: absolute; - right: 55%; - top: 0; -} - -.image-details .image { - margin: 20px; -} - -.image-details .image img { - max-width: 100%; - max-height: 500px; -} - -.image-details .advanced-toggle { - padding: 0; - color: #666; - text-transform: uppercase; -} - -.image-details .advanced-toggle:after { - font: normal 20px/1 dashicons; - speak: none; - vertical-align: top; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - content: "\f140"; - display: inline-block; - margin-top: -2px; -} - -.image-details .advanced-visible .advanced-toggle:after { - content: "\f142"; -} - -.image-details .embed-media-settings .size { - margin-bottom: 4px; -} - -.image-details .custom-size span { - display: block; -} - -.image-details .custom-size label { - display: block; - float: right; -} - -.image-details .custom-size span small { - color: #555d66; /* #f3f3f3 background */ - font-size: inherit; -} - -.image-details .custom-size input { - width: 5em; -} - -.image-details .custom-size .sep { - float: right; - margin: 26px 6px 0 6px; -} - -.image-details .custom-size:after { - content: ""; - display: table; - clear: both; -} - -.media-embed .thumbnail { - max-width: 100%; - max-height: 200px; - position: relative; - float: right; -} - -.media-embed .thumbnail img { - max-height: 200px; - display: block; -} - -.media-embed .thumbnail:after { - content: ""; - display: block; - position: absolute; - top: 0; - right: 0; - left: 0; - bottom: 0; - -webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 ); - box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 ); - overflow: hidden; -} - -.media-embed .setting { - width: 100%; - margin: 10px 0; - float: right; - display: block; - clear: both; -} - -.image-details .embed-media-settings .setting { - float: none; - width: auto; -} - -.image-details .actions { - margin: 10px 0; -} - -.image-details .hidden { - display: none; -} - -.media-embed .setting input[type="text"], -.media-embed .setting textarea { - display: block; - width: 100%; - max-width: 400px; - margin: 1px 0; -} - -.image-details .embed-media-settings .setting input[type="text"], -.image-details .embed-media-settings .setting textarea { - max-width: inherit; - width: 70%; -} - -.image-details .embed-media-settings .setting input.link-to-custom, -.image-details .embed-media-settings .link-target, -.image-details .embed-media-settings .custom-size { - margin-right: 27%; - width: 70%; -} - -.image-details .embed-media-settings .link-target { - margin-top: 24px; -} - -.media-embed .setting input.hidden, -.media-embed .setting textarea.hidden { - display: none; -} - -.media-embed .setting span { - display: block; - width: 200px; - font-size: 13px; - line-height: 24px; - color: #666; -} - -.image-details .embed-media-settings .setting span { - float: right; - width: 25%; - text-align: left; - margin: 8px 1% 0 1%; - line-height: 1.1; -} - -.media-embed .setting .button-group { - margin: 2px 0; -} - -.media-embed-sidebar { - position: absolute; - top: 0; - right: 440px; -} - -.advanced-section, -.link-settings { - margin-top: 10px; -} - -/* Drag & drop on the editor upload */ -.wp-editor-wrap .uploader-editor { - background: rgba( 150, 150, 150, 0.9 ); - position: absolute; - top: 0; - right: 0; - width: 100%; - height: 100%; - z-index: 99998; /* under the toolbar */ - display: none; - text-align: center; -} - -.wp-editor-wrap .uploader-editor-content { - border: 1px dashed #fff; - position: absolute; - top: 10px; - right: 10px; - left: 10px; - bottom: 10px; -} - -.wp-editor-wrap .uploader-editor .uploader-editor-title { - position: absolute; - top: 50%; - right: 0; - left: 0; - -webkit-transform: translateY( -50% ); - -ms-transform: translateY(-50%); - transform: translateY( -50% ); - font-size: 3em; - line-height: 1.3; - font-weight: 600; - color: #fff; - padding: 0; - margin: 0; - display: none; -} - -.wp-editor-wrap .uploader-editor.droppable { - background: rgba( 0, 86, 132, 0.9 ); -} - -.wp-editor-wrap .uploader-editor.droppable .uploader-editor-title { - display: block; -} - -/** - * IE7 Fixes - */ -.ie7 .media-frame .attachments-browser { - position: static; -} - -.ie7 .media-frame .embed-url input { - margin-top: 4px; - width: 90%; -} - -.ie7 .compat-item { - width: 99%; -} - -.ie7 .attachment-display-settings { - width: auto; -} - -.ie7 .attachment-preview, -.ie7 .attachment-preview .thumbnail { - width: 120px; - height: 120px; -} - -.ie7 .media-frame .attachment .describe { - width: 102px; -} - -.ie7 .media-sidebar .setting select { - max-width: 55%; -} - -.ie7 .media-sidebar .setting input[type="text"], -.ie7 .media-sidebar .setting input[type="password"], -.ie7 .media-sidebar .setting input[type="email"], -.ie7 .media-sidebar .setting input[type="number"], -.ie7 .media-sidebar .setting input[type="search"], -.ie7 .media-sidebar .setting input[type="tel"], -.ie7 .media-sidebar .setting input[type="url"], -.ie7 .media-sidebar .setting textarea { - width: 55%; -} - -.ie7 .media-sidebar .setting .link-to-custom { - float: right; -} - -/** - * Localization - */ -.rtl .media-modal, -.rtl .media-frame, -.rtl .media-frame .search, -.rtl .media-frame input[type="text"], -.rtl .media-frame input[type="password"], -.rtl .media-frame input[type="number"], -.rtl .media-frame input[type="search"], -.rtl .media-frame input[type="email"], -.rtl .media-frame input[type="url"], -.rtl .media-frame input[type="tel"], -.rtl .media-frame textarea, -.rtl .media-frame select { - font-family: Tahoma, sans-serif; -} - -:lang(he-il) .rtl .media-modal, -:lang(he-il) .rtl .media-frame, -:lang(he-il) .rtl .media-frame .search, -:lang(he-il) .rtl .media-frame input[type="text"], -:lang(he-il) .rtl .media-frame input[type="password"], -:lang(he-il) .rtl .media-frame input[type="number"], -:lang(he-il) .rtl .media-frame input[type="search"], -:lang(he-il) .rtl .media-frame input[type="email"], -:lang(he-il) .rtl .media-frame input[type="url"], -:lang(he-il) .rtl .media-frame textarea, -:lang(he-il) .rtl .media-frame select { - font-family: Arial, sans-serif; -} - -/** - * Responsive layout - */ -@media only screen and (max-width: 900px) { - - /* Drop-down menu */ - .media-frame:not(.hide-menu) .media-frame-title, - .media-frame:not(.hide-menu) .media-frame-router, - .media-frame:not(.hide-menu) .media-frame-content, - .media-frame:not(.hide-menu) .media-frame-toolbar { - right: 0; - } - - .media-frame:not(.hide-menu) .media-frame-menu { - position: static; - width: 0; - } - - .media-frame:not(.hide-menu) .media-menu { - width: auto; - max-width: 80%; - overflow: auto; - z-index: 2000; - top: 50px; - right: -300px; - left: auto; - bottom: auto; - padding: 5px 0; - border: 1px solid #ccc; - } - - .media-frame:not(.hide-menu) .media-menu.visible { - right: 0; - } - - .media-frame:not(.hide-menu) .media-menu > a { - padding: 12px 16px; - font-size: 16px; - } - - .media-frame:not(.hide-menu) .media-menu > a.active { - display: none; - } - - .media-frame:not(.hide-menu) .media-menu .separator { - margin: 5px 10px; - } - - .media-frame:not(.hide-menu) .media-frame-title { - right: 0; - } - - .media-frame:not(.hide-menu) .media-frame-title .dashicons { - display: inline-block; - line-height: 50px; - } - - .media-frame:not(.hide-menu) .media-frame-title h1 { - color: #0073aa; - line-height: 3; - font-size: 18px; - float: right; - cursor: pointer; - } - /* End drop-down menu */ - - .media-sidebar { - width: 230px; - } - - .attachments-browser .attachments, - .attachments-browser .uploader-inline, - .attachments-browser .media-toolbar { - left: 262px; - } - - .media-sidebar .setting, - .attachment-details .setting { - margin: 6px 0px; - } - - .media-sidebar .setting input, - .media-sidebar .setting textarea, - .media-sidebar .setting span, - .attachment-details .setting input, - .attachment-details .setting textarea, - .attachment-details .setting span, - .compat-item label span { - float: none; - } - - .media-sidebar .setting span, - .attachment-details .setting span, - .compat-item label span { - text-align: inherit; - min-height: 16px; - margin: 0; - padding: 8px 2px 0; - } - - .media-sidebar .setting .value, - .attachment-details .setting .value { - float: none; - width: auto; - } - - .media-sidebar .setting input[type="text"], - .media-sidebar .setting input[type="password"], - .media-sidebar .setting input[type="email"], - .media-sidebar .setting input[type="number"], - .media-sidebar .setting input[type="search"], - .media-sidebar .setting input[type="tel"], - .media-sidebar .setting input[type="url"], - .media-sidebar .setting textarea, - .media-sidebar .setting select, - .attachment-details .setting input[type="text"], - .attachment-details .setting input[type="password"], - .attachment-details .setting input[type="email"], - .attachment-details .setting input[type="number"], - .attachment-details .setting input[type="search"], - .attachment-details .setting input[type="tel"], - .attachment-details .setting input[type="url"], - .attachment-details .setting textarea, - .attachment-details .setting select { - float: none; - width: 98%; - max-width: none; - height: auto; - } - - .media-sidebar .setting select.columns, - .attachment-details .setting select.columns { - width: auto; - } - - .media-frame input, - .media-frame textarea, - .media-frame .search { - padding: 3px 6px; - } - - .image-details .column-image { - width: 30%; - right: 70%; - } - - .image-details .column-settings { - width: 70%; - } - - .image-details .media-modal { - right: 30px; - left: 30px; - } - - .image-details .embed-media-settings .setting { - margin: 20px; - } - - .image-details .embed-media-settings .setting span { - float: none; - text-align: right; - width: 100%; - margin-bottom: 4px; - } - - .image-details .embed-media-settings .setting input.link-to-custom, - .image-details .embed-media-settings .setting input[type="text"], - .image-details .embed-media-settings .setting textarea { - width: 100%; - margin-right: 0; - } - - .image-details .embed-media-settings .custom-size { - margin-right: 20px; - } - - .collection-settings .setting input[type="checkbox"] { - margin-top: 0; - } - - .media-selection { - min-width: 120px; - } - - .media-selection:after { - background: none; - } - - .media-selection .attachments { - display: none; - } - - .media-modal .attachments-browser .media-toolbar .search { - max-width: 100%; - height: auto; - float: left; - } - - .media-modal .attachments-browser .media-toolbar .attachment-filters { - height: auto; - } - - .media-modal .attachments-browser .media-toolbar .spinner { - margin: 14px 2px 0; - } - - /* Text inputs need to be 16px, or they force zooming on iOS */ - .media-frame input[type="text"], - .media-frame input[type="password"], - .media-frame input[type="number"], - .media-frame input[type="search"], - .media-frame input[type="email"], - .media-frame input[type="url"], - .media-frame textarea, - .media-frame select { - font-size: 16px; - } -} - -/* Responsive on portrait and landscape */ -@media only screen and (max-width: 640px), screen and (max-height: 400px) { - /* Full-bleed modal */ - .media-modal, - .image-details .media-modal { - position: fixed; - top: 0; - right: 0; - left: 0; - bottom: 0; - } - - .media-modal-backdrop { - position: fixed; - } - - .media-sidebar { - z-index: 1900; - max-width: 70%; - bottom: 120%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding-bottom: 0; - } - - .media-sidebar.visible { - bottom: 0; - } - - .attachments-browser .attachments, - .attachments-browser .uploader-inline, - .attachments-browser .media-toolbar { - left: 0; - } - - .image-details .media-frame-title { - display: block; - top: 0; - font-size: 14px; - } - - .image-details .column-image, - .image-details .column-settings { - width: 100%; - position: relative; - right: 0; - } - - .image-details .column-settings { - padding: 4px 0; - } - - /* Media tabs on the top */ - .media-frame-content .media-toolbar .instructions { - display: none; - } -} - -/* Landscape specific header override */ -@media screen and (max-height: 400px) { - .media-menu { - padding: 0; - } - - .media-frame-router { - top: 44px; - } - - .media-frame-content { - top: 78px; - } - - .attachments-browser .attachments { - top: 40px; - } - - /* Prevent unnecessary scrolling on title input */ - .embed-link-settings { - overflow: visible; - } -} - -@media only screen and (max-width: 480px) { - .media-modal-close { - top: -5px; - } - - .media-modal .media-frame-title { - height: 40px; - } - - .wp-core-ui.wp-customizer .media-button { - margin-top: 13px; - } - - .media-modal .media-frame-title h1, - .media-frame:not(.hide-menu) .media-frame-title h1 { - font-size: 18px; - line-height: 40px; - } - - .media-frame:not(.hide-menu) .media-frame-title .dashicons { - line-height: 40px; - } - - .media-frame-router, - .media-frame:not(.hide-menu) .media-menu { - top: 40px; - } - - .media-frame-content { - top: 74px; - } - - .media-frame.hide-router .media-frame-content { - top: 40px; - } -} - -/** - * HiDPI Displays - */ -@media print, - (-webkit-min-device-pixel-ratio: 1.25), - (min-resolution: 120dpi) { - - .wp-core-ui .media-modal-icon { - background-image: url(../images/uploader-icons-2x.png); - -webkit-background-size: 134px 15px; - background-size: 134px 15px; - } - - .media-frame .spinner { - background-image: url(../images/spinner-2x.gif); - } -} - -.media-frame-content[data-columns="1"] .attachment { - width: 100%; -} - -.media-frame-content[data-columns="2"] .attachment { - width: 50%; -} - -.media-frame-content[data-columns="3"] .attachment { - width: 33.33%; -} - -.media-frame-content[data-columns="4"] .attachment { - width: 25%; -} - -.media-frame-content[data-columns="5"] .attachment { - width: 20%; -} - -.media-frame-content[data-columns="6"] .attachment { - width: 16.66%; -} - -.media-frame-content[data-columns="7"] .attachment { - width: 14.28%; -} - -.media-frame-content[data-columns="8"] .attachment { - width: 12.5%; -} - -.media-frame-content[data-columns="9"] .attachment { - width: 11.11%; -} - -.media-frame-content[data-columns="10"] .attachment { - width: 10%; -} - -.media-frame-content[data-columns="11"] .attachment { - width: 9.09%; -} - -.media-frame-content[data-columns="12"] .attachment { - width: 8.33%; -} diff --git a/wp/wp-includes/css/media-views-rtl.min.css b/wp/wp-includes/css/media-views-rtl.min.css deleted file mode 100644 index 880b6723..00000000 --- a/wp/wp-includes/css/media-views-rtl.min.css +++ /dev/null @@ -1,8 +0,0 @@ -.media-menu,.media-router{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.media-modal *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.media-modal input,.media-modal select,.media-modal textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.media-frame,.media-modal{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:12px;-webkit-overflow-scrolling:touch}.media-modal label,.media-modal legend{font-size:13px}.media-frame input,.media-frame textarea{padding:6px 8px}.media-frame select,.wp-admin .media-frame select{line-height:28px;margin-top:3px}.media-frame a{border-bottom:none;color:#0073aa}.media-frame a:active,.media-frame a:hover{color:#00a0d2}.media-frame a:focus{-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:0;color:#124964}.media-frame a.button{color:#32373c}.media-frame a.button:hover{color:#23282d}.media-frame a.button-primary,.media-frame a.button-primary:hover{color:#fff}.media-frame input[type=text],.media-frame input[type=password],.media-frame input[type=number],.media-frame input[type=search],.media-frame input[type=email],.media-frame input[type=url],.media-frame select,.media-frame textarea{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:12px;border-width:1px;border-style:solid;border-color:#ddd}.media-frame input[type=text]:focus,.media-frame input[type=password]:focus,.media-frame input[type=number]:focus,.media-frame input[type=search]:focus,.media-frame input[type=email]:focus,.media-frame input[type=url]:focus,.media-frame select:focus,.media-frame textarea:focus{border-color:#5b9dd9}.media-frame select{height:24px;padding:2px}.media-frame input:disabled,.media-frame input[readonly],.media-frame textarea:disabled,.media-frame textarea[readonly]{background-color:#eee}.media-frame input[type=search]{-webkit-appearance:textfield}.media-frame ::-webkit-input-placeholder{color:#72777c}.media-frame ::-moz-placeholder{color:#72777c;opacity:1}.media-frame :-ms-input-placeholder{color:#72777c}.media-frame .hidden{display:none}/*! - * jQuery UI Draggable/Sortable 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */.ui-draggable-handle,.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.media-modal{position:fixed;top:30px;right:30px;left:30px;bottom:30px;z-index:160000}.wp-customizer .media-modal{z-index:560000}.media-modal-backdrop{position:fixed;top:0;right:0;left:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:159900}.wp-customizer .media-modal-backdrop{z-index:559900}.media-modal-close{position:absolute;top:0;left:0;width:50px;height:50px;margin:0;padding:0;border:1px solid transparent;background:0 0;color:#666;z-index:1000;cursor:pointer;outline:0;-webkit-transition:color .1s ease-in-out,background .1s ease-in-out;transition:color .1s ease-in-out,background .1s ease-in-out}.media-modal-close:active,.media-modal-close:hover{color:#00a0d2}.media-modal-close:focus{color:#00a0d2;border-color:#5b9dd9;-webkit-box-shadow:0 0 3px rgba(0,115,170,.8);box-shadow:0 0 3px rgba(0,115,170,.8)}.media-modal-close span.media-modal-icon{background-image:none}.media-modal-close .media-modal-icon:before{content:"\f158";font:400 20px/1 dashicons;speak:none;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.media-modal-content{position:absolute;top:0;right:0;left:0;bottom:0;overflow:auto;min-height:300px;-webkit-box-shadow:0 5px 15px rgba(0,0,0,.7);box-shadow:0 5px 15px rgba(0,0,0,.7);background:#fcfcfc;-webkit-font-smoothing:subpixel-antialiased}.media-modal-content .media-frame select.attachment-filters{margin-top:11px;margin-left:2%;width:42%;width:-webkit-calc(48% - 12px);width:calc(48% - 12px)}.media-modal-content .media-toolbar-primary .media-button{float:left}.media-modal-content .attachments-browser .search{width:100%}.wp-core-ui .media-modal-icon{background-image:url(../images/uploader-icons.png);background-repeat:no-repeat}.media-toolbar{position:absolute;top:0;right:0;left:0;z-index:100;height:60px;padding:0 16px;border:0 solid #ddd;overflow:hidden}.media-frame-toolbar .media-toolbar{top:initial;bottom:-45px;height:auto;overflow:initial;border-top:1px solid #ddd}.media-menu,.media-sidebar{top:0;background:#f3f3f3;left:0}@media screen and (max-width:782px){.media-frame-toolbar .media-toolbar{bottom:-48px}}.media-toolbar-primary{float:left;height:100%}.media-toolbar-secondary{float:right;height:100%}.media-toolbar-primary>.media-button,.media-toolbar-primary>.media-button-group{margin-right:10px;float:right;margin-top:15px}.media-toolbar-secondary>.media-button,.media-toolbar-secondary>.media-button-group{margin-left:10px;margin-top:15px}.media-sidebar{position:absolute;bottom:0;width:267px;padding:0 16px 24px;z-index:75;border-right:1px solid #ddd;overflow:auto;-webkit-overflow-scrolling:touch}.hide-toolbar .media-sidebar{bottom:0}.media-sidebar .sidebar-title{font-size:20px;margin:0;padding:12px 10px 10px;line-height:28px}.media-sidebar .sidebar-content{padding:0 10px;margin-bottom:130px}.media-sidebar .search{display:block;width:100%}.image-details h2,.image-details h3,.media-sidebar h2,.media-sidebar h3{position:relative;font-weight:600;text-transform:uppercase;font-size:12px;color:#666;margin:24px 0 8px}.attachment-details .setting,.media-sidebar .setting{display:block;float:right;width:100%;margin:1px 0}.attachment-details .setting label,.media-sidebar .setting label{display:block}.attachment-details .setting .link-to-custom,.media-sidebar .setting .link-to-custom{margin:3px 2px 0}.attachment-details .setting span,.media-sidebar .setting span{min-width:30%;margin-left:4%;font-size:12px;text-align:left;word-wrap:break-word}.media-sidebar .setting .name{max-width:80px}.attachment-details .setting select,.media-sidebar .setting select{max-width:65%}.attachment-details .field input[type=radio],.attachment-details .field input[type=checkbox],.attachment-details .setting input[type=radio],.attachment-details .setting input[type=checkbox],.media-sidebar .field input[type=radio],.media-sidebar .field input[type=checkbox],.media-sidebar .setting input[type=radio],.media-sidebar .setting input[type=checkbox]{float:none;margin:8px 3px 0;padding:0}.attachment-details .setting span,.compat-item label span,.media-sidebar .setting span{float:right;min-height:22px;padding-top:8px;line-height:16px;font-weight:400;color:#666}.media-menu>a,.media-router>a{line-height:18px;font-size:14px;text-decoration:none}.compat-item label span{text-align:left}.attachment-details .setting .value,.attachment-details .setting input[type=tel],.attachment-details .setting input[type=text],.attachment-details .setting input[type=password],.attachment-details .setting input[type=number],.attachment-details .setting input[type=search],.attachment-details .setting input[type=email],.attachment-details .setting input[type=url],.attachment-details .setting textarea,.media-sidebar .setting .value,.media-sidebar .setting input[type=tel],.media-sidebar .setting input[type=text],.media-sidebar .setting input[type=password],.media-sidebar .setting input[type=number],.media-sidebar .setting input[type=search],.media-sidebar .setting input[type=email],.media-sidebar .setting input[type=url],.media-sidebar .setting textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:1px;width:65%;float:left}.attachment-details .setting .value,.media-sidebar .setting .value{margin:0 1px;text-align:right}.attachment-details .setting textarea,.compat-item .field textarea,.media-sidebar .setting textarea{height:62px;resize:vertical}.attachment-details select,.media-sidebar select{margin-top:3px}.compat-item{float:right;width:100%;overflow:hidden}.compat-item table{width:100%;table-layout:fixed;border-spacing:0;border:0}.compat-item tr{padding:2px 0;display:block;overflow:hidden}.compat-item .field,.compat-item .label{display:block;margin:0;padding:0}.compat-item .label{min-width:30%;margin-left:4%;float:right;text-align:left}.compat-item .label span{display:block;width:100%}.compat-item .field{float:left;width:65%;margin:1px}.compat-item .field input[type=tel],.compat-item .field input[type=text],.compat-item .field input[type=password],.compat-item .field input[type=number],.compat-item .field input[type=search],.compat-item .field input[type=email],.compat-item .field input[type=url],.compat-item .field textarea{width:100%;margin:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.sidebar-for-errors .attachment-details,.sidebar-for-errors .compat-item,.sidebar-for-errors .media-sidebar .media-progress-bar,.sidebar-for-errors .upload-details{display:none!important}.media-menu{position:absolute;right:0;bottom:0;margin:0;padding:10px 0;border-left-width:1px;border-left-style:solid;border-left-color:#ccc;user-select:none}.media-menu>a{display:block;position:relative;padding:8px 20px;margin:0;color:#0073aa}.media-frame-title .dashicons,.media-frame.hide-router .media-frame-router{display:none}.media-menu>a:hover{color:#0073aa;background:rgba(0,0,0,.04)}.media-menu>a:active{outline:0}.media-menu .active,.media-menu .active:hover{color:#23282d;font-weight:600}.media-menu .separator{height:0;margin:12px 20px;padding:0;border-top:1px solid #ddd}.media-router{position:relative;padding:0 6px;margin:0;clear:both;user-select:none}.media-router a{-webkit-transition:none;transition:none}.media-router>a{position:relative;float:right;padding:8px 10px 9px;margin:0;height:18px}.media-frame,.media-frame-menu{position:absolute;right:0;bottom:0;top:0}.media-router>a:last-child{border-left:0}.media-router>a:active{outline:0}.media-router .active,.media-router .active:hover{color:#32373c}.media-router .active,.media-router>a.active:last-child{margin:-1px -1px 0;background:#fff;border:1px solid #ddd;border-bottom:none}.media-router .active:after{display:none}.media-frame{overflow:hidden;left:0}.media-frame-menu{width:200px;z-index:150}.media-frame-router,.media-frame-title{position:absolute;right:200px;left:0;z-index:200}.media-frame-title{top:0;height:50px}.media-frame-router{top:50px;height:36px}.media-frame-content,.media-frame-toolbar{right:200px;height:auto;position:absolute;left:0}.media-frame-content{top:84px;bottom:61px;width:auto;margin:0;overflow:auto;background:#fff;border-top:1px solid #ddd}.media-frame-toolbar{z-index:100;bottom:60px}.media-frame.hide-menu .media-frame-content,.media-frame.hide-menu .media-frame-router,.media-frame.hide-menu .media-frame-title,.media-frame.hide-menu .media-frame-toolbar{right:0}.media-frame.hide-menu .media-frame-menu{right:-200px}.media-frame.hide-toolbar .media-frame-content{bottom:0}.media-frame.hide-toolbar .media-frame-toolbar{bottom:-61px}.media-frame.hide-router .media-frame-content{top:50px}.media-frame.hide-router .media-frame-title{border-bottom:1px solid #ddd;-webkit-box-shadow:0 4px 4px -4px rgba(0,0,0,.1);box-shadow:0 4px 4px -4px rgba(0,0,0,.1)}.media-frame-title h1{padding:0 16px;font-size:22px;line-height:50px;margin:0}.media-frame-title .suggested-dimensions{font-size:14px;float:left;margin-left:20px}.media-frame-content .crop-content{height:100%}.wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon{margin-left:300px}.media-frame-content .crop-content .crop-image{display:block;margin:auto;max-width:100%;max-height:100%}.media-frame-content .crop-content .upload-errors{position:absolute;width:300px;top:50%;right:50%;margin-right:-150px;margin-left:-150px;z-index:600000}.media-frame .media-iframe{overflow:hidden}.media-frame .media-iframe,.media-frame .media-iframe iframe{height:100%;width:100%;border:0}.media-frame select.attachment-filters{margin-top:11px;margin-left:2%;max-width:42%;max-width:-webkit-calc(48% - 12px);max-width:calc(48% - 12px)}.media-toolbar-primary .search,.wp-core-ui .attachment .portrait img{max-width:100%}.media-frame select.attachment-filters:last-of-type{margin-left:0}.media-frame .search{margin-top:11px;padding:4px;font-size:13px;color:#444;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;-webkit-appearance:none}.wp-core-ui .attachments{margin:0;-webkit-overflow-scrolling:touch}.wp-core-ui .attachment{position:relative;float:right;padding:8px;margin:0;color:#444;cursor:pointer;list-style:none;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:25%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.wp-core-ui .attachment.details:focus,.wp-core-ui .attachment:focus,.wp-core-ui .selected.attachment:focus{-webkit-box-shadow:inset 0 0 2px 3px #fff,inset 0 0 0 7px #5b9dd9;box-shadow:inset 0 0 2px 3px #fff,inset 0 0 0 7px #5b9dd9;outline:0}.wp-core-ui .selected.attachment{-webkit-box-shadow:inset 0 0 0 5px #fff,inset 0 0 0 7px #ccc;box-shadow:inset 0 0 0 5px #fff,inset 0 0 0 7px #ccc}.wp-core-ui .attachment.details{-webkit-box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #0073aa;box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #0073aa}.wp-core-ui .attachment-preview{position:relative;-webkit-box-shadow:inset 0 0 15px rgba(0,0,0,.1),inset 0 0 0 1px rgba(0,0,0,.05);box-shadow:inset 0 0 15px rgba(0,0,0,.1),inset 0 0 0 1px rgba(0,0,0,.05);background:#eee;cursor:pointer}.wp-core-ui .attachment-preview:before{content:"";display:block;padding-top:100%}.wp-core-ui .attachment .icon{margin:0 auto;overflow:hidden}.wp-core-ui .attachment .thumbnail{overflow:hidden;position:absolute;top:0;left:0;bottom:0;right:0;opacity:1;-webkit-transition:opacity .1s;transition:opacity .1s}.wp-core-ui .attachment .landscape img{max-height:100%}.wp-core-ui .attachment .thumbnail:after{content:"";display:block;position:absolute;top:0;right:0;left:0;bottom:0;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);overflow:hidden}.wp-core-ui .attachment .thumbnail img{top:0;right:0}.wp-core-ui .attachment .thumbnail .centered{position:absolute;top:0;right:0;width:100%;height:100%;-webkit-transform:translate(-50%,50%);-ms-transform:translate(-50%,50%);transform:translate(-50%,50%)}.wp-core-ui .attachment .thumbnail .centered img{-webkit-transform:translate(50%,-50%);-ms-transform:translate(50%,-50%);transform:translate(50%,-50%)}.wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon{-webkit-transform:translate(50%,-70%);-ms-transform:translate(50%,-70%);transform:translate(50%,-70%)}.ie8 .wp-core-ui .attachment img.icon{top:20%;position:relative}.wp-core-ui .attachment .filename{position:absolute;right:0;left:0;bottom:0;overflow:hidden;max-height:100%;word-wrap:break-word;text-align:center;font-weight:600;background:rgba(255,255,255,.8);-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);box-shadow:inset 0 0 0 1px rgba(0,0,0,.15)}.wp-core-ui .attachment .filename div{padding:5px 10px}.wp-core-ui .attachment .thumbnail img{position:absolute}.wp-core-ui .attachment-close{display:block;position:absolute;top:5px;left:5px;height:22px;width:22px;padding:0;background-color:#fff;background-position:-96px 4px;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.3);box-shadow:0 0 0 1px rgba(0,0,0,.3)}.wp-core-ui .attachment-close:focus,.wp-core-ui .attachment-close:hover{background-position:-36px 4px}.wp-core-ui .attachment .check{display:none;height:24px;width:24px;padding:0;position:absolute;z-index:10;top:0;left:0;outline:0;background:#eee;-webkit-box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,0,0,.15);box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,0,0,.15)}.wp-core-ui .attachment .check .media-modal-icon{display:block;background-position:-1px 0;height:15px;width:15px;margin:5px}.wp-core-ui .attachment .check:hover .media-modal-icon{background-position:-40px 0}.wp-core-ui .attachment.selected .check{display:block}.wp-core-ui .attachment.details .check,.wp-core-ui .attachment.selected .check:focus,.wp-core-ui .media-frame.mode-grid .attachment.selected .check{background-color:#0073aa;-webkit-box-shadow:0 0 0 1px #fff,0 0 0 2px #0073aa;box-shadow:0 0 0 1px #fff,0 0 0 2px #0073aa}.wp-core-ui .attachment.details .check .media-modal-icon,.wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon{background-position:-21px 0}.wp-core-ui .attachment.details .check:hover .media-modal-icon,.wp-core-ui .attachment.selected .check:focus .media-modal-icon,.wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon{background-position:-60px 0}.wp-core-ui .media-frame .attachment .describe{position:relative;display:block;width:100%;margin:0;padding:8px;font-size:12px;-webkit-border-radius:0;border-radius:0}.media-frame .attachments-browser{position:relative;width:100%;height:100%;overflow:hidden}.attachments-browser .media-toolbar{left:300px;height:50px}.attachments-browser.hide-sidebar .media-toolbar{left:0}.attachments-browser .media-toolbar-primary>.media-button,.attachments-browser .media-toolbar-primary>.media-button-group,.attachments-browser .media-toolbar-secondary>.media-button,.attachments-browser .media-toolbar-secondary>.media-button-group{margin:11px 0}.attachments-browser .attachments{padding:2px 8px 8px}.attachments-browser .attachments,.attachments-browser .uploader-inline{position:absolute;top:50px;right:0;left:300px;bottom:0;overflow:auto;outline:0}.attachments-browser .uploader-inline.hidden{display:none}.attachments-browser .media-toolbar-primary{max-width:33%}.attachments-browser .media-toolbar-secondary{max-width:66%}.uploader-inline .close{background-color:transparent;border:0;cursor:pointer;height:48px;position:absolute;left:0;text-align:center;top:0;width:50px;z-index:1}.uploader-inline .close:before{font:400 30px/50px dashicons!important;color:#72777c;display:inline-block;content:"\f335";font-weight:300}.attachments-browser.hide-sidebar .attachments,.attachments-browser.hide-sidebar .uploader-inline{left:0;margin-left:0}.attachments-browser .instructions{display:inline-block;margin-top:16px;line-height:18px;font-size:13px;color:#666;margin-left:.5em}.attachments-browser .no-media{padding:2em 2em 0 0}.media-progress-bar{position:relative;height:10px;width:70%;margin:10px auto;-webkit-border-radius:10px;border-radius:10px;background:#ddd;background:rgba(0,0,0,.1)}.media-progress-bar div{height:10px;min-width:20px;width:0;background:#0073aa;-webkit-border-radius:10px;border-radius:10px;-webkit-transition:width .3s;transition:width .3s}.media-uploader-status .media-progress-bar{display:none;width:100%}.uploading.media-uploader-status .media-progress-bar{display:block}.attachment-preview .media-progress-bar{position:absolute;top:50%;right:15%;width:70%;margin:-5px 0 0}.media-uploader-status{position:relative;margin:0 auto;padding-bottom:10px;max-width:400px}.uploader-inline .media-uploader-status h2,.uploader-inline .media-uploader-status h3{display:none}.media-uploader-status .upload-details{display:none;font-size:12px;color:#666}.uploading.media-uploader-status .upload-details{display:block}.media-uploader-status .upload-detail-separator{padding:0 4px}.media-uploader-status .upload-count{color:#444}.media-uploader-status .upload-dismiss-errors,.media-uploader-status .upload-errors{display:none}.errors.media-uploader-status .upload-dismiss-errors,.errors.media-uploader-status .upload-errors{display:block}.media-uploader-status .upload-dismiss-errors{text-decoration:none}.media-sidebar .media-uploader-status .upload-dismiss-errors{position:absolute;top:0;left:0}.upload-errors .upload-error{padding:12px;margin-bottom:12px;background:#fff;border-right:4px solid #dc3232;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}.uploader-inline .upload-errors .upload-error{background-color:#fbeaea;-webkit-box-shadow:none;box-shadow:none}.upload-errors .upload-error-filename{font-weight:600}.upload-errors .upload-error-message{display:block;padding-top:8px;word-wrap:break-word}.uploader-window{position:fixed;top:0;right:0;left:0;bottom:0;background:rgba(0,86,132,.9);z-index:250000;display:none;text-align:center;opacity:0;-webkit-transition:opacity 250ms;transition:opacity 250ms}.uploader-window-content{position:absolute;top:10px;right:10px;left:10px;bottom:10px;border:1px dashed #fff}.uploader-window h1,.uploader-window h3{margin:-.5em 0 0;position:absolute;top:50%;right:0;left:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);font-size:40px;color:#fff;padding:0}.uploader-window .media-progress-bar{margin-top:20px;max-width:300px;background:0 0;border-color:#fff;display:none}.uploader-window .media-progress-bar div{background:#fff}.uploading .uploader-window .media-progress-bar{display:block}.media-frame .uploader-inline{margin-bottom:20px;padding:0;text-align:center}.uploader-inline-content{position:absolute;top:30%;right:0;left:0}.uploader-inline-content .upload-ui{margin:2em 0}.uploader-inline-content .post-upload-ui{margin-bottom:2em}.uploader-inline .has-upload-message .upload-ui{margin:0 0 4em}.uploader-inline h2,.uploader-inline h3{font-size:20px;line-height:28px;font-weight:400;margin:0}.uploader-inline .has-upload-message .upload-instructions{font-size:14px;color:#444;font-weight:400}.uploader-inline .drop-instructions{display:none}.supports-drag-drop .uploader-inline .drop-instructions{display:block}.uploader-inline p{font-size:12px;margin:.5em 0}.uploader-inline .media-progress-bar{display:none}.uploading.uploader-inline .media-progress-bar{display:block}.uploader-inline .browser{display:inline-block!important}.media-selection{position:absolute;top:0;right:0;left:350px;height:60px;padding:0 16px 0 0;overflow:hidden;white-space:nowrap}.media-selection .selection-info{display:inline-block;font-size:12px;height:60px;margin-left:10px;vertical-align:top}.media-selection.editing,.media-selection.empty,.media-selection.one .edit-selection{display:none}.media-selection .count{display:block;padding-top:12px;font-size:14px;line-height:20px;font-weight:600}.media-selection .attachments,.media-selection .selection-view{display:inline-block;vertical-align:top}.media-selection .button-link{float:right;padding:1px 8px;margin:1px -8px 1px 8px;line-height:16px;border-left:1px solid #ddd;color:#0073aa}.media-selection .button-link:focus,.media-selection .button-link:hover{color:#00a0d2}.media-selection .button-link:last-child{border-left:0;margin-left:0}.selection-info .clear-selection{color:#bc0b0b}.selection-info .clear-selection:focus,.selection-info .clear-selection:hover{color:red}.media-selection .attachments{height:48px;margin:6px;padding:0;overflow:hidden}.media-selection .attachment{width:40px;padding:0;margin:4px}.media-selection .attachment .thumbnail{top:0;left:0;bottom:0;right:0}.media-selection .attachment .icon{width:50%}.media-selection .attachment-preview{-webkit-box-shadow:none;box-shadow:none;background:0 0}.wp-core-ui .media-selection .attachment.details:focus,.wp-core-ui .media-selection .attachment:focus,.wp-core-ui .media-selection .selected.attachment:focus{-webkit-box-shadow:0 0 0 1px #fff,0 0 2px 3px #5b9dd9;box-shadow:0 0 0 1px #fff,0 0 2px 3px #5b9dd9}.wp-core-ui .media-selection .selected.attachment{-webkit-box-shadow:none;box-shadow:none}.wp-core-ui .media-selection .attachment.details{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 3px #0073aa;box-shadow:0 0 0 1px #fff,0 0 0 3px #0073aa}.media-selection:after{content:"";display:block;position:absolute;top:0;left:0;bottom:0;width:25px;background-image:-webkit-gradient(linear,left top,right top,from(rgba(255,255,255,1)),to(rgba(255,255,255,0)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,1),rgba(255,255,255,0));background-image:linear-gradient(to right,rgba(255,255,255,1),rgba(255,255,255,0))}.media-selection .attachment .filename{display:none}.media-frame .spinner{background:url(../images/spinner.gif) no-repeat;-webkit-background-size:20px 20px;background-size:20px 20px;float:left;display:inline-block;visibility:hidden;opacity:.7;filter:alpha(opacity=70);width:20px;height:20px;margin:0;vertical-align:middle}.attachment-details.save-waiting .settings-save-status .spinner,.media-frame .embed-loading .embed-url .spinner,.media-frame .spinner.is-active{visibility:visible}.media-toolbar .spinner{margin-top:14px}.attachment-details{position:relative;overflow:auto}.attachment-details .settings-save-status{float:left;text-transform:none;z-index:10}.attachment-details .settings-save-status .spinner{margin-right:5px}.attachment-details .settings-save-status .saved{float:left;display:none}.attachment-details.save-complete .settings-save-status .saved{display:block}.attachment-info{overflow:hidden;min-height:60px;margin-bottom:16px;line-height:18px;color:#666;border-bottom:1px solid #ddd;padding-bottom:11px}.attachment-info .filename{font-weight:600;color:#444;word-wrap:break-word}.attachment-info .thumbnail{position:relative;float:right;max-width:120px;max-height:120px;margin-top:5px;margin-left:10px;margin-bottom:5px}.uploading .attachment-info .thumbnail{width:120px;height:80px;-webkit-box-shadow:inset 0 0 15px rgba(0,0,0,.1);box-shadow:inset 0 0 15px rgba(0,0,0,.1)}.uploading .attachment-info .media-progress-bar{margin-top:35px}.attachment-info .thumbnail-image:after{content:"";display:block;position:absolute;top:0;right:0;left:0;bottom:0;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);overflow:hidden}.attachment-info .thumbnail img{display:block;max-width:120px;max-height:120px;margin:0 auto}.attachment-info .details{float:right;font-size:12px;max-width:100%}.attachment-info .delete-attachment,.attachment-info .edit-attachment,.attachment-info .trash-attachment,.attachment-info .untrash-attachment{display:block;text-decoration:none;white-space:nowrap}.attachment-details.needs-refresh .attachment-info .edit-attachment{display:none}.attachment-info .edit-attachment{display:block}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment{display:inline;padding:0;color:#bc0b0b}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover{color:red}.attachment-display-settings{width:100%;float:right;overflow:hidden}.attachment-display-settings h4{margin:1.4em 0 .4em}.collection-settings{overflow:hidden}.collection-settings .setting input[type=checkbox]{float:right;margin-left:8px}.collection-settings .setting span{min-width:inherit}.media-modal .imgedit-wrap{position:static}.media-modal .imgedit-wrap .imgedit-panel-content{padding:16px;position:absolute;top:0;left:282px;bottom:0;right:0;overflow:auto}.media-modal .imgedit-wrap .imgedit-settings{background:#f3f3f3;border-right:1px solid #ddd;padding:20px 16px 16px;position:absolute;top:0;left:0;bottom:0;width:250px;overflow:auto}.media-modal .imgedit-group{background:0 0;border:none;border-bottom:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none;margin:0 0 16px;padding:0 0 16px;position:relative}.media-modal .imgedit-group:last-of-type{border:none;margin:0;padding:0}.media-modal .imgedit-group-top{margin:0}.media-modal .imgedit-group-top h2,.media-modal .imgedit-group-top h2 .button-link,.media-modal .imgedit-group-top h3{display:inline-block;text-transform:uppercase;font-size:12px;color:#666;margin:3px 0 0}.embed-url,.imgedit-thumbnail-preview-caption{display:block}.media-modal .imgedit-group-top h2 .button-link,.media-modal .imgedit-group-top h2 a,.media-modal .imgedit-group-top h3 a{text-decoration:none;color:#666}.wp-core-ui.media-modal .image-editor .imgedit-help-toggle,.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:active,.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:hover{border:1px solid transparent;margin:0;padding:0;background:0 0;color:#0074a2;font-size:20px;line-height:1;cursor:pointer;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-box-shadow:none;box-shadow:none}.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:focus{color:#0074a2;border-color:#5b9dd9;outline:0;-webkit-box-shadow:0 0 3px rgba(0,115,170,.8);box-shadow:0 0 3px rgba(0,115,170,.8)}.wp-core-ui.media-modal .imgedit-group-top .dashicons-arrow-down.imgedit-help-toggle{margin-top:-3px}.wp-core-ui.media-modal .image-editor h3 .imgedit-help-toggle{margin-top:-2px}.media-modal .imgedit-help-toggled span.dashicons:before{content:"\f142"}.media-modal .imgedit-thumbnail-preview{margin:10px 0 0 8px}.media-modal .imgedit-wrap div.updated{margin:0 0 16px}.embed-url{position:relative;padding:16px;margin:0;z-index:250;background:#fff;font-size:18px}.media-frame .embed-url input{font-size:18px;padding:12px 14px;width:100%;min-width:200px;-webkit-box-shadow:inset -2px 2px 4px -2px rgba(0,0,0,.1);box-shadow:inset -2px 2px 4px -2px rgba(0,0,0,.1)}.media-frame .embed-url .spinner{position:absolute;top:32px;left:26px}.embed-link-settings,.embed-media-settings{position:absolute;top:70px;right:0;left:0;bottom:0;padding:16px 16px 32px;overflow:auto}.media-embed .embed-link-settings{overflow:visible}.embed-preview embed,.embed-preview iframe,.embed-preview img,.mejs-container video{max-width:100%;vertical-align:middle}.embed-preview a{display:inline-block}.embed-preview img{display:block;height:auto}.mejs-container:focus{outline:#5b9dd9 solid 1px;-webkit-box-shadow:0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 2px 1px rgba(30,140,190,.8)}.image-details .media-modal{right:140px;left:140px}.image-details .media-frame-content,.image-details .media-frame-router,.image-details .media-frame-title{right:0}.image-details .embed-media-settings{top:0;overflow:visible;padding:0}.image-details .embed-media-settings,.image-details .embed-media-settings div{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.image-details .column-settings{background:#f3f3f3;border-left:1px solid #ddd;min-height:100%;width:55%;position:absolute;top:0;right:0}.image-details .column-settings h2,.image-details .column-settings h3{margin:20px;padding-top:20px;border-top:1px solid #ddd;color:#23282d}.image-details .column-image{width:45%;position:absolute;right:55%;top:0}.image-details .image{margin:20px}.image-details .image img{max-width:100%;max-height:500px}.image-details .advanced-toggle{padding:0;color:#666;text-transform:uppercase}.image-details .advanced-toggle:after{font:400 20px/1 dashicons;speak:none;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f140";display:inline-block;margin-top:-2px}.image-details .advanced-visible .advanced-toggle:after{content:"\f142"}.image-details .embed-media-settings .size{margin-bottom:4px}.image-details .custom-size span{display:block}.image-details .custom-size label{display:block;float:right}.image-details .custom-size span small{color:#555d66;font-size:inherit}.image-details .custom-size input{width:5em}.image-details .custom-size .sep{float:right;margin:26px 6px 0}.image-details .custom-size:after{content:"";display:table;clear:both}.media-embed .thumbnail{max-width:100%;max-height:200px;position:relative;float:right}.media-embed .thumbnail img{max-height:200px;display:block}.media-embed .thumbnail:after{content:"";display:block;position:absolute;top:0;right:0;left:0;bottom:0;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);overflow:hidden}.media-embed .setting{width:100%;margin:10px 0;float:right;display:block;clear:both}.image-details .embed-media-settings .setting{float:none;width:auto}.image-details .actions{margin:10px 0}.image-details .hidden{display:none}.media-embed .setting input[type=text],.media-embed .setting textarea{display:block;width:100%;max-width:400px;margin:1px 0}.image-details .embed-media-settings .setting input[type=text],.image-details .embed-media-settings .setting textarea{max-width:inherit;width:70%}.image-details .embed-media-settings .custom-size,.image-details .embed-media-settings .link-target,.image-details .embed-media-settings .setting input.link-to-custom{margin-right:27%;width:70%}.image-details .embed-media-settings .link-target{margin-top:24px}.media-embed .setting input.hidden,.media-embed .setting textarea.hidden{display:none}.media-embed .setting span{display:block;width:200px;font-size:13px;line-height:24px;color:#666}.image-details .embed-media-settings .setting span{float:right;width:25%;text-align:left;margin:8px 1% 0;line-height:1.1}.media-embed .setting .button-group{margin:2px 0}.media-embed-sidebar{position:absolute;top:0;right:440px}.advanced-section,.link-settings{margin-top:10px}.wp-editor-wrap .uploader-editor{background:rgba(150,150,150,.9);position:absolute;top:0;right:0;width:100%;height:100%;z-index:99998;display:none;text-align:center}.wp-editor-wrap .uploader-editor-content{border:1px dashed #fff;position:absolute;top:10px;right:10px;left:10px;bottom:10px}.wp-editor-wrap .uploader-editor .uploader-editor-title{position:absolute;top:50%;right:0;left:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);font-size:3em;line-height:1.3;font-weight:600;color:#fff;padding:0;margin:0;display:none}.wp-editor-wrap .uploader-editor.droppable{background:rgba(0,86,132,.9)}.wp-editor-wrap .uploader-editor.droppable .uploader-editor-title{display:block}.ie7 .media-frame .attachments-browser{position:static}.ie7 .media-frame .embed-url input{margin-top:4px;width:90%}.ie7 .compat-item{width:99%}.ie7 .attachment-display-settings{width:auto}.ie7 .attachment-preview,.ie7 .attachment-preview .thumbnail{width:120px;height:120px}.ie7 .media-frame .attachment .describe{width:102px}.ie7 .media-sidebar .setting select{max-width:55%}.ie7 .media-sidebar .setting input[type=tel],.ie7 .media-sidebar .setting input[type=text],.ie7 .media-sidebar .setting input[type=password],.ie7 .media-sidebar .setting input[type=number],.ie7 .media-sidebar .setting input[type=search],.ie7 .media-sidebar .setting input[type=email],.ie7 .media-sidebar .setting input[type=url],.ie7 .media-sidebar .setting textarea{width:55%}.ie7 .media-sidebar .setting .link-to-custom{float:right}.rtl .media-frame,.rtl .media-frame .search,.rtl .media-frame input[type=tel],.rtl .media-frame input[type=text],.rtl .media-frame input[type=password],.rtl .media-frame input[type=number],.rtl .media-frame input[type=search],.rtl .media-frame input[type=email],.rtl .media-frame input[type=url],.rtl .media-frame select,.rtl .media-frame textarea,.rtl .media-modal{font-family:Tahoma,sans-serif}:lang(he-il) .rtl .media-frame,:lang(he-il) .rtl .media-frame .search,:lang(he-il) .rtl .media-frame input[type=text],:lang(he-il) .rtl .media-frame input[type=password],:lang(he-il) .rtl .media-frame input[type=number],:lang(he-il) .rtl .media-frame input[type=search],:lang(he-il) .rtl .media-frame input[type=email],:lang(he-il) .rtl .media-frame input[type=url],:lang(he-il) .rtl .media-frame select,:lang(he-il) .rtl .media-frame textarea,:lang(he-il) .rtl .media-modal{font-family:Arial,sans-serif}@media only screen and (max-width:900px){.media-frame:not(.hide-menu) .media-frame-content,.media-frame:not(.hide-menu) .media-frame-router,.media-frame:not(.hide-menu) .media-frame-title,.media-frame:not(.hide-menu) .media-frame-toolbar{right:0}.media-frame:not(.hide-menu) .media-frame-menu{position:static;width:0}.media-frame:not(.hide-menu) .media-menu{width:auto;max-width:80%;overflow:auto;z-index:2000;top:50px;right:-300px;left:auto;bottom:auto;padding:5px 0;border:1px solid #ccc}.media-frame:not(.hide-menu) .media-menu.visible{right:0}.media-frame:not(.hide-menu) .media-menu>a{padding:12px 16px;font-size:16px}.media-frame:not(.hide-menu) .media-menu>a.active{display:none}.media-frame:not(.hide-menu) .media-menu .separator{margin:5px 10px}.media-frame:not(.hide-menu) .media-frame-title{right:0}.media-frame:not(.hide-menu) .media-frame-title .dashicons{display:inline-block;line-height:50px}.media-frame:not(.hide-menu) .media-frame-title h1{color:#0073aa;line-height:3;font-size:18px;float:right;cursor:pointer}.media-sidebar{width:230px}.attachments-browser .attachments,.attachments-browser .media-toolbar,.attachments-browser .uploader-inline{left:262px}.attachment-details .setting,.media-sidebar .setting{margin:6px 0}.attachment-details .setting input,.attachment-details .setting span,.attachment-details .setting textarea,.compat-item label span,.media-sidebar .setting input,.media-sidebar .setting span,.media-sidebar .setting textarea{float:none}.attachment-details .setting span,.compat-item label span,.media-sidebar .setting span{text-align:inherit;min-height:16px;margin:0;padding:8px 2px 0}.attachment-details .setting .value,.media-sidebar .setting .value{float:none;width:auto}.attachment-details .setting input[type=tel],.attachment-details .setting input[type=text],.attachment-details .setting input[type=password],.attachment-details .setting input[type=number],.attachment-details .setting input[type=search],.attachment-details .setting input[type=email],.attachment-details .setting input[type=url],.attachment-details .setting select,.attachment-details .setting textarea,.media-sidebar .setting input[type=tel],.media-sidebar .setting input[type=text],.media-sidebar .setting input[type=password],.media-sidebar .setting input[type=number],.media-sidebar .setting input[type=search],.media-sidebar .setting input[type=email],.media-sidebar .setting input[type=url],.media-sidebar .setting select,.media-sidebar .setting textarea{float:none;width:98%;max-width:none;height:auto}.attachment-details .setting select.columns,.media-sidebar .setting select.columns{width:auto}.media-frame .search,.media-frame input,.media-frame textarea{padding:3px 6px}.image-details .column-image{width:30%;right:70%}.image-details .column-settings{width:70%}.image-details .media-modal{right:30px;left:30px}.image-details .embed-media-settings .setting{margin:20px}.image-details .embed-media-settings .setting span{float:none;text-align:right;width:100%;margin-bottom:4px}.image-details .embed-media-settings .setting input.link-to-custom,.image-details .embed-media-settings .setting input[type=text],.image-details .embed-media-settings .setting textarea{width:100%;margin-right:0}.image-details .embed-media-settings .custom-size{margin-right:20px}.collection-settings .setting input[type=checkbox]{margin-top:0}.media-selection{min-width:120px}.media-selection:after{background:0 0}.media-selection .attachments{display:none}.media-modal .attachments-browser .media-toolbar .search{max-width:100%;height:auto;float:left}.media-modal .attachments-browser .media-toolbar .attachment-filters{height:auto}.media-modal .attachments-browser .media-toolbar .spinner{margin:14px 2px 0}.media-frame input[type=text],.media-frame input[type=password],.media-frame input[type=number],.media-frame input[type=search],.media-frame input[type=email],.media-frame input[type=url],.media-frame select,.media-frame textarea{font-size:16px}}@media only screen and (max-width:640px),screen and (max-height:400px){.image-details .media-modal,.media-modal{position:fixed;top:0;right:0;left:0;bottom:0}.media-modal-backdrop{position:fixed}.media-sidebar{z-index:1900;max-width:70%;bottom:120%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding-bottom:0}.media-sidebar.visible{bottom:0}.attachments-browser .attachments,.attachments-browser .media-toolbar,.attachments-browser .uploader-inline{left:0}.image-details .media-frame-title{display:block;top:0;font-size:14px}.image-details .column-image,.image-details .column-settings{width:100%;position:relative;right:0}.image-details .column-settings{padding:4px 0}.media-frame-content .media-toolbar .instructions{display:none}}@media screen and (max-height:400px){.media-menu{padding:0}.media-frame-router{top:44px}.media-frame-content{top:78px}.attachments-browser .attachments{top:40px}.embed-link-settings{overflow:visible}}@media only screen and (max-width:480px){.media-modal-close{top:-5px}.media-modal .media-frame-title{height:40px}.wp-core-ui.wp-customizer .media-button{margin-top:13px}.media-frame:not(.hide-menu) .media-frame-title h1,.media-modal .media-frame-title h1{font-size:18px;line-height:40px}.media-frame:not(.hide-menu) .media-frame-title .dashicons{line-height:40px}.media-frame-router,.media-frame:not(.hide-menu) .media-menu{top:40px}.media-frame-content{top:74px}.media-frame.hide-router .media-frame-content{top:40px}}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.wp-core-ui .media-modal-icon{background-image:url(../images/uploader-icons-2x.png);-webkit-background-size:134px 15px;background-size:134px 15px}.media-frame .spinner{background-image:url(../images/spinner-2x.gif)}}.media-frame-content[data-columns="1"] .attachment{width:100%}.media-frame-content[data-columns="2"] .attachment{width:50%}.media-frame-content[data-columns="3"] .attachment{width:33.33%}.media-frame-content[data-columns="4"] .attachment{width:25%}.media-frame-content[data-columns="5"] .attachment{width:20%}.media-frame-content[data-columns="6"] .attachment{width:16.66%}.media-frame-content[data-columns="7"] .attachment{width:14.28%}.media-frame-content[data-columns="8"] .attachment{width:12.5%}.media-frame-content[data-columns="9"] .attachment{width:11.11%}.media-frame-content[data-columns="10"] .attachment{width:10%}.media-frame-content[data-columns="11"] .attachment{width:9.09%}.media-frame-content[data-columns="12"] .attachment{width:8.33%} \ No newline at end of file diff --git a/wp/wp-includes/css/media-views.css b/wp/wp-includes/css/media-views.css deleted file mode 100644 index 4c5808af..00000000 --- a/wp/wp-includes/css/media-views.css +++ /dev/null @@ -1,2687 +0,0 @@ -/** - * Base Styles - */ -.media-modal * { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -.media-modal input, -.media-modal select, -.media-modal textarea { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.media-modal, -.media-frame { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - font-size: 12px; - -webkit-overflow-scrolling: touch; -} - -.media-modal legend, -.media-modal label { - font-size: 13px; -} - -.media-frame input, -.media-frame textarea { - padding: 6px 8px; -} - -.media-frame select, -.wp-admin .media-frame select { - line-height: 28px; - margin-top: 3px; -} - -.media-frame a { - border-bottom: none; - color: #0073aa; -} - -.media-frame a:hover, -.media-frame a:active { - color: #00a0d2; -} - -.media-frame a:focus { - -webkit-box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - outline: none; - color: #124964; -} - -.media-frame a.button { - color: #32373c; -} - -.media-frame a.button:hover { - color: #23282d; -} - -.media-frame a.button-primary, -.media-frame a.button-primary:hover { - color: #fff; -} - -.media-frame input[type="text"], -.media-frame input[type="password"], -.media-frame input[type="number"], -.media-frame input[type="search"], -.media-frame input[type="email"], -.media-frame input[type="url"], -.media-frame textarea, -.media-frame select { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - font-size: 12px; - border-width: 1px; - border-style: solid; - border-color: #ddd; -} - -.media-frame input[type="text"]:focus, -.media-frame input[type="password"]:focus, -.media-frame input[type="number"]:focus, -.media-frame input[type="search"]:focus, -.media-frame input[type="email"]:focus, -.media-frame input[type="url"]:focus, -.media-frame textarea:focus, -.media-frame select:focus { - border-color: #5b9dd9; -} - -.media-frame select { - height: 24px; - padding: 2px; -} - -.media-frame input:disabled, -.media-frame textarea:disabled, -.media-frame input[readonly], -.media-frame textarea[readonly] { - background-color: #eee; -} - -.media-frame input[type="search"] { - -webkit-appearance: textfield; -} - -.media-frame ::-webkit-input-placeholder { - color: #72777c; -} - -.media-frame ::-moz-placeholder { - color: #72777c; - opacity: 1; -} - -.media-frame :-ms-input-placeholder { - color: #72777c; -} - -.media-frame .hidden { - display: none; -} - -/*! - * jQuery UI Draggable/Sortable 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */ -.ui-draggable-handle, -.ui-sortable-handle { - -ms-touch-action: none; - touch-action: none; -} - -/** - * Modal - */ -.media-modal { - position: fixed; - top: 30px; - left: 30px; - right: 30px; - bottom: 30px; - z-index: 160000; -} - -.wp-customizer .media-modal { - z-index: 560000; -} - -.media-modal-backdrop { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - min-height: 360px; - background: #000; - opacity: 0.7; - z-index: 159900; -} - -.wp-customizer .media-modal-backdrop { - z-index: 559900; -} - -.media-modal-close { - position: absolute; - top: 0; - right: 0; - width: 50px; - height: 50px; - margin: 0; - padding: 0; - border: 1px solid transparent; - background: none; - color: #666; - z-index: 1000; - cursor: pointer; - outline: none; - -webkit-transition: color .1s ease-in-out, background .1s ease-in-out; - transition: color .1s ease-in-out, background .1s ease-in-out; -} - -.media-modal-close:hover, -.media-modal-close:active { - color: #00a0d2; -} - -.media-modal-close:focus { - color: #00a0d2; - border-color: #5b9dd9; - -webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); - box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); -} - -.media-modal-close span.media-modal-icon { - background-image: none; -} - -.media-modal-close .media-modal-icon:before { - content: "\f158"; - font: normal 20px/1 dashicons; - speak: none; - vertical-align: middle; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.media-modal-content { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - overflow: auto; - min-height: 300px; - -webkit-box-shadow: 0 5px 15px rgba(0,0,0,0.7); - box-shadow: 0 5px 15px rgba(0,0,0,0.7); - background: #fcfcfc; - -webkit-font-smoothing: subpixel-antialiased; -} - -.media-modal-content .media-frame select.attachment-filters { - margin-top: 11px; - margin-right: 2%; - width: 42%; - width: -webkit-calc(48% - 12px); - width: calc(48% - 12px); -} - -.media-modal-content .media-toolbar-primary .media-button { - float: right; -} - -.media-modal-content .attachments-browser .search { - width: 100%; -} - -/* higher specificity */ -.wp-core-ui .media-modal-icon { - background-image: url(../images/uploader-icons.png); - background-repeat: no-repeat; -} - -/** - * Toolbar - */ -.media-toolbar { - position: absolute; - top: 0; - left: 0; - right: 0; - z-index: 100; - height: 60px; - padding: 0 16px; - border: 0 solid #ddd; - overflow: hidden; -} - -.media-frame-toolbar .media-toolbar { - top: initial; - bottom: -45px; - height: auto; - overflow: initial; - border-top: 1px solid #ddd; -} - -@media screen and (max-width: 782px) { - .media-frame-toolbar .media-toolbar { - bottom: -48px; - } -} - -.media-toolbar-primary { - float: right; - height: 100%; -} - -.media-toolbar-secondary { - float: left; - height: 100%; -} - -.media-toolbar-primary > .media-button, -.media-toolbar-primary > .media-button-group { - margin-left: 10px; - float: left; - margin-top: 15px; -} - -.media-toolbar-secondary > .media-button, -.media-toolbar-secondary > .media-button-group { - margin-right: 10px; - margin-top: 15px; -} - -/** - * Sidebar - */ -.media-sidebar { - position: absolute; - top: 0; - right: 0; - bottom: 0; - width: 267px; - padding: 0 16px 24px; - z-index: 75; - background: #f3f3f3; - border-left: 1px solid #ddd; - overflow: auto; - -webkit-overflow-scrolling: touch; -} - -.hide-toolbar .media-sidebar { - bottom: 0; -} - -.media-sidebar .sidebar-title { - font-size: 20px; - margin: 0; - padding: 12px 10px 10px; - line-height: 28px; -} - -.media-sidebar .sidebar-content { - padding: 0 10px; - margin-bottom: 130px; -} - -.media-sidebar .search { - display: block; - width: 100%; -} - -.media-sidebar h3, /* Back-compat for pre-4.4 */ -.image-details h3, /* Back-compat for pre-4.4 */ -.media-sidebar h2, -.image-details h2 { - position: relative; - font-weight: 600; - text-transform: uppercase; - font-size: 12px; - color: #666; - margin: 24px 0 8px; -} - -.media-sidebar .setting, -.attachment-details .setting { - display: block; - float: left; - width: 100%; - margin: 1px 0; -} - -.media-sidebar .setting label, -.attachment-details .setting label { - display: block; -} - -.media-sidebar .setting .link-to-custom, -.attachment-details .setting .link-to-custom { - margin: 3px 2px 0; -} - -.media-sidebar .setting span, -.attachment-details .setting span { - min-width: 30%; - margin-right: 4%; - font-size: 12px; - text-align: right; - word-wrap: break-word; -} - -.media-sidebar .setting .name { - max-width: 80px; -} - -.media-sidebar .setting select, -.attachment-details .setting select { - max-width: 65%; -} - -.media-sidebar .setting input[type="checkbox"], -.media-sidebar .field input[type="checkbox"], -.media-sidebar .setting input[type="radio"], -.media-sidebar .field input[type="radio"], -.attachment-details .setting input[type="checkbox"], -.attachment-details .field input[type="checkbox"], -.attachment-details .setting input[type="radio"], -.attachment-details .field input[type="radio"] { - float: none; - margin: 8px 3px 0; - padding: 0; -} - -.media-sidebar .setting span, -.attachment-details .setting span, -.compat-item label span { - float: left; - min-height: 22px; - padding-top: 8px; - line-height: 16px; - font-weight: 400; - color: #666; -} - -.compat-item label span { - text-align: right; -} - -.media-sidebar .setting input[type="text"], -.media-sidebar .setting input[type="password"], -.media-sidebar .setting input[type="email"], -.media-sidebar .setting input[type="number"], -.media-sidebar .setting input[type="search"], -.media-sidebar .setting input[type="tel"], -.media-sidebar .setting input[type="url"], -.media-sidebar .setting textarea, -.media-sidebar .setting .value, -.attachment-details .setting input[type="text"], -.attachment-details .setting input[type="password"], -.attachment-details .setting input[type="email"], -.attachment-details .setting input[type="number"], -.attachment-details .setting input[type="search"], -.attachment-details .setting input[type="tel"], -.attachment-details .setting input[type="url"], -.attachment-details .setting textarea, -.attachment-details .setting .value { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin: 1px; - width: 65%; - float: right; -} - -.media-sidebar .setting .value, -.attachment-details .setting .value { - margin: 0 1px; - text-align: left; -} - -.media-sidebar .setting textarea, -.attachment-details .setting textarea, -.compat-item .field textarea { - height: 62px; - resize: vertical; -} - -.media-sidebar select, -.attachment-details select { - margin-top: 3px; -} - -.compat-item { - float: left; - width: 100%; - overflow: hidden; -} - -.compat-item table { - width: 100%; - table-layout: fixed; - border-spacing: 0; - border: 0; -} - -.compat-item tr { - padding: 2px 0; - display: block; - overflow: hidden; -} - -.compat-item .label, -.compat-item .field { - display: block; - margin: 0; - padding: 0; -} - -.compat-item .label { - min-width: 30%; - margin-right: 4%; - float: left; - text-align: right; -} - -.compat-item .label span { - display: block; - width: 100%; -} - -.compat-item .field { - float: right; - width: 65%; - margin: 1px; -} - -.compat-item .field input[type="text"], -.compat-item .field input[type="password"], -.compat-item .field input[type="email"], -.compat-item .field input[type="number"], -.compat-item .field input[type="search"], -.compat-item .field input[type="tel"], -.compat-item .field input[type="url"], -.compat-item .field textarea { - width: 100%; - margin: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.sidebar-for-errors .attachment-details, -.sidebar-for-errors .compat-item, -.sidebar-for-errors .media-sidebar .media-progress-bar, -.sidebar-for-errors .upload-details { - display: none !important; -} - -/** - * Menu - */ -.media-menu { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - margin: 0; - padding: 10px 0; - background: #f3f3f3; - border-right-width: 1px; - border-right-style: solid; - border-right-color: #ccc; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.media-menu > a { - display: block; - position: relative; - padding: 8px 20px; - margin: 0; - line-height: 18px; - font-size: 14px; - color: #0073aa; - text-decoration: none; -} - -.media-menu > a:hover { - color: #0073aa; - background: rgba( 0, 0, 0, 0.04 ); -} - -.media-menu > a:active { - outline: none; -} - -.media-menu .active, -.media-menu .active:hover { - color: #23282d; - font-weight: 600; -} - -.media-menu .separator { - height: 0; - margin: 12px 20px; - padding: 0; - border-top: 1px solid #ddd; -} - -/** - * Menu - */ -.media-router { - position: relative; - padding: 0 6px; - margin: 0; - clear: both; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.media-router a { - -webkit-transition: none; - transition: none; -} - -.media-router > a { - position: relative; - float: left; - padding: 8px 10px 9px; - margin: 0; - height: 18px; - line-height: 18px; - font-size: 14px; - text-decoration: none; -} - -.media-router > a:last-child { - border-right: 0; -} - -.media-router > a:active { - outline: none; -} - -.media-router .active, -.media-router .active:hover { - color: #32373c; -} - -.media-router .active, -.media-router > a.active:last-child { - margin: -1px -1px 0; - background: #fff; - border: 1px solid #ddd; - border-bottom: none; -} - -.media-router .active:after { - display: none; -} - -/** - * Frame - */ -.media-frame { - overflow: hidden; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; -} - -.media-frame-menu { - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: 200px; - z-index: 150; -} - -.media-frame-title { - position: absolute; - top: 0; - left: 200px; - right: 0; - height: 50px; - z-index: 200; -} - -.media-frame-router { - position: absolute; - top: 50px; - left: 200px; - right: 0; - height: 36px; - z-index: 200; -} - -.media-frame-content { - position: absolute; - top: 84px; - left: 200px; - right: 0; - bottom: 61px; - height: auto; - width: auto; - margin: 0; - overflow: auto; - background: #fff; - border-top: 1px solid #ddd; -} - -.media-frame-toolbar { - position: absolute; - left: 200px; - right: 0; - bottom: 0; - height: 60px; - z-index: 100; - bottom: 60px; - height: auto; -} - -.media-frame.hide-menu .media-frame-title, -.media-frame.hide-menu .media-frame-router, -.media-frame.hide-menu .media-frame-toolbar, -.media-frame.hide-menu .media-frame-content { - left: 0; -} - -.media-frame.hide-menu .media-frame-menu { - left: -200px; -} - -.media-frame.hide-toolbar .media-frame-content { - bottom: 0; -} - -.media-frame.hide-toolbar .media-frame-toolbar { - bottom: -61px; -} - -.media-frame.hide-router .media-frame-content { - top: 50px; -} - -.media-frame.hide-router .media-frame-router { - display: none; -} - -.media-frame.hide-router .media-frame-title { - border-bottom: 1px solid #ddd; - -webkit-box-shadow: 0 4px 4px -4px rgba( 0, 0, 0, 0.1 ); - box-shadow: 0 4px 4px -4px rgba( 0, 0, 0, 0.1 ); -} - -.media-frame-title .dashicons { - display: none; -} - -.media-frame-title h1 { - padding: 0 16px; - font-size: 22px; - line-height: 50px; - margin: 0; -} - -.media-frame-title .suggested-dimensions { - font-size: 14px; - float: right; - margin-right: 20px; -} - -.media-frame-content .crop-content { - height: 100%; -} - -.wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon { - margin-right: 300px; -} - -.media-frame-content .crop-content .crop-image { - display: block; - margin: auto; - max-width: 100%; - max-height: 100%; -} - -.media-frame-content .crop-content .upload-errors -{ - position: absolute; - width: 300px; - top: 50%; - left: 50%; - margin-left: -150px; - margin-right: -150px; - z-index: 600000; -} - -/** - * Iframes - */ -.media-frame .media-iframe { - overflow: hidden; -} - -.media-frame .media-iframe, -.media-frame .media-iframe iframe { - height: 100%; - width: 100%; - border: 0; -} - -/** - * Attachment Browser Filters - */ -.media-frame select.attachment-filters { - margin-top: 11px; - margin-right: 2%; - max-width: 42%; - max-width: -webkit-calc(48% - 12px); - max-width: calc(48% - 12px); -} - -.media-frame select.attachment-filters:last-of-type { - margin-right: 0; -} - -/** - * Search - */ -.media-frame .search { - margin-top: 11px; - padding: 4px; - font-size: 13px; - color: #444; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - -webkit-appearance: none; -} - -.media-toolbar-primary .search { - max-width: 100%; -} - -/** - * Attachments - */ -.wp-core-ui .attachments { - margin: 0; - -webkit-overflow-scrolling: touch; -} - -/** - * Attachment - */ -.wp-core-ui .attachment { - position: relative; - float: left; - padding: 8px; - margin: 0; - color: #444; - cursor: pointer; - list-style: none; - text-align: center; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - width: 25%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.wp-core-ui .attachment:focus, -.wp-core-ui .selected.attachment:focus, -.wp-core-ui .attachment.details:focus { - -webkit-box-shadow: - inset 0 0 2px 3px #fff, - inset 0 0 0 7px #5b9dd9; - box-shadow: - inset 0 0 2px 3px #fff, - inset 0 0 0 7px #5b9dd9; - outline: none; -} - -.wp-core-ui .selected.attachment { - -webkit-box-shadow: - inset 0 0 0 5px #fff, - inset 0 0 0 7px #ccc; - box-shadow: - inset 0 0 0 5px #fff, - inset 0 0 0 7px #ccc; -} - -.wp-core-ui .attachment.details { - -webkit-box-shadow: - inset 0 0 0 3px #fff, - inset 0 0 0 7px #0073aa; - box-shadow: - inset 0 0 0 3px #fff, - inset 0 0 0 7px #0073aa; -} - -.wp-core-ui .attachment-preview { - position: relative; - -webkit-box-shadow: - inset 0 0 15px rgba( 0, 0, 0, 0.1 ), - inset 0 0 0 1px rgba( 0, 0, 0, 0.05 ); - box-shadow: - inset 0 0 15px rgba( 0, 0, 0, 0.1 ), - inset 0 0 0 1px rgba( 0, 0, 0, 0.05 ); - background: #eee; - cursor: pointer; -} - -.wp-core-ui .attachment-preview:before { - content: ""; - display: block; - padding-top: 100%; -} - -.wp-core-ui .attachment .icon { - margin: 0 auto; - overflow: hidden; -} - -.wp-core-ui .attachment .thumbnail { - overflow: hidden; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - opacity: 1; - -webkit-transition: opacity .1s; - transition: opacity .1s; -} - -.wp-core-ui .attachment .portrait img { - max-width: 100%; -} - -.wp-core-ui .attachment .landscape img { - max-height: 100%; -} - -.wp-core-ui .attachment .thumbnail:after { - content: ""; - display: block; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - -webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 ); - box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 ); - overflow: hidden; -} - -.wp-core-ui .attachment .thumbnail img { - top: 0; - left: 0; -} - -.wp-core-ui .attachment .thumbnail .centered { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - -webkit-transform: translate( 50%, 50% ); - -ms-transform: translate(50%,50%); /* Fails with spaces?? Weird! */ - transform: translate( 50%, 50% ); -} - -.wp-core-ui .attachment .thumbnail .centered img { - -webkit-transform: translate( -50%, -50% ); - -ms-transform: translate(-50%,-50%); - transform: translate( -50%, -50% ); -} - -.wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon { - -webkit-transform: translate( -50%, -70% ); - -ms-transform: translate(-50%,-70%); - transform: translate( -50%, -70% ); -} - -.ie8 .wp-core-ui .attachment img.icon { - top: 20%; - position: relative; -} - -.wp-core-ui .attachment .filename { - position: absolute; - left: 0; - right: 0; - bottom: 0; - overflow: hidden; - max-height: 100%; - word-wrap: break-word; - text-align: center; - font-weight: 600; - background: rgba( 255, 255, 255, 0.8 ); - -webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 ); - box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 ); -} - -.wp-core-ui .attachment .filename div { - padding: 5px 10px; -} - -.wp-core-ui .attachment .thumbnail img { - position: absolute; -} - -.wp-core-ui .attachment-close { - display: block; - position: absolute; - top: 5px; - right: 5px; - height: 22px; - width: 22px; - padding: 0; - background-color: #fff; - background-position: -96px 4px; - -webkit-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: 0 0 0 1px rgba( 0, 0, 0, 0.3 ); - box-shadow: 0 0 0 1px rgba( 0, 0, 0, 0.3 ); -} - -.wp-core-ui .attachment-close:hover, -.wp-core-ui .attachment-close:focus { - background-position: -36px 4px; -} - -.wp-core-ui .attachment .check { - display: none; - height: 24px; - width: 24px; - padding: 0; - position: absolute; - z-index: 10; - top: 0; - right: 0; - outline: none; - background: #eee; - -webkit-box-shadow: 0 0 0 1px #fff, 0 0 0 2px rgba( 0, 0, 0, 0.15 ); - box-shadow: 0 0 0 1px #fff, 0 0 0 2px rgba( 0, 0, 0, 0.15 ); -} - -.wp-core-ui .attachment .check .media-modal-icon { - display: block; - background-position: -1px 0; - height: 15px; - width: 15px; - margin: 5px; -} - -.wp-core-ui .attachment .check:hover .media-modal-icon { - background-position: -40px 0; -} - -.wp-core-ui .attachment.selected .check { - display: block; -} - -.wp-core-ui .attachment.details .check, -.wp-core-ui .attachment.selected .check:focus, -.wp-core-ui .media-frame.mode-grid .attachment.selected .check { - background-color: #0073aa; - -webkit-box-shadow: - 0 0 0 1px #fff, - 0 0 0 2px #0073aa; - box-shadow: - 0 0 0 1px #fff, - 0 0 0 2px #0073aa; -} - -.wp-core-ui .attachment.details .check .media-modal-icon, -.wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon { - background-position: -21px 0; -} - -.wp-core-ui .attachment.details .check:hover .media-modal-icon, -.wp-core-ui .attachment.selected .check:focus .media-modal-icon, -.wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon { - background-position: -60px 0; -} - -.wp-core-ui .media-frame .attachment .describe { - position: relative; - display: block; - width: 100%; - margin: 0; - padding: 8px; - font-size: 12px; - -webkit-border-radius: 0; - border-radius: 0; -} - -/** - * Attachments Browser - */ -.media-frame .attachments-browser { - position: relative; - width: 100%; - height: 100%; - overflow: hidden; -} - -.attachments-browser .media-toolbar { - right: 300px; - height: 50px; -} - -.attachments-browser.hide-sidebar .media-toolbar { - right: 0; -} - -.attachments-browser .media-toolbar-primary > .media-button, -.attachments-browser .media-toolbar-primary > .media-button-group, -.attachments-browser .media-toolbar-secondary > .media-button, -.attachments-browser .media-toolbar-secondary > .media-button-group { - margin: 11px 0; -} - -.attachments-browser .attachments { - padding: 2px 8px 8px; -} - -.attachments-browser .attachments, -.attachments-browser .uploader-inline { - position: absolute; - top: 50px; - left: 0; - right: 300px; - bottom: 0; - overflow: auto; - outline: none; -} - -.attachments-browser .uploader-inline.hidden { - display: none; -} - -.attachments-browser .media-toolbar-primary { - max-width: 33%; -} - -.attachments-browser .media-toolbar-secondary { - max-width: 66%; -} - -.uploader-inline .close { - background-color: transparent; - border: 0; - cursor: pointer; - height: 48px; - position: absolute; - right: 0; - text-align: center; - top: 0; - width: 50px; - z-index: 1; -} - -.uploader-inline .close:before { - font: normal 30px/50px dashicons !important; - color: #72777c; - display: inline-block; - content: "\f335"; - font-weight: 300; -} - -.attachments-browser.hide-sidebar .attachments, -.attachments-browser.hide-sidebar .uploader-inline { - right: 0; - margin-right: 0; -} - -.attachments-browser .instructions { - display: inline-block; - margin-top: 16px; - line-height: 18px; - font-size: 13px; - color: #666; - margin-right: 0.5em; -} - -.attachments-browser .no-media { - padding: 2em 0 0 2em; -} - -/** - * Progress Bar - */ -.media-progress-bar { - position: relative; - height: 10px; - width: 70%; - margin: 10px auto; - -webkit-border-radius: 10px; - border-radius: 10px; - background: #ddd; - background: rgba( 0, 0, 0, 0.1 ); -} - -.media-progress-bar div { - height: 10px; - min-width: 20px; - width: 0; - background: #0073aa; - -webkit-border-radius: 10px; - border-radius: 10px; - -webkit-transition: width 300ms; - transition: width 300ms; -} - -.media-uploader-status .media-progress-bar { - display: none; - width: 100%; -} - -.uploading.media-uploader-status .media-progress-bar { - display: block; -} - -.attachment-preview .media-progress-bar { - position: absolute; - top: 50%; - left: 15%; - width: 70%; - margin: -5px 0 0 0; -} - -.media-uploader-status { - position: relative; - margin: 0 auto; - padding-bottom: 10px; - max-width: 400px; -} - -.uploader-inline .media-uploader-status h3, /* Back-compat for pre-4.4 */ -.uploader-inline .media-uploader-status h2 { - display: none; -} - -.media-uploader-status .upload-details { - display: none; - font-size: 12px; - color: #666; -} - -.uploading.media-uploader-status .upload-details { - display: block; -} - -.media-uploader-status .upload-detail-separator { - padding: 0 4px; -} - -.media-uploader-status .upload-count { - color: #444; -} - -.media-uploader-status .upload-dismiss-errors, -.media-uploader-status .upload-errors { - display: none; -} - -.errors.media-uploader-status .upload-dismiss-errors, -.errors.media-uploader-status .upload-errors { - display: block; -} - -.media-uploader-status .upload-dismiss-errors { - text-decoration: none; -} - -.media-sidebar .media-uploader-status .upload-dismiss-errors { - position: absolute; - top: 0; - right: 0; -} - -.upload-errors .upload-error { - padding: 12px; - margin-bottom: 12px; - background: #fff; - border-left: 4px solid #dc3232; - -webkit-box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1); -} - -.uploader-inline .upload-errors .upload-error { - background-color: #fbeaea; - -webkit-box-shadow: none; - box-shadow: none; -} - -.upload-errors .upload-error-filename { - font-weight: 600; -} - -.upload-errors .upload-error-message { - display: block; - padding-top: 8px; - word-wrap: break-word; -} - -.uploader-window { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba( 0, 86, 132, 0.9 ); - z-index: 250000; - display: none; - text-align: center; - opacity: 0; - -webkit-transition: opacity 250ms; - transition: opacity 250ms; -} - -.uploader-window-content { - position: absolute; - top: 10px; - left: 10px; - right: 10px; - bottom: 10px; - border: 1px dashed #fff; -} - -.uploader-window h3, /* Back-compat for pre-4.4 */ -.uploader-window h1 { - margin: -0.5em 0 0; - position: absolute; - top: 50%; - left: 0; - right: 0; - -webkit-transform: translateY( -50% ); - -ms-transform: translateY(-50%); - transform: translateY( -50% ); - font-size: 40px; - color: #fff; - padding: 0; -} - -.uploader-window .media-progress-bar { - margin-top: 20px; - max-width: 300px; - background: transparent; - border-color: #fff; - display: none; -} - -.uploader-window .media-progress-bar div { - background: #fff; -} - -.uploading .uploader-window .media-progress-bar { - display: block; -} - -.media-frame .uploader-inline { - margin-bottom: 20px; - padding: 0; - text-align: center; -} - -.uploader-inline-content { - position: absolute; - top: 30%; - left: 0; - right: 0; -} - -.uploader-inline-content .upload-ui { - margin: 2em 0; -} - -.uploader-inline-content .post-upload-ui { - margin-bottom: 2em; -} - -.uploader-inline .has-upload-message .upload-ui { - margin: 0 0 4em; -} - -.uploader-inline h3, /* Back-compat for pre-4.4 */ -.uploader-inline h2 { - font-size: 20px; - line-height: 28px; - font-weight: 400; - margin: 0; -} - -.uploader-inline .has-upload-message .upload-instructions { - font-size: 14px; - color: #444; - font-weight: 400; -} - -.uploader-inline .drop-instructions { - display: none; -} - -.supports-drag-drop .uploader-inline .drop-instructions { - display: block; -} - -.uploader-inline p { - font-size: 12px; - margin: 0.5em 0; -} - -.uploader-inline .media-progress-bar { - display: none; -} - -.uploading.uploader-inline .media-progress-bar { - display: block; -} - -.uploader-inline .browser { - display: inline-block !important; -} - -/** - * Selection - */ -.media-selection { - position: absolute; - top: 0; - left: 0; - right: 350px; - height: 60px; - padding: 0 0 0 16px; - overflow: hidden; - white-space: nowrap; -} - -.media-selection .selection-info { - display: inline-block; - font-size: 12px; - height: 60px; - margin-right: 10px; - vertical-align: top; -} - -.media-selection.empty, -.media-selection.editing { - display: none; -} - -.media-selection.one .edit-selection { - display: none; -} - -.media-selection .count { - display: block; - padding-top: 12px; - font-size: 14px; - line-height: 20px; - font-weight: 600; -} - -.media-selection .button-link { - float: left; - padding: 1px 8px; - margin: 1px 8px 1px -8px; - line-height: 16px; - border-right: 1px solid #ddd; - color: #0073aa; -} - -.media-selection .button-link:hover, -.media-selection .button-link:focus { - color: #00a0d2; -} - -.media-selection .button-link:last-child { - border-right: 0; - margin-right: 0; -} - -.selection-info .clear-selection { - color: #bc0b0b; -} - -.selection-info .clear-selection:hover, -.selection-info .clear-selection:focus { - color: red; -} - -.media-selection .selection-view { - display: inline-block; - vertical-align: top; -} - -.media-selection .attachments { - display: inline-block; - height: 48px; - margin: 6px; - padding: 0; - overflow: hidden; - vertical-align: top; -} - -.media-selection .attachment { - width: 40px; - padding: 0; - margin: 4px; -} - -.media-selection .attachment .thumbnail { - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -.media-selection .attachment .icon { - width: 50%; -} - -.media-selection .attachment-preview { - -webkit-box-shadow: none; - box-shadow: none; - background: none; -} - -.wp-core-ui .media-selection .attachment:focus, -.wp-core-ui .media-selection .selected.attachment:focus, -.wp-core-ui .media-selection .attachment.details:focus { - -webkit-box-shadow: - 0 0 0 1px #fff, - 0 0 2px 3px #5b9dd9; - box-shadow: - 0 0 0 1px #fff, - 0 0 2px 3px #5b9dd9; -} - -.wp-core-ui .media-selection .selected.attachment { - -webkit-box-shadow: none; - box-shadow: none; -} - -.wp-core-ui .media-selection .attachment.details { - -webkit-box-shadow: - 0 0 0 1px #fff, - 0 0 0 3px #0073aa; - box-shadow: - 0 0 0 1px #fff, - 0 0 0 3px #0073aa; -} - -.media-selection:after { - content: ""; - display: block; - position: absolute; - top: 0; - right: 0; - bottom: 0; - width: 25px; - background-image: -webkit-gradient(linear, right top, left top, from(rgba( 255, 255, 255, 1 )), to(rgba( 255, 255, 255, 0 ))); - background-image: -webkit-linear-gradient(right, rgba( 255, 255, 255, 1 ), rgba( 255, 255, 255, 0 )); - background-image: linear-gradient(to left, rgba( 255, 255, 255, 1 ), rgba( 255, 255, 255, 0 )); -} - -.media-selection .attachment .filename { - display: none; -} - -/** - * Spinner - */ -.media-frame .spinner { - background: url(../images/spinner.gif) no-repeat; - -webkit-background-size: 20px 20px; - background-size: 20px 20px; - float: right; - display: inline-block; - visibility: hidden; - opacity: 0.7; - filter: alpha(opacity=70); - width: 20px; - height: 20px; - margin: 0; - vertical-align: middle; -} - -.media-frame .spinner.is-active { - visibility: visible; -} - -.media-toolbar .spinner { - margin-top: 14px; -} - -/** - * Attachment Details - */ -.attachment-details { - position: relative; - overflow: auto; -} - -.attachment-details .settings-save-status { - float: right; - text-transform: none; - z-index: 10; -} - -.attachment-details .settings-save-status .spinner { - margin-left: 5px; -} - -.attachment-details .settings-save-status .saved { - float: right; - display: none; -} - -.attachment-details.save-waiting .settings-save-status .spinner { - visibility: visible; -} - -.attachment-details.save-complete .settings-save-status .saved { - display: block; -} - -.attachment-info { - overflow: hidden; - min-height: 60px; - margin-bottom: 16px; - line-height: 18px; - color: #666; - border-bottom: 1px solid #ddd; - padding-bottom: 11px; -} - -.attachment-info .filename { - font-weight: 600; - color: #444; - word-wrap: break-word; -} - -.attachment-info .thumbnail { - position: relative; - float: left; - max-width: 120px; - max-height: 120px; - margin-top: 5px; - margin-right: 10px; - margin-bottom: 5px; -} - -.uploading .attachment-info .thumbnail { - width: 120px; - height: 80px; - -webkit-box-shadow: inset 0 0 15px rgba( 0, 0, 0, 0.1 ); - box-shadow: inset 0 0 15px rgba( 0, 0, 0, 0.1 ); -} - -.uploading .attachment-info .media-progress-bar { - margin-top: 35px; -} - -.attachment-info .thumbnail-image:after { - content: ""; - display: block; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - -webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 ); - box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.15 ); - overflow: hidden; -} - -.attachment-info .thumbnail img { - display: block; - max-width: 120px; - max-height: 120px; - margin: 0 auto; -} - -.attachment-info .details { - float: left; - font-size: 12px; - max-width: 100%; -} - -.attachment-info .edit-attachment, -.attachment-info .delete-attachment, -.attachment-info .trash-attachment, -.attachment-info .untrash-attachment { - display: block; - text-decoration: none; - white-space: nowrap; -} - -.attachment-details.needs-refresh .attachment-info .edit-attachment { - display: none; -} - -.attachment-info .edit-attachment { - display: block; -} - -.media-modal .delete-attachment, -.media-modal .trash-attachment, -.media-modal .untrash-attachment { - display: inline; - padding: 0; - color: #bc0b0b; -} - -.media-modal .delete-attachment:hover, -.media-modal .delete-attachment:focus, -.media-modal .trash-attachment:hover, -.media-modal .trash-attachment:focus, -.media-modal .untrash-attachment:hover, -.media-modal .untrash-attachment:focus { - color: red; -} - -/** - * Attachment Display Settings - */ -.attachment-display-settings { - width: 100%; - float: left; - overflow: hidden; -} - -.attachment-display-settings h4 { - margin: 1.4em 0 0.4em; -} - -.collection-settings { - overflow: hidden; -} - -.collection-settings .setting input[type="checkbox"] { - float: left; - margin-right: 8px; -} - -.collection-settings .setting span { - min-width: inherit; -} - -/** - * Image Editor - */ -.media-modal .imgedit-wrap { - position: static; -} - -.media-modal .imgedit-wrap .imgedit-panel-content { - padding: 16px; - position: absolute; - top: 0; - right: 282px; - bottom: 0; - left: 0; - overflow: auto; -} - -.media-modal .imgedit-wrap .imgedit-settings { - background: #f3f3f3; - border-left: 1px solid #ddd; - padding: 20px 16px 16px; - position: absolute; - top: 0; - right: 0; - bottom: 0; - width: 250px; - overflow: auto; -} - -.media-modal .imgedit-group { - background: none; - border: none; - border-bottom: 1px solid #ddd; - -webkit-box-shadow: none; - box-shadow: none; - margin: 0; - margin-bottom: 16px; - padding: 0; - padding-bottom: 16px; - position: relative; /* RTL fix, #WP29352 */ -} - -.media-modal .imgedit-group:last-of-type { - border: none; - margin: 0; - padding: 0; -} - -.media-modal .imgedit-group-top { - margin: 0; -} - -.media-modal .imgedit-group-top h3, /* Back-compat for pre-4.4 */ -.media-modal .imgedit-group-top h2, -.media-modal .imgedit-group-top h2 .button-link { - display: inline-block; - text-transform: uppercase; - font-size: 12px; - color: #666; - margin: 0; - margin-top: 3px; -} - -.media-modal .imgedit-group-top h3 a, /* Back-compat for pre-4.4 */ -.media-modal .imgedit-group-top h2 a, -.media-modal .imgedit-group-top h2 .button-link { - text-decoration: none; - color: #666; -} - -/* higher specificity than media.css */ -.wp-core-ui.media-modal .image-editor .imgedit-help-toggle, -.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:hover, -.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:active { - border: 1px solid transparent; - margin: 0; - padding: 0; - background: transparent; - color: #0074a2; - font-size: 20px; - line-height: 1; - cursor: pointer; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-box-shadow: none; - box-shadow: none; -} - -.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:focus { - color: #0074a2; - border-color: #5b9dd9; - outline: none; - -webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); - box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); -} - -.wp-core-ui.media-modal .imgedit-group-top .dashicons-arrow-down.imgedit-help-toggle { - margin-top: -3px; -} - -.wp-core-ui.media-modal .image-editor h3 .imgedit-help-toggle { - margin-top: -2px; -} - -.media-modal .imgedit-help-toggled span.dashicons:before { - content: "\f142"; -} - -.media-modal .imgedit-thumbnail-preview { - margin: 10px 8px 0 0; -} - -.imgedit-thumbnail-preview-caption { - display: block; -} - -.media-modal .imgedit-wrap div.updated { - margin: 0; - margin-bottom: 16px; -} - - -/** - * Embed from URL and Image Details - */ -.embed-url { - display: block; - position: relative; - padding: 16px; - margin: 0; - z-index: 250; - background: #fff; - font-size: 18px; -} - -.media-frame .embed-url input { - font-size: 18px; - padding: 12px 14px; - width: 100%; - min-width: 200px; - -webkit-box-shadow: inset 2px 2px 4px -2px rgba( 0, 0, 0, 0.1 ); - box-shadow: inset 2px 2px 4px -2px rgba( 0, 0, 0, 0.1 ); -} - -.media-frame .embed-url .spinner { - position: absolute; - top: 32px; - right: 26px; -} - -.media-frame .embed-loading .embed-url .spinner { - visibility: visible; -} - -.embed-link-settings, -.embed-media-settings { - position: absolute; - top: 70px; - left: 0; - right: 0; - bottom: 0; - padding: 16px 16px 32px; - overflow: auto; -} - -.media-embed .embed-link-settings { - /* avoid Firefox to give focus to the embed preview container parent */ - overflow: visible; -} - -.embed-preview img, -.embed-preview iframe, -.embed-preview embed, -.mejs-container video { - max-width: 100%; - vertical-align: middle; -} - -.embed-preview a { - display: inline-block; -} - -.embed-preview img { - display: block; - height: auto; -} - -.mejs-container:focus { - outline: 1px solid #5b9dd9; - -webkit-box-shadow: 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: 0 0 2px 1px rgba(30, 140, 190, .8); -} - -.image-details .media-modal { - left: 140px; - right: 140px; -} - -.image-details .media-frame-title, -.image-details .media-frame-content, -.image-details .media-frame-router { - left: 0; -} - -.image-details .embed-media-settings { - top: 0; - overflow: visible; - padding: 0; -} - -.image-details .embed-media-settings, -.image-details .embed-media-settings div { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.image-details .column-settings { - background: #f3f3f3; - border-right: 1px solid #ddd; - min-height: 100%; - width: 55%; - position: absolute; - top: 0; - left: 0; -} - -.image-details .column-settings h3, /* Back-compat for pre-4.4 */ -.image-details .column-settings h2 { - margin: 20px; - padding-top: 20px; - border-top: 1px solid #ddd; - color: #23282d; -} - -.image-details .column-image { - width: 45%; - position: absolute; - left: 55%; - top: 0; -} - -.image-details .image { - margin: 20px; -} - -.image-details .image img { - max-width: 100%; - max-height: 500px; -} - -.image-details .advanced-toggle { - padding: 0; - color: #666; - text-transform: uppercase; -} - -.image-details .advanced-toggle:after { - font: normal 20px/1 dashicons; - speak: none; - vertical-align: top; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - content: "\f140"; - display: inline-block; - margin-top: -2px; -} - -.image-details .advanced-visible .advanced-toggle:after { - content: "\f142"; -} - -.image-details .embed-media-settings .size { - margin-bottom: 4px; -} - -.image-details .custom-size span { - display: block; -} - -.image-details .custom-size label { - display: block; - float: left; -} - -.image-details .custom-size span small { - color: #555d66; /* #f3f3f3 background */ - font-size: inherit; -} - -.image-details .custom-size input { - width: 5em; -} - -.image-details .custom-size .sep { - float: left; - margin: 26px 6px 0 6px; -} - -.image-details .custom-size:after { - content: ""; - display: table; - clear: both; -} - -.media-embed .thumbnail { - max-width: 100%; - max-height: 200px; - position: relative; - float: left; -} - -.media-embed .thumbnail img { - max-height: 200px; - display: block; -} - -.media-embed .thumbnail:after { - content: ""; - display: block; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - -webkit-box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 ); - box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 ); - overflow: hidden; -} - -.media-embed .setting { - width: 100%; - margin: 10px 0; - float: left; - display: block; - clear: both; -} - -.image-details .embed-media-settings .setting { - float: none; - width: auto; -} - -.image-details .actions { - margin: 10px 0; -} - -.image-details .hidden { - display: none; -} - -.media-embed .setting input[type="text"], -.media-embed .setting textarea { - display: block; - width: 100%; - max-width: 400px; - margin: 1px 0; -} - -.image-details .embed-media-settings .setting input[type="text"], -.image-details .embed-media-settings .setting textarea { - max-width: inherit; - width: 70%; -} - -.image-details .embed-media-settings .setting input.link-to-custom, -.image-details .embed-media-settings .link-target, -.image-details .embed-media-settings .custom-size { - margin-left: 27%; - width: 70%; -} - -.image-details .embed-media-settings .link-target { - margin-top: 24px; -} - -.media-embed .setting input.hidden, -.media-embed .setting textarea.hidden { - display: none; -} - -.media-embed .setting span { - display: block; - width: 200px; - font-size: 13px; - line-height: 24px; - color: #666; -} - -.image-details .embed-media-settings .setting span { - float: left; - width: 25%; - text-align: right; - margin: 8px 1% 0 1%; - line-height: 1.1; -} - -.media-embed .setting .button-group { - margin: 2px 0; -} - -.media-embed-sidebar { - position: absolute; - top: 0; - left: 440px; -} - -.advanced-section, -.link-settings { - margin-top: 10px; -} - -/* Drag & drop on the editor upload */ -.wp-editor-wrap .uploader-editor { - background: rgba( 150, 150, 150, 0.9 ); - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - z-index: 99998; /* under the toolbar */ - display: none; - text-align: center; -} - -.wp-editor-wrap .uploader-editor-content { - border: 1px dashed #fff; - position: absolute; - top: 10px; - left: 10px; - right: 10px; - bottom: 10px; -} - -.wp-editor-wrap .uploader-editor .uploader-editor-title { - position: absolute; - top: 50%; - left: 0; - right: 0; - -webkit-transform: translateY( -50% ); - -ms-transform: translateY(-50%); - transform: translateY( -50% ); - font-size: 3em; - line-height: 1.3; - font-weight: 600; - color: #fff; - padding: 0; - margin: 0; - display: none; -} - -.wp-editor-wrap .uploader-editor.droppable { - background: rgba( 0, 86, 132, 0.9 ); -} - -.wp-editor-wrap .uploader-editor.droppable .uploader-editor-title { - display: block; -} - -/** - * IE7 Fixes - */ -.ie7 .media-frame .attachments-browser { - position: static; -} - -.ie7 .media-frame .embed-url input { - margin-top: 4px; - width: 90%; -} - -.ie7 .compat-item { - width: 99%; -} - -.ie7 .attachment-display-settings { - width: auto; -} - -.ie7 .attachment-preview, -.ie7 .attachment-preview .thumbnail { - width: 120px; - height: 120px; -} - -.ie7 .media-frame .attachment .describe { - width: 102px; -} - -.ie7 .media-sidebar .setting select { - max-width: 55%; -} - -.ie7 .media-sidebar .setting input[type="text"], -.ie7 .media-sidebar .setting input[type="password"], -.ie7 .media-sidebar .setting input[type="email"], -.ie7 .media-sidebar .setting input[type="number"], -.ie7 .media-sidebar .setting input[type="search"], -.ie7 .media-sidebar .setting input[type="tel"], -.ie7 .media-sidebar .setting input[type="url"], -.ie7 .media-sidebar .setting textarea { - width: 55%; -} - -.ie7 .media-sidebar .setting .link-to-custom { - float: left; -} - -/** - * Localization - */ -.rtl .media-modal, -.rtl .media-frame, -.rtl .media-frame .search, -.rtl .media-frame input[type="text"], -.rtl .media-frame input[type="password"], -.rtl .media-frame input[type="number"], -.rtl .media-frame input[type="search"], -.rtl .media-frame input[type="email"], -.rtl .media-frame input[type="url"], -.rtl .media-frame input[type="tel"], -.rtl .media-frame textarea, -.rtl .media-frame select { - font-family: Tahoma, sans-serif; -} - -:lang(he-il) .rtl .media-modal, -:lang(he-il) .rtl .media-frame, -:lang(he-il) .rtl .media-frame .search, -:lang(he-il) .rtl .media-frame input[type="text"], -:lang(he-il) .rtl .media-frame input[type="password"], -:lang(he-il) .rtl .media-frame input[type="number"], -:lang(he-il) .rtl .media-frame input[type="search"], -:lang(he-il) .rtl .media-frame input[type="email"], -:lang(he-il) .rtl .media-frame input[type="url"], -:lang(he-il) .rtl .media-frame textarea, -:lang(he-il) .rtl .media-frame select { - font-family: Arial, sans-serif; -} - -/** - * Responsive layout - */ -@media only screen and (max-width: 900px) { - - /* Drop-down menu */ - .media-frame:not(.hide-menu) .media-frame-title, - .media-frame:not(.hide-menu) .media-frame-router, - .media-frame:not(.hide-menu) .media-frame-content, - .media-frame:not(.hide-menu) .media-frame-toolbar { - left: 0; - } - - .media-frame:not(.hide-menu) .media-frame-menu { - position: static; - width: 0; - } - - .media-frame:not(.hide-menu) .media-menu { - width: auto; - max-width: 80%; - overflow: auto; - z-index: 2000; - top: 50px; - left: -300px; - right: auto; - bottom: auto; - padding: 5px 0; - border: 1px solid #ccc; - } - - .media-frame:not(.hide-menu) .media-menu.visible { - left: 0; - } - - .media-frame:not(.hide-menu) .media-menu > a { - padding: 12px 16px; - font-size: 16px; - } - - .media-frame:not(.hide-menu) .media-menu > a.active { - display: none; - } - - .media-frame:not(.hide-menu) .media-menu .separator { - margin: 5px 10px; - } - - .media-frame:not(.hide-menu) .media-frame-title { - left: 0; - } - - .media-frame:not(.hide-menu) .media-frame-title .dashicons { - display: inline-block; - line-height: 50px; - } - - .media-frame:not(.hide-menu) .media-frame-title h1 { - color: #0073aa; - line-height: 3; - font-size: 18px; - float: left; - cursor: pointer; - } - /* End drop-down menu */ - - .media-sidebar { - width: 230px; - } - - .attachments-browser .attachments, - .attachments-browser .uploader-inline, - .attachments-browser .media-toolbar { - right: 262px; - } - - .media-sidebar .setting, - .attachment-details .setting { - margin: 6px 0px; - } - - .media-sidebar .setting input, - .media-sidebar .setting textarea, - .media-sidebar .setting span, - .attachment-details .setting input, - .attachment-details .setting textarea, - .attachment-details .setting span, - .compat-item label span { - float: none; - } - - .media-sidebar .setting span, - .attachment-details .setting span, - .compat-item label span { - text-align: inherit; - min-height: 16px; - margin: 0; - padding: 8px 2px 0; - } - - .media-sidebar .setting .value, - .attachment-details .setting .value { - float: none; - width: auto; - } - - .media-sidebar .setting input[type="text"], - .media-sidebar .setting input[type="password"], - .media-sidebar .setting input[type="email"], - .media-sidebar .setting input[type="number"], - .media-sidebar .setting input[type="search"], - .media-sidebar .setting input[type="tel"], - .media-sidebar .setting input[type="url"], - .media-sidebar .setting textarea, - .media-sidebar .setting select, - .attachment-details .setting input[type="text"], - .attachment-details .setting input[type="password"], - .attachment-details .setting input[type="email"], - .attachment-details .setting input[type="number"], - .attachment-details .setting input[type="search"], - .attachment-details .setting input[type="tel"], - .attachment-details .setting input[type="url"], - .attachment-details .setting textarea, - .attachment-details .setting select { - float: none; - width: 98%; - max-width: none; - height: auto; - } - - .media-sidebar .setting select.columns, - .attachment-details .setting select.columns { - width: auto; - } - - .media-frame input, - .media-frame textarea, - .media-frame .search { - padding: 3px 6px; - } - - .image-details .column-image { - width: 30%; - left: 70%; - } - - .image-details .column-settings { - width: 70%; - } - - .image-details .media-modal { - left: 30px; - right: 30px; - } - - .image-details .embed-media-settings .setting { - margin: 20px; - } - - .image-details .embed-media-settings .setting span { - float: none; - text-align: left; - width: 100%; - margin-bottom: 4px; - } - - .image-details .embed-media-settings .setting input.link-to-custom, - .image-details .embed-media-settings .setting input[type="text"], - .image-details .embed-media-settings .setting textarea { - width: 100%; - margin-left: 0; - } - - .image-details .embed-media-settings .custom-size { - margin-left: 20px; - } - - .collection-settings .setting input[type="checkbox"] { - margin-top: 0; - } - - .media-selection { - min-width: 120px; - } - - .media-selection:after { - background: none; - } - - .media-selection .attachments { - display: none; - } - - .media-modal .attachments-browser .media-toolbar .search { - max-width: 100%; - height: auto; - float: right; - } - - .media-modal .attachments-browser .media-toolbar .attachment-filters { - height: auto; - } - - .media-modal .attachments-browser .media-toolbar .spinner { - margin: 14px 2px 0; - } - - /* Text inputs need to be 16px, or they force zooming on iOS */ - .media-frame input[type="text"], - .media-frame input[type="password"], - .media-frame input[type="number"], - .media-frame input[type="search"], - .media-frame input[type="email"], - .media-frame input[type="url"], - .media-frame textarea, - .media-frame select { - font-size: 16px; - } -} - -/* Responsive on portrait and landscape */ -@media only screen and (max-width: 640px), screen and (max-height: 400px) { - /* Full-bleed modal */ - .media-modal, - .image-details .media-modal { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - } - - .media-modal-backdrop { - position: fixed; - } - - .media-sidebar { - z-index: 1900; - max-width: 70%; - bottom: 120%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding-bottom: 0; - } - - .media-sidebar.visible { - bottom: 0; - } - - .attachments-browser .attachments, - .attachments-browser .uploader-inline, - .attachments-browser .media-toolbar { - right: 0; - } - - .image-details .media-frame-title { - display: block; - top: 0; - font-size: 14px; - } - - .image-details .column-image, - .image-details .column-settings { - width: 100%; - position: relative; - left: 0; - } - - .image-details .column-settings { - padding: 4px 0; - } - - /* Media tabs on the top */ - .media-frame-content .media-toolbar .instructions { - display: none; - } -} - -/* Landscape specific header override */ -@media screen and (max-height: 400px) { - .media-menu { - padding: 0; - } - - .media-frame-router { - top: 44px; - } - - .media-frame-content { - top: 78px; - } - - .attachments-browser .attachments { - top: 40px; - } - - /* Prevent unnecessary scrolling on title input */ - .embed-link-settings { - overflow: visible; - } -} - -@media only screen and (max-width: 480px) { - .media-modal-close { - top: -5px; - } - - .media-modal .media-frame-title { - height: 40px; - } - - .wp-core-ui.wp-customizer .media-button { - margin-top: 13px; - } - - .media-modal .media-frame-title h1, - .media-frame:not(.hide-menu) .media-frame-title h1 { - font-size: 18px; - line-height: 40px; - } - - .media-frame:not(.hide-menu) .media-frame-title .dashicons { - line-height: 40px; - } - - .media-frame-router, - .media-frame:not(.hide-menu) .media-menu { - top: 40px; - } - - .media-frame-content { - top: 74px; - } - - .media-frame.hide-router .media-frame-content { - top: 40px; - } -} - -/** - * HiDPI Displays - */ -@media print, - (-webkit-min-device-pixel-ratio: 1.25), - (min-resolution: 120dpi) { - - .wp-core-ui .media-modal-icon { - background-image: url(../images/uploader-icons-2x.png); - -webkit-background-size: 134px 15px; - background-size: 134px 15px; - } - - .media-frame .spinner { - background-image: url(../images/spinner-2x.gif); - } -} - -.media-frame-content[data-columns="1"] .attachment { - width: 100%; -} - -.media-frame-content[data-columns="2"] .attachment { - width: 50%; -} - -.media-frame-content[data-columns="3"] .attachment { - width: 33.33%; -} - -.media-frame-content[data-columns="4"] .attachment { - width: 25%; -} - -.media-frame-content[data-columns="5"] .attachment { - width: 20%; -} - -.media-frame-content[data-columns="6"] .attachment { - width: 16.66%; -} - -.media-frame-content[data-columns="7"] .attachment { - width: 14.28%; -} - -.media-frame-content[data-columns="8"] .attachment { - width: 12.5%; -} - -.media-frame-content[data-columns="9"] .attachment { - width: 11.11%; -} - -.media-frame-content[data-columns="10"] .attachment { - width: 10%; -} - -.media-frame-content[data-columns="11"] .attachment { - width: 9.09%; -} - -.media-frame-content[data-columns="12"] .attachment { - width: 8.33%; -} diff --git a/wp/wp-includes/css/media-views.min.css b/wp/wp-includes/css/media-views.min.css deleted file mode 100644 index ded2f01e..00000000 --- a/wp/wp-includes/css/media-views.min.css +++ /dev/null @@ -1,8 +0,0 @@ -.media-menu,.media-router{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.media-modal *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.media-modal input,.media-modal select,.media-modal textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.media-frame,.media-modal{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:12px;-webkit-overflow-scrolling:touch}.media-modal label,.media-modal legend{font-size:13px}.media-frame input,.media-frame textarea{padding:6px 8px}.media-frame select,.wp-admin .media-frame select{line-height:28px;margin-top:3px}.media-frame a{border-bottom:none;color:#0073aa}.media-frame a:active,.media-frame a:hover{color:#00a0d2}.media-frame a:focus{-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);outline:0;color:#124964}.media-frame a.button{color:#32373c}.media-frame a.button:hover{color:#23282d}.media-frame a.button-primary,.media-frame a.button-primary:hover{color:#fff}.media-frame input[type=text],.media-frame input[type=password],.media-frame input[type=number],.media-frame input[type=search],.media-frame input[type=email],.media-frame input[type=url],.media-frame select,.media-frame textarea{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:12px;border-width:1px;border-style:solid;border-color:#ddd}.media-frame input[type=text]:focus,.media-frame input[type=password]:focus,.media-frame input[type=number]:focus,.media-frame input[type=search]:focus,.media-frame input[type=email]:focus,.media-frame input[type=url]:focus,.media-frame select:focus,.media-frame textarea:focus{border-color:#5b9dd9}.media-frame select{height:24px;padding:2px}.media-frame input:disabled,.media-frame input[readonly],.media-frame textarea:disabled,.media-frame textarea[readonly]{background-color:#eee}.media-frame input[type=search]{-webkit-appearance:textfield}.media-frame ::-webkit-input-placeholder{color:#72777c}.media-frame ::-moz-placeholder{color:#72777c;opacity:1}.media-frame :-ms-input-placeholder{color:#72777c}.media-frame .hidden{display:none}/*! - * jQuery UI Draggable/Sortable 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */.ui-draggable-handle,.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.media-modal{position:fixed;top:30px;left:30px;right:30px;bottom:30px;z-index:160000}.wp-customizer .media-modal{z-index:560000}.media-modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:159900}.wp-customizer .media-modal-backdrop{z-index:559900}.media-modal-close{position:absolute;top:0;right:0;width:50px;height:50px;margin:0;padding:0;border:1px solid transparent;background:0 0;color:#666;z-index:1000;cursor:pointer;outline:0;-webkit-transition:color .1s ease-in-out,background .1s ease-in-out;transition:color .1s ease-in-out,background .1s ease-in-out}.media-modal-close:active,.media-modal-close:hover{color:#00a0d2}.media-modal-close:focus{color:#00a0d2;border-color:#5b9dd9;-webkit-box-shadow:0 0 3px rgba(0,115,170,.8);box-shadow:0 0 3px rgba(0,115,170,.8)}.media-modal-close span.media-modal-icon{background-image:none}.media-modal-close .media-modal-icon:before{content:"\f158";font:400 20px/1 dashicons;speak:none;vertical-align:middle;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.media-modal-content{position:absolute;top:0;left:0;right:0;bottom:0;overflow:auto;min-height:300px;-webkit-box-shadow:0 5px 15px rgba(0,0,0,.7);box-shadow:0 5px 15px rgba(0,0,0,.7);background:#fcfcfc;-webkit-font-smoothing:subpixel-antialiased}.media-modal-content .media-frame select.attachment-filters{margin-top:11px;margin-right:2%;width:42%;width:-webkit-calc(48% - 12px);width:calc(48% - 12px)}.media-modal-content .media-toolbar-primary .media-button{float:right}.media-modal-content .attachments-browser .search{width:100%}.wp-core-ui .media-modal-icon{background-image:url(../images/uploader-icons.png);background-repeat:no-repeat}.media-toolbar{position:absolute;top:0;left:0;right:0;z-index:100;height:60px;padding:0 16px;border:0 solid #ddd;overflow:hidden}.media-frame-toolbar .media-toolbar{top:initial;bottom:-45px;height:auto;overflow:initial;border-top:1px solid #ddd}.media-menu,.media-sidebar{top:0;background:#f3f3f3;right:0}@media screen and (max-width:782px){.media-frame-toolbar .media-toolbar{bottom:-48px}}.media-toolbar-primary{float:right;height:100%}.media-toolbar-secondary{float:left;height:100%}.media-toolbar-primary>.media-button,.media-toolbar-primary>.media-button-group{margin-left:10px;float:left;margin-top:15px}.media-toolbar-secondary>.media-button,.media-toolbar-secondary>.media-button-group{margin-right:10px;margin-top:15px}.media-sidebar{position:absolute;bottom:0;width:267px;padding:0 16px 24px;z-index:75;border-left:1px solid #ddd;overflow:auto;-webkit-overflow-scrolling:touch}.hide-toolbar .media-sidebar{bottom:0}.media-sidebar .sidebar-title{font-size:20px;margin:0;padding:12px 10px 10px;line-height:28px}.media-sidebar .sidebar-content{padding:0 10px;margin-bottom:130px}.media-sidebar .search{display:block;width:100%}.image-details h2,.image-details h3,.media-sidebar h2,.media-sidebar h3{position:relative;font-weight:600;text-transform:uppercase;font-size:12px;color:#666;margin:24px 0 8px}.attachment-details .setting,.media-sidebar .setting{display:block;float:left;width:100%;margin:1px 0}.attachment-details .setting label,.media-sidebar .setting label{display:block}.attachment-details .setting .link-to-custom,.media-sidebar .setting .link-to-custom{margin:3px 2px 0}.attachment-details .setting span,.media-sidebar .setting span{min-width:30%;margin-right:4%;font-size:12px;text-align:right;word-wrap:break-word}.media-sidebar .setting .name{max-width:80px}.attachment-details .setting select,.media-sidebar .setting select{max-width:65%}.attachment-details .field input[type=radio],.attachment-details .field input[type=checkbox],.attachment-details .setting input[type=radio],.attachment-details .setting input[type=checkbox],.media-sidebar .field input[type=radio],.media-sidebar .field input[type=checkbox],.media-sidebar .setting input[type=radio],.media-sidebar .setting input[type=checkbox]{float:none;margin:8px 3px 0;padding:0}.attachment-details .setting span,.compat-item label span,.media-sidebar .setting span{float:left;min-height:22px;padding-top:8px;line-height:16px;font-weight:400;color:#666}.media-menu>a,.media-router>a{line-height:18px;font-size:14px;text-decoration:none}.compat-item label span{text-align:right}.attachment-details .setting .value,.attachment-details .setting input[type=tel],.attachment-details .setting input[type=text],.attachment-details .setting input[type=password],.attachment-details .setting input[type=number],.attachment-details .setting input[type=search],.attachment-details .setting input[type=email],.attachment-details .setting input[type=url],.attachment-details .setting textarea,.media-sidebar .setting .value,.media-sidebar .setting input[type=tel],.media-sidebar .setting input[type=text],.media-sidebar .setting input[type=password],.media-sidebar .setting input[type=number],.media-sidebar .setting input[type=search],.media-sidebar .setting input[type=email],.media-sidebar .setting input[type=url],.media-sidebar .setting textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:1px;width:65%;float:right}.attachment-details .setting .value,.media-sidebar .setting .value{margin:0 1px;text-align:left}.attachment-details .setting textarea,.compat-item .field textarea,.media-sidebar .setting textarea{height:62px;resize:vertical}.attachment-details select,.media-sidebar select{margin-top:3px}.compat-item{float:left;width:100%;overflow:hidden}.compat-item table{width:100%;table-layout:fixed;border-spacing:0;border:0}.compat-item tr{padding:2px 0;display:block;overflow:hidden}.compat-item .field,.compat-item .label{display:block;margin:0;padding:0}.compat-item .label{min-width:30%;margin-right:4%;float:left;text-align:right}.compat-item .label span{display:block;width:100%}.compat-item .field{float:right;width:65%;margin:1px}.compat-item .field input[type=tel],.compat-item .field input[type=text],.compat-item .field input[type=password],.compat-item .field input[type=number],.compat-item .field input[type=search],.compat-item .field input[type=email],.compat-item .field input[type=url],.compat-item .field textarea{width:100%;margin:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.sidebar-for-errors .attachment-details,.sidebar-for-errors .compat-item,.sidebar-for-errors .media-sidebar .media-progress-bar,.sidebar-for-errors .upload-details{display:none!important}.media-menu{position:absolute;left:0;bottom:0;margin:0;padding:10px 0;border-right-width:1px;border-right-style:solid;border-right-color:#ccc;user-select:none}.media-menu>a{display:block;position:relative;padding:8px 20px;margin:0;color:#0073aa}.media-frame-title .dashicons,.media-frame.hide-router .media-frame-router{display:none}.media-menu>a:hover{color:#0073aa;background:rgba(0,0,0,.04)}.media-menu>a:active{outline:0}.media-menu .active,.media-menu .active:hover{color:#23282d;font-weight:600}.media-menu .separator{height:0;margin:12px 20px;padding:0;border-top:1px solid #ddd}.media-router{position:relative;padding:0 6px;margin:0;clear:both;user-select:none}.media-router a{-webkit-transition:none;transition:none}.media-router>a{position:relative;float:left;padding:8px 10px 9px;margin:0;height:18px}.media-frame,.media-frame-menu{position:absolute;left:0;bottom:0;top:0}.media-router>a:last-child{border-right:0}.media-router>a:active{outline:0}.media-router .active,.media-router .active:hover{color:#32373c}.media-router .active,.media-router>a.active:last-child{margin:-1px -1px 0;background:#fff;border:1px solid #ddd;border-bottom:none}.media-router .active:after{display:none}.media-frame{overflow:hidden;right:0}.media-frame-menu{width:200px;z-index:150}.media-frame-router,.media-frame-title{position:absolute;left:200px;right:0;z-index:200}.media-frame-title{top:0;height:50px}.media-frame-router{top:50px;height:36px}.media-frame-content,.media-frame-toolbar{left:200px;height:auto;position:absolute;right:0}.media-frame-content{top:84px;bottom:61px;width:auto;margin:0;overflow:auto;background:#fff;border-top:1px solid #ddd}.media-frame-toolbar{z-index:100;bottom:60px}.media-frame.hide-menu .media-frame-content,.media-frame.hide-menu .media-frame-router,.media-frame.hide-menu .media-frame-title,.media-frame.hide-menu .media-frame-toolbar{left:0}.media-frame.hide-menu .media-frame-menu{left:-200px}.media-frame.hide-toolbar .media-frame-content{bottom:0}.media-frame.hide-toolbar .media-frame-toolbar{bottom:-61px}.media-frame.hide-router .media-frame-content{top:50px}.media-frame.hide-router .media-frame-title{border-bottom:1px solid #ddd;-webkit-box-shadow:0 4px 4px -4px rgba(0,0,0,.1);box-shadow:0 4px 4px -4px rgba(0,0,0,.1)}.media-frame-title h1{padding:0 16px;font-size:22px;line-height:50px;margin:0}.media-frame-title .suggested-dimensions{font-size:14px;float:right;margin-right:20px}.media-frame-content .crop-content{height:100%}.wp-customizer:not(.mobile) .media-frame-content .crop-content.site-icon{margin-right:300px}.media-frame-content .crop-content .crop-image{display:block;margin:auto;max-width:100%;max-height:100%}.media-frame-content .crop-content .upload-errors{position:absolute;width:300px;top:50%;left:50%;margin-left:-150px;margin-right:-150px;z-index:600000}.media-frame .media-iframe{overflow:hidden}.media-frame .media-iframe,.media-frame .media-iframe iframe{height:100%;width:100%;border:0}.media-frame select.attachment-filters{margin-top:11px;margin-right:2%;max-width:42%;max-width:-webkit-calc(48% - 12px);max-width:calc(48% - 12px)}.media-toolbar-primary .search,.wp-core-ui .attachment .portrait img{max-width:100%}.media-frame select.attachment-filters:last-of-type{margin-right:0}.media-frame .search{margin-top:11px;padding:4px;font-size:13px;color:#444;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;-webkit-appearance:none}.wp-core-ui .attachments{margin:0;-webkit-overflow-scrolling:touch}.wp-core-ui .attachment{position:relative;float:left;padding:8px;margin:0;color:#444;cursor:pointer;list-style:none;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:25%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.wp-core-ui .attachment.details:focus,.wp-core-ui .attachment:focus,.wp-core-ui .selected.attachment:focus{-webkit-box-shadow:inset 0 0 2px 3px #fff,inset 0 0 0 7px #5b9dd9;box-shadow:inset 0 0 2px 3px #fff,inset 0 0 0 7px #5b9dd9;outline:0}.wp-core-ui .selected.attachment{-webkit-box-shadow:inset 0 0 0 5px #fff,inset 0 0 0 7px #ccc;box-shadow:inset 0 0 0 5px #fff,inset 0 0 0 7px #ccc}.wp-core-ui .attachment.details{-webkit-box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #0073aa;box-shadow:inset 0 0 0 3px #fff,inset 0 0 0 7px #0073aa}.wp-core-ui .attachment-preview{position:relative;-webkit-box-shadow:inset 0 0 15px rgba(0,0,0,.1),inset 0 0 0 1px rgba(0,0,0,.05);box-shadow:inset 0 0 15px rgba(0,0,0,.1),inset 0 0 0 1px rgba(0,0,0,.05);background:#eee;cursor:pointer}.wp-core-ui .attachment-preview:before{content:"";display:block;padding-top:100%}.wp-core-ui .attachment .icon{margin:0 auto;overflow:hidden}.wp-core-ui .attachment .thumbnail{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;opacity:1;-webkit-transition:opacity .1s;transition:opacity .1s}.wp-core-ui .attachment .landscape img{max-height:100%}.wp-core-ui .attachment .thumbnail:after{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);overflow:hidden}.wp-core-ui .attachment .thumbnail img{top:0;left:0}.wp-core-ui .attachment .thumbnail .centered{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-transform:translate(50%,50%);-ms-transform:translate(50%,50%);transform:translate(50%,50%)}.wp-core-ui .attachment .thumbnail .centered img{-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.wp-core-ui .attachments-browser .attachment .thumbnail .centered img.icon{-webkit-transform:translate(-50%,-70%);-ms-transform:translate(-50%,-70%);transform:translate(-50%,-70%)}.ie8 .wp-core-ui .attachment img.icon{top:20%;position:relative}.wp-core-ui .attachment .filename{position:absolute;left:0;right:0;bottom:0;overflow:hidden;max-height:100%;word-wrap:break-word;text-align:center;font-weight:600;background:rgba(255,255,255,.8);-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);box-shadow:inset 0 0 0 1px rgba(0,0,0,.15)}.wp-core-ui .attachment .filename div{padding:5px 10px}.wp-core-ui .attachment .thumbnail img{position:absolute}.wp-core-ui .attachment-close{display:block;position:absolute;top:5px;right:5px;height:22px;width:22px;padding:0;background-color:#fff;background-position:-96px 4px;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.3);box-shadow:0 0 0 1px rgba(0,0,0,.3)}.wp-core-ui .attachment-close:focus,.wp-core-ui .attachment-close:hover{background-position:-36px 4px}.wp-core-ui .attachment .check{display:none;height:24px;width:24px;padding:0;position:absolute;z-index:10;top:0;right:0;outline:0;background:#eee;-webkit-box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,0,0,.15);box-shadow:0 0 0 1px #fff,0 0 0 2px rgba(0,0,0,.15)}.wp-core-ui .attachment .check .media-modal-icon{display:block;background-position:-1px 0;height:15px;width:15px;margin:5px}.wp-core-ui .attachment .check:hover .media-modal-icon{background-position:-40px 0}.wp-core-ui .attachment.selected .check{display:block}.wp-core-ui .attachment.details .check,.wp-core-ui .attachment.selected .check:focus,.wp-core-ui .media-frame.mode-grid .attachment.selected .check{background-color:#0073aa;-webkit-box-shadow:0 0 0 1px #fff,0 0 0 2px #0073aa;box-shadow:0 0 0 1px #fff,0 0 0 2px #0073aa}.wp-core-ui .attachment.details .check .media-modal-icon,.wp-core-ui .media-frame.mode-grid .attachment.selected .check .media-modal-icon{background-position:-21px 0}.wp-core-ui .attachment.details .check:hover .media-modal-icon,.wp-core-ui .attachment.selected .check:focus .media-modal-icon,.wp-core-ui .media-frame.mode-grid .attachment.selected .check:hover .media-modal-icon{background-position:-60px 0}.wp-core-ui .media-frame .attachment .describe{position:relative;display:block;width:100%;margin:0;padding:8px;font-size:12px;-webkit-border-radius:0;border-radius:0}.media-frame .attachments-browser{position:relative;width:100%;height:100%;overflow:hidden}.attachments-browser .media-toolbar{right:300px;height:50px}.attachments-browser.hide-sidebar .media-toolbar{right:0}.attachments-browser .media-toolbar-primary>.media-button,.attachments-browser .media-toolbar-primary>.media-button-group,.attachments-browser .media-toolbar-secondary>.media-button,.attachments-browser .media-toolbar-secondary>.media-button-group{margin:11px 0}.attachments-browser .attachments{padding:2px 8px 8px}.attachments-browser .attachments,.attachments-browser .uploader-inline{position:absolute;top:50px;left:0;right:300px;bottom:0;overflow:auto;outline:0}.attachments-browser .uploader-inline.hidden{display:none}.attachments-browser .media-toolbar-primary{max-width:33%}.attachments-browser .media-toolbar-secondary{max-width:66%}.uploader-inline .close{background-color:transparent;border:0;cursor:pointer;height:48px;position:absolute;right:0;text-align:center;top:0;width:50px;z-index:1}.uploader-inline .close:before{font:400 30px/50px dashicons!important;color:#72777c;display:inline-block;content:"\f335";font-weight:300}.attachments-browser.hide-sidebar .attachments,.attachments-browser.hide-sidebar .uploader-inline{right:0;margin-right:0}.attachments-browser .instructions{display:inline-block;margin-top:16px;line-height:18px;font-size:13px;color:#666;margin-right:.5em}.attachments-browser .no-media{padding:2em 0 0 2em}.media-progress-bar{position:relative;height:10px;width:70%;margin:10px auto;-webkit-border-radius:10px;border-radius:10px;background:#ddd;background:rgba(0,0,0,.1)}.media-progress-bar div{height:10px;min-width:20px;width:0;background:#0073aa;-webkit-border-radius:10px;border-radius:10px;-webkit-transition:width .3s;transition:width .3s}.media-uploader-status .media-progress-bar{display:none;width:100%}.uploading.media-uploader-status .media-progress-bar{display:block}.attachment-preview .media-progress-bar{position:absolute;top:50%;left:15%;width:70%;margin:-5px 0 0}.media-uploader-status{position:relative;margin:0 auto;padding-bottom:10px;max-width:400px}.uploader-inline .media-uploader-status h2,.uploader-inline .media-uploader-status h3{display:none}.media-uploader-status .upload-details{display:none;font-size:12px;color:#666}.uploading.media-uploader-status .upload-details{display:block}.media-uploader-status .upload-detail-separator{padding:0 4px}.media-uploader-status .upload-count{color:#444}.media-uploader-status .upload-dismiss-errors,.media-uploader-status .upload-errors{display:none}.errors.media-uploader-status .upload-dismiss-errors,.errors.media-uploader-status .upload-errors{display:block}.media-uploader-status .upload-dismiss-errors{text-decoration:none}.media-sidebar .media-uploader-status .upload-dismiss-errors{position:absolute;top:0;right:0}.upload-errors .upload-error{padding:12px;margin-bottom:12px;background:#fff;border-left:4px solid #dc3232;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,.1);box-shadow:0 1px 1px 0 rgba(0,0,0,.1)}.uploader-inline .upload-errors .upload-error{background-color:#fbeaea;-webkit-box-shadow:none;box-shadow:none}.upload-errors .upload-error-filename{font-weight:600}.upload-errors .upload-error-message{display:block;padding-top:8px;word-wrap:break-word}.uploader-window{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,86,132,.9);z-index:250000;display:none;text-align:center;opacity:0;-webkit-transition:opacity 250ms;transition:opacity 250ms}.uploader-window-content{position:absolute;top:10px;left:10px;right:10px;bottom:10px;border:1px dashed #fff}.uploader-window h1,.uploader-window h3{margin:-.5em 0 0;position:absolute;top:50%;left:0;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);font-size:40px;color:#fff;padding:0}.uploader-window .media-progress-bar{margin-top:20px;max-width:300px;background:0 0;border-color:#fff;display:none}.uploader-window .media-progress-bar div{background:#fff}.uploading .uploader-window .media-progress-bar{display:block}.media-frame .uploader-inline{margin-bottom:20px;padding:0;text-align:center}.uploader-inline-content{position:absolute;top:30%;left:0;right:0}.uploader-inline-content .upload-ui{margin:2em 0}.uploader-inline-content .post-upload-ui{margin-bottom:2em}.uploader-inline .has-upload-message .upload-ui{margin:0 0 4em}.uploader-inline h2,.uploader-inline h3{font-size:20px;line-height:28px;font-weight:400;margin:0}.uploader-inline .has-upload-message .upload-instructions{font-size:14px;color:#444;font-weight:400}.uploader-inline .drop-instructions{display:none}.supports-drag-drop .uploader-inline .drop-instructions{display:block}.uploader-inline p{font-size:12px;margin:.5em 0}.uploader-inline .media-progress-bar{display:none}.uploading.uploader-inline .media-progress-bar{display:block}.uploader-inline .browser{display:inline-block!important}.media-selection{position:absolute;top:0;left:0;right:350px;height:60px;padding:0 0 0 16px;overflow:hidden;white-space:nowrap}.media-selection .selection-info{display:inline-block;font-size:12px;height:60px;margin-right:10px;vertical-align:top}.media-selection.editing,.media-selection.empty,.media-selection.one .edit-selection{display:none}.media-selection .count{display:block;padding-top:12px;font-size:14px;line-height:20px;font-weight:600}.media-selection .attachments,.media-selection .selection-view{display:inline-block;vertical-align:top}.media-selection .button-link{float:left;padding:1px 8px;margin:1px 8px 1px -8px;line-height:16px;border-right:1px solid #ddd;color:#0073aa}.media-selection .button-link:focus,.media-selection .button-link:hover{color:#00a0d2}.media-selection .button-link:last-child{border-right:0;margin-right:0}.selection-info .clear-selection{color:#bc0b0b}.selection-info .clear-selection:focus,.selection-info .clear-selection:hover{color:red}.media-selection .attachments{height:48px;margin:6px;padding:0;overflow:hidden}.media-selection .attachment{width:40px;padding:0;margin:4px}.media-selection .attachment .thumbnail{top:0;right:0;bottom:0;left:0}.media-selection .attachment .icon{width:50%}.media-selection .attachment-preview{-webkit-box-shadow:none;box-shadow:none;background:0 0}.wp-core-ui .media-selection .attachment.details:focus,.wp-core-ui .media-selection .attachment:focus,.wp-core-ui .media-selection .selected.attachment:focus{-webkit-box-shadow:0 0 0 1px #fff,0 0 2px 3px #5b9dd9;box-shadow:0 0 0 1px #fff,0 0 2px 3px #5b9dd9}.wp-core-ui .media-selection .selected.attachment{-webkit-box-shadow:none;box-shadow:none}.wp-core-ui .media-selection .attachment.details{-webkit-box-shadow:0 0 0 1px #fff,0 0 0 3px #0073aa;box-shadow:0 0 0 1px #fff,0 0 0 3px #0073aa}.media-selection:after{content:"";display:block;position:absolute;top:0;right:0;bottom:0;width:25px;background-image:-webkit-gradient(linear,right top,left top,from(rgba(255,255,255,1)),to(rgba(255,255,255,0)));background-image:-webkit-linear-gradient(right,rgba(255,255,255,1),rgba(255,255,255,0));background-image:linear-gradient(to left,rgba(255,255,255,1),rgba(255,255,255,0))}.media-selection .attachment .filename{display:none}.media-frame .spinner{background:url(../images/spinner.gif) no-repeat;-webkit-background-size:20px 20px;background-size:20px 20px;float:right;display:inline-block;visibility:hidden;opacity:.7;filter:alpha(opacity=70);width:20px;height:20px;margin:0;vertical-align:middle}.attachment-details.save-waiting .settings-save-status .spinner,.media-frame .embed-loading .embed-url .spinner,.media-frame .spinner.is-active{visibility:visible}.media-toolbar .spinner{margin-top:14px}.attachment-details{position:relative;overflow:auto}.attachment-details .settings-save-status{float:right;text-transform:none;z-index:10}.attachment-details .settings-save-status .spinner{margin-left:5px}.attachment-details .settings-save-status .saved{float:right;display:none}.attachment-details.save-complete .settings-save-status .saved{display:block}.attachment-info{overflow:hidden;min-height:60px;margin-bottom:16px;line-height:18px;color:#666;border-bottom:1px solid #ddd;padding-bottom:11px}.attachment-info .filename{font-weight:600;color:#444;word-wrap:break-word}.attachment-info .thumbnail{position:relative;float:left;max-width:120px;max-height:120px;margin-top:5px;margin-right:10px;margin-bottom:5px}.uploading .attachment-info .thumbnail{width:120px;height:80px;-webkit-box-shadow:inset 0 0 15px rgba(0,0,0,.1);box-shadow:inset 0 0 15px rgba(0,0,0,.1)}.uploading .attachment-info .media-progress-bar{margin-top:35px}.attachment-info .thumbnail-image:after{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);overflow:hidden}.attachment-info .thumbnail img{display:block;max-width:120px;max-height:120px;margin:0 auto}.attachment-info .details{float:left;font-size:12px;max-width:100%}.attachment-info .delete-attachment,.attachment-info .edit-attachment,.attachment-info .trash-attachment,.attachment-info .untrash-attachment{display:block;text-decoration:none;white-space:nowrap}.attachment-details.needs-refresh .attachment-info .edit-attachment{display:none}.attachment-info .edit-attachment{display:block}.media-modal .delete-attachment,.media-modal .trash-attachment,.media-modal .untrash-attachment{display:inline;padding:0;color:#bc0b0b}.media-modal .delete-attachment:focus,.media-modal .delete-attachment:hover,.media-modal .trash-attachment:focus,.media-modal .trash-attachment:hover,.media-modal .untrash-attachment:focus,.media-modal .untrash-attachment:hover{color:red}.attachment-display-settings{width:100%;float:left;overflow:hidden}.attachment-display-settings h4{margin:1.4em 0 .4em}.collection-settings{overflow:hidden}.collection-settings .setting input[type=checkbox]{float:left;margin-right:8px}.collection-settings .setting span{min-width:inherit}.media-modal .imgedit-wrap{position:static}.media-modal .imgedit-wrap .imgedit-panel-content{padding:16px;position:absolute;top:0;right:282px;bottom:0;left:0;overflow:auto}.media-modal .imgedit-wrap .imgedit-settings{background:#f3f3f3;border-left:1px solid #ddd;padding:20px 16px 16px;position:absolute;top:0;right:0;bottom:0;width:250px;overflow:auto}.media-modal .imgedit-group{background:0 0;border:none;border-bottom:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none;margin:0 0 16px;padding:0 0 16px;position:relative}.media-modal .imgedit-group:last-of-type{border:none;margin:0;padding:0}.media-modal .imgedit-group-top{margin:0}.media-modal .imgedit-group-top h2,.media-modal .imgedit-group-top h2 .button-link,.media-modal .imgedit-group-top h3{display:inline-block;text-transform:uppercase;font-size:12px;color:#666;margin:3px 0 0}.embed-url,.imgedit-thumbnail-preview-caption{display:block}.media-modal .imgedit-group-top h2 .button-link,.media-modal .imgedit-group-top h2 a,.media-modal .imgedit-group-top h3 a{text-decoration:none;color:#666}.wp-core-ui.media-modal .image-editor .imgedit-help-toggle,.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:active,.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:hover{border:1px solid transparent;margin:0;padding:0;background:0 0;color:#0074a2;font-size:20px;line-height:1;cursor:pointer;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-box-shadow:none;box-shadow:none}.wp-core-ui.media-modal .image-editor .imgedit-help-toggle:focus{color:#0074a2;border-color:#5b9dd9;outline:0;-webkit-box-shadow:0 0 3px rgba(0,115,170,.8);box-shadow:0 0 3px rgba(0,115,170,.8)}.wp-core-ui.media-modal .imgedit-group-top .dashicons-arrow-down.imgedit-help-toggle{margin-top:-3px}.wp-core-ui.media-modal .image-editor h3 .imgedit-help-toggle{margin-top:-2px}.media-modal .imgedit-help-toggled span.dashicons:before{content:"\f142"}.media-modal .imgedit-thumbnail-preview{margin:10px 8px 0 0}.media-modal .imgedit-wrap div.updated{margin:0 0 16px}.embed-url{position:relative;padding:16px;margin:0;z-index:250;background:#fff;font-size:18px}.media-frame .embed-url input{font-size:18px;padding:12px 14px;width:100%;min-width:200px;-webkit-box-shadow:inset 2px 2px 4px -2px rgba(0,0,0,.1);box-shadow:inset 2px 2px 4px -2px rgba(0,0,0,.1)}.media-frame .embed-url .spinner{position:absolute;top:32px;right:26px}.embed-link-settings,.embed-media-settings{position:absolute;top:70px;left:0;right:0;bottom:0;padding:16px 16px 32px;overflow:auto}.media-embed .embed-link-settings{overflow:visible}.embed-preview embed,.embed-preview iframe,.embed-preview img,.mejs-container video{max-width:100%;vertical-align:middle}.embed-preview a{display:inline-block}.embed-preview img{display:block;height:auto}.mejs-container:focus{outline:#5b9dd9 solid 1px;-webkit-box-shadow:0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 2px 1px rgba(30,140,190,.8)}.image-details .media-modal{left:140px;right:140px}.image-details .media-frame-content,.image-details .media-frame-router,.image-details .media-frame-title{left:0}.image-details .embed-media-settings{top:0;overflow:visible;padding:0}.image-details .embed-media-settings,.image-details .embed-media-settings div{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.image-details .column-settings{background:#f3f3f3;border-right:1px solid #ddd;min-height:100%;width:55%;position:absolute;top:0;left:0}.image-details .column-settings h2,.image-details .column-settings h3{margin:20px;padding-top:20px;border-top:1px solid #ddd;color:#23282d}.image-details .column-image{width:45%;position:absolute;left:55%;top:0}.image-details .image{margin:20px}.image-details .image img{max-width:100%;max-height:500px}.image-details .advanced-toggle{padding:0;color:#666;text-transform:uppercase}.image-details .advanced-toggle:after{font:400 20px/1 dashicons;speak:none;vertical-align:top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f140";display:inline-block;margin-top:-2px}.image-details .advanced-visible .advanced-toggle:after{content:"\f142"}.image-details .embed-media-settings .size{margin-bottom:4px}.image-details .custom-size span{display:block}.image-details .custom-size label{display:block;float:left}.image-details .custom-size span small{color:#555d66;font-size:inherit}.image-details .custom-size input{width:5em}.image-details .custom-size .sep{float:left;margin:26px 6px 0}.image-details .custom-size:after{content:"";display:table;clear:both}.media-embed .thumbnail{max-width:100%;max-height:200px;position:relative;float:left}.media-embed .thumbnail img{max-height:200px;display:block}.media-embed .thumbnail:after{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);overflow:hidden}.media-embed .setting{width:100%;margin:10px 0;float:left;display:block;clear:both}.image-details .embed-media-settings .setting{float:none;width:auto}.image-details .actions{margin:10px 0}.image-details .hidden{display:none}.media-embed .setting input[type=text],.media-embed .setting textarea{display:block;width:100%;max-width:400px;margin:1px 0}.image-details .embed-media-settings .setting input[type=text],.image-details .embed-media-settings .setting textarea{max-width:inherit;width:70%}.image-details .embed-media-settings .custom-size,.image-details .embed-media-settings .link-target,.image-details .embed-media-settings .setting input.link-to-custom{margin-left:27%;width:70%}.image-details .embed-media-settings .link-target{margin-top:24px}.media-embed .setting input.hidden,.media-embed .setting textarea.hidden{display:none}.media-embed .setting span{display:block;width:200px;font-size:13px;line-height:24px;color:#666}.image-details .embed-media-settings .setting span{float:left;width:25%;text-align:right;margin:8px 1% 0;line-height:1.1}.media-embed .setting .button-group{margin:2px 0}.media-embed-sidebar{position:absolute;top:0;left:440px}.advanced-section,.link-settings{margin-top:10px}.wp-editor-wrap .uploader-editor{background:rgba(150,150,150,.9);position:absolute;top:0;left:0;width:100%;height:100%;z-index:99998;display:none;text-align:center}.wp-editor-wrap .uploader-editor-content{border:1px dashed #fff;position:absolute;top:10px;left:10px;right:10px;bottom:10px}.wp-editor-wrap .uploader-editor .uploader-editor-title{position:absolute;top:50%;left:0;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);font-size:3em;line-height:1.3;font-weight:600;color:#fff;padding:0;margin:0;display:none}.wp-editor-wrap .uploader-editor.droppable{background:rgba(0,86,132,.9)}.wp-editor-wrap .uploader-editor.droppable .uploader-editor-title{display:block}.ie7 .media-frame .attachments-browser{position:static}.ie7 .media-frame .embed-url input{margin-top:4px;width:90%}.ie7 .compat-item{width:99%}.ie7 .attachment-display-settings{width:auto}.ie7 .attachment-preview,.ie7 .attachment-preview .thumbnail{width:120px;height:120px}.ie7 .media-frame .attachment .describe{width:102px}.ie7 .media-sidebar .setting select{max-width:55%}.ie7 .media-sidebar .setting input[type=tel],.ie7 .media-sidebar .setting input[type=text],.ie7 .media-sidebar .setting input[type=password],.ie7 .media-sidebar .setting input[type=number],.ie7 .media-sidebar .setting input[type=search],.ie7 .media-sidebar .setting input[type=email],.ie7 .media-sidebar .setting input[type=url],.ie7 .media-sidebar .setting textarea{width:55%}.ie7 .media-sidebar .setting .link-to-custom{float:left}.rtl .media-frame,.rtl .media-frame .search,.rtl .media-frame input[type=tel],.rtl .media-frame input[type=text],.rtl .media-frame input[type=password],.rtl .media-frame input[type=number],.rtl .media-frame input[type=search],.rtl .media-frame input[type=email],.rtl .media-frame input[type=url],.rtl .media-frame select,.rtl .media-frame textarea,.rtl .media-modal{font-family:Tahoma,sans-serif}:lang(he-il) .rtl .media-frame,:lang(he-il) .rtl .media-frame .search,:lang(he-il) .rtl .media-frame input[type=text],:lang(he-il) .rtl .media-frame input[type=password],:lang(he-il) .rtl .media-frame input[type=number],:lang(he-il) .rtl .media-frame input[type=search],:lang(he-il) .rtl .media-frame input[type=email],:lang(he-il) .rtl .media-frame input[type=url],:lang(he-il) .rtl .media-frame select,:lang(he-il) .rtl .media-frame textarea,:lang(he-il) .rtl .media-modal{font-family:Arial,sans-serif}@media only screen and (max-width:900px){.media-frame:not(.hide-menu) .media-frame-content,.media-frame:not(.hide-menu) .media-frame-router,.media-frame:not(.hide-menu) .media-frame-title,.media-frame:not(.hide-menu) .media-frame-toolbar{left:0}.media-frame:not(.hide-menu) .media-frame-menu{position:static;width:0}.media-frame:not(.hide-menu) .media-menu{width:auto;max-width:80%;overflow:auto;z-index:2000;top:50px;left:-300px;right:auto;bottom:auto;padding:5px 0;border:1px solid #ccc}.media-frame:not(.hide-menu) .media-menu.visible{left:0}.media-frame:not(.hide-menu) .media-menu>a{padding:12px 16px;font-size:16px}.media-frame:not(.hide-menu) .media-menu>a.active{display:none}.media-frame:not(.hide-menu) .media-menu .separator{margin:5px 10px}.media-frame:not(.hide-menu) .media-frame-title{left:0}.media-frame:not(.hide-menu) .media-frame-title .dashicons{display:inline-block;line-height:50px}.media-frame:not(.hide-menu) .media-frame-title h1{color:#0073aa;line-height:3;font-size:18px;float:left;cursor:pointer}.media-sidebar{width:230px}.attachments-browser .attachments,.attachments-browser .media-toolbar,.attachments-browser .uploader-inline{right:262px}.attachment-details .setting,.media-sidebar .setting{margin:6px 0}.attachment-details .setting input,.attachment-details .setting span,.attachment-details .setting textarea,.compat-item label span,.media-sidebar .setting input,.media-sidebar .setting span,.media-sidebar .setting textarea{float:none}.attachment-details .setting span,.compat-item label span,.media-sidebar .setting span{text-align:inherit;min-height:16px;margin:0;padding:8px 2px 0}.attachment-details .setting .value,.media-sidebar .setting .value{float:none;width:auto}.attachment-details .setting input[type=tel],.attachment-details .setting input[type=text],.attachment-details .setting input[type=password],.attachment-details .setting input[type=number],.attachment-details .setting input[type=search],.attachment-details .setting input[type=email],.attachment-details .setting input[type=url],.attachment-details .setting select,.attachment-details .setting textarea,.media-sidebar .setting input[type=tel],.media-sidebar .setting input[type=text],.media-sidebar .setting input[type=password],.media-sidebar .setting input[type=number],.media-sidebar .setting input[type=search],.media-sidebar .setting input[type=email],.media-sidebar .setting input[type=url],.media-sidebar .setting select,.media-sidebar .setting textarea{float:none;width:98%;max-width:none;height:auto}.attachment-details .setting select.columns,.media-sidebar .setting select.columns{width:auto}.media-frame .search,.media-frame input,.media-frame textarea{padding:3px 6px}.image-details .column-image{width:30%;left:70%}.image-details .column-settings{width:70%}.image-details .media-modal{left:30px;right:30px}.image-details .embed-media-settings .setting{margin:20px}.image-details .embed-media-settings .setting span{float:none;text-align:left;width:100%;margin-bottom:4px}.image-details .embed-media-settings .setting input.link-to-custom,.image-details .embed-media-settings .setting input[type=text],.image-details .embed-media-settings .setting textarea{width:100%;margin-left:0}.image-details .embed-media-settings .custom-size{margin-left:20px}.collection-settings .setting input[type=checkbox]{margin-top:0}.media-selection{min-width:120px}.media-selection:after{background:0 0}.media-selection .attachments{display:none}.media-modal .attachments-browser .media-toolbar .search{max-width:100%;height:auto;float:right}.media-modal .attachments-browser .media-toolbar .attachment-filters{height:auto}.media-modal .attachments-browser .media-toolbar .spinner{margin:14px 2px 0}.media-frame input[type=text],.media-frame input[type=password],.media-frame input[type=number],.media-frame input[type=search],.media-frame input[type=email],.media-frame input[type=url],.media-frame select,.media-frame textarea{font-size:16px}}@media only screen and (max-width:640px),screen and (max-height:400px){.image-details .media-modal,.media-modal{position:fixed;top:0;left:0;right:0;bottom:0}.media-modal-backdrop{position:fixed}.media-sidebar{z-index:1900;max-width:70%;bottom:120%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding-bottom:0}.media-sidebar.visible{bottom:0}.attachments-browser .attachments,.attachments-browser .media-toolbar,.attachments-browser .uploader-inline{right:0}.image-details .media-frame-title{display:block;top:0;font-size:14px}.image-details .column-image,.image-details .column-settings{width:100%;position:relative;left:0}.image-details .column-settings{padding:4px 0}.media-frame-content .media-toolbar .instructions{display:none}}@media screen and (max-height:400px){.media-menu{padding:0}.media-frame-router{top:44px}.media-frame-content{top:78px}.attachments-browser .attachments{top:40px}.embed-link-settings{overflow:visible}}@media only screen and (max-width:480px){.media-modal-close{top:-5px}.media-modal .media-frame-title{height:40px}.wp-core-ui.wp-customizer .media-button{margin-top:13px}.media-frame:not(.hide-menu) .media-frame-title h1,.media-modal .media-frame-title h1{font-size:18px;line-height:40px}.media-frame:not(.hide-menu) .media-frame-title .dashicons{line-height:40px}.media-frame-router,.media-frame:not(.hide-menu) .media-menu{top:40px}.media-frame-content{top:74px}.media-frame.hide-router .media-frame-content{top:40px}}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){.wp-core-ui .media-modal-icon{background-image:url(../images/uploader-icons-2x.png);-webkit-background-size:134px 15px;background-size:134px 15px}.media-frame .spinner{background-image:url(../images/spinner-2x.gif)}}.media-frame-content[data-columns="1"] .attachment{width:100%}.media-frame-content[data-columns="2"] .attachment{width:50%}.media-frame-content[data-columns="3"] .attachment{width:33.33%}.media-frame-content[data-columns="4"] .attachment{width:25%}.media-frame-content[data-columns="5"] .attachment{width:20%}.media-frame-content[data-columns="6"] .attachment{width:16.66%}.media-frame-content[data-columns="7"] .attachment{width:14.28%}.media-frame-content[data-columns="8"] .attachment{width:12.5%}.media-frame-content[data-columns="9"] .attachment{width:11.11%}.media-frame-content[data-columns="10"] .attachment{width:10%}.media-frame-content[data-columns="11"] .attachment{width:9.09%}.media-frame-content[data-columns="12"] .attachment{width:8.33%} \ No newline at end of file diff --git a/wp/wp-includes/css/wp-auth-check-rtl.css b/wp/wp-includes/css/wp-auth-check-rtl.css deleted file mode 100644 index 855b04b5..00000000 --- a/wp/wp-includes/css/wp-auth-check-rtl.css +++ /dev/null @@ -1,125 +0,0 @@ -/*------------------------------------------------------------------------------ - Interim login dialog -------------------------------------------------------------------------------*/ - -#wp-auth-check-wrap.hidden { - display: none; -} - -#wp-auth-check-wrap #wp-auth-check-bg { - position: fixed; - top: 0; - bottom: 0; - right: 0; - left: 0; - background: #000; - opacity: 0.7; - filter: alpha(opacity=70); - z-index: 1000010; /* needs to appear above .notification-dialog */ -} - -#wp-auth-check-wrap #wp-auth-check { - position: fixed; - right: 50%; - overflow: hidden; - top: 40px; - bottom: 20px; - max-height: 415px; - width: 380px; - margin: 0 -190px 0 0; - padding: 30px 0 0; - background-color: #f1f1f1; - z-index: 1000011; /* needs to appear above #wp-auth-check-bg */ - -webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); - box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); -} - -@media screen and ( max-width: 380px ) { - #wp-auth-check-wrap #wp-auth-check { - right: 0; - width: 100%; - margin: 0; - } -} - -#wp-auth-check-wrap.fallback #wp-auth-check { - max-height: 180px; - overflow: auto; -} - -#wp-auth-check-wrap #wp-auth-check-form { - height: 100%; - position: relative; - overflow: auto; - -webkit-overflow-scrolling: touch; -} - -#wp-auth-check-form.loading:before { - content: ""; - display: block; - width: 20px; - height: 20px; - position: absolute; - right: 50%; - top: 50%; - margin: -10px -10px 0 0; - background: url(../images/spinner.gif) no-repeat center; - -webkit-background-size: 20px 20px; - background-size: 20px 20px; - -webkit-transform: translateZ(0); - transform: translateZ(0); -} - -@media print, - (-webkit-min-device-pixel-ratio: 1.25), - (min-resolution: 120dpi) { - - #wp-auth-check-form.loading:before { - background-image: url(../images/spinner-2x.gif); - } - -} - -#wp-auth-check-wrap #wp-auth-check-form iframe { - height: 98%; /* Scrollbar fix */ - width: 100%; -} - -#wp-auth-check-wrap .wp-auth-check-close { - position: absolute; - top: 5px; - left: 5px; - height: 22px; - width: 22px; - color: #72777c; - text-align: center; -} - -#wp-auth-check-wrap .wp-auth-check-close:before { - content: "\f158"; - font: normal 20px/22px dashicons; - speak: none; - -webkit-font-smoothing: antialiased !important; - -moz-osx-font-smoothing: grayscale; -} - -#wp-auth-check-wrap .wp-auth-check-close:hover, -#wp-auth-check-wrap .wp-auth-check-close:focus { - color: #0073aa; -} - -#wp-auth-check-wrap .wp-auth-fallback-expired { - outline: 0; -} - -#wp-auth-check-wrap .wp-auth-fallback { - font-size: 14px; - line-height: 21px; - padding: 0 25px; - display: none; -} - -#wp-auth-check-wrap.fallback .wp-auth-fallback, -#wp-auth-check-wrap.fallback .wp-auth-check-close { - display: block; -} diff --git a/wp/wp-includes/css/wp-auth-check-rtl.min.css b/wp/wp-includes/css/wp-auth-check-rtl.min.css deleted file mode 100644 index 8750e72c..00000000 --- a/wp/wp-includes/css/wp-auth-check-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -#wp-auth-check-wrap.hidden{display:none}#wp-auth-check-wrap #wp-auth-check-bg{position:fixed;top:0;bottom:0;right:0;left:0;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:1000010}#wp-auth-check-wrap #wp-auth-check{position:fixed;right:50%;overflow:hidden;top:40px;bottom:20px;max-height:415px;width:380px;margin:0 -190px 0 0;padding:30px 0 0;background-color:#f1f1f1;z-index:1000011;-webkit-box-shadow:0 3px 6px rgba(0,0,0,.3);box-shadow:0 3px 6px rgba(0,0,0,.3)}@media screen and (max-width:380px){#wp-auth-check-wrap #wp-auth-check{right:0;width:100%;margin:0}}#wp-auth-check-wrap.fallback #wp-auth-check{max-height:180px;overflow:auto}#wp-auth-check-wrap #wp-auth-check-form{height:100%;position:relative;overflow:auto;-webkit-overflow-scrolling:touch}#wp-auth-check-form.loading:before{content:"";display:block;width:20px;height:20px;position:absolute;right:50%;top:50%;margin:-10px -10px 0 0;background:url(../images/spinner.gif) center no-repeat;-webkit-background-size:20px 20px;background-size:20px 20px;-webkit-transform:translateZ(0);transform:translateZ(0)}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){#wp-auth-check-form.loading:before{background-image:url(../images/spinner-2x.gif)}}#wp-auth-check-wrap #wp-auth-check-form iframe{height:98%;width:100%}#wp-auth-check-wrap .wp-auth-check-close{position:absolute;top:5px;left:5px;height:22px;width:22px;color:#72777c;text-align:center}#wp-auth-check-wrap .wp-auth-check-close:before{content:"\f158";font:400 20px/22px dashicons;speak:none;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale}#wp-auth-check-wrap .wp-auth-check-close:focus,#wp-auth-check-wrap .wp-auth-check-close:hover{color:#0073aa}#wp-auth-check-wrap .wp-auth-fallback-expired{outline:0}#wp-auth-check-wrap .wp-auth-fallback{font-size:14px;line-height:21px;padding:0 25px;display:none}#wp-auth-check-wrap.fallback .wp-auth-check-close,#wp-auth-check-wrap.fallback .wp-auth-fallback{display:block} \ No newline at end of file diff --git a/wp/wp-includes/css/wp-auth-check.css b/wp/wp-includes/css/wp-auth-check.css deleted file mode 100644 index 5e37191d..00000000 --- a/wp/wp-includes/css/wp-auth-check.css +++ /dev/null @@ -1,125 +0,0 @@ -/*------------------------------------------------------------------------------ - Interim login dialog -------------------------------------------------------------------------------*/ - -#wp-auth-check-wrap.hidden { - display: none; -} - -#wp-auth-check-wrap #wp-auth-check-bg { - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - background: #000; - opacity: 0.7; - filter: alpha(opacity=70); - z-index: 1000010; /* needs to appear above .notification-dialog */ -} - -#wp-auth-check-wrap #wp-auth-check { - position: fixed; - left: 50%; - overflow: hidden; - top: 40px; - bottom: 20px; - max-height: 415px; - width: 380px; - margin: 0 0 0 -190px; - padding: 30px 0 0; - background-color: #f1f1f1; - z-index: 1000011; /* needs to appear above #wp-auth-check-bg */ - -webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); - box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); -} - -@media screen and ( max-width: 380px ) { - #wp-auth-check-wrap #wp-auth-check { - left: 0; - width: 100%; - margin: 0; - } -} - -#wp-auth-check-wrap.fallback #wp-auth-check { - max-height: 180px; - overflow: auto; -} - -#wp-auth-check-wrap #wp-auth-check-form { - height: 100%; - position: relative; - overflow: auto; - -webkit-overflow-scrolling: touch; -} - -#wp-auth-check-form.loading:before { - content: ""; - display: block; - width: 20px; - height: 20px; - position: absolute; - left: 50%; - top: 50%; - margin: -10px 0 0 -10px; - background: url(../images/spinner.gif) no-repeat center; - -webkit-background-size: 20px 20px; - background-size: 20px 20px; - -webkit-transform: translateZ(0); - transform: translateZ(0); -} - -@media print, - (-webkit-min-device-pixel-ratio: 1.25), - (min-resolution: 120dpi) { - - #wp-auth-check-form.loading:before { - background-image: url(../images/spinner-2x.gif); - } - -} - -#wp-auth-check-wrap #wp-auth-check-form iframe { - height: 98%; /* Scrollbar fix */ - width: 100%; -} - -#wp-auth-check-wrap .wp-auth-check-close { - position: absolute; - top: 5px; - right: 5px; - height: 22px; - width: 22px; - color: #72777c; - text-align: center; -} - -#wp-auth-check-wrap .wp-auth-check-close:before { - content: "\f158"; - font: normal 20px/22px dashicons; - speak: none; - -webkit-font-smoothing: antialiased !important; - -moz-osx-font-smoothing: grayscale; -} - -#wp-auth-check-wrap .wp-auth-check-close:hover, -#wp-auth-check-wrap .wp-auth-check-close:focus { - color: #0073aa; -} - -#wp-auth-check-wrap .wp-auth-fallback-expired { - outline: 0; -} - -#wp-auth-check-wrap .wp-auth-fallback { - font-size: 14px; - line-height: 21px; - padding: 0 25px; - display: none; -} - -#wp-auth-check-wrap.fallback .wp-auth-fallback, -#wp-auth-check-wrap.fallback .wp-auth-check-close { - display: block; -} diff --git a/wp/wp-includes/css/wp-auth-check.min.css b/wp/wp-includes/css/wp-auth-check.min.css deleted file mode 100644 index 7eecb91b..00000000 --- a/wp/wp-includes/css/wp-auth-check.min.css +++ /dev/null @@ -1 +0,0 @@ -#wp-auth-check-wrap.hidden{display:none}#wp-auth-check-wrap #wp-auth-check-bg{position:fixed;top:0;bottom:0;left:0;right:0;background:#000;opacity:.7;filter:alpha(opacity=70);z-index:1000010}#wp-auth-check-wrap #wp-auth-check{position:fixed;left:50%;overflow:hidden;top:40px;bottom:20px;max-height:415px;width:380px;margin:0 0 0 -190px;padding:30px 0 0;background-color:#f1f1f1;z-index:1000011;-webkit-box-shadow:0 3px 6px rgba(0,0,0,.3);box-shadow:0 3px 6px rgba(0,0,0,.3)}@media screen and (max-width:380px){#wp-auth-check-wrap #wp-auth-check{left:0;width:100%;margin:0}}#wp-auth-check-wrap.fallback #wp-auth-check{max-height:180px;overflow:auto}#wp-auth-check-wrap #wp-auth-check-form{height:100%;position:relative;overflow:auto;-webkit-overflow-scrolling:touch}#wp-auth-check-form.loading:before{content:"";display:block;width:20px;height:20px;position:absolute;left:50%;top:50%;margin:-10px 0 0 -10px;background:url(../images/spinner.gif) center no-repeat;-webkit-background-size:20px 20px;background-size:20px 20px;-webkit-transform:translateZ(0);transform:translateZ(0)}@media print,(-webkit-min-device-pixel-ratio:1.25),(min-resolution:120dpi){#wp-auth-check-form.loading:before{background-image:url(../images/spinner-2x.gif)}}#wp-auth-check-wrap #wp-auth-check-form iframe{height:98%;width:100%}#wp-auth-check-wrap .wp-auth-check-close{position:absolute;top:5px;right:5px;height:22px;width:22px;color:#72777c;text-align:center}#wp-auth-check-wrap .wp-auth-check-close:before{content:"\f158";font:400 20px/22px dashicons;speak:none;-webkit-font-smoothing:antialiased!important;-moz-osx-font-smoothing:grayscale}#wp-auth-check-wrap .wp-auth-check-close:focus,#wp-auth-check-wrap .wp-auth-check-close:hover{color:#0073aa}#wp-auth-check-wrap .wp-auth-fallback-expired{outline:0}#wp-auth-check-wrap .wp-auth-fallback{font-size:14px;line-height:21px;padding:0 25px;display:none}#wp-auth-check-wrap.fallback .wp-auth-check-close,#wp-auth-check-wrap.fallback .wp-auth-fallback{display:block} \ No newline at end of file diff --git a/wp/wp-includes/css/wp-embed-template-ie.css b/wp/wp-includes/css/wp-embed-template-ie.css deleted file mode 100644 index cec05c9e..00000000 --- a/wp/wp-includes/css/wp-embed-template-ie.css +++ /dev/null @@ -1,19 +0,0 @@ -.dashicons-no { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAQAAAAngNWGAAAAcElEQVR4AdXRVxmEMBAGwJMQCUhAIhKQECmRsFJwMFfp7HfP/E8pk0173CuKpt/0R+WaBaaZqogLagBMuh+DdoKbyRCwqZ/SnM0R5oQuZ2UHS8Z6k23qPxZCTrV5UlHMi8bsfHVXP7K/GXZHaTO7S54CWLdHlN2YIwAAAABJRU5ErkJggg==); -} - -.dashicons-admin-comments { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAATUlEQVR4AWMYWqCpvUcAiA8A8X9iMFStAD4DG0AKScQNVDZw1MBRAwvIMLCA5jmFlCD4AMQGlOTtBgoNwzQQ3TCKDaTcMMxYN2AYVgAAYPKsEBxN0PIAAAAASUVORK5CYII=); -} - -.wp-embed-comments a:hover .dashicons-admin-comments { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAATElEQVR4AWMYYqB4lQAQHwDi/8RgqFoBfAY2gBSSiBuobOCogaMGFpBhYAEdcwrhIPgAxAaU5O0GCg3DNBDdMIoNpNwwzFg3YBhWAABG71qAFYcFqgAAAABJRU5ErkJggg==); -} - -.dashicons-share { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAc0lEQVR4AWMYfqCpvccAiBcA8X8gfgDEBZQaeAFkGBoOoMR1/7HgDeQa2ECZgQiDHID4AMwAor0MCmBoQP+HBnwAskFQdgBRkQJViGk7wiAHUr21AYdhDTA1dDOQHl6mPFLokmwoT9j0z3qUFw70L77oDwAiuzCIub1XpQAAAABJRU5ErkJggg==); -} - -.wp-embed-share-dialog-open:hover .dashicons-share { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAc0lEQVR4AWMYhqB4lQEQLwDi/0D8AIgLKDXwAsgwNBxAiev+Y8EbyDWwgTIDEQY5APEBmAFEexkUwNCA/g8N+ABkg6DsAKIiBaoQ03aEQQ6kemsDDsMaYEroZiA9vEx5pNAl2VCesOmf9SgvHOhffNEfAAAMqPR5IEZH5wAAAABJRU5ErkJggg==); -} diff --git a/wp/wp-includes/css/wp-embed-template-ie.min.css b/wp/wp-includes/css/wp-embed-template-ie.min.css deleted file mode 100644 index fec8ab46..00000000 --- a/wp/wp-includes/css/wp-embed-template-ie.min.css +++ /dev/null @@ -1 +0,0 @@ -.dashicons-no{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAQAAAAngNWGAAAAcElEQVR4AdXRVxmEMBAGwJMQCUhAIhKQECmRsFJwMFfp7HfP/E8pk0173CuKpt/0R+WaBaaZqogLagBMuh+DdoKbyRCwqZ/SnM0R5oQuZ2UHS8Z6k23qPxZCTrV5UlHMi8bsfHVXP7K/GXZHaTO7S54CWLdHlN2YIwAAAABJRU5ErkJggg==)}.dashicons-admin-comments{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAATUlEQVR4AWMYWqCpvUcAiA8A8X9iMFStAD4DG0AKScQNVDZw1MBRAwvIMLCA5jmFlCD4AMQGlOTtBgoNwzQQ3TCKDaTcMMxYN2AYVgAAYPKsEBxN0PIAAAAASUVORK5CYII=)}.wp-embed-comments a:hover .dashicons-admin-comments{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAATElEQVR4AWMYYqB4lQAQHwDi/8RgqFoBfAY2gBSSiBuobOCogaMGFpBhYAEdcwrhIPgAxAaU5O0GCg3DNBDdMIoNpNwwzFg3YBhWAABG71qAFYcFqgAAAABJRU5ErkJggg==)}.dashicons-share{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAc0lEQVR4AWMYfqCpvccAiBcA8X8gfgDEBZQaeAFkGBoOoMR1/7HgDeQa2ECZgQiDHID4AMwAor0MCmBoQP+HBnwAskFQdgBRkQJViGk7wiAHUr21AYdhDTA1dDOQHl6mPFLokmwoT9j0z3qUFw70L77oDwAiuzCIub1XpQAAAABJRU5ErkJggg==)}.wp-embed-share-dialog-open:hover .dashicons-share{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAAc0lEQVR4AWMYhqB4lQEQLwDi/0D8AIgLKDXwAsgwNBxAiev+Y8EbyDWwgTIDEQY5APEBmAFEexkUwNCA/g8N+ABkg6DsAKIiBaoQ03aEQQ6kemsDDsMaYEroZiA9vEx5pNAl2VCesOmf9SgvHOhffNEfAAAMqPR5IEZH5wAAAABJRU5ErkJggg==)} \ No newline at end of file diff --git a/wp/wp-includes/css/wp-embed-template.css b/wp/wp-includes/css/wp-embed-template.css deleted file mode 100644 index 28e437c4..00000000 --- a/wp/wp-includes/css/wp-embed-template.css +++ /dev/null @@ -1,366 +0,0 @@ -html, body { - padding: 0; - margin: 0; -} - -body { - font-family: sans-serif; -} - -/* Text meant only for screen readers */ -.screen-reader-text { - clip: rect(1px, 1px, 1px, 1px); - height: 1px; - overflow: hidden; - position: absolute !important; - width: 1px; -} - -/* Dashicons */ -.dashicons { - display: inline-block; - width: 20px; - height: 20px; - background-color: transparent; - background-repeat: no-repeat; - -webkit-background-size: 20px 20px; - background-size: 20px; - background-position: center; - -webkit-transition: background .1s ease-in; - transition: background .1s ease-in; - position: relative; - top: 5px; -} - -.dashicons-no { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M15.55%2013.7l-2.19%202.06-3.42-3.65-3.64%203.43-2.06-2.18%203.64-3.43-3.42-3.64%202.18-2.06%203.43%203.64%203.64-3.42%202.05%202.18-3.64%203.43z%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E"); -} - -.dashicons-admin-comments { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E"); -} - -.wp-embed-comments a:hover .dashicons-admin-comments { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E"); -} - -.dashicons-share { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E"); - display: none; -} - -.js .dashicons-share { - display: inline-block; -} - -.wp-embed-share-dialog-open:hover .dashicons-share { - background-image: url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E"); -} - -.wp-embed { - padding: 25px; - font-size: 14px; - font-weight: 400; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - line-height: 1.5; - color: #82878c; - background: #fff; - border: 1px solid #e5e5e5; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: 0 1px 1px rgba(0, 0, 0, .05); - /* Clearfix */ - overflow: auto; - zoom: 1; -} - -.wp-embed a { - color: #82878c; - text-decoration: none; -} - -.wp-embed a:hover { - text-decoration: underline; -} - -.wp-embed-featured-image { - margin-bottom: 20px; -} - -.wp-embed-featured-image img { - width: 100%; - height: auto; - border: none; -} - -.wp-embed-featured-image.square { - float: left; - max-width: 160px; - margin-right: 20px; -} - -.wp-embed p { - margin: 0; -} - -p.wp-embed-heading { - margin: 0 0 15px; - font-weight: 600; - font-size: 22px; - line-height: 1.3; -} - -.wp-embed-heading a { - color: #32373c; -} - -.wp-embed .wp-embed-more { - color: #b4b9be; -} - -.wp-embed-footer { - display: table; - width: 100%; - margin-top: 30px; -} - -.wp-embed-site-icon { - position: absolute; - top: 50%; - left: 0; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - transform: translateY(-50%); - height: 25px; - width: 25px; - border: 0; -} - -.wp-embed-site-title { - font-weight: 600; - line-height: 25px; -} - -.wp-embed-site-title a { - position: relative; - display: inline-block; - padding-left: 35px; -} - -.wp-embed-site-title, -.wp-embed-meta { - display: table-cell; -} - -.wp-embed-meta { - text-align: right; - white-space: nowrap; - vertical-align: middle; -} - -.wp-embed-comments, -.wp-embed-share { - display: inline; -} - -.wp-embed-meta a:hover { - text-decoration: none; - color: #0073aa; -} - -.wp-embed-comments a { - line-height: 25px; - display: inline-block; -} - -.wp-embed-comments + .wp-embed-share { - margin-left: 10px; -} - -.wp-embed-share-dialog { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: #222; - background-color: rgba(10, 10, 10, 0.9); - color: #fff; - opacity: 1; - -webkit-transition: opacity .25s ease-in-out; - transition: opacity .25s ease-in-out; -} - -.wp-embed-share-dialog.hidden { - opacity: 0; - visibility: hidden; -} - -.wp-embed-share-dialog-open, -.wp-embed-share-dialog-close { - margin: -8px 0 0; - padding: 0; - background: transparent; - border: none; - cursor: pointer; - outline: none; -} - -.wp-embed-share-dialog-open .dashicons, -.wp-embed-share-dialog-close .dashicons { - padding: 4px; -} - -.wp-embed-share-dialog-open .dashicons { - top: 8px; -} - -.wp-embed-share-dialog-open:focus .dashicons, -.wp-embed-share-dialog-close:focus .dashicons { - -webkit-box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: 0 0 0 1px #5b9dd9, 0 0 2px 1px rgba(30, 140, 190, .8); - -webkit-border-radius: 100%; - border-radius: 100%; -} - -.wp-embed-share-dialog-close { - position: absolute; - top: 20px; - right: 20px; - font-size: 22px; -} - -.wp-embed-share-dialog-close:hover { - text-decoration: none; -} - -.wp-embed-share-dialog-close .dashicons { - height: 24px; - width: 24px; - -webkit-background-size: 24px 24px; - background-size: 24px; -} - -.wp-embed-share-dialog-content { - height: 100%; - -webkit-transform-style: preserve-3d; - transform-style: preserve-3d; - overflow: hidden; -} - -.wp-embed-share-dialog-text { - margin-top: 25px; - padding: 20px; -} - -.wp-embed-share-tabs { - margin: 0 0 20px; - padding: 0; - list-style: none; -} - -.wp-embed-share-tab-button { - display: inline-block; -} - -.wp-embed-share-tab-button button { - margin: 0; - padding: 0; - border: none; - background: transparent; - font-size: 16px; - line-height: 1.3; - color: #aaa; - cursor: pointer; - -webkit-transition: color .1s ease-in; - transition: color .1s ease-in; -} - -.wp-embed-share-tab-button [aria-selected="true"] { - color: #fff; -} - -.wp-embed-share-tab-button button:hover { - color: #fff; -} - -.wp-embed-share-tab-button + .wp-embed-share-tab-button { - margin: 0 0 0 10px; - padding: 0 0 0 11px; - border-left: 1px solid #aaa; -} - -.wp-embed-share-tab[aria-hidden="true"] { - display: none; -} - -p.wp-embed-share-description { - margin: 0; - font-size: 14px; - line-height: 1; - font-style: italic; - color: #aaa; -} - -.wp-embed-share-input { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - border: none; - height: 28px; - margin: 0 0 10px 0; - padding: 0 5px; - font-size: 14px; - font-weight: 400; - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - line-height: 1.5; - resize: none; - cursor: text; -} - -textarea.wp-embed-share-input { - height: 72px; -} - -html[dir="rtl"] .wp-embed-featured-image.square { - float: right; - margin-right: 0; - - margin-left: 20px; -} - -html[dir="rtl"] .wp-embed-site-title a { - padding-left: 0; - padding-right: 35px; -} - -html[dir="rtl"] .wp-embed-site-icon { - margin-right: 0; - margin-left: 10px; - left: auto; - right: 0; -} - -html[dir="rtl"] .wp-embed-meta { - text-align: left; -} - -html[dir="rtl"] .wp-embed-footer { -} - -html[dir="rtl"] .wp-embed-share { - margin-left: 0; - margin-right: 10px; -} - -html[dir="rtl"] .wp-embed-share-dialog-close { - right: auto; - left: 20px; -} - -html[dir="rtl"] .wp-embed-share-tab-button + .wp-embed-share-tab-button { - margin: 0 10px 0 0; - padding: 0 11px 0 0; - border-left: none; - border-right: 1px solid #aaa; -} diff --git a/wp/wp-includes/css/wp-embed-template.min.css b/wp/wp-includes/css/wp-embed-template.min.css deleted file mode 100644 index 95583758..00000000 --- a/wp/wp-includes/css/wp-embed-template.min.css +++ /dev/null @@ -1 +0,0 @@ -body,html{padding:0;margin:0}body{font-family:sans-serif}.wp-embed,.wp-embed-share-input{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif}.screen-reader-text{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px}.dashicons{display:inline-block;width:20px;height:20px;background-color:transparent;background-repeat:no-repeat;-webkit-background-size:20px 20px;background-size:20px;background-position:center;-webkit-transition:background .1s ease-in;transition:background .1s ease-in;position:relative;top:5px}.dashicons-no{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M15.55%2013.7l-2.19%202.06-3.42-3.65-3.64%203.43-2.06-2.18%203.64-3.43-3.42-3.64%202.18-2.06%203.43%203.64%203.64-3.42%202.05%202.18-3.64%203.43z%27%20fill%3D%27%23fff%27%2F%3E%3C%2Fsvg%3E")}.dashicons-admin-comments{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E")}.wp-embed-comments a:hover .dashicons-admin-comments{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M5%202h9q.82%200%201.41.59T16%204v7q0%20.82-.59%201.41T14%2013h-2l-5%205v-5H5q-.82%200-1.41-.59T3%2011V4q0-.82.59-1.41T5%202z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E")}.dashicons-share{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%2382878c%27%2F%3E%3C%2Fsvg%3E");display:none}.js .dashicons-share{display:inline-block}.wp-embed-share-dialog-open:hover .dashicons-share{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.5%2012q1.24%200%202.12.88T17.5%2015t-.88%202.12-2.12.88-2.12-.88T11.5%2015q0-.34.09-.69l-4.38-2.3Q6.32%2013%205%2013q-1.24%200-2.12-.88T2%2010t.88-2.12T5%207q1.3%200%202.21.99l4.38-2.3q-.09-.35-.09-.69%200-1.24.88-2.12T14.5%202t2.12.88T17.5%205t-.88%202.12T14.5%208q-1.3%200-2.21-.99l-4.38%202.3Q8%209.66%208%2010t-.09.69l4.38%202.3q.89-.99%202.21-.99z%27%20fill%3D%27%230073aa%27%2F%3E%3C%2Fsvg%3E")}.wp-embed{padding:25px;font-size:14px;font-weight:400;line-height:1.5;color:#82878c;background:#fff;border:1px solid #e5e5e5;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05);overflow:auto;zoom:1}.wp-embed a{color:#82878c;text-decoration:none}.wp-embed a:hover{text-decoration:underline}.wp-embed-featured-image{margin-bottom:20px}.wp-embed-featured-image img{width:100%;height:auto;border:none}.wp-embed-featured-image.square{float:left;max-width:160px;margin-right:20px}.wp-embed p{margin:0}p.wp-embed-heading{margin:0 0 15px;font-weight:600;font-size:22px;line-height:1.3}.wp-embed-heading a{color:#32373c}.wp-embed .wp-embed-more{color:#b4b9be}.wp-embed-footer{display:table;width:100%;margin-top:30px}.wp-embed-site-icon{position:absolute;top:50%;left:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);height:25px;width:25px;border:0}.wp-embed-site-title{font-weight:600;line-height:25px}.wp-embed-site-title a{position:relative;display:inline-block;padding-left:35px}.wp-embed-meta,.wp-embed-site-title{display:table-cell}.wp-embed-meta{text-align:right;white-space:nowrap;vertical-align:middle}.wp-embed-comments,.wp-embed-share{display:inline}.wp-embed-comments a,.wp-embed-share-tab-button{display:inline-block}.wp-embed-meta a:hover{text-decoration:none;color:#0073aa}.wp-embed-comments a{line-height:25px}.wp-embed-comments+.wp-embed-share{margin-left:10px}.wp-embed-share-dialog{position:absolute;top:0;left:0;right:0;bottom:0;background-color:#222;background-color:rgba(10,10,10,.9);color:#fff;opacity:1;-webkit-transition:opacity .25s ease-in-out;transition:opacity .25s ease-in-out}.wp-embed-share-dialog.hidden{opacity:0;visibility:hidden}.wp-embed-share-dialog-close,.wp-embed-share-dialog-open{margin:-8px 0 0;padding:0;background:0 0;border:none;cursor:pointer;outline:0}.wp-embed-share-dialog-close .dashicons,.wp-embed-share-dialog-open .dashicons{padding:4px}.wp-embed-share-dialog-open .dashicons{top:8px}.wp-embed-share-dialog-close:focus .dashicons,.wp-embed-share-dialog-open:focus .dashicons{-webkit-box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);box-shadow:0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);-webkit-border-radius:100%;border-radius:100%}.wp-embed-share-dialog-close{position:absolute;top:20px;right:20px;font-size:22px}.wp-embed-share-dialog-close:hover{text-decoration:none}.wp-embed-share-dialog-close .dashicons{height:24px;width:24px;-webkit-background-size:24px 24px;background-size:24px}.wp-embed-share-dialog-content{height:100%;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;overflow:hidden}.wp-embed-share-dialog-text{margin-top:25px;padding:20px}.wp-embed-share-tabs{margin:0 0 20px;padding:0;list-style:none}.wp-embed-share-tab-button button{margin:0;padding:0;border:none;background:0 0;font-size:16px;line-height:1.3;color:#aaa;cursor:pointer;-webkit-transition:color .1s ease-in;transition:color .1s ease-in}.wp-embed-share-tab-button [aria-selected=true],.wp-embed-share-tab-button button:hover{color:#fff}.wp-embed-share-tab-button+.wp-embed-share-tab-button{margin:0 0 0 10px;padding:0 0 0 11px;border-left:1px solid #aaa}.wp-embed-share-tab[aria-hidden=true]{display:none}p.wp-embed-share-description{margin:0;font-size:14px;line-height:1;font-style:italic;color:#aaa}.wp-embed-share-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;border:none;height:28px;margin:0 0 10px;padding:0 5px;font-size:14px;font-weight:400;line-height:1.5;resize:none;cursor:text}textarea.wp-embed-share-input{height:72px}html[dir=rtl] .wp-embed-featured-image.square{float:right;margin-right:0;margin-left:20px}html[dir=rtl] .wp-embed-site-title a{padding-left:0;padding-right:35px}html[dir=rtl] .wp-embed-site-icon{margin-right:0;margin-left:10px;left:auto;right:0}html[dir=rtl] .wp-embed-meta{text-align:left}html[dir=rtl] .wp-embed-share{margin-left:0;margin-right:10px}html[dir=rtl] .wp-embed-share-dialog-close{right:auto;left:20px}html[dir=rtl] .wp-embed-share-tab-button+.wp-embed-share-tab-button{margin:0 10px 0 0;padding:0 11px 0 0;border-left:none;border-right:1px solid #aaa} \ No newline at end of file diff --git a/wp/wp-includes/css/wp-pointer-rtl.css b/wp/wp-includes/css/wp-pointer-rtl.css deleted file mode 100644 index 8ef79d67..00000000 --- a/wp/wp-includes/css/wp-pointer-rtl.css +++ /dev/null @@ -1,212 +0,0 @@ -.wp-pointer-content { - padding: 0 0 10px; - position: relative; - font-size: 13px; - background: #fff; - border: 1px solid #ddd; - -webkit-box-shadow: 0 3px 6px rgba(0,0,0,0.075); - box-shadow: 0 3px 6px rgba(0,0,0,0.075); -} - -.wp-pointer-content h3 { - position: relative; - margin: -1px -1px 5px; - padding: 15px 60px 14px 18px; - border: 1px solid #3592b6; - border-bottom: none; - line-height: 1.4em; - font-size: 14px; - color: #fff; - background: #00a0d2; -} - -.wp-pointer-content h3:before { - background: #fff; - -webkit-border-radius: 50%; - border-radius: 50%; - color: #00a0d2; - content: "\f227"; - font: normal 20px/1.6 dashicons; - position: absolute; - top: 8px; - right: 15px; - speak: none; - text-align: center; - width: 32px; - height: 32px; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.wp-pointer-content p { - padding: 0 15px; -} - -.wp-pointer-buttons { - margin: 0; - padding: 5px 15px; - overflow: auto; -} - -.wp-pointer-buttons a { - float: left; - display: inline-block; - text-decoration: none; -} - -.wp-pointer-buttons a.close { - padding-right: 3px; - position: relative; -} - -.wp-pointer-buttons a.close:before { - background: none; - color: #b4b9be; - content: "\f153"; - display: block !important; - font: normal 16px/1 dashicons; - speak: none; - margin: 1px 0; - text-align: center; - -webkit-font-smoothing: antialiased !important; - width: 10px; - height: 100%; - position: absolute; - right: -15px; - top: 1px; -} - -.wp-pointer-buttons a.close:hover:before { - color: #c00; -} - -/* The arrow base class must take up no space, even with transparent borders. */ -.wp-pointer-arrow, -.wp-pointer-arrow-inner { - position: absolute; - width: 0; - height: 0; -} - -.wp-pointer-arrow { - z-index: 10; - width: 0; - height: 0; - border: 0 solid transparent; -} - -.wp-pointer-arrow-inner { - z-index: 20; -} - -/* Make Room for the Arrow! */ -.wp-pointer-top, -.wp-pointer-undefined { - padding-top: 13px; -} - -.wp-pointer-bottom { - margin-top: -13px; - padding-bottom: 13px; -} - -/* rtl:ignore */ -.wp-pointer-left { - padding-left: 13px; -} -/* rtl:ignore */ -.wp-pointer-right { - margin-left: -13px; - padding-right: 13px; -} - -/* Base Size & Positioning */ -.wp-pointer-top .wp-pointer-arrow, -.wp-pointer-bottom .wp-pointer-arrow, -.wp-pointer-undefined .wp-pointer-arrow { - right: 50px; -} - -.wp-pointer-left .wp-pointer-arrow, -.wp-pointer-right .wp-pointer-arrow { - top: 50%; - margin-top: -15px; -} - -/* Arrow Sprite */ -.wp-pointer-top .wp-pointer-arrow, -.wp-pointer-undefined .wp-pointer-arrow { - top: 0; - border-width: 0 13px 13px 13px; - border-bottom-color: #3592b6; -} - -.wp-pointer-top .wp-pointer-arrow-inner, -.wp-pointer-undefined .wp-pointer-arrow-inner { - top: 1px; - margin-right: -13px; - margin-top: -13px; - border: 13px solid transparent; - border-bottom-color: #00a0d2; - display: block; - content: " "; -} - -.wp-pointer-bottom .wp-pointer-arrow { - bottom: 0; - border-width: 13px 13px 0 13px; - border-top-color: #ccc; -} - -.wp-pointer-bottom .wp-pointer-arrow-inner { - bottom: 1px; - margin-right: -13px; - margin-bottom: -13px; - border: 13px solid transparent; - border-top-color: #fff; - display: block; - content: " "; -} - -/* rtl:ignore */ -.wp-pointer-left .wp-pointer-arrow { - left: 0; - border-width: 13px 13px 13px 0; - border-right-color: #ccc; -} - -/* rtl:ignore */ -.wp-pointer-left .wp-pointer-arrow-inner { - left: 1px; - margin-left: -13px; - margin-top: -13px; - border: 13px solid transparent; - border-right-color: #fff; - display: block; - content: " "; -} - -/* rtl:ignore */ -.wp-pointer-right .wp-pointer-arrow { - right: 0; - border-width: 13px 0 13px 13px; - border-left-color: #ccc; -} - -/* rtl:ignore */ -.wp-pointer-right .wp-pointer-arrow-inner { - right: 1px; - margin-right: -13px; - margin-top: -13px; - border: 13px solid transparent; - border-left-color: #fff; - display: block; - content: " "; -} - -/* Disable pointers at responsive sizes */ -@media screen and ( max-width: 782px ) { - .wp-pointer { - display: none; - } -} diff --git a/wp/wp-includes/css/wp-pointer-rtl.min.css b/wp/wp-includes/css/wp-pointer-rtl.min.css deleted file mode 100644 index af44ad62..00000000 --- a/wp/wp-includes/css/wp-pointer-rtl.min.css +++ /dev/null @@ -1 +0,0 @@ -.wp-pointer-content{padding:0 0 10px;position:relative;font-size:13px;background:#fff;border:1px solid #ddd;-webkit-box-shadow:0 3px 6px rgba(0,0,0,.075);box-shadow:0 3px 6px rgba(0,0,0,.075)}.wp-pointer-content h3{position:relative;margin:-1px -1px 5px;padding:15px 60px 14px 18px;border:1px solid #3592b6;border-bottom:none;line-height:1.4em;font-size:14px;color:#fff;background:#00a0d2}.wp-pointer-content h3:before{background:#fff;-webkit-border-radius:50%;border-radius:50%;color:#00a0d2;content:"\f227";font:400 20px/1.6 dashicons;position:absolute;top:8px;right:15px;speak:none;text-align:center;width:32px;height:32px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-pointer-content p{padding:0 15px}.wp-pointer-buttons{margin:0;padding:5px 15px;overflow:auto}.wp-pointer-buttons a{float:left;display:inline-block;text-decoration:none}.wp-pointer-buttons a.close{padding-right:3px;position:relative}.wp-pointer-buttons a.close:before{background:0 0;color:#b4b9be;content:"\f153";display:block!important;font:400 16px/1 dashicons;speak:none;margin:1px 0;text-align:center;-webkit-font-smoothing:antialiased!important;width:10px;height:100%;position:absolute;right:-15px;top:1px}.wp-pointer-buttons a.close:hover:before{color:#c00}.wp-pointer-arrow,.wp-pointer-arrow-inner{position:absolute;width:0;height:0}.wp-pointer-arrow{z-index:10;width:0;height:0;border:0 solid transparent}.wp-pointer-arrow-inner{z-index:20}.wp-pointer-top,.wp-pointer-undefined{padding-top:13px}.wp-pointer-bottom{margin-top:-13px;padding-bottom:13px}.wp-pointer-left{padding-left:13px}.wp-pointer-right{margin-left:-13px;padding-right:13px}.wp-pointer-bottom .wp-pointer-arrow,.wp-pointer-top .wp-pointer-arrow,.wp-pointer-undefined .wp-pointer-arrow{right:50px}.wp-pointer-left .wp-pointer-arrow,.wp-pointer-right .wp-pointer-arrow{top:50%;margin-top:-15px}.wp-pointer-top .wp-pointer-arrow,.wp-pointer-undefined .wp-pointer-arrow{top:0;border-width:0 13px 13px;border-bottom-color:#3592b6}.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer-undefined .wp-pointer-arrow-inner{top:1px;margin-right:-13px;margin-top:-13px;border:13px solid transparent;border-bottom-color:#00a0d2;display:block;content:" "}.wp-pointer-bottom .wp-pointer-arrow{bottom:0;border-width:13px 13px 0;border-top-color:#ccc}.wp-pointer-bottom .wp-pointer-arrow-inner{bottom:1px;margin-right:-13px;margin-bottom:-13px;border:13px solid transparent;border-top-color:#fff;display:block;content:" "}.wp-pointer-left .wp-pointer-arrow{left:0;border-width:13px 13px 13px 0;border-right-color:#ccc}.wp-pointer-left .wp-pointer-arrow-inner{left:1px;margin-left:-13px;margin-top:-13px;border:13px solid transparent;border-right-color:#fff;display:block;content:" "}.wp-pointer-right .wp-pointer-arrow{right:0;border-width:13px 0 13px 13px;border-left-color:#ccc}.wp-pointer-right .wp-pointer-arrow-inner{right:1px;margin-right:-13px;margin-top:-13px;border:13px solid transparent;border-left-color:#fff;display:block;content:" "}@media screen and (max-width:782px){.wp-pointer{display:none}} \ No newline at end of file diff --git a/wp/wp-includes/css/wp-pointer.css b/wp/wp-includes/css/wp-pointer.css deleted file mode 100644 index d58170ee..00000000 --- a/wp/wp-includes/css/wp-pointer.css +++ /dev/null @@ -1,212 +0,0 @@ -.wp-pointer-content { - padding: 0 0 10px; - position: relative; - font-size: 13px; - background: #fff; - border: 1px solid #ddd; - -webkit-box-shadow: 0 3px 6px rgba(0,0,0,0.075); - box-shadow: 0 3px 6px rgba(0,0,0,0.075); -} - -.wp-pointer-content h3 { - position: relative; - margin: -1px -1px 5px; - padding: 15px 18px 14px 60px; - border: 1px solid #3592b6; - border-bottom: none; - line-height: 1.4em; - font-size: 14px; - color: #fff; - background: #00a0d2; -} - -.wp-pointer-content h3:before { - background: #fff; - -webkit-border-radius: 50%; - border-radius: 50%; - color: #00a0d2; - content: "\f227"; - font: normal 20px/1.6 dashicons; - position: absolute; - top: 8px; - left: 15px; - speak: none; - text-align: center; - width: 32px; - height: 32px; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.wp-pointer-content p { - padding: 0 15px; -} - -.wp-pointer-buttons { - margin: 0; - padding: 5px 15px; - overflow: auto; -} - -.wp-pointer-buttons a { - float: right; - display: inline-block; - text-decoration: none; -} - -.wp-pointer-buttons a.close { - padding-left: 3px; - position: relative; -} - -.wp-pointer-buttons a.close:before { - background: none; - color: #b4b9be; - content: "\f153"; - display: block !important; - font: normal 16px/1 dashicons; - speak: none; - margin: 1px 0; - text-align: center; - -webkit-font-smoothing: antialiased !important; - width: 10px; - height: 100%; - position: absolute; - left: -15px; - top: 1px; -} - -.wp-pointer-buttons a.close:hover:before { - color: #c00; -} - -/* The arrow base class must take up no space, even with transparent borders. */ -.wp-pointer-arrow, -.wp-pointer-arrow-inner { - position: absolute; - width: 0; - height: 0; -} - -.wp-pointer-arrow { - z-index: 10; - width: 0; - height: 0; - border: 0 solid transparent; -} - -.wp-pointer-arrow-inner { - z-index: 20; -} - -/* Make Room for the Arrow! */ -.wp-pointer-top, -.wp-pointer-undefined { - padding-top: 13px; -} - -.wp-pointer-bottom { - margin-top: -13px; - padding-bottom: 13px; -} - -/* rtl:ignore */ -.wp-pointer-left { - padding-left: 13px; -} -/* rtl:ignore */ -.wp-pointer-right { - margin-left: -13px; - padding-right: 13px; -} - -/* Base Size & Positioning */ -.wp-pointer-top .wp-pointer-arrow, -.wp-pointer-bottom .wp-pointer-arrow, -.wp-pointer-undefined .wp-pointer-arrow { - left: 50px; -} - -.wp-pointer-left .wp-pointer-arrow, -.wp-pointer-right .wp-pointer-arrow { - top: 50%; - margin-top: -15px; -} - -/* Arrow Sprite */ -.wp-pointer-top .wp-pointer-arrow, -.wp-pointer-undefined .wp-pointer-arrow { - top: 0; - border-width: 0 13px 13px 13px; - border-bottom-color: #3592b6; -} - -.wp-pointer-top .wp-pointer-arrow-inner, -.wp-pointer-undefined .wp-pointer-arrow-inner { - top: 1px; - margin-left: -13px; - margin-top: -13px; - border: 13px solid transparent; - border-bottom-color: #00a0d2; - display: block; - content: " "; -} - -.wp-pointer-bottom .wp-pointer-arrow { - bottom: 0; - border-width: 13px 13px 0 13px; - border-top-color: #ccc; -} - -.wp-pointer-bottom .wp-pointer-arrow-inner { - bottom: 1px; - margin-left: -13px; - margin-bottom: -13px; - border: 13px solid transparent; - border-top-color: #fff; - display: block; - content: " "; -} - -/* rtl:ignore */ -.wp-pointer-left .wp-pointer-arrow { - left: 0; - border-width: 13px 13px 13px 0; - border-right-color: #ccc; -} - -/* rtl:ignore */ -.wp-pointer-left .wp-pointer-arrow-inner { - left: 1px; - margin-left: -13px; - margin-top: -13px; - border: 13px solid transparent; - border-right-color: #fff; - display: block; - content: " "; -} - -/* rtl:ignore */ -.wp-pointer-right .wp-pointer-arrow { - right: 0; - border-width: 13px 0 13px 13px; - border-left-color: #ccc; -} - -/* rtl:ignore */ -.wp-pointer-right .wp-pointer-arrow-inner { - right: 1px; - margin-right: -13px; - margin-top: -13px; - border: 13px solid transparent; - border-left-color: #fff; - display: block; - content: " "; -} - -/* Disable pointers at responsive sizes */ -@media screen and ( max-width: 782px ) { - .wp-pointer { - display: none; - } -} diff --git a/wp/wp-includes/css/wp-pointer.min.css b/wp/wp-includes/css/wp-pointer.min.css deleted file mode 100644 index 3673b4f7..00000000 --- a/wp/wp-includes/css/wp-pointer.min.css +++ /dev/null @@ -1 +0,0 @@ -.wp-pointer-content{padding:0 0 10px;position:relative;font-size:13px;background:#fff;border:1px solid #ddd;-webkit-box-shadow:0 3px 6px rgba(0,0,0,.075);box-shadow:0 3px 6px rgba(0,0,0,.075)}.wp-pointer-content h3{position:relative;margin:-1px -1px 5px;padding:15px 18px 14px 60px;border:1px solid #3592b6;border-bottom:none;line-height:1.4em;font-size:14px;color:#fff;background:#00a0d2}.wp-pointer-content h3:before{background:#fff;-webkit-border-radius:50%;border-radius:50%;color:#00a0d2;content:"\f227";font:400 20px/1.6 dashicons;position:absolute;top:8px;left:15px;speak:none;text-align:center;width:32px;height:32px;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wp-pointer-content p{padding:0 15px}.wp-pointer-buttons{margin:0;padding:5px 15px;overflow:auto}.wp-pointer-buttons a{float:right;display:inline-block;text-decoration:none}.wp-pointer-buttons a.close{padding-left:3px;position:relative}.wp-pointer-buttons a.close:before{background:0 0;color:#b4b9be;content:"\f153";display:block!important;font:400 16px/1 dashicons;speak:none;margin:1px 0;text-align:center;-webkit-font-smoothing:antialiased!important;width:10px;height:100%;position:absolute;left:-15px;top:1px}.wp-pointer-buttons a.close:hover:before{color:#c00}.wp-pointer-arrow,.wp-pointer-arrow-inner{position:absolute;width:0;height:0}.wp-pointer-arrow{z-index:10;width:0;height:0;border:0 solid transparent}.wp-pointer-arrow-inner{z-index:20}.wp-pointer-top,.wp-pointer-undefined{padding-top:13px}.wp-pointer-bottom{margin-top:-13px;padding-bottom:13px}.wp-pointer-left{padding-left:13px}.wp-pointer-right{margin-left:-13px;padding-right:13px}.wp-pointer-bottom .wp-pointer-arrow,.wp-pointer-top .wp-pointer-arrow,.wp-pointer-undefined .wp-pointer-arrow{left:50px}.wp-pointer-left .wp-pointer-arrow,.wp-pointer-right .wp-pointer-arrow{top:50%;margin-top:-15px}.wp-pointer-top .wp-pointer-arrow,.wp-pointer-undefined .wp-pointer-arrow{top:0;border-width:0 13px 13px;border-bottom-color:#3592b6}.wp-pointer-top .wp-pointer-arrow-inner,.wp-pointer-undefined .wp-pointer-arrow-inner{top:1px;margin-left:-13px;margin-top:-13px;border:13px solid transparent;border-bottom-color:#00a0d2;display:block;content:" "}.wp-pointer-bottom .wp-pointer-arrow{bottom:0;border-width:13px 13px 0;border-top-color:#ccc}.wp-pointer-bottom .wp-pointer-arrow-inner{bottom:1px;margin-left:-13px;margin-bottom:-13px;border:13px solid transparent;border-top-color:#fff;display:block;content:" "}.wp-pointer-left .wp-pointer-arrow{left:0;border-width:13px 13px 13px 0;border-right-color:#ccc}.wp-pointer-left .wp-pointer-arrow-inner{left:1px;margin-left:-13px;margin-top:-13px;border:13px solid transparent;border-right-color:#fff;display:block;content:" "}.wp-pointer-right .wp-pointer-arrow{right:0;border-width:13px 0 13px 13px;border-left-color:#ccc}.wp-pointer-right .wp-pointer-arrow-inner{right:1px;margin-right:-13px;margin-top:-13px;border:13px solid transparent;border-left-color:#fff;display:block;content:" "}@media screen and (max-width:782px){.wp-pointer{display:none}} \ No newline at end of file diff --git a/wp/wp-includes/customize/class-wp-customize-background-image-control.php b/wp/wp-includes/customize/class-wp-customize-background-image-control.php deleted file mode 100644 index 50956f85..00000000 --- a/wp/wp-includes/customize/class-wp-customize-background-image-control.php +++ /dev/null @@ -1,51 +0,0 @@ - __( 'Background Image' ), - 'section' => 'background_image', - ) ); - } - - /** - * Enqueue control related scripts/styles. - * - * @since 4.1.0 - */ - public function enqueue() { - parent::enqueue(); - - $custom_background = get_theme_support( 'custom-background' ); - wp_localize_script( 'customize-controls', '_wpCustomizeBackground', array( - 'defaults' => ! empty( $custom_background[0] ) ? $custom_background[0] : array(), - 'nonces' => array( - 'add' => wp_create_nonce( 'background-add' ), - ), - ) ); - } -} diff --git a/wp/wp-includes/customize/class-wp-customize-background-image-setting.php b/wp/wp-includes/customize/class-wp-customize-background-image-setting.php deleted file mode 100644 index e7867d18..00000000 --- a/wp/wp-includes/customize/class-wp-customize-background-image-setting.php +++ /dev/null @@ -1,28 +0,0 @@ - array( 'label' => __( 'Top Left' ), 'icon' => 'dashicons dashicons-arrow-left-alt' ), - 'center top' => array( 'label' => __( 'Top' ), 'icon' => 'dashicons dashicons-arrow-up-alt' ), - 'right top' => array( 'label' => __( 'Top Right' ), 'icon' => 'dashicons dashicons-arrow-right-alt' ), - ), - array( - 'left center' => array( 'label' => __( 'Left' ), 'icon' => 'dashicons dashicons-arrow-left-alt' ), - 'center center' => array( 'label' => __( 'Center' ), 'icon' => 'background-position-center-icon' ), - 'right center' => array( 'label' => __( 'Right' ), 'icon' => 'dashicons dashicons-arrow-right-alt' ), - ), - array( - 'left bottom' => array( 'label' => __( 'Bottom Left' ), 'icon' => 'dashicons dashicons-arrow-left-alt' ), - 'center bottom' => array( 'label' => __( 'Bottom' ), 'icon' => 'dashicons dashicons-arrow-down-alt' ), - 'right bottom' => array( 'label' => __( 'Bottom Right' ), 'icon' => 'dashicons dashicons-arrow-right-alt' ), - ), - ); - ?> - <# if ( data.label ) { #> - {{{ data.label }}} - <# } #> - <# if ( data.description ) { #> - {{{ data.description }}} - <# } #> -
      -
      - -
      - -
      - $input ) : ?> - - -
      - -
      -
      -
      - statuses = array( '' => __('Default') ); - parent::__construct( $manager, $id, $args ); - } - - /** - * Enqueue scripts/styles for the color picker. - * - * @since 3.4.0 - */ - public function enqueue() { - wp_enqueue_script( 'wp-color-picker' ); - wp_enqueue_style( 'wp-color-picker' ); - } - - /** - * Refresh the parameters passed to the JavaScript via JSON. - * - * @since 3.4.0 - * @uses WP_Customize_Control::to_json() - */ - public function to_json() { - parent::to_json(); - $this->json['statuses'] = $this->statuses; - $this->json['defaultValue'] = $this->setting->default; - $this->json['mode'] = $this->mode; - } - - /** - * Don't render the control content from PHP, as it's rendered via JS on load. - * - * @since 3.4.0 - */ - public function render_content() {} - - /** - * Render a JS template for the content of the color picker control. - * - * @since 4.1.0 - */ - public function content_template() { - ?> - <# var defaultValue = '', - isHueSlider = data.mode === 'hue'; - - if ( data.defaultValue && ! isHueSlider ) { - if ( '#' !== data.defaultValue.substring( 0, 1 ) ) { - defaultValue = '#' + data.defaultValue; - } else { - defaultValue = data.defaultValue; - } - defaultValue = ' data-default-color=' + defaultValue; // Quotes added automatically. - } #> - - json['width'] = absint( $this->width ); - $this->json['height'] = absint( $this->height ); - $this->json['flex_width'] = absint( $this->flex_width ); - $this->json['flex_height'] = absint( $this->flex_height ); - } - -} diff --git a/wp/wp-includes/customize/class-wp-customize-custom-css-setting.php b/wp/wp-includes/customize/class-wp-customize-custom-css-setting.php deleted file mode 100644 index 3189ae92..00000000 --- a/wp/wp-includes/customize/class-wp-customize-custom-css-setting.php +++ /dev/null @@ -1,367 +0,0 @@ -id_data['base'] ) { - throw new Exception( 'Expected custom_css id_base.' ); - } - if ( 1 !== count( $this->id_data['keys'] ) || empty( $this->id_data['keys'][0] ) ) { - throw new Exception( 'Expected single stylesheet key.' ); - } - $this->stylesheet = $this->id_data['keys'][0]; - } - - /** - * Add filter to preview post value. - * - * @since 4.7.9 - * @access public - * - * @return bool False when preview short-circuits due no change needing to be previewed. - */ - public function preview() { - if ( $this->is_previewed ) { - return false; - } - $this->is_previewed = true; - add_filter( 'wp_get_custom_css', array( $this, 'filter_previewed_wp_get_custom_css' ), 9, 2 ); - return true; - } - - /** - * Filter `wp_get_custom_css` for applying the customized value. - * - * This is used in the preview when `wp_get_custom_css()` is called for rendering the styles. - * - * @since 4.7.0 - * @access private - * @see wp_get_custom_css() - * - * @param string $css Original CSS. - * @param string $stylesheet Current stylesheet. - * @return string CSS. - */ - public function filter_previewed_wp_get_custom_css( $css, $stylesheet ) { - if ( $stylesheet === $this->stylesheet ) { - $customized_value = $this->post_value( null ); - if ( ! is_null( $customized_value ) ) { - $css = $customized_value; - } - } - return $css; - } - - /** - * Fetch the value of the setting. Will return the previewed value when `preview()` is called. - * - * @since 4.7.0 - * @access public - * @see WP_Customize_Setting::value() - * - * @return string - */ - public function value() { - if ( $this->is_previewed ) { - $post_value = $this->post_value( null ); - if ( null !== $post_value ) { - return $post_value; - } - } - $id_base = $this->id_data['base']; - $value = ''; - $post = wp_get_custom_css_post( $this->stylesheet ); - if ( $post ) { - $value = $post->post_content; - } - if ( empty( $value ) ) { - $value = $this->default; - } - - /** This filter is documented in wp-includes/class-wp-customize-setting.php */ - $value = apply_filters( "customize_value_{$id_base}", $value, $this ); - - return $value; - } - - /** - * Validate CSS. - * - * Checks for imbalanced braces, brackets, and comments. - * Notifications are rendered when the customizer state is saved. - * - * @todo There are cases where valid CSS can be incorrectly marked as invalid when strings or comments include balancing characters. To fix, CSS tokenization needs to be used. - * - * @since 4.7.0 - * @access public - * - * @param string $css The input string. - * @return true|WP_Error True if the input was validated, otherwise WP_Error. - */ - public function validate( $css ) { - $validity = new WP_Error(); - - if ( preg_match( '#add( 'illegal_markup', __( 'Markup is not allowed in CSS.' ) ); - } - - $imbalanced = false; - - // Make sure that there is a closing brace for each opening brace. - if ( ! $this->validate_balanced_characters( '{', '}', $css ) ) { - $validity->add( 'imbalanced_curly_brackets', __( 'Your curly brackets {} are imbalanced. Make sure there is a closing } for every opening {.' ) ); - $imbalanced = true; - } - - // Ensure brackets are balanced. - if ( ! $this->validate_balanced_characters( '[', ']', $css ) ) { - $validity->add( 'imbalanced_braces', __( 'Your brackets [] are imbalanced. Make sure there is a closing ] for every opening [.' ) ); - $imbalanced = true; - } - - // Ensure parentheses are balanced. - if ( ! $this->validate_balanced_characters( '(', ')', $css ) ) { - $validity->add( 'imbalanced_parentheses', __( 'Your parentheses () are imbalanced. Make sure there is a closing ) for every opening (.' ) ); - $imbalanced = true; - } - - // Ensure double quotes are equal. - if ( ! $this->validate_equal_characters( '"', $css ) ) { - $validity->add( 'unequal_double_quotes', __( 'Your double quotes " are uneven. Make sure there is a closing " for every opening ".' ) ); - $imbalanced = true; - } - - /* - * Make sure any code comments are closed properly. - * - * The first check could miss stray an unpaired comment closing figure, so if - * The number appears to be balanced, then check for equal numbers - * of opening/closing comment figures. - * - * Although it may initially appear redundant, we use the first method - * to give more specific feedback to the user. - */ - $unclosed_comment_count = $this->validate_count_unclosed_comments( $css ); - if ( 0 < $unclosed_comment_count ) { - $validity->add( 'unclosed_comment', sprintf( _n( 'There is %s unclosed code comment. Close each comment with */.', 'There are %s unclosed code comments. Close each comment with */.', $unclosed_comment_count ), $unclosed_comment_count ) ); - $imbalanced = true; - } elseif ( ! $this->validate_balanced_characters( '/*', '*/', $css ) ) { - $validity->add( 'imbalanced_comments', __( 'There is an extra */, indicating an end to a comment. Be sure that there is an opening /* for every closing */.' ) ); - $imbalanced = true; - } - if ( $imbalanced && $this->is_possible_content_error( $css ) ) { - $validity->add( 'possible_false_positive', __( 'Imbalanced/unclosed character errors can be caused by content: ""; declarations. You may need to remove this or add it to a custom CSS file.' ) ); - } - - if ( empty( $validity->errors ) ) { - $validity = parent::validate( $css ); - } - return $validity; - } - - /** - * Store the CSS setting value in the custom_css custom post type for the stylesheet. - * - * @since 4.7.0 - * @access public - * - * @param string $css The input value. - * @return int|false The post ID or false if the value could not be saved. - */ - public function update( $css ) { - if ( empty( $css ) ) { - $css = ''; - } - - $r = wp_update_custom_css_post( $css, array( - 'stylesheet' => $this->stylesheet, - ) ); - - if ( $r instanceof WP_Error ) { - return false; - } - $post_id = $r->ID; - - // Cache post ID in theme mod for performance to avoid additional DB query. - if ( $this->manager->get_stylesheet() === $this->stylesheet ) { - set_theme_mod( 'custom_css_post_id', $post_id ); - } - - return $post_id; - } - - /** - * Ensure there are a balanced number of paired characters. - * - * This is used to check that the number of opening and closing - * characters is equal. - * - * For instance, there should be an equal number of braces ("{", "}") - * in the CSS. - * - * @since 4.7.0 - * @access private - * - * @param string $opening_char The opening character. - * @param string $closing_char The closing character. - * @param string $css The CSS input string. - * - * @return bool - */ - private function validate_balanced_characters( $opening_char, $closing_char, $css ) { - return substr_count( $css, $opening_char ) === substr_count( $css, $closing_char ); - } - - /** - * Ensure there are an even number of paired characters. - * - * This is used to check that the number of a specific - * character is even. - * - * For instance, there should be an even number of double quotes - * in the CSS. - * - * @since 4.7.0 - * @access private - * - * @param string $char A character. - * @param string $css The CSS input string. - * @return bool Equality. - */ - private function validate_equal_characters( $char, $css ) { - $char_count = substr_count( $css, $char ); - return ( 0 === $char_count % 2 ); - } - - /** - * Count unclosed CSS Comments. - * - * Used during validation. - * - * @see self::validate() - * - * @since 4.7.0 - * @access private - * - * @param string $css The CSS input string. - * @return int Count. - */ - private function validate_count_unclosed_comments( $css ) { - $count = 0; - $comments = explode( '/*', $css ); - - if ( ! is_array( $comments ) || ( 1 >= count( $comments ) ) ) { - return $count; - } - - unset( $comments[0] ); // The first item is before the first comment. - foreach ( $comments as $comment ) { - if ( false === strpos( $comment, '*/' ) ) { - $count++; - } - } - return $count; - } - - /** - * Find "content:" within a string. - * - * Imbalanced/Unclosed validation errors may be caused - * when a character is used in a "content:" declaration. - * - * This function is used to detect if this is a possible - * cause of the validation error, so that if it is, - * a notification may be added to the Validation Errors. - * - * Example: - * .element::before { - * content: "(\""; - * } - * .element::after { - * content: "\")"; - * } - * - * Using ! empty() because strpos() may return non-boolean values - * that evaluate to false. This would be problematic when - * using a strict "false === strpos()" comparison. - * - * @since 4.7.0 - * @access private - * - * @param string $css The CSS input string. - * @return bool - */ - private function is_possible_content_error( $css ) { - $found = preg_match( '/\bcontent\s*:/', $css ); - if ( ! empty( $found ) ) { - return true; - } - return false; - } -} diff --git a/wp/wp-includes/customize/class-wp-customize-filter-setting.php b/wp/wp-includes/customize/class-wp-customize-filter-setting.php deleted file mode 100644 index f6551b60..00000000 --- a/wp/wp-includes/customize/class-wp-customize-filter-setting.php +++ /dev/null @@ -1,30 +0,0 @@ - __( 'Header Image' ), - 'settings' => array( - 'default' => 'header_image', - 'data' => 'header_image_data', - ), - 'section' => 'header_image', - 'removed' => 'remove-header', - 'get_url' => 'get_header_image', - ) ); - - } - - /** - * @access public - */ - public function enqueue() { - wp_enqueue_media(); - wp_enqueue_script( 'customize-views' ); - - $this->prepare_control(); - - wp_localize_script( 'customize-views', '_wpCustomizeHeader', array( - 'data' => array( - 'width' => absint( get_theme_support( 'custom-header', 'width' ) ), - 'height' => absint( get_theme_support( 'custom-header', 'height' ) ), - 'flex-width' => absint( get_theme_support( 'custom-header', 'flex-width' ) ), - 'flex-height' => absint( get_theme_support( 'custom-header', 'flex-height' ) ), - 'currentImgSrc' => $this->get_current_image_src(), - ), - 'nonces' => array( - 'add' => wp_create_nonce( 'header-add' ), - 'remove' => wp_create_nonce( 'header-remove' ), - ), - 'uploads' => $this->uploaded_headers, - 'defaults' => $this->default_headers - ) ); - - parent::enqueue(); - } - - /** - * - * @global Custom_Image_Header $custom_image_header - */ - public function prepare_control() { - global $custom_image_header; - if ( empty( $custom_image_header ) ) { - return; - } - - // Process default headers and uploaded headers. - $custom_image_header->process_default_headers(); - $this->default_headers = $custom_image_header->get_default_header_images(); - $this->uploaded_headers = $custom_image_header->get_uploaded_header_images(); - } - - /** - * @access public - */ - public function print_header_image_template() { - ?> - - - - value(); - if ( isset( $this->get_url ) ) { - $src = call_user_func( $this->get_url, $src ); - return $src; - } - } - - /** - * @access public - */ - public function render_content() { - $this->print_header_image_template(); - $visibility = $this->get_current_image_src() ? '' : ' style="display:none" '; - $width = absint( get_theme_support( 'custom-header', 'width' ) ); - $height = absint( get_theme_support( 'custom-header', 'height' ) ); - ?> -
      - ' . $this->label . ''; - } ?> -
      -

      - Add new image, we recommend matching the size of your video.' ); - } elseif ( $width && $height ) { - /* translators: %s: header size in pixels */ - printf( __( 'While you can crop images to your liking after clicking Add new image, your theme recommends a header size of %s pixels.' ), - sprintf( '%s × %s', $width, $height ) - ); - } elseif ( $width ) { - /* translators: %s: header width in pixels */ - printf( __( 'While you can crop images to your liking after clicking Add new image, your theme recommends a header width of %s pixels.' ), - sprintf( '%s', $width ) - ); - } else { - /* translators: %s: header height in pixels */ - printf( __( 'While you can crop images to your liking after clicking Add new image, your theme recommends a header height of %s pixels.' ), - sprintf( '%s', $height ) - ); - } - ?> -

      -
      - -
      -
      -
      -
      - - - -
      - -
      -
      - - - -
      -
      -
      -
      - - - -
      -
      -
      -
      -
      -
      - manager->get_setting('header_image')->post_value(); - - if ( is_array( $value ) && isset( $value['choice'] ) ) - $custom_image_header->set_header_image( $value['choice'] ); - else - $custom_image_header->set_header_image( $value ); - } -} diff --git a/wp/wp-includes/customize/class-wp-customize-image-control.php b/wp/wp-includes/customize/class-wp-customize-image-control.php deleted file mode 100644 index ffb89e3f..00000000 --- a/wp/wp-includes/customize/class-wp-customize-image-control.php +++ /dev/null @@ -1,77 +0,0 @@ -button_labels = wp_parse_args( $this->button_labels, array( - 'select' => __( 'Select Image' ), - 'change' => __( 'Change Image' ), - 'remove' => __( 'Remove' ), - 'default' => __( 'Default' ), - 'placeholder' => __( 'No image selected' ), - 'frame_title' => __( 'Select Image' ), - 'frame_button' => __( 'Choose Image' ), - ) ); - } - - /** - * @since 3.4.2 - * @deprecated 4.1.0 - */ - public function prepare_control() {} - - /** - * @since 3.4.0 - * @deprecated 4.1.0 - * - * @param string $id - * @param string $label - * @param mixed $callback - */ - public function add_tab( $id, $label, $callback ) {} - - /** - * @since 3.4.0 - * @deprecated 4.1.0 - * - * @param string $id - */ - public function remove_tab( $id ) {} - - /** - * @since 3.4.0 - * @deprecated 4.1.0 - * - * @param string $url - * @param string $thumbnail_url - */ - public function print_tab_image( $url, $thumbnail_url = null ) {} -} diff --git a/wp/wp-includes/customize/class-wp-customize-media-control.php b/wp/wp-includes/customize/class-wp-customize-media-control.php deleted file mode 100644 index f3ec32b4..00000000 --- a/wp/wp-includes/customize/class-wp-customize-media-control.php +++ /dev/null @@ -1,217 +0,0 @@ -button_labels = wp_parse_args( $this->button_labels, array( - 'select' => __( 'Select File' ), - 'change' => __( 'Change File' ), - 'default' => __( 'Default' ), - 'remove' => __( 'Remove' ), - 'placeholder' => __( 'No file selected' ), - 'frame_title' => __( 'Select File' ), - 'frame_button' => __( 'Choose File' ), - ) ); - } - } - - /** - * Enqueue control related scripts/styles. - * - * @since 3.4.0 - * @since 4.2.0 Moved from WP_Customize_Upload_Control. - */ - public function enqueue() { - wp_enqueue_media(); - } - - /** - * Refresh the parameters passed to the JavaScript via JSON. - * - * @since 3.4.0 - * @since 4.2.0 Moved from WP_Customize_Upload_Control. - * - * @see WP_Customize_Control::to_json() - */ - public function to_json() { - parent::to_json(); - $this->json['label'] = html_entity_decode( $this->label, ENT_QUOTES, get_bloginfo( 'charset' ) ); - $this->json['mime_type'] = $this->mime_type; - $this->json['button_labels'] = $this->button_labels; - $this->json['canUpload'] = current_user_can( 'upload_files' ); - - $value = $this->value(); - - if ( is_object( $this->setting ) ) { - if ( $this->setting->default ) { - // Fake an attachment model - needs all fields used by template. - // Note that the default value must be a URL, NOT an attachment ID. - $type = in_array( substr( $this->setting->default, -3 ), array( 'jpg', 'png', 'gif', 'bmp' ) ) ? 'image' : 'document'; - $default_attachment = array( - 'id' => 1, - 'url' => $this->setting->default, - 'type' => $type, - 'icon' => wp_mime_type_icon( $type ), - 'title' => basename( $this->setting->default ), - ); - - if ( 'image' === $type ) { - $default_attachment['sizes'] = array( - 'full' => array( 'url' => $this->setting->default ), - ); - } - - $this->json['defaultAttachment'] = $default_attachment; - } - - if ( $value && $this->setting->default && $value === $this->setting->default ) { - // Set the default as the attachment. - $this->json['attachment'] = $this->json['defaultAttachment']; - } elseif ( $value ) { - $this->json['attachment'] = wp_prepare_attachment_for_js( $value ); - } - } - } - - /** - * Don't render any content for this control from PHP. - * - * @since 3.4.0 - * @since 4.2.0 Moved from WP_Customize_Upload_Control. - * - * @see WP_Customize_Media_Control::content_template() - */ - public function render_content() {} - - /** - * Render a JS template for the content of the media control. - * - * @since 4.1.0 - * @since 4.2.0 Moved from WP_Customize_Upload_Control. - */ - public function content_template() { - ?> - - - <# if ( data.attachment && data.attachment.id ) { #> -
      -
      - <# if ( 'image' === data.attachment.type && data.attachment.sizes && data.attachment.sizes.medium ) { #> - - <# } else if ( 'image' === data.attachment.type && data.attachment.sizes && data.attachment.sizes.full ) { #> - - <# } else if ( 'audio' === data.attachment.type ) { #> - <# if ( data.attachment.image && data.attachment.image.src && data.attachment.image.src !== data.attachment.icon ) { #> - - <# } else { #> - - <# } #> -

      “{{ data.attachment.title }}”

      - <# if ( data.attachment.album || data.attachment.meta.album ) { #> -

      {{ data.attachment.album || data.attachment.meta.album }}

      - <# } #> - <# if ( data.attachment.artist || data.attachment.meta.artist ) { #> -

      {{ data.attachment.artist || data.attachment.meta.artist }}

      - <# } #> - - <# } else if ( 'video' === data.attachment.type ) { #> -
      - -
      - <# } else { #> - -

      {{ data.attachment.title }}

      - <# } #> -
      -
      - <# if ( data.canUpload ) { #> - - -
      - <# } #> -
      -
      - <# } else { #> -
      -
      - {{ data.button_labels.placeholder }} -
      -
      - <# if ( data.defaultAttachment ) { #> - - <# } #> - <# if ( data.canUpload ) { #> - - <# } #> -
      -
      -
      - <# } #> - - - - - - -

      - - - - - - setting->term_id; - - return $exported; - } -} diff --git a/wp/wp-includes/customize/class-wp-customize-nav-menu-item-control.php b/wp/wp-includes/customize/class-wp-customize-nav-menu-item-control.php deleted file mode 100644 index 941dad4c..00000000 --- a/wp/wp-includes/customize/class-wp-customize-nav-menu-item-control.php +++ /dev/null @@ -1,168 +0,0 @@ - - - - - - setting->post_id; - - return $exported; - } -} diff --git a/wp/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php b/wp/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php deleted file mode 100644 index 11b5cd6d..00000000 --- a/wp/wp-includes/customize/class-wp-customize-nav-menu-item-setting.php +++ /dev/null @@ -1,901 +0,0 @@ --?\d+)\]$/'; - - const POST_TYPE = 'nav_menu_item'; - - const TYPE = 'nav_menu_item'; - - /** - * Setting type. - * - * @since 4.3.0 - * @access public - * @var string - */ - public $type = self::TYPE; - - /** - * Default setting value. - * - * @since 4.3.0 - * @access public - * @var array - * - * @see wp_setup_nav_menu_item() - */ - public $default = array( - // The $menu_item_data for wp_update_nav_menu_item(). - 'object_id' => 0, - 'object' => '', // Taxonomy name. - 'menu_item_parent' => 0, // A.K.A. menu-item-parent-id; note that post_parent is different, and not included. - 'position' => 0, // A.K.A. menu_order. - 'type' => 'custom', // Note that type_label is not included here. - 'title' => '', - 'url' => '', - 'target' => '', - 'attr_title' => '', - 'description' => '', - 'classes' => '', - 'xfn' => '', - 'status' => 'publish', - 'original_title' => '', - 'nav_menu_term_id' => 0, // This will be supplied as the $menu_id arg for wp_update_nav_menu_item(). - '_invalid' => false, - ); - - /** - * Default transport. - * - * @since 4.3.0 - * @since 4.5.0 Default changed to 'refresh' - * @access public - * @var string - */ - public $transport = 'refresh'; - - /** - * The post ID represented by this setting instance. This is the db_id. - * - * A negative value represents a placeholder ID for a new menu not yet saved. - * - * @since 4.3.0 - * @access public - * @var int - */ - public $post_id; - - /** - * Storage of pre-setup menu item to prevent wasted calls to wp_setup_nav_menu_item(). - * - * @since 4.3.0 - * @access protected - * @var array - */ - protected $value; - - /** - * Previous (placeholder) post ID used before creating a new menu item. - * - * This value will be exported to JS via the customize_save_response filter - * so that JavaScript can update the settings to refer to the newly-assigned - * post ID. This value is always negative to indicate it does not refer to - * a real post. - * - * @since 4.3.0 - * @access public - * @var int - * - * @see WP_Customize_Nav_Menu_Item_Setting::update() - * @see WP_Customize_Nav_Menu_Item_Setting::amend_customize_save_response() - */ - public $previous_post_id; - - /** - * When previewing or updating a menu item, this stores the previous nav_menu_term_id - * which ensures that we can apply the proper filters. - * - * @since 4.3.0 - * @access public - * @var int - */ - public $original_nav_menu_term_id; - - /** - * Whether or not update() was called. - * - * @since 4.3.0 - * @access protected - * @var bool - */ - protected $is_updated = false; - - /** - * Status for calling the update method, used in customize_save_response filter. - * - * See {@see 'customize_save_response'}. - * - * When status is inserted, the placeholder post ID is stored in $previous_post_id. - * When status is error, the error is stored in $update_error. - * - * @since 4.3.0 - * @access public - * @var string updated|inserted|deleted|error - * - * @see WP_Customize_Nav_Menu_Item_Setting::update() - * @see WP_Customize_Nav_Menu_Item_Setting::amend_customize_save_response() - */ - public $update_status; - - /** - * Any error object returned by wp_update_nav_menu_item() when setting is updated. - * - * @since 4.3.0 - * @access public - * @var WP_Error - * - * @see WP_Customize_Nav_Menu_Item_Setting::update() - * @see WP_Customize_Nav_Menu_Item_Setting::amend_customize_save_response() - */ - public $update_error; - - /** - * Constructor. - * - * Any supplied $args override class property defaults. - * - * @since 4.3.0 - * @access public - * - * @param WP_Customize_Manager $manager Bootstrap Customizer instance. - * @param string $id An specific ID of the setting. Can be a - * theme mod or option name. - * @param array $args Optional. Setting arguments. - * - * @throws Exception If $id is not valid for this setting type. - */ - public function __construct( WP_Customize_Manager $manager, $id, array $args = array() ) { - if ( empty( $manager->nav_menus ) ) { - throw new Exception( 'Expected WP_Customize_Manager::$nav_menus to be set.' ); - } - - if ( ! preg_match( self::ID_PATTERN, $id, $matches ) ) { - throw new Exception( "Illegal widget setting ID: $id" ); - } - - $this->post_id = intval( $matches['id'] ); - add_action( 'wp_update_nav_menu_item', array( $this, 'flush_cached_value' ), 10, 2 ); - - parent::__construct( $manager, $id, $args ); - - // Ensure that an initially-supplied value is valid. - if ( isset( $this->value ) ) { - $this->populate_value(); - foreach ( array_diff( array_keys( $this->default ), array_keys( $this->value ) ) as $missing ) { - throw new Exception( "Supplied nav_menu_item value missing property: $missing" ); - } - } - - } - - /** - * Clear the cached value when this nav menu item is updated. - * - * @since 4.3.0 - * @access public - * - * @param int $menu_id The term ID for the menu. - * @param int $menu_item_id The post ID for the menu item. - */ - public function flush_cached_value( $menu_id, $menu_item_id ) { - unset( $menu_id ); - if ( $menu_item_id === $this->post_id ) { - $this->value = null; - } - } - - /** - * Get the instance data for a given nav_menu_item setting. - * - * @since 4.3.0 - * @access public - * - * @see wp_setup_nav_menu_item() - * - * @return array|false Instance data array, or false if the item is marked for deletion. - */ - public function value() { - if ( $this->is_previewed && $this->_previewed_blog_id === get_current_blog_id() ) { - $undefined = new stdClass(); // Symbol. - $post_value = $this->post_value( $undefined ); - - if ( $undefined === $post_value ) { - $value = $this->_original_value; - } else { - $value = $post_value; - } - if ( ! empty( $value ) && empty( $value['original_title'] ) ) { - $value['original_title'] = $this->get_original_title( (object) $value ); - } - } elseif ( isset( $this->value ) ) { - $value = $this->value; - } else { - $value = false; - - // Note that a ID of less than one indicates a nav_menu not yet inserted. - if ( $this->post_id > 0 ) { - $post = get_post( $this->post_id ); - if ( $post && self::POST_TYPE === $post->post_type ) { - $is_title_empty = empty( $post->post_title ); - $value = (array) wp_setup_nav_menu_item( $post ); - if ( $is_title_empty ) { - $value['title'] = ''; - } - } - } - - if ( ! is_array( $value ) ) { - $value = $this->default; - } - - // Cache the value for future calls to avoid having to re-call wp_setup_nav_menu_item(). - $this->value = $value; - $this->populate_value(); - $value = $this->value; - } - - if ( ! empty( $value ) && empty( $value['type_label'] ) ) { - $value['type_label'] = $this->get_type_label( (object) $value ); - } - - return $value; - } - - /** - * Get original title. - * - * @since 4.7.0 - * @access protected - * - * @param object $item Nav menu item. - * @return string The original title. - */ - protected function get_original_title( $item ) { - $original_title = ''; - if ( 'post_type' === $item->type && ! empty( $item->object_id ) ) { - $original_object = get_post( $item->object_id ); - if ( $original_object ) { - /** This filter is documented in wp-includes/post-template.php */ - $original_title = apply_filters( 'the_title', $original_object->post_title, $original_object->ID ); - - if ( '' === $original_title ) { - /* translators: %d: ID of a post */ - $original_title = sprintf( __( '#%d (no title)' ), $original_object->ID ); - } - } - } elseif ( 'taxonomy' === $item->type && ! empty( $item->object_id ) ) { - $original_term_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' ); - if ( ! is_wp_error( $original_term_title ) ) { - $original_title = $original_term_title; - } - } elseif ( 'post_type_archive' === $item->type ) { - $original_object = get_post_type_object( $item->object ); - if ( $original_object ) { - $original_title = $original_object->labels->archives; - } - } - $original_title = html_entity_decode( $original_title, ENT_QUOTES, get_bloginfo( 'charset' ) ); - return $original_title; - } - - /** - * Get type label. - * - * @since 4.7.0 - * @access protected - * - * @param object $item Nav menu item. - * @returns string The type label. - */ - protected function get_type_label( $item ) { - if ( 'post_type' === $item->type ) { - $object = get_post_type_object( $item->object ); - if ( $object ) { - $type_label = $object->labels->singular_name; - } else { - $type_label = $item->object; - } - } elseif ( 'taxonomy' === $item->type ) { - $object = get_taxonomy( $item->object ); - if ( $object ) { - $type_label = $object->labels->singular_name; - } else { - $type_label = $item->object; - } - } elseif ( 'post_type_archive' === $item->type ) { - $type_label = __( 'Post Type Archive' ); - } else { - $type_label = __( 'Custom Link' ); - } - return $type_label; - } - - /** - * Ensure that the value is fully populated with the necessary properties. - * - * Translates some properties added by wp_setup_nav_menu_item() and removes others. - * - * @since 4.3.0 - * @access protected - * - * @see WP_Customize_Nav_Menu_Item_Setting::value() - */ - protected function populate_value() { - if ( ! is_array( $this->value ) ) { - return; - } - - if ( isset( $this->value['menu_order'] ) ) { - $this->value['position'] = $this->value['menu_order']; - unset( $this->value['menu_order'] ); - } - if ( isset( $this->value['post_status'] ) ) { - $this->value['status'] = $this->value['post_status']; - unset( $this->value['post_status'] ); - } - - if ( ! isset( $this->value['original_title'] ) ) { - $this->value['original_title'] = $this->get_original_title( (object) $this->value ); - } - - if ( ! isset( $this->value['nav_menu_term_id'] ) && $this->post_id > 0 ) { - $menus = wp_get_post_terms( $this->post_id, WP_Customize_Nav_Menu_Setting::TAXONOMY, array( - 'fields' => 'ids', - ) ); - if ( ! empty( $menus ) ) { - $this->value['nav_menu_term_id'] = array_shift( $menus ); - } else { - $this->value['nav_menu_term_id'] = 0; - } - } - - foreach ( array( 'object_id', 'menu_item_parent', 'nav_menu_term_id' ) as $key ) { - if ( ! is_int( $this->value[ $key ] ) ) { - $this->value[ $key ] = intval( $this->value[ $key ] ); - } - } - foreach ( array( 'classes', 'xfn' ) as $key ) { - if ( is_array( $this->value[ $key ] ) ) { - $this->value[ $key ] = implode( ' ', $this->value[ $key ] ); - } - } - - if ( ! isset( $this->value['title'] ) ) { - $this->value['title'] = ''; - } - - if ( ! isset( $this->value['_invalid'] ) ) { - $this->value['_invalid'] = false; - $is_known_invalid = ( - ( ( 'post_type' === $this->value['type'] || 'post_type_archive' === $this->value['type'] ) && ! post_type_exists( $this->value['object'] ) ) - || - ( 'taxonomy' === $this->value['type'] && ! taxonomy_exists( $this->value['object'] ) ) - ); - if ( $is_known_invalid ) { - $this->value['_invalid'] = true; - } - } - - // Remove remaining properties available on a setup nav_menu_item post object which aren't relevant to the setting value. - $irrelevant_properties = array( - 'ID', - 'comment_count', - 'comment_status', - 'db_id', - 'filter', - 'guid', - 'ping_status', - 'pinged', - 'post_author', - 'post_content', - 'post_content_filtered', - 'post_date', - 'post_date_gmt', - 'post_excerpt', - 'post_mime_type', - 'post_modified', - 'post_modified_gmt', - 'post_name', - 'post_parent', - 'post_password', - 'post_title', - 'post_type', - 'to_ping', - ); - foreach ( $irrelevant_properties as $property ) { - unset( $this->value[ $property ] ); - } - } - - /** - * Handle previewing the setting. - * - * @since 4.3.0 - * @since 4.4.0 Added boolean return value. - * @access public - * - * @see WP_Customize_Manager::post_value() - * - * @return bool False if method short-circuited due to no-op. - */ - public function preview() { - if ( $this->is_previewed ) { - return false; - } - - $undefined = new stdClass(); - $is_placeholder = ( $this->post_id < 0 ); - $is_dirty = ( $undefined !== $this->post_value( $undefined ) ); - if ( ! $is_placeholder && ! $is_dirty ) { - return false; - } - - $this->is_previewed = true; - $this->_original_value = $this->value(); - $this->original_nav_menu_term_id = $this->_original_value['nav_menu_term_id']; - $this->_previewed_blog_id = get_current_blog_id(); - - add_filter( 'wp_get_nav_menu_items', array( $this, 'filter_wp_get_nav_menu_items' ), 10, 3 ); - - $sort_callback = array( __CLASS__, 'sort_wp_get_nav_menu_items' ); - if ( ! has_filter( 'wp_get_nav_menu_items', $sort_callback ) ) { - add_filter( 'wp_get_nav_menu_items', array( __CLASS__, 'sort_wp_get_nav_menu_items' ), 1000, 3 ); - } - - // @todo Add get_post_metadata filters for plugins to add their data. - - return true; - } - - /** - * Filters the wp_get_nav_menu_items() result to supply the previewed menu items. - * - * @since 4.3.0 - * @access public - * - * @see wp_get_nav_menu_items() - * - * @param array $items An array of menu item post objects. - * @param object $menu The menu object. - * @param array $args An array of arguments used to retrieve menu item objects. - * @return array Array of menu items, - */ - public function filter_wp_get_nav_menu_items( $items, $menu, $args ) { - $this_item = $this->value(); - $current_nav_menu_term_id = $this_item['nav_menu_term_id']; - unset( $this_item['nav_menu_term_id'] ); - - $should_filter = ( - $menu->term_id === $this->original_nav_menu_term_id - || - $menu->term_id === $current_nav_menu_term_id - ); - if ( ! $should_filter ) { - return $items; - } - - // Handle deleted menu item, or menu item moved to another menu. - $should_remove = ( - false === $this_item - || - true === $this_item['_invalid'] - || - ( - $this->original_nav_menu_term_id === $menu->term_id - && - $current_nav_menu_term_id !== $this->original_nav_menu_term_id - ) - ); - if ( $should_remove ) { - $filtered_items = array(); - foreach ( $items as $item ) { - if ( $item->db_id !== $this->post_id ) { - $filtered_items[] = $item; - } - } - return $filtered_items; - } - - $mutated = false; - $should_update = ( - is_array( $this_item ) - && - $current_nav_menu_term_id === $menu->term_id - ); - if ( $should_update ) { - foreach ( $items as $item ) { - if ( $item->db_id === $this->post_id ) { - foreach ( get_object_vars( $this->value_as_wp_post_nav_menu_item() ) as $key => $value ) { - $item->$key = $value; - } - $mutated = true; - } - } - - // Not found so we have to append it.. - if ( ! $mutated ) { - $items[] = $this->value_as_wp_post_nav_menu_item(); - } - } - - return $items; - } - - /** - * Re-apply the tail logic also applied on $items by wp_get_nav_menu_items(). - * - * @since 4.3.0 - * @access public - * @static - * - * @see wp_get_nav_menu_items() - * - * @param array $items An array of menu item post objects. - * @param object $menu The menu object. - * @param array $args An array of arguments used to retrieve menu item objects. - * @return array Array of menu items, - */ - public static function sort_wp_get_nav_menu_items( $items, $menu, $args ) { - // @todo We should probably re-apply some constraints imposed by $args. - unset( $args['include'] ); - - // Remove invalid items only in front end. - if ( ! is_admin() ) { - $items = array_filter( $items, '_is_valid_nav_menu_item' ); - } - - if ( ARRAY_A === $args['output'] ) { - $items = wp_list_sort( $items, array( - $args['output_key'] => 'ASC', - ) ); - $i = 1; - - foreach ( $items as $k => $item ) { - $items[ $k ]->{$args['output_key']} = $i++; - } - } - - return $items; - } - - /** - * Get the value emulated into a WP_Post and set up as a nav_menu_item. - * - * @since 4.3.0 - * @access public - * - * @return WP_Post With wp_setup_nav_menu_item() applied. - */ - public function value_as_wp_post_nav_menu_item() { - $item = (object) $this->value(); - unset( $item->nav_menu_term_id ); - - $item->post_status = $item->status; - unset( $item->status ); - - $item->post_type = 'nav_menu_item'; - $item->menu_order = $item->position; - unset( $item->position ); - - if ( empty( $item->original_title ) ) { - $item->original_title = $this->get_original_title( $item ); - } - if ( empty( $item->title ) && ! empty( $item->original_title ) ) { - $item->title = $item->original_title; - } - if ( $item->title ) { - $item->post_title = $item->title; - } - - $item->ID = $this->post_id; - $item->db_id = $this->post_id; - $post = new WP_Post( (object) $item ); - - if ( empty( $post->post_author ) ) { - $post->post_author = get_current_user_id(); - } - - if ( ! isset( $post->type_label ) ) { - $post->type_label = $this->get_type_label( $post ); - } - - // Ensure nav menu item URL is set according to linked object. - if ( 'post_type' === $post->type && ! empty( $post->object_id ) ) { - $post->url = get_permalink( $post->object_id ); - } elseif ( 'taxonomy' === $post->type && ! empty( $post->object ) && ! empty( $post->object_id ) ) { - $post->url = get_term_link( (int) $post->object_id, $post->object ); - } elseif ( 'post_type_archive' === $post->type && ! empty( $post->object ) ) { - $post->url = get_post_type_archive_link( $post->object ); - } - if ( is_wp_error( $post->url ) ) { - $post->url = ''; - } - - /** This filter is documented in wp-includes/nav-menu.php */ - $post->attr_title = apply_filters( 'nav_menu_attr_title', $post->attr_title ); - - /** This filter is documented in wp-includes/nav-menu.php */ - $post->description = apply_filters( 'nav_menu_description', wp_trim_words( $post->description, 200 ) ); - - /** This filter is documented in wp-includes/nav-menu.php */ - $post = apply_filters( 'wp_setup_nav_menu_item', $post ); - - return $post; - } - - /** - * Sanitize an input. - * - * Note that parent::sanitize() erroneously does wp_unslash() on $value, but - * we remove that in this override. - * - * @since 4.3.0 - * @access public - * - * @param array $menu_item_value The value to sanitize. - * @return array|false|null Null if an input isn't valid. False if it is marked for deletion. - * Otherwise the sanitized value. - */ - public function sanitize( $menu_item_value ) { - // Menu is marked for deletion. - if ( false === $menu_item_value ) { - return $menu_item_value; - } - - // Invalid. - if ( ! is_array( $menu_item_value ) ) { - return null; - } - - $default = array( - 'object_id' => 0, - 'object' => '', - 'menu_item_parent' => 0, - 'position' => 0, - 'type' => 'custom', - 'title' => '', - 'url' => '', - 'target' => '', - 'attr_title' => '', - 'description' => '', - 'classes' => '', - 'xfn' => '', - 'status' => 'publish', - 'original_title' => '', - 'nav_menu_term_id' => 0, - '_invalid' => false, - ); - $menu_item_value = array_merge( $default, $menu_item_value ); - $menu_item_value = wp_array_slice_assoc( $menu_item_value, array_keys( $default ) ); - $menu_item_value['position'] = intval( $menu_item_value['position'] ); - - foreach ( array( 'object_id', 'menu_item_parent', 'nav_menu_term_id' ) as $key ) { - // Note we need to allow negative-integer IDs for previewed objects not inserted yet. - $menu_item_value[ $key ] = intval( $menu_item_value[ $key ] ); - } - - foreach ( array( 'type', 'object', 'target' ) as $key ) { - $menu_item_value[ $key ] = sanitize_key( $menu_item_value[ $key ] ); - } - - foreach ( array( 'xfn', 'classes' ) as $key ) { - $value = $menu_item_value[ $key ]; - if ( ! is_array( $value ) ) { - $value = explode( ' ', $value ); - } - $menu_item_value[ $key ] = implode( ' ', array_map( 'sanitize_html_class', $value ) ); - } - - $menu_item_value['original_title'] = sanitize_text_field( $menu_item_value['original_title'] ); - - // Apply the same filters as when calling wp_insert_post(). - $menu_item_value['title'] = wp_unslash( apply_filters( 'title_save_pre', wp_slash( $menu_item_value['title'] ) ) ); - $menu_item_value['attr_title'] = wp_unslash( apply_filters( 'excerpt_save_pre', wp_slash( $menu_item_value['attr_title'] ) ) ); - $menu_item_value['description'] = wp_unslash( apply_filters( 'content_save_pre', wp_slash( $menu_item_value['description'] ) ) ); - - $menu_item_value['url'] = esc_url_raw( $menu_item_value['url'] ); - if ( 'publish' !== $menu_item_value['status'] ) { - $menu_item_value['status'] = 'draft'; - } - - $menu_item_value['_invalid'] = (bool) $menu_item_value['_invalid']; - - /** This filter is documented in wp-includes/class-wp-customize-setting.php */ - return apply_filters( "customize_sanitize_{$this->id}", $menu_item_value, $this ); - } - - /** - * Creates/updates the nav_menu_item post for this setting. - * - * Any created menu items will have their assigned post IDs exported to the client - * via the {@see 'customize_save_response'} filter. Likewise, any errors will be - * exported to the client via the customize_save_response() filter. - * - * To delete a menu, the client can send false as the value. - * - * @since 4.3.0 - * @access protected - * - * @see wp_update_nav_menu_item() - * - * @param array|false $value The menu item array to update. If false, then the menu item will be deleted - * entirely. See WP_Customize_Nav_Menu_Item_Setting::$default for what the value - * should consist of. - * @return null|void - */ - protected function update( $value ) { - if ( $this->is_updated ) { - return; - } - - $this->is_updated = true; - $is_placeholder = ( $this->post_id < 0 ); - $is_delete = ( false === $value ); - - // Update the cached value. - $this->value = $value; - - add_filter( 'customize_save_response', array( $this, 'amend_customize_save_response' ) ); - - if ( $is_delete ) { - // If the current setting post is a placeholder, a delete request is a no-op. - if ( $is_placeholder ) { - $this->update_status = 'deleted'; - } else { - $r = wp_delete_post( $this->post_id, true ); - - if ( false === $r ) { - $this->update_error = new WP_Error( 'delete_failure' ); - $this->update_status = 'error'; - } else { - $this->update_status = 'deleted'; - } - // @todo send back the IDs for all associated nav menu items deleted, so these settings (and controls) can be removed from Customizer? - } - } else { - - // Handle saving menu items for menus that are being newly-created. - if ( $value['nav_menu_term_id'] < 0 ) { - $nav_menu_setting_id = sprintf( 'nav_menu[%s]', $value['nav_menu_term_id'] ); - $nav_menu_setting = $this->manager->get_setting( $nav_menu_setting_id ); - - if ( ! $nav_menu_setting || ! ( $nav_menu_setting instanceof WP_Customize_Nav_Menu_Setting ) ) { - $this->update_status = 'error'; - $this->update_error = new WP_Error( 'unexpected_nav_menu_setting' ); - return; - } - - if ( false === $nav_menu_setting->save() ) { - $this->update_status = 'error'; - $this->update_error = new WP_Error( 'nav_menu_setting_failure' ); - return; - } - - if ( $nav_menu_setting->previous_term_id !== intval( $value['nav_menu_term_id'] ) ) { - $this->update_status = 'error'; - $this->update_error = new WP_Error( 'unexpected_previous_term_id' ); - return; - } - - $value['nav_menu_term_id'] = $nav_menu_setting->term_id; - } - - // Handle saving a nav menu item that is a child of a nav menu item being newly-created. - if ( $value['menu_item_parent'] < 0 ) { - $parent_nav_menu_item_setting_id = sprintf( 'nav_menu_item[%s]', $value['menu_item_parent'] ); - $parent_nav_menu_item_setting = $this->manager->get_setting( $parent_nav_menu_item_setting_id ); - - if ( ! $parent_nav_menu_item_setting || ! ( $parent_nav_menu_item_setting instanceof WP_Customize_Nav_Menu_Item_Setting ) ) { - $this->update_status = 'error'; - $this->update_error = new WP_Error( 'unexpected_nav_menu_item_setting' ); - return; - } - - if ( false === $parent_nav_menu_item_setting->save() ) { - $this->update_status = 'error'; - $this->update_error = new WP_Error( 'nav_menu_item_setting_failure' ); - return; - } - - if ( $parent_nav_menu_item_setting->previous_post_id !== intval( $value['menu_item_parent'] ) ) { - $this->update_status = 'error'; - $this->update_error = new WP_Error( 'unexpected_previous_post_id' ); - return; - } - - $value['menu_item_parent'] = $parent_nav_menu_item_setting->post_id; - } - - // Insert or update menu. - $menu_item_data = array( - 'menu-item-object-id' => $value['object_id'], - 'menu-item-object' => $value['object'], - 'menu-item-parent-id' => $value['menu_item_parent'], - 'menu-item-position' => $value['position'], - 'menu-item-type' => $value['type'], - 'menu-item-title' => $value['title'], - 'menu-item-url' => $value['url'], - 'menu-item-description' => $value['description'], - 'menu-item-attr-title' => $value['attr_title'], - 'menu-item-target' => $value['target'], - 'menu-item-classes' => $value['classes'], - 'menu-item-xfn' => $value['xfn'], - 'menu-item-status' => $value['status'], - ); - - $r = wp_update_nav_menu_item( - $value['nav_menu_term_id'], - $is_placeholder ? 0 : $this->post_id, - wp_slash( $menu_item_data ) - ); - - if ( is_wp_error( $r ) ) { - $this->update_status = 'error'; - $this->update_error = $r; - } else { - if ( $is_placeholder ) { - $this->previous_post_id = $this->post_id; - $this->post_id = $r; - $this->update_status = 'inserted'; - } else { - $this->update_status = 'updated'; - } - } - } - - } - - /** - * Export data for the JS client. - * - * @since 4.3.0 - * @access public - * - * @see WP_Customize_Nav_Menu_Item_Setting::update() - * - * @param array $data Additional information passed back to the 'saved' event on `wp.customize`. - * @return array Save response data. - */ - public function amend_customize_save_response( $data ) { - if ( ! isset( $data['nav_menu_item_updates'] ) ) { - $data['nav_menu_item_updates'] = array(); - } - - $data['nav_menu_item_updates'][] = array( - 'post_id' => $this->post_id, - 'previous_post_id' => $this->previous_post_id, - 'error' => $this->update_error ? $this->update_error->get_error_code() : null, - 'status' => $this->update_status, - ); - return $data; - } -} diff --git a/wp/wp-includes/customize/class-wp-customize-nav-menu-location-control.php b/wp/wp-includes/customize/class-wp-customize-nav-menu-location-control.php deleted file mode 100644 index 68cd7bff..00000000 --- a/wp/wp-includes/customize/class-wp-customize-nav-menu-location-control.php +++ /dev/null @@ -1,83 +0,0 @@ -json['locationId'] = $this->location_id; - } - - /** - * Render content just like a normal select control. - * - * @since 4.3.0 - * @access public - */ - public function render_content() { - if ( empty( $this->choices ) ) { - return; - } - ?> - - - - - id ) ); - - return $exported; - } -} diff --git a/wp/wp-includes/customize/class-wp-customize-nav-menu-setting.php b/wp/wp-includes/customize/class-wp-customize-nav-menu-setting.php deleted file mode 100644 index 4d65cc4c..00000000 --- a/wp/wp-includes/customize/class-wp-customize-nav-menu-setting.php +++ /dev/null @@ -1,661 +0,0 @@ --?\d+)\]$/'; - - const TAXONOMY = 'nav_menu'; - - const TYPE = 'nav_menu'; - - /** - * Setting type. - * - * @since 4.3.0 - * @access public - * @var string - */ - public $type = self::TYPE; - - /** - * Default setting value. - * - * @since 4.3.0 - * @access public - * @var array - * - * @see wp_get_nav_menu_object() - */ - public $default = array( - 'name' => '', - 'description' => '', - 'parent' => 0, - 'auto_add' => false, - ); - - /** - * Default transport. - * - * @since 4.3.0 - * @access public - * @var string - */ - public $transport = 'postMessage'; - - /** - * The term ID represented by this setting instance. - * - * A negative value represents a placeholder ID for a new menu not yet saved. - * - * @since 4.3.0 - * @access public - * @var int - */ - public $term_id; - - /** - * Previous (placeholder) term ID used before creating a new menu. - * - * This value will be exported to JS via the {@see 'customize_save_response'} filter - * so that JavaScript can update the settings to refer to the newly-assigned - * term ID. This value is always negative to indicate it does not refer to - * a real term. - * - * @since 4.3.0 - * @access public - * @var int - * - * @see WP_Customize_Nav_Menu_Setting::update() - * @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response() - */ - public $previous_term_id; - - /** - * Whether or not update() was called. - * - * @since 4.3.0 - * @access protected - * @var bool - */ - protected $is_updated = false; - - /** - * Status for calling the update method, used in customize_save_response filter. - * - * See {@see 'customize_save_response'}. - * - * When status is inserted, the placeholder term ID is stored in `$previous_term_id`. - * When status is error, the error is stored in `$update_error`. - * - * @since 4.3.0 - * @access public - * @var string updated|inserted|deleted|error - * - * @see WP_Customize_Nav_Menu_Setting::update() - * @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response() - */ - public $update_status; - - /** - * Any error object returned by wp_update_nav_menu_object() when setting is updated. - * - * @since 4.3.0 - * @access public - * @var WP_Error - * - * @see WP_Customize_Nav_Menu_Setting::update() - * @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response() - */ - public $update_error; - - /** - * Constructor. - * - * Any supplied $args override class property defaults. - * - * @since 4.3.0 - * @access public - * - * @param WP_Customize_Manager $manager Bootstrap Customizer instance. - * @param string $id An specific ID of the setting. Can be a - * theme mod or option name. - * @param array $args Optional. Setting arguments. - * - * @throws Exception If $id is not valid for this setting type. - */ - public function __construct( WP_Customize_Manager $manager, $id, array $args = array() ) { - if ( empty( $manager->nav_menus ) ) { - throw new Exception( 'Expected WP_Customize_Manager::$nav_menus to be set.' ); - } - - if ( ! preg_match( self::ID_PATTERN, $id, $matches ) ) { - throw new Exception( "Illegal widget setting ID: $id" ); - } - - $this->term_id = intval( $matches['id'] ); - - parent::__construct( $manager, $id, $args ); - } - - /** - * Get the instance data for a given widget setting. - * - * @since 4.3.0 - * @access public - * - * @see wp_get_nav_menu_object() - * - * @return array Instance data. - */ - public function value() { - if ( $this->is_previewed && $this->_previewed_blog_id === get_current_blog_id() ) { - $undefined = new stdClass(); // Symbol. - $post_value = $this->post_value( $undefined ); - - if ( $undefined === $post_value ) { - $value = $this->_original_value; - } else { - $value = $post_value; - } - } else { - $value = false; - - // Note that a term_id of less than one indicates a nav_menu not yet inserted. - if ( $this->term_id > 0 ) { - $term = wp_get_nav_menu_object( $this->term_id ); - - if ( $term ) { - $value = wp_array_slice_assoc( (array) $term, array_keys( $this->default ) ); - - $nav_menu_options = (array) get_option( 'nav_menu_options', array() ); - $value['auto_add'] = false; - - if ( isset( $nav_menu_options['auto_add'] ) && is_array( $nav_menu_options['auto_add'] ) ) { - $value['auto_add'] = in_array( $term->term_id, $nav_menu_options['auto_add'] ); - } - } - } - - if ( ! is_array( $value ) ) { - $value = $this->default; - } - } - return $value; - } - - /** - * Handle previewing the setting. - * - * @since 4.3.0 - * @since 4.4.0 Added boolean return value - * @access public - * - * @see WP_Customize_Manager::post_value() - * - * @return bool False if method short-circuited due to no-op. - */ - public function preview() { - if ( $this->is_previewed ) { - return false; - } - - $undefined = new stdClass(); - $is_placeholder = ( $this->term_id < 0 ); - $is_dirty = ( $undefined !== $this->post_value( $undefined ) ); - if ( ! $is_placeholder && ! $is_dirty ) { - return false; - } - - $this->is_previewed = true; - $this->_original_value = $this->value(); - $this->_previewed_blog_id = get_current_blog_id(); - - add_filter( 'wp_get_nav_menus', array( $this, 'filter_wp_get_nav_menus' ), 10, 2 ); - add_filter( 'wp_get_nav_menu_object', array( $this, 'filter_wp_get_nav_menu_object' ), 10, 2 ); - add_filter( 'default_option_nav_menu_options', array( $this, 'filter_nav_menu_options' ) ); - add_filter( 'option_nav_menu_options', array( $this, 'filter_nav_menu_options' ) ); - - return true; - } - - /** - * Filters the wp_get_nav_menus() result to ensure the inserted menu object is included, and the deleted one is removed. - * - * @since 4.3.0 - * @access public - * - * @see wp_get_nav_menus() - * - * @param array $menus An array of menu objects. - * @param array $args An array of arguments used to retrieve menu objects. - * @return array - */ - public function filter_wp_get_nav_menus( $menus, $args ) { - if ( get_current_blog_id() !== $this->_previewed_blog_id ) { - return $menus; - } - - $setting_value = $this->value(); - $is_delete = ( false === $setting_value ); - $index = -1; - - // Find the existing menu item's position in the list. - foreach ( $menus as $i => $menu ) { - if ( (int) $this->term_id === (int) $menu->term_id || (int) $this->previous_term_id === (int) $menu->term_id ) { - $index = $i; - break; - } - } - - if ( $is_delete ) { - // Handle deleted menu by removing it from the list. - if ( -1 !== $index ) { - array_splice( $menus, $index, 1 ); - } - } else { - // Handle menus being updated or inserted. - $menu_obj = (object) array_merge( array( - 'term_id' => $this->term_id, - 'term_taxonomy_id' => $this->term_id, - 'slug' => sanitize_title( $setting_value['name'] ), - 'count' => 0, - 'term_group' => 0, - 'taxonomy' => self::TAXONOMY, - 'filter' => 'raw', - ), $setting_value ); - - array_splice( $menus, $index, ( -1 === $index ? 0 : 1 ), array( $menu_obj ) ); - } - - // Make sure the menu objects get re-sorted after an update/insert. - if ( ! $is_delete && ! empty( $args['orderby'] ) ) { - $menus = wp_list_sort( $menus, array( - $args['orderby'] => 'ASC', - ) ); - } - // @todo add support for $args['hide_empty'] === true - - return $menus; - } - - /** - * Temporary non-closure passing of orderby value to function. - * - * @since 4.3.0 - * @access protected - * @var string - * - * @see WP_Customize_Nav_Menu_Setting::filter_wp_get_nav_menus() - * @see WP_Customize_Nav_Menu_Setting::_sort_menus_by_orderby() - */ - protected $_current_menus_sort_orderby; - - /** - * Sort menu objects by the class-supplied orderby property. - * - * This is a workaround for a lack of closures. - * - * @since 4.3.0 - * @deprecated 4.7.0 Use wp_list_sort() - * @access protected - * - * @param object $menu1 - * @param object $menu2 - * @return int - * - * @see WP_Customize_Nav_Menu_Setting::filter_wp_get_nav_menus() - */ - protected function _sort_menus_by_orderby( $menu1, $menu2 ) { - _deprecated_function( __METHOD__, '4.7.0', 'wp_list_sort' ); - - $key = $this->_current_menus_sort_orderby; - return strcmp( $menu1->$key, $menu2->$key ); - } - - /** - * Filters the wp_get_nav_menu_object() result to supply the previewed menu object. - * - * Requesting a nav_menu object by anything but ID is not supported. - * - * @since 4.3.0 - * @access public - * - * @see wp_get_nav_menu_object() - * - * @param object|null $menu_obj Object returned by wp_get_nav_menu_object(). - * @param string $menu_id ID of the nav_menu term. Requests by slug or name will be ignored. - * @return object|null - */ - public function filter_wp_get_nav_menu_object( $menu_obj, $menu_id ) { - $ok = ( - get_current_blog_id() === $this->_previewed_blog_id - && - is_int( $menu_id ) - && - $menu_id === $this->term_id - ); - if ( ! $ok ) { - return $menu_obj; - } - - $setting_value = $this->value(); - - // Handle deleted menus. - if ( false === $setting_value ) { - return false; - } - - // Handle sanitization failure by preventing short-circuiting. - if ( null === $setting_value ) { - return $menu_obj; - } - - $menu_obj = (object) array_merge( array( - 'term_id' => $this->term_id, - 'term_taxonomy_id' => $this->term_id, - 'slug' => sanitize_title( $setting_value['name'] ), - 'count' => 0, - 'term_group' => 0, - 'taxonomy' => self::TAXONOMY, - 'filter' => 'raw', - ), $setting_value ); - - return $menu_obj; - } - - /** - * Filters the nav_menu_options option to include this menu's auto_add preference. - * - * @since 4.3.0 - * @access public - * - * @param array $nav_menu_options Nav menu options including auto_add. - * @return array (Kaybe) modified nav menu options. - */ - public function filter_nav_menu_options( $nav_menu_options ) { - if ( $this->_previewed_blog_id !== get_current_blog_id() ) { - return $nav_menu_options; - } - - $menu = $this->value(); - $nav_menu_options = $this->filter_nav_menu_options_value( - $nav_menu_options, - $this->term_id, - false === $menu ? false : $menu['auto_add'] - ); - - return $nav_menu_options; - } - - /** - * Sanitize an input. - * - * Note that parent::sanitize() erroneously does wp_unslash() on $value, but - * we remove that in this override. - * - * @since 4.3.0 - * @access public - * - * @param array $value The value to sanitize. - * @return array|false|null Null if an input isn't valid. False if it is marked for deletion. - * Otherwise the sanitized value. - */ - public function sanitize( $value ) { - // Menu is marked for deletion. - if ( false === $value ) { - return $value; - } - - // Invalid. - if ( ! is_array( $value ) ) { - return null; - } - - $default = array( - 'name' => '', - 'description' => '', - 'parent' => 0, - 'auto_add' => false, - ); - $value = array_merge( $default, $value ); - $value = wp_array_slice_assoc( $value, array_keys( $default ) ); - - $value['name'] = trim( esc_html( $value['name'] ) ); // This sanitization code is used in wp-admin/nav-menus.php. - $value['description'] = sanitize_text_field( $value['description'] ); - $value['parent'] = max( 0, intval( $value['parent'] ) ); - $value['auto_add'] = ! empty( $value['auto_add'] ); - - if ( '' === $value['name'] ) { - $value['name'] = _x( '(unnamed)', 'Missing menu name.' ); - } - - /** This filter is documented in wp-includes/class-wp-customize-setting.php */ - return apply_filters( "customize_sanitize_{$this->id}", $value, $this ); - } - - /** - * Storage for data to be sent back to client in customize_save_response filter. - * - * See {@see 'customize_save_response'}. - * - * @access protected - * @since 4.3.0 - * @var array - * - * @see WP_Customize_Nav_Menu_Setting::amend_customize_save_response() - */ - protected $_widget_nav_menu_updates = array(); - - /** - * Create/update the nav_menu term for this setting. - * - * Any created menus will have their assigned term IDs exported to the client - * via the {@see 'customize_save_response'} filter. Likewise, any errors will be exported - * to the client via the customize_save_response() filter. - * - * To delete a menu, the client can send false as the value. - * - * @since 4.3.0 - * @access protected - * - * @see wp_update_nav_menu_object() - * - * @param array|false $value { - * The value to update. Note that slug cannot be updated via wp_update_nav_menu_object(). - * If false, then the menu will be deleted entirely. - * - * @type string $name The name of the menu to save. - * @type string $description The term description. Default empty string. - * @type int $parent The id of the parent term. Default 0. - * @type bool $auto_add Whether pages will auto_add to this menu. Default false. - * } - * @return null|void - */ - protected function update( $value ) { - if ( $this->is_updated ) { - return; - } - - $this->is_updated = true; - $is_placeholder = ( $this->term_id < 0 ); - $is_delete = ( false === $value ); - - add_filter( 'customize_save_response', array( $this, 'amend_customize_save_response' ) ); - - $auto_add = null; - if ( $is_delete ) { - // If the current setting term is a placeholder, a delete request is a no-op. - if ( $is_placeholder ) { - $this->update_status = 'deleted'; - } else { - $r = wp_delete_nav_menu( $this->term_id ); - - if ( is_wp_error( $r ) ) { - $this->update_status = 'error'; - $this->update_error = $r; - } else { - $this->update_status = 'deleted'; - $auto_add = false; - } - } - } else { - // Insert or update menu. - $menu_data = wp_array_slice_assoc( $value, array( 'description', 'parent' ) ); - $menu_data['menu-name'] = $value['name']; - - $menu_id = $is_placeholder ? 0 : $this->term_id; - $r = wp_update_nav_menu_object( $menu_id, wp_slash( $menu_data ) ); - $original_name = $menu_data['menu-name']; - $name_conflict_suffix = 1; - while ( is_wp_error( $r ) && 'menu_exists' === $r->get_error_code() ) { - $name_conflict_suffix += 1; - /* translators: 1: original menu name, 2: duplicate count */ - $menu_data['menu-name'] = sprintf( __( '%1$s (%2$d)' ), $original_name, $name_conflict_suffix ); - $r = wp_update_nav_menu_object( $menu_id, wp_slash( $menu_data ) ); - } - - if ( is_wp_error( $r ) ) { - $this->update_status = 'error'; - $this->update_error = $r; - } else { - if ( $is_placeholder ) { - $this->previous_term_id = $this->term_id; - $this->term_id = $r; - $this->update_status = 'inserted'; - } else { - $this->update_status = 'updated'; - } - - $auto_add = $value['auto_add']; - } - } - - if ( null !== $auto_add ) { - $nav_menu_options = $this->filter_nav_menu_options_value( - (array) get_option( 'nav_menu_options', array() ), - $this->term_id, - $auto_add - ); - update_option( 'nav_menu_options', $nav_menu_options ); - } - - if ( 'inserted' === $this->update_status ) { - // Make sure that new menus assigned to nav menu locations use their new IDs. - foreach ( $this->manager->settings() as $setting ) { - if ( ! preg_match( '/^nav_menu_locations\[/', $setting->id ) ) { - continue; - } - - $post_value = $setting->post_value( null ); - if ( ! is_null( $post_value ) && $this->previous_term_id === intval( $post_value ) ) { - $this->manager->set_post_value( $setting->id, $this->term_id ); - $setting->save(); - } - } - - // Make sure that any nav_menu widgets referencing the placeholder nav menu get updated and sent back to client. - foreach ( array_keys( $this->manager->unsanitized_post_values() ) as $setting_id ) { - $nav_menu_widget_setting = $this->manager->get_setting( $setting_id ); - if ( ! $nav_menu_widget_setting || ! preg_match( '/^widget_nav_menu\[/', $nav_menu_widget_setting->id ) ) { - continue; - } - - $widget_instance = $nav_menu_widget_setting->post_value(); // Note that this calls WP_Customize_Widgets::sanitize_widget_instance(). - if ( empty( $widget_instance['nav_menu'] ) || intval( $widget_instance['nav_menu'] ) !== $this->previous_term_id ) { - continue; - } - - $widget_instance['nav_menu'] = $this->term_id; - $updated_widget_instance = $this->manager->widgets->sanitize_widget_js_instance( $widget_instance ); - $this->manager->set_post_value( $nav_menu_widget_setting->id, $updated_widget_instance ); - $nav_menu_widget_setting->save(); - - $this->_widget_nav_menu_updates[ $nav_menu_widget_setting->id ] = $updated_widget_instance; - } - } - } - - /** - * Updates a nav_menu_options array. - * - * @since 4.3.0 - * @access protected - * - * @see WP_Customize_Nav_Menu_Setting::filter_nav_menu_options() - * @see WP_Customize_Nav_Menu_Setting::update() - * - * @param array $nav_menu_options Array as returned by get_option( 'nav_menu_options' ). - * @param int $menu_id The term ID for the given menu. - * @param bool $auto_add Whether to auto-add or not. - * @return array (Maybe) modified nav_menu_otions array. - */ - protected function filter_nav_menu_options_value( $nav_menu_options, $menu_id, $auto_add ) { - $nav_menu_options = (array) $nav_menu_options; - if ( ! isset( $nav_menu_options['auto_add'] ) ) { - $nav_menu_options['auto_add'] = array(); - } - - $i = array_search( $menu_id, $nav_menu_options['auto_add'] ); - if ( $auto_add && false === $i ) { - array_push( $nav_menu_options['auto_add'], $this->term_id ); - } elseif ( ! $auto_add && false !== $i ) { - array_splice( $nav_menu_options['auto_add'], $i, 1 ); - } - - return $nav_menu_options; - } - - /** - * Export data for the JS client. - * - * @since 4.3.0 - * @access public - * - * @see WP_Customize_Nav_Menu_Setting::update() - * - * @param array $data Additional information passed back to the 'saved' event on `wp.customize`. - * @return array Export data. - */ - public function amend_customize_save_response( $data ) { - if ( ! isset( $data['nav_menu_updates'] ) ) { - $data['nav_menu_updates'] = array(); - } - if ( ! isset( $data['widget_nav_menu_updates'] ) ) { - $data['widget_nav_menu_updates'] = array(); - } - - $data['nav_menu_updates'][] = array( - 'term_id' => $this->term_id, - 'previous_term_id' => $this->previous_term_id, - 'error' => $this->update_error ? $this->update_error->get_error_code() : null, - 'status' => $this->update_status, - 'saved_value' => 'deleted' === $this->update_status ? null : $this->value(), - ); - - $data['widget_nav_menu_updates'] = array_merge( - $data['widget_nav_menu_updates'], - $this->_widget_nav_menu_updates - ); - $this->_widget_nav_menu_updates = array(); - - return $data; - } -} diff --git a/wp/wp-includes/customize/class-wp-customize-nav-menus-panel.php b/wp/wp-includes/customize/class-wp-customize-nav-menus-panel.php deleted file mode 100644 index adb19ee3..00000000 --- a/wp/wp-includes/customize/class-wp-customize-nav-menus-panel.php +++ /dev/null @@ -1,100 +0,0 @@ -render_screen_options( array( 'wrap' => false ) ); - } - - /** - * Returns the advanced options for the nav menus page. - * - * Link title attribute added as it's a relatively advanced concept for new users. - * - * @since 4.3.0 - * @deprecated 4.5.0 Deprecated in favor of wp_nav_menu_manage_columns(). - */ - public function wp_nav_menu_manage_columns() { - _deprecated_function( __METHOD__, '4.5.0', 'wp_nav_menu_manage_columns' ); - require_once ABSPATH . 'wp-admin/includes/nav-menu.php'; - return wp_nav_menu_manage_columns(); - } - - /** - * An Underscore (JS) template for this panel's content (but not its container). - * - * Class variables for this panel class are available in the `data` JS object; - * export custom variables by overriding WP_Customize_Panel::json(). - * - * @since 4.3.0 - * @access protected - * - * @see WP_Customize_Panel::print_template() - */ - protected function content_template() { - ?> -
    7. - -
      - - {{ data.title }}' ); - ?> - - - -
      - <# if ( data.description ) { #> -
      {{{ data.description }}}
      - <# } #> -
      - render_screen_options(); ?> -
      -
    8. - - - - -
    9. - -
        -
      • - $key = $args[ $key ]; - } - } - - $this->component = $component; - $this->id = $id; - $this->id_data['keys'] = preg_split( '/\[/', str_replace( ']', '', $this->id ) ); - $this->id_data['base'] = array_shift( $this->id_data['keys'] ); - - if ( empty( $this->render_callback ) ) { - $this->render_callback = array( $this, 'render_callback' ); - } - - // Process settings. - if ( ! isset( $this->settings ) ) { - $this->settings = array( $id ); - } else if ( is_string( $this->settings ) ) { - $this->settings = array( $this->settings ); - } - - if ( empty( $this->primary_setting ) ) { - $this->primary_setting = current( $this->settings ); - } - } - - /** - * Retrieves parsed ID data for multidimensional setting. - * - * @since 4.5.0 - * @access public - * - * @return array { - * ID data for multidimensional partial. - * - * @type string $base ID base. - * @type array $keys Keys for multidimensional array. - * } - */ - final public function id_data() { - return $this->id_data; - } - - /** - * Renders the template partial involving the associated settings. - * - * @since 4.5.0 - * @access public - * - * @param array $container_context Optional. Array of context data associated with the target container (placement). - * Default empty array. - * @return string|array|false The rendered partial as a string, raw data array (for client-side JS template), - * or false if no render applied. - */ - final public function render( $container_context = array() ) { - $partial = $this; - $rendered = false; - - if ( ! empty( $this->render_callback ) ) { - ob_start(); - $return_render = call_user_func( $this->render_callback, $this, $container_context ); - $ob_render = ob_get_clean(); - - if ( null !== $return_render && '' !== $ob_render ) { - _doing_it_wrong( __FUNCTION__, __( 'Partial render must echo the content or return the content string (or array), but not both.' ), '4.5.0' ); - } - - /* - * Note that the string return takes precedence because the $ob_render may just\ - * include PHP warnings or notices. - */ - $rendered = null !== $return_render ? $return_render : $ob_render; - } - - /** - * Filters partial rendering. - * - * @since 4.5.0 - * - * @param string|array|false $rendered The partial value. Default false. - * @param WP_Customize_Partial $partial WP_Customize_Setting instance. - * @param array $container_context Optional array of context data associated with - * the target container. - */ - $rendered = apply_filters( 'customize_partial_render', $rendered, $partial, $container_context ); - - /** - * Filters partial rendering for a specific partial. - * - * The dynamic portion of the hook name, `$partial->ID` refers to the partial ID. - * - * @since 4.5.0 - * - * @param string|array|false $rendered The partial value. Default false. - * @param WP_Customize_Partial $partial WP_Customize_Setting instance. - * @param array $container_context Optional array of context data associated with - * the target container. - */ - $rendered = apply_filters( "customize_partial_render_{$partial->id}", $rendered, $partial, $container_context ); - - return $rendered; - } - - /** - * Default callback used when invoking WP_Customize_Control::render(). - * - * Note that this method may echo the partial *or* return the partial as - * a string or array, but not both. Output buffering is performed when this - * is called. Subclasses can override this with their specific logic, or they - * may provide an 'render_callback' argument to the constructor. - * - * This method may return an HTML string for straight DOM injection, or it - * may return an array for supporting Partial JS subclasses to render by - * applying to client-side templating. - * - * @since 4.5.0 - * @access public - * - * @param WP_Customize_Partial $partial Partial. - * @param array $context Context. - * @return string|array|false - */ - public function render_callback( WP_Customize_Partial $partial, $context = array() ) { - unset( $partial, $context ); - return false; - } - - /** - * Retrieves the data to export to the client via JSON. - * - * @since 4.5.0 - * @access public - * - * @return array Array of parameters passed to the JavaScript. - */ - public function json() { - $exports = array( - 'settings' => $this->settings, - 'primarySetting' => $this->primary_setting, - 'selector' => $this->selector, - 'type' => $this->type, - 'fallbackRefresh' => $this->fallback_refresh, - 'containerInclusive' => $this->container_inclusive, - ); - return $exports; - } - - /** - * Checks if the user can refresh this partial. - * - * Returns false if the user cannot manipulate one of the associated settings, - * or if one of the associated settings does not exist. - * - * @since 4.5.0 - * @access public - * - * @return bool False if user can't edit one one of the related settings, - * or if one of the associated settings does not exist. - */ - final public function check_capabilities() { - if ( ! empty( $this->capability ) && ! current_user_can( $this->capability ) ) { - return false; - } - foreach ( $this->settings as $setting_id ) { - $setting = $this->component->manager->get_setting( $setting_id ); - if ( ! $setting || ! $setting->check_capabilities() ) { - return false; - } - } - return true; - } -} diff --git a/wp/wp-includes/customize/class-wp-customize-selective-refresh.php b/wp/wp-includes/customize/class-wp-customize-selective-refresh.php deleted file mode 100644 index 76fb5a70..00000000 --- a/wp/wp-includes/customize/class-wp-customize-selective-refresh.php +++ /dev/null @@ -1,452 +0,0 @@ -manager = $manager; - require_once( ABSPATH . WPINC . '/customize/class-wp-customize-partial.php' ); - - add_action( 'customize_preview_init', array( $this, 'init_preview' ) ); - } - - /** - * Retrieves the registered partials. - * - * @since 4.5.0 - * @access public - * - * @return array Partials. - */ - public function partials() { - return $this->partials; - } - - /** - * Adds a partial. - * - * @since 4.5.0 - * @access public - * - * @param WP_Customize_Partial|string $id Customize Partial object, or Panel ID. - * @param array $args Optional. Partial arguments. Default empty array. - * @return WP_Customize_Partial The instance of the panel that was added. - */ - public function add_partial( $id, $args = array() ) { - if ( $id instanceof WP_Customize_Partial ) { - $partial = $id; - } else { - $class = 'WP_Customize_Partial'; - - /** This filter (will be) documented in wp-includes/class-wp-customize-manager.php */ - $args = apply_filters( 'customize_dynamic_partial_args', $args, $id ); - - /** This filter (will be) documented in wp-includes/class-wp-customize-manager.php */ - $class = apply_filters( 'customize_dynamic_partial_class', $class, $id, $args ); - - $partial = new $class( $this, $id, $args ); - } - - $this->partials[ $partial->id ] = $partial; - return $partial; - } - - /** - * Retrieves a partial. - * - * @since 4.5.0 - * @access public - * - * @param string $id Customize Partial ID. - * @return WP_Customize_Partial|null The partial, if set. Otherwise null. - */ - public function get_partial( $id ) { - if ( isset( $this->partials[ $id ] ) ) { - return $this->partials[ $id ]; - } else { - return null; - } - } - - /** - * Removes a partial. - * - * @since 4.5.0 - * @access public - * - * @param string $id Customize Partial ID. - */ - public function remove_partial( $id ) { - unset( $this->partials[ $id ] ); - } - - /** - * Initializes the Customizer preview. - * - * @since 4.5.0 - * @access public - */ - public function init_preview() { - add_action( 'template_redirect', array( $this, 'handle_render_partials_request' ) ); - add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_preview_scripts' ) ); - } - - /** - * Enqueues preview scripts. - * - * @since 4.5.0 - * @access public - */ - public function enqueue_preview_scripts() { - wp_enqueue_script( 'customize-selective-refresh' ); - add_action( 'wp_footer', array( $this, 'export_preview_data' ), 1000 ); - } - - /** - * Exports data in preview after it has finished rendering so that partials can be added at runtime. - * - * @since 4.5.0 - * @access public - */ - public function export_preview_data() { - $partials = array(); - - foreach ( $this->partials() as $partial ) { - if ( $partial->check_capabilities() ) { - $partials[ $partial->id ] = $partial->json(); - } - } - - $switched_locale = switch_to_locale( get_user_locale() ); - $l10n = array( - 'shiftClickToEdit' => __( 'Shift-click to edit this element.' ), - 'clickEditMenu' => __( 'Click to edit this menu.' ), - 'clickEditWidget' => __( 'Click to edit this widget.' ), - 'clickEditTitle' => __( 'Click to edit the site title.' ), - 'clickEditMisc' => __( 'Click to edit this element.' ), - /* translators: %s: document.write() */ - 'badDocumentWrite' => sprintf( __( '%s is forbidden' ), 'document.write()' ), - ); - if ( $switched_locale ) { - restore_previous_locale(); - } - - $exports = array( - 'partials' => $partials, - 'renderQueryVar' => self::RENDER_QUERY_VAR, - 'l10n' => $l10n, - ); - - // Export data to JS. - echo sprintf( '', wp_json_encode( $exports ) ); - } - - /** - * Registers dynamically-created partials. - * - * @since 4.5.0 - * @access public - * - * @see WP_Customize_Manager::add_dynamic_settings() - * - * @param array $partial_ids The partial ID to add. - * @return array Added WP_Customize_Partial instances. - */ - public function add_dynamic_partials( $partial_ids ) { - $new_partials = array(); - - foreach ( $partial_ids as $partial_id ) { - - // Skip partials already created. - $partial = $this->get_partial( $partial_id ); - if ( $partial ) { - continue; - } - - $partial_args = false; - $partial_class = 'WP_Customize_Partial'; - - /** - * Filters a dynamic partial's constructor arguments. - * - * For a dynamic partial to be registered, this filter must be employed - * to override the default false value with an array of args to pass to - * the WP_Customize_Partial constructor. - * - * @since 4.5.0 - * - * @param false|array $partial_args The arguments to the WP_Customize_Partial constructor. - * @param string $partial_id ID for dynamic partial. - */ - $partial_args = apply_filters( 'customize_dynamic_partial_args', $partial_args, $partial_id ); - if ( false === $partial_args ) { - continue; - } - - /** - * Filters the class used to construct partials. - * - * Allow non-statically created partials to be constructed with custom WP_Customize_Partial subclass. - * - * @since 4.5.0 - * - * @param string $partial_class WP_Customize_Partial or a subclass. - * @param string $partial_id ID for dynamic partial. - * @param array $partial_args The arguments to the WP_Customize_Partial constructor. - */ - $partial_class = apply_filters( 'customize_dynamic_partial_class', $partial_class, $partial_id, $partial_args ); - - $partial = new $partial_class( $this, $partial_id, $partial_args ); - - $this->add_partial( $partial ); - $new_partials[] = $partial; - } - return $new_partials; - } - - /** - * Checks whether the request is for rendering partials. - * - * Note that this will not consider whether the request is authorized or valid, - * just that essentially the route is a match. - * - * @since 4.5.0 - * @access public - * - * @return bool Whether the request is for rendering partials. - */ - public function is_render_partials_request() { - return ! empty( $_POST[ self::RENDER_QUERY_VAR ] ); - } - - /** - * Handles PHP errors triggered during rendering the partials. - * - * These errors will be relayed back to the client in the Ajax response. - * - * @since 4.5.0 - * @access private - * - * @param int $errno Error number. - * @param string $errstr Error string. - * @param string $errfile Error file. - * @param string $errline Error line. - * @return true Always true. - */ - public function handle_error( $errno, $errstr, $errfile = null, $errline = null ) { - $this->triggered_errors[] = array( - 'partial' => $this->current_partial_id, - 'error_number' => $errno, - 'error_string' => $errstr, - 'error_file' => $errfile, - 'error_line' => $errline, - ); - return true; - } - - /** - * Handles the Ajax request to return the rendered partials for the requested placements. - * - * @since 4.5.0 - * @access public - */ - public function handle_render_partials_request() { - if ( ! $this->is_render_partials_request() ) { - return; - } - - /* - * Note that is_customize_preview() returning true will entail that the - * user passed the 'customize' capability check and the nonce check, since - * WP_Customize_Manager::setup_theme() is where the previewing flag is set. - */ - if ( ! is_customize_preview() ) { - wp_send_json_error( 'expected_customize_preview', 403 ); - } elseif ( ! isset( $_POST['partials'] ) ) { - wp_send_json_error( 'missing_partials', 400 ); - } - - // Ensure that doing selective refresh on 404 template doesn't result in fallback rendering behavior (full refreshes). - status_header( 200 ); - - $partials = json_decode( wp_unslash( $_POST['partials'] ), true ); - - if ( ! is_array( $partials ) ) { - wp_send_json_error( 'malformed_partials' ); - } - - $this->add_dynamic_partials( array_keys( $partials ) ); - - /** - * Fires immediately before partials are rendered. - * - * Plugins may do things like call wp_enqueue_scripts() and gather a list of the scripts - * and styles which may get enqueued in the response. - * - * @since 4.5.0 - * - * @param WP_Customize_Selective_Refresh $this Selective refresh component. - * @param array $partials Placements' context data for the partials rendered in the request. - * The array is keyed by partial ID, with each item being an array of - * the placements' context data. - */ - do_action( 'customize_render_partials_before', $this, $partials ); - - set_error_handler( array( $this, 'handle_error' ), error_reporting() ); - - $contents = array(); - - foreach ( $partials as $partial_id => $container_contexts ) { - $this->current_partial_id = $partial_id; - - if ( ! is_array( $container_contexts ) ) { - wp_send_json_error( 'malformed_container_contexts' ); - } - - $partial = $this->get_partial( $partial_id ); - - if ( ! $partial || ! $partial->check_capabilities() ) { - $contents[ $partial_id ] = null; - continue; - } - - $contents[ $partial_id ] = array(); - - // @todo The array should include not only the contents, but also whether the container is included? - if ( empty( $container_contexts ) ) { - // Since there are no container contexts, render just once. - $contents[ $partial_id ][] = $partial->render( null ); - } else { - foreach ( $container_contexts as $container_context ) { - $contents[ $partial_id ][] = $partial->render( $container_context ); - } - } - } - $this->current_partial_id = null; - - restore_error_handler(); - - /** - * Fires immediately after partials are rendered. - * - * Plugins may do things like call wp_footer() to scrape scripts output and return them - * via the {@see 'customize_render_partials_response'} filter. - * - * @since 4.5.0 - * - * @param WP_Customize_Selective_Refresh $this Selective refresh component. - * @param array $partials Placements' context data for the partials rendered in the request. - * The array is keyed by partial ID, with each item being an array of - * the placements' context data. - */ - do_action( 'customize_render_partials_after', $this, $partials ); - - $response = array( - 'contents' => $contents, - ); - - if ( defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG_DISPLAY ) { - $response['errors'] = $this->triggered_errors; - } - - $setting_validities = $this->manager->validate_setting_values( $this->manager->unsanitized_post_values() ); - $exported_setting_validities = array_map( array( $this->manager, 'prepare_setting_validity_for_js' ), $setting_validities ); - $response['setting_validities'] = $exported_setting_validities; - - /** - * Filters the response from rendering the partials. - * - * Plugins may use this filter to inject `$scripts` and `$styles`, which are dependencies - * for the partials being rendered. The response data will be available to the client via - * the `render-partials-response` JS event, so the client can then inject the scripts and - * styles into the DOM if they have not already been enqueued there. - * - * If plugins do this, they'll need to take care for any scripts that do `document.write()` - * and make sure that these are not injected, or else to override the function to no-op, - * or else the page will be destroyed. - * - * Plugins should be aware that `$scripts` and `$styles` may eventually be included by - * default in the response. - * - * @since 4.5.0 - * - * @param array $response { - * Response. - * - * @type array $contents Associative array mapping a partial ID its corresponding array of contents - * for the containers requested. - * @type array $errors List of errors triggered during rendering of partials, if `WP_DEBUG_DISPLAY` - * is enabled. - * } - * @param WP_Customize_Selective_Refresh $this Selective refresh component. - * @param array $partials Placements' context data for the partials rendered in the request. - * The array is keyed by partial ID, with each item being an array of - * the placements' context data. - */ - $response = apply_filters( 'customize_render_partials_response', $response, $this, $partials ); - - wp_send_json_success( $response ); - } -} diff --git a/wp/wp-includes/customize/class-wp-customize-sidebar-section.php b/wp/wp-includes/customize/class-wp-customize-sidebar-section.php deleted file mode 100644 index a196b70d..00000000 --- a/wp/wp-includes/customize/class-wp-customize-sidebar-section.php +++ /dev/null @@ -1,61 +0,0 @@ -sidebar_id; - return $json; - } - - /** - * Whether the current sidebar is rendered on the page. - * - * @since 4.1.0 - * @access public - * - * @return bool Whether sidebar is rendered. - */ - public function active_callback() { - return $this->manager->widgets->is_sidebar_rendered( $this->sidebar_id ); - } -} diff --git a/wp/wp-includes/customize/class-wp-customize-site-icon-control.php b/wp/wp-includes/customize/class-wp-customize-site-icon-control.php deleted file mode 100644 index 5f18563b..00000000 --- a/wp/wp-includes/customize/class-wp-customize-site-icon-control.php +++ /dev/null @@ -1,103 +0,0 @@ - - - - <# if ( data.attachment && data.attachment.id ) { #> -
        - <# if ( data.attachment.sizes ) { #> -
        -
        - - -
        - <?php esc_attr_e( 'Preview as a browser icon' ); ?> -
        - -
        - <?php esc_attr_e( 'Preview as an app icon' ); ?> -
        - <# } #> -
        - <# if ( data.canUpload ) { #> - - -
        - <# } #> -
        -
        - <# } else { #> -
        -
        - button_labels['placeholder']; ?> -
        -
        - <# if ( data.defaultAttachment ) { #> - - <# } #> - <# if ( data.canUpload ) { #> - - <# } #> -
        -
        -
        - <# } #> - json['theme'] = $this->theme; - } - - /** - * Don't render the control content from PHP, as it's rendered via JS on load. - * - * @since 4.2.0 - * @access public - */ - public function render_content() {} - - /** - * Render a JS template for theme display. - * - * @since 4.2.0 - * @access public - */ - public function content_template() { - $current_url = set_url_scheme( 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] ); - $active_url = esc_url( remove_query_arg( 'customize_theme', $current_url ) ); - $preview_url = esc_url( add_query_arg( 'customize_theme', '__THEME__', $current_url ) ); // Token because esc_url() strips curly braces. - $preview_url = str_replace( '__THEME__', '{{ data.theme.id }}', $preview_url ); - ?> - <# if ( data.theme.isActiveTheme ) { #> -
        - <# } else { #> -
        - <# } #> - - <# if ( data.theme.screenshot[0] ) { #> -
        - -
        - <# } else { #> -
        - <# } #> - - <# if ( data.theme.isActiveTheme ) { #> - - <# } else { #> - - <# } #> - -
        - - <# if ( data.theme.isActiveTheme ) { #> -

        - Active: %s' ), '{{{ data.theme.name }}}' ); - ?> -

        - <# } else { #> -

        {{{ data.theme.name }}}

        -
        - -
        - <# } #> -
        - type; - ?> -
      • -

        - manager->is_theme_active() ) { - echo '' . __( 'Active theme' ) . ' ' . $this->title; - } else { - echo '' . __( 'Previewing theme' ) . ' ' . $this->title; - } - ?> - - controls ) > 0 ) : ?> - - -

        -
        -

        - - - controls ) + 1 /* Active theme */; ?> -

        -

        - manager->is_theme_active() ) { - echo '' . __( 'Active theme' ) . ' ' . $this->title; - } else { - echo '' . __( 'Previewing theme' ) . ' ' . $this->title; - } - ?> - -

        - - - -
        - controls ) > 4 ) : ?> -

        - -
        -
          -
        -
        -
        -
      • -value(); - if ( $value ) { - // Get the attachment model for the existing file. - $attachment_id = attachment_url_to_postid( $value ); - if ( $attachment_id ) { - $this->json['attachment'] = wp_prepare_attachment_for_js( $attachment_id ); - } - } - } -} diff --git a/wp/wp-includes/customize/class-wp-widget-area-customize-control.php b/wp/wp-includes/customize/class-wp-widget-area-customize-control.php deleted file mode 100644 index 8f76169c..00000000 --- a/wp/wp-includes/customize/class-wp-widget-area-customize-control.php +++ /dev/null @@ -1,70 +0,0 @@ -json[ $key ] = $this->$key; - } - } - - /** - * Renders the control's content. - * - * @since 3.9.0 - * @access public - */ - public function render_content() { - $id = 'reorder-widgets-desc-' . str_replace( array( '[', ']' ), array( '-', '' ), $this->id ); - ?> - - -

        - json[ $key ] = $this->$key; - } - - // Get the widget_control and widget_content. - require_once ABSPATH . '/wp-admin/includes/widgets.php'; - - $widget = $wp_registered_widgets[ $this->widget_id ]; - if ( ! isset( $widget['params'][0] ) ) { - $widget['params'][0] = array(); - } - - $args = array( - 'widget_id' => $widget['id'], - 'widget_name' => $widget['name'], - ); - - $args = wp_list_widget_controls_dynamic_sidebar( array( 0 => $args, 1 => $widget['params'][0] ) ); - $widget_control_parts = $this->manager->widgets->get_widget_control_parts( $args ); - - $this->json['widget_control'] = $widget_control_parts['control']; - $this->json['widget_content'] = $widget_control_parts['content']; - } - - /** - * Override render_content to be no-op since content is exported via to_json for deferred embedding. - */ - public function render_content() {} - - /** - * Whether the current widget is rendered on the page. - * - * @since 4.0.0 - * @access public - * - * @return bool Whether the widget is rendered. - */ - public function active_callback() { - return $this->manager->widgets->is_widget_rendered( $this->widget_id ); - } -} diff --git a/wp/wp-includes/date.php b/wp/wp-includes/date.php deleted file mode 100644 index c7d6b040..00000000 --- a/wp/wp-includes/date.php +++ /dev/null @@ -1,1017 +0,0 @@ -', '>=', '<', '<=', - * 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'. Default '='. - * @type string $relation Optional. The boolean relationship between the date queries. Accepts 'OR' or 'AND'. - * Default 'OR'. - * @type array { - * Optional. An array of first-order clause parameters, or another fully-formed date query. - * - * @type string|array $before { - * Optional. Date to retrieve posts before. Accepts `strtotime()`-compatible string, - * or array of 'year', 'month', 'day' values. - * - * @type string $year The four-digit year. Default empty. Accepts any four-digit year. - * @type string $month Optional when passing array.The month of the year. - * Default (string:empty)|(array:1). Accepts numbers 1-12. - * @type string $day Optional when passing array.The day of the month. - * Default (string:empty)|(array:1). Accepts numbers 1-31. - * } - * @type string|array $after { - * Optional. Date to retrieve posts after. Accepts `strtotime()`-compatible string, - * or array of 'year', 'month', 'day' values. - * - * @type string $year The four-digit year. Accepts any four-digit year. Default empty. - * @type string $month Optional when passing array. The month of the year. Accepts numbers 1-12. - * Default (string:empty)|(array:12). - * @type string $day Optional when passing array.The day of the month. Accepts numbers 1-31. - * Default (string:empty)|(array:last day of month). - * } - * @type string $column Optional. Used to add a clause comparing a column other than the - * column specified in the top-level `$column` parameter. Accepts - * 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt', - * 'comment_date', 'comment_date_gmt'. Default is the value of - * top-level `$column`. - * @type string $compare Optional. The comparison operator. Accepts '=', '!=', '>', '>=', - * '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN'. 'IN', - * 'NOT IN', 'BETWEEN', and 'NOT BETWEEN'. Comparisons support - * arrays in some time-related parameters. Default '='. - * @type bool $inclusive Optional. Include results from dates specified in 'before' or - * 'after'. Default false. - * @type int|array $year Optional. The four-digit year number. Accepts any four-digit year - * or an array of years if `$compare` supports it. Default empty. - * @type int|array $month Optional. The two-digit month number. Accepts numbers 1-12 or an - * array of valid numbers if `$compare` supports it. Default empty. - * @type int|array $week Optional. The week number of the year. Accepts numbers 0-53 or an - * array of valid numbers if `$compare` supports it. Default empty. - * @type int|array $dayofyear Optional. The day number of the year. Accepts numbers 1-366 or an - * array of valid numbers if `$compare` supports it. - * @type int|array $day Optional. The day of the month. Accepts numbers 1-31 or an array - * of valid numbers if `$compare` supports it. Default empty. - * @type int|array $dayofweek Optional. The day number of the week. Accepts numbers 1-7 (1 is - * Sunday) or an array of valid numbers if `$compare` supports it. - * Default empty. - * @type int|array $dayofweek_iso Optional. The day number of the week (ISO). Accepts numbers 1-7 - * (1 is Monday) or an array of valid numbers if `$compare` supports it. - * Default empty. - * @type int|array $hour Optional. The hour of the day. Accepts numbers 0-23 or an array - * of valid numbers if `$compare` supports it. Default empty. - * @type int|array $minute Optional. The minute of the hour. Accepts numbers 0-60 or an array - * of valid numbers if `$compare` supports it. Default empty. - * @type int|array $second Optional. The second of the minute. Accepts numbers 0-60 or an - * array of valid numbers if `$compare` supports it. Default empty. - * } - * } - * } - * @param array $default_column Optional. Default column to query against. Default 'post_date'. - * Accepts 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt', - * 'comment_date', 'comment_date_gmt'. - */ - public function __construct( $date_query, $default_column = 'post_date' ) { - if ( isset( $date_query['relation'] ) && 'OR' === strtoupper( $date_query['relation'] ) ) { - $this->relation = 'OR'; - } else { - $this->relation = 'AND'; - } - - if ( ! is_array( $date_query ) ) { - return; - } - - // Support for passing time-based keys in the top level of the $date_query array. - if ( ! isset( $date_query[0] ) && ! empty( $date_query ) ) { - $date_query = array( $date_query ); - } - - if ( empty( $date_query ) ) { - return; - } - - if ( ! empty( $date_query['column'] ) ) { - $date_query['column'] = esc_sql( $date_query['column'] ); - } else { - $date_query['column'] = esc_sql( $default_column ); - } - - $this->column = $this->validate_column( $this->column ); - - $this->compare = $this->get_compare( $date_query ); - - $this->queries = $this->sanitize_query( $date_query ); - } - - /** - * Recursive-friendly query sanitizer. - * - * Ensures that each query-level clause has a 'relation' key, and that - * each first-order clause contains all the necessary keys from - * `$defaults`. - * - * @since 4.1.0 - * @access public - * - * @param array $queries - * @param array $parent_query - * - * @return array Sanitized queries. - */ - public function sanitize_query( $queries, $parent_query = null ) { - $cleaned_query = array(); - - $defaults = array( - 'column' => 'post_date', - 'compare' => '=', - 'relation' => 'AND', - ); - - // Numeric keys should always have array values. - foreach ( $queries as $qkey => $qvalue ) { - if ( is_numeric( $qkey ) && ! is_array( $qvalue ) ) { - unset( $queries[ $qkey ] ); - } - } - - // Each query should have a value for each default key. Inherit from the parent when possible. - foreach ( $defaults as $dkey => $dvalue ) { - if ( isset( $queries[ $dkey ] ) ) { - continue; - } - - if ( isset( $parent_query[ $dkey ] ) ) { - $queries[ $dkey ] = $parent_query[ $dkey ]; - } else { - $queries[ $dkey ] = $dvalue; - } - } - - // Validate the dates passed in the query. - if ( $this->is_first_order_clause( $queries ) ) { - $this->validate_date_values( $queries ); - } - - foreach ( $queries as $key => $q ) { - if ( ! is_array( $q ) || in_array( $key, $this->time_keys, true ) ) { - // This is a first-order query. Trust the values and sanitize when building SQL. - $cleaned_query[ $key ] = $q; - } else { - // Any array without a time key is another query, so we recurse. - $cleaned_query[] = $this->sanitize_query( $q, $queries ); - } - } - - return $cleaned_query; - } - - /** - * Determine whether this is a first-order clause. - * - * Checks to see if the current clause has any time-related keys. - * If so, it's first-order. - * - * @param array $query Query clause. - * @return bool True if this is a first-order clause. - */ - protected function is_first_order_clause( $query ) { - $time_keys = array_intersect( $this->time_keys, array_keys( $query ) ); - return ! empty( $time_keys ); - } - - /** - * Determines and validates what comparison operator to use. - * - * @since 3.7.0 - * @access public - * - * @param array $query A date query or a date subquery. - * @return string The comparison operator. - */ - public function get_compare( $query ) { - if ( ! empty( $query['compare'] ) && in_array( $query['compare'], array( '=', '!=', '>', '>=', '<', '<=', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) - return strtoupper( $query['compare'] ); - - return $this->compare; - } - - /** - * Validates the given date_query values and triggers errors if something is not valid. - * - * Note that date queries with invalid date ranges are allowed to - * continue (though of course no items will be found for impossible dates). - * This method only generates debug notices for these cases. - * - * @since 4.1.0 - * @access public - * - * @param array $date_query The date_query array. - * @return bool True if all values in the query are valid, false if one or more fail. - */ - public function validate_date_values( $date_query = array() ) { - if ( empty( $date_query ) ) { - return false; - } - - $valid = true; - - /* - * Validate 'before' and 'after' up front, then let the - * validation routine continue to be sure that all invalid - * values generate errors too. - */ - if ( array_key_exists( 'before', $date_query ) && is_array( $date_query['before'] ) ){ - $valid = $this->validate_date_values( $date_query['before'] ); - } - - if ( array_key_exists( 'after', $date_query ) && is_array( $date_query['after'] ) ){ - $valid = $this->validate_date_values( $date_query['after'] ); - } - - // Array containing all min-max checks. - $min_max_checks = array(); - - // Days per year. - if ( array_key_exists( 'year', $date_query ) ) { - /* - * If a year exists in the date query, we can use it to get the days. - * If multiple years are provided (as in a BETWEEN), use the first one. - */ - if ( is_array( $date_query['year'] ) ) { - $_year = reset( $date_query['year'] ); - } else { - $_year = $date_query['year']; - } - - $max_days_of_year = date( 'z', mktime( 0, 0, 0, 12, 31, $_year ) ) + 1; - } else { - // otherwise we use the max of 366 (leap-year) - $max_days_of_year = 366; - } - - $min_max_checks['dayofyear'] = array( - 'min' => 1, - 'max' => $max_days_of_year - ); - - // Days per week. - $min_max_checks['dayofweek'] = array( - 'min' => 1, - 'max' => 7 - ); - - // Days per week. - $min_max_checks['dayofweek_iso'] = array( - 'min' => 1, - 'max' => 7 - ); - - // Months per year. - $min_max_checks['month'] = array( - 'min' => 1, - 'max' => 12 - ); - - // Weeks per year. - if ( isset( $_year ) ) { - /* - * If we have a specific year, use it to calculate number of weeks. - * Note: the number of weeks in a year is the date in which Dec 28 appears. - */ - $week_count = date( 'W', mktime( 0, 0, 0, 12, 28, $_year ) ); - - } else { - // Otherwise set the week-count to a maximum of 53. - $week_count = 53; - } - - $min_max_checks['week'] = array( - 'min' => 1, - 'max' => $week_count - ); - - // Days per month. - $min_max_checks['day'] = array( - 'min' => 1, - 'max' => 31 - ); - - // Hours per day. - $min_max_checks['hour'] = array( - 'min' => 0, - 'max' => 23 - ); - - // Minutes per hour. - $min_max_checks['minute'] = array( - 'min' => 0, - 'max' => 59 - ); - - // Seconds per minute. - $min_max_checks['second'] = array( - 'min' => 0, - 'max' => 59 - ); - - // Concatenate and throw a notice for each invalid value. - foreach ( $min_max_checks as $key => $check ) { - if ( ! array_key_exists( $key, $date_query ) ) { - continue; - } - - // Throw a notice for each failing value. - foreach ( (array) $date_query[ $key ] as $_value ) { - $is_between = $_value >= $check['min'] && $_value <= $check['max']; - - if ( ! is_numeric( $_value ) || ! $is_between ) { - $error = sprintf( - /* translators: Date query invalid date message: 1: invalid value, 2: type of value, 3: minimum valid value, 4: maximum valid value */ - __( 'Invalid value %1$s for %2$s. Expected value should be between %3$s and %4$s.' ), - '' . esc_html( $_value ) . '', - '' . esc_html( $key ) . '', - '' . esc_html( $check['min'] ) . '', - '' . esc_html( $check['max'] ) . '' - ); - - _doing_it_wrong( __CLASS__, $error, '4.1.0' ); - - $valid = false; - } - } - } - - // If we already have invalid date messages, don't bother running through checkdate(). - if ( ! $valid ) { - return $valid; - } - - $day_month_year_error_msg = ''; - - $day_exists = array_key_exists( 'day', $date_query ) && is_numeric( $date_query['day'] ); - $month_exists = array_key_exists( 'month', $date_query ) && is_numeric( $date_query['month'] ); - $year_exists = array_key_exists( 'year', $date_query ) && is_numeric( $date_query['year'] ); - - if ( $day_exists && $month_exists && $year_exists ) { - // 1. Checking day, month, year combination. - if ( ! wp_checkdate( $date_query['month'], $date_query['day'], $date_query['year'], sprintf( '%s-%s-%s', $date_query['year'], $date_query['month'], $date_query['day'] ) ) ) { - /* translators: 1: year, 2: month, 3: day of month */ - $day_month_year_error_msg = sprintf( - __( 'The following values do not describe a valid date: year %1$s, month %2$s, day %3$s.' ), - '' . esc_html( $date_query['year'] ) . '', - '' . esc_html( $date_query['month'] ) . '', - '' . esc_html( $date_query['day'] ) . '' - ); - - $valid = false; - } - - } elseif ( $day_exists && $month_exists ) { - /* - * 2. checking day, month combination - * We use 2012 because, as a leap year, it's the most permissive. - */ - if ( ! wp_checkdate( $date_query['month'], $date_query['day'], 2012, sprintf( '2012-%s-%s', $date_query['month'], $date_query['day'] ) ) ) { - /* translators: 1: month, 2: day of month */ - $day_month_year_error_msg = sprintf( - __( 'The following values do not describe a valid date: month %1$s, day %2$s.' ), - '' . esc_html( $date_query['month'] ) . '', - '' . esc_html( $date_query['day'] ) . '' - ); - - $valid = false; - } - } - - if ( ! empty( $day_month_year_error_msg ) ) { - _doing_it_wrong( __CLASS__, $day_month_year_error_msg, '4.1.0' ); - } - - return $valid; - } - - /** - * Validates a column name parameter. - * - * Column names without a table prefix (like 'post_date') are checked against a whitelist of - * known tables, and then, if found, have a table prefix (such as 'wp_posts.') prepended. - * Prefixed column names (such as 'wp_posts.post_date') bypass this whitelist check, - * and are only sanitized to remove illegal characters. - * - * @since 3.7.0 - * @access public - * - * @param string $column The user-supplied column name. - * @return string A validated column name value. - */ - public function validate_column( $column ) { - global $wpdb; - - $valid_columns = array( - 'post_date', 'post_date_gmt', 'post_modified', - 'post_modified_gmt', 'comment_date', 'comment_date_gmt', - 'user_registered', 'registered', 'last_updated', - ); - - // Attempt to detect a table prefix. - if ( false === strpos( $column, '.' ) ) { - /** - * Filters the list of valid date query columns. - * - * @since 3.7.0 - * @since 4.1.0 Added 'user_registered' to the default recognized columns. - * - * @param array $valid_columns An array of valid date query columns. Defaults - * are 'post_date', 'post_date_gmt', 'post_modified', - * 'post_modified_gmt', 'comment_date', 'comment_date_gmt', - * 'user_registered' - */ - if ( ! in_array( $column, apply_filters( 'date_query_valid_columns', $valid_columns ) ) ) { - $column = 'post_date'; - } - - $known_columns = array( - $wpdb->posts => array( - 'post_date', - 'post_date_gmt', - 'post_modified', - 'post_modified_gmt', - ), - $wpdb->comments => array( - 'comment_date', - 'comment_date_gmt', - ), - $wpdb->users => array( - 'user_registered', - ), - $wpdb->blogs => array( - 'registered', - 'last_updated', - ), - ); - - // If it's a known column name, add the appropriate table prefix. - foreach ( $known_columns as $table_name => $table_columns ) { - if ( in_array( $column, $table_columns ) ) { - $column = $table_name . '.' . $column; - break; - } - } - - } - - // Remove unsafe characters. - return preg_replace( '/[^a-zA-Z0-9_$\.]/', '', $column ); - } - - /** - * Generate WHERE clause to be appended to a main query. - * - * @since 3.7.0 - * @access public - * - * @return string MySQL WHERE clause. - */ - public function get_sql() { - $sql = $this->get_sql_clauses(); - - $where = $sql['where']; - - /** - * Filters the date query WHERE clause. - * - * @since 3.7.0 - * - * @param string $where WHERE clause of the date query. - * @param WP_Date_Query $this The WP_Date_Query instance. - */ - return apply_filters( 'get_date_sql', $where, $this ); - } - - /** - * Generate SQL clauses to be appended to a main query. - * - * Called by the public WP_Date_Query::get_sql(), this method is abstracted - * out to maintain parity with the other Query classes. - * - * @since 4.1.0 - * @access protected - * - * @return array { - * Array containing JOIN and WHERE SQL clauses to append to the main query. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - protected function get_sql_clauses() { - $sql = $this->get_sql_for_query( $this->queries ); - - if ( ! empty( $sql['where'] ) ) { - $sql['where'] = ' AND ' . $sql['where']; - } - - return $sql; - } - - /** - * Generate SQL clauses for a single query array. - * - * If nested subqueries are found, this method recurses the tree to - * produce the properly nested SQL. - * - * @since 4.1.0 - * @access protected - * - * @param array $query Query to parse. - * @param int $depth Optional. Number of tree levels deep we currently are. - * Used to calculate indentation. Default 0. - * @return array { - * Array containing JOIN and WHERE SQL clauses to append to a single query array. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - protected function get_sql_for_query( $query, $depth = 0 ) { - $sql_chunks = array( - 'join' => array(), - 'where' => array(), - ); - - $sql = array( - 'join' => '', - 'where' => '', - ); - - $indent = ''; - for ( $i = 0; $i < $depth; $i++ ) { - $indent .= " "; - } - - foreach ( $query as $key => $clause ) { - if ( 'relation' === $key ) { - $relation = $query['relation']; - } elseif ( is_array( $clause ) ) { - - // This is a first-order clause. - if ( $this->is_first_order_clause( $clause ) ) { - $clause_sql = $this->get_sql_for_clause( $clause, $query ); - - $where_count = count( $clause_sql['where'] ); - if ( ! $where_count ) { - $sql_chunks['where'][] = ''; - } elseif ( 1 === $where_count ) { - $sql_chunks['where'][] = $clause_sql['where'][0]; - } else { - $sql_chunks['where'][] = '( ' . implode( ' AND ', $clause_sql['where'] ) . ' )'; - } - - $sql_chunks['join'] = array_merge( $sql_chunks['join'], $clause_sql['join'] ); - // This is a subquery, so we recurse. - } else { - $clause_sql = $this->get_sql_for_query( $clause, $depth + 1 ); - - $sql_chunks['where'][] = $clause_sql['where']; - $sql_chunks['join'][] = $clause_sql['join']; - } - } - } - - // Filter to remove empties. - $sql_chunks['join'] = array_filter( $sql_chunks['join'] ); - $sql_chunks['where'] = array_filter( $sql_chunks['where'] ); - - if ( empty( $relation ) ) { - $relation = 'AND'; - } - - // Filter duplicate JOIN clauses and combine into a single string. - if ( ! empty( $sql_chunks['join'] ) ) { - $sql['join'] = implode( ' ', array_unique( $sql_chunks['join'] ) ); - } - - // Generate a single WHERE clause with proper brackets and indentation. - if ( ! empty( $sql_chunks['where'] ) ) { - $sql['where'] = '( ' . "\n " . $indent . implode( ' ' . "\n " . $indent . $relation . ' ' . "\n " . $indent, $sql_chunks['where'] ) . "\n" . $indent . ')'; - } - - return $sql; - } - - /** - * Turns a single date clause into pieces for a WHERE clause. - * - * A wrapper for get_sql_for_clause(), included here for backward - * compatibility while retaining the naming convention across Query classes. - * - * @since 3.7.0 - * @access protected - * - * @param array $query Date query arguments. - * @return array { - * Array containing JOIN and WHERE SQL clauses to append to the main query. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - protected function get_sql_for_subquery( $query ) { - return $this->get_sql_for_clause( $query, '' ); - } - - /** - * Turns a first-order date query into SQL for a WHERE clause. - * - * @since 4.1.0 - * @access protected - * - * @param array $query Date query clause. - * @param array $parent_query Parent query of the current date query. - * @return array { - * Array containing JOIN and WHERE SQL clauses to append to the main query. - * - * @type string $join SQL fragment to append to the main JOIN clause. - * @type string $where SQL fragment to append to the main WHERE clause. - * } - */ - protected function get_sql_for_clause( $query, $parent_query ) { - global $wpdb; - - // The sub-parts of a $where part. - $where_parts = array(); - - $column = ( ! empty( $query['column'] ) ) ? esc_sql( $query['column'] ) : $this->column; - - $column = $this->validate_column( $column ); - - $compare = $this->get_compare( $query ); - - $inclusive = ! empty( $query['inclusive'] ); - - // Assign greater- and less-than values. - $lt = '<'; - $gt = '>'; - - if ( $inclusive ) { - $lt .= '='; - $gt .= '='; - } - - // Range queries. - if ( ! empty( $query['after'] ) ) { - $where_parts[] = $wpdb->prepare( "$column $gt %s", $this->build_mysql_datetime( $query['after'], ! $inclusive ) ); - } - if ( ! empty( $query['before'] ) ) { - $where_parts[] = $wpdb->prepare( "$column $lt %s", $this->build_mysql_datetime( $query['before'], $inclusive ) ); - } - // Specific value queries. - - if ( isset( $query['year'] ) && $value = $this->build_value( $compare, $query['year'] ) ) - $where_parts[] = "YEAR( $column ) $compare $value"; - - if ( isset( $query['month'] ) && $value = $this->build_value( $compare, $query['month'] ) ) { - $where_parts[] = "MONTH( $column ) $compare $value"; - } elseif ( isset( $query['monthnum'] ) && $value = $this->build_value( $compare, $query['monthnum'] ) ) { - $where_parts[] = "MONTH( $column ) $compare $value"; - } - if ( isset( $query['week'] ) && false !== ( $value = $this->build_value( $compare, $query['week'] ) ) ) { - $where_parts[] = _wp_mysql_week( $column ) . " $compare $value"; - } elseif ( isset( $query['w'] ) && false !== ( $value = $this->build_value( $compare, $query['w'] ) ) ) { - $where_parts[] = _wp_mysql_week( $column ) . " $compare $value"; - } - if ( isset( $query['dayofyear'] ) && $value = $this->build_value( $compare, $query['dayofyear'] ) ) - $where_parts[] = "DAYOFYEAR( $column ) $compare $value"; - - if ( isset( $query['day'] ) && $value = $this->build_value( $compare, $query['day'] ) ) - $where_parts[] = "DAYOFMONTH( $column ) $compare $value"; - - if ( isset( $query['dayofweek'] ) && $value = $this->build_value( $compare, $query['dayofweek'] ) ) - $where_parts[] = "DAYOFWEEK( $column ) $compare $value"; - - if ( isset( $query['dayofweek_iso'] ) && $value = $this->build_value( $compare, $query['dayofweek_iso'] ) ) - $where_parts[] = "WEEKDAY( $column ) + 1 $compare $value"; - - if ( isset( $query['hour'] ) || isset( $query['minute'] ) || isset( $query['second'] ) ) { - // Avoid notices. - foreach ( array( 'hour', 'minute', 'second' ) as $unit ) { - if ( ! isset( $query[ $unit ] ) ) { - $query[ $unit ] = null; - } - } - - if ( $time_query = $this->build_time_query( $column, $compare, $query['hour'], $query['minute'], $query['second'] ) ) { - $where_parts[] = $time_query; - } - } - - /* - * Return an array of 'join' and 'where' for compatibility - * with other query classes. - */ - return array( - 'where' => $where_parts, - 'join' => array(), - ); - } - - /** - * Builds and validates a value string based on the comparison operator. - * - * @since 3.7.0 - * @access public - * - * @param string $compare The compare operator to use - * @param string|array $value The value - * @return string|false|int The value to be used in SQL or false on error. - */ - public function build_value( $compare, $value ) { - if ( ! isset( $value ) ) - return false; - - switch ( $compare ) { - case 'IN': - case 'NOT IN': - $value = (array) $value; - - // Remove non-numeric values. - $value = array_filter( $value, 'is_numeric' ); - - if ( empty( $value ) ) { - return false; - } - - return '(' . implode( ',', array_map( 'intval', $value ) ) . ')'; - - case 'BETWEEN': - case 'NOT BETWEEN': - if ( ! is_array( $value ) || 2 != count( $value ) ) { - $value = array( $value, $value ); - } else { - $value = array_values( $value ); - } - - // If either value is non-numeric, bail. - foreach ( $value as $v ) { - if ( ! is_numeric( $v ) ) { - return false; - } - } - - $value = array_map( 'intval', $value ); - - return $value[0] . ' AND ' . $value[1]; - - default; - if ( ! is_numeric( $value ) ) { - return false; - } - - return (int) $value; - } - } - - /** - * Builds a MySQL format date/time based on some query parameters. - * - * You can pass an array of values (year, month, etc.) with missing parameter values being defaulted to - * either the maximum or minimum values (controlled by the $default_to parameter). Alternatively you can - * pass a string that will be run through strtotime(). - * - * @since 3.7.0 - * @access public - * - * @param string|array $datetime An array of parameters or a strotime() string - * @param bool $default_to_max Whether to round up incomplete dates. Supported by values - * of $datetime that are arrays, or string values that are a - * subset of MySQL date format ('Y', 'Y-m', 'Y-m-d', 'Y-m-d H:i'). - * Default: false. - * @return string|false A MySQL format date/time or false on failure - */ - public function build_mysql_datetime( $datetime, $default_to_max = false ) { - $now = current_time( 'timestamp' ); - - if ( ! is_array( $datetime ) ) { - - /* - * Try to parse some common date formats, so we can detect - * the level of precision and support the 'inclusive' parameter. - */ - if ( preg_match( '/^(\d{4})$/', $datetime, $matches ) ) { - // Y - $datetime = array( - 'year' => intval( $matches[1] ), - ); - - } elseif ( preg_match( '/^(\d{4})\-(\d{2})$/', $datetime, $matches ) ) { - // Y-m - $datetime = array( - 'year' => intval( $matches[1] ), - 'month' => intval( $matches[2] ), - ); - - } elseif ( preg_match( '/^(\d{4})\-(\d{2})\-(\d{2})$/', $datetime, $matches ) ) { - // Y-m-d - $datetime = array( - 'year' => intval( $matches[1] ), - 'month' => intval( $matches[2] ), - 'day' => intval( $matches[3] ), - ); - - } elseif ( preg_match( '/^(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2})$/', $datetime, $matches ) ) { - // Y-m-d H:i - $datetime = array( - 'year' => intval( $matches[1] ), - 'month' => intval( $matches[2] ), - 'day' => intval( $matches[3] ), - 'hour' => intval( $matches[4] ), - 'minute' => intval( $matches[5] ), - ); - } - - // If no match is found, we don't support default_to_max. - if ( ! is_array( $datetime ) ) { - // @todo Timezone issues here possibly - return gmdate( 'Y-m-d H:i:s', strtotime( $datetime, $now ) ); - } - } - - $datetime = array_map( 'absint', $datetime ); - - if ( ! isset( $datetime['year'] ) ) - $datetime['year'] = gmdate( 'Y', $now ); - - if ( ! isset( $datetime['month'] ) ) - $datetime['month'] = ( $default_to_max ) ? 12 : 1; - - if ( ! isset( $datetime['day'] ) ) - $datetime['day'] = ( $default_to_max ) ? (int) date( 't', mktime( 0, 0, 0, $datetime['month'], 1, $datetime['year'] ) ) : 1; - - if ( ! isset( $datetime['hour'] ) ) - $datetime['hour'] = ( $default_to_max ) ? 23 : 0; - - if ( ! isset( $datetime['minute'] ) ) - $datetime['minute'] = ( $default_to_max ) ? 59 : 0; - - if ( ! isset( $datetime['second'] ) ) - $datetime['second'] = ( $default_to_max ) ? 59 : 0; - - return sprintf( '%04d-%02d-%02d %02d:%02d:%02d', $datetime['year'], $datetime['month'], $datetime['day'], $datetime['hour'], $datetime['minute'], $datetime['second'] ); - } - - /** - * Builds a query string for comparing time values (hour, minute, second). - * - * If just hour, minute, or second is set than a normal comparison will be done. - * However if multiple values are passed, a pseudo-decimal time will be created - * in order to be able to accurately compare against. - * - * @since 3.7.0 - * @access public - * - * @param string $column The column to query against. Needs to be pre-validated! - * @param string $compare The comparison operator. Needs to be pre-validated! - * @param int|null $hour Optional. An hour value (0-23). - * @param int|null $minute Optional. A minute value (0-59). - * @param int|null $second Optional. A second value (0-59). - * @return string|false A query part or false on failure. - */ - public function build_time_query( $column, $compare, $hour = null, $minute = null, $second = null ) { - global $wpdb; - - // Have to have at least one - if ( ! isset( $hour ) && ! isset( $minute ) && ! isset( $second ) ) - return false; - - // Complex combined queries aren't supported for multi-value queries - if ( in_array( $compare, array( 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN' ) ) ) { - $return = array(); - - if ( isset( $hour ) && false !== ( $value = $this->build_value( $compare, $hour ) ) ) - $return[] = "HOUR( $column ) $compare $value"; - - if ( isset( $minute ) && false !== ( $value = $this->build_value( $compare, $minute ) ) ) - $return[] = "MINUTE( $column ) $compare $value"; - - if ( isset( $second ) && false !== ( $value = $this->build_value( $compare, $second ) ) ) - $return[] = "SECOND( $column ) $compare $value"; - - return implode( ' AND ', $return ); - } - - // Cases where just one unit is set - if ( isset( $hour ) && ! isset( $minute ) && ! isset( $second ) && false !== ( $value = $this->build_value( $compare, $hour ) ) ) { - return "HOUR( $column ) $compare $value"; - } elseif ( ! isset( $hour ) && isset( $minute ) && ! isset( $second ) && false !== ( $value = $this->build_value( $compare, $minute ) ) ) { - return "MINUTE( $column ) $compare $value"; - } elseif ( ! isset( $hour ) && ! isset( $minute ) && isset( $second ) && false !== ( $value = $this->build_value( $compare, $second ) ) ) { - return "SECOND( $column ) $compare $value"; - } - - // Single units were already handled. Since hour & second isn't allowed, minute must to be set. - if ( ! isset( $minute ) ) - return false; - - $format = $time = ''; - - // Hour - if ( null !== $hour ) { - $format .= '%H.'; - $time .= sprintf( '%02d', $hour ) . '.'; - } else { - $format .= '0.'; - $time .= '0.'; - } - - // Minute - $format .= '%i'; - $time .= sprintf( '%02d', $minute ); - - if ( isset( $second ) ) { - $format .= '%s'; - $time .= sprintf( '%02d', $second ); - } - - return $wpdb->prepare( "DATE_FORMAT( $column, %s ) $compare %f", $format, $time ); - } -} diff --git a/wp/wp-includes/default-constants.php b/wp/wp-includes/default-constants.php deleted file mode 100644 index dcad997a..00000000 --- a/wp/wp-includes/default-constants.php +++ /dev/null @@ -1,362 +0,0 @@ - 268435456 /* = 256M */ ) { - define( 'WP_MAX_MEMORY_LIMIT', $current_limit ); - } else { - define( 'WP_MAX_MEMORY_LIMIT', '256M' ); - } - } - - // Set memory limits. - $wp_limit_int = wp_convert_hr_to_bytes( WP_MEMORY_LIMIT ); - if ( -1 !== $current_limit_int && ( -1 === $wp_limit_int || $wp_limit_int > $current_limit_int ) ) { - @ini_set( 'memory_limit', WP_MEMORY_LIMIT ); - } - - if ( ! isset($blog_id) ) - $blog_id = 1; - - if ( !defined('WP_CONTENT_DIR') ) - define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' ); // no trailing slash, full paths only - WP_CONTENT_URL is defined further down - - // Add define('WP_DEBUG', true); to wp-config.php to enable display of notices during development. - if ( !defined('WP_DEBUG') ) - define( 'WP_DEBUG', false ); - - // Add define('WP_DEBUG_DISPLAY', null); to wp-config.php use the globally configured setting for - // display_errors and not force errors to be displayed. Use false to force display_errors off. - if ( !defined('WP_DEBUG_DISPLAY') ) - define( 'WP_DEBUG_DISPLAY', true ); - - // Add define('WP_DEBUG_LOG', true); to enable error logging to wp-content/debug.log. - if ( !defined('WP_DEBUG_LOG') ) - define('WP_DEBUG_LOG', false); - - if ( !defined('WP_CACHE') ) - define('WP_CACHE', false); - - // Add define('SCRIPT_DEBUG', true); to wp-config.php to enable loading of non-minified, - // non-concatenated scripts and stylesheets. - if ( ! defined( 'SCRIPT_DEBUG' ) ) { - if ( ! empty( $GLOBALS['wp_version'] ) ) { - $develop_src = false !== strpos( $GLOBALS['wp_version'], '-src' ); - } else { - $develop_src = false; - } - - define( 'SCRIPT_DEBUG', $develop_src ); - } - - /** - * Private - */ - if ( !defined('MEDIA_TRASH') ) - define('MEDIA_TRASH', false); - - if ( !defined('SHORTINIT') ) - define('SHORTINIT', false); - - // Constants for features added to WP that should short-circuit their plugin implementations - define( 'WP_FEATURE_BETTER_PASSWORDS', true ); - - /**#@+ - * Constants for expressing human-readable intervals - * in their respective number of seconds. - * - * Please note that these values are approximate and are provided for convenience. - * For example, MONTH_IN_SECONDS wrongly assumes every month has 30 days and - * YEAR_IN_SECONDS does not take leap years into account. - * - * If you need more accuracy please consider using the DateTime class (https://secure.php.net/manual/en/class.datetime.php). - * - * @since 3.5.0 - * @since 4.4.0 Introduced `MONTH_IN_SECONDS`. - */ - define( 'MINUTE_IN_SECONDS', 60 ); - define( 'HOUR_IN_SECONDS', 60 * MINUTE_IN_SECONDS ); - define( 'DAY_IN_SECONDS', 24 * HOUR_IN_SECONDS ); - define( 'WEEK_IN_SECONDS', 7 * DAY_IN_SECONDS ); - define( 'MONTH_IN_SECONDS', 30 * DAY_IN_SECONDS ); - define( 'YEAR_IN_SECONDS', 365 * DAY_IN_SECONDS ); - /**#@-*/ -} - -/** - * Defines plugin directory WordPress constants - * - * Defines must-use plugin directory constants, which may be overridden in the sunrise.php drop-in - * - * @since 3.0.0 - */ -function wp_plugin_directory_constants() { - if ( !defined('WP_CONTENT_URL') ) - define( 'WP_CONTENT_URL', get_option('siteurl') . '/wp-content'); // full url - WP_CONTENT_DIR is defined further up - - /** - * Allows for the plugins directory to be moved from the default location. - * - * @since 2.6.0 - */ - if ( !defined('WP_PLUGIN_DIR') ) - define( 'WP_PLUGIN_DIR', WP_CONTENT_DIR . '/plugins' ); // full path, no trailing slash - - /** - * Allows for the plugins directory to be moved from the default location. - * - * @since 2.6.0 - */ - if ( !defined('WP_PLUGIN_URL') ) - define( 'WP_PLUGIN_URL', WP_CONTENT_URL . '/plugins' ); // full url, no trailing slash - - /** - * Allows for the plugins directory to be moved from the default location. - * - * @since 2.1.0 - * @deprecated - */ - if ( !defined('PLUGINDIR') ) - define( 'PLUGINDIR', 'wp-content/plugins' ); // Relative to ABSPATH. For back compat. - - /** - * Allows for the mu-plugins directory to be moved from the default location. - * - * @since 2.8.0 - */ - if ( !defined('WPMU_PLUGIN_DIR') ) - define( 'WPMU_PLUGIN_DIR', WP_CONTENT_DIR . '/mu-plugins' ); // full path, no trailing slash - - /** - * Allows for the mu-plugins directory to be moved from the default location. - * - * @since 2.8.0 - */ - if ( !defined('WPMU_PLUGIN_URL') ) - define( 'WPMU_PLUGIN_URL', WP_CONTENT_URL . '/mu-plugins' ); // full url, no trailing slash - - /** - * Allows for the mu-plugins directory to be moved from the default location. - * - * @since 2.8.0 - * @deprecated - */ - if ( !defined( 'MUPLUGINDIR' ) ) - define( 'MUPLUGINDIR', 'wp-content/mu-plugins' ); // Relative to ABSPATH. For back compat. -} - -/** - * Defines cookie related WordPress constants - * - * Defines constants after multisite is loaded. - * @since 3.0.0 - */ -function wp_cookie_constants() { - /** - * Used to guarantee unique hash cookies - * - * @since 1.5.0 - */ - if ( !defined( 'COOKIEHASH' ) ) { - $siteurl = get_site_option( 'siteurl' ); - if ( $siteurl ) - define( 'COOKIEHASH', md5( $siteurl ) ); - else - define( 'COOKIEHASH', '' ); - } - - /** - * @since 2.0.0 - */ - if ( !defined('USER_COOKIE') ) - define('USER_COOKIE', 'wordpressuser_' . COOKIEHASH); - - /** - * @since 2.0.0 - */ - if ( !defined('PASS_COOKIE') ) - define('PASS_COOKIE', 'wordpresspass_' . COOKIEHASH); - - /** - * @since 2.5.0 - */ - if ( !defined('AUTH_COOKIE') ) - define('AUTH_COOKIE', 'wordpress_' . COOKIEHASH); - - /** - * @since 2.6.0 - */ - if ( !defined('SECURE_AUTH_COOKIE') ) - define('SECURE_AUTH_COOKIE', 'wordpress_sec_' . COOKIEHASH); - - /** - * @since 2.6.0 - */ - if ( !defined('LOGGED_IN_COOKIE') ) - define('LOGGED_IN_COOKIE', 'wordpress_logged_in_' . COOKIEHASH); - - /** - * @since 2.3.0 - */ - if ( !defined('TEST_COOKIE') ) - define('TEST_COOKIE', 'wordpress_test_cookie'); - - /** - * @since 1.2.0 - */ - if ( !defined('COOKIEPATH') ) - define('COOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_option('home') . '/' ) ); - - /** - * @since 1.5.0 - */ - if ( !defined('SITECOOKIEPATH') ) - define('SITECOOKIEPATH', preg_replace('|https?://[^/]+|i', '', get_option('siteurl') . '/' ) ); - - /** - * @since 2.6.0 - */ - if ( !defined('ADMIN_COOKIE_PATH') ) - define( 'ADMIN_COOKIE_PATH', SITECOOKIEPATH . 'wp-admin' ); - - /** - * @since 2.6.0 - */ - if ( !defined('PLUGINS_COOKIE_PATH') ) - define( 'PLUGINS_COOKIE_PATH', preg_replace('|https?://[^/]+|i', '', WP_PLUGIN_URL) ); - - /** - * @since 2.0.0 - */ - if ( !defined('COOKIE_DOMAIN') ) - define('COOKIE_DOMAIN', false); -} - -/** - * Defines cookie related WordPress constants - * - * @since 3.0.0 - */ -function wp_ssl_constants() { - /** - * @since 2.6.0 - */ - if ( !defined( 'FORCE_SSL_ADMIN' ) ) { - if ( 'https' === parse_url( get_option( 'siteurl' ), PHP_URL_SCHEME ) ) { - define( 'FORCE_SSL_ADMIN', true ); - } else { - define( 'FORCE_SSL_ADMIN', false ); - } - } - force_ssl_admin( FORCE_SSL_ADMIN ); - - /** - * @since 2.6.0 - * @deprecated 4.0.0 - */ - if ( defined( 'FORCE_SSL_LOGIN' ) && FORCE_SSL_LOGIN ) { - force_ssl_admin( true ); - } -} - -/** - * Defines functionality related WordPress constants - * - * @since 3.0.0 - */ -function wp_functionality_constants() { - /** - * @since 2.5.0 - */ - if ( !defined( 'AUTOSAVE_INTERVAL' ) ) - define( 'AUTOSAVE_INTERVAL', 60 ); - - /** - * @since 2.9.0 - */ - if ( !defined( 'EMPTY_TRASH_DAYS' ) ) - define( 'EMPTY_TRASH_DAYS', 30 ); - - if ( !defined('WP_POST_REVISIONS') ) - define('WP_POST_REVISIONS', true); - - /** - * @since 3.3.0 - */ - if ( !defined( 'WP_CRON_LOCK_TIMEOUT' ) ) - define('WP_CRON_LOCK_TIMEOUT', 60); // In seconds -} - -/** - * Defines templating related WordPress constants - * - * @since 3.0.0 - */ -function wp_templating_constants() { - /** - * Filesystem path to the current active template directory - * @since 1.5.0 - */ - define('TEMPLATEPATH', get_template_directory()); - - /** - * Filesystem path to the current active template stylesheet directory - * @since 2.1.0 - */ - define('STYLESHEETPATH', get_stylesheet_directory()); - - /** - * Slug of the default theme for this install. - * Used as the default theme when installing new sites. - * It will be used as the fallback if the current theme doesn't exist. - * - * @since 3.0.0 - * @see WP_Theme::get_core_default_theme() - */ - if ( !defined('WP_DEFAULT_THEME') ) - define( 'WP_DEFAULT_THEME', 'twentyseventeen' ); - -} diff --git a/wp/wp-includes/default-filters.php b/wp/wp-includes/default-filters.php deleted file mode 100644 index 9b45abc9..00000000 --- a/wp/wp-includes/default-filters.php +++ /dev/null @@ -1,507 +0,0 @@ - $post->ID, - 'Author_ID' => $post->post_author, - 'Date' => $post->post_date, - 'Content' => $post->post_content, - 'Excerpt' => $post->post_excerpt, - 'Title' => $post->post_title, - 'Category' => $post->post_category, - 'post_status' => $post->post_status, - 'comment_status' => $post->comment_status, - 'ping_status' => $post->ping_status, - 'post_password' => $post->post_password, - 'to_ping' => $post->to_ping, - 'pinged' => $post->pinged, - 'post_type' => $post->post_type, - 'post_name' => $post->post_name - ); - - return $postdata; -} - -/** - * Sets up the WordPress Loop. - * - * Use The Loop instead. - * - * @link https://codex.wordpress.org/The_Loop - * - * @since 1.0.1 - * @deprecated 1.5.0 - */ -function start_wp() { - global $wp_query; - - _deprecated_function( __FUNCTION__, '1.5.0', __('new WordPress Loop') ); - - // Since the old style loop is being used, advance the query iterator here. - $wp_query->next_post(); - - setup_postdata( get_post() ); -} - -/** - * Returns or prints a category ID. - * - * @since 0.71 - * @deprecated 0.71 Use get_the_category() - * @see get_the_category() - * - * @param bool $echo Optional. Whether to echo the output. Default true. - * @return int Category ID. - */ -function the_category_ID($echo = true) { - _deprecated_function( __FUNCTION__, '0.71', 'get_the_category()' ); - - // Grab the first cat in the list. - $categories = get_the_category(); - $cat = $categories[0]->term_id; - - if ( $echo ) - echo $cat; - - return $cat; -} - -/** - * Prints a category with optional text before and after. - * - * @since 0.71 - * @deprecated 0.71 Use get_the_category_by_ID() - * @see get_the_category_by_ID() - * - * @param string $before Optional. Text to display before the category. Default empty. - * @param string $after Optional. Text to display after the category. Default empty. - */ -function the_category_head( $before = '', $after = '' ) { - global $currentcat, $previouscat; - - _deprecated_function( __FUNCTION__, '0.71', 'get_the_category_by_ID()' ); - - // Grab the first cat in the list. - $categories = get_the_category(); - $currentcat = $categories[0]->category_id; - if ( $currentcat != $previouscat ) { - echo $before; - echo get_the_category_by_ID($currentcat); - echo $after; - $previouscat = $currentcat; - } -} - -/** - * Prints a link to the previous post. - * - * @since 1.5.0 - * @deprecated 2.0.0 Use previous_post_link() - * @see previous_post_link() - * - * @param string $format - * @param string $previous - * @param string $title - * @param string $in_same_cat - * @param int $limitprev - * @param string $excluded_categories - */ -function previous_post($format='%', $previous='previous post: ', $title='yes', $in_same_cat='no', $limitprev=1, $excluded_categories='') { - - _deprecated_function( __FUNCTION__, '2.0.0', 'previous_post_link()' ); - - if ( empty($in_same_cat) || 'no' == $in_same_cat ) - $in_same_cat = false; - else - $in_same_cat = true; - - $post = get_previous_post($in_same_cat, $excluded_categories); - - if ( !$post ) - return; - - $string = ''.$previous; - if ( 'yes' == $title ) - $string .= apply_filters('the_title', $post->post_title, $post->ID); - $string .= ''; - $format = str_replace('%', $string, $format); - echo $format; -} - -/** - * Prints link to the next post. - * - * @since 0.71 - * @deprecated 2.0.0 Use next_post_link() - * @see next_post_link() - * - * @param string $format - * @param string $next - * @param string $title - * @param string $in_same_cat - * @param int $limitnext - * @param string $excluded_categories - */ -function next_post($format='%', $next='next post: ', $title='yes', $in_same_cat='no', $limitnext=1, $excluded_categories='') { - _deprecated_function( __FUNCTION__, '2.0.0', 'next_post_link()' ); - - if ( empty($in_same_cat) || 'no' == $in_same_cat ) - $in_same_cat = false; - else - $in_same_cat = true; - - $post = get_next_post($in_same_cat, $excluded_categories); - - if ( !$post ) - return; - - $string = ''.$next; - if ( 'yes' == $title ) - $string .= apply_filters('the_title', $post->post_title, $post->ID); - $string .= ''; - $format = str_replace('%', $string, $format); - echo $format; -} - -/** - * Whether user can create a post. - * - * @since 1.5.0 - * @deprecated 2.0.0 Use current_user_can() - * @see current_user_can() - * - * @param int $user_id - * @param int $blog_id Not Used - * @param int $category_id Not Used - * @return bool - */ -function user_can_create_post($user_id, $blog_id = 1, $category_id = 'None') { - _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); - - $author_data = get_userdata($user_id); - return ($author_data->user_level > 1); -} - -/** - * Whether user can create a post. - * - * @since 1.5.0 - * @deprecated 2.0.0 Use current_user_can() - * @see current_user_can() - * - * @param int $user_id - * @param int $blog_id Not Used - * @param int $category_id Not Used - * @return bool - */ -function user_can_create_draft($user_id, $blog_id = 1, $category_id = 'None') { - _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); - - $author_data = get_userdata($user_id); - return ($author_data->user_level >= 1); -} - -/** - * Whether user can edit a post. - * - * @since 1.5.0 - * @deprecated 2.0.0 Use current_user_can() - * @see current_user_can() - * - * @param int $user_id - * @param int $post_id - * @param int $blog_id Not Used - * @return bool - */ -function user_can_edit_post($user_id, $post_id, $blog_id = 1) { - _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); - - $author_data = get_userdata($user_id); - $post = get_post($post_id); - $post_author_data = get_userdata($post->post_author); - - if ( (($user_id == $post_author_data->ID) && !($post->post_status == 'publish' && $author_data->user_level < 2)) - || ($author_data->user_level > $post_author_data->user_level) - || ($author_data->user_level >= 10) ) { - return true; - } else { - return false; - } -} - -/** - * Whether user can delete a post. - * - * @since 1.5.0 - * @deprecated 2.0.0 Use current_user_can() - * @see current_user_can() - * - * @param int $user_id - * @param int $post_id - * @param int $blog_id Not Used - * @return bool - */ -function user_can_delete_post($user_id, $post_id, $blog_id = 1) { - _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); - - // right now if one can edit, one can delete - return user_can_edit_post($user_id, $post_id, $blog_id); -} - -/** - * Whether user can set new posts' dates. - * - * @since 1.5.0 - * @deprecated 2.0.0 Use current_user_can() - * @see current_user_can() - * - * @param int $user_id - * @param int $blog_id Not Used - * @param int $category_id Not Used - * @return bool - */ -function user_can_set_post_date($user_id, $blog_id = 1, $category_id = 'None') { - _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); - - $author_data = get_userdata($user_id); - return (($author_data->user_level > 4) && user_can_create_post($user_id, $blog_id, $category_id)); -} - -/** - * Whether user can delete a post. - * - * @since 1.5.0 - * @deprecated 2.0.0 Use current_user_can() - * @see current_user_can() - * - * @param int $user_id - * @param int $post_id - * @param int $blog_id Not Used - * @return bool returns true if $user_id can edit $post_id's date - */ -function user_can_edit_post_date($user_id, $post_id, $blog_id = 1) { - _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); - - $author_data = get_userdata($user_id); - return (($author_data->user_level > 4) && user_can_edit_post($user_id, $post_id, $blog_id)); -} - -/** - * Whether user can delete a post. - * - * @since 1.5.0 - * @deprecated 2.0.0 Use current_user_can() - * @see current_user_can() - * - * @param int $user_id - * @param int $post_id - * @param int $blog_id Not Used - * @return bool returns true if $user_id can edit $post_id's comments - */ -function user_can_edit_post_comments($user_id, $post_id, $blog_id = 1) { - _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); - - // right now if one can edit a post, one can edit comments made on it - return user_can_edit_post($user_id, $post_id, $blog_id); -} - -/** - * Whether user can delete a post. - * - * @since 1.5.0 - * @deprecated 2.0.0 Use current_user_can() - * @see current_user_can() - * - * @param int $user_id - * @param int $post_id - * @param int $blog_id Not Used - * @return bool returns true if $user_id can delete $post_id's comments - */ -function user_can_delete_post_comments($user_id, $post_id, $blog_id = 1) { - _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); - - // right now if one can edit comments, one can delete comments - return user_can_edit_post_comments($user_id, $post_id, $blog_id); -} - -/** - * Can user can edit other user. - * - * @since 1.5.0 - * @deprecated 2.0.0 Use current_user_can() - * @see current_user_can() - * - * @param int $user_id - * @param int $other_user - * @return bool - */ -function user_can_edit_user($user_id, $other_user) { - _deprecated_function( __FUNCTION__, '2.0.0', 'current_user_can()' ); - - $user = get_userdata($user_id); - $other = get_userdata($other_user); - if ( $user->user_level > $other->user_level || $user->user_level > 8 || $user->ID == $other->ID ) - return true; - else - return false; -} - -/** - * Gets the links associated with category $cat_name. - * - * @since 0.71 - * @deprecated 2.1.0 Use get_bookmarks() - * @see get_bookmarks() - * - * @param string $cat_name Optional. The category name to use. If no match is found uses all. - * @param string $before Optional. The html to output before the link. - * @param string $after Optional. The html to output after the link. - * @param string $between Optional. The html to output between the link/image and its description. Not used if no image or $show_images is true. - * @param bool $show_images Optional. Whether to show images (if defined). - * @param string $orderby Optional. The order to output the links. E.g. 'id', 'name', 'url', 'description' or 'rating'. Or maybe owner. - * If you start the name with an underscore the order will be reversed. You can also specify 'rand' as the order which will return links in a - * random order. - * @param bool $show_description Optional. Whether to show the description if show_images=false/not defined. - * @param bool $show_rating Optional. Show rating stars/chars. - * @param int $limit Optional. Limit to X entries. If not specified, all entries are shown. - * @param int $show_updated Optional. Whether to show last updated timestamp - */ -function get_linksbyname($cat_name = "noname", $before = '', $after = '
        ', $between = " ", $show_images = true, $orderby = 'id', - $show_description = true, $show_rating = false, - $limit = -1, $show_updated = 0) { - _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); - - $cat_id = -1; - $cat = get_term_by('name', $cat_name, 'link_category'); - if ( $cat ) - $cat_id = $cat->term_id; - - get_links($cat_id, $before, $after, $between, $show_images, $orderby, $show_description, $show_rating, $limit, $show_updated); -} - -/** - * Gets the links associated with the named category. - * - * @since 1.0.1 - * @deprecated 2.1.0 Use wp_list_bookmarks() - * @see wp_list_bookmarks() - * - * @param string $category The category to use. - * @param string $args - * @return string|null - */ -function wp_get_linksbyname($category, $args = '') { - _deprecated_function(__FUNCTION__, '2.1.0', 'wp_list_bookmarks()'); - - $defaults = array( - 'after' => '
        ', - 'before' => '', - 'categorize' => 0, - 'category_after' => '', - 'category_before' => '', - 'category_name' => $category, - 'show_description' => 1, - 'title_li' => '', - ); - - $r = wp_parse_args( $args, $defaults ); - - return wp_list_bookmarks($r); -} - -/** - * Gets an array of link objects associated with category $cat_name. - * - * $links = get_linkobjectsbyname( 'fred' ); - * foreach ( $links as $link ) { - * echo '
      • ' . $link->link_name . '
      • '; - * } - * - * @since 1.0.1 - * @deprecated 2.1.0 Use get_bookmarks() - * @see get_bookmarks() - * - * @param string $cat_name The category name to use. If no match is found uses all. - * @param string $orderby The order to output the links. E.g. 'id', 'name', 'url', 'description', or 'rating'. - * Or maybe owner. If you start the name with an underscore the order will be reversed. You can also - * specify 'rand' as the order which will return links in a random order. - * @param int $limit Limit to X entries. If not specified, all entries are shown. - * @return array - */ -function get_linkobjectsbyname($cat_name = "noname" , $orderby = 'name', $limit = -1) { - _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); - - $cat_id = -1; - $cat = get_term_by('name', $cat_name, 'link_category'); - if ( $cat ) - $cat_id = $cat->term_id; - - return get_linkobjects($cat_id, $orderby, $limit); -} - -/** - * Gets an array of link objects associated with category n. - * - * Usage: - * - * $links = get_linkobjects(1); - * if ($links) { - * foreach ($links as $link) { - * echo '
      • '.$link->link_name.'
        '.$link->link_description.'
      • '; - * } - * } - * - * Fields are: - * - * - link_id - * - link_url - * - link_name - * - link_image - * - link_target - * - link_category - * - link_description - * - link_visible - * - link_owner - * - link_rating - * - link_updated - * - link_rel - * - link_notes - * - * @since 1.0.1 - * @deprecated 2.1.0 Use get_bookmarks() - * @see get_bookmarks() - * - * @param int $category The category to use. If no category supplied uses all - * @param string $orderby the order to output the links. E.g. 'id', 'name', 'url', - * 'description', or 'rating'. Or maybe owner. If you start the name with an - * underscore the order will be reversed. You can also specify 'rand' as the - * order which will return links in a random order. - * @param int $limit Limit to X entries. If not specified, all entries are shown. - * @return array - */ -function get_linkobjects($category = 0, $orderby = 'name', $limit = 0) { - _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); - - $links = get_bookmarks( array( 'category' => $category, 'orderby' => $orderby, 'limit' => $limit ) ) ; - - $links_array = array(); - foreach ($links as $link) - $links_array[] = $link; - - return $links_array; -} - -/** - * Gets the links associated with category 'cat_name' and display rating stars/chars. - * - * @since 0.71 - * @deprecated 2.1.0 Use get_bookmarks() - * @see get_bookmarks() - * - * @param string $cat_name The category name to use. If no match is found uses all - * @param string $before The html to output before the link - * @param string $after The html to output after the link - * @param string $between The html to output between the link/image and its description. Not used if no image or show_images is true - * @param bool $show_images Whether to show images (if defined). - * @param string $orderby the order to output the links. E.g. 'id', 'name', 'url', - * 'description', or 'rating'. Or maybe owner. If you start the name with an - * underscore the order will be reversed. You can also specify 'rand' as the - * order which will return links in a random order. - * @param bool $show_description Whether to show the description if show_images=false/not defined - * @param int $limit Limit to X entries. If not specified, all entries are shown. - * @param int $show_updated Whether to show last updated timestamp - */ -function get_linksbyname_withrating($cat_name = "noname", $before = '', $after = '
        ', $between = " ", - $show_images = true, $orderby = 'id', $show_description = true, $limit = -1, $show_updated = 0) { - _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); - - get_linksbyname($cat_name, $before, $after, $between, $show_images, $orderby, $show_description, true, $limit, $show_updated); -} - -/** - * Gets the links associated with category n and display rating stars/chars. - * - * @since 0.71 - * @deprecated 2.1.0 Use get_bookmarks() - * @see get_bookmarks() - * - * @param int $category The category to use. If no category supplied uses all - * @param string $before The html to output before the link - * @param string $after The html to output after the link - * @param string $between The html to output between the link/image and its description. Not used if no image or show_images == true - * @param bool $show_images Whether to show images (if defined). - * @param string $orderby The order to output the links. E.g. 'id', 'name', 'url', - * 'description', or 'rating'. Or maybe owner. If you start the name with an - * underscore the order will be reversed. You can also specify 'rand' as the - * order which will return links in a random order. - * @param bool $show_description Whether to show the description if show_images=false/not defined. - * @param int $limit Limit to X entries. If not specified, all entries are shown. - * @param int $show_updated Whether to show last updated timestamp - */ -function get_links_withrating($category = -1, $before = '', $after = '
        ', $between = " ", $show_images = true, - $orderby = 'id', $show_description = true, $limit = -1, $show_updated = 0) { - _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); - - get_links($category, $before, $after, $between, $show_images, $orderby, $show_description, true, $limit, $show_updated); -} - -/** - * Gets the auto_toggle setting. - * - * @since 0.71 - * @deprecated 2.1.0 - * - * @param int $id The category to get. If no category supplied uses 0 - * @return int Only returns 0. - */ -function get_autotoggle($id = 0) { - _deprecated_function( __FUNCTION__, '2.1.0' ); - return 0; -} - -/** - * Lists categories. - * - * @since 0.71 - * @deprecated 2.1.0 Use wp_list_categories() - * @see wp_list_categories() - * - * @param int $optionall - * @param string $all - * @param string $sort_column - * @param string $sort_order - * @param string $file - * @param bool $list - * @param int $optiondates - * @param int $optioncount - * @param int $hide_empty - * @param int $use_desc_for_title - * @param bool $children - * @param int $child_of - * @param int $categories - * @param int $recurse - * @param string $feed - * @param string $feed_image - * @param string $exclude - * @param bool $hierarchical - * @return false|null - */ -function list_cats($optionall = 1, $all = 'All', $sort_column = 'ID', $sort_order = 'asc', $file = '', $list = true, $optiondates = 0, - $optioncount = 0, $hide_empty = 1, $use_desc_for_title = 1, $children=false, $child_of=0, $categories=0, - $recurse=0, $feed = '', $feed_image = '', $exclude = '', $hierarchical=false) { - _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_categories()' ); - - $query = compact('optionall', 'all', 'sort_column', 'sort_order', 'file', 'list', 'optiondates', 'optioncount', 'hide_empty', 'use_desc_for_title', 'children', - 'child_of', 'categories', 'recurse', 'feed', 'feed_image', 'exclude', 'hierarchical'); - return wp_list_cats($query); -} - -/** - * Lists categories. - * - * @since 1.2.0 - * @deprecated 2.1.0 Use wp_list_categories() - * @see wp_list_categories() - * - * @param string|array $args - * @return false|null|string - */ -function wp_list_cats($args = '') { - _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_categories()' ); - - $r = wp_parse_args( $args ); - - // Map to new names. - if ( isset($r['optionall']) && isset($r['all'])) - $r['show_option_all'] = $r['all']; - if ( isset($r['sort_column']) ) - $r['orderby'] = $r['sort_column']; - if ( isset($r['sort_order']) ) - $r['order'] = $r['sort_order']; - if ( isset($r['optiondates']) ) - $r['show_last_update'] = $r['optiondates']; - if ( isset($r['optioncount']) ) - $r['show_count'] = $r['optioncount']; - if ( isset($r['list']) ) - $r['style'] = $r['list'] ? 'list' : 'break'; - $r['title_li'] = ''; - - return wp_list_categories($r); -} - -/** - * Deprecated method for generating a drop-down of categories. - * - * @since 0.71 - * @deprecated 2.1.0 Use wp_dropdown_categories() - * @see wp_dropdown_categories() - * - * @param int $optionall - * @param string $all - * @param string $orderby - * @param string $order - * @param int $show_last_update - * @param int $show_count - * @param int $hide_empty - * @param bool $optionnone - * @param int $selected - * @param int $exclude - * @return string - */ -function dropdown_cats($optionall = 1, $all = 'All', $orderby = 'ID', $order = 'asc', - $show_last_update = 0, $show_count = 0, $hide_empty = 1, $optionnone = false, - $selected = 0, $exclude = 0) { - _deprecated_function( __FUNCTION__, '2.1.0', 'wp_dropdown_categories()' ); - - $show_option_all = ''; - if ( $optionall ) - $show_option_all = $all; - - $show_option_none = ''; - if ( $optionnone ) - $show_option_none = __('None'); - - $vars = compact('show_option_all', 'show_option_none', 'orderby', 'order', - 'show_last_update', 'show_count', 'hide_empty', 'selected', 'exclude'); - $query = add_query_arg($vars, ''); - return wp_dropdown_categories($query); -} - -/** - * Lists authors. - * - * @since 1.2.0 - * @deprecated 2.1.0 Use wp_list_authors() - * @see wp_list_authors() - * - * @param bool $optioncount - * @param bool $exclude_admin - * @param bool $show_fullname - * @param bool $hide_empty - * @param string $feed - * @param string $feed_image - * @return null|string - */ -function list_authors($optioncount = false, $exclude_admin = true, $show_fullname = false, $hide_empty = true, $feed = '', $feed_image = '') { - _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_authors()' ); - - $args = compact('optioncount', 'exclude_admin', 'show_fullname', 'hide_empty', 'feed', 'feed_image'); - return wp_list_authors($args); -} - -/** - * Retrieves a list of post categories. - * - * @since 1.0.1 - * @deprecated 2.1.0 Use wp_get_post_categories() - * @see wp_get_post_categories() - * - * @param int $blogid Not Used - * @param int $post_ID - * @return array - */ -function wp_get_post_cats($blogid = '1', $post_ID = 0) { - _deprecated_function( __FUNCTION__, '2.1.0', 'wp_get_post_categories()' ); - return wp_get_post_categories($post_ID); -} - -/** - * Sets the categories that the post id belongs to. - * - * @since 1.0.1 - * @deprecated 2.1.0 - * @deprecated Use wp_set_post_categories() - * @see wp_set_post_categories() - * - * @param int $blogid Not used - * @param int $post_ID - * @param array $post_categories - * @return bool|mixed - */ -function wp_set_post_cats($blogid = '1', $post_ID = 0, $post_categories = array()) { - _deprecated_function( __FUNCTION__, '2.1.0', 'wp_set_post_categories()' ); - return wp_set_post_categories($post_ID, $post_categories); -} - -/** - * Retrieves a list of archives. - * - * @since 0.71 - * @deprecated 2.1.0 Use wp_get_archives() - * @see wp_get_archives() - * - * @param string $type - * @param string $limit - * @param string $format - * @param string $before - * @param string $after - * @param bool $show_post_count - * @return string|null - */ -function get_archives($type='', $limit='', $format='html', $before = '', $after = '', $show_post_count = false) { - _deprecated_function( __FUNCTION__, '2.1.0', 'wp_get_archives()' ); - $args = compact('type', 'limit', 'format', 'before', 'after', 'show_post_count'); - return wp_get_archives($args); -} - -/** - * Returns or Prints link to the author's posts. - * - * @since 1.2.0 - * @deprecated 2.1.0 Use get_author_posts_url() - * @see get_author_posts_url() - * - * @param bool $echo - * @param int $author_id - * @param string $author_nicename Optional. - * @return string|null - */ -function get_author_link($echo, $author_id, $author_nicename = '') { - _deprecated_function( __FUNCTION__, '2.1.0', 'get_author_posts_url()' ); - - $link = get_author_posts_url($author_id, $author_nicename); - - if ( $echo ) - echo $link; - return $link; -} - -/** - * Print list of pages based on arguments. - * - * @since 0.71 - * @deprecated 2.1.0 Use wp_link_pages() - * @see wp_link_pages() - * - * @param string $before - * @param string $after - * @param string $next_or_number - * @param string $nextpagelink - * @param string $previouspagelink - * @param string $pagelink - * @param string $more_file - * @return string - */ -function link_pages($before='
        ', $after='
        ', $next_or_number='number', $nextpagelink='next page', $previouspagelink='previous page', - $pagelink='%', $more_file='') { - _deprecated_function( __FUNCTION__, '2.1.0', 'wp_link_pages()' ); - - $args = compact('before', 'after', 'next_or_number', 'nextpagelink', 'previouspagelink', 'pagelink', 'more_file'); - return wp_link_pages($args); -} - -/** - * Get value based on option. - * - * @since 0.71 - * @deprecated 2.1.0 Use get_option() - * @see get_option() - * - * @param string $option - * @return string - */ -function get_settings($option) { - _deprecated_function( __FUNCTION__, '2.1.0', 'get_option()' ); - - return get_option($option); -} - -/** - * Print the permalink of the current post in the loop. - * - * @since 0.71 - * @deprecated 1.2.0 Use the_permalink() - * @see the_permalink() - */ -function permalink_link() { - _deprecated_function( __FUNCTION__, '1.2.0', 'the_permalink()' ); - the_permalink(); -} - -/** - * Print the permalink to the RSS feed. - * - * @since 0.71 - * @deprecated 2.3.0 Use the_permalink_rss() - * @see the_permalink_rss() - * - * @param string $deprecated - */ -function permalink_single_rss($deprecated = '') { - _deprecated_function( __FUNCTION__, '2.3.0', 'the_permalink_rss()' ); - the_permalink_rss(); -} - -/** - * Gets the links associated with category. - * - * @since 1.0.1 - * @deprecated 2.1.0 Use wp_list_bookmarks() - * @see wp_list_bookmarks() - * - * @param string $args a query string - * @return null|string - */ -function wp_get_links($args = '') { - _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_bookmarks()' ); - - if ( strpos( $args, '=' ) === false ) { - $cat_id = $args; - $args = add_query_arg( 'category', $cat_id, $args ); - } - - $defaults = array( - 'after' => '
        ', - 'before' => '', - 'between' => ' ', - 'categorize' => 0, - 'category' => '', - 'echo' => true, - 'limit' => -1, - 'orderby' => 'name', - 'show_description' => true, - 'show_images' => true, - 'show_rating' => false, - 'show_updated' => true, - 'title_li' => '', - ); - - $r = wp_parse_args( $args, $defaults ); - - return wp_list_bookmarks($r); -} - -/** - * Gets the links associated with category by id. - * - * @since 0.71 - * @deprecated 2.1.0 Use get_bookmarks() - * @see get_bookmarks() - * - * @param int $category The category to use. If no category supplied uses all - * @param string $before the html to output before the link - * @param string $after the html to output after the link - * @param string $between the html to output between the link/image and its description. - * Not used if no image or show_images == true - * @param bool $show_images whether to show images (if defined). - * @param string $orderby the order to output the links. E.g. 'id', 'name', 'url', - * 'description', or 'rating'. Or maybe owner. If you start the name with an - * underscore the order will be reversed. You can also specify 'rand' as the order - * which will return links in a random order. - * @param bool $show_description whether to show the description if show_images=false/not defined. - * @param bool $show_rating show rating stars/chars - * @param int $limit Limit to X entries. If not specified, all entries are shown. - * @param int $show_updated whether to show last updated timestamp - * @param bool $echo whether to echo the results, or return them instead - * @return null|string - */ -function get_links($category = -1, $before = '', $after = '
        ', $between = ' ', $show_images = true, $orderby = 'name', - $show_description = true, $show_rating = false, $limit = -1, $show_updated = 1, $echo = true) { - _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmarks()' ); - - $order = 'ASC'; - if ( substr($orderby, 0, 1) == '_' ) { - $order = 'DESC'; - $orderby = substr($orderby, 1); - } - - if ( $category == -1 ) //get_bookmarks uses '' to signify all categories - $category = ''; - - $results = get_bookmarks(array('category' => $category, 'orderby' => $orderby, 'order' => $order, 'show_updated' => $show_updated, 'limit' => $limit)); - - if ( !$results ) - return; - - $output = ''; - - foreach ( (array) $results as $row ) { - if ( !isset($row->recently_updated) ) - $row->recently_updated = false; - $output .= $before; - if ( $show_updated && $row->recently_updated ) - $output .= get_option('links_recently_updated_prepend'); - $the_link = '#'; - if ( !empty($row->link_url) ) - $the_link = esc_url($row->link_url); - $rel = $row->link_rel; - if ( '' != $rel ) - $rel = ' rel="' . $rel . '"'; - - $desc = esc_attr(sanitize_bookmark_field('link_description', $row->link_description, $row->link_id, 'display')); - $name = esc_attr(sanitize_bookmark_field('link_name', $row->link_name, $row->link_id, 'display')); - $title = $desc; - - if ( $show_updated ) - if (substr($row->link_updated_f, 0, 2) != '00') - $title .= ' ('.__('Last updated') . ' ' . date(get_option('links_updated_date_format'), $row->link_updated_f + (get_option('gmt_offset') * HOUR_IN_SECONDS)) . ')'; - - if ( '' != $title ) - $title = ' title="' . $title . '"'; - - $alt = ' alt="' . $name . '"'; - - $target = $row->link_target; - if ( '' != $target ) - $target = ' target="' . $target . '"'; - - $output .= ''; - - if ( $row->link_image != null && $show_images ) { - if ( strpos($row->link_image, 'http') !== false ) - $output .= "link_image\" $alt $title />"; - else // If it's a relative path - $output .= "link_image\" $alt $title />"; - } else { - $output .= $name; - } - - $output .= ''; - - if ( $show_updated && $row->recently_updated ) - $output .= get_option('links_recently_updated_append'); - - if ( $show_description && '' != $desc ) - $output .= $between . $desc; - - if ($show_rating) { - $output .= $between . get_linkrating($row); - } - - $output .= "$after\n"; - } // end while - - if ( !$echo ) - return $output; - echo $output; -} - -/** - * Output entire list of links by category. - * - * Output a list of all links, listed by category, using the settings in - * $wpdb->linkcategories and output it as a nested HTML unordered list. - * - * @since 1.0.1 - * @deprecated 2.1.0 Use wp_list_bookmarks() - * @see wp_list_bookmarks() - * - * @param string $order Sort link categories by 'name' or 'id' - */ -function get_links_list($order = 'name') { - _deprecated_function( __FUNCTION__, '2.1.0', 'wp_list_bookmarks()' ); - - $order = strtolower($order); - - // Handle link category sorting - $direction = 'ASC'; - if ( '_' == substr($order,0,1) ) { - $direction = 'DESC'; - $order = substr($order,1); - } - - if ( !isset($direction) ) - $direction = ''; - - $cats = get_categories(array('type' => 'link', 'orderby' => $order, 'order' => $direction, 'hierarchical' => 0)); - - // Display each category - if ( $cats ) { - foreach ( (array) $cats as $cat ) { - // Handle each category. - - // Display the category name - echo '
      • ' . apply_filters('link_category', $cat->name ) . "

        \n\t
          \n"; - // Call get_links() with all the appropriate params - get_links($cat->term_id, '
        • ', "
        • ", "\n", true, 'name', false); - - // Close the last category - echo "\n\t
        \n
      • \n"; - } - } -} - -/** - * Show the link to the links popup and the number of links. - * - * @since 0.71 - * @deprecated 2.1.0 - * - * @param string $text the text of the link - * @param int $width the width of the popup window - * @param int $height the height of the popup window - * @param string $file the page to open in the popup window - * @param bool $count the number of links in the db - */ -function links_popup_script($text = 'Links', $width=400, $height=400, $file='links.all.php', $count = true) { - _deprecated_function( __FUNCTION__, '2.1.0' ); -} - -/** - * Legacy function that retrieved the value of a link's link_rating field. - * - * @since 1.0.1 - * @deprecated 2.1.0 Use sanitize_bookmark_field() - * @see sanitize_bookmark_field() - * - * @param object $link Link object. - * @return mixed Value of the 'link_rating' field, false otherwise. - */ -function get_linkrating( $link ) { - _deprecated_function( __FUNCTION__, '2.1.0', 'sanitize_bookmark_field()' ); - return sanitize_bookmark_field('link_rating', $link->link_rating, $link->link_id, 'display'); -} - -/** - * Gets the name of category by id. - * - * @since 0.71 - * @deprecated 2.1.0 Use get_category() - * @see get_category() - * - * @param int $id The category to get. If no category supplied uses 0 - * @return string - */ -function get_linkcatname($id = 0) { - _deprecated_function( __FUNCTION__, '2.1.0', 'get_category()' ); - - $id = (int) $id; - - if ( empty($id) ) - return ''; - - $cats = wp_get_link_cats($id); - - if ( empty($cats) || ! is_array($cats) ) - return ''; - - $cat_id = (int) $cats[0]; // Take the first cat. - - $cat = get_category($cat_id); - return $cat->name; -} - -/** - * Print RSS comment feed link. - * - * @since 1.0.1 - * @deprecated 2.5.0 Use post_comments_feed_link() - * @see post_comments_feed_link() - * - * @param string $link_text - */ -function comments_rss_link($link_text = 'Comments RSS') { - _deprecated_function( __FUNCTION__, '2.5.0', 'post_comments_feed_link()' ); - post_comments_feed_link($link_text); -} - -/** - * Print/Return link to category RSS2 feed. - * - * @since 1.2.0 - * @deprecated 2.5.0 Use get_category_feed_link() - * @see get_category_feed_link() - * - * @param bool $echo - * @param int $cat_ID - * @return string - */ -function get_category_rss_link($echo = false, $cat_ID = 1) { - _deprecated_function( __FUNCTION__, '2.5.0', 'get_category_feed_link()' ); - - $link = get_category_feed_link($cat_ID, 'rss2'); - - if ( $echo ) - echo $link; - return $link; -} - -/** - * Print/Return link to author RSS feed. - * - * @since 1.2.0 - * @deprecated 2.5.0 Use get_author_feed_link() - * @see get_author_feed_link() - * - * @param bool $echo - * @param int $author_id - * @return string - */ -function get_author_rss_link($echo = false, $author_id = 1) { - _deprecated_function( __FUNCTION__, '2.5.0', 'get_author_feed_link()' ); - - $link = get_author_feed_link($author_id); - if ( $echo ) - echo $link; - return $link; -} - -/** - * Return link to the post RSS feed. - * - * @since 1.5.0 - * @deprecated 2.2.0 Use get_post_comments_feed_link() - * @see get_post_comments_feed_link() - * - * @return string - */ -function comments_rss() { - _deprecated_function( __FUNCTION__, '2.2.0', 'get_post_comments_feed_link()' ); - return esc_url( get_post_comments_feed_link() ); -} - -/** - * An alias of wp_create_user(). - * - * @since 2.0.0 - * @deprecated 2.0.0 Use wp_create_user() - * @see wp_create_user() - * - * @param string $username The user's username. - * @param string $password The user's password. - * @param string $email The user's email. - * @return int The new user's ID. - */ -function create_user($username, $password, $email) { - _deprecated_function( __FUNCTION__, '2.0.0', 'wp_create_user()' ); - return wp_create_user($username, $password, $email); -} - -/** - * Unused function. - * - * @deprecated 2.5.0 - */ -function gzip_compression() { - _deprecated_function( __FUNCTION__, '2.5.0' ); - return false; -} - -/** - * Retrieve an array of comment data about comment $comment_ID. - * - * @since 0.71 - * @deprecated 2.7.0 Use get_comment() - * @see get_comment() - * - * @param int $comment_ID The ID of the comment - * @param int $no_cache Whether to use the cache (cast to bool) - * @param bool $include_unapproved Whether to include unapproved comments - * @return array The comment data - */ -function get_commentdata( $comment_ID, $no_cache = 0, $include_unapproved = false ) { - _deprecated_function( __FUNCTION__, '2.7.0', 'get_comment()' ); - return get_comment($comment_ID, ARRAY_A); -} - -/** - * Retrieve the category name by the category ID. - * - * @since 0.71 - * @deprecated 2.8.0 Use get_cat_name() - * @see get_cat_name() - * - * @param int $cat_ID Category ID - * @return string category name - */ -function get_catname( $cat_ID ) { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_cat_name()' ); - return get_cat_name( $cat_ID ); -} - -/** - * Retrieve category children list separated before and after the term IDs. - * - * @since 1.2.0 - * @deprecated 2.8.0 Use get_term_children() - * @see get_term_children() - * - * @param int $id Category ID to retrieve children. - * @param string $before Optional. Prepend before category term ID. - * @param string $after Optional, default is empty string. Append after category term ID. - * @param array $visited Optional. Category Term IDs that have already been added. - * @return string - */ -function get_category_children( $id, $before = '/', $after = '', $visited = array() ) { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_term_children()' ); - if ( 0 == $id ) - return ''; - - $chain = ''; - /** TODO: consult hierarchy */ - $cat_ids = get_all_category_ids(); - foreach ( (array) $cat_ids as $cat_id ) { - if ( $cat_id == $id ) - continue; - - $category = get_category( $cat_id ); - if ( is_wp_error( $category ) ) - return $category; - if ( $category->parent == $id && !in_array( $category->term_id, $visited ) ) { - $visited[] = $category->term_id; - $chain .= $before.$category->term_id.$after; - $chain .= get_category_children( $category->term_id, $before, $after ); - } - } - return $chain; -} - -/** - * Retrieves all category IDs. - * - * @since 2.0.0 - * @deprecated 4.0.0 Use get_terms() - * @see get_terms() - * - * @link https://codex.wordpress.org/Function_Reference/get_all_category_ids - * - * @return object List of all of the category IDs. - */ -function get_all_category_ids() { - _deprecated_function( __FUNCTION__, '4.0.0', 'get_terms()' ); - - if ( ! $cat_ids = wp_cache_get( 'all_category_ids', 'category' ) ) { - $cat_ids = get_terms( 'category', array('fields' => 'ids', 'get' => 'all') ); - wp_cache_add( 'all_category_ids', $cat_ids, 'category' ); - } - - return $cat_ids; -} - -/** - * Retrieve the description of the author of the current post. - * - * @since 1.5.0 - * @deprecated 2.8.0 Use get_the_author_meta() - * @see get_the_author_meta() - * - * @return string The author's description. - */ -function get_the_author_description() { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'description\')' ); - return get_the_author_meta('description'); -} - -/** - * Display the description of the author of the current post. - * - * @since 1.0.0 - * @deprecated 2.8.0 Use the_author_meta() - * @see the_author_meta() - */ -function the_author_description() { - _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'description\')' ); - the_author_meta('description'); -} - -/** - * Retrieve the login name of the author of the current post. - * - * @since 1.5.0 - * @deprecated 2.8.0 Use get_the_author_meta() - * @see get_the_author_meta() - * - * @return string The author's login name (username). - */ -function get_the_author_login() { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'login\')' ); - return get_the_author_meta('login'); -} - -/** - * Display the login name of the author of the current post. - * - * @since 0.71 - * @deprecated 2.8.0 Use the_author_meta() - * @see the_author_meta() - */ -function the_author_login() { - _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'login\')' ); - the_author_meta('login'); -} - -/** - * Retrieve the first name of the author of the current post. - * - * @since 1.5.0 - * @deprecated 2.8.0 Use get_the_author_meta() - * @see get_the_author_meta() - * - * @return string The author's first name. - */ -function get_the_author_firstname() { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'first_name\')' ); - return get_the_author_meta('first_name'); -} - -/** - * Display the first name of the author of the current post. - * - * @since 0.71 - * @deprecated 2.8.0 Use the_author_meta() - * @see the_author_meta() - */ -function the_author_firstname() { - _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'first_name\')' ); - the_author_meta('first_name'); -} - -/** - * Retrieve the last name of the author of the current post. - * - * @since 1.5.0 - * @deprecated 2.8.0 Use get_the_author_meta() - * @see get_the_author_meta() - * - * @return string The author's last name. - */ -function get_the_author_lastname() { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'last_name\')' ); - return get_the_author_meta('last_name'); -} - -/** - * Display the last name of the author of the current post. - * - * @since 0.71 - * @deprecated 2.8.0 Use the_author_meta() - * @see the_author_meta() - */ -function the_author_lastname() { - _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'last_name\')' ); - the_author_meta('last_name'); -} - -/** - * Retrieve the nickname of the author of the current post. - * - * @since 1.5.0 - * @deprecated 2.8.0 Use get_the_author_meta() - * @see get_the_author_meta() - * - * @return string The author's nickname. - */ -function get_the_author_nickname() { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'nickname\')' ); - return get_the_author_meta('nickname'); -} - -/** - * Display the nickname of the author of the current post. - * - * @since 0.71 - * @deprecated 2.8.0 Use the_author_meta() - * @see the_author_meta() - */ -function the_author_nickname() { - _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'nickname\')' ); - the_author_meta('nickname'); -} - -/** - * Retrieve the email of the author of the current post. - * - * @since 1.5.0 - * @deprecated 2.8.0 Use get_the_author_meta() - * @see get_the_author_meta() - * - * @return string The author's username. - */ -function get_the_author_email() { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'email\')' ); - return get_the_author_meta('email'); -} - -/** - * Display the email of the author of the current post. - * - * @since 0.71 - * @deprecated 2.8.0 Use the_author_meta() - * @see the_author_meta() - */ -function the_author_email() { - _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'email\')' ); - the_author_meta('email'); -} - -/** - * Retrieve the ICQ number of the author of the current post. - * - * @since 1.5.0 - * @deprecated 2.8.0 Use get_the_author_meta() - * @see get_the_author_meta() - * - * @return string The author's ICQ number. - */ -function get_the_author_icq() { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'icq\')' ); - return get_the_author_meta('icq'); -} - -/** - * Display the ICQ number of the author of the current post. - * - * @since 0.71 - * @deprecated 2.8.0 Use the_author_meta() - * @see the_author_meta() - */ -function the_author_icq() { - _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'icq\')' ); - the_author_meta('icq'); -} - -/** - * Retrieve the Yahoo! IM name of the author of the current post. - * - * @since 1.5.0 - * @deprecated 2.8.0 Use get_the_author_meta() - * @see get_the_author_meta() - * - * @return string The author's Yahoo! IM name. - */ -function get_the_author_yim() { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'yim\')' ); - return get_the_author_meta('yim'); -} - -/** - * Display the Yahoo! IM name of the author of the current post. - * - * @since 0.71 - * @deprecated 2.8.0 Use the_author_meta() - * @see the_author_meta() - */ -function the_author_yim() { - _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'yim\')' ); - the_author_meta('yim'); -} - -/** - * Retrieve the MSN address of the author of the current post. - * - * @since 1.5.0 - * @deprecated 2.8.0 Use get_the_author_meta() - * @see get_the_author_meta() - * - * @return string The author's MSN address. - */ -function get_the_author_msn() { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'msn\')' ); - return get_the_author_meta('msn'); -} - -/** - * Display the MSN address of the author of the current post. - * - * @since 0.71 - * @deprecated 2.8.0 Use the_author_meta() - * @see the_author_meta() - */ -function the_author_msn() { - _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'msn\')' ); - the_author_meta('msn'); -} - -/** - * Retrieve the AIM address of the author of the current post. - * - * @since 1.5.0 - * @deprecated 2.8.0 Use get_the_author_meta() - * @see get_the_author_meta() - * - * @return string The author's AIM address. - */ -function get_the_author_aim() { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'aim\')' ); - return get_the_author_meta('aim'); -} - -/** - * Display the AIM address of the author of the current post. - * - * @since 0.71 - * @deprecated 2.8.0 Use the_author_meta('aim') - * @see the_author_meta() - */ -function the_author_aim() { - _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'aim\')' ); - the_author_meta('aim'); -} - -/** - * Retrieve the specified author's preferred display name. - * - * @since 1.0.0 - * @deprecated 2.8.0 Use get_the_author_meta() - * @see get_the_author_meta() - * - * @param int $auth_id The ID of the author. - * @return string The author's display name. - */ -function get_author_name( $auth_id = false ) { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'display_name\')' ); - return get_the_author_meta('display_name', $auth_id); -} - -/** - * Retrieve the URL to the home page of the author of the current post. - * - * @since 1.5.0 - * @deprecated 2.8.0 Use get_the_author_meta() - * @see get_the_author_meta() - * - * @return string The URL to the author's page. - */ -function get_the_author_url() { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'url\')' ); - return get_the_author_meta('url'); -} - -/** - * Display the URL to the home page of the author of the current post. - * - * @since 0.71 - * @deprecated 2.8.0 Use the_author_meta() - * @see the_author_meta() - */ -function the_author_url() { - _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'url\')' ); - the_author_meta('url'); -} - -/** - * Retrieve the ID of the author of the current post. - * - * @since 1.5.0 - * @deprecated 2.8.0 Use get_the_author_meta() - * @see get_the_author_meta() - * - * @return string|int The author's ID. - */ -function get_the_author_ID() { - _deprecated_function( __FUNCTION__, '2.8.0', 'get_the_author_meta(\'ID\')' ); - return get_the_author_meta('ID'); -} - -/** - * Display the ID of the author of the current post. - * - * @since 0.71 - * @deprecated 2.8.0 Use the_author_meta() - * @see the_author_meta() - */ -function the_author_ID() { - _deprecated_function( __FUNCTION__, '2.8.0', 'the_author_meta(\'ID\')' ); - the_author_meta('ID'); -} - -/** - * Display the post content for the feed. - * - * For encoding the html or the $encode_html parameter, there are three possible - * values. '0' will make urls footnotes and use make_url_footnote(). '1' will - * encode special characters and automatically display all of the content. The - * value of '2' will strip all HTML tags from the content. - * - * Also note that you cannot set the amount of words and not set the html - * encoding. If that is the case, then the html encoding will default to 2, - * which will strip all HTML tags. - * - * To restrict the amount of words of the content, you can use the cut - * parameter. If the content is less than the amount, then there won't be any - * dots added to the end. If there is content left over, then dots will be added - * and the rest of the content will be removed. - * - * @since 0.71 - * - * @deprecated 2.9.0 Use the_content_feed() - * @see the_content_feed() - * - * @param string $more_link_text Optional. Text to display when more content is available but not displayed. - * @param int $stripteaser Optional. Default is 0. - * @param string $more_file Optional. - * @param int $cut Optional. Amount of words to keep for the content. - * @param int $encode_html Optional. How to encode the content. - */ -function the_content_rss($more_link_text='(more...)', $stripteaser=0, $more_file='', $cut = 0, $encode_html = 0) { - _deprecated_function( __FUNCTION__, '2.9.0', 'the_content_feed' ); - $content = get_the_content($more_link_text, $stripteaser); - $content = apply_filters('the_content_rss', $content); - if ( $cut && !$encode_html ) - $encode_html = 2; - if ( 1== $encode_html ) { - $content = esc_html($content); - $cut = 0; - } elseif ( 0 == $encode_html ) { - $content = make_url_footnote($content); - } elseif ( 2 == $encode_html ) { - $content = strip_tags($content); - } - if ( $cut ) { - $blah = explode(' ', $content); - if ( count($blah) > $cut ) { - $k = $cut; - $use_dotdotdot = 1; - } else { - $k = count($blah); - $use_dotdotdot = 0; - } - - /** @todo Check performance, might be faster to use array slice instead. */ - for ( $i=0; $i<$k; $i++ ) - $excerpt .= $blah[$i].' '; - $excerpt .= ($use_dotdotdot) ? '...' : ''; - $content = $excerpt; - } - $content = str_replace(']]>', ']]>', $content); - echo $content; -} - -/** - * Strip HTML and put links at the bottom of stripped content. - * - * Searches for all of the links, strips them out of the content, and places - * them at the bottom of the content with numbers. - * - * @since 0.71 - * @deprecated 2.9.0 - * - * @param string $content Content to get links - * @return string HTML stripped out of content with links at the bottom. - */ -function make_url_footnote( $content ) { - _deprecated_function( __FUNCTION__, '2.9.0', '' ); - preg_match_all( '/(.+?)<\/a>/', $content, $matches ); - $links_summary = "\n"; - for ( $i = 0, $c = count( $matches[0] ); $i < $c; $i++ ) { - $link_match = $matches[0][$i]; - $link_number = '['.($i+1).']'; - $link_url = $matches[2][$i]; - $link_text = $matches[4][$i]; - $content = str_replace( $link_match, $link_text . ' ' . $link_number, $content ); - $link_url = ( ( strtolower( substr( $link_url, 0, 7 ) ) != 'http://' ) && ( strtolower( substr( $link_url, 0, 8 ) ) != 'https://' ) ) ? get_option( 'home' ) . $link_url : $link_url; - $links_summary .= "\n" . $link_number . ' ' . $link_url; - } - $content = strip_tags( $content ); - $content .= $links_summary; - return $content; -} - -/** - * Retrieve translated string with vertical bar context - * - * Quite a few times, there will be collisions with similar translatable text - * found in more than two places but with different translated context. - * - * In order to use the separate contexts, the _c() function is used and the - * translatable string uses a pipe ('|') which has the context the string is in. - * - * When the translated string is returned, it is everything before the pipe, not - * including the pipe character. If there is no pipe in the translated text then - * everything is returned. - * - * @since 2.2.0 - * @deprecated 2.9.0 Use _x() - * @see _x() - * - * @param string $text Text to translate - * @param string $domain Optional. Domain to retrieve the translated text - * @return string Translated context string without pipe - */ -function _c( $text, $domain = 'default' ) { - _deprecated_function( __FUNCTION__, '2.9.0', '_x()' ); - return before_last_bar( translate( $text, $domain ) ); -} - -/** - * Translates $text like translate(), but assumes that the text - * contains a context after its last vertical bar. - * - * @since 2.5.0 - * @deprecated 3.0.0 Use _x() - * @see _x() - * - * @param string $text Text to translate - * @param string $domain Domain to retrieve the translated text - * @return string Translated text - */ -function translate_with_context( $text, $domain = 'default' ) { - _deprecated_function( __FUNCTION__, '2.9.0', '_x()' ); - return before_last_bar( translate( $text, $domain ) ); -} - -/** - * Legacy version of _n(), which supports contexts. - * - * Strips everything from the translation after the last bar. - * - * @since 2.7.0 - * @deprecated 3.0.0 Use _nx() - * @see _nx() - * - * @param string $single The text to be used if the number is singular. - * @param string $plural The text to be used if the number is plural. - * @param int $number The number to compare against to use either the singular or plural form. - * @param string $domain Optional. Text domain. Unique identifier for retrieving translated strings. - * Default 'default'. - * @return string The translated singular or plural form. - */ -function _nc( $single, $plural, $number, $domain = 'default' ) { - _deprecated_function( __FUNCTION__, '2.9.0', '_nx()' ); - return before_last_bar( _n( $single, $plural, $number, $domain ) ); -} - -/** - * Retrieve the plural or single form based on the amount. - * - * @since 1.2.0 - * @deprecated 2.8.0 Use _n() - * @see _n() - */ -function __ngettext() { - _deprecated_function( __FUNCTION__, '2.8.0', '_n()' ); - $args = func_get_args(); - return call_user_func_array('_n', $args); -} - -/** - * Register plural strings in POT file, but don't translate them. - * - * @since 2.5.0 - * @deprecated 2.8.0 Use _n_noop() - * @see _n_noop() - */ -function __ngettext_noop() { - _deprecated_function( __FUNCTION__, '2.8.0', '_n_noop()' ); - $args = func_get_args(); - return call_user_func_array('_n_noop', $args); - -} - -/** - * Retrieve all autoload options, or all options if no autoloaded ones exist. - * - * @since 1.0.0 - * @deprecated 3.0.0 Use wp_load_alloptions()) - * @see wp_load_alloptions() - * - * @return array List of all options. - */ -function get_alloptions() { - _deprecated_function( __FUNCTION__, '3.0.0', 'wp_load_alloptions()' ); - return wp_load_alloptions(); -} - -/** - * Retrieve HTML content of attachment image with link. - * - * @since 2.0.0 - * @deprecated 2.5.0 Use wp_get_attachment_link() - * @see wp_get_attachment_link() - * - * @param int $id Optional. Post ID. - * @param bool $fullsize Optional, default is false. Whether to use full size image. - * @param array $max_dims Optional. Max image dimensions. - * @param bool $permalink Optional, default is false. Whether to include permalink to image. - * @return string - */ -function get_the_attachment_link($id = 0, $fullsize = false, $max_dims = false, $permalink = false) { - _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_link()' ); - $id = (int) $id; - $_post = get_post($id); - - if ( ('attachment' != $_post->post_type) || !$url = wp_get_attachment_url($_post->ID) ) - return __('Missing Attachment'); - - if ( $permalink ) - $url = get_attachment_link($_post->ID); - - $post_title = esc_attr($_post->post_title); - - $innerHTML = get_attachment_innerHTML($_post->ID, $fullsize, $max_dims); - return "$innerHTML"; -} - -/** - * Retrieve icon URL and Path. - * - * @since 2.1.0 - * @deprecated 2.5.0 Use wp_get_attachment_image_src() - * @see wp_get_attachment_image_src() - * - * @param int $id Optional. Post ID. - * @param bool $fullsize Optional, default to false. Whether to have full image. - * @return array Icon URL and full path to file, respectively. - */ -function get_attachment_icon_src( $id = 0, $fullsize = false ) { - _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image_src()' ); - $id = (int) $id; - if ( !$post = get_post($id) ) - return false; - - $file = get_attached_file( $post->ID ); - - if ( !$fullsize && $src = wp_get_attachment_thumb_url( $post->ID ) ) { - // We have a thumbnail desired, specified and existing - - $src_file = basename($src); - } elseif ( wp_attachment_is_image( $post->ID ) ) { - // We have an image without a thumbnail - - $src = wp_get_attachment_url( $post->ID ); - $src_file = & $file; - } elseif ( $src = wp_mime_type_icon( $post->ID ) ) { - // No thumb, no image. We'll look for a mime-related icon instead. - - $icon_dir = apply_filters( 'icon_dir', get_template_directory() . '/images' ); - $src_file = $icon_dir . '/' . basename($src); - } - - if ( !isset($src) || !$src ) - return false; - - return array($src, $src_file); -} - -/** - * Retrieve HTML content of icon attachment image element. - * - * @since 2.0.0 - * @deprecated 2.5.0 Use wp_get_attachment_image() - * @see wp_get_attachment_image() - * - * @param int $id Optional. Post ID. - * @param bool $fullsize Optional, default to false. Whether to have full size image. - * @param array $max_dims Optional. Dimensions of image. - * @return false|string HTML content. - */ -function get_attachment_icon( $id = 0, $fullsize = false, $max_dims = false ) { - _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image()' ); - $id = (int) $id; - if ( !$post = get_post($id) ) - return false; - - if ( !$src = get_attachment_icon_src( $post->ID, $fullsize ) ) - return false; - - list($src, $src_file) = $src; - - // Do we need to constrain the image? - if ( ($max_dims = apply_filters('attachment_max_dims', $max_dims)) && file_exists($src_file) ) { - - $imagesize = getimagesize($src_file); - - if (($imagesize[0] > $max_dims[0]) || $imagesize[1] > $max_dims[1] ) { - $actual_aspect = $imagesize[0] / $imagesize[1]; - $desired_aspect = $max_dims[0] / $max_dims[1]; - - if ( $actual_aspect >= $desired_aspect ) { - $height = $actual_aspect * $max_dims[0]; - $constraint = "width='{$max_dims[0]}' "; - $post->iconsize = array($max_dims[0], $height); - } else { - $width = $max_dims[1] / $actual_aspect; - $constraint = "height='{$max_dims[1]}' "; - $post->iconsize = array($width, $max_dims[1]); - } - } else { - $post->iconsize = array($imagesize[0], $imagesize[1]); - $constraint = ''; - } - } else { - $constraint = ''; - } - - $post_title = esc_attr($post->post_title); - - $icon = "$post_title"; - - return apply_filters( 'attachment_icon', $icon, $post->ID ); -} - -/** - * Retrieve HTML content of image element. - * - * @since 2.0.0 - * @deprecated 2.5.0 Use wp_get_attachment_image() - * @see wp_get_attachment_image() - * - * @param int $id Optional. Post ID. - * @param bool $fullsize Optional, default to false. Whether to have full size image. - * @param array $max_dims Optional. Dimensions of image. - * @return false|string - */ -function get_attachment_innerHTML($id = 0, $fullsize = false, $max_dims = false) { - _deprecated_function( __FUNCTION__, '2.5.0', 'wp_get_attachment_image()' ); - $id = (int) $id; - if ( !$post = get_post($id) ) - return false; - - if ( $innerHTML = get_attachment_icon($post->ID, $fullsize, $max_dims)) - return $innerHTML; - - $innerHTML = esc_attr($post->post_title); - - return apply_filters('attachment_innerHTML', $innerHTML, $post->ID); -} - -/** - * Retrieves bookmark data based on ID. - * - * @since 2.0.0 - * @deprecated 2.1.0 Use get_bookmark() - * @see get_bookmark() - * - * @param int $bookmark_id ID of link - * @param string $output Optional. Type of output. Accepts OBJECT, ARRAY_N, or ARRAY_A. - * Default OBJECT. - * @param string $filter Optional. How to filter the link for output. Accepts 'raw', 'edit', - * 'attribute', 'js', 'db', or 'display'. Default 'raw'. - * @return object|array Bookmark object or array, depending on the type specified by `$output`. - */ -function get_link( $bookmark_id, $output = OBJECT, $filter = 'raw' ) { - _deprecated_function( __FUNCTION__, '2.1.0', 'get_bookmark()' ); - return get_bookmark($bookmark_id, $output, $filter); -} - -/** - * Performs esc_url() for database or redirect usage. - * - * @since 2.3.1 - * @deprecated 2.8.0 Use esc_url_raw() - * @see esc_url_raw() - * - * @param string $url The URL to be cleaned. - * @param array $protocols An array of acceptable protocols. - * @return string The cleaned URL. - */ -function sanitize_url( $url, $protocols = null ) { - _deprecated_function( __FUNCTION__, '2.8.0', 'esc_url_raw()' ); - return esc_url_raw( $url, $protocols ); -} - -/** - * Checks and cleans a URL. - * - * A number of characters are removed from the URL. If the URL is for displaying - * (the default behaviour) ampersands are also replaced. The 'clean_url' filter - * is applied to the returned cleaned URL. - * - * @since 1.2.0 - * @deprecated 3.0.0 Use esc_url() - * @see esc_url() - * - * @param string $url The URL to be cleaned. - * @param array $protocols Optional. An array of acceptable protocols. - * @param string $context Optional. How the URL will be used. Default is 'display'. - * @return string The cleaned $url after the {@see 'clean_url'} filter is applied. - */ -function clean_url( $url, $protocols = null, $context = 'display' ) { - if ( $context == 'db' ) - _deprecated_function( 'clean_url( $context = \'db\' )', '3.0.0', 'esc_url_raw()' ); - else - _deprecated_function( __FUNCTION__, '3.0.0', 'esc_url()' ); - return esc_url( $url, $protocols, $context ); -} - -/** - * Escape single quotes, specialchar double quotes, and fix line endings. - * - * The filter {@see 'js_escape'} is also applied by esc_js(). - * - * @since 2.0.4 - * @deprecated 2.8.0 Use esc_js() - * @see esc_js() - * - * @param string $text The text to be escaped. - * @return string Escaped text. - */ -function js_escape( $text ) { - _deprecated_function( __FUNCTION__, '2.8.0', 'esc_js()' ); - return esc_js( $text ); -} - -/** - * Legacy escaping for HTML blocks. - * - * @deprecated 2.8.0 Use esc_html() - * @see esc_html() - * - * @param string $string String to escape. - * @param string $quote_style Unused. - * @param false|string $charset Unused. - * @param false $double_encode Whether to double encode. Unused. - * @return string Escaped `$string`. - */ -function wp_specialchars( $string, $quote_style = ENT_NOQUOTES, $charset = false, $double_encode = false ) { - _deprecated_function( __FUNCTION__, '2.8.0', 'esc_html()' ); - if ( func_num_args() > 1 ) { // Maintain back-compat for people passing additional arguments. - $args = func_get_args(); - return call_user_func_array( '_wp_specialchars', $args ); - } else { - return esc_html( $string ); - } -} - -/** - * Escaping for HTML attributes. - * - * @since 2.0.6 - * @deprecated 2.8.0 Use esc_attr() - * @see esc_attr() - * - * @param string $text - * @return string - */ -function attribute_escape( $text ) { - _deprecated_function( __FUNCTION__, '2.8.0', 'esc_attr()' ); - return esc_attr( $text ); -} - -/** - * Register widget for sidebar with backward compatibility. - * - * Allows $name to be an array that accepts either three elements to grab the - * first element and the third for the name or just uses the first element of - * the array for the name. - * - * Passes to wp_register_sidebar_widget() after argument list and backward - * compatibility is complete. - * - * @since 2.2.0 - * @deprecated 2.8.0 Use wp_register_sidebar_widget() - * @see wp_register_sidebar_widget() - * - * @param string|int $name Widget ID. - * @param callable $output_callback Run when widget is called. - * @param string $classname Optional. Classname widget option. Default empty. - * @param mixed $params ,... Widget parameters. - */ -function register_sidebar_widget($name, $output_callback, $classname = '') { - _deprecated_function( __FUNCTION__, '2.8.0', 'wp_register_sidebar_widget()' ); - // Compat - if ( is_array($name) ) { - if ( count($name) == 3 ) - $name = sprintf($name[0], $name[2]); - else - $name = $name[0]; - } - - $id = sanitize_title($name); - $options = array(); - if ( !empty($classname) && is_string($classname) ) - $options['classname'] = $classname; - $params = array_slice(func_get_args(), 2); - $args = array($id, $name, $output_callback, $options); - if ( !empty($params) ) - $args = array_merge($args, $params); - - call_user_func_array('wp_register_sidebar_widget', $args); -} - -/** - * Serves as an alias of wp_unregister_sidebar_widget(). - * - * @since 2.2.0 - * @deprecated 2.8.0 Use wp_unregister_sidebar_widget() - * @see wp_unregister_sidebar_widget() - * - * @param int|string $id Widget ID. - */ -function unregister_sidebar_widget($id) { - _deprecated_function( __FUNCTION__, '2.8.0', 'wp_unregister_sidebar_widget()' ); - return wp_unregister_sidebar_widget($id); -} - -/** - * Registers widget control callback for customizing options. - * - * Allows $name to be an array that accepts either three elements to grab the - * first element and the third for the name or just uses the first element of - * the array for the name. - * - * Passes to wp_register_widget_control() after the argument list has - * been compiled. - * - * @since 2.2.0 - * @deprecated 2.8.0 Use wp_register_widget_control() - * @see wp_register_widget_control() - * - * @param int|string $name Sidebar ID. - * @param callable $control_callback Widget control callback to display and process form. - * @param int $width Widget width. - * @param int $height Widget height. - */ -function register_widget_control($name, $control_callback, $width = '', $height = '') { - _deprecated_function( __FUNCTION__, '2.8.0', 'wp_register_widget_control()' ); - // Compat - if ( is_array($name) ) { - if ( count($name) == 3 ) - $name = sprintf($name[0], $name[2]); - else - $name = $name[0]; - } - - $id = sanitize_title($name); - $options = array(); - if ( !empty($width) ) - $options['width'] = $width; - if ( !empty($height) ) - $options['height'] = $height; - $params = array_slice(func_get_args(), 4); - $args = array($id, $name, $control_callback, $options); - if ( !empty($params) ) - $args = array_merge($args, $params); - - call_user_func_array('wp_register_widget_control', $args); -} - -/** - * Alias of wp_unregister_widget_control(). - * - * @since 2.2.0 - * @deprecated 2.8.0 Use wp_unregister_widget_control() - * @see wp_unregister_widget_control() - * - * @param int|string $id Widget ID. - */ -function unregister_widget_control($id) { - _deprecated_function( __FUNCTION__, '2.8.0', 'wp_unregister_widget_control()' ); - return wp_unregister_widget_control($id); -} - -/** - * Remove user meta data. - * - * @since 2.0.0 - * @deprecated 3.0.0 Use delete_user_meta() - * @see delete_user_meta() - * - * @param int $user_id User ID. - * @param string $meta_key Metadata key. - * @param mixed $meta_value Metadata value. - * @return bool True deletion completed and false if user_id is not a number. - */ -function delete_usermeta( $user_id, $meta_key, $meta_value = '' ) { - _deprecated_function( __FUNCTION__, '3.0.0', 'delete_user_meta()' ); - global $wpdb; - if ( !is_numeric( $user_id ) ) - return false; - $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key); - - if ( is_array($meta_value) || is_object($meta_value) ) - $meta_value = serialize($meta_value); - $meta_value = trim( $meta_value ); - - $cur = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) ); - - if ( $cur && $cur->umeta_id ) - do_action( 'delete_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value ); - - if ( ! empty($meta_value) ) - $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s AND meta_value = %s", $user_id, $meta_key, $meta_value) ); - else - $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) ); - - clean_user_cache( $user_id ); - wp_cache_delete( $user_id, 'user_meta' ); - - if ( $cur && $cur->umeta_id ) - do_action( 'deleted_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value ); - - return true; -} - -/** - * Retrieve user metadata. - * - * If $user_id is not a number, then the function will fail over with a 'false' - * boolean return value. Other returned values depend on whether there is only - * one item to be returned, which be that single item type. If there is more - * than one metadata value, then it will be list of metadata values. - * - * @since 2.0.0 - * @deprecated 3.0.0 Use get_user_meta() - * @see get_user_meta() - * - * @param int $user_id User ID - * @param string $meta_key Optional. Metadata key. - * @return mixed - */ -function get_usermeta( $user_id, $meta_key = '' ) { - _deprecated_function( __FUNCTION__, '3.0.0', 'get_user_meta()' ); - global $wpdb; - $user_id = (int) $user_id; - - if ( !$user_id ) - return false; - - if ( !empty($meta_key) ) { - $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key); - $user = wp_cache_get($user_id, 'users'); - // Check the cached user object - if ( false !== $user && isset($user->$meta_key) ) - $metas = array($user->$meta_key); - else - $metas = $wpdb->get_col( $wpdb->prepare("SELECT meta_value FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) ); - } else { - $metas = $wpdb->get_col( $wpdb->prepare("SELECT meta_value FROM $wpdb->usermeta WHERE user_id = %d", $user_id) ); - } - - if ( empty($metas) ) { - if ( empty($meta_key) ) - return array(); - else - return ''; - } - - $metas = array_map('maybe_unserialize', $metas); - - if ( count($metas) == 1 ) - return $metas[0]; - else - return $metas; -} - -/** - * Update metadata of user. - * - * There is no need to serialize values, they will be serialized if it is - * needed. The metadata key can only be a string with underscores. All else will - * be removed. - * - * Will remove the metadata, if the meta value is empty. - * - * @since 2.0.0 - * @deprecated 3.0.0 Use update_user_meta() - * @see update_user_meta() - * - * @param int $user_id User ID - * @param string $meta_key Metadata key. - * @param mixed $meta_value Metadata value. - * @return bool True on successful update, false on failure. - */ -function update_usermeta( $user_id, $meta_key, $meta_value ) { - _deprecated_function( __FUNCTION__, '3.0.0', 'update_user_meta()' ); - global $wpdb; - if ( !is_numeric( $user_id ) ) - return false; - $meta_key = preg_replace('|[^a-z0-9_]|i', '', $meta_key); - - /** @todo Might need fix because usermeta data is assumed to be already escaped */ - if ( is_string($meta_value) ) - $meta_value = stripslashes($meta_value); - $meta_value = maybe_serialize($meta_value); - - if (empty($meta_value)) { - return delete_usermeta($user_id, $meta_key); - } - - $cur = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->usermeta WHERE user_id = %d AND meta_key = %s", $user_id, $meta_key) ); - - if ( $cur ) - do_action( 'update_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value ); - - if ( !$cur ) - $wpdb->insert($wpdb->usermeta, compact('user_id', 'meta_key', 'meta_value') ); - elseif ( $cur->meta_value != $meta_value ) - $wpdb->update($wpdb->usermeta, compact('meta_value'), compact('user_id', 'meta_key') ); - else - return false; - - clean_user_cache( $user_id ); - wp_cache_delete( $user_id, 'user_meta' ); - - if ( !$cur ) - do_action( 'added_usermeta', $wpdb->insert_id, $user_id, $meta_key, $meta_value ); - else - do_action( 'updated_usermeta', $cur->umeta_id, $user_id, $meta_key, $meta_value ); - - return true; -} - -/** - * Get users for the site. - * - * For setups that use the multisite feature. Can be used outside of the - * multisite feature. - * - * @since 2.2.0 - * @deprecated 3.1.0 Use get_users() - * @see get_users() - * - * @global wpdb $wpdb WordPress database abstraction object. - * - * @param int $id Site ID. - * @return array List of users that are part of that site ID - */ -function get_users_of_blog( $id = '' ) { - _deprecated_function( __FUNCTION__, '3.1.0', 'get_users()' ); - - global $wpdb; - if ( empty( $id ) ) { - $id = get_current_blog_id(); - } - $blog_prefix = $wpdb->get_blog_prefix($id); - $users = $wpdb->get_results( "SELECT user_id, user_id AS ID, user_login, display_name, user_email, meta_value FROM $wpdb->users, $wpdb->usermeta WHERE {$wpdb->users}.ID = {$wpdb->usermeta}.user_id AND meta_key = '{$blog_prefix}capabilities' ORDER BY {$wpdb->usermeta}.user_id" ); - return $users; -} - -/** - * Enable/disable automatic general feed link outputting. - * - * @since 2.8.0 - * @deprecated 3.0.0 Use add_theme_support() - * @see add_theme_support() - * - * @param bool $add Optional, default is true. Add or remove links. Defaults to true. - */ -function automatic_feed_links( $add = true ) { - _deprecated_function( __FUNCTION__, '3.0.0', "add_theme_support( 'automatic-feed-links' )" ); - - if ( $add ) - add_theme_support( 'automatic-feed-links' ); - else - remove_action( 'wp_head', 'feed_links_extra', 3 ); // Just do this yourself in 3.0+ -} - -/** - * Retrieve user data based on field. - * - * @since 1.5.0 - * @deprecated 3.0.0 Use get_the_author_meta() - * @see get_the_author_meta() - * - * @param string $field User meta field. - * @param false|int $user Optional. User ID to retrieve the field for. Default false (current user). - * @return string The author's field from the current author's DB object. - */ -function get_profile( $field, $user = false ) { - _deprecated_function( __FUNCTION__, '3.0.0', 'get_the_author_meta()' ); - if ( $user ) { - $user = get_user_by( 'login', $user ); - $user = $user->ID; - } - return get_the_author_meta( $field, $user ); -} - -/** - * Retrieves the number of posts a user has written. - * - * @since 0.71 - * @deprecated 3.0.0 Use count_user_posts() - * @see count_user_posts() - * - * @param int $userid User to count posts for. - * @return int Number of posts the given user has written. - */ -function get_usernumposts( $userid ) { - _deprecated_function( __FUNCTION__, '3.0.0', 'count_user_posts()' ); - return count_user_posts( $userid ); -} - -/** - * Callback used to change %uXXXX to &#YYY; syntax - * - * @since 2.8.0 - * @access private - * @deprecated 3.0.0 - * - * @param array $matches Single Match - * @return string An HTML entity - */ -function funky_javascript_callback($matches) { - return "&#".base_convert($matches[1],16,10).";"; -} - -/** - * Fixes JavaScript bugs in browsers. - * - * Converts unicode characters to HTML numbered entities. - * - * @since 1.5.0 - * @deprecated 3.0.0 - * - * @global $is_macIE - * @global $is_winIE - * - * @param string $text Text to be made safe. - * @return string Fixed text. - */ -function funky_javascript_fix($text) { - _deprecated_function( __FUNCTION__, '3.0.0' ); - // Fixes for browsers' JavaScript bugs. - global $is_macIE, $is_winIE; - - if ( $is_winIE || $is_macIE ) - $text = preg_replace_callback("/\%u([0-9A-F]{4,4})/", - "funky_javascript_callback", - $text); - - return $text; -} - -/** - * Checks that the taxonomy name exists. - * - * @since 2.3.0 - * @deprecated 3.0.0 Use taxonomy_exists() - * @see taxonomy_exists() - * - * @param string $taxonomy Name of taxonomy object - * @return bool Whether the taxonomy exists. - */ -function is_taxonomy( $taxonomy ) { - _deprecated_function( __FUNCTION__, '3.0.0', 'taxonomy_exists()' ); - return taxonomy_exists( $taxonomy ); -} - -/** - * Check if Term exists. - * - * @since 2.3.0 - * @deprecated 3.0.0 Use term_exists() - * @see term_exists() - * - * @param int|string $term The term to check - * @param string $taxonomy The taxonomy name to use - * @param int $parent ID of parent term under which to confine the exists search. - * @return mixed Get the term id or Term Object, if exists. - */ -function is_term( $term, $taxonomy = '', $parent = 0 ) { - _deprecated_function( __FUNCTION__, '3.0.0', 'term_exists()' ); - return term_exists( $term, $taxonomy, $parent ); -} - -/** - * Is the current admin page generated by a plugin? - * - * Use global $plugin_page and/or get_plugin_page_hookname() hooks. - * - * @since 1.5.0 - * @deprecated 3.1.0 - * - * @global $plugin_page - * - * @return bool - */ -function is_plugin_page() { - _deprecated_function( __FUNCTION__, '3.1.0' ); - - global $plugin_page; - - if ( isset($plugin_page) ) - return true; - - return false; -} - -/** - * Update the categories cache. - * - * This function does not appear to be used anymore or does not appear to be - * needed. It might be a legacy function left over from when there was a need - * for updating the category cache. - * - * @since 1.5.0 - * @deprecated 3.1.0 - * - * @return bool Always return True - */ -function update_category_cache() { - _deprecated_function( __FUNCTION__, '3.1.0' ); - - return true; -} - -/** - * Check for PHP timezone support - * - * @since 2.9.0 - * @deprecated 3.2.0 - * - * @return bool - */ -function wp_timezone_supported() { - _deprecated_function( __FUNCTION__, '3.2.0' ); - - return true; -} - -/** - * Displays an editor: TinyMCE, HTML, or both. - * - * @since 2.1.0 - * @deprecated 3.3.0 Use wp_editor() - * @see wp_editor() - * - * @param string $content Textarea content. - * @param string $id Optional. HTML ID attribute value. Default 'content'. - * @param string $prev_id Optional. Unused. - * @param bool $media_buttons Optional. Whether to display media buttons. Default true. - * @param int $tab_index Optional. Unused. - * @param bool $extended Optional. Unused. - */ -function the_editor($content, $id = 'content', $prev_id = 'title', $media_buttons = true, $tab_index = 2, $extended = true) { - _deprecated_function( __FUNCTION__, '3.3.0', 'wp_editor()' ); - - wp_editor( $content, $id, array( 'media_buttons' => $media_buttons ) ); -} - -/** - * Perform the query to get the $metavalues array(s) needed by _fill_user and _fill_many_users - * - * @since 3.0.0 - * @deprecated 3.3.0 - * - * @param array $ids User ID numbers list. - * @return array of arrays. The array is indexed by user_id, containing $metavalues object arrays. - */ -function get_user_metavalues($ids) { - _deprecated_function( __FUNCTION__, '3.3.0' ); - - $objects = array(); - - $ids = array_map('intval', $ids); - foreach ( $ids as $id ) - $objects[$id] = array(); - - $metas = update_meta_cache('user', $ids); - - foreach ( $metas as $id => $meta ) { - foreach ( $meta as $key => $metavalues ) { - foreach ( $metavalues as $value ) { - $objects[$id][] = (object)array( 'user_id' => $id, 'meta_key' => $key, 'meta_value' => $value); - } - } - } - - return $objects; -} - -/** - * Sanitize every user field. - * - * If the context is 'raw', then the user object or array will get minimal santization of the int fields. - * - * @since 2.3.0 - * @deprecated 3.3.0 - * - * @param object|array $user The User Object or Array - * @param string $context Optional, default is 'display'. How to sanitize user fields. - * @return object|array The now sanitized User Object or Array (will be the same type as $user) - */ -function sanitize_user_object($user, $context = 'display') { - _deprecated_function( __FUNCTION__, '3.3.0' ); - - if ( is_object($user) ) { - if ( !isset($user->ID) ) - $user->ID = 0; - if ( ! ( $user instanceof WP_User ) ) { - $vars = get_object_vars($user); - foreach ( array_keys($vars) as $field ) { - if ( is_string($user->$field) || is_numeric($user->$field) ) - $user->$field = sanitize_user_field($field, $user->$field, $user->ID, $context); - } - } - $user->filter = $context; - } else { - if ( !isset($user['ID']) ) - $user['ID'] = 0; - foreach ( array_keys($user) as $field ) - $user[$field] = sanitize_user_field($field, $user[$field], $user['ID'], $context); - $user['filter'] = $context; - } - - return $user; -} - -/** - * Get boundary post relational link. - * - * Can either be start or end post relational link. - * - * @since 2.8.0 - * @deprecated 3.3.0 - * - * @param string $title Optional. Link title format. - * @param bool $in_same_cat Optional. Whether link should be in a same category. - * @param string $excluded_categories Optional. Excluded categories IDs. - * @param bool $start Optional, default is true. Whether to display link to first or last post. - * @return string - */ -function get_boundary_post_rel_link($title = '%title', $in_same_cat = false, $excluded_categories = '', $start = true) { - _deprecated_function( __FUNCTION__, '3.3.0' ); - - $posts = get_boundary_post($in_same_cat, $excluded_categories, $start); - // If there is no post stop. - if ( empty($posts) ) - return; - - // Even though we limited get_posts to return only 1 item it still returns an array of objects. - $post = $posts[0]; - - if ( empty($post->post_title) ) - $post->post_title = $start ? __('First Post') : __('Last Post'); - - $date = mysql2date(get_option('date_format'), $post->post_date); - - $title = str_replace('%title', $post->post_title, $title); - $title = str_replace('%date', $date, $title); - $title = apply_filters('the_title', $title, $post->ID); - - $link = $start ? "\n"; - - $boundary = $start ? 'start' : 'end'; - return apply_filters( "{$boundary}_post_rel_link", $link ); -} - -/** - * Display relational link for the first post. - * - * @since 2.8.0 - * @deprecated 3.3.0 - * - * @param string $title Optional. Link title format. - * @param bool $in_same_cat Optional. Whether link should be in a same category. - * @param string $excluded_categories Optional. Excluded categories IDs. - */ -function start_post_rel_link($title = '%title', $in_same_cat = false, $excluded_categories = '') { - _deprecated_function( __FUNCTION__, '3.3.0' ); - - echo get_boundary_post_rel_link($title, $in_same_cat, $excluded_categories, true); -} - -/** - * Get site index relational link. - * - * @since 2.8.0 - * @deprecated 3.3.0 - * - * @return string - */ -function get_index_rel_link() { - _deprecated_function( __FUNCTION__, '3.3.0' ); - - $link = "\n"; - return apply_filters( "index_rel_link", $link ); -} - -/** - * Display relational link for the site index. - * - * @since 2.8.0 - * @deprecated 3.3.0 - */ -function index_rel_link() { - _deprecated_function( __FUNCTION__, '3.3.0' ); - - echo get_index_rel_link(); -} - -/** - * Get parent post relational link. - * - * @since 2.8.0 - * @deprecated 3.3.0 - * - * @param string $title Optional. Link title format. Default '%title'. - * @return string - */ -function get_parent_post_rel_link( $title = '%title' ) { - _deprecated_function( __FUNCTION__, '3.3.0' ); - - if ( ! empty( $GLOBALS['post'] ) && ! empty( $GLOBALS['post']->post_parent ) ) - $post = get_post($GLOBALS['post']->post_parent); - - if ( empty($post) ) - return; - - $date = mysql2date(get_option('date_format'), $post->post_date); - - $title = str_replace('%title', $post->post_title, $title); - $title = str_replace('%date', $date, $title); - $title = apply_filters('the_title', $title, $post->ID); - - $link = "\n"; - - return apply_filters( "parent_post_rel_link", $link ); -} - -/** - * Display relational link for parent item - * - * @since 2.8.0 - * @deprecated 3.3.0 - * - * @param string $title Optional. Link title format. Default '%title'. - */ -function parent_post_rel_link( $title = '%title' ) { - _deprecated_function( __FUNCTION__, '3.3.0' ); - - echo get_parent_post_rel_link($title); -} - -/** - * Add the "Dashboard"/"Visit Site" menu. - * - * @since 3.2.0 - * @deprecated 3.3.0 - * - * @param WP_Admin_Bar $wp_admin_bar WP_Admin_Bar instance. - */ -function wp_admin_bar_dashboard_view_site_menu( $wp_admin_bar ) { - _deprecated_function( __FUNCTION__, '3.3.0' ); - - $user_id = get_current_user_id(); - - if ( 0 != $user_id ) { - if ( is_admin() ) - $wp_admin_bar->add_menu( array( 'id' => 'view-site', 'title' => __( 'Visit Site' ), 'href' => home_url() ) ); - elseif ( is_multisite() ) - $wp_admin_bar->add_menu( array( 'id' => 'dashboard', 'title' => __( 'Dashboard' ), 'href' => get_dashboard_url( $user_id ) ) ); - else - $wp_admin_bar->add_menu( array( 'id' => 'dashboard', 'title' => __( 'Dashboard' ), 'href' => admin_url() ) ); - } -} - -/** - * Checks if the current user belong to a given site. - * - * @since MU - * @deprecated 3.3.0 Use is_user_member_of_blog() - * @see is_user_member_of_blog() - * - * @param int $blog_id Site ID - * @return bool True if the current users belong to $blog_id, false if not. - */ -function is_blog_user( $blog_id = 0 ) { - _deprecated_function( __FUNCTION__, '3.3.0', 'is_user_member_of_blog()' ); - - return is_user_member_of_blog( get_current_user_id(), $blog_id ); -} - -/** - * Open the file handle for debugging. - * - * @since 0.71 - * @deprecated 3.4.0 Use error_log() - * @see error_log() - * - * @link https://secure.php.net/manual/en/function.error-log.php - * - * @param string $filename File name. - * @param string $mode Type of access you required to the stream. - * @return false Always false. - */ -function debug_fopen( $filename, $mode ) { - _deprecated_function( __FUNCTION__, 'error_log()' ); - return false; -} - -/** - * Write contents to the file used for debugging. - * - * @since 0.71 - * @deprecated 3.4.0 Use error_log() - * @see error_log() - * - * @link https://secure.php.net/manual/en/function.error-log.php - * - * @param mixed $fp Unused. - * @param string $string Message to log. - */ -function debug_fwrite( $fp, $string ) { - _deprecated_function( __FUNCTION__, 'error_log()' ); - if ( ! empty( $GLOBALS['debug'] ) ) - error_log( $string ); -} - -/** - * Close the debugging file handle. - * - * @since 0.71 - * @deprecated 3.4.0 Use error_log() - * @see error_log() - * - * @link https://secure.php.net/manual/en/function.error-log.php - * - * @param mixed $fp Unused. - */ -function debug_fclose( $fp ) { - _deprecated_function( __FUNCTION__, 'error_log()' ); -} - -/** - * Retrieve list of themes with theme data in theme directory. - * - * The theme is broken, if it doesn't have a parent theme and is missing either - * style.css and, or index.php. If the theme has a parent theme then it is - * broken, if it is missing style.css; index.php is optional. - * - * @since 1.5.0 - * @deprecated 3.4.0 Use wp_get_themes() - * @see wp_get_themes() - * - * @return array Theme list with theme data. - */ -function get_themes() { - _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_themes()' ); - - global $wp_themes; - if ( isset( $wp_themes ) ) - return $wp_themes; - - $themes = wp_get_themes(); - $wp_themes = array(); - - foreach ( $themes as $theme ) { - $name = $theme->get('Name'); - if ( isset( $wp_themes[ $name ] ) ) - $wp_themes[ $name . '/' . $theme->get_stylesheet() ] = $theme; - else - $wp_themes[ $name ] = $theme; - } - - return $wp_themes; -} - -/** - * Retrieve theme data. - * - * @since 1.5.0 - * @deprecated 3.4.0 Use wp_get_theme() - * @see wp_get_theme() - * - * @param string $theme Theme name. - * @return array|null Null, if theme name does not exist. Theme data, if exists. - */ -function get_theme( $theme ) { - _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme( $stylesheet )' ); - - $themes = get_themes(); - if ( is_array( $themes ) && array_key_exists( $theme, $themes ) ) - return $themes[ $theme ]; - return null; -} - -/** - * Retrieve current theme name. - * - * @since 1.5.0 - * @deprecated 3.4.0 Use wp_get_theme() - * @see wp_get_theme() - * - * @return string - */ -function get_current_theme() { - _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme()' ); - - if ( $theme = get_option( 'current_theme' ) ) - return $theme; - - return wp_get_theme()->get('Name'); -} - -/** - * Accepts matches array from preg_replace_callback in wpautop() or a string. - * - * Ensures that the contents of a `
        ...
        ` HTML block are not - * converted into paragraphs or line-breaks. - * - * @since 1.2.0 - * @deprecated 3.4.0 - * - * @param array|string $matches The array or string - * @return string The pre block without paragraph/line-break conversion. - */ -function clean_pre($matches) { - _deprecated_function( __FUNCTION__, '3.4.0' ); - - if ( is_array($matches) ) - $text = $matches[1] . $matches[2] . "
      "; - else - $text = $matches; - - $text = str_replace(array('
      ', '
      ', '
      '), array('', '', ''), $text); - $text = str_replace('

      ', "\n", $text); - $text = str_replace('

      ', '', $text); - - return $text; -} - - -/** - * Add callbacks for image header display. - * - * @since 2.1.0 - * @deprecated 3.4.0 Use add_theme_support() - * @see add_theme_support() - * - * @param callable $wp_head_callback Call on the {@see 'wp_head'} action. - * @param callable $admin_head_callback Call on custom header administration screen. - * @param callable $admin_preview_callback Output a custom header image div on the custom header administration screen. Optional. - */ -function add_custom_image_header( $wp_head_callback, $admin_head_callback, $admin_preview_callback = '' ) { - _deprecated_function( __FUNCTION__, '3.4.0', 'add_theme_support( \'custom-header\', $args )' ); - $args = array( - 'wp-head-callback' => $wp_head_callback, - 'admin-head-callback' => $admin_head_callback, - ); - if ( $admin_preview_callback ) - $args['admin-preview-callback'] = $admin_preview_callback; - return add_theme_support( 'custom-header', $args ); -} - -/** - * Remove image header support. - * - * @since 3.1.0 - * @deprecated 3.4.0 Use remove_theme_support() - * @see remove_theme_support() - * - * @return null|bool Whether support was removed. - */ -function remove_custom_image_header() { - _deprecated_function( __FUNCTION__, '3.4.0', 'remove_theme_support( \'custom-header\' )' ); - return remove_theme_support( 'custom-header' ); -} - -/** - * Add callbacks for background image display. - * - * @since 3.0.0 - * @deprecated 3.4.0 Use add_theme_support() - * @see add_theme_support() - * - * @param callable $wp_head_callback Call on the {@see 'wp_head'} action. - * @param callable $admin_head_callback Call on custom background administration screen. - * @param callable $admin_preview_callback Output a custom background image div on the custom background administration screen. Optional. - */ -function add_custom_background( $wp_head_callback = '', $admin_head_callback = '', $admin_preview_callback = '' ) { - _deprecated_function( __FUNCTION__, '3.4.0', 'add_theme_support( \'custom-background\', $args )' ); - $args = array(); - if ( $wp_head_callback ) - $args['wp-head-callback'] = $wp_head_callback; - if ( $admin_head_callback ) - $args['admin-head-callback'] = $admin_head_callback; - if ( $admin_preview_callback ) - $args['admin-preview-callback'] = $admin_preview_callback; - return add_theme_support( 'custom-background', $args ); -} - -/** - * Remove custom background support. - * - * @since 3.1.0 - * @deprecated 3.4.0 Use add_custom_background() - * @see add_custom_background() - * - * @return null|bool Whether support was removed. - */ -function remove_custom_background() { - _deprecated_function( __FUNCTION__, '3.4.0', 'remove_theme_support( \'custom-background\' )' ); - return remove_theme_support( 'custom-background' ); -} - -/** - * Retrieve theme data from parsed theme file. - * - * @since 1.5.0 - * @deprecated 3.4.0 Use wp_get_theme() - * @see wp_get_theme() - * - * @param string $theme_file Theme file path. - * @return array Theme data. - */ -function get_theme_data( $theme_file ) { - _deprecated_function( __FUNCTION__, '3.4.0', 'wp_get_theme()' ); - $theme = new WP_Theme( basename( dirname( $theme_file ) ), dirname( dirname( $theme_file ) ) ); - - $theme_data = array( - 'Name' => $theme->get('Name'), - 'URI' => $theme->display('ThemeURI', true, false), - 'Description' => $theme->display('Description', true, false), - 'Author' => $theme->display('Author', true, false), - 'AuthorURI' => $theme->display('AuthorURI', true, false), - 'Version' => $theme->get('Version'), - 'Template' => $theme->get('Template'), - 'Status' => $theme->get('Status'), - 'Tags' => $theme->get('Tags'), - 'Title' => $theme->get('Name'), - 'AuthorName' => $theme->get('Author'), - ); - - foreach ( apply_filters( 'extra_theme_headers', array() ) as $extra_header ) { - if ( ! isset( $theme_data[ $extra_header ] ) ) - $theme_data[ $extra_header ] = $theme->get( $extra_header ); - } - - return $theme_data; -} - -/** - * Alias of update_post_cache(). - * - * @see update_post_cache() Posts and pages are the same, alias is intentional - * - * @since 1.5.1 - * @deprecated 3.4.0 Use update_post_cache() - * @see update_post_cache() - * - * @param array $pages list of page objects - */ -function update_page_cache( &$pages ) { - _deprecated_function( __FUNCTION__, '3.4.0', 'update_post_cache()' ); - - update_post_cache( $pages ); -} - -/** - * Will clean the page in the cache. - * - * Clean (read: delete) page from cache that matches $id. Will also clean cache - * associated with 'all_page_ids' and 'get_pages'. - * - * @since 2.0.0 - * @deprecated 3.4.0 Use clean_post_cache - * @see clean_post_cache() - * - * @param int $id Page ID to clean - */ -function clean_page_cache( $id ) { - _deprecated_function( __FUNCTION__, '3.4.0', 'clean_post_cache()' ); - - clean_post_cache( $id ); -} - -/** - * Retrieve nonce action "Are you sure" message. - * - * Deprecated in 3.4.1 and 3.5.0. Backported to 3.3.3. - * - * @since 2.0.4 - * @deprecated 3.4.1 Use wp_nonce_ays() - * @see wp_nonce_ays() - * - * @param string $action Nonce action. - * @return string Are you sure message. - */ -function wp_explain_nonce( $action ) { - _deprecated_function( __FUNCTION__, '3.4.1', 'wp_nonce_ays()' ); - return __( 'Are you sure you want to do this?' ); -} - -/** - * Display "sticky" CSS class, if a post is sticky. - * - * @since 2.7.0 - * @deprecated 3.5.0 Use post_class() - * @see post_class() - * - * @param int $post_id An optional post ID. - */ -function sticky_class( $post_id = null ) { - _deprecated_function( __FUNCTION__, '3.5.0', 'post_class()' ); - if ( is_sticky( $post_id ) ) - echo ' sticky'; -} - -/** - * Retrieve post ancestors. - * - * This is no longer needed as WP_Post lazy-loads the ancestors - * property with get_post_ancestors(). - * - * @since 2.3.4 - * @deprecated 3.5.0 Use get_post_ancestors() - * @see get_post_ancestors() - * - * @param WP_Post &$post Post object, passed by reference (unused). - */ -function _get_post_ancestors( &$post ) { - _deprecated_function( __FUNCTION__, '3.5.0' ); -} - -/** - * Load an image from a string, if PHP supports it. - * - * @since 2.1.0 - * @deprecated 3.5.0 Use wp_get_image_editor() - * @see wp_get_image_editor() - * - * @param string $file Filename of the image to load. - * @return resource The resulting image resource on success, Error string on failure. - */ -function wp_load_image( $file ) { - _deprecated_function( __FUNCTION__, '3.5.0', 'wp_get_image_editor()' ); - - if ( is_numeric( $file ) ) - $file = get_attached_file( $file ); - - if ( ! is_file( $file ) ) { - /* translators: %s: file name */ - return sprintf( __( 'File “%s” doesn’t exist?' ), $file ); - } - - if ( ! function_exists('imagecreatefromstring') ) - return __('The GD image library is not installed.'); - - // Set artificially high because GD uses uncompressed images in memory. - wp_raise_memory_limit( 'image' ); - - $image = imagecreatefromstring( file_get_contents( $file ) ); - - if ( ! is_resource( $image ) ) { - /* translators: %s: file name */ - return sprintf( __( 'File “%s” is not an image.' ), $file ); - } - - return $image; -} - -/** - * Scale down an image to fit a particular size and save a new copy of the image. - * - * The PNG transparency will be preserved using the function, as well as the - * image type. If the file going in is PNG, then the resized image is going to - * be PNG. The only supported image types are PNG, GIF, and JPEG. - * - * Some functionality requires API to exist, so some PHP version may lose out - * support. This is not the fault of WordPress (where functionality is - * downgraded, not actual defects), but of your PHP version. - * - * @since 2.5.0 - * @deprecated 3.5.0 Use wp_get_image_editor() - * @see wp_get_image_editor() - * - * @param string $file Image file path. - * @param int $max_w Maximum width to resize to. - * @param int $max_h Maximum height to resize to. - * @param bool $crop Optional. Whether to crop image or resize. - * @param string $suffix Optional. File suffix. - * @param string $dest_path Optional. New image file path. - * @param int $jpeg_quality Optional, default is 90. Image quality percentage. - * @return mixed WP_Error on failure. String with new destination path. - */ -function image_resize( $file, $max_w, $max_h, $crop = false, $suffix = null, $dest_path = null, $jpeg_quality = 90 ) { - _deprecated_function( __FUNCTION__, '3.5.0', 'wp_get_image_editor()' ); - - $editor = wp_get_image_editor( $file ); - if ( is_wp_error( $editor ) ) - return $editor; - $editor->set_quality( $jpeg_quality ); - - $resized = $editor->resize( $max_w, $max_h, $crop ); - if ( is_wp_error( $resized ) ) - return $resized; - - $dest_file = $editor->generate_filename( $suffix, $dest_path ); - $saved = $editor->save( $dest_file ); - - if ( is_wp_error( $saved ) ) - return $saved; - - return $dest_file; -} - -/** - * Retrieve a single post, based on post ID. - * - * Has categories in 'post_category' property or key. Has tags in 'tags_input' - * property or key. - * - * @since 1.0.0 - * @deprecated 3.5.0 Use get_post() - * @see get_post() - * - * @param int $postid Post ID. - * @param string $mode How to return result, either OBJECT, ARRAY_N, or ARRAY_A. - * @return WP_Post|null Post object or array holding post contents and information - */ -function wp_get_single_post( $postid = 0, $mode = OBJECT ) { - _deprecated_function( __FUNCTION__, '3.5.0', 'get_post()' ); - return get_post( $postid, $mode ); -} - -/** - * Check that the user login name and password is correct. - * - * @since 0.71 - * @deprecated 3.5.0 Use wp_authenticate() - * @see wp_authenticate() - * - * @param string $user_login User name. - * @param string $user_pass User password. - * @return bool False if does not authenticate, true if username and password authenticates. - */ -function user_pass_ok($user_login, $user_pass) { - _deprecated_function( __FUNCTION__, '3.5.0', 'wp_authenticate()' ); - $user = wp_authenticate( $user_login, $user_pass ); - if ( is_wp_error( $user ) ) - return false; - - return true; -} - -/** - * Callback formerly fired on the save_post hook. No longer needed. - * - * @since 2.3.0 - * @deprecated 3.5.0 - */ -function _save_post_hook() {} - -/** - * Check if the installed version of GD supports particular image type - * - * @since 2.9.0 - * @deprecated 3.5.0 Use wp_image_editor_supports() - * @see wp_image_editor_supports() - * - * @param string $mime_type - * @return bool - */ -function gd_edit_image_support($mime_type) { - _deprecated_function( __FUNCTION__, '3.5.0', 'wp_image_editor_supports()' ); - - if ( function_exists('imagetypes') ) { - switch( $mime_type ) { - case 'image/jpeg': - return (imagetypes() & IMG_JPG) != 0; - case 'image/png': - return (imagetypes() & IMG_PNG) != 0; - case 'image/gif': - return (imagetypes() & IMG_GIF) != 0; - } - } else { - switch( $mime_type ) { - case 'image/jpeg': - return function_exists('imagecreatefromjpeg'); - case 'image/png': - return function_exists('imagecreatefrompng'); - case 'image/gif': - return function_exists('imagecreatefromgif'); - } - } - return false; -} - -/** - * Converts an integer byte value to a shorthand byte value. - * - * @since 2.3.0 - * @deprecated 3.6.0 Use size_format() - * @see size_format() - * - * @param int $bytes An integer byte value. - * @return string A shorthand byte value. - */ -function wp_convert_bytes_to_hr( $bytes ) { - _deprecated_function( __FUNCTION__, '3.6.0', 'size_format()' ); - - $units = array( 0 => 'B', 1 => 'KB', 2 => 'MB', 3 => 'GB', 4 => 'TB' ); - $log = log( $bytes, KB_IN_BYTES ); - $power = (int) $log; - $size = pow( KB_IN_BYTES, $log - $power ); - - if ( ! is_nan( $size ) && array_key_exists( $power, $units ) ) { - $unit = $units[ $power ]; - } else { - $size = $bytes; - $unit = $units[0]; - } - - return $size . $unit; -} - -/** - * Formerly used internally to tidy up the search terms. - * - * @since 2.9.0 - * @access private - * @deprecated 3.7.0 - * - * @param string $t Search terms to "tidy", e.g. trim. - * @return string Trimmed search terms. - */ -function _search_terms_tidy( $t ) { - _deprecated_function( __FUNCTION__, '3.7.0' ); - return trim( $t, "\"'\n\r " ); -} - -/** - * Determine if TinyMCE is available. - * - * Checks to see if the user has deleted the tinymce files to slim down - * their WordPress install. - * - * @since 2.1.0 - * @deprecated 3.9.0 - * - * @return bool Whether TinyMCE exists. - */ -function rich_edit_exists() { - global $wp_rich_edit_exists; - _deprecated_function( __FUNCTION__, '3.9.0' ); - - if ( ! isset( $wp_rich_edit_exists ) ) - $wp_rich_edit_exists = file_exists( ABSPATH . WPINC . '/js/tinymce/tinymce.js' ); - - return $wp_rich_edit_exists; -} - -/** - * Old callback for tag link tooltips. - * - * @since 2.7.0 - * @access private - * @deprecated 3.9.0 - * - * @param int $count Number of topics. - * @return int Number of topics. - */ -function default_topic_count_text( $count ) { - return $count; -} - -/** - * Formerly used to escape strings before inserting into the DB. - * - * Has not performed this function for many, many years. Use wpdb::prepare() instead. - * - * @since 0.71 - * @deprecated 3.9.0 - * - * @param string $content The text to format. - * @return string The very same text. - */ -function format_to_post( $content ) { - _deprecated_function( __FUNCTION__, '3.9.0' ); - return $content; -} - -/** - * Formerly used to escape strings before searching the DB. It was poorly documented and never worked as described. - * - * @since 2.5.0 - * @deprecated 4.0.0 Use wpdb::esc_like() - * @see wpdb::esc_like() - * - * @param string $text The text to be escaped. - * @return string text, safe for inclusion in LIKE query. - */ -function like_escape($text) { - _deprecated_function( __FUNCTION__, '4.0.0', 'wpdb::esc_like()' ); - return str_replace( array( "%", "_" ), array( "\\%", "\\_" ), $text ); -} - -/** - * Determines if the URL can be accessed over SSL. - * - * Determines if the URL can be accessed over SSL by using the WordPress HTTP API to access - * the URL using https as the scheme. - * - * @since 2.5.0 - * @deprecated 4.0.0 - * - * @param string $url The URL to test. - * @return bool Whether SSL access is available. - */ -function url_is_accessable_via_ssl( $url ) { - _deprecated_function( __FUNCTION__, '4.0.0' ); - - $response = wp_remote_get( set_url_scheme( $url, 'https' ) ); - - if ( !is_wp_error( $response ) ) { - $status = wp_remote_retrieve_response_code( $response ); - if ( 200 == $status || 401 == $status ) { - return true; - } - } - - return false; -} - -/** - * Start preview theme output buffer. - * - * Will only perform task if the user has permissions and template and preview - * query variables exist. - * - * @since 2.6.0 - * @deprecated 4.3.0 - */ -function preview_theme() { - _deprecated_function( __FUNCTION__, '4.3.0' ); -} - -/** - * Private function to modify the current template when previewing a theme - * - * @since 2.9.0 - * @deprecated 4.3.0 - * @access private - * - * @return string - */ -function _preview_theme_template_filter() { - _deprecated_function( __FUNCTION__, '4.3.0' ); - return ''; -} - -/** - * Private function to modify the current stylesheet when previewing a theme - * - * @since 2.9.0 - * @deprecated 4.3.0 - * @access private - * - * @return string - */ -function _preview_theme_stylesheet_filter() { - _deprecated_function( __FUNCTION__, '4.3.0' ); - return ''; -} - -/** - * Callback function for ob_start() to capture all links in the theme. - * - * @since 2.6.0 - * @deprecated 4.3.0 - * @access private - * - * @param string $content - * @return string - */ -function preview_theme_ob_filter( $content ) { - _deprecated_function( __FUNCTION__, '4.3.0' ); - return $content; -} - -/** - * Manipulates preview theme links in order to control and maintain location. - * - * Callback function for preg_replace_callback() to accept and filter matches. - * - * @since 2.6.0 - * @deprecated 4.3.0 - * @access private - * - * @param array $matches - * @return string - */ -function preview_theme_ob_filter_callback( $matches ) { - _deprecated_function( __FUNCTION__, '4.3.0' ); - return ''; -} - -/** - * Formats text for the rich text editor. - * - * The {@see 'richedit_pre'} filter is applied here. If $text is empty the filter will - * be applied to an empty string. - * - * @since 2.0.0 - * @deprecated 4.3.0 - * - * @param string $text The text to be formatted. - * @return string The formatted text after filter is applied. - */ -function wp_richedit_pre($text) { - _deprecated_function( __FUNCTION__, '4.3.0', 'format_for_editor()' ); - - if ( empty( $text ) ) { - /** - * Filters text returned for the rich text editor. - * - * This filter is first evaluated, and the value returned, if an empty string - * is passed to wp_richedit_pre(). If an empty string is passed, it results - * in a break tag and line feed. - * - * If a non-empty string is passed, the filter is evaluated on the wp_richedit_pre() - * return after being formatted. - * - * @since 2.0.0 - * @deprecated 4.3.0 - * - * @param string $output Text for the rich text editor. - */ - return apply_filters( 'richedit_pre', '' ); - } - - $output = convert_chars($text); - $output = wpautop($output); - $output = htmlspecialchars($output, ENT_NOQUOTES, get_option( 'blog_charset' ) ); - - /** This filter is documented in wp-includes/deprecated.php */ - return apply_filters( 'richedit_pre', $output ); -} - -/** - * Formats text for the HTML editor. - * - * Unless $output is empty it will pass through htmlspecialchars before the - * {@see 'htmledit_pre'} filter is applied. - * - * @since 2.5.0 - * @deprecated 4.3.0 Use format_for_editor() - * @see format_for_editor() - * - * @param string $output The text to be formatted. - * @return string Formatted text after filter applied. - */ -function wp_htmledit_pre($output) { - _deprecated_function( __FUNCTION__, '4.3.0', 'format_for_editor()' ); - - if ( !empty($output) ) - $output = htmlspecialchars($output, ENT_NOQUOTES, get_option( 'blog_charset' ) ); // convert only < > & - - /** - * Filters the text before it is formatted for the HTML editor. - * - * @since 2.5.0 - * @deprecated 4.3.0 - * - * @param string $output The HTML-formatted text. - */ - return apply_filters( 'htmledit_pre', $output ); -} - -/** - * Retrieve permalink from post ID. - * - * @since 1.0.0 - * @deprecated 4.4.0 Use get_permalink() - * @see get_permalink() - * - * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is global $post. - * @return string|false - */ -function post_permalink( $post_id = 0 ) { - _deprecated_function( __FUNCTION__, '4.4.0', 'get_permalink()' ); - - return get_permalink( $post_id ); -} - -/** - * Perform a HTTP HEAD or GET request. - * - * If $file_path is a writable filename, this will do a GET request and write - * the file to that path. - * - * @since 2.5.0 - * @deprecated 4.4.0 Use WP_Http - * @see WP_Http - * - * @param string $url URL to fetch. - * @param string|bool $file_path Optional. File path to write request to. Default false. - * @param int $red Optional. The number of Redirects followed, Upon 5 being hit, - * returns false. Default 1. - * @return bool|string False on failure and string of headers if HEAD request. - */ -function wp_get_http( $url, $file_path = false, $red = 1 ) { - _deprecated_function( __FUNCTION__, '4.4.0', 'WP_Http' ); - - @set_time_limit( 60 ); - - if ( $red > 5 ) - return false; - - $options = array(); - $options['redirection'] = 5; - - if ( false == $file_path ) - $options['method'] = 'HEAD'; - else - $options['method'] = 'GET'; - - $response = wp_safe_remote_request( $url, $options ); - - if ( is_wp_error( $response ) ) - return false; - - $headers = wp_remote_retrieve_headers( $response ); - $headers['response'] = wp_remote_retrieve_response_code( $response ); - - // WP_HTTP no longer follows redirects for HEAD requests. - if ( 'HEAD' == $options['method'] && in_array($headers['response'], array(301, 302)) && isset( $headers['location'] ) ) { - return wp_get_http( $headers['location'], $file_path, ++$red ); - } - - if ( false == $file_path ) - return $headers; - - // GET request - write it to the supplied filename - $out_fp = fopen($file_path, 'w'); - if ( !$out_fp ) - return $headers; - - fwrite( $out_fp, wp_remote_retrieve_body( $response ) ); - fclose($out_fp); - clearstatcache(); - - return $headers; -} - -/** - * Whether SSL login should be forced. - * - * @since 2.6.0 - * @deprecated 4.4.0 Use force_ssl_admin() - * @see force_ssl_admin() - * - * @param string|bool $force Optional Whether to force SSL login. Default null. - * @return bool True if forced, false if not forced. - */ -function force_ssl_login( $force = null ) { - _deprecated_function( __FUNCTION__, '4.4.0', 'force_ssl_admin()' ); - return force_ssl_admin( $force ); -} - -/** - * Retrieve path of comment popup template in current or parent template. - * - * @since 1.5.0 - * @deprecated 4.5.0 - * - * @return string Full path to comments popup template file. - */ -function get_comments_popup_template() { - _deprecated_function( __FUNCTION__, '4.5.0' ); - - return ''; -} - -/** - * Whether the current URL is within the comments popup window. - * - * @since 1.5.0 - * @deprecated 4.5.0 - * - * @return bool - */ -function is_comments_popup() { - _deprecated_function( __FUNCTION__, '4.5.0' ); - - return false; -} - -/** - * Display the JS popup script to show a comment. - * - * @since 0.71 - * @deprecated 4.5.0 - */ -function comments_popup_script() { - _deprecated_function( __FUNCTION__, '4.5.0' ); -} - -/** - * Adds element attributes to open links in new windows. - * - * @since 0.71 - * @deprecated 4.5.0 - * - * @param string $text Content to replace links to open in a new window. - * @return string Content that has filtered links. - */ -function popuplinks( $text ) { - _deprecated_function( __FUNCTION__, '4.5.0' ); - $text = preg_replace('//i', "", $text); - return $text; -} - -/** - * The Google Video embed handler callback. - * - * Deprecated function that previously assisted in turning Google Video URLs - * into embeds but that service has since been shut down. - * - * @since 2.9.0 - * @deprecated 4.6.0 - * - * @return string An empty string. - */ -function wp_embed_handler_googlevideo( $matches, $attr, $url, $rawattr ) { - _deprecated_function( __FUNCTION__, '4.6.0' ); - - return ''; -} - -/** - * Retrieve path of paged template in current or parent template. - * - * @since 1.5.0 - * @deprecated 4.7.0 The paged.php template is no longer part of the theme template hierarchy. - * - * @return string Full path to paged template file. - */ -function get_paged_template() { - _deprecated_function( __FUNCTION__, '4.7.0' ); - - return get_query_template( 'paged' ); -} - -/** - * Removes the HTML JavaScript entities found in early versions of Netscape 4. - * - * Previously, this function was pulled in from the original - * import of kses and removed a specific vulnerability only - * existent in early version of Netscape 4. However, this - * vulnerability never affected any other browsers and can - * be considered safe for the modern web. - * - * The regular expression which sanitized this vulnerability - * has been removed in consideration of the performance and - * energy demands it placed, now merely passing through its - * input to the return. - * - * @since 1.0.0 - * @deprecated deprecated since 4.7 - * - * @param string $string - * @return string - */ -function wp_kses_js_entities( $string ) { - _deprecated_function( __FUNCTION__, '4.7.0' ); - - return preg_replace( '%&\s*\{[^}]*(\}\s*;?|$)%', '', $string ); -} - -/** - * Sort categories by ID. - * - * Used by usort() as a callback, should not be used directly. Can actually be - * used to sort any term object. - * - * @since 2.3.0 - * @deprecated 4.7.0 Use wp_list_sort() - * @access private - * - * @param object $a - * @param object $b - * @return int - */ -function _usort_terms_by_ID( $a, $b ) { - _deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort' ); - - if ( $a->term_id > $b->term_id ) - return 1; - elseif ( $a->term_id < $b->term_id ) - return -1; - else - return 0; -} - -/** - * Sort categories by name. - * - * Used by usort() as a callback, should not be used directly. Can actually be - * used to sort any term object. - * - * @since 2.3.0 - * @deprecated 4.7.0 Use wp_list_sort() - * @access private - * - * @param object $a - * @param object $b - * @return int - */ -function _usort_terms_by_name( $a, $b ) { - _deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort' ); - - return strcmp( $a->name, $b->name ); -} - -/** - * Sort menu items by the desired key. - * - * @since 3.0.0 - * @deprecated 4.7.0 Use wp_list_sort() - * @access private - * - * @global string $_menu_item_sort_prop - * - * @param object $a The first object to compare - * @param object $b The second object to compare - * @return int -1, 0, or 1 if $a is considered to be respectively less than, equal to, or greater than $b. - */ -function _sort_nav_menu_items( $a, $b ) { - global $_menu_item_sort_prop; - - _deprecated_function( __FUNCTION__, '4.7.0', 'wp_list_sort' ); - - if ( empty( $_menu_item_sort_prop ) ) - return 0; - - if ( ! isset( $a->$_menu_item_sort_prop ) || ! isset( $b->$_menu_item_sort_prop ) ) - return 0; - - $_a = (int) $a->$_menu_item_sort_prop; - $_b = (int) $b->$_menu_item_sort_prop; - - if ( $a->$_menu_item_sort_prop == $b->$_menu_item_sort_prop ) - return 0; - elseif ( $_a == $a->$_menu_item_sort_prop && $_b == $b->$_menu_item_sort_prop ) - return $_a < $_b ? -1 : 1; - else - return strcmp( $a->$_menu_item_sort_prop, $b->$_menu_item_sort_prop ); -} diff --git a/wp/wp-includes/embed-template.php b/wp/wp-includes/embed-template.php deleted file mode 100644 index fb209915..00000000 --- a/wp/wp-includes/embed-template.php +++ /dev/null @@ -1,13 +0,0 @@ -register_handler( $id, $regex, $callback, $priority ); -} - -/** - * Unregisters a previously-registered embed handler. - * - * @since 2.9.0 - * - * @global WP_Embed $wp_embed - * - * @param string $id The handler ID that should be removed. - * @param int $priority Optional. The priority of the handler to be removed. Default 10. - */ -function wp_embed_unregister_handler( $id, $priority = 10 ) { - global $wp_embed; - $wp_embed->unregister_handler( $id, $priority ); -} - -/** - * Creates default array of embed parameters. - * - * The width defaults to the content width as specified by the theme. If the - * theme does not specify a content width, then 500px is used. - * - * The default height is 1.5 times the width, or 1000px, whichever is smaller. - * - * The {@see 'embed_defaults'} filter can be used to adjust either of these values. - * - * @since 2.9.0 - * - * @global int $content_width - * - * @param string $url Optional. The URL that should be embedded. Default empty. - * - * @return array Default embed parameters. - */ -function wp_embed_defaults( $url = '' ) { - if ( ! empty( $GLOBALS['content_width'] ) ) - $width = (int) $GLOBALS['content_width']; - - if ( empty( $width ) ) - $width = 500; - - $height = min( ceil( $width * 1.5 ), 1000 ); - - /** - * Filters the default array of embed dimensions. - * - * @since 2.9.0 - * - * @param array $size An array of embed width and height values - * in pixels (in that order). - * @param string $url The URL that should be embedded. - */ - return apply_filters( 'embed_defaults', compact( 'width', 'height' ), $url ); -} - -/** - * Attempts to fetch the embed HTML for a provided URL using oEmbed. - * - * @since 2.9.0 - * - * @see WP_oEmbed - * - * @param string $url The URL that should be embedded. - * @param array $args Optional. Additional arguments and parameters for retrieving embed HTML. - * Default empty. - * @return false|string False on failure or the embed HTML on success. - */ -function wp_oembed_get( $url, $args = '' ) { - $oembed = _wp_oembed_get_object(); - return $oembed->get_html( $url, $args ); -} - -/** - * Returns the initialized WP_oEmbed object. - * - * @since 2.9.0 - * @access private - * - * @staticvar WP_oEmbed $wp_oembed - * - * @return WP_oEmbed object. - */ -function _wp_oembed_get_object() { - static $wp_oembed = null; - - if ( is_null( $wp_oembed ) ) { - $wp_oembed = new WP_oEmbed(); - } - return $wp_oembed; -} - -/** - * Adds a URL format and oEmbed provider URL pair. - * - * @since 2.9.0 - * - * @see WP_oEmbed - * - * @param string $format The format of URL that this provider can handle. You can use asterisks - * as wildcards. - * @param string $provider The URL to the oEmbed provider. - * @param boolean $regex Optional. Whether the `$format` parameter is in a RegEx format. Default false. - */ -function wp_oembed_add_provider( $format, $provider, $regex = false ) { - if ( did_action( 'plugins_loaded' ) ) { - $oembed = _wp_oembed_get_object(); - $oembed->providers[$format] = array( $provider, $regex ); - } else { - WP_oEmbed::_add_provider_early( $format, $provider, $regex ); - } -} - -/** - * Removes an oEmbed provider. - * - * @since 3.5.0 - * - * @see WP_oEmbed - * - * @param string $format The URL format for the oEmbed provider to remove. - * @return bool Was the provider removed successfully? - */ -function wp_oembed_remove_provider( $format ) { - if ( did_action( 'plugins_loaded' ) ) { - $oembed = _wp_oembed_get_object(); - - if ( isset( $oembed->providers[ $format ] ) ) { - unset( $oembed->providers[ $format ] ); - return true; - } - } else { - WP_oEmbed::_remove_provider_early( $format ); - } - - return false; -} - -/** - * Determines if default embed handlers should be loaded. - * - * Checks to make sure that the embeds library hasn't already been loaded. If - * it hasn't, then it will load the embeds library. - * - * @since 2.9.0 - * - * @see wp_embed_register_handler() - */ -function wp_maybe_load_embeds() { - /** - * Filters whether to load the default embed handlers. - * - * Returning a falsey value will prevent loading the default embed handlers. - * - * @since 2.9.0 - * - * @param bool $maybe_load_embeds Whether to load the embeds library. Default true. - */ - if ( ! apply_filters( 'load_default_embeds', true ) ) { - return; - } - - wp_embed_register_handler( 'youtube_embed_url', '#https?://(www.)?youtube\.com/(?:v|embed)/([^/]+)#i', 'wp_embed_handler_youtube' ); - - /** - * Filters the audio embed handler callback. - * - * @since 3.6.0 - * - * @param callable $handler Audio embed handler callback function. - */ - wp_embed_register_handler( 'audio', '#^https?://.+?\.(' . join( '|', wp_get_audio_extensions() ) . ')$#i', apply_filters( 'wp_audio_embed_handler', 'wp_embed_handler_audio' ), 9999 ); - - /** - * Filters the video embed handler callback. - * - * @since 3.6.0 - * - * @param callable $handler Video embed handler callback function. - */ - wp_embed_register_handler( 'video', '#^https?://.+?\.(' . join( '|', wp_get_video_extensions() ) . ')$#i', apply_filters( 'wp_video_embed_handler', 'wp_embed_handler_video' ), 9999 ); -} - -/** - * YouTube iframe embed handler callback. - * - * Catches YouTube iframe embed URLs that are not parsable by oEmbed but can be translated into a URL that is. - * - * @since 4.0.0 - * - * @global WP_Embed $wp_embed - * - * @param array $matches The RegEx matches from the provided regex when calling - * wp_embed_register_handler(). - * @param array $attr Embed attributes. - * @param string $url The original URL that was matched by the regex. - * @param array $rawattr The original unmodified attributes. - * @return string The embed HTML. - */ -function wp_embed_handler_youtube( $matches, $attr, $url, $rawattr ) { - global $wp_embed; - $embed = $wp_embed->autoembed( sprintf( "https://youtube.com/watch?v=%s", urlencode( $matches[2] ) ) ); - - /** - * Filters the YoutTube embed output. - * - * @since 4.0.0 - * - * @see wp_embed_handler_youtube() - * - * @param string $embed YouTube embed output. - * @param array $attr An array of embed attributes. - * @param string $url The original URL that was matched by the regex. - * @param array $rawattr The original unmodified attributes. - */ - return apply_filters( 'wp_embed_handler_youtube', $embed, $attr, $url, $rawattr ); -} - -/** - * Audio embed handler callback. - * - * @since 3.6.0 - * - * @param array $matches The RegEx matches from the provided regex when calling wp_embed_register_handler(). - * @param array $attr Embed attributes. - * @param string $url The original URL that was matched by the regex. - * @param array $rawattr The original unmodified attributes. - * @return string The embed HTML. - */ -function wp_embed_handler_audio( $matches, $attr, $url, $rawattr ) { - $audio = sprintf( '[audio src="%s" /]', esc_url( $url ) ); - - /** - * Filters the audio embed output. - * - * @since 3.6.0 - * - * @param string $audio Audio embed output. - * @param array $attr An array of embed attributes. - * @param string $url The original URL that was matched by the regex. - * @param array $rawattr The original unmodified attributes. - */ - return apply_filters( 'wp_embed_handler_audio', $audio, $attr, $url, $rawattr ); -} - -/** - * Video embed handler callback. - * - * @since 3.6.0 - * - * @param array $matches The RegEx matches from the provided regex when calling wp_embed_register_handler(). - * @param array $attr Embed attributes. - * @param string $url The original URL that was matched by the regex. - * @param array $rawattr The original unmodified attributes. - * @return string The embed HTML. - */ -function wp_embed_handler_video( $matches, $attr, $url, $rawattr ) { - $dimensions = ''; - if ( ! empty( $rawattr['width'] ) && ! empty( $rawattr['height'] ) ) { - $dimensions .= sprintf( 'width="%d" ', (int) $rawattr['width'] ); - $dimensions .= sprintf( 'height="%d" ', (int) $rawattr['height'] ); - } - $video = sprintf( '[video %s src="%s" /]', $dimensions, esc_url( $url ) ); - - /** - * Filters the video embed output. - * - * @since 3.6.0 - * - * @param string $video Video embed output. - * @param array $attr An array of embed attributes. - * @param string $url The original URL that was matched by the regex. - * @param array $rawattr The original unmodified attributes. - */ - return apply_filters( 'wp_embed_handler_video', $video, $attr, $url, $rawattr ); -} - -/** - * Registers the oEmbed REST API route. - * - * @since 4.4.0 - */ -function wp_oembed_register_route() { - $controller = new WP_oEmbed_Controller(); - $controller->register_routes(); -} - -/** - * Adds oEmbed discovery links in the website . - * - * @since 4.4.0 - */ -function wp_oembed_add_discovery_links() { - $output = ''; - - if ( is_singular() ) { - $output .= '' . "\n"; - - if ( class_exists( 'SimpleXMLElement' ) ) { - $output .= '' . "\n"; - } - } - - /** - * Filters the oEmbed discovery links HTML. - * - * @since 4.4.0 - * - * @param string $output HTML of the discovery links. - */ - echo apply_filters( 'oembed_discovery_links', $output ); -} - -/** - * Adds the necessary JavaScript to communicate with the embedded iframes. - * - * @since 4.4.0 - */ -function wp_oembed_add_host_js() { - wp_enqueue_script( 'wp-embed' ); -} - -/** - * Retrieves the URL to embed a specific post in an iframe. - * - * @since 4.4.0 - * - * @param int|WP_Post $post Optional. Post ID or object. Defaults to the current post. - * @return string|false The post embed URL on success, false if the post doesn't exist. - */ -function get_post_embed_url( $post = null ) { - $post = get_post( $post ); - - if ( ! $post ) { - return false; - } - - $embed_url = trailingslashit( get_permalink( $post ) ) . user_trailingslashit( 'embed' ); - $path_conflict = get_page_by_path( str_replace( home_url(), '', $embed_url ), OBJECT, get_post_types( array( 'public' => true ) ) ); - - if ( ! get_option( 'permalink_structure' ) || $path_conflict ) { - $embed_url = add_query_arg( array( 'embed' => 'true' ), get_permalink( $post ) ); - } - - /** - * Filters the URL to embed a specific post. - * - * @since 4.4.0 - * - * @param string $embed_url The post embed URL. - * @param WP_Post $post The corresponding post object. - */ - return esc_url_raw( apply_filters( 'post_embed_url', $embed_url, $post ) ); -} - -/** - * Retrieves the oEmbed endpoint URL for a given permalink. - * - * Pass an empty string as the first argument to get the endpoint base URL. - * - * @since 4.4.0 - * - * @param string $permalink Optional. The permalink used for the `url` query arg. Default empty. - * @param string $format Optional. The requested response format. Default 'json'. - * @return string The oEmbed endpoint URL. - */ -function get_oembed_endpoint_url( $permalink = '', $format = 'json' ) { - $url = rest_url( 'oembed/1.0/embed' ); - - if ( '' !== $permalink ) { - $url = add_query_arg( array( - 'url' => urlencode( $permalink ), - 'format' => ( 'json' !== $format ) ? $format : false, - ), $url ); - } - - /** - * Filters the oEmbed endpoint URL. - * - * @since 4.4.0 - * - * @param string $url The URL to the oEmbed endpoint. - * @param string $permalink The permalink used for the `url` query arg. - * @param string $format The requested response format. - */ - return apply_filters( 'oembed_endpoint_url', $url, $permalink, $format ); -} - -/** - * Retrieves the embed code for a specific post. - * - * @since 4.4.0 - * - * @param int $width The width for the response. - * @param int $height The height for the response. - * @param int|WP_Post $post Optional. Post ID or object. Default is global `$post`. - * @return string|false Embed code on success, false if post doesn't exist. - */ -function get_post_embed_html( $width, $height, $post = null ) { - $post = get_post( $post ); - - if ( ! $post ) { - return false; - } - - $embed_url = get_post_embed_url( $post ); - - $output = '
      ' . get_the_title( $post ) . "
      \n"; - - $output .= ""; - - $output .= sprintf( - '', - esc_url( $embed_url ), - absint( $width ), - absint( $height ), - esc_attr( - sprintf( - /* translators: 1: post title, 2: site name */ - __( '“%1$s” — %2$s' ), - get_the_title( $post ), - get_bloginfo( 'name' ) - ) - ) - ); - - /** - * Filters the embed HTML output for a given post. - * - * @since 4.4.0 - * - * @param string $output The default HTML. - * @param WP_Post $post Current post object. - * @param int $width Width of the response. - * @param int $height Height of the response. - */ - return apply_filters( 'embed_html', $output, $post, $width, $height ); -} - -/** - * Retrieves the oEmbed response data for a given post. - * - * @since 4.4.0 - * - * @param WP_Post|int $post Post object or ID. - * @param int $width The requested width. - * @return array|false Response data on success, false if post doesn't exist. - */ -function get_oembed_response_data( $post, $width ) { - $post = get_post( $post ); - $width = absint( $width ); - - if ( ! $post ) { - return false; - } - - if ( 'publish' !== get_post_status( $post ) ) { - return false; - } - - /** - * Filters the allowed minimum and maximum widths for the oEmbed response. - * - * @since 4.4.0 - * - * @param array $min_max_width { - * Minimum and maximum widths for the oEmbed response. - * - * @type int $min Minimum width. Default 200. - * @type int $max Maximum width. Default 600. - * } - */ - $min_max_width = apply_filters( 'oembed_min_max_width', array( - 'min' => 200, - 'max' => 600 - ) ); - - $width = min( max( $min_max_width['min'], $width ), $min_max_width['max'] ); - $height = max( ceil( $width / 16 * 9 ), 200 ); - - $data = array( - 'version' => '1.0', - 'provider_name' => get_bloginfo( 'name' ), - 'provider_url' => get_home_url(), - 'author_name' => get_bloginfo( 'name' ), - 'author_url' => get_home_url(), - 'title' => $post->post_title, - 'type' => 'link', - ); - - $author = get_userdata( $post->post_author ); - - if ( $author ) { - $data['author_name'] = $author->display_name; - $data['author_url'] = get_author_posts_url( $author->ID ); - } - - /** - * Filters the oEmbed response data. - * - * @since 4.4.0 - * - * @param array $data The response data. - * @param WP_Post $post The post object. - * @param int $width The requested width. - * @param int $height The calculated height. - */ - return apply_filters( 'oembed_response_data', $data, $post, $width, $height ); -} - -/** - * Filters the oEmbed response data to return an iframe embed code. - * - * @since 4.4.0 - * - * @param array $data The response data. - * @param WP_Post $post The post object. - * @param int $width The requested width. - * @param int $height The calculated height. - * @return array The modified response data. - */ -function get_oembed_response_data_rich( $data, $post, $width, $height ) { - $data['width'] = absint( $width ); - $data['height'] = absint( $height ); - $data['type'] = 'rich'; - $data['html'] = get_post_embed_html( $width, $height, $post ); - - // Add post thumbnail to response if available. - $thumbnail_id = false; - - if ( has_post_thumbnail( $post->ID ) ) { - $thumbnail_id = get_post_thumbnail_id( $post->ID ); - } - - if ( 'attachment' === get_post_type( $post ) ) { - if ( wp_attachment_is_image( $post ) ) { - $thumbnail_id = $post->ID; - } else if ( wp_attachment_is( 'video', $post ) ) { - $thumbnail_id = get_post_thumbnail_id( $post ); - $data['type'] = 'video'; - } - } - - if ( $thumbnail_id ) { - list( $thumbnail_url, $thumbnail_width, $thumbnail_height ) = wp_get_attachment_image_src( $thumbnail_id, array( $width, 99999 ) ); - $data['thumbnail_url'] = $thumbnail_url; - $data['thumbnail_width'] = $thumbnail_width; - $data['thumbnail_height'] = $thumbnail_height; - } - - return $data; -} - -/** - * Ensures that the specified format is either 'json' or 'xml'. - * - * @since 4.4.0 - * - * @param string $format The oEmbed response format. Accepts 'json' or 'xml'. - * @return string The format, either 'xml' or 'json'. Default 'json'. - */ -function wp_oembed_ensure_format( $format ) { - if ( ! in_array( $format, array( 'json', 'xml' ), true ) ) { - return 'json'; - } - - return $format; -} - -/** - * Hooks into the REST API output to print XML instead of JSON. - * - * This is only done for the oEmbed API endpoint, - * which supports both formats. - * - * @access private - * @since 4.4.0 - * - * @param bool $served Whether the request has already been served. - * @param WP_HTTP_ResponseInterface $result Result to send to the client. Usually a WP_REST_Response. - * @param WP_REST_Request $request Request used to generate the response. - * @param WP_REST_Server $server Server instance. - * @return true - */ -function _oembed_rest_pre_serve_request( $served, $result, $request, $server ) { - $params = $request->get_params(); - - if ( '/oembed/1.0/embed' !== $request->get_route() || 'GET' !== $request->get_method() ) { - return $served; - } - - if ( ! isset( $params['format'] ) || 'xml' !== $params['format'] ) { - return $served; - } - - // Embed links inside the request. - $data = $server->response_to_data( $result, false ); - - if ( ! class_exists( 'SimpleXMLElement' ) ) { - status_header( 501 ); - die( get_status_header_desc( 501 ) ); - } - - $result = _oembed_create_xml( $data ); - - // Bail if there's no XML. - if ( ! $result ) { - status_header( 501 ); - return get_status_header_desc( 501 ); - } - - if ( ! headers_sent() ) { - $server->send_header( 'Content-Type', 'text/xml; charset=' . get_option( 'blog_charset' ) ); - } - - echo $result; - - return true; -} - -/** - * Creates an XML string from a given array. - * - * @since 4.4.0 - * @access private - * - * @param array $data The original oEmbed response data. - * @param SimpleXMLElement $node Optional. XML node to append the result to recursively. - * @return string|false XML string on success, false on error. - */ -function _oembed_create_xml( $data, $node = null ) { - if ( ! is_array( $data ) || empty( $data ) ) { - return false; - } - - if ( null === $node ) { - $node = new SimpleXMLElement( '' ); - } - - foreach ( $data as $key => $value ) { - if ( is_numeric( $key ) ) { - $key = 'oembed'; - } - - if ( is_array( $value ) ) { - $item = $node->addChild( $key ); - _oembed_create_xml( $value, $item ); - } else { - $node->addChild( $key, esc_html( $value ) ); - } - } - - return $node->asXML(); -} - -/** - * Filters the given oEmbed HTML. - * - * If the `$url` isn't on the trusted providers list, - * we need to filter the HTML heavily for security. - * - * Only filters 'rich' and 'html' response types. - * - * @since 4.4.0 - * - * @param string $result The oEmbed HTML result. - * @param object $data A data object result from an oEmbed provider. - * @param string $url The URL of the content to be embedded. - * @return string The filtered and sanitized oEmbed result. - */ -function wp_filter_oembed_result( $result, $data, $url ) { - if ( false === $result || ! in_array( $data->type, array( 'rich', 'video' ) ) ) { - return $result; - } - - $wp_oembed = _wp_oembed_get_object(); - - // Don't modify the HTML for trusted providers. - if ( false !== $wp_oembed->get_provider( $url, array( 'discover' => false ) ) ) { - return $result; - } - - $allowed_html = array( - 'a' => array( - 'href' => true, - ), - 'blockquote' => array(), - 'iframe' => array( - 'src' => true, - 'width' => true, - 'height' => true, - 'frameborder' => true, - 'marginwidth' => true, - 'marginheight' => true, - 'scrolling' => true, - 'title' => true, - ), - ); - - $html = wp_kses( $result, $allowed_html ); - - preg_match( '|(
      .*?
      )?.*()|ms', $html, $content ); - // We require at least the iframe to exist. - if ( empty( $content[2] ) ) { - return false; - } - $html = $content[1] . $content[2]; - - if ( ! empty( $content[1] ) ) { - // We have a blockquote to fall back on. Hide the iframe by default. - $html = str_replace( '%2$s', - esc_url( get_permalink() ), - /* translators: %s: Name of current post */ - sprintf( __( 'Continue reading %s' ), '' . get_the_title() . '' ) - ); - return ' … ' . $link; -} - -/** - * Displays the post excerpt for the embed template. - * - * Intended to be used in 'The Loop'. - * - * @since 4.4.0 - */ -function the_excerpt_embed() { - $output = get_the_excerpt(); - - /** - * Filters the post excerpt for the embed template. - * - * @since 4.4.0 - * - * @param string $output The current post excerpt. - */ - echo apply_filters( 'the_excerpt_embed', $output ); -} - -/** - * Filters the post excerpt for the embed template. - * - * Shows players for video and audio attachments. - * - * @since 4.4.0 - * - * @param string $content The current post excerpt. - * @return string The modified post excerpt. - */ -function wp_embed_excerpt_attachment( $content ) { - if ( is_attachment() ) { - return prepend_attachment( '' ); - } - - return $content; -} - -/** - * Enqueue embed iframe default CSS and JS & fire do_action('enqueue_embed_scripts') - * - * Enqueue PNG fallback CSS for embed iframe for legacy versions of IE. - * - * Allows plugins to queue scripts for the embed iframe end using wp_enqueue_script(). - * Runs first in oembed_head(). - * - * @since 4.4.0 - */ -function enqueue_embed_scripts() { - wp_enqueue_style( 'wp-embed-template-ie' ); - - /** - * Fires when scripts and styles are enqueued for the embed iframe. - * - * @since 4.4.0 - */ - do_action( 'enqueue_embed_scripts' ); -} - -/** - * Prints the CSS in the embed iframe header. - * - * @since 4.4.0 - */ -function print_embed_styles() { - ?> - - - - - - -
      - -
      - - - %s', - esc_url( home_url() ), - esc_url( get_site_icon_url( 32, admin_url( 'images/w-logo-blue.png' ) ) ), - esc_url( get_site_icon_url( 64, admin_url( 'images/w-logo-blue.png' ) ) ), - esc_html( get_bloginfo( 'name' ) ) - ); - - $site_title = '
      ' . $site_title . '
      '; - - /** - * Filters the site title HTML in the embed footer. - * - * @since 4.4.0 - * - * @param string $site_title The site title HTML. - */ - echo apply_filters( 'embed_site_title_html', $site_title ); -} - -/** - * Filters the oEmbed result before any HTTP requests are made. - * - * If the URL belongs to the current site, the result is fetched directly instead of - * going through the oEmbed discovery process. - * - * @since 4.5.3 - * - * @param null|string $result The UNSANITIZED (and potentially unsafe) HTML that should be used to embed. Default null. - * @param string $url The URL that should be inspected for discovery `` tags. - * @param array $args oEmbed remote get arguments. - * @return null|string The UNSANITIZED (and potentially unsafe) HTML that should be used to embed. - * Null if the URL does not belong to the current site. - */ -function wp_filter_pre_oembed_result( $result, $url, $args ) { - $post_id = url_to_postid( $url ); - - /** This filter is documented in wp-includes/class-wp-oembed-controller.php */ - $post_id = apply_filters( 'oembed_request_post_id', $post_id, $url ); - - if ( ! $post_id ) { - return $result; - } - - $width = isset( $args['width'] ) ? $args['width'] : 0; - - $data = get_oembed_response_data( $post_id, $width ); - $data = _wp_oembed_get_object()->data2html( (object) $data, $url ); - - if ( ! $data ) { - return $result; - } - - return $data; -} diff --git a/wp/wp-includes/feed-atom-comments.php b/wp/wp-includes/feed-atom-comments.php deleted file mode 100644 index 9e62f20a..00000000 --- a/wp/wp-includes/feed-atom-comments.php +++ /dev/null @@ -1,124 +0,0 @@ -'; - -/** This action is documented in wp-includes/feed-rss2.php */ -do_action( 'rss_tag_pre', 'atom-comments' ); -?> - -> - <?php - if ( is_singular() ) { - /* translators: Comments feed title. 1: Post title */ - printf( ent2ncr( __( 'Comments on %s' ) ), get_the_title_rss() ); - } elseif ( is_search() ) { - /* translators: Comments feed title. 1: Site name, 2: Search query */ - printf( ent2ncr( __( 'Comments for %1$s searching on %2$s' ) ), get_bloginfo_rss( 'name' ), get_search_query() ); - } else { - /* translators: Comments feed title. 1: Site name */ - printf( ent2ncr( __( 'Comments for %s' ) ), get_wp_title_rss() ); - } - ?> - - - - - - - - - - - - - - - - - - -comment_post_ID ); -?> - - <?php - if ( !is_singular() ) { - $title = get_the_title($comment_post->ID); - /** This filter is documented in wp-includes/feed.php */ - $title = apply_filters( 'the_title_rss', $title ); - /* translators: Individual comment title. 1: Post title, 2: Comment author name */ - printf(ent2ncr(__('Comment on %1$s by %2$s')), $title, get_comment_author_rss()); - } else { - /* translators: Comment author title. 1: Comment author name */ - printf(ent2ncr(__('By: %s')), get_comment_author_rss()); - } - ?> - - - - - ' . get_comment_author_url() . ''; ?> - - - - - - - - ]]> - - ]]> -comment_parent == 0 ) : // This comment is top level ?> - -comment_parent); - // The rel attribute below and the id tag above should be GUIDs, but WP doesn't create them for comments (unlike posts). Either way, it's more important that they both use the same system -?> - -comment_ID, $comment_post->ID ); -?> - - - diff --git a/wp/wp-includes/feed-atom.php b/wp/wp-includes/feed-atom.php deleted file mode 100644 index 09cb7c01..00000000 --- a/wp/wp-includes/feed-atom.php +++ /dev/null @@ -1,93 +0,0 @@ -'; - -/** This action is documented in wp-includes/feed-rss2.php */ -do_action( 'rss_tag_pre', 'atom' ); -?> - - > - <?php wp_title_rss(); ?> - - - - - - - - - - - - - - - - - <![CDATA[<?php the_title_rss() ?>]]> - - - - - - ]]> - - ]]> - - - - - - - - - diff --git a/wp/wp-includes/feed-rdf.php b/wp/wp-includes/feed-rdf.php deleted file mode 100644 index b7484000..00000000 --- a/wp/wp-includes/feed-rdf.php +++ /dev/null @@ -1,88 +0,0 @@ -'; - -/** This action is documented in wp-includes/feed-rss2.php */ -do_action( 'rss_tag_pre', 'rdf' ); -?> - -> -"> - <?php wp_title_rss(); ?> - - - - - - 2000-01-01T12:00+00:00 - - - - - - - - - - - - <?php the_title_rss() ?> - - post_date_gmt, false); ?> - ]]> - - - ]]> - - ]]> - ]]> - - - - - diff --git a/wp/wp-includes/feed-rss.php b/wp/wp-includes/feed-rss.php deleted file mode 100644 index 39202b83..00000000 --- a/wp/wp-includes/feed-rss.php +++ /dev/null @@ -1,49 +0,0 @@ -'; ?> - - - <?php wp_title_rss(); ?> - - - - http://backend.userland.com/rss092 - - - - - - - <?php the_title_rss() ?> - ]]> - - - - - - diff --git a/wp/wp-includes/feed-rss2-comments.php b/wp/wp-includes/feed-rss2-comments.php deleted file mode 100644 index d6ed5ae2..00000000 --- a/wp/wp-includes/feed-rss2-comments.php +++ /dev/null @@ -1,110 +0,0 @@ -'; - -/** This action is documented in wp-includes/feed-rss2.php */ -do_action( 'rss_tag_pre', 'rss2-comments' ); -?> - - - -> - - <?php - if ( is_singular() ) { - /* translators: Comments feed title. 1: Post title */ - printf( ent2ncr( __( 'Comments on: %s' ) ), get_the_title_rss() ); - } elseif ( is_search() ) { - /* translators: Comments feed title. 1: Site name, 2: Search query */ - printf( ent2ncr( __( 'Comments for %1$s searching on %2$s' ) ), get_bloginfo_rss( 'name' ), get_search_query() ); - } else { - /* translators: Comments feed title. 1: Site name */ - printf( ent2ncr( __( 'Comments for %s' ) ), get_wp_title_rss() ); - } - ?> - - - - - - - comment_post_ID ); - ?> - - <?php - if ( !is_singular() ) { - $title = get_the_title($comment_post->ID); - /** This filter is documented in wp-includes/feed.php */ - $title = apply_filters( 'the_title_rss', $title ); - /* translators: Individual comment title. 1: Post title, 2: Comment author name */ - printf(ent2ncr(__('Comment on %1$s by %2$s')), $title, get_comment_author_rss()); - } else { - /* translators: Comment author title. 1: Comment author name */ - printf(ent2ncr(__('By: %s')), get_comment_author_rss()); - } - ?> - - ]]> - - - - - ]]> - - ]]> - ]]> -comment_ID The ID of the comment being displayed. - * @param int $comment_post->ID The ID of the post the comment is connected to. - */ - do_action( 'commentrss2_item', $comment->comment_ID, $comment_post->ID ); -?> - - - - diff --git a/wp/wp-includes/feed-rss2.php b/wp/wp-includes/feed-rss2.php deleted file mode 100644 index fa58e244..00000000 --- a/wp/wp-includes/feed-rss2.php +++ /dev/null @@ -1,124 +0,0 @@ -'; - -/** - * Fires between the xml and rss tags in a feed. - * - * @since 4.0.0 - * - * @param string $context Type of feed. Possible values include 'rss2', 'rss2-comments', - * 'rdf', 'atom', and 'atom-comments'. - */ -do_action( 'rss_tag_pre', 'rss2' ); -?> - -> - - - <?php wp_title_rss(); ?> - - - - - - - - - - <?php the_title_rss() ?> - - - - - - ]]> - - - - - ]]> - - ]]> - - 0 ) : ?> - ]]> - - ]]> - - - - - - - - - - - - diff --git a/wp/wp-includes/feed.php b/wp/wp-includes/feed.php deleted file mode 100644 index dbeb3a0f..00000000 --- a/wp/wp-includes/feed.php +++ /dev/null @@ -1,710 +0,0 @@ -document_title_separator' ) ); - } - - /** - * Filters the blog title for use as the feed title. - * - * @since 2.2.0 - * @since 4.4.0 The `$sep` parameter was deprecated and renamed to `$deprecated`. - * - * @param string $title The current blog title. - * @param string $deprecated Unused. - */ - return apply_filters( 'get_wp_title_rss', wp_get_document_title(), $deprecated ); -} - -/** - * Display the blog title for display of the feed title. - * - * @since 2.2.0 - * @since 4.4.0 The optional `$sep` parameter was deprecated and renamed to `$deprecated`. - * - * @param string $deprecated Unused. - */ -function wp_title_rss( $deprecated = '–' ) { - if ( '–' !== $deprecated ) { - /* translators: %s: 'document_title_separator' filter name */ - _deprecated_argument( __FUNCTION__, '4.4.0', sprintf( __( 'Use the %s filter instead.' ), 'document_title_separator' ) ); - } - - /** - * Filters the blog title for display of the feed title. - * - * @since 2.2.0 - * @since 4.4.0 The `$sep` parameter was deprecated and renamed to `$deprecated`. - * - * @see get_wp_title_rss() - * - * @param string $wp_title_rss The current blog title. - * @param string $deprecated Unused. - */ - echo apply_filters( 'wp_title_rss', get_wp_title_rss(), $deprecated ); -} - -/** - * Retrieve the current post title for the feed. - * - * @since 2.0.0 - * - * @return string Current post title. - */ -function get_the_title_rss() { - $title = get_the_title(); - - /** - * Filters the post title for use in a feed. - * - * @since 1.2.0 - * - * @param string $title The current post title. - */ - $title = apply_filters( 'the_title_rss', $title ); - return $title; -} - -/** - * Display the post title in the feed. - * - * @since 0.71 - */ -function the_title_rss() { - echo get_the_title_rss(); -} - -/** - * Retrieve the post content for feeds. - * - * @since 2.9.0 - * @see get_the_content() - * - * @param string $feed_type The type of feed. rss2 | atom | rss | rdf - * @return string The filtered content. - */ -function get_the_content_feed($feed_type = null) { - if ( !$feed_type ) - $feed_type = get_default_feed(); - - /** This filter is documented in wp-includes/post-template.php */ - $content = apply_filters( 'the_content', get_the_content() ); - $content = str_replace(']]>', ']]>', $content); - /** - * Filters the post content for use in feeds. - * - * @since 2.9.0 - * - * @param string $content The current post content. - * @param string $feed_type Type of feed. Possible values include 'rss2', 'atom'. - * Default 'rss2'. - */ - return apply_filters( 'the_content_feed', $content, $feed_type ); -} - -/** - * Display the post content for feeds. - * - * @since 2.9.0 - * - * @param string $feed_type The type of feed. rss2 | atom | rss | rdf - */ -function the_content_feed($feed_type = null) { - echo get_the_content_feed($feed_type); -} - -/** - * Display the post excerpt for the feed. - * - * @since 0.71 - */ -function the_excerpt_rss() { - $output = get_the_excerpt(); - /** - * Filters the post excerpt for a feed. - * - * @since 1.2.0 - * - * @param string $output The current post excerpt. - */ - echo apply_filters( 'the_excerpt_rss', $output ); -} - -/** - * Display the permalink to the post for use in feeds. - * - * @since 2.3.0 - */ -function the_permalink_rss() { - /** - * Filters the permalink to the post for use in feeds. - * - * @since 2.3.0 - * - * @param string $post_permalink The current post permalink. - */ - echo esc_url( apply_filters( 'the_permalink_rss', get_permalink() ) ); -} - -/** - * Outputs the link to the comments for the current post in an xml safe way - * - * @since 3.0.0 - * @return none - */ -function comments_link_feed() { - /** - * Filters the comments permalink for the current post. - * - * @since 3.6.0 - * - * @param string $comment_permalink The current comment permalink with - * '#comments' appended. - */ - echo esc_url( apply_filters( 'comments_link_feed', get_comments_link() ) ); -} - -/** - * Display the feed GUID for the current comment. - * - * @since 2.5.0 - * - * @param int|WP_Comment $comment_id Optional comment object or id. Defaults to global comment object. - */ -function comment_guid($comment_id = null) { - echo esc_url( get_comment_guid($comment_id) ); -} - -/** - * Retrieve the feed GUID for the current comment. - * - * @since 2.5.0 - * - * @param int|WP_Comment $comment_id Optional comment object or id. Defaults to global comment object. - * @return false|string false on failure or guid for comment on success. - */ -function get_comment_guid($comment_id = null) { - $comment = get_comment($comment_id); - - if ( !is_object($comment) ) - return false; - - return get_the_guid($comment->comment_post_ID) . '#comment-' . $comment->comment_ID; -} - -/** - * Display the link to the comments. - * - * @since 1.5.0 - * @since 4.4.0 Introduced the `$comment` argument. - * - * @param int|WP_Comment $comment Optional. Comment object or id. Defaults to global comment object. - */ -function comment_link( $comment = null ) { - /** - * Filters the current comment's permalink. - * - * @since 3.6.0 - * - * @see get_comment_link() - * - * @param string $comment_permalink The current comment permalink. - */ - echo esc_url( apply_filters( 'comment_link', get_comment_link( $comment ) ) ); -} - -/** - * Retrieve the current comment author for use in the feeds. - * - * @since 2.0.0 - * - * @return string Comment Author - */ -function get_comment_author_rss() { - /** - * Filters the current comment author for use in a feed. - * - * @since 1.5.0 - * - * @see get_comment_author() - * - * @param string $comment_author The current comment author. - */ - return apply_filters( 'comment_author_rss', get_comment_author() ); -} - -/** - * Display the current comment author in the feed. - * - * @since 1.0.0 - */ -function comment_author_rss() { - echo get_comment_author_rss(); -} - -/** - * Display the current comment content for use in the feeds. - * - * @since 1.0.0 - */ -function comment_text_rss() { - $comment_text = get_comment_text(); - /** - * Filters the current comment content for use in a feed. - * - * @since 1.5.0 - * - * @param string $comment_text The content of the current comment. - */ - $comment_text = apply_filters( 'comment_text_rss', $comment_text ); - echo $comment_text; -} - -/** - * Retrieve all of the post categories, formatted for use in feeds. - * - * All of the categories for the current post in the feed loop, will be - * retrieved and have feed markup added, so that they can easily be added to the - * RSS2, Atom, or RSS1 and RSS0.91 RDF feeds. - * - * @since 2.1.0 - * - * @param string $type Optional, default is the type returned by get_default_feed(). - * @return string All of the post categories for displaying in the feed. - */ -function get_the_category_rss($type = null) { - if ( empty($type) ) - $type = get_default_feed(); - $categories = get_the_category(); - $tags = get_the_tags(); - $the_list = ''; - $cat_names = array(); - - $filter = 'rss'; - if ( 'atom' == $type ) - $filter = 'raw'; - - if ( !empty($categories) ) foreach ( (array) $categories as $category ) { - $cat_names[] = sanitize_term_field('name', $category->name, $category->term_id, 'category', $filter); - } - - if ( !empty($tags) ) foreach ( (array) $tags as $tag ) { - $cat_names[] = sanitize_term_field('name', $tag->name, $tag->term_id, 'post_tag', $filter); - } - - $cat_names = array_unique($cat_names); - - foreach ( $cat_names as $cat_name ) { - if ( 'rdf' == $type ) - $the_list .= "\t\t\n"; - elseif ( 'atom' == $type ) - $the_list .= sprintf( '', esc_attr( get_bloginfo_rss( 'url' ) ), esc_attr( $cat_name ) ); - else - $the_list .= "\t\t\n"; - } - - /** - * Filters all of the post categories for display in a feed. - * - * @since 1.2.0 - * - * @param string $the_list All of the RSS post categories. - * @param string $type Type of feed. Possible values include 'rss2', 'atom'. - * Default 'rss2'. - */ - return apply_filters( 'the_category_rss', $the_list, $type ); -} - -/** - * Display the post categories in the feed. - * - * @since 0.71 - * @see get_the_category_rss() For better explanation. - * - * @param string $type Optional, default is the type returned by get_default_feed(). - */ -function the_category_rss($type = null) { - echo get_the_category_rss($type); -} - -/** - * Display the HTML type based on the blog setting. - * - * The two possible values are either 'xhtml' or 'html'. - * - * @since 2.2.0 - */ -function html_type_rss() { - $type = get_bloginfo('html_type'); - if (strpos($type, 'xhtml') !== false) - $type = 'xhtml'; - else - $type = 'html'; - echo $type; -} - -/** - * Display the rss enclosure for the current post. - * - * Uses the global $post to check whether the post requires a password and if - * the user has the password for the post. If not then it will return before - * displaying. - * - * Also uses the function get_post_custom() to get the post's 'enclosure' - * metadata field and parses the value to display the enclosure(s). The - * enclosure(s) consist of enclosure HTML tag(s) with a URI and other - * attributes. - * - * @since 1.5.0 - */ -function rss_enclosure() { - if ( post_password_required() ) - return; - - foreach ( (array) get_post_custom() as $key => $val) { - if ($key == 'enclosure') { - foreach ( (array) $val as $enc ) { - $enclosure = explode("\n", $enc); - - // only get the first element, e.g. audio/mpeg from 'audio/mpeg mpga mp2 mp3' - $t = preg_split('/[ \t]/', trim($enclosure[2]) ); - $type = $t[0]; - - /** - * Filters the RSS enclosure HTML link tag for the current post. - * - * @since 2.2.0 - * - * @param string $html_link_tag The HTML link tag with a URI and other attributes. - */ - echo apply_filters( 'rss_enclosure', '' . "\n" ); - } - } - } -} - -/** - * Display the atom enclosure for the current post. - * - * Uses the global $post to check whether the post requires a password and if - * the user has the password for the post. If not then it will return before - * displaying. - * - * Also uses the function get_post_custom() to get the post's 'enclosure' - * metadata field and parses the value to display the enclosure(s). The - * enclosure(s) consist of link HTML tag(s) with a URI and other attributes. - * - * @since 2.2.0 - */ -function atom_enclosure() { - if ( post_password_required() ) - return; - - foreach ( (array) get_post_custom() as $key => $val ) { - if ($key == 'enclosure') { - foreach ( (array) $val as $enc ) { - $enclosure = explode("\n", $enc); - /** - * Filters the atom enclosure HTML link tag for the current post. - * - * @since 2.2.0 - * - * @param string $html_link_tag The HTML link tag with a URI and other attributes. - */ - echo apply_filters( 'atom_enclosure', '' . "\n" ); - } - } - } -} - -/** - * Determine the type of a string of data with the data formatted. - * - * Tell whether the type is text, html, or xhtml, per RFC 4287 section 3.1. - * - * In the case of WordPress, text is defined as containing no markup, - * xhtml is defined as "well formed", and html as tag soup (i.e., the rest). - * - * Container div tags are added to xhtml values, per section 3.1.1.3. - * - * @link http://www.atomenabled.org/developers/syndication/atom-format-spec.php#rfc.section.3.1 - * - * @since 2.5.0 - * - * @param string $data Input string - * @return array array(type, value) - */ -function prep_atom_text_construct($data) { - if (strpos($data, '<') === false && strpos($data, '&') === false) { - return array('text', $data); - } - - if ( ! function_exists( 'xml_parser_create' ) ) { - trigger_error( __( "PHP's XML extension is not available. Please contact your hosting provider to enable PHP's XML extension." ) ); - - return array( 'html', "" ); - } - - $parser = xml_parser_create(); - xml_parse($parser, '
      ' . $data . '
      ', true); - $code = xml_get_error_code($parser); - xml_parser_free($parser); - - if (!$code) { - if (strpos($data, '<') === false) { - return array('text', $data); - } else { - $data = "
      $data
      "; - return array('xhtml', $data); - } - } - - if (strpos($data, ']]>') === false) { - return array('html', ""); - } else { - return array('html', htmlspecialchars($data)); - } -} - -/** - * Displays Site Icon in atom feeds. - * - * @since 4.3.0 - * - * @see get_site_icon_url() - */ -function atom_site_icon() { - $url = get_site_icon_url( 32 ); - if ( $url ) { - echo "$url\n"; - } -} - -/** - * Displays Site Icon in RSS2. - * - * @since 4.3.0 - */ -function rss2_site_icon() { - $rss_title = get_wp_title_rss(); - if ( empty( $rss_title ) ) { - $rss_title = get_bloginfo_rss( 'name' ); - } - - $url = get_site_icon_url( 32 ); - if ( $url ) { - echo ' - - ' . convert_chars( $url ) . ' - ' . $rss_title . ' - ' . get_bloginfo_rss( 'url' ) . ' - 32 - 32 - ' . "\n"; - } -} - -/** - * Display the link for the currently displayed feed in a XSS safe way. - * - * Generate a correct link for the atom:self element. - * - * @since 2.5.0 - */ -function self_link() { - $host = @parse_url(home_url()); - /** - * Filters the current feed URL. - * - * @since 3.6.0 - * - * @see set_url_scheme() - * @see wp_unslash() - * - * @param string $feed_link The link for the feed with set URL scheme. - */ - echo esc_url( apply_filters( 'self_link', set_url_scheme( 'http://' . $host['host'] . wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ); -} - -/** - * Return the content type for specified feed type. - * - * @since 2.8.0 - * - * @param string $type Type of feed. Possible values include 'rss', rss2', 'atom', and 'rdf'. - */ -function feed_content_type( $type = '' ) { - if ( empty($type) ) - $type = get_default_feed(); - - $types = array( - 'rss' => 'application/rss+xml', - 'rss2' => 'application/rss+xml', - 'rss-http' => 'text/xml', - 'atom' => 'application/atom+xml', - 'rdf' => 'application/rdf+xml' - ); - - $content_type = ( !empty($types[$type]) ) ? $types[$type] : 'application/octet-stream'; - - /** - * Filters the content type for a specific feed type. - * - * @since 2.8.0 - * - * @param string $content_type Content type indicating the type of data that a feed contains. - * @param string $type Type of feed. Possible values include 'rss', rss2', 'atom', and 'rdf'. - */ - return apply_filters( 'feed_content_type', $content_type, $type ); -} - -/** - * Build SimplePie object based on RSS or Atom feed from URL. - * - * @since 2.8.0 - * - * @param mixed $url URL of feed to retrieve. If an array of URLs, the feeds are merged - * using SimplePie's multifeed feature. - * See also {@link ​http://simplepie.org/wiki/faq/typical_multifeed_gotchas} - * - * @return WP_Error|SimplePie WP_Error object on failure or SimplePie object on success - */ -function fetch_feed( $url ) { - if ( ! class_exists( 'SimplePie', false ) ) { - require_once( ABSPATH . WPINC . '/class-simplepie.php' ); - } - - require_once( ABSPATH . WPINC . '/class-wp-feed-cache.php' ); - require_once( ABSPATH . WPINC . '/class-wp-feed-cache-transient.php' ); - require_once( ABSPATH . WPINC . '/class-wp-simplepie-file.php' ); - require_once( ABSPATH . WPINC . '/class-wp-simplepie-sanitize-kses.php' ); - - $feed = new SimplePie(); - - $feed->set_sanitize_class( 'WP_SimplePie_Sanitize_KSES' ); - // We must manually overwrite $feed->sanitize because SimplePie's - // constructor sets it before we have a chance to set the sanitization class - $feed->sanitize = new WP_SimplePie_Sanitize_KSES(); - - $feed->set_cache_class( 'WP_Feed_Cache' ); - $feed->set_file_class( 'WP_SimplePie_File' ); - - $feed->set_feed_url( $url ); - /** This filter is documented in wp-includes/class-wp-feed-cache-transient.php */ - $feed->set_cache_duration( apply_filters( 'wp_feed_cache_transient_lifetime', 12 * HOUR_IN_SECONDS, $url ) ); - /** - * Fires just before processing the SimplePie feed object. - * - * @since 3.0.0 - * - * @param object &$feed SimplePie feed object, passed by reference. - * @param mixed $url URL of feed to retrieve. If an array of URLs, the feeds are merged. - */ - do_action_ref_array( 'wp_feed_options', array( &$feed, $url ) ); - $feed->init(); - $feed->set_output_encoding( get_option( 'blog_charset' ) ); - - if ( $feed->error() ) - return new WP_Error( 'simplepie-error', $feed->error() ); - - return $feed; -} diff --git a/wp/wp-includes/fonts/dashicons.eot b/wp/wp-includes/fonts/dashicons.eot deleted file mode 100644 index 3bdfdc4b20872127d468c0180a394a45f7abb475..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22449 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 diff --git a/wp/wp-includes/fonts/dashicons.svg b/wp/wp-includes/fonts/dashicons.svg deleted file mode 100644 index 45852aa5..00000000 --- a/wp/wp-includes/fonts/dashicons.svg +++ /dev/null @@ -1,269 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/wp/wp-includes/fonts/dashicons.ttf b/wp/wp-includes/fonts/dashicons.ttf deleted file mode 100644 index 89112fa8903f2f52540b70e43b334a1c974de720..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41728 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 diff --git a/wp/wp-includes/fonts/dashicons.woff b/wp/wp-includes/fonts/dashicons.woff deleted file mode 100644 index a13f9cf6499823856009da13ee24f41933bed3d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26124 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 diff --git a/wp/wp-includes/formatting.php b/wp/wp-includes/formatting.php deleted file mode 100644 index 7b6900e8..00000000 --- a/wp/wp-includes/formatting.php +++ /dev/null @@ -1,5364 +0,0 @@ -', - $open_sq_flag = '', - $apos_flag = ''; - - // If there's nothing to do, just stop. - if ( empty( $text ) || false === $run_texturize ) { - return $text; - } - - // Set up static variables. Run once only. - if ( $reset || ! isset( $static_characters ) ) { - /** - * Filters whether to skip running wptexturize(). - * - * Passing false to the filter will effectively short-circuit wptexturize(). - * returning the original text passed to the function instead. - * - * The filter runs only once, the first time wptexturize() is called. - * - * @since 4.0.0 - * - * @see wptexturize() - * - * @param bool $run_texturize Whether to short-circuit wptexturize(). - */ - $run_texturize = apply_filters( 'run_wptexturize', $run_texturize ); - if ( false === $run_texturize ) { - return $text; - } - - /* translators: opening curly double quote */ - $opening_quote = _x( '“', 'opening curly double quote' ); - /* translators: closing curly double quote */ - $closing_quote = _x( '”', 'closing curly double quote' ); - - /* translators: apostrophe, for example in 'cause or can't */ - $apos = _x( '’', 'apostrophe' ); - - /* translators: prime, for example in 9' (nine feet) */ - $prime = _x( '′', 'prime' ); - /* translators: double prime, for example in 9" (nine inches) */ - $double_prime = _x( '″', 'double prime' ); - - /* translators: opening curly single quote */ - $opening_single_quote = _x( '‘', 'opening curly single quote' ); - /* translators: closing curly single quote */ - $closing_single_quote = _x( '’', 'closing curly single quote' ); - - /* translators: en dash */ - $en_dash = _x( '–', 'en dash' ); - /* translators: em dash */ - $em_dash = _x( '—', 'em dash' ); - - $default_no_texturize_tags = array('pre', 'code', 'kbd', 'style', 'script', 'tt'); - $default_no_texturize_shortcodes = array('code'); - - // if a plugin has provided an autocorrect array, use it - if ( isset($wp_cockneyreplace) ) { - $cockney = array_keys( $wp_cockneyreplace ); - $cockneyreplace = array_values( $wp_cockneyreplace ); - } else { - /* translators: This is a comma-separated list of words that defy the syntax of quotations in normal use, - * for example... 'We do not have enough words yet' ... is a typical quoted phrase. But when we write - * lines of code 'til we have enough of 'em, then we need to insert apostrophes instead of quotes. - */ - $cockney = explode( ',', _x( "'tain't,'twere,'twas,'tis,'twill,'til,'bout,'nuff,'round,'cause,'em", - 'Comma-separated list of words to texturize in your language' ) ); - - $cockneyreplace = explode( ',', _x( '’tain’t,’twere,’twas,’tis,’twill,’til,’bout,’nuff,’round,’cause,’em', - 'Comma-separated list of replacement words in your language' ) ); - } - - $static_characters = array_merge( array( '...', '``', '\'\'', ' (tm)' ), $cockney ); - $static_replacements = array_merge( array( '…', $opening_quote, $closing_quote, ' ™' ), $cockneyreplace ); - - - // Pattern-based replacements of characters. - // Sort the remaining patterns into several arrays for performance tuning. - $dynamic_characters = array( 'apos' => array(), 'quote' => array(), 'dash' => array() ); - $dynamic_replacements = array( 'apos' => array(), 'quote' => array(), 'dash' => array() ); - $dynamic = array(); - $spaces = wp_spaces_regexp(); - - // '99' and '99" are ambiguous among other patterns; assume it's an abbreviated year at the end of a quotation. - if ( "'" !== $apos || "'" !== $closing_single_quote ) { - $dynamic[ '/\'(\d\d)\'(?=\Z|[.,:;!?)}\-\]]|>|' . $spaces . ')/' ] = $apos_flag . '$1' . $closing_single_quote; - } - if ( "'" !== $apos || '"' !== $closing_quote ) { - $dynamic[ '/\'(\d\d)"(?=\Z|[.,:;!?)}\-\]]|>|' . $spaces . ')/' ] = $apos_flag . '$1' . $closing_quote; - } - - // '99 '99s '99's (apostrophe) But never '9 or '99% or '999 or '99.0. - if ( "'" !== $apos ) { - $dynamic[ '/\'(?=\d\d(?:\Z|(?![%\d]|[.,]\d)))/' ] = $apos_flag; - } - - // Quoted Numbers like '0.42' - if ( "'" !== $opening_single_quote && "'" !== $closing_single_quote ) { - $dynamic[ '/(?<=\A|' . $spaces . ')\'(\d[.,\d]*)\'/' ] = $open_sq_flag . '$1' . $closing_single_quote; - } - - // Single quote at start, or preceded by (, {, <, [, ", -, or spaces. - if ( "'" !== $opening_single_quote ) { - $dynamic[ '/(?<=\A|[([{"\-]|<|' . $spaces . ')\'/' ] = $open_sq_flag; - } - - // Apostrophe in a word. No spaces, double apostrophes, or other punctuation. - if ( "'" !== $apos ) { - $dynamic[ '/(?&/\[\]\x00-\x20=]++)@', $text, $matches ); - $tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] ); - $found_shortcodes = ! empty( $tagnames ); - $shortcode_regex = $found_shortcodes ? _get_wptexturize_shortcode_regex( $tagnames ) : ''; - $regex = _get_wptexturize_split_regex( $shortcode_regex ); - - $textarr = preg_split( $regex, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); - - foreach ( $textarr as &$curl ) { - // Only call _wptexturize_pushpop_element if $curl is a delimiter. - $first = $curl[0]; - if ( '<' === $first ) { - if ( ''; - $quote_pattern = "/$needle(?=\\Z|[.,:;!?)}\\-\\]]|>|" . $spaces . ")/"; - $prime_pattern = "/(?<=\\d)$needle/"; - $flag_after_digit = "/(?<=\\d)$flag/"; - $flag_no_digit = "/(? &$sentence ) { - if ( false === strpos( $sentence, $needle ) ) { - continue; - } elseif ( 0 !== $key && 0 === substr_count( $sentence, $close_quote ) ) { - $sentence = preg_replace( $quote_pattern, $flag, $sentence, -1, $count ); - if ( $count > 1 ) { - // This sentence appears to have multiple closing quotes. Attempt Vulcan logic. - $sentence = preg_replace( $flag_no_digit, $close_quote, $sentence, -1, $count2 ); - if ( 0 === $count2 ) { - // Try looking for a quote followed by a period. - $count2 = substr_count( $sentence, "$flag." ); - if ( $count2 > 0 ) { - // Assume the rightmost quote-period match is the end of quotation. - $pos = strrpos( $sentence, "$flag." ); - } else { - // When all else fails, make the rightmost candidate a closing quote. - // This is most likely to be problematic in the context of bug #18549. - $pos = strrpos( $sentence, $flag ); - } - $sentence = substr_replace( $sentence, $close_quote, $pos, strlen( $flag ) ); - } - // Use conventional replacement on any remaining primes and quotes. - $sentence = preg_replace( $prime_pattern, $prime, $sentence ); - $sentence = preg_replace( $flag_after_digit, $prime, $sentence ); - $sentence = str_replace( $flag, $close_quote, $sentence ); - } elseif ( 1 == $count ) { - // Found only one closing quote candidate, so give it priority over primes. - $sentence = str_replace( $flag, $close_quote, $sentence ); - $sentence = preg_replace( $prime_pattern, $prime, $sentence ); - } else { - // No closing quotes found. Just run primes pattern. - $sentence = preg_replace( $prime_pattern, $prime, $sentence ); - } - } else { - $sentence = preg_replace( $prime_pattern, $prime, $sentence ); - $sentence = preg_replace( $quote_pattern, $close_quote, $sentence ); - } - if ( '"' == $needle && false !== strpos( $sentence, '"' ) ) { - $sentence = str_replace( '"', $close_quote, $sentence ); - } - } - - return implode( $open_quote, $sentences ); -} - -/** - * Search for disabled element tags. Push element to stack on tag open and pop - * on tag close. - * - * Assumes first char of $text is tag opening and last char is tag closing. - * Assumes second char of $text is optionally '/' to indicate closing as in . - * - * @since 2.9.0 - * @access private - * - * @param string $text Text to check. Must be a tag like `` or `[shortcode]`. - * @param array $stack List of open tag elements. - * @param array $disabled_elements The tag names to match against. Spaces are not allowed in tag names. - */ -function _wptexturize_pushpop_element( $text, &$stack, $disabled_elements ) { - // Is it an opening tag or closing tag? - if ( isset( $text[1] ) && '/' !== $text[1] ) { - $opening_tag = true; - $name_offset = 1; - } elseif ( 0 == count( $stack ) ) { - // Stack is empty. Just stop. - return; - } else { - $opening_tag = false; - $name_offset = 2; - } - - // Parse out the tag name. - $space = strpos( $text, ' ' ); - if ( false === $space ) { - $space = -1; - } else { - $space -= $name_offset; - } - $tag = substr( $text, $name_offset, $space ); - - // Handle disabled tags. - if ( in_array( $tag, $disabled_elements ) ) { - if ( $opening_tag ) { - /* - * This disables texturize until we find a closing tag of our type - * (e.g.
      ) even if there was invalid nesting before that
      -			 *
      -			 * Example: in the case 
      sadsadasd"baba"
      - * "baba" won't be texturize - */ - - array_push( $stack, $tag ); - } elseif ( end( $stack ) == $tag ) { - array_pop( $stack ); - } - } -} - -/** - * Replaces double line-breaks with paragraph elements. - * - * A group of regex replaces used to identify text formatted with newlines and - * replace double line-breaks with HTML paragraph tags. The remaining line-breaks - * after conversion become <
      > tags, unless $br is set to '0' or 'false'. - * - * @since 0.71 - * - * @param string $pee The text which has to be formatted. - * @param bool $br Optional. If set, this will convert all remaining line-breaks - * after paragraphing. Default true. - * @return string Text which has been converted into correct paragraph tags. - */ -function wpautop( $pee, $br = true ) { - $pre_tags = array(); - - if ( trim($pee) === '' ) - return ''; - - // Just to make things a little easier, pad the end. - $pee = $pee . "\n"; - - /* - * Pre tags shouldn't be touched by autop. - * Replace pre tags with placeholders and bring them back after autop. - */ - if ( strpos($pee, '', $pee ); - $last_pee = array_pop($pee_parts); - $pee = ''; - $i = 0; - - foreach ( $pee_parts as $pee_part ) { - $start = strpos($pee_part, ''; - - $pee .= substr( $pee_part, 0, $start ) . $name; - $i++; - } - - $pee .= $last_pee; - } - // Change multiple
      s into two line breaks, which will turn into paragraphs. - $pee = preg_replace('|\s*|', "\n\n", $pee); - - $allblocks = '(?:table|thead|tfoot|caption|col|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|form|map|area|blockquote|address|math|style|p|h[1-6]|hr|fieldset|legend|section|article|aside|hgroup|header|footer|nav|figure|figcaption|details|menu|summary)'; - - // Add a double line break above block-level opening tags. - $pee = preg_replace('!(<' . $allblocks . '[\s/>])!', "\n\n$1", $pee); - - // Add a double line break below block-level closing tags. - $pee = preg_replace('!()!', "$1\n\n", $pee); - - // Standardize newline characters to "\n". - $pee = str_replace(array("\r\n", "\r"), "\n", $pee); - - // Find newlines in all elements and add placeholders. - $pee = wp_replace_in_html_tags( $pee, array( "\n" => " " ) ); - - // Collapse line breaks before and after ', $pee ); - } - - /* - * Collapse line breaks inside elements, before and elements - * so they don't get autop'd. - */ - if ( strpos( $pee, '' ) !== false ) { - $pee = preg_replace( '|(]*>)\s*|', '$1', $pee ); - $pee = preg_replace( '|\s*|', '', $pee ); - $pee = preg_replace( '%\s*(]*>)\s*%', '$1', $pee ); - } - - /* - * Collapse line breaks inside
      ,
      , or
      tag if missing. - $pee = preg_replace('!

      ([^<]+)!', "

      $1

      ", $pee); - - // If an opening or closing block element tag is wrapped in a

      , unwrap it. - $pee = preg_replace('!

      \s*(]*>)\s*

      !', "$1", $pee); - - // In some cases
    10. may get wrapped in

      , fix them. - $pee = preg_replace("|

      (|", "$1", $pee); - - // If a

      is wrapped with a

      , move it inside the

      . - $pee = preg_replace('|

      ]*)>|i', "

      ", $pee); - $pee = str_replace('

      ', '

      ', $pee); - - // If an opening or closing block element tag is preceded by an opening

      tag, remove it. - $pee = preg_replace('!

      \s*(]*>)!', "$1", $pee); - - // If an opening or closing block element tag is followed by a closing

      tag, remove it. - $pee = preg_replace('!(]*>)\s*

      !', "$1", $pee); - - // Optionally insert line breaks. - if ( $br ) { - // Replace newlines that shouldn't be touched with a placeholder. - $pee = preg_replace_callback('/<(script|style).*?<\/\\1>/s', '_autop_newline_preservation_helper', $pee); - - // Normalize
      - $pee = str_replace( array( '
      ', '
      ' ), '
      ', $pee ); - - // Replace any new line characters that aren't preceded by a
      with a
      . - $pee = preg_replace('|(?)\s*\n|', "
      \n", $pee); - - // Replace newline placeholders with newlines. - $pee = str_replace('', "\n", $pee); - } - - // If a
      tag is after an opening or closing block tag, remove it. - $pee = preg_replace('!(]*>)\s*
      !', "$1", $pee); - - // If a
      tag is before a subset of opening or closing block tags, remove it. - $pee = preg_replace('!
      (\s*]*>)!', '$1', $pee); - $pee = preg_replace( "|\n

      $|", '

      ', $pee ); - - // Replace placeholder
       tags with their original content.
      -	if ( !empty($pre_tags) )
      -		$pee = str_replace(array_keys($pre_tags), array_values($pre_tags), $pee);
      -
      -	// Restore newlines in all elements.
      -	if ( false !== strpos( $pee, '' ) ) {
      -		$pee = str_replace( array( '  ', '' ), "\n", $pee );
      -	}
      -
      -	return $pee;
      -}
      -
      -/**
      - * Separate HTML elements and comments from the text.
      - *
      - * @since 4.2.4
      - *
      - * @param string $input The text which has to be formatted.
      - * @return array The formatted text.
      - */
      -function wp_html_split( $input ) {
      -	return preg_split( get_html_split_regex(), $input, -1, PREG_SPLIT_DELIM_CAPTURE );
      -}
      -
      -/**
      - * Retrieve the regular expression for an HTML element.
      - *
      - * @since 4.4.0
      - *
      - * @return string The regular expression
      - */
      -function get_html_split_regex() {
      -	static $regex;
      -
      -	if ( ! isset( $regex ) ) {
      -		$comments =
      -			  '!'           // Start of comment, after the <.
      -			. '(?:'         // Unroll the loop: Consume everything until --> is found.
      -			.     '-(?!->)' // Dash not followed by end of comment.
      -			.     '[^\-]*+' // Consume non-dashes.
      -			. ')*+'         // Loop possessively.
      -			. '(?:-->)?';   // End of comment. If not found, match all input.
      -
      -		$cdata =
      -			  '!\[CDATA\['  // Start of comment, after the <.
      -			. '[^\]]*+'     // Consume non-].
      -			. '(?:'         // Unroll the loop: Consume everything until ]]> is found.
      -			.     '](?!]>)' // One ] not followed by end of comment.
      -			.     '[^\]]*+' // Consume non-].
      -			. ')*+'         // Loop possessively.
      -			. '(?:]]>)?';   // End of comment. If not found, match all input.
      -
      -		$escaped =
      -			  '(?='           // Is the element escaped?
      -			.    '!--'
      -			. '|'
      -			.    '!\[CDATA\['
      -			. ')'
      -			. '(?(?=!-)'      // If yes, which type?
      -			.     $comments
      -			. '|'
      -			.     $cdata
      -			. ')';
      -
      -		$regex =
      -			  '/('              // Capture the entire match.
      -			.     '<'           // Find start of element.
      -			.     '(?'          // Conditional expression follows.
      -			.         $escaped  // Find end of escaped element.
      -			.     '|'           // ... else ...
      -			.         '[^>]*>?' // Find end of normal element.
      -			.     ')'
      -			. ')/';
      -	}
      -
      -	return $regex;
      -}
      -
      -/**
      - * Retrieve the combined regular expression for HTML and shortcodes.
      - *
      - * @access private
      - * @ignore
      - * @internal This function will be removed in 4.5.0 per Shortcode API Roadmap.
      - * @since 4.4.0
      - *
      - * @param string $shortcode_regex The result from _get_wptexturize_shortcode_regex().  Optional.
      - * @return string The regular expression
      - */
      -function _get_wptexturize_split_regex( $shortcode_regex = '' ) {
      -	static $html_regex;
      -
      -	if ( ! isset( $html_regex ) ) {
      -		$comment_regex =
      -			  '!'           // Start of comment, after the <.
      -			. '(?:'         // Unroll the loop: Consume everything until --> is found.
      -			.     '-(?!->)' // Dash not followed by end of comment.
      -			.     '[^\-]*+' // Consume non-dashes.
      -			. ')*+'         // Loop possessively.
      -			. '(?:-->)?';   // End of comment. If not found, match all input.
      -
      -		$html_regex =			 // Needs replaced with wp_html_split() per Shortcode API Roadmap.
      -			  '<'                // Find start of element.
      -			. '(?(?=!--)'        // Is this a comment?
      -			.     $comment_regex // Find end of comment.
      -			. '|'
      -			.     '[^>]*>?'      // Find end of element. If not found, match all input.
      -			. ')';
      -	}
      -
      -	if ( empty( $shortcode_regex ) ) {
      -		$regex = '/(' . $html_regex . ')/';
      -	} else {
      -		$regex = '/(' . $html_regex . '|' . $shortcode_regex . ')/';
      -	}
      -
      -	return $regex;
      -}
      -
      -/**
      - * Retrieve the regular expression for shortcodes.
      - *
      - * @access private
      - * @ignore
      - * @internal This function will be removed in 4.5.0 per Shortcode API Roadmap.
      - * @since 4.4.0
      - *
      - * @param array $tagnames List of shortcodes to find.
      - * @return string The regular expression
      - */
      -function _get_wptexturize_shortcode_regex( $tagnames ) {
      -	$tagregexp = join( '|', array_map( 'preg_quote', $tagnames ) );
      -	$tagregexp = "(?:$tagregexp)(?=[\\s\\]\\/])"; // Excerpt of get_shortcode_regex().
      -	$regex =
      -		  '\['              // Find start of shortcode.
      -		. '[\/\[]?'         // Shortcodes may begin with [/ or [[
      -		. $tagregexp        // Only match registered shortcodes, because performance.
      -		. '(?:'
      -		.     '[^\[\]<>]+'  // Shortcodes do not contain other shortcodes. Quantifier critical.
      -		. '|'
      -		.     '<[^\[\]>]*>' // HTML elements permitted. Prevents matching ] before >.
      -		. ')*+'             // Possessive critical.
      -		. '\]'              // Find end of shortcode.
      -		. '\]?';            // Shortcodes may end with ]]
      -
      -	return $regex;
      -}
      -
      -/**
      - * Replace characters or phrases within HTML elements only.
      - *
      - * @since 4.2.3
      - *
      - * @param string $haystack The text which has to be formatted.
      - * @param array $replace_pairs In the form array('from' => 'to', ...).
      - * @return string The formatted text.
      - */
      -function wp_replace_in_html_tags( $haystack, $replace_pairs ) {
      -	// Find all elements.
      -	$textarr = wp_html_split( $haystack );
      -	$changed = false;
      -
      -	// Optimize when searching for one item.
      -	if ( 1 === count( $replace_pairs ) ) {
      -		// Extract $needle and $replace.
      -		foreach ( $replace_pairs as $needle => $replace );
      -
      -		// Loop through delimiters (elements) only.
      -		for ( $i = 1, $c = count( $textarr ); $i < $c; $i += 2 ) {
      -			if ( false !== strpos( $textarr[$i], $needle ) ) {
      -				$textarr[$i] = str_replace( $needle, $replace, $textarr[$i] );
      -				$changed = true;
      -			}
      -		}
      -	} else {
      -		// Extract all $needles.
      -		$needles = array_keys( $replace_pairs );
      -
      -		// Loop through delimiters (elements) only.
      -		for ( $i = 1, $c = count( $textarr ); $i < $c; $i += 2 ) {
      -			foreach ( $needles as $needle ) {
      -				if ( false !== strpos( $textarr[$i], $needle ) ) {
      -					$textarr[$i] = strtr( $textarr[$i], $replace_pairs );
      -					$changed = true;
      -					// After one strtr() break out of the foreach loop and look at next element.
      -					break;
      -				}
      -			}
      -		}
      -	}
      -
      -	if ( $changed ) {
      -		$haystack = implode( $textarr );
      -	}
      -
      -	return $haystack;
      -}
      -
      -/**
      - * Newline preservation help function for wpautop
      - *
      - * @since 3.1.0
      - * @access private
      - *
      - * @param array $matches preg_replace_callback matches array
      - * @return string
      - */
      -function _autop_newline_preservation_helper( $matches ) {
      -	return str_replace( "\n", "", $matches[0] );
      -}
      -
      -/**
      - * Don't auto-p wrap shortcodes that stand alone
      - *
      - * Ensures that shortcodes are not wrapped in `

      ...

      `. - * - * @since 2.9.0 - * - * @global array $shortcode_tags - * - * @param string $pee The content. - * @return string The filtered content. - */ -function shortcode_unautop( $pee ) { - global $shortcode_tags; - - if ( empty( $shortcode_tags ) || !is_array( $shortcode_tags ) ) { - return $pee; - } - - $tagregexp = join( '|', array_map( 'preg_quote', array_keys( $shortcode_tags ) ) ); - $spaces = wp_spaces_regexp(); - - $pattern = - '/' - . '

      ' // Opening paragraph - . '(?:' . $spaces . ')*+' // Optional leading whitespace - . '(' // 1: The shortcode - . '\\[' // Opening bracket - . "($tagregexp)" // 2: Shortcode name - . '(?![\\w-])' // Not followed by word character or hyphen - // Unroll the loop: Inside the opening shortcode tag - . '[^\\]\\/]*' // Not a closing bracket or forward slash - . '(?:' - . '\\/(?!\\])' // A forward slash not followed by a closing bracket - . '[^\\]\\/]*' // Not a closing bracket or forward slash - . ')*?' - . '(?:' - . '\\/\\]' // Self closing tag and closing bracket - . '|' - . '\\]' // Closing bracket - . '(?:' // Unroll the loop: Optionally, anything between the opening and closing shortcode tags - . '[^\\[]*+' // Not an opening bracket - . '(?:' - . '\\[(?!\\/\\2\\])' // An opening bracket not followed by the closing shortcode tag - . '[^\\[]*+' // Not an opening bracket - . ')*+' - . '\\[\\/\\2\\]' // Closing shortcode tag - . ')?' - . ')' - . ')' - . '(?:' . $spaces . ')*+' // optional trailing whitespace - . '<\\/p>' // closing paragraph - . '/'; - - return preg_replace( $pattern, '$1', $pee ); -} - -/** - * Checks to see if a string is utf8 encoded. - * - * NOTE: This function checks for 5-Byte sequences, UTF8 - * has Bytes Sequences with a maximum length of 4. - * - * @author bmorel at ssi dot fr (modified) - * @since 1.2.1 - * - * @param string $str The string to be checked - * @return bool True if $str fits a UTF-8 model, false otherwise. - */ -function seems_utf8( $str ) { - mbstring_binary_safe_encoding(); - $length = strlen($str); - reset_mbstring_encoding(); - for ($i=0; $i < $length; $i++) { - $c = ord($str[$i]); - if ($c < 0x80) $n = 0; // 0bbbbbbb - elseif (($c & 0xE0) == 0xC0) $n=1; // 110bbbbb - elseif (($c & 0xF0) == 0xE0) $n=2; // 1110bbbb - elseif (($c & 0xF8) == 0xF0) $n=3; // 11110bbb - elseif (($c & 0xFC) == 0xF8) $n=4; // 111110bb - elseif (($c & 0xFE) == 0xFC) $n=5; // 1111110b - else return false; // Does not match any model - for ($j=0; $j<$n; $j++) { // n bytes matching 10bbbbbb follow ? - if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80)) - return false; - } - } - return true; -} - -/** - * Converts a number of special characters into their HTML entities. - * - * Specifically deals with: &, <, >, ", and '. - * - * $quote_style can be set to ENT_COMPAT to encode " to - * ", or ENT_QUOTES to do both. Default is ENT_NOQUOTES where no quotes are encoded. - * - * @since 1.2.2 - * @access private - * - * @staticvar string $_charset - * - * @param string $string The text which is to be encoded. - * @param int|string $quote_style Optional. Converts double quotes if set to ENT_COMPAT, - * both single and double if set to ENT_QUOTES or none if set to ENT_NOQUOTES. - * Also compatible with old values; converting single quotes if set to 'single', - * double if set to 'double' or both if otherwise set. - * Default is ENT_NOQUOTES. - * @param string $charset Optional. The character encoding of the string. Default is false. - * @param bool $double_encode Optional. Whether to encode existing html entities. Default is false. - * @return string The encoded text with HTML entities. - */ -function _wp_specialchars( $string, $quote_style = ENT_NOQUOTES, $charset = false, $double_encode = false ) { - $string = (string) $string; - - if ( 0 === strlen( $string ) ) - return ''; - - // Don't bother if there are no specialchars - saves some processing - if ( ! preg_match( '/[&<>"\']/', $string ) ) - return $string; - - // Account for the previous behaviour of the function when the $quote_style is not an accepted value - if ( empty( $quote_style ) ) - $quote_style = ENT_NOQUOTES; - elseif ( ! in_array( $quote_style, array( 0, 2, 3, 'single', 'double' ), true ) ) - $quote_style = ENT_QUOTES; - - // Store the site charset as a static to avoid multiple calls to wp_load_alloptions() - if ( ! $charset ) { - static $_charset = null; - if ( ! isset( $_charset ) ) { - $alloptions = wp_load_alloptions(); - $_charset = isset( $alloptions['blog_charset'] ) ? $alloptions['blog_charset'] : ''; - } - $charset = $_charset; - } - - if ( in_array( $charset, array( 'utf8', 'utf-8', 'UTF8' ) ) ) - $charset = 'UTF-8'; - - $_quote_style = $quote_style; - - if ( $quote_style === 'double' ) { - $quote_style = ENT_COMPAT; - $_quote_style = ENT_COMPAT; - } elseif ( $quote_style === 'single' ) { - $quote_style = ENT_NOQUOTES; - } - - if ( ! $double_encode ) { - // Guarantee every &entity; is valid, convert &garbage; into &garbage; - // This is required for PHP < 5.4.0 because ENT_HTML401 flag is unavailable. - $string = wp_kses_normalize_entities( $string ); - } - - $string = @htmlspecialchars( $string, $quote_style, $charset, $double_encode ); - - // Back-compat. - if ( 'single' === $_quote_style ) - $string = str_replace( "'", ''', $string ); - - return $string; -} - -/** - * Converts a number of HTML entities into their special characters. - * - * Specifically deals with: &, <, >, ", and '. - * - * $quote_style can be set to ENT_COMPAT to decode " entities, - * or ENT_QUOTES to do both " and '. Default is ENT_NOQUOTES where no quotes are decoded. - * - * @since 2.8.0 - * - * @param string $string The text which is to be decoded. - * @param string|int $quote_style Optional. Converts double quotes if set to ENT_COMPAT, - * both single and double if set to ENT_QUOTES or - * none if set to ENT_NOQUOTES. - * Also compatible with old _wp_specialchars() values; - * converting single quotes if set to 'single', - * double if set to 'double' or both if otherwise set. - * Default is ENT_NOQUOTES. - * @return string The decoded text without HTML entities. - */ -function wp_specialchars_decode( $string, $quote_style = ENT_NOQUOTES ) { - $string = (string) $string; - - if ( 0 === strlen( $string ) ) { - return ''; - } - - // Don't bother if there are no entities - saves a lot of processing - if ( strpos( $string, '&' ) === false ) { - return $string; - } - - // Match the previous behaviour of _wp_specialchars() when the $quote_style is not an accepted value - if ( empty( $quote_style ) ) { - $quote_style = ENT_NOQUOTES; - } elseif ( !in_array( $quote_style, array( 0, 2, 3, 'single', 'double' ), true ) ) { - $quote_style = ENT_QUOTES; - } - - // More complete than get_html_translation_table( HTML_SPECIALCHARS ) - $single = array( ''' => '\'', ''' => '\'' ); - $single_preg = array( '/�*39;/' => ''', '/�*27;/i' => ''' ); - $double = array( '"' => '"', '"' => '"', '"' => '"' ); - $double_preg = array( '/�*34;/' => '"', '/�*22;/i' => '"' ); - $others = array( '<' => '<', '<' => '<', '>' => '>', '>' => '>', '&' => '&', '&' => '&', '&' => '&' ); - $others_preg = array( '/�*60;/' => '<', '/�*62;/' => '>', '/�*38;/' => '&', '/�*26;/i' => '&' ); - - if ( $quote_style === ENT_QUOTES ) { - $translation = array_merge( $single, $double, $others ); - $translation_preg = array_merge( $single_preg, $double_preg, $others_preg ); - } elseif ( $quote_style === ENT_COMPAT || $quote_style === 'double' ) { - $translation = array_merge( $double, $others ); - $translation_preg = array_merge( $double_preg, $others_preg ); - } elseif ( $quote_style === 'single' ) { - $translation = array_merge( $single, $others ); - $translation_preg = array_merge( $single_preg, $others_preg ); - } elseif ( $quote_style === ENT_NOQUOTES ) { - $translation = $others; - $translation_preg = $others_preg; - } - - // Remove zero padding on numeric entities - $string = preg_replace( array_keys( $translation_preg ), array_values( $translation_preg ), $string ); - - // Replace characters according to translation table - return strtr( $string, $translation ); -} - -/** - * Checks for invalid UTF8 in a string. - * - * @since 2.8.0 - * - * @staticvar bool $is_utf8 - * @staticvar bool $utf8_pcre - * - * @param string $string The text which is to be checked. - * @param bool $strip Optional. Whether to attempt to strip out invalid UTF8. Default is false. - * @return string The checked text. - */ -function wp_check_invalid_utf8( $string, $strip = false ) { - $string = (string) $string; - - if ( 0 === strlen( $string ) ) { - return ''; - } - - // Store the site charset as a static to avoid multiple calls to get_option() - static $is_utf8 = null; - if ( ! isset( $is_utf8 ) ) { - $is_utf8 = in_array( get_option( 'blog_charset' ), array( 'utf8', 'utf-8', 'UTF8', 'UTF-8' ) ); - } - if ( ! $is_utf8 ) { - return $string; - } - - // Check for support for utf8 in the installed PCRE library once and store the result in a static - static $utf8_pcre = null; - if ( ! isset( $utf8_pcre ) ) { - $utf8_pcre = @preg_match( '/^./u', 'a' ); - } - // We can't demand utf8 in the PCRE installation, so just return the string in those cases - if ( !$utf8_pcre ) { - return $string; - } - - // preg_match fails when it encounters invalid UTF8 in $string - if ( 1 === @preg_match( '/^./us', $string ) ) { - return $string; - } - - // Attempt to strip the bad chars if requested (not recommended) - if ( $strip && function_exists( 'iconv' ) ) { - return iconv( 'utf-8', 'utf-8', $string ); - } - - return ''; -} - -/** - * Encode the Unicode values to be used in the URI. - * - * @since 1.5.0 - * - * @param string $utf8_string - * @param int $length Max length of the string - * @return string String with Unicode encoded for URI. - */ -function utf8_uri_encode( $utf8_string, $length = 0 ) { - $unicode = ''; - $values = array(); - $num_octets = 1; - $unicode_length = 0; - - mbstring_binary_safe_encoding(); - $string_length = strlen( $utf8_string ); - reset_mbstring_encoding(); - - for ($i = 0; $i < $string_length; $i++ ) { - - $value = ord( $utf8_string[ $i ] ); - - if ( $value < 128 ) { - if ( $length && ( $unicode_length >= $length ) ) - break; - $unicode .= chr($value); - $unicode_length++; - } else { - if ( count( $values ) == 0 ) { - if ( $value < 224 ) { - $num_octets = 2; - } elseif ( $value < 240 ) { - $num_octets = 3; - } else { - $num_octets = 4; - } - } - - $values[] = $value; - - if ( $length && ( $unicode_length + ($num_octets * 3) ) > $length ) - break; - if ( count( $values ) == $num_octets ) { - for ( $j = 0; $j < $num_octets; $j++ ) { - $unicode .= '%' . dechex( $values[ $j ] ); - } - - $unicode_length += $num_octets * 3; - - $values = array(); - $num_octets = 1; - } - } - } - - return $unicode; -} - -/** - * Converts all accent characters to ASCII characters. - * - * If there are no accent characters, then the string given is just returned. - * - * **Accent characters converted:** - * - * Currency signs: - * - * | Code | Glyph | Replacement | Description | - * | -------- | ----- | ----------- | ------------------- | - * | U+00A3 | £ | (empty) | British Pound sign | - * | U+20AC | € | E | Euro sign | - * - * Decompositions for Latin-1 Supplement: - * - * | Code | Glyph | Replacement | Description | - * | ------- | ----- | ----------- | -------------------------------------- | - * | U+00AA | ª | a | Feminine ordinal indicator | - * | U+00BA | º | o | Masculine ordinal indicator | - * | U+00C0 | À | A | Latin capital letter A with grave | - * | U+00C1 | Á | A | Latin capital letter A with acute | - * | U+00C2 |  | A | Latin capital letter A with circumflex | - * | U+00C3 | à | A | Latin capital letter A with tilde | - * | U+00C4 | Ä | A | Latin capital letter A with diaeresis | - * | U+00C5 | Å | A | Latin capital letter A with ring above | - * | U+00C6 | Æ | AE | Latin capital letter AE | - * | U+00C7 | Ç | C | Latin capital letter C with cedilla | - * | U+00C8 | È | E | Latin capital letter E with grave | - * | U+00C9 | É | E | Latin capital letter E with acute | - * | U+00CA | Ê | E | Latin capital letter E with circumflex | - * | U+00CB | Ë | E | Latin capital letter E with diaeresis | - * | U+00CC | Ì | I | Latin capital letter I with grave | - * | U+00CD | Í | I | Latin capital letter I with acute | - * | U+00CE | Î | I | Latin capital letter I with circumflex | - * | U+00CF | Ï | I | Latin capital letter I with diaeresis | - * | U+00D0 | Ð | D | Latin capital letter Eth | - * | U+00D1 | Ñ | N | Latin capital letter N with tilde | - * | U+00D2 | Ò | O | Latin capital letter O with grave | - * | U+00D3 | Ó | O | Latin capital letter O with acute | - * | U+00D4 | Ô | O | Latin capital letter O with circumflex | - * | U+00D5 | Õ | O | Latin capital letter O with tilde | - * | U+00D6 | Ö | O | Latin capital letter O with diaeresis | - * | U+00D8 | Ø | O | Latin capital letter O with stroke | - * | U+00D9 | Ù | U | Latin capital letter U with grave | - * | U+00DA | Ú | U | Latin capital letter U with acute | - * | U+00DB | Û | U | Latin capital letter U with circumflex | - * | U+00DC | Ü | U | Latin capital letter U with diaeresis | - * | U+00DD | Ý | Y | Latin capital letter Y with acute | - * | U+00DE | Þ | TH | Latin capital letter Thorn | - * | U+00DF | ß | s | Latin small letter sharp s | - * | U+00E0 | à | a | Latin small letter a with grave | - * | U+00E1 | á | a | Latin small letter a with acute | - * | U+00E2 | â | a | Latin small letter a with circumflex | - * | U+00E3 | ã | a | Latin small letter a with tilde | - * | U+00E4 | ä | a | Latin small letter a with diaeresis | - * | U+00E5 | å | a | Latin small letter a with ring above | - * | U+00E6 | æ | ae | Latin small letter ae | - * | U+00E7 | ç | c | Latin small letter c with cedilla | - * | U+00E8 | è | e | Latin small letter e with grave | - * | U+00E9 | é | e | Latin small letter e with acute | - * | U+00EA | ê | e | Latin small letter e with circumflex | - * | U+00EB | ë | e | Latin small letter e with diaeresis | - * | U+00EC | ì | i | Latin small letter i with grave | - * | U+00ED | í | i | Latin small letter i with acute | - * | U+00EE | î | i | Latin small letter i with circumflex | - * | U+00EF | ï | i | Latin small letter i with diaeresis | - * | U+00F0 | ð | d | Latin small letter Eth | - * | U+00F1 | ñ | n | Latin small letter n with tilde | - * | U+00F2 | ò | o | Latin small letter o with grave | - * | U+00F3 | ó | o | Latin small letter o with acute | - * | U+00F4 | ô | o | Latin small letter o with circumflex | - * | U+00F5 | õ | o | Latin small letter o with tilde | - * | U+00F6 | ö | o | Latin small letter o with diaeresis | - * | U+00F8 | ø | o | Latin small letter o with stroke | - * | U+00F9 | ù | u | Latin small letter u with grave | - * | U+00FA | ú | u | Latin small letter u with acute | - * | U+00FB | û | u | Latin small letter u with circumflex | - * | U+00FC | ü | u | Latin small letter u with diaeresis | - * | U+00FD | ý | y | Latin small letter y with acute | - * | U+00FE | þ | th | Latin small letter Thorn | - * | U+00FF | ÿ | y | Latin small letter y with diaeresis | - * - * Decompositions for Latin Extended-A: - * - * | Code | Glyph | Replacement | Description | - * | ------- | ----- | ----------- | ------------------------------------------------- | - * | U+0100 | Ā | A | Latin capital letter A with macron | - * | U+0101 | ā | a | Latin small letter a with macron | - * | U+0102 | Ă | A | Latin capital letter A with breve | - * | U+0103 | ă | a | Latin small letter a with breve | - * | U+0104 | Ą | A | Latin capital letter A with ogonek | - * | U+0105 | ą | a | Latin small letter a with ogonek | - * | U+01006 | Ć | C | Latin capital letter C with acute | - * | U+0107 | ć | c | Latin small letter c with acute | - * | U+0108 | Ĉ | C | Latin capital letter C with circumflex | - * | U+0109 | ĉ | c | Latin small letter c with circumflex | - * | U+010A | Ċ | C | Latin capital letter C with dot above | - * | U+010B | ċ | c | Latin small letter c with dot above | - * | U+010C | Č | C | Latin capital letter C with caron | - * | U+010D | č | c | Latin small letter c with caron | - * | U+010E | Ď | D | Latin capital letter D with caron | - * | U+010F | ď | d | Latin small letter d with caron | - * | U+0110 | Đ | D | Latin capital letter D with stroke | - * | U+0111 | đ | d | Latin small letter d with stroke | - * | U+0112 | Ē | E | Latin capital letter E with macron | - * | U+0113 | ē | e | Latin small letter e with macron | - * | U+0114 | Ĕ | E | Latin capital letter E with breve | - * | U+0115 | ĕ | e | Latin small letter e with breve | - * | U+0116 | Ė | E | Latin capital letter E with dot above | - * | U+0117 | ė | e | Latin small letter e with dot above | - * | U+0118 | Ę | E | Latin capital letter E with ogonek | - * | U+0119 | ę | e | Latin small letter e with ogonek | - * | U+011A | Ě | E | Latin capital letter E with caron | - * | U+011B | ě | e | Latin small letter e with caron | - * | U+011C | Ĝ | G | Latin capital letter G with circumflex | - * | U+011D | ĝ | g | Latin small letter g with circumflex | - * | U+011E | Ğ | G | Latin capital letter G with breve | - * | U+011F | ğ | g | Latin small letter g with breve | - * | U+0120 | Ġ | G | Latin capital letter G with dot above | - * | U+0121 | ġ | g | Latin small letter g with dot above | - * | U+0122 | Ģ | G | Latin capital letter G with cedilla | - * | U+0123 | ģ | g | Latin small letter g with cedilla | - * | U+0124 | Ĥ | H | Latin capital letter H with circumflex | - * | U+0125 | ĥ | h | Latin small letter h with circumflex | - * | U+0126 | Ħ | H | Latin capital letter H with stroke | - * | U+0127 | ħ | h | Latin small letter h with stroke | - * | U+0128 | Ĩ | I | Latin capital letter I with tilde | - * | U+0129 | ĩ | i | Latin small letter i with tilde | - * | U+012A | Ī | I | Latin capital letter I with macron | - * | U+012B | ī | i | Latin small letter i with macron | - * | U+012C | Ĭ | I | Latin capital letter I with breve | - * | U+012D | ĭ | i | Latin small letter i with breve | - * | U+012E | Į | I | Latin capital letter I with ogonek | - * | U+012F | į | i | Latin small letter i with ogonek | - * | U+0130 | İ | I | Latin capital letter I with dot above | - * | U+0131 | ı | i | Latin small letter dotless i | - * | U+0132 | IJ | IJ | Latin capital ligature IJ | - * | U+0133 | ij | ij | Latin small ligature ij | - * | U+0134 | Ĵ | J | Latin capital letter J with circumflex | - * | U+0135 | ĵ | j | Latin small letter j with circumflex | - * | U+0136 | Ķ | K | Latin capital letter K with cedilla | - * | U+0137 | ķ | k | Latin small letter k with cedilla | - * | U+0138 | ĸ | k | Latin small letter Kra | - * | U+0139 | Ĺ | L | Latin capital letter L with acute | - * | U+013A | ĺ | l | Latin small letter l with acute | - * | U+013B | Ļ | L | Latin capital letter L with cedilla | - * | U+013C | ļ | l | Latin small letter l with cedilla | - * | U+013D | Ľ | L | Latin capital letter L with caron | - * | U+013E | ľ | l | Latin small letter l with caron | - * | U+013F | Ŀ | L | Latin capital letter L with middle dot | - * | U+0140 | ŀ | l | Latin small letter l with middle dot | - * | U+0141 | Ł | L | Latin capital letter L with stroke | - * | U+0142 | ł | l | Latin small letter l with stroke | - * | U+0143 | Ń | N | Latin capital letter N with acute | - * | U+0144 | ń | n | Latin small letter N with acute | - * | U+0145 | Ņ | N | Latin capital letter N with cedilla | - * | U+0146 | ņ | n | Latin small letter n with cedilla | - * | U+0147 | Ň | N | Latin capital letter N with caron | - * | U+0148 | ň | n | Latin small letter n with caron | - * | U+0149 | ʼn | n | Latin small letter n preceded by apostrophe | - * | U+014A | Ŋ | N | Latin capital letter Eng | - * | U+014B | ŋ | n | Latin small letter Eng | - * | U+014C | Ō | O | Latin capital letter O with macron | - * | U+014D | ō | o | Latin small letter o with macron | - * | U+014E | Ŏ | O | Latin capital letter O with breve | - * | U+014F | ŏ | o | Latin small letter o with breve | - * | U+0150 | Ő | O | Latin capital letter O with double acute | - * | U+0151 | ő | o | Latin small letter o with double acute | - * | U+0152 | Œ | OE | Latin capital ligature OE | - * | U+0153 | œ | oe | Latin small ligature oe | - * | U+0154 | Ŕ | R | Latin capital letter R with acute | - * | U+0155 | ŕ | r | Latin small letter r with acute | - * | U+0156 | Ŗ | R | Latin capital letter R with cedilla | - * | U+0157 | ŗ | r | Latin small letter r with cedilla | - * | U+0158 | Ř | R | Latin capital letter R with caron | - * | U+0159 | ř | r | Latin small letter r with caron | - * | U+015A | Ś | S | Latin capital letter S with acute | - * | U+015B | ś | s | Latin small letter s with acute | - * | U+015C | Ŝ | S | Latin capital letter S with circumflex | - * | U+015D | ŝ | s | Latin small letter s with circumflex | - * | U+015E | Ş | S | Latin capital letter S with cedilla | - * | U+015F | ş | s | Latin small letter s with cedilla | - * | U+0160 | Š | S | Latin capital letter S with caron | - * | U+0161 | š | s | Latin small letter s with caron | - * | U+0162 | Ţ | T | Latin capital letter T with cedilla | - * | U+0163 | ţ | t | Latin small letter t with cedilla | - * | U+0164 | Ť | T | Latin capital letter T with caron | - * | U+0165 | ť | t | Latin small letter t with caron | - * | U+0166 | Ŧ | T | Latin capital letter T with stroke | - * | U+0167 | ŧ | t | Latin small letter t with stroke | - * | U+0168 | Ũ | U | Latin capital letter U with tilde | - * | U+0169 | ũ | u | Latin small letter u with tilde | - * | U+016A | Ū | U | Latin capital letter U with macron | - * | U+016B | ū | u | Latin small letter u with macron | - * | U+016C | Ŭ | U | Latin capital letter U with breve | - * | U+016D | ŭ | u | Latin small letter u with breve | - * | U+016E | Ů | U | Latin capital letter U with ring above | - * | U+016F | ů | u | Latin small letter u with ring above | - * | U+0170 | Ű | U | Latin capital letter U with double acute | - * | U+0171 | ű | u | Latin small letter u with double acute | - * | U+0172 | Ų | U | Latin capital letter U with ogonek | - * | U+0173 | ų | u | Latin small letter u with ogonek | - * | U+0174 | Ŵ | W | Latin capital letter W with circumflex | - * | U+0175 | ŵ | w | Latin small letter w with circumflex | - * | U+0176 | Ŷ | Y | Latin capital letter Y with circumflex | - * | U+0177 | ŷ | y | Latin small letter y with circumflex | - * | U+0178 | Ÿ | Y | Latin capital letter Y with diaeresis | - * | U+0179 | Ź | Z | Latin capital letter Z with acute | - * | U+017A | ź | z | Latin small letter z with acute | - * | U+017B | Ż | Z | Latin capital letter Z with dot above | - * | U+017C | ż | z | Latin small letter z with dot above | - * | U+017D | Ž | Z | Latin capital letter Z with caron | - * | U+017E | ž | z | Latin small letter z with caron | - * | U+017F | ſ | s | Latin small letter long s | - * | U+01A0 | Ơ | O | Latin capital letter O with horn | - * | U+01A1 | ơ | o | Latin small letter o with horn | - * | U+01AF | Ư | U | Latin capital letter U with horn | - * | U+01B0 | ư | u | Latin small letter u with horn | - * | U+01CD | Ǎ | A | Latin capital letter A with caron | - * | U+01CE | ǎ | a | Latin small letter a with caron | - * | U+01CF | Ǐ | I | Latin capital letter I with caron | - * | U+01D0 | ǐ | i | Latin small letter i with caron | - * | U+01D1 | Ǒ | O | Latin capital letter O with caron | - * | U+01D2 | ǒ | o | Latin small letter o with caron | - * | U+01D3 | Ǔ | U | Latin capital letter U with caron | - * | U+01D4 | ǔ | u | Latin small letter u with caron | - * | U+01D5 | Ǖ | U | Latin capital letter U with diaeresis and macron | - * | U+01D6 | ǖ | u | Latin small letter u with diaeresis and macron | - * | U+01D7 | Ǘ | U | Latin capital letter U with diaeresis and acute | - * | U+01D8 | ǘ | u | Latin small letter u with diaeresis and acute | - * | U+01D9 | Ǚ | U | Latin capital letter U with diaeresis and caron | - * | U+01DA | ǚ | u | Latin small letter u with diaeresis and caron | - * | U+01DB | Ǜ | U | Latin capital letter U with diaeresis and grave | - * | U+01DC | ǜ | u | Latin small letter u with diaeresis and grave | - * - * Decompositions for Latin Extended-B: - * - * | Code | Glyph | Replacement | Description | - * | -------- | ----- | ----------- | ----------------------------------------- | - * | U+0218 | Ș | S | Latin capital letter S with comma below | - * | U+0219 | ș | s | Latin small letter s with comma below | - * | U+021A | Ț | T | Latin capital letter T with comma below | - * | U+021B | ț | t | Latin small letter t with comma below | - * - * Vowels with diacritic (Chinese, Hanyu Pinyin): - * - * | Code | Glyph | Replacement | Description | - * | -------- | ----- | ----------- | ----------------------------------------------------- | - * | U+0251 | ɑ | a | Latin small letter alpha | - * | U+1EA0 | Ạ | A | Latin capital letter A with dot below | - * | U+1EA1 | ạ | a | Latin small letter a with dot below | - * | U+1EA2 | Ả | A | Latin capital letter A with hook above | - * | U+1EA3 | ả | a | Latin small letter a with hook above | - * | U+1EA4 | Ấ | A | Latin capital letter A with circumflex and acute | - * | U+1EA5 | ấ | a | Latin small letter a with circumflex and acute | - * | U+1EA6 | Ầ | A | Latin capital letter A with circumflex and grave | - * | U+1EA7 | ầ | a | Latin small letter a with circumflex and grave | - * | U+1EA8 | Ẩ | A | Latin capital letter A with circumflex and hook above | - * | U+1EA9 | ẩ | a | Latin small letter a with circumflex and hook above | - * | U+1EAA | Ẫ | A | Latin capital letter A with circumflex and tilde | - * | U+1EAB | ẫ | a | Latin small letter a with circumflex and tilde | - * | U+1EA6 | Ậ | A | Latin capital letter A with circumflex and dot below | - * | U+1EAD | ậ | a | Latin small letter a with circumflex and dot below | - * | U+1EAE | Ắ | A | Latin capital letter A with breve and acute | - * | U+1EAF | ắ | a | Latin small letter a with breve and acute | - * | U+1EB0 | Ằ | A | Latin capital letter A with breve and grave | - * | U+1EB1 | ằ | a | Latin small letter a with breve and grave | - * | U+1EB2 | Ẳ | A | Latin capital letter A with breve and hook above | - * | U+1EB3 | ẳ | a | Latin small letter a with breve and hook above | - * | U+1EB4 | Ẵ | A | Latin capital letter A with breve and tilde | - * | U+1EB5 | ẵ | a | Latin small letter a with breve and tilde | - * | U+1EB6 | Ặ | A | Latin capital letter A with breve and dot below | - * | U+1EB7 | ặ | a | Latin small letter a with breve and dot below | - * | U+1EB8 | Ẹ | E | Latin capital letter E with dot below | - * | U+1EB9 | ẹ | e | Latin small letter e with dot below | - * | U+1EBA | Ẻ | E | Latin capital letter E with hook above | - * | U+1EBB | ẻ | e | Latin small letter e with hook above | - * | U+1EBC | Ẽ | E | Latin capital letter E with tilde | - * | U+1EBD | ẽ | e | Latin small letter e with tilde | - * | U+1EBE | Ế | E | Latin capital letter E with circumflex and acute | - * | U+1EBF | ế | e | Latin small letter e with circumflex and acute | - * | U+1EC0 | Ề | E | Latin capital letter E with circumflex and grave | - * | U+1EC1 | ề | e | Latin small letter e with circumflex and grave | - * | U+1EC2 | Ể | E | Latin capital letter E with circumflex and hook above | - * | U+1EC3 | ể | e | Latin small letter e with circumflex and hook above | - * | U+1EC4 | Ễ | E | Latin capital letter E with circumflex and tilde | - * | U+1EC5 | ễ | e | Latin small letter e with circumflex and tilde | - * | U+1EC6 | Ệ | E | Latin capital letter E with circumflex and dot below | - * | U+1EC7 | ệ | e | Latin small letter e with circumflex and dot below | - * | U+1EC8 | Ỉ | I | Latin capital letter I with hook above | - * | U+1EC9 | ỉ | i | Latin small letter i with hook above | - * | U+1ECA | Ị | I | Latin capital letter I with dot below | - * | U+1ECB | ị | i | Latin small letter i with dot below | - * | U+1ECC | Ọ | O | Latin capital letter O with dot below | - * | U+1ECD | ọ | o | Latin small letter o with dot below | - * | U+1ECE | Ỏ | O | Latin capital letter O with hook above | - * | U+1ECF | ỏ | o | Latin small letter o with hook above | - * | U+1ED0 | Ố | O | Latin capital letter O with circumflex and acute | - * | U+1ED1 | ố | o | Latin small letter o with circumflex and acute | - * | U+1ED2 | Ồ | O | Latin capital letter O with circumflex and grave | - * | U+1ED3 | ồ | o | Latin small letter o with circumflex and grave | - * | U+1ED4 | Ổ | O | Latin capital letter O with circumflex and hook above | - * | U+1ED5 | ổ | o | Latin small letter o with circumflex and hook above | - * | U+1ED6 | Ỗ | O | Latin capital letter O with circumflex and tilde | - * | U+1ED7 | ỗ | o | Latin small letter o with circumflex and tilde | - * | U+1ED8 | Ộ | O | Latin capital letter O with circumflex and dot below | - * | U+1ED9 | ộ | o | Latin small letter o with circumflex and dot below | - * | U+1EDA | Ớ | O | Latin capital letter O with horn and acute | - * | U+1EDB | ớ | o | Latin small letter o with horn and acute | - * | U+1EDC | Ờ | O | Latin capital letter O with horn and grave | - * | U+1EDD | ờ | o | Latin small letter o with horn and grave | - * | U+1EDE | Ở | O | Latin capital letter O with horn and hook above | - * | U+1EDF | ở | o | Latin small letter o with horn and hook above | - * | U+1EE0 | Ỡ | O | Latin capital letter O with horn and tilde | - * | U+1EE1 | ỡ | o | Latin small letter o with horn and tilde | - * | U+1EE2 | Ợ | O | Latin capital letter O with horn and dot below | - * | U+1EE3 | ợ | o | Latin small letter o with horn and dot below | - * | U+1EE4 | Ụ | U | Latin capital letter U with dot below | - * | U+1EE5 | ụ | u | Latin small letter u with dot below | - * | U+1EE6 | Ủ | U | Latin capital letter U with hook above | - * | U+1EE7 | ủ | u | Latin small letter u with hook above | - * | U+1EE8 | Ứ | U | Latin capital letter U with horn and acute | - * | U+1EE9 | ứ | u | Latin small letter u with horn and acute | - * | U+1EEA | Ừ | U | Latin capital letter U with horn and grave | - * | U+1EEB | ừ | u | Latin small letter u with horn and grave | - * | U+1EEC | Ử | U | Latin capital letter U with horn and hook above | - * | U+1EED | ử | u | Latin small letter u with horn and hook above | - * | U+1EEE | Ữ | U | Latin capital letter U with horn and tilde | - * | U+1EEF | ữ | u | Latin small letter u with horn and tilde | - * | U+1EF0 | Ự | U | Latin capital letter U with horn and dot below | - * | U+1EF1 | ự | u | Latin small letter u with horn and dot below | - * | U+1EF2 | Ỳ | Y | Latin capital letter Y with grave | - * | U+1EF3 | ỳ | y | Latin small letter y with grave | - * | U+1EF4 | Ỵ | Y | Latin capital letter Y with dot below | - * | U+1EF5 | ỵ | y | Latin small letter y with dot below | - * | U+1EF6 | Ỷ | Y | Latin capital letter Y with hook above | - * | U+1EF7 | ỷ | y | Latin small letter y with hook above | - * | U+1EF8 | Ỹ | Y | Latin capital letter Y with tilde | - * | U+1EF9 | ỹ | y | Latin small letter y with tilde | - * - * German (`de_DE`), German formal (`de_DE_formal`), German (Switzerland) formal (`de_CH`), - * and German (Switzerland) informal (`de_CH_informal`) locales: - * - * | Code | Glyph | Replacement | Description | - * | -------- | ----- | ----------- | --------------------------------------- | - * | U+00C4 | Ä | Ae | Latin capital letter A with diaeresis | - * | U+00E4 | ä | ae | Latin small letter a with diaeresis | - * | U+00D6 | Ö | Oe | Latin capital letter O with diaeresis | - * | U+00F6 | ö | oe | Latin small letter o with diaeresis | - * | U+00DC | Ü | Ue | Latin capital letter U with diaeresis | - * | U+00FC | ü | ue | Latin small letter u with diaeresis | - * | U+00DF | ß | ss | Latin small letter sharp s | - * - * Danish (`da_DK`) locale: - * - * | Code | Glyph | Replacement | Description | - * | -------- | ----- | ----------- | --------------------------------------- | - * | U+00C6 | Æ | Ae | Latin capital letter AE | - * | U+00E6 | æ | ae | Latin small letter ae | - * | U+00D8 | Ø | Oe | Latin capital letter O with stroke | - * | U+00F8 | ø | oe | Latin small letter o with stroke | - * | U+00C5 | Å | Aa | Latin capital letter A with ring above | - * | U+00E5 | å | aa | Latin small letter a with ring above | - * - * Catalan (`ca`) locale: - * - * | Code | Glyph | Replacement | Description | - * | -------- | ----- | ----------- | --------------------------------------- | - * | U+00B7 | l·l | ll | Flown dot (between two Ls) | - * - * Serbian (`sr_RS`) locale: - * - * | Code | Glyph | Replacement | Description | - * | -------- | ----- | ----------- | --------------------------------------- | - * | U+0110 | Đ | DJ | Latin capital letter D with stroke | - * | U+0111 | đ | dj | Latin small letter d with stroke | - * - * @since 1.2.1 - * @since 4.6.0 Added locale support for `de_CH`, `de_CH_informal`, and `ca`. - * @since 4.7.0 Added locale support for `sr_RS`. - * - * @param string $string Text that might have accent characters - * @return string Filtered string with replaced "nice" characters. - */ -function remove_accents( $string ) { - if ( !preg_match('/[\x80-\xff]/', $string) ) - return $string; - - if (seems_utf8($string)) { - $chars = array( - // Decompositions for Latin-1 Supplement - 'ª' => 'a', 'º' => 'o', - 'À' => 'A', 'Á' => 'A', - 'Â' => 'A', 'Ã' => 'A', - 'Ä' => 'A', 'Å' => 'A', - 'Æ' => 'AE','Ç' => 'C', - 'È' => 'E', 'É' => 'E', - 'Ê' => 'E', 'Ë' => 'E', - 'Ì' => 'I', 'Í' => 'I', - 'Î' => 'I', 'Ï' => 'I', - 'Ð' => 'D', 'Ñ' => 'N', - 'Ò' => 'O', 'Ó' => 'O', - 'Ô' => 'O', 'Õ' => 'O', - 'Ö' => 'O', 'Ù' => 'U', - 'Ú' => 'U', 'Û' => 'U', - 'Ü' => 'U', 'Ý' => 'Y', - 'Þ' => 'TH','ß' => 's', - 'à' => 'a', 'á' => 'a', - 'â' => 'a', 'ã' => 'a', - 'ä' => 'a', 'å' => 'a', - 'æ' => 'ae','ç' => 'c', - 'è' => 'e', 'é' => 'e', - 'ê' => 'e', 'ë' => 'e', - 'ì' => 'i', 'í' => 'i', - 'î' => 'i', 'ï' => 'i', - 'ð' => 'd', 'ñ' => 'n', - 'ò' => 'o', 'ó' => 'o', - 'ô' => 'o', 'õ' => 'o', - 'ö' => 'o', 'ø' => 'o', - 'ù' => 'u', 'ú' => 'u', - 'û' => 'u', 'ü' => 'u', - 'ý' => 'y', 'þ' => 'th', - 'ÿ' => 'y', 'Ø' => 'O', - // Decompositions for Latin Extended-A - 'Ā' => 'A', 'ā' => 'a', - 'Ă' => 'A', 'ă' => 'a', - 'Ą' => 'A', 'ą' => 'a', - 'Ć' => 'C', 'ć' => 'c', - 'Ĉ' => 'C', 'ĉ' => 'c', - 'Ċ' => 'C', 'ċ' => 'c', - 'Č' => 'C', 'č' => 'c', - 'Ď' => 'D', 'ď' => 'd', - 'Đ' => 'D', 'đ' => 'd', - 'Ē' => 'E', 'ē' => 'e', - 'Ĕ' => 'E', 'ĕ' => 'e', - 'Ė' => 'E', 'ė' => 'e', - 'Ę' => 'E', 'ę' => 'e', - 'Ě' => 'E', 'ě' => 'e', - 'Ĝ' => 'G', 'ĝ' => 'g', - 'Ğ' => 'G', 'ğ' => 'g', - 'Ġ' => 'G', 'ġ' => 'g', - 'Ģ' => 'G', 'ģ' => 'g', - 'Ĥ' => 'H', 'ĥ' => 'h', - 'Ħ' => 'H', 'ħ' => 'h', - 'Ĩ' => 'I', 'ĩ' => 'i', - 'Ī' => 'I', 'ī' => 'i', - 'Ĭ' => 'I', 'ĭ' => 'i', - 'Į' => 'I', 'į' => 'i', - 'İ' => 'I', 'ı' => 'i', - 'IJ' => 'IJ','ij' => 'ij', - 'Ĵ' => 'J', 'ĵ' => 'j', - 'Ķ' => 'K', 'ķ' => 'k', - 'ĸ' => 'k', 'Ĺ' => 'L', - 'ĺ' => 'l', 'Ļ' => 'L', - 'ļ' => 'l', 'Ľ' => 'L', - 'ľ' => 'l', 'Ŀ' => 'L', - 'ŀ' => 'l', 'Ł' => 'L', - 'ł' => 'l', 'Ń' => 'N', - 'ń' => 'n', 'Ņ' => 'N', - 'ņ' => 'n', 'Ň' => 'N', - 'ň' => 'n', 'ʼn' => 'n', - 'Ŋ' => 'N', 'ŋ' => 'n', - 'Ō' => 'O', 'ō' => 'o', - 'Ŏ' => 'O', 'ŏ' => 'o', - 'Ő' => 'O', 'ő' => 'o', - 'Œ' => 'OE','œ' => 'oe', - 'Ŕ' => 'R','ŕ' => 'r', - 'Ŗ' => 'R','ŗ' => 'r', - 'Ř' => 'R','ř' => 'r', - 'Ś' => 'S','ś' => 's', - 'Ŝ' => 'S','ŝ' => 's', - 'Ş' => 'S','ş' => 's', - 'Š' => 'S', 'š' => 's', - 'Ţ' => 'T', 'ţ' => 't', - 'Ť' => 'T', 'ť' => 't', - 'Ŧ' => 'T', 'ŧ' => 't', - 'Ũ' => 'U', 'ũ' => 'u', - 'Ū' => 'U', 'ū' => 'u', - 'Ŭ' => 'U', 'ŭ' => 'u', - 'Ů' => 'U', 'ů' => 'u', - 'Ű' => 'U', 'ű' => 'u', - 'Ų' => 'U', 'ų' => 'u', - 'Ŵ' => 'W', 'ŵ' => 'w', - 'Ŷ' => 'Y', 'ŷ' => 'y', - 'Ÿ' => 'Y', 'Ź' => 'Z', - 'ź' => 'z', 'Ż' => 'Z', - 'ż' => 'z', 'Ž' => 'Z', - 'ž' => 'z', 'ſ' => 's', - // Decompositions for Latin Extended-B - 'Ș' => 'S', 'ș' => 's', - 'Ț' => 'T', 'ț' => 't', - // Euro Sign - '€' => 'E', - // GBP (Pound) Sign - '£' => '', - // Vowels with diacritic (Vietnamese) - // unmarked - 'Ơ' => 'O', 'ơ' => 'o', - 'Ư' => 'U', 'ư' => 'u', - // grave accent - 'Ầ' => 'A', 'ầ' => 'a', - 'Ằ' => 'A', 'ằ' => 'a', - 'Ề' => 'E', 'ề' => 'e', - 'Ồ' => 'O', 'ồ' => 'o', - 'Ờ' => 'O', 'ờ' => 'o', - 'Ừ' => 'U', 'ừ' => 'u', - 'Ỳ' => 'Y', 'ỳ' => 'y', - // hook - 'Ả' => 'A', 'ả' => 'a', - 'Ẩ' => 'A', 'ẩ' => 'a', - 'Ẳ' => 'A', 'ẳ' => 'a', - 'Ẻ' => 'E', 'ẻ' => 'e', - 'Ể' => 'E', 'ể' => 'e', - 'Ỉ' => 'I', 'ỉ' => 'i', - 'Ỏ' => 'O', 'ỏ' => 'o', - 'Ổ' => 'O', 'ổ' => 'o', - 'Ở' => 'O', 'ở' => 'o', - 'Ủ' => 'U', 'ủ' => 'u', - 'Ử' => 'U', 'ử' => 'u', - 'Ỷ' => 'Y', 'ỷ' => 'y', - // tilde - 'Ẫ' => 'A', 'ẫ' => 'a', - 'Ẵ' => 'A', 'ẵ' => 'a', - 'Ẽ' => 'E', 'ẽ' => 'e', - 'Ễ' => 'E', 'ễ' => 'e', - 'Ỗ' => 'O', 'ỗ' => 'o', - 'Ỡ' => 'O', 'ỡ' => 'o', - 'Ữ' => 'U', 'ữ' => 'u', - 'Ỹ' => 'Y', 'ỹ' => 'y', - // acute accent - 'Ấ' => 'A', 'ấ' => 'a', - 'Ắ' => 'A', 'ắ' => 'a', - 'Ế' => 'E', 'ế' => 'e', - 'Ố' => 'O', 'ố' => 'o', - 'Ớ' => 'O', 'ớ' => 'o', - 'Ứ' => 'U', 'ứ' => 'u', - // dot below - 'Ạ' => 'A', 'ạ' => 'a', - 'Ậ' => 'A', 'ậ' => 'a', - 'Ặ' => 'A', 'ặ' => 'a', - 'Ẹ' => 'E', 'ẹ' => 'e', - 'Ệ' => 'E', 'ệ' => 'e', - 'Ị' => 'I', 'ị' => 'i', - 'Ọ' => 'O', 'ọ' => 'o', - 'Ộ' => 'O', 'ộ' => 'o', - 'Ợ' => 'O', 'ợ' => 'o', - 'Ụ' => 'U', 'ụ' => 'u', - 'Ự' => 'U', 'ự' => 'u', - 'Ỵ' => 'Y', 'ỵ' => 'y', - // Vowels with diacritic (Chinese, Hanyu Pinyin) - 'ɑ' => 'a', - // macron - 'Ǖ' => 'U', 'ǖ' => 'u', - // acute accent - 'Ǘ' => 'U', 'ǘ' => 'u', - // caron - 'Ǎ' => 'A', 'ǎ' => 'a', - 'Ǐ' => 'I', 'ǐ' => 'i', - 'Ǒ' => 'O', 'ǒ' => 'o', - 'Ǔ' => 'U', 'ǔ' => 'u', - 'Ǚ' => 'U', 'ǚ' => 'u', - // grave accent - 'Ǜ' => 'U', 'ǜ' => 'u', - ); - - // Used for locale-specific rules - $locale = get_locale(); - - if ( 'de_DE' == $locale || 'de_DE_formal' == $locale || 'de_CH' == $locale || 'de_CH_informal' == $locale ) { - $chars[ 'Ä' ] = 'Ae'; - $chars[ 'ä' ] = 'ae'; - $chars[ 'Ö' ] = 'Oe'; - $chars[ 'ö' ] = 'oe'; - $chars[ 'Ü' ] = 'Ue'; - $chars[ 'ü' ] = 'ue'; - $chars[ 'ß' ] = 'ss'; - } elseif ( 'da_DK' === $locale ) { - $chars[ 'Æ' ] = 'Ae'; - $chars[ 'æ' ] = 'ae'; - $chars[ 'Ø' ] = 'Oe'; - $chars[ 'ø' ] = 'oe'; - $chars[ 'Å' ] = 'Aa'; - $chars[ 'å' ] = 'aa'; - } elseif ( 'ca' === $locale ) { - $chars[ 'l·l' ] = 'll'; - } elseif ( 'sr_RS' === $locale ) { - $chars[ 'Đ' ] = 'DJ'; - $chars[ 'đ' ] = 'dj'; - } - - $string = strtr($string, $chars); - } else { - $chars = array(); - // Assume ISO-8859-1 if not UTF-8 - $chars['in'] = "\x80\x83\x8a\x8e\x9a\x9e" - ."\x9f\xa2\xa5\xb5\xc0\xc1\xc2" - ."\xc3\xc4\xc5\xc7\xc8\xc9\xca" - ."\xcb\xcc\xcd\xce\xcf\xd1\xd2" - ."\xd3\xd4\xd5\xd6\xd8\xd9\xda" - ."\xdb\xdc\xdd\xe0\xe1\xe2\xe3" - ."\xe4\xe5\xe7\xe8\xe9\xea\xeb" - ."\xec\xed\xee\xef\xf1\xf2\xf3" - ."\xf4\xf5\xf6\xf8\xf9\xfa\xfb" - ."\xfc\xfd\xff"; - - $chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy"; - - $string = strtr($string, $chars['in'], $chars['out']); - $double_chars = array(); - $double_chars['in'] = array("\x8c", "\x9c", "\xc6", "\xd0", "\xde", "\xdf", "\xe6", "\xf0", "\xfe"); - $double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th'); - $string = str_replace($double_chars['in'], $double_chars['out'], $string); - } - - return $string; -} - -/** - * Sanitizes a filename, replacing whitespace with dashes. - * - * Removes special characters that are illegal in filenames on certain - * operating systems and special characters requiring special escaping - * to manipulate at the command line. Replaces spaces and consecutive - * dashes with a single dash. Trims period, dash and underscore from beginning - * and end of filename. It is not guaranteed that this function will return a - * filename that is allowed to be uploaded. - * - * @since 2.1.0 - * - * @param string $filename The filename to be sanitized - * @return string The sanitized filename - */ -function sanitize_file_name( $filename ) { - $filename_raw = $filename; - $special_chars = array("?", "[", "]", "/", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&", "$", "#", "*", "(", ")", "|", "~", "`", "!", "{", "}", "%", "+", chr(0)); - /** - * Filters the list of characters to remove from a filename. - * - * @since 2.8.0 - * - * @param array $special_chars Characters to remove. - * @param string $filename_raw Filename as it was passed into sanitize_file_name(). - */ - $special_chars = apply_filters( 'sanitize_file_name_chars', $special_chars, $filename_raw ); - $filename = preg_replace( "#\x{00a0}#siu", ' ', $filename ); - $filename = str_replace( $special_chars, '', $filename ); - $filename = str_replace( array( '%20', '+' ), '-', $filename ); - $filename = preg_replace( '/[\r\n\t -]+/', '-', $filename ); - $filename = trim( $filename, '.-_' ); - - if ( false === strpos( $filename, '.' ) ) { - $mime_types = wp_get_mime_types(); - $filetype = wp_check_filetype( 'test.' . $filename, $mime_types ); - if ( $filetype['ext'] === $filename ) { - $filename = 'unnamed-file.' . $filetype['ext']; - } - } - - // Split the filename into a base and extension[s] - $parts = explode('.', $filename); - - // Return if only one extension - if ( count( $parts ) <= 2 ) { - /** - * Filters a sanitized filename string. - * - * @since 2.8.0 - * - * @param string $filename Sanitized filename. - * @param string $filename_raw The filename prior to sanitization. - */ - return apply_filters( 'sanitize_file_name', $filename, $filename_raw ); - } - - // Process multiple extensions - $filename = array_shift($parts); - $extension = array_pop($parts); - $mimes = get_allowed_mime_types(); - - /* - * Loop over any intermediate extensions. Postfix them with a trailing underscore - * if they are a 2 - 5 character long alpha string not in the extension whitelist. - */ - foreach ( (array) $parts as $part) { - $filename .= '.' . $part; - - if ( preg_match("/^[a-zA-Z]{2,5}\d?$/", $part) ) { - $allowed = false; - foreach ( $mimes as $ext_preg => $mime_match ) { - $ext_preg = '!^(' . $ext_preg . ')$!i'; - if ( preg_match( $ext_preg, $part ) ) { - $allowed = true; - break; - } - } - if ( !$allowed ) - $filename .= '_'; - } - } - $filename .= '.' . $extension; - /** This filter is documented in wp-includes/formatting.php */ - return apply_filters('sanitize_file_name', $filename, $filename_raw); -} - -/** - * Sanitizes a username, stripping out unsafe characters. - * - * Removes tags, octets, entities, and if strict is enabled, will only keep - * alphanumeric, _, space, ., -, @. After sanitizing, it passes the username, - * raw username (the username in the parameter), and the value of $strict as - * parameters for the {@see 'sanitize_user'} filter. - * - * @since 2.0.0 - * - * @param string $username The username to be sanitized. - * @param bool $strict If set limits $username to specific characters. Default false. - * @return string The sanitized username, after passing through filters. - */ -function sanitize_user( $username, $strict = false ) { - $raw_username = $username; - $username = wp_strip_all_tags( $username ); - $username = remove_accents( $username ); - // Kill octets - $username = preg_replace( '|%([a-fA-F0-9][a-fA-F0-9])|', '', $username ); - $username = preg_replace( '/&.+?;/', '', $username ); // Kill entities - - // If strict, reduce to ASCII for max portability. - if ( $strict ) - $username = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $username ); - - $username = trim( $username ); - // Consolidate contiguous whitespace - $username = preg_replace( '|\s+|', ' ', $username ); - - /** - * Filters a sanitized username string. - * - * @since 2.0.1 - * - * @param string $username Sanitized username. - * @param string $raw_username The username prior to sanitization. - * @param bool $strict Whether to limit the sanitization to specific characters. Default false. - */ - return apply_filters( 'sanitize_user', $username, $raw_username, $strict ); -} - -/** - * Sanitizes a string key. - * - * Keys are used as internal identifiers. Lowercase alphanumeric characters, dashes and underscores are allowed. - * - * @since 3.0.0 - * - * @param string $key String key - * @return string Sanitized key - */ -function sanitize_key( $key ) { - $raw_key = $key; - $key = strtolower( $key ); - $key = preg_replace( '/[^a-z0-9_\-]/', '', $key ); - - /** - * Filters a sanitized key string. - * - * @since 3.0.0 - * - * @param string $key Sanitized key. - * @param string $raw_key The key prior to sanitization. - */ - return apply_filters( 'sanitize_key', $key, $raw_key ); -} - -/** - * Sanitizes a title, or returns a fallback title. - * - * Specifically, HTML and PHP tags are stripped. Further actions can be added - * via the plugin API. If $title is empty and $fallback_title is set, the latter - * will be used. - * - * @since 1.0.0 - * - * @param string $title The string to be sanitized. - * @param string $fallback_title Optional. A title to use if $title is empty. - * @param string $context Optional. The operation for which the string is sanitized - * @return string The sanitized string. - */ -function sanitize_title( $title, $fallback_title = '', $context = 'save' ) { - $raw_title = $title; - - if ( 'save' == $context ) - $title = remove_accents($title); - - /** - * Filters a sanitized title string. - * - * @since 1.2.0 - * - * @param string $title Sanitized title. - * @param string $raw_title The title prior to sanitization. - * @param string $context The context for which the title is being sanitized. - */ - $title = apply_filters( 'sanitize_title', $title, $raw_title, $context ); - - if ( '' === $title || false === $title ) - $title = $fallback_title; - - return $title; -} - -/** - * Sanitizes a title with the 'query' context. - * - * Used for querying the database for a value from URL. - * - * @since 3.1.0 - * - * @param string $title The string to be sanitized. - * @return string The sanitized string. - */ -function sanitize_title_for_query( $title ) { - return sanitize_title( $title, '', 'query' ); -} - -/** - * Sanitizes a title, replacing whitespace and a few other characters with dashes. - * - * Limits the output to alphanumeric characters, underscore (_) and dash (-). - * Whitespace becomes a dash. - * - * @since 1.2.0 - * - * @param string $title The title to be sanitized. - * @param string $raw_title Optional. Not used. - * @param string $context Optional. The operation for which the string is sanitized. - * @return string The sanitized title. - */ -function sanitize_title_with_dashes( $title, $raw_title = '', $context = 'display' ) { - $title = strip_tags($title); - // Preserve escaped octets. - $title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title); - // Remove percent signs that are not part of an octet. - $title = str_replace('%', '', $title); - // Restore octets. - $title = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title); - - if (seems_utf8($title)) { - if (function_exists('mb_strtolower')) { - $title = mb_strtolower($title, 'UTF-8'); - } - $title = utf8_uri_encode($title, 200); - } - - $title = strtolower($title); - - if ( 'save' == $context ) { - // Convert nbsp, ndash and mdash to hyphens - $title = str_replace( array( '%c2%a0', '%e2%80%93', '%e2%80%94' ), '-', $title ); - // Convert nbsp, ndash and mdash HTML entities to hyphens - $title = str_replace( array( ' ', ' ', '–', '–', '—', '—' ), '-', $title ); - - // Strip these characters entirely - $title = str_replace( array( - // iexcl and iquest - '%c2%a1', '%c2%bf', - // angle quotes - '%c2%ab', '%c2%bb', '%e2%80%b9', '%e2%80%ba', - // curly quotes - '%e2%80%98', '%e2%80%99', '%e2%80%9c', '%e2%80%9d', - '%e2%80%9a', '%e2%80%9b', '%e2%80%9e', '%e2%80%9f', - // copy, reg, deg, hellip and trade - '%c2%a9', '%c2%ae', '%c2%b0', '%e2%80%a6', '%e2%84%a2', - // acute accents - '%c2%b4', '%cb%8a', '%cc%81', '%cd%81', - // grave accent, macron, caron - '%cc%80', '%cc%84', '%cc%8c', - ), '', $title ); - - // Convert times to x - $title = str_replace( '%c3%97', 'x', $title ); - } - - $title = preg_replace('/&.+?;/', '', $title); // kill entities - $title = str_replace('.', '-', $title); - - $title = preg_replace('/[^%a-z0-9 _-]/', '', $title); - $title = preg_replace('/\s+/', '-', $title); - $title = preg_replace('|-+|', '-', $title); - $title = trim($title, '-'); - - return $title; -} - -/** - * Ensures a string is a valid SQL 'order by' clause. - * - * Accepts one or more columns, with or without a sort order (ASC / DESC). - * e.g. 'column_1', 'column_1, column_2', 'column_1 ASC, column_2 DESC' etc. - * - * Also accepts 'RAND()'. - * - * @since 2.5.1 - * - * @param string $orderby Order by clause to be validated. - * @return string|false Returns $orderby if valid, false otherwise. - */ -function sanitize_sql_orderby( $orderby ) { - if ( preg_match( '/^\s*(([a-z0-9_]+|`[a-z0-9_]+`)(\s+(ASC|DESC))?\s*(,\s*(?=[a-z0-9_`])|$))+$/i', $orderby ) || preg_match( '/^\s*RAND\(\s*\)\s*$/i', $orderby ) ) { - return $orderby; - } - return false; -} - -/** - * Sanitizes an HTML classname to ensure it only contains valid characters. - * - * Strips the string down to A-Z,a-z,0-9,_,-. If this results in an empty - * string then it will return the alternative value supplied. - * - * @todo Expand to support the full range of CDATA that a class attribute can contain. - * - * @since 2.8.0 - * - * @param string $class The classname to be sanitized - * @param string $fallback Optional. The value to return if the sanitization ends up as an empty string. - * Defaults to an empty string. - * @return string The sanitized value - */ -function sanitize_html_class( $class, $fallback = '' ) { - //Strip out any % encoded octets - $sanitized = preg_replace( '|%[a-fA-F0-9][a-fA-F0-9]|', '', $class ); - - //Limit to A-Z,a-z,0-9,_,- - $sanitized = preg_replace( '/[^A-Za-z0-9_-]/', '', $sanitized ); - - if ( '' == $sanitized && $fallback ) { - return sanitize_html_class( $fallback ); - } - /** - * Filters a sanitized HTML class string. - * - * @since 2.8.0 - * - * @param string $sanitized The sanitized HTML class. - * @param string $class HTML class before sanitization. - * @param string $fallback The fallback string. - */ - return apply_filters( 'sanitize_html_class', $sanitized, $class, $fallback ); -} - -/** - * Converts lone & characters into `&` (a.k.a. `&`) - * - * @since 0.71 - * - * @param string $content String of characters to be converted. - * @param string $deprecated Not used. - * @return string Converted string. - */ -function convert_chars( $content, $deprecated = '' ) { - if ( ! empty( $deprecated ) ) { - _deprecated_argument( __FUNCTION__, '0.71' ); - } - - if ( strpos( $content, '&' ) !== false ) { - $content = preg_replace( '/&([^#])(?![a-z1-4]{1,8};)/i', '&$1', $content ); - } - - return $content; -} - -/** - * Converts invalid Unicode references range to valid range. - * - * @since 4.3.0 - * - * @param string $content String with entities that need converting. - * @return string Converted string. - */ -function convert_invalid_entities( $content ) { - $wp_htmltranswinuni = array( - '€' => '€', // the Euro sign - '' => '', - '‚' => '‚', // these are Windows CP1252 specific characters - 'ƒ' => 'ƒ', // they would look weird on non-Windows browsers - '„' => '„', - '…' => '…', - '†' => '†', - '‡' => '‡', - 'ˆ' => 'ˆ', - '‰' => '‰', - 'Š' => 'Š', - '‹' => '‹', - 'Œ' => 'Œ', - '' => '', - 'Ž' => 'Ž', - '' => '', - '' => '', - '‘' => '‘', - '’' => '’', - '“' => '“', - '”' => '”', - '•' => '•', - '–' => '–', - '—' => '—', - '˜' => '˜', - '™' => '™', - 'š' => 'š', - '›' => '›', - 'œ' => 'œ', - '' => '', - 'ž' => 'ž', - 'Ÿ' => 'Ÿ' - ); - - if ( strpos( $content, '' ) !== false ) { - $content = strtr( $content, $wp_htmltranswinuni ); - } - - return $content; -} - -/** - * Balances tags if forced to, or if the 'use_balanceTags' option is set to true. - * - * @since 0.71 - * - * @param string $text Text to be balanced - * @param bool $force If true, forces balancing, ignoring the value of the option. Default false. - * @return string Balanced text - */ -function balanceTags( $text, $force = false ) { - if ( $force || get_option('use_balanceTags') == 1 ) { - return force_balance_tags( $text ); - } else { - return $text; - } -} - -/** - * Balances tags of string using a modified stack. - * - * @since 2.0.4 - * - * @author Leonard Lin - * @license GPL - * @copyright November 4, 2001 - * @version 1.1 - * @todo Make better - change loop condition to $text in 1.2 - * @internal Modified by Scott Reilly (coffee2code) 02 Aug 2004 - * 1.1 Fixed handling of append/stack pop order of end text - * Added Cleaning Hooks - * 1.0 First Version - * - * @param string $text Text to be balanced. - * @return string Balanced text. - */ -function force_balance_tags( $text ) { - $tagstack = array(); - $stacksize = 0; - $tagqueue = ''; - $newtext = ''; - // Known single-entity/self-closing tags - $single_tags = array( 'area', 'base', 'basefont', 'br', 'col', 'command', 'embed', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param', 'source' ); - // Tags that can be immediately nested within themselves - $nestable_tags = array( 'blockquote', 'div', 'object', 'q', 'span' ); - - // WP bug fix for comments - in case you REALLY meant to type '< !--' - $text = str_replace('< !--', '< !--', $text); - // WP bug fix for LOVE <3 (and other situations with '<' before a number) - $text = preg_replace('#<([0-9]{1})#', '<$1', $text); - - while ( preg_match("/<(\/?[\w:]*)\s*([^>]*)>/", $text, $regex) ) { - $newtext .= $tagqueue; - - $i = strpos($text, $regex[0]); - $l = strlen($regex[0]); - - // clear the shifter - $tagqueue = ''; - // Pop or Push - if ( isset($regex[1][0]) && '/' == $regex[1][0] ) { // End Tag - $tag = strtolower(substr($regex[1],1)); - // if too many closing tags - if ( $stacksize <= 0 ) { - $tag = ''; - // or close to be safe $tag = '/' . $tag; - } - // if stacktop value = tag close value then pop - elseif ( $tagstack[$stacksize - 1] == $tag ) { // found closing tag - $tag = ''; // Close Tag - // Pop - array_pop( $tagstack ); - $stacksize--; - } else { // closing tag not at top, search for it - for ( $j = $stacksize-1; $j >= 0; $j-- ) { - if ( $tagstack[$j] == $tag ) { - // add tag to tagqueue - for ( $k = $stacksize-1; $k >= $j; $k--) { - $tagqueue .= ''; - $stacksize--; - } - break; - } - } - $tag = ''; - } - } else { // Begin Tag - $tag = strtolower($regex[1]); - - // Tag Cleaning - - // If it's an empty tag "< >", do nothing - if ( '' == $tag ) { - // do nothing - } - // ElseIf it presents itself as a self-closing tag... - elseif ( substr( $regex[2], -1 ) == '/' ) { - // ...but it isn't a known single-entity self-closing tag, then don't let it be treated as such and - // immediately close it with a closing tag (the tag will encapsulate no text as a result) - if ( ! in_array( $tag, $single_tags ) ) - $regex[2] = trim( substr( $regex[2], 0, -1 ) ) . "> 0 && !in_array($tag, $nestable_tags) && $tagstack[$stacksize - 1] == $tag ) { - $tagqueue = ''; - $stacksize--; - } - $stacksize = array_push( $tagstack, $tag ); - } - - // Attributes - $attributes = $regex[2]; - if ( ! empty( $attributes ) && $attributes[0] != '>' ) - $attributes = ' ' . $attributes; - - $tag = '<' . $tag . $attributes . '>'; - //If already queuing a close tag, then put this tag on, too - if ( !empty($tagqueue) ) { - $tagqueue .= $tag; - $tag = ''; - } - } - $newtext .= substr($text, 0, $i) . $tag; - $text = substr($text, $i + $l); - } - - // Clear Tag Queue - $newtext .= $tagqueue; - - // Add Remaining text - $newtext .= $text; - - // Empty Stack - while( $x = array_pop($tagstack) ) - $newtext .= ''; // Add remaining tags to close - - // WP fix for the bug with HTML comments - $newtext = str_replace("< !--"," -> - - - - - <?php echo $title ?> - - - - - - - - 500 ); - - $r = wp_parse_args($args, $defaults); - - if ( $wp_xmlrpc_server ) { - $error = new IXR_Error( $r['response'] , $message); - $wp_xmlrpc_server->output( $error->getXml() ); - } - die(); -} - -/** - * Kill WordPress ajax execution. - * - * This is the handler for wp_die when processing Ajax requests. - * - * @since 3.4.0 - * @access private - * - * @param string $message Error message. - * @param string $title Optional. Error title (unused). Default empty. - * @param string|array $args Optional. Arguments to control behavior. Default empty array. - */ -function _ajax_wp_die_handler( $message, $title = '', $args = array() ) { - $defaults = array( - 'response' => 200, - ); - $r = wp_parse_args( $args, $defaults ); - - if ( ! headers_sent() && null !== $r['response'] ) { - status_header( $r['response'] ); - } - - if ( is_scalar( $message ) ) - die( (string) $message ); - die( '0' ); -} - -/** - * Kill WordPress execution. - * - * This is the handler for wp_die when processing APP requests. - * - * @since 3.4.0 - * @access private - * - * @param string $message Optional. Response to print. Default empty. - */ -function _scalar_wp_die_handler( $message = '' ) { - if ( is_scalar( $message ) ) - die( (string) $message ); - die(); -} - -/** - * Encode a variable into JSON, with some sanity checks. - * - * @since 4.1.0 - * - * @param mixed $data Variable (usually an array or object) to encode as JSON. - * @param int $options Optional. Options to be passed to json_encode(). Default 0. - * @param int $depth Optional. Maximum depth to walk through $data. Must be - * greater than 0. Default 512. - * @return string|false The JSON encoded string, or false if it cannot be encoded. - */ -function wp_json_encode( $data, $options = 0, $depth = 512 ) { - /* - * json_encode() has had extra params added over the years. - * $options was added in 5.3, and $depth in 5.5. - * We need to make sure we call it with the correct arguments. - */ - if ( version_compare( PHP_VERSION, '5.5', '>=' ) ) { - $args = array( $data, $options, $depth ); - } elseif ( version_compare( PHP_VERSION, '5.3', '>=' ) ) { - $args = array( $data, $options ); - } else { - $args = array( $data ); - } - - // Prepare the data for JSON serialization. - $args[0] = _wp_json_prepare_data( $data ); - - $json = @call_user_func_array( 'json_encode', $args ); - - // If json_encode() was successful, no need to do more sanity checking. - // ... unless we're in an old version of PHP, and json_encode() returned - // a string containing 'null'. Then we need to do more sanity checking. - if ( false !== $json && ( version_compare( PHP_VERSION, '5.5', '>=' ) || false === strpos( $json, 'null' ) ) ) { - return $json; - } - - try { - $args[0] = _wp_json_sanity_check( $data, $depth ); - } catch ( Exception $e ) { - return false; - } - - return call_user_func_array( 'json_encode', $args ); -} - -/** - * Perform sanity checks on data that shall be encoded to JSON. - * - * @ignore - * @since 4.1.0 - * @access private - * - * @see wp_json_encode() - * - * @param mixed $data Variable (usually an array or object) to encode as JSON. - * @param int $depth Maximum depth to walk through $data. Must be greater than 0. - * @return mixed The sanitized data that shall be encoded to JSON. - */ -function _wp_json_sanity_check( $data, $depth ) { - if ( $depth < 0 ) { - throw new Exception( 'Reached depth limit' ); - } - - if ( is_array( $data ) ) { - $output = array(); - foreach ( $data as $id => $el ) { - // Don't forget to sanitize the ID! - if ( is_string( $id ) ) { - $clean_id = _wp_json_convert_string( $id ); - } else { - $clean_id = $id; - } - - // Check the element type, so that we're only recursing if we really have to. - if ( is_array( $el ) || is_object( $el ) ) { - $output[ $clean_id ] = _wp_json_sanity_check( $el, $depth - 1 ); - } elseif ( is_string( $el ) ) { - $output[ $clean_id ] = _wp_json_convert_string( $el ); - } else { - $output[ $clean_id ] = $el; - } - } - } elseif ( is_object( $data ) ) { - $output = new stdClass; - foreach ( $data as $id => $el ) { - if ( is_string( $id ) ) { - $clean_id = _wp_json_convert_string( $id ); - } else { - $clean_id = $id; - } - - if ( is_array( $el ) || is_object( $el ) ) { - $output->$clean_id = _wp_json_sanity_check( $el, $depth - 1 ); - } elseif ( is_string( $el ) ) { - $output->$clean_id = _wp_json_convert_string( $el ); - } else { - $output->$clean_id = $el; - } - } - } elseif ( is_string( $data ) ) { - return _wp_json_convert_string( $data ); - } else { - return $data; - } - - return $output; -} - -/** - * Convert a string to UTF-8, so that it can be safely encoded to JSON. - * - * @ignore - * @since 4.1.0 - * @access private - * - * @see _wp_json_sanity_check() - * - * @staticvar bool $use_mb - * - * @param string $string The string which is to be converted. - * @return string The checked string. - */ -function _wp_json_convert_string( $string ) { - static $use_mb = null; - if ( is_null( $use_mb ) ) { - $use_mb = function_exists( 'mb_convert_encoding' ); - } - - if ( $use_mb ) { - $encoding = mb_detect_encoding( $string, mb_detect_order(), true ); - if ( $encoding ) { - return mb_convert_encoding( $string, 'UTF-8', $encoding ); - } else { - return mb_convert_encoding( $string, 'UTF-8', 'UTF-8' ); - } - } else { - return wp_check_invalid_utf8( $string, true ); - } -} - -/** - * Prepares response data to be serialized to JSON. - * - * This supports the JsonSerializable interface for PHP 5.2-5.3 as well. - * - * @ignore - * @since 4.4.0 - * @access private - * - * @param mixed $data Native representation. - * @return bool|int|float|null|string|array Data ready for `json_encode()`. - */ -function _wp_json_prepare_data( $data ) { - if ( ! defined( 'WP_JSON_SERIALIZE_COMPATIBLE' ) || WP_JSON_SERIALIZE_COMPATIBLE === false ) { - return $data; - } - - switch ( gettype( $data ) ) { - case 'boolean': - case 'integer': - case 'double': - case 'string': - case 'NULL': - // These values can be passed through. - return $data; - - case 'array': - // Arrays must be mapped in case they also return objects. - return array_map( '_wp_json_prepare_data', $data ); - - case 'object': - // If this is an incomplete object (__PHP_Incomplete_Class), bail. - if ( ! is_object( $data ) ) { - return null; - } - - if ( $data instanceof JsonSerializable ) { - $data = $data->jsonSerialize(); - } else { - $data = get_object_vars( $data ); - } - - // Now, pass the array (or whatever was returned from jsonSerialize through). - return _wp_json_prepare_data( $data ); - - default: - return null; - } -} - -/** - * Send a JSON response back to an Ajax request. - * - * @since 3.5.0 - * @since 4.7.0 The `$status_code` parameter was added. - * - * @param mixed $response Variable (usually an array or object) to encode as JSON, - * then print and die. - * @param int $status_code The HTTP status code to output. - */ -function wp_send_json( $response, $status_code = null ) { - @header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) ); - if ( null !== $status_code ) { - status_header( $status_code ); - } - echo wp_json_encode( $response ); - - if ( wp_doing_ajax() ) { - wp_die( '', '', array( - 'response' => null, - ) ); - } else { - die; - } -} - -/** - * Send a JSON response back to an Ajax request, indicating success. - * - * @since 3.5.0 - * @since 4.7.0 The `$status_code` parameter was added. - * - * @param mixed $data Data to encode as JSON, then print and die. - * @param int $status_code The HTTP status code to output. - */ -function wp_send_json_success( $data = null, $status_code = null ) { - $response = array( 'success' => true ); - - if ( isset( $data ) ) - $response['data'] = $data; - - wp_send_json( $response, $status_code ); -} - -/** - * Send a JSON response back to an Ajax request, indicating failure. - * - * If the `$data` parameter is a WP_Error object, the errors - * within the object are processed and output as an array of error - * codes and corresponding messages. All other types are output - * without further processing. - * - * @since 3.5.0 - * @since 4.1.0 The `$data` parameter is now processed if a WP_Error object is passed in. - * @since 4.7.0 The `$status_code` parameter was added. - * - * @param mixed $data Data to encode as JSON, then print and die. - * @param int $status_code The HTTP status code to output. - */ -function wp_send_json_error( $data = null, $status_code = null ) { - $response = array( 'success' => false ); - - if ( isset( $data ) ) { - if ( is_wp_error( $data ) ) { - $result = array(); - foreach ( $data->errors as $code => $messages ) { - foreach ( $messages as $message ) { - $result[] = array( 'code' => $code, 'message' => $message ); - } - } - - $response['data'] = $result; - } else { - $response['data'] = $data; - } - } - - wp_send_json( $response, $status_code ); -} - -/** - * Checks that a JSONP callback is a valid JavaScript callback. - * - * Only allows alphanumeric characters and the dot character in callback - * function names. This helps to mitigate XSS attacks caused by directly - * outputting user input. - * - * @since 4.6.0 - * - * @param string $callback Supplied JSONP callback function. - * @return bool True if valid callback, otherwise false. - */ -function wp_check_jsonp_callback( $callback ) { - if ( ! is_string( $callback ) ) { - return false; - } - - preg_replace( '/[^\w\.]/', '', $callback, -1, $illegal_char_count ); - - return 0 === $illegal_char_count; -} - -/** - * Retrieve the WordPress home page URL. - * - * If the constant named 'WP_HOME' exists, then it will be used and returned - * by the function. This can be used to counter the redirection on your local - * development environment. - * - * @since 2.2.0 - * @access private - * - * @see WP_HOME - * - * @param string $url URL for the home location. - * @return string Homepage location. - */ -function _config_wp_home( $url = '' ) { - if ( defined( 'WP_HOME' ) ) - return untrailingslashit( WP_HOME ); - return $url; -} - -/** - * Retrieve the WordPress site URL. - * - * If the constant named 'WP_SITEURL' is defined, then the value in that - * constant will always be returned. This can be used for debugging a site - * on your localhost while not having to change the database to your URL. - * - * @since 2.2.0 - * @access private - * - * @see WP_SITEURL - * - * @param string $url URL to set the WordPress site location. - * @return string The WordPress Site URL. - */ -function _config_wp_siteurl( $url = '' ) { - if ( defined( 'WP_SITEURL' ) ) - return untrailingslashit( WP_SITEURL ); - return $url; -} - -/** - * Delete the fresh site option. - * - * @since 4.7.0 - * @access private - */ -function _delete_option_fresh_site() { - update_option( 'fresh_site', 0 ); -} - -/** - * Set the localized direction for MCE plugin. - * - * Will only set the direction to 'rtl', if the WordPress locale has - * the text direction set to 'rtl'. - * - * Fills in the 'directionality' setting, enables the 'directionality' - * plugin, and adds the 'ltr' button to 'toolbar1', formerly - * 'theme_advanced_buttons1' array keys. These keys are then returned - * in the $mce_init (TinyMCE settings) array. - * - * @since 2.1.0 - * @access private - * - * @param array $mce_init MCE settings array. - * @return array Direction set for 'rtl', if needed by locale. - */ -function _mce_set_direction( $mce_init ) { - if ( is_rtl() ) { - $mce_init['directionality'] = 'rtl'; - $mce_init['rtl_ui'] = true; - - if ( ! empty( $mce_init['plugins'] ) && strpos( $mce_init['plugins'], 'directionality' ) === false ) { - $mce_init['plugins'] .= ',directionality'; - } - - if ( ! empty( $mce_init['toolbar1'] ) && ! preg_match( '/\bltr\b/', $mce_init['toolbar1'] ) ) { - $mce_init['toolbar1'] .= ',ltr'; - } - } - - return $mce_init; -} - - -/** - * Convert smiley code to the icon graphic file equivalent. - * - * You can turn off smilies, by going to the write setting screen and unchecking - * the box, or by setting 'use_smilies' option to false or removing the option. - * - * Plugins may override the default smiley list by setting the $wpsmiliestrans - * to an array, with the key the code the blogger types in and the value the - * image file. - * - * The $wp_smiliessearch global is for the regular expression and is set each - * time the function is called. - * - * The full list of smilies can be found in the function and won't be listed in - * the description. Probably should create a Codex page for it, so that it is - * available. - * - * @global array $wpsmiliestrans - * @global array $wp_smiliessearch - * - * @since 2.2.0 - */ -function smilies_init() { - global $wpsmiliestrans, $wp_smiliessearch; - - // don't bother setting up smilies if they are disabled - if ( !get_option( 'use_smilies' ) ) - return; - - if ( !isset( $wpsmiliestrans ) ) { - $wpsmiliestrans = array( - ':mrgreen:' => 'mrgreen.png', - ':neutral:' => "\xf0\x9f\x98\x90", - ':twisted:' => "\xf0\x9f\x98\x88", - ':arrow:' => "\xe2\x9e\xa1", - ':shock:' => "\xf0\x9f\x98\xaf", - ':smile:' => "\xf0\x9f\x99\x82", - ':???:' => "\xf0\x9f\x98\x95", - ':cool:' => "\xf0\x9f\x98\x8e", - ':evil:' => "\xf0\x9f\x91\xbf", - ':grin:' => "\xf0\x9f\x98\x80", - ':idea:' => "\xf0\x9f\x92\xa1", - ':oops:' => "\xf0\x9f\x98\xb3", - ':razz:' => "\xf0\x9f\x98\x9b", - ':roll:' => "\xf0\x9f\x99\x84", - ':wink:' => "\xf0\x9f\x98\x89", - ':cry:' => "\xf0\x9f\x98\xa5", - ':eek:' => "\xf0\x9f\x98\xae", - ':lol:' => "\xf0\x9f\x98\x86", - ':mad:' => "\xf0\x9f\x98\xa1", - ':sad:' => "\xf0\x9f\x99\x81", - '8-)' => "\xf0\x9f\x98\x8e", - '8-O' => "\xf0\x9f\x98\xaf", - ':-(' => "\xf0\x9f\x99\x81", - ':-)' => "\xf0\x9f\x99\x82", - ':-?' => "\xf0\x9f\x98\x95", - ':-D' => "\xf0\x9f\x98\x80", - ':-P' => "\xf0\x9f\x98\x9b", - ':-o' => "\xf0\x9f\x98\xae", - ':-x' => "\xf0\x9f\x98\xa1", - ':-|' => "\xf0\x9f\x98\x90", - ';-)' => "\xf0\x9f\x98\x89", - // This one transformation breaks regular text with frequency. - // '8)' => "\xf0\x9f\x98\x8e", - '8O' => "\xf0\x9f\x98\xaf", - ':(' => "\xf0\x9f\x99\x81", - ':)' => "\xf0\x9f\x99\x82", - ':?' => "\xf0\x9f\x98\x95", - ':D' => "\xf0\x9f\x98\x80", - ':P' => "\xf0\x9f\x98\x9b", - ':o' => "\xf0\x9f\x98\xae", - ':x' => "\xf0\x9f\x98\xa1", - ':|' => "\xf0\x9f\x98\x90", - ';)' => "\xf0\x9f\x98\x89", - ':!:' => "\xe2\x9d\x97", - ':?:' => "\xe2\x9d\x93", - ); - } - - /** - * Filters all the smilies. - * - * This filter must be added before `smilies_init` is run, as - * it is normally only run once to setup the smilies regex. - * - * @since 4.7.0 - * - * @param array $wpsmiliestrans List of the smilies. - */ - $wpsmiliestrans = apply_filters('smilies', $wpsmiliestrans); - - if (count($wpsmiliestrans) == 0) { - return; - } - - /* - * NOTE: we sort the smilies in reverse key order. This is to make sure - * we match the longest possible smilie (:???: vs :?) as the regular - * expression used below is first-match - */ - krsort($wpsmiliestrans); - - $spaces = wp_spaces_regexp(); - - // Begin first "subpattern" - $wp_smiliessearch = '/(?<=' . $spaces . '|^)'; - - $subchar = ''; - foreach ( (array) $wpsmiliestrans as $smiley => $img ) { - $firstchar = substr($smiley, 0, 1); - $rest = substr($smiley, 1); - - // new subpattern? - if ($firstchar != $subchar) { - if ($subchar != '') { - $wp_smiliessearch .= ')(?=' . $spaces . '|$)'; // End previous "subpattern" - $wp_smiliessearch .= '|(?<=' . $spaces . '|^)'; // Begin another "subpattern" - } - $subchar = $firstchar; - $wp_smiliessearch .= preg_quote($firstchar, '/') . '(?:'; - } else { - $wp_smiliessearch .= '|'; - } - $wp_smiliessearch .= preg_quote($rest, '/'); - } - - $wp_smiliessearch .= ')(?=' . $spaces . '|$)/m'; - -} - -/** - * Merge user defined arguments into defaults array. - * - * This function is used throughout WordPress to allow for both string or array - * to be merged into another array. - * - * @since 2.2.0 - * @since 2.3.0 `$args` can now also be an object. - * - * @param string|array|object $args Value to merge with $defaults. - * @param array $defaults Optional. Array that serves as the defaults. Default empty. - * @return array Merged user defined values with defaults. - */ -function wp_parse_args( $args, $defaults = '' ) { - if ( is_object( $args ) ) - $r = get_object_vars( $args ); - elseif ( is_array( $args ) ) - $r =& $args; - else - wp_parse_str( $args, $r ); - - if ( is_array( $defaults ) ) - return array_merge( $defaults, $r ); - return $r; -} - -/** - * Clean up an array, comma- or space-separated list of IDs. - * - * @since 3.0.0 - * - * @param array|string $list List of ids. - * @return array Sanitized array of IDs. - */ -function wp_parse_id_list( $list ) { - if ( !is_array($list) ) - $list = preg_split('/[\s,]+/', $list); - - return array_unique(array_map('absint', $list)); -} - -/** - * Clean up an array, comma- or space-separated list of slugs. - * - * @since 4.7.0 - * - * @param array|string $list List of slugs. - * @return array Sanitized array of slugs. - */ -function wp_parse_slug_list( $list ) { - if ( ! is_array( $list ) ) { - $list = preg_split( '/[\s,]+/', $list ); - } - - foreach ( $list as $key => $value ) { - $list[ $key ] = sanitize_title( $value ); - } - - return array_unique( $list ); -} - -/** - * Extract a slice of an array, given a list of keys. - * - * @since 3.1.0 - * - * @param array $array The original array. - * @param array $keys The list of keys. - * @return array The array slice. - */ -function wp_array_slice_assoc( $array, $keys ) { - $slice = array(); - foreach ( $keys as $key ) - if ( isset( $array[ $key ] ) ) - $slice[ $key ] = $array[ $key ]; - - return $slice; -} - -/** - * Determines if the variable is a numeric-indexed array. - * - * @since 4.4.0 - * - * @param mixed $data Variable to check. - * @return bool Whether the variable is a list. - */ -function wp_is_numeric_array( $data ) { - if ( ! is_array( $data ) ) { - return false; - } - - $keys = array_keys( $data ); - $string_keys = array_filter( $keys, 'is_string' ); - return count( $string_keys ) === 0; -} - -/** - * Filters a list of objects, based on a set of key => value arguments. - * - * @since 3.0.0 - * @since 4.7.0 Uses WP_List_Util class. - * - * @param array $list An array of objects to filter - * @param array $args Optional. An array of key => value arguments to match - * against each object. Default empty array. - * @param string $operator Optional. The logical operation to perform. 'or' means - * only one element from the array needs to match; 'and' - * means all elements must match; 'not' means no elements may - * match. Default 'and'. - * @param bool|string $field A field from the object to place instead of the entire object. - * Default false. - * @return array A list of objects or object fields. - */ -function wp_filter_object_list( $list, $args = array(), $operator = 'and', $field = false ) { - if ( ! is_array( $list ) ) { - return array(); - } - - $util = new WP_List_Util( $list ); - - $util->filter( $args, $operator ); - - if ( $field ) { - $util->pluck( $field ); - } - - return $util->get_output(); -} - -/** - * Filters a list of objects, based on a set of key => value arguments. - * - * @since 3.1.0 - * @since 4.7.0 Uses WP_List_Util class. - * - * @param array $list An array of objects to filter. - * @param array $args Optional. An array of key => value arguments to match - * against each object. Default empty array. - * @param string $operator Optional. The logical operation to perform. 'AND' means - * all elements from the array must match. 'OR' means only - * one element needs to match. 'NOT' means no elements may - * match. Default 'AND'. - * @return array Array of found values. - */ -function wp_list_filter( $list, $args = array(), $operator = 'AND' ) { - if ( ! is_array( $list ) ) { - return array(); - } - - $util = new WP_List_Util( $list ); - return $util->filter( $args, $operator ); -} - -/** - * Pluck a certain field out of each object in a list. - * - * This has the same functionality and prototype of - * array_column() (PHP 5.5) but also supports objects. - * - * @since 3.1.0 - * @since 4.0.0 $index_key parameter added. - * @since 4.7.0 Uses WP_List_Util class. - * - * @param array $list List of objects or arrays - * @param int|string $field Field from the object to place instead of the entire object - * @param int|string $index_key Optional. Field from the object to use as keys for the new array. - * Default null. - * @return array Array of found values. If `$index_key` is set, an array of found values with keys - * corresponding to `$index_key`. If `$index_key` is null, array keys from the original - * `$list` will be preserved in the results. - */ -function wp_list_pluck( $list, $field, $index_key = null ) { - $util = new WP_List_Util( $list ); - return $util->pluck( $field, $index_key ); -} - -/** - * Sorts a list of objects, based on one or more orderby arguments. - * - * @since 4.7.0 - * - * @param array $list An array of objects to filter. - * @param string|array $orderby Optional. Either the field name to order by or an array - * of multiple orderby fields as $orderby => $order. - * @param string $order Optional. Either 'ASC' or 'DESC'. Only used if $orderby - * is a string. - * @param bool $preserve_keys Optional. Whether to preserve keys. Default false. - * @return array The sorted array. - */ -function wp_list_sort( $list, $orderby = array(), $order = 'ASC', $preserve_keys = false ) { - if ( ! is_array( $list ) ) { - return array(); - } - - $util = new WP_List_Util( $list ); - return $util->sort( $orderby, $order, $preserve_keys ); -} - -/** - * Determines if Widgets library should be loaded. - * - * Checks to make sure that the widgets library hasn't already been loaded. - * If it hasn't, then it will load the widgets library and run an action hook. - * - * @since 2.2.0 - */ -function wp_maybe_load_widgets() { - /** - * Filters whether to load the Widgets library. - * - * Passing a falsey value to the filter will effectively short-circuit - * the Widgets library from loading. - * - * @since 2.8.0 - * - * @param bool $wp_maybe_load_widgets Whether to load the Widgets library. - * Default true. - */ - if ( ! apply_filters( 'load_default_widgets', true ) ) { - return; - } - - require_once( ABSPATH . WPINC . '/default-widgets.php' ); - - add_action( '_admin_menu', 'wp_widgets_add_menu' ); -} - -/** - * Append the Widgets menu to the themes main menu. - * - * @since 2.2.0 - * - * @global array $submenu - */ -function wp_widgets_add_menu() { - global $submenu; - - if ( ! current_theme_supports( 'widgets' ) ) - return; - - $submenu['themes.php'][7] = array( __( 'Widgets' ), 'edit_theme_options', 'widgets.php' ); - ksort( $submenu['themes.php'], SORT_NUMERIC ); -} - -/** - * Flush all output buffers for PHP 5.2. - * - * Make sure all output buffers are flushed before our singletons are destroyed. - * - * @since 2.2.0 - */ -function wp_ob_end_flush_all() { - $levels = ob_get_level(); - for ($i=0; $i<$levels; $i++) - ob_end_flush(); -} - -/** - * Load custom DB error or display WordPress DB error. - * - * If a file exists in the wp-content directory named db-error.php, then it will - * be loaded instead of displaying the WordPress DB error. If it is not found, - * then the WordPress DB error will be displayed instead. - * - * The WordPress DB error sets the HTTP status header to 500 to try to prevent - * search engines from caching the message. Custom DB messages should do the - * same. - * - * This function was backported to WordPress 2.3.2, but originally was added - * in WordPress 2.5.0. - * - * @since 2.3.2 - * - * @global wpdb $wpdb WordPress database abstraction object. - */ -function dead_db() { - global $wpdb; - - wp_load_translations_early(); - - // Load custom DB error template, if present. - if ( file_exists( WP_CONTENT_DIR . '/db-error.php' ) ) { - require_once( WP_CONTENT_DIR . '/db-error.php' ); - die(); - } - - // If installing or in the admin, provide the verbose message. - if ( wp_installing() || defined( 'WP_ADMIN' ) ) - wp_die($wpdb->error); - - // Otherwise, be terse. - status_header( 500 ); - nocache_headers(); - header( 'Content-Type: text/html; charset=utf-8' ); -?> - -> - - - <?php _e( 'Database Error' ); ?> - - - -

      - - -deprecated
      since version %2$s! Use %3$s instead.'), $function, $version, $replacement ) ); - } else { - /* translators: 1: PHP function name, 2: version number */ - trigger_error( sprintf( __('%1$s is deprecated since version %2$s with no alternative available.'), $function, $version ) ); - } - } else { - if ( ! is_null( $replacement ) ) { - trigger_error( sprintf( '%1$s is deprecated since version %2$s! Use %3$s instead.', $function, $version, $replacement ) ); - } else { - trigger_error( sprintf( '%1$s is deprecated since version %2$s with no alternative available.', $function, $version ) ); - } - } - } -} - -/** - * Marks a constructor as deprecated and informs when it has been used. - * - * Similar to _deprecated_function(), but with different strings. Used to - * remove PHP4 style constructors. - * - * The current behavior is to trigger a user error if `WP_DEBUG` is true. - * - * This function is to be used in every PHP4 style constructor method that is deprecated. - * - * @since 4.3.0 - * @since 4.5.0 Added the `$parent_class` parameter. - * - * @access private - * - * @param string $class The class containing the deprecated constructor. - * @param string $version The version of WordPress that deprecated the function. - * @param string $parent_class Optional. The parent class calling the deprecated constructor. - * Default empty string. - */ -function _deprecated_constructor( $class, $version, $parent_class = '' ) { - - /** - * Fires when a deprecated constructor is called. - * - * @since 4.3.0 - * @since 4.5.0 Added the `$parent_class` parameter. - * - * @param string $class The class containing the deprecated constructor. - * @param string $version The version of WordPress that deprecated the function. - * @param string $parent_class The parent class calling the deprecated constructor. - */ - do_action( 'deprecated_constructor_run', $class, $version, $parent_class ); - - /** - * Filters whether to trigger an error for deprecated functions. - * - * `WP_DEBUG` must be true in addition to the filter evaluating to true. - * - * @since 4.3.0 - * - * @param bool $trigger Whether to trigger the error for deprecated functions. Default true. - */ - if ( WP_DEBUG && apply_filters( 'deprecated_constructor_trigger_error', true ) ) { - if ( function_exists( '__' ) ) { - if ( ! empty( $parent_class ) ) { - /* translators: 1: PHP class name, 2: PHP parent class name, 3: version number, 4: __construct() method */ - trigger_error( sprintf( __( 'The called constructor method for %1$s in %2$s is deprecated since version %3$s! Use %4$s instead.' ), - $class, $parent_class, $version, '
      __construct()
      ' ) ); - } else { - /* translators: 1: PHP class name, 2: version number, 3: __construct() method */ - trigger_error( sprintf( __( 'The called constructor method for %1$s is deprecated since version %2$s! Use %3$s instead.' ), - $class, $version, '
      __construct()
      ' ) ); - } - } else { - if ( ! empty( $parent_class ) ) { - trigger_error( sprintf( 'The called constructor method for %1$s in %2$s is deprecated since version %3$s! Use %4$s instead.', - $class, $parent_class, $version, '
      __construct()
      ' ) ); - } else { - trigger_error( sprintf( 'The called constructor method for %1$s is deprecated since version %2$s! Use %3$s instead.', - $class, $version, '
      __construct()
      ' ) ); - } - } - } - -} - -/** - * Mark a file as deprecated and inform when it has been used. - * - * There is a hook {@see 'deprecated_file_included'} that will be called that can be used - * to get the backtrace up to what file and function included the deprecated - * file. - * - * The current behavior is to trigger a user error if `WP_DEBUG` is true. - * - * This function is to be used in every file that is deprecated. - * - * @since 2.5.0 - * @access private - * - * @param string $file The file that was included. - * @param string $version The version of WordPress that deprecated the file. - * @param string $replacement Optional. The file that should have been included based on ABSPATH. - * Default null. - * @param string $message Optional. A message regarding the change. Default empty. - */ -function _deprecated_file( $file, $version, $replacement = null, $message = '' ) { - - /** - * Fires when a deprecated file is called. - * - * @since 2.5.0 - * - * @param string $file The file that was called. - * @param string $replacement The file that should have been included based on ABSPATH. - * @param string $version The version of WordPress that deprecated the file. - * @param string $message A message regarding the change. - */ - do_action( 'deprecated_file_included', $file, $replacement, $version, $message ); - - /** - * Filters whether to trigger an error for deprecated files. - * - * @since 2.5.0 - * - * @param bool $trigger Whether to trigger the error for deprecated files. Default true. - */ - if ( WP_DEBUG && apply_filters( 'deprecated_file_trigger_error', true ) ) { - $message = empty( $message ) ? '' : ' ' . $message; - if ( function_exists( '__' ) ) { - if ( ! is_null( $replacement ) ) { - /* translators: 1: PHP file name, 2: version number, 3: alternative file name */ - trigger_error( sprintf( __('%1$s is deprecated since version %2$s! Use %3$s instead.'), $file, $version, $replacement ) . $message ); - } else { - /* translators: 1: PHP file name, 2: version number */ - trigger_error( sprintf( __('%1$s is deprecated since version %2$s with no alternative available.'), $file, $version ) . $message ); - } - } else { - if ( ! is_null( $replacement ) ) { - trigger_error( sprintf( '%1$s is deprecated since version %2$s! Use %3$s instead.', $file, $version, $replacement ) . $message ); - } else { - trigger_error( sprintf( '%1$s is deprecated since version %2$s with no alternative available.', $file, $version ) . $message ); - } - } - } -} -/** - * Mark a function argument as deprecated and inform when it has been used. - * - * This function is to be used whenever a deprecated function argument is used. - * Before this function is called, the argument must be checked for whether it was - * used by comparing it to its default value or evaluating whether it is empty. - * For example: - * - * if ( ! empty( $deprecated ) ) { - * _deprecated_argument( __FUNCTION__, '3.0.0' ); - * } - * - * - * There is a hook deprecated_argument_run that will be called that can be used - * to get the backtrace up to what file and function used the deprecated - * argument. - * - * The current behavior is to trigger a user error if WP_DEBUG is true. - * - * @since 3.0.0 - * @access private - * - * @param string $function The function that was called. - * @param string $version The version of WordPress that deprecated the argument used. - * @param string $message Optional. A message regarding the change. Default null. - */ -function _deprecated_argument( $function, $version, $message = null ) { - - /** - * Fires when a deprecated argument is called. - * - * @since 3.0.0 - * - * @param string $function The function that was called. - * @param string $message A message regarding the change. - * @param string $version The version of WordPress that deprecated the argument used. - */ - do_action( 'deprecated_argument_run', $function, $message, $version ); - - /** - * Filters whether to trigger an error for deprecated arguments. - * - * @since 3.0.0 - * - * @param bool $trigger Whether to trigger the error for deprecated arguments. Default true. - */ - if ( WP_DEBUG && apply_filters( 'deprecated_argument_trigger_error', true ) ) { - if ( function_exists( '__' ) ) { - if ( ! is_null( $message ) ) { - /* translators: 1: PHP function name, 2: version number, 3: optional message regarding the change */ - trigger_error( sprintf( __('%1$s was called with an argument that is deprecated since version %2$s! %3$s'), $function, $version, $message ) ); - } else { - /* translators: 1: PHP function name, 2: version number */ - trigger_error( sprintf( __('%1$s was called with an argument that is deprecated since version %2$s with no alternative available.'), $function, $version ) ); - } - } else { - if ( ! is_null( $message ) ) { - trigger_error( sprintf( '%1$s was called with an argument that is deprecated since version %2$s! %3$s', $function, $version, $message ) ); - } else { - trigger_error( sprintf( '%1$s was called with an argument that is deprecated since version %2$s with no alternative available.', $function, $version ) ); - } - } - } -} - -/** - * Marks a deprecated action or filter hook as deprecated and throws a notice. - * - * Use the {@see 'deprecated_hook_run'} action to get the backtrace describing where - * the deprecated hook was called. - * - * Default behavior is to trigger a user error if `WP_DEBUG` is true. - * - * This function is called by the do_action_deprecated() and apply_filters_deprecated() - * functions, and so generally does not need to be called directly. - * - * @since 4.6.0 - * @access private - * - * @param string $hook The hook that was used. - * @param string $version The version of WordPress that deprecated the hook. - * @param string $replacement Optional. The hook that should have been used. - * @param string $message Optional. A message regarding the change. - */ -function _deprecated_hook( $hook, $version, $replacement = null, $message = null ) { - /** - * Fires when a deprecated hook is called. - * - * @since 4.6.0 - * - * @param string $hook The hook that was called. - * @param string $replacement The hook that should be used as a replacement. - * @param string $version The version of WordPress that deprecated the argument used. - * @param string $message A message regarding the change. - */ - do_action( 'deprecated_hook_run', $hook, $replacement, $version, $message ); - - /** - * Filters whether to trigger deprecated hook errors. - * - * @since 4.6.0 - * - * @param bool $trigger Whether to trigger deprecated hook errors. Requires - * `WP_DEBUG` to be defined true. - */ - if ( WP_DEBUG && apply_filters( 'deprecated_hook_trigger_error', true ) ) { - $message = empty( $message ) ? '' : ' ' . $message; - if ( ! is_null( $replacement ) ) { - /* translators: 1: WordPress hook name, 2: version number, 3: alternative hook name */ - trigger_error( sprintf( __( '%1$s is deprecated since version %2$s! Use %3$s instead.' ), $hook, $version, $replacement ) . $message ); - } else { - /* translators: 1: WordPress hook name, 2: version number */ - trigger_error( sprintf( __( '%1$s is deprecated since version %2$s with no alternative available.' ), $hook, $version ) . $message ); - } - } -} - -/** - * Mark something as being incorrectly called. - * - * There is a hook {@see 'doing_it_wrong_run'} that will be called that can be used - * to get the backtrace up to what file and function called the deprecated - * function. - * - * The current behavior is to trigger a user error if `WP_DEBUG` is true. - * - * @since 3.1.0 - * @access private - * - * @param string $function The function that was called. - * @param string $message A message explaining what has been done incorrectly. - * @param string $version The version of WordPress where the message was added. - */ -function _doing_it_wrong( $function, $message, $version ) { - - /** - * Fires when the given function is being used incorrectly. - * - * @since 3.1.0 - * - * @param string $function The function that was called. - * @param string $message A message explaining what has been done incorrectly. - * @param string $version The version of WordPress where the message was added. - */ - do_action( 'doing_it_wrong_run', $function, $message, $version ); - - /** - * Filters whether to trigger an error for _doing_it_wrong() calls. - * - * @since 3.1.0 - * - * @param bool $trigger Whether to trigger the error for _doing_it_wrong() calls. Default true. - */ - if ( WP_DEBUG && apply_filters( 'doing_it_wrong_trigger_error', true ) ) { - if ( function_exists( '__' ) ) { - if ( is_null( $version ) ) { - $version = ''; - } else { - /* translators: %s: version number */ - $version = sprintf( __( '(This message was added in version %s.)' ), $version ); - } - /* translators: %s: Codex URL */ - $message .= ' ' . sprintf( __( 'Please see Debugging in WordPress for more information.' ), - __( 'https://codex.wordpress.org/Debugging_in_WordPress' ) - ); - /* translators: Developer debugging message. 1: PHP function name, 2: Explanatory message, 3: Version information message */ - trigger_error( sprintf( __( '%1$s was called incorrectly. %2$s %3$s' ), $function, $message, $version ) ); - } else { - if ( is_null( $version ) ) { - $version = ''; - } else { - $version = sprintf( '(This message was added in version %s.)', $version ); - } - $message .= sprintf( ' Please see Debugging in WordPress for more information.', - 'https://codex.wordpress.org/Debugging_in_WordPress' - ); - trigger_error( sprintf( '%1$s was called incorrectly. %2$s %3$s', $function, $message, $version ) ); - } - } -} - -/** - * Is the server running earlier than 1.5.0 version of lighttpd? - * - * @since 2.5.0 - * - * @return bool Whether the server is running lighttpd < 1.5.0. - */ -function is_lighttpd_before_150() { - $server_parts = explode( '/', isset( $_SERVER['SERVER_SOFTWARE'] )? $_SERVER['SERVER_SOFTWARE'] : '' ); - $server_parts[1] = isset( $server_parts[1] )? $server_parts[1] : ''; - return 'lighttpd' == $server_parts[0] && -1 == version_compare( $server_parts[1], '1.5.0' ); -} - -/** - * Does the specified module exist in the Apache config? - * - * @since 2.5.0 - * - * @global bool $is_apache - * - * @param string $mod The module, e.g. mod_rewrite. - * @param bool $default Optional. The default return value if the module is not found. Default false. - * @return bool Whether the specified module is loaded. - */ -function apache_mod_loaded($mod, $default = false) { - global $is_apache; - - if ( !$is_apache ) - return false; - - if ( function_exists( 'apache_get_modules' ) ) { - $mods = apache_get_modules(); - if ( in_array($mod, $mods) ) - return true; - } elseif ( function_exists( 'phpinfo' ) && false === strpos( ini_get( 'disable_functions' ), 'phpinfo' ) ) { - ob_start(); - phpinfo(8); - $phpinfo = ob_get_clean(); - if ( false !== strpos($phpinfo, $mod) ) - return true; - } - return $default; -} - -/** - * Check if IIS 7+ supports pretty permalinks. - * - * @since 2.8.0 - * - * @global bool $is_iis7 - * - * @return bool Whether IIS7 supports permalinks. - */ -function iis7_supports_permalinks() { - global $is_iis7; - - $supports_permalinks = false; - if ( $is_iis7 ) { - /* First we check if the DOMDocument class exists. If it does not exist, then we cannot - * easily update the xml configuration file, hence we just bail out and tell user that - * pretty permalinks cannot be used. - * - * Next we check if the URL Rewrite Module 1.1 is loaded and enabled for the web site. When - * URL Rewrite 1.1 is loaded it always sets a server variable called 'IIS_UrlRewriteModule'. - * Lastly we make sure that PHP is running via FastCGI. This is important because if it runs - * via ISAPI then pretty permalinks will not work. - */ - $supports_permalinks = class_exists( 'DOMDocument', false ) && isset($_SERVER['IIS_UrlRewriteModule']) && ( PHP_SAPI == 'cgi-fcgi' ); - } - - /** - * Filters whether IIS 7+ supports pretty permalinks. - * - * @since 2.8.0 - * - * @param bool $supports_permalinks Whether IIS7 supports permalinks. Default false. - */ - return apply_filters( 'iis7_supports_permalinks', $supports_permalinks ); -} - -/** - * File validates against allowed set of defined rules. - * - * A return value of '1' means that the $file contains either '..' or './'. A - * return value of '2' means that the $file contains ':' after the first - * character. A return value of '3' means that the file is not in the allowed - * files list. - * - * @since 1.2.0 - * - * @param string $file File path. - * @param array $allowed_files List of allowed files. - * @return int 0 means nothing is wrong, greater than 0 means something was wrong. - */ -function validate_file( $file, $allowed_files = '' ) { - if ( false !== strpos( $file, '..' ) ) - return 1; - - if ( false !== strpos( $file, './' ) ) - return 1; - - if ( ! empty( $allowed_files ) && ! in_array( $file, $allowed_files ) ) - return 3; - - if (':' == substr( $file, 1, 1 ) ) - return 2; - - return 0; -} - -/** - * Whether to force SSL used for the Administration Screens. - * - * @since 2.6.0 - * - * @staticvar bool $forced - * - * @param string|bool $force Optional. Whether to force SSL in admin screens. Default null. - * @return bool True if forced, false if not forced. - */ -function force_ssl_admin( $force = null ) { - static $forced = false; - - if ( !is_null( $force ) ) { - $old_forced = $forced; - $forced = $force; - return $old_forced; - } - - return $forced; -} - -/** - * Guess the URL for the site. - * - * Will remove wp-admin links to retrieve only return URLs not in the wp-admin - * directory. - * - * @since 2.6.0 - * - * @return string The guessed URL. - */ -function wp_guess_url() { - if ( defined('WP_SITEURL') && '' != WP_SITEURL ) { - $url = WP_SITEURL; - } else { - $abspath_fix = str_replace( '\\', '/', ABSPATH ); - $script_filename_dir = dirname( $_SERVER['SCRIPT_FILENAME'] ); - - // The request is for the admin - if ( strpos( $_SERVER['REQUEST_URI'], 'wp-admin' ) !== false || strpos( $_SERVER['REQUEST_URI'], 'wp-login.php' ) !== false ) { - $path = preg_replace( '#/(wp-admin/.*|wp-login.php)#i', '', $_SERVER['REQUEST_URI'] ); - - // The request is for a file in ABSPATH - } elseif ( $script_filename_dir . '/' == $abspath_fix ) { - // Strip off any file/query params in the path - $path = preg_replace( '#/[^/]*$#i', '', $_SERVER['PHP_SELF'] ); - - } else { - if ( false !== strpos( $_SERVER['SCRIPT_FILENAME'], $abspath_fix ) ) { - // Request is hitting a file inside ABSPATH - $directory = str_replace( ABSPATH, '', $script_filename_dir ); - // Strip off the sub directory, and any file/query params - $path = preg_replace( '#/' . preg_quote( $directory, '#' ) . '/[^/]*$#i', '' , $_SERVER['REQUEST_URI'] ); - } elseif ( false !== strpos( $abspath_fix, $script_filename_dir ) ) { - // Request is hitting a file above ABSPATH - $subdirectory = substr( $abspath_fix, strpos( $abspath_fix, $script_filename_dir ) + strlen( $script_filename_dir ) ); - // Strip off any file/query params from the path, appending the sub directory to the install - $path = preg_replace( '#/[^/]*$#i', '' , $_SERVER['REQUEST_URI'] ) . $subdirectory; - } else { - $path = $_SERVER['REQUEST_URI']; - } - } - - $schema = is_ssl() ? 'https://' : 'http://'; // set_url_scheme() is not defined yet - $url = $schema . $_SERVER['HTTP_HOST'] . $path; - } - - return rtrim($url, '/'); -} - -/** - * Temporarily suspend cache additions. - * - * Stops more data being added to the cache, but still allows cache retrieval. - * This is useful for actions, such as imports, when a lot of data would otherwise - * be almost uselessly added to the cache. - * - * Suspension lasts for a single page load at most. Remember to call this - * function again if you wish to re-enable cache adds earlier. - * - * @since 3.3.0 - * - * @staticvar bool $_suspend - * - * @param bool $suspend Optional. Suspends additions if true, re-enables them if false. - * @return bool The current suspend setting - */ -function wp_suspend_cache_addition( $suspend = null ) { - static $_suspend = false; - - if ( is_bool( $suspend ) ) - $_suspend = $suspend; - - return $_suspend; -} - -/** - * Suspend cache invalidation. - * - * Turns cache invalidation on and off. Useful during imports where you don't wont to do - * invalidations every time a post is inserted. Callers must be sure that what they are - * doing won't lead to an inconsistent cache when invalidation is suspended. - * - * @since 2.7.0 - * - * @global bool $_wp_suspend_cache_invalidation - * - * @param bool $suspend Optional. Whether to suspend or enable cache invalidation. Default true. - * @return bool The current suspend setting. - */ -function wp_suspend_cache_invalidation( $suspend = true ) { - global $_wp_suspend_cache_invalidation; - - $current_suspend = $_wp_suspend_cache_invalidation; - $_wp_suspend_cache_invalidation = $suspend; - return $current_suspend; -} - -/** - * Determine whether a site is the main site of the current network. - * - * @since 3.0.0 - * - * @param int $site_id Optional. Site ID to test. Defaults to current site. - * @return bool True if $site_id is the main site of the network, or if not - * running Multisite. - */ -function is_main_site( $site_id = null ) { - if ( ! is_multisite() ) - return true; - - if ( ! $site_id ) - $site_id = get_current_blog_id(); - - return (int) $site_id === (int) get_network()->site_id; -} - -/** - * Determine whether a network is the main network of the Multisite install. - * - * @since 3.7.0 - * - * @param int $network_id Optional. Network ID to test. Defaults to current network. - * @return bool True if $network_id is the main network, or if not running Multisite. - */ -function is_main_network( $network_id = null ) { - if ( ! is_multisite() ) { - return true; - } - - if ( null === $network_id ) { - $network_id = get_current_network_id(); - } - - $network_id = (int) $network_id; - - return ( $network_id === get_main_network_id() ); -} - -/** - * Get the main network ID. - * - * @since 4.3.0 - * - * @return int The ID of the main network. - */ -function get_main_network_id() { - if ( ! is_multisite() ) { - return 1; - } - - $current_network = get_network(); - - if ( defined( 'PRIMARY_NETWORK_ID' ) ) { - $main_network_id = PRIMARY_NETWORK_ID; - } elseif ( isset( $current_network->id ) && 1 === (int) $current_network->id ) { - // If the current network has an ID of 1, assume it is the main network. - $main_network_id = 1; - } else { - $_networks = get_networks( array( 'fields' => 'ids', 'number' => 1 ) ); - $main_network_id = array_shift( $_networks ); - } - - /** - * Filters the main network ID. - * - * @since 4.3.0 - * - * @param int $main_network_id The ID of the main network. - */ - return (int) apply_filters( 'get_main_network_id', $main_network_id ); -} - -/** - * Determine whether global terms are enabled. - * - * @since 3.0.0 - * - * @staticvar bool $global_terms - * - * @return bool True if multisite and global terms enabled. - */ -function global_terms_enabled() { - if ( ! is_multisite() ) - return false; - - static $global_terms = null; - if ( is_null( $global_terms ) ) { - - /** - * Filters whether global terms are enabled. - * - * Passing a non-null value to the filter will effectively short-circuit the function, - * returning the value of the 'global_terms_enabled' site option instead. - * - * @since 3.0.0 - * - * @param null $enabled Whether global terms are enabled. - */ - $filter = apply_filters( 'global_terms_enabled', null ); - if ( ! is_null( $filter ) ) - $global_terms = (bool) $filter; - else - $global_terms = (bool) get_site_option( 'global_terms_enabled', false ); - } - return $global_terms; -} - -/** - * gmt_offset modification for smart timezone handling. - * - * Overrides the gmt_offset option if we have a timezone_string available. - * - * @since 2.8.0 - * - * @return float|false Timezone GMT offset, false otherwise. - */ -function wp_timezone_override_offset() { - if ( !$timezone_string = get_option( 'timezone_string' ) ) { - return false; - } - - $timezone_object = timezone_open( $timezone_string ); - $datetime_object = date_create(); - if ( false === $timezone_object || false === $datetime_object ) { - return false; - } - return round( timezone_offset_get( $timezone_object, $datetime_object ) / HOUR_IN_SECONDS, 2 ); -} - -/** - * Sort-helper for timezones. - * - * @since 2.9.0 - * @access private - * - * @param array $a - * @param array $b - * @return int - */ -function _wp_timezone_choice_usort_callback( $a, $b ) { - // Don't use translated versions of Etc - if ( 'Etc' === $a['continent'] && 'Etc' === $b['continent'] ) { - // Make the order of these more like the old dropdown - if ( 'GMT+' === substr( $a['city'], 0, 4 ) && 'GMT+' === substr( $b['city'], 0, 4 ) ) { - return -1 * ( strnatcasecmp( $a['city'], $b['city'] ) ); - } - if ( 'UTC' === $a['city'] ) { - if ( 'GMT+' === substr( $b['city'], 0, 4 ) ) { - return 1; - } - return -1; - } - if ( 'UTC' === $b['city'] ) { - if ( 'GMT+' === substr( $a['city'], 0, 4 ) ) { - return -1; - } - return 1; - } - return strnatcasecmp( $a['city'], $b['city'] ); - } - if ( $a['t_continent'] == $b['t_continent'] ) { - if ( $a['t_city'] == $b['t_city'] ) { - return strnatcasecmp( $a['t_subcity'], $b['t_subcity'] ); - } - return strnatcasecmp( $a['t_city'], $b['t_city'] ); - } else { - // Force Etc to the bottom of the list - if ( 'Etc' === $a['continent'] ) { - return 1; - } - if ( 'Etc' === $b['continent'] ) { - return -1; - } - return strnatcasecmp( $a['t_continent'], $b['t_continent'] ); - } -} - -/** - * Gives a nicely-formatted list of timezone strings. - * - * @since 2.9.0 - * @since 4.7.0 Added the `$locale` parameter. - * - * @staticvar bool $mo_loaded - * @staticvar string $locale_loaded - * - * @param string $selected_zone Selected timezone. - * @param string $locale Optional. Locale to load the timezones in. Default current site locale. - * @return string - */ -function wp_timezone_choice( $selected_zone, $locale = null ) { - static $mo_loaded = false, $locale_loaded = null; - - $continents = array( 'Africa', 'America', 'Antarctica', 'Arctic', 'Asia', 'Atlantic', 'Australia', 'Europe', 'Indian', 'Pacific'); - - // Load translations for continents and cities. - if ( ! $mo_loaded || $locale !== $locale_loaded ) { - $locale_loaded = $locale ? $locale : get_locale(); - $mofile = WP_LANG_DIR . '/continents-cities-' . $locale_loaded . '.mo'; - unload_textdomain( 'continents-cities' ); - load_textdomain( 'continents-cities', $mofile ); - $mo_loaded = true; - } - - $zonen = array(); - foreach ( timezone_identifiers_list() as $zone ) { - $zone = explode( '/', $zone ); - if ( !in_array( $zone[0], $continents ) ) { - continue; - } - - // This determines what gets set and translated - we don't translate Etc/* strings here, they are done later - $exists = array( - 0 => ( isset( $zone[0] ) && $zone[0] ), - 1 => ( isset( $zone[1] ) && $zone[1] ), - 2 => ( isset( $zone[2] ) && $zone[2] ), - ); - $exists[3] = ( $exists[0] && 'Etc' !== $zone[0] ); - $exists[4] = ( $exists[1] && $exists[3] ); - $exists[5] = ( $exists[2] && $exists[3] ); - - $zonen[] = array( - 'continent' => ( $exists[0] ? $zone[0] : '' ), - 'city' => ( $exists[1] ? $zone[1] : '' ), - 'subcity' => ( $exists[2] ? $zone[2] : '' ), - 't_continent' => ( $exists[3] ? translate( str_replace( '_', ' ', $zone[0] ), 'continents-cities' ) : '' ), - 't_city' => ( $exists[4] ? translate( str_replace( '_', ' ', $zone[1] ), 'continents-cities' ) : '' ), - 't_subcity' => ( $exists[5] ? translate( str_replace( '_', ' ', $zone[2] ), 'continents-cities' ) : '' ) - ); - } - usort( $zonen, '_wp_timezone_choice_usort_callback' ); - - $structure = array(); - - if ( empty( $selected_zone ) ) { - $structure[] = ''; - } - - foreach ( $zonen as $key => $zone ) { - // Build value in an array to join later - $value = array( $zone['continent'] ); - - if ( empty( $zone['city'] ) ) { - // It's at the continent level (generally won't happen) - $display = $zone['t_continent']; - } else { - // It's inside a continent group - - // Continent optgroup - if ( !isset( $zonen[$key - 1] ) || $zonen[$key - 1]['continent'] !== $zone['continent'] ) { - $label = $zone['t_continent']; - $structure[] = ''; - } - - // Add the city to the value - $value[] = $zone['city']; - - $display = $zone['t_city']; - if ( !empty( $zone['subcity'] ) ) { - // Add the subcity to the value - $value[] = $zone['subcity']; - $display .= ' - ' . $zone['t_subcity']; - } - } - - // Build the value - $value = join( '/', $value ); - $selected = ''; - if ( $value === $selected_zone ) { - $selected = 'selected="selected" '; - } - $structure[] = '"; - - // Close continent optgroup - if ( !empty( $zone['city'] ) && ( !isset($zonen[$key + 1]) || (isset( $zonen[$key + 1] ) && $zonen[$key + 1]['continent'] !== $zone['continent']) ) ) { - $structure[] = ''; - } - } - - // Do UTC - $structure[] = ''; - $selected = ''; - if ( 'UTC' === $selected_zone ) - $selected = 'selected="selected" '; - $structure[] = ''; - $structure[] = ''; - - // Do manual UTC offsets - $structure[] = ''; - $offset_range = array (-12, -11.5, -11, -10.5, -10, -9.5, -9, -8.5, -8, -7.5, -7, -6.5, -6, -5.5, -5, -4.5, -4, -3.5, -3, -2.5, -2, -1.5, -1, -0.5, - 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 5.75, 6, 6.5, 7, 7.5, 8, 8.5, 8.75, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.75, 13, 13.75, 14); - foreach ( $offset_range as $offset ) { - if ( 0 <= $offset ) - $offset_name = '+' . $offset; - else - $offset_name = (string) $offset; - - $offset_value = $offset_name; - $offset_name = str_replace(array('.25','.5','.75'), array(':15',':30',':45'), $offset_name); - $offset_name = 'UTC' . $offset_name; - $offset_value = 'UTC' . $offset_value; - $selected = ''; - if ( $offset_value === $selected_zone ) - $selected = 'selected="selected" '; - $structure[] = '"; - - } - $structure[] = ''; - - return join( "\n", $structure ); -} - -/** - * Strip close comment and close php tags from file headers used by WP. - * - * @since 2.8.0 - * @access private - * - * @see https://core.trac.wordpress.org/ticket/8497 - * - * @param string $str Header comment to clean up. - * @return string - */ -function _cleanup_header_comment( $str ) { - return trim(preg_replace("/\s*(?:\*\/|\?>).*/", '', $str)); -} - -/** - * Permanently delete comments or posts of any type that have held a status - * of 'trash' for the number of days defined in EMPTY_TRASH_DAYS. - * - * The default value of `EMPTY_TRASH_DAYS` is 30 (days). - * - * @since 2.9.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - */ -function wp_scheduled_delete() { - global $wpdb; - - $delete_timestamp = time() - ( DAY_IN_SECONDS * EMPTY_TRASH_DAYS ); - - $posts_to_delete = $wpdb->get_results($wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_wp_trash_meta_time' AND meta_value < '%d'", $delete_timestamp), ARRAY_A); - - foreach ( (array) $posts_to_delete as $post ) { - $post_id = (int) $post['post_id']; - if ( !$post_id ) - continue; - - $del_post = get_post($post_id); - - if ( !$del_post || 'trash' != $del_post->post_status ) { - delete_post_meta($post_id, '_wp_trash_meta_status'); - delete_post_meta($post_id, '_wp_trash_meta_time'); - } else { - wp_delete_post($post_id); - } - } - - $comments_to_delete = $wpdb->get_results($wpdb->prepare("SELECT comment_id FROM $wpdb->commentmeta WHERE meta_key = '_wp_trash_meta_time' AND meta_value < '%d'", $delete_timestamp), ARRAY_A); - - foreach ( (array) $comments_to_delete as $comment ) { - $comment_id = (int) $comment['comment_id']; - if ( !$comment_id ) - continue; - - $del_comment = get_comment($comment_id); - - if ( !$del_comment || 'trash' != $del_comment->comment_approved ) { - delete_comment_meta($comment_id, '_wp_trash_meta_time'); - delete_comment_meta($comment_id, '_wp_trash_meta_status'); - } else { - wp_delete_comment( $del_comment ); - } - } -} - -/** - * Retrieve metadata from a file. - * - * Searches for metadata in the first 8kiB of a file, such as a plugin or theme. - * Each piece of metadata must be on its own line. Fields can not span multiple - * lines, the value will get cut at the end of the first line. - * - * If the file data is not within that first 8kiB, then the author should correct - * their plugin file and move the data headers to the top. - * - * @link https://codex.wordpress.org/File_Header - * - * @since 2.9.0 - * - * @param string $file Path to the file. - * @param array $default_headers List of headers, in the format array('HeaderKey' => 'Header Name'). - * @param string $context Optional. If specified adds filter hook {@see 'extra_$context_headers'}. - * Default empty. - * @return array Array of file headers in `HeaderKey => Header Value` format. - */ -function get_file_data( $file, $default_headers, $context = '' ) { - // We don't need to write to the file, so just open for reading. - $fp = fopen( $file, 'r' ); - - // Pull only the first 8kiB of the file in. - $file_data = fread( $fp, 8192 ); - - // PHP will close file handle, but we are good citizens. - fclose( $fp ); - - // Make sure we catch CR-only line endings. - $file_data = str_replace( "\r", "\n", $file_data ); - - /** - * Filters extra file headers by context. - * - * The dynamic portion of the hook name, `$context`, refers to - * the context where extra headers might be loaded. - * - * @since 2.9.0 - * - * @param array $extra_context_headers Empty array by default. - */ - if ( $context && $extra_headers = apply_filters( "extra_{$context}_headers", array() ) ) { - $extra_headers = array_combine( $extra_headers, $extra_headers ); // keys equal values - $all_headers = array_merge( $extra_headers, (array) $default_headers ); - } else { - $all_headers = $default_headers; - } - - foreach ( $all_headers as $field => $regex ) { - if ( preg_match( '/^[ \t\/*#@]*' . preg_quote( $regex, '/' ) . ':(.*)$/mi', $file_data, $match ) && $match[1] ) - $all_headers[ $field ] = _cleanup_header_comment( $match[1] ); - else - $all_headers[ $field ] = ''; - } - - return $all_headers; -} - -/** - * Returns true. - * - * Useful for returning true to filters easily. - * - * @since 3.0.0 - * - * @see __return_false() - * - * @return true True. - */ -function __return_true() { - return true; -} - -/** - * Returns false. - * - * Useful for returning false to filters easily. - * - * @since 3.0.0 - * - * @see __return_true() - * - * @return false False. - */ -function __return_false() { - return false; -} - -/** - * Returns 0. - * - * Useful for returning 0 to filters easily. - * - * @since 3.0.0 - * - * @return int 0. - */ -function __return_zero() { - return 0; -} - -/** - * Returns an empty array. - * - * Useful for returning an empty array to filters easily. - * - * @since 3.0.0 - * - * @return array Empty array. - */ -function __return_empty_array() { - return array(); -} - -/** - * Returns null. - * - * Useful for returning null to filters easily. - * - * @since 3.4.0 - * - * @return null Null value. - */ -function __return_null() { - return null; -} - -/** - * Returns an empty string. - * - * Useful for returning an empty string to filters easily. - * - * @since 3.7.0 - * - * @see __return_null() - * - * @return string Empty string. - */ -function __return_empty_string() { - return ''; -} - -/** - * Send a HTTP header to disable content type sniffing in browsers which support it. - * - * @since 3.0.0 - * - * @see https://blogs.msdn.com/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx - * @see https://src.chromium.org/viewvc/chrome?view=rev&revision=6985 - */ -function send_nosniff_header() { - @header( 'X-Content-Type-Options: nosniff' ); -} - -/** - * Return a MySQL expression for selecting the week number based on the start_of_week option. - * - * @ignore - * @since 3.0.0 - * - * @param string $column Database column. - * @return string SQL clause. - */ -function _wp_mysql_week( $column ) { - switch ( $start_of_week = (int) get_option( 'start_of_week' ) ) { - case 1 : - return "WEEK( $column, 1 )"; - case 2 : - case 3 : - case 4 : - case 5 : - case 6 : - return "WEEK( DATE_SUB( $column, INTERVAL $start_of_week DAY ), 0 )"; - case 0 : - default : - return "WEEK( $column, 0 )"; - } -} - -/** - * Find hierarchy loops using a callback function that maps object IDs to parent IDs. - * - * @since 3.1.0 - * @access private - * - * @param callable $callback Function that accepts ( ID, $callback_args ) and outputs parent_ID. - * @param int $start The ID to start the loop check at. - * @param int $start_parent The parent_ID of $start to use instead of calling $callback( $start ). - * Use null to always use $callback - * @param array $callback_args Optional. Additional arguments to send to $callback. - * @return array IDs of all members of loop. - */ -function wp_find_hierarchy_loop( $callback, $start, $start_parent, $callback_args = array() ) { - $override = is_null( $start_parent ) ? array() : array( $start => $start_parent ); - - if ( !$arbitrary_loop_member = wp_find_hierarchy_loop_tortoise_hare( $callback, $start, $override, $callback_args ) ) - return array(); - - return wp_find_hierarchy_loop_tortoise_hare( $callback, $arbitrary_loop_member, $override, $callback_args, true ); -} - -/** - * Use the "The Tortoise and the Hare" algorithm to detect loops. - * - * For every step of the algorithm, the hare takes two steps and the tortoise one. - * If the hare ever laps the tortoise, there must be a loop. - * - * @since 3.1.0 - * @access private - * - * @param callable $callback Function that accepts ( ID, callback_arg, ... ) and outputs parent_ID. - * @param int $start The ID to start the loop check at. - * @param array $override Optional. An array of ( ID => parent_ID, ... ) to use instead of $callback. - * Default empty array. - * @param array $callback_args Optional. Additional arguments to send to $callback. Default empty array. - * @param bool $_return_loop Optional. Return loop members or just detect presence of loop? Only set - * to true if you already know the given $start is part of a loop (otherwise - * the returned array might include branches). Default false. - * @return mixed Scalar ID of some arbitrary member of the loop, or array of IDs of all members of loop if - * $_return_loop - */ -function wp_find_hierarchy_loop_tortoise_hare( $callback, $start, $override = array(), $callback_args = array(), $_return_loop = false ) { - $tortoise = $hare = $evanescent_hare = $start; - $return = array(); - - // Set evanescent_hare to one past hare - // Increment hare two steps - while ( - $tortoise - && - ( $evanescent_hare = isset( $override[$hare] ) ? $override[$hare] : call_user_func_array( $callback, array_merge( array( $hare ), $callback_args ) ) ) - && - ( $hare = isset( $override[$evanescent_hare] ) ? $override[$evanescent_hare] : call_user_func_array( $callback, array_merge( array( $evanescent_hare ), $callback_args ) ) ) - ) { - if ( $_return_loop ) - $return[$tortoise] = $return[$evanescent_hare] = $return[$hare] = true; - - // tortoise got lapped - must be a loop - if ( $tortoise == $evanescent_hare || $tortoise == $hare ) - return $_return_loop ? $return : $tortoise; - - // Increment tortoise by one step - $tortoise = isset( $override[$tortoise] ) ? $override[$tortoise] : call_user_func_array( $callback, array_merge( array( $tortoise ), $callback_args ) ); - } - - return false; -} - -/** - * Send a HTTP header to limit rendering of pages to same origin iframes. - * - * @since 3.1.3 - * - * @see https://developer.mozilla.org/en/the_x-frame-options_response_header - */ -function send_frame_options_header() { - @header( 'X-Frame-Options: SAMEORIGIN' ); -} - -/** - * Retrieve a list of protocols to allow in HTML attributes. - * - * @since 3.3.0 - * @since 4.3.0 Added 'webcal' to the protocols array. - * @since 4.7.0 Added 'urn' to the protocols array. - * - * @see wp_kses() - * @see esc_url() - * - * @staticvar array $protocols - * - * @return array Array of allowed protocols. Defaults to an array containing 'http', 'https', - * 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet', - * 'mms', 'rtsp', 'svn', 'tel', 'fax', 'xmpp', 'webcal', and 'urn'. - */ -function wp_allowed_protocols() { - static $protocols = array(); - - if ( empty( $protocols ) ) { - $protocols = array( 'http', 'https', 'ftp', 'ftps', 'mailto', 'news', 'irc', 'gopher', 'nntp', 'feed', 'telnet', 'mms', 'rtsp', 'svn', 'tel', 'fax', 'xmpp', 'webcal', 'urn' ); - - /** - * Filters the list of protocols allowed in HTML attributes. - * - * @since 3.0.0 - * - * @param array $protocols Array of allowed protocols e.g. 'http', 'ftp', 'tel', and more. - */ - $protocols = apply_filters( 'kses_allowed_protocols', $protocols ); - } - - return $protocols; -} - -/** - * Return a comma-separated string of functions that have been called to get - * to the current point in code. - * - * @since 3.4.0 - * - * @see https://core.trac.wordpress.org/ticket/19589 - * - * @param string $ignore_class Optional. A class to ignore all function calls within - useful - * when you want to just give info about the callee. Default null. - * @param int $skip_frames Optional. A number of stack frames to skip - useful for unwinding - * back to the source of the issue. Default 0. - * @param bool $pretty Optional. Whether or not you want a comma separated string or raw - * array returned. Default true. - * @return string|array Either a string containing a reversed comma separated trace or an array - * of individual calls. - */ -function wp_debug_backtrace_summary( $ignore_class = null, $skip_frames = 0, $pretty = true ) { - if ( version_compare( PHP_VERSION, '5.2.5', '>=' ) ) - $trace = debug_backtrace( false ); - else - $trace = debug_backtrace(); - - $caller = array(); - $check_class = ! is_null( $ignore_class ); - $skip_frames++; // skip this function - - foreach ( $trace as $call ) { - if ( $skip_frames > 0 ) { - $skip_frames--; - } elseif ( isset( $call['class'] ) ) { - if ( $check_class && $ignore_class == $call['class'] ) - continue; // Filter out calls - - $caller[] = "{$call['class']}{$call['type']}{$call['function']}"; - } else { - if ( in_array( $call['function'], array( 'do_action', 'apply_filters' ) ) ) { - $caller[] = "{$call['function']}('{$call['args'][0]}')"; - } elseif ( in_array( $call['function'], array( 'include', 'include_once', 'require', 'require_once' ) ) ) { - $caller[] = $call['function'] . "('" . str_replace( array( WP_CONTENT_DIR, ABSPATH ) , '', $call['args'][0] ) . "')"; - } else { - $caller[] = $call['function']; - } - } - } - if ( $pretty ) - return join( ', ', array_reverse( $caller ) ); - else - return $caller; -} - -/** - * Retrieve ids that are not already present in the cache. - * - * @since 3.4.0 - * @access private - * - * @param array $object_ids ID list. - * @param string $cache_key The cache bucket to check against. - * - * @return array List of ids not present in the cache. - */ -function _get_non_cached_ids( $object_ids, $cache_key ) { - $clean = array(); - foreach ( $object_ids as $id ) { - $id = (int) $id; - if ( !wp_cache_get( $id, $cache_key ) ) { - $clean[] = $id; - } - } - - return $clean; -} - -/** - * Test if the current device has the capability to upload files. - * - * @since 3.4.0 - * @access private - * - * @return bool Whether the device is able to upload files. - */ -function _device_can_upload() { - if ( ! wp_is_mobile() ) - return true; - - $ua = $_SERVER['HTTP_USER_AGENT']; - - if ( strpos($ua, 'iPhone') !== false - || strpos($ua, 'iPad') !== false - || strpos($ua, 'iPod') !== false ) { - return preg_match( '#OS ([\d_]+) like Mac OS X#', $ua, $version ) && version_compare( $version[1], '6', '>=' ); - } - - return true; -} - -/** - * Test if a given path is a stream URL - * - * @param string $path The resource path or URL. - * @return bool True if the path is a stream URL. - */ -function wp_is_stream( $path ) { - $wrappers = stream_get_wrappers(); - $wrappers_re = '(' . join('|', $wrappers) . ')'; - - return preg_match( "!^$wrappers_re://!", $path ) === 1; -} - -/** - * Test if the supplied date is valid for the Gregorian calendar. - * - * @since 3.5.0 - * - * @see checkdate() - * - * @param int $month Month number. - * @param int $day Day number. - * @param int $year Year number. - * @param string $source_date The date to filter. - * @return bool True if valid date, false if not valid date. - */ -function wp_checkdate( $month, $day, $year, $source_date ) { - /** - * Filters whether the given date is valid for the Gregorian calendar. - * - * @since 3.5.0 - * - * @param bool $checkdate Whether the given date is valid. - * @param string $source_date Date to check. - */ - return apply_filters( 'wp_checkdate', checkdate( $month, $day, $year ), $source_date ); -} - -/** - * Load the auth check for monitoring whether the user is still logged in. - * - * Can be disabled with remove_action( 'admin_enqueue_scripts', 'wp_auth_check_load' ); - * - * This is disabled for certain screens where a login screen could cause an - * inconvenient interruption. A filter called {@see 'wp_auth_check_load'} can be used - * for fine-grained control. - * - * @since 3.6.0 - */ -function wp_auth_check_load() { - if ( ! is_admin() && ! is_user_logged_in() ) - return; - - if ( defined( 'IFRAME_REQUEST' ) ) - return; - - $screen = get_current_screen(); - $hidden = array( 'update', 'update-network', 'update-core', 'update-core-network', 'upgrade', 'upgrade-network', 'network' ); - $show = ! in_array( $screen->id, $hidden ); - - /** - * Filters whether to load the authentication check. - * - * Passing a falsey value to the filter will effectively short-circuit - * loading the authentication check. - * - * @since 3.6.0 - * - * @param bool $show Whether to load the authentication check. - * @param WP_Screen $screen The current screen object. - */ - if ( apply_filters( 'wp_auth_check_load', $show, $screen ) ) { - wp_enqueue_style( 'wp-auth-check' ); - wp_enqueue_script( 'wp-auth-check' ); - - add_action( 'admin_print_footer_scripts', 'wp_auth_check_html', 5 ); - add_action( 'wp_print_footer_scripts', 'wp_auth_check_html', 5 ); - } -} - -/** - * Output the HTML that shows the wp-login dialog when the user is no longer logged in. - * - * @since 3.6.0 - */ -function wp_auth_check_html() { - $login_url = wp_login_url(); - $current_domain = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST']; - $same_domain = ( strpos( $login_url, $current_domain ) === 0 ); - - /** - * Filters whether the authentication check originated at the same domain. - * - * @since 3.6.0 - * - * @param bool $same_domain Whether the authentication check originated at the same domain. - */ - $same_domain = apply_filters( 'wp_auth_check_same_domain', $same_domain ); - $wrap_class = $same_domain ? 'hidden' : 'hidden fallback'; - - ?> -
      -
      -
      - - -
      - -
      -

      -

      -

      -
      -
      -
      - [\s\S]*<\/%1$s>|\s*\/>)', tag_escape( $tag ) ); -} - -/** - * Retrieve a canonical form of the provided charset appropriate for passing to PHP - * functions such as htmlspecialchars() and charset html attributes. - * - * @since 3.6.0 - * @access private - * - * @see https://core.trac.wordpress.org/ticket/23688 - * - * @param string $charset A charset name. - * @return string The canonical form of the charset. - */ -function _canonical_charset( $charset ) { - if ( 'utf-8' === strtolower( $charset ) || 'utf8' === strtolower( $charset) ) { - - return 'UTF-8'; - } - - if ( 'iso-8859-1' === strtolower( $charset ) || 'iso8859-1' === strtolower( $charset ) ) { - - return 'ISO-8859-1'; - } - - return $charset; -} - -/** - * Set the mbstring internal encoding to a binary safe encoding when func_overload - * is enabled. - * - * When mbstring.func_overload is in use for multi-byte encodings, the results from - * strlen() and similar functions respect the utf8 characters, causing binary data - * to return incorrect lengths. - * - * This function overrides the mbstring encoding to a binary-safe encoding, and - * resets it to the users expected encoding afterwards through the - * `reset_mbstring_encoding` function. - * - * It is safe to recursively call this function, however each - * `mbstring_binary_safe_encoding()` call must be followed up with an equal number - * of `reset_mbstring_encoding()` calls. - * - * @since 3.7.0 - * - * @see reset_mbstring_encoding() - * - * @staticvar array $encodings - * @staticvar bool $overloaded - * - * @param bool $reset Optional. Whether to reset the encoding back to a previously-set encoding. - * Default false. - */ -function mbstring_binary_safe_encoding( $reset = false ) { - static $encodings = array(); - static $overloaded = null; - - if ( is_null( $overloaded ) ) - $overloaded = function_exists( 'mb_internal_encoding' ) && ( ini_get( 'mbstring.func_overload' ) & 2 ); - - if ( false === $overloaded ) - return; - - if ( ! $reset ) { - $encoding = mb_internal_encoding(); - array_push( $encodings, $encoding ); - mb_internal_encoding( 'ISO-8859-1' ); - } - - if ( $reset && $encodings ) { - $encoding = array_pop( $encodings ); - mb_internal_encoding( $encoding ); - } -} - -/** - * Reset the mbstring internal encoding to a users previously set encoding. - * - * @see mbstring_binary_safe_encoding() - * - * @since 3.7.0 - */ -function reset_mbstring_encoding() { - mbstring_binary_safe_encoding( true ); -} - -/** - * Filter/validate a variable as a boolean. - * - * Alternative to `filter_var( $var, FILTER_VALIDATE_BOOLEAN )`. - * - * @since 4.0.0 - * - * @param mixed $var Boolean value to validate. - * @return bool Whether the value is validated. - */ -function wp_validate_boolean( $var ) { - if ( is_bool( $var ) ) { - return $var; - } - - if ( is_string( $var ) && 'false' === strtolower( $var ) ) { - return false; - } - - return (bool) $var; -} - -/** - * Delete a file - * - * @since 4.2.0 - * - * @param string $file The path to the file to delete. - */ -function wp_delete_file( $file ) { - /** - * Filters the path of the file to delete. - * - * @since 2.1.0 - * - * @param string $medium Path to the file to delete. - */ - $delete = apply_filters( 'wp_delete_file', $file ); - if ( ! empty( $delete ) ) { - @unlink( $delete ); - } -} - -/** - * Outputs a small JS snippet on preview tabs/windows to remove `window.name` on unload. - * - * This prevents reusing the same tab for a preview when the user has navigated away. - * - * @since 4.3.0 - */ -function wp_post_preview_js() { - global $post; - - if ( ! is_preview() || empty( $post ) ) { - return; - } - - // Has to match the window name used in post_submit_meta_box() - $name = 'wp-preview-' . (int) $post->ID; - - ?> - - $wp_max_limit_int && $filtered_limit_int > $current_limit_int ) ) { - if ( false !== @ini_set( 'memory_limit', $filtered_limit ) ) { - return $filtered_limit; - } else { - return false; - } - } elseif ( -1 === $wp_max_limit_int || $wp_max_limit_int > $current_limit_int ) { - if ( false !== @ini_set( 'memory_limit', $wp_max_limit ) ) { - return $wp_max_limit; - } else { - return false; - } - } - - return false; -} - -/** - * Generate a random UUID (version 4). - * - * @since 4.7.0 - * - * @return string UUID. - */ -function wp_generate_uuid4() { - return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x', - mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), - mt_rand( 0, 0xffff ), - mt_rand( 0, 0x0fff ) | 0x4000, - mt_rand( 0, 0x3fff ) | 0x8000, - mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ) - ); -} - -/** - * Get last changed date for the specified cache group. - * - * @since 4.7.0 - * - * @param $group Where the cache contents are grouped. - * - * @return string $last_changed UNIX timestamp with microseconds representing when the group was last changed. - */ -function wp_cache_get_last_changed( $group ) { - $last_changed = wp_cache_get( 'last_changed', $group ); - - if ( ! $last_changed ) { - $last_changed = microtime(); - wp_cache_set( 'last_changed', $last_changed, $group ); - } - - return $last_changed; -} diff --git a/wp/wp-includes/functions.wp-scripts.php b/wp/wp-includes/functions.wp-scripts.php deleted file mode 100644 index dccaaf26..00000000 --- a/wp/wp-includes/functions.wp-scripts.php +++ /dev/null @@ -1,336 +0,0 @@ -wp_enqueue_scripts', - 'admin_enqueue_scripts', - 'login_enqueue_scripts' - ), '3.3.0' ); -} - -/** - * Prints scripts in document head that are in the $handles queue. - * - * Called by admin-header.php and {@see 'wp_head'} hook. Since it is called by wp_head on every page load, - * the function does not instantiate the WP_Scripts object unless script names are explicitly passed. - * Makes use of already-instantiated $wp_scripts global if present. Use provided {@see 'wp_print_scripts'} - * hook to register/enqueue new scripts. - * - * @see WP_Scripts::do_items() - * @global WP_Scripts $wp_scripts The WP_Scripts object for printing scripts. - * - * @since 2.1.0 - * - * @param string|bool|array $handles Optional. Scripts to be printed. Default 'false'. - * @return array On success, a processed array of WP_Dependencies items; otherwise, an empty array. - */ -function wp_print_scripts( $handles = false ) { - /** - * Fires before scripts in the $handles queue are printed. - * - * @since 2.1.0 - */ - do_action( 'wp_print_scripts' ); - if ( '' === $handles ) { // for wp_head - $handles = false; - } - - _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); - - global $wp_scripts; - if ( ! ( $wp_scripts instanceof WP_Scripts ) ) { - if ( ! $handles ) { - return array(); // No need to instantiate if nothing is there. - } - } - - return wp_scripts()->do_items( $handles ); -} - -/** - * Adds extra code to a registered script. - * - * Code will only be added if the script in already in the queue. - * Accepts a string $data containing the Code. If two or more code blocks - * are added to the same script $handle, they will be printed in the order - * they were added, i.e. the latter added code can redeclare the previous. - * - * @since 4.5.0 - * - * @see WP_Scripts::add_inline_script() - * - * @param string $handle Name of the script to add the inline script to. - * @param string $data String containing the javascript to be added. - * @param string $position Optional. Whether to add the inline script before the handle - * or after. Default 'after'. - * @return bool True on success, false on failure. - */ -function wp_add_inline_script( $handle, $data, $position = 'after' ) { - _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); - - if ( false !== stripos( $data, '' ) ) { - _doing_it_wrong( __FUNCTION__, sprintf( - /* translators: 1: #is', '$1', $data ) ); - } - - return wp_scripts()->add_inline_script( $handle, $data, $position ); -} - -/** - * Register a new script. - * - * Registers a script to be enqueued later using the wp_enqueue_script() function. - * - * @see WP_Dependencies::add() - * @see WP_Dependencies::add_data() - * - * @since 2.1.0 - * @since 4.3.0 A return value was added. - * - * @param string $handle Name of the script. Should be unique. - * @param string $src Full URL of the script, or path of the script relative to the WordPress root directory. - * @param array $deps Optional. An array of registered script handles this script depends on. Default empty array. - * @param string|bool|null $ver Optional. String specifying script version number, if it has one, which is added to the URL - * as a query string for cache busting purposes. If version is set to false, a version - * number is automatically added equal to current installed WordPress version. - * If set to null, no version is added. - * @param bool $in_footer Optional. Whether to enqueue the script before instead of in the . - * Default 'false'. - * @return bool Whether the script has been registered. True on success, false on failure. - */ -function wp_register_script( $handle, $src, $deps = array(), $ver = false, $in_footer = false ) { - $wp_scripts = wp_scripts(); - _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); - - $registered = $wp_scripts->add( $handle, $src, $deps, $ver ); - if ( $in_footer ) { - $wp_scripts->add_data( $handle, 'group', 1 ); - } - - return $registered; -} - -/** - * Localize a script. - * - * Works only if the script has already been added. - * - * Accepts an associative array $l10n and creates a JavaScript object: - * - * "$object_name" = { - * key: value, - * key: value, - * ... - * } - * - * - * @see WP_Dependencies::localize() - * @link https://core.trac.wordpress.org/ticket/11520 - * @global WP_Scripts $wp_scripts The WP_Scripts object for printing scripts. - * - * @since 2.2.0 - * - * @todo Documentation cleanup - * - * @param string $handle Script handle the data will be attached to. - * @param string $object_name Name for the JavaScript object. Passed directly, so it should be qualified JS variable. - * Example: '/[a-zA-Z0-9_]+/'. - * @param array $l10n The data itself. The data can be either a single or multi-dimensional array. - * @return bool True if the script was successfully localized, false otherwise. - */ -function wp_localize_script( $handle, $object_name, $l10n ) { - global $wp_scripts; - if ( ! ( $wp_scripts instanceof WP_Scripts ) ) { - _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); - return false; - } - - return $wp_scripts->localize( $handle, $object_name, $l10n ); -} - -/** - * Remove a registered script. - * - * Note: there are intentional safeguards in place to prevent critical admin scripts, - * such as jQuery core, from being unregistered. - * - * @see WP_Dependencies::remove() - * - * @since 2.1.0 - * - * @param string $handle Name of the script to be removed. - */ -function wp_deregister_script( $handle ) { - _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); - - /** - * Do not allow accidental or negligent de-registering of critical scripts in the admin. - * Show minimal remorse if the correct hook is used. - */ - $current_filter = current_filter(); - if ( ( is_admin() && 'admin_enqueue_scripts' !== $current_filter ) || - ( 'wp-login.php' === $GLOBALS['pagenow'] && 'login_enqueue_scripts' !== $current_filter ) - ) { - $no = array( - 'jquery', 'jquery-core', 'jquery-migrate', 'jquery-ui-core', 'jquery-ui-accordion', - 'jquery-ui-autocomplete', 'jquery-ui-button', 'jquery-ui-datepicker', 'jquery-ui-dialog', - 'jquery-ui-draggable', 'jquery-ui-droppable', 'jquery-ui-menu', 'jquery-ui-mouse', - 'jquery-ui-position', 'jquery-ui-progressbar', 'jquery-ui-resizable', 'jquery-ui-selectable', - 'jquery-ui-slider', 'jquery-ui-sortable', 'jquery-ui-spinner', 'jquery-ui-tabs', - 'jquery-ui-tooltip', 'jquery-ui-widget', 'underscore', 'backbone', - ); - - if ( in_array( $handle, $no ) ) { - $message = sprintf( - /* translators: 1: script name, 2: wp_enqueue_scripts */ - __( 'Do not deregister the %1$s script in the administration area. To target the front-end theme, use the %2$s hook.' ), - "$handle", - 'wp_enqueue_scripts' - ); - _doing_it_wrong( __FUNCTION__, $message, '3.6.0' ); - return; - } - } - - wp_scripts()->remove( $handle ); -} - -/** - * Enqueue a script. - * - * Registers the script if $src provided (does NOT overwrite), and enqueues it. - * - * @see WP_Dependencies::add() - * @see WP_Dependencies::add_data() - * @see WP_Dependencies::enqueue() - * - * @since 2.1.0 - * - * @param string $handle Name of the script. Should be unique. - * @param string $src Full URL of the script, or path of the script relative to the WordPress root directory. - * Default empty. - * @param array $deps Optional. An array of registered script handles this script depends on. Default empty array. - * @param string|bool|null $ver Optional. String specifying script version number, if it has one, which is added to the URL - * as a query string for cache busting purposes. If version is set to false, a version - * number is automatically added equal to current installed WordPress version. - * If set to null, no version is added. - * @param bool $in_footer Optional. Whether to enqueue the script before instead of in the . - * Default 'false'. - */ -function wp_enqueue_script( $handle, $src = '', $deps = array(), $ver = false, $in_footer = false ) { - $wp_scripts = wp_scripts(); - - _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); - - - if ( $src || $in_footer ) { - $_handle = explode( '?', $handle ); - - if ( $src ) { - $wp_scripts->add( $_handle[0], $src, $deps, $ver ); - } - - if ( $in_footer ) { - $wp_scripts->add_data( $_handle[0], 'group', 1 ); - } - } - - $wp_scripts->enqueue( $handle ); -} - -/** - * Remove a previously enqueued script. - * - * @see WP_Dependencies::dequeue() - * - * @since 3.1.0 - * - * @param string $handle Name of the script to be removed. - */ -function wp_dequeue_script( $handle ) { - _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); - - wp_scripts()->dequeue( $handle ); -} - -/** - * Check whether a script has been added to the queue. - * - * @since 2.8.0 - * @since 3.5.0 'enqueued' added as an alias of the 'queue' list. - * - * @param string $handle Name of the script. - * @param string $list Optional. Status of the script to check. Default 'enqueued'. - * Accepts 'enqueued', 'registered', 'queue', 'to_do', and 'done'. - * @return bool Whether the script is queued. - */ -function wp_script_is( $handle, $list = 'enqueued' ) { - _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); - - return (bool) wp_scripts()->query( $handle, $list ); -} - -/** - * Add metadata to a script. - * - * Works only if the script has already been added. - * - * Possible values for $key and $value: - * 'conditional' string Comments for IE 6, lte IE 7, etc. - * - * @since 4.2.0 - * - * @see WP_Dependency::add_data() - * - * @param string $handle Name of the script. - * @param string $key Name of data point for which we're storing a value. - * @param mixed $value String containing the data to be added. - * @return bool True on success, false on failure. - */ -function wp_script_add_data( $handle, $key, $value ){ - return wp_scripts()->add_data( $handle, $key, $value ); -} diff --git a/wp/wp-includes/functions.wp-styles.php b/wp/wp-includes/functions.wp-styles.php deleted file mode 100644 index db2603a9..00000000 --- a/wp/wp-includes/functions.wp-styles.php +++ /dev/null @@ -1,231 +0,0 @@ -do_items( $handles ); -} - -/** - * Add extra CSS styles to a registered stylesheet. - * - * Styles will only be added if the stylesheet in already in the queue. - * Accepts a string $data containing the CSS. If two or more CSS code blocks - * are added to the same stylesheet $handle, they will be printed in the order - * they were added, i.e. the latter added styles can redeclare the previous. - * - * @see WP_Styles::add_inline_style() - * - * @since 3.3.0 - * - * @param string $handle Name of the stylesheet to add the extra styles to. - * @param string $data String containing the CSS styles to be added. - * @return bool True on success, false on failure. - */ -function wp_add_inline_style( $handle, $data ) { - _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); - - if ( false !== stripos( $data, '' ) ) { - _doing_it_wrong( __FUNCTION__, sprintf( - /* translators: 1: #is', '$1', $data ) ); - } - - return wp_styles()->add_inline_style( $handle, $data ); -} - -/** - * Register a CSS stylesheet. - * - * @see WP_Dependencies::add() - * @link https://www.w3.org/TR/CSS2/media.html#media-types List of CSS media types. - * - * @since 2.6.0 - * @since 4.3.0 A return value was added. - * - * @param string $handle Name of the stylesheet. Should be unique. - * @param string $src Full URL of the stylesheet, or path of the stylesheet relative to the WordPress root directory. - * @param array $deps Optional. An array of registered stylesheet handles this stylesheet depends on. Default empty array. - * @param string|bool|null $ver Optional. String specifying stylesheet version number, if it has one, which is added to the URL - * as a query string for cache busting purposes. If version is set to false, a version - * number is automatically added equal to current installed WordPress version. - * If set to null, no version is added. - * @param string $media Optional. The media for which this stylesheet has been defined. - * Default 'all'. Accepts media types like 'all', 'print' and 'screen', or media queries like - * '(orientation: portrait)' and '(max-width: 640px)'. - * @return bool Whether the style has been registered. True on success, false on failure. - */ -function wp_register_style( $handle, $src, $deps = array(), $ver = false, $media = 'all' ) { - _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); - - return wp_styles()->add( $handle, $src, $deps, $ver, $media ); -} - -/** - * Remove a registered stylesheet. - * - * @see WP_Dependencies::remove() - * - * @since 2.1.0 - * - * @param string $handle Name of the stylesheet to be removed. - */ -function wp_deregister_style( $handle ) { - _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); - - wp_styles()->remove( $handle ); -} - -/** - * Enqueue a CSS stylesheet. - * - * Registers the style if source provided (does NOT overwrite) and enqueues. - * - * @see WP_Dependencies::add() - * @see WP_Dependencies::enqueue() - * @link https://www.w3.org/TR/CSS2/media.html#media-types List of CSS media types. - * - * @since 2.6.0 - * - * @param string $handle Name of the stylesheet. Should be unique. - * @param string $src Full URL of the stylesheet, or path of the stylesheet relative to the WordPress root directory. - * Default empty. - * @param array $deps Optional. An array of registered stylesheet handles this stylesheet depends on. Default empty array. - * @param string|bool|null $ver Optional. String specifying stylesheet version number, if it has one, which is added to the URL - * as a query string for cache busting purposes. If version is set to false, a version - * number is automatically added equal to current installed WordPress version. - * If set to null, no version is added. - * @param string $media Optional. The media for which this stylesheet has been defined. - * Default 'all'. Accepts media types like 'all', 'print' and 'screen', or media queries like - * '(orientation: portrait)' and '(max-width: 640px)'. - */ -function wp_enqueue_style( $handle, $src = '', $deps = array(), $ver = false, $media = 'all' ) { - _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); - - $wp_styles = wp_styles(); - - if ( $src ) { - $_handle = explode('?', $handle); - $wp_styles->add( $_handle[0], $src, $deps, $ver, $media ); - } - $wp_styles->enqueue( $handle ); -} - -/** - * Remove a previously enqueued CSS stylesheet. - * - * @see WP_Dependencies::dequeue() - * - * @since 3.1.0 - * - * @param string $handle Name of the stylesheet to be removed. - */ -function wp_dequeue_style( $handle ) { - _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); - - wp_styles()->dequeue( $handle ); -} - -/** - * Check whether a CSS stylesheet has been added to the queue. - * - * @since 2.8.0 - * - * @param string $handle Name of the stylesheet. - * @param string $list Optional. Status of the stylesheet to check. Default 'enqueued'. - * Accepts 'enqueued', 'registered', 'queue', 'to_do', and 'done'. - * @return bool Whether style is queued. - */ -function wp_style_is( $handle, $list = 'enqueued' ) { - _wp_scripts_maybe_doing_it_wrong( __FUNCTION__ ); - - return (bool) wp_styles()->query( $handle, $list ); -} - -/** - * Add metadata to a CSS stylesheet. - * - * Works only if the stylesheet has already been added. - * - * Possible values for $key and $value: - * 'conditional' string Comments for IE 6, lte IE 7 etc. - * 'rtl' bool|string To declare an RTL stylesheet. - * 'suffix' string Optional suffix, used in combination with RTL. - * 'alt' bool For rel="alternate stylesheet". - * 'title' string For preferred/alternate stylesheets. - * - * @see WP_Dependency::add_data() - * - * @since 3.6.0 - * - * @param string $handle Name of the stylesheet. - * @param string $key Name of data point for which we're storing a value. - * Accepts 'conditional', 'rtl' and 'suffix', 'alt' and 'title'. - * @param mixed $value String containing the CSS data to be added. - * @return bool True on success, false on failure. - */ -function wp_style_add_data( $handle, $key, $value ) { - return wp_styles()->add_data( $handle, $key, $value ); -} diff --git a/wp/wp-includes/general-template.php b/wp/wp-includes/general-template.php deleted file mode 100644 index ed91e5bd..00000000 --- a/wp/wp-includes/general-template.php +++ /dev/null @@ -1,3787 +0,0 @@ - - - - '; - } else { - $form = ''; - } - } - - /** - * Filters the HTML output of the search form. - * - * @since 2.7.0 - * - * @param string $form The search form HTML output. - */ - $result = apply_filters( 'get_search_form', $form ); - - if ( null === $result ) - $result = $form; - - if ( $echo ) - echo $result; - else - return $result; -} - -/** - * Display the Log In/Out link. - * - * Displays a link, which allows users to navigate to the Log In page to log in - * or log out depending on whether they are currently logged in. - * - * @since 1.5.0 - * - * @param string $redirect Optional path to redirect to on login/logout. - * @param bool $echo Default to echo and not return the link. - * @return string|void String when retrieving. - */ -function wp_loginout($redirect = '', $echo = true) { - if ( ! is_user_logged_in() ) - $link = '' . __('Log in') . ''; - else - $link = '' . __('Log out') . ''; - - if ( $echo ) { - /** - * Filters the HTML output for the Log In/Log Out link. - * - * @since 1.5.0 - * - * @param string $link The HTML link content. - */ - echo apply_filters( 'loginout', $link ); - } else { - /** This filter is documented in wp-includes/general-template.php */ - return apply_filters( 'loginout', $link ); - } -} - -/** - * Retrieves the logout URL. - * - * Returns the URL that allows the user to log out of the site. - * - * @since 2.7.0 - * - * @param string $redirect Path to redirect to on logout. - * @return string The logout URL. Note: HTML-encoded via esc_html() in wp_nonce_url(). - */ -function wp_logout_url($redirect = '') { - $args = array( 'action' => 'logout' ); - if ( !empty($redirect) ) { - $args['redirect_to'] = urlencode( $redirect ); - } - - $logout_url = add_query_arg($args, site_url('wp-login.php', 'login')); - $logout_url = wp_nonce_url( $logout_url, 'log-out' ); - - /** - * Filters the logout URL. - * - * @since 2.8.0 - * - * @param string $logout_url The HTML-encoded logout URL. - * @param string $redirect Path to redirect to on logout. - */ - return apply_filters( 'logout_url', $logout_url, $redirect ); -} - -/** - * Retrieves the login URL. - * - * @since 2.7.0 - * - * @param string $redirect Path to redirect to on log in. - * @param bool $force_reauth Whether to force reauthorization, even if a cookie is present. - * Default false. - * @return string The login URL. Not HTML-encoded. - */ -function wp_login_url($redirect = '', $force_reauth = false) { - $login_url = site_url('wp-login.php', 'login'); - - if ( !empty($redirect) ) - $login_url = add_query_arg('redirect_to', urlencode($redirect), $login_url); - - if ( $force_reauth ) - $login_url = add_query_arg('reauth', '1', $login_url); - - /** - * Filters the login URL. - * - * @since 2.8.0 - * @since 4.2.0 The `$force_reauth` parameter was added. - * - * @param string $login_url The login URL. Not HTML-encoded. - * @param string $redirect The path to redirect to on login, if supplied. - * @param bool $force_reauth Whether to force reauthorization, even if a cookie is present. - */ - return apply_filters( 'login_url', $login_url, $redirect, $force_reauth ); -} - -/** - * Returns the URL that allows the user to register on the site. - * - * @since 3.6.0 - * - * @return string User registration URL. - */ -function wp_registration_url() { - /** - * Filters the user registration URL. - * - * @since 3.6.0 - * - * @param string $register The user registration URL. - */ - return apply_filters( 'register_url', site_url( 'wp-login.php?action=register', 'login' ) ); -} - -/** - * Provides a simple login form for use anywhere within WordPress. - * - * The login format HTML is echoed by default. Pass a false value for `$echo` to return it instead. - * - * @since 3.0.0 - * - * @param array $args { - * Optional. Array of options to control the form output. Default empty array. - * - * @type bool $echo Whether to display the login form or return the form HTML code. - * Default true (echo). - * @type string $redirect URL to redirect to. Must be absolute, as in "https://example.com/mypage/". - * Default is to redirect back to the request URI. - * @type string $form_id ID attribute value for the form. Default 'loginform'. - * @type string $label_username Label for the username or email address field. Default 'Username or Email Address'. - * @type string $label_password Label for the password field. Default 'Password'. - * @type string $label_remember Label for the remember field. Default 'Remember Me'. - * @type string $label_log_in Label for the submit button. Default 'Log In'. - * @type string $id_username ID attribute value for the username field. Default 'user_login'. - * @type string $id_password ID attribute value for the password field. Default 'user_pass'. - * @type string $id_remember ID attribute value for the remember field. Default 'rememberme'. - * @type string $id_submit ID attribute value for the submit button. Default 'wp-submit'. - * @type bool $remember Whether to display the "rememberme" checkbox in the form. - * @type string $value_username Default value for the username field. Default empty. - * @type bool $value_remember Whether the "Remember Me" checkbox should be checked by default. - * Default false (unchecked). - * - * } - * @return string|void String when retrieving. - */ -function wp_login_form( $args = array() ) { - $defaults = array( - 'echo' => true, - // Default 'redirect' value takes the user back to the request URI. - 'redirect' => ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], - 'form_id' => 'loginform', - 'label_username' => __( 'Username or Email Address' ), - 'label_password' => __( 'Password' ), - 'label_remember' => __( 'Remember Me' ), - 'label_log_in' => __( 'Log In' ), - 'id_username' => 'user_login', - 'id_password' => 'user_pass', - 'id_remember' => 'rememberme', - 'id_submit' => 'wp-submit', - 'remember' => true, - 'value_username' => '', - // Set 'value_remember' to true to default the "Remember me" checkbox to checked. - 'value_remember' => false, - ); - - /** - * Filters the default login form output arguments. - * - * @since 3.0.0 - * - * @see wp_login_form() - * - * @param array $defaults An array of default login form arguments. - */ - $args = wp_parse_args( $args, apply_filters( 'login_form_defaults', $defaults ) ); - - /** - * Filters content to display at the top of the login form. - * - * The filter evaluates just following the opening form tag element. - * - * @since 3.0.0 - * - * @param string $content Content to display. Default empty. - * @param array $args Array of login form arguments. - */ - $login_form_top = apply_filters( 'login_form_top', '', $args ); - - /** - * Filters content to display in the middle of the login form. - * - * The filter evaluates just following the location where the 'login-password' - * field is displayed. - * - * @since 3.0.0 - * - * @param string $content Content to display. Default empty. - * @param array $args Array of login form arguments. - */ - $login_form_middle = apply_filters( 'login_form_middle', '', $args ); - - /** - * Filters content to display at the bottom of the login form. - * - * The filter evaluates just preceding the closing form tag element. - * - * @since 3.0.0 - * - * @param string $content Content to display. Default empty. - * @param array $args Array of login form arguments. - */ - $login_form_bottom = apply_filters( 'login_form_bottom', '', $args ); - - $form = ' -
      - ' . $login_form_top . ' - - - ' . $login_form_middle . ' - ' . ( $args['remember'] ? '' : '' ) . ' - - ' . $login_form_bottom . ' -
      '; - - if ( $args['echo'] ) - echo $form; - else - return $form; -} - -/** - * Returns the URL that allows the user to retrieve the lost password - * - * @since 2.8.0 - * - * @param string $redirect Path to redirect to on login. - * @return string Lost password URL. - */ -function wp_lostpassword_url( $redirect = '' ) { - $args = array( 'action' => 'lostpassword' ); - if ( !empty($redirect) ) { - $args['redirect_to'] = $redirect; - } - - $lostpassword_url = add_query_arg( $args, network_site_url('wp-login.php', 'login') ); - - /** - * Filters the Lost Password URL. - * - * @since 2.8.0 - * - * @param string $lostpassword_url The lost password page URL. - * @param string $redirect The path to redirect to on login. - */ - return apply_filters( 'lostpassword_url', $lostpassword_url, $redirect ); -} - -/** - * Display the Registration or Admin link. - * - * Display a link which allows the user to navigate to the registration page if - * not logged in and registration is enabled or to the dashboard if logged in. - * - * @since 1.5.0 - * - * @param string $before Text to output before the link. Default `
    11. `. - * @param string $after Text to output after the link. Default `
    12. `. - * @param bool $echo Default to echo and not return the link. - * @return string|void String when retrieving. - */ -function wp_register( $before = '
    13. ', $after = '
    14. ', $echo = true ) { - if ( ! is_user_logged_in() ) { - if ( get_option('users_can_register') ) - $link = $before . '' . __('Register') . '' . $after; - else - $link = ''; - } elseif ( current_user_can( 'read' ) ) { - $link = $before . '' . __('Site Admin') . '' . $after; - } else { - $link = ''; - } - - /** - * Filters the HTML link to the Registration or Admin page. - * - * Users are sent to the admin page if logged-in, or the registration page - * if enabled and logged-out. - * - * @since 1.5.0 - * - * @param string $link The HTML code for the link to the Registration or Admin page. - */ - $link = apply_filters( 'register', $link ); - - if ( $echo ) { - echo $link; - } else { - return $link; - } -} - -/** - * Theme container function for the 'wp_meta' action. - * - * The {@see 'wp_meta'} action can have several purposes, depending on how you use it, - * but one purpose might have been to allow for theme switching. - * - * @since 1.5.0 - * - * @link https://core.trac.wordpress.org/ticket/1458 Explanation of 'wp_meta' action. - */ -function wp_meta() { - /** - * Fires before displaying echoed content in the sidebar. - * - * @since 1.5.0 - */ - do_action( 'wp_meta' ); -} - -/** - * Displays information about the current site. - * - * @since 0.71 - * - * @see get_bloginfo() For possible `$show` values - * - * @param string $show Optional. Site information to display. Default empty. - */ -function bloginfo( $show = '' ) { - echo get_bloginfo( $show, 'display' ); -} - -/** - * Retrieves information about the current site. - * - * Possible values for `$show` include: - * - * - 'name' - Site title (set in Settings > General) - * - 'description' - Site tagline (set in Settings > General) - * - 'wpurl' - The WordPress address (URL) (set in Settings > General) - * - 'url' - The Site address (URL) (set in Settings > General) - * - 'admin_email' - Admin email (set in Settings > General) - * - 'charset' - The "Encoding for pages and feeds" (set in Settings > Reading) - * - 'version' - The current WordPress version - * - 'html_type' - The content-type (default: "text/html"). Themes and plugins - * can override the default value using the {@see 'pre_option_html_type'} filter - * - 'text_direction' - The text direction determined by the site's language. is_rtl() - * should be used instead - * - 'language' - Language code for the current site - * - 'stylesheet_url' - URL to the stylesheet for the active theme. An active child theme - * will take precedence over this value - * - 'stylesheet_directory' - Directory path for the active theme. An active child theme - * will take precedence over this value - * - 'template_url' / 'template_directory' - URL of the active theme's directory. An active - * child theme will NOT take precedence over this value - * - 'pingback_url' - The pingback XML-RPC file URL (xmlrpc.php) - * - 'atom_url' - The Atom feed URL (/feed/atom) - * - 'rdf_url' - The RDF/RSS 1.0 feed URL (/feed/rfd) - * - 'rss_url' - The RSS 0.92 feed URL (/feed/rss) - * - 'rss2_url' - The RSS 2.0 feed URL (/feed) - * - 'comments_atom_url' - The comments Atom feed URL (/comments/feed) - * - 'comments_rss2_url' - The comments RSS 2.0 feed URL (/comments/feed) - * - * Some `$show` values are deprecated and will be removed in future versions. - * These options will trigger the _deprecated_argument() function. - * - * Deprecated arguments include: - * - * - 'siteurl' - Use 'url' instead - * - 'home' - Use 'url' instead - * - * @since 0.71 - * - * @global string $wp_version - * - * @param string $show Optional. Site info to retrieve. Default empty (site name). - * @param string $filter Optional. How to filter what is retrieved. Default 'raw'. - * @return string Mostly string values, might be empty. - */ -function get_bloginfo( $show = '', $filter = 'raw' ) { - switch( $show ) { - case 'home' : // DEPRECATED - case 'siteurl' : // DEPRECATED - _deprecated_argument( __FUNCTION__, '2.2.0', sprintf( - /* translators: 1: 'siteurl'/'home' argument, 2: bloginfo() function name, 3: 'url' argument */ - __( 'The %1$s option is deprecated for the family of %2$s functions. Use the %3$s option instead.' ), - '' . $show . '', - 'bloginfo()', - 'url' - ) ); - case 'url' : - $output = home_url(); - break; - case 'wpurl' : - $output = site_url(); - break; - case 'description': - $output = get_option('blogdescription'); - break; - case 'rdf_url': - $output = get_feed_link('rdf'); - break; - case 'rss_url': - $output = get_feed_link('rss'); - break; - case 'rss2_url': - $output = get_feed_link('rss2'); - break; - case 'atom_url': - $output = get_feed_link('atom'); - break; - case 'comments_atom_url': - $output = get_feed_link('comments_atom'); - break; - case 'comments_rss2_url': - $output = get_feed_link('comments_rss2'); - break; - case 'pingback_url': - $output = site_url( 'xmlrpc.php' ); - break; - case 'stylesheet_url': - $output = get_stylesheet_uri(); - break; - case 'stylesheet_directory': - $output = get_stylesheet_directory_uri(); - break; - case 'template_directory': - case 'template_url': - $output = get_template_directory_uri(); - break; - case 'admin_email': - $output = get_option('admin_email'); - break; - case 'charset': - $output = get_option('blog_charset'); - if ('' == $output) $output = 'UTF-8'; - break; - case 'html_type' : - $output = get_option('html_type'); - break; - case 'version': - global $wp_version; - $output = $wp_version; - break; - case 'language': - /* translators: Translate this to the correct language tag for your locale, - * see https://www.w3.org/International/articles/language-tags/ for reference. - * Do not translate into your own language. - */ - $output = __( 'html_lang_attribute' ); - if ( 'html_lang_attribute' === $output || preg_match( '/[^a-zA-Z0-9-]/', $output ) ) { - $output = get_locale(); - $output = str_replace( '_', '-', $output ); - } - break; - case 'text_direction': - _deprecated_argument( __FUNCTION__, '2.2.0', sprintf( - /* translators: 1: 'text_direction' argument, 2: bloginfo() function name, 3: is_rtl() function name */ - __( 'The %1$s option is deprecated for the family of %2$s functions. Use the %3$s function instead.' ), - '' . $show . '', - 'bloginfo()', - 'is_rtl()' - ) ); - if ( function_exists( 'is_rtl' ) ) { - $output = is_rtl() ? 'rtl' : 'ltr'; - } else { - $output = 'ltr'; - } - break; - case 'name': - default: - $output = get_option('blogname'); - break; - } - - $url = true; - if (strpos($show, 'url') === false && - strpos($show, 'directory') === false && - strpos($show, 'home') === false) - $url = false; - - if ( 'display' == $filter ) { - if ( $url ) { - /** - * Filters the URL returned by get_bloginfo(). - * - * @since 2.0.5 - * - * @param mixed $output The URL returned by bloginfo(). - * @param mixed $show Type of information requested. - */ - $output = apply_filters( 'bloginfo_url', $output, $show ); - } else { - /** - * Filters the site information returned by get_bloginfo(). - * - * @since 0.71 - * - * @param mixed $output The requested non-URL site information. - * @param mixed $show Type of information requested. - */ - $output = apply_filters( 'bloginfo', $output, $show ); - } - } - - return $output; -} - -/** - * Returns the Site Icon URL. - * - * @since 4.3.0 - * - * @param int $size Optional. Size of the site icon. Default 512 (pixels). - * @param string $url Optional. Fallback url if no site icon is found. Default empty. - * @param int $blog_id Optional. ID of the blog to get the site icon for. Default current blog. - * @return string Site Icon URL. - */ -function get_site_icon_url( $size = 512, $url = '', $blog_id = 0 ) { - $switched_blog = false; - - if ( is_multisite() && ! empty( $blog_id ) && (int) $blog_id !== get_current_blog_id() ) { - switch_to_blog( $blog_id ); - $switched_blog = true; - } - - $site_icon_id = get_option( 'site_icon' ); - - if ( $site_icon_id ) { - if ( $size >= 512 ) { - $size_data = 'full'; - } else { - $size_data = array( $size, $size ); - } - $url = wp_get_attachment_image_url( $site_icon_id, $size_data ); - } - - if ( $switched_blog ) { - restore_current_blog(); - } - - /** - * Filters the site icon URL. - * - * @site 4.4.0 - * - * @param string $url Site icon URL. - * @param int $size Size of the site icon. - * @param int $blog_id ID of the blog to get the site icon for. - */ - return apply_filters( 'get_site_icon_url', $url, $size, $blog_id ); -} - -/** - * Displays the Site Icon URL. - * - * @since 4.3.0 - * - * @param int $size Optional. Size of the site icon. Default 512 (pixels). - * @param string $url Optional. Fallback url if no site icon is found. Default empty. - * @param int $blog_id Optional. ID of the blog to get the site icon for. Default current blog. - */ -function site_icon_url( $size = 512, $url = '', $blog_id = 0 ) { - echo esc_url( get_site_icon_url( $size, $url, $blog_id ) ); -} - -/** - * Whether the site has a Site Icon. - * - * @since 4.3.0 - * - * @param int $blog_id Optional. ID of the blog in question. Default current blog. - * @return bool Whether the site has a site icon or not. - */ -function has_site_icon( $blog_id = 0 ) { - return (bool) get_site_icon_url( 512, '', $blog_id ); -} - -/** - * Determines whether the site has a custom logo. - * - * @since 4.5.0 - * - * @param int $blog_id Optional. ID of the blog in question. Default is the ID of the current blog. - * @return bool Whether the site has a custom logo or not. - */ -function has_custom_logo( $blog_id = 0 ) { - $switched_blog = false; - - if ( is_multisite() && ! empty( $blog_id ) && (int) $blog_id !== get_current_blog_id() ) { - switch_to_blog( $blog_id ); - $switched_blog = true; - } - - $custom_logo_id = get_theme_mod( 'custom_logo' ); - - if ( $switched_blog ) { - restore_current_blog(); - } - - return (bool) $custom_logo_id; -} - -/** - * Returns a custom logo, linked to home. - * - * @since 4.5.0 - * - * @param int $blog_id Optional. ID of the blog in question. Default is the ID of the current blog. - * @return string Custom logo markup. - */ -function get_custom_logo( $blog_id = 0 ) { - $html = ''; - $switched_blog = false; - - if ( is_multisite() && ! empty( $blog_id ) && (int) $blog_id !== get_current_blog_id() ) { - switch_to_blog( $blog_id ); - $switched_blog = true; - } - - $custom_logo_id = get_theme_mod( 'custom_logo' ); - - // We have a logo. Logo is go. - if ( $custom_logo_id ) { - $html = sprintf( '', - esc_url( home_url( '/' ) ), - wp_get_attachment_image( $custom_logo_id, 'full', false, array( - 'class' => 'custom-logo', - 'itemprop' => 'logo', - ) ) - ); - } - - // If no logo is set but we're in the Customizer, leave a placeholder (needed for the live preview). - elseif ( is_customize_preview() ) { - $html = sprintf( '', - esc_url( home_url( '/' ) ) - ); - } - - if ( $switched_blog ) { - restore_current_blog(); - } - - /** - * Filters the custom logo output. - * - * @since 4.5.0 - * @since 4.6.0 Added the `$blog_id` parameter. - * - * @param string $html Custom logo HTML output. - * @param int $blog_id ID of the blog to get the custom logo for. - */ - return apply_filters( 'get_custom_logo', $html, $blog_id ); -} - -/** - * Displays a custom logo, linked to home. - * - * @since 4.5.0 - * - * @param int $blog_id Optional. ID of the blog in question. Default is the ID of the current blog. - */ -function the_custom_logo( $blog_id = 0 ) { - echo get_custom_logo( $blog_id ); -} - -/** - * Returns document title for the current page. - * - * @since 4.4.0 - * - * @global int $page Page number of a single post. - * @global int $paged Page number of a list of posts. - * - * @return string Tag with the document title. - */ -function wp_get_document_title() { - - /** - * Filters the document title before it is generated. - * - * Passing a non-empty value will short-circuit wp_get_document_title(), - * returning that value instead. - * - * @since 4.4.0 - * - * @param string $title The document title. Default empty string. - */ - $title = apply_filters( 'pre_get_document_title', '' ); - if ( ! empty( $title ) ) { - return $title; - } - - global $page, $paged; - - $title = array( - 'title' => '', - ); - - // If it's a 404 page, use a "Page not found" title. - if ( is_404() ) { - $title['title'] = __( 'Page not found' ); - - // If it's a search, use a dynamic search results title. - } elseif ( is_search() ) { - /* translators: %s: search phrase */ - $title['title'] = sprintf( __( 'Search Results for “%s”' ), get_search_query() ); - - // If on the front page, use the site title. - } elseif ( is_front_page() ) { - $title['title'] = get_bloginfo( 'name', 'display' ); - - // If on a post type archive, use the post type archive title. - } elseif ( is_post_type_archive() ) { - $title['title'] = post_type_archive_title( '', false ); - - // If on a taxonomy archive, use the term title. - } elseif ( is_tax() ) { - $title['title'] = single_term_title( '', false ); - - /* - * If we're on the blog page that is not the homepage or - * a single post of any post type, use the post title. - */ - } elseif ( is_home() || is_singular() ) { - $title['title'] = single_post_title( '', false ); - - // If on a category or tag archive, use the term title. - } elseif ( is_category() || is_tag() ) { - $title['title'] = single_term_title( '', false ); - - // If on an author archive, use the author's display name. - } elseif ( is_author() && $author = get_queried_object() ) { - $title['title'] = $author->display_name; - - // If it's a date archive, use the date as the title. - } elseif ( is_year() ) { - $title['title'] = get_the_date( _x( 'Y', 'yearly archives date format' ) ); - - } elseif ( is_month() ) { - $title['title'] = get_the_date( _x( 'F Y', 'monthly archives date format' ) ); - - } elseif ( is_day() ) { - $title['title'] = get_the_date(); - } - - // Add a page number if necessary. - if ( ( $paged >= 2 || $page >= 2 ) && ! is_404() ) { - $title['page'] = sprintf( __( 'Page %s' ), max( $paged, $page ) ); - } - - // Append the description or site title to give context. - if ( is_front_page() ) { - $title['tagline'] = get_bloginfo( 'description', 'display' ); - } else { - $title['site'] = get_bloginfo( 'name', 'display' ); - } - - /** - * Filters the separator for the document title. - * - * @since 4.4.0 - * - * @param string $sep Document title separator. Default '-'. - */ - $sep = apply_filters( 'document_title_separator', '-' ); - - /** - * Filters the parts of the document title. - * - * @since 4.4.0 - * - * @param array $title { - * The document title parts. - * - * @type string $title Title of the viewed page. - * @type string $page Optional. Page number if paginated. - * @type string $tagline Optional. Site description when on home page. - * @type string $site Optional. Site title when not on home page. - * } - */ - $title = apply_filters( 'document_title_parts', $title ); - - $title = implode( " $sep ", array_filter( $title ) ); - $title = wptexturize( $title ); - $title = convert_chars( $title ); - $title = esc_html( $title ); - $title = capital_P_dangit( $title ); - - return $title; -} - -/** - * Displays title tag with content. - * - * @ignore - * @since 4.1.0 - * @since 4.4.0 Improved title output replaced `wp_title()`. - * @access private - */ -function _wp_render_title_tag() { - if ( ! current_theme_supports( 'title-tag' ) ) { - return; - } - - echo '' . wp_get_document_title() . '' . "\n"; -} - -/** - * Display or retrieve page title for all areas of blog. - * - * By default, the page title will display the separator before the page title, - * so that the blog title will be before the page title. This is not good for - * title display, since the blog title shows up on most tabs and not what is - * important, which is the page that the user is looking at. - * - * There are also SEO benefits to having the blog title after or to the 'right' - * of the page title. However, it is mostly common sense to have the blog title - * to the right with most browsers supporting tabs. You can achieve this by - * using the seplocation parameter and setting the value to 'right'. This change - * was introduced around 2.5.0, in case backward compatibility of themes is - * important. - * - * @since 1.0.0 - * - * @global WP_Locale $wp_locale - * - * @param string $sep Optional, default is '»'. How to separate the various items - * within the page title. - * @param bool $display Optional, default is true. Whether to display or retrieve title. - * @param string $seplocation Optional. Direction to display title, 'right'. - * @return string|null String on retrieve, null when displaying. - */ -function wp_title( $sep = '»', $display = true, $seplocation = '' ) { - global $wp_locale; - - $m = get_query_var( 'm' ); - $year = get_query_var( 'year' ); - $monthnum = get_query_var( 'monthnum' ); - $day = get_query_var( 'day' ); - $search = get_query_var( 's' ); - $title = ''; - - $t_sep = '%WP_TITLE_SEP%'; // Temporary separator, for accurate flipping, if necessary - - // If there is a post - if ( is_single() || ( is_home() && ! is_front_page() ) || ( is_page() && ! is_front_page() ) ) { - $title = single_post_title( '', false ); - } - - // If there's a post type archive - if ( is_post_type_archive() ) { - $post_type = get_query_var( 'post_type' ); - if ( is_array( $post_type ) ) { - $post_type = reset( $post_type ); - } - $post_type_object = get_post_type_object( $post_type ); - if ( ! $post_type_object->has_archive ) { - $title = post_type_archive_title( '', false ); - } - } - - // If there's a category or tag - if ( is_category() || is_tag() ) { - $title = single_term_title( '', false ); - } - - // If there's a taxonomy - if ( is_tax() ) { - $term = get_queried_object(); - if ( $term ) { - $tax = get_taxonomy( $term->taxonomy ); - $title = single_term_title( $tax->labels->name . $t_sep, false ); - } - } - - // If there's an author - if ( is_author() && ! is_post_type_archive() ) { - $author = get_queried_object(); - if ( $author ) { - $title = $author->display_name; - } - } - - // Post type archives with has_archive should override terms. - if ( is_post_type_archive() && $post_type_object->has_archive ) { - $title = post_type_archive_title( '', false ); - } - - // If there's a month - if ( is_archive() && ! empty( $m ) ) { - $my_year = substr( $m, 0, 4 ); - $my_month = $wp_locale->get_month( substr( $m, 4, 2 ) ); - $my_day = intval( substr( $m, 6, 2 ) ); - $title = $my_year . ( $my_month ? $t_sep . $my_month : '' ) . ( $my_day ? $t_sep . $my_day : '' ); - } - - // If there's a year - if ( is_archive() && ! empty( $year ) ) { - $title = $year; - if ( ! empty( $monthnum ) ) { - $title .= $t_sep . $wp_locale->get_month( $monthnum ); - } - if ( ! empty( $day ) ) { - $title .= $t_sep . zeroise( $day, 2 ); - } - } - - // If it's a search - if ( is_search() ) { - /* translators: 1: separator, 2: search phrase */ - $title = sprintf( __( 'Search Results %1$s %2$s' ), $t_sep, strip_tags( $search ) ); - } - - // If it's a 404 page - if ( is_404() ) { - $title = __( 'Page not found' ); - } - - $prefix = ''; - if ( ! empty( $title ) ) { - $prefix = " $sep "; - } - - /** - * Filters the parts of the page title. - * - * @since 4.0.0 - * - * @param array $title_array Parts of the page title. - */ - $title_array = apply_filters( 'wp_title_parts', explode( $t_sep, $title ) ); - - // Determines position of the separator and direction of the breadcrumb - if ( 'right' == $seplocation ) { // sep on right, so reverse the order - $title_array = array_reverse( $title_array ); - $title = implode( " $sep ", $title_array ) . $prefix; - } else { - $title = $prefix . implode( " $sep ", $title_array ); - } - - /** - * Filters the text of the page title. - * - * @since 2.0.0 - * - * @param string $title Page title. - * @param string $sep Title separator. - * @param string $seplocation Location of the separator (left or right). - */ - $title = apply_filters( 'wp_title', $title, $sep, $seplocation ); - - // Send it out - if ( $display ) { - echo $title; - } else { - return $title; - } -} - -/** - * Display or retrieve page title for post. - * - * This is optimized for single.php template file for displaying the post title. - * - * It does not support placing the separator after the title, but by leaving the - * prefix parameter empty, you can set the title separator manually. The prefix - * does not automatically place a space between the prefix, so if there should - * be a space, the parameter value will need to have it at the end. - * - * @since 0.71 - * - * @param string $prefix Optional. What to display before the title. - * @param bool $display Optional, default is true. Whether to display or retrieve title. - * @return string|void Title when retrieving. - */ -function single_post_title( $prefix = '', $display = true ) { - $_post = get_queried_object(); - - if ( !isset($_post->post_title) ) - return; - - /** - * Filters the page title for a single post. - * - * @since 0.71 - * - * @param string $_post_title The single post page title. - * @param object $_post The current queried object as returned by get_queried_object(). - */ - $title = apply_filters( 'single_post_title', $_post->post_title, $_post ); - if ( $display ) - echo $prefix . $title; - else - return $prefix . $title; -} - -/** - * Display or retrieve title for a post type archive. - * - * This is optimized for archive.php and archive-{$post_type}.php template files - * for displaying the title of the post type. - * - * @since 3.1.0 - * - * @param string $prefix Optional. What to display before the title. - * @param bool $display Optional, default is true. Whether to display or retrieve title. - * @return string|void Title when retrieving, null when displaying or failure. - */ -function post_type_archive_title( $prefix = '', $display = true ) { - if ( ! is_post_type_archive() ) - return; - - $post_type = get_query_var( 'post_type' ); - if ( is_array( $post_type ) ) - $post_type = reset( $post_type ); - - $post_type_obj = get_post_type_object( $post_type ); - - /** - * Filters the post type archive title. - * - * @since 3.1.0 - * - * @param string $post_type_name Post type 'name' label. - * @param string $post_type Post type. - */ - $title = apply_filters( 'post_type_archive_title', $post_type_obj->labels->name, $post_type ); - - if ( $display ) - echo $prefix . $title; - else - return $prefix . $title; -} - -/** - * Display or retrieve page title for category archive. - * - * Useful for category template files for displaying the category page title. - * The prefix does not automatically place a space between the prefix, so if - * there should be a space, the parameter value will need to have it at the end. - * - * @since 0.71 - * - * @param string $prefix Optional. What to display before the title. - * @param bool $display Optional, default is true. Whether to display or retrieve title. - * @return string|void Title when retrieving. - */ -function single_cat_title( $prefix = '', $display = true ) { - return single_term_title( $prefix, $display ); -} - -/** - * Display or retrieve page title for tag post archive. - * - * Useful for tag template files for displaying the tag page title. The prefix - * does not automatically place a space between the prefix, so if there should - * be a space, the parameter value will need to have it at the end. - * - * @since 2.3.0 - * - * @param string $prefix Optional. What to display before the title. - * @param bool $display Optional, default is true. Whether to display or retrieve title. - * @return string|void Title when retrieving. - */ -function single_tag_title( $prefix = '', $display = true ) { - return single_term_title( $prefix, $display ); -} - -/** - * Display or retrieve page title for taxonomy term archive. - * - * Useful for taxonomy term template files for displaying the taxonomy term page title. - * The prefix does not automatically place a space between the prefix, so if there should - * be a space, the parameter value will need to have it at the end. - * - * @since 3.1.0 - * - * @param string $prefix Optional. What to display before the title. - * @param bool $display Optional, default is true. Whether to display or retrieve title. - * @return string|void Title when retrieving. - */ -function single_term_title( $prefix = '', $display = true ) { - $term = get_queried_object(); - - if ( !$term ) - return; - - if ( is_category() ) { - /** - * Filters the category archive page title. - * - * @since 2.0.10 - * - * @param string $term_name Category name for archive being displayed. - */ - $term_name = apply_filters( 'single_cat_title', $term->name ); - } elseif ( is_tag() ) { - /** - * Filters the tag archive page title. - * - * @since 2.3.0 - * - * @param string $term_name Tag name for archive being displayed. - */ - $term_name = apply_filters( 'single_tag_title', $term->name ); - } elseif ( is_tax() ) { - /** - * Filters the custom taxonomy archive page title. - * - * @since 3.1.0 - * - * @param string $term_name Term name for archive being displayed. - */ - $term_name = apply_filters( 'single_term_title', $term->name ); - } else { - return; - } - - if ( empty( $term_name ) ) - return; - - if ( $display ) - echo $prefix . $term_name; - else - return $prefix . $term_name; -} - -/** - * Display or retrieve page title for post archive based on date. - * - * Useful for when the template only needs to display the month and year, - * if either are available. The prefix does not automatically place a space - * between the prefix, so if there should be a space, the parameter value - * will need to have it at the end. - * - * @since 0.71 - * - * @global WP_Locale $wp_locale - * - * @param string $prefix Optional. What to display before the title. - * @param bool $display Optional, default is true. Whether to display or retrieve title. - * @return string|void Title when retrieving. - */ -function single_month_title($prefix = '', $display = true ) { - global $wp_locale; - - $m = get_query_var('m'); - $year = get_query_var('year'); - $monthnum = get_query_var('monthnum'); - - if ( !empty($monthnum) && !empty($year) ) { - $my_year = $year; - $my_month = $wp_locale->get_month($monthnum); - } elseif ( !empty($m) ) { - $my_year = substr($m, 0, 4); - $my_month = $wp_locale->get_month(substr($m, 4, 2)); - } - - if ( empty($my_month) ) - return false; - - $result = $prefix . $my_month . $prefix . $my_year; - - if ( !$display ) - return $result; - echo $result; -} - -/** - * Display the archive title based on the queried object. - * - * @since 4.1.0 - * - * @see get_the_archive_title() - * - * @param string $before Optional. Content to prepend to the title. Default empty. - * @param string $after Optional. Content to append to the title. Default empty. - */ -function the_archive_title( $before = '', $after = '' ) { - $title = get_the_archive_title(); - - if ( ! empty( $title ) ) { - echo $before . $title . $after; - } -} - -/** - * Retrieve the archive title based on the queried object. - * - * @since 4.1.0 - * - * @return string Archive title. - */ -function get_the_archive_title() { - if ( is_category() ) { - /* translators: Category archive title. 1: Category name */ - $title = sprintf( __( 'Category: %s' ), single_cat_title( '', false ) ); - } elseif ( is_tag() ) { - /* translators: Tag archive title. 1: Tag name */ - $title = sprintf( __( 'Tag: %s' ), single_tag_title( '', false ) ); - } elseif ( is_author() ) { - /* translators: Author archive title. 1: Author name */ - $title = sprintf( __( 'Author: %s' ), '' . get_the_author() . '' ); - } elseif ( is_year() ) { - /* translators: Yearly archive title. 1: Year */ - $title = sprintf( __( 'Year: %s' ), get_the_date( _x( 'Y', 'yearly archives date format' ) ) ); - } elseif ( is_month() ) { - /* translators: Monthly archive title. 1: Month name and year */ - $title = sprintf( __( 'Month: %s' ), get_the_date( _x( 'F Y', 'monthly archives date format' ) ) ); - } elseif ( is_day() ) { - /* translators: Daily archive title. 1: Date */ - $title = sprintf( __( 'Day: %s' ), get_the_date( _x( 'F j, Y', 'daily archives date format' ) ) ); - } elseif ( is_tax( 'post_format' ) ) { - if ( is_tax( 'post_format', 'post-format-aside' ) ) { - $title = _x( 'Asides', 'post format archive title' ); - } elseif ( is_tax( 'post_format', 'post-format-gallery' ) ) { - $title = _x( 'Galleries', 'post format archive title' ); - } elseif ( is_tax( 'post_format', 'post-format-image' ) ) { - $title = _x( 'Images', 'post format archive title' ); - } elseif ( is_tax( 'post_format', 'post-format-video' ) ) { - $title = _x( 'Videos', 'post format archive title' ); - } elseif ( is_tax( 'post_format', 'post-format-quote' ) ) { - $title = _x( 'Quotes', 'post format archive title' ); - } elseif ( is_tax( 'post_format', 'post-format-link' ) ) { - $title = _x( 'Links', 'post format archive title' ); - } elseif ( is_tax( 'post_format', 'post-format-status' ) ) { - $title = _x( 'Statuses', 'post format archive title' ); - } elseif ( is_tax( 'post_format', 'post-format-audio' ) ) { - $title = _x( 'Audio', 'post format archive title' ); - } elseif ( is_tax( 'post_format', 'post-format-chat' ) ) { - $title = _x( 'Chats', 'post format archive title' ); - } - } elseif ( is_post_type_archive() ) { - /* translators: Post type archive title. 1: Post type name */ - $title = sprintf( __( 'Archives: %s' ), post_type_archive_title( '', false ) ); - } elseif ( is_tax() ) { - $tax = get_taxonomy( get_queried_object()->taxonomy ); - /* translators: Taxonomy term archive title. 1: Taxonomy singular name, 2: Current taxonomy term */ - $title = sprintf( __( '%1$s: %2$s' ), $tax->labels->singular_name, single_term_title( '', false ) ); - } else { - $title = __( 'Archives' ); - } - - /** - * Filters the archive title. - * - * @since 4.1.0 - * - * @param string $title Archive title to be displayed. - */ - return apply_filters( 'get_the_archive_title', $title ); -} - -/** - * Display category, tag, term, or author description. - * - * @since 4.1.0 - * - * @see get_the_archive_description() - * - * @param string $before Optional. Content to prepend to the description. Default empty. - * @param string $after Optional. Content to append to the description. Default empty. - */ -function the_archive_description( $before = '', $after = '' ) { - $description = get_the_archive_description(); - if ( $description ) { - echo $before . $description . $after; - } -} - -/** - * Retrieve category, tag, term, or author description. - * - * @since 4.1.0 - * @since 4.7.0 Added support for author archives. - * - * @see term_description() - * - * @return string Archive description. - */ -function get_the_archive_description() { - if ( is_author() ) { - $description = get_the_author_meta( 'description' ); - } else { - $description = term_description(); - } - - /** - * Filters the archive description. - * - * @since 4.1.0 - * - * @param string $description Archive description to be displayed. - */ - return apply_filters( 'get_the_archive_description', $description ); -} - -/** - * Retrieve archive link content based on predefined or custom code. - * - * The format can be one of four styles. The 'link' for head element, 'option' - * for use in the select element, 'html' for use in list (either ol or ul HTML - * elements). Custom content is also supported using the before and after - * parameters. - * - * The 'link' format uses the `` HTML element with the **archives** - * relationship. The before and after parameters are not used. The text - * parameter is used to describe the link. - * - * The 'option' format uses the option HTML element for use in select element. - * The value is the url parameter and the before and after parameters are used - * between the text description. - * - * The 'html' format, which is the default, uses the li HTML element for use in - * the list HTML elements. The before parameter is before the link and the after - * parameter is after the closing link. - * - * The custom format uses the before parameter before the link ('a' HTML - * element) and the after parameter after the closing link tag. If the above - * three values for the format are not used, then custom format is assumed. - * - * @since 1.0.0 - * - * @param string $url URL to archive. - * @param string $text Archive text description. - * @param string $format Optional, default is 'html'. Can be 'link', 'option', 'html', or custom. - * @param string $before Optional. Content to prepend to the description. Default empty. - * @param string $after Optional. Content to append to the description. Default empty. - * @return string HTML link content for archive. - */ -function get_archives_link($url, $text, $format = 'html', $before = '', $after = '') { - $text = wptexturize($text); - $url = esc_url($url); - - if ('link' == $format) - $link_html = "\t\n"; - elseif ('option' == $format) - $link_html = "\t\n"; - elseif ('html' == $format) - $link_html = "\t
    15. $before$text$after
    16. \n"; - else // custom - $link_html = "\t$before$text$after\n"; - - /** - * Filters the archive link content. - * - * @since 2.6.0 - * @since 4.5.0 Added the `$url`, `$text`, `$format`, `$before`, and `$after` parameters. - * - * @param string $link_html The archive HTML link content. - * @param string $url URL to archive. - * @param string $text Archive text description. - * @param string $format Link format. Can be 'link', 'option', 'html', or custom. - * @param string $before Content to prepend to the description. - * @param string $after Content to append to the description. - */ - return apply_filters( 'get_archives_link', $link_html, $url, $text, $format, $before, $after ); -} - -/** - * Display archive links based on type and format. - * - * @since 1.2.0 - * @since 4.4.0 $post_type arg was added. - * - * @see get_archives_link() - * - * @global wpdb $wpdb - * @global WP_Locale $wp_locale - * - * @param string|array $args { - * Default archive links arguments. Optional. - * - * @type string $type Type of archive to retrieve. Accepts 'daily', 'weekly', 'monthly', - * 'yearly', 'postbypost', or 'alpha'. Both 'postbypost' and 'alpha' - * display the same archive link list as well as post titles instead - * of displaying dates. The difference between the two is that 'alpha' - * will order by post title and 'postbypost' will order by post date. - * Default 'monthly'. - * @type string|int $limit Number of links to limit the query to. Default empty (no limit). - * @type string $format Format each link should take using the $before and $after args. - * Accepts 'link' (`` tag), 'option' (`
    17. ').appendTo(a("body")).hide(),b.container.bind("contextmenu",function(a){return b.isContextMenuEnabled?(a.preventDefault(),b.renderContextMenu(a.clientX-1,a.clientY-1),!1):void 0}),b.container.bind("click",function(){b.contextMenu.hide()}),b.contextMenu.bind("mouseleave",function(){b.startContextMenuTimer()})},cleancontextmenu:function(a){a.contextMenu.remove()},isContextMenuEnabled:!0,enableContextMenu:function(){this.isContextMenuEnabled=!0},disableContextMenu:function(){this.isContextMenuEnabled=!1},contextMenuTimeout:null,startContextMenuTimer:function(){var a=this;a.killContextMenuTimer(),a.contextMenuTimer=setTimeout(function(){a.hideContextMenu(),a.killContextMenuTimer()},750)},killContextMenuTimer:function(){var a=this.contextMenuTimer;null!=a&&(clearTimeout(a),delete a,a=null)},hideContextMenu:function(){this.contextMenu.hide()},renderContextMenu:function(b,c){for(var d=this,e="",f=d.options.contextMenuItems,g=0,h=f.length;h>g;g++)if(f[g].isSeparator)e+='
      ';else{var i=f[g].render(d);null!=i&&(e+='
      '+i+"
      ")}d.contextMenu.empty().append(a(e)).css({top:c,left:b}).show(),d.contextMenu.find(".mejs-contextmenu-item").each(function(){var b=a(this),c=parseInt(b.data("itemindex"),10),e=d.options.contextMenuItems[c];"undefined"!=typeof e.show&&e.show(b,d),b.click(function(){"undefined"!=typeof e.click&&e.click(d),d.contextMenu.hide()})}),setTimeout(function(){d.killControlsTimer("rev3")},100)}})}(mejs.$),function(a){a.extend(mejs.MepDefaults,{skipBackInterval:30,skipBackText:mejs.i18n.t("Skip back %1 seconds")}),a.extend(MediaElementPlayer.prototype,{buildskipback:function(b,c,d,e){var f=this,g=f.options.skipBackText.replace("%1",f.options.skipBackInterval);a('
      ").appendTo(c).click(function(){e.setCurrentTime(Math.max(e.currentTime-f.options.skipBackInterval,0)),a(this).find("button").blur()})}})}(mejs.$),function(a){a.extend(mejs.MepDefaults,{postrollCloseText:mejs.i18n.t("Close")}),a.extend(MediaElementPlayer.prototype,{buildpostroll:function(b,c,d,e){var f=this,g=f.container.find('link[rel="postroll"]').attr("href");"undefined"!=typeof g&&(b.postroll=a('').prependTo(d).hide(),f.media.addEventListener("ended",function(c){a.ajax({dataType:"html",url:g,success:function(a,b){d.find(".mejs-postroll-layer-content").html(a)}}),b.postroll.show()},!1))}})}(mejs.$); \ No newline at end of file diff --git a/wp/wp-includes/js/mediaelement/mediaelementplayer.min.css b/wp/wp-includes/js/mediaelement/mediaelementplayer.min.css deleted file mode 100644 index fced6edc..00000000 --- a/wp/wp-includes/js/mediaelement/mediaelementplayer.min.css +++ /dev/null @@ -1 +0,0 @@ -.mejs-offscreen{clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);clip-path:polygon(0px 0,0 0,0 0,0 0);position:absolute!important;height:1px;width:1px;overflow:hidden}.mejs-container{position:relative;background:#000;font-family:Helvetica,Arial;text-align:left;vertical-align:top;text-indent:0}.mejs-fill-container,.mejs-fill-container .mejs-container{width:100%;height:100%}.mejs-fill-container{overflow:hidden}.mejs-container:focus{outline:0}.me-plugin{position:absolute}.mejs-embed,.mejs-embed body{width:100%;height:100%;margin:0;padding:0;background:#000;overflow:hidden}.mejs-fullscreen{overflow:hidden!important}.mejs-container-fullscreen{position:fixed;left:0;top:0;right:0;bottom:0;overflow:hidden;z-index:1000}.mejs-container-fullscreen .mejs-mediaelement,.mejs-container-fullscreen video{width:100%;height:100%}.mejs-clear{clear:both}.mejs-background{position:absolute;top:0;left:0}.mejs-mediaelement{position:absolute;top:0;left:0;width:100%;height:100%}.mejs-poster{position:absolute;top:0;left:0;background-size:contain;background-position:50% 50%;background-repeat:no-repeat}:root .mejs-poster img{display:none}.mejs-poster img{border:0;padding:0;border:0}.mejs-overlay{position:absolute;top:0;left:0}.mejs-overlay-play{cursor:pointer}.mejs-overlay-button{position:absolute;top:50%;left:50%;width:100px;height:100px;margin:-50px 0 0 -50px;background:url(bigplay.svg) no-repeat}.no-svg .mejs-overlay-button{background-image:url(bigplay.png)}.mejs-overlay:hover .mejs-overlay-button{background-position:0 -100px}.mejs-overlay-loading{position:absolute;top:50%;left:50%;width:80px;height:80px;margin:-40px 0 0 -40px;background:#333;background:url(background.png);background:rgba(0,0,0,.9);background:-webkit-gradient(linear,0 0,0 100%,from(rgba(50,50,50,.9)),to(rgba(0,0,0,.9)));background:-webkit-linear-gradient(top,rgba(50,50,50,.9),rgba(0,0,0,.9));background:-moz-linear-gradient(top,rgba(50,50,50,.9),rgba(0,0,0,.9));background:-o-linear-gradient(top,rgba(50,50,50,.9),rgba(0,0,0,.9));background:-ms-linear-gradient(top,rgba(50,50,50,.9),rgba(0,0,0,.9));background:linear-gradient(rgba(50,50,50,.9),rgba(0,0,0,.9))}.mejs-overlay-loading span{display:block;width:80px;height:80px;background:transparent url(loading.gif) 50% 50% no-repeat}.mejs-container .mejs-controls{position:absolute;list-style-type:none;margin:0;padding:0;bottom:0;left:0;background:url(background.png);background:rgba(0,0,0,.7);background:-webkit-gradient(linear,0 0,0 100%,from(rgba(50,50,50,.7)),to(rgba(0,0,0,.7)));background:-webkit-linear-gradient(top,rgba(50,50,50,.7),rgba(0,0,0,.7));background:-moz-linear-gradient(top,rgba(50,50,50,.7),rgba(0,0,0,.7));background:-o-linear-gradient(top,rgba(50,50,50,.7),rgba(0,0,0,.7));background:-ms-linear-gradient(top,rgba(50,50,50,.7),rgba(0,0,0,.7));background:linear-gradient(rgba(50,50,50,.7),rgba(0,0,0,.7));height:30px;width:100%}.mejs-container .mejs-controls div{list-style-type:none;background-image:none;display:block;float:left;margin:0;padding:0;width:26px;height:26px;font-size:11px;line-height:11px;font-family:Helvetica,Arial;border:0}.mejs-controls .mejs-button button{cursor:pointer;display:block;font-size:0;line-height:0;text-decoration:none;margin:7px 5px;padding:0;position:absolute;height:16px;width:16px;border:0;background:transparent url(controls.svg) no-repeat}.no-svg .mejs-controls .mejs-button button{background-image:url(controls.png)}.mejs-controls .mejs-button button:focus{outline:dotted 1px #999}.mejs-container .mejs-controls .mejs-time{color:#fff;display:block;height:17px;width:auto;padding:10px 3px 0;overflow:hidden;text-align:center;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}.mejs-container .mejs-controls .mejs-time a{color:#fff;font-size:11px;line-height:12px;display:block;float:left;margin:1px 2px 0 0;width:auto}.mejs-controls .mejs-play button{background-position:0 0}.mejs-controls .mejs-pause button{background-position:0 -16px}.mejs-controls .mejs-stop button{background-position:-112px 0}.mejs-controls div.mejs-time-rail{direction:ltr;width:200px;padding-top:5px}.mejs-controls .mejs-time-rail span,.mejs-controls .mejs-time-rail a{display:block;position:absolute;width:180px;height:10px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;cursor:pointer}.mejs-controls .mejs-time-rail .mejs-time-total{margin:5px;background:#333;background:rgba(50,50,50,.8);background:-webkit-gradient(linear,0 0,0 100%,from(rgba(30,30,30,.8)),to(rgba(60,60,60,.8)));background:-webkit-linear-gradient(top,rgba(30,30,30,.8),rgba(60,60,60,.8));background:-moz-linear-gradient(top,rgba(30,30,30,.8),rgba(60,60,60,.8));background:-o-linear-gradient(top,rgba(30,30,30,.8),rgba(60,60,60,.8));background:-ms-linear-gradient(top,rgba(30,30,30,.8),rgba(60,60,60,.8));background:linear-gradient(rgba(30,30,30,.8),rgba(60,60,60,.8))}.mejs-controls .mejs-time-rail .mejs-time-buffering{width:100%;background-image:-o-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,.15)),color-stop(0.75,rgba(255,255,255,.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-ms-linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:15px 15px;-moz-background-size:15px 15px;-o-background-size:15px 15px;background-size:15px 15px;-webkit-animation:buffering-stripes 2s linear infinite;-moz-animation:buffering-stripes 2s linear infinite;-ms-animation:buffering-stripes 2s linear infinite;-o-animation:buffering-stripes 2s linear infinite;animation:buffering-stripes 2s linear infinite}@-webkit-keyframes buffering-stripes{from{background-position:0 0}to{background-position:30px 0}}@-moz-keyframes buffering-stripes{from{background-position:0 0}to{background-position:30px 0}}@-ms-keyframes buffering-stripes{from{background-position:0 0}to{background-position:30px 0}}@-o-keyframes buffering-stripes{from{background-position:0 0}to{background-position:30px 0}}@keyframes buffering-stripes{from{background-position:0 0}to{background-position:30px 0}}.mejs-controls .mejs-time-rail .mejs-time-loaded{background:#3caac8;background:rgba(60,170,200,.8);background:-webkit-gradient(linear,0 0,0 100%,from(rgba(44,124,145,.8)),to(rgba(78,183,212,.8)));background:-webkit-linear-gradient(top,rgba(44,124,145,.8),rgba(78,183,212,.8));background:-moz-linear-gradient(top,rgba(44,124,145,.8),rgba(78,183,212,.8));background:-o-linear-gradient(top,rgba(44,124,145,.8),rgba(78,183,212,.8));background:-ms-linear-gradient(top,rgba(44,124,145,.8),rgba(78,183,212,.8));background:linear-gradient(rgba(44,124,145,.8),rgba(78,183,212,.8));width:0}.mejs-controls .mejs-time-rail .mejs-time-current{background:#fff;background:rgba(255,255,255,.8);background:-webkit-gradient(linear,0 0,0 100%,from(rgba(255,255,255,.9)),to(rgba(200,200,200,.8)));background:-webkit-linear-gradient(top,rgba(255,255,255,.9),rgba(200,200,200,.8));background:-moz-linear-gradient(top,rgba(255,255,255,.9),rgba(200,200,200,.8));background:-o-linear-gradient(top,rgba(255,255,255,.9),rgba(200,200,200,.8));background:-ms-linear-gradient(top,rgba(255,255,255,.9),rgba(200,200,200,.8));background:linear-gradient(rgba(255,255,255,.9),rgba(200,200,200,.8));width:0}.mejs-controls .mejs-time-rail .mejs-time-handle{display:none;position:absolute;margin:0;width:10px;background:#fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;cursor:pointer;border:solid 2px #333;top:-2px;text-align:center}.mejs-controls .mejs-time-rail .mejs-time-float{position:absolute;display:none;background:#eee;width:36px;height:17px;border:solid 1px #333;top:-26px;margin-left:-18px;text-align:center;color:#111}.mejs-controls .mejs-time-rail .mejs-time-float-current{margin:2px;width:30px;display:block;text-align:center;left:0}.mejs-controls .mejs-time-rail .mejs-time-float-corner{position:absolute;display:block;width:0;height:0;line-height:0;border:solid 5px #eee;border-color:#eee transparent transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;top:15px;left:13px}.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float{width:48px}.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float-current{width:44px}.mejs-long-video .mejs-controls .mejs-time-rail .mejs-time-float-corner{left:18px}.mejs-controls .mejs-fullscreen-button button{background-position:-32px 0}.mejs-controls .mejs-unfullscreen button{background-position:-32px -16px}.mejs-controls .mejs-volume-button{}.mejs-controls .mejs-mute button{background-position:-16px -16px}.mejs-controls .mejs-unmute button{background-position:-16px 0}.mejs-controls .mejs-volume-button{position:relative}.mejs-controls .mejs-volume-button .mejs-volume-slider{display:none;height:115px;width:25px;background:url(background.png);background:rgba(50,50,50,.7);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;top:-115px;left:0;z-index:1;position:absolute;margin:0}.mejs-controls .mejs-volume-button:hover{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-total{position:absolute;left:11px;top:8px;width:2px;height:100px;background:#ddd;background:rgba(255,255,255,.5);margin:0}.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-current{position:absolute;left:11px;top:8px;width:2px;height:100px;background:#ddd;background:rgba(255,255,255,.9);margin:0}.mejs-controls .mejs-volume-button .mejs-volume-slider .mejs-volume-handle{position:absolute;left:4px;top:-3px;width:16px;height:6px;background:#ddd;background:rgba(255,255,255,.9);cursor:N-resize;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;margin:0}.mejs-controls a.mejs-horizontal-volume-slider{height:26px;width:56px;position:relative;display:block;float:left;vertical-align:middle}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total{position:absolute;left:0;top:11px;width:50px;height:8px;margin:0;padding:0;font-size:1px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#333;background:rgba(50,50,50,.8);background:-webkit-gradient(linear,0 0,0 100%,from(rgba(30,30,30,.8)),to(rgba(60,60,60,.8)));background:-webkit-linear-gradient(top,rgba(30,30,30,.8),rgba(60,60,60,.8));background:-moz-linear-gradient(top,rgba(30,30,30,.8),rgba(60,60,60,.8));background:-o-linear-gradient(top,rgba(30,30,30,.8),rgba(60,60,60,.8));background:-ms-linear-gradient(top,rgba(30,30,30,.8),rgba(60,60,60,.8));background:linear-gradient(rgba(30,30,30,.8),rgba(60,60,60,.8))}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current{position:absolute;left:0;top:11px;width:50px;height:8px;margin:0;padding:0;font-size:1px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#fff;background:rgba(255,255,255,.8);background:-webkit-gradient(linear,0 0,0 100%,from(rgba(255,255,255,.9)),to(rgba(200,200,200,.8)));background:-webkit-linear-gradient(top,rgba(255,255,255,.9),rgba(200,200,200,.8));background:-moz-linear-gradient(top,rgba(255,255,255,.9),rgba(200,200,200,.8));background:-o-linear-gradient(top,rgba(255,255,255,.9),rgba(200,200,200,.8));background:-ms-linear-gradient(top,rgba(255,255,255,.9),rgba(200,200,200,.8));background:linear-gradient(rgba(255,255,255,.9),rgba(200,200,200,.8))}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-handle{display:none}.mejs-controls .mejs-captions-button{position:relative}.mejs-controls .mejs-captions-button button{background-position:-48px 0}.mejs-controls .mejs-captions-button .mejs-captions-selector{visibility:hidden;position:absolute;bottom:26px;right:-51px;width:85px;height:100px;background:url(background.png);background:rgba(50,50,50,.7);border:solid 1px transparent;padding:10px 10px 0;overflow:hidden;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.mejs-controls .mejs-captions-button:hover .mejs-captions-selector{visibility:visible}.mejs-controls .mejs-captions-button .mejs-captions-selector ul{margin:0;padding:0;display:block;list-style-type:none!important;overflow:hidden}.mejs-controls .mejs-captions-button .mejs-captions-selector ul li{margin:0 0 6px;padding:0;list-style-type:none!important;display:block;color:#fff;overflow:hidden}.mejs-controls .mejs-captions-button .mejs-captions-selector ul li input{clear:both;float:left;margin:3px 3px 0 5px}.mejs-controls .mejs-captions-button .mejs-captions-selector ul li label{width:55px;float:left;padding:4px 0 0;line-height:15px;font-family:helvetica,arial;font-size:10px}.mejs-controls .mejs-captions-button .mejs-captions-translations{font-size:10px;margin:0 0 5px}.mejs-chapters{position:absolute;top:0;left:0;-xborder-right:solid 1px #fff;width:10000px;z-index:1}.mejs-chapters .mejs-chapter{position:absolute;float:left;background:#222;background:rgba(0,0,0,.7);background:-webkit-gradient(linear,0 0,0 100%,from(rgba(50,50,50,.7)),to(rgba(0,0,0,.7)));background:-webkit-linear-gradient(top,rgba(50,50,50,.7),rgba(0,0,0,.7));background:-moz-linear-gradient(top,rgba(50,50,50,.7),rgba(0,0,0,.7));background:-o-linear-gradient(top,rgba(50,50,50,.7),rgba(0,0,0,.7));background:-ms-linear-gradient(top,rgba(50,50,50,.7),rgba(0,0,0,.7));background:linear-gradient(rgba(50,50,50,.7),rgba(0,0,0,.7));filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, startColorstr=#323232, endColorstr=#000000);overflow:hidden;border:0}.mejs-chapters .mejs-chapter .mejs-chapter-block{font-size:11px;color:#fff;padding:5px;display:block;border-right:solid 1px #333;border-bottom:solid 1px #333;cursor:pointer}.mejs-chapters .mejs-chapter .mejs-chapter-block-last{border-right:0}.mejs-chapters .mejs-chapter .mejs-chapter-block:hover{background:#666;background:rgba(102,102,102,.7);background:-webkit-gradient(linear,0 0,0 100%,from(rgba(102,102,102,.7)),to(rgba(50,50,50,.6)));background:-webkit-linear-gradient(top,rgba(102,102,102,.7),rgba(50,50,50,.6));background:-moz-linear-gradient(top,rgba(102,102,102,.7),rgba(50,50,50,.6));background:-o-linear-gradient(top,rgba(102,102,102,.7),rgba(50,50,50,.6));background:-ms-linear-gradient(top,rgba(102,102,102,.7),rgba(50,50,50,.6));background:linear-gradient(rgba(102,102,102,.7),rgba(50,50,50,.6));filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, startColorstr=#666666, endColorstr=#323232)}.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-title{font-size:12px;font-weight:700;display:block;white-space:nowrap;text-overflow:ellipsis;margin:0 0 3px;line-height:12px}.mejs-chapters .mejs-chapter .mejs-chapter-block .ch-timespan{font-size:12px;line-height:12px;margin:3px 0 4px;display:block;white-space:nowrap;text-overflow:ellipsis}.mejs-captions-layer{position:absolute;bottom:0;left:0;text-align:center;line-height:20px;font-size:16px;color:#fff}.mejs-captions-layer a{color:#fff;text-decoration:underline}.mejs-captions-layer[lang=ar]{font-size:20px;font-weight:400}.mejs-captions-position{position:absolute;width:100%;bottom:15px;left:0}.mejs-captions-position-hover{bottom:35px}.mejs-captions-text{padding:3px 5px;background:url(background.png);background:rgba(20,20,20,.5);white-space:pre-wrap}.me-cannotplay{}.me-cannotplay a{color:#fff;font-weight:700}.me-cannotplay span{padding:15px;display:block}.mejs-controls .mejs-loop-off button{background-position:-64px -16px}.mejs-controls .mejs-loop-on button{background-position:-64px 0}.mejs-controls .mejs-backlight-off button{background-position:-80px -16px}.mejs-controls .mejs-backlight-on button{background-position:-80px 0}.mejs-controls .mejs-picturecontrols-button{background-position:-96px 0}.mejs-contextmenu{position:absolute;width:150px;padding:10px;border-radius:4px;top:0;left:0;background:#fff;border:solid 1px #999;z-index:1001}.mejs-contextmenu .mejs-contextmenu-separator{height:1px;font-size:0;margin:5px 6px;background:#333}.mejs-contextmenu .mejs-contextmenu-item{font-family:Helvetica,Arial;font-size:12px;padding:4px 6px;cursor:pointer;color:#333}.mejs-contextmenu .mejs-contextmenu-item:hover{background:#2C7C91;color:#fff}.mejs-controls .mejs-sourcechooser-button{position:relative}.mejs-controls .mejs-sourcechooser-button button{background-position:-128px 0}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector{visibility:hidden;position:absolute;bottom:26px;right:-10px;width:130px;height:100px;background:url(background.png);background:rgba(50,50,50,.7);border:solid 1px transparent;padding:10px;overflow:hidden;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul{margin:0;padding:0;display:block;list-style-type:none!important;overflow:hidden}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li{margin:0 0 6px;padding:0;list-style-type:none!important;display:block;color:#fff;overflow:hidden}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li input{clear:both;float:left;margin:3px 3px 0 5px}.mejs-controls .mejs-sourcechooser-button .mejs-sourcechooser-selector ul li label{width:100px;float:left;padding:4px 0 0;line-height:15px;font-family:helvetica,arial;font-size:10px}.mejs-postroll-layer{position:absolute;bottom:0;left:0;width:100%;height:100%;background:url(background.png);background:rgba(50,50,50,.7);z-index:1000;overflow:hidden}.mejs-postroll-layer-content{width:100%;height:100%}.mejs-postroll-close{position:absolute;right:0;top:0;background:url(background.png);background:rgba(50,50,50,.7);color:#fff;padding:4px;z-index:100;cursor:pointer}div.mejs-speed-button{width:46px!important;position:relative}.mejs-controls .mejs-button.mejs-speed-button button{background:transparent;width:36px;font-size:11px;line-height:normal;color:#fff}.mejs-controls .mejs-speed-button .mejs-speed-selector{display:none;position:absolute;top:-100px;left:-10px;width:60px;height:100px;background:url(background.png);background:rgba(50,50,50,.7);border:solid 1px transparent;padding:0;overflow:hidden;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.mejs-controls .mejs-speed-button:hover>.mejs-speed-selector{display:block}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li label.mejs-speed-selected{color:rgba(33,248,248,1)}.mejs-controls .mejs-speed-button .mejs-speed-selector ul{margin:0;padding:0;display:block;list-style-type:none!important;overflow:hidden}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li{margin:0 0 6px;padding:0 10px;list-style-type:none!important;display:block;color:#fff;overflow:hidden}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li input{clear:both;float:left;margin:3px 3px 0 5px;display:none}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li label{width:60px;float:left;padding:4px 0 0;line-height:15px;font-family:helvetica,arial;font-size:11.5px;color:#fff;margin-left:5px;cursor:pointer}.mejs-controls .mejs-speed-button .mejs-speed-selector ul li:hover{background-color:#c8c8c8!important;background-color:rgba(255,255,255,.4)!important}.mejs-controls .mejs-button.mejs-jump-forward-button{background:transparent url(jumpforward.png) no-repeat;background-position:3px 3px}.mejs-controls .mejs-button.mejs-jump-forward-button button{background:transparent;font-size:9px;line-height:normal;color:#fff}.mejs-controls .mejs-button.mejs-skip-back-button{background:transparent url(skipback.png) no-repeat;background-position:3px 3px}.mejs-controls .mejs-button.mejs-skip-back-button button{background:transparent;font-size:9px;line-height:normal;color:#fff} \ No newline at end of file diff --git a/wp/wp-includes/js/mediaelement/silverlightmediaelement.xap b/wp/wp-includes/js/mediaelement/silverlightmediaelement.xap deleted file mode 100644 index 38a9cc490bf7e66037bd83e5c0ab7aad83e08942..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12459 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 diff --git a/wp/wp-includes/js/mediaelement/skipback.png b/wp/wp-includes/js/mediaelement/skipback.png deleted file mode 100644 index 04756f966d760e8e2728bb90fe8a420ecdc04ecb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4245 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 .mejs-offscreen { - background-color: #f1f1f1; - border-radius: 3px; - box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.6); - clip: auto; - color: #0073aa; - display: block; - font-size: 14px; - font-weight: bold; - height: auto; - line-height: normal; - padding: 15px 23px 14px; - position: absolute; - left: 0; - top: 15px; - text-decoration: none; - text-transform: none; - width: auto; -} - -.mejs-overlay-loading { - background: transparent; -} - -/* Override theme styles that may conflict with controls. */ -.mejs-controls button:hover { - border: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -.me-cannotplay { - width: auto !important; -} - -.media-embed-details .wp-audio-shortcode { - display: inline-block; - max-width: 400px; -} - -.audio-details .embed-media-settings { - overflow: visible; -} - -.media-embed-details .embed-media-settings .setting span { - max-width: 400px; - width: auto; -} - -.media-embed-details .embed-media-settings .checkbox-setting span { - display: inline-block; -} - -.media-embed-details .embed-media-settings { - padding-top: 0; - top: 28px; -} - -.media-embed-details .instructions { - padding: 16px 0; - max-width: 600px; -} - -.media-embed-details .setting p, -.media-embed-details .setting .remove-setting { - color: #a00; - font-size: 10px; - text-transform: uppercase; -} - -.media-embed-details .setting .remove-setting { - padding: 0; -} - -.media-embed-details .setting a:hover { - color: #f00; -} - -.media-embed-details .embed-media-settings .checkbox-setting { - float: none; - margin: 0 0 10px; -} - -.wp-video { - max-width: 100%; - height: auto; -} - -.wp_attachment_holder .wp-video, -.wp_attachment_holder .wp-audio-shortcode { - margin-top: 18px; -} - -video.wp-video-shortcode, -.wp-video-shortcode video { - max-width: 100%; - display: inline-block; -} - -.video-details .wp-video-holder { - width: 100%; - max-width: 640px; -} - -.wp-playlist { - border: 1px solid #ccc; - padding: 10px; - margin: 12px 0 18px; - font-size: 14px; - line-height: 1.5; -} - -.wp-admin .wp-playlist { - margin: 0 0 18px; -} - -.wp-playlist video { - display: inline-block; - max-width: 100%; -} - -.wp-playlist audio { - display: none; - max-width: 100%; - width: 400px; -} - -.wp-playlist .mejs-container { - margin: 0; - width: 100%; -} - -.wp-playlist .mejs-controls .mejs-button button { - outline: 0; -} - -.wp-playlist-light { - background: #fff; - color: #000; -} - -.wp-playlist-dark { - color: #fff; - background: #000; -} - -.wp-playlist-caption { - display: block; - max-width: 88%; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-size: 14px; - line-height: 1.5; -} - -.wp-playlist-item .wp-playlist-caption { - text-decoration: none; - color: #000; - max-width: -webkit-calc(100% - 40px); - max-width: calc(100% - 40px); -} - -.wp-playlist-item-meta { - display: block; - font-size: 14px; - line-height: 1.5; -} - -.wp-playlist-item-title { - font-size: 14px; - line-height: 1.5; -} - -.wp-playlist-item-album { - font-style: italic; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.wp-playlist-item-artist { - font-size: 12px; - text-transform: uppercase; -} - -.wp-playlist-item-length { - position: absolute; - right: 3px; - top: 0; - font-size: 14px; - line-height: 1.5; -} - -.rtl .wp-playlist-item-length { - left: 3px; - right: auto; -} - -.wp-playlist-tracks { - margin-top: 10px; -} - -.wp-playlist-item { - position: relative; - cursor: pointer; - padding: 0 3px; - border-bottom: 1px solid #ccc; -} - -.wp-playlist-item:last-child { - border-bottom: 0; -} - -.wp-playlist-light .wp-playlist-caption { - color: #333; -} - -.wp-playlist-dark .wp-playlist-caption { - color: #ddd; -} - -.wp-playlist-playing { - font-weight: bold; - background: #f7f7f7; -} - -.wp-playlist-light .wp-playlist-playing { - background: #fff; - color: #000; -} - -.wp-playlist-dark .wp-playlist-playing { - background: #000; - color: #fff; -} - -.wp-playlist-current-item { - overflow: hidden; - margin-bottom: 10px; - height: 60px; -} - -.wp-playlist .wp-playlist-current-item img { - float: left; - max-width: 60px; - height: auto; - margin-right: 10px; - padding: 0; - border: 0; -} - -.rtl .wp-playlist .wp-playlist-current-item img { - float: right; - margin-left: 10px; - margin-right: 0; -} - -.wp-playlist-current-item .wp-playlist-item-title, -.wp-playlist-current-item .wp-playlist-item-artist { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.wp-audio-playlist .me-cannotplay span { - padding: 5px 15px; -} diff --git a/wp/wp-includes/js/mediaelement/wp-mediaelement.js b/wp/wp-includes/js/mediaelement/wp-mediaelement.js deleted file mode 100644 index 17f80519..00000000 --- a/wp/wp-includes/js/mediaelement/wp-mediaelement.js +++ /dev/null @@ -1,61 +0,0 @@ -/* global mejs, _wpmejsSettings */ -(function( window, $ ) { - - window.wp = window.wp || {}; - - // add mime-type aliases to MediaElement plugin support - mejs.plugins.silverlight[0].types.push('video/x-ms-wmv'); - mejs.plugins.silverlight[0].types.push('audio/x-ms-wma'); - - function wpMediaElement() { - var settings = {}; - - /** - * Initialize media elements. - * - * Ensures media elements that have already been initialized won't be - * processed again. - * - * @since 4.4.0 - */ - function initialize() { - if ( typeof _wpmejsSettings !== 'undefined' ) { - settings = $.extend( true, {}, _wpmejsSettings ); - } - - settings.success = settings.success || function (mejs) { - var autoplay, loop; - - if ( 'flash' === mejs.pluginType ) { - autoplay = mejs.attributes.autoplay && 'false' !== mejs.attributes.autoplay; - loop = mejs.attributes.loop && 'false' !== mejs.attributes.loop; - - autoplay && mejs.addEventListener( 'canplay', function () { - mejs.play(); - }, false ); - - loop && mejs.addEventListener( 'ended', function () { - mejs.play(); - }, false ); - } - }; - - // Only initialize new media elements. - $( '.wp-audio-shortcode, .wp-video-shortcode' ) - .not( '.mejs-container' ) - .filter(function () { - return ! $( this ).parent().hasClass( '.mejs-mediaelement' ); - }) - .mediaelementplayer( settings ); - } - - return { - initialize: initialize - }; - } - - window.wp.mediaelement = new wpMediaElement(); - - $( window.wp.mediaelement.initialize ); - -})( window, jQuery ); diff --git a/wp/wp-includes/js/mediaelement/wp-mediaelement.min.css b/wp/wp-includes/js/mediaelement/wp-mediaelement.min.css deleted file mode 100644 index ef316e6c..00000000 --- a/wp/wp-includes/js/mediaelement/wp-mediaelement.min.css +++ /dev/null @@ -1 +0,0 @@ -.mejs-container{clear:both}.mejs-container *{font-family:Helvetica,Arial}.mejs-container,.mejs-container .mejs-controls,.mejs-embed,.mejs-embed body{background:#222}.mejs-controls a.mejs-horizontal-volume-slider{display:table}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current,.mejs-controls .mejs-time-rail .mejs-time-loaded{background:#fff}.mejs-controls .mejs-time-rail .mejs-time-current{background:#0073aa}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total,.mejs-controls .mejs-time-rail .mejs-time-total{background:rgba(255,255,255,.33)}.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current,.mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total,.mejs-controls .mejs-time-rail span{border-radius:0}.mejs-controls .mejs-offscreen{clip:rect(1px,1px,1px,1px);position:absolute}.mejs-controls a:focus>.mejs-offscreen{background-color:#f1f1f1;border-radius:3px;box-shadow:0 0 2px 2px rgba(0,0,0,.6);clip:auto;color:#0073aa;display:block;font-size:14px;font-weight:700;height:auto;line-height:normal;padding:15px 23px 14px;position:absolute;left:0;top:15px;text-decoration:none;text-transform:none;width:auto}.mejs-overlay-loading{background:0 0}.mejs-controls button:hover{border:none;-webkit-box-shadow:none;box-shadow:none}.me-cannotplay{width:auto!important}.media-embed-details .wp-audio-shortcode{display:inline-block;max-width:400px}.audio-details .embed-media-settings{overflow:visible}.media-embed-details .embed-media-settings .setting span{max-width:400px;width:auto}.media-embed-details .embed-media-settings .checkbox-setting span{display:inline-block}.media-embed-details .embed-media-settings{padding-top:0;top:28px}.media-embed-details .instructions{padding:16px 0;max-width:600px}.media-embed-details .setting .remove-setting,.media-embed-details .setting p{color:#a00;font-size:10px;text-transform:uppercase}.media-embed-details .setting .remove-setting{padding:0}.media-embed-details .setting a:hover{color:red}.media-embed-details .embed-media-settings .checkbox-setting{float:none;margin:0 0 10px}.wp-video{max-width:100%;height:auto}.wp_attachment_holder .wp-audio-shortcode,.wp_attachment_holder .wp-video{margin-top:18px}.wp-video-shortcode video,video.wp-video-shortcode{max-width:100%;display:inline-block}.video-details .wp-video-holder{width:100%;max-width:640px}.wp-playlist{border:1px solid #ccc;padding:10px;margin:12px 0 18px;font-size:14px;line-height:1.5}.wp-admin .wp-playlist{margin:0 0 18px}.wp-playlist video{display:inline-block;max-width:100%}.wp-playlist audio{display:none;max-width:100%;width:400px}.wp-playlist-caption,.wp-playlist-item-meta{display:block;font-size:14px;line-height:1.5}.wp-playlist .mejs-container{margin:0;width:100%}.wp-playlist .mejs-controls .mejs-button button{outline:0}.wp-playlist-light{background:#fff;color:#000}.wp-playlist-dark{color:#fff;background:#000}.wp-playlist-caption{max-width:88%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wp-playlist-item .wp-playlist-caption{text-decoration:none;color:#000;max-width:-webkit-calc(100% - 40px);max-width:calc(100% - 40px)}.wp-playlist-item-title{font-size:14px;line-height:1.5}.wp-playlist-item-album{font-style:italic;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wp-playlist-item-artist{font-size:12px;text-transform:uppercase}.wp-playlist-item-length{position:absolute;right:3px;top:0;font-size:14px;line-height:1.5}.rtl .wp-playlist-item-length{left:3px;right:auto}.wp-playlist-tracks{margin-top:10px}.wp-playlist-item{position:relative;cursor:pointer;padding:0 3px;border-bottom:1px solid #ccc}.wp-playlist-item:last-child{border-bottom:0}.wp-playlist-light .wp-playlist-caption{color:#333}.wp-playlist-dark .wp-playlist-caption{color:#ddd}.wp-playlist-playing{font-weight:700;background:#f7f7f7}.wp-playlist-light .wp-playlist-playing{background:#fff;color:#000}.wp-playlist-dark .wp-playlist-playing{background:#000;color:#fff}.wp-playlist-current-item{overflow:hidden;margin-bottom:10px;height:60px}.wp-playlist .wp-playlist-current-item img{float:left;max-width:60px;height:auto;margin-right:10px;padding:0;border:0}.rtl .wp-playlist .wp-playlist-current-item img{float:right;margin-left:10px;margin-right:0}.wp-playlist-current-item .wp-playlist-item-artist,.wp-playlist-current-item .wp-playlist-item-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wp-audio-playlist .me-cannotplay span{padding:5px 15px} \ No newline at end of file diff --git a/wp/wp-includes/js/mediaelement/wp-mediaelement.min.js b/wp/wp-includes/js/mediaelement/wp-mediaelement.min.js deleted file mode 100644 index 76984b76..00000000 --- a/wp/wp-includes/js/mediaelement/wp-mediaelement.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a,b){function c(){function a(){"undefined"!=typeof _wpmejsSettings&&(c=b.extend(!0,{},_wpmejsSettings)),c.success=c.success||function(a){var b,c;"flash"===a.pluginType&&(b=a.attributes.autoplay&&"false"!==a.attributes.autoplay,c=a.attributes.loop&&"false"!==a.attributes.loop,b&&a.addEventListener("canplay",function(){a.play()},!1),c&&a.addEventListener("ended",function(){a.play()},!1))},b(".wp-audio-shortcode, .wp-video-shortcode").not(".mejs-container").filter(function(){return!b(this).parent().hasClass(".mejs-mediaelement")}).mediaelementplayer(c)}var c={};return{initialize:a}}a.wp=a.wp||{},mejs.plugins.silverlight[0].types.push("video/x-ms-wmv"),mejs.plugins.silverlight[0].types.push("audio/x-ms-wma"),a.wp.mediaelement=new c,b(a.wp.mediaelement.initialize)}(window,jQuery); \ No newline at end of file diff --git a/wp/wp-includes/js/mediaelement/wp-playlist.js b/wp/wp-includes/js/mediaelement/wp-playlist.js deleted file mode 100644 index 590da2e7..00000000 --- a/wp/wp-includes/js/mediaelement/wp-playlist.js +++ /dev/null @@ -1,175 +0,0 @@ -/* global _wpmejsSettings, MediaElementPlayer */ - -(function ($, _, Backbone) { - 'use strict'; - - var WPPlaylistView = Backbone.View.extend({ - initialize : function (options) { - this.index = 0; - this.settings = {}; - this.data = options.metadata || $.parseJSON( this.$('script.wp-playlist-script').html() ); - this.playerNode = this.$( this.data.type ); - - this.tracks = new Backbone.Collection( this.data.tracks ); - this.current = this.tracks.first(); - - if ( 'audio' === this.data.type ) { - this.currentTemplate = wp.template( 'wp-playlist-current-item' ); - this.currentNode = this.$( '.wp-playlist-current-item' ); - } - - this.renderCurrent(); - - if ( this.data.tracklist ) { - this.itemTemplate = wp.template( 'wp-playlist-item' ); - this.playingClass = 'wp-playlist-playing'; - this.renderTracks(); - } - - this.playerNode.attr( 'src', this.current.get( 'src' ) ); - - _.bindAll( this, 'bindPlayer', 'bindResetPlayer', 'setPlayer', 'ended', 'clickTrack' ); - - if ( ! _.isUndefined( window._wpmejsSettings ) ) { - this.settings = _.clone( _wpmejsSettings ); - } - this.settings.success = this.bindPlayer; - this.setPlayer(); - }, - - bindPlayer : function (mejs) { - this.mejs = mejs; - this.mejs.addEventListener( 'ended', this.ended ); - }, - - bindResetPlayer : function (mejs) { - this.bindPlayer( mejs ); - this.playCurrentSrc(); - }, - - setPlayer: function (force) { - if ( this.player ) { - this.player.pause(); - this.player.remove(); - this.playerNode = this.$( this.data.type ); - } - - if (force) { - this.playerNode.attr( 'src', this.current.get( 'src' ) ); - this.settings.success = this.bindResetPlayer; - } - - /** - * This is also our bridge to the outside world - */ - this.player = new MediaElementPlayer( this.playerNode.get(0), this.settings ); - }, - - playCurrentSrc : function () { - this.renderCurrent(); - this.mejs.setSrc( this.playerNode.attr( 'src' ) ); - this.mejs.load(); - this.mejs.play(); - }, - - renderCurrent : function () { - var dimensions, defaultImage = 'wp-includes/images/media/video.png'; - if ( 'video' === this.data.type ) { - if ( this.data.images && this.current.get( 'image' ) && -1 === this.current.get( 'image' ).src.indexOf( defaultImage ) ) { - this.playerNode.attr( 'poster', this.current.get( 'image' ).src ); - } - dimensions = this.current.get( 'dimensions' ).resized; - this.playerNode.attr( dimensions ); - } else { - if ( ! this.data.images ) { - this.current.set( 'image', false ); - } - this.currentNode.html( this.currentTemplate( this.current.toJSON() ) ); - } - }, - - renderTracks : function () { - var self = this, i = 1, tracklist = $( '
      ' ); - this.tracks.each(function (model) { - if ( ! self.data.images ) { - model.set( 'image', false ); - } - model.set( 'artists', self.data.artists ); - model.set( 'index', self.data.tracknumbers ? i : false ); - tracklist.append( self.itemTemplate( model.toJSON() ) ); - i += 1; - }); - this.$el.append( tracklist ); - - this.$( '.wp-playlist-item' ).eq(0).addClass( this.playingClass ); - }, - - events : { - 'click .wp-playlist-item' : 'clickTrack', - 'click .wp-playlist-next' : 'next', - 'click .wp-playlist-prev' : 'prev' - }, - - clickTrack : function (e) { - e.preventDefault(); - - this.index = this.$( '.wp-playlist-item' ).index( e.currentTarget ); - this.setCurrent(); - }, - - ended : function () { - if ( this.index + 1 < this.tracks.length ) { - this.next(); - } else { - this.index = 0; - this.setCurrent(); - } - }, - - next : function () { - this.index = this.index + 1 >= this.tracks.length ? 0 : this.index + 1; - this.setCurrent(); - }, - - prev : function () { - this.index = this.index - 1 < 0 ? this.tracks.length - 1 : this.index - 1; - this.setCurrent(); - }, - - loadCurrent : function () { - var last = this.playerNode.attr( 'src' ) && this.playerNode.attr( 'src' ).split('.').pop(), - current = this.current.get( 'src' ).split('.').pop(); - - this.mejs && this.mejs.pause(); - - if ( last !== current ) { - this.setPlayer( true ); - } else { - this.playerNode.attr( 'src', this.current.get( 'src' ) ); - this.playCurrentSrc(); - } - }, - - setCurrent : function () { - this.current = this.tracks.at( this.index ); - - if ( this.data.tracklist ) { - this.$( '.wp-playlist-item' ) - .removeClass( this.playingClass ) - .eq( this.index ) - .addClass( this.playingClass ); - } - - this.loadCurrent(); - } - }); - - $(document).ready(function () { - $('.wp-playlist').each( function() { - return new WPPlaylistView({ el: this }); - } ); - }); - - window.WPPlaylistView = WPPlaylistView; - -}(jQuery, _, Backbone)); diff --git a/wp/wp-includes/js/mediaelement/wp-playlist.min.js b/wp/wp-includes/js/mediaelement/wp-playlist.min.js deleted file mode 100644 index 18cd4a50..00000000 --- a/wp/wp-includes/js/mediaelement/wp-playlist.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a,b,c){"use strict";var d=c.View.extend({initialize:function(d){this.index=0,this.settings={},this.data=d.metadata||a.parseJSON(this.$("script.wp-playlist-script").html()),this.playerNode=this.$(this.data.type),this.tracks=new c.Collection(this.data.tracks),this.current=this.tracks.first(),"audio"===this.data.type&&(this.currentTemplate=wp.template("wp-playlist-current-item"),this.currentNode=this.$(".wp-playlist-current-item")),this.renderCurrent(),this.data.tracklist&&(this.itemTemplate=wp.template("wp-playlist-item"),this.playingClass="wp-playlist-playing",this.renderTracks()),this.playerNode.attr("src",this.current.get("src")),b.bindAll(this,"bindPlayer","bindResetPlayer","setPlayer","ended","clickTrack"),b.isUndefined(window._wpmejsSettings)||(this.settings=b.clone(_wpmejsSettings)),this.settings.success=this.bindPlayer,this.setPlayer()},bindPlayer:function(a){this.mejs=a,this.mejs.addEventListener("ended",this.ended)},bindResetPlayer:function(a){this.bindPlayer(a),this.playCurrentSrc()},setPlayer:function(a){this.player&&(this.player.pause(),this.player.remove(),this.playerNode=this.$(this.data.type)),a&&(this.playerNode.attr("src",this.current.get("src")),this.settings.success=this.bindResetPlayer),this.player=new MediaElementPlayer(this.playerNode.get(0),this.settings)},playCurrentSrc:function(){this.renderCurrent(),this.mejs.setSrc(this.playerNode.attr("src")),this.mejs.load(),this.mejs.play()},renderCurrent:function(){var a,b="wp-includes/images/media/video.png";"video"===this.data.type?(this.data.images&&this.current.get("image")&&-1===this.current.get("image").src.indexOf(b)&&this.playerNode.attr("poster",this.current.get("image").src),a=this.current.get("dimensions").resized,this.playerNode.attr(a)):(this.data.images||this.current.set("image",!1),this.currentNode.html(this.currentTemplate(this.current.toJSON())))},renderTracks:function(){var b=this,c=1,d=a('
      ');this.tracks.each(function(a){b.data.images||a.set("image",!1),a.set("artists",b.data.artists),a.set("index",!!b.data.tracknumbers&&c),d.append(b.itemTemplate(a.toJSON())),c+=1}),this.$el.append(d),this.$(".wp-playlist-item").eq(0).addClass(this.playingClass)},events:{"click .wp-playlist-item":"clickTrack","click .wp-playlist-next":"next","click .wp-playlist-prev":"prev"},clickTrack:function(a){a.preventDefault(),this.index=this.$(".wp-playlist-item").index(a.currentTarget),this.setCurrent()},ended:function(){this.index+1=this.tracks.length?0:this.index+1,this.setCurrent()},prev:function(){this.index=this.index-1<0?this.tracks.length-1:this.index-1,this.setCurrent()},loadCurrent:function(){var a=this.playerNode.attr("src")&&this.playerNode.attr("src").split(".").pop(),b=this.current.get("src").split(".").pop();this.mejs&&this.mejs.pause(),a!==b?this.setPlayer(!0):(this.playerNode.attr("src",this.current.get("src")),this.playCurrentSrc())},setCurrent:function(){this.current=this.tracks.at(this.index),this.data.tracklist&&this.$(".wp-playlist-item").removeClass(this.playingClass).eq(this.index).addClass(this.playingClass),this.loadCurrent()}});a(document).ready(function(){a(".wp-playlist").each(function(){return new d({el:this})})}),window.WPPlaylistView=d}(jQuery,_,Backbone); \ No newline at end of file diff --git a/wp/wp-includes/js/plupload/handlers.js b/wp/wp-includes/js/plupload/handlers.js deleted file mode 100644 index 7f3a8c24..00000000 --- a/wp/wp-includes/js/plupload/handlers.js +++ /dev/null @@ -1,497 +0,0 @@ -/* global plupload, pluploadL10n, ajaxurl, post_id, wpUploaderInit, deleteUserSetting, setUserSetting, getUserSetting, shortform */ -var topWin = window.dialogArguments || opener || parent || top, uploader, uploader_init; - -// progress and success handlers for media multi uploads -function fileQueued(fileObj) { - // Get rid of unused form - jQuery('.media-blank').remove(); - - var items = jQuery('#media-items').children(), postid = post_id || 0; - - // Collapse a single item - if ( items.length == 1 ) { - items.removeClass('open').find('.slidetoggle').slideUp(200); - } - // Create a progress bar containing the filename - jQuery('
      ') - .attr( 'id', 'media-item-' + fileObj.id ) - .addClass('child-of-' + postid) - .append('
      0%
      ', - jQuery('
      ').text( ' ' + fileObj.name )) - .appendTo( jQuery('#media-items' ) ); - - // Disable submit - jQuery('#insert-gallery').prop('disabled', true); -} - -function uploadStart() { - try { - if ( typeof topWin.tb_remove != 'undefined' ) - topWin.jQuery('#TB_overlay').unbind('click', topWin.tb_remove); - } catch(e){} - - return true; -} - -function uploadProgress(up, file) { - var item = jQuery('#media-item-' + file.id); - - jQuery('.bar', item).width( (200 * file.loaded) / file.size ); - jQuery('.percent', item).html( file.percent + '%' ); -} - -// check to see if a large file failed to upload -function fileUploading( up, file ) { - var hundredmb = 100 * 1024 * 1024, - max = parseInt( up.settings.max_file_size, 10 ); - - if ( max > hundredmb && file.size > hundredmb ) { - setTimeout( function() { - if ( file.status < 3 && file.loaded === 0 ) { // not uploading - wpFileError( file, pluploadL10n.big_upload_failed.replace( '%1$s', '' ).replace( '%2$s', '' ) ); - up.stop(); // stops the whole queue - up.removeFile( file ); - up.start(); // restart the queue - } - }, 10000 ); // wait for 10 sec. for the file to start uploading - } -} - -function updateMediaForm() { - var items = jQuery('#media-items').children(); - - // Just one file, no need for collapsible part - if ( items.length == 1 ) { - items.addClass('open').find('.slidetoggle').show(); - jQuery('.insert-gallery').hide(); - } else if ( items.length > 1 ) { - items.removeClass('open'); - // Only show Gallery/Playlist buttons when there are at least two files. - jQuery('.insert-gallery').show(); - } - - // Only show Save buttons when there is at least one file. - if ( items.not('.media-blank').length > 0 ) - jQuery('.savebutton').show(); - else - jQuery('.savebutton').hide(); -} - -function uploadSuccess(fileObj, serverData) { - var item = jQuery('#media-item-' + fileObj.id); - - // on success serverData should be numeric, fix bug in html4 runtime returning the serverData wrapped in a
       tag
      -	serverData = serverData.replace(/^
      (\d+)<\/pre>$/, '$1');
      -
      -	// if async-upload returned an error message, place it in the media item div and return
      -	if ( serverData.match(/media-upload-error|error-div/) ) {
      -		item.html(serverData);
      -		return;
      -	} else {
      -		jQuery('.percent', item).html( pluploadL10n.crunching );
      -	}
      -
      -	prepareMediaItem(fileObj, serverData);
      -	updateMediaForm();
      -
      -	// Increment the counter.
      -	if ( post_id && item.hasClass('child-of-' + post_id) )
      -		jQuery('#attachments-count').text(1 * jQuery('#attachments-count').text() + 1);
      -}
      -
      -function setResize( arg ) {
      -	if ( arg ) {
      -		if ( window.resize_width && window.resize_height ) {
      -			uploader.settings.resize = {
      -				enabled: true,
      -				width: window.resize_width,
      -				height: window.resize_height,
      -				quality: 100
      -			};
      -		} else {
      -			uploader.settings.multipart_params.image_resize = true;
      -		}
      -	} else {
      -		delete( uploader.settings.multipart_params.image_resize );
      -	}
      -}
      -
      -function prepareMediaItem(fileObj, serverData) {
      -	var f = ( typeof shortform == 'undefined' ) ? 1 : 2, item = jQuery('#media-item-' + fileObj.id);
      -	if ( f == 2 && shortform > 2 )
      -		f = shortform;
      -
      -	try {
      -		if ( typeof topWin.tb_remove != 'undefined' )
      -			topWin.jQuery('#TB_overlay').click(topWin.tb_remove);
      -	} catch(e){}
      -
      -	if ( isNaN(serverData) || !serverData ) { // Old style: Append the HTML returned by the server -- thumbnail and form inputs
      -		item.append(serverData);
      -		prepareMediaItemInit(fileObj);
      -	} else { // New style: server data is just the attachment ID, fetch the thumbnail and form html from the server
      -		item.load('async-upload.php', {attachment_id:serverData, fetch:f}, function(){prepareMediaItemInit(fileObj);updateMediaForm();});
      -	}
      -}
      -
      -function prepareMediaItemInit(fileObj) {
      -	var item = jQuery('#media-item-' + fileObj.id);
      -	// Clone the thumbnail as a "pinkynail" -- a tiny image to the left of the filename
      -	jQuery('.thumbnail', item).clone().attr('class', 'pinkynail toggle').prependTo(item);
      -
      -	// Replace the original filename with the new (unique) one assigned during upload
      -	jQuery('.filename.original', item).replaceWith( jQuery('.filename.new', item) );
      -
      -	// Bind AJAX to the new Delete button
      -	jQuery('a.delete', item).click(function(){
      -		// Tell the server to delete it. TODO: handle exceptions
      -		jQuery.ajax({
      -			url: ajaxurl,
      -			type: 'post',
      -			success: deleteSuccess,
      -			error: deleteError,
      -			id: fileObj.id,
      -			data: {
      -				id : this.id.replace(/[^0-9]/g, ''),
      -				action : 'trash-post',
      -				_ajax_nonce : this.href.replace(/^.*wpnonce=/,'')
      -			}
      -		});
      -		return false;
      -	});
      -
      -	// Bind AJAX to the new Undo button
      -	jQuery('a.undo', item).click(function(){
      -		// Tell the server to untrash it. TODO: handle exceptions
      -		jQuery.ajax({
      -			url: ajaxurl,
      -			type: 'post',
      -			id: fileObj.id,
      -			data: {
      -				id : this.id.replace(/[^0-9]/g,''),
      -				action: 'untrash-post',
      -				_ajax_nonce: this.href.replace(/^.*wpnonce=/,'')
      -			},
      -			success: function( ){
      -				var type,
      -					item = jQuery('#media-item-' + fileObj.id);
      -
      -				if ( type = jQuery('#type-of-' + fileObj.id).val() )
      -					jQuery('#' + type + '-counter').text(jQuery('#' + type + '-counter').text()-0+1);
      -
      -				if ( post_id && item.hasClass('child-of-'+post_id) )
      -					jQuery('#attachments-count').text(jQuery('#attachments-count').text()-0+1);
      -
      -				jQuery('.filename .trashnotice', item).remove();
      -				jQuery('.filename .title', item).css('font-weight','normal');
      -				jQuery('a.undo', item).addClass('hidden');
      -				jQuery('.menu_order_input', item).show();
      -				item.css( {backgroundColor:'#ceb'} ).animate( {backgroundColor: '#fff'}, { queue: false, duration: 500, complete: function(){ jQuery(this).css({backgroundColor:''}); } }).removeClass('undo');
      -			}
      -		});
      -		return false;
      -	});
      -
      -	// Open this item if it says to start open (e.g. to display an error)
      -	jQuery('#media-item-' + fileObj.id + '.startopen').removeClass('startopen').addClass('open').find('slidetoggle').fadeIn();
      -}
      -
      -// generic error message
      -function wpQueueError(message) {
      -	jQuery('#media-upload-error').show().html( '

      ' + message + '

      ' ); -} - -// file-specific error messages -function wpFileError(fileObj, message) { - itemAjaxError(fileObj.id, message); -} - -function itemAjaxError(id, message) { - var item = jQuery('#media-item-' + id), filename = item.find('.filename').text(), last_err = item.data('last-err'); - - if ( last_err == id ) // prevent firing an error for the same file twice - return; - - item.html('
      ' + - '' + pluploadL10n.dismiss + '' + - '' + pluploadL10n.error_uploading.replace('%s', jQuery.trim(filename)) + ' ' + - message + - '
      ').data('last-err', id); -} - -function deleteSuccess(data) { - var type, id, item; - if ( data == '-1' ) - return itemAjaxError(this.id, 'You do not have permission. Has your session expired?'); - - if ( data == '0' ) - return itemAjaxError(this.id, 'Could not be deleted. Has it been deleted already?'); - - id = this.id; - item = jQuery('#media-item-' + id); - - // Decrement the counters. - if ( type = jQuery('#type-of-' + id).val() ) - jQuery('#' + type + '-counter').text( jQuery('#' + type + '-counter').text() - 1 ); - - if ( post_id && item.hasClass('child-of-'+post_id) ) - jQuery('#attachments-count').text( jQuery('#attachments-count').text() - 1 ); - - if ( jQuery('form.type-form #media-items').children().length == 1 && jQuery('.hidden', '#media-items').length > 0 ) { - jQuery('.toggle').toggle(); - jQuery('.slidetoggle').slideUp(200).siblings().removeClass('hidden'); - } - - // Vanish it. - jQuery('.toggle', item).toggle(); - jQuery('.slidetoggle', item).slideUp(200).siblings().removeClass('hidden'); - item.css( {backgroundColor:'#faa'} ).animate( {backgroundColor:'#f4f4f4'}, {queue:false, duration:500} ).addClass('undo'); - - jQuery('.filename:empty', item).remove(); - jQuery('.filename .title', item).css('font-weight','bold'); - jQuery('.filename', item).append(' ' + pluploadL10n.deleted + ' ').siblings('a.toggle').hide(); - jQuery('.filename', item).append( jQuery('a.undo', item).removeClass('hidden') ); - jQuery('.menu_order_input', item).hide(); - - return; -} - -function deleteError() { - // TODO -} - -function uploadComplete() { - jQuery('#insert-gallery').prop('disabled', false); -} - -function switchUploader(s) { - if ( s ) { - deleteUserSetting('uploader'); - jQuery('.media-upload-form').removeClass('html-uploader'); - - if ( typeof(uploader) == 'object' ) - uploader.refresh(); - } else { - setUserSetting('uploader', '1'); // 1 == html uploader - jQuery('.media-upload-form').addClass('html-uploader'); - } -} - -function uploadError(fileObj, errorCode, message, uploader) { - var hundredmb = 100 * 1024 * 1024, max; - - switch (errorCode) { - case plupload.FAILED: - wpFileError(fileObj, pluploadL10n.upload_failed); - break; - case plupload.FILE_EXTENSION_ERROR: - wpFileExtensionError( uploader, fileObj, pluploadL10n.invalid_filetype ); - break; - case plupload.FILE_SIZE_ERROR: - uploadSizeError(uploader, fileObj); - break; - case plupload.IMAGE_FORMAT_ERROR: - wpFileError(fileObj, pluploadL10n.not_an_image); - break; - case plupload.IMAGE_MEMORY_ERROR: - wpFileError(fileObj, pluploadL10n.image_memory_exceeded); - break; - case plupload.IMAGE_DIMENSIONS_ERROR: - wpFileError(fileObj, pluploadL10n.image_dimensions_exceeded); - break; - case plupload.GENERIC_ERROR: - wpQueueError(pluploadL10n.upload_failed); - break; - case plupload.IO_ERROR: - max = parseInt( uploader.settings.filters.max_file_size, 10 ); - - if ( max > hundredmb && fileObj.size > hundredmb ) - wpFileError( fileObj, pluploadL10n.big_upload_failed.replace('%1$s', '').replace('%2$s', '') ); - else - wpQueueError(pluploadL10n.io_error); - break; - case plupload.HTTP_ERROR: - wpQueueError(pluploadL10n.http_error); - break; - case plupload.INIT_ERROR: - jQuery('.media-upload-form').addClass('html-uploader'); - break; - case plupload.SECURITY_ERROR: - wpQueueError(pluploadL10n.security_error); - break; -/* case plupload.UPLOAD_ERROR.UPLOAD_STOPPED: - case plupload.UPLOAD_ERROR.FILE_CANCELLED: - jQuery('#media-item-' + fileObj.id).remove(); - break;*/ - default: - wpFileError(fileObj, pluploadL10n.default_error); - } -} - -function uploadSizeError( up, file, over100mb ) { - var message; - - if ( over100mb ) - message = pluploadL10n.big_upload_queued.replace('%s', file.name) + ' ' + pluploadL10n.big_upload_failed.replace('%1$s', '').replace('%2$s', ''); - else - message = pluploadL10n.file_exceeds_size_limit.replace('%s', file.name); - - jQuery('#media-items').append('

      ' + message + '

      '); - up.removeFile(file); -} - -function wpFileExtensionError( up, file, message ) { - jQuery('#media-items').append('

      ' + message + '

      '); - up.removeFile(file); -} - -jQuery(document).ready(function($){ - $('.media-upload-form').bind('click.uploader', function(e) { - var target = $(e.target), tr, c; - - if ( target.is('input[type="radio"]') ) { // remember the last used image size and alignment - tr = target.closest('tr'); - - if ( tr.hasClass('align') ) - setUserSetting('align', target.val()); - else if ( tr.hasClass('image-size') ) - setUserSetting('imgsize', target.val()); - - } else if ( target.is('button.button') ) { // remember the last used image link url - c = e.target.className || ''; - c = c.match(/url([^ '"]+)/); - - if ( c && c[1] ) { - setUserSetting('urlbutton', c[1]); - target.siblings('.urlfield').val( target.data('link-url') ); - } - } else if ( target.is('a.dismiss') ) { - target.parents('.media-item').fadeOut(200, function(){ - $(this).remove(); - }); - } else if ( target.is('.upload-flash-bypass a') || target.is('a.uploader-html') ) { // switch uploader to html4 - $('#media-items, p.submit, span.big-file-warning').css('display', 'none'); - switchUploader(0); - e.preventDefault(); - } else if ( target.is('.upload-html-bypass a') ) { // switch uploader to multi-file - $('#media-items, p.submit, span.big-file-warning').css('display', ''); - switchUploader(1); - e.preventDefault(); - } else if ( target.is('a.describe-toggle-on') ) { // Show - target.parent().addClass('open'); - target.siblings('.slidetoggle').fadeIn(250, function(){ - var S = $(window).scrollTop(), H = $(window).height(), top = $(this).offset().top, h = $(this).height(), b, B; - - if ( H && top && h ) { - b = top + h; - B = S + H; - - if ( b > B ) { - if ( b - B < top - S ) - window.scrollBy(0, (b - B) + 10); - else - window.scrollBy(0, top - S - 40); - } - } - }); - e.preventDefault(); - } else if ( target.is('a.describe-toggle-off') ) { // Hide - target.siblings('.slidetoggle').fadeOut(250, function(){ - target.parent().removeClass('open'); - }); - e.preventDefault(); - } - }); - - // init and set the uploader - uploader_init = function() { - var isIE = navigator.userAgent.indexOf('Trident/') != -1 || navigator.userAgent.indexOf('MSIE ') != -1; - - // Make sure flash sends cookies (seems in IE it does whitout switching to urlstream mode) - if ( ! isIE && 'flash' === plupload.predictRuntime( wpUploaderInit ) && - ( ! wpUploaderInit.required_features || ! wpUploaderInit.required_features.hasOwnProperty( 'send_binary_string' ) ) ) { - - wpUploaderInit.required_features = wpUploaderInit.required_features || {}; - wpUploaderInit.required_features.send_binary_string = true; - } - - uploader = new plupload.Uploader(wpUploaderInit); - - $('#image_resize').bind('change', function() { - var arg = $(this).prop('checked'); - - setResize( arg ); - - if ( arg ) - setUserSetting('upload_resize', '1'); - else - deleteUserSetting('upload_resize'); - }); - - uploader.bind('Init', function(up) { - var uploaddiv = $('#plupload-upload-ui'); - - setResize( getUserSetting('upload_resize', false) ); - - if ( up.features.dragdrop && ! $(document.body).hasClass('mobile') ) { - uploaddiv.addClass('drag-drop'); - $('#drag-drop-area').on('dragover.wp-uploader', function(){ // dragenter doesn't fire right :( - uploaddiv.addClass('drag-over'); - }).on('dragleave.wp-uploader, drop.wp-uploader', function(){ - uploaddiv.removeClass('drag-over'); - }); - } else { - uploaddiv.removeClass('drag-drop'); - $('#drag-drop-area').off('.wp-uploader'); - } - - if ( up.runtime === 'html4' ) { - $('.upload-flash-bypass').hide(); - } - }); - - uploader.bind( 'postinit', function( up ) { - up.refresh(); - }); - - uploader.init(); - - uploader.bind('FilesAdded', function( up, files ) { - $('#media-upload-error').empty(); - uploadStart(); - - plupload.each( files, function( file ) { - fileQueued( file ); - }); - - up.refresh(); - up.start(); - }); - - uploader.bind('UploadFile', function(up, file) { - fileUploading(up, file); - }); - - uploader.bind('UploadProgress', function(up, file) { - uploadProgress(up, file); - }); - - uploader.bind('Error', function(up, err) { - uploadError(err.file, err.code, err.message, up); - up.refresh(); - }); - - uploader.bind('FileUploaded', function(up, file, response) { - uploadSuccess(file, response.response); - }); - - uploader.bind('UploadComplete', function() { - uploadComplete(); - }); - }; - - if ( typeof(wpUploaderInit) == 'object' ) { - uploader_init(); - } - -}); diff --git a/wp/wp-includes/js/plupload/handlers.min.js b/wp/wp-includes/js/plupload/handlers.min.js deleted file mode 100644 index e9975a48..00000000 --- a/wp/wp-includes/js/plupload/handlers.min.js +++ /dev/null @@ -1 +0,0 @@ -function fileQueued(a){jQuery(".media-blank").remove();var b=jQuery("#media-items").children(),c=post_id||0;1==b.length&&b.removeClass("open").find(".slidetoggle").slideUp(200),jQuery('
      ').attr("id","media-item-"+a.id).addClass("child-of-"+c).append('
      0%
      ',jQuery('
      ').text(" "+a.name)).appendTo(jQuery("#media-items")),jQuery("#insert-gallery").prop("disabled",!0)}function uploadStart(){try{"undefined"!=typeof topWin.tb_remove&&topWin.jQuery("#TB_overlay").unbind("click",topWin.tb_remove)}catch(a){}return!0}function uploadProgress(a,b){var c=jQuery("#media-item-"+b.id);jQuery(".bar",c).width(200*b.loaded/b.size),jQuery(".percent",c).html(b.percent+"%")}function fileUploading(a,b){var c=104857600,d=parseInt(a.settings.max_file_size,10);d>c&&b.size>c&&setTimeout(function(){b.status<3&&0===b.loaded&&(wpFileError(b,pluploadL10n.big_upload_failed.replace("%1$s",'').replace("%2$s","")),a.stop(),a.removeFile(b),a.start())},1e4)}function updateMediaForm(){var a=jQuery("#media-items").children();1==a.length?(a.addClass("open").find(".slidetoggle").show(),jQuery(".insert-gallery").hide()):a.length>1&&(a.removeClass("open"),jQuery(".insert-gallery").show()),a.not(".media-blank").length>0?jQuery(".savebutton").show():jQuery(".savebutton").hide()}function uploadSuccess(a,b){var c=jQuery("#media-item-"+a.id);return b=b.replace(/^
      (\d+)<\/pre>$/,"$1"),b.match(/media-upload-error|error-div/)?void c.html(b):(jQuery(".percent",c).html(pluploadL10n.crunching),prepareMediaItem(a,b),updateMediaForm(),void(post_id&&c.hasClass("child-of-"+post_id)&&jQuery("#attachments-count").text(1*jQuery("#attachments-count").text()+1)))}function setResize(a){a?window.resize_width&&window.resize_height?uploader.settings.resize={enabled:!0,width:window.resize_width,height:window.resize_height,quality:100}:uploader.settings.multipart_params.image_resize=!0:delete uploader.settings.multipart_params.image_resize}function prepareMediaItem(a,b){var c="undefined"==typeof shortform?1:2,d=jQuery("#media-item-"+a.id);2==c&&shortform>2&&(c=shortform);try{"undefined"!=typeof topWin.tb_remove&&topWin.jQuery("#TB_overlay").click(topWin.tb_remove)}catch(e){}isNaN(b)||!b?(d.append(b),prepareMediaItemInit(a)):d.load("async-upload.php",{attachment_id:b,fetch:c},function(){prepareMediaItemInit(a),updateMediaForm()})}function prepareMediaItemInit(a){var b=jQuery("#media-item-"+a.id);jQuery(".thumbnail",b).clone().attr("class","pinkynail toggle").prependTo(b),jQuery(".filename.original",b).replaceWith(jQuery(".filename.new",b)),jQuery("a.delete",b).click(function(){return jQuery.ajax({url:ajaxurl,type:"post",success:deleteSuccess,error:deleteError,id:a.id,data:{id:this.id.replace(/[^0-9]/g,""),action:"trash-post",_ajax_nonce:this.href.replace(/^.*wpnonce=/,"")}}),!1}),jQuery("a.undo",b).click(function(){return jQuery.ajax({url:ajaxurl,type:"post",id:a.id,data:{id:this.id.replace(/[^0-9]/g,""),action:"untrash-post",_ajax_nonce:this.href.replace(/^.*wpnonce=/,"")},success:function(){var b,c=jQuery("#media-item-"+a.id);(b=jQuery("#type-of-"+a.id).val())&&jQuery("#"+b+"-counter").text(jQuery("#"+b+"-counter").text()-0+1),post_id&&c.hasClass("child-of-"+post_id)&&jQuery("#attachments-count").text(jQuery("#attachments-count").text()-0+1),jQuery(".filename .trashnotice",c).remove(),jQuery(".filename .title",c).css("font-weight","normal"),jQuery("a.undo",c).addClass("hidden"),jQuery(".menu_order_input",c).show(),c.css({backgroundColor:"#ceb"}).animate({backgroundColor:"#fff"},{queue:!1,duration:500,complete:function(){jQuery(this).css({backgroundColor:""})}}).removeClass("undo")}}),!1}),jQuery("#media-item-"+a.id+".startopen").removeClass("startopen").addClass("open").find("slidetoggle").fadeIn()}function wpQueueError(a){jQuery("#media-upload-error").show().html('

      '+a+"

      ")}function wpFileError(a,b){itemAjaxError(a.id,b)}function itemAjaxError(a,b){var c=jQuery("#media-item-"+a),d=c.find(".filename").text(),e=c.data("last-err");e!=a&&c.html('
      '+pluploadL10n.dismiss+""+pluploadL10n.error_uploading.replace("%s",jQuery.trim(d))+" "+b+"
      ").data("last-err",a)}function deleteSuccess(a){var b,c,d;return"-1"==a?itemAjaxError(this.id,"You do not have permission. Has your session expired?"):"0"==a?itemAjaxError(this.id,"Could not be deleted. Has it been deleted already?"):(c=this.id,d=jQuery("#media-item-"+c),(b=jQuery("#type-of-"+c).val())&&jQuery("#"+b+"-counter").text(jQuery("#"+b+"-counter").text()-1),post_id&&d.hasClass("child-of-"+post_id)&&jQuery("#attachments-count").text(jQuery("#attachments-count").text()-1),1==jQuery("form.type-form #media-items").children().length&&jQuery(".hidden","#media-items").length>0&&(jQuery(".toggle").toggle(),jQuery(".slidetoggle").slideUp(200).siblings().removeClass("hidden")),jQuery(".toggle",d).toggle(),jQuery(".slidetoggle",d).slideUp(200).siblings().removeClass("hidden"),d.css({backgroundColor:"#faa"}).animate({backgroundColor:"#f4f4f4"},{queue:!1,duration:500}).addClass("undo"),jQuery(".filename:empty",d).remove(),jQuery(".filename .title",d).css("font-weight","bold"),jQuery(".filename",d).append(' '+pluploadL10n.deleted+" ").siblings("a.toggle").hide(),jQuery(".filename",d).append(jQuery("a.undo",d).removeClass("hidden")),void jQuery(".menu_order_input",d).hide())}function deleteError(){}function uploadComplete(){jQuery("#insert-gallery").prop("disabled",!1)}function switchUploader(a){a?(deleteUserSetting("uploader"),jQuery(".media-upload-form").removeClass("html-uploader"),"object"==typeof uploader&&uploader.refresh()):(setUserSetting("uploader","1"),jQuery(".media-upload-form").addClass("html-uploader"))}function uploadError(a,b,c,d){var e,f=104857600;switch(b){case plupload.FAILED:wpFileError(a,pluploadL10n.upload_failed);break;case plupload.FILE_EXTENSION_ERROR:wpFileExtensionError(d,a,pluploadL10n.invalid_filetype);break;case plupload.FILE_SIZE_ERROR:uploadSizeError(d,a);break;case plupload.IMAGE_FORMAT_ERROR:wpFileError(a,pluploadL10n.not_an_image);break;case plupload.IMAGE_MEMORY_ERROR:wpFileError(a,pluploadL10n.image_memory_exceeded);break;case plupload.IMAGE_DIMENSIONS_ERROR:wpFileError(a,pluploadL10n.image_dimensions_exceeded);break;case plupload.GENERIC_ERROR:wpQueueError(pluploadL10n.upload_failed);break;case plupload.IO_ERROR:e=parseInt(d.settings.filters.max_file_size,10),e>f&&a.size>f?wpFileError(a,pluploadL10n.big_upload_failed.replace("%1$s",'').replace("%2$s","")):wpQueueError(pluploadL10n.io_error);break;case plupload.HTTP_ERROR:wpQueueError(pluploadL10n.http_error);break;case plupload.INIT_ERROR:jQuery(".media-upload-form").addClass("html-uploader");break;case plupload.SECURITY_ERROR:wpQueueError(pluploadL10n.security_error);break;default:wpFileError(a,pluploadL10n.default_error)}}function uploadSizeError(a,b,c){var d;d=c?pluploadL10n.big_upload_queued.replace("%s",b.name)+" "+pluploadL10n.big_upload_failed.replace("%1$s",'').replace("%2$s",""):pluploadL10n.file_exceeds_size_limit.replace("%s",b.name),jQuery("#media-items").append('

      '+d+"

      "),a.removeFile(b)}function wpFileExtensionError(a,b,c){jQuery("#media-items").append('

      '+c+"

      "),a.removeFile(b)}var topWin=window.dialogArguments||opener||parent||top,uploader,uploader_init;jQuery(document).ready(function(a){a(".media-upload-form").bind("click.uploader",function(b){var c,d,e=a(b.target);e.is('input[type="radio"]')?(c=e.closest("tr"),c.hasClass("align")?setUserSetting("align",e.val()):c.hasClass("image-size")&&setUserSetting("imgsize",e.val())):e.is("button.button")?(d=b.target.className||"",d=d.match(/url([^ '"]+)/),d&&d[1]&&(setUserSetting("urlbutton",d[1]),e.siblings(".urlfield").val(e.data("link-url")))):e.is("a.dismiss")?e.parents(".media-item").fadeOut(200,function(){a(this).remove()}):e.is(".upload-flash-bypass a")||e.is("a.uploader-html")?(a("#media-items, p.submit, span.big-file-warning").css("display","none"),switchUploader(0),b.preventDefault()):e.is(".upload-html-bypass a")?(a("#media-items, p.submit, span.big-file-warning").css("display",""),switchUploader(1),b.preventDefault()):e.is("a.describe-toggle-on")?(e.parent().addClass("open"),e.siblings(".slidetoggle").fadeIn(250,function(){var b,c,d=a(window).scrollTop(),e=a(window).height(),f=a(this).offset().top,g=a(this).height();e&&f&&g&&(b=f+g,c=d+e,b>c&&(b-c - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/wp/wp-includes/js/plupload/plupload.flash.swf b/wp/wp-includes/js/plupload/plupload.flash.swf deleted file mode 100644 index 4bd30e9af036f32367bb7cd3866ba79b2b9c1a50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29570 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 diff --git a/wp/wp-includes/js/plupload/plupload.full.min.js b/wp/wp-includes/js/plupload/plupload.full.min.js deleted file mode 100644 index 2af434de..00000000 --- a/wp/wp-includes/js/plupload/plupload.full.min.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * mOxie - multi-runtime File API & XMLHttpRequest L2 Polyfill - * v1.3.4 - * - * Copyright 2013, Moxiecode Systems AB - * Released under GPL License. - * - * License: http://www.plupload.com/license - * Contributing: http://www.plupload.com/contributing - * - * Date: 2015-07-18 - */ -!function(e,t){"use strict";function n(e,t){for(var n,i=[],r=0;r0&&n(o,function(n,o){n!==r&&(e(i[o])===e(n)&&~a(e(n),["array","object"])?t(i[o],n):i[o]=n)})}),i},n=function(t,n){var i,r,o,a;if(t)if("number"===e(t.length)){for(o=0,i=t.length;i>o;o++)if(n(t[o],o)===!1)return}else if("object"===e(t))for(r in t)if(t.hasOwnProperty(r)&&n(t[r],r)===!1)return},i=function(t){var n;if(!t||"object"!==e(t))return!0;for(n in t)return!1;return!0},r=function(t,n){function i(r){"function"===e(t[r])&&t[r](function(e){++rn;n++)if(t[n]===e)return n}return-1},s=function(t,n){var i=[];"array"!==e(t)&&(t=[t]),"array"!==e(n)&&(n=[n]);for(var r in t)-1===a(t[r],n)&&i.push(t[r]);return i.length?i:!1},u=function(e,t){var i=[];return n(e,function(e){-1!==a(e,t)&&i.push(e)}),i.length?i:null},c=function(e){var t,n=[];for(t=0;ti;i++)n+=Math.floor(65535*Math.random()).toString(32);return(t||"o_")+n+(e++).toString(32)}}(),d=function(e){return e?String.prototype.trim?String.prototype.trim.call(e):e.toString().replace(/^\s*/,"").replace(/\s*$/,""):e},h=function(e){if("string"!=typeof e)return e;var t={t:1099511627776,g:1073741824,m:1048576,k:1024},n;return e=/^([0-9\.]+)([tmgk]?)$/.exec(e.toLowerCase().replace(/[^0-9\.tmkg]/g,"")),n=e[2],e=+e[1],t.hasOwnProperty(n)&&(e*=t[n]),Math.floor(e)},f=function(t){var n=[].slice.call(arguments,1);return t.replace(/%[a-z]/g,function(){var t=n.shift();return"undefined"!==e(t)?t:""})};return{guid:l,typeOf:e,extend:t,each:n,isEmptyObj:i,inSeries:r,inParallel:o,inArray:a,arrayDiff:s,arrayIntersect:u,toArray:c,trim:d,sprintf:f,parseSizeStr:h}}),i(c,[u],function(e){function t(e,t,n){var i=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),i=0;r>i;i++)if(e[i]!=t[i]){if(e[i]=u(e[i]),t[i]=u(t[i]),e[i]t[i]){o=1;break}}if(!n)return o;switch(n){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="",n="?",i="function",r="undefined",o="object",a="major",s="model",u="name",c="type",l="vendor",d="version",h="architecture",f="console",p="mobile",m="tablet",g={has:function(e,t){return-1!==t.toLowerCase().indexOf(e.toLowerCase())},lowerize:function(e){return e.toLowerCase()}},v={rgx:function(){for(var t,n=0,a,s,u,c,l,d,h=arguments;n0?2==c.length?typeof c[1]==i?t[c[0]]=c[1].call(this,d):t[c[0]]=c[1]:3==c.length?typeof c[1]!==i||c[1].exec&&c[1].test?t[c[0]]=d?d.replace(c[1],c[2]):e:t[c[0]]=d?c[1].call(this,d,c[2]):e:4==c.length&&(t[c[0]]=d?c[3].call(this,d.replace(c[1],c[2])):e):t[c]=d?d:e;break}if(l)break}return t},str:function(t,i){for(var r in i)if(typeof i[r]===o&&i[r].length>0){for(var a=0;a=9)},use_data_uri_of:function(e){return t.use_data_uri&&33e3>e||t.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"),!e.disabled}};return function(n){var i=[].slice.call(arguments);return i.shift(),"function"===e.typeOf(t[n])?t[n].apply(this,i):!!t[n]}}(),r=(new n).getResult(),o={can:i,uaParser:n,browser:r.browser.name,version:r.browser.version,os:r.os.name,osVersion:r.os.version,verComp:t,swf_url:"../flash/Moxie.swf",xap_url:"../silverlight/Moxie.xap",global_event_dispatcher:"moxie.core.EventTarget.instance.dispatchEvent"};return o.OS=o.os,o}),i(l,[u],function(e){var t={};return{addI18n:function(n){return e.extend(t,n)},translate:function(e){return t[e]||e},_:function(e){return this.translate(e)},sprintf:function(t){var n=[].slice.call(arguments,1);return t.replace(/%[a-z]/g,function(){var t=n.shift();return"undefined"!==e.typeOf(t)?t:""})}}}),i(d,[u,l],function(e,t){var n="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,application/vnd.ms-powerpoint,ppt pps pot,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",i={mimes:{},extensions:{},addMimeType:function(e){var t=e.split(/,/),n,i,r;for(n=0;n=0;o--)if(r[o].fn===i){r.splice(o,1);break}}else r=[];r.length||(delete e[this.uid][t],n.isEmptyObj(e[this.uid])&&delete e[this.uid])}},removeAllEventListeners:function(){e[this.uid]&&delete e[this.uid]},dispatchEvent:function(i){var r,o,a,s,u={},c=!0,l;if("string"!==n.typeOf(i)){if(s=i,"string"!==n.typeOf(s.type))throw new t.EventException(t.EventException.UNSPECIFIED_EVENT_TYPE_ERR);i=s.type,s.total!==l&&s.loaded!==l&&(u.total=s.total,u.loaded=s.loaded),u.async=s.async||!1}if(-1!==i.indexOf("::")?!function(e){r=e[0],i=e[1]}(i.split("::")):r=this.uid,i=i.toLowerCase(),o=e[r]&&e[r][i]){o.sort(function(e,t){return t.priority-e.priority}),a=[].slice.call(arguments),a.shift(),u.type=i,a.unshift(u);var d=[];n.each(o,function(e){a[0].target=e.scope,d.push(u.async?function(t){setTimeout(function(){t(e.fn.apply(e.scope,a)===!1)},1)}:function(t){t(e.fn.apply(e.scope,a)===!1)})}),d.length&&n.inSeries(d,function(e){c=!e})}return c},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"===n.typeOf(this[t])&&this[t].apply(this,arguments)}),n.each(e,function(e){e="on"+e.toLowerCase(e),"undefined"===n.typeOf(t[e])&&(t[e]=null)})}})}return i.instance=new i,i}),i(m,[c,u,h,p],function(e,t,n,i){function r(e,i,o,s,u){var c=this,l,d=t.guid(i+"_"),h=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&&(h=r.getMode(s,e.preferred_caps,h)),l=function(){var e={};return{exec:function(t,n,i,r){return l[n]&&(e[t]||(e[t]={context:this,instance:new l[n]}),e[t].instance[i])?e[t].instance[i].apply(this,r):void 0},removeInstance:function(t){delete e[t]},removeAllInstances:function(){var n=this;t.each(e,function(e,i){"function"===t.typeOf(e.instance.destroy)&&e.instance.destroy.call(e.context),n.removeInstance(i)})}}}(),t.extend(this,{initialized:!1,uid:d,type:i,mode:r.getMode(s,e.required_caps,h),shimid:d+"_container",clients:0,options:e,can:function(e,n){var i=arguments[2]||o;if("string"===t.typeOf(e)&&"undefined"===t.typeOf(n)&&(e=r.parseCaps(e)),"object"===t.typeOf(e)){for(var a in e)if(!this.can(a,e[a],i))return!1;return!0}return"function"===t.typeOf(i[e])?i[e].call(this,n):n===i[e]},getShimContainer:function(){var e,i=n.get(this.shimid);return i||(e=this.options.container?n.get(this.options.container):document.body,i=document.createElement("div"),i.id=this.shimid,i.className="moxie-shim moxie-shim-"+this.type,t.extend(i.style,{position:"absolute",top:"0px",left:"0px",width:"1px",height:"1px",overflow:"hidden"}),e.appendChild(i),e=null),i},getShim:function(){return l},shimExec:function(e,t){var n=[].slice.call(arguments,2);return c.getShim().exec.call(this,this.uid,e,t,n)},exec:function(e,t){var n=[].slice.call(arguments,2);return c[e]&&c[e][t]?c[e][t].apply(this,n):c.shimExec.apply(this,arguments)},destroy:function(){if(c){var e=n.get(this.shimid);e&&e.parentNode.removeChild(e),l&&l.removeAllInstances(),this.unbindAll(),delete a[this.uid],this.uid=null,d=c=l=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=i.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 n={};return"string"!==t.typeOf(e)?e||{}:(t.each(e.split(","),function(e){n[e]=!0}),n)},r.can=function(e,t){var n,i=r.getConstructor(e),o;return i?(n=new i({required_caps:t}),o=n.mode,n.destroy(),!!o):!1},r.thatCan=function(e,t){var n=(t||r.order).split(/\s*,\s*/);for(var i in n)if(r.can(n[i],e))return n[i];return null},r.getMode=function(e,n,i){var r=null;if("undefined"===t.typeOf(i)&&(i="browser"),n&&!t.isEmptyObj(e)){if(t.each(n,function(n,i){if(e.hasOwnProperty(i)){var o=e[i](n);if("string"==typeof o&&(o=[o]),r){if(!(r=t.arrayIntersect(r,o)))return r=!1}else r=o}}),r)return-1!==t.inArray(i,r)?i:r[0];if(r===!1)return!1}return i},r.capTrue=function(){return!0},r.capFalse=function(){return!1},r.capTest=function(e){return function(){return!!e}},r}),i(g,[c,f,u,m],function(e,t,n,i){return function r(){var e;n.extend(this,{connectRuntime:function(r){function o(n){var s,u;return n.length?(s=n.shift().toLowerCase(),(u=i.getConstructor(s))?(e=new u(r),e.bind("Init",function(){e.initialized=!0,setTimeout(function(){e.clients++,a.trigger("RuntimeInit",e)},1)}),e.bind("Error",function(){e.destroy(),o(n)}),e.mode?void e.init():void e.trigger("Error")):void o(n)):(a.trigger("RuntimeError",new t.RuntimeError(t.RuntimeError.NOT_INIT_ERR)),void(e=null))}var a=this,s;if("string"===n.typeOf(r)?s=r:"string"===n.typeOf(r.ruid)&&(s=r.ruid),s){if(e=i.getRuntime(s))return e.clients++,e;throw new t.RuntimeError(t.RuntimeError.NOT_INIT_ERR)}o((r.runtime_order||i.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}})}}),i(v,[u,c,d,h,f,p,l,m,g],function(e,t,n,i,r,o,a,s,u){function c(t){var o=this,c,d,h;if(-1!==e.inArray(e.typeOf(t),["string","node"])&&(t={browse_button:t}),d=i.get(t.browse_button),!d)throw new r.DOMException(r.DOMException.NOT_FOUND_ERR);h={accept:[{title:a.translate("All Files"),extensions:"*"}],name:"file",multiple:!1,required_caps:!1,container:d.parentNode||document.body},t=e.extend({},h,t),"string"==typeof t.required_caps&&(t.required_caps=s.parseCaps(t.required_caps)),"string"==typeof t.accept&&(t.accept=n.mimes2extList(t.accept)),c=i.get(t.container),c||(c=document.body),"static"===i.getStyle(c,"position")&&(c.style.position="relative"),c=d=null,u.call(o),e.extend(o,{uid:e.guid("uid_"),ruid:null,shimid:null,files:null,init:function(){o.bind("RuntimeInit",function(n,r){o.ruid=r.uid,o.shimid=r.shimid,o.bind("Ready",function(){o.trigger("Refresh")},999),o.bind("Refresh",function(){var n,o,a,s;a=i.get(t.browse_button),s=i.get(r.shimid),a&&(n=i.getPos(a,i.get(t.container)),o=i.getSize(a),s&&e.extend(s.style,{top:n.y+"px",left:n.x+"px",width:o.w+"px",height:o.h+"px"})),s=a=null}),r.exec.call(o,"FileInput","init",t)}),o.connectRuntime(e.extend({},t,{required_caps:{select_file:!0}}))},disable:function(t){var n=this.getRuntime();n&&n.exec.call(this,"FileInput","disable","undefined"===e.typeOf(t)?!0:t)},refresh:function(){o.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}),i(w,[],function(){var e=function(e){return unescape(encodeURIComponent(e))},t=function(e){return decodeURIComponent(escape(e))},n=function(e,n){if("function"==typeof window.atob)return n?t(window.atob(e)):window.atob(e);var i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",r,o,a,s,u,c,l,d,h=0,f=0,p="",m=[];if(!e)return e;e+="";do s=i.indexOf(e.charAt(h++)),u=i.indexOf(e.charAt(h++)),c=i.indexOf(e.charAt(h++)),l=i.indexOf(e.charAt(h++)),d=s<<18|u<<12|c<<6|l,r=d>>16&255,o=d>>8&255,a=255&d,64==c?m[f++]=String.fromCharCode(r):64==l?m[f++]=String.fromCharCode(r,o):m[f++]=String.fromCharCode(r,o,a);while(h>18&63,u=d>>12&63,c=d>>6&63,l=63&d,m[f++]=i.charAt(s)+i.charAt(u)+i.charAt(c)+i.charAt(l);while(ha;a++)o+=String.fromCharCode(r[a]);return o}}t.call(this),e.extend(this,{uid:e.guid("uid_"),readAsBinaryString:function(e){return i.call(this,"readAsBinaryString",e)},readAsDataURL:function(e){return i.call(this,"readAsDataURL",e)},readAsText:function(e){return i.call(this,"readAsText",e)}})}}),i(I,[f,u,y],function(e,t,n){function i(){var e,i=[];t.extend(this,{append:function(r,o){var a=this,s=t.typeOf(o);o instanceof n?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"):i.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(n){t.each(i,function(e){n(e.value,e.name)}),e&&n(e.value,e.name)},destroy:function(){e=null,i=[]}})}return i}),i(T,[u,f,p,w,x,m,R,y,A,I,c,d],function(e,t,n,i,r,o,a,s,u,c,l,d){function h(){this.uid=e.guid("uid_")}function f(){function n(e,t){return w.hasOwnProperty(e)?1===arguments.length?l.can("define_property")?w[e]:v[e]:void(l.can("define_property")?w[e]=t:v[e]=t):void 0}function u(t){function i(){B&&(B.destroy(),B=null),s.dispatchEvent("loadend"),s=null}function r(r){B.bind("LoadStart",function(e){n("readyState",f.LOADING),s.dispatchEvent("readystatechange"),s.dispatchEvent(e),O&&s.upload.dispatchEvent(e)}),B.bind("Progress",function(e){n("readyState")!==f.LOADING&&(n("readyState",f.LOADING),s.dispatchEvent("readystatechange")),s.dispatchEvent(e)}),B.bind("UploadProgress",function(e){O&&s.upload.dispatchEvent({type:"progress",lengthComputable:!1,total:e.total,loaded:e.loaded})}),B.bind("Load",function(t){n("readyState",f.DONE),n("status",Number(r.exec.call(B,"XMLHttpRequest","getStatus")||0)),n("statusText",p[n("status")]||""),n("response",r.exec.call(B,"XMLHttpRequest","getResponse",n("responseType"))),~e.inArray(n("responseType"),["text",""])?n("responseText",n("response")):"document"===n("responseType")&&n("responseXML",n("response")),k=r.exec.call(B,"XMLHttpRequest","getAllResponseHeaders"),s.dispatchEvent("readystatechange"),n("status")>0?(O&&s.upload.dispatchEvent(t),s.dispatchEvent(t)):(N=!0,s.dispatchEvent("error")),i()}),B.bind("Abort",function(e){s.dispatchEvent(e),i()}),B.bind("Error",function(e){N=!0,n("readyState",f.DONE),s.dispatchEvent("readystatechange"),D=!0,s.dispatchEvent(e),i()}),r.exec.call(B,"XMLHttpRequest","send",{url:E,method:_,async:y,user:x,password:R,headers:b,mimeType:I,encoding:A,responseType:s.responseType,withCredentials:s.withCredentials,options:H},t)}var s=this;C=(new Date).getTime(),B=new a,"string"==typeof H.required_caps&&(H.required_caps=o.parseCaps(H.required_caps)),H.required_caps=e.extend({},H.required_caps,{return_response_type:s.responseType}),t instanceof c&&(H.required_caps.send_multipart=!0),e.isEmptyObj(b)||(H.required_caps.send_custom_headers=!0),L||(H.required_caps.do_cors=!0),H.ruid?r(B.connectRuntime(H)):(B.bind("RuntimeInit",function(e,t){r(t)}),B.bind("RuntimeError",function(e,t){s.dispatchEvent("RuntimeError",t)}),B.connectRuntime(H))}function g(){n("responseText",""),n("responseXML",null),n("response",null),n("status",0),n("statusText",""),C=M=null}var v=this,w={timeout:0,readyState:f.UNSENT,withCredentials:!1,status:0,statusText:"",responseType:"",responseXML:null,responseText:null,response:null},y=!0,E,_,b={},x,R,A=null,I=null,T=!1,S=!1,O=!1,D=!1,N=!1,L=!1,C,M,F=null,P=null,H={},B,k="",U;e.extend(this,w,{uid:e.guid("uid_"),upload:new h,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)||i.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"])&&(_=o.toUpperCase()),~e.inArray(_,["CONNECT","TRACE","TRACK"]))throw new t.DOMException(t.DOMException.SECURITY_ERR);if(a=i.utf8_encode(a),l=r.parseUrl(a),L=r.hasSameOrigin(l),E=r.resolveUrl(a),(u||c)&&!L)throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);if(x=u||l.user,R=c||l.pass,y=s||!0,y===!1&&(n("timeout")||n("withCredentials")||""!==n("responseType")))throw new t.DOMException(t.DOMException.INVALID_ACCESS_ERR);T=!y,S=!1,b={},g.call(this),n("readyState",f.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(n("readyState")!==f.OPENED||S)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(/[\u0100-\uffff]/.test(r)||i.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:(b[r]?b[r]+=", "+o:b[r]=o,!0)},getAllResponseHeaders:function(){return k||""},getResponseHeader:function(t){return t=t.toLowerCase(),N||~e.inArray(t,["set-cookie","set-cookie2"])?null:k&&""!==k&&(U||(U={},e.each(k.split(/\r\n/),function(t){var n=t.split(/:\s+/);2===n.length&&(n[0]=e.trim(n[0]),U[n[0].toLowerCase()]={header:n[0],value:e.trim(n[1])})})),U.hasOwnProperty(t))?U[t].header+": "+U[t].value:null},overrideMimeType:function(i){var r,o;if(~e.inArray(n("readyState"),[f.LOADING,f.DONE]))throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(i=e.trim(i.toLowerCase()),/;/.test(i)&&(r=i.match(/^([^;]+)(?:;\scharset\=)?(.*)$/))&&(i=r[1],r[2]&&(o=r[2])),!d.mimes[i])throw new t.DOMException(t.DOMException.SYNTAX_ERR);F=i,P=o},send:function(n,r){if(H="string"===e.typeOf(r)?{ruid:r}:r?r:{},this.readyState!==f.OPENED||S)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);if(n instanceof s)H.ruid=n.ruid,I=n.type||"application/octet-stream";else if(n instanceof c){if(n.hasBlob()){var o=n.getBlob();H.ruid=o.ruid,I=o.type||"application/octet-stream"}}else"string"==typeof n&&(A="UTF-8",I="text/plain;charset=UTF-8",n=i.utf8_encode(n));this.withCredentials||(this.withCredentials=H.required_caps&&H.required_caps.send_browser_cookies&&!L),O=!T&&this.upload.hasEventListener(),N=!1,D=!n,T||(S=!0),u.call(this,n)},abort:function(){if(N=!0,T=!1,~e.inArray(n("readyState"),[f.UNSENT,f.OPENED,f.DONE]))n("readyState",f.UNSENT);else{if(n("readyState",f.DONE),S=!1,!B)throw new t.DOMException(t.DOMException.INVALID_STATE_ERR);B.getRuntime().exec.call(B,"XMLHttpRequest","abort",D),D=!0}},destroy:function(){B&&("function"===e.typeOf(B.destroy)&&B.destroy(),B=null),this.unbindAll(),this.upload&&(this.upload.unbindAll(),this.upload=null)}}),this.handleEventProps(m.concat(["readystatechange"])),this.upload.handleEventProps(m)}var p={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"};h.prototype=n.instance;var m=["loadstart","progress","abort","error","load","timeout","loadend"],g=1,v=2;return f.UNSENT=0,f.OPENED=1,f.HEADERS_RECEIVED=2,f.LOADING=3,f.DONE=4,f.prototype=n.instance,f}),i(S,[u,w,g,p],function(e,t,n,i){function r(){function i(){l=d=0,c=this.result=null}function o(t,n){var i=this;u=n,i.bind("TransportingProgress",function(t){d=t.loaded,l>d&&-1===e.inArray(i.state,[r.IDLE,r.DONE])&&a.call(i)},999),i.bind("TransportingComplete",function(){d=l,i.state=r.DONE,c=null,i.result=u.exec.call(i,"Transporter","getAsBlob",t||"")},999),i.state=r.BUSY,i.trigger("TransportingStarted"),a.call(i)}function a(){var e=this,n,i=l-d;h>i&&(h=i),n=t.btoa(c.substr(d,h)),u.exec.call(e,"Transporter","receive",n,l)}var s,u,c,l,d,h;n.call(this),e.extend(this,{uid:e.guid("uid_"),state:r.IDLE,result:null,transport:function(t,n,r){var a=this;if(r=e.extend({chunk_size:204798},r),(s=r.chunk_size%3)&&(r.chunk_size+=3-s),h=r.chunk_size,i.call(this),c=t,l=t.length,"string"===e.typeOf(r)||r.ruid)o.call(a,n,this.connectRuntime(r));else{var u=function(e,t){a.unbind("RuntimeInit",u),o.call(a,n,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")),i.call(e)},destroy:function(){this.unbindAll(),u=null,this.disconnectRuntime(),i.call(this)}})}return r.IDLE=0,r.BUSY=1,r.DONE=2,r.prototype=i.instance,r}),i(O,[u,h,f,A,T,m,g,S,c,p,y,E,w],function(e,t,n,i,r,o,a,s,u,c,l,d,h){function f(){function i(e){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)}function c(t){var i=e.typeOf(t);try{if(t instanceof f){if(!t.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);m.apply(this,arguments)}else if(t instanceof l){if(!~e.inArray(t.type,["image/jpeg","image/png"]))throw new n.ImageError(n.ImageError.WRONG_FORMAT);g.apply(this,arguments)}else if(-1!==e.inArray(i,["blob","file"]))c.call(this,new d(null,t),arguments[1]);else if("string"===i)"data:"===t.substr(0,5)?c.call(this,new l(null,{data:t}),arguments[1]):v.apply(this,arguments);else{if("node"!==i||"img"!==t.nodeName.toLowerCase())throw new n.DOMException(n.DOMException.TYPE_MISMATCH_ERR);c.call(this,t.src,arguments[1])}}catch(r){this.trigger("error",r.code)}}function m(t,n){var i=this.connectRuntime(t.ruid);this.ruid=i.uid,i.exec.call(this,"Image","loadFromImage",t,"undefined"===e.typeOf(n)?!0:n)}function g(t,n){function i(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){i(t)}),n&&"string"==typeof n.required_caps&&(n.required_caps=o.parseCaps(n.required_caps)),this.connectRuntime(e.extend({required_caps:{access_image_binary:!0,resize_image:!0}},n))):i(this.connectRuntime(t.ruid))}function v(e,t){var n=this,i;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)},downsize:function(t){var i={width:this.width,height:this.height,type:this.type||"image/jpeg",quality:90,crop:!1,preserveHeaders:!0,resample:!1};t="object"==typeof t?e.extend(i,t):e.extend(i,{width:arguments[0],height:arguments[1],crop:arguments[2],preserveHeaders:arguments[3]});try{if(!this.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);if(this.width>f.MAX_RESIZE_WIDTH||this.height>f.MAX_RESIZE_HEIGHT)throw new n.ImageError(n.ImageError.MAX_RESOLUTION_ERR);this.exec("Image","downsize",t.width,t.height,t.crop,t.preserveHeaders)}catch(r){this.trigger("error",r.code)}},crop:function(e,t,n){this.downsize(e,t,!0,n)},getAsCanvas:function(){if(!u.can("create_canvas"))throw new n.RuntimeError(n.RuntimeError.NOT_SUPPORTED_ERR);var e=this.connectRuntime(this.ruid);return e.exec.call(this,"Image","getAsCanvas")},getAsBlob:function(e,t){if(!this.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);return this.exec("Image","getAsBlob",e||"image/jpeg",t||90)},getAsDataURL:function(e,t){if(!this.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);return this.exec("Image","getAsDataURL",e||"image/jpeg",t||90)},getAsBinaryString:function(e,t){var n=this.getAsDataURL(e,t);return h.atob(n.substring(n.indexOf("base64,")+7))},embed:function(i,r){function o(t,r){var o=this;if(u.can("create_canvas")){var l=o.getAsCanvas();if(l)return i.appendChild(l),l=null,o.destroy(),void a.trigger("embedded")}var d=o.getAsDataURL(t,r);if(!d)throw new n.ImageError(n.ImageError.WRONG_FORMAT);if(u.can("use_data_uri_of",d.length))i.innerHTML='',o.destroy(),a.trigger("embedded");else{var f=new s;f.bind("TransportingComplete",function(){c=a.connectRuntime(this.result.ruid),a.bind("Embedded",function(){e.extend(c.getShimContainer().style,{top:"0px",left:"0px",width:o.width+"px",height:o.height+"px"}),c=null},999),c.exec.call(a,"ImageView","display",this.result.uid,width,height),o.destroy()}),f.transport(h.atob(d.substring(d.indexOf("base64,")+7)),t,{required_caps:{display_media:!0},runtime_order:"flash,silverlight",container:i})}}var a=this,c;r=e.extend({width:this.width,height:this.height,type:this.type||"image/jpeg",quality:90},r||{});try{if(!(i=t.get(i)))throw new n.DOMException(n.DOMException.INVALID_NODE_TYPE_ERR);if(!this.size)throw new n.DOMException(n.DOMException.INVALID_STATE_ERR);this.width>f.MAX_RESIZE_WIDTH||this.height>f.MAX_RESIZE_HEIGHT;var l=new f;return l.bind("Resize",function(){o.call(this,r.type,r.quality)}),l.bind("Load",function(){l.downsize(r)}),this.meta.thumb&&this.meta.thumb.width>=r.width&&this.meta.thumb.height>=r.height?l.load(this.meta.thumb.data):l.clone(this,!1),l}catch(d){this.trigger("error",d.code)}},destroy:function(){this.ruid&&(this.getRuntime().exec.call(this,"Image","destroy"),this.disconnectRuntime()),this.unbindAll()}}),this.handleEventProps(p),this.bind("Load Resize",function(){i.call(this)},999)}var p=["progress","load","error","resize","embedded"];return f.MAX_RESIZE_WIDTH=8192,f.MAX_RESIZE_HEIGHT=8192,f.prototype=c.instance,f}),i(D,[u,f,m,c],function(e,t,n,i){function r(t){var r=this,s=n.capTest,u=n.capTrue,c=e.extend({access_binary:s(window.FileReader||window.File&&window.File.getAsDataURL),access_image_binary:function(){return r.can("access_binary")&&!!a.Image},display_media:s(i.can("create_canvas")||i.can("use_data_uri_over32kb")),do_cors:s(window.XMLHttpRequest&&"withCredentials"in new XMLHttpRequest),drag_and_drop:s(function(){var e=document.createElement("div");return("draggable"in e||"ondragstart"in e&&"ondrop"in e)&&("IE"!==i.browser||i.verComp(i.version,9,">"))}()),filter_by_extension:s(function(){return"Chrome"===i.browser&&i.verComp(i.version,28,">=")||"IE"===i.browser&&i.verComp(i.version,10,">=")||"Safari"===i.browser&&i.verComp(i.version,7,">=")}()),return_response_headers:u,return_response_type:function(e){return"json"===e&&window.JSON?!0:i.can("return_response_type",e)},return_status_code:u,report_upload_progress:s(window.XMLHttpRequest&&(new XMLHttpRequest).upload),resize_image:function(){return r.can("access_binary")&&i.can("create_canvas")},select_file:function(){return i.can("use_fileinput")&&window.File},select_folder:function(){return r.can("select_file")&&"Chrome"===i.browser&&i.verComp(i.version,21,">=")},select_multiple:function(){return!(!r.can("select_file")||"Safari"===i.browser&&"Windows"===i.os||"iOS"===i.os&&i.verComp(i.osVersion,"7.0.0",">")&&i.verComp(i.osVersion,"8.0.0","<"))},send_binary_string:s(window.XMLHttpRequest&&((new XMLHttpRequest).sendAsBinary||window.Uint8Array&&window.ArrayBuffer)),send_custom_headers:s(window.XMLHttpRequest),send_multipart:function(){return!!(window.XMLHttpRequest&&(new XMLHttpRequest).upload&&window.FormData)||r.can("send_binary_string")},slice_blob:s(window.File&&(File.prototype.mozSlice||File.prototype.webkitSlice||File.prototype.slice)),stream_upload:function(){return r.can("slice_blob")&&r.can("send_multipart")},summon_file_dialog:function(){return r.can("select_file")&&("Firefox"===i.browser&&i.verComp(i.version,4,">=")||"Opera"===i.browser&&i.verComp(i.version,12,">=")||"IE"===i.browser&&i.verComp(i.version,10,">=")||!!~e.inArray(i.browser,["Chrome","Safari"]))},upload_filesize:u},arguments[2]);n.call(this,t,arguments[1]||o,c),e.extend(this,{init:function(){this.trigger("Init")},destroy:function(e){return function(){e.call(r),e=r=null}}(this.destroy)}),e.extend(this.getShim(),a)}var o="html5",a={};return n.addConstructor(o,r),a}),i(N,[u],function(e){function t(){this.returnValue=!1}function n(){this.cancelBubble=!0}var i={},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=n,s(e)},o.attachEvent("on"+a,c)),o[r]||(o[r]=e.guid()),i.hasOwnProperty(o[r])||(i[o[r]]={}),l=i[o[r]],l.hasOwnProperty(a)||(l[a]=[]),l[a].push({func:c,orig:s,key:u})},a=function(t,n,o){var a,s;if(n=n.toLowerCase(),t[r]&&i[t[r]]&&i[t[r]][n]){a=i[t[r]][n];for(var u=a.length-1;u>=0&&(a[u].orig!==o&&a[u].key!==o||(t.removeEventListener?t.removeEventListener(n,a[u].func,!1):t.detachEvent&&t.detachEvent("on"+n,a[u].func),a[u].orig=null,a[u].func=null,a.splice(u,1),o===s));u--);if(a.length||delete i[t[r]][n],e.isEmptyObj(i[t[r]])){delete i[t[r]];try{delete t[r]}catch(c){t[r]=s}}}},s=function(t,n){t&&t[r]&&e.each(i[t[r]],function(e,i){a(t,i,n)})};return{addEvent:o,removeEvent:a,removeAllEvents:s}}),i(L,[D,E,u,h,N,d,c],function(e,t,n,i,r,o,a){function s(){var e;n.extend(this,{init:function(s){var u=this,c=u.getRuntime(),l,d,h,f,p,m;e=s,h=e.accept.mimes||o.extList2mimes(e.accept,c.can("filter_by_extension")),d=c.getShimContainer(),d.innerHTML='",l=i.get(c.uid),n.extend(l.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),f=i.get(e.browse_button),c.can("summon_file_dialog")&&("static"===i.getStyle(f,"position")&&(f.style.position="relative"),p=parseInt(i.getStyle(f,"z-index"),10)||1,f.style.zIndex=p,d.style.zIndex=p-1,r.addEvent(f,"click",function(e){var t=i.get(c.uid);t&&!t.disabled&&t.click(),e.preventDefault()},u.uid)),m=c.can("summon_file_dialog")?f:d,r.addEvent(m,"mouseover",function(){u.trigger("mouseenter")},u.uid),r.addEvent(m,"mouseout",function(){u.trigger("mouseleave")},u.uid),r.addEvent(m,"mousedown",function(){u.trigger("mousedown")},u.uid),r.addEvent(i.get(e.container),"mouseup",function(){u.trigger("mouseup")},u.uid),l.onchange=function g(i){if(u.files=[],n.each(this.files,function(n){var i="";return e.directory&&"."==n.name?!0:(n.webkitRelativePath&&(i="/"+n.webkitRelativePath.replace(/^\//,"")),n=new t(c.uid,n),n.relativePath=i,void u.files.push(n))}),"IE"!==a.browser&&"IEMobile"!==a.browser)this.value="";else{var r=this.cloneNode(!0);this.parentNode.replaceChild(r,this),r.onchange=g}u.files.length&&u.trigger("change")},u.trigger({type:"ready",async:!0}),d=null},disable:function(e){var t=this.getRuntime(),n;(n=i.get(t.uid))&&(n.disabled=!!e)},destroy:function(){var t=this.getRuntime(),n=t.getShim(),o=t.getShimContainer();r.removeAllEvents(o,this.uid),r.removeAllEvents(e&&i.get(e.container),this.uid),r.removeAllEvents(e&&i.get(e.browse_button),this.uid),o&&(o.innerHTML=""),n.removeInstance(this.uid),e=o=n=null}})}return e.FileInput=s}),i(C,[D,y],function(e,t){function n(){function e(e,t,n){var i;if(!window.File.prototype.slice)return(i=window.File.prototype.webkitSlice||window.File.prototype.mozSlice)?i.call(e,t,n):null;try{return e.slice(),e.slice(t,n)}catch(r){return e.slice(t,n-t)}}this.slice=function(){return new t(this.getRuntime().uid,e.apply(this,arguments))}}return e.Blob=n}),i(M,[D,E,u,h,N,d],function(e,t,n,i,r,o){function a(){function e(e){if(!e.dataTransfer||!e.dataTransfer.types)return!1;var t=n.toArray(e.dataTransfer.types||[]);return-1!==n.inArray("Files",t)||-1!==n.inArray("public.file-url",t)||-1!==n.inArray("application/x-moz-file",t)}function a(e,n){if(u(e)){var i=new t(g,e);i.relativePath=n||"",f.push(i)}}function s(e){for(var t=[],i=0;i=")&&u.verComp(u.version,7,"<"),h="Android Browser"===u.browser,m=!1;if(p=n.url.replace(/^.+?\/([\w\-\.]+)$/,"$1").toLowerCase(),f=c(),f.open(n.method,n.url,n.async,n.user,n.password),r instanceof o)r.isDetached()&&(m=!0),r=r.getSource();else if(r instanceof a){if(r.hasBlob())if(r.getBlob().isDetached())r=d.call(s,r),m=!0;else if((l||h)&&"blob"===t.typeOf(r.getBlob().getSource())&&window.FileReader)return void e.call(s,n,r);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}}f.upload?(n.withCredentials&&(f.withCredentials=!0),f.addEventListener("load",function(e){s.trigger(e)}),f.addEventListener("error",function(e){s.trigger(e)}),f.addEventListener("progress",function(e){s.trigger(e)}),f.upload.addEventListener("progress",function(e){s.trigger({type:"UploadProgress",loaded:e.loaded,total:e.total})})):f.onreadystatechange=function v(){switch(f.readyState){case 1:break;case 2:break;case 3:var e,t;try{i.hasSameOrigin(n.url)&&(e=f.getResponseHeader("Content-Length")||0),f.responseText&&(t=f.responseText.length)}catch(r){e=t=0}s.trigger({type:"progress",lengthComputable:!!e,total:parseInt(e,10),loaded:t});break;case 4:f.onreadystatechange=function(){},s.trigger(0===f.status?"error":"load")}},t.isEmptyObj(n.headers)||t.each(n.headers,function(e,t){f.setRequestHeader(t,e)}),""!==n.responseType&&"responseType"in f&&("json"!==n.responseType||u.can("return_response_type","json")?f.responseType=n.responseType:f.responseType="text"),m?f.sendAsBinary?f.sendAsBinary(r):!function(){for(var e=new Uint8Array(r.length),t=0;t0&&o.set(new Uint8Array(t.slice(0,e)),0),o.set(new Uint8Array(r),e),o.set(new Uint8Array(t.slice(e+i)),e+r.byteLength),this.clear(),t=o.buffer,n=new DataView(t);break}default:return t}},length:function(){return t?t.byteLength:0},clear:function(){n=t=null}})}function i(t){function n(e,n,i){i=3===arguments.length?i:t.length-n-1,t=t.substr(0,n)+e+t.substr(i+n)}e.extend(this,{readByteAt:function(e){return t.charCodeAt(e)},writeByteAt:function(e,t){n(String.fromCharCode(t),e,1)},SEGMENT:function(e,i,r){switch(arguments.length){case 1:return t.substr(e);case 2:return t.substr(e,i);case 3:n(null!==r?r:"",e,i);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 n,i,r;if(e+t>this.length())throw new Error("You are trying to read outside the source boundaries.");for(i=this.littleEndian?0:-8*(t-1),r=0,n=0;t>r;r++)n|=this.readByteAt(e+r)<this.length())throw new Error("You are trying to write outside the source boundaries.");for(i=this.littleEndian?0:-8*(n-1),r=0;n>r;r++)this.writeByteAt(e+r,t>>Math.abs(i+8*r)&255)},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,n){for(var i=[],r=0;n>r;r++)i[r]=this[e](t+r);return i}}),t}),i(B,[H,f],function(e,t){return function n(i){var r=[],o,a,s,u=0;if(o=new e(i),65496!==o.SHORT(0))throw o.clear(),new t.ImageError(t.ImageError.WRONG_FORMAT);for(a=2;a<=o.length();)if(s=o.SHORT(a),s>=65488&&65495>=s)a+=2;else{if(65498===s||65497===s)break;u=o.SHORT(a+2)+2,s>=65505&&65519>=s&&r.push({hex:s,name:"APP"+(15&s),start:a,length:u,segment:o.SEGMENT(a,u)}),a+=u}return o.clear(),{headers:r,restore:function(t){var n,i,o;for(o=new e(t),a=65504==o.SHORT(2)?4+o.SHORT(4):2,i=0,n=r.length;n>i;i++)o.SEGMENT(a,0,r[i].segment),a+=r[i].length;return t=o.SEGMENT(),o.clear(),t},strip:function(t){var i,r,o,a;for(o=new n(t),r=o.headers,o.purge(),i=new e(t),a=r.length;a--;)i.SEGMENT(r[a].start,r[a].length,"");return t=i.SEGMENT(),i.clear(),t},get:function(e){for(var t=[],n=0,i=r.length;i>n;n++)r[n].name===e.toUpperCase()&&t.push(r[n].segment);return t}, -set:function(e,t){var n=[],i,o,a;for("string"==typeof t?n.push(t):n=t,i=o=0,a=r.length;a>i&&(r[i].name===e.toUpperCase()&&(r[i].segment=n[o],r[i].length=n[o].length,o++),!(o>=n.length));i++);},purge:function(){this.headers=r=[]}}}}),i(k,[u,H,f],function(e,n,i){function r(o){function a(n,r){var o=this,a,s,u,c,h,f,p,m,g=[],v={},w={1:"BYTE",7:"UNDEFINED",2:"ASCII",3:"SHORT",4:"LONG",5:"RATIONAL",9:"SLONG",10:"SRATIONAL"},y={BYTE:1,UNDEFINED:1,ASCII:1,SHORT:2,LONG:4,RATIONAL:8,SLONG:4,SRATIONAL:8};for(a=o.SHORT(n),s=0;a>s;s++)if(g=[],p=n+2+12*s,u=r[o.SHORT(p)],u!==t){if(c=w[o.SHORT(p+=2)],h=o.LONG(p+=2),f=y[c],!f)throw new i.ImageError(i.ImageError.INVALID_META_ERR);if(p+=4,f*h>4&&(p=o.LONG(p)+d.tiffHeader),p+f*h>=this.length())throw new i.ImageError(i.ImageError.INVALID_META_ERR);"ASCII"!==c?(g=o.asArray(c,p,h),m=1==h?g[0]:g,l.hasOwnProperty(u)&&"object"!=typeof m?v[u]=l[u][m]:v[u]=m):v[u]=e.trim(o.STRING(p,h).replace(/\0$/,""))}return v}function s(e,t,n){var i,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}}i=d[e.toLowerCase()+"IFD"],r=this.SHORT(i);for(var l=0;r>l;l++)if(o=i+12*l+2,this.SHORT(o)==t){a=o+8;break}if(!a)return!1;try{this.write(a,n,4)}catch(h){return!1}return!0}var u,c,l,d,h,f;if(n.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},h=d.tiffHeader,u={clear:this.clear},e.extend(this,{read:function(){try{return r.prototype.read.apply(this,arguments)}catch(e){throw new i.ImageError(i.ImageError.INVALID_META_ERR)}},write:function(){try{return r.prototype.write.apply(this,arguments)}catch(e){throw new i.ImageError(i.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 f||null},EXIF:function(){var t=null;if(d.exifIFD){try{t=a.call(this,d.exifIFD,c.exif)}catch(n){return null}if(t.ExifVersion&&"array"===e.typeOf(t.ExifVersion)){for(var i=0,r="";i=65472&&65475>=n)return t+=5,{height:e.SHORT(t),width:e.SHORT(t+=2)};i=e.SHORT(t+=2),t+=i-2}return null}function s(){var e=d.thumb(),t,n;return e&&(t=new i(e),n=a(t),t.clear(),n)?(n.data=e,n):null}function u(){d&&l&&c&&(d.clear(),l.purge(),c.clear(),h=l=d=c=null)}var c,l,d,h;if(c=new i(o),65496!==c.SHORT(0))throw new t.ImageError(t.ImageError.WRONG_FORMAT);l=new n(o);try{d=new r(l.get("app1")[0])}catch(f){}h=a.call(this),e.extend(this,{type:"image/jpeg",size:c.length(),width:h&&h.width||0,height:h&&h.height||0,setExif:function(t,n){return d?("object"===e.typeOf(t)?e.each(t,function(e,t){d.setExif(t,e)}):d.setExif(t,n),void l.set("app1",d.SEGMENT())):!1},writeHeaders:function(){return l.restore(arguments.length?arguments[0]: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}),i(G,[f,u,H],function(e,t,n){function i(i){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(),i=l=u=c=s=null)}function a(e){var t,n,i,r;return t=s.LONG(e),n=s.STRING(e+=4,4),i=e+=4,r=s.LONG(e+t),{length:t,type:n,start:i,CRC:r}}var s,u,c,l;s=new n(i),function(){var t=0,n=0,i=[35152,20039,3338,6666];for(n=0;ng;){for(var v=g+h>a?a-g:h,w=0;o>w;){var y=w+h>o?o-w:h;p.clearRect(0,0,h,h),p.drawImage(e,-w,-g);var E=w*s/o+c<<0,_=Math.ceil(y*s/o),b=g*u/a/m+l<<0,x=Math.ceil(v*u/a/m);d.drawImage(f,0,0,y,v,E,b,_,x),w+=h}g+=h}f=p=null}function t(e){var t=e.naturalWidth,n=e.naturalHeight;if(t*n>1048576){var i=document.createElement("canvas");i.width=i.height=1;var r=i.getContext("2d");return r.drawImage(e,-t+1,0),0===r.getImageData(0,0,1,1).data[3]}return!1}function n(e,t,n){var i=document.createElement("canvas");i.width=1,i.height=n;var r=i.getContext("2d");r.drawImage(e,0,0);for(var o=r.getImageData(0,0,1,n).data,a=0,s=n,u=n;u>a;){var c=o[4*(u-1)+3];0===c?s=u:a=u,u=s+a>>1}i=null;var l=u/n;return 0===l?1:l}return{isSubsampled:t,renderTo:e}}),i(j,[D,u,f,w,y,E,z,q,d,c],function(e,t,n,i,r,o,a,s,u,c){function l(){function e(){if(!_&&!y)throw new n.ImageError(n.DOMException.INVALID_STATE_ERR);return _||y}function l(e){return i.atob(e.substring(e.indexOf("base64,")+7))}function d(e,t){return"data:"+(t||"")+";base64,"+i.btoa(e)}function h(e){var t=this;y=new Image,y.onerror=function(){v.call(this),t.trigger("error",n.ImageError.WRONG_FORMAT)},y.onload=function(){t.trigger("load")},y.src="data:"==e.substr(0,5)?e:d(e,x.type)}function f(e,t){var i=this,r;return window.FileReader?(r=new FileReader,r.onload=function(){t(this.result)},r.onerror=function(){i.trigger("error",n.ImageError.WRONG_FORMAT)},r.readAsDataURL(e),void 0):t(e.getAsDataURL())}function p(n,i,r,o){var a=this,s,u,c=0,l=0,d,h,f,p;if(A=o,p=this.meta&&this.meta.tiff&&this.meta.tiff.Orientation||1,-1!==t.inArray(p,[5,6,7,8])){var v=n;n=i,i=v}return d=e(),r?(n=Math.min(n,d.width),i=Math.min(i,d.height),s=Math.max(n/d.width,i/d.height)):s=Math.min(n/d.width,i/d.height),s>1&&!r&&o?void this.trigger("Resize"):(_||(_=document.createElement("canvas")),h=Math.round(d.width*s),f=Math.round(d.height*s),r?(_.width=n,_.height=i,h>n&&(c=Math.round((h-n)/2)),f>i&&(l=Math.round((f-i)/2))):(_.width=h,_.height=f),A||g(_.width,_.height,p),m.call(this,d,_,-c,-l,h,f),this.width=_.width,this.height=_.height,R=!0,void a.trigger("Resize"))}function m(e,t,n,i,r,o){if("iOS"===c.OS)s.renderTo(e,t,{width:r,height:o,x:n,y:i});else{var a=t.getContext("2d");a.drawImage(e,n,i,r,o)}}function g(e,t,n){switch(n){case 5:case 6:case 7:case 8:_.width=t,_.height=e;break;default:_.width=e,_.height=t}var i=_.getContext("2d");switch(n){case 2:i.translate(e,0),i.scale(-1,1);break;case 3:i.translate(e,t),i.rotate(Math.PI);break;case 4:i.translate(0,t),i.scale(1,-1);break;case 5:i.rotate(.5*Math.PI),i.scale(1,-1);break;case 6:i.rotate(.5*Math.PI),i.translate(0,-t);break;case 7:i.rotate(.5*Math.PI),i.translate(e,-t),i.scale(-1,1);break;case 8:i.rotate(-.5*Math.PI),i.translate(-e,0)}}function v(){E&&(E.purge(),E=null),b=y=_=x=null,R=!1}var w=this,y,E,_,b,x,R=!1,A=!0;t.extend(this,{loadFromBlob:function(e){var t=this,i=t.getRuntime(),r=arguments.length>1?arguments[1]:!0;if(!i.can("access_binary"))throw new n.RuntimeError(n.RuntimeError.NOT_SUPPORTED_ERR);return x=e,e.isDetached()?(b=e.getSource(),void h.call(this,b)):void f.call(this,e.getSource(),function(e){r&&(b=l(e)),h.call(t,e)})},loadFromImage:function(e,t){this.meta=e.meta,x=new o(null,{name:e.name,size:e.size,type:e.type}),h.call(this,t?b=e.getAsBinaryString():e.getAsDataURL())},getInfo:function(){var t=this.getRuntime(),n;return!E&&b&&t.can("access_image_binary")&&(E=new a(b)),n={width:e().width||0,height:e().height||0,type:x.type||u.getFileMime(x.name),size:b&&b.length||x.size||0,name:x.name||"",meta:E&&E.meta||this.meta||{}},!n.meta||!n.meta.thumb||n.meta.thumb.data instanceof r||(n.meta.thumb.data=new r(null,{type:"image/jpeg",data:n.meta.thumb.data})),n},downsize:function(){p.apply(this,arguments)},getAsCanvas:function(){return _&&(_.id=this.uid+"_canvas"),_},getAsBlob:function(e,t){return e!==this.type&&p.call(this,this.width,this.height,!1),new o(null,{name:x.name||"",type:e,data:w.getAsBinaryString.call(this,e,t)})},getAsDataURL:function(e){var t=arguments[1]||90;if(!R)return y.src;if("image/jpeg"!==e)return _.toDataURL("image/png");try{return _.toDataURL("image/jpeg",t/100)}catch(n){return _.toDataURL("image/jpeg")}},getAsBinaryString:function(e,t){if(!R)return b||(b=l(w.getAsDataURL(e,t))),b;if("image/jpeg"!==e)b=l(w.getAsDataURL(e,t));else{var n;t||(t=90);try{n=_.toDataURL("image/jpeg",t/100)}catch(i){n=_.toDataURL("image/jpeg")}b=l(n),E&&(b=E.stripHeaders(b),A&&(E.meta&&E.meta.exif&&E.setExif({PixelXDimension:this.width,PixelYDimension:this.height}),b=E.writeHeaders(b)),E.purge(),E=null)}return R=!1,b},destroy:function(){w=null,v.call(this),this.getRuntime().getShim().removeInstance(this.uid)}})}return e.Image=l}),i(X,[u,c,h,f,m],function(e,t,n,i,r){function o(){var e;try{e=navigator.plugins["Shockwave Flash"],e=e.description}catch(t){try{e=new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version")}catch(n){e="0.0"}}return e=e.match(/\d+/g),parseFloat(e[0]+"."+e[1])}function a(e){var i=n.get(e);i&&"OBJECT"==i.nodeName&&("IE"===t.browser?(i.style.display="none",function r(){4==i.readyState?s(e):setTimeout(r,10)}()):i.parentNode.removeChild(i))}function s(e){var t=n.get(e);if(t){for(var i in t)"function"==typeof t[i]&&(t[i]=null);t.parentNode.removeChild(t)}}function u(s){var u=this,d;s=e.extend({swf_url:t.swf_url},s),r.call(this,s,c,{access_binary:function(e){return e&&"browser"===u.mode},access_image_binary:function(e){return e&&"browser"===u.mode},display_media:r.capTrue,do_cors:r.capTrue,drag_and_drop:!1,report_upload_progress:function(){return"client"===u.mode},resize_image:r.capTrue,return_response_headers:!1,return_response_type:function(t){return"json"===t&&window.JSON?!0:!e.arrayDiff(t,["","text","document"])||"browser"===u.mode},return_status_code:function(t){return"browser"===u.mode||!e.arrayDiff(t,[200,404])},select_file:r.capTrue,select_multiple:r.capTrue,send_binary_string:function(e){return e&&"browser"===u.mode},send_browser_cookies:function(e){return e&&"browser"===u.mode},send_custom_headers:function(e){return e&&"browser"===u.mode},send_multipart:r.capTrue,slice_blob:function(e){return e&&"browser"===u.mode},stream_upload:function(e){return e&&"browser"===u.mode},summon_file_dialog:!1,upload_filesize:function(t){return e.parseSizeStr(t)<=2097152||"client"===u.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"},stream_upload:function(e){return e?"client":"browser"},upload_filesize:function(t){return e.parseSizeStr(t)>=2097152?"client":"browser"}},"client"),o()<10&&(this.mode=!1),e.extend(this,{getShim:function(){return n.get(this.uid)},shimExec:function(e,t){var n=[].slice.call(arguments,2);return u.getShim().exec(this.uid,e,t,n)},init:function(){var n,r,o;o=this.getShimContainer(),e.extend(o.style,{position:"absolute",top:"-8px",left:"-8px",width:"9px",height:"9px",overflow:"hidden"}),n='',"IE"===t.browser?(r=document.createElement("div"),o.appendChild(r),r.outerHTML=n,r=o=null):o.innerHTML=n,d=setTimeout(function(){u&&!u.initialized&&u.trigger("Error",new i.RuntimeError(i.RuntimeError.NOT_INIT_ERR))},5e3)},destroy:function(e){return function(){a(u.uid),e.call(u),clearTimeout(d),s=d=e=u=null}}(this.destroy)},l)}var c="flash",l={};return r.addConstructor(c,u),l}),i(V,[X,E,u],function(e,t,n){var i={init:function(e){var i=this,r=this.getRuntime();this.bind("Change",function(){var e=r.shimExec.call(i,"FileInput","getFiles");i.files=[],n.each(e,function(e){i.files.push(new t(r.uid,e))})},999),this.getRuntime().shimExec.call(this,"FileInput","init",{name:e.name,accept:e.accept,multiple:e.multiple}),this.trigger("ready")}};return e.FileInput=i}),i(W,[X,y],function(e,t){var n={slice:function(e,n,i,r){var o=this.getRuntime();return 0>n?n=Math.max(e.size+n,0):n>0&&(n=Math.min(n,e.size)),0>i?i=Math.max(e.size+i,0):i>0&&(i=Math.min(i,e.size)),e=o.shimExec.call(this,"Blob","slice",n,i,r||""),e&&(e=new t(o.uid,e)),e}};return e.Blob=n}),i(Y,[X,w],function(e,t){function n(e,n){switch(n){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var i={read:function(e,t){var i=this;return i.result="","readAsDataURL"===e&&(i.result="data:"+(t.type||"")+";base64,"),i.bind("Progress",function(t,r){r&&(i.result+=n(r,e))},999),i.getRuntime().shimExec.call(this,"FileReader","readAsBase64",t.uid)}};return e.FileReader=i}),i($,[X,w],function(e,t){function n(e,n){switch(n){case"readAsText":return t.atob(e,"utf8");case"readAsBinaryString":return t.atob(e);case"readAsDataURL":return e}return null}var i={read:function(e,t){var i,r=this.getRuntime();return(i=r.shimExec.call(this,"FileReaderSync","readAsBase64",t.uid))?("readAsDataURL"===e&&(i="data:"+(t.type||"")+";base64,"+i),n(i,e,t.type)):null}};return e.FileReaderSync=i}),i(J,[X,u,y,E,A,I,S],function(e,t,n,i,r,o,a){var s={send:function(e,i){function r(){e.transport=l.mode,l.shimExec.call(c,"XMLHttpRequest","send",e,i)}function s(e,t){l.shimExec.call(c,"XMLHttpRequest","appendBlob",e,t.uid),i=null,r()}function u(e,t){var n=new a;n.bind("TransportingComplete",function(){t(this.result)}),n.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())}),i instanceof o){var d;if(i.each(function(e,t){e instanceof n?d=t:l.shimExec.call(c,"XMLHttpRequest","append",t,e)}),i.hasBlob()){var h=i.getBlob();h.isDetached()?u(h,function(e){h.destroy(),s(d,e)}):s(d,h)}else i=null,r()}else i instanceof n?i.isDetached()?u(i,function(e){i.destroy(),i=e.uid,r()}):(i=i.uid,r()):r()},getResponse:function(e){var n,o,a=this.getRuntime();if(o=a.shimExec.call(this,"XMLHttpRequest","getResponseAsBlob")){if(o=new i(a.uid,o),"blob"===e)return o;try{if(n=new r,~t.inArray(e,["","text"]))return n.readAsText(o);if("json"===e&&window.JSON)return JSON.parse(n.readAsText(o))}finally{o.destroy()}}return null},abort:function(e){var t=this.getRuntime();t.shimExec.call(this,"XMLHttpRequest","abort"),this.dispatchEvent("readystatechange"),this.dispatchEvent("abort")}};return e.XMLHttpRequest=s}),i(Z,[X,y],function(e,t){var n={getAsBlob:function(e){var n=this.getRuntime(),i=n.shimExec.call(this,"Transporter","getAsBlob",e);return i?new t(n.uid,i):null}};return e.Transporter=n}),i(K,[X,u,S,y,A],function(e,t,n,i,r){var o={loadFromBlob:function(e){function t(e){r.shimExec.call(i,"Image","loadFromBlob",e.uid),i=r=null}var i=this,r=i.getRuntime();if(e.isDetached()){var o=new n;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 instanceof i||(t.meta.thumb.data=new i(e.uid,t.meta.thumb.data)),t},getAsBlob:function(e,t){var n=this.getRuntime(),r=n.shimExec.call(this,"Image","getAsBlob",e,t);return r?new i(n.uid,r):null},getAsDataURL:function(){var e=this.getRuntime(),t=e.Image.getAsBlob.apply(this,arguments),n;return t?(n=new r,n.readAsDataURL(t)):null}};return e.Image=o}),i(Q,[u,c,h,f,m],function(e,t,n,i,r){function o(e){var t=!1,n=null,i,r,o,a,s,u=0;try{try{n=new ActiveXObject("AgControl.AgControl"),n.IsVersionSupported(e)&&(t=!0),n=null}catch(c){var l=navigator.plugins["Silverlight Plug-In"];if(l){for(i=l.description,"1.0.30226.2"===i&&(i="2.0.30226.2"),r=i.split(".");r.length>3;)r.pop();for(;r.length<4;)r.push(0);for(o=e.split(".");o.length>4;)o.pop();do a=parseInt(o[u],10),s=parseInt(r[u],10),u++;while(u=a&&!isNaN(a)&&(t=!0)}}}catch(d){t=!1}return t}function a(a){var c=this,l;a=e.extend({xap_url:t.xap_url},a),r.call(this,a,s,{access_binary:r.capTrue,access_image_binary:r.capTrue,display_media:r.capTrue,do_cors:r.capTrue,drag_and_drop:!1,report_upload_progress:r.capTrue,resize_image:r.capTrue,return_response_headers:function(e){return e&&"client"===c.mode},return_response_type:function(e){return"json"!==e?!0:!!window.JSON},return_status_code:function(t){return"client"===c.mode||!e.arrayDiff(t,[200,404])},select_file:r.capTrue,select_multiple:r.capTrue,send_binary_string:r.capTrue,send_browser_cookies:function(e){return e&&"browser"===c.mode},send_custom_headers:function(e){return e&&"client"===c.mode},send_multipart:r.capTrue,slice_blob:r.capTrue,stream_upload:!0,summon_file_dialog:!1,upload_filesize:r.capTrue,use_http_method:function(t){return"client"===c.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"]}}),o("2.0.31005.0")&&"Opera"!==t.browser||(this.mode=!1),e.extend(this,{getShim:function(){return n.get(this.uid).content.Moxie},shimExec:function(e,t){var n=[].slice.call(arguments,2);return c.getShim().exec(this.uid,e,t,n)},init:function(){var e;e=this.getShimContainer(),e.innerHTML='',l=setTimeout(function(){c&&!c.initialized&&c.trigger("Error",new i.RuntimeError(i.RuntimeError.NOT_INIT_ERR))},"Windows"!==t.OS?1e4:5e3)},destroy:function(e){return function(){e.call(c),clearTimeout(l),a=l=e=c=null}}(this.destroy)},u)}var s="silverlight",u={};return r.addConstructor(s,a),u}),i(ee,[Q,E,u],function(e,t,n){var i={init:function(e){function i(e){for(var t="",n=0;ni;i++)n=t.keys[i],s=t[n],s&&(/^(\d|[1-9]\d+)$/.test(s)?s=parseInt(s,10):/^\d*\.\d+$/.test(s)&&(s=parseFloat(s)),r.meta[e][n]=s)}),!r.meta||!r.meta.thumb||r.meta.thumb.data instanceof n||(r.meta.thumb.data=new n(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}})}),i(ue,[u,f,m,c],function(e,t,n,i){function r(t){var r=this,s=n.capTest,u=n.capTrue;n.call(this,t,o,{access_binary:s(window.FileReader||window.File&&File.getAsDataURL),access_image_binary:!1,display_media:s(a.Image&&(i.can("create_canvas")||i.can("use_data_uri_over32kb"))),do_cors:!1,drag_and_drop:!1,filter_by_extension:s(function(){return"Chrome"===i.browser&&i.verComp(i.version,28,">=")||"IE"===i.browser&&i.verComp(i.version,10,">=")||"Safari"===i.browser&&i.verComp(i.version,7,">=")}()),resize_image:function(){return a.Image&&r.can("access_binary")&&i.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 i.can("use_fileinput")},select_multiple:!1,send_binary_string:!1,send_custom_headers:!1,send_multipart:!0,slice_blob:!1,stream_upload:function(){return r.can("select_file")},summon_file_dialog:function(){return r.can("select_file")&&("Firefox"===i.browser&&i.verComp(i.version,4,">=")||"Opera"===i.browser&&i.verComp(i.version,12,">=")||"IE"===i.browser&&i.verComp(i.version,10,">=")||!!~e.inArray(i.browser,["Chrome","Safari"]))},upload_filesize:u,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(r),e=r=null}}(this.destroy)}),e.extend(this.getShim(),a)}var o="html4",a={};return n.addConstructor(o,r),a}),i(ce,[ue,E,u,h,N,d,c],function(e,t,n,i,r,o,a){function s(){function e(){var o=this,l=o.getRuntime(),d,h,f,p,m,g;g=n.guid("uid_"),d=l.getShimContainer(),s&&(f=i.get(s+"_form"),f&&n.extend(f.style,{top:"100%"})),p=document.createElement("form"),p.setAttribute("id",g+"_form"),p.setAttribute("method","post"),p.setAttribute("enctype","multipart/form-data"),p.setAttribute("encoding","multipart/form-data"),n.extend(p.style,{overflow:"hidden",position:"absolute",top:0,left:0,width:"100%",height:"100%"}),m=document.createElement("input"),m.setAttribute("id",g),m.setAttribute("type","file"),m.setAttribute("name",c.name||"Filedata"),m.setAttribute("accept",u.join(",")),n.extend(m.style,{fontSize:"999px",opacity:0}),p.appendChild(m),d.appendChild(p),n.extend(m.style,{position:"absolute",top:0,left:0,width:"100%",height:"100%"}),"IE"===a.browser&&a.verComp(a.version,10,"<")&&n.extend(m.style,{filter:"progid:DXImageTransform.Microsoft.Alpha(opacity=0)"}),m.onchange=function(){var n;if(this.value){if(this.files){if(n=this.files[0],0===n.size)return void p.parentNode.removeChild(p)}else n={name:this.value};n=new t(l.uid,n),this.onchange=function(){},e.call(o),o.files=[n],m.setAttribute("id",n.uid),p.setAttribute("id",n.uid+"_form"),o.trigger("change"),m=p=null}},l.can("summon_file_dialog")&&(h=i.get(c.browse_button),r.removeEvent(h,"click",o.uid),r.addEvent(h,"click",function(e){m&&!m.disabled&&m.click(),e.preventDefault()},o.uid)),s=g,d=f=h=null}var s,u=[],c;n.extend(this,{init:function(t){var n=this,a=n.getRuntime(),s;c=t,u=t.accept.mimes||o.extList2mimes(t.accept,a.can("filter_by_extension")),s=a.getShimContainer(),function(){var e,o,u;e=i.get(t.browse_button),a.can("summon_file_dialog")&&("static"===i.getStyle(e,"position")&&(e.style.position="relative"),o=parseInt(i.getStyle(e,"z-index"),10)||1,e.style.zIndex=o,s.style.zIndex=o-1),u=a.can("summon_file_dialog")?e:s,r.addEvent(u,"mouseover",function(){n.trigger("mouseenter")},n.uid),r.addEvent(u,"mouseout",function(){n.trigger("mouseleave")},n.uid),r.addEvent(u,"mousedown",function(){n.trigger("mousedown")},n.uid),r.addEvent(i.get(t.container),"mouseup",function(){n.trigger("mouseup")},n.uid),e=null}(),e.call(this),s=null,n.trigger({type:"ready",async:!0})},disable:function(e){var t;(t=i.get(s))&&(t.disabled=!!e)},destroy:function(){var e=this.getRuntime(),t=e.getShim(),n=e.getShimContainer();r.removeAllEvents(n,this.uid),r.removeAllEvents(c&&i.get(c.container),this.uid),r.removeAllEvents(c&&i.get(c.browse_button),this.uid),n&&(n.innerHTML=""),t.removeInstance(this.uid),s=u=c=n=t=null}})}return e.FileInput=s}),i(le,[ue,F],function(e,t){return e.FileReader=t}),i(de,[ue,u,h,x,f,N,y,I],function(e,t,n,i,r,o,a,s){function u(){function e(e){var t=this,i,r,a,s,u=!1;if(l){if(i=l.id.replace(/_iframe$/,""),r=n.get(i+"_form")){for(a=r.getElementsByTagName("input"),s=a.length;s--;)switch(a[s].getAttribute("type")){case"hidden":a[s].parentNode.removeChild(a[s]);break;case"file":u=!0}a=[],u||r.parentNode.removeChild(r),r=null}setTimeout(function(){o.removeEvent(l,"load",t.uid),l.parentNode&&l.parentNode.removeChild(l);var n=t.getRuntime().getShimContainer();n.children.length||n.parentNode.removeChild(n),n=l=null,e()},1)}}var u,c,l;t.extend(this,{send:function(d,h){function f(){var n=m.getShimContainer()||document.body,r=document.createElement("div");r.innerHTML='',l=r.firstChild,n.appendChild(l),o.addEvent(l,"load",function(){var n;try{n=l.contentWindow.document||l.contentDocument||window.frames[l.id].document,/^4(0[0-9]|1[0-7]|2[2346])\s/.test(n.title)?u=n.title.replace(/^(\d+).*$/,"$1"):(u=200,c=t.trim(n.body.innerHTML),p.trigger({type:"progress",loaded:c.length,total:c.length}),y&&p.trigger({type:"uploadprogress",loaded:y.size||1025,total:y.size||1025}))}catch(r){if(!i.hasSameOrigin(d.url))return void e.call(p,function(){p.trigger("error")});u=404}e.call(p,function(){p.trigger("load")})},p.uid)}var p=this,m=p.getRuntime(),g,v,w,y;if(u=c=null,h instanceof s&&h.hasBlob()){if(y=h.getBlob(),g=y.uid,w=n.get(g),v=n.get(g+"_form"),!v)throw new r.DOMException(r.DOMException.NOT_FOUND_ERR)}else g=t.guid("uid_"),v=document.createElement("form"),v.setAttribute("id",g+"_form"),v.setAttribute("method",d.method),v.setAttribute("enctype","multipart/form-data"),v.setAttribute("encoding","multipart/form-data"),m.getShimContainer().appendChild(v);v.setAttribute("target",g+"_iframe"),h instanceof s&&h.each(function(e,n){if(e instanceof a)w&&w.setAttribute("name",n);else{var i=document.createElement("input");t.extend(i,{type:"hidden",name:n,value:e}),w?v.insertBefore(i,w):v.appendChild(i)}}),v.setAttribute("action",d.url),f(),v.submit(),p.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*]*>/,"").replace(/<\/pre>\s*$/,""))}catch(n){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")})}})}return e.XMLHttpRequest=u}),i(he,[ue,j],function(e,t){return e.Image=t}),a([u,c,l,d,h,f,p,m,g,v,w,y,E,_,b,x,R,A,I,T,S,O,N])}(this);;(function(e){"use strict";var t={},n=e.moxie.core.utils.Basic.inArray;return function r(e){var i,s;for(i in e)s=typeof e[i],s==="object"&&!~n(i,["Exceptions","Env","Mime"])?r(e[i]):s==="function"&&(t[i]=e[i])}(e.moxie),t.Env=e.moxie.core.utils.Env,t.Mime=e.moxie.core.utils.Mime,t.Exceptions=e.moxie.core.Exceptions,e.mOxie=t,e.o||(e.o=t),t})(this); -/** - * Plupload - multi-runtime File Uploader - * v2.1.8 - * - * Copyright 2013, Moxiecode Systems AB - * Released under GPL License. - * - * License: http://www.plupload.com/license - * Contributing: http://www.plupload.com/contributing - * - * Date: 2015-07-21 - */ -;(function(e,t,n){function s(e){function r(e,t,r){var i={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"};i[e]?n[i[e]]=t:r||(n[e]=t)}var t=e.required_features,n={};if(typeof t=="string")o.each(t.split(/\s*,\s*/),function(e){r(e,!0)});else if(typeof t=="object")o.each(t,function(e,t){r(t,e)});else if(t===!0){e.chunk_size>0&&(n.slice_blob=!0);if(e.resize.enabled||!e.multipart)n.send_binary_string=!0;o.each(e,function(e,t){r(t,!!e,!0)})}return n}var r=e.setTimeout,i={},o={VERSION:"2.1.8",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,mimeTypes:t.mimes,ua:t.ua,typeOf:t.typeOf,extend:t.extend,guid:t.guid,get:function(n){var r=[],i;t.typeOf(n)!=="array"&&(n=[n]);var s=n.length;while(s--)i=t.get(n[s]),i&&r.push(i);return r.length?r:null},each:t.each,getPos:t.getPos,getSize:t.getSize,xmlEncode:function(e){var t={"<":"lt",">":"gt","&":"amp",'"':"quot","'":"#39"},n=/[<>&\"\']/g;return e?(""+e).replace(n,function(e){return t[e]?"&"+t[e]+";":e}):e},toArray:t.toArray,inArray:t.inArray,addI18n:t.addI18n,translate:t.translate,isEmptyObj:t.isEmptyObj,hasClass:t.hasClass,addClass:t.addClass,removeClass:t.removeClass,getStyle:t.getStyle,addEvent:t.addEvent,removeEvent:t.removeEvent,removeAllEvents:t.removeAllEvents,cleanName:function(e){var t,n;n=[/[\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"];for(t=0;t0?"&":"?")+n),e},formatSize:function(e){function t(e,t){return Math.round(e*Math.pow(10,t))/Math.pow(10,t)}if(e===n||/\D/.test(e))return o.translate("N/A");var r=Math.pow(1024,4);return e>r?t(e/r,1)+" "+o.translate("tb"):e>(r/=1024)?t(e/r,1)+" "+o.translate("gb"):e>(r/=1024)?t(e/r,1)+" "+o.translate("mb"):e>1024?Math.round(e/1024)+" "+o.translate("kb"):e+" "+o.translate("b")},parseSize:t.parseSizeStr,predictRuntime:function(e,n){var r,i;return r=new o.Uploader(e),i=t.Runtime.thatCan(r.getOption().required_features,n||e.runtimes),r.destroy(),i},addFileFilter:function(e,t){i[e]=t}};o.addFileFilter("mime_types",function(e,t,n){e.length&&!e.regexp.test(t.name)?(this.trigger("Error",{code:o.FILE_EXTENSION_ERROR,message:o.translate("File extension error."),file:t}),n(!1)):n(!0)}),o.addFileFilter("max_file_size",function(e,t,n){var r;e=o.parseSize(e),t.size!==r&&e&&t.size>e?(this.trigger("Error",{code:o.FILE_SIZE_ERROR,message:o.translate("File size error."),file:t}),n(!1)):n(!0)}),o.addFileFilter("prevent_duplicates",function(e,t,n){if(e){var r=this.files.length;while(r--)if(t.name===this.files[r].name&&t.size===this.files[r].size){this.trigger("Error",{code:o.FILE_DUPLICATE_ERROR,message:o.translate("Duplicate file error."),file:t}),n(!1);return}}n(!0)}),o.Uploader=function(e){function g(){var e,t=0,n;if(this.state==o.STARTED){for(n=0;n0?Math.ceil(e.loaded/e.size*100):100,b()}function b(){var e,t;d.reset();for(e=0;e0?Math.ceil(d.uploaded/f.length*100):0:(d.bytesPerSec=Math.ceil(d.loaded/((+(new Date)-p||1)/1e3)),d.percent=d.size>0?Math.ceil(d.loaded/d.size*100):0)}function w(){var e=c[0]||h[0];return e?e.getRuntime().uid:!1}function E(e,n){if(e.ruid){var r=t.Runtime.getInfo(e.ruid);if(r)return r.can(n)}return!1}function S(){this.bind("FilesAdded FilesRemoved",function(e){e.trigger("QueueChanged"),e.refresh()}),this.bind("CancelUpload",O),this.bind("BeforeUpload",C),this.bind("UploadFile",k),this.bind("UploadProgress",L),this.bind("StateChanged",A),this.bind("QueueChanged",b),this.bind("Error",_),this.bind("FileUploaded",M),this.bind("Destroy",D)}function x(e,n){var r=this,i=0,s=[],u={runtime_order:e.runtimes,required_caps:e.required_features,preferred_caps:l,swf_url:e.flash_swf_url,xap_url:e.silverlight_xap_url};o.each(e.runtimes.split(/\s*,\s*/),function(t){e[t]&&(u[t]=e[t])}),e.browse_button&&o.each(e.browse_button,function(n){s.push(function(s){var a=new t.FileInput(o.extend({},u,{accept:e.filters.mime_types,name:e.file_data_name,multiple:e.multi_selection,container:e.container,browse_button:n}));a.onready=function(){var e=t.Runtime.getInfo(this.ruid);t.extend(r.features,{chunks:e.can("slice_blob"),multipart:e.can("send_multipart"),multi_selection:e.can("select_multiple")}),i++,c.push(this),s()},a.onchange=function(){r.addFile(this.files)},a.bind("mouseenter mouseleave mousedown mouseup",function(r){v||(e.browse_button_hover&&("mouseenter"===r.type?t.addClass(n,e.browse_button_hover):"mouseleave"===r.type&&t.removeClass(n,e.browse_button_hover)),e.browse_button_active&&("mousedown"===r.type?t.addClass(n,e.browse_button_active):"mouseup"===r.type&&t.removeClass(n,e.browse_button_active)))}),a.bind("mousedown",function(){r.trigger("Browse")}),a.bind("error runtimeerror",function(){a=null,s()}),a.init()})}),e.drop_element&&o.each(e.drop_element,function(e){s.push(function(n){var s=new t.FileDrop(o.extend({},u,{drop_zone:e}));s.onready=function(){var e=t.Runtime.getInfo(this.ruid);r.features.dragdrop=e.can("drag_and_drop"),i++,h.push(this),n()},s.ondrop=function(){r.addFile(this.files)},s.bind("error runtimeerror",function(){s=null,n()}),s.init()})}),t.inSeries(s,function(){typeof n=="function"&&n(i)})}function T(e,r,i){var s=new t.Image;try{s.onload=function(){if(r.width>this.width&&r.height>this.height&&r.quality===n&&r.preserve_headers&&!r.crop)return this.destroy(),i(e);s.downsize(r.width,r.height,r.crop,r.preserve_headers)},s.onresize=function(){i(this.getAsBlob(e.type,r.quality)),this.destroy()},s.onerror=function(){i(e)},s.load(e)}catch(o){i(e)}}function N(e,n,r){function f(e,t,n){var r=a[e];switch(e){case"max_file_size":e==="max_file_size"&&(a.max_file_size=a.filters.max_file_size=t);break;case"chunk_size":if(t=o.parseSize(t))a[e]=t,a.send_file_name=!0;break;case"multipart":a[e]=t,t||(a.send_file_name=!0);break;case"unique_names":a[e]=t,t&&(a.send_file_name=!0);break;case"filters":o.typeOf(t)==="array"&&(t={mime_types:t}),n?o.extend(a.filters,t):a.filters=t,t.mime_types&&(a.filters.mime_types.regexp=function(e){var t=[];return o.each(e,function(e){o.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")}(a.filters.mime_types));break;case"resize":n?o.extend(a.resize,t,{enabled:!0}):a.resize=t;break;case"prevent_duplicates":a.prevent_duplicates=a.filters.prevent_duplicates=!!t;break;case"browse_button":case"drop_element":t=o.get(t);case"container":case"runtimes":case"multi_selection":case"flash_swf_url":case"silverlight_xap_url":a[e]=t,n||(u=!0);break;default:a[e]=t}n||i.trigger("OptionChanged",e,t,r)}var i=this,u=!1;typeof e=="object"?o.each(e,function(e,t){f(t,e,r)}):f(e,n,r),r?(a.required_features=s(o.extend({},a)),l=s(o.extend({},a,{required_features:!0}))):u&&(i.trigger("Destroy"),x.call(i,a,function(e){e?(i.runtime=t.Runtime.getInfo(w()).type,i.trigger("Init",{runtime:i.runtime}),i.trigger("PostInit")):i.trigger("Error",{code:o.INIT_ERROR,message:o.translate("Init error.")})}))}function C(e,t){if(e.settings.unique_names){var n=t.name.match(/\.([^.]+)$/),r="part";n&&(r=n[1]),t.target_name=t.id+"."+r}}function k(e,n){function h(){u-->0?r(p,1e3):(n.loaded=f,e.trigger("Error",{code:o.HTTP_ERROR,message:o.translate("HTTP Error."),file:n,response:m.responseText,status:m.status,responseHeaders:m.getAllResponseHeaders()}))}function p(){var d,v,g={},y;if(n.status!==o.UPLOADING||e.state===o.STOPPED)return;e.settings.send_file_name&&(g.name=n.target_name||n.name),s&&a.chunks&&c.size>s?(y=Math.min(s,c.size-f),d=c.slice(f,f+y)):(y=c.size,d=c),s&&a.chunks&&(e.settings.send_chunk_number?(g.chunk=Math.ceil(f/s),g.chunks=Math.ceil(c.size/s)):(g.offset=f,g.total=c.size)),m=new t.XMLHttpRequest,m.upload&&(m.upload.onprogress=function(t){n.loaded=Math.min(n.size,f+t.loaded),e.trigger("UploadProgress",n)}),m.onload=function(){if(m.status>=400){h();return}u=e.settings.max_retries,y=c.size?(n.size!=n.origSize&&(c.destroy(),c=null),e.trigger("UploadProgress",n),n.status=o.DONE,e.trigger("FileUploaded",n,{response:m.responseText,status:m.status,responseHeaders:m.getAllResponseHeaders()})):r(p,1)},m.onerror=function(){h()},m.onloadend=function(){this.destroy(),m=null},e.settings.multipart&&a.multipart?(m.open("post",i,!0),o.each(e.settings.headers,function(e,t){m.setRequestHeader(t,e)}),v=new t.FormData,o.each(o.extend(g,e.settings.multipart_params),function(e,t){v.append(t,e)}),v.append(e.settings.file_data_name,d),m.send(v,{runtime_order:e.settings.runtimes,required_caps:e.settings.required_features,preferred_caps:l,swf_url:e.settings.flash_swf_url,xap_url:e.settings.silverlight_xap_url})):(i=o.buildUrl(e.settings.url,o.extend(g,e.settings.multipart_params)),m.open("post",i,!0),m.setRequestHeader("Content-Type","application/octet-stream"),o.each(e.settings.headers,function(e,t){m.setRequestHeader(t,e)}),m.send(d,{runtime_order:e.settings.runtimes,required_caps:e.settings.required_features,preferred_caps:l,swf_url:e.settings.flash_swf_url,xap_url:e.settings.silverlight_xap_url}))}var i=e.settings.url,s=e.settings.chunk_size,u=e.settings.max_retries,a=e.features,f=0,c;n.loaded&&(f=n.loaded=s?s*Math.floor(n.loaded/s):0),c=n.getSource(),e.settings.resize.enabled&&E(c,"send_binary_string")&&!!~t.inArray(c.type,["image/jpeg","image/png"])?T.call(this,c,e.settings.resize,function(e){c=e,n.size=e.size,p()}):p()}function L(e,t){y(t)}function A(e){if(e.state==o.STARTED)p=+(new Date);else if(e.state==o.STOPPED)for(var t=e.files.length-1;t>=0;t--)e.files[t].status==o.UPLOADING&&(e.files[t].status=o.QUEUED,b())}function O(){m&&m.abort()}function M(e){b(),r(function(){g.call(e)},1)}function _(e,t){t.code===o.INIT_ERROR?e.destroy():t.code===o.HTTP_ERROR&&(t.file.status=o.FAILED,y(t.file),e.state==o.STARTED&&(e.trigger("CancelUpload"),r(function(){g.call(e)},1)))}function D(e){e.stop(),o.each(f,function(e){e.destroy()}),f=[],c.length&&(o.each(c,function(e){e.destroy()}),c=[]),h.length&&(o.each(h,function(e){e.destroy()}),h=[]),l={},v=!1,p=m=null,d.reset()}var u=o.guid(),a,f=[],l={},c=[],h=[],p,d,v=!1,m;a={runtimes:t.Runtime.order,max_retries:0,chunk_size:0,multipart:!0,multi_selection:!0,file_data_name:"file",flash_swf_url:"js/Moxie.swf",silverlight_xap_url:"js/Moxie.xap",filters:{mime_types:[],prevent_duplicates:!1,max_file_size:0},resize:{enabled:!1,preserve_headers:!0,crop:!1},send_file_name:!0,send_chunk_number:!0},N.call(this,e,null,!0),d=new o.QueueProgress,o.extend(this,{id:u,uid:u,state:o.STOPPED,features:{},runtime:null,files:f,settings:a,total:d,init:function(){var e=this;typeof a.preinit=="function"?a.preinit(e):o.each(a.preinit,function(t,n){e.bind(n,t)}),S.call(this);if(!a.browse_button||!a.url){this.trigger("Error",{code:o.INIT_ERROR,message:o.translate("Init error.")});return}x.call(this,a,function(n){typeof a.init=="function"?a.init(e):o.each(a.init,function(t,n){e.bind(n,t)}),n?(e.runtime=t.Runtime.getInfo(w()).type,e.trigger("Init",{runtime:e.runtime}),e.trigger("PostInit")):e.trigger("Error",{code:o.INIT_ERROR,message:o.translate("Init error.")})})},setOption:function(e,t){N.call(this,e,t,!this.runtime)},getOption:function(e){return e?a[e]:a},refresh:function(){c.length&&o.each(c,function(e){e.trigger("Refresh")}),this.trigger("Refresh")},start:function(){this.state!=o.STARTED&&(this.state=o.STARTED,this.trigger("StateChanged"),g.call(this))},stop:function(){this.state!=o.STOPPED&&(this.state=o.STOPPED,this.trigger("StateChanged"),this.trigger("CancelUpload"))},disableBrowse:function(){v=arguments[0]!==n?arguments[0]:!0,c.length&&o.each(c,function(e){e.disable(v)}),this.trigger("DisableBrowse",v)},getFile:function(e){var t;for(t=f.length-1;t>=0;t--)if(f[t].id===e)return f[t]},addFile:function(e,n){function c(e,n){var r=[];t.each(s.settings.filters,function(t,n){i[n]&&r.push(function(r){i[n].call(s,t,e,function(e){r(!e)})})}),t.inSeries(r,n)}function h(e){var i=t.typeOf(e);if(e instanceof t.File){if(!e.ruid&&!e.isDetached()){if(!l)return!1;e.ruid=l,e.connectRuntime(l)}h(new o.File(e))}else e instanceof t.Blob?(h(e.getSource()),e.destroy()):e instanceof o.File?(n&&(e.name=n),u.push(function(t){c(e,function(n){n||(f.push(e),a.push(e),s.trigger("FileFiltered",e)),r(t,1)})})):t.inArray(i,["file","blob"])!==-1?h(new t.File(null,e)):i==="node"&&t.typeOf(e.files)==="filelist"?t.each(e.files,h):i==="array"&&(n=null,t.each(e,h))}var s=this,u=[],a=[],l;l=w(),h(e),u.length&&t.inSeries(u,function(){a.length&&s.trigger("FilesAdded",a)})},removeFile:function(e){var t=typeof e=="string"?e:e.id;for(var n=f.length-1;n>=0;n--)if(f[n].id===t)return this.splice(n,1)[0]},splice:function(e,t){var r=f.splice(e===n?0:e,t===n?f.length:t),i=!1;return this.state==o.STARTED&&(o.each(r,function(e){if(e.status===o.UPLOADING)return i=!0,!1}),i&&this.stop()),this.trigger("FilesRemoved",r),o.each(r,function(e){e.destroy()}),i&&this.start(),r},dispatchEvent:function(e){var t,n,r;e=e.toLowerCase(),t=this.hasEventListener(e);if(t){t.sort(function(e,t){return t.priority-e.priority}),n=[].slice.call(arguments),n.shift(),n.unshift(this);for(var i=0;iD4>6c2`waD@X%_ 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

      ohC;)+F&1(P3t&|kXtQOoB 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 Ug!->zP~VIFcmE diff --git a/wp/wp-includes/js/plupload/wp-plupload.js b/wp/wp-includes/js/plupload/wp-plupload.js deleted file mode 100644 index 032a38fe..00000000 --- a/wp/wp-includes/js/plupload/wp-plupload.js +++ /dev/null @@ -1,426 +0,0 @@ -/* global pluploadL10n, plupload, _wpPluploadSettings */ - -window.wp = window.wp || {}; - -( function( exports, $ ) { - var Uploader; - - if ( typeof _wpPluploadSettings === 'undefined' ) { - return; - } - - /** - * A WordPress uploader. - * - * The Plupload library provides cross-browser uploader UI integration. - * This object bridges the Plupload API to integrate uploads into the - * WordPress back end and the WordPress media experience. - * - * @param {object} options The options passed to the new plupload instance. - * @param {object} options.container The id of uploader container. - * @param {object} options.browser The id of button to trigger the file select. - * @param {object} options.dropzone The id of file drop target. - * @param {object} options.plupload An object of parameters to pass to the plupload instance. - * @param {object} options.params An object of parameters to pass to $_POST when uploading the file. - * Extends this.plupload.multipart_params under the hood. - */ - Uploader = function( options ) { - var self = this, - isIE = navigator.userAgent.indexOf('Trident/') != -1 || navigator.userAgent.indexOf('MSIE ') != -1, - elements = { - container: 'container', - browser: 'browse_button', - dropzone: 'drop_element' - }, - key, error; - - this.supports = { - upload: Uploader.browser.supported - }; - - this.supported = this.supports.upload; - - if ( ! this.supported ) { - return; - } - - // Arguments to send to pluplad.Uploader(). - // Use deep extend to ensure that multipart_params and other objects are cloned. - this.plupload = $.extend( true, { multipart_params: {} }, Uploader.defaults ); - this.container = document.body; // Set default container. - - // Extend the instance with options. - // - // Use deep extend to allow options.plupload to override individual - // default plupload keys. - $.extend( true, this, options ); - - // Proxy all methods so this always refers to the current instance. - for ( key in this ) { - if ( $.isFunction( this[ key ] ) ) { - this[ key ] = $.proxy( this[ key ], this ); - } - } - - // Ensure all elements are jQuery elements and have id attributes, - // then set the proper plupload arguments to the ids. - for ( key in elements ) { - if ( ! this[ key ] ) { - continue; - } - - this[ key ] = $( this[ key ] ).first(); - - if ( ! this[ key ].length ) { - delete this[ key ]; - continue; - } - - if ( ! this[ key ].prop('id') ) { - this[ key ].prop( 'id', '__wp-uploader-id-' + Uploader.uuid++ ); - } - - this.plupload[ elements[ key ] ] = this[ key ].prop('id'); - } - - // If the uploader has neither a browse button nor a dropzone, bail. - if ( ! ( this.browser && this.browser.length ) && ! ( this.dropzone && this.dropzone.length ) ) { - return; - } - - // Make sure flash sends cookies (seems in IE it does without switching to urlstream mode) - if ( ! isIE && 'flash' === plupload.predictRuntime( this.plupload ) && - ( ! this.plupload.required_features || ! this.plupload.required_features.hasOwnProperty( 'send_binary_string' ) ) ) { - - this.plupload.required_features = this.plupload.required_features || {}; - this.plupload.required_features.send_binary_string = true; - } - - // Initialize the plupload instance. - this.uploader = new plupload.Uploader( this.plupload ); - delete this.plupload; - - // Set default params and remove this.params alias. - this.param( this.params || {} ); - delete this.params; - - /** - * Custom error callback. - * - * Add a new error to the errors collection, so other modules can track - * and display errors. @see wp.Uploader.errors. - * - * @param {string} message - * @param {object} data - * @param {plupload.File} file File that was uploaded. - */ - error = function( message, data, file ) { - if ( file.attachment ) { - file.attachment.destroy(); - } - - Uploader.errors.unshift({ - message: message || pluploadL10n.default_error, - data: data, - file: file - }); - - self.error( message, data, file ); - }; - - /** - * After the Uploader has been initialized, initialize some behaviors for the dropzone. - * - * @param {plupload.Uploader} uploader Uploader instance. - */ - this.uploader.bind( 'init', function( uploader ) { - var timer, active, dragdrop, - dropzone = self.dropzone; - - dragdrop = self.supports.dragdrop = uploader.features.dragdrop && ! Uploader.browser.mobile; - - // Generate drag/drop helper classes. - if ( ! dropzone ) { - return; - } - - dropzone.toggleClass( 'supports-drag-drop', !! dragdrop ); - - if ( ! dragdrop ) { - return dropzone.unbind('.wp-uploader'); - } - - // 'dragenter' doesn't fire correctly, simulate it with a limited 'dragover'. - dropzone.bind( 'dragover.wp-uploader', function() { - if ( timer ) { - clearTimeout( timer ); - } - - if ( active ) { - return; - } - - dropzone.trigger('dropzone:enter').addClass('drag-over'); - active = true; - }); - - dropzone.bind('dragleave.wp-uploader, drop.wp-uploader', function() { - // Using an instant timer prevents the drag-over class from - // being quickly removed and re-added when elements inside the - // dropzone are repositioned. - // - // @see https://core.trac.wordpress.org/ticket/21705 - timer = setTimeout( function() { - active = false; - dropzone.trigger('dropzone:leave').removeClass('drag-over'); - }, 0 ); - }); - - self.ready = true; - $(self).trigger( 'uploader:ready' ); - }); - - this.uploader.bind( 'postinit', function( up ) { - up.refresh(); - self.init(); - }); - - this.uploader.init(); - - if ( this.browser ) { - this.browser.on( 'mouseenter', this.refresh ); - } else { - this.uploader.disableBrowse( true ); - // If HTML5 mode, hide the auto-created file container. - $('#' + this.uploader.id + '_html5_container').hide(); - } - - /** - * After files were filtered and added to the queue, create a model for each. - * - * @event FilesAdded - * @param {plupload.Uploader} uploader Uploader instance. - * @param {Array} files Array of file objects that were added to queue by the user. - */ - this.uploader.bind( 'FilesAdded', function( up, files ) { - _.each( files, function( file ) { - var attributes, image; - - // Ignore failed uploads. - if ( plupload.FAILED === file.status ) { - return; - } - - // Generate attributes for a new `Attachment` model. - attributes = _.extend({ - file: file, - uploading: true, - date: new Date(), - filename: file.name, - menuOrder: 0, - uploadedTo: wp.media.model.settings.post.id - }, _.pick( file, 'loaded', 'size', 'percent' ) ); - - // Handle early mime type scanning for images. - image = /(?:jpe?g|png|gif)$/i.exec( file.name ); - - // For images set the model's type and subtype attributes. - if ( image ) { - attributes.type = 'image'; - - // `jpeg`, `png` and `gif` are valid subtypes. - // `jpg` is not, so map it to `jpeg`. - attributes.subtype = ( 'jpg' === image[0] ) ? 'jpeg' : image[0]; - } - - // Create a model for the attachment, and add it to the Upload queue collection - // so listeners to the upload queue can track and display upload progress. - file.attachment = wp.media.model.Attachment.create( attributes ); - Uploader.queue.add( file.attachment ); - - self.added( file.attachment ); - }); - - up.refresh(); - up.start(); - }); - - this.uploader.bind( 'UploadProgress', function( up, file ) { - file.attachment.set( _.pick( file, 'loaded', 'percent' ) ); - self.progress( file.attachment ); - }); - - /** - * After a file is successfully uploaded, update its model. - * - * @param {plupload.Uploader} uploader Uploader instance. - * @param {plupload.File} file File that was uploaded. - * @param {Object} response Object with response properties. - * @return {mixed} - */ - this.uploader.bind( 'FileUploaded', function( up, file, response ) { - var complete; - - try { - response = JSON.parse( response.response ); - } catch ( e ) { - return error( pluploadL10n.default_error, e, file ); - } - - if ( ! _.isObject( response ) || _.isUndefined( response.success ) ) - return error( pluploadL10n.default_error, null, file ); - else if ( ! response.success ) - return error( response.data && response.data.message, response.data, file ); - - _.each(['file','loaded','size','percent'], function( key ) { - file.attachment.unset( key ); - }); - - file.attachment.set( _.extend( response.data, { uploading: false }) ); - wp.media.model.Attachment.get( response.data.id, file.attachment ); - - complete = Uploader.queue.all( function( attachment ) { - return ! attachment.get('uploading'); - }); - - if ( complete ) - Uploader.queue.reset(); - - self.success( file.attachment ); - }); - - /** - * When plupload surfaces an error, send it to the error handler. - * - * @param {plupload.Uploader} uploader Uploader instance. - * @param {Object} error Contains code, message and sometimes file and other details. - */ - this.uploader.bind( 'Error', function( up, pluploadError ) { - var message = pluploadL10n.default_error, - key; - - // Check for plupload errors. - for ( key in Uploader.errorMap ) { - if ( pluploadError.code === plupload[ key ] ) { - message = Uploader.errorMap[ key ]; - - if ( _.isFunction( message ) ) { - message = message( pluploadError.file, pluploadError ); - } - - break; - } - } - - error( message, pluploadError, pluploadError.file ); - up.refresh(); - }); - - }; - - // Adds the 'defaults' and 'browser' properties. - $.extend( Uploader, _wpPluploadSettings ); - - Uploader.uuid = 0; - - // Map Plupload error codes to user friendly error messages. - Uploader.errorMap = { - 'FAILED': pluploadL10n.upload_failed, - 'FILE_EXTENSION_ERROR': pluploadL10n.invalid_filetype, - 'IMAGE_FORMAT_ERROR': pluploadL10n.not_an_image, - 'IMAGE_MEMORY_ERROR': pluploadL10n.image_memory_exceeded, - 'IMAGE_DIMENSIONS_ERROR': pluploadL10n.image_dimensions_exceeded, - 'GENERIC_ERROR': pluploadL10n.upload_failed, - 'IO_ERROR': pluploadL10n.io_error, - 'HTTP_ERROR': pluploadL10n.http_error, - 'SECURITY_ERROR': pluploadL10n.security_error, - - 'FILE_SIZE_ERROR': function( file ) { - return pluploadL10n.file_exceeds_size_limit.replace('%s', file.name); - } - }; - - $.extend( Uploader.prototype, { - /** - * Acts as a shortcut to extending the uploader's multipart_params object. - * - * param( key ) - * Returns the value of the key. - * - * param( key, value ) - * Sets the value of a key. - * - * param( map ) - * Sets values for a map of data. - */ - param: function( key, value ) { - if ( arguments.length === 1 && typeof key === 'string' ) { - return this.uploader.settings.multipart_params[ key ]; - } - - if ( arguments.length > 1 ) { - this.uploader.settings.multipart_params[ key ] = value; - } else { - $.extend( this.uploader.settings.multipart_params, key ); - } - }, - - /** - * Make a few internal event callbacks available on the wp.Uploader object - * to change the Uploader internals if absolutely necessary. - */ - init: function() {}, - error: function() {}, - success: function() {}, - added: function() {}, - progress: function() {}, - complete: function() {}, - refresh: function() { - var node, attached, container, id; - - if ( this.browser ) { - node = this.browser[0]; - - // Check if the browser node is in the DOM. - while ( node ) { - if ( node === document.body ) { - attached = true; - break; - } - node = node.parentNode; - } - - // If the browser node is not attached to the DOM, use a - // temporary container to house it, as the browser button - // shims require the button to exist in the DOM at all times. - if ( ! attached ) { - id = 'wp-uploader-browser-' + this.uploader.id; - - container = $( '#' + id ); - if ( ! container.length ) { - container = $('

      ').css({ - position: 'fixed', - top: '-1000px', - left: '-1000px', - height: 0, - width: 0 - }).attr( 'id', 'wp-uploader-browser-' + this.uploader.id ).appendTo('body'); - } - - container.append( this.browser ); - } - } - - this.uploader.refresh(); - } - }); - - // Create a collection of attachments in the upload queue, - // so that other modules can track and display upload progress. - Uploader.queue = new wp.media.model.Attachments( [], { query: false }); - - // Create a collection to collect errors incurred while attempting upload. - Uploader.errors = new Backbone.Collection(); - - exports.Uploader = Uploader; -})( wp, jQuery ); diff --git a/wp/wp-includes/js/plupload/wp-plupload.min.js b/wp/wp-includes/js/plupload/wp-plupload.min.js deleted file mode 100644 index dd2f3e10..00000000 --- a/wp/wp-includes/js/plupload/wp-plupload.min.js +++ /dev/null @@ -1 +0,0 @@ -window.wp=window.wp||{},function(a,b){var c;"undefined"!=typeof _wpPluploadSettings&&(c=function(a){var d,e,f=this,g=navigator.userAgent.indexOf("Trident/")!=-1||navigator.userAgent.indexOf("MSIE ")!=-1,h={container:"container",browser:"browse_button",dropzone:"drop_element"};if(this.supports={upload:c.browser.supported},this.supported=this.supports.upload,this.supported){this.plupload=b.extend(!0,{multipart_params:{}},c.defaults),this.container=document.body,b.extend(!0,this,a);for(d in this)b.isFunction(this[d])&&(this[d]=b.proxy(this[d],this));for(d in h)this[d]&&(this[d]=b(this[d]).first(),this[d].length?(this[d].prop("id")||this[d].prop("id","__wp-uploader-id-"+c.uuid++),this.plupload[h[d]]=this[d].prop("id")):delete this[d]);(this.browser&&this.browser.length||this.dropzone&&this.dropzone.length)&&(g||"flash"!==plupload.predictRuntime(this.plupload)||this.plupload.required_features&&this.plupload.required_features.hasOwnProperty("send_binary_string")||(this.plupload.required_features=this.plupload.required_features||{},this.plupload.required_features.send_binary_string=!0),this.uploader=new plupload.Uploader(this.plupload),delete this.plupload,this.param(this.params||{}),delete this.params,e=function(a,b,d){d.attachment&&d.attachment.destroy(),c.errors.unshift({message:a||pluploadL10n.default_error,data:b,file:d}),f.error(a,b,d)},this.uploader.bind("init",function(a){var d,e,g,h=f.dropzone;if(g=f.supports.dragdrop=a.features.dragdrop&&!c.browser.mobile,h){if(h.toggleClass("supports-drag-drop",!!g),!g)return h.unbind(".wp-uploader");h.bind("dragover.wp-uploader",function(){d&&clearTimeout(d),e||(h.trigger("dropzone:enter").addClass("drag-over"),e=!0)}),h.bind("dragleave.wp-uploader, drop.wp-uploader",function(){d=setTimeout(function(){e=!1,h.trigger("dropzone:leave").removeClass("drag-over")},0)}),f.ready=!0,b(f).trigger("uploader:ready")}}),this.uploader.bind("postinit",function(a){a.refresh(),f.init()}),this.uploader.init(),this.browser?this.browser.on("mouseenter",this.refresh):(this.uploader.disableBrowse(!0),b("#"+this.uploader.id+"_html5_container").hide()),this.uploader.bind("FilesAdded",function(a,b){_.each(b,function(a){var b,d;plupload.FAILED!==a.status&&(b=_.extend({file:a,uploading:!0,date:new Date,filename:a.name,menuOrder:0,uploadedTo:wp.media.model.settings.post.id},_.pick(a,"loaded","size","percent")),d=/(?:jpe?g|png|gif)$/i.exec(a.name),d&&(b.type="image",b.subtype="jpg"===d[0]?"jpeg":d[0]),a.attachment=wp.media.model.Attachment.create(b),c.queue.add(a.attachment),f.added(a.attachment))}),a.refresh(),a.start()}),this.uploader.bind("UploadProgress",function(a,b){b.attachment.set(_.pick(b,"loaded","percent")),f.progress(b.attachment)}),this.uploader.bind("FileUploaded",function(a,b,d){var g;try{d=JSON.parse(d.response)}catch(h){return e(pluploadL10n.default_error,h,b)}return!_.isObject(d)||_.isUndefined(d.success)?e(pluploadL10n.default_error,null,b):d.success?(_.each(["file","loaded","size","percent"],function(a){b.attachment.unset(a)}),b.attachment.set(_.extend(d.data,{uploading:!1})),wp.media.model.Attachment.get(d.data.id,b.attachment),g=c.queue.all(function(a){return!a.get("uploading")}),g&&c.queue.reset(),void f.success(b.attachment)):e(d.data&&d.data.message,d.data,b)}),this.uploader.bind("Error",function(a,b){var d,f=pluploadL10n.default_error;for(d in c.errorMap)if(b.code===plupload[d]){f=c.errorMap[d],_.isFunction(f)&&(f=f(b.file,b));break}e(f,b,b.file),a.refresh()}))}},b.extend(c,_wpPluploadSettings),c.uuid=0,c.errorMap={FAILED:pluploadL10n.upload_failed,FILE_EXTENSION_ERROR:pluploadL10n.invalid_filetype,IMAGE_FORMAT_ERROR:pluploadL10n.not_an_image,IMAGE_MEMORY_ERROR:pluploadL10n.image_memory_exceeded,IMAGE_DIMENSIONS_ERROR:pluploadL10n.image_dimensions_exceeded,GENERIC_ERROR:pluploadL10n.upload_failed,IO_ERROR:pluploadL10n.io_error,HTTP_ERROR:pluploadL10n.http_error,SECURITY_ERROR:pluploadL10n.security_error,FILE_SIZE_ERROR:function(a){return pluploadL10n.file_exceeds_size_limit.replace("%s",a.name)}},b.extend(c.prototype,{param:function(a,c){return 1===arguments.length&&"string"==typeof a?this.uploader.settings.multipart_params[a]:void(arguments.length>1?this.uploader.settings.multipart_params[a]=c:b.extend(this.uploader.settings.multipart_params,a))},init:function(){},error:function(){},success:function(){},added:function(){},progress:function(){},complete:function(){},refresh:function(){var a,c,d,e;if(this.browser){for(a=this.browser[0];a;){if(a===document.body){c=!0;break}a=a.parentNode}c||(e="wp-uploader-browser-"+this.uploader.id,d=b("#"+e),d.length||(d=b('
      ').css({position:"fixed",top:"-1000px",left:"-1000px",height:0,width:0}).attr("id","wp-uploader-browser-"+this.uploader.id).appendTo("body")),d.append(this.browser))}this.uploader.refresh()}}),c.queue=new wp.media.model.Attachments([],{query:!1}),c.errors=new Backbone.Collection,a.Uploader=c)}(wp,jQuery); \ No newline at end of file diff --git a/wp/wp-includes/js/quicktags.js b/wp/wp-includes/js/quicktags.js deleted file mode 100644 index 6d00901a..00000000 --- a/wp/wp-includes/js/quicktags.js +++ /dev/null @@ -1,712 +0,0 @@ -/* global adminpage, wpActiveEditor, quicktagsL10n, wpLink, prompt */ -/* - * Quicktags - * - * This is the HTML editor in WordPress. It can be attached to any textarea and will - * append a toolbar above it. This script is self-contained (does not require external libraries). - * - * Run quicktags(settings) to initialize it, where settings is an object containing up to 3 properties: - * settings = { - * id : 'my_id', the HTML ID of the textarea, required - * buttons: '' Comma separated list of the names of the default buttons to show. Optional. - * Current list of default button names: 'strong,em,link,block,del,ins,img,ul,ol,li,code,more,close'; - * } - * - * The settings can also be a string quicktags_id. - * - * quicktags_id string The ID of the textarea that will be the editor canvas - * buttons string Comma separated list of the default buttons names that will be shown in that instance. - */ - -// new edit toolbar used with permission -// by Alex King -// http://www.alexking.org/ - -var QTags, edCanvas, - edButtons = []; - -/* jshint ignore:start */ - -/** - * Back-compat - * - * Define all former global functions so plugins that hack quicktags.js directly don't cause fatal errors. - */ -var edAddTag = function(){}, -edCheckOpenTags = function(){}, -edCloseAllTags = function(){}, -edInsertImage = function(){}, -edInsertLink = function(){}, -edInsertTag = function(){}, -edLink = function(){}, -edQuickLink = function(){}, -edRemoveTag = function(){}, -edShowButton = function(){}, -edShowLinks = function(){}, -edSpell = function(){}, -edToolbar = function(){}; - -/** - * Initialize new instance of the Quicktags editor - */ -function quicktags(settings) { - return new QTags(settings); -} - -/** - * Inserts content at the caret in the active editor (textarea) - * - * Added for back compatibility - * @see QTags.insertContent() - */ -function edInsertContent(bah, txt) { - return QTags.insertContent(txt); -} - -/** - * Adds a button to all instances of the editor - * - * Added for back compatibility, use QTags.addButton() as it gives more flexibility like type of button, button placement, etc. - * @see QTags.addButton() - */ -function edButton(id, display, tagStart, tagEnd, access) { - return QTags.addButton( id, display, tagStart, tagEnd, access, '', -1 ); -} - -/* jshint ignore:end */ - -(function(){ - // private stuff is prefixed with an underscore - var _domReady = function(func) { - var t, i, DOMContentLoaded, _tryReady; - - if ( typeof jQuery !== 'undefined' ) { - jQuery(document).ready(func); - } else { - t = _domReady; - t.funcs = []; - - t.ready = function() { - if ( ! t.isReady ) { - t.isReady = true; - for ( i = 0; i < t.funcs.length; i++ ) { - t.funcs[i](); - } - } - }; - - if ( t.isReady ) { - func(); - } else { - t.funcs.push(func); - } - - if ( ! t.eventAttached ) { - if ( document.addEventListener ) { - DOMContentLoaded = function(){document.removeEventListener('DOMContentLoaded', DOMContentLoaded, false);t.ready();}; - document.addEventListener('DOMContentLoaded', DOMContentLoaded, false); - window.addEventListener('load', t.ready, false); - } else if ( document.attachEvent ) { - DOMContentLoaded = function(){if (document.readyState === 'complete'){ document.detachEvent('onreadystatechange', DOMContentLoaded);t.ready();}}; - document.attachEvent('onreadystatechange', DOMContentLoaded); - window.attachEvent('onload', t.ready); - - _tryReady = function() { - try { - document.documentElement.doScroll('left'); - } catch(e) { - setTimeout(_tryReady, 50); - return; - } - - t.ready(); - }; - _tryReady(); - } - - t.eventAttached = true; - } - } - }, - - _datetime = (function() { - var now = new Date(), zeroise; - - zeroise = function(number) { - var str = number.toString(); - - if ( str.length < 2 ) { - str = '0' + str; - } - - return str; - }; - - return now.getUTCFullYear() + '-' + - zeroise( now.getUTCMonth() + 1 ) + '-' + - zeroise( now.getUTCDate() ) + 'T' + - zeroise( now.getUTCHours() ) + ':' + - zeroise( now.getUTCMinutes() ) + ':' + - zeroise( now.getUTCSeconds() ) + - '+00:00'; - })(), - qt; - - qt = QTags = function(settings) { - if ( typeof(settings) === 'string' ) { - settings = {id: settings}; - } else if ( typeof(settings) !== 'object' ) { - return false; - } - - var t = this, - id = settings.id, - canvas = document.getElementById(id), - name = 'qt_' + id, - tb, onclick, toolbar_id, wrap, setActiveEditor; - - if ( !id || !canvas ) { - return false; - } - - t.name = name; - t.id = id; - t.canvas = canvas; - t.settings = settings; - - if ( id === 'content' && typeof(adminpage) === 'string' && ( adminpage === 'post-new-php' || adminpage === 'post-php' ) ) { - // back compat hack :-( - edCanvas = canvas; - toolbar_id = 'ed_toolbar'; - } else { - toolbar_id = name + '_toolbar'; - } - - tb = document.getElementById( toolbar_id ); - - if ( ! tb ) { - tb = document.createElement('div'); - tb.id = toolbar_id; - tb.className = 'quicktags-toolbar'; - } - - canvas.parentNode.insertBefore(tb, canvas); - t.toolbar = tb; - - // listen for click events - onclick = function(e) { - e = e || window.event; - var target = e.target || e.srcElement, visible = target.clientWidth || target.offsetWidth, i; - - // don't call the callback on pressing the accesskey when the button is not visible - if ( !visible ) { - return; - } - - // as long as it has the class ed_button, execute the callback - if ( / ed_button /.test(' ' + target.className + ' ') ) { - // we have to reassign canvas here - t.canvas = canvas = document.getElementById(id); - i = target.id.replace(name + '_', ''); - - if ( t.theButtons[i] ) { - t.theButtons[i].callback.call(t.theButtons[i], target, canvas, t); - } - } - }; - - setActiveEditor = function() { - window.wpActiveEditor = id; - }; - - wrap = document.getElementById( 'wp-' + id + '-wrap' ); - - if ( tb.addEventListener ) { - tb.addEventListener( 'click', onclick, false ); - - if ( wrap ) { - wrap.addEventListener( 'click', setActiveEditor, false ); - } - } else if ( tb.attachEvent ) { - tb.attachEvent( 'onclick', onclick ); - - if ( wrap ) { - wrap.attachEvent( 'onclick', setActiveEditor ); - } - } - - t.getButton = function(id) { - return t.theButtons[id]; - }; - - t.getButtonElement = function(id) { - return document.getElementById(name + '_' + id); - }; - - qt.instances[id] = t; - - if ( ! qt.instances['0'] ) { - qt.instances['0'] = qt.instances[id]; - _domReady( function(){ qt._buttonsInit(); } ); - } - }; - - function _escape( text ) { - text = text || ''; - text = text.replace( /&([^#])(?![a-z1-4]{1,8};)/gi, '&$1' ); - return text.replace( //g, '>' ).replace( /"/g, '"' ).replace( /'/g, ''' ); - } - - qt.instances = {}; - - qt.getInstance = function(id) { - return qt.instances[id]; - }; - - qt._buttonsInit = function() { - var t = this, canvas, name, settings, theButtons, html, inst, ed, id, i, use, - defaults = ',strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,'; - - for ( inst in t.instances ) { - if ( '0' === inst ) { - continue; - } - - ed = t.instances[inst]; - canvas = ed.canvas; - name = ed.name; - settings = ed.settings; - html = ''; - theButtons = {}; - use = ''; - - // set buttons - if ( settings.buttons ) { - use = ','+settings.buttons+','; - } - - for ( i in edButtons ) { - if ( !edButtons[i] ) { - continue; - } - - id = edButtons[i].id; - if ( use && defaults.indexOf( ',' + id + ',' ) !== -1 && use.indexOf( ',' + id + ',' ) === -1 ) { - continue; - } - - if ( !edButtons[i].instance || edButtons[i].instance === inst ) { - theButtons[id] = edButtons[i]; - - if ( edButtons[i].html ) { - html += edButtons[i].html(name + '_'); - } - } - } - - if ( use && use.indexOf(',dfw,') !== -1 ) { - theButtons.dfw = new qt.DFWButton(); - html += theButtons.dfw.html( name + '_' ); - } - - if ( 'rtl' === document.getElementsByTagName('html')[0].dir ) { - theButtons.textdirection = new qt.TextDirectionButton(); - html += theButtons.textdirection.html(name + '_'); - } - - ed.toolbar.innerHTML = html; - ed.theButtons = theButtons; - - if ( typeof jQuery !== 'undefined' ) { - jQuery( document ).triggerHandler( 'quicktags-init', [ ed ] ); - } - } - t.buttonsInitDone = true; - }; - - /** - * Main API function for adding a button to Quicktags - * - * Adds qt.Button or qt.TagButton depending on the args. The first three args are always required. - * To be able to add button(s) to Quicktags, your script should be enqueued as dependent - * on "quicktags" and outputted in the footer. If you are echoing JS directly from PHP, - * use add_action( 'admin_print_footer_scripts', 'output_my_js', 100 ) or add_action( 'wp_footer', 'output_my_js', 100 ) - * - * Minimum required to add a button that calls an external function: - * QTags.addButton( 'my_id', 'my button', my_callback ); - * function my_callback() { alert('yeah!'); } - * - * Minimum required to add a button that inserts a tag: - * QTags.addButton( 'my_id', 'my button', '', '' ); - * QTags.addButton( 'my_id2', 'my button', '
      ' ); - * - * @param string id Required. Button HTML ID - * @param string display Required. Button's value="..." - * @param string|function arg1 Required. Either a starting tag to be inserted like "" or a callback that is executed when the button is clicked. - * @param string arg2 Optional. Ending tag like "" - * @param string access_key Deprecated Not used - * @param string title Optional. Button's title="..." - * @param int priority Optional. Number representing the desired position of the button in the toolbar. 1 - 9 = first, 11 - 19 = second, 21 - 29 = third, etc. - * @param string instance Optional. Limit the button to a specific instance of Quicktags, add to all instances if not present. - * @param attr object Optional. Used to pass additional attributes. Currently supports `ariaLabel` and `ariaLabelClose` (for "close tag" state) - * @return mixed null or the button object that is needed for back-compat. - */ - qt.addButton = function( id, display, arg1, arg2, access_key, title, priority, instance, attr ) { - var btn; - - if ( !id || !display ) { - return; - } - - priority = priority || 0; - arg2 = arg2 || ''; - attr = attr || {}; - - if ( typeof(arg1) === 'function' ) { - btn = new qt.Button( id, display, access_key, title, instance, attr ); - btn.callback = arg1; - } else if ( typeof(arg1) === 'string' ) { - btn = new qt.TagButton( id, display, arg1, arg2, access_key, title, instance, attr ); - } else { - return; - } - - if ( priority === -1 ) { // back-compat - return btn; - } - - if ( priority > 0 ) { - while ( typeof(edButtons[priority]) !== 'undefined' ) { - priority++; - } - - edButtons[priority] = btn; - } else { - edButtons[edButtons.length] = btn; - } - - if ( this.buttonsInitDone ) { - this._buttonsInit(); // add the button HTML to all instances toolbars if addButton() was called too late - } - }; - - qt.insertContent = function(content) { - var sel, startPos, endPos, scrollTop, text, canvas = document.getElementById(wpActiveEditor); - - if ( !canvas ) { - return false; - } - - if ( document.selection ) { //IE - canvas.focus(); - sel = document.selection.createRange(); - sel.text = content; - canvas.focus(); - } else if ( canvas.selectionStart || canvas.selectionStart === 0 ) { // FF, WebKit, Opera - text = canvas.value; - startPos = canvas.selectionStart; - endPos = canvas.selectionEnd; - scrollTop = canvas.scrollTop; - - canvas.value = text.substring(0, startPos) + content + text.substring(endPos, text.length); - - canvas.selectionStart = startPos + content.length; - canvas.selectionEnd = startPos + content.length; - canvas.scrollTop = scrollTop; - canvas.focus(); - } else { - canvas.value += content; - canvas.focus(); - } - return true; - }; - - // a plain, dumb button - qt.Button = function( id, display, access, title, instance, attr ) { - this.id = id; - this.display = display; - this.access = ''; - this.title = title || ''; - this.instance = instance || ''; - this.attr = attr || {}; - }; - qt.Button.prototype.html = function(idPrefix) { - var active, on, wp, - title = this.title ? ' title="' + _escape( this.title ) + '"' : '', - ariaLabel = this.attr && this.attr.ariaLabel ? ' aria-label="' + _escape( this.attr.ariaLabel ) + '"' : '', - val = this.display ? ' value="' + _escape( this.display ) + '"' : '', - id = this.id ? ' id="' + _escape( idPrefix + this.id ) + '"' : '', - dfw = ( wp = window.wp ) && wp.editor && wp.editor.dfw; - - if ( this.id === 'fullscreen' ) { - return ''; - } else if ( this.id === 'dfw' ) { - active = dfw && dfw.isActive() ? '' : ' disabled="disabled"'; - on = dfw && dfw.isOn() ? ' active' : ''; - - return ''; - } - - return ''; - }; - qt.Button.prototype.callback = function(){}; - - // a button that inserts HTML tag - qt.TagButton = function( id, display, tagStart, tagEnd, access, title, instance, attr ) { - var t = this; - qt.Button.call( t, id, display, access, title, instance, attr ); - t.tagStart = tagStart; - t.tagEnd = tagEnd; - }; - qt.TagButton.prototype = new qt.Button(); - qt.TagButton.prototype.openTag = function( element, ed ) { - if ( ! ed.openTags ) { - ed.openTags = []; - } - - if ( this.tagEnd ) { - ed.openTags.push( this.id ); - element.value = '/' + element.value; - - if ( this.attr.ariaLabelClose ) { - element.setAttribute( 'aria-label', this.attr.ariaLabelClose ); - } - } - }; - qt.TagButton.prototype.closeTag = function( element, ed ) { - var i = this.isOpen(ed); - - if ( i !== false ) { - ed.openTags.splice( i, 1 ); - } - - element.value = this.display; - - if ( this.attr.ariaLabel ) { - element.setAttribute( 'aria-label', this.attr.ariaLabel ); - } - }; - // whether a tag is open or not. Returns false if not open, or current open depth of the tag - qt.TagButton.prototype.isOpen = function (ed) { - var t = this, i = 0, ret = false; - if ( ed.openTags ) { - while ( ret === false && i < ed.openTags.length ) { - ret = ed.openTags[i] === t.id ? i : false; - i ++; - } - } else { - ret = false; - } - return ret; - }; - qt.TagButton.prototype.callback = function(element, canvas, ed) { - var t = this, startPos, endPos, cursorPos, scrollTop, v = canvas.value, l, r, i, sel, endTag = v ? t.tagEnd : ''; - - if ( document.selection ) { // IE - canvas.focus(); - sel = document.selection.createRange(); - if ( sel.text.length > 0 ) { - if ( !t.tagEnd ) { - sel.text = sel.text + t.tagStart; - } else { - sel.text = t.tagStart + sel.text + endTag; - } - } else { - if ( !t.tagEnd ) { - sel.text = t.tagStart; - } else if ( t.isOpen(ed) === false ) { - sel.text = t.tagStart; - t.openTag(element, ed); - } else { - sel.text = endTag; - t.closeTag(element, ed); - } - } - canvas.focus(); - } else if ( canvas.selectionStart || canvas.selectionStart === 0 ) { // FF, WebKit, Opera - startPos = canvas.selectionStart; - endPos = canvas.selectionEnd; - - if ( startPos < endPos && v.charAt( endPos - 1 ) === '\n' ) { - endPos -= 1; - } - - cursorPos = endPos; - scrollTop = canvas.scrollTop; - l = v.substring(0, startPos); // left of the selection - r = v.substring(endPos, v.length); // right of the selection - i = v.substring(startPos, endPos); // inside the selection - if ( startPos !== endPos ) { - if ( !t.tagEnd ) { - canvas.value = l + i + t.tagStart + r; // insert self closing tags after the selection - cursorPos += t.tagStart.length; - } else { - canvas.value = l + t.tagStart + i + endTag + r; - cursorPos += t.tagStart.length + endTag.length; - } - } else { - if ( !t.tagEnd ) { - canvas.value = l + t.tagStart + r; - cursorPos = startPos + t.tagStart.length; - } else if ( t.isOpen(ed) === false ) { - canvas.value = l + t.tagStart + r; - t.openTag(element, ed); - cursorPos = startPos + t.tagStart.length; - } else { - canvas.value = l + endTag + r; - cursorPos = startPos + endTag.length; - t.closeTag(element, ed); - } - } - - canvas.selectionStart = cursorPos; - canvas.selectionEnd = cursorPos; - canvas.scrollTop = scrollTop; - canvas.focus(); - } else { // other browsers? - if ( !endTag ) { - canvas.value += t.tagStart; - } else if ( t.isOpen(ed) !== false ) { - canvas.value += t.tagStart; - t.openTag(element, ed); - } else { - canvas.value += endTag; - t.closeTag(element, ed); - } - canvas.focus(); - } - }; - - // removed - qt.SpellButton = function() {}; - - // the close tags button - qt.CloseButton = function() { - qt.Button.call( this, 'close', quicktagsL10n.closeTags, '', quicktagsL10n.closeAllOpenTags ); - }; - - qt.CloseButton.prototype = new qt.Button(); - - qt._close = function(e, c, ed) { - var button, element, tbo = ed.openTags; - - if ( tbo ) { - while ( tbo.length > 0 ) { - button = ed.getButton(tbo[tbo.length - 1]); - element = document.getElementById(ed.name + '_' + button.id); - - if ( e ) { - button.callback.call(button, element, c, ed); - } else { - button.closeTag(element, ed); - } - } - } - }; - - qt.CloseButton.prototype.callback = qt._close; - - qt.closeAllTags = function(editor_id) { - var ed = this.getInstance(editor_id); - qt._close('', ed.canvas, ed); - }; - - // the link button - qt.LinkButton = function() { - var attr = { - ariaLabel: quicktagsL10n.link - }; - - qt.TagButton.call( this, 'link', 'link', '', '
      ', '', '', '', attr ); - }; - qt.LinkButton.prototype = new qt.TagButton(); - qt.LinkButton.prototype.callback = function(e, c, ed, defaultValue) { - var URL, t = this; - - if ( typeof wpLink !== 'undefined' ) { - wpLink.open( ed.id ); - return; - } - - if ( ! defaultValue ) { - defaultValue = 'http://'; - } - - if ( t.isOpen(ed) === false ) { - URL = prompt( quicktagsL10n.enterURL, defaultValue ); - if ( URL ) { - t.tagStart = ''; - qt.TagButton.prototype.callback.call(t, e, c, ed); - } - } else { - qt.TagButton.prototype.callback.call(t, e, c, ed); - } - }; - - // the img button - qt.ImgButton = function() { - var attr = { - ariaLabel: quicktagsL10n.image - }; - - qt.TagButton.call( this, 'img', 'img', '', '', '', '', '', attr ); - }; - qt.ImgButton.prototype = new qt.TagButton(); - qt.ImgButton.prototype.callback = function(e, c, ed, defaultValue) { - if ( ! defaultValue ) { - defaultValue = 'http://'; - } - var src = prompt(quicktagsL10n.enterImageURL, defaultValue), alt; - if ( src ) { - alt = prompt(quicktagsL10n.enterImageDescription, ''); - this.tagStart = '' + alt + ''; - qt.TagButton.prototype.callback.call(this, e, c, ed); - } - }; - - qt.DFWButton = function() { - qt.Button.call( this, 'dfw', '', 'f', quicktagsL10n.dfw ); - }; - qt.DFWButton.prototype = new qt.Button(); - qt.DFWButton.prototype.callback = function() { - var wp; - - if ( ! ( wp = window.wp ) || ! wp.editor || ! wp.editor.dfw ) { - return; - } - - window.wp.editor.dfw.toggle(); - }; - - qt.TextDirectionButton = function() { - qt.Button.call( this, 'textdirection', quicktagsL10n.textdirection, '', quicktagsL10n.toggleTextdirection ); - }; - qt.TextDirectionButton.prototype = new qt.Button(); - qt.TextDirectionButton.prototype.callback = function(e, c) { - var isRTL = ( 'rtl' === document.getElementsByTagName('html')[0].dir ), - currentDirection = c.style.direction; - - if ( ! currentDirection ) { - currentDirection = ( isRTL ) ? 'rtl' : 'ltr'; - } - - c.style.direction = ( 'rtl' === currentDirection ) ? 'ltr' : 'rtl'; - c.focus(); - }; - - // ensure backward compatibility - edButtons[10] = new qt.TagButton( 'strong', 'b', '', '', '', '', '', { ariaLabel: quicktagsL10n.strong, ariaLabelClose: quicktagsL10n.strongClose } ); - edButtons[20] = new qt.TagButton( 'em', 'i', '', '', '', '', '', { ariaLabel: quicktagsL10n.em, ariaLabelClose: quicktagsL10n.emClose } ); - edButtons[30] = new qt.LinkButton(); // special case - edButtons[40] = new qt.TagButton( 'block', 'b-quote', '\n\n
      ', '
      \n\n', '', '', '', { ariaLabel: quicktagsL10n.blockquote, ariaLabelClose: quicktagsL10n.blockquoteClose } ); - edButtons[50] = new qt.TagButton( 'del', 'del', '', '', '', '', '', { ariaLabel: quicktagsL10n.del, ariaLabelClose: quicktagsL10n.delClose } ); - edButtons[60] = new qt.TagButton( 'ins', 'ins', '', '', '', '', '', { ariaLabel: quicktagsL10n.ins, ariaLabelClose: quicktagsL10n.insClose } ); - edButtons[70] = new qt.ImgButton(); // special case - edButtons[80] = new qt.TagButton( 'ul', 'ul', '
        \n', '
      \n\n', '', '', '', { ariaLabel: quicktagsL10n.ul, ariaLabelClose: quicktagsL10n.ulClose } ); - edButtons[90] = new qt.TagButton( 'ol', 'ol', '
        \n', '
      \n\n', '', '', '', { ariaLabel: quicktagsL10n.ol, ariaLabelClose: quicktagsL10n.olClose } ); - edButtons[100] = new qt.TagButton( 'li', 'li', '\t
    18. ', '
    19. \n', '', '', '', { ariaLabel: quicktagsL10n.li, ariaLabelClose: quicktagsL10n.liClose } ); - edButtons[110] = new qt.TagButton( 'code', 'code', '', '', '', '', '', { ariaLabel: quicktagsL10n.code, ariaLabelClose: quicktagsL10n.codeClose } ); - edButtons[120] = new qt.TagButton( 'more', 'more', '\n\n', '', '', '', '', { ariaLabel: quicktagsL10n.more } ); - edButtons[140] = new qt.CloseButton(); - -})(); diff --git a/wp/wp-includes/js/quicktags.min.js b/wp/wp-includes/js/quicktags.min.js deleted file mode 100644 index dd896c91..00000000 --- a/wp/wp-includes/js/quicktags.min.js +++ /dev/null @@ -1 +0,0 @@ -function quicktags(a){return new QTags(a)}function edInsertContent(a,b){return QTags.insertContent(b)}function edButton(a,b,c,d,e){return QTags.addButton(a,b,c,d,e,"",-1)}var QTags,edCanvas,edButtons=[],edAddTag=function(){},edCheckOpenTags=function(){},edCloseAllTags=function(){},edInsertImage=function(){},edInsertLink=function(){},edInsertTag=function(){},edLink=function(){},edQuickLink=function(){},edRemoveTag=function(){},edShowButton=function(){},edShowLinks=function(){},edSpell=function(){},edToolbar=function(){};!function(){function a(a){return a=a||"",a=a.replace(/&([^#])(?![a-z1-4]{1,8};)/gi,"&$1"),a.replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}var b,c=function(a){var b,d,e,f;"undefined"!=typeof jQuery?jQuery(document).ready(a):(b=c,b.funcs=[],b.ready=function(){if(!b.isReady)for(b.isReady=!0,d=0;d0){for(;"undefined"!=typeof edButtons[h];)h++;edButtons[h]=k}else edButtons[edButtons.length]=k;this.buttonsInitDone&&this._buttonsInit()}},b.insertContent=function(a){var b,c,d,e,f,g=document.getElementById(wpActiveEditor);return!!g&&(document.selection?(g.focus(),b=document.selection.createRange(),b.text=a,g.focus()):g.selectionStart||0===g.selectionStart?(f=g.value,c=g.selectionStart,d=g.selectionEnd,e=g.scrollTop,g.value=f.substring(0,c)+a+f.substring(d,f.length),g.selectionStart=c+a.length,g.selectionEnd=c+a.length,g.scrollTop=e,g.focus()):(g.value+=a,g.focus()),!0)},b.Button=function(a,b,c,d,e,f){this.id=a,this.display=b,this.access="",this.title=d||"",this.instance=e||"",this.attr=f||{}},b.Button.prototype.html=function(b){var c,d,e,f=this.title?' title="'+a(this.title)+'"':"",g=this.attr&&this.attr.ariaLabel?' aria-label="'+a(this.attr.ariaLabel)+'"':"",h=this.display?' value="'+a(this.display)+'"':"",i=this.id?' id="'+a(b+this.id)+'"':"",j=(e=window.wp)&&e.editor&&e.editor.dfw;return"fullscreen"===this.id?'":"dfw"===this.id?(c=j&&j.isActive()?"":' disabled="disabled"',d=j&&j.isOn()?" active":"",'"):'"},b.Button.prototype.callback=function(){},b.TagButton=function(a,c,d,e,f,g,h,i){var j=this;b.Button.call(j,a,c,f,g,h,i),j.tagStart=d,j.tagEnd=e},b.TagButton.prototype=new b.Button,b.TagButton.prototype.openTag=function(a,b){b.openTags||(b.openTags=[]),this.tagEnd&&(b.openTags.push(this.id),a.value="/"+a.value,this.attr.ariaLabelClose&&a.setAttribute("aria-label",this.attr.ariaLabelClose))},b.TagButton.prototype.closeTag=function(a,b){var c=this.isOpen(b);c!==!1&&b.openTags.splice(c,1),a.value=this.display,this.attr.ariaLabel&&a.setAttribute("aria-label",this.attr.ariaLabel)},b.TagButton.prototype.isOpen=function(a){var b=this,c=0,d=!1;if(a.openTags)for(;d===!1&&c0?l.tagEnd?k.text=l.tagStart+k.text+n:k.text=k.text+l.tagStart:l.tagEnd?l.isOpen(c)===!1?(k.text=l.tagStart,l.openTag(a,c)):(k.text=n,l.closeTag(a,c)):k.text=l.tagStart,b.focus()):b.selectionStart||0===b.selectionStart?(d=b.selectionStart,e=b.selectionEnd,d0;)d=c.getButton(f[f.length-1]),e=document.getElementById(c.name+"_"+d.id),a?d.callback.call(d,e,b,c):d.closeTag(e,c)},b.CloseButton.prototype.callback=b._close,b.closeAllTags=function(a){var c=this.getInstance(a);b._close("",c.canvas,c)},b.LinkButton=function(){var a={ariaLabel:quicktagsL10n.link};b.TagButton.call(this,"link","link","","
      ","","","",a)},b.LinkButton.prototype=new b.TagButton,b.LinkButton.prototype.callback=function(a,c,d,e){var f,g=this;return"undefined"!=typeof wpLink?void wpLink.open(d.id):(e||(e="http://"),void(g.isOpen(d)===!1?(f=prompt(quicktagsL10n.enterURL,e),f&&(g.tagStart='',b.TagButton.prototype.callback.call(g,a,c,d))):b.TagButton.prototype.callback.call(g,a,c,d)))},b.ImgButton=function(){var a={ariaLabel:quicktagsL10n.image};b.TagButton.call(this,"img","img","","","","","",a)},b.ImgButton.prototype=new b.TagButton,b.ImgButton.prototype.callback=function(a,c,d,e){e||(e="http://");var f,g=prompt(quicktagsL10n.enterImageURL,e);g&&(f=prompt(quicktagsL10n.enterImageDescription,""),this.tagStart=''+f+'',b.TagButton.prototype.callback.call(this,a,c,d))},b.DFWButton=function(){b.Button.call(this,"dfw","","f",quicktagsL10n.dfw)},b.DFWButton.prototype=new b.Button,b.DFWButton.prototype.callback=function(){var a;(a=window.wp)&&a.editor&&a.editor.dfw&&window.wp.editor.dfw.toggle()},b.TextDirectionButton=function(){b.Button.call(this,"textdirection",quicktagsL10n.textdirection,"",quicktagsL10n.toggleTextdirection)},b.TextDirectionButton.prototype=new b.Button,b.TextDirectionButton.prototype.callback=function(a,b){var c="rtl"===document.getElementsByTagName("html")[0].dir,d=b.style.direction;d||(d=c?"rtl":"ltr"),b.style.direction="rtl"===d?"ltr":"rtl",b.focus()},edButtons[10]=new b.TagButton("strong","b","","","","","",{ariaLabel:quicktagsL10n.strong,ariaLabelClose:quicktagsL10n.strongClose}),edButtons[20]=new b.TagButton("em","i","","","","","",{ariaLabel:quicktagsL10n.em,ariaLabelClose:quicktagsL10n.emClose}),edButtons[30]=new b.LinkButton,edButtons[40]=new b.TagButton("block","b-quote","\n\n
      ","
      \n\n","","","",{ariaLabel:quicktagsL10n.blockquote,ariaLabelClose:quicktagsL10n.blockquoteClose}),edButtons[50]=new b.TagButton("del","del",'',"","","","",{ariaLabel:quicktagsL10n.del,ariaLabelClose:quicktagsL10n.delClose}),edButtons[60]=new b.TagButton("ins","ins",'',"","","","",{ariaLabel:quicktagsL10n.ins,ariaLabelClose:quicktagsL10n.insClose}),edButtons[70]=new b.ImgButton,edButtons[80]=new b.TagButton("ul","ul","
        \n","
      \n\n","","","",{ariaLabel:quicktagsL10n.ul,ariaLabelClose:quicktagsL10n.ulClose}),edButtons[90]=new b.TagButton("ol","ol","
        \n","
      \n\n","","","",{ariaLabel:quicktagsL10n.ol,ariaLabelClose:quicktagsL10n.olClose}),edButtons[100]=new b.TagButton("li","li","\t
    20. ","
    21. \n","","","",{ariaLabel:quicktagsL10n.li,ariaLabelClose:quicktagsL10n.liClose}),edButtons[110]=new b.TagButton("code","code","","","","","",{ariaLabel:quicktagsL10n.code,ariaLabelClose:quicktagsL10n.codeClose}),edButtons[120]=new b.TagButton("more","more","\n\n","","","","",{ariaLabel:quicktagsL10n.more}),edButtons[140]=new b.CloseButton}(); \ No newline at end of file diff --git a/wp/wp-includes/js/shortcode.js b/wp/wp-includes/js/shortcode.js deleted file mode 100644 index 79423eec..00000000 --- a/wp/wp-includes/js/shortcode.js +++ /dev/null @@ -1,351 +0,0 @@ -// Utility functions for parsing and handling shortcodes in JavaScript. - -// Ensure the global `wp` object exists. -window.wp = window.wp || {}; - -(function(){ - wp.shortcode = { - // ### Find the next matching shortcode - // - // Given a shortcode `tag`, a block of `text`, and an optional starting - // `index`, returns the next matching shortcode or `undefined`. - // - // Shortcodes are formatted as an object that contains the match - // `content`, the matching `index`, and the parsed `shortcode` object. - next: function( tag, text, index ) { - var re = wp.shortcode.regexp( tag ), - match, result; - - re.lastIndex = index || 0; - match = re.exec( text ); - - if ( ! match ) { - return; - } - - // If we matched an escaped shortcode, try again. - if ( '[' === match[1] && ']' === match[7] ) { - return wp.shortcode.next( tag, text, re.lastIndex ); - } - - result = { - index: match.index, - content: match[0], - shortcode: wp.shortcode.fromMatch( match ) - }; - - // If we matched a leading `[`, strip it from the match - // and increment the index accordingly. - if ( match[1] ) { - result.content = result.content.slice( 1 ); - result.index++; - } - - // If we matched a trailing `]`, strip it from the match. - if ( match[7] ) { - result.content = result.content.slice( 0, -1 ); - } - - return result; - }, - - // ### Replace matching shortcodes in a block of text - // - // Accepts a shortcode `tag`, content `text` to scan, and a `callback` - // to process the shortcode matches and return a replacement string. - // Returns the `text` with all shortcodes replaced. - // - // Shortcode matches are objects that contain the shortcode `tag`, - // a shortcode `attrs` object, the `content` between shortcode tags, - // and a boolean flag to indicate if the match was a `single` tag. - replace: function( tag, text, callback ) { - return text.replace( wp.shortcode.regexp( tag ), function( match, left, tag, attrs, slash, content, closing, right ) { - // If both extra brackets exist, the shortcode has been - // properly escaped. - if ( left === '[' && right === ']' ) { - return match; - } - - // Create the match object and pass it through the callback. - var result = callback( wp.shortcode.fromMatch( arguments ) ); - - // Make sure to return any of the extra brackets if they - // weren't used to escape the shortcode. - return result ? left + result + right : match; - }); - }, - - // ### Generate a string from shortcode parameters - // - // Creates a `wp.shortcode` instance and returns a string. - // - // Accepts the same `options` as the `wp.shortcode()` constructor, - // containing a `tag` string, a string or object of `attrs`, a boolean - // indicating whether to format the shortcode using a `single` tag, and a - // `content` string. - string: function( options ) { - return new wp.shortcode( options ).string(); - }, - - // ### Generate a RegExp to identify a shortcode - // - // The base regex is functionally equivalent to the one found in - // `get_shortcode_regex()` in `wp-includes/shortcodes.php`. - // - // Capture groups: - // - // 1. An extra `[` to allow for escaping shortcodes with double `[[]]` - // 2. The shortcode name - // 3. The shortcode argument list - // 4. The self closing `/` - // 5. The content of a shortcode when it wraps some content. - // 6. The closing tag. - // 7. An extra `]` to allow for escaping shortcodes with double `[[]]` - regexp: _.memoize( function( tag ) { - return new RegExp( '\\[(\\[?)(' + tag + ')(?![\\w-])([^\\]\\/]*(?:\\/(?!\\])[^\\]\\/]*)*?)(?:(\\/)\\]|\\](?:([^\\[]*(?:\\[(?!\\/\\2\\])[^\\[]*)*)(\\[\\/\\2\\]))?)(\\]?)', 'g' ); - }), - - - // ### Parse shortcode attributes - // - // Shortcodes accept many types of attributes. These can chiefly be - // divided into named and numeric attributes: - // - // Named attributes are assigned on a key/value basis, while numeric - // attributes are treated as an array. - // - // Named attributes can be formatted as either `name="value"`, - // `name='value'`, or `name=value`. Numeric attributes can be formatted - // as `"value"` or just `value`. - attrs: _.memoize( function( text ) { - var named = {}, - numeric = [], - pattern, match; - - // This regular expression is reused from `shortcode_parse_atts()` - // in `wp-includes/shortcodes.php`. - // - // Capture groups: - // - // 1. An attribute name, that corresponds to... - // 2. a value in double quotes. - // 3. An attribute name, that corresponds to... - // 4. a value in single quotes. - // 5. An attribute name, that corresponds to... - // 6. an unquoted value. - // 7. A numeric attribute in double quotes. - // 8. An unquoted numeric attribute. - pattern = /([\w-]+)\s*=\s*"([^"]*)"(?:\s|$)|([\w-]+)\s*=\s*'([^']*)'(?:\s|$)|([\w-]+)\s*=\s*([^\s'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|(\S+)(?:\s|$)/g; - - // Map zero-width spaces to actual spaces. - text = text.replace( /[\u00a0\u200b]/g, ' ' ); - - // Match and normalize attributes. - while ( (match = pattern.exec( text )) ) { - if ( match[1] ) { - named[ match[1].toLowerCase() ] = match[2]; - } else if ( match[3] ) { - named[ match[3].toLowerCase() ] = match[4]; - } else if ( match[5] ) { - named[ match[5].toLowerCase() ] = match[6]; - } else if ( match[7] ) { - numeric.push( match[7] ); - } else if ( match[8] ) { - numeric.push( match[8] ); - } - } - - return { - named: named, - numeric: numeric - }; - }), - - // ### Generate a Shortcode Object from a RegExp match - // Accepts a `match` object from calling `regexp.exec()` on a `RegExp` - // generated by `wp.shortcode.regexp()`. `match` can also be set to the - // `arguments` from a callback passed to `regexp.replace()`. - fromMatch: function( match ) { - var type; - - if ( match[4] ) { - type = 'self-closing'; - } else if ( match[6] ) { - type = 'closed'; - } else { - type = 'single'; - } - - return new wp.shortcode({ - tag: match[2], - attrs: match[3], - type: type, - content: match[5] - }); - } - }; - - - // Shortcode Objects - // ----------------- - // - // Shortcode objects are generated automatically when using the main - // `wp.shortcode` methods: `next()`, `replace()`, and `string()`. - // - // To access a raw representation of a shortcode, pass an `options` object, - // containing a `tag` string, a string or object of `attrs`, a string - // indicating the `type` of the shortcode ('single', 'self-closing', or - // 'closed'), and a `content` string. - wp.shortcode = _.extend( function( options ) { - _.extend( this, _.pick( options || {}, 'tag', 'attrs', 'type', 'content' ) ); - - var attrs = this.attrs; - - // Ensure we have a correctly formatted `attrs` object. - this.attrs = { - named: {}, - numeric: [] - }; - - if ( ! attrs ) { - return; - } - - // Parse a string of attributes. - if ( _.isString( attrs ) ) { - this.attrs = wp.shortcode.attrs( attrs ); - - // Identify a correctly formatted `attrs` object. - } else if ( _.isEqual( _.keys( attrs ), [ 'named', 'numeric' ] ) ) { - this.attrs = attrs; - - // Handle a flat object of attributes. - } else { - _.each( options.attrs, function( value, key ) { - this.set( key, value ); - }, this ); - } - }, wp.shortcode ); - - _.extend( wp.shortcode.prototype, { - // ### Get a shortcode attribute - // - // Automatically detects whether `attr` is named or numeric and routes - // it accordingly. - get: function( attr ) { - return this.attrs[ _.isNumber( attr ) ? 'numeric' : 'named' ][ attr ]; - }, - - // ### Set a shortcode attribute - // - // Automatically detects whether `attr` is named or numeric and routes - // it accordingly. - set: function( attr, value ) { - this.attrs[ _.isNumber( attr ) ? 'numeric' : 'named' ][ attr ] = value; - return this; - }, - - // ### Transform the shortcode match into a string - string: function() { - var text = '[' + this.tag; - - _.each( this.attrs.numeric, function( value ) { - if ( /\s/.test( value ) ) { - text += ' "' + value + '"'; - } else { - text += ' ' + value; - } - }); - - _.each( this.attrs.named, function( value, name ) { - text += ' ' + name + '="' + value + '"'; - }); - - // If the tag is marked as `single` or `self-closing`, close the - // tag and ignore any additional content. - if ( 'single' === this.type ) { - return text + ']'; - } else if ( 'self-closing' === this.type ) { - return text + ' /]'; - } - - // Complete the opening tag. - text += ']'; - - if ( this.content ) { - text += this.content; - } - - // Add the closing tag. - return text + '[/' + this.tag + ']'; - } - }); -}()); - -// HTML utility functions -// ---------------------- -// -// Experimental. These functions may change or be removed in the future. -(function(){ - wp.html = _.extend( wp.html || {}, { - // ### Parse HTML attributes. - // - // Converts `content` to a set of parsed HTML attributes. - // Utilizes `wp.shortcode.attrs( content )`, which is a valid superset of - // the HTML attribute specification. Reformats the attributes into an - // object that contains the `attrs` with `key:value` mapping, and a record - // of the attributes that were entered using `empty` attribute syntax (i.e. - // with no value). - attrs: function( content ) { - var result, attrs; - - // If `content` ends in a slash, strip it. - if ( '/' === content[ content.length - 1 ] ) { - content = content.slice( 0, -1 ); - } - - result = wp.shortcode.attrs( content ); - attrs = result.named; - - _.each( result.numeric, function( key ) { - if ( /\s/.test( key ) ) { - return; - } - - attrs[ key ] = ''; - }); - - return attrs; - }, - - // ### Convert an HTML-representation of an object to a string. - string: function( options ) { - var text = '<' + options.tag, - content = options.content || ''; - - _.each( options.attrs, function( value, attr ) { - text += ' ' + attr; - - // Convert boolean values to strings. - if ( _.isBoolean( value ) ) { - value = value ? 'true' : 'false'; - } - - text += '="' + value + '"'; - }); - - // Return the result if it is a self-closing tag. - if ( options.single ) { - return text + ' />'; - } - - // Complete the opening tag. - text += '>'; - - // If `content` is an object, recursively call this function. - text += _.isObject( content ) ? wp.html.string( content ) : content; - - return text + ''; - } - }); -}()); diff --git a/wp/wp-includes/js/shortcode.min.js b/wp/wp-includes/js/shortcode.min.js deleted file mode 100644 index 110580cc..00000000 --- a/wp/wp-includes/js/shortcode.min.js +++ /dev/null @@ -1 +0,0 @@ -window.wp=window.wp||{},function(){wp.shortcode={next:function(a,b,c){var d,e,f=wp.shortcode.regexp(a);if(f.lastIndex=c||0,d=f.exec(b))return"["===d[1]&&"]"===d[7]?wp.shortcode.next(a,b,f.lastIndex):(e={index:d.index,content:d[0],shortcode:wp.shortcode.fromMatch(d)},d[1]&&(e.content=e.content.slice(1),e.index++),d[7]&&(e.content=e.content.slice(0,-1)),e)},replace:function(a,b,c){return b.replace(wp.shortcode.regexp(a),function(a,b,d,e,f,g,h,i){if("["===b&&"]"===i)return a;var j=c(wp.shortcode.fromMatch(arguments));return j?b+j+i:a})},string:function(a){return new wp.shortcode(a).string()},regexp:_.memoize(function(a){return new RegExp("\\[(\\[?)("+a+")(?![\\w-])([^\\]\\/]*(?:\\/(?!\\])[^\\]\\/]*)*?)(?:(\\/)\\]|\\](?:([^\\[]*(?:\\[(?!\\/\\2\\])[^\\[]*)*)(\\[\\/\\2\\]))?)(\\]?)","g")}),attrs:_.memoize(function(a){var b,c,d={},e=[];for(b=/([\w-]+)\s*=\s*"([^"]*)"(?:\s|$)|([\w-]+)\s*=\s*'([^']*)'(?:\s|$)|([\w-]+)\s*=\s*([^\s'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|(\S+)(?:\s|$)/g,a=a.replace(/[\u00a0\u200b]/g," ");c=b.exec(a);)c[1]?d[c[1].toLowerCase()]=c[2]:c[3]?d[c[3].toLowerCase()]=c[4]:c[5]?d[c[5].toLowerCase()]=c[6]:c[7]?e.push(c[7]):c[8]&&e.push(c[8]);return{named:d,numeric:e}}),fromMatch:function(a){var b;return b=a[4]?"self-closing":a[6]?"closed":"single",new wp.shortcode({tag:a[2],attrs:a[3],type:b,content:a[5]})}},wp.shortcode=_.extend(function(a){_.extend(this,_.pick(a||{},"tag","attrs","type","content"));var b=this.attrs;this.attrs={named:{},numeric:[]},b&&(_.isString(b)?this.attrs=wp.shortcode.attrs(b):_.isEqual(_.keys(b),["named","numeric"])?this.attrs=b:_.each(a.attrs,function(a,b){this.set(b,a)},this))},wp.shortcode),_.extend(wp.shortcode.prototype,{get:function(a){return this.attrs[_.isNumber(a)?"numeric":"named"][a]},set:function(a,b){return this.attrs[_.isNumber(a)?"numeric":"named"][a]=b,this},string:function(){var a="["+this.tag;return _.each(this.attrs.numeric,function(b){a+=/\s/.test(b)?' "'+b+'"':" "+b}),_.each(this.attrs.named,function(b,c){a+=" "+c+'="'+b+'"'}),"single"===this.type?a+"]":"self-closing"===this.type?a+" /]":(a+="]",this.content&&(a+=this.content),a+"[/"+this.tag+"]")}})}(),function(){wp.html=_.extend(wp.html||{},{attrs:function(a){var b,c;return"/"===a[a.length-1]&&(a=a.slice(0,-1)),b=wp.shortcode.attrs(a),c=b.named,_.each(b.numeric,function(a){/\s/.test(a)||(c[a]="")}),c},string:function(a){var b="<"+a.tag,c=a.content||"";return _.each(a.attrs,function(a,c){b+=" "+c,_.isBoolean(a)&&(a=a?"true":"false"),b+='="'+a+'"'}),a.single?b+" />":(b+=">",b+=_.isObject(c)?wp.html.string(c):c,b+"")}})}(); \ No newline at end of file diff --git a/wp/wp-includes/js/swfobject.js b/wp/wp-includes/js/swfobject.js deleted file mode 100644 index 87e61553..00000000 --- a/wp/wp-includes/js/swfobject.js +++ /dev/null @@ -1,4 +0,0 @@ -/* SWFObject v2.2 - is released under the MIT License -*/ -var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y0){for(var af=0;af0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad'}}aa.outerHTML='"+af+"";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab 0 ) { - jQuery('.describe-toggle-on').show(); - jQuery('.describe-toggle-off').hide(); - jQuery('.slidetoggle').slideUp(200).siblings().removeClass('hidden'); - } - // Create a progress bar containing the filename - jQuery('
      ') - .attr( 'id', 'media-item-' + fileObj.id ) - .addClass('child-of-' + post_id) - .append('
      ', - jQuery('
      ').text( ' ' + fileObj.name )) - .appendTo( jQuery('#media-items' ) ); - // Display the progress div - jQuery('.progress', '#media-item-' + fileObj.id).show(); - - // Disable submit and enable cancel - jQuery('#insert-gallery').prop('disabled', true); - jQuery('#cancel-upload').prop('disabled', false); -} - -function uploadStart(fileObj) { - try { - if ( typeof topWin.tb_remove != 'undefined' ) - topWin.jQuery('#TB_overlay').unbind('click', topWin.tb_remove); - } catch(e){} - - return true; -} - -function uploadProgress(fileObj, bytesDone, bytesTotal) { - // Lengthen the progress bar - var w = jQuery('#media-items').width() - 2, item = jQuery('#media-item-' + fileObj.id); - jQuery('.bar', item).width( w * bytesDone / bytesTotal ); - jQuery('.percent', item).html( Math.ceil(bytesDone / bytesTotal * 100) + '%' ); - - if ( bytesDone == bytesTotal ) - jQuery('.bar', item).html('' + swfuploadL10n.crunching + ''); -} - -function prepareMediaItem(fileObj, serverData) { - var f = ( typeof shortform == 'undefined' ) ? 1 : 2, item = jQuery('#media-item-' + fileObj.id); - // Move the progress bar to 100% - jQuery('.bar', item).remove(); - jQuery('.progress', item).hide(); - - try { - if ( typeof topWin.tb_remove != 'undefined' ) - topWin.jQuery('#TB_overlay').click(topWin.tb_remove); - } catch(e){} - - // Old style: Append the HTML returned by the server -- thumbnail and form inputs - if ( isNaN(serverData) || !serverData ) { - item.append(serverData); - prepareMediaItemInit(fileObj); - } - // New style: server data is just the attachment ID, fetch the thumbnail and form html from the server - else { - item.load('async-upload.php', {attachment_id:serverData, fetch:f}, function(){prepareMediaItemInit(fileObj);updateMediaForm()}); - } -} - -function prepareMediaItemInit(fileObj) { - var item = jQuery('#media-item-' + fileObj.id); - // Clone the thumbnail as a "pinkynail" -- a tiny image to the left of the filename - jQuery('.thumbnail', item).clone().attr('class', 'pinkynail toggle').prependTo(item); - - // Replace the original filename with the new (unique) one assigned during upload - jQuery('.filename.original', item).replaceWith( jQuery('.filename.new', item) ); - - // Also bind toggle to the links - jQuery('a.toggle', item).click(function(){ - jQuery(this).siblings('.slidetoggle').slideToggle(350, function(){ - var w = jQuery(window).height(), t = jQuery(this).offset().top, h = jQuery(this).height(), b; - - if ( w && t && h ) { - b = t + h; - - if ( b > w && (h + 48) < w ) - window.scrollBy(0, b - w + 13); - else if ( b > w ) - window.scrollTo(0, t - 36); - } - }); - jQuery(this).siblings('.toggle').andSelf().toggle(); - jQuery(this).siblings('a.toggle').focus(); - return false; - }); - - // Bind AJAX to the new Delete button - jQuery('a.delete', item).click(function(){ - // Tell the server to delete it. TODO: handle exceptions - jQuery.ajax({ - url: ajaxurl, - type: 'post', - success: deleteSuccess, - error: deleteError, - id: fileObj.id, - data: { - id : this.id.replace(/[^0-9]/g, ''), - action : 'trash-post', - _ajax_nonce : this.href.replace(/^.*wpnonce=/,'') - } - }); - return false; - }); - - // Bind AJAX to the new Undo button - jQuery('a.undo', item).click(function(){ - // Tell the server to untrash it. TODO: handle exceptions - jQuery.ajax({ - url: ajaxurl, - type: 'post', - id: fileObj.id, - data: { - id : this.id.replace(/[^0-9]/g,''), - action: 'untrash-post', - _ajax_nonce: this.href.replace(/^.*wpnonce=/,'') - }, - success: function(data, textStatus){ - var item = jQuery('#media-item-' + fileObj.id); - - if ( type = jQuery('#type-of-' + fileObj.id).val() ) - jQuery('#' + type + '-counter').text(jQuery('#' + type + '-counter').text()-0+1); - if ( item.hasClass('child-of-'+post_id) ) - jQuery('#attachments-count').text(jQuery('#attachments-count').text()-0+1); - - jQuery('.filename .trashnotice', item).remove(); - jQuery('.filename .title', item).css('font-weight','normal'); - jQuery('a.undo', item).addClass('hidden'); - jQuery('a.describe-toggle-on, .menu_order_input', item).show(); - item.css( {backgroundColor:'#ceb'} ).animate( {backgroundColor: '#fff'}, { queue: false, duration: 500, complete: function(){ jQuery(this).css({backgroundColor:''}); } }).removeClass('undo'); - } - }); - return false; - }); - - // Open this item if it says to start open (e.g. to display an error) - jQuery('#media-item-' + fileObj.id + '.startopen').removeClass('startopen').slideToggle(500).siblings('.toggle').toggle(); -} - -function itemAjaxError(id, html) { - var item = jQuery('#media-item-' + id); - var filename = jQuery('.filename', item).text(); - - item.html('
      ' - + '' + swfuploadL10n.dismiss + '' - + '' + swfuploadL10n.error_uploading.replace('%s', filename) + '
      ' - + html - + '
      '); - item.find('a.dismiss').click(function(){jQuery(this).parents('.media-item').slideUp(200, function(){jQuery(this).remove();})}); -} - -function deleteSuccess(data, textStatus) { - if ( data == '-1' ) - return itemAjaxError(this.id, 'You do not have permission. Has your session expired?'); - if ( data == '0' ) - return itemAjaxError(this.id, 'Could not be deleted. Has it been deleted already?'); - - var id = this.id, item = jQuery('#media-item-' + id); - - // Decrement the counters. - if ( type = jQuery('#type-of-' + id).val() ) - jQuery('#' + type + '-counter').text( jQuery('#' + type + '-counter').text() - 1 ); - if ( item.hasClass('child-of-'+post_id) ) - jQuery('#attachments-count').text( jQuery('#attachments-count').text() - 1 ); - - if ( jQuery('form.type-form #media-items').children().length == 1 && jQuery('.hidden', '#media-items').length > 0 ) { - jQuery('.toggle').toggle(); - jQuery('.slidetoggle').slideUp(200).siblings().removeClass('hidden'); - } - - // Vanish it. - jQuery('.toggle', item).toggle(); - jQuery('.slidetoggle', item).slideUp(200).siblings().removeClass('hidden'); - item.css( {backgroundColor:'#faa'} ).animate( {backgroundColor:'#f4f4f4'}, {queue:false, duration:500} ).addClass('undo'); - - jQuery('.filename:empty', item).remove(); - jQuery('.filename .title', item).css('font-weight','bold'); - jQuery('.filename', item).append(' ' + swfuploadL10n.deleted + ' ').siblings('a.toggle').hide(); - jQuery('.filename', item).append( jQuery('a.undo', item).removeClass('hidden') ); - jQuery('.menu_order_input', item).hide(); - - return; -} - -function deleteError(X, textStatus, errorThrown) { - // TODO -} - -function updateMediaForm() { - var one = jQuery('form.type-form #media-items').children(), items = jQuery('#media-items').children(); - - // Just one file, no need for collapsible part - if ( one.length == 1 ) { - jQuery('.slidetoggle', one).slideDown(500).siblings().addClass('hidden').filter('.toggle').toggle(); - } - - // Only show Save buttons when there is at least one file. - if ( items.not('.media-blank').length > 0 ) - jQuery('.savebutton').show(); - else - jQuery('.savebutton').hide(); - - // Only show Gallery buttons when there are at least two files. - if ( items.length > 1 ) { - jQuery('.insert-gallery').show(); - } else { - jQuery('.insert-gallery').hide(); - } -} - -function uploadSuccess(fileObj, serverData) { - // if async-upload returned an error message, place it in the media item div and return - if ( serverData.match('media-upload-error') ) { - jQuery('#media-item-' + fileObj.id).html(serverData); - return; - } - - prepareMediaItem(fileObj, serverData); - updateMediaForm(); - - // Increment the counter. - if ( jQuery('#media-item-' + fileObj.id).hasClass('child-of-' + post_id) ) - jQuery('#attachments-count').text(1 * jQuery('#attachments-count').text() + 1); -} - -function uploadComplete(fileObj) { - // If no more uploads queued, enable the submit button - if ( swfu.getStats().files_queued == 0 ) { - jQuery('#cancel-upload').prop('disabled', true); - jQuery('#insert-gallery').prop('disabled', false); - } -} - - -// wp-specific error handlers - -// generic message -function wpQueueError(message) { - jQuery('#media-upload-error').show().text(message); -} - -// file-specific message -function wpFileError(fileObj, message) { - var item = jQuery('#media-item-' + fileObj.id); - var filename = jQuery('.filename', item).text(); - - item.html('
      ' - + '' + swfuploadL10n.dismiss + '' - + '' + swfuploadL10n.error_uploading.replace('%s', filename) + '
      ' - + message - + '
      '); - item.find('a.dismiss').click(function(){jQuery(this).parents('.media-item').slideUp(200, function(){jQuery(this).remove();})}); -} - -function fileQueueError(fileObj, error_code, message) { - // Handle this error separately because we don't want to create a FileProgress element for it. - if ( error_code == SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED ) { - wpQueueError(swfuploadL10n.queue_limit_exceeded); - } - else if ( error_code == SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT ) { - fileQueued(fileObj); - wpFileError(fileObj, swfuploadL10n.file_exceeds_size_limit); - } - else if ( error_code == SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE ) { - fileQueued(fileObj); - wpFileError(fileObj, swfuploadL10n.zero_byte_file); - } - else if ( error_code == SWFUpload.QUEUE_ERROR.INVALID_FILETYPE ) { - fileQueued(fileObj); - wpFileError(fileObj, swfuploadL10n.invalid_filetype); - } - else { - wpQueueError(swfuploadL10n.default_error); - } -} - -function fileDialogComplete(num_files_queued) { - try { - if (num_files_queued > 0) { - this.startUpload(); - } - } catch (ex) { - this.debug(ex); - } -} - -function switchUploader(s) { - var f = document.getElementById(swfu.customSettings.swfupload_element_id), h = document.getElementById(swfu.customSettings.degraded_element_id); - if ( s ) { - f.style.display = 'block'; - h.style.display = 'none'; - } else { - f.style.display = 'none'; - h.style.display = 'block'; - } -} - -function swfuploadPreLoad() { - if ( !uploaderMode ) { - switchUploader(1); - } else { - switchUploader(0); - } -} - -function swfuploadLoadFailed() { - switchUploader(0); - jQuery('.upload-html-bypass').hide(); -} - -function uploadError(fileObj, errorCode, message) { - - switch (errorCode) { - case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL: - wpFileError(fileObj, swfuploadL10n.missing_upload_url); - break; - case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED: - wpFileError(fileObj, swfuploadL10n.upload_limit_exceeded); - break; - case SWFUpload.UPLOAD_ERROR.HTTP_ERROR: - wpQueueError(swfuploadL10n.http_error); - break; - case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED: - wpQueueError(swfuploadL10n.upload_failed); - break; - case SWFUpload.UPLOAD_ERROR.IO_ERROR: - wpQueueError(swfuploadL10n.io_error); - break; - case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR: - wpQueueError(swfuploadL10n.security_error); - break; - case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED: - case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED: - jQuery('#media-item-' + fileObj.id).remove(); - break; - default: - wpFileError(fileObj, swfuploadL10n.default_error); - } -} - -function cancelUpload() { - swfu.cancelQueue(); -} - -// remember the last used image size, alignment and url -jQuery(document).ready(function($){ - $('input[type="radio"]', '#media-items').live('click', function(){ - var tr = $(this).closest('tr'); - - if ( $(tr).hasClass('align') ) - setUserSetting('align', $(this).val()); - else if ( $(tr).hasClass('image-size') ) - setUserSetting('imgsize', $(this).val()); - }); - - $('button.button', '#media-items').live('click', function(){ - var c = this.className || ''; - c = c.match(/url([^ '"]+)/); - if ( c && c[1] ) { - setUserSetting('urlbutton', c[1]); - $(this).siblings('.urlfield').val( $(this).attr('title') ); - } - }); -}); diff --git a/wp/wp-includes/js/swfupload/handlers.min.js b/wp/wp-includes/js/swfupload/handlers.min.js deleted file mode 100644 index 5aaa8ee2..00000000 --- a/wp/wp-includes/js/swfupload/handlers.min.js +++ /dev/null @@ -1 +0,0 @@ -var topWin=window.dialogArguments||opener||parent||top;function fileDialogStart(){jQuery("#media-upload-error").empty()}function fileQueued(a){jQuery(".media-blank").remove();if(jQuery("form.type-form #media-items").children().length==1&&jQuery(".hidden","#media-items").length>0){jQuery(".describe-toggle-on").show();jQuery(".describe-toggle-off").hide();jQuery(".slidetoggle").slideUp(200).siblings().removeClass("hidden")}jQuery('
      ').attr("id","media-item-"+a.id).addClass("child-of-"+post_id).append('
      ',jQuery('
      ').text(" "+a.name)).appendTo(jQuery("#media-items"));jQuery(".progress","#media-item-"+a.id).show();jQuery("#insert-gallery").prop("disabled",true);jQuery("#cancel-upload").prop("disabled",false)}function uploadStart(a){try{if(typeof topWin.tb_remove!="undefined"){topWin.jQuery("#TB_overlay").unbind("click",topWin.tb_remove)}}catch(b){}return true}function uploadProgress(e,b,d){var a=jQuery("#media-items").width()-2,c=jQuery("#media-item-"+e.id);jQuery(".bar",c).width(a*b/d);jQuery(".percent",c).html(Math.ceil(b/d*100)+"%");if(b==d){jQuery(".bar",c).html(''+swfuploadL10n.crunching+"")}}function prepareMediaItem(c,a){var d=(typeof shortform=="undefined")?1:2,b=jQuery("#media-item-"+c.id);jQuery(".bar",b).remove();jQuery(".progress",b).hide();try{if(typeof topWin.tb_remove!="undefined"){topWin.jQuery("#TB_overlay").click(topWin.tb_remove)}}catch(g){}if(isNaN(a)||!a){b.append(a);prepareMediaItemInit(c)}else{b.load("async-upload.php",{attachment_id:a,fetch:d},function(){prepareMediaItemInit(c);updateMediaForm()})}}function prepareMediaItemInit(b){var a=jQuery("#media-item-"+b.id);jQuery(".thumbnail",a).clone().attr("class","pinkynail toggle").prependTo(a);jQuery(".filename.original",a).replaceWith(jQuery(".filename.new",a));jQuery("a.toggle",a).click(function(){jQuery(this).siblings(".slidetoggle").slideToggle(350,function(){var d=jQuery(window).height(),e=jQuery(this).offset().top,f=jQuery(this).height(),c;if(d&&e&&f){c=e+f;if(c>d&&(f+48)d){window.scrollTo(0,e-36)}}}});jQuery(this).siblings(".toggle").andSelf().toggle();jQuery(this).siblings("a.toggle").focus();return false});jQuery("a.delete",a).click(function(){jQuery.ajax({url:ajaxurl,type:"post",success:deleteSuccess,error:deleteError,id:b.id,data:{id:this.id.replace(/[^0-9]/g,""),action:"trash-post",_ajax_nonce:this.href.replace(/^.*wpnonce=/,"")}});return false});jQuery("a.undo",a).click(function(){jQuery.ajax({url:ajaxurl,type:"post",id:b.id,data:{id:this.id.replace(/[^0-9]/g,""),action:"untrash-post",_ajax_nonce:this.href.replace(/^.*wpnonce=/,"")},success:function(d,e){var c=jQuery("#media-item-"+b.id);if(type=jQuery("#type-of-"+b.id).val()){jQuery("#"+type+"-counter").text(jQuery("#"+type+"-counter").text()-0+1)}if(c.hasClass("child-of-"+post_id)){jQuery("#attachments-count").text(jQuery("#attachments-count").text()-0+1)}jQuery(".filename .trashnotice",c).remove();jQuery(".filename .title",c).css("font-weight","normal");jQuery("a.undo",c).addClass("hidden");jQuery("a.describe-toggle-on, .menu_order_input",c).show();c.css({backgroundColor:"#ceb"}).animate({backgroundColor:"#fff"},{queue:false,duration:500,complete:function(){jQuery(this).css({backgroundColor:""})}}).removeClass("undo")}});return false});jQuery("#media-item-"+b.id+".startopen").removeClass("startopen").slideToggle(500).siblings(".toggle").toggle()}function itemAjaxError(d,b){var c=jQuery("#media-item-"+d);var a=jQuery(".filename",c).text();c.html('
      '+swfuploadL10n.dismiss+""+swfuploadL10n.error_uploading.replace("%s",a)+"
      "+b+"
      ");c.find("a.dismiss").click(function(){jQuery(this).parents(".media-item").slideUp(200,function(){jQuery(this).remove()})})}function deleteSuccess(b,d){if(b=="-1"){return itemAjaxError(this.id,"You do not have permission. Has your session expired?")}if(b=="0"){return itemAjaxError(this.id,"Could not be deleted. Has it been deleted already?")}var c=this.id,a=jQuery("#media-item-"+c);if(type=jQuery("#type-of-"+c).val()){jQuery("#"+type+"-counter").text(jQuery("#"+type+"-counter").text()-1)}if(a.hasClass("child-of-"+post_id)){jQuery("#attachments-count").text(jQuery("#attachments-count").text()-1)}if(jQuery("form.type-form #media-items").children().length==1&&jQuery(".hidden","#media-items").length>0){jQuery(".toggle").toggle();jQuery(".slidetoggle").slideUp(200).siblings().removeClass("hidden")}jQuery(".toggle",a).toggle();jQuery(".slidetoggle",a).slideUp(200).siblings().removeClass("hidden");a.css({backgroundColor:"#faa"}).animate({backgroundColor:"#f4f4f4"},{queue:false,duration:500}).addClass("undo");jQuery(".filename:empty",a).remove();jQuery(".filename .title",a).css("font-weight","bold");jQuery(".filename",a).append(' '+swfuploadL10n.deleted+" ").siblings("a.toggle").hide();jQuery(".filename",a).append(jQuery("a.undo",a).removeClass("hidden"));jQuery(".menu_order_input",a).hide();return}function deleteError(c,b,a){}function updateMediaForm(){var b=jQuery("form.type-form #media-items").children(),a=jQuery("#media-items").children();if(b.length==1){jQuery(".slidetoggle",b).slideDown(500).siblings().addClass("hidden").filter(".toggle").toggle()}if(a.not(".media-blank").length>0){jQuery(".savebutton").show()}else{jQuery(".savebutton").hide()}if(a.length>1){jQuery(".insert-gallery").show()}else{jQuery(".insert-gallery").hide()}}function uploadSuccess(b,a){if(a.match("media-upload-error")){jQuery("#media-item-"+b.id).html(a);return}prepareMediaItem(b,a);updateMediaForm();if(jQuery("#media-item-"+b.id).hasClass("child-of-"+post_id)){jQuery("#attachments-count").text(1*jQuery("#attachments-count").text()+1)}}function uploadComplete(a){if(swfu.getStats().files_queued==0){jQuery("#cancel-upload").prop("disabled",true);jQuery("#insert-gallery").prop("disabled",false)}}function wpQueueError(a){jQuery("#media-upload-error").show().text(a)}function wpFileError(d,c){var b=jQuery("#media-item-"+d.id);var a=jQuery(".filename",b).text();b.html('
      '+swfuploadL10n.dismiss+""+swfuploadL10n.error_uploading.replace("%s",a)+"
      "+c+"
      ");b.find("a.dismiss").click(function(){jQuery(this).parents(".media-item").slideUp(200,function(){jQuery(this).remove()})})}function fileQueueError(c,a,b){if(a==SWFUpload.QUEUE_ERROR.QUEUE_LIMIT_EXCEEDED){wpQueueError(swfuploadL10n.queue_limit_exceeded)}else{if(a==SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT){fileQueued(c);wpFileError(c,swfuploadL10n.file_exceeds_size_limit)}else{if(a==SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE){fileQueued(c);wpFileError(c,swfuploadL10n.zero_byte_file)}else{if(a==SWFUpload.QUEUE_ERROR.INVALID_FILETYPE){fileQueued(c);wpFileError(c,swfuploadL10n.invalid_filetype)}else{wpQueueError(swfuploadL10n.default_error)}}}}}function fileDialogComplete(b){try{if(b>0){this.startUpload()}}catch(a){this.debug(a)}}function switchUploader(b){var c=document.getElementById(swfu.customSettings.swfupload_element_id),a=document.getElementById(swfu.customSettings.degraded_element_id);if(b){c.style.display="block";a.style.display="none"}else{c.style.display="none";a.style.display="block"}}function swfuploadPreLoad(){if(!uploaderMode){switchUploader(1)}else{switchUploader(0)}}function swfuploadLoadFailed(){switchUploader(0);jQuery(".upload-html-bypass").hide()}function uploadError(b,c,a){switch(c){case SWFUpload.UPLOAD_ERROR.MISSING_UPLOAD_URL:wpFileError(b,swfuploadL10n.missing_upload_url);break;case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:wpFileError(b,swfuploadL10n.upload_limit_exceeded);break;case SWFUpload.UPLOAD_ERROR.HTTP_ERROR:wpQueueError(swfuploadL10n.http_error);break;case SWFUpload.UPLOAD_ERROR.UPLOAD_FAILED:wpQueueError(swfuploadL10n.upload_failed);break;case SWFUpload.UPLOAD_ERROR.IO_ERROR:wpQueueError(swfuploadL10n.io_error);break;case SWFUpload.UPLOAD_ERROR.SECURITY_ERROR:wpQueueError(swfuploadL10n.security_error);break;case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:jQuery("#media-item-"+b.id).remove();break;default:wpFileError(b,swfuploadL10n.default_error)}}function cancelUpload(){swfu.cancelQueue()}jQuery(document).ready(function(a){a('input[type="radio"]',"#media-items").live("click",function(){var b=a(this).closest("tr");if(a(b).hasClass("align")){setUserSetting("align",a(this).val())}else{if(a(b).hasClass("image-size")){setUserSetting("imgsize",a(this).val())}}});a("button.button","#media-items").live("click",function(){var b=this.className||"";b=b.match(/url([^ '"]+)/);if(b&&b[1]){setUserSetting("urlbutton",b[1]);a(this).siblings(".urlfield").val(a(this).attr("title"))}})}); \ No newline at end of file diff --git a/wp/wp-includes/js/swfupload/license.txt b/wp/wp-includes/js/swfupload/license.txt deleted file mode 100644 index 8252ca9e..00000000 --- a/wp/wp-includes/js/swfupload/license.txt +++ /dev/null @@ -1,32 +0,0 @@ -/** - * SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com - * - * mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/, http://www.vinterwebb.se/ - * - * SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilzén and Mammon Media and is released under the MIT License: - * http://www.opensource.org/licenses/mit-license.php - * - * SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License: - * http://www.opensource.org/licenses/mit-license.php - * - */ - -The MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/wp/wp-includes/js/swfupload/plugins/swfupload.cookies.js b/wp/wp-includes/js/swfupload/plugins/swfupload.cookies.js deleted file mode 100644 index dd3b78bb..00000000 --- a/wp/wp-includes/js/swfupload/plugins/swfupload.cookies.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - Cookie Plug-in - - This plug in automatically gets all the cookies for this site and adds them to the post_params. - Cookies are loaded only on initialization. The refreshCookies function can be called to update the post_params. - The cookies will override any other post params with the same name. -*/ - -var SWFUpload; -if (typeof(SWFUpload) === "function") { - SWFUpload.prototype.initSettings = function (oldInitSettings) { - return function () { - if (typeof(oldInitSettings) === "function") { - oldInitSettings.call(this); - } - - this.refreshCookies(false); // The false parameter must be sent since SWFUpload has not initialzed at this point - }; - }(SWFUpload.prototype.initSettings); - - // refreshes the post_params and updates SWFUpload. The sendToFlash parameters is optional and defaults to True - SWFUpload.prototype.refreshCookies = function (sendToFlash) { - if (sendToFlash === undefined) { - sendToFlash = true; - } - sendToFlash = !!sendToFlash; - - // Get the post_params object - var postParams = this.settings.post_params; - - // Get the cookies - var i, cookieArray = document.cookie.split(';'), caLength = cookieArray.length, c, eqIndex, name, value; - for (i = 0; i < caLength; i++) { - c = cookieArray[i]; - - // Left Trim spaces - while (c.charAt(0) === " ") { - c = c.substring(1, c.length); - } - eqIndex = c.indexOf("="); - if (eqIndex > 0) { - name = c.substring(0, eqIndex); - value = c.substring(eqIndex + 1); - postParams[name] = value; - } - } - - if (sendToFlash) { - this.setPostParams(postParams); - } - }; - -} diff --git a/wp/wp-includes/js/swfupload/plugins/swfupload.queue.js b/wp/wp-includes/js/swfupload/plugins/swfupload.queue.js deleted file mode 100644 index f09933e3..00000000 --- a/wp/wp-includes/js/swfupload/plugins/swfupload.queue.js +++ /dev/null @@ -1,98 +0,0 @@ -/* - Queue Plug-in - - Features: - *Adds a cancelQueue() method for cancelling the entire queue. - *All queued files are uploaded when startUpload() is called. - *If false is returned from uploadComplete then the queue upload is stopped. - If false is not returned (strict comparison) then the queue upload is continued. - *Adds a QueueComplete event that is fired when all the queued files have finished uploading. - Set the event handler with the queue_complete_handler setting. - - */ - -var SWFUpload; -if (typeof(SWFUpload) === "function") { - SWFUpload.queue = {}; - - SWFUpload.prototype.initSettings = (function (oldInitSettings) { - return function () { - if (typeof(oldInitSettings) === "function") { - oldInitSettings.call(this); - } - - this.queueSettings = {}; - - this.queueSettings.queue_cancelled_flag = false; - this.queueSettings.queue_upload_count = 0; - - this.queueSettings.user_upload_complete_handler = this.settings.upload_complete_handler; - this.queueSettings.user_upload_start_handler = this.settings.upload_start_handler; - this.settings.upload_complete_handler = SWFUpload.queue.uploadCompleteHandler; - this.settings.upload_start_handler = SWFUpload.queue.uploadStartHandler; - - this.settings.queue_complete_handler = this.settings.queue_complete_handler || null; - }; - })(SWFUpload.prototype.initSettings); - - SWFUpload.prototype.startUpload = function (fileID) { - this.queueSettings.queue_cancelled_flag = false; - this.callFlash("StartUpload", [fileID]); - }; - - SWFUpload.prototype.cancelQueue = function () { - this.queueSettings.queue_cancelled_flag = true; - this.stopUpload(); - - var stats = this.getStats(); - while (stats.files_queued > 0) { - this.cancelUpload(); - stats = this.getStats(); - } - }; - - SWFUpload.queue.uploadStartHandler = function (file) { - var returnValue; - if (typeof(this.queueSettings.user_upload_start_handler) === "function") { - returnValue = this.queueSettings.user_upload_start_handler.call(this, file); - } - - // To prevent upload a real "FALSE" value must be returned, otherwise default to a real "TRUE" value. - returnValue = (returnValue === false) ? false : true; - - this.queueSettings.queue_cancelled_flag = !returnValue; - - return returnValue; - }; - - SWFUpload.queue.uploadCompleteHandler = function (file) { - var user_upload_complete_handler = this.queueSettings.user_upload_complete_handler; - var continueUpload; - - if (file.filestatus === SWFUpload.FILE_STATUS.COMPLETE) { - this.queueSettings.queue_upload_count++; - } - - if (typeof(user_upload_complete_handler) === "function") { - continueUpload = (user_upload_complete_handler.call(this, file) === false) ? false : true; - } else if (file.filestatus === SWFUpload.FILE_STATUS.QUEUED) { - // If the file was stopped and re-queued don't restart the upload - continueUpload = false; - } else { - continueUpload = true; - } - - if (continueUpload) { - var stats = this.getStats(); - if (stats.files_queued > 0 && this.queueSettings.queue_cancelled_flag === false) { - this.startUpload(); - } else if (this.queueSettings.queue_cancelled_flag === false) { - this.queueEvent("queue_complete_handler", [this.queueSettings.queue_upload_count]); - this.queueSettings.queue_upload_count = 0; - } else { - this.queueSettings.queue_cancelled_flag = false; - this.queueSettings.queue_upload_count = 0; - } - } - }; -} diff --git a/wp/wp-includes/js/swfupload/plugins/swfupload.speed.js b/wp/wp-includes/js/swfupload/plugins/swfupload.speed.js deleted file mode 100644 index 3245c9c7..00000000 --- a/wp/wp-includes/js/swfupload/plugins/swfupload.speed.js +++ /dev/null @@ -1,342 +0,0 @@ -/* - Speed Plug-in - - Features: - *Adds several properties to the 'file' object indicated upload speed, time left, upload time, etc. - - currentSpeed -- String indicating the upload speed, bytes per second - - averageSpeed -- Overall average upload speed, bytes per second - - movingAverageSpeed -- Speed over averaged over the last several measurements, bytes per second - - timeRemaining -- Estimated remaining upload time in seconds - - timeElapsed -- Number of seconds passed for this upload - - percentUploaded -- Percentage of the file uploaded (0 to 100) - - sizeUploaded -- Formatted size uploaded so far, bytes - - *Adds setting 'moving_average_history_size' for defining the window size used to calculate the moving average speed. - - *Adds several Formatting functions for formatting that values provided on the file object. - - SWFUpload.speed.formatBPS(bps) -- outputs string formatted in the best units (Gbps, Mbps, Kbps, bps) - - SWFUpload.speed.formatTime(seconds) -- outputs string formatted in the best units (x Hr y M z S) - - SWFUpload.speed.formatSize(bytes) -- outputs string formatted in the best units (w GB x MB y KB z B ) - - SWFUpload.speed.formatPercent(percent) -- outputs string formatted with a percent sign (x.xx %) - - SWFUpload.speed.formatUnits(baseNumber, divisionArray, unitLabelArray, fractionalBoolean) - - Formats a number using the division array to determine how to apply the labels in the Label Array - - factionalBoolean indicates whether the number should be returned as a single fractional number with a unit (speed) - or as several numbers labeled with units (time) - */ - -var SWFUpload; -if (typeof(SWFUpload) === "function") { - SWFUpload.speed = {}; - - SWFUpload.prototype.initSettings = (function (oldInitSettings) { - return function () { - if (typeof(oldInitSettings) === "function") { - oldInitSettings.call(this); - } - - this.ensureDefault = function (settingName, defaultValue) { - this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName]; - }; - - // List used to keep the speed stats for the files we are tracking - this.fileSpeedStats = {}; - this.speedSettings = {}; - - this.ensureDefault("moving_average_history_size", "10"); - - this.speedSettings.user_file_queued_handler = this.settings.file_queued_handler; - this.speedSettings.user_file_queue_error_handler = this.settings.file_queue_error_handler; - this.speedSettings.user_upload_start_handler = this.settings.upload_start_handler; - this.speedSettings.user_upload_error_handler = this.settings.upload_error_handler; - this.speedSettings.user_upload_progress_handler = this.settings.upload_progress_handler; - this.speedSettings.user_upload_success_handler = this.settings.upload_success_handler; - this.speedSettings.user_upload_complete_handler = this.settings.upload_complete_handler; - - this.settings.file_queued_handler = SWFUpload.speed.fileQueuedHandler; - this.settings.file_queue_error_handler = SWFUpload.speed.fileQueueErrorHandler; - this.settings.upload_start_handler = SWFUpload.speed.uploadStartHandler; - this.settings.upload_error_handler = SWFUpload.speed.uploadErrorHandler; - this.settings.upload_progress_handler = SWFUpload.speed.uploadProgressHandler; - this.settings.upload_success_handler = SWFUpload.speed.uploadSuccessHandler; - this.settings.upload_complete_handler = SWFUpload.speed.uploadCompleteHandler; - - delete this.ensureDefault; - }; - })(SWFUpload.prototype.initSettings); - - - SWFUpload.speed.fileQueuedHandler = function (file) { - if (typeof this.speedSettings.user_file_queued_handler === "function") { - file = SWFUpload.speed.extendFile(file); - - return this.speedSettings.user_file_queued_handler.call(this, file); - } - }; - - SWFUpload.speed.fileQueueErrorHandler = function (file, errorCode, message) { - if (typeof this.speedSettings.user_file_queue_error_handler === "function") { - file = SWFUpload.speed.extendFile(file); - - return this.speedSettings.user_file_queue_error_handler.call(this, file, errorCode, message); - } - }; - - SWFUpload.speed.uploadStartHandler = function (file) { - if (typeof this.speedSettings.user_upload_start_handler === "function") { - file = SWFUpload.speed.extendFile(file, this.fileSpeedStats); - return this.speedSettings.user_upload_start_handler.call(this, file); - } - }; - - SWFUpload.speed.uploadErrorHandler = function (file, errorCode, message) { - file = SWFUpload.speed.extendFile(file, this.fileSpeedStats); - SWFUpload.speed.removeTracking(file, this.fileSpeedStats); - - if (typeof this.speedSettings.user_upload_error_handler === "function") { - return this.speedSettings.user_upload_error_handler.call(this, file, errorCode, message); - } - }; - SWFUpload.speed.uploadProgressHandler = function (file, bytesComplete, bytesTotal) { - this.updateTracking(file, bytesComplete); - file = SWFUpload.speed.extendFile(file, this.fileSpeedStats); - - if (typeof this.speedSettings.user_upload_progress_handler === "function") { - return this.speedSettings.user_upload_progress_handler.call(this, file, bytesComplete, bytesTotal); - } - }; - - SWFUpload.speed.uploadSuccessHandler = function (file, serverData) { - if (typeof this.speedSettings.user_upload_success_handler === "function") { - file = SWFUpload.speed.extendFile(file, this.fileSpeedStats); - return this.speedSettings.user_upload_success_handler.call(this, file, serverData); - } - }; - SWFUpload.speed.uploadCompleteHandler = function (file) { - file = SWFUpload.speed.extendFile(file, this.fileSpeedStats); - SWFUpload.speed.removeTracking(file, this.fileSpeedStats); - - if (typeof this.speedSettings.user_upload_complete_handler === "function") { - return this.speedSettings.user_upload_complete_handler.call(this, file); - } - }; - - // Private: extends the file object with the speed plugin values - SWFUpload.speed.extendFile = function (file, trackingList) { - var tracking; - - if (trackingList) { - tracking = trackingList[file.id]; - } - - if (tracking) { - file.currentSpeed = tracking.currentSpeed; - file.averageSpeed = tracking.averageSpeed; - file.movingAverageSpeed = tracking.movingAverageSpeed; - file.timeRemaining = tracking.timeRemaining; - file.timeElapsed = tracking.timeElapsed; - file.percentUploaded = tracking.percentUploaded; - file.sizeUploaded = tracking.bytesUploaded; - - } else { - file.currentSpeed = 0; - file.averageSpeed = 0; - file.movingAverageSpeed = 0; - file.timeRemaining = 0; - file.timeElapsed = 0; - file.percentUploaded = 0; - file.sizeUploaded = 0; - } - - return file; - }; - - // Private: Updates the speed tracking object, or creates it if necessary - SWFUpload.prototype.updateTracking = function (file, bytesUploaded) { - var tracking = this.fileSpeedStats[file.id]; - if (!tracking) { - this.fileSpeedStats[file.id] = tracking = {}; - } - - // Sanity check inputs - bytesUploaded = bytesUploaded || tracking.bytesUploaded || 0; - if (bytesUploaded < 0) { - bytesUploaded = 0; - } - if (bytesUploaded > file.size) { - bytesUploaded = file.size; - } - - var tickTime = (new Date()).getTime(); - if (!tracking.startTime) { - tracking.startTime = (new Date()).getTime(); - tracking.lastTime = tracking.startTime; - tracking.currentSpeed = 0; - tracking.averageSpeed = 0; - tracking.movingAverageSpeed = 0; - tracking.movingAverageHistory = []; - tracking.timeRemaining = 0; - tracking.timeElapsed = 0; - tracking.percentUploaded = bytesUploaded / file.size; - tracking.bytesUploaded = bytesUploaded; - } else if (tracking.startTime > tickTime) { - this.debug("When backwards in time"); - } else { - // Get time and deltas - var now = (new Date()).getTime(); - var lastTime = tracking.lastTime; - var deltaTime = now - lastTime; - var deltaBytes = bytesUploaded - tracking.bytesUploaded; - - if (deltaBytes === 0 || deltaTime === 0) { - return tracking; - } - - // Update tracking object - tracking.lastTime = now; - tracking.bytesUploaded = bytesUploaded; - - // Calculate speeds - tracking.currentSpeed = (deltaBytes * 8 ) / (deltaTime / 1000); - tracking.averageSpeed = (tracking.bytesUploaded * 8) / ((now - tracking.startTime) / 1000); - - // Calculate moving average - tracking.movingAverageHistory.push(tracking.currentSpeed); - if (tracking.movingAverageHistory.length > this.settings.moving_average_history_size) { - tracking.movingAverageHistory.shift(); - } - - tracking.movingAverageSpeed = SWFUpload.speed.calculateMovingAverage(tracking.movingAverageHistory); - - // Update times - tracking.timeRemaining = (file.size - tracking.bytesUploaded) * 8 / tracking.movingAverageSpeed; - tracking.timeElapsed = (now - tracking.startTime) / 1000; - - // Update percent - tracking.percentUploaded = (tracking.bytesUploaded / file.size * 100); - } - - return tracking; - }; - SWFUpload.speed.removeTracking = function (file, trackingList) { - try { - trackingList[file.id] = null; - delete trackingList[file.id]; - } catch (ex) { - } - }; - - SWFUpload.speed.formatUnits = function (baseNumber, unitDivisors, unitLabels, singleFractional) { - var i, unit, unitDivisor, unitLabel; - - if (baseNumber === 0) { - return "0 " + unitLabels[unitLabels.length - 1]; - } - - if (singleFractional) { - unit = baseNumber; - unitLabel = unitLabels.length >= unitDivisors.length ? unitLabels[unitDivisors.length - 1] : ""; - for (i = 0; i < unitDivisors.length; i++) { - if (baseNumber >= unitDivisors[i]) { - unit = (baseNumber / unitDivisors[i]).toFixed(2); - unitLabel = unitLabels.length >= i ? " " + unitLabels[i] : ""; - break; - } - } - - return unit + unitLabel; - } else { - var formattedStrings = []; - var remainder = baseNumber; - - for (i = 0; i < unitDivisors.length; i++) { - unitDivisor = unitDivisors[i]; - unitLabel = unitLabels.length > i ? " " + unitLabels[i] : ""; - - unit = remainder / unitDivisor; - if (i < unitDivisors.length -1) { - unit = Math.floor(unit); - } else { - unit = unit.toFixed(2); - } - if (unit > 0) { - remainder = remainder % unitDivisor; - - formattedStrings.push(unit + unitLabel); - } - } - - return formattedStrings.join(" "); - } - }; - - SWFUpload.speed.formatBPS = function (baseNumber) { - var bpsUnits = [1073741824, 1048576, 1024, 1], bpsUnitLabels = ["Gbps", "Mbps", "Kbps", "bps"]; - return SWFUpload.speed.formatUnits(baseNumber, bpsUnits, bpsUnitLabels, true); - - }; - SWFUpload.speed.formatTime = function (baseNumber) { - var timeUnits = [86400, 3600, 60, 1], timeUnitLabels = ["d", "h", "m", "s"]; - return SWFUpload.speed.formatUnits(baseNumber, timeUnits, timeUnitLabels, false); - - }; - SWFUpload.speed.formatBytes = function (baseNumber) { - var sizeUnits = [1073741824, 1048576, 1024, 1], sizeUnitLabels = ["GB", "MB", "KB", "bytes"]; - return SWFUpload.speed.formatUnits(baseNumber, sizeUnits, sizeUnitLabels, true); - - }; - SWFUpload.speed.formatPercent = function (baseNumber) { - return baseNumber.toFixed(2) + " %"; - }; - - SWFUpload.speed.calculateMovingAverage = function (history) { - var vals = [], size, sum = 0.0, mean = 0.0, varianceTemp = 0.0, variance = 0.0, standardDev = 0.0; - var i; - var mSum = 0, mCount = 0; - - size = history.length; - - // Check for sufficient data - if (size >= 8) { - // Clone the array and Calculate sum of the values - for (i = 0; i < size; i++) { - vals[i] = history[i]; - sum += vals[i]; - } - - mean = sum / size; - - // Calculate variance for the set - for (i = 0; i < size; i++) { - varianceTemp += Math.pow((vals[i] - mean), 2); - } - - variance = varianceTemp / size; - standardDev = Math.sqrt(variance); - - //Standardize the Data - for (i = 0; i < size; i++) { - vals[i] = (vals[i] - mean) / standardDev; - } - - // Calculate the average excluding outliers - var deviationRange = 2.0; - for (i = 0; i < size; i++) { - - if (vals[i] <= deviationRange && vals[i] >= -deviationRange) { - mCount++; - mSum += history[i]; - } - } - - } else { - // Calculate the average (not enough data points to remove outliers) - mCount = size; - for (i = 0; i < size; i++) { - mSum += history[i]; - } - } - - return mSum / mCount; - }; - -} \ No newline at end of file diff --git a/wp/wp-includes/js/swfupload/plugins/swfupload.swfobject.js b/wp/wp-includes/js/swfupload/plugins/swfupload.swfobject.js deleted file mode 100644 index cb7aa804..00000000 --- a/wp/wp-includes/js/swfupload/plugins/swfupload.swfobject.js +++ /dev/null @@ -1,105 +0,0 @@ -/* - SWFUpload.SWFObject Plugin - - Summary: - This plugin uses SWFObject to embed SWFUpload dynamically in the page. SWFObject provides accurate Flash Player detection and DOM Ready loading. - This plugin replaces the Graceful Degradation plugin. - - Features: - * swfupload_load_failed_hander event - * swfupload_pre_load_handler event - * minimum_flash_version setting (default: "9.0.28") - * SWFUpload.onload event for early loading - - Usage: - Provide handlers and settings as needed. When using the SWFUpload.SWFObject plugin you should initialize SWFUploading - in SWFUpload.onload rather than in window.onload. When initialized this way SWFUpload can load earlier preventing the UI flicker - that was seen using the Graceful Degradation plugin. - - - - Notes: - You must provide set minimum_flash_version setting to "8" if you are using SWFUpload for Flash Player 8. - The swfuploadLoadFailed event is only fired if the minimum version of Flash Player is not met. Other issues such as missing SWF files, browser bugs - or corrupt Flash Player installations will not trigger this event. - The swfuploadPreLoad event is fired as soon as the minimum version of Flash Player is found. It does not wait for SWFUpload to load and can - be used to prepare the SWFUploadUI and hide alternate content. - swfobject's onDomReady event is cross-browser safe but will default to the window.onload event when DOMReady is not supported by the browser. - Early DOM Loading is supported in major modern browsers but cannot be guaranteed for every browser ever made. -*/ - - -// SWFObject v2.1 must be loaded - -var SWFUpload; -if (typeof(SWFUpload) === "function") { - SWFUpload.onload = function () {}; - - swfobject.addDomLoadEvent(function () { - if (typeof(SWFUpload.onload) === "function") { - setTimeout(function(){SWFUpload.onload.call(window);}, 200); - } - }); - - SWFUpload.prototype.initSettings = (function (oldInitSettings) { - return function () { - if (typeof(oldInitSettings) === "function") { - oldInitSettings.call(this); - } - - this.ensureDefault = function (settingName, defaultValue) { - this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName]; - }; - - this.ensureDefault("minimum_flash_version", "9.0.28"); - this.ensureDefault("swfupload_pre_load_handler", null); - this.ensureDefault("swfupload_load_failed_handler", null); - - delete this.ensureDefault; - - }; - })(SWFUpload.prototype.initSettings); - - - SWFUpload.prototype.loadFlash = function (oldLoadFlash) { - return function () { - var hasFlash = swfobject.hasFlashPlayerVersion(this.settings.minimum_flash_version); - - if (hasFlash) { - this.queueEvent("swfupload_pre_load_handler"); - if (typeof(oldLoadFlash) === "function") { - oldLoadFlash.call(this); - } - } else { - this.queueEvent("swfupload_load_failed_handler"); - } - }; - - }(SWFUpload.prototype.loadFlash); - - SWFUpload.prototype.displayDebugInfo = function (oldDisplayDebugInfo) { - return function () { - if (typeof(oldDisplayDebugInfo) === "function") { - oldDisplayDebugInfo.call(this); - } - - this.debug( - [ - "SWFUpload.SWFObject Plugin settings:", "\n", - "\t", "minimum_flash_version: ", this.settings.minimum_flash_version, "\n", - "\t", "swfupload_pre_load_handler assigned: ", (typeof(this.settings.swfupload_pre_load_handler) === "function").toString(), "\n", - "\t", "swfupload_load_failed_handler assigned: ", (typeof(this.settings.swfupload_load_failed_handler) === "function").toString(), "\n", - ].join("") - ); - }; - }(SWFUpload.prototype.displayDebugInfo); -} diff --git a/wp/wp-includes/js/swfupload/swfupload.js b/wp/wp-includes/js/swfupload/swfupload.js deleted file mode 100644 index 444f5546..00000000 --- a/wp/wp-includes/js/swfupload/swfupload.js +++ /dev/null @@ -1,980 +0,0 @@ -/** - * SWFUpload: http://www.swfupload.org, http://swfupload.googlecode.com - * - * mmSWFUpload 1.0: Flash upload dialog - http://profandesign.se/swfupload/, http://www.vinterwebb.se/ - * - * SWFUpload is (c) 2006-2007 Lars Huring, Olov Nilzén and Mammon Media and is released under the MIT License: - * http://www.opensource.org/licenses/mit-license.php - * - * SWFUpload 2 is (c) 2007-2008 Jake Roberts and is released under the MIT License: - * http://www.opensource.org/licenses/mit-license.php - * - */ - - -/* ******************* */ -/* Constructor & Init */ -/* ******************* */ -var SWFUpload; - -if (SWFUpload == undefined) { - SWFUpload = function (settings) { - this.initSWFUpload(settings); - }; -} - -SWFUpload.prototype.initSWFUpload = function (settings) { - try { - this.customSettings = {}; // A container where developers can place their own settings associated with this instance. - this.settings = settings; - this.eventQueue = []; - this.movieName = "SWFUpload_" + SWFUpload.movieCount++; - this.movieElement = null; - - - // Setup global control tracking - SWFUpload.instances[this.movieName] = this; - - // Load the settings. Load the Flash movie. - this.initSettings(); - this.loadFlash(); - this.displayDebugInfo(); - } catch (ex) { - delete SWFUpload.instances[this.movieName]; - throw ex; - } -}; - -/* *************** */ -/* Static Members */ -/* *************** */ -SWFUpload.instances = {}; -SWFUpload.movieCount = 0; -SWFUpload.version = "2.2.0 2009-03-25"; -SWFUpload.QUEUE_ERROR = { - QUEUE_LIMIT_EXCEEDED : -100, - FILE_EXCEEDS_SIZE_LIMIT : -110, - ZERO_BYTE_FILE : -120, - INVALID_FILETYPE : -130 -}; -SWFUpload.UPLOAD_ERROR = { - HTTP_ERROR : -200, - MISSING_UPLOAD_URL : -210, - IO_ERROR : -220, - SECURITY_ERROR : -230, - UPLOAD_LIMIT_EXCEEDED : -240, - UPLOAD_FAILED : -250, - SPECIFIED_FILE_ID_NOT_FOUND : -260, - FILE_VALIDATION_FAILED : -270, - FILE_CANCELLED : -280, - UPLOAD_STOPPED : -290 -}; -SWFUpload.FILE_STATUS = { - QUEUED : -1, - IN_PROGRESS : -2, - ERROR : -3, - COMPLETE : -4, - CANCELLED : -5 -}; -SWFUpload.BUTTON_ACTION = { - SELECT_FILE : -100, - SELECT_FILES : -110, - START_UPLOAD : -120 -}; -SWFUpload.CURSOR = { - ARROW : -1, - HAND : -2 -}; -SWFUpload.WINDOW_MODE = { - WINDOW : "window", - TRANSPARENT : "transparent", - OPAQUE : "opaque" -}; - -// Private: takes a URL, determines if it is relative and converts to an absolute URL -// using the current site. Only processes the URL if it can, otherwise returns the URL untouched -SWFUpload.completeURL = function(url) { - if (typeof(url) !== "string" || url.match(/^https?:\/\//i) || url.match(/^\//)) { - return url; - } - - var currentURL = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ":" + window.location.port : ""); - - var indexSlash = window.location.pathname.lastIndexOf("/"); - if (indexSlash <= 0) { - path = "/"; - } else { - path = window.location.pathname.substr(0, indexSlash) + "/"; - } - - return /*currentURL +*/ path + url; - -}; - - -/* ******************** */ -/* Instance Members */ -/* ******************** */ - -// Private: initSettings ensures that all the -// settings are set, getting a default value if one was not assigned. -SWFUpload.prototype.initSettings = function () { - this.ensureDefault = function (settingName, defaultValue) { - this.settings[settingName] = (this.settings[settingName] == undefined) ? defaultValue : this.settings[settingName]; - }; - - // Upload backend settings - this.ensureDefault("upload_url", ""); - this.ensureDefault("preserve_relative_urls", false); - this.ensureDefault("file_post_name", "Filedata"); - this.ensureDefault("post_params", {}); - this.ensureDefault("use_query_string", false); - this.ensureDefault("requeue_on_error", false); - this.ensureDefault("http_success", []); - this.ensureDefault("assume_success_timeout", 0); - - // File Settings - this.ensureDefault("file_types", "*.*"); - this.ensureDefault("file_types_description", "All Files"); - this.ensureDefault("file_size_limit", 0); // Default zero means "unlimited" - this.ensureDefault("file_upload_limit", 0); - this.ensureDefault("file_queue_limit", 0); - - // Flash Settings - this.ensureDefault("flash_url", "swfupload.swf"); - this.ensureDefault("prevent_swf_caching", true); - - // Button Settings - this.ensureDefault("button_image_url", ""); - this.ensureDefault("button_width", 1); - this.ensureDefault("button_height", 1); - this.ensureDefault("button_text", ""); - this.ensureDefault("button_text_style", "color: #000000; font-size: 16pt;"); - this.ensureDefault("button_text_top_padding", 0); - this.ensureDefault("button_text_left_padding", 0); - this.ensureDefault("button_action", SWFUpload.BUTTON_ACTION.SELECT_FILES); - this.ensureDefault("button_disabled", false); - this.ensureDefault("button_placeholder_id", ""); - this.ensureDefault("button_placeholder", null); - this.ensureDefault("button_cursor", SWFUpload.CURSOR.ARROW); - this.ensureDefault("button_window_mode", SWFUpload.WINDOW_MODE.WINDOW); - - // Debug Settings - this.ensureDefault("debug", false); - this.settings.debug_enabled = this.settings.debug; // Here to maintain v2 API - - // Event Handlers - this.settings.return_upload_start_handler = this.returnUploadStart; - this.ensureDefault("swfupload_loaded_handler", null); - this.ensureDefault("file_dialog_start_handler", null); - this.ensureDefault("file_queued_handler", null); - this.ensureDefault("file_queue_error_handler", null); - this.ensureDefault("file_dialog_complete_handler", null); - - this.ensureDefault("upload_start_handler", null); - this.ensureDefault("upload_progress_handler", null); - this.ensureDefault("upload_error_handler", null); - this.ensureDefault("upload_success_handler", null); - this.ensureDefault("upload_complete_handler", null); - - this.ensureDefault("debug_handler", this.debugMessage); - - this.ensureDefault("custom_settings", {}); - - // Other settings - this.customSettings = this.settings.custom_settings; - - // Update the flash url if needed - if (!!this.settings.prevent_swf_caching) { - this.settings.flash_url = this.settings.flash_url + (this.settings.flash_url.indexOf("?") < 0 ? "?" : "&") + "preventswfcaching=" + new Date().getTime(); - } - - if (!this.settings.preserve_relative_urls) { - //this.settings.flash_url = SWFUpload.completeURL(this.settings.flash_url); // Don't need to do this one since flash doesn't look at it - this.settings.upload_url = SWFUpload.completeURL(this.settings.upload_url); - this.settings.button_image_url = SWFUpload.completeURL(this.settings.button_image_url); - } - - delete this.ensureDefault; -}; - -// Private: loadFlash replaces the button_placeholder element with the flash movie. -SWFUpload.prototype.loadFlash = function () { - var targetElement, tempParent; - - // Make sure an element with the ID we are going to use doesn't already exist - if (document.getElementById(this.movieName) !== null) { - throw "ID " + this.movieName + " is already in use. The Flash Object could not be added"; - } - - // Get the element where we will be placing the flash movie - targetElement = document.getElementById(this.settings.button_placeholder_id) || this.settings.button_placeholder; - - if (targetElement == undefined) { - throw "Could not find the placeholder element: " + this.settings.button_placeholder_id; - } - - // Append the container and load the flash - tempParent = document.createElement("div"); - tempParent.innerHTML = this.getFlashHTML(); // Using innerHTML is non-standard but the only sensible way to dynamically add Flash in IE (and maybe other browsers) - targetElement.parentNode.replaceChild(tempParent.firstChild, targetElement); - - // Fix IE Flash/Form bug - if (window[this.movieName] == undefined) { - window[this.movieName] = this.getMovieElement(); - } - -}; - -// Private: getFlashHTML generates the object tag needed to embed the flash in to the document -SWFUpload.prototype.getFlashHTML = function () { - // Flash Satay object syntax: http://www.alistapart.com/articles/flashsatay - return ['', - '', - '', - '', - '', - '', - '', - ''].join(""); -}; - -// Private: getFlashVars builds the parameter string that will be passed -// to flash in the flashvars param. -SWFUpload.prototype.getFlashVars = function () { - // Build a string from the post param object - var paramString = this.buildParamString(); - var httpSuccessString = this.settings.http_success.join(","); - - // Build the parameter string - return ["movieName=", encodeURIComponent(this.movieName), - "&uploadURL=", encodeURIComponent(this.settings.upload_url), - "&useQueryString=", encodeURIComponent(this.settings.use_query_string), - "&requeueOnError=", encodeURIComponent(this.settings.requeue_on_error), - "&httpSuccess=", encodeURIComponent(httpSuccessString), - "&assumeSuccessTimeout=", encodeURIComponent(this.settings.assume_success_timeout), - "&params=", encodeURIComponent(paramString), - "&filePostName=", encodeURIComponent(this.settings.file_post_name), - "&fileTypes=", encodeURIComponent(this.settings.file_types), - "&fileTypesDescription=", encodeURIComponent(this.settings.file_types_description), - "&fileSizeLimit=", encodeURIComponent(this.settings.file_size_limit), - "&fileUploadLimit=", encodeURIComponent(this.settings.file_upload_limit), - "&fileQueueLimit=", encodeURIComponent(this.settings.file_queue_limit), - "&debugEnabled=", encodeURIComponent(this.settings.debug_enabled), - "&buttonImageURL=", encodeURIComponent(this.settings.button_image_url), - "&buttonWidth=", encodeURIComponent(this.settings.button_width), - "&buttonHeight=", encodeURIComponent(this.settings.button_height), - "&buttonText=", encodeURIComponent(this.settings.button_text), - "&buttonTextTopPadding=", encodeURIComponent(this.settings.button_text_top_padding), - "&buttonTextLeftPadding=", encodeURIComponent(this.settings.button_text_left_padding), - "&buttonTextStyle=", encodeURIComponent(this.settings.button_text_style), - "&buttonAction=", encodeURIComponent(this.settings.button_action), - "&buttonDisabled=", encodeURIComponent(this.settings.button_disabled), - "&buttonCursor=", encodeURIComponent(this.settings.button_cursor) - ].join(""); -}; - -// Public: getMovieElement retrieves the DOM reference to the Flash element added by SWFUpload -// The element is cached after the first lookup -SWFUpload.prototype.getMovieElement = function () { - if (this.movieElement == undefined) { - this.movieElement = document.getElementById(this.movieName); - } - - if (this.movieElement === null) { - throw "Could not find Flash element"; - } - - return this.movieElement; -}; - -// Private: buildParamString takes the name/value pairs in the post_params setting object -// and joins them up in to a string formatted "name=value&name=value" -SWFUpload.prototype.buildParamString = function () { - var postParams = this.settings.post_params; - var paramStringPairs = []; - - if (typeof(postParams) === "object") { - for (var name in postParams) { - if (postParams.hasOwnProperty(name)) { - paramStringPairs.push(encodeURIComponent(name.toString()) + "=" + encodeURIComponent(postParams[name].toString())); - } - } - } - - return paramStringPairs.join("&"); -}; - -// Public: Used to remove a SWFUpload instance from the page. This method strives to remove -// all references to the SWF, and other objects so memory is properly freed. -// Returns true if everything was destroyed. Returns a false if a failure occurs leaving SWFUpload in an inconsistant state. -// Credits: Major improvements provided by steffen -SWFUpload.prototype.destroy = function () { - try { - // Make sure Flash is done before we try to remove it - this.cancelUpload(null, false); - - - // Remove the SWFUpload DOM nodes - var movieElement = null; - movieElement = this.getMovieElement(); - - if (movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE - // Loop through all the movie's properties and remove all function references (DOM/JS IE 6/7 memory leak workaround) - for (var i in movieElement) { - try { - if (typeof(movieElement[i]) === "function") { - movieElement[i] = null; - } - } catch (ex1) {} - } - - // Remove the Movie Element from the page - try { - movieElement.parentNode.removeChild(movieElement); - } catch (ex) {} - } - - // Remove IE form fix reference - window[this.movieName] = null; - - // Destroy other references - SWFUpload.instances[this.movieName] = null; - delete SWFUpload.instances[this.movieName]; - - this.movieElement = null; - this.settings = null; - this.customSettings = null; - this.eventQueue = null; - this.movieName = null; - - - return true; - } catch (ex2) { - return false; - } -}; - - -// Public: displayDebugInfo prints out settings and configuration -// information about this SWFUpload instance. -// This function (and any references to it) can be deleted when placing -// SWFUpload in production. -SWFUpload.prototype.displayDebugInfo = function () { - this.debug( - [ - "---SWFUpload Instance Info---\n", - "Version: ", SWFUpload.version, "\n", - "Movie Name: ", this.movieName, "\n", - "Settings:\n", - "\t", "upload_url: ", this.settings.upload_url, "\n", - "\t", "flash_url: ", this.settings.flash_url, "\n", - "\t", "use_query_string: ", this.settings.use_query_string.toString(), "\n", - "\t", "requeue_on_error: ", this.settings.requeue_on_error.toString(), "\n", - "\t", "http_success: ", this.settings.http_success.join(", "), "\n", - "\t", "assume_success_timeout: ", this.settings.assume_success_timeout, "\n", - "\t", "file_post_name: ", this.settings.file_post_name, "\n", - "\t", "post_params: ", this.settings.post_params.toString(), "\n", - "\t", "file_types: ", this.settings.file_types, "\n", - "\t", "file_types_description: ", this.settings.file_types_description, "\n", - "\t", "file_size_limit: ", this.settings.file_size_limit, "\n", - "\t", "file_upload_limit: ", this.settings.file_upload_limit, "\n", - "\t", "file_queue_limit: ", this.settings.file_queue_limit, "\n", - "\t", "debug: ", this.settings.debug.toString(), "\n", - - "\t", "prevent_swf_caching: ", this.settings.prevent_swf_caching.toString(), "\n", - - "\t", "button_placeholder_id: ", this.settings.button_placeholder_id.toString(), "\n", - "\t", "button_placeholder: ", (this.settings.button_placeholder ? "Set" : "Not Set"), "\n", - "\t", "button_image_url: ", this.settings.button_image_url.toString(), "\n", - "\t", "button_width: ", this.settings.button_width.toString(), "\n", - "\t", "button_height: ", this.settings.button_height.toString(), "\n", - "\t", "button_text: ", this.settings.button_text.toString(), "\n", - "\t", "button_text_style: ", this.settings.button_text_style.toString(), "\n", - "\t", "button_text_top_padding: ", this.settings.button_text_top_padding.toString(), "\n", - "\t", "button_text_left_padding: ", this.settings.button_text_left_padding.toString(), "\n", - "\t", "button_action: ", this.settings.button_action.toString(), "\n", - "\t", "button_disabled: ", this.settings.button_disabled.toString(), "\n", - - "\t", "custom_settings: ", this.settings.custom_settings.toString(), "\n", - "Event Handlers:\n", - "\t", "swfupload_loaded_handler assigned: ", (typeof this.settings.swfupload_loaded_handler === "function").toString(), "\n", - "\t", "file_dialog_start_handler assigned: ", (typeof this.settings.file_dialog_start_handler === "function").toString(), "\n", - "\t", "file_queued_handler assigned: ", (typeof this.settings.file_queued_handler === "function").toString(), "\n", - "\t", "file_queue_error_handler assigned: ", (typeof this.settings.file_queue_error_handler === "function").toString(), "\n", - "\t", "upload_start_handler assigned: ", (typeof this.settings.upload_start_handler === "function").toString(), "\n", - "\t", "upload_progress_handler assigned: ", (typeof this.settings.upload_progress_handler === "function").toString(), "\n", - "\t", "upload_error_handler assigned: ", (typeof this.settings.upload_error_handler === "function").toString(), "\n", - "\t", "upload_success_handler assigned: ", (typeof this.settings.upload_success_handler === "function").toString(), "\n", - "\t", "upload_complete_handler assigned: ", (typeof this.settings.upload_complete_handler === "function").toString(), "\n", - "\t", "debug_handler assigned: ", (typeof this.settings.debug_handler === "function").toString(), "\n" - ].join("") - ); -}; - -/* Note: addSetting and getSetting are no longer used by SWFUpload but are included - the maintain v2 API compatibility -*/ -// Public: (Deprecated) addSetting adds a setting value. If the value given is undefined or null then the default_value is used. -SWFUpload.prototype.addSetting = function (name, value, default_value) { - if (value == undefined) { - return (this.settings[name] = default_value); - } else { - return (this.settings[name] = value); - } -}; - -// Public: (Deprecated) getSetting gets a setting. Returns an empty string if the setting was not found. -SWFUpload.prototype.getSetting = function (name) { - if (this.settings[name] != undefined) { - return this.settings[name]; - } - - return ""; -}; - - - -// Private: callFlash handles function calls made to the Flash element. -// Calls are made with a setTimeout for some functions to work around -// bugs in the ExternalInterface library. -SWFUpload.prototype.callFlash = function (functionName, argumentArray) { - argumentArray = argumentArray || []; - - var movieElement = this.getMovieElement(); - var returnValue, returnString; - - // Flash's method if calling ExternalInterface methods (code adapted from MooTools). - try { - returnString = movieElement.CallFunction('' + __flash__argumentsToXML(argumentArray, 0) + ''); - returnValue = eval(returnString); - } catch (ex) { - throw "Call to " + functionName + " failed"; - } - - // Unescape file post param values - if (returnValue != undefined && typeof returnValue.post === "object") { - returnValue = this.unescapeFilePostParams(returnValue); - } - - return returnValue; -}; - -/* ***************************** - -- Flash control methods -- - Your UI should use these - to operate SWFUpload - ***************************** */ - -// WARNING: this function does not work in Flash Player 10 -// Public: selectFile causes a File Selection Dialog window to appear. This -// dialog only allows 1 file to be selected. -SWFUpload.prototype.selectFile = function () { - this.callFlash("SelectFile"); -}; - -// WARNING: this function does not work in Flash Player 10 -// Public: selectFiles causes a File Selection Dialog window to appear/ This -// dialog allows the user to select any number of files -// Flash Bug Warning: Flash limits the number of selectable files based on the combined length of the file names. -// If the selection name length is too long the dialog will fail in an unpredictable manner. There is no work-around -// for this bug. -SWFUpload.prototype.selectFiles = function () { - this.callFlash("SelectFiles"); -}; - - -// Public: startUpload starts uploading the first file in the queue unless -// the optional parameter 'fileID' specifies the ID -SWFUpload.prototype.startUpload = function (fileID) { - this.callFlash("StartUpload", [fileID]); -}; - -// Public: cancelUpload cancels any queued file. The fileID parameter may be the file ID or index. -// If you do not specify a fileID the current uploading file or first file in the queue is cancelled. -// If you do not want the uploadError event to trigger you can specify false for the triggerErrorEvent parameter. -SWFUpload.prototype.cancelUpload = function (fileID, triggerErrorEvent) { - if (triggerErrorEvent !== false) { - triggerErrorEvent = true; - } - this.callFlash("CancelUpload", [fileID, triggerErrorEvent]); -}; - -// Public: stopUpload stops the current upload and requeues the file at the beginning of the queue. -// If nothing is currently uploading then nothing happens. -SWFUpload.prototype.stopUpload = function () { - this.callFlash("StopUpload"); -}; - -/* ************************ - * Settings methods - * These methods change the SWFUpload settings. - * SWFUpload settings should not be changed directly on the settings object - * since many of the settings need to be passed to Flash in order to take - * effect. - * *********************** */ - -// Public: getStats gets the file statistics object. -SWFUpload.prototype.getStats = function () { - return this.callFlash("GetStats"); -}; - -// Public: setStats changes the SWFUpload statistics. You shouldn't need to -// change the statistics but you can. Changing the statistics does not -// affect SWFUpload accept for the successful_uploads count which is used -// by the upload_limit setting to determine how many files the user may upload. -SWFUpload.prototype.setStats = function (statsObject) { - this.callFlash("SetStats", [statsObject]); -}; - -// Public: getFile retrieves a File object by ID or Index. If the file is -// not found then 'null' is returned. -SWFUpload.prototype.getFile = function (fileID) { - if (typeof(fileID) === "number") { - return this.callFlash("GetFileByIndex", [fileID]); - } else { - return this.callFlash("GetFile", [fileID]); - } -}; - -// Public: addFileParam sets a name/value pair that will be posted with the -// file specified by the Files ID. If the name already exists then the -// exiting value will be overwritten. -SWFUpload.prototype.addFileParam = function (fileID, name, value) { - return this.callFlash("AddFileParam", [fileID, name, value]); -}; - -// Public: removeFileParam removes a previously set (by addFileParam) name/value -// pair from the specified file. -SWFUpload.prototype.removeFileParam = function (fileID, name) { - this.callFlash("RemoveFileParam", [fileID, name]); -}; - -// Public: setUploadUrl changes the upload_url setting. -SWFUpload.prototype.setUploadURL = function (url) { - this.settings.upload_url = url.toString(); - this.callFlash("SetUploadURL", [url]); -}; - -// Public: setPostParams changes the post_params setting -SWFUpload.prototype.setPostParams = function (paramsObject) { - this.settings.post_params = paramsObject; - this.callFlash("SetPostParams", [paramsObject]); -}; - -// Public: addPostParam adds post name/value pair. Each name can have only one value. -SWFUpload.prototype.addPostParam = function (name, value) { - this.settings.post_params[name] = value; - this.callFlash("SetPostParams", [this.settings.post_params]); -}; - -// Public: removePostParam deletes post name/value pair. -SWFUpload.prototype.removePostParam = function (name) { - delete this.settings.post_params[name]; - this.callFlash("SetPostParams", [this.settings.post_params]); -}; - -// Public: setFileTypes changes the file_types setting and the file_types_description setting -SWFUpload.prototype.setFileTypes = function (types, description) { - this.settings.file_types = types; - this.settings.file_types_description = description; - this.callFlash("SetFileTypes", [types, description]); -}; - -// Public: setFileSizeLimit changes the file_size_limit setting -SWFUpload.prototype.setFileSizeLimit = function (fileSizeLimit) { - this.settings.file_size_limit = fileSizeLimit; - this.callFlash("SetFileSizeLimit", [fileSizeLimit]); -}; - -// Public: setFileUploadLimit changes the file_upload_limit setting -SWFUpload.prototype.setFileUploadLimit = function (fileUploadLimit) { - this.settings.file_upload_limit = fileUploadLimit; - this.callFlash("SetFileUploadLimit", [fileUploadLimit]); -}; - -// Public: setFileQueueLimit changes the file_queue_limit setting -SWFUpload.prototype.setFileQueueLimit = function (fileQueueLimit) { - this.settings.file_queue_limit = fileQueueLimit; - this.callFlash("SetFileQueueLimit", [fileQueueLimit]); -}; - -// Public: setFilePostName changes the file_post_name setting -SWFUpload.prototype.setFilePostName = function (filePostName) { - this.settings.file_post_name = filePostName; - this.callFlash("SetFilePostName", [filePostName]); -}; - -// Public: setUseQueryString changes the use_query_string setting -SWFUpload.prototype.setUseQueryString = function (useQueryString) { - this.settings.use_query_string = useQueryString; - this.callFlash("SetUseQueryString", [useQueryString]); -}; - -// Public: setRequeueOnError changes the requeue_on_error setting -SWFUpload.prototype.setRequeueOnError = function (requeueOnError) { - this.settings.requeue_on_error = requeueOnError; - this.callFlash("SetRequeueOnError", [requeueOnError]); -}; - -// Public: setHTTPSuccess changes the http_success setting -SWFUpload.prototype.setHTTPSuccess = function (http_status_codes) { - if (typeof http_status_codes === "string") { - http_status_codes = http_status_codes.replace(" ", "").split(","); - } - - this.settings.http_success = http_status_codes; - this.callFlash("SetHTTPSuccess", [http_status_codes]); -}; - -// Public: setHTTPSuccess changes the http_success setting -SWFUpload.prototype.setAssumeSuccessTimeout = function (timeout_seconds) { - this.settings.assume_success_timeout = timeout_seconds; - this.callFlash("SetAssumeSuccessTimeout", [timeout_seconds]); -}; - -// Public: setDebugEnabled changes the debug_enabled setting -SWFUpload.prototype.setDebugEnabled = function (debugEnabled) { - this.settings.debug_enabled = debugEnabled; - this.callFlash("SetDebugEnabled", [debugEnabled]); -}; - -// Public: setButtonImageURL loads a button image sprite -SWFUpload.prototype.setButtonImageURL = function (buttonImageURL) { - if (buttonImageURL == undefined) { - buttonImageURL = ""; - } - - this.settings.button_image_url = buttonImageURL; - this.callFlash("SetButtonImageURL", [buttonImageURL]); -}; - -// Public: setButtonDimensions resizes the Flash Movie and button -SWFUpload.prototype.setButtonDimensions = function (width, height) { - this.settings.button_width = width; - this.settings.button_height = height; - - var movie = this.getMovieElement(); - if (movie != undefined) { - movie.style.width = width + "px"; - movie.style.height = height + "px"; - } - - this.callFlash("SetButtonDimensions", [width, height]); -}; -// Public: setButtonText Changes the text overlaid on the button -SWFUpload.prototype.setButtonText = function (html) { - this.settings.button_text = html; - this.callFlash("SetButtonText", [html]); -}; -// Public: setButtonTextPadding changes the top and left padding of the text overlay -SWFUpload.prototype.setButtonTextPadding = function (left, top) { - this.settings.button_text_top_padding = top; - this.settings.button_text_left_padding = left; - this.callFlash("SetButtonTextPadding", [left, top]); -}; - -// Public: setButtonTextStyle changes the CSS used to style the HTML/Text overlaid on the button -SWFUpload.prototype.setButtonTextStyle = function (css) { - this.settings.button_text_style = css; - this.callFlash("SetButtonTextStyle", [css]); -}; -// Public: setButtonDisabled disables/enables the button -SWFUpload.prototype.setButtonDisabled = function (isDisabled) { - this.settings.button_disabled = isDisabled; - this.callFlash("SetButtonDisabled", [isDisabled]); -}; -// Public: setButtonAction sets the action that occurs when the button is clicked -SWFUpload.prototype.setButtonAction = function (buttonAction) { - this.settings.button_action = buttonAction; - this.callFlash("SetButtonAction", [buttonAction]); -}; - -// Public: setButtonCursor changes the mouse cursor displayed when hovering over the button -SWFUpload.prototype.setButtonCursor = function (cursor) { - this.settings.button_cursor = cursor; - this.callFlash("SetButtonCursor", [cursor]); -}; - -/* ******************************* - Flash Event Interfaces - These functions are used by Flash to trigger the various - events. - - All these functions a Private. - - Because the ExternalInterface library is buggy the event calls - are added to a queue and the queue then executed by a setTimeout. - This ensures that events are executed in a determinate order and that - the ExternalInterface bugs are avoided. -******************************* */ - -SWFUpload.prototype.queueEvent = function (handlerName, argumentArray) { - // Warning: Don't call this.debug inside here or you'll create an infinite loop - - if (argumentArray == undefined) { - argumentArray = []; - } else if (!(argumentArray instanceof Array)) { - argumentArray = [argumentArray]; - } - - var self = this; - if (typeof this.settings[handlerName] === "function") { - // Queue the event - this.eventQueue.push(function () { - this.settings[handlerName].apply(this, argumentArray); - }); - - // Execute the next queued event - setTimeout(function () { - self.executeNextEvent(); - }, 0); - - } else if (this.settings[handlerName] !== null) { - throw "Event handler " + handlerName + " is unknown or is not a function"; - } -}; - -// Private: Causes the next event in the queue to be executed. Since events are queued using a setTimeout -// we must queue them in order to garentee that they are executed in order. -SWFUpload.prototype.executeNextEvent = function () { - // Warning: Don't call this.debug inside here or you'll create an infinite loop - - var f = this.eventQueue ? this.eventQueue.shift() : null; - if (typeof(f) === "function") { - f.apply(this); - } -}; - -// Private: unescapeFileParams is part of a workaround for a flash bug where objects passed through ExternalInterface cannot have -// properties that contain characters that are not valid for JavaScript identifiers. To work around this -// the Flash Component escapes the parameter names and we must unescape again before passing them along. -SWFUpload.prototype.unescapeFilePostParams = function (file) { - var reg = /[$]([0-9a-f]{4})/i; - var unescapedPost = {}; - var uk; - - if (file != undefined) { - for (var k in file.post) { - if (file.post.hasOwnProperty(k)) { - uk = k; - var match; - while ((match = reg.exec(uk)) !== null) { - uk = uk.replace(match[0], String.fromCharCode(parseInt("0x" + match[1], 16))); - } - unescapedPost[uk] = file.post[k]; - } - } - - file.post = unescapedPost; - } - - return file; -}; - -// Private: Called by Flash to see if JS can call in to Flash (test if External Interface is working) -SWFUpload.prototype.testExternalInterface = function () { - try { - return this.callFlash("TestExternalInterface"); - } catch (ex) { - return false; - } -}; - -// Private: This event is called by Flash when it has finished loading. Don't modify this. -// Use the swfupload_loaded_handler event setting to execute custom code when SWFUpload has loaded. -SWFUpload.prototype.flashReady = function () { - // Check that the movie element is loaded correctly with its ExternalInterface methods defined - var movieElement = this.getMovieElement(); - - if (!movieElement) { - this.debug("Flash called back ready but the flash movie can't be found."); - return; - } - - this.cleanUp(movieElement); - - this.queueEvent("swfupload_loaded_handler"); -}; - -// Private: removes Flash added fuctions to the DOM node to prevent memory leaks in IE. -// This function is called by Flash each time the ExternalInterface functions are created. -SWFUpload.prototype.cleanUp = function (movieElement) { - // Pro-actively unhook all the Flash functions - try { - if (this.movieElement && typeof(movieElement.CallFunction) === "unknown") { // We only want to do this in IE - this.debug("Removing Flash functions hooks (this should only run in IE and should prevent memory leaks)"); - for (var key in movieElement) { - try { - if (typeof(movieElement[key]) === "function") { - movieElement[key] = null; - } - } catch (ex) { - } - } - } - } catch (ex1) { - - } - - // Fix Flashes own cleanup code so if the SWFMovie was removed from the page - // it doesn't display errors. - window["__flash__removeCallback"] = function (instance, name) { - try { - if (instance) { - instance[name] = null; - } - } catch (flashEx) { - - } - }; - -}; - - -/* This is a chance to do something before the browse window opens */ -SWFUpload.prototype.fileDialogStart = function () { - this.queueEvent("file_dialog_start_handler"); -}; - - -/* Called when a file is successfully added to the queue. */ -SWFUpload.prototype.fileQueued = function (file) { - file = this.unescapeFilePostParams(file); - this.queueEvent("file_queued_handler", file); -}; - - -/* Handle errors that occur when an attempt to queue a file fails. */ -SWFUpload.prototype.fileQueueError = function (file, errorCode, message) { - file = this.unescapeFilePostParams(file); - this.queueEvent("file_queue_error_handler", [file, errorCode, message]); -}; - -/* Called after the file dialog has closed and the selected files have been queued. - You could call startUpload here if you want the queued files to begin uploading immediately. */ -SWFUpload.prototype.fileDialogComplete = function (numFilesSelected, numFilesQueued, numFilesInQueue) { - this.queueEvent("file_dialog_complete_handler", [numFilesSelected, numFilesQueued, numFilesInQueue]); -}; - -SWFUpload.prototype.uploadStart = function (file) { - file = this.unescapeFilePostParams(file); - this.queueEvent("return_upload_start_handler", file); -}; - -SWFUpload.prototype.returnUploadStart = function (file) { - var returnValue; - if (typeof this.settings.upload_start_handler === "function") { - file = this.unescapeFilePostParams(file); - returnValue = this.settings.upload_start_handler.call(this, file); - } else if (this.settings.upload_start_handler != undefined) { - throw "upload_start_handler must be a function"; - } - - // Convert undefined to true so if nothing is returned from the upload_start_handler it is - // interpretted as 'true'. - if (returnValue === undefined) { - returnValue = true; - } - - returnValue = !!returnValue; - - this.callFlash("ReturnUploadStart", [returnValue]); -}; - - - -SWFUpload.prototype.uploadProgress = function (file, bytesComplete, bytesTotal) { - file = this.unescapeFilePostParams(file); - this.queueEvent("upload_progress_handler", [file, bytesComplete, bytesTotal]); -}; - -SWFUpload.prototype.uploadError = function (file, errorCode, message) { - file = this.unescapeFilePostParams(file); - this.queueEvent("upload_error_handler", [file, errorCode, message]); -}; - -SWFUpload.prototype.uploadSuccess = function (file, serverData, responseReceived) { - file = this.unescapeFilePostParams(file); - this.queueEvent("upload_success_handler", [file, serverData, responseReceived]); -}; - -SWFUpload.prototype.uploadComplete = function (file) { - file = this.unescapeFilePostParams(file); - this.queueEvent("upload_complete_handler", file); -}; - -/* Called by SWFUpload JavaScript and Flash functions when debug is enabled. By default it writes messages to the - internal debug console. You can override this event and have messages written where you want. */ -SWFUpload.prototype.debug = function (message) { - this.queueEvent("debug_handler", message); -}; - - -/* ********************************** - Debug Console - The debug console is a self contained, in page location - for debug message to be sent. The Debug Console adds - itself to the body if necessary. - - The console is automatically scrolled as messages appear. - - If you are using your own debug handler or when you deploy to production and - have debug disabled you can remove these functions to reduce the file size - and complexity. -********************************** */ - -// Private: debugMessage is the default debug_handler. If you want to print debug messages -// call the debug() function. When overriding the function your own function should -// check to see if the debug setting is true before outputting debug information. -SWFUpload.prototype.debugMessage = function (message) { - if (this.settings.debug) { - var exceptionMessage, exceptionValues = []; - - // Check for an exception object and print it nicely - if (typeof message === "object" && typeof message.name === "string" && typeof message.message === "string") { - for (var key in message) { - if (message.hasOwnProperty(key)) { - exceptionValues.push(key + ": " + message[key]); - } - } - exceptionMessage = exceptionValues.join("\n") || ""; - exceptionValues = exceptionMessage.split("\n"); - exceptionMessage = "EXCEPTION: " + exceptionValues.join("\nEXCEPTION: "); - SWFUpload.Console.writeLine(exceptionMessage); - } else { - SWFUpload.Console.writeLine(message); - } - } -}; - -SWFUpload.Console = {}; -SWFUpload.Console.writeLine = function (message) { - var console, documentForm; - - try { - console = document.getElementById("SWFUpload_Console"); - - if (!console) { - documentForm = document.createElement("form"); - document.getElementsByTagName("body")[0].appendChild(documentForm); - - console = document.createElement("textarea"); - console.id = "SWFUpload_Console"; - console.style.fontFamily = "monospace"; - console.setAttribute("wrap", "off"); - console.wrap = "off"; - console.style.overflow = "auto"; - console.style.width = "700px"; - console.style.height = "350px"; - console.style.margin = "5px"; - documentForm.appendChild(console); - } - - console.value += message + "\n"; - - console.scrollTop = console.scrollHeight - console.clientHeight; - } catch (ex) { - alert("Exception: " + ex.name + " Message: " + ex.message); - } -}; diff --git a/wp/wp-includes/js/swfupload/swfupload.swf b/wp/wp-includes/js/swfupload/swfupload.swf deleted file mode 100644 index 7d94bbab5d3d0770bf0f3a7d7d6f438f82465df1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13133 zcmV-TGqTJ>S5ppSV*mhn+Qof&d|Sn}|DAiUG?KhYa#n{VH^F2viethWCxke*l{h3; z@WSpmSF#ivWXqN0EVQo;fv^)2mav0a+5!oL77DaLY0JJ=mYbx|mTt7AdrMo|Qoz6O znYp@>vhaKF_x|{~oVoX$IdkUBnKNh3%vC?J}#Q#2Jx_6?@{5(5U|W;ijFK6UnNOKMNV7CJbTj0=%Hk@?Yhv_CqK zPR&2A_BaUYiPXmu$$m4v#2g%q_eD$+H-FQ-RBs}3;YM>qbY3iOrg|68&ofe+bYD6i zUDD8#2uF=zJi5s^!Dz_07u=GCn0xYyE-4tMNv&%miT?S6$wbdk1UkhaN;EEPLLvr- z!tuUTZ#21NXyC$u#75ago=QBCWYkP2iaByLs*jrk>xazs(Iw5TqRz&Jj%GT#WaUuY zSa3qXSWtJ|@lp+H+v z#T?g0H;`j^Rwss1(Pnygh>|Z$B;rwXplnStu|641r3BT}(bpeMidT1&nKs3nE7%v0 zwxpx|&h~V&Z(x1JijIyo?P)VTBpa2sgqoAdgly(-k4A=)ed*14lA|G+G&eg#;R~XX zw6k@nKO9ZErE&w&w5PLeRa^9PL(x=PAL<)Omr-wR(O5JY9f(BTwuQ@Ni=MvJU>wrg z2hmBiG(6N7@97>8GAoF8&8kpCld+(7L2X?{43d^56B|>}25(nPyMp8Z=ff-$)6gEL}0SmP`rCcD3>Y~t-7N$=v0{`TA0_u zA|`r`$D=*vg10Bvbo>T0-q#~Lif&3r2U76HR0UMp5KYn~h&d^d!yiib#ZwMJ@tdjC zP=B;t>LN*)NGyzK^QLsmKw6M0d(Bj%N!l4S5#8P8B*gMZK6#Rvux9+>uExTn0@Y7Nn z-i0rlo7GL?;?0!e_vWSr}S)rm)jw3SC>Cr+CpvJjiILI?lU@@JDa;#wXAOG=x#o{ zvAMaaxoKuWeXwO!vsKaFE!qp-$ptL7e8D`Wpr)nu%!XAhO@iKW&YI@&1$7i;y9GYA zfV#S+y}hM%dAE#n-I#*PLU|$CqOkY&=ElypmX32|jZsiz$tWJ%q(d2k4N$LXR-w!_ z&5bR=mS(AWH%8DJ>gW!JI$N7&9Bdmg!iJ8PP^%?q^1&R94XusMs}8EM`fl$CtyzPb zWt|-zkkHU51hqG>YHsWht*ee$(|&MOM?+hOCAZS5f@#{(V*~m<%U?`e(a_p7p|Lj_ zx$uynF}~w)p=3gPG(9wU2zjCv4|CDKdxbgB6OSfKLxa(Q95Rl!COZmR#Hxlv0(`E@ zYezeaFtNROyU5Y~d3ugi)>#-vedK2{&RX>q)^?u5#~1DBIcjA)a?VJ)n>N;h&IAox zX^vEGku20BQ5tPY{x#)kPbUVYTBXuZ)}G%c!=A)k%cE&p%PCj8^}<0R0p-?n+2$77 zpGzBhdW1nuq+%6qQAF~njhCWvXD*ZxITDw$CEv<93Bb z$!!wE(ODGAiPBaS&0(XoNU7wEU@FrMhl%MVx~U+nlb~fq(bzB1Mr7<4S_b!Z4pO?i zEFTCf?Pg7oE0c{fn??cHUxdk+T|}~?v#&ss46YS6MTYD=E~9pd*!`seeQj7S$$`#% zR#4tqw2_yI#h06cJVvuqx{UHZD{XWLtCX*Sb)|t?24V@UsDU2g4J`xq6jc&YWU~XZ zM757LM8cXkS=K1eZR^r2W+ZI~vXe)V*HQ)<9f&4Vp5AnSyg3yyp;&JHQySqJv~vTo zy>};b?bW^>he#z$1U)5^X$|_jFGzJKL<<+3SSU~;9ay}VEtmc(h59=ZE6ojNyT~vk z$(2q>H*<7Srl|LueFM(+KC-CCHbYN&uqc1?2Mx(3Z;iUy-&JpDY97^1kY zr=szgmEusM;Yc8u#mcP%m*oMzL$(4pCaW(_D`lLuy)}kbuff*e+>ITwK~E+U>5}Hw zj^?)RU|YlLW-r!Rk*7K3_U4qsalmcXM-e+wHpKhZ54f;dcCTsWR8qL*4C-4Xc{nDVr1=8W0QB7fC=#bR?2PT0gE_E>R*95os|O6l(0n%5yZXYH2*( zvpUq-4&6g%wYubM=NgL^ISxIxylQzRv2=!2+zdngc?Qw=tjSVU#b|tDUgH3u65~64IBJp*tN7LTE zNXi|KuJ5Dp5qI?@&5do~=1~z<;+98{W!WaS*%P;|=@}#k!@5eQw4r32oi@X|GRa?; zG_)T-e?eW{N%QGQo9-LnB0hv-&eTvil}?u992eR+fJHbMO{O=GD>@C=%jCSenAjwr za=|rXf)NX%$?3&R!a3pUeH*NmIps5i994LwP%m7Q>diDPo^-ZF*Eeq(^q;rZoOe;f zymRa3Ej+*b{Mz&9b+Pq48HE&NPWExWwr>FLi-n&$Z)VxduG;*O)K6IPVYJL5$>`-P z#6%bxU(_TQ!^%M|ICT1KG#AP83_^-G&u`^MHX$d{1&TOYO~T7z50oBMSVu|Kn8W5e z#muL~9SU}0Q>&@1aW}-{hDdx6RfckBs@x_z(YBG%GSHVca(z2GT2?o=(V|bL)#xU7 zPog!E?nRK*u+2C=M;V58VRZBKLsT-7(LM-*ZLmCgN@xvRXWYrTmz1#)GZ-}n5@{n9 zP1hT|Uq*9>u*@l9s_TtIZCo$LVMwB}5k8yPXxKL$wX>~;#dbI5gw`~-&b8XMG}Rk= z3aXWaH^ZbN1Yu>;dq*N|#`P4E!*VfrJ6;-xm0KXtU27~O3F1wNsW&EAjf#@1dSkjV zh$D2g2im85k!Kn5<^@(u4I&$e>NIWBi#oL1+Wn0)+AMawM50(tJusp{d3U|xl>56g z9vxVp?ya#zQ3Mdytv5Q7=0GZLV%4uVB(D)c5HWm4I#Jvu4-bXIlrc*ilf%>$sb)!} zpe@gOMuCuoC<>E5XDyObeAGf1&yqF>N^gxl2`Z~!t6nJ>p~#38k| zwsuZ|>*fQ7(9@D87NRl7m}^8gMWWH36lR{%CXyyv804JB9CdE3xC4|Eqz?|IdZ!*N zyrlxg|JBYAHGL^jX$}}zor#S!U?K~Sy3drE8-P$aPUn$Y zSs@6y+MHC$aO`JFgf16FlL^AqzAFz zK)kqGCYhF~cD!RW()DVMhJ&XUOHyR%0K{%*SlmpPG-KYx4Pw3Fx8_dX7KV6bd}tum+ZRjEJ6zzAh(R%X5Z2GH2DPQhI!GApva&dc=Vqm# z$<+L{z?`{5r1as!P%5&l+VO`CvXcwt$YvF=T%|PWh<>JCZn_^$m0nTAQc1+fK=^A3f@YVfWheQ#D@zRF|X^tKbXCMiZOi z+Vgvkb@WrlCyz$RG8}!WRI(V0L?vEpgFtpH3lV zL#ZfjSn_gXdBNodIi%$yW;{t*EdrX6GqrF=LnLzKktU3S>?`LFWd(AOzSurg8SG1@ z(w37C$XRbWtan&Fi};SsjLt(n)Thy(Nai+EIBHRtoY~Qv!>oolaDXE^U`sgeu$@`@ ziJ6VjNy=6ZsnuaCX^R#N_Npn!(hE1xV-K>ZwZv106BR$?ItfD*%L8+W{-xbEVoX?T zBKpJ<$-?;1kxLx<&CMA5hNv98oy*d$lM6jM<*%;XeMEWj6}u~!q)x5P%|vJ0Dnt4v zg{Nr$V0v@yl+UQ^Ib<+%a@jI%cZ0M$g*QtNvc!mJA@)FWx4xqB)fz^7&e^OfMieX; z9JaBYvS#)nUDq4-24o~6B6v}5D?Vw1-q89} z>m78fl45;RJ@e?#u&a$wXUCe(4uhzkN#dr~&j0g&lkD%Sg;c7@FO1@vNkUg~Id918 zMXP?&8j9mGlb7|mio$KCP?#Dhl2-7Qw%)3st0Y5Q>D%qNOg}x73R8eW7Fi+B3`I@L zgc;>^a=mAgail+K$mZ6jBN&q{Vl|FgX8+(Ke@~QlL4+OhnZyA7U_)LM!7P>X#=7Y0 zP&<3|D(goVoBHD%SS#9>SWhy8yQBH+j_%e_Q!_Sv(5)YP9CXW5R&*icJLLLk!r^b7 zbPC4m`R9AY?NHskh2351`ab8{^YGfms`Wbjc_O`LvJu)eq*=F4cju+zmp+&koTH;U z6*h&wYIyq-J$*6j=SfWm6Ntk@_nOH>yt}WbBKIp6W1fh2uAu?B1l047)hXA}Dc3P3 zunF2kHo-q(;-m=IX%u9k7NoU;nfyqx*CUdh=wu8-$z0(VT}d@|=#xPBDp zQ#qf;`EpZoCi3c$9XO1^Et2M{5Z}RaDF`J zCvbiu=O=M~GUumozL4{J&KGgMnDbLPU&8rmoG<0Pf%9dYH*(&@c{Arh&X;q(f;(C` zU&-C8IA6_qE9W83*KmFY=WU#~bKb#uC+BB!eir9vbAArz=W>1?=jU_Y#ray!yE$LS zxygB$^9biXoJTp2alW4OUe5bCzku@#IgfMR&-no73C;&O{~YH@&QqMHIUnMD1Lqq# z-^BT5&M)Hp^PGQy^Z(-fi=2On^DT_?ive2!mjEsWYy(^dxEyc=;7Y(%fU5!50ImgW z2V4i(0oVz+9&iKTM!-#gU4WYbw*YPh+y=NEa0lQ{z+Hg50mFcM0QUm!1KbbzGT3M_W;iWUI1Lg*^78U6^8EFON^Jl40r|bD&RGUejW5T0B-``0(>8k z0gM2$fKk8?0Q=D0e!u~|{}9i&8L#*e-hT}E3E*A8PXRvz{2cHLz%Lnhyocwn0Kdlj zZ}5B{@LRy|0KW(P0q{q_p8$Ub`~~n=zz2Z80shXo`yY6I2>2)7|Aptj0UzQ0KX`r& z_yq7NU<|NDR=_2IO99&emjNyZTmiTea24Qcz%_tt0owuBsoZ-#;0C~r>J;X# zhrru_+^M=3G52ETUc%g`G4~@Xb1!G^rOe&H+{>7|k-3|gyP3IfV$2<6?p=6;vov{21_4 z)%~8zxc65o*FOOMH`V9j z+coCSf=9bsBe*zYlOf;L93!e+AF40v-VD2J8Vm1^6c5TY#ql-_hJhGxv1n z{sxWcd!W1kcu{koz}zwBzMph^4YIKywAb-`4*I>Ras4g8_raL~i~xQB9S;C*2hTfz z9|3+0`d>i%E1n+!{-*Is{{Vc5_kU{ce`$=X|JJzUBfx(EAA|mhHbr$m%CsrE`%+zp zZFKhwn(lsH)!qMOIy?$+h3>vm$MY)PeKmN#0iO2|@--}E?HW8EXYR{D_dwiseToCd za=4#m+JN}MDa!+6>X8b~;!+e=>)n1^U3RFv9$ zq9~K%EP&ix6Y57PCl)Ho-BeUSsP1;-9Y!Dub6X5(m&YsYLZG@`5TC5j?OIiiPh}Mq zic4i0{>O5n1Tn{5DAmR2PbYCySK&gTqforEUW|oRkQ`TDFHsOH>6-hqI&xzWI&)Xh zKK+dnTq#se z*u79)MXwy^b}A)1*m$Snu3{4uWuh`kQT(N)lNF^*sZtbIY3UStJxWn3RBfs#r-^d9 zC=F50AeNbma&&2FwJ484smwwL9?xu2Vh$B^si>jiSSkWk%%h@~iuqL3QE?m<3#d4r ziW8_fk&2V3IGH@@6na}oMLiTy76~mDi}F;_>k?6(MtUt3%9N z%5oC0f&{csv69f!saQqmYARZ(2vM zdhA8%*ZP=JdI3|)E@Vo1oGBIkOz{pd#g|};e~>AapJU3nBvZzxm@*;Fl!-%3nY4i^ zlQ%M@Y7@dSYbzBjG}rgieoN8G3!zk zv$vs`a~X=cm!qh;0>!acq6l1tV&2s#YOg^t|5_Av+ff{M9f}1zP#nJ##R=D=IPnG) zC*6qRWbAdyDcI?hg*T(9#}=n7x)sIZ+fbZ}jZayE{Z2Uzdz`Wq`<>E&y-it$jZSIA z-ljC&i=z2H6hVY_W%-v;toRCwman2%i7ibz{XzJ?N9j^rHvtW6jgd=RD&XpCm1yOV_0_&?x(e^UG_8L?4y{uAuohgpJY@GH6Q=EI* zczeU1piGrE=eLu|Ie`3@@6dc|1pVWm(O>SeEUq**}ssv&^NsSanZ1;@{dV zt5!e(tFEdZk9XZD3*EpJJVrv8YS0}-F9%_kd4^RBsxwEOT}b6bok)#iKVYI_mboTh z?V{>&cB9#ab?(oo^I+HV@OArGsE^PRhwhp8?HW?O#t>|mWgf5qdx%} zm*~4}-A`HUXUzOL6UZ-E?3c`Zk7c?VS2ilW%c5+ly5(1_AFRt_zh>)7V!vTg7FT6! zLGr}jFCe`OIm<%7Wgun9HbSZz`yE@V+dZnW-?OET0`w1Tsj~q6BU{P~&_A)IE*sTi ze`ZVF0_|#E*{t+7WnxY1{=#B^W#$Kr-v7p8e`n@D#QTRV_D^R1i{59M|CW!B=rP;; zk9>SAAD_s_r}8l-Ik#BjX`=CDy2h;>r}PFhv0&_Cb>75kCA3vlC04D}RI{4UC8{p* z(50$^w^`;kVt|uhW<4*br!Ysc#e&jen7h~&YV1l?x|4-or3QAW!K+o4BJYYjs>dcH ztfTsgJcppO;ovnY3uYK253E-9gQ{;m;HB*{%0{!(;EEtQ(GU+;aD=howJP(MlC-!^ zvm*!G4M2}skZmaPjO`98Fy(eTcu@lzqPy@HCfjiV?YJdfIsw&8V zyD*j$h68u2!@aX@Y#7)a8@mVCTpPO=SdER{2kclIyB}D<#=Z<}o{fD4SgnnH71(?m zdjMFSjXenLI2(Hi*a92d4eWS1zU$TA6Xn|tYVS$%?MAit6!~_O8rY)_XJV%e2OdV7 zg_62U4PmFq#7^=d&&>q(Qp4CO5_y!`#uiHCYbu(cDumrdHoaL5d|ln`$Eu#?#loH4 z+u$7!&bpDhbCsI?HFd}Kv&`(?o7JhXf0tV{xkU}SSqK}ZcY?*qa-7vl?=6zGLa^Sd z1}j+aqD*X2wNi>ch+&c4Of6`3Yhkn7M6<=2*y4P%#db5TpxJGrSq!X;_SX0*B8k3s z@AA`l@oq`keWXg!-|Yt*;Z)lQdfo`Pi@rpII}UEJ#BSioH@KtFYIh2&A(8M-v^bqP z&NG$JT`DUW|J^kH&~*j8JU`~pa1rl4#B06ZE85-2RPQ9Koh#q2CUl=#sL=gFp`8Vt zxO2<_7W%U6B***}Vh$n+3EfoCz*ErRt3_HpP@vU=LaUn#v??jo>Y*a7b_=a`6?9Ts z(8->nP97G5kz{!%TfAjC-c0NfHMCc93*JW$nz0ZPH18CvS$VEmmp(hFv(VRyy7{{3 z=C*=vD)QYtriLDu+@TAxz#dmaNaix3dyzRjh!wdY_&vt_IKc>PcIYWo&gz{d_amO^ zI{KLRd9||gXtnp4OzfC-&e%89r5+iIj|n}YD$Bi3xZZMQUFA=zzj6J`^)bC%@80Wv z%#D{<-M@DKj$WSjjCu}u@bU-Gr6pIC;N{MeM@qgrozlOQ{+(W~E_$Qbwmdtt!rPWgpVHO63_^LeWn^d8}8Q2aRy9L-z8@nCYjW%`%u$ye`E?_s?*qy+3+1N0!TW#!aV7J)VJ-}|W zvCm~<7tp(R#=#p;;M;0cjkDOd)#1={DqD_aCS2rra*^fC`HuFk_8s*}6~{`|?U{nS zKk!}QPlD@MM3+p=2tCboxRRGxYKi50SX@=HJ#5(KoCiYiahwqqs@ctAkn*f(<#Xt6 z&$k%VihU26)x&<|xyWq2h$BQ98rnY+d;XA$=TUJWJG!Ta;?3OAY6W`}7u(NLy!&z1 z&%~;Y$tB_$dI9;FVOAp;pdRty-fD(`079%90pUexn~)Kqnj%6b@Jdeqz^m$Tb~x~w zIy`#lShAzm5d1m@K9vUkIvOq=4!ofXZUnEY0Gl03X<(`(rc=Nan`u-Ey=Gc^&4gan zJyNBaAd484iG5D0G*bjAMH#1|eJR=tp`nxt+IXUsOWH{6B~?-hTkH9_NQb&Xxz7GooUsjdjK!z-0+hYERWr=Sy zJu^FWr#Qwr^^AWU?i`}ksPq+^oQ!Ol>N4vA4qK`cCIzAR7qnEJ%=&Pvc@!t+%!x^ zt%^OugxJcJ)a!n93Qt6jlt35u_>SGHnFtG*YBAj+4ID?|M&yQmH!a#%)giA-kPtNP z!2Z_u;@VXblH`SzsxIt}_kc)uC@O-TM|3-8#HaGsWHI8VNh#syI7jVpAYs zrAwnx0|`504>P#fb~WrID{m>UiSXE4s+gTUyJ{jX|6-mPWoZb2LCFI#))RHh)Io24m(5NR~a0+BxdZ4l!i;frKaI3b(Lgy4(-nbevJ-` zg6dqUKEdP_H$(G!27Bg{-tON{o2QUwv68v z$vDfB@jEGFsg%(%?&Qyu@%thfXInD7PW?uwy5tFYKWC9>3_*u}t94 z*4+Q4C}tf?#B6@wnyMr1d6LPrC)4F$=~v82SOC^d$|f0yCl%hLL>W$f{WwZqzPxAFtzjc#Qc4QeOLU0nUYsr%2vt2^O;qi*|! zi9?i~PMO1Yv0;?&L+~;xH!4=55Zb5GL9#0JRqDB_V6_l&zsjswM-2_LDiin!bAF&W z9!5q2AIm@(_~fA4x{=U#FuQ?IgAg)%blPAW{4s z*)4BMMt1o(6=^IqeM4wU`_lB>zBHZorL12>rY%}7h+nJ~=^M7j6xgbf*4|3uzQpFf zRC3Gh*83&IdH-YJ7zy5ocq2k+#odb1<)Vn9BZdWC49bt%3K7|$=uVm$H&~h(V#hpG z+0opPMrjI0X=P^pHKfrtZB*!U*+JTm3f(W4y8EQ=qlKE2Exj)zVT8xHg`UA5s*0uN zO@S-5ahM0eq>xc33(wpusM0?9>6|(9;4)ou>zoPEPG~qVds` zhvEoVml+Anz=&x0d;HK)qC;Mt27AZQD6gp~7ao-rW>P{~c_NH6m$;6Cb~jl}bb=Z&Y@U6c^`94sa{~ac7Se&uhW*XEj!eRJ`#LKRkrOL3G4Ev7_U^n6ZOF#sYoud zDh=wC)&eptv9kSG=UqQm!;Wf&tnyei$~MUFAz3;A%H(dpka$ypM5l<# zLZZ`>=%y?}h}(AHm@TfM2pA=|Ln@bH_GqIj3N-#nfDdOstC^7QDOz3u|hyWJ)JRS80R%uE8ka@E$^%Qv&8XRO5>Wc=I=;;;6b?P%HhC6+OYY1QmvkT%QS;5 z*_0WnIbg0Hb!oyJO_?mvRfLK$EK;p2k`c2lr_JL06t@CBRg+5=Xb74kF8A&+|3HnG zIH2F7SblT%i!FiXCGfB&Qo&5%5p9Ha?7&`aWOyr0Rp3!=tL4c@;RyR^@z;-O;!}`T zm`kiR0$&$-1f{9VM|`JYHp z1Z8EyCt7AH%M(}dfybbCp*HJ`z~fRI8tZ&w`G!_-X(todS1ElEO#)U*8hVCF&j~!C zSy}RF4#chZ^nBbZ7jbKgS9~eomJ3|yXPmIVj2>3xlC{vrw1>^#S?|8 z$DKo3<}Yua(d^5-BOXGc`C|yqO_;ZwozJ5X9C%hHkf)H~Z;Q|xy9&qB=d|I&n_TKi ze3{ruvqOJXHSe8vkUn6A$M5FDqsZ(&P;;r>2P)-unb_atorH;F7!$X=|4;+ZYs2F8 zL-e0}|91X8_)nbGwo$NtDKB0O=3g+#zf}@SX$#d^S4$sJc-Fk@l*66ViVc%Lw27nI z%S8*s6sCGbdS&3%d|jRRc#dP*a(2qQ>Mv9}KI;EL#MhON5%J5FPZ06F%BP61NlSO82c|H*F(}bDG!n!U6Q}9xa5g(8oE0KmNS6INEz6X&BaF>%h%2GEgi@MpD z>n5A;Bx`kH9Hxuxp&jg%9bkhv5&v1g$fzFMOJP2+Uz2;l4t4ABD6rr*v^1|$z0V?% z-J-4BqA9{;1$H>KNWmZeU+jQP1IJc9SBo%CIz4mHpilm954uds%N9!eUVem7eFSmi zC3OVT-{jCe6}Pg3^3XXH%|#q<@W<@5^LZ_JnZ_gs{Txa2&Jrn~xEs;}Z)>?%QV9Lh z>&~GlJGNg$L8>Lsdwpz7tfS*Z2zXxDGxS~TG~R=v9sQ)a~@fj>Y}X2jZ-gLGbOkY`{@BE84R z18p{Uo~39+SL>tV9*Yj9*%frroV5_)uhun3Wxs0c#t!wp`S!p%qmzflkI@M{&gS(t%I6 z5F9@Lq>U@3lt{`IKWsq|)M<5#?@d`!Y}eQr4AtU9(7lGqa7Q z8-jJ4FiHwNFgAv4n-1VBDNo&mjYL@2Wo;Tj{OjmTNzlR_ofXt-DT(?a)S6ZpT2b)o`%a=-y(L%9v|*rY@?iE3aF3 zy;isG2EdJgn*ihR-`UDk@z+}kk*gWgbonFFR#nyXk_`REU?j9lBX|D#wB+rd{&VUH%!xyg8oH!|}Eqxy$zdftZf}0dMF3U?^uE zS-rE4Ty=JVX@f8==II`?cQWP#Cb4_MA~=$c+j8PKb0dVjT&K0u4l zJu(VCM@C~eYox1rvo^Xjja4}Qy|FP8e7*yAIZ;Gygu)RDgp=$*IFhBd*?e0HdOx>< z9vXKsraPR-np)_s#Pn&+cZ|~4c?A@r26A(9Wg;2 z26LEmhi8|#28!r)V$Y4TEN!r(IHR;EnNFqmA@S2f*1KCg)xb7=c%6&xyI)2C%3XQC z%;?U0xOWfBh&$rmM+CRl`!EgGD3F~XI@8mjNfSKoV>>iabLBeAevcmpL4F1`0_ zQ|T){wSI(|U&h|Q`SyBa$(g-y=7%h2R;Tv5FoeE*EWNyPq%ir$a zs#!isDXZMiXxpJLSe?oWtksBv@HB?rgrSdy9kD$cZEO!~;+|C}X1WD8=0B zJsSP6SYph=%strYcBbiLY}h&e@v*Ti#&V&CRd6g8kB=_kR*cYxchYVL7L2?s7B|H< nh9>c%mEE6P*^gMp(5Ci2LCdndlKv4?{{KH=DX{+oU5})n)LqZw diff --git a/wp/wp-includes/js/thickbox/loadingAnimation.gif b/wp/wp-includes/js/thickbox/loadingAnimation.gif deleted file mode 100644 index 030d4de59da99d070e7c679c3f42e77e2329f778..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15238 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 NIZ*y1{j)X+{U6*ef&c&j diff --git a/wp/wp-includes/js/thickbox/macFFBgHack.png b/wp/wp-includes/js/thickbox/macFFBgHack.png deleted file mode 100644 index a032659389b33b825686d5683076585644f6df53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIs-7;6As(G?&nhx9Fz~P}d>x;4 r_1Ys*Cf}>P9x6heE=m(U*iJInPrnqeqZl;_sDZ)L)z4*}Q$iB}2X`51 diff --git a/wp/wp-includes/js/thickbox/thickbox.css b/wp/wp-includes/js/thickbox/thickbox.css deleted file mode 100644 index 3374f685..00000000 --- a/wp/wp-includes/js/thickbox/thickbox.css +++ /dev/null @@ -1,156 +0,0 @@ -#TB_overlay { - background: #000; - opacity: 0.7; - filter: alpha(opacity=70); - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 100050; /* Above DFW. */ -} - -#TB_window { - position: fixed; - background-color: #fff; - z-index: 100050; /* Above DFW. */ - visibility: hidden; - text-align: left; - top: 50%; - left: 50%; - -webkit-box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); - box-shadow: 0 3px 6px rgba( 0, 0, 0, 0.3 ); -} - -#TB_window img#TB_Image { - display: block; - margin: 15px 0 0 15px; - border-right: 1px solid #ccc; - border-bottom: 1px solid #ccc; - border-top: 1px solid #666; - border-left: 1px solid #666; -} - -#TB_caption{ - height: 25px; - padding: 7px 30px 10px 25px; - float: left; -} - -#TB_closeWindow { - height: 25px; - padding: 11px 25px 10px 0; - float: right; -} - -#TB_closeWindowButton { - position: absolute; - left: auto; - right: 0; - width: 29px; - height: 29px; - border: 0; - padding: 0; - background: none; - cursor: pointer; - outline: none; - -webkit-transition: color .1s ease-in-out, background .1s ease-in-out; - transition: color .1s ease-in-out, background .1s ease-in-out; -} - -#TB_ajaxWindowTitle { - float: left; - font-weight: 600; - line-height: 29px; - overflow: hidden; - padding: 0 29px 0 10px; - text-overflow: ellipsis; - white-space: nowrap; - width: calc( 100% - 39px ); -} - -#TB_title { - background: #fcfcfc; - border-bottom: 1px solid #ddd; - height: 29px; -} - -#TB_ajaxContent { - clear: both; - padding: 2px 15px 15px 15px; - overflow: auto; - text-align: left; - line-height: 1.4em; -} - -#TB_ajaxContent.TB_modal { - padding: 15px; -} - -#TB_ajaxContent p { - padding: 5px 0px 5px 0px; -} - -#TB_load { - position: fixed; - display: none; - z-index: 103; - top: 50%; - left: 50%; - background-color: #E8E8E8; - border: 1px solid #555; - margin: -45px 0 0 -125px; - padding: 40px 15px 15px; -} - -#TB_HideSelect { - z-index: 99; - position: fixed; - top: 0; - left: 0; - background-color: #fff; - border: none; - filter: alpha(opacity=0); - opacity: 0; - height: 100%; - width: 100%; -} - -#TB_iframeContent { - clear: both; - border: none; -} - -.tb-close-icon { - display: block; - color: #666; - text-align: center; - line-height: 29px; - width: 29px; - height: 29px; - position: absolute; - top: 0; - right: 0; -} - -.tb-close-icon:before { - content: "\f158"; - font: normal 20px/29px dashicons; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -#TB_closeWindowButton:hover .tb-close-icon, -#TB_closeWindowButton:focus .tb-close-icon { - color: #00a0d2; -} - -#TB_closeWindowButton:focus .tb-close-icon { - -webkit-box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); - box-shadow: - 0 0 0 1px #5b9dd9, - 0 0 2px 1px rgba(30, 140, 190, .8); -} diff --git a/wp/wp-includes/js/thickbox/thickbox.js b/wp/wp-includes/js/thickbox/thickbox.js deleted file mode 100644 index 391fd418..00000000 --- a/wp/wp-includes/js/thickbox/thickbox.js +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Thickbox 3.1 - One Box To Rule Them All. - * By Cody Lindley (http://www.codylindley.com) - * Copyright (c) 2007 cody lindley - * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php -*/ - -if ( typeof tb_pathToImage != 'string' ) { - var tb_pathToImage = thickboxL10n.loadingAnimation; -} - -/*!!!!!!!!!!!!!!!!! edit below this line at your own risk !!!!!!!!!!!!!!!!!!!!!!!*/ - -//on page load call tb_init -jQuery(document).ready(function(){ - tb_init('a.thickbox, area.thickbox, input.thickbox');//pass where to apply thickbox - imgLoader = new Image();// preload image - imgLoader.src = tb_pathToImage; -}); - -/* - * Add thickbox to href & area elements that have a class of .thickbox. - * Remove the loading indicator when content in an iframe has loaded. - */ -function tb_init(domChunk){ - jQuery( 'body' ) - .on( 'click', domChunk, tb_click ) - .on( 'thickbox:iframe:loaded', function() { - jQuery( '#TB_window' ).removeClass( 'thickbox-loading' ); - }); -} - -function tb_click(){ - var t = this.title || this.name || null; - var a = this.href || this.alt; - var g = this.rel || false; - tb_show(t,a,g); - this.blur(); - return false; -} - -function tb_show(caption, url, imageGroup) {//function called when the user clicks on a thickbox link - - var $closeBtn; - - try { - if (typeof document.body.style.maxHeight === "undefined") {//if IE 6 - jQuery("body","html").css({height: "100%", width: "100%"}); - jQuery("html").css("overflow","hidden"); - if (document.getElementById("TB_HideSelect") === null) {//iframe to hide select elements in ie6 - jQuery("body").append("
      "); - jQuery("#TB_overlay").click(tb_remove); - } - }else{//all others - if(document.getElementById("TB_overlay") === null){ - jQuery("body").append("
      "); - jQuery("#TB_overlay").click(tb_remove); - jQuery( 'body' ).addClass( 'modal-open' ); - } - } - - if(tb_detectMacXFF()){ - jQuery("#TB_overlay").addClass("TB_overlayMacFFBGHack");//use png overlay so hide flash - }else{ - jQuery("#TB_overlay").addClass("TB_overlayBG");//use background and opacity - } - - if(caption===null){caption="";} - jQuery("body").append("
      ");//add loader to the page - jQuery('#TB_load').show();//show loader - - var baseURL; - if(url.indexOf("?")!==-1){ //ff there is a query string involved - baseURL = url.substr(0, url.indexOf("?")); - }else{ - baseURL = url; - } - - var urlString = /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/; - var urlType = baseURL.toLowerCase().match(urlString); - - if(urlType == '.jpg' || urlType == '.jpeg' || urlType == '.png' || urlType == '.gif' || urlType == '.bmp'){//code to show images - - TB_PrevCaption = ""; - TB_PrevURL = ""; - TB_PrevHTML = ""; - TB_NextCaption = ""; - TB_NextURL = ""; - TB_NextHTML = ""; - TB_imageCount = ""; - TB_FoundURL = false; - if(imageGroup){ - TB_TempArray = jQuery("a[rel="+imageGroup+"]").get(); - for (TB_Counter = 0; ((TB_Counter < TB_TempArray.length) && (TB_NextHTML === "")); TB_Counter++) { - var urlTypeTemp = TB_TempArray[TB_Counter].href.toLowerCase().match(urlString); - if (!(TB_TempArray[TB_Counter].href == url)) { - if (TB_FoundURL) { - TB_NextCaption = TB_TempArray[TB_Counter].title; - TB_NextURL = TB_TempArray[TB_Counter].href; - TB_NextHTML = "  "+thickboxL10n.next+""; - } else { - TB_PrevCaption = TB_TempArray[TB_Counter].title; - TB_PrevURL = TB_TempArray[TB_Counter].href; - TB_PrevHTML = "  "+thickboxL10n.prev+""; - } - } else { - TB_FoundURL = true; - TB_imageCount = thickboxL10n.image + ' ' + (TB_Counter + 1) + ' ' + thickboxL10n.of + ' ' + (TB_TempArray.length); - } - } - } - - imgPreloader = new Image(); - imgPreloader.onload = function(){ - imgPreloader.onload = null; - - // Resizing large images - original by Christian Montoya edited by me. - var pagesize = tb_getPageSize(); - var x = pagesize[0] - 150; - var y = pagesize[1] - 150; - var imageWidth = imgPreloader.width; - var imageHeight = imgPreloader.height; - if (imageWidth > x) { - imageHeight = imageHeight * (x / imageWidth); - imageWidth = x; - if (imageHeight > y) { - imageWidth = imageWidth * (y / imageHeight); - imageHeight = y; - } - } else if (imageHeight > y) { - imageWidth = imageWidth * (y / imageHeight); - imageHeight = y; - if (imageWidth > x) { - imageHeight = imageHeight * (x / imageWidth); - imageWidth = x; - } - } - // End Resizing - - TB_WIDTH = imageWidth + 30; - TB_HEIGHT = imageHeight + 60; - jQuery("#TB_window").append(""+thickboxL10n.close+""+caption+"" + "
      "+caption+"
      " + TB_imageCount + TB_PrevHTML + TB_NextHTML + "
      "); - - jQuery("#TB_closeWindowButton").click(tb_remove); - - if (!(TB_PrevHTML === "")) { - function goPrev(){ - if(jQuery(document).unbind("click",goPrev)){jQuery(document).unbind("click",goPrev);} - jQuery("#TB_window").remove(); - jQuery("body").append("
      "); - tb_show(TB_PrevCaption, TB_PrevURL, imageGroup); - return false; - } - jQuery("#TB_prev").click(goPrev); - } - - if (!(TB_NextHTML === "")) { - function goNext(){ - jQuery("#TB_window").remove(); - jQuery("body").append("
      "); - tb_show(TB_NextCaption, TB_NextURL, imageGroup); - return false; - } - jQuery("#TB_next").click(goNext); - - } - - jQuery(document).bind('keydown.thickbox', function(e){ - if ( e.which == 27 ){ // close - tb_remove(); - - } else if ( e.which == 190 ){ // display previous image - if(!(TB_NextHTML == "")){ - jQuery(document).unbind('thickbox'); - goNext(); - } - } else if ( e.which == 188 ){ // display next image - if(!(TB_PrevHTML == "")){ - jQuery(document).unbind('thickbox'); - goPrev(); - } - } - return false; - }); - - tb_position(); - jQuery("#TB_load").remove(); - jQuery("#TB_ImageOff").click(tb_remove); - jQuery("#TB_window").css({'visibility':'visible'}); //for safari using css instead of show - }; - - imgPreloader.src = url; - }else{//code to show html - - var queryString = url.replace(/^[^\?]+\??/,''); - var params = tb_parseQuery( queryString ); - - TB_WIDTH = (params['width']*1) + 30 || 630; //defaults to 630 if no parameters were added to URL - TB_HEIGHT = (params['height']*1) + 40 || 440; //defaults to 440 if no parameters were added to URL - ajaxContentW = TB_WIDTH - 30; - ajaxContentH = TB_HEIGHT - 45; - - if(url.indexOf('TB_iframe') != -1){// either iframe or ajax window - urlNoQuery = url.split('TB_'); - jQuery("#TB_iframeContent").remove(); - if(params['modal'] != "true"){//iframe no modal - jQuery("#TB_window").append("
      "+caption+"
      "); - }else{//iframe modal - jQuery("#TB_overlay").unbind(); - jQuery("#TB_window").append(""); - } - }else{// not an iframe, ajax - if(jQuery("#TB_window").css("visibility") != "visible"){ - if(params['modal'] != "true"){//ajax no modal - jQuery("#TB_window").append("
      "+caption+"
      "); - }else{//ajax modal - jQuery("#TB_overlay").unbind(); - jQuery("#TB_window").append("
      "); - } - }else{//this means the window is already up, we are just loading new content via ajax - jQuery("#TB_ajaxContent")[0].style.width = ajaxContentW +"px"; - jQuery("#TB_ajaxContent")[0].style.height = ajaxContentH +"px"; - jQuery("#TB_ajaxContent")[0].scrollTop = 0; - jQuery("#TB_ajaxWindowTitle").html(caption); - } - } - - jQuery("#TB_closeWindowButton").click(tb_remove); - - if(url.indexOf('TB_inline') != -1){ - jQuery("#TB_ajaxContent").append(jQuery('#' + params['inlineId']).children()); - jQuery("#TB_window").bind('tb_unload', function () { - jQuery('#' + params['inlineId']).append( jQuery("#TB_ajaxContent").children() ); // move elements back when you're finished - }); - tb_position(); - jQuery("#TB_load").remove(); - jQuery("#TB_window").css({'visibility':'visible'}); - }else if(url.indexOf('TB_iframe') != -1){ - tb_position(); - jQuery("#TB_load").remove(); - jQuery("#TB_window").css({'visibility':'visible'}); - }else{ - var load_url = url; - load_url += -1 === url.indexOf('?') ? '?' : '&'; - jQuery("#TB_ajaxContent").load(load_url += "random=" + (new Date().getTime()),function(){//to do a post change this load method - tb_position(); - jQuery("#TB_load").remove(); - tb_init("#TB_ajaxContent a.thickbox"); - jQuery("#TB_window").css({'visibility':'visible'}); - }); - } - - } - - if(!params['modal']){ - jQuery(document).bind('keydown.thickbox', function(e){ - if ( e.which == 27 ){ // close - tb_remove(); - return false; - } - }); - } - - $closeBtn = jQuery( '#TB_closeWindowButton' ); - /* - * If the native Close button icon is visible, move focus on the button - * (e.g. in the Network Admin Themes screen). - * In other admin screens is hidden and replaced by a different icon. - */ - if ( $closeBtn.find( '.tb-close-icon' ).is( ':visible' ) ) { - $closeBtn.focus(); - } - - } catch(e) { - //nothing here - } -} - -//helper functions below -function tb_showIframe(){ - jQuery("#TB_load").remove(); - jQuery("#TB_window").css({'visibility':'visible'}).trigger( 'thickbox:iframe:loaded' ); -} - -function tb_remove() { - jQuery("#TB_imageOff").unbind("click"); - jQuery("#TB_closeWindowButton").unbind("click"); - jQuery( '#TB_window' ).fadeOut( 'fast', function() { - jQuery( '#TB_window, #TB_overlay, #TB_HideSelect' ).trigger( 'tb_unload' ).unbind().remove(); - jQuery( 'body' ).trigger( 'thickbox:removed' ); - }); - jQuery( 'body' ).removeClass( 'modal-open' ); - jQuery("#TB_load").remove(); - if (typeof document.body.style.maxHeight == "undefined") {//if IE 6 - jQuery("body","html").css({height: "auto", width: "auto"}); - jQuery("html").css("overflow",""); - } - jQuery(document).unbind('.thickbox'); - return false; -} - -function tb_position() { -var isIE6 = typeof document.body.style.maxHeight === "undefined"; -jQuery("#TB_window").css({marginLeft: '-' + parseInt((TB_WIDTH / 2),10) + 'px', width: TB_WIDTH + 'px'}); - if ( ! isIE6 ) { // take away IE6 - jQuery("#TB_window").css({marginTop: '-' + parseInt((TB_HEIGHT / 2),10) + 'px'}); - } -} - -function tb_parseQuery ( query ) { - var Params = {}; - if ( ! query ) {return Params;}// return empty object - var Pairs = query.split(/[;&]/); - for ( var i = 0; i < Pairs.length; i++ ) { - var KeyVal = Pairs[i].split('='); - if ( ! KeyVal || KeyVal.length != 2 ) {continue;} - var key = unescape( KeyVal[0] ); - var val = unescape( KeyVal[1] ); - val = val.replace(/\+/g, ' '); - Params[key] = val; - } - return Params; -} - -function tb_getPageSize(){ - var de = document.documentElement; - var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth; - var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight; - arrayPageSize = [w,h]; - return arrayPageSize; -} - -function tb_detectMacXFF() { - var userAgent = navigator.userAgent.toLowerCase(); - if (userAgent.indexOf('mac') != -1 && userAgent.indexOf('firefox')!=-1) { - return true; - } -} diff --git a/wp/wp-includes/js/tinymce/langs/wp-langs-en.js b/wp/wp-includes/js/tinymce/langs/wp-langs-en.js deleted file mode 100644 index 65d96690..00000000 --- a/wp/wp-includes/js/tinymce/langs/wp-langs-en.js +++ /dev/null @@ -1,519 +0,0 @@ -/** - * TinyMCE 3.x language strings - * - * Loaded only when external plugins are added to TinyMCE. - */ -( function() { - var main = {}, lang = 'en'; - - if ( typeof tinyMCEPreInit !== 'undefined' && tinyMCEPreInit.ref.language !== 'en' ) { - lang = tinyMCEPreInit.ref.language; - } - - main[lang] = { - common: { - edit_confirm: "Do you want to use the WYSIWYG mode for this textarea?", - apply: "Apply", - insert: "Insert", - update: "Update", - cancel: "Cancel", - close: "Close", - browse: "Browse", - class_name: "Class", - not_set: "-- Not set --", - clipboard_msg: "Copy/Cut/Paste is not available in Mozilla and Firefox.", - clipboard_no_support: "Currently not supported by your browser, use keyboard shortcuts instead.", - popup_blocked: "Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.", - invalid_data: "ERROR: Invalid values entered, these are marked in red.", - invalid_data_number: "{#field} must be a number", - invalid_data_min: "{#field} must be a number greater than {#min}", - invalid_data_size: "{#field} must be a number or percentage", - more_colors: "More colors" - }, - colors: { - "000000": "Black", - "993300": "Burnt orange", - "333300": "Dark olive", - "003300": "Dark green", - "003366": "Dark azure", - "000080": "Navy Blue", - "333399": "Indigo", - "333333": "Very dark gray", - "800000": "Maroon", - "FF6600": "Orange", - "808000": "Olive", - "008000": "Green", - "008080": "Teal", - "0000FF": "Blue", - "666699": "Grayish blue", - "808080": "Gray", - "FF0000": "Red", - "FF9900": "Amber", - "99CC00": "Yellow green", - "339966": "Sea green", - "33CCCC": "Turquoise", - "3366FF": "Royal blue", - "800080": "Purple", - "999999": "Medium gray", - "FF00FF": "Magenta", - "FFCC00": "Gold", - "FFFF00": "Yellow", - "00FF00": "Lime", - "00FFFF": "Aqua", - "00CCFF": "Sky blue", - "993366": "Brown", - "C0C0C0": "Silver", - "FF99CC": "Pink", - "FFCC99": "Peach", - "FFFF99": "Light yellow", - "CCFFCC": "Pale green", - "CCFFFF": "Pale cyan", - "99CCFF": "Light sky blue", - "CC99FF": "Plum", - "FFFFFF": "White" - }, - contextmenu: { - align: "Alignment", - left: "Left", - center: "Center", - right: "Right", - full: "Full" - }, - insertdatetime: { - date_fmt: "%Y-%m-%d", - time_fmt: "%H:%M:%S", - insertdate_desc: "Insert date", - inserttime_desc: "Insert time", - months_long: "January,February,March,April,May,June,July,August,September,October,November,December", - months_short: "Jan_January_abbreviation,Feb_February_abbreviation,Mar_March_abbreviation,Apr_April_abbreviation,May_May_abbreviation,Jun_June_abbreviation,Jul_July_abbreviation,Aug_August_abbreviation,Sep_September_abbreviation,Oct_October_abbreviation,Nov_November_abbreviation,Dec_December_abbreviation", - day_long: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday", - day_short: "Sun,Mon,Tue,Wed,Thu,Fri,Sat" - }, - print: { - print_desc: "Print" - }, - preview: { - preview_desc: "Preview" - }, - directionality: { - ltr_desc: "Direction left to right", - rtl_desc: "Direction right to left" - }, - layer: { - insertlayer_desc: "Insert new layer", - forward_desc: "Move forward", - backward_desc: "Move backward", - absolute_desc: "Toggle absolute positioning", - content: "New layer..." - }, - save: { - save_desc: "Save", - cancel_desc: "Cancel all changes" - }, - nonbreaking: { - nonbreaking_desc: "Insert non-breaking space character" - }, - iespell: { - iespell_desc: "Run spell checking", - download: "ieSpell not detected. Do you want to install it now?" - }, - advhr: { - advhr_desc: "Horizontal rule" - }, - emotions: { - emotions_desc: "Emotions" - }, - searchreplace: { - search_desc: "Find", - replace_desc: "Find/Replace" - }, - advimage: { - image_desc: "Insert/edit image" - }, - advlink: { - link_desc: "Insert/edit link" - }, - xhtmlxtras: { - cite_desc: "Citation", - abbr_desc: "Abbreviation", - acronym_desc: "Acronym", - del_desc: "Deletion", - ins_desc: "Insertion", - attribs_desc: "Insert/Edit Attributes" - }, - style: { - desc: "Edit CSS Style" - }, - paste: { - paste_text_desc: "Paste as Plain Text", - paste_word_desc: "Paste from Word", - selectall_desc: "Select All", - plaintext_mode_sticky: "Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.", - plaintext_mode: "Paste is now in plain text mode. Click again to toggle back to regular paste mode." - }, - paste_dlg: { - text_title: "Use CTRL + V on your keyboard to paste the text into the window.", - text_linebreaks: "Keep linebreaks", - word_title: "Use CTRL + V on your keyboard to paste the text into the window." - }, - table: { - desc: "Inserts a new table", - row_before_desc: "Insert row before", - row_after_desc: "Insert row after", - delete_row_desc: "Delete row", - col_before_desc: "Insert column before", - col_after_desc: "Insert column after", - delete_col_desc: "Remove column", - split_cells_desc: "Split merged table cells", - merge_cells_desc: "Merge table cells", - row_desc: "Table row properties", - cell_desc: "Table cell properties", - props_desc: "Table properties", - paste_row_before_desc: "Paste table row before", - paste_row_after_desc: "Paste table row after", - cut_row_desc: "Cut table row", - copy_row_desc: "Copy table row", - del: "Delete table", - row: "Row", - col: "Column", - cell: "Cell" - }, - autosave: { - unload_msg: "The changes you made will be lost if you navigate away from this page." - }, - fullscreen: { - desc: "Toggle fullscreen mode (Alt + Shift + G)" - }, - media: { - desc: "Insert / edit embedded media", - edit: "Edit embedded media" - }, - fullpage: { - desc: "Document properties" - }, - template: { - desc: "Insert predefined template content" - }, - visualchars: { - desc: "Visual control characters on/off." - }, - spellchecker: { - desc: "Toggle spellchecker (Alt + Shift + N)", - menu: "Spellchecker settings", - ignore_word: "Ignore word", - ignore_words: "Ignore all", - langs: "Languages", - wait: "Please wait...", - sug: "Suggestions", - no_sug: "No suggestions", - no_mpell: "No misspellings found.", - learn_word: "Learn word" - }, - pagebreak: { - desc: "Insert Page Break" - }, - advlist:{ - types: "Types", - def: "Default", - lower_alpha: "Lower alpha", - lower_greek: "Lower greek", - lower_roman: "Lower roman", - upper_alpha: "Upper alpha", - upper_roman: "Upper roman", - circle: "Circle", - disc: "Disc", - square: "Square" - }, - aria: { - rich_text_area: "Rich Text Area" - }, - wordcount:{ - words: "Words: " - } - }; - - tinyMCE.addI18n( main ); - - tinyMCE.addI18n( lang + ".advanced", { - style_select: "Styles", - font_size: "Font size", - fontdefault: "Font family", - block: "Format", - paragraph: "Paragraph", - div: "Div", - address: "Address", - pre: "Preformatted", - h1: "Heading 1", - h2: "Heading 2", - h3: "Heading 3", - h4: "Heading 4", - h5: "Heading 5", - h6: "Heading 6", - blockquote: "Blockquote", - code: "Code", - samp: "Code sample", - dt: "Definition term ", - dd: "Definition description", - bold_desc: "Bold (Ctrl + B)", - italic_desc: "Italic (Ctrl + I)", - underline_desc: "Underline", - striketrough_desc: "Strikethrough (Alt + Shift + D)", - justifyleft_desc: "Align Left (Alt + Shift + L)", - justifycenter_desc: "Align Center (Alt + Shift + C)", - justifyright_desc: "Align Right (Alt + Shift + R)", - justifyfull_desc: "Align Full (Alt + Shift + J)", - bullist_desc: "Unordered list (Alt + Shift + U)", - numlist_desc: "Ordered list (Alt + Shift + O)", - outdent_desc: "Outdent", - indent_desc: "Indent", - undo_desc: "Undo (Ctrl + Z)", - redo_desc: "Redo (Ctrl + Y)", - link_desc: "Insert/edit link (Alt + Shift + A)", - unlink_desc: "Unlink (Alt + Shift + S)", - image_desc: "Insert/edit image (Alt + Shift + M)", - cleanup_desc: "Cleanup messy code", - code_desc: "Edit HTML Source", - sub_desc: "Subscript", - sup_desc: "Superscript", - hr_desc: "Insert horizontal ruler", - removeformat_desc: "Remove formatting", - forecolor_desc: "Select text color", - backcolor_desc: "Select background color", - charmap_desc: "Insert custom character", - visualaid_desc: "Toggle guidelines/invisible elements", - anchor_desc: "Insert/edit anchor", - cut_desc: "Cut", - copy_desc: "Copy", - paste_desc: "Paste", - image_props_desc: "Image properties", - newdocument_desc: "New document", - help_desc: "Help", - blockquote_desc: "Blockquote (Alt + Shift + Q)", - clipboard_msg: "Copy/Cut/Paste is not available in Mozilla and Firefox.", - path: "Path", - newdocument: "Are you sure you want to clear all contents?", - toolbar_focus: "Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X", - more_colors: "More colors", - shortcuts_desc: "Accessibility Help", - help_shortcut: " Press ALT F10 for toolbar. Press ALT 0 for help.", - rich_text_area: "Rich Text Area", - toolbar: "Toolbar" - }); - - tinyMCE.addI18n( lang + ".advanced_dlg", { - about_title: "About TinyMCE", - about_general: "About", - about_help: "Help", - about_license: "License", - about_plugins: "Plugins", - about_plugin: "Plugin", - about_author: "Author", - about_version: "Version", - about_loaded: "Loaded plugins", - anchor_title: "Insert/edit anchor", - anchor_name: "Anchor name", - code_title: "HTML Source Editor", - code_wordwrap: "Word wrap", - colorpicker_title: "Select a color", - colorpicker_picker_tab: "Picker", - colorpicker_picker_title: "Color picker", - colorpicker_palette_tab: "Palette", - colorpicker_palette_title: "Palette colors", - colorpicker_named_tab: "Named", - colorpicker_named_title: "Named colors", - colorpicker_color: "Color: ", - colorpicker_name: "Name: ", - charmap_title: "Select custom character", - charmap_usage: "Use left and right arrows to navigate.", - image_title: "Insert/edit image", - image_src: "Image URL", - image_alt: "Image description", - image_list: "Image list", - image_border: "Border", - image_dimensions: "Dimensions", - image_vspace: "Vertical space", - image_hspace: "Horizontal space", - image_align: "Alignment", - image_align_baseline: "Baseline", - image_align_top: "Top", - image_align_middle: "Middle", - image_align_bottom: "Bottom", - image_align_texttop: "Text top", - image_align_textbottom: "Text bottom", - image_align_left: "Left", - image_align_right: "Right", - link_title: "Insert/edit link", - link_url: "Link URL", - link_target: "Target", - link_target_same: "Open link in the same window", - link_target_blank: "Open link in a new window", - link_titlefield: "Title", - link_is_email: "The URL you entered seems to be an email address, do you want to add the required mailto: prefix?", - link_is_external: "The URL you entered seems to be an external link, do you want to add the required http:// prefix?", - link_list: "Link list", - accessibility_help: "Accessibility Help", - accessibility_usage_title: "General Usage" - }); - - tinyMCE.addI18n( lang + ".media_dlg", { - title: "Insert / edit embedded media", - general: "General", - advanced: "Advanced", - file: "File/URL", - list: "List", - size: "Dimensions", - preview: "Preview", - constrain_proportions: "Constrain proportions", - type: "Type", - id: "Id", - name: "Name", - class_name: "Class", - vspace: "V-Space", - hspace: "H-Space", - play: "Auto play", - loop: "Loop", - menu: "Show menu", - quality: "Quality", - scale: "Scale", - align: "Align", - salign: "SAlign", - wmode: "WMode", - bgcolor: "Background", - base: "Base", - flashvars: "Flashvars", - liveconnect: "SWLiveConnect", - autohref: "AutoHREF", - cache: "Cache", - hidden: "Hidden", - controller: "Controller", - kioskmode: "Kiosk mode", - playeveryframe: "Play every frame", - targetcache: "Target cache", - correction: "No correction", - enablejavascript: "Enable JavaScript", - starttime: "Start time", - endtime: "End time", - href: "href", - qtsrcchokespeed: "Choke speed", - target: "Target", - volume: "Volume", - autostart: "Auto start", - enabled: "Enabled", - fullscreen: "Fullscreen", - invokeurls: "Invoke URLs", - mute: "Mute", - stretchtofit: "Stretch to fit", - windowlessvideo: "Windowless video", - balance: "Balance", - baseurl: "Base URL", - captioningid: "Captioning id", - currentmarker: "Current marker", - currentposition: "Current position", - defaultframe: "Default frame", - playcount: "Play count", - rate: "Rate", - uimode: "UI Mode", - flash_options: "Flash options", - qt_options: "QuickTime options", - wmp_options: "Windows media player options", - rmp_options: "Real media player options", - shockwave_options: "Shockwave options", - autogotourl: "Auto goto URL", - center: "Center", - imagestatus: "Image status", - maintainaspect: "Maintain aspect", - nojava: "No java", - prefetch: "Prefetch", - shuffle: "Shuffle", - console: "Console", - numloop: "Num loops", - controls: "Controls", - scriptcallbacks: "Script callbacks", - swstretchstyle: "Stretch style", - swstretchhalign: "Stretch H-Align", - swstretchvalign: "Stretch V-Align", - sound: "Sound", - progress: "Progress", - qtsrc: "QT Src", - qt_stream_warn: "Streamed rtsp resources should be added to the QT Src field under the advanced tab.", - align_top: "Top", - align_right: "Right", - align_bottom: "Bottom", - align_left: "Left", - align_center: "Center", - align_top_left: "Top left", - align_top_right: "Top right", - align_bottom_left: "Bottom left", - align_bottom_right: "Bottom right", - flv_options: "Flash video options", - flv_scalemode: "Scale mode", - flv_buffer: "Buffer", - flv_startimage: "Start image", - flv_starttime: "Start time", - flv_defaultvolume: "Default volume", - flv_hiddengui: "Hidden GUI", - flv_autostart: "Auto start", - flv_loop: "Loop", - flv_showscalemodes: "Show scale modes", - flv_smoothvideo: "Smooth video", - flv_jscallback: "JS Callback", - html5_video_options: "HTML5 Video Options", - altsource1: "Alternative source 1", - altsource2: "Alternative source 2", - preload: "Preload", - poster: "Poster", - source: "Source" - }); - - tinyMCE.addI18n( lang + ".wordpress", { - wp_adv_desc: "Show/Hide Kitchen Sink (Alt + Shift + Z)", - wp_more_desc: "Insert More Tag (Alt + Shift + T)", - wp_page_desc: "Insert Page break (Alt + Shift + P)", - wp_help_desc: "Help (Alt + Shift + H)", - wp_more_alt: "More...", - wp_page_alt: "Next page...", - add_media: "Add Media", - add_image: "Add an Image", - add_video: "Add Video", - add_audio: "Add Audio", - editgallery: "Edit Gallery", - delgallery: "Delete Gallery", - wp_fullscreen_desc: "Distraction-free writing mode (Alt + Shift + W)" - }); - - tinyMCE.addI18n( lang + ".wpeditimage", { - edit_img: "Edit Image", - del_img: "Delete Image", - adv_settings: "Advanced Settings", - none: "None", - size: "Size", - thumbnail: "Thumbnail", - medium: "Medium", - full_size: "Full Size", - current_link: "Current Link", - link_to_img: "Link to Image", - link_help: "Enter a link URL or click above for presets.", - adv_img_settings: "Advanced Image Settings", - source: "Source", - width: "Width", - height: "Height", - orig_size: "Original Size", - css: "CSS Class", - adv_link_settings: "Advanced Link Settings", - link_rel: "Link Rel", - height: "Height", - orig_size: "Original Size", - css: "CSS Class", - s60: "60%", - s70: "70%", - s80: "80%", - s90: "90%", - s100: "100%", - s110: "110%", - s120: "120%", - s130: "130%", - img_title: "Title", - caption: "Caption", - alt: "Alternative Text" - }); -}()); diff --git a/wp/wp-includes/js/tinymce/license.txt b/wp/wp-includes/js/tinymce/license.txt deleted file mode 100644 index 1837b0ac..00000000 --- a/wp/wp-includes/js/tinymce/license.txt +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/wp/wp-includes/js/tinymce/plugins/charmap/plugin.js b/wp/wp-includes/js/tinymce/plugins/charmap/plugin.js deleted file mode 100644 index 370595c5..00000000 --- a/wp/wp-includes/js/tinymce/plugins/charmap/plugin.js +++ /dev/null @@ -1,466 +0,0 @@ -/** - * plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/*global tinymce:true */ - -tinymce.PluginManager.add('charmap', function(editor) { - var isArray = tinymce.util.Tools.isArray; - - function getDefaultCharMap() { - return [ - ['160', 'no-break space'], - ['173', 'soft hyphen'], - ['34', 'quotation mark'], - // finance - ['162', 'cent sign'], - ['8364', 'euro sign'], - ['163', 'pound sign'], - ['165', 'yen sign'], - // signs - ['169', 'copyright sign'], - ['174', 'registered sign'], - ['8482', 'trade mark sign'], - ['8240', 'per mille sign'], - ['181', 'micro sign'], - ['183', 'middle dot'], - ['8226', 'bullet'], - ['8230', 'three dot leader'], - ['8242', 'minutes / feet'], - ['8243', 'seconds / inches'], - ['167', 'section sign'], - ['182', 'paragraph sign'], - ['223', 'sharp s / ess-zed'], - // quotations - ['8249', 'single left-pointing angle quotation mark'], - ['8250', 'single right-pointing angle quotation mark'], - ['171', 'left pointing guillemet'], - ['187', 'right pointing guillemet'], - ['8216', 'left single quotation mark'], - ['8217', 'right single quotation mark'], - ['8220', 'left double quotation mark'], - ['8221', 'right double quotation mark'], - ['8218', 'single low-9 quotation mark'], - ['8222', 'double low-9 quotation mark'], - ['60', 'less-than sign'], - ['62', 'greater-than sign'], - ['8804', 'less-than or equal to'], - ['8805', 'greater-than or equal to'], - ['8211', 'en dash'], - ['8212', 'em dash'], - ['175', 'macron'], - ['8254', 'overline'], - ['164', 'currency sign'], - ['166', 'broken bar'], - ['168', 'diaeresis'], - ['161', 'inverted exclamation mark'], - ['191', 'turned question mark'], - ['710', 'circumflex accent'], - ['732', 'small tilde'], - ['176', 'degree sign'], - ['8722', 'minus sign'], - ['177', 'plus-minus sign'], - ['247', 'division sign'], - ['8260', 'fraction slash'], - ['215', 'multiplication sign'], - ['185', 'superscript one'], - ['178', 'superscript two'], - ['179', 'superscript three'], - ['188', 'fraction one quarter'], - ['189', 'fraction one half'], - ['190', 'fraction three quarters'], - // math / logical - ['402', 'function / florin'], - ['8747', 'integral'], - ['8721', 'n-ary sumation'], - ['8734', 'infinity'], - ['8730', 'square root'], - ['8764', 'similar to'], - ['8773', 'approximately equal to'], - ['8776', 'almost equal to'], - ['8800', 'not equal to'], - ['8801', 'identical to'], - ['8712', 'element of'], - ['8713', 'not an element of'], - ['8715', 'contains as member'], - ['8719', 'n-ary product'], - ['8743', 'logical and'], - ['8744', 'logical or'], - ['172', 'not sign'], - ['8745', 'intersection'], - ['8746', 'union'], - ['8706', 'partial differential'], - ['8704', 'for all'], - ['8707', 'there exists'], - ['8709', 'diameter'], - ['8711', 'backward difference'], - ['8727', 'asterisk operator'], - ['8733', 'proportional to'], - ['8736', 'angle'], - // undefined - ['180', 'acute accent'], - ['184', 'cedilla'], - ['170', 'feminine ordinal indicator'], - ['186', 'masculine ordinal indicator'], - ['8224', 'dagger'], - ['8225', 'double dagger'], - // alphabetical special chars - ['192', 'A - grave'], - ['193', 'A - acute'], - ['194', 'A - circumflex'], - ['195', 'A - tilde'], - ['196', 'A - diaeresis'], - ['197', 'A - ring above'], - ['256', 'A - macron'], - ['198', 'ligature AE'], - ['199', 'C - cedilla'], - ['200', 'E - grave'], - ['201', 'E - acute'], - ['202', 'E - circumflex'], - ['203', 'E - diaeresis'], - ['274', 'E - macron'], - ['204', 'I - grave'], - ['205', 'I - acute'], - ['206', 'I - circumflex'], - ['207', 'I - diaeresis'], - ['298', 'I - macron'], - ['208', 'ETH'], - ['209', 'N - tilde'], - ['210', 'O - grave'], - ['211', 'O - acute'], - ['212', 'O - circumflex'], - ['213', 'O - tilde'], - ['214', 'O - diaeresis'], - ['216', 'O - slash'], - ['332', 'O - macron'], - ['338', 'ligature OE'], - ['352', 'S - caron'], - ['217', 'U - grave'], - ['218', 'U - acute'], - ['219', 'U - circumflex'], - ['220', 'U - diaeresis'], - ['362', 'U - macron'], - ['221', 'Y - acute'], - ['376', 'Y - diaeresis'], - ['562', 'Y - macron'], - ['222', 'THORN'], - ['224', 'a - grave'], - ['225', 'a - acute'], - ['226', 'a - circumflex'], - ['227', 'a - tilde'], - ['228', 'a - diaeresis'], - ['229', 'a - ring above'], - ['257', 'a - macron'], - ['230', 'ligature ae'], - ['231', 'c - cedilla'], - ['232', 'e - grave'], - ['233', 'e - acute'], - ['234', 'e - circumflex'], - ['235', 'e - diaeresis'], - ['275', 'e - macron'], - ['236', 'i - grave'], - ['237', 'i - acute'], - ['238', 'i - circumflex'], - ['239', 'i - diaeresis'], - ['299', 'i - macron'], - ['240', 'eth'], - ['241', 'n - tilde'], - ['242', 'o - grave'], - ['243', 'o - acute'], - ['244', 'o - circumflex'], - ['245', 'o - tilde'], - ['246', 'o - diaeresis'], - ['248', 'o slash'], - ['333', 'o macron'], - ['339', 'ligature oe'], - ['353', 's - caron'], - ['249', 'u - grave'], - ['250', 'u - acute'], - ['251', 'u - circumflex'], - ['252', 'u - diaeresis'], - ['363', 'u - macron'], - ['253', 'y - acute'], - ['254', 'thorn'], - ['255', 'y - diaeresis'], - ['563', 'y - macron'], - ['913', 'Alpha'], - ['914', 'Beta'], - ['915', 'Gamma'], - ['916', 'Delta'], - ['917', 'Epsilon'], - ['918', 'Zeta'], - ['919', 'Eta'], - ['920', 'Theta'], - ['921', 'Iota'], - ['922', 'Kappa'], - ['923', 'Lambda'], - ['924', 'Mu'], - ['925', 'Nu'], - ['926', 'Xi'], - ['927', 'Omicron'], - ['928', 'Pi'], - ['929', 'Rho'], - ['931', 'Sigma'], - ['932', 'Tau'], - ['933', 'Upsilon'], - ['934', 'Phi'], - ['935', 'Chi'], - ['936', 'Psi'], - ['937', 'Omega'], - ['945', 'alpha'], - ['946', 'beta'], - ['947', 'gamma'], - ['948', 'delta'], - ['949', 'epsilon'], - ['950', 'zeta'], - ['951', 'eta'], - ['952', 'theta'], - ['953', 'iota'], - ['954', 'kappa'], - ['955', 'lambda'], - ['956', 'mu'], - ['957', 'nu'], - ['958', 'xi'], - ['959', 'omicron'], - ['960', 'pi'], - ['961', 'rho'], - ['962', 'final sigma'], - ['963', 'sigma'], - ['964', 'tau'], - ['965', 'upsilon'], - ['966', 'phi'], - ['967', 'chi'], - ['968', 'psi'], - ['969', 'omega'], - // symbols - ['8501', 'alef symbol'], - ['982', 'pi symbol'], - ['8476', 'real part symbol'], - ['978', 'upsilon - hook symbol'], - ['8472', 'Weierstrass p'], - ['8465', 'imaginary part'], - // arrows - ['8592', 'leftwards arrow'], - ['8593', 'upwards arrow'], - ['8594', 'rightwards arrow'], - ['8595', 'downwards arrow'], - ['8596', 'left right arrow'], - ['8629', 'carriage return'], - ['8656', 'leftwards double arrow'], - ['8657', 'upwards double arrow'], - ['8658', 'rightwards double arrow'], - ['8659', 'downwards double arrow'], - ['8660', 'left right double arrow'], - ['8756', 'therefore'], - ['8834', 'subset of'], - ['8835', 'superset of'], - ['8836', 'not a subset of'], - ['8838', 'subset of or equal to'], - ['8839', 'superset of or equal to'], - ['8853', 'circled plus'], - ['8855', 'circled times'], - ['8869', 'perpendicular'], - ['8901', 'dot operator'], - ['8968', 'left ceiling'], - ['8969', 'right ceiling'], - ['8970', 'left floor'], - ['8971', 'right floor'], - ['9001', 'left-pointing angle bracket'], - ['9002', 'right-pointing angle bracket'], - ['9674', 'lozenge'], - ['9824', 'black spade suit'], - ['9827', 'black club suit'], - ['9829', 'black heart suit'], - ['9830', 'black diamond suit'], - ['8194', 'en space'], - ['8195', 'em space'], - ['8201', 'thin space'], - ['8204', 'zero width non-joiner'], - ['8205', 'zero width joiner'], - ['8206', 'left-to-right mark'], - ['8207', 'right-to-left mark'] - ]; - } - - function charmapFilter(charmap) { - return tinymce.util.Tools.grep(charmap, function(item) { - return isArray(item) && item.length == 2; - }); - } - - function getCharsFromSetting(settingValue) { - if (isArray(settingValue)) { - return [].concat(charmapFilter(settingValue)); - } - - if (typeof settingValue == "function") { - return settingValue(); - } - - return []; - } - - function extendCharMap(charmap) { - var settings = editor.settings; - - if (settings.charmap) { - charmap = getCharsFromSetting(settings.charmap); - } - - if (settings.charmap_append) { - return [].concat(charmap).concat(getCharsFromSetting(settings.charmap_append)); - } - - return charmap; - } - - function getCharMap() { - return extendCharMap(getDefaultCharMap()); - } - - function insertChar(chr) { - editor.fire('insertCustomChar', {chr: chr}).chr; - editor.execCommand('mceInsertContent', false, chr); - } - - function showDialog() { - var gridHtml, x, y, win; - - function getParentTd(elm) { - while (elm) { - if (elm.nodeName == 'TD') { - return elm; - } - - elm = elm.parentNode; - } - } - - gridHtml = ''; - - var charmap = getCharMap(); - var width = Math.min(charmap.length, 25); - var height = Math.ceil(charmap.length / width); - for (y = 0; y < height; y++) { - gridHtml += ''; - - for (x = 0; x < width; x++) { - var index = y * width + x; - if (index < charmap.length) { - var chr = charmap[index]; - var chrText = chr ? String.fromCharCode(parseInt(chr[0], 10)) : ' '; - - gridHtml += ( - '' - ); - } else { - gridHtml += ''; - } - - gridHtml += ''; - - var charMapPanel = { - type: 'container', - html: gridHtml, - onclick: function(e) { - var target = e.target; - - if (/^(TD|DIV)$/.test(target.nodeName)) { - if (getParentTd(target).firstChild) { - insertChar(target.getAttribute('data-chr')); - - if (!e.ctrlKey) { - win.close(); - } - } - } - }, - onmouseover: function(e) { - var td = getParentTd(e.target); - - if (td && td.firstChild) { - win.find('#preview').text(td.firstChild.firstChild.data); - win.find('#previewTitle').text(td.title); - } else { - win.find('#preview').text(' '); - win.find('#previewTitle').text(' '); - } - } - }; - - win = editor.windowManager.open({ - title: "Special character", - spacing: 10, - padding: 10, - items: [ - charMapPanel, - { - type: 'container', - layout: 'flex', - direction: 'column', - align: 'center', - spacing: 5, - minWidth: 160, - minHeight: 160, - items: [ - { - type: 'label', - name: 'preview', - text: ' ', - style: 'font-size: 40px; text-align: center', - border: 1, - minWidth: 140, - minHeight: 80 - }, - { - type: 'label', - name: 'previewTitle', - text: ' ', - style: 'text-align: center', - border: 1, - minWidth: 140, - minHeight: 80 - } - ] - } - ], - buttons: [ - {text: "Close", onclick: function() { - win.close(); - }} - ] - }); - } - - editor.addCommand('mceShowCharmap', showDialog); - - editor.addButton('charmap', { - icon: 'charmap', - tooltip: 'Special character', - cmd: 'mceShowCharmap' - }); - - editor.addMenuItem('charmap', { - icon: 'charmap', - text: 'Special character', - cmd: 'mceShowCharmap', - context: 'insert' - }); - - return { - getCharMap: getCharMap, - insertChar: insertChar - }; -}); diff --git a/wp/wp-includes/js/tinymce/plugins/charmap/plugin.min.js b/wp/wp-includes/js/tinymce/plugins/charmap/plugin.min.js deleted file mode 100644 index 0589cd12..00000000 --- a/wp/wp-includes/js/tinymce/plugins/charmap/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("charmap",function(e){function t(){return[["160","no-break space"],["173","soft hyphen"],["34","quotation mark"],["162","cent sign"],["8364","euro sign"],["163","pound sign"],["165","yen sign"],["169","copyright sign"],["174","registered sign"],["8482","trade mark sign"],["8240","per mille sign"],["181","micro sign"],["183","middle dot"],["8226","bullet"],["8230","three dot leader"],["8242","minutes / feet"],["8243","seconds / inches"],["167","section sign"],["182","paragraph sign"],["223","sharp s / ess-zed"],["8249","single left-pointing angle quotation mark"],["8250","single right-pointing angle quotation mark"],["171","left pointing guillemet"],["187","right pointing guillemet"],["8216","left single quotation mark"],["8217","right single quotation mark"],["8220","left double quotation mark"],["8221","right double quotation mark"],["8218","single low-9 quotation mark"],["8222","double low-9 quotation mark"],["60","less-than sign"],["62","greater-than sign"],["8804","less-than or equal to"],["8805","greater-than or equal to"],["8211","en dash"],["8212","em dash"],["175","macron"],["8254","overline"],["164","currency sign"],["166","broken bar"],["168","diaeresis"],["161","inverted exclamation mark"],["191","turned question mark"],["710","circumflex accent"],["732","small tilde"],["176","degree sign"],["8722","minus sign"],["177","plus-minus sign"],["247","division sign"],["8260","fraction slash"],["215","multiplication sign"],["185","superscript one"],["178","superscript two"],["179","superscript three"],["188","fraction one quarter"],["189","fraction one half"],["190","fraction three quarters"],["402","function / florin"],["8747","integral"],["8721","n-ary sumation"],["8734","infinity"],["8730","square root"],["8764","similar to"],["8773","approximately equal to"],["8776","almost equal to"],["8800","not equal to"],["8801","identical to"],["8712","element of"],["8713","not an element of"],["8715","contains as member"],["8719","n-ary product"],["8743","logical and"],["8744","logical or"],["172","not sign"],["8745","intersection"],["8746","union"],["8706","partial differential"],["8704","for all"],["8707","there exists"],["8709","diameter"],["8711","backward difference"],["8727","asterisk operator"],["8733","proportional to"],["8736","angle"],["180","acute accent"],["184","cedilla"],["170","feminine ordinal indicator"],["186","masculine ordinal indicator"],["8224","dagger"],["8225","double dagger"],["192","A - grave"],["193","A - acute"],["194","A - circumflex"],["195","A - tilde"],["196","A - diaeresis"],["197","A - ring above"],["256","A - macron"],["198","ligature AE"],["199","C - cedilla"],["200","E - grave"],["201","E - acute"],["202","E - circumflex"],["203","E - diaeresis"],["274","E - macron"],["204","I - grave"],["205","I - acute"],["206","I - circumflex"],["207","I - diaeresis"],["298","I - macron"],["208","ETH"],["209","N - tilde"],["210","O - grave"],["211","O - acute"],["212","O - circumflex"],["213","O - tilde"],["214","O - diaeresis"],["216","O - slash"],["332","O - macron"],["338","ligature OE"],["352","S - caron"],["217","U - grave"],["218","U - acute"],["219","U - circumflex"],["220","U - diaeresis"],["362","U - macron"],["221","Y - acute"],["376","Y - diaeresis"],["562","Y - macron"],["222","THORN"],["224","a - grave"],["225","a - acute"],["226","a - circumflex"],["227","a - tilde"],["228","a - diaeresis"],["229","a - ring above"],["257","a - macron"],["230","ligature ae"],["231","c - cedilla"],["232","e - grave"],["233","e - acute"],["234","e - circumflex"],["235","e - diaeresis"],["275","e - macron"],["236","i - grave"],["237","i - acute"],["238","i - circumflex"],["239","i - diaeresis"],["299","i - macron"],["240","eth"],["241","n - tilde"],["242","o - grave"],["243","o - acute"],["244","o - circumflex"],["245","o - tilde"],["246","o - diaeresis"],["248","o slash"],["333","o macron"],["339","ligature oe"],["353","s - caron"],["249","u - grave"],["250","u - acute"],["251","u - circumflex"],["252","u - diaeresis"],["363","u - macron"],["253","y - acute"],["254","thorn"],["255","y - diaeresis"],["563","y - macron"],["913","Alpha"],["914","Beta"],["915","Gamma"],["916","Delta"],["917","Epsilon"],["918","Zeta"],["919","Eta"],["920","Theta"],["921","Iota"],["922","Kappa"],["923","Lambda"],["924","Mu"],["925","Nu"],["926","Xi"],["927","Omicron"],["928","Pi"],["929","Rho"],["931","Sigma"],["932","Tau"],["933","Upsilon"],["934","Phi"],["935","Chi"],["936","Psi"],["937","Omega"],["945","alpha"],["946","beta"],["947","gamma"],["948","delta"],["949","epsilon"],["950","zeta"],["951","eta"],["952","theta"],["953","iota"],["954","kappa"],["955","lambda"],["956","mu"],["957","nu"],["958","xi"],["959","omicron"],["960","pi"],["961","rho"],["962","final sigma"],["963","sigma"],["964","tau"],["965","upsilon"],["966","phi"],["967","chi"],["968","psi"],["969","omega"],["8501","alef symbol"],["982","pi symbol"],["8476","real part symbol"],["978","upsilon - hook symbol"],["8472","Weierstrass p"],["8465","imaginary part"],["8592","leftwards arrow"],["8593","upwards arrow"],["8594","rightwards arrow"],["8595","downwards arrow"],["8596","left right arrow"],["8629","carriage return"],["8656","leftwards double arrow"],["8657","upwards double arrow"],["8658","rightwards double arrow"],["8659","downwards double arrow"],["8660","left right double arrow"],["8756","therefore"],["8834","subset of"],["8835","superset of"],["8836","not a subset of"],["8838","subset of or equal to"],["8839","superset of or equal to"],["8853","circled plus"],["8855","circled times"],["8869","perpendicular"],["8901","dot operator"],["8968","left ceiling"],["8969","right ceiling"],["8970","left floor"],["8971","right floor"],["9001","left-pointing angle bracket"],["9002","right-pointing angle bracket"],["9674","lozenge"],["9824","black spade suit"],["9827","black club suit"],["9829","black heart suit"],["9830","black diamond suit"],["8194","en space"],["8195","em space"],["8201","thin space"],["8204","zero width non-joiner"],["8205","zero width joiner"],["8206","left-to-right mark"],["8207","right-to-left mark"]]}function n(e){return tinymce.util.Tools.grep(e,function(e){return l(e)&&2==e.length})}function r(e){return l(e)?[].concat(n(e)):"function"==typeof e?e():[]}function i(t){var n=e.settings;return n.charmap&&(t=r(n.charmap)),n.charmap_append?[].concat(t).concat(r(n.charmap_append)):t}function o(){return i(t())}function a(t){e.fire("insertCustomChar",{chr:t}).chr,e.execCommand("mceInsertContent",!1,t)}function s(){function t(e){for(;e;){if("TD"==e.nodeName)return e;e=e.parentNode}}var n,r,i,s;n='';var l=o(),u=Math.min(l.length,25),c=Math.ceil(l.length/u);for(i=0;i",r=0;r
      '+p+"
      "}else n+="
      "}n+="";var h={type:"container",html:n,onclick:function(e){var n=e.target;/^(TD|DIV)$/.test(n.nodeName)&&t(n).firstChild&&(a(n.getAttribute("data-chr")),e.ctrlKey||s.close())},onmouseover:function(e){var n=t(e.target);n&&n.firstChild?(s.find("#preview").text(n.firstChild.firstChild.data),s.find("#previewTitle").text(n.title)):(s.find("#preview").text(" "),s.find("#previewTitle").text(" "))}};s=e.windowManager.open({title:"Special character",spacing:10,padding:10,items:[h,{type:"container",layout:"flex",direction:"column",align:"center",spacing:5,minWidth:160,minHeight:160,items:[{type:"label",name:"preview",text:" ",style:"font-size: 40px; text-align: center",border:1,minWidth:140,minHeight:80},{type:"label",name:"previewTitle",text:" ",style:"text-align: center",border:1,minWidth:140,minHeight:80}]}],buttons:[{text:"Close",onclick:function(){s.close()}}]})}var l=tinymce.util.Tools.isArray;return e.addCommand("mceShowCharmap",s),e.addButton("charmap",{icon:"charmap",tooltip:"Special character",cmd:"mceShowCharmap"}),e.addMenuItem("charmap",{icon:"charmap",text:"Special character",cmd:"mceShowCharmap",context:"insert"}),{getCharMap:o,insertChar:a}}); \ No newline at end of file diff --git a/wp/wp-includes/js/tinymce/plugins/colorpicker/plugin.js b/wp/wp-includes/js/tinymce/plugins/colorpicker/plugin.js deleted file mode 100644 index e82daa3b..00000000 --- a/wp/wp-includes/js/tinymce/plugins/colorpicker/plugin.js +++ /dev/null @@ -1,112 +0,0 @@ -/** - * plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/*global tinymce:true */ - -tinymce.PluginManager.add('colorpicker', function(editor) { - function colorPickerCallback(callback, value) { - function setColor(value) { - var color = new tinymce.util.Color(value), rgb = color.toRgb(); - - win.fromJSON({ - r: rgb.r, - g: rgb.g, - b: rgb.b, - hex: color.toHex().substr(1) - }); - - showPreview(color.toHex()); - } - - function showPreview(hexColor) { - win.find('#preview')[0].getEl().style.background = hexColor; - } - - var win = editor.windowManager.open({ - title: 'Color', - items: { - type: 'container', - layout: 'flex', - direction: 'row', - align: 'stretch', - padding: 5, - spacing: 10, - items: [ - { - type: 'colorpicker', - value: value, - onchange: function() { - var rgb = this.rgb(); - - if (win) { - win.find('#r').value(rgb.r); - win.find('#g').value(rgb.g); - win.find('#b').value(rgb.b); - win.find('#hex').value(this.value().substr(1)); - showPreview(this.value()); - } - } - }, - { - type: 'form', - padding: 0, - labelGap: 5, - defaults: { - type: 'textbox', - size: 7, - value: '0', - flex: 1, - spellcheck: false, - onchange: function() { - var colorPickerCtrl = win.find('colorpicker')[0]; - var name, value; - - name = this.name(); - value = this.value(); - - if (name == "hex") { - value = '#' + value; - setColor(value); - colorPickerCtrl.value(value); - return; - } - - value = { - r: win.find('#r').value(), - g: win.find('#g').value(), - b: win.find('#b').value() - }; - - colorPickerCtrl.value(value); - setColor(value); - } - }, - items: [ - {name: 'r', label: 'R', autofocus: 1}, - {name: 'g', label: 'G'}, - {name: 'b', label: 'B'}, - {name: 'hex', label: '#', value: '000000'}, - {name: 'preview', type: 'container', border: 1} - ] - } - ] - }, - onSubmit: function() { - callback('#' + this.toJSON().hex); - } - }); - - setColor(value); - } - - if (!editor.settings.color_picker_callback) { - editor.settings.color_picker_callback = colorPickerCallback; - } -}); \ No newline at end of file diff --git a/wp/wp-includes/js/tinymce/plugins/colorpicker/plugin.min.js b/wp/wp-includes/js/tinymce/plugins/colorpicker/plugin.min.js deleted file mode 100644 index b56b88f4..00000000 --- a/wp/wp-includes/js/tinymce/plugins/colorpicker/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("colorpicker",function(e){function t(t,n){function r(e){var t=new tinymce.util.Color(e),n=t.toRgb();o.fromJSON({r:n.r,g:n.g,b:n.b,hex:t.toHex().substr(1)}),i(t.toHex())}function i(e){o.find("#preview")[0].getEl().style.background=e}var o=e.windowManager.open({title:"Color",items:{type:"container",layout:"flex",direction:"row",align:"stretch",padding:5,spacing:10,items:[{type:"colorpicker",value:n,onchange:function(){var e=this.rgb();o&&(o.find("#r").value(e.r),o.find("#g").value(e.g),o.find("#b").value(e.b),o.find("#hex").value(this.value().substr(1)),i(this.value()))}},{type:"form",padding:0,labelGap:5,defaults:{type:"textbox",size:7,value:"0",flex:1,spellcheck:!1,onchange:function(){var e,t,n=o.find("colorpicker")[0];return e=this.name(),t=this.value(),"hex"==e?(t="#"+t,r(t),void n.value(t)):(t={r:o.find("#r").value(),g:o.find("#g").value(),b:o.find("#b").value()},n.value(t),void r(t))}},items:[{name:"r",label:"R",autofocus:1},{name:"g",label:"G"},{name:"b",label:"B"},{name:"hex",label:"#",value:"000000"},{name:"preview",type:"container",border:1}]}]},onSubmit:function(){t("#"+this.toJSON().hex)}});r(n)}e.settings.color_picker_callback||(e.settings.color_picker_callback=t)}); \ No newline at end of file diff --git a/wp/wp-includes/js/tinymce/plugins/compat3x/css/dialog.css b/wp/wp-includes/js/tinymce/plugins/compat3x/css/dialog.css deleted file mode 100644 index 0aacc8b3..00000000 --- a/wp/wp-includes/js/tinymce/plugins/compat3x/css/dialog.css +++ /dev/null @@ -1,210 +0,0 @@ -/* Generic */ -body { -font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; -font-size:13px; -background:#fcfcfc; -padding:0; -margin:8px 8px 0 8px; -} - -textarea {resize:none;outline:none;} - -a:link, a:hover { - color: #2B6FB6; -} - -a:visited { - color: #3C2BB6; -} - -.nowrap {white-space: nowrap} - -/* Forms */ -form {margin: 0;} -fieldset {margin:0; padding:4px; border:1px solid #dfdfdf; font-family:Verdana, Arial; font-size:10px;} -legend {color:#2B6FB6; font-weight:bold;} -label.msg {display:none;} -label.invalid {color:#EE0000; display:inline;} -input.invalid {border:1px solid #EE0000;} -input {background:#FFF; border:1px solid #dfdfdf;} -input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} -input, select, textarea {border:1px solid #dfdfdf;} -input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} -input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} -.input_noborder {border:0;} - -/* Buttons */ -#insert, -#cancel, -#apply, -.mceActionPanel .button, -input.mceButton, -.updateButton { - display: inline-block; - text-decoration: none; - border: 1px solid #adadad; - margin: 0; - padding: 0 10px 1px; - font-size: 13px; - height: 24px; - line-height: 22px; - color: #333; - cursor: pointer; - -webkit-border-radius: 3px; - -webkit-appearance: none; - border-radius: 3px; - white-space: nowrap; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - background: #fafafa; - background-image: -webkit-gradient(linear, left top, left bottom, from(#fafafa), to(#e9e9e9)); - background-image: -webkit-linear-gradient(top, #fafafa, #e9e9e9); - background-image: -moz-linear-gradient(top, #fafafa, #e9e9e9); - background-image: -o-linear-gradient(top, #fafafa, #e9e9e9); - background-image: linear-gradient(to bottom, #fafafa, #e9e9e9); - - text-shadow: 0 1px 0 #fff; - -webkit-box-shadow: inset 0 1px 0 #fff; - -moz-box-shadow: inset 0 1px 0 #fff; - box-shadow: inset 0 1px 0 #fff; -} - -#insert { - background: #2ea2cc; - background: -webkit-gradient(linear, left top, left bottom, from(#2ea2cc), to(#1e8cbe)); - background: -webkit-linear-gradient(top, #2ea2cc 0%,#1e8cbe 100%); - background: linear-gradient(top, #2ea2cc 0%,#1e8cbe 100%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#2ea2cc', endColorstr='#1e8cbe',GradientType=0 ); - border-color: #0074a2; - -webkit-box-shadow: inset 0 1px 0 rgba(120,200,230,0.5); - box-shadow: inset 0 1px 0 rgba(120,200,230,0.5); - color: #fff; - text-decoration: none; - text-shadow: 0 1px 0 rgba(0,86,132,0.7); -} - -#cancel:hover, -input.mceButton:hover, -.updateButton:hover, -#cancel:focus, -input.mceButton:focus, -.updateButton:focus { - background: #f3f3f3; - background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f3f3f3)); - background-image: -webkit-linear-gradient(top, #fff, #f3f3f3); - background-image: -moz-linear-gradient(top, #fff, #f3f3f3); - background-image: -ms-linear-gradient(top, #fff, #f3f3f3); - background-image: -o-linear-gradient(top, #fff, #f3f3f3); - background-image: linear-gradient(to bottom, #fff, #f3f3f3); - border-color: #999; - color: #222; -} - -#insert:hover, -#insert:focus { - background: #1e8cbe; - background: -webkit-gradient(linear, left top, left bottom, from(#1e8cbe), to(#0074a2)); - background: -webkit-linear-gradient(top, #1e8cbe 0%,#0074a2 100%); - background: linear-gradient(top, #1e8cbe 0%,#0074a2 100%); - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e8cbe', endColorstr='#0074a2',GradientType=0 ); - border-color: #0074a2; - -webkit-box-shadow: inset 0 1px 0 rgba(120,200,230,0.6); - box-shadow: inset 0 1px 0 rgba(120,200,230,0.6); - color: #fff; -} - -.mceActionPanel #insert { - float: right; -} - -/* Browse */ -a.pickcolor, a.browse {text-decoration:none} -a.browse span {display:block; width:20px; height:18px; border:1px solid #FFF; margin-left:1px;} -.mceOldBoxModel a.browse span {width:22px; height:20px;} -a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} -a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30);} -a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} -a.pickcolor span {display:block; width:20px; height:16px; margin-left:2px;} -.mceOldBoxModel a.pickcolor span {width:21px; height:17px;} -a.pickcolor:hover span {background-color:#B2BBD0;} -div.iframecontainer {background: #fff;} - -/* Charmap */ -table.charmap {border:1px solid #AAA; text-align:center} -td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} -#charmap a {display:block; color:#000; text-decoration:none; border:0} -#charmap a:hover {background:#CCC;color:#2B6FB6} -#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} -#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} -#charmap #charmapView {background-color:#fff;} - -/* Source */ -.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} -.mceActionPanel {margin-top:5px;} - -/* Tabs classes */ -.tabs {width:100%; height:19px; line-height:normal; border-bottom: 1px solid #aaa;} -.tabs ul {margin:0; padding:0; list-style:none;} -.tabs li {float:left; border: 1px solid #aaa; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} -.tabs li.current {border-bottom: 1px solid #fff; margin-right:2px;} -.tabs span {float:left; display:block; padding:0px 10px 0 0;} -.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} -.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} - -.wp-core-ui #tabs { - padding-bottom: 5px; - background-color: transparent; -} - -.wp-core-ui #tabs a { - padding: 6px 10px; - margin: 0 2px; -} - -/* Panels */ -.panel_wrapper div.panel {display:none;} -.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} -.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} - -/* Columns */ -.column {float:left;} -.properties {width:100%;} -.properties .column1 {} -.properties .column2 {text-align:left;} - -/* Titles */ -h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} -h3 {font-size:14px;} -.title {font-size:12px; font-weight:bold; color:#2B6FB6;} - -/* Dialog specific */ -#link .panel_wrapper, #link div.current {height:125px;} -#image .panel_wrapper, #image div.current {height:200px;} -#plugintable thead {font-weight:bold; background:#DDD;} -#plugintable, #about #plugintable td {border:1px solid #919B9C;} -#plugintable {width:96%; margin-top:10px;} -#pluginscontainer {height:290px; overflow:auto;} -#colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px} -#colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline} -#colorpicker #preview_wrapper {text-align:center; padding-top:4px; white-space: nowrap; float: right;} -#colorpicker #insert, #colorpicker #cancel {width: 90px} -#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} -#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} -#colorpicker #light div {overflow:hidden;} -#colorpicker .panel_wrapper div.current {height:175px;} -#colorpicker #namedcolors {width:150px;} -#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} -#colorpicker #colornamecontainer {margin-top:5px;} -#colorpicker #picker_panel fieldset {margin:auto;width:325px;} - - -/* Localization */ - -body[dir="rtl"], -body[dir="rtl"] fieldset, -body[dir="rtl"] input, body[dir="rtl"] select, body[dir="rtl"] textarea, -body[dir="rtl"] #charmap #codeN, -body[dir="rtl"] .tabs a { - font-family: Tahoma, sans-serif; -} diff --git a/wp/wp-includes/js/tinymce/plugins/compat3x/plugin.js b/wp/wp-includes/js/tinymce/plugins/compat3x/plugin.js deleted file mode 100644 index 1cc4e1bc..00000000 --- a/wp/wp-includes/js/tinymce/plugins/compat3x/plugin.js +++ /dev/null @@ -1,306 +0,0 @@ -/** - * plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/*global tinymce:true, console:true */ -/*eslint no-console:0, new-cap:0 */ - -/** - * This plugin adds missing events form the 4.x API back. Not every event is - * properly supported but most things should work. - * - * Unsupported things: - * - No editor.onEvent - * - Can't cancel execCommands with beforeExecCommand - */ -(function(tinymce) { - var reported; - - function noop() { - } - - function log(apiCall) { - if (!reported && window && window.console) { - reported = true; - console.log("Deprecated TinyMCE API call: " + apiCall); - } - } - - function Dispatcher(target, newEventName, argsMap, defaultScope) { - target = target || this; - - if (!newEventName) { - this.add = this.addToTop = this.remove = this.dispatch = noop; - return; - } - - this.add = function(callback, scope, prepend) { - log('.on' + newEventName + ".add(..)"); - - // Convert callback({arg1:x, arg2:x}) -> callback(arg1, arg2) - function patchedEventCallback(e) { - var callbackArgs = []; - - if (typeof argsMap == "string") { - argsMap = argsMap.split(" "); - } - - if (argsMap && typeof argsMap != "function") { - for (var i = 0; i < argsMap.length; i++) { - callbackArgs.push(e[argsMap[i]]); - } - } - - if (typeof argsMap == "function") { - callbackArgs = argsMap(newEventName, e, target); - if (!callbackArgs) { - return; - } - } - - if (!argsMap) { - callbackArgs = [e]; - } - - callbackArgs.unshift(defaultScope || target); - - if (callback.apply(scope || defaultScope || target, callbackArgs) === false) { - e.stopImmediatePropagation(); - } - } - - target.on(newEventName, patchedEventCallback, prepend); - - return patchedEventCallback; - }; - - this.addToTop = function(callback, scope) { - this.add(callback, scope, true); - }; - - this.remove = function(callback) { - return target.off(newEventName, callback); - }; - - this.dispatch = function() { - target.fire(newEventName); - - return true; - }; - } - - tinymce.util.Dispatcher = Dispatcher; - tinymce.onBeforeUnload = new Dispatcher(tinymce, "BeforeUnload"); - tinymce.onAddEditor = new Dispatcher(tinymce, "AddEditor", "editor"); - tinymce.onRemoveEditor = new Dispatcher(tinymce, "RemoveEditor", "editor"); - - tinymce.util.Cookie = { - get: noop, getHash: noop, remove: noop, set: noop, setHash: noop - }; - - function patchEditor(editor) { - - function translate(str) { - var prefix = editor.settings.language || "en"; - var prefixedStr = [prefix, str].join('.'); - var translatedStr = tinymce.i18n.translate(prefixedStr); - - return prefixedStr !== translatedStr ? translatedStr : tinymce.i18n.translate(str); - } - - function patchEditorEvents(oldEventNames, argsMap) { - tinymce.each(oldEventNames.split(" "), function(oldName) { - editor["on" + oldName] = new Dispatcher(editor, oldName, argsMap); - }); - } - - function convertUndoEventArgs(type, event, target) { - return [ - event.level, - target - ]; - } - - function filterSelectionEvents(needsSelection) { - return function(type, e) { - if ((!e.selection && !needsSelection) || e.selection == needsSelection) { - return [e]; - } - }; - } - - if (editor.controlManager) { - return; - } - - function cmNoop() { - var obj = {}, methods = 'add addMenu addSeparator collapse createMenu destroy displayColor expand focus ' + - 'getLength hasMenus hideMenu isActive isCollapsed isDisabled isRendered isSelected mark ' + - 'postRender remove removeAll renderHTML renderMenu renderNode renderTo select selectByIndex ' + - 'setActive setAriaProperty setColor setDisabled setSelected setState showMenu update'; - - log('editor.controlManager.*'); - - function _noop() { - return cmNoop(); - } - - tinymce.each(methods.split(' '), function(method) { - obj[method] = _noop; - }); - - return obj; - } - - editor.controlManager = { - buttons: {}, - - setDisabled: function(name, state) { - log("controlManager.setDisabled(..)"); - - if (this.buttons[name]) { - this.buttons[name].disabled(state); - } - }, - - setActive: function(name, state) { - log("controlManager.setActive(..)"); - - if (this.buttons[name]) { - this.buttons[name].active(state); - } - }, - - onAdd: new Dispatcher(), - onPostRender: new Dispatcher(), - - add: function(obj) { - return obj; - }, - createButton: cmNoop, - createColorSplitButton: cmNoop, - createControl: cmNoop, - createDropMenu: cmNoop, - createListBox: cmNoop, - createMenuButton: cmNoop, - createSeparator: cmNoop, - createSplitButton: cmNoop, - createToolbar: cmNoop, - createToolbarGroup: cmNoop, - destroy: noop, - get: noop, - setControlType: cmNoop - }; - - patchEditorEvents("PreInit BeforeRenderUI PostRender Load Init Remove Activate Deactivate", "editor"); - patchEditorEvents("Click MouseUp MouseDown DblClick KeyDown KeyUp KeyPress ContextMenu Paste Submit Reset"); - patchEditorEvents("BeforeExecCommand ExecCommand", "command ui value args"); // args.terminate not supported - patchEditorEvents("PreProcess PostProcess LoadContent SaveContent Change"); - patchEditorEvents("BeforeSetContent BeforeGetContent SetContent GetContent", filterSelectionEvents(false)); - patchEditorEvents("SetProgressState", "state time"); - patchEditorEvents("VisualAid", "element hasVisual"); - patchEditorEvents("Undo Redo", convertUndoEventArgs); - - patchEditorEvents("NodeChange", function(type, e) { - return [ - editor.controlManager, - e.element, - editor.selection.isCollapsed(), - e - ]; - }); - - var originalAddButton = editor.addButton; - editor.addButton = function(name, settings) { - var originalOnPostRender; - - function patchedPostRender() { - editor.controlManager.buttons[name] = this; - - if (originalOnPostRender) { - return originalOnPostRender.apply(this, arguments); - } - } - - for (var key in settings) { - if (key.toLowerCase() === "onpostrender") { - originalOnPostRender = settings[key]; - settings.onPostRender = patchedPostRender; - } - } - - if (!originalOnPostRender) { - settings.onPostRender = patchedPostRender; - } - - if (settings.title) { - settings.title = translate(settings.title); - } - - return originalAddButton.call(this, name, settings); - }; - - editor.on('init', function() { - var undoManager = editor.undoManager, selection = editor.selection; - - undoManager.onUndo = new Dispatcher(editor, "Undo", convertUndoEventArgs, null, undoManager); - undoManager.onRedo = new Dispatcher(editor, "Redo", convertUndoEventArgs, null, undoManager); - undoManager.onBeforeAdd = new Dispatcher(editor, "BeforeAddUndo", null, undoManager); - undoManager.onAdd = new Dispatcher(editor, "AddUndo", null, undoManager); - - selection.onBeforeGetContent = new Dispatcher(editor, "BeforeGetContent", filterSelectionEvents(true), selection); - selection.onGetContent = new Dispatcher(editor, "GetContent", filterSelectionEvents(true), selection); - selection.onBeforeSetContent = new Dispatcher(editor, "BeforeSetContent", filterSelectionEvents(true), selection); - selection.onSetContent = new Dispatcher(editor, "SetContent", filterSelectionEvents(true), selection); - }); - - editor.on('BeforeRenderUI', function() { - var windowManager = editor.windowManager; - - windowManager.onOpen = new Dispatcher(); - windowManager.onClose = new Dispatcher(); - windowManager.createInstance = function(className, a, b, c, d, e) { - log("windowManager.createInstance(..)"); - - var constr = tinymce.resolve(className); - return new constr(a, b, c, d, e); - }; - }); - } - - tinymce.on('SetupEditor', patchEditor); - tinymce.PluginManager.add("compat3x", patchEditor); - - tinymce.addI18n = function(prefix, o) { - var I18n = tinymce.util.I18n, each = tinymce.each; - - if (typeof prefix == "string" && prefix.indexOf('.') === -1) { - I18n.add(prefix, o); - return; - } - - if (!tinymce.is(prefix, 'string')) { - each(prefix, function(o, lc) { - each(o, function(o, g) { - each(o, function(o, k) { - if (g === 'common') { - I18n.data[lc + '.' + k] = o; - } else { - I18n.data[lc + '.' + g + '.' + k] = o; - } - }); - }); - }); - } else { - each(o, function(o, k) { - I18n.data[prefix + '.' + k] = o; - }); - } - }; -})(tinymce); diff --git a/wp/wp-includes/js/tinymce/plugins/compat3x/plugin.min.js b/wp/wp-includes/js/tinymce/plugins/compat3x/plugin.min.js deleted file mode 100644 index cc3a3606..00000000 --- a/wp/wp-includes/js/tinymce/plugins/compat3x/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){function t(){}function n(e){!o&&window&&window.console&&(o=!0,console.log("Deprecated TinyMCE API call: "+e))}function r(e,r,i,o){return e=e||this,r?(this.add=function(t,a,s){function l(n){var s=[];if("string"==typeof i&&(i=i.split(" ")),i&&"function"!=typeof i)for(var l=0;l.on"+r+".add(..)"),e.on(r,l,s),l},this.addToTop=function(e,t){this.add(e,t,!0)},this.remove=function(t){return e.off(r,t)},void(this.dispatch=function(){return e.fire(r),!0})):void(this.add=this.addToTop=this.remove=this.dispatch=t)}function i(i){function o(t){var n=i.settings.language||"en",r=[n,t].join("."),o=e.i18n.translate(r);return r!==o?o:e.i18n.translate(t)}function a(t,n){e.each(t.split(" "),function(e){i["on"+e]=new r(i,e,n)})}function s(e,t,n){return[t.level,n]}function l(e){return function(t,n){if(!n.selection&&!e||n.selection==e)return[n]}}function u(){function t(){return u()}var r={},i="add addMenu addSeparator collapse createMenu destroy displayColor expand focus getLength hasMenus hideMenu isActive isCollapsed isDisabled isRendered isSelected mark postRender remove removeAll renderHTML renderMenu renderNode renderTo select selectByIndex setActive setAriaProperty setColor setDisabled setSelected setState showMenu update";return n("editor.controlManager.*"),e.each(i.split(" "),function(e){r[e]=t}),r}if(!i.controlManager){i.controlManager={buttons:{},setDisabled:function(e,t){n("controlManager.setDisabled(..)"),this.buttons[e]&&this.buttons[e].disabled(t)},setActive:function(e,t){n("controlManager.setActive(..)"),this.buttons[e]&&this.buttons[e].active(t)},onAdd:new r,onPostRender:new r,add:function(e){return e},createButton:u,createColorSplitButton:u,createControl:u,createDropMenu:u,createListBox:u,createMenuButton:u,createSeparator:u,createSplitButton:u,createToolbar:u,createToolbarGroup:u,destroy:t,get:t,setControlType:u},a("PreInit BeforeRenderUI PostRender Load Init Remove Activate Deactivate","editor"),a("Click MouseUp MouseDown DblClick KeyDown KeyUp KeyPress ContextMenu Paste Submit Reset"),a("BeforeExecCommand ExecCommand","command ui value args"),a("PreProcess PostProcess LoadContent SaveContent Change"),a("BeforeSetContent BeforeGetContent SetContent GetContent",l(!1)),a("SetProgressState","state time"),a("VisualAid","element hasVisual"),a("Undo Redo",s),a("NodeChange",function(e,t){return[i.controlManager,t.element,i.selection.isCollapsed(),t]});var c=i.addButton;i.addButton=function(e,t){function n(){if(i.controlManager.buttons[e]=this,r)return r.apply(this,arguments)}var r;for(var a in t)"onpostrender"===a.toLowerCase()&&(r=t[a],t.onPostRender=n);return r||(t.onPostRender=n),t.title&&(t.title=o(t.title)),c.call(this,e,t)},i.on("init",function(){var e=i.undoManager,t=i.selection;e.onUndo=new r(i,"Undo",s,null,e),e.onRedo=new r(i,"Redo",s,null,e),e.onBeforeAdd=new r(i,"BeforeAddUndo",null,e),e.onAdd=new r(i,"AddUndo",null,e),t.onBeforeGetContent=new r(i,"BeforeGetContent",l(!0),t),t.onGetContent=new r(i,"GetContent",l(!0),t),t.onBeforeSetContent=new r(i,"BeforeSetContent",l(!0),t),t.onSetContent=new r(i,"SetContent",l(!0),t)}),i.on("BeforeRenderUI",function(){var t=i.windowManager;t.onOpen=new r,t.onClose=new r,t.createInstance=function(t,r,i,o,a,s){n("windowManager.createInstance(..)");var l=e.resolve(t);return new l(r,i,o,a,s)}})}}var o;e.util.Dispatcher=r,e.onBeforeUnload=new r(e,"BeforeUnload"),e.onAddEditor=new r(e,"AddEditor","editor"),e.onRemoveEditor=new r(e,"RemoveEditor","editor"),e.util.Cookie={get:t,getHash:t,remove:t,set:t,setHash:t},e.on("SetupEditor",i),e.PluginManager.add("compat3x",i),e.addI18n=function(t,n){var r=e.util.I18n,i=e.each;return"string"==typeof t&&t.indexOf(".")===-1?void r.add(t,n):void(e.is(t,"string")?i(n,function(e,n){r.data[t+"."+n]=e}):i(t,function(e,t){i(e,function(e,n){i(e,function(e,i){"common"===n?r.data[t+"."+i]=e:r.data[t+"."+n+"."+i]=e})})}))}}(tinymce); \ No newline at end of file diff --git a/wp/wp-includes/js/tinymce/plugins/directionality/plugin.js b/wp/wp-includes/js/tinymce/plugins/directionality/plugin.js deleted file mode 100644 index 59257339..00000000 --- a/wp/wp-includes/js/tinymce/plugins/directionality/plugin.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/*global tinymce:true */ - -tinymce.PluginManager.add('directionality', function(editor) { - function setDir(dir) { - var dom = editor.dom, curDir, blocks = editor.selection.getSelectedBlocks(); - - if (blocks.length) { - curDir = dom.getAttrib(blocks[0], "dir"); - - tinymce.each(blocks, function(block) { - // Add dir to block if the parent block doesn't already have that dir - if (!dom.getParent(block.parentNode, "*[dir='" + dir + "']", dom.getRoot())) { - if (curDir != dir) { - dom.setAttrib(block, "dir", dir); - } else { - dom.setAttrib(block, "dir", null); - } - } - }); - - editor.nodeChanged(); - } - } - - function generateSelector(dir) { - var selector = []; - - tinymce.each('h1 h2 h3 h4 h5 h6 div p'.split(' '), function(name) { - selector.push(name + '[dir=' + dir + ']'); - }); - - return selector.join(','); - } - - editor.addCommand('mceDirectionLTR', function() { - setDir("ltr"); - }); - - editor.addCommand('mceDirectionRTL', function() { - setDir("rtl"); - }); - - editor.addButton('ltr', { - title: 'Left to right', - cmd: 'mceDirectionLTR', - stateSelector: generateSelector('ltr') - }); - - editor.addButton('rtl', { - title: 'Right to left', - cmd: 'mceDirectionRTL', - stateSelector: generateSelector('rtl') - }); -}); \ No newline at end of file diff --git a/wp/wp-includes/js/tinymce/plugins/directionality/plugin.min.js b/wp/wp-includes/js/tinymce/plugins/directionality/plugin.min.js deleted file mode 100644 index c472a90a..00000000 --- a/wp/wp-includes/js/tinymce/plugins/directionality/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("directionality",function(e){function t(t){var n,r=e.dom,i=e.selection.getSelectedBlocks();i.length&&(n=r.getAttrib(i[0],"dir"),tinymce.each(i,function(e){r.getParent(e.parentNode,"*[dir='"+t+"']",r.getRoot())||(n!=t?r.setAttrib(e,"dir",t):r.setAttrib(e,"dir",null))}),e.nodeChanged())}function n(e){var t=[];return tinymce.each("h1 h2 h3 h4 h5 h6 div p".split(" "),function(n){t.push(n+"[dir="+e+"]")}),t.join(",")}e.addCommand("mceDirectionLTR",function(){t("ltr")}),e.addCommand("mceDirectionRTL",function(){t("rtl")}),e.addButton("ltr",{title:"Left to right",cmd:"mceDirectionLTR",stateSelector:n("ltr")}),e.addButton("rtl",{title:"Right to left",cmd:"mceDirectionRTL",stateSelector:n("rtl")})}); \ No newline at end of file diff --git a/wp/wp-includes/js/tinymce/plugins/fullscreen/plugin.js b/wp/wp-includes/js/tinymce/plugins/fullscreen/plugin.js deleted file mode 100644 index 19086860..00000000 --- a/wp/wp-includes/js/tinymce/plugins/fullscreen/plugin.js +++ /dev/null @@ -1,154 +0,0 @@ -/** - * plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/*global tinymce:true */ - -tinymce.PluginManager.add('fullscreen', function(editor) { - var fullscreenState = false, DOM = tinymce.DOM, iframeWidth, iframeHeight, resizeHandler; - var containerWidth, containerHeight, scrollPos; - - if (editor.settings.inline) { - return; - } - - function getWindowSize() { - var w, h, win = window, doc = document; - var body = doc.body; - - // Old IE - if (body.offsetWidth) { - w = body.offsetWidth; - h = body.offsetHeight; - } - - // Modern browsers - if (win.innerWidth && win.innerHeight) { - w = win.innerWidth; - h = win.innerHeight; - } - - return {w: w, h: h}; - } - - function getScrollPos() { - var vp = tinymce.DOM.getViewPort(); - - return { - x: vp.x, - y: vp.y - }; - } - - function setScrollPos(pos) { - scrollTo(pos.x, pos.y); - } - - function toggleFullscreen() { - var body = document.body, documentElement = document.documentElement, editorContainerStyle; - var editorContainer, iframe, iframeStyle; - - function resize() { - DOM.setStyle(iframe, 'height', getWindowSize().h - (editorContainer.clientHeight - iframe.clientHeight)); - } - - fullscreenState = !fullscreenState; - - editorContainer = editor.getContainer(); - editorContainerStyle = editorContainer.style; - iframe = editor.getContentAreaContainer().firstChild; - iframeStyle = iframe.style; - - if (fullscreenState) { - scrollPos = getScrollPos(); - iframeWidth = iframeStyle.width; - iframeHeight = iframeStyle.height; - iframeStyle.width = iframeStyle.height = '100%'; - containerWidth = editorContainerStyle.width; - containerHeight = editorContainerStyle.height; - editorContainerStyle.width = editorContainerStyle.height = ''; - - DOM.addClass(body, 'mce-fullscreen'); - DOM.addClass(documentElement, 'mce-fullscreen'); - DOM.addClass(editorContainer, 'mce-fullscreen'); - - DOM.bind(window, 'resize', resize); - resize(); - resizeHandler = resize; - } else { - iframeStyle.width = iframeWidth; - iframeStyle.height = iframeHeight; - - if (containerWidth) { - editorContainerStyle.width = containerWidth; - } - - if (containerHeight) { - editorContainerStyle.height = containerHeight; - } - - DOM.removeClass(body, 'mce-fullscreen'); - DOM.removeClass(documentElement, 'mce-fullscreen'); - DOM.removeClass(editorContainer, 'mce-fullscreen'); - DOM.unbind(window, 'resize', resizeHandler); - setScrollPos(scrollPos); - } - - editor.fire('FullscreenStateChanged', {state: fullscreenState}); - } - - editor.on('init', function() { - editor.addShortcut('Ctrl+Shift+F', '', toggleFullscreen); - }); - - editor.on('remove', function() { - if (resizeHandler) { - DOM.unbind(window, 'resize', resizeHandler); - } - }); - - editor.addCommand('mceFullScreen', toggleFullscreen); - - editor.addMenuItem('fullscreen', { - text: 'Fullscreen', - shortcut: 'Ctrl+Shift+F', - selectable: true, - onClick: function() { - toggleFullscreen(); - editor.focus(); - }, - onPostRender: function() { - var self = this; - - editor.on('FullscreenStateChanged', function(e) { - self.active(e.state); - }); - }, - context: 'view' - }); - - editor.addButton('fullscreen', { - tooltip: 'Fullscreen', - shortcut: 'Ctrl+Shift+F', - onClick: toggleFullscreen, - onPostRender: function() { - var self = this; - - editor.on('FullscreenStateChanged', function(e) { - self.active(e.state); - }); - } - }); - - return { - isFullscreen: function() { - return fullscreenState; - } - }; -}); diff --git a/wp/wp-includes/js/tinymce/plugins/fullscreen/plugin.min.js b/wp/wp-includes/js/tinymce/plugins/fullscreen/plugin.min.js deleted file mode 100644 index b6ca13b8..00000000 --- a/wp/wp-includes/js/tinymce/plugins/fullscreen/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("fullscreen",function(e){function t(){var e,t,n=window,r=document,i=r.body;return i.offsetWidth&&(e=i.offsetWidth,t=i.offsetHeight),n.innerWidth&&n.innerHeight&&(e=n.innerWidth,t=n.innerHeight),{w:e,h:t}}function n(){var e=tinymce.DOM.getViewPort();return{x:e.x,y:e.y}}function r(e){scrollTo(e.x,e.y)}function i(){function i(){f.setStyle(m,"height",t().h-(h.clientHeight-m.clientHeight))}var p,h,m,g,v=document.body,y=document.documentElement;d=!d,h=e.getContainer(),p=h.style,m=e.getContentAreaContainer().firstChild,g=m.style,d?(c=n(),o=g.width,a=g.height,g.width=g.height="100%",l=p.width,u=p.height,p.width=p.height="",f.addClass(v,"mce-fullscreen"),f.addClass(y,"mce-fullscreen"),f.addClass(h,"mce-fullscreen"),f.bind(window,"resize",i),i(),s=i):(g.width=o,g.height=a,l&&(p.width=l),u&&(p.height=u),f.removeClass(v,"mce-fullscreen"),f.removeClass(y,"mce-fullscreen"),f.removeClass(h,"mce-fullscreen"),f.unbind(window,"resize",s),r(c)),e.fire("FullscreenStateChanged",{state:d})}var o,a,s,l,u,c,d=!1,f=tinymce.DOM;if(!e.settings.inline)return e.on("init",function(){e.addShortcut("Ctrl+Shift+F","",i)}),e.on("remove",function(){s&&f.unbind(window,"resize",s)}),e.addCommand("mceFullScreen",i),e.addMenuItem("fullscreen",{text:"Fullscreen",shortcut:"Ctrl+Shift+F",selectable:!0,onClick:function(){i(),e.focus()},onPostRender:function(){var t=this;e.on("FullscreenStateChanged",function(e){t.active(e.state)})},context:"view"}),e.addButton("fullscreen",{tooltip:"Fullscreen",shortcut:"Ctrl+Shift+F",onClick:i,onPostRender:function(){var t=this;e.on("FullscreenStateChanged",function(e){t.active(e.state)})}}),{isFullscreen:function(){return d}}}); \ No newline at end of file diff --git a/wp/wp-includes/js/tinymce/plugins/hr/plugin.js b/wp/wp-includes/js/tinymce/plugins/hr/plugin.js deleted file mode 100644 index 29372f6f..00000000 --- a/wp/wp-includes/js/tinymce/plugins/hr/plugin.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/*global tinymce:true */ - -tinymce.PluginManager.add('hr', function(editor) { - editor.addCommand('InsertHorizontalRule', function() { - editor.execCommand('mceInsertContent', false, '
      '); - }); - - editor.addButton('hr', { - icon: 'hr', - tooltip: 'Horizontal line', - cmd: 'InsertHorizontalRule' - }); - - editor.addMenuItem('hr', { - icon: 'hr', - text: 'Horizontal line', - cmd: 'InsertHorizontalRule', - context: 'insert' - }); -}); diff --git a/wp/wp-includes/js/tinymce/plugins/hr/plugin.min.js b/wp/wp-includes/js/tinymce/plugins/hr/plugin.min.js deleted file mode 100644 index ca36c927..00000000 --- a/wp/wp-includes/js/tinymce/plugins/hr/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("hr",function(e){e.addCommand("InsertHorizontalRule",function(){e.execCommand("mceInsertContent",!1,"
      ")}),e.addButton("hr",{icon:"hr",tooltip:"Horizontal line",cmd:"InsertHorizontalRule"}),e.addMenuItem("hr",{icon:"hr",text:"Horizontal line",cmd:"InsertHorizontalRule",context:"insert"})}); \ No newline at end of file diff --git a/wp/wp-includes/js/tinymce/plugins/image/plugin.js b/wp/wp-includes/js/tinymce/plugins/image/plugin.js deleted file mode 100644 index f789001f..00000000 --- a/wp/wp-includes/js/tinymce/plugins/image/plugin.js +++ /dev/null @@ -1,655 +0,0 @@ -/** - * plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/*global tinymce:true */ - -tinymce.PluginManager.add('image', function(editor) { - function getImageSize(url, callback) { - var img = document.createElement('img'); - - function done(width, height) { - if (img.parentNode) { - img.parentNode.removeChild(img); - } - - callback({width: width, height: height}); - } - - img.onload = function() { - done(Math.max(img.width, img.clientWidth), Math.max(img.height, img.clientHeight)); - }; - - img.onerror = function() { - done(); - }; - - var style = img.style; - style.visibility = 'hidden'; - style.position = 'fixed'; - style.bottom = style.left = 0; - style.width = style.height = 'auto'; - - document.body.appendChild(img); - img.src = url; - } - - function buildListItems(inputList, itemCallback, startItems) { - function appendItems(values, output) { - output = output || []; - - tinymce.each(values, function(item) { - var menuItem = {text: item.text || item.title}; - - if (item.menu) { - menuItem.menu = appendItems(item.menu); - } else { - menuItem.value = item.value; - itemCallback(menuItem); - } - - output.push(menuItem); - }); - - return output; - } - - return appendItems(inputList, startItems || []); - } - - function createImageList(callback) { - return function() { - var imageList = editor.settings.image_list; - - if (typeof imageList == "string") { - tinymce.util.XHR.send({ - url: imageList, - success: function(text) { - callback(tinymce.util.JSON.parse(text)); - } - }); - } else if (typeof imageList == "function") { - imageList(callback); - } else { - callback(imageList); - } - }; - } - - function showDialog(imageList) { - var win, data = {}, dom = editor.dom, imgElm, figureElm; - var width, height, imageListCtrl, classListCtrl, imageDimensions = editor.settings.image_dimensions !== false; - - function recalcSize() { - var widthCtrl, heightCtrl, newWidth, newHeight; - - widthCtrl = win.find('#width')[0]; - heightCtrl = win.find('#height')[0]; - - if (!widthCtrl || !heightCtrl) { - return; - } - - newWidth = widthCtrl.value(); - newHeight = heightCtrl.value(); - - if (win.find('#constrain')[0].checked() && width && height && newWidth && newHeight) { - if (width != newWidth) { - newHeight = Math.round((newWidth / width) * newHeight); - - if (!isNaN(newHeight)) { - heightCtrl.value(newHeight); - } - } else { - newWidth = Math.round((newHeight / height) * newWidth); - - if (!isNaN(newWidth)) { - widthCtrl.value(newWidth); - } - } - } - - width = newWidth; - height = newHeight; - } - - function onSubmitForm() { - var figureElm, oldImg; - - function waitLoad(imgElm) { - function selectImage() { - imgElm.onload = imgElm.onerror = null; - - if (editor.selection) { - editor.selection.select(imgElm); - editor.nodeChanged(); - } - } - - imgElm.onload = function() { - if (!data.width && !data.height && imageDimensions) { - dom.setAttribs(imgElm, { - width: imgElm.clientWidth, - height: imgElm.clientHeight - }); - //WP - editor.fire( 'wpNewImageRefresh', { node: imgElm } ); - } - - selectImage(); - }; - - imgElm.onerror = selectImage; - } - - updateStyle(); - recalcSize(); - - data = tinymce.extend(data, win.toJSON()); - var wpcaption = data.wpcaption; // WP - - if (!data.alt) { - data.alt = ''; - } - - if (!data.title) { - data.title = ''; - } - - if (data.width === '') { - data.width = null; - } - - if (data.height === '') { - data.height = null; - } - - if (!data.style) { - data.style = null; - } - - // Setup new data excluding style properties - /*eslint dot-notation: 0*/ - data = { - src: data.src, - alt: data.alt, - title: data.title, - width: data.width, - height: data.height, - style: data.style, - caption: data.caption, - "class": data["class"] - }; - - editor.undoManager.transact(function() { - // WP - var eventData = { node: imgElm, data: data, wpcaption: wpcaption }; - - editor.fire( 'wpImageFormSubmit', { imgData: eventData } ); - - if ( eventData.cancel ) { - waitLoad( eventData.node ); - return; - } - // WP end - - if (!data.src) { - if (imgElm) { - dom.remove(imgElm); - editor.focus(); - editor.nodeChanged(); - } - - return; - } - - if (data.title === "") { - data.title = null; - } - - if (!imgElm) { - data.id = '__mcenew'; - editor.focus(); - editor.selection.setContent(dom.createHTML('img', data)); - imgElm = dom.get('__mcenew'); - dom.setAttrib(imgElm, 'id', null); - } else { - dom.setAttribs(imgElm, data); - } - - editor.editorUpload.uploadImagesAuto(); - - if (data.caption === false) { - if (dom.is(imgElm.parentNode, 'figure.image')) { - figureElm = imgElm.parentNode; - dom.insertAfter(imgElm, figureElm); - dom.remove(figureElm); - } - } - - function isTextBlock(node) { - return editor.schema.getTextBlockElements()[node.nodeName]; - } - - if (data.caption === true) { - if (!dom.is(imgElm.parentNode, 'figure.image')) { - oldImg = imgElm; - imgElm = imgElm.cloneNode(true); - figureElm = dom.create('figure', {'class': 'image'}); - figureElm.appendChild(imgElm); - figureElm.appendChild(dom.create('figcaption', {contentEditable: true}, 'Caption')); - figureElm.contentEditable = false; - - var textBlock = dom.getParent(oldImg, isTextBlock); - if (textBlock) { - dom.split(textBlock, oldImg, figureElm); - } else { - dom.replace(figureElm, oldImg); - } - - editor.selection.select(figureElm); - } - - return; - } - - waitLoad(imgElm); - }); - } - - function removePixelSuffix(value) { - if (value) { - value = value.replace(/px$/, ''); - } - - return value; - } - - function srcChange(e) { - var srcURL, prependURL, absoluteURLPattern, meta = e.meta || {}; - - if (imageListCtrl) { - imageListCtrl.value(editor.convertURL(this.value(), 'src')); - } - - tinymce.each(meta, function(value, key) { - win.find('#' + key).value(value); - }); - - if (!meta.width && !meta.height) { - srcURL = editor.convertURL(this.value(), 'src'); - - // Pattern test the src url and make sure we haven't already prepended the url - prependURL = editor.settings.image_prepend_url; - absoluteURLPattern = new RegExp('^(?:[a-z]+:)?//', 'i'); - if (prependURL && !absoluteURLPattern.test(srcURL) && srcURL.substring(0, prependURL.length) !== prependURL) { - srcURL = prependURL + srcURL; - } - - this.value(srcURL); - - getImageSize(editor.documentBaseURI.toAbsolute(this.value()), function(data) { - if (data.width && data.height && imageDimensions) { - width = data.width; - height = data.height; - - win.find('#width').value(width); - win.find('#height').value(height); - } - }); - } - } - - function onBeforeCall(e) { - e.meta = win.toJSON(); - } - - imgElm = editor.selection.getNode(); - figureElm = dom.getParent(imgElm, 'figure.image'); - if (figureElm) { - imgElm = dom.select('img', figureElm)[0]; - } - - if (imgElm && (imgElm.nodeName != 'IMG' || imgElm.getAttribute('data-mce-object') || imgElm.getAttribute('data-mce-placeholder'))) { - imgElm = null; - } - - if (imgElm) { - width = dom.getAttrib(imgElm, 'width'); - height = dom.getAttrib(imgElm, 'height'); - - data = { - src: dom.getAttrib(imgElm, 'src'), - alt: dom.getAttrib(imgElm, 'alt'), - title: dom.getAttrib(imgElm, 'title'), - "class": dom.getAttrib(imgElm, 'class'), - width: width, - height: height, - caption: !!figureElm - }; - - // WP - editor.fire( 'wpLoadImageData', { imgData: { data: data, node: imgElm } } ); - } - - if (imageList) { - imageListCtrl = { - type: 'listbox', - label: 'Image list', - values: buildListItems( - imageList, - function(item) { - item.value = editor.convertURL(item.value || item.url, 'src'); - }, - [{text: 'None', value: ''}] - ), - value: data.src && editor.convertURL(data.src, 'src'), - onselect: function(e) { - var altCtrl = win.find('#alt'); - - if (!altCtrl.value() || (e.lastControl && altCtrl.value() == e.lastControl.text())) { - altCtrl.value(e.control.text()); - } - - win.find('#src').value(e.control.value()).fire('change'); - }, - onPostRender: function() { - /*eslint consistent-this: 0*/ - imageListCtrl = this; - } - }; - } - - if (editor.settings.image_class_list) { - classListCtrl = { - name: 'class', - type: 'listbox', - label: 'Class', - values: buildListItems( - editor.settings.image_class_list, - function(item) { - if (item.value) { - item.textStyle = function() { - return editor.formatter.getCssText({inline: 'img', classes: [item.value]}); - }; - } - } - ) - }; - } - - // General settings shared between simple and advanced dialogs - var generalFormItems = [ - { - name: 'src', - type: 'filepicker', - filetype: 'image', - label: 'Source', - autofocus: true, - onchange: srcChange, - onbeforecall: onBeforeCall - }, - imageListCtrl - ]; - - if (editor.settings.image_description !== false) { - generalFormItems.push({name: 'alt', type: 'textbox', label: 'Image description'}); - } - - if (editor.settings.image_title) { - generalFormItems.push({name: 'title', type: 'textbox', label: 'Image Title'}); - } - - if (imageDimensions) { - generalFormItems.push({ - type: 'container', - label: 'Dimensions', - layout: 'flex', - direction: 'row', - align: 'center', - spacing: 5, - items: [ - {name: 'width', type: 'textbox', maxLength: 5, size: 3, onchange: recalcSize, ariaLabel: 'Width'}, - {type: 'label', text: 'x'}, - {name: 'height', type: 'textbox', maxLength: 5, size: 3, onchange: recalcSize, ariaLabel: 'Height'}, - {name: 'constrain', type: 'checkbox', checked: true, text: 'Constrain proportions'} - ] - }); - } - - generalFormItems.push(classListCtrl); - - if (editor.settings.image_caption && tinymce.Env.ceFalse) { - generalFormItems.push({name: 'caption', type: 'checkbox', label: 'Caption'}); - } - - // WP - editor.fire( 'wpLoadImageForm', { data: generalFormItems } ); - - function mergeMargins(css) { - if (css.margin) { - - var splitMargin = css.margin.split(" "); - - switch (splitMargin.length) { - case 1: //margin: toprightbottomleft; - css['margin-top'] = css['margin-top'] || splitMargin[0]; - css['margin-right'] = css['margin-right'] || splitMargin[0]; - css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; - css['margin-left'] = css['margin-left'] || splitMargin[0]; - break; - case 2: //margin: topbottom rightleft; - css['margin-top'] = css['margin-top'] || splitMargin[0]; - css['margin-right'] = css['margin-right'] || splitMargin[1]; - css['margin-bottom'] = css['margin-bottom'] || splitMargin[0]; - css['margin-left'] = css['margin-left'] || splitMargin[1]; - break; - case 3: //margin: top rightleft bottom; - css['margin-top'] = css['margin-top'] || splitMargin[0]; - css['margin-right'] = css['margin-right'] || splitMargin[1]; - css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; - css['margin-left'] = css['margin-left'] || splitMargin[1]; - break; - case 4: //margin: top right bottom left; - css['margin-top'] = css['margin-top'] || splitMargin[0]; - css['margin-right'] = css['margin-right'] || splitMargin[1]; - css['margin-bottom'] = css['margin-bottom'] || splitMargin[2]; - css['margin-left'] = css['margin-left'] || splitMargin[3]; - } - delete css.margin; - } - return css; - } - - function updateStyle() { - function addPixelSuffix(value) { - if (value.length > 0 && /^[0-9]+$/.test(value)) { - value += 'px'; - } - - return value; - } - - if (!editor.settings.image_advtab) { - return; - } - - var data = win.toJSON(), - css = dom.parseStyle(data.style); - - css = mergeMargins(css); - - if (data.vspace) { - css['margin-top'] = css['margin-bottom'] = addPixelSuffix(data.vspace); - } - if (data.hspace) { - css['margin-left'] = css['margin-right'] = addPixelSuffix(data.hspace); - } - if (data.border) { - css['border-width'] = addPixelSuffix(data.border); - } - - win.find('#style').value(dom.serializeStyle(dom.parseStyle(dom.serializeStyle(css)))); - } - - function updateVSpaceHSpaceBorder() { - if (!editor.settings.image_advtab) { - return; - } - - var data = win.toJSON(), - css = dom.parseStyle(data.style); - - win.find('#vspace').value(""); - win.find('#hspace').value(""); - - css = mergeMargins(css); - - //Move opposite equal margins to vspace/hspace field - if ((css['margin-top'] && css['margin-bottom']) || (css['margin-right'] && css['margin-left'])) { - if (css['margin-top'] === css['margin-bottom']) { - win.find('#vspace').value(removePixelSuffix(css['margin-top'])); - } else { - win.find('#vspace').value(''); - } - if (css['margin-right'] === css['margin-left']) { - win.find('#hspace').value(removePixelSuffix(css['margin-right'])); - } else { - win.find('#hspace').value(''); - } - } - - //Move border-width - if (css['border-width']) { - win.find('#border').value(removePixelSuffix(css['border-width'])); - } - - win.find('#style').value(dom.serializeStyle(dom.parseStyle(dom.serializeStyle(css)))); - - } - - if (editor.settings.image_advtab) { - // Parse styles from img - if (imgElm) { - if (imgElm.style.marginLeft && imgElm.style.marginRight && imgElm.style.marginLeft === imgElm.style.marginRight) { - data.hspace = removePixelSuffix(imgElm.style.marginLeft); - } - if (imgElm.style.marginTop && imgElm.style.marginBottom && imgElm.style.marginTop === imgElm.style.marginBottom) { - data.vspace = removePixelSuffix(imgElm.style.marginTop); - } - if (imgElm.style.borderWidth) { - data.border = removePixelSuffix(imgElm.style.borderWidth); - } - - data.style = editor.dom.serializeStyle(editor.dom.parseStyle(editor.dom.getAttrib(imgElm, 'style'))); - } - - // Advanced dialog shows general+advanced tabs - win = editor.windowManager.open({ - title: 'Insert/edit image', - data: data, - bodyType: 'tabpanel', - body: [ - { - title: 'General', - type: 'form', - items: generalFormItems - }, - - { - title: 'Advanced', - type: 'form', - pack: 'start', - items: [ - { - label: 'Style', - name: 'style', - type: 'textbox', - onchange: updateVSpaceHSpaceBorder - }, - { - type: 'form', - layout: 'grid', - packV: 'start', - columns: 2, - padding: 0, - alignH: ['left', 'right'], - defaults: { - type: 'textbox', - maxWidth: 50, - onchange: updateStyle - }, - items: [ - {label: 'Vertical space', name: 'vspace'}, - {label: 'Horizontal space', name: 'hspace'}, - {label: 'Border', name: 'border'} - ] - } - ] - } - ], - onSubmit: onSubmitForm - }); - } else { - // Simple default dialog - win = editor.windowManager.open({ - title: 'Insert/edit image', - data: data, - body: generalFormItems, - onSubmit: onSubmitForm - }); - } - } - - editor.on('preInit', function() { - function hasImageClass(node) { - var className = node.attr('class'); - return className && /\bimage\b/.test(className); - } - - function toggleContentEditableState(state) { - return function(nodes) { - var i = nodes.length, node; - - function toggleContentEditable(node) { - node.attr('contenteditable', state ? 'true' : null); - } - - while (i--) { - node = nodes[i]; - - if (hasImageClass(node)) { - node.attr('contenteditable', state ? 'false' : null); - tinymce.each(node.getAll('figcaption'), toggleContentEditable); - } - } - }; - } - - editor.parser.addNodeFilter('figure', toggleContentEditableState(true)); - editor.serializer.addNodeFilter('figure', toggleContentEditableState(false)); - }); - - editor.addButton('image', { - icon: 'image', - tooltip: 'Insert/edit image', - onclick: createImageList(showDialog), - stateSelector: 'img:not([data-mce-object],[data-mce-placeholder]),figure.image' - }); - - editor.addMenuItem('image', { - icon: 'image', - text: 'Image', - onclick: createImageList(showDialog), - context: 'insert', - prependToContext: true - }); - - editor.addCommand('mceImage', createImageList(showDialog)); -}); diff --git a/wp/wp-includes/js/tinymce/plugins/image/plugin.min.js b/wp/wp-includes/js/tinymce/plugins/image/plugin.min.js deleted file mode 100644 index 6434af6c..00000000 --- a/wp/wp-includes/js/tinymce/plugins/image/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("image",function(a){function b(a,b){function c(a,c){d.parentNode&&d.parentNode.removeChild(d),b({width:a,height:c})}var d=document.createElement("img");d.onload=function(){c(Math.max(d.width,d.clientWidth),Math.max(d.height,d.clientHeight))},d.onerror=function(){c()};var e=d.style;e.visibility="hidden",e.position="fixed",e.bottom=e.left=0,e.width=e.height="auto",document.body.appendChild(d),d.src=a}function c(a,b,c){function d(a,c){return c=c||[],tinymce.each(a,function(a){var e={text:a.text||a.title};a.menu?e.menu=d(a.menu):(e.value=a.value,b(e)),c.push(e)}),c}return d(a,c||[])}function d(b){return function(){var c=a.settings.image_list;"string"==typeof c?tinymce.util.XHR.send({url:c,success:function(a){b(tinymce.util.JSON.parse(a))}}):"function"==typeof c?c(b):b(c)}}function e(d){function e(){var a,b,c,d;a=m.find("#width")[0],b=m.find("#height")[0],a&&b&&(c=a.value(),d=b.value(),m.find("#constrain")[0].checked()&&p&&q&&c&&d&&(p!=c?(d=Math.round(c/p*d),isNaN(d)||b.value(d)):(c=Math.round(d/q*c),isNaN(c)||a.value(c))),p=c,q=d)}function f(){function b(b){function c(){b.onload=b.onerror=null,a.selection&&(a.selection.select(b),a.nodeChanged())}b.onload=function(){t.width||t.height||!v||(u.setAttribs(b,{width:b.clientWidth,height:b.clientHeight}),a.fire("wpNewImageRefresh",{node:b})),c()},b.onerror=c}var c,d;k(),e(),t=tinymce.extend(t,m.toJSON());var f=t.wpcaption;t.alt||(t.alt=""),t.title||(t.title=""),""===t.width&&(t.width=null),""===t.height&&(t.height=null),t.style||(t.style=null),t={src:t.src,alt:t.alt,title:t.title,width:t.width,height:t.height,style:t.style,caption:t.caption,"class":t["class"]},a.undoManager.transact(function(){function e(b){return a.schema.getTextBlockElements()[b.nodeName]}var g={node:n,data:t,wpcaption:f};if(a.fire("wpImageFormSubmit",{imgData:g}),g.cancel)return void b(g.node);if(!t.src)return void(n&&(u.remove(n),a.focus(),a.nodeChanged()));if(""===t.title&&(t.title=null),n?u.setAttribs(n,t):(t.id="__mcenew",a.focus(),a.selection.setContent(u.createHTML("img",t)),n=u.get("__mcenew"),u.setAttrib(n,"id",null)),a.editorUpload.uploadImagesAuto(),t.caption===!1&&u.is(n.parentNode,"figure.image")&&(c=n.parentNode,u.insertAfter(n,c),u.remove(c)),t.caption!==!0)b(n);else if(!u.is(n.parentNode,"figure.image")){d=n,n=n.cloneNode(!0),c=u.create("figure",{"class":"image"}),c.appendChild(n),c.appendChild(u.create("figcaption",{contentEditable:!0},"Caption")),c.contentEditable=!1;var h=u.getParent(d,e);h?u.split(h,d,c):u.replace(c,d),a.selection.select(c)}})}function g(a){return a&&(a=a.replace(/px$/,"")),a}function h(c){var d,e,f,g=c.meta||{};r&&r.value(a.convertURL(this.value(),"src")),tinymce.each(g,function(a,b){m.find("#"+b).value(a)}),g.width||g.height||(d=a.convertURL(this.value(),"src"),e=a.settings.image_prepend_url,f=new RegExp("^(?:[a-z]+:)?//","i"),e&&!f.test(d)&&d.substring(0,e.length)!==e&&(d=e+d),this.value(d),b(a.documentBaseURI.toAbsolute(this.value()),function(a){a.width&&a.height&&v&&(p=a.width,q=a.height,m.find("#width").value(p),m.find("#height").value(q))}))}function i(a){a.meta=m.toJSON()}function j(a){if(a.margin){var b=a.margin.split(" ");switch(b.length){case 1:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[0],a["margin-bottom"]=a["margin-bottom"]||b[0],a["margin-left"]=a["margin-left"]||b[0];break;case 2:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[0],a["margin-left"]=a["margin-left"]||b[1];break;case 3:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[2],a["margin-left"]=a["margin-left"]||b[1];break;case 4:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[2],a["margin-left"]=a["margin-left"]||b[3]}delete a.margin}return a}function k(){function b(a){return a.length>0&&/^[0-9]+$/.test(a)&&(a+="px"),a}if(a.settings.image_advtab){var c=m.toJSON(),d=u.parseStyle(c.style);d=j(d),c.vspace&&(d["margin-top"]=d["margin-bottom"]=b(c.vspace)),c.hspace&&(d["margin-left"]=d["margin-right"]=b(c.hspace)),c.border&&(d["border-width"]=b(c.border)),m.find("#style").value(u.serializeStyle(u.parseStyle(u.serializeStyle(d))))}}function l(){if(a.settings.image_advtab){var b=m.toJSON(),c=u.parseStyle(b.style);m.find("#vspace").value(""),m.find("#hspace").value(""),c=j(c),(c["margin-top"]&&c["margin-bottom"]||c["margin-right"]&&c["margin-left"])&&(c["margin-top"]===c["margin-bottom"]?m.find("#vspace").value(g(c["margin-top"])):m.find("#vspace").value(""),c["margin-right"]===c["margin-left"]?m.find("#hspace").value(g(c["margin-right"])):m.find("#hspace").value("")),c["border-width"]&&m.find("#border").value(g(c["border-width"])),m.find("#style").value(u.serializeStyle(u.parseStyle(u.serializeStyle(c))))}}var m,n,o,p,q,r,s,t={},u=a.dom,v=a.settings.image_dimensions!==!1;n=a.selection.getNode(),o=u.getParent(n,"figure.image"),o&&(n=u.select("img",o)[0]),n&&("IMG"!=n.nodeName||n.getAttribute("data-mce-object")||n.getAttribute("data-mce-placeholder"))&&(n=null),n&&(p=u.getAttrib(n,"width"),q=u.getAttrib(n,"height"),t={src:u.getAttrib(n,"src"),alt:u.getAttrib(n,"alt"),title:u.getAttrib(n,"title"),"class":u.getAttrib(n,"class"),width:p,height:q,caption:!!o},a.fire("wpLoadImageData",{imgData:{data:t,node:n}})),d&&(r={type:"listbox",label:"Image list",values:c(d,function(b){b.value=a.convertURL(b.value||b.url,"src")},[{text:"None",value:""}]),value:t.src&&a.convertURL(t.src,"src"),onselect:function(a){var b=m.find("#alt");(!b.value()||a.lastControl&&b.value()==a.lastControl.text())&&b.value(a.control.text()),m.find("#src").value(a.control.value()).fire("change")},onPostRender:function(){r=this}}),a.settings.image_class_list&&(s={name:"class",type:"listbox",label:"Class",values:c(a.settings.image_class_list,function(b){b.value&&(b.textStyle=function(){return a.formatter.getCssText({inline:"img",classes:[b.value]})})})});var w=[{name:"src",type:"filepicker",filetype:"image",label:"Source",autofocus:!0,onchange:h,onbeforecall:i},r];a.settings.image_description!==!1&&w.push({name:"alt",type:"textbox",label:"Image description"}),a.settings.image_title&&w.push({name:"title",type:"textbox",label:"Image Title"}),v&&w.push({type:"container",label:"Dimensions",layout:"flex",direction:"row",align:"center",spacing:5,items:[{name:"width",type:"textbox",maxLength:5,size:3,onchange:e,ariaLabel:"Width"},{type:"label",text:"x"},{name:"height",type:"textbox",maxLength:5,size:3,onchange:e,ariaLabel:"Height"},{name:"constrain",type:"checkbox",checked:!0,text:"Constrain proportions"}]}),w.push(s),a.settings.image_caption&&tinymce.Env.ceFalse&&w.push({name:"caption",type:"checkbox",label:"Caption"}),a.fire("wpLoadImageForm",{data:w}),a.settings.image_advtab?(n&&(n.style.marginLeft&&n.style.marginRight&&n.style.marginLeft===n.style.marginRight&&(t.hspace=g(n.style.marginLeft)),n.style.marginTop&&n.style.marginBottom&&n.style.marginTop===n.style.marginBottom&&(t.vspace=g(n.style.marginTop)),n.style.borderWidth&&(t.border=g(n.style.borderWidth)),t.style=a.dom.serializeStyle(a.dom.parseStyle(a.dom.getAttrib(n,"style")))),m=a.windowManager.open({title:"Insert/edit image",data:t,bodyType:"tabpanel",body:[{title:"General",type:"form",items:w},{title:"Advanced",type:"form",pack:"start",items:[{label:"Style",name:"style",type:"textbox",onchange:l},{type:"form",layout:"grid",packV:"start",columns:2,padding:0,alignH:["left","right"],defaults:{type:"textbox",maxWidth:50,onchange:k},items:[{label:"Vertical space",name:"vspace"},{label:"Horizontal space",name:"hspace"},{label:"Border",name:"border"}]}]}],onSubmit:f})):m=a.windowManager.open({title:"Insert/edit image",data:t,body:w,onSubmit:f})}a.on("preInit",function(){function b(a){var b=a.attr("class");return b&&/\bimage\b/.test(b)}function c(a){return function(c){function d(b){b.attr("contenteditable",a?"true":null)}for(var e,f=c.length;f--;)e=c[f],b(e)&&(e.attr("contenteditable",a?"false":null),tinymce.each(e.getAll("figcaption"),d))}}a.parser.addNodeFilter("figure",c(!0)),a.serializer.addNodeFilter("figure",c(!1))}),a.addButton("image",{icon:"image",tooltip:"Insert/edit image",onclick:d(e),stateSelector:"img:not([data-mce-object],[data-mce-placeholder]),figure.image"}),a.addMenuItem("image",{icon:"image",text:"Image",onclick:d(e),context:"insert",prependToContext:!0}),a.addCommand("mceImage",d(e))}); \ No newline at end of file diff --git a/wp/wp-includes/js/tinymce/plugins/lists/plugin.js b/wp/wp-includes/js/tinymce/plugins/lists/plugin.js deleted file mode 100644 index 8e605b49..00000000 --- a/wp/wp-includes/js/tinymce/plugins/lists/plugin.js +++ /dev/null @@ -1,1447 +0,0 @@ -(function () { - -var defs = {}; // id -> {dependencies, definition, instance (possibly undefined)} - -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; - -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; - -var def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; - -var dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; - -var req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; - -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.lists.Plugin","global!tinymce.PluginManager","global!tinymce.util.Tools","global!tinymce.util.VK","tinymce.lists.core.NodeType","tinymce.lists.core.Delete","tinymce.lists.actions.Indent","tinymce.lists.actions.Outdent","tinymce.lists.actions.ToggleList","global!tinymce.dom.TreeWalker","global!tinymce.dom.RangeUtils","tinymce.lists.core.Selection","tinymce.lists.core.Bookmark","tinymce.lists.core.Range","tinymce.lists.core.NormalizeLists","global!tinymce.dom.BookmarkManager","tinymce.lists.core.SplitList","global!tinymce.dom.DOMUtils.DOM","tinymce.lists.core.TextBlock","global!tinymce.Env"] -jsc*/ -defineGlobal("global!tinymce.PluginManager", tinymce.PluginManager); -defineGlobal("global!tinymce.util.Tools", tinymce.util.Tools); -defineGlobal("global!tinymce.util.VK", tinymce.util.VK); -/** - * NodeType.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define("tinymce.lists.core.NodeType", [ -], function () { - var isTextNode = function (node) { - return node && node.nodeType === 3; - }; - - var isListNode = function (node) { - return node && (/^(OL|UL|DL)$/).test(node.nodeName); - }; - - var isListItemNode = function (node) { - return node && /^(LI|DT|DD)$/.test(node.nodeName); - }; - - var isBr = function (node) { - return node && node.nodeName === 'BR'; - }; - - var isFirstChild = function (node) { - return node.parentNode.firstChild === node; - }; - - var isLastChild = function (node) { - return node.parentNode.lastChild === node; - }; - - var isTextBlock = function (editor, node) { - return node && !!editor.schema.getTextBlockElements()[node.nodeName]; - }; - - var isBogusBr = function (dom, node) { - if (!isBr(node)) { - return false; - } - - if (dom.isBlock(node.nextSibling) && !isBr(node.previousSibling)) { - return true; - } - - return false; - }; - - var isEmpty = function (dom, elm, keepBookmarks) { - var empty = dom.isEmpty(elm); - - if (keepBookmarks && dom.select('span[data-mce-type=bookmark]', elm).length > 0) { - return false; - } - - return empty; - }; - - var isChildOfBody = function (dom, elm) { - return dom.isChildOf(elm, dom.getRoot()); - }; - - return { - isTextNode: isTextNode, - isListNode: isListNode, - isListItemNode: isListItemNode, - isBr: isBr, - isFirstChild: isFirstChild, - isLastChild: isLastChild, - isTextBlock: isTextBlock, - isBogusBr: isBogusBr, - isEmpty: isEmpty, - isChildOfBody: isChildOfBody - }; -}); - - -defineGlobal("global!tinymce.dom.TreeWalker", tinymce.dom.TreeWalker); -defineGlobal("global!tinymce.dom.RangeUtils", tinymce.dom.RangeUtils); -/** - * Selection.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define("tinymce.lists.core.Selection", [ - "global!tinymce.util.Tools", - "tinymce.lists.core.NodeType" -], function (Tools, NodeType) { - var getSelectedListItems = function (editor) { - return Tools.grep(editor.selection.getSelectedBlocks(), function (block) { - return NodeType.isListItemNode(block); - }); - }; - - return { - getSelectedListItems: getSelectedListItems - }; -}); - - -defineGlobal("global!tinymce.dom.DOMUtils.DOM", tinymce.dom.DOMUtils.DOM); -/** - * Range.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define("tinymce.lists.core.Range", [ - "global!tinymce.dom.RangeUtils", - "tinymce.lists.core.NodeType" -], function (RangeUtils, NodeType) { - var getNormalizedEndPoint = function (container, offset) { - var node = RangeUtils.getNode(container, offset); - - if (NodeType.isListItemNode(container) && NodeType.isTextNode(node)) { - var textNodeOffset = offset >= container.childNodes.length ? node.data.length : 0; - return {container: node, offset: textNodeOffset}; - } - - return {container: container, offset: offset}; - }; - - var normalizeRange = function (rng) { - var outRng = rng.cloneRange(); - - var rangeStart = getNormalizedEndPoint(rng.startContainer, rng.startOffset); - outRng.setStart(rangeStart.container, rangeStart.offset); - - var rangeEnd = getNormalizedEndPoint(rng.endContainer, rng.endOffset); - outRng.setEnd(rangeEnd.container, rangeEnd.offset); - - return outRng; - }; - - return { - getNormalizedEndPoint: getNormalizedEndPoint, - normalizeRange: normalizeRange - }; -}); - - -/** - * Bookmark.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define("tinymce.lists.core.Bookmark", [ - "global!tinymce.dom.DOMUtils.DOM", - "tinymce.lists.core.NodeType", - "tinymce.lists.core.Range" -], function (DOM, NodeType, Range) { - /** - * Returns a range bookmark. This will convert indexed bookmarks into temporary span elements with - * index 0 so that they can be restored properly after the DOM has been modified. Text bookmarks will not have spans - * added to them since they can be restored after a dom operation. - * - * So this:

      ||

      - * becomes:

      ||

      - * - * @param {DOMRange} rng DOM Range to get bookmark on. - * @return {Object} Bookmark object. - */ - var createBookmark = function (rng) { - var bookmark = {}; - - var setupEndPoint = function (start) { - var offsetNode, container, offset; - - container = rng[start ? 'startContainer' : 'endContainer']; - offset = rng[start ? 'startOffset' : 'endOffset']; - - if (container.nodeType === 1) { - offsetNode = DOM.create('span', {'data-mce-type': 'bookmark'}); - - if (container.hasChildNodes()) { - offset = Math.min(offset, container.childNodes.length - 1); - - if (start) { - container.insertBefore(offsetNode, container.childNodes[offset]); - } else { - DOM.insertAfter(offsetNode, container.childNodes[offset]); - } - } else { - container.appendChild(offsetNode); - } - - container = offsetNode; - offset = 0; - } - - bookmark[start ? 'startContainer' : 'endContainer'] = container; - bookmark[start ? 'startOffset' : 'endOffset'] = offset; - }; - - setupEndPoint(true); - - if (!rng.collapsed) { - setupEndPoint(); - } - - return bookmark; - }; - - var resolveBookmark = function (bookmark) { - function restoreEndPoint (start) { - var container, offset, node; - - var nodeIndex = function (container) { - var node = container.parentNode.firstChild, idx = 0; - - while (node) { - if (node === container) { - return idx; - } - - // Skip data-mce-type=bookmark nodes - if (node.nodeType !== 1 || node.getAttribute('data-mce-type') !== 'bookmark') { - idx++; - } - - node = node.nextSibling; - } - - return -1; - }; - - container = node = bookmark[start ? 'startContainer' : 'endContainer']; - offset = bookmark[start ? 'startOffset' : 'endOffset']; - - if (!container) { - return; - } - - if (container.nodeType === 1) { - offset = nodeIndex(container); - container = container.parentNode; - DOM.remove(node); - } - - bookmark[start ? 'startContainer' : 'endContainer'] = container; - bookmark[start ? 'startOffset' : 'endOffset'] = offset; - } - - restoreEndPoint(true); - restoreEndPoint(); - - var rng = DOM.createRng(); - - rng.setStart(bookmark.startContainer, bookmark.startOffset); - - if (bookmark.endContainer) { - rng.setEnd(bookmark.endContainer, bookmark.endOffset); - } - - return Range.normalizeRange(rng); - }; - - return { - createBookmark: createBookmark, - resolveBookmark: resolveBookmark - }; -}); - - -/** - * NormalizeLists.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define("tinymce.lists.core.NormalizeLists", [ - "global!tinymce.dom.DOMUtils.DOM", - "global!tinymce.util.Tools", - "tinymce.lists.core.NodeType" -], function (DOM, Tools, NodeType) { - var normalizeList = function (dom, ul) { - var sibling, parentNode = ul.parentNode; - - // Move UL/OL to previous LI if it's the only child of a LI - if (parentNode.nodeName === 'LI' && parentNode.firstChild === ul) { - sibling = parentNode.previousSibling; - if (sibling && sibling.nodeName === 'LI') { - sibling.appendChild(ul); - - if (NodeType.isEmpty(dom, parentNode)) { - DOM.remove(parentNode); - } - } else { - DOM.setStyle(parentNode, 'listStyleType', 'none'); - } - } - - // Append OL/UL to previous LI if it's in a parent OL/UL i.e. old HTML4 - if (NodeType.isListNode(parentNode)) { - sibling = parentNode.previousSibling; - if (sibling && sibling.nodeName === 'LI') { - sibling.appendChild(ul); - } - } - }; - - var normalizeLists = function (dom, element) { - Tools.each(Tools.grep(dom.select('ol,ul', element)), function (ul) { - normalizeList(dom, ul); - }); - }; - - return { - normalizeList: normalizeList, - normalizeLists: normalizeLists - }; -}); - - -defineGlobal("global!tinymce.dom.BookmarkManager", tinymce.dom.BookmarkManager); -defineGlobal("global!tinymce.Env", tinymce.Env); -/** - * TextBlock.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define("tinymce.lists.core.TextBlock", [ - "global!tinymce.dom.DOMUtils.DOM", - "global!tinymce.Env" -], function (DOM, Env) { - var createNewTextBlock = function (editor, contentNode, blockName) { - var node, textBlock, fragment = DOM.createFragment(), hasContentNode; - var blockElements = editor.schema.getBlockElements(); - - if (editor.settings.forced_root_block) { - blockName = blockName || editor.settings.forced_root_block; - } - - if (blockName) { - textBlock = DOM.create(blockName); - - if (textBlock.tagName === editor.settings.forced_root_block) { - DOM.setAttribs(textBlock, editor.settings.forced_root_block_attrs); - } - - fragment.appendChild(textBlock); - } - - if (contentNode) { - while ((node = contentNode.firstChild)) { - var nodeName = node.nodeName; - - if (!hasContentNode && (nodeName !== 'SPAN' || node.getAttribute('data-mce-type') !== 'bookmark')) { - hasContentNode = true; - } - - if (blockElements[nodeName]) { - fragment.appendChild(node); - textBlock = null; - } else { - if (blockName) { - if (!textBlock) { - textBlock = DOM.create(blockName); - fragment.appendChild(textBlock); - } - - textBlock.appendChild(node); - } else { - fragment.appendChild(node); - } - } - } - } - - if (!editor.settings.forced_root_block) { - fragment.appendChild(DOM.create('br')); - } else { - // BR is needed in empty blocks on non IE browsers - if (!hasContentNode && (!Env.ie || Env.ie > 10)) { - textBlock.appendChild(DOM.create('br', {'data-mce-bogus': '1'})); - } - } - - return fragment; - }; - - return { - createNewTextBlock: createNewTextBlock - }; -}); - -/** - * SplitList.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define("tinymce.lists.core.SplitList", [ - "global!tinymce.dom.DOMUtils.DOM", - "global!tinymce.util.Tools", - "tinymce.lists.core.TextBlock", - "tinymce.lists.core.NodeType" -], function (DOM, Tools, TextBlock, NodeType) { - var splitList = function (editor, ul, li, newBlock) { - var tmpRng, fragment, bookmarks, node; - - var removeAndKeepBookmarks = function (targetNode) { - Tools.each(bookmarks, function (node) { - targetNode.parentNode.insertBefore(node, li.parentNode); - }); - - DOM.remove(targetNode); - }; - - bookmarks = DOM.select('span[data-mce-type="bookmark"]', ul); - newBlock = newBlock || TextBlock.createNewTextBlock(editor, li); - tmpRng = DOM.createRng(); - tmpRng.setStartAfter(li); - tmpRng.setEndAfter(ul); - fragment = tmpRng.extractContents(); - - for (node = fragment.firstChild; node; node = node.firstChild) { - if (node.nodeName === 'LI' && editor.dom.isEmpty(node)) { - DOM.remove(node); - break; - } - } - - if (!editor.dom.isEmpty(fragment)) { - DOM.insertAfter(fragment, ul); - } - - DOM.insertAfter(newBlock, ul); - - if (NodeType.isEmpty(editor.dom, li.parentNode)) { - removeAndKeepBookmarks(li.parentNode); - } - - DOM.remove(li); - - if (NodeType.isEmpty(editor.dom, ul)) { - DOM.remove(ul); - } - }; - - return { - splitList: splitList - }; -}); - - -/** - * Outdent.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define("tinymce.lists.actions.Outdent", [ - "global!tinymce.dom.DOMUtils.DOM", - "tinymce.lists.core.NodeType", - "tinymce.lists.core.Bookmark", - "tinymce.lists.core.Selection", - "tinymce.lists.core.SplitList", - "tinymce.lists.core.NormalizeLists", - "tinymce.lists.core.TextBlock" -], function (DOM, NodeType, Bookmark, Selection, SplitList, NormalizeLists, TextBlock) { - var removeEmptyLi = function (dom, li) { - if (NodeType.isEmpty(dom, li)) { - DOM.remove(li); - } - }; - - var outdent = function (editor, li) { - var ul = li.parentNode, ulParent = ul.parentNode, newBlock; - - if (ul === editor.getBody()) { - return true; - } - - if (li.nodeName === 'DD') { - DOM.rename(li, 'DT'); - return true; - } - - if (NodeType.isFirstChild(li) && NodeType.isLastChild(li)) { - if (ulParent.nodeName === "LI") { - DOM.insertAfter(li, ulParent); - removeEmptyLi(editor.dom, ulParent); - DOM.remove(ul); - } else if (NodeType.isListNode(ulParent)) { - DOM.remove(ul, true); - } else { - ulParent.insertBefore(TextBlock.createNewTextBlock(editor, li), ul); - DOM.remove(ul); - } - - return true; - } else if (NodeType.isFirstChild(li)) { - if (ulParent.nodeName === "LI") { - DOM.insertAfter(li, ulParent); - li.appendChild(ul); - removeEmptyLi(editor.dom, ulParent); - } else if (NodeType.isListNode(ulParent)) { - ulParent.insertBefore(li, ul); - } else { - ulParent.insertBefore(TextBlock.createNewTextBlock(editor, li), ul); - DOM.remove(li); - } - - return true; - } else if (NodeType.isLastChild(li)) { - if (ulParent.nodeName === "LI") { - DOM.insertAfter(li, ulParent); - } else if (NodeType.isListNode(ulParent)) { - DOM.insertAfter(li, ul); - } else { - DOM.insertAfter(TextBlock.createNewTextBlock(editor, li), ul); - DOM.remove(li); - } - - return true; - } - - if (ulParent.nodeName === 'LI') { - ul = ulParent; - newBlock = TextBlock.createNewTextBlock(editor, li, 'LI'); - } else if (NodeType.isListNode(ulParent)) { - newBlock = TextBlock.createNewTextBlock(editor, li, 'LI'); - } else { - newBlock = TextBlock.createNewTextBlock(editor, li); - } - - SplitList.splitList(editor, ul, li, newBlock); - NormalizeLists.normalizeLists(editor.dom, ul.parentNode); - - return true; - }; - - var outdentSelection = function (editor) { - var listElements = Selection.getSelectedListItems(editor); - - if (listElements.length) { - var bookmark = Bookmark.createBookmark(editor.selection.getRng(true)); - var i, y, root = editor.getBody(); - - i = listElements.length; - while (i--) { - var node = listElements[i].parentNode; - - while (node && node !== root) { - y = listElements.length; - while (y--) { - if (listElements[y] === node) { - listElements.splice(i, 1); - break; - } - } - - node = node.parentNode; - } - } - - for (i = 0; i < listElements.length; i++) { - if (!outdent(editor, listElements[i]) && i === 0) { - break; - } - } - - editor.selection.setRng(Bookmark.resolveBookmark(bookmark)); - editor.nodeChanged(); - - return true; - } - }; - - return { - outdent: outdent, - outdentSelection: outdentSelection - }; -}); - - -/** - * ToggleList.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define("tinymce.lists.actions.ToggleList", [ - "global!tinymce.util.Tools", - "global!tinymce.dom.BookmarkManager", - "tinymce.lists.core.Selection", - "tinymce.lists.core.NodeType", - "tinymce.lists.core.Bookmark", - "tinymce.lists.core.SplitList", - "tinymce.lists.core.NormalizeLists", - "tinymce.lists.actions.Outdent" -], function (Tools, BookmarkManager, Selection, NodeType, Bookmark, SplitList, NormalizeLists, Outdent) { - var updateListStyle = function (dom, el, detail) { - var type = detail['list-style-type'] ? detail['list-style-type'] : null; - dom.setStyle(el, 'list-style-type', type); - }; - - var setAttribs = function (elm, attrs) { - Tools.each(attrs, function (value, key) { - elm.setAttribute(key, value); - }); - }; - - var updateListAttrs = function (dom, el, detail) { - setAttribs(el, detail['list-attributes']); - Tools.each(dom.select('li', el), function (li) { - setAttribs(li, detail['list-item-attributes']); - }); - }; - - var updateListWithDetails = function (dom, el, detail) { - updateListStyle(dom, el, detail); - updateListAttrs(dom, el, detail); - }; - - var getEndPointNode = function (editor, rng, start) { - var container, offset, root = editor.getBody(); - - container = rng[start ? 'startContainer' : 'endContainer']; - offset = rng[start ? 'startOffset' : 'endOffset']; - - // Resolve node index - if (container.nodeType === 1) { - container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container; - } - - while (container.parentNode !== root) { - if (NodeType.isTextBlock(editor, container)) { - return container; - } - - if (/^(TD|TH)$/.test(container.parentNode.nodeName)) { - return container; - } - - container = container.parentNode; - } - - return container; - }; - - var getSelectedTextBlocks = function (editor, rng) { - var textBlocks = [], root = editor.getBody(), dom = editor.dom; - - var startNode = getEndPointNode(editor, rng, true); - var endNode = getEndPointNode(editor, rng, false); - var block, siblings = []; - - for (var node = startNode; node; node = node.nextSibling) { - siblings.push(node); - - if (node === endNode) { - break; - } - } - - Tools.each(siblings, function (node) { - if (NodeType.isTextBlock(editor, node)) { - textBlocks.push(node); - block = null; - return; - } - - if (dom.isBlock(node) || NodeType.isBr(node)) { - if (NodeType.isBr(node)) { - dom.remove(node); - } - - block = null; - return; - } - - var nextSibling = node.nextSibling; - if (BookmarkManager.isBookmarkNode(node)) { - if (NodeType.isTextBlock(editor, nextSibling) || (!nextSibling && node.parentNode === root)) { - block = null; - return; - } - } - - if (!block) { - block = dom.create('p'); - node.parentNode.insertBefore(block, node); - textBlocks.push(block); - } - - block.appendChild(node); - }); - - return textBlocks; - }; - - var applyList = function (editor, listName, detail) { - var rng = editor.selection.getRng(true), bookmark, listItemName = 'LI'; - var dom = editor.dom; - - detail = detail ? detail : {}; - - if (dom.getContentEditable(editor.selection.getNode()) === "false") { - return; - } - - listName = listName.toUpperCase(); - - if (listName === 'DL') { - listItemName = 'DT'; - } - - bookmark = Bookmark.createBookmark(rng); - - Tools.each(getSelectedTextBlocks(editor, rng), function (block) { - var listBlock, sibling; - - var hasCompatibleStyle = function (sib) { - var sibStyle = dom.getStyle(sib, 'list-style-type'); - var detailStyle = detail ? detail['list-style-type'] : ''; - - detailStyle = detailStyle === null ? '' : detailStyle; - - return sibStyle === detailStyle; - }; - - sibling = block.previousSibling; - if (sibling && NodeType.isListNode(sibling) && sibling.nodeName === listName && hasCompatibleStyle(sibling)) { - listBlock = sibling; - block = dom.rename(block, listItemName); - sibling.appendChild(block); - } else { - listBlock = dom.create(listName); - block.parentNode.insertBefore(listBlock, block); - listBlock.appendChild(block); - block = dom.rename(block, listItemName); - } - - updateListWithDetails(dom, listBlock, detail); - mergeWithAdjacentLists(editor.dom, listBlock); - }); - - editor.selection.setRng(Bookmark.resolveBookmark(bookmark)); - }; - - var removeList = function (editor) { - var bookmark = Bookmark.createBookmark(editor.selection.getRng(true)), root = editor.getBody(); - var listItems = Selection.getSelectedListItems(editor); - var emptyListItems = Tools.grep(listItems, function (li) { - return editor.dom.isEmpty(li); - }); - - listItems = Tools.grep(listItems, function (li) { - return !editor.dom.isEmpty(li); - }); - - Tools.each(emptyListItems, function (li) { - if (NodeType.isEmpty(editor.dom, li)) { - Outdent.outdent(editor, li); - return; - } - }); - - Tools.each(listItems, function (li) { - var node, rootList; - - if (li.parentNode === editor.getBody()) { - return; - } - - for (node = li; node && node !== root; node = node.parentNode) { - if (NodeType.isListNode(node)) { - rootList = node; - } - } - - SplitList.splitList(editor, rootList, li); - NormalizeLists.normalizeLists(editor.dom, rootList.parentNode); - }); - - editor.selection.setRng(Bookmark.resolveBookmark(bookmark)); - }; - - var isValidLists = function (list1, list2) { - return list1 && list2 && NodeType.isListNode(list1) && list1.nodeName === list2.nodeName; - }; - - var hasSameListStyle = function (dom, list1, list2) { - var targetStyle = dom.getStyle(list1, 'list-style-type', true); - var style = dom.getStyle(list2, 'list-style-type', true); - return targetStyle === style; - }; - - var hasSameClasses = function (elm1, elm2) { - return elm1.className === elm2.className; - }; - - var shouldMerge = function (dom, list1, list2) { - return isValidLists(list1, list2) && hasSameListStyle(dom, list1, list2) && hasSameClasses(list1, list2); - }; - - var mergeWithAdjacentLists = function (dom, listBlock) { - var sibling, node; - - sibling = listBlock.nextSibling; - if (shouldMerge(dom, listBlock, sibling)) { - while ((node = sibling.firstChild)) { - listBlock.appendChild(node); - } - - dom.remove(sibling); - } - - sibling = listBlock.previousSibling; - if (shouldMerge(dom, listBlock, sibling)) { - while ((node = sibling.lastChild)) { - listBlock.insertBefore(node, listBlock.firstChild); - } - - dom.remove(sibling); - } - }; - - var toggleList = function (editor, listName, detail) { - var parentList = editor.dom.getParent(editor.selection.getStart(), 'OL,UL,DL'); - - detail = detail ? detail : {}; - - if (parentList === editor.getBody()) { - return; - } - - if (parentList) { - if (parentList.nodeName === listName) { - removeList(editor, listName); - } else { - var bookmark = Bookmark.createBookmark(editor.selection.getRng(true)); - updateListWithDetails(editor.dom, parentList, detail); - mergeWithAdjacentLists(editor.dom, editor.dom.rename(parentList, listName)); - editor.selection.setRng(Bookmark.resolveBookmark(bookmark)); - } - } else { - applyList(editor, listName, detail); - } - }; - - return { - toggleList: toggleList, - removeList: removeList, - mergeWithAdjacentLists: mergeWithAdjacentLists - }; -}); - - -/** - * Delete.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define("tinymce.lists.core.Delete", [ - "global!tinymce.dom.TreeWalker", - "global!tinymce.dom.RangeUtils", - "global!tinymce.util.VK", - "tinymce.lists.core.Selection", - "tinymce.lists.core.NodeType", - "tinymce.lists.core.Bookmark", - "tinymce.lists.core.Range", - "tinymce.lists.core.NormalizeLists", - "tinymce.lists.actions.ToggleList" -], function ( - TreeWalker, RangeUtils, VK, Selection, NodeType, Bookmark, Range, NormalizeLists, ToggleList -) { - var findNextCaretContainer = function (editor, rng, isForward) { - var node = rng.startContainer, offset = rng.startOffset; - var nonEmptyBlocks, walker; - - if (node.nodeType === 3 && (isForward ? offset < node.data.length : offset > 0)) { - return node; - } - - nonEmptyBlocks = editor.schema.getNonEmptyElements(); - if (node.nodeType === 1) { - node = RangeUtils.getNode(node, offset); - } - - walker = new TreeWalker(node, editor.getBody()); - - // Delete at
    22. |
    23. then jump over the bogus br - if (isForward) { - if (NodeType.isBogusBr(editor.dom, node)) { - walker.next(); - } - } - - while ((node = walker[isForward ? 'next' : 'prev2']())) { - if (node.nodeName === 'LI' && !node.hasChildNodes()) { - return node; - } - - if (nonEmptyBlocks[node.nodeName]) { - return node; - } - - if (node.nodeType === 3 && node.data.length > 0) { - return node; - } - } - }; - - var mergeLiElements = function (dom, fromElm, toElm) { - var node, listNode, ul = fromElm.parentNode; - - if (!NodeType.isChildOfBody(dom, fromElm) || !NodeType.isChildOfBody(dom, toElm)) { - return; - } - - if (NodeType.isListNode(toElm.lastChild)) { - listNode = toElm.lastChild; - } - - if (ul === toElm.lastChild) { - if (NodeType.isBr(ul.previousSibling)) { - dom.remove(ul.previousSibling); - } - } - - node = toElm.lastChild; - if (node && NodeType.isBr(node) && fromElm.hasChildNodes()) { - dom.remove(node); - } - - if (NodeType.isEmpty(dom, toElm, true)) { - dom.$(toElm).empty(); - } - - if (!NodeType.isEmpty(dom, fromElm, true)) { - while ((node = fromElm.firstChild)) { - toElm.appendChild(node); - } - } - - if (listNode) { - toElm.appendChild(listNode); - } - - dom.remove(fromElm); - - if (NodeType.isEmpty(dom, ul) && ul !== dom.getRoot()) { - dom.remove(ul); - } - }; - - var backspaceDeleteFromListToListCaret = function (editor, isForward) { - var dom = editor.dom, selection = editor.selection; - var li = dom.getParent(selection.getStart(), 'LI'), ul, rng, otherLi; - - if (li) { - ul = li.parentNode; - if (ul === editor.getBody() && NodeType.isEmpty(dom, ul)) { - return true; - } - - rng = Range.normalizeRange(selection.getRng(true)); - otherLi = dom.getParent(findNextCaretContainer(editor, rng, isForward), 'LI'); - - if (otherLi && otherLi !== li) { - var bookmark = Bookmark.createBookmark(rng); - - if (isForward) { - mergeLiElements(dom, otherLi, li); - } else { - mergeLiElements(dom, li, otherLi); - } - - editor.selection.setRng(Bookmark.resolveBookmark(bookmark)); - - return true; - } else if (!otherLi) { - if (!isForward && ToggleList.removeList(editor, ul.nodeName)) { - return true; - } - } - } - - return false; - }; - - var backspaceDeleteIntoListCaret = function (editor, isForward) { - var dom = editor.dom; - var block = dom.getParent(editor.selection.getStart(), dom.isBlock); - - if (block && dom.isEmpty(block)) { - var rng = Range.normalizeRange(editor.selection.getRng(true)); - var otherLi = dom.getParent(findNextCaretContainer(editor, rng, isForward), 'LI'); - - if (otherLi) { - editor.undoManager.transact(function () { - dom.remove(block); - ToggleList.mergeWithAdjacentLists(dom, otherLi.parentNode); - editor.selection.select(otherLi, true); - editor.selection.collapse(isForward); - }); - - return true; - } - } - - return false; - }; - - var backspaceDeleteCaret = function (editor, isForward) { - return backspaceDeleteFromListToListCaret(editor, isForward) || backspaceDeleteIntoListCaret(editor, isForward); - }; - - var backspaceDeleteRange = function (editor) { - var startListParent = editor.dom.getParent(editor.selection.getStart(), 'LI,DT,DD'); - - if (startListParent || Selection.getSelectedListItems(editor).length > 0) { - editor.undoManager.transact(function () { - editor.execCommand('Delete'); - NormalizeLists.normalizeLists(editor.dom, editor.getBody()); - }); - - return true; - } - - return false; - }; - - var backspaceDelete = function (editor, isForward) { - return editor.selection.isCollapsed() ? backspaceDeleteCaret(editor, isForward) : backspaceDeleteRange(editor); - }; - - var setup = function (editor) { - editor.on('keydown', function (e) { - if (e.keyCode === VK.BACKSPACE) { - if (backspaceDelete(editor, false)) { - e.preventDefault(); - } - } else if (e.keyCode === VK.DELETE) { - if (backspaceDelete(editor, true)) { - e.preventDefault(); - } - } - }); - }; - - return { - setup: setup, - backspaceDelete: backspaceDelete - }; -}); - - -/** - * Indent.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define("tinymce.lists.actions.Indent", [ - "global!tinymce.dom.DOMUtils.DOM", - "tinymce.lists.core.NodeType", - "tinymce.lists.core.Bookmark", - "tinymce.lists.core.Selection" -], function (DOM, NodeType, Bookmark, Selection) { - var mergeLists = function (from, to) { - var node; - - if (NodeType.isListNode(from)) { - while ((node = from.firstChild)) { - to.appendChild(node); - } - - DOM.remove(from); - } - }; - - var indent = function (li) { - var sibling, newList, listStyle; - - if (li.nodeName === 'DT') { - DOM.rename(li, 'DD'); - return true; - } - - sibling = li.previousSibling; - - if (sibling && NodeType.isListNode(sibling)) { - sibling.appendChild(li); - return true; - } - - if (sibling && sibling.nodeName === 'LI' && NodeType.isListNode(sibling.lastChild)) { - sibling.lastChild.appendChild(li); - mergeLists(li.lastChild, sibling.lastChild); - return true; - } - - sibling = li.nextSibling; - - if (sibling && NodeType.isListNode(sibling)) { - sibling.insertBefore(li, sibling.firstChild); - return true; - } - - /*if (sibling && sibling.nodeName === 'LI' && isListNode(li.lastChild)) { - return false; - }*/ - - sibling = li.previousSibling; - if (sibling && sibling.nodeName === 'LI') { - newList = DOM.create(li.parentNode.nodeName); - listStyle = DOM.getStyle(li.parentNode, 'listStyleType'); - if (listStyle) { - DOM.setStyle(newList, 'listStyleType', listStyle); - } - sibling.appendChild(newList); - newList.appendChild(li); - mergeLists(li.lastChild, newList); - return true; - } - - return false; - }; - - var indentSelection = function (editor) { - var listElements = Selection.getSelectedListItems(editor); - - if (listElements.length) { - var bookmark = Bookmark.createBookmark(editor.selection.getRng(true)); - - for (var i = 0; i < listElements.length; i++) { - if (!indent(listElements[i]) && i === 0) { - break; - } - } - - editor.selection.setRng(Bookmark.resolveBookmark(bookmark)); - editor.nodeChanged(); - - return true; - } - }; - - return { - indentSelection: indentSelection - }; -}); - - -/** - * plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -define("tinymce.lists.Plugin", [ - "global!tinymce.PluginManager", - "global!tinymce.util.Tools", - "global!tinymce.util.VK", - "tinymce.lists.core.NodeType", - "tinymce.lists.core.Delete", - "tinymce.lists.actions.Indent", - "tinymce.lists.actions.Outdent", - "tinymce.lists.actions.ToggleList" -], function (PluginManager, Tools, VK, NodeType, Delete, Indent, Outdent, ToggleList) { - var queryListCommandState = function (editor, listName) { - return function () { - var parentList = editor.dom.getParent(editor.selection.getStart(), 'UL,OL,DL'); - return parentList && parentList.nodeName === listName; - }; - }; - - var setupCommands = function (editor) { - editor.on('BeforeExecCommand', function (e) { - var cmd = e.command.toLowerCase(), isHandled; - - if (cmd === "indent") { - if (Indent.indentSelection(editor)) { - isHandled = true; - } - } else if (cmd === "outdent") { - if (Outdent.outdentSelection(editor)) { - isHandled = true; - } - } - - if (isHandled) { - editor.fire('ExecCommand', {command: e.command}); - e.preventDefault(); - return true; - } - }); - - editor.addCommand('InsertUnorderedList', function (ui, detail) { - ToggleList.toggleList(editor, 'UL', detail); - }); - - editor.addCommand('InsertOrderedList', function (ui, detail) { - ToggleList.toggleList(editor, 'OL', detail); - }); - - editor.addCommand('InsertDefinitionList', function (ui, detail) { - ToggleList.toggleList(editor, 'DL', detail); - }); - }; - - var setupStateHandlers = function (editor) { - editor.addQueryStateHandler('InsertUnorderedList', queryListCommandState(editor, 'UL')); - editor.addQueryStateHandler('InsertOrderedList', queryListCommandState(editor, 'OL')); - editor.addQueryStateHandler('InsertDefinitionList', queryListCommandState(editor, 'DL')); - }; - - var setupTabKey = function (editor) { - editor.on('keydown', function (e) { - // Check for tab but not ctrl/cmd+tab since it switches browser tabs - if (e.keyCode !== 9 || VK.metaKeyPressed(e)) { - return; - } - - if (editor.dom.getParent(editor.selection.getStart(), 'LI,DT,DD')) { - e.preventDefault(); - - if (e.shiftKey) { - Outdent.outdentSelection(editor); - } else { - Indent.indentSelection(editor); - } - } - }); - }; - - var setupUi = function (editor) { - var listState = function (listName) { - return function () { - var self = this; - - editor.on('NodeChange', function (e) { - var lists = Tools.grep(e.parents, NodeType.isListNode); - self.active(lists.length > 0 && lists[0].nodeName === listName); - }); - }; - }; - - var hasPlugin = function (editor, plugin) { - var plugins = editor.settings.plugins ? editor.settings.plugins : ''; - return Tools.inArray(plugins.split(/[ ,]/), plugin) !== -1; - }; - - if (!hasPlugin(editor, 'advlist')) { - editor.addButton('numlist', { - title: 'Numbered list', - cmd: 'InsertOrderedList', - onPostRender: listState('OL') - }); - - editor.addButton('bullist', { - title: 'Bullet list', - cmd: 'InsertUnorderedList', - onPostRender: listState('UL') - }); - } - - editor.addButton('indent', { - icon: 'indent', - title: 'Increase indent', - cmd: 'Indent', - onPostRender: function (e) { - var ctrl = e.control; - - editor.on('nodechange', function () { - var blocks = editor.selection.getSelectedBlocks(); - var disable = false; - - for (var i = 0, l = blocks.length; !disable && i < l; i++) { - var tag = blocks[i].nodeName; - - disable = (tag === 'LI' && NodeType.isFirstChild(blocks[i]) || tag === 'UL' || tag === 'OL' || tag === 'DD'); - } - - ctrl.disabled(disable); - }); - } - }); - }; - - PluginManager.add('lists', function (editor) { - setupUi(editor); - Delete.setup(editor); - - editor.on('init', function () { - setupCommands(editor); - setupStateHandlers(editor); - setupTabKey(editor); - }); - - return { - backspaceDelete: function (isForward) { - Delete.backspaceDelete(editor, isForward); - } - }; - }); - - return function () {}; -}); - - -dem('tinymce.lists.Plugin')(); -})(); diff --git a/wp/wp-includes/js/tinymce/plugins/lists/plugin.min.js b/wp/wp-includes/js/tinymce/plugins/lists/plugin.min.js deleted file mode 100644 index 24e3d973..00000000 --- a/wp/wp-includes/js/tinymce/plugins/lists/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var e={},t=function(t){for(var n=e[t],i=n.deps,o=n.defn,a=i.length,s=new Array(a),l=0;l0)&&r},u=function(e,t){return e.isChildOf(t,e.getRoot())};return{isTextNode:e,isListNode:t,isListItemNode:n,isBr:r,isFirstChild:i,isLastChild:o,isTextBlock:a,isBogusBr:s,isEmpty:l,isChildOfBody:u}}),s("9",tinymce.dom.TreeWalker),s("a",tinymce.dom.RangeUtils),a("b",["2","4"],function(e,t){var n=function(n){return e.grep(n.selection.getSelectedBlocks(),function(e){return t.isListItemNode(e)})};return{getSelectedListItems:n}}),s("h",tinymce.dom.DOMUtils.DOM),a("d",["a","4"],function(e,t){var n=function(n,r){var i=e.getNode(n,r);if(t.isListItemNode(n)&&t.isTextNode(i)){var o=r>=n.childNodes.length?i.data.length:0;return{container:i,offset:o}}return{container:n,offset:r}},r=function(e){var t=e.cloneRange(),r=n(e.startContainer,e.startOffset);t.setStart(r.container,r.offset);var i=n(e.endContainer,e.endOffset);return t.setEnd(i.container,i.offset),t};return{getNormalizedEndPoint:n,normalizeRange:r}}),a("c",["h","4","d"],function(e,t,n){var r=function(t){var n={},r=function(r){var i,o,a;o=t[r?"startContainer":"endContainer"],a=t[r?"startOffset":"endOffset"],1===o.nodeType&&(i=e.create("span",{"data-mce-type":"bookmark"}),o.hasChildNodes()?(a=Math.min(a,o.childNodes.length-1),r?o.insertBefore(i,o.childNodes[a]):e.insertAfter(i,o.childNodes[a])):o.appendChild(i),o=i,a=0),n[r?"startContainer":"endContainer"]=o,n[r?"startOffset":"endOffset"]=a};return r(!0),t.collapsed||r(),n},i=function(t){function r(n){var r,i,o,a=function(e){for(var t=e.parentNode.firstChild,n=0;t;){if(t===e)return n;1===t.nodeType&&"bookmark"===t.getAttribute("data-mce-type")||n++,t=t.nextSibling}return-1};r=o=t[n?"startContainer":"endContainer"],i=t[n?"startOffset":"endOffset"],r&&(1===r.nodeType&&(i=a(r),r=r.parentNode,e.remove(o)),t[n?"startContainer":"endContainer"]=r,t[n?"startOffset":"endOffset"]=i)}r(!0),r();var i=e.createRng();return i.setStart(t.startContainer,t.startOffset),t.endContainer&&i.setEnd(t.endContainer,t.endOffset),n.normalizeRange(i)};return{createBookmark:r,resolveBookmark:i}}),a("e",["h","2","4"],function(e,t,n){var r=function(t,r){var i,o=r.parentNode;"LI"===o.nodeName&&o.firstChild===r&&(i=o.previousSibling,i&&"LI"===i.nodeName?(i.appendChild(r),n.isEmpty(t,o)&&e.remove(o)):e.setStyle(o,"listStyleType","none")),n.isListNode(o)&&(i=o.previousSibling,i&&"LI"===i.nodeName&&i.appendChild(r))},i=function(e,n){t.each(t.grep(e.select("ol,ul",n)),function(t){r(e,t)})};return{normalizeList:r,normalizeLists:i}}),s("f",tinymce.dom.BookmarkManager),s("j",tinymce.Env),a("i",["h","j"],function(e,t){var n=function(n,r,i){var o,a,s,l=e.createFragment(),u=n.schema.getBlockElements();if(n.settings.forced_root_block&&(i=i||n.settings.forced_root_block),i&&(a=e.create(i),a.tagName===n.settings.forced_root_block&&e.setAttribs(a,n.settings.forced_root_block_attrs),l.appendChild(a)),r)for(;o=r.firstChild;){var c=o.nodeName;s||"SPAN"===c&&"bookmark"===o.getAttribute("data-mce-type")||(s=!0),u[c]?(l.appendChild(o),a=null):i?(a||(a=e.create(i),l.appendChild(a)),a.appendChild(o)):l.appendChild(o)}return n.settings.forced_root_block?s||t.ie&&!(t.ie>10)||a.appendChild(e.create("br",{"data-mce-bogus":"1"})):l.appendChild(e.create("br")),l};return{createNewTextBlock:n}}),a("g",["h","2","i","4"],function(e,t,n,r){var i=function(i,o,a,s){var l,u,c,d,f=function(n){t.each(c,function(e){n.parentNode.insertBefore(e,a.parentNode)}),e.remove(n)};for(c=e.select('span[data-mce-type="bookmark"]',o),s=s||n.createNewTextBlock(i,a),l=e.createRng(),l.setStartAfter(a),l.setEndAfter(o),u=l.extractContents(),d=u.firstChild;d;d=d.firstChild)if("LI"===d.nodeName&&i.dom.isEmpty(d)){e.remove(d);break}i.dom.isEmpty(u)||e.insertAfter(u,o),e.insertAfter(s,o),r.isEmpty(i.dom,a.parentNode)&&f(a.parentNode),e.remove(a),r.isEmpty(i.dom,o)&&e.remove(o)};return{splitList:i}}),a("7",["h","4","c","b","g","e","i"],function(e,t,n,r,i,o,a){var s=function(n,r){t.isEmpty(n,r)&&e.remove(r)},l=function(n,r){var l,u=r.parentNode,c=u.parentNode;return u===n.getBody()||("DD"===r.nodeName?(e.rename(r,"DT"),!0):t.isFirstChild(r)&&t.isLastChild(r)?("LI"===c.nodeName?(e.insertAfter(r,c),s(n.dom,c),e.remove(u)):t.isListNode(c)?e.remove(u,!0):(c.insertBefore(a.createNewTextBlock(n,r),u),e.remove(u)),!0):t.isFirstChild(r)?("LI"===c.nodeName?(e.insertAfter(r,c),r.appendChild(u),s(n.dom,c)):t.isListNode(c)?c.insertBefore(r,u):(c.insertBefore(a.createNewTextBlock(n,r),u),e.remove(r)),!0):t.isLastChild(r)?("LI"===c.nodeName?e.insertAfter(r,c):t.isListNode(c)?e.insertAfter(r,u):(e.insertAfter(a.createNewTextBlock(n,r),u),e.remove(r)),!0):("LI"===c.nodeName?(u=c,l=a.createNewTextBlock(n,r,"LI")):l=t.isListNode(c)?a.createNewTextBlock(n,r,"LI"):a.createNewTextBlock(n,r),i.splitList(n,u,r,l),o.normalizeLists(n.dom,u.parentNode),!0))},u=function(e){var t=r.getSelectedListItems(e);if(t.length){var i,o,a=n.createBookmark(e.selection.getRng(!0)),s=e.getBody();for(i=t.length;i--;)for(var u=t[i].parentNode;u&&u!==s;){for(o=t.length;o--;)if(t[o]===u){t.splice(i,1);break}u=u.parentNode}for(i=0;i0))return l;for(a=n.schema.getNonEmptyElements(),1===l.nodeType&&(l=t.getNode(l,u)),s=new e(l,n.getBody()),o&&i.isBogusBr(n.dom,l)&&s.next();l=s[o?"next":"prev2"]();){if("LI"===l.nodeName&&!l.hasChildNodes())return l;if(a[l.nodeName])return l;if(3===l.nodeType&&l.data.length>0)return l}},c=function(e,t,n){var r,o,a=t.parentNode;if(i.isChildOfBody(e,t)&&i.isChildOfBody(e,n)){if(i.isListNode(n.lastChild)&&(o=n.lastChild),a===n.lastChild&&i.isBr(a.previousSibling)&&e.remove(a.previousSibling),r=n.lastChild,r&&i.isBr(r)&&t.hasChildNodes()&&e.remove(r),i.isEmpty(e,n,!0)&&e.$(n).empty(),!i.isEmpty(e,t,!0))for(;r=t.firstChild;)n.appendChild(r);o&&n.appendChild(o),e.remove(t),i.isEmpty(e,a)&&a!==e.getRoot()&&e.remove(a)}},d=function(e,t){var n,r,s,d=e.dom,f=e.selection,p=d.getParent(f.getStart(),"LI");if(p){if(n=p.parentNode,n===e.getBody()&&i.isEmpty(d,n))return!0;if(r=a.normalizeRange(f.getRng(!0)),s=d.getParent(u(e,r,t),"LI"),s&&s!==p){var h=o.createBookmark(r);return t?c(d,s,p):c(d,p,s),e.selection.setRng(o.resolveBookmark(h)),!0}if(!s&&!t&&l.removeList(e,n.nodeName))return!0}return!1},f=function(e,t){var n=e.dom,r=n.getParent(e.selection.getStart(),n.isBlock);if(r&&n.isEmpty(r)){var i=a.normalizeRange(e.selection.getRng(!0)),o=n.getParent(u(e,i,t),"LI");if(o)return e.undoManager.transact(function(){n.remove(r),l.mergeWithAdjacentLists(n,o.parentNode),e.selection.select(o,!0),e.selection.collapse(t)}),!0}return!1},p=function(e,t){return d(e,t)||f(e,t)},h=function(e){var t=e.dom.getParent(e.selection.getStart(),"LI,DT,DD");return!!(t||r.getSelectedListItems(e).length>0)&&(e.undoManager.transact(function(){e.execCommand("Delete"),s.normalizeLists(e.dom,e.getBody())}),!0)},m=function(e,t){return e.selection.isCollapsed()?p(e,t):h(e)},g=function(e){e.on("keydown",function(t){t.keyCode===n.BACKSPACE?m(e,!1)&&t.preventDefault():t.keyCode===n.DELETE&&m(e,!0)&&t.preventDefault()})};return{setup:g,backspaceDelete:m}}),a("6",["h","4","c","b"],function(e,t,n,r){var i=function(n,r){var i;if(t.isListNode(n)){for(;i=n.firstChild;)r.appendChild(i);e.remove(n)}},o=function(n){var r,o,a;return"DT"===n.nodeName?(e.rename(n,"DD"),!0):(r=n.previousSibling,r&&t.isListNode(r)?(r.appendChild(n),!0):r&&"LI"===r.nodeName&&t.isListNode(r.lastChild)?(r.lastChild.appendChild(n),i(n.lastChild,r.lastChild),!0):(r=n.nextSibling,r&&t.isListNode(r)?(r.insertBefore(n,r.firstChild),!0):(r=n.previousSibling,!(!r||"LI"!==r.nodeName)&&(o=e.create(n.parentNode.nodeName),a=e.getStyle(n.parentNode,"listStyleType"),a&&e.setStyle(o,"listStyleType",a),r.appendChild(o),o.appendChild(n),i(n.lastChild,o),!0))))},a=function(e){var t=r.getSelectedListItems(e);if(t.length){for(var i=n.createBookmark(e.selection.getRng(!0)),a=0;a0&&o[0].nodeName===n)})}},i=function(e,n){var r=e.settings.plugins?e.settings.plugins:"";return t.inArray(r.split(/[ ,]/),n)!==-1};i(e,"advlist")||(e.addButton("numlist",{title:"Numbered list",cmd:"InsertOrderedList",onPostRender:n("OL")}),e.addButton("bullist",{title:"Bullet list",cmd:"InsertUnorderedList",onPostRender:n("UL")})),e.addButton("indent",{icon:"indent",title:"Increase indent",cmd:"Indent",onPostRender:function(t){var n=t.control;e.on("nodechange",function(){for(var t=e.selection.getSelectedBlocks(),i=!1,o=0,a=t.length;!i&&oL zQ+;Np)nd>ixyb(2?Pi;ycRzh!V|9~NZ#OrN^dMrNY)iJ)*fcuLmTC-*wHo_})(MUF z^k>)-3L>X@Cfd|%nR@J9!(dB~%*?W-&)~uxstrbZm*WU0tHnJb{V(31+iiUDn2^IU*QV~jJhS1j`jgDTv-Bw`rkT+#7X3X$oG_+T zm%sEE)&!Jj`A3AmA^WdbDsPcHI`;IWnk$B6cKVG326kAK_xqyIiVAaP%;*xKRrh!3 z)}zm=?aSKdbbflH%*`k72LICR%-cadIzK%(qo7IMq+jnXo1KwrahzV6kg!lJ*FUs) z$ftd+5p_(*XC~g>`}%=laqEforbq9M+8DPrAhBNk`kSXu4>pwg!>8En#M05mgoK2M z)92402?+@qZ=4j_*4i;$nD+B1f8B^XckXmtc=6)J#M|?}dJs3_!S2T=Pv8Fb(+5#* zV#{K-|Jt`(uk5>Pw}%`H?J@KGl8cIn*UumNKMn2Fx%2YaS#1w>k-yx3pvsxp4qdx; zRXz=UdiPwU?+=7a88P?Me%~hT$c*mXeolpvbDIrr8vfw?M#H^>C3m(A#&fAKp7KrkM50?g6r6*Du-j6;JPVbWH678y@a`T_gO#Y}?*| zy$Q?PkNLX)x;1@h!{H09-AU7lUGpDLbSZeY{wcU!h@m2$~VA0MwBGketOiOt^K zzES(DXZIGJXnE?^k;#=dK6-Iy_4-zqz8`;g`Q5wg_w`+SYSo0&^$#62JiM~!-m%Di z(u81zr^ej9cdyQ&SC$(`r;V9Y{`Ir_#V&Q2+UL`RU7NznHpu*ON0R#KjobIPUv2;7 z`PfGd`v0|H-JAw3$M@Oy^7O4g=k~ku%dw}!%9lsMF-rDrX zrdJsou1U5({#}H?dCOZ_{$H4T|fVPMIVbMxJ=4;Ep7+fw%d>l% zPmQ&_+urbL{jf79n;kuR^b5!4J&nbL`EhH?G=1||%bZIaV#Wn;>@oQ5w6#6}_iKZyWH~1jsU<;L(pJw=Sn|R`{m&?7F>!XV)^0 zT{*aM;-^gqeYWw=o9h#sHMU$DIq21&%d@U-DE`S88(@#lcboWU!SdD_1qlc6KffNesPp<{+m*qEZ@(E-Vd0|=uXk=q|GDq|i#N)CcK7UB!<)-Nf1iE; zLN>KQcIr?))k`+5G(c7?6`Kgnx-;o8A*f9{BXRDVj= z!mH0)4es~nz=hV*lS?NR!im}a%{cn5e2t76zuqiA@OFiV7biD4Irh=JvF~~|FD!BY z-aYNBuMU@9K$&h=}vmw_o0$vG=7Z{Bv#fme&uNt(DK^92<71 zRsN3YQ>FxNZ2#nV|4yBzg*RM(Y3YRN3ymxNl4sa=*>9b!TzUH81<}I}{NN}lywxcJK5yDxvzX=T%?OHOTS zcHS_t$)VsH-K#!<^D?lqC4WiW#zzY_4u4YU*RaZgdQDqRC`jL3qxV<-O<#n5bz@rR z^Kf?VO}iZYdPhi9O74rbdFMK^Ro3?Cu)3`fh%B|HtBGB<3Cd>h|WIr*7U}JhAE6 z?&aU6KiTgS8Ps@U`EOntxHJ@w1YX zp6m`hH6rWC;m0}K8sFYAwp0118&~f9TfkVHNV;X#m}z}ZuW4ec$f27J&n=($dAk?0 zw*I)ya#`DCcI)fA<3?^=eKM!o_2`(LnZNHJTF!8B$LS+aJCt2@yDTaH^nJ)#97E0q06YOzYi#_*XMZU3v24&w@RD z*6EtQv|ZkchK*Y?qZFL17Yo;R+n)UH+PKIzb=qx9J@$Kap>U=);rGi;XVFHvJ=D?%6)q50$+!xG-s9zp8)dESPe$8-Hle^DWoM zo_$L9{5<+y#rImI7dTl988i^nw&#Vs=qKG3k)qA3#}SGx1CQ{c|9mtPfs`U;Hn%SF#8 z)W5Q0@#4kTEAA;V;!2;RF$HP3kj&IuC+A+9`^UaFk9=N(jvo$kf26Z|r=wnphA(~^ z^r`B}-m{^1diUzpcU|(HSGsR}E9KR>u%t(s&$iru`&-koJFg6I3>??5_mSu2{oaZo@nj~G=*L&rXmoWog%!_aOaL>AY`xnjLJ}I`V|KE#l_gpaL)YLuUZ_4euCr%zV z(6`g?eIGr4^0vj{Z_oQjXEr-n`ND%Y4ed8aH+`_@tLGgXHoLit9(dXOa0kuhtJ5;) zFFG>hP^0cUvqr>!KQW<4%GGsCC-zGmH0bTCb3F#nedYL}(Wjs8+Vs`}d`Q{#L>qpi zd52$a`Rr`=M^53GxT#g%j=Iw6<=f|1$L&3FY(}I{UY+feACAfGQyBMfV%1w>dhf~n zo`iG$4;Gi)_jbyYmjO4PkNvjv#`4y`N{+q1@|?e6{=P9Y3&kVPpUyeivrmolztv1? z^5X3@%P)(=%Xik_UU_RkmnkoPy-UdG1E1(<}&foC&+O;hPmv1(tow@9( zDjj~Qo7{Hd^Ed1ItgF|%N$~u=Z*Je5-n-W?t1eVLw`0fCEe*7*4{TA??NP9zFz$u< z;^R*b?Yvm#&fh&|T)xq|?u2W-Qcvt&G9aQ;+`iu3OLptfq(;-arbNTkNprrqzv^n; z8e>naZ!%jq!E&vj-Gm8iRxbSf{K|Xvs=r;==X0xk-#Fcb&(Ad2wD9%r3Ww^RJQ$of z5o#!+2@EAsz()w^JK z;_{_zknK&N=gL#PhA$g<;$cXML#EX|hhN{cM4$8X@H?Y?ON7)on4TEFulJnQC%%|? zVtM4lt<#>ae*CjKYm9y4g*zKxKDlvsTuW?SGQ%ajteV1_X}9{d7ZH4 z>-w}zJ$wCHg5g2guOHTZo4&#E+nOU)j%92*u=C=Y`(3|&^(c8wVEHiQ?RhBl^WDAr zcAXvW zaq#Ay=g*C+YPHDva_j1E&h4mLZ{IU()4H)YOI>b%sG-F3Q(NYaOX@VO)4V4hPOf-) zyYCrb&%vAL=AD>v`q{n7Q?7=@N7OJi`6)f|rZ#eKse<+StGlgl{R){)?<)T?u39zz z*xjpxADxbT@#*J7`uJ^IFtGdAhiu7t&j)TYEp^qgxg&JVrQ=kGsjT8{kudgPSo zLl1j&y|({iMA^6Nj$Pba{07^N!w17F@0(C1>*(}5Ti*HB?FP&F<>9rv!Ih>x{c1|R zx92w<9042A=WpZEn=1|_nqf^*+kS+RdZ`EXp7=@lzBTP$N&62Q^7iuz`#!09uIttj zW5%UE?tSWJLh5N-*s6`uS39c5`WSrHz)}x>*ZXk$0lD3;A2q;U)IR9w*Z$bCb<dr7-z*pN)y^c|EY^FR zk74tfggZO5oh_D?lYUv}p2zN)Q#uZwHeLRD*tPgdr#pZD;}1bQ<6li5{V;7@zOHiR z->)q?-~H`$qp^LjZ<6O#fYO_bn_oVeS!bnf{@!21()CUxHP)|BBv4lKmU{a=IuN%gIJ?z;KSyl{9 z)f;;E%(CTVq+$P1?Dhe=KF4nS82-o6``WBI>Bb&8ng1|E-Kc-;lLkTa#|QdYCsU5q z3K6l<_z!(*Mt!7H2Hqh2OSfA8&@bEAKf7Y6$(8}U{lb`)rq9q<47FPZ8ez|BRtz=R zthTHs6)VNEA0TP7VyCPeqjMW-1Gdp>G-T^jta$%_u^LU;Oe9imAUWx*4^9Dwl4L2A zt=J=3uAxz6T-|F%Ir}IZ!{nSDyk#oV)ocT~{#OLt@P9=xTe7o__UwPbX&fod^*>t% zin7-_Li<|m7OxHY$hy3R|Kkh$C`OT$eH7#UrF{gc=-Q;J%q&~aETi3?s?YK)%Two; zjq0`PdZ~kkMMa}h6#H??W&;mL>bhC*G5YTjaS40m$NHq^m`uj3_j^s}Yt#QTLs+Mdm#(YZ@PpYl{0B?uny$+n)@HV@>`4H|(TqP4B6ke_7-IRGV3=LEZn*WTKoD;m-dUvng2=Y3>c&4#5Aj_QT^V zIG0@Ozh3kIRF?r`2bZm6Ypmb0M zoGDA6Zmh{^xEh>{TSIGg;OO_W@MmYUJb@GX+AL{m_DMkv*sqLiyDSDDs`UPr8q(Ww z-JFi~b@Ux|L2#f}tJEiBpT z`pj1PY`xgRX0sag8G=41+veL!YL`gLfL>2yaFIHkh~5HRmAB7HPc>$#B)UC~wsd7j zyiCaGX*J5Cv$FI9l!;mT3_E@xA?skXzq7^*G>R&rw4_P$Q1aUKC z^%ko!%@?NXDXAV1jpdGfvt}?@1 zBy5%4Z0jdwl~~JWud*BTRw*kWVKuh6$f>c1tKgpodOgcFz*Sbo;TJj4cDpg#uf>3D zBNI?obn+-C+hVmV-A%#HoorMTxtP~R_Hb^P3Moqx8R+WesZwOyq|;g=uC0E6EhoE` zB}>}680n*<@~%Gr(C%+7T3yPL(HFRjU*WvhA&{-H$Z7SDa~||8eLuYB)5I}`BaS}X zU^ZrjxJUn>uaIT4Wy|cS0)!0EUnq^xS4h{}dy7uboAf6GTA%$45IDQ3^le)eV-g-3%6#5y@rjmqD~P_7AwesT?r#* zq_qPrtIT$(7D*%;w$8Go`S!HhQuWqETU#5{`C2hew6$iH%AUsT7D(1ELJow@AKX4@i_WT4nXVyDu@>MrhFS9k79X?MQV^mtF2 zcx!f+8qOgsg!vCyA$WYF)B5T&492vgW0i2pom;O{+n5{~F3BZHxh*#WkUL|acV)3UJjla@CY^E3J>5 z2vL&oF3x9H=krS+>B$bL%B?=Sc(PqR*)N?+x1;Mwy;tt~UinM4R8C-;(7VvpyWm2T zj*Xvpp>`|5Vz1pwCDp}2R-SIj%CcoC(7=PL?&8XH^)uMgGjpcDk)yWtOC6^%=mjF zut}hk<1*4LV3AZ7dn=nEhdBsYPE2Q$(p9#X^tfU!YRr|f2YPRi#67tb?Z{9MWeIqM z1$3?gnFRq42p8Crq3~8)&xntHvRo@Fsvi4XIWoO}qy=#^^j7hUn2rf?y7oSGYSgR| zRikFTsQUFZ=xlr;ya!0E5+H=G`oRI6h8npOLC=%{PmF(x5FYVmdL18emCLf5uaJLuFV zx_#>yr{*@m8R=>ClbSkpaQ1Uu*sy*Ysj-!=b9<@T-*bs2A;flS+cu$P$Cwxwg2xa@ z2<>$p+Z93Z7zT!*$i(x~Da$Hlz$pp!kJGsK@B&MVZ35mK6 zYG*eV7(fKo!?nwP&hWLrR1Ao5X5z5jq&FCSz?Rt|(5wN{BY-lrs#tJiL^+QOJ8BV8cKv0ngw~^!lgcYs) zcqm)GC=#193s#I0V(EV&QpP)OZ}grbRIva$8m}r8z`Y)AV`39!?B*gEPgpCXNuOh7 z^8m)RGiK!Yu@1~wpqr~`uj`S}GP-Sy((bB~gA3d<+pNaZ&?zw%!xKA528#z(l7c}+ z;;+xn2KU+%7Q#-0Kqy-3+I46flNck%Eif93NuE>@?@ICrvXE#t#?MmJ9^fo`Vt7@j zj%_;{K?d#FayV9S24w8)32>IpGLzM213h9i_V!Ca-Qo5b{p>}G0c^!imNE_Og9oUG zbU@T;UJY_QIMHo=+UfALw~dMZB1R?U+vy<7A{Ay>d{|a8Eq>9hTE(>LkqC@TjBXvH z0AI4D*O9GT54d}t1`K7PgI`ct8j*j78$#B5Kve8q~Z=RuB540 zJ`psgRb|Tn8>Pn!7P*0Ga8>)5M4Urnrvy1DrMNF+d}7)s#&qlv+cCObj4x~sn^zo) zxR10gtim@st0&X*G3X9ZV}BmZrc4TvT#Jd$R(5(S+0x-G`5JPv zFi4b2K`vv~$V=b*!l?zpXQl~CXieRvAoOK`oD^+2JG^(UrJ%{jX;pgE=@BJkTkPxh z-Z0*hr!#}X>r?IS0K3u0!-Sj44=BUBL4#ldKk;8tDusXQji$LsP}78TVfDoWwH!If8M<>IdSxSXJtXw`yTwNebw zl35iJMWdofBM~gN4ZKofCKh6sOYwr3sZaaTm}QfL!pJfhA%Zo71E|#Jfa?dUeSiX( z#uSl&86gwwn_#xtvxQ7sR<(H9#;~tVS6qt*ikG6Zp7zu;d+$ zJ!AT3&LGKEn>DK1ExA$m$Yzz2KB?BIS~IBV9@#yzYBg+u-)c^b=1CFN8Z~p}sx@m~ zt(m)H1R^!6+C2>$;8*J8BGE0mS*7lgNfF&6s{vv)XAKg;v5*QY;K-G#)?g$AV}GMT zk&|HrBamsN-9I5cNvN2G5x2oes>tA6Sh7hIA-TIfLI4OW4u|UV4-7wT)JO%k9Ky#m zV{|s@K`m*d8%^pa^s-qpND`^xn_z_F3!G)@z_*B3!8E)zo7m6>qn9Zdj25d?{h~9Z zkg}aR2w-UJ0ti(XOuC9v*wMxL?5cFf8VXmOp={y0){%j87t>Mf(ylEUBZceF@_e#w zZEgL)71rC0GWL>yx25)y8Bms~(dvVL7zY&efT{$$mt}#IWt2-Xg@6?T^Y+tO(15G} zR~{n=8N0$)dEN%loJ=t%lNlQU-!>^Rk&1WP768W6!pj1_WeFw{FHx;2E-w;$e5?(pL;}>4lYC3QT0oO35Xw zL@S5UAZ{!8BaozL*_ybP{Tv! z6U>AxhDQlm$TC(cafE~%#foDj)$|Lt67~B1^})DhRKPCy}3( zZCkEg17-C{(!RVdv_k_@o`|X{B=U2)EMO9I#CMrJ>d9A3ZE($e7Rg_3-ib5?>U0Wn|M0H(JT~Ack7u5|! zbwknjQ&HVm^lc)ln~LgYqF=PAZXxn5MRhAt9V4n^MRjXY-9}W$iRyS!{h6q4E2`Ux z>h_{qC#pM$>d!@WN0B6m>O@i9NmPF!syd6RE~5XJ%FaY2-9=TBNP38>6tP&USj-@* z(v(K3H1T4PSq!p>LA}JF-eQnd3`!S+GQ=R87?ddn^$~-z#2~vElr0A3h(UeDpnhUd ze=%r)7&K4}`brG?S_~Q_27Mz24HkoPi5N5lU?{*afZ+fm07e3g0vHW224E~~#yFx( zBgzya22TL^7HTHKBr`-%(PR?j`ijAm;n7bdQ{XWb;5&e9kz|Ubk4UCLr|D3UDiWYf zfHECecEVTgg3jr1ZECE;wu$+ke3V5z0VwrkknfhXx zRghZ^um)f)z&e2S02=@{0&D`<46p@YE5J5@?EpIfb^`nWqwNBUZA7vg9(w@x0_=mP z&%`o6!s91^{ZREYzyZh~gy$iE!$d6m3lYm7Ct`(D01kjWfP8=gfYShH0L}uO12_+G z0pKFQC4kESzXDtVxC-za!0!Op0Imc40b|?*xJATDw*mfy{2h3HCRVx&k9z?3iAWz3 zu}VF$N`0})-;jF*@EG6;AU_3o2JjrpF92QwyaIR)@CM*5z&n6KfLtn883HgAU>Lw~ zfDsh-3t%)A{l`$TDr`u#@l>of0pMGJi2#$JeF_ynnF`PE0H#qfVmdr$P*FRJiovr1 z=0JHazZ0xSnu39uSqEx>w!4FDUdSbY;bHv?<|*b1->UG~ju-vM!*c?_w*V6XuE2CA@yael*#1<=gWsXv8f%32l@Y6-Q8Xju^)&i{K#TIRpRTZ$&yz)D$QceT?O*ZnP?}jC=}2U+|*tCBQ3y*8o6C_l8#=P7M2+Bo> zvPe)a!RHb|xfGvE1?4h)E)$e_FdSJWC|6>6CG=Yj{nh}ih5R~rt_Rp4C~p#t@)p2& z7Eik*Sf*AP&z&LwL0kDGjD78MN13=sYK->b9yNE&=1v~@sY_k$JeC9TByBX~#`{ZRq3dlql)z>rJ>6CL!)zsUqisdTNU_5g`~8UqlElIwgE6TvK(e zLMFHpLHLj@L_o)H-6(veK)tmq+?3;?mcEU48sZi;0h@ljKb!9PE4wLejgkn+w zlZue=l>`~)A)!PjW3tRCLGY+b<>NzrO9BN-IN3kRt#5HQvwxLWw=z(A7hD-a!rmtu zfRe)V9_b;xbfiibcjA<&Tt(@_(X!zjSCy-VNd#1?)t_)&Nwr#w0$rWsYH*Pp7sb_t zCaxC8)#mDOTwS%g9?V3gst>7;PXm@VgdGw1M!0F85{_>SOl<;-Zb~?@8Q}t&6Rt!w zaI^*CO0^_hNGrmXjv-u`Si+TUO}KJx2vruJ;Ay>UO4Fy)Kli--YKIbfsLwFDcjPOP>3* z8|4~ztN!!&wEm?V^5w-FjFqk%yXSAl>5TMbDeupu1hbT z>)M-gU-ss?ZdS^5xAI(4I^mKt2-m|#xRgx7>HAPFHH&ZtJK@r@DQC>)Ia3bhdiJH9 zxgX&y{R!7=Kzn6zzU{!TGOB!y8#IXHzTpN}12Si1UD5#g(^#O(+QcudmN;K5tZCb$6^OZbh_W0UmQ4390K zGPc6|TjysB3nKG2iBOoC%?hUDW z5QaHT4#JRUAnNA1vyf8m97NwdcOFv8T_8swy$C7KT_V3gdKps6{Ys8P{tBd&yGo8h z{x?V|_d7Wb`D>6;?m9UE`9C0~+zoOP@;4!++%0kn^0y(S+@Hh&`8$wO?k>rL{5?o1 zcc0`#{sE+vdq@f({}-f``0@#h(kGDe+*5K6^3NdUx##3Ol7QlCo%r3lu-9={TFm##n>O!%vSSxBxz-(30|ux}VeCJv{+Lpp+9 zgLEXl4(TWwLX~0MSjvRb7X<4MqO8nKpe1ggWWicNuwbp2-ewqovh)sf1MZ@%(|aiE z^ghZueE{iX`Vi77^e;%K(!U}7jy{5P8hs4ubovC+8T2WnGwCx(XVK><_4Ea#v*}An z=g?P>&ZVy*okuHFQHFC1DSZQDR^i^VbPIV$lvTMUlrMCjo~0B|&oUYYGuucNxfG<5 z=7JBgiVlJNYC06sHIRZ-(qWKa2Px03r^CT!ZJ=e#DI>ToR5k+KuK-{V$GrnN9|djO z=x9i{(=m|l0H=K{4d7wCFfxwHiSRuo;ar3}Ujyt$I`1ltryQ*c?Bw{W+!SB|QGSap z^C+1}>e8^GL7$$XsBPD&Qwly*_F5T~?Rm`KWsupfzynmBt+l>=EHoUF%Vc+LEwrl zr(_EhgEmnTCUC`J6=el3_&9`b5Cig#sMg>e@KmAnb3~;qrrMuqo^A=HP)h}cQgw4tFzxx=I#Y7jM*LD!~=sq%6#RH^`- zQf0BT0CP1Zf#CfBR;sMm8d|NEC=WPYSf~&c@|3kSWgRuGr}_;P^5Oc8_(<7AO`EBH z3w7u|Y+Li9Y+%2 zR*#P&=17MrGEAl4K^;l8<7;!~S`HKZM(SWk99o608FA>E;}CKlJip3$rXOeuHSMDL zrrlJxhtlMlSY_HvP5Y?1W>O1X3q%$Ls#1UEi0T}12FB59n<9?_a56@c^dpV`k#e~| z(sW`ZR$}@|qS#!n`<_s&N!m|YC({}lzn>Ca3~9}gpWz@wHw6!YRKt{d(<1^QD6W>G z)gGWoyl)`Hnn^LN4E>;w2Dp$CsXIWq!!Y_03d3_gh!T?A5ZlcSQzDaop(zakG5!}y^hZ%J z)f6z4DRsiqbYK#p!q-*7IV=2d=)j~lx;7jN!7*w&PW30Sum1-vC!H-CTyI&dq^46e zB^G&vrBWsbO=*oKKnf6fmHG-nexHpplDu@--@3?2kOzpDo2xvfDYUtdr!mlUKvskN>(r}1MIcnVT3Qr#%Zr8K~k&bn$Ko=>h9ZmyTqO4kYr z6-PqV*(Uzyoq}q(qu7QT;Z;a+fJ2ztY8FX^ZsRadjnlI8|+3rz%og zNSgnwMj5{(A7Bq}fJOD^JUMARqgq^yFrCcYIa|3Pn1u9N_}YZF2J zQ*(MmfQ+f12JT$FzDy6n>5?Q7uuMbAVo4yeFq|xoy-8`#87Kgj)SkB}_7G!skd@PE9bDv@@ScwvdYk6U_f1(%wdYvJ)mw?<}kI!BA)gA za6YfI9Pr%{YOVuRLMgZfl^sz=E=3lV@&}1ZQAMRZq){pAsFW)3+l4F3e$16yV{Alt z9>=Z(y{O6&mDD!03o*w*O&DIGs2x$s!Tn;mg!p0p7anKS4%#CqV81u)CxTqz8;^o# z5G0*#B>CxJ{|eH12kLGBw1#{fpZtiX93YO^*_4k4Y7iWG z`2}%&%6J+Y^a%*XOKN&Wp#gZIoyEt#28SvL6yD$$Rp(4}t#Hdce2 zb`EcPi&ffrnAs2rN6i7^^$x^mDsgH!8wHONrP(wnG)Msm!r&aq!VEGUBssu|ObU)> zRm2#a7bG2BCu*K-utv>L^YjNn_@@!v?mkGdw38w_enKvBlRU&oW+BN4M9C#yG?k2I zE^!k*&>O=V*91id>HVlzXE6aH1XGpXl)a=0ue^QQQk>Z=7j=oM|l1 zbohre9Zob=F=HMk>E&Jiqmtr^7wZ0Uzwr2+uAZX9Es&@6w152OQzqrQ>d*UwuGy zq=)DUM)Yep(UBh#9qA!@!cBD02Si7Ch@NCbzi|^C^&!zw9-=4RLJ7u^)~!mT1a4M*^wvjPos7ghJ#TXT*o&jPs0>$Hp1yVbr(}#~J5g zRGypcD1y2ikB}<4Ndhh`{`rdpDjWb;yhDKun*n zp5FItKB#9Y{u~s#IuLoK`;Op3LW@ZY%GaNj7NiN~xO|`@If;Y%25O47gY6%LOvp2_ zDdYuwU04W<8c!%p4y=nK4?LWF@MNHJ0;@#lBhL(uQoeaO)_x0yNugArCnGUrA`t-X z7?I4-nb6#C&N@tAhX%FtvO#C^w2LJZg!4(N%8HWxF@KHfC0&^`WZ4#vnwp#{mzN09=#$;T~+ea%N50g50Wk2Rd#d^|I7FyJ{D>`gve z4=@q=sPI9n=cBeoX+~X!(w1)?1dE!)gsrwDY{jZdGIp9^G~*BoDV8pRr^su3Jrx(g z1LUFaWax_@Iz=Uo;EQ?z?cukJD0x)_0CNiQ+{{dcyi(4bsdO)!*&or7hjp5zdu{`>>`$=AY@r#9pjxRX#Eab&(n3qz8 z!pv$Ue$HY13vN1&)I? zCA}k{{m@YjQ?ZaDOcno*P}U)N5?{qUiAV1>WioG?!Z)8soR>SSVk+N!zPm#A9S@7< zr|}#Kru=vw|BvjqJjcHy+`1U)r)%3Wu04H4mvGkG^Cwg4tXCnGX@*b z7_1-y^-)JL6}SN`(pECvrHNOQzUVSzM!TMOU|Z~u1SDeya%rW9&_*P*ipY5%^+ZsT zRnG#gjX-M^2}I=qPe&g1gpNooFt{kuyoD~Z4$~UqHUwK?_@>OMT0=mCEy9|`Ij9v` z*^k|wvTP2h<9S3oifa4jYx}Xv;RKG~eRl3v6FID~HCy2(^1%?FAQ|XA8hSIse3;@@ zo@>+(>8-}CXMh;9#yf7cV4(nmd+S)3oKK^~ern>UD|xm64byq(T7FMv+-Nq#{* z98mK-f-7+3r3$Gs-8~{WbU#2eTqV8=ms=&mps1ps!>203^>ZOL%>&tw(9P$mE6+MD z;00FJE#$dW1)Ge+w2R3nMEX#(h@a}b`q%&xs8%bI*O4mbbvW0J?uu}!ViPc2tqxCG z%qQ{eQjlGcF5y!cNAY3`c^uDE-C`CbZUzxltAkzmQ`l{)r+Eu_R%&%j$^xQQ1VMz5 zvXq4DC-EuE2y;M|kt$Gfb^eaV^8`C;@K(-QIn`AO)V97)ZJ9)EsYGpQ5o%LEM(sN< zYTIBt)#^Z3(=@N9?M0iWdo}IAIruFVr28Y(EkPK^W|K zmcXto<(qFH(q$+sFXNkUl*+8vUc$PqCrlFYW)w4FoNhVq#F)r4jKzSlSTgnSbZ+-< zFG@Ek!&?G)OPqL1TzGrD@b*dc*05t0Sd-(7r1>U-%VDSHjnoHKqcm%%d;4A;qw}Lg zXE}6RPVh(qoy~;t11eHNO!HAsQi%wwSm3E(6n>H@ECmWnB_9l)Y^3H}yaw7Yp)CWn zWlpqZPPDCFXfLJpuK=_aPP7$Hv~6B!KTFhB0@_L^+Da$db}zI8651+BC8{Kqs6EJ| z#$yPFB!tz3sYjJlJs#$nrll*uECg{Y!72oCJHdCC^apI535+Wu=jnD6_TmC^lK%Js zB+N%$3SC&d4tL7nL@ycK<-yqJ!IjQ}$|#t+pV=NCYgYym^I(lE}i6k@t?X*78cMb?IsuZBJJ<<`I+ z`f_W*vioxDc>IKGJFjyONcbZ;{P;7CgX_b>;y|bz|3)olWPizYwS9BHtPr|2hnL#MS|0`>7SjZa`4+l zUDo9{)rEeC2)@ad{HDXiPvnJM;HFr@Y_ zAG;HABMbr}gW$8EJIzW`g)j~<@cp$^BF+*{Q#KjMrOHy}#kUj|=EF>X0Ug5&pE#oO z0>GioYr{@APVXM@LrZXKSi0{nL7$_*b3x|zcaP!L@fueIChOu`*8DSy{&B#A=$-A& z2|(iU`rUnVocukUOa1rgubd%*vqBck_BdoaLI?Uy3|K=B*%}@HCMi^u!NPjfQap^FoLavZ4fR&sg zGC@%8q^`3FDvQMtDpW*JKrNQ*?^a`YYOqc72W$lD9Mdp*bD{jV;n)IeZt4?;mHE+Gk(DWMgcWn=xV%6MYIw44wT_PXR44c7%{@B zYjNfh53GD>P_e>7=_Oe{zL+@Yd@q5Gv<<1efG(kX`6pDi5A=wN`w`Tq!2Ja3Q^oBE z^(k;agZlL69C%8FX83W(*}N2CGczkG!l)5v(X9N38xA{`S5)@$nd}9C+Bm>V!sl1k zd;o>7fVf_8yhR-912_ly&@TSwZ(8FAMV`RAkO&ZZ;Vlb$2X~p620Kib+F>a0`HWw&uH+P8E|3C!_u#AP#vP#$I!!4~OAnn~hk63%>yxU-jugS~Zkn0|A;3mFO%@$o5> ze3iI7`JyYhigbrj5u)btyi43+wz%W?;H8HkJzN6sV#rW}Zx?|M!)GfP&ejBvwSk}= zU5LY7jSF2Jq?`6^?-7djU+?bkUHf5wnIp+B3p>Ej34FK}@DxubA!g1KXGaDutxaBzaT6L4^Xx#3I}@OoT# zjc`Qk7~C=Y)zBrQ|(S_o==k(Q0*>iUO_GB z0bJ%e?RWuS;~ClfQr{TCj?D( zn@)xZ;1P(7A;5)Na#_G}m>_ruse(dqjs%wW7SBnM zv%?{U9>A&C=Y;8(*q4On%Gj;I9qF^Td}bSUuTe4cw_%wA_a`h;DsT}=6=0#MLYr_9$tmFV$x*FHmLMD%$yn-eE+KUF^mM8z z{+``um~P{*DPIXcOrZDJ8t=mzmE2S+m&xP<(DRkS;>v>e8(MyAJ+g%kOK#@jL*;FCl^oWlyOM$GTARjqgfc^D@ z3$PEU>;hQYca&GikKaiMDkMwROKk%2PE;%FJQBR2b&c-F4L$C{FYvzZOX@& z=W@$?=92Hw&JrN(ct&{r6CO&lU8Sd3n(Hb(!_s_L={f)2AO)rue0T_)n|uuFameXZ zEtko603(t@<3qXJ(6dP|`S_PSm-~`Gr(Gmy7Yo`Y5G`nz3SmClWkR?%kEXohO|Nbqfm0kcLL9m~5qK}A!kA{d6;E@*cMc;^rs z%$h2(nE)^FMq;PX0>9FqA+Yy3`OraDw8LZeS{&2~-mvW8S;g-}8aZ|*Z2K-@HBvo6 zJhS-;^4i^kb`Nq;yI1%^z#A61)B(fNutLO&XL| zx*Gj7ouJs)S@PGw!PoY4mNc4%P}=N54Zy<-`|m6UYDz;fk2;IR@DmWcE({AoPdO|| zp)CE=yTYKDw}pe>7S4EEnD@5uPxkxN^(%i@Sm9lv!Rxo5*YB`*h0q_p+M92fSDUZR zV1J%~mqB412y?#H=3Vg@Gm~?`0hP%!@U$6Z=n3Sb7oaQhCm~LChsG(NPYK%0?sGt! z76ihQ@<0y17ua=h9$pQ~obvEq8U2G*l7El~!_H-n?JVBq*m^F`J+3V%D5sv&t|USD zl1V$-siv5=)*cX~OYeiiP;>>`NOx3B$AFiM9i7g&=@uU_5|xqUExSy^zc|b9*@pkh zS^kGH1Dy&H6)i&nwb%yF?;$w9h{R5C3s?M51dqKAKpYpomc-5$XpZwPiw{d%jH-VT z42MAqVjcFTTI*k_@-E7U-INysr6gb0-xn0LOj6Ld*_GBD0pAGB74VI~JOSgAc~k^X z_m%sSR{=T!+{%>T&4DHH+ot(~Zh^p_Sgl(q5X~5nJ4Er{95_hILeC^czG;yVC>?n8 z-#|~>(GiGO&|F0XTJjsjG?Y*BD_|zLAPoI;)T|Hq*cN{d_z;rd09{azZ9XKZ@ZUJo|lV$(lenyX {dependencies, definition, instance (possibly undefined)} - -// Used when there is no 'main' module. -// The name is probably (hopefully) unique so minification removes for releases. -var register_3795 = function (id) { - var module = dem(id); - var fragments = id.split('.'); - var target = Function('return this;')(); - for (var i = 0; i < fragments.length - 1; ++i) { - if (target[fragments[i]] === undefined) - target[fragments[i]] = {}; - target = target[fragments[i]]; - } - target[fragments[fragments.length - 1]] = module; -}; - -var instantiate = function (id) { - var actual = defs[id]; - var dependencies = actual.deps; - var definition = actual.defn; - var len = dependencies.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances[i] = dem(dependencies[i]); - var defResult = definition.apply(null, instances); - if (defResult === undefined) - throw 'module [' + id + '] returned undefined'; - actual.instance = defResult; -}; - -var def = function (id, dependencies, definition) { - if (typeof id !== 'string') - throw 'module id must be a string'; - else if (dependencies === undefined) - throw 'no dependencies for ' + id; - else if (definition === undefined) - throw 'no definition function for ' + id; - defs[id] = { - deps: dependencies, - defn: definition, - instance: undefined - }; -}; - -var dem = function (id) { - var actual = defs[id]; - if (actual === undefined) - throw 'module [' + id + '] was undefined'; - else if (actual.instance === undefined) - instantiate(id); - return actual.instance; -}; - -var req = function (ids, callback) { - var len = ids.length; - var instances = new Array(len); - for (var i = 0; i < len; ++i) - instances.push(dem(ids[i])); - callback.apply(null, callback); -}; - -var ephox = {}; - -ephox.bolt = { - module: { - api: { - define: def, - require: req, - demand: dem - } - } -}; - -var define = def; -var require = req; -var demand = dem; -// this helps with minificiation when using a lot of global references -var defineGlobal = function (id, ref) { - define(id, [], function () { return ref; }); -}; -/*jsc -["tinymce.media.Plugin","global!tinymce.PluginManager","tinymce.media.ui.Dialog","tinymce.media.core.Sanitize","tinymce.media.core.UpdateHtml","tinymce.media.core.Nodes","global!tinymce.util.Delay","tinymce.media.core.HtmlToData","global!tinymce.html.Writer","global!tinymce.html.SaxParser","global!tinymce.html.Schema","global!tinymce.dom.DOMUtils.DOM","tinymce.media.core.Size","tinymce.media.core.Service","global!tinymce.util.Tools","global!tinymce.Env","tinymce.media.ui.SizeManager","tinymce.media.core.VideoScript","global!tinymce.html.Node","tinymce.media.core.DataToHtml","global!tinymce.util.Promise","tinymce.media.core.Mime","tinymce.media.core.UrlPatterns"] -jsc*/ -defineGlobal("global!tinymce.PluginManager", tinymce.PluginManager); -defineGlobal("global!tinymce.util.Delay", tinymce.util.Delay); -defineGlobal("global!tinymce.util.Tools", tinymce.util.Tools); -defineGlobal("global!tinymce.html.SaxParser", tinymce.html.SaxParser); -defineGlobal("global!tinymce.html.Schema", tinymce.html.Schema); -defineGlobal("global!tinymce.dom.DOMUtils.DOM", tinymce.dom.DOMUtils.DOM); -define('tinymce.media.core.VideoScript', [ -], function () { - var getVideoScriptMatch = function (prefixes, src) { - // var prefixes = editor.settings.media_scripts; - - if (prefixes) { - for (var i = 0; i < prefixes.length; i++) { - if (src.indexOf(prefixes[i].filter) !== -1) { - return prefixes[i]; - } - } - } - }; - - return { - getVideoScriptMatch: getVideoScriptMatch - }; -}); -define('tinymce.media.core.Size', [ -], function () { - var trimPx = function (value) { - return value.replace(/px$/, ''); - }; - - var addPx = function (value) { - return /^[0-9.]+$/.test(value) ? (value + 'px') : value; - }; - - var getSize = function (name) { - return function (elm) { - return elm ? trimPx(elm.style[name]) : ''; - }; - }; - - var setSize = function (name) { - return function (elm, value) { - if (elm) { - elm.style[name] = addPx(value); - } - }; - }; - - return { - getMaxWidth: getSize('maxWidth'), - getMaxHeight: getSize('maxHeight'), - setMaxWidth: setSize('maxWidth'), - setMaxHeight: setSize('maxHeight') - }; -}); -define('tinymce.media.core.HtmlToData', [ - 'global!tinymce.util.Tools', - 'global!tinymce.html.SaxParser', - 'global!tinymce.html.Schema', - 'global!tinymce.dom.DOMUtils.DOM', - 'tinymce.media.core.VideoScript', - 'tinymce.media.core.Size' -], function (Tools, SaxParser, Schema, DOM, VideoScript, Size) { - var getEphoxEmbedIri = function (elm) { - return DOM.getAttrib(elm, 'data-ephox-embed-iri'); - }; - - var isEphoxEmbed = function (html) { - var fragment = DOM.createFragment(html); - return getEphoxEmbedIri(fragment.firstChild) !== ''; - }; - - var htmlToDataSax = function (prefixes, html) { - var data = {}; - - new SaxParser({ - validate: false, - allow_conditional_comments: true, - special: 'script,noscript', - start: function (name, attrs) { - if (!data.source1 && name === "param") { - data.source1 = attrs.map.movie; - } - - if (name === "iframe" || name === "object" || name === "embed" || name === "video" || name === "audio") { - if (!data.type) { - data.type = name; - } - - data = Tools.extend(attrs.map, data); - } - - if (name === "script") { - var videoScript = VideoScript.getVideoScriptMatch(prefixes, attrs.map.src); - if (!videoScript) { - return; - } - - data = { - type: "script", - source1: attrs.map.src, - width: videoScript.width, - height: videoScript.height - }; - } - - if (name === "source") { - if (!data.source1) { - data.source1 = attrs.map.src; - } else if (!data.source2) { - data.source2 = attrs.map.src; - } - } - - if (name === "img" && !data.poster) { - data.poster = attrs.map.src; - } - } - }).parse(html); - - data.source1 = data.source1 || data.src || data.data; - data.source2 = data.source2 || ''; - data.poster = data.poster || ''; - - return data; - }; - - var ephoxEmbedHtmlToData = function (html) { - var fragment = DOM.createFragment(html); - var div = fragment.firstChild; - - return { - type: 'ephox-embed-iri', - source1: getEphoxEmbedIri(div), - source2: '', - poster: '', - width: Size.getMaxWidth(div), - height: Size.getMaxHeight(div) - }; - }; - - var htmlToData = function (prefixes, html) { - return isEphoxEmbed(html) ? ephoxEmbedHtmlToData(html) : htmlToDataSax(prefixes, html); - }; - - return { - htmlToData: htmlToData - }; -}); -defineGlobal("global!tinymce.html.Writer", tinymce.html.Writer); -define('tinymce.media.core.UpdateHtml', [ - 'global!tinymce.html.Writer', - 'global!tinymce.html.SaxParser', - 'global!tinymce.html.Schema', - 'global!tinymce.dom.DOMUtils.DOM', - 'tinymce.media.core.Size' -], function (Writer, SaxParser, Schema, DOM, Size) { - var setAttributes = function (attrs, updatedAttrs) { - var name; - var i; - var value; - var attr; - - for (name in updatedAttrs) { - value = "" + updatedAttrs[name]; - - if (attrs.map[name]) { - i = attrs.length; - while (i--) { - attr = attrs[i]; - - if (attr.name === name) { - if (value) { - attrs.map[name] = value; - attr.value = value; - } else { - delete attrs.map[name]; - attrs.splice(i, 1); - } - } - } - } else if (value) { - attrs.push({ - name: name, - value: value - }); - - attrs.map[name] = value; - } - } - }; - - var normalizeHtml = function (html) { - var writer = new Writer(); - var parser = new SaxParser(writer); - parser.parse(html); - return writer.getContent(); - }; - - var updateHtmlSax = function (html, data, updateAll) { - var writer = new Writer(); - var sourceCount = 0; - var hasImage; - - new SaxParser({ - validate: false, - allow_conditional_comments: true, - special: 'script,noscript', - - comment: function (text) { - writer.comment(text); - }, - - cdata: function (text) { - writer.cdata(text); - }, - - text: function (text, raw) { - writer.text(text, raw); - }, - - start: function (name, attrs, empty) { - switch (name) { - case "video": - case "object": - case "embed": - case "img": - case "iframe": - setAttributes(attrs, { - width: data.width, - height: data.height - }); - break; - } - - if (updateAll) { - switch (name) { - case "video": - setAttributes(attrs, { - poster: data.poster, - src: "" - }); - - if (data.source2) { - setAttributes(attrs, { - src: "" - }); - } - break; - - case "iframe": - setAttributes(attrs, { - src: data.source1 - }); - break; - - case "source": - sourceCount++; - - if (sourceCount <= 2) { - setAttributes(attrs, { - src: data["source" + sourceCount], - type: data["source" + sourceCount + "mime"] - }); - - if (!data["source" + sourceCount]) { - return; - } - } - break; - - case "img": - if (!data.poster) { - return; - } - - hasImage = true; - break; - } - } - - writer.start(name, attrs, empty); - }, - - end: function (name) { - if (name === "video" && updateAll) { - for (var index = 1; index <= 2; index++) { - if (data["source" + index]) { - var attrs = []; - attrs.map = {}; - - if (sourceCount < index) { - setAttributes(attrs, { - src: data["source" + index], - type: data["source" + index + "mime"] - }); - - writer.start("source", attrs, true); - } - } - } - } - - if (data.poster && name === "object" && updateAll && !hasImage) { - var imgAttrs = []; - imgAttrs.map = {}; - - setAttributes(imgAttrs, { - src: data.poster, - width: data.width, - height: data.height - }); - - writer.start("img", imgAttrs, true); - } - - writer.end(name); - } - }, new Schema({})).parse(html); - - return writer.getContent(); - }; - - var isEphoxEmbed = function (html) { - var fragment = DOM.createFragment(html); - return DOM.getAttrib(fragment.firstChild, 'data-ephox-embed-iri') !== ''; - }; - - var updateEphoxEmbed = function (html, data) { - var fragment = DOM.createFragment(html); - var div = fragment.firstChild; - - Size.setMaxWidth(div, data.width); - Size.setMaxHeight(div, data.height); - - return normalizeHtml(div.outerHTML); - }; - - var updateHtml = function (html, data, updateAll) { - return isEphoxEmbed(html) ? updateEphoxEmbed(html, data) : updateHtmlSax(html, data, updateAll); - }; - - return { - updateHtml: updateHtml - }; -}); -define('tinymce.media.core.Mime', [ -], function () { - var guess = function (url) { - var mimes = { - 'mp3': 'audio/mpeg', - 'wav': 'audio/wav', - 'mp4': 'video/mp4', - 'webm': 'video/webm', - 'ogg': 'video/ogg', - 'swf': 'application/x-shockwave-flash' - }; - var fileEnd = url.toLowerCase().split('.').pop(); - var mime = mimes[fileEnd]; - - return mime ? mime : ''; - }; - - return { - guess: guess - }; -}); -define('tinymce.media.core.UrlPatterns', [ -], function () { - var urlPatterns = [ - { - regex: /youtu\.be\/([\w\-.]+)/, - type: 'iframe', w: 560, h: 314, - url: '//www.youtube.com/embed/$1', - allowFullscreen: true - }, - { - regex: /youtube\.com(.+)v=([^&]+)/, - type: 'iframe', w: 560, h: 314, - url: '//www.youtube.com/embed/$2', - allowFullscreen: true - }, - { - regex: /youtube.com\/embed\/([a-z0-9\-_]+(?:\?.+)?)/i, - type: 'iframe', w: 560, h: 314, - url: '//www.youtube.com/embed/$1', - allowFullscreen: true - }, - { - regex: /vimeo\.com\/([0-9]+)/, - type: 'iframe', w: 425, h: 350, - url: '//player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc', - allowfullscreen: true - }, - { - regex: /vimeo\.com\/(.*)\/([0-9]+)/, - type: "iframe", w: 425, h: 350, - url: "//player.vimeo.com/video/$2?title=0&byline=0", - allowfullscreen: true - }, - { - regex: /maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/, - type: 'iframe', w: 425, h: 350, - url: '//maps.google.com/maps/ms?msid=$2&output=embed"', - allowFullscreen: false - }, - { - regex: /dailymotion\.com\/video\/([^_]+)/, - type: 'iframe', w: 480, h: 270, - url: '//www.dailymotion.com/embed/video/$1', - allowFullscreen: true - } - ]; - - return { - urlPatterns: urlPatterns - }; -}); -define('tinymce.media.core.DataToHtml', [ - 'tinymce.media.core.Mime', - 'tinymce.media.core.HtmlToData', - 'tinymce.media.core.UrlPatterns', - 'tinymce.media.core.VideoScript', - 'tinymce.media.core.UpdateHtml', - 'global!tinymce.util.Tools' -], function (Mime, HtmlToData, UrlPatterns, VideoScript, UpdateHtml, Tools) { - var dataToHtml = function (editor, dataIn) { - var html = ''; - var data = Tools.extend({}, dataIn); - - if (!data.source1) { - Tools.extend(data, HtmlToData.htmlToData(editor.settings.media_scripts, data.embed)); - if (!data.source1) { - return ''; - } - } - - if (!data.source2) { - data.source2 = ''; - } - - if (!data.poster) { - data.poster = ''; - } - - data.source1 = editor.convertURL(data.source1, "source"); - data.source2 = editor.convertURL(data.source2, "source"); - data.source1mime = Mime.guess(data.source1); - data.source2mime = Mime.guess(data.source2); - data.poster = editor.convertURL(data.poster, "poster"); - - Tools.each(UrlPatterns.urlPatterns, function (pattern) { - var i; - var url; - - var match = pattern.regex.exec(data.source1); - - if (match) { - url = pattern.url; - - for (i = 0; match[i]; i++) { - /*jshint loopfunc:true*/ - /*eslint no-loop-func:0 */ - url = url.replace('$' + i, function () { - return match[i]; - }); - } - - data.source1 = url; - data.type = pattern.type; - data.allowFullscreen = pattern.allowFullscreen; - data.width = data.width || pattern.w; - data.height = data.height || pattern.h; - } - }); - - if (data.embed) { - html = UpdateHtml.updateHtml(data.embed, data, true); - } else { - var videoScript = VideoScript.getVideoScriptMatch(editor.settings.media_scripts, data.source1); - if (videoScript) { - data.type = 'script'; - data.width = videoScript.width; - data.height = videoScript.height; - } - - data.width = data.width || 300; - data.height = data.height || 150; - - Tools.each(data, function (value, key) { - data[key] = editor.dom.encode(value); - }); - - if (data.type === "iframe") { - var allowFullscreen = data.allowFullscreen ? ' allowFullscreen="1"' : ''; - html += - ''; - } else if (data.source1mime === "application/x-shockwave-flash") { - html += - ''; - - if (data.poster) { - html += ''; - } - - html += ''; - } else if (data.source1mime.indexOf('audio') !== -1) { - if (editor.settings.audio_template_callback) { - html = editor.settings.audio_template_callback(data); - } else { - html += ( - '' - ); - } - } else if (data.type === "script") { - html += ''; - } else { - if (editor.settings.video_template_callback) { - html = editor.settings.video_template_callback(data); - } else { - html = ( - '' - ); - } - } - } - - return html; - }; - - return { - dataToHtml: dataToHtml - }; -}); -defineGlobal("global!tinymce.util.Promise", tinymce.util.Promise); -define('tinymce.media.core.Service', [ - 'tinymce.media.core.DataToHtml', - 'global!tinymce.util.Promise' -], function (DataToHtml, Promise) { - - var embedPromise = function (data, dataToHtml, handler) { - var cache = {}; - return new Promise(function (res, rej) { - var wrappedResolve = function (response) { - if (response.html) { - cache[data.source1] = response; - } - return res({ - url: data.source1, - html: response.html ? response.html : dataToHtml(data) - }); - }; - if (cache[data.source1]) { - wrappedResolve(cache[data.source1]); - } else { - handler({url: data.source1}, wrappedResolve, rej); - } - }); - }; - - var defaultPromise = function (data, dataToHtml) { - return new Promise(function (res) { - res({html: dataToHtml(data), url: data.source1}); - }); - }; - - var loadedData = function (editor) { - return function (data) { - return DataToHtml.dataToHtml(editor, data); - }; - }; - - var getEmbedHtml = function (editor, data) { - var embedHandler = editor.settings.media_url_resolver; - - return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor)); - }; - - return { - getEmbedHtml: getEmbedHtml - }; -}); -defineGlobal("global!tinymce.Env", tinymce.Env); -define('tinymce.media.ui.SizeManager', [ -], function () { - var doSyncSize = function (widthCtrl, heightCtrl) { - widthCtrl.state.set('oldVal', widthCtrl.value()); - heightCtrl.state.set('oldVal', heightCtrl.value()); - }; - var doSizeControls = function (win, f) { - var widthCtrl = win.find('#width')[0]; - var heightCtrl = win.find('#height')[0]; - var constrained = win.find('#constrain')[0]; - if (widthCtrl && heightCtrl && constrained) { - f(widthCtrl, heightCtrl, constrained.checked()); - } - }; - - var doUpdateSize = function (widthCtrl, heightCtrl, isContrained) { - var oldWidth = widthCtrl.state.get('oldVal'); - var oldHeight = heightCtrl.state.get('oldVal'); - var newWidth = widthCtrl.value(); - var newHeight = heightCtrl.value(); - - if (isContrained && oldWidth && oldHeight && newWidth && newHeight) { - if (newWidth !== oldWidth) { - newHeight = Math.round((newWidth / oldWidth) * newHeight); - - if (!isNaN(newHeight)) { - heightCtrl.value(newHeight); - } - } else { - newWidth = Math.round((newHeight / oldHeight) * newWidth); - - if (!isNaN(newWidth)) { - widthCtrl.value(newWidth); - } - } - } - - doSyncSize(widthCtrl, heightCtrl); - }; - - var syncSize = function (win) { - doSizeControls(win, doSyncSize); - }; - - var updateSize = function (win) { - doSizeControls(win, doUpdateSize); - }; - - var createUi = function (onChange) { - var recalcSize = function () { - onChange(function (win) { - updateSize(win); - }); - }; - - return { - type: 'container', - label: 'Dimensions', - layout: 'flex', - align: 'center', - spacing: 5, - items: [ - { - name: 'width', type: 'textbox', maxLength: 5, size: 5, - onchange: recalcSize, ariaLabel: 'Width' - }, - {type: 'label', text: 'x'}, - { - name: 'height', type: 'textbox', maxLength: 5, size: 5, - onchange: recalcSize, ariaLabel: 'Height' - }, - {name: 'constrain', type: 'checkbox', checked: true, text: 'Constrain proportions'} - ] - }; - }; - - return { - createUi: createUi, - syncSize: syncSize, - updateSize: updateSize - }; -}); -define('tinymce.media.ui.Dialog', [ - 'global!tinymce.util.Delay', - 'tinymce.media.core.HtmlToData', - 'tinymce.media.core.UpdateHtml', - 'tinymce.media.core.Service', - 'tinymce.media.core.Size', - 'global!tinymce.util.Tools', - 'global!tinymce.Env', - 'tinymce.media.ui.SizeManager' -], function (Delay, HtmlToData, UpdateHtml, Service, Size, Tools, Env, SizeManager) { - var embedChange = (Env.ie && Env.ie <= 8) ? 'onChange' : 'onInput'; - - var handleError = function (editor) { - return function (error) { - var errorMessage = error && error.msg ? - 'Media embed handler error: ' + error.msg : - 'Media embed handler threw unknown error.'; - editor.notificationManager.open({type: 'error', text: errorMessage}); - }; - }; - - var getData = function (editor) { - var element = editor.selection.getNode(); - var dataEmbed = element.getAttribute('data-ephox-embed-iri'); - - if (dataEmbed) { - return { - source1: dataEmbed, - 'data-ephox-embed-iri': dataEmbed, - width: Size.getMaxWidth(element), - height: Size.getMaxHeight(element) - }; - } - - return element.getAttribute('data-mce-object') ? - HtmlToData.htmlToData(editor.settings.media_scripts, editor.serializer.serialize(element, {selection: true})) : - {}; - }; - - var getSource = function (editor) { - var elm = editor.selection.getNode(); - - if (elm.getAttribute('data-mce-object') || elm.getAttribute('data-ephox-embed-iri')) { - return editor.selection.getContent(); - } - }; - - var addEmbedHtml = function (win, editor) { - return function (response) { - var html = response.html; - var embed = win.find('#embed')[0]; - var data = Tools.extend(HtmlToData.htmlToData(editor.settings.media_scripts, html), {source1: response.url}); - win.fromJSON(data); - - if (embed) { - embed.value(html); - SizeManager.updateSize(win); - } - }; - }; - - var selectPlaceholder = function (editor, beforeObjects) { - var i; - var y; - var afterObjects = editor.dom.select('img[data-mce-object]'); - - // Find new image placeholder so we can select it - for (i = 0; i < beforeObjects.length; i++) { - for (y = afterObjects.length - 1; y >= 0; y--) { - if (beforeObjects[i] === afterObjects[y]) { - afterObjects.splice(y, 1); - } - } - } - - editor.selection.select(afterObjects[0]); - }; - - var handleInsert = function (editor, html) { - var beforeObjects = editor.dom.select('img[data-mce-object]'); - - editor.insertContent(html); - selectPlaceholder(editor, beforeObjects); - editor.nodeChanged(); - }; - - var submitForm = function (win, editor) { - var data = win.toJSON(); - - data.embed = UpdateHtml.updateHtml(data.embed, data); - - if (data.embed) { - handleInsert(editor, data.embed); - } else { - Service.getEmbedHtml(editor, data) - .then(function (response) { - handleInsert(editor, response.html); - })["catch"](handleError(editor)); - } - }; - - var populateMeta = function (win, meta) { - Tools.each(meta, function (value, key) { - win.find('#' + key).value(value); - }); - }; - - var showDialog = function (editor) { - var win; - var data; - - var generalFormItems = [ - { - name: 'source1', - type: 'filepicker', - filetype: 'media', - size: 40, - autofocus: true, - label: 'Source', - onpaste: function () { - setTimeout(function () { - Service.getEmbedHtml(editor, win.toJSON()) - .then( - addEmbedHtml(win, editor) - )["catch"](handleError(editor)); - }, 1); - }, - onchange: function (e) { - Service.getEmbedHtml(editor, win.toJSON()) - .then( - addEmbedHtml(win, editor) - )["catch"](handleError(editor)); - - populateMeta(win, e.meta); - }, - onbeforecall: function (e) { - e.meta = win.toJSON(); - } - } - ]; - - var advancedFormItems = []; - - var reserialise = function (update) { - update(win); - data = win.toJSON(); - win.find('#embed').value(UpdateHtml.updateHtml(data.embed, data)); - }; - - if (editor.settings.media_alt_source !== false) { - advancedFormItems.push({name: 'source2', type: 'filepicker', filetype: 'media', size: 40, label: 'Alternative source'}); - } - - if (editor.settings.media_poster !== false) { - advancedFormItems.push({name: 'poster', type: 'filepicker', filetype: 'image', size: 40, label: 'Poster'}); - } - - if (editor.settings.media_dimensions !== false) { - var control = SizeManager.createUi(reserialise); - generalFormItems.push(control); - } - - data = getData(editor); - - var embedTextBox = { - id: 'mcemediasource', - type: 'textbox', - flex: 1, - name: 'embed', - value: getSource(editor), - multiline: true, - rows: 5, - label: 'Source' - }; - - var updateValueOnChange = function () { - data = Tools.extend({}, HtmlToData.htmlToData(editor.settings.media_scripts, this.value())); - this.parent().parent().fromJSON(data); - }; - - embedTextBox[embedChange] = updateValueOnChange; - - win = editor.windowManager.open({ - title: 'Insert/edit media', - data: data, - bodyType: 'tabpanel', - body: [ - { - title: 'General', - type: "form", - items: generalFormItems - }, - - { - title: 'Embed', - type: "container", - layout: 'flex', - direction: 'column', - align: 'stretch', - padding: 10, - spacing: 10, - items: [ - { - type: 'label', - text: 'Paste your embed code below:', - forId: 'mcemediasource' - }, - embedTextBox - ] - }, - - { - title: 'Advanced', - type: "form", - items: advancedFormItems - } - ], - onSubmit: function () { - SizeManager.updateSize(win); - submitForm(win, editor); - } - }); - - SizeManager.syncSize(win); - }; - - return { - showDialog: showDialog - }; -}); -define('tinymce.media.core.Sanitize', [ - 'global!tinymce.util.Tools', - 'global!tinymce.html.Writer', - 'global!tinymce.html.SaxParser', - 'global!tinymce.html.Schema' -], function (Tools, Writer, SaxParser, Schema) { - var sanitize = function (editor, html) { - if (editor.settings.media_filter_html === false) { - return html; - } - - var writer = new Writer(); - var blocked; - - new SaxParser({ - validate: false, - allow_conditional_comments: false, - special: 'script,noscript', - - comment: function (text) { - writer.comment(text); - }, - - cdata: function (text) { - writer.cdata(text); - }, - - text: function (text, raw) { - writer.text(text, raw); - }, - - start: function (name, attrs, empty) { - blocked = true; - - if (name === 'script' || name === 'noscript') { - return; - } - - for (var i = 0; i < attrs.length; i++) { - if (attrs[i].name.indexOf('on') === 0) { - return; - } - - if (attrs[i].name === 'style') { - attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name); - } - } - - writer.start(name, attrs, empty); - blocked = false; - }, - - end: function (name) { - if (blocked) { - return; - } - - writer.end(name); - } - }, new Schema({})).parse(html); - - return writer.getContent(); - }; - - return { - sanitize: sanitize - }; -}); -defineGlobal("global!tinymce.html.Node", tinymce.html.Node); -define('tinymce.media.core.Nodes', [ - 'tinymce.media.core.Sanitize', - 'tinymce.media.core.VideoScript', - 'global!tinymce.html.Node', - 'global!tinymce.Env' -], function (Sanitize, VideoScript, Node, Env) { - var createPlaceholderNode = function (editor, node) { - var placeHolder; - var name = node.name; - - placeHolder = new Node('img', 1); - placeHolder.shortEnded = true; - - retainAttributesAndInnerHtml(editor, node, placeHolder); - - placeHolder.attr({ - width: node.attr('width') || "300", - height: node.attr('height') || (name === "audio" ? "30" : "150"), - style: node.attr('style'), - src: Env.transparentSrc, - "data-mce-object": name, - "class": "mce-object mce-object-" + name - }); - - return placeHolder; - }; - - var createPreviewIframeNode = function (editor, node) { - var previewWrapper; - var previewNode; - var shimNode; - var name = node.name; - - previewWrapper = new Node('span', 1); - previewWrapper.attr({ - contentEditable: 'false', - style: node.attr('style'), - "data-mce-object": name, - "class": "mce-preview-object mce-object-" + name - }); - - retainAttributesAndInnerHtml(editor, node, previewWrapper); - - previewNode = new Node(name, 1); - previewNode.attr({ - src: node.attr('src'), - allowfullscreen: node.attr('allowfullscreen'), - width: node.attr('width') || "300", - height: node.attr('height') || (name === "audio" ? "30" : "150"), - frameborder: '0' - }); - - shimNode = new Node('span', 1); - shimNode.attr('class', 'mce-shim'); - - previewWrapper.append(previewNode); - previewWrapper.append(shimNode); - - return previewWrapper; - }; - - var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) { - var attrName; - var attrValue; - var attribs; - var ai; - var innerHtml; - - // Prefix all attributes except width, height and style since we - // will add these to the placeholder - attribs = sourceNode.attributes; - ai = attribs.length; - while (ai--) { - attrName = attribs[ai].name; - attrValue = attribs[ai].value; - - if (attrName !== "width" && attrName !== "height" && attrName !== "style") { - if (attrName === "data" || attrName === "src") { - attrValue = editor.convertURL(attrValue, attrName); - } - - targetNode.attr('data-mce-p-' + attrName, attrValue); - } - } - - // Place the inner HTML contents inside an escaped attribute - // This enables us to copy/paste the fake object - innerHtml = sourceNode.firstChild && sourceNode.firstChild.value; - if (innerHtml) { - targetNode.attr("data-mce-html", escape(Sanitize.sanitize(editor, innerHtml))); - targetNode.firstChild = null; - } - }; - - var isWithinEphoxEmbed = function (node) { - while ((node = node.parent)) { - if (node.attr('data-ephox-embed-iri')) { - return true; - } - } - - return false; - }; - - var placeHolderConverter = function (editor) { - return function (nodes) { - var i = nodes.length; - var node; - var videoScript; - - while (i--) { - node = nodes[i]; - if (!node.parent) { - continue; - } - - if (node.parent.attr('data-mce-object')) { - continue; - } - - if (node.name === 'script') { - videoScript = VideoScript.getVideoScriptMatch(editor.settings.media_scripts, node.attr('src')); - if (!videoScript) { - continue; - } - } - - if (videoScript) { - if (videoScript.width) { - node.attr('width', videoScript.width.toString()); - } - - if (videoScript.height) { - node.attr('height', videoScript.height.toString()); - } - } - - if (node.name === 'iframe' && editor.settings.media_live_embeds !== false && Env.ceFalse) { - if (!isWithinEphoxEmbed(node)) { - node.replace(createPreviewIframeNode(editor, node)); - } - } else { - if (!isWithinEphoxEmbed(node)) { - node.replace(createPlaceholderNode(editor, node)); - } - } - } - }; - }; - - return { - createPreviewIframeNode: createPreviewIframeNode, - createPlaceholderNode: createPlaceholderNode, - placeHolderConverter: placeHolderConverter - }; -}); -/** - * plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/*jshint maxlen:255 */ -/*eslint max-len:0 */ -/*global tinymce:true */ - -define('tinymce.media.Plugin', [ - 'global!tinymce.PluginManager', - 'tinymce.media.ui.Dialog', - 'tinymce.media.core.Sanitize', - 'tinymce.media.core.UpdateHtml', - 'tinymce.media.core.Nodes' -], function (PluginManager, Dialog, Sanitize, UpdateHtml, Nodes) { - var Plugin = function (editor) { - editor.on('ResolveName', function (e) { - var name; - - if (e.target.nodeType === 1 && (name = e.target.getAttribute("data-mce-object"))) { - e.name = name; - } - }); - - editor.on('preInit', function () { - // Make sure that any messy HTML is retained inside these - var specialElements = editor.schema.getSpecialElements(); - tinymce.each('video audio iframe object'.split(' '), function (name) { - specialElements[name] = new RegExp('<\/' + name + '[^>]*>', 'gi'); - }); - - // Allow elements - //editor.schema.addValidElements('object[id|style|width|height|classid|codebase|*],embed[id|style|width|height|type|src|*],video[*],audio[*]'); - - // Set allowFullscreen attribs as boolean - var boolAttrs = editor.schema.getBoolAttrs(); - tinymce.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) { - boolAttrs[name] = {}; - }); - - // Converts iframe, video etc into placeholder images - editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', - Nodes.placeHolderConverter(editor)); - - // Replaces placeholder images with real elements for video, object, iframe etc - editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) { - var i = nodes.length; - var node; - var realElm; - var ai; - var attribs; - var innerHtml; - var innerNode; - var realElmName; - var className; - - while (i--) { - node = nodes[i]; - if (!node.parent) { - continue; - } - - realElmName = node.attr(name); - realElm = new tinymce.html.Node(realElmName, 1); - - // Add width/height to everything but audio - if (realElmName !== "audio" && realElmName !== "script") { - className = node.attr('class'); - if (className && className.indexOf('mce-preview-object') !== -1) { - realElm.attr({ - width: node.firstChild.attr('width'), - height: node.firstChild.attr('height') - }); - } else { - realElm.attr({ - width: node.attr('width'), - height: node.attr('height') - }); - } - } - - realElm.attr({ - style: node.attr('style') - }); - - // Unprefix all placeholder attributes - attribs = node.attributes; - ai = attribs.length; - while (ai--) { - var attrName = attribs[ai].name; - - if (attrName.indexOf('data-mce-p-') === 0) { - realElm.attr(attrName.substr(11), attribs[ai].value); - } - } - - if (realElmName === "script") { - realElm.attr('type', 'text/javascript'); - } - - // Inject innerhtml - innerHtml = node.attr('data-mce-html'); - if (innerHtml) { - innerNode = new tinymce.html.Node('#text', 3); - innerNode.raw = true; - innerNode.value = Sanitize.sanitize(editor, unescape(innerHtml)); - realElm.append(innerNode); - } - - node.replace(realElm); - } - }); - }); - - editor.on('click keyup', function () { - var selectedNode = editor.selection.getNode(); - - if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) { - if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) { - selectedNode.setAttribute('data-mce-selected', '2'); - } - } - }); - - editor.on('ObjectSelected', function (e) { - var objectType = e.target.getAttribute('data-mce-object'); - - if (objectType === "audio" || objectType === "script") { - e.preventDefault(); - } - }); - - editor.on('objectResized', function (e) { - var target = e.target; - var html; - - if (target.getAttribute('data-mce-object')) { - html = target.getAttribute('data-mce-html'); - if (html) { - html = unescape(html); - target.setAttribute('data-mce-html', escape( - UpdateHtml.updateHtml(html, { - width: e.width, - height: e.height - }) - )); - } - } - }); - - this.showDialog = function () { - Dialog.showDialog(editor); - }; - - editor.addButton('media', { - tooltip: 'Insert/edit media', - onclick: this.showDialog, - stateSelector: ['img[data-mce-object]', 'span[data-mce-object]', 'div[data-ephox-embed-iri]'] - }); - - editor.addMenuItem('media', { - icon: 'media', - text: 'Media', - onclick: this.showDialog, - context: 'insert', - prependToContext: true - }); - - editor.on('setContent', function () { - // TODO: This shouldn't be needed there should be a way to mark bogus - // elements so they are never removed except external save - editor.$('span.mce-preview-object').each(function (index, elm) { - var $elm = editor.$(elm); - - if ($elm.find('span.mce-shim', elm).length === 0) { - $elm.append(''); - } - }); - }); - - editor.addCommand('mceMedia', this.showDialog); - }; - - PluginManager.add('media', Plugin); - - return function () {}; -}); - - -dem('tinymce.media.Plugin')(); -})(); diff --git a/wp/wp-includes/js/tinymce/plugins/media/plugin.min.js b/wp/wp-includes/js/tinymce/plugins/media/plugin.min.js deleted file mode 100644 index 1cd0f09f..00000000 --- a/wp/wp-includes/js/tinymce/plugins/media/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(){var e={},t=function(t){for(var n=e[t],i=n.deps,o=n.defn,a=i.length,s=new Array(a),l=0;l"}else"application/x-shockwave-flash"===u.source1mime?(l+='',u.poster&&(l+=''),l+=""):u.source1mime.indexOf("audio")!==-1?a.settings.audio_template_callback?l=a.settings.audio_template_callback(u):l+='":"script"===u.type?l+='':l=a.settings.video_template_callback?a.settings.video_template_callback(u):'"}return l};return{dataToHtml:a}}),s("k",tinymce.util.Promise),a("d",["j","k"],function(e,t){var n=function(e,n,r){var i={};return new t(function(t,o){var a=function(r){return r.html&&(i[e.source1]=r),t({url:e.source1,html:r.html?r.html:n(e)})};i[e.source1]?a(i[e.source1]):r({url:e.source1},a,o)})},r=function(e,n){return new t(function(t){t({html:n(e),url:e.source1})})},i=function(t){return function(n){return e.dataToHtml(t,n)}},o=function(e,t){var o=e.settings.media_url_resolver;return o?n(t,i(e),o):r(t,i(e))};return{getEmbedHtml:o}}),s("f",tinymce.Env),a("g",[],function(){var e=function(e,t){e.state.set("oldVal",e.value()),t.state.set("oldVal",t.value())},t=function(e,t){var n=e.find("#width")[0],r=e.find("#height")[0],i=e.find("#constrain")[0];n&&r&&i&&t(n,r,i.checked())},n=function(t,n,r){var i=t.state.get("oldVal"),o=n.state.get("oldVal"),a=t.value(),s=n.value();r&&i&&o&&a&&s&&(a!==i?(s=Math.round(a/i*s),isNaN(s)||n.value(s)):(a=Math.round(s/o*a),isNaN(a)||t.value(a))),e(t,n)},r=function(n){t(n,e)},i=function(e){t(e,n)},o=function(e){var t=function(){e(function(e){i(e)})};return{type:"container",label:"Dimensions",layout:"flex",align:"center",spacing:5,items:[{name:"width",type:"textbox",maxLength:5,size:5,onchange:t,ariaLabel:"Width"},{type:"label",text:"x"},{name:"height",type:"textbox",maxLength:5,size:5,onchange:t,ariaLabel:"Height"},{name:"constrain",type:"checkbox",checked:!0,text:"Constrain proportions"}]}};return{createUi:o,syncSize:r,updateSize:i}}),a("2",["6","7","4","d","c","e","f","g"],function(e,t,n,r,i,o,a,s){var l=a.ie&&a.ie<=8?"onChange":"onInput",u=function(e){return function(t){var n=t&&t.msg?"Media embed handler error: "+t.msg:"Media embed handler threw unknown error.";e.notificationManager.open({type:"error",text:n})}},c=function(e){var n=e.selection.getNode(),r=n.getAttribute("data-ephox-embed-iri");return r?{source1:r,"data-ephox-embed-iri":r,width:i.getMaxWidth(n),height:i.getMaxHeight(n)}:n.getAttribute("data-mce-object")?t.htmlToData(e.settings.media_scripts,e.serializer.serialize(n,{selection:!0})):{}},d=function(e){var t=e.selection.getNode();if(t.getAttribute("data-mce-object")||t.getAttribute("data-ephox-embed-iri"))return e.selection.getContent()},f=function(e,n){return function(r){var i=r.html,a=e.find("#embed")[0],l=o.extend(t.htmlToData(n.settings.media_scripts,i),{source1:r.url});e.fromJSON(l),a&&(a.value(i),s.updateSize(e))}},p=function(e,t){var n,r,i=e.dom.select("img[data-mce-object]");for(n=0;n=0;r--)t[n]===i[r]&&i.splice(r,1);e.selection.select(i[0])},h=function(e,t){var n=e.dom.select("img[data-mce-object]");e.insertContent(t),p(e,n),e.nodeChanged()},m=function(e,t){var i=e.toJSON();i.embed=n.updateHtml(i.embed,i),i.embed?h(t,i.embed):r.getEmbedHtml(t,i).then(function(e){h(t,e.html)})["catch"](u(t))},g=function(e,t){o.each(t,function(t,n){e.find("#"+n).value(t)})},v=function(e){var i,a,p=[{name:"source1",type:"filepicker",filetype:"media",size:40,autofocus:!0,label:"Source",onpaste:function(){setTimeout(function(){r.getEmbedHtml(e,i.toJSON()).then(f(i,e))["catch"](u(e))},1)},onchange:function(t){r.getEmbedHtml(e,i.toJSON()).then(f(i,e))["catch"](u(e)),g(i,t.meta)},onbeforecall:function(e){e.meta=i.toJSON()}}],h=[],v=function(e){e(i),a=i.toJSON(),i.find("#embed").value(n.updateHtml(a.embed,a))};if(e.settings.media_alt_source!==!1&&h.push({name:"source2",type:"filepicker",filetype:"media",size:40,label:"Alternative source"}),e.settings.media_poster!==!1&&h.push({name:"poster",type:"filepicker",filetype:"image",size:40,label:"Poster"}),e.settings.media_dimensions!==!1){var y=s.createUi(v);p.push(y)}a=c(e);var b={id:"mcemediasource",type:"textbox",flex:1,name:"embed",value:d(e),multiline:!0,rows:5,label:"Source"},C=function(){a=o.extend({},t.htmlToData(e.settings.media_scripts,this.value())),this.parent().parent().fromJSON(a)};b[l]=C,i=e.windowManager.open({title:"Insert/edit media",data:a,bodyType:"tabpanel",body:[{title:"General",type:"form",items:p},{title:"Embed",type:"container",layout:"flex",direction:"column",align:"stretch",padding:10,spacing:10,items:[{type:"label",text:"Paste your embed code below:",forId:"mcemediasource"},b]},{title:"Advanced",type:"form",items:h}],onSubmit:function(){s.updateSize(i),m(i,e)}}),s.syncSize(i)};return{showDialog:v}}),a("3",["e","8","9","a"],function(e,t,n,r){var i=function(e,i){if(e.settings.media_filter_html===!1)return i;var o,a=new t;return new n({validate:!1,allow_conditional_comments:!1,special:"script,noscript",comment:function(e){a.comment(e)},cdata:function(e){a.cdata(e)},text:function(e,t){a.text(e,t)},start:function(t,n,r){if(o=!0,"script"!==t&&"noscript"!==t){for(var i=0;i]*>","gi")});var r=e.schema.getBoolAttrs();tinymce.each("webkitallowfullscreen mozallowfullscreen allowfullscreen".split(" "),function(e){r[e]={}}),e.parser.addNodeFilter("iframe,video,audio,object,embed,script",i.placeHolderConverter(e)),e.serializer.addAttributeFilter("data-mce-object",function(t,r){for(var i,o,a,s,l,u,c,d,f=t.length;f--;)if(i=t[f],i.parent){for(c=i.attr(r),o=new tinymce.html.Node(c,1),"audio"!==c&&"script"!==c&&(d=i.attr("class"),d&&d.indexOf("mce-preview-object")!==-1?o.attr({width:i.firstChild.attr("width"),height:i.firstChild.attr("height")}):o.attr({width:i.attr("width"),height:i.attr("height")})),o.attr({style:i.attr("style")}),s=i.attributes,a=s.length;a--;){var p=s[a].name;0===p.indexOf("data-mce-p-")&&o.attr(p.substr(11),s[a].value)}"script"===c&&o.attr("type","text/javascript"),l=i.attr("data-mce-html"),l&&(u=new tinymce.html.Node("#text",3),u.raw=!0,u.value=n.sanitize(e,unescape(l)),o.append(u)),i.replace(o)}})}),e.on("click keyup",function(){var t=e.selection.getNode();t&&e.dom.hasClass(t,"mce-preview-object")&&e.dom.getAttrib(t,"data-mce-selected")&&t.setAttribute("data-mce-selected","2")}),e.on("ObjectSelected",function(e){var t=e.target.getAttribute("data-mce-object");"audio"!==t&&"script"!==t||e.preventDefault()}),e.on("objectResized",function(e){var t,n=e.target;n.getAttribute("data-mce-object")&&(t=n.getAttribute("data-mce-html"),t&&(t=unescape(t),n.setAttribute("data-mce-html",escape(r.updateHtml(t,{width:e.width,height:e.height})))))}),this.showDialog=function(){t.showDialog(e)},e.addButton("media",{tooltip:"Insert/edit media",onclick:this.showDialog,stateSelector:["img[data-mce-object]","span[data-mce-object]","div[data-ephox-embed-iri]"]}),e.addMenuItem("media",{icon:"media",text:"Media",onclick:this.showDialog,context:"insert",prependToContext:!0}),e.on("setContent",function(){e.$("span.mce-preview-object").each(function(t,n){var r=e.$(n);0===r.find("span.mce-shim",n).length&&r.append('')})}),e.addCommand("mceMedia",this.showDialog)};return e.add("media",o),function(){}}),r("0")()}(); \ No newline at end of file diff --git a/wp/wp-includes/js/tinymce/plugins/paste/plugin.js b/wp/wp-includes/js/tinymce/plugins/paste/plugin.js deleted file mode 100644 index 10b1dd38..00000000 --- a/wp/wp-includes/js/tinymce/plugins/paste/plugin.js +++ /dev/null @@ -1,1869 +0,0 @@ -/** - * Compiled inline version. (Library mode) - */ - -/*jshint smarttabs:true, undef:true, latedef:true, curly:true, bitwise:true, camelcase:true */ -/*globals $code */ - -(function(exports, undefined) { - "use strict"; - - var modules = {}; - - function require(ids, callback) { - var module, defs = []; - - for (var i = 0; i < ids.length; ++i) { - module = modules[ids[i]] || resolve(ids[i]); - if (!module) { - throw 'module definition dependecy not found: ' + ids[i]; - } - - defs.push(module); - } - - callback.apply(null, defs); - } - - function define(id, dependencies, definition) { - if (typeof id !== 'string') { - throw 'invalid module definition, module id must be defined and be a string'; - } - - if (dependencies === undefined) { - throw 'invalid module definition, dependencies must be specified'; - } - - if (definition === undefined) { - throw 'invalid module definition, definition function must be specified'; - } - - require(dependencies, function() { - modules[id] = definition.apply(null, arguments); - }); - } - - function defined(id) { - return !!modules[id]; - } - - function resolve(id) { - var target = exports; - var fragments = id.split(/[.\/]/); - - for (var fi = 0; fi < fragments.length; ++fi) { - if (!target[fragments[fi]]) { - return; - } - - target = target[fragments[fi]]; - } - - return target; - } - - function expose(ids) { - var i, target, id, fragments, privateModules; - - for (i = 0; i < ids.length; i++) { - target = exports; - id = ids[i]; - fragments = id.split(/[.\/]/); - - for (var fi = 0; fi < fragments.length - 1; ++fi) { - if (target[fragments[fi]] === undefined) { - target[fragments[fi]] = {}; - } - - target = target[fragments[fi]]; - } - - target[fragments[fragments.length - 1]] = modules[id]; - } - - // Expose private modules for unit tests - if (exports.AMDLC_TESTS) { - privateModules = exports.privateModules || {}; - - for (id in modules) { - privateModules[id] = modules[id]; - } - - for (i = 0; i < ids.length; i++) { - delete privateModules[ids[i]]; - } - - exports.privateModules = privateModules; - } - } - -// Included from: js/tinymce/plugins/paste/classes/Utils.js - -/** - * Utils.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class contails various utility functions for the paste plugin. - * - * @class tinymce.pasteplugin.Utils - */ -define("tinymce/pasteplugin/Utils", [ - "tinymce/util/Tools", - "tinymce/html/DomParser", - "tinymce/html/Schema" -], function(Tools, DomParser, Schema) { - function filter(content, items) { - Tools.each(items, function(v) { - if (v.constructor == RegExp) { - content = content.replace(v, ''); - } else { - content = content.replace(v[0], v[1]); - } - }); - - return content; - } - - /** - * Gets the innerText of the specified element. It will handle edge cases - * and works better than textContent on Gecko. - * - * @param {String} html HTML string to get text from. - * @return {String} String of text with line feeds. - */ - function innerText(html) { - var schema = new Schema(), domParser = new DomParser({}, schema), text = ''; - var shortEndedElements = schema.getShortEndedElements(); - var ignoreElements = Tools.makeMap('script noscript style textarea video audio iframe object', ' '); - var blockElements = schema.getBlockElements(); - - function walk(node) { - var name = node.name, currentNode = node; - - if (name === 'br') { - text += '\n'; - return; - } - - // img/input/hr - if (shortEndedElements[name]) { - text += ' '; - } - - // Ingore script, video contents - if (ignoreElements[name]) { - text += ' '; - return; - } - - if (node.type == 3) { - text += node.value; - } - - // Walk all children - if (!node.shortEnded) { - if ((node = node.firstChild)) { - do { - walk(node); - } while ((node = node.next)); - } - } - - // Add \n or \n\n for blocks or P - if (blockElements[name] && currentNode.next) { - text += '\n'; - - if (name == 'p') { - text += '\n'; - } - } - } - - html = filter(html, [ - //g // Conditional comments - ]); - - walk(domParser.parse(html)); - - return text; - } - - /** - * Trims the specified HTML by removing all WebKit fragments, all elements wrapping the body trailing BR elements etc. - * - * @param {String} html Html string to trim contents on. - * @return {String} Html contents that got trimmed. - */ - function trimHtml(html) { - function trimSpaces(all, s1, s2) { - // WebKit   meant to preserve multiple spaces but instead inserted around all inline tags, - // including the spans with inline styles created on paste - if (!s1 && !s2) { - return ' '; - } - - return '\u00a0'; - } - - html = filter(html, [ - /^[\s\S]*]*>\s*|\s*<\/body[^>]*>[\s\S]*$/g, // Remove anything but the contents within the BODY element - /|/g, // Inner fragments (tables from excel on mac) - [/( ?)\u00a0<\/span>( ?)/g, trimSpaces], - /
      /g, - /
      $/i // Trailing BR elements - ]); - - return html; - } - - // TODO: Should be in some global class - function createIdGenerator(prefix) { - var count = 0; - - return function() { - return prefix + (count++); - }; - } - - return { - filter: filter, - innerText: innerText, - trimHtml: trimHtml, - createIdGenerator: createIdGenerator - }; -}); - -// Included from: js/tinymce/plugins/paste/classes/SmartPaste.js - -/** - * SmartPaste.js - * - * Released under LGPL License. - * Copyright (c) 1999-2016 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * Tries to be smart depending on what the user pastes if it looks like an url - * it will make a link out of the current selection. If it's an image url that looks - * like an image it will check if it's an image and insert it as an image. - * - * @class tinymce.pasteplugin.SmartPaste - * @private - */ -define("tinymce/pasteplugin/SmartPaste", [ - "tinymce/util/Tools" -], function (Tools) { - var isAbsoluteUrl = function (url) { - return /^https?:\/\/[\w\?\-\/+=.&%@~#]+$/i.test(url); - }; - - var isImageUrl = function (url) { - return isAbsoluteUrl(url) && /.(gif|jpe?g|png)$/.test(url); - }; - - var createImage = function (editor, url, pasteHtml) { - editor.undoManager.extra(function () { - pasteHtml(editor, url); - }, function () { - editor.insertContent(''); - }); - - return true; - }; - - var createLink = function (editor, url, pasteHtml) { - editor.undoManager.extra(function () { - pasteHtml(editor, url); - }, function () { - editor.execCommand('mceInsertLink', false, url); - }); - - return true; - }; - - var linkSelection = function (editor, html, pasteHtml) { - return editor.selection.isCollapsed() === false && isAbsoluteUrl(html) ? createLink(editor, html, pasteHtml) : false; - }; - - var insertImage = function (editor, html, pasteHtml) { - return isImageUrl(html) ? createImage(editor, html, pasteHtml) : false; - }; - - var pasteHtml = function (editor, html) { - editor.insertContent(html, { - merge: editor.settings.paste_merge_formats !== false, - paste: true - }); - - return true; - }; - - var smartInsertContent = function (editor, html) { - Tools.each([ - linkSelection, - insertImage, - pasteHtml - ], function (action) { - return action(editor, html, pasteHtml) !== true; - }); - }; - - var insertContent = function (editor, html) { - if (editor.settings.smart_paste === false) { - pasteHtml(editor, html); - } else { - smartInsertContent(editor, html); - } - }; - - return { - isImageUrl: isImageUrl, - isAbsoluteUrl: isAbsoluteUrl, - insertContent: insertContent - }; -}); - -// Included from: js/tinymce/plugins/paste/classes/Clipboard.js - -/** - * Clipboard.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class contains logic for getting HTML contents out of the clipboard. - * - * We need to make a lot of ugly hacks to get the contents out of the clipboard since - * the W3C Clipboard API is broken in all browsers that have it: Gecko/WebKit/Blink. - * We might rewrite this the way those API:s stabilize. Browsers doesn't handle pasting - * from applications like Word the same way as it does when pasting into a contentEditable area - * so we need to do lots of extra work to try to get to this clipboard data. - * - * Current implementation steps: - * 1. On keydown with paste keys Ctrl+V or Shift+Insert create - * a paste bin element and move focus to that element. - * 2. Wait for the browser to fire a "paste" event and get the contents out of the paste bin. - * 3. Check if the paste was successful if true, process the HTML. - * (4). If the paste was unsuccessful use IE execCommand, Clipboard API, document.dataTransfer old WebKit API etc. - * - * @class tinymce.pasteplugin.Clipboard - * @private - */ -define("tinymce/pasteplugin/Clipboard", [ - "tinymce/Env", - "tinymce/dom/RangeUtils", - "tinymce/util/VK", - "tinymce/pasteplugin/Utils", - "tinymce/pasteplugin/SmartPaste", - "tinymce/util/Delay" -], function(Env, RangeUtils, VK, Utils, SmartPaste, Delay) { - return function(editor) { - var self = this, pasteBinElm, lastRng, keyboardPasteTimeStamp = 0, draggingInternally = false; - var pasteBinDefaultContent = '%MCEPASTEBIN%', keyboardPastePlainTextState; - var mceInternalUrlPrefix = 'data:text/mce-internal,'; - var uniqueId = Utils.createIdGenerator("mceclip"); - - /** - * Pastes the specified HTML. This means that the HTML is filtered and then - * inserted at the current selection in the editor. It will also fire paste events - * for custom user filtering. - * - * @param {String} html HTML code to paste into the current selection. - */ - function pasteHtml(html) { - var args, dom = editor.dom; - - args = editor.fire('BeforePastePreProcess', {content: html}); // Internal event used by Quirks - args = editor.fire('PastePreProcess', args); - html = args.content; - - if (!args.isDefaultPrevented()) { - // User has bound PastePostProcess events then we need to pass it through a DOM node - // This is not ideal but we don't want to let the browser mess up the HTML for example - // some browsers add   to P tags etc - if (editor.hasEventListeners('PastePostProcess') && !args.isDefaultPrevented()) { - // We need to attach the element to the DOM so Sizzle selectors work on the contents - var tempBody = dom.add(editor.getBody(), 'div', {style: 'display:none'}, html); - args = editor.fire('PastePostProcess', {node: tempBody}); - dom.remove(tempBody); - html = args.node.innerHTML; - } - - if (!args.isDefaultPrevented()) { - SmartPaste.insertContent(editor, html); - } - } - } - - /** - * Pastes the specified text. This means that the plain text is processed - * and converted into BR and P elements. It will fire paste events for custom filtering. - * - * @param {String} text Text to paste as the current selection location. - */ - function pasteText(text) { - text = editor.dom.encode(text).replace(/\r\n/g, '\n'); - - var startBlock = editor.dom.getParent(editor.selection.getStart(), editor.dom.isBlock); - - // Create start block html for example

      - var forcedRootBlockName = editor.settings.forced_root_block; - var forcedRootBlockStartHtml; - if (forcedRootBlockName) { - forcedRootBlockStartHtml = editor.dom.createHTML(forcedRootBlockName, editor.settings.forced_root_block_attrs); - forcedRootBlockStartHtml = forcedRootBlockStartHtml.substr(0, forcedRootBlockStartHtml.length - 3) + '>'; - } - - if ((startBlock && /^(PRE|DIV)$/.test(startBlock.nodeName)) || !forcedRootBlockName) { - text = Utils.filter(text, [ - [/\n/g, "
      "] - ]); - } else { - text = Utils.filter(text, [ - [/\n\n/g, "

      " + forcedRootBlockStartHtml], - [/^(.*<\/p>)(

      )$/, forcedRootBlockStartHtml + '$1'], - [/\n/g, "
      "] - ]); - - if (text.indexOf('

      ') != -1) { - text = forcedRootBlockStartHtml + text; - } - } - - pasteHtml(text); - } - - /** - * Creates a paste bin element as close as possible to the current caret location and places the focus inside that element - * so that when the real paste event occurs the contents gets inserted into this element - * instead of the current editor selection element. - */ - function createPasteBin() { - var dom = editor.dom, body = editor.getBody(); - var viewport = editor.dom.getViewPort(editor.getWin()), scrollTop = viewport.y, top = 20; - var scrollContainer; - - lastRng = editor.selection.getRng(); - - if (editor.inline) { - scrollContainer = editor.selection.getScrollContainer(); - - // Can't always rely on scrollTop returning a useful value. - // It returns 0 if the browser doesn't support scrollTop for the element or is non-scrollable - if (scrollContainer && scrollContainer.scrollTop > 0) { - scrollTop = scrollContainer.scrollTop; - } - } - - /** - * Returns the rect of the current caret if the caret is in an empty block before a - * BR we insert a temporary invisible character that we get the rect this way we always get a proper rect. - * - * TODO: This might be useful in core. - */ - function getCaretRect(rng) { - var rects, textNode, node, container = rng.startContainer; - - rects = rng.getClientRects(); - if (rects.length) { - return rects[0]; - } - - if (!rng.collapsed || container.nodeType != 1) { - return; - } - - node = container.childNodes[lastRng.startOffset]; - - // Skip empty whitespace nodes - while (node && node.nodeType == 3 && !node.data.length) { - node = node.nextSibling; - } - - if (!node) { - return; - } - - // Check if the location is |
      - // TODO: Might need to expand this to say | - if (node.tagName == 'BR') { - textNode = dom.doc.createTextNode('\uFEFF'); - node.parentNode.insertBefore(textNode, node); - - rng = dom.createRng(); - rng.setStartBefore(textNode); - rng.setEndAfter(textNode); - - rects = rng.getClientRects(); - dom.remove(textNode); - } - - if (rects.length) { - return rects[0]; - } - } - - // Calculate top cordinate this is needed to avoid scrolling to top of document - // We want the paste bin to be as close to the caret as possible to avoid scrolling - if (lastRng.getClientRects) { - var rect = getCaretRect(lastRng); - - if (rect) { - // Client rects gets us closes to the actual - // caret location in for example a wrapped paragraph block - top = scrollTop + (rect.top - dom.getPos(body).y); - } else { - top = scrollTop; - - // Check if we can find a closer location by checking the range element - var container = lastRng.startContainer; - if (container) { - if (container.nodeType == 3 && container.parentNode != body) { - container = container.parentNode; - } - - if (container.nodeType == 1) { - top = dom.getPos(container, scrollContainer || body).y; - } - } - } - } - - // Create a pastebin - pasteBinElm = dom.add(editor.getBody(), 'div', { - id: "mcepastebin", - contentEditable: true, - "data-mce-bogus": "all", - style: 'position: absolute; top: ' + top + 'px;' + - 'width: 10px; height: 10px; overflow: hidden; opacity: 0' - }, pasteBinDefaultContent); - - // Move paste bin out of sight since the controlSelection rect gets displayed otherwise on IE and Gecko - if (Env.ie || Env.gecko) { - dom.setStyle(pasteBinElm, 'left', dom.getStyle(body, 'direction', true) == 'rtl' ? 0xFFFF : -0xFFFF); - } - - // Prevent focus events from bubbeling fixed FocusManager issues - dom.bind(pasteBinElm, 'beforedeactivate focusin focusout', function(e) { - e.stopPropagation(); - }); - - pasteBinElm.focus(); - editor.selection.select(pasteBinElm, true); - } - - /** - * Removes the paste bin if it exists. - */ - function removePasteBin() { - if (pasteBinElm) { - var pasteBinClone; - - // WebKit/Blink might clone the div so - // lets make sure we remove all clones - // TODO: Man o man is this ugly. WebKit is the new IE! Remove this if they ever fix it! - while ((pasteBinClone = editor.dom.get('mcepastebin'))) { - editor.dom.remove(pasteBinClone); - editor.dom.unbind(pasteBinClone); - } - - if (lastRng) { - editor.selection.setRng(lastRng); - } - } - - pasteBinElm = lastRng = null; - } - - /** - * Returns the contents of the paste bin as a HTML string. - * - * @return {String} Get the contents of the paste bin. - */ - function getPasteBinHtml() { - var html = '', pasteBinClones, i, clone, cloneHtml; - - // Since WebKit/Chrome might clone the paste bin when pasting - // for example: we need to check if any of them contains some useful html. - // TODO: Man o man is this ugly. WebKit is the new IE! Remove this if they ever fix it! - pasteBinClones = editor.dom.select('div[id=mcepastebin]'); - for (i = 0; i < pasteBinClones.length; i++) { - clone = pasteBinClones[i]; - - // Pasting plain text produces pastebins in pastebinds makes sence right!? - if (clone.firstChild && clone.firstChild.id == 'mcepastebin') { - clone = clone.firstChild; - } - - cloneHtml = clone.innerHTML; - if (html != pasteBinDefaultContent) { - html += cloneHtml; - } - } - - return html; - } - - /** - * Gets various content types out of a datatransfer object. - * - * @param {DataTransfer} dataTransfer Event fired on paste. - * @return {Object} Object with mime types and data for those mime types. - */ - function getDataTransferItems(dataTransfer) { - var items = {}; - - if (dataTransfer) { - // Use old WebKit/IE API - if (dataTransfer.getData) { - var legacyText = dataTransfer.getData('Text'); - if (legacyText && legacyText.length > 0) { - if (legacyText.indexOf(mceInternalUrlPrefix) == -1) { - items['text/plain'] = legacyText; - } - } - } - - if (dataTransfer.types) { - for (var i = 0; i < dataTransfer.types.length; i++) { - var contentType = dataTransfer.types[i]; - items[contentType] = dataTransfer.getData(contentType); - } - } - } - - return items; - } - - /** - * Gets various content types out of the Clipboard API. It will also get the - * plain text using older IE and WebKit API:s. - * - * @param {ClipboardEvent} clipboardEvent Event fired on paste. - * @return {Object} Object with mime types and data for those mime types. - */ - function getClipboardContent(clipboardEvent) { - return getDataTransferItems(clipboardEvent.clipboardData || editor.getDoc().dataTransfer); - } - - function hasHtmlOrText(content) { - return hasContentType(content, 'text/html') || hasContentType(content, 'text/plain'); - } - - function getBase64FromUri(uri) { - var idx; - - idx = uri.indexOf(','); - if (idx !== -1) { - return uri.substr(idx + 1); - } - - return null; - } - - function isValidDataUriImage(settings, imgElm) { - return settings.images_dataimg_filter ? settings.images_dataimg_filter(imgElm) : true; - } - - function pasteImage(rng, reader, blob) { - if (rng) { - editor.selection.setRng(rng); - rng = null; - } - - var dataUri = reader.result; - var base64 = getBase64FromUri(dataUri); - - var img = new Image(); - img.src = dataUri; - - // TODO: Move the bulk of the cache logic to EditorUpload - if (isValidDataUriImage(editor.settings, img)) { - var blobCache = editor.editorUpload.blobCache; - var blobInfo, existingBlobInfo; - - existingBlobInfo = blobCache.findFirst(function(cachedBlobInfo) { - return cachedBlobInfo.base64() === base64; - }); - - if (!existingBlobInfo) { - blobInfo = blobCache.create(uniqueId(), blob, base64); - blobCache.add(blobInfo); - } else { - blobInfo = existingBlobInfo; - } - - pasteHtml(''); - } else { - pasteHtml(''); - } - } - - /** - * Checks if the clipboard contains image data if it does it will take that data - * and convert it into a data url image and paste that image at the caret location. - * - * @param {ClipboardEvent} e Paste/drop event object. - * @param {DOMRange} rng Rng object to move selection to. - * @return {Boolean} true/false if the image data was found or not. - */ - function pasteImageData(e, rng) { - var dataTransfer = e.clipboardData || e.dataTransfer; - - function processItems(items) { - var i, item, reader, hadImage = false; - - if (items) { - for (i = 0; i < items.length; i++) { - item = items[i]; - - if (/^image\/(jpeg|png|gif|bmp)$/.test(item.type)) { - var blob = item.getAsFile ? item.getAsFile() : item; - - reader = new FileReader(); - reader.onload = pasteImage.bind(null, rng, reader, blob); - reader.readAsDataURL(blob); - - e.preventDefault(); - hadImage = true; - } - } - } - - return hadImage; - } - - if (editor.settings.paste_data_images && dataTransfer) { - return processItems(dataTransfer.items) || processItems(dataTransfer.files); - } - } - - /** - * Chrome on Android doesn't support proper clipboard access so we have no choice but to allow the browser default behavior. - * - * @param {Event} e Paste event object to check if it contains any data. - * @return {Boolean} true/false if the clipboard is empty or not. - */ - function isBrokenAndroidClipboardEvent(e) { - var clipboardData = e.clipboardData; - - return navigator.userAgent.indexOf('Android') != -1 && clipboardData && clipboardData.items && clipboardData.items.length === 0; - } - - function getCaretRangeFromEvent(e) { - return RangeUtils.getCaretRangeFromPoint(e.clientX, e.clientY, editor.getDoc()); - } - - function hasContentType(clipboardContent, mimeType) { - return mimeType in clipboardContent && clipboardContent[mimeType].length > 0; - } - - function isKeyboardPasteEvent(e) { - return (VK.metaKeyPressed(e) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45); - } - - function registerEventHandlers() { - editor.on('keydown', function(e) { - function removePasteBinOnKeyUp(e) { - // Ctrl+V or Shift+Insert - if (isKeyboardPasteEvent(e) && !e.isDefaultPrevented()) { - removePasteBin(); - } - } - - // Ctrl+V or Shift+Insert - if (isKeyboardPasteEvent(e) && !e.isDefaultPrevented()) { - keyboardPastePlainTextState = e.shiftKey && e.keyCode == 86; - - // Edge case on Safari on Mac where it doesn't handle Cmd+Shift+V correctly - // it fires the keydown but no paste or keyup so we are left with a paste bin - if (keyboardPastePlainTextState && Env.webkit && navigator.userAgent.indexOf('Version/') != -1) { - return; - } - - // Prevent undoManager keydown handler from making an undo level with the pastebin in it - e.stopImmediatePropagation(); - - keyboardPasteTimeStamp = new Date().getTime(); - - // IE doesn't support Ctrl+Shift+V and it doesn't even produce a paste event - // so lets fake a paste event and let IE use the execCommand/dataTransfer methods - if (Env.ie && keyboardPastePlainTextState) { - e.preventDefault(); - editor.fire('paste', {ieFake: true}); - return; - } - - removePasteBin(); - createPasteBin(); - - // Remove pastebin if we get a keyup and no paste event - // For example pasting a file in IE 11 will not produce a paste event - editor.once('keyup', removePasteBinOnKeyUp); - editor.once('paste', function() { - editor.off('keyup', removePasteBinOnKeyUp); - }); - } - }); - - function insertClipboardContent(clipboardContent, isKeyBoardPaste, plainTextMode) { - var content; - - // Grab HTML from Clipboard API or paste bin as a fallback - if (hasContentType(clipboardContent, 'text/html')) { - content = clipboardContent['text/html']; - } else { - content = getPasteBinHtml(); - - // If paste bin is empty try using plain text mode - // since that is better than nothing right - if (content == pasteBinDefaultContent) { - plainTextMode = true; - } - } - - content = Utils.trimHtml(content); - - // WebKit has a nice bug where it clones the paste bin if you paste from for example notepad - // so we need to force plain text mode in this case - if (pasteBinElm && pasteBinElm.firstChild && pasteBinElm.firstChild.id === 'mcepastebin') { - plainTextMode = true; - } - - removePasteBin(); - - // If we got nothing from clipboard API and pastebin then we could try the last resort: plain/text - if (!content.length) { - plainTextMode = true; - } - - // Grab plain text from Clipboard API or convert existing HTML to plain text - if (plainTextMode) { - // Use plain text contents from Clipboard API unless the HTML contains paragraphs then - // we should convert the HTML to plain text since works better when pasting HTML/Word contents as plain text - if (hasContentType(clipboardContent, 'text/plain') && content.indexOf('

      ') == -1) { - content = clipboardContent['text/plain']; - } else { - content = Utils.innerText(content); - } - } - - // If the content is the paste bin default HTML then it was - // impossible to get the cliboard data out. - if (content == pasteBinDefaultContent) { - if (!isKeyBoardPaste) { - editor.windowManager.alert('Please use Ctrl+V/Cmd+V keyboard shortcuts to paste contents.'); - } - - return; - } - - if (plainTextMode) { - pasteText(content); - } else { - pasteHtml(content); - } - } - - var getLastRng = function() { - return lastRng || editor.selection.getRng(); - }; - - editor.on('paste', function(e) { - // Getting content from the Clipboard can take some time - var clipboardTimer = new Date().getTime(); - var clipboardContent = getClipboardContent(e); - var clipboardDelay = new Date().getTime() - clipboardTimer; - - var isKeyBoardPaste = (new Date().getTime() - keyboardPasteTimeStamp - clipboardDelay) < 1000; - var plainTextMode = self.pasteFormat == "text" || keyboardPastePlainTextState; - - keyboardPastePlainTextState = false; - - if (e.isDefaultPrevented() || isBrokenAndroidClipboardEvent(e)) { - removePasteBin(); - return; - } - - if (!hasHtmlOrText(clipboardContent) && pasteImageData(e, getLastRng())) { - removePasteBin(); - return; - } - - // Not a keyboard paste prevent default paste and try to grab the clipboard contents using different APIs - if (!isKeyBoardPaste) { - e.preventDefault(); - } - - // Try IE only method if paste isn't a keyboard paste - if (Env.ie && (!isKeyBoardPaste || e.ieFake)) { - createPasteBin(); - - editor.dom.bind(pasteBinElm, 'paste', function(e) { - e.stopPropagation(); - }); - - editor.getDoc().execCommand('Paste', false, null); - clipboardContent["text/html"] = getPasteBinHtml(); - } - - // If clipboard API has HTML then use that directly - if (hasContentType(clipboardContent, 'text/html')) { - e.preventDefault(); - insertClipboardContent(clipboardContent, isKeyBoardPaste, plainTextMode); - } else { - Delay.setEditorTimeout(editor, function() { - insertClipboardContent(clipboardContent, isKeyBoardPaste, plainTextMode); - }, 0); - } - }); - - editor.on('dragstart dragend', function(e) { - draggingInternally = e.type == 'dragstart'; - }); - - function isPlainTextFileUrl(content) { - var plainTextContent = content['text/plain']; - return plainTextContent ? plainTextContent.indexOf('file://') === 0 : false; - } - - editor.on('drop', function(e) { - var dropContent, rng; - - rng = getCaretRangeFromEvent(e); - - if (e.isDefaultPrevented() || draggingInternally) { - return; - } - - dropContent = getDataTransferItems(e.dataTransfer); - - if ((!hasHtmlOrText(dropContent) || isPlainTextFileUrl(dropContent)) && pasteImageData(e, rng)) { - return; - } - - if (rng && editor.settings.paste_filter_drop !== false) { - var content = dropContent['mce-internal'] || dropContent['text/html'] || dropContent['text/plain']; - - if (content) { - e.preventDefault(); - - // FF 45 doesn't paint a caret when dragging in text in due to focus call by execCommand - Delay.setEditorTimeout(editor, function() { - editor.undoManager.transact(function() { - if (dropContent['mce-internal']) { - editor.execCommand('Delete'); - } - - editor.selection.setRng(rng); - - content = Utils.trimHtml(content); - - if (!dropContent['text/html']) { - pasteText(content); - } else { - pasteHtml(content); - } - }); - }); - } - } - }); - - editor.on('dragover dragend', function(e) { - if (editor.settings.paste_data_images) { - e.preventDefault(); - } - }); - } - - self.pasteHtml = pasteHtml; - self.pasteText = pasteText; - self.pasteImageData = pasteImageData; - - editor.on('preInit', function() { - registerEventHandlers(); - - // Remove all data images from paste for example from Gecko - // except internal images like video elements - editor.parser.addNodeFilter('img', function(nodes, name, args) { - function isPasteInsert(args) { - return args.data && args.data.paste === true; - } - - function remove(node) { - if (!node.attr('data-mce-object') && src !== Env.transparentSrc) { - node.remove(); - } - } - - function isWebKitFakeUrl(src) { - return src.indexOf("webkit-fake-url") === 0; - } - - function isDataUri(src) { - return src.indexOf("data:") === 0; - } - - if (!editor.settings.paste_data_images && isPasteInsert(args)) { - var i = nodes.length; - - while (i--) { - var src = nodes[i].attributes.map.src; - - if (!src) { - continue; - } - - // Safari on Mac produces webkit-fake-url see: https://bugs.webkit.org/show_bug.cgi?id=49141 - if (isWebKitFakeUrl(src)) { - remove(nodes[i]); - } else if (!editor.settings.allow_html_data_urls && isDataUri(src)) { - remove(nodes[i]); - } - } - } - }); - }); - }; -}); - -// Included from: js/tinymce/plugins/paste/classes/WordFilter.js - -/** - * WordFilter.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class parses word HTML into proper TinyMCE markup. - * - * @class tinymce.pasteplugin.WordFilter - * @private - */ -define("tinymce/pasteplugin/WordFilter", [ - "tinymce/util/Tools", - "tinymce/html/DomParser", - "tinymce/html/Schema", - "tinymce/html/Serializer", - "tinymce/html/Node", - "tinymce/pasteplugin/Utils" -], function(Tools, DomParser, Schema, Serializer, Node, Utils) { - /** - * Checks if the specified content is from any of the following sources: MS Word/Office 365/Google docs. - */ - function isWordContent(content) { - return ( - (/]+id="?docs-internal-[^>]*>/gi, ''); - content = content.replace(/
      /gi, ''); - - retainStyleProperties = settings.paste_retain_style_properties; - if (retainStyleProperties) { - validStyles = Tools.makeMap(retainStyleProperties.split(/[, ]/)); - } - - /** - * Converts fake bullet and numbered lists to real semantic OL/UL. - * - * @param {tinymce.html.Node} node Root node to convert children of. - */ - function convertFakeListsToProperLists(node) { - var currentListNode, prevListNode, lastLevel = 1; - - function getText(node) { - var txt = ''; - - if (node.type === 3) { - return node.value; - } - - if ((node = node.firstChild)) { - do { - txt += getText(node); - } while ((node = node.next)); - } - - return txt; - } - - function trimListStart(node, regExp) { - if (node.type === 3) { - if (regExp.test(node.value)) { - node.value = node.value.replace(regExp, ''); - return false; - } - } - - if ((node = node.firstChild)) { - do { - if (!trimListStart(node, regExp)) { - return false; - } - } while ((node = node.next)); - } - - return true; - } - - function removeIgnoredNodes(node) { - if (node._listIgnore) { - node.remove(); - return; - } - - if ((node = node.firstChild)) { - do { - removeIgnoredNodes(node); - } while ((node = node.next)); - } - } - - function convertParagraphToLi(paragraphNode, listName, start) { - var level = paragraphNode._listLevel || lastLevel; - - // Handle list nesting - if (level != lastLevel) { - if (level < lastLevel) { - // Move to parent list - if (currentListNode) { - currentListNode = currentListNode.parent.parent; - } - } else { - // Create new list - prevListNode = currentListNode; - currentListNode = null; - } - } - - if (!currentListNode || currentListNode.name != listName) { - prevListNode = prevListNode || currentListNode; - currentListNode = new Node(listName, 1); - - if (start > 1) { - currentListNode.attr('start', '' + start); - } - - paragraphNode.wrap(currentListNode); - } else { - currentListNode.append(paragraphNode); - } - - paragraphNode.name = 'li'; - - // Append list to previous list if it exists - if (level > lastLevel && prevListNode) { - prevListNode.lastChild.append(currentListNode); - } - - lastLevel = level; - - // Remove start of list item "1. " or "· " etc - removeIgnoredNodes(paragraphNode); - trimListStart(paragraphNode, /^\u00a0+/); - trimListStart(paragraphNode, /^\s*([\u2022\u00b7\u00a7\u25CF]|\w+\.)/); - trimListStart(paragraphNode, /^\u00a0+/); - } - - // Build a list of all root level elements before we start - // altering them in the loop below. - var elements = [], child = node.firstChild; - while (typeof child !== 'undefined' && child !== null) { - elements.push(child); - - child = child.walk(); - if (child !== null) { - while (typeof child !== 'undefined' && child.parent !== node) { - child = child.walk(); - } - } - } - - for (var i = 0; i < elements.length; i++) { - node = elements[i]; - - if (node.name == 'p' && node.firstChild) { - // Find first text node in paragraph - var nodeText = getText(node); - - // Detect unordered lists look for bullets - if (isBulletList(nodeText)) { - convertParagraphToLi(node, 'ul'); - continue; - } - - // Detect ordered lists 1., a. or ixv. - if (isNumericList(nodeText)) { - // Parse OL start number - var matches = /([0-9]+)\./.exec(nodeText); - var start = 1; - if (matches) { - start = parseInt(matches[1], 10); - } - - convertParagraphToLi(node, 'ol', start); - continue; - } - - // Convert paragraphs marked as lists but doesn't look like anything - if (node._listLevel) { - convertParagraphToLi(node, 'ul', 1); - continue; - } - - currentListNode = null; - } else { - // If the root level element isn't a p tag which can be - // processed by convertParagraphToLi, it interrupts the - // lists, causing a new list to start instead of having - // elements from the next list inserted above this tag. - prevListNode = currentListNode; - currentListNode = null; - } - } - } - - function filterStyles(node, styleValue) { - var outputStyles = {}, matches, styles = editor.dom.parseStyle(styleValue); - - Tools.each(styles, function(value, name) { - // Convert various MS styles to W3C styles - switch (name) { - case 'mso-list': - // Parse out list indent level for lists - matches = /\w+ \w+([0-9]+)/i.exec(styleValue); - if (matches) { - node._listLevel = parseInt(matches[1], 10); - } - - // Remove these nodes o - // Since the span gets removed we mark the text node and the span - if (/Ignore/i.test(value) && node.firstChild) { - node._listIgnore = true; - node.firstChild._listIgnore = true; - } - - break; - - case "horiz-align": - name = "text-align"; - break; - - case "vert-align": - name = "vertical-align"; - break; - - case "font-color": - case "mso-foreground": - name = "color"; - break; - - case "mso-background": - case "mso-highlight": - name = "background"; - break; - - case "font-weight": - case "font-style": - if (value != "normal") { - outputStyles[name] = value; - } - return; - - case "mso-element": - // Remove track changes code - if (/^(comment|comment-list)$/i.test(value)) { - node.remove(); - return; - } - - break; - } - - if (name.indexOf('mso-comment') === 0) { - node.remove(); - return; - } - - // Never allow mso- prefixed names - if (name.indexOf('mso-') === 0) { - return; - } - - // Output only valid styles - if (retainStyleProperties == "all" || (validStyles && validStyles[name])) { - outputStyles[name] = value; - } - }); - - // Convert bold style to "b" element - if (/(bold)/i.test(outputStyles["font-weight"])) { - delete outputStyles["font-weight"]; - node.wrap(new Node("b", 1)); - } - - // Convert italic style to "i" element - if (/(italic)/i.test(outputStyles["font-style"])) { - delete outputStyles["font-style"]; - node.wrap(new Node("i", 1)); - } - - // Serialize the styles and see if there is something left to keep - outputStyles = editor.dom.serializeStyle(outputStyles, node.name); - if (outputStyles) { - return outputStyles; - } - - return null; - } - - if (settings.paste_enable_default_filters === false) { - return; - } - - // Detect is the contents is Word junk HTML - if (isWordContent(e.content)) { - e.wordContent = true; // Mark it for other processors - - // Remove basic Word junk - content = Utils.filter(content, [ - // Word comments like conditional comments etc - //gi, - - // Remove comments, scripts (e.g., msoShowComment), XML tag, VML content, - // MS Office namespaced tags, and a few other tags - /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi, - - // Convert into for line-though - [/<(\/?)s>/gi, "<$1strike>"], - - // Replace nsbp entites to char since it's easier to handle - [/ /gi, "\u00a0"], - - // Convert ___ to string of alternating - // breaking/non-breaking spaces of same length - [/([\s\u00a0]*)<\/span>/gi, - function(str, spaces) { - return (spaces.length > 0) ? - spaces.replace(/./, " ").slice(Math.floor(spaces.length / 2)).split("").join("\u00a0") : ""; - } - ] - ]); - - var validElements = settings.paste_word_valid_elements; - if (!validElements) { - validElements = ( - '-strong/b,-em/i,-u,-span,-p,-ol,-ul,-li,-h1,-h2,-h3,-h4,-h5,-h6,' + - '-p/div,-a[href|name],sub,sup,strike,br,del,table[width],tr,' + - 'td[colspan|rowspan|width],th[colspan|rowspan|width],thead,tfoot,tbody' - ); - } - - // Setup strict schema - var schema = new Schema({ - valid_elements: validElements, - valid_children: '-li[p]' - }); - - // Add style/class attribute to all element rules since the user might have removed them from - // paste_word_valid_elements config option and we need to check them for properties - Tools.each(schema.elements, function(rule) { - /*eslint dot-notation:0*/ - if (!rule.attributes["class"]) { - rule.attributes["class"] = {}; - rule.attributesOrder.push("class"); - } - - if (!rule.attributes.style) { - rule.attributes.style = {}; - rule.attributesOrder.push("style"); - } - }); - - // Parse HTML into DOM structure - var domParser = new DomParser({}, schema); - - // Filter styles to remove "mso" specific styles and convert some of them - domParser.addAttributeFilter('style', function(nodes) { - var i = nodes.length, node; - - while (i--) { - node = nodes[i]; - node.attr('style', filterStyles(node, node.attr('style'))); - - // Remove pointess spans - if (node.name == 'span' && node.parent && !node.attributes.length) { - node.unwrap(); - } - } - }); - - // Check the class attribute for comments or del items and remove those - domParser.addAttributeFilter('class', function(nodes) { - var i = nodes.length, node, className; - - while (i--) { - node = nodes[i]; - - className = node.attr('class'); - if (/^(MsoCommentReference|MsoCommentText|msoDel)$/i.test(className)) { - node.remove(); - } - - node.attr('class', null); - } - }); - - // Remove all del elements since we don't want the track changes code in the editor - domParser.addNodeFilter('del', function(nodes) { - var i = nodes.length; - - while (i--) { - nodes[i].remove(); - } - }); - - // Keep some of the links and anchors - domParser.addNodeFilter('a', function(nodes) { - var i = nodes.length, node, href, name; - - while (i--) { - node = nodes[i]; - href = node.attr('href'); - name = node.attr('name'); - - if (href && href.indexOf('#_msocom_') != -1) { - node.remove(); - continue; - } - - if (href && href.indexOf('file://') === 0) { - href = href.split('#')[1]; - if (href) { - href = '#' + href; - } - } - - if (!href && !name) { - node.unwrap(); - } else { - // Remove all named anchors that aren't specific to TOC, Footnotes or Endnotes - if (name && !/^_?(?:toc|edn|ftn)/i.test(name)) { - node.unwrap(); - continue; - } - - node.attr({ - href: href, - name: name - }); - } - } - }); - - // Parse into DOM structure - var rootNode = domParser.parse(content); - - // Process DOM - if (settings.paste_convert_word_fake_lists !== false) { - convertFakeListsToProperLists(rootNode); - } - - // Serialize DOM back to HTML - e.content = new Serializer({ - validate: settings.validate - }, schema).serialize(rootNode); - } - }); - } - - WordFilter.isWordContent = isWordContent; - - return WordFilter; -}); - -// Included from: js/tinymce/plugins/paste/classes/Quirks.js - -/** - * Quirks.js - * - * Released under LGPL License. - * Copyright (c) 1999-2017 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class contains various fixes for browsers. These issues can not be feature - * detected since we have no direct control over the clipboard. However we might be able - * to remove some of these fixes once the browsers gets updated/fixed. - * - * @class tinymce.pasteplugin.Quirks - * @private - */ -define("tinymce/pasteplugin/Quirks", [ - "tinymce/Env", - "tinymce/util/Tools", - "tinymce/pasteplugin/WordFilter", - "tinymce/pasteplugin/Utils" -], function(Env, Tools, WordFilter, Utils) { - "use strict"; - - return function(editor) { - function addPreProcessFilter(filterFunc) { - editor.on('BeforePastePreProcess', function(e) { - e.content = filterFunc(e.content); - }); - } - - function addPostProcessFilter(filterFunc) { - editor.on('PastePostProcess', function(e) { - filterFunc(e.node); - }); - } - - /** - * Removes BR elements after block elements. IE9 has a nasty bug where it puts a BR element after each - * block element when pasting from word. This removes those elements. - * - * This: - *

      a


      b

      - * - * Becomes: - *

      a

      b

      - */ - function removeExplorerBrElementsAfterBlocks(html) { - // Only filter word specific content - if (!WordFilter.isWordContent(html)) { - return html; - } - - // Produce block regexp based on the block elements in schema - var blockElements = []; - - Tools.each(editor.schema.getBlockElements(), function(block, blockName) { - blockElements.push(blockName); - }); - - var explorerBlocksRegExp = new RegExp( - '(?:
       [\\s\\r\\n]+|
      )*(<\\/?(' + blockElements.join('|') + ')[^>]*>)(?:
       [\\s\\r\\n]+|
      )*', - 'g' - ); - - // Remove BR:s from: X
      - html = Utils.filter(html, [ - [explorerBlocksRegExp, '$1'] - ]); - - // IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break - html = Utils.filter(html, [ - [/

      /g, '

      '], // Replace multiple BR elements with uppercase BR to keep them intact - [/
      /g, ' '], // Replace single br elements with space since they are word wrap BR:s - [/

      /g, '
      '] // Replace back the double brs but into a single BR - ]); - - return html; - } - - /** - * WebKit has a nasty bug where the all computed styles gets added to style attributes when copy/pasting contents. - * This fix solves that by simply removing the whole style attribute. - * - * The paste_webkit_styles option can be set to specify what to keep: - * paste_webkit_styles: "none" // Keep no styles - * paste_webkit_styles: "all", // Keep all of them - * paste_webkit_styles: "font-weight color" // Keep specific ones - * - * @param {String} content Content that needs to be processed. - * @return {String} Processed contents. - */ - function removeWebKitStyles(content) { - // Passthrough all styles from Word and let the WordFilter handle that junk - if (WordFilter.isWordContent(content)) { - return content; - } - - // Filter away styles that isn't matching the target node - var webKitStyles = editor.settings.paste_webkit_styles; - - if (editor.settings.paste_remove_styles_if_webkit === false || webKitStyles == "all") { - return content; - } - - if (webKitStyles) { - webKitStyles = webKitStyles.split(/[, ]/); - } - - // Keep specific styles that doesn't match the current node computed style - if (webKitStyles) { - var dom = editor.dom, node = editor.selection.getNode(); - - content = content.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi, function(all, before, value, after) { - var inputStyles = dom.parseStyle(value, 'span'), outputStyles = {}; - - if (webKitStyles === "none") { - return before + after; - } - - for (var i = 0; i < webKitStyles.length; i++) { - var inputValue = inputStyles[webKitStyles[i]], currentValue = dom.getStyle(node, webKitStyles[i], true); - - if (/color/.test(webKitStyles[i])) { - inputValue = dom.toHex(inputValue); - currentValue = dom.toHex(currentValue); - } - - if (currentValue != inputValue) { - outputStyles[webKitStyles[i]] = inputValue; - } - } - - outputStyles = dom.serializeStyle(outputStyles, 'span'); - if (outputStyles) { - return before + ' style="' + outputStyles + '"' + after; - } - - return before + after; - }); - } else { - // Remove all external styles - content = content.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi, '$1$3'); - } - - // Keep internal styles - content = content.replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi, function(all, before, value, after) { - return before + ' style="' + value + '"' + after; - }); - - return content; - } - - function removeUnderlineAndFontInAnchor(root) { - editor.$('a', root).find('font,u').each(function(i, node) { - editor.dom.remove(node, true); - }); - } - - // Sniff browsers and apply fixes since we can't feature detect - if (Env.webkit) { - addPreProcessFilter(removeWebKitStyles); - } - - if (Env.ie) { - addPreProcessFilter(removeExplorerBrElementsAfterBlocks); - addPostProcessFilter(removeUnderlineAndFontInAnchor); - } - }; -}); - -// Included from: js/tinymce/plugins/paste/classes/Plugin.js - -/** - * Plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/** - * This class contains the tinymce plugin logic for the paste plugin. - * - * @class tinymce.pasteplugin.Plugin - * @private - */ -define("tinymce/pasteplugin/Plugin", [ - "tinymce/PluginManager", - "tinymce/pasteplugin/Clipboard", - "tinymce/pasteplugin/WordFilter", - "tinymce/pasteplugin/Quirks" -], function(PluginManager, Clipboard, WordFilter, Quirks) { - var userIsInformed; - - PluginManager.add('paste', function(editor) { - var self = this, clipboard, settings = editor.settings; - - function isUserInformedAboutPlainText() { - return userIsInformed || editor.settings.paste_plaintext_inform === false; - } - - function togglePlainTextPaste() { - if (clipboard.pasteFormat == "text") { - clipboard.pasteFormat = "html"; - editor.fire('PastePlainTextToggle', {state: false}); - } else { - clipboard.pasteFormat = "text"; - editor.fire('PastePlainTextToggle', {state: true}); - - if (!isUserInformedAboutPlainText()) { - var message = editor.translate('Paste is now in plain text mode. Contents will now ' + - 'be pasted as plain text until you toggle this option off.'); - - editor.notificationManager.open({ - text: message, - type: 'info' - }); - - userIsInformed = true; - } - } - - editor.focus(); - } - - function stateChange() { - var self = this; - - self.active(clipboard.pasteFormat === 'text'); - - editor.on('PastePlainTextToggle', function (e) { - self.active(e.state); - }); - } - - // draw back if power version is requested and registered - if (/(^|[ ,])powerpaste([, ]|$)/.test(settings.plugins) && PluginManager.get('powerpaste')) { - /*eslint no-console:0 */ - if (typeof console !== "undefined" && console.log) { - console.log("PowerPaste is incompatible with Paste plugin! Remove 'paste' from the 'plugins' option."); - } - return; - } - - self.clipboard = clipboard = new Clipboard(editor); - self.quirks = new Quirks(editor); - self.wordFilter = new WordFilter(editor); - - if (editor.settings.paste_as_text) { - self.clipboard.pasteFormat = "text"; - } - - if (settings.paste_preprocess) { - editor.on('PastePreProcess', function(e) { - settings.paste_preprocess.call(self, self, e); - }); - } - - if (settings.paste_postprocess) { - editor.on('PastePostProcess', function(e) { - settings.paste_postprocess.call(self, self, e); - }); - } - - editor.addCommand('mceInsertClipboardContent', function(ui, value) { - if (value.content) { - self.clipboard.pasteHtml(value.content); - } - - if (value.text) { - self.clipboard.pasteText(value.text); - } - }); - - // Block all drag/drop events - if (editor.settings.paste_block_drop) { - editor.on('dragend dragover draggesture dragdrop drop drag', function(e) { - e.preventDefault(); - e.stopPropagation(); - }); - } - - // Prevent users from dropping data images on Gecko - if (!editor.settings.paste_data_images) { - editor.on('drop', function(e) { - var dataTransfer = e.dataTransfer; - - if (dataTransfer && dataTransfer.files && dataTransfer.files.length > 0) { - e.preventDefault(); - } - }); - } - - editor.addCommand('mceTogglePlainTextPaste', togglePlainTextPaste); - - editor.addButton('pastetext', { - icon: 'pastetext', - tooltip: 'Paste as text', - onclick: togglePlainTextPaste, - onPostRender: stateChange - }); - - editor.addMenuItem('pastetext', { - text: 'Paste as text', - selectable: true, - active: clipboard.pasteFormat, - onclick: togglePlainTextPaste, - onPostRender: stateChange - }); - }); -}); - -expose(["tinymce/pasteplugin/Utils"]); -})(window); \ No newline at end of file diff --git a/wp/wp-includes/js/tinymce/plugins/paste/plugin.min.js b/wp/wp-includes/js/tinymce/plugins/paste/plugin.min.js deleted file mode 100644 index 7cefb4ab..00000000 --- a/wp/wp-includes/js/tinymce/plugins/paste/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"use strict";function n(e,t){for(var n,r=[],o=0;o/g]),o(s.parse(i)),l}function o(e){function t(e,t,n){return t||n?"\xa0":" "}return e=r(e,[/^[\s\S]*]*>\s*|\s*<\/body[^>]*>[\s\S]*$/g,/|/g,[/( ?)\u00a0<\/span>( ?)/g,t],/
      /g,/
      $/i])}function a(e){var t=0;return function(){return e+t++}}return{filter:r,innerText:i,trimHtml:o,createIdGenerator:a}}),r("tinymce/pasteplugin/SmartPaste",["tinymce/util/Tools"],function(e){var t=function(e){return/^https?:\/\/[\w\?\-\/+=.&%@~#]+$/i.test(e)},n=function(e){return t(e)&&/.(gif|jpe?g|png)$/.test(e)},r=function(e,t,n){return e.undoManager.extra(function(){n(e,t)},function(){e.insertContent('')}),!0},i=function(e,t,n){return e.undoManager.extra(function(){n(e,t)},function(){e.execCommand("mceInsertLink",!1,t)}),!0},o=function(e,n,r){return!(e.selection.isCollapsed()!==!1||!t(n))&&i(e,n,r)},a=function(e,t,i){return!!n(t)&&r(e,t,i)},s=function(e,t){return e.insertContent(t,{merge:e.settings.paste_merge_formats!==!1,paste:!0}),!0},l=function(t,n){e.each([o,a,s],function(e){return e(t,n,s)!==!0})},u=function(e,t){e.settings.smart_paste===!1?s(e,t):l(e,t)};return{isImageUrl:n,isAbsoluteUrl:t,insertContent:u}}),r("tinymce/pasteplugin/Clipboard",["tinymce/Env","tinymce/dom/RangeUtils","tinymce/util/VK","tinymce/pasteplugin/Utils","tinymce/pasteplugin/SmartPaste","tinymce/util/Delay"],function(e,t,n,r,i,o){return function(a){function s(e){var t,n=a.dom;if(t=a.fire("BeforePastePreProcess",{content:e}),t=a.fire("PastePreProcess",t),e=t.content,!t.isDefaultPrevented()){if(a.hasEventListeners("PastePostProcess")&&!t.isDefaultPrevented()){var r=n.add(a.getBody(),"div",{style:"display:none"},e);t=a.fire("PastePostProcess",{node:r}),n.remove(r),e=t.node.innerHTML}t.isDefaultPrevented()||i.insertContent(a,e)}}function l(e){e=a.dom.encode(e).replace(/\r\n/g,"\n");var t,n=a.dom.getParent(a.selection.getStart(),a.dom.isBlock),i=a.settings.forced_root_block;i&&(t=a.dom.createHTML(i,a.settings.forced_root_block_attrs),t=t.substr(0,t.length-3)+">"),n&&/^(PRE|DIV)$/.test(n.nodeName)||!i?e=r.filter(e,[[/\n/g,"
      "]]):(e=r.filter(e,[[/\n\n/g,"

      "+t],[/^(.*<\/p>)(

      )$/,t+"$1"],[/\n/g,"
      "]]),e.indexOf("

      ")!=-1&&(e=t+e)),s(e)}function u(){function t(e){var t,n,i,o=e.startContainer;if(t=e.getClientRects(),t.length)return t[0];if(e.collapsed&&1==o.nodeType){for(i=o.childNodes[_.startOffset];i&&3==i.nodeType&&!i.data.length;)i=i.nextSibling;if(i)return"BR"==i.tagName&&(n=r.doc.createTextNode("\ufeff"),i.parentNode.insertBefore(n,i),e=r.createRng(),e.setStartBefore(n),e.setEndAfter(n),t=e.getClientRects(),r.remove(n)),t.length?t[0]:void 0}}var n,r=a.dom,i=a.getBody(),o=a.dom.getViewPort(a.getWin()),s=o.y,l=20;if(_=a.selection.getRng(),a.inline&&(n=a.selection.getScrollContainer(),n&&n.scrollTop>0&&(s=n.scrollTop)),_.getClientRects){var u=t(_);if(u)l=s+(u.top-r.getPos(i).y);else{l=s;var c=_.startContainer;c&&(3==c.nodeType&&c.parentNode!=i&&(c=c.parentNode),1==c.nodeType&&(l=r.getPos(c,n||i).y))}}N=r.add(a.getBody(),"div",{id:"mcepastebin",contentEditable:!0,"data-mce-bogus":"all",style:"position: absolute; top: "+l+"px;width: 10px; height: 10px; overflow: hidden; opacity: 0"},A),(e.ie||e.gecko)&&r.setStyle(N,"left","rtl"==r.getStyle(i,"direction",!0)?65535:-65535),r.bind(N,"beforedeactivate focusin focusout",function(e){e.stopPropagation()}),N.focus(),a.selection.select(N,!0)}function c(){if(N){for(var e;e=a.dom.get("mcepastebin");)a.dom.remove(e),a.dom.unbind(e);_&&a.selection.setRng(_)}N=_=null}function d(){var e,t,n,r,i="";for(e=a.dom.select("div[id=mcepastebin]"),t=0;t0&&n.indexOf(B)==-1&&(t["text/plain"]=n)}if(e.types)for(var r=0;r')}else s('')}function y(e,t){function n(n){var r,i,o,a=!1;if(n)for(r=0;r0}function w(e){return n.metaKeyPressed(e)&&86==e.keyCode||e.shiftKey&&45==e.keyCode}function E(){function t(e,t,n){var i;return x(e,"text/html")?i=e["text/html"]:(i=d(),i==A&&(n=!0)),i=r.trimHtml(i),N&&N.firstChild&&"mcepastebin"===N.firstChild.id&&(n=!0),c(),i.length||(n=!0),n&&(i=x(e,"text/plain")&&i.indexOf("

      ")==-1?e["text/plain"]:r.innerText(i)),i==A?void(t||a.windowManager.alert("Please use Ctrl+V/Cmd+V keyboard shortcuts to paste contents.")):void(n?l(i):s(i))}function n(e){var t=e["text/plain"];return!!t&&0===t.indexOf("file://")}a.on("keydown",function(t){function n(e){w(e)&&!e.isDefaultPrevented()&&c()}if(w(t)&&!t.isDefaultPrevented()){if(S=t.shiftKey&&86==t.keyCode,S&&e.webkit&&navigator.userAgent.indexOf("Version/")!=-1)return;if(t.stopImmediatePropagation(),T=(new Date).getTime(),e.ie&&S)return t.preventDefault(),void a.fire("paste",{ieFake:!0});c(),u(),a.once("keyup",n),a.once("paste",function(){a.off("keyup",n)})}});var i=function(){return _||a.selection.getRng()};a.on("paste",function(n){var r=(new Date).getTime(),s=p(n),l=(new Date).getTime()-r,f=(new Date).getTime()-T-l<1e3,m="text"==k.pasteFormat||S;return S=!1,n.isDefaultPrevented()||b(n)?void c():!h(s)&&y(n,i())?void c():(f||n.preventDefault(),!e.ie||f&&!n.ieFake||(u(),a.dom.bind(N,"paste",function(e){e.stopPropagation()}),a.getDoc().execCommand("Paste",!1,null),s["text/html"]=d()),void(x(s,"text/html")?(n.preventDefault(),t(s,f,m)):o.setEditorTimeout(a,function(){t(s,f,m)},0)))}),a.on("dragstart dragend",function(e){R="dragstart"==e.type}),a.on("drop",function(e){var t,i;if(i=C(e),!e.isDefaultPrevented()&&!R&&(t=f(e.dataTransfer),(h(t)&&!n(t)||!y(e,i))&&i&&a.settings.paste_filter_drop!==!1)){var u=t["mce-internal"]||t["text/html"]||t["text/plain"];u&&(e.preventDefault(),o.setEditorTimeout(a,function(){a.undoManager.transact(function(){t["mce-internal"]&&a.execCommand("Delete"),a.selection.setRng(i),u=r.trimHtml(u),t["text/html"]?s(u):l(u)})}))}}),a.on("dragover dragend",function(e){a.settings.paste_data_images&&e.preventDefault()})}var N,_,S,k=this,T=0,R=!1,A="%MCEPASTEBIN%",B="data:text/mce-internal,",D=r.createIdGenerator("mceclip");k.pasteHtml=s,k.pasteText=l,k.pasteImageData=y,a.on("preInit",function(){E(),a.parser.addNodeFilter("img",function(t,n,r){function i(e){return e.data&&e.data.paste===!0}function o(t){t.attr("data-mce-object")||c===e.transparentSrc||t.remove()}function s(e){return 0===e.indexOf("webkit-fake-url")}function l(e){return 0===e.indexOf("data:")}if(!a.settings.paste_data_images&&i(r))for(var u=t.length;u--;){var c=t[u].attributes.map.src;c&&(s(c)?o(t[u]):!a.settings.allow_html_data_urls&&l(c)&&o(t[u]))}})})}}),r("tinymce/pasteplugin/WordFilter",["tinymce/util/Tools","tinymce/html/DomParser","tinymce/html/Schema","tinymce/html/Serializer","tinymce/html/Node","tinymce/pasteplugin/Utils"],function(e,t,n,r,i,o){function a(e){return/1&&a.attr("start",""+o),e.wrap(a)),e.name="li",s>c&&u&&u.lastChild.append(a),c=s,r(e),n(e,/^\u00a0+/),n(e,/^\s*([\u2022\u00b7\u00a7\u25CF]|\w+\.)/),n(e,/^\u00a0+/)}for(var a,u,c=1,d=[],f=e.firstChild;"undefined"!=typeof f&&null!==f;)if(d.push(f),f=f.walk(),null!==f)for(;"undefined"!=typeof f&&f.parent!==e;)f=f.walk();for(var p=0;p]+id="?docs-internal-[^>]*>/gi,""),g=g.replace(/
      /gi,""),h=c.paste_retain_style_properties,h&&(m=e.makeMap(h.split(/[, ]/))),c.paste_enable_default_filters!==!1&&a(d.content)){d.wordContent=!0,g=o.filter(g,[//gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/ /gi,"\xa0"],[/([\s\u00a0]*)<\/span>/gi,function(e,t){return t.length>0?t.replace(/./," ").slice(Math.floor(t.length/2)).split("").join("\xa0"):""}]]);var v=c.paste_word_valid_elements;v||(v="-strong/b,-em/i,-u,-span,-p,-ol,-ul,-li,-h1,-h2,-h3,-h4,-h5,-h6,-p/div,-a[href|name],sub,sup,strike,br,del,table[width],tr,td[colspan|rowspan|width],th[colspan|rowspan|width],thead,tfoot,tbody");var y=new n({valid_elements:v,valid_children:"-li[p]"});e.each(y.elements,function(e){e.attributes["class"]||(e.attributes["class"]={},e.attributesOrder.push("class")),e.attributes.style||(e.attributes.style={},e.attributesOrder.push("style"))});var b=new t({},y);b.addAttributeFilter("style",function(e){for(var t,n=e.length;n--;)t=e[n],t.attr("style",p(t,t.attr("style"))),"span"==t.name&&t.parent&&!t.attributes.length&&t.unwrap()}),b.addAttributeFilter("class",function(e){for(var t,n,r=e.length;r--;)t=e[r],n=t.attr("class"),/^(MsoCommentReference|MsoCommentText|msoDel)$/i.test(n)&&t.remove(),t.attr("class",null)}),b.addNodeFilter("del",function(e){for(var t=e.length;t--;)e[t].remove()}),b.addNodeFilter("a",function(e){for(var t,n,r,i=e.length;i--;)if(t=e[i],n=t.attr("href"),r=t.attr("name"),n&&n.indexOf("#_msocom_")!=-1)t.remove();else if(n&&0===n.indexOf("file://")&&(n=n.split("#")[1],n&&(n="#"+n)),n||r){if(r&&!/^_?(?:toc|edn|ftn)/i.test(r)){t.unwrap();continue}t.attr({href:n,name:r})}else t.unwrap()});var C=b.parse(g);c.paste_convert_word_fake_lists!==!1&&f(C),d.content=new r({validate:c.validate},y).serialize(C)}})}return u.isWordContent=a,u}),r("tinymce/pasteplugin/Quirks",["tinymce/Env","tinymce/util/Tools","tinymce/pasteplugin/WordFilter","tinymce/pasteplugin/Utils"],function(e,t,n,r){return function(i){function o(e){i.on("BeforePastePreProcess",function(t){t.content=e(t.content)})}function a(e){i.on("PastePostProcess",function(t){e(t.node)})}function s(e){if(!n.isWordContent(e))return e;var o=[];t.each(i.schema.getBlockElements(),function(e,t){o.push(t)});var a=new RegExp("(?:
       [\\s\\r\\n]+|
      )*(<\\/?("+o.join("|")+")[^>]*>)(?:
       [\\s\\r\\n]+|
      )*","g");return e=r.filter(e,[[a,"$1"]]),e=r.filter(e,[[/

      /g,"

      "],[/
      /g," "],[/

      /g,"
      "]])}function l(e){if(n.isWordContent(e))return e;var t=i.settings.paste_webkit_styles;if(i.settings.paste_remove_styles_if_webkit===!1||"all"==t)return e;if(t&&(t=t.split(/[, ]/)),t){var r=i.dom,o=i.selection.getNode();e=e.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,function(e,n,i,a){var s=r.parseStyle(i,"span"),l={};if("none"===t)return n+a;for(var u=0;u]+) style="([^"]*)"([^>]*>)/gi,"$1$3");return e=e.replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi,function(e,t,n,r){return t+' style="'+n+'"'+r})}function u(e){i.$("a",e).find("font,u").each(function(e,t){i.dom.remove(t,!0)})}e.webkit&&o(l),e.ie&&(o(s),a(u))}}),r("tinymce/pasteplugin/Plugin",["tinymce/PluginManager","tinymce/pasteplugin/Clipboard","tinymce/pasteplugin/WordFilter","tinymce/pasteplugin/Quirks"],function(e,t,n,r){var i;e.add("paste",function(o){function a(){return i||o.settings.paste_plaintext_inform===!1}function s(){if("text"==u.pasteFormat)u.pasteFormat="html",o.fire("PastePlainTextToggle",{state:!1});else if(u.pasteFormat="text",o.fire("PastePlainTextToggle",{state:!0}),!a()){var e=o.translate("Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.");o.notificationManager.open({text:e,type:"info"}),i=!0}o.focus()}function l(){var e=this;e.active("text"===u.pasteFormat),o.on("PastePlainTextToggle",function(t){e.active(t.state)})}var u,c=this,d=o.settings;return/(^|[ ,])powerpaste([, ]|$)/.test(d.plugins)&&e.get("powerpaste")?void("undefined"!=typeof console&&console.log&&console.log("PowerPaste is incompatible with Paste plugin! Remove 'paste' from the 'plugins' option.")):(c.clipboard=u=new t(o),c.quirks=new r(o),c.wordFilter=new n(o),o.settings.paste_as_text&&(c.clipboard.pasteFormat="text"),d.paste_preprocess&&o.on("PastePreProcess",function(e){d.paste_preprocess.call(c,c,e)}),d.paste_postprocess&&o.on("PastePostProcess",function(e){d.paste_postprocess.call(c,c,e)}),o.addCommand("mceInsertClipboardContent",function(e,t){t.content&&c.clipboard.pasteHtml(t.content),t.text&&c.clipboard.pasteText(t.text)}),o.settings.paste_block_drop&&o.on("dragend dragover draggesture dragdrop drop drag",function(e){e.preventDefault(),e.stopPropagation()}),o.settings.paste_data_images||o.on("drop",function(e){var t=e.dataTransfer;t&&t.files&&t.files.length>0&&e.preventDefault()}),o.addCommand("mceTogglePlainTextPaste",s),o.addButton("pastetext",{icon:"pastetext",tooltip:"Paste as text",onclick:s,onPostRender:l}),void o.addMenuItem("pastetext",{text:"Paste as text",selectable:!0,active:u.pasteFormat,onclick:s,onPostRender:l}))})}),o(["tinymce/pasteplugin/Utils"])}(window); \ No newline at end of file diff --git a/wp/wp-includes/js/tinymce/plugins/tabfocus/plugin.js b/wp/wp-includes/js/tinymce/plugins/tabfocus/plugin.js deleted file mode 100644 index 35bc9f58..00000000 --- a/wp/wp-includes/js/tinymce/plugins/tabfocus/plugin.js +++ /dev/null @@ -1,120 +0,0 @@ -/** - * plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/*global tinymce:true */ - -tinymce.PluginManager.add('tabfocus', function(editor) { - var DOM = tinymce.DOM, each = tinymce.each, explode = tinymce.explode; - - function tabCancel(e) { - if (e.keyCode === 9 && !e.ctrlKey && !e.altKey && !e.metaKey) { - e.preventDefault(); - } - } - - function tabHandler(e) { - var x, el, v, i; - - if (e.keyCode !== 9 || e.ctrlKey || e.altKey || e.metaKey || e.isDefaultPrevented()) { - return; - } - - function find(direction) { - el = DOM.select(':input:enabled,*[tabindex]:not(iframe)'); - - function canSelectRecursive(e) { - return e.nodeName === "BODY" || (e.type != 'hidden' && - e.style.display != "none" && - e.style.visibility != "hidden" && canSelectRecursive(e.parentNode)); - } - - function canSelect(el) { - return /INPUT|TEXTAREA|BUTTON/.test(el.tagName) && tinymce.get(e.id) && el.tabIndex != -1 && canSelectRecursive(el); - } - - each(el, function(e, i) { - if (e.id == editor.id) { - x = i; - return false; - } - }); - if (direction > 0) { - for (i = x + 1; i < el.length; i++) { - if (canSelect(el[i])) { - return el[i]; - } - } - } else { - for (i = x - 1; i >= 0; i--) { - if (canSelect(el[i])) { - return el[i]; - } - } - } - - return null; - } - - v = explode(editor.getParam('tab_focus', editor.getParam('tabfocus_elements', ':prev,:next'))); - - if (v.length == 1) { - v[1] = v[0]; - v[0] = ':prev'; - } - - // Find element to focus - if (e.shiftKey) { - if (v[0] == ':prev') { - el = find(-1); - } else { - el = DOM.get(v[0]); - } - } else { - if (v[1] == ':next') { - el = find(1); - } else { - el = DOM.get(v[1]); - } - } - - if (el) { - var focusEditor = tinymce.get(el.id || el.name); - - if (el.id && focusEditor) { - focusEditor.focus(); - } else { - tinymce.util.Delay.setTimeout(function() { - if (!tinymce.Env.webkit) { - window.focus(); - } - - el.focus(); - }, 10); - } - - e.preventDefault(); - } - } - - editor.on('init', function() { - if (editor.inline) { - // Remove default tabIndex in inline mode - tinymce.DOM.setAttrib(editor.getBody(), 'tabIndex', null); - } - - editor.on('keyup', tabCancel); - - if (tinymce.Env.gecko) { - editor.on('keypress keydown', tabHandler); - } else { - editor.on('keydown', tabHandler); - } - }); -}); diff --git a/wp/wp-includes/js/tinymce/plugins/tabfocus/plugin.min.js b/wp/wp-includes/js/tinymce/plugins/tabfocus/plugin.min.js deleted file mode 100644 index 915ef959..00000000 --- a/wp/wp-includes/js/tinymce/plugins/tabfocus/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("tabfocus",function(e){function t(e){9!==e.keyCode||e.ctrlKey||e.altKey||e.metaKey||e.preventDefault()}function n(t){function n(n){function o(e){return"BODY"===e.nodeName||"hidden"!=e.type&&"none"!=e.style.display&&"hidden"!=e.style.visibility&&o(e.parentNode)}function l(e){return/INPUT|TEXTAREA|BUTTON/.test(e.tagName)&&tinymce.get(t.id)&&e.tabIndex!=-1&&o(e)}if(s=r.select(":input:enabled,*[tabindex]:not(iframe)"),i(s,function(t,n){if(t.id==e.id)return a=n,!1}),n>0){for(u=a+1;u=0;u--)if(l(s[u]))return s[u];return null}var a,s,l,u;if(!(9!==t.keyCode||t.ctrlKey||t.altKey||t.metaKey||t.isDefaultPrevented())&&(l=o(e.getParam("tab_focus",e.getParam("tabfocus_elements",":prev,:next"))),1==l.length&&(l[1]=l[0],l[0]=":prev"),s=t.shiftKey?":prev"==l[0]?n(-1):r.get(l[0]):":next"==l[1]?n(1):r.get(l[1]))){var c=tinymce.get(s.id||s.name);s.id&&c?c.focus():tinymce.util.Delay.setTimeout(function(){tinymce.Env.webkit||window.focus(),s.focus()},10),t.preventDefault()}}var r=tinymce.DOM,i=tinymce.each,o=tinymce.explode;e.on("init",function(){e.inline&&tinymce.DOM.setAttrib(e.getBody(),"tabIndex",null),e.on("keyup",t),tinymce.Env.gecko?e.on("keypress keydown",n):e.on("keydown",n)})}); \ No newline at end of file diff --git a/wp/wp-includes/js/tinymce/plugins/textcolor/plugin.js b/wp/wp-includes/js/tinymce/plugins/textcolor/plugin.js deleted file mode 100644 index 145afb17..00000000 --- a/wp/wp-includes/js/tinymce/plugins/textcolor/plugin.js +++ /dev/null @@ -1,297 +0,0 @@ -/** - * plugin.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -/*global tinymce:true */ -/*eslint consistent-this:0 */ - -tinymce.PluginManager.add('textcolor', function(editor) { - var cols, rows; - - rows = { - forecolor: editor.settings.forecolor_rows || editor.settings.textcolor_rows || 5, - backcolor: editor.settings.backcolor_rows || editor.settings.textcolor_rows || 5 - }; - cols = { - forecolor: editor.settings.forecolor_cols || editor.settings.textcolor_cols || 8, - backcolor: editor.settings.backcolor_cols || editor.settings.textcolor_cols || 8 - }; - - function getCurrentColor(format) { - var color; - - editor.dom.getParents(editor.selection.getStart(), function(elm) { - var value; - - if ((value = elm.style[format == 'forecolor' ? 'color' : 'background-color'])) { - color = value; - } - }); - - return color; - } - - function mapColors(type) { - var i, colors = [], colorMap; - - colorMap = [ - "000000", "Black", - "993300", "Burnt orange", - "333300", "Dark olive", - "003300", "Dark green", - "003366", "Dark azure", - "000080", "Navy Blue", - "333399", "Indigo", - "333333", "Very dark gray", - "800000", "Maroon", - "FF6600", "Orange", - "808000", "Olive", - "008000", "Green", - "008080", "Teal", - "0000FF", "Blue", - "666699", "Grayish blue", - "808080", "Gray", - "FF0000", "Red", - "FF9900", "Amber", - "99CC00", "Yellow green", - "339966", "Sea green", - "33CCCC", "Turquoise", - "3366FF", "Royal blue", - "800080", "Purple", - "999999", "Medium gray", - "FF00FF", "Magenta", - "FFCC00", "Gold", - "FFFF00", "Yellow", - "00FF00", "Lime", - "00FFFF", "Aqua", - "00CCFF", "Sky blue", - "993366", "Red violet", - "FFFFFF", "White", - "FF99CC", "Pink", - "FFCC99", "Peach", - "FFFF99", "Light yellow", - "CCFFCC", "Pale green", - "CCFFFF", "Pale cyan", - "99CCFF", "Light sky blue", - "CC99FF", "Plum" - ]; - - colorMap = editor.settings.textcolor_map || colorMap; - colorMap = editor.settings[type + '_map'] || colorMap; - - for (i = 0; i < colorMap.length; i += 2) { - colors.push({ - text: colorMap[i + 1], - color: '#' + colorMap[i] - }); - } - - return colors; - } - - function renderColorPicker() { - var ctrl = this, colors, color, html, last, x, y, i, id = ctrl._id, count = 0, type; - - type = ctrl.settings.origin; - - function getColorCellHtml(color, title) { - var isNoColor = color == 'transparent'; - - return ( - '
      ' - ); - } - - colors = mapColors(type); - colors.push({ - text: tinymce.translate("No color"), - color: "transparent" - }); - - html = '
      ' + - '
      ' + - (isNoColor ? '×' : '') + - '
      ' + - '
      '; - last = colors.length - 1; - - for (y = 0; y < rows[type]; y++) { - html += ''; - - for (x = 0; x < cols[type]; x++) { - i = y * cols[type] + x; - - if (i > last) { - html += ''; - } else { - color = colors[i]; - html += getColorCellHtml(color.color, color.text); - } - } - - html += ''; - } - - if (editor.settings.color_picker_callback) { - html += ( - '' + - '' + - '' - ); - - html += ''; - - for (x = 0; x < cols[type]; x++) { - html += getColorCellHtml('', 'Custom color'); - } - - html += ''; - } - - html += '
      ' + - '
      ' + - '' + - '
      ' + - '
      '; - - return html; - } - - function applyFormat(format, value) { - editor.undoManager.transact(function() { - editor.focus(); - editor.formatter.apply(format, {value: value}); - editor.nodeChanged(); - }); - } - - function removeFormat(format) { - editor.undoManager.transact(function() { - editor.focus(); - editor.formatter.remove(format, {value: null}, null, true); - editor.nodeChanged(); - }); - } - - function onPanelClick(e) { - var buttonCtrl = this.parent(), value, type; - - type = buttonCtrl.settings.origin; - - function selectColor(value) { - buttonCtrl.hidePanel(); - buttonCtrl.color(value); - applyFormat(buttonCtrl.settings.format, value); - } - - function resetColor() { - buttonCtrl.hidePanel(); - buttonCtrl.resetColor(); - removeFormat(buttonCtrl.settings.format); - } - - function setDivColor(div, value) { - div.style.background = value; - div.setAttribute('data-mce-color', value); - } - - if (tinymce.DOM.getParent(e.target, '.mce-custom-color-btn')) { - buttonCtrl.hidePanel(); - - editor.settings.color_picker_callback.call(editor, function(value) { - var tableElm = buttonCtrl.panel.getEl().getElementsByTagName('table')[0]; - var customColorCells, div, i; - - customColorCells = tinymce.map(tableElm.rows[tableElm.rows.length - 1].childNodes, function(elm) { - return elm.firstChild; - }); - - for (i = 0; i < customColorCells.length; i++) { - div = customColorCells[i]; - if (!div.getAttribute('data-mce-color')) { - break; - } - } - - // Shift colors to the right - // TODO: Might need to be the left on RTL - if (i == cols[type]) { - for (i = 0; i < cols[type] - 1; i++) { - setDivColor(customColorCells[i], customColorCells[i + 1].getAttribute('data-mce-color')); - } - } - - setDivColor(div, value); - selectColor(value); - }, getCurrentColor(buttonCtrl.settings.format)); - } - - value = e.target.getAttribute('data-mce-color'); - if (value) { - if (this.lastId) { - document.getElementById(this.lastId).setAttribute('aria-selected', false); - } - - e.target.setAttribute('aria-selected', true); - this.lastId = e.target.id; - - if (value == 'transparent') { - resetColor(); - } else { - selectColor(value); - } - } else if (value !== null) { - buttonCtrl.hidePanel(); - } - } - - function onButtonClick() { - var self = this; - - if (self._color) { - applyFormat(self.settings.format, self._color); - } else { - removeFormat(self.settings.format); - } - } - - editor.addButton('forecolor', { - type: 'colorbutton', - tooltip: 'Text color', - format: 'forecolor', - panel: { - origin: 'forecolor', - role: 'application', - ariaRemember: true, - html: renderColorPicker, - onclick: onPanelClick - }, - onclick: onButtonClick - }); - - editor.addButton('backcolor', { - type: 'colorbutton', - tooltip: 'Background color', - format: 'hilitecolor', - panel: { - origin: 'backcolor', - role: 'application', - ariaRemember: true, - html: renderColorPicker, - onclick: onPanelClick - }, - onclick: onButtonClick - }); -}); diff --git a/wp/wp-includes/js/tinymce/plugins/textcolor/plugin.min.js b/wp/wp-includes/js/tinymce/plugins/textcolor/plugin.min.js deleted file mode 100644 index 19e9a648..00000000 --- a/wp/wp-includes/js/tinymce/plugins/textcolor/plugin.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.PluginManager.add("textcolor",function(e){function t(t){var n;return e.dom.getParents(e.selection.getStart(),function(e){var r;(r=e.style["forecolor"==t?"color":"background-color"])&&(n=r)}),n}function n(t){var n,r,i=[];for(r=["000000","Black","993300","Burnt orange","333300","Dark olive","003300","Dark green","003366","Dark azure","000080","Navy Blue","333399","Indigo","333333","Very dark gray","800000","Maroon","FF6600","Orange","808000","Olive","008000","Green","008080","Teal","0000FF","Blue","666699","Grayish blue","808080","Gray","FF0000","Red","FF9900","Amber","99CC00","Yellow green","339966","Sea green","33CCCC","Turquoise","3366FF","Royal blue","800080","Purple","999999","Medium gray","FF00FF","Magenta","FFCC00","Gold","FFFF00","Yellow","00FF00","Lime","00FFFF","Aqua","00CCFF","Sky blue","993366","Red violet","FFFFFF","White","FF99CC","Pink","FFCC99","Peach","FFFF99","Light yellow","CCFFCC","Pale green","CCFFFF","Pale cyan","99CCFF","Light sky blue","CC99FF","Plum"],r=e.settings.textcolor_map||r,r=e.settings[t+"_map"]||r,n=0;n

      '+(n?"×":"")+"
      "}var r,i,o,a,s,c,d,f,p=this,h=p._id,m=0;for(f=p.settings.origin,r=n(f),r.push({text:tinymce.translate("No color"),color:"transparent"}),o='',a=r.length-1,c=0;c",s=0;sa?o+="":(i=r[d],o+=t(i.color,i.text));o+=""}if(e.settings.color_picker_callback){for(o+='",o+="",s=0;s 0 ) { - if ( state === 'hide' ) { - toolbar.hide(); - pixels += 30; - } else { - toolbar.show(); - pixels -= 30; - } - } - }); - - if ( pixels && ! initial ) { - // Resize iframe, not needed in iOS - if ( ! tinymce.Env.iOS ) { - iframe = editor.getContentAreaContainer().firstChild; - DOM.setStyle( iframe, 'height', iframe.clientHeight + pixels ); - } - - if ( state === 'hide' ) { - setUserSetting('hidetb', '0'); - wpAdvButton && wpAdvButton.active( false ); - } else { - setUserSetting('hidetb', '1'); - wpAdvButton && wpAdvButton.active( true ); - } - } - - editor.fire( 'wp-toolbar-toggle' ); - } - - // Add the kitchen sink button :) - editor.addButton( 'wp_adv', { - tooltip: 'Toolbar Toggle', - cmd: 'WP_Adv', - onPostRender: function() { - wpAdvButton = this; - wpAdvButton.active( getUserSetting( 'hidetb' ) === '1' ? true : false ); - } - }); - - // Hide the toolbars after loading - editor.on( 'PostRender', function() { - if ( editor.getParam( 'wordpress_adv_hidden', true ) && getUserSetting( 'hidetb', '0' ) === '0' ) { - toggleToolbars( 'hide' ); - } - }); - - editor.addCommand( 'WP_Adv', function() { - toggleToolbars(); - }); - - editor.on( 'focus', function() { - window.wpActiveEditor = editor.id; - }); - - editor.on( 'BeforeSetContent', function( event ) { - var title; - - if ( event.content ) { - if ( event.content.indexOf( '/g, function( match, moretext ) { - return ''; - }); - } - - if ( event.content.indexOf( '' ) !== -1 ) { - title = __( 'Page break' ); - - event.content = event.content.replace( //g, - '' ); - } - - if ( event.load && event.format !== 'raw' && hasWpautop ) { - event.content = wp.editor.autop( event.content ); - } - - if ( event.content.indexOf( ']*>[\s\S]*?<\/\1>/g, function( match, tag ) { - return ''; - } ); - } - - // Remove spaces from empty paragraphs. - // Try to avoid a lot of backtracking, can freeze the editor. See #35890 and #38294. - event.content = event.content.replace( /

      ([^<>]+)<\/p>/gi, function( tag, text ) { - if ( text === ' ' || ! /\S/.test( text ) ) { - return '


      '; - } - - return tag; - }); - } - }); - - editor.on( 'PostProcess', function( event ) { - if ( event.get ) { - event.content = event.content.replace(/]+>/g, function( image ) { - var match, - string, - moretext = ''; - - if ( image.indexOf( 'data-wp-more="more"' ) !== -1 ) { - if ( match = image.match( /data-wp-more-text="([^"]+)"/ ) ) { - moretext = match[1]; - } - - string = ''; - } else if ( image.indexOf( 'data-wp-more="nextpage"' ) !== -1 ) { - string = ''; - } else if ( image.indexOf( 'data-wp-preserve' ) !== -1 ) { - if ( match = image.match( / data-wp-preserve="([^"]+)"/ ) ) { - string = decodeURIComponent( match[1] ); - } - } - - return string || image; - }); - } - }); - - // Display the tag name instead of img in element path - editor.on( 'ResolveName', function( event ) { - var attr; - - if ( event.target.nodeName === 'IMG' && ( attr = editor.dom.getAttrib( event.target, 'data-wp-more' ) ) ) { - event.name = attr; - } - }); - - // Register commands - editor.addCommand( 'WP_More', function( tag ) { - var parent, html, title, - classname = 'wp-more-tag', - dom = editor.dom, - node = editor.selection.getNode(); - - tag = tag || 'more'; - classname += ' mce-wp-' + tag; - title = tag === 'more' ? 'Read more...' : 'Next page'; - title = __( title ); - html = ''; - - // Most common case - if ( node.nodeName === 'BODY' || ( node.nodeName === 'P' && node.parentNode.nodeName === 'BODY' ) ) { - editor.insertContent( html ); - return; - } - - // Get the top level parent node - parent = dom.getParent( node, function( found ) { - if ( found.parentNode && found.parentNode.nodeName === 'BODY' ) { - return true; - } - - return false; - }, editor.getBody() ); - - if ( parent ) { - if ( parent.nodeName === 'P' ) { - parent.appendChild( dom.create( 'p', null, html ).firstChild ); - } else { - dom.insertAfter( dom.create( 'p', null, html ), parent ); - } - - editor.nodeChanged(); - } - }); - - editor.addCommand( 'WP_Code', function() { - editor.formatter.toggle('code'); - }); - - editor.addCommand( 'WP_Page', function() { - editor.execCommand( 'WP_More', 'nextpage' ); - }); - - editor.addCommand( 'WP_Help', function() { - var access = tinymce.Env.mac ? __( 'Ctrl + Alt + letter:' ) : __( 'Shift + Alt + letter:' ), - meta = tinymce.Env.mac ? __( 'Cmd + letter:' ) : __( 'Ctrl + letter:' ), - table1 = [], - table2 = [], - row1 = {}, - row2 = {}, - i1 = 0, - i2 = 0, - labels = editor.settings.wp_shortcut_labels, - header, html, dialog, $wrap; - - if ( ! labels ) { - return; - } - - function tr( row, columns ) { - var out = '
      '; - var i = 0; - - columns = columns || 1; - - each( row, function( text, key ) { - out += ''; - i++; - }); - - while ( i < columns ) { - out += ''; - i++; - } - - return out + ''; - } - - each ( labels, function( label, name ) { - var letter; - - if ( label.indexOf( 'meta' ) !== -1 ) { - i1++; - letter = label.replace( 'meta', '' ).toLowerCase(); - - if ( letter ) { - row1[ letter ] = name; - - if ( i1 % 2 === 0 ) { - table1.push( tr( row1, 2 ) ); - row1 = {}; - } - } - } else if ( label.indexOf( 'access' ) !== -1 ) { - i2++; - letter = label.replace( 'access', '' ).toLowerCase(); - - if ( letter ) { - row2[ letter ] = name; - - if ( i2 % 2 === 0 ) { - table2.push( tr( row2, 2 ) ); - row2 = {}; - } - } - } - } ); - - // Add remaining single entries. - if ( i1 % 2 > 0 ) { - table1.push( tr( row1, 2 ) ); - } - - if ( i2 % 2 > 0 ) { - table2.push( tr( row2, 2 ) ); - } - - header = [ __( 'Letter' ), __( 'Action' ), __( 'Letter' ), __( 'Action' ) ]; - header = ''; - - html = '
      '; - - // Main section, default and additional shortcuts - html = html + - '

      ' + __( 'Default shortcuts,' ) + ' ' + meta + '

      ' + - '
      ' + key + '' + __( text ) + '
      ' + header.join( '' ) + '
      ' + - header + - table1.join('') + - '
      ' + - '

      ' + __( 'Additional shortcuts,' ) + ' ' + access + '

      ' + - '' + - header + - table2.join('') + - '
      '; - - if ( editor.plugins.wptextpattern && ( ! tinymce.Env.ie || tinymce.Env.ie > 8 ) ) { - // Text pattern section - html = html + - '

      ' + __( 'When starting a new paragraph with one of these formatting shortcuts followed by a space, the formatting will be applied automatically. Press Backspace or Escape to undo.' ) + '

      ' + - '' + - tr({ '*': 'Bullet list', '1.': 'Numbered list' }) + - tr({ '-': 'Bullet list', '1)': 'Numbered list' }) + - '
      '; - - html = html + - '

      ' + __( 'The following formatting shortcuts are replaced when pressing Enter. Press Escape or the Undo button to undo.' ) + '

      ' + - '' + - tr({ '>': 'Blockquote' }) + - tr({ '##': 'Heading 2' }) + - tr({ '###': 'Heading 3' }) + - tr({ '####': 'Heading 4' }) + - tr({ '#####': 'Heading 5' }) + - tr({ '######': 'Heading 6' }) + - tr({ '---': 'Horizontal line' }) + - '
      '; - } - - // Focus management section - html = html + - '

      ' + __( 'Focus shortcuts:' ) + '

      ' + - '' + - tr({ 'Alt + F8': 'Inline toolbar (when an image, link or preview is selected)' }) + - tr({ 'Alt + F9': 'Editor menu (when enabled)' }) + - tr({ 'Alt + F10': 'Editor toolbar' }) + - tr({ 'Alt + F11': 'Elements path' }) + - '
      ' + - '

      ' + __( 'To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.' ) + '

      '; - - html += '
      '; - - dialog = editor.windowManager.open( { - title: 'Keyboard Shortcuts', - items: { - type: 'container', - classes: 'wp-help', - html: html - }, - buttons: { - text: 'Close', - onclick: 'close' - } - } ); - - if ( dialog.$el ) { - dialog.$el.find( 'div[role="application"]' ).attr( 'role', 'document' ); - $wrap = dialog.$el.find( '.mce-wp-help' ); - - if ( $wrap[0] ) { - $wrap.attr( 'tabindex', '0' ); - $wrap[0].focus(); - $wrap.on( 'keydown', function( event ) { - // Prevent use of: page up, page down, end, home, left arrow, up arrow, right arrow, down arrow - // in the dialog keydown handler. - if ( event.keyCode >= 33 && event.keyCode <= 40 ) { - event.stopPropagation(); - } - }); - } - } - } ); - - editor.addCommand( 'WP_Medialib', function() { - if ( wp && wp.media && wp.media.editor ) { - wp.media.editor.open( editor.id ); - } - }); - - // Register buttons - editor.addButton( 'wp_more', { - tooltip: 'Insert Read More tag', - onclick: function() { - editor.execCommand( 'WP_More', 'more' ); - } - }); - - editor.addButton( 'wp_page', { - tooltip: 'Page break', - onclick: function() { - editor.execCommand( 'WP_More', 'nextpage' ); - } - }); - - editor.addButton( 'wp_help', { - tooltip: 'Keyboard Shortcuts', - cmd: 'WP_Help' - }); - - editor.addButton( 'wp_code', { - tooltip: 'Code', - cmd: 'WP_Code', - stateSelector: 'code' - }); - - // Menubar - // Insert->Add Media - if ( wp && wp.media && wp.media.editor ) { - editor.addMenuItem( 'add_media', { - text: 'Add Media', - icon: 'wp-media-library', - context: 'insert', - cmd: 'WP_Medialib' - }); - } - - // Insert "Read More..." - editor.addMenuItem( 'wp_more', { - text: 'Insert Read More tag', - icon: 'wp_more', - context: 'insert', - onclick: function() { - editor.execCommand( 'WP_More', 'more' ); - } - }); - - // Insert "Next Page" - editor.addMenuItem( 'wp_page', { - text: 'Page break', - icon: 'wp_page', - context: 'insert', - onclick: function() { - editor.execCommand( 'WP_More', 'nextpage' ); - } - }); - - editor.on( 'BeforeExecCommand', function(e) { - if ( tinymce.Env.webkit && ( e.command === 'InsertUnorderedList' || e.command === 'InsertOrderedList' ) ) { - if ( ! style ) { - style = editor.dom.create( 'style', {'type': 'text/css'}, - '#tinymce,#tinymce span,#tinymce li,#tinymce li>span,#tinymce p,#tinymce p>span{font:medium sans-serif;color:#000;line-height:normal;}'); - } - - editor.getDoc().head.appendChild( style ); - } - }); - - editor.on( 'ExecCommand', function( e ) { - if ( tinymce.Env.webkit && style && - ( 'InsertUnorderedList' === e.command || 'InsertOrderedList' === e.command ) ) { - - editor.dom.remove( style ); - } - }); - - editor.on( 'init', function() { - var env = tinymce.Env, - bodyClass = ['mceContentBody'], // back-compat for themes that use this in editor-style.css... - doc = editor.getDoc(), - dom = editor.dom; - - if ( env.iOS ) { - dom.addClass( doc.documentElement, 'ios' ); - } - - if ( editor.getParam( 'directionality' ) === 'rtl' ) { - bodyClass.push('rtl'); - dom.setAttrib( doc.documentElement, 'dir', 'rtl' ); - } - - dom.setAttrib( doc.documentElement, 'lang', editor.getParam( 'wp_lang_attr' ) ); - - if ( env.ie ) { - if ( parseInt( env.ie, 10 ) === 9 ) { - bodyClass.push('ie9'); - } else if ( parseInt( env.ie, 10 ) === 8 ) { - bodyClass.push('ie8'); - } else if ( env.ie < 8 ) { - bodyClass.push('ie7'); - } - } else if ( env.webkit ) { - bodyClass.push('webkit'); - } - - bodyClass.push('wp-editor'); - - each( bodyClass, function( cls ) { - if ( cls ) { - dom.addClass( doc.body, cls ); - } - }); - - // Remove invalid parent paragraphs when inserting HTML - editor.on( 'BeforeSetContent', function( event ) { - if ( event.content ) { - event.content = event.content.replace( /

      \s*<(p|div|ul|ol|dl|table|blockquote|h[1-6]|fieldset|pre)( [^>]*)?>/gi, '<$1$2>' ) - .replace( /<\/(p|div|ul|ol|dl|table|blockquote|h[1-6]|fieldset|pre)>\s*<\/p>/gi, '' ); - } - }); - - if ( $ ) { - $( document ).triggerHandler( 'tinymce-editor-init', [editor] ); - } - - if ( window.tinyMCEPreInit && window.tinyMCEPreInit.dragDropUpload ) { - dom.bind( doc, 'dragstart dragend dragover drop', function( event ) { - if ( $ ) { - // Trigger the jQuery handlers. - $( document ).trigger( new $.Event( event ) ); - } - }); - } - - if ( editor.getParam( 'wp_paste_filters', true ) ) { - editor.on( 'PastePreProcess', function( event ) { - // Remove trailing
      added by WebKit browsers to the clipboard - event.content = event.content.replace( /
      /gi, '' ); - - // In WebKit this is handled by removeWebKitStyles() - if ( ! tinymce.Env.webkit ) { - // Remove all inline styles - event.content = event.content.replace( /(<[^>]+) style="[^"]*"([^>]*>)/gi, '$1$2' ); - - // Put back the internal styles - event.content = event.content.replace(/(<[^>]+) data-mce-style=([^>]+>)/gi, '$1 style=$2' ); - } - }); - - editor.on( 'PastePostProcess', function( event ) { - // Remove empty paragraphs - each( dom.select( 'p', event.node ), function( node ) { - if ( dom.isEmpty( node ) ) { - dom.remove( node ); - } - }); - }); - } - - if ( editor.settings.wp_shortcut_labels && editor.theme.panel ) { - var labels = {}; - var access = 'Shift+Alt+'; - var meta = 'Ctrl+'; - - // For Mac: ctrl = \u2303, cmd = \u2318, alt = \u2325 - - if ( tinymce.Env.mac ) { - access = '\u2303\u2325'; - meta = '\u2318'; - } - - each( editor.settings.wp_shortcut_labels, function( value, name ) { - labels[ name ] = value.replace( 'access', access ).replace( 'meta', meta ); - } ); - - each( editor.theme.panel.find('button'), function( button ) { - if ( button && button.settings.tooltip && labels.hasOwnProperty( button.settings.tooltip ) ) { - // Need to translate now. We are changing the string so it won't match and cannot be translated later. - button.settings.tooltip = editor.translate( button.settings.tooltip ) + ' (' + labels[ button.settings.tooltip ] + ')'; - } - } ); - - // listbox for the "blocks" drop-down - each( editor.theme.panel.find('listbox'), function( listbox ) { - if ( listbox && listbox.settings.text === 'Paragraph' ) { - each( listbox.settings.values, function( item ) { - if ( item.text && labels.hasOwnProperty( item.text ) ) { - item.shortcut = '(' + labels[ item.text ] + ')'; - } - } ); - } - } ); - } - }); - - editor.on( 'SaveContent', function( event ) { - // If editor is hidden, we just want the textarea's value to be saved - if ( ! editor.inline && editor.isHidden() ) { - event.content = event.element.value; - return; - } - - // Keep empty paragraphs :( - event.content = event.content.replace( /

      (?:
      |\u00a0|\uFEFF| )*<\/p>/g, '

       

      ' ); - - if ( hasWpautop ) { - event.content = wp.editor.removep( event.content ); - } - }); - - editor.on( 'preInit', function() { - var validElementsSetting = '@[id|accesskey|class|dir|lang|style|tabindex|' + - 'title|contenteditable|draggable|dropzone|hidden|spellcheck|translate],' + // Global attributes. - 'i,' + // Don't replace with and with and don't remove them when empty. - 'b,' + - 'script[src|async|defer|type|charset|crossorigin|integrity]'; // Add support for '); - tinymce.ScriptLoader.markDone(url); - } - } - }, - - /** - * Executes a color picker on the specified element id. When the user - * then selects a color it will be set as the value of the specified element. - * - * @method pickColor - * @param {DOMEvent} e DOM event object. - * @param {string} element_id Element id to be filled with the color value from the picker. - */ - pickColor : function(e, element_id) { - var el = document.getElementById(element_id), colorPickerCallback = this.editor.settings.color_picker_callback; - if (colorPickerCallback) { - colorPickerCallback.call( - this.editor, - function (value) { - el.value = value; - try { - el.onchange(); - } catch (ex) { - // Try fire event, ignore errors - } - }, - el.value - ); - } - }, - - /** - * Opens a filebrowser/imagebrowser this will set the output value from - * the browser as a value on the specified element. - * - * @method openBrowser - * @param {string} element_id Id of the element to set value in. - * @param {string} type Type of browser to open image/file/flash. - * @param {string} option Option name to get the file_broswer_callback function name from. - */ - openBrowser : function(element_id, type) { - tinyMCEPopup.restoreSelection(); - this.editor.execCallback('file_browser_callback', element_id, document.getElementById(element_id).value, type, window); - }, - - /** - * Creates a confirm dialog. Please don't use the blocking behavior of this - * native version use the callback method instead then it can be extended. - * - * @method confirm - * @param {String} t Title for the new confirm dialog. - * @param {function} cb Callback function to be executed after the user has selected ok or cancel. - * @param {Object} s Optional scope to execute the callback in. - */ - confirm : function(t, cb, s) { - this.editor.windowManager.confirm(t, cb, s, window); - }, - - /** - * Creates a alert dialog. Please don't use the blocking behavior of this - * native version use the callback method instead then it can be extended. - * - * @method alert - * @param {String} tx Title for the new alert dialog. - * @param {function} cb Callback function to be executed after the user has selected ok. - * @param {Object} s Optional scope to execute the callback in. - */ - alert : function(tx, cb, s) { - this.editor.windowManager.alert(tx, cb, s, window); - }, - - /** - * Closes the current window. - * - * @method close - */ - close : function() { - var t = this; - - // To avoid domain relaxing issue in Opera - function close() { - t.editor.windowManager.close(window); - tinymce = tinyMCE = t.editor = t.params = t.dom = t.dom.doc = null; // Cleanup - } - - if (tinymce.isOpera) { - t.getWin().setTimeout(close, 0); - } else { - close(); - } - }, - - // Internal functions - - _restoreSelection : function() { - var e = window.event.srcElement; - - if (e.nodeName == 'INPUT' && (e.type == 'submit' || e.type == 'button')) { - tinyMCEPopup.restoreSelection(); - } - }, - -/* _restoreSelection : function() { - var e = window.event.srcElement; - - // If user focus a non text input or textarea - if ((e.nodeName != 'INPUT' && e.nodeName != 'TEXTAREA') || e.type != 'text') - tinyMCEPopup.restoreSelection(); - },*/ - - _onDOMLoaded : function() { - var t = tinyMCEPopup, ti = document.title, h, nv; - - // Translate page - if (t.features.translate_i18n !== false) { - var map = { - "update": "Ok", - "insert": "Ok", - "cancel": "Cancel", - "not_set": "--", - "class_name": "Class name", - "browse": "Browse" - }; - - var langCode = (tinymce.settings ? tinymce.settings : t.editor.settings).language || 'en'; - for (var key in map) { - tinymce.i18n.data[langCode + "." + key] = tinymce.i18n.translate(map[key]); - } - - h = document.body.innerHTML; - - // Replace a=x with a="x" in IE - if (tinymce.isIE) { - h = h.replace(/ (value|title|alt)=([^"][^\s>]+)/gi, ' $1="$2"'); - } - - document.dir = t.editor.getParam('directionality',''); - - if ((nv = t.editor.translate(h)) && nv != h) { - document.body.innerHTML = nv; - } - - if ((nv = t.editor.translate(ti)) && nv != ti) { - document.title = ti = nv; - } - } - - if (!t.editor.getParam('browser_preferred_colors', false) || !t.isWindow) { - t.dom.addClass(document.body, 'forceColors'); - } - - document.body.style.display = ''; - - // Restore selection in IE when focus is placed on a non textarea or input element of the type text - if (tinymce.Env.ie) { - if (tinymce.Env.ie < 11) { - document.attachEvent('onmouseup', tinyMCEPopup._restoreSelection); - - // Add base target element for it since it would fail with modal dialogs - t.dom.add(t.dom.select('head')[0], 'base', {target: '_self'}); - } else { - document.addEventListener('mouseup', tinyMCEPopup._restoreSelection, false); - } - } - - t.restoreSelection(); - t.resizeToInnerSize(); - - // Set inline title - if (!t.isWindow) { - t.editor.windowManager.setTitle(window, ti); - } else { - window.focus(); - } - - if (!tinymce.isIE && !t.isWindow) { - t.dom.bind(document, 'focus', function() { - t.editor.windowManager.focus(t.id); - }); - } - - // Patch for accessibility - tinymce.each(t.dom.select('select'), function(e) { - e.onkeydown = tinyMCEPopup._accessHandler; - }); - - // Call onInit - // Init must be called before focus so the selection won't get lost by the focus call - tinymce.each(t.listeners, function(o) { - o.func.call(o.scope, t.editor); - }); - - // Move focus to window - if (t.getWindowArg('mce_auto_focus', true)) { - window.focus(); - - // Focus element with mceFocus class - tinymce.each(document.forms, function(f) { - tinymce.each(f.elements, function(e) { - if (t.dom.hasClass(e, 'mceFocus') && !e.disabled) { - e.focus(); - return false; // Break loop - } - }); - }); - } - - document.onkeyup = tinyMCEPopup._closeWinKeyHandler; - - if ('textContent' in document) { - t.uiWindow.getEl('head').firstChild.textContent = document.title; - } else { - t.uiWindow.getEl('head').firstChild.innerText = document.title; - } - }, - - _accessHandler : function(e) { - e = e || window.event; - - if (e.keyCode == 13 || e.keyCode == 32) { - var elm = e.target || e.srcElement; - - if (elm.onchange) { - elm.onchange(); - } - - return tinymce.dom.Event.cancel(e); - } - }, - - _closeWinKeyHandler : function(e) { - e = e || window.event; - - if (e.keyCode == 27) { - tinyMCEPopup.close(); - } - }, - - _eventProxy: function(id) { - return function(evt) { - tinyMCEPopup.dom.events.callNativeHandler(id, evt); - }; - } -}; - -tinyMCEPopup.init(); - -tinymce.util.Dispatcher = function(scope) { - this.scope = scope || this; - this.listeners = []; - - this.add = function(callback, scope) { - this.listeners.push({cb : callback, scope : scope || this.scope}); - - return callback; - }; - - this.addToTop = function(callback, scope) { - var self = this, listener = {cb : callback, scope : scope || self.scope}; - - // Create new listeners if addToTop is executed in a dispatch loop - if (self.inDispatch) { - self.listeners = [listener].concat(self.listeners); - } else { - self.listeners.unshift(listener); - } - - return callback; - }; - - this.remove = function(callback) { - var listeners = this.listeners, output = null; - - tinymce.each(listeners, function(listener, i) { - if (callback == listener.cb) { - output = listener; - listeners.splice(i, 1); - return false; - } - }); - - return output; - }; - - this.dispatch = function() { - var self = this, returnValue, args = arguments, i, listeners = self.listeners, listener; - - self.inDispatch = true; - - // Needs to be a real loop since the listener count might change while looping - // And this is also more efficient - for (i = 0; i < listeners.length; i++) { - listener = listeners[i]; - returnValue = listener.cb.apply(listener.scope, args.length > 0 ? args : [listener.scope]); - - if (returnValue === false) { - break; - } - } - - self.inDispatch = false; - - return returnValue; - }; -}; diff --git a/wp/wp-includes/js/tinymce/tinymce.min.js b/wp/wp-includes/js/tinymce/tinymce.min.js deleted file mode 100644 index e49db5ac..00000000 --- a/wp/wp-includes/js/tinymce/tinymce.min.js +++ /dev/null @@ -1,14 +0,0 @@ -// 4.5.6 (2017-03-30) -!function(e,t){"use strict";function n(e,t){for(var n,r=[],i=0;i=r.x&&o.x+o.w<=r.w+r.x&&o.y>=r.y&&o.y+o.h<=r.h+r.y)return i[a];return null}function n(e,t,n){return o(e.x-t,e.y-n,e.w+2*t,e.h+2*n)}function r(e,t){var n,r,i,a;return n=l(e.x,t.x),r=l(e.y,t.y),i=s(e.x+e.w,t.x+t.w),a=s(e.y+e.h,t.y+t.h),i-n<0||a-r<0?null:o(n,r,i-n,a-r)}function i(e,t,n){var r,i,a,s,u,c,d,f,p,h;return u=e.x,c=e.y,d=e.x+e.w,f=e.y+e.h,p=t.x+t.w,h=t.y+t.h,r=l(0,t.x-u),i=l(0,t.y-c),a=l(0,d-p),s=l(0,f-h),u+=r,c+=i,n&&(d+=r,f+=i,u-=a,c-=s),d-=a,f-=s,o(u,c,d-u,f-c)}function o(e,t,n,r){return{x:e,y:t,w:n,h:r}}function a(e){return o(e.left,e.top,e.width,e.height)}var s=Math.min,l=Math.max,u=Math.round;return{inflate:n,relativePosition:e,findBestRelativePosition:t,intersect:r,clamp:i,create:o,fromClientRect:a}}),r(u,[],function(){function e(e,t){return function(){e.apply(t,arguments)}}function t(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],s(t,e(r,this),e(i,this))}function n(e){var t=this;return null===this._state?void this._deferreds.push(e):void l(function(){var n=t._state?e.onFulfilled:e.onRejected;if(null===n)return void(t._state?e.resolve:e.reject)(t._value);var r;try{r=n(t._value)}catch(i){return void e.reject(i)}e.resolve(r)})}function r(t){try{if(t===this)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var n=t.then;if("function"==typeof n)return void s(e(n,t),e(r,this),e(i,this))}this._state=!0,this._value=t,o.call(this)}catch(a){i.call(this,a)}}function i(e){this._state=!1,this._value=e,o.call(this)}function o(){for(var e=0,t=this._deferreds.length;e=534;return{opera:r,webkit:i,ie:o,gecko:l,mac:u,iOS:c,android:d,contentEditable:g,transparentSrc:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",caretAfter:8!=o,range:window.getSelection&&"Range"in window,documentMode:o&&!s?document.documentMode||7:10,fileApi:f,ceFalse:o===!1||o>8,canHaveCSP:o===!1||o>11,desktop:!p&&!h,windowsPhone:m}}),r(f,[c,d],function(e,t){function n(e,t,n,r){e.addEventListener?e.addEventListener(t,n,r||!1):e.attachEvent&&e.attachEvent("on"+t,n)}function r(e,t,n,r){e.removeEventListener?e.removeEventListener(t,n,r||!1):e.detachEvent&&e.detachEvent("on"+t,n)}function i(e,t){var n,r=t;return n=e.path,n&&n.length>0&&(r=n[0]),e.deepPath&&(n=e.deepPath(),n&&n.length>0&&(r=n[0])),r}function o(e,n){function r(){return!1}function o(){return!0}var a,s=n||{},l;for(a in e)c[a]||(s[a]=e[a]);if(s.target||(s.target=s.srcElement||document),t.experimentalShadowDom&&(s.target=i(e,s.target)),e&&u.test(e.type)&&e.pageX===l&&e.clientX!==l){var d=s.target.ownerDocument||document,f=d.documentElement,p=d.body;s.pageX=e.clientX+(f&&f.scrollLeft||p&&p.scrollLeft||0)-(f&&f.clientLeft||p&&p.clientLeft||0),s.pageY=e.clientY+(f&&f.scrollTop||p&&p.scrollTop||0)-(f&&f.clientTop||p&&p.clientTop||0)}return s.preventDefault=function(){s.isDefaultPrevented=o,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},s.stopPropagation=function(){s.isPropagationStopped=o,e&&(e.stopPropagation?e.stopPropagation():e.cancelBubble=!0)},s.stopImmediatePropagation=function(){s.isImmediatePropagationStopped=o,s.stopPropagation()},s.isDefaultPrevented||(s.isDefaultPrevented=r,s.isPropagationStopped=r,s.isImmediatePropagationStopped=r),"undefined"==typeof s.metaKey&&(s.metaKey=!1),s}function a(t,i,o){function a(){o.domLoaded||(o.domLoaded=!0,i(c))}function s(){("complete"===u.readyState||"interactive"===u.readyState&&u.body)&&(r(u,"readystatechange",s),a())}function l(){try{u.documentElement.doScroll("left")}catch(t){return void e.setTimeout(l)}a()}var u=t.document,c={type:"ready"};return o.domLoaded?void i(c):(u.addEventListener?"complete"===u.readyState?a():n(t,"DOMContentLoaded",a):(n(u,"readystatechange",s),u.documentElement.doScroll&&t.self===t.top&&l()),void n(t,"load",a))}function s(){function e(e,t){var n,r,o,a,s=i[t];if(n=s&&s[e.type])for(r=0,o=n.length;rw.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[F]=!0,e}function i(e){var t=D.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=e.length;r--;)w.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||X)-(~e.sourceIndex||X);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function l(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function u(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&typeof e.getElementsByTagName!==Y&&e}function d(){}function f(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function m(t,n,r){for(var i=0,o=n.length;i-1&&(r[u]=!(a[u]=d))}}else b=g(b===a?b.splice(h,b.length):b),o?o(null,a,b,l):Z.apply(a,b)})}function y(e){for(var t,n,r,i=e.length,o=w.relative[e[0].type],a=o||w.relative[" "],s=o?1:0,l=p(function(e){return e===t},a,!0),u=p(function(e){return te.call(t,e)>-1},a,!0),c=[function(e,n,r){return!o&&(r||n!==T)||((t=n).nodeType?l(e,n,r):u(e,n,r))}];s1&&h(c),s>1&&f(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=t.length>0,a=function(r,a,s,l,u){var c,d,f,p=0,h="0",m=r&&[],v=[],y=T,b=r||o&&w.find.TAG("*",u),C=U+=null==y?1:Math.random()||.1,x=b.length;for(u&&(T=a!==D&&a);h!==x&&null!=(c=b[h]);h++){if(o&&c){for(d=0;f=t[d++];)if(f(c,a,s)){l.push(c);break}u&&(U=C)}i&&((c=!f&&c)&&p--,r&&m.push(c))}if(p+=h,i&&h!==p){for(d=0;f=n[d++];)f(m,v,a,s);if(r){if(p>0)for(;h--;)m[h]||v[h]||(v[h]=J.call(l));v=g(v)}Z.apply(l,v),u&&!r&&v.length>0&&p+n.length>1&&e.uniqueSort(l)}return u&&(U=C,T=y),m};return i?r(a):a}var C,x,w,E,N,_,S,k,T,R,A,B,D,L,M,P,O,H,I,F="sizzle"+-new Date,z=window.document,U=0,W=0,V=n(),$=n(),q=n(),j=function(e,t){return e===t&&(A=!0),0},Y=typeof t,X=1<<31,K={}.hasOwnProperty,G=[],J=G.pop,Q=G.push,Z=G.push,ee=G.slice,te=G.indexOf||function(e){for(var t=0,n=this.length;t+~]|"+re+")"+re+"*"),ce=new RegExp("="+re+"*([^\\]'\"]*?)"+re+"*\\]","g"),de=new RegExp(ae),fe=new RegExp("^"+ie+"$"),pe={ID:new RegExp("^#("+ie+")"),CLASS:new RegExp("^\\.("+ie+")"),TAG:new RegExp("^("+ie+"|[*])"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ae),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+re+"*(even|odd|(([+-]|)(\\d*)n|)"+re+"*(?:([+-]|)"+re+"*(\\d+)|))"+re+"*\\)|)","i"),bool:new RegExp("^(?:"+ne+")$","i"),needsContext:new RegExp("^"+re+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+re+"*((?:-\\d)?\\d*)"+re+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,me=/^h\d$/i,ge=/^[^{]+\{\s*\[native \w/,ve=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,be=/'|\\/g,Ce=new RegExp("\\\\([\\da-f]{1,6}"+re+"?|("+re+")|.)","ig"),xe=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)};try{Z.apply(G=ee.call(z.childNodes),z.childNodes),G[z.childNodes.length].nodeType}catch(we){Z={apply:G.length?function(e,t){Q.apply(e,ee.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}x=e.support={},N=e.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},B=e.setDocument=function(e){function t(e){try{return e.top}catch(t){}return null}var n,r=e?e.ownerDocument||e:z,o=r.defaultView;return r!==D&&9===r.nodeType&&r.documentElement?(D=r,L=r.documentElement,M=!N(r),o&&o!==t(o)&&(o.addEventListener?o.addEventListener("unload",function(){B()},!1):o.attachEvent&&o.attachEvent("onunload",function(){B()})),x.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),x.getElementsByTagName=i(function(e){return e.appendChild(r.createComment("")),!e.getElementsByTagName("*").length}),x.getElementsByClassName=ge.test(r.getElementsByClassName),x.getById=i(function(e){return L.appendChild(e).id=F,!r.getElementsByName||!r.getElementsByName(F).length}),x.getById?(w.find.ID=function(e,t){if(typeof t.getElementById!==Y&&M){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},w.filter.ID=function(e){var t=e.replace(Ce,xe);return function(e){return e.getAttribute("id")===t}}):(delete w.find.ID,w.filter.ID=function(e){var t=e.replace(Ce,xe);return function(e){var n=typeof e.getAttributeNode!==Y&&e.getAttributeNode("id");return n&&n.value===t}}),w.find.TAG=x.getElementsByTagName?function(e,t){if(typeof t.getElementsByTagName!==Y)return t.getElementsByTagName(e)}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},w.find.CLASS=x.getElementsByClassName&&function(e,t){if(M)return t.getElementsByClassName(e)},O=[],P=[],(x.qsa=ge.test(r.querySelectorAll))&&(i(function(e){e.innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&P.push("[*^$]="+re+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||P.push("\\["+re+"*(?:value|"+ne+")"),e.querySelectorAll(":checked").length||P.push(":checked")}),i(function(e){var t=r.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&P.push("name"+re+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||P.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),P.push(",.*:")})),(x.matchesSelector=ge.test(H=L.matches||L.webkitMatchesSelector||L.mozMatchesSelector||L.oMatchesSelector||L.msMatchesSelector))&&i(function(e){x.disconnectedMatch=H.call(e,"div"),H.call(e,"[s!='']:x"),O.push("!=",ae)}),P=P.length&&new RegExp(P.join("|")),O=O.length&&new RegExp(O.join("|")),n=ge.test(L.compareDocumentPosition),I=n||ge.test(L.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},j=n?function(e,t){if(e===t)return A=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!x.sortDetached&&t.compareDocumentPosition(e)===n?e===r||e.ownerDocument===z&&I(z,e)?-1:t===r||t.ownerDocument===z&&I(z,t)?1:R?te.call(R,e)-te.call(R,t):0:4&n?-1:1)}:function(e,t){if(e===t)return A=!0,0;var n,i=0,o=e.parentNode,s=t.parentNode,l=[e],u=[t];if(!o||!s)return e===r?-1:t===r?1:o?-1:s?1:R?te.call(R,e)-te.call(R,t):0;if(o===s)return a(e,t);for(n=e;n=n.parentNode;)l.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;l[i]===u[i];)i++;return i?a(l[i],u[i]):l[i]===z?-1:u[i]===z?1:0},r):D},e.matches=function(t,n){return e(t,null,null,n)},e.matchesSelector=function(t,n){if((t.ownerDocument||t)!==D&&B(t),n=n.replace(ce,"='$1']"),x.matchesSelector&&M&&(!O||!O.test(n))&&(!P||!P.test(n)))try{var r=H.call(t,n);if(r||x.disconnectedMatch||t.document&&11!==t.document.nodeType)return r}catch(i){}return e(n,D,null,[t]).length>0},e.contains=function(e,t){return(e.ownerDocument||e)!==D&&B(e),I(e,t)},e.attr=function(e,n){(e.ownerDocument||e)!==D&&B(e);var r=w.attrHandle[n.toLowerCase()],i=r&&K.call(w.attrHandle,n.toLowerCase())?r(e,n,!M):t;return i!==t?i:x.attributes||!M?e.getAttribute(n):(i=e.getAttributeNode(n))&&i.specified?i.value:null},e.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},e.uniqueSort=function(e){var t,n=[],r=0,i=0;if(A=!x.detectDuplicates,R=!x.sortStable&&e.slice(0),e.sort(j),A){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return R=null,e},E=e.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=E(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=E(t);return n},w=e.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Ce,xe),e[3]=(e[3]||e[4]||e[5]||"").replace(Ce,xe),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||e.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&e.error(t[0]),t},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&de.test(n)&&(t=_(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Ce,xe).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=V[e+" "];return t||(t=new RegExp("(^|"+re+")"+e+"("+re+"|$)"))&&V(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==Y&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(i){var o=e.attr(i,t);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,d,f,p,h,m=o!==a?"nextSibling":"previousSibling",g=t.parentNode,v=s&&t.nodeName.toLowerCase(),y=!l&&!s;if(g){if(o){for(;m;){for(d=t;d=d[m];)if(s?d.nodeName.toLowerCase()===v:1===d.nodeType)return!1;h=m="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?g.firstChild:g.lastChild],a&&y){for(c=g[F]||(g[F]={}),u=c[e]||[],p=u[0]===U&&u[1],f=u[0]===U&&u[2],d=p&&g.childNodes[p];d=++p&&d&&d[m]||(f=p=0)||h.pop();)if(1===d.nodeType&&++f&&d===t){c[e]=[U,p,f];break}}else if(y&&(u=(t[F]||(t[F]={}))[e])&&u[0]===U)f=u[1];else for(;(d=++p&&d&&d[m]||(f=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==v:1!==d.nodeType)||!++f||(y&&((d[F]||(d[F]={}))[e]=[U,f]),d!==t)););return f-=i,f===r||f%r===0&&f/r>=0}}},PSEUDO:function(t,n){var i,o=w.pseudos[t]||w.setFilters[t.toLowerCase()]||e.error("unsupported pseudo: "+t);return o[F]?o(n):o.length>1?(i=[t,t,"",n],w.setFilters.hasOwnProperty(t.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=te.call(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=S(e.replace(se,"$1"));return i[F]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),!n.pop()}}),has:r(function(t){return function(n){return e(t,n).length>0}}),contains:r(function(e){return e=e.replace(Ce,xe),function(t){return(t.textContent||t.innerText||E(t)).indexOf(e)>-1}}),lang:r(function(t){return fe.test(t||"")||e.error("unsupported lang: "+t),t=t.replace(Ce,xe).toLowerCase(),function(e){var n;do if(n=M?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return n=n.toLowerCase(),n===t||0===n.indexOf(t+"-");while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=window.location&&window.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===L},focus:function(e){return e===D.activeElement&&(!D.hasFocus||D.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!w.pseudos.empty(e)},header:function(e){return me.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:u(function(){return[0]}),last:u(function(e,t){return[t-1]}),eq:u(function(e,t,n){return[n<0?n+t:n]}),even:u(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:u(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&x.getById&&9===t.nodeType&&M&&w.relative[o[1].type]){if(t=(w.find.ID(a.matches[0].replace(Ce,xe),t)||[])[0],!t)return n;u&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!w.relative[s=a.type]);)if((l=w.find[s])&&(r=l(a.matches[0].replace(Ce,xe),ye.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&f(o),!e)return Z.apply(n,r),n;break}}return(u||S(e,d))(r,t,!M,n,ye.test(e)&&c(t.parentNode)||t),n},x.sortStable=F.split("").sort(j).join("")===F,x.detectDuplicates=!!A,B(),x.sortDetached=i(function(e){return 1&e.compareDocumentPosition(D.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),x.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(ne,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),e}),r(h,[],function(){function e(e){var t=e,n,r;if(!c(e))for(t=[],n=0,r=e.length;n=0;i--)u(e,t[i],n,r);else for(i=0;i)[^>]*$|#([\w\-]*)$)/,S=e.Event,k,T=r.makeMap("children,contents,next,prev"),R=r.makeMap("fillOpacity fontWeight lineHeight opacity orphans widows zIndex zoom"," "),A=r.makeMap("checked compact declare defer disabled ismap multiple nohref noshade nowrap readonly selected"," "),B={"for":"htmlFor","class":"className",readonly:"readOnly"},D={"float":"cssFloat"},L={},M={},P=/^\s*|\s*$/g;return f.fn=f.prototype={constructor:f,selector:"",context:null,length:0,init:function(e,t){var n=this,r,i;if(!e)return n;if(e.nodeType)return n.context=n[0]=e,n.length=1,n;if(t&&t.nodeType)n.context=t;else{if(t)return f(e).attr(t);n.context=t=document}if(a(e)){if(n.selector=e,r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:_.exec(e),!r)return f(t).find(e);if(r[1])for(i=l(e,v(t)).firstChild;i;)E.call(n,i),i=i.nextSibling;else{if(i=v(t).getElementById(r[2]),!i)return n;if(i.id!==r[2])return n.find(e);n.length=1,n[0]=i}}else this.add(e,!1);return n},toArray:function(){return r.toArray(this)},add:function(e,t){var n=this,r,i;if(a(e))return n.add(f(e));if(t!==!1)for(r=f.unique(n.toArray().concat(f.makeArray(e))),n.length=r.length,i=0;i1&&(T[e]||(i=f.unique(i)),0===e.indexOf("parents")&&(i=i.reverse())),i=f(i),n?i.filter(n):i}}),m({parentsUntil:function(e,t){return y(e,"parentNode",t)},nextUntil:function(e,t){return b(e,"nextSibling",1,t).slice(1)},prevUntil:function(e,t){return b(e,"previousSibling",1,t).slice(1)}},function(e,t){f.fn[e]=function(n,r){var i=this,o=[];return i.each(function(){var e=t.call(o,this,n,o);e&&(f.isArray(e)?o.push.apply(o,e):o.push(e))}),this.length>1&&(o=f.unique(o),0!==e.indexOf("parents")&&"prevUntil"!==e||(o=o.reverse())),o=f(o),r?o.filter(r):o}}),f.fn.is=function(e){return!!e&&this.filter(e).length>0},f.fn.init.prototype=f.fn,f.overrideDefaults=function(e){function t(r,i){return n=n||e(),0===arguments.length&&(r=n.element),i||(i=n.context),new t.fn.init(r,i)}var n;return f.extend(t,this),t},i.ie&&i.ie<8&&(x(L,"get",{maxlength:function(e){var t=e.maxLength;return 2147483647===t?k:t},size:function(e){var t=e.size;return 20===t?k:t},"class":function(e){return e.className},style:function(e){var t=e.style.cssText;return 0===t.length?k:t}}),x(L,"set",{"class":function(e,t){e.className=t},style:function(e,t){e.style.cssText=t}})),i.ie&&i.ie<9&&(D["float"]="styleFloat",x(M,"set",{opacity:function(e,t){var n=e.style;null===t||""===t?n.removeAttribute("filter"):(n.zoom=1,n.filter="alpha(opacity="+100*t+")")}})),f.attrHooks=L,f.cssHooks=M,f}),r(v,[],function(){return function(e,t){function n(e,t,n,r){function i(e){return e=parseInt(e,10).toString(16),e.length>1?e:"0"+e}return"#"+i(t)+i(n)+i(r)}var r=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,i=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,o=/\s*([^:]+):\s*([^;]+);?/g,a=/\s+$/,s,l={},u,c,d,f="\ufeff";for(e=e||{},t&&(c=t.getValidStyles(),d=t.getInvalidStyles()),u=("\\\" \\' \\; \\: ; : "+f).split(" "),s=0;s-1&&n||(y[e+t]=s==-1?l[0]:l.join(" "),delete y[e+"-top"+t],delete y[e+"-right"+t],delete y[e+"-bottom"+t],delete y[e+"-left"+t])}}function c(e){var t=y[e],n;if(t){for(t=t.split(" "),n=t.length;n--;)if(t[n]!==t[0])return!1;return y[e]=t[0],!0}}function d(e,t,n,r){c(t)&&c(n)&&c(r)&&(y[e]=y[t]+" "+y[n]+" "+y[r],delete y[t],delete y[n],delete y[r])}function p(e){return w=!0,l[e]}function h(e,t){return w&&(e=e.replace(/\uFEFF[0-9]/g,function(e){return l[e]})),t||(e=e.replace(/\\([\'\";:])/g,"$1")),e}function m(e){return String.fromCharCode(parseInt(e.slice(1),16))}function g(e){return e.replace(/\\[0-9a-f]+/gi,m)}function v(t,n,r,i,o,a){if(o=o||a)return o=h(o),"'"+o.replace(/\'/g,"\\'")+"'";if(n=h(n||r||i),!e.allow_script_urls){var s=n.replace(/[\s\r\n]+/g,"");if(/(java|vb)script:/i.test(s))return"";if(!e.allow_svg_data_urls&&/^data:image\/svg/i.test(s))return""}return E&&(n=E.call(N,n,"style")),"url('"+n.replace(/\'/g,"\\'")+"')"}var y={},b,C,x,w,E=e.url_converter,N=e.url_converter_scope||this;if(t){for(t=t.replace(/[\u0000-\u001F]/g,""),t=t.replace(/\\[\"\';:\uFEFF]/g,p).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(e){return e.replace(/[;:]/g,p)});b=o.exec(t);)if(o.lastIndex=b.index+b[0].length,C=b[1].replace(a,"").toLowerCase(),x=b[2].replace(a,""),C&&x){if(C=g(C),x=g(x),C.indexOf(f)!==-1||C.indexOf('"')!==-1)continue;if(!e.allow_script_urls&&("behavior"==C||/expression\s*\(|\/\*|\*\//.test(x)))continue;"font-weight"===C&&"700"===x?x="bold":"color"!==C&&"background-color"!==C||(x=x.toLowerCase()),x=x.replace(r,n),x=x.replace(i,v),y[C]=w?h(x,!0):x}u("border","",!0),u("border","-width"),u("border","-color"),u("border","-style"),u("padding",""),u("margin",""),d("border","border-width","border-style","border-color"),"medium none"===y.border&&delete y.border,"none"===y["border-image"]&&delete y["border-image"]}return y},serialize:function(e,t){function n(t){var n,r,o,a;if(n=c[t])for(r=0,o=n.length;r0?" ":"")+t+": "+a+";")}function r(e,t){var n;return n=d["*"],(!n||!n[e])&&(n=d[t],!n||!n[e])}var i="",o,a;if(t&&c)n("*"),n(t);else for(o in e)a=e[o],!a||d&&!r(o,t)||(i+=(i.length>0?" ":"")+o+": "+a+";");return i}}}}),r(y,[],function(){return function(e,t){function n(e,n,r,i){var o,a;if(e){if(!i&&e[n])return e[n];if(e!=t){if(o=e[r])return o;for(a=e.parentNode;a&&a!=t;a=a.parentNode)if(o=a[r])return o}}}function r(e,n,r,i){var o,a,s;if(e){if(o=e[r],t&&o===t)return;if(o){if(!i)for(s=o[n];s;s=s[n])if(!s[n])return s;return o}if(a=e.parentNode,a&&a!==t)return a}}var i=e;this.current=function(){return i},this.next=function(e){return i=n(i,"firstChild","nextSibling",e)},this.prev=function(e){return i=n(i,"lastChild","previousSibling",e)},this.prev2=function(e){return i=r(i,"lastChild","previousSibling",e)}}}),r(b,[m],function(e){function t(n){function r(){return P.createDocumentFragment()}function i(e,t){E(F,e,t)}function o(e,t){E(z,e,t)}function a(e){i(e.parentNode,j(e))}function s(e){i(e.parentNode,j(e)+1)}function l(e){o(e.parentNode,j(e))}function u(e){o(e.parentNode,j(e)+1)}function c(e){e?(M[V]=M[W],M[$]=M[U]):(M[W]=M[V],M[U]=M[$]),M.collapsed=F}function d(e){a(e),u(e)}function f(e){i(e,0),o(e,1===e.nodeType?e.childNodes.length:e.nodeValue.length)}function p(e,t){var n=M[W],r=M[U],i=M[V],o=M[$],a=t.startContainer,s=t.startOffset,l=t.endContainer,u=t.endOffset;return 0===e?w(n,r,a,s):1===e?w(i,o,a,s):2===e?w(i,o,l,u):3===e?w(n,r,l,u):void 0}function h(){N(I)}function m(){return N(O)}function g(){return N(H)}function v(e){var t=this[W],r=this[U],i,o;3!==t.nodeType&&4!==t.nodeType||!t.nodeValue?(t.childNodes.length>0&&(o=t.childNodes[r]),o?t.insertBefore(e,o):3==t.nodeType?n.insertAfter(e,t):t.appendChild(e)):r?r>=t.nodeValue.length?n.insertAfter(e,t):(i=t.splitText(r),t.parentNode.insertBefore(e,i)):t.parentNode.insertBefore(e,t)}function y(e){var t=M.extractContents();M.insertNode(e),e.appendChild(t),M.selectNode(e)}function b(){return q(new t(n),{startContainer:M[W],startOffset:M[U],endContainer:M[V],endOffset:M[$],collapsed:M.collapsed,commonAncestorContainer:M.commonAncestorContainer})}function C(e,t){var n;if(3==e.nodeType)return e;if(t<0)return e;for(n=e.firstChild;n&&t>0;)--t,n=n.nextSibling;return n?n:e}function x(){return M[W]==M[V]&&M[U]==M[$]}function w(e,t,r,i){var o,a,s,l,u,c;if(e==r)return t==i?0:t0&&M.collapse(e):M.collapse(e),M.collapsed=x(),M.commonAncestorContainer=n.findCommonAncestor(M[W],M[V])}function N(e){var t,n=0,r=0,i,o,a,s,l,u;if(M[W]==M[V])return _(e);for(t=M[V],i=t.parentNode;i;t=i,i=i.parentNode){if(i==M[W])return S(t,e);++n}for(t=M[W],i=t.parentNode;i;t=i,i=i.parentNode){if(i==M[V])return k(t,e);++r}for(o=r-n,a=M[W];o>0;)a=a.parentNode,o--;for(s=M[V];o<0;)s=s.parentNode,o++;for(l=a.parentNode,u=s.parentNode;l!=u;l=l.parentNode,u=u.parentNode)a=l,s=u;return T(a,s,e)}function _(e){var t,n,i,o,a,s,l,u,c;if(e!=I&&(t=r()),M[U]==M[$])return t;if(3==M[W].nodeType){if(n=M[W].nodeValue,i=n.substring(M[U],M[$]),e!=H&&(o=M[W],u=M[U],c=M[$]-M[U],0===u&&c>=o.nodeValue.length-1?o.parentNode.removeChild(o):o.deleteData(u,c),M.collapse(F)),e==I)return;return i.length>0&&t.appendChild(P.createTextNode(i)),t}for(o=C(M[W],M[U]),a=M[$]-M[U];o&&a>0;)s=o.nextSibling,l=D(o,e),t&&t.appendChild(l),--a,o=s;return e!=H&&M.collapse(F),t}function S(e,t){var n,i,o,a,s,l;if(t!=I&&(n=r()),i=R(e,t),n&&n.appendChild(i),o=j(e),a=o-M[U],a<=0)return t!=H&&(M.setEndBefore(e),M.collapse(z)),n;for(i=e.previousSibling;a>0;)s=i.previousSibling,l=D(i,t),n&&n.insertBefore(l,n.firstChild),--a,i=s;return t!=H&&(M.setEndBefore(e),M.collapse(z)),n}function k(e,t){var n,i,o,a,s,l;for(t!=I&&(n=r()),o=A(e,t),n&&n.appendChild(o),i=j(e),++i,a=M[$]-i,o=e.nextSibling;o&&a>0;)s=o.nextSibling,l=D(o,t),n&&n.appendChild(l),--a,o=s;return t!=H&&(M.setStartAfter(e),M.collapse(F)),n}function T(e,t,n){var i,o,a,s,l,u,c;for(n!=I&&(o=r()),i=A(e,n),o&&o.appendChild(i),a=j(e),s=j(t),++a,l=s-a,u=e.nextSibling;l>0;)c=u.nextSibling,i=D(u,n),o&&o.appendChild(i),u=c,--l;return i=R(t,n),o&&o.appendChild(i),n!=H&&(M.setStartAfter(e),M.collapse(F)),o}function R(e,t){var n=C(M[V],M[$]-1),r,i,o,a,s,l=n!=M[V];if(n==e)return B(n,l,z,t);for(r=n.parentNode,i=B(r,z,z,t);r;){for(;n;)o=n.previousSibling,a=B(n,l,z,t),t!=I&&i.insertBefore(a,i.firstChild),l=F,n=o;if(r==e)return i;n=r.previousSibling,r=r.parentNode,s=B(r,z,z,t),t!=I&&s.appendChild(i),i=s}}function A(e,t){var n=C(M[W],M[U]),r=n!=M[W],i,o,a,s,l;if(n==e)return B(n,r,F,t);for(i=n.parentNode,o=B(i,z,F,t);i;){for(;n;)a=n.nextSibling,s=B(n,r,F,t),t!=I&&o.appendChild(s),r=F,n=a;if(i==e)return o;n=i.nextSibling,i=i.parentNode,l=B(i,z,F,t),t!=I&&l.appendChild(o),o=l}}function B(e,t,r,i){var o,a,s,l,u;if(t)return D(e,i);if(3==e.nodeType){if(o=e.nodeValue,r?(l=M[U],a=o.substring(l),s=o.substring(0,l)):(l=M[$],a=o.substring(0,l),s=o.substring(l)),i!=H&&(e.nodeValue=s),i==I)return;return u=n.clone(e,z),u.nodeValue=a,u}if(i!=I)return n.clone(e,z)}function D(e,t){return t!=I?t==H?n.clone(e,F):e:void e.parentNode.removeChild(e)}function L(){return n.create("body",null,g()).outerText}var M=this,P=n.doc,O=0,H=1,I=2,F=!0,z=!1,U="startOffset",W="startContainer",V="endContainer",$="endOffset",q=e.extend,j=n.nodeIndex;return q(M,{startContainer:P,startOffset:0,endContainer:P,endOffset:0,collapsed:F,commonAncestorContainer:P,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:i,setEnd:o,setStartBefore:a,setStartAfter:s,setEndBefore:l,setEndAfter:u,collapse:c,selectNode:d,selectNodeContents:f,compareBoundaryPoints:p,deleteContents:h,extractContents:m,cloneContents:g,insertNode:v,surroundContents:y,cloneRange:b,toStringIE:L}),M}return t.prototype.toString=function(){return this.toStringIE()},t}),r(C,[m],function(e){function t(e){var t;return t=document.createElement("div"),t.innerHTML=e,t.textContent||t.innerText||e}function n(e,t){var n,r,i,a={};if(e){for(e=e.split(","),t=t||10,n=0;n\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,l=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,u=/[<>&\"\']/g,c=/&#([a-z0-9]+);?|&([a-z0-9]+);/gi,d={128:"\u20ac",130:"\u201a",131:"\u0192",132:"\u201e",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02c6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017d",145:"\u2018",146:"\u2019",147:"\u201c",148:"\u201d",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02dc",153:"\u2122",154:"\u0161",155:"\u203a",156:"\u0153",158:"\u017e",159:"\u0178"};o={'"':""","'":"'","<":"<",">":">","&":"&","`":"`"},a={"<":"<",">":">","&":"&",""":'"',"'":"'"},i=n("50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,t9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro",32);var f={encodeRaw:function(e,t){return e.replace(t?s:l,function(e){return o[e]||e})},encodeAllRaw:function(e){return(""+e).replace(u,function(e){return o[e]||e})},encodeNumeric:function(e,t){return e.replace(t?s:l,function(e){return e.length>1?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":o[e]||"&#"+e.charCodeAt(0)+";"})},encodeNamed:function(e,t,n){return n=n||i,e.replace(t?s:l,function(e){return o[e]||n[e]||e})},getEncodeFunc:function(e,t){function a(e,n){return e.replace(n?s:l,function(e){return o[e]||t[e]||"&#"+e.charCodeAt(0)+";"||e})}function u(e,n){return f.encodeNamed(e,n,t)}return t=n(t)||i,e=r(e.replace(/\+/g,",")),e.named&&e.numeric?a:e.named?t?u:f.encodeNamed:e.numeric?f.encodeNumeric:f.encodeRaw},decode:function(e){return e.replace(c,function(e,n){return n?(n="x"===n.charAt(0).toLowerCase()?parseInt(n.substr(1),16):parseInt(n,10),n>65535?(n-=65536,String.fromCharCode(55296+(n>>10),56320+(1023&n))):d[n]||String.fromCharCode(n)):a[e]||i[e]||t(e)})}};return f}),r(x,[m,c],function(e,t){return function(n,r){function i(e){n.getElementsByTagName("head")[0].appendChild(e)}function o(r,o,u){function c(){for(var e=b.passed,t=e.length;t--;)e[t]();b.status=2,b.passed=[],b.failed=[]}function d(){for(var e=b.failed,t=e.length;t--;)e[t]();b.status=3,b.passed=[],b.failed=[]}function f(){var e=navigator.userAgent.match(/WebKit\/(\d*)/);return!!(e&&e[1]<536)}function p(e,n){e()||((new Date).getTime()-y0)return v=n.createElement("style"),v.textContent='@import "'+r+'"',m(),void i(v);h()}i(g),g.href=r}}var a=0,s={},l;r=r||{},l=r.maxLoadTime||5e3,this.load=o}}),r(w,[p,g,v,f,y,b,C,d,m,x],function(e,n,r,i,o,a,s,l,u,c){function d(e,t){var n={},r=t.keep_values,i;return i={set:function(n,r,i){t.url_converter&&(r=t.url_converter.call(t.url_converter_scope||e,r,i,n[0])),n.attr("data-mce-"+i,r).attr(i,r)},get:function(e,t){return e.attr("data-mce-"+t)||e.attr(t)}},n={style:{set:function(e,t){return null!==t&&"object"==typeof t?void e.css(t):(r&&e.attr("data-mce-style",t),void e.attr("style",t))},get:function(t){var n=t.attr("data-mce-style")||t.attr("style");return n=e.serializeStyle(e.parseStyle(n),t[0].nodeName)}}},r&&(n.href=n.src=i),n}function f(e,t){var n=t.attr("style");n=e.serializeStyle(e.parseStyle(n),t[0].nodeName),n||(n=null),t.attr("data-mce-style",n)}function p(e,t){var n=0,r,i;if(e)for(r=e.nodeType,e=e.previousSibling;e;e=e.previousSibling)i=e.nodeType,(!t||3!=i||i!=r&&e.nodeValue.length)&&(n++,r=i);return n}function h(e,t){var o=this,a;o.doc=e,o.win=window,o.files={},o.counter=0,o.stdMode=!b||e.documentMode>=8,o.boxModel=!b||"CSS1Compat"==e.compatMode||o.stdMode,o.styleSheetLoader=new c(e),o.boundEvents=[],o.settings=t=t||{},o.schema=t.schema,o.styles=new r({url_converter:t.url_converter,url_converter_scope:t.url_converter_scope},t.schema),o.fixDoc(e),o.events=t.ownEvents?new i(t.proxy):i.Event,o.attrHooks=d(o,t),a=t.schema?t.schema.getBlockElements():{},o.$=n.overrideDefaults(function(){return{context:e,element:o.getRoot()}}),o.isBlock=function(e){if(!e)return!1;var t=e.nodeType;return t?!(1!==t||!a[e.nodeName]):!!a[e]}}var m=u.each,g=u.is,v=u.grep,y=u.trim,b=l.ie,C=/^([a-z0-9],?)+$/i,x=/^[ \t\r\n]*$/;return h.prototype={$$:function(e){return"string"==typeof e&&(e=this.get(e)),this.$(e)},root:null,fixDoc:function(e){var t=this.settings,n;if(b&&t.schema){"abbr article aside audio canvas details figcaption figure footer header hgroup mark menu meter nav output progress section summary time video".replace(/\w+/g,function(t){e.createElement(t)});for(n in t.schema.getCustomElements())e.createElement(n)}},clone:function(e,t){var n=this,r,i;return!b||1!==e.nodeType||t?e.cloneNode(t):(i=n.doc,t?r.firstChild:(r=i.createElement(e.nodeName),m(n.getAttribs(e),function(t){n.setAttrib(r,t.nodeName,n.getAttrib(e,t.nodeName))}),r))},getRoot:function(){var e=this;return e.settings.root_element||e.doc.body},getViewPort:function(e){var t,n;return e=e?e:this.win,t=e.document,n=this.boxModel?t.documentElement:t.body,{x:e.pageXOffset||n.scrollLeft,y:e.pageYOffset||n.scrollTop,w:e.innerWidth||n.clientWidth,h:e.innerHeight||n.clientHeight}},getRect:function(e){var t=this,n,r;return e=t.get(e),n=t.getPos(e),r=t.getSize(e),{x:n.x,y:n.y,w:r.w,h:r.h}},getSize:function(e){var t=this,n,r;return e=t.get(e),n=t.getStyle(e,"width"),r=t.getStyle(e,"height"),n.indexOf("px")===-1&&(n=0),r.indexOf("px")===-1&&(r=0), -{w:parseInt(n,10)||e.offsetWidth||e.clientWidth,h:parseInt(r,10)||e.offsetHeight||e.clientHeight}},getParent:function(e,t,n){return this.getParents(e,t,n,!1)},getParents:function(e,n,r,i){var o=this,a,s=[];for(e=o.get(e),i=i===t,r=r||("BODY"!=o.getRoot().nodeName?o.getRoot().parentNode:null),g(n,"string")&&(a=n,n="*"===n?function(e){return 1==e.nodeType}:function(e){return o.is(e,a)});e&&e!=r&&e.nodeType&&9!==e.nodeType;){if(!n||n(e)){if(!i)return e;s.push(e)}e=e.parentNode}return i?s:null},get:function(e){var t;return e&&this.doc&&"string"==typeof e&&(t=e,e=this.doc.getElementById(e),e&&e.id!==t)?this.doc.getElementsByName(t)[1]:e},getNext:function(e,t){return this._findSib(e,t,"nextSibling")},getPrev:function(e,t){return this._findSib(e,t,"previousSibling")},select:function(t,n){var r=this;return e(t,r.get(n)||r.settings.root_element||r.doc,[])},is:function(n,r){var i;if(n.length===t){if("*"===r)return 1==n.nodeType;if(C.test(r)){for(r=r.toLowerCase().split(/,/),n=n.nodeName.toLowerCase(),i=r.length-1;i>=0;i--)if(r[i]==n)return!0;return!1}}if(n.nodeType&&1!=n.nodeType)return!1;var o=n.nodeType?[n]:n;return e(r,o[0].ownerDocument||o[0],null,o).length>0},add:function(e,t,n,r,i){var o=this;return this.run(e,function(e){var a;return a=g(t,"string")?o.doc.createElement(t):t,o.setAttribs(a,n),r&&(r.nodeType?a.appendChild(r):o.setHTML(a,r)),i?a:e.appendChild(a)})},create:function(e,t,n){return this.add(this.doc.createElement(e),e,t,n,1)},createHTML:function(e,t,n){var r="",i;r+="<"+e;for(i in t)t.hasOwnProperty(i)&&null!==t[i]&&"undefined"!=typeof t[i]&&(r+=" "+i+'="'+this.encode(t[i])+'"');return"undefined"!=typeof n?r+">"+n+"":r+" />"},createFragment:function(e){var t,n,r=this.doc,i;for(i=r.createElement("div"),t=r.createDocumentFragment(),e&&(i.innerHTML=e);n=i.firstChild;)t.appendChild(n);return t},remove:function(e,t){return e=this.$$(e),t?e.each(function(){for(var e;e=this.firstChild;)3==e.nodeType&&0===e.data.length?this.removeChild(e):this.parentNode.insertBefore(e,this)}).remove():e.remove(),e.length>1?e.toArray():e[0]},setStyle:function(e,t,n){e=this.$$(e).css(t,n),this.settings.update_styles&&f(this,e)},getStyle:function(e,n,r){return e=this.$$(e),r?e.css(n):(n=n.replace(/-(\D)/g,function(e,t){return t.toUpperCase()}),"float"==n&&(n=l.ie&&l.ie<12?"styleFloat":"cssFloat"),e[0]&&e[0].style?e[0].style[n]:t)},setStyles:function(e,t){e=this.$$(e).css(t),this.settings.update_styles&&f(this,e)},removeAllAttribs:function(e){return this.run(e,function(e){var t,n=e.attributes;for(t=n.length-1;t>=0;t--)e.removeAttributeNode(n.item(t))})},setAttrib:function(e,t,n){var r=this,i,o,a=r.settings;""===n&&(n=null),e=r.$$(e),i=e.attr(t),e.length&&(o=r.attrHooks[t],o&&o.set?o.set(e,n,t):e.attr(t,n),i!=n&&a.onSetAttrib&&a.onSetAttrib({attrElm:e,attrName:t,attrValue:n}))},setAttribs:function(e,t){var n=this;n.$$(e).each(function(e,r){m(t,function(e,t){n.setAttrib(r,t,e)})})},getAttrib:function(e,t,n){var r=this,i,o;return e=r.$$(e),e.length&&(i=r.attrHooks[t],o=i&&i.get?i.get(e,t):e.attr(t)),"undefined"==typeof o&&(o=n||""),o},getPos:function(e,t){var r=this,i=0,o=0,a,s=r.doc,l=s.body,u;if(e=r.get(e),t=t||l,e){if(t===l&&e.getBoundingClientRect&&"static"===n(l).css("position"))return u=e.getBoundingClientRect(),t=r.boxModel?s.documentElement:l,i=u.left+(s.documentElement.scrollLeft||l.scrollLeft)-t.clientLeft,o=u.top+(s.documentElement.scrollTop||l.scrollTop)-t.clientTop,{x:i,y:o};for(a=e;a&&a!=t&&a.nodeType;)i+=a.offsetLeft||0,o+=a.offsetTop||0,a=a.offsetParent;for(a=e.parentNode;a&&a!=t&&a.nodeType;)i-=a.scrollLeft||0,o-=a.scrollTop||0,a=a.parentNode}return{x:i,y:o}},parseStyle:function(e){return this.styles.parse(e)},serializeStyle:function(e,t){return this.styles.serialize(e,t)},addStyle:function(e){var t=this,n=t.doc,r,i;if(t!==h.DOM&&n===document){var o=h.DOM.addedStyles;if(o=o||[],o[e])return;o[e]=!0,h.DOM.addedStyles=o}i=n.getElementById("mceDefaultStyles"),i||(i=n.createElement("style"),i.id="mceDefaultStyles",i.type="text/css",r=n.getElementsByTagName("head")[0],r.firstChild?r.insertBefore(i,r.firstChild):r.appendChild(i)),i.styleSheet?i.styleSheet.cssText+=e:i.appendChild(n.createTextNode(e))},loadCSS:function(e){var t=this,n=t.doc,r;return t!==h.DOM&&n===document?void h.DOM.loadCSS(e):(e||(e=""),r=n.getElementsByTagName("head")[0],void m(e.split(","),function(e){var i;e=u._addCacheSuffix(e),t.files[e]||(t.files[e]=!0,i=t.create("link",{rel:"stylesheet",href:e}),b&&n.documentMode&&n.recalc&&(i.onload=function(){n.recalc&&n.recalc(),i.onload=null}),r.appendChild(i))}))},addClass:function(e,t){this.$$(e).addClass(t)},removeClass:function(e,t){this.toggleClass(e,t,!1)},hasClass:function(e,t){return this.$$(e).hasClass(t)},toggleClass:function(e,t,r){this.$$(e).toggleClass(t,r).each(function(){""===this.className&&n(this).attr("class",null)})},show:function(e){this.$$(e).show()},hide:function(e){this.$$(e).hide()},isHidden:function(e){return"none"==this.$$(e).css("display")},uniqueId:function(e){return(e?e:"mce_")+this.counter++},setHTML:function(e,t){e=this.$$(e),b?e.each(function(e,r){if(r.canHaveHTML!==!1){for(;r.firstChild;)r.removeChild(r.firstChild);try{r.innerHTML="
      "+t,r.removeChild(r.firstChild)}catch(i){n("
      ").html("
      "+t).contents().slice(1).appendTo(r)}return t}}):e.html(t)},getOuterHTML:function(e){return e=this.get(e),1==e.nodeType&&"outerHTML"in e?e.outerHTML:n("
      ").append(n(e).clone()).html()},setOuterHTML:function(e,t){var r=this;r.$$(e).each(function(){try{if("outerHTML"in this)return void(this.outerHTML=t)}catch(e){}r.remove(n(this).html(t),!0)})},decode:s.decode,encode:s.encodeAllRaw,insertAfter:function(e,t){return t=this.get(t),this.run(e,function(e){var n,r;return n=t.parentNode,r=t.nextSibling,r?n.insertBefore(e,r):n.appendChild(e),e})},replace:function(e,t,n){var r=this;return r.run(t,function(t){return g(t,"array")&&(e=e.cloneNode(!0)),n&&m(v(t.childNodes),function(t){e.appendChild(t)}),t.parentNode.replaceChild(e,t)})},rename:function(e,t){var n=this,r;return e.nodeName!=t.toUpperCase()&&(r=n.create(t),m(n.getAttribs(e),function(t){n.setAttrib(r,t.nodeName,n.getAttrib(e,t.nodeName))}),n.replace(r,e,1)),r||e},findCommonAncestor:function(e,t){for(var n=e,r;n;){for(r=t;r&&n!=r;)r=r.parentNode;if(n==r)break;n=n.parentNode}return!n&&e.ownerDocument?e.ownerDocument.documentElement:n},toHex:function(e){return this.styles.toHex(u.trim(e))},run:function(e,t,n){var r=this,i;return"string"==typeof e&&(e=r.get(e)),!!e&&(n=n||this,e.nodeType||!e.length&&0!==e.length?t.call(n,e):(i=[],m(e,function(e,o){e&&("string"==typeof e&&(e=r.get(e)),i.push(t.call(n,e,o)))}),i))},getAttribs:function(e){var t;if(e=this.get(e),!e)return[];if(b){if(t=[],"OBJECT"==e.nodeName)return e.attributes;"OPTION"===e.nodeName&&this.getAttrib(e,"selected")&&t.push({specified:1,nodeName:"selected"});var n=/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi;return e.cloneNode(!1).outerHTML.replace(n,"").replace(/[\w:\-]+/gi,function(e){t.push({specified:1,nodeName:e})}),t}return e.attributes},isEmpty:function(e,t){var n=this,r,i,a,s,l,u,c=0;if(e=e.firstChild){l=new o(e,e.parentNode),t=t||(n.schema?n.schema.getNonEmptyElements():null),s=n.schema?n.schema.getWhiteSpaceElements():{};do{if(a=e.nodeType,1===a){var d=e.getAttribute("data-mce-bogus");if(d){e=l.next("all"===d);continue}if(u=e.nodeName.toLowerCase(),t&&t[u]){if("br"===u){c++,e=l.next();continue}return!1}for(i=n.getAttribs(e),r=i.length;r--;)if(u=i[r].nodeName,"name"===u||"data-mce-bookmark"===u)return!1}if(8==a)return!1;if(3===a&&!x.test(e.nodeValue))return!1;if(3===a&&e.parentNode&&s[e.parentNode.nodeName]&&x.test(e.nodeValue))return!1;e=l.next()}while(e)}return c<=1},createRng:function(){var e=this.doc;return e.createRange?e.createRange():new a(this)},nodeIndex:p,split:function(e,t,n){function r(e){function t(e){var t=e.previousSibling&&"SPAN"==e.previousSibling.nodeName,n=e.nextSibling&&"SPAN"==e.nextSibling.nodeName;return t&&n}var n,o=e.childNodes,a=e.nodeType;if(1!=a||"bookmark"!=e.getAttribute("data-mce-type")){for(n=o.length-1;n>=0;n--)r(o[n]);if(9!=a){if(3==a&&e.nodeValue.length>0){var s=y(e.nodeValue).length;if(!i.isBlock(e.parentNode)||s>0||0===s&&t(e))return}else if(1==a&&(o=e.childNodes,1==o.length&&o[0]&&1==o[0].nodeType&&"bookmark"==o[0].getAttribute("data-mce-type")&&e.parentNode.insertBefore(o[0],e),o.length||/^(br|hr|input|img)$/i.test(e.nodeName)))return;i.remove(e)}return e}}var i=this,o=i.createRng(),a,s,l;if(e&&t)return o.setStart(e.parentNode,i.nodeIndex(e)),o.setEnd(t.parentNode,i.nodeIndex(t)),a=o.extractContents(),o=i.createRng(),o.setStart(t.parentNode,i.nodeIndex(t)+1),o.setEnd(e.parentNode,i.nodeIndex(e)+1),s=o.extractContents(),l=e.parentNode,l.insertBefore(r(a),e),n?l.insertBefore(n,e):l.insertBefore(t,e),l.insertBefore(r(s),e),i.remove(e),n||t},bind:function(e,t,n,r){var i=this;if(u.isArray(e)){for(var o=e.length;o--;)e[o]=i.bind(e[o],t,n,r);return e}return!i.settings.collect||e!==i.doc&&e!==i.win||i.boundEvents.push([e,t,n,r]),i.events.bind(e,t,n,r||i)},unbind:function(e,t,n){var r=this,i;if(u.isArray(e)){for(i=e.length;i--;)e[i]=r.unbind(e[i],t,n);return e}if(r.boundEvents&&(e===r.doc||e===r.win))for(i=r.boundEvents.length;i--;){var o=r.boundEvents[i];e!=o[0]||t&&t!=o[1]||n&&n!=o[2]||this.events.unbind(o[0],o[1],o[2])}return this.events.unbind(e,t,n)},fire:function(e,t,n){return this.events.fire(e,t,n)},getContentEditable:function(e){var t;return e&&1==e.nodeType?(t=e.getAttribute("data-mce-contenteditable"),t&&"inherit"!==t?t:"inherit"!==e.contentEditable?e.contentEditable:null):null},getContentEditableParent:function(e){for(var t=this.getRoot(),n=null;e&&e!==t&&(n=this.getContentEditable(e),null===n);e=e.parentNode);return n},destroy:function(){var t=this;if(t.boundEvents){for(var n=t.boundEvents.length;n--;){var r=t.boundEvents[n];this.events.unbind(r[0],r[1],r[2])}t.boundEvents=null}e.setDocument&&e.setDocument(),t.win=t.doc=t.root=t.events=t.frag=null},isChildOf:function(e,t){for(;e;){if(t===e)return!0;e=e.parentNode}return!1},dumpRng:function(e){return"startContainer: "+e.startContainer.nodeName+", startOffset: "+e.startOffset+", endContainer: "+e.endContainer.nodeName+", endOffset: "+e.endOffset},_findSib:function(e,t,n){var r=this,i=t;if(e)for("string"==typeof i&&(i=function(e){return r.is(e,t)}),e=e[n];e;e=e[n])if(i(e))return e;return null}},h.DOM=new h(document),h.nodeIndex=p,h}),r(E,[w,m],function(e,t){function n(){function e(e,n,i){function o(){l.remove(c),u&&(u.onreadystatechange=u.onload=u=null),n()}function s(){a(i)?i():"undefined"!=typeof console&&console.log&&console.log("Failed to load script: "+e)}var l=r,u,c;c=l.uniqueId(),u=document.createElement("script"),u.id=c,u.type="text/javascript",u.src=t._addCacheSuffix(e),"onreadystatechange"in u?u.onreadystatechange=function(){/loaded|complete/.test(u.readyState)&&o()}:u.onload=o,u.onerror=s,(document.getElementsByTagName("head")[0]||document.body).appendChild(u)}var n=0,s=1,l=2,u=3,c={},d=[],f={},p=[],h=0,m;this.isDone=function(e){return c[e]==l},this.markDone=function(e){c[e]=l},this.add=this.load=function(e,t,r,i){var o=c[e];o==m&&(d.push(e),c[e]=n),t&&(f[e]||(f[e]=[]),f[e].push({success:t,failure:i,scope:r||this}))},this.remove=function(e){delete c[e],delete f[e]},this.loadQueue=function(e,t,n){this.loadScripts(d,e,t,n)},this.loadScripts=function(t,n,r,d){function g(e,t){i(f[t],function(t){a(t[e])&&t[e].call(t.scope)}),f[t]=m}var v,y=[];p.push({success:n,failure:d,scope:r||this}),(v=function(){var n=o(t);t.length=0,i(n,function(t){return c[t]===l?void g("success",t):c[t]===u?void g("failure",t):void(c[t]!==s&&(c[t]=s,h++,e(t,function(){c[t]=l,h--,g("success",t),v()},function(){c[t]=u,h--,y.push(t),g("failure",t),v()})))}),h||(i(p,function(e){0===y.length?a(e.success)&&e.success.call(e.scope):a(e.failure)&&e.failure.call(e.scope,y)}),p.length=0)})()}}var r=e.DOM,i=t.each,o=t.grep,a=function(e){return"function"==typeof e};return n.ScriptLoader=new n,n}),r(N,[E,m],function(e,n){function r(){var e=this;e.items=[],e.urls={},e.lookup={}}var i=n.each;return r.prototype={get:function(e){return this.lookup[e]?this.lookup[e].instance:t},dependencies:function(e){var t;return this.lookup[e]&&(t=this.lookup[e].dependencies),t||[]},requireLangPack:function(t,n){var i=r.language;if(i&&r.languageLoad!==!1){if(n)if(n=","+n+",",n.indexOf(","+i.substr(0,2)+",")!=-1)i=i.substr(0,2);else if(n.indexOf(","+i+",")==-1)return;e.ScriptLoader.add(this.urls[t]+"/langs/"+i+".js")}},add:function(e,t,n){return this.items.push(t),this.lookup[e]={instance:t,dependencies:n},t},remove:function(e){delete this.urls[e],delete this.lookup[e]},createUrl:function(e,t){return"object"==typeof t?t:{prefix:e.prefix,resource:t,suffix:e.suffix}},addComponents:function(t,n){var r=this.urls[t];i(n,function(t){e.ScriptLoader.add(r+"/"+t)})},load:function(n,o,a,s,l){function u(){var r=c.dependencies(n);i(r,function(e){var n=c.createUrl(o,e);c.load(n.resource,n,t,t)}),a&&(s?a.call(s):a.call(e))}var c=this,d=o;c.urls[n]||("object"==typeof o&&(d=o.prefix+o.resource+o.suffix),0!==d.indexOf("/")&&d.indexOf("://")==-1&&(d=r.baseURL+"/"+d),c.urls[n]=d.substring(0,d.lastIndexOf("/")),c.lookup[n]?u():e.ScriptLoader.add(d,u,s,l))}},r.PluginManager=new r,r.ThemeManager=new r,r}),r(_,[],function(){function e(e){return function(t){return!!t&&t.nodeType==e}}function t(e){return e=e.toLowerCase().split(" "),function(t){var n,r;if(t&&t.nodeType)for(r=t.nodeName.toLowerCase(),n=0;nn.length-1?t=n.length-1:t<0&&(t=0),n[t]||e}function s(e,t,n){for(;e&&e!==t;){if(n(e))return e;e=e.parentNode}return null}function l(e,t,n){return null!==s(e,t,n)}function u(e){return"_mce_caret"===e.id}function c(e,t){return v(e)&&l(e,t,u)===!1}function d(e){this.walk=function(t,n){function r(e){var t;return t=e[0],3===t.nodeType&&t===l&&u>=t.nodeValue.length&&e.splice(0,1),t=e[e.length-1],0===d&&e.length>0&&t===c&&3===t.nodeType&&e.splice(e.length-1,1),e}function i(e,t,n){for(var r=[];e&&e!=n;e=e[t])r.push(e);return r}function o(e,t){do{if(e.parentNode==t)return e;e=e.parentNode}while(e)}function s(e,t,o){var a=o?"nextSibling":"previousSibling";for(g=e,v=g.parentNode;g&&g!=t;g=v)v=g.parentNode,y=i(g==e?g:g[a],a),y.length&&(o||y.reverse(),n(r(y)))}var l=t.startContainer,u=t.startOffset,c=t.endContainer,d=t.endOffset,f,p,m,g,v,y,b;if(b=e.select("td[data-mce-selected],th[data-mce-selected]"),b.length>0)return void h(b,function(e){n([e])});if(1==l.nodeType&&l.hasChildNodes()&&(l=l.childNodes[u]),1==c.nodeType&&c.hasChildNodes()&&(c=a(c,d)),l==c)return n(r([l]));for(f=e.findCommonAncestor(l,c),g=l;g;g=g.parentNode){if(g===c)return s(l,f,!0);if(g===f)break}for(g=c;g;g=g.parentNode){if(g===l)return s(c,f);if(g===f)break}p=o(l,f)||l,m=o(c,f)||c,s(l,p,!0),y=i(p==l?p:p.nextSibling,"nextSibling",m==c?m.nextSibling:m),y.length&&n(r(y)),s(c,m)},this.split=function(e){function t(e,t){return e.splitText(t)}var n=e.startContainer,r=e.startOffset,i=e.endContainer,o=e.endOffset;return n==i&&3==n.nodeType?r>0&&rr?(o-=r,n=i=t(i,o).previousSibling,o=i.nodeValue.length,r=0):o=0):(3==n.nodeType&&r>0&&r0&&o0)return f=y,p=n?y.nodeValue.length:0,void(i=!0);if(e.isBlock(y)||b[y.nodeName.toLowerCase()])return;s=y}o&&s&&(f=s,i=!0,p=0)}var f,p,h,m=e.getRoot(),y,b,C,x;if(f=n[(r?"start":"end")+"Container"],p=n[(r?"start":"end")+"Offset"],x=1==f.nodeType&&p===f.childNodes.length,b=e.schema.getNonEmptyElements(),C=r,!v(f)){if(1==f.nodeType&&p>f.childNodes.length-1&&(C=!1),9===f.nodeType&&(f=e.getRoot(),p=0),f===m){if(C&&(y=f.childNodes[p>0?p-1:0])){if(v(y))return;if(b[y.nodeName]||"TABLE"==y.nodeName)return}if(f.hasChildNodes()){if(p=Math.min(!C&&p>0?p-1:p,f.childNodes.length-1),f=f.childNodes[p],p=0,!o&&f===m.lastChild&&"TABLE"===f.nodeName)return;if(l(f)||v(f))return;if(f.hasChildNodes()&&!/TABLE/.test(f.nodeName)){y=f,h=new t(f,m);do{if(g(y)||v(y)){i=!1;break}if(3===y.nodeType&&y.nodeValue.length>0){p=C?0:y.nodeValue.length,f=y,i=!0;break}if(b[y.nodeName.toLowerCase()]&&!a(y)){p=e.nodeIndex(y),f=y.parentNode,"IMG"!=y.nodeName||C||p++,i=!0;break}}while(y=C?h.next():h.prev())}}}o&&(3===f.nodeType&&0===p&&d(!0),1===f.nodeType&&(y=f.childNodes[p],y||(y=f.childNodes[p-1]),!y||"BR"!==y.nodeName||u(y,"A")||s(y)||s(y,!0)||d(!0,y))),C&&!o&&3===f.nodeType&&p===f.nodeValue.length&&d(!1),i&&n["set"+(r?"Start":"End")](f,p)}}var i,o;return o=n.collapsed,r(!0),o||r(),i&&o&&n.collapse(!0),i}}function f(t,n,r){var i,o,a;if(i=r.elementFromPoint(t,n),o=r.body.createTextRange(),i&&"HTML"!=i.tagName||(i=r.body),o.moveToElementText(i),a=e.toArray(o.getClientRects()),a=a.sort(function(e,t){return e=Math.abs(Math.max(e.top-n,e.bottom-n)),t=Math.abs(Math.max(t.top-n,t.bottom-n)),e-t}),a.length>0){n=(a[0].bottom+a[0].top)/2;try{return o.moveToPoint(t,n),o.collapse(!0),o}catch(s){}}return null}function p(e,t){var n=e&&e.parentElement?e.parentElement():null;return g(s(n,t,o))?null:e}var h=e.each,m=n.isContentEditableTrue,g=n.isContentEditableFalse,v=i.isCaretContainer;return d.compareRanges=function(e,t){if(e&&t){if(!e.item&&!e.duplicate)return e.startContainer==t.startContainer&&e.startOffset==t.startOffset;if(e.item&&t.item&&e.item(0)===t.item(0))return!0;if(e.isEqual&&t.isEqual&&t.isEqual(e))return!0}return!1},d.getCaretRangeFromPoint=function(e,t,n){var r,i;if(n.caretPositionFromPoint)i=n.caretPositionFromPoint(e,t),r=n.createRange(),r.setStart(i.offsetNode,i.offset),r.collapse(!0);else if(n.caretRangeFromPoint)r=n.caretRangeFromPoint(e,t);else if(n.body.createTextRange){r=n.body.createTextRange();try{r.moveToPoint(e,t),r.collapse(!0)}catch(o){r=f(e,t,n)}return p(r,n.body)}return r},d.getSelectedNode=function(e){var t=e.startContainer,n=e.startOffset;return t.hasChildNodes()&&e.endOffset==n+1?t.childNodes[n]:null},d.getNode=function(e,t){return 1==e.nodeType&&e.hasChildNodes()&&(t>=e.childNodes.length&&(t=e.childNodes.length-1),e=e.childNodes[t]),e},d}),r(R,[T,d,c],function(e,t,n){return function(r){function i(e){var t,n;if(n=r.$(e).parentsUntil(r.getBody()).add(e),n.length===a.length){for(t=n.length;t>=0&&n[t]===a[t];t--);if(t===-1)return a=n,!0}return a=n,!1}var o,a=[];"onselectionchange"in r.getDoc()||r.on("NodeChange Click MouseUp KeyUp Focus",function(t){var n,i;n=r.selection.getRng(),i={startContainer:n.startContainer,startOffset:n.startOffset,endContainer:n.endContainer,endOffset:n.endOffset},"nodechange"!=t.type&&e.compareRanges(i,o)||r.fire("SelectionChange"),o=i}),r.on("contextmenu",function(){r.fire("SelectionChange")}),r.on("SelectionChange",function(){var e=r.selection.getStart(!0);!t.range&&r.selection.isCollapsed()||!i(e)&&r.dom.isChildOf(e,r.getBody())&&r.nodeChanged({selectionChange:!0})}),r.on("MouseUp",function(e){e.isDefaultPrevented()||("IMG"==r.selection.getNode().nodeName?n.setEditorTimeout(r,function(){r.nodeChanged()}):r.nodeChanged())}),this.nodeChanged=function(e){var t=r.selection,n,i,o;r.initialized&&t&&!r.settings.disable_nodechange&&!r.readonly&&(o=r.getBody(),n=t.getStart()||o,n.ownerDocument==r.getDoc()&&r.dom.isChildOf(n,o)||(n=o),"IMG"==n.nodeName&&t.isCollapsed()&&(n=n.parentNode),i=[],r.dom.getParent(n,function(e){return e===o||void i.push(e)}),e=e||{},e.element=n,e.parents=i,r.fire("NodeChange",e))}}}),r(A,[],function(){function e(e,t,n){var r,i,o=n?"lastChild":"firstChild",a=n?"prev":"next";if(e[o])return e[o];if(e!==t){if(r=e[a])return r;for(i=e.parent;i&&i!==t;i=i.parent)if(r=i[a])return r}}function t(e,t){this.name=e,this.type=t,1===t&&(this.attributes=[],this.attributes.map={})}var n=/^[ \t\r\n]*$/,r={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11};return t.prototype={replace:function(e){var t=this;return e.parent&&e.remove(),t.insert(e,t),t.remove(),t},attr:function(e,t){var n=this,r,i,o;if("string"!=typeof e){for(i in e)n.attr(i,e[i]);return n}if(r=n.attributes){if(t!==o){if(null===t){if(e in r.map)for(delete r.map[e],i=r.length;i--;)if(r[i].name===e)return r=r.splice(i,1),n;return n}if(e in r.map){for(i=r.length;i--;)if(r[i].name===e){r[i].value=t;break}}else r.push({name:e,value:t});return r.map[e]=t,n}return r.map[e]}},clone:function(){var e=this,n=new t(e.name,e.type),r,i,o,a,s;if(o=e.attributes){for(s=[],s.map={},r=0,i=o.length;r
      "},postRender:function(){var e=this,t;return e.items().exec("postRender"),e._super(),e._layout.postRender(e),e.state.set("rendered",!0),e.settings.style&&e.$el.css(e.settings.style),e.settings.border&&(t=e.borderBox,e.$el.css({"border-top-width":t.top,"border-right-width":t.right,"border-bottom-width":t.bottom,"border-left-width":t.left})),e.parent()||(e.keyboardNav=new i({root:e})),e},initLayoutRect:function(){var e=this,t=e._super();return e._layout.recalc(e),t},recalc:function(){var e=this,t=e._layoutRect,n=e._lastRect;if(!n||n.w!=t.w||n.h!=t.h)return e._layout.recalc(e),t=e.layoutRect(),e._lastRect={x:t.x,y:t.y,w:t.w,h:t.h},!0},reflow:function(){var t;if(l.remove(this),this.visible()){for(e.repaintControls=[],e.repaintControls.map={},this.recalc(),t=e.repaintControls.length;t--;)e.repaintControls[t].repaint();"flow"!==this.settings.layout&&"stack"!==this.settings.layout&&this.repaint(),e.repaintControls=[]}return this}})}),r(_e,[g],function(e){function t(e){var t,n,r,i,o,a,s,l,u=Math.max;return t=e.documentElement,n=e.body,r=u(t.scrollWidth,n.scrollWidth),i=u(t.clientWidth,n.clientWidth),o=u(t.offsetWidth,n.offsetWidth),a=u(t.scrollHeight,n.scrollHeight),s=u(t.clientHeight,n.clientHeight),l=u(t.offsetHeight,n.offsetHeight),{width:r
      ").css({position:"absolute",top:0,left:0,width:u.width,height:u.height,zIndex:2147483647,opacity:1e-4,cursor:m}).appendTo(s.body),e(s).on("mousemove touchmove",d).on("mouseup touchend",c),i.start(r)},d=function(e){return n(e),e.button!==l?c(e):(e.deltaX=e.screenX-f,e.deltaY=e.screenY-p,e.preventDefault(),void i.drag(e))},c=function(t){n(t),e(s).off("mousemove touchmove",d).off("mouseup touchend",c),a.remove(),i.stop&&i.stop(t)},this.destroy=function(){e(o()).off()},e(o()).on("mousedown touchstart",u)}}),r(Se,[g,_e],function(e,t){return{init:function(){var e=this;e.on("repaint",e.renderScroll)},renderScroll:function(){function n(){function t(t,a,s,l,u,c){var d,f,p,h,m,g,v,y,b;if(f=i.getEl("scroll"+t)){if(y=a.toLowerCase(),b=s.toLowerCase(),e(i.getEl("absend")).css(y,i.layoutRect()[l]-1),!u)return void e(f).css("display","none");e(f).css("display","block"),d=i.getEl("body"),p=i.getEl("scroll"+t+"t"),h=d["client"+s]-2*o,h-=n&&r?f["client"+c]:0,m=d["scroll"+s],g=h/m,v={},v[y]=d["offset"+a]+o,v[b]=h,e(f).css(v),v={},v[y]=d["scroll"+a]*g,v[b]=h*g,e(p).css(v)}}var n,r,a;a=i.getEl("body"),n=a.scrollWidth>a.clientWidth,r=a.scrollHeight>a.clientHeight,t("h","Left","Width","contentW",n,"Height"),t("v","Top","Height","contentH",r,"Width")}function r(){function n(n,r,a,s,l){var u,c=i._id+"-scroll"+n,d=i.classPrefix;e(i.getEl()).append('
      '),i.draghelper=new t(c+"t",{start:function(){u=i.getEl("body")["scroll"+r],e("#"+c).addClass(d+"active")},drag:function(e){var t,c,d,f,p=i.layoutRect();c=p.contentW>p.innerW,d=p.contentH>p.innerH,f=i.getEl("body")["client"+a]-2*o,f-=c&&d?i.getEl("scroll"+n)["client"+l]:0,t=f/i.getEl("body")["scroll"+a],i.getEl("body")["scroll"+r]=u+e["delta"+s]/t},stop:function(){e("#"+c).removeClass(d+"active")}})}i.classes.add("scroll"),n("v","Top","Height","Y","Width"),n("h","Left","Width","X","Height")}var i=this,o=2;i.settings.autoScroll&&(i._hasScroll||(i._hasScroll=!0,r(),i.on("wheel",function(e){var t=i.getEl("body");t.scrollLeft+=10*(e.deltaX||0),t.scrollTop+=10*e.deltaY,n()}),e(i.getEl("body")).on("scroll",n)),n())}}}),r(ke,[Ne,Se],function(e,t){return e.extend({Defaults:{layout:"fit",containerCls:"panel"},Mixins:[t],renderHtml:function(){var e=this,t=e._layout,n=e.settings.html;return e.preRender(),t.preRender(e),"undefined"==typeof n?n='
      '+t.renderHtml(e)+"
      ":("function"==typeof n&&(n=n.call(e)),e._hasBody=!1),'
      '+(e._preBodyHtml||"")+n+"
      "}})}),r(Te,[ve],function(e){function t(t,n,r){var i,o,a,s,l,u,c,d,f,p;return f=e.getViewPort(),o=e.getPos(n),a=o.x,s=o.y,t.state.get("fixed")&&"static"==e.getRuntimeStyle(document.body,"position")&&(a-=f.x,s-=f.y),i=t.getEl(),p=e.getSize(i),l=p.width,u=p.height,p=e.getSize(n),c=p.width,d=p.height,r=(r||"").split(""),"b"===r[0]&&(s+=d),"r"===r[1]&&(a+=c),"c"===r[0]&&(s+=Math.round(d/2)),"c"===r[1]&&(a+=Math.round(c/2)),"b"===r[3]&&(s-=u),"r"===r[4]&&(a-=l),"c"===r[3]&&(s-=Math.round(u/2)),"c"===r[4]&&(a-=Math.round(l/2)),{x:a,y:s,w:l,h:u}}return{testMoveRel:function(n,r){for(var i=e.getViewPort(),o=0;o0&&a.x+a.w0&&a.y+a.hi.x&&a.x+a.wi.y&&a.y+a.ht?(e=t-n,e<0?0:e):e}var i=this;if(i.settings.constrainToViewport){var o=e.getViewPort(window),a=i.layoutRect();t=r(t,o.w+o.x,a.w),n=r(n,o.h+o.y,a.h)}return i.state.get("rendered")?i.layoutRect({x:t,y:n}).repaint():(i.settings.x=t,i.settings.y=n),i.fire("move",{x:t,y:n}),i}}}),r(Re,[ve],function(e){return{resizeToContent:function(){this._layoutRect.autoResize=!0,this._lastRect=null,this.reflow()},resizeTo:function(t,n){if(t<=1||n<=1){var r=e.getWindowSize();t=t<=1?t*r.w:t,n=n<=1?n*r.h:n}return this._layoutRect.autoResize=!1,this.layoutRect({minW:t,minH:n,w:t,h:n}).reflow()},resizeBy:function(e,t){var n=this,r=n.layoutRect();return n.resizeTo(r.w+e,r.h+t)}}}),r(Ae,[ke,Te,Re,ve,g,c],function(e,t,n,r,i,o){function a(e,t){for(;e;){if(e==t)return!0;e=e.parent()}}function s(e){for(var t=v.length;t--;){var n=v[t],r=n.getParentCtrl(e.target);if(n.settings.autohide){if(r&&(a(r,n)||n.parent()===r))continue;e=n.fire("autohide",{target:e.target}),e.isDefaultPrevented()||n.hide()}}}function l(){h||(h=function(e){2!=e.button&&s(e)},i(document).on("click touchstart",h))}function u(){m||(m=function(){var e;for(e=v.length;e--;)d(v[e])},i(window).on("scroll",m))}function c(){if(!g){var e=document.documentElement,t=e.clientWidth,n=e.clientHeight;g=function(){document.all&&t==e.clientWidth&&n==e.clientHeight||(t=e.clientWidth,n=e.clientHeight,C.hideAll())},i(window).on("resize",g)}}function d(e){function t(t,n){for(var r,i=0;in&&(e.fixed(!1).layoutRect({y:e._autoFixY}).repaint(),t(!1,e._autoFixY-n)):(e._autoFixY=e.layoutRect().y,e._autoFixY
      ').appendTo(t.getContainerElm())),o.setTimeout(function(){n.addClass(r+"in"),i(t.getEl()).addClass(r+"in")}),b=!0),f(!0,t)}}),t.on("show",function(){t.parents().each(function(e){if(e.state.get("fixed"))return t.fixed(!0),!1})}),e.popover&&(t._preBodyHtml='
      ',t.classes.add("popover").add("bottom").add(t.isRtl()?"end":"start")),t.aria("label",e.ariaLabel),t.aria("labelledby",t._id),t.aria("describedby",t.describedBy||t._id+"-none")},fixed:function(e){var t=this;if(t.state.get("fixed")!=e){if(t.state.get("rendered")){var n=r.getViewPort();e?t.layoutRect().y-=n.y:t.layoutRect().y+=n.y}t.classes.toggle("fixed",e),t.state.set("fixed",e)}return t},show:function(){var e=this,t,n=e._super();for(t=v.length;t--&&v[t]!==e;);return t===-1&&v.push(e),n},hide:function(){return p(this),f(!1,this),this._super()},hideAll:function(){C.hideAll()},close:function(){var e=this;return e.fire("close").isDefaultPrevented()||(e.remove(),f(!1,e)),e},remove:function(){p(this),this._super()},postRender:function(){var e=this;return e.settings.bodyRole&&this.getEl("body").setAttribute("role",e.settings.bodyRole),e._super()}});return C.hideAll=function(){for(var e=v.length;e--;){var t=v[e];t&&t.settings.autohide&&(t.hide(),v.splice(e,1))}},C}),r(Be,[Ae,ke,ve,g,_e,ye,d,c],function(e,t,n,r,i,o,a,s){function l(e){var t="width=device-width,initial-scale=1.0,user-scalable=0,minimum-scale=1.0,maximum-scale=1.0",n=r("meta[name=viewport]")[0],i;a.overrideViewPort!==!1&&(n||(n=document.createElement("meta"),n.setAttribute("name","viewport"),document.getElementsByTagName("head")[0].appendChild(n)),i=n.getAttribute("content"),i&&"undefined"!=typeof p&&(p=i),n.setAttribute("content",e?t:p))}function u(e,t){c()&&t===!1&&r([document.documentElement,document.body]).removeClass(e+"fullscreen")}function c(){for(var e=0;er.w&&(o=r.x-Math.max(0,i/2),e.layoutRect({w:i,x:o}),a=!0)),t&&(t.layoutRect({w:e.layoutRect().innerW}).recalc(),i=t.layoutRect().minW+r.deltaW,i>r.w&&(o=r.x-Math.max(0,i-r.w),e.layoutRect({w:i,x:o}),a=!0)),a&&e.recalc()},initLayoutRect:function(){var e=this,t=e._super(),r=0,i;if(e.settings.title&&!e._fullscreen){i=e.getEl("head");var o=n.getSize(i);t.headerW=o.width,t.headerH=o.height,r+=t.headerH}e.statusbar&&(r+=e.statusbar.layoutRect().h),t.deltaH+=r,t.minH+=r,t.h+=r;var a=n.getWindowSize();return t.x=e.settings.x||Math.max(0,a.w/2-t.w/2),t.y=e.settings.y||Math.max(0,a.h/2-t.h/2),t},renderHtml:function(){var e=this,t=e._layout,n=e._id,r=e.classPrefix,i=e.settings,o="",a="",s=i.html;return e.preRender(),t.preRender(e),i.title&&(o='
      '+e.encode(i.title)+'
      '),i.url&&(s=''),"undefined"==typeof s&&(s=t.renderHtml(e)),e.statusbar&&(a=e.statusbar.renderHtml()),'
      '+o+'
      '+s+"
      "+a+"
      "},fullscreen:function(e){var t=this,i=document.documentElement,a,l=t.classPrefix,u;if(e!=t._fullscreen)if(r(window).on("resize",function(){var e;if(t._fullscreen)if(a)t._timer||(t._timer=s.setTimeout(function(){var e=n.getWindowSize();t.moveTo(0,0).resizeTo(e.w,e.h),t._timer=0},50));else{e=(new Date).getTime();var r=n.getWindowSize();t.moveTo(0,0).resizeTo(r.w,r.h),(new Date).getTime()-e>50&&(a=!0)}}),u=t.layoutRect(),t._fullscreen=e,e){t._initial={x:u.x,y:u.y,w:u.w,h:u.h},t.borderBox=o.parseBox("0"),t.getEl("head").style.display="none",u.deltaH-=u.headerH+2,r([i,document.body]).addClass(l+"fullscreen"),t.classes.add("fullscreen");var c=n.getWindowSize();t.moveTo(0,0).resizeTo(c.w,c.h)}else t.borderBox=o.parseBox(t.settings.border),t.getEl("head").style.display="",u.deltaH+=u.headerH,r([i,document.body]).removeClass(l+"fullscreen"),t.classes.remove("fullscreen"),t.moveTo(t._initial.x,t._initial.y).resizeTo(t._initial.w,t._initial.h);return t.reflow()},postRender:function(){var e=this,t;setTimeout(function(){e.classes.add("in"),e.fire("open")},0),e._super(),e.statusbar&&e.statusbar.postRender(),e.focus(),this.dragHelper=new i(e._id+"-dragh",{start:function(){t={x:e.layoutRect().x,y:e.layoutRect().y}},drag:function(n){e.moveTo(t.x+n.deltaX,t.y+n.deltaY)}}),e.on("submit",function(t){t.isDefaultPrevented()||e.close()}),f.push(e),l(!0)},submit:function(){return this.fire("submit",{data:this.toJSON()})},remove:function(){var e=this,t;for(e.dragHelper.destroy(),e._super(),e.statusbar&&this.statusbar.remove(),u(e.classPrefix,!1),t=f.length;t--;)f[t]===e&&f.splice(t,1);l(f.length>0)},getContentWindow:function(){var e=this.getEl().getElementsByTagName("iframe")[0];return e?e.contentWindow:null}});return d(),h}),r(De,[Be],function(e){var t=e.extend({init:function(e){e={border:1,padding:20,layout:"flex",pack:"center",align:"center",containerCls:"panel",autoScroll:!0,buttons:{type:"button",text:"Ok",action:"ok"},items:{type:"label",multiline:!0,maxWidth:500,maxHeight:200}},this._super(e)},Statics:{OK:1,OK_CANCEL:2,YES_NO:3,YES_NO_CANCEL:4,msgBox:function(n){function r(e,t,n){return{type:"button",text:e,subtype:n?"primary":"",onClick:function(e){e.control.parents()[1].close(),o(t)}}}var i,o=n.callback||function(){}; -switch(n.buttons){case t.OK_CANCEL:i=[r("Ok",!0,!0),r("Cancel",!1)];break;case t.YES_NO:case t.YES_NO_CANCEL:i=[r("Yes",1,!0),r("No",0)],n.buttons==t.YES_NO_CANCEL&&i.push(r("Cancel",-1));break;default:i=[r("Ok",!0,!0)]}return new e({padding:20,x:n.x,y:n.y,minWidth:300,minHeight:100,layout:"flex",pack:"center",align:"center",buttons:i,title:n.title,role:"alertdialog",items:{type:"label",multiline:!0,maxWidth:500,maxHeight:200,text:n.text},onPostRender:function(){this.aria("describedby",this.items()[0]._id)},onClose:n.onClose,onCancel:function(){o(!1)}}).renderTo(document.body).reflow()},alert:function(e,n){return"string"==typeof e&&(e={text:e}),e.callback=n,t.msgBox(e)},confirm:function(e,n){return"string"==typeof e&&(e={text:e}),e.callback=n,e.buttons=t.OK_CANCEL,t.msgBox(e)}}});return t}),r(Le,[Be,De],function(e,t){return function(n){function r(){if(s.length)return s[s.length-1]}function i(e){n.fire("OpenWindow",{win:e})}function o(e){n.fire("CloseWindow",{win:e})}var a=this,s=[];a.windows=s,n.on("remove",function(){for(var e=s.length;e--;)s[e].close()}),a.open=function(t,r){var a;return n.editorManager.setActive(n),t.title=t.title||" ",t.url=t.url||t.file,t.url&&(t.width=parseInt(t.width||320,10),t.height=parseInt(t.height||240,10)),t.body&&(t.items={defaults:t.defaults,type:t.bodyType||"form",items:t.body,data:t.data,callbacks:t.commands}),t.url||t.buttons||(t.buttons=[{text:"Ok",subtype:"primary",onclick:function(){a.find("form")[0].submit()}},{text:"Cancel",onclick:function(){a.close()}}]),a=new e(t),s.push(a),a.on("close",function(){for(var e=s.length;e--;)s[e]===a&&s.splice(e,1);s.length||n.focus(),o(a)}),t.data&&a.on("postRender",function(){this.find("*").each(function(e){var n=e.name();n in t.data&&e.value(t.data[n])})}),a.features=t||{},a.params=r||{},1===s.length&&n.nodeChanged(),a=a.renderTo().reflow(),i(a),a},a.alert=function(e,r,a){var s;s=t.alert(e,function(){r?r.call(a||this):n.focus()}),s.on("close",function(){o(s)}),i(s)},a.confirm=function(e,n,r){var a;a=t.confirm(e,function(e){n.call(r||this,e)}),a.on("close",function(){o(a)}),i(a)},a.close=function(){r()&&r().close()},a.getParams=function(){return r()?r().params:null},a.setParams=function(e){r()&&(r().params=e)},a.getWindows=function(){return s}}}),r(Me,[xe,Te],function(e,t){return e.extend({Mixins:[t],Defaults:{classes:"widget tooltip tooltip-n"},renderHtml:function(){var e=this,t=e.classPrefix;return'"},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.getEl().lastChild.innerHTML=e.encode(t.value)}),e._super()},repaint:function(){var e=this,t,n;t=e.getEl().style,n=e._layoutRect,t.left=n.x+"px",t.top=n.y+"px",t.zIndex=131070}})}),r(Pe,[xe,Me],function(e,t){var n,r=e.extend({init:function(e){var t=this;t._super(e),e=t.settings,t.canFocus=!0,e.tooltip&&r.tooltips!==!1&&(t.on("mouseenter",function(n){var r=t.tooltip().moveTo(-65535);if(n.control==t){var i=r.text(e.tooltip).show().testMoveRel(t.getEl(),["bc-tc","bc-tl","bc-tr"]);r.classes.toggle("tooltip-n","bc-tc"==i),r.classes.toggle("tooltip-nw","bc-tl"==i),r.classes.toggle("tooltip-ne","bc-tr"==i),r.moveRel(t.getEl(),i)}else r.hide()}),t.on("mouseleave mousedown click",function(){t.tooltip().hide()})),t.aria("label",e.ariaLabel||e.tooltip)},tooltip:function(){return n||(n=new t({type:"tooltip"}),n.renderTo()),n},postRender:function(){var e=this,t=e.settings;e._super(),e.parent()||!t.width&&!t.height||(e.initLayoutRect(),e.repaint()),t.autofocus&&e.focus()},bindStates:function(){function e(e){n.aria("disabled",e),n.classes.toggle("disabled",e)}function t(e){n.aria("pressed",e),n.classes.toggle("active",e)}var n=this;return n.state.on("change:disabled",function(t){e(t.value)}),n.state.on("change:active",function(e){t(e.value)}),n.state.get("disabled")&&e(!0),n.state.get("active")&&t(!0),n._super()},remove:function(){this._super(),n&&(n.remove(),n=null)}});return r}),r(Oe,[Pe],function(e){return e.extend({Defaults:{value:0},init:function(e){var t=this;t._super(e),t.classes.add("progress"),t.settings.filter||(t.settings.filter=function(e){return Math.round(e)})},renderHtml:function(){var e=this,t=e._id,n=this.classPrefix;return'
      0%
      '},postRender:function(){var e=this;return e._super(),e.value(e.settings.value),e},bindStates:function(){function e(e){e=t.settings.filter(e),t.getEl().lastChild.innerHTML=e+"%",t.getEl().firstChild.firstChild.style.width=e+"%"}var t=this;return t.state.on("change:value",function(t){e(t.value)}),e(t.state.get("value")),t._super()}})}),r(He,[xe,Te,Oe,c],function(e,t,n,r){return e.extend({Mixins:[t],Defaults:{classes:"widget notification"},init:function(e){var t=this;t._super(e),e.text&&t.text(e.text),e.icon&&(t.icon=e.icon),e.color&&(t.color=e.color),e.type&&t.classes.add("notification-"+e.type),e.timeout&&(e.timeout<0||e.timeout>0)&&!e.closeButton?t.closeButton=!1:(t.classes.add("has-close"),t.closeButton=!0),e.progressBar&&(t.progressBar=new n),t.on("click",function(e){e.target.className.indexOf(t.classPrefix+"close")!=-1&&t.close()})},renderHtml:function(){var e=this,t=e.classPrefix,n="",r="",i="",o="";return e.icon&&(n=''),e.color&&(o=' style="background-color: '+e.color+'"'),e.closeButton&&(r=''),e.progressBar&&(i=e.progressBar.renderHtml()),'"},postRender:function(){var e=this;return r.setTimeout(function(){e.$el.addClass(e.classPrefix+"in")}),e._super()},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.getEl().childNodes[1].innerHTML=t.value}),e.progressBar&&e.progressBar.bindStates(),e._super()},close:function(){var e=this;return e.fire("close").isDefaultPrevented()||e.remove(),e},repaint:function(){var e=this,t,n;t=e.getEl().style,n=e._layoutRect,t.left=n.x+"px",t.top=n.y+"px",t.zIndex=65534}})}),r(Ie,[He,c,m],function(e,t,n){return function(r){function i(){if(f.length)return f[f.length-1]}function o(){t.requestAnimationFrame(function(){a(),s()})}function a(){for(var e=0;e0){var e=f.slice(0,1)[0],t=r.inline?r.getElement():r.getContentAreaContainer();if(e.moveRel(t,"tc-tc"),f.length>1)for(var n=1;n0&&(n.timer=setTimeout(function(){n.close()},t.timeout)),n.on("close",function(){var e=f.length;for(n.timer&&r.getWin().clearTimeout(n.timer);e--;)f[e]===n&&f.splice(e,1);s()}),n.renderTo(),s()):n=i,n}},d.close=function(){i()&&i().close()},d.getNotifications=function(){return f},r.on("SkinLoaded",function(){var e=r.settings.service_message;e&&r.notificationManager.open({text:e,type:"warning",timeout:0,icon:""})})}}),r(Fe,[w],function(e){function t(t,n,r){for(var i=[];n&&n!=t;n=n.parentNode)i.push(e.nodeIndex(n,r));return i}function n(e,t){var n,r,i;for(r=e,n=t.length-1;n>=0;n--){if(i=r.childNodes,t[n]>i.length-1)return null;r=i[t[n]]}return r}return{create:t,resolve:n}}),r(ze,[I,T,y,Fe,A,C,d,m,c,k,$,oe],function(e,t,n,r,i,o,a,s,l,u,c,d){return function(f){function p(e,t){try{f.getDoc().execCommand(e,!1,t)}catch(n){}}function h(){var e=f.getDoc().documentMode;return e?e:6}function m(e){return e.isDefaultPrevented()}function g(e){var t,n;e.dataTransfer&&(f.selection.isCollapsed()&&"IMG"==e.target.tagName&&re.select(e.target),t=f.selection.getContent(),t.length>0&&(n=ce+escape(f.id)+","+escape(t),e.dataTransfer.setData(de,n)))}function v(e){var t;return e.dataTransfer&&(t=e.dataTransfer.getData(de),t&&t.indexOf(ce)>=0)?(t=t.substr(ce.length).split(","),{id:unescape(t[0]),html:unescape(t[1])}):null}function y(e){f.queryCommandSupported("mceInsertClipboardContent")?f.execCommand("mceInsertClipboardContent",!1,{content:e}):f.execCommand("mceInsertContent",!1,e)}function b(){function i(e){var t=x.schema.getBlockElements(),n=f.getBody();if("BR"!=e.nodeName)return!1;for(;e!=n&&!t[e.nodeName];e=e.parentNode)if(e.nextSibling)return!1;return!0}function o(e,t){var n;for(n=e.nextSibling;n&&n!=t;n=n.nextSibling)if((3!=n.nodeType||0!==Z.trim(n.data).length)&&n!==t)return!1;return n===t}function a(e,t,r){var o,a,s;if(x.isChildOf(e,f.getBody()))for(s=x.schema.getNonEmptyElements(),o=new n(r||e,e);a=o[t?"next":"prev"]();){if(s[a.nodeName]&&!i(a))return a;if(3==a.nodeType&&a.data.length>0)return a}}function u(e){var n,r,i,o,s;if(!e.collapsed&&(n=x.getParent(t.getNode(e.startContainer,e.startOffset),x.isBlock),r=x.getParent(t.getNode(e.endContainer,e.endOffset),x.isBlock),s=f.schema.getTextBlockElements(),n!=r&&s[n.nodeName]&&s[r.nodeName]&&"false"!==x.getContentEditable(n)&&"false"!==x.getContentEditable(r)))return e.deleteContents(),i=a(n,!1),o=a(r,!0),x.isEmpty(r)||Z(n).append(r.childNodes),Z(r).remove(),i?1==i.nodeType?"BR"==i.nodeName?(e.setStartBefore(i),e.setEndBefore(i)):(e.setStartAfter(i),e.setEndAfter(i)):(e.setStart(i,i.data.length),e.setEnd(i,i.data.length)):o&&(1==o.nodeType?(e.setStartBefore(o),e.setEndBefore(o)):(e.setStart(o,0),e.setEnd(o,0))),w.setRng(e),!0}function c(e,n){var r,i,s,l,u,c;if(!e.collapsed)return e;if(u=e.startContainer,c=e.startOffset,3==u.nodeType)if(n){if(c0)return e;r=t.getNode(u,c),s=x.getParent(r,x.isBlock),i=a(f.getBody(),n,r),l=x.getParent(i,x.isBlock);var d=1===u.nodeType&&c>u.childNodes.length-1;if(!r||!i)return e;if(l&&s!=l)if(n){if(!o(s,l))return e;1==r.nodeType?"BR"==r.nodeName?e.setStartBefore(r):e.setStartAfter(r):e.setStart(r,r.data.length),1==i.nodeType?e.setEnd(i,0):e.setEndBefore(i)}else{if(!o(l,s))return e;1==i.nodeType?"BR"==i.nodeName?e.setStartBefore(i):e.setStartAfter(i):e.setStart(i,i.data.length),1==r.nodeType&&d?e.setEndAfter(r):e.setEndBefore(r)}return e}function d(e){var t=w.getRng();if(t=c(t,e),u(t))return!0}function p(e,t){function n(e,n){return m=Z(n).parents().filter(function(e,t){return!!f.schema.getTextInlineElements()[t.nodeName]}),l=e.cloneNode(!1),m=s.map(m,function(e){return e=e.cloneNode(!1),l.hasChildNodes()?(e.appendChild(l.firstChild),l.appendChild(e)):l.appendChild(e),l.appendChild(e),e}),m.length?(h=x.create("br"),m[0].appendChild(h),x.replace(l,e),t.setStartBefore(h),t.setEndBefore(h),f.selection.setRng(t),h):null}function i(e){return e&&f.schema.getTextBlockElements()[e.tagName]}var o,a,l,u,c,d,p,h,m;if(t.collapsed&&(d=t.startContainer,p=t.startOffset,a=x.getParent(d,x.isBlock),i(a)))if(1==d.nodeType){if(d=d.childNodes[p],d&&"BR"!=d.tagName)return;if(c=e?a.nextSibling:a.previousSibling,x.isEmpty(a)&&i(c)&&x.isEmpty(c)&&n(a,d))return x.remove(c),!0}else if(3==d.nodeType){if(o=r.create(a,d),u=a.cloneNode(!0),d=r.resolve(u,o),e){if(p>=d.data.length)return;d.deleteData(p,1)}else{if(p<=0)return;d.deleteData(p-1,1)}if(x.isEmpty(u))return n(a,d)}}function h(e){var t,n,r;d(e)||(s.each(f.getBody().getElementsByTagName("*"),function(e){"SPAN"==e.tagName&&e.setAttribute("mce-data-marked",1),!e.hasAttribute("data-mce-style")&&e.hasAttribute("style")&&f.dom.setAttrib(e,"style",f.dom.getAttrib(e,"style"))}),t=new E(function(){}),t.observe(f.getDoc(),{childList:!0,attributes:!0,subtree:!0,attributeFilter:["style"]}),f.getDoc().execCommand(e?"ForwardDelete":"Delete",!1,null),n=f.selection.getRng(),r=n.startContainer.parentNode,s.each(t.takeRecords(),function(e){if(x.isChildOf(e.target,f.getBody())){if("style"==e.attributeName){var t=e.target.getAttribute("data-mce-style");t?e.target.setAttribute("style",t):e.target.removeAttribute("style")}s.each(e.addedNodes,function(e){if("SPAN"==e.nodeName&&!e.getAttribute("mce-data-marked")){var t,i;e==r&&(t=n.startOffset,i=e.firstChild),x.remove(e,!0),i&&(n.setStart(i,t),n.setEnd(i,t),f.selection.setRng(n))}})}}),t.disconnect(),s.each(f.dom.select("span[mce-data-marked]"),function(e){e.removeAttribute("mce-data-marked")}))}function b(e){f.undoManager.transact(function(){h(e)})}var C=f.getDoc(),x=f.dom,w=f.selection,E=window.MutationObserver,N,_;E||(N=!0,E=function(){function e(e){var t=e.relatedNode||e.target;n.push({target:t,addedNodes:[t]})}function t(e){var t=e.relatedNode||e.target;n.push({target:t,attributeName:e.attrName})}var n=[],r;this.observe=function(n){r=n,r.addEventListener("DOMSubtreeModified",e,!1),r.addEventListener("DOMNodeInsertedIntoDocument",e,!1),r.addEventListener("DOMNodeInserted",e,!1),r.addEventListener("DOMAttrModified",t,!1)},this.disconnect=function(){r.removeEventListener("DOMSubtreeModified",e,!1),r.removeEventListener("DOMNodeInsertedIntoDocument",e,!1),r.removeEventListener("DOMNodeInserted",e,!1),r.removeEventListener("DOMAttrModified",t,!1)},this.takeRecords=function(){return n}}),f.on("keydown",function(e){var t=e.keyCode==te,n=e.ctrlKey||e.metaKey;if(!m(e)&&(t||e.keyCode==ee)){var r=f.selection.getRng(),i=r.startContainer,o=r.startOffset;if(t&&e.shiftKey)return;if(p(t,r))return void e.preventDefault();if(!n&&r.collapsed&&3==i.nodeType&&(t?o0))return;e.preventDefault(),n&&f.selection.getSel().modify("extend",t?"forward":"backward",e.metaKey?"lineboundary":"word"),h(t)}}),f.on("keypress",function(t){if(!m(t)&&!w.isCollapsed()&&t.charCode>31&&!e.metaKeyPressed(t)){var n,r,i,o,a,s;n=f.selection.getRng(),s=String.fromCharCode(t.charCode),t.preventDefault(),r=Z(n.startContainer).parents().filter(function(e,t){return!!f.schema.getTextInlineElements()[t.nodeName]}),h(!0),r=r.filter(function(e,t){return!Z.contains(f.getBody(),t)}),r.length?(i=x.createFragment(),r.each(function(e,t){t=t.cloneNode(!1),i.hasChildNodes()?(t.appendChild(i.firstChild),i.appendChild(t)):(a=t,i.appendChild(t)),i.appendChild(t)}),a.appendChild(f.getDoc().createTextNode(s)),o=x.getParent(n.startContainer,x.isBlock),x.isEmpty(o)?Z(o).empty().append(i):n.insertNode(i),n.setStart(a.firstChild,1),n.setEnd(a.firstChild,1),f.selection.setRng(n)):f.selection.setContent(s)}}),f.addCommand("Delete",function(){h()}),f.addCommand("ForwardDelete",function(){h(!0)}),N||(f.on("dragstart",function(e){_=w.getRng(),g(e)}),f.on("drop",function(e){if(!m(e)){var n=v(e);n&&(e.preventDefault(),l.setEditorTimeout(f,function(){var r=t.getCaretRangeFromPoint(e.x,e.y,C);_&&(w.setRng(_),_=null,b()),w.setRng(r),y(n.html)}))}}),f.on("cut",function(e){m(e)||!e.clipboardData||f.selection.isCollapsed()||(e.preventDefault(),e.clipboardData.clearData(),e.clipboardData.setData("text/html",f.selection.getContent()),e.clipboardData.setData("text/plain",f.selection.getContent({format:"text"})),l.setEditorTimeout(f,function(){b(!0)}))}))}function C(){function e(e){var t=ne.create("body"),n=e.cloneContents();return t.appendChild(n),re.serializer.serialize(t,{format:"html"})}function n(n){if(!n.setStart){if(n.item)return!1;var r=n.duplicate();return r.moveToElementText(f.getBody()),t.compareRanges(n,r)}var i=e(n),o=ne.createRng();o.selectNode(f.getBody());var a=e(o);return i===a}f.on("keydown",function(e){var t=e.keyCode,r,i;if(!m(e)&&(t==te||t==ee)){if(r=f.selection.isCollapsed(),i=f.getBody(),r&&!ne.isEmpty(i))return;if(!r&&!n(f.selection.getRng()))return;e.preventDefault(),f.setContent(""),i.firstChild&&ne.isBlock(i.firstChild)?f.selection.setCursorLocation(i.firstChild,0):f.selection.setCursorLocation(i,0),f.nodeChanged()}})}function x(){f.shortcuts.add("meta+a",null,"SelectAll")}function w(){f.settings.content_editable||ne.bind(f.getDoc(),"mousedown mouseup",function(e){var t;if(e.target==f.getDoc().documentElement)if(t=re.getRng(),f.getBody().focus(),"mousedown"==e.type){if(u.isCaretContainer(t.startContainer))return;re.placeCaretAt(e.clientX,e.clientY)}else re.setRng(t)})}function E(){f.on("keydown",function(e){if(!m(e)&&e.keyCode===ee){if(!f.getBody().getElementsByTagName("hr").length)return;if(re.isCollapsed()&&0===re.getRng(!0).startOffset){var t=re.getNode(),n=t.previousSibling;if("HR"==t.nodeName)return ne.remove(t),void e.preventDefault();n&&n.nodeName&&"hr"===n.nodeName.toLowerCase()&&(ne.remove(n),e.preventDefault())}}})}function N(){window.Range.prototype.getClientRects||f.on("mousedown",function(e){if(!m(e)&&"HTML"===e.target.nodeName){var t=f.getBody();t.blur(),l.setEditorTimeout(f,function(){t.focus()})}})}function _(){f.on("click",function(e){var t=e.target;/^(IMG|HR)$/.test(t.nodeName)&&"false"!==ne.getContentEditableParent(t)&&(e.preventDefault(),re.select(t),f.nodeChanged()),"A"==t.nodeName&&ne.hasClass(t,"mce-item-anchor")&&(e.preventDefault(),re.select(t))})}function S(){function e(){var e=ne.getAttribs(re.getStart().cloneNode(!1));return function(){var t=re.getStart();t!==f.getBody()&&(ne.setAttrib(t,"style",null),Q(e,function(e){t.setAttributeNode(e.cloneNode(!0))}))}}function t(){return!re.isCollapsed()&&ne.getParent(re.getStart(),ne.isBlock)!=ne.getParent(re.getEnd(),ne.isBlock)}f.on("keypress",function(n){var r;if(!m(n)&&(8==n.keyCode||46==n.keyCode)&&t())return r=e(),f.getDoc().execCommand("delete",!1,null),r(),n.preventDefault(),!1}),ne.bind(f.getDoc(),"cut",function(n){var r;!m(n)&&t()&&(r=e(),l.setEditorTimeout(f,function(){r()}))})}function k(){document.body.setAttribute("role","application")}function T(){f.on("keydown",function(e){if(!m(e)&&e.keyCode===ee&&re.isCollapsed()&&0===re.getRng(!0).startOffset){var t=re.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}})}function R(){h()>7||(p("RespectVisibilityInDesign",!0),f.contentStyles.push(".mceHideBrInPre pre br {display: none}"),ne.addClass(f.getBody(),"mceHideBrInPre"),oe.addNodeFilter("pre",function(e){for(var t=e.length,n,r,o,a;t--;)for(n=e[t].getAll("br"),r=n.length;r--;)o=n[r],a=o.prev,a&&3===a.type&&"\n"!=a.value.charAt(a.value-1)?a.value+="\n":o.parent.insert(new i("#text",3),o,!0).value="\n"}),ae.addNodeFilter("pre",function(e){for(var t=e.length,n,r,i,o;t--;)for(n=e[t].getAll("br"),r=n.length;r--;)i=n[r],o=i.prev,o&&3==o.type&&(o.value=o.value.replace(/\r?\n$/,""))}))}function A(){ne.bind(f.getBody(),"mouseup",function(){var e,t=re.getNode();"IMG"==t.nodeName&&((e=ne.getStyle(t,"width"))&&(ne.setAttrib(t,"width",e.replace(/[^0-9%]+/g,"")),ne.setStyle(t,"width","")),(e=ne.getStyle(t,"height"))&&(ne.setAttrib(t,"height",e.replace(/[^0-9%]+/g,"")),ne.setStyle(t,"height","")))})}function B(){f.on("keydown",function(t){var n,r,i,o,a;if(!m(t)&&t.keyCode==e.BACKSPACE&&(n=re.getRng(),r=n.startContainer,i=n.startOffset,o=ne.getRoot(),a=r,n.collapsed&&0===i)){for(;a&&a.parentNode&&a.parentNode.firstChild==a&&a.parentNode!=o;)a=a.parentNode;"BLOCKQUOTE"===a.tagName&&(f.formatter.toggle("blockquote",null,a),n=ne.createRng(),n.setStart(r,0),n.setEnd(r,0),re.setRng(n))}})}function D(){function e(){K(),p("StyleWithCSS",!1),p("enableInlineTableEditing",!1),ie.object_resizing||p("enableObjectResizing",!1)}ie.readonly||f.on("BeforeExecCommand MouseDown",e)}function L(){function e(){Q(ne.select("a"),function(e){var t=e.parentNode,n=ne.getRoot();if(t.lastChild===e){for(;t&&!ne.isBlock(t);){if(t.parentNode.lastChild!==t||t===n)return;t=t.parentNode}ne.add(t,"br",{"data-mce-bogus":1})}})}f.on("SetContent ExecCommand",function(t){"setcontent"!=t.type&&"mceInsertLink"!==t.command||e()})}function M(){ie.forced_root_block&&f.on("init",function(){p("DefaultParagraphSeparator",ie.forced_root_block)})}function P(){f.on("keydown",function(e){var t;m(e)||e.keyCode!=ee||(t=f.getDoc().selection.createRange(),t&&t.item&&(e.preventDefault(),f.undoManager.beforeChange(),ne.remove(t.item(0)),f.undoManager.add()))})}function O(){var e;h()>=10&&(e="",Q("p div h1 h2 h3 h4 h5 h6".split(" "),function(t,n){e+=(n>0?",":"")+t+":empty"}),f.contentStyles.push(e+"{padding-right: 1px !important}"))}function H(){h()<9&&(oe.addNodeFilter("noscript",function(e){for(var t=e.length,n,r;t--;)n=e[t],r=n.firstChild,r&&n.attr("data-mce-innertext",r.value)}),ae.addNodeFilter("noscript",function(e){for(var t=e.length,n,r,a;t--;)n=e[t],r=e[t].firstChild,r?r.value=o.decode(r.value):(a=n.attributes.map["data-mce-innertext"],a&&(n.attr("data-mce-innertext",null),r=new i("#text",3),r.value=a,r.raw=!0,n.append(r)))}))}function I(){function e(e,t){var n=i.createTextRange();try{n.moveToPoint(e,t)}catch(r){n=null}return n}function t(t){var r;t.button?(r=e(t.x,t.y),r&&(r.compareEndPoints("StartToStart",a)>0?r.setEndPoint("StartToStart",a):r.setEndPoint("EndToEnd",a),r.select())):n()}function n(){var e=r.selection.createRange();a&&!e.item&&0===e.compareEndPoints("StartToEnd",e)&&a.select(),ne.unbind(r,"mouseup",n),ne.unbind(r,"mousemove",t),a=o=0}var r=ne.doc,i=r.body,o,a,s;r.documentElement.unselectable=!0,ne.bind(r,"mousedown contextmenu",function(i){if("HTML"===i.target.nodeName){if(o&&n(),s=r.documentElement,s.scrollHeight>s.clientHeight)return;o=1,a=e(i.x,i.y),a&&(ne.bind(r,"mouseup",n),ne.bind(r,"mousemove",t),ne.getRoot().focus(),a.select())}})}function F(){f.on("keyup focusin mouseup",function(t){65==t.keyCode&&e.metaKeyPressed(t)||re.normalize()},!0)}function z(){f.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")}function U(){f.inline||f.on("keydown",function(){document.activeElement==document.body&&f.getWin().focus()})}function W(){f.inline||(f.contentStyles.push("body {min-height: 150px}"),f.on("click",function(e){var t;if("HTML"==e.target.nodeName){if(a.ie>11)return void f.getBody().focus();t=f.selection.getRng(),f.getBody().focus(),f.selection.setRng(t),f.selection.normalize(),f.nodeChanged()}}))}function V(){a.mac&&f.on("keydown",function(t){!e.metaKeyPressed(t)||t.shiftKey||37!=t.keyCode&&39!=t.keyCode||(t.preventDefault(),f.selection.getSel().modify("move",37==t.keyCode?"backward":"forward","lineboundary"))})}function $(){p("AutoUrlDetect",!1)}function q(){f.on("click",function(e){var t=e.target;do if("A"===t.tagName)return void e.preventDefault();while(t=t.parentNode)}),f.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")}function j(){f.on("init",function(){f.dom.bind(f.getBody(),"submit",function(e){e.preventDefault()})})}function Y(){oe.addNodeFilter("br",function(e){for(var t=e.length;t--;)"Apple-interchange-newline"==e[t].attr("class")&&e[t].remove()})}function X(){f.on("dragstart",function(e){g(e)}),f.on("drop",function(e){if(!m(e)){var n=v(e);if(n&&n.id!=f.id){e.preventDefault();var r=t.getCaretRangeFromPoint(e.x,e.y,f.getDoc());re.setRng(r),y(n.html)}}})}function K(){}function G(){var e;return se?(e=f.selection.getSel(),!e||!e.rangeCount||0===e.rangeCount):0}function J(){function t(e){var t=new d(e.getBody()),n=e.selection.getRng(),r=c.fromRangeStart(n),i=c.fromRangeEnd(n),o=t.prev(r),a=t.next(i);return!e.selection.isCollapsed()&&(!o||o.isAtStart()&&r.isEqual(o))&&(!a||a.isAtEnd()&&r.isEqual(a))}f.on("keypress",function(n){!m(n)&&!re.isCollapsed()&&n.charCode>31&&!e.metaKeyPressed(n)&&t(f)&&(n.preventDefault(),f.setContent(String.fromCharCode(n.charCode)),f.selection.select(f.getBody(),!0),f.selection.collapse(!1),f.nodeChanged())}),f.on("keydown",function(e){var n=e.keyCode;m(e)||n!=te&&n!=ee||t(f)&&(e.preventDefault(),f.setContent(""),f.nodeChanged())})}var Q=s.each,Z=f.$,ee=e.BACKSPACE,te=e.DELETE,ne=f.dom,re=f.selection,ie=f.settings,oe=f.parser,ae=f.serializer,se=a.gecko,le=a.ie,ue=a.webkit,ce="data:text/mce-internal,",de=le?"Text":"URL";return B(),C(),a.windowsPhone||F(),ue&&(J(),b(),w(),_(),M(),j(),T(),Y(),a.iOS?(U(),W(),q()):x()),le&&a.ie<11&&(E(),k(),R(),A(),P(),O(),H(),I()),a.ie>=11&&(W(),T()),a.ie&&(x(),$(),X()),se&&(J(),E(),N(),S(),D(),L(),z(),V(),T()),{refreshContentEditable:K,isHidden:G}}}),r(Ue,[pe,w,m],function(e,t,n){function r(e,t){return"selectionchange"==t?e.getDoc():!e.inline&&/^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(t)?e.getDoc().documentElement:e.settings.event_root?(e.eventRoot||(e.eventRoot=o.select(e.settings.event_root)[0]),e.eventRoot):e.getBody()}function i(e,t){function n(e){return!e.hidden&&!e.readonly}var i=r(e,t),s;if(e.delegates||(e.delegates={}),!e.delegates[t])if(e.settings.event_root){if(a||(a={},e.editorManager.on("removeEditor",function(){var t;if(!e.editorManager.activeEditor&&a){for(t in a)e.dom.unbind(r(e,t));a=null}})),a[t])return;s=function(r){for(var i=r.target,a=e.editorManager.editors,s=a.length;s--;){var l=a[s].getBody();(l===i||o.isChildOf(i,l))&&n(a[s])&&a[s].fire(t,r)}},a[t]=s,o.bind(i,t,s)}else s=function(r){n(e)&&e.fire(t,r)},o.bind(i,t,s),e.delegates[t]=s}var o=t.DOM,a,s={bindPendingEventDelegates:function(){var e=this;n.each(e._pendingNativeEvents,function(t){i(e,t)})},toggleNativeEvent:function(e,t){var n=this;"focus"!=e&&"blur"!=e&&(t?n.initialized?i(n,e):n._pendingNativeEvents?n._pendingNativeEvents.push(e):n._pendingNativeEvents=[e]:n.initialized&&(n.dom.unbind(r(n,e),e,n.delegates[e]),delete n.delegates[e]))},unbindAllNativeEvents:function(){var e=this,t;if(e.delegates){for(t in e.delegates)e.dom.unbind(r(e,t),t,e.delegates[t]);delete e.delegates}e.inline||(e.getBody().onload=null,e.dom.unbind(e.getWin()),e.dom.unbind(e.getDoc())),e.dom.unbind(e.getBody()),e.dom.unbind(e.getContainer())}};return s=n.extend({},e,s)}),r(We,[],function(){function e(e,t,n){try{e.getDoc().execCommand(t,!1,n)}catch(r){}}function t(e){var t,n;return t=e.getBody(),n=function(t){e.dom.getParents(t.target,"a").length>0&&t.preventDefault()},e.dom.bind(t,"click",n),{unbind:function(){e.dom.unbind(t,"click",n)}}}function n(n,r){n._clickBlocker&&(n._clickBlocker.unbind(),n._clickBlocker=null),r?(n._clickBlocker=t(n),n.selection.controlSelection.hideResizeRect(),n.readonly=!0,n.getBody().contentEditable=!1):(n.readonly=!1,n.getBody().contentEditable=!0,e(n,"StyleWithCSS",!1),e(n,"enableInlineTableEditing",!1),e(n,"enableObjectResizing",!1),n.focus(),n.nodeChanged())}function r(e,t){var r=e.readonly?"readonly":"design";t!=r&&(e.initialized?n(e,"readonly"==t):e.on("init",function(){n(e,"readonly"==t)}),e.fire("SwitchMode",{mode:t}))}return{setMode:r}}),r(Ve,[m,d],function(e,t){var n=e.each,r=e.explode,i={f9:120,f10:121,f11:122},o=e.makeMap("alt,ctrl,shift,meta,access");return function(a){function s(e){var a,s,l={};n(r(e,"+"),function(e){e in o?l[e]=!0:/^[0-9]{2,}$/.test(e)?l.keyCode=parseInt(e,10):(l.charCode=e.charCodeAt(0),l.keyCode=i[e]||e.toUpperCase().charCodeAt(0))}),a=[l.keyCode];for(s in o)l[s]?a.push(s):l[s]=!1;return l.id=a.join(","),l.access&&(l.alt=!0,t.mac?l.ctrl=!0:l.shift=!0),l.meta&&(t.mac?l.meta=!0:(l.ctrl=!0,l.meta=!1)),l}function l(t,n,i,o){var l;return l=e.map(r(t,">"),s),l[l.length-1]=e.extend(l[l.length-1],{func:i,scope:o||a}),e.extend(l[0],{desc:a.translate(n),subpatterns:l.slice(1)})}function u(e){return e.altKey||e.ctrlKey||e.metaKey}function c(e){return"keydown"===e.type&&e.keyCode>=112&&e.keyCode<=123}function d(e,t){return!!t&&(t.ctrl==e.ctrlKey&&t.meta==e.metaKey&&(t.alt==e.altKey&&t.shift==e.shiftKey&&(!!(e.keyCode==t.keyCode||e.charCode&&e.charCode==t.charCode)&&(e.preventDefault(),!0))))}function f(e){return e.func?e.func.call(e.scope):null}var p=this,h={},m=[];a.on("keyup keypress keydown",function(e){!u(e)&&!c(e)||e.isDefaultPrevented()||(n(h,function(t){if(d(e,t))return m=t.subpatterns.slice(0),"keydown"==e.type&&f(t),!0}),d(e,m[0])&&(1===m.length&&"keydown"==e.type&&f(m[0]),m.shift()))}),p.add=function(t,i,o,s){var u;return u=o,"string"==typeof o?o=function(){a.execCommand(u,!1,null)}:e.isArray(u)&&(o=function(){a.execCommand(u[0],u[1],u[2])}),n(r(e.trim(t.toLowerCase())),function(e){var t=l(e,i,o,s);h[t.id]=t}),!0},p.remove=function(e){var t=l(e);return!!h[t.id]&&(delete h[t.id],!0)}}}),r($e,[u,m,z],function(e,t,n){return function(r,i){function o(e){var t,n;return n={"image/jpeg":"jpg","image/jpg":"jpg","image/gif":"gif","image/png":"png"},t=n[e.blob().type.toLowerCase()]||"dat",e.filename()+"."+t}function a(e,t){return e?e.replace(/\/$/,"")+"/"+t.replace(/^\//,""):t}function s(e){return{id:e.id,blob:e.blob,base64:e.base64,filename:n.constant(o(e))}}function l(e,t,n,r){var o,s;o=new XMLHttpRequest,o.open("POST",i.url),o.withCredentials=i.credentials,o.upload.onprogress=function(e){r(e.loaded/e.total*100)},o.onerror=function(){n("Image upload failed due to a XHR Transport error. Code: "+o.status)},o.onload=function(){var e;return 200!=o.status?void n("HTTP Error: "+o.status):(e=JSON.parse(o.responseText),e&&"string"==typeof e.location?void t(a(i.basePath,e.location)):void n("Invalid JSON: "+o.responseText))},s=new FormData,s.append("file",e.blob(),e.filename()),o.send(s)}function u(){return new e(function(e){e([])})}function c(e,t){return{url:t,blobInfo:e,status:!0}}function d(e,t){return{url:"",blobInfo:e,status:!1,error:t}}function f(e,n){t.each(y[e],function(e){e(n)}),delete y[e]}function p(t,n,i){return r.markPending(t.blobUri()),new e(function(e){var o,a,l=function(){};try{var u=function(){o&&(o.close(),a=l)},p=function(n){u(),r.markUploaded(t.blobUri(),n),f(t.blobUri(),c(t,n)),e(c(t,n))},h=function(n){u(),r.removeFailed(t.blobUri()),f(t.blobUri(),d(t,n)),e(d(t,n))};a=function(e){e<0||e>100||(o||(o=i()),o.progressBar.value(e))},n(s(t),p,h,a)}catch(m){e(d(t,m.message))}})}function h(e){return e===l}function m(t){var n=t.blobUri();return new e(function(e){y[n]=y[n]||[],y[n].push(e)})}function g(n,o){return n=t.grep(n,function(e){return!r.isUploaded(e.blobUri())}),e.all(t.map(n,function(e){return r.isPending(e.blobUri())?m(e):p(e,i.handler,o)}))}function v(e,t){return!i.url&&h(i.handler)?u():g(e,t)}var y={};return i=t.extend({credentials:!1,handler:l},i),{upload:v}}}),r(qe,[u],function(e){function t(t){return new e(function(e){var n=new XMLHttpRequest;n.open("GET",t,!0),n.responseType="blob",n.onload=function(){200==this.status&&e(this.response)},n.send()})}function n(e){var t,n;return e=decodeURIComponent(e).split(","),n=/data:([^;]+)/.exec(e[0]),n&&(t=n[1]),{type:t,data:e[1]}}function r(t){return new e(function(e){var r,i,o;t=n(t);try{r=atob(t.data)}catch(a){return void e(new Blob([]))}for(i=new Uint8Array(r.length),o=0;o0&&(n&&(l*=-1),r.left+=l,r.right+=l),r}function l(){var n,r,o,a,s;for(n=i("*[contentEditable=false]",t),a=0;a
      ').css(l).appendTo(t),o&&m.addClass("mce-visual-caret-before"),d(),u=a.ownerDocument.createRange(),u.setStart(g,0),u.setEnd(g,0),u):(g=e.insertInline(a,o),u=a.ownerDocument.createRange(),s(g.nextSibling)?(u.setStart(g,0),u.setEnd(g,0)):(u.setStart(g,1),u.setEnd(g,1)),u)}function c(){l(),g&&(e.remove(g),g=null),m&&(m.remove(),m=null),clearInterval(h)}function d(){h=a.setInterval(function(){i("div.mce-visual-caret",t).toggleClass("mce-visual-caret-hidden")},500)}function f(){a.clearInterval(h)}function p(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"}var h,m,g;return{show:u,hide:c,getCss:p,destroy:f}}}),r(Qe,[h,_,W],function(e,t,n){function r(i){function o(t){return e.map(t,function(e){return e=n.clone(e),e.node=i,e})}if(e.isArray(i))return e.reduce(i,function(e,t){return e.concat(r(t))},[]);if(t.isElement(i))return o(i.getClientRects());if(t.isText(i)){var a=i.ownerDocument.createRange();return a.setStart(i,0),a.setEnd(i,i.data.length),o(a.getClientRects())}}return{getClientRects:r}}),r(Ze,[z,h,Qe,U,ie,oe,$,W],function(e,t,n,r,i,o,a,s){function l(e,t,n,o){for(;o=i.findNode(o,e,r.isEditableCaretCandidate,t);)if(n(o))return}function u(e,r,i,o,a,s){function u(o){var s,l,u;for(u=n.getClientRects(o),e==-1&&(u=u.reverse()),s=0;s0&&r(l,t.last(f))&&c++,l.line=c,a(l))return!0;f.push(l)}}var c=0,d,f=[],p;return(p=t.last(s.getClientRects()))?(d=s.getNode(),u(d),l(e,o,u,d),f):f}function c(e,t){return t.line>e}function d(e,t){return t.line===e}function f(e,n,r,i){function l(n){return 1==e?t.last(n.getClientRects()):t.last(n.getClientRects())}var u=new o(n),c,d,f,p,h=[],m=0,g,v;1==e?(c=u.next,d=s.isBelow,f=s.isAbove,p=a.after(i)):(c=u.prev,d=s.isAbove,f=s.isBelow,p=a.before(i)),v=l(p);do if(p.isVisible()&&(g=l(p),!f(g,v))){if(h.length>0&&d(g,t.last(h))&&m++,g=s.clone(g),g.position=p,g.line=m,r(g))return h;h.push(g)}while(p=c(p));return h}var p=e.curry,h=p(u,-1,s.isAbove,s.isBelow),m=p(u,1,s.isBelow,s.isAbove);return{upUntil:h,downUntil:m,positionsUntil:f,isAboveLine:p(c),isLine:p(d)}}),r(et,[z,h,_,Qe,W,ie,U],function(e,t,n,r,i,o,a){function s(e,t){return Math.abs(e.left-t)}function l(e,t){return Math.abs(e.right-t)}function u(e,n){function r(e,t){return e>=t.left&&e<=t.right}return t.reduce(e,function(e,t){var i,o;return i=Math.min(s(e,n),l(e,n)),o=Math.min(s(t,n),l(t,n)),r(n,t)?t:r(n,e)?e:o==i&&m(t.node)?t:o=e.top&&i<=e.bottom}),a=u(o,n),a&&(a=u(d(e,a),n),a&&m(a.node))?p(a,n):null}var m=n.isContentEditableFalse,g=o.findNode,v=e.curry;return{findClosestClientRect:u,findLineNodeRects:d,closestCaret:h}}),r(tt,[],function(){var e=function(e){var t,n,r,i;return i=e.getBoundingClientRect(),t=e.ownerDocument,n=t.documentElement,r=t.defaultView,{top:i.top+r.pageYOffset-n.clientTop,left:i.left+r.pageXOffset-n.clientLeft}},t=function(t){return t.inline?e(t.getBody()):{left:0,top:0}},n=function(e){var t=e.getBody();return e.inline?{left:t.scrollLeft,top:t.scrollTop}:{left:0,top:0}},r=function(e){var t=e.getBody(),n=e.getDoc().documentElement,r={left:t.scrollLeft,top:t.scrollTop},i={left:t.scrollLeft||n.scrollLeft,top:t.scrollTop||n.scrollTop};return e.inline?r:i},i=function(t,n){if(n.target.ownerDocument!==t.getDoc()){var i=e(t.getContentAreaContainer()),o=r(t);return{left:n.pageX-i.left+o.left,top:n.pageY-i.top+o.top}}return{left:n.pageX,top:n.pageY}},o=function(e,t,n){return{pageX:n.left-e.left+t.left,pageY:n.top-e.top+t.top}},a=function(e,r){return o(t(e),n(e),i(e,r))};return{calc:a}}),r(nt,[_,h,z,c,w,tt],function(e,t,n,r,i,o){var a=e.isContentEditableFalse,s=e.isContentEditableTrue,l=function(e,t){return a(t)&&t!==e},u=function(e,t,n){return t!==n&&!e.dom.isChildOf(t,n)&&!a(t)},c=function(e){var t=e.cloneNode(!0);return t.removeAttribute("data-mce-selected"),t},d=function(e,t,n,r){var i=t.cloneNode(!0);e.dom.setStyles(i,{width:n,height:r}),e.dom.setAttrib(i,"data-mce-selected",null);var o=e.dom.create("div",{"class":"mce-drag-container","data-mce-bogus":"all",unselectable:"on",contenteditable:"false"});return e.dom.setStyles(o,{position:"absolute",opacity:.5,overflow:"hidden",border:0,padding:0,margin:0,width:n,height:r}),e.dom.setStyles(i,{margin:0,boxSizing:"border-box"}),o.appendChild(i),o},f=function(e,t){e.parentNode!==t&&t.appendChild(e)},p=function(e,t,n,r,i,o){var a=0,s=0;e.style.left=t.pageX+"px",e.style.top=t.pageY+"px",t.pageX+n>i&&(a=t.pageX+n-i),t.pageY+r>o&&(s=t.pageY+r-o),e.style.width=n-a+"px",e.style.height=r-s+"px"},h=function(e){e&&e.parentNode&&e.parentNode.removeChild(e)},m=function(e){return 0===e.button},g=function(e){return e.element},v=function(e,t){return{pageX:t.pageX-e.relX,pageY:t.pageY+5}},y=function(e,r){return function(i){if(m(i)){var o=t.find(r.dom.getParents(i.target),n.or(a,s));if(l(r.getBody(),o)){var u=r.dom.getPos(o),c=r.getBody(),f=r.getDoc().documentElement;e.element=o,e.screenX=i.screenX,e.screenY=i.screenY,e.maxX=(r.inline?c.scrollWidth:f.offsetWidth)-2,e.maxY=(r.inline?c.scrollHeight:f.offsetHeight)-2,e.relX=i.pageX-u.x,e.relY=i.pageY-u.y,e.width=o.offsetWidth,e.height=o.offsetHeight,e.ghost=d(r,o,e.width,e.height)}}}},b=function(e,t){var n=r.throttle(function(e,n){t._selectionOverrides.hideFakeCaret(),t.selection.placeCaretAt(e,n)},0);return function(r){var i=Math.max(Math.abs(r.screenX-e.screenX),Math.abs(r.screenY-e.screenY));if(g(e)&&!e.dragging&&i>10){var a=t.fire("dragstart",{target:e.element});if(a.isDefaultPrevented())return;e.dragging=!0,t.focus()}if(e.dragging){var s=v(e,o.calc(t,r));f(e.ghost,t.getBody()),p(e.ghost,s,e.width,e.height,e.maxX,e.maxY),n(r.clientX,r.clientY)}}},C=function(e){var t=e.getSel().getRangeAt(0),n=t.startContainer;return 3===n.nodeType?n.parentNode:n},x=function(e,t){return function(n){if(e.dragging&&u(t,C(t.selection),e.element)){var r=c(e.element),i=t.fire("drop",{targetClone:r,clientX:n.clientX,clientY:n.clientY});i.isDefaultPrevented()||(r=i.targetClone,t.undoManager.transact(function(){h(e.element),t.insertContent(t.dom.getOuterHTML(r)),t._selectionOverrides.hideFakeCaret()}))}E(e)}},w=function(e,t){return function(){E(e),e.dragging&&t.fire("dragend")}},E=function(e){e.dragging=!1,e.element=null,h(e.ghost)},N=function(e){var t={},n,r,o,a,s,l;n=i.DOM,l=document,r=y(t,e),o=b(t,e),a=x(t,e),s=w(t,e),e.on("mousedown",r),e.on("mousemove",o),e.on("mouseup",a),n.bind(l,"mousemove",o),n.bind(l,"mouseup",s),e.on("remove",function(){n.unbind(l,"mousemove",o),n.unbind(l,"mouseup",s)})},_=function(e){e.on("drop",function(t){var n="undefined"!=typeof t.clientX?e.getDoc().elementFromPoint(t.clientX,t.clientY):null;(a(n)||a(e.dom.getContentEditableParent(n)))&&t.preventDefault()})},S=function(e){N(e),_(e)};return{init:S}}),r(rt,[d,oe,$,k,ie,Je,Ze,et,_,T,W,I,z,h,c,nt],function(e,t,n,r,i,o,a,s,l,u,c,d,f,p,h,m){function g(e,t){for(;t=e(t);)if(t.isVisible())return t;return t}function v(u){function v(e){return u.dom.hasClass(e,"mce-offscreen-selection")}function _(){var e=u.dom.get(le);return e?e.getElementsByTagName("*")[0]:e}function S(e){return u.dom.isBlock(e)}function k(e){e&&u.selection.setRng(e)}function T(){return u.selection.getRng()}function R(e,t){u.selection.scrollIntoView(e,t)}function A(e,t,n){var r;return r=u.fire("ShowCaret",{target:t,direction:e,before:n}),r.isDefaultPrevented()?null:(R(t,e===-1),se.show(n,t))}function B(e){var t;return t=u.fire("BeforeObjectSelected",{target:e}),t.isDefaultPrevented()?null:D(e)}function D(e){var t=e.ownerDocument.createRange();return t.selectNode(e),t}function L(e,t){var n=i.isInSameBlock(e,t);return!(n||!l.isBr(e.getNode()))||n}function M(e,t){return t=i.normalizeRange(e,re,t),e==-1?n.fromRangeStart(t):n.fromRangeEnd(t)}function P(e){return r.isCaretContainerBlock(e.startContainer)}function O(e,t,n,r){var i,o,a,s;return!r.collapsed&&(i=N(r),C(i))?A(e,i,e==-1):(s=P(r),o=M(e,r),n(o)?B(o.getNode(e==-1)):(o=t(o))?n(o)?A(e,o.getNode(e==-1),1==e):(a=t(o),n(a)&&L(o,a)?A(e,a.getNode(e==-1),1==e):s?$(o.toRange()):null):s?r:null)}function H(e,t,n){var r,i,o,l,u,c,d,f,h;if(h=N(n),r=M(e,n),i=t(re,a.isAboveLine(1),r),o=p.filter(i,a.isLine(1)),u=p.last(r.getClientRects()),E(r)&&(h=r.getNode()),w(r)&&(h=r.getNode(!0)),!u)return null;if(c=u.left,l=s.findClosestClientRect(o,c),l&&C(l.node))return d=Math.abs(c-l.left),f=Math.abs(c-l.right),A(e,l.node,d=11)&&(t.innerHTML='
      '),t}var o,a,s;if(r.collapsed&&u.settings.forced_root_block){if(o=u.dom.getParent(r.startContainer,"PRE"),!o)return;a=1==t?oe(n.fromRangeStart(r)):ae(n.fromRangeStart(r)),a||(s=i(),1==t?u.$(o).after(s):u.$(o).before(s),u.selection.select(s,!0),u.selection.collapse())}}function F(e,t,n,r){var i;return(i=O(e,t,n,r))?i:(i=I(e,r),i?i:null)}function z(e,t,n){var r;return(r=H(e,t,n))?r:(r=I(e,n),r?r:null)}function U(){return ce("*[data-mce-caret]")[0]}function W(e){e.hasAttribute("data-mce-caret")&&(r.showCaretContainerBlock(e),k(T()),R(e[0]))}function V(e){var t,r;return e=i.normalizeRange(1,re,e),t=n.fromRangeStart(e),C(t.getNode())?A(1,t.getNode(),!t.isAtEnd()):C(t.getNode(!0))?A(1,t.getNode(!0),!1):(r=u.dom.getParent(t.getNode(),f.or(C,b)),C(r)?A(1,r,!1):null)}function $(e){var t;return e&&e.collapsed?(t=V(e),t?t:e):e}function q(e){var t,i,o,a;return C(e)?(C(e.previousSibling)&&(o=e.previousSibling),i=ae(n.before(e)),i||(t=oe(n.after(e))),t&&x(t.getNode())&&(a=t.getNode()),r.remove(e.previousSibling),r.remove(e.nextSibling),u.dom.remove(e),u.dom.isEmpty(u.getBody())?(u.setContent(""),void u.focus()):o?n.after(o).toRange():a?n.before(a).toRange():i?i.toRange():t?t.toRange():null):null}function j(e){var t=u.schema.getTextBlockElements();return e.nodeName in t}function Y(e){return u.dom.isEmpty(e)}function X(e,t,r){var i=u.dom,o,a,s,l;if(o=i.getParent(t.getNode(),i.isBlock),a=i.getParent(r.getNode(),i.isBlock),e===-1){if(l=r.getNode(!0),w(r)&&S(l))return j(o)?(Y(o)&&i.remove(o),n.after(l).toRange()):q(r.getNode(!0))}else if(l=t.getNode(),E(t)&&S(l))return j(a)?(Y(a)&&i.remove(a),n.before(l).toRange()):q(t.getNode());if(o===a||!j(o)||!j(a))return null;for(;s=o.firstChild;)a.appendChild(s);return u.dom.remove(o),r.toRange()}function K(e,t,n,i){var o,a,s,l;return!i.collapsed&&(o=N(i),C(o))?$(q(o)):(a=M(e,i),n(a)&&r.isCaretContainerBlock(i.startContainer)?(l=e==-1?ie.prev(a):ie.next(a),l?$(l.toRange()):i):t(a)?$(q(a.getNode(e==-1))):(s=e==-1?ie.prev(a):ie.next(a),t(s)?e===-1?X(e,a,s):X(e,s,a):void 0))}function G(){function i(e,t){var n=t(T());n&&!e.isDefaultPrevented()&&(e.preventDefault(),k(n))}function o(e){for(var t=u.getBody();e&&e!=t;){if(b(e)||C(e))return e;e=e.parentNode}return null}function l(e,t,n){return!n.collapsed&&p.reduce(n.getClientRects(),function(n,r){return n||c.containsXY(r,e,t)},!1)}function f(e){var t=!1;e.on("touchstart",function(){t=!1}),e.on("touchmove",function(){t=!0}),e.on("touchend",function(e){var n=o(e.target);C(n)&&(t||(e.preventDefault(),Z(B(n))))})}function g(){var e,t=o(u.selection.getNode());b(t)&&S(t)&&u.dom.isEmpty(t)&&(e=u.dom.create("br",{"data-mce-bogus":"1"}),u.$(t).empty().append(e),u.selection.setRng(n.before(e).toRange()))}function x(e){var t=U();if(t)return"compositionstart"==e.type?(e.preventDefault(),e.stopPropagation(),void W(t)):void(r.hasContent(t)&&W(t))}function N(e){var t;switch(e.keyCode){case d.DELETE:t=g();break;case d.BACKSPACE:t=g()}t&&e.preventDefault()}var R=y(F,1,oe,E),D=y(F,-1,ae,w),L=y(K,1,E,w),M=y(K,-1,w,E),P=y(z,-1,a.upUntil),O=y(z,1,a.downUntil);u.on("mouseup",function(){var e=T();e.collapsed&&k(V(e))}),u.on("click",function(e){var t;t=o(e.target),t&&(C(t)&&(e.preventDefault(),u.focus()),b(t)&&u.dom.isChildOf(t,u.selection.getNode())&&ee())}),u.on("blur NewBlock",function(){ee(),ne()});var H=function(e){var r=new t(e);if(!e.firstChild)return!1;var i=n.before(e.firstChild),o=r.next(i);return o&&!E(o)&&!w(o)},I=function(e,t){var n=u.dom.getParent(e,u.dom.isBlock),r=u.dom.getParent(t,u.dom.isBlock);return n===r},j=function(e){return!(e.keyCode>=112&&e.keyCode<=123)},Y=function(e,t){var n=u.dom.getParent(e,u.dom.isBlock),r=u.dom.getParent(t,u.dom.isBlock);return n&&!I(n,r)&&H(n)};f(u),u.on("mousedown",function(e){var t;if(t=o(e.target))C(t)?(e.preventDefault(),Z(B(t))):l(e.clientX,e.clientY,u.selection.getRng())||u.selection.placeCaretAt(e.clientX,e.clientY);else{ee(),ne();var n=s.closestCaret(re,e.clientX,e.clientY);n&&(Y(e.target,n.node)||(e.preventDefault(),u.getBody().focus(),k(A(1,n.node,n.before))))}}),u.on("keydown",function(e){if(!d.modifierPressed(e))switch(e.keyCode){case d.RIGHT:i(e,R);break;case d.DOWN:i(e,O);break;case d.LEFT:i(e,D);break;case d.UP:i(e,P);break;case d.DELETE:i(e,L);break;case d.BACKSPACE:i(e,M);break;default:C(u.selection.getNode())&&j(e)&&e.preventDefault()}}),u.on("keyup compositionstart",function(e){x(e),N(e)},!0),u.on("cut",function(){var e=u.selection.getNode();C(e)&&h.setEditorTimeout(u,function(){k($(q(e)))})}),u.on("getSelectionRange",function(e){var t=e.range;if(ue){if(!ue.parentNode)return void(ue=null);t=t.cloneRange(),t.selectNode(ue),e.range=t}}),u.on("setSelectionRange",function(e){var t;t=Z(e.range),t&&(e.range=t)}),u.on("AfterSetSelectionRange",function(e){var t=e.range;Q(t)||ne(),v(t.startContainer.parentNode)||ee()}),u.on("focus",function(){h.setEditorTimeout(u,function(){u.selection.setRng($(u.selection.getRng()))},0)}),u.on("copy",function(t){var n=t.clipboardData;if(!t.isDefaultPrevented()&&t.clipboardData&&!e.ie){var r=_();r&&(t.preventDefault(),n.clearData(),n.setData("text/html",r.outerHTML),n.setData("text/plain",r.outerText))}}),m.init(u)}function J(){var e=u.contentStyles,t=".mce-content-body";e.push(se.getCss()),e.push(t+" .mce-offscreen-selection {position: absolute;left: -9999999999px;max-width: 1000000px;}"+t+" *[contentEditable=false] {cursor: default;}"+t+" *[contentEditable=true] {cursor: text;}")}function Q(e){return r.isCaretContainer(e.startContainer)||r.isCaretContainer(e.endContainer)}function Z(t){var n,r=u.$,i=u.dom,o,a,s,l,c,d,f,p,h;if(!t)return null;if(t.collapsed){if(!Q(t)){if(f=M(1,t),C(f.getNode()))return A(1,f.getNode(),!f.isAtEnd());if(C(f.getNode(!0)))return A(1,f.getNode(!0),!1)}return null}return s=t.startContainer,l=t.startOffset,c=t.endOffset,3==s.nodeType&&0==l&&C(s.parentNode)&&(s=s.parentNode,l=i.nodeIndex(s),s=s.parentNode),1!=s.nodeType?null:(c==l+1&&(n=s.childNodes[l]),C(n)?(p=h=n.cloneNode(!0),d=u.fire("ObjectSelected",{target:n,targetClone:p}),d.isDefaultPrevented()?null:(p=d.targetClone,o=r("#"+le),0===o.length&&(o=r('
      ').attr("id",le),o.appendTo(u.getBody())),t=u.dom.createRng(),p===h&&e.ie?(o.empty().append('

      \xa0

      ').append(p),t.setStartAfter(o[0].firstChild.firstChild),t.setEndAfter(p)):(o.empty().append("\xa0").append(p).append("\xa0"),t.setStart(o[0].firstChild,1),t.setEnd(o[0].lastChild,0)),o.css({top:i.getPos(n,u.getBody()).y}),o[0].focus(),a=u.selection.getSel(),a.removeAllRanges(),a.addRange(t),u.$("*[data-mce-selected]").removeAttr("data-mce-selected"),n.setAttribute("data-mce-selected",1),ue=n,ne(),t)):null)}function ee(){ue&&(ue.removeAttribute("data-mce-selected"),u.$("#"+le).remove(),ue=null)}function te(){se.destroy(),ue=null}function ne(){se.hide()}var re=u.getBody(),ie=new t(re),oe=y(g,ie.next),ae=y(g,ie.prev),se=new o(u.getBody(),S),le="sel-"+u.dom.uniqueId(),ue,ce=u.$;return e.ceFalse&&(G(),J()),{showBlockCaretContainer:W,hideFakeCaret:ne,destroy:te}}var y=f.curry,b=l.isContentEditableTrue,C=l.isContentEditableFalse,x=l.isElement,w=i.isAfterContentEditableFalse,E=i.isBeforeContentEditableFalse,N=u.getSelectedNode;return v}),r(it,[],function(){var e=0,t=function(){var e=function(){return Math.round(4294967295*Math.random()).toString(36)},t=(new Date).getTime();return"s"+t.toString(36)+e()+e()+e()},n=function(n){return n+e++ +t()};return{uuid:n}}),r(ot,[],function(){var e=function(e,t,n){var r=e.sidebars?e.sidebars:[];r.push({name:t,settings:n}),e.sidebars=r};return{add:e}}),r(at,[w,g,N,R,A,O,P,Y,J,te,ne,re,le,ue,E,f,Le,Ie,B,L,ze,d,m,c,Ue,We,Ve,Ge,rt,it,ot,Ke],function(e,n,r,i,o,a,s,l,u,c,d,f,p,h,m,g,v,y,b,C,x,w,E,N,_,S,k,T,R,A,B,D){function L(e,t,i){var o=this,a,s,l;a=o.documentBaseUrl=i.documentBaseURL,s=i.baseURI,l=i.defaultSettings,t=H({id:e,theme:"modern",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:a,add_form_submit_trigger:!0,submit_patch:!0,add_unload_trigger:!0,convert_urls:!0,relative_urls:!0,remove_script_host:!0,object_resizing:!0,doctype:"",visual:!0,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,padd_empty_editor:!0,render_ui:!0,indentation:"30px",inline_styles:!0,convert_fonts_to_spans:!0,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",validate:!0,entity_encoding:"named",url_converter:o.convertURL,url_converter_scope:o,ie7_compat:!0},l,t),l&&l.external_plugins&&t.external_plugins&&(t.external_plugins=H({},l.external_plugins,t.external_plugins)),o.settings=t,r.language=t.language||"en",r.languageLoad=t.language_load,r.baseURL=i.baseURL,o.id=t.id=e,o.setDirty(!1),o.plugins={},o.documentBaseURI=new h(t.document_base_url||a,{base_uri:s}),o.baseURI=s,o.contentCSS=[],o.contentStyles=[],o.shortcuts=new k(o),o.loadedCSS={},o.editorCommands=new p(o),o.suffix=i.suffix,o.editorManager=i,o.inline=t.inline,o.settings.content_editable=o.inline,t.cache_suffix&&(w.cacheSuffix=t.cache_suffix.replace(/^[\?\&]+/,"")),t.override_viewport===!1&&(w.overrideViewPort=!1),i.fire("SetupEditor",o),o.execCallback("setup",o),o.$=n.overrideDefaults(function(){return{context:o.inline?o.getBody():o.getDoc(),element:o.getBody()}})}var M=e.DOM,P=r.ThemeManager,O=r.PluginManager,H=E.extend,I=E.each,F=E.explode,z=E.inArray,U=E.trim,W=E.resolve,V=g.Event,$=w.gecko,q=w.ie;return L.prototype={render:function(){function e(){M.unbind(window,"ready",e),n.render()}function t(){var e=m.ScriptLoader;if(r.language&&"en"!=r.language&&!r.language_url&&(r.language_url=n.editorManager.baseURL+"/langs/"+r.language+".js"),r.language_url&&e.add(r.language_url),r.theme&&"function"!=typeof r.theme&&"-"!=r.theme.charAt(0)&&!P.urls[r.theme]){var t=r.theme_url;t=t?n.documentBaseURI.toAbsolute(t):"themes/"+r.theme+"/theme"+o+".js",P.load(r.theme,t)}E.isArray(r.plugins)&&(r.plugins=r.plugins.join(" ")),I(r.external_plugins,function(e,t){O.load(t,e),r.plugins+=" "+t}),I(r.plugins.split(/[ ,]/),function(e){if(e=U(e),e&&!O.urls[e])if("-"==e.charAt(0)){e=e.substr(1,e.length);var t=O.dependencies(e);I(t,function(e){var t={prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"};e=O.createUrl(t,e),O.load(e.resource,e)})}else O.load(e,{prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"})}),e.loadQueue(function(){n.removed||n.init()},n,function(e){D.pluginLoadError(n,e[0]),n.removed||n.init()})}var n=this,r=n.settings,i=n.id,o=n.suffix;if(!V.domLoaded)return void M.bind(window,"ready",e);if(n.getElement()&&w.contentEditable){r.inline?n.inline=!0:(n.orgVisibility=n.getElement().style.visibility,n.getElement().style.visibility="hidden");var a=n.getElement().form||M.getParent(i,"form");a&&(n.formElement=a,r.hidden_input&&!/TEXTAREA|INPUT/i.test(n.getElement().nodeName)&&(M.insertAfter(M.create("input",{type:"hidden",name:i}),i),n.hasHiddenInput=!0),n.formEventDelegate=function(e){n.fire(e.type,e)},M.bind(a,"submit reset",n.formEventDelegate),n.on("reset",function(){n.setContent(n.startContent,{format:"raw"})}),!r.submit_patch||a.submit.nodeType||a.submit.length||a._mceOldSubmit||(a._mceOldSubmit=a.submit,a.submit=function(){return n.editorManager.triggerSave(),n.setDirty(!1),a._mceOldSubmit(a)})),n.windowManager=new v(n),n.notificationManager=new y(n),"xml"==r.encoding&&n.on("GetContent",function(e){e.save&&(e.content=M.encode(e.content))}),r.add_form_submit_trigger&&n.on("submit",function(){n.initialized&&n.save()}),r.add_unload_trigger&&(n._beforeUnload=function(){!n.initialized||n.destroyed||n.isHidden()||n.save({format:"raw",no_events:!0,set_dirty:!1})},n.editorManager.on("BeforeUnload",n._beforeUnload)),n.editorManager.add(n),t()}},init:function(){function e(n){var r=O.get(n),i,o;if(i=O.urls[n]||t.documentBaseUrl.replace(/\/$/,""),n=U(n),r&&z(m,n)===-1){if(I(O.dependencies(n),function(t){e(t)}),t.plugins[n])return;o=new r(t,i,t.$),t.plugins[n]=o,o.init&&(o.init(t,i),m.push(n))}}var t=this,n=t.settings,r=t.getElement(),i,o,a,s,l,u,c,d,f,p,h,m=[];if(t.rtl=n.rtl_ui||t.editorManager.i18n.rtl,t.editorManager.i18n.setCode(n.language),n.aria_label=n.aria_label||M.getAttrib(r,"aria-label",t.getLang("aria.rich_text_area")),t.fire("ScriptsLoaded"),n.theme&&("function"!=typeof n.theme?(n.theme=n.theme.replace(/-/,""),u=P.get(n.theme),t.theme=new u(t,P.urls[n.theme]),t.theme.init&&t.theme.init(t,P.urls[n.theme]||t.documentBaseUrl.replace(/\/$/,""),t.$)):t.theme=n.theme),I(n.plugins.replace(/\-/g,"").split(/[ ,]/),e),n.render_ui&&t.theme&&(t.orgDisplay=r.style.display,"function"!=typeof n.theme?(i=n.width||r.style.width||r.offsetWidth,o=n.height||r.style.height||r.offsetHeight,a=n.min_height||100,p=/^[0-9\.]+(|px)$/i,p.test(""+i)&&(i=Math.max(parseInt(i,10),100)),p.test(""+o)&&(o=Math.max(parseInt(o,10),a)),l=t.theme.renderUI({targetNode:r,width:i,height:o,deltaWidth:n.delta_width,deltaHeight:n.delta_height}),n.content_editable||(o=(l.iframeHeight||o)+("number"==typeof o?l.deltaHeight||0:""),o",n.document_base_url!=t.documentBaseUrl&&(t.iframeHTML+=''),!w.caretAfter&&n.ie7_compat&&(t.iframeHTML+=''),t.iframeHTML+='',!/#$/.test(document.location.href))for(h=0;h',t.loadedCSS[g]=!0}d=n.body_id||"tinymce",d.indexOf("=")!=-1&&(d=t.getParam("body_id","","hash"),d=d[t.id]||d),f=n.body_class||"",f.indexOf("=")!=-1&&(f=t.getParam("body_class","","hash"),f=f[t.id]||""),n.content_security_policy&&(t.iframeHTML+=''),t.iframeHTML+='
      ';var v='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinymce.get("'+t.id+'");document.write(ed.iframeHTML);document.close();ed.initContentBody(true);})()';document.domain!=location.hostname&&w.ie&&w.ie<12&&(c=v);var y=M.create("iframe",{id:t.id+"_ifr",frameBorder:"0",allowTransparency:"true",title:t.editorManager.translate("Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help"),style:{width:"100%",height:o,display:"block"}});if(y.onload=function(){y.onload=null,t.fire("load")},M.setAttrib(y,"src",c||'javascript:""'),t.contentAreaContainer=l.iframeContainer,t.iframeElement=y,s=M.add(l.iframeContainer,y),q)try{t.getDoc()}catch(b){s.src=c=v}l.editorContainer&&(M.get(l.editorContainer).style.display=t.orgDisplay,t.hidden=M.isHidden(l.editorContainer)),t.getElement().style.display="none",M.setAttrib(t.id,"aria-hidden",!0),c||t.initContentBody(),r=s=l=null},initContentBody:function(t){var n=this,r=n.settings,s=n.getElement(),p=n.getDoc(),h,m;r.inline||(n.getElement().style.visibility=n.orgVisibility),t||r.content_editable||(p.open(),p.write(n.iframeHTML),p.close()),r.content_editable&&(n.on("remove",function(){var e=this.getBody();M.removeClass(e,"mce-content-body"),M.removeClass(e,"mce-edit-focus"),M.setAttrib(e,"contentEditable",null)}),M.addClass(s,"mce-content-body"),n.contentDocument=p=r.content_document||document,n.contentWindow=r.content_window||window,n.bodyElement=s,r.content_document=r.content_window=null,r.root_name=s.nodeName.toLowerCase()),h=n.getBody(),h.disabled=!0,n.readonly=r.readonly,n.readonly||(n.inline&&"static"==M.getStyle(h,"position",!0)&&(h.style.position="relative"),h.contentEditable=n.getParam("content_editable_state",!0)),h.disabled=!1,n.editorUpload=new T(n),n.schema=new b(r),n.dom=new e(p,{keep_values:!0,url_converter:n.convertURL,url_converter_scope:n,hex_colors:r.force_hex_style_colors,class_filter:r.class_filter,update_styles:!0,root_element:n.inline?n.getBody():null,collect:r.content_editable,schema:n.schema,onSetAttrib:function(e){n.fire("SetAttrib",e)}}),n.parser=new C(r,n.schema),n.parser.addAttributeFilter("src,href,style,tabindex",function(e,t){for(var r=e.length,i,o=n.dom,a,s;r--;)if(i=e[r],a=i.attr(t),s="data-mce-"+t,!i.attributes.map[s]){if(0===a.indexOf("data:")||0===a.indexOf("blob:"))continue;"style"===t?(a=o.serializeStyle(o.parseStyle(a),i.name),a.length||(a=null),i.attr(s,a),i.attr(t,a)):"tabindex"===t?(i.attr(s,a),i.attr(t,null)):i.attr(s,n.convertURL(a,t,i.name))}}),n.parser.addNodeFilter("script",function(e){for(var t=e.length,n,r;t--;)n=e[t], -r=n.attr("type")||"no/type",0!==r.indexOf("mce-")&&n.attr("type","mce-"+r)}),n.parser.addNodeFilter("#cdata",function(e){for(var t=e.length,n;t--;)n=e[t],n.type=8,n.name="#comment",n.value="[CDATA["+n.value+"]]"}),n.parser.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(e){for(var t=e.length,r,i=n.schema.getNonEmptyElements();t--;)r=e[t],r.isEmpty(i)&&0===r.getAll("br").length&&(r.append(new o("br",1)).shortEnded=!0)}),n.serializer=new a(r,n),n.selection=new l(n.dom,n.getWin(),n.serializer,n),n.formatter=new u(n),n.undoManager=new c(n),n.forceBlocks=new f(n),n.enterKey=new d(n),n._nodeChangeDispatcher=new i(n),n._selectionOverrides=new R(n),n.fire("PreInit"),r.browser_spellcheck||r.gecko_spellcheck||(p.body.spellcheck=!1,M.setAttrib(h,"spellcheck","false")),n.quirks=new x(n),n.fire("PostRender"),r.directionality&&(h.dir=r.directionality),r.nowrap&&(h.style.whiteSpace="nowrap"),r.protect&&n.on("BeforeSetContent",function(e){I(r.protect,function(t){e.content=e.content.replace(t,function(e){return""})})}),n.on("SetContent",function(){n.addVisual(n.getBody())}),r.padd_empty_editor&&n.on("PostProcess",function(e){e.content=e.content.replace(/^(]*>( | |\s|\u00a0|
      |)<\/p>[\r\n]*|
      [\r\n]*)$/,"")}),n.load({initial:!0,format:"html"}),n.startContent=n.getContent({format:"raw"}),n.initialized=!0,n.bindPendingEventDelegates(),n.fire("init"),n.focus(!0),n.nodeChanged({initial:!0}),n.execCallback("init_instance_callback",n),n.on("compositionstart compositionend",function(e){n.composing="compositionstart"===e.type}),n.contentStyles.length>0&&(m="",I(n.contentStyles,function(e){m+=e+"\r\n"}),n.dom.addStyle(m)),I(n.contentCSS,function(e){n.loadedCSS[e]||(n.dom.loadCSS(e),n.loadedCSS[e]=!0)}),r.auto_focus&&N.setEditorTimeout(n,function(){var e;e=r.auto_focus===!0?n:n.editorManager.get(r.auto_focus),e.destroyed||e.focus()},100),s=p=h=null},focus:function(e){function t(e){return n.dom.getParent(e,function(e){return"true"===n.dom.getContentEditable(e)})}var n=this,r=n.selection,i=n.settings.content_editable,o,a,s=n.getDoc(),l=n.getBody(),u;if(!e){if(o=r.getRng(),o.item&&(a=o.item(0)),n.quirks.refreshContentEditable(),u=t(r.getNode()),n.$.contains(l,u))return u.focus(),r.normalize(),void n.editorManager.setActive(n);if(i||(w.opera||n.getBody().focus(),n.getWin().focus()),$||i){if(l.setActive)try{l.setActive()}catch(c){l.focus()}else l.focus();i&&r.normalize()}a&&a.ownerDocument==s&&(o=s.body.createControlRange(),o.addElement(a),o.select())}n.editorManager.setActive(n)},execCallback:function(e){var t=this,n=t.settings[e],r;if(n)return t.callbackLookup&&(r=t.callbackLookup[e])&&(n=r.func,r=r.scope),"string"==typeof n&&(r=n.replace(/\.\w+$/,""),r=r?W(r):0,n=W(n),t.callbackLookup=t.callbackLookup||{},t.callbackLookup[e]={func:n,scope:r}),n.apply(r||t,Array.prototype.slice.call(arguments,1))},translate:function(e){var t=this.settings.language||"en",n=this.editorManager.i18n;return e?(e=n.data[t+"."+e]||e.replace(/\{\#([^\}]+)\}/g,function(e,r){return n.data[t+"."+r]||"{#"+r+"}"}),this.editorManager.translate(e)):""},getLang:function(e,n){return this.editorManager.i18n.data[(this.settings.language||"en")+"."+e]||(n!==t?n:"{#"+e+"}")},getParam:function(e,t,n){var r=e in this.settings?this.settings[e]:t,i;return"hash"===n?(i={},"string"==typeof r?I(r.indexOf("=")>0?r.split(/[;,](?![^=;,]*(?:[;,]|$))/):r.split(","),function(e){e=e.split("="),e.length>1?i[U(e[0])]=U(e[1]):i[U(e[0])]=U(e)}):i=r,i):r},nodeChanged:function(e){this._nodeChangeDispatcher.nodeChanged(e)},addButton:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),t.text||t.icon||(t.icon=e),n.buttons=n.buttons||{},t.tooltip=t.tooltip||t.title,n.buttons[e]=t},addSidebar:function(e,t){return B.add(this,e,t)},addMenuItem:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),n.menuItems=n.menuItems||{},n.menuItems[e]=t},addContextToolbar:function(e,t){var n=this,r;n.contextToolbars=n.contextToolbars||[],"string"==typeof e&&(r=e,e=function(e){return n.dom.is(e,r)}),n.contextToolbars.push({id:A.uuid("mcet"),predicate:e,items:t})},addCommand:function(e,t,n){this.editorCommands.addCommand(e,t,n)},addQueryStateHandler:function(e,t,n){this.editorCommands.addQueryStateHandler(e,t,n)},addQueryValueHandler:function(e,t,n){this.editorCommands.addQueryValueHandler(e,t,n)},addShortcut:function(e,t,n,r){this.shortcuts.add(e,t,n,r)},execCommand:function(e,t,n,r){return this.editorCommands.execCommand(e,t,n,r)},queryCommandState:function(e){return this.editorCommands.queryCommandState(e)},queryCommandValue:function(e){return this.editorCommands.queryCommandValue(e)},queryCommandSupported:function(e){return this.editorCommands.queryCommandSupported(e)},show:function(){var e=this;e.hidden&&(e.hidden=!1,e.inline?e.getBody().contentEditable=!0:(M.show(e.getContainer()),M.hide(e.id)),e.load(),e.fire("show"))},hide:function(){var e=this,t=e.getDoc();e.hidden||(q&&t&&!e.inline&&t.execCommand("SelectAll"),e.save(),e.inline?(e.getBody().contentEditable=!1,e==e.editorManager.focusedEditor&&(e.editorManager.focusedEditor=null)):(M.hide(e.getContainer()),M.setStyle(e.id,"display",e.orgDisplay)),e.hidden=!0,e.fire("hide"))},isHidden:function(){return!!this.hidden},setProgressState:function(e,t){this.fire("ProgressState",{state:e,time:t})},load:function(e){var n=this,r=n.getElement(),i;if(r)return e=e||{},e.load=!0,i=n.setContent(r.value!==t?r.value:r.innerHTML,e),e.element=r,e.no_events||n.fire("LoadContent",e),e.element=r=null,i},save:function(e){var t=this,n=t.getElement(),r,i;if(n&&t.initialized)return e=e||{},e.save=!0,e.element=n,r=e.content=t.getContent(e),e.no_events||t.fire("SaveContent",e),"raw"==e.format&&t.fire("RawSaveContent",e),r=e.content,/TEXTAREA|INPUT/i.test(n.nodeName)?n.value=r:(t.inline||(n.innerHTML=r),(i=M.getParent(t.id,"form"))&&I(i.elements,function(e){if(e.name==t.id)return e.value=r,!1})),e.element=n=null,e.set_dirty!==!1&&t.setDirty(!1),r},setContent:function(e,t){var n=this,r=n.getBody(),i,o;return t=t||{},t.format=t.format||"html",t.set=!0,t.content=e,t.no_events||n.fire("BeforeSetContent",t),e=t.content,0===e.length||/^\s+$/.test(e)?(o=q&&q<11?"":'
      ',"TABLE"==r.nodeName?e=""+o+"":/^(UL|OL)$/.test(r.nodeName)&&(e="
    24. "+o+"
    25. "),i=n.settings.forced_root_block,i&&n.schema.isValidChild(r.nodeName.toLowerCase(),i.toLowerCase())?(e=o,e=n.dom.createHTML(i,n.settings.forced_root_block_attrs,e)):q||e||(e='
      '),n.dom.setHTML(r,e),n.fire("SetContent",t)):("raw"!==t.format&&(e=new s({validate:n.validate},n.schema).serialize(n.parser.parse(e,{isRootContent:!0}))),t.content=U(e),n.dom.setHTML(r,t.content),t.no_events||n.fire("SetContent",t)),t.content},getContent:function(e){var t=this,n,r=t.getBody();return e=e||{},e.format=e.format||"html",e.get=!0,e.getInner=!0,e.no_events||t.fire("BeforeGetContent",e),n="raw"==e.format?E.trim(t.serializer.getTrimmedContent()):"text"==e.format?r.innerText||r.textContent:t.serializer.serialize(r,e),"text"!=e.format?e.content=U(n):e.content=n,e.no_events||t.fire("GetContent",e),e.content},insertContent:function(e,t){t&&(e=H({content:e},t)),this.execCommand("mceInsertContent",!1,e)},isDirty:function(){return!this.isNotDirty},setDirty:function(e){var t=!this.isNotDirty;this.isNotDirty=!e,e&&e!=t&&this.fire("dirty")},setMode:function(e){S.setMode(this,e)},getContainer:function(){var e=this;return e.container||(e.container=M.get(e.editorContainer||e.id+"_parent")),e.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return this.targetElm||(this.targetElm=M.get(this.id)),this.targetElm},getWin:function(){var e=this,t;return e.contentWindow||(t=e.iframeElement,t&&(e.contentWindow=t.contentWindow)),e.contentWindow},getDoc:function(){var e=this,t;return e.contentDocument||(t=e.getWin(),t&&(e.contentDocument=t.document)),e.contentDocument},getBody:function(){var e=this.getDoc();return this.bodyElement||(e?e.body:null)},convertURL:function(e,t,n){var r=this,i=r.settings;return i.urlconverter_callback?r.execCallback("urlconverter_callback",e,n,!0,t):!i.convert_urls||n&&"LINK"==n.nodeName||0===e.indexOf("file:")||0===e.length?e:i.relative_urls?r.documentBaseURI.toRelative(e):e=r.documentBaseURI.toAbsolute(e,i.remove_script_host)},addVisual:function(e){var n=this,r=n.settings,i=n.dom,o;e=e||n.getBody(),n.hasVisual===t&&(n.hasVisual=r.visual),I(i.select("table,a",e),function(e){var t;switch(e.nodeName){case"TABLE":return o=r.visual_table_class||"mce-item-table",t=i.getAttrib(e,"border"),void(t&&"0"!=t||!n.hasVisual?i.removeClass(e,o):i.addClass(e,o));case"A":return void(i.getAttrib(e,"href",!1)||(t=i.getAttrib(e,"name")||e.id,o=r.visual_anchor_class||"mce-item-anchor",t&&n.hasVisual?i.addClass(e,o):i.removeClass(e,o)))}}),n.fire("VisualAid",{element:e,hasVisual:n.hasVisual})},remove:function(){var e=this;e.removed||(e.save(),e.removed=1,e.unbindAllNativeEvents(),e.hasHiddenInput&&M.remove(e.getElement().nextSibling),e.inline||(q&&q<10&&e.getDoc().execCommand("SelectAll",!1,null),M.setStyle(e.id,"display",e.orgDisplay),e.getBody().onload=null),e.fire("remove"),e.editorManager.remove(e),M.remove(e.getContainer()),e._selectionOverrides.destroy(),e.editorUpload.destroy(),e.destroy())},destroy:function(e){var t=this,n;if(!t.destroyed){if(!e&&!t.removed)return void t.remove();e||(t.editorManager.off("beforeunload",t._beforeUnload),t.theme&&t.theme.destroy&&t.theme.destroy(),t.selection.destroy(),t.dom.destroy()),n=t.formElement,n&&(n._mceOldSubmit&&(n.submit=n._mceOldSubmit,n._mceOldSubmit=null),M.unbind(n,"submit reset",t.formEventDelegate)),t.contentAreaContainer=t.formElement=t.container=t.editorContainer=null,t.bodyElement=t.contentDocument=t.contentWindow=null,t.iframeElement=t.targetElm=null,t.selection&&(t.selection=t.selection.win=t.selection.dom=t.selection.dom.doc=null),t.destroyed=1}},uploadImages:function(e){return this.editorUpload.uploadImages(e)},_scanForImages:function(){return this.editorUpload.scanForImages()}},H(L.prototype,_),L}),r(st,[m],function(e){var t={},n="en";return{setCode:function(e){e&&(n=e,this.rtl=!!this.data[e]&&"rtl"===this.data[e]._dir)},getCode:function(){return n},rtl:!1,add:function(e,n){var r=t[e];r||(t[e]=r={});for(var i in n)r[i]=n[i];this.setCode(e)},translate:function(r){function i(t){return e.is(t,"function")?Object.prototype.toString.call(t):o(t)?"":""+t}function o(t){return""===t||null===t||e.is(t,"undefined")}function a(t){return t=i(t),e.hasOwn(s,t)?i(s[t]):t}var s=t[n]||{};if(o(r))return"";if(e.is(r,"object")&&e.hasOwn(r,"raw"))return i(r.raw);if(e.is(r,"array")){var l=r.slice(1);r=a(r[0]).replace(/\{([0-9]+)\}/g,function(t,n){return e.hasOwn(l,n)?i(l[n]):t})}return a(r).replace(/{context:\w+}$/,"")},data:t}}),r(lt,[w,c,d],function(e,t,n){function r(e){function r(){try{return document.activeElement}catch(e){return document.body}}function u(e,t){if(t&&t.startContainer){if(!e.isChildOf(t.startContainer,e.getRoot())||!e.isChildOf(t.endContainer,e.getRoot()))return;return{startContainer:t.startContainer,startOffset:t.startOffset,endContainer:t.endContainer,endOffset:t.endOffset}}return t}function c(e,t){var n;return t.startContainer?(n=e.getDoc().createRange(),n.setStart(t.startContainer,t.startOffset),n.setEnd(t.endContainer,t.endOffset)):n=t,n}function d(d){var f=d.editor;f.on("init",function(){(f.inline||n.ie)&&("onbeforedeactivate"in document&&n.ie<9?f.dom.bind(f.getBody(),"beforedeactivate",function(e){if(e.target==f.getBody())try{f.lastRng=f.selection.getRng()}catch(t){}}):f.on("nodechange mouseup keyup",function(e){var t=r();"nodechange"==e.type&&e.selectionChange||(t&&t.id==f.id+"_ifr"&&(t=f.getBody()),f.dom.isChildOf(t,f.getBody())&&(f.lastRng=f.selection.getRng()))}),n.webkit&&!i&&(i=function(){var t=e.activeEditor;if(t&&t.selection){var n=t.selection.getRng();n&&!n.collapsed&&(f.lastRng=n)}},s.bind(document,"selectionchange",i)))}),f.on("setcontent",function(){f.lastRng=null}),f.on("mousedown",function(){f.selection.lastFocusBookmark=null}),f.on("focusin",function(){var t=e.focusedEditor,n;f.selection.lastFocusBookmark&&(n=c(f,f.selection.lastFocusBookmark),f.selection.lastFocusBookmark=null,f.selection.setRng(n)),t!=f&&(t&&t.fire("blur",{focusedEditor:f}),e.setActive(f),e.focusedEditor=f,f.fire("focus",{blurredEditor:t}),f.focus(!0)),f.lastRng=null}),f.on("focusout",function(){t.setEditorTimeout(f,function(){var t=e.focusedEditor;l(f,r())||t!=f||(f.fire("blur",{focusedEditor:null}),e.focusedEditor=null,f.selection&&(f.selection.lastFocusBookmark=null))})}),o||(o=function(t){var n=e.activeEditor,r;r=t.target,n&&r.ownerDocument==document&&(n.selection&&r!=n.getBody()&&(n.selection.lastFocusBookmark=u(n.dom,n.lastRng)),r==document.body||l(n,r)||e.focusedEditor!=n||(n.fire("blur",{focusedEditor:null}),e.focusedEditor=null))},s.bind(document,"focusin",o)),f.inline&&!a&&(a=function(t){var n=e.activeEditor,r=n.dom;if(n.inline&&r&&!r.isChildOf(t.target,n.getBody())){var i=n.selection.getRng();i.collapsed||(n.lastRng=i)}},s.bind(document,"mouseup",a))}function f(t){e.focusedEditor==t.editor&&(e.focusedEditor=null),e.activeEditor||(s.unbind(document,"selectionchange",i),s.unbind(document,"focusin",o),s.unbind(document,"mouseup",a),i=o=a=null)}e.on("AddEditor",d),e.on("RemoveEditor",f)}var i,o,a,s=e.DOM,l=function(e,t){var n=e?e.settings.custom_ui_selector:"",i=s.getParent(t,function(t){return r.isEditorUIElement(t)||!!n&&e.dom.is(t,n)});return null!==i};return r.isEditorUIElement=function(e){return e.className.toString().indexOf("mce-")!==-1},r._isUIElement=l,r}),r(ut,[at,g,w,ue,d,m,u,pe,st,lt,N],function(e,t,n,r,i,o,a,s,l,u,c){function d(e){v(x.editors,function(t){"scroll"===e.type?t.fire("ScrollWindow",e):t.fire("ResizeWindow",e)})}function f(e,n){n!==w&&(n?t(window).on("resize scroll",d):t(window).off("resize scroll",d),w=n)}function p(e){var t=x.editors,n;delete t[e.id];for(var r=0;r0&&v(g(t),function(e){var t;(t=m.get(e))?n.push(t):v(document.forms,function(t){v(t.elements,function(t){t.name===e&&(e="mce_editor_"+b++,m.setAttrib(t,"id",e),n.push(t))})})});break;case"textareas":case"specific_textareas":v(m.select("textarea"),function(t){e.editor_deselector&&u(t,e.editor_deselector)||e.editor_selector&&!u(t,e.editor_selector)||n.push(t)})}return n}function d(){function a(t,n,r){var i=new e(t,n,f);p.push(i),i.on("init",function(){++u===g.length&&x(p)}),i.targetElm=i.targetElm||r,i.render()}var u=0,p=[],g;return m.unbind(window,"ready",d),l("onpageload"),g=t.unique(c(n)),n.types?void v(n.types,function(e){o.each(g,function(t){return!m.is(t,e.selector)||(a(s(t),y({},n,e),t),!1)})}):(o.each(g,function(e){h(f.get(e.id))}),g=o.grep(g,function(e){return!f.get(e.id)}),void v(g,function(e){r(n,e)?i("Could not initialize inline editor on invalid inline target element",e):a(s(e),n,e)}))}var f=this,p,C;C=o.makeMap("area base basefont br col frame hr img input isindex link meta param embed source wbr track colgroup option tbody tfoot thead tr script noscript style textarea video audio iframe object menu"," ");var x=function(e){p=e};return f.settings=n,m.bind(window,"ready",d),new a(function(e){p?e(p):x=function(t){e(t)}})},get:function(e){return arguments.length?e in this.editors?this.editors[e]:null:this.editors},add:function(e){var t=this,n=t.editors;return n[e.id]=e,n.push(e),f(n,!0),t.activeEditor=e,t.fire("AddEditor",{editor:e}),C||(C=function(){t.fire("BeforeUnload")},m.bind(window,"beforeunload",C)),e},createEditor:function(t,n){return this.add(new e(t,n,this))},remove:function(e){var t=this,n,r=t.editors,i;{if(e)return"string"==typeof e?(e=e.selector||e,void v(m.select(e),function(e){i=r[e.id],i&&t.remove(i)})):(i=e,r[i.id]?(p(i)&&t.fire("RemoveEditor",{editor:i}),r.length||m.unbind(window,"beforeunload",C),i.remove(),f(r,r.length>0),i):null);for(n=r.length-1;n>=0;n--)t.remove(r[n])}},execCommand:function(t,n,r){var i=this,o=i.get(r);switch(t){case"mceAddEditor":return i.get(r)||new e(r,i.settings,i).render(),!0;case"mceRemoveEditor":return o&&o.remove(),!0;case"mceToggleEditor":return o?(o.isHidden()?o.show():o.hide(),!0):(i.execCommand("mceAddEditor",0,r),!0)}return!!i.activeEditor&&i.activeEditor.execCommand(t,n,r)},triggerSave:function(){v(this.editors,function(e){e.save()})},addI18n:function(e,t){l.add(e,t)},translate:function(e){return l.translate(e)},setActive:function(e){var t=this.activeEditor;this.activeEditor!=e&&(t&&t.fire("deactivate",{relatedTarget:e}),e.fire("activate",{relatedTarget:t})),this.activeEditor=e}},y(x,s),x.setup(),window.tinymce=window.tinyMCE=x,x}),r(ct,[ut,m],function(e,t){var n=t.each,r=t.explode;e.on("AddEditor",function(e){var t=e.editor;t.on("preInit",function(){function e(e,t){n(t,function(t,n){t&&s.setStyle(e,n,t)}),s.rename(e,"span")}function i(e){s=t.dom,l.convert_fonts_to_spans&&n(s.select("font,u,strike",e.node),function(e){o[e.nodeName.toLowerCase()](s,e)})}var o,a,s,l=t.settings;l.inline_styles&&(a=r(l.font_size_legacy_values),o={font:function(t,n){e(n,{backgroundColor:n.style.backgroundColor,color:n.color,fontFamily:n.face,fontSize:a[parseInt(n.size,10)-1]})},u:function(n,r){"html4"===t.settings.schema&&e(r,{textDecoration:"underline"})},strike:function(t,n){e(n,{textDecoration:"line-through"})}},t.on("PreProcess SetContent",i))})})}),r(dt,[pe,m],function(e,t){var n={send:function(e){function r(){!e.async||4==i.readyState||o++>1e4?(e.success&&o<1e4&&200==i.status?e.success.call(e.success_scope,""+i.responseText,i,e):e.error&&e.error.call(e.error_scope,o>1e4?"TIMED_OUT":"GENERAL",i,e),i=null):setTimeout(r,10)}var i,o=0;if(e.scope=e.scope||this,e.success_scope=e.success_scope||e.scope,e.error_scope=e.error_scope||e.scope,e.async=e.async!==!1,e.data=e.data||"",n.fire("beforeInitialize",{settings:e}),i=new XMLHttpRequest){if(i.overrideMimeType&&i.overrideMimeType(e.content_type),i.open(e.type||(e.data?"POST":"GET"),e.url,e.async),e.crossDomain&&(i.withCredentials=!0),e.content_type&&i.setRequestHeader("Content-Type",e.content_type),e.requestheaders&&t.each(e.requestheaders,function(e){i.setRequestHeader(e.key,e.value)}),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i=n.fire("beforeSend",{xhr:i,settings:e}).xhr,i.send(e.data),!e.async)return r();setTimeout(r,10)}}};return t.extend(n,e),n}),r(ft,[],function(){function e(t,n){var r,i,o,a;if(n=n||'"',null===t)return"null";if(o=typeof t,"string"==o)return i="\bb\tt\nn\ff\rr\"\"''\\\\",n+t.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(e,t){return'"'===n&&"'"===e?e:(r=i.indexOf(t),r+1?"\\"+i.charAt(r+1):(e=t.charCodeAt().toString(16),"\\u"+"0000".substring(e.length)+e))})+n;if("object"==o){if(t.hasOwnProperty&&"[object Array]"===Object.prototype.toString.call(t)){for(r=0,i="[";r0?",":"")+e(t[r],n);return i+"]"}i="{";for(a in t)t.hasOwnProperty(a)&&(i+="function"!=typeof t[a]?(i.length>1?","+n:n)+a+n+":"+e(t[a],n):"");return i+"}"}return""+t}return{serialize:e,parse:function(e){try{return window[String.fromCharCode(101)+"val"]("("+e+")")}catch(t){}}}}),r(pt,[ft,dt,m],function(e,t,n){function r(e){this.settings=i({},e),this.count=0}var i=n.extend;return r.sendRPC=function(e){return(new r).send(e)},r.prototype={send:function(n){var r=n.error,o=n.success;n=i(this.settings,n),n.success=function(t,i){t=e.parse(t),"undefined"==typeof t&&(t={error:"JSON Parse error."}),t.error?r.call(n.error_scope||n.scope,t.error,i):o.call(n.success_scope||n.scope,t.result)},n.error=function(e,t){r&&r.call(n.error_scope||n.scope,e,t)},n.data=e.serialize({id:n.id||"c"+this.count++,method:n.method,params:n.params}),n.content_type="application/json",t.send(n)}},r}),r(ht,[w],function(e){return{callbacks:{},count:0,send:function(n){var r=this,i=e.DOM,o=n.count!==t?n.count:r.count,a="tinymce_jsonp_"+o;r.callbacks[o]=function(e){i.remove(a),delete r.callbacks[o],n.callback(e)},i.add(i.doc.body,"script",{id:a,src:n.url,type:"text/javascript"}),r.count++}}}),r(mt,[],function(){function e(){s=[];for(var e in a)s.push(e);i.length=s.length}function n(){function n(e){var n,r;return r=e!==t?c+e:i.indexOf(",",c),r===-1||r>i.length?null:(n=i.substring(c,r),c=r+1,n)}var r,i,s,c=0;if(a={},u){o.load(l),i=o.getAttribute(l)||"";do{var d=n();if(null===d)break;if(r=n(parseInt(d,32)||0),null!==r){if(d=n(),null===d)break;s=n(parseInt(d,32)||0),r&&(a[r]=s)}}while(null!==r);e()}}function r(){var t,n="";if(u){for(var r in a)t=a[r],n+=(n?",":"")+r.length.toString(32)+","+r+","+t.length.toString(32)+","+t;o.setAttribute(l,n);try{o.save(l)}catch(i){}e()}}var i,o,a,s,l,u;try{if(window.localStorage)return localStorage}catch(c){}return l="tinymce",o=document.documentElement,u=!!o.addBehavior,u&&o.addBehavior("#default#userData"),i={key:function(e){return s[e]},getItem:function(e){return e in a?a[e]:null},setItem:function(e,t){a[e]=""+t,r()},removeItem:function(e){delete a[e],r()},clear:function(){a={},r()}},n(),i}),r(gt,[w,f,E,N,m,d],function(e,t,n,r,i,o){var a=window.tinymce;return a.DOM=e.DOM,a.ScriptLoader=n.ScriptLoader,a.PluginManager=r.PluginManager,a.ThemeManager=r.ThemeManager,a.dom=a.dom||{},a.dom.Event=t.Event,i.each("trim isArray is toArray makeMap each map grep inArray extend create walk createNS resolve explode _addCacheSuffix".split(" "),function(e){a[e]=i[e]}),i.each("isOpera isWebKit isIE isGecko isMac".split(" "),function(e){a[e]=o[e.substr(2).toLowerCase()]}),{}}),r(vt,[ce,m],function(e,t){return e.extend({Defaults:{firstControlClass:"first",lastControlClass:"last"},init:function(e){this.settings=t.extend({},this.Defaults,e)},preRender:function(e){e.bodyClasses.add(this.settings.containerClass)},applyClasses:function(e){var t=this,n=t.settings,r,i,o,a;r=n.firstControlClass,i=n.lastControlClass,e.each(function(e){e.classes.remove(r).remove(i).add(n.controlClass),e.visible()&&(o||(o=e),a=e)}),o&&o.classes.add(r),a&&a.classes.add(i)},renderHtml:function(e){var t=this,n="";return t.applyClasses(e.items()),e.items().each(function(e){n+=e.renderHtml()}),n},recalc:function(){},postRender:function(){},isNative:function(){return!1}})}),r(yt,[vt],function(e){return e.extend({Defaults:{containerClass:"abs-layout",controlClass:"abs-layout-item"},recalc:function(e){e.items().filter(":visible").each(function(e){var t=e.settings;e.layoutRect({x:t.x,y:t.y,w:t.w,h:t.h}),e.recalc&&e.recalc()})},renderHtml:function(e){return'
      '+this._super(e)}})}),r(bt,[Pe],function(e){return e.extend({Defaults:{classes:"widget btn",role:"button"},init:function(e){var t=this,n;t._super(e),e=t.settings,n=t.settings.size,t.on("click mousedown",function(e){e.preventDefault()}),t.on("touchstart",function(e){t.fire("click",e),e.preventDefault()}),e.subtype&&t.classes.add(e.subtype),n&&t.classes.add("btn-"+n),e.icon&&t.icon(e.icon)},icon:function(e){return arguments.length?(this.state.set("icon",e),this):this.state.get("icon")},repaint:function(){var e=this.getEl().firstChild,t;e&&(t=e.style,t.width=t.height="100%"),this._super()},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r=e.state.get("icon"),i,o=e.state.get("text"),a="";return i=e.settings.image,i?(r="none","string"!=typeof i&&(i=window.getSelection?i[0]:i[1]),i=" style=\"background-image: url('"+i+"')\""):i="",o&&(e.classes.add("btn-has-text"),a=''+e.encode(o)+""),r=r?n+"ico "+n+"i-"+r:"",'
      "},bindStates:function(){function e(e){var i=n("span."+r,t.getEl());e?(i[0]||(n("button:first",t.getEl()).append(''),i=n("span."+r,t.getEl())),i.html(t.encode(e))):i.remove(),t.classes.toggle("btn-has-text",!!e)}var t=this,n=t.$,r=t.classPrefix+"txt";return t.state.on("change:text",function(t){e(t.value)}),t.state.on("change:icon",function(n){var r=n.value,i=t.classPrefix;t.settings.icon=r,r=r?i+"ico "+i+"i-"+t.settings.icon:"";var o=t.getEl().firstChild,a=o.getElementsByTagName("i")[0];r?(a&&a==o.firstChild||(a=document.createElement("i"),o.insertBefore(a,o.firstChild)),a.className=r):a&&o.removeChild(a),e(t.state.get("text"))}),t._super()}})}),r(Ct,[Ne],function(e){return e.extend({Defaults:{defaultType:"button",role:"group"},renderHtml:function(){var e=this,t=e._layout;return e.classes.add("btn-group"),e.preRender(),t.preRender(e),'
      '+(e.settings.html||"")+t.renderHtml(e)+"
      "}})}),r(xt,[Pe],function(e){return e.extend({Defaults:{classes:"checkbox",role:"checkbox",checked:!1},init:function(e){var t=this;t._super(e),t.on("click mousedown",function(e){e.preventDefault()}),t.on("click",function(e){e.preventDefault(),t.disabled()||t.checked(!t.checked())}),t.checked(t.settings.checked)},checked:function(e){return arguments.length?(this.state.set("checked",e),this):this.state.get("checked")},value:function(e){return arguments.length?this.checked(e):this.checked()},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix;return'
      '+e.encode(e.state.get("text"))+"
      "},bindStates:function(){function e(e){t.classes.toggle("checked",e),t.aria("checked",e)}var t=this;return t.state.on("change:text",function(e){t.getEl("al").firstChild.data=t.translate(e.value)}),t.state.on("change:checked change:value",function(n){t.fire("change"),e(n.value)}),t.state.on("change:icon",function(e){var n=e.value,r=t.classPrefix;if("undefined"==typeof n)return t.settings.icon;t.settings.icon=n,n=n?r+"ico "+r+"i-"+t.settings.icon:"";var i=t.getEl().firstChild,o=i.getElementsByTagName("i")[0];n?(o&&o==i.firstChild||(o=document.createElement("i"),i.insertBefore(o,i.firstChild)),o.className=n):o&&i.removeChild(o)}),t.state.get("checked")&&e(!0),t._super()}})}),r(wt,[Pe,we,ve,g,I,m],function(e,t,n,r,i,o){return e.extend({init:function(e){var t=this;t._super(e),e=t.settings,t.classes.add("combobox"),t.subinput=!0,t.ariaTarget="inp",e.menu=e.menu||e.values,e.menu&&(e.icon="caret"),t.on("click",function(n){var i=n.target,o=t.getEl();if(r.contains(o,i)||i==o)for(;i&&i!=o;)i.id&&i.id.indexOf("-open")!=-1&&(t.fire("action"),e.menu&&(t.showMenu(),n.aria&&t.menu.items()[0].focus())),i=i.parentNode}),t.on("keydown",function(e){var n;13==e.keyCode&&"INPUT"===e.target.nodeName&&(e.preventDefault(),t.parents().reverse().each(function(e){if(e.toJSON)return n=e,!1}),t.fire("submit",{data:n.toJSON()}))}),t.on("keyup",function(e){if("INPUT"==e.target.nodeName){var n=t.state.get("value"),r=e.target.value;r!==n&&(t.state.set("value",r),t.fire("autocomplete",e))}}),t.on("mouseover",function(e){var n=t.tooltip().moveTo(-65535);if(t.statusLevel()&&e.target.className.indexOf(t.classPrefix+"status")!==-1){var r=t.statusMessage()||"Ok",i=n.text(r).show().testMoveRel(e.target,["bc-tc","bc-tl","bc-tr"]);n.classes.toggle("tooltip-n","bc-tc"==i),n.classes.toggle("tooltip-nw","bc-tl"==i),n.classes.toggle("tooltip-ne","bc-tr"==i),n.moveRel(e.target,i)}})},statusLevel:function(e){return arguments.length>0&&this.state.set("statusLevel",e),this.state.get("statusLevel")},statusMessage:function(e){return arguments.length>0&&this.state.set("statusMessage",e),this.state.get("statusMessage")},showMenu:function(){var e=this,n=e.settings,r;e.menu||(r=n.menu||[],r.length?r={type:"menu",items:r}:r.type=r.type||"menu",e.menu=t.create(r).parent(e).renderTo(e.getContainerElm()),e.fire("createmenu"),e.menu.reflow(),e.menu.on("cancel",function(t){t.control===e.menu&&e.focus()}),e.menu.on("show hide",function(t){t.control.items().each(function(t){t.active(t.value()==e.value())})}).fire("show"),e.menu.on("select",function(t){e.value(t.control.value())}),e.on("focusin",function(t){"INPUT"==t.target.tagName.toUpperCase()&&e.menu.hide()}),e.aria("expanded",!0)),e.menu.show(),e.menu.layoutRect({w:e.layoutRect().w}),e.menu.moveRel(e.getEl(),e.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"])},focus:function(){this.getEl("inp").focus()},repaint:function(){var e=this,t=e.getEl(),i=e.getEl("open"),o=e.layoutRect(),a,s,l=0,u=t.firstChild;e.statusLevel()&&"none"!==e.statusLevel()&&(l=parseInt(n.getRuntimeStyle(u,"padding-right"),10)-parseInt(n.getRuntimeStyle(u,"padding-left"),10)),a=i?o.w-n.getSize(i).width-10:o.w-10;var c=document;return c.all&&(!c.documentMode||c.documentMode<=8)&&(s=e.layoutRect().h-2+"px"),r(u).css({width:a-l,lineHeight:s}),e._super(),e},postRender:function(){var e=this;return r(this.getEl("inp")).on("change",function(t){e.state.set("value",t.target.value),e.fire("change",t)}),e._super()},renderHtml:function(){var e=this,t=e._id,n=e.settings,r=e.classPrefix,i=e.state.get("value")||"",o,a,s="",l="",u="";return"spellcheck"in n&&(l+=' spellcheck="'+n.spellcheck+'"'),n.maxLength&&(l+=' maxlength="'+n.maxLength+'"'),n.size&&(l+=' size="'+n.size+'"'),n.subtype&&(l+=' type="'+n.subtype+'"'),u='',e.disabled()&&(l+=' disabled="disabled"'),o=n.icon,o&&"caret"!=o&&(o=r+"ico "+r+"i-"+n.icon),a=e.state.get("text"),(o||a)&&(s='
      ",e.classes.add("has-open")),'
      '+u+s+"
      "},value:function(e){return arguments.length?(this.state.set("value",e),this):(this.state.get("rendered")&&this.state.set("value",this.getEl("inp").value), -this.state.get("value"))},showAutoComplete:function(e,n){var r=this;if(0===e.length)return void r.hideMenu();var i=function(e,t){return function(){r.fire("selectitem",{title:t,value:e})}};r.menu?r.menu.items().remove():r.menu=t.create({type:"menu",classes:"combobox-menu",layout:"flow"}).parent(r).renderTo(),o.each(e,function(e){r.menu.add({text:e.title,url:e.previewUrl,match:n,classes:"menu-item-ellipsis",onclick:i(e.value,e.title)})}),r.menu.renderNew(),r.hideMenu(),r.menu.on("cancel",function(e){e.control.parent()===r.menu&&(e.stopPropagation(),r.focus(),r.hideMenu())}),r.menu.on("select",function(){r.focus()});var a=r.layoutRect().w;r.menu.layoutRect({w:a,minW:0,maxW:a}),r.menu.reflow(),r.menu.show(),r.menu.moveRel(r.getEl(),r.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"])},hideMenu:function(){this.menu&&this.menu.hide()},bindStates:function(){var e=this;e.state.on("change:value",function(t){e.getEl("inp").value!=t.value&&(e.getEl("inp").value=t.value)}),e.state.on("change:disabled",function(t){e.getEl("inp").disabled=t.value}),e.state.on("change:statusLevel",function(t){var r=e.getEl("status"),i=e.classPrefix,o=t.value;n.css(r,"display","none"===o?"none":""),n.toggleClass(r,i+"i-checkmark","ok"===o),n.toggleClass(r,i+"i-warning","warn"===o),n.toggleClass(r,i+"i-error","error"===o),e.classes.toggle("has-status","none"!==o),e.repaint()}),n.on(e.getEl("status"),"mouseleave",function(){e.tooltip().hide()}),e.on("cancel",function(t){e.menu&&e.menu.visible()&&(t.stopPropagation(),e.hideMenu())});var t=function(e,t){t&&t.items().length>0&&t.items().eq(e)[0].focus()};return e.on("keydown",function(n){var r=n.keyCode;"INPUT"===n.target.nodeName&&(r===i.DOWN?(n.preventDefault(),e.fire("autocomplete"),t(0,e.menu)):r===i.UP&&(n.preventDefault(),t(-1,e.menu)))}),e._super()},remove:function(){r(this.getEl("inp")).off(),this.menu&&this.menu.remove(),this._super()}})}),r(Et,[wt],function(e){return e.extend({init:function(e){var t=this;e.spellcheck=!1,e.onaction&&(e.icon="none"),t._super(e),t.classes.add("colorbox"),t.on("change keyup postrender",function(){t.repaintColor(t.value())})},repaintColor:function(e){var t=this.getEl("open"),n=t?t.getElementsByTagName("i")[0]:null;if(n)try{n.style.background=e}catch(r){}},bindStates:function(){var e=this;return e.state.on("change:value",function(t){e.state.get("rendered")&&e.repaintColor(t.value)}),e._super()}})}),r(Nt,[bt,Ae],function(e,t){return e.extend({showPanel:function(){var e=this,n=e.settings;if(e.active(!0),e.panel)e.panel.show();else{var r=n.panel;r.type&&(r={layout:"grid",items:r}),r.role=r.role||"dialog",r.popover=!0,r.autohide=!0,r.ariaRoot=!0,e.panel=new t(r).on("hide",function(){e.active(!1)}).on("cancel",function(t){t.stopPropagation(),e.focus(),e.hidePanel()}).parent(e).renderTo(e.getContainerElm()),e.panel.fire("show"),e.panel.reflow()}e.panel.moveRel(e.getEl(),n.popoverAlign||(e.isRtl()?["bc-tr","bc-tc"]:["bc-tl","bc-tc"]))},hidePanel:function(){var e=this;e.panel&&e.panel.hide()},postRender:function(){var e=this;return e.aria("haspopup",!0),e.on("click",function(t){t.control===e&&(e.panel&&e.panel.visible()?e.hidePanel():(e.showPanel(),e.panel.focus(!!t.aria)))}),e._super()},remove:function(){return this.panel&&(this.panel.remove(),this.panel=null),this._super()}})}),r(_t,[Nt,w],function(e,t){var n=t.DOM;return e.extend({init:function(e){this._super(e),this.classes.add("colorbutton")},color:function(e){return e?(this._color=e,this.getEl("preview").style.backgroundColor=e,this):this._color},resetColor:function(){return this._color=null,this.getEl("preview").style.backgroundColor=null,this},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r=e.state.get("text"),i=e.settings.icon?n+"ico "+n+"i-"+e.settings.icon:"",o=e.settings.image?" style=\"background-image: url('"+e.settings.image+"')\"":"",a="";return r&&(e.classes.add("btn-has-text"),a=''+e.encode(r)+""),'
      '},postRender:function(){var e=this,t=e.settings.onclick;return e.on("click",function(r){r.aria&&"down"==r.aria.key||r.control!=e||n.getParent(r.target,"."+e.classPrefix+"open")||(r.stopImmediatePropagation(),t.call(e,r))}),delete e.settings.onclick,e._super()}})}),r(St,[],function(){function e(e){function i(e,i,o){var a,s,l,u,c,d;return a=0,s=0,l=0,e/=255,i/=255,o/=255,c=t(e,t(i,o)),d=n(e,n(i,o)),c==d?(l=c,{h:0,s:0,v:100*l}):(u=e==c?i-o:o==c?e-i:o-e,a=e==c?3:o==c?1:5,a=60*(a-u/(d-c)),s=(d-c)/d,l=d,{h:r(a),s:r(100*s),v:r(100*l)})}function o(e,i,o){var a,s,l,u;if(e=(parseInt(e,10)||0)%360,i=parseInt(i,10)/100,o=parseInt(o,10)/100,i=n(0,t(i,1)),o=n(0,t(o,1)),0===i)return void(d=f=p=r(255*o));switch(a=e/60,s=o*i,l=s*(1-Math.abs(a%2-1)),u=o-s,Math.floor(a)){case 0:d=s,f=l,p=0;break;case 1:d=l,f=s,p=0;break;case 2:d=0,f=s,p=l;break;case 3:d=0,f=l,p=s;break;case 4:d=l,f=0,p=s;break;case 5:d=s,f=0,p=l;break;default:d=f=p=0}d=r(255*(d+u)),f=r(255*(f+u)),p=r(255*(p+u))}function a(){function e(e){return e=parseInt(e,10).toString(16),e.length>1?e:"0"+e}return"#"+e(d)+e(f)+e(p)}function s(){return{r:d,g:f,b:p}}function l(){return i(d,f,p)}function u(e){var t;return"object"==typeof e?"r"in e?(d=e.r,f=e.g,p=e.b):"v"in e&&o(e.h,e.s,e.v):(t=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)[^\)]*\)/gi.exec(e))?(d=parseInt(t[1],10),f=parseInt(t[2],10),p=parseInt(t[3],10)):(t=/#([0-F]{2})([0-F]{2})([0-F]{2})/gi.exec(e))?(d=parseInt(t[1],16),f=parseInt(t[2],16),p=parseInt(t[3],16)):(t=/#([0-F])([0-F])([0-F])/gi.exec(e))&&(d=parseInt(t[1]+t[1],16),f=parseInt(t[2]+t[2],16),p=parseInt(t[3]+t[3],16)),d=d<0?0:d>255?255:d,f=f<0?0:f>255?255:f,p=p<0?0:p>255?255:p,c}var c=this,d=0,f=0,p=0;e&&u(e),c.toRgb=s,c.toHsv=l,c.toHex=a,c.parse=u}var t=Math.min,n=Math.max,r=Math.round;return e}),r(kt,[Pe,_e,ve,St],function(e,t,n,r){return e.extend({Defaults:{classes:"widget colorpicker"},init:function(e){this._super(e)},postRender:function(){function e(e,t){var r=n.getPos(e),i,o;return i=t.pageX-r.x,o=t.pageY-r.y,i=Math.max(0,Math.min(i/e.clientWidth,1)),o=Math.max(0,Math.min(o/e.clientHeight,1)),{x:i,y:o}}function i(e,t){var i=(360-e.h)/360;n.css(d,{top:100*i+"%"}),t||n.css(p,{left:e.s+"%",top:100-e.v+"%"}),f.style.background=new r({s:100,v:100,h:e.h}).toHex(),s.color().parse({s:e.s,v:e.v,h:e.h})}function o(t){var n;n=e(f,t),u.s=100*n.x,u.v=100*(1-n.y),i(u),s.fire("change")}function a(t){var n;n=e(c,t),u=l.toHsv(),u.h=360*(1-n.y),i(u,!0),s.fire("change")}var s=this,l=s.color(),u,c,d,f,p;c=s.getEl("h"),d=s.getEl("hp"),f=s.getEl("sv"),p=s.getEl("svp"),s._repaint=function(){u=l.toHsv(),i(u)},s._super(),s._svdraghelper=new t(s._id+"-sv",{start:o,drag:o}),s._hdraghelper=new t(s._id+"-h",{start:a,drag:a}),s._repaint()},rgb:function(){return this.color().toRgb()},value:function(e){var t=this;return arguments.length?(t.color().parse(e),void(t._rendered&&t._repaint())):t.color().toHex()},color:function(){return this._color||(this._color=new r),this._color},renderHtml:function(){function e(){var e,t,n="",i,a;for(i="filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=",a=o.split(","),e=0,t=a.length-1;e
      ';return n}var t=this,n=t._id,r=t.classPrefix,i,o="#ff0000,#ff0080,#ff00ff,#8000ff,#0000ff,#0080ff,#00ffff,#00ff80,#00ff00,#80ff00,#ffff00,#ff8000,#ff0000",a="background: -ms-linear-gradient(top,"+o+");background: linear-gradient(to bottom,"+o+");";return i='
      '+e()+'
      ','
      '+i+"
      "}})}),r(Tt,[Pe],function(e){return e.extend({init:function(e){var t=this;e.delimiter||(e.delimiter="\xbb"),t._super(e),t.classes.add("path"),t.canFocus=!0,t.on("click",function(e){var n,r=e.target;(n=r.getAttribute("data-index"))&&t.fire("select",{value:t.row()[n],index:n})}),t.row(t.settings.row)},focus:function(){var e=this;return e.getEl().firstChild.focus(),e},row:function(e){return arguments.length?(this.state.set("row",e),this):this.state.get("row")},renderHtml:function(){var e=this;return'
      '+e._getDataPathHtml(e.state.get("row"))+"
      "},bindStates:function(){var e=this;return e.state.on("change:row",function(t){e.innerHtml(e._getDataPathHtml(t.value))}),e._super()},_getDataPathHtml:function(e){var t=this,n=e||[],r,i,o="",a=t.classPrefix;for(r=0,i=n.length;r0?'":"")+'
      '+n[r].name+"
      ";return o||(o='
      \xa0
      '),o}})}),r(Rt,[Tt],function(e){return e.extend({postRender:function(){function e(e){if(1===e.nodeType){if("BR"==e.nodeName||e.getAttribute("data-mce-bogus"))return!0;if("bookmark"===e.getAttribute("data-mce-type"))return!0}return!1}var t=this,n=t.settings.editor;return n.settings.elementpath!==!1&&(t.on("select",function(e){n.focus(),n.selection.select(this.row()[e.index].element),n.nodeChanged()}),n.on("nodeChange",function(r){for(var i=[],o=r.parents,a=o.length;a--;)if(1==o[a].nodeType&&!e(o[a])){var s=n.fire("ResolveName",{name:o[a].nodeName.toLowerCase(),target:o[a]});if(s.isDefaultPrevented()||i.push({name:s.name,element:o[a]}),s.isPropagationStopped())break}t.row(i)})),t._super()}})}),r(At,[Ne],function(e){return e.extend({Defaults:{layout:"flex",align:"center",defaults:{flex:1}},renderHtml:function(){var e=this,t=e._layout,n=e.classPrefix;return e.classes.add("formitem"),t.preRender(e),'
      '+(e.settings.title?'
      '+e.settings.title+"
      ":"")+'
      '+(e.settings.html||"")+t.renderHtml(e)+"
      "}})}),r(Bt,[Ne,At,m],function(e,t,n){return e.extend({Defaults:{containerCls:"form",layout:"flex",direction:"column",align:"stretch",flex:1,padding:20,labelGap:30,spacing:10,callbacks:{submit:function(){this.submit()}}},preRender:function(){var e=this,r=e.items();e.settings.formItemDefaults||(e.settings.formItemDefaults={layout:"flex",autoResize:"overflow",defaults:{flex:1}}),r.each(function(r){var i,o=r.settings.label;o&&(i=new t(n.extend({items:{type:"label",id:r._id+"-l",text:o,flex:0,forId:r._id,disabled:r.disabled()}},e.settings.formItemDefaults)),i.type="formitem",r.aria("labelledby",r._id+"-l"),"undefined"==typeof r.settings.flex&&(r.settings.flex=1),e.replace(r,i),i.add(r))})},submit:function(){return this.fire("submit",{data:this.toJSON()})},postRender:function(){var e=this;e._super(),e.fromJSON(e.settings.data)},bindStates:function(){function e(){var e=0,n=[],r,i,o;if(t.settings.labelGapCalc!==!1)for(o="children"==t.settings.labelGapCalc?t.find("formitem"):t.items(),o.filter("formitem").each(function(t){var r=t.items()[0],i=r.getEl().clientWidth;e=i>e?i:e,n.push(r)}),i=t.settings.labelGap||0,r=n.length;r--;)n[r].settings.minWidth=e+i}var t=this;t._super(),t.on("show",e),e()}})}),r(Dt,[Bt],function(e){return e.extend({Defaults:{containerCls:"fieldset",layout:"flex",direction:"column",align:"stretch",flex:1,padding:"25 15 5 15",labelGap:30,spacing:10,border:1},renderHtml:function(){var e=this,t=e._layout,n=e.classPrefix;return e.preRender(),t.preRender(e),'
      '+(e.settings.title?''+e.settings.title+"":"")+'
      '+(e.settings.html||"")+t.renderHtml(e)+"
      "}})}),r(Lt,[w,z,h,it,m,_],function(e,t,n,r,i,o){var a=i.trim,s=function(e,t,n,r,i){return{type:e,title:t,url:n,level:r,attach:i}},l=function(e){for(;e=e.parentNode;){var t=e.contentEditable;if(t&&"inherit"!==t)return o.isContentEditableTrue(e)}return!1},u=function(t,n){return e.DOM.select(t,n)},c=function(e){return e.innerText||e.textContent},d=function(e){return e.id?e.id:r.uuid("h")},f=function(e){return e&&"A"===e.nodeName&&(e.id||e.name)},p=function(e){return f(e)&&m(e)},h=function(e){return e&&/^(H[1-6])$/.test(e.nodeName)},m=function(e){return l(e)&&!o.isContentEditableFalse(e)},g=function(e){return h(e)&&m(e)},v=function(e){return h(e)?parseInt(e.nodeName.substr(1),10):0},y=function(e){var t=d(e),n=function(){e.id=t};return s("header",c(e),"#"+t,v(e),n)},b=function(e){var n=e.id||e.name,r=c(e);return s("anchor",r?r:"#"+n,"#"+n,0,t.noop)},C=function(e){return n.map(n.filter(e,g),y)},x=function(e){return n.map(n.filter(e,p),b)},w=function(e){var t=u("h1,h2,h3,h4,h5,h6,a:not([href])",e);return t},E=function(e){return a(e.title).length>0},N=function(e){var t=w(e);return n.filter(C(t).concat(x(t)),E)};return{find:N}}),r(Mt,[wt,m,h,z,I,Lt],function(e,t,n,r,i,o){var a={},s=5,l=function(e){return{title:e.title,value:{title:{raw:e.title},url:e.url,attach:e.attach}}},u=function(e){return t.map(e,l)},c=function(e,t){return{title:e,value:{title:e,url:t,attach:r.noop}}},d=function(e,t){var r=n.find(t,function(t){return t.url===e});return!r},f=function(e,t,n){var r=t in e?e[t]:n;return r===!1?null:r},p=function(e,i,o,s){var l={title:"-"},p=function(e){var a=n.filter(e[o],function(e){return d(e,i)});return t.map(a,function(e){return{title:e,value:{title:e,url:e,attach:r.noop}}})},h=function(e){var t=n.filter(i,function(t){return t.type==e});return u(t)},g=function(){var e=h("anchor"),t=f(s,"anchor_top","#top"),n=f(s,"anchor_bottom","#bottom");return null!==t&&e.unshift(c("",t)),null!==n&&e.push(c("",n)),e},v=function(e){return n.reduce(e,function(e,t){var n=0===e.length||0===t.length;return n?e.concat(t):e.concat(l,t)},[])};return s.typeahead_urls===!1?[]:"file"===o?v([m(e,p(a)),m(e,h("header")),m(e,g())]):m(e,p(a))},h=function(e,t){var r=a[t];/^https?/.test(e)&&(r?n.indexOf(r,e)===-1&&(a[t]=r.slice(0,s).concat(e)):a[t]=[e])},m=function(e,n){var r=e.toLowerCase(),i=t.grep(n,function(e){return e.title.toLowerCase().indexOf(r)!==-1});return 1===i.length&&i[0].title===e?[]:i},g=function(e){var t=e.title;return t.raw?t.raw:t},v=function(e,t,n,r){var i=function(i){var a=o.find(n),s=p(i,a,r,t);e.showAutoComplete(s,i)};e.on("autocomplete",function(){i(e.value())}),e.on("selectitem",function(t){var n=t.value;e.value(n.url);var i=g(n);"image"===r?e.fire("change",{meta:{alt:i,attach:n.attach}}):e.fire("change",{meta:{text:i,attach:n.attach}}),e.focus()}),e.on("click",function(t){0===e.value().length&&"INPUT"===t.target.nodeName&&i("")}),e.on("PostRender",function(){e.getRoot().on("submit",function(t){t.isDefaultPrevented()||h(e.value(),r)})})},y=function(e){var t=e.status,n=e.message;return"valid"===t?{status:"ok",message:n}:"unknown"===t?{status:"warn",message:n}:"invalid"===t?{status:"warn",message:n}:{status:"none",message:""}},b=function(e,t,n){var r=t.filepicker_validator_handler;if(r){var i=function(t){return 0===t.length?void e.statusLevel("none"):void r({url:t,type:n},function(t){var n=y(t);e.statusMessage(n.message),e.statusLevel(n.status)})};e.state.on("change:value",function(e){i(e.value)})}};return e.extend({init:function(e){var n=this,r=tinymce.activeEditor,i=r.settings,o,a,s,l=e.filetype;e.spellcheck=!1,s=i.file_picker_types||i.file_browser_callback_types,s&&(s=t.makeMap(s,/[, ]/)),s&&!s[l]||(a=i.file_picker_callback,!a||s&&!s[l]?(a=i.file_browser_callback,!a||s&&!s[l]||(o=function(){a(n.getEl("inp").id,n.value(),l,window)})):o=function(){var e=n.fire("beforecall").meta;e=t.extend({filetype:l},e),a.call(r,function(e,t){n.value(e).fire("change",{meta:t})},n.value(),e)}),o&&(e.icon="browse",e.onaction=o),n._super(e),v(n,i,r.getBody(),l),b(n,i,l)}})}),r(Pt,[yt],function(e){return e.extend({recalc:function(e){var t=e.layoutRect(),n=e.paddingBox;e.items().filter(":visible").each(function(e){e.layoutRect({x:n.left,y:n.top,w:t.innerW-n.right-n.left,h:t.innerH-n.top-n.bottom}),e.recalc&&e.recalc()})}})}),r(Ot,[yt],function(e){return e.extend({recalc:function(e){var t,n,r,i,o,a,s,l,u,c,d,f,p,h,m,g,v=[],y,b,C,x,w,E,N,_,S,k,T,R,A,B,D,L,M,P,O,H,I,F,z=Math.max,U=Math.min;for(r=e.items().filter(":visible"),i=e.layoutRect(),o=e.paddingBox,a=e.settings,f=e.isRtl()?a.direction||"row-reversed":a.direction,s=a.align,l=e.isRtl()?a.pack||"end":a.pack,u=a.spacing||0,"row-reversed"!=f&&"column-reverse"!=f||(r=r.set(r.toArray().reverse()),f=f.split("-")[0]),"column"==f?(S="y",N="h",_="minH",k="maxH",R="innerH",T="top",A="deltaH",B="contentH",O="left",M="w",D="x",L="innerW",P="minW",H="right",I="deltaW",F="contentW"):(S="x",N="w",_="minW",k="maxW",R="innerW",T="left",A="deltaW",B="contentW",O="top",M="h",D="y",L="innerH",P="minH",H="bottom",I="deltaH",F="contentH"),d=i[R]-o[T]-o[T],E=c=0,t=0,n=r.length;t0&&(c+=g,h[k]&&v.push(p),h.flex=g),d-=h[_],y=o[O]+h[P]+o[H],y>E&&(E=y);if(x={},d<0?x[_]=i[_]-d+i[A]:x[_]=i[R]-d+i[A],x[P]=E+i[I],x[B]=i[R]-d,x[F]=E,x.minW=U(x.minW,i.maxW),x.minH=U(x.minH,i.maxH),x.minW=z(x.minW,i.startMinWidth),x.minH=z(x.minH,i.startMinHeight),!i.autoResize||x.minW==i.minW&&x.minH==i.minH){for(C=d/c,t=0,n=v.length;tb?(d-=h[k]-h[_],c-=h.flex,h.flex=0,h.maxFlexSize=b):h.maxFlexSize=0;for(C=d/c,w=o[T],x={},0===c&&("end"==l?w=d+o[T]:"center"==l?(w=Math.round(i[R]/2-(i[R]-d)/2)+o[T],w<0&&(w=o[T])):"justify"==l&&(w=o[T],u=Math.floor(d/(r.length-1)))),x[D]=o[O],t=0,n=r.length;t0&&(y+=h.flex*C),x[N]=y,x[S]=w,p.layoutRect(x),p.recalc&&p.recalc(),w+=y+u}else if(x.w=x.minW,x.h=x.minH,e.layoutRect(x),this.recalc(e),null===e._lastRect){var W=e.parent();W&&(W._lastRect=null,W.recalc())}}})}),r(Ht,[vt],function(e){return e.extend({Defaults:{containerClass:"flow-layout",controlClass:"flow-layout-item",endClass:"break"},recalc:function(e){e.items().filter(":visible").each(function(e){e.recalc&&e.recalc()})},isNative:function(){return!0}})}),r(It,[w],function(e){var n=function(e,t,n){for(;n!==t;){if(n.style[e])return n.style[e];n=n.parentNode}return""},r=function(e){return/[0-9.]+px$/.test(e)?Math.round(72*parseInt(e,10)/96)+"pt":e},i=function(e){return e.replace(/[\'\"]/g,"").replace(/,\s+/g,",")},o=function(t,n){return e.DOM.getStyle(n,t,!0)},a=function(e,t){var r=n("fontSize",e,t);return""!==r?r:o("fontSize",t)},s=function(e,r){var a=n("fontFamily",e,r),s=""!==a?a:o("fontFamily",r);return s!==t?i(s):""};return{getFontSize:a,getFontFamily:s,toPt:r}}),r(Ft,[xe,Pe,Ae,m,h,w,ut,d,It],function(e,t,n,r,i,o,a,s,l){function u(e){e.settings.ui_container&&(s.container=o.DOM.select(e.settings.ui_container)[0])}function c(t){t.on("ScriptsLoaded",function(){t.rtl&&(e.rtl=!0)})}function d(e){function t(t,n){return function(){var r=this;e.on("nodeChange",function(i){var o=e.formatter,a=null;f(i.parents,function(e){if(f(t,function(t){if(n?o.matchNode(e,n,{value:t.value})&&(a=t.value):o.matchNode(e,t.value)&&(a=t.value),a)return!1}),a)return!1}),r.value(a)})}}function i(t){return function(){var n=this,r=function(e){return e?e.split(",")[0]:""};e.on("nodeChange",function(i){var o,a=null;o=l.getFontFamily(e.getBody(),i.element),f(t,function(e){e.value.toLowerCase()===o.toLowerCase()&&(a=e.value)}),f(t,function(e){a||r(e.value).toLowerCase()!==r(o).toLowerCase()||(a=e.value)}),n.value(a),!a&&o&&n.text(r(o))})}}function o(t){return function(){var n=this;e.on("nodeChange",function(r){var i,o,a=null;i=l.getFontSize(e.getBody(),r.element),o=l.toPt(i),f(t,function(e){e.value===i?a=i:e.value===o&&(a=o)}),n.value(a),a||n.text(o)})}}function a(e){e=e.replace(/;$/,"").split(";");for(var t=e.length;t--;)e[t]=e[t].split("=");return e}function s(){function t(e){var n=[];if(e)return f(e,function(e){var o={text:e.title,icon:e.icon};if(e.items)o.menu=t(e.items);else{var a=e.format||"custom"+r++;e.format||(e.name=a,i.push(e)),o.format=a,o.cmd=e.cmd}n.push(o)}),n}function n(){var n;return n=t(e.settings.style_formats_merge?e.settings.style_formats?o.concat(e.settings.style_formats):o:e.settings.style_formats||o)}var r=0,i=[],o=[{title:"Headings",items:[{title:"Heading 1",format:"h1"},{title:"Heading 2",format:"h2"},{title:"Heading 3",format:"h3"},{title:"Heading 4",format:"h4"},{title:"Heading 5",format:"h5"},{title:"Heading 6",format:"h6"}]},{title:"Inline",items:[{title:"Bold",icon:"bold",format:"bold"},{title:"Italic",icon:"italic",format:"italic"},{title:"Underline",icon:"underline",format:"underline"},{title:"Strikethrough",icon:"strikethrough",format:"strikethrough"},{title:"Superscript",icon:"superscript",format:"superscript"},{title:"Subscript",icon:"subscript",format:"subscript"},{title:"Code",icon:"code",format:"code"}]},{title:"Blocks",items:[{title:"Paragraph",format:"p"},{title:"Blockquote",format:"blockquote"},{title:"Div",format:"div"},{title:"Pre",format:"pre"}]},{title:"Alignment",items:[{title:"Left",icon:"alignleft",format:"alignleft"},{title:"Center",icon:"aligncenter",format:"aligncenter"},{title:"Right",icon:"alignright",format:"alignright"},{title:"Justify",icon:"alignjustify",format:"alignjustify"}]}];return e.on("init",function(){f(i,function(t){e.formatter.register(t.name,t)})}),{type:"menu",items:n(),onPostRender:function(t){e.fire("renderFormatsMenu",{control:t.control})},itemDefaults:{preview:!0,textStyle:function(){if(this.settings.format)return e.formatter.getCssText(this.settings.format)},onPostRender:function(){var t=this;t.parent().on("show",function(){var n,r;n=t.settings.format,n&&(t.disabled(!e.formatter.canApply(n)),t.active(e.formatter.match(n))),r=t.settings.cmd,r&&t.active(e.queryCommandState(r))})},onclick:function(){this.settings.format&&h(this.settings.format),this.settings.cmd&&e.execCommand(this.settings.cmd)}}}}function u(t){return function(){var n=this;e.formatter?e.formatter.formatChanged(t,function(e){n.active(e)}):e.on("init",function(){e.formatter.formatChanged(t,function(e){n.active(e)})})}}function c(t){return function(){function n(){var n="redo"==t?"hasRedo":"hasUndo";return!!e.undoManager&&e.undoManager[n]()}var r=this;r.disabled(!n()),e.on("Undo Redo AddUndo TypingUndo ClearUndos SwitchMode",function(){r.disabled(e.readonly||!n())})}}function d(){var t=this;e.on("VisualAid",function(e){t.active(e.hasVisual)}),t.active(e.hasVisual)}function h(t){t.control&&(t=t.control.value()),t&&e.execCommand("mceToggleFormat",!1,t)}function m(t){var n=t.length;return r.each(t,function(t){t.menu&&(t.hidden=0===m(t.menu));var r=t.format;r&&(t.hidden=!e.formatter.canApply(r)),t.hidden&&n--}),n}function g(t){var n=t.items().length;return t.items().each(function(t){t.menu&&t.visible(g(t.menu)>0),!t.menu&&t.settings.menu&&t.visible(m(t.settings.menu)>0);var r=t.settings.format;r&&t.visible(e.formatter.canApply(r)),t.visible()||n--}),n}var v;v=s(),f({bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",subscript:"Subscript",superscript:"Superscript"},function(t,n){e.addButton(n,{tooltip:t,onPostRender:u(n),onclick:function(){h(n)}})}),f({outdent:["Decrease indent","Outdent"],indent:["Increase indent","Indent"],cut:["Cut","Cut"],copy:["Copy","Copy"],paste:["Paste","Paste"],help:["Help","mceHelp"],selectall:["Select all","SelectAll"],removeformat:["Clear formatting","RemoveFormat"],visualaid:["Visual aids","mceToggleVisualAid"],newdocument:["New document","mceNewDocument"]},function(t,n){e.addButton(n,{tooltip:t[0],cmd:t[1]})}),f({blockquote:["Blockquote","mceBlockQuote"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],alignleft:["Align left","JustifyLeft"],aligncenter:["Align center","JustifyCenter"],alignright:["Align right","JustifyRight"],alignjustify:["Justify","JustifyFull"],alignnone:["No alignment","JustifyNone"]},function(t,n){e.addButton(n,{tooltip:t[0],cmd:t[1],onPostRender:u(n)})});var y=function(e){var t=e;return t.length>0&&"-"===t[0].text&&(t=t.slice(1)),t.length>0&&"-"===t[t.length-1].text&&(t=t.slice(0,t.length-1)),t},b=function(t){var n,i;if("string"==typeof t)i=t.split(" ");else if(r.isArray(t))return p(r.map(t,b));return n=r.grep(i,function(t){return"|"===t||t in e.menuItems}),r.map(n,function(t){return"|"===t?{text:"-"}:e.menuItems[t]})},C=function(t){var n=[{text:"-"}],i=r.grep(e.menuItems,function(e){return e.context===t});return r.each(i,function(e){"before"==e.separator&&n.push({text:"|"}),e.prependToContext?n.unshift(e):n.push(e),"after"==e.separator&&n.push({text:"|"})}),n},x=function(e){return y(e.insert_button_items?b(e.insert_button_items):C("insert"))};e.addButton("undo",{tooltip:"Undo",onPostRender:c("undo"),cmd:"undo"}),e.addButton("redo",{tooltip:"Redo",onPostRender:c("redo"),cmd:"redo"}),e.addMenuItem("newdocument",{text:"New document",icon:"newdocument",cmd:"mceNewDocument"}),e.addMenuItem("undo",{text:"Undo",icon:"undo",shortcut:"Meta+Z",onPostRender:c("undo"),cmd:"undo"}),e.addMenuItem("redo",{text:"Redo",icon:"redo",shortcut:"Meta+Y",onPostRender:c("redo"),cmd:"redo"}),e.addMenuItem("visualaid",{text:"Visual aids",selectable:!0,onPostRender:d,cmd:"mceToggleVisualAid"}),e.addButton("remove",{tooltip:"Remove",icon:"remove",cmd:"Delete"}),e.addButton("insert",{type:"menubutton",icon:"insert",menu:[],oncreatemenu:function(){this.menu.add(x(e.settings)),this.menu.renderNew()}}),f({cut:["Cut","Cut","Meta+X"],copy:["Copy","Copy","Meta+C"],paste:["Paste","Paste","Meta+V"],selectall:["Select all","SelectAll","Meta+A"],bold:["Bold","Bold","Meta+B"],italic:["Italic","Italic","Meta+I"],underline:["Underline","Underline","Meta+U"],strikethrough:["Strikethrough","Strikethrough"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],removeformat:["Clear formatting","RemoveFormat"]},function(t,n){e.addMenuItem(n,{text:t[0],icon:n,shortcut:t[2],cmd:t[1]})}),e.on("mousedown",function(){n.hideAll()}),e.addButton("styleselect",{type:"menubutton",text:"Formats",menu:v,onShowMenu:function(){e.settings.style_formats_autohide&&g(this.menu)}}),e.addButton("formatselect",function(){var n=[],r=a(e.settings.block_formats||"Paragraph=p;Heading 1=h1;Heading 2=h2;Heading 3=h3;Heading 4=h4;Heading 5=h5;Heading 6=h6;Preformatted=pre");return f(r,function(t){n.push({text:t[0],value:t[1],textStyle:function(){return e.formatter.getCssText(t[1])}})}),{type:"listbox",text:r[0][0],values:n,fixedWidth:!0,onselect:h,onPostRender:t(n)}}),e.addButton("fontselect",function(){var t="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats",n=[],r=a(e.settings.font_formats||t);return f(r,function(e){n.push({text:{raw:e[0]},value:e[1],textStyle:e[1].indexOf("dings")==-1?"font-family:"+e[1]:""})}),{type:"listbox",text:"Font Family",tooltip:"Font Family",values:n,fixedWidth:!0,onPostRender:i(n),onselect:function(t){t.control.settings.value&&e.execCommand("FontName",!1,t.control.settings.value)}}}),e.addButton("fontsizeselect",function(){var t=[],n="8pt 10pt 12pt 14pt 18pt 24pt 36pt",r=e.settings.fontsize_formats||n;return f(r.split(" "),function(e){var n=e,r=e,i=e.split("=");i.length>1&&(n=i[0],r=i[1]),t.push({text:n,value:r})}),{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:t,fixedWidth:!0,onPostRender:o(t),onclick:function(t){t.control.settings.value&&e.execCommand("FontSize",!1,t.control.settings.value)}}}),e.addMenuItem("formats",{text:"Formats",menu:v})}var f=r.each,p=function(e){return i.reduce(e,function(e,t){return e.concat(t)},[])};a.on("AddEditor",function(e){var t=e.editor;c(t),d(t),u(t)}),e.translate=function(e){return a.translate(e)},t.tooltips=!s.iOS}),r(zt,[yt],function(e){return e.extend({recalc:function(e){var t,n,r,i,o,a,s,l,u,c,d,f,p,h,m,g,v,y,b,C,x,w,E,N=[],_=[],S,k,T,R,A,B;t=e.settings,i=e.items().filter(":visible"),o=e.layoutRect(),r=t.columns||Math.ceil(Math.sqrt(i.length)),n=Math.ceil(i.length/r),y=t.spacingH||t.spacing||0,b=t.spacingV||t.spacing||0,C=t.alignH||t.align,x=t.alignV||t.align,g=e.paddingBox,A="reverseRows"in t?t.reverseRows:e.isRtl(),C&&"string"==typeof C&&(C=[C]),x&&"string"==typeof x&&(x=[x]);for(d=0;dN[d]?S:N[d],_[f]=k>_[f]?k:_[f];for(T=o.innerW-g.left-g.right,w=0,d=0;d0?y:0),T-=(d>0?y:0)+N[d];for(R=o.innerH-g.top-g.bottom,E=0,f=0;f0?b:0),R-=(f>0?b:0)+_[f];if(w+=g.left+g.right,E+=g.top+g.bottom,l={},l.minW=w+(o.w-o.innerW),l.minH=E+(o.h-o.innerH),l.contentW=l.minW-o.deltaW,l.contentH=l.minH-o.deltaH,l.minW=Math.min(l.minW,o.maxW),l.minH=Math.min(l.minH,o.maxH),l.minW=Math.max(l.minW,o.startMinWidth),l.minH=Math.max(l.minH,o.startMinHeight),!o.autoResize||l.minW==o.minW&&l.minH==o.minH){o.autoResize&&(l=e.layoutRect(l),l.contentW=l.minW-o.deltaW,l.contentH=l.minH-o.deltaH);var D;D="start"==t.packV?0:R>0?Math.floor(R/n):0;var L=0,M=t.flexWidths;if(M)for(d=0;d'},src:function(e){this.getEl().src=e},html:function(e,n){var r=this,i=this.getEl().contentWindow.document.body;return i?(i.innerHTML=e,n&&n()):t.setTimeout(function(){r.html(e)}),this}})}),r(Wt,[Pe],function(e){return e.extend({init:function(e){var t=this;t._super(e),t.classes.add("widget").add("infobox"),t.canFocus=!1},severity:function(e){this.classes.remove("error"),this.classes.remove("warning"),this.classes.remove("success"),this.classes.add(e)},help:function(e){this.state.set("help",e)},renderHtml:function(){var e=this,t=e.classPrefix;return'
      '+e.encode(e.state.get("text"))+'
      '},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.getEl("body").firstChild.data=e.encode(t.value),e.state.get("rendered")&&e.updateLayoutRect()}),e.state.on("change:help",function(t){ -e.classes.toggle("has-help",t.value),e.state.get("rendered")&&e.updateLayoutRect()}),e._super()}})}),r(Vt,[Pe,ve],function(e,t){return e.extend({init:function(e){var t=this;t._super(e),t.classes.add("widget").add("label"),t.canFocus=!1,e.multiline&&t.classes.add("autoscroll"),e.strong&&t.classes.add("strong")},initLayoutRect:function(){var e=this,n=e._super();if(e.settings.multiline){var r=t.getSize(e.getEl());r.width>n.maxW&&(n.minW=n.maxW,e.classes.add("multiline")),e.getEl().style.width=n.minW+"px",n.startMinH=n.h=n.minH=Math.min(n.maxH,t.getSize(e.getEl()).height)}return n},repaint:function(){var e=this;return e.settings.multiline||(e.getEl().style.lineHeight=e.layoutRect().h+"px"),e._super()},severity:function(e){this.classes.remove("error"),this.classes.remove("warning"),this.classes.remove("success"),this.classes.add(e)},renderHtml:function(){var e=this,t,n,r=e.settings.forId;return!r&&(n=e.settings.forName)&&(t=e.getRoot().find("#"+n)[0],t&&(r=t._id)),r?'":''+e.encode(e.state.get("text"))+""},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.innerHtml(e.encode(t.value)),e.state.get("rendered")&&e.updateLayoutRect()}),e._super()}})}),r($t,[Ne],function(e){return e.extend({Defaults:{role:"toolbar",layout:"flow"},init:function(e){var t=this;t._super(e),t.classes.add("toolbar")},postRender:function(){var e=this;return e.items().each(function(e){e.classes.add("toolbar-item")}),e._super()}})}),r(qt,[$t],function(e){return e.extend({Defaults:{role:"menubar",containerCls:"menubar",ariaRoot:!0,defaults:{type:"menubutton"}}})}),r(jt,[bt,we,qt],function(e,t,n){function r(e,t){for(;e;){if(t===e)return!0;e=e.parentNode}return!1}var i=e.extend({init:function(e){var t=this;t._renderOpen=!0,t._super(e),e=t.settings,t.classes.add("menubtn"),e.fixedWidth&&t.classes.add("fixed-width"),t.aria("haspopup",!0),t.state.set("menu",e.menu||t.render())},showMenu:function(e){var n=this,r;return n.menu&&n.menu.visible()&&e!==!1?n.hideMenu():(n.menu||(r=n.state.get("menu")||[],r.length?r={type:"menu",items:r}:r.type=r.type||"menu",r.renderTo?n.menu=r.parent(n).show().renderTo():n.menu=t.create(r).parent(n).renderTo(),n.fire("createmenu"),n.menu.reflow(),n.menu.on("cancel",function(e){e.control.parent()===n.menu&&(e.stopPropagation(),n.focus(),n.hideMenu())}),n.menu.on("select",function(){n.focus()}),n.menu.on("show hide",function(e){e.control==n.menu&&n.activeMenu("show"==e.type),n.aria("expanded","show"==e.type)}).fire("show")),n.menu.show(),n.menu.layoutRect({w:n.layoutRect().w}),n.menu.moveRel(n.getEl(),n.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"]),void n.fire("showmenu"))},hideMenu:function(){var e=this;e.menu&&(e.menu.items().each(function(e){e.hideMenu&&e.hideMenu()}),e.menu.hide())},activeMenu:function(e){this.classes.toggle("active",e)},renderHtml:function(){var e=this,t=e._id,r=e.classPrefix,i=e.settings.icon,o,a=e.state.get("text"),s="";return o=e.settings.image,o?(i="none","string"!=typeof o&&(o=window.getSelection?o[0]:o[1]),o=" style=\"background-image: url('"+o+"')\""):o="",a&&(e.classes.add("btn-has-text"),s=''+e.encode(a)+""),i=e.settings.icon?r+"ico "+r+"i-"+i:"",e.aria("role",e.parent()instanceof n?"menuitem":"button"),'
      '},postRender:function(){var e=this;return e.on("click",function(t){t.control===e&&r(t.target,e.getEl())&&(e.focus(),e.showMenu(!t.aria),t.aria&&e.menu.items().filter(":visible")[0].focus())}),e.on("mouseenter",function(t){var n=t.control,r=e.parent(),o;n&&r&&n instanceof i&&n.parent()==r&&(r.items().filter("MenuButton").each(function(e){e.hideMenu&&e!=n&&(e.menu&&e.menu.visible()&&(o=!0),e.hideMenu())}),o&&(n.focus(),n.showMenu()))}),e._super()},bindStates:function(){var e=this;return e.state.on("change:menu",function(){e.menu&&e.menu.remove(),e.menu=null}),e._super()},remove:function(){this._super(),this.menu&&this.menu.remove()}});return i}),r(Yt,[Pe,we,d,c],function(e,t,n,r){return e.extend({Defaults:{border:0,role:"menuitem"},init:function(e){var t=this,n;t._super(e),e=t.settings,t.classes.add("menu-item"),e.menu&&t.classes.add("menu-item-expand"),e.preview&&t.classes.add("menu-item-preview"),n=t.state.get("text"),"-"!==n&&"|"!==n||(t.classes.add("menu-item-sep"),t.aria("role","separator"),t.state.set("text","-")),e.selectable&&(t.aria("role","menuitemcheckbox"),t.classes.add("menu-item-checkbox"),e.icon="selected"),e.preview||e.selectable||t.classes.add("menu-item-normal"),t.on("mousedown",function(e){e.preventDefault()}),e.menu&&!e.ariaHideMenu&&t.aria("haspopup",!0)},hasMenus:function(){return!!this.settings.menu},showMenu:function(){var e=this,n=e.settings,r,i=e.parent();if(i.items().each(function(t){t!==e&&t.hideMenu()}),n.menu){r=e.menu,r?r.show():(r=n.menu,r.length?r={type:"menu",items:r}:r.type=r.type||"menu",i.settings.itemDefaults&&(r.itemDefaults=i.settings.itemDefaults),r=e.menu=t.create(r).parent(e).renderTo(),r.reflow(),r.on("cancel",function(t){t.stopPropagation(),e.focus(),r.hide()}),r.on("show hide",function(e){e.control.items&&e.control.items().each(function(e){e.active(e.settings.selected)})}).fire("show"),r.on("hide",function(t){t.control===r&&e.classes.remove("selected")}),r.submenu=!0),r._parentMenu=i,r.classes.add("menu-sub");var o=r.testMoveRel(e.getEl(),e.isRtl()?["tl-tr","bl-br","tr-tl","br-bl"]:["tr-tl","br-bl","tl-tr","bl-br"]);r.moveRel(e.getEl(),o),r.rel=o,o="menu-sub-"+o,r.classes.remove(r._lastRel).add(o),r._lastRel=o,e.classes.add("selected"),e.aria("expanded",!0)}},hideMenu:function(){var e=this;return e.menu&&(e.menu.items().each(function(e){e.hideMenu&&e.hideMenu()}),e.menu.hide(),e.aria("expanded",!1)),e},renderHtml:function(){function e(e){var t,r,i={};for(i=n.mac?{alt:"⌥",ctrl:"⌘",shift:"⇧",meta:"⌘"}:{meta:"Ctrl"},e=e.split("+"),t=0;t").replace(new RegExp(t("]mce~match!"),"g"),"
      ")}var o=this,a=o._id,s=o.settings,l=o.classPrefix,u=o.state.get("text"),c=o.settings.icon,d="",f=s.shortcut,p=o.encode(s.url),h="";return c&&o.parent().classes.add("menu-has-icons"),s.image&&(d=" style=\"background-image: url('"+s.image+"')\""),f&&(f=e(f)),c=l+"ico "+l+"i-"+(o.settings.icon||"none"),h="-"!==u?'\xa0":"",u=i(o.encode(r(u))),p=i(o.encode(r(p))),'
      '+h+("-"!==u?''+u+"":"")+(f?'
      '+f+"
      ":"")+(s.menu?'
      ':"")+(p?'":"")+"
      "},postRender:function(){var e=this,t=e.settings,n=t.textStyle;if("function"==typeof n&&(n=n.call(this)),n){var i=e.getEl("text");i&&i.setAttribute("style",n)}return e.on("mouseenter click",function(n){n.control===e&&(t.menu||"click"!==n.type?(e.showMenu(),n.aria&&e.menu.focus(!0)):(e.fire("select"),r.requestAnimationFrame(function(){e.parent().hideAll()})))}),e._super(),e},hover:function(){var e=this;return e.parent().items().each(function(e){e.classes.remove("selected")}),e.classes.toggle("selected",!0),e},active:function(e){return"undefined"!=typeof e&&this.aria("checked",e),this._super(e)},remove:function(){this._super(),this.menu&&this.menu.remove()}})}),r(Xt,[g,xe,c],function(e,t,n){return function(r,i){var o=this,a,s=t.classPrefix,l;o.show=function(t,u){function c(){a&&(e(r).append('
      '),u&&u())}return o.hide(),a=!0,t?l=n.setTimeout(c,t):c(),o},o.hide=function(){var e=r.lastChild;return n.clearTimeout(l),e&&e.className.indexOf("throbber")!=-1&&e.parentNode.removeChild(e),a=!1,o}}}),r(Kt,[Ae,Yt,Xt,m],function(e,t,n,r){return e.extend({Defaults:{defaultType:"menuitem",border:1,layout:"stack",role:"application",bodyRole:"menu",ariaRoot:!0},init:function(e){var t=this;if(e.autohide=!0,e.constrainToViewport=!0,"function"==typeof e.items&&(e.itemsFactory=e.items,e.items=[]),e.itemDefaults)for(var n=e.items,i=n.length;i--;)n[i]=r.extend({},e.itemDefaults,n[i]);t._super(e),t.classes.add("menu")},repaint:function(){return this.classes.toggle("menu-align",!0),this._super(),this.getEl().style.height="",this.getEl("body").style.height="",this},cancel:function(){var e=this;e.hideAll(),e.fire("select")},load:function(){function e(){t.throbber&&(t.throbber.hide(),t.throbber=null)}var t=this,r,i;i=t.settings.itemsFactory,i&&(t.throbber||(t.throbber=new n(t.getEl("body"),!0),0===t.items().length?(t.throbber.show(),t.fire("loading")):t.throbber.show(100,function(){t.items().remove(),t.fire("loading")}),t.on("hide close",e)),t.requestTime=r=(new Date).getTime(),t.settings.itemsFactory(function(n){return 0===n.length?void t.hide():void(t.requestTime===r&&(t.getEl().style.width="",t.getEl("body").style.width="",e(),t.items().remove(),t.getEl("body").innerHTML="",t.add(n),t.renderNew(),t.fire("loaded")))}))},hideAll:function(){var e=this;return this.find("menuitem").exec("hideMenu"),e._super()},preRender:function(){var e=this;return e.items().each(function(t){var n=t.settings;if(n.icon||n.image||n.selectable)return e._hasIcons=!0,!1}),e.settings.itemsFactory&&e.on("postrender",function(){e.settings.itemsFactory&&e.load()}),e._super()}})}),r(Gt,[jt,Kt],function(e,t){return e.extend({init:function(e){function t(r){for(var a=0;a0&&(o=r[0].text,n.state.set("value",r[0].value)),n.state.set("menu",r)),n.state.set("text",e.text||o),n.classes.add("listbox"),n.on("select",function(t){var r=t.control;a&&(t.lastControl=a),e.multiple?r.active(!r.active()):n.value(t.control.value()),a=r})},bindStates:function(){function e(e,n){e instanceof t&&e.items().each(function(e){e.hasMenus()||e.active(e.value()===n)})}function n(e,t){var r;if(e)for(var i=0;i
      '},postRender:function(){var e=this;e._super(),e.resizeDragHelper=new t(this._id,{start:function(){e.fire("ResizeStart")},drag:function(t){"both"!=e.settings.direction&&(t.deltaX=0),e.fire("Resize",t)},stop:function(){e.fire("ResizeEnd")}})},remove:function(){return this.resizeDragHelper&&this.resizeDragHelper.destroy(),this._super()}})}),r(Zt,[Pe],function(e){function t(e){var t="";if(e)for(var n=0;n'+e[n]+"";return t}return e.extend({Defaults:{classes:"selectbox",role:"selectbox",options:[]},init:function(e){var t=this;t._super(e),t.settings.size&&(t.size=t.settings.size),t.settings.options&&(t._options=t.settings.options),t.on("keydown",function(e){var n;13==e.keyCode&&(e.preventDefault(),t.parents().reverse().each(function(e){if(e.toJSON)return n=e,!1}),t.fire("submit",{data:n.toJSON()}))})},options:function(e){return arguments.length?(this.state.set("options",e),this):this.state.get("options")},renderHtml:function(){var e=this,n,r="";return n=t(e._options),e.size&&(r=' size = "'+e.size+'"'),'"},bindStates:function(){var e=this;return e.state.on("change:options",function(n){e.getEl().innerHTML=t(n.value)}),e._super()}})}),r(en,[Pe,_e,ve],function(e,t,n){function r(e,t,n){return en&&(e=n),e}function i(e,t,n){e.setAttribute("aria-"+t,n)}function o(e,t){var r,o,a,s,l,u;"v"==e.settings.orientation?(s="top",a="height",o="h"):(s="left",a="width",o="w"),u=e.getEl("handle"),r=(e.layoutRect()[o]||100)-n.getSize(u)[a],l=r*((t-e._minValue)/(e._maxValue-e._minValue))+"px",u.style[s]=l,u.style.height=e.layoutRect().h+"px",i(u,"valuenow",t),i(u,"valuetext",""+e.settings.previewFilter(t)),i(u,"valuemin",e._minValue),i(u,"valuemax",e._maxValue)}return e.extend({init:function(e){var t=this;e.previewFilter||(e.previewFilter=function(e){return Math.round(100*e)/100}),t._super(e),t.classes.add("slider"),"v"==e.orientation&&t.classes.add("vertical"),t._minValue=e.minValue||0,t._maxValue=e.maxValue||100,t._initValue=t.state.get("value")},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix;return'
      '},reset:function(){this.value(this._initValue).repaint()},postRender:function(){function e(e,t,n){return(n+e)/(t-e)}function i(e,t,n){return n*(t-e)-e}function o(t,n){function o(o){var a;a=s.value(),a=i(t,n,e(t,n,a)+.05*o),a=r(a,t,n),s.value(a),s.fire("dragstart",{value:a}),s.fire("drag",{value:a}),s.fire("dragend",{value:a})}s.on("keydown",function(e){switch(e.keyCode){case 37:case 38:o(-1);break;case 39:case 40:o(1)}})}function a(e,i,o){var a,l,u,h,m;s._dragHelper=new t(s._id,{handle:s._id+"-handle",start:function(e){a=e[c],l=parseInt(s.getEl("handle").style[d],10),u=(s.layoutRect()[p]||100)-n.getSize(o)[f],s.fire("dragstart",{value:m})},drag:function(t){var n=t[c]-a;h=r(l+n,0,u),o.style[d]=h+"px",m=e+h/u*(i-e),s.value(m),s.tooltip().text(""+s.settings.previewFilter(m)).show().moveRel(o,"bc tc"),s.fire("drag",{value:m})},stop:function(){s.tooltip().hide(),s.fire("dragend",{value:m})}})}var s=this,l,u,c,d,f,p;l=s._minValue,u=s._maxValue,"v"==s.settings.orientation?(c="screenY",d="top",f="height",p="h"):(c="screenX",d="left",f="width",p="w"),s._super(),o(l,u,s.getEl("handle")),a(l,u,s.getEl("handle"))},repaint:function(){this._super(),o(this,this.value())},bindStates:function(){var e=this;return e.state.on("change:value",function(t){o(e,t.value)}),e._super()}})}),r(tn,[Pe],function(e){return e.extend({renderHtml:function(){var e=this;return e.classes.add("spacer"),e.canFocus=!1,'
      '}})}),r(nn,[jt,ve,g],function(e,t,n){return e.extend({Defaults:{classes:"widget btn splitbtn",role:"button"},repaint:function(){var e=this,r=e.getEl(),i=e.layoutRect(),o,a;return e._super(),o=r.firstChild,a=r.lastChild,n(o).css({width:i.w-t.getSize(a).width,height:i.h-2}),n(a).css({height:i.h-2}),e},activeMenu:function(e){var t=this;n(t.getEl().lastChild).toggleClass(t.classPrefix+"active",e)},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r,i=e.state.get("icon"),o=e.state.get("text"),a="";return r=e.settings.image,r?(i="none","string"!=typeof r&&(r=window.getSelection?r[0]:r[1]),r=" style=\"background-image: url('"+r+"')\""):r="",i=e.settings.icon?n+"ico "+n+"i-"+i:"",o&&(e.classes.add("btn-has-text"),a=''+e.encode(o)+""),'
      '},postRender:function(){var e=this,t=e.settings.onclick;return e.on("click",function(e){var n=e.target;if(e.control==this)for(;n;){if(e.aria&&"down"!=e.aria.key||"BUTTON"==n.nodeName&&n.className.indexOf("open")==-1)return e.stopImmediatePropagation(),void(t&&t.call(this,e));n=n.parentNode}}),delete e.settings.onclick,e._super()}})}),r(rn,[Ht],function(e){return e.extend({Defaults:{containerClass:"stack-layout",controlClass:"stack-layout-item",endClass:"break"},isNative:function(){return!0}})}),r(on,[ke,g,ve],function(e,t,n){return e.extend({Defaults:{layout:"absolute",defaults:{type:"panel"}},activateTab:function(e){var n;this.activeTabId&&(n=this.getEl(this.activeTabId),t(n).removeClass(this.classPrefix+"active"),n.setAttribute("aria-selected","false")),this.activeTabId="t"+e,n=this.getEl("t"+e),n.setAttribute("aria-selected","true"),t(n).addClass(this.classPrefix+"active"),this.items()[e].show().fire("showtab"),this.reflow(),this.items().each(function(t,n){e!=n&&t.hide()})},renderHtml:function(){var e=this,t=e._layout,n="",r=e.classPrefix;return e.preRender(),t.preRender(e),e.items().each(function(t,i){var o=e._id+"-t"+i;t.aria("role","tabpanel"),t.aria("labelledby",o),n+='"}),'
      '+n+'
      '+t.renderHtml(e)+"
      "},postRender:function(){var e=this;e._super(),e.settings.activeTab=e.settings.activeTab||0,e.activateTab(e.settings.activeTab),this.on("click",function(t){var n=t.target.parentNode;if(n&&n.id==e._id+"-head")for(var r=n.childNodes.length;r--;)n.childNodes[r]==t.target&&e.activateTab(r)})},initLayoutRect:function(){var e=this,t,r,i;r=n.getSize(e.getEl("head")).width,r=r<0?0:r,i=0,e.items().each(function(e){r=Math.max(r,e.layoutRect().minW),i=Math.max(i,e.layoutRect().minH)}),e.items().each(function(e){e.settings.x=0,e.settings.y=0,e.settings.w=r,e.settings.h=i,e.layoutRect({x:0,y:0,w:r,h:i})});var o=n.getSize(e.getEl("head")).height;return e.settings.minWidth=r,e.settings.minHeight=i+o,t=e._super(),t.deltaH+=o,t.innerH=t.h-t.deltaH,t}})}),r(an,[Pe,m,ve],function(e,t,n){return e.extend({init:function(e){var t=this;t._super(e),t.classes.add("textbox"),e.multiline?t.classes.add("multiline"):(t.on("keydown",function(e){var n;13==e.keyCode&&(e.preventDefault(),t.parents().reverse().each(function(e){if(e.toJSON)return n=e,!1}),t.fire("submit",{data:n.toJSON()}))}),t.on("keyup",function(e){t.state.set("value",e.target.value)}))},repaint:function(){var e=this,t,n,r,i,o=0,a;t=e.getEl().style,n=e._layoutRect,a=e._lastRepaintRect||{};var s=document;return!e.settings.multiline&&s.all&&(!s.documentMode||s.documentMode<=8)&&(t.lineHeight=n.h-o+"px"),r=e.borderBox,i=r.left+r.right+8,o=r.top+r.bottom+(e.settings.multiline?8:0),n.x!==a.x&&(t.left=n.x+"px",a.x=n.x),n.y!==a.y&&(t.top=n.y+"px",a.y=n.y),n.w!==a.w&&(t.width=n.w-i+"px",a.w=n.w),n.h!==a.h&&(t.height=n.h-o+"px",a.h=n.h),e._lastRepaintRect=a,e.fire("repaint",{},!1),e},renderHtml:function(){var e=this,r=e.settings,i,o;return i={id:e._id,hidefocus:"1"},t.each(["rows","spellcheck","maxLength","size","readonly","min","max","step","list","pattern","placeholder","required","multiple"],function(e){i[e]=r[e]}),e.disabled()&&(i.disabled="disabled"),r.subtype&&(i.type=r.subtype),o=n.create(r.multiline?"textarea":"input",i),o.value=e.state.get("value"),o.className=e.classes,o.outerHTML},value:function(e){return arguments.length?(this.state.set("value",e),this):(this.state.get("rendered")&&this.state.set("value",this.getEl().value),this.state.get("value"))},postRender:function(){var e=this;e.getEl().value=e.state.get("value"),e._super(),e.$el.on("change",function(t){e.state.set("value",t.target.value),e.fire("change",t)})},bindStates:function(){var e=this;return e.state.on("change:value",function(t){e.getEl().value!=t.value&&(e.getEl().value=t.value)}),e.state.on("change:disabled",function(t){e.getEl().disabled=t.value}),e._super()},remove:function(){this.$el.off(),this._super()}})}),r(sn,[],function(){var e=this||window,t=function(){return e.tinymce};return"function"==typeof e.define&&(e.define.amd||e.define("ephox/tinymce",[],t)),"object"==typeof module&&(module.exports=window.tinymce),{}}),a([l,u,c,d,f,p,m,g,v,y,C,w,E,N,T,A,B,D,L,M,P,O,I,F,j,Y,J,te,le,ue,ce,de,pe,me,ge,Ce,xe,we,Ee,Ne,_e,Se,ke,Te,Re,Ae,Be,De,Le,Me,Pe,Oe,He,Ie,Ue,Ve,at,st,lt,ut,dt,ft,pt,ht,mt,gt,vt,yt,bt,Ct,xt,wt,Et,Nt,_t,St,kt,Tt,Rt,At,Bt,Dt,Mt,Pt,Ot,Ht,Ft,zt,Ut,Wt,Vt,$t,qt,jt,Yt,Xt,Kt,Gt,Jt,Qt,Zt,en,tn,nn,rn,on,an])}(window); \ No newline at end of file diff --git a/wp/wp-includes/js/tinymce/utils/editable_selects.js b/wp/wp-includes/js/tinymce/utils/editable_selects.js deleted file mode 100644 index de984393..00000000 --- a/wp/wp-includes/js/tinymce/utils/editable_selects.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * editable_selects.js - * - * Released under LGPL License. - * Copyright (c) 1999-2015 Ephox Corp. All rights reserved - * - * License: http://www.tinymce.com/license - * Contributing: http://www.tinymce.com/contributing - */ - -var TinyMCE_EditableSelects = { - editSelectElm : null, - - init : function() { - var nl = document.getElementsByTagName("select"), i, d = document, o; - - for (i=0; i'; - h += ' '; - - return h; -} - -function updateColor(img_id, form_element_id) { - document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value; -} - -function setBrowserDisabled(id, state) { - var img = document.getElementById(id); - var lnk = document.getElementById(id + "_link"); - - if (lnk) { - if (state) { - lnk.setAttribute("realhref", lnk.getAttribute("href")); - lnk.removeAttribute("href"); - tinyMCEPopup.dom.addClass(img, 'disabled'); - } else { - if (lnk.getAttribute("realhref")) - lnk.setAttribute("href", lnk.getAttribute("realhref")); - - tinyMCEPopup.dom.removeClass(img, 'disabled'); - } - } -} - -function getBrowserHTML(id, target_form_element, type, prefix) { - var option = prefix + "_" + type + "_browser_callback", cb, html; - - cb = tinyMCEPopup.getParam(option, tinyMCEPopup.getParam("file_browser_callback")); - - if (!cb) - return ""; - - html = ""; - html += ''; - html += ' '; - - return html; -} - -function openBrowser(img_id, target_form_element, type, option) { - var img = document.getElementById(img_id); - - if (img.className != "mceButtonDisabled") - tinyMCEPopup.openBrowser(target_form_element, type, option); -} - -function selectByValue(form_obj, field_name, value, add_custom, ignore_case) { - if (!form_obj || !form_obj.elements[field_name]) - return; - - if (!value) - value = ""; - - var sel = form_obj.elements[field_name]; - - var found = false; - for (var i=0; i parseInt(v)) - st = this.mark(f, n); - } - } - - return st; - }, - - hasClass : function(n, c, d) { - return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className); - }, - - getNum : function(n, c) { - c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0]; - c = c.replace(/[^0-9]/g, ''); - - return c; - }, - - addClass : function(n, c, b) { - var o = this.removeClass(n, c); - n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c; - }, - - removeClass : function(n, c) { - c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' '); - return n.className = c != ' ' ? c : ''; - }, - - tags : function(f, s) { - return f.getElementsByTagName(s); - }, - - mark : function(f, n) { - var s = this.settings; - - this.addClass(n, s.invalid_cls); - n.setAttribute('aria-invalid', 'true'); - this.markLabels(f, n, s.invalid_cls); - - return false; - }, - - markLabels : function(f, n, ic) { - var nl, i; - - nl = this.tags(f, "label"); - for (i=0; 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

      &^!_D835D|Z#&@qcu~De;2tHUl)_KjYwtxm@8r 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

      rR*@N2Bav@`q727{ra7(kYb2L4S~`eqWvR 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 V-?koZLrn;d|9>z!N2+^g2mqcZ7lHr) diff --git a/wp/wp-includes/js/tinymce/wp-tinymce.php b/wp/wp-includes/js/tinymce/wp-tinymce.php deleted file mode 100644 index ea58e682..00000000 --- a/wp/wp-includes/js/tinymce/wp-tinymce.php +++ /dev/null @@ -1,39 +0,0 @@ - tags or HTMLImage nodes. - * "emojify" a generic text or DOM Element. - * - * @overloads - * - * String replacement for `innerHTML` or server side operations - * twemoji.parse(string); - * twemoji.parse(string, Function); - * twemoji.parse(string, Object); - * - * HTMLElement tree parsing for safer operations over existing DOM - * twemoji.parse(HTMLElement); - * twemoji.parse(HTMLElement, Function); - * twemoji.parse(HTMLElement, Object); - * - * @param string|HTMLElement the source to parse and enrich with emoji. - * - * string replace emoji matches with tags. - * Mainly used to inject emoji via `innerHTML` - * It does **not** parse the string or validate it, - * it simply replaces found emoji with a tag. - * NOTE: be sure this won't affect security. - * - * HTMLElement walk through the DOM tree and find emoji - * that are inside **text node only** (nodeType === 3) - * Mainly used to put emoji in already generated DOM - * without compromising surrounding nodes and - * **avoiding** the usage of `innerHTML`. - * NOTE: Using DOM elements instead of strings should - * improve security without compromising too much - * performance compared with a less safe `innerHTML`. - * - * @param Function|Object [optional] - * either the callback that will be invoked or an object - * with all properties to use per each found emoji. - * - * Function if specified, this will be invoked per each emoji - * that has been found through the RegExp except - * those follwed by the invariant \uFE0E ("as text"). - * Once invoked, parameters will be: - * - * iconId:string the lower case HEX code point - * i.e. "1f4a9" - * - * options:Object all info for this parsing operation - * - * variant:char the optional \uFE0F ("as image") - * variant, in case this info - * is anyhow meaningful. - * By default this is ignored. - * - * If such callback will return a falsy value instead - * of a valid `src` to use for the image, nothing will - * actually change for that specific emoji. - * - * - * Object if specified, an object containing the following properties - * - * callback Function the callback to invoke per each found emoji. - * base string the base url, by default twemoji.base - * ext string the image extension, by default twemoji.ext - * size string the assets size, by default twemoji.size - * - * @example - * - * twemoji.parse("I \u2764\uFE0F emoji!"); - * // I ❤️ emoji! - * - * - * twemoji.parse("I \u2764\uFE0F emoji!", function(iconId, options) { - * return '/assets/' + iconId + '.gif'; - * }); - * // I ❤️ emoji! - * - * - * twemoji.parse("I \u2764\uFE0F emoji!", { - * size: 72, - * callback: function(iconId, options) { - * return '/assets/' + options.size + '/' + iconId + options.ext; - * } - * }); - * // I ❤️ emoji! - * - */ - parse: parse, - - /** - * Given a string, invokes the callback argument - * per each emoji found in such string. - * This is the most raw version used by - * the .parse(string) method itself. - * - * @param string generic string to parse - * @param Function a generic callback that will be - * invoked to replace the content. - * This calback wil receive standard - * String.prototype.replace(str, callback) - * arguments such: - * callback( - * rawText, // the emoji match - * ); - * - * and others commonly received via replace. - */ - replace: replace, - - /** - * Simplify string tests against emoji. - * - * @param string some text that might contain emoji - * @return boolean true if any emoji was found, false otherwise. - * - * @example - * - * if (twemoji.test(someContent)) { - * console.log("emoji All The Things!"); - * } - */ - test: test - }, - - // used to escape HTML special chars in attributes - escaper = { - '&': '&', - '<': '<', - '>': '>', - "'": ''', - '"': '"' - }, - - // RegExp based on emoji's official Unicode standards - // http://www.unicode.org/Public/UNIDATA/EmojiSources.txt - re = /\ud83d[\udc68-\udc69](?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92])|(?:\ud83c[\udfcb\udfcc]|\ud83d\udd75|\u26f9)(?:\ufe0f|\ud83c[\udffb-\udfff])\u200d[\u2640\u2642]\ufe0f|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd37-\udd39\udd3d\udd3e])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|(?:[\u0023\u002a\u0030-\u0039])\ufe0f?\u20e3|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd18-\udd1c\udd1e\udd26\udd30\udd33-\udd39\udd3d\udd3e]|[\u270a\u270b])(?:\ud83c[\udffb-\udfff]|)|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud800\udc00|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a-\udc6d\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\udeeb\udeec\udef4-\udef6]|\ud83e[\udd10-\udd17\udd1d\udd20-\udd25\udd27\udd3a\udd3c\udd40-\udd45\udd47-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|[\u23e9-\u23ec\u23f0\u23f3\u2640\u2642\u2695\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a]|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u00a9\u00ae\u203c\u2049\u2122\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2694\u2696\u2697\u2699\u269b\u269c\u26a0\u26a1\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))/g, - - // avoid runtime RegExp creation for not so smart, - // not JIT based, and old browsers / engines - UFE0Fg = /\uFE0F/g, - - // avoid using a string literal like '\u200D' here because minifiers expand it inline - U200D = String.fromCharCode(0x200D), - - // used to find HTML special chars in attributes - rescaper = /[&<>'"]/g, - - // nodes with type 1 which should **not** be parsed (including lower case svg) - shouldntBeParsed = /IFRAME|NOFRAMES|NOSCRIPT|SCRIPT|SELECT|STYLE|TEXTAREA|[a-z]/, - - // just a private shortcut - fromCharCode = String.fromCharCode; - - return twemoji; - - - ///////////////////////// - // private functions // - // declaration // - ///////////////////////// - - /** - * Shortcut to create text nodes - * @param string text used to create DOM text node - * @return Node a DOM node with that text - */ - function createText(text) { - return document.createTextNode(text); - } - - /** - * Utility function to escape html attribute text - * @param string text use in HTML attribute - * @return string text encoded to use in HTML attribute - */ - function escapeHTML(s) { - return s.replace(rescaper, replacer); - } - - /** - * Default callback used to generate emoji src - * based on Twitter CDN - * @param string the emoji codepoint string - * @param string the default size to use, i.e. "36x36" - * @return string the image source to use - */ - function defaultImageSrcGenerator(icon, options) { - return ''.concat(options.base, options.size, '/', icon, options.ext); - } - - /** - * Given a generic DOM nodeType 1, walk through all children - * and store every nodeType 3 (#text) found in the tree. - * @param Element a DOM Element with probably some text in it - * @param Array the list of previously discovered text nodes - * @return Array same list with new discovered nodes, if any - */ - function grabAllTextNodes(node, allText) { - var - childNodes = node.childNodes, - length = childNodes.length, - subnode, - nodeType; - while (length--) { - subnode = childNodes[length]; - nodeType = subnode.nodeType; - // parse emoji only in text nodes - if (nodeType === 3) { - // collect them to process emoji later - allText.push(subnode); - } - // ignore all nodes that are not type 1 or that - // should not be parsed as script, style, and others - else if (nodeType === 1 && !shouldntBeParsed.test(subnode.nodeName)) { - grabAllTextNodes(subnode, allText); - } - } - return allText; - } - - /** - * Used to both remove the possible variant - * and to convert utf16 into code points. - * If there is a zero-width-joiner (U+200D), leave the variants in. - * @param string the raw text of the emoji match - */ - function grabTheRightIcon(rawText) { - // if variant is present as \uFE0F - return toCodePoint(rawText.indexOf(U200D) < 0 ? - rawText.replace(UFE0Fg, '') : - rawText - ); - } - - /** - * DOM version of the same logic / parser: - * emojify all found sub-text nodes placing images node instead. - * @param Element generic DOM node with some text in some child node - * @param Object options containing info about how to parse - * - * .callback Function the callback to invoke per each found emoji. - * .base string the base url, by default twemoji.base - * .ext string the image extension, by default twemoji.ext - * .size string the assets size, by default twemoji.size - * - * @return Element same generic node with emoji in place, if any. - */ - function parseNode(node, options) { - var - allText = grabAllTextNodes(node, []), - length = allText.length, - attrib, - attrname, - modified, - fragment, - subnode, - text, - match, - i, - index, - img, - rawText, - iconId, - src; - while (length--) { - modified = false; - fragment = document.createDocumentFragment(); - subnode = allText[length]; - text = subnode.nodeValue; - i = 0; - while ((match = re.exec(text))) { - index = match.index; - if (index !== i) { - fragment.appendChild( - createText(text.slice(i, index)) - ); - } - rawText = match[0]; - iconId = grabTheRightIcon(rawText); - i = index + rawText.length; - src = options.callback(iconId, options); - if (src) { - img = new Image(); - img.onerror = options.onerror; - img.setAttribute('draggable', 'false'); - attrib = options.attributes(rawText, iconId); - for (attrname in attrib) { - if ( - attrib.hasOwnProperty(attrname) && - // don't allow any handlers to be set + don't allow overrides - attrname.indexOf('on') !== 0 && - !img.hasAttribute(attrname) - ) { - img.setAttribute(attrname, attrib[attrname]); - } - } - img.className = options.className; - img.alt = rawText; - img.src = src; - modified = true; - fragment.appendChild(img); - } - if (!img) fragment.appendChild(createText(rawText)); - img = null; - } - // is there actually anything to replace in here ? - if (modified) { - // any text left to be added ? - if (i < text.length) { - fragment.appendChild( - createText(text.slice(i)) - ); - } - // replace the text node only, leave intact - // anything else surrounding such text - subnode.parentNode.replaceChild(fragment, subnode); - } - } - return node; - } - - /** - * String/HTML version of the same logic / parser: - * emojify a generic text placing images tags instead of surrogates pair. - * @param string generic string with possibly some emoji in it - * @param Object options containing info about how to parse - * - * .callback Function the callback to invoke per each found emoji. - * .base string the base url, by default twemoji.base - * .ext string the image extension, by default twemoji.ext - * .size string the assets size, by default twemoji.size - * - * @return the string with replacing all found and parsed emoji - */ - function parseString(str, options) { - return replace(str, function (rawText) { - var - ret = rawText, - iconId = grabTheRightIcon(rawText), - src = options.callback(iconId, options), - attrib, - attrname; - if (src) { - // recycle the match string replacing the emoji - // with its image counter part - ret = ''); - } - return ret; - }); - } - - /** - * Function used to actually replace HTML special chars - * @param string HTML special char - * @return string encoded HTML special char - */ - function replacer(m) { - return escaper[m]; - } - - /** - * Default options.attribute callback - * @return null - */ - function returnNull() { - return null; - } - - /** - * Given a generic value, creates its squared counterpart if it's a number. - * As example, number 36 will return '36x36'. - * @param any a generic value. - * @return any a string representing asset size, i.e. "36x36" - * only in case the value was a number. - * Returns initial value otherwise. - */ - function toSizeSquaredAsset(value) { - return typeof value === 'number' ? - value + 'x' + value : - value; - } - - - ///////////////////////// - // exported functions // - // declaration // - ///////////////////////// - - function fromCodePoint(codepoint) { - var code = typeof codepoint === 'string' ? - parseInt(codepoint, 16) : codepoint; - if (code < 0x10000) { - return fromCharCode(code); - } - code -= 0x10000; - return fromCharCode( - 0xD800 + (code >> 10), - 0xDC00 + (code & 0x3FF) - ); - } - - function parse(what, how) { - if (!how || typeof how === 'function') { - how = {callback: how}; - } - // if first argument is string, inject html tags - // otherwise use the DOM tree and parse text nodes only - return (typeof what === 'string' ? parseString : parseNode)(what, { - callback: how.callback || defaultImageSrcGenerator, - attributes: typeof how.attributes === 'function' ? how.attributes : returnNull, - base: typeof how.base === 'string' ? how.base : twemoji.base, - ext: how.ext || twemoji.ext, - size: how.folder || toSizeSquaredAsset(how.size || twemoji.size), - className: how.className || twemoji.className, - onerror: how.onerror || twemoji.onerror - }); - } - - function replace(text, callback) { - return String(text).replace(re, callback); - } - - function test(text) { - // IE6 needs a reset before too - re.lastIndex = 0; - var result = re.test(text); - re.lastIndex = 0; - return result; - } - - function toCodePoint(unicodeSurrogates, sep) { - var - r = [], - c = 0, - p = 0, - i = 0; - while (i < unicodeSurrogates.length) { - c = unicodeSurrogates.charCodeAt(i++); - if (p) { - r.push((0x10000 + ((p - 0xD800) << 10) + (c - 0xDC00)).toString(16)); - p = 0; - } else if (0xD800 <= c && c <= 0xDBFF) { - p = c; - } else { - r.push(c.toString(16)); - } - } - return r.join(sep || '-'); - } - -}()); diff --git a/wp/wp-includes/js/twemoji.min.js b/wp/wp-includes/js/twemoji.min.js deleted file mode 100644 index 5fe4fe5e..00000000 --- a/wp/wp-includes/js/twemoji.min.js +++ /dev/null @@ -1 +0,0 @@ -var twemoji=function(){"use strict";function a(a){return document.createTextNode(a)}function b(a){return a.replace(u,h)}function c(a,b){return"".concat(b.base,b.size,"/",a,b.ext)}function d(a,b){for(var c,e,f=a.childNodes,g=f.length;g--;)c=f[g],e=c.nodeType,3===e?b.push(c):1!==e||v.test(c.nodeName)||d(c,b);return b}function e(a){return o(a.indexOf(t)<0?a.replace(s,""):a)}function f(b,c){for(var f,g,h,i,j,k,l,m,n,o,p,q,s,t=d(b,[]),u=t.length;u--;){for(h=!1,i=document.createDocumentFragment(),j=t[u],k=j.nodeValue,m=0;l=r.exec(k);){if(n=l.index,n!==m&&i.appendChild(a(k.slice(m,n))),p=l[0],q=e(p),m=n+p.length,s=c.callback(q,c)){o=new Image,o.onerror=c.onerror,o.setAttribute("draggable","false"),f=c.attributes(p,q);for(g in f)f.hasOwnProperty(g)&&0!==g.indexOf("on")&&!o.hasAttribute(g)&&o.setAttribute(g,f[g]);o.className=c.className,o.alt=p,o.src=s,h=!0,i.appendChild(o)}o||i.appendChild(a(p)),o=null}h&&(m")}return g})}function h(a){return q[a]}function i(){return null}function j(a){return"number"==typeof a?a+"x"+a:a}function k(a){var b="string"==typeof a?parseInt(a,16):a;return b<65536?w(b):(b-=65536,w(55296+(b>>10),56320+(1023&b)))}function l(a,b){return b&&"function"!=typeof b||(b={callback:b}),("string"==typeof a?g:f)(a,{callback:b.callback||c,attributes:"function"==typeof b.attributes?b.attributes:i,base:"string"==typeof b.base?b.base:p.base,ext:b.ext||p.ext,size:b.folder||j(b.size||p.size),className:b.className||p.className,onerror:b.onerror||p.onerror})}function m(a,b){return String(a).replace(r,b)}function n(a){r.lastIndex=0;var b=r.test(a);return r.lastIndex=0,b}function o(a,b){for(var c=[],d=0,e=0,f=0;f":">","'":"'",'"':"""},r=/\ud83d[\udc68-\udc69](?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92])|(?:\ud83c[\udfcb\udfcc]|\ud83d\udd75|\u26f9)(?:\ufe0f|\ud83c[\udffb-\udfff])\u200d[\u2640\u2642]\ufe0f|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd37-\udd39\udd3d\udd3e])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|(?:[\u0023\u002a\u0030-\u0039])\ufe0f?\u20e3|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd18-\udd1c\udd1e\udd26\udd30\udd33-\udd39\udd3d\udd3e]|[\u270a\u270b])(?:\ud83c[\udffb-\udfff]|)|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud800\udc00|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a-\udc6d\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\udeeb\udeec\udef4-\udef6]|\ud83e[\udd10-\udd17\udd1d\udd20-\udd25\udd27\udd3a\udd3c\udd40-\udd45\udd47-\udd4b\udd50-\udd5e\udd80-\udd91\uddc0]|[\u23e9-\u23ec\u23f0\u23f3\u2640\u2642\u2695\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a]|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u00a9\u00ae\u203c\u2049\u2122\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2694\u2696\u2697\u2699\u269b\u269c\u26a0\u26a1\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))/g,s=/\uFE0F/g,t=String.fromCharCode(8205),u=/[&<>'"]/g,v=/IFRAME|NOFRAMES|NOSCRIPT|SCRIPT|SELECT|STYLE|TEXTAREA|[a-z]/,w=String.fromCharCode;return p}(); \ No newline at end of file diff --git a/wp/wp-includes/js/underscore.min.js b/wp/wp-includes/js/underscore.min.js deleted file mode 100644 index 3c3eec02..00000000 --- a/wp/wp-includes/js/underscore.min.js +++ /dev/null @@ -1,5 +0,0 @@ -// Underscore.js 1.8.3 -// http://underscorejs.org -// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors -// Underscore may be freely distributed under the MIT license. -(function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if("number"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.hasOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):u._=m,m.VERSION="1.8.3";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}},j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w("length"),k=function(n){var t=O(n);return"number"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),("number"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.call(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return function(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t),i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return"[object Array]"===s.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return s.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var K=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,L=function(n){return"\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||"obj";return c.source="function("+f+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each(["concat","join","slice"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this); diff --git a/wp/wp-includes/js/utils.js b/wp/wp-includes/js/utils.js deleted file mode 100644 index d8fa7d8d..00000000 --- a/wp/wp-includes/js/utils.js +++ /dev/null @@ -1,197 +0,0 @@ -/* global userSettings */ -/* exported getUserSetting, setUserSetting, deleteUserSetting */ -// utility functions - -var wpCookies = { -// The following functions are from Cookie.js class in TinyMCE 3, Moxiecode, used under LGPL. - - each: function( obj, cb, scope ) { - var n, l; - - if ( ! obj ) { - return 0; - } - - scope = scope || obj; - - if ( typeof( obj.length ) !== 'undefined' ) { - for ( n = 0, l = obj.length; n < l; n++ ) { - if ( cb.call( scope, obj[n], n, obj ) === false ) { - return 0; - } - } - } else { - for ( n in obj ) { - if ( obj.hasOwnProperty(n) ) { - if ( cb.call( scope, obj[n], n, obj ) === false ) { - return 0; - } - } - } - } - return 1; - }, - - /** - * Get a multi-values cookie. - * Returns a JS object with the name: 'value' pairs. - */ - getHash: function( name ) { - var cookie = this.get( name ), values; - - if ( cookie ) { - this.each( cookie.split('&'), function( pair ) { - pair = pair.split('='); - values = values || {}; - values[pair[0]] = pair[1]; - }); - } - - return values; - }, - - /** - * Set a multi-values cookie. - * - * 'values_obj' is the JS object that is stored. It is encoded as URI in wpCookies.set(). - */ - setHash: function( name, values_obj, expires, path, domain, secure ) { - var str = ''; - - this.each( values_obj, function( val, key ) { - str += ( ! str ? '' : '&' ) + key + '=' + val; - }); - - this.set( name, str, expires, path, domain, secure ); - }, - - /** - * Get a cookie. - */ - get: function( name ) { - var e, b, - cookie = document.cookie, - p = name + '='; - - if ( ! cookie ) { - return; - } - - b = cookie.indexOf( '; ' + p ); - - if ( b === -1 ) { - b = cookie.indexOf(p); - - if ( b !== 0 ) { - return null; - } - } else { - b += 2; - } - - e = cookie.indexOf( ';', b ); - - if ( e === -1 ) { - e = cookie.length; - } - - return decodeURIComponent( cookie.substring( b + p.length, e ) ); - }, - - /** - * Set a cookie. - * - * The 'expires' arg can be either a JS Date() object set to the expiration date (back-compat) - * or the number of seconds until expiration - */ - set: function( name, value, expires, path, domain, secure ) { - var d = new Date(); - - if ( typeof( expires ) === 'object' && expires.toGMTString ) { - expires = expires.toGMTString(); - } else if ( parseInt( expires, 10 ) ) { - d.setTime( d.getTime() + ( parseInt( expires, 10 ) * 1000 ) ); // time must be in milliseconds - expires = d.toGMTString(); - } else { - expires = ''; - } - - document.cookie = name + '=' + encodeURIComponent( value ) + - ( expires ? '; expires=' + expires : '' ) + - ( path ? '; path=' + path : '' ) + - ( domain ? '; domain=' + domain : '' ) + - ( secure ? '; secure' : '' ); - }, - - /** - * Remove a cookie. - * - * This is done by setting it to an empty value and setting the expiration time in the past. - */ - remove: function( name, path, domain, secure ) { - this.set( name, '', -1000, path, domain, secure ); - } -}; - -// Returns the value as string. Second arg or empty string is returned when value is not set. -function getUserSetting( name, def ) { - var settings = getAllUserSettings(); - - if ( settings.hasOwnProperty( name ) ) { - return settings[name]; - } - - if ( typeof def !== 'undefined' ) { - return def; - } - - return ''; -} - -// Both name and value must be only ASCII letters, numbers or underscore -// and the shorter, the better (cookies can store maximum 4KB). Not suitable to store text. -// The value is converted and stored as string. -function setUserSetting( name, value, _del ) { - if ( 'object' !== typeof userSettings ) { - return false; - } - - var uid = userSettings.uid, - settings = wpCookies.getHash( 'wp-settings-' + uid ), - path = userSettings.url, - secure = !! userSettings.secure; - - name = name.toString().replace( /[^A-Za-z0-9_-]/g, '' ); - - if ( typeof value === 'number' ) { - value = parseInt( value, 10 ); - } else { - value = value.toString().replace( /[^A-Za-z0-9_-]/g, '' ); - } - - settings = settings || {}; - - if ( _del ) { - delete settings[name]; - } else { - settings[name] = value; - } - - wpCookies.setHash( 'wp-settings-' + uid, settings, 31536000, path, '', secure ); - wpCookies.set( 'wp-settings-time-' + uid, userSettings.time, 31536000, path, '', secure ); - - return name; -} - -function deleteUserSetting( name ) { - return setUserSetting( name, '', 1 ); -} - -// Returns all settings as js object. -function getAllUserSettings() { - if ( 'object' !== typeof userSettings ) { - return {}; - } - - return wpCookies.getHash( 'wp-settings-' + userSettings.uid ) || {}; -} diff --git a/wp/wp-includes/js/utils.min.js b/wp/wp-includes/js/utils.min.js deleted file mode 100644 index a8d1a7ef..00000000 --- a/wp/wp-includes/js/utils.min.js +++ /dev/null @@ -1 +0,0 @@ -function getUserSetting(a,b){var c=getAllUserSettings();return c.hasOwnProperty(a)?c[a]:"undefined"!=typeof b?b:""}function setUserSetting(a,b,c){if("object"!=typeof userSettings)return!1;var d=userSettings.uid,e=wpCookies.getHash("wp-settings-"+d),f=userSettings.url,g=!!userSettings.secure;return a=a.toString().replace(/[^A-Za-z0-9_-]/g,""),b="number"==typeof b?parseInt(b,10):b.toString().replace(/[^A-Za-z0-9_-]/g,""),e=e||{},c?delete e[a]:e[a]=b,wpCookies.setHash("wp-settings-"+d,e,31536e3,f,"",g),wpCookies.set("wp-settings-time-"+d,userSettings.time,31536e3,f,"",g),a}function deleteUserSetting(a){return setUserSetting(a,"",1)}function getAllUserSettings(){return"object"!=typeof userSettings?{}:wpCookies.getHash("wp-settings-"+userSettings.uid)||{}}var wpCookies={each:function(a,b,c){var d,e;if(!a)return 0;if(c=c||a,"undefined"!=typeof a.length){for(d=0,e=a.length;d' ).html( message ).text(); - - if ( $containerAssertive && 'assertive' === ariaLive ) { - $containerAssertive.text( message ); - } else if ( $containerPolite ) { - $containerPolite.text( message ); - } - } - - /** - * Build the live regions markup. - * - * @since 4.3.0 - * - * @param {String} ariaLive Optional. Value for the 'aria-live' attribute, default 'polite'. - * - * @return {Object} $container The ARIA live region jQuery object. - */ - function addContainer( ariaLive ) { - ariaLive = ariaLive || 'polite'; - - var $container = $( '

      ', { - 'id': 'wp-a11y-speak-' + ariaLive, - 'aria-live': ariaLive, - 'aria-relevant': 'additions text', - 'aria-atomic': 'true', - 'class': 'screen-reader-text wp-a11y-speak-region' - }); - - $( document.body ).append( $container ); - return $container; - } - - /** - * Clear the live regions. - * - * @since 4.3.0 - */ - function clear() { - $( '.wp-a11y-speak-region' ).text( '' ); - } - - /** - * Initialize wp.a11y and define ARIA live notification area. - * - * @since 4.2.0 - * @since 4.3.0 Added the assertive live region. - */ - $( document ).ready( function() { - $containerPolite = $( '#wp-a11y-speak-polite' ); - $containerAssertive = $( '#wp-a11y-speak-assertive' ); - - if ( ! $containerPolite.length ) { - $containerPolite = addContainer( 'polite' ); - } - - if ( ! $containerAssertive.length ) { - $containerAssertive = addContainer( 'assertive' ); - } - }); - - wp.a11y = wp.a11y || {}; - wp.a11y.speak = speak; - -}( window.wp, window.jQuery )); diff --git a/wp/wp-includes/js/wp-a11y.min.js b/wp/wp-includes/js/wp-a11y.min.js deleted file mode 100644 index c0c8929f..00000000 --- a/wp/wp-includes/js/wp-a11y.min.js +++ /dev/null @@ -1 +0,0 @@ -window.wp=window.wp||{},function(a,b){"use strict";function c(a,c){e(),a=b("

      ").html(a).text(),g&&"assertive"===c?g.text(a):f&&f.text(a)}function d(a){a=a||"polite";var c=b("

      ",{id:"wp-a11y-speak-"+a,"aria-live":a,"aria-relevant":"additions text","aria-atomic":"true","class":"screen-reader-text wp-a11y-speak-region"});return b(document.body).append(c),c}function e(){b(".wp-a11y-speak-region").text("")}var f,g;b(document).ready(function(){f=b("#wp-a11y-speak-polite"),g=b("#wp-a11y-speak-assertive"),f.length||(f=d("polite")),g.length||(g=d("assertive"))}),a.a11y=a.a11y||{},a.a11y.speak=c}(window.wp,window.jQuery); \ No newline at end of file diff --git a/wp/wp-includes/js/wp-ajax-response.js b/wp/wp-includes/js/wp-ajax-response.js deleted file mode 100644 index 50c66525..00000000 --- a/wp/wp-includes/js/wp-ajax-response.js +++ /dev/null @@ -1,64 +0,0 @@ -var wpAjax = jQuery.extend( { - unserialize: function( s ) { - var r = {}, q, pp, i, p; - if ( !s ) { return r; } - q = s.split('?'); if ( q[1] ) { s = q[1]; } - pp = s.split('&'); - for ( i in pp ) { - if ( jQuery.isFunction(pp.hasOwnProperty) && !pp.hasOwnProperty(i) ) { continue; } - p = pp[i].split('='); - r[p[0]] = p[1]; - } - return r; - }, - parseAjaxResponse: function( x, r, e ) { // 1 = good, 0 = strange (bad data?), -1 = you lack permission - var parsed = {}, re = jQuery('#' + r).empty(), err = ''; - - if ( x && typeof x == 'object' && x.getElementsByTagName('wp_ajax') ) { - parsed.responses = []; - parsed.errors = false; - jQuery('response', x).each( function() { - var th = jQuery(this), child = jQuery(this.firstChild), response; - response = { action: th.attr('action'), what: child.get(0).nodeName, id: child.attr('id'), oldId: child.attr('old_id'), position: child.attr('position') }; - response.data = jQuery( 'response_data', child ).text(); - response.supplemental = {}; - if ( !jQuery( 'supplemental', child ).children().each( function() { - response.supplemental[this.nodeName] = jQuery(this).text(); - } ).length ) { response.supplemental = false; } - response.errors = []; - if ( !jQuery('wp_error', child).each( function() { - var code = jQuery(this).attr('code'), anError, errorData, formField; - anError = { code: code, message: this.firstChild.nodeValue, data: false }; - errorData = jQuery('wp_error_data[code="' + code + '"]', x); - if ( errorData ) { anError.data = errorData.get(); } - formField = jQuery( 'form-field', errorData ).text(); - if ( formField ) { code = formField; } - if ( e ) { wpAjax.invalidateForm( jQuery('#' + e + ' :input[name="' + code + '"]' ).parents('.form-field:first') ); } - err += '

      ' + anError.message + '

      '; - response.errors.push( anError ); - parsed.errors = true; - } ).length ) { response.errors = false; } - parsed.responses.push( response ); - } ); - if ( err.length ) { re.html( '
      ' + err + '
      ' ); } - return parsed; - } - if ( isNaN(x) ) { return !re.html('

      ' + x + '

      '); } - x = parseInt(x,10); - if ( -1 == x ) { return !re.html('

      ' + wpAjax.noPerm + '

      '); } - else if ( 0 === x ) { return !re.html('

      ' + wpAjax.broken + '

      '); } - return true; - }, - invalidateForm: function ( selector ) { - return jQuery( selector ).addClass( 'form-invalid' ).find('input').one( 'change wp-check-valid-field', function() { jQuery(this).closest('.form-invalid').removeClass( 'form-invalid' ); } ); - }, - validateForm: function( selector ) { - selector = jQuery( selector ); - return !wpAjax.invalidateForm( selector.find('.form-required').filter( function() { return jQuery('input:visible', this).val() === ''; } ) ).length; - } -}, wpAjax || { noPerm: 'Sorry, you are not allowed to do that.', broken: 'An unidentified error has occurred.' } ); - -// Basic form validation -jQuery(document).ready( function($){ - $('form.validate').submit( function() { return wpAjax.validateForm( $(this) ); } ); -}); diff --git a/wp/wp-includes/js/wp-ajax-response.min.js b/wp/wp-includes/js/wp-ajax-response.min.js deleted file mode 100644 index 5f1ed664..00000000 --- a/wp/wp-includes/js/wp-ajax-response.min.js +++ /dev/null @@ -1 +0,0 @@ -var wpAjax=jQuery.extend({unserialize:function(a){var b,c,d,e,f={};if(!a)return f;b=a.split("?"),b[1]&&(a=b[1]),c=a.split("&");for(d in c)jQuery.isFunction(c.hasOwnProperty)&&!c.hasOwnProperty(d)||(e=c[d].split("="),f[e[0]]=e[1]);return f},parseAjaxResponse:function(a,b,c){var d={},e=jQuery("#"+b).empty(),f="";return a&&"object"==typeof a&&a.getElementsByTagName("wp_ajax")?(d.responses=[],d.errors=!1,jQuery("response",a).each(function(){var b,e=jQuery(this),g=jQuery(this.firstChild);b={action:e.attr("action"),what:g.get(0).nodeName,id:g.attr("id"),oldId:g.attr("old_id"),position:g.attr("position")},b.data=jQuery("response_data",g).text(),b.supplemental={},jQuery("supplemental",g).children().each(function(){b.supplemental[this.nodeName]=jQuery(this).text()}).length||(b.supplemental=!1),b.errors=[],jQuery("wp_error",g).each(function(){var e,g,h,i=jQuery(this).attr("code");e={code:i,message:this.firstChild.nodeValue,data:!1},g=jQuery('wp_error_data[code="'+i+'"]',a),g&&(e.data=g.get()),h=jQuery("form-field",g).text(),h&&(i=h),c&&wpAjax.invalidateForm(jQuery("#"+c+' :input[name="'+i+'"]').parents(".form-field:first")),f+="

      "+e.message+"

      ",b.errors.push(e),d.errors=!0}).length||(b.errors=!1),d.responses.push(b)}),f.length&&e.html('
      '+f+"
      "),d):isNaN(a)?!e.html('

      '+a+"

      "):(a=parseInt(a,10),-1==a?!e.html('

      '+wpAjax.noPerm+"

      "):0!==a||!e.html('

      '+wpAjax.broken+"

      "))},invalidateForm:function(a){return jQuery(a).addClass("form-invalid").find("input").one("change wp-check-valid-field",function(){jQuery(this).closest(".form-invalid").removeClass("form-invalid")})},validateForm:function(a){return a=jQuery(a),!wpAjax.invalidateForm(a.find(".form-required").filter(function(){return""===jQuery("input:visible",this).val()})).length}},wpAjax||{noPerm:"Sorry, you are not allowed to do that.",broken:"An unidentified error has occurred."});jQuery(document).ready(function(a){a("form.validate").submit(function(){return wpAjax.validateForm(a(this))})}); \ No newline at end of file diff --git a/wp/wp-includes/js/wp-api.js b/wp/wp-includes/js/wp-api.js deleted file mode 100644 index 0ce6bbce..00000000 --- a/wp/wp-includes/js/wp-api.js +++ /dev/null @@ -1,1395 +0,0 @@ -(function( window, undefined ) { - - 'use strict'; - - /** - * Initialise the WP_API. - */ - function WP_API() { - this.models = {}; - this.collections = {}; - this.views = {}; - } - - window.wp = window.wp || {}; - wp.api = wp.api || new WP_API(); - wp.api.versionString = wp.api.versionString || 'wp/v2/'; - - // Alias _includes to _.contains, ensuring it is available if lodash is used. - if ( ! _.isFunction( _.includes ) && _.isFunction( _.contains ) ) { - _.includes = _.contains; - } - -})( window ); - -(function( window, undefined ) { - - 'use strict'; - - var pad, r; - - window.wp = window.wp || {}; - wp.api = wp.api || {}; - wp.api.utils = wp.api.utils || {}; - - /** - * ECMAScript 5 shim, adapted from MDN. - * @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString - */ - if ( ! Date.prototype.toISOString ) { - pad = function( number ) { - r = String( number ); - if ( 1 === r.length ) { - r = '0' + r; - } - - return r; - }; - - Date.prototype.toISOString = function() { - return this.getUTCFullYear() + - '-' + pad( this.getUTCMonth() + 1 ) + - '-' + pad( this.getUTCDate() ) + - 'T' + pad( this.getUTCHours() ) + - ':' + pad( this.getUTCMinutes() ) + - ':' + pad( this.getUTCSeconds() ) + - '.' + String( ( this.getUTCMilliseconds() / 1000 ).toFixed( 3 ) ).slice( 2, 5 ) + - 'Z'; - }; - } - - /** - * Parse date into ISO8601 format. - * - * @param {Date} date. - */ - wp.api.utils.parseISO8601 = function( date ) { - var timestamp, struct, i, k, - minutesOffset = 0, - numericKeys = [ 1, 4, 5, 6, 7, 10, 11 ]; - - // ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string - // before falling back to any implementation-specific date parsing, so that’s what we do, even if native - // implementations could be faster. - // 1 YYYY 2 MM 3 DD 4 HH 5 mm 6 ss 7 msec 8 Z 9 ± 10 tzHH 11 tzmm - if ( ( struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec( date ) ) ) { - - // Avoid NaN timestamps caused by “undefined” values being passed to Date.UTC. - for ( i = 0; ( k = numericKeys[i] ); ++i ) { - struct[k] = +struct[k] || 0; - } - - // Allow undefined days and months. - struct[2] = ( +struct[2] || 1 ) - 1; - struct[3] = +struct[3] || 1; - - if ( 'Z' !== struct[8] && undefined !== struct[9] ) { - minutesOffset = struct[10] * 60 + struct[11]; - - if ( '+' === struct[9] ) { - minutesOffset = 0 - minutesOffset; - } - } - - timestamp = Date.UTC( struct[1], struct[2], struct[3], struct[4], struct[5] + minutesOffset, struct[6], struct[7] ); - } else { - timestamp = Date.parse ? Date.parse( date ) : NaN; - } - - return timestamp; - }; - - /** - * Helper function for getting the root URL. - * @return {[type]} [description] - */ - wp.api.utils.getRootUrl = function() { - return window.location.origin ? - window.location.origin + '/' : - window.location.protocol + '/' + window.location.host + '/'; - }; - - /** - * Helper for capitalizing strings. - */ - wp.api.utils.capitalize = function( str ) { - if ( _.isUndefined( str ) ) { - return str; - } - return str.charAt( 0 ).toUpperCase() + str.slice( 1 ); - }; - - /** - * Helper function that capitalizes the first word and camel cases any words starting - * after dashes, removing the dashes. - */ - wp.api.utils.capitalizeAndCamelCaseDashes = function( str ) { - if ( _.isUndefined( str ) ) { - return str; - } - str = wp.api.utils.capitalize( str ); - - return wp.api.utils.camelCaseDashes( str ); - }; - - /** - * Helper function to camel case the letter after dashes, removing the dashes. - */ - wp.api.utils.camelCaseDashes = function( str ) { - return str.replace( /-([a-z])/g, function( g ) { - return g[ 1 ].toUpperCase(); - } ); - }; - - /** - * Extract a route part based on negative index. - * - * @param {string} route The endpoint route. - * @param {int} part The number of parts from the end of the route to retrieve. Default 1. - * Example route `/a/b/c`: part 1 is `c`, part 2 is `b`, part 3 is `a`. - * @param {string} [versionString] Version string, defaults to `wp.api.versionString`. - * @param {boolean} [reverse] Whether to reverse the order when extracting the route part. Optional, default false. - */ - wp.api.utils.extractRoutePart = function( route, part, versionString, reverse ) { - var routeParts; - - part = part || 1; - versionString = versionString || wp.api.versionString; - - // Remove versions string from route to avoid returning it. - if ( 0 === route.indexOf( '/' + versionString ) ) { - route = route.substr( versionString.length + 1 ); - } - - routeParts = route.split( '/' ); - if ( reverse ) { - routeParts = routeParts.reverse(); - } - if ( _.isUndefined( routeParts[ --part ] ) ) { - return ''; - } - return routeParts[ part ]; - }; - - /** - * Extract a parent name from a passed route. - * - * @param {string} route The route to extract a name from. - */ - wp.api.utils.extractParentName = function( route ) { - var name, - lastSlash = route.lastIndexOf( '_id>[\\d]+)/' ); - - if ( lastSlash < 0 ) { - return ''; - } - name = route.substr( 0, lastSlash - 1 ); - name = name.split( '/' ); - name.pop(); - name = name.pop(); - return name; - }; - - /** - * Add args and options to a model prototype from a route's endpoints. - * - * @param {array} routeEndpoints Array of route endpoints. - * @param {Object} modelInstance An instance of the model (or collection) - * to add the args to. - */ - wp.api.utils.decorateFromRoute = function( routeEndpoints, modelInstance ) { - - /** - * Build the args based on route endpoint data. - */ - _.each( routeEndpoints, function( routeEndpoint ) { - - // Add post and edit endpoints as model args. - if ( _.includes( routeEndpoint.methods, 'POST' ) || _.includes( routeEndpoint.methods, 'PUT' ) ) { - - // Add any non empty args, merging them into the args object. - if ( ! _.isEmpty( routeEndpoint.args ) ) { - - // Set as default if no args yet. - if ( _.isEmpty( modelInstance.prototype.args ) ) { - modelInstance.prototype.args = routeEndpoint.args; - } else { - - // We already have args, merge these new args in. - modelInstance.prototype.args = _.extend( modelInstance.prototype.args, routeEndpoint.args ); - } - } - } else { - - // Add GET method as model options. - if ( _.includes( routeEndpoint.methods, 'GET' ) ) { - - // Add any non empty args, merging them into the defaults object. - if ( ! _.isEmpty( routeEndpoint.args ) ) { - - // Set as default if no defaults yet. - if ( _.isEmpty( modelInstance.prototype.options ) ) { - modelInstance.prototype.options = routeEndpoint.args; - } else { - - // We already have options, merge these new args in. - modelInstance.prototype.options = _.extend( modelInstance.prototype.options, routeEndpoint.args ); - } - } - - } - } - - } ); - - }; - - /** - * Add mixins and helpers to models depending on their defaults. - * - * @param {Backbone Model} model The model to attach helpers and mixins to. - * @param {string} modelClassName The classname of the constructed model. - * @param {Object} loadingObjects An object containing the models and collections we are building. - */ - wp.api.utils.addMixinsAndHelpers = function( model, modelClassName, loadingObjects ) { - - var hasDate = false, - - /** - * Array of parseable dates. - * - * @type {string[]}. - */ - parseableDates = [ 'date', 'modified', 'date_gmt', 'modified_gmt' ], - - /** - * Mixin for all content that is time stamped. - * - * This mixin converts between mysql timestamps and JavaScript Dates when syncing a model - * to or from the server. For example, a date stored as `2015-12-27T21:22:24` on the server - * gets expanded to `Sun Dec 27 2015 14:22:24 GMT-0700 (MST)` when the model is fetched. - * - * @type {{toJSON: toJSON, parse: parse}}. - */ - TimeStampedMixin = { - - /** - * Prepare a JavaScript Date for transmitting to the server. - * - * This helper function accepts a field and Date object. It converts the passed Date - * to an ISO string and sets that on the model field. - * - * @param {Date} date A JavaScript date object. WordPress expects dates in UTC. - * @param {string} field The date field to set. One of 'date', 'date_gmt', 'date_modified' - * or 'date_modified_gmt'. Optional, defaults to 'date'. - */ - setDate: function( date, field ) { - var theField = field || 'date'; - - // Don't alter non parsable date fields. - if ( _.indexOf( parseableDates, theField ) < 0 ) { - return false; - } - - this.set( theField, date.toISOString() ); - }, - - /** - * Get a JavaScript Date from the passed field. - * - * WordPress returns 'date' and 'date_modified' in the timezone of the server as well as - * UTC dates as 'date_gmt' and 'date_modified_gmt'. Draft posts do not include UTC dates. - * - * @param {string} field The date field to set. One of 'date', 'date_gmt', 'date_modified' - * or 'date_modified_gmt'. Optional, defaults to 'date'. - */ - getDate: function( field ) { - var theField = field || 'date', - theISODate = this.get( theField ); - - // Only get date fields and non null values. - if ( _.indexOf( parseableDates, theField ) < 0 || _.isNull( theISODate ) ) { - return false; - } - - return new Date( wp.api.utils.parseISO8601( theISODate ) ); - } - }, - - /** - * Build a helper function to retrieve related model. - * - * @param {string} parentModel The parent model. - * @param {int} modelId The model ID if the object to request - * @param {string} modelName The model name to use when constructing the model. - * @param {string} embedSourcePoint Where to check the embedds object for _embed data. - * @param {string} embedCheckField Which model field to check to see if the model has data. - * - * @return {Deferred.promise} A promise which resolves to the constructed model. - */ - buildModelGetter = function( parentModel, modelId, modelName, embedSourcePoint, embedCheckField ) { - var getModel, embeddeds, attributes, deferred; - - deferred = jQuery.Deferred(); - embeddeds = parentModel.get( '_embedded' ) || {}; - - // Verify that we have a valid object id. - if ( ! _.isNumber( modelId ) || 0 === modelId ) { - deferred.reject(); - return deferred; - } - - // If we have embedded object data, use that when constructing the getModel. - if ( embeddeds[ embedSourcePoint ] ) { - attributes = _.findWhere( embeddeds[ embedSourcePoint ], { id: modelId } ); - } - - // Otherwise use the modelId. - if ( ! attributes ) { - attributes = { id: modelId }; - } - - // Create the new getModel model. - getModel = new wp.api.models[ modelName ]( attributes ); - - if ( ! getModel.get( embedCheckField ) ) { - getModel.fetch( { - success: function( getModel ) { - deferred.resolve( getModel ); - }, - error: function( getModel, response ) { - deferred.reject( response ); - } - } ); - } else { - // Resolve with the embedded model. - deferred.resolve( getModel ); - } - - // Return a promise. - return deferred.promise(); - }, - - /** - * Build a helper to retrieve a collection. - * - * @param {string} parentModel The parent model. - * @param {string} collectionName The name to use when constructing the collection. - * @param {string} embedSourcePoint Where to check the embedds object for _embed data. - * @param {string} embedIndex An addiitonal optional index for the _embed data. - * - * @return {Deferred.promise} A promise which resolves to the constructed collection. - */ - buildCollectionGetter = function( parentModel, collectionName, embedSourcePoint, embedIndex ) { - /** - * Returns a promise that resolves to the requested collection - * - * Uses the embedded data if available, otherwises fetches the - * data from the server. - * - * @return {Deferred.promise} promise Resolves to a wp.api.collections[ collectionName ] - * collection. - */ - var postId, embeddeds, getObjects, - classProperties = '', - properties = '', - deferred = jQuery.Deferred(); - - postId = parentModel.get( 'id' ); - embeddeds = parentModel.get( '_embedded' ) || {}; - - // Verify that we have a valid post id. - if ( ! _.isNumber( postId ) || 0 === postId ) { - deferred.reject(); - return deferred; - } - - // If we have embedded getObjects data, use that when constructing the getObjects. - if ( ! _.isUndefined( embedSourcePoint ) && ! _.isUndefined( embeddeds[ embedSourcePoint ] ) ) { - - // Some embeds also include an index offset, check for that. - if ( _.isUndefined( embedIndex ) ) { - - // Use the embed source point directly. - properties = embeddeds[ embedSourcePoint ]; - } else { - - // Add the index to the embed source point. - properties = embeddeds[ embedSourcePoint ][ embedIndex ]; - } - } else { - - // Otherwise use the postId. - classProperties = { parent: postId }; - } - - // Create the new getObjects collection. - getObjects = new wp.api.collections[ collectionName ]( properties, classProperties ); - - // If we didn’t have embedded getObjects, fetch the getObjects data. - if ( _.isUndefined( getObjects.models[0] ) ) { - getObjects.fetch( { - success: function( getObjects ) { - - // Add a helper 'parent_post' attribute onto the model. - setHelperParentPost( getObjects, postId ); - deferred.resolve( getObjects ); - }, - error: function( getModel, response ) { - deferred.reject( response ); - } - } ); - } else { - - // Add a helper 'parent_post' attribute onto the model. - setHelperParentPost( getObjects, postId ); - deferred.resolve( getObjects ); - } - - // Return a promise. - return deferred.promise(); - - }, - - /** - * Set the model post parent. - */ - setHelperParentPost = function( collection, postId ) { - - // Attach post_parent id to the collection. - _.each( collection.models, function( model ) { - model.set( 'parent_post', postId ); - } ); - }, - - /** - * Add a helper function to handle post Meta. - */ - MetaMixin = { - getMeta: function() { - return buildCollectionGetter( this, 'PostMeta', 'https://api.w.org/meta' ); - } - }, - - /** - * Add a helper function to handle post Revisions. - */ - RevisionsMixin = { - getRevisions: function() { - return buildCollectionGetter( this, 'PostRevisions' ); - } - }, - - /** - * Add a helper function to handle post Tags. - */ - TagsMixin = { - - /** - * Get the tags for a post. - * - * @return {Deferred.promise} promise Resolves to an array of tags. - */ - getTags: function() { - var tagIds = this.get( 'tags' ), - tags = new wp.api.collections.Tags(); - - // Resolve with an empty array if no tags. - if ( _.isEmpty( tagIds ) ) { - return jQuery.Deferred().resolve( [] ); - } - - return tags.fetch( { data: { include: tagIds } } ); - }, - - /** - * Set the tags for a post. - * - * Accepts an array of tag slugs, or a Tags collection. - * - * @param {array|Backbone.Collection} tags The tags to set on the post. - * - */ - setTags: function( tags ) { - var allTags, newTag, - self = this, - newTags = []; - - if ( _.isString( tags ) ) { - return false; - } - - // If this is an array of slugs, build a collection. - if ( _.isArray( tags ) ) { - - // Get all the tags. - allTags = new wp.api.collections.Tags(); - allTags.fetch( { - data: { per_page: 100 }, - success: function( alltags ) { - - // Find the passed tags and set them up. - _.each( tags, function( tag ) { - newTag = new wp.api.models.Tag( alltags.findWhere( { slug: tag } ) ); - - // Tie the new tag to the post. - newTag.set( 'parent_post', self.get( 'id' ) ); - - // Add the new tag to the collection. - newTags.push( newTag ); - } ); - tags = new wp.api.collections.Tags( newTags ); - self.setTagsWithCollection( tags ); - } - } ); - - } else { - this.setTagsWithCollection( tags ); - } - }, - - /** - * Set the tags for a post. - * - * Accepts a Tags collection. - * - * @param {array|Backbone.Collection} tags The tags to set on the post. - * - */ - setTagsWithCollection: function( tags ) { - - // Pluck out the category ids. - this.set( 'tags', tags.pluck( 'id' ) ); - return this.save(); - } - }, - - /** - * Add a helper function to handle post Categories. - */ - CategoriesMixin = { - - /** - * Get a the categories for a post. - * - * @return {Deferred.promise} promise Resolves to an array of categories. - */ - getCategories: function() { - var categoryIds = this.get( 'categories' ), - categories = new wp.api.collections.Categories(); - - // Resolve with an empty array if no categories. - if ( _.isEmpty( categoryIds ) ) { - return jQuery.Deferred().resolve( [] ); - } - - return categories.fetch( { data: { include: categoryIds } } ); - }, - - /** - * Set the categories for a post. - * - * Accepts an array of category slugs, or a Categories collection. - * - * @param {array|Backbone.Collection} categories The categories to set on the post. - * - */ - setCategories: function( categories ) { - var allCategories, newCategory, - self = this, - newCategories = []; - - if ( _.isString( categories ) ) { - return false; - } - - // If this is an array of slugs, build a collection. - if ( _.isArray( categories ) ) { - - // Get all the categories. - allCategories = new wp.api.collections.Categories(); - allCategories.fetch( { - data: { per_page: 100 }, - success: function( allcats ) { - - // Find the passed categories and set them up. - _.each( categories, function( category ) { - newCategory = new wp.api.models.Category( allcats.findWhere( { slug: category } ) ); - - // Tie the new category to the post. - newCategory.set( 'parent_post', self.get( 'id' ) ); - - // Add the new category to the collection. - newCategories.push( newCategory ); - } ); - categories = new wp.api.collections.Categories( newCategories ); - self.setCategoriesWithCollection( categories ); - } - } ); - - } else { - this.setCategoriesWithCollection( categories ); - } - - }, - - /** - * Set the categories for a post. - * - * Accepts Categories collection. - * - * @param {array|Backbone.Collection} categories The categories to set on the post. - * - */ - setCategoriesWithCollection: function( categories ) { - - // Pluck out the category ids. - this.set( 'categories', categories.pluck( 'id' ) ); - return this.save(); - } - }, - - /** - * Add a helper function to retrieve the author user model. - */ - AuthorMixin = { - getAuthorUser: function() { - return buildModelGetter( this, this.get( 'author' ), 'User', 'author', 'name' ); - } - }, - - /** - * Add a helper function to retrieve the featured media. - */ - FeaturedMediaMixin = { - getFeaturedMedia: function() { - return buildModelGetter( this, this.get( 'featured_media' ), 'Media', 'wp:featuredmedia', 'source_url' ); - } - }; - - // Exit if we don't have valid model defaults. - if ( _.isUndefined( model.prototype.args ) ) { - return model; - } - - // Go thru the parsable date fields, if our model contains any of them it gets the TimeStampedMixin. - _.each( parseableDates, function( theDateKey ) { - if ( ! _.isUndefined( model.prototype.args[ theDateKey ] ) ) { - hasDate = true; - } - } ); - - // Add the TimeStampedMixin for models that contain a date field. - if ( hasDate ) { - model = model.extend( TimeStampedMixin ); - } - - // Add the AuthorMixin for models that contain an author. - if ( ! _.isUndefined( model.prototype.args.author ) ) { - model = model.extend( AuthorMixin ); - } - - // Add the FeaturedMediaMixin for models that contain a featured_media. - if ( ! _.isUndefined( model.prototype.args.featured_media ) ) { - model = model.extend( FeaturedMediaMixin ); - } - - // Add the CategoriesMixin for models that support categories collections. - if ( ! _.isUndefined( model.prototype.args.categories ) ) { - model = model.extend( CategoriesMixin ); - } - - // Add the MetaMixin for models that support meta collections. - if ( ! _.isUndefined( loadingObjects.collections[ modelClassName + 'Meta' ] ) ) { - model = model.extend( MetaMixin ); - } - - // Add the TagsMixin for models that support tags collections. - if ( ! _.isUndefined( model.prototype.args.tags ) ) { - model = model.extend( TagsMixin ); - } - - // Add the RevisionsMixin for models that support revisions collections. - if ( ! _.isUndefined( loadingObjects.collections[ modelClassName + 'Revisions' ] ) ) { - model = model.extend( RevisionsMixin ); - } - - return model; - }; - -})( window ); - -/* global wpApiSettings:false */ - -// Suppress warning about parse function's unused "options" argument: -/* jshint unused:false */ -(function() { - - 'use strict'; - - var wpApiSettings = window.wpApiSettings || {}; - - /** - * Backbone base model for all models. - */ - wp.api.WPApiBaseModel = Backbone.Model.extend( - /** @lends WPApiBaseModel.prototype */ - { - /** - * Set nonce header before every Backbone sync. - * - * @param {string} method. - * @param {Backbone.Model} model. - * @param {{beforeSend}, *} options. - * @returns {*}. - */ - sync: function( method, model, options ) { - var beforeSend; - - options = options || {}; - - // Remove date_gmt if null. - if ( _.isNull( model.get( 'date_gmt' ) ) ) { - model.unset( 'date_gmt' ); - } - - // Remove slug if empty. - if ( _.isEmpty( model.get( 'slug' ) ) ) { - model.unset( 'slug' ); - } - - if ( ! _.isUndefined( wpApiSettings.nonce ) && ! _.isNull( wpApiSettings.nonce ) ) { - beforeSend = options.beforeSend; - - // @todo enable option for jsonp endpoints - // options.dataType = 'jsonp'; - - options.beforeSend = function( xhr ) { - xhr.setRequestHeader( 'X-WP-Nonce', wpApiSettings.nonce ); - - if ( beforeSend ) { - return beforeSend.apply( this, arguments ); - } - }; - } - - // Add '?force=true' to use delete method when required. - if ( this.requireForceForDelete && 'delete' === method ) { - model.url = model.url() + '?force=true'; - } - return Backbone.sync( method, model, options ); - }, - - /** - * Save is only allowed when the PUT OR POST methods are available for the endpoint. - */ - save: function( attrs, options ) { - - // Do we have the put method, then execute the save. - if ( _.includes( this.methods, 'PUT' ) || _.includes( this.methods, 'POST' ) ) { - - // Proxy the call to the original save function. - return Backbone.Model.prototype.save.call( this, attrs, options ); - } else { - - // Otherwise bail, disallowing action. - return false; - } - }, - - /** - * Delete is only allowed when the DELETE method is available for the endpoint. - */ - destroy: function( options ) { - - // Do we have the DELETE method, then execute the destroy. - if ( _.includes( this.methods, 'DELETE' ) ) { - - // Proxy the call to the original save function. - return Backbone.Model.prototype.destroy.call( this, options ); - } else { - - // Otherwise bail, disallowing action. - return false; - } - } - - } - ); - - /** - * API Schema model. Contains meta information about the API. - */ - wp.api.models.Schema = wp.api.WPApiBaseModel.extend( - /** @lends Schema.prototype */ - { - defaults: { - _links: {}, - namespace: null, - routes: {} - }, - - initialize: function( attributes, options ) { - var model = this; - options = options || {}; - - wp.api.WPApiBaseModel.prototype.initialize.call( model, attributes, options ); - - model.apiRoot = options.apiRoot || wpApiSettings.root; - model.versionString = options.versionString || wpApiSettings.versionString; - }, - - url: function() { - return this.apiRoot + this.versionString; - } - } - ); -})(); - -( function() { - - 'use strict'; - - var wpApiSettings = window.wpApiSettings || {}; - - /** - * Contains basic collection functionality such as pagination. - */ - wp.api.WPApiBaseCollection = Backbone.Collection.extend( - /** @lends BaseCollection.prototype */ - { - - /** - * Setup default state. - */ - initialize: function( models, options ) { - this.state = { - data: {}, - currentPage: null, - totalPages: null, - totalObjects: null - }; - if ( _.isUndefined( options ) ) { - this.parent = ''; - } else { - this.parent = options.parent; - } - }, - - /** - * Extend Backbone.Collection.sync to add nince and pagination support. - * - * Set nonce header before every Backbone sync. - * - * @param {string} method. - * @param {Backbone.Model} model. - * @param {{success}, *} options. - * @returns {*}. - */ - sync: function( method, model, options ) { - var beforeSend, success, - self = this; - - options = options || {}; - beforeSend = options.beforeSend; - - // If we have a localized nonce, pass that along with each sync. - if ( 'undefined' !== typeof wpApiSettings.nonce ) { - options.beforeSend = function( xhr ) { - xhr.setRequestHeader( 'X-WP-Nonce', wpApiSettings.nonce ); - - if ( beforeSend ) { - return beforeSend.apply( self, arguments ); - } - }; - } - - // When reading, add pagination data. - if ( 'read' === method ) { - if ( options.data ) { - self.state.data = _.clone( options.data ); - - delete self.state.data.page; - } else { - self.state.data = options.data = {}; - } - - if ( 'undefined' === typeof options.data.page ) { - self.state.currentPage = null; - self.state.totalPages = null; - self.state.totalObjects = null; - } else { - self.state.currentPage = options.data.page - 1; - } - - success = options.success; - options.success = function( data, textStatus, request ) { - if ( ! _.isUndefined( request ) ) { - self.state.totalPages = parseInt( request.getResponseHeader( 'x-wp-totalpages' ), 10 ); - self.state.totalObjects = parseInt( request.getResponseHeader( 'x-wp-total' ), 10 ); - } - - if ( null === self.state.currentPage ) { - self.state.currentPage = 1; - } else { - self.state.currentPage++; - } - - if ( success ) { - return success.apply( this, arguments ); - } - }; - } - - // Continue by calling Bacckbone's sync. - return Backbone.sync( method, model, options ); - }, - - /** - * Fetches the next page of objects if a new page exists. - * - * @param {data: {page}} options. - * @returns {*}. - */ - more: function( options ) { - options = options || {}; - options.data = options.data || {}; - - _.extend( options.data, this.state.data ); - - if ( 'undefined' === typeof options.data.page ) { - if ( ! this.hasMore() ) { - return false; - } - - if ( null === this.state.currentPage || this.state.currentPage <= 1 ) { - options.data.page = 2; - } else { - options.data.page = this.state.currentPage + 1; - } - } - - return this.fetch( options ); - }, - - /** - * Returns true if there are more pages of objects available. - * - * @returns null|boolean. - */ - hasMore: function() { - if ( null === this.state.totalPages || - null === this.state.totalObjects || - null === this.state.currentPage ) { - return null; - } else { - return ( this.state.currentPage < this.state.totalPages ); - } - } - } - ); - -} )(); - -( function() { - - 'use strict'; - - var Endpoint, initializedDeferreds = {}, - wpApiSettings = window.wpApiSettings || {}; - window.wp = window.wp || {}; - wp.api = wp.api || {}; - - // If wpApiSettings is unavailable, try the default. - if ( _.isEmpty( wpApiSettings ) ) { - wpApiSettings.root = window.location.origin + '/wp-json/'; - } - - Endpoint = Backbone.Model.extend( { - defaults: { - apiRoot: wpApiSettings.root, - versionString: wp.api.versionString, - schema: null, - models: {}, - collections: {} - }, - - /** - * Initialize the Endpoint model. - */ - initialize: function() { - var model = this, deferred; - - Backbone.Model.prototype.initialize.apply( model, arguments ); - - deferred = jQuery.Deferred(); - model.schemaConstructed = deferred.promise(); - - model.schemaModel = new wp.api.models.Schema( null, { - apiRoot: model.get( 'apiRoot' ), - versionString: model.get( 'versionString' ) - } ); - - // When the model loads, resolve the promise. - model.schemaModel.once( 'change', function() { - model.constructFromSchema(); - deferred.resolve( model ); - } ); - - if ( model.get( 'schema' ) ) { - - // Use schema supplied as model attribute. - model.schemaModel.set( model.schemaModel.parse( model.get( 'schema' ) ) ); - } else if ( - ! _.isUndefined( sessionStorage ) && - ( _.isUndefined( wpApiSettings.cacheSchema ) || wpApiSettings.cacheSchema ) && - sessionStorage.getItem( 'wp-api-schema-model' + model.get( 'apiRoot' ) + model.get( 'versionString' ) ) - ) { - - // Used a cached copy of the schema model if available. - model.schemaModel.set( model.schemaModel.parse( JSON.parse( sessionStorage.getItem( 'wp-api-schema-model' + model.get( 'apiRoot' ) + model.get( 'versionString' ) ) ) ) ); - } else { - model.schemaModel.fetch( { - /** - * When the server returns the schema model data, store the data in a sessionCache so we don't - * have to retrieve it again for this session. Then, construct the models and collections based - * on the schema model data. - */ - success: function( newSchemaModel ) { - - // Store a copy of the schema model in the session cache if available. - if ( ! _.isUndefined( sessionStorage ) && ( _.isUndefined( wpApiSettings.cacheSchema ) || wpApiSettings.cacheSchema ) ) { - try { - sessionStorage.setItem( 'wp-api-schema-model' + model.get( 'apiRoot' ) + model.get( 'versionString' ), JSON.stringify( newSchemaModel ) ); - } catch ( error ) { - - // Fail silently, fixes errors in safari private mode. - } - } - }, - - // Log the error condition. - error: function( err ) { - window.console.log( err ); - } - } ); - } - }, - - constructFromSchema: function() { - var routeModel = this, modelRoutes, collectionRoutes, schemaRoot, loadingObjects, - - /** - * Set up the model and collection name mapping options. As the schema is built, the - * model and collection names will be adjusted if they are found in the mapping object. - * - * Localizing a variable wpApiSettings.mapping will over-ride the default mapping options. - * - */ - mapping = wpApiSettings.mapping || { - models: { - 'Categories': 'Category', - 'Comments': 'Comment', - 'Pages': 'Page', - 'PagesMeta': 'PageMeta', - 'PagesRevisions': 'PageRevision', - 'Posts': 'Post', - 'PostsCategories': 'PostCategory', - 'PostsRevisions': 'PostRevision', - 'PostsTags': 'PostTag', - 'Schema': 'Schema', - 'Statuses': 'Status', - 'Tags': 'Tag', - 'Taxonomies': 'Taxonomy', - 'Types': 'Type', - 'Users': 'User' - }, - collections: { - 'PagesMeta': 'PageMeta', - 'PagesRevisions': 'PageRevisions', - 'PostsCategories': 'PostCategories', - 'PostsMeta': 'PostMeta', - 'PostsRevisions': 'PostRevisions', - 'PostsTags': 'PostTags' - } - }; - - /** - * Iterate thru the routes, picking up models and collections to build. Builds two arrays, - * one for models and one for collections. - */ - modelRoutes = []; - collectionRoutes = []; - schemaRoot = routeModel.get( 'apiRoot' ).replace( wp.api.utils.getRootUrl(), '' ); - loadingObjects = {}; - - /** - * Tracking objects for models and collections. - */ - loadingObjects.models = routeModel.get( 'models' ); - loadingObjects.collections = routeModel.get( 'collections' ); - - _.each( routeModel.schemaModel.get( 'routes' ), function( route, index ) { - - // Skip the schema root if included in the schema. - if ( index !== routeModel.get( ' versionString' ) && - index !== schemaRoot && - index !== ( '/' + routeModel.get( 'versionString' ).slice( 0, -1 ) ) - ) { - - // Single items end with a regex (or the special case 'me'). - if ( /(?:.*[+)]|\/me)$/.test( index ) ) { - modelRoutes.push( { index: index, route: route } ); - } else { - - // Collections end in a name. - collectionRoutes.push( { index: index, route: route } ); - } - } - } ); - - /** - * Construct the models. - * - * Base the class name on the route endpoint. - */ - _.each( modelRoutes, function( modelRoute ) { - - // Extract the name and any parent from the route. - var modelClassName, - routeName = wp.api.utils.extractRoutePart( modelRoute.index, 2, routeModel.get( 'versionString' ), true ), - parentName = wp.api.utils.extractRoutePart( modelRoute.index, 1, routeModel.get( 'versionString' ), false ), - routeEnd = wp.api.utils.extractRoutePart( modelRoute.index, 1, routeModel.get( 'versionString' ), true ); - - // Clear the parent part of the rouite if its actually the version string. - if ( parentName === routeModel.get( 'versionString' ) ) { - parentName = ''; - } - - // Handle the special case of the 'me' route. - if ( 'me' === routeEnd ) { - routeName = 'me'; - } - - // If the model has a parent in its route, add that to its class name. - if ( '' !== parentName && parentName !== routeName ) { - modelClassName = wp.api.utils.capitalizeAndCamelCaseDashes( parentName ) + wp.api.utils.capitalizeAndCamelCaseDashes( routeName ); - modelClassName = mapping.models[ modelClassName ] || modelClassName; - loadingObjects.models[ modelClassName ] = wp.api.WPApiBaseModel.extend( { - - // Return a constructed url based on the parent and id. - url: function() { - var url = - routeModel.get( 'apiRoot' ) + - routeModel.get( 'versionString' ) + - parentName + '/' + - ( ( _.isUndefined( this.get( 'parent' ) ) || 0 === this.get( 'parent' ) ) ? - ( _.isUndefined( this.get( 'parent_post' ) ) ? '' : this.get( 'parent_post' ) + '/' ) : - this.get( 'parent' ) + '/' ) + - routeName; - - if ( ! _.isUndefined( this.get( 'id' ) ) ) { - url += '/' + this.get( 'id' ); - } - return url; - }, - - // Include a reference to the original route object. - route: modelRoute, - - // Include a reference to the original class name. - name: modelClassName, - - // Include the array of route methods for easy reference. - methods: modelRoute.route.methods, - - initialize: function( attributes, options ) { - wp.api.WPApiBaseModel.prototype.initialize.call( this, attributes, options ); - - /** - * Posts and pages support trashing, other types don't support a trash - * and require that you pass ?force=true to actually delete them. - * - * @todo we should be getting trashability from the Schema, not hard coding types here. - */ - if ( - 'Posts' !== this.name && - 'Pages' !== this.name && - _.includes( this.methods, 'DELETE' ) - ) { - this.requireForceForDelete = true; - } - } - } ); - } else { - - // This is a model without a parent in its route - modelClassName = wp.api.utils.capitalizeAndCamelCaseDashes( routeName ); - modelClassName = mapping.models[ modelClassName ] || modelClassName; - loadingObjects.models[ modelClassName ] = wp.api.WPApiBaseModel.extend( { - - // Function that returns a constructed url based on the id. - url: function() { - var url = routeModel.get( 'apiRoot' ) + - routeModel.get( 'versionString' ) + - ( ( 'me' === routeName ) ? 'users/me' : routeName ); - - if ( ! _.isUndefined( this.get( 'id' ) ) ) { - url += '/' + this.get( 'id' ); - } - return url; - }, - - // Include a reference to the original route object. - route: modelRoute, - - // Include a reference to the original class name. - name: modelClassName, - - // Include the array of route methods for easy reference. - methods: modelRoute.route.methods - } ); - } - - // Add defaults to the new model, pulled form the endpoint. - wp.api.utils.decorateFromRoute( - modelRoute.route.endpoints, - loadingObjects.models[ modelClassName ], - routeModel.get( 'versionString' ) - ); - - } ); - - /** - * Construct the collections. - * - * Base the class name on the route endpoint. - */ - _.each( collectionRoutes, function( collectionRoute ) { - - // Extract the name and any parent from the route. - var collectionClassName, modelClassName, - routeName = collectionRoute.index.slice( collectionRoute.index.lastIndexOf( '/' ) + 1 ), - parentName = wp.api.utils.extractRoutePart( collectionRoute.index, 1, routeModel.get( 'versionString' ), false ); - - // If the collection has a parent in its route, add that to its class name. - if ( '' !== parentName && parentName !== routeName && routeModel.get( 'versionString' ) !== parentName ) { - - collectionClassName = wp.api.utils.capitalizeAndCamelCaseDashes( parentName ) + wp.api.utils.capitalizeAndCamelCaseDashes( routeName ); - modelClassName = mapping.models[ collectionClassName ] || collectionClassName; - collectionClassName = mapping.collections[ collectionClassName ] || collectionClassName; - loadingObjects.collections[ collectionClassName ] = wp.api.WPApiBaseCollection.extend( { - - // Function that returns a constructed url passed on the parent. - url: function() { - return routeModel.get( 'apiRoot' ) + routeModel.get( 'versionString' ) + - parentName + '/' + this.parent + '/' + - routeName; - }, - - // Specify the model that this collection contains. - model: function( attrs, options ) { - return new loadingObjects.models[ modelClassName ]( attrs, options ); - }, - - // Include a reference to the original class name. - name: collectionClassName, - - // Include a reference to the original route object. - route: collectionRoute, - - // Include the array of route methods for easy reference. - methods: collectionRoute.route.methods - } ); - } else { - - // This is a collection without a parent in its route. - collectionClassName = wp.api.utils.capitalizeAndCamelCaseDashes( routeName ); - modelClassName = mapping.models[ collectionClassName ] || collectionClassName; - collectionClassName = mapping.collections[ collectionClassName ] || collectionClassName; - loadingObjects.collections[ collectionClassName ] = wp.api.WPApiBaseCollection.extend( { - - // For the url of a root level collection, use a string. - url: routeModel.get( 'apiRoot' ) + routeModel.get( 'versionString' ) + routeName, - - // Specify the model that this collection contains. - model: function( attrs, options ) { - return new loadingObjects.models[ modelClassName ]( attrs, options ); - }, - - // Include a reference to the original class name. - name: collectionClassName, - - // Include a reference to the original route object. - route: collectionRoute, - - // Include the array of route methods for easy reference. - methods: collectionRoute.route.methods - } ); - } - - // Add defaults to the new model, pulled form the endpoint. - wp.api.utils.decorateFromRoute( collectionRoute.route.endpoints, loadingObjects.collections[ collectionClassName ] ); - } ); - - // Add mixins and helpers for each of the models. - _.each( loadingObjects.models, function( model, index ) { - loadingObjects.models[ index ] = wp.api.utils.addMixinsAndHelpers( model, index, loadingObjects ); - } ); - - } - - } ); - - wp.api.endpoints = new Backbone.Collection( { - model: Endpoint - } ); - - /** - * Initialize the wp-api, optionally passing the API root. - * - * @param {object} [args] - * @param {string} [args.apiRoot] The api root. Optional, defaults to wpApiSettings.root. - * @param {string} [args.versionString] The version string. Optional, defaults to wpApiSettings.root. - * @param {object} [args.schema] The schema. Optional, will be fetched from API if not provided. - */ - wp.api.init = function( args ) { - var endpoint, attributes = {}, deferred, promise; - - args = args || {}; - attributes.apiRoot = args.apiRoot || wpApiSettings.root; - attributes.versionString = args.versionString || wpApiSettings.versionString; - attributes.schema = args.schema || null; - if ( ! attributes.schema && attributes.apiRoot === wpApiSettings.root && attributes.versionString === wpApiSettings.versionString ) { - attributes.schema = wpApiSettings.schema; - } - - if ( ! initializedDeferreds[ attributes.apiRoot + attributes.versionString ] ) { - endpoint = wp.api.endpoints.findWhere( { apiRoot: attributes.apiRoot, versionString: attributes.versionString } ); - if ( ! endpoint ) { - endpoint = new Endpoint( attributes ); - wp.api.endpoints.add( endpoint ); - } - deferred = jQuery.Deferred(); - promise = deferred.promise(); - - endpoint.schemaConstructed.done( function( endpoint ) { - - // Map the default endpoints, extending any already present items (including Schema model). - wp.api.models = _.extend( endpoint.get( 'models' ), wp.api.models ); - wp.api.collections = _.extend( endpoint.get( 'collections' ), wp.api.collections ); - deferred.resolveWith( wp.api, [ endpoint ] ); - } ); - initializedDeferreds[ attributes.apiRoot + attributes.versionString ] = promise; - } - return initializedDeferreds[ attributes.apiRoot + attributes.versionString ]; - }; - - /** - * Construct the default endpoints and add to an endpoints collection. - */ - - // The wp.api.init function returns a promise that will resolve with the endpoint once it is ready. - wp.api.loadPromise = wp.api.init(); - -} )(); diff --git a/wp/wp-includes/js/wp-api.min.js b/wp/wp-includes/js/wp-api.min.js deleted file mode 100644 index e3bc2d9c..00000000 --- a/wp/wp-includes/js/wp-api.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a,b){"use strict";function c(){this.models={},this.collections={},this.views={}}a.wp=a.wp||{},wp.api=wp.api||new c,wp.api.versionString=wp.api.versionString||"wp/v2/",!_.isFunction(_.includes)&&_.isFunction(_.contains)&&(_.includes=_.contains)}(window),function(a,b){"use strict";var c,d;a.wp=a.wp||{},wp.api=wp.api||{},wp.api.utils=wp.api.utils||{},Date.prototype.toISOString||(c=function(a){return d=String(a),1===d.length&&(d="0"+d),d},Date.prototype.toISOString=function(){return this.getUTCFullYear()+"-"+c(this.getUTCMonth()+1)+"-"+c(this.getUTCDate())+"T"+c(this.getUTCHours())+":"+c(this.getUTCMinutes())+":"+c(this.getUTCSeconds())+"."+String((this.getUTCMilliseconds()/1e3).toFixed(3)).slice(2,5)+"Z"}),wp.api.utils.parseISO8601=function(a){var c,d,e,f,g=0,h=[1,4,5,6,7,10,11];if(d=/^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec(a)){for(e=0;f=h[e];++e)d[f]=+d[f]||0;d[2]=(+d[2]||1)-1,d[3]=+d[3]||1,"Z"!==d[8]&&b!==d[9]&&(g=60*d[10]+d[11],"+"===d[9]&&(g=0-g)),c=Date.UTC(d[1],d[2],d[3],d[4],d[5]+g,d[6],d[7])}else c=Date.parse?Date.parse(a):NaN;return c},wp.api.utils.getRootUrl=function(){return a.location.origin?a.location.origin+"/":a.location.protocol+"/"+a.location.host+"/"},wp.api.utils.capitalize=function(a){return _.isUndefined(a)?a:a.charAt(0).toUpperCase()+a.slice(1)},wp.api.utils.capitalizeAndCamelCaseDashes=function(a){return _.isUndefined(a)?a:(a=wp.api.utils.capitalize(a),wp.api.utils.camelCaseDashes(a))},wp.api.utils.camelCaseDashes=function(a){return a.replace(/-([a-z])/g,function(a){return a[1].toUpperCase()})},wp.api.utils.extractRoutePart=function(a,b,c,d){var e;return b=b||1,c=c||wp.api.versionString,0===a.indexOf("/"+c)&&(a=a.substr(c.length+1)),e=a.split("/"),d&&(e=e.reverse()),_.isUndefined(e[--b])?"":e[b]},wp.api.utils.extractParentName=function(a){var b,c=a.lastIndexOf("_id>[\\d]+)/");return c<0?"":(b=a.substr(0,c-1),b=b.split("/"),b.pop(),b=b.pop())},wp.api.utils.decorateFromRoute=function(a,b){_.each(a,function(a){_.includes(a.methods,"POST")||_.includes(a.methods,"PUT")?_.isEmpty(a.args)||(_.isEmpty(b.prototype.args)?b.prototype.args=a.args:b.prototype.args=_.extend(b.prototype.args,a.args)):_.includes(a.methods,"GET")&&(_.isEmpty(a.args)||(_.isEmpty(b.prototype.options)?b.prototype.options=a.args:b.prototype.options=_.extend(b.prototype.options,a.args)))})},wp.api.utils.addMixinsAndHelpers=function(a,b,c){var d=!1,e=["date","modified","date_gmt","modified_gmt"],f={setDate:function(a,b){var c=b||"date";return!(_.indexOf(e,c)<0)&&void this.set(c,a.toISOString())},getDate:function(a){var b=a||"date",c=this.get(b);return!(_.indexOf(e,b)<0||_.isNull(c))&&new Date(wp.api.utils.parseISO8601(c))}},g=function(a,b,c,d,e){var f,g,h,i;return i=jQuery.Deferred(),g=a.get("_embedded")||{},_.isNumber(b)&&0!==b?(g[d]&&(h=_.findWhere(g[d],{id:b})),h||(h={id:b}),f=new wp.api.models[c](h),f.get(e)?i.resolve(f):f.fetch({success:function(a){i.resolve(a)},error:function(a,b){i.reject(b)}}),i.promise()):(i.reject(),i)},h=function(a,b,c,d){var e,f,g,h="",j="",k=jQuery.Deferred();return e=a.get("id"),f=a.get("_embedded")||{},_.isNumber(e)&&0!==e?(_.isUndefined(c)||_.isUndefined(f[c])?h={parent:e}:j=_.isUndefined(d)?f[c]:f[c][d],g=new wp.api.collections[b](j,h),_.isUndefined(g.models[0])?g.fetch({success:function(a){i(a,e),k.resolve(a)},error:function(a,b){k.reject(b)}}):(i(g,e),k.resolve(g)),k.promise()):(k.reject(),k)},i=function(a,b){_.each(a.models,function(a){a.set("parent_post",b)})},j={getMeta:function(){return h(this,"PostMeta","https://api.w.org/meta")}},k={getRevisions:function(){return h(this,"PostRevisions")}},l={getTags:function(){var a=this.get("tags"),b=new wp.api.collections.Tags;return _.isEmpty(a)?jQuery.Deferred().resolve([]):b.fetch({data:{include:a}})},setTags:function(a){var b,c,d=this,e=[];return!_.isString(a)&&void(_.isArray(a)?(b=new wp.api.collections.Tags,b.fetch({data:{per_page:100},success:function(b){_.each(a,function(a){c=new wp.api.models.Tag(b.findWhere({slug:a})),c.set("parent_post",d.get("id")),e.push(c)}),a=new wp.api.collections.Tags(e),d.setTagsWithCollection(a)}})):this.setTagsWithCollection(a))},setTagsWithCollection:function(a){return this.set("tags",a.pluck("id")),this.save()}},m={getCategories:function(){var a=this.get("categories"),b=new wp.api.collections.Categories;return _.isEmpty(a)?jQuery.Deferred().resolve([]):b.fetch({data:{include:a}})},setCategories:function(a){var b,c,d=this,e=[];return!_.isString(a)&&void(_.isArray(a)?(b=new wp.api.collections.Categories,b.fetch({data:{per_page:100},success:function(b){_.each(a,function(a){c=new wp.api.models.Category(b.findWhere({slug:a})),c.set("parent_post",d.get("id")),e.push(c)}),a=new wp.api.collections.Categories(e),d.setCategoriesWithCollection(a)}})):this.setCategoriesWithCollection(a))},setCategoriesWithCollection:function(a){return this.set("categories",a.pluck("id")),this.save()}},n={getAuthorUser:function(){return g(this,this.get("author"),"User","author","name")}},o={getFeaturedMedia:function(){return g(this,this.get("featured_media"),"Media","wp:featuredmedia","source_url")}};return _.isUndefined(a.prototype.args)?a:(_.each(e,function(b){_.isUndefined(a.prototype.args[b])||(d=!0)}),d&&(a=a.extend(f)),_.isUndefined(a.prototype.args.author)||(a=a.extend(n)),_.isUndefined(a.prototype.args.featured_media)||(a=a.extend(o)),_.isUndefined(a.prototype.args.categories)||(a=a.extend(m)),_.isUndefined(c.collections[b+"Meta"])||(a=a.extend(j)),_.isUndefined(a.prototype.args.tags)||(a=a.extend(l)),_.isUndefined(c.collections[b+"Revisions"])||(a=a.extend(k)),a)}}(window),function(){"use strict";var a=window.wpApiSettings||{};wp.api.WPApiBaseModel=Backbone.Model.extend({sync:function(b,c,d){var e;return d=d||{},_.isNull(c.get("date_gmt"))&&c.unset("date_gmt"),_.isEmpty(c.get("slug"))&&c.unset("slug"),_.isUndefined(a.nonce)||_.isNull(a.nonce)||(e=d.beforeSend,d.beforeSend=function(b){if(b.setRequestHeader("X-WP-Nonce",a.nonce),e)return e.apply(this,arguments)}),this.requireForceForDelete&&"delete"===b&&(c.url=c.url()+"?force=true"),Backbone.sync(b,c,d)},save:function(a,b){return!(!_.includes(this.methods,"PUT")&&!_.includes(this.methods,"POST"))&&Backbone.Model.prototype.save.call(this,a,b)},destroy:function(a){return!!_.includes(this.methods,"DELETE")&&Backbone.Model.prototype.destroy.call(this,a)}}),wp.api.models.Schema=wp.api.WPApiBaseModel.extend({defaults:{_links:{},namespace:null,routes:{}},initialize:function(b,c){var d=this;c=c||{},wp.api.WPApiBaseModel.prototype.initialize.call(d,b,c),d.apiRoot=c.apiRoot||a.root,d.versionString=c.versionString||a.versionString},url:function(){return this.apiRoot+this.versionString}})}(),function(){"use strict";var a=window.wpApiSettings||{};wp.api.WPApiBaseCollection=Backbone.Collection.extend({initialize:function(a,b){this.state={data:{},currentPage:null,totalPages:null,totalObjects:null},_.isUndefined(b)?this.parent="":this.parent=b.parent},sync:function(b,c,d){var e,f,g=this;return d=d||{},e=d.beforeSend,"undefined"!=typeof a.nonce&&(d.beforeSend=function(b){if(b.setRequestHeader("X-WP-Nonce",a.nonce),e)return e.apply(g,arguments)}),"read"===b&&(d.data?(g.state.data=_.clone(d.data),delete g.state.data.page):g.state.data=d.data={},"undefined"==typeof d.data.page?(g.state.currentPage=null,g.state.totalPages=null,g.state.totalObjects=null):g.state.currentPage=d.data.page-1,f=d.success,d.success=function(a,b,c){if(_.isUndefined(c)||(g.state.totalPages=parseInt(c.getResponseHeader("x-wp-totalpages"),10),g.state.totalObjects=parseInt(c.getResponseHeader("x-wp-total"),10)),null===g.state.currentPage?g.state.currentPage=1:g.state.currentPage++,f)return f.apply(this,arguments)}),Backbone.sync(b,c,d)},more:function(a){if(a=a||{},a.data=a.data||{},_.extend(a.data,this.state.data),"undefined"==typeof a.data.page){if(!this.hasMore())return!1;null===this.state.currentPage||this.state.currentPage<=1?a.data.page=2:a.data.page=this.state.currentPage+1}return this.fetch(a)},hasMore:function(){return null===this.state.totalPages||null===this.state.totalObjects||null===this.state.currentPage?null:this.state.currentPage').attr( 'title', noframe.text() ); - frame.on( 'load', function() { - var height, body; - - loaded = true; - // Remove the spinner to avoid unnecessary CPU/GPU usage. - form.removeClass( 'loading' ); - - try { - body = $(this).contents().find('body'); - height = body.height(); - } catch(e) { - wrap.addClass('fallback'); - parent.css( 'max-height', '' ); - form.remove(); - noframe.focus(); - return; - } - - if ( height ) { - if ( body && body.hasClass('interim-login-success') ) - hide(); - else - parent.css( 'max-height', height + 40 + 'px' ); - } else if ( ! body || ! body.length ) { - // Catch "silent" iframe origin exceptions in WebKit after another page is loaded in the iframe - wrap.addClass('fallback'); - parent.css( 'max-height', '' ); - form.remove(); - noframe.focus(); - } - }).attr( 'src', form.data('src') ); - - form.append( frame ); - } - - $( 'body' ).addClass( 'modal-open' ); - wrap.removeClass('hidden'); - - if ( frame ) { - frame.focus(); - // WebKit doesn't throw an error if the iframe fails to load because of "X-Frame-Options: DENY" header. - // Wait for 10 sec. and switch to the fallback text. - setTimeout( function() { - if ( ! loaded ) { - wrap.addClass('fallback'); - form.remove(); - noframe.focus(); - } - }, 10000 ); - } else { - noframe.focus(); - } - } - - function hide() { - $(window).off( 'beforeunload.wp-auth-check' ); - - // When on the Edit Post screen, speed up heartbeat after the user logs in to quickly refresh nonces - if ( typeof adminpage !== 'undefined' && ( adminpage === 'post-php' || adminpage === 'post-new-php' ) && - typeof wp !== 'undefined' && wp.heartbeat ) { - - $(document).off( 'heartbeat-tick.wp-auth-check' ); - wp.heartbeat.connectNow(); - } - - wrap.fadeOut( 200, function() { - wrap.addClass('hidden').css('display', ''); - $('#wp-auth-check-frame').remove(); - $( 'body' ).removeClass( 'modal-open' ); - }); - } - - function schedule() { - var interval = parseInt( window.authcheckL10n.interval, 10 ) || 180; // in seconds, default 3 min. - next = ( new Date() ).getTime() + ( interval * 1000 ); - } - - $( document ).on( 'heartbeat-tick.wp-auth-check', function( e, data ) { - if ( 'wp-auth-check' in data ) { - schedule(); - if ( ! data['wp-auth-check'] && wrap.hasClass('hidden') ) { - show(); - } else if ( data['wp-auth-check'] && ! wrap.hasClass('hidden') ) { - hide(); - } - } - }).on( 'heartbeat-send.wp-auth-check', function( e, data ) { - if ( ( new Date() ).getTime() > next ) { - data['wp-auth-check'] = true; - } - }).ready( function() { - schedule(); - wrap = $('#wp-auth-check-wrap'); - wrap.find('.wp-auth-check-close').on( 'click', function() { - hide(); - }); - }); - -}(jQuery)); diff --git a/wp/wp-includes/js/wp-auth-check.min.js b/wp/wp-includes/js/wp-auth-check.min.js deleted file mode 100644 index 9a80b3e5..00000000 --- a/wp/wp-includes/js/wp-auth-check.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(a){function b(){var b,d=a("#wp-auth-check"),f=a("#wp-auth-check-form"),g=e.find(".wp-auth-fallback-expired"),h=!1;f.length&&(a(window).on("beforeunload.wp-auth-check",function(a){a.originalEvent.returnValue=window.authcheckL10n.beforeunload}),b=a('